REDROOM
PHP 8.5.2
Path:
Logout
Edit File
Size: 3.13 MB
Close
/usr/local/bin/composer
Text
Base64
IyEvdXNyL2Jpbi9lbnYgcGhwCjw/cGhwCi8qCiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIENvbXBvc2VyLgogKgogKiAoYykgTmlscyBBZGVybWFubiA8bmFkZXJtYW5AbmFkZXJtYW4uZGU+CiAqICAgICBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKgogKiBGb3IgdGhlIGZ1bGwgY29weXJpZ2h0IGFuZCBsaWNlbnNlIGluZm9ybWF0aW9uLCBwbGVhc2UgdmlldwogKiB0aGUgbGljZW5zZSB0aGF0IGlzIGxvY2F0ZWQgYXQgdGhlIGJvdHRvbSBvZiB0aGlzIGZpbGUuCiAqLwoKLy8gQXZvaWQgQVBDIGNhdXNpbmcgcmFuZG9tIGZhdGFsIGVycm9ycyBwZXIgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy8yNjQKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2FwYycpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZV9jbGknKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmNhY2hlX2J5X2RlZmF1bHQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiAgICBpZiAodmVyc2lvbl9jb21wYXJlKHBocHZlcnNpb24oJ2FwYycpLCAnMy4wLjEyJywgJz49JykpIHsKICAgICAgICBpbmlfc2V0KCdhcGMuY2FjaGVfYnlfZGVmYXVsdCcsIDApOwogICAgfSBlbHNlIHsKICAgICAgICBmd3JpdGUoU1RERVJSLCAnV2FybmluZzogQVBDIDw9IDMuMC4xMiBtYXkgY2F1c2UgZmF0YWwgZXJyb3JzIHdoZW4gcnVubmluZyBjb21wb3NlciBjb21tYW5kcy4nLlBIUF9FT0wpOwogICAgICAgIGZ3cml0ZShTVERFUlIsICdVcGRhdGUgQVBDLCBvciBzZXQgYXBjLmVuYWJsZV9jbGkgb3IgYXBjLmNhY2hlX2J5X2RlZmF1bHQgdG8gMCBpbiB5b3VyIHBocC5pbmkuJy5QSFBfRU9MKTsKICAgIH0KfQoKaWYgKCFjbGFzc19leGlzdHMoJ1BoYXInKSkgewogICAgZWNobyAnUEhQXCdzIHBoYXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIENvbXBvc2VyIHJlcXVpcmVzIGl0IHRvIHJ1bi4gRW5hYmxlIHRoZSBleHRlbnNpb24gb3IgcmVjb21waWxlIHBocCB3aXRob3V0IC0tZGlzYWJsZS1waGFyIHRoZW4gdHJ5IGFnYWluLicgLiBQSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKUGhhcjo6bWFwUGhhcignY29tcG9zZXIucGhhcicpOwpyZXF1aXJlICdwaGFyOi8vY29tcG9zZXIucGhhci9iaW4vY29tcG9zZXInOwoKX19IQUxUX0NPTVBJTEVSKCk7ID8+DQo83gAA0QIAABEAAAABAA0AAABjb21wb3Nlci5waGFyAAAAACUAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvQXVkaXRDb25maWcucGhwkwwAAGIhcmmTDAAAVbw5sqQBAAAAAAAAIQAAAHNyYy9Db21wb3Nlci9BZHZpc29yeS9BdWRpdG9yLnBocKkuAABiIXJpqS4AAA425SGkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQWR2aXNvcnkvSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkucGhwUwMAAGIhcmlTAwAAZzD4xaQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9BZHZpc29yeS9QYXJ0aWFsU2VjdXJpdHlBZHZpc29yeS5waHCDBgAAYiFyaYMGAACIIGOXpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Fkdmlzb3J5L1NlY3VyaXR5QWR2aXNvcnkucGhw/AQAAGIhcmn8BAAAtTV0MKQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9BdXRvbG9hZC9BdXRvbG9hZEdlbmVyYXRvci5waHCniwAAYiFyaaeLAAAdkfDupAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0F1dG9sb2FkL0NsYXNzTWFwR2VuZXJhdG9yLnBocJIGAABiIXJpkgYAAI+ofFOkAQAAAAAAABYAAABzcmMvQ29tcG9zZXIvQ2FjaGUucGhweRsAAGIhcml5GwAArUSAKaQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0Fib3V0Q29tbWFuZC5waHBXAwAAYiFyaVcDAADiOoYhpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvQXJjaGl2ZUNvbW1hbmQucGhwRxsAAGIhcmlHGwAAM+0y4aQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0F1ZGl0Q29tbWFuZC5waHCSDwAAYiFyaZIPAABsPtmXpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvQmFzZUNvbW1hbmQucGhw0i8AAGIhcmnSLwAAYSrPyqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0Jhc2VDb25maWdDb21tYW5kLnBocIMIAABiIXJpgwgAANHkzVukAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9CYXNlRGVwZW5kZW5jeUNvbW1hbmQucGhw1yMAAGIhcmnXIwAAiZqK46QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0J1bXBDb21tYW5kLnBocGAdAABiIXJpYB0AANAJBamkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9DaGVja1BsYXRmb3JtUmVxc0NvbW1hbmQucGhwYBYAAGIhcmlgFgAAH/k8dKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NsZWFyQ2FjaGVDb21tYW5kLnBocHwJAABiIXJpfAkAAA3mTKCkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Db21wbGV0aW9uVHJhaXQucGhwVhYAAGIhcmlWFgAAEmM39aQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NvbmZpZ0NvbW1hbmQucGhw6nUAAGIhcmnqdQAAqjHHcKQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0NyZWF0ZVByb2plY3RDb21tYW5kLnBocLlLAABiIXJpuUsAAJcw1fGkAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EZXBlbmRzQ29tbWFuZC5waHBFBQAAYiFyaUUFAACBFHoSpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRGlhZ25vc2VDb21tYW5kLnBocAdrAABiIXJpB2sAANbPr92kAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9EdW1wQXV0b2xvYWRDb21tYW5kLnBocNkWAABiIXJp2RYAADcvsiykAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9FeGVjQ29tbWFuZC5waHAWDAAAYiFyaRYMAAASBfXqpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvRnVuZENvbW1hbmQucGhwwQ4AAGIhcmnBDgAANWDIR6QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0dsb2JhbENvbW1hbmQucGhwyw8AAGIhcmnLDwAA1rkZ66QBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0hvbWVDb21tYW5kLnBocEcPAABiIXJpRw8AAKFnBIikAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9Jbml0Q29tbWFuZC5waHBHRgAAYiFyaUdGAADb5XuxpAEAAAAAAAAnAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvSW5zdGFsbENvbW1hbmQucGhwWxsAAGIhcmlbGwAAX+nOM6QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL0xpY2Vuc2VzQ29tbWFuZC5waHATEgAAYiFyaRMSAAATJMW2pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvT3V0ZGF0ZWRDb21tYW5kLnBocJITAABiIXJpkhMAAEBjBI2kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9QYWNrYWdlRGlzY292ZXJ5VHJhaXQucGhwnTYAAGIhcmmdNgAAnPDzuqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1Byb2hpYml0c0NvbW1hbmQucGhw5QUAAGIhcmnlBQAAykRy+KQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlaW5zdGFsbENvbW1hbmQucGhwfR0AAGIhcml9HQAASQfo16QBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlbW92ZUNvbW1hbmQucGhwATAAAGIhcmkBMAAACy69qaQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1JlcG9zaXRvcnlDb21tYW5kLnBocFggAABiIXJpWCAAADZ5bwmkAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9SZXF1aXJlQ29tbWFuZC5waHCEWwAAYiFyaYRbAAD/tQlxpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvUnVuU2NyaXB0Q29tbWFuZC5waHAVEgAAYiFyaRUSAAAlXhCrpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU2NyaXB0QWxpYXNDb21tYW5kLnBocGIIAABiIXJpYggAABRxeGOkAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TZWFyY2hDb21tYW5kLnBocEMPAABiIXJpQw8AAGlIqB+kAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvQ29tbWFuZC9TZWxmVXBkYXRlQ29tbWFuZC5waHDfUAAAYiFyad9QAACP/7kfpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvU2hvd0NvbW1hbmQucGhwxL0AAGIhcmnEvQAAgek8NaQBAAAAAAAAJgAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1N0YXR1c0NvbW1hbmQucGhwtxYAAGIhcmm3FgAA6UKYvqQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Db21tYW5kL1N1Z2dlc3RzQ29tbWFuZC5waHDJCwAAYiFyackLAAD5z2ZrpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvVXBkYXRlQ29tbWFuZC5waHAcRQAAYiFyaRxFAABbMzbopAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0NvbW1hbmQvVmFsaWRhdGVDb21tYW5kLnBocM4aAABiIXJpzhoAAPzrQWikAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvQ29tcG9zZXIucGhwnQcAAGIhcmmdBwAAAC9jlKQBAAAAAAAAFwAAAHNyYy9Db21wb3Nlci9Db25maWcucGhwnzwAAGIhcmmfPAAA0dJTE6QBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Db25maWcvQ29uZmlnU291cmNlSW50ZXJmYWNlLnBocHEDAABiIXJpcQMAABsuTrOkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvQ29uZmlnL0pzb25Db25maWdTb3VyY2UucGhwyCcAAGIhcmnIJwAACL2rjKQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9Db25zb2xlL0FwcGxpY2F0aW9uLnBocCJeAABiIXJpIl4AABmuaBukAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvQ29uc29sZS9HaXRodWJBY3Rpb25FcnJvci5waHAPBQAAYiFyaQ8FAABgsYnmpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvSHRtbE91dHB1dEZvcm1hdHRlci5waHA+BwAAYiFyaT4HAADSDO9SpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvSW5wdXQvSW5wdXRBcmd1bWVudC5waHC2BAAAYiFyabYEAACqD7xLpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0NvbnNvbGUvSW5wdXQvSW5wdXRPcHRpb24ucGhwZwUAAGIhcmlnBQAAiDcnNKQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvRGVjaXNpb25zLnBocOkRAABiIXJp6REAADskQAukAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL0RlZmF1bHRQb2xpY3kucGhwIRkAAGIhcmkhGQAA4UQ7cKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvR2VuZXJpY1J1bGUucGhwNgQAAGIhcmk2BAAApbJsfKQBAAAAAAAAOAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvTG9jYWxSZXBvVHJhbnNhY3Rpb24ucGhwvQEAAGIhcmm9AQAA35pImqQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvTG9ja1RyYW5zYWN0aW9uLnBocEEOAABiIXJpQQ4AAGaxK3GkAQAAAAAAADUAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL011bHRpQ29uZmxpY3RSdWxlLnBocMsFAABiIXJpywUAALQ5DY2kAQAAAAAAAD4AAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9JbnN0YWxsT3BlcmF0aW9uLnBocP8CAABiIXJp/wIAAD36p6ekAQAAAAAAAEkAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9NYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24ucGhwFgMAAGIhcmkWAwAAADFOSqQBAAAAAAAASwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL01hcmtBbGlhc1VuaW5zdGFsbGVkT3BlcmF0aW9uLnBocBwDAABiIXJpHAMAAHR3DQ2kAQAAAAAAAEAAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9PcGVyYXRpb25JbnRlcmZhY2UucGhw+AAAAGIhcmn4AAAAFvdX/aQBAAAAAAAAPQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvT3BlcmF0aW9uL1NvbHZlck9wZXJhdGlvbi5waHBIAQAAYiFyaUgBAAAEGhWnpAEAAAAAAABAAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9PcGVyYXRpb24vVW5pbnN0YWxsT3BlcmF0aW9uLnBocOcCAABiIXJp5wIAAHzBUhOkAQAAAAAAAD0AAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL09wZXJhdGlvbi9VcGRhdGVPcGVyYXRpb24ucGhwnwcAAGIhcmmfBwAA3DfmpKQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9saWN5SW50ZXJmYWNlLnBocJ4BAABiIXJpngEAAPgBzuGkAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1Bvb2wucGhwBxoAAGIhcmkHGgAApaumfKQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9vbEJ1aWxkZXIucGhwPFAAAGIhcmk8UAAA3L6i+qQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUG9vbE9wdGltaXplci5waHBUKgAAYiFyaVQqAACkxUdopAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Qcm9ibGVtLnBocEZmAABiIXJpRmYAAMpeWJmkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1JlcXVlc3QucGhwlRAAAGIhcmmVEAAARKYET6QBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZS5waHC1MAAAYiFyabUwAADKe6BRpAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlMkxpdGVyYWxzLnBocAEFAABiIXJpAQUAAA8zdv6kAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1J1bGVTZXQucGhwxQsAAGIhcmnFCwAAO6lufaQBAAAAAAAANAAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVNldEdlbmVyYXRvci5waHBDGwAAYiFyaUMbAAAvXVqepAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9SdWxlU2V0SXRlcmF0b3IucGhw9QUAAGIhcmn1BQAAnAx5E6QBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVdhdGNoQ2hhaW4ucGhwewEAAGIhcml7AQAAgmjzRKQBAAAAAAAAMgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVdhdGNoR3JhcGgucGhwnAkAAGIhcmmcCQAAWpx7fKQBAAAAAAAAMQAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvUnVsZVdhdGNoTm9kZS5waHB2BAAAYiFyaXYEAABwmQi3pAEAAAAAAAA+AAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9TZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlci5waHCTDAAAYiFyaZMMAABId1ITpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0RlcGVuZGVuY3lSZXNvbHZlci9Tb2x2ZXIucGhwTDgAAGIhcmlMOAAA0wBasqQBAAAAAAAANgAAAHNyYy9Db21wb3Nlci9EZXBlbmRlbmN5UmVzb2x2ZXIvU29sdmVyQnVnRXhjZXB0aW9uLnBocLkBAABiIXJpuQEAAHqtFj2kAQAAAAAAADsAAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1NvbHZlclByb2JsZW1zRXhjZXB0aW9uLnBocMsQAABiIXJpyxAAABKjfz+kAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvRGVwZW5kZW5jeVJlc29sdmVyL1RyYW5zYWN0aW9uLnBocLocAABiIXJpuhwAADIszvakAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9BcmNoaXZlRG93bmxvYWRlci5waHDgEQAAYiFyaeARAAA6SRC6pAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvQ2hhbmdlUmVwb3J0SW50ZXJmYWNlLnBocPUAAABiIXJp9QAAAK3DwkKkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9Eb3dubG9hZE1hbmFnZXIucGhwpR8AAGIhcmmlHwAAugjp/aQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0Rvd25sb2FkZXJJbnRlcmZhY2UucGhw0wMAAGIhcmnTAwAAYm1byKQBAAAAAAAAMwAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0R2Y3NEb3dubG9hZGVySW50ZXJmYWNlLnBocPoAAABiIXJp+gAAAOARJSekAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvRG93bmxvYWRlci9GaWxlRG93bmxvYWRlci5waHB2NAAAYiFyaXY0AABiAHU8pAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRmlsZXN5c3RlbUV4Y2VwdGlvbi5waHAvAQAAYiFyaS8BAAAhi+UmpAEAAAAAAAAsAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvRm9zc2lsRG93bmxvYWRlci5waHArCwAAYiFyaSsLAAAyt060pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvR2l0RG93bmxvYWRlci5waHAsRAAAYiFyaSxEAAABbjWcpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvR3ppcERvd25sb2FkZXIucGhweQUAAGIhcml5BQAAei1TbKQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL0hnRG93bmxvYWRlci5waHDeCgAAYiFyad4KAAAnPURvpAEAAAAAAAA4AAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbi5waHCMAAAAYiFyaYwAAADauh3UpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUGF0aERvd25sb2FkZXIucGhwQSIAAGIhcmlBIgAA0uC9paQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1BlcmZvcmNlRG93bmxvYWRlci5waHCLCQAAYiFyaYsJAACQPK2dpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvUGhhckRvd25sb2FkZXIucGhwqgEAAGIhcmmqAQAAWMjIEqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1JhckRvd25sb2FkZXIucGhwQQYAAGIhcmlBBgAAnEjLEqQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1N2bkRvd25sb2FkZXIucGhwWxgAAGIhcmlbGAAAoLj/2qQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1RhckRvd25sb2FkZXIucGhwqAEAAGIhcmmoAQAA13LfgqQBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1RyYW5zcG9ydEV4Y2VwdGlvbi5waHAEBAAAYiFyaQQEAAD+jevbpAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UucGhw/QAAAGIhcmn9AAAAHeQ2pKQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1Zjc0Rvd25sb2FkZXIucGhwQR0AAGIhcmlBHQAAxjNetKQBAAAAAAAAKAAAAHNyYy9Db21wb3Nlci9Eb3dubG9hZGVyL1h6RG93bmxvYWRlci5waHBlAgAAYiFyaWUCAACVwMjqpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL0Rvd25sb2FkZXIvWmlwRG93bmxvYWRlci5waHDRJgAAYiFyadEmAABA7EpcpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL0V2ZW50RGlzcGF0Y2hlci9FdmVudC5waHDYAgAAYiFyadgCAACF96HwpAEAAAAAAAAwAAAAc3JjL0NvbXBvc2VyL0V2ZW50RGlzcGF0Y2hlci9FdmVudERpc3BhdGNoZXIucGhwiE4AAGIhcmmITgAA5OBBN6QBAAAAAAAAOQAAAHNyYy9Db21wb3Nlci9FdmVudERpc3BhdGNoZXIvRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlLnBocMIAAABiIXJpwgAAAH096QikAQAAAAAAADkAAABzcmMvQ29tcG9zZXIvRXZlbnREaXNwYXRjaGVyL1NjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbi5waHCRAAAAYiFyaZEAAABYdujPpAEAAAAAAAA5AAAAc3JjL0NvbXBvc2VyL0V4Y2VwdGlvbi9JcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb24ucGhwjwAAAGIhcmmPAAAAMN40DaQBAAAAAAAAKQAAAHNyYy9Db21wb3Nlci9FeGNlcHRpb24vTm9Tc2xFeGNlcHRpb24ucGhwgQAAAGIhcmmBAAAA2FWm0qQBAAAAAAAAGAAAAHNyYy9Db21wb3Nlci9GYWN0b3J5LnBocNVSAABiIXJp1VIAAFheJI+kAQAAAAAAAFQAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci5waHCuAQAAYiFyaa4BAAAYWmuqpAEAAAAAAABVAAAAc3JjL0NvbXBvc2VyL0ZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyL0lnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLnBocC4IAABiIXJpLggAACE7HhikAQAAAAAAAFgAAABzcmMvQ29tcG9zZXIvRmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIvSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIucGhwVAEAAGIhcmlUAQAAx+DZD6QBAAAAAAAAUgAAAHNyYy9Db21wb3Nlci9GaWx0ZXIvUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeS5waHB+AwAAYiFyaX4DAADCvlcOpAEAAAAAAABUAAAAc3JjL0NvbXBvc2VyL0ZpbHRlci9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyL1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UucGhw+AAAAGIhcmn4AAAAibXSZ6QBAAAAAAAAGgAAAHNyYy9Db21wb3Nlci9JTy9CYXNlSU8ucGhwOR0AAGIhcmk5HQAA8QZqFKQBAAAAAAAAHAAAAHNyYy9Db21wb3Nlci9JTy9CdWZmZXJJTy5waHAlCAAAYiFyaSUIAAB3iOq6pAEAAAAAAAAdAAAAc3JjL0NvbXBvc2VyL0lPL0NvbnNvbGVJTy5waHCfHwAAYiFyaZ8fAACCc8PupAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL0lPL0lPSW50ZXJmYWNlLnBocNAHAABiIXJp0AcAAH7/aK2kAQAAAAAAABoAAABzcmMvQ29tcG9zZXIvSU8vTnVsbElPLnBocE8FAABiIXJpTwUAAGKIqHOkAQAAAAAAABoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyLnBocGyUAABiIXJpbJQAAN+8DOqkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0JpbmFyeUluc3RhbGxlci5waHADKgAAYiFyaQMqAAA6CztCpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9CaW5hcnlQcmVzZW5jZUludGVyZmFjZS5waHDmAAAAYiFyaeYAAACuM5eMpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9JbnN0YWxsYXRpb25NYW5hZ2VyLnBocAM2AABiIXJpAzYAAOYN48ykAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxlckV2ZW50LnBocCoEAABiIXJpKgQAAEZa5NmkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL0luc3RhbGxlckV2ZW50cy5waHClAAAAYiFyaaUAAAA+le3HpAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9JbnN0YWxsZXJJbnRlcmZhY2UucGhwfgQAAGIhcml+BAAAAM2U1aQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9JbnN0YWxsZXIvTGlicmFyeUluc3RhbGxlci5waHAMHgAAYiFyaQweAAAov6WXpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9NZXRhcGFja2FnZUluc3RhbGxlci5waHDWCAAAYiFyadYIAAD7CvUipAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9Ob29wSW5zdGFsbGVyLnBocGEHAABiIXJpYQcAAOp4UW6kAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1BhY2thZ2VFdmVudC5waHD0BAAAYiFyafQEAABikVxBpAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9QYWNrYWdlRXZlbnRzLnBocPsBAABiIXJp+wEAAPKrf0ukAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1BsdWdpbkluc3RhbGxlci5waHCNDQAAYiFyaY0NAADylD0ZpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL0luc3RhbGxlci9Qcm9qZWN0SW5zdGFsbGVyLnBocDkJAABiIXJpOQkAAAFV0YakAQAAAAAAADQAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVyL1N1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIucGhwsREAAGIhcmmxEQAAjQJYaaQBAAAAAAAAHgAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25GaWxlLnBocMAfAABiIXJpwB8AAHJ9ElikAQAAAAAAACMAAABzcmMvQ29tcG9zZXIvSnNvbi9Kc29uRm9ybWF0dGVyLnBocIwGAABiIXJpjAYAADDb+WSkAQAAAAAAACUAAABzcmMvQ29tcG9zZXIvSnNvbi9Kc29uTWFuaXB1bGF0b3IucGhwQWUAAGIhcmlBZQAAJWl2BaQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9Kc29uL0pzb25WYWxpZGF0aW9uRXhjZXB0aW9uLnBocJcBAABiIXJplwEAAJ1eXrSkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUEhQU3Rhbi9Db25maWdSZXR1cm5UeXBlRXh0ZW5zaW9uLnBocNgTAABiIXJp2BMAAJBzYo6kAQAAAAAAADoAAABzcmMvQ29tcG9zZXIvUEhQU3Rhbi9SdWxlUmVhc29uRGF0YVJldHVyblR5cGVFeHRlbnNpb24ucGhwfggAAGIhcml+CAAApuesSKQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FsaWFzUGFja2FnZS5waHC4GAAAYiFyabgYAAAI3UIxpAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQXJjaGl2YWJsZUZpbGVzRmlsdGVyLnBocFMCAABiIXJpUwIAACcyNWakAQAAAAAAADcAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9BcmNoaXZhYmxlRmlsZXNGaW5kZXIucGhw1QYAAGIhcmnVBgAAM+ROHqQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0FyY2hpdmVNYW5hZ2VyLnBocIQUAABiIXJphBQAALDXE4ykAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9BcmNoaXZlckludGVyZmFjZS5waHBTAQAAYiFyaVMBAAD/7D/upAEAAAAAAAAzAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvQmFzZUV4Y2x1ZGVGaWx0ZXIucGhwEAcAAGIhcmkQBwAAeMY2yKQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0FyY2hpdmVyL0NvbXBvc2VyRXhjbHVkZUZpbHRlci5waHA/AQAAYiFyaT8BAAA/j2BepAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvR2l0RXhjbHVkZUZpbHRlci5waHAkAwAAYiFyaSQDAAB0jzhOpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQXJjaGl2ZXIvUGhhckFyY2hpdmVyLnBocOkJAABiIXJp6QkAANtoDhGkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9BcmNoaXZlci9aaXBBcmNoaXZlci5waHASBwAAYiFyaRIHAACMcQEOpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQmFzZVBhY2thZ2UucGhwBBMAAGIhcmkEEwAAWB66nqQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0NvbXBhcmVyL0NvbXBhcmVyLnBocNIJAABiIXJp0gkAAPvasIikAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Db21wbGV0ZUFsaWFzUGFja2FnZS5waHBxCgAAYiFyaXEKAAD6ICO3pAEAAAAAAAAoAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvQ29tcGxldGVQYWNrYWdlLnBocAUKAABiIXJpBQoAAIagSrGkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Db21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UucGhwlwUAAGIhcmmXBQAAajL/MaQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0R1bXBlci9BcnJheUR1bXBlci5waHC4DQAAYiFyabgNAACW2pV1pAEAAAAAAAAdAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTGluay5waHD2BwAAYiFyafYHAACgImqlpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvTG9hZGVyL0FycmF5TG9hZGVyLnBocC8uAABiIXJpLy4AAJVkXkmkAQAAAAAAADcAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvSW52YWxpZFBhY2thZ2VFeGNlcHRpb24ucGhwhAIAAGIhcmmEAgAA6E38laQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9Kc29uTG9hZGVyLnBocJoDAABiIXJpmgMAAIUuCU6kAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvTG9hZGVySW50ZXJmYWNlLnBocJ4BAABiIXJpngEAABdGQqSkAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9Mb2FkZXIvUm9vdFBhY2thZ2VMb2FkZXIucGhwzB0AAGIhcmnMHQAAfBuzkqQBAAAAAAAANQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvYWRlci9WYWxpZGF0aW5nQXJyYXlMb2FkZXIucGhwqGQAAGIhcmmoZAAA7UIor6QBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL0xvY2tlci5waHDvNAAAYiFyae80AABlUWEIpAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUGFja2FnZS5waHAIJQAAYiFyaQglAADV1xr2pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUGFja2FnZUludGVyZmFjZS5waHD4CwAAYiFyafgLAACNZrbjpAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUm9vdEFsaWFzUGFja2FnZS5waHDnCwAAYiFyaecLAABBOpZEpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvUm9vdFBhY2thZ2UucGhwqQUAAGIhcmmpBQAAHRsJuqQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1Jvb3RQYWNrYWdlSW50ZXJmYWNlLnBocD0FAABiIXJpPQUAALbZXcSkAQAAAAAAADAAAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1N0YWJpbGl0eUZpbHRlci5waHAUAgAAYiFyaRQCAAAd3WhqpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1BhY2thZ2UvVmVyc2lvbi9WZXJzaW9uQnVtcGVyLnBocA4MAABiIXJpDgwAAEfwg6ukAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1ZlcnNpb25HdWVzc2VyLnBocFQrAABiIXJpVCsAAKR3OQCkAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGFja2FnZS9WZXJzaW9uL1ZlcnNpb25QYXJzZXIucGhw1AcAAGIhcmnUBwAA2OCS5qQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9QYWNrYWdlL1ZlcnNpb24vVmVyc2lvblNlbGVjdG9yLnBocG0aAABiIXJpbRoAAMeHCqSkAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvUGFydGlhbENvbXBvc2VyLnBocJQGAABiIXJplAYAAKwxsMakAQAAAAAAACYAAABzcmMvQ29tcG9zZXIvUGxhdGZvcm0vSGh2bURldGVjdG9yLnBocBEFAABiIXJpEQUAAI2x8+ikAQAAAAAAACEAAABzcmMvQ29tcG9zZXIvUGxhdGZvcm0vUnVudGltZS5waHDyBAAAYiFyafIEAAAnVqA1pAEAAAAAAAAhAAAAc3JjL0NvbXBvc2VyL1BsYXRmb3JtL1ZlcnNpb24ucGhwqgcAAGIhcmmqBwAAy12v36QBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ2FwYWJpbGl0eS9DYXBhYmlsaXR5LnBocHAAAABiIXJpcAAAAJojYzukAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUGx1Z2luL0NhcGFiaWxpdHkvQ29tbWFuZFByb3ZpZGVyLnBocLAAAABiIXJpsAAAAEb82aSkAQAAAAAAAB8AAABzcmMvQ29tcG9zZXIvUGx1Z2luL0NhcGFibGUucGhwmAAAAGIhcmmYAAAA+7BoqqQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9QbHVnaW4vQ29tbWFuZEV2ZW50LnBocD8DAABiIXJpPwMAAHxVYB6kAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUGx1Z2luL1BsdWdpbkJsb2NrZWRFeGNlcHRpb24ucGhwpwAAAGIhcmmnAAAAEfb5cqQBAAAAAAAAJAAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUGx1Z2luRXZlbnRzLnBocKgBAABiIXJpqAEAAFxLk9akAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvUGx1Z2luL1BsdWdpbkludGVyZmFjZS5waHCrAQAAYiFyaasBAACm5RUcpAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QbHVnaW5NYW5hZ2VyLnBocCtTAABiIXJpK1MAAB+9v+GkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUGx1Z2luL1Bvc3RGaWxlRG93bmxvYWRFdmVudC5waHC/BQAAYiFyab8FAADgQD6JpAEAAAAAAAAqAAAAc3JjL0NvbXBvc2VyL1BsdWdpbi9QcmVDb21tYW5kUnVuRXZlbnQucGhwLwIAAGIhcmkvAgAAMwmxFKQBAAAAAAAALAAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUHJlRmlsZURvd25sb2FkRXZlbnQucGhwoAUAAGIhcmmgBQAAtHGKbKQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9QbHVnaW4vUHJlUG9vbENyZWF0ZUV2ZW50LnBocLEHAABiIXJpsQcAAAXzvNukAQAAAAAAADQAAABzcmMvQ29tcG9zZXIvUXVlc3Rpb24vU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb24ucGhwjgUAAGIhcmmOBQAABw7RcqQBAAAAAAAANQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0Fkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UucGhwqQEAAGIhcmmpAQAAEJXQsKQBAAAAAAAAKwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0FycmF5UmVwb3NpdG9yeS5waHA0GgAAYiFyaTQaAAC6jdLVpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvQXJ0aWZhY3RSZXBvc2l0b3J5LnBocHkMAABiIXJpeQwAANQYAuGkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9DYW5vbmljYWxQYWNrYWdlc1RyYWl0LnBocMQCAABiIXJpxAIAABume+ukAQAAAAAAAC4AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Db21wb3NlclJlcG9zaXRvcnkucGhwdLcAAGIhcml0twAAYvyeRqQBAAAAAAAALwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0NvbXBvc2l0ZVJlcG9zaXRvcnkucGhwhQwAAGIhcmmFDAAA+6sa36QBAAAAAAAAOwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0NvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UucGhwoQAAAGIhcmmhAAAAY2UqMqQBAAAAAAAAMAAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0ZpbGVzeXN0ZW1SZXBvc2l0b3J5LnBocN4qAABiIXJp3ioAAGoo+DGkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9GaWx0ZXJSZXBvc2l0b3J5LnBocGcQAABiIXJpZxAAACuvRr6kAQAAAAAAADQAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkucGhwWAEAAGIhcmlYAQAAvCxbf6QBAAAAAAAAOQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L0luc3RhbGxlZEZpbGVzeXN0ZW1SZXBvc2l0b3J5LnBocEoBAABiIXJpSgEAACdrQ+ikAQAAAAAAAC8AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnN0YWxsZWRSZXBvc2l0b3J5LnBocG0YAABiIXJpbRgAAPo61BKkAQAAAAAAADgAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlLnBocOAAAABiIXJp4AAAAL6y/2ekAQAAAAAAADYAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9JbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbi5waHCHAAAAYiFyaYcAAAANVzxfpAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvTG9ja0FycmF5UmVwb3NpdG9yeS5waHDiAAAAYiFyaeIAAAAAXob6pAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUGFja2FnZVJlcG9zaXRvcnkucGhwqgkAAGIhcmmqCQAAsyAi4KQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1BhdGhSZXBvc2l0b3J5LnBocFATAABiIXJpUBMAAKvG2aKkAQAAAAAAACoAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9QZWFyUmVwb3NpdG9yeS5waHAHAQAAYiFyaQcBAABRdc9qpAEAAAAAAAAuAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUGxhdGZvcm1SZXBvc2l0b3J5LnBocFlbAABiIXJpWVsAAOlEcVSkAQAAAAAAAC0AAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9SZXBvc2l0b3J5RmFjdG9yeS5waHBaFwAAYiFyaVoXAAASxbn5pAEAAAAAAAAvAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeUludGVyZmFjZS5waHClAwAAYiFyaaUDAAAxIu8ApAEAAAAAAAAtAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeU1hbmFnZXIucGhwogsAAGIhcmmiCwAAByx9fqQBAAAAAAAANwAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1JlcG9zaXRvcnlTZWN1cml0eUV4Y2VwdGlvbi5waHCIAAAAYiFyaYgAAABxnNd0pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeVNldC5waHDwJQAAYiFyafAlAADxJInjpAEAAAAAAAArAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvUmVwb3NpdG9yeVV0aWxzLnBocJkEAABiIXJpmQQAAClbjd2kAQAAAAAAADEAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Sb290UGFja2FnZVJlcG9zaXRvcnkucGhwXAEAAGIhcmlcAQAAvmA5/KQBAAAAAAAALQAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9Gb3JnZWpvRHJpdmVyLnBocFkfAABiIXJpWR8AAG+zqMqkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvRm9zc2lsRHJpdmVyLnBocAIUAABiIXJpAhQAACxZ01WkAQAAAAAAADIAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0Qml0YnVja2V0RHJpdmVyLnBocA4nAABiIXJpDicAAP9cyMakAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0RHJpdmVyLnBocLIXAABiIXJpshcAANHbRuOkAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0SHViRHJpdmVyLnBocJQ9AABiIXJplD0AAOcZve2kAQAAAAAAACwAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvR2l0TGFiRHJpdmVyLnBocNEyAABiIXJp0TIAAKqP9Q+kAQAAAAAAACgAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9WY3MvSGdEcml2ZXIucGhwjRMAAGIhcmmNEwAAeej3x6QBAAAAAAAALgAAAHNyYy9Db21wb3Nlci9SZXBvc2l0b3J5L1Zjcy9QZXJmb3JjZURyaXZlci5waHARCwAAYiFyaRELAADOJf/apAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL1N2bkRyaXZlci5waHAoHwAAYiFyaSgfAAByk1q8pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL1Zjc0RyaXZlci5waHA+CwAAYiFyaT4LAAC+IIaYpAEAAAAAAAAyAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzL1Zjc0RyaXZlckludGVyZmFjZS5waHCxAwAAYiFyabEDAABUioT4pAEAAAAAAAApAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmNzUmVwb3NpdG9yeS5waHCtNQAAYiFyaa01AAD731WTpAEAAAAAAAAxAAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvVmVyc2lvbkNhY2hlSW50ZXJmYWNlLnBocLkAAABiIXJpuQAAAIJoCIekAQAAAAAAADMAAABzcmMvQ29tcG9zZXIvUmVwb3NpdG9yeS9Xcml0YWJsZUFycmF5UmVwb3NpdG9yeS5waHDZAgAAYiFyadkCAABsJrQjpAEAAAAAAAA3AAAAc3JjL0NvbXBvc2VyL1JlcG9zaXRvcnkvV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlLnBocHcCAABiIXJpdwIAANV+vDCkAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvU2NyaXB0L0V2ZW50LnBocOMEAABiIXJp4wQAABKsuf+kAQAAAAAAACQAAABzcmMvQ29tcG9zZXIvU2NyaXB0L1NjcmlwdEV2ZW50cy5waHBJAwAAYiFyaUkDAACko0Q0pAEAAAAAAAAgAAAAc3JjL0NvbXBvc2VyL1NlbGZVcGRhdGUvS2V5cy5waHDZAQAAYiFyadkBAADJDKhzpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1NlbGZVcGRhdGUvVmVyc2lvbnMucGhwXQkAAGIhcmldCQAAB9gVjqQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9VdGlsL0F1dGhIZWxwZXIucGhw7icAAGIhcmnuJwAAoHlcF6QBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9VdGlsL0JpdGJ1Y2tldC5waHBOGgAAYiFyaU4aAABqC2oVpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvQ29tcG9zZXJNaXJyb3IucGhwGgYAAGIhcmkaBgAAI7iP5aQBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9VdGlsL0NvbmZpZ1ZhbGlkYXRvci5waHBzGAAAYiFyaXMYAADVSKH8pAEAAAAAAAAiAAAAc3JjL0NvbXBvc2VyL1V0aWwvRXJyb3JIYW5kbGVyLnBocIkJAABiIXJpiQkAAH09yeekAQAAAAAAACAAAABzcmMvQ29tcG9zZXIvVXRpbC9GaWxlc3lzdGVtLnBocKtCAABiIXJpq0IAALei9EakAQAAAAAAAB0AAABzcmMvQ29tcG9zZXIvVXRpbC9Gb3JnZWpvLnBocKEKAABiIXJpoQoAAIvHAJmkAQAAAAAAACsAAABzcmMvQ29tcG9zZXIvVXRpbC9Gb3JnZWpvUmVwb3NpdG9yeURhdGEucGhwYQMAAGIhcmlhAwAAoIIsBaQBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9VdGlsL0Zvcmdlam9VcmwucGhwzwQAAGIhcmnPBAAAPA54LKQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL0dpdC5waHDrRgAAYiFyaetGAABym+dmpAEAAAAAAAAcAAAAc3JjL0NvbXBvc2VyL1V0aWwvR2l0SHViLnBocMMYAABiIXJpwxgAAAzFrTykAQAAAAAAABwAAABzcmMvQ29tcG9zZXIvVXRpbC9HaXRMYWIucGhw5h0AAGIhcmnmHQAA2CxwDKQBAAAAAAAAGAAAAHNyYy9Db21wb3Nlci9VdGlsL0hnLnBocIUJAABiIXJphQkAALgXkvikAQAAAAAAACkAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL0N1cmxEb3dubG9hZGVyLnBocGFRAABiIXJpYVEAAFOKXnikAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL0N1cmxSZXNwb25zZS5waHCVAQAAYiFyaZUBAACSO6m5pAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cC9Qcm94eUl0ZW0ucGhwRQgAAGIhcmlFCAAAeZ/d1aQBAAAAAAAAJwAAAHNyYy9Db21wb3Nlci9VdGlsL0h0dHAvUHJveHlNYW5hZ2VyLnBocLoJAABiIXJpugkAAKdJSS+kAQAAAAAAACcAAABzcmMvQ29tcG9zZXIvVXRpbC9IdHRwL1JlcXVlc3RQcm94eS5waHCGCAAAYiFyaYYIAABZRD8dpAEAAAAAAAAjAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cC9SZXNwb25zZS5waHC2BQAAYiFyabYFAAB6fSe9pAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvSHR0cERvd25sb2FkZXIucGhw7CkAAGIhcmnsKQAABsA/eqQBAAAAAAAAHwAAAHNyYy9Db21wb3Nlci9VdGlsL0luaUhlbHBlci5waHCOAgAAYiFyaY4CAACZba5CpAEAAAAAAAAaAAAAc3JjL0NvbXBvc2VyL1V0aWwvTG9vcC5waHDNBwAAYiFyac0HAACkOzxLpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL1V0aWwvTWV0YWRhdGFNaW5pZmllci5waHBDAQAAYiFyaUMBAABkGAyYpAEAAAAAAAAkAAAAc3JjL0NvbXBvc2VyL1V0aWwvTm9Qcm94eVBhdHRlcm4ucGhwKBcAAGIhcmkoFwAATfsNoaQBAAAAAAAAIQAAAHNyYy9Db21wb3Nlci9VdGlsL1BhY2thZ2VJbmZvLnBocOACAABiIXJp4AIAAI9SGFikAQAAAAAAACMAAABzcmMvQ29tcG9zZXIvVXRpbC9QYWNrYWdlU29ydGVyLnBocMUIAABiIXJpxQgAAPa1m56kAQAAAAAAAB4AAABzcmMvQ29tcG9zZXIvVXRpbC9QZXJmb3JjZS5waHBLNQAAYiFyaUs1AACzJXMXpAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL1V0aWwvUGxhdGZvcm0ucGhwzhUAAGIhcmnOFQAABYqta6QBAAAAAAAAJQAAAHNyYy9Db21wb3Nlci9VdGlsL1Byb2Nlc3NFeGVjdXRvci5waHCIKgAAYiFyaYgqAAAPjsIMpAEAAAAAAAAmAAAAc3JjL0NvbXBvc2VyL1V0aWwvUmVtb3RlRmlsZXN5c3RlbS5waHADQgAAYiFyaQNCAAAUVkVJpAEAAAAAAAAeAAAAc3JjL0NvbXBvc2VyL1V0aWwvU2lsZW5jZXIucGhw8QIAAGIhcmnxAgAAR53PRaQBAAAAAAAAKgAAAHNyYy9Db21wb3Nlci9VdGlsL1N0cmVhbUNvbnRleHRGYWN0b3J5LnBocJgUAABiIXJpmBQAAHuuVN+kAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvVXRpbC9Tdm4ucGhwlxQAAGIhcmmXFAAAEW3eZ6QBAAAAAAAAIAAAAHNyYy9Db21wb3Nlci9VdGlsL1N5bmNIZWxwZXIucGhw/wQAAGIhcmn/BAAA0HobQaQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL1Rhci5waHCRBAAAYiFyaZEEAAANaMb0pAEAAAAAAAAfAAAAc3JjL0NvbXBvc2VyL1V0aWwvVGxzSGVscGVyLnBocK4LAABiIXJprgsAAA3cLkqkAQAAAAAAABkAAABzcmMvQ29tcG9zZXIvVXRpbC9VcmwucGhwoQwAAGIhcmmhDAAAm4+4ZKQBAAAAAAAAGQAAAHNyYy9Db21wb3Nlci9VdGlsL1ppcC5waHAPCAAAYiFyaQ8IAACjRNmRpAEAAAAAAAARAAAAc3JjL2Jvb3RzdHJhcC5waHAKAgAAYiFyaQoCAADRxC3IpAEAAAAAAAAlAAAAc3JjL0NvbXBvc2VyL0F1dG9sb2FkL0NsYXNzTG9hZGVyLnBocPo/AABiIXJp+j8AADJAHHWkAQAAAAAAACIAAABzcmMvQ29tcG9zZXIvSW5zdGFsbGVkVmVyc2lvbnMucGhw80MAAGIhcmnzQwAADzxud6QBAAAAAAAAHQAAAHJlcy9jb21wb3Nlci1sb2NrLXNjaGVtYS5qc29urw0AAGIhcmmvDQAAt8ZyZqQBAAAAAAAAIwAAAHJlcy9jb21wb3Nlci1yZXBvc2l0b3J5LXNjaGVtYS5qc29u+CAAAGIhcmn4IAAA1+u4gqQBAAAAAAAAGAAAAHJlcy9jb21wb3Nlci1zY2hlbWEuanNvbtIRAQBiIXJp0hEBAHdXCEKkAQAAAAAAABMAAAB2ZW5kb3IvYXV0b2xvYWQucGhwbAIAAGIhcmlsAgAAPGq3mKQBAAAAAAAAHwAAAHZlbmRvci9jb21wb3Nlci9DbGFzc0xvYWRlci5waHAvHAAAYiFyaS8cAACY1eKSpAEAAAAAAAAlAAAAdmVuZG9yL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocOcYAABiIXJp5xgAAKBFzkqkAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfY2xhc3NtYXAucGhwogQAAGIhcmmiBAAA9muDFqQBAAAAAAAAIgAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9maWxlcy5waHBuBAAAYiFyaW4EAAAjLz6upAEAAAAAAAAnAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwWgAAAGIhcmlaAAAA66bhlqQBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9hdXRvbG9hZF9wc3I0LnBocDwJAABiIXJpPAkAAPXUruOkAQAAAAAAACEAAAB2ZW5kb3IvY29tcG9zZXIvYXV0b2xvYWRfcmVhbC5waHDGBAAAYiFyacYEAAAPNEgHpAEAAAAAAAAjAAAAdmVuZG9yL2NvbXBvc2VyL2F1dG9sb2FkX3N0YXRpYy5waHAdGgAAYiFyaR0aAAByjVuFpAEAAAAAAAAhAAAAdmVuZG9yL2NvbXBvc2VyL2NhLWJ1bmRsZS9MSUNFTlNFHgQAAGIhcmkeBAAARwkHX6QBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9jYS1idW5kbGUvcmVzL2NhY2VydC5wZW00bwMAYiFyaTRvAwDRZ+zfpAEAAAAAAAAqAAAAdmVuZG9yL2NvbXBvc2VyL2NhLWJ1bmRsZS9zcmMvQ2FCdW5kbGUucGhwPhMAAGIhcmk+EwAAkuQ8h6QBAAAAAAAAKwAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL0xJQ0VOU0UeBAAAYiFyaR4EAAA9+b71pAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL0NsYXNzTWFwLnBocA0KAABiIXJpDQoAAAoTOZOkAQAAAAAAAD0AAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvQ2xhc3NNYXBHZW5lcmF0b3IucGhwZxsAAGIhcmlnGwAA5CQKwKQBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYy9GaWxlTGlzdC5waHAkAQAAYiFyaSQBAABo9FNxpAEAAAAAAAA6AAAAdmVuZG9yL2NvbXBvc2VyL2NsYXNzLW1hcC1nZW5lcmF0b3Ivc3JjL1BocEZpbGVDbGVhbmVyLnBocBYQAABiIXJpFhAAAHZ+U3OkAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvci9zcmMvUGhwRmlsZVBhcnNlci5waHBhDAAAYiFyaWEMAAD4HNHVpAEAAAAAAAAeAAAAdmVuZG9yL2NvbXBvc2VyL2luc3RhbGxlZC5qc29utT0BAGIhcmm1PQEA7qOidKQBAAAAAAAAHQAAAHZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwtiIAAGIhcmm2IgAAAsT806QBAAAAAAAAKQAAAHZlbmRvci9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9MSUNFTlNFHgQAAGIhcmkeBAAAvaPrx6QBAAAAAAAAOgAAAHZlbmRvci9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9zcmMvTWV0YWRhdGFNaW5pZmllci5waHDQBAAAYiFyadAEAADCMCbApAEAAAAAAAAcAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvTElDRU5TRR4EAABiIXJpHgQAAL2j68ekAQAAAAAAACsAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hBbGxSZXN1bHQucGhwHQEAAGIhcmkdAQAACVw5/6QBAAAAAAAANwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdC5waHApAQAAYiFyaSkBAABoSZ+FpAEAAAAAAAA2AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQucGhwKgEAAGIhcmkqAQAA+EEJ4KQBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9NYXRjaFJlc3VsdC5waHDvAAAAYiFyae8AAAA8BuTApAEAAAAAAAA0AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL01hdGNoU3RyaWN0R3JvdXBzUmVzdWx0LnBocPsAAABiIXJp+wAAAKfLMFGkAQAAAAAAADMAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvTWF0Y2hXaXRoT2Zmc2V0c1Jlc3VsdC5waHD8AAAAYiFyafwAAAB7KixvpAEAAAAAAAA8AAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BIUFN0YW4vSW52YWxpZFJlZ2V4UGF0dGVyblJ1bGUucGhw4gsAAGIhcmniCwAA/Nju16QBAAAAAAAAMwAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QSFBTdGFuL1ByZWdNYXRjaEZsYWdzLnBocHAHAABiIXJpcAcAAFnKGE2kAQAAAAAAAEcAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9QcmVnTWF0Y2hQYXJhbWV0ZXJPdXRUeXBlRXh0ZW5zaW9uLnBocDEHAABiIXJpMQcAAMJ9zNKkAQAAAAAAAEUAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9QcmVnTWF0Y2hUeXBlU3BlY2lmeWluZ0V4dGVuc2lvbi5waHDZCwAAYiFyadkLAABDErrHpAEAAAAAAABMAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BIUFN0YW4vUHJlZ1JlcGxhY2VDYWxsYmFja0Nsb3N1cmVUeXBlRXh0ZW5zaW9uLnBocIgHAABiIXJpiAcAANgE+C+kAQAAAAAAAD8AAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUEhQU3Rhbi9VbnNhZmVTdHJpY3RHcm91cHNDYWxsUnVsZS5waHBrCgAAYiFyaWsKAAAbM0W9pAEAAAAAAAAqAAAAdmVuZG9yL2NvbXBvc2VyL3BjcmUvc3JjL1BjcmVFeGNlcHRpb24ucGhwagMAAGIhcmlqAwAAKruqXKQBAAAAAAAAIQAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9QcmVnLnBocDAiAABiIXJpMCIAANG5lHukAQAAAAAAACIAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvUmVnZXgucGhwBA0AAGIhcmkEDQAAo/nrh6QBAAAAAAAAKgAAAHZlbmRvci9jb21wb3Nlci9wY3JlL3NyYy9SZXBsYWNlUmVzdWx0LnBocBYBAABiIXJpFgEAACexyPCkAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvcGNyZS9zcmMvVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbi5waHASAQAAYiFyaRIBAACg7sDypAEAAAAAAAAeAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9MSUNFTlNFHgQAAGIhcmkeBAAAx1NSbaQBAAAAAAAAKQAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbXBhcmF0b3IucGhwEAQAAGIhcmkQBAAAXl9Fk6QBAAAAAAAALwAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbXBpbGluZ01hdGNoZXIucGhwYwYAAGIhcmljBgAAhIAPpqQBAAAAAAAALwAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvQm91bmQucGhwdwUAAGIhcml3BQAAVzRdV6QBAAAAAAAANAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0NvbnN0cmFpbnQvQ29uc3RyYWludC5waHD4HQAAYiFyafgdAACSi4i9pAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9Db25zdHJhaW50SW50ZXJmYWNlLnBocKEBAABiIXJpoQEAAI41tHmkAQAAAAAAADwAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L01hdGNoQWxsQ29uc3RyYWludC5waHCvAgAAYiFyaa8CAACyRRf6pAEAAAAAAAA9AAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvQ29uc3RyYWludC9NYXRjaE5vbmVDb25zdHJhaW50LnBocMkCAABiIXJpyQIAANav2K6kAQAAAAAAADkAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9Db25zdHJhaW50L011bHRpQ29uc3RyYWludC5waHCKEwAAYiFyaYoTAADN1RvEpAEAAAAAAAAnAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvSW50ZXJ2YWwucGhw5gMAAGIhcmnmAwAAPVsUaaQBAAAAAAAAKAAAAHZlbmRvci9jb21wb3Nlci9zZW12ZXIvc3JjL0ludGVydmFscy5waHCkKwAAYiFyaaQrAABAMbqrpAEAAAAAAAAlAAAAdmVuZG9yL2NvbXBvc2VyL3NlbXZlci9zcmMvU2VtdmVyLnBocPkGAABiIXJp+QYAAOETLWmkAQAAAAAAACwAAAB2ZW5kb3IvY29tcG9zZXIvc2VtdmVyL3NyYy9WZXJzaW9uUGFyc2VyLnBocNctAABiIXJp1y0AABgqm3CkAQAAAAAAACUAAAB2ZW5kb3IvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9MSUNFTlNFHgQAAGIhcmkeBAAAx1NSbaQBAAAAAAAANgAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3Jlcy9zcGR4LWV4Y2VwdGlvbnMuanNvbp8WAABiIXJpnxYAAAfPTCikAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIvc3BkeC1saWNlbnNlcy9yZXMvc3BkeC1saWNlbnNlcy5qc29uIRIBAGIhcmkhEgEA7YIB7qQBAAAAAAAAMgAAAHZlbmRvci9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYy9TcGR4TGljZW5zZXMucGhwexUAAGIhcml7FQAACGNFnaQBAAAAAAAAJgAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9MSUNFTlNFKwQAAGIhcmkrBAAA1uNAVKQBAAAAAAAAMAAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvUGhwQ29uZmlnLnBocIkDAABiIXJpiQMAAGfUj3akAQAAAAAAAC4AAAB2ZW5kb3IvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjL1Byb2Nlc3MucGhw8gUAAGIhcmnyBQAAZp5aLqQBAAAAAAAALQAAAHZlbmRvci9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMvU3RhdHVzLnBocNINAABiIXJp0g0AALEBzXSkAQAAAAAAADQAAAB2ZW5kb3IvY29tcG9zZXIveGRlYnVnLWhhbmRsZXIvc3JjL1hkZWJ1Z0hhbmRsZXIucGhw0ywAAGIhcmnTLAAAOkDT46QBAAAAAAAAKAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL0xJQ0VOU0UiBAAAYiFyaSIEAAAMfLuZpAEAAAAAAABDAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludEVycm9yLnBocG4VAABiIXJpbhUAAHsyse6kAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9CYXNlQ29uc3RyYWludC5waHCiDAAAYiFyaaIMAADSaCfxpAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29sbGVjdGlvbkNvbnN0cmFpbnQucGhwgQoAAGIhcmmBCgAA5YhI7aQBAAAAAAAATwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0NvbnN0Q29uc3RyYWludC5waHBIAwAAYiFyaUgDAADeE/edpAEAAAAAAABKAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29uc3RyYWludC5waHCyDgAAYiFyabIOAACqhsm0pAEAAAAAAABTAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvQ29uc3RyYWludEludGVyZmFjZS5waHAPAgAAYiFyaQ8CAACtVvHjpAEAAAAAAABoAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvQWRkaXRpb25hbEl0ZW1zQ29uc3RyYWludC5waHC/BQAAYiFyab8FAABKg43DpAEAAAAAAABtAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvQWRkaXRpb25hbFByb3BlcnRpZXNDb25zdHJhaW50LnBocCYIAABiIXJpJggAALX1OU6kAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9BbGxPZkNvbnN0cmFpbnQucGhwsgMAAGIhcmmyAwAAWRkQXaQBAAAAAAAAXgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0FueU9mQ29uc3RyYWludC5waHApBAAAYiFyaSkEAAA3JxzrpAEAAAAAAABeAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvQ29uc3RDb25zdHJhaW50LnBocBYDAABiIXJpFgMAABrlVNGkAQAAAAAAAGEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9Db250YWluc0NvbnN0cmFpbnQucGhw+AMAAGIhcmn4AwAAn3ys/aQBAAAAAAAAZQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0RlcGVuZGVuY2llc0NvbnN0cmFpbnQucGhw1AUAAGIhcmnUBQAAwGHpvqQBAAAAAAAAYAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0RyYWZ0MDZDb25zdHJhaW50LnBocDAMAABiIXJpMAwAAGmKbz2kAQAAAAAAAF0AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9FbnVtQ29uc3RyYWludC5waHCsAwAAYiFyaawDAACEtiV4pAEAAAAAAABpAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvRXhjbHVzaXZlTWF4aW11bUNvbnN0cmFpbnQucGhwVwMAAGIhcmlXAwAACa1CyKQBAAAAAAAAaQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L0V4Y2x1c2l2ZU1pbmltdW1Db25zdHJhaW50LnBocFcDAABiIXJpVwMAAGE6U9qkAQAAAAAAAFYAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9GYWN0b3J5LnBocBMGAABiIXJpEwYAAHToQj2kAQAAAAAAAF8AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9Gb3JtYXRDb25zdHJhaW50LnBocFgWAABiIXJpWBYAANX5fhqkAQAAAAAAAF4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9JdGVtc0NvbnN0cmFpbnQucGhwPgQAAGIhcmk+BAAAlKubYqQBAAAAAAAAYQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01heEl0ZW1zQ29uc3RyYWludC5waHA+AwAAYiFyaT4DAAAC+nv2pAEAAAAAAABiAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvTWF4TGVuZ3RoQ29uc3RyYWludC5waHBMAwAAYiFyaUwDAACbVlQMpAEAAAAAAABmAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvTWF4UHJvcGVydGllc0NvbnN0cmFpbnQucGhwbgMAAGIhcmluAwAAmUdetKQBAAAAAAAAYAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01heGltdW1Db25zdHJhaW50LnBocCEDAABiIXJpIQMAAAEgBH6kAQAAAAAAAGEAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9NaW5JdGVtc0NvbnN0cmFpbnQucGhwPgMAAGIhcmk+AwAA23VWcKQBAAAAAAAAYgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01pbkxlbmd0aENvbnN0cmFpbnQucGhwTAMAAGIhcmlMAwAAddpJXqQBAAAAAAAAZgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L01pblByb3BlcnRpZXNDb25zdHJhaW50LnBocG4DAABiIXJpbgMAADDOU+GkAQAAAAAAAGAAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Db25zdHJhaW50cy9EcmFmdHMvRHJhZnQwNi9NaW5pbXVtQ29uc3RyYWludC5waHAhAwAAYiFyaSEDAACJs7K5pAEAAAAAAABjAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvTXVsdGlwbGVPZkNvbnN0cmFpbnQucGhwmwQAAGIhcmmbBAAA3av7Y6QBAAAAAAAAXAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L05vdENvbnN0cmFpbnQucGhwTAMAAGIhcmlMAwAAHWS1PaQBAAAAAAAAXgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L09uZU9mQ29uc3RyYWludC5waHAdBAAAYiFyaR0EAAASq/LNpAEAAAAAAABgAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvUGF0dGVybkNvbnN0cmFpbnQucGhwDQUAAGIhcmkNBQAA/nBOrKQBAAAAAAAAagAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1BhdHRlcm5Qcm9wZXJ0aWVzQ29uc3RyYWludC5waHD5BQAAYiFyafkFAABR7f4YpAEAAAAAAABjAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvUHJvcGVydGllc0NvbnN0cmFpbnQucGhw9wMAAGIhcmn3AwAAFcEbXaQBAAAAAAAAaAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1Byb3BlcnRpZXNOYW1lc0NvbnN0cmFpbnQucGhw+QYAAGIhcmn5BgAAmxrH7aQBAAAAAAAAXAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1JlZkNvbnN0cmFpbnQucGhwowMAAGIhcmmjAwAAB6EG76QBAAAAAAAAYQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1JlcXVpcmVkQ29uc3RyYWludC5waHBbBAAAYiFyaVsEAAC6cjLnpAEAAAAAAABdAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRHJhZnRzL0RyYWZ0MDYvVHlwZUNvbnN0cmFpbnQucGhwXQQAAGIhcmldBAAA4ePwiqQBAAAAAAAAZAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0RyYWZ0cy9EcmFmdDA2L1VuaXF1ZUl0ZW1zQ29uc3RyYWludC5waHDGAwAAYiFyacYDAAAoLbUupAEAAAAAAABOAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvRW51bUNvbnN0cmFpbnQucGhw0wMAAGIhcmnTAwAAcHFni6QBAAAAAAAARwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0ZhY3RvcnkucGhwCw8AAGIhcmkLDwAAyC50V6QBAAAAAAAAUAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL0Zvcm1hdENvbnN0cmFpbnQucGhwcxIAAGIhcmlzEgAAmKkGrKQBAAAAAAAAUAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL051bWJlckNvbnN0cmFpbnQucGhwRQgAAGIhcmlFCAAAz5RFPKQBAAAAAAAAUAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL09iamVjdENvbnN0cmFpbnQucGhwpBAAAGIhcmmkEAAA1AhxjqQBAAAAAAAAUAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL1NjaGVtYUNvbnN0cmFpbnQucGhwggkAAGIhcmmCCQAAfuqOPqQBAAAAAAAAUAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL1N0cmluZ0NvbnN0cmFpbnQucGhwIwQAAGIhcmkjBAAA/Ow1uqQBAAAAAAAAWAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL1R5cGVDaGVjay9Mb29zZVR5cGVDaGVjay5waHCPBAAAYiFyaY8EAADQagAmpAEAAAAAAABZAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVHlwZUNoZWNrL1N0cmljdFR5cGVDaGVjay5waHCxAgAAYiFyabECAAAJOZpopAEAAAAAAABcAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVHlwZUNoZWNrL1R5cGVDaGVja0ludGVyZmFjZS5waHCjAQAAYiFyaaMBAAC4QQ0XpAEAAAAAAABOAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvQ29uc3RyYWludHMvVHlwZUNvbnN0cmFpbnQucGhwrRUAAGIhcmmtFQAAEswUD6QBAAAAAAAAUwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0NvbnN0cmFpbnRzL1VuZGVmaW5lZENvbnN0cmFpbnQucGhwzCQAAGIhcmnMJAAAAeIfM6QBAAAAAAAARAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0RyYWZ0SWRlbnRpZmllcnMucGhw9wMAAGIhcmn3AwAA6NyIkKQBAAAAAAAAQwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0VudGl0eS9FcnJvckJhZy5waHD8BwAAYiFyafwHAACdd4uGpAEAAAAAAABIAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRW50aXR5L0Vycm9yQmFnUHJveHkucGhw7QMAAGIhcmntAwAAY8//laQBAAAAAAAARgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0VudGl0eS9Kc29uUG9pbnRlci5waHApBwAAYiFyaSkHAACukwgBpAEAAAAAAAA4AAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRW51bS5waHBnAAAAYiFyaWcAAAC9L8oHpAEAAAAAAABQAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHBjAAAAYiFyaWMAAABXZqKepAEAAAAAAABWAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCvAAAAYiFyaa8AAABGdCogpAEAAAAAAABUAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0ludmFsaWRDb25maWdFeGNlcHRpb24ucGhwhgAAAGIhcmmGAAAAKSmcWqQBAAAAAAAAVAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9JbnZhbGlkU2NoZW1hRXhjZXB0aW9uLnBocIYAAABiIXJphgAAAIA6J3OkAQAAAAAAAF0AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vSW52YWxpZFNjaGVtYU1lZGlhVHlwZUV4Y2VwdGlvbi5waHCPAAAAYiFyaY8AAAB3VFQ6pAEAAAAAAABXAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL0ludmFsaWRTb3VyY2VVcmlFeGNlcHRpb24ucGhwkQAAAGIhcmmRAAAA9csLfqQBAAAAAAAAUwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9Kc29uRGVjb2RpbmdFeGNlcHRpb24ucGhw+QIAAGIhcmn5AgAA8VEzPKQBAAAAAAAAVwAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9SZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uLnBocIkAAABiIXJpiQAAALkvFfGkAQAAAAAAAE4AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vUnVudGltZUV4Y2VwdGlvbi5waHCfAAAAYiFyaZ8AAAA3YovQpAEAAAAAAABeAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvRXhjZXB0aW9uL1VucmVzb2x2YWJsZUpzb25Qb2ludGVyRXhjZXB0aW9uLnBocJoAAABiIXJpmgAAAFy0KhikAQAAAAAAAFIAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9FeGNlcHRpb24vVXJpUmVzb2x2ZXJFeGNlcHRpb24ucGhwhAAAAGIhcmmEAAAATd+Ih6QBAAAAAAAAUQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL0V4Y2VwdGlvbi9WYWxpZGF0aW9uRXhjZXB0aW9uLnBocIAAAABiIXJpgAAAAB5sFuOkAQAAAAAAAEsAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9JdGVyYXRvci9PYmplY3RJdGVyYXRvci5waHA+BgAAYiFyaT4GAADsVJkopAEAAAAAAAA7AAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvUmZjMzMzOS5waHDnBQAAYiFyaecFAABzId9TpAEAAAAAAABBAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvU2NoZW1hU3RvcmFnZS5waHBqFAAAYiFyaWoUAADwna91pAEAAAAAAABKAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvU2NoZW1hU3RvcmFnZUludGVyZmFjZS5waHAxAQAAYiFyaTEBAAAMtQpTpAEAAAAAAABFAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVG9vbC9EZWVwQ29tcGFyZXIucGhwYgQAAGIhcmliBAAAmkXagaQBAAAAAAAAQQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1Rvb2wvRGVlcENvcHkucGhwlwIAAGIhcmmXAgAAeC8XM6QBAAAAAAAAXQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1Rvb2wvVmFsaWRhdG9yL1JlbGF0aXZlUmVmZXJlbmNlVmFsaWRhdG9yLnBocC0DAABiIXJpLQMAALCm5gCkAQAAAAAAAE8AAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9Ub29sL1ZhbGlkYXRvci9VcmlWYWxpZGF0b3IucGhwWQcAAGIhcmlZBwAA4F3doKQBAAAAAAAAVAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL0Fic3RyYWN0UmV0cmlldmVyLnBocPwAAABiIXJp/AAAAONgjDykAQAAAAAAAEcAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvUmV0cmlldmVycy9DdXJsLnBocNgEAABiIXJp2AQAAAN9iI2kAQAAAAAAAFIAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvUmV0cmlldmVycy9GaWxlR2V0Q29udGVudHMucGhwYAYAAGIhcmlgBgAAykuFC6QBAAAAAAAAUgAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9SZXRyaWV2ZXJzL1ByZWRlZmluZWRBcnJheS5waHBGAgAAYiFyaUYCAACPctgrpAEAAAAAAABYAAAAdmVuZG9yL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEvc3JjL0pzb25TY2hlbWEvVXJpL1JldHJpZXZlcnMvVXJpUmV0cmlldmVySW50ZXJmYWNlLnBocMgAAABiIXJpyAAAADUEgIWkAQAAAAAAAEMAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmkvVXJpUmVzb2x2ZXIucGhwAAwAAGIhcmkADAAAbKymgaQBAAAAAAAARAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaS9VcmlSZXRyaWV2ZXIucGhwUBQAAGIhcmlQFAAARTbYH6QBAAAAAAAASAAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1VyaVJlc29sdmVySW50ZXJmYWNlLnBocJ0AAABiIXJpnQAAAKO+Q/GkAQAAAAAAAEkAAAB2ZW5kb3IvanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYS9zcmMvSnNvblNjaGVtYS9VcmlSZXRyaWV2ZXJJbnRlcmZhY2UucGhwnwAAAGIhcmmfAAAA0qEVIqQBAAAAAAAAPQAAAHZlbmRvci9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hL1ZhbGlkYXRvci5waHDvBwAAYiFyae8HAAD8EngOpAEAAAAAAAAlAAAAdmVuZG9yL21hcmMtbWFiZS9waHAtZW51bS9MSUNFTlNFLnR4dPgFAABiIXJp+AUAAI+XQ9GkAQAAAAAAACYAAAB2ZW5kb3IvbWFyYy1tYWJlL3BocC1lbnVtL3NyYy9FbnVtLnBocGAYAABiIXJpYBgAAPnBUbCkAQAAAAAAACkAAAB2ZW5kb3IvbWFyYy1tYWJlL3BocC1lbnVtL3NyYy9FbnVtTWFwLnBocEMQAABiIXJpQxAAAHt+GcqkAQAAAAAAADcAAAB2ZW5kb3IvbWFyYy1tYWJlL3BocC1lbnVtL3NyYy9FbnVtU2VyaWFsaXphYmxlVHJhaXQucGhwfwUAAGIhcml/BQAAszvon6QBAAAAAAAAKQAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3JjL0VudW1TZXQucGhwpjYAAGIhcmmmNgAABJymX6QBAAAAAAAALgAAAHZlbmRvci9tYXJjLW1hYmUvcGhwLWVudW0vc3R1YnMvU3RyaW5nYWJsZS5waHBiAAAAYiFyaWIAAADD0Zs8pAEAAAAAAAAcAAAAdmVuZG9yL3Bzci9jb250YWluZXIvTElDRU5TRXsEAABiIXJpewQAANXTAGWkAQAAAAAAADgAAAB2ZW5kb3IvcHNyL2NvbnRhaW5lci9zcmMvQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlLnBocE4AAABiIXJpTgAAAPxMGIOkAQAAAAAAAC8AAAB2ZW5kb3IvcHNyL2NvbnRhaW5lci9zcmMvQ29udGFpbmVySW50ZXJmYWNlLnBocLcAAABiIXJptwAAAIrjAbykAQAAAAAAADcAAAB2ZW5kb3IvcHNyL2NvbnRhaW5lci9zcmMvTm90Rm91bmRFeGNlcHRpb25JbnRlcmZhY2UucGhwcQAAAGIhcmlxAAAAUn/69aQBAAAAAAAAFgAAAHZlbmRvci9wc3IvbG9nL0xJQ0VOU0U/BAAAYiFyaT8EAACE+QkIpAEAAAAAAAApAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9BYnN0cmFjdExvZ2dlci5waHA7BAAAYiFyaTsEAADxPjNbpAEAAAAAAAAzAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9JbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ucGhwYAAAAGIhcmlgAAAAIIhYMaQBAAAAAAAAIwAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvTG9nTGV2ZWwucGhw+wAAAGIhcmn7AAAAavDxOKQBAAAAAAAALwAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvTG9nZ2VyQXdhcmVJbnRlcmZhY2UucGhwfAAAAGIhcml8AAAAJBOjiKQBAAAAAAAAKwAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvTG9nZ2VyQXdhcmVUcmFpdC5waHCnAAAAYiFyaacAAABUvfpCpAEAAAAAAAAqAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9Mb2dnZXJJbnRlcmZhY2UucGhwyAIAAGIhcmnIAgAAmh94HaQBAAAAAAAAJgAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvTG9nZ2VyVHJhaXQucGhwawQAAGIhcmlrBAAAo32JkqQBAAAAAAAAJQAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvTnVsbExvZ2dlci5waHCfAAAAYiFyaZ8AAACBWPOqpAEAAAAAAAApAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9UZXN0L0R1bW15VGVzdC5waHBwAAAAYiFyaXAAAAAaFc4FpAEAAAAAAAAzAAAAdmVuZG9yL3Bzci9sb2cvUHNyL0xvZy9UZXN0L0xvZ2dlckludGVyZmFjZVRlc3QucGhwIA0AAGIhcmkgDQAAHSQv0qQBAAAAAAAAKgAAAHZlbmRvci9wc3IvbG9nL1Bzci9Mb2cvVGVzdC9UZXN0TG9nZ2VyLnBocDwIAABiIXJpPAgAAP4o5UmkAQAAAAAAABwAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9MSUNFTlNFaQQAAGIhcmlpBAAAEDN9i6QBAAAAAAAAJQAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9EZWZlcnJlZC5waHBTAgAAYiFyaVMCAAC99teGpAEAAAAAAAA5AAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL0V4Y2VwdGlvbi9Db21wb3NpdGVFeGNlcHRpb24ucGhwjAEAAGIhcmmMAQAAIYzP4qQBAAAAAAAANgAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9FeGNlcHRpb24vTGVuZ3RoRXhjZXB0aW9uLnBocF4AAABiIXJpXgAAAAQ/cQSkAQAAAAAAADcAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvSW50ZXJuYWwvQ2FuY2VsbGF0aW9uUXVldWUucGhwcgMAAGIhcmlyAwAAgXhfsaQBAAAAAAAANgAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9JbnRlcm5hbC9GdWxmaWxsZWRQcm9taXNlLnBocHgFAABiIXJpeAUAADpzeMWkAQAAAAAAADUAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvSW50ZXJuYWwvUmVqZWN0ZWRQcm9taXNlLnBocPUHAABiIXJp9QcAAJ+HE/qkAQAAAAAAACQAAAB2ZW5kb3IvcmVhY3QvcHJvbWlzZS9zcmMvUHJvbWlzZS5waHCQEwAAYiFyaZATAAClFZZDpAEAAAAAAAAtAAAAdmVuZG9yL3JlYWN0L3Byb21pc2Uvc3JjL1Byb21pc2VJbnRlcmZhY2UucGhwaQIAAGIhcmlpAgAAJh1dKKQBAAAAAAAAJgAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnMucGhwxxQAAGIhcmnHFAAAYKW30qQBAAAAAAAALgAAAHZlbmRvci9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHBdAAAAYiFyaV0AAABR0TyhpAEAAAAAAAAcAAAAdmVuZG9yL3NlbGQvanNvbmxpbnQvTElDRU5TRSQEAABiIXJpJAQAADQ6h36kAQAAAAAAAEAAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludC9EdXBsaWNhdGVLZXlFeGNlcHRpb24ucGhwfAEAAGIhcml8AQAAmsoJ7KQBAAAAAAAANQAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L0pzb25QYXJzZXIucGhwTTkAAGIhcmlNOQAAfMEQbqQBAAAAAAAAMAAAAHZlbmRvci9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50L0xleGVyLnBocKUUAABiIXJppRQAAMi7X6SkAQAAAAAAADsAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludC9QYXJzaW5nRXhjZXB0aW9uLnBocCgBAABiIXJpKAEAAD7bdn2kAQAAAAAAADQAAAB2ZW5kb3Ivc2VsZC9qc29ubGludC9zcmMvU2VsZC9Kc29uTGludC9VbmRlZmluZWQucGhwPgAAAGIhcmk+AAAA/3Gfn6QBAAAAAAAAHgAAAHZlbmRvci9zZWxkL3BoYXItdXRpbHMvTElDRU5TRSQEAABiIXJpJAQAAJosTaekAQAAAAAAACUAAAB2ZW5kb3Ivc2VsZC9waGFyLXV0aWxzL3NyYy9MaW50ZXIucGhwaQcAAGIhcmlpBwAAoBuN3qQBAAAAAAAAKQAAAHZlbmRvci9zZWxkL3BoYXItdXRpbHMvc3JjL1RpbWVzdGFtcHMucGhwXg0AAGIhcmleDQAAneXDRKQBAAAAAAAAIgAAAHZlbmRvci9zZWxkL3NpZ25hbC1oYW5kbGVyL0xJQ0VOU0UkBAAAYiFyaSQEAACaLE2npAEAAAAAAAAwAAAAdmVuZG9yL3NlbGQvc2lnbmFsLWhhbmRsZXIvc3JjL1NpZ25hbEhhbmRsZXIucGhwsB0AAGIhcmmwHQAAgQAWCqQBAAAAAAAAJgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQXBwbGljYXRpb24ucGhwBnEAAGIhcmkGcQAA/W0hhKQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQXR0cmlidXRlL0FzQ29tbWFuZC5waHDUAQAAYiFyadQBAAC9M9z+pAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9DSS9HaXRodWJBY3Rpb25SZXBvcnRlci5waHD1BQAAYiFyafUFAAC+2yJnpAEAAAAAAAAgAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db2xvci5waHBoDgAAYiFyaWgOAABHYueXpAEAAAAAAAAqAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0NvbW1hbmQucGhwSicAAGIhcmlKJwAAAAvad6QBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9Db21wbGV0ZUNvbW1hbmQucGhwixYAAGIhcmmLFgAAvg99G6QBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9EdW1wQ29tcGxldGlvbkNvbW1hbmQucGhwkA8AAGIhcmmQDwAAOZsGOaQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9IZWxwQ29tbWFuZC5waHAVCQAAYiFyaRUJAAAIfZelpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kL0xhenlDb21tYW5kLnBocJsPAABiIXJpmw8AAAeebeWkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvTGlzdENvbW1hbmQucGhwMQkAAGIhcmkxCQAAJES7fKQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZC9Mb2NrYWJsZVRyYWl0LnBocA8EAABiIXJpDwQAAHE1Z2qkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmQvU2lnbmFsYWJsZUNvbW1hbmRJbnRlcmZhY2UucGhw0wAAAGIhcmnTAAAAu0JgvqQBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tbWFuZExvYWRlci9Db21tYW5kTG9hZGVySW50ZXJmYWNlLnBocFEBAABiIXJpUQEAAJsQnkikAQAAAAAAAD8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbW1hbmRMb2FkZXIvQ29udGFpbmVyQ29tbWFuZExvYWRlci5waHBVAwAAYiFyaVUDAAAby1/8pAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Db21tYW5kTG9hZGVyL0ZhY3RvcnlDb21tYW5kTG9hZGVyLnBocK8CAABiIXJprwIAAGS8InqkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbXBsZXRpb24vQ29tcGxldGlvbklucHV0LnBocBYTAABiIXJpFhMAAJQkhGukAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbXBsZXRpb24vQ29tcGxldGlvblN1Z2dlc3Rpb25zLnBocMIDAABiIXJpwgMAABJBoR+kAQAAAAAAAEEAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbXBsZXRpb24vT3V0cHV0L0Jhc2hDb21wbGV0aW9uT3V0cHV0LnBocGcCAABiIXJpZwIAAIfs+VekAQAAAAAAAEYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbXBsZXRpb24vT3V0cHV0L0NvbXBsZXRpb25PdXRwdXRJbnRlcmZhY2UucGhwRgEAAGIhcmlGAQAA1DJuTaQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ29tcGxldGlvbi9TdWdnZXN0aW9uLnBocDMBAABiIXJpMwEAAMyGIB2kAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0NvbnNvbGVFdmVudHMucGhw1QIAAGIhcmnVAgAAgWd3XaQBAAAAAAAAIQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvQ3Vyc29yLnBocI8JAABiIXJpjwkAAMarp46kAQAAAAAAAEQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0RlcGVuZGVuY3lJbmplY3Rpb24vQWRkQ29uc29sZUNvbW1hbmRQYXNzLnBocGYRAABiIXJpZhEAACPUICSkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvQXBwbGljYXRpb25EZXNjcmlwdGlvbi5waHDZCQAAYiFyadkJAADncENepAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL0Rlc2NyaXB0b3IucGhwfQcAAGIhcml9BwAAseozXqQBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9EZXNjcmlwdG9ySW50ZXJmYWNlLnBocPcAAABiIXJp9wAAALXlQOCkAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Rlc2NyaXB0b3IvSnNvbkRlc2NyaXB0b3IucGhw6xAAAGIhcmnrEAAAMSXoj6QBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9NYXJrZG93bkRlc2NyaXB0b3IucGhwURQAAGIhcmlRFAAAdKCIdqQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRGVzY3JpcHRvci9UZXh0RGVzY3JpcHRvci5waHDnIgAAYiFyaeciAADIuMzLpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9EZXNjcmlwdG9yL1htbERlc2NyaXB0b3IucGhwCB8AAGIhcmkIHwAAdUlAmqQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnQvQ29uc29sZUNvbW1hbmRFdmVudC5waHDJAQAAYiFyackBAACw1uEOpAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlRXJyb3JFdmVudC5waHD9AwAAYiFyaf0DAAAY6SWYpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudC9Db25zb2xlRXZlbnQucGhwxgIAAGIhcmnGAgAAxW/b2aQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXZlbnQvQ29uc29sZVNpZ25hbEV2ZW50LnBocEcCAABiIXJpRwIAAI77GwukAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V2ZW50L0NvbnNvbGVUZXJtaW5hdGVFdmVudC5waHB+AgAAYiFyaX4CAABocr3WpAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FdmVudExpc3RlbmVyL0Vycm9yTGlzdGVuZXIucGhwJwgAAGIhcmknCAAA8KKhiaQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL0NvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbi5waHDbAQAAYiFyadsBAABLfZ4XpAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9FeGNlcHRpb24vRXhjZXB0aW9uSW50ZXJmYWNlLnBocHkAAABiIXJpeQAAANk5WyakAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9JbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ucGhwpgAAAGIhcmmmAAAA1sy9WqQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL0ludmFsaWRPcHRpb25FeGNlcHRpb24ucGhwpgAAAGIhcmmmAAAAE8vXSKQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL0xvZ2ljRXhjZXB0aW9uLnBocJIAAABiIXJpkgAAAM1PXGWkAQAAAAAAADoAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9NaXNzaW5nSW5wdXRFeGNlcHRpb24ucGhwnAAAAGIhcmmcAAAA5lMK/qQBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRXhjZXB0aW9uL05hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uLnBocIsAAABiIXJpiwAAAILzbqmkAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJYAAABiIXJplgAAANntLDakAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9OdWxsT3V0cHV0Rm9ybWF0dGVyLnBocI0CAABiIXJpjQIAACEmDXWkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9OdWxsT3V0cHV0Rm9ybWF0dGVyU3R5bGUucGhwDAIAAGIhcmkMAgAAyjCH2KQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlci5waHB/FQAAYiFyaX8VAADc5qUSpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlLnBocKMBAABiIXJpowEAAFkgp9+kAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0Zvcm1hdHRlci9PdXRwdXRGb3JtYXR0ZXJTdHlsZS5waHB6BwAAYiFyaXoHAAD/amGtpAEAAAAAAABCAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Gb3JtYXR0ZXIvT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UucGhwnwEAAGIhcmmfAQAA+IDEd6QBAAAAAAAAPgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL091dHB1dEZvcm1hdHRlclN0eWxlU3RhY2sucGhwhQUAAGIhcmmFBQAATNnhiqQBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvRm9ybWF0dGVyL1dyYXBwYWJsZU91dHB1dEZvcm1hdHRlckludGVyZmFjZS5waHDWAAAAYiFyadYAAAChWgG3pAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvRGVidWdGb3JtYXR0ZXJIZWxwZXIucGhwuAgAAGIhcmm4CAAApPA2oKQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0Rlc2NyaXB0b3JIZWxwZXIucGhwwAUAAGIhcmnABQAApmfMhKQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0R1bXBlci5waHAUBQAAYiFyaRQFAACfPMvfpAEAAAAAAAAxAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvRm9ybWF0dGVySGVscGVyLnBocGkFAABiIXJpaQUAAKS2gHekAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9IZWxwZXIucGhwjQwAAGIhcmmNDAAAwZQxVKQBAAAAAAAAMQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL0hlbHBlckludGVyZmFjZS5waHDmAAAAYiFyaeYAAABgUsJcpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvSGVscGVyU2V0LnBocEkFAABiIXJpSQUAAD2H4kSkAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9JbnB1dEF3YXJlSGVscGVyLnBocGMBAABiIXJpYwEAAAbM+IOkAQAAAAAAAC8AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9Qcm9jZXNzSGVscGVyLnBocFwMAABiIXJpXAwAABDEekGkAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9Qcm9ncmVzc0Jhci5waHBYLwAAYiFyaVgvAAAycJLkpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9IZWxwZXIvUHJvZ3Jlc3NJbmRpY2F0b3IucGhwwBIAAGIhcmnAEgAAh8tl9aQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1F1ZXN0aW9uSGVscGVyLnBocFItAABiIXJpUi0AAOanMWmkAQAAAAAAADcAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9TeW1mb255UXVlc3Rpb25IZWxwZXIucGhwGQkAAGIhcmkZCQAA4J1k/6QBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlLnBocLRKAABiIXJptEoAAFPXwa2kAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9UYWJsZUNlbGwucGhwQQQAAGIhcmlBBAAA6NOgf6QBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlQ2VsbFN0eWxlLnBocO4FAABiIXJp7gUAANGNuV+kAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9UYWJsZVJvd3MucGhwKQEAAGIhcmkpAQAAV4ozeqQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSGVscGVyL1RhYmxlU2VwYXJhdG9yLnBocMUAAABiIXJpxQAAALz1y/ykAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0hlbHBlci9UYWJsZVN0eWxlLnBocI0UAABiIXJpjRQAAFcYugikAQAAAAAAACoAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0FyZ3ZJbnB1dC5waHArHAAAYiFyaSscAABGsbbRpAEAAAAAAAArAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9BcnJheUlucHV0LnBocAgNAABiIXJpCA0AAPGmny6kAQAAAAAAACYAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0LnBocKQNAABiIXJppA0AANrcb7GkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L0lucHV0QXJndW1lbnQucGhwFwYAAGIhcmkXBgAAzqDA+qQBAAAAAAAANAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXRBd2FyZUludGVyZmFjZS5waHCYAAAAYiFyaZgAAACtD0+wpAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9JbnB1dC9JbnB1dERlZmluaXRpb24ucGhwIxoAAGIhcmkjGgAACYwhM6QBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXRJbnRlcmZhY2UucGhw/AMAAGIhcmn8AwAAR7b0qKQBAAAAAAAALAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvSW5wdXRPcHRpb24ucGhwHQ4AAGIhcmkdDgAASaqeL6QBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvSW5wdXQvU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlLnBocM4AAABiIXJpzgAAANbVQpukAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0lucHV0L1N0cmluZ0lucHV0LnBocD8GAABiIXJpPwYAALGSFMukAQAAAAAAAB4AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL0xJQ0VOU0UuBAAAYiFyaS4EAAD3ugJrpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9Mb2dnZXIvQ29uc29sZUxvZ2dlci5waHAECwAAYiFyaQQLAADHDA5RpAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvQnVmZmVyZWRPdXRwdXQucGhwbAEAAGIhcmlsAQAAeTq4EKQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L0NvbnNvbGVPdXRwdXQucGhwkQkAAGIhcmmRCQAAXN3vYqQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L0NvbnNvbGVPdXRwdXRJbnRlcmZhY2UucGhwEgEAAGIhcmkSAQAAier3tKQBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L0NvbnNvbGVTZWN0aW9uT3V0cHV0LnBocJQJAABiIXJplAkAAMBnb0CkAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9OdWxsT3V0cHV0LnBocEIEAABiIXJpQgQAACUjUsakAQAAAAAAACgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9PdXRwdXQucGhwyAkAAGIhcmnICQAAn8s4eKQBAAAAAAAAMQAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvT3V0cHV0L091dHB1dEludGVyZmFjZS5waHDtAwAAYiFyae0DAADwjr4FpAEAAAAAAAAuAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9PdXRwdXQvU3RyZWFtT3V0cHV0LnBocKIGAABiIXJpogYAACy+IvykAQAAAAAAADUAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL091dHB1dC9UcmltbWVkQnVmZmVyT3V0cHV0LnBocNsDAABiIXJp2wMAAGxrg36kAQAAAAAAADIAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1F1ZXN0aW9uL0Nob2ljZVF1ZXN0aW9uLnBocN0KAABiIXJp3QoAAAlj5KakAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1F1ZXN0aW9uL0NvbmZpcm1hdGlvblF1ZXN0aW9uLnBocAIDAABiIXJpAgMAAO55xYSkAQAAAAAAACwAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1F1ZXN0aW9uL1F1ZXN0aW9uLnBocCINAABiIXJpIg0AAMreudukAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Jlc291cmNlcy9iaW4vaGlkZGVuaW5wdXQuZXhlACQAAGIhcmkAJAAAlY2ldqQBAAAAAAAAMAAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvUmVzb3VyY2VzL2NvbXBsZXRpb24uYmFzaM8KAABiIXJpzwoAAJsYJ3KkAQAAAAAAADgAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1NpZ25hbFJlZ2lzdHJ5L1NpZ25hbFJlZ2lzdHJ5LnBocCEEAABiIXJpIQQAAH4uOq+kAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1NpbmdsZUNvbW1hbmRBcHBsaWNhdGlvbi5waHA3BAAAYiFyaTcEAADNMb4fpAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9TdHlsZS9PdXRwdXRTdHlsZS5waHB0BwAAYiFyaXQHAABPFjvGpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9TdHlsZS9TdHlsZUludGVyZmFjZS5waHAQBAAAYiFyaRAEAABcG54OpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9TdHlsZS9TeW1mb255U3R5bGUucGhwNScAAGIhcmk1JwAAeWz39KQBAAAAAAAAIwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVybWluYWwucGhwbQsAAGIhcmltCwAAh6VQdqQBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2NvbnNvbGUvVGVzdGVyL0FwcGxpY2F0aW9uVGVzdGVyLnBocIwEAABiIXJpjAQAAB4fSfukAQAAAAAAADkAAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9Db21tYW5kQ29tcGxldGlvblRlc3Rlci5waHDaAwAAYiFyadoDAADKmzuwpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXN0ZXIvQ29tbWFuZFRlc3Rlci5waHDZAwAAYiFyadkDAABECLYHpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvY29uc29sZS9UZXN0ZXIvQ29uc3RyYWludC9Db21tYW5kSXNTdWNjZXNzZnVsLnBocNYCAABiIXJp1gIAAB7Gg4KkAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9jb25zb2xlL1Rlc3Rlci9UZXN0ZXJUcmFpdC5waHCsDQAAYiFyaawNAAAyJ0yypAEAAAAAAAAsAAAAdmVuZG9yL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzL0xJQ0VOU0UuBAAAYiFyaS4EAAAH5PSIpAEAAAAAAAAxAAAAdmVuZG9yL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzL2Z1bmN0aW9uLnBocD0BAABiIXJpPQEAAJ7BtA2kAQAAAAAAADoAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9FeGNlcHRpb25JbnRlcmZhY2UucGhwfAAAAGIhcml8AAAAjQXpRKQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0ZpbGVOb3RGb3VuZEV4Y2VwdGlvbi5waHDRAQAAYiFyadEBAABi5n20pAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9FeGNlcHRpb24vSU9FeGNlcHRpb24ucGhwmwEAAGIhcmmbAQAAM1/D6qQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL0lPRXhjZXB0aW9uSW50ZXJmYWNlLnBocKYAAABiIXJppgAAAGrZd02kAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9maWxlc3lzdGVtL0V4Y2VwdGlvbi9JbnZhbGlkQXJndW1lbnRFeGNlcHRpb24ucGhwqQAAAGIhcmmpAAAAjSEOx6QBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRXhjZXB0aW9uL1J1bnRpbWVFeGNlcHRpb24ucGhwmQAAAGIhcmmZAAAA3VVVSKQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vRmlsZXN5c3RlbS5waHAkQgAAYiFyaSRCAACSwHc7pAEAAAAAAAAhAAAAdmVuZG9yL3N5bWZvbnkvZmlsZXN5c3RlbS9MSUNFTlNFLgQAAGIhcmkuBAAA97oCa6QBAAAAAAAAIgAAAHZlbmRvci9zeW1mb255L2ZpbGVzeXN0ZW0vUGF0aC5waHBiJwAAYiFyaWInAAAG36MZpAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0NvbXBhcmF0b3IvQ29tcGFyYXRvci5waHA0BwAAYiFyaTQHAAAi7LzVpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0NvbXBhcmF0b3IvRGF0ZUNvbXBhcmF0b3IucGhwBQMAAGIhcmkFAwAAzyX6ZaQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9Db21wYXJhdG9yL051bWJlckNvbXBhcmF0b3IucGhwegMAAGIhcml6AwAAK7wAaKQBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9FeGNlcHRpb24vQWNjZXNzRGVuaWVkRXhjZXB0aW9uLnBocIQAAABiIXJphAAAAL2+c5ykAQAAAAAAAD4AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvRXhjZXB0aW9uL0RpcmVjdG9yeU5vdEZvdW5kRXhjZXB0aW9uLnBocIkAAABiIXJpiQAAAGEp/xukAQAAAAAAACAAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvRmluZGVyLnBocNYnAABiIXJp1icAAI4FP+SkAQAAAAAAACMAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvR2l0aWdub3JlLnBocLMHAABiIXJpswcAABxzCTSkAQAAAAAAAB4AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvR2xvYi5waHDHBgAAYiFyaccGAABEYoezpAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0N1c3RvbUZpbHRlckl0ZXJhdG9yLnBocGMCAABiIXJpYwIAABM38JmkAQAAAAAAADoAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRGF0ZVJhbmdlRmlsdGVySXRlcmF0b3IucGhwjwIAAGIhcmmPAgAAUJp/c6QBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9EZXB0aFJhbmdlRmlsdGVySXRlcmF0b3IucGhwFwIAAGIhcmkXAgAAp44DEqQBAAAAAAAAQQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9FeGNsdWRlRGlyZWN0b3J5RmlsdGVySXRlcmF0b3IucGhwMAYAAGIhcmkwBgAAAy53dqQBAAAAAAAAOQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9GaWxlVHlwZUZpbHRlckl0ZXJhdG9yLnBocIgCAABiIXJpiAIAAF62IvukAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvRmlsZWNvbnRlbnRGaWx0ZXJJdGVyYXRvci5waHBXAgAAYiFyaVcCAADCxRLZpAEAAAAAAAA5AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL0ZpbGVuYW1lRmlsdGVySXRlcmF0b3IucGhwlAEAAGIhcmmUAQAAPZnc9KQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9MYXp5SXRlcmF0b3IucGhwUQEAAGIhcmlRAQAAbl2/vKQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9NdWx0aXBsZVBjcmVGaWx0ZXJJdGVyYXRvci5waHCNBQAAYiFyaY0FAACigNcXpAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL1BhdGhGaWx0ZXJJdGVyYXRvci5waHDyAQAAYiFyafIBAABnFCJfpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvZmluZGVyL0l0ZXJhdG9yL1JlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yLnBocEsJAABiIXJpSwkAAOmGRg2kAQAAAAAAADoAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvU2l6ZVJhbmdlRmlsdGVySXRlcmF0b3IucGhwfAIAAGIhcml8AgAABjPZn6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L2ZpbmRlci9JdGVyYXRvci9Tb3J0YWJsZUl0ZXJhdG9yLnBocCgKAABiIXJpKAoAANPirg+kAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvSXRlcmF0b3IvVmNzSWdub3JlZEZpbHRlckl0ZXJhdG9yLnBocHcKAABiIXJpdwoAAMW1HTOkAQAAAAAAAB0AAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvTElDRU5TRS4EAABiIXJpLgQAAPe6AmukAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9maW5kZXIvU3BsRmlsZUluZm8ucGhwvQMAAGIhcmm9AwAAB3kFG6QBAAAAAAAAJwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWN0eXBlL0N0eXBlLnBocIcKAABiIXJphwoAAH62ZLikAQAAAAAAACUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZS9MSUNFTlNFLgQAAGIhcmkuBAAApripWKQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWN0eXBlL2Jvb3RzdHJhcC5waHAyBQAAYiFyaTIFAADIYa04pAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvYm9vdHN0cmFwODAucGhwaAUAAGIhcmloBQAAS795uKQBAAAAAAAAMgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvR3JhcGhlbWUucGhwFBsAAGIhcmkUGwAAs8e1LaQBAAAAAAAALQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvTElDRU5TRS4EAABiIXJpLgQAAMscH2ukAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lL2Jvb3RzdHJhcC5waHBDCAAAYiFyaUMIAAB2X5sMpAEAAAAAAAA1AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9ib290c3RyYXA4MC5waHA8CgAAYiFyaTwKAABOH1Y9pAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL0xJQ0VOU0UuBAAAYiFyaS4EAADLHB9rpAEAAAAAAAA2AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL05vcm1hbGl6ZXIucGhw9hYAAGIhcmn2FgAA6mndZaQBAAAAAAAARgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvc3R1YnMvTm9ybWFsaXplci5waHAuAQAAYiFyaS4BAABRcySXpAEAAAAAAABSAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy91bmlkYXRhL2Nhbm9uaWNhbENvbXBvc2l0aW9uLnBocIk9AABiIXJpiT0AACrvbz+kAQAAAAAAAFQAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3VuaWRhdGEvY2Fub25pY2FsRGVjb21wb3NpdGlvbi5waHBhiAAAYiFyaWGIAADnUr19pAEAAAAAAABMAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL1Jlc291cmNlcy91bmlkYXRhL2NvbWJpbmluZ0NsYXNzLnBocHQuAABiIXJpdC4AAAtxkNykAQAAAAAAAFgAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3VuaWRhdGEvY29tcGF0aWJpbGl0eURlY29tcG9zaXRpb24ucGhwmegAAGIhcmmZ6AAAb5RlKaQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhw6wEAAGIhcmnrAQAAUPqjRKQBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXA4MC5waHDpAQAAYiFyaekBAAA95XK0pAEAAAAAAAAoAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvTElDRU5TRS4EAABiIXJpLgQAAMscH2ukAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9NYnN0cmluZy5waHD1XgAAYiFyafVeAAAk3Z0tpAEAAAAAAABCAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvUmVzb3VyY2VzL3VuaWRhdGEvY2FzZUZvbGRpbmcucGhwlQcAAGIhcmmVBwAA9Laz46QBAAAAAAAAQAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL1Jlc291cmNlcy91bmlkYXRhL2xvd2VyQ2FzZS5waHD5VAAAYiFyaflUAAADlbErpAEAAAAAAABGAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvUmVzb3VyY2VzL3VuaWRhdGEvdGl0bGVDYXNlUmVnZXhwLnBocOMXAABiIXJp4xcAAPZ5X5WkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9SZXNvdXJjZXMvdW5pZGF0YS91cHBlckNhc2UucGhwOFsAAGIhcmk4WwAAK1LYKqQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL2Jvb3RzdHJhcC5waHBtHwAAYiFyaW0fAABP6TsLpAEAAAAAAAAwAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmcvYm9vdHN0cmFwODAucGhwgCUAAGIhcmmAJQAAFW8CIKQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDczL0xJQ0VOU0UuBAAAYiFyaS4EAACmuKlYpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvUGhwNzMucGhwbgEAAGIhcmluAQAAQ3OlbKQBAAAAAAAAPwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDczL1Jlc291cmNlcy9zdHVicy9Kc29uRXhjZXB0aW9uLnBocFsAAABiIXJpWwAAAE0YstykAQAAAAAAACsAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9ib290c3RyYXAucGhw+QIAAGIhcmn5AgAAQVk4xqQBAAAAAAAAJQAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL0xJQ0VOU0UuBAAAYiFyaS4EAAAH5PSIpAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUGhwODAucGhwoQkAAGIhcmmhCQAAW8JrC6QBAAAAAAAAKgAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1BocFRva2VuLnBocBYFAABiIXJpFgUAAHiCwMukAQAAAAAAADsAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvQXR0cmlidXRlLnBocMcBAABiIXJpxwEAAN3e7fukAQAAAAAAADoAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvUGhwVG9rZW4ucGhwjQAAAGIhcmmNAAAA2pQF3aQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9TdHJpbmdhYmxlLnBocGsAAABiIXJpawAAAB7Q/SukAQAAAAAAAEUAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVW5oYW5kbGVkTWF0Y2hFcnJvci5waHBdAAAAYiFyaV0AAAC6Z8MWpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1ZhbHVlRXJyb3IucGhwVAAAAGIhcmlUAAAAkdZ3l6QBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgwL2Jvb3RzdHJhcC5waHD6BAAAYiFyafoEAADX7uUCpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvTElDRU5TRS4EAABiIXJpLgQAADtjqaekAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9QaHA4MS5waHA7AQAAYiFyaTsBAAAW+atkpAEAAAAAAABAAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL0NVUkxTdHJpbmdGaWxlLnBocIIDAABiIXJpggMAAOHBP+ykAQAAAAAAAEYAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9SZXNvdXJjZXMvc3R1YnMvUmV0dXJuVHlwZVdpbGxDaGFuZ2UucGhwnwAAAGIhcmmfAAAAzsC+/KQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDgxL2Jvb3RzdHJhcC5waHD0AQAAYiFyafQBAACI09BcpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvTElDRU5TRS4EAABiIXJpLgQAAPf4gjWkAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9QaHA4NC5waHBgGgAAYiFyaWAaAAC7uDPdpAEAAAAAAAA8AAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL0RlcHJlY2F0ZWQucGhweAEAAGIhcml4AQAAX4tSs6QBAAAAAAAARAAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9SZWZsZWN0aW9uQ29uc3RhbnQucGhweQoAAGIhcml5CgAApauPj6QBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3BvbHlmaWxsLXBocDg0L2Jvb3RzdHJhcC5waHAuCgAAYiFyaS4KAABcAtatpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvYm9vdHN0cmFwODIucGhwLQEAAGIhcmktAQAALDSfR6QBAAAAAAAANwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL0V4Y2VwdGlvbkludGVyZmFjZS5waHB5AAAAYiFyaXkAAABxVlhKpAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uLnBocKgAAABiIXJpqAAAANDAK1+kAQAAAAAAADMAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9Mb2dpY0V4Y2VwdGlvbi5waHCUAAAAYiFyaZQAAAAgs+PxpAEAAAAAAAA7AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbi5waHB4AwAAYiFyaXgDAACozHp5pAEAAAAAAAA9AAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9FeGNlcHRpb24vUHJvY2Vzc1NpZ25hbGVkRXhjZXB0aW9uLnBocBECAABiIXJpEQIAAFnXqeKkAQAAAAAAAD0AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL0V4Y2VwdGlvbi9Qcm9jZXNzVGltZWRPdXRFeGNlcHRpb24ucGhwMQQAAGIhcmkxBAAAgidaFaQBAAAAAAAANQAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhjZXB0aW9uL1J1bnRpbWVFeGNlcHRpb24ucGhwmAAAAGIhcmmYAAAAohvYOqQBAAAAAAAAKwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvRXhlY3V0YWJsZUZpbmRlci5waHD4BwAAYiFyafgHAAABv1uqpAEAAAAAAAAmAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9JbnB1dFN0cmVhbS5waHAwBAAAYiFyaTAEAACMhD6HpAEAAAAAAAAeAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9MSUNFTlNFLgQAAGIhcmkuBAAA97oCa6QBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGhwRXhlY3V0YWJsZUZpbmRlci5waHD/BAAAYiFyaf8EAADqrsWMpAEAAAAAAAAlAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9QaHBQcm9jZXNzLnBocPgEAABiIXJp+AQAAHDEWBmkAQAAAAAAAC4AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL0Fic3RyYWN0UGlwZXMucGhwHgsAAGIhcmkeCwAAAmtTUaQBAAAAAAAALwAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGlwZXMvUGlwZXNJbnRlcmZhY2UucGhwmQEAAGIhcmmZAQAAZlHaDKQBAAAAAAAAKgAAAHZlbmRvci9zeW1mb255L3Byb2Nlc3MvUGlwZXMvVW5peFBpcGVzLnBocIAIAABiIXJpgAgAAL6UVnakAQAAAAAAAC0AAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1BpcGVzL1dpbmRvd3NQaXBlcy5waHA0DQAAYiFyaTQNAAALVsTgpAEAAAAAAAAiAAAAdmVuZG9yL3N5bWZvbnkvcHJvY2Vzcy9Qcm9jZXNzLnBocEJoAABiIXJpQmgAAARIIs6kAQAAAAAAACcAAAB2ZW5kb3Ivc3ltZm9ueS9wcm9jZXNzL1Byb2Nlc3NVdGlscy5waHAUAwAAYiFyaRQDAADTD1jspAEAAAAAAAA3AAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvQXR0cmlidXRlL1JlcXVpcmVkLnBocKgAAABiIXJpqAAAAHhq64SkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9BdHRyaWJ1dGUvU3Vic2NyaWJlZFNlcnZpY2UucGhwCgEAAGIhcmkKAQAAMUmuVKQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL0xJQ0VOU0UuBAAAYiFyaS4EAACmuKlYpAEAAAAAAAAzAAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvUmVzZXRJbnRlcmZhY2UucGhweQAAAGIhcml5AAAAsLdq5aQBAAAAAAAAOAAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VMb2NhdG9yVHJhaXQucGhw4wkAAGIhcmnjCQAAIo816aQBAAAAAAAAPQAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VQcm92aWRlckludGVyZmFjZS5waHDeAAAAYiFyad4AAAD6UuhrpAEAAAAAAAA/AAAAdmVuZG9yL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMvU2VydmljZVN1YnNjcmliZXJJbnRlcmZhY2UucGhwswAAAGIhcmmzAAAAl/ZkDKQBAAAAAAAAOwAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1NlcnZpY2VTdWJzY3JpYmVyVHJhaXQucGhwYAoAAGIhcmlgCgAAyDMIdaQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL1Rlc3QvU2VydmljZUxvY2F0b3JUZXN0LnBocLIAAABiIXJpsgAAAG35qtSkAQAAAAAAAEAAAAB2ZW5kb3Ivc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy9UZXN0L1NlcnZpY2VMb2NhdG9yVGVzdENhc2UucGhwnAgAAGIhcmmcCAAAxZqMvaQBAAAAAAAAKAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9BYnN0cmFjdFN0cmluZy5waHAqNAAAYiFyaSo0AACwSg37pAEAAAAAAAAvAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0Fic3RyYWN0VW5pY29kZVN0cmluZy5waHC4UgAAYiFyabhSAAACI7cHpAEAAAAAAAAkAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0J5dGVTdHJpbmcucGhw/ysAAGIhcmn/KwAAS6vTXqQBAAAAAAAAKQAAAHZlbmRvci9zeW1mb255L3N0cmluZy9Db2RlUG9pbnRTdHJpbmcucGhw9RcAAGIhcmn1FwAAQsKPA6QBAAAAAAAANgAAAHZlbmRvci9zeW1mb255L3N0cmluZy9FeGNlcHRpb24vRXhjZXB0aW9uSW50ZXJmYWNlLnBocHMAAABiIXJpcwAAAHFIVpGkAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvRXhjZXB0aW9uL0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbi5waHCiAAAAYiFyaaIAAAAfBaVBpAEAAAAAAAA0AAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0V4Y2VwdGlvbi9SdW50aW1lRXhjZXB0aW9uLnBocJIAAABiIXJpkgAAAHWREmekAQAAAAAAADQAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvSW5mbGVjdG9yL0VuZ2xpc2hJbmZsZWN0b3IucGhwShoAAGIhcmlKGgAACLPYM6QBAAAAAAAAMwAAAHZlbmRvci9zeW1mb255L3N0cmluZy9JbmZsZWN0b3IvRnJlbmNoSW5mbGVjdG9yLnBocIgKAABiIXJpiAoAALeKEkikAQAAAAAAADYAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvSW5mbGVjdG9yL0luZmxlY3RvckludGVyZmFjZS5waHDXAAAAYiFyadcAAABoRKMXpAEAAAAAAAAdAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0xJQ0VOU0UuBAAAYiFyaS4EAACaP/R3pAEAAAAAAAAkAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL0xhenlTdHJpbmcucGhwQwwAAGIhcmlDDAAAp+GsYqQBAAAAAAAAPAAAAHZlbmRvci9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZGF0YS93Y3N3aWR0aF90YWJsZV93aWRlLnBocCQWAABiIXJpJBYAAKXAlkukAQAAAAAAADwAAAB2ZW5kb3Ivc3ltZm9ueS9zdHJpbmcvUmVzb3VyY2VzL2RhdGEvd2Nzd2lkdGhfdGFibGVfemVyby5waHDUGQAAYiFyadQZAADSA/4kpAEAAAAAAAAtAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9mdW5jdGlvbnMucGhwBgIAAGIhcmkGAgAAY9qqIqQBAAAAAAAALgAAAHZlbmRvci9zeW1mb255L3N0cmluZy9TbHVnZ2VyL0FzY2lpU2x1Z2dlci5waHDsDwAAYiFyaewPAAB9Jg7KpAEAAAAAAAAyAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL1NsdWdnZXIvU2x1Z2dlckludGVyZmFjZS5waHAHAQAAYiFyaQcBAACPa/GopAEAAAAAAAAnAAAAdmVuZG9yL3N5bWZvbnkvc3RyaW5nL1VuaWNvZGVTdHJpbmcucGhw7SUAAGIhcmntJQAA/cGYNaQBAAAAAAAADAAAAGJpbi9jb21wb3NlclIQAABiIXJpUhAAAKyd+COkAQAAAAAAAAcAAABMSUNFTlNFLgQAAGIhcmkuBAAAINUIA6QBAAAAAAAAPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXENvbmZpZzsKCgoKCgpjbGFzcyBBdWRpdENvbmZpZwp7CgoKCnB1YmxpYyAkYXVkaXQ7CgoKCgpwdWJsaWMgJGF1ZGl0Rm9ybWF0OwoKCgoKcHVibGljICRhdWRpdEFiYW5kb25lZDsKCgoKCnB1YmxpYyAkYmxvY2tJbnNlY3VyZTsKCgoKCnB1YmxpYyAkYmxvY2tBYmFuZG9uZWQ7CgoKCgpwdWJsaWMgJGlnbm9yZVVucmVhY2hhYmxlOwoKCgoKcHVibGljICRpZ25vcmVMaXN0Rm9yQXVkaXQ7CgoKCgpwdWJsaWMgJGlnbm9yZUxpc3RGb3JCbG9ja2luZzsKCgoKCnB1YmxpYyAkaWdub3JlU2V2ZXJpdHlGb3JBdWRpdDsKCgoKCnB1YmxpYyAkaWdub3JlU2V2ZXJpdHlGb3JCbG9ja2luZzsKCgoKCnB1YmxpYyAkaWdub3JlQWJhbmRvbmVkRm9yQXVkaXQ7CgoKCgpwdWJsaWMgJGlnbm9yZUFiYW5kb25lZEZvckJsb2NraW5nOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChib29sICRhdWRpdCwgc3RyaW5nICRhdWRpdEZvcm1hdCwgc3RyaW5nICRhdWRpdEFiYW5kb25lZCwgYm9vbCAkYmxvY2tJbnNlY3VyZSwgYm9vbCAkYmxvY2tBYmFuZG9uZWQsIGJvb2wgJGlnbm9yZVVucmVhY2hhYmxlLCBhcnJheSAkaWdub3JlTGlzdEZvckF1ZGl0LCBhcnJheSAkaWdub3JlTGlzdEZvckJsb2NraW5nLCBhcnJheSAkaWdub3JlU2V2ZXJpdHlGb3JBdWRpdCwgYXJyYXkgJGlnbm9yZVNldmVyaXR5Rm9yQmxvY2tpbmcsIGFycmF5ICRpZ25vcmVBYmFuZG9uZWRGb3JBdWRpdCwgYXJyYXkgJGlnbm9yZUFiYW5kb25lZEZvckJsb2NraW5nKQp7CiR0aGlzLT5hdWRpdCA9ICRhdWRpdDsKJHRoaXMtPmF1ZGl0Rm9ybWF0ID0gJGF1ZGl0Rm9ybWF0OwokdGhpcy0+YXVkaXRBYmFuZG9uZWQgPSAkYXVkaXRBYmFuZG9uZWQ7CiR0aGlzLT5ibG9ja0luc2VjdXJlID0gJGJsb2NrSW5zZWN1cmU7CiR0aGlzLT5ibG9ja0FiYW5kb25lZCA9ICRibG9ja0FiYW5kb25lZDsKJHRoaXMtPmlnbm9yZVVucmVhY2hhYmxlID0gJGlnbm9yZVVucmVhY2hhYmxlOwokdGhpcy0+aWdub3JlTGlzdEZvckF1ZGl0ID0gJGlnbm9yZUxpc3RGb3JBdWRpdDsKJHRoaXMtPmlnbm9yZUxpc3RGb3JCbG9ja2luZyA9ICRpZ25vcmVMaXN0Rm9yQmxvY2tpbmc7CiR0aGlzLT5pZ25vcmVTZXZlcml0eUZvckF1ZGl0ID0gJGlnbm9yZVNldmVyaXR5Rm9yQXVkaXQ7CiR0aGlzLT5pZ25vcmVTZXZlcml0eUZvckJsb2NraW5nID0gJGlnbm9yZVNldmVyaXR5Rm9yQmxvY2tpbmc7CiR0aGlzLT5pZ25vcmVBYmFuZG9uZWRGb3JBdWRpdCA9ICRpZ25vcmVBYmFuZG9uZWRGb3JBdWRpdDsKJHRoaXMtPmlnbm9yZUFiYW5kb25lZEZvckJsb2NraW5nID0gJGlnbm9yZUFiYW5kb25lZEZvckJsb2NraW5nOwp9CgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBwYXJzZUlnbm9yZVdpdGhBcHBseShhcnJheSAkY29uZmlnKTogYXJyYXkKewokZm9yQXVkaXQgPSBbXTsKJGZvckJsb2NrID0gW107Cgpmb3JlYWNoICgkY29uZmlnIGFzICRrZXkgPT4gJHZhbHVlKSB7CgppZiAoaXNfaW50KCRrZXkpICYmIGlzX3N0cmluZygkdmFsdWUpKSB7CiRpZCA9ICR2YWx1ZTsKJGFwcGx5ID0gJ2FsbCc7CiRyZWFzb24gPSBudWxsOwp9CgplbHNlaWYgKGlzX3N0cmluZygkdmFsdWUpKSB7CiRpZCA9ICRrZXk7CiRhcHBseSA9ICdhbGwnOwokcmVhc29uID0gJHZhbHVlOwp9CgplbHNlaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKJGlkID0gJGtleTsKJGFwcGx5ID0gJHZhbHVlWydhcHBseSddID8/ICdhbGwnOwokcmVhc29uID0gJHZhbHVlWydyZWFzb24nXSA/PyBudWxsOwoKCmlmICghaW5fYXJyYXkoJGFwcGx5LCBbJ2F1ZGl0JywgJ2Jsb2NrJywgJ2FsbCddLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKIkludmFsaWQgJ2FwcGx5JyB2YWx1ZSBmb3IgJ3skaWR9JzogeyRhcHBseX0uIEV4cGVjdGVkICdhdWRpdCcsICdibG9jaycsIG9yICdhbGwnLiIKKTsKfQp9CgplbHNlaWYgKCR2YWx1ZSA9PT0gbnVsbCkgewokaWQgPSAka2V5OwokYXBwbHkgPSAnYWxsJzsKJHJlYXNvbiA9IG51bGw7Cn0KZWxzZSB7CmNvbnRpbnVlOwp9CgoKaWYgKCRhcHBseSA9PT0gJ2F1ZGl0JyB8fCAkYXBwbHkgPT09ICdhbGwnKSB7CiRmb3JBdWRpdFskaWRdID0gJHJlYXNvbjsKfQppZiAoJGFwcGx5ID09PSAnYmxvY2snIHx8ICRhcHBseSA9PT0gJ2FsbCcpIHsKJGZvckJsb2NrWyRpZF0gPSAkcmVhc29uOwp9Cn0KCnJldHVybiBbCidhdWRpdCcgPT4gJGZvckF1ZGl0LAonYmxvY2snID0+ICRmb3JCbG9jaywKXTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tQ29uZmlnKENvbmZpZyAkY29uZmlnLCBib29sICRhdWRpdCA9IHRydWUsIHN0cmluZyAkYXVkaXRGb3JtYXQgPSBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSk6IHNlbGYKewokYXVkaXRDb25maWcgPSAkY29uZmlnLT5nZXQoJ2F1ZGl0Jyk7CgoKJGlnbm9yZUxpc3RQYXJzZWQgPSBzZWxmOjpwYXJzZUlnbm9yZVdpdGhBcHBseSgkYXVkaXRDb25maWdbJ2lnbm9yZSddID8/IFtdKTsKJGlnbm9yZUFiYW5kb25lZFBhcnNlZCA9IHNlbGY6OnBhcnNlSWdub3JlV2l0aEFwcGx5KCRhdWRpdENvbmZpZ1snaWdub3JlLWFiYW5kb25lZCddID8/IFtdKTsKJGlnbm9yZVNldmVyaXR5UGFyc2VkID0gc2VsZjo6cGFyc2VJZ25vcmVXaXRoQXBwbHkoJGF1ZGl0Q29uZmlnWydpZ25vcmUtc2V2ZXJpdHknXSA/PyBbXSk7CgpyZXR1cm4gbmV3IHNlbGYoCiRhdWRpdCwKJGF1ZGl0Rm9ybWF0LAokYXVkaXRDb25maWdbJ2FiYW5kb25lZCddID8/IEF1ZGl0b3I6OkFCQU5ET05FRF9GQUlMLAooYm9vbCkgKCRhdWRpdENvbmZpZ1snYmxvY2staW5zZWN1cmUnXSA/PyB0cnVlKSwKKGJvb2wpICgkYXVkaXRDb25maWdbJ2Jsb2NrLWFiYW5kb25lZCddID8/IGZhbHNlKSwKKGJvb2wpICgkYXVkaXRDb25maWdbJ2lnbm9yZS11bnJlYWNoYWJsZSddID8/IGZhbHNlKSwKJGlnbm9yZUxpc3RQYXJzZWRbJ2F1ZGl0J10sCiRpZ25vcmVMaXN0UGFyc2VkWydibG9jayddLAokaWdub3JlU2V2ZXJpdHlQYXJzZWRbJ2F1ZGl0J10sCiRpZ25vcmVTZXZlcml0eVBhcnNlZFsnYmxvY2snXSwKJGlnbm9yZUFiYW5kb25lZFBhcnNlZFsnYXVkaXQnXSwKJGlnbm9yZUFiYW5kb25lZFBhcnNlZFsnYmxvY2snXQopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXElPXENvbnNvbGVJTzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZUluZm87CnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgpjbGFzcyBBdWRpdG9yCnsKcHVibGljIGNvbnN0IEZPUk1BVF9UQUJMRSA9ICd0YWJsZSc7CgpwdWJsaWMgY29uc3QgRk9STUFUX1BMQUlOID0gJ3BsYWluJzsKCnB1YmxpYyBjb25zdCBGT1JNQVRfSlNPTiA9ICdqc29uJzsKCnB1YmxpYyBjb25zdCBGT1JNQVRfU1VNTUFSWSA9ICdzdW1tYXJ5JzsKCnB1YmxpYyBjb25zdCBGT1JNQVRTID0gWwpzZWxmOjpGT1JNQVRfVEFCTEUsCnNlbGY6OkZPUk1BVF9QTEFJTiwKc2VsZjo6Rk9STUFUX0pTT04sCnNlbGY6OkZPUk1BVF9TVU1NQVJZLApdOwoKcHVibGljIGNvbnN0IEFCQU5ET05FRF9JR05PUkUgPSAnaWdub3JlJzsKcHVibGljIGNvbnN0IEFCQU5ET05FRF9SRVBPUlQgPSAncmVwb3J0JzsKcHVibGljIGNvbnN0IEFCQU5ET05FRF9GQUlMID0gJ2ZhaWwnOwoKCnB1YmxpYyBjb25zdCBBQkFORE9ORURTID0gWwpzZWxmOjpBQkFORE9ORURfSUdOT1JFLApzZWxmOjpBQkFORE9ORURfUkVQT1JULApzZWxmOjpBQkFORE9ORURfRkFJTCwKXTsKCgpwdWJsaWMgY29uc3QgU1RBVFVTX09LID0gMDsKcHVibGljIGNvbnN0IFNUQVRVU19WVUxORVJBQkxFID0gMTsKcHVibGljIGNvbnN0IFNUQVRVU19BQkFORE9ORUQgPSAyOwoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1ZGl0KElPSW50ZXJmYWNlICRpbywgUmVwb3NpdG9yeVNldCAkcmVwb1NldCwgYXJyYXkgJHBhY2thZ2VzLCBzdHJpbmcgJGZvcm1hdCwgYm9vbCAkd2FybmluZ09ubHkgPSB0cnVlLCBhcnJheSAkaWdub3JlTGlzdCA9IFtdLCBzdHJpbmcgJGFiYW5kb25lZCA9IHNlbGY6OkFCQU5ET05FRF9GQUlMLCBhcnJheSAkaWdub3JlZFNldmVyaXRpZXMgPSBbXSwgYm9vbCAkaWdub3JlVW5yZWFjaGFibGUgPSBmYWxzZSwgYXJyYXkgJGlnbm9yZUFiYW5kb25lZCA9IFtdKTogaW50CnsKJHJlc3VsdCA9ICRyZXBvU2V0LT5nZXRNYXRjaGluZ1NlY3VyaXR5QWR2aXNvcmllcygkcGFja2FnZXMsICRmb3JtYXQgPT09IHNlbGY6OkZPUk1BVF9TVU1NQVJZLCAkaWdub3JlVW5yZWFjaGFibGUpOwokYWxsQWR2aXNvcmllcyA9ICRyZXN1bHRbJ2Fkdmlzb3JpZXMnXTsKJHVucmVhY2hhYmxlUmVwb3MgPSAkcmVzdWx0Wyd1bnJlYWNoYWJsZVJlcG9zJ107CgoKCmlmICgkZm9ybWF0ID09PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSAmJiAkdGhpcy0+bmVlZHNDb21wbGV0ZUFkdmlzb3J5TG9hZCgkYWxsQWR2aXNvcmllcywgJGlnbm9yZUxpc3QpKSB7CiRyZXN1bHQgPSAkcmVwb1NldC0+Z2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VzLCBmYWxzZSwgJGlnbm9yZVVucmVhY2hhYmxlKTsKJGFsbEFkdmlzb3JpZXMgPSAkcmVzdWx0WydhZHZpc29yaWVzJ107CiR1bnJlYWNoYWJsZVJlcG9zID0gYXJyYXlfbWVyZ2UoJHVucmVhY2hhYmxlUmVwb3MsICRyZXN1bHRbJ3VucmVhY2hhYmxlUmVwb3MnXSk7Cn0KWydhZHZpc29yaWVzJyA9PiAkYWR2aXNvcmllcywgJ2lnbm9yZWRBZHZpc29yaWVzJyA9PiAkaWdub3JlZEFkdmlzb3JpZXNdID0gJHRoaXMtPnByb2Nlc3NBZHZpc29yaWVzKCRhbGxBZHZpc29yaWVzLCAkaWdub3JlTGlzdCwgJGlnbm9yZWRTZXZlcml0aWVzKTsKCiRhYmFuZG9uZWRDb3VudCA9IDA7CiRhZmZlY3RlZFBhY2thZ2VzQ291bnQgPSBjb3VudCgkYWR2aXNvcmllcyk7CmlmICgkYWJhbmRvbmVkID09PSBzZWxmOjpBQkFORE9ORURfSUdOT1JFKSB7CiRhYmFuZG9uZWRQYWNrYWdlcyA9IFtdOwp9IGVsc2UgewokYWJhbmRvbmVkUGFja2FnZXMgPSAkdGhpcy0+ZmlsdGVyQWJhbmRvbmVkUGFja2FnZXMoJHBhY2thZ2VzLCAkaWdub3JlQWJhbmRvbmVkKTsKaWYgKCRhYmFuZG9uZWQgPT09IHNlbGY6OkFCQU5ET05FRF9GQUlMKSB7CiRhYmFuZG9uZWRDb3VudCA9IGNvdW50KCRhYmFuZG9uZWRQYWNrYWdlcyk7Cn0KfQoKJGF1ZGl0Qml0bWFzayA9ICR0aGlzLT5jYWxjdWxhdGVCaXRtYXNrKDAgPCAkYWZmZWN0ZWRQYWNrYWdlc0NvdW50LCAwIDwgJGFiYW5kb25lZENvdW50KTsKCmlmIChzZWxmOjpGT1JNQVRfSlNPTiA9PT0gJGZvcm1hdCkgewokanNvbiA9IFsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXNdOwppZiAoJGlnbm9yZWRBZHZpc29yaWVzICE9PSBbXSkgewokanNvblsnaWdub3JlZC1hZHZpc29yaWVzJ10gPSAkaWdub3JlZEFkdmlzb3JpZXM7Cn0KaWYgKCR1bnJlYWNoYWJsZVJlcG9zICE9PSBbXSkgewokanNvblsndW5yZWFjaGFibGUtcmVwb3NpdG9yaWVzJ10gPSAkdW5yZWFjaGFibGVSZXBvczsKfQokanNvblsnYWJhbmRvbmVkJ10gPSBhcnJheV9yZWR1Y2UoJGFiYW5kb25lZFBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRjYXJyeSwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkgewokY2FycnlbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV0gPSAkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk7CgpyZXR1cm4gJGNhcnJ5Owp9LCBbXSk7CgokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJGpzb24pKTsKCnJldHVybiAkYXVkaXRCaXRtYXNrOwp9CgokZXJyb3JPcldhcm4gPSAkd2FybmluZ09ubHkgPyAnd2FybmluZycgOiAnZXJyb3InOwppZiAoJGFmZmVjdGVkUGFja2FnZXNDb3VudCA+IDAgfHwgY291bnQoJGlnbm9yZWRBZHZpc29yaWVzKSA+IDApIHsKJHBhc3NlcyA9IFsKWyRpZ25vcmVkQWR2aXNvcmllcywgIjxpbmZvPkZvdW5kICVkIGlnbm9yZWQgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBhZHZpc29yJXMgYWZmZWN0aW5nICVkIHBhY2thZ2UlcyVzPC9pbmZvPiJdLApbJGFkdmlzb3JpZXMsICI8JGVycm9yT3JXYXJuPkZvdW5kICVkIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHkgYWR2aXNvciVzIGFmZmVjdGluZyAlZCBwYWNrYWdlJXMlczwvJGVycm9yT3JXYXJuPiJdLApdOwpmb3JlYWNoICgkcGFzc2VzIGFzIFskYWR2aXNvcmllc1RvT3V0cHV0LCAkbWVzc2FnZV0pIHsKWyRwa2dDb3VudCwgJHRvdGFsQWR2aXNvcnlDb3VudF0gPSAkdGhpcy0+Y291bnRBZHZpc29yaWVzKCRhZHZpc29yaWVzVG9PdXRwdXQpOwppZiAoJHBrZ0NvdW50ID4gMCkgewokcGx1cmFsaXR5ID0gJHRvdGFsQWR2aXNvcnlDb3VudCA9PT0gMSA/ICd5JyA6ICdpZXMnOwokcGtnUGx1cmFsaXR5ID0gJHBrZ0NvdW50ID09PSAxID8gJycgOiAncyc7CiRwdW5jdHVhdGlvbiA9ICRmb3JtYXQgPT09ICdzdW1tYXJ5JyA/ICcuJyA6ICc6JzsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJG1lc3NhZ2UsICR0b3RhbEFkdmlzb3J5Q291bnQsICRwbHVyYWxpdHksICRwa2dDb3VudCwgJHBrZ1BsdXJhbGl0eSwgJHB1bmN0dWF0aW9uKSk7CiR0aGlzLT5vdXRwdXRBZHZpc29yaWVzKCRpbywgJGFkdmlzb3JpZXNUb091dHB1dCwgJGZvcm1hdCk7Cn0KfQoKaWYgKCRmb3JtYXQgPT09IHNlbGY6OkZPUk1BVF9TVU1NQVJZKSB7CiRpby0+d3JpdGVFcnJvcignUnVuICJjb21wb3NlciBhdWRpdCIgZm9yIGEgZnVsbCBsaXN0IG9mIGFkdmlzb3JpZXMuJyk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5ObyBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFkdmlzb3JpZXMgZm91bmQuPC9pbmZvPicpOwp9CgppZiAoY291bnQoJHVucmVhY2hhYmxlUmVwb3MpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSBmb2xsb3dpbmcgcmVwb3NpdG9yaWVzIHdlcmUgdW5yZWFjaGFibGU6PC93YXJuaW5nPicpOwpmb3JlYWNoICgkdW5yZWFjaGFibGVSZXBvcyBhcyAkcmVwbykgewokaW8tPndyaXRlRXJyb3IoJyAgLSAnIC4gJHJlcG8pOwp9Cn0KCmlmIChjb3VudCgkYWJhbmRvbmVkUGFja2FnZXMpID4gMCAmJiAkZm9ybWF0ICE9PSBzZWxmOjpGT1JNQVRfU1VNTUFSWSkgewokdGhpcy0+b3V0cHV0QWJhbmRvbmVkUGFja2FnZXMoJGlvLCAkYWJhbmRvbmVkUGFja2FnZXMsICRmb3JtYXQpOwp9CgpyZXR1cm4gJGF1ZGl0Qml0bWFzazsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbmVlZHNDb21wbGV0ZUFkdmlzb3J5TG9hZChhcnJheSAkYWR2aXNvcmllcywgYXJyYXkgJGlnbm9yZUxpc3QpOiBib29sCnsKaWYgKFxjb3VudCgkYWR2aXNvcmllcykgPT09IDApIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKGFycmF5X2FsbCgkYWR2aXNvcmllcywgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkcGtnQWR2aXNvcmllcykgewpyZXR1cm4gYXJyYXlfYWxsKCRwa2dBZHZpc29yaWVzLCBzdGF0aWMgZnVuY3Rpb24gKCRhZHZpc29yeSkgeyByZXR1cm4gJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeTsgfSk7Cn0pKSB7CnJldHVybiBmYWxzZTsKfQoKJGlnbm9yZWRJZHMgPSBhcnJheV9rZXlzKCRpZ25vcmVMaXN0KTsKCnJldHVybiBhcnJheV9hbnkoJGlnbm9yZWRJZHMsIHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRpZCkgewpyZXR1cm4gIXN0cl9zdGFydHNfd2l0aCgkaWQsICdQS1NBLScpOwp9KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsdGVyQWJhbmRvbmVkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VzLCBhcnJheSAkaWdub3JlQWJhbmRvbmVkKTogYXJyYXkKewokZmlsdGVyID0gbnVsbDsKaWYgKFxjb3VudCgkaWdub3JlQWJhbmRvbmVkKSAhPT0gMCkgewokZmlsdGVyID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKGFycmF5X2tleXMoJGlnbm9yZUFiYW5kb25lZCkpOwp9CgpyZXR1cm4gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwa2cpIHVzZSAoJGZpbHRlcik6IGJvb2wgewpyZXR1cm4gJHBrZyBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkcGtnLT5pc0FiYW5kb25lZCgpICYmICgkZmlsdGVyID09PSBudWxsIHx8ICFQcmVnOjppc01hdGNoKCRmaWx0ZXIsICRwa2ctPmdldE5hbWUoKSkpOwp9KTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NBZHZpc29yaWVzKGFycmF5ICRhbGxBZHZpc29yaWVzLCBhcnJheSAkaWdub3JlTGlzdCwgYXJyYXkgJGlnbm9yZWRTZXZlcml0aWVzKTogYXJyYXkKewppZiAoJGlnbm9yZUxpc3QgPT09IFtdICYmICRpZ25vcmVkU2V2ZXJpdGllcyA9PT0gW10pIHsKcmV0dXJuIFsnYWR2aXNvcmllcycgPT4gJGFsbEFkdmlzb3JpZXMsICdpZ25vcmVkQWR2aXNvcmllcycgPT4gW11dOwp9CgokYWR2aXNvcmllcyA9IFtdOwokaWdub3JlZCA9IFtdOwokaWdub3JlUmVhc29uID0gbnVsbDsKCmZvcmVhY2ggKCRhbGxBZHZpc29yaWVzIGFzICRwYWNrYWdlID0+ICRwa2dBZHZpc29yaWVzKSB7CmZvcmVhY2ggKCRwa2dBZHZpc29yaWVzIGFzICRhZHZpc29yeSkgewokaXNBY3RpdmUgPSB0cnVlOwoKaWYgKGFycmF5X2tleV9leGlzdHMoJHBhY2thZ2UsICRpZ25vcmVMaXN0KSkgewokaXNBY3RpdmUgPSBmYWxzZTsKJGlnbm9yZVJlYXNvbiA9ICRpZ25vcmVMaXN0WyRwYWNrYWdlXSA/PyBudWxsOwp9CgppZiAoYXJyYXlfa2V5X2V4aXN0cygkYWR2aXNvcnktPmFkdmlzb3J5SWQsICRpZ25vcmVMaXN0KSkgewokaXNBY3RpdmUgPSBmYWxzZTsKJGlnbm9yZVJlYXNvbiA9ICRpZ25vcmVMaXN0WyRhZHZpc29yeS0+YWR2aXNvcnlJZF0gPz8gbnVsbDsKfQoKaWYgKCRhZHZpc29yeSBpbnN0YW5jZW9mIFNlY3VyaXR5QWR2aXNvcnkpIHsKaWYgKGlzX3N0cmluZygkYWR2aXNvcnktPnNldmVyaXR5KSAmJiBhcnJheV9rZXlfZXhpc3RzKCRhZHZpc29yeS0+c2V2ZXJpdHksICRpZ25vcmVkU2V2ZXJpdGllcykpIHsKJGlzQWN0aXZlID0gZmFsc2U7CiRpZ25vcmVSZWFzb24gPSAkaWdub3JlZFNldmVyaXRpZXNbJGFkdmlzb3J5LT5zZXZlcml0eV0gPz8gJGFkdmlzb3J5LT5zZXZlcml0eS4nIHNldmVyaXR5IGlzIGlnbm9yZWQnOwp9CgppZiAoaXNfc3RyaW5nKCRhZHZpc29yeS0+Y3ZlKSAmJiBhcnJheV9rZXlfZXhpc3RzKCRhZHZpc29yeS0+Y3ZlLCAkaWdub3JlTGlzdCkpIHsKJGlzQWN0aXZlID0gZmFsc2U7CiRpZ25vcmVSZWFzb24gPSAkaWdub3JlTGlzdFskYWR2aXNvcnktPmN2ZV0gPz8gbnVsbDsKfQoKZm9yZWFjaCAoJGFkdmlzb3J5LT5zb3VyY2VzIGFzICRzb3VyY2UpIHsKaWYgKGFycmF5X2tleV9leGlzdHMoJHNvdXJjZVsncmVtb3RlSWQnXSwgJGlnbm9yZUxpc3QpKSB7CiRpc0FjdGl2ZSA9IGZhbHNlOwokaWdub3JlUmVhc29uID0gJGlnbm9yZUxpc3RbJHNvdXJjZVsncmVtb3RlSWQnXV0gPz8gbnVsbDsKYnJlYWs7Cn0KfQp9CgppZiAoJGlzQWN0aXZlKSB7CiRhZHZpc29yaWVzWyRwYWNrYWdlXVtdID0gJGFkdmlzb3J5Owpjb250aW51ZTsKfQoKCgppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeSkgewokYWR2aXNvcnkgPSAkYWR2aXNvcnktPnRvSWdub3JlZEFkdmlzb3J5KCRpZ25vcmVSZWFzb24pOwp9CgokaWdub3JlZFskcGFja2FnZV1bXSA9ICRhZHZpc29yeTsKfQp9CgpyZXR1cm4gWydhZHZpc29yaWVzJyA9PiAkYWR2aXNvcmllcywgJ2lnbm9yZWRBZHZpc29yaWVzJyA9PiAkaWdub3JlZF07Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvdW50QWR2aXNvcmllcyhhcnJheSAkYWR2aXNvcmllcyk6IGFycmF5CnsKJGNvdW50ID0gMDsKZm9yZWFjaCAoJGFkdmlzb3JpZXMgYXMgJHBhY2thZ2VBZHZpc29yaWVzKSB7CiRjb3VudCArPSBjb3VudCgkcGFja2FnZUFkdmlzb3JpZXMpOwp9CgpyZXR1cm4gW2NvdW50KCRhZHZpc29yaWVzKSwgJGNvdW50XTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0QWR2aXNvcmllcyhJT0ludGVyZmFjZSAkaW8sIGFycmF5ICRhZHZpc29yaWVzLCBzdHJpbmcgJGZvcm1hdCk6IHZvaWQKewpzd2l0Y2ggKCRmb3JtYXQpIHsKY2FzZSBzZWxmOjpGT1JNQVRfVEFCTEU6CmlmICghKCRpbyBpbnN0YW5jZW9mIENvbnNvbGVJTykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ2Fubm90IHVzZSB0YWJsZSBmb3JtYXQgd2l0aCAnIC4gZ2V0X2NsYXNzKCRpbykpOwp9CiR0aGlzLT5vdXRwdXRBZHZpc29yaWVzVGFibGUoJGlvLCAkYWR2aXNvcmllcyk7CgpyZXR1cm47CmNhc2Ugc2VsZjo6Rk9STUFUX1BMQUlOOgokdGhpcy0+b3V0cHV0QWR2aXNvcmllc1BsYWluKCRpbywgJGFkdmlzb3JpZXMpOwoKcmV0dXJuOwpjYXNlIHNlbGY6OkZPUk1BVF9TVU1NQVJZOgoKcmV0dXJuOwpkZWZhdWx0Ogp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGZvcm1hdCAiJy4kZm9ybWF0LiciLicpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gb3V0cHV0QWR2aXNvcmllc1RhYmxlKENvbnNvbGVJTyAkaW8sIGFycmF5ICRhZHZpc29yaWVzKTogdm9pZAp7CmZvcmVhY2ggKCRhZHZpc29yaWVzIGFzICRwYWNrYWdlQWR2aXNvcmllcykgewpmb3JlYWNoICgkcGFja2FnZUFkdmlzb3JpZXMgYXMgJGFkdmlzb3J5KSB7CiRoZWFkZXJzID0gWwonUGFja2FnZScsCidTZXZlcml0eScsCidBZHZpc29yeSBJRCcsCidDVkUnLAonVGl0bGUnLAonVVJMJywKJ0FmZmVjdGVkIHZlcnNpb25zJywKJ1JlcG9ydGVkIGF0JywKXTsKJHJvdyA9IFsKJGFkdmlzb3J5LT5wYWNrYWdlTmFtZSwKJHRoaXMtPmdldFNldmVyaXR5KCRhZHZpc29yeSksCiR0aGlzLT5nZXRBZHZpc29yeUlkKCRhZHZpc29yeSksCiR0aGlzLT5nZXRDVkUoJGFkdmlzb3J5KSwKJGFkdmlzb3J5LT50aXRsZSwKJHRoaXMtPmdldFVSTCgkYWR2aXNvcnkpLAokYWR2aXNvcnktPmFmZmVjdGVkVmVyc2lvbnMtPmdldFByZXR0eVN0cmluZygpLAokYWR2aXNvcnktPnJlcG9ydGVkQXQtPmZvcm1hdChEQVRFX0FUT00pLApdOwppZiAoJGFkdmlzb3J5IGluc3RhbmNlb2YgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkpIHsKJGhlYWRlcnNbXSA9ICdJZ25vcmUgcmVhc29uJzsKJHJvd1tdID0gJGFkdmlzb3J5LT5pZ25vcmVSZWFzb24gPz8gJ05vbmUgc3BlY2lmaWVkJzsKfQokaW8tPmdldFRhYmxlKCkKLT5zZXRIb3Jpem9udGFsKCkKLT5zZXRIZWFkZXJzKCRoZWFkZXJzKQotPmFkZFJvdyhDb25zb2xlSU86OnNhbml0aXplKCRyb3cpKQotPnNldENvbHVtbldpZHRoKDEsIDgwKQotPnNldENvbHVtbk1heFdpZHRoKDEsIDgwKQotPnJlbmRlcigpOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRBZHZpc29yaWVzUGxhaW4oSU9JbnRlcmZhY2UgJGlvLCBhcnJheSAkYWR2aXNvcmllcyk6IHZvaWQKewokZXJyb3IgPSBbXTsKJGZpcnN0QWR2aXNvcnkgPSB0cnVlOwpmb3JlYWNoICgkYWR2aXNvcmllcyBhcyAkcGFja2FnZUFkdmlzb3JpZXMpIHsKZm9yZWFjaCAoJHBhY2thZ2VBZHZpc29yaWVzIGFzICRhZHZpc29yeSkgewppZiAoISRmaXJzdEFkdmlzb3J5KSB7CiRlcnJvcltdID0gJy0tLS0tLS0tJzsKfQokZXJyb3JbXSA9ICJQYWNrYWdlOiAiLiRhZHZpc29yeS0+cGFja2FnZU5hbWU7CiRlcnJvcltdID0gIlNldmVyaXR5OiAiLiR0aGlzLT5nZXRTZXZlcml0eSgkYWR2aXNvcnkpOwokZXJyb3JbXSA9ICJBZHZpc29yeSBJRDogIi4kdGhpcy0+Z2V0QWR2aXNvcnlJZCgkYWR2aXNvcnkpOwokZXJyb3JbXSA9ICJDVkU6ICIuJHRoaXMtPmdldENWRSgkYWR2aXNvcnkpOwokZXJyb3JbXSA9ICJUaXRsZTogIi5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkYWR2aXNvcnktPnRpdGxlKTsKJGVycm9yW10gPSAiVVJMOiAiLiR0aGlzLT5nZXRVUkwoJGFkdmlzb3J5KTsKJGVycm9yW10gPSAiQWZmZWN0ZWQgdmVyc2lvbnM6ICIuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGFkdmlzb3J5LT5hZmZlY3RlZFZlcnNpb25zLT5nZXRQcmV0dHlTdHJpbmcoKSk7CiRlcnJvcltdID0gIlJlcG9ydGVkIGF0OiAiLiRhZHZpc29yeS0+cmVwb3J0ZWRBdC0+Zm9ybWF0KERBVEVfQVRPTSk7CmlmICgkYWR2aXNvcnkgaW5zdGFuY2VvZiBJZ25vcmVkU2VjdXJpdHlBZHZpc29yeSkgewokZXJyb3JbXSA9ICJJZ25vcmUgcmVhc29uOiAiLigkYWR2aXNvcnktPmlnbm9yZVJlYXNvbiA/PyAnTm9uZSBzcGVjaWZpZWQnKTsKfQokZmlyc3RBZHZpc29yeSA9IGZhbHNlOwp9Cn0KJGlvLT53cml0ZUVycm9yKCRlcnJvcik7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dEFiYW5kb25lZFBhY2thZ2VzKElPSW50ZXJmYWNlICRpbywgYXJyYXkgJHBhY2thZ2VzLCBzdHJpbmcgJGZvcm1hdCk6IHZvaWQKewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGVycm9yPkZvdW5kICVkIGFiYW5kb25lZCBwYWNrYWdlJXM6PC9lcnJvcj4nLCBjb3VudCgkcGFja2FnZXMpLCBjb3VudCgkcGFja2FnZXMpID4gMSA/ICdzJyA6ICcnKSk7CgppZiAoJGZvcm1hdCA9PT0gc2VsZjo6Rk9STUFUX1BMQUlOKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGtnKSB7CiRyZXBsYWNlbWVudCA9ICRwa2ctPmdldFJlcGxhY2VtZW50UGFja2FnZSgpICE9PSBudWxsCj8gJ1VzZSAnLiRwa2ctPmdldFJlcGxhY2VtZW50UGFja2FnZSgpLicgaW5zdGVhZCcKOiAnTm8gcmVwbGFjZW1lbnQgd2FzIHN1Z2dlc3RlZCc7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKAonJXMgaXMgYWJhbmRvbmVkLiAlcy4nLAokdGhpcy0+Z2V0UGFja2FnZU5hbWVXaXRoTGluaygkcGtnKSwKJHJlcGxhY2VtZW50CikpOwp9CgpyZXR1cm47Cn0KCmlmICghKCRpbyBpbnN0YW5jZW9mIENvbnNvbGVJTykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQ2Fubm90IHVzZSB0YWJsZSBmb3JtYXQgd2l0aCAnIC4gZ2V0X2NsYXNzKCRpbykpOwp9CgokdGFibGUgPSAkaW8tPmdldFRhYmxlKCkKLT5zZXRIZWFkZXJzKFsnQWJhbmRvbmVkIFBhY2thZ2UnLCAnU3VnZ2VzdGVkIFJlcGxhY2VtZW50J10pCi0+c2V0Q29sdW1uV2lkdGgoMSwgODApCi0+c2V0Q29sdW1uTWF4V2lkdGgoMSwgODApOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwa2cpIHsKJHJlcGxhY2VtZW50ID0gJHBrZy0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgIT09IG51bGwgPyAkcGtnLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSA6ICdub25lJzsKJHRhYmxlLT5hZGRSb3coQ29uc29sZUlPOjpzYW5pdGl6ZShbJHRoaXMtPmdldFBhY2thZ2VOYW1lV2l0aExpbmsoJHBrZyksICRyZXBsYWNlbWVudF0pKTsKfQoKJHRhYmxlLT5yZW5kZXIoKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlTmFtZVdpdGhMaW5rKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewokcGFja2FnZVVybCA9IFBhY2thZ2VJbmZvOjpnZXRWaWV3U291cmNlT3JIb21lcGFnZVVybCgkcGFja2FnZSk7CgpyZXR1cm4gJHBhY2thZ2VVcmwgIT09IG51bGwgPyAnPGhyZWY9JyAuIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRwYWNrYWdlVXJsKSAuICc+JyAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkgLiAnPC8+JyA6ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2V2ZXJpdHkoU2VjdXJpdHlBZHZpc29yeSAkYWR2aXNvcnkpOiBzdHJpbmcKewppZiAoJGFkdmlzb3J5LT5zZXZlcml0eSA9PT0gbnVsbCkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkYWR2aXNvcnktPnNldmVyaXR5Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEFkdmlzb3J5SWQoU2VjdXJpdHlBZHZpc29yeSAkYWR2aXNvcnkpOiBzdHJpbmcKewppZiAoc3RyX3N0YXJ0c193aXRoKCRhZHZpc29yeS0+YWR2aXNvcnlJZCwgJ1BLU0EtJykpIHsKcmV0dXJuICc8aHJlZj1odHRwczovL3BhY2thZ2lzdC5vcmcvc2VjdXJpdHktYWR2aXNvcmllcy8nLiRhZHZpc29yeS0+YWR2aXNvcnlJZC4nPicuJGFkdmlzb3J5LT5hZHZpc29yeUlkLic8Lz4nOwp9CgpyZXR1cm4gJGFkdmlzb3J5LT5hZHZpc29yeUlkOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENWRShTZWN1cml0eUFkdmlzb3J5ICRhZHZpc29yeSk6IHN0cmluZwp7CmlmICgkYWR2aXNvcnktPmN2ZSA9PT0gbnVsbCkgewpyZXR1cm4gJ05PIENWRSc7Cn0KCnJldHVybiAnPGhyZWY9aHR0cHM6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT0nLiRhZHZpc29yeS0+Y3ZlLic+Jy4kYWR2aXNvcnktPmN2ZS4nPC8+JzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRVUkwoU2VjdXJpdHlBZHZpc29yeSAkYWR2aXNvcnkpOiBzdHJpbmcKewppZiAoJGFkdmlzb3J5LT5saW5rID09PSBudWxsKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+bGluaykuJz4nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRhZHZpc29yeS0+bGluaykuJzwvPic7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlQml0bWFzayhib29sICRoYXNWdWxuZXJhYmxlUGFja2FnZXMsIGJvb2wgJGhhc0FiYW5kb25lZFBhY2thZ2VzKTogaW50CnsKJGJpdG1hc2sgPSBzZWxmOjpTVEFUVVNfT0s7CgppZiAoJGhhc1Z1bG5lcmFibGVQYWNrYWdlcykgewokYml0bWFzayB8PSBzZWxmOjpTVEFUVVNfVlVMTkVSQUJMRTsKfQoKaWYgKCRoYXNBYmFuZG9uZWRQYWNrYWdlcykgewokYml0bWFzayB8PSBzZWxmOjpTVEFUVVNfQUJBTkRPTkVEOwp9CgpyZXR1cm4gJGJpdG1hc2s7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQWR2aXNvcnk7Cgp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIERhdGVUaW1lSW1tdXRhYmxlOwoKY2xhc3MgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkgZXh0ZW5kcyBTZWN1cml0eUFkdmlzb3J5CnsKCgoKCnB1YmxpYyAkaWdub3JlUmVhc29uOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkYWR2aXNvcnlJZCwgQ29uc3RyYWludEludGVyZmFjZSAkYWZmZWN0ZWRWZXJzaW9ucywgc3RyaW5nICR0aXRsZSwgYXJyYXkgJHNvdXJjZXMsIERhdGVUaW1lSW1tdXRhYmxlICRyZXBvcnRlZEF0LCA/c3RyaW5nICRjdmUgPSBudWxsLCA/c3RyaW5nICRsaW5rID0gbnVsbCwgP3N0cmluZyAkaWdub3JlUmVhc29uID0gbnVsbCwgP3N0cmluZyAkc2V2ZXJpdHkgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHBhY2thZ2VOYW1lLCAkYWR2aXNvcnlJZCwgJGFmZmVjdGVkVmVyc2lvbnMsICR0aXRsZSwgJHNvdXJjZXMsICRyZXBvcnRlZEF0LCAkY3ZlLCAkbGluaywgJHNldmVyaXR5KTsKCiR0aGlzLT5pZ25vcmVSZWFzb24gPSAkaWdub3JlUmVhc29uOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKQp7CiRkYXRhID0gcGFyZW50Ojpqc29uU2VyaWFsaXplKCk7CmlmICgkdGhpcy0+aWdub3JlUmVhc29uID09PSBudWxsKSB7CnVuc2V0KCRkYXRhWydpZ25vcmVSZWFzb24nXSk7Cn0KCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBZHZpc29yeTsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwp1c2UgSnNvblNlcmlhbGl6YWJsZTsKCmNsYXNzIFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5IGltcGxlbWVudHMgSnNvblNlcmlhbGl6YWJsZQp7CgoKCgpwdWJsaWMgJGFkdmlzb3J5SWQ7CgoKCgoKcHVibGljICRwYWNrYWdlTmFtZTsKCgoKCgpwdWJsaWMgJGFmZmVjdGVkVmVyc2lvbnM7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoc3RyaW5nICRwYWNrYWdlTmFtZSwgYXJyYXkgJGRhdGEsIFZlcnNpb25QYXJzZXIgJHBhcnNlcik6IHNlbGYKewp0cnkgewokY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGRhdGFbJ2FmZmVjdGVkVmVyc2lvbnMnXSk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKCnRyeSB7CiRhZmZlY3RlZFZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7KF5bPj08Xn5dKltcZC5dKykuKn0nLCAnJDEnLCAkZGF0YVsnYWZmZWN0ZWRWZXJzaW9ucyddKTsKJGNvbnN0cmFpbnQgPSAkcGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRhZmZlY3RlZFZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz09JywgJzAuMC4wLWludmFsaWQtdmVyc2lvbicpOwp9Cn0KCmlmIChpc3NldCgkZGF0YVsndGl0bGUnXSwgJGRhdGFbJ3NvdXJjZXMnXSwgJGRhdGFbJ3JlcG9ydGVkQXQnXSkpIHsKcmV0dXJuIG5ldyBTZWN1cml0eUFkdmlzb3J5KCRwYWNrYWdlTmFtZSwgJGRhdGFbJ2Fkdmlzb3J5SWQnXSwgJGNvbnN0cmFpbnQsICRkYXRhWyd0aXRsZSddLCAkZGF0YVsnc291cmNlcyddLCBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRkYXRhWydyZXBvcnRlZEF0J10sIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSksICRkYXRhWydjdmUnXSA/PyBudWxsLCAkZGF0YVsnbGluayddID8/IG51bGwsICRkYXRhWydzZXZlcml0eSddID8/IG51bGwpOwp9CgpyZXR1cm4gbmV3IHNlbGYoJHBhY2thZ2VOYW1lLCAkZGF0YVsnYWR2aXNvcnlJZCddLCAkY29uc3RyYWludCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJGFkdmlzb3J5SWQsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGFmZmVjdGVkVmVyc2lvbnMpCnsKJHRoaXMtPmFkdmlzb3J5SWQgPSAkYWR2aXNvcnlJZDsKJHRoaXMtPnBhY2thZ2VOYW1lID0gJHBhY2thZ2VOYW1lOwokdGhpcy0+YWZmZWN0ZWRWZXJzaW9ucyA9ICRhZmZlY3RlZFZlcnNpb25zOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKQp7CiRkYXRhID0gKGFycmF5KSAkdGhpczsKJGRhdGFbJ2FmZmVjdGVkVmVyc2lvbnMnXSA9ICRkYXRhWydhZmZlY3RlZFZlcnNpb25zJ10tPmdldFByZXR0eVN0cmluZygpOwoKcmV0dXJuICRkYXRhOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEFkdmlzb3J5OwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBEYXRlVGltZUltbXV0YWJsZTsKCmNsYXNzIFNlY3VyaXR5QWR2aXNvcnkgZXh0ZW5kcyBQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeQp7CgoKCgpwdWJsaWMgJHRpdGxlOwoKCgoKCnB1YmxpYyAkY3ZlOwoKCgoKCnB1YmxpYyAkbGluazsKCgoKCgpwdWJsaWMgJHJlcG9ydGVkQXQ7CgoKCgoKcHVibGljICRzb3VyY2VzOwoKCgoKCnB1YmxpYyAkc2V2ZXJpdHk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICRhZHZpc29yeUlkLCBDb25zdHJhaW50SW50ZXJmYWNlICRhZmZlY3RlZFZlcnNpb25zLCBzdHJpbmcgJHRpdGxlLCBhcnJheSAkc291cmNlcywgRGF0ZVRpbWVJbW11dGFibGUgJHJlcG9ydGVkQXQsID9zdHJpbmcgJGN2ZSA9IG51bGwsID9zdHJpbmcgJGxpbmsgPSBudWxsLCA/c3RyaW5nICRzZXZlcml0eSA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcGFja2FnZU5hbWUsICRhZHZpc29yeUlkLCAkYWZmZWN0ZWRWZXJzaW9ucyk7CgokdGhpcy0+dGl0bGUgPSAkdGl0bGU7CiR0aGlzLT5zb3VyY2VzID0gJHNvdXJjZXM7CiR0aGlzLT5yZXBvcnRlZEF0ID0gJHJlcG9ydGVkQXQ7CiR0aGlzLT5jdmUgPSAkY3ZlOwokdGhpcy0+bGluayA9ICRsaW5rOwokdGhpcy0+c2V2ZXJpdHkgPSAkc2V2ZXJpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0b0lnbm9yZWRBZHZpc29yeSg/c3RyaW5nICRpZ25vcmVSZWFzb24pOiBJZ25vcmVkU2VjdXJpdHlBZHZpc29yeQp7CnJldHVybiBuZXcgSWdub3JlZFNlY3VyaXR5QWR2aXNvcnkoCiR0aGlzLT5wYWNrYWdlTmFtZSwKJHRoaXMtPmFkdmlzb3J5SWQsCiR0aGlzLT5hZmZlY3RlZFZlcnNpb25zLAokdGhpcy0+dGl0bGUsCiR0aGlzLT5zb3VyY2VzLAokdGhpcy0+cmVwb3J0ZWRBdCwKJHRoaXMtPmN2ZSwKJHRoaXMtPmxpbmssCiRpZ25vcmVSZWFzb24sCiR0aGlzLT5zZXZlcml0eQopOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGpzb25TZXJpYWxpemUoKQp7CiRkYXRhID0gcGFyZW50Ojpqc29uU2VyaWFsaXplKCk7CiRkYXRhWydyZXBvcnRlZEF0J10gPSAkZGF0YVsncmVwb3J0ZWRBdCddLT5mb3JtYXQoREFURV9SRkMzMzM5KTsKCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCnVzZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxDbGFzc01hcDsKdXNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yXENsYXNzTWFwR2VuZXJhdG9yOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUFsbFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQm91bmQ7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZVNvcnRlcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvY2tlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKCgoKCgpjbGFzcyBBdXRvbG9hZEdlbmVyYXRvcgp7CgoKCnByaXZhdGUgJGV2ZW50RGlzcGF0Y2hlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZSA9IG51bGw7CgoKCgpwcml2YXRlICRjbGFzc01hcEF1dGhvcml0YXRpdmUgPSBmYWxzZTsKCgoKCnByaXZhdGUgJGFwY3UgPSBmYWxzZTsKCgoKCnByaXZhdGUgJGFwY3VQcmVmaXg7CgoKCgpwcml2YXRlICRkcnlSdW4gPSBmYWxzZTsKCgoKCnByaXZhdGUgJHJ1blNjcmlwdHMgPSBmYWxzZTsKCgoKCnByaXZhdGUgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoRXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsKQp7CiR0aGlzLT5ldmVudERpc3BhdGNoZXIgPSAkZXZlbnREaXNwYXRjaGVyOwokdGhpcy0+aW8gPSAkaW8gPz8gbmV3IE51bGxJTygpOwoKJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2TW9kZShib29sICRkZXZNb2RlID0gdHJ1ZSkKewokdGhpcy0+ZGV2TW9kZSA9ICRkZXZNb2RlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoYm9vbCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlKQp7CiR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgPSAkY2xhc3NNYXBBdXRob3JpdGF0aXZlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcGN1KGJvb2wgJGFwY3UsID9zdHJpbmcgJGFwY3VQcmVmaXggPSBudWxsKQp7CiR0aGlzLT5hcGN1ID0gJGFwY3U7CiR0aGlzLT5hcGN1UHJlZml4ID0gJGFwY3VQcmVmaXg7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJ1blNjcmlwdHMoYm9vbCAkcnVuU2NyaXB0cyA9IHRydWUpCnsKJHRoaXMtPnJ1blNjcmlwdHMgPSAkcnVuU2NyaXB0czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERyeVJ1bihib29sICRkcnlSdW4gPSB0cnVlKTogdm9pZAp7CiR0aGlzLT5kcnlSdW4gPSAkZHJ5UnVuOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWdub3JlUGxhdGZvcm1SZXF1aXJlbWVudHMoJGlnbm9yZVBsYXRmb3JtUmVxcykKewp0cmlnZ2VyX2Vycm9yKCdBdXRvbG9hZEdlbmVyYXRvcjo6c2V0SWdub3JlUGxhdGZvcm1SZXF1aXJlbWVudHMgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjIsIHVzZSBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKJHRoaXMtPnNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6OmZyb21Cb29sT3JMaXN0KCRpZ25vcmVQbGF0Zm9ybVJlcXMpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikKewokdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkdW1wKENvbmZpZyAkY29uZmlnLCBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG8sIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlciwgc3RyaW5nICR0YXJnZXREaXIsIGJvb2wgJHNjYW5Qc3JQYWNrYWdlcyA9IGZhbHNlLCA/c3RyaW5nICRzdWZmaXggPSBudWxsLCA/TG9ja2VyICRsb2NrZXIgPSBudWxsLCBib29sICRzdHJpY3RBbWJpZ3VvdXMgPSBmYWxzZSkKewppZiAoJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSkgewoKJHNjYW5Qc3JQYWNrYWdlcyA9IHRydWU7Cn0KCgppZiAobnVsbCA9PT0gJHRoaXMtPmRldk1vZGUpIHsKCiR0aGlzLT5kZXZNb2RlID0gZmFsc2U7CgokaW5zdGFsbGVkSnNvbiA9IG5ldyBKc29uRmlsZSgkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKS4nL2NvbXBvc2VyL2luc3RhbGxlZC5qc29uJyk7CmlmICgkaW5zdGFsbGVkSnNvbi0+ZXhpc3RzKCkpIHsKJGluc3RhbGxlZEpzb24gPSAkaW5zdGFsbGVkSnNvbi0+cmVhZCgpOwppZiAoaXNzZXQoJGluc3RhbGxlZEpzb25bJ2RldiddKSkgewokdGhpcy0+ZGV2TW9kZSA9ICRpbnN0YWxsZWRKc29uWydkZXYnXTsKfQp9Cn0KCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewoKaWYgKCFpc3NldCgkX1NFUlZFUlsnQ09NUE9TRVJfREVWX01PREUnXSkpIHsKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfREVWX01PREUnLCAkdGhpcy0+ZGV2TW9kZSA/ICcxJyA6ICcwJyk7Cn0KCiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UFJFX0FVVE9MT0FEX0RVTVAsICR0aGlzLT5kZXZNb2RlLCBbXSwgWwonb3B0aW1pemUnID0+ICRzY2FuUHNyUGFja2FnZXMsCl0pOwp9CgokY2xhc3NNYXBHZW5lcmF0b3IgPSBuZXcgQ2xhc3NNYXBHZW5lcmF0b3IoWydwaHAnLCAnaW5jJywgJ2hoJ10pOwokY2xhc3NNYXBHZW5lcmF0b3ItPmF2b2lkRHVwbGljYXRlU2NhbnMoKTsKCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSk7CgoKCiRiYXNlUGF0aCA9ICRmaWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKHJlYWxwYXRoKHJlYWxwYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSkpKTsKJHZlbmRvclBhdGggPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aChyZWFscGF0aChyZWFscGF0aCgkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSkpKTsKJHVzZUdsb2JhbEluY2x1ZGVQYXRoID0gJGNvbmZpZy0+Z2V0KCd1c2UtaW5jbHVkZS1wYXRoJyk7CiRwcmVwZW5kQXV0b2xvYWRlciA9ICRjb25maWctPmdldCgncHJlcGVuZC1hdXRvbG9hZGVyJykgPT09IGZhbHNlID8gJ2ZhbHNlJyA6ICd0cnVlJzsKJHRhcmdldERpciA9ICR2ZW5kb3JQYXRoLicvJy4kdGFyZ2V0RGlyOwokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0YXJnZXREaXIpOwoKJHZlbmRvclBhdGhDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkdmVuZG9yUGF0aCwgdHJ1ZSk7CiR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCR2ZW5kb3JQYXRoLCByZWFscGF0aCgkdGFyZ2V0RGlyKSwgdHJ1ZSk7CgokYXBwQmFzZURpckNvZGUgPSAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUoJHZlbmRvclBhdGgsICRiYXNlUGF0aCwgdHJ1ZSk7CiRhcHBCYXNlRGlyQ29kZSA9IHN0cl9yZXBsYWNlKCdfX0RJUl9fJywgJyR2ZW5kb3JEaXInLCAkYXBwQmFzZURpckNvZGUpOwoKJG5hbWVzcGFjZXNGaWxlID0gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9uYW1lc3BhY2VzLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAoKRU9GOwoKJHBzcjRGaWxlID0gPDw8RU9GCjw/cGhwCgovLyBhdXRvbG9hZF9wc3I0LnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAoKRU9GOwoKCiRkZXZQYWNrYWdlTmFtZXMgPSAkbG9jYWxSZXBvLT5nZXREZXZQYWNrYWdlTmFtZXMoKTsKJHBhY2thZ2VNYXAgPSAkdGhpcy0+YnVpbGRQYWNrYWdlTWFwKCRpbnN0YWxsYXRpb25NYW5hZ2VyLCAkcm9vdFBhY2thZ2UsICRsb2NhbFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCkpOwppZiAoJHRoaXMtPmRldk1vZGUpIHsKCiRmaWx0ZXJlZERldlBhY2thZ2VzID0gZmFsc2U7Cn0gZWxzZSB7CgokZmlsdGVyZWREZXZQYWNrYWdlcyA9ICRkZXZQYWNrYWdlTmFtZXMgPzogdHJ1ZTsKfQokYXV0b2xvYWRzID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzKCRwYWNrYWdlTWFwLCAkcm9vdFBhY2thZ2UsICRmaWx0ZXJlZERldlBhY2thZ2VzKTsKCgpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItMCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGhzKSB7CiRleHBvcnRlZFBhdGhzID0gW107CmZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewokZXhwb3J0ZWRQYXRoc1tdID0gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCk7Cn0KJGV4cG9ydGVkUHJlZml4ID0gdmFyX2V4cG9ydCgkbmFtZXNwYWNlLCB0cnVlKTsKJG5hbWVzcGFjZXNGaWxlIC49ICIgICAgJGV4cG9ydGVkUHJlZml4ID0+ICI7CiRuYW1lc3BhY2VzRmlsZSAuPSAiYXJyYXkoIi5pbXBsb2RlKCcsICcsICRleHBvcnRlZFBhdGhzKS4iKSxcbiI7Cn0KJG5hbWVzcGFjZXNGaWxlIC49ICIpO1xuIjsKCgpmb3JlYWNoICgkYXV0b2xvYWRzWydwc3ItNCddIGFzICRuYW1lc3BhY2UgPT4gJHBhdGhzKSB7CiRleHBvcnRlZFBhdGhzID0gW107CmZvcmVhY2ggKCRwYXRocyBhcyAkcGF0aCkgewokZXhwb3J0ZWRQYXRoc1tdID0gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCk7Cn0KJGV4cG9ydGVkUHJlZml4ID0gdmFyX2V4cG9ydCgkbmFtZXNwYWNlLCB0cnVlKTsKJHBzcjRGaWxlIC49ICIgICAgJGV4cG9ydGVkUHJlZml4ID0+ICI7CiRwc3I0RmlsZSAuPSAiYXJyYXkoIi5pbXBsb2RlKCcsICcsICRleHBvcnRlZFBhdGhzKS4iKSxcbiI7Cn0KJHBzcjRGaWxlIC49ICIpO1xuIjsKCgokdGFyZ2V0RGlyTG9hZGVyID0gbnVsbDsKJG1haW5BdXRvbG9hZCA9ICRyb290UGFja2FnZS0+Z2V0QXV0b2xvYWQoKTsKaWYgKCRyb290UGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgJiYgIWVtcHR5KCRtYWluQXV0b2xvYWRbJ3Bzci0wJ10pKSB7CiRsZXZlbHMgPSBzdWJzdHJfY291bnQoJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHJvb3RQYWNrYWdlLT5nZXRUYXJnZXREaXIoKSksICcvJykgKyAxOwokcHJlZml4ZXMgPSBpbXBsb2RlKCcsICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwcmVmaXgpOiBzdHJpbmcgewpyZXR1cm4gdmFyX2V4cG9ydCgkcHJlZml4LCB0cnVlKTsKfSwgYXJyYXlfa2V5cygkbWFpbkF1dG9sb2FkWydwc3ItMCddKSkpOwokYmFzZURpckZyb21UYXJnZXREaXJDb2RlID0gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCR0YXJnZXREaXIsICRiYXNlUGF0aCwgdHJ1ZSk7CgokdGFyZ2V0RGlyTG9hZGVyID0gPDw8RU9GCgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhdXRvbG9hZChcJGNsYXNzKQogICAgewogICAgICAgIFwkZGlyID0gJGJhc2VEaXJGcm9tVGFyZ2V0RGlyQ29kZSAuICcvJzsKICAgICAgICBcJHByZWZpeGVzID0gYXJyYXkoJHByZWZpeGVzKTsKICAgICAgICBmb3JlYWNoIChcJHByZWZpeGVzIGFzIFwkcHJlZml4KSB7CiAgICAgICAgICAgIGlmICgwICE9PSBzdHJwb3MoXCRjbGFzcywgXCRwcmVmaXgpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBcJHBhdGggPSBcJGRpciAuIGltcGxvZGUoJy8nLCBhcnJheV9zbGljZShleHBsb2RlKCdcXFxcJywgXCRjbGFzcyksICRsZXZlbHMpKS4nLnBocCc7CiAgICAgICAgICAgIGlmICghXCRwYXRoID0gc3RyZWFtX3Jlc29sdmVfaW5jbHVkZV9wYXRoKFwkcGF0aCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXF1aXJlIFwkcGF0aDsKCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCkVPRjsKfQoKJGV4Y2x1ZGVkID0gW107CmlmICghZW1wdHkoJGF1dG9sb2Fkc1snZXhjbHVkZS1mcm9tLWNsYXNzbWFwJ10pKSB7CiRleGNsdWRlZCA9ICRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddOwp9Cgpmb3JlYWNoICgkYXV0b2xvYWRzWydjbGFzc21hcCddIGFzICRkaXIpIHsKJGNsYXNzTWFwR2VuZXJhdG9yLT5zY2FuUGF0aHMoJGRpciwgJHRoaXMtPmJ1aWxkRXhjbHVzaW9uUmVnZXgoJGRpciwgJGV4Y2x1ZGVkKSk7Cn0KCmlmICgkc2NhblBzclBhY2thZ2VzKSB7CiRuYW1lc3BhY2VzVG9TY2FuID0gW107CgoKZm9yZWFjaCAoWydwc3ItNCcsICdwc3ItMCddIGFzICRwc3JUeXBlKSB7CmZvcmVhY2ggKCRhdXRvbG9hZHNbJHBzclR5cGVdIGFzICRuYW1lc3BhY2UgPT4gJHBhdGhzKSB7CiRuYW1lc3BhY2VzVG9TY2FuWyRuYW1lc3BhY2VdW10gPSBbJ3BhdGhzJyA9PiAkcGF0aHMsICd0eXBlJyA9PiAkcHNyVHlwZV07Cn0KfQoKa3Jzb3J0KCRuYW1lc3BhY2VzVG9TY2FuKTsKCmZvcmVhY2ggKCRuYW1lc3BhY2VzVG9TY2FuIGFzICRuYW1lc3BhY2UgPT4gJGdyb3Vwcykgewpmb3JlYWNoICgkZ3JvdXBzIGFzICRncm91cCkgewpmb3JlYWNoICgkZ3JvdXBbJ3BhdGhzJ10gYXMgJGRpcikgewokZGlyID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJGZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRkaXIpID8gJGRpciA6ICRiYXNlUGF0aC4nLycuJGRpcik7CmlmICghaXNfZGlyKCRkaXIpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKHN0cl9jb250YWlucygkdmVuZG9yUGF0aCwgJGRpci4nLycpKSB7CiRleGNsdXNpb25SZWdleCA9ICR0aGlzLT5idWlsZEV4Y2x1c2lvblJlZ2V4KCRkaXIsIGFycmF5X21lcmdlKCRleGNsdWRlZCwgWyR2ZW5kb3JQYXRoLicvJ10pKTsKfSBlbHNlIHsKJGV4Y2x1c2lvblJlZ2V4ID0gJHRoaXMtPmJ1aWxkRXhjbHVzaW9uUmVnZXgoJGRpciwgJGV4Y2x1ZGVkKTsKfQoKJGNsYXNzTWFwR2VuZXJhdG9yLT5zY2FuUGF0aHMoJGRpciwgJGV4Y2x1c2lvblJlZ2V4LCAkZ3JvdXBbJ3R5cGUnXSwgJG5hbWVzcGFjZSk7Cn0KfQp9Cn0KCiRjbGFzc01hcCA9ICRjbGFzc01hcEdlbmVyYXRvci0+Z2V0Q2xhc3NNYXAoKTsKaWYgKCRzdHJpY3RBbWJpZ3VvdXMpIHsKJGFtYmlndW91c0NsYXNzZXMgPSAkY2xhc3NNYXAtPmdldEFtYmlndW91c0NsYXNzZXMoZmFsc2UpOwp9IGVsc2UgewokYW1iaWd1b3VzQ2xhc3NlcyA9ICRjbGFzc01hcC0+Z2V0QW1iaWd1b3VzQ2xhc3NlcygpOwp9CmZvcmVhY2ggKCRhbWJpZ3VvdXNDbGFzc2VzIGFzICRjbGFzc05hbWUgPT4gJGFtYmlndW91c1BhdGhzKSB7CmlmIChjb3VudCgkYW1iaWd1b3VzUGF0aHMpID4gMSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoCic8d2FybmluZz5XYXJuaW5nOiBBbWJpZ3VvdXMgY2xhc3MgcmVzb2x1dGlvbiwgIicuJGNsYXNzTmFtZS4nIicuCicgd2FzIGZvdW5kICcuIChjb3VudCgkYW1iaWd1b3VzUGF0aHMpICsgMSkgLid4OiBpbiAiJy4kY2xhc3NNYXAtPmdldENsYXNzUGF0aCgkY2xhc3NOYW1lKS4nIiBhbmQgIicuIGltcGxvZGUoJyIsICInLCAkYW1iaWd1b3VzUGF0aHMpIC4nIiwgdGhlIGZpcnN0IHdpbGwgYmUgdXNlZC48L3dhcm5pbmc+JwopOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoCic8d2FybmluZz5XYXJuaW5nOiBBbWJpZ3VvdXMgY2xhc3MgcmVzb2x1dGlvbiwgIicuJGNsYXNzTmFtZS4nIicuCicgd2FzIGZvdW5kIGluIGJvdGggIicuJGNsYXNzTWFwLT5nZXRDbGFzc1BhdGgoJGNsYXNzTmFtZSkuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJGFtYmlndW91c1BhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfQp9CmlmIChcY291bnQoJGFtYmlndW91c0NsYXNzZXMpID4gMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPlRvIHJlc29sdmUgYW1iaWd1aXR5IGluIGNsYXNzZXMgbm90IHVuZGVyIHlvdXIgY29udHJvbCB5b3UgY2FuIGlnbm9yZSB0aGVtIGJ5IHBhdGggdXNpbmcgPGhyZWY9Jy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgnaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA0LXNjaGVtYS5tZCNleGNsdWRlLWZpbGVzLWZyb20tY2xhc3NtYXBzJykuJz5leGNsdWRlLWZyb20tY2xhc3NtYXA8Lz4nKTsKfQoKCiRjbGFzc01hcC0+Y2xlYXJQc3JWaW9sYXRpb25zQnlQYXRoKCR2ZW5kb3JQYXRoKTsKZm9yZWFjaCAoJGNsYXNzTWFwLT5nZXRQc3JWaW9sYXRpb25zKCkgYXMgJG1zZykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPiRtc2c8L3dhcm5pbmc+Iik7Cn0KCiRjbGFzc01hcC0+YWRkQ2xhc3MoJ0NvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zJywgJHZlbmRvclBhdGggLiAnL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocCcpOwokY2xhc3NNYXAtPnNvcnQoKTsKCiRjbGFzc21hcEZpbGUgPSA8PDxFT0YKPD9waHAKCi8vIGF1dG9sb2FkX2NsYXNzbWFwLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAoKRU9GOwpmb3JlYWNoICgkY2xhc3NNYXAtPmdldE1hcCgpIGFzICRjbGFzc05hbWUgPT4gJHBhdGgpIHsKJHBhdGhDb2RlID0gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkcGF0aCkuIixcbiI7CiRjbGFzc21hcEZpbGUgLj0gJyAgICAnLnZhcl9leHBvcnQoJGNsYXNzTmFtZSwgdHJ1ZSkuJyA9PiAnLiRwYXRoQ29kZTsKfQokY2xhc3NtYXBGaWxlIC49ICIpO1xuIjsKCmlmICgnJyA9PT0gJHN1ZmZpeCkgewokc3VmZml4ID0gbnVsbDsKfQppZiAobnVsbCA9PT0gJHN1ZmZpeCkgewokc3VmZml4ID0gJGNvbmZpZy0+Z2V0KCdhdXRvbG9hZGVyLXN1ZmZpeCcpOwoKCmlmIChudWxsID09PSAkc3VmZml4ICYmIEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHZlbmRvclBhdGguJy9hdXRvbG9hZC5waHAnKSkgewokY29udGVudCA9IChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKCR2ZW5kb3JQYXRoLicvYXV0b2xvYWQucGhwJyk7CmlmIChQcmVnOjppc01hdGNoKCd7Q29tcG9zZXJBdXRvbG9hZGVySW5pdChbXjpcc10rKTo6fScsICRjb250ZW50LCAkbWF0Y2gpKSB7CiRzdWZmaXggPSAkbWF0Y2hbMV07Cn0KfQoKaWYgKG51bGwgPT09ICRzdWZmaXgpIHsKJHN1ZmZpeCA9ICRsb2NrZXIgIT09IG51bGwgJiYgJGxvY2tlci0+aXNMb2NrZWQoKSA/ICRsb2NrZXItPmdldExvY2tEYXRhKClbJ2NvbnRlbnQtaGFzaCddIDogYmluMmhleChyYW5kb21fYnl0ZXMoMTYpKTsKfQp9CgppZiAoJHRoaXMtPmRyeVJ1bikgewpyZXR1cm4gJGNsYXNzTWFwOwp9CgokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkdGFyZ2V0RGlyLicvYXV0b2xvYWRfbmFtZXNwYWNlcy5waHAnLCAkbmFtZXNwYWNlc0ZpbGUpOwokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkdGFyZ2V0RGlyLicvYXV0b2xvYWRfcHNyNC5waHAnLCAkcHNyNEZpbGUpOwokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkdGFyZ2V0RGlyLicvYXV0b2xvYWRfY2xhc3NtYXAucGhwJywgJGNsYXNzbWFwRmlsZSk7CiRpbmNsdWRlUGF0aEZpbGVQYXRoID0gJHRhcmdldERpci4nL2luY2x1ZGVfcGF0aHMucGhwJzsKaWYgKCRpbmNsdWRlUGF0aEZpbGVDb250ZW50cyA9ICR0aGlzLT5nZXRJbmNsdWRlUGF0aHNGaWxlKCRwYWNrYWdlTWFwLCAkZmlsZXN5c3RlbSwgJGJhc2VQYXRoLCAkdmVuZG9yUGF0aCwgJHZlbmRvclBhdGhDb2RlLCAkYXBwQmFzZURpckNvZGUpKSB7CiRmaWxlc3lzdGVtLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCRpbmNsdWRlUGF0aEZpbGVQYXRoLCAkaW5jbHVkZVBhdGhGaWxlQ29udGVudHMpOwp9IGVsc2VpZiAoZmlsZV9leGlzdHMoJGluY2x1ZGVQYXRoRmlsZVBhdGgpKSB7CnVubGluaygkaW5jbHVkZVBhdGhGaWxlUGF0aCk7Cn0KJGluY2x1ZGVGaWxlc0ZpbGVQYXRoID0gJHRhcmdldERpci4nL2F1dG9sb2FkX2ZpbGVzLnBocCc7CmlmICgkaW5jbHVkZUZpbGVzRmlsZUNvbnRlbnRzID0gJHRoaXMtPmdldEluY2x1ZGVGaWxlc0ZpbGUoJGF1dG9sb2Fkc1snZmlsZXMnXSwgJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICR2ZW5kb3JQYXRoQ29kZSwgJGFwcEJhc2VEaXJDb2RlKSkgewokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkaW5jbHVkZUZpbGVzRmlsZVBhdGgsICRpbmNsdWRlRmlsZXNGaWxlQ29udGVudHMpOwp9IGVsc2VpZiAoZmlsZV9leGlzdHMoJGluY2x1ZGVGaWxlc0ZpbGVQYXRoKSkgewp1bmxpbmsoJGluY2x1ZGVGaWxlc0ZpbGVQYXRoKTsKfQokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkdGFyZ2V0RGlyLicvYXV0b2xvYWRfc3RhdGljLnBocCcsICR0aGlzLT5nZXRTdGF0aWNGaWxlKCRzdWZmaXgsICR0YXJnZXREaXIsICR2ZW5kb3JQYXRoLCAkYmFzZVBhdGgpKTsKJGNoZWNrUGxhdGZvcm0gPSAkY29uZmlnLT5nZXQoJ3BsYXRmb3JtLWNoZWNrJykgIT09IGZhbHNlICYmICEoJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHBsYXRmb3JtQ2hlY2tDb250ZW50ID0gbnVsbDsKaWYgKCRjaGVja1BsYXRmb3JtKSB7CiRwbGF0Zm9ybUNoZWNrQ29udGVudCA9ICR0aGlzLT5nZXRQbGF0Zm9ybUNoZWNrKCRwYWNrYWdlTWFwLCAkY29uZmlnLT5nZXQoJ3BsYXRmb3JtLWNoZWNrJyksICRkZXZQYWNrYWdlTmFtZXMpOwppZiAobnVsbCA9PT0gJHBsYXRmb3JtQ2hlY2tDb250ZW50KSB7CiRjaGVja1BsYXRmb3JtID0gZmFsc2U7Cn0KfQppZiAoJGNoZWNrUGxhdGZvcm0pIHsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL3BsYXRmb3JtX2NoZWNrLnBocCcsICRwbGF0Zm9ybUNoZWNrQ29udGVudCk7Cn0gZWxzZWlmIChmaWxlX2V4aXN0cygkdGFyZ2V0RGlyLicvcGxhdGZvcm1fY2hlY2sucGhwJykpIHsKdW5saW5rKCR0YXJnZXREaXIuJy9wbGF0Zm9ybV9jaGVjay5waHAnKTsKfQokZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkdmVuZG9yUGF0aC4nL2F1dG9sb2FkLnBocCcsICR0aGlzLT5nZXRBdXRvbG9hZEZpbGUoJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUsICRzdWZmaXgpKTsKJGZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHRhcmdldERpci4nL2F1dG9sb2FkX3JlYWwucGhwJywgJHRoaXMtPmdldEF1dG9sb2FkUmVhbEZpbGUodHJ1ZSwgKGJvb2wpICRpbmNsdWRlUGF0aEZpbGVDb250ZW50cywgJHRhcmdldERpckxvYWRlciwgKGJvb2wpICRpbmNsdWRlRmlsZXNGaWxlQ29udGVudHMsICR2ZW5kb3JQYXRoQ29kZSwgJGFwcEJhc2VEaXJDb2RlLCAkc3VmZml4LCAkdXNlR2xvYmFsSW5jbHVkZVBhdGgsICRwcmVwZW5kQXV0b2xvYWRlciwgJGNoZWNrUGxhdGZvcm0pKTsKCiRmaWxlc3lzdGVtLT5zYWZlQ29weShfX0RJUl9fLicvQ2xhc3NMb2FkZXIucGhwJywgJHRhcmdldERpci4nL0NsYXNzTG9hZGVyLnBocCcpOwokZmlsZXN5c3RlbS0+c2FmZUNvcHkoX19ESVJfXy4nLy4uLy4uLy4uL0xJQ0VOU0UnLCAkdGFyZ2V0RGlyLicvTElDRU5TRScpOwoKaWYgKCR0aGlzLT5ydW5TY3JpcHRzKSB7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UE9TVF9BVVRPTE9BRF9EVU1QLCAkdGhpcy0+ZGV2TW9kZSwgW10sIFsKJ29wdGltaXplJyA9PiAkc2NhblBzclBhY2thZ2VzLApdKTsKfQoKcmV0dXJuICRjbGFzc01hcDsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYnVpbGRFeGNsdXNpb25SZWdleChzdHJpbmcgJGRpciwgYXJyYXkgJGV4Y2x1ZGVkKTogP3N0cmluZwp7CmlmIChbXSA9PT0gJGV4Y2x1ZGVkKSB7CnJldHVybiBudWxsOwp9CgoKCgppZiAoZmlsZV9leGlzdHMoJGRpcikpIHsKCiRkaXJNYXRjaCA9IHByZWdfcXVvdGUoc3RydHIocmVhbHBhdGgoJGRpciksICdcXCcsICcvJykpOwoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGFic0RpciA9ICRmcy0+aXNBYnNvbHV0ZVBhdGgoJGRpcikgPyAkZGlyIDogcmVhbHBhdGgoUGxhdGZvcm06OmdldEN3ZCgpKS4nLycuJGRpcjsKJGRpck1hdGNoTm9ybWFsaXplZCA9IHByZWdfcXVvdGUoc3RydHIoJGZzLT5ub3JtYWxpemVQYXRoKCRhYnNEaXIpLCAnXFwnLCAnLycpKTsKJGlzU3ltbGluayA9ICRkaXJNYXRjaCAhPT0gJGRpck1hdGNoTm9ybWFsaXplZDsKCmZvcmVhY2ggKCRleGNsdWRlZCBhcyAkaW5kZXggPT4gJHBhdHRlcm4pIHsKCiRwYXR0ZXJuID0gUHJlZzo6cmVwbGFjZSgne14oKFteLisqP1xbXlxdJCgpe309ITw+fDpcXFxcIy1dK3xcXFxcWy4rKj9cW15cXSQoKXt9PSE8Pnw6Iy1dKSopLip9JywgJyQxJywgJHBhdHRlcm4pOwoKaWYgKAooIXN0cl9zdGFydHNfd2l0aCgkcGF0dGVybiwgJGRpck1hdGNoKSAmJiAhc3RyX3N0YXJ0c193aXRoKCRkaXJNYXRjaCwgJHBhdHRlcm4pKQomJiAoCgohJGlzU3ltbGluawp8fCAoIXN0cl9zdGFydHNfd2l0aCgkcGF0dGVybiwgJGRpck1hdGNoTm9ybWFsaXplZCkgJiYgIXN0cl9zdGFydHNfd2l0aCgkZGlyTWF0Y2hOb3JtYWxpemVkLCAkcGF0dGVybikpCikKKSB7CnVuc2V0KCRleGNsdWRlZFskaW5kZXhdKTsKfQp9Cn0KCnJldHVybiBcY291bnQoJGV4Y2x1ZGVkKSA+IDAgPyAneygnIC4gaW1wbG9kZSgnfCcsICRleGNsdWRlZCkgLiAnKX0nIDogbnVsbDsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBidWlsZFBhY2thZ2VNYXAoSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlciwgUGFja2FnZUludGVyZmFjZSAkcm9vdFBhY2thZ2UsIGFycmF5ICRwYWNrYWdlcykKewoKJHBhY2thZ2VNYXAgPSBbWyRyb290UGFja2FnZSwgJyddXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KJHRoaXMtPnZhbGlkYXRlUGFja2FnZSgkcGFja2FnZSk7CiRwYWNrYWdlTWFwW10gPSBbCiRwYWNrYWdlLAokaW5zdGFsbGF0aW9uTWFuYWdlci0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpLApdOwp9CgpyZXR1cm4gJHBhY2thZ2VNYXA7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJGF1dG9sb2FkID0gJHBhY2thZ2UtPmdldEF1dG9sb2FkKCk7CmlmICghZW1wdHkoJGF1dG9sb2FkWydwc3ItNCddKSAmJiBudWxsICE9PSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCk7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJQU1ItNCBhdXRvbG9hZGluZyBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgdGFyZ2V0LWRpciBwcm9wZXJ0eSwgcmVtb3ZlIHRoZSB0YXJnZXQtZGlyIGluIHBhY2thZ2UgJyRuYW1lJy4iKTsKfQppZiAoIWVtcHR5KCRhdXRvbG9hZFsncHNyLTQnXSkpIHsKZm9yZWFjaCAoJGF1dG9sb2FkWydwc3ItNCddIGFzICRuYW1lc3BhY2UgPT4gJGRpcnMpIHsKaWYgKCRuYW1lc3BhY2UgIT09ICcnICYmICdcXCcgIT09IHN1YnN0cigkbmFtZXNwYWNlLCAtMSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oInBzci00IG5hbWVzcGFjZXMgbXVzdCBlbmQgd2l0aCBhIG5hbWVzcGFjZSBzZXBhcmF0b3IsICckbmFtZXNwYWNlJyBkb2VzIG5vdCwgdXNlICckbmFtZXNwYWNlXFwnLiIpOwp9Cn0KfQp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VBdXRvbG9hZHMoYXJyYXkgJHBhY2thZ2VNYXAsIFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlLCAkZmlsdGVyZWREZXZQYWNrYWdlcyA9IGZhbHNlKQp7CiRyb290UGFja2FnZU1hcCA9IGFycmF5X3NoaWZ0KCRwYWNrYWdlTWFwKTsKaWYgKGlzX2FycmF5KCRmaWx0ZXJlZERldlBhY2thZ2VzKSkgewokcGFja2FnZU1hcCA9IGFycmF5X2ZpbHRlcigkcGFja2FnZU1hcCwgc3RhdGljIGZ1bmN0aW9uICgkaXRlbSkgdXNlICgkZmlsdGVyZWREZXZQYWNrYWdlcyk6IGJvb2wgewpyZXR1cm4gIWluX2FycmF5KCRpdGVtWzBdLT5nZXROYW1lKCksICRmaWx0ZXJlZERldlBhY2thZ2VzLCB0cnVlKTsKfSk7Cn0gZWxzZWlmICgkZmlsdGVyZWREZXZQYWNrYWdlcykgewokcGFja2FnZU1hcCA9ICR0aGlzLT5maWx0ZXJQYWNrYWdlTWFwKCRwYWNrYWdlTWFwLCAkcm9vdFBhY2thZ2UpOwp9CiRzb3J0ZWRQYWNrYWdlTWFwID0gJHRoaXMtPnNvcnRQYWNrYWdlTWFwKCRwYWNrYWdlTWFwKTsKJHNvcnRlZFBhY2thZ2VNYXBbXSA9ICRyb290UGFja2FnZU1hcDsKJHJldmVyc2VTb3J0ZWRNYXAgPSBhcnJheV9yZXZlcnNlKCRzb3J0ZWRQYWNrYWdlTWFwKTsKCgoKJHBzcjAgPSAkdGhpcy0+cGFyc2VBdXRvbG9hZHNUeXBlKCRyZXZlcnNlU29ydGVkTWFwLCAncHNyLTAnLCAkcm9vdFBhY2thZ2UpOwokcHNyNCA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHJldmVyc2VTb3J0ZWRNYXAsICdwc3ItNCcsICRyb290UGFja2FnZSk7CiRjbGFzc21hcCA9ICR0aGlzLT5wYXJzZUF1dG9sb2Fkc1R5cGUoJHJldmVyc2VTb3J0ZWRNYXAsICdjbGFzc21hcCcsICRyb290UGFja2FnZSk7CgoKJGZpbGVzID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZSgkc29ydGVkUGFja2FnZU1hcCwgJ2ZpbGVzJywgJHJvb3RQYWNrYWdlKTsKCiRleGNsdWRlID0gJHRoaXMtPnBhcnNlQXV0b2xvYWRzVHlwZSgkc29ydGVkUGFja2FnZU1hcCwgJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCcsICRyb290UGFja2FnZSk7CgprcnNvcnQoJHBzcjApOwprcnNvcnQoJHBzcjQpOwoKcmV0dXJuIFsKJ3Bzci0wJyA9PiAkcHNyMCwKJ3Bzci00JyA9PiAkcHNyNCwKJ2NsYXNzbWFwJyA9PiAkY2xhc3NtYXAsCidmaWxlcycgPT4gJGZpbGVzLAonZXhjbHVkZS1mcm9tLWNsYXNzbWFwJyA9PiAkZXhjbHVkZSwKXTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZUxvYWRlcihhcnJheSAkYXV0b2xvYWRzLCA/c3RyaW5nICR2ZW5kb3JEaXIgPSBudWxsKQp7CiRsb2FkZXIgPSBuZXcgQ2xhc3NMb2FkZXIoJHZlbmRvckRpcik7CgppZiAoaXNzZXQoJGF1dG9sb2Fkc1sncHNyLTAnXSkpIHsKZm9yZWFjaCAoJGF1dG9sb2Fkc1sncHNyLTAnXSBhcyAkbmFtZXNwYWNlID0+ICRwYXRoKSB7CiRsb2FkZXItPmFkZCgkbmFtZXNwYWNlLCAkcGF0aCk7Cn0KfQoKaWYgKGlzc2V0KCRhdXRvbG9hZHNbJ3Bzci00J10pKSB7CmZvcmVhY2ggKCRhdXRvbG9hZHNbJ3Bzci00J10gYXMgJG5hbWVzcGFjZSA9PiAkcGF0aCkgewokbG9hZGVyLT5hZGRQc3I0KCRuYW1lc3BhY2UsICRwYXRoKTsKfQp9CgppZiAoaXNzZXQoJGF1dG9sb2Fkc1snY2xhc3NtYXAnXSkpIHsKJGV4Y2x1ZGVkID0gW107CmlmICghZW1wdHkoJGF1dG9sb2Fkc1snZXhjbHVkZS1mcm9tLWNsYXNzbWFwJ10pKSB7CiRleGNsdWRlZCA9ICRhdXRvbG9hZHNbJ2V4Y2x1ZGUtZnJvbS1jbGFzc21hcCddOwp9CgokY2xhc3NNYXBHZW5lcmF0b3IgPSBuZXcgQ2xhc3NNYXBHZW5lcmF0b3IoWydwaHAnLCAnaW5jJywgJ2hoJ10pOwokY2xhc3NNYXBHZW5lcmF0b3ItPmF2b2lkRHVwbGljYXRlU2NhbnMoKTsKCmZvcmVhY2ggKCRhdXRvbG9hZHNbJ2NsYXNzbWFwJ10gYXMgJGRpcikgewp0cnkgewokY2xhc3NNYXBHZW5lcmF0b3ItPnNjYW5QYXRocygkZGlyLCAkdGhpcy0+YnVpbGRFeGNsdXNpb25SZWdleCgkZGlyLCAkZXhjbHVkZWQpKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRlLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nKTsKfQp9CgokbG9hZGVyLT5hZGRDbGFzc01hcCgkY2xhc3NNYXBHZW5lcmF0b3ItPmdldENsYXNzTWFwKCktPmdldE1hcCgpKTsKfQoKcmV0dXJuICRsb2FkZXI7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5jbHVkZVBhdGhzRmlsZShhcnJheSAkcGFja2FnZU1hcCwgRmlsZXN5c3RlbSAkZmlsZXN5c3RlbSwgc3RyaW5nICRiYXNlUGF0aCwgc3RyaW5nICR2ZW5kb3JQYXRoLCBzdHJpbmcgJHZlbmRvclBhdGhDb2RlLCBzdHJpbmcgJGFwcEJhc2VEaXJDb2RlKQp7CiRpbmNsdWRlUGF0aHMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlTWFwIGFzICRpdGVtKSB7ClskcGFja2FnZSwgJGluc3RhbGxQYXRoXSA9ICRpdGVtOwoKCmlmIChudWxsID09PSAkaW5zdGFsbFBhdGgpIHsKY29udGludWU7Cn0KCmlmIChudWxsICE9PSAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgJiYgc3RybGVuKCRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSkgPiAwKSB7CiRpbnN0YWxsUGF0aCA9IHN1YnN0cigkaW5zdGFsbFBhdGgsIDAsIC1zdHJsZW4oJy8nLiRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSkpOwp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCkgYXMgJGluY2x1ZGVQYXRoKSB7CiRpbmNsdWRlUGF0aCA9IHRyaW0oJGluY2x1ZGVQYXRoLCAnLycpOwokaW5jbHVkZVBhdGhzW10gPSAkaW5zdGFsbFBhdGggPT09ICcnID8gJGluY2x1ZGVQYXRoIDogJGluc3RhbGxQYXRoLicvJy4kaW5jbHVkZVBhdGg7Cn0KfQoKaWYgKFxjb3VudCgkaW5jbHVkZVBhdGhzKSA9PT0gMCkgewpyZXR1cm4gbnVsbDsKfQoKJGluY2x1ZGVQYXRoc0NvZGUgPSAnJzsKZm9yZWFjaCAoJGluY2x1ZGVQYXRocyBhcyAkcGF0aCkgewokaW5jbHVkZVBhdGhzQ29kZSAuPSAiICAgICIgLiAkdGhpcy0+Z2V0UGF0aENvZGUoJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgsICRwYXRoKSAuICIsXG4iOwp9CgpyZXR1cm4gPDw8RU9GCjw/cGhwCgovLyBpbmNsdWRlX3BhdGhzLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAokaW5jbHVkZVBhdGhzQ29kZSk7CgpFT0Y7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5jbHVkZUZpbGVzRmlsZShhcnJheSAkZmlsZXMsIEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICR2ZW5kb3JQYXRoQ29kZSwgc3RyaW5nICRhcHBCYXNlRGlyQ29kZSkKewoKJGZpbGVzID0gYXJyYXlfbWFwKApmdW5jdGlvbiAoc3RyaW5nICRmdW5jdGlvbkZpbGUpIHVzZSAoJGZpbGVzeXN0ZW0sICRiYXNlUGF0aCwgJHZlbmRvclBhdGgpOiBzdHJpbmcgewpyZXR1cm4gJHRoaXMtPmdldFBhdGhDb2RlKCRmaWxlc3lzdGVtLCAkYmFzZVBhdGgsICR2ZW5kb3JQYXRoLCAkZnVuY3Rpb25GaWxlKTsKfSwKJGZpbGVzCik7CiR1bmlxdWVGaWxlcyA9IGFycmF5X3VuaXF1ZSgkZmlsZXMpOwppZiAoY291bnQoJHVuaXF1ZUZpbGVzKSA8IGNvdW50KCRmaWxlcykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgZm9sbG93aW5nICJmaWxlcyIgYXV0b2xvYWQgcnVsZXMgYXJlIGluY2x1ZGVkIG11bHRpcGxlIHRpbWVzLCB0aGlzIG1heSBjYXVzZSBpc3N1ZXMgYW5kIHNob3VsZCBiZSByZXNvbHZlZDo8L3dhcm5pbmc+Jyk7CmZvcmVhY2ggKGFycmF5X3VuaXF1ZShhcnJheV9kaWZmX2Fzc29jKCRmaWxlcywgJHVuaXF1ZUZpbGVzKSkgYXMgJGR1cGxpY2F0ZUZpbGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4gLSAnLiRkdXBsaWNhdGVGaWxlLic8L3dhcm5pbmc+Jyk7Cn0KfQp1bnNldCgkdW5pcXVlRmlsZXMpOwoKJGZpbGVzQ29kZSA9ICcnOwoKZm9yZWFjaCAoJGZpbGVzIGFzICRmaWxlSWRlbnRpZmllciA9PiAkZnVuY3Rpb25GaWxlKSB7CiRmaWxlc0NvZGUgLj0gJyAgICAnIC4gdmFyX2V4cG9ydCgkZmlsZUlkZW50aWZpZXIsIHRydWUpIC4gJyA9PiAnIC4gJGZ1bmN0aW9uRmlsZSAuICIsXG4iOwp9CgppZiAoISRmaWxlc0NvZGUpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiA8PDxFT0YKPD9waHAKCi8vIGF1dG9sb2FkX2ZpbGVzLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpcJHZlbmRvckRpciA9ICR2ZW5kb3JQYXRoQ29kZTsKXCRiYXNlRGlyID0gJGFwcEJhc2VEaXJDb2RlOwoKcmV0dXJuIGFycmF5KAokZmlsZXNDb2RlKTsKCkVPRjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBhdGhDb2RlKEZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0sIHN0cmluZyAkYmFzZVBhdGgsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICRwYXRoKQp7CmlmICghJGZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRwYXRoKSkgewokcGF0aCA9ICRiYXNlUGF0aCAuICcvJyAuICRwYXRoOwp9CiRwYXRoID0gJGZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwoKJGJhc2VEaXIgPSAnJzsKaWYgKHN0cnBvcygkcGF0aC4nLycsICR2ZW5kb3JQYXRoLicvJykgPT09IDApIHsKJHBhdGggPSAoc3RyaW5nKSBzdWJzdHIoJHBhdGgsIHN0cmxlbigkdmVuZG9yUGF0aCkpOwokYmFzZURpciA9ICckdmVuZG9yRGlyIC4gJzsKfSBlbHNlIHsKJHBhdGggPSAkZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkYmFzZVBhdGgsICRwYXRoLCB0cnVlKSk7CmlmICghJGZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRwYXRoKSkgewokYmFzZURpciA9ICckYmFzZURpciAuICc7CiRwYXRoID0gJy8nIC4gJHBhdGg7Cn0KfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3tcLnBoYXIoW1xcXFwvXXwkKX0nLCAkcGF0aCkpIHsKJGJhc2VEaXIgPSAiJ3BoYXI6Ly8nIC4gIiAuICRiYXNlRGlyOwp9CgpyZXR1cm4gJGJhc2VEaXIgLiB2YXJfZXhwb3J0KCRwYXRoLCB0cnVlKTsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBsYXRmb3JtQ2hlY2soYXJyYXkgJHBhY2thZ2VNYXAsICRjaGVja1BsYXRmb3JtLCBhcnJheSAkZGV2UGFja2FnZU5hbWVzKQp7CiRsb3dlc3RQaHBWZXJzaW9uID0gQm91bmQ6Onplcm8oKTsKJHJlcXVpcmVkUGhwNjRiaXQgPSBmYWxzZTsKJHJlcXVpcmVkRXh0ZW5zaW9ucyA9IFtdOwokZXh0ZW5zaW9uUHJvdmlkZXJzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewokcGFja2FnZSA9ICRpdGVtWzBdOwpmb3JlYWNoIChhcnJheV9tZXJnZSgkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSwgJHBhY2thZ2UtPmdldFByb3ZpZGVzKCkpIGFzICRsaW5rKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XmV4dC0oLispJH1pRCcsICRsaW5rLT5nZXRUYXJnZXQoKSwgJG1hdGNoKSkgewokZXh0ZW5zaW9uUHJvdmlkZXJzWyRtYXRjaFsxXV1bXSA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCk7Cn0KfQp9Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewokcGFja2FnZSA9ICRpdGVtWzBdOwoKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRkZXZQYWNrYWdlTmFtZXMsIHRydWUpKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewppZiAoJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CgppZiAoaW5fYXJyYXkoJGxpbmstPmdldFRhcmdldCgpLCBbJ3BocCcsICdwaHAtNjRiaXQnXSwgdHJ1ZSkpIHsKJGNvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwppZiAoJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKS0+Y29tcGFyZVRvKCRsb3dlc3RQaHBWZXJzaW9uLCAnPicpKSB7CiRsb3dlc3RQaHBWZXJzaW9uID0gJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKTsKfQp9CgppZiAoJ3BocC02NGJpdCcgPT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewokcmVxdWlyZWRQaHA2NGJpdCA9IHRydWU7Cn0KCmlmICgkY2hlY2tQbGF0Zm9ybSA9PT0gdHJ1ZSAmJiBQcmVnOjppc01hdGNoKCd7XmV4dC0oLispJH1pRCcsICRsaW5rLT5nZXRUYXJnZXQoKSwgJG1hdGNoKSkgewoKaWYgKGlzc2V0KCRleHRlbnNpb25Qcm92aWRlcnNbJG1hdGNoWzFdXSkpIHsKZm9yZWFjaCAoJGV4dGVuc2lvblByb3ZpZGVyc1skbWF0Y2hbMV1dIGFzICRwcm92aWRlZCkgewppZiAoJHByb3ZpZGVkLT5tYXRjaGVzKCRsaW5rLT5nZXRDb25zdHJhaW50KCkpKSB7CmNvbnRpbnVlIDI7Cn0KfQp9CgppZiAoJG1hdGNoWzFdID09PSAnemVuZC1vcGNhY2hlJykgewokbWF0Y2hbMV0gPSAnemVuZCBvcGNhY2hlJzsKfQoKJGV4dGVuc2lvbiA9IHZhcl9leHBvcnQoJG1hdGNoWzFdLCB0cnVlKTsKaWYgKCRtYXRjaFsxXSA9PT0gJ3BjbnRsJyB8fCAkbWF0Y2hbMV0gPT09ICdyZWFkbGluZScpIHsKJHJlcXVpcmVkRXh0ZW5zaW9uc1skZXh0ZW5zaW9uXSA9ICJQSFBfU0FQSSAhPT0gJ2NsaScgfHwgZXh0ZW5zaW9uX2xvYWRlZCgkZXh0ZW5zaW9uKSB8fCBcJG1pc3NpbmdFeHRlbnNpb25zW10gPSAkZXh0ZW5zaW9uO1xuIjsKfSBlbHNlIHsKJHJlcXVpcmVkRXh0ZW5zaW9uc1skZXh0ZW5zaW9uXSA9ICJleHRlbnNpb25fbG9hZGVkKCRleHRlbnNpb24pIHx8IFwkbWlzc2luZ0V4dGVuc2lvbnNbXSA9ICRleHRlbnNpb247XG4iOwp9Cn0KfQp9Cgprc29ydCgkcmVxdWlyZWRFeHRlbnNpb25zKTsKCiRmb3JtYXRUb1BocFZlcnNpb25JZCA9IHN0YXRpYyBmdW5jdGlvbiAoQm91bmQgJGJvdW5kKTogaW50IHsKaWYgKCRib3VuZC0+aXNaZXJvKCkpIHsKcmV0dXJuIDA7Cn0KCmlmICgkYm91bmQtPmlzUG9zaXRpdmVJbmZpbml0eSgpKSB7CnJldHVybiA5OTk5OTsKfQoKJHZlcnNpb24gPSBzdHJfcmVwbGFjZSgnLScsICcuJywgJGJvdW5kLT5nZXRWZXJzaW9uKCkpOwokY2h1bmtzID0gYXJyYXlfbWFwKCdpbnR2YWwnLCBleHBsb2RlKCcuJywgJHZlcnNpb24pKTsKCnJldHVybiAkY2h1bmtzWzBdICogMTAwMDAgKyAkY2h1bmtzWzFdICogMTAwICsgJGNodW5rc1syXTsKfTsKCiRmb3JtYXRUb0h1bWFuUmVhZGFibGUgPSBzdGF0aWMgZnVuY3Rpb24gKEJvdW5kICRib3VuZCkgewppZiAoJGJvdW5kLT5pc1plcm8oKSkgewpyZXR1cm4gMDsKfQoKaWYgKCRib3VuZC0+aXNQb3NpdGl2ZUluZmluaXR5KCkpIHsKcmV0dXJuIDk5OTk5Owp9CgokdmVyc2lvbiA9IHN0cl9yZXBsYWNlKCctJywgJy4nLCAkYm91bmQtPmdldFZlcnNpb24oKSk7CiRjaHVua3MgPSBleHBsb2RlKCcuJywgJHZlcnNpb24pOwokY2h1bmtzID0gYXJyYXlfc2xpY2UoJGNodW5rcywgMCwgMyk7CgpyZXR1cm4gaW1wbG9kZSgnLicsICRjaHVua3MpOwp9OwoKJHJlcXVpcmVkUGhwID0gJyc7CiRyZXF1aXJlZFBocEVycm9yID0gJyc7CmlmICghJGxvd2VzdFBocFZlcnNpb24tPmlzWmVybygpKSB7CiRvcGVyYXRvciA9ICRsb3dlc3RQaHBWZXJzaW9uLT5pc0luY2x1c2l2ZSgpID8gJz49JyA6ICc+JzsKJHJlcXVpcmVkUGhwID0gJ1BIUF9WRVJTSU9OX0lEICcuJG9wZXJhdG9yLicgJy4kZm9ybWF0VG9QaHBWZXJzaW9uSWQoJGxvd2VzdFBocFZlcnNpb24pOwokcmVxdWlyZWRQaHBFcnJvciA9ICciJy4kb3BlcmF0b3IuJyAnLiRmb3JtYXRUb0h1bWFuUmVhZGFibGUoJGxvd2VzdFBocFZlcnNpb24pLiciJzsKfQoKaWYgKCRyZXF1aXJlZFBocCkgewokcmVxdWlyZWRQaHAgPSA8PDxQSFBfQ0hFQ0sKCmlmICghKCRyZXF1aXJlZFBocCkpIHsKICAgIFwkaXNzdWVzW10gPSAnWW91ciBDb21wb3NlciBkZXBlbmRlbmNpZXMgcmVxdWlyZSBhIFBIUCB2ZXJzaW9uICRyZXF1aXJlZFBocEVycm9yLiBZb3UgYXJlIHJ1bm5pbmcgJyAuIFBIUF9WRVJTSU9OIC4gJy4nOwp9CgpQSFBfQ0hFQ0s7Cn0KCmlmICgkcmVxdWlyZWRQaHA2NGJpdCkgewokcmVxdWlyZWRQaHAgLj0gPDw8UEhQX0NIRUNLCgppZiAoUEhQX0lOVF9TSVpFICE9PSA4KSB7CiAgICBcJGlzc3Vlc1tdID0gJ1lvdXIgQ29tcG9zZXIgZGVwZW5kZW5jaWVzIHJlcXVpcmUgYSA2NC1iaXQgYnVpbGQgb2YgUEhQLic7Cn0KClBIUF9DSEVDSzsKfQoKJHJlcXVpcmVkRXh0ZW5zaW9ucyA9IGltcGxvZGUoJycsICRyZXF1aXJlZEV4dGVuc2lvbnMpOwppZiAoJycgIT09ICRyZXF1aXJlZEV4dGVuc2lvbnMpIHsKJHJlcXVpcmVkRXh0ZW5zaW9ucyA9IDw8PEVYVF9DSEVDS1MKClwkbWlzc2luZ0V4dGVuc2lvbnMgPSBhcnJheSgpOwokcmVxdWlyZWRFeHRlbnNpb25zCmlmIChcJG1pc3NpbmdFeHRlbnNpb25zKSB7CiAgICBcJGlzc3Vlc1tdID0gJ1lvdXIgQ29tcG9zZXIgZGVwZW5kZW5jaWVzIHJlcXVpcmUgdGhlIGZvbGxvd2luZyBQSFAgZXh0ZW5zaW9ucyB0byBiZSBpbnN0YWxsZWQ6ICcgLiBpbXBsb2RlKCcsICcsIFwkbWlzc2luZ0V4dGVuc2lvbnMpIC4gJy4nOwp9CgpFWFRfQ0hFQ0tTOwp9CgppZiAoISRyZXF1aXJlZFBocCAmJiAhJHJlcXVpcmVkRXh0ZW5zaW9ucykgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIDw8PFBMQVRGT1JNX0NIRUNLCjw/cGhwCgovLyBwbGF0Zm9ybV9jaGVjay5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKXCRpc3N1ZXMgPSBhcnJheSgpOwp7JHJlcXVpcmVkUGhwfXskcmVxdWlyZWRFeHRlbnNpb25zfQppZiAoXCRpc3N1ZXMpIHsKICAgIGlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICBoZWFkZXIoJ0hUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKTsKICAgIH0KICAgIGlmICghaW5pX2dldCgnZGlzcGxheV9lcnJvcnMnKSkgewogICAgICAgIGlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7CiAgICAgICAgICAgIGZ3cml0ZShTVERFUlIsICdDb21wb3NlciBkZXRlY3RlZCBpc3N1ZXMgaW4geW91ciBwbGF0Zm9ybTonIC4gUEhQX0VPTC5QSFBfRU9MIC4gaW1wbG9kZShQSFBfRU9MLCBcJGlzc3VlcykgLiBQSFBfRU9MLlBIUF9FT0wpOwogICAgICAgIH0gZWxzZWlmICghaGVhZGVyc19zZW50KCkpIHsKICAgICAgICAgICAgZWNobyAnQ29tcG9zZXIgZGV0ZWN0ZWQgaXNzdWVzIGluIHlvdXIgcGxhdGZvcm06JyAuIFBIUF9FT0wuUEhQX0VPTCAuIHN0cl9yZXBsYWNlKCdZb3UgYXJlIHJ1bm5pbmcgJy5QSFBfVkVSU0lPTi4nLicsICcnLCBpbXBsb2RlKFBIUF9FT0wsIFwkaXNzdWVzKSkgLiBQSFBfRU9MLlBIUF9FT0w7CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAogICAgICAgICdDb21wb3NlciBkZXRlY3RlZCBpc3N1ZXMgaW4geW91ciBwbGF0Zm9ybTogJyAuIGltcGxvZGUoJyAnLCBcJGlzc3VlcykKICAgICk7Cn0KClBMQVRGT1JNX0NIRUNLOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0QXV0b2xvYWRGaWxlKHN0cmluZyAkdmVuZG9yUGF0aFRvVGFyZ2V0RGlyQ29kZSwgc3RyaW5nICRzdWZmaXgpCnsKJGxhc3RDaGFyID0gJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGVbc3RybGVuKCR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlKSAtIDFdOwppZiAoIiciID09PSAkbGFzdENoYXIgfHwgJyInID09PSAkbGFzdENoYXIpIHsKJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUgPSBzdWJzdHIoJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGUsIDAsIC0xKS4nL2F1dG9sb2FkX3JlYWwucGhwJy4kbGFzdENoYXI7Cn0gZWxzZSB7CiR2ZW5kb3JQYXRoVG9UYXJnZXREaXJDb2RlIC49ICIgLiAnL2F1dG9sb2FkX3JlYWwucGhwJyI7Cn0KCnJldHVybiA8PDxBVVRPTE9BRAo8P3BocAoKLy8gYXV0b2xvYWQucGhwIEBnZW5lcmF0ZWQgYnkgQ29tcG9zZXIKCmlmIChQSFBfVkVSU0lPTl9JRCA8IDUwNjAwKSB7CiAgICBpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgaGVhZGVyKCdIVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yJyk7CiAgICB9CiAgICBcJGVyciA9ICdDb21wb3NlciAyLjMuMCBkcm9wcGVkIHN1cHBvcnQgZm9yIGF1dG9sb2FkaW5nIG9uIFBIUCA8NS42IGFuZCB5b3UgYXJlIHJ1bm5pbmcgJy5QSFBfVkVSU0lPTi4nLCBwbGVhc2UgdXBncmFkZSBQSFAgb3IgdXNlIENvbXBvc2VyIDIuMiBMVFMgdmlhICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLTIuMiIuIEFib3J0aW5nLicuUEhQX0VPTDsKICAgIGlmICghaW5pX2dldCgnZGlzcGxheV9lcnJvcnMnKSkgewogICAgICAgIGlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7CiAgICAgICAgICAgIGZ3cml0ZShTVERFUlIsIFwkZXJyKTsKICAgICAgICB9IGVsc2VpZiAoIWhlYWRlcnNfc2VudCgpKSB7CiAgICAgICAgICAgIGVjaG8gXCRlcnI7CiAgICAgICAgfQogICAgfQogICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oXCRlcnIpOwp9CgpyZXF1aXJlX29uY2UgJHZlbmRvclBhdGhUb1RhcmdldERpckNvZGU7CgpyZXR1cm4gQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXg6OmdldExvYWRlcigpOwoKQVVUT0xPQUQ7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBdXRvbG9hZFJlYWxGaWxlKGJvb2wgJHVzZUNsYXNzTWFwLCBib29sICR1c2VJbmNsdWRlUGF0aCwgP3N0cmluZyAkdGFyZ2V0RGlyTG9hZGVyLCBib29sICR1c2VJbmNsdWRlRmlsZXMsIHN0cmluZyAkdmVuZG9yUGF0aENvZGUsIHN0cmluZyAkYXBwQmFzZURpckNvZGUsIHN0cmluZyAkc3VmZml4LCBib29sICR1c2VHbG9iYWxJbmNsdWRlUGF0aCwgc3RyaW5nICRwcmVwZW5kQXV0b2xvYWRlciwgYm9vbCAkY2hlY2tQbGF0Zm9ybSkKewokZmlsZSA9IDw8PEhFQURFUgo8P3BocAoKLy8gYXV0b2xvYWRfcmVhbC5waHAgQGdlbmVyYXRlZCBieSBDb21wb3NlcgoKY2xhc3MgQ29tcG9zZXJBdXRvbG9hZGVySW5pdCRzdWZmaXgKewogICAgcHJpdmF0ZSBzdGF0aWMgXCRsb2FkZXI7CgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkQ2xhc3NMb2FkZXIoXCRjbGFzcykKICAgIHsKICAgICAgICBpZiAoJ0NvbXBvc2VyXFxBdXRvbG9hZFxcQ2xhc3NMb2FkZXInID09PSBcJGNsYXNzKSB7CiAgICAgICAgICAgIHJlcXVpcmUgX19ESVJfXyAuICcvQ2xhc3NMb2FkZXIucGhwJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvYWRlcigpCiAgICB7CiAgICAgICAgaWYgKG51bGwgIT09IHNlbGY6OlwkbG9hZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBzZWxmOjpcJGxvYWRlcjsKICAgICAgICB9CgoKSEVBREVSOwoKaWYgKCRjaGVja1BsYXRmb3JtKSB7CiRmaWxlIC49IDw8PCdQTEFURk9STV9DSEVDSycKICAgICAgICByZXF1aXJlIF9fRElSX18gLiAnL3BsYXRmb3JtX2NoZWNrLnBocCc7CgoKUExBVEZPUk1fQ0hFQ0s7Cn0KCiRmaWxlIC49IDw8PENMQVNTTE9BREVSX0lOSVQKICAgICAgICBzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJ0NvbXBvc2VyQXV0b2xvYWRlckluaXQkc3VmZml4JywgJ2xvYWRDbGFzc0xvYWRlcicpLCB0cnVlLCAkcHJlcGVuZEF1dG9sb2FkZXIpOwogICAgICAgIHNlbGY6OlwkbG9hZGVyID0gXCRsb2FkZXIgPSBuZXcgXFxDb21wb3NlclxcQXV0b2xvYWRcXENsYXNzTG9hZGVyKFxcZGlybmFtZShfX0RJUl9fKSk7CiAgICAgICAgc3BsX2F1dG9sb2FkX3VucmVnaXN0ZXIoYXJyYXkoJ0NvbXBvc2VyQXV0b2xvYWRlckluaXQkc3VmZml4JywgJ2xvYWRDbGFzc0xvYWRlcicpKTsKCgpDTEFTU0xPQURFUl9JTklUOwoKaWYgKCR1c2VJbmNsdWRlUGF0aCkgewokZmlsZSAuPSA8PDwnSU5DTFVERV9QQVRIJwogICAgICAgICRpbmNsdWRlUGF0aHMgPSByZXF1aXJlIF9fRElSX18gLiAnL2luY2x1ZGVfcGF0aHMucGhwJzsKICAgICAgICAkaW5jbHVkZVBhdGhzW10gPSBnZXRfaW5jbHVkZV9wYXRoKCk7CiAgICAgICAgc2V0X2luY2x1ZGVfcGF0aChpbXBsb2RlKFBBVEhfU0VQQVJBVE9SLCAkaW5jbHVkZVBhdGhzKSk7CgoKSU5DTFVERV9QQVRIOwp9CgoKJGZpbGUgLj0gPDw8U1RBVElDX0lOSVQKICAgICAgICByZXF1aXJlIF9fRElSX18gLiAnL2F1dG9sb2FkX3N0YXRpYy5waHAnOwogICAgICAgIGNhbGxfdXNlcl9mdW5jKFxDb21wb3NlclxBdXRvbG9hZFxDb21wb3NlclN0YXRpY0luaXQkc3VmZml4OjpnZXRJbml0aWFsaXplcihcJGxvYWRlcikpOwoKClNUQVRJQ19JTklUOwoKaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpIHsKJGZpbGUgLj0gPDw8J0NMQVNTTUFQQVVUSE9SSVRBVElWRScKICAgICAgICAkbG9hZGVyLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUodHJ1ZSk7CgpDTEFTU01BUEFVVEhPUklUQVRJVkU7Cn0KCmlmICgkdGhpcy0+YXBjdSkgewokYXBjdVByZWZpeCA9IHZhcl9leHBvcnQoKCR0aGlzLT5hcGN1UHJlZml4ICE9PSBudWxsID8gJHRoaXMtPmFwY3VQcmVmaXggOiBiaW4yaGV4KHJhbmRvbV9ieXRlcygxMCkpKSwgdHJ1ZSk7CiRmaWxlIC49IDw8PEFQQ1UKICAgICAgICBcJGxvYWRlci0+c2V0QXBjdVByZWZpeCgkYXBjdVByZWZpeCk7CgpBUENVOwp9CgppZiAoJHVzZUdsb2JhbEluY2x1ZGVQYXRoKSB7CiRmaWxlIC49IDw8PCdJTkNMVURFUEFUSCcKICAgICAgICAkbG9hZGVyLT5zZXRVc2VJbmNsdWRlUGF0aCh0cnVlKTsKCklOQ0xVREVQQVRIOwp9CgppZiAoJHRhcmdldERpckxvYWRlcikgewokZmlsZSAuPSA8PDxSRUdJU1RFUl9UQVJHRVRfRElSX0FVVE9MT0FECiAgICAgICAgc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0JHN1ZmZpeCcsICdhdXRvbG9hZCcpLCB0cnVlLCB0cnVlKTsKCgpSRUdJU1RFUl9UQVJHRVRfRElSX0FVVE9MT0FEOwp9CgokZmlsZSAuPSA8PDxSRUdJU1RFUl9MT0FERVIKICAgICAgICBcJGxvYWRlci0+cmVnaXN0ZXIoJHByZXBlbmRBdXRvbG9hZGVyKTsKCgpSRUdJU1RFUl9MT0FERVI7CgppZiAoJHVzZUluY2x1ZGVGaWxlcykgewokZmlsZSAuPSA8PDxJTkNMVURFX0ZJTEVTCiAgICAgICAgXCRmaWxlc1RvTG9hZCA9IFxDb21wb3NlclxBdXRvbG9hZFxDb21wb3NlclN0YXRpY0luaXQkc3VmZml4OjpcJGZpbGVzOwogICAgICAgIFwkcmVxdWlyZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24gKFwkZmlsZUlkZW50aWZpZXIsIFwkZmlsZSkgewogICAgICAgICAgICBpZiAoZW1wdHkoXCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bXCRmaWxlSWRlbnRpZmllcl0pKSB7CiAgICAgICAgICAgICAgICBcJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVtcJGZpbGVJZGVudGlmaWVyXSA9IHRydWU7CgogICAgICAgICAgICAgICAgcmVxdWlyZSBcJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9LCBudWxsLCBudWxsKTsKICAgICAgICBmb3JlYWNoIChcJGZpbGVzVG9Mb2FkIGFzIFwkZmlsZUlkZW50aWZpZXIgPT4gXCRmaWxlKSB7CiAgICAgICAgICAgIFwkcmVxdWlyZUZpbGUoXCRmaWxlSWRlbnRpZmllciwgXCRmaWxlKTsKICAgICAgICB9CgoKSU5DTFVERV9GSUxFUzsKfQoKJGZpbGUgLj0gPDw8TUVUSE9EX0ZPT1RFUgogICAgICAgIHJldHVybiBcJGxvYWRlcjsKICAgIH0KCk1FVEhPRF9GT09URVI7CgokZmlsZSAuPSAkdGFyZ2V0RGlyTG9hZGVyOwoKcmV0dXJuICRmaWxlIC4gPDw8Rk9PVEVSCn0KCkZPT1RFUjsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U3RhdGljRmlsZShzdHJpbmcgJHN1ZmZpeCwgc3RyaW5nICR0YXJnZXREaXIsIHN0cmluZyAkdmVuZG9yUGF0aCwgc3RyaW5nICRiYXNlUGF0aCkKewokZmlsZSA9IDw8PEhFQURFUgo8P3BocAoKLy8gYXV0b2xvYWRfc3RhdGljLnBocCBAZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCgpuYW1lc3BhY2UgQ29tcG9zZXJcQXV0b2xvYWQ7CgpjbGFzcyBDb21wb3NlclN0YXRpY0luaXQkc3VmZml4CnsKCkhFQURFUjsKCiRsb2FkZXIgPSBuZXcgQ2xhc3NMb2FkZXIoKTsKCiRtYXAgPSByZXF1aXJlICR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX25hbWVzcGFjZXMucGhwJzsKZm9yZWFjaCAoJG1hcCBhcyAkbmFtZXNwYWNlID0+ICRwYXRoKSB7CiRsb2FkZXItPnNldCgkbmFtZXNwYWNlLCAkcGF0aCk7Cn0KCiRtYXAgPSByZXF1aXJlICR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX3BzcjQucGhwJzsKZm9yZWFjaCAoJG1hcCBhcyAkbmFtZXNwYWNlID0+ICRwYXRoKSB7CiRsb2FkZXItPnNldFBzcjQoJG5hbWVzcGFjZSwgJHBhdGgpOwp9CgoKCgoKJGNsYXNzTWFwID0gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9jbGFzc21hcC5waHAnOwppZiAoJGNsYXNzTWFwKSB7CiRsb2FkZXItPmFkZENsYXNzTWFwKCRjbGFzc01hcCk7Cn0KCiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKCiR2ZW5kb3JQYXRoQ29kZSA9ICcgPT4gJyAuICRmaWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZShyZWFscGF0aCgkdGFyZ2V0RGlyKSwgJHZlbmRvclBhdGgsIHRydWUsIHRydWUpIC4gIiAuICcvIjsKJHZlbmRvclBoYXJQYXRoQ29kZSA9ICcgPT4gXCdwaGFyOi8vXCcgLiAnIC4gJGZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKHJlYWxwYXRoKCR0YXJnZXREaXIpLCAkdmVuZG9yUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwokYXBwQmFzZURpckNvZGUgPSAnID0+ICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICRiYXNlUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwokYXBwQmFzZURpclBoYXJDb2RlID0gJyA9PiBcJ3BoYXI6Ly9cJyAuICcgLiAkZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aENvZGUocmVhbHBhdGgoJHRhcmdldERpciksICRiYXNlUGF0aCwgdHJ1ZSwgdHJ1ZSkgLiAiIC4gJy8iOwoKJGFic29sdXRlVmVuZG9yUGF0aENvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgkdmVuZG9yRGlyLCAnXFwvJykgLiAnLycsIHRydWUpLCAwLCAtMSk7CiRhYnNvbHV0ZVZlbmRvclBoYXJQYXRoQ29kZSA9ICcgPT4gJyAuIHN1YnN0cih2YXJfZXhwb3J0KHJ0cmltKCdwaGFyOi8vJyAuICR2ZW5kb3JEaXIsICdcXC8nKSAuICcvJywgdHJ1ZSksIDAsIC0xKTsKJGFic29sdXRlQXBwQmFzZURpckNvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgkYmFzZURpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwokYWJzb2x1dGVBcHBCYXNlRGlyUGhhckNvZGUgPSAnID0+ICcgLiBzdWJzdHIodmFyX2V4cG9ydChydHJpbSgncGhhcjovLycgLiAkYmFzZURpciwgJ1xcLycpIC4gJy8nLCB0cnVlKSwgMCwgLTEpOwoKJGluaXRpYWxpemVyID0gJyc7CiRwcmVmaXggPSAiXDBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlclwwIjsKJHByZWZpeExlbiA9IHN0cmxlbigkcHJlZml4KTsKaWYgKGZpbGVfZXhpc3RzKCR0YXJnZXREaXIgLiAnL2F1dG9sb2FkX2ZpbGVzLnBocCcpKSB7CiRtYXBzID0gWydmaWxlcycgPT4gcmVxdWlyZSAkdGFyZ2V0RGlyIC4gJy9hdXRvbG9hZF9maWxlcy5waHAnXTsKfSBlbHNlIHsKJG1hcHMgPSBbXTsKfQoKZm9yZWFjaCAoKGFycmF5KSAkbG9hZGVyIGFzICRwcm9wID0+ICR2YWx1ZSkgewppZiAoIWlzX2FycmF5KCR2YWx1ZSkgfHwgXGNvdW50KCR2YWx1ZSkgPT09IDAgfHwgIXN0cl9zdGFydHNfd2l0aCgkcHJvcCwgJHByZWZpeCkpIHsKY29udGludWU7Cn0KJG1hcHNbc3Vic3RyKCRwcm9wLCAkcHJlZml4TGVuKV0gPSAkdmFsdWU7Cn0KCmZvcmVhY2ggKCRtYXBzIGFzICRwcm9wID0+ICR2YWx1ZSkgewokdmFsdWUgPSBzdHJ0cigKdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpLApbCiRhYnNvbHV0ZVZlbmRvclBhdGhDb2RlID0+ICR2ZW5kb3JQYXRoQ29kZSwKJGFic29sdXRlVmVuZG9yUGhhclBhdGhDb2RlID0+ICR2ZW5kb3JQaGFyUGF0aENvZGUsCiRhYnNvbHV0ZUFwcEJhc2VEaXJDb2RlID0+ICRhcHBCYXNlRGlyQ29kZSwKJGFic29sdXRlQXBwQmFzZURpclBoYXJDb2RlID0+ICRhcHBCYXNlRGlyUGhhckNvZGUsCl0KKTsKJHZhbHVlID0gbHRyaW0oUHJlZzo6cmVwbGFjZSgnL14gKi9tJywgJyAgICAkMCQwJywgJHZhbHVlKSk7CiR2YWx1ZSA9IFByZWc6OnJlcGxhY2UoJy8gKyQvbScsICcnLCAkdmFsdWUpOwoKJGZpbGUgLj0gc3ByaW50ZigiICAgIHB1YmxpYyBzdGF0aWMgJCVzID0gJXM7XG5cbiIsICRwcm9wLCAkdmFsdWUpOwppZiAoJ2ZpbGVzJyAhPT0gJHByb3ApIHsKJGluaXRpYWxpemVyIC49ICIgICAgICAgICAgICBcJGxvYWRlci0+JHByb3AgPSBDb21wb3NlclN0YXRpY0luaXQkc3VmZml4OjpcJCRwcm9wO1xuIjsKfQp9CgpyZXR1cm4gJGZpbGUgLiA8PDxJTklUSUFMSVpFUgogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbml0aWFsaXplcihDbGFzc0xvYWRlciBcJGxvYWRlcikKICAgIHsKICAgICAgICByZXR1cm4gXENsb3N1cmU6OmJpbmQoZnVuY3Rpb24gKCkgdXNlIChcJGxvYWRlcikgewokaW5pdGlhbGl6ZXIKICAgICAgICB9LCBudWxsLCBDbGFzc0xvYWRlcjo6Y2xhc3MpOwogICAgfQp9CgpJTklUSUFMSVpFUjsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VBdXRvbG9hZHNUeXBlKGFycmF5ICRwYWNrYWdlTWFwLCBzdHJpbmcgJHR5cGUsIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSkKewokYXV0b2xvYWRzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewpbJHBhY2thZ2UsICRpbnN0YWxsUGF0aF0gPSAkaXRlbTsKCgppZiAobnVsbCA9PT0gJGluc3RhbGxQYXRoKSB7CmNvbnRpbnVlOwp9CgokYXV0b2xvYWQgPSAkcGFja2FnZS0+Z2V0QXV0b2xvYWQoKTsKaWYgKCR0aGlzLT5kZXZNb2RlICYmICRwYWNrYWdlID09PSAkcm9vdFBhY2thZ2UpIHsKJGF1dG9sb2FkID0gYXJyYXlfbWVyZ2VfcmVjdXJzaXZlKCRhdXRvbG9hZCwgJHBhY2thZ2UtPmdldERldkF1dG9sb2FkKCkpOwp9CgoKaWYgKCFpc3NldCgkYXV0b2xvYWRbJHR5cGVdKSB8fCAhaXNfYXJyYXkoJGF1dG9sb2FkWyR0eXBlXSkpIHsKY29udGludWU7Cn0KaWYgKG51bGwgIT09ICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSAmJiAkcGFja2FnZSAhPT0gJHJvb3RQYWNrYWdlKSB7CiRpbnN0YWxsUGF0aCA9IHN1YnN0cigkaW5zdGFsbFBhdGgsIDAsIC1zdHJsZW4oJy8nLiRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSkpOwp9Cgpmb3JlYWNoICgkYXV0b2xvYWRbJHR5cGVdIGFzICRuYW1lc3BhY2UgPT4gJHBhdGhzKSB7CmlmIChpbl9hcnJheSgkdHlwZSwgWydwc3ItNCcsICdwc3ItMCddLCB0cnVlKSkgewoKJG5hbWVzcGFjZSA9IGx0cmltKCRuYW1lc3BhY2UsICdcXCcpOwp9CmZvcmVhY2ggKChhcnJheSkgJHBhdGhzIGFzICRwYXRoKSB7CmlmICgoJHR5cGUgPT09ICdmaWxlcycgfHwgJHR5cGUgPT09ICdjbGFzc21hcCcgfHwgJHR5cGUgPT09ICdleGNsdWRlLWZyb20tY2xhc3NtYXAnKSAmJiAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkgJiYgIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGluc3RhbGxQYXRoLicvJy4kcGF0aCkpIHsKCmlmICgkcGFja2FnZSA9PT0gJHJvb3RQYWNrYWdlKSB7CiR0YXJnZXREaXIgPSBzdHJfcmVwbGFjZSgnXFw8ZGlyc2VwXFw+JywgJ1tcXFxcL10nLCBwcmVnX3F1b3RlKHN0cl9yZXBsYWNlKFsnLycsICdcXCddLCAnPGRpcnNlcD4nLCAkcGFja2FnZS0+Z2V0VGFyZ2V0RGlyKCkpKSk7CiRwYXRoID0gbHRyaW0oUHJlZzo6cmVwbGFjZSgne14nLiR0YXJnZXREaXIuJ30nLCAnJywgbHRyaW0oJHBhdGgsICdcXC8nKSksICdcXC8nKTsKfSBlbHNlIHsKCiRwYXRoID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpIC4gJy8nIC4gJHBhdGg7Cn0KfQoKaWYgKCR0eXBlID09PSAnZXhjbHVkZS1mcm9tLWNsYXNzbWFwJykgewoKJHBhdGggPSBQcmVnOjpyZXBsYWNlKCd7Lyt9JywgJy8nLCBwcmVnX3F1b3RlKHRyaW0oc3RydHIoJHBhdGgsICdcXCcsICcvJyksICcvJykpKTsKCgokcGF0aCA9IHN0cnRyKCRwYXRoLCBbJ1xcKlxcKicgPT4gJy4rPycsICdcXConID0+ICdbXi9dKz8nXSk7CgoKJHVwZGlyID0gbnVsbDsKJHBhdGggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soCid7XigoPzooPzpcXFxcXFwuKXsxLDJ9Ky8pKyl9JywKc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgmJHVwZGlyKTogc3RyaW5nIHsKCiR1cGRpciA9IHN0cl9yZXBsYWNlKCdcXC4nLCAnLicsICRtYXRjaGVzWzFdKTsKCnJldHVybiAnJzsKfSwKJHBhdGgKKTsKaWYgKGVtcHR5KCRpbnN0YWxsUGF0aCkpIHsKJGluc3RhbGxQYXRoID0gc3RydHIoUGxhdGZvcm06OmdldEN3ZCgpLCAnXFwnLCAnLycpOwp9CgokcmVzb2x2ZWRQYXRoID0gcmVhbHBhdGgoJGluc3RhbGxQYXRoIC4gJy8nIC4gJHVwZGlyKTsKaWYgKGZhbHNlID09PSAkcmVzb2x2ZWRQYXRoKSB7CmNvbnRpbnVlOwp9CiRhdXRvbG9hZHNbXSA9IHByZWdfcXVvdGUoc3RydHIoJHJlc29sdmVkUGF0aCwgJ1xcJywgJy8nKSkgLiAnLycgLiAkcGF0aCAuICcoJHwvKSc7CmNvbnRpbnVlOwp9CgokcmVsYXRpdmVQYXRoID0gZW1wdHkoJGluc3RhbGxQYXRoKSA/IChlbXB0eSgkcGF0aCkgPyAnLicgOiAkcGF0aCkgOiAkaW5zdGFsbFBhdGguJy8nLiRwYXRoOwoKaWYgKCR0eXBlID09PSAnZmlsZXMnKSB7CiRhdXRvbG9hZHNbJHRoaXMtPmdldEZpbGVJZGVudGlmaWVyKCRwYWNrYWdlLCAkcGF0aCldID0gJHJlbGF0aXZlUGF0aDsKY29udGludWU7Cn0KaWYgKCR0eXBlID09PSAnY2xhc3NtYXAnKSB7CiRhdXRvbG9hZHNbXSA9ICRyZWxhdGl2ZVBhdGg7CmNvbnRpbnVlOwp9CgokYXV0b2xvYWRzWyRuYW1lc3BhY2VdW10gPSAkcmVsYXRpdmVQYXRoOwp9Cn0KfQoKcmV0dXJuICRhdXRvbG9hZHM7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRGaWxlSWRlbnRpZmllcihQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpCnsKCnJldHVybiBoYXNoKCdtZDUnLCAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJzonIC4gJHBhdGgpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmlsdGVyUGFja2FnZU1hcChhcnJheSAkcGFja2FnZU1hcCwgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlKQp7CiRwYWNrYWdlcyA9IFtdOwokaW5jbHVkZSA9IFtdOwokcmVwbGFjZWRCeSA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2VNYXAgYXMgJGl0ZW0pIHsKJHBhY2thZ2UgPSAkaXRlbVswXTsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokcGFja2FnZXNbJG5hbWVdID0gJHBhY2thZ2U7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CiRyZXBsYWNlZEJ5WyRyZXBsYWNlLT5nZXRUYXJnZXQoKV0gPSAkbmFtZTsKfQp9CgokYWRkID0gc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB1c2UgKCYkYWRkLCAkcGFja2FnZXMsICYkaW5jbHVkZSwgJHJlcGxhY2VkQnkpOiB2b2lkIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHRhcmdldCA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKaWYgKGlzc2V0KCRyZXBsYWNlZEJ5WyR0YXJnZXRdKSkgewokdGFyZ2V0ID0gJHJlcGxhY2VkQnlbJHRhcmdldF07Cn0KaWYgKCFpc3NldCgkaW5jbHVkZVskdGFyZ2V0XSkpIHsKJGluY2x1ZGVbJHRhcmdldF0gPSB0cnVlOwppZiAoaXNzZXQoJHBhY2thZ2VzWyR0YXJnZXRdKSkgewokYWRkKCRwYWNrYWdlc1skdGFyZ2V0XSk7Cn0KfQp9Cn07CiRhZGQoJHJvb3RQYWNrYWdlKTsKCnJldHVybiBhcnJheV9maWx0ZXIoCiRwYWNrYWdlTWFwLApzdGF0aWMgZnVuY3Rpb24gKCRpdGVtKSB1c2UgKCRpbmNsdWRlKTogYm9vbCB7CiRwYWNrYWdlID0gJGl0ZW1bMF07CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmIChpc3NldCgkaW5jbHVkZVskbmFtZV0pKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQopOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzb3J0UGFja2FnZU1hcChhcnJheSAkcGFja2FnZU1hcCkKewokcGFja2FnZXMgPSBbXTsKJHBhdGhzID0gW107Cgpmb3JlYWNoICgkcGFja2FnZU1hcCBhcyAkaXRlbSkgewpbJHBhY2thZ2UsICRwYXRoXSA9ICRpdGVtOwokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiRwYWNrYWdlc1skbmFtZV0gPSAkcGFja2FnZTsKJHBhdGhzWyRuYW1lXSA9ICRwYXRoOwp9Cgokc29ydGVkUGFja2FnZXMgPSBQYWNrYWdlU29ydGVyOjpzb3J0UGFja2FnZXMoJHBhY2thZ2VzKTsKCiRzb3J0ZWRQYWNrYWdlTWFwID0gW107Cgpmb3JlYWNoICgkc29ydGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokc29ydGVkUGFja2FnZU1hcFtdID0gWyRwYWNrYWdlc1skbmFtZV0sICRwYXRoc1skbmFtZV1dOwp9CgpyZXR1cm4gJHNvcnRlZFBhY2thZ2VNYXA7Cn0KfQoKZnVuY3Rpb24gY29tcG9zZXJSZXF1aXJlKHN0cmluZyAkZmlsZUlkZW50aWZpZXIsIHN0cmluZyAkZmlsZSk6IHZvaWQKewppZiAoZW1wdHkoJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVskZmlsZUlkZW50aWZpZXJdKSkgewokR0xPQkFMU1snX19jb21wb3Nlcl9hdXRvbG9hZF9maWxlcyddWyRmaWxlSWRlbnRpZmllcl0gPSB0cnVlOwoKcmVxdWlyZSAkZmlsZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCnVzZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvclxGaWxlTGlzdDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKCgoKCgpjbGFzcyBDbGFzc01hcEdlbmVyYXRvcgp7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZHVtcChpdGVyYWJsZSAkZGlycywgc3RyaW5nICRmaWxlKTogdm9pZAp7CiRtYXBzID0gW107Cgpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CiRtYXBzID0gYXJyYXlfbWVyZ2UoJG1hcHMsIHN0YXRpYzo6Y3JlYXRlTWFwKCRkaXIpKTsKfQoKZmlsZV9wdXRfY29udGVudHMoJGZpbGUsIHNwcmludGYoJzw/cGhwIHJldHVybiAlczsnLCB2YXJfZXhwb3J0KCRtYXBzLCB0cnVlKSkpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZU1hcCgkcGF0aCwgP3N0cmluZyAkZXhjbHVkZWQgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgP3N0cmluZyAkbmFtZXNwYWNlID0gbnVsbCwgP3N0cmluZyAkYXV0b2xvYWRUeXBlID0gbnVsbCwgYXJyYXkgJiRzY2FubmVkRmlsZXMgPSBbXSk6IGFycmF5CnsKJGdlbmVyYXRvciA9IG5ldyBcQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3JcQ2xhc3NNYXBHZW5lcmF0b3IoWydwaHAnLCAnaW5jJywgJ2hoJ10pOwokZmlsZUxpc3QgPSBuZXcgRmlsZUxpc3QoKTsKJGZpbGVMaXN0LT5maWxlcyA9ICRzY2FubmVkRmlsZXM7CiRnZW5lcmF0b3ItPmF2b2lkRHVwbGljYXRlU2NhbnMoJGZpbGVMaXN0KTsKCiRnZW5lcmF0b3ItPnNjYW5QYXRocygkcGF0aCwgJGV4Y2x1ZGVkLCAkYXV0b2xvYWRUeXBlID8/ICdjbGFzc21hcCcsICRuYW1lc3BhY2UpOwoKJGNsYXNzTWFwID0gJGdlbmVyYXRvci0+Z2V0Q2xhc3NNYXAoKTsKCiRzY2FubmVkRmlsZXMgPSAkZmlsZUxpc3QtPmZpbGVzOwoKaWYgKCRpbyAhPT0gbnVsbCkgewpmb3JlYWNoICgkY2xhc3NNYXAtPmdldFBzclZpb2xhdGlvbnMoKSBhcyAkbXNnKSB7CiRpby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+JG1zZzwvd2FybmluZz4iKTsKfQoKZm9yZWFjaCAoJGNsYXNzTWFwLT5nZXRBbWJpZ3VvdXNDbGFzc2VzKCkgYXMgJGNsYXNzID0+ICRwYXRocykgewppZiAoY291bnQoJHBhdGhzKSA+IDEpIHsKJGlvLT53cml0ZUVycm9yKAonPHdhcm5pbmc+V2FybmluZzogQW1iaWd1b3VzIGNsYXNzIHJlc29sdXRpb24sICInLiRjbGFzcy4nIicuCicgd2FzIGZvdW5kICcuIChjb3VudCgkcGF0aHMpICsgMSkgLid4OiBpbiAiJy4kY2xhc3NNYXAtPmdldENsYXNzUGF0aCgkY2xhc3MpLiciIGFuZCAiJy4gaW1wbG9kZSgnIiwgIicsICRwYXRocykgLiciLCB0aGUgZmlyc3Qgd2lsbCBiZSB1c2VkLjwvd2FybmluZz4nCik7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcigKJzx3YXJuaW5nPldhcm5pbmc6IEFtYmlndW91cyBjbGFzcyByZXNvbHV0aW9uLCAiJy4kY2xhc3MuJyInLgonIHdhcyBmb3VuZCBpbiBib3RoICInLiRjbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzcykuJyIgYW5kICInLiBpbXBsb2RlKCciLCAiJywgJHBhdGhzKSAuJyIsIHRoZSBmaXJzdCB3aWxsIGJlIHVzZWQuPC93YXJuaW5nPicKKTsKfQp9Cn0KCnJldHVybiAkY2xhc3NNYXAtPmdldE1hcCgpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwoKCgoKCgpjbGFzcyBDYWNoZQp7Cgpwcml2YXRlIHN0YXRpYyAkY2FjaGVDb2xsZWN0ZWQgPSBudWxsOwoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRyb290OwoKcHJpdmF0ZSAkZW5hYmxlZCA9IG51bGw7Cgpwcml2YXRlICRhbGxvd2xpc3Q7Cgpwcml2YXRlICRmaWxlc3lzdGVtOwoKcHJpdmF0ZSAkcmVhZE9ubHk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJGNhY2hlRGlyLCBzdHJpbmcgJGFsbG93bGlzdCA9ICdhLXowLTkuXycsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCwgYm9vbCAkcmVhZE9ubHkgPSBmYWxzZSkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yb290ID0gcnRyaW0oJGNhY2hlRGlyLCAnL1xcJykgLiAnLyc7CiR0aGlzLT5hbGxvd2xpc3QgPSAkYWxsb3dsaXN0OwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtKCk7CiR0aGlzLT5yZWFkT25seSA9ICRyZWFkT25seTsKCmlmICghc2VsZjo6aXNVc2FibGUoJGNhY2hlRGlyKSkgewokdGhpcy0+ZW5hYmxlZCA9IGZhbHNlOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWFkT25seShib29sICRyZWFkT25seSkKewokdGhpcy0+cmVhZE9ubHkgPSAkcmVhZE9ubHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1JlYWRPbmx5KCkKewpyZXR1cm4gJHRoaXMtPnJlYWRPbmx5Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVXNhYmxlKHN0cmluZyAkcGF0aCkKewpyZXR1cm4gIVByZWc6OmlzTWF0Y2goJ3soXnxbXFxcXC9dKShcJG51bGx8bnVsfE5VTHwvZGV2L251bGwpKFtcXFxcL118JCl9JywgJHBhdGgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNFbmFibGVkKCkKewppZiAoJHRoaXMtPmVuYWJsZWQgPT09IG51bGwpIHsKJHRoaXMtPmVuYWJsZWQgPSB0cnVlOwoKaWYgKAohJHRoaXMtPnJlYWRPbmx5CiYmICgKKCFpc19kaXIoJHRoaXMtPnJvb3QpICYmICFTaWxlbmNlcjo6Y2FsbCgnbWtkaXInLCAkdGhpcy0+cm9vdCwgMDc3NywgdHJ1ZSkpCnx8ICFpc193cml0YWJsZSgkdGhpcy0+cm9vdCkKKQopIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DYW5ub3QgY3JlYXRlIGNhY2hlIGRpcmVjdG9yeSAnIC4gJHRoaXMtPnJvb3QgLiAnLCBvciBkaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLiBQcm9jZWVkaW5nIHdpdGhvdXQgY2FjaGUuIFNlZSBhbHNvIGNhY2hlLXJlYWQtb25seSBjb25maWcgaWYgeW91ciBmaWxlc3lzdGVtIGlzIHJlYWQtb25seS48L3dhcm5pbmc+Jyk7CiR0aGlzLT5lbmFibGVkID0gZmFsc2U7Cn0KfQoKcmV0dXJuICR0aGlzLT5lbmFibGVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdCgpCnsKcmV0dXJuICR0aGlzLT5yb290Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZChzdHJpbmcgJGZpbGUpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1JlYWRpbmcgJy4kdGhpcy0+cm9vdCAuICRmaWxlLicgZnJvbSBjYWNoZScsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm4gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGNvbnRlbnRzKQp7CiR3YXNFbmFibGVkID0gJHRoaXMtPmVuYWJsZWQgPT09IHRydWU7CgppZiAoJHRoaXMtPmlzRW5hYmxlZCgpICYmICEkdGhpcy0+cmVhZE9ubHkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdXcml0aW5nICcuJHRoaXMtPnJvb3QgLiAkZmlsZS4nIGludG8gY2FjaGUnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKJHRlbXBGaWxlTmFtZSA9ICR0aGlzLT5yb290IC4gJGZpbGUgLiBiaW4yaGV4KHJhbmRvbV9ieXRlcyg1KSkgLiAnLnRtcCc7CnRyeSB7CnJldHVybiBmaWxlX3B1dF9jb250ZW50cygkdGVtcEZpbGVOYW1lLCAkY29udGVudHMpICE9PSBmYWxzZSAmJiByZW5hbWUoJHRlbXBGaWxlTmFtZSwgJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0gY2F0Y2ggKFxFcnJvckV4Y2VwdGlvbiAkZSkgewoKCmlmICgkd2FzRW5hYmxlZCkgewpjbGVhcnN0YXRjYWNoZSgpOwokdGhpcy0+ZW5hYmxlZCA9IG51bGw7CgpyZXR1cm4gJHRoaXMtPndyaXRlKCRmaWxlLCAkY29udGVudHMpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkZhaWxlZCB0byB3cml0ZSBpbnRvIGNhY2hlOiAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwppZiAoUHJlZzo6aXNNYXRjaCgne15maWxlX3B1dF9jb250ZW50c1woXCk6IE9ubHkgKFswLTldKykgb2YgKFswLTldKykgYnl0ZXMgd3JpdHRlbn0nLCAkZS0+Z2V0TWVzc2FnZSgpLCAkbSkpIHsKCnVubGluaygkdGVtcEZpbGVOYW1lKTsKCiRtZXNzYWdlID0gc3ByaW50ZigKJzx3YXJuaW5nPldyaXRpbmcgJTEkcyBpbnRvIGNhY2hlIGZhaWxlZCBhZnRlciAlMiR1IG9mICUzJHUgYnl0ZXMgd3JpdHRlbiwgb25seSAlNCRzIGJ5dGVzIG9mIGZyZWUgc3BhY2UgYXZhaWxhYmxlPC93YXJuaW5nPicsCiR0ZW1wRmlsZU5hbWUsCiRtWzFdLAokbVsyXSwKZnVuY3Rpb25fZXhpc3RzKCdkaXNrX2ZyZWVfc3BhY2UnKSA/IEBkaXNrX2ZyZWVfc3BhY2UoZGlybmFtZSgkdGVtcEZpbGVOYW1lKSkgOiAndW5rbm93bicKKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbWVzc2FnZSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93ICRlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weUZyb20oc3RyaW5nICRmaWxlLCBzdHJpbmcgJHNvdXJjZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpICYmICEkdGhpcy0+cmVhZE9ubHkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKGRpcm5hbWUoJHRoaXMtPnJvb3QgLiAkZmlsZSkpOwoKaWYgKCFmaWxlX2V4aXN0cygkc291cmNlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRzb3VyY2UuJyBkb2VzIG5vdCBleGlzdCwgY2FuIG5vdCB3cml0ZSBpbnRvIGNhY2hlPC9lcnJvcj4nKTsKfSBlbHNlaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignV3JpdGluZyAnLiR0aGlzLT5yb290IC4gJGZpbGUuJyBpbnRvIGNhY2hlIGZyb20gJy4kc291cmNlKTsKfQoKcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtLT5jb3B5KCRzb3VyY2UsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlUbyhzdHJpbmcgJGZpbGUsIHN0cmluZyAkdGFyZ2V0KQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkpIHsKJGZpbGUgPSBQcmVnOjpyZXBsYWNlKCd7W14nLiR0aGlzLT5hbGxvd2xpc3QuJ119aScsICctJywgJGZpbGUpOwppZiAoZmlsZV9leGlzdHMoJHRoaXMtPnJvb3QgLiAkZmlsZSkpIHsKdHJ5IHsKdG91Y2goJHRoaXMtPnJvb3QgLiAkZmlsZSwgKGludCkgZmlsZW10aW1lKCR0aGlzLT5yb290IC4gJGZpbGUpLCB0aW1lKCkpOwp9IGNhdGNoIChcRXJyb3JFeGNlcHRpb24gJGUpIHsKCgpTaWxlbmNlcjo6Y2FsbCgndG91Y2gnLCAkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSZWFkaW5nICcuJHRoaXMtPnJvb3QgLiAkZmlsZS4nIGZyb20gY2FjaGUnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuICR0aGlzLT5maWxlc3lzdGVtLT5jb3B5KCR0aGlzLT5yb290IC4gJGZpbGUsICR0YXJnZXQpOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdjSXNOZWNlc3NhcnkoKQp7CmlmIChzZWxmOjokY2FjaGVDb2xsZWN0ZWQpIHsKcmV0dXJuIGZhbHNlOwp9CgpzZWxmOjokY2FjaGVDb2xsZWN0ZWQgPSB0cnVlOwppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfVEVTVF9TVUlURScpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKFBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAhcmFuZG9tX2ludCgwLCA1MCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoc3RyaW5nICRmaWxlKQp7CmlmICgkdGhpcy0+aXNFbmFibGVkKCkgJiYgISR0aGlzLT5yZWFkT25seSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSkgewpyZXR1cm4gJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkdGhpcy0+cm9vdCAuICRmaWxlKTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhcigpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSAmJiAhJHRoaXMtPnJlYWRPbmx5KSB7CiR0aGlzLT5maWxlc3lzdGVtLT5lbXB0eURpcmVjdG9yeSgkdGhpcy0+cm9vdCk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFnZShzdHJpbmcgJGZpbGUpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSAmJiAoJG10aW1lID0gZmlsZW10aW1lKCR0aGlzLT5yb290IC4gJGZpbGUpKSAhPT0gZmFsc2UpIHsKcmV0dXJuIGFicyh0aW1lKCkgLSAkbXRpbWUpOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdjKGludCAkdHRsLCBpbnQgJG1heFNpemUpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSAmJiAhJHRoaXMtPnJlYWRPbmx5KSB7CiRleHBpcmUgPSBuZXcgXERhdGVUaW1lKCk7CiRleHBpcmUtPm1vZGlmeSgnLScuJHR0bC4nIHNlY29uZHMnKTsKCiRmaW5kZXIgPSAkdGhpcy0+Z2V0RmluZGVyKCktPmRhdGUoJ3VudGlsICcuJGV4cGlyZS0+Zm9ybWF0KCdZLW0tZCBIOmk6cycpKTsKZm9yZWFjaCAoJGZpbmRlciBhcyAkZmlsZSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQoKJHRvdGFsU2l6ZSA9ICR0aGlzLT5maWxlc3lzdGVtLT5zaXplKCR0aGlzLT5yb290KTsKaWYgKCR0b3RhbFNpemUgPiAkbWF4U2l6ZSkgewokaXRlcmF0b3IgPSAkdGhpcy0+Z2V0RmluZGVyKCktPnNvcnRCeUFjY2Vzc2VkVGltZSgpLT5nZXRJdGVyYXRvcigpOwp3aGlsZSAoJHRvdGFsU2l6ZSA+ICRtYXhTaXplICYmICRpdGVyYXRvci0+dmFsaWQoKSkgewokZmlsZXBhdGggPSAkaXRlcmF0b3ItPmN1cnJlbnQoKS0+Z2V0UGF0aG5hbWUoKTsKJHRvdGFsU2l6ZSAtPSAkdGhpcy0+ZmlsZXN5c3RlbS0+c2l6ZSgkZmlsZXBhdGgpOwokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRmaWxlcGF0aCk7CiRpdGVyYXRvci0+bmV4dCgpOwp9Cn0KCnNlbGY6OiRjYWNoZUNvbGxlY3RlZCA9IHRydWU7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2NWY3NDYWNoZShpbnQgJHR0bCk6IGJvb2wKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpKSB7CiRleHBpcmUgPSBuZXcgXERhdGVUaW1lKCk7CiRleHBpcmUtPm1vZGlmeSgnLScuJHR0bC4nIHNlY29uZHMnKTsKCiRmaW5kZXIgPSBGaW5kZXI6OmNyZWF0ZSgpLT5pbigkdGhpcy0+cm9vdCktPmRpcmVjdG9yaWVzKCktPmRlcHRoKDApLT5kYXRlKCd1bnRpbCAnLiRleHBpcmUtPmZvcm1hdCgnWS1tLWQgSDppOnMnKSk7CmZvcmVhY2ggKCRmaW5kZXIgYXMgJGZpbGUpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KCnNlbGY6OiRjYWNoZUNvbGxlY3RlZCA9IHRydWU7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hhMShzdHJpbmcgJGZpbGUpCnsKaWYgKCR0aGlzLT5pc0VuYWJsZWQoKSkgewokZmlsZSA9IFByZWc6OnJlcGxhY2UoJ3tbXicuJHRoaXMtPmFsbG93bGlzdC4nXX1pJywgJy0nLCAkZmlsZSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+cm9vdCAuICRmaWxlKSkgewpyZXR1cm4gaGFzaF9maWxlKCdzaGExJywgJHRoaXMtPnJvb3QgLiAkZmlsZSk7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hhMjU2KHN0cmluZyAkZmlsZSkKewppZiAoJHRoaXMtPmlzRW5hYmxlZCgpKSB7CiRmaWxlID0gUHJlZzo6cmVwbGFjZSgne1teJy4kdGhpcy0+YWxsb3dsaXN0LiddfWknLCAnLScsICRmaWxlKTsKaWYgKGZpbGVfZXhpc3RzKCR0aGlzLT5yb290IC4gJGZpbGUpKSB7CnJldHVybiBoYXNoX2ZpbGUoJ3NoYTI1NicsICR0aGlzLT5yb290IC4gJGZpbGUpOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEZpbmRlcigpCnsKcmV0dXJuIEZpbmRlcjo6Y3JlYXRlKCktPmluKCR0aGlzLT5yb290KS0+ZmlsZXMoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIEFib3V0Q29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdhYm91dCcpCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIGEgc2hvcnQgaW5mb3JtYXRpb24gYWJvdXQgQ29tcG9zZXInKQotPnNldEhlbHAoCjw8PEVPVAo8aW5mbz5waHAgY29tcG9zZXIucGhhciBhYm91dDwvaW5mbz4KRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyVmVyc2lvbiA9IENvbXBvc2VyOjpnZXRWZXJzaW9uKCk7CgokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoCjw8PEVPVAo8aW5mbz5Db21wb3NlciAtIERlcGVuZGVuY3kgTWFuYWdlciBmb3IgUEhQIC0gdmVyc2lvbiAkY29tcG9zZXJWZXJzaW9uPC9pbmZvPgo8Y29tbWVudD5Db21wb3NlciBpcyBhIGRlcGVuZGVuY3kgbWFuYWdlciB0cmFja2luZyBsb2NhbCBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0cyBhbmQgbGlicmFyaWVzLgpTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvY29tbWVudD4KRU9UCik7CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcTG9vcDsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBBcmNoaXZlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByaXZhdGUgY29uc3QgRk9STUFUUyA9IFsndGFyJywgJ3Rhci5neicsICd0YXIuYnoyJywgJ3ppcCddOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdhcmNoaXZlJykKLT5zZXREZXNjcmlwdGlvbignQ3JlYXRlcyBhbiBhcmNoaXZlIG9mIHRoaXMgY29tcG9zZXIgcGFja2FnZScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgcGFja2FnZSB0byBhcmNoaXZlIGluc3RlYWQgb2YgdGhlIGN1cnJlbnQgcHJvamVjdCcsIG51bGwsICR0aGlzLT5zdWdnZXN0QXZhaWxhYmxlUGFja2FnZSgpKSwKbmV3IElucHV0QXJndW1lbnQoJ3ZlcnNpb24nLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ0EgdmVyc2lvbiBjb25zdHJhaW50IHRvIGZpbmQgdGhlIHBhY2thZ2UgdG8gYXJjaGl2ZScpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSByZXN1bHRpbmcgYXJjaGl2ZTogdGFyLCB0YXIuZ3osIHRhci5iejIgb3IgemlwIChkZWZhdWx0IHRhciknLCBudWxsLCBzZWxmOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCdkaXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdXcml0ZSB0aGUgYXJjaGl2ZSB0byB0aGlzIGRpcmVjdG9yeScpLApuZXcgSW5wdXRPcHRpb24oJ2ZpbGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdXcml0ZSB0aGUgYXJjaGl2ZSB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUuJwouJyBOb3RlIHRoYXQgdGhlIGZvcm1hdCB3aWxsIGJlIGFwcGVuZGVkLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1maWx0ZXJzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgZmlsdGVycyB3aGVuIHNhdmluZyBwYWNrYWdlJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5hcmNoaXZlPC9pbmZvPiBjb21tYW5kIGNyZWF0ZXMgYW4gYXJjaGl2ZSBvZiB0aGUgc3BlY2lmaWVkIGZvcm1hdApjb250YWluaW5nIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgb2YgdGhlIENvbXBvc2VyIHByb2plY3Qgb3IgdGhlIHNwZWNpZmllZApwYWNrYWdlIGluIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiBhbmQgd3JpdGVzIGl0IHRvIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5LgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgYXJjaGl2ZSBbLS1mb3JtYXQ9emlwXSBbLS1kaXI9L2Zvb10gWy0tZmlsZT1maWxlbmFtZV0gW3BhY2thZ2UgW3ZlcnNpb25dXTwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2FyY2hpdmUKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CiRjb25maWcgPSBudWxsOwoKaWYgKCRjb21wb3NlcikgewokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnYXJjaGl2ZScsICRpbnB1dCwgJG91dHB1dCk7CiRldmVudERpc3BhdGNoZXIgPSAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBSRV9BUkNISVZFX0NNRCk7Cn0KCmlmICghJGNvbmZpZykgewokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7Cn0KCiRmb3JtYXQgPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0JykgPz8gJGNvbmZpZy0+Z2V0KCdhcmNoaXZlLWZvcm1hdCcpOwokZGlyID0gJGlucHV0LT5nZXRPcHRpb24oJ2RpcicpID8/ICRjb25maWctPmdldCgnYXJjaGl2ZS1kaXInKTsKCiRyZXR1cm5Db2RlID0gJHRoaXMtPmFyY2hpdmUoCiR0aGlzLT5nZXRJTygpLAokY29uZmlnLAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyksCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ3ZlcnNpb24nKSwKJGZvcm1hdCwKJGRpciwKJGlucHV0LT5nZXRPcHRpb24oJ2ZpbGUnKSwKJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1maWx0ZXJzJyksCiRjb21wb3NlcgopOwoKaWYgKDAgPT09ICRyZXR1cm5Db2RlICYmICRjb21wb3NlcikgewokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfQVJDSElWRV9DTUQpOwp9CgpyZXR1cm4gJHJldHVybkNvZGU7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhcmNoaXZlKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9zdHJpbmcgJHBhY2thZ2VOYW1lLCA/c3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJGZvcm1hdCwgc3RyaW5nICRkZXN0LCA/c3RyaW5nICRmaWxlTmFtZSwgYm9vbCAkaWdub3JlRmlsdGVycywgP0NvbXBvc2VyICRjb21wb3Nlcik6IGludAp7CmlmICgkY29tcG9zZXIpIHsKJGFyY2hpdmVNYW5hZ2VyID0gJGNvbXBvc2VyLT5nZXRBcmNoaXZlTWFuYWdlcigpOwp9IGVsc2UgewokZmFjdG9yeSA9IG5ldyBGYWN0b3J5OwokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKJGh0dHBEb3dubG9hZGVyID0gRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKJGRvd25sb2FkTWFuYWdlciA9ICRmYWN0b3J5LT5jcmVhdGVEb3dubG9hZE1hbmFnZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRwcm9jZXNzKTsKJGFyY2hpdmVNYW5hZ2VyID0gJGZhY3RvcnktPmNyZWF0ZUFyY2hpdmVNYW5hZ2VyKCRjb25maWcsICRkb3dubG9hZE1hbmFnZXIsIG5ldyBMb29wKCRodHRwRG93bmxvYWRlciwgJHByb2Nlc3MpKTsKfQoKaWYgKCRwYWNrYWdlTmFtZSkgewokcGFja2FnZSA9ICR0aGlzLT5zZWxlY3RQYWNrYWdlKCRpbywgJHBhY2thZ2VOYW1lLCAkdmVyc2lvbik7CgppZiAoISRwYWNrYWdlKSB7CnJldHVybiAxOwp9Cn0gZWxzZSB7CiRwYWNrYWdlID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRQYWNrYWdlKCk7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+Q3JlYXRpbmcgdGhlIGFyY2hpdmUgaW50byAiJy4kZGVzdC4nIi48L2luZm8+Jyk7CiRwYWNrYWdlUGF0aCA9ICRhcmNoaXZlTWFuYWdlci0+YXJjaGl2ZSgkcGFja2FnZSwgJGZvcm1hdCwgJGRlc3QsICRmaWxlTmFtZSwgJGlnbm9yZUZpbHRlcnMpOwokZnMgPSBuZXcgRmlsZXN5c3RlbTsKJHNob3J0UGF0aCA9ICRmcy0+ZmluZFNob3J0ZXN0UGF0aChQbGF0Zm9ybTo6Z2V0Q3dkKCksICRwYWNrYWdlUGF0aCwgdHJ1ZSk7CgokaW8tPndyaXRlRXJyb3IoJ0NyZWF0ZWQ6ICcsIGZhbHNlKTsKJGlvLT53cml0ZShzdHJsZW4oJHNob3J0UGF0aCkgPCBzdHJsZW4oJHBhY2thZ2VQYXRoKSA/ICRzaG9ydFBhdGggOiAkcGFja2FnZVBhdGgpOwoKcmV0dXJuIDA7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzZWxlY3RQYWNrYWdlKElPSW50ZXJmYWNlICRpbywgc3RyaW5nICRwYWNrYWdlTmFtZSwgP3N0cmluZyAkdmVyc2lvbiA9IG51bGwpCnsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5TZWFyY2hpbmcgZm9yIHRoZSBzcGVjaWZpZWQgcGFja2FnZS48L2luZm8+Jyk7CgppZiAoJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCkpIHsKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRyZXBvID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoWyRsb2NhbFJlcG9dLCAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKSk7CiRtaW5TdGFiaWxpdHkgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpOwp9IGVsc2UgewokZGVmYXVsdFJlcG9zID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcigkaW8pOwokaW8tPndyaXRlRXJyb3IoJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBzZWFyY2hpbmcgcGFja2FnZXMgZnJvbSAnIC4gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRkZWZhdWx0UmVwb3MpKSk7CiRyZXBvID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJGRlZmF1bHRSZXBvcyk7CiRtaW5TdGFiaWxpdHkgPSAnc3RhYmxlJzsKfQoKaWYgKCR2ZXJzaW9uICE9PSBudWxsICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3tAKHN0YWJsZXxSQ3xiZXRhfGFscGhhfGRldikkfWknLCAkdmVyc2lvbiwgJG1hdGNoKSkgewokbWluU3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCRtYXRjaFsxXSk7CiR2ZXJzaW9uID0gKHN0cmluZykgc3Vic3RyKCR2ZXJzaW9uLCAwLCAtc3RybGVuKCRtYXRjaFswXSkpOwp9CgokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRtaW5TdGFiaWxpdHkpOwokcmVwb1NldC0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uICE9PSBudWxsID8gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkdmVyc2lvbikgOiBudWxsOwokcGFja2FnZXMgPSAkcmVwb1NldC0+ZmluZFBhY2thZ2VzKHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKSwgJGNvbnN0cmFpbnQpOwoKaWYgKGNvdW50KCRwYWNrYWdlcykgPiAxKSB7CiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKCRyZXBvU2V0KTsKJHBhY2thZ2UgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZShzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSksICR2ZXJzaW9uLCAkbWluU3RhYmlsaXR5KTsKaWYgKCRwYWNrYWdlID09PSBmYWxzZSkgewokcGFja2FnZSA9IHJlc2V0KCRwYWNrYWdlcyk7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+Rm91bmQgbXVsdGlwbGUgbWF0Y2hlcywgc2VsZWN0ZWQgJy4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCkuJy48L2luZm8+Jyk7CiRpby0+d3JpdGVFcnJvcignQWx0ZXJuYXRpdmVzIHdlcmUgJy5pbXBsb2RlKCcsICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRwKTogc3RyaW5nIHsKcmV0dXJuICRwLT5nZXRQcmV0dHlTdHJpbmcoKTsKfSwgJHBhY2thZ2VzKSkuJy4nKTsKJGlvLT53cml0ZUVycm9yKCc8Y29tbWVudD5QbGVhc2UgdXNlIGEgbW9yZSBzcGVjaWZpYyBjb25zdHJhaW50IHRvIHBpY2sgYSBkaWZmZXJlbnQgcGFja2FnZS48L2NvbW1lbnQ+Jyk7Cn0gZWxzZWlmIChjb3VudCgkcGFja2FnZXMpID09PSAxKSB7CiRwYWNrYWdlID0gcmVzZXQoJHBhY2thZ2VzKTsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5Gb3VuZCBhbiBleGFjdCBtYXRjaCAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nLjwvaW5mbz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q291bGQgbm90IGZpbmQgYSBwYWNrYWdlIG1hdGNoaW5nICcuJHBhY2thZ2VOYW1lLicuPC9lcnJvcj4nKTsKCnJldHVybiBmYWxzZTsKfQoKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdFeHBlY3RlZCBhIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSBpbnN0YW5jZSBidXQgZm91bmQgJy5nZXRfY2xhc3MoJHBhY2thZ2UpKTsKfQppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQmFzZVBhY2thZ2UpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSBCYXNlUGFja2FnZSBpbnN0YW5jZSBidXQgZm91bmQgJy5nZXRfY2xhc3MoJHBhY2thZ2UpKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRDb25maWc7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKY2xhc3MgQXVkaXRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2F1ZGl0JykKLT5zZXREZXNjcmlwdGlvbignQ2hlY2tzIGZvciBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFkdmlzb3JpZXMgZm9yIGluc3RhbGxlZCBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBhdWRpdGluZyBvZiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ091dHB1dCBmb3JtYXQuIE11c3QgYmUgInRhYmxlIiwgInBsYWluIiwgImpzb24iLCBvciAic3VtbWFyeSIuJywgQXVkaXRvcjo6Rk9STUFUX1RBQkxFLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0F1ZGl0IGJhc2VkIG9uIHRoZSBsb2NrIGZpbGUgaW5zdGVhZCBvZiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FiYW5kb25lZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0JlaGF2aW9yIG9uIGFiYW5kb25lZCBwYWNrYWdlcy4gTXVzdCBiZSAiaWdub3JlIiwgInJlcG9ydCIsIG9yICJmYWlsIi4nLCBudWxsLCBBdWRpdG9yOjpBQkFORE9ORURTKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtc2V2ZXJpdHknLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVkgfCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdJZ25vcmUgYWR2aXNvcmllcyBvZiBhIGNlcnRhaW4gc2V2ZXJpdHkgbGV2ZWwuJywgW10sIFsnbG93JywgJ21lZGl1bScsICdoaWdoJywgJ2NyaXRpY2FsJ10pLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS11bnJlYWNoYWJsZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIHJlcG9zaXRvcmllcyB0aGF0IGFyZSB1bnJlYWNoYWJsZSBvciByZXR1cm4gYSBub24tMjAwIHN0YXR1cyBjb2RlLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+YXVkaXQ8L2luZm8+IGNvbW1hbmQgY2hlY2tzIGZvciBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGFkdmlzb3JpZXMgZm9yIGluc3RhbGxlZCBwYWNrYWdlcy4KCklmIHlvdSBkbyBub3Qgd2FudCB0byBpbmNsdWRlIGRldiBkZXBlbmRlbmNpZXMgaW4gdGhlIGF1ZGl0IHlvdSBjYW4gb21pdCB0aGVtIHdpdGggLS1uby1kZXYKCklmIHlvdSB3YW50IHRvIGlnbm9yZSByZXBvc2l0b3JpZXMgdGhhdCBhcmUgdW5yZWFjaGFibGUgb3IgcmV0dXJuIGEgbm9uLTIwMCBzdGF0dXMgY29kZSwgdXNlIC0taWdub3JlLXVucmVhY2hhYmxlCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNhdWRpdApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygkY29tcG9zZXIsICRpbnB1dCk7CgppZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignTm8gcGFja2FnZXMgLSBza2lwcGluZyBhdWRpdC4nKTsKCnJldHVybiAwOwp9CgokYXVkaXRvciA9IG5ldyBBdWRpdG9yKCk7CiRyZXBvU2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoKTsKZm9yZWFjaCAoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewokcmVwb1NldC0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KCiRhdWRpdENvbmZpZyA9IEF1ZGl0Q29uZmlnOjpmcm9tQ29uZmlnKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCkpOwoKJGFiYW5kb25lZCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhYmFuZG9uZWQnKTsKaWYgKCRhYmFuZG9uZWQgIT09IG51bGwgJiYgIWluX2FycmF5KCRhYmFuZG9uZWQsIEF1ZGl0b3I6OkFCQU5ET05FRFMsIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLWFiYW5kb25lZCBtdXN0IGJlIG9uZSBvZiAnLmltcGxvZGUoJywgJywgQXVkaXRvcjo6QUJBTkRPTkVEUykuJy4nKTsKfQoKJGFiYW5kb25lZCA9ICRhYmFuZG9uZWQgPz8gJGF1ZGl0Q29uZmlnLT5hdWRpdEFiYW5kb25lZDsKCiRpZ25vcmVTZXZlcml0aWVzID0gYXJyYXlfbWVyZ2UoYXJyYXlfZmlsbF9rZXlzKCRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtc2V2ZXJpdHknKSwgbnVsbCksICRhdWRpdENvbmZpZy0+aWdub3JlU2V2ZXJpdHlGb3JBdWRpdCk7CiRpZ25vcmVVbnJlYWNoYWJsZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtdW5yZWFjaGFibGUnKSB8fCAkYXVkaXRDb25maWctPmlnbm9yZVVucmVhY2hhYmxlOwoKcmV0dXJuIG1pbigyNTUsICRhdWRpdG9yLT5hdWRpdCgKJHRoaXMtPmdldElPKCksCiRyZXBvU2V0LAokcGFja2FnZXMsCiR0aGlzLT5nZXRBdWRpdEZvcm1hdCgkaW5wdXQsICdmb3JtYXQnKSwKZmFsc2UsCiRhdWRpdENvbmZpZy0+aWdub3JlTGlzdEZvckF1ZGl0LAokYWJhbmRvbmVkLAokaWdub3JlU2V2ZXJpdGllcywKJGlnbm9yZVVucmVhY2hhYmxlLAokYXVkaXRDb25maWctPmlnbm9yZUFiYW5kb25lZEZvckF1ZGl0CikpOwoKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlcyhDb21wb3NlciAkY29tcG9zZXIsIElucHV0SW50ZXJmYWNlICRpbnB1dCk6IGFycmF5CnsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1ZhbGlkIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2sgZmlsZXMgYXJlIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwoKcmV0dXJuICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSktPmdldFBhY2thZ2VzKCk7Cn0KCiRyb290UGtnID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCldKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JykpIHsKcmV0dXJuIFJlcG9zaXRvcnlVdGlsczo6ZmlsdGVyUmVxdWlyZWRQYWNrYWdlcygkaW5zdGFsbGVkUmVwby0+Z2V0UGFja2FnZXMoKSwgJHJvb3RQa2cpOwp9CgpyZXR1cm4gJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFByZUNvbW1hbmRSdW5FdmVudDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdENvbmZpZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGVTZXBhcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlcm1pbmFsOwoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQmFzZUNvbW1hbmQgZXh0ZW5kcyBDb21tYW5kCnsKCgoKcHJpdmF0ZSAkY29tcG9zZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcHBsaWNhdGlvbigpOiBBcHBsaWNhdGlvbgp7CiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCEkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvbXBvc2VyIGNvbW1hbmRzIGNhbiBvbmx5IHdvcmsgd2l0aCBhbiAnLkFwcGxpY2F0aW9uOjpjbGFzcy4nIGluc3RhbmNlIHNldCcpOwp9CgpyZXR1cm4gJGFwcGxpY2F0aW9uOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3Nlcihib29sICRyZXF1aXJlZCA9IHRydWUsID9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpCnsKaWYgKCRyZXF1aXJlZCkgewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KCnJldHVybiAkdGhpcy0+dHJ5Q29tcG9zZXIoJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZUNvbXBvc2VyKD9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiBDb21wb3Nlcgp7CmlmIChudWxsID09PSAkdGhpcy0+Y29tcG9zZXIpIHsKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHsKJHRoaXMtPmNvbXBvc2VyID0gJGFwcGxpY2F0aW9uLT5nZXRDb21wb3Nlcih0cnVlLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7CmFzc2VydCgkdGhpcy0+Y29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3Nlcik7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ0NvdWxkIG5vdCBjcmVhdGUgYSBDb21wb3NlclxDb21wb3NlciBpbnN0YW5jZSwgeW91IG11c3QgaW5qZWN0ICcuCidvbmUgaWYgdGhpcyBjb21tYW5kIGlzIG5vdCB1c2VkIHdpdGggYSBDb21wb3NlclxDb25zb2xlXEFwcGxpY2F0aW9uIGluc3RhbmNlJwopOwp9Cn0KCnJldHVybiAkdGhpcy0+Y29tcG9zZXI7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRyeUNvbXBvc2VyKD9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiA/Q29tcG9zZXIKewppZiAobnVsbCA9PT0gJHRoaXMtPmNvbXBvc2VyKSB7CiRhcHBsaWNhdGlvbiA9IHBhcmVudDo6Z2V0QXBwbGljYXRpb24oKTsKaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uKSB7CiR0aGlzLT5jb21wb3NlciA9ICRhcHBsaWNhdGlvbi0+Z2V0Q29tcG9zZXIoZmFsc2UsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKfQp9CgpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29tcG9zZXIoQ29tcG9zZXIgJGNvbXBvc2VyKQp7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRDb21wb3NlcigpCnsKJHRoaXMtPmNvbXBvc2VyID0gbnVsbDsKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJlc2V0Q29tcG9zZXIoKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Byb3h5Q29tbWFuZCgpCnsKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKQp7CmlmIChudWxsID09PSAkdGhpcy0+aW8pIHsKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24pIHsKJHRoaXMtPmlvID0gJGFwcGxpY2F0aW9uLT5nZXRJTygpOwp9IGVsc2UgewokdGhpcy0+aW8gPSBuZXcgTnVsbElPKCk7Cn0KfQoKcmV0dXJuICR0aGlzLT5pbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElPKElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+aW8gPSAkaW87Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewokZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXREZWZpbml0aW9uKCk7CiRuYW1lID0gKHN0cmluZykgJGlucHV0LT5nZXRDb21wbGV0aW9uTmFtZSgpOwppZiAoQ29tcGxldGlvbklucHV0OjpUWVBFX09QVElPTl9WQUxVRSA9PT0gJGlucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpCiYmICRkZWZpbml0aW9uLT5oYXNPcHRpb24oJG5hbWUpCiYmICgkb3B0aW9uID0gJGRlZmluaXRpb24tPmdldE9wdGlvbigkbmFtZSkpIGluc3RhbmNlb2YgSW5wdXRPcHRpb24KKSB7CiRvcHRpb24tPmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfSBlbHNlaWYgKENvbXBsZXRpb25JbnB1dDo6VFlQRV9BUkdVTUVOVF9WQUxVRSA9PT0gJGlucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpCiYmICRkZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkbmFtZSkKJiYgKCRhcmd1bWVudCA9ICRkZWZpbml0aW9uLT5nZXRBcmd1bWVudCgkbmFtZSkpIGluc3RhbmNlb2YgSW5wdXRBcmd1bWVudAopIHsKJGFyZ3VtZW50LT5jb21wbGV0ZSgkaW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0gZWxzZSB7CnBhcmVudDo6Y29tcGxldGUoJGlucHV0LCAkc3VnZ2VzdGlvbnMpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKCiRkaXNhYmxlUGx1Z2lucyA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXBsdWdpbnMnKTsKJGRpc2FibGVTY3JpcHRzID0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tc2NyaXB0cycpOwoKJGFwcGxpY2F0aW9uID0gcGFyZW50OjpnZXRBcHBsaWNhdGlvbigpOwppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24gJiYgJGFwcGxpY2F0aW9uLT5nZXREaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCgpKSB7CiRkaXNhYmxlUGx1Z2lucyA9IHRydWU7Cn0KaWYgKCRhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIEFwcGxpY2F0aW9uICYmICRhcHBsaWNhdGlvbi0+Z2V0RGlzYWJsZVNjcmlwdHNCeURlZmF1bHQoKSkgewokZGlzYWJsZVNjcmlwdHMgPSB0cnVlOwp9CgppZiAoJHRoaXMgaW5zdGFuY2VvZiBTZWxmVXBkYXRlQ29tbWFuZCkgewokZGlzYWJsZVBsdWdpbnMgPSB0cnVlOwokZGlzYWJsZVNjcmlwdHMgPSB0cnVlOwp9CgokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmIChudWxsID09PSAkY29tcG9zZXIpIHsKJGNvbXBvc2VyID0gRmFjdG9yeTo6Y3JlYXRlR2xvYmFsKCR0aGlzLT5nZXRJTygpLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KaWYgKCRjb21wb3NlcikgewokcHJlQ29tbWFuZFJ1bkV2ZW50ID0gbmV3IFByZUNvbW1hbmRSdW5FdmVudChQbHVnaW5FdmVudHM6OlBSRV9DT01NQU5EX1JVTiwgJGlucHV0LCAkdGhpcy0+Z2V0TmFtZSgpKTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJHByZUNvbW1hbmRSdW5FdmVudC0+Z2V0TmFtZSgpLCAkcHJlQ29tbWFuZFJ1bkV2ZW50KTsKfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKFsnLS1uby1hbnNpJ10pICYmICRpbnB1dC0+aGFzT3B0aW9uKCduby1wcm9ncmVzcycpKSB7CiRpbnB1dC0+c2V0T3B0aW9uKCduby1wcm9ncmVzcycsIHRydWUpOwp9CgokZW52T3B0aW9ucyA9IFsKJ0NPTVBPU0VSX05PX0FVRElUJyA9PiBbJ25vLWF1ZGl0J10sCidDT01QT1NFUl9OT19ERVYnID0+IFsnbm8tZGV2JywgJ3VwZGF0ZS1uby1kZXYnXSwKJ0NPTVBPU0VSX1BSRUZFUl9TVEFCTEUnID0+IFsncHJlZmVyLXN0YWJsZSddLAonQ09NUE9TRVJfUFJFRkVSX0xPV0VTVCcgPT4gWydwcmVmZXItbG93ZXN0J10sCidDT01QT1NFUl9NSU5JTUFMX0NIQU5HRVMnID0+IFsnbWluaW1hbC1jaGFuZ2VzJ10sCidDT01QT1NFUl9XSVRIX0RFUEVOREVOQ0lFUycgPT4gWyd3aXRoLWRlcGVuZGVuY2llcyddLAonQ09NUE9TRVJfV0lUSF9BTExfREVQRU5ERU5DSUVTJyA9PiBbJ3dpdGgtYWxsLWRlcGVuZGVuY2llcyddLAonQ09NUE9TRVJfTk9fU0VDVVJJVFlfQkxPQ0tJTkcnID0+IFsnbm8tc2VjdXJpdHktYmxvY2tpbmcnXSwKXTsKZm9yZWFjaCAoJGVudk9wdGlvbnMgYXMgJGVudk5hbWUgPT4gJG9wdGlvbk5hbWVzKSB7CmZvcmVhY2ggKCRvcHRpb25OYW1lcyBhcyAkb3B0aW9uTmFtZSkgewppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNPcHRpb24oJG9wdGlvbk5hbWUpKSB7CmlmIChmYWxzZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJG9wdGlvbk5hbWUpICYmIChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCRlbnZOYW1lKSkgewokaW5wdXQtPnNldE9wdGlvbigkb3B0aW9uTmFtZSwgdHJ1ZSk7Cn0KfQp9Cn0KCmlmICh0cnVlID09PSAkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSkgewppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpICYmIChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRUycpKSB7CiRpbnB1dC0+c2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIHRydWUpOwoKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5DT01QT1NFUl9JR05PUkVfUExBVEZPUk1fUkVRUyBpcyBzZXQuIFlvdSBtYXkgZXhwZXJpZW5jZSB1bmV4cGVjdGVkIGVycm9ycy48L3dhcm5pbmc+Jyk7Cn0KfQoKaWYgKHRydWUgPT09ICRpbnB1dC0+aGFzT3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJykgJiYgKCEkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnKSB8fCAhJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpKSB7CiRpZ25vcmVQbGF0Zm9ybVJlcUVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0lHTk9SRV9QTEFURk9STV9SRVEnKTsKaWYgKDAgPT09IGNvdW50KCRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJykpICYmIGlzX3N0cmluZygkaWdub3JlUGxhdGZvcm1SZXFFbnYpICYmICcnICE9PSAkaWdub3JlUGxhdGZvcm1SZXFFbnYpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBleHBsb2RlKCcsJywgJGlnbm9yZVBsYXRmb3JtUmVxRW52KSk7CgokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNPTVBPU0VSX0lHTk9SRV9QTEFURk9STV9SRVEgaXMgc2V0IHRvIGlnbm9yZSAnLiRpZ25vcmVQbGF0Zm9ybVJlcUVudi4nLiBZb3UgbWF5IGV4cGVyaWVuY2UgdW5leHBlY3RlZCBlcnJvcnMuPC93YXJuaW5nPicpOwp9Cn0KCnBhcmVudDo6aW5pdGlhbGl6ZSgkaW5wdXQsICRvdXRwdXQpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlQ29tcG9zZXJJbnN0YW5jZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIElPSW50ZXJmYWNlICRpbywgJGNvbmZpZyA9IG51bGwsID9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiBDb21wb3Nlcgp7CiRkaXNhYmxlUGx1Z2lucyA9ICRkaXNhYmxlUGx1Z2lucyA9PT0gdHJ1ZSB8fCAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1wbHVnaW5zJyk7CiRkaXNhYmxlU2NyaXB0cyA9ICRkaXNhYmxlU2NyaXB0cyA9PT0gdHJ1ZSB8fCAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1zY3JpcHRzJyk7CgokYXBwbGljYXRpb24gPSBwYXJlbnQ6OmdldEFwcGxpY2F0aW9uKCk7CmlmICgkYXBwbGljYXRpb24gaW5zdGFuY2VvZiBBcHBsaWNhdGlvbiAmJiAkYXBwbGljYXRpb24tPmdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCkpIHsKJGRpc2FibGVQbHVnaW5zID0gdHJ1ZTsKfQppZiAoJGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgQXBwbGljYXRpb24gJiYgJGFwcGxpY2F0aW9uLT5nZXREaXNhYmxlU2NyaXB0c0J5RGVmYXVsdCgpKSB7CiRkaXNhYmxlU2NyaXB0cyA9IHRydWU7Cn0KCnJldHVybiBGYWN0b3J5OjpjcmVhdGUoJGlvLCAkY29uZmlnLCAkZGlzYWJsZVBsdWdpbnMsICRkaXNhYmxlU2NyaXB0cyk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKENvbmZpZyAkY29uZmlnLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIGJvb2wgJGtlZXBWY3NSZXF1aXJlc1ByZWZlclNvdXJjZSA9IGZhbHNlKQp7CiRwcmVmZXJTb3VyY2UgPSBmYWxzZTsKJHByZWZlckRpc3QgPSBmYWxzZTsKCnN3aXRjaCAoJGNvbmZpZy0+Z2V0KCdwcmVmZXJyZWQtaW5zdGFsbCcpKSB7CmNhc2UgJ3NvdXJjZSc6CiRwcmVmZXJTb3VyY2UgPSB0cnVlOwpicmVhazsKY2FzZSAnZGlzdCc6CiRwcmVmZXJEaXN0ID0gdHJ1ZTsKYnJlYWs7CmNhc2UgJ2F1dG8nOgpkZWZhdWx0OgoKYnJlYWs7Cn0KCmlmICghJGlucHV0LT5oYXNPcHRpb24oJ3ByZWZlci1kaXN0JykgfHwgISRpbnB1dC0+aGFzT3B0aW9uKCdwcmVmZXItc291cmNlJykpIHsKcmV0dXJuIFskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF07Cn0KCmlmICgkaW5wdXQtPmhhc09wdGlvbigncHJlZmVyLWluc3RhbGwnKSAmJiBpc19zdHJpbmcoJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJykpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXNvdXJjZScpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLXByZWZlci1zb3VyY2UgY2FuIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1wcmVmZXItaW5zdGFsbCcpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWRpc3QnKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1wcmVmZXItZGlzdCBjYW4gbm90IGJlIHVzZWQgdG9nZXRoZXIgd2l0aCAtLXByZWZlci1pbnN0YWxsJyk7Cn0Kc3dpdGNoICgkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWluc3RhbGwnKSkgewpjYXNlICdkaXN0JzoKJGlucHV0LT5zZXRPcHRpb24oJ3ByZWZlci1kaXN0JywgdHJ1ZSk7CmJyZWFrOwpjYXNlICdzb3VyY2UnOgokaW5wdXQtPnNldE9wdGlvbigncHJlZmVyLXNvdXJjZScsIHRydWUpOwpicmVhazsKY2FzZSAnYXV0byc6CiRwcmVmZXJEaXN0ID0gZmFsc2U7CiRwcmVmZXJTb3VyY2UgPSBmYWxzZTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCctLXByZWZlci1pbnN0YWxsIGFjY2VwdHMgb25lIG9mICJkaXN0IiwgInNvdXJjZSIgb3IgImF1dG8iLCBnb3QgJy4kaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWluc3RhbGwnKSk7Cn0KfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc291cmNlJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3ByZWZlci1kaXN0JykgfHwgKCRrZWVwVmNzUmVxdWlyZXNQcmVmZXJTb3VyY2UgJiYgJGlucHV0LT5oYXNPcHRpb24oJ2tlZXAtdmNzJykgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2tlZXAtdmNzJykpKSB7CiRwcmVmZXJTb3VyY2UgPSAkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLXNvdXJjZScpIHx8ICgka2VlcFZjc1JlcXVpcmVzUHJlZmVyU291cmNlICYmICRpbnB1dC0+aGFzT3B0aW9uKCdrZWVwLXZjcycpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdrZWVwLXZjcycpKTsKJHByZWZlckRpc3QgPSAkaW5wdXQtPmdldE9wdGlvbigncHJlZmVyLWRpc3QnKTsKfQoKcmV0dXJuIFskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF07Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKElucHV0SW50ZXJmYWNlICRpbnB1dCk6IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewppZiAoISRpbnB1dC0+aGFzT3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpIHx8ICEkaW5wdXQtPmhhc09wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0NhbGxpbmcgZ2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciBmcm9tIGEgY29tbWFuZCB3aGljaCBkb2VzIG5vdCBkZWZpbmUgdGhlIC0taWdub3JlLXBsYXRmb3JtLXJlcVtzXSBmbGFncyBpcyBub3QgcGVybWl0dGVkLicpOwp9CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJykpIHsKcmV0dXJuIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVBbGwoKTsKfQoKJGlnbm9yZXMgPSAkaW5wdXQtPmdldE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScpOwppZiAoY291bnQoJGlnbm9yZXMpID4gMCkgewpyZXR1cm4gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6OmZyb21Cb29sT3JMaXN0KCRpZ25vcmVzKTsKfQoKcmV0dXJuIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5OjppZ25vcmVOb3RoaW5nKCk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZvcm1hdFJlcXVpcmVtZW50cyhhcnJheSAkcmVxdWlyZW1lbnRzKQp7CiRyZXF1aXJlcyA9IFtdOwokcmVxdWlyZW1lbnRzID0gJHRoaXMtPm5vcm1hbGl6ZVJlcXVpcmVtZW50cygkcmVxdWlyZW1lbnRzKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50cyBhcyAkcmVxdWlyZW1lbnQpIHsKaWYgKCFpc3NldCgkcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ09wdGlvbiAnLiRyZXF1aXJlbWVudFsnbmFtZSddIC4nIGlzIG1pc3NpbmcgYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIHVzZSBlLmcuICcuJHJlcXVpcmVtZW50WyduYW1lJ10uJzpeMS4wJyk7Cn0KJHJlcXVpcmVzWyRyZXF1aXJlbWVudFsnbmFtZSddXSA9ICRyZXF1aXJlbWVudFsndmVyc2lvbiddOwp9CgpyZXR1cm4gJHJlcXVpcmVzOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBub3JtYWxpemVSZXF1aXJlbWVudHMoYXJyYXkgJHJlcXVpcmVtZW50cykKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKCnJldHVybiAkcGFyc2VyLT5wYXJzZU5hbWVWZXJzaW9uUGFpcnMoJHJlcXVpcmVtZW50cyk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlbmRlclRhYmxlKGFycmF5ICR0YWJsZSwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHJlbmRlcmVyID0gbmV3IFRhYmxlKCRvdXRwdXQpOwokcmVuZGVyZXItPnNldFN0eWxlKCdjb21wYWN0Jyk7CiRyZW5kZXJlci0+c2V0Um93cygkdGFibGUpLT5yZW5kZXIoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFRlcm1pbmFsV2lkdGgoKQp7CiR0ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCgpOwokd2lkdGggPSAkdGVybWluYWwtPmdldFdpZHRoKCk7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiR3aWR0aC0tOwp9IGVsc2Ugewokd2lkdGggPSBtYXgoODAsICR3aWR0aCk7Cn0KCnJldHVybiAkd2lkdGg7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEF1ZGl0Rm9ybWF0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgc3RyaW5nICRvcHROYW1lID0gJ2F1ZGl0LWZvcm1hdCcpOiBzdHJpbmcKewppZiAoISRpbnB1dC0+aGFzT3B0aW9uKCRvcHROYW1lKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uIGEgQ29tbWFuZCB3aGljaCBoYXMgbm8gJy4kb3B0TmFtZS4nIG9wdGlvbiBkZWZpbmVkLicpOwp9CgokdmFsID0gJGlucHV0LT5nZXRPcHRpb24oJG9wdE5hbWUpOwppZiAoIWluX2FycmF5KCR2YWwsIEF1ZGl0b3I6OkZPUk1BVFMsIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLScuJG9wdE5hbWUuJyBtdXN0IGJlIG9uZSBvZiAnLmltcGxvZGUoJywgJywgQXVkaXRvcjo6Rk9STUFUUykuJy4nKTsKfQoKcmV0dXJuICR2YWw7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUF1ZGl0Q29uZmlnKENvbmZpZyAkY29uZmlnLCBJbnB1dEludGVyZmFjZSAkaW5wdXQpOiBBdWRpdENvbmZpZwp7CgppZiAoJGlucHV0LT5oYXNPcHRpb24oJ2F1ZGl0JykpIHsKJGF1ZGl0ID0gKGJvb2wpICRpbnB1dC0+Z2V0T3B0aW9uKCdhdWRpdCcpOwp9IGVsc2UgewokYXVkaXQgPSAhKCRpbnB1dC0+aGFzT3B0aW9uKCduby1hdWRpdCcpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCduby1hdWRpdCcpKTsKfQokYXVkaXRGb3JtYXQgPSAkaW5wdXQtPmhhc09wdGlvbignYXVkaXQtZm9ybWF0JykgPyAkdGhpcy0+Z2V0QXVkaXRGb3JtYXQoJGlucHV0KSA6IEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZOwoKJGF1ZGl0Q29uZmlnID0gQXVkaXRDb25maWc6OmZyb21Db25maWcoJGNvbmZpZywgJGF1ZGl0LCAkYXVkaXRGb3JtYXQpOwoKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9OT19TRUNVUklUWV9CTE9DS0lORycpIHx8ICgkaW5wdXQtPmhhc09wdGlvbignbm8tc2VjdXJpdHktYmxvY2tpbmcnKSAmJiAkaW5wdXQtPmdldE9wdGlvbignbm8tc2VjdXJpdHktYmxvY2tpbmcnKSkpIHsKJGF1ZGl0Q29uZmlnID0gbmV3IEF1ZGl0Q29uZmlnKAokYXVkaXRDb25maWctPmF1ZGl0LAokYXVkaXRDb25maWctPmF1ZGl0Rm9ybWF0LAokYXVkaXRDb25maWctPmF1ZGl0QWJhbmRvbmVkLApmYWxzZSwgCiRhdWRpdENvbmZpZy0+YmxvY2tBYmFuZG9uZWQsCiRhdWRpdENvbmZpZy0+aWdub3JlVW5yZWFjaGFibGUsCiRhdWRpdENvbmZpZy0+aWdub3JlTGlzdEZvckF1ZGl0LAokYXVkaXRDb25maWctPmlnbm9yZUxpc3RGb3JCbG9ja2luZywKJGF1ZGl0Q29uZmlnLT5pZ25vcmVTZXZlcml0eUZvckF1ZGl0LAokYXVkaXRDb25maWctPmlnbm9yZVNldmVyaXR5Rm9yQmxvY2tpbmcsCiRhdWRpdENvbmZpZy0+aWdub3JlQWJhbmRvbmVkRm9yQXVkaXQsCiRhdWRpdENvbmZpZy0+aWdub3JlQWJhbmRvbmVkRm9yQmxvY2tpbmcKKTsKfQoKcmV0dXJuICRhdWRpdENvbmZpZzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbmZpZ1xKc29uQ29uZmlnU291cmNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgphYnN0cmFjdCBjbGFzcyBCYXNlQ29uZmlnQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCgoKcHJvdGVjdGVkICRjb25maWc7CgoKCgpwcm90ZWN0ZWQgJGNvbmZpZ0ZpbGU7CgoKCgpwcm90ZWN0ZWQgJGNvbmZpZ1NvdXJjZTsKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCRpbnB1dCwgJG91dHB1dCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpICYmIG51bGwgIT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdmaWxlJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCctLWZpbGUgYW5kIC0tZ2xvYmFsIGNhbiBub3QgYmUgY29tYmluZWQnKTsKfQoKJGlvID0gJHRoaXMtPmdldElPKCk7CiR0aGlzLT5jb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJGlvKTsKCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpKSB7CiR0aGlzLT5jb25maWctPnNldEJhc2VEaXIoJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykpOwp9CgokY29uZmlnRmlsZSA9ICR0aGlzLT5nZXRDb21wb3NlckNvbmZpZ0ZpbGUoJGlucHV0LCAkdGhpcy0+Y29uZmlnKTsKCgppZiAoCigkY29uZmlnRmlsZSA9PT0gJ2NvbXBvc2VyLmpzb24nIHx8ICRjb25maWdGaWxlID09PSAnLi9jb21wb3Nlci5qc29uJykKJiYgIWZpbGVfZXhpc3RzKCRjb25maWdGaWxlKQomJiByZWFscGF0aChQbGF0Zm9ybTo6Z2V0Q3dkKCkpID09PSByZWFscGF0aCgkdGhpcy0+Y29uZmlnLT5nZXQoJ2hvbWUnKSkKKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCRjb25maWdGaWxlLCAie1xufVxuIik7Cn0KCiR0aGlzLT5jb25maWdGaWxlID0gbmV3IEpzb25GaWxlKCRjb25maWdGaWxlLCBudWxsLCAkaW8pOwokdGhpcy0+Y29uZmlnU291cmNlID0gbmV3IEpzb25Db25maWdTb3VyY2UoJHRoaXMtPmNvbmZpZ0ZpbGUpOwoKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykgJiYgISR0aGlzLT5jb25maWdGaWxlLT5leGlzdHMoKSkgewp0b3VjaCgkdGhpcy0+Y29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmNvbmZpZ0ZpbGUtPndyaXRlKFsnY29uZmlnJyA9PiBuZXcgXEFycmF5T2JqZWN0XSk7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCksIDA2MDApOwp9CgppZiAoISR0aGlzLT5jb25maWdGaWxlLT5leGlzdHMoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignRmlsZSAiJXMiIGNhbm5vdCBiZSBmb3VuZCBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnknLCAkY29uZmlnRmlsZSkpOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21wb3NlckNvbmZpZ0ZpbGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBDb25maWcgJGNvbmZpZyk6IHN0cmluZwp7CnJldHVybiAkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykKPyAoJGNvbmZpZy0+Z2V0KCdob21lJykgLiAnL2NvbmZpZy5qc29uJykKOiAoJGlucHV0LT5nZXRPcHRpb24oJ2ZpbGUnKSA/PyBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKSkKOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEF1dGhDb25maWdGaWxlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpCj8gKCRjb25maWctPmdldCgnaG9tZScpIC4gJy9hdXRoLmpzb24nKQo6IGRpcm5hbWUoJHRoaXMtPmdldENvbXBvc2VyQ29uZmlnRmlsZSgkaW5wdXQsICRjb25maWcpKSAuICcvYXV0aC5qc29uJwo7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxCb3VuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQmFzZURlcGVuZGVuY3lDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgY29uc3QgQVJHVU1FTlRfUEFDS0FHRSA9ICdwYWNrYWdlJzsKcHJvdGVjdGVkIGNvbnN0IEFSR1VNRU5UX0NPTlNUUkFJTlQgPSAndmVyc2lvbic7CnByb3RlY3RlZCBjb25zdCBPUFRJT05fUkVDVVJTSVZFID0gJ3JlY3Vyc2l2ZSc7CnByb3RlY3RlZCBjb25zdCBPUFRJT05fVFJFRSA9ICd0cmVlJzsKCgpwcm90ZWN0ZWQgJGNvbG9yczsKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0V4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYm9vbCAkaW52ZXJ0ZWQgPSBmYWxzZSk6IGludAp7CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJHRoaXMtPmdldE5hbWUoKSwgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRyZXBvcyA9IFtdOwoKJHJlcG9zW10gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CgppZiAoISRsb2NrZXItPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0EgdmFsaWQgY29tcG9zZXIubG9jayBmaWxlIGlzIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CgokcmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7CiRyZXBvc1tdID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGxvY2tlci0+Z2V0UGxhdGZvcm1PdmVycmlkZXMoKSk7Cn0gZWxzZSB7CiRsb2NhbFJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcm9vdFBrZyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwoKaWYgKGNvdW50KCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkpID09PSAwICYmIChjb3VudCgkcm9vdFBrZy0+Z2V0UmVxdWlyZXMoKSkgPiAwIHx8IGNvdW50KCRyb290UGtnLT5nZXREZXZSZXF1aXJlcygpKSA+IDApKSB7CiRvdXRwdXQtPndyaXRlbG4oJzx3YXJuaW5nPk5vIGRlcGVuZGVuY2llcyBpbnN0YWxsZWQuIFRyeSBydW5uaW5nIGNvbXBvc2VyIGluc3RhbGwgb3IgdXBkYXRlLCBvciB1c2UgLS1sb2NrZWQuPC93YXJuaW5nPicpOwoKcmV0dXJuIDE7Cn0KCiRyZXBvc1tdID0gJGxvY2FsUmVwbzsKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKSA/OiBbXTsKJHJlcG9zW10gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpOwp9CgokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KCRyZXBvcyk7CgoKJG5lZWRsZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfUEFDS0FHRSk7CiR0ZXh0Q29uc3RyYWludCA9ICRpbnB1dC0+aGFzQXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfQ09OU1RSQUlOVCkgPyAkaW5wdXQtPmdldEFyZ3VtZW50KHNlbGY6OkFSR1VNRU5UX0NPTlNUUkFJTlQpIDogJyonOwoKCiRwYWNrYWdlcyA9ICRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZXNXaXRoUmVwbGFjZXJzQW5kUHJvdmlkZXJzKCRuZWVkbGUpOwppZiAoZW1wdHkoJHBhY2thZ2VzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDb3VsZCBub3QgZmluZCBwYWNrYWdlICIlcyIgaW4geW91ciBwcm9qZWN0JywgJG5lZWRsZSkpOwp9CgoKCiRtYXRjaGVkUGFja2FnZSA9ICRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZSgkbmVlZGxlLCAkdGV4dENvbnN0cmFpbnQpOwppZiAoISRtYXRjaGVkUGFja2FnZSkgewokZGVmYXVsdFJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvcygkdGhpcy0+Z2V0SU8oKSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpKSk7CmlmICgkbWF0Y2ggPSAkZGVmYXVsdFJlcG9zLT5maW5kUGFja2FnZSgkbmVlZGxlLCAkdGV4dENvbnN0cmFpbnQpKSB7CiRpbnN0YWxsZWRSZXBvLT5hZGRSZXBvc2l0b3J5KG5ldyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkoW2Nsb25lICRtYXRjaF0pKTsKfSBlbHNlaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5lZWRsZSkpIHsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkdGV4dENvbnN0cmFpbnQpOwppZiAoJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKSAhPT0gQm91bmQ6Onplcm8oKSkgewokdGVtcFBsYXRmb3JtUGtnID0gbmV3IFBhY2thZ2UoJG5lZWRsZSwgJGNvbnN0cmFpbnQtPmdldExvd2VyQm91bmQoKS0+Z2V0VmVyc2lvbigpLCAkY29uc3RyYWludC0+Z2V0TG93ZXJCb3VuZCgpLT5nZXRWZXJzaW9uKCkpOwokaW5zdGFsbGVkUmVwby0+YWRkUmVwb3NpdG9yeShuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KFskdGVtcFBsYXRmb3JtUGtnXSkpOwp9Cn0gZWxzZSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8ZXJyb3I+UGFja2FnZSAiJy4kbmVlZGxlLiciIGNvdWxkIG5vdCBiZSBmb3VuZCB3aXRoIGNvbnN0cmFpbnQgIicuJHRleHRDb25zdHJhaW50LiciLCByZXN1bHRzIGJlbG93IHdpbGwgbW9zdCBsaWtlbHkgYmUgaW5jb21wbGV0ZS48L2Vycm9yPicpOwp9Cn0gZWxzZWlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuZWVkbGUpKSB7CiRleHRyYU5vdGljZSA9ICcnOwppZiAoKCRtYXRjaGVkUGFja2FnZS0+Z2V0RXh0cmEoKVsnY29uZmlnLnBsYXRmb3JtJ10gPz8gZmFsc2UpID09PSB0cnVlKSB7CiRleHRyYU5vdGljZSA9ICcgKHZlcnNpb24gcHJvdmlkZWQgYnkgY29uZmlnLnBsYXRmb3JtKSc7Cn0KJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPlBhY2thZ2UgIicuJG5lZWRsZS4nICcuJHRleHRDb25zdHJhaW50LiciIGZvdW5kIGluIHZlcnNpb24gIicuJG1hdGNoZWRQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyInLiRleHRyYU5vdGljZS4nLjwvaW5mbz4nKTsKfSBlbHNlaWYgKCRpbnZlcnRlZCkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxjb21tZW50PlBhY2thZ2UgIicuJG5lZWRsZS4nIiAnLiRtYXRjaGVkUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgaXMgYWxyZWFkeSBpbnN0YWxsZWQhIFRvIGZpbmQgb3V0IHdoeSwgcnVuIGBjb21wb3NlciB3aHkgJy4kbmVlZGxlLidgPC9jb21tZW50PicpOwoKcmV0dXJuIDA7Cn0KCgokbmVlZGxlcyA9IFskbmVlZGxlXTsKaWYgKCRpbnZlcnRlZCkgewpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJG5lZWRsZXMgPSBhcnJheV9tZXJnZSgkbmVlZGxlcywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoTGluayAkbGluayk6IHN0cmluZyB7CnJldHVybiAkbGluay0+Z2V0VGFyZ2V0KCk7Cn0sICRwYWNrYWdlLT5nZXRSZXBsYWNlcygpKSk7Cn0KfQoKCmlmICgnKicgIT09ICR0ZXh0Q29uc3RyYWludCkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHRleHRDb25zdHJhaW50KTsKfSBlbHNlIHsKJGNvbnN0cmFpbnQgPSBudWxsOwp9CgoKJHJlbmRlclRyZWUgPSAkaW5wdXQtPmdldE9wdGlvbihzZWxmOjpPUFRJT05fVFJFRSk7CiRyZWN1cnNpdmUgPSAkcmVuZGVyVHJlZSB8fCAkaW5wdXQtPmdldE9wdGlvbihzZWxmOjpPUFRJT05fUkVDVVJTSVZFKTsKCiRyZXR1cm4gPSAkaW52ZXJ0ZWQgPyAxIDogMDsKCgokcmVzdWx0cyA9ICRpbnN0YWxsZWRSZXBvLT5nZXREZXBlbmRlbnRzKCRuZWVkbGVzLCAkY29uc3RyYWludCwgJGludmVydGVkLCAkcmVjdXJzaXZlKTsKaWYgKGVtcHR5KCRyZXN1bHRzKSkgewokZXh0cmEgPSAobnVsbCAhPT0gJGNvbnN0cmFpbnQpID8gc3ByaW50ZignIGluIHZlcnNpb25zICVzbWF0Y2hpbmcgJXMnLCAkaW52ZXJ0ZWQgPyAnbm90ICcgOiAnJywgJHRleHRDb25zdHJhaW50KSA6ICcnOwokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcihzcHJpbnRmKAonPGluZm8+VGhlcmUgaXMgbm8gaW5zdGFsbGVkIHBhY2thZ2UgZGVwZW5kaW5nIG9uICIlcyIlczwvaW5mbz4nLAokbmVlZGxlLAokZXh0cmEKKSk7CiRyZXR1cm4gPSAkaW52ZXJ0ZWQgPyAwIDogMTsKfSBlbHNlaWYgKCRyZW5kZXJUcmVlKSB7CiR0aGlzLT5pbml0U3R5bGVzKCRvdXRwdXQpOwokcm9vdCA9ICRwYWNrYWdlc1swXTsKJHRoaXMtPmdldElPKCktPndyaXRlKHNwcmludGYoJzxpbmZvPiVzPC9pbmZvPiAlcyAlcycsICRyb290LT5nZXRQcmV0dHlOYW1lKCksICRyb290LT5nZXRQcmV0dHlWZXJzaW9uKCksICRyb290IGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHJvb3QtPmdldERlc2NyaXB0aW9uKCkgOiAnJykpOwokdGhpcy0+cHJpbnRUcmVlKCRyZXN1bHRzKTsKfSBlbHNlIHsKJHRoaXMtPnByaW50VGFibGUoJG91dHB1dCwgJHJlc3VsdHMpOwp9CgppZiAoJGludmVydGVkICYmICRpbnB1dC0+aGFzQXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfQ09OU1RSQUlOVCkgJiYgIVBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5lZWRsZSkpIHsKJGNvbXBvc2VyQ29tbWFuZCA9ICd1cGRhdGUnOwoKZm9yZWFjaCAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFJlcXVpcmVzKCkgYXMgJHJvb3RSZXF1aXJlbWVudCkgewppZiAoJHJvb3RSZXF1aXJlbWVudC0+Z2V0VGFyZ2V0KCkgPT09ICRuZWVkbGUpIHsKJGNvbXBvc2VyQ29tbWFuZCA9ICdyZXF1aXJlJzsKYnJlYWs7Cn0KfQoKZm9yZWFjaCAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkgYXMgJHJvb3RSZXF1aXJlbWVudCkgewppZiAoJHJvb3RSZXF1aXJlbWVudC0+Z2V0VGFyZ2V0KCkgPT09ICRuZWVkbGUpIHsKJGNvbXBvc2VyQ29tbWFuZCA9ICdyZXF1aXJlIC0tZGV2JzsKYnJlYWs7Cn0KfQoKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ05vdCBmaW5kaW5nIHdoYXQgeW91IHdlcmUgbG9va2luZyBmb3I/IFRyeSBjYWxsaW5nIGBjb21wb3NlciAnLiRjb21wb3NlckNvbW1hbmQuJyAiJy4kbmVlZGxlLic6Jy4kdGV4dENvbnN0cmFpbnQuJyIgLS1kcnktcnVuYCB0byBnZXQgYW5vdGhlciB2aWV3IG9uIHRoZSBwcm9ibGVtLicpOwp9CgpyZXR1cm4gJHJldHVybjsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRUYWJsZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgYXJyYXkgJHJlc3VsdHMpOiB2b2lkCnsKJHRhYmxlID0gW107CiRkb3VibGVzID0gW107CmRvIHsKJHF1ZXVlID0gW107CiRyb3dzID0gW107CmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKCgoKClskcGFja2FnZSwgJGxpbmssICRjaGlsZHJlbl0gPSAkcmVzdWx0OwokdW5pcXVlID0gKHN0cmluZykgJGxpbms7CmlmIChpc3NldCgkZG91Ymxlc1skdW5pcXVlXSkpIHsKY29udGludWU7Cn0KJGRvdWJsZXNbJHVuaXF1ZV0gPSB0cnVlOwokdmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFJvb3RQYWNrYWdlOjpERUZBVUxUX1BSRVRUWV9WRVJTSU9OID8gJy0nIDogJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKJHBhY2thZ2VVcmwgPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZU9ySG9tZXBhZ2VVcmwoJHBhY2thZ2UpOwokbmFtZVdpdGhMaW5rID0gJHBhY2thZ2VVcmwgIT09IG51bGwgPyAnPGhyZWY9JyAuIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRwYWNrYWdlVXJsKSAuICc+JyAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkgLiAnPC8+JyA6ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiRyb3dzW10gPSBbJG5hbWVXaXRoTGluaywgJHZlcnNpb24sICRsaW5rLT5nZXREZXNjcmlwdGlvbigpLCBzcHJpbnRmKCclcyAoJXMpJywgJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKV07CmlmIChpc19hcnJheSgkY2hpbGRyZW4pKSB7CiRxdWV1ZSA9IGFycmF5X21lcmdlKCRxdWV1ZSwgJGNoaWxkcmVuKTsKfQp9CiRyZXN1bHRzID0gJHF1ZXVlOwokdGFibGUgPSBhcnJheV9tZXJnZSgkcm93cywgJHRhYmxlKTsKfSB3aGlsZSAoXGNvdW50KCRyZXN1bHRzKSA+IDApOwoKJHRoaXMtPnJlbmRlclRhYmxlKCR0YWJsZSwgJG91dHB1dCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0U3R5bGVzKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiR0aGlzLT5jb2xvcnMgPSBbCidncmVlbicsCid5ZWxsb3cnLAonY3lhbicsCidtYWdlbnRhJywKJ2JsdWUnLApdOwoKZm9yZWFjaCAoJHRoaXMtPmNvbG9ycyBhcyAkY29sb3IpIHsKJHN0eWxlID0gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCRjb2xvcik7CiRvdXRwdXQtPmdldEZvcm1hdHRlcigpLT5zZXRTdHlsZSgkY29sb3IsICRzdHlsZSk7Cn0KfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludFRyZWUoYXJyYXkgJHJlc3VsdHMsIHN0cmluZyAkcHJlZml4ID0gJycsIGludCAkbGV2ZWwgPSAxKTogdm9pZAp7CiRjb3VudCA9IGNvdW50KCRyZXN1bHRzKTsKJGlkeCA9IDA7CmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKWyRwYWNrYWdlLCAkbGluaywgJGNoaWxkcmVuXSA9ICRyZXN1bHQ7CgokY29sb3IgPSAkdGhpcy0+Y29sb3JzWyRsZXZlbCAlIGNvdW50KCR0aGlzLT5jb2xvcnMpXTsKJHByZXZDb2xvciA9ICR0aGlzLT5jb2xvcnNbKCRsZXZlbCAtIDEpICUgY291bnQoJHRoaXMtPmNvbG9ycyldOwokaXNMYXN0ID0gKCsrJGlkeCA9PT0gJGNvdW50KTsKJHZlcnNpb25UZXh0ID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSA9PT0gUm9vdFBhY2thZ2U6OkRFRkFVTFRfUFJFVFRZX1ZFUlNJT04gPyAnJyA6ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRwYWNrYWdlVXJsID0gUGFja2FnZUluZm86OmdldFZpZXdTb3VyY2VPckhvbWVwYWdlVXJsKCRwYWNrYWdlKTsKJG5hbWVXaXRoTGluayA9ICRwYWNrYWdlVXJsICE9PSBudWxsID8gJzxocmVmPScgLiBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkcGFja2FnZVVybCkgLiAnPicgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpIC4gJzwvPicgOiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokcGFja2FnZVRleHQgPSBydHJpbShzcHJpbnRmKCc8JXM+JXM8LyUxJHM+ICVzJywgJGNvbG9yLCAkbmFtZVdpdGhMaW5rLCAkdmVyc2lvblRleHQpKTsKJGxpbmtUZXh0ID0gc3ByaW50ZignJXMgPCVzPiVzPC8lMiRzPiAlcycsICRsaW5rLT5nZXREZXNjcmlwdGlvbigpLCAkcHJldkNvbG9yLCAkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkpOwokY2lyY3VsYXJXYXJuID0gJGNoaWxkcmVuID09PSBmYWxzZSA/ICcoY2lyY3VsYXIgZGVwZW5kZW5jeSBhYm9ydGVkIGhlcmUpJyA6ICcnOwokdGhpcy0+d3JpdGVUcmVlTGluZShydHJpbShzcHJpbnRmKCIlcyVzJXMgKCVzKSAlcyIsICRwcmVmaXgsICRpc0xhc3QgPyAn4pSU4pSA4pSAJyA6ICfilJzilIDilIAnLCAkcGFja2FnZVRleHQsICRsaW5rVGV4dCwgJGNpcmN1bGFyV2FybikpKTsKaWYgKGlzX2FycmF5KCRjaGlsZHJlbikpIHsKJHRoaXMtPnByaW50VHJlZSgkY2hpbGRyZW4sICRwcmVmaXggLiAoJGlzTGFzdCA/ICcgICAnIDogJ+KUgiAgJyksICRsZXZlbCArIDEpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRyZWVMaW5lKHN0cmluZyAkbGluZSk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxpbmUgPSBzdHJfcmVwbGFjZShbJ+KUlCcsICfilJwnLCAn4pSA4pSAJywgJ+KUgiddLCBbJ2AtJywgJ3wtJywgJy0nLCAnfCddLCAkbGluZSk7Cn0KCiRpby0+d3JpdGUoJGxpbmUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkJ1bXBlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCmZpbmFsIGNsYXNzIEJ1bXBDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcml2YXRlIGNvbnN0IEVSUk9SX0dFTkVSSUMgPSAxOwpwcml2YXRlIGNvbnN0IEVSUk9SX0xPQ0tfT1VUREFURUQgPSAyOwoKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYnVtcCcpCi0+c2V0RGVzY3JpcHRpb24oJ0luY3JlYXNlcyB0aGUgbG93ZXIgbGltaXQgb2YgeW91ciBjb21wb3Nlci5qc29uIHJlcXVpcmVtZW50cyB0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9ucycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdPcHRpb25hbCBwYWNrYWdlIG5hbWUocykgdG8gcmVzdHJpY3Qgd2hpY2ggcGFja2FnZXMgYXJlIGJ1bXBlZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJvb3RSZXF1aXJlbWVudCgpKSwKbmV3IElucHV0T3B0aW9uKCdkZXYtb25seScsICdEJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IGJ1bXAgcmVxdWlyZW1lbnRzIGluICJyZXF1aXJlLWRldiIuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2LW9ubHknLCAnUicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBidW1wIHJlcXVpcmVtZW50cyBpbiAicmVxdWlyZSIuJyksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgcGFja2FnZXMgdG8gYnVtcCwgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5idW1wPC9pbmZvPiBjb21tYW5kIGluY3JlYXNlcyB0aGUgbG93ZXIgbGltaXQgb2YgeW91ciBjb21wb3Nlci5qc29uIHJlcXVpcmVtZW50cwp0byB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9ucy4gVGhpcyBoZWxwcyB0byBlbnN1cmUgeW91ciBkZXBlbmRlbmNpZXMgZG8gbm90CmFjY2lkZW50YWxseSBnZXQgZG93bmdyYWRlZCBkdWUgdG8gc29tZSBvdGhlciBjb25mbGljdCwgYW5kIGNhbiBzbGlnaHRseSBpbXByb3ZlCmRlcGVuZGVuY3kgcmVzb2x1dGlvbiBwZXJmb3JtYW5jZSBhcyBpdCBsaW1pdHMgdGhlIGFtb3VudCBvZiBwYWNrYWdlIHZlcnNpb25zCkNvbXBvc2VyIGhhcyB0byBsb29rIGF0LgoKUnVubmluZyB0aGlzIGJsaW5kbHkgb24gbGlicmFyaWVzIGlzICoqTk9UKiogcmVjb21tZW5kZWQgYXMgaXQgd2lsbCBuYXJyb3cgZG93bgp5b3VyIGFsbG93ZWQgZGVwZW5kZW5jaWVzLCB3aGljaCBtYXkgY2F1c2UgZGVwZW5kZW5jeSBoZWxsIGZvciB5b3VyIHVzZXJzLgpSdW5uaW5nIGl0IHdpdGggPGluZm8+LS1kZXYtb25seTwvaW5mbz4gb24gbGlicmFyaWVzIG1heSBiZSBmaW5lIGhvd2V2ZXIgYXMgZGV2IHJlcXVpcmVtZW50cwphcmUgbG9jYWwgdG8gdGhlIGxpYnJhcnkgYW5kIGRvIG5vdCBhZmZlY3QgY29uc3VtZXJzIG9mIHRoZSBwYWNrYWdlLgoKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKcmV0dXJuICR0aGlzLT5kb0J1bXAoCiR0aGlzLT5nZXRJTygpLAokaW5wdXQtPmdldE9wdGlvbignZGV2LW9ubHknKSwKJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldi1vbmx5JyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJyksCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykKKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG9CdW1wKApJT0ludGVyZmFjZSAkaW8sCmJvb2wgJGRldk9ubHksCmJvb2wgJG5vRGV2T25seSwKYm9vbCAkZHJ5UnVuLAphcnJheSAkcGFja2FnZXNGaWx0ZXIsCnN0cmluZyAkZGV2T25seUZsYWdIaW50ID0gJy0tZGV2LW9ubHknCik6IGludCB7CgokY29tcG9zZXJKc29uUGF0aCA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwoKaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRjb21wb3Nlckpzb25QYXRoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRjb21wb3Nlckpzb25QYXRoLicgaXMgbm90IHJlYWRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfR0VORVJJQzsKfQoKJGNvbXBvc2VySnNvbiA9IG5ldyBKc29uRmlsZSgkY29tcG9zZXJKc29uUGF0aCk7CiRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wb3Nlckpzb24tPmdldFBhdGgoKSk7CmlmIChmYWxzZSA9PT0gJGNvbnRlbnRzKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicuJGNvbXBvc2VySnNvblBhdGguJyBpcyBub3QgcmVhZGFibGUuPC9lcnJvcj4nKTsKCnJldHVybiBzZWxmOjpFUlJPUl9HRU5FUklDOwp9CgoKCmlmICghaXNfd3JpdGFibGUoJGNvbXBvc2VySnNvblBhdGgpICYmIGZhbHNlID09PSBTaWxlbmNlcjo6Y2FsbCgnZmlsZV9wdXRfY29udGVudHMnLCAkY29tcG9zZXJKc29uUGF0aCwgJGNvbnRlbnRzKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLiRjb21wb3Nlckpzb25QYXRoLicgaXMgbm90IHdyaXRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gc2VsZjo6RVJST1JfR0VORVJJQzsKfQp1bnNldCgkY29udGVudHMpOwoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokaGFzTG9ja2ZpbGVEaXNhYmxlZCA9ICEkY29tcG9zZXItPmdldENvbmZpZygpLT5oYXMoJ2xvY2snKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2xvY2snKTsKaWYgKCEkaGFzTG9ja2ZpbGVEaXNhYmxlZCkgewokcmVwbyA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7Cn0gZWxzZWlmICgkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CmlmICghJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNGcmVzaCgpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBsb2NrIGZpbGUgaXMgbm90IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IGNoYW5nZXMgaW4gY29tcG9zZXIuanNvbi4gUnVuIHRoZSBhcHByb3ByaWF0ZSBgdXBkYXRlYCB0byBmaXggdGhhdCBiZWZvcmUgeW91IHVzZSB0aGUgYGJ1bXBgIGNvbW1hbmQuPC9lcnJvcj4nKTsKCnJldHVybiBzZWxmOjpFUlJPUl9MT0NLX09VVERBVEVEOwp9CgokcmVwbyA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7Cn0gZWxzZSB7CiRyZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKfQoKaWYgKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRUeXBlKCkgIT09ICdwcm9qZWN0JyAmJiAhJGRldk9ubHkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5XYXJuaW5nOiBCdW1waW5nIGRlcGVuZGVuY3kgY29uc3RyYWludHMgaXMgbm90IHJlY29tbWVuZGVkIGZvciBsaWJyYXJpZXMgYXMgaXQgd2lsbCBuYXJyb3cgZG93biB5b3VyIGRlcGVuZGVuY2llcyBhbmQgbWF5IGNhdXNlIHByb2JsZW1zIGZvciB5b3VyIHVzZXJzLjwvd2FybmluZz4nKTsKCiRjb250ZW50cyA9ICRjb21wb3Nlckpzb24tPnJlYWQoKTsKaWYgKCFpc3NldCgkY29udGVudHNbJ3R5cGUnXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5JZiB5b3VyIHBhY2thZ2UgaXMgbm90IGEgbGlicmFyeSwgeW91IGNhbiBleHBsaWNpdGx5IHNwZWNpZnkgdGhlICJ0eXBlIiBieSB1c2luZyAiY29tcG9zZXIgY29uZmlnIHR5cGUgcHJvamVjdCIuPC93YXJuaW5nPicpOwokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkFsdGVybmF0aXZlbHkgeW91IGNhbiB1c2UgJy4kZGV2T25seUZsYWdIaW50LicgdG8gb25seSBidW1wIGRlcGVuZGVuY2llcyB3aXRoaW4gInJlcXVpcmUtZGV2Ii48L3dhcm5pbmc+Jyk7Cn0KdW5zZXQoJGNvbnRlbnRzKTsKfQoKJGJ1bXBlciA9IG5ldyBWZXJzaW9uQnVtcGVyKCk7CiR0YXNrcyA9IFtdOwppZiAoISRkZXZPbmx5KSB7CiR0YXNrc1sncmVxdWlyZSddID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFJlcXVpcmVzKCk7Cn0KaWYgKCEkbm9EZXZPbmx5KSB7CiR0YXNrc1sncmVxdWlyZS1kZXYnXSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpOwp9CgppZiAoY291bnQoJHBhY2thZ2VzRmlsdGVyKSA+IDApIHsKCiRwYWNrYWdlc0ZpbHRlciA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRjb25zdHJhaW50KSB7CnJldHVybiBQcmVnOjpyZXBsYWNlKCd7Wzo9IF0uK30nLCAnJywgJGNvbnN0cmFpbnQpOwp9LCAkcGFja2FnZXNGaWx0ZXIpOwokcGF0dGVybiA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZXNUb1JlZ2V4cChhcnJheV91bmlxdWUoYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBhY2thZ2VzRmlsdGVyKSkpOwpmb3JlYWNoICgkdGFza3MgYXMgJGtleSA9PiAkcmVxcykgewpmb3JlYWNoICgkcmVxcyBhcyAkcGtnTmFtZSA9PiAkbGluaykgewppZiAoIVByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwa2dOYW1lKSkgewp1bnNldCgkdGFza3NbJGtleV1bJHBrZ05hbWVdKTsKfQp9Cn0KfQoKJHVwZGF0ZXMgPSBbXTsKZm9yZWFjaCAoJHRhc2tzIGFzICRrZXkgPT4gJHJlcXMpIHsKZm9yZWFjaCAoJHJlcXMgYXMgJHBrZ05hbWUgPT4gJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHBrZ05hbWUpKSB7CmNvbnRpbnVlOwp9CiRjdXJyZW50Q29uc3RyYWludCA9ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CgokcGFja2FnZSA9ICRyZXBvLT5maW5kUGFja2FnZSgkcGtnTmFtZSwgJyonKTsKCmlmIChudWxsID09PSAkcGFja2FnZSkgewpjb250aW51ZTsKfQp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgokYnVtcGVkID0gJGJ1bXBlci0+YnVtcFJlcXVpcmVtZW50KCRsaW5rLT5nZXRDb25zdHJhaW50KCksICRwYWNrYWdlKTsKCmlmICgkYnVtcGVkID09PSAkY3VycmVudENvbnN0cmFpbnQpIHsKY29udGludWU7Cn0KCiR1cGRhdGVzWyRrZXldWyRwa2dOYW1lXSA9ICRidW1wZWQ7Cn0KfQoKaWYgKCEkZHJ5UnVuICYmICEkdGhpcy0+dXBkYXRlRmlsZUNsZWFubHkoJGNvbXBvc2VySnNvbiwgJHVwZGF0ZXMpKSB7CiRjb21wb3NlckRlZmluaXRpb24gPSAkY29tcG9zZXJKc29uLT5yZWFkKCk7CmZvcmVhY2ggKCR1cGRhdGVzIGFzICRrZXkgPT4gJHBhY2thZ2VzKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewokY29tcG9zZXJEZWZpbml0aW9uWyRrZXldWyRwYWNrYWdlXSA9ICR2ZXJzaW9uOwp9Cn0KJGNvbXBvc2VySnNvbi0+d3JpdGUoJGNvbXBvc2VyRGVmaW5pdGlvbik7Cn0KCiRjaGFuZ2VDb3VudCA9IGFycmF5X3N1bShhcnJheV9tYXAoJ2NvdW50JywgJHVwZGF0ZXMpKTsKaWYgKCRjaGFuZ2VDb3VudCA+IDApIHsKaWYgKCRkcnlSdW4pIHsKJGlvLT53cml0ZSgnPGluZm8+JyAuICRjb21wb3Nlckpzb25QYXRoIC4gJyB3b3VsZCBiZSB1cGRhdGVkIHdpdGg6PC9pbmZvPicpOwpmb3JlYWNoICgkdXBkYXRlcyBhcyAkcmVxdWlyZVR5cGUgPT4gJHBhY2thZ2VzKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbikgewokaW8tPndyaXRlKHNwcmludGYoJzxpbmZvPiAtICVzLiVzOiAlczwvaW5mbz4nLCAkcmVxdWlyZVR5cGUsICRwYWNrYWdlLCAkdmVyc2lvbikpOwp9Cn0KfSBlbHNlIHsKJGlvLT53cml0ZSgnPGluZm8+JyAuICRjb21wb3Nlckpzb25QYXRoIC4gJyBoYXMgYmVlbiB1cGRhdGVkICgnIC4gJGNoYW5nZUNvdW50IC4gJyBjaGFuZ2VzKS48L2luZm8+Jyk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZSgnPGluZm8+Tm8gcmVxdWlyZW1lbnRzIHRvIHVwZGF0ZSBpbiAnLiRjb21wb3Nlckpzb25QYXRoLicuPC9pbmZvPicpOwp9CgppZiAoISRkcnlSdW4gJiYgJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSAmJiAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2xvY2snKSAmJiAkY2hhbmdlQ291bnQgPiAwKSB7CiRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPnVwZGF0ZUhhc2goJGNvbXBvc2VySnNvbik7Cn0KCmlmICgkZHJ5UnVuICYmICRjaGFuZ2VDb3VudCA+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+c2V0QWxpYXNlcyhbJ2NsZWFyY2FjaGUnLCAnY2MnXSkKLT5zZXREZXNjcmlwdGlvbignQ2xlYXJzIGNvbXBvc2VyXCdzIGludGVybmFsIHBhY2thZ2UgY2FjaGUnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2djJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IHJ1biBnYXJiYWdlIGNvbGxlY3Rpb24sIG5vdCBhIGZ1bGwgY2FjaGUgY2xlYXInKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmNsZWFyLWNhY2hlPC9pbmZvPiBkZWxldGVzIGFsbCBjYWNoZWQgcGFja2FnZXMgZnJvbSBjb21wb3NlcidzCmNhY2hlIGRpcmVjdG9yeS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2NsZWFyLWNhY2hlLWNsZWFyY2FjaGUtY2MKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCk7CmlmICgkY29tcG9zZXIgIT09IG51bGwpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7Cn0gZWxzZSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKfQoKJGlvID0gJHRoaXMtPmdldElPKCk7CgokY2FjaGVQYXRocyA9IFsKJ2NhY2hlLXZjcy1kaXInID0+ICRjb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLAonY2FjaGUtcmVwby1kaXInID0+ICRjb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSwKJ2NhY2hlLWZpbGVzLWRpcicgPT4gJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy1kaXInKSwKJ2NhY2hlLWRpcicgPT4gJGNvbmZpZy0+Z2V0KCdjYWNoZS1kaXInKSwKXTsKCmZvcmVhY2ggKCRjYWNoZVBhdGhzIGFzICRrZXkgPT4gJGNhY2hlUGF0aCkgewoKaWYgKCRrZXkgPT09ICdjYWNoZS1kaXInICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdnYycpKSB7CmNvbnRpbnVlOwp9CgokY2FjaGVQYXRoID0gcmVhbHBhdGgoJGNhY2hlUGF0aCk7CmlmICghJGNhY2hlUGF0aCkgewokaW8tPndyaXRlRXJyb3IoIjxpbmZvPkNhY2hlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7Cgpjb250aW51ZTsKfQokY2FjaGUgPSBuZXcgQ2FjaGUoJGlvLCAkY2FjaGVQYXRoKTsKJGNhY2hlLT5zZXRSZWFkT25seSgkY29uZmlnLT5nZXQoJ2NhY2hlLXJlYWQtb25seScpKTsKaWYgKCEkY2FjaGUtPmlzRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcigiPGluZm8+Q2FjaGUgaXMgbm90IGVuYWJsZWQgKCRrZXkpOiAkY2FjaGVQYXRoPC9pbmZvPiIpOwoKY29udGludWU7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignZ2MnKSkgewokaW8tPndyaXRlRXJyb3IoIjxpbmZvPkdhcmJhZ2UtY29sbGVjdGluZyBjYWNoZSAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7CmlmICgka2V5ID09PSAnY2FjaGUtZmlsZXMtZGlyJykgewokY2FjaGUtPmdjKCRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtdHRsJyksICRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtbWF4c2l6ZScpKTsKfSBlbHNlaWYgKCRrZXkgPT09ICdjYWNoZS1yZXBvLWRpcicpIHsKJGNhY2hlLT5nYygkY29uZmlnLT5nZXQoJ2NhY2hlLXR0bCcpLCAxMDI0ICogMTAyNCAqIDEwMjQgKTsKfSBlbHNlaWYgKCRrZXkgPT09ICdjYWNoZS12Y3MtZGlyJykgewokY2FjaGUtPmdjVmNzQ2FjaGUoJGNvbmZpZy0+Z2V0KCdjYWNoZS10dGwnKSk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCI8aW5mbz5DbGVhcmluZyBjYWNoZSAoJGtleSk6ICRjYWNoZVBhdGg8L2luZm8+Iik7CiRjYWNoZS0+Y2xlYXIoKTsKfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2djJykpIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5BbGwgY2FjaGVzIGdhcmJhZ2UtY29sbGVjdGVkLjwvaW5mbz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5BbGwgY2FjaGVzIGNsZWFyZWQuPC9pbmZvPicpOwp9CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0OwoKCgoKCgp0cmFpdCBDb21wbGV0aW9uVHJhaXQKewoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZUNvbXBvc2VyKD9ib29sICRkaXNhYmxlUGx1Z2lucyA9IG51bGwsID9ib29sICRkaXNhYmxlU2NyaXB0cyA9IG51bGwpOiBDb21wb3NlcjsKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0UHJlZmVySW5zdGFsbCgpOiBhcnJheQp7CnJldHVybiBbJ2Rpc3QnLCAnc291cmNlJywgJ2F1dG8nXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0Um9vdFJlcXVpcmVtZW50KCk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KTogYXJyYXkgewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgpyZXR1cm4gYXJyYXlfbWVyZ2UoYXJyYXlfa2V5cygkY29tcG9zZXItPmdldFBhY2thZ2UoKS0+Z2V0UmVxdWlyZXMoKSksIGFycmF5X2tleXMoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldERldlJlcXVpcmVzKCkpKTsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0SW5zdGFsbGVkUGFja2FnZShib29sICRpbmNsdWRlUm9vdFBhY2thZ2UgPSB0cnVlLCBib29sICRpbmNsdWRlUGxhdGZvcm1QYWNrYWdlcyA9IGZhbHNlKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJGluY2x1ZGVSb290UGFja2FnZSwgJGluY2x1ZGVQbGF0Zm9ybVBhY2thZ2VzKTogYXJyYXkgewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRpbnN0YWxsZWRSZXBvcyA9IFtdOwoKaWYgKCRpbmNsdWRlUm9vdFBhY2thZ2UpIHsKJGluc3RhbGxlZFJlcG9zW10gPSBuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KGNsb25lICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKfQoKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKfSBlbHNlIHsKJGluc3RhbGxlZFJlcG9zW10gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwp9CgokcGxhdGZvcm1IaW50ID0gW107CmlmICgkaW5jbHVkZVBsYXRmb3JtUGFja2FnZXMpIHsKaWYgKCRsb2NrZXItPmlzTG9ja2VkKCkpIHsKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRsb2NrZXItPmdldFBsYXRmb3JtT3ZlcnJpZGVzKCkpOwp9IGVsc2UgewokcGxhdGZvcm1SZXBvID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKfQppZiAoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSA9PT0gJycpIHsKCiRoaW50c1RvRmluZCA9IFsnZXh0LScgPT4gMCwgJ2xpYi0nID0+IDAsICdwaHAnID0+IDk5LCAnY29tcG9zZXInID0+IDk5XTsKZm9yZWFjaCAoJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGtnKSB7CmZvcmVhY2ggKCRoaW50c1RvRmluZCBhcyAkaGludFByZWZpeCA9PiAkaGludENvdW50KSB7CmlmIChzdHJfc3RhcnRzX3dpdGgoJHBrZy0+Z2V0TmFtZSgpLCAkaGludFByZWZpeCkpIHsKaWYgKCRoaW50Q291bnQgPT09IDAgfHwgJGhpbnRDb3VudCA+PSA5OSkgewokcGxhdGZvcm1IaW50W10gPSAkcGtnLT5nZXROYW1lKCk7CiRoaW50c1RvRmluZFskaGludFByZWZpeF0rKzsKfSBlbHNlaWYgKCRoaW50Q291bnQgPT09IDEpIHsKdW5zZXQoJGhpbnRzVG9GaW5kWyRoaW50UHJlZml4XSk7CiRwbGF0Zm9ybUhpbnRbXSA9IHN1YnN0cigkcGtnLT5nZXROYW1lKCksIDAsIG1heChzdHJsZW4oJHBrZy0+Z2V0TmFtZSgpKSAtIDMsIHN0cmxlbigkaGludFByZWZpeCkgKyAxKSkuJy4uLic7Cn0KY29udGludWUgMjsKfQp9Cn0KfSBlbHNlIHsKJGluc3RhbGxlZFJlcG9zW10gPSAkcGxhdGZvcm1SZXBvOwp9Cn0KCiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoJGluc3RhbGxlZFJlcG9zKTsKCnJldHVybiBhcnJheV9tZXJnZSgKYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldE5hbWUoKTsKfSwgJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkpLAokcGxhdGZvcm1IaW50Cik7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdEluc3RhbGxlZFBhY2thZ2VUeXBlcyhib29sICRpbmNsdWRlUm9vdFBhY2thZ2UgPSB0cnVlKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJGluY2x1ZGVSb290UGFja2FnZSk6IGFycmF5IHsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokaW5zdGFsbGVkUmVwb3MgPSBbXTsKCmlmICgkaW5jbHVkZVJvb3RQYWNrYWdlKSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSk7Cn0KCiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoJGxvY2tlci0+aXNMb2NrZWQoKSkgewokaW5zdGFsbGVkUmVwb3NbXSA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRSZXBvc1tdID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKfQoKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeSgkaW5zdGFsbGVkUmVwb3MpOwoKcmV0dXJuIGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoCmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpIHsKcmV0dXJuICRwYWNrYWdlLT5nZXRUeXBlKCk7Cn0sICRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpKQopKTsKfTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0QXZhaWxhYmxlUGFja2FnZShpbnQgJG1heCA9IDk5KTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpIHVzZSAoJG1heCk6IGFycmF5IHsKaWYgKCRtYXggPCAxKSB7CnJldHVybiBbXTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKTsKCiRyZXN1bHRzID0gW107CiRzaG93VmVuZG9ycyA9IGZhbHNlOwppZiAoIXN0cl9jb250YWlucygkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpLCAnLycpKSB7CiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJ14nIC4gcHJlZ19xdW90ZSgkaW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpKSwgUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX1ZFTkRPUik7CiRzaG93VmVuZG9ycyA9IHRydWU7Cn0KCgppZiAoXGNvdW50KCRyZXN1bHRzKSA8PSAxKSB7CiRyZXN1bHRzID0gJHJlcG9zLT5zZWFyY2goJ14nLnByZWdfcXVvdGUoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSksIFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9OQU1FKTsKJHNob3dWZW5kb3JzID0gZmFsc2U7Cn0KCiRyZXN1bHRzID0gYXJyYXlfY29sdW1uKCRyZXN1bHRzLCAnbmFtZScpOwoKaWYgKCRzaG93VmVuZG9ycykgewokcmVzdWx0cyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSk6IHN0cmluZyB7CnJldHVybiAkbmFtZS4nLyc7Cn0sICRyZXN1bHRzKTsKCgp1c29ydCgkcmVzdWx0cywgc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGEsIHN0cmluZyAkYikgewokbGVuQSA9IFxzdHJsZW4oJGEpOwokbGVuQiA9IFxzdHJsZW4oJGIpOwppZiAoJGxlbkEgPT09ICRsZW5CKSB7CnJldHVybiAkYSA8PT4gJGI7Cn0KCnJldHVybiAkbGVuQSAtICRsZW5COwp9KTsKCiRwaW5uZWQgPSBbXTsKCgokY29tcGxldGlvbklucHV0ID0gJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKS4nLyc7CmlmIChmYWxzZSAhPT0gKCRleGFjdEluZGV4ID0gYXJyYXlfc2VhcmNoKCRjb21wbGV0aW9uSW5wdXQsICRyZXN1bHRzLCB0cnVlKSkpIHsKJHBpbm5lZFtdID0gJGNvbXBsZXRpb25JbnB1dDsKYXJyYXlfc3BsaWNlKCRyZXN1bHRzLCAkZXhhY3RJbmRleCwgMSk7Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkcGlubmVkLCBhcnJheV9zbGljZSgkcmVzdWx0cywgMCwgJG1heCAtIFxjb3VudCgkcGlubmVkKSkpOwp9CgpyZXR1cm4gYXJyYXlfc2xpY2UoJHJlc3VsdHMsIDAsICRtYXgpOwp9Owp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0QXZhaWxhYmxlUGFja2FnZUluY2xQbGF0Zm9ybSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKGV4dHxsaWJ8cGhwKSgtfCQpfF5jb219JywgJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKSkpIHsKJG1hdGNoZXMgPSAkdGhpcy0+c3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpKCRpbnB1dCk7Cn0gZWxzZSB7CiRtYXRjaGVzID0gW107Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkbWF0Y2hlcywgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKDk5IC0gXGNvdW50KCRtYXRjaGVzKSkoJGlucHV0KSk7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFBsYXRmb3JtUGFja2FnZSgpOiBcQ2xvc3VyZQp7CnJldHVybiBmdW5jdGlvbiAoQ29tcGxldGlvbklucHV0ICRpbnB1dCk6IGFycmF5IHsKJHJlcG9zID0gbmV3IFBsYXRmb3JtUmVwb3NpdG9yeShbXSwgJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpKTsKCiRwYXR0ZXJuID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKS4nKicpOwoKcmV0dXJuIGFycmF5X2ZpbHRlcihhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9LCAkcmVwb3MtPmdldFBhY2thZ2VzKCkpLCBzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAkbmFtZSkgdXNlICgkcGF0dGVybik6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJG5hbWUpOwp9KTsKfTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENvbmZpZ1xKc29uQ29uZmlnU291cmNlOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKCgoKCgpjbGFzcyBDb25maWdDb21tYW5kIGV4dGVuZHMgQmFzZUNvbmZpZ0NvbW1hbmQKewoKCgoKCnByb3RlY3RlZCBjb25zdCBDT05GSUdVUkFCTEVfUEFDS0FHRV9QUk9QRVJUSUVTID0gWwonbmFtZScsCid0eXBlJywKJ2Rlc2NyaXB0aW9uJywKJ2hvbWVwYWdlJywKJ3ZlcnNpb24nLAonbWluaW11bS1zdGFiaWxpdHknLAoncHJlZmVyLXN0YWJsZScsCidrZXl3b3JkcycsCidsaWNlbnNlJywKJ3JlcG9zaXRvcmllcycsCidzdWdnZXN0JywKJ2V4dHJhJywKXTsKCgoKCnByb3RlY3RlZCAkYXV0aENvbmZpZ0ZpbGU7CgoKCgpwcm90ZWN0ZWQgJGF1dGhDb25maWdTb3VyY2U7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2NvbmZpZycpCi0+c2V0RGVzY3JpcHRpb24oJ1NldHMgY29uZmlnIG9wdGlvbnMnKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ2dsb2JhbCcsICdnJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBcHBseSBjb21tYW5kIHRvIHRoZSBnbG9iYWwgY29uZmlnIGZpbGUnKSwKbmV3IElucHV0T3B0aW9uKCdlZGl0b3InLCAnZScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3BlbiBlZGl0b3InKSwKbmV3IElucHV0T3B0aW9uKCdhdXRoJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FmZmVjdCBhdXRoIGNvbmZpZyBmaWxlIChvbmx5IHVzZWQgZm9yIC0tZWRpdG9yKScpLApuZXcgSW5wdXRPcHRpb24oJ3Vuc2V0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVbnNldCB0aGUgZ2l2ZW4gc2V0dGluZy1rZXknKSwKbmV3IElucHV0T3B0aW9uKCdsaXN0JywgJ2wnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgY29uZmlndXJhdGlvbiBzZXR0aW5ncycpLApuZXcgSW5wdXRPcHRpb24oJ2ZpbGUnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0lmIHlvdSB3YW50IHRvIGNob29zZSBhIGRpZmZlcmVudCBjb21wb3Nlci5qc29uIG9yIGNvbmZpZy5qc29uJyksCm5ldyBJbnB1dE9wdGlvbignYWJzb2x1dGUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldHVybnMgYWJzb2x1dGUgcGF0aHMgd2hlbiBmZXRjaGluZyAqLWRpciBjb25maWcgdmFsdWVzIGluc3RlYWQgb2YgcmVsYXRpdmUnKSwKbmV3IElucHV0T3B0aW9uKCdqc29uJywgJ2onLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0pTT04gZGVjb2RlIHRoZSBzZXR0aW5nIHZhbHVlLCB0byBiZSB1c2VkIHdpdGggZXh0cmEuKiBrZXlzJyksCm5ldyBJbnB1dE9wdGlvbignbWVyZ2UnLCAnbScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTWVyZ2UgdGhlIHNldHRpbmcgdmFsdWUgd2l0aCB0aGUgY3VycmVudCB2YWx1ZSwgdG8gYmUgdXNlZCB3aXRoIGV4dHJhLiogb3IgYXVkaXQuaWdub3JlWy1hYmFuZG9uZWRdIGtleXMgaW4gY29tYmluYXRpb24gd2l0aCAtLWpzb24nKSwKbmV3IElucHV0T3B0aW9uKCdhcHBlbmQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZW4gYWRkaW5nIGEgcmVwb3NpdG9yeSwgYXBwZW5kIGl0IChsb3dlc3QgcHJpb3JpdHkpIHRvIHRoZSBleGlzdGluZyBvbmVzIGluc3RlYWQgb2YgcHJlcGVuZGluZyBpdCAoaGlnaGVzdCBwcmlvcml0eSknKSwKbmV3IElucHV0T3B0aW9uKCdzb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgd2hlcmUgdGhlIGNvbmZpZyB2YWx1ZSBpcyBsb2FkZWQgZnJvbScpLApuZXcgSW5wdXRBcmd1bWVudCgnc2V0dGluZy1rZXknLCBudWxsLCAnU2V0dGluZyBrZXknLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFNldHRpbmdLZXlzKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnU2V0dGluZyB2YWx1ZScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGlzIGNvbW1hbmQgYWxsb3dzIHlvdSB0byBlZGl0IGNvbXBvc2VyIGNvbmZpZyBzZXR0aW5ncyBhbmQgcmVwb3NpdG9yaWVzCmluIGVpdGhlciB0aGUgbG9jYWwgY29tcG9zZXIuanNvbiBmaWxlIG9yIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4KCkFkZGl0aW9uYWxseSBpdCBsZXRzIHlvdSBlZGl0IG1vc3QgcHJvcGVydGllcyBpbiB0aGUgbG9jYWwgY29tcG9zZXIuanNvbi4KClRvIHNldCBhIGNvbmZpZyBzZXR0aW5nOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgYmluLWRpciBiaW4vPC9jb21tZW50PgoKVG8gcmVhZCBhIGNvbmZpZyBzZXR0aW5nOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgYmluLWRpcjwvY29tbWVudD4KICAgIE91dHB1dHM6IDxpbmZvPmJpbjwvaW5mbz4KClRvIGVkaXQgdGhlIGdsb2JhbCBjb25maWcuanNvbiBmaWxlOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1nbG9iYWw8L2NvbW1lbnQ+CgpUbyBhZGQgYSByZXBvc2l0b3J5OgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgcmVwb3NpdG9yaWVzLmZvbyB2Y3MgaHR0cHM6Ly9iYXIuY29tPC9jb21tZW50PgoKVG8gcmVtb3ZlIGEgcmVwb3NpdG9yeSAocmVwbyBpcyBhIHNob3J0IGFsaWFzIGZvciByZXBvc2l0b3JpZXMpOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS11bnNldCByZXBvLmZvbzwvY29tbWVudD4KClRvIGRpc2FibGUgcGFja2FnaXN0Lm9yZzoKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIHJlcG8ucGFja2FnaXN0Lm9yZyBmYWxzZTwvY29tbWVudD4KCllvdSBjYW4gYWx0ZXIgcmVwb3NpdG9yaWVzIGluIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZSBieSBwYXNzaW5nIGluIHRoZQo8aW5mbz4tLWdsb2JhbDwvaW5mbz4gb3B0aW9uLgoKVG8gYWRkIG9yIGVkaXQgc3VnZ2VzdGVkIHBhY2thZ2VzIHlvdSBjYW4gdXNlOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgc3VnZ2VzdC5wYWNrYWdlIHJlYXNvbiBmb3IgdGhlIHN1Z2dlc3Rpb248L2NvbW1lbnQ+CgpUbyBhZGQgb3IgZWRpdCBleHRyYSBwcm9wZXJ0aWVzIHlvdSBjYW4gdXNlOgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgZXh0cmEucHJvcGVydHkgdmFsdWU8L2NvbW1lbnQ+CgpPciB0byBhZGQgYSBjb21wbGV4IHZhbHVlIHlvdSBjYW4gdXNlIGpzb24gd2l0aDoKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIGV4dHJhLnByb3BlcnR5IC0tanNvbiAneyJmb28iOnRydWUsICJiYXIiOiBbXX0nPC9jb21tZW50PgoKVG8gZWRpdCB0aGUgZmlsZSBpbiBhbiBleHRlcm5hbCBlZGl0b3I6CgogICAgPGNvbW1lbnQ+JWNvbW1hbmQuZnVsbF9uYW1lJSAtLWVkaXRvcjwvY29tbWVudD4KClRvIGNob29zZSB5b3VyIGVkaXRvciB5b3UgY2FuIHNldCB0aGUgIkVESVRPUiIgZW52IHZhcmlhYmxlLgoKVG8gZ2V0IGEgbGlzdCBvZiBjb25maWd1cmF0aW9uIHZhbHVlcyBpbiB0aGUgZmlsZToKCiAgICA8Y29tbWVudD4lY29tbWFuZC5mdWxsX25hbWUlIC0tbGlzdDwvY29tbWVudD4KCllvdSBjYW4gYWx3YXlzIHBhc3MgbW9yZSB0aGFuIG9uZSBvcHRpb24uIEFzIGFuIGV4YW1wbGUsIGlmIHlvdSB3YW50IHRvIGVkaXQgdGhlCmdsb2JhbCBjb25maWcuanNvbiBmaWxlLgoKICAgIDxjb21tZW50PiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1lZGl0b3IgLS1nbG9iYWw8L2NvbW1lbnQ+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNjb25maWcKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnBhcmVudDo6aW5pdGlhbGl6ZSgkaW5wdXQsICRvdXRwdXQpOwoKJGF1dGhDb25maWdGaWxlID0gJHRoaXMtPmdldEF1dGhDb25maWdGaWxlKCRpbnB1dCwgJHRoaXMtPmNvbmZpZyk7CgokdGhpcy0+YXV0aENvbmZpZ0ZpbGUgPSBuZXcgSnNvbkZpbGUoJGF1dGhDb25maWdGaWxlLCBudWxsLCAkdGhpcy0+Z2V0SU8oKSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlID0gbmV3IEpzb25Db25maWdTb3VyY2UoJHRoaXMtPmF1dGhDb25maWdGaWxlLCB0cnVlKTsKCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2dsb2JhbCcpICYmICEkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CnRvdWNoKCR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKJHRoaXMtPmF1dGhDb25maWdGaWxlLT53cml0ZShbJ2JpdGJ1Y2tldC1vYXV0aCcgPT4gbmV3IFxBcnJheU9iamVjdCwgJ2dpdGh1Yi1vYXV0aCcgPT4gbmV3IFxBcnJheU9iamVjdCwgJ2dpdGxhYi1vYXV0aCcgPT4gbmV3IFxBcnJheU9iamVjdCwgJ2dpdGxhYi10b2tlbicgPT4gbmV3IFxBcnJheU9iamVjdCwgJ2h0dHAtYmFzaWMnID0+IG5ldyBcQXJyYXlPYmplY3QsICdiZWFyZXInID0+IG5ldyBcQXJyYXlPYmplY3QsICdmb3JnZWpvLXRva2VuJyA9PiBuZXcgXEFycmF5T2JqZWN0KCldKTsKU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJHRoaXMtPmF1dGhDb25maWdGaWxlLT5nZXRQYXRoKCksIDA2MDApOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewoKaWYgKHRydWUgPT09ICRpbnB1dC0+Z2V0T3B0aW9uKCdlZGl0b3InKSkgewokZWRpdG9yID0gUGxhdGZvcm06OmdldEVudignRURJVE9SJyk7CmlmIChmYWxzZSA9PT0gJGVkaXRvciB8fCAnJyA9PT0gJGVkaXRvcikgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRlZGl0b3IgPSAnbm90ZXBhZCc7Cn0gZWxzZSB7CmZvcmVhY2ggKFsnZWRpdG9yJywgJ3ZpbScsICd2aScsICduYW5vJywgJ3BpY28nLCAnZWQnXSBhcyAkY2FuZGlkYXRlKSB7CmlmIChleGVjKCd3aGljaCAnLiRjYW5kaWRhdGUpKSB7CiRlZGl0b3IgPSAkY2FuZGlkYXRlOwpicmVhazsKfQp9Cn0KfSBlbHNlIHsKJGVkaXRvciA9IGVzY2FwZXNoZWxsY21kKCRlZGl0b3IpOwp9CgokZmlsZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdXRoJykgPyAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmdldFBhdGgoKSA6ICR0aGlzLT5jb25maWdGaWxlLT5nZXRQYXRoKCk7CnN5c3RlbSgkZWRpdG9yIC4gJyAnIC4gJGZpbGUgLiAoUGxhdGZvcm06OmlzV2luZG93cygpID8gJycgOiAnID4gYHR0eWAnKSk7CgpyZXR1cm4gMDsKfQoKaWYgKGZhbHNlID09PSAkaW5wdXQtPmdldE9wdGlvbignZ2xvYmFsJykpIHsKJHRoaXMtPmNvbmZpZy0+bWVyZ2UoJHRoaXMtPmNvbmZpZ0ZpbGUtPnJlYWQoKSwgJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7CiR0aGlzLT5jb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkdGhpcy0+YXV0aENvbmZpZ0ZpbGUtPmV4aXN0cygpID8gJHRoaXMtPmF1dGhDb25maWdGaWxlLT5yZWFkKCkgOiBbXV0sICR0aGlzLT5hdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKfQoKJHRoaXMtPmdldElPKCktPmxvYWRDb25maWd1cmF0aW9uKCR0aGlzLT5jb25maWcpOwoKCmlmICh0cnVlID09PSAkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpKSB7CiR0aGlzLT5saXN0Q29uZmlndXJhdGlvbigkdGhpcy0+Y29uZmlnLT5hbGwoKSwgJHRoaXMtPmNvbmZpZy0+cmF3KCksICRvdXRwdXQsIG51bGwsICRpbnB1dC0+Z2V0T3B0aW9uKCdzb3VyY2UnKSk7CgpyZXR1cm4gMDsKfQoKJHNldHRpbmdLZXkgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzZXR0aW5nLWtleScpOwppZiAoIWlzX3N0cmluZygkc2V0dGluZ0tleSkpIHsKcmV0dXJuIDA7Cn0KCgppZiAoW10gIT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NldHRpbmctdmFsdWUnKSAmJiAkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBjYW4gbm90IGNvbWJpbmUgYSBzZXR0aW5nIHZhbHVlIHdpdGggLS11bnNldCcpOwp9CgoKaWYgKFtdID09PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdzZXR0aW5nLXZhbHVlJykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiRwcm9wZXJ0aWVzID0gc2VsZjo6Q09ORklHVVJBQkxFX1BBQ0tBR0VfUFJPUEVSVElFUzsKJHByb3BlcnRpZXNEZWZhdWx0cyA9IFsKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2Rlc2NyaXB0aW9uJyA9PiAnJywKJ2hvbWVwYWdlJyA9PiAnJywKJ21pbmltdW0tc3RhYmlsaXR5JyA9PiAnc3RhYmxlJywKJ3ByZWZlci1zdGFibGUnID0+IGZhbHNlLAona2V5d29yZHMnID0+IFtdLAonbGljZW5zZScgPT4gW10sCidzdWdnZXN0JyA9PiBbXSwKJ2V4dHJhJyA9PiBbXSwKXTsKJHJhd0RhdGEgPSAkdGhpcy0+Y29uZmlnRmlsZS0+cmVhZCgpOwokZGF0YSA9ICR0aGlzLT5jb25maWctPmFsbCgpOwokc291cmNlID0gJHRoaXMtPmNvbmZpZy0+Z2V0U291cmNlT2ZWYWx1ZSgkc2V0dGluZ0tleSk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15yZXBvcz8oPzppdG9yaWVzKT8oPzpcLiguKykpPy8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICghaXNzZXQoJG1hdGNoZXNbMV0pKSB7CiR2YWx1ZSA9ICRkYXRhWydyZXBvc2l0b3JpZXMnXSA/PyBbXTsKfSBlbHNlIHsKaWYgKCFpc3NldCgkZGF0YVsncmVwb3NpdG9yaWVzJ11bJG1hdGNoZXNbMV1dKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlcmUgaXMgbm8gJy4kbWF0Y2hlc1sxXS4nIHJlcG9zaXRvcnkgZGVmaW5lZCcpOwp9CgokdmFsdWUgPSAkZGF0YVsncmVwb3NpdG9yaWVzJ11bJG1hdGNoZXNbMV1dOwp9Cn0gZWxzZWlmIChzdHJwb3MoJHNldHRpbmdLZXksICcuJykpIHsKJGJpdHMgPSBleHBsb2RlKCcuJywgJHNldHRpbmdLZXkpOwppZiAoJGJpdHNbMF0gPT09ICdleHRyYScgfHwgJGJpdHNbMF0gPT09ICdzdWdnZXN0JykgewokZGF0YSA9ICRyYXdEYXRhOwp9IGVsc2UgewokZGF0YSA9ICRkYXRhWydjb25maWcnXTsKfQokbWF0Y2ggPSBmYWxzZTsKZm9yZWFjaCAoJGJpdHMgYXMgJGJpdCkgewoka2V5ID0gaXNzZXQoJGtleSkgPyAka2V5LicuJy4kYml0IDogJGJpdDsKJG1hdGNoID0gZmFsc2U7CmlmIChpc3NldCgkZGF0YVska2V5XSkpIHsKJG1hdGNoID0gdHJ1ZTsKJGRhdGEgPSAkZGF0YVska2V5XTsKdW5zZXQoJGtleSk7Cn0KfQoKaWYgKCEkbWF0Y2gpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRzZXR0aW5nS2V5LicgaXMgbm90IGRlZmluZWQuJyk7Cn0KCiR2YWx1ZSA9ICRkYXRhOwp9IGVsc2VpZiAoaXNzZXQoJGRhdGFbJ2NvbmZpZyddWyRzZXR0aW5nS2V5XSkpIHsKJHZhbHVlID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCRzZXR0aW5nS2V5LCAkaW5wdXQtPmdldE9wdGlvbignYWJzb2x1dGUnKSA/IDAgOiBDb25maWc6OlJFTEFUSVZFX1BBVEhTKTsKCmlmICgkdmFsdWUgPT09IFtdKSB7CiRzY2hlbWEgPSBKc29uRmlsZTo6cGFyc2VKc29uKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKEpzb25GaWxlOjpDT01QT1NFUl9TQ0hFTUFfUEFUSCkpOwppZiAoCmlzc2V0KCRzY2hlbWFbJ3Byb3BlcnRpZXMnXVsnY29uZmlnJ11bJ3Byb3BlcnRpZXMnXVskc2V0dGluZ0tleV1bJ3R5cGUnXSkKJiYgaW5fYXJyYXkoJ29iamVjdCcsIChhcnJheSkgJHNjaGVtYVsncHJvcGVydGllcyddWydjb25maWcnXVsncHJvcGVydGllcyddWyRzZXR0aW5nS2V5XVsndHlwZSddLCB0cnVlKQopIHsKJHZhbHVlID0gbmV3IFxzdGRDbGFzczsKfQp9Cn0gZWxzZWlmIChpc3NldCgkcmF3RGF0YVskc2V0dGluZ0tleV0pICYmIGluX2FycmF5KCRzZXR0aW5nS2V5LCAkcHJvcGVydGllcywgdHJ1ZSkpIHsKJHZhbHVlID0gJHJhd0RhdGFbJHNldHRpbmdLZXldOwokc291cmNlID0gJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKTsKfSBlbHNlaWYgKGlzc2V0KCRwcm9wZXJ0aWVzRGVmYXVsdHNbJHNldHRpbmdLZXldKSkgewokdmFsdWUgPSAkcHJvcGVydGllc0RlZmF1bHRzWyRzZXR0aW5nS2V5XTsKJHNvdXJjZSA9ICdkZWZhdWx0cyc7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkc2V0dGluZ0tleS4nIGlzIG5vdCBkZWZpbmVkJyk7Cn0KCmlmIChpc19hcnJheSgkdmFsdWUpIHx8IGlzX29iamVjdCgkdmFsdWUpIHx8IGlzX2Jvb2woJHZhbHVlKSkgewokdmFsdWUgPSBKc29uRmlsZTo6ZW5jb2RlKCR2YWx1ZSwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fVU5FU0NBUEVEX1VOSUNPREUpOwp9Cgokc291cmNlT2ZDb25maWdWYWx1ZSA9ICcnOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3NvdXJjZScpKSB7CiRzb3VyY2VPZkNvbmZpZ1ZhbHVlID0gJyAoJyAuICRzb3VyY2UgLiAnKSc7Cn0KCiR0aGlzLT5nZXRJTygpLT53cml0ZSgkdmFsdWUgLiAkc291cmNlT2ZDb25maWdWYWx1ZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnJldHVybiAwOwp9CgokdmFsdWVzID0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2V0dGluZy12YWx1ZScpOyAKCiRib29sZWFuVmFsaWRhdG9yID0gc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpOwp9OwokYm9vbGVhbk5vcm1hbGl6ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn07CgoKJHVuaXF1ZUNvbmZpZ1ZhbHVlcyA9IFsKJ3Byb2Nlc3MtdGltZW91dCcgPT4gWydpc19udW1lcmljJywgJ2ludHZhbCddLAondXNlLWluY2x1ZGUtcGF0aCcgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAondXNlLWdpdGh1Yi1hcGknID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3ByZWZlcnJlZC1pbnN0YWxsJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydhdXRvJywgJ3NvdXJjZScsICdkaXN0J10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidnaXRsYWItcHJvdG9jb2wnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkdmFsLCBbJ2dpdCcsICdodHRwJywgJ2h0dHBzJ10sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidzdG9yZS1hdXRocycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsndHJ1ZScsICdmYWxzZScsICdwcm9tcHQnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3Byb21wdCcgPT09ICR2YWwpIHsKcmV0dXJuICdwcm9tcHQnOwp9CgpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfSwKXSwKJ25vdGlmeS1vbi1pbnN0YWxsJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCid2ZW5kb3ItZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidiaW4tZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidhcmNoaXZlLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonYXJjaGl2ZS1mb3JtYXQnID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2RhdGEtZGlyJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidjYWNoZS1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLWZpbGVzLWRpcicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonY2FjaGUtcmVwby1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLXZjcy1kaXInID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ2NhY2hlLXR0bCcgPT4gWydpc19udW1lcmljJywgJ2ludHZhbCddLAonY2FjaGUtZmlsZXMtdHRsJyA9PiBbJ2lzX251bWVyaWMnLCAnaW50dmFsJ10sCidjYWNoZS1maWxlcy1tYXhzaXplJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgnL15ccyooWzAtOS5dKylccyooPzooW2ttZ10pKD86aT9iKT8pP1xzKiQvaScsICR2YWwpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidiaW4tY29tcGF0JyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydhdXRvJywgJ2Z1bGwnLCAncHJveHknLCAnc3ltbGluayddKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9LApdLAonZGlzY2FyZC1jaGFuZ2VzJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaW5fYXJyYXkoJHZhbCwgWydzdGFzaCcsICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CmlmICgnc3Rhc2gnID09PSAkdmFsKSB7CnJldHVybiAnc3Rhc2gnOwp9CgpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfSwKXSwKJ2F1dG9sb2FkZXItc3VmZml4JyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbCA9PT0gJ251bGwnID8gbnVsbCA6ICR2YWw7Cn1dLAonc29ydC1wYWNrYWdlcycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonb3B0aW1pemUtYXV0b2xvYWRlcicgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonYXBjdS1hdXRvbG9hZGVyJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidwcmVwZW5kLWF1dG9sb2FkZXInID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3VwZGF0ZS13aXRoLW1pbmltYWwtY2hhbmdlcycgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLAonZGlzYWJsZS10bHMnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ3NlY3VyZS1odHRwJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCididW1wLWFmdGVyLXVwZGF0ZScgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsnZGV2JywgJ25vLWRldicsICd0cnVlJywgJ2ZhbHNlJywgJzEnLCAnMCddLCB0cnVlKTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CmlmICgnZGV2JyA9PT0gJHZhbCB8fCAnbm8tZGV2JyA9PT0gJHZhbCkgewpyZXR1cm4gJHZhbDsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCidjYWZpbGUnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogYm9vbCB7CnJldHVybiBmaWxlX2V4aXN0cygkdmFsKSAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCR2YWwpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWwgPT09ICdudWxsJyA/IG51bGwgOiAkdmFsOwp9LApdLAonY2FwYXRoJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaXNfZGlyKCR2YWwpICYmIEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHZhbCk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbCA9PT0gJ251bGwnID8gbnVsbCA6ICR2YWw7Cn0sCl0sCidnaXRodWItZXhwb3NlLWhvc3RuYW1lJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidodGFjY2Vzcy1wcm90ZWN0JyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidsb2NrJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidhbGxvdy1wbHVnaW5zJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidwbGF0Zm9ybS1jaGVjaycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsncGhwLW9ubHknLCAndHJ1ZScsICdmYWxzZScsICcxJywgJzAnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3BocC1vbmx5JyA9PT0gJHZhbCkgewpyZXR1cm4gJ3BocC1vbmx5JzsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7Cn0sCl0sCid1c2UtcGFyZW50LWRpcicgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFsndHJ1ZScsICdmYWxzZScsICdwcm9tcHQnXSwgdHJ1ZSk7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoJ3Byb21wdCcgPT09ICR2YWwpIHsKcmV0dXJuICdwcm9tcHQnOwp9CgpyZXR1cm4gJHZhbCAhPT0gJ2ZhbHNlJyAmJiAoYm9vbCkgJHZhbDsKfSwKXSwKJ2F1ZGl0LmFiYW5kb25lZCcgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCR2YWwsIFtBdWRpdG9yOjpBQkFORE9ORURfSUdOT1JFLCBBdWRpdG9yOjpBQkFORE9ORURfUkVQT1JULCBBdWRpdG9yOjpBQkFORE9ORURfRkFJTF0sIHRydWUpOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn0sCl0sCidhdWRpdC5pZ25vcmUtdW5yZWFjaGFibGUnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKJ2F1ZGl0LmJsb2NrLWluc2VjdXJlJyA9PiBbJGJvb2xlYW5WYWxpZGF0b3IsICRib29sZWFuTm9ybWFsaXplcl0sCidhdWRpdC5ibG9jay1hYmFuZG9uZWQnID0+IFskYm9vbGVhblZhbGlkYXRvciwgJGJvb2xlYW5Ob3JtYWxpemVyXSwKXTsKJG11bHRpQ29uZmlnVmFsdWVzID0gWwonZ2l0aHViLXByb3RvY29scycgPT4gWwpzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CmlmICghaXNfYXJyYXkoJHZhbHMpKSB7CnJldHVybiAnYXJyYXkgZXhwZWN0ZWQnOwp9Cgpmb3JlYWNoICgkdmFscyBhcyAkdmFsKSB7CmlmICghaW5fYXJyYXkoJHZhbCwgWydnaXQnLCAnaHR0cHMnLCAnc3NoJ10pKSB7CnJldHVybiAndmFsaWQgcHJvdG9jb2xzIGluY2x1ZGU6IGdpdCwgaHR0cHMsIHNzaCc7Cn0KfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLAonZ2l0aHViLWRvbWFpbnMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLAonZ2l0bGFiLWRvbWFpbnMnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLAonYXVkaXQuaWdub3JlLXNldmVyaXR5JyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCmZvcmVhY2ggKCR2YWxzIGFzICR2YWwpIHsKaWYgKCFpbl9hcnJheSgkdmFsLCBbJ2xvdycsICdtZWRpdW0nLCAnaGlnaCcsICdjcml0aWNhbCddLCB0cnVlKSkgewpyZXR1cm4gJ3ZhbGlkIHNldmVyaXRpZXMgaW5jbHVkZTogbG93LCBtZWRpdW0sIGhpZ2gsIGNyaXRpY2FsJzsKfQp9CgpyZXR1cm4gdHJ1ZTsKfSwKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewpyZXR1cm4gJHZhbHM7Cn0sCl0sCl07CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpICYmICRzZXR0aW5nS2V5ID09PSAnYXVkaXQnKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSAmJiAoaXNzZXQoJHVuaXF1ZUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0pIHx8IGlzc2V0KCRtdWx0aUNvbmZpZ1ZhbHVlc1skc2V0dGluZ0tleV0pKSkgewppZiAoJHNldHRpbmdLZXkgPT09ICdkaXNhYmxlLXRscycgJiYgJHRoaXMtPmNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCc8aW5mbz5Zb3UgYXJlIG5vdyBydW5uaW5nIENvbXBvc2VyIHdpdGggU1NML1RMUyBwcm90ZWN0aW9uIGVuYWJsZWQuPC9pbmZvPicpOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CmlmIChpc3NldCgkdW5pcXVlQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSkpIHsKJHRoaXMtPmhhbmRsZVNpbmdsZVZhbHVlKCRzZXR0aW5nS2V5LCAkdW5pcXVlQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZENvbmZpZ1NldHRpbmcnKTsKCnJldHVybiAwOwp9CmlmIChpc3NldCgkbXVsdGlDb25maWdWYWx1ZXNbJHNldHRpbmdLZXldKSkgewokdGhpcy0+aGFuZGxlTXVsdGlWYWx1ZSgkc2V0dGluZ0tleSwgJG11bHRpQ29uZmlnVmFsdWVzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZENvbmZpZ1NldHRpbmcnKTsKCnJldHVybiAwOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgnL15wcmVmZXJyZWQtaW5zdGFsbFwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgpbJHZhbGlkYXRvcl0gPSAkdW5pcXVlQ29uZmlnVmFsdWVzWydwcmVmZXJyZWQtaW5zdGFsbCddOwppZiAoISR2YWxpZGF0b3IoJHZhbHVlc1swXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIHZhbHVlIGZvciAnLiRzZXR0aW5nS2V5LicuIFNob3VsZCBiZSBvbmUgb2Y6IGF1dG8sIHNvdXJjZSwgb3IgZGlzdCcpOwp9CgokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5LCAkdmFsdWVzWzBdKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teYWxsb3ctcGx1Z2luc1wuKFthLXpBLVowLTkvKi1dKyl9JywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKaWYgKHRydWUgIT09ICRib29sZWFuVmFsaWRhdG9yKCR2YWx1ZXNbMF0pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonIiVzIiBpcyBhbiBpbnZhbGlkIHZhbHVlJywKJHZhbHVlc1swXQopKTsKfQoKJG5vcm1hbGl6ZWRWYWx1ZSA9ICRib29sZWFuTm9ybWFsaXplcigkdmFsdWVzWzBdKTsKCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJHNldHRpbmdLZXksICRub3JtYWxpemVkVmFsdWUpOwoKcmV0dXJuIDA7Cn0KCgokdW5pcXVlUHJvcHMgPSBbCiduYW1lJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCid0eXBlJyA9PiBbJ2lzX3N0cmluZycsIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewpyZXR1cm4gJHZhbDsKfV0sCidkZXNjcmlwdGlvbicgPT4gWydpc19zdHJpbmcnLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsKcmV0dXJuICR2YWw7Cn1dLAonaG9tZXBhZ2UnID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ3ZlcnNpb24nID0+IFsnaXNfc3RyaW5nJywgc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsOwp9XSwKJ21pbmltdW0tc3RhYmlsaXR5JyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbCk6IGJvb2wgewpyZXR1cm4gaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTW1ZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkdmFsKV0pOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWwpOiBzdHJpbmcgewpyZXR1cm4gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCR2YWwpOwp9LApdLAoncHJlZmVyLXN0YWJsZScgPT4gWyRib29sZWFuVmFsaWRhdG9yLCAkYm9vbGVhbk5vcm1hbGl6ZXJdLApdOwokbXVsdGlQcm9wcyA9IFsKJ2tleXdvcmRzJyA9PiBbCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKaWYgKCFpc19hcnJheSgkdmFscykpIHsKcmV0dXJuICdhcnJheSBleHBlY3RlZCc7Cn0KCnJldHVybiB0cnVlOwp9LApzdGF0aWMgZnVuY3Rpb24gKCR2YWxzKSB7CnJldHVybiAkdmFsczsKfSwKXSwKJ2xpY2Vuc2UnID0+IFsKc3RhdGljIGZ1bmN0aW9uICgkdmFscykgewppZiAoIWlzX2FycmF5KCR2YWxzKSkgewpyZXR1cm4gJ2FycmF5IGV4cGVjdGVkJzsKfQoKcmV0dXJuIHRydWU7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoJHZhbHMpIHsKcmV0dXJuICR2YWxzOwp9LApdLApdOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdnbG9iYWwnKSAmJiAoaXNzZXQoJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSkgfHwgaXNzZXQoJG11bHRpUHJvcHNbJHNldHRpbmdLZXldKSB8fCBzdHJwb3MoJHNldHRpbmdLZXksICdleHRyYS4nKSA9PT0gMCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSAnIC4gJHNldHRpbmdLZXkgLiAnIHByb3BlcnR5IGNhbiBub3QgYmUgc2V0IGluIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gZmlsZS4gVXNlIGBjb21wb3NlciBnbG9iYWwgY29uZmlnYCB0byBhcHBseSBjaGFuZ2VzIHRvIHRoZSBnbG9iYWwgY29tcG9zZXIuanNvbicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSAmJiAoaXNzZXQoJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSkgfHwgaXNzZXQoJG11bHRpUHJvcHNbJHNldHRpbmdLZXldKSkpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUHJvcGVydHkoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KaWYgKGlzc2V0KCR1bmlxdWVQcm9wc1skc2V0dGluZ0tleV0pKSB7CiR0aGlzLT5oYW5kbGVTaW5nbGVWYWx1ZSgkc2V0dGluZ0tleSwgJHVuaXF1ZVByb3BzWyRzZXR0aW5nS2V5XSwgJHZhbHVlcywgJ2FkZFByb3BlcnR5Jyk7CgpyZXR1cm4gMDsKfQppZiAoaXNzZXQoJG11bHRpUHJvcHNbJHNldHRpbmdLZXldKSkgewokdGhpcy0+aGFuZGxlTXVsdGlWYWx1ZSgkc2V0dGluZ0tleSwgJG11bHRpUHJvcHNbJHNldHRpbmdLZXldLCAkdmFsdWVzLCAnYWRkUHJvcGVydHknKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ecmVwb3M/KD86aXRvcmllcyk/XC4oLispLycsICRzZXR0aW5nS2V5LCAkbWF0Y2hlcykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVJlcG9zaXRvcnkoJG1hdGNoZXNbMV0pOwoKcmV0dXJuIDA7Cn0KCmlmICgyID09PSBjb3VudCgkdmFsdWVzKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRSZXBvc2l0b3J5KCRtYXRjaGVzWzFdLCBbCid0eXBlJyA9PiAkdmFsdWVzWzBdLAondXJsJyA9PiAkdmFsdWVzWzFdLApdLCAkaW5wdXQtPmdldE9wdGlvbignYXBwZW5kJykpOwoKcmV0dXJuIDA7Cn0KCmlmICgxID09PSBjb3VudCgkdmFsdWVzKSkgewokdmFsdWUgPSBzdHJ0b2xvd2VyKCR2YWx1ZXNbMF0pOwppZiAodHJ1ZSA9PT0gJGJvb2xlYW5WYWxpZGF0b3IoJHZhbHVlKSkgewppZiAoZmFsc2UgPT09ICRib29sZWFuTm9ybWFsaXplcigkdmFsdWUpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoJG1hdGNoZXNbMV0sIGZhbHNlLCAkaW5wdXQtPmdldE9wdGlvbignYXBwZW5kJykpOwoKcmV0dXJuIDA7Cn0KfSBlbHNlIHsKJHZhbHVlID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdmFsdWVzWzBdKTsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbWF0Y2hlc1sxXSwgJHZhbHVlLCAkaW5wdXQtPmdldE9wdGlvbignYXBwZW5kJykpOwoKcmV0dXJuIDA7Cn0KfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBwYXNzIHRoZSB0eXBlIGFuZCBhIHVybC4gRXhhbXBsZTogcGhwIGNvbXBvc2VyLnBoYXIgY29uZmlnIHJlcG9zaXRvcmllcy5mb28gdmNzIGh0dHBzOi8vYmFyLmNvbScpOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eZXh0cmFcLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUHJvcGVydHkoJHNldHRpbmdLZXkpOwoKcmV0dXJuIDA7Cn0KCiR2YWx1ZSA9ICR2YWx1ZXNbMF07CmlmICgkaW5wdXQtPmdldE9wdGlvbignanNvbicpKSB7CiR2YWx1ZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHZhbHVlKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdtZXJnZScpKSB7CiRjdXJyZW50VmFsdWUgPSAkdGhpcy0+Y29uZmlnRmlsZS0+cmVhZCgpOwokYml0cyA9IGV4cGxvZGUoJy4nLCAkc2V0dGluZ0tleSk7CmZvcmVhY2ggKCRiaXRzIGFzICRiaXQpIHsKJGN1cnJlbnRWYWx1ZSA9ICRjdXJyZW50VmFsdWVbJGJpdF0gPz8gbnVsbDsKfQppZiAoaXNfYXJyYXkoJGN1cnJlbnRWYWx1ZSkgJiYgaXNfYXJyYXkoJHZhbHVlKSkgewppZiAoYXJyYXlfaXNfbGlzdCgkY3VycmVudFZhbHVlKSAmJiBhcnJheV9pc19saXN0KCR2YWx1ZSkpIHsKJHZhbHVlID0gYXJyYXlfbWVyZ2UoJGN1cnJlbnRWYWx1ZSwgJHZhbHVlKTsKfSBlbHNlIHsKJHZhbHVlID0gJHZhbHVlICsgJGN1cnJlbnRWYWx1ZTsKfQp9Cn0KfQokdGhpcy0+Y29uZmlnU291cmNlLT5hZGRQcm9wZXJ0eSgkc2V0dGluZ0tleSwgJHZhbHVlKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ec3VnZ2VzdFwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksIGltcGxvZGUoJyAnLCAkdmFsdWVzKSk7CgpyZXR1cm4gMDsKfQoKCmlmIChpbl9hcnJheSgkc2V0dGluZ0tleSwgWydzdWdnZXN0JywgJ2V4dHJhJ10sIHRydWUpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ecGxhdGZvcm1cLiguKykvJywgJHNldHRpbmdLZXksICRtYXRjaGVzKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSwgJHZhbHVlc1swXSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogJHZhbHVlc1swXSk7CgpyZXR1cm4gMDsKfQoKCmlmICgkc2V0dGluZ0tleSA9PT0gJ3BsYXRmb3JtJyAmJiAkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgoKaWYgKGluX2FycmF5KCRzZXR0aW5nS2V5LCBbJ2F1ZGl0Lmlnbm9yZScsICdhdWRpdC5pZ25vcmUtYWJhbmRvbmVkJ10sIHRydWUpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9CgokdmFsdWUgPSAkdmFsdWVzOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2pzb24nKSkgewokdmFsdWUgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR2YWx1ZXNbMF0pOwppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdFeHBlY3RlZCBhbiBhcnJheSBvciBvYmplY3QgZm9yICcuJHNldHRpbmdLZXkpOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignbWVyZ2UnKSkgewokY3VycmVudENvbmZpZyA9ICR0aGlzLT5jb25maWdGaWxlLT5yZWFkKCk7CiRjdXJyZW50VmFsdWUgPSAkY3VycmVudENvbmZpZ1snY29uZmlnJ11bJ2F1ZGl0J11bc3RyX3JlcGxhY2UoJ2F1ZGl0LicsICcnLCAkc2V0dGluZ0tleSldID8/IG51bGw7CgppZiAoJGN1cnJlbnRWYWx1ZSAhPT0gbnVsbCAmJiBpc19hcnJheSgkY3VycmVudFZhbHVlKSAmJiBpc19hcnJheSgkdmFsdWUpKSB7CmlmIChhcnJheV9pc19saXN0KCRjdXJyZW50VmFsdWUpICYmIGFycmF5X2lzX2xpc3QoJHZhbHVlKSkgewoKJHZhbHVlID0gYXJyYXlfbWVyZ2UoJGN1cnJlbnRWYWx1ZSwgJHZhbHVlKTsKfSBlbHNlaWYgKCFhcnJheV9pc19saXN0KCRjdXJyZW50VmFsdWUpICYmICFhcnJheV9pc19saXN0KCR2YWx1ZSkpIHsKCiR2YWx1ZSA9ICR2YWx1ZSArICRjdXJyZW50VmFsdWU7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ2Fubm90IG1lcmdlIGFycmF5IGFuZCBvYmplY3QgZm9yICcuJHNldHRpbmdLZXkpOwp9Cn0KfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkc2V0dGluZ0tleSwgJHZhbHVlKTsKCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eKGJpdGJ1Y2tldC1vYXV0aHxnaXRodWItb2F1dGh8Z2l0bGFiLW9hdXRofGdpdGxhYi10b2tlbnxodHRwLWJhc2ljfGN1c3RvbS1oZWFkZXJzfGJlYXJlcnxmb3JnZWpvLXRva2VuKVwuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CgpyZXR1cm4gMDsKfQoKaWYgKCRtYXRjaGVzWzFdID09PSAnYml0YnVja2V0LW9hdXRoJykgewppZiAoMiAhPT0gY291bnQoJHZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdFeHBlY3RlZCB0d28gYXJndW1lbnRzIChjb25zdW1lci1rZXksIGNvbnN1bWVyLXNlY3JldCksIGdvdCAnLmNvdW50KCR2YWx1ZXMpKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgWydjb25zdW1lci1rZXknID0+ICR2YWx1ZXNbMF0sICdjb25zdW1lci1zZWNyZXQnID0+ICR2YWx1ZXNbMV1dKTsKfSBlbHNlaWYgKCRtYXRjaGVzWzFdID09PSAnZ2l0bGFiLXRva2VuJyAmJiAyID09PSBjb3VudCgkdmFsdWVzKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgWyd1c2VybmFtZScgPT4gJHZhbHVlc1swXSwgJ3Rva2VuJyA9PiAkdmFsdWVzWzFdXSk7Cn0gZWxzZWlmIChpbl9hcnJheSgkbWF0Y2hlc1sxXSwgWydnaXRodWItb2F1dGgnLCAnZ2l0bGFiLW9hdXRoJywgJ2dpdGxhYi10b2tlbicsICdiZWFyZXInXSwgdHJ1ZSkpIHsKaWYgKDEgIT09IGNvdW50KCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVG9vIG1hbnkgYXJndW1lbnRzLCBleHBlY3RlZCBvbmx5IG9uZSB0b2tlbicpOwp9CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdKTsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdLCAkdmFsdWVzWzBdKTsKfSBlbHNlaWYgKCRtYXRjaGVzWzFdID09PSAnaHR0cC1iYXNpYycpIHsKaWYgKDIgIT09IGNvdW50KCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cyAodXNlcm5hbWUsIHBhc3N3b3JkKSwgZ290ICcuY291bnQoJHZhbHVlcykpOwp9CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZUNvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdKTsKJHRoaXMtPmF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJG1hdGNoZXNbMV0uJy4nLiRtYXRjaGVzWzJdLCBbJ3VzZXJuYW1lJyA9PiAkdmFsdWVzWzBdLCAncGFzc3dvcmQnID0+ICR2YWx1ZXNbMV1dKTsKfSBlbHNlaWYgKCRtYXRjaGVzWzFdID09PSAnY3VzdG9tLWhlYWRlcnMnKSB7CmlmIChjb3VudCgkdmFsdWVzKSA9PT0gMCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0V4cGVjdGVkIGF0IGxlYXN0IG9uZSBhcmd1bWVudCAoaGVhZGVyKSwgZ290IG5vbmUnKTsKfQoKCiRmb3JtYXR0ZWRIZWFkZXJzID0gW107CmZvcmVhY2ggKCR2YWx1ZXMgYXMgJGhlYWRlcikgewppZiAoIWlzX3N0cmluZygkaGVhZGVyKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0hlYWRlcnMgbXVzdCBiZSBzdHJpbmdzIGluICJIZWFkZXItTmFtZTogSGVhZGVyLVZhbHVlIiBmb3JtYXQnKTsKfQoKCmlmICghUHJlZzo6aXNNYXRjaCgnL15bXjpdKzpccyouKyQvJywgJGhlYWRlciwgJGhlYWRlclBhcnRzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0hlYWRlciAiJyAuICRoZWFkZXIgLiAnIiBpcyBub3QgaW4gIkhlYWRlci1OYW1lOiBIZWFkZXItVmFsdWUiIGZvcm1hdCcpOwp9CgokZm9ybWF0dGVkSGVhZGVyc1tdID0gJGhlYWRlcjsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0pOwokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygkbWF0Y2hlc1sxXS4nLicuJG1hdGNoZXNbMl0sICRmb3JtYXR0ZWRIZWFkZXJzKTsKfSBlbHNlaWYgKCRtYXRjaGVzWzFdID09PSAnZm9yZ2Vqby10b2tlbicpIHsKaWYgKDIgIT09IGNvdW50KCR2YWx1ZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXhwZWN0ZWQgdHdvIGFyZ3VtZW50cyAodXNlcm5hbWUsIGFjY2VzcyB0b2tlbiksIGdvdCAnLmNvdW50KCR2YWx1ZXMpKTsKfQokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSk7CiR0aGlzLT5hdXRoQ29uZmlnU291cmNlLT5hZGRDb25maWdTZXR0aW5nKCRtYXRjaGVzWzFdLicuJy4kbWF0Y2hlc1syXSwgWyd1c2VybmFtZScgPT4gJHZhbHVlc1swXSwgJ3Rva2VuJyA9PiAkdmFsdWVzWzFdXSk7Cn0KCnJldHVybiAwOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ec2NyaXB0c1wuKC4rKS8nLCAkc2V0dGluZ0tleSwgJG1hdGNoZXMpKSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndW5zZXQnKSkgewokdGhpcy0+Y29uZmlnU291cmNlLT5yZW1vdmVQcm9wZXJ0eSgkc2V0dGluZ0tleSk7CgpyZXR1cm4gMDsKfQoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUHJvcGVydHkoJHNldHRpbmdLZXksIGNvdW50KCR2YWx1ZXMpID4gMSA/ICR2YWx1ZXMgOiAkdmFsdWVzWzBdKTsKCnJldHVybiAwOwp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnNldCcpKSB7CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVByb3BlcnR5KCRzZXR0aW5nS2V5KTsKCnJldHVybiAwOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU2V0dGluZyAnLiRzZXR0aW5nS2V5LicgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNvbW1hbmQnKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYW5kbGVTaW5nbGVWYWx1ZShzdHJpbmcgJGtleSwgYXJyYXkgJGNhbGxiYWNrcywgYXJyYXkgJHZhbHVlcywgc3RyaW5nICRtZXRob2QpOiB2b2lkCnsKWyR2YWxpZGF0b3IsICRub3JtYWxpemVyXSA9ICRjYWxsYmFja3M7CmlmICgxICE9PSBjb3VudCgkdmFsdWVzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBjYW4gb25seSBwYXNzIG9uZSB2YWx1ZS4gRXhhbXBsZTogcGhwIGNvbXBvc2VyLnBoYXIgY29uZmlnIHByb2Nlc3MtdGltZW91dCAzMDAnKTsKfQoKaWYgKHRydWUgIT09ICR2YWxpZGF0aW9uID0gJHZhbGlkYXRvcigkdmFsdWVzWzBdKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigKJyIlcyIgaXMgYW4gaW52YWxpZCB2YWx1ZScuKCR2YWxpZGF0aW9uID8gJyAoJy4kdmFsaWRhdGlvbi4nKScgOiAnJyksCiR2YWx1ZXNbMF0KKSk7Cn0KCiRub3JtYWxpemVkVmFsdWUgPSAkbm9ybWFsaXplcigkdmFsdWVzWzBdKTsKCmlmICgka2V5ID09PSAnZGlzYWJsZS10bHMnKSB7CmlmICghJG5vcm1hbGl6ZWRWYWx1ZSAmJiAkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPllvdSBhcmUgbm93IHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZW5hYmxlZC48L2luZm8+Jyk7Cn0gZWxzZWlmICgkbm9ybWFsaXplZFZhbHVlICYmICEkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgbm93IHJ1bm5pbmcgQ29tcG9zZXIgd2l0aCBTU0wvVExTIHByb3RlY3Rpb24gZGlzYWJsZWQuPC93YXJuaW5nPicpOwp9Cn0KCmNhbGxfdXNlcl9mdW5jKFskdGhpcy0+Y29uZmlnU291cmNlLCAkbWV0aG9kXSwgJGtleSwgJG5vcm1hbGl6ZWRWYWx1ZSk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFuZGxlTXVsdGlWYWx1ZShzdHJpbmcgJGtleSwgYXJyYXkgJGNhbGxiYWNrcywgYXJyYXkgJHZhbHVlcywgc3RyaW5nICRtZXRob2QpOiB2b2lkCnsKWyR2YWxpZGF0b3IsICRub3JtYWxpemVyXSA9ICRjYWxsYmFja3M7CmlmICh0cnVlICE9PSAkdmFsaWRhdGlvbiA9ICR2YWxpZGF0b3IoJHZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoCiclcyBpcyBhbiBpbnZhbGlkIHZhbHVlJy4oJHZhbGlkYXRpb24gPyAnICgnLiR2YWxpZGF0aW9uLicpJyA6ICcnKSwKanNvbl9lbmNvZGUoJHZhbHVlcykKKSk7Cn0KCmNhbGxfdXNlcl9mdW5jKFskdGhpcy0+Y29uZmlnU291cmNlLCAkbWV0aG9kXSwgJGtleSwgJG5vcm1hbGl6ZXIoJHZhbHVlcykpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGlzdENvbmZpZ3VyYXRpb24oYXJyYXkgJGNvbnRlbnRzLCBhcnJheSAkcmF3Q29udGVudHMsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCA/c3RyaW5nICRrID0gbnVsbCwgYm9vbCAkc2hvd1NvdXJjZSA9IGZhbHNlKTogdm9pZAp7CiRvcmlnSyA9ICRrOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKZm9yZWFjaCAoJGNvbnRlbnRzIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICgkayA9PT0gbnVsbCAmJiAhaW5fYXJyYXkoJGtleSwgWydjb25maWcnLCAncmVwb3NpdG9yaWVzJ10pKSB7CmNvbnRpbnVlOwp9CgokcmF3VmFsID0gJHJhd0NvbnRlbnRzWyRrZXldID8/IG51bGw7CgppZiAoaXNfYXJyYXkoJHZhbHVlKSAmJiAoIWlzX251bWVyaWMoa2V5KCR2YWx1ZSkpIHx8ICgka2V5ID09PSAncmVwb3NpdG9yaWVzJyAmJiBudWxsID09PSAkaykpKSB7CiRrIC49IFByZWc6OnJlcGxhY2UoJ3teY29uZmlnXC59JywgJycsICRrZXkgLiAnLicpOwokdGhpcy0+bGlzdENvbmZpZ3VyYXRpb24oJHZhbHVlLCAkcmF3VmFsLCAkb3V0cHV0LCAkaywgJHNob3dTb3VyY2UpOwokayA9ICRvcmlnSzsKCmNvbnRpbnVlOwp9CgppZiAoaXNfYXJyYXkoJHZhbHVlKSkgewokdmFsdWUgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiBpc19hcnJheSgkdmFsKSA/IGpzb25fZW5jb2RlKCR2YWwpIDogJHZhbDsKfSwgJHZhbHVlKTsKCiR2YWx1ZSA9ICdbJy5pbXBsb2RlKCcsICcsICR2YWx1ZSkuJ10nOwp9CgppZiAoaXNfYm9vbCgkdmFsdWUpKSB7CiR2YWx1ZSA9IHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKTsKfQoKJHNvdXJjZSA9ICcnOwppZiAoJHNob3dTb3VyY2UpIHsKJHNvdXJjZSA9ICcgKCcgLiAkdGhpcy0+Y29uZmlnLT5nZXRTb3VyY2VPZlZhbHVlKCRrIC4gJGtleSkgLiAnKSc7Cn0KCmlmIChudWxsICE9PSAkayAmJiAwID09PSBzdHJwb3MoJGssICdyZXBvc2l0b3JpZXMnKSkgewokbGluayA9ICdodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDUtcmVwb3NpdG9yaWVzLm1kJzsKfSBlbHNlIHsKJGlkID0gUHJlZzo6cmVwbGFjZSgne1wuLiokfScsICcnLCAkayA9PT0gJycgfHwgJGsgPT09IG51bGwgPyAoc3RyaW5nKSAka2V5IDogJGspOwokaWQgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTldfWknLCAnLScsIHN0cnRvbG93ZXIodHJpbSgkaWQpKSk7CiRpZCA9IFByZWc6OnJlcGxhY2UoJ3stK30nLCAnLScsICRpZCk7CiRsaW5rID0gJ2h0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNi1jb25maWcubWQjJyAuICRpZDsKfQppZiAoaXNfc3RyaW5nKCRyYXdWYWwpICYmICRyYXdWYWwgIT09ICR2YWx1ZSkgewokaW8tPndyaXRlKCdbPGZnPXllbGxvdztocmVmPScgLiAkbGluayAuJz4nIC4gJGsgLiAka2V5IC4gJzwvPl0gPGluZm8+JyAuICRyYXdWYWwgLiAnICgnIC4gJHZhbHVlIC4gJyk8L2luZm8+JyAuICRzb3VyY2UsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJ1s8Zmc9eWVsbG93O2hyZWY9JyAuICRsaW5rIC4nPicgLiAkayAuICRrZXkgLiAnPC8+XSA8aW5mbz4nIC4gJHZhbHVlIC4gJzwvaW5mbz4nIC4gJHNvdXJjZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3VnZ2VzdFNldHRpbmdLZXlzKCk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KTogYXJyYXkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSB8fCAkaW5wdXQtPmdldE9wdGlvbignZWRpdG9yJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2F1dGgnKSkgewpyZXR1cm4gW107Cn0KCgokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7CgoKJGNvbmZpZ0ZpbGUgPSBuZXcgSnNvbkZpbGUoJHRoaXMtPmdldENvbXBvc2VyQ29uZmlnRmlsZSgkaW5wdXQsICRjb25maWcpKTsKaWYgKCRjb25maWdGaWxlLT5leGlzdHMoKSkgewokY29uZmlnLT5tZXJnZSgkY29uZmlnRmlsZS0+cmVhZCgpLCAkY29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKfQoKCiRhdXRoQ29uZmlnRmlsZSA9IG5ldyBKc29uRmlsZSgkdGhpcy0+Z2V0QXV0aENvbmZpZ0ZpbGUoJGlucHV0LCAkY29uZmlnKSk7CmlmICgkYXV0aENvbmZpZ0ZpbGUtPmV4aXN0cygpKSB7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkYXV0aENvbmZpZ0ZpbGUtPnJlYWQoKV0sICRhdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpKTsKfQoKCiRyYXdDb25maWcgPSAkY29uZmlnLT5yYXcoKTsKJGtleXMgPSBhcnJheV9tZXJnZSgKJHRoaXMtPmZsYXR0ZW5TZXR0aW5nS2V5cygkcmF3Q29uZmlnWydjb25maWcnXSksCiR0aGlzLT5mbGF0dGVuU2V0dGluZ0tleXMoJHJhd0NvbmZpZ1sncmVwb3NpdG9yaWVzJ10sICdyZXBvc2l0b3JpZXMuJykKKTsKCgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3Vuc2V0JykpIHsKCiRzb3VyY2VzID0gWyRjb25maWdGaWxlLT5nZXRQYXRoKCksICRhdXRoQ29uZmlnRmlsZS0+Z2V0UGF0aCgpXTsKJGtleXMgPSBhcnJheV9maWx0ZXIoCiRrZXlzLApzdGF0aWMgZnVuY3Rpb24gKHN0cmluZyAka2V5KSB1c2UgKCRjb25maWcsICRzb3VyY2VzKTogYm9vbCB7CnJldHVybiBpbl9hcnJheSgkY29uZmlnLT5nZXRTb3VyY2VPZlZhbHVlKCRrZXkpLCAkc291cmNlcywgdHJ1ZSk7Cn0KKTsKCgp9IGVsc2UgewoKJGtleXMgPSBhcnJheV9tZXJnZSgka2V5cywgc2VsZjo6Q09ORklHVVJBQkxFX1BBQ0tBR0VfUFJPUEVSVElFUyk7CgoKCgoKfQoKCmlmICgkY29uZmlnRmlsZS0+ZXhpc3RzKCkpIHsKJHByb3BlcnRpZXMgPSBhcnJheV9maWx0ZXIoCiRjb25maWdGaWxlLT5yZWFkKCksCnN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRrZXkpOiBib29sIHsKcmV0dXJuIGluX2FycmF5KCRrZXksIHNlbGY6OkNPTkZJR1VSQUJMRV9QQUNLQUdFX1BST1BFUlRJRVMsIHRydWUpOwp9LApBUlJBWV9GSUxURVJfVVNFX0tFWQopOwoKJGtleXMgPSBhcnJheV9tZXJnZSgKJGtleXMsCiR0aGlzLT5mbGF0dGVuU2V0dGluZ0tleXMoJHByb3BlcnRpZXMpCik7Cn0KCgokY29tcGxldGlvblZhbHVlID0gJGlucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKTsKCmlmICgkY29tcGxldGlvblZhbHVlICE9PSAnJykgewoka2V5cyA9IGFycmF5X2ZpbHRlcigKJGtleXMsCnN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRrZXkpIHVzZSAoJGNvbXBsZXRpb25WYWx1ZSk6IGJvb2wgewpyZXR1cm4gc3RyX3N0YXJ0c193aXRoKCRrZXksICRjb21wbGV0aW9uVmFsdWUpOwp9Cik7Cn0KCnNvcnQoJGtleXMpOwoKcmV0dXJuIGFycmF5X3VuaXF1ZSgka2V5cyk7Cn07Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmxhdHRlblNldHRpbmdLZXlzKGFycmF5ICRjb25maWcsIHN0cmluZyAkcHJlZml4ID0gJycpOiBhcnJheQp7CiRrZXlzID0gW107CmZvcmVhY2ggKCRjb25maWcgYXMgJGtleSA9PiAkdmFsdWUpIHsKJGtleXNbXSA9IFskcHJlZml4IC4gJGtleV07CgoKaWYgKGlzX2FycmF5KCR2YWx1ZSkgJiYgIWFycmF5X2lzX2xpc3QoJHZhbHVlKSAmJiAkcHJlZml4ICE9PSAncmVwb3NpdG9yaWVzLicpIHsKJGtleXNbXSA9ICR0aGlzLT5mbGF0dGVuU2V0dGluZ0tleXMoJHZhbHVlLCAkcHJlZml4IC4gJGtleSAuICcuJyk7Cn0KfQoKcmV0dXJuIGFycmF5X21lcmdlKC4uLiRrZXlzKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXFByb2plY3RJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5CbG9ja2VkRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU2VsZFxTaWduYWxcU2lnbmFsSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEZpbmRlcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKCgoKCgoKCgoKY2xhc3MgQ3JlYXRlUHJvamVjdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgJHN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2NyZWF0ZS1wcm9qZWN0JykKLT5zZXREZXNjcmlwdGlvbignQ3JlYXRlcyBuZXcgcHJvamVjdCBmcm9tIGEgcGFja2FnZSBpbnRvIGdpdmVuIGRpcmVjdG9yeScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdQYWNrYWdlIG5hbWUgdG8gYmUgaW5zdGFsbGVkJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnZGlyZWN0b3J5JywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdEaXJlY3Rvcnkgd2hlcmUgdGhlIGZpbGVzIHNob3VsZCBiZSBjcmVhdGVkJyksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdWZXJzaW9uLCB3aWxsIGRlZmF1bHQgdG8gbGF0ZXN0JyksCm5ldyBJbnB1dE9wdGlvbignc3RhYmlsaXR5JywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdNaW5pbXVtLXN0YWJpbGl0eSBhbGxvd2VkICh1bmxlc3MgYSB2ZXJzaW9uIGlzIHNwZWNpZmllZCkuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCdyZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnQWRkIGN1c3RvbSByZXBvc2l0b3JpZXMgdG8gbG9vayB0aGUgcGFja2FnZSB1cCwgZWl0aGVyIGJ5IFVSTCBvciB1c2luZyBKU09OIGFycmF5cycpLApuZXcgSW5wdXRPcHRpb24oJ3JlcG9zaXRvcnktdXJsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnREVQUkVDQVRFRDogVXNlIC0tcmVwb3NpdG9yeSBpbnN0ZWFkLicpLApuZXcgSW5wdXRPcHRpb24oJ2FkZC1yZXBvc2l0b3J5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBZGQgdGhlIGN1c3RvbSByZXBvc2l0b3J5IGluIHRoZSBjb21wb3Nlci5qc29uLiBJZiBhIGxvY2sgZmlsZSBpcyBwcmVzZW50IGl0IHdpbGwgYmUgZGVsZXRlZCBhbmQgYW4gdXBkYXRlIHdpbGwgYmUgcnVuIGluc3RlYWQgb2YgaW5zdGFsbC4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0VuYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIChlbmFibGVkIGJ5IGRlZmF1bHQsIG9ubHkgcHJlc2VudCBmb3IgQkMpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWN1c3RvbS1pbnN0YWxsZXJzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdERVBSRUNBVEVEOiBVc2Ugbm8tcGx1Z2lucyBpbnN0ZWFkLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNjcmlwdHMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZXRoZXIgdG8gcHJldmVudCBleGVjdXRpb24gb2YgYWxsIGRlZmluZWQgc2NyaXB0cyBpbiB0aGUgcm9vdCBwYWNrYWdlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNlY3VyZS1odHRwJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlIHRoZSBzZWN1cmUtaHR0cCBjb25maWcgb3B0aW9uIHRlbXBvcmFyaWx5IHdoaWxlIGluc3RhbGxpbmcgdGhlIHJvb3QgcGFja2FnZS4gVXNlIGF0IHlvdXIgb3duIHJpc2suIFVzaW5nIHRoaXMgZmxhZyBpcyBhIGJhZCBpZGVhLicpLApuZXcgSW5wdXRPcHRpb24oJ2tlZXAtdmNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHByZXZlbnQgZGVsZXRpbmcgdGhlIHZjcyBmb2xkZXIuJyksCm5ldyBJbnB1dE9wdGlvbigncmVtb3ZlLXZjcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBmb3JjZSBkZWxldGlvbiBvZiB0aGUgdmNzIGZvbGRlciB3aXRob3V0IHByb21wdGluZy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIHNraXAgaW5zdGFsbGF0aW9uIG9mIHRoZSBwYWNrYWdlIGRlcGVuZGVuY2llcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnV2hldGhlciB0byBza2lwIGF1ZGl0aW5nIG9mIHRoZSBpbnN0YWxsZWQgcGFja2FnZSBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCduby1zZWN1cml0eS1ibG9ja2luZycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluc3RhbGxpbmcgcGFja2FnZXMgd2l0aCBzZWN1cml0eSBhZHZpc29yaWVzIG9yIHRoYXQgYXJlIGFiYW5kb25lZCAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fU0VDVVJJVFlfQkxPQ0tJTkc9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignYXNrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIGFzayBmb3IgcHJvamVjdCBkaXJlY3RvcnkuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSA8aW5mbz5jcmVhdGUtcHJvamVjdDwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGEgbmV3IHByb2plY3QgZnJvbSBhIGdpdmVuCnBhY2thZ2UgaW50byBhIG5ldyBkaXJlY3RvcnkuIElmIGV4ZWN1dGVkIHdpdGhvdXQgcGFyYW1zIGFuZCBpbiBhIGRpcmVjdG9yeQp3aXRoIGEgY29tcG9zZXIuanNvbiBmaWxlIGl0IGluc3RhbGxzIHRoZSBwYWNrYWdlcyBmb3IgdGhlIGN1cnJlbnQgcHJvamVjdC4KCllvdSBjYW4gdXNlIHRoaXMgY29tbWFuZCB0byBib290c3RyYXAgbmV3IHByb2plY3RzIG9yIHNldHVwIGEgY2xlYW4KdmVyc2lvbi1jb250cm9sbGVkIGluc3RhbGxhdGlvbiBmb3IgZGV2ZWxvcGVycyBvZiB5b3VyIHByb2plY3QuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBjcmVhdGUtcHJvamVjdCB2ZW5kb3IvcHJvamVjdCB0YXJnZXQtZGlyZWN0b3J5IFt2ZXJzaW9uXTwvaW5mbz4KCllvdSBjYW4gYWxzbyBzcGVjaWZ5IHRoZSB2ZXJzaW9uIHdpdGggdGhlIHBhY2thZ2UgbmFtZSB1c2luZyA9IG9yIDogYXMgc2VwYXJhdG9yLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgY3JlYXRlLXByb2plY3QgdmVuZG9yL3Byb2plY3Q6dmVyc2lvbiB0YXJnZXQtZGlyZWN0b3J5PC9pbmZvPgoKVG8gaW5zdGFsbCB1bnN0YWJsZSBwYWNrYWdlcywgZWl0aGVyIHNwZWNpZnkgdGhlIHZlcnNpb24geW91IHdhbnQsIG9yIHVzZSB0aGUKLS1zdGFiaWxpdHk9ZGV2ICh3aGVyZSBkZXYgY2FuIGJlIG9uZSBvZiBSQywgYmV0YSwgYWxwaGEgb3IgZGV2KS4KClRvIHNldHVwIGEgZGV2ZWxvcGVyIHdvcmthYmxlIHZlcnNpb24geW91IHNob3VsZCBjcmVhdGUgdGhlIHByb2plY3QgdXNpbmcgdGhlIHNvdXJjZQpjb250cm9sbGVkIGNvZGUgYnkgYXBwZW5kaW5nIHRoZSA8aW5mbz4nLS1wcmVmZXItc291cmNlJzwvaW5mbz4gZmxhZy4KClRvIGluc3RhbGwgYSBwYWNrYWdlIGZyb20gYW5vdGhlciByZXBvc2l0b3J5IHRoYW4gdGhlIGRlZmF1bHQgb25lIHlvdQpjYW4gcGFzcyB0aGUgPGluZm8+Jy0tcmVwb3NpdG9yeT1odHRwczovL215cmVwb3NpdG9yeS5vcmcnPC9pbmZvPiBmbGFnLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjY3JlYXRlLXByb2plY3QKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0LCB0cnVlKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiZGV2Ii4gRGV2IHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQgYnkgZGVmYXVsdCBub3cuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tY3VzdG9tLWluc3RhbGxlcnMnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJuby1jdXN0b20taW5zdGFsbGVycyIuIFVzZSAibm8tcGx1Z2lucyIgaW5zdGVhZC48L3dhcm5pbmc+Jyk7CiRpbnB1dC0+c2V0T3B0aW9uKCduby1wbHVnaW5zJywgdHJ1ZSk7Cn0KCmlmICgkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSAmJiAkaW5wdXQtPmdldE9wdGlvbignYXNrJykpIHsKJHBhY2thZ2UgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyk7CmlmIChudWxsID09PSAkcGFja2FnZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ05vdCBlbm91Z2ggYXJndW1lbnRzIChtaXNzaW5nOiAicGFja2FnZSIpLicpOwp9CiRwYXJ0cyA9IGV4cGxvZGUoIi8iLCBzdHJ0b2xvd2VyKCRwYWNrYWdlKSwgMik7CiRpbnB1dC0+c2V0QXJndW1lbnQoJ2RpcmVjdG9yeScsICRpby0+YXNrKCdOZXcgcHJvamVjdCBkaXJlY3RvcnkgWzxjb21tZW50PicuYXJyYXlfcG9wKCRwYXJ0cykuJzwvY29tbWVudD5dOiAnKSk7Cn0KCnJldHVybiAkdGhpcy0+aW5zdGFsbFByb2plY3QoCiRpbywKJGNvbmZpZywKJGlucHV0LAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJyksCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ2RpcmVjdG9yeScpLAokaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdzdGFiaWxpdHknKSwKJHByZWZlclNvdXJjZSwKJHByZWZlckRpc3QsCiEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2JyksClxjb3VudCgkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpKSA+IDAgPyAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpIDogJGlucHV0LT5nZXRPcHRpb24oJ3JlcG9zaXRvcnktdXJsJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1wbHVnaW5zJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1zY3JpcHRzJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpLAokaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpLAokdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpLAohJGlucHV0LT5nZXRPcHRpb24oJ25vLXNlY3VyZS1odHRwJyksCiRpbnB1dC0+Z2V0T3B0aW9uKCdhZGQtcmVwb3NpdG9yeScpCik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGxQcm9qZWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgP3N0cmluZyAkcGFja2FnZU5hbWUgPSBudWxsLCA/c3RyaW5nICRkaXJlY3RvcnkgPSBudWxsLCA/c3RyaW5nICRwYWNrYWdlVmVyc2lvbiA9IG51bGwsID9zdHJpbmcgJHN0YWJpbGl0eSA9ICdzdGFibGUnLCBib29sICRwcmVmZXJTb3VyY2UgPSBmYWxzZSwgYm9vbCAkcHJlZmVyRGlzdCA9IGZhbHNlLCBib29sICRpbnN0YWxsRGV2UGFja2FnZXMgPSBmYWxzZSwgJHJlcG9zaXRvcmllcyA9IG51bGwsIGJvb2wgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UsIGJvb2wgJG5vUHJvZ3Jlc3MgPSBmYWxzZSwgYm9vbCAkbm9JbnN0YWxsID0gZmFsc2UsID9QbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gbnVsbCwgYm9vbCAkc2VjdXJlSHR0cCA9IHRydWUsIGJvb2wgJGFkZFJlcG9zaXRvcnkgPSBmYWxzZSk6IGludAp7CiRvbGRDd2QgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCk7CgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAhaXNfYXJyYXkoJHJlcG9zaXRvcmllcykpIHsKJHJlcG9zaXRvcmllcyA9IChhcnJheSkgJHJlcG9zaXRvcmllczsKfQoKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA/PyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwoKCiRpby0+bG9hZENvbmZpZ3VyYXRpb24oJGNvbmZpZyk7CgokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciA9IG5ldyBTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCRpbyk7CgppZiAoJHBhY2thZ2VOYW1lICE9PSBudWxsKSB7CiRpbnN0YWxsZWRGcm9tVmNzID0gJHRoaXMtPmluc3RhbGxSb290UGFja2FnZSgkaW5wdXQsICRpbywgJGNvbmZpZywgJHBhY2thZ2VOYW1lLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgJGRpcmVjdG9yeSwgJHBhY2thZ2VWZXJzaW9uLCAkc3RhYmlsaXR5LCAkcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdCwgJGluc3RhbGxEZXZQYWNrYWdlcywgJHJlcG9zaXRvcmllcywgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMsICRub1Byb2dyZXNzLCAkc2VjdXJlSHR0cCk7Cn0gZWxzZSB7CiRpbnN0YWxsZWRGcm9tVmNzID0gZmFsc2U7Cn0KCmlmICgkcmVwb3NpdG9yaWVzICE9PSBudWxsICYmICRhZGRSZXBvc2l0b3J5ICYmIGlzX2ZpbGUoJ2NvbXBvc2VyLmxvY2snKSkgewp1bmxpbmsoJ2NvbXBvc2VyLmxvY2snKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sIG51bGwsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKCgppZiAoJHJlcG9zaXRvcmllcyAhPT0gbnVsbCAmJiAkYWRkUmVwb3NpdG9yeSkgewpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRpbmRleCA9PiAkcmVwbykgewokcmVwb0NvbmZpZyA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJHJlcG8sIHRydWUpOwokY29tcG9zZXJKc29uUmVwb3NpdG9yaWVzQ29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0UmVwb3NpdG9yaWVzKCk7CiRuYW1lID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmdlbmVyYXRlUmVwb3NpdG9yeU5hbWUoJGluZGV4LCAkcmVwb0NvbmZpZywgJGNvbXBvc2VySnNvblJlcG9zaXRvcmllc0NvbmZpZyk7CiRjb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUoJ2NvbXBvc2VyLmpzb24nKSk7CgppZiAoCihpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0J10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdCcgPT4gZmFsc2VdKQp8fCAoaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdC5vcmcnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdKQopIHsKJGNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgncGFja2FnaXN0Lm9yZycsIGZhbHNlKTsKfSBlbHNlIHsKJGNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgkbmFtZSwgJHJlcG9Db25maWcsIGZhbHNlKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sIG51bGwsICRkaXNhYmxlUGx1Z2lucyk7Cn0KfQoKJHByb2Nlc3MgPSAkY29tcG9zZXItPmdldExvb3AoKS0+Z2V0UHJvY2Vzc0V4ZWN1dG9yKCk7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKCgokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdChTY3JpcHRFdmVudHM6OlBPU1RfUk9PVF9QQUNLQUdFX0lOU1RBTEwsICRpbnN0YWxsRGV2UGFja2FnZXMpOwoKCiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwpbJHByZWZlclNvdXJjZSwgJHByZWZlckRpc3RdID0gJHRoaXMtPmdldFByZWZlcnJlZEluc3RhbGxPcHRpb25zKCRjb25maWcsICRpbnB1dCk7CgoKaWYgKCRub0luc3RhbGwgPT09IGZhbHNlKSB7CiRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5zZXRPdXRwdXRQcm9ncmVzcyghJG5vUHJvZ3Jlc3MpOwoKJGluc3RhbGxlciA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKJGluc3RhbGxlci0+c2V0UHJlZmVyU291cmNlKCRwcmVmZXJTb3VyY2UpCi0+c2V0UHJlZmVyRGlzdCgkcHJlZmVyRGlzdCkKLT5zZXREZXZNb2RlKCRpbnN0YWxsRGV2UGFja2FnZXMpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikKLT5zZXRTdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKCR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKSkKLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykpCi0+c2V0QXBjdUF1dG9sb2FkZXIoJGNvbmZpZy0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKSkKLT5zZXRBdWRpdENvbmZpZygkdGhpcy0+Y3JlYXRlQXVkaXRDb25maWcoJGNvbmZpZywgJGlucHV0KSk7CgppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKJGluc3RhbGxlci0+c2V0VXBkYXRlKHRydWUpOwp9CgppZiAoJGRpc2FibGVQbHVnaW5zKSB7CiRpbnN0YWxsZXItPmRpc2FibGVQbHVnaW5zKCk7Cn0KCnRyeSB7CiRzdGF0dXMgPSAkaW5zdGFsbGVyLT5ydW4oKTsKaWYgKDAgIT09ICRzdGF0dXMpIHsKcmV0dXJuICRzdGF0dXM7Cn0KfSBjYXRjaCAoUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbiAkZSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5IaW50OiBUbyBhbGxvdyBydW5uaW5nIHRoZSBjb25maWcgY29tbWFuZCByZWNvbW1lbmRlZCBiZWxvdyBiZWZvcmUgZGVwZW5kZW5jaWVzIGFyZSBpbnN0YWxsZWQsIHJ1biBjcmVhdGUtcHJvamVjdCB3aXRoIC0tbm8taW5zdGFsbC48L2Vycm9yPicpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Zb3UgY2FuIHRoZW4gY2QgaW50byAnLmdldGN3ZCgpLicsIGNvbmZpZ3VyZSBhbGxvdy1wbHVnaW5zLCBhbmQgZmluYWxseSBydW4gYSBjb21wb3NlciBpbnN0YWxsIHRvIGNvbXBsZXRlIHRoZSBwcm9jZXNzLjwvZXJyb3I+Jyk7CnRocm93ICRlOwp9Cn0KCiRoYXNWY3MgPSAkaW5zdGFsbGVkRnJvbVZjczsKaWYgKAohJGlucHV0LT5nZXRPcHRpb24oJ2tlZXAtdmNzJykKJiYgJGluc3RhbGxlZEZyb21WY3MKJiYgKAokaW5wdXQtPmdldE9wdGlvbigncmVtb3ZlLXZjcycpCnx8ICEkaW8tPmlzSW50ZXJhY3RpdmUoKQp8fCAkaW8tPmFza0NvbmZpcm1hdGlvbignPGluZm8+RG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBleGlzdGluZyBWQ1MgKC5naXQsIC5zdm4uLikgaGlzdG9yeT88L2luZm8+IFs8Y29tbWVudD55LG48L2NvbW1lbnQ+XT8gJykKKQopIHsKJGZpbmRlciA9IG5ldyBGaW5kZXIoKTsKJGZpbmRlci0+ZGVwdGgoMCktPmRpcmVjdG9yaWVzKCktPmluKFBsYXRmb3JtOjpnZXRDd2QoKSktPmlnbm9yZVZDUyhmYWxzZSktPmlnbm9yZURvdEZpbGVzKGZhbHNlKTsKZm9yZWFjaCAoWycuc3ZuJywgJ19zdm4nLCAnQ1ZTJywgJ19kYXJjcycsICcuYXJjaC1wYXJhbXMnLCAnLm1vbm90b25lJywgJy5ienInLCAnLmdpdCcsICcuaGcnLCAnLmZzbGNrb3V0JywgJ19GT1NTSUxfJ10gYXMgJHZjc05hbWUpIHsKJGZpbmRlci0+bmFtZSgkdmNzTmFtZSk7Cn0KCnRyeSB7CiRkaXJzID0gaXRlcmF0b3JfdG9fYXJyYXkoJGZpbmRlcik7CnVuc2V0KCRmaW5kZXIpOwpmb3JlYWNoICgkZGlycyBhcyAkZGlyKSB7CmlmICghJGZzLT5yZW1vdmVEaXJlY3RvcnkoKHN0cmluZykgJGRpcikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVtb3ZlICcuJGRpcik7Cn0KfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIHRoZSBWQ1MgbWV0YWRhdGE6ICcuJGUtPmdldE1lc3NhZ2UoKS4nPC9lcnJvcj4nKTsKfQoKJGhhc1ZjcyA9IGZhbHNlOwp9CgoKaWYgKCEkaGFzVmNzKSB7CiRwYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRjb25maWdTb3VyY2UgPSBuZXcgSnNvbkNvbmZpZ1NvdXJjZShuZXcgSnNvbkZpbGUoJ2NvbXBvc2VyLmpzb24nKSk7CmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRtZXRhKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT57J2dldCcuJG1ldGFbJ21ldGhvZCddfSgpIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpID09PSAnc2VsZi52ZXJzaW9uJykgewokY29uZmlnU291cmNlLT5hZGRMaW5rKCR0eXBlLCAkbGluay0+Z2V0VGFyZ2V0KCksICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwp9Cn0KfQp9CgoKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX0NSRUFURV9QUk9KRUNUX0NNRCwgJGluc3RhbGxEZXZQYWNrYWdlcyk7CgpjaGRpcigkb2xkQ3dkKTsKCnJldHVybiAwOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbnN0YWxsUm9vdFBhY2thZ2UoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLCA/c3RyaW5nICRkaXJlY3RvcnkgPSBudWxsLCA/c3RyaW5nICRwYWNrYWdlVmVyc2lvbiA9IG51bGwsID9zdHJpbmcgJHN0YWJpbGl0eSA9ICdzdGFibGUnLCBib29sICRwcmVmZXJTb3VyY2UgPSBmYWxzZSwgYm9vbCAkcHJlZmVyRGlzdCA9IGZhbHNlLCBib29sICRpbnN0YWxsRGV2UGFja2FnZXMgPSBmYWxzZSwgP2FycmF5ICRyZXBvc2l0b3JpZXMgPSBudWxsLCBib29sICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlLCBib29sICRkaXNhYmxlU2NyaXB0cyA9IGZhbHNlLCBib29sICRub1Byb2dyZXNzID0gZmFsc2UsIGJvb2wgJHNlY3VyZUh0dHAgPSB0cnVlKTogYm9vbAp7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokcmVxdWlyZW1lbnRzID0gJHBhcnNlci0+cGFyc2VOYW1lVmVyc2lvblBhaXJzKFskcGFja2FnZU5hbWVdKTsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXF1aXJlbWVudHNbMF1bJ25hbWUnXSk7CmlmICghJHBhY2thZ2VWZXJzaW9uICYmIGlzc2V0KCRyZXF1aXJlbWVudHNbMF1bJ3ZlcnNpb24nXSkpIHsKJHBhY2thZ2VWZXJzaW9uID0gJHJlcXVpcmVtZW50c1swXVsndmVyc2lvbiddOwp9CgoKaWYgKG51bGwgPT09ICRkaXJlY3RvcnkpIHsKJHBhcnRzID0gZXhwbG9kZSgiLyIsICRuYW1lLCAyKTsKJGRpcmVjdG9yeSA9IFBsYXRmb3JtOjpnZXRDd2QoKSAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiBhcnJheV9wb3AoJHBhcnRzKTsKfQokZGlyZWN0b3J5ID0gcnRyaW0oJGRpcmVjdG9yeSwgJy9cXCcpOwoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCRwcm9jZXNzKTsKaWYgKCEkZnMtPmlzQWJzb2x1dGVQYXRoKCRkaXJlY3RvcnkpKSB7CiRkaXJlY3RvcnkgPSBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGRpcmVjdG9yeTsKfQppZiAoJycgPT09ICRkaXJlY3RvcnkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0dvdCBhbiBlbXB0eSB0YXJnZXQgZGlyZWN0b3J5LCBzb21ldGhpbmcgd2VudCB3cm9uZycpOwp9CgoKJGNvbmZpZy0+c2V0QmFzZURpcigkZGlyZWN0b3J5KTsKaWYgKCEkc2VjdXJlSHR0cCkgewokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gWydzZWN1cmUtaHR0cCcgPT4gZmFsc2VdXSwgQ29uZmlnOjpTT1VSQ0VfQ09NTUFORCk7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+Q3JlYXRpbmcgYSAiJyAuICRwYWNrYWdlTmFtZSAuICciIHByb2plY3QgYXQgIicgLiAkZnMtPmZpbmRTaG9ydGVzdFBhdGgoUGxhdGZvcm06OmdldEN3ZCgpLCAkZGlyZWN0b3J5LCB0cnVlKSAuICciPC9pbmZvPicpOwoKaWYgKGZpbGVfZXhpc3RzKCRkaXJlY3RvcnkpKSB7CmlmICghaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdDYW5ub3QgY3JlYXRlIHByb2plY3QgZGlyZWN0b3J5IGF0ICInLiRkaXJlY3RvcnkuJyIsIGl0IGV4aXN0cyBhcyBhIGZpbGUuJyk7Cn0KaWYgKCEkZnMtPmlzRGlyRW1wdHkoJGRpcmVjdG9yeSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Byb2plY3QgZGlyZWN0b3J5ICInLiRkaXJlY3RvcnkuJyIgaXMgbm90IGVtcHR5LicpOwp9Cn0KCmlmIChudWxsID09PSAkc3RhYmlsaXR5KSB7CmlmIChudWxsID09PSAkcGFja2FnZVZlcnNpb24pIHsKJHN0YWJpbGl0eSA9ICdzdGFibGUnOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15bXixcc10qP0AoJy5pbXBsb2RlKCd8JywgYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMpKS4nKSR9aScsICRwYWNrYWdlVmVyc2lvbiwgJG1hdGNoKSkgewokc3RhYmlsaXR5ID0gJG1hdGNoWzFdOwp9IGVsc2Ugewokc3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHBhY2thZ2VWZXJzaW9uKTsKfQp9Cgokc3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCRzdGFiaWxpdHkpOwoKaWYgKCFpc3NldChCYXNlUGFja2FnZTo6U1RBQklMSVRJRVNbJHN0YWJpbGl0eV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHN0YWJpbGl0eSBwcm92aWRlZCAoJy4kc3RhYmlsaXR5LicpLCBtdXN0IGJlIG9uZSBvZjogJy5pbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSkpOwp9CgokY29tcG9zZXIgPSAkdGhpcy0+Y3JlYXRlQ29tcG9zZXJJbnN0YW5jZSgkaW5wdXQsICRpbywgJGNvbmZpZy0+YWxsKCksICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CgokY29uZmlnLT5zZXRCYXNlRGlyKCRkaXJlY3RvcnkpOwokcm0gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCk7CgokcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCRzdGFiaWxpdHkpOwppZiAobnVsbCA9PT0gJHJlcG9zaXRvcmllcykgewokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeShuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zKCRpbywgJGNvbmZpZywgJHJtKSkpOwp9IGVsc2Ugewpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CiRyZXBvQ29uZmlnID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNvbmZpZ0Zyb21TdHJpbmcoJGlvLCAkY29uZmlnLCAkcmVwbywgdHJ1ZSk7CmlmICgKKGlzc2V0KCRyZXBvQ29uZmlnWydwYWNrYWdpc3QnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0JyA9PiBmYWxzZV0pCnx8IChpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0Lm9yZyddKSAmJiAkcmVwb0NvbmZpZyA9PT0gWydwYWNrYWdpc3Qub3JnJyA9PiBmYWxzZV0pCikgewpjb250aW51ZTsKfQoKCmlmICgoJHJlcG9Db25maWdbJ3R5cGUnXSA/PyBudWxsKSA9PT0gJ3BhdGgnICYmICFpc3NldCgkcmVwb0NvbmZpZ1snb3B0aW9ucyddWydzeW1saW5rJ10pKSB7CiRyZXBvQ29uZmlnWydvcHRpb25zJ11bJ3N5bWxpbmsnXSA9IGZhbHNlOwp9CgokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeShSZXBvc2l0b3J5RmFjdG9yeTo6Y3JlYXRlUmVwbygkaW8sICRjb25maWcsICRyZXBvQ29uZmlnLCAkcm0pKTsKfQp9CgokcGxhdGZvcm1PdmVycmlkZXMgPSAkY29uZmlnLT5nZXQoJ3BsYXRmb3JtJyk7CiRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpOwoKCiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKCRyZXBvc2l0b3J5U2V0LCAkcGxhdGZvcm1SZXBvKTsKJHBhY2thZ2UgPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkbmFtZSwgJHBhY2thZ2VWZXJzaW9uLCAkc3RhYmlsaXR5LCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciwgMCwgJGlvKTsKCmlmICghJHBhY2thZ2UpIHsKJGVycm9yTWVzc2FnZSA9ICJDb3VsZCBub3QgZmluZCBwYWNrYWdlICRuYW1lIHdpdGggIiAuICgkcGFja2FnZVZlcnNpb24gPyAidmVyc2lvbiAkcGFja2FnZVZlcnNpb24iIDogInN0YWJpbGl0eSAkc3RhYmlsaXR5Iik7CmlmICghKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgJiYgJHZlcnNpb25TZWxlY3Rvci0+ZmluZEJlc3RDYW5kaWRhdGUoJG5hbWUsICRwYWNrYWdlVmVyc2lvbiwgJHN0YWJpbGl0eSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZUFsbCgpKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkZXJyb3JNZXNzYWdlIC4nIGluIGEgdmVyc2lvbiBpbnN0YWxsYWJsZSB1c2luZyB5b3VyIFBIUCB2ZXJzaW9uLCBQSFAgZXh0ZW5zaW9ucyBhbmQgQ29tcG9zZXIgdmVyc2lvbi4nKTsKfQoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJGVycm9yTWVzc2FnZSAuJy4nKTsKfQoKCkBta2RpcigkZGlyZWN0b3J5LCAwNzc3LCB0cnVlKTsKaWYgKGZhbHNlICE9PSAoJHJlYWxEaXIgPSByZWFscGF0aCgkZGlyZWN0b3J5KSkpIHsKJHNpZ25hbEhhbmRsZXIgPSBTaWduYWxIYW5kbGVyOjpjcmVhdGUoW1NpZ25hbEhhbmRsZXI6OlNJR0lOVCwgU2lnbmFsSGFuZGxlcjo6U0lHVEVSTSwgU2lnbmFsSGFuZGxlcjo6U0lHSFVQXSwgZnVuY3Rpb24gKHN0cmluZyAkc2lnbmFsLCBTaWduYWxIYW5kbGVyICRoYW5kbGVyKSB1c2UgKCRyZWFsRGlyKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwokZnMtPnJlbW92ZURpcmVjdG9yeSgkcmVhbERpcik7CiRoYW5kbGVyLT5leGl0V2l0aExhc3RTaWduYWwoKTsKfSk7Cn0KCgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkluc3RhbGxpbmcgJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnICgnIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKGZhbHNlKSAuICcpPC9pbmZvPicpOwoKaWYgKCRkaXNhYmxlUGx1Z2lucykgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPlBsdWdpbnMgaGF2ZSBiZWVuIGRpc2FibGVkLjwvaW5mbz4nKTsKfQoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKJGRtID0gJGNvbXBvc2VyLT5nZXREb3dubG9hZE1hbmFnZXIoKTsKJGRtLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSkKLT5zZXRQcmVmZXJEaXN0KCRwcmVmZXJEaXN0KTsKCiRwcm9qZWN0SW5zdGFsbGVyID0gbmV3IFByb2plY3RJbnN0YWxsZXIoJGRpcmVjdG9yeSwgJGRtLCAkZnMpOwokaW0gPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKTsKJGltLT5zZXRPdXRwdXRQcm9ncmVzcyghJG5vUHJvZ3Jlc3MpOwokaW0tPmFkZEluc3RhbGxlcigkcHJvamVjdEluc3RhbGxlcik7CiRpbS0+ZXhlY3V0ZShuZXcgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5KCksIFtuZXcgSW5zdGFsbE9wZXJhdGlvbigkcGFja2FnZSldKTsKJGltLT5ub3RpZnlJbnN0YWxscygkaW8pOwoKCiR0aGlzLT5zdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyLT5hZGRTdWdnZXN0aW9uc0Zyb21QYWNrYWdlKCRwYWNrYWdlKTsKCiRpbnN0YWxsZWRGcm9tVmNzID0gJ3NvdXJjZScgPT09ICRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTsKCiRpby0+d3JpdGVFcnJvcignPGluZm8+Q3JlYXRlZCBwcm9qZWN0IGluICcgLiAkZGlyZWN0b3J5IC4gJzwvaW5mbz4nKTsKY2hkaXIoJGRpcmVjdG9yeSk7CgoKCgppZiAoZmlsZV9leGlzdHMoJGRpcmVjdG9yeS4nL2NvbXBvc2VyLmpzb24nKSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUicpICE9PSBmYWxzZSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0NPTVBPU0VSJyk7Cn0KClBsYXRmb3JtOjpwdXRFbnYoJ0NPTVBPU0VSX1JPT1RfVkVSU0lPTicsICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwoKCmlmIChpc3NldCgkc2lnbmFsSGFuZGxlcikpIHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQoKcmV0dXJuICRpbnN0YWxsZWRGcm9tVmNzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgpjbGFzcyBEZXBlbmRzQ29tbWFuZCBleHRlbmRzIEJhc2VEZXBlbmRlbmN5Q29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2RlcGVuZHMnKQotPnNldEFsaWFzZXMoWyd3aHknXSkKLT5zZXREZXNjcmlwdGlvbignU2hvd3Mgd2hpY2ggcGFja2FnZXMgY2F1c2UgdGhlIGdpdmVuIHBhY2thZ2UgdG8gYmUgaW5zdGFsbGVkJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoc2VsZjo6QVJHVU1FTlRfUEFDS0FHRSwgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICdQYWNrYWdlIHRvIGluc3BlY3QnLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UodHJ1ZSwgdHJ1ZSkpLApuZXcgSW5wdXRPcHRpb24oc2VsZjo6T1BUSU9OX1JFQ1VSU0lWRSwgJ3InLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlY3Vyc2l2ZWx5IHJlc29sdmVzIHVwIHRvIHRoZSByb290IHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKHNlbGY6Ok9QVElPTl9UUkVFLCAndCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJpbnRzIHRoZSByZXN1bHRzIGFzIGEgbmVzdGVkIHRyZWUnKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlYWQgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBmcm9tIGNvbXBvc2VyLmxvY2snKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKRGlzcGxheXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgYSBwYWNrYWdlIGlzIHJlZmVyZW5jZWQuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciBkZXBlbmRzIGNvbXBvc2VyL2NvbXBvc2VyPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZGVwZW5kcy13aHkKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKcmV0dXJuIHBhcmVudDo6ZG9FeGVjdXRlKCRpbnB1dCwgJG91dHB1dCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxJT1xCdWZmZXJJTzsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2VyUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcRmlsZXN5c3RlbVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcVXRpbFxDb25maWdWYWxpZGF0b3I7CnVzZSBDb21wb3NlclxVdGlsXEdpdDsKdXNlIENvbXBvc2VyXFV0aWxcSW5pSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFNlbGZVcGRhdGVcS2V5czsKdXNlIENvbXBvc2VyXFNlbGZVcGRhdGVcVmVyc2lvbnM7CnVzZSBDb21wb3NlclxJT1xOdWxsSU87CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlcXVlc3RQcm94eTsKCgoKCmNsYXNzIERpYWdub3NlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCnByb3RlY3RlZCAkaHR0cERvd25sb2FkZXI7CgoKcHJvdGVjdGVkICRwcm9jZXNzOwoKCnByb3RlY3RlZCAkZXhpdENvZGUgPSAwOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdkaWFnbm9zZScpCi0+c2V0RGVzY3JpcHRpb24oJ0RpYWdub3NlcyB0aGUgc3lzdGVtIHRvIGlkZW50aWZ5IGNvbW1vbiBlcnJvcnMnKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+ZGlhZ25vc2U8L2luZm8+IGNvbW1hbmQgY2hlY2tzIGNvbW1vbiBlcnJvcnMgdG8gaGVscCBkZWJ1Z2dpbmcgcHJvYmxlbXMuCgpUaGUgcHJvY2VzcyBleGl0IGNvZGUgd2lsbCBiZSAxIGluIGNhc2Ugb2Ygd2FybmluZ3MgYW5kIDIgZm9yIGVycm9ycy4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI2RpYWdub3NlCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmICgkY29tcG9zZXIpIHsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdkaWFnbm9zZScsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CiR0aGlzLT5wcm9jZXNzID0gJGNvbXBvc2VyLT5nZXRMb29wKCktPmdldFByb2Nlc3NFeGVjdXRvcigpID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKfSBlbHNlIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygpOwoKJHRoaXMtPnByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0KCiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiBbJ3NlY3VyZS1odHRwJyA9PiBmYWxzZV1dLCBDb25maWc6OlNPVVJDRV9DT01NQU5EKTsKJGNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygnaHR0cDovL3JlcG8ucGFja2FnaXN0Lm9yZycsIG5ldyBOdWxsSU8pOwoKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKCmlmIChzdHJwb3MoX19GSUxFX18sICdwaGFyOicpID09PSAwKSB7CiRpby0+d3JpdGUoJ0NoZWNraW5nIHB1YmtleXM6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tQdWJLZXlzKCRjb25maWcpKTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIENvbXBvc2VyIHZlcnNpb246ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tWZXJzaW9uKCRjb25maWcpKTsKfQoKJGlvLT53cml0ZShzcHJpbnRmKCdDb21wb3NlciB2ZXJzaW9uOiA8Y29tbWVudD4lczwvY29tbWVudD4nLCBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBDb21wb3NlciBhbmQgaXRzIGRlcGVuZGVuY2llcyBmb3IgdnVsbmVyYWJpbGl0aWVzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrQ29tcG9zZXJBdWRpdCgkY29uZmlnKSk7CgokcGxhdGZvcm1PdmVycmlkZXMgPSAkY29uZmlnLT5nZXQoJ3BsYXRmb3JtJykgPzogW107CiRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpOwokcGhwUGtnID0gJHBsYXRmb3JtUmVwby0+ZmluZFBhY2thZ2UoJ3BocCcsICcqJyk7CiRwaHBWZXJzaW9uID0gJHBocFBrZy0+Z2V0UHJldHR5VmVyc2lvbigpOwppZiAoJHBocFBrZyBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiBzdHJfY29udGFpbnMoKHN0cmluZykgJHBocFBrZy0+Z2V0RGVzY3JpcHRpb24oKSwgJ292ZXJyaWRkZW4nKSkgewokcGhwVmVyc2lvbiAuPSAnIC0gJyAuICRwaHBQa2ctPmdldERlc2NyaXB0aW9uKCk7Cn0KCiRpby0+d3JpdGUoc3ByaW50ZignUEhQIHZlcnNpb246IDxjb21tZW50PiVzPC9jb21tZW50PicsICRwaHBWZXJzaW9uKSk7CgppZiAoZGVmaW5lZCgnUEhQX0JJTkFSWScpKSB7CiRpby0+d3JpdGUoc3ByaW50ZignUEhQIGJpbmFyeSBwYXRoOiA8Y29tbWVudD4lczwvY29tbWVudD4nLCBQSFBfQklOQVJZKSk7Cn0KCiRpby0+d3JpdGUoJ09wZW5TU0wgdmVyc2lvbjogJyAuIChkZWZpbmVkKCdPUEVOU1NMX1ZFUlNJT05fVEVYVCcpID8gJzxjb21tZW50PicuT1BFTlNTTF9WRVJTSU9OX1RFWFQuJzwvY29tbWVudD4nIDogJzxlcnJvcj5taXNzaW5nPC9lcnJvcj4nKSk7CiRpby0+d3JpdGUoJ2N1cmwgdmVyc2lvbjogJyAuICR0aGlzLT5nZXRDdXJsVmVyc2lvbigpKTsKCiRmaW5kZXIgPSBuZXcgRXhlY3V0YWJsZUZpbmRlcjsKJGhhc1N5c3RlbVVuemlwID0gKGJvb2wpICRmaW5kZXItPmZpbmQoJ3VuemlwJyk7CiRiaW43emlwID0gJyc7CmlmICgkaGFzU3lzdGVtN3ppcCA9IChib29sKSAkZmluZGVyLT5maW5kKCc3eicsIG51bGwsIFsnQzpcUHJvZ3JhbSBGaWxlc1w3LVppcCddKSkgewokYmluN3ppcCA9ICc3eic7Cn0KaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgISRoYXNTeXN0ZW03emlwICYmICRoYXNTeXN0ZW03emlwID0gKGJvb2wpICRmaW5kZXItPmZpbmQoJzd6eicpKSB7CiRiaW43emlwID0gJzd6eic7Cn0KCiRpby0+d3JpdGUoCid6aXA6ICcgLiAoZXh0ZW5zaW9uX2xvYWRlZCgnemlwJykgPyAnPGNvbW1lbnQ+ZXh0ZW5zaW9uIHByZXNlbnQ8L2NvbW1lbnQ+JyA6ICc8Y29tbWVudD5leHRlbnNpb24gbm90IGxvYWRlZDwvY29tbWVudD4nKQouICcsICcgLiAoJGhhc1N5c3RlbVVuemlwID8gJzxjb21tZW50PnVuemlwIHByZXNlbnQ8L2NvbW1lbnQ+JyA6ICc8Y29tbWVudD51bnppcCBub3QgYXZhaWxhYmxlPC9jb21tZW50PicpCi4gJywgJyAuICgkaGFzU3lzdGVtN3ppcCA/ICc8Y29tbWVudD43LVppcCBwcmVzZW50ICgnLiRiaW43emlwLicpPC9jb21tZW50PicgOiAnPGNvbW1lbnQ+Ny1aaXAgbm90IGF2YWlsYWJsZTwvY29tbWVudD4nKQouICgoJGhhc1N5c3RlbTd6aXAgfHwgJGhhc1N5c3RlbVVuemlwKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSA/ICcsIDx3YXJuaW5nPnByb2Nfb3BlbiBpcyBkaXNhYmxlZCBvciBub3QgcHJlc2VudCwgdW56aXAvNy16IHdpbGwgbm90IGJlIHVzYWJsZTwvd2FybmluZz4nIDogJycpCik7CgppZiAoJGNvbXBvc2VyKSB7CiRpby0+d3JpdGUoJ0FjdGl2ZSBwbHVnaW5zOiAnLmltcGxvZGUoJywgJywgJGNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmdldFJlZ2lzdGVyZWRQbHVnaW5zKCkpKTsKCiRpby0+d3JpdGUoJ0NoZWNraW5nIGNvbXBvc2VyLmpzb246ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tDb21wb3NlclNjaGVtYSgpKTsKCmlmICgkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CiRpby0+d3JpdGUoJ0NoZWNraW5nIGNvbXBvc2VyLmxvY2s6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tDb21wb3NlckxvY2tTY2hlbWEoJGNvbXBvc2VyLT5nZXRMb2NrZXIoKSkpOwp9Cn0KCiRpby0+d3JpdGUoJ0NoZWNraW5nIHBsYXRmb3JtIHNldHRpbmdzOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrUGxhdGZvcm0oKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBnaXQgc2V0dGluZ3M6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tHaXQoKSk7CgokaW8tPndyaXRlKCdDaGVja2luZyBodHRwIGNvbm5lY3Rpdml0eSB0byBwYWNrYWdpc3Q6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tIdHRwKCdodHRwJywgJGNvbmZpZykpOwoKJGlvLT53cml0ZSgnQ2hlY2tpbmcgaHR0cHMgY29ubmVjdGl2aXR5IHRvIHBhY2thZ2lzdDogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja0h0dHAoJ2h0dHBzJywgJGNvbmZpZykpOwoKZm9yZWFjaCAoJGNvbmZpZy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKaWYgKCgkcmVwb1sndHlwZSddID8/IG51bGwpID09PSAnY29tcG9zZXInICYmIGlzc2V0KCRyZXBvWyd1cmwnXSkpIHsKJGNvbXBvc2VyUmVwbyA9IG5ldyBDb21wb3NlclJlcG9zaXRvcnkoJHJlcG8sICR0aGlzLT5nZXRJTygpLCAkY29uZmlnLCAkdGhpcy0+aHR0cERvd25sb2FkZXIpOwokcmVmbE1ldGhvZCA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY29tcG9zZXJSZXBvLCAnZ2V0UGFja2FnZXNKc29uVXJsJyk7CmlmIChQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSB7CiRyZWZsTWV0aG9kLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwp9CiR1cmwgPSAkcmVmbE1ldGhvZC0+aW52b2tlKCRjb21wb3NlclJlcG8pOwppZiAoIXN0cl9zdGFydHNfd2l0aCgkdXJsLCAnaHR0cCcpKSB7CmNvbnRpbnVlOwp9CmlmIChzdHJfc3RhcnRzX3dpdGgoJHVybCwgJ2h0dHBzOi8vcmVwby5wYWNrYWdpc3Qub3JnJykpIHsKY29udGludWU7Cn0KJGlvLT53cml0ZSgnQ2hlY2tpbmcgY29ubmVjdGl2aXR5IHRvICcgLiAkcmVwb1sndXJsJ10uJzogJywgZmFsc2UpOwokdGhpcy0+b3V0cHV0UmVzdWx0KCR0aGlzLT5jaGVja0NvbXBvc2VyUmVwbygkdXJsLCAkY29uZmlnKSk7Cn0KfQoKJHByb3h5TWFuYWdlciA9IFByb3h5TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKJHByb3RvcyA9ICRjb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSA/IFsnaHR0cCddIDogWydodHRwJywgJ2h0dHBzJ107CnRyeSB7CmZvcmVhY2ggKCRwcm90b3MgYXMgJHByb3RvKSB7CiRwcm94eSA9ICRwcm94eU1hbmFnZXItPmdldFByb3h5Rm9yUmVxdWVzdCgkcHJvdG8uJzovL3JlcG8ucGFja2FnaXN0Lm9yZycpOwppZiAoJHByb3h5LT5nZXRTdGF0dXMoKSAhPT0gJycpIHsKJHR5cGUgPSAkcHJveHktPmlzU2VjdXJlKCkgPyAnSFRUUFMnIDogJ0hUVFAnOwokaW8tPndyaXRlKCdDaGVja2luZyAnLiR0eXBlLicgcHJveHkgd2l0aCAnLiRwcm90by4nOiAnLCBmYWxzZSk7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHRoaXMtPmNoZWNrSHR0cFByb3h5KCRwcm94eSwgJHByb3RvKSk7Cn0KfQp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGlvLT53cml0ZSgnQ2hlY2tpbmcgSFRUUCBwcm94eTogJywgZmFsc2UpOwokc3RhdHVzID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKJHRoaXMtPm91dHB1dFJlc3VsdChpc19zdHJpbmcoJHN0YXR1cykgPyAkc3RhdHVzIDogJGUpOwp9CgppZiAoY291bnQoJG9hdXRoID0gJGNvbmZpZy0+Z2V0KCdnaXRodWItb2F1dGgnKSkgPiAwKSB7CmZvcmVhY2ggKCRvYXV0aCBhcyAkZG9tYWluID0+ICR0b2tlbikgewokaW8tPndyaXRlKCdDaGVja2luZyAnLiRkb21haW4uJyBvYXV0aCBhY2Nlc3M6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tHaXRodWJPYXV0aCgkZG9tYWluLCAkdG9rZW4pKTsKfQp9IGVsc2UgewokaW8tPndyaXRlKCdDaGVja2luZyBnaXRodWIuY29tIHJhdGUgbGltaXQ6ICcsIGZhbHNlKTsKdHJ5IHsKJHJhdGUgPSAkdGhpcy0+Z2V0R2l0aHViUmF0ZUxpbWl0KCdnaXRodWIuY29tJyk7CmlmICghaXNfYXJyYXkoJHJhdGUpKSB7CiR0aGlzLT5vdXRwdXRSZXN1bHQoJHJhdGUpOwp9IGVsc2VpZiAoMTAgPiAkcmF0ZVsncmVtYWluaW5nJ10pIHsKJGlvLT53cml0ZSgnPHdhcm5pbmc+V0FSTklORzwvd2FybmluZz4nKTsKJGlvLT53cml0ZShzcHJpbnRmKAonPGNvbW1lbnQ+R2l0SHViIGhhcyBhIHJhdGUgbGltaXQgb24gdGhlaXIgQVBJLiAnCi4gJ1lvdSBjdXJyZW50bHkgaGF2ZSA8b3B0aW9ucz1ib2xkPiV1PC9vcHRpb25zPWJvbGQ+ICcKLiAnb3V0IG9mIDxvcHRpb25zPWJvbGQ+JXU8L29wdGlvbnM9Ym9sZD4gcmVxdWVzdHMgbGVmdC4nIC4gUEhQX0VPTAouICdTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuZ2l0aHViLmNvbS92My8jcmF0ZS1saW1pdGluZyBhbmQgYWxzbycgLiBQSFBfRU9MCi4gJyAgICBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvdHJvdWJsZXNob290aW5nLm1kI2FwaS1yYXRlLWxpbWl0LWFuZC1vYXV0aC10b2tlbnM8L2NvbW1lbnQ+JywKJHJhdGVbJ3JlbWFpbmluZyddLAokcmF0ZVsnbGltaXQnXQopKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dFJlc3VsdCh0cnVlKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0Q29kZSgpID09PSA0MDEpIHsKJHRoaXMtPm91dHB1dFJlc3VsdCgnPGNvbW1lbnQ+VGhlIG9hdXRoIHRva2VuIGZvciBnaXRodWIuY29tIHNlZW1zIGludmFsaWQsIHJ1biAiY29tcG9zZXIgY29uZmlnIC0tZ2xvYmFsIC0tdW5zZXQgZ2l0aHViLW9hdXRoLmdpdGh1Yi5jb20iIHRvIHJlbW92ZSBpdDwvY29tbWVudD4nKTsKfSBlbHNlIHsKJHRoaXMtPm91dHB1dFJlc3VsdCgkZSk7Cn0KfQp9CgokaW8tPndyaXRlKCdDaGVja2luZyBkaXNrIGZyZWUgc3BhY2U6ICcsIGZhbHNlKTsKJHRoaXMtPm91dHB1dFJlc3VsdCgkdGhpcy0+Y2hlY2tEaXNrU3BhY2UoJGNvbmZpZykpOwoKcmV0dXJuICR0aGlzLT5leGl0Q29kZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbXBvc2VyU2NoZW1hKCkKewokdmFsaWRhdG9yID0gbmV3IENvbmZpZ1ZhbGlkYXRvcigkdGhpcy0+Z2V0SU8oKSk7ClskZXJyb3JzLCAsICR3YXJuaW5nc10gPSAkdmFsaWRhdG9yLT52YWxpZGF0ZShGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKSk7CgppZiAoJGVycm9ycyB8fCAkd2FybmluZ3MpIHsKJG1lc3NhZ2VzID0gWwonZXJyb3InID0+ICRlcnJvcnMsCid3YXJuaW5nJyA9PiAkd2FybmluZ3MsCl07Cgokb3V0cHV0ID0gJyc7CmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkc3R5bGUgPT4gJG1zZ3MpIHsKZm9yZWFjaCAoJG1zZ3MgYXMgJG1zZykgewokb3V0cHV0IC49ICc8JyAuICRzdHlsZSAuICc+JyAuICRtc2cgLiAnPC8nIC4gJHN0eWxlIC4gJz4nIC4gUEhQX0VPTDsKfQp9CgpyZXR1cm4gcnRyaW0oJG91dHB1dCk7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29tcG9zZXJMb2NrU2NoZW1hKExvY2tlciAkbG9ja2VyKQp7CiRqc29uID0gJGxvY2tlci0+Z2V0SnNvbkZpbGUoKTsKCnRyeSB7CiRqc29uLT52YWxpZGF0ZVNjaGVtYShKc29uRmlsZTo6TE9DS19TQ0hFTUEpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokb3V0cHV0ID0gJyc7CmZvcmVhY2ggKCRlLT5nZXRFcnJvcnMoKSBhcyAkZXJyb3IpIHsKJG91dHB1dCAuPSAnPGVycm9yPicuJGVycm9yLic8L2Vycm9yPicuUEhQX0VPTDsKfQoKcmV0dXJuIHRyaW0oJG91dHB1dCk7Cn0KCnJldHVybiB0cnVlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrR2l0KCk6IHN0cmluZwp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpyZXR1cm4gJzxjb21tZW50PnByb2Nfb3BlbiBpcyBub3QgYXZhaWxhYmxlLCBnaXQgY2Fubm90IGJlIHVzZWQ8L2NvbW1lbnQ+JzsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY29uZmlnJywgJ2NvbG9yLnVpJ10sICRvdXRwdXQpOwppZiAoc3RydG9sb3dlcih0cmltKCRvdXRwdXQpKSA9PT0gJ2Fsd2F5cycpIHsKcmV0dXJuICc8Y29tbWVudD5Zb3VyIGdpdCBjb2xvci51aSBzZXR0aW5nIGlzIHNldCB0byBhbHdheXMsIHRoaXMgaXMga25vd24gdG8gY3JlYXRlIGlzc3Vlcy4gVXNlICJnaXQgY29uZmlnIC0tZ2xvYmFsIGNvbG9yLnVpIHRydWUiIHRvIHNldCBpdCBjb3JyZWN0bHkuPC9jb21tZW50Pic7Cn0KCiRnaXRWZXJzaW9uID0gR2l0OjpnZXRWZXJzaW9uKCR0aGlzLT5wcm9jZXNzKTsKaWYgKG51bGwgPT09ICRnaXRWZXJzaW9uKSB7CnJldHVybiAnPGNvbW1lbnQ+Tm8gZ2l0IHByb2Nlc3MgZm91bmQ8Lz4nOwp9CgppZiAodmVyc2lvbl9jb21wYXJlKCcyLjI0LjAnLCAkZ2l0VmVyc2lvbiwgJz4nKSkgewpyZXR1cm4gJzx3YXJuaW5nPllvdXIgZ2l0IHZlcnNpb24gKCcuJGdpdFZlcnNpb24uJykgaXMgdG9vIG9sZCBhbmQgcG9zc2libHkgd2lsbCBjYXVzZSBpc3N1ZXMuIFBsZWFzZSB1cGdyYWRlIHRvIGdpdCAyLjI0IG9yIGFib3ZlPC8+JzsKfQoKcmV0dXJuICc8aW5mbz5PSzwvPiA8Y29tbWVudD5naXQgdmVyc2lvbiAnLiRnaXRWZXJzaW9uLic8Lz4nOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrSHR0cChzdHJpbmcgJHByb3RvLCBDb25maWcgJGNvbmZpZykKewokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCiRyZXN1bHQgPSBbXTsKaWYgKCRwcm90byA9PT0gJ2h0dHBzJyAmJiAkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKJHRsc1dhcm5pbmcgPSAnPHdhcm5pbmc+Q29tcG9zZXIgaXMgY29uZmlndXJlZCB0byBkaXNhYmxlIFNTTC9UTFMgcHJvdGVjdGlvbi4gVGhpcyB3aWxsIGxlYXZlIHJlbW90ZSBIVFRQUyByZXF1ZXN0cyB2dWxuZXJhYmxlIHRvIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MuPC93YXJuaW5nPic7Cn0KCnRyeSB7CiR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRwcm90byAuICc6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvcGFja2FnZXMuanNvbicpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGhpbnRzID0gSHR0cERvd25sb2FkZXI6OmdldEV4Y2VwdGlvbkhpbnRzKCRlKTsKaWYgKG51bGwgIT09ICRoaW50cyAmJiBjb3VudCgkaGludHMpID4gMCkgewpmb3JlYWNoICgkaGludHMgYXMgJGhpbnQpIHsKJHJlc3VsdFtdID0gJGhpbnQ7Cn0KfQoKJHJlc3VsdFtdID0gJzxlcnJvcj5bJyAuIGdldF9jbGFzcygkZSkgLiAnXSAnIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L2Vycm9yPic7Cn0KCmlmIChpc3NldCgkdGxzV2FybmluZykpIHsKJHJlc3VsdFtdID0gJHRsc1dhcm5pbmc7Cn0KCmlmIChjb3VudCgkcmVzdWx0KSA+IDApIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrQ29tcG9zZXJSZXBvKHN0cmluZyAkdXJsLCBDb25maWcgJGNvbmZpZykKewokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5QW5kQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCiRyZXN1bHQgPSBbXTsKaWYgKHN0cl9zdGFydHNfd2l0aCgkdXJsLCAnaHR0cHM6Ly8nKSAmJiAkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKJHRsc1dhcm5pbmcgPSAnPHdhcm5pbmc+Q29tcG9zZXIgaXMgY29uZmlndXJlZCB0byBkaXNhYmxlIFNTTC9UTFMgcHJvdGVjdGlvbi4gVGhpcyB3aWxsIGxlYXZlIHJlbW90ZSBIVFRQUyByZXF1ZXN0cyB2dWxuZXJhYmxlIHRvIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MuPC93YXJuaW5nPic7Cn0KCnRyeSB7CiR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGhpbnRzID0gSHR0cERvd25sb2FkZXI6OmdldEV4Y2VwdGlvbkhpbnRzKCRlKTsKaWYgKG51bGwgIT09ICRoaW50cyAmJiBjb3VudCgkaGludHMpID4gMCkgewpmb3JlYWNoICgkaGludHMgYXMgJGhpbnQpIHsKJHJlc3VsdFtdID0gJGhpbnQ7Cn0KfQoKJHJlc3VsdFtdID0gJzxlcnJvcj5bJyAuIGdldF9jbGFzcygkZSkgLiAnXSAnIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L2Vycm9yPic7Cn0KCmlmIChpc3NldCgkdGxzV2FybmluZykpIHsKJHJlc3VsdFtdID0gJHRsc1dhcm5pbmc7Cn0KCmlmIChjb3VudCgkcmVzdWx0KSA+IDApIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrSHR0cFByb3h5KFJlcXVlc3RQcm94eSAkcHJveHksIHN0cmluZyAkcHJvdG9jb2wpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9Cgp0cnkgewokcHJveHlTdGF0dXMgPSAkcHJveHktPmdldFN0YXR1cygpOwoKaWYgKCRwcm94eS0+aXNFeGNsdWRlZEJ5Tm9Qcm94eSgpKSB7CnJldHVybiAnPGluZm8+U0tJUDwvPiA8Y29tbWVudD5CZWNhdXNlIHJlcG8ucGFja2FnaXN0Lm9yZyBpcyAnLiRwcm94eVN0YXR1cy4nPC8+JzsKfQoKJGpzb24gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkcHJvdG9jb2wuJzovL3JlcG8ucGFja2FnaXN0Lm9yZy9wYWNrYWdlcy5qc29uJyktPmRlY29kZUpzb24oKTsKaWYgKGlzc2V0KCRqc29uWydwcm92aWRlci1pbmNsdWRlcyddKSkgewokaGFzaCA9IHJlc2V0KCRqc29uWydwcm92aWRlci1pbmNsdWRlcyddKTsKJGhhc2ggPSAkaGFzaFsnc2hhMjU2J107CiRwYXRoID0gc3RyX3JlcGxhY2UoJyVoYXNoJScsICRoYXNoLCBrZXkoJGpzb25bJ3Byb3ZpZGVyLWluY2x1ZGVzJ10pKTsKJHByb3ZpZGVyID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHByb3RvY29sLic6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvJy4kcGF0aCktPmdldEJvZHkoKTsKCmlmIChoYXNoKCdzaGEyNTYnLCAkcHJvdmlkZXIpICE9PSAkaGFzaCkgewpyZXR1cm4gJzx3YXJuaW5nPkl0IHNlZW1zIHRoYXQgeW91ciBwcm94eSAoJy4kcHJveHlTdGF0dXMuJykgaXMgbW9kaWZ5aW5nICcuJHByb3RvY29sLicgdHJhZmZpYyBvbiB0aGUgZmx5PC8+JzsKfQp9CgpyZXR1cm4gJzxpbmZvPk9LPC8+IDxjb21tZW50PicuJHByb3h5U3RhdHVzLic8Lz4nOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnJldHVybiAkZTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrR2l0aHViT2F1dGgoc3RyaW5nICRkb21haW4sIHN0cmluZyAkdG9rZW4pCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokdGhpcy0+Z2V0SU8oKS0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwp0cnkgewokdXJsID0gJGRvbWFpbiA9PT0gJ2dpdGh1Yi5jb20nID8gJ2h0dHBzOi8vYXBpLicuJGRvbWFpbi4nLycgOiAnaHR0cHM6Ly8nLiRkb21haW4uJy9hcGkvdjMvJzsKCiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pOwoKJGV4cGlyYXRpb24gPSAkcmVzcG9uc2UtPmdldEhlYWRlcignZ2l0aHViLWF1dGhlbnRpY2F0aW9uLXRva2VuLWV4cGlyYXRpb24nKTsKCmlmICgkZXhwaXJhdGlvbiA9PT0gbnVsbCkgewpyZXR1cm4gJzxpbmZvPk9LPC8+IDxjb21tZW50PmRvZXMgbm90IGV4cGlyZTwvPic7Cn0KCnJldHVybiAnPGluZm8+T0s8Lz4gPGNvbW1lbnQ+ZXhwaXJlcyBvbiAnLiAkZXhwaXJhdGlvbiAuJzwvPic7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRDb2RlKCkgPT09IDQwMSkgewpyZXR1cm4gJzxjb21tZW50PlRoZSBvYXV0aCB0b2tlbiBmb3IgJy4kZG9tYWluLicgc2VlbXMgaW52YWxpZCwgcnVuICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS11bnNldCBnaXRodWItb2F1dGguJy4kZG9tYWluLiciIHRvIHJlbW92ZSBpdDwvY29tbWVudD4nOwp9CgpyZXR1cm4gJGU7Cn0KfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0R2l0aHViUmF0ZUxpbWl0KHN0cmluZyAkZG9tYWluLCA/c3RyaW5nICR0b2tlbiA9IG51bGwpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgppZiAoJHRva2VuKSB7CiR0aGlzLT5nZXRJTygpLT5zZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkdG9rZW4sICd4LW9hdXRoLWJhc2ljJyk7Cn0KCiR1cmwgPSAkZG9tYWluID09PSAnZ2l0aHViLmNvbScgPyAnaHR0cHM6Ly9hcGkuJy4kZG9tYWluLicvcmF0ZV9saW1pdCcgOiAnaHR0cHM6Ly8nLiRkb21haW4uJy9hcGkvcmF0ZV9saW1pdCc7CiRkYXRhID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgWydyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlXSktPmRlY29kZUpzb24oKTsKCnJldHVybiAkZGF0YVsncmVzb3VyY2VzJ11bJ2NvcmUnXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0Rpc2tTcGFjZShDb25maWcgJGNvbmZpZykKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZGlza19mcmVlX3NwYWNlJykpIHsKcmV0dXJuIHRydWU7Cn0KCiRtaW5TcGFjZUZyZWUgPSAxMDI0ICogMTAyNDsKaWYgKCgoJGRmID0gQGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gJGNvbmZpZy0+Z2V0KCdob21lJykpKSAhPT0gZmFsc2UgJiYgJGRmIDwgJG1pblNwYWNlRnJlZSkKfHwgKCgkZGYgPSBAZGlza19mcmVlX3NwYWNlKCRkaXIgPSAkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSkpICE9PSBmYWxzZSAmJiAkZGYgPCAkbWluU3BhY2VGcmVlKQopIHsKcmV0dXJuICc8ZXJyb3I+VGhlIGRpc2sgaG9zdGluZyAnLiRkaXIuJyBpcyBmdWxsPC9lcnJvcj4nOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1B1YktleXMoQ29uZmlnICRjb25maWcpCnsKJGhvbWUgPSAkY29uZmlnLT5nZXQoJ2hvbWUnKTsKJGVycm9ycyA9IFtdOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmIChmaWxlX2V4aXN0cygkaG9tZS4nL2tleXMudGFncy5wdWInKSAmJiBmaWxlX2V4aXN0cygkaG9tZS4nL2tleXMuZGV2LnB1YicpKSB7CiRpby0+d3JpdGUoJycpOwp9CgppZiAoZmlsZV9leGlzdHMoJGhvbWUuJy9rZXlzLnRhZ3MucHViJykpIHsKJGlvLT53cml0ZSgnVGFncyBQdWJsaWMgS2V5IEZpbmdlcnByaW50OiAnIC4gS2V5czo6ZmluZ2VycHJpbnQoJGhvbWUuJy9rZXlzLnRhZ3MucHViJykpOwp9IGVsc2UgewokZXJyb3JzW10gPSAnPGVycm9yPk1pc3NpbmcgcHVia2V5IGZvciB0YWdzIHZlcmlmaWNhdGlvbjwvZXJyb3I+JzsKfQoKaWYgKGZpbGVfZXhpc3RzKCRob21lLicva2V5cy5kZXYucHViJykpIHsKJGlvLT53cml0ZSgnRGV2IFB1YmxpYyBLZXkgRmluZ2VycHJpbnQ6ICcgLiBLZXlzOjpmaW5nZXJwcmludCgkaG9tZS4nL2tleXMuZGV2LnB1YicpKTsKfSBlbHNlIHsKJGVycm9yc1tdID0gJzxlcnJvcj5NaXNzaW5nIHB1YmtleSBmb3IgZGV2IHZlcmlmaWNhdGlvbjwvZXJyb3I+JzsKfQoKaWYgKCRlcnJvcnMpIHsKJGVycm9yc1tdID0gJzxlcnJvcj5SdW4gY29tcG9zZXIgc2VsZi11cGRhdGUgLS11cGRhdGUta2V5cyB0byBzZXQgdGhlbSB1cDwvZXJyb3I+JzsKfQoKcmV0dXJuICRlcnJvcnMgPzogdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1ZlcnNpb24oQ29uZmlnICRjb25maWcpCnsKJHJlc3VsdCA9ICR0aGlzLT5jaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokdmVyc2lvbnNVdGlsID0gbmV3IFZlcnNpb25zKCRjb25maWcsICR0aGlzLT5odHRwRG93bmxvYWRlcik7CnRyeSB7CiRsYXRlc3QgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGU7Cn0KCmlmIChDb21wb3Nlcjo6VkVSU0lPTiAhPT0gJGxhdGVzdFsndmVyc2lvbiddICYmIENvbXBvc2VyOjpWRVJTSU9OICE9PSAnQHBhY2thZ2VfdmVyc2lvbkAnKSB7CnJldHVybiAnPGNvbW1lbnQ+WW91IGFyZSBub3QgcnVubmluZyB0aGUgbGF0ZXN0ICcuJHZlcnNpb25zVXRpbC0+Z2V0Q2hhbm5lbCgpLicgdmVyc2lvbiwgcnVuIGBjb21wb3NlciBzZWxmLXVwZGF0ZWAgdG8gdXBkYXRlICgnLkNvbXBvc2VyOjpWRVJTSU9OLicgPT4gJy4kbGF0ZXN0Wyd2ZXJzaW9uJ10uJyk8L2NvbW1lbnQ+JzsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb21wb3NlckF1ZGl0KENvbmZpZyAkY29uZmlnKQp7CiRyZXN1bHQgPSAkdGhpcy0+Y2hlY2tDb25uZWN0aXZpdHlBbmRDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpOwppZiAoJHJlc3VsdCAhPT0gdHJ1ZSkgewpyZXR1cm4gJHJlc3VsdDsKfQoKJGF1ZGl0b3IgPSBuZXcgQXVkaXRvcigpOwokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CiRpbnN0YWxsZWRKc29uID0gbmV3IEpzb25GaWxlKF9fRElSX18gLiAnLy4uLy4uLy4uL3ZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQuanNvbicpOwppZiAoISRpbnN0YWxsZWRKc29uLT5leGlzdHMoKSkgewpyZXR1cm4gJzx3YXJuaW5nPkNvdWxkIG5vdCBmaW5kIENvbXBvc2VyXCdzIGluc3RhbGxlZC5qc29uLCB0aGlzIG11c3QgYmUgYSBub24tc3RhbmRhcmQgQ29tcG9zZXIgaW5zdGFsbGF0aW9uLjwvPic7Cn0KCiRsb2NhbFJlcG8gPSBuZXcgRmlsZXN5c3RlbVJlcG9zaXRvcnkoJGluc3RhbGxlZEpzb24pOwokdmVyc2lvbiA9IENvbXBvc2VyOjpnZXRWZXJzaW9uKCk7CiRwYWNrYWdlcyA9ICRsb2NhbFJlcG8tPmdldENhbm9uaWNhbFBhY2thZ2VzKCk7CmlmICgkdmVyc2lvbiAhPT0gJ0BwYWNrYWdlX3ZlcnNpb25AJykgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRub3JtYWxpemVkVmVyc2lvbiA9ICR2ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb24pOwokcm9vdFBrZyA9IG5ldyBSb290UGFja2FnZSgnY29tcG9zZXIvY29tcG9zZXInLCAkbm9ybWFsaXplZFZlcnNpb24sICR2ZXJzaW9uKTsKJHBhY2thZ2VzW10gPSAkcm9vdFBrZzsKfQokcmVwb1NldC0+YWRkUmVwb3NpdG9yeShuZXcgQ29tcG9zZXJSZXBvc2l0b3J5KFsndHlwZScgPT4gJ2NvbXBvc2VyJywgJ3VybCcgPT4gJ2h0dHBzOi8vcGFja2FnaXN0Lm9yZyddLCBuZXcgTnVsbElPKCksICRjb25maWcsICR0aGlzLT5odHRwRG93bmxvYWRlcikpOwoKdHJ5IHsKJGlvID0gbmV3IEJ1ZmZlcklPKCk7CiRyZXN1bHQgPSAkYXVkaXRvci0+YXVkaXQoJGlvLCAkcmVwb1NldCwgJHBhY2thZ2VzLCBBdWRpdG9yOjpGT1JNQVRfVEFCTEUsIHRydWUsIFtdLCBBdWRpdG9yOjpBQkFORE9ORURfSUdOT1JFKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewpyZXR1cm4gJzxoaWdobGlnaHQ+RmFpbGVkIHBlcmZvcm1pbmcgYXVkaXQ6ICcuJGUtPmdldE1lc3NhZ2UoKS4nPC8+JzsKfQoKaWYgKCRyZXN1bHQgPiAwKSB7CnJldHVybiAnPGhpZ2hsaWdodD5BdWRpdCBmb3VuZCBzb21lIGlzc3Vlczo8Lz4nIC4gUEhQX0VPTCAuICRpby0+Z2V0T3V0cHV0KCk7Cn0KCnJldHVybiB0cnVlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldEN1cmxWZXJzaW9uKCk6IHN0cmluZwp7CmlmIChleHRlbnNpb25fbG9hZGVkKCdjdXJsJykpIHsKaWYgKCFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CnJldHVybiAnPGVycm9yPmRpc2FibGVkIHZpYSBkaXNhYmxlX2Z1bmN0aW9ucywgdXNpbmcgcGhwIHN0cmVhbXMgZmFsbGJhY2ssIHdoaWNoIHJlZHVjZXMgcGVyZm9ybWFuY2U8L2Vycm9yPic7Cn0KCiR2ZXJzaW9uID0gY3VybF92ZXJzaW9uKCk7CiRsaWJ6VmVyc2lvbiA9IGlzc2V0KCR2ZXJzaW9uWydsaWJ6X3ZlcnNpb24nXSkgJiYgJHZlcnNpb25bJ2xpYnpfdmVyc2lvbiddICE9PSAnJyA/ICR2ZXJzaW9uWydsaWJ6X3ZlcnNpb24nXSA6ICdtaXNzaW5nJzsKJGJyb3RsaVZlcnNpb24gPSBpc3NldCgkdmVyc2lvblsnYnJvdGxpX3ZlcnNpb24nXSkgJiYgJHZlcnNpb25bJ2Jyb3RsaV92ZXJzaW9uJ10gIT09ICcnID8gJHZlcnNpb25bJ2Jyb3RsaV92ZXJzaW9uJ10gOiAnbWlzc2luZyc7CiRzc2xWZXJzaW9uID0gaXNzZXQoJHZlcnNpb25bJ3NzbF92ZXJzaW9uJ10pICYmICR2ZXJzaW9uWydzc2xfdmVyc2lvbiddICE9PSAnJyA/ICR2ZXJzaW9uWydzc2xfdmVyc2lvbiddIDogJ21pc3NpbmcnOwokaGFzWnN0ZCA9IGlzc2V0KCR2ZXJzaW9uWydmZWF0dXJlcyddKSAmJiBkZWZpbmVkKCdDVVJMX1ZFUlNJT05fWlNURCcpICYmIDAgIT09ICgkdmVyc2lvblsnZmVhdHVyZXMnXSAmIENVUkxfVkVSU0lPTl9aU1REKTsKJGh0dHBWZXJzaW9ucyA9ICcxLjAsIDEuMSc7CmlmIChpc3NldCgkdmVyc2lvblsnZmVhdHVyZXMnXSkgJiYgXGRlZmluZWQoJ0NVUkxfVkVSU0lPTl9IVFRQMicpICYmIFxkZWZpbmVkKCdDVVJMX0hUVFBfVkVSU0lPTl8yXzAnKSAmJiAoQ1VSTF9WRVJTSU9OX0hUVFAyICYgJHZlcnNpb25bJ2ZlYXR1cmVzJ10pICE9PSAwKSB7CiRodHRwVmVyc2lvbnMgLj0gJywgMic7Cn0KaWYgKGlzc2V0KCR2ZXJzaW9uWydmZWF0dXJlcyddKSAmJiBcZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX0hUVFAzJykgJiYgKCR2ZXJzaW9uWydmZWF0dXJlcyddICYgQ1VSTF9WRVJTSU9OX0hUVFAzKSAhPT0gMCkgewokaHR0cFZlcnNpb25zIC49ICcsIDMnOwp9CgpyZXR1cm4gJzxjb21tZW50PicuJHZlcnNpb25bJ3ZlcnNpb24nXS4nPC9jb21tZW50PiAnLgonbGlieiA8Y29tbWVudD4nLiRsaWJ6VmVyc2lvbi4nPC9jb21tZW50PiAnLgonYnJvdGxpIDxjb21tZW50PicuJGJyb3RsaVZlcnNpb24uJzwvY29tbWVudD4gJy4KJ3pzdGQgPGNvbW1lbnQ+Jy4oJGhhc1pzdGQgPyAnc3VwcG9ydGVkJyA6ICdtaXNzaW5nJykuJzwvY29tbWVudD4gJy4KJ3NzbCA8Y29tbWVudD4nLiRzc2xWZXJzaW9uLic8L2NvbW1lbnQ+ICcuCidIVFRQIDxjb21tZW50PicuJGh0dHBWZXJzaW9ucy4nPC9jb21tZW50Pic7Cn0KCnJldHVybiAnPGVycm9yPm1pc3NpbmcsIHVzaW5nIHBocCBzdHJlYW1zIGZhbGxiYWNrLCB3aGljaCByZWR1Y2VzIHBlcmZvcm1hbmNlPC9lcnJvcj4nOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dFJlc3VsdCgkcmVzdWx0KTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwppZiAodHJ1ZSA9PT0gJHJlc3VsdCkgewokaW8tPndyaXRlKCc8aW5mbz5PSzwvaW5mbz4nKTsKCnJldHVybjsKfQoKJGhhZEVycm9yID0gZmFsc2U7CiRoYWRXYXJuaW5nID0gZmFsc2U7CmlmICgkcmVzdWx0IGluc3RhbmNlb2YgXEV4Y2VwdGlvbikgewokcmVzdWx0ID0gJzxlcnJvcj5bJy5nZXRfY2xhc3MoJHJlc3VsdCkuJ10gJy4kcmVzdWx0LT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+JzsKfQoKaWYgKCEkcmVzdWx0KSB7CgokaGFkRXJyb3IgPSB0cnVlOwp9IGVsc2UgewppZiAoIWlzX2FycmF5KCRyZXN1bHQpKSB7CiRyZXN1bHQgPSBbJHJlc3VsdF07Cn0KZm9yZWFjaCAoJHJlc3VsdCBhcyAkbWVzc2FnZSkgewppZiAoZmFsc2UgIT09IHN0cnBvcygkbWVzc2FnZSwgJzxlcnJvcj4nKSkgewokaGFkRXJyb3IgPSB0cnVlOwp9IGVsc2VpZiAoZmFsc2UgIT09IHN0cnBvcygkbWVzc2FnZSwgJzx3YXJuaW5nPicpKSB7CiRoYWRXYXJuaW5nID0gdHJ1ZTsKfQp9Cn0KCmlmICgkaGFkRXJyb3IpIHsKJGlvLT53cml0ZSgnPGVycm9yPkZBSUw8L2Vycm9yPicpOwokdGhpcy0+ZXhpdENvZGUgPSBtYXgoJHRoaXMtPmV4aXRDb2RlLCAyKTsKfSBlbHNlaWYgKCRoYWRXYXJuaW5nKSB7CiRpby0+d3JpdGUoJzx3YXJuaW5nPldBUk5JTkc8L3dhcm5pbmc+Jyk7CiR0aGlzLT5leGl0Q29kZSA9IG1heCgkdGhpcy0+ZXhpdENvZGUsIDEpOwp9CgppZiAoJHJlc3VsdCkgewpmb3JlYWNoICgkcmVzdWx0IGFzICRtZXNzYWdlKSB7CiRpby0+d3JpdGUodHJpbSgkbWVzc2FnZSkpOwp9Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja1BsYXRmb3JtKCkKewokb3V0cHV0ID0gJyc7CiRvdXQgPSBzdGF0aWMgZnVuY3Rpb24gKCRtc2csICRzdHlsZSkgdXNlICgmJG91dHB1dCk6IHZvaWQgewokb3V0cHV0IC49ICc8Jy4kc3R5bGUuJz4nLiRtc2cuJzwvJy4kc3R5bGUuJz4nLlBIUF9FT0w7Cn07CgoKJGVycm9ycyA9IFtdOwokd2FybmluZ3MgPSBbXTsKJGRpc3BsYXlJbmlNZXNzYWdlID0gZmFsc2U7CgokaW5pTWVzc2FnZSA9IFBIUF9FT0wuUEhQX0VPTC5JbmlIZWxwZXI6OmdldE1lc3NhZ2UoKTsKJGluaU1lc3NhZ2UgLj0gUEhQX0VPTC4nSWYgeW91IGNhbiBub3QgbW9kaWZ5IHRoZSBpbmkgZmlsZSwgeW91IGNhbiBhbHNvIHJ1biBgcGhwIC1kIG9wdGlvbj12YWx1ZWAgdG8gbW9kaWZ5IGluaSB2YWx1ZXMgb24gdGhlIGZseS4gWW91IGNhbiB1c2UgLWQgbXVsdGlwbGUgdGltZXMuJzsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdqc29uX2RlY29kZScpKSB7CiRlcnJvcnNbJ2pzb24nXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnUGhhcicpKSB7CiRlcnJvcnNbJ3BoYXInXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnZmlsdGVyJykpIHsKJGVycm9yc1snZmlsdGVyJ10gPSB0cnVlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ2hhc2gnKSkgewokZXJyb3JzWydoYXNoJ10gPSB0cnVlOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ2ljb252JykgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpIHsKJGVycm9yc1snaWNvbnZfbWJzdHJpbmcnXSA9IHRydWU7Cn0KCmlmICghZmlsdGVyX3ZhcihpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pKSB7CiRlcnJvcnNbJ2FsbG93X3VybF9mb3BlbiddID0gdHJ1ZTsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2lvbkN1YmUgTG9hZGVyJykgJiYgaW9uY3ViZV9sb2FkZXJfaXZlcnNpb24oKSA8IDQwMDA5KSB7CiRlcnJvcnNbJ2lvbmN1YmUnXSA9IGlvbmN1YmVfbG9hZGVyX3ZlcnNpb24oKTsKfQoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMjA1KSB7CiRlcnJvcnNbJ3BocCddID0gUEhQX1ZFUlNJT047Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CiRlcnJvcnNbJ29wZW5zc2wnXSA9IHRydWU7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykgJiYgT1BFTlNTTF9WRVJTSU9OX05VTUJFUiA8IDB4MTAwMDEwMGYpIHsKJHdhcm5pbmdzWydvcGVuc3NsX3ZlcnNpb24nXSA9IHRydWU7Cn0KCmlmICghZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ2FwY3UnKSAmJiBmaWx0ZXJfdmFyKGluaV9nZXQoJ2FwYy5lbmFibGVfY2xpJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKSkgewokd2FybmluZ3NbJ2FwY19jbGknXSA9IHRydWU7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKSB7CiR3YXJuaW5nc1snemxpYiddID0gdHJ1ZTsKfQoKb2Jfc3RhcnQoKTsKcGhwaW5mbyhJTkZPX0dFTkVSQUwpOwokcGhwaW5mbyA9IG9iX2dldF9jbGVhbigpOwppZiAoaXNfc3RyaW5nKCRwaHBpbmZvKSAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Q29uZmlndXJlIENvbW1hbmQoPzogKjwvdGQ+PHRkIGNsYXNzPSJ2Ij58ICo9PiAqKSguKj8pKD86PC90ZD58JCl9bScsICRwaHBpbmZvLCAkbWF0Y2gpKSB7CiRjb25maWd1cmUgPSAkbWF0Y2hbMV07CgppZiAoc3RyX2NvbnRhaW5zKCRjb25maWd1cmUsICctLWVuYWJsZS1zaWdjaGlsZCcpKSB7CiR3YXJuaW5nc1snc2lnY2hpbGQnXSA9IHRydWU7Cn0KCmlmIChzdHJfY29udGFpbnMoJGNvbmZpZ3VyZSwgJy0td2l0aC1jdXJsd3JhcHBlcnMnKSkgewokd2FybmluZ3NbJ2N1cmx3cmFwcGVycyddID0gdHJ1ZTsKfQp9CgppZiAoZmlsdGVyX3ZhcihpbmlfZ2V0KCd4ZGVidWcucHJvZmlsZXJfZW5hYmxlZCcpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJHdhcm5pbmdzWyd4ZGVidWdfcHJvZmlsZSddID0gdHJ1ZTsKfSBlbHNlaWYgKFhkZWJ1Z0hhbmRsZXI6OmlzWGRlYnVnQWN0aXZlKCkpIHsKJHdhcm5pbmdzWyd4ZGVidWdfbG9hZGVkJ10gPSB0cnVlOwp9CgppZiAoZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpCiYmICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjIuMjMnLCAnPCcpCnx8ICh2ZXJzaW9uX2NvbXBhcmUoUEhQX1ZFUlNJT04sICc3LjMuMCcsICc+PScpCiYmIHZlcnNpb25fY29tcGFyZShQSFBfVkVSU0lPTiwgJzcuMy4xMCcsICc8JykpKSkgewokd2FybmluZ3NbJ29uZWRyaXZlJ10gPSBQSFBfVkVSU0lPTjsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ3VvcHonKQomJiAhKGZpbHRlcl92YXIoaW5pX2dldCgndW9wei5kaXNhYmxlJyksIEZJTFRFUl9WQUxJREFURV9CT09MRUFOKQp8fCBmaWx0ZXJfdmFyKGluaV9nZXQoJ3VvcHouZXhpdCcpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpKSB7CiR3YXJuaW5nc1sndW9weiddID0gdHJ1ZTsKfQoKaWYgKCFlbXB0eSgkZXJyb3JzKSkgewpmb3JlYWNoICgkZXJyb3JzIGFzICRlcnJvciA9PiAkY3VycmVudCkgewpzd2l0Y2ggKCRlcnJvcikgewpjYXNlICdqc29uJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUganNvbiBleHRlbnNpb24gaXMgbWlzc2luZy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJbnN0YWxsIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aG91dCAtLWRpc2FibGUtanNvbiI7CmJyZWFrOwoKY2FzZSAncGhhcic6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIHBoYXIgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBpdCBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLXBoYXIiOwpicmVhazsKCmNhc2UgJ2ZpbHRlcic6CiR0ZXh0ID0gUEhQX0VPTC4iVGhlIGZpbHRlciBleHRlbnNpb24gaXMgbWlzc2luZy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJbnN0YWxsIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aG91dCAtLWRpc2FibGUtZmlsdGVyIjsKYnJlYWs7CgpjYXNlICdoYXNoJzoKJHRleHQgPSBQSFBfRU9MLiJUaGUgaGFzaCBleHRlbnNpb24gaXMgbWlzc2luZy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJJbnN0YWxsIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aG91dCAtLWRpc2FibGUtaGFzaCI7CmJyZWFrOwoKY2FzZSAnaWNvbnZfbWJzdHJpbmcnOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBpY29udiBPUiBtYnN0cmluZyBleHRlbnNpb24gaXMgcmVxdWlyZWQgYW5kIGJvdGggYXJlIG1pc3NpbmcuIi5QSFBfRU9MOwokdGV4dCAuPSAiSW5zdGFsbCBlaXRoZXIgb2YgdGhlbSBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWljb252IjsKYnJlYWs7CgpjYXNlICdwaHAnOgokdGV4dCA9IFBIUF9FT0wuIllvdXIgUEhQICh7JGN1cnJlbnR9KSBpcyB0b28gb2xkLCB5b3UgbXVzdCB1cGdyYWRlIHRvIFBIUCA3LjIuNSBvciBoaWdoZXIuIjsKYnJlYWs7CgpjYXNlICdhbGxvd191cmxfZm9wZW4nOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBhbGxvd191cmxfZm9wZW4gc2V0dGluZyBpcyBpbmNvcnJlY3QuIi5QSFBfRU9MOwokdGV4dCAuPSAiQWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGVuZCBvZiB5b3VyIGBwaHAuaW5pYDoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgICAgYWxsb3dfdXJsX2ZvcGVuID0gT24iOwokZGlzcGxheUluaU1lc3NhZ2UgPSB0cnVlOwpicmVhazsKCmNhc2UgJ2lvbmN1YmUnOgokdGV4dCA9IFBIUF9FT0wuIllvdXIgaW9uQ3ViZSBMb2FkZXIgZXh0ZW5zaW9uICgkY3VycmVudCkgaXMgaW5jb21wYXRpYmxlIHdpdGggUGhhciBmaWxlcy4iLlBIUF9FT0w7CiR0ZXh0IC49ICJVcGdyYWRlIHRvIGlvbkN1YmUgNC4wLjkgb3IgaGlnaGVyIG9yIHJlbW92ZSB0aGlzIGxpbmUgKHBhdGggbWF5IGJlIGRpZmZlcmVudCkgZnJvbSB5b3VyIGBwaHAuaW5pYCB0byBkaXNhYmxlIGl0OiIuUEhQX0VPTDsKJHRleHQgLj0gIiAgICB6ZW5kX2V4dGVuc2lvbiA9IC91c3IvbGliL3BocDUvMjAwOTA2MjYrbGZzL2lvbmN1YmVfbG9hZGVyX2xpbl81LjMuc28iOwokZGlzcGxheUluaU1lc3NhZ2UgPSB0cnVlOwpicmVhazsKCmNhc2UgJ29wZW5zc2wnOgokdGV4dCA9IFBIUF9FT0wuIlRoZSBvcGVuc3NsIGV4dGVuc2lvbiBpcyBtaXNzaW5nLCB3aGljaCBtZWFucyB0aGF0IHNlY3VyZSBIVFRQUyB0cmFuc2ZlcnMgYXJlIGltcG9zc2libGUuIi5QSFBfRU9MOwokdGV4dCAuPSAiSWYgcG9zc2libGUgeW91IHNob3VsZCBlbmFibGUgaXQgb3IgcmVjb21waWxlIHBocCB3aXRoIC0td2l0aC1vcGVuc3NsIjsKYnJlYWs7CgpkZWZhdWx0Ogp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCJEaWFnbm9zZUNvbW1hbmQ6IFVua25vd24gZXJyb3IgdHlwZSBcIiVzXCIuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIiwgJGVycm9yKSk7Cn0KJG91dCgkdGV4dCwgJ2Vycm9yJyk7Cn0KCiRvdXRwdXQgLj0gUEhQX0VPTDsKfQoKaWYgKCFlbXB0eSgkd2FybmluZ3MpKSB7CmZvcmVhY2ggKCR3YXJuaW5ncyBhcyAkd2FybmluZyA9PiAkY3VycmVudCkgewpzd2l0Y2ggKCR3YXJuaW5nKSB7CmNhc2UgJ2FwY19jbGknOgokdGV4dCA9ICJUaGUgYXBjLmVuYWJsZV9jbGkgc2V0dGluZyBpcyBpbmNvcnJlY3QuIi5QSFBfRU9MOwokdGV4dCAuPSAiQWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGVuZCBvZiB5b3VyIGBwaHAuaW5pYDoiLlBIUF9FT0w7CiR0ZXh0IC49ICIgIGFwYy5lbmFibGVfY2xpID0gT2ZmIjsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICd6bGliJzoKJHRleHQgPSAnVGhlIHpsaWIgZXh0ZW5zaW9uIGlzIG5vdCBsb2FkZWQsIHRoaXMgY2FuIHNsb3cgZG93biBDb21wb3NlciBhIGxvdC4nLlBIUF9FT0w7CiR0ZXh0IC49ICdJZiBwb3NzaWJsZSwgZW5hYmxlIGl0IG9yIHJlY29tcGlsZSBwaHAgd2l0aCAtLXdpdGgtemxpYicuUEhQX0VPTDsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICdzaWdjaGlsZCc6CiR0ZXh0ID0gIlBIUCB3YXMgY29tcGlsZWQgd2l0aCAtLWVuYWJsZS1zaWdjaGlsZCB3aGljaCBjYW4gY2F1c2UgaXNzdWVzIG9uIHNvbWUgcGxhdGZvcm1zLiIuUEhQX0VPTDsKJHRleHQgLj0gIlJlY29tcGlsZSBpdCB3aXRob3V0IHRoaXMgZmxhZyBpZiBwb3NzaWJsZSwgc2VlIGFsc286Ii5QSFBfRU9MOwokdGV4dCAuPSAiICBodHRwczovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTIyOTk5IjsKYnJlYWs7CgpjYXNlICdjdXJsd3JhcHBlcnMnOgokdGV4dCA9ICJQSFAgd2FzIGNvbXBpbGVkIHdpdGggLS13aXRoLWN1cmx3cmFwcGVycyB3aGljaCB3aWxsIGNhdXNlIGlzc3VlcyB3aXRoIEhUVFAgYXV0aGVudGljYXRpb24gYW5kIEdpdEh1Yi4iLlBIUF9FT0w7CiR0ZXh0IC49ICIgUmVjb21waWxlIGl0IHdpdGhvdXQgdGhpcyBmbGFnIGlmIHBvc3NpYmxlIjsKYnJlYWs7CgpjYXNlICdvcGVuc3NsX3ZlcnNpb24nOgoKJG9wZW5zc2xWZXJzaW9uID0gc3Ryc3RyKHRyaW0oc3Ryc3RyKE9QRU5TU0xfVkVSU0lPTl9URVhULCAnICcpKSwgJyAnLCB0cnVlKTsKJG9wZW5zc2xWZXJzaW9uID0gJG9wZW5zc2xWZXJzaW9uID86IE9QRU5TU0xfVkVSU0lPTl9URVhUOwoKJHRleHQgPSAiVGhlIE9wZW5TU0wgbGlicmFyeSAoeyRvcGVuc3NsVmVyc2lvbn0pIHVzZWQgYnkgUEhQIGRvZXMgbm90IHN1cHBvcnQgVExTdjEuMiBvciBUTFN2MS4xLiIuUEhQX0VPTDsKJHRleHQgLj0gIklmIHBvc3NpYmxlIHlvdSBzaG91bGQgdXBncmFkZSBPcGVuU1NMIHRvIHZlcnNpb24gMS4wLjEgb3IgYWJvdmUuIjsKYnJlYWs7CgpjYXNlICd4ZGVidWdfbG9hZGVkJzoKJHRleHQgPSAiVGhlIHhkZWJ1ZyBleHRlbnNpb24gaXMgbG9hZGVkLCB0aGlzIGNhbiBzbG93IGRvd24gQ29tcG9zZXIgYSBsaXR0bGUuIi5QSFBfRU9MOwokdGV4dCAuPSAiIERpc2FibGluZyBpdCB3aGVuIHVzaW5nIENvbXBvc2VyIGlzIHJlY29tbWVuZGVkLiI7CmJyZWFrOwoKY2FzZSAneGRlYnVnX3Byb2ZpbGUnOgokdGV4dCA9ICJUaGUgeGRlYnVnLnByb2ZpbGVyX2VuYWJsZWQgc2V0dGluZyBpcyBlbmFibGVkLCB0aGlzIGNhbiBzbG93IGRvd24gQ29tcG9zZXIgYSBsb3QuIi5QSFBfRU9MOwokdGV4dCAuPSAiQWRkIHRoZSBmb2xsb3dpbmcgdG8gdGhlIGVuZCBvZiB5b3VyIGBwaHAuaW5pYCB0byBkaXNhYmxlIGl0OiIuUEhQX0VPTDsKJHRleHQgLj0gIiAgeGRlYnVnLnByb2ZpbGVyX2VuYWJsZWQgPSAwIjsKJGRpc3BsYXlJbmlNZXNzYWdlID0gdHJ1ZTsKYnJlYWs7CgpjYXNlICdvbmVkcml2ZSc6CiR0ZXh0ID0gIlRoZSBXaW5kb3dzIE9uZURyaXZlIGZvbGRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBIUCB2ZXJzaW9ucyBiZWxvdyA3LjIuMjMgYW5kIDcuMy4xMC4iLlBIUF9FT0w7CiR0ZXh0IC49ICJVcGdyYWRlIHlvdXIgUEhQICh7JGN1cnJlbnR9KSB0byB1c2UgdGhpcyBsb2NhdGlvbiB3aXRoIENvbXBvc2VyLiIuUEhQX0VPTDsKYnJlYWs7CgpjYXNlICd1b3B6JzoKJHRleHQgPSAiVGhlIHVvcHogZXh0ZW5zaW9uIGlnbm9yZXMgZXhpdCBjYWxscyBhbmQgbWF5IG5vdCB3b3JrIHdpdGggYWxsIENvbXBvc2VyIGNvbW1hbmRzLiIuUEhQX0VPTDsKJHRleHQgLj0gIkRpc2FibGluZyBpdCB3aGVuIHVzaW5nIENvbXBvc2VyIGlzIHJlY29tbWVuZGVkLiI7CmJyZWFrOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigiRGlhZ25vc2VDb21tYW5kOiBVbmtub3duIHdhcm5pbmcgdHlwZSBcIiVzXCIuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIiwgJHdhcm5pbmcpKTsKfQokb3V0KCR0ZXh0LCAnY29tbWVudCcpOwp9Cn0KCmlmICgkZGlzcGxheUluaU1lc3NhZ2UpIHsKJG91dCgkaW5pTWVzc2FnZSwgJ2NvbW1lbnQnKTsKfQoKaWYgKGluX2FycmF5KFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0lQUkVTT0xWRScpLCBbJzQnLCAnNiddLCB0cnVlKSkgewokd2FybmluZ3NbJ2lwcmVzb2x2ZSddID0gdHJ1ZTsKJG91dCgnVGhlIENPTVBPU0VSX0lQUkVTT0xWRSBlbnYgdmFyIGlzIHNldCB0byAnIC4gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSVBSRVNPTFZFJykgLicgd2hpY2ggbWF5IHJlc3VsdCBpbiBuZXR3b3JrIGZhaWx1cmVzIGJlbG93LicsICdjb21tZW50Jyk7Cn0KCnJldHVybiBjb3VudCgkd2FybmluZ3MpID09PSAwICYmIGNvdW50KCRlcnJvcnMpID09PSAwID8gdHJ1ZSA6ICRvdXRwdXQ7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0Nvbm5lY3Rpdml0eSgpCnsKaWYgKCFpbmlfZ2V0KCdhbGxvd191cmxfZm9wZW4nKSkgewpyZXR1cm4gJzxpbmZvPlNLSVA8Lz4gPGNvbW1lbnQ+QmVjYXVzZSBhbGxvd191cmxfZm9wZW4gaXMgbWlzc2luZy48Lz4nOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0Nvbm5lY3Rpdml0eUFuZENvbXBvc2VyTmV0d29ya0h0dHBFbmFibGVtZW50KCkKewokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29ubmVjdGl2aXR5KCk7CmlmICgkcmVzdWx0ICE9PSB0cnVlKSB7CnJldHVybiAkcmVzdWx0Owp9CgokcmVzdWx0ID0gJHRoaXMtPmNoZWNrQ29tcG9zZXJOZXR3b3JrSHR0cEVuYWJsZW1lbnQoKTsKaWYgKCRyZXN1bHQgIT09IHRydWUpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY2hlY2tDb21wb3Nlck5ldHdvcmtIdHRwRW5hYmxlbWVudCgpCnsKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewpyZXR1cm4gJzxpbmZvPlNLSVA8Lz4gPGNvbW1lbnQ+TmV0d29yayBpcyBkaXNhYmxlZCBieSBDT01QT1NFUl9ESVNBQkxFX05FVFdPUksuPC8+JzsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgRHVtcEF1dG9sb2FkQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdkdW1wLWF1dG9sb2FkJykKLT5zZXRBbGlhc2VzKFsnZHVtcGF1dG9sb2FkJ10pCi0+c2V0RGVzY3JpcHRpb24oJ0R1bXBzIHRoZSBhdXRvbG9hZGVyJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZScsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZXMgUFNSMCBhbmQgUFNSNCBwYWNrYWdlcyB0byBiZSBsb2FkZWQgd2l0aCBjbGFzc21hcHMgdG9vLCBnb29kIGZvciBwcm9kdWN0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemVgLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdScpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcuJyksCm5ldyBJbnB1dE9wdGlvbignZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdFbmFibGVzIGF1dG9sb2FkLWRldiBydWxlcy4gQ29tcG9zZXIgd2lsbCBieSBkZWZhdWx0IGluZmVyIHRoaXMgYXV0b21hdGljYWxseSBhY2NvcmRpbmcgdG8gdGhlIGxhc3QgaW5zdGFsbCBvciB1cGRhdGUgLS1uby1kZXYgc3RhdGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBhdXRvbG9hZC1kZXYgcnVsZXMuIENvbXBvc2VyIHdpbGwgYnkgZGVmYXVsdCBpbmZlciB0aGlzIGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBsYXN0IGluc3RhbGwgb3IgdXBkYXRlIC0tbm8tZGV2IHN0YXRlLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdzdHJpY3QtcHNyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBmYWlsZWQgc3RhdHVzIGNvZGUgKDEpIGlmIFBTUi00IG9yIFBTUi0wIG1hcHBpbmcgZXJyb3JzIGFyZSBwcmVzZW50LiBSZXF1aXJlcyAtLW9wdGltaXplIHRvIHdvcmsuJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0LWFtYmlndW91cycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgZmFpbGVkIHN0YXR1cyBjb2RlICgyKSBpZiB0aGUgc2FtZSBjbGFzcyBpcyBmb3VuZCBpbiBtdWx0aXBsZSBmaWxlcy4gUmVxdWlyZXMgLS1vcHRpbWl6ZSB0byB3b3JrLicpLApdKQotPnNldEhlbHAoCjw8PEVPVAo8aW5mbz5waHAgY29tcG9zZXIucGhhciBkdW1wLWF1dG9sb2FkPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZHVtcC1hdXRvbG9hZC1kdW1wYXV0b2xvYWQKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAnZHVtcC1hdXRvbG9hZCcsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokaW5zdGFsbGF0aW9uTWFuYWdlciA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpOwokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7CgokbWlzc2luZ0RlcGVuZGVuY2llcyA9IGZhbHNlOwpmb3JlYWNoICgkbG9jYWxSZXBvLT5nZXRDYW5vbmljYWxQYWNrYWdlcygpIGFzICRsb2NhbFBrZykgewokaW5zdGFsbFBhdGggPSAkaW5zdGFsbGF0aW9uTWFuYWdlci0+Z2V0SW5zdGFsbFBhdGgoJGxvY2FsUGtnKTsKaWYgKCRpbnN0YWxsUGF0aCAhPT0gbnVsbCAmJiBmaWxlX2V4aXN0cygkaW5zdGFsbFBhdGgpID09PSBmYWxzZSkgewokbWlzc2luZ0RlcGVuZGVuY2llcyA9IHRydWU7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPHdhcm5pbmc+Tm90IGFsbCBkZXBlbmRlbmNpZXMgYXJlIGluc3RhbGxlZC4gTWFrZSBzdXJlIHRvIHJ1biBhICJjb21wb3NlciBpbnN0YWxsIiB0byBpbnN0YWxsIG1pc3NpbmcgZGVwZW5kZW5jaWVzPC93YXJuaW5nPicpOwoKYnJlYWs7Cn0KfQoKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplJykgfHwgJGNvbmZpZy0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJyk7CiRhdXRob3JpdGF0aXZlID0gJGlucHV0LT5nZXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSB8fCAkY29uZmlnLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKTsKJGFwY3VQcmVmaXggPSAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdScpIHx8ICRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdC1wc3InKSAmJiAhJG9wdGltaXplICYmICEkYXV0aG9yaXRhdGl2ZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignLS1zdHJpY3QtcHNyIG1vZGUgb25seSB3b3JrcyB3aXRoIG9wdGltaXplZCBhdXRvbG9hZGVyLCB1c2UgLS1vcHRpbWl6ZSBvciAtLWNsYXNzbWFwLWF1dGhvcml0YXRpdmUgaWYgeW91IHdhbnQgYSBzdHJpY3QgcmV0dXJuIHZhbHVlLicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0LWFtYmlndW91cycpICYmICEkb3B0aW1pemUgJiYgISRhdXRob3JpdGF0aXZlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLXN0cmljdC1hbWJpZ3VvdXMgbW9kZSBvbmx5IHdvcmtzIHdpdGggb3B0aW1pemVkIGF1dG9sb2FkZXIsIHVzZSAtLW9wdGltaXplIG9yIC0tY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZSBpZiB5b3Ugd2FudCBhIHN0cmljdCByZXR1cm4gdmFsdWUuJyk7Cn0KCmlmICgkYXV0aG9yaXRhdGl2ZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRpbmcgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzIChhdXRob3JpdGF0aXZlKTwvaW5mbz4nKTsKfSBlbHNlaWYgKCRvcHRpbWl6ZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRpbmcgb3B0aW1pemVkIGF1dG9sb2FkIGZpbGVzPC9pbmZvPicpOwp9IGVsc2UgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRpbmcgYXV0b2xvYWQgZmlsZXM8L2luZm8+Jyk7Cn0KCiRnZW5lcmF0b3IgPSAkY29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpKSB7CiRnZW5lcmF0b3ItPnNldERyeVJ1bih0cnVlKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRnZW5lcmF0b3ItPnNldERldk1vZGUoZmFsc2UpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignWW91IGNhbiBub3QgdXNlIGJvdGggLS1uby1kZXYgYW5kIC0tZGV2IGFzIHRoZXkgY29uZmxpY3Qgd2l0aCBlYWNoIG90aGVyLicpOwp9CiRnZW5lcmF0b3ItPnNldERldk1vZGUodHJ1ZSk7Cn0KJGdlbmVyYXRvci0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKTsKJGdlbmVyYXRvci0+c2V0UnVuU2NyaXB0cyh0cnVlKTsKJGdlbmVyYXRvci0+c2V0QXBjdSgkYXBjdSwgJGFwY3VQcmVmaXgpOwokZ2VuZXJhdG9yLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpOwokY2xhc3NNYXAgPSAkZ2VuZXJhdG9yLT5kdW1wKAokY29uZmlnLAokbG9jYWxSZXBvLAokcGFja2FnZSwKJGluc3RhbGxhdGlvbk1hbmFnZXIsCidjb21wb3NlcicsCiRvcHRpbWl6ZSwKbnVsbCwKJGNvbXBvc2VyLT5nZXRMb2NrZXIoKSwKJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdC1hbWJpZ3VvdXMnKQopOwokbnVtYmVyT2ZDbGFzc2VzID0gY291bnQoJGNsYXNzTWFwKTsKCmlmICgkYXV0aG9yaXRhdGl2ZSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPkdlbmVyYXRlZCBvcHRpbWl6ZWQgYXV0b2xvYWQgZmlsZXMgKGF1dGhvcml0YXRpdmUpIGNvbnRhaW5pbmcgJy4gJG51bWJlck9mQ2xhc3NlcyAuJyBjbGFzc2VzPC9pbmZvPicpOwp9IGVsc2VpZiAoJG9wdGltaXplKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZSgnPGluZm8+R2VuZXJhdGVkIG9wdGltaXplZCBhdXRvbG9hZCBmaWxlcyBjb250YWluaW5nICcuICRudW1iZXJPZkNsYXNzZXMgLicgY2xhc3NlczwvaW5mbz4nKTsKfSBlbHNlIHsKJHRoaXMtPmdldElPKCktPndyaXRlKCc8aW5mbz5HZW5lcmF0ZWQgYXV0b2xvYWQgZmlsZXM8L2luZm8+Jyk7Cn0KCmlmICgkbWlzc2luZ0RlcGVuZGVuY2llcyB8fCAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdC1wc3InKSAmJiBjb3VudCgkY2xhc3NNYXAtPmdldFBzclZpb2xhdGlvbnMoKSkgPiAwKSkgewpyZXR1cm4gMTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzdHJpY3QtYW1iaWd1b3VzJykgJiYgY291bnQoJGNsYXNzTWFwLT5nZXRBbWJpZ3VvdXNDbGFzc2VzKGZhbHNlKSkgPiAwKSB7CnJldHVybiAyOwp9CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50OwoKCgoKY2xhc3MgRXhlY0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnZXhlYycpCi0+c2V0RGVzY3JpcHRpb24oJ0V4ZWN1dGVzIGEgdmVuZG9yZWQgYmluYXJ5L3NjcmlwdCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignbGlzdCcsICdsJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUpLApuZXcgSW5wdXRBcmd1bWVudCgnYmluYXJ5JywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgYmluYXJ5IHRvIHJ1biwgZS5nLiBwaHB1bml0JywgbnVsbCwgZnVuY3Rpb24gKCkgewpyZXR1cm4gJHRoaXMtPmdldEJpbmFyaWVzKGZhbHNlKTsKfSksCm5ldyBJbnB1dEFyZ3VtZW50KAonYXJncycsCklucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsCidBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgYmluYXJ5LiBVc2UgPGluZm8+LS08L2luZm8+IHRvIHNlcGFyYXRlIGZyb20gY29tcG9zZXIgYXJndW1lbnRzJwopLApdKQotPnNldEhlbHAoCjw8PEVPVApFeGVjdXRlcyBhIHZlbmRvcmVkIGJpbmFyeS9zY3JpcHQuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNleGVjCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGludGVyYWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJGJpbmFyaWVzID0gJHRoaXMtPmdldEJpbmFyaWVzKGZhbHNlKTsKaWYgKGNvdW50KCRiaW5hcmllcykgPT09IDApIHsKcmV0dXJuOwp9CgppZiAoJGlucHV0LT5nZXRBcmd1bWVudCgnYmluYXJ5JykgIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewpyZXR1cm47Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGJpbmFyeSA9ICRpby0+c2VsZWN0KAonQmluYXJ5IHRvIHJ1bjogJywKJGJpbmFyaWVzLAonJywKMSwKJ0ludmFsaWQgYmluYXJ5IG5hbWUgIiVzIicKKTsKCiRpbnB1dC0+c2V0QXJndW1lbnQoJ2JpbmFyeScsICRiaW5hcmllc1skYmluYXJ5XSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpIHx8IG51bGwgPT09ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2JpbmFyeScpKSB7CiRiaW5zID0gJHRoaXMtPmdldEJpbmFyaWVzKHRydWUpOwppZiAoW10gPT09ICRiaW5zKSB7CiRiaW5EaXIgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1kaXInKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiTm8gYmluYXJpZXMgZm91bmQgaW4gY29tcG9zZXIuanNvbiBvciBpbiBiaW4tZGlyICgkYmluRGlyKSIpOwp9CgokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoCjw8PEVPVAo8Y29tbWVudD5BdmFpbGFibGUgYmluYXJpZXM6PC9jb21tZW50PgpFT1QKKTsKCmZvcmVhY2ggKCRiaW5zIGFzICRiaW4pIHsKJHRoaXMtPmdldElPKCktPndyaXRlKAo8PDxFT1QKPGluZm8+LSAkYmluPC9pbmZvPgpFT1QKKTsKfQoKcmV0dXJuIDA7Cn0KCiRiaW5hcnkgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdiaW5hcnknKTsKCiRkaXNwYXRjaGVyID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKTsKJGRpc3BhdGNoZXItPmFkZExpc3RlbmVyKCdfX2V4ZWNfY29tbWFuZCcsICRiaW5hcnkpOwoKCgoKaWYgKGdldGN3ZCgpICE9PSAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0SW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkoKSAmJiAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+Z2V0SW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkoKSAhPT0gZmFsc2UpIHsKdHJ5IHsKY2hkaXIoJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldEluaXRpYWxXb3JraW5nRGlyZWN0b3J5KCkpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHN3aXRjaCBiYWNrIHRvIHdvcmtpbmcgZGlyZWN0b3J5ICInLiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRJbml0aWFsV29ya2luZ0RpcmVjdG9yeSgpLiciJywgMCwgJGUpOwp9Cn0KCnJldHVybiAkZGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoJ19fZXhlY19jb21tYW5kJywgdHJ1ZSwgJGlucHV0LT5nZXRBcmd1bWVudCgnYXJncycpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRCaW5hcmllcyhib29sICRmb3JEaXNwbGF5KTogYXJyYXkKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRiaW5EaXIgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1kaXInKTsKJGJpbnMgPSBnbG9iKCRiaW5EaXIgLiAnLyonKTsKJGxvY2FsQmlucyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRCaW5hcmllcygpOwppZiAoJGZvckRpc3BsYXkpIHsKJGxvY2FsQmlucyA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRlKSB7CnJldHVybiAiJGUgKGxvY2FsKSI7Cn0sICRsb2NhbEJpbnMpOwp9CgokYmluYXJpZXMgPSBbXTsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGJpbnMsICRsb2NhbEJpbnMpIGFzICRiaW4pIHsKCmlmIChpc3NldCgkcHJldmlvdXNCaW4pICYmICRiaW4gPT09ICRwcmV2aW91c0Jpbi4nLmJhdCcpIHsKY29udGludWU7Cn0KCiRwcmV2aW91c0JpbiA9ICRiaW47CiRiaW5hcmllc1tdID0gYmFzZW5hbWUoJGJpbik7Cn0KCnJldHVybiAkYmluYXJpZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaEFsbENvbnN0cmFpbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgpjbGFzcyBGdW5kQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMtPnNldE5hbWUoJ2Z1bmQnKQotPnNldERlc2NyaXB0aW9uKCdEaXNjb3ZlciBob3cgdG8gaGVscCBmdW5kIHRoZSBtYWludGVuYW5jZSBvZiB5b3VyIGRlcGVuZGVuY2llcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignZm9ybWF0JywgJ2YnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JtYXQgb2YgdGhlIG91dHB1dDogdGV4dCBvciBqc29uJywgJ3RleHQnLCBbJ3RleHQnLCAnanNvbiddKSwKXSkKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJHJlcG8gPSAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpOwokcmVtb3RlUmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKTsKJGZ1bmRpbmdzID0gW107CgokcGFja2FnZXNUb0xvYWQgPSBbXTsKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CiRwYWNrYWdlc1RvTG9hZFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQoKCiRyZXN1bHQgPSAkcmVtb3RlUmVwb3MtPmxvYWRQYWNrYWdlcygkcGFja2FnZXNUb0xvYWQsIFsnZGV2JyA9PiBCYXNlUGFja2FnZTo6U1RBQklMSVRZX0RFVl0sIFtdKTsKCgpmb3JlYWNoICgkcmVzdWx0WydwYWNrYWdlcyddIGFzICRwYWNrYWdlKSB7CmlmICgKISRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlCiYmICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlCiYmICRwYWNrYWdlLT5pc0RlZmF1bHRCcmFuY2goKQomJiAkcGFja2FnZS0+Z2V0RnVuZGluZygpCiYmIGlzc2V0KCRwYWNrYWdlc1RvTG9hZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkKKSB7CiRmdW5kaW5ncyA9ICR0aGlzLT5pbnNlcnRGdW5kaW5nRGF0YSgkZnVuZGluZ3MsICRwYWNrYWdlKTsKdW5zZXQoJHBhY2thZ2VzVG9Mb2FkWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQp9CgoKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlIHx8ICFpc3NldCgkcGFja2FnZXNUb0xvYWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHBhY2thZ2UtPmdldEZ1bmRpbmcoKSkgewokZnVuZGluZ3MgPSAkdGhpcy0+aW5zZXJ0RnVuZGluZ0RhdGEoJGZ1bmRpbmdzLCAkcGFja2FnZSk7Cn0KfQoKa3NvcnQoJGZ1bmRpbmdzKTsKCiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGZvcm1hdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKTsKaWYgKCFpbl9hcnJheSgkZm9ybWF0LCBbJ3RleHQnLCAnanNvbiddKSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgZm9ybWF0ICIlcyIuIFNlZSBoZWxwIGZvciBzdXBwb3J0ZWQgZm9ybWF0cy4nLCAkZm9ybWF0KSk7CgpyZXR1cm4gMTsKfQoKaWYgKCRmdW5kaW5ncyAmJiAkZm9ybWF0ID09PSAndGV4dCcpIHsKJHByZXYgPSBudWxsOwoKJGlvLT53cml0ZSgnVGhlIGZvbGxvd2luZyBwYWNrYWdlcyB3ZXJlIGZvdW5kIGluIHlvdXIgZGVwZW5kZW5jaWVzIHdoaWNoIHB1Ymxpc2ggZnVuZGluZyBpbmZvcm1hdGlvbjonKTsKCmZvcmVhY2ggKCRmdW5kaW5ncyBhcyAkdmVuZG9yID0+ICRsaW5rcykgewokaW8tPndyaXRlKCcnKTsKJGlvLT53cml0ZShzcHJpbnRmKCI8Y29tbWVudD4lczwvY29tbWVudD4iLCAkdmVuZG9yKSk7CmZvcmVhY2ggKCRsaW5rcyBhcyAkdXJsID0+ICRwYWNrYWdlcykgewokbGluZSA9IHNwcmludGYoJyAgPGluZm8+JXM8L2luZm8+JywgaW1wbG9kZSgnLCAnLCAkcGFja2FnZXMpKTsKCmlmICgkcHJldiAhPT0gJGxpbmUpIHsKJGlvLT53cml0ZSgkbGluZSk7CiRwcmV2ID0gJGxpbmU7Cn0KCiRpby0+d3JpdGUoc3ByaW50ZignICAgIDxocmVmPSVzPiVzPC8+JywgT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJHVybCksICR1cmwpKTsKfQp9CgokaW8tPndyaXRlKCIiKTsKJGlvLT53cml0ZSgiUGxlYXNlIGNvbnNpZGVyIGZvbGxvd2luZyB0aGVzZSBsaW5rcyBhbmQgc3BvbnNvcmluZyB0aGUgd29yayBvZiBwYWNrYWdlIGF1dGhvcnMhIik7CiRpby0+d3JpdGUoIlRoYW5rIHlvdSEiKTsKfSBlbHNlaWYgKCRmb3JtYXQgPT09ICdqc29uJykgewokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJGZ1bmRpbmdzKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoIk5vIGZ1bmRpbmcgbGlua3Mgd2VyZSBmb3VuZCBpbiB5b3VyIHBhY2thZ2UgZGVwZW5kZW5jaWVzLiBUaGlzIGRvZXNuJ3QgbWVhbiB0aGV5IGRvbid0IG5lZWQgeW91ciBzdXBwb3J0ISIpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5zZXJ0RnVuZGluZ0RhdGEoYXJyYXkgJGZ1bmRpbmdzLCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRGdW5kaW5nKCkgYXMgJGZ1bmRpbmdPcHRpb24pIHsKWyR2ZW5kb3IsICRwYWNrYWdlTmFtZV0gPSBleHBsb2RlKCcvJywgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSk7CgppZiAoZW1wdHkoJGZ1bmRpbmdPcHRpb25bJ3VybCddKSkgewpjb250aW51ZTsKfQokdXJsID0gJGZ1bmRpbmdPcHRpb25bJ3VybCddOwppZiAoIWVtcHR5KCRmdW5kaW5nT3B0aW9uWyd0eXBlJ10pICYmICRmdW5kaW5nT3B0aW9uWyd0eXBlJ10gPT09ICdnaXRodWInICYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM6Ly9naXRodWIuY29tLyhbXi9dKykkfScsICR1cmwsICRtYXRjaCkpIHsKJHVybCA9ICdodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvJy4kbWF0Y2hbMV07Cn0KJGZ1bmRpbmdzWyR2ZW5kb3JdWyR1cmxdW10gPSAkcGFja2FnZU5hbWU7Cn0KCnJldHVybiAkZnVuZGluZ3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxTdHJpbmdJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIEdsb2JhbENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CiRhcHBsaWNhdGlvbiA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpOwppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCdjb21tYW5kLW5hbWUnKSkgewokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigKYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoQ29tbWFuZCAkY29tbWFuZCkgewpyZXR1cm4gJGNvbW1hbmQtPmlzSGlkZGVuKCkgPyBudWxsIDogJGNvbW1hbmQtPmdldE5hbWUoKTsKfSwgJGFwcGxpY2F0aW9uLT5hbGwoKSksCnN0YXRpYyBmdW5jdGlvbiAoP3N0cmluZyAkY21kKSB7CnJldHVybiAkY21kICE9PSBudWxsOwp9CikpKTsKCnJldHVybjsKfQoKaWYgKCRhcHBsaWNhdGlvbi0+aGFzKCRjb21tYW5kTmFtZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2NvbW1hbmQtbmFtZScpKSkgewokaW5wdXQgPSAkdGhpcy0+cHJlcGFyZVN1YmNvbW1hbmRJbnB1dCgkaW5wdXQsIHRydWUpOwokaW5wdXQgPSBDb21wbGV0aW9uSW5wdXQ6OmZyb21TdHJpbmcoJGlucHV0LT5fX3RvU3RyaW5nKCksIDIpOwokY29tbWFuZCA9ICRhcHBsaWNhdGlvbi0+ZmluZCgkY29tbWFuZE5hbWUpOwokY29tbWFuZC0+bWVyZ2VBcHBsaWNhdGlvbkRlZmluaXRpb24oKTsKCiRpbnB1dC0+YmluZCgkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKTsKJGNvbW1hbmQtPmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2dsb2JhbCcpCi0+c2V0RGVzY3JpcHRpb24oJ0FsbG93cyBydW5uaW5nIGNvbW1hbmRzIGluIHRoZSBnbG9iYWwgY29tcG9zZXIgZGlyICgkQ09NUE9TRVJfSE9NRSknKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgnY29tbWFuZC1uYW1lJywgSW5wdXRBcmd1bWVudDo6UkVRVUlSRUQsICcnKSwKbmV3IElucHV0QXJndW1lbnQoJ2FyZ3MnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClVzZSB0aGlzIGNvbW1hbmQgYXMgYSB3cmFwcGVyIHRvIHJ1biBvdGhlciBDb21wb3NlciBjb21tYW5kcwp3aXRoaW4gdGhlIGdsb2JhbCBjb250ZXh0IG9mIENPTVBPU0VSX0hPTUUuCgpZb3UgY2FuIHVzZSB0aGlzIHRvIGluc3RhbGwgQ0xJIHV0aWxpdGllcyBnbG9iYWxseSwgYWxsIHlvdSBuZWVkCmlzIHRvIGFkZCB0aGUgQ09NUE9TRVJfSE9NRS92ZW5kb3IvYmluIGRpciB0byB5b3VyIFBBVEggZW52IHZhci4KCkNPTVBPU0VSX0hPTUUgaXMgYzpcVXNlcnNcPHVzZXI+XEFwcERhdGFcUm9hbWluZ1xDb21wb3NlciBvbiBXaW5kb3dzCmFuZCAvaG9tZS88dXNlcj4vLmNvbXBvc2VyIG9uIHVuaXggc3lzdGVtcy4KCklmIHlvdXIgc3lzdGVtIHVzZXMgZnJlZWRlc2t0b3Aub3JnIHN0YW5kYXJkcywgdGhlbiBpdCB3aWxsIGZpcnN0IGNoZWNrClhER19DT05GSUdfSE9NRSBvciBkZWZhdWx0IHRvIC9ob21lLzx1c2VyPi8uY29uZmlnL2NvbXBvc2VyCgpOb3RlOiBUaGlzIHBhdGggbWF5IHZhcnkgZGVwZW5kaW5nIG9uIGN1c3RvbWl6YXRpb25zIHRvIGJpbi1kaXIgaW4KY29tcG9zZXIuanNvbiBvciB0aGUgZW52aXJvbm1lbnRhbCB2YXJpYWJsZSBDT01QT1NFUl9CSU5fRElSLgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjZ2xvYmFsCkVPVAopCjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bihJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKCmlmICghbWV0aG9kX2V4aXN0cygkaW5wdXQsICdfX3RvU3RyaW5nJykpIHsgCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGFuIElucHV0IGluc3RhbmNlIHRoYXQgaXMgc3RyaW5nYWJsZSwgZ290ICcuZ2V0X2NsYXNzKCRpbnB1dCkpOwp9CgoKJHRva2VucyA9IFByZWc6OnNwbGl0KCd7XHMrfScsICRpbnB1dC0+X190b1N0cmluZygpKTsKJGFyZ3MgPSBbXTsKZm9yZWFjaCAoJHRva2VucyBhcyAkdG9rZW4pIHsKaWYgKCR0b2tlbiAmJiAkdG9rZW5bMF0gIT09ICctJykgewokYXJnc1tdID0gJHRva2VuOwppZiAoY291bnQoJGFyZ3MpID49IDIpIHsKYnJlYWs7Cn0KfQp9CgoKaWYgKGNvdW50KCRhcmdzKSA8IDIpIHsKcmV0dXJuIHBhcmVudDo6cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCiRpbnB1dCA9ICR0aGlzLT5wcmVwYXJlU3ViY29tbWFuZElucHV0KCRpbnB1dCk7CgpyZXR1cm4gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmVTdWJjb21tYW5kSW5wdXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBib29sICRxdWlldCA9IGZhbHNlKTogU3RyaW5nSW5wdXQKewoKaWYgKCFtZXRob2RfZXhpc3RzKCRpbnB1dCwgJ19fdG9TdHJpbmcnKSkgeyAKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYW4gSW5wdXQgaW5zdGFuY2UgdGhhdCBpcyBzdHJpbmdhYmxlLCBnb3QgJy5nZXRfY2xhc3MoJGlucHV0KSk7Cn0KCgppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVInKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0NPTVBPU0VSJyk7Cn0KCgokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7CiRob21lID0gJGNvbmZpZy0+Z2V0KCdob21lJyk7CgppZiAoIWlzX2RpcigkaG9tZSkpIHsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJGhvbWUpOwppZiAoIWlzX2RpcigkaG9tZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY3JlYXRlIGhvbWUgZGlyZWN0b3J5Jyk7Cn0KfQoKdHJ5IHsKY2hkaXIoJGhvbWUpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHN3aXRjaCB0byBob21lIGRpcmVjdG9yeSAiJy4kaG9tZS4nIicsIDAsICRlKTsKfQppZiAoISRxdWlldCkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignPGluZm8+Q2hhbmdlZCBjdXJyZW50IGRpcmVjdG9yeSB0byAnLiRob21lLic8L2luZm8+Jyk7Cn0KCgokaW5wdXQgPSBuZXcgU3RyaW5nSW5wdXQoUHJlZzo6cmVwbGFjZSgne1xiZyg/OmwoPzpvKD86Yig/OmEoPzpsKT8pPyk/KT8pP1xifScsICcnLCAkaW5wdXQtPl9fdG9TdHJpbmcoKSwgMSkpOwokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cmVzZXRDb21wb3NlcigpOwoKcmV0dXJuICRpbnB1dDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHJveHlDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSb290UGFja2FnZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBIb21lQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnYnJvd3NlJykKLT5zZXRBbGlhc2VzKFsnaG9tZSddKQotPnNldERlc2NyaXB0aW9uKCdPcGVucyB0aGUgcGFja2FnZVwncyByZXBvc2l0b3J5IFVSTCBvciBob21lcGFnZSBpbiB5b3VyIGJyb3dzZXInKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSwgJ1BhY2thZ2UocykgdG8gYnJvd3NlIHRvLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZSgpKSwKbmV3IElucHV0T3B0aW9uKCdob21lcGFnZScsICdIJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcGVuIHRoZSBob21lcGFnZSBpbnN0ZWFkIG9mIHRoZSByZXBvc2l0b3J5IFVSTC4nKSwKbmV3IElucHV0T3B0aW9uKCdzaG93JywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09ubHkgc2hvdyB0aGUgaG9tZXBhZ2Ugb3IgcmVwb3NpdG9yeSBVUkwuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBob21lIGNvbW1hbmQgb3BlbnMgb3Igc2hvd3MgYSBwYWNrYWdlJ3MgcmVwb3NpdG9yeSBVUkwgb3IKaG9tZXBhZ2UgaW4geW91ciBkZWZhdWx0IGJyb3dzZXIuCgpUbyBvcGVuIHRoZSBob21lcGFnZSBieSBkZWZhdWx0LCB1c2UgLUggb3IgLS1ob21lcGFnZS4KVG8gc2hvdyBpbnN0ZWFkIG9mIG9wZW4gdGhlIHJlcG9zaXRvcnkgb3IgaG9tZXBhZ2UgVVJMLCB1c2UgLXMgb3IgLS1zaG93LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjYnJvd3NlLWhvbWUKRU9UCik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokcmVwb3MgPSAkdGhpcy0+aW5pdGlhbGl6ZVJlcG9zKCk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokcmV0dXJuID0gMDsKCiRwYWNrYWdlcyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyk7CmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CiRpby0+d3JpdGVFcnJvcignTm8gcGFja2FnZSBzcGVjaWZpZWQsIG9wZW5pbmcgaG9tZXBhZ2UgZm9yIHRoZSByb290IHBhY2thZ2UnKTsKJHBhY2thZ2VzID0gWyR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCldOwp9Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2VOYW1lKSB7CiRoYW5kbGVkID0gZmFsc2U7CiRwYWNrYWdlRXhpc3RzID0gZmFsc2U7CmZvcmVhY2ggKCRyZXBvcyBhcyAkcmVwbykgewpmb3JlYWNoICgkcmVwby0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlTmFtZSkgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VFeGlzdHMgPSB0cnVlOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJHRoaXMtPmhhbmRsZVBhY2thZ2UoJHBhY2thZ2UsICRpbnB1dC0+Z2V0T3B0aW9uKCdob21lcGFnZScpLCAkaW5wdXQtPmdldE9wdGlvbignc2hvdycpKSkgewokaGFuZGxlZCA9IHRydWU7CmJyZWFrIDI7Cn0KfQp9CgppZiAoISRwYWNrYWdlRXhpc3RzKSB7CiRyZXR1cm4gPSAxOwokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhY2thZ2UgJy4kcGFja2FnZU5hbWUuJyBub3QgZm91bmQ8L3dhcm5pbmc+Jyk7Cn0KCmlmICghJGhhbmRsZWQpIHsKJHJldHVybiA9IDE7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4oJGlucHV0LT5nZXRPcHRpb24oJ2hvbWVwYWdlJykgPyAnSW52YWxpZCBvciBtaXNzaW5nIGhvbWVwYWdlJyA6ICdJbnZhbGlkIG9yIG1pc3NpbmcgcmVwb3NpdG9yeSBVUkwnKS4nIGZvciAnLiRwYWNrYWdlTmFtZS4nPC93YXJuaW5nPicpOwp9Cn0KCnJldHVybiAkcmV0dXJuOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVBhY2thZ2UoQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBib29sICRzaG93SG9tZXBhZ2UsIGJvb2wgJHNob3dPbmx5KTogYm9vbAp7CiRzdXBwb3J0ID0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKTsKJHVybCA9ICRzdXBwb3J0Wydzb3VyY2UnXSA/PyAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCk7CmlmICghJHVybCB8fCAkc2hvd0hvbWVwYWdlKSB7CiR1cmwgPSAkcGFja2FnZS0+Z2V0SG9tZXBhZ2UoKTsKfQoKaWYgKCEkdXJsIHx8ICFmaWx0ZXJfdmFyKCR1cmwsIEZJTFRFUl9WQUxJREFURV9VUkwpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRzaG93T25seSkgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoc3ByaW50ZignPGluZm8+JXM8L2luZm8+JywgJHVybCkpOwp9IGVsc2UgewokdGhpcy0+b3BlbkJyb3dzZXIoJHVybCk7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG9wZW5Ccm93c2VyKHN0cmluZyAkdXJsKTogdm9pZAp7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkdGhpcy0+Z2V0SU8oKSk7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHByb2Nlc3MtPmV4ZWN1dGUoWydzdGFydCcsICcid2ViIicsICdleHBsb3JlcicsICR1cmxdLCAkb3V0cHV0KTsKCnJldHVybjsKfQoKJGxpbnV4ID0gJHByb2Nlc3MtPmV4ZWN1dGUoWyd3aGljaCcsICd4ZGctb3BlbiddLCAkb3V0cHV0KTsKJG9zeCA9ICRwcm9jZXNzLT5leGVjdXRlKFsnd2hpY2gnLCAnb3BlbiddLCAkb3V0cHV0KTsKCmlmICgwID09PSAkbGludXgpIHsKJHByb2Nlc3MtPmV4ZWN1dGUoWyd4ZGctb3BlbicsICR1cmxdLCAkb3V0cHV0KTsKfSBlbHNlaWYgKDAgPT09ICRvc3gpIHsKJHByb2Nlc3MtPmV4ZWN1dGUoWydvcGVuJywgJHVybF0sICRvdXRwdXQpOwp9IGVsc2UgewokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcignTm8gc3VpdGFibGUgYnJvd3NlciBvcGVuaW5nIGNvbW1hbmQgZm91bmQsIG9wZW4geW91cnNlbGY6ICcgLiAkdXJsKTsKfQp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0aWFsaXplUmVwb3MoKTogYXJyYXkKewokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKCmlmICgkY29tcG9zZXIpIHsKcmV0dXJuIGFycmF5X21lcmdlKApbbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkY29tcG9zZXItPmdldFBhY2thZ2UoKSldLCAKWyRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCldLCAKJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKSAKKTsKfQoKcmV0dXJuIFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJHRoaXMtPmdldElPKCkpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJyYXlJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxGb3JtYXR0ZXJIZWxwZXI7CgoKCgoKY2xhc3MgSW5pdENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CnVzZSBQYWNrYWdlRGlzY292ZXJ5VHJhaXQ7CgoKcHJpdmF0ZSAkZ2l0Q29uZmlnOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdpbml0JykKLT5zZXREZXNjcmlwdGlvbignQ3JlYXRlcyBhIGJhc2ljIGNvbXBvc2VyLmpzb24gZmlsZSBpbiBjdXJyZW50IGRpcmVjdG9yeScpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignbmFtZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ05hbWUgb2YgdGhlIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCdkZXNjcmlwdGlvbicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Rlc2NyaXB0aW9uIG9mIHBhY2thZ2UnKSwKbmV3IElucHV0T3B0aW9uKCdhdXRob3InLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdXRob3IgbmFtZSBvZiBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbigndHlwZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1R5cGUgb2YgcGFja2FnZSAoZS5nLiBsaWJyYXJ5LCBwcm9qZWN0LCBtZXRhcGFja2FnZSwgY29tcG9zZXItcGx1Z2luKScpLApuZXcgSW5wdXRPcHRpb24oJ2hvbWVwYWdlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnSG9tZXBhZ2Ugb2YgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3JlcXVpcmUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVkgfCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdQYWNrYWdlIHRvIHJlcXVpcmUgd2l0aCBhIHZlcnNpb24gY29uc3RyYWludCwgZS5nLiBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAgb3IgImZvby9iYXIgMS4wLjAiJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkpLApuZXcgSW5wdXRPcHRpb24oJ3JlcXVpcmUtZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZIHwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnUGFja2FnZSB0byByZXF1aXJlIGZvciBkZXZlbG9wbWVudCB3aXRoIGEgdmVyc2lvbiBjb25zdHJhaW50LCBlLmcuIGZvby9iYXI6MS4wLjAgb3IgZm9vL2Jhcj0xLjAuMCBvciAiZm9vL2JhciAxLjAuMCInLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2VJbmNsUGxhdGZvcm0oKSksCm5ldyBJbnB1dE9wdGlvbignc3RhYmlsaXR5JywgJ3MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdNaW5pbXVtIHN0YWJpbGl0eSAoZW1wdHkgb3Igb25lIG9mOiAnLmltcGxvZGUoJywgJywgYXJyYXlfa2V5cyhCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMpKS4nKScpLApuZXcgSW5wdXRPcHRpb24oJ2xpY2Vuc2UnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0xpY2Vuc2Ugb2YgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3JlcG9zaXRvcnknLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdBZGQgY3VzdG9tIHJlcG9zaXRvcmllcywgZWl0aGVyIGJ5IFVSTCBvciB1c2luZyBKU09OIGFycmF5cycpLApuZXcgSW5wdXRPcHRpb24oJ2F1dG9sb2FkJywgJ2EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBZGQgUFNSLTQgYXV0b2xvYWQgbWFwcGluZy4gTWFwcyB5b3VyIHBhY2thZ2VcJ3MgbmFtZXNwYWNlIHRvIHRoZSBwcm92aWRlZCBkaXJlY3RvcnkuIChFeHBlY3RzIGEgcmVsYXRpdmUgcGF0aCwgZS5nLiBzcmMvKScpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+aW5pdDwvaW5mbz4gY29tbWFuZCBjcmVhdGVzIGEgYmFzaWMgY29tcG9zZXIuanNvbiBmaWxlCmluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGluaXQ8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNpbml0CkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGFsbG93bGlzdCA9IFsnbmFtZScsICdkZXNjcmlwdGlvbicsICdhdXRob3InLCAndHlwZScsICdob21lcGFnZScsICdyZXF1aXJlJywgJ3JlcXVpcmUtZGV2JywgJ3N0YWJpbGl0eScsICdsaWNlbnNlJywgJ2F1dG9sb2FkJ107CiRvcHRpb25zID0gYXJyYXlfZmlsdGVyKGFycmF5X2ludGVyc2VjdF9rZXkoJGlucHV0LT5nZXRPcHRpb25zKCksIGFycmF5X2ZsaXAoJGFsbG93bGlzdCkpLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHsgcmV0dXJuICR2YWwgIT09IG51bGwgJiYgJHZhbCAhPT0gW107IH0pOwoKaWYgKGlzc2V0KCRvcHRpb25zWyduYW1lJ10pICYmICFQcmVnOjppc01hdGNoKCd7XlthLXowLTldKFtfLi1dP1thLXowLTldKykqXC9bYS16MC05XSgoW18uXXwtezEsMn0pP1thLXowLTldKykqJH1EJywgJG9wdGlvbnNbJ25hbWUnXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCidUaGUgcGFja2FnZSBuYW1lICcuJG9wdGlvbnNbJ25hbWUnXS4nIGlzIGludmFsaWQsIGl0IHNob3VsZCBiZSBsb3dlcmNhc2UgYW5kIGhhdmUgYSB2ZW5kb3IgbmFtZSwgYSBmb3J3YXJkIHNsYXNoLCBhbmQgYSBwYWNrYWdlIG5hbWUsIG1hdGNoaW5nOiBbYS16MC05Xy4tXSsvW2EtejAtOV8uLV0rJwopOwp9CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2F1dGhvciddKSkgewokb3B0aW9uc1snYXV0aG9ycyddID0gJHRoaXMtPmZvcm1hdEF1dGhvcnMoJG9wdGlvbnNbJ2F1dGhvciddKTsKdW5zZXQoJG9wdGlvbnNbJ2F1dGhvciddKTsKfQoKJHJlcG9zaXRvcmllcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdyZXBvc2l0b3J5Jyk7CmlmIChjb3VudCgkcmVwb3NpdG9yaWVzKSA+IDApIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwpmb3JlYWNoICgkcmVwb3NpdG9yaWVzIGFzICRyZXBvKSB7CiRvcHRpb25zWydyZXBvc2l0b3JpZXMnXVtdID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNvbmZpZ0Zyb21TdHJpbmcoJGlvLCAkY29uZmlnLCAkcmVwbywgdHJ1ZSk7Cn0KfQoKaWYgKGlzc2V0KCRvcHRpb25zWydzdGFiaWxpdHknXSkpIHsKJG9wdGlvbnNbJ21pbmltdW0tc3RhYmlsaXR5J10gPSAkb3B0aW9uc1snc3RhYmlsaXR5J107CnVuc2V0KCRvcHRpb25zWydzdGFiaWxpdHknXSk7Cn0KCiRvcHRpb25zWydyZXF1aXJlJ10gPSBpc3NldCgkb3B0aW9uc1sncmVxdWlyZSddKSA/ICR0aGlzLT5mb3JtYXRSZXF1aXJlbWVudHMoJG9wdGlvbnNbJ3JlcXVpcmUnXSkgOiBuZXcgXHN0ZENsYXNzOwppZiAoW10gPT09ICRvcHRpb25zWydyZXF1aXJlJ10pIHsKJG9wdGlvbnNbJ3JlcXVpcmUnXSA9IG5ldyBcc3RkQ2xhc3M7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSkpIHsKJG9wdGlvbnNbJ3JlcXVpcmUtZGV2J10gPSAkdGhpcy0+Zm9ybWF0UmVxdWlyZW1lbnRzKCRvcHRpb25zWydyZXF1aXJlLWRldiddKTsKaWYgKFtdID09PSAkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSkgewokb3B0aW9uc1sncmVxdWlyZS1kZXYnXSA9IG5ldyBcc3RkQ2xhc3M7Cn0KfQoKCiRhdXRvbG9hZFBhdGggPSBudWxsOwppZiAoaXNzZXQoJG9wdGlvbnNbJ2F1dG9sb2FkJ10pKSB7CiRhdXRvbG9hZFBhdGggPSAkb3B0aW9uc1snYXV0b2xvYWQnXTsKJG5hbWVzcGFjZSA9ICR0aGlzLT5uYW1lc3BhY2VGcm9tUGFja2FnZU5hbWUoKHN0cmluZykgJGlucHV0LT5nZXRPcHRpb24oJ25hbWUnKSk7CiRvcHRpb25zWydhdXRvbG9hZCddID0gKG9iamVjdCkgWwoncHNyLTQnID0+IFsKJG5hbWVzcGFjZSAuICdcXCcgPT4gJGF1dG9sb2FkUGF0aCwKXSwKXTsKfQoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpOwokanNvbiA9IEpzb25GaWxlOjplbmNvZGUoJG9wdGlvbnMpOwoKaWYgKCRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRpby0+d3JpdGVFcnJvcihbJycsICRqc29uLCAnJ10pOwppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKCdEbyB5b3UgY29uZmlybSBnZW5lcmF0aW9uIFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q29tbWFuZCBhYm9ydGVkPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignV3JpdGluZyAnLiRmaWxlLT5nZXRQYXRoKCkpOwp9CgokZmlsZS0+d3JpdGUoJG9wdGlvbnMpOwp0cnkgewokZmlsZS0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxBWF9TQ0hFTUEpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5TY2hlbWEgdmFsaWRhdGlvbiBlcnJvciwgYWJvcnRpbmc8L2Vycm9yPicpOwokZXJyb3JzID0gJyAtICcgLiBpbXBsb2RlKFBIUF9FT0wgLiAnIC0gJywgJGUtPmdldEVycm9ycygpKTsKJGlvLT53cml0ZUVycm9yKCRlLT5nZXRNZXNzYWdlKCkgLiAnOicgLiBQSFBfRU9MIC4gJGVycm9ycyk7ClNpbGVuY2VyOjpjYWxsKCd1bmxpbmsnLCAkZmlsZS0+Z2V0UGF0aCgpKTsKCnJldHVybiAxOwp9CgoKaWYgKCRhdXRvbG9hZFBhdGgpIHsKJGZpbGVzeXN0ZW0gPSBuZXcgRmlsZXN5c3RlbSgpOwokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRhdXRvbG9hZFBhdGgpOwoKCmlmICghJHRoaXMtPmhhc0RlcGVuZGVuY2llcygkb3B0aW9ucykpIHsKJHRoaXMtPnJ1bkR1bXBBdXRvbG9hZENvbW1hbmQoJG91dHB1dCk7Cn0KfQoKaWYgKCRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpICYmIGlzX2RpcignLmdpdCcpKSB7CiRpZ25vcmVGaWxlID0gcmVhbHBhdGgoJy5naXRpZ25vcmUnKTsKCmlmIChmYWxzZSA9PT0gJGlnbm9yZUZpbGUpIHsKJGlnbm9yZUZpbGUgPSByZWFscGF0aCgnLicpIC4gJy8uZ2l0aWdub3JlJzsKfQoKaWYgKCEkdGhpcy0+aGFzVmVuZG9ySWdub3JlKCRpZ25vcmVGaWxlKSkgewokcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdGhlIDxpbmZvPnZlbmRvcjwvaW5mbz4gZGlyZWN0b3J5IGFkZGVkIHRvIHlvdXIgPGluZm8+LmdpdGlnbm9yZTwvaW5mbz4gWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnOwoKaWYgKCRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbikpIHsKJHRoaXMtPmFkZFZlbmRvcklnbm9yZSgkaWdub3JlRmlsZSk7Cn0KfQp9CgokcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gaW5zdGFsbCBkZXBlbmRlbmNpZXMgbm93IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKaWYgKCRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpICYmICR0aGlzLT5oYXNEZXBlbmRlbmNpZXMoJG9wdGlvbnMpICYmICRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbikpIHsKJHRoaXMtPnVwZGF0ZURlcGVuZGVuY2llcygkb3V0cHV0KTsKfQoKCmlmICgkYXV0b2xvYWRQYXRoKSB7CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwoKJGlvLT53cml0ZUVycm9yKCdQU1ItNCBhdXRvbG9hZGluZyBjb25maWd1cmVkLiBVc2UgIjxjb21tZW50Pm5hbWVzcGFjZSAnLiRuYW1lc3BhY2UuJzs8L2NvbW1lbnQ+IiBpbiAnLiRhdXRvbG9hZFBhdGgpOwokaW8tPndyaXRlRXJyb3IoJ0luY2x1ZGUgdGhlIENvbXBvc2VyIGF1dG9sb2FkZXIgd2l0aDogPGNvbW1lbnQ+cmVxdWlyZSBcJ3ZlbmRvci9hdXRvbG9hZC5waHBcJzs8L2NvbW1lbnQ+Jyk7Cn0KCnJldHVybiAwOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnBhcmVudDo6aW5pdGlhbGl6ZSgkaW5wdXQsICRvdXRwdXQpOwoKaWYgKCEkaW5wdXQtPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25hbWUnKSA9PT0gbnVsbCkgewokaW5wdXQtPnNldE9wdGlvbignbmFtZScsICR0aGlzLT5nZXREZWZhdWx0UGFja2FnZU5hbWUoKSk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignYXV0aG9yJykgPT09IG51bGwpIHsKJGlucHV0LT5zZXRPcHRpb24oJ2F1dGhvcicsICR0aGlzLT5nZXREZWZhdWx0QXV0aG9yKCkpOwp9Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGludGVyYWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokZm9ybWF0dGVyID0gJHRoaXMtPmdldEhlbHBlclNldCgpLT5nZXQoJ2Zvcm1hdHRlcicpOwoKCiRyZXBvc2l0b3JpZXMgPSAkaW5wdXQtPmdldE9wdGlvbigncmVwb3NpdG9yeScpOwppZiAoY291bnQoJHJlcG9zaXRvcmllcykgPiAwKSB7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJGlvKTsKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKJHJlcG9NYW5hZ2VyID0gUmVwb3NpdG9yeUZhY3Rvcnk6Om1hbmFnZXIoJGlvLCAkY29uZmlnKTsKCiRyZXBvcyA9IFtuZXcgUGxhdGZvcm1SZXBvc2l0b3J5XTsKJGNyZWF0ZURlZmF1bHRQYWNrYWdpc3RSZXBvID0gdHJ1ZTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwbykgewokcmVwb0NvbmZpZyA9IFJlcG9zaXRvcnlGYWN0b3J5Ojpjb25maWdGcm9tU3RyaW5nKCRpbywgJGNvbmZpZywgJHJlcG8sIHRydWUpOwppZiAoCihpc3NldCgkcmVwb0NvbmZpZ1sncGFja2FnaXN0J10pICYmICRyZXBvQ29uZmlnID09PSBbJ3BhY2thZ2lzdCcgPT4gZmFsc2VdKQp8fCAoaXNzZXQoJHJlcG9Db25maWdbJ3BhY2thZ2lzdC5vcmcnXSkgJiYgJHJlcG9Db25maWcgPT09IFsncGFja2FnaXN0Lm9yZycgPT4gZmFsc2VdKQopIHsKJGNyZWF0ZURlZmF1bHRQYWNrYWdpc3RSZXBvID0gZmFsc2U7CmNvbnRpbnVlOwp9CiRyZXBvc1tdID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCAkcmVwb0NvbmZpZywgJHJlcG9NYW5hZ2VyKTsKfQoKaWYgKCRjcmVhdGVEZWZhdWx0UGFja2FnaXN0UmVwbykgewokcmVwb3NbXSA9IFJlcG9zaXRvcnlGYWN0b3J5OjpjcmVhdGVSZXBvKCRpbywgJGNvbmZpZywgWwondHlwZScgPT4gJ2NvbXBvc2VyJywKJ3VybCcgPT4gJ2h0dHBzOi8vcmVwby5wYWNrYWdpc3Qub3JnJywKXSwgJHJlcG9NYW5hZ2VyKTsKfQoKJHRoaXMtPnJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoJHJlcG9zKTsKdW5zZXQoJHJlcG9zLCAkY29uZmlnLCAkcmVwb3NpdG9yaWVzKTsKfQoKJGlvLT53cml0ZUVycm9yKFsKJycsCiRmb3JtYXR0ZXItPmZvcm1hdEJsb2NrKCdXZWxjb21lIHRvIHRoZSBDb21wb3NlciBjb25maWcgZ2VuZXJhdG9yJywgJ2JnPWJsdWU7Zmc9d2hpdGUnLCB0cnVlKSwKJycsCl0pOwoKCiRpby0+d3JpdGVFcnJvcihbCicnLAonVGhpcyBjb21tYW5kIHdpbGwgZ3VpZGUgeW91IHRocm91Z2ggY3JlYXRpbmcgeW91ciBjb21wb3Nlci5qc29uIGNvbmZpZy4nLAonJywKXSk7CgokbmFtZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykgPz8gJHRoaXMtPmdldERlZmF1bHRQYWNrYWdlTmFtZSgpOwoKJG5hbWUgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonUGFja2FnZSBuYW1lICg8dmVuZG9yPi88bmFtZT4pIFs8Y29tbWVudD4nLiRuYW1lLic8L2NvbW1lbnQ+XTogJywKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG5hbWUpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSkgewpyZXR1cm4gJG5hbWU7Cn0KCmlmICghUHJlZzo6aXNNYXRjaCgne15bYS16MC05XShbXy4tXT9bYS16MC05XSspKlwvW2EtejAtOV0oKFtfLl18LXsxLDJ9KT9bYS16MC05XSspKiR9RCcsICR2YWx1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oCidUaGUgcGFja2FnZSBuYW1lICcuJHZhbHVlLicgaXMgaW52YWxpZCwgaXQgc2hvdWxkIGJlIGxvd2VyY2FzZSBhbmQgaGF2ZSBhIHZlbmRvciBuYW1lLCBhIGZvcndhcmQgc2xhc2gsIGFuZCBhIHBhY2thZ2UgbmFtZSwgbWF0Y2hpbmc6IFthLXowLTlfLi1dKy9bYS16MC05Xy4tXSsnCik7Cn0KCnJldHVybiAkdmFsdWU7Cn0sCm51bGwsCiRuYW1lCik7CiRpbnB1dC0+c2V0T3B0aW9uKCduYW1lJywgJG5hbWUpOwoKJGRlc2NyaXB0aW9uID0gJGlucHV0LT5nZXRPcHRpb24oJ2Rlc2NyaXB0aW9uJykgPzogbnVsbDsKJGRlc2NyaXB0aW9uID0gJGlvLT5hc2soCidEZXNjcmlwdGlvbiBbPGNvbW1lbnQ+Jy4kZGVzY3JpcHRpb24uJzwvY29tbWVudD5dOiAnLAokZGVzY3JpcHRpb24KKTsKJGlucHV0LT5zZXRPcHRpb24oJ2Rlc2NyaXB0aW9uJywgJGRlc2NyaXB0aW9uKTsKCiRhdXRob3IgPSAkaW5wdXQtPmdldE9wdGlvbignYXV0aG9yJykgPz8gJHRoaXMtPmdldERlZmF1bHRBdXRob3IoKTsKCiRhdXRob3IgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonQXV0aG9yIFsnLihpc19zdHJpbmcoJGF1dGhvcikgPyAnPGNvbW1lbnQ+Jy4kYXV0aG9yLic8L2NvbW1lbnQ+LCAnIDogJycpIC4gJ24gdG8gc2tpcF06ICcsCmZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJGF1dGhvcikgewppZiAoJHZhbHVlID09PSAnbicgfHwgJHZhbHVlID09PSAnbm8nKSB7CnJldHVybjsKfQokdmFsdWUgPSAkdmFsdWUgPzogJGF1dGhvcjsKJGF1dGhvciA9ICR0aGlzLT5wYXJzZUF1dGhvclN0cmluZygkdmFsdWUgPz8gJycpOwoKaWYgKCRhdXRob3JbJ2VtYWlsJ10gPT09IG51bGwpIHsKcmV0dXJuICRhdXRob3JbJ25hbWUnXTsKfQoKcmV0dXJuIHNwcmludGYoJyVzIDwlcz4nLCAkYXV0aG9yWyduYW1lJ10sICRhdXRob3JbJ2VtYWlsJ10pOwp9LApudWxsLAokYXV0aG9yCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdhdXRob3InLCAkYXV0aG9yKTsKCiRtaW5pbXVtU3RhYmlsaXR5ID0gJGlucHV0LT5nZXRPcHRpb24oJ3N0YWJpbGl0eScpID86IG51bGw7CiRtaW5pbXVtU3RhYmlsaXR5ID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgKJ01pbmltdW0gU3RhYmlsaXR5IFs8Y29tbWVudD4nLiRtaW5pbXVtU3RhYmlsaXR5Lic8L2NvbW1lbnQ+XTogJywKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG1pbmltdW1TdGFiaWxpdHkpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSkgewpyZXR1cm4gJG1pbmltdW1TdGFiaWxpdHk7Cn0KCmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyR2YWx1ZV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonSW52YWxpZCBtaW5pbXVtIHN0YWJpbGl0eSAiJy4kdmFsdWUuJyIuIE11c3QgYmUgZW1wdHkgb3Igb25lIG9mOiAnLgppbXBsb2RlKCcsICcsIGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTKSkKKTsKfQoKcmV0dXJuICR2YWx1ZTsKfSwKbnVsbCwKJG1pbmltdW1TdGFiaWxpdHkKKTsKJGlucHV0LT5zZXRPcHRpb24oJ3N0YWJpbGl0eScsICRtaW5pbXVtU3RhYmlsaXR5KTsKCiR0eXBlID0gJGlucHV0LT5nZXRPcHRpb24oJ3R5cGUnKTsKJHR5cGUgPSAkaW8tPmFzaygKJ1BhY2thZ2UgVHlwZSAoZS5nLiBsaWJyYXJ5LCBwcm9qZWN0LCBtZXRhcGFja2FnZSwgY29tcG9zZXItcGx1Z2luKSBbPGNvbW1lbnQ+Jy4kdHlwZS4nPC9jb21tZW50Pl06ICcsCiR0eXBlCik7CmlmICgkdHlwZSA9PT0gJycgfHwgJHR5cGUgPT09IGZhbHNlKSB7CiR0eXBlID0gbnVsbDsKfQokaW5wdXQtPnNldE9wdGlvbigndHlwZScsICR0eXBlKTsKCmlmIChudWxsID09PSAkbGljZW5zZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdsaWNlbnNlJykpIHsKaWYgKCFlbXB0eSgkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9MSUNFTlNFJ10pKSB7CiRsaWNlbnNlID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfTElDRU5TRSddOwp9Cn0KCiRsaWNlbnNlID0gJGlvLT5hc2soCidMaWNlbnNlIFs8Y29tbWVudD4nLiRsaWNlbnNlLic8L2NvbW1lbnQ+XTogJywKJGxpY2Vuc2UKKTsKJHNwZHggPSBuZXcgU3BkeExpY2Vuc2VzKCk7CmlmIChudWxsICE9PSAkbGljZW5zZSAmJiAhJHNwZHgtPnZhbGlkYXRlKCRsaWNlbnNlKSAmJiAkbGljZW5zZSAhPT0gJ3Byb3ByaWV0YXJ5Jykgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBsaWNlbnNlIHByb3ZpZGVkOiAnLiRsaWNlbnNlLicuIE9ubHkgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXJzIChodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzLykgb3IgInByb3ByaWV0YXJ5IiBhcmUgYWNjZXB0ZWQuJyk7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ2xpY2Vuc2UnLCAkbGljZW5zZSk7CgokaW8tPndyaXRlRXJyb3IoWycnLCAnRGVmaW5lIHlvdXIgZGVwZW5kZW5jaWVzLicsICcnXSk7CgoKJHJlcG9zID0gJHRoaXMtPmdldFJlcG9zKCk7CiRwcmVmZXJyZWRTdGFiaWxpdHkgPSAkbWluaW11bVN0YWJpbGl0eSA/OiAnc3RhYmxlJzsKJHBsYXRmb3JtUmVwbyA9IG51bGw7CmlmICgkcmVwb3MgaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvcy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJGNhbmRpZGF0ZVJlcG8pIHsKaWYgKCRjYW5kaWRhdGVSZXBvIGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5KSB7CiRwbGF0Zm9ybVJlcG8gPSAkY2FuZGlkYXRlUmVwbzsKYnJlYWs7Cn0KfQp9CgokcXVlc3Rpb24gPSAnV291bGQgeW91IGxpa2UgdG8gZGVmaW5lIHlvdXIgZGVwZW5kZW5jaWVzIChyZXF1aXJlKSBpbnRlcmFjdGl2ZWx5IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJzsKJHJlcXVpcmUgPSAkaW5wdXQtPmdldE9wdGlvbigncmVxdWlyZScpOwokcmVxdWlyZW1lbnRzID0gW107CmlmIChjb3VudCgkcmVxdWlyZSkgPiAwIHx8ICRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbikpIHsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5kZXRlcm1pbmVSZXF1aXJlbWVudHMoJGlucHV0LCAkb3V0cHV0LCAkcmVxdWlyZSwgJHBsYXRmb3JtUmVwbywgJHByZWZlcnJlZFN0YWJpbGl0eSk7Cn0KJGlucHV0LT5zZXRPcHRpb24oJ3JlcXVpcmUnLCAkcmVxdWlyZW1lbnRzKTsKCiRxdWVzdGlvbiA9ICdXb3VsZCB5b3UgbGlrZSB0byBkZWZpbmUgeW91ciBkZXYgZGVwZW5kZW5jaWVzIChyZXF1aXJlLWRldikgaW50ZXJhY3RpdmVseSBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICc7CiRyZXF1aXJlRGV2ID0gJGlucHV0LT5nZXRPcHRpb24oJ3JlcXVpcmUtZGV2Jyk7CiRkZXZSZXF1aXJlbWVudHMgPSBbXTsKaWYgKGNvdW50KCRyZXF1aXJlRGV2KSA+IDAgfHwgJGlvLT5hc2tDb25maXJtYXRpb24oJHF1ZXN0aW9uKSkgewokZGV2UmVxdWlyZW1lbnRzID0gJHRoaXMtPmRldGVybWluZVJlcXVpcmVtZW50cygkaW5wdXQsICRvdXRwdXQsICRyZXF1aXJlRGV2LCAkcGxhdGZvcm1SZXBvLCAkcHJlZmVycmVkU3RhYmlsaXR5KTsKfQokaW5wdXQtPnNldE9wdGlvbigncmVxdWlyZS1kZXYnLCAkZGV2UmVxdWlyZW1lbnRzKTsKCgokYXV0b2xvYWQgPSAkaW5wdXQtPmdldE9wdGlvbignYXV0b2xvYWQnKSA/OiAnc3JjLyc7CiRuYW1lc3BhY2UgPSAkdGhpcy0+bmFtZXNwYWNlRnJvbVBhY2thZ2VOYW1lKChzdHJpbmcpICRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lJykpOwokYXV0b2xvYWQgPSAkaW8tPmFza0FuZFZhbGlkYXRlKAonQWRkIFBTUi00IGF1dG9sb2FkIG1hcHBpbmc/IE1hcHMgbmFtZXNwYWNlICInLiRuYW1lc3BhY2UuJyIgdG8gdGhlIGVudGVyZWQgcmVsYXRpdmUgcGF0aC4gWzxjb21tZW50PicuJGF1dG9sb2FkLic8L2NvbW1lbnQ+LCBuIHRvIHNraXBdOiAnLApzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkYXV0b2xvYWQpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSkgewpyZXR1cm4gJGF1dG9sb2FkOwp9CgppZiAoJHZhbHVlID09PSAnbicgfHwgJHZhbHVlID09PSAnbm8nKSB7CnJldHVybjsKfQoKJHZhbHVlID0gJHZhbHVlID86ICRhdXRvbG9hZDsKCmlmICghUHJlZzo6aXNNYXRjaCgne15bXi9dW0EtWmEtejAtOVwtXy9dKy8kfScsICR2YWx1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ1RoZSBzcmMgZm9sZGVyIG5hbWUgIiVzIiBpcyBpbnZhbGlkLiBQbGVhc2UgYWRkIGEgcmVsYXRpdmUgcGF0aCB3aXRoIHRhaWxpbmcgZm9yd2FyZCBzbGFzaC4gW0EtWmEtejAtOV8tL10rLycsCiR2YWx1ZQopKTsKfQoKcmV0dXJuICR2YWx1ZTsKfSwKbnVsbCwKJGF1dG9sb2FkCik7CiRpbnB1dC0+c2V0T3B0aW9uKCdhdXRvbG9hZCcsICRhdXRvbG9hZCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VBdXRob3JTdHJpbmcoc3RyaW5nICRhdXRob3IpOiBhcnJheQp7CmlmIChQcmVnOjppc01hdGNoKCcvXig/UDxuYW1lPlstIC4sXHB7TH1ccHtOfVxwe01ufVwn4oCZIigpXSspKD86XHMrPCg/UDxlbWFpbD4uKz8pPik/JC91JywgJGF1dGhvciwgJG1hdGNoKSkgewppZiAobnVsbCAhPT0gJG1hdGNoWydlbWFpbCddICYmICEkdGhpcy0+aXNWYWxpZEVtYWlsKCRtYXRjaFsnZW1haWwnXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgZW1haWwgIicuJG1hdGNoWydlbWFpbCddLiciJyk7Cn0KCnJldHVybiBbCiduYW1lJyA9PiB0cmltKCRtYXRjaFsnbmFtZSddKSwKJ2VtYWlsJyA9PiAkbWF0Y2hbJ2VtYWlsJ10sCl07Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKAonSW52YWxpZCBhdXRob3Igc3RyaW5nLiAgTXVzdCBiZSBpbiB0aGUgZm9ybWF0czogJy4KJ0phbmUgRG9lIG9yIEpvaG4gU21pdGggPGpvaG5AZXhhbXBsZS5jb20+JwopOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZm9ybWF0QXV0aG9ycyhzdHJpbmcgJGF1dGhvcik6IGFycmF5CnsKJGF1dGhvciA9ICR0aGlzLT5wYXJzZUF1dGhvclN0cmluZygkYXV0aG9yKTsKaWYgKG51bGwgPT09ICRhdXRob3JbJ2VtYWlsJ10pIHsKdW5zZXQoJGF1dGhvclsnZW1haWwnXSk7Cn0KCnJldHVybiBbJGF1dGhvcl07Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5hbWVzcGFjZUZyb21QYWNrYWdlTmFtZShzdHJpbmcgJHBhY2thZ2VOYW1lKTogP3N0cmluZwp7CmlmICghJHBhY2thZ2VOYW1lIHx8IHN0cnBvcygkcGFja2FnZU5hbWUsICcvJykgPT09IGZhbHNlKSB7CnJldHVybiBudWxsOwp9CgokbmFtZXNwYWNlID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYXJ0KTogc3RyaW5nIHsKJHBhcnQgPSBQcmVnOjpyZXBsYWNlKCcvW15hLXowLTldL2knLCAnICcsICRwYXJ0KTsKJHBhcnQgPSB1Y3dvcmRzKCRwYXJ0KTsKCnJldHVybiBzdHJfcmVwbGFjZSgnICcsICcnLCAkcGFydCk7Cn0sCmV4cGxvZGUoJy8nLCAkcGFja2FnZU5hbWUpCik7CgpyZXR1cm4gaW1wbG9kZSgnXFwnLCAkbmFtZXNwYWNlKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEdpdENvbmZpZygpOiBhcnJheQp7CmlmIChudWxsICE9PSAkdGhpcy0+Z2l0Q29uZmlnKSB7CnJldHVybiAkdGhpcy0+Z2l0Q29uZmlnOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJHRoaXMtPmdldElPKCkpOwoKaWYgKDAgPT09ICRwcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICctbCddLCAkb3V0cHV0KSkgewokdGhpcy0+Z2l0Q29uZmlnID0gW107ClByZWc6Om1hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XihbXj1dKyk9KC4qKSR9bScsICRvdXRwdXQsICRtYXRjaGVzKTsKZm9yZWFjaCAoJG1hdGNoZXNbMV0gYXMgJGtleSA9PiAkbWF0Y2gpIHsKJHRoaXMtPmdpdENvbmZpZ1skbWF0Y2hdID0gJG1hdGNoZXNbMl1bJGtleV07Cn0KCnJldHVybiAkdGhpcy0+Z2l0Q29uZmlnOwp9CgpyZXR1cm4gJHRoaXMtPmdpdENvbmZpZyA9IFtdOwp9CgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNWZW5kb3JJZ25vcmUoc3RyaW5nICRpZ25vcmVGaWxlLCBzdHJpbmcgJHZlbmRvciA9ICd2ZW5kb3InKTogYm9vbAp7CmlmICghZmlsZV9leGlzdHMoJGlnbm9yZUZpbGUpKSB7CnJldHVybiBmYWxzZTsKfQoKJHBhdHRlcm4gPSBzcHJpbnRmKCd7Xi8/JXMoL1wqPyk/JH0nLCBwcmVnX3F1b3RlKCR2ZW5kb3IpKTsKCiRsaW5lcyA9IGZpbGUoJGlnbm9yZUZpbGUsIEZJTEVfSUdOT1JFX05FV19MSU5FUyk7CmZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZSkgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVybiwgJGxpbmUpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZFZlbmRvcklnbm9yZShzdHJpbmcgJGlnbm9yZUZpbGUsIHN0cmluZyAkdmVuZG9yID0gJy92ZW5kb3IvJyk6IHZvaWQKewokY29udGVudHMgPSAiIjsKaWYgKGZpbGVfZXhpc3RzKCRpZ25vcmVGaWxlKSkgewokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkaWdub3JlRmlsZSk7CgppZiAoc3RycG9zKCRjb250ZW50cywgIlxuIikgIT09IDApIHsKJGNvbnRlbnRzIC49ICJcbiI7Cn0KfQoKZmlsZV9wdXRfY29udGVudHMoJGlnbm9yZUZpbGUsICRjb250ZW50cyAuICR2ZW5kb3IuICJcbiIpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaXNWYWxpZEVtYWlsKHN0cmluZyAkZW1haWwpOiBib29sCnsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdmaWx0ZXJfdmFyJykpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZSAhPT0gZmlsdGVyX3ZhcigkZW1haWwsIEZJTFRFUl9WQUxJREFURV9FTUFJTCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlRGVwZW5kZW5jaWVzKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnRyeSB7CiR1cGRhdGVDb21tYW5kID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJ3VwZGF0ZScpOwokdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cmVzZXRDb21wb3NlcigpOwokdXBkYXRlQ29tbWFuZC0+cnVuKG5ldyBBcnJheUlucHV0KFtdKSwgJG91dHB1dCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ0NvdWxkIG5vdCB1cGRhdGUgZGVwZW5kZW5jaWVzLiBSdW4gYGNvbXBvc2VyIHVwZGF0ZWAgdG8gc2VlIG1vcmUgaW5mb3JtYXRpb24uJyk7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBydW5EdW1wQXV0b2xvYWRDb21tYW5kKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CnRyeSB7CiRjb21tYW5kID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJ2R1bXAtYXV0b2xvYWQnKTsKJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPnJlc2V0Q29tcG9zZXIoKTsKJGNvbW1hbmQtPnJ1bihuZXcgQXJyYXlJbnB1dChbXSksICRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5nZXRJTygpLT53cml0ZUVycm9yKCdDb3VsZCBub3QgcnVuIGR1bXAtYXV0b2xvYWQuJyk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBoYXNEZXBlbmRlbmNpZXMoYXJyYXkgJG9wdGlvbnMpOiBib29sCnsKJHJlcXVpcmVzID0gKGFycmF5KSAkb3B0aW9uc1sncmVxdWlyZSddOwokZGV2UmVxdWlyZXMgPSBpc3NldCgkb3B0aW9uc1sncmVxdWlyZS1kZXYnXSkgPyAoYXJyYXkpICRvcHRpb25zWydyZXF1aXJlLWRldiddIDogW107CgpyZXR1cm4gIWVtcHR5KCRyZXF1aXJlcykgfHwgIWVtcHR5KCRkZXZSZXF1aXJlcyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2FuaXRpemVQYWNrYWdlTmFtZUNvbXBvbmVudChzdHJpbmcgJG5hbWUpOiBzdHJpbmcKewokbmFtZSA9IFByZWc6OnJlcGxhY2UoJ3soPzooW2Etel0pKFtBLVpdKXwoW0EtWl0pKFtBLVpdW2Etel0pKX0nLCAnXFwxXFwzLVxcMlxcNCcsICRuYW1lKTsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRuYW1lKTsKJG5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7XltfLi1dK3xbXy4tXSskfFteYS16MC05Xy4tXX11JywgJycsICRuYW1lKTsKJG5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7KFtfLi1dKXsyLH19dScsICckMScsICRuYW1lKTsKCnJldHVybiAkbmFtZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0UGFja2FnZU5hbWUoKTogc3RyaW5nCnsKJGdpdCA9ICR0aGlzLT5nZXRHaXRDb25maWcoKTsKJGN3ZCA9IHJlYWxwYXRoKCIuIik7CiRuYW1lID0gYmFzZW5hbWUoJGN3ZCk7CiRuYW1lID0gJHRoaXMtPnNhbml0aXplUGFja2FnZU5hbWVDb21wb25lbnQoJG5hbWUpOwoKJHZlbmRvciA9ICRuYW1lOwppZiAoIWVtcHR5KCRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX1ZFTkRPUiddKSkgewokdmVuZG9yID0gJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfVkVORE9SJ107Cn0gZWxzZWlmIChpc3NldCgkZ2l0WydnaXRodWIudXNlciddKSkgewokdmVuZG9yID0gJGdpdFsnZ2l0aHViLnVzZXInXTsKfSBlbHNlaWYgKCFlbXB0eSgkX1NFUlZFUlsnVVNFUk5BTUUnXSkpIHsKJHZlbmRvciA9ICRfU0VSVkVSWydVU0VSTkFNRSddOwp9IGVsc2VpZiAoIWVtcHR5KCRfU0VSVkVSWydVU0VSJ10pKSB7CiR2ZW5kb3IgPSAkX1NFUlZFUlsnVVNFUiddOwp9IGVsc2VpZiAoZ2V0X2N1cnJlbnRfdXNlcigpKSB7CiR2ZW5kb3IgPSBnZXRfY3VycmVudF91c2VyKCk7Cn0KCiR2ZW5kb3IgPSAkdGhpcy0+c2FuaXRpemVQYWNrYWdlTmFtZUNvbXBvbmVudCgkdmVuZG9yKTsKCnJldHVybiAkdmVuZG9yIC4gJy8nIC4gJG5hbWU7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdEF1dGhvcigpOiA/c3RyaW5nCnsKJGdpdCA9ICR0aGlzLT5nZXRHaXRDb25maWcoKTsKCmlmICghZW1wdHkoJF9TRVJWRVJbJ0NPTVBPU0VSX0RFRkFVTFRfQVVUSE9SJ10pKSB7CiRhdXRob3JfbmFtZSA9ICRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0FVVEhPUiddOwp9IGVsc2VpZiAoaXNzZXQoJGdpdFsndXNlci5uYW1lJ10pKSB7CiRhdXRob3JfbmFtZSA9ICRnaXRbJ3VzZXIubmFtZSddOwp9CgppZiAoIWVtcHR5KCRfU0VSVkVSWydDT01QT1NFUl9ERUZBVUxUX0VNQUlMJ10pKSB7CiRhdXRob3JfZW1haWwgPSAkX1NFUlZFUlsnQ09NUE9TRVJfREVGQVVMVF9FTUFJTCddOwp9IGVsc2VpZiAoaXNzZXQoJGdpdFsndXNlci5lbWFpbCddKSkgewokYXV0aG9yX2VtYWlsID0gJGdpdFsndXNlci5lbWFpbCddOwp9CgppZiAoaXNzZXQoJGF1dGhvcl9uYW1lLCAkYXV0aG9yX2VtYWlsKSkgewpyZXR1cm4gc3ByaW50ZignJXMgPCVzPicsICRhdXRob3JfbmFtZSwgJGF1dGhvcl9lbWFpbCk7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgoKY2xhc3MgSW5zdGFsbENvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2luc3RhbGwnKQotPnNldEFsaWFzZXMoWydpJ10pCi0+c2V0RGVzY3JpcHRpb24oJ0luc3RhbGxzIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2llcyBmcm9tIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgaWYgcHJlc2VudCwgb3IgZmFsbHMgYmFjayBvbiB0aGUgY29tcG9zZXIuanNvbicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXNvdXJjZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2Ugc291cmNlcyB3aGVuIHBvc3NpYmxlLCBpbmNsdWRpbmcgVkNTIGluZm9ybWF0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1kaXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0IChkZWZhdWx0IGJlaGF2aW9yKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItaW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3R8c291cmNlfGF1dG8gKGF1dG8gY2hvb3NlcyBzb3VyY2UgZm9yIGRldiB2ZXJzaW9ucywgZGlzdCBmb3IgdGhlIHJlc3QpLicsIG51bGwsICR0aGlzLT5zdWdnZXN0UHJlZmVySW5zdGFsbCgpKSwKbmV3IElucHV0T3B0aW9uKCdkcnktcnVuJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPdXRwdXRzIHRoZSBvcGVyYXRpb25zIGJ1dCB3aWxsIG5vdCBleGVjdXRlIGFueXRoaW5nIChpbXBsaWNpdGx5IGVuYWJsZXMgLS12ZXJib3NlKS4nKSwKbmV3IElucHV0T3B0aW9uKCdkb3dubG9hZC1vbmx5JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEb3dubG9hZCBvbmx5LCBkbyBub3QgaW5zdGFsbCBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IEVuYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzIChlbmFibGVkIGJ5IGRlZmF1bHQsIG9ubHkgcHJlc2VudCBmb3IgQkMpLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXN1Z2dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RFUFJFQ0FURUQ6IFRoaXMgZmxhZyBkb2VzIG5vdCBleGlzdCBhbnltb3JlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgaW5zdGFsbGF0aW9uIG9mIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXNlY3VyaXR5LWJsb2NraW5nJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGxvd3MgaW5zdGFsbGluZyBwYWNrYWdlcyB3aXRoIHNlY3VyaXR5IGFkdmlzb3JpZXMgb3IgdGhhdCBhcmUgYWJhbmRvbmVkIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9OT19TRUNVUklUWV9CTE9DS0lORz0xIGVudiB2YXIpLiBPbmx5IGFwcGxpZXMgd2hlbiBubyBsb2NrIGZpbGUgaXMgcHJlc2VudC4nKSwKbmV3IElucHV0T3B0aW9uKCduby1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwcyBhdXRvbG9hZGVyIGdlbmVyYXRpb24nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCduby1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgdXNlLCBvbmx5IGRlZmluZWQgaGVyZSB0byBjYXRjaCBtaXN1c2Ugb2YgdGhlIGluc3RhbGwgY29tbWFuZC4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUnVuIGFuIGF1ZGl0IGFmdGVyIGluc3RhbGxhdGlvbiBpcyBjb21wbGV0ZS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCd2ZXJib3NlJywgJ3Z8dnZ8dnZ2JywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93cyBtb3JlIGRldGFpbHMgaW5jbHVkaW5nIG5ldyBjb21taXRzIHB1bGxlZCBpbiB3aGVuIHVwZGF0aW5nIHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemUgYXV0b2xvYWRlciBkdXJpbmcgYXV0b2xvYWRlciBkdW1wJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZS1hdXRvbG9hZGVyYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1LWF1dG9sb2FkZXInKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdTaG91bGQgbm90IGJlIHByb3ZpZGVkLCB1c2UgY29tcG9zZXIgcmVxdWlyZSBpbnN0ZWFkIHRvIGFkZCBhIGdpdmVuIHBhY2thZ2UgdG8gY29tcG9zZXIuanNvbi4nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPmluc3RhbGw8L2luZm8+IGNvbW1hbmQgcmVhZHMgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSBmcm9tCnRoZSBjdXJyZW50IGRpcmVjdG9yeSwgcHJvY2Vzc2VzIGl0LCBhbmQgZG93bmxvYWRzIGFuZCBpbnN0YWxscyBhbGwgdGhlCmxpYnJhcmllcyBhbmQgZGVwZW5kZW5jaWVzIG91dGxpbmVkIGluIHRoYXQgZmlsZS4gSWYgdGhlIGZpbGUgZG9lcyBub3QKZXhpc3QgaXQgd2lsbCBsb29rIGZvciBjb21wb3Nlci5qc29uIGFuZCBkbyB0aGUgc2FtZS4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIGluc3RhbGw8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNpbnN0YWxsLWkKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1kZXYiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tc3VnZ2VzdCcpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tbm8tc3VnZ2VzdCIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KCiRhcmdzID0gJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKTsKaWYgKGNvdW50KCRhcmdzKSA+IDApIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBhcmd1bWVudCAnLmltcGxvZGUoJyAnLCAkYXJncykuJy4gVXNlICJjb21wb3NlciByZXF1aXJlICcuaW1wbG9kZSgnICcsICRhcmdzKS4nIiBpbnN0ZWFkIHRvIGFkZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24uPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWluc3RhbGwnKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JbnZhbGlkIG9wdGlvbiAiLS1uby1pbnN0YWxsIi4gVXNlICJjb21wb3NlciB1cGRhdGUgLS1uby1pbnN0YWxsIiBpbnN0ZWFkIGlmIHlvdSBhcmUgdHJ5aW5nIHRvIHVwZGF0ZSB0aGUgY29tcG9zZXIubG9jayBmaWxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKaWYgKCEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpICYmICFIdHRwRG93bmxvYWRlcjo6aXNDdXJsRW5hYmxlZCgpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q29tcG9zZXIgaXMgb3BlcmF0aW5nIHNpZ25pZmljYW50bHkgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2UgeW91IGRvIG5vdCBoYXZlIHRoZSBQSFAgY3VybCBleHRlbnNpb24gZW5hYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ2luc3RhbGwnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGluc3RhbGwgPSBJbnN0YWxsZXI6OmNyZWF0ZSgkaW8sICRjb21wb3Nlcik7CgokY29uZmlnID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKTsKWyRwcmVmZXJTb3VyY2UsICRwcmVmZXJEaXN0XSA9ICR0aGlzLT5nZXRQcmVmZXJyZWRJbnN0YWxsT3B0aW9ucygkY29uZmlnLCAkaW5wdXQpOwoKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb25maWctPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CgokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0RG93bmxvYWRPbmx5KCRpbnB1dC0+Z2V0T3B0aW9uKCdkb3dubG9hZC1vbmx5JykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKQotPnNldER1bXBBdXRvbG9hZGVyKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0QXVkaXRDb25maWcoJHRoaXMtPmNyZWF0ZUF1ZGl0Q29uZmlnKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRpbnB1dCkpCi0+c2V0RXJyb3JPbkF1ZGl0KCRpbnB1dC0+Z2V0T3B0aW9uKCdhdWRpdCcpKQo7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokaW5zdGFsbC0+ZGlzYWJsZVBsdWdpbnMoKTsKfQoKcmV0dXJuICRpbnN0YWxsLT5ydW4oKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVV0aWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlSW5mbzsKdXNlIENvbXBvc2VyXFV0aWxcUGFja2FnZVNvcnRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGVcU3ltZm9ueVN0eWxlOwoKCgoKY2xhc3MgTGljZW5zZXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ2xpY2Vuc2VzJykKLT5zZXREZXNjcmlwdGlvbignU2hvd3MgaW5mb3JtYXRpb24gYWJvdXQgbGljZW5zZXMgb2YgZGVwZW5kZW5jaWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0LCBqc29uIG9yIHN1bW1hcnknLCAndGV4dCcsIFsndGV4dCcsICdqc29uJywgJ3N1bW1hcnknXSksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBzZWFyY2ggaW4gcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93cyBsaWNlbnNlcyBmcm9tIHRoZSBsb2NrIGZpbGUgaW5zdGVhZCBvZiBpbnN0YWxsZWQgcGFja2FnZXMuJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSBsaWNlbnNlIGNvbW1hbmQgZGlzcGxheXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxpY2Vuc2VzIG9mCnRoZSBpbnN0YWxsZWQgZGVwZW5kZW5jaWVzLgoKVXNlIC0tbG9ja2VkIHRvIHNob3cgbGljZW5zZXMgZnJvbSBjb21wb3Nlci5sb2NrIGluc3RlYWQgb2Ygd2hhdCdzIGN1cnJlbnRseQppbnN0YWxsZWQgaW4gdGhlIHZlbmRvciBkaXJlY3RvcnkuCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNsaWNlbnNlcwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdsaWNlbnNlcycsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7Cgokcm9vdCA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsb2NrZWQnKSkgewppZiAoISRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1ZhbGlkIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2sgZmlsZXMgYXJlIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLWxvY2tlZCcpOwp9CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwokcmVwbyA9ICRsb2NrZXItPmdldExvY2tlZFJlcG9zaXRvcnkoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSk7CiRwYWNrYWdlcyA9ICRyZXBvLT5nZXRQYWNrYWdlcygpOwp9IGVsc2UgewokcmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRwYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlsczo6ZmlsdGVyUmVxdWlyZWRQYWNrYWdlcygkcmVwby0+Z2V0UGFja2FnZXMoKSwgJHJvb3QpOwp9IGVsc2UgewokcGFja2FnZXMgPSAkcmVwby0+Z2V0UGFja2FnZXMoKTsKfQp9CgokcGFja2FnZXMgPSBQYWNrYWdlU29ydGVyOjpzb3J0UGFja2FnZXNBbHBoYWJldGljYWxseSgkcGFja2FnZXMpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCnN3aXRjaCAoJGZvcm1hdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKSkgewpjYXNlICd0ZXh0JzoKJGlvLT53cml0ZSgnTmFtZTogPGNvbW1lbnQ+Jy4kcm9vdC0+Z2V0UHJldHR5TmFtZSgpLic8L2NvbW1lbnQ+Jyk7CiRpby0+d3JpdGUoJ1ZlcnNpb246IDxjb21tZW50PicuJHJvb3QtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4nKTsKJGlvLT53cml0ZSgnTGljZW5zZXM6IDxjb21tZW50PicuKGltcGxvZGUoJywgJywgJHJvb3QtPmdldExpY2Vuc2UoKSkgPzogJ25vbmUnKS4nPC9jb21tZW50PicpOwokaW8tPndyaXRlKCdEZXBlbmRlbmNpZXM6Jyk7CiRpby0+d3JpdGUoJycpOwoKJHRhYmxlID0gbmV3IFRhYmxlKCRvdXRwdXQpOwokdGFibGUtPnNldFN0eWxlKCdjb21wYWN0Jyk7CiR0YWJsZS0+c2V0SGVhZGVycyhbJ05hbWUnLCAnVmVyc2lvbicsICdMaWNlbnNlcyddKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaW5rID0gUGFja2FnZUluZm86OmdldFZpZXdTb3VyY2VPckhvbWVwYWdlVXJsKCRwYWNrYWdlKTsKaWYgKCRsaW5rICE9PSBudWxsKSB7CiRuYW1lID0gJzxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGxpbmspLic+Jy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8Lz4nOwp9IGVsc2UgewokbmFtZSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7Cn0KCiR0YWJsZS0+YWRkUm93KFsKJG5hbWUsCiRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLAppbXBsb2RlKCcsICcsICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldExpY2Vuc2UoKSA6IFtdKSA/OiAnbm9uZScsCl0pOwp9CiR0YWJsZS0+cmVuZGVyKCk7CmJyZWFrOwoKY2FzZSAnanNvbic6CiRkZXBlbmRlbmNpZXMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRkZXBlbmRlbmNpZXNbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV0gPSBbCid2ZXJzaW9uJyA9PiAkcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSwKJ2xpY2Vuc2UnID0+ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldExpY2Vuc2UoKSA6IFtdLApdOwp9CgokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoWwonbmFtZScgPT4gJHJvb3QtPmdldFByZXR0eU5hbWUoKSwKJ3ZlcnNpb24nID0+ICRyb290LT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLAonbGljZW5zZScgPT4gJHJvb3QtPmdldExpY2Vuc2UoKSwKJ2RlcGVuZGVuY2llcycgPT4gJGRlcGVuZGVuY2llcywKXSkpOwpicmVhazsKCmNhc2UgJ3N1bW1hcnknOgokdXNlZExpY2Vuc2VzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGljZW5zZXMgPSAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXRMaWNlbnNlKCkgOiBbXTsKaWYgKGNvdW50KCRsaWNlbnNlcykgPT09IDApIHsKJGxpY2Vuc2VzW10gPSAnbm9uZSc7Cn0KZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRsaWNlbnNlTmFtZSkgewppZiAoIWlzc2V0KCR1c2VkTGljZW5zZXNbJGxpY2Vuc2VOYW1lXSkpIHsKJHVzZWRMaWNlbnNlc1skbGljZW5zZU5hbWVdID0gMDsKfQokdXNlZExpY2Vuc2VzWyRsaWNlbnNlTmFtZV0rKzsKfQp9CgoKYXJzb3J0KCR1c2VkTGljZW5zZXMsIFNPUlRfTlVNRVJJQyk7Cgokcm93cyA9IFtdOwpmb3JlYWNoICgkdXNlZExpY2Vuc2VzIGFzICR1c2VkTGljZW5zZSA9PiAkbnVtYmVyT2ZEZXBlbmRlbmNpZXMpIHsKJHJvd3NbXSA9IFskdXNlZExpY2Vuc2UsICRudW1iZXJPZkRlcGVuZGVuY2llc107Cn0KCiRzeW1mb255SW8gPSBuZXcgU3ltZm9ueVN0eWxlKCRpbnB1dCwgJG91dHB1dCk7CiRzeW1mb255SW8tPnRhYmxlKApbJ0xpY2Vuc2UnLCAnTnVtYmVyIG9mIGRlcGVuZGVuY2llcyddLAokcm93cwopOwpicmVhazsKZGVmYXVsdDoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGZvcm1hdCAiJXMiLiAgU2VlIGhlbHAgZm9yIHN1cHBvcnRlZCBmb3JtYXRzLicsICRmb3JtYXQpKTsKfQoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcnJheUlucHV0Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmNsYXNzIE91dGRhdGVkQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgnb3V0ZGF0ZWQnKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBhIGxpc3Qgb2YgaW5zdGFsbGVkIHBhY2thZ2VzIHRoYXQgaGF2ZSB1cGRhdGVzIGF2YWlsYWJsZSwgaW5jbHVkaW5nIHRoZWlyIGxhdGVzdCB2ZXJzaW9uJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2UnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1BhY2thZ2UgdG8gaW5zcGVjdC4gT3IgYSBuYW1lIGluY2x1ZGluZyBhIHdpbGRjYXJkICgqKSB0byBmaWx0ZXIgbGlzdHMgb2YgcGFja2FnZXMgaW5zdGVhZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKSwKbmV3IElucHV0T3B0aW9uKCdvdXRkYXRlZCcsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBhcmUgb3V0ZGF0ZWQgKHRoaXMgaXMgdGhlIGRlZmF1bHQsIGJ1dCBwcmVzZW50IGhlcmUgZm9yIGNvbXBhdCB3aXRoIGBzaG93YCcpLApuZXcgSW5wdXRPcHRpb24oJ2FsbCcsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IGFsbCBpbnN0YWxsZWQgcGFja2FnZXMgd2l0aCB0aGVpciBsYXRlc3QgdmVyc2lvbnMnKSwKbmV3IElucHV0T3B0aW9uKCdsb2NrZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3dzIHVwZGF0ZXMgZm9yIHBhY2thZ2VzIGZyb20gdGhlIGxvY2sgZmlsZSwgcmVnYXJkbGVzcyBvZiB3aGF0IGlzIGN1cnJlbnRseSBpbiB2ZW5kb3IgZGlyJyksCm5ldyBJbnB1dE9wdGlvbignZGlyZWN0JywgJ0QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3dzIG9ubHkgcGFja2FnZXMgdGhhdCBhcmUgZGlyZWN0bHkgcmVxdWlyZWQgYnkgdGhlIHJvb3QgcGFja2FnZScpLApuZXcgSW5wdXRPcHRpb24oJ3N0cmljdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlIHdoZW4gdGhlcmUgYXJlIG91dGRhdGVkIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignbWFqb3Itb25seScsICdNJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIG1ham9yIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuJyksCm5ldyBJbnB1dE9wdGlvbignbWlub3Itb25seScsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIG1pbm9yIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuJyksCm5ldyBJbnB1dE9wdGlvbigncGF0Y2gtb25seScsICdwJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIHBhdGNoIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuJyksCm5ldyBJbnB1dE9wdGlvbignc29ydC1ieS1hZ2UnLCAnQScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzcGxheXMgdGhlIGluc3RhbGxlZCB2ZXJzaW9uXCdzIGFnZSwgYW5kIHNvcnRzIHBhY2thZ2VzIG9sZGVzdCBmaXJzdC4nKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0IG9yIGpzb24nLCAndGV4dCcsIFsnanNvbicsICd0ZXh0J10pLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBzcGVjaWZpZWQgcGFja2FnZShzKS4gQ2FuIGNvbnRhaW4gd2lsZGNhcmRzICgqKS4gVXNlIGl0IGlmIHlvdSBkb25cJ3Qgd2FudCB0byBiZSBpbmZvcm1lZCBhYm91dCBuZXcgdmVyc2lvbnMgb2Ygc29tZSBwYWNrYWdlcy4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKSwKbmV3IElucHV0T3B0aW9uKCduby1kZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc2FibGVzIHNlYXJjaCBpbiByZXF1aXJlLWRldiBwYWNrYWdlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLiBVc2Ugd2l0aCB0aGUgLS1vdXRkYXRlZCBvcHRpb24nKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIG91dGRhdGVkIGNvbW1hbmQgaXMganVzdCBhIHByb3h5IGZvciBgY29tcG9zZXIgc2hvdyAtbGAKClRoZSBjb2xvciBjb2RpbmcgKG9yIHNpZ25hZ2UgaWYgeW91IGhhdmUgQU5TSSBjb2xvcnMgZGlzYWJsZWQpIGZvciBkZXBlbmRlbmN5IHZlcnNpb25zIGlzIGFzIHN1Y2g6CgotIDxpbmZvPmdyZWVuPC9pbmZvPiAoPSk6IERlcGVuZGVuY3kgaXMgaW4gdGhlIGxhdGVzdCB2ZXJzaW9uIGFuZCBpcyB1cCB0byBkYXRlLgotIDxjb21tZW50PnllbGxvdzwvY29tbWVudD4gKH4pOiBEZXBlbmRlbmN5IGhhcyBhIG5ldyB2ZXJzaW9uIGF2YWlsYWJsZSB0aGF0IGluY2x1ZGVzIGJhY2t3YXJkcwogIGNvbXBhdGliaWxpdHkgYnJlYWtzIGFjY29yZGluZyB0byBzZW12ZXIsIHNvIHVwZ3JhZGUgd2hlbiB5b3UgY2FuIGJ1dCBpdAogIG1heSBpbnZvbHZlIHdvcmsuCi0gPGhpZ2hsaWdodD5yZWQ8L2hpZ2hsaWdodD4gKCEpOiBEZXBlbmRlbmN5IGhhcyBhIG5ldyB2ZXJzaW9uIHRoYXQgaXMgc2VtdmVyLWNvbXBhdGlibGUgYW5kIHlvdSBzaG91bGQgdXBncmFkZSBpdC4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI291dGRhdGVkCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRhcmdzID0gWwonY29tbWFuZCcgPT4gJ3Nob3cnLAonLS1sYXRlc3QnID0+IHRydWUsCl07CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8taW50ZXJhY3Rpb24nKSkgewokYXJnc1snLS1uby1pbnRlcmFjdGlvbiddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokYXJnc1snLS1uby1wbHVnaW5zJ10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tc2NyaXB0cycpKSB7CiRhcmdzWyctLW5vLXNjcmlwdHMnXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1jYWNoZScpKSB7CiRhcmdzWyctLW5vLWNhY2hlJ10gPSB0cnVlOwp9CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CiRhcmdzWyctLW91dGRhdGVkJ10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykpIHsKJGFyZ3NbJy0tZGlyZWN0J10gPSB0cnVlOwp9CmlmIChudWxsICE9PSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlJykpIHsKJGFyZ3NbJ3BhY2thZ2UnXSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpKSB7CiRhcmdzWyctLXN0cmljdCddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ21ham9yLW9ubHknKSkgewokYXJnc1snLS1tYWpvci1vbmx5J10gPSB0cnVlOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbWlub3Itb25seScpKSB7CiRhcmdzWyctLW1pbm9yLW9ubHknXSA9IHRydWU7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRjaC1vbmx5JykpIHsKJGFyZ3NbJy0tcGF0Y2gtb25seSddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRhcmdzWyctLWxvY2tlZCddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRhcmdzWyctLW5vLWRldiddID0gdHJ1ZTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3NvcnQtYnktYWdlJykpIHsKJGFyZ3NbJy0tc29ydC1ieS1hZ2UnXSA9IHRydWU7Cn0KJGFyZ3NbJy0taWdub3JlLXBsYXRmb3JtLXJlcSddID0gJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycpKSB7CiRhcmdzWyctLWlnbm9yZS1wbGF0Zm9ybS1yZXFzJ10gPSB0cnVlOwp9CiRhcmdzWyctLWZvcm1hdCddID0gJGlucHV0LT5nZXRPcHRpb24oJ2Zvcm1hdCcpOwokYXJnc1snLS1pZ25vcmUnXSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdpZ25vcmUnKTsKCiRpbnB1dCA9IG5ldyBBcnJheUlucHV0KCRhcmdzKTsKCnJldHVybiAkdGhpcy0+Z2V0QXBwbGljYXRpb24oKS0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Byb3h5Q29tbWFuZCgpOiBib29sCnsKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUZhY3Rvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCnRyYWl0IFBhY2thZ2VEaXNjb3ZlcnlUcmFpdAp7Cgpwcml2YXRlICRyZXBvczsKCnByaXZhdGUgJHJlcG9zaXRvcnlTZXRzOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJlcG9zKCk6IENvbXBvc2l0ZVJlcG9zaXRvcnkKewppZiAobnVsbCA9PT0gJHRoaXMtPnJlcG9zKSB7CiR0aGlzLT5yZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKApbbmV3IFBsYXRmb3JtUmVwb3NpdG9yeV0sClJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJHRoaXMtPmdldElPKCkpCikpOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG9zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnlTZXQoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCA/c3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5ID0gbnVsbCk6IFJlcG9zaXRvcnlTZXQKewoka2V5ID0gJG1pbmltdW1TdGFiaWxpdHkgPz8gJ2RlZmF1bHQnOwoKaWYgKCFpc3NldCgkdGhpcy0+cmVwb3NpdG9yeVNldHNbJGtleV0pKSB7CiR0aGlzLT5yZXBvc2l0b3J5U2V0c1ska2V5XSA9ICRyZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJG1pbmltdW1TdGFiaWxpdHkgPz8gJHRoaXMtPmdldE1pbmltdW1TdGFiaWxpdHkoJGlucHV0KSk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCR0aGlzLT5nZXRSZXBvcygpKTsKfQoKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3J5U2V0c1ska2V5XTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KElucHV0SW50ZXJmYWNlICRpbnB1dCk6IHN0cmluZwp7CmlmICgkaW5wdXQtPmhhc09wdGlvbignc3RhYmlsaXR5JykpIHsgCnJldHVybiBWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJGlucHV0LT5nZXRPcHRpb24oJ3N0YWJpbGl0eScpID8/ICdzdGFibGUnKTsKfQoKCiRmaWxlID0gRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCk7CmlmIChpc19maWxlKCRmaWxlKSAmJiBGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRmaWxlKSAmJiBpc19hcnJheSgkY29tcG9zZXIgPSBqc29uX2RlY29kZSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkZmlsZSksIHRydWUpKSkgewppZiAoaXNzZXQoJGNvbXBvc2VyWydtaW5pbXVtLXN0YWJpbGl0eSddKSkgewpyZXR1cm4gVmVyc2lvblBhcnNlcjo6bm9ybWFsaXplU3RhYmlsaXR5KCRjb21wb3NlclsnbWluaW11bS1zdGFiaWxpdHknXSk7Cn0KfQoKcmV0dXJuICdzdGFibGUnOwp9CgoKCgoKCgpmaW5hbCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGV0ZXJtaW5lUmVxdWlyZW1lbnRzKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGFycmF5ICRyZXF1aXJlcyA9IFtdLCA/UGxhdGZvcm1SZXBvc2l0b3J5ICRwbGF0Zm9ybVJlcG8gPSBudWxsLCBzdHJpbmcgJHByZWZlcnJlZFN0YWJpbGl0eSA9ICdzdGFibGUnLCBib29sICR1c2VCZXN0VmVyc2lvbkNvbnN0cmFpbnQgPSB0cnVlLCBib29sICRmaXhlZCA9IGZhbHNlKTogYXJyYXkKewppZiAoY291bnQoJHJlcXVpcmVzKSA+IDApIHsKJHJlcXVpcmVzID0gJHRoaXMtPm5vcm1hbGl6ZVJlcXVpcmVtZW50cygkcmVxdWlyZXMpOwokcmVzdWx0ID0gW107CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlbWVudCkgewppZiAoaXNzZXQoJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10pICYmIFByZWc6OmlzTWF0Y2goJ3teXGQrKFwuXGQrKT8kfScsICRyZXF1aXJlbWVudFsndmVyc2lvbiddKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJy4kcmVxdWlyZW1lbnRbJ3ZlcnNpb24nXS4nIiBjb25zdHJhaW50IGZvciAiJy4kcmVxdWlyZW1lbnRbJ25hbWUnXS4nIiBhcHBlYXJzIHRvbyBzdHJpY3QgYW5kIHdpbGwgbGlrZWx5IG5vdCBtYXRjaCB3aGF0IHlvdSB3YW50LiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvY29uc3RyYWludHM8L3dhcm5pbmc+Jyk7Cn0KCmlmICghaXNzZXQoJHJlcXVpcmVtZW50Wyd2ZXJzaW9uJ10pKSB7CgpbJG5hbWUsICR2ZXJzaW9uXSA9ICR0aGlzLT5maW5kQmVzdFZlcnNpb25BbmROYW1lRm9yUGFja2FnZSgkdGhpcy0+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+c2V0SGVscCgKPDw8RU9UCkRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHdoeSBhIHBhY2thZ2UgY2Fubm90IGJlIGluc3RhbGxlZC4KCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHByb2hpYml0cyBjb21wb3Nlci9jb21wb3NlcjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3Byb2hpYml0cy13aHktbm90CkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CnJldHVybiBwYXJlbnQ6OmRvRXhlY3V0ZSgkaW5wdXQsICRvdXRwdXQsIHRydWUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcVHJhbnNhY3Rpb247CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXFNjcmlwdFxTY3JpcHRFdmVudHM7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBSZWluc3RhbGxDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdyZWluc3RhbGwnKQotPnNldERlc2NyaXB0aW9uKCdVbmluc3RhbGxzIGFuZCByZWluc3RhbGxzIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc291cmNlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBzb3VyY2VzIHdoZW4gcG9zc2libGUsIGluY2x1ZGluZyBWQ1MgaW5mb3JtYXRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWRpc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3QgKGRlZmF1bHQgYmVoYXZpb3IpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdHxzb3VyY2V8YXV0byAoYXV0byBjaG9vc2VzIHNvdXJjZSBmb3IgZGV2IHZlcnNpb25zLCBkaXN0IGZvciB0aGUgcmVzdCkuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQcmVmZXJJbnN0YWxsKCkpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXBzIGF1dG9sb2FkZXIgZ2VuZXJhdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ25vLXByb2dyZXNzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3Qgb3V0cHV0IGRvd25sb2FkIHByb2dyZXNzLicpLApuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemUgYXV0b2xvYWRlciBkdXJpbmcgYXV0b2xvYWRlciBkdW1wJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZS1hdXRvbG9hZGVyYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1LWF1dG9sb2FkZXInKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbigndHlwZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0ZpbHRlciBwYWNrYWdlcyB0byByZWluc3RhbGwgYnkgdHlwZShzKScsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZVR5cGVzKGZhbHNlKSksCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnTGlzdCBvZiBwYWNrYWdlIG5hbWVzIHRvIHJlaW5zdGFsbCwgY2FuIGluY2x1ZGUgYSB3aWxkY2FyZCAoKikgdG8gbWF0Y2ggYW55IHN1YnN0cmluZy4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdEluc3RhbGxlZFBhY2thZ2UoZmFsc2UpKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPnJlaW5zdGFsbDwvaW5mbz4gY29tbWFuZCBsb29rcyB1cCBpbnN0YWxsZWQgcGFja2FnZXMgYnkgbmFtZSwKdW5pbnN0YWxscyB0aGVtIGFuZCByZWluc3RhbGxzIHRoZW0uIFRoaXMgbGV0cyB5b3UgZG8gYSBjbGVhbiBpbnN0YWxsCm9mIGEgcGFja2FnZSBpZiB5b3UgbWVzc2VkIHdpdGggaXRzIGZpbGVzLCBvciBpZiB5b3Ugd2lzaCB0byBjaGFuZ2UKdGhlIGluc3RhbGxhdGlvbiB0eXBlIHVzaW5nIC0tcHJlZmVyLWluc3RhbGwuCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciByZWluc3RhbGwgYWNtZS9mb28gImFjbWUvYmFyLSoiPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcmVpbnN0YWxsCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGxvY2FsUmVwbyA9ICRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRwYWNrYWdlc1RvUmVpbnN0YWxsID0gW107CiRwYWNrYWdlTmFtZXNUb1JlaW5zdGFsbCA9IFtdOwppZiAoXGNvdW50KCRpbnB1dC0+Z2V0T3B0aW9uKCd0eXBlJykpID4gMCkgewppZiAoXGNvdW50KCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykpID4gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignWW91IGNhbm5vdCBzcGVjaWZ5IHBhY2thZ2UgbmFtZXMgYW5kIGZpbHRlciBieSB0eXBlIGF0IHRoZSBzYW1lIHRpbWUuJyk7Cn0KZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldFR5cGUoKSwgJGlucHV0LT5nZXRPcHRpb24oJ3R5cGUnKSwgdHJ1ZSkpIHsKJHBhY2thZ2VzVG9SZWluc3RhbGxbXSA9ICRwYWNrYWdlOwokcGFja2FnZU5hbWVzVG9SZWluc3RhbGxbXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQp9IGVsc2UgewppZiAoXGNvdW50KCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykpID09PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdZb3UgbXVzdCBwYXNzIG9uZSBvciBtb3JlIHBhY2thZ2UgbmFtZXMgdG8gYmUgcmVpbnN0YWxsZWQuJyk7Cn0KZm9yZWFjaCAoJGlucHV0LT5nZXRBcmd1bWVudCgncGFja2FnZXMnKSBhcyAkcGF0dGVybikgewokcGF0dGVyblJlZ2V4cCA9IEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYXR0ZXJuKTsKJG1hdGNoZWQgPSBmYWxzZTsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVyblJlZ2V4cCwgJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKJG1hdGNoZWQgPSB0cnVlOwokcGFja2FnZXNUb1JlaW5zdGFsbFtdID0gJHBhY2thZ2U7CiRwYWNrYWdlTmFtZXNUb1JlaW5zdGFsbFtdID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfQp9CgppZiAoISRtYXRjaGVkKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGF0dGVybiAiJyAuICRwYXR0ZXJuIC4gJyIgZG9lcyBub3QgbWF0Y2ggYW55IGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXMuPC93YXJuaW5nPicpOwp9Cn0KfQoKaWYgKDAgPT09IFxjb3VudCgkcGFja2FnZXNUb1JlaW5zdGFsbCkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Gb3VuZCBubyBwYWNrYWdlcyB0byByZWluc3RhbGwsIGFib3J0aW5nLjwvd2FybmluZz4nKTsKCnJldHVybiAxOwp9CgokdW5pbnN0YWxsT3BlcmF0aW9ucyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXNUb1JlaW5zdGFsbCBhcyAkcGFja2FnZSkgewokdW5pbnN0YWxsT3BlcmF0aW9uc1tdID0gbmV3IFVuaW5zdGFsbE9wZXJhdGlvbigkcGFja2FnZSk7Cn0KCgokcHJlc2VudFBhY2thZ2VzID0gJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKTsKJHJlc3VsdFBhY2thZ2VzID0gJHByZXNlbnRQYWNrYWdlczsKZm9yZWFjaCAoJHByZXNlbnRQYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRwYWNrYWdlTmFtZXNUb1JlaW5zdGFsbCwgdHJ1ZSkpIHsKdW5zZXQoJHByZXNlbnRQYWNrYWdlc1skaW5kZXhdKTsKfQp9CiR0cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigkcHJlc2VudFBhY2thZ2VzLCAkcmVzdWx0UGFja2FnZXMpOwokaW5zdGFsbE9wZXJhdGlvbnMgPSAkdHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKTsKCgokaW5zdGFsbE9yZGVyID0gW107CmZvcmVhY2ggKCRpbnN0YWxsT3BlcmF0aW9ucyBhcyAkaW5kZXggPT4gJG9wKSB7CmlmICgkb3AgaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uICYmICEkb3AtPmdldFBhY2thZ2UoKSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokaW5zdGFsbE9yZGVyWyRvcC0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCldID0gJGluZGV4Owp9Cn0KdXNvcnQoJHVuaW5zdGFsbE9wZXJhdGlvbnMsIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKSB1c2UgKCRpbnN0YWxsT3JkZXIpOiBpbnQgewpyZXR1cm4gJGluc3RhbGxPcmRlclskYi0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCldIC0gJGluc3RhbGxPcmRlclskYS0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCldOwp9KTsKCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3JlaW5zdGFsbCcsICRpbnB1dCwgJG91dHB1dCk7CiRldmVudERpc3BhdGNoZXIgPSAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7ClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0KTsKCiRpbnN0YWxsYXRpb25NYW5hZ2VyID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCk7CiRkb3dubG9hZE1hbmFnZXIgPSAkY29tcG9zZXItPmdldERvd25sb2FkTWFuYWdlcigpOwokcGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwoKJGluc3RhbGxhdGlvbk1hbmFnZXItPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tcGx1Z2lucycpKSB7CiRpbnN0YWxsYXRpb25NYW5hZ2VyLT5kaXNhYmxlUGx1Z2lucygpOwp9CgokZG93bmxvYWRNYW5hZ2VyLT5zZXRQcmVmZXJTb3VyY2UoJHByZWZlclNvdXJjZSk7CiRkb3dubG9hZE1hbmFnZXItPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpOwoKJGRldk1vZGUgPSAkbG9jYWxSZXBvLT5nZXREZXZNb2RlKCkgIT09IG51bGwgPyAkbG9jYWxSZXBvLT5nZXREZXZNb2RlKCkgOiB0cnVlOwoKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfREVWX01PREUnLCAkZGV2TW9kZSA/ICcxJyA6ICcwJyk7CiRldmVudERpc3BhdGNoZXItPmRpc3BhdGNoU2NyaXB0KFNjcmlwdEV2ZW50czo6UFJFX0lOU1RBTExfQ01ELCAkZGV2TW9kZSk7CgokaW5zdGFsbGF0aW9uTWFuYWdlci0+ZXhlY3V0ZSgkbG9jYWxSZXBvLCAkdW5pbnN0YWxsT3BlcmF0aW9ucywgJGRldk1vZGUpOwokaW5zdGFsbGF0aW9uTWFuYWdlci0+ZXhlY3V0ZSgkbG9jYWxSZXBvLCAkaW5zdGFsbE9wZXJhdGlvbnMsICRkZXZNb2RlKTsKCmlmICghJGlucHV0LT5nZXRPcHRpb24oJ25vLWF1dG9sb2FkZXInKSkgewokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb25maWctPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbmZpZy0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKCiRnZW5lcmF0b3IgPSAkY29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCk7CiRnZW5lcmF0b3ItPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkYXV0aG9yaXRhdGl2ZSk7CiRnZW5lcmF0b3ItPnNldEFwY3UoJGFwY3UsICRhcGN1UHJlZml4KTsKJGdlbmVyYXRvci0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKTsKJGdlbmVyYXRvci0+ZHVtcCgKJGNvbmZpZywKJGxvY2FsUmVwbywKJHBhY2thZ2UsCiRpbnN0YWxsYXRpb25NYW5hZ2VyLAonY29tcG9zZXInLAokb3B0aW1pemUsCm51bGwsCiRjb21wb3Nlci0+Z2V0TG9ja2VyKCkKKTsKfQoKJGV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX0lOU1RBTExfQ01ELCAkZGV2TW9kZSk7CgpyZXR1cm4gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXENvbmZpZ1xKc29uQ29uZmlnU291cmNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cQ29tbWFuZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkV2ZW50czsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKCgoKCgpjbGFzcyBSZW1vdmVDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdyZW1vdmUnKQotPnNldEFsaWFzZXMoWydybScsICd1bmluc3RhbGwnXSkKLT5zZXREZXNjcmlwdGlvbignUmVtb3ZlcyBhIHBhY2thZ2UgZnJvbSB0aGUgcmVxdWlyZSBvciByZXF1aXJlLWRldicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdwYWNrYWdlcycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZLCAnUGFja2FnZXMgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJvb3RSZXF1aXJlbWVudCgpKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JlbW92ZXMgYSBwYWNrYWdlIGZyb20gdGhlIHJlcXVpcmUtZGV2IHNlY3Rpb24uJyksCm5ldyBJbnB1dE9wdGlvbignZHJ5LXJ1bicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3V0cHV0cyB0aGUgb3BlcmF0aW9ucyBidXQgd2lsbCBub3QgZXhlY3V0ZSBhbnl0aGluZyAoaW1wbGljaXRseSBlbmFibGVzIC0tdmVyYm9zZSkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tdXBkYXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgYXV0b21hdGljIHVwZGF0ZSBvZiB0aGUgZGVwZW5kZW5jaWVzIChpbXBsaWVzIC0tbm8taW5zdGFsbCkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgaW5zdGFsbCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGF1ZGl0IHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fQVVESVQ9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCduby1zZWN1cml0eS1ibG9ja2luZycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluc3RhbGxpbmcgcGFja2FnZXMgd2l0aCBzZWN1cml0eSBhZHZpc29yaWVzIG9yIHRoYXQgYXJlIGFiYW5kb25lZCAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fU0VDVVJJVFlfQkxPQ0tJTkc9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSdW4gdGhlIGRlcGVuZGVuY3kgdXBkYXRlIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCB3aXRoIGV4cGxpY2l0IGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9ERVBFTkRFTkNJRVM9MSBlbnYgdmFyKS4gKERlcHJlY2F0ZWQsIGlzIG5vdyBkZWZhdWx0IGJlaGF2aW9yKScpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCAnVycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGFsbCBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSByb290IHJlcXVpcmVtZW50cyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9BTExfREVQRU5ERU5DSUVTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBbGlhcyBmb3IgLS11cGRhdGUtd2l0aC1hbGwtZGVwZW5kZW5jaWVzJyksCm5ldyBJbnB1dE9wdGlvbignbm8tdXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEb2VzIG5vdCBhbGxvdyBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQgd2l0aCBleHBsaWNpdCBkZXBlbmRlbmNpZXMuJyksCm5ldyBJbnB1dE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0R1cmluZyBhbiB1cGRhdGUgd2l0aCAtdy8tVywgb25seSBwZXJmb3JtIGFic29sdXRlbHkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX01JTklNQUxfQ0hBTkdFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3VudXNlZCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVtb3ZlIGFsbCBwYWNrYWdlcyB3aGljaCBhcmUgbG9ja2VkIGJ1dCBub3QgcmVxdWlyZWQgYnkgYW55IG90aGVyIHBhY2thZ2UuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCB8IElucHV0T3B0aW9uOjpWQUxVRV9JU19BUlJBWSwgJ0lnbm9yZSBhIHNwZWNpZmljIHBsYXRmb3JtIHJlcXVpcmVtZW50IChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnSWdub3JlIGFsbCBwbGF0Zm9ybSByZXF1aXJlbWVudHMgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInLCAnbycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3B0aW1pemUgYXV0b2xvYWRlciBkdXJpbmcgYXV0b2xvYWRlciBkdW1wJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZS1hdXRvbG9hZGVyYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1LWF1dG9sb2FkZXInKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPnJlbW92ZTwvaW5mbz4gY29tbWFuZCByZW1vdmVzIGEgcGFja2FnZSBmcm9tIHRoZSBjdXJyZW50Cmxpc3Qgb2YgaW5zdGFsbGVkIHBhY2thZ2VzCgo8aW5mbz5waHAgY29tcG9zZXIucGhhciByZW1vdmU8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNyZW1vdmUtcm0KRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykgPT09IFtdICYmICEkaW5wdXQtPmdldE9wdGlvbigndW51c2VkJykpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignTm90IGVub3VnaCBhcmd1bWVudHMgKG1pc3Npbmc6ICJwYWNrYWdlcyIpLicpOwp9CgokcGFja2FnZXMgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpOwokcGFja2FnZXMgPSBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkcGFja2FnZXMpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1bnVzZWQnKSkgewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwppZiAoISRsb2NrZXItPmlzTG9ja2VkKCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0EgdmFsaWQgY29tcG9zZXIubG9jayBmaWxlIGlzIHJlcXVpcmVkIHRvIHJ1biB0aGlzIGNvbW1hbmQgd2l0aCAtLXVudXNlZCcpOwp9CgokbG9ja2VkUGFja2FnZXMgPSAkbG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCk7CgokcmVxdWlyZWQgPSBbXTsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFJlcXVpcmVzKCksICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpKSBhcyAkbGluaykgewokcmVxdWlyZWRbJGxpbmstPmdldFRhcmdldCgpXSA9IHRydWU7Cn0KCmRvIHsKJGZvdW5kID0gZmFsc2U7CmZvcmVhY2ggKCRsb2NrZWRQYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCRyZXF1aXJlZFskbmFtZV0pKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRyZXF1aXJlZFskbGluay0+Z2V0VGFyZ2V0KCldID0gdHJ1ZTsKfQokZm91bmQgPSB0cnVlOwp1bnNldCgkbG9ja2VkUGFja2FnZXNbJGluZGV4XSk7CmJyZWFrOwp9Cn0KfQp9IHdoaWxlICgkZm91bmQpOwoKJHVudXNlZCA9IFtdOwpmb3JlYWNoICgkbG9ja2VkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHVudXNlZFtdID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKfQokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcGFja2FnZXMsICR1bnVzZWQpOwoKaWYgKGNvdW50KCRwYWNrYWdlcykgPT09IDApIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJzxpbmZvPk5vIHVudXNlZCBwYWNrYWdlcyB0byByZW1vdmU8L2luZm8+Jyk7CgpyZXR1cm4gMDsKfQp9CgokZmlsZSA9IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwoKJGpzb25GaWxlID0gbmV3IEpzb25GaWxlKCRmaWxlKTsKCiRjb21wb3NlciA9ICRqc29uRmlsZS0+cmVhZCgpOwokY29tcG9zZXJCYWNrdXAgPSBmaWxlX2dldF9jb250ZW50cygkanNvbkZpbGUtPmdldFBhdGgoKSk7CgokanNvbiA9IG5ldyBKc29uQ29uZmlnU291cmNlKCRqc29uRmlsZSk7CgokdHlwZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICdyZXF1aXJlLWRldicgOiAncmVxdWlyZSc7CiRhbHRUeXBlID0gISRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSA/ICdyZXF1aXJlLWRldicgOiAncmVxdWlyZSc7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICJ1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMiLiBUaGlzIGlzIG5vdyBkZWZhdWx0IGJlaGF2aW91ci4gVGhlIC0tbm8tdXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZW1vdmUgYSBwYWNrYWdlIHdpdGhvdXQgaXRzIGRlcGVuZGVuY2llcy48L3dhcm5pbmc+Jyk7Cn0KCgpmb3JlYWNoIChbJ3JlcXVpcmUnLCAncmVxdWlyZS1kZXYnXSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRjb21wb3NlclskbGlua1R5cGVdKSkgewpmb3JlYWNoICgkY29tcG9zZXJbJGxpbmtUeXBlXSBhcyAkbmFtZSA9PiAkdmVyc2lvbikgewokY29tcG9zZXJbJGxpbmtUeXBlXVtzdHJ0b2xvd2VyKCRuYW1lKV0gPSAkbmFtZTsKfQp9Cn0KCiRkcnlSdW4gPSAkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpOwokdG9SZW1vdmUgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmIChpc3NldCgkY29tcG9zZXJbJHR5cGVdWyRwYWNrYWdlXSkpIHsKaWYgKCRkcnlSdW4pIHsKJHRvUmVtb3ZlWyR0eXBlXVtdID0gJGNvbXBvc2VyWyR0eXBlXVskcGFja2FnZV07Cn0gZWxzZSB7CiRqc29uLT5yZW1vdmVMaW5rKCR0eXBlLCAkY29tcG9zZXJbJHR5cGVdWyRwYWNrYWdlXSk7Cn0KfSBlbHNlaWYgKGlzc2V0KCRjb21wb3NlclskYWx0VHlwZV1bJHBhY2thZ2VdKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicgLiAkY29tcG9zZXJbJGFsdFR5cGVdWyRwYWNrYWdlXSAuICcgY291bGQgbm90IGJlIGZvdW5kIGluICcgLiAkdHlwZSAuICcgYnV0IGl0IGlzIHByZXNlbnQgaW4gJyAuICRhbHRUeXBlIC4gJzwvd2FybmluZz4nKTsKaWYgKCRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICgkaW8tPmFza0NvbmZpcm1hdGlvbignRG8geW91IHdhbnQgdG8gcmVtb3ZlIGl0IGZyb20gJyAuICRhbHRUeXBlIC4gJyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CmlmICgkZHJ5UnVuKSB7CiR0b1JlbW92ZVskYWx0VHlwZV1bXSA9ICRjb21wb3NlclskYWx0VHlwZV1bJHBhY2thZ2VdOwp9IGVsc2UgewokanNvbi0+cmVtb3ZlTGluaygkYWx0VHlwZSwgJGNvbXBvc2VyWyRhbHRUeXBlXVskcGFja2FnZV0pOwp9Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJGNvbXBvc2VyWyR0eXBlXSkgJiYgY291bnQoJG1hdGNoZXMgPSBQcmVnOjpncmVwKEJhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYWNrYWdlKSwgYXJyYXlfa2V5cygkY29tcG9zZXJbJHR5cGVdKSkpID4gMCkgewpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2hlZFBhY2thZ2UpIHsKaWYgKCRkcnlSdW4pIHsKJHRvUmVtb3ZlWyR0eXBlXVtdID0gJG1hdGNoZWRQYWNrYWdlOwp9IGVsc2UgewokanNvbi0+cmVtb3ZlTGluaygkdHlwZSwgJG1hdGNoZWRQYWNrYWdlKTsKfQp9Cn0gZWxzZWlmIChpc3NldCgkY29tcG9zZXJbJGFsdFR5cGVdKSAmJiBjb3VudCgkbWF0Y2hlcyA9IFByZWc6OmdyZXAoQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2UpLCBhcnJheV9rZXlzKCRjb21wb3NlclskYWx0VHlwZV0pKSkgPiAwKSB7CmZvcmVhY2ggKCRtYXRjaGVzIGFzICRtYXRjaGVkUGFja2FnZSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicgLiAkbWF0Y2hlZFBhY2thZ2UgLiAnIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiAnIC4gJHR5cGUgLiAnIGJ1dCBpdCBpcyBwcmVzZW50IGluICcgLiAkYWx0VHlwZSAuICc8L3dhcm5pbmc+Jyk7CmlmICgkaW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoJGlvLT5hc2tDb25maXJtYXRpb24oJ0RvIHlvdSB3YW50IHRvIHJlbW92ZSBpdCBmcm9tICcgLiAkYWx0VHlwZSAuICcgWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnKSkgewppZiAoJGRyeVJ1bikgewokdG9SZW1vdmVbJGFsdFR5cGVdW10gPSAkbWF0Y2hlZFBhY2thZ2U7Cn0gZWxzZSB7CiRqc29uLT5yZW1vdmVMaW5rKCRhbHRUeXBlLCAkbWF0Y2hlZFBhY2thZ2UpOwp9Cn0KfQp9Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kcGFja2FnZS4nIGlzIG5vdCByZXF1aXJlZCBpbiB5b3VyIGNvbXBvc2VyLmpzb24gYW5kIGhhcyBub3QgYmVlbiByZW1vdmVkPC93YXJuaW5nPicpOwp9Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+Jy4kZmlsZS4nIGhhcyBiZWVuIHVwZGF0ZWQ8L2luZm8+Jyk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXVwZGF0ZScpKSB7CnJldHVybiAwOwp9CgppZiAoJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCkpIHsKJGNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmRlYWN0aXZhdGVJbnN0YWxsZWRQbHVnaW5zKCk7Cn0KCgokdGhpcy0+cmVzZXRDb21wb3NlcigpOwokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CgppZiAoJGRyeVJ1bikgewokcm9vdFBhY2thZ2UgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKJGxpbmtzID0gWwoncmVxdWlyZScgPT4gJHJvb3RQYWNrYWdlLT5nZXRSZXF1aXJlcygpLAoncmVxdWlyZS1kZXYnID0+ICRyb290UGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSwKXTsKZm9yZWFjaCAoJHRvUmVtb3ZlIGFzICR0eXBlID0+ICRuYW1lcykgewpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKdW5zZXQoJGxpbmtzWyR0eXBlXVskbmFtZV0pOwp9Cn0KJHJvb3RQYWNrYWdlLT5zZXRSZXF1aXJlcygkbGlua3NbJ3JlcXVpcmUnXSk7CiRyb290UGFja2FnZS0+c2V0RGV2UmVxdWlyZXMoJGxpbmtzWydyZXF1aXJlLWRldiddKTsKfQoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAncmVtb3ZlJywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCiRhbGxvd1BsdWdpbnMgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FsbG93LXBsdWdpbnMnKTsKJHJlbW92ZWRQbHVnaW5zID0gaXNfYXJyYXkoJGFsbG93UGx1Z2lucykgPyBhcnJheV9pbnRlcnNlY3QoYXJyYXlfa2V5cygkYWxsb3dQbHVnaW5zKSwgJHBhY2thZ2VzKSA6IFtdOwppZiAoISRkcnlSdW4gJiYgaXNfYXJyYXkoJGFsbG93UGx1Z2lucykgJiYgY291bnQoJHJlbW92ZWRQbHVnaW5zKSA+IDApIHsKaWYgKGNvdW50KCRhbGxvd1BsdWdpbnMpID09PSBjb3VudCgkcmVtb3ZlZFBsdWdpbnMpKSB7CiRqc29uLT5yZW1vdmVDb25maWdTZXR0aW5nKCdhbGxvdy1wbHVnaW5zJyk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRyZW1vdmVkUGx1Z2lucyBhcyAkcGx1Z2luKSB7CiRqc29uLT5yZW1vdmVDb25maWdTZXR0aW5nKCdhbGxvdy1wbHVnaW5zLicuJHBsdWdpbik7Cn0KfQp9CgokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKCiRpbnN0YWxsID0gSW5zdGFsbGVyOjpjcmVhdGUoJGlvLCAkY29tcG9zZXIpOwoKJHVwZGF0ZURldk1vZGUgPSAhJGlucHV0LT5nZXRPcHRpb24oJ3VwZGF0ZS1uby1kZXYnKTsKJG9wdGltaXplID0gJGlucHV0LT5nZXRPcHRpb24oJ29wdGltaXplLWF1dG9sb2FkZXInKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ29wdGltaXplLWF1dG9sb2FkZXInKTsKJGF1dGhvcml0YXRpdmUgPSAkaW5wdXQtPmdldE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScpOwokYXBjdVByZWZpeCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4Jyk7CiRhcGN1ID0gJGFwY3VQcmVmaXggIT09IG51bGwgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlcicpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYXBjdS1hdXRvbG9hZGVyJyk7CiRtaW5pbWFsQ2hhbmdlcyA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5pbWFsLWNoYW5nZXMnKSB8fCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3VwZGF0ZS13aXRoLW1pbmltYWwtY2hhbmdlcycpOwoKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNfTk9fUk9PVF9SRVFVSVJFOwokZmxhZ3MgPSAnJzsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUtd2l0aC1hbGwtZGVwZW5kZW5jaWVzJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTOwokZmxhZ3MgLj0gJyAtLXdpdGgtYWxsLWRlcGVuZGVuY2llcyc7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tdXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9PTkxZX0xJU1RFRDsKJGZsYWdzIC49ICcgLS13aXRoLWRlcGVuZGVuY2llcyc7Cn0KCiRpby0+d3JpdGVFcnJvcignPGluZm8+UnVubmluZyBjb21wb3NlciB1cGRhdGUgJy5pbXBsb2RlKCcgJywgJHBhY2thZ2VzKS4kZmxhZ3MuJzwvaW5mbz4nKTsKCiRpbnN0YWxsCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldERldk1vZGUoJHVwZGF0ZURldk1vZGUpCi0+c2V0T3B0aW1pemVBdXRvbG9hZGVyKCRvcHRpbWl6ZSkKLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoJGF1dGhvcml0YXRpdmUpCi0+c2V0QXBjdUF1dG9sb2FkZXIoJGFwY3UsICRhcGN1UHJlZml4KQotPnNldFVwZGF0ZSh0cnVlKQotPnNldEluc3RhbGwoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1pbnN0YWxsJykpCi0+c2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMpCi0+c2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkdGhpcy0+Z2V0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkaW5wdXQpKQotPnNldERyeVJ1bigkZHJ5UnVuKQotPnNldEF1ZGl0Q29uZmlnKCR0aGlzLT5jcmVhdGVBdWRpdENvbmZpZygkY29tcG9zZXItPmdldENvbmZpZygpLCAkaW5wdXQpKQotPnNldE1pbmltYWxVcGRhdGUoJG1pbmltYWxDaGFuZ2VzKQo7CgoKCmlmICgkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CiRpbnN0YWxsLT5zZXRVcGRhdGVBbGxvd0xpc3QoJHBhY2thZ2VzKTsKfQoKJHN0YXR1cyA9ICRpbnN0YWxsLT5ydW4oKTsKaWYgKCRzdGF0dXMgIT09IDApIHsKJGlvLT53cml0ZUVycm9yKCJcbiIuJzxlcnJvcj5SZW1vdmFsIGZhaWxlZCwgcmV2ZXJ0aW5nICcuJGZpbGUuJyB0byBpdHMgb3JpZ2luYWwgY29udGVudC48L2Vycm9yPicpOwpmaWxlX3B1dF9jb250ZW50cygkanNvbkZpbGUtPmdldFBhdGgoKSwgJGNvbXBvc2VyQmFja3VwKTsKfQoKaWYgKCEkZHJ5UnVuKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5SZW1vdmFsIGZhaWxlZCwgJy4kcGFja2FnZS4nIGlzIHN0aWxsIHByZXNlbnQsIGl0IG1heSBiZSByZXF1aXJlZCBieSBhbm90aGVyIHBhY2thZ2UuIFNlZSBgY29tcG9zZXIgd2h5ICcuJHBhY2thZ2UuJ2AuPC9lcnJvcj4nKTsKCnJldHVybiAyOwp9Cn0KfQoKcmV0dXJuICRzdGF0dXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCgoKCgoKCmNsYXNzIFJlcG9zaXRvcnlDb21tYW5kIGV4dGVuZHMgQmFzZUNvbmZpZ0NvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3JlcG9zaXRvcnknKQotPnNldEFsaWFzZXMoWydyZXBvJ10pCi0+c2V0RGVzY3JpcHRpb24oJ01hbmFnZXMgcmVwb3NpdG9yaWVzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdnbG9iYWwnLCAnZycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXBwbHkgY29tbWFuZCB0byB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlJyksCm5ldyBJbnB1dE9wdGlvbignZmlsZScsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnSWYgeW91IHdhbnQgdG8gY2hvb3NlIGEgZGlmZmVyZW50IGNvbXBvc2VyLmpzb24gb3IgY29uZmlnLmpzb24nKSwKbmV3IElucHV0T3B0aW9uKCdhcHBlbmQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1doZW4gYWRkaW5nIGEgcmVwb3NpdG9yeSwgYXBwZW5kIGl0IChsb3dlciBwcmlvcml0eSkgaW5zdGVhZCBvZiBwcmVwZW5kaW5nIGl0JyksCm5ldyBJbnB1dE9wdGlvbignYmVmb3JlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnV2hlbiBhZGRpbmcgYSByZXBvc2l0b3J5LCBpbnNlcnQgaXQgYmVmb3JlIHRoZSBnaXZlbiByZXBvc2l0b3J5IG5hbWUnLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJlcG9OYW1lcygpKSwKbmV3IElucHV0T3B0aW9uKCdhZnRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1doZW4gYWRkaW5nIGEgcmVwb3NpdG9yeSwgaW5zZXJ0IGl0IGFmdGVyIHRoZSBnaXZlbiByZXBvc2l0b3J5IG5hbWUnLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFJlcG9OYW1lcygpKSwKbmV3IElucHV0QXJndW1lbnQoJ2FjdGlvbicsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnQWN0aW9uIHRvIHBlcmZvcm06IGxpc3QsIGFkZCwgcmVtb3ZlLCBzZXQtdXJsLCBnZXQtdXJsLCBlbmFibGUsIGRpc2FibGUnLCAnbGlzdCcsIFsnbGlzdCcsICdhZGQnLCAncmVtb3ZlJywgJ3NldC11cmwnLCAnZ2V0LXVybCcsICdlbmFibGUnLCAnZGlzYWJsZSddKSwKbmV3IElucHV0QXJndW1lbnQoJ25hbWUnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1JlcG9zaXRvcnkgbmFtZSAob3Igc3BlY2lhbCBuYW1lIHBhY2thZ2lzdC5vcmcgZm9yIGVuYWJsZS9kaXNhYmxlKScsIG51bGwsICR0aGlzLT5zdWdnZXN0UmVwb05hbWVzKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnYXJnMScsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVHlwZSBmb3IgYWRkLCBvciBuZXcgVVJMIGZvciBzZXQtdXJsLCBvciBKU09OIGNvbmZpZyBmb3IgYWRkJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RUeXBlRm9yQWRkKCkpLApuZXcgSW5wdXRBcmd1bWVudCgnYXJnMicsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnVVJMIGZvciBhZGQgKGlmIG5vdCB1c2luZyBKU09OKScpLApdKQotPnNldEhlbHAoPDw8RU9UClRoaXMgY29tbWFuZCBsZXRzIHlvdSBtYW5hZ2UgcmVwb3NpdG9yaWVzIGluIHlvdXIgY29tcG9zZXIuanNvbi4KCkV4YW1wbGVzOgogIGNvbXBvc2VyIHJlcG8gbGlzdAogIGNvbXBvc2VyIHJlcG8gYWRkIGZvbyB2Y3MgaHR0cHM6Ly9naXRodWIuY29tL2FjbWUvZm9vCiAgY29tcG9zZXIgcmVwbyBhZGQgYmFyIGNvbXBvc2VyIGh0dHBzOi8vcmVwby5wYWNrYWdpc3QuY29tL2JhcgogIGNvbXBvc2VyIHJlcG8gYWRkIHppcHMgJ3sidHlwZSI6ImFydGlmYWN0IiwidXJsIjoiL3BhdGgvdG8vZGlyL3dpdGgvemlwcyJ9JwogIGNvbXBvc2VyIHJlcG8gYWRkIGJheiB2Y3MgaHR0cHM6Ly9leGFtcGxlLm9yZyAtLWJlZm9yZSBmb28KICBjb21wb3NlciByZXBvIGFkZCBxdXggdmNzIGh0dHBzOi8vZXhhbXBsZS5vcmcgLS1hZnRlciBiYXIKICBjb21wb3NlciByZXBvIHJlbW92ZSBmb28KICBjb21wb3NlciByZXBvIHNldC11cmwgZm9vIGh0dHBzOi8vZ2l0LmV4YW1wbGUub3JnL2FjbWUvZm9vCiAgY29tcG9zZXIgcmVwbyBnZXQtdXJsIGZvbwogIGNvbXBvc2VyIHJlcG8gZGlzYWJsZSBwYWNrYWdpc3Qub3JnCiAgY29tcG9zZXIgcmVwbyBlbmFibGUgcGFja2FnaXN0Lm9yZwoKVXNlIC0tZ2xvYmFsLy1nIHRvIGFsdGVyIHRoZSBnbG9iYWwgY29uZmlnLmpzb24gaW5zdGVhZC4KVXNlIC0tZmlsZSB0byBhbHRlciBhIHNwZWNpZmljIGZpbGUuCkVPVAopOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGFjdGlvbiA9IHN0cnRvbG93ZXIoKHN0cmluZykgJGlucHV0LT5nZXRBcmd1bWVudCgnYWN0aW9uJykpOwokbmFtZSA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ25hbWUnKTsKJGFyZzEgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdhcmcxJyk7CiRhcmcyID0gJGlucHV0LT5nZXRBcmd1bWVudCgnYXJnMicpOwoKJHRoaXMtPmNvbmZpZy0+bWVyZ2UoJHRoaXMtPmNvbmZpZ0ZpbGUtPnJlYWQoKSwgJHRoaXMtPmNvbmZpZ0ZpbGUtPmdldFBhdGgoKSk7CiRyZXBvcyA9ICR0aGlzLT5jb25maWctPmdldFJlcG9zaXRvcmllcygpOwoKc3dpdGNoICgkYWN0aW9uKSB7CmNhc2UgJ2xpc3QnOgpjYXNlICdscyc6CmNhc2UgJ3Nob3cnOgokdGhpcy0+bGlzdFJlcG9zaXRvcmllcygkcmVwb3MpOwoKcmV0dXJuIDA7CgpjYXNlICdhZGQnOgppZiAoJG5hbWUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBwYXNzIGEgcmVwb3NpdG9yeSBuYW1lLiBFeGFtcGxlOiBjb21wb3NlciByZXBvIGFkZCBmb28gdmNzIGh0dHBzOi8vZXhhbXBsZS5vcmcnKTsKfQppZiAoJGFyZzEgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBwYXNzIHRoZSB0eXBlIGFuZCBhIHVybCwgb3IgYSBKU09OIHN0cmluZy4nKTsKfQppZiAoaXNfc3RyaW5nKCRhcmcxKSAmJiBQcmVnOjppc01hdGNoKCd7XlxzKlx7fScsICRhcmcxKSkgewoKJHJlcG9Db25maWcgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRhcmcxKTsKfSBlbHNlIHsKaWYgKCRhcmcyID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignWW91IG11c3QgcGFzcyB0aGUgdHlwZSBhbmQgYSB1cmwuIEV4YW1wbGU6IGNvbXBvc2VyIHJlcG8gYWRkIGZvbyB2Y3MgaHR0cHM6Ly9leGFtcGxlLm9yZycpOwp9CiRyZXBvQ29uZmlnID0gWyd0eXBlJyA9PiAoc3RyaW5nKSAkYXJnMSwgJ3VybCcgPT4gKHN0cmluZykgJGFyZzJdOwp9CgoKJGJlZm9yZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdiZWZvcmUnKTsKJGFmdGVyID0gJGlucHV0LT5nZXRPcHRpb24oJ2FmdGVyJyk7CmlmICgkYmVmb3JlICE9PSBudWxsICYmICRhZnRlciAhPT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBjYW4gbm90IGNvbWJpbmUgLS1iZWZvcmUgYW5kIC0tYWZ0ZXInKTsKfQoKaWYgKCRiZWZvcmUgIT09IG51bGwgfHwgJGFmdGVyICE9PSBudWxsKSB7CmlmICgkcmVwb0NvbmZpZyA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW5ub3QgdXNlIC0tYmVmb3JlLy0tYWZ0ZXIgd2l0aCBib29sZWFuIHJlcG9zaXRvcnkgdmFsdWVzJyk7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPmluc2VydFJlcG9zaXRvcnkoKHN0cmluZykgJG5hbWUsICRyZXBvQ29uZmlnLCAkYmVmb3JlID8/ICRhZnRlciwgJGFmdGVyICE9PSBudWxsID8gMSA6IDApOwoKcmV0dXJuIDA7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPmFkZFJlcG9zaXRvcnkoKHN0cmluZykgJG5hbWUsICRyZXBvQ29uZmlnLCAoYm9vbCkgJGlucHV0LT5nZXRPcHRpb24oJ2FwcGVuZCcpKTsKCnJldHVybiAwOwoKY2FzZSAncmVtb3ZlJzoKY2FzZSAncm0nOgpjYXNlICdkZWxldGUnOgppZiAoJG5hbWUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBwYXNzIHRoZSByZXBvc2l0b3J5IG5hbWUgdG8gcmVtb3ZlLicpOwp9CiR0aGlzLT5jb25maWdTb3VyY2UtPnJlbW92ZVJlcG9zaXRvcnkoKHN0cmluZykgJG5hbWUpOwppZiAoaW5fYXJyYXkoJG5hbWUsIFsncGFja2FnaXN0JywgJ3BhY2thZ2lzdC5vcmcnXSwgdHJ1ZSkpIHsKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgncGFja2FnaXN0Lm9yZycsIGZhbHNlKTsKfQoKcmV0dXJuIDA7CgpjYXNlICdzZXQtdXJsJzoKY2FzZSAnc2V0dXJsJzoKaWYgKCRuYW1lID09PSBudWxsIHx8ICRhcmcxID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVXNhZ2U6IGNvbXBvc2VyIHJlcG8gc2V0LXVybCA8bmFtZT4gPG5ldy11cmw+Jyk7Cn0KCiR0aGlzLT5jb25maWdTb3VyY2UtPnNldFJlcG9zaXRvcnlVcmwoJG5hbWUsICRhcmcxKTsKCnJldHVybiAwOwoKY2FzZSAnZ2V0LXVybCc6CmNhc2UgJ2dldHVybCc6CmlmICgkbmFtZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VzYWdlOiBjb21wb3NlciByZXBvIGdldC11cmwgPG5hbWU+Jyk7Cn0KaWYgKGlzc2V0KCRyZXBvc1skbmFtZV0pICYmIGlzX2FycmF5KCRyZXBvc1skbmFtZV0pKSB7CiR1cmwgPSAkcmVwb3NbJG5hbWVdWyd1cmwnXSA/PyBudWxsOwppZiAoIWlzX3N0cmluZygkdXJsKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlICcuJG5hbWUuJyByZXBvc2l0b3J5IGRvZXMgbm90IGhhdmUgYSBVUkwnKTsKfQokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJHVybCk7CgpyZXR1cm4gMDsKfQoKaWYgKGlzX2FycmF5KCRyZXBvcykpIHsKZm9yZWFjaCAoJHJlcG9zIGFzICR2YWwpIHsKaWYgKGlzX2FycmF5KCR2YWwpICYmIGlzc2V0KCR2YWxbJ25hbWUnXSkgJiYgJHZhbFsnbmFtZSddID09PSAkbmFtZSkgewokdXJsID0gJHZhbFsndXJsJ10gPz8gbnVsbDsKaWYgKCFpc19zdHJpbmcoJHVybCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSAnLiRuYW1lLicgcmVwb3NpdG9yeSBkb2VzIG5vdCBoYXZlIGEgVVJMJyk7Cn0KJHRoaXMtPmdldElPKCktPndyaXRlKCR1cmwpOwoKcmV0dXJuIDA7Cn0KfQp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlcmUgaXMgbm8gJy4kbmFtZS4nIHJlcG9zaXRvcnkgZGVmaW5lZCcpOwoKY2FzZSAnZGlzYWJsZSc6CmlmICgkbmFtZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VzYWdlOiBjb21wb3NlciByZXBvIGRpc2FibGUgcGFja2FnaXN0Lm9yZycpOwp9CmlmIChpbl9hcnJheSgkbmFtZSwgWydwYWNrYWdpc3QnLCAncGFja2FnaXN0Lm9yZyddLCB0cnVlKSkgewoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+YWRkUmVwb3NpdG9yeSgncGFja2FnaXN0Lm9yZycsIGZhbHNlLCAoYm9vbCkgJGlucHV0LT5nZXRPcHRpb24oJ2FwcGVuZCcpKTsKCnJldHVybiAwOwp9CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignT25seSBwYWNrYWdpc3Qub3JnIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIHVzaW5nIHRoaXMgY29tbWFuZC4gVXNlIGFkZC9yZW1vdmUgZm9yIG90aGVyIHJlcG9zaXRvcmllcy4nKTsKCmNhc2UgJ2VuYWJsZSc6CmlmICgkbmFtZSA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VzYWdlOiBjb21wb3NlciByZXBvIGVuYWJsZSBwYWNrYWdpc3Qub3JnJyk7Cn0KaWYgKGluX2FycmF5KCRuYW1lLCBbJ3BhY2thZ2lzdCcsICdwYWNrYWdpc3Qub3JnJ10sIHRydWUpKSB7CgoKJHRoaXMtPmNvbmZpZ1NvdXJjZS0+cmVtb3ZlUmVwb3NpdG9yeSgncGFja2FnaXN0Lm9yZycpOwoKcmV0dXJuIDA7Cn0KdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdPbmx5IHBhY2thZ2lzdC5vcmcgY2FuIGJlIGVuYWJsZWQvZGlzYWJsZWQgdXNpbmcgdGhpcyBjb21tYW5kLicpOwoKZGVmYXVsdDoKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gYWN0aW9uICInLiRhY3Rpb24uJyIuIFVzZSBsaXN0LCBhZGQsIHJlbW92ZSwgc2V0LXVybCwgZ2V0LXVybCwgZW5hYmxlLCBkaXNhYmxlJyk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBsaXN0UmVwb3NpdG9yaWVzKGFycmF5ICRyZXBvcyk6IHZvaWQKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRwYWNrYWdpc3RQcmVzZW50ID0gZmFsc2U7CmZvcmVhY2ggKCRyZXBvcyBhcyAka2V5ID0+ICRyZXBvKSB7CmlmIChpc3NldCgkcmVwb1sndHlwZSddLCAkcmVwb1sndXJsJ10pICYmICRyZXBvWyd0eXBlJ10gPT09ICdjb21wb3NlcicgJiYgc3RyX2VuZHNfd2l0aCgoc3RyaW5nKSBwYXJzZV91cmwoJHJlcG9bJ3VybCddLCBQSFBfVVJMX0hPU1QpLCAncGFja2FnaXN0Lm9yZycpKSB7CiRwYWNrYWdpc3RQcmVzZW50ID0gdHJ1ZTsKYnJlYWs7Cn0KfQppZiAoISRwYWNrYWdpc3RQcmVzZW50KSB7CiRyZXBvc1tdID0gWydwYWNrYWdpc3Qub3JnJyA9PiBmYWxzZV07Cn0KCmlmICgkcmVwb3MgPT09IFtdKSB7CiRpby0+d3JpdGUoJ05vIHJlcG9zaXRvcmllcyBjb25maWd1cmVkJyk7CgpyZXR1cm47Cn0KCmZvcmVhY2ggKCRyZXBvcyBhcyAka2V5ID0+ICRyZXBvKSB7CmlmICgkcmVwbyA9PT0gZmFsc2UpIHsKJGlvLT53cml0ZSgnWycuJGtleS4nXSA8aW5mbz5kaXNhYmxlZDwvaW5mbz4nKTsKY29udGludWU7Cn0KCmlmIChpc19hcnJheSgkcmVwbykpIHsKaWYgKDEgPT09IFxjb3VudCgkcmVwbykgJiYgZmFsc2UgPT09IGN1cnJlbnQoJHJlcG8pKSB7CiRpby0+d3JpdGUoJ1snLmFycmF5X2tleV9maXJzdCgkcmVwbykuJ10gPGluZm8+ZGlzYWJsZWQ8L2luZm8+Jyk7CmNvbnRpbnVlOwp9CgokbmFtZSA9ICRyZXBvWyduYW1lJ10gPz8gJGtleTsKJHR5cGUgPSAkcmVwb1sndHlwZSddID8/ICd1bmtub3duJzsKJHVybCA9ICRyZXBvWyd1cmwnXSA/PyBKc29uRmlsZTo6ZW5jb2RlKCRyZXBvKTsKJGlvLT53cml0ZSgnWycuJG5hbWUuJ10gPGluZm8+Jy4kdHlwZS4nPC9pbmZvPiAnLiR1cmwpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBzdWdnZXN0VHlwZUZvckFkZCgpOiBcQ2xvc3VyZQp7CnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdhY3Rpb24nKSA9PT0gJ2FkZCcpIHsKcmV0dXJuIFsnY29tcG9zZXInLCAndmNzJywgJ2FydGlmYWN0JywgJ3BhdGgnXTsKfQoKcmV0dXJuIFtdOwp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIHN1Z2dlc3RSZXBvTmFtZXMoKTogXENsb3N1cmUKewpyZXR1cm4gZnVuY3Rpb24gKENvbXBsZXRpb25JbnB1dCAkaW5wdXQpOiBhcnJheSB7CmlmIChpbl9hcnJheSgkaW5wdXQtPmdldEFyZ3VtZW50KCdhY3Rpb24nKSwgWydlbmFibGUnLCAnZGlzYWJsZSddLCB0cnVlKSkgewpyZXR1cm4gWydwYWNrYWdpc3Qub3JnJ107Cn0KCmlmICghaW5fYXJyYXkoJGlucHV0LT5nZXRBcmd1bWVudCgnYWN0aW9uJyksIFsncmVtb3ZlJywgJ3NldC11cmwnLCAnZ2V0LXVybCddLCB0cnVlKSkgewpyZXR1cm4gW107Cn0KCiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoKTsKJGNvbmZpZ0ZpbGUgPSBuZXcgSnNvbkZpbGUoJHRoaXMtPmdldENvbXBvc2VyQ29uZmlnRmlsZSgkaW5wdXQsICRjb25maWcpKTsKCiRkYXRhID0gJGNvbmZpZ0ZpbGUtPnJlYWQoKTsKJHJlcG9zID0gW107Cgpmb3JlYWNoICgoJGRhdGFbJ3JlcG9zaXRvcmllcyddID8/IFtdKSBhcyAkcmVwbykgewppZiAoaXNzZXQoJHJlcG9bJ25hbWUnXSkpIHsKJHJlcG9zW10gPSAkcmVwb1snbmFtZSddOwp9Cn0KCnNvcnQoJHJlcG9zKTsKCnJldHVybiAkcmVwb3M7Cn07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUmVxdWVzdDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxSb290UGFja2FnZUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uU2VsZWN0b3I7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VTb3J0ZXI7CnVzZSBTZWxkXFNpZ25hbFxTaWduYWxIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckV2ZW50czsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxKc29uXEpzb25NYW5pcHVsYXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CgoKCgoKY2xhc3MgUmVxdWlyZUNvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnVzZSBDb21wbGV0aW9uVHJhaXQ7CnVzZSBQYWNrYWdlRGlzY292ZXJ5VHJhaXQ7CgoKcHJpdmF0ZSAkbmV3bHlDcmVhdGVkOwoKcHJpdmF0ZSAkZmlyc3RSZXF1aXJlOwoKcHJpdmF0ZSAkanNvbjsKCnByaXZhdGUgJGZpbGU7Cgpwcml2YXRlICRjb21wb3NlckJhY2t1cDsKCnByaXZhdGUgJGxvY2s7Cgpwcml2YXRlICRsb2NrQmFja3VwOwoKcHJpdmF0ZSAkZGVwZW5kZW5jeVJlc29sdXRpb25Db21wbGV0ZWQgPSBmYWxzZTsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgncmVxdWlyZScpCi0+c2V0QWxpYXNlcyhbJ3InXSkKLT5zZXREZXNjcmlwdGlvbignQWRkcyByZXF1aXJlZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24gYW5kIGluc3RhbGxzIHRoZW0nKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRBcmd1bWVudCgncGFja2FnZXMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnT3B0aW9uYWwgcGFja2FnZSBuYW1lIGNhbiBhbHNvIGluY2x1ZGUgYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gZm9vL2JhciBvciBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAgb3IgImZvby9iYXIgMS4wLjAiJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RBdmFpbGFibGVQYWNrYWdlSW5jbFBsYXRmb3JtKCkpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWRkIHJlcXVpcmVtZW50IHRvIHJlcXVpcmUtZGV2LicpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcgKGltcGxpY2l0bHkgZW5hYmxlcyAtLXZlcmJvc2UpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1zb3VyY2UnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIHNvdXJjZXMgd2hlbiBwb3NzaWJsZSwgaW5jbHVkaW5nIFZDUyBpbmZvcm1hdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItZGlzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdCAoZGVmYXVsdCBiZWhhdmlvcikuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBkaXN0fHNvdXJjZXxhdXRvIChhdXRvIGNob29zZXMgc291cmNlIGZvciBkZXYgdmVyc2lvbnMsIGRpc3QgZm9yIHRoZSByZXN0KS4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFByZWZlckluc3RhbGwoKSksCm5ldyBJbnB1dE9wdGlvbignZml4ZWQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1dyaXRlIGZpeGVkIHZlcnNpb24gdG8gdGhlIGNvbXBvc2VyLmpzb24uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tc3VnZ2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogVGhpcyBmbGFnIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tdXBkYXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyB0aGUgYXV0b21hdGljIHVwZGF0ZSBvZiB0aGUgZGVwZW5kZW5jaWVzIChpbXBsaWVzIC0tbm8taW5zdGFsbCkuJyksCm5ldyBJbnB1dE9wdGlvbignbm8taW5zdGFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcCB0aGUgaW5zdGFsbCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXVkaXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGF1ZGl0IHN0ZXAgYWZ0ZXIgdXBkYXRpbmcgdGhlIGNvbXBvc2VyLmxvY2sgZmlsZSAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fQVVESVQ9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdhdWRpdC1mb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdBdWRpdCBvdXRwdXQgZm9ybWF0LiBNdXN0IGJlICJ0YWJsZSIsICJwbGFpbiIsICJqc29uIiwgb3IgInN1bW1hcnkiLicsIEF1ZGl0b3I6OkZPUk1BVF9TVU1NQVJZLCBBdWRpdG9yOjpGT1JNQVRTKSwKbmV3IElucHV0T3B0aW9uKCduby1zZWN1cml0eS1ibG9ja2luZycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluc3RhbGxpbmcgcGFja2FnZXMgd2l0aCBzZWN1cml0eSBhZHZpc29yaWVzIG9yIHRoYXQgYXJlIGFiYW5kb25lZCAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTk9fU0VDVVJJVFlfQkxPQ0tJTkc9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSdW4gdGhlIGRlcGVuZGVuY3kgdXBkYXRlIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUtd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGluaGVyaXRlZCBkZXBlbmRlbmNpZXMgdG8gYmUgdXBkYXRlZCwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIHJvb3QgcmVxdWlyZW1lbnRzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9XSVRIX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3VwZGF0ZS13aXRoLWFsbC1kZXBlbmRlbmNpZXMnLCAnVycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxsb3dzIGFsbCBpbmhlcml0ZWQgZGVwZW5kZW5jaWVzIHRvIGJlIHVwZGF0ZWQsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSByb290IHJlcXVpcmVtZW50cyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfV0lUSF9BTExfREVQRU5ERU5DSUVTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsaWFzIGZvciAtLXVwZGF0ZS13aXRoLWRlcGVuZGVuY2llcycpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQWxpYXMgZm9yIC0tdXBkYXRlLXdpdGgtYWxsLWRlcGVuZGVuY2llcycpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbignaWdub3JlLXBsYXRmb3JtLXJlcXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0lnbm9yZSBhbGwgcGxhdGZvcm0gcmVxdWlyZW1lbnRzIChwaHAgJiBleHQtIHBhY2thZ2VzKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc3RhYmxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmVmZXIgc3RhYmxlIHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfUFJFRkVSX1NUQUJMRT0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1sb3dlc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1ByZWZlciBsb3dlc3QgdmVyc2lvbnMgb2YgZGVwZW5kZW5jaWVzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9QUkVGRVJfTE9XRVNUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0R1cmluZyBhbiB1cGRhdGUgd2l0aCAtdy8tVywgb25seSBwZXJmb3JtIGFic29sdXRlbHkgbmVjZXNzYXJ5IGNoYW5nZXMgdG8gdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX01JTklNQUxfQ0hBTkdFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3NvcnQtcGFja2FnZXMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NvcnRzIHBhY2thZ2VzIHdoZW4gYWRkaW5nL3VwZGF0aW5nIGEgbmV3IGRlcGVuZGVuY3knKSwKbmV3IElucHV0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJywgJ28nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ09wdGltaXplIGF1dG9sb2FkZXIgZHVyaW5nIGF1dG9sb2FkZXIgZHVtcCcpLApuZXcgSW5wdXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQXV0b2xvYWQgY2xhc3NlcyBmcm9tIHRoZSBjbGFzc21hcCBvbmx5LiBJbXBsaWNpdGx5IGVuYWJsZXMgYC0tb3B0aW1pemUtYXV0b2xvYWRlcmAuJyksCm5ldyBJbnB1dE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVc2UgQVBDdSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3Nlcy4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXItcHJlZml4JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVXNlIGEgY3VzdG9tIHByZWZpeCBmb3IgdGhlIEFQQ3UgYXV0b2xvYWRlciBjYWNoZS4gSW1wbGljaXRseSBlbmFibGVzIC0tYXBjdS1hdXRvbG9hZGVyJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSByZXF1aXJlIGNvbW1hbmQgYWRkcyByZXF1aXJlZCBwYWNrYWdlcyB0byB5b3VyIGNvbXBvc2VyLmpzb24gYW5kIGluc3RhbGxzIHRoZW0uCgpJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSBwYWNrYWdlLCBjb21wb3NlciB3aWxsIHByb21wdCB5b3UgdG8gc2VhcmNoIGZvciBhIHBhY2thZ2UsIGFuZCBnaXZlbiByZXN1bHRzLCBwcm92aWRlIGEgbGlzdCBvZgptYXRjaGVzIHRvIHJlcXVpcmUuCgpJZiB5b3UgZG8gbm90IHNwZWNpZnkgYSB2ZXJzaW9uIGNvbnN0cmFpbnQsIGNvbXBvc2VyIHdpbGwgY2hvb3NlIGEgc3VpdGFibGUgb25lIGJhc2VkIG9uIHRoZSBhdmFpbGFibGUgcGFja2FnZSB2ZXJzaW9ucy4KCklmIHlvdSBkbyBub3Qgd2FudCB0byBpbnN0YWxsIHRoZSBuZXcgZGVwZW5kZW5jaWVzIGltbWVkaWF0ZWx5IHlvdSBjYW4gY2FsbCBpdCB3aXRoIC0tbm8tdXBkYXRlCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNyZXF1aXJlLXIKRU9UCikKOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJHRoaXMtPmZpbGUgPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXN1Z2dlc3QnKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgb3B0aW9uICItLW5vLXN1Z2dlc3QiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CgokdGhpcy0+bmV3bHlDcmVhdGVkID0gIWZpbGVfZXhpc3RzKCR0aGlzLT5maWxlKTsKaWYgKCR0aGlzLT5uZXdseUNyZWF0ZWQgJiYgIWZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlLCAie1xufVxuIikpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy4kdGhpcy0+ZmlsZS4nIGNvdWxkIG5vdCBiZSBjcmVhdGVkLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMTsKfQppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHRoaXMtPmZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicuJHRoaXMtPmZpbGUuJyBpcyBub3QgcmVhZGFibGUuPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoZmlsZXNpemUoJHRoaXMtPmZpbGUpID09PSAwKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5maWxlLCAie1xufVxuIik7Cn0KCiR0aGlzLT5qc29uID0gbmV3IEpzb25GaWxlKCR0aGlzLT5maWxlKTsKJHRoaXMtPmxvY2sgPSBGYWN0b3J5OjpnZXRMb2NrRmlsZSgkdGhpcy0+ZmlsZSk7CiR0aGlzLT5jb21wb3NlckJhY2t1cCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5qc29uLT5nZXRQYXRoKCkpOwokdGhpcy0+bG9ja0JhY2t1cCA9IGZpbGVfZXhpc3RzKCR0aGlzLT5sb2NrKSA/IGZpbGVfZ2V0X2NvbnRlbnRzKCR0aGlzLT5sb2NrKSA6IG51bGw7Cgokc2lnbmFsSGFuZGxlciA9IFNpZ25hbEhhbmRsZXI6OmNyZWF0ZShbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLCBmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwsIFNpZ25hbEhhbmRsZXIgJGhhbmRsZXIpIHsKJHRoaXMtPmdldElPKCktPndyaXRlRXJyb3IoJ1JlY2VpdmVkICcuJHNpZ25hbC4nLCBhYm9ydGluZycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKJGhhbmRsZXItPmV4aXRXaXRoTGFzdFNpZ25hbCgpOwp9KTsKCgoKaWYgKCFpc193cml0YWJsZSgkdGhpcy0+ZmlsZSkgJiYgZmFsc2UgPT09IFNpbGVuY2VyOjpjYWxsKCdmaWxlX3B1dF9jb250ZW50cycsICR0aGlzLT5maWxlLCAkdGhpcy0+Y29tcG9zZXJCYWNrdXApKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicuJHRoaXMtPmZpbGUuJyBpcyBub3Qgd3JpdGFibGUuPC9lcnJvcj4nKTsKCnJldHVybiAxOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2ZpeGVkJykgPT09IHRydWUpIHsKJGNvbmZpZyA9ICR0aGlzLT5qc29uLT5yZWFkKCk7CgokcGFja2FnZVR5cGUgPSBlbXB0eSgkY29uZmlnWyd0eXBlJ10pID8gJ2xpYnJhcnknIDogJGNvbmZpZ1sndHlwZSddOwoKCgoKaWYgKCRwYWNrYWdlVHlwZSAhPT0gJ3Byb2plY3QnICYmICEkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlICItLWZpeGVkIiBvcHRpb24gaXMgb25seSBhbGxvd2VkIGZvciBwYWNrYWdlcyB3aXRoIGEgInByb2plY3QiIHR5cGUgb3IgZm9yIGRldiBkZXBlbmRlbmNpZXMgdG8gcHJldmVudCBwb3NzaWJsZSBtaXN1c2VzLjwvZXJyb3I+Jyk7CgppZiAoIWlzc2V0KCRjb25maWdbJ3R5cGUnXSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SWYgeW91ciBwYWNrYWdlIGlzIG5vdCBhIGxpYnJhcnksIHlvdSBjYW4gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSAidHlwZSIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyB0eXBlIHByb2plY3QiLjwvZXJyb3I+Jyk7Cn0KCnJldHVybiAxOwp9Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKJHJlcG9zID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRSZXBvc2l0b3JpZXMoKTsKCiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgncGxhdGZvcm0nKTsKCiR0aGlzLT5yZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKApbJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnkoW10sICRwbGF0Zm9ybU92ZXJyaWRlcyldLAokcmVwb3MKKSk7CgppZiAoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFByZWZlclN0YWJsZSgpKSB7CiRwcmVmZXJyZWRTdGFiaWxpdHkgPSAnc3RhYmxlJzsKfSBlbHNlIHsKJHByZWZlcnJlZFN0YWJpbGl0eSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRNaW5pbXVtU3RhYmlsaXR5KCk7Cn0KCnRyeSB7CiRyZXF1aXJlbWVudHMgPSAkdGhpcy0+ZGV0ZXJtaW5lUmVxdWlyZW1lbnRzKAokaW5wdXQsCiRvdXRwdXQsCiRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJyksCiRwbGF0Zm9ybVJlcG8sCiRwcmVmZXJyZWRTdGFiaWxpdHksCiRpbnB1dC0+Z2V0T3B0aW9uKCduby11cGRhdGUnKSwgCiRpbnB1dC0+Z2V0T3B0aW9uKCdmaXhlZCcpCik7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT5uZXdseUNyZWF0ZWQpIHsKJHRoaXMtPnJldmVydENvbXBvc2VyRmlsZSgpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdObyBjb21wb3Nlci5qc29uIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5ICgnLiR0aGlzLT5maWxlLicpLCB0aGlzIG1heSBiZSB0aGUgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb24uJywgMCwgJGUpOwp9Cgp0aHJvdyAkZTsKfQoKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5mb3JtYXRSZXF1aXJlbWVudHMoJHJlcXVpcmVtZW50cyk7CgppZiAoISRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSAmJiAkaW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAhJGNvbXBvc2VyLT5pc0dsb2JhbCgpKSB7CiRkZXZQYWNrYWdlcyA9IFtdOwokZGV2VGFncyA9IFsnZGV2JywgJ3Rlc3RpbmcnLCAnc3RhdGljIGFuYWx5c2lzJ107CiRjdXJyZW50UmVxdWlyZXNCeUtleSA9ICR0aGlzLT5nZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOwpmb3JlYWNoICgkcmVxdWlyZW1lbnRzIGFzICRuYW1lID0+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+IDApIHsKJHJlc3VsdCA9ICR0aGlzLT51cGRhdGVSZXF1aXJlbWVudHNBZnRlclJlc29sdXRpb24oJHJlcXVpcmVtZW50c1RvR3Vlc3MsICRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5LCAkc29ydFBhY2thZ2VzLCAkaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpLCAkaW5wdXQtPmdldE9wdGlvbignZml4ZWQnKSk7Cn0KCnJldHVybiAkcmVzdWx0Owp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJHRoaXMtPmRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkKSB7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKfQp0aHJvdyAkZTsKfSBmaW5hbGx5IHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykgJiYgJHRoaXMtPm5ld2x5Q3JlYXRlZCkgewpAdW5saW5rKCR0aGlzLT5qc29uLT5nZXRQYXRoKCkpOwp9Cgokc2lnbmFsSGFuZGxlci0+dW5yZWdpc3RlcigpOwp9Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEluY29uc2lzdGVudFJlcXVpcmVLZXlzKGFycmF5ICRuZXdSZXF1aXJlbWVudHMsIHN0cmluZyAkcmVxdWlyZUtleSk6IGFycmF5CnsKJHJlcXVpcmVLZXlzID0gJHRoaXMtPmdldFBhY2thZ2VzQnlSZXF1aXJlS2V5KCk7CiRpbmNvbnNpc3RlbnRSZXF1aXJlbWVudHMgPSBbXTsKZm9yZWFjaCAoJHJlcXVpcmVLZXlzIGFzICRwYWNrYWdlID0+ICRwYWNrYWdlUmVxdWlyZUtleSkgewppZiAoIWlzc2V0KCRuZXdSZXF1aXJlbWVudHNbJHBhY2thZ2VdKSkgewpjb250aW51ZTsKfQppZiAoJHJlcXVpcmVLZXkgIT09ICRwYWNrYWdlUmVxdWlyZUtleSkgewokaW5jb25zaXN0ZW50UmVxdWlyZW1lbnRzW10gPSAkcGFja2FnZTsKfQp9CgpyZXR1cm4gJGluY29uc2lzdGVudFJlcXVpcmVtZW50czsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQYWNrYWdlc0J5UmVxdWlyZUtleSgpOiBhcnJheQp7CiRjb21wb3NlckRlZmluaXRpb24gPSAkdGhpcy0+anNvbi0+cmVhZCgpOwokcmVxdWlyZSA9IFtdOwokcmVxdWlyZURldiA9IFtdOwoKaWYgKGlzc2V0KCRjb21wb3NlckRlZmluaXRpb25bJ3JlcXVpcmUnXSkpIHsKJHJlcXVpcmUgPSAkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlJ107Cn0KCmlmIChpc3NldCgkY29tcG9zZXJEZWZpbml0aW9uWydyZXF1aXJlLWRldiddKSkgewokcmVxdWlyZURldiA9ICRjb21wb3NlckRlZmluaXRpb25bJ3JlcXVpcmUtZGV2J107Cn0KCnJldHVybiBhcnJheV9tZXJnZSgKYXJyYXlfZmlsbF9rZXlzKGFycmF5X2tleXMoJHJlcXVpcmUpLCAncmVxdWlyZScpLAphcnJheV9maWxsX2tleXMoYXJyYXlfa2V5cygkcmVxdWlyZURldiksICdyZXF1aXJlLWRldicpCik7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9VcGRhdGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgSU9JbnRlcmZhY2UgJGlvLCBhcnJheSAkcmVxdWlyZW1lbnRzLCBzdHJpbmcgJHJlcXVpcmVLZXksIHN0cmluZyAkcmVtb3ZlS2V5KTogaW50CnsKCiR0aGlzLT5yZXNldENvbXBvc2VyKCk7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiR0aGlzLT5kZXBlbmRlbmN5UmVzb2x1dGlvbkNvbXBsZXRlZCA9IGZhbHNlOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5hZGRMaXN0ZW5lcihJbnN0YWxsZXJFdmVudHM6OlBSRV9PUEVSQVRJT05TX0VYRUMsIGZ1bmN0aW9uICgpOiB2b2lkIHsKJHRoaXMtPmRlcGVuZGVuY3lSZXNvbHV0aW9uQ29tcGxldGVkID0gdHJ1ZTsKfSwgMTAwMDApOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpIHsKJHJvb3RQYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRsaW5rcyA9IFsKJ3JlcXVpcmUnID0+ICRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwKJ3JlcXVpcmUtZGV2JyA9PiAkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCksCl07CiRsb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIoKTsKJG5ld0xpbmtzID0gJGxvYWRlci0+cGFyc2VMaW5rcygkcm9vdFBhY2thZ2UtPmdldE5hbWUoKSwgJHJvb3RQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksIEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzWyRyZXF1aXJlS2V5XVsnbWV0aG9kJ10sICRyZXF1aXJlbWVudHMpOwokbGlua3NbJHJlcXVpcmVLZXldID0gYXJyYXlfbWVyZ2UoJGxpbmtzWyRyZXF1aXJlS2V5XSwgJG5ld0xpbmtzKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50cyBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewp1bnNldCgkbGlua3NbJHJlbW92ZUtleV1bJHBhY2thZ2VdKTsKfQokcm9vdFBhY2thZ2UtPnNldFJlcXVpcmVzKCRsaW5rc1sncmVxdWlyZSddKTsKJHJvb3RQYWNrYWdlLT5zZXREZXZSZXF1aXJlcygkbGlua3NbJ3JlcXVpcmUtZGV2J10pOwoKCiRyZWZlcmVuY2VzID0gJHJvb3RQYWNrYWdlLT5nZXRSZWZlcmVuY2VzKCk7CiRyZWZlcmVuY2VzID0gUm9vdFBhY2thZ2VMb2FkZXI6OmV4dHJhY3RSZWZlcmVuY2VzKCRyZXF1aXJlbWVudHMsICRyZWZlcmVuY2VzKTsKJHJvb3RQYWNrYWdlLT5zZXRSZWZlcmVuY2VzKCRyZWZlcmVuY2VzKTsKJHN0YWJpbGl0eUZsYWdzID0gJHJvb3RQYWNrYWdlLT5nZXRTdGFiaWxpdHlGbGFncygpOwokc3RhYmlsaXR5RmxhZ3MgPSBSb290UGFja2FnZUxvYWRlcjo6ZXh0cmFjdFN0YWJpbGl0eUZsYWdzKCRyZXF1aXJlbWVudHMsICRyb290UGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpLCAkc3RhYmlsaXR5RmxhZ3MpOwokcm9vdFBhY2thZ2UtPnNldFN0YWJpbGl0eUZsYWdzKCRzdGFiaWxpdHlGbGFncyk7CnVuc2V0KCRzdGFiaWxpdHlGbGFncywgJHJlZmVyZW5jZXMpOwp9CgokdXBkYXRlRGV2TW9kZSA9ICEkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLW5vLWRldicpOwokb3B0aW1pemUgPSAkaW5wdXQtPmdldE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnb3B0aW1pemUtYXV0b2xvYWRlcicpOwokYXV0aG9yaXRhdGl2ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdjbGFzc21hcC1hdXRob3JpdGF0aXZlJyk7CiRhcGN1UHJlZml4ID0gJGlucHV0LT5nZXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnKTsKJGFwY3UgPSAkYXBjdVByZWZpeCAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyJykgfHwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhcGN1LWF1dG9sb2FkZXInKTsKJG1pbmltYWxDaGFuZ2VzID0gJGlucHV0LT5nZXRPcHRpb24oJ21pbmltYWwtY2hhbmdlcycpIHx8ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgndXBkYXRlLXdpdGgtbWluaW1hbC1jaGFuZ2VzJyk7CgokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX09OTFlfTElTVEVEOwokZmxhZ3MgPSAnJzsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUtd2l0aC1hbGwtZGVwZW5kZW5jaWVzJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycpKSB7CiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTOwokZmxhZ3MgLj0gJyAtLXdpdGgtYWxsLWRlcGVuZGVuY2llcyc7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbigndXBkYXRlLXdpdGgtZGVwZW5kZW5jaWVzJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNfTk9fUk9PVF9SRVFVSVJFOwokZmxhZ3MgLj0gJyAtLXdpdGgtZGVwZW5kZW5jaWVzJzsKfQoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5SdW5uaW5nIGNvbXBvc2VyIHVwZGF0ZSAnLmltcGxvZGUoJyAnLCBhcnJheV9rZXlzKCRyZXF1aXJlbWVudHMpKS4kZmxhZ3MuJzwvaW5mbz4nKTsKCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3JlcXVpcmUnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnNldE91dHB1dFByb2dyZXNzKCEkaW5wdXQtPmdldE9wdGlvbignbm8tcHJvZ3Jlc3MnKSk7CgokaW5zdGFsbCA9IEluc3RhbGxlcjo6Y3JlYXRlKCRpbywgJGNvbXBvc2VyKTsKClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJGlucHV0KTsKCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSgkdXBkYXRlRGV2TW9kZSkKLT5zZXRPcHRpbWl6ZUF1dG9sb2FkZXIoJG9wdGltaXplKQotPnNldENsYXNzTWFwQXV0aG9yaXRhdGl2ZSgkYXV0aG9yaXRhdGl2ZSkKLT5zZXRBcGN1QXV0b2xvYWRlcigkYXBjdSwgJGFwY3VQcmVmaXgpCi0+c2V0VXBkYXRlKHRydWUpCi0+c2V0SW5zdGFsbCghJGlucHV0LT5nZXRPcHRpb24oJ25vLWluc3RhbGwnKSkKLT5zZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcykKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0UHJlZmVyU3RhYmxlKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc3RhYmxlJykpCi0+c2V0UHJlZmVyTG93ZXN0KCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItbG93ZXN0JykpCi0+c2V0QXVkaXRDb25maWcoJHRoaXMtPmNyZWF0ZUF1ZGl0Q29uZmlnKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCksICRpbnB1dCkpCi0+c2V0TWluaW1hbFVwZGF0ZSgkbWluaW1hbENoYW5nZXMpCjsKCgoKaWYgKCEkdGhpcy0+Zmlyc3RSZXF1aXJlICYmICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkpIHsKJGluc3RhbGwtPnNldFVwZGF0ZUFsbG93TGlzdChhcnJheV9rZXlzKCRyZXF1aXJlbWVudHMpKTsKfQoKJHN0YXR1cyA9ICRpbnN0YWxsLT5ydW4oKTsKaWYgKCRzdGF0dXMgIT09IDAgJiYgJHN0YXR1cyAhPT0gSW5zdGFsbGVyOjpFUlJPUl9BVURJVF9GQUlMRUQpIHsKaWYgKCRzdGF0dXMgPT09IEluc3RhbGxlcjo6RVJST1JfREVQRU5ERU5DWV9SRVNPTFVUSU9OX0ZBSUxFRCkgewpmb3JlYWNoICgkdGhpcy0+bm9ybWFsaXplUmVxdWlyZW1lbnRzKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2VzJykpIGFzICRyZXEpIHsKaWYgKCFpc3NldCgkcmVxWyd2ZXJzaW9uJ10pKSB7CiRpby0+d3JpdGVFcnJvcignWW91IGNhbiBhbHNvIHRyeSByZS1ydW5uaW5nIGNvbXBvc2VyIHJlcXVpcmUgd2l0aCBhbiBleHBsaWNpdCB2ZXJzaW9uIGNvbnN0cmFpbnQsIGUuZy4gImNvbXBvc2VyIHJlcXVpcmUgJy4kcmVxWyduYW1lJ10uJzoqIiB0byBmaWd1cmUgb3V0IGlmIGFueSB2ZXJzaW9uIGlzIGluc3RhbGxhYmxlLCBvciAiY29tcG9zZXIgcmVxdWlyZSAnLiRyZXFbJ25hbWUnXS4nOl4yLjEiIGlmIHlvdSBrbm93IHdoaWNoIHlvdSBuZWVkLicpOwpicmVhazsKfQp9Cn0KJHRoaXMtPnJldmVydENvbXBvc2VyRmlsZSgpOwp9CgpyZXR1cm4gJHN0YXR1czsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVSZXF1aXJlbWVudHNBZnRlclJlc29sdXRpb24oYXJyYXkgJHJlcXVpcmVtZW50c1RvVXBkYXRlLCBzdHJpbmcgJHJlcXVpcmVLZXksIHN0cmluZyAkcmVtb3ZlS2V5LCBib29sICRzb3J0UGFja2FnZXMsIGJvb2wgJGRyeVJ1biwgYm9vbCAkZml4ZWQpOiBpbnQKewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRsb2NrZXIgPSAkY29tcG9zZXItPmdldExvY2tlcigpOwokcmVxdWlyZW1lbnRzID0gW107CiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKG5ldyBSZXBvc2l0b3J5U2V0KCkpOwokcmVwbyA9ICRsb2NrZXItPmlzTG9ja2VkKCkgPyAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpIDogJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKZm9yZWFjaCAoJHJlcXVpcmVtZW50c1RvVXBkYXRlIGFzICRwYWNrYWdlTmFtZSkgewokcGFja2FnZSA9ICRyZXBvLT5maW5kUGFja2FnZSgkcGFja2FnZU5hbWUsICcqJyk7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBQYWNrYWdlSW50ZXJmYWNlKSB7CmNvbnRpbnVlOwp9CgppZiAoJGZpeGVkKSB7CiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZSB7CiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRSZWNvbW1lbmRlZFJlcXVpcmVWZXJzaW9uKCRwYWNrYWdlKTsKfQokdGhpcy0+Z2V0SU8oKS0+d3JpdGVFcnJvcihzcHJpbnRmKAonVXNpbmcgdmVyc2lvbiA8aW5mbz4lczwvaW5mbz4gZm9yIDxpbmZvPiVzPC9pbmZvPicsCiRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSwKJHBhY2thZ2VOYW1lCikpOwoKaWYgKFByZWc6OmlzTWF0Y2goJ3teZGV2LSg/IW1haW4kfG1hc3RlciR8dHJ1bmskfGxhdGVzdCQpfScsICRyZXF1aXJlbWVudHNbJHBhY2thZ2VOYW1lXSkpIHsKJHRoaXMtPmdldElPKCktPndhcm5pbmcoJ1ZlcnNpb24gJy4kcmVxdWlyZW1lbnRzWyRwYWNrYWdlTmFtZV0uJyBsb29rcyBsaWtlIGl0IG1heSBiZSBhIGZlYXR1cmUgYnJhbmNoIHdoaWNoIGlzIHVubGlrZWx5IHRvIGtlZXAgd29ya2luZyBpbiB0aGUgbG9uZyBydW4gYW5kIG1heSBiZSBpbiBhbiB1bnN0YWJsZSBzdGF0ZScpOwppZiAoJHRoaXMtPmdldElPKCktPmlzSW50ZXJhY3RpdmUoKSAmJiAhJHRoaXMtPmdldElPKCktPmFza0NvbmZpcm1hdGlvbignQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIHVzZSB0aGlzIGNvbnN0cmFpbnQgKDxjb21tZW50Pnk8L2NvbW1lbnQ+KSBvciB3b3VsZCB5b3UgcmF0aGVyIGFib3J0ICg8Y29tbWVudD5uPC9jb21tZW50PikgdGhlIHdob2xlIG9wZXJhdGlvbiBbPGNvbW1lbnQ+eSxuPC9jb21tZW50Pl0/ICcpKSB7CiR0aGlzLT5yZXZlcnRDb21wb3NlckZpbGUoKTsKCnJldHVybiAxOwp9Cn0KfQoKaWYgKCEkZHJ5UnVuKSB7CiR0aGlzLT51cGRhdGVGaWxlKCR0aGlzLT5qc29uLCAkcmVxdWlyZW1lbnRzLCAkcmVxdWlyZUtleSwgJHJlbW92ZUtleSwgJHNvcnRQYWNrYWdlcyk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpICYmICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnbG9jaycpKSB7CiRzdGFiaWxpdHlGbGFncyA9IFJvb3RQYWNrYWdlTG9hZGVyOjpleHRyYWN0U3RhYmlsaXR5RmxhZ3MoJHJlcXVpcmVtZW50cywgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgW10pOwokbG9ja2VyLT51cGRhdGVIYXNoKCR0aGlzLT5qc29uLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRsb2NrRGF0YSkgdXNlICgkc3RhYmlsaXR5RmxhZ3MpIHsKZm9yZWFjaCAoJHN0YWJpbGl0eUZsYWdzIGFzICRwYWNrYWdlTmFtZSA9PiAkZmxhZykgewokbG9ja0RhdGFbJ3N0YWJpbGl0eS1mbGFncyddWyRwYWNrYWdlTmFtZV0gPSAkZmxhZzsKfQoKcmV0dXJuICRsb2NrRGF0YTsKfSk7Cn0KfQoKcmV0dXJuIDA7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlRmlsZShKc29uRmlsZSAkanNvbiwgYXJyYXkgJG5ldywgc3RyaW5nICRyZXF1aXJlS2V5LCBzdHJpbmcgJHJlbW92ZUtleSwgYm9vbCAkc29ydFBhY2thZ2VzKTogdm9pZAp7CmlmICgkdGhpcy0+dXBkYXRlRmlsZUNsZWFubHkoJGpzb24sICRuZXcsICRyZXF1aXJlS2V5LCAkcmVtb3ZlS2V5LCAkc29ydFBhY2thZ2VzKSkgewpyZXR1cm47Cn0KCiRjb21wb3NlckRlZmluaXRpb24gPSAkdGhpcy0+anNvbi0+cmVhZCgpOwpmb3JlYWNoICgkbmV3IGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CiRjb21wb3NlckRlZmluaXRpb25bJHJlcXVpcmVLZXldWyRwYWNrYWdlXSA9ICR2ZXJzaW9uOwp1bnNldCgkY29tcG9zZXJEZWZpbml0aW9uWyRyZW1vdmVLZXldWyRwYWNrYWdlXSk7CmlmIChpc3NldCgkY29tcG9zZXJEZWZpbml0aW9uWyRyZW1vdmVLZXldKSAmJiBjb3VudCgkY29tcG9zZXJEZWZpbml0aW9uWyRyZW1vdmVLZXldKSA9PT0gMCkgewp1bnNldCgkY29tcG9zZXJEZWZpbml0aW9uWyRyZW1vdmVLZXldKTsKfQp9CiR0aGlzLT5qc29uLT53cml0ZSgkY29tcG9zZXJEZWZpbml0aW9uKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVGaWxlQ2xlYW5seShKc29uRmlsZSAkanNvbiwgYXJyYXkgJG5ldywgc3RyaW5nICRyZXF1aXJlS2V5LCBzdHJpbmcgJHJlbW92ZUtleSwgYm9vbCAkc29ydFBhY2thZ2VzKTogYm9vbAp7CiRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRqc29uLT5nZXRQYXRoKCkpOwoKJG1hbmlwdWxhdG9yID0gbmV3IEpzb25NYW5pcHVsYXRvcigkY29udGVudHMpOwoKZm9yZWFjaCAoJG5ldyBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewppZiAoISRtYW5pcHVsYXRvci0+YWRkTGluaygkcmVxdWlyZUtleSwgJHBhY2thZ2UsICRjb25zdHJhaW50LCAkc29ydFBhY2thZ2VzKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCEkbWFuaXB1bGF0b3ItPnJlbW92ZVN1Yk5vZGUoJHJlbW92ZUtleSwgJHBhY2thZ2UpKSB7CnJldHVybiBmYWxzZTsKfQp9CgokbWFuaXB1bGF0b3ItPnJlbW92ZU1haW5LZXlJZkVtcHR5KCRyZW1vdmVLZXkpOwoKZmlsZV9wdXRfY29udGVudHMoJGpzb24tPmdldFBhdGgoKSwgJG1hbmlwdWxhdG9yLT5nZXRDb250ZW50cygpKTsKCnJldHVybiB0cnVlOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW50ZXJhY3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJldmVydENvbXBvc2VyRmlsZSgpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJHRoaXMtPm5ld2x5Q3JlYXRlZCkgewokaW8tPndyaXRlRXJyb3IoIlxuIi4nPGVycm9yPkluc3RhbGxhdGlvbiBmYWlsZWQsIGRlbGV0aW5nICcuJHRoaXMtPmZpbGUuJy48L2Vycm9yPicpOwp1bmxpbmsoJHRoaXMtPmpzb24tPmdldFBhdGgoKSk7CmlmIChmaWxlX2V4aXN0cygkdGhpcy0+bG9jaykpIHsKdW5saW5rKCR0aGlzLT5sb2NrKTsKfQp9IGVsc2UgewokbXNnID0gJyB0byBpdHMgJzsKaWYgKCR0aGlzLT5sb2NrQmFja3VwKSB7CiRtc2cgPSAnIGFuZCAnLiR0aGlzLT5sb2NrLicgdG8gdGhlaXIgJzsKfQokaW8tPndyaXRlRXJyb3IoIlxuIi4nPGVycm9yPkluc3RhbGxhdGlvbiBmYWlsZWQsIHJldmVydGluZyAnLiR0aGlzLT5maWxlLiRtc2cuJ29yaWdpbmFsIGNvbnRlbnQuPC9lcnJvcj4nKTsKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmpzb24tPmdldFBhdGgoKSwgJHRoaXMtPmNvbXBvc2VyQmFja3VwKTsKaWYgKCR0aGlzLT5sb2NrQmFja3VwKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5sb2NrLCAkdGhpcy0+bG9ja0JhY2t1cCk7Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcU2NyaXB0XEV2ZW50IGFzIFNjcmlwdEV2ZW50Owp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBSdW5TY3JpcHRDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKCgpwcm90ZWN0ZWQgJHNjcmlwdEV2ZW50cyA9IFsKU2NyaXB0RXZlbnRzOjpQUkVfSU5TVEFMTF9DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9JTlNUQUxMX0NNRCwKU2NyaXB0RXZlbnRzOjpQUkVfVVBEQVRFX0NNRCwKU2NyaXB0RXZlbnRzOjpQT1NUX1VQREFURV9DTUQsClNjcmlwdEV2ZW50czo6UFJFX1NUQVRVU19DTUQsClNjcmlwdEV2ZW50czo6UE9TVF9TVEFUVVNfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfUk9PVF9QQUNLQUdFX0lOU1RBTEwsClNjcmlwdEV2ZW50czo6UE9TVF9DUkVBVEVfUFJPSkVDVF9DTUQsClNjcmlwdEV2ZW50czo6UFJFX0FSQ0hJVkVfQ01ELApTY3JpcHRFdmVudHM6OlBPU1RfQVJDSElWRV9DTUQsClNjcmlwdEV2ZW50czo6UFJFX0FVVE9MT0FEX0RVTVAsClNjcmlwdEV2ZW50czo6UE9TVF9BVVRPTE9BRF9EVU1QLApdOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdydW4tc2NyaXB0JykKLT5zZXRBbGlhc2VzKFsncnVuJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1J1bnMgdGhlIHNjcmlwdHMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3NjcmlwdCcsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAnU2NyaXB0IG5hbWUgdG8gcnVuLicsIG51bGwsIGZ1bmN0aW9uICgpIHsKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRzY3JpcHQpIHsgcmV0dXJuICRzY3JpcHRbJ25hbWUnXTsgfSwgJHRoaXMtPmdldFNjcmlwdHMoKSk7Cn0pLApuZXcgSW5wdXRBcmd1bWVudCgnYXJncycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICcnKSwKbmV3IElucHV0T3B0aW9uKCd0aW1lb3V0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnU2V0cyBzY3JpcHQgdGltZW91dCBpbiBzZWNvbmRzLCBvciAwIGZvciBuZXZlci4nKSwKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NldHMgdGhlIGRldiBtb2RlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgdGhlIGRldiBtb2RlLicpLApuZXcgSW5wdXRPcHRpb24oJ2xpc3QnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBzY3JpcHRzLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+cnVuLXNjcmlwdDwvaW5mbz4gY29tbWFuZCBydW5zIHNjcmlwdHMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgcnVuLXNjcmlwdCBwb3N0LXVwZGF0ZS1jbWQ8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNydW4tc2NyaXB0LXJ1bgpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnRlcmFjdChJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRzY3JpcHRzID0gJHRoaXMtPmdldFNjcmlwdHMoKTsKaWYgKGNvdW50KCRzY3JpcHRzKSA9PT0gMCkgewpyZXR1cm47Cn0KCmlmICgkaW5wdXQtPmdldEFyZ3VtZW50KCdzY3JpcHQnKSAhPT0gbnVsbCB8fCAkaW5wdXQtPmdldE9wdGlvbignbGlzdCcpKSB7CnJldHVybjsKfQoKJG9wdGlvbnMgPSBbXTsKZm9yZWFjaCAoJHNjcmlwdHMgYXMgJHNjcmlwdCkgewokb3B0aW9uc1skc2NyaXB0WyduYW1lJ11dID0gJHNjcmlwdFsnZGVzY3JpcHRpb24nXTsKfQokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHNjcmlwdCA9ICRpby0+c2VsZWN0KAonU2NyaXB0IHRvIHJ1bjogJywKJG9wdGlvbnMsCicnLAoxLAonSW52YWxpZCBzY3JpcHQgbmFtZSAiJXMiJwopOwoKJGlucHV0LT5zZXRBcmd1bWVudCgnc2NyaXB0JywgJHNjcmlwdCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewpyZXR1cm4gJHRoaXMtPmxpc3RTY3JpcHRzKCRvdXRwdXQpOwp9Cgokc2NyaXB0ID0gJGlucHV0LT5nZXRBcmd1bWVudCgnc2NyaXB0Jyk7CmlmICgkc2NyaXB0ID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCAic2NyaXB0IicpOwp9CgppZiAoIWluX2FycmF5KCRzY3JpcHQsICR0aGlzLT5zY3JpcHRFdmVudHMpKSB7CmlmIChkZWZpbmVkKCdDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOjonLnN0cl9yZXBsYWNlKCctJywgJ18nLCBzdHJ0b3VwcGVyKCRzY3JpcHQpKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU2NyaXB0ICIlcyIgY2Fubm90IGJlIHJ1biB3aXRoIHRoaXMgY29tbWFuZCcsICRzY3JpcHQpKTsKfQp9CgokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7CiRkZXZNb2RlID0gJGlucHV0LT5nZXRPcHRpb24oJ2RldicpIHx8ICEkaW5wdXQtPmdldE9wdGlvbignbm8tZGV2Jyk7CiRldmVudCA9IG5ldyBTY3JpcHRFdmVudCgkc2NyaXB0LCAkY29tcG9zZXIsICR0aGlzLT5nZXRJTygpLCAkZGV2TW9kZSk7CiRoYXNMaXN0ZW5lcnMgPSAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5oYXNFdmVudExpc3RlbmVycygkZXZlbnQpOwppZiAoISRoYXNMaXN0ZW5lcnMpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignU2NyaXB0ICIlcyIgaXMgbm90IGRlZmluZWQgaW4gdGhpcyBwYWNrYWdlJywgJHNjcmlwdCkpOwp9CgokYXJncyA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ2FyZ3MnKTsKCmlmIChudWxsICE9PSAkdGltZW91dCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCd0aW1lb3V0JykpIHsKaWYgKCFjdHlwZV9kaWdpdCgkdGltZW91dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaW1lb3V0IHZhbHVlIG11c3QgYmUgbnVtZXJpYyBhbmQgcG9zaXRpdmUgaWYgZGVmaW5lZCwgb3IgMCBmb3IgZm9yZXZlcicpOwp9CgpQcm9jZXNzRXhlY3V0b3I6OnNldFRpbWVvdXQoKGludCkgJHRpbWVvdXQpOwp9CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9ERVZfTU9ERScsICRkZXZNb2RlID8gJzEnIDogJzAnKTsKCnJldHVybiAkY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaFNjcmlwdCgkc2NyaXB0LCAkZGV2TW9kZSwgJGFyZ3MpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGlzdFNjcmlwdHMoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewokc2NyaXB0cyA9ICR0aGlzLT5nZXRTY3JpcHRzKCk7CmlmIChjb3VudCgkc2NyaXB0cykgPT09IDApIHsKcmV0dXJuIDA7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokaW8tPndyaXRlRXJyb3IoJzxpbmZvPnNjcmlwdHM6PC9pbmZvPicpOwokdGFibGUgPSBbXTsKZm9yZWFjaCAoJHNjcmlwdHMgYXMgJHNjcmlwdCkgewokdGFibGVbXSA9IFsnICAnLiRzY3JpcHRbJ25hbWUnXSwgJHNjcmlwdFsnZGVzY3JpcHRpb24nXV07Cn0KCiR0aGlzLT5yZW5kZXJUYWJsZSgkdGFibGUsICRvdXRwdXQpOwoKcmV0dXJuIDA7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheQp7CiRzY3JpcHRzID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRQYWNrYWdlKCktPmdldFNjcmlwdHMoKTsKaWYgKGNvdW50KCRzY3JpcHRzKSA9PT0gMCkgewpyZXR1cm4gW107Cn0KCiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJHNjcmlwdHMgYXMgJG5hbWUgPT4gJHNjcmlwdCkgewokZGVzY3JpcHRpb24gPSAnJzsKdHJ5IHsKJGNtZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCRuYW1lKTsKJGRlc2NyaXB0aW9uID0gJGNtZC0+Z2V0RGVzY3JpcHRpb24oKTsKfSBjYXRjaCAoXFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiAkZSkgewoKfQokcmVzdWx0W10gPSBbJ25hbWUnID0+ICRuYW1lLCAnZGVzY3JpcHRpb24nID0+ICRkZXNjcmlwdGlvbl07Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKY2xhc3MgU2NyaXB0QWxpYXNDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewoKcHJpdmF0ZSAkc2NyaXB0OwoKcHJpdmF0ZSAkZGVzY3JpcHRpb247Cgpwcml2YXRlICRhbGlhc2VzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc2NyaXB0LCA/c3RyaW5nICRkZXNjcmlwdGlvbiwgYXJyYXkgJGFsaWFzZXMgPSBbXSkKewokdGhpcy0+c2NyaXB0ID0gJHNjcmlwdDsKJHRoaXMtPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uID8/ICdSdW5zIHRoZSAnLiRzY3JpcHQuJyBzY3JpcHQgYXMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uJzsKJHRoaXMtPmFsaWFzZXMgPSAkYWxpYXNlczsKCmZvcmVhY2ggKCR0aGlzLT5hbGlhc2VzIGFzICRhbGlhcykgewppZiAoIWlzX3N0cmluZygkYWxpYXMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCcic2NyaXB0cy1hbGlhc2VzIiBlbGVtZW50IGFycmF5IHZhbHVlcyBzaG91bGQgY29udGFpbiBvbmx5IHN0cmluZ3MnKTsKfQp9CgokdGhpcy0+aWdub3JlVmFsaWRhdGlvbkVycm9ycygpOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJHRoaXMtPnNjcmlwdCkKLT5zZXREZXNjcmlwdGlvbigkdGhpcy0+ZGVzY3JpcHRpb24pCi0+c2V0QWxpYXNlcygkdGhpcy0+YWxpYXNlcykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0T3B0aW9uKCdkZXYnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NldHMgdGhlIGRldiBtb2RlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgdGhlIGRldiBtb2RlLicpLApuZXcgSW5wdXRBcmd1bWVudCgnYXJncycsIElucHV0QXJndW1lbnQ6OklTX0FSUkFZIHwgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICcnKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPnJ1bi1zY3JpcHQ8L2luZm8+IGNvbW1hbmQgcnVucyBzY3JpcHRzIGRlZmluZWQgaW4gY29tcG9zZXIuanNvbjoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHJ1bi1zY3JpcHQgcG9zdC11cGRhdGUtY21kPC9pbmZvPgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjcnVuLXNjcmlwdC1ydW4KRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbXBvc2VyID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpOwoKJGFyZ3MgPSAkaW5wdXQtPmdldEFyZ3VtZW50cygpOwoKCmlmICghbWV0aG9kX2V4aXN0cygkaW5wdXQsICdfX3RvU3RyaW5nJykpIHsgCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGFuIElucHV0IGluc3RhbmNlIHRoYXQgaXMgc3RyaW5nYWJsZSwgZ290ICcuZ2V0X2NsYXNzKCRpbnB1dCkpOwp9CgokZGV2TW9kZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdkZXYnKSB8fCAhJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpOwoKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfREVWX01PREUnLCAkZGV2TW9kZSA/ICcxJyA6ICcwJyk7CgpyZXR1cm4gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoJHRoaXMtPnNjcmlwdCwgJGRldk1vZGUsICRhcmdzWydhcmdzJ10sIFsnc2NyaXB0LWFsaWFzLWlucHV0JyA9PiBQcmVnOjpyZXBsYWNlKCd7XlxTKyA/fScsICcnLCAkaW5wdXQtPl9fdG9TdHJpbmcoKSwgMSldKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CgoKCgpjbGFzcyBTZWFyY2hDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3NlYXJjaCcpCi0+c2V0RGVzY3JpcHRpb24oJ1NlYXJjaGVzIGZvciBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbignb25seS1uYW1lJywgJ04nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NlYXJjaCBvbmx5IGluIHBhY2thZ2UgbmFtZXMnKSwKbmV3IElucHV0T3B0aW9uKCdvbmx5LXZlbmRvcicsICdPJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTZWFyY2ggb25seSBmb3IgdmVuZG9yIC8gb3JnYW5pemF0aW9uIG5hbWVzLCByZXR1cm5zIG9ubHkgInZlbmRvciIgYXMgcmVzdWx0JyksCm5ldyBJbnB1dE9wdGlvbigndHlwZScsICd0JywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnU2VhcmNoIGZvciBhIHNwZWNpZmljIHBhY2thZ2UgdHlwZScpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsICdmJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9ybWF0IG9mIHRoZSBvdXRwdXQ6IHRleHQgb3IganNvbicsICd0ZXh0JywgWydqc29uJywgJ3RleHQnXSksCm5ldyBJbnB1dEFyZ3VtZW50KCd0b2tlbnMnLCBJbnB1dEFyZ3VtZW50OjpJU19BUlJBWSB8IElucHV0QXJndW1lbnQ6OlJFUVVJUkVELCAndG9rZW5zIHRvIHNlYXJjaCBmb3InKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIHNlYXJjaCBjb21tYW5kIHNlYXJjaGVzIGZvciBwYWNrYWdlcyBieSBpdHMgbmFtZQo8aW5mbz5waHAgY29tcG9zZXIucGhhciBzZWFyY2ggc3ltZm9ueSBjb21wb3NlcjwvaW5mbz4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3NlYXJjaApFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewoKJHBsYXRmb3JtUmVwbyA9IG5ldyBQbGF0Zm9ybVJlcG9zaXRvcnk7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKJGZvcm1hdCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKTsKaWYgKCFpbl9hcnJheSgkZm9ybWF0LCBbJ3RleHQnLCAnanNvbiddKSkgewokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZignVW5zdXBwb3J0ZWQgZm9ybWF0ICIlcyIuIFNlZSBoZWxwIGZvciBzdXBwb3J0ZWQgZm9ybWF0cy4nLCAkZm9ybWF0KSk7CgpyZXR1cm4gMTsKfQoKaWYgKCEoJGNvbXBvc2VyID0gJHRoaXMtPnRyeUNvbXBvc2VyKCkpKSB7CiRjb21wb3NlciA9ICR0aGlzLT5jcmVhdGVDb21wb3Nlckluc3RhbmNlKCRpbnB1dCwgJHRoaXMtPmdldElPKCksIFtdKTsKfQokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJGluc3RhbGxlZFJlcG8gPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShbJGxvY2FsUmVwbywgJHBsYXRmb3JtUmVwb10pOwokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeShhcnJheV9tZXJnZShbJGluc3RhbGxlZFJlcG9dLCAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKSk7CgokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdzZWFyY2gnLCAkaW5wdXQsICRvdXRwdXQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkY29tbWFuZEV2ZW50LT5nZXROYW1lKCksICRjb21tYW5kRXZlbnQpOwoKJG1vZGUgPSBSZXBvc2l0b3J5SW50ZXJmYWNlOjpTRUFSQ0hfRlVMTFRFWFQ7CmlmICgkaW5wdXQtPmdldE9wdGlvbignb25seS1uYW1lJykgPT09IHRydWUpIHsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdvbmx5LXZlbmRvcicpID09PSB0cnVlKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLW9ubHktbmFtZSBhbmQgLS1vbmx5LXZlbmRvciBjYW5ub3QgYmUgdXNlZCB0b2dldGhlcicpOwp9CiRtb2RlID0gUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX05BTUU7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignb25seS12ZW5kb3InKSA9PT0gdHJ1ZSkgewokbW9kZSA9IFJlcG9zaXRvcnlJbnRlcmZhY2U6OlNFQVJDSF9WRU5ET1I7Cn0KCiR0eXBlID0gJGlucHV0LT5nZXRPcHRpb24oJ3R5cGUnKTsKCiRxdWVyeSA9IGltcGxvZGUoJyAnLCAkaW5wdXQtPmdldEFyZ3VtZW50KCd0b2tlbnMnKSk7CmlmICgkbW9kZSAhPT0gUmVwb3NpdG9yeUludGVyZmFjZTo6U0VBUkNIX0ZVTExURVhUKSB7CiRxdWVyeSA9IHByZWdfcXVvdGUoJHF1ZXJ5KTsKfQoKJHJlc3VsdHMgPSAkcmVwb3MtPnNlYXJjaCgkcXVlcnksICRtb2RlLCAkdHlwZSk7CgppZiAoXGNvdW50KCRyZXN1bHRzKSA+IDAgJiYgJGZvcm1hdCA9PT0gJ3RleHQnKSB7CiR3aWR0aCA9ICR0aGlzLT5nZXRUZXJtaW5hbFdpZHRoKCk7CgokbmFtZUxlbmd0aCA9IDA7CmZvcmVhY2ggKCRyZXN1bHRzIGFzICRyZXN1bHQpIHsKJG5hbWVMZW5ndGggPSBtYXgoc3RybGVuKCRyZXN1bHRbJ25hbWUnXSksICRuYW1lTGVuZ3RoKTsKfQokbmFtZUxlbmd0aCArPSAxOwpmb3JlYWNoICgkcmVzdWx0cyBhcyAkcmVzdWx0KSB7CiRkZXNjcmlwdGlvbiA9ICRyZXN1bHRbJ2Rlc2NyaXB0aW9uJ10gPz8gJyc7CiR3YXJuaW5nID0gIWVtcHR5KCRyZXN1bHRbJ2FiYW5kb25lZCddKSA/ICc8d2FybmluZz4hIEFiYW5kb25lZCAhPC93YXJuaW5nPiAnIDogJyc7CiRyZW1haW5pbmcgPSAkd2lkdGggLSAkbmFtZUxlbmd0aCAtIHN0cmxlbigkd2FybmluZykgLSAyOwppZiAoc3RybGVuKCRkZXNjcmlwdGlvbikgPiAkcmVtYWluaW5nKSB7CiRkZXNjcmlwdGlvbiA9IHN1YnN0cigkZGVzY3JpcHRpb24sIDAsICRyZW1haW5pbmcgLSAzKSAuICcuLi4nOwp9CgokbGluayA9ICRyZXN1bHRbJ3VybCddID8/IG51bGw7CmlmICgkbGluayAhPT0gbnVsbCkgewokaW8tPndyaXRlKCc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRsaW5rKS4nPicuJHJlc3VsdFsnbmFtZSddLic8Lz4nLiBzdHJfcmVwZWF0KCcgJywgJG5hbWVMZW5ndGggLSBzdHJsZW4oJHJlc3VsdFsnbmFtZSddKSkgLiAkd2FybmluZyAuICRkZXNjcmlwdGlvbik7Cn0gZWxzZSB7CiRpby0+d3JpdGUoc3RyX3BhZCgkcmVzdWx0WyduYW1lJ10sICRuYW1lTGVuZ3RoLCAnICcpIC4gJHdhcm5pbmcgLiAkZGVzY3JpcHRpb24pOwp9Cn0KfSBlbHNlaWYgKCRmb3JtYXQgPT09ICdqc29uJykgewokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJHJlc3VsdHMpKTsKfQoKcmV0dXJuIDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcU2VsZlVwZGF0ZVxLZXlzOwp1c2UgQ29tcG9zZXJcU2VsZlVwZGF0ZVxWZXJzaW9uczsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxGaWxlc3lzdGVtRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBQaGFyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwoKCgoKCgpjbGFzcyBTZWxmVXBkYXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKcHJpdmF0ZSBjb25zdCBIT01FUEFHRSA9ICdnZXRjb21wb3Nlci5vcmcnOwpwcml2YXRlIGNvbnN0IE9MRF9JTlNUQUxMX0VYVCA9ICctb2xkLnBoYXInOwoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdzZWxmLXVwZGF0ZScpCi0+c2V0QWxpYXNlcyhbJ3NlbGZ1cGRhdGUnXSkKLT5zZXREZXNjcmlwdGlvbignVXBkYXRlcyBjb21wb3Nlci5waGFyIHRvIHRoZSBsYXRlc3QgdmVyc2lvbicpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbigncm9sbGJhY2snLCAncicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmV2ZXJ0IHRvIGFuIG9sZGVyIGluc3RhbGxhdGlvbiBvZiBjb21wb3NlcicpLApuZXcgSW5wdXRPcHRpb24oJ2NsZWFuLWJhY2t1cHMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RlbGV0ZSBvbGQgYmFja3VwcyBkdXJpbmcgYW4gdXBkYXRlLiBUaGlzIG1ha2VzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgY29tcG9zZXIgdGhlIG9ubHkgYmFja3VwIGF2YWlsYWJsZSBhZnRlciB0aGUgdXBkYXRlJyksCm5ldyBJbnB1dEFyZ3VtZW50KCd2ZXJzaW9uJywgSW5wdXRBcmd1bWVudDo6T1BUSU9OQUwsICdUaGUgdmVyc2lvbiB0byB1cGRhdGUgdG8nKSwKbmV3IElucHV0T3B0aW9uKCduby1wcm9ncmVzcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBkb3dubG9hZCBwcm9ncmVzcy4nKSwKbmV3IElucHV0T3B0aW9uKCd1cGRhdGUta2V5cycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJvbXB0IHVzZXIgZm9yIGEga2V5IHVwZGF0ZScpLApuZXcgSW5wdXRPcHRpb24oJ3N0YWJsZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRm9yY2UgYW4gdXBkYXRlIHRvIHRoZSBzdGFibGUgY2hhbm5lbCcpLApuZXcgSW5wdXRPcHRpb24oJ3ByZXZpZXcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgcHJldmlldyBjaGFubmVsJyksCm5ldyBJbnB1dE9wdGlvbignc25hcHNob3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc25hcHNob3QgY2hhbm5lbCcpLApuZXcgSW5wdXRPcHRpb24oJzEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlIGFuIHVwZGF0ZSB0byB0aGUgc3RhYmxlIGNoYW5uZWwsIGJ1dCBvbmx5IHVzZSAxLnggdmVyc2lvbnMnKSwKbmV3IElucHV0T3B0aW9uKCcyJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHN0YWJsZSBjaGFubmVsLCBidXQgb25seSB1c2UgMi54IHZlcnNpb25zJyksCm5ldyBJbnB1dE9wdGlvbignMi4yJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZSBhbiB1cGRhdGUgdG8gdGhlIHN0YWJsZSBjaGFubmVsLCBidXQgb25seSB1c2UgMi4yLnggTFRTIHZlcnNpb25zJyksCm5ldyBJbnB1dE9wdGlvbignc2V0LWNoYW5uZWwtb25seScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBzdG9yZSB0aGUgY2hhbm5lbCBhcyB0aGUgZGVmYXVsdCBvbmUgYW5kIHRoZW4gZXhpdCcpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgPGluZm8+c2VsZi11cGRhdGU8L2luZm8+IGNvbW1hbmQgY2hlY2tzIGdldGNvbXBvc2VyLm9yZyBmb3IgbmV3ZXIKdmVyc2lvbnMgb2YgY29tcG9zZXIgYW5kIGlmIGZvdW5kLCBpbnN0YWxscyB0aGUgbGF0ZXN0LgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgc2VsZi11cGRhdGU8L2luZm8+CgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNzZWxmLXVwZGF0ZS1zZWxmdXBkYXRlCkVPVAopCjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CmlmIChzdHJwb3MoX19GSUxFX18sICdwaGFyOicpICE9PSAwKSB7CmlmIChzdHJfY29udGFpbnMoc3RydHIoX19ESVJfXywgJ1xcJywgJy8nKSwgJ3ZlbmRvci9jb21wb3Nlci9jb21wb3NlcicpKSB7CiRwcm9qRGlyID0gZGlybmFtZShfX0RJUl9fLCA2KTsKJG91dHB1dC0+d3JpdGVsbignPGVycm9yPlRoaXMgaW5zdGFuY2Ugb2YgQ29tcG9zZXIgZG9lcyBub3QgaGF2ZSB0aGUgc2VsZi11cGRhdGUgY29tbWFuZC48L2Vycm9yPicpOwokb3V0cHV0LT53cml0ZWxuKCc8Y29tbWVudD5Zb3UgYXJlIHJ1bm5pbmcgQ29tcG9zZXIgaW5zdGFsbGVkIGFzIGEgcGFja2FnZSBpbiB5b3VyIGN1cnJlbnQgcHJvamVjdCAoIicuJHByb2pEaXIuJyIpLjwvY29tbWVudD4nKTsKJG91dHB1dC0+d3JpdGVsbignPGNvbW1lbnQ+VG8gdXBkYXRlIENvbXBvc2VyLCBkb3dubG9hZCBhIGNvbXBvc2VyLnBoYXIgZnJvbSBodHRwczovL2dldGNvbXBvc2VyLm9yZyBhbmQgdGhlbiBydW4gYGNvbXBvc2VyLnBoYXIgdXBkYXRlIGNvbXBvc2VyL2NvbXBvc2VyYCBpbiB5b3VyIHByb2plY3QuPC9jb21tZW50PicpOwp9IGVsc2Ugewokb3V0cHV0LT53cml0ZWxuKCc8ZXJyb3I+VGhpcyBpbnN0YW5jZSBvZiBDb21wb3NlciBkb2VzIG5vdCBoYXZlIHRoZSBzZWxmLXVwZGF0ZSBjb21tYW5kLjwvZXJyb3I+Jyk7CiRvdXRwdXQtPndyaXRlbG4oJzxjb21tZW50PlRoaXMgY291bGQgYmUgZHVlIHRvIGEgbnVtYmVyIG9mIHJlYXNvbnMsIHN1Y2ggYXMgQ29tcG9zZXIgYmVpbmcgaW5zdGFsbGVkIGFzIGEgc3lzdGVtIHBhY2thZ2Ugb24geW91ciBPUywgb3IgQ29tcG9zZXIgYmVpbmcgaW5zdGFsbGVkIGFzIGEgcGFja2FnZSBpbiB0aGUgY3VycmVudCBwcm9qZWN0LjwvY29tbWVudD4nKTsKfQoKcmV0dXJuIDE7Cn0KCmlmICgkX1NFUlZFUlsnYXJndiddWzBdID09PSAnU3RhbmRhcmQgaW5wdXQgY29kZScpIHsKcmV0dXJuIDE7Cn0KCgoKY2xhc3NfZXhpc3RzKCdDb21wb3NlclxVdGlsXFBsYXRmb3JtJyk7CmNsYXNzX2V4aXN0cygnQ29tcG9zZXJcRG93bmxvYWRlclxGaWxlc3lzdGVtRXhjZXB0aW9uJyk7CgokY29uZmlnID0gRmFjdG9yeTo6Y3JlYXRlQ29uZmlnKCk7CgppZiAoJGNvbmZpZy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CiRiYXNlVXJsID0gJ2h0dHA6Ly8nIC4gc2VsZjo6SE9NRVBBR0U7Cn0gZWxzZSB7CiRiYXNlVXJsID0gJ2h0dHBzOi8vJyAuIHNlbGY6OkhPTUVQQUdFOwp9CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGh0dHBEb3dubG9hZGVyID0gRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJGlvLCAkY29uZmlnKTsKCiR2ZXJzaW9uc1V0aWwgPSBuZXcgVmVyc2lvbnMoJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyKTsKCgokcmVxdWVzdGVkQ2hhbm5lbCA9IG51bGw7CmZvcmVhY2ggKFZlcnNpb25zOjpDSEFOTkVMUyBhcyAkY2hhbm5lbCkgewppZiAoJGlucHV0LT5nZXRPcHRpb24oJGNoYW5uZWwpKSB7CiRyZXF1ZXN0ZWRDaGFubmVsID0gJGNoYW5uZWw7CiR2ZXJzaW9uc1V0aWwtPnNldENoYW5uZWwoJGNoYW5uZWwsICRpbyk7CmJyZWFrOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignc2V0LWNoYW5uZWwtb25seScpKSB7CnJldHVybiAwOwp9CgokY2FjaGVEaXIgPSAkY29uZmlnLT5nZXQoJ2NhY2hlLWRpcicpOwokcm9sbGJhY2tEaXIgPSAkY29uZmlnLT5nZXQoJ2RhdGEtZGlyJyk7CiRob21lID0gJGNvbmZpZy0+Z2V0KCdob21lJyk7CiRsb2NhbEZpbGVuYW1lID0gUGhhcjo6cnVubmluZyhmYWxzZSk7CmlmICgnJyA9PT0gJGxvY2FsRmlsZW5hbWUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBsb2NhdGlvbiBvZiB0aGUgY29tcG9zZXIucGhhciBmaWxlIGFzIGl0IGFwcGVhcnMgeW91IGFyZSBub3QgcnVubmluZyB0aGlzIGNvZGUgZnJvbSBhIHBoYXIgYXJjaGl2ZS4nKTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd1cGRhdGUta2V5cycpKSB7CiR0aGlzLT5mZXRjaEtleXMoJGlvLCAkY29uZmlnKTsKCnJldHVybiAwOwp9CgoKaWYgKCFmaWxlX2V4aXN0cygkbG9jYWxGaWxlbmFtZSkpIHsKdGhyb3cgbmV3IEZpbGVzeXN0ZW1FeGNlcHRpb24oJ0NvbXBvc2VyIHVwZGF0ZSBmYWlsZWQ6IHRoZSAiJy4kbG9jYWxGaWxlbmFtZS4nIiBpcyBub3QgYWNjZXNzaWJsZScpOwp9CgoKJHRtcERpciA9IGlzX3dyaXRhYmxlKGRpcm5hbWUoJGxvY2FsRmlsZW5hbWUpKSA/IGRpcm5hbWUoJGxvY2FsRmlsZW5hbWUpIDogJGNhY2hlRGlyOwoKCmlmICghaXNfd3JpdGFibGUoJHRtcERpcikpIHsKdGhyb3cgbmV3IEZpbGVzeXN0ZW1FeGNlcHRpb24oJ0NvbXBvc2VyIHVwZGF0ZSBmYWlsZWQ6IHRoZSAiJy4kdG1wRGlyLiciIGRpcmVjdG9yeSB1c2VkIHRvIGRvd25sb2FkIHRoZSB0ZW1wIGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4nKTsKfQoKCmlmIChmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRldWlkJykpIHsKJGNvbXBvc2VyVXNlciA9IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk7CiRob21lRGlyT3duZXJJZCA9IGZpbGVvd25lcigkaG9tZSk7CmlmIChpc19hcnJheSgkY29tcG9zZXJVc2VyKSAmJiAkaG9tZURpck93bmVySWQgIT09IGZhbHNlKSB7CiRob21lT3duZXIgPSBwb3NpeF9nZXRwd3VpZCgkaG9tZURpck93bmVySWQpOwppZiAoaXNfYXJyYXkoJGhvbWVPd25lcikgJiYgJGNvbXBvc2VyVXNlclsnbmFtZSddICE9PSAkaG9tZU93bmVyWyduYW1lJ10pIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHJ1bm5pbmcgQ29tcG9zZXIgYXMgIicuJGNvbXBvc2VyVXNlclsnbmFtZSddLiciLCB3aGlsZSAiJy4kaG9tZS4nIiBpcyBvd25lZCBieSAiJy4kaG9tZU93bmVyWyduYW1lJ10uJyI8L3dhcm5pbmc+Jyk7Cn0KfQp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3JvbGxiYWNrJykpIHsKcmV0dXJuICR0aGlzLT5yb2xsYmFjaygkb3V0cHV0LCAkcm9sbGJhY2tEaXIsICRsb2NhbEZpbGVuYW1lKTsKfQoKaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ2NvbW1hbmQnKSA9PT0gJ3NlbGYnICYmICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3ZlcnNpb24nKSA9PT0gJ3VwZGF0ZScpIHsKJGlucHV0LT5zZXRBcmd1bWVudCgndmVyc2lvbicsIG51bGwpOwp9CgokbGF0ZXN0ID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCk7CiRsYXRlc3RTdGFibGUgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoJ3N0YWJsZScpOwp0cnkgewokbGF0ZXN0UHJldmlldyA9ICR2ZXJzaW9uc1V0aWwtPmdldExhdGVzdCgncHJldmlldycpOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRsYXRlc3RQcmV2aWV3ID0gJGxhdGVzdFN0YWJsZTsKfQokbGF0ZXN0VmVyc2lvbiA9ICRsYXRlc3RbJ3ZlcnNpb24nXTsKJHVwZGF0ZVZlcnNpb24gPSAkaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJykgPz8gJGxhdGVzdFZlcnNpb247CiRjdXJyZW50TWFqb3JWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oXGQrKS4qfScsICckMScsIENvbXBvc2VyOjpnZXRWZXJzaW9uKCkpOwokdXBkYXRlTWFqb3JWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oXGQrKS4qfScsICckMScsICR1cGRhdGVWZXJzaW9uKTsKJHByZXZpZXdNYWpvclZlcnNpb24gPSBQcmVnOjpyZXBsYWNlKCd7XihcZCspLip9JywgJyQxJywgJGxhdGVzdFByZXZpZXdbJ3ZlcnNpb24nXSk7CgppZiAoJHZlcnNpb25zVXRpbC0+Z2V0Q2hhbm5lbCgpID09PSAnc3RhYmxlJyAmJiBudWxsID09PSAkaW5wdXQtPmdldEFyZ3VtZW50KCd2ZXJzaW9uJykpIHsKCgppZiAoJGN1cnJlbnRNYWpvclZlcnNpb24gPCAkdXBkYXRlTWFqb3JWZXJzaW9uKSB7CiRza2lwcGVkVmVyc2lvbiA9ICR1cGRhdGVWZXJzaW9uOwoKJHZlcnNpb25zVXRpbC0+c2V0Q2hhbm5lbCgkY3VycmVudE1ham9yVmVyc2lvbik7CgokbGF0ZXN0ID0gJHZlcnNpb25zVXRpbC0+Z2V0TGF0ZXN0KCk7CiRsYXRlc3RTdGFibGUgPSAkdmVyc2lvbnNVdGlsLT5nZXRMYXRlc3QoJ3N0YWJsZScpOwokbGF0ZXN0VmVyc2lvbiA9ICRsYXRlc3RbJ3ZlcnNpb24nXTsKJHVwZGF0ZVZlcnNpb24gPSAkbGF0ZXN0VmVyc2lvbjsKCiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBuZXcgc3RhYmxlIG1ham9yIHZlcnNpb24gb2YgQ29tcG9zZXIgaXMgYXZhaWxhYmxlICgnLiRza2lwcGVkVmVyc2lvbi4nKSwgcnVuICJjb21wb3NlciBzZWxmLXVwZGF0ZSAtLScuJHVwZGF0ZU1ham9yVmVyc2lvbi4nIiB0byB1cGRhdGUgdG8gaXQuIFNlZSBhbHNvIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnLycuJHVwZGF0ZU1ham9yVmVyc2lvbi4nPC93YXJuaW5nPicpOwp9IGVsc2VpZiAoJGN1cnJlbnRNYWpvclZlcnNpb24gPCAkcHJldmlld01ham9yVmVyc2lvbikgewoKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5BIHByZXZpZXcgcmVsZWFzZSBvZiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIENvbXBvc2VyIGlzIGF2YWlsYWJsZSAoJy4kbGF0ZXN0UHJldmlld1sndmVyc2lvbiddLicpLCBydW4gImNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tcHJldmlldyIgdG8gZ2l2ZSBpdCBhIHRyeS4gU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL3JlbGVhc2VzIGZvciBjaGFuZ2Vsb2dzLjwvd2FybmluZz4nKTsKfQp9CgokZWZmZWN0aXZlQ2hhbm5lbCA9ICRyZXF1ZXN0ZWRDaGFubmVsID09PSBudWxsID8gJHZlcnNpb25zVXRpbC0+Z2V0Q2hhbm5lbCgpIDogJHJlcXVlc3RlZENoYW5uZWw7CmlmIChpc19udW1lcmljKCRlZmZlY3RpdmVDaGFubmVsKSAmJiBzdHJwb3MoJGxhdGVzdFN0YWJsZVsndmVyc2lvbiddLCAkZWZmZWN0aXZlQ2hhbm5lbCkgIT09IDApIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5XYXJuaW5nOiBZb3UgZm9yY2VkIHRoZSBpbnN0YWxsIG9mICcuJGxhdGVzdFZlcnNpb24uJyB2aWEgLS0nLiRlZmZlY3RpdmVDaGFubmVsLicsIGJ1dCAnLiRsYXRlc3RTdGFibGVbJ3ZlcnNpb24nXS4nIGlzIHRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24uIFVwZGF0aW5nIHRvIGl0IHZpYSBjb21wb3NlciBzZWxmLXVwZGF0ZSAtLXN0YWJsZSBpcyByZWNvbW1lbmRlZC48L3dhcm5pbmc+Jyk7Cn0KaWYgKGlzc2V0KCRsYXRlc3RbJ2VvbCddKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPldhcm5pbmc6IFZlcnNpb24gJy4kbGF0ZXN0VmVyc2lvbi4nIGlzIEVPTCAvIEVuZCBvZiBMaWZlLiAnLiRsYXRlc3RTdGFibGVbJ3ZlcnNpb24nXS4nIGlzIHRoZSBsYXRlc3Qgc3RhYmxlIHZlcnNpb24uIFVwZGF0aW5nIHRvIGl0IHZpYSBjb21wb3NlciBzZWxmLXVwZGF0ZSAtLXN0YWJsZSBpcyByZWNvbW1lbmRlZC48L3dhcm5pbmc+Jyk7Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7XlswLTlhLWZdezQwfSR9JywgJHVwZGF0ZVZlcnNpb24pICYmICR1cGRhdGVWZXJzaW9uICE9PSAkbGF0ZXN0VmVyc2lvbikgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5Zb3UgY2FuIG5vdCB1cGRhdGUgdG8gYSBzcGVjaWZpYyBTSEEtMSBhcyB0aG9zZSBwaGFycyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgZG93bmxvYWQ8L2Vycm9yPicpOwoKcmV0dXJuIDE7Cn0KCiRjaGFubmVsU3RyaW5nID0gJHZlcnNpb25zVXRpbC0+Z2V0Q2hhbm5lbCgpOwppZiAoaXNfbnVtZXJpYygkY2hhbm5lbFN0cmluZykpIHsKJGNoYW5uZWxTdHJpbmcgLj0gJy54JzsKfQoKaWYgKENvbXBvc2VyOjpWRVJTSU9OID09PSAkdXBkYXRlVmVyc2lvbikgewokaW8tPndyaXRlRXJyb3IoCnNwcmludGYoCic8aW5mbz5Zb3UgYXJlIGFscmVhZHkgdXNpbmcgdGhlIGxhdGVzdCBhdmFpbGFibGUgQ29tcG9zZXIgdmVyc2lvbiAlcyAoJXMgY2hhbm5lbCkuPC9pbmZvPicsCiR1cGRhdGVWZXJzaW9uLAokY2hhbm5lbFN0cmluZwopCik7CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdjbGVhbi1iYWNrdXBzJykpIHsKJHRoaXMtPmNsZWFuQmFja3Vwcygkcm9sbGJhY2tEaXIsICR0aGlzLT5nZXRMYXN0QmFja3VwVmVyc2lvbigkcm9sbGJhY2tEaXIpKTsKfQoKcmV0dXJuIDA7Cn0KCiR0ZW1wRmlsZW5hbWUgPSAkdG1wRGlyIC4gJy8nIC4gYmFzZW5hbWUoJGxvY2FsRmlsZW5hbWUsICcucGhhcicpLictdGVtcCcucmFuZG9tX2ludCgwLCAxMDAwMDAwMCkuJy5waGFyJzsKJGJhY2t1cEZpbGUgPSBzcHJpbnRmKAonJXMvJXMtJXMlcycsCiRyb2xsYmFja0RpciwKc3RydHIoQ29tcG9zZXI6OlJFTEVBU0VfREFURSwgJyA6JywgJ18tJyksClByZWc6OnJlcGxhY2UoJ3teKFswLTlhLWZdezd9KVswLTlhLWZdezMzfSR9JywgJyQxJywgQ29tcG9zZXI6OlZFUlNJT04pLApzZWxmOjpPTERfSU5TVEFMTF9FWFQKKTsKCiR1cGRhdGluZ1RvVGFnID0gIVByZWc6OmlzTWF0Y2goJ3teWzAtOWEtZl17NDB9JH0nLCAkdXBkYXRlVmVyc2lvbik7CgokaW8tPndyaXRlKHNwcmludGYoIlVwZ3JhZGluZyB0byB2ZXJzaW9uIDxpbmZvPiVzPC9pbmZvPiAoJXMgY2hhbm5lbCkuIiwgJHVwZGF0ZVZlcnNpb24sICRjaGFubmVsU3RyaW5nKSk7CiRyZW1vdGVGaWxlbmFtZSA9ICRiYXNlVXJsIC4gKCR1cGRhdGluZ1RvVGFnID8gIi9kb3dubG9hZC97JHVwZGF0ZVZlcnNpb259L2NvbXBvc2VyLnBoYXIiIDogJy9jb21wb3Nlci5waGFyJyk7CnRyeSB7CiRzaWduYXR1cmUgPSAkaHR0cERvd25sb2FkZXItPmdldCgkcmVtb3RlRmlsZW5hbWUuJy5zaWcnKS0+Z2V0Qm9keSgpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVmVyc2lvbiAiJy4kdXBkYXRlVmVyc2lvbi4nIiBjb3VsZCBub3QgYmUgZm91bmQuJywgMCwgJGUpOwp9CnRocm93ICRlOwp9CiRpby0+d3JpdGVFcnJvcignICAgJywgZmFsc2UpOwokaHR0cERvd25sb2FkZXItPmNvcHkoJHJlbW90ZUZpbGVuYW1lLCAkdGVtcEZpbGVuYW1lKTsKJGlvLT53cml0ZUVycm9yKCcnKTsKCmlmICghZmlsZV9leGlzdHMoJHRlbXBGaWxlbmFtZSkgfHwgbnVsbCA9PT0gJHNpZ25hdHVyZSB8fCAnJyA9PT0gJHNpZ25hdHVyZSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgZG93bmxvYWQgb2YgdGhlIG5ldyBjb21wb3NlciB2ZXJzaW9uIGZhaWxlZCBmb3IgYW4gdW5leHBlY3RlZCByZWFzb248L2Vycm9yPicpOwoKcmV0dXJuIDE7Cn0KCgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSAmJiAkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGluZyBwaGFyIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gYXMgeW91IGhhdmUgZGlzYWJsZWQgT3BlblNTTCB2aWEgY29uZmlnLmRpc2FibGUtdGxzPC93YXJuaW5nPicpOwp9IGVsc2UgewppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBvcGVuc3NsIGV4dGVuc2lvbiBpcyByZXF1aXJlZCBmb3IgcGhhciBzaWduYXR1cmVzIHRvIGJlIHZlcmlmaWVkIGJ1dCBpdCBpcyBub3QgYXZhaWxhYmxlLiAnCi4gJ0lmIHlvdSBjYW4gbm90IGVuYWJsZSB0aGUgb3BlbnNzbCBleHRlbnNpb24sIHlvdSBjYW4gZGlzYWJsZSB0aGlzIGVycm9yLCBhdCB5b3VyIG93biByaXNrLCBieSBzZXR0aW5nIHRoZSBcJ2Rpc2FibGUtdGxzXCcgb3B0aW9uIHRvIHRydWUuJyk7Cn0KCiRzaWdGaWxlID0gJ2ZpbGU6Ly8nLiRob21lLicvJyAuICgkdXBkYXRpbmdUb1RhZyA/ICdrZXlzLnRhZ3MucHViJyA6ICdrZXlzLmRldi5wdWInKTsKaWYgKCFmaWxlX2V4aXN0cygkc2lnRmlsZSkpIHsKZmlsZV9wdXRfY29udGVudHMoCiRob21lLicva2V5cy5kZXYucHViJywKPDw8REVWUFVCS0VZCi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tCk1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBbkJESGpaUzZlMFpNb0szeFREN2YKRk5DemxYalgvQWllMmRpdDhRWEEwM3BTck9UYmFNbnhPTjNoVUw0N0x6M2cxU0M2WUpFTVZIcjB6WXE0ZWxXaQppM2VjRkVnekxjaitwWk01WDZxV3UyT3p6NHZXeDNKWW8xL2EvSFlkT3VXOWUzbHdTOFZ0UzBBVkpBK1U4WDBBCmhabkJtR3BsdEhoTzhoUEtIZ2tKdGtUVXhDaGVUY2JxbjR3R0hsOFoyU2VkaURjUFRMd3FleldLVWZyWXp1MWYKby9qM1dGd0ZzNkd0SzR3ZFl0aVhyK3lzcEJaSE8zeTF1ZGY4ZUZGR2NiMlYzRWFMT3J0ZnVyNlhRVml6ak91awo4bHc1enpzZTFRcC9rbEhxYkRSc2pTeko2aUw2RjRheW5CYzZFdXF0LzhjY05BSXowckxqTGhPcmFleWo0ZU5uCjhpb2t3TUtpWHBjclFMVEtIK1JIMUpDdU9WeFE0MzZiSndiU3NwMVZ3aXFmdFBRaWVOK3R6cXkrRWlISkptR2YKVEJBYldjbmNpY0NrOXEybWQrQW1oTmJ2SE80UFdiYno5VHpDN0hKYjQ2MGp5V2V1TUV2dzNnTklwRW8yallhOQpwTVY2Y1ZxblNhK3dPYzBEN3BDOWE2Ym5lMGJ2TGNtM1MrdzZJNWlEQjNsWnNiM0E5VXRSaVNQN2FHU283RDcyCjh0QzgrY0lnWmNJN2s5dmp2T3FIK2Q3c2RPVTJ5UENuUlk2d0ZoNjIvZzhiRG5VcHI1Nm5aTjFHODlHd000ZDQKci9UVTdCUVFJenNaZ0FpcU9HWHZWa2xJZ0FNaVYwaXVjZ2Yzck5CTGpqZU5Fd05TVFRHOUYwQ3RRKzdKTHdhRQp3U0V1QXVSbStwUnFpOEJSblEvR0tVY0NBd0VBQVE9PQotLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0KREVWUFVCS0VZCik7CgpmaWxlX3B1dF9jb250ZW50cygKJGhvbWUuJy9rZXlzLnRhZ3MucHViJywKPDw8VEFHU1BVQktFWQotLS0tLUJFR0lOIFBVQkxJQyBLRVktLS0tLQpNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQTBWaS8ySzZhcENWajc2bkNuQ2wyCk1RVVBkSytBOWVxa1lCYWNYbzJ3UUJZbXlWbFhtMi9uL1pzWDZwQ0xZUFFUSHlyNWpYYmtRekJ3OFNLcVBkbGgKdkE3TnBiTWVOQ3o3d1AvQW9idlVYTTh4UXVYS2JNRFRZMnVaNE83c00rUGZHYnB0S1BCR0xlOFo4ZDJzVW5UTwpiWHRYNkxyajEzd2tSdG83c3Qvdy9ZcDMzUkhlOVNscWtpaVM0TXNIMWpCa2NJa0VIc1JhdmVaemVkVWF4WTBNCm1iYTB1UGhHVUlucFB6RUh3cllxQkJFdFd2UDk3dDJ2dGZ4OEk1cXYyOGtoMFk2dCtqbmpMMVVyaWQyaXVRWmYKbm9DTUZJT3U0dmtzSzVIeEp4eHJOMEdPbUdtd1ZRak9PdHhrd2lrTmlvdFpHUFI0S3NWajhObkJyTFg3b0d1TQpuUXZHY2lpdStLb0MycjNIREJycERlQlZkT1d4RHpUNVI0aUkwS29MekZoMnBLcXdiWStvYk5QUzJiaisyZGdKCnJWM1Y1SmpyeTQyUU9DQk4zYzg4d1UxUEtmdE9MajJFQ3Bld1k2dm5FNDc4SWlwaUV1N0VBZEs4WndqMkxtVHIKUktRVVNhOWs3Z2dCa1laV0FlTy8yQWcwZXkzZzJiZzdlcWsrc0hFcTV5bklYZDVsaHY2dEM1UEJkSGxXaXBESwp0bDJJeGlFbmVqbk9tQXpHVml2RTFZR2R1WUJqTittanhEVnk4S0dCcmpuejFKUGdBdmdkd0oyZFl3NFJzYy9lClR6Q0ZXR2svSE02YTRmMEl6QldiSjVvdDBQSWk0YW1rMDdJb3RCWERXd3FEaVFUd3l1R0N5bTVFcVdRMkJEOTUKUkd2ODlCUEQrMkRMbkp5c25nc3ZWYVVDQXdFQUFRPT0KLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tClRBR1NQVUJLRVkKKTsKfQoKJHB1YmtleWlkID0gb3BlbnNzbF9wa2V5X2dldF9wdWJsaWMoJHNpZ0ZpbGUpOwppZiAoZmFsc2UgPT09ICRwdWJrZXlpZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCBsb2FkaW5nIHRoZSBwdWJsaWMga2V5IGZyb20gJy4kc2lnRmlsZSk7Cn0KJGFsZ28gPSBkZWZpbmVkKCdPUEVOU1NMX0FMR09fU0hBMzg0JykgPyBPUEVOU1NMX0FMR09fU0hBMzg0IDogJ1NIQTM4NCc7CmlmICghaW5fYXJyYXkoJ3NoYTM4NCcsIGFycmF5X21hcCgnc3RydG9sb3dlcicsIG9wZW5zc2xfZ2V0X21kX21ldGhvZHMoKSksIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignU0hBMzg0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgeW91ciBvcGVuc3NsIGV4dGVuc2lvbiwgY291bGQgbm90IHZlcmlmeSB0aGUgcGhhciBmaWxlIGludGVncml0eScpOwp9CiRzaWduYXR1cmVEYXRhID0ganNvbl9kZWNvZGUoJHNpZ25hdHVyZSwgdHJ1ZSk7CiRzaWduYXR1cmVTaGEzODQgPSBiYXNlNjRfZGVjb2RlKCRzaWduYXR1cmVEYXRhWydzaGEzODQnXSwgdHJ1ZSk7CmlmIChmYWxzZSA9PT0gJHNpZ25hdHVyZVNoYTM4NCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCBsb2FkaW5nIHRoZSBwaGFyIHNpZ25hdHVyZSBmcm9tICcuJHJlbW90ZUZpbGVuYW1lLicuc2lnLCBnb3QgJy4kc2lnbmF0dXJlKTsKfQokdmVyaWZpZWQgPSAxID09PSBvcGVuc3NsX3ZlcmlmeSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkdGVtcEZpbGVuYW1lKSwgJHNpZ25hdHVyZVNoYTM4NCwgJHB1YmtleWlkLCAkYWxnbyk7CgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CgpvcGVuc3NsX2ZyZWVfa2V5KCRwdWJrZXlpZCk7Cn0KCmlmICghJHZlcmlmaWVkKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBoYXIgc2lnbmF0dXJlIGRpZCBub3QgbWF0Y2ggdGhlIGZpbGUgeW91IGRvd25sb2FkZWQsIHRoaXMgbWVhbnMgeW91ciBwdWJsaWMga2V5cyBhcmUgb3V0ZGF0ZWQgb3IgdGhhdCB0aGUgcGhhciBmaWxlIGlzIGNvcnJ1cHQvaGFzIGJlZW4gbW9kaWZpZWQnKTsKfQp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdjbGVhbi1iYWNrdXBzJykpIHsKJHRoaXMtPmNsZWFuQmFja3Vwcygkcm9sbGJhY2tEaXIpOwp9CgppZiAoISR0aGlzLT5zZXRMb2NhbFBoYXIoJGxvY2FsRmlsZW5hbWUsICR0ZW1wRmlsZW5hbWUsICRiYWNrdXBGaWxlKSkgewpAdW5saW5rKCR0ZW1wRmlsZW5hbWUpOwoKcmV0dXJuIDE7Cn0KCmlmIChmaWxlX2V4aXN0cygkYmFja3VwRmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoCidVc2UgPGluZm8+Y29tcG9zZXIgc2VsZi11cGRhdGUgLS1yb2xsYmFjazwvaW5mbz4gdG8gcmV0dXJuIHRvIHZlcnNpb24gPGNvbW1lbnQ+JXM8L2NvbW1lbnQ+JywKQ29tcG9zZXI6OlZFUlNJT04KKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBiYWNrdXAgb2YgdGhlIGN1cnJlbnQgdmVyc2lvbiBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byAnLiRiYWNrdXBGaWxlLicsIG5vIHJvbGxiYWNrIHBvc3NpYmxlPC93YXJuaW5nPicpOwp9CgpyZXR1cm4gMDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoS2V5cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnKTogdm9pZAp7CmlmICghJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdQdWJsaWMga2V5cyBjYW4gbm90IGJlIGZldGNoZWQgaW4gbm9uLWludGVyYWN0aXZlIG1vZGUsIHBsZWFzZSBydW4gQ29tcG9zZXIgaW50ZXJhY3RpdmVseScpOwp9CgokaW8tPndyaXRlKCdPcGVuIDxpbmZvPmh0dHBzOi8vY29tcG9zZXIuZ2l0aHViLmlvL3B1YmtleXMuaHRtbDwvaW5mbz4gdG8gZmluZCB0aGUgbGF0ZXN0IGtleXMnKTsKCiR2YWxpZGF0b3IgPSBzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSk6IHN0cmluZyB7CiR2YWx1ZSA9IChzdHJpbmcpICR2YWx1ZTsKaWYgKCFQcmVnOjppc01hdGNoKCd7Xi0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tJH0nLCB0cmltKCR2YWx1ZSkpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIGlucHV0Jyk7Cn0KCnJldHVybiB0cmltKCR2YWx1ZSkuIlxuIjsKfTsKCiRkZXZLZXkgPSAnJzsKd2hpbGUgKCFQcmVnOjppc01hdGNoKCd7KC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tLis/LS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tKX1zJywgJGRldktleSwgJG1hdGNoKSkgewokZGV2S2V5ID0gJGlvLT5hc2tBbmRWYWxpZGF0ZSgnRW50ZXIgRGV2IC8gU25hcHNob3QgUHVibGljIEtleSAoaW5jbHVkaW5nIGxpbmVzIHdpdGggLS0tLS0pOiAnLCAkdmFsaWRhdG9yKTsKd2hpbGUgKCRsaW5lID0gJGlvLT5hc2soJycsICcnKSkgewokZGV2S2V5IC49IHRyaW0oJGxpbmUpLiJcbiI7CmlmICh0cmltKCRsaW5lKSA9PT0gJy0tLS0tRU5EIFBVQkxJQyBLRVktLS0tLScpIHsKYnJlYWs7Cn0KfQp9CmZpbGVfcHV0X2NvbnRlbnRzKCRrZXlQYXRoID0gJGNvbmZpZy0+Z2V0KCdob21lJykuJy9rZXlzLmRldi5wdWInLCAkbWF0Y2hbMF0pOwokaW8tPndyaXRlKCdTdG9yZWQga2V5IHdpdGggZmluZ2VycHJpbnQ6ICcgLiBLZXlzOjpmaW5nZXJwcmludCgka2V5UGF0aCkpOwoKJHRhZ3NLZXkgPSAnJzsKd2hpbGUgKCFQcmVnOjppc01hdGNoKCd7KC0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tLis/LS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tKX1zJywgJHRhZ3NLZXksICRtYXRjaCkpIHsKJHRhZ3NLZXkgPSAkaW8tPmFza0FuZFZhbGlkYXRlKCdFbnRlciBUYWdzIFB1YmxpYyBLZXkgKGluY2x1ZGluZyBsaW5lcyB3aXRoIC0tLS0tKTogJywgJHZhbGlkYXRvcik7CndoaWxlICgkbGluZSA9ICRpby0+YXNrKCcnLCAnJykpIHsKJHRhZ3NLZXkgLj0gdHJpbSgkbGluZSkuIlxuIjsKaWYgKHRyaW0oJGxpbmUpID09PSAnLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tJykgewpicmVhazsKfQp9Cn0KZmlsZV9wdXRfY29udGVudHMoJGtleVBhdGggPSAkY29uZmlnLT5nZXQoJ2hvbWUnKS4nL2tleXMudGFncy5wdWInLCAkbWF0Y2hbMF0pOwokaW8tPndyaXRlKCdTdG9yZWQga2V5IHdpdGggZmluZ2VycHJpbnQ6ICcgLiBLZXlzOjpmaW5nZXJwcmludCgka2V5UGF0aCkpOwoKJGlvLT53cml0ZSgnUHVibGljIGtleXMgc3RvcmVkIGluICcuJGNvbmZpZy0+Z2V0KCdob21lJykpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcm9sbGJhY2soT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIHN0cmluZyAkcm9sbGJhY2tEaXIsIHN0cmluZyAkbG9jYWxGaWxlbmFtZSk6IGludAp7CiRyb2xsYmFja1ZlcnNpb24gPSAkdGhpcy0+Z2V0TGFzdEJhY2t1cFZlcnNpb24oJHJvbGxiYWNrRGlyKTsKaWYgKG51bGwgPT09ICRyb2xsYmFja1ZlcnNpb24pIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NvbXBvc2VyIHJvbGxiYWNrIGZhaWxlZDogbm8gaW5zdGFsbGF0aW9uIHRvIHJvbGwgYmFjayB0byBpbiAiJy4kcm9sbGJhY2tEaXIuJyInKTsKfQoKJG9sZEZpbGUgPSAkcm9sbGJhY2tEaXIgLiAnLycgLiAkcm9sbGJhY2tWZXJzaW9uIC4gc2VsZjo6T0xEX0lOU1RBTExfRVhUOwoKaWYgKCFpc19maWxlKCRvbGRGaWxlKSkgewp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbignQ29tcG9zZXIgcm9sbGJhY2sgZmFpbGVkOiAiJy4kb2xkRmlsZS4nIiBjb3VsZCBub3QgYmUgZm91bmQnKTsKfQppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJG9sZEZpbGUpKSB7CnRocm93IG5ldyBGaWxlc3lzdGVtRXhjZXB0aW9uKCdDb21wb3NlciByb2xsYmFjayBmYWlsZWQ6ICInLiRvbGRGaWxlLiciIGNvdWxkIG5vdCBiZSByZWFkJyk7Cn0KCiRpbyA9ICR0aGlzLT5nZXRJTygpOwokaW8tPndyaXRlRXJyb3Ioc3ByaW50ZigiUm9sbGluZyBiYWNrIHRvIHZlcnNpb24gPGluZm8+JXM8L2luZm8+LiIsICRyb2xsYmFja1ZlcnNpb24pKTsKaWYgKCEkdGhpcy0+c2V0TG9jYWxQaGFyKCRsb2NhbEZpbGVuYW1lLCAkb2xkRmlsZSkpIHsKcmV0dXJuIDE7Cn0KCnJldHVybiAwOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0TG9jYWxQaGFyKHN0cmluZyAkbG9jYWxGaWxlbmFtZSwgc3RyaW5nICRuZXdGaWxlbmFtZSwgP3N0cmluZyAkYmFja3VwVGFyZ2V0ID0gbnVsbCk6IGJvb2wKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHBlcm1zID0gQGZpbGVwZXJtcygkbG9jYWxGaWxlbmFtZSk7CmlmICgkcGVybXMgIT09IGZhbHNlKSB7CkBjaG1vZCgkbmV3RmlsZW5hbWUsICRwZXJtcyk7Cn0KCgppZiAoISR0aGlzLT52YWxpZGF0ZVBoYXIoJG5ld0ZpbGVuYW1lLCAkZXJyb3IpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSAnLigkYmFja3VwVGFyZ2V0ICE9PSBudWxsID8gJ3VwZGF0ZScgOiAnYmFja3VwJykuJyBmaWxlIGlzIGNvcnJ1cHRlZCAoJy4kZXJyb3IuJyk8L2Vycm9yPicpOwoKaWYgKCRiYWNrdXBUYXJnZXQgIT09IG51bGwpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+UGxlYXNlIHJlLXJ1biB0aGUgc2VsZi11cGRhdGUgY29tbWFuZCB0byB0cnkgYWdhaW4uPC9lcnJvcj4nKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKCRiYWNrdXBUYXJnZXQgIT09IG51bGwpIHsKQGNvcHkoJGxvY2FsRmlsZW5hbWUsICRiYWNrdXBUYXJnZXQpOwp9Cgp0cnkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CgoKY29weSgkbmV3RmlsZW5hbWUsICRsb2NhbEZpbGVuYW1lKTsKQHVubGluaygkbmV3RmlsZW5hbWUpOwp9IGVsc2UgewpyZW5hbWUoJG5ld0ZpbGVuYW1lLCAkbG9jYWxGaWxlbmFtZSk7Cn0KCnJldHVybiB0cnVlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CgppZiAoIWlzX3dyaXRhYmxlKGRpcm5hbWUoJGxvY2FsRmlsZW5hbWUpKQomJiAkaW8tPmlzSW50ZXJhY3RpdmUoKQomJiAkdGhpcy0+aXNXaW5kb3dzTm9uQWRtaW5Vc2VyKCkpIHsKcmV0dXJuICR0aGlzLT50cnlBc1dpbmRvd3NBZG1pbigkbG9jYWxGaWxlbmFtZSwgJG5ld0ZpbGVuYW1lKTsKfQoKQHVubGluaygkbmV3RmlsZW5hbWUpOwokYWN0aW9uID0gJ0NvbXBvc2VyICcuKCRiYWNrdXBUYXJnZXQgIT09IG51bGwgPyAndXBkYXRlJyA6ICdyb2xsYmFjaycpOwp0aHJvdyBuZXcgRmlsZXN5c3RlbUV4Y2VwdGlvbigkYWN0aW9uLicgZmFpbGVkOiAiJy4kbG9jYWxGaWxlbmFtZS4nIiBjb3VsZCBub3QgYmUgd3JpdHRlbi4nLlBIUF9FT0wuJGUtPmdldE1lc3NhZ2UoKSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNsZWFuQmFja3VwcyhzdHJpbmcgJHJvbGxiYWNrRGlyLCA/c3RyaW5nICRleGNlcHQgPSBudWxsKTogdm9pZAp7CiRmaW5kZXIgPSAkdGhpcy0+Z2V0T2xkSW5zdGFsbGF0aW9uRmluZGVyKCRyb2xsYmFja0Rpcik7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwokZnMgPSBuZXcgRmlsZXN5c3RlbTsKCmZvcmVhY2ggKCRmaW5kZXIgYXMgJGZpbGUpIHsKaWYgKCRmaWxlLT5nZXRCYXNlbmFtZShzZWxmOjpPTERfSU5TVEFMTF9FWFQpID09PSAkZXhjZXB0KSB7CmNvbnRpbnVlOwp9CiRmaWxlID0gKHN0cmluZykgJGZpbGU7CiRpby0+d3JpdGVFcnJvcignPGluZm8+UmVtb3Zpbmc6ICcuJGZpbGUuJzwvaW5mbz4nKTsKJGZzLT5yZW1vdmUoJGZpbGUpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRMYXN0QmFja3VwVmVyc2lvbihzdHJpbmcgJHJvbGxiYWNrRGlyKTogP3N0cmluZwp7CiRmaW5kZXIgPSAkdGhpcy0+Z2V0T2xkSW5zdGFsbGF0aW9uRmluZGVyKCRyb2xsYmFja0Rpcik7CiRmaW5kZXItPnNvcnRCeU5hbWUoKTsKJGZpbGVzID0gaXRlcmF0b3JfdG9fYXJyYXkoJGZpbmRlcik7CgppZiAoY291bnQoJGZpbGVzKSA+IDApIHsKcmV0dXJuIGVuZCgkZmlsZXMpLT5nZXRCYXNlbmFtZShzZWxmOjpPTERfSU5TVEFMTF9FWFQpOwp9CgpyZXR1cm4gbnVsbDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldE9sZEluc3RhbGxhdGlvbkZpbmRlcihzdHJpbmcgJHJvbGxiYWNrRGlyKTogRmluZGVyCnsKcmV0dXJuIEZpbmRlcjo6Y3JlYXRlKCkKLT5kZXB0aCgwKQotPmZpbGVzKCkKLT5uYW1lKCcqJyAuIHNlbGY6Ok9MRF9JTlNUQUxMX0VYVCkKLT5pbigkcm9sbGJhY2tEaXIpOwp9CgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVQaGFyKHN0cmluZyAkcGhhckZpbGUsID9zdHJpbmcgJiRlcnJvcik6IGJvb2wKewppZiAoKGJvb2wpIGluaV9nZXQoJ3BoYXIucmVhZG9ubHknKSkgewpyZXR1cm4gdHJ1ZTsKfQoKdHJ5IHsKCiRwaGFyID0gbmV3IFBoYXIoJHBoYXJGaWxlKTsKCnVuc2V0KCRwaGFyKTsKJHJlc3VsdCA9IHRydWU7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCEkZSBpbnN0YW5jZW9mIFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJiYgISRlIGluc3RhbmNlb2YgXFBoYXJFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KJGVycm9yID0gJGUtPmdldE1lc3NhZ2UoKTsKJHJlc3VsdCA9IGZhbHNlOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzV2luZG93c05vbkFkbWluVXNlcigpOiBib29sCnsKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKZXhlYygnZmx0bWMuZXhlIGZpbHRlcnMnLCAkb3V0cHV0LCAkZXhpdENvZGUpOwoKcmV0dXJuICRleGl0Q29kZSAhPT0gMDsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRyeUFzV2luZG93c0FkbWluKHN0cmluZyAkbG9jYWxGaWxlbmFtZSwgc3RyaW5nICRuZXdGaWxlbmFtZSk6IGJvb2wKewokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCiRpby0+d3JpdGVFcnJvcignPGVycm9yPlVuYWJsZSB0byB3cml0ZSAiJy4kbG9jYWxGaWxlbmFtZS4nIi4gQWNjZXNzIGlzIGRlbmllZC48L2Vycm9yPicpOwokaGVscE1lc3NhZ2UgPSAnUGxlYXNlIHJ1biB0aGUgc2VsZi11cGRhdGUgY29tbWFuZCBhcyBhbiBBZG1pbmlzdHJhdG9yLic7CiRxdWVzdGlvbiA9ICdDb21wbGV0ZSB0aGlzIG9wZXJhdGlvbiB3aXRoIEFkbWluaXN0cmF0b3IgcHJpdmlsZWdlcyBbPGNvbW1lbnQ+WSxuPC9jb21tZW50Pl0/ICc7CgppZiAoISRpby0+YXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbiwgdHJ1ZSkpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5PcGVyYXRpb24gY2FuY2VsbGVkLiAnLiRoZWxwTWVzc2FnZS4nPC93YXJuaW5nPicpOwoKcmV0dXJuIGZhbHNlOwp9CgokdG1wRmlsZSA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnJyk7CmlmIChmYWxzZSA9PT0gJHRtcEZpbGUpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+T3BlcmF0aW9uIGZhaWxlZC4gJy4kaGVscE1lc3NhZ2UuJzwvZXJyb3I+Jyk7CgpyZXR1cm4gZmFsc2U7Cn0KCmV4ZWMoJ3N1ZG8gY29uZmlnIDI+IE5VTCcsICRvdXRwdXQsICRleGl0Q29kZSk7CiR1c2luZ1N1ZG8gPSAkZXhpdENvZGUgPT09IDA7Cgokc2NyaXB0ID0gJHVzaW5nU3VkbyA/ICR0bXBGaWxlLicuYmF0JyA6ICR0bXBGaWxlLicudmJzJzsKcmVuYW1lKCR0bXBGaWxlLCAkc2NyaXB0KTsKCiRjaGVja3N1bSA9IGhhc2hfZmlsZSgnc2hhMjU2JywgJG5ld0ZpbGVuYW1lKTsKCgokc291cmNlID0gc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCAkbmV3RmlsZW5hbWUpOwokZGVzdGluYXRpb24gPSBzdHJfcmVwbGFjZSgnLycsICdcXCcsICRsb2NhbEZpbGVuYW1lKTsKCmlmICgkdXNpbmdTdWRvKSB7CiRjb2RlID0gc3ByaW50ZignbW92ZSAiJXMiICIlcyInLCAkc291cmNlLCAkZGVzdGluYXRpb24pOwp9IGVsc2UgewokY29kZSA9IDw8PEVPVApTZXQgVUFDID0gQ3JlYXRlT2JqZWN0KCJTaGVsbC5BcHBsaWNhdGlvbiIpClVBQy5TaGVsbEV4ZWN1dGUgImNtZC5leGUiLCAiL2MgbW92ZSAveSAiIiRzb3VyY2UiIiAiIiRkZXN0aW5hdGlvbiIiIiwgIiIsICJydW5hcyIsIDAKRU9UOwp9CgpmaWxlX3B1dF9jb250ZW50cygkc2NyaXB0LCAkY29kZSk7CiRjb21tYW5kID0gJHVzaW5nU3VkbyA/IHNwcmludGYoJ3N1ZG8gIiVzIicsICRzY3JpcHQpIDogc3ByaW50ZignIiVzIicsICRzY3JpcHQpOwpleGVjKCRjb21tYW5kKTsKCgp1c2xlZXAoMzAwMDAwKTsKQHVubGluaygkc2NyaXB0KTsKCgppZiAoJHJlc3VsdCA9IEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGxvY2FsRmlsZW5hbWUpICYmIChoYXNoX2ZpbGUoJ3NoYTI1NicsICRsb2NhbEZpbGVuYW1lKSA9PT0gJGNoZWNrc3VtKSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk9wZXJhdGlvbiBzdWNjZWVkZWQuPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5PcGVyYXRpb24gZmFpbGVkLiAnLiRoZWxwTWVzc2FnZS4nPC9lcnJvcj4nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29tbWFuZDsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxEZWZhdWx0UG9saWN5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblNlbGVjdG9yOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGx1Z2luXENvbW1hbmRFdmVudDsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zZXJSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxDb21wb3NpdGVSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxGaWx0ZXJSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5VXRpbHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcU2VtdmVyOwp1c2UgQ29tcG9zZXJcU3BkeFxTcGR4TGljZW5zZXM7CnVzZSBDb21wb3NlclxVdGlsXFBhY2thZ2VJbmZvOwp1c2UgRGF0ZVRpbWVJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyU3R5bGU7CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCgoKCmNsYXNzIFNob3dDb21tYW5kIGV4dGVuZHMgQmFzZUNvbW1hbmQKewp1c2UgQ29tcGxldGlvblRyYWl0OwoKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkY29sb3JzOwoKCnByaXZhdGUgJHJlcG9zaXRvcnlTZXQ7Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCk6IHZvaWQKewokdGhpcwotPnNldE5hbWUoJ3Nob3cnKQotPnNldEFsaWFzZXMoWydpbmZvJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1Nob3dzIGluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2VzJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2UnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1BhY2thZ2UgdG8gaW5zcGVjdC4gT3IgYSBuYW1lIGluY2x1ZGluZyBhIHdpbGRjYXJkICgqKSB0byBmaWx0ZXIgbGlzdHMgb2YgcGFja2FnZXMgaW5zdGVhZC4nLCBudWxsLCAkdGhpcy0+c3VnZ2VzdFBhY2thZ2VCYXNlZE9uTW9kZSgpKSwKbmV3IElucHV0QXJndW1lbnQoJ3ZlcnNpb24nLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1ZlcnNpb24gb3IgdmVyc2lvbiBjb25zdHJhaW50IHRvIGluc3BlY3QnKSwKbmV3IElucHV0T3B0aW9uKCdhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgYWxsIHBhY2thZ2VzJyksCm5ldyBJbnB1dE9wdGlvbignbG9ja2VkJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IGFsbCBsb2NrZWQgcGFja2FnZXMnKSwKbmV3IElucHV0T3B0aW9uKCdpbnN0YWxsZWQnLCAnaScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBpbnN0YWxsZWQgcGFja2FnZXMgb25seSAoZW5hYmxlZCBieSBkZWZhdWx0LCBvbmx5IHByZXNlbnQgZm9yIEJDKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwbGF0Zm9ybScsICdwJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdMaXN0IHBsYXRmb3JtIHBhY2thZ2VzIG9ubHknKSwKbmV3IElucHV0T3B0aW9uKCdhdmFpbGFibGUnLCAnYScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnTGlzdCBhdmFpbGFibGUgcGFja2FnZXMgb25seScpLApuZXcgSW5wdXRPcHRpb24oJ3NlbGYnLCAncycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyB0aGUgcm9vdCBwYWNrYWdlIGluZm9ybWF0aW9uJyksCm5ldyBJbnB1dE9wdGlvbignbmFtZS1vbmx5JywgJ04nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgcGFja2FnZSBuYW1lcyBvbmx5JyksCm5ldyBJbnB1dE9wdGlvbigncGF0aCcsICdQJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IHBhY2thZ2UgcGF0aHMnKSwKbmV3IElucHV0T3B0aW9uKCd0cmVlJywgJ3QnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0xpc3QgdGhlIGRlcGVuZGVuY2llcyBhcyBhIHRyZWUnKSwKbmV3IElucHV0T3B0aW9uKCdsYXRlc3QnLCAnbCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyB0aGUgbGF0ZXN0IHZlcnNpb24nKSwKbmV3IElucHV0T3B0aW9uKCdvdXRkYXRlZCcsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IHRoZSBsYXRlc3QgdmVyc2lvbiBidXQgb25seSBmb3IgcGFja2FnZXMgdGhhdCBhcmUgb3V0ZGF0ZWQnKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgc3BlY2lmaWVkIHBhY2thZ2UocykuIENhbiBjb250YWluIHdpbGRjYXJkcyAoKikuIFVzZSBpdCB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbiBpZiB5b3UgZG9uXCd0IHdhbnQgdG8gYmUgaW5mb3JtZWQgYWJvdXQgbmV3IHZlcnNpb25zIG9mIHNvbWUgcGFja2FnZXMuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RJbnN0YWxsZWRQYWNrYWdlKGZhbHNlKSksCm5ldyBJbnB1dE9wdGlvbignbWFqb3Itb25seScsICdNJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTaG93IG9ubHkgcGFja2FnZXMgdGhhdCBoYXZlIG1ham9yIFNlbVZlci1jb21wYXRpYmxlIHVwZGF0ZXMuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdtaW5vci1vbmx5JywgJ20nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgbWlub3IgU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4gVXNlIHdpdGggdGhlIC0tbGF0ZXN0IG9yIC0tb3V0ZGF0ZWQgb3B0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3BhdGNoLW9ubHknLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3cgb25seSBwYWNrYWdlcyB0aGF0IGhhdmUgcGF0Y2ggU2VtVmVyLWNvbXBhdGlibGUgdXBkYXRlcy4gVXNlIHdpdGggdGhlIC0tbGF0ZXN0IG9yIC0tb3V0ZGF0ZWQgb3B0aW9uLicpLApuZXcgSW5wdXRPcHRpb24oJ3NvcnQtYnktYWdlJywgJ0EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXlzIHRoZSBpbnN0YWxsZWQgdmVyc2lvblwncyBhZ2UsIGFuZCBzb3J0cyBwYWNrYWdlcyBvbGRlc3QgZmlyc3QuIFVzZSB3aXRoIHRoZSAtLWxhdGVzdCBvciAtLW91dGRhdGVkIG9wdGlvbi4nKSwKbmV3IElucHV0T3B0aW9uKCdkaXJlY3QnLCAnRCcsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvd3Mgb25seSBwYWNrYWdlcyB0aGF0IGFyZSBkaXJlY3RseSByZXF1aXJlZCBieSB0aGUgcm9vdCBwYWNrYWdlJyksCm5ldyBJbnB1dE9wdGlvbignc3RyaWN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdSZXR1cm4gYSBub24temVybyBleGl0IGNvZGUgd2hlbiB0aGVyZSBhcmUgb3V0ZGF0ZWQgcGFja2FnZXMnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCAnZicsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0Zvcm1hdCBvZiB0aGUgb3V0cHV0OiB0ZXh0IG9yIGpzb24nLCAndGV4dCcsIFsnanNvbicsICd0ZXh0J10pLApuZXcgSW5wdXRPcHRpb24oJ25vLWRldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRGlzYWJsZXMgc2VhcmNoIGluIHJlcXVpcmUtZGV2IHBhY2thZ2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXEnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQgfCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVksICdJZ25vcmUgYSBzcGVjaWZpYyBwbGF0Zm9ybSByZXF1aXJlbWVudCAocGhwICYgZXh0LSBwYWNrYWdlcykuIFVzZSB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuIFVzZSB3aXRoIHRoZSAtLW91dGRhdGVkIG9wdGlvbicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgc2hvdyBjb21tYW5kIGRpc3BsYXlzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgcGFja2FnZSwgb3IKbGlzdHMgYWxsIHBhY2thZ2VzIGF2YWlsYWJsZS4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3Nob3ctaW5mbwpFT1QKKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzdWdnZXN0UGFja2FnZUJhc2VkT25Nb2RlKCk6IFxDbG9zdXJlCnsKcmV0dXJuIGZ1bmN0aW9uIChDb21wbGV0aW9uSW5wdXQgJGlucHV0KSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignYXZhaWxhYmxlJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpKSB7CnJldHVybiAkdGhpcy0+c3VnZ2VzdEF2YWlsYWJsZVBhY2thZ2VJbmNsUGxhdGZvcm0oKSgkaW5wdXQpOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpIHsKcmV0dXJuICR0aGlzLT5zdWdnZXN0UGxhdGZvcm1QYWNrYWdlKCkoJGlucHV0KTsKfQoKcmV0dXJuICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkoJGlucHV0KTsKfTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXI7CmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpKSB7CiR0aGlzLT5pbml0U3R5bGVzKCRvdXRwdXQpOwp9CgokY29tcG9zZXIgPSAkdGhpcy0+dHJ5Q29tcG9zZXIoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2luc3RhbGxlZCcpICYmICEkaW5wdXQtPmdldE9wdGlvbignc2VsZicpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gImluc3RhbGxlZCIuIE9ubHkgaW5zdGFsbGVkIHBhY2thZ2VzIGFyZSBzaG93biBieSBkZWZhdWx0IG5vdy4gVGhlIC0tYWxsIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzaG93IGFsbCBwYWNrYWdlcy48L3dhcm5pbmc+Jyk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSkgewokaW5wdXQtPnNldE9wdGlvbignbGF0ZXN0JywgdHJ1ZSk7Cn0gZWxzZWlmIChjb3VudCgkaW5wdXQtPmdldE9wdGlvbignaWdub3JlJykpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPllvdSBhcmUgdXNpbmcgdGhlIG9wdGlvbiAiaWdub3JlIiBmb3IgYWN0aW9uIG90aGVyIHRoYW4gIm91dGRhdGVkIiwgaXQgd2lsbCBiZSBpZ25vcmVkLjwvd2FybmluZz4nKTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSAmJiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSB8fCAkaW5wdXQtPmdldE9wdGlvbigncGxhdGZvcm0nKSkpIHsKJGlvLT53cml0ZUVycm9yKCdUaGUgLS1kaXJlY3QgKC1EKSBvcHRpb24gaXMgbm90IHVzYWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIC0tYWxsLCAtLXBsYXRmb3JtICgtcCkgb3IgLS1hdmFpbGFibGUgKC1hKScpOwoKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpICYmICgkaW5wdXQtPmdldE9wdGlvbignYWxsJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2F2YWlsYWJsZScpKSkgewokaW8tPndyaXRlRXJyb3IoJ1RoZSAtLXRyZWUgKC10KSBvcHRpb24gaXMgbm90IHVzYWJsZSBpbiBjb21iaW5hdGlvbiB3aXRoIC0tYWxsIG9yIC0tYXZhaWxhYmxlICgtYSknKTsKCnJldHVybiAxOwp9CgppZiAoY291bnQoYXJyYXlfZmlsdGVyKFskaW5wdXQtPmdldE9wdGlvbigncGF0Y2gtb25seScpLCAkaW5wdXQtPmdldE9wdGlvbignbWlub3Itb25seScpLCAkaW5wdXQtPmdldE9wdGlvbignbWFqb3Itb25seScpXSkpID4gMSkgewokaW8tPndyaXRlRXJyb3IoJ09ubHkgb25lIG9mIC0tbWFqb3Itb25seSwgLS1taW5vci1vbmx5IG9yIC0tcGF0Y2gtb25seSBjYW4gYmUgdXNlZCBhdCBvbmNlJyk7CgpyZXR1cm4gMTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd0cmVlJykgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpKSB7CiRpby0+d3JpdGVFcnJvcignVGhlIC0tdHJlZSAoLXQpIG9wdGlvbiBpcyBub3QgdXNhYmxlIGluIGNvbWJpbmF0aW9uIHdpdGggLS1sYXRlc3QgKC1sKScpOwoKcmV0dXJuIDE7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigndHJlZScpICYmICRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRoJykpIHsKJGlvLT53cml0ZUVycm9yKCdUaGUgLS10cmVlICgtdCkgb3B0aW9uIGlzIG5vdCB1c2FibGUgaW4gY29tYmluYXRpb24gd2l0aCAtLXBhdGggKC1QKScpOwoKcmV0dXJuIDE7Cn0KCiRmb3JtYXQgPSAkaW5wdXQtPmdldE9wdGlvbignZm9ybWF0Jyk7CmlmICghaW5fYXJyYXkoJGZvcm1hdCwgWyd0ZXh0JywgJ2pzb24nXSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJ1Vuc3VwcG9ydGVkIGZvcm1hdCAiJXMiLiBTZWUgaGVscCBmb3Igc3VwcG9ydGVkIGZvcm1hdHMuJywgJGZvcm1hdCkpOwoKcmV0dXJuIDE7Cn0KCiRwbGF0Zm9ybVJlcUZpbHRlciA9ICR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCk7CgoKJHBsYXRmb3JtT3ZlcnJpZGVzID0gW107CmlmICgkY29tcG9zZXIpIHsKJHBsYXRmb3JtT3ZlcnJpZGVzID0gJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdwbGF0Zm9ybScpOwp9CiRwbGF0Zm9ybVJlcG8gPSBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpOwokbG9ja2VkUmVwbyA9IG51bGw7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3NlbGYnKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2luc3RhbGxlZCcpICYmICEkaW5wdXQtPmdldE9wdGlvbignbG9ja2VkJykpIHsKJHBhY2thZ2UgPSBjbG9uZSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCktPmdldFBhY2thZ2UoKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSkgewokaW8tPndyaXRlKCRwYWNrYWdlLT5nZXROYW1lKCkpOwoKcmV0dXJuIDA7Cn0KaWYgKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignWW91IGNhbm5vdCB1c2UgLS1zZWxmIHRvZ2V0aGVyIHdpdGggYSBwYWNrYWdlIG5hbWUnKTsKfQokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFtuZXcgUm9vdFBhY2thZ2VSZXBvc2l0b3J5KCRwYWNrYWdlKV0pOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BsYXRmb3JtJykpIHsKJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHBsYXRmb3JtUmVwb10pOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2F2YWlsYWJsZScpKSB7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRwbGF0Zm9ybVJlcG9dKTsKaWYgKCRjb21wb3NlcikgewokcmVwb3MgPSBuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKTsKJGluc3RhbGxlZFJlcG8tPmFkZFJlcG9zaXRvcnkoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSk7Cn0gZWxzZSB7CiRkZWZhdWx0UmVwb3MgPSBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zV2l0aERlZmF1bHRNYW5hZ2VyKCRpbyk7CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KCRkZWZhdWx0UmVwb3MpOwokaW8tPndyaXRlRXJyb3IoJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBzaG93aW5nIGF2YWlsYWJsZSBwYWNrYWdlcyBmcm9tICcgLiBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJGRlZmF1bHRSZXBvcykpKTsKfQp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpICYmICRjb21wb3NlcikgewokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRsb2NrZWRSZXBvID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSh0cnVlKTsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2tlZFJlcG8sICRsb2NhbFJlcG8sICRwbGF0Zm9ybVJlcG9dKTsKfSBlbHNlIHsKJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJGxvY2FsUmVwbywgJHBsYXRmb3JtUmVwb10pOwp9CiRyZXBvcyA9IG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X21lcmdlKFtuZXcgRmlsdGVyUmVwb3NpdG9yeSgkaW5zdGFsbGVkUmVwbywgWydjYW5vbmljYWwnID0+IGZhbHNlXSldLCAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKSk7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignYWxsJykpIHsKJGRlZmF1bHRSZXBvcyA9IFJlcG9zaXRvcnlGYWN0b3J5OjpkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoJGlvKTsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgc2hvd2luZyBhdmFpbGFibGUgcGFja2FnZXMgZnJvbSAnIC4gaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCRkZWZhdWx0UmVwb3MpKSk7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRwbGF0Zm9ybVJlcG9dKTsKJHJlcG9zID0gbmV3IENvbXBvc2l0ZVJlcG9zaXRvcnkoYXJyYXlfbWVyZ2UoWyRpbnN0YWxsZWRSZXBvXSwgJGRlZmF1bHRSZXBvcykpOwp9IGVsc2VpZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CmlmICghJGNvbXBvc2VyIHx8ICEkY29tcG9zZXItPmdldExvY2tlcigpLT5pc0xvY2tlZCgpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdBIHZhbGlkIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2sgZmlsZXMgaXMgcmVxdWlyZWQgdG8gcnVuIHRoaXMgY29tbWFuZCB3aXRoIC0tbG9ja2VkJyk7Cn0KJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CiRsb2NrZWRSZXBvID0gJGxvY2tlci0+Z2V0TG9ja2VkUmVwb3NpdG9yeSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzZWxmJykpIHsKJGxvY2tlZFJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkpOwp9CiRyZXBvcyA9ICRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRsb2NrZWRSZXBvXSk7Cn0gZWxzZSB7CgppZiAoISRjb21wb3NlcikgewokY29tcG9zZXIgPSAkdGhpcy0+cmVxdWlyZUNvbXBvc2VyKCk7Cn0KJHJvb3RQa2cgPSAkY29tcG9zZXItPmdldFBhY2thZ2UoKTsKCiRyb290UmVwbyA9IG5ldyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkoKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzZWxmJykpIHsKJHJvb3RSZXBvID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkcm9vdFBrZyk7Cn0KaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCduby1kZXYnKSkgewokcGFja2FnZXMgPSBSZXBvc2l0b3J5VXRpbHM6OmZpbHRlclJlcXVpcmVkUGFja2FnZXMoJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSwgJHJvb3RQa2cpOwokcmVwb3MgPSAkaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskcm9vdFJlcG8sIG5ldyBJbnN0YWxsZWRBcnJheVJlcG9zaXRvcnkoYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHBrZyk6IFBhY2thZ2VJbnRlcmZhY2UgewpyZXR1cm4gY2xvbmUgJHBrZzsKfSwgJHBhY2thZ2VzKSldKTsKfSBlbHNlIHsKJHJlcG9zID0gJGluc3RhbGxlZFJlcG8gPSBuZXcgSW5zdGFsbGVkUmVwb3NpdG9yeShbJHJvb3RSZXBvLCAkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpXSk7Cn0KCmlmICghJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCkpIHsKJGhhc05vblBsYXRmb3JtUmVxcyA9IHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHJlcXMpOiBib29sIHsKcmV0dXJuIChib29sKSBhcnJheV9maWx0ZXIoYXJyYXlfa2V5cygkcmVxcyksIHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRuYW1lKSB7CnJldHVybiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbmFtZSk7Cn0pOwp9OwoKaWYgKCRoYXNOb25QbGF0Zm9ybVJlcXMoJHJvb3RQa2ctPmdldFJlcXVpcmVzKCkpIHx8ICRoYXNOb25QbGF0Zm9ybVJlcXMoJHJvb3RQa2ctPmdldERldlJlcXVpcmVzKCkpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gZGVwZW5kZW5jaWVzIGluc3RhbGxlZC4gVHJ5IHJ1bm5pbmcgY29tcG9zZXIgaW5zdGFsbCBvciB1cGRhdGUuPC93YXJuaW5nPicpOwp9Cn0KfQoKaWYgKCRjb21wb3NlcikgewokY29tbWFuZEV2ZW50ID0gbmV3IENvbW1hbmRFdmVudChQbHVnaW5FdmVudHM6OkNPTU1BTkQsICdzaG93JywgJGlucHV0LCAkb3V0cHV0KTsKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdsYXRlc3QnKSAmJiBudWxsID09PSAkY29tcG9zZXIpIHsKJGlvLT53cml0ZUVycm9yKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgZGlzYWJsaW5nICJsYXRlc3QiIG9wdGlvbicpOwokaW5wdXQtPnNldE9wdGlvbignbGF0ZXN0JywgZmFsc2UpOwp9CgokcGFja2FnZUZpbHRlciA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3BhY2thZ2UnKTsKCgppZiAoaXNzZXQoJHBhY2thZ2UpKSB7CiR2ZXJzaW9ucyA9IFskcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpID0+ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCldOwp9IGVsc2VpZiAobnVsbCAhPT0gJHBhY2thZ2VGaWx0ZXIgJiYgIXN0cl9jb250YWlucygkcGFja2FnZUZpbHRlciwgJyonKSkgewpbJHBhY2thZ2UsICR2ZXJzaW9uc10gPSAkdGhpcy0+Z2V0UGFja2FnZSgkaW5zdGFsbGVkUmVwbywgJHJlcG9zLCAkcGFja2FnZUZpbHRlciwgJGlucHV0LT5nZXRBcmd1bWVudCgndmVyc2lvbicpKTsKCmlmIChpc3NldCgkcGFja2FnZSkgJiYgJGlucHV0LT5nZXRPcHRpb24oJ2RpcmVjdCcpKSB7CmlmICghaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHRoaXMtPmdldFJvb3RSZXF1aXJlcygpLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiBpcyBpbnN0YWxsZWQgYnV0IG5vdCBhIGRpcmVjdCBkZXBlbmRlbnQgb2YgdGhlIHJvb3QgcGFja2FnZS4nKTsKfQp9CgppZiAoIWlzc2V0KCRwYWNrYWdlKSkgewokb3B0aW9ucyA9ICRpbnB1dC0+Z2V0T3B0aW9ucygpOwokaGludCA9ICcnOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xvY2tlZCcpKSB7CiRoaW50IC49ICcgaW4gbG9jayBmaWxlJzsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ3dvcmtpbmctZGlyJ10pKSB7CiRoaW50IC49ICcgaW4gJyAuICRvcHRpb25zWyd3b3JraW5nLWRpciddIC4gJy9jb21wb3Nlci5qc29uJzsKfQppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZUZpbHRlcikgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdwbGF0Zm9ybScpKSB7CiRoaW50IC49ICcsIHRyeSB1c2luZyAtLXBsYXRmb3JtICgtcCkgdG8gc2hvdyBwbGF0Zm9ybSBwYWNrYWdlcyc7Cn0KaWYgKCEkaW5wdXQtPmdldE9wdGlvbignYWxsJykgJiYgISRpbnB1dC0+Z2V0T3B0aW9uKCdhdmFpbGFibGUnKSkgewokaGludCAuPSAnLCB0cnkgdXNpbmcgLS1hdmFpbGFibGUgKC1hKSB0byBzaG93IGFsbCBhdmFpbGFibGUgcGFja2FnZXMnOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlRmlsdGVyIC4gJyIgbm90IGZvdW5kJy4kaGludC4nLicpOwp9Cn0KCmlmIChpc3NldCgkcGFja2FnZSkpIHsKYXNzZXJ0KGlzc2V0KCR2ZXJzaW9ucykpOwoKJGV4aXRDb2RlID0gMDsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd0cmVlJykpIHsKJGFycmF5VHJlZSA9ICR0aGlzLT5nZW5lcmF0ZVBhY2thZ2VUcmVlKCRwYWNrYWdlLCAkaW5zdGFsbGVkUmVwbywgJHJlcG9zKTsKCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKFsnaW5zdGFsbGVkJyA9PiBbJGFycmF5VHJlZV1dKSk7Cn0gZWxzZSB7CiR0aGlzLT5kaXNwbGF5UGFja2FnZVRyZWUoWyRhcnJheVRyZWVdKTsKfQoKcmV0dXJuICRleGl0Q29kZTsKfQoKJGxhdGVzdFBhY2thZ2UgPSBudWxsOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpKSB7CiRsYXRlc3RQYWNrYWdlID0gJHRoaXMtPmZpbmRMYXRlc3RQYWNrYWdlKCRwYWNrYWdlLCAkY29tcG9zZXIsICRwbGF0Zm9ybVJlcG8sICRpbnB1dC0+Z2V0T3B0aW9uKCdtYWpvci1vbmx5JyksICRpbnB1dC0+Z2V0T3B0aW9uKCdtaW5vci1vbmx5JyksICRpbnB1dC0+Z2V0T3B0aW9uKCdwYXRjaC1vbmx5JyksICRwbGF0Zm9ybVJlcUZpbHRlcik7Cn0KaWYgKAokaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKQomJiAkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0JykKJiYgbnVsbCAhPT0gJGxhdGVzdFBhY2thZ2UKJiYgJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgIT09ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpCiYmICghJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgfHwgISRsYXRlc3RQYWNrYWdlLT5pc0FiYW5kb25lZCgpKQopIHsKJGV4aXRDb2RlID0gMTsKfQppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKSkgewokaW8tPndyaXRlKCRwYWNrYWdlLT5nZXROYW1lKCksIGZhbHNlKTsKJHBhdGggPSAkY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwppZiAoaXNfc3RyaW5nKCRwYXRoKSkgewokaW8tPndyaXRlKCcgJyAuIHN0cnRvayhyZWFscGF0aCgkcGF0aCksICJcclxuIikpOwp9IGVsc2UgewokaW8tPndyaXRlKCcgbnVsbCcpOwp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgppZiAoJ2pzb24nID09PSAkZm9ybWF0KSB7CiR0aGlzLT5wcmludFBhY2thZ2VJbmZvQXNKc29uKCRwYWNrYWdlLCAkdmVyc2lvbnMsICRpbnN0YWxsZWRSZXBvLCAkbGF0ZXN0UGFja2FnZSA/OiBudWxsKTsKfSBlbHNlIHsKJHRoaXMtPnByaW50UGFja2FnZUluZm8oJHBhY2thZ2UsICR2ZXJzaW9ucywgJGluc3RhbGxlZFJlcG8sICRsYXRlc3RQYWNrYWdlID86IG51bGwpOwp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCd0cmVlJykpIHsKJHJvb3RSZXF1aXJlcyA9ICR0aGlzLT5nZXRSb290UmVxdWlyZXMoKTsKJHBhY2thZ2VzID0gJGluc3RhbGxlZFJlcG8tPmdldFBhY2thZ2VzKCk7CnVzb3J0KCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uIChCYXNlUGFja2FnZSAkYSwgQmFzZVBhY2thZ2UgJGIpOiBpbnQgewpyZXR1cm4gc3RyY21wKChzdHJpbmcpICRhLCAoc3RyaW5nKSAkYik7Cn0pOwokYXJyYXlUcmVlID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHJvb3RSZXF1aXJlcywgdHJ1ZSkpIHsKJGFycmF5VHJlZVtdID0gJHRoaXMtPmdlbmVyYXRlUGFja2FnZVRyZWUoJHBhY2thZ2UsICRpbnN0YWxsZWRSZXBvLCAkcmVwb3MpOwp9Cn0KCmlmICgnanNvbicgPT09ICRmb3JtYXQpIHsKJGlvLT53cml0ZShKc29uRmlsZTo6ZW5jb2RlKFsnaW5zdGFsbGVkJyA9PiAkYXJyYXlUcmVlXSkpOwp9IGVsc2UgewokdGhpcy0+ZGlzcGxheVBhY2thZ2VUcmVlKCRhcnJheVRyZWUpOwp9CgpyZXR1cm4gMDsKfQoKCgokcGFja2FnZXMgPSBbXTsKJHBhY2thZ2VGaWx0ZXJSZWdleCA9IG51bGw7CmlmIChudWxsICE9PSAkcGFja2FnZUZpbHRlcikgewokcGFja2FnZUZpbHRlclJlZ2V4ID0gJ3teJy5zdHJfcmVwbGFjZSgnXFwqJywgJy4qPycsIHByZWdfcXVvdGUoJHBhY2thZ2VGaWx0ZXIpKS4nJH1pJzsKfQoKJHBhY2thZ2VMaXN0RmlsdGVyID0gbnVsbDsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdkaXJlY3QnKSkgewokcGFja2FnZUxpc3RGaWx0ZXIgPSAkdGhpcy0+Z2V0Um9vdFJlcXVpcmVzKCk7Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpICYmIG51bGwgPT09ICRjb21wb3NlcikgewokaW8tPndyaXRlRXJyb3IoJ05vIGNvbXBvc2VyLmpzb24gZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBkaXNhYmxpbmcgInBhdGgiIG9wdGlvbicpOwokaW5wdXQtPnNldE9wdGlvbigncGF0aCcsIGZhbHNlKTsKfQoKZm9yZWFjaCAoUmVwb3NpdG9yeVV0aWxzOjpmbGF0dGVuUmVwb3NpdG9yaWVzKCRyZXBvcykgYXMgJHJlcG8pIHsKaWYgKCRyZXBvID09PSAkcGxhdGZvcm1SZXBvKSB7CiR0eXBlID0gJ3BsYXRmb3JtJzsKfSBlbHNlaWYgKCRsb2NrZWRSZXBvICE9PSBudWxsICYmICRyZXBvID09PSAkbG9ja2VkUmVwbykgewokdHlwZSA9ICdsb2NrZWQnOwp9IGVsc2VpZiAoJHJlcG8gPT09ICRpbnN0YWxsZWRSZXBvIHx8IGluX2FycmF5KCRyZXBvLCAkaW5zdGFsbGVkUmVwby0+Z2V0UmVwb3NpdG9yaWVzKCksIHRydWUpKSB7CiR0eXBlID0gJ2luc3RhbGxlZCc7Cn0gZWxzZSB7CiR0eXBlID0gJ2F2YWlsYWJsZSc7Cn0KaWYgKCRyZXBvIGluc3RhbmNlb2YgQ29tcG9zZXJSZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlTmFtZXMoJHBhY2thZ2VGaWx0ZXIpIGFzICRuYW1lKSB7CiRwYWNrYWdlc1skdHlwZV1bJG5hbWVdID0gJG5hbWU7Cn0KfSBlbHNlIHsKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkcGFja2FnZXNbJHR5cGVdWyRwYWNrYWdlLT5nZXROYW1lKCldKQp8fCAhaXNfb2JqZWN0KCRwYWNrYWdlc1skdHlwZV1bJHBhY2thZ2UtPmdldE5hbWUoKV0pCnx8IHZlcnNpb25fY29tcGFyZSgkcGFja2FnZXNbJHR5cGVdWyRwYWNrYWdlLT5nZXROYW1lKCldLT5nZXRWZXJzaW9uKCksICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICc8JykKKSB7CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KaWYgKCEkcGFja2FnZUZpbHRlclJlZ2V4IHx8IFByZWc6OmlzTWF0Y2goJHBhY2thZ2VGaWx0ZXJSZWdleCwgJHBhY2thZ2UtPmdldE5hbWUoKSkpIHsKaWYgKG51bGwgPT09ICRwYWNrYWdlTGlzdEZpbHRlciB8fCBpbl9hcnJheSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcGFja2FnZUxpc3RGaWx0ZXIsIHRydWUpKSB7CiRwYWNrYWdlc1skdHlwZV1bJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKfQp9Cn0KfQppZiAoJHJlcG8gPT09ICRwbGF0Zm9ybVJlcG8pIHsKZm9yZWFjaCAoJHBsYXRmb3JtUmVwby0+Z2V0RGlzYWJsZWRQYWNrYWdlcygpIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CiRwYWNrYWdlc1skdHlwZV1bJG5hbWVdID0gJHBhY2thZ2U7Cn0KfQp9Cn0KCiRzaG93QWxsVHlwZXMgPSAkaW5wdXQtPmdldE9wdGlvbignYWxsJyk7CiRzaG93TGF0ZXN0ID0gJGlucHV0LT5nZXRPcHRpb24oJ2xhdGVzdCcpOwokc2hvd01ham9yT25seSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdtYWpvci1vbmx5Jyk7CiRzaG93TWlub3JPbmx5ID0gJGlucHV0LT5nZXRPcHRpb24oJ21pbm9yLW9ubHknKTsKJHNob3dQYXRjaE9ubHkgPSAkaW5wdXQtPmdldE9wdGlvbigncGF0Y2gtb25seScpOwokaWdub3JlZFBhY2thZ2VzUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJGlucHV0LT5nZXRPcHRpb24oJ2lnbm9yZScpKSk7CiRpbmRlbnQgPSAkc2hvd0FsbFR5cGVzID8gJyAgJyA6ICcnOwoKJGxhdGVzdFBhY2thZ2VzID0gW107CiRleGl0Q29kZSA9IDA7CiR2aWV3RGF0YSA9IFtdOwokdmlld01ldGFEYXRhID0gW107Cgokd3JpdGVWZXJzaW9uID0gZmFsc2U7CiR3cml0ZURlc2NyaXB0aW9uID0gZmFsc2U7Cgpmb3JlYWNoIChbJ3BsYXRmb3JtJyA9PiB0cnVlLCAnbG9ja2VkJyA9PiB0cnVlLCAnYXZhaWxhYmxlJyA9PiBmYWxzZSwgJ2luc3RhbGxlZCcgPT4gdHJ1ZV0gYXMgJHR5cGUgPT4gJHNob3dWZXJzaW9uKSB7CmlmIChpc3NldCgkcGFja2FnZXNbJHR5cGVdKSkgewprc29ydCgkcGFja2FnZXNbJHR5cGVdKTsKCiRuYW1lTGVuZ3RoID0gJHZlcnNpb25MZW5ndGggPSAkbGF0ZXN0TGVuZ3RoID0gJHJlbGVhc2VEYXRlTGVuZ3RoID0gMDsKCmlmICgkc2hvd0xhdGVzdCAmJiAkc2hvd1ZlcnNpb24pIHsKZm9yZWFjaCAoJHBhY2thZ2VzWyR0eXBlXSBhcyAkcGFja2FnZSkgewppZiAoaXNfb2JqZWN0KCRwYWNrYWdlKSAmJiAhUHJlZzo6aXNNYXRjaCgkaWdub3JlZFBhY2thZ2VzUmVnZXgsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpKSB7CiRsYXRlc3RQYWNrYWdlID0gJHRoaXMtPmZpbmRMYXRlc3RQYWNrYWdlKCRwYWNrYWdlLCAkY29tcG9zZXIsICRwbGF0Zm9ybVJlcG8sICRzaG93TWFqb3JPbmx5LCAkc2hvd01pbm9yT25seSwgJHNob3dQYXRjaE9ubHksICRwbGF0Zm9ybVJlcUZpbHRlcik7CmlmICgkbGF0ZXN0UGFja2FnZSA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKJGxhdGVzdFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCldID0gJGxhdGVzdFBhY2thZ2U7Cn0KfQp9Cgokd3JpdGVQYXRoID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSAmJiAkaW5wdXQtPmdldE9wdGlvbigncGF0aCcpOwokd3JpdGVWZXJzaW9uID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKSAmJiAkc2hvd1ZlcnNpb247CiR3cml0ZUxhdGVzdCA9ICR3cml0ZVZlcnNpb24gJiYgJHNob3dMYXRlc3Q7CiR3cml0ZURlc2NyaXB0aW9uID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduYW1lLW9ubHknKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ3BhdGgnKTsKJHdyaXRlUmVsZWFzZURhdGUgPSAkd3JpdGVMYXRlc3QgJiYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzb3J0LWJ5LWFnZScpIHx8ICRmb3JtYXQgPT09ICdqc29uJyk7CgokaGFzT3V0ZGF0ZWRQYWNrYWdlcyA9IGZhbHNlOwoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdzb3J0LWJ5LWFnZScpKSB7CnVzb3J0KCRwYWNrYWdlc1skdHlwZV0sIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKSB7CmlmIChpc19vYmplY3QoJGEpICYmIGlzX29iamVjdCgkYikpIHsKcmV0dXJuICRhLT5nZXRSZWxlYXNlRGF0ZSgpIDw9PiAkYi0+Z2V0UmVsZWFzZURhdGUoKTsKfQoKcmV0dXJuIDA7Cn0pOwp9Cgokdmlld0RhdGFbJHR5cGVdID0gW107CmZvcmVhY2ggKCRwYWNrYWdlc1skdHlwZV0gYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VWaWV3RGF0YSA9IFtdOwppZiAoaXNfb2JqZWN0KCRwYWNrYWdlKSkgewokbGF0ZXN0UGFja2FnZSA9IG51bGw7CmlmICgkc2hvd0xhdGVzdCAmJiBpc3NldCgkbGF0ZXN0UGFja2FnZXNbJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKV0pKSB7CiRsYXRlc3RQYWNrYWdlID0gJGxhdGVzdFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCldOwp9CgoKJHBhY2thZ2VJc1VwVG9EYXRlID0gJGxhdGVzdFBhY2thZ2UgJiYgJGxhdGVzdFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgPT09ICRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpICYmICghJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgfHwgISRsYXRlc3RQYWNrYWdlLT5pc0FiYW5kb25lZCgpKTsKCiRwYWNrYWdlSXNVcFRvRGF0ZSA9ICRwYWNrYWdlSXNVcFRvRGF0ZSB8fCAoJGxhdGVzdFBhY2thZ2UgPT09IG51bGwgJiYgJHNob3dNYWpvck9ubHkpOwokcGFja2FnZUlzSWdub3JlZCA9IFByZWc6OmlzTWF0Y2goJGlnbm9yZWRQYWNrYWdlc1JlZ2V4LCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpKTsKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdvdXRkYXRlZCcpICYmICgkcGFja2FnZUlzVXBUb0RhdGUgfHwgJHBhY2thZ2VJc0lnbm9yZWQpKSB7CmNvbnRpbnVlOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykgfHwgJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpKSB7CiRoYXNPdXRkYXRlZFBhY2thZ2VzID0gdHJ1ZTsKfQoKJHBhY2thZ2VWaWV3RGF0YVsnbmFtZSddID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHBhY2thZ2VWaWV3RGF0YVsnZGlyZWN0LWRlcGVuZGVuY3knXSA9IGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICR0aGlzLT5nZXRSb290UmVxdWlyZXMoKSwgdHJ1ZSk7CmlmICgkZm9ybWF0ICE9PSAnanNvbicgfHwgdHJ1ZSAhPT0gJGlucHV0LT5nZXRPcHRpb24oJ25hbWUtb25seScpKSB7CiRwYWNrYWdlVmlld0RhdGFbJ2hvbWVwYWdlJ10gPSAkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpIDogbnVsbDsKJHBhY2thZ2VWaWV3RGF0YVsnc291cmNlJ10gPSBQYWNrYWdlSW5mbzo6Z2V0Vmlld1NvdXJjZVVybCgkcGFja2FnZSk7Cn0KJG5hbWVMZW5ndGggPSBtYXgoJG5hbWVMZW5ndGgsIHN0cmxlbigkcGFja2FnZVZpZXdEYXRhWyduYW1lJ10pKTsKaWYgKCR3cml0ZVZlcnNpb24pIHsKJHBhY2thZ2VWaWV3RGF0YVsndmVyc2lvbiddID0gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7CmlmICgkZm9ybWF0ID09PSAndGV4dCcpIHsKJHBhY2thZ2VWaWV3RGF0YVsndmVyc2lvbiddID0gbHRyaW0oJHBhY2thZ2VWaWV3RGF0YVsndmVyc2lvbiddLCAndicpOwp9CiR2ZXJzaW9uTGVuZ3RoID0gbWF4KCR2ZXJzaW9uTGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsndmVyc2lvbiddKSk7Cn0KaWYgKCR3cml0ZVJlbGVhc2VEYXRlKSB7CmlmICgkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSAhPT0gbnVsbCkgewokcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWFnZSddID0gc3RyX3JlcGxhY2UoJyBhZ28nLCAnIG9sZCcsICR0aGlzLT5nZXRSZWxhdGl2ZVRpbWUoJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkpKTsKaWYgKCFzdHJfY29udGFpbnMoJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1hZ2UnXSwgJyBvbGQnKSkgewokcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWFnZSddID0gJ2Zyb20gJy4kcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWFnZSddOwp9CiRyZWxlYXNlRGF0ZUxlbmd0aCA9IG1heCgkcmVsZWFzZURhdGVMZW5ndGgsIHN0cmxlbigkcGFja2FnZVZpZXdEYXRhWydyZWxlYXNlLWFnZSddKSk7CiRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtZGF0ZSddID0gJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdChEYXRlVGltZUludGVyZmFjZTo6QVRPTSk7Cn0gZWxzZSB7CiRwYWNrYWdlVmlld0RhdGFbJ3JlbGVhc2UtYWdlJ10gPSAnJzsKJHBhY2thZ2VWaWV3RGF0YVsncmVsZWFzZS1kYXRlJ10gPSAnJzsKfQp9CmlmICgkd3JpdGVMYXRlc3QgJiYgJGxhdGVzdFBhY2thZ2UpIHsKJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKaWYgKCRmb3JtYXQgPT09ICd0ZXh0JykgewokcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSA9IGx0cmltKCRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdCddLCAndicpOwp9CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdC1zdGF0dXMnXSA9ICR0aGlzLT5nZXRVcGRhdGVTdGF0dXMoJGxhdGVzdFBhY2thZ2UsICRwYWNrYWdlKTsKJGxhdGVzdExlbmd0aCA9IG1heCgkbGF0ZXN0TGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10pKTsKCmlmICgkbGF0ZXN0UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSAhPT0gbnVsbCkgewokcGFja2FnZVZpZXdEYXRhWydsYXRlc3QtcmVsZWFzZS1kYXRlJ10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKS0+Zm9ybWF0KERhdGVUaW1lSW50ZXJmYWNlOjpBVE9NKTsKfSBlbHNlIHsKJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0LXJlbGVhc2UtZGF0ZSddID0gJyc7Cn0KfSBlbHNlaWYgKCR3cml0ZUxhdGVzdCkgewokcGFja2FnZVZpZXdEYXRhWydsYXRlc3QnXSA9ICdbbm9uZSBtYXRjaGVkXSc7CiRwYWNrYWdlVmlld0RhdGFbJ2xhdGVzdC1zdGF0dXMnXSA9ICd1cC10by1kYXRlJzsKJGxhdGVzdExlbmd0aCA9IG1heCgkbGF0ZXN0TGVuZ3RoLCBzdHJsZW4oJHBhY2thZ2VWaWV3RGF0YVsnbGF0ZXN0J10pKTsKfQppZiAoJHdyaXRlRGVzY3JpcHRpb24gJiYgJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKJHBhY2thZ2VWaWV3RGF0YVsnZGVzY3JpcHRpb24nXSA9ICRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpOwp9CmlmICgkd3JpdGVQYXRoKSB7CiRwYXRoID0gJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKaWYgKGlzX3N0cmluZygkcGF0aCkpIHsKJHBhY2thZ2VWaWV3RGF0YVsncGF0aCddID0gc3RydG9rKHJlYWxwYXRoKCRwYXRoKSwgIlxyXG4iKTsKfSBlbHNlIHsKJHBhY2thZ2VWaWV3RGF0YVsncGF0aCddID0gbnVsbDsKfQp9CgokcGFja2FnZUlzQWJhbmRvbmVkID0gZmFsc2U7CmlmICgkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkbGF0ZXN0UGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewokcmVwbGFjZW1lbnRQYWNrYWdlTmFtZSA9ICRsYXRlc3RQYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKTsKJHJlcGxhY2VtZW50ID0gJHJlcGxhY2VtZW50UGFja2FnZU5hbWUgIT09IG51bGwKPyAnVXNlICcgLiAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgLiAnIGluc3RlYWQnCjogJ05vIHJlcGxhY2VtZW50IHdhcyBzdWdnZXN0ZWQnOwokcGFja2FnZVdhcm5pbmcgPSBzcHJpbnRmKAonUGFja2FnZSAlcyBpcyBhYmFuZG9uZWQsIHlvdSBzaG91bGQgYXZvaWQgdXNpbmcgaXQuICVzLicsCiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksCiRyZXBsYWNlbWVudAopOwokcGFja2FnZVZpZXdEYXRhWyd3YXJuaW5nJ10gPSAkcGFja2FnZVdhcm5pbmc7CiRwYWNrYWdlSXNBYmFuZG9uZWQgPSAkcmVwbGFjZW1lbnRQYWNrYWdlTmFtZSA/PyB0cnVlOwp9CgokcGFja2FnZVZpZXdEYXRhWydhYmFuZG9uZWQnXSA9ICRwYWNrYWdlSXNBYmFuZG9uZWQ7Cn0gZWxzZSB7CiRwYWNrYWdlVmlld0RhdGFbJ25hbWUnXSA9ICRwYWNrYWdlOwokbmFtZUxlbmd0aCA9IG1heCgkbmFtZUxlbmd0aCwgc3RybGVuKCRwYWNrYWdlKSk7Cn0KJHZpZXdEYXRhWyR0eXBlXVtdID0gJHBhY2thZ2VWaWV3RGF0YTsKfQokdmlld01ldGFEYXRhWyR0eXBlXSA9IFsKJ25hbWVMZW5ndGgnID0+ICRuYW1lTGVuZ3RoLAondmVyc2lvbkxlbmd0aCcgPT4gJHZlcnNpb25MZW5ndGgsCidsYXRlc3RMZW5ndGgnID0+ICRsYXRlc3RMZW5ndGgsCidyZWxlYXNlRGF0ZUxlbmd0aCcgPT4gJHJlbGVhc2VEYXRlTGVuZ3RoLAond3JpdGVMYXRlc3QnID0+ICR3cml0ZUxhdGVzdCwKJ3dyaXRlUmVsZWFzZURhdGUnID0+ICR3cml0ZVJlbGVhc2VEYXRlLApdOwppZiAoJGlucHV0LT5nZXRPcHRpb24oJ3N0cmljdCcpICYmICRoYXNPdXRkYXRlZFBhY2thZ2VzKSB7CiRleGl0Q29kZSA9IDE7CmJyZWFrOwp9Cn0KfQoKaWYgKCdqc29uJyA9PT0gJGZvcm1hdCkgewokaW8tPndyaXRlKEpzb25GaWxlOjplbmNvZGUoJHZpZXdEYXRhKSk7Cn0gZWxzZSB7CmlmICgkaW5wdXQtPmdldE9wdGlvbignbGF0ZXN0JykgJiYgYXJyYXlfZmlsdGVyKCR2aWV3RGF0YSkpIHsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGlvLT53cml0ZUVycm9yKCdMZWdlbmQ6Jyk7CiRpby0+d3JpdGVFcnJvcignISBwYXRjaCBvciBtaW5vciByZWxlYXNlIGF2YWlsYWJsZSAtIHVwZGF0ZSByZWNvbW1lbmRlZCcpOwokaW8tPndyaXRlRXJyb3IoJ34gbWFqb3IgcmVsZWFzZSBhdmFpbGFibGUgLSB1cGRhdGUgcG9zc2libGUnKTsKaWYgKCEkaW5wdXQtPmdldE9wdGlvbignb3V0ZGF0ZWQnKSkgewokaW8tPndyaXRlRXJyb3IoJz0gdXAgdG8gZGF0ZSB2ZXJzaW9uJyk7Cn0KfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5Db2xvciBsZWdlbmQ6PC9pbmZvPicpOwokaW8tPndyaXRlRXJyb3IoJy0gPGhpZ2hsaWdodD5wYXRjaCBvciBtaW5vcjwvaGlnaGxpZ2h0PiByZWxlYXNlIGF2YWlsYWJsZSAtIHVwZGF0ZSByZWNvbW1lbmRlZCcpOwokaW8tPndyaXRlRXJyb3IoJy0gPGNvbW1lbnQ+bWFqb3I8L2NvbW1lbnQ+IHJlbGVhc2UgYXZhaWxhYmxlIC0gdXBkYXRlIHBvc3NpYmxlJyk7CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ291dGRhdGVkJykpIHsKJGlvLT53cml0ZUVycm9yKCctIDxpbmZvPnVwIHRvIGRhdGU8L2luZm8+IHZlcnNpb24nKTsKfQp9Cn0KCiR3aWR0aCA9ICR0aGlzLT5nZXRUZXJtaW5hbFdpZHRoKCk7Cgpmb3JlYWNoICgkdmlld0RhdGEgYXMgJHR5cGUgPT4gJHBhY2thZ2VzKSB7CiRuYW1lTGVuZ3RoID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ25hbWVMZW5ndGgnXTsKJHZlcnNpb25MZW5ndGggPSAkdmlld01ldGFEYXRhWyR0eXBlXVsndmVyc2lvbkxlbmd0aCddOwokbGF0ZXN0TGVuZ3RoID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ2xhdGVzdExlbmd0aCddOwokcmVsZWFzZURhdGVMZW5ndGggPSAkdmlld01ldGFEYXRhWyR0eXBlXVsncmVsZWFzZURhdGVMZW5ndGgnXTsKJHdyaXRlTGF0ZXN0ID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ3dyaXRlTGF0ZXN0J107CiR3cml0ZVJlbGVhc2VEYXRlID0gJHZpZXdNZXRhRGF0YVskdHlwZV1bJ3dyaXRlUmVsZWFzZURhdGUnXTsKCiR2ZXJzaW9uRml0cyA9ICRuYW1lTGVuZ3RoICsgJHZlcnNpb25MZW5ndGggKyAzIDw9ICR3aWR0aDsKJGxhdGVzdEZpdHMgPSAkbmFtZUxlbmd0aCArICR2ZXJzaW9uTGVuZ3RoICsgJGxhdGVzdExlbmd0aCArIDMgPD0gJHdpZHRoOwokcmVsZWFzZURhdGVGaXRzID0gJG5hbWVMZW5ndGggKyAkdmVyc2lvbkxlbmd0aCArICRsYXRlc3RMZW5ndGggKyAkcmVsZWFzZURhdGVMZW5ndGggKyAzIDw9ICR3aWR0aDsKJGRlc2NyaXB0aW9uRml0cyA9ICRuYW1lTGVuZ3RoICsgJHZlcnNpb25MZW5ndGggKyAkbGF0ZXN0TGVuZ3RoICsgJHJlbGVhc2VEYXRlTGVuZ3RoICsgMjQgPD0gJHdpZHRoOwoKaWYgKCRsYXRlc3RGaXRzICYmICEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJGxhdGVzdExlbmd0aCArPSAyOwp9CgppZiAoJHNob3dBbGxUeXBlcykgewppZiAoJ2F2YWlsYWJsZScgPT09ICR0eXBlKSB7CiRpby0+d3JpdGUoJzxjb21tZW50PicgLiAkdHlwZSAuICc8L2NvbW1lbnQ+OicpOwp9IGVsc2UgewokaW8tPndyaXRlKCc8aW5mbz4nIC4gJHR5cGUgLiAnPC9pbmZvPjonKTsKfQp9CgppZiAoJHdyaXRlTGF0ZXN0ICYmICEkaW5wdXQtPmdldE9wdGlvbignZGlyZWN0JykpIHsKJGRpcmVjdERlcHMgPSBbXTsKJHRyYW5zaXRpdmVEZXBzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGtnKSB7CmlmICgkcGtnWydkaXJlY3QtZGVwZW5kZW5jeSddID8/IGZhbHNlKSB7CiRkaXJlY3REZXBzW10gPSAkcGtnOwp9IGVsc2UgewokdHJhbnNpdGl2ZURlcHNbXSA9ICRwa2c7Cn0KfQoKJGlvLT53cml0ZUVycm9yKCcnKTsKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5EaXJlY3QgZGVwZW5kZW5jaWVzIHJlcXVpcmVkIGluIGNvbXBvc2VyLmpzb246PC8+Jyk7CmlmIChcY291bnQoJGRpcmVjdERlcHMpID4gMCkgewokdGhpcy0+cHJpbnRQYWNrYWdlcygkaW8sICRkaXJlY3REZXBzLCAkaW5kZW50LCAkd3JpdGVWZXJzaW9uICYmICR2ZXJzaW9uRml0cywgJGxhdGVzdEZpdHMsICR3cml0ZURlc2NyaXB0aW9uICYmICRkZXNjcmlwdGlvbkZpdHMsICR3aWR0aCwgJHZlcnNpb25MZW5ndGgsICRuYW1lTGVuZ3RoLCAkbGF0ZXN0TGVuZ3RoLCAkd3JpdGVSZWxlYXNlRGF0ZSAmJiAkcmVsZWFzZURhdGVGaXRzLCAkcmVsZWFzZURhdGVMZW5ndGgpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJ0V2ZXJ5dGhpbmcgdXAgdG8gZGF0ZScpOwp9CiRpby0+d3JpdGVFcnJvcignJyk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+VHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgbm90IHJlcXVpcmVkIGluIGNvbXBvc2VyLmpzb246PC8+Jyk7CmlmIChcY291bnQoJHRyYW5zaXRpdmVEZXBzKSA+IDApIHsKJHRoaXMtPnByaW50UGFja2FnZXMoJGlvLCAkdHJhbnNpdGl2ZURlcHMsICRpbmRlbnQsICR3cml0ZVZlcnNpb24gJiYgJHZlcnNpb25GaXRzLCAkbGF0ZXN0Rml0cywgJHdyaXRlRGVzY3JpcHRpb24gJiYgJGRlc2NyaXB0aW9uRml0cywgJHdpZHRoLCAkdmVyc2lvbkxlbmd0aCwgJG5hbWVMZW5ndGgsICRsYXRlc3RMZW5ndGgsICR3cml0ZVJlbGVhc2VEYXRlICYmICRyZWxlYXNlRGF0ZUZpdHMsICRyZWxlYXNlRGF0ZUxlbmd0aCk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignRXZlcnl0aGluZyB1cCB0byBkYXRlJyk7Cn0KfSBlbHNlIHsKaWYgKCR3cml0ZUxhdGVzdCAmJiBcY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewokaW8tPndyaXRlRXJyb3IoJ0FsbCB5b3VyIGRpcmVjdCBkZXBlbmRlbmNpZXMgYXJlIHVwIHRvIGRhdGUnKTsKfSBlbHNlIHsKJHRoaXMtPnByaW50UGFja2FnZXMoJGlvLCAkcGFja2FnZXMsICRpbmRlbnQsICR3cml0ZVZlcnNpb24gJiYgJHZlcnNpb25GaXRzLCAkd3JpdGVMYXRlc3QgJiYgJGxhdGVzdEZpdHMsICR3cml0ZURlc2NyaXB0aW9uICYmICRkZXNjcmlwdGlvbkZpdHMsICR3aWR0aCwgJHZlcnNpb25MZW5ndGgsICRuYW1lTGVuZ3RoLCAkbGF0ZXN0TGVuZ3RoLCAkd3JpdGVSZWxlYXNlRGF0ZSAmJiAkcmVsZWFzZURhdGVGaXRzLCAkcmVsZWFzZURhdGVMZW5ndGgpOwp9Cn0KCmlmICgkc2hvd0FsbFR5cGVzKSB7CiRpby0+d3JpdGUoJycpOwp9Cn0KfQoKcmV0dXJuICRleGl0Q29kZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwcmludFBhY2thZ2VzKElPSW50ZXJmYWNlICRpbywgYXJyYXkgJHBhY2thZ2VzLCBzdHJpbmcgJGluZGVudCwgYm9vbCAkd3JpdGVWZXJzaW9uLCBib29sICR3cml0ZUxhdGVzdCwgYm9vbCAkd3JpdGVEZXNjcmlwdGlvbiwgaW50ICR3aWR0aCwgaW50ICR2ZXJzaW9uTGVuZ3RoLCBpbnQgJG5hbWVMZW5ndGgsIGludCAkbGF0ZXN0TGVuZ3RoLCBib29sICR3cml0ZVJlbGVhc2VEYXRlLCBpbnQgJHJlbGVhc2VEYXRlTGVuZ3RoKTogdm9pZAp7CiRwYWROYW1lID0gJHdyaXRlVmVyc2lvbiB8fCAkd3JpdGVMYXRlc3QgfHwgJHdyaXRlUmVsZWFzZURhdGUgfHwgJHdyaXRlRGVzY3JpcHRpb247CiRwYWRWZXJzaW9uID0gJHdyaXRlTGF0ZXN0IHx8ICR3cml0ZVJlbGVhc2VEYXRlIHx8ICR3cml0ZURlc2NyaXB0aW9uOwokcGFkTGF0ZXN0ID0gJHdyaXRlRGVzY3JpcHRpb24gfHwgJHdyaXRlUmVsZWFzZURhdGU7CiRwYWRSZWxlYXNlRGF0ZSA9ICR3cml0ZURlc2NyaXB0aW9uOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpbmsgPSAkcGFja2FnZVsnc291cmNlJ10gPz8gJHBhY2thZ2VbJ2hvbWVwYWdlJ10gPz8gJyc7CmlmICgkbGluayAhPT0gJycpIHsKJGlvLT53cml0ZSgkaW5kZW50IC4gJzxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGxpbmspLic+Jy4kcGFja2FnZVsnbmFtZSddLic8Lz4nLiBzdHJfcmVwZWF0KCcgJywgKCRwYWROYW1lID8gJG5hbWVMZW5ndGggLSBzdHJsZW4oJHBhY2thZ2VbJ25hbWUnXSkgOiAwKSksIGZhbHNlKTsKfSBlbHNlIHsKJGlvLT53cml0ZSgkaW5kZW50IC4gc3RyX3BhZCgkcGFja2FnZVsnbmFtZSddLCAoJHBhZE5hbWUgPyAkbmFtZUxlbmd0aCA6IDApLCAnICcpLCBmYWxzZSk7Cn0KaWYgKGlzc2V0KCRwYWNrYWdlWyd2ZXJzaW9uJ10pICYmICR3cml0ZVZlcnNpb24pIHsKJGlvLT53cml0ZSgnICcgLiBzdHJfcGFkKCRwYWNrYWdlWyd2ZXJzaW9uJ10sICgkcGFkVmVyc2lvbiA/ICR2ZXJzaW9uTGVuZ3RoIDogMCksICcgJyksIGZhbHNlKTsKfQppZiAoaXNzZXQoJHBhY2thZ2VbJ2xhdGVzdCddKSAmJiBpc3NldCgkcGFja2FnZVsnbGF0ZXN0LXN0YXR1cyddKSAmJiAkd3JpdGVMYXRlc3QpIHsKJGxhdGVzdFZlcnNpb24gPSAkcGFja2FnZVsnbGF0ZXN0J107CiR1cGRhdGVTdGF0dXMgPSAkcGFja2FnZVsnbGF0ZXN0LXN0YXR1cyddOwokc3R5bGUgPSAkdGhpcy0+dXBkYXRlU3RhdHVzVG9WZXJzaW9uU3R5bGUoJHVwZGF0ZVN0YXR1cyk7CmlmICghJGlvLT5pc0RlY29yYXRlZCgpKSB7CiRsYXRlc3RWZXJzaW9uID0gc3RyX3JlcGxhY2UoWyd1cC10by1kYXRlJywgJ3NlbXZlci1zYWZlLXVwZGF0ZScsICd1cGRhdGUtcG9zc2libGUnXSwgWyc9JywgJyEnLCAnfiddLCAkdXBkYXRlU3RhdHVzKSAuICcgJyAuICRsYXRlc3RWZXJzaW9uOwp9CiRpby0+d3JpdGUoJyA8JyAuICRzdHlsZSAuICc+JyAuIHN0cl9wYWQoJGxhdGVzdFZlcnNpb24sICgkcGFkTGF0ZXN0ID8gJGxhdGVzdExlbmd0aCA6IDApLCAnICcpIC4gJzwvJyAuICRzdHlsZSAuICc+JywgZmFsc2UpOwppZiAoJHdyaXRlUmVsZWFzZURhdGUgJiYgaXNzZXQoJHBhY2thZ2VbJ3JlbGVhc2UtYWdlJ10pKSB7CiRpby0+d3JpdGUoJyAnLnN0cl9wYWQoJHBhY2thZ2VbJ3JlbGVhc2UtYWdlJ10sICgkcGFkUmVsZWFzZURhdGUgPyAkcmVsZWFzZURhdGVMZW5ndGggOiAwKSwgJyAnKSwgZmFsc2UpOwp9Cn0KaWYgKGlzc2V0KCRwYWNrYWdlWydkZXNjcmlwdGlvbiddKSAmJiAkd3JpdGVEZXNjcmlwdGlvbikgewokZGVzY3JpcHRpb24gPSAoc3RyaW5nKSBzdHJ0b2soJHBhY2thZ2VbJ2Rlc2NyaXB0aW9uJ10sICJcclxuIik7CgoKJHJlbWFpbmluZyA9ICR3aWR0aCAtICRuYW1lTGVuZ3RoIC0gJHZlcnNpb25MZW5ndGggLSAkcmVsZWFzZURhdGVMZW5ndGggLSA0OwppZiAoJHdyaXRlTGF0ZXN0KSB7CiRyZW1haW5pbmcgLT0gJGxhdGVzdExlbmd0aDsKfQoKCmlmICgkcmVtYWluaW5nIDw9IDApIHsKJGRlc2NyaXB0aW9uID0gJyc7Cn0gZWxzZWlmIChleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CgoKCmlmIChtYl9zdHJ3aWR0aCgkZGVzY3JpcHRpb24sICdVVEYtOCcpID4gJHJlbWFpbmluZykgewokZGVzY3JpcHRpb24gPSBtYl9zdHJpbXdpZHRoKCRkZXNjcmlwdGlvbiwgMCwgJHJlbWFpbmluZywgJy4uLicsICdVVEYtOCcpOwp9Cn0gZWxzZSB7CgoKJGN1dCA9IG1heCgwLCAkcmVtYWluaW5nIC0gMyk7CmlmIChzdHJsZW4oJGRlc2NyaXB0aW9uKSA+ICRjdXQpIHsKJGRlc2NyaXB0aW9uID0gc3Vic3RyKCRkZXNjcmlwdGlvbiwgMCwgJGN1dCkgLiAnLi4uJzsKfQp9CgokaW8tPndyaXRlKCcgJyAuICRkZXNjcmlwdGlvbiwgZmFsc2UpOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdwYXRoJywgJHBhY2thZ2UpKSB7CiRpby0+d3JpdGUoJyAnLihpc19zdHJpbmcoJHBhY2thZ2VbJ3BhdGgnXSkgPyAkcGFja2FnZVsncGF0aCddIDogJ251bGwnKSwgZmFsc2UpOwp9CiRpby0+d3JpdGUoJycpOwppZiAoaXNzZXQoJHBhY2thZ2VbJ3dhcm5pbmcnXSkpIHsKJGlvLT53cml0ZSgnPHdhcm5pbmc+JyAuICRwYWNrYWdlWyd3YXJuaW5nJ10gLiAnPC93YXJuaW5nPicpOwp9Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJvb3RSZXF1aXJlcygpOiBhcnJheQp7CiRjb21wb3NlciA9ICR0aGlzLT50cnlDb21wb3NlcigpOwppZiAoJGNvbXBvc2VyID09PSBudWxsKSB7CnJldHVybiBbXTsKfQoKJHJvb3RQYWNrYWdlID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CgpyZXR1cm4gYXJyYXlfbWFwKAonc3RydG9sb3dlcicsCmFycmF5X2tleXMoYXJyYXlfbWVyZ2UoJHJvb3RQYWNrYWdlLT5nZXRSZXF1aXJlcygpLCAkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpKQopOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VmVyc2lvblN0eWxlKFBhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKcmV0dXJuICR0aGlzLT51cGRhdGVTdGF0dXNUb1ZlcnNpb25TdHlsZSgkdGhpcy0+Z2V0VXBkYXRlU3RhdHVzKCRsYXRlc3RQYWNrYWdlLCAkcGFja2FnZSkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBhY2thZ2UoSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3MsIHN0cmluZyAkbmFtZSwgJHZlcnNpb24gPSBudWxsKTogYXJyYXkKewokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwokY29uc3RyYWludCA9IGlzX3N0cmluZygkdmVyc2lvbikgPyAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkdmVyc2lvbikgOiAkdmVyc2lvbjsKCiRwb2xpY3kgPSBuZXcgRGVmYXVsdFBvbGljeSgpOwokcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCdkZXYnKTsKJHJlcG9zaXRvcnlTZXQtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKCk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRyZXBvcyk7CgokbWF0Y2hlZFBhY2thZ2UgPSBudWxsOwokdmVyc2lvbnMgPSBbXTsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpKSB7CiRwb29sID0gJHJlcG9zaXRvcnlTZXQtPmNyZWF0ZVBvb2xXaXRoQWxsUGFja2FnZXMoKTsKfSBlbHNlIHsKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbEZvclBhY2thZ2UoJG5hbWUpOwp9CiRtYXRjaGVzID0gJHBvb2wtPndoYXRQcm92aWRlcygkbmFtZSwgJGNvbnN0cmFpbnQpOwokbGl0ZXJhbHMgPSBbXTsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJHBhY2thZ2UpIHsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCgppZiAobnVsbCA9PT0gJHZlcnNpb24gJiYgJGluc3RhbGxlZFJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRtYXRjaGVkUGFja2FnZSA9ICRwYWNrYWdlOwp9CgokdmVyc2lvbnNbJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKV0gPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwokbGl0ZXJhbHNbXSA9ICRwYWNrYWdlLT5nZXRJZCgpOwp9CgoKaWYgKG51bGwgPT09ICRtYXRjaGVkUGFja2FnZSAmJiBcY291bnQoJGxpdGVyYWxzKSA+IDApIHsKJHByZWZlcnJlZCA9ICRwb2xpY3ktPnNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKCRwb29sLCAkbGl0ZXJhbHMpOwokbWF0Y2hlZFBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkcHJlZmVycmVkWzBdKTsKfQoKaWYgKCRtYXRjaGVkUGFja2FnZSAhPT0gbnVsbCAmJiAhJG1hdGNoZWRQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1Nob3dDb21tYW5kOjpnZXRQYWNrYWdlIGNhbiBvbmx5IHdvcmsgd2l0aCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UsIGJ1dCBnb3QgJy5nZXRfY2xhc3MoJG1hdGNoZWRQYWNrYWdlKSk7Cn0KCnJldHVybiBbJG1hdGNoZWRQYWNrYWdlLCAkdmVyc2lvbnNdOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludFBhY2thZ2VJbmZvKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJHZlcnNpb25zLCBJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLCA/UGFja2FnZUludGVyZmFjZSAkbGF0ZXN0UGFja2FnZSA9IG51bGwpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CgokdGhpcy0+cHJpbnRNZXRhKCRwYWNrYWdlLCAkdmVyc2lvbnMsICRpbnN0YWxsZWRSZXBvLCAkbGF0ZXN0UGFja2FnZSA/OiBudWxsKTsKJHRoaXMtPnByaW50TGlua3MoJHBhY2thZ2UsIExpbms6OlRZUEVfUkVRVUlSRSk7CiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX0RFVl9SRVFVSVJFLCAncmVxdWlyZXMgKGRldiknKTsKCmlmICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSkgewokaW8tPndyaXRlKCJcbjxpbmZvPnN1Z2dlc3RzPC9pbmZvPiIpOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKSBhcyAkc3VnZ2VzdGVkID0+ICRyZWFzb24pIHsKJGlvLT53cml0ZSgkc3VnZ2VzdGVkIC4gJyA8Y29tbWVudD4nIC4gJHJlYXNvbiAuICc8L2NvbW1lbnQ+Jyk7Cn0KfQoKJHRoaXMtPnByaW50TGlua3MoJHBhY2thZ2UsIExpbms6OlRZUEVfUFJPVklERSk7CiR0aGlzLT5wcmludExpbmtzKCRwYWNrYWdlLCBMaW5rOjpUWVBFX0NPTkZMSUNUKTsKJHRoaXMtPnByaW50TGlua3MoJHBhY2thZ2UsIExpbms6OlRZUEVfUkVQTEFDRSk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByaW50TWV0YShDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgP1BhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UgPSBudWxsKTogdm9pZAp7CiRpc0luc3RhbGxlZFBhY2thZ2UgPSAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZS0+Z2V0TmFtZSgpKSAmJiAkaW5zdGFsbGVkUmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSk7CgokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJGlvLT53cml0ZSgnPGluZm8+bmFtZTwvaW5mbz4gICAgIDogJyAuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpOwokaW8tPndyaXRlKCc8aW5mbz5kZXNjcmlwLjwvaW5mbz4gOiAnIC4gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkpOwokaW8tPndyaXRlKCc8aW5mbz5rZXl3b3JkczwvaW5mbz4gOiAnIC4gaW1wbG9kZSgnLCAnLCAkcGFja2FnZS0+Z2V0S2V5d29yZHMoKSA/OiBbXSkpOwokdGhpcy0+cHJpbnRWZXJzaW9ucygkcGFja2FnZSwgJHZlcnNpb25zLCAkaW5zdGFsbGVkUmVwbyk7CmlmICgkaXNJbnN0YWxsZWRQYWNrYWdlICYmICRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpICE9PSBudWxsKSB7CiRpby0+d3JpdGUoJzxpbmZvPnJlbGVhc2VkPC9pbmZvPiA6ICcgLiAkcGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKS0+Zm9ybWF0KCdZLW0tZCcpIC4gJywgJyAuICR0aGlzLT5nZXRSZWxhdGl2ZVRpbWUoJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkpKTsKfQppZiAoJGxhdGVzdFBhY2thZ2UpIHsKJHN0eWxlID0gJHRoaXMtPmdldFZlcnNpb25TdHlsZSgkbGF0ZXN0UGFja2FnZSwgJHBhY2thZ2UpOwokcmVsZWFzZWRUaW1lID0gJGxhdGVzdFBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkgPT09IG51bGwgPyAnJyA6ICcgcmVsZWFzZWQgJyAuICRsYXRlc3RQYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoJ1ktbS1kJykgLiAnLCAnIC4gJHRoaXMtPmdldFJlbGF0aXZlVGltZSgkbGF0ZXN0UGFja2FnZS0+Z2V0UmVsZWFzZURhdGUoKSk7CiRpby0+d3JpdGUoJzxpbmZvPmxhdGVzdDwvaW5mbz4gICA6IDwnLiRzdHlsZS4nPicgLiAkbGF0ZXN0UGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJzwvJy4kc3R5bGUuJz4nIC4gJHJlbGVhc2VkVGltZSk7Cn0gZWxzZSB7CiRsYXRlc3RQYWNrYWdlID0gJHBhY2thZ2U7Cn0KJGlvLT53cml0ZSgnPGluZm8+dHlwZTwvaW5mbz4gICAgIDogJyAuICRwYWNrYWdlLT5nZXRUeXBlKCkpOwokdGhpcy0+cHJpbnRMaWNlbnNlcygkcGFja2FnZSk7CiRpby0+d3JpdGUoJzxpbmZvPmhvbWVwYWdlPC9pbmZvPiA6ICcgLiAkcGFja2FnZS0+Z2V0SG9tZXBhZ2UoKSk7CiRpby0+d3JpdGUoJzxpbmZvPnNvdXJjZTwvaW5mbz4gICA6ICcgLiBzcHJpbnRmKCdbJXNdIDxjb21tZW50PiVzPC9jb21tZW50PiAlcycsICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCksICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKSwgJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSk7CiRpby0+d3JpdGUoJzxpbmZvPmRpc3Q8L2luZm8+ICAgICA6ICcgLiBzcHJpbnRmKCdbJXNdIDxjb21tZW50PiVzPC9jb21tZW50PiAlcycsICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpLCAkcGFja2FnZS0+Z2V0RGlzdFVybCgpLCAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpKSk7CmlmICgkaXNJbnN0YWxsZWRQYWNrYWdlKSB7CiRwYXRoID0gJHRoaXMtPnJlcXVpcmVDb21wb3NlcigpLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKaWYgKGlzX3N0cmluZygkcGF0aCkpIHsKJGlvLT53cml0ZSgnPGluZm8+cGF0aDwvaW5mbz4gICAgIDogJyAuIHJlYWxwYXRoKCRwYXRoKSk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJzxpbmZvPnBhdGg8L2luZm8+ICAgICA6IG51bGwnKTsKfQp9CiRpby0+d3JpdGUoJzxpbmZvPm5hbWVzPC9pbmZvPiAgICA6ICcgLiBpbXBsb2RlKCcsICcsICRwYWNrYWdlLT5nZXROYW1lcygpKSk7CgppZiAoJGxhdGVzdFBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgJGxhdGVzdFBhY2thZ2UtPmlzQWJhbmRvbmVkKCkpIHsKJHJlcGxhY2VtZW50ID0gKCRsYXRlc3RQYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSAhPT0gbnVsbCkKPyAnIFRoZSBhdXRob3Igc3VnZ2VzdHMgdXNpbmcgdGhlICcgLiAkbGF0ZXN0UGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkuICcgcGFja2FnZSBpbnN0ZWFkLicKOiBudWxsOwoKJGlvLT53cml0ZUVycm9yKApzcHJpbnRmKCc8d2FybmluZz5BdHRlbnRpb246IFRoaXMgcGFja2FnZSBpcyBhYmFuZG9uZWQgYW5kIG5vIGxvbmdlciBtYWludGFpbmVkLiVzPC93YXJuaW5nPicsICRyZXBsYWNlbWVudCkKKTsKfQoKaWYgKCRwYWNrYWdlLT5nZXRTdXBwb3J0KCkpIHsKJGlvLT53cml0ZSgiXG48aW5mbz5zdXBwb3J0PC9pbmZvPiIpOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0U3VwcG9ydCgpIGFzICR0eXBlID0+ICR2YWx1ZSkgewokaW8tPndyaXRlKCc8Y29tbWVudD4nIC4gJHR5cGUgLiAnPC9jb21tZW50PiA6ICcuJHZhbHVlKTsKfQp9CgppZiAoXGNvdW50KCRwYWNrYWdlLT5nZXRBdXRvbG9hZCgpKSA+IDApIHsKJGlvLT53cml0ZSgiXG48aW5mbz5hdXRvbG9hZDwvaW5mbz4iKTsKJGF1dG9sb2FkQ29uZmlnID0gJHBhY2thZ2UtPmdldEF1dG9sb2FkKCk7CmZvcmVhY2ggKCRhdXRvbG9hZENvbmZpZyBhcyAkdHlwZSA9PiAkYXV0b2xvYWRzKSB7CiRpby0+d3JpdGUoJzxjb21tZW50PicgLiAkdHlwZSAuICc8L2NvbW1lbnQ+Jyk7CgppZiAoJHR5cGUgPT09ICdwc3ItMCcgfHwgJHR5cGUgPT09ICdwc3ItNCcpIHsKZm9yZWFjaCAoJGF1dG9sb2FkcyBhcyAkbmFtZSA9PiAkcGF0aCkgewokaW8tPndyaXRlKCgkbmFtZSA/OiAnKicpIC4gJyA9PiAnIC4gKGlzX2FycmF5KCRwYXRoKSA/IGltcGxvZGUoJywgJywgJHBhdGgpIDogKCRwYXRoID86ICcuJykpKTsKfQp9IGVsc2VpZiAoJHR5cGUgPT09ICdjbGFzc21hcCcpIHsKJGlvLT53cml0ZShpbXBsb2RlKCcsICcsICRhdXRvbG9hZENvbmZpZ1skdHlwZV0pKTsKfQp9CmlmICgkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCkpIHsKJGlvLT53cml0ZSgnPGNvbW1lbnQ+aW5jbHVkZS1wYXRoPC9jb21tZW50PicpOwokaW8tPndyaXRlKGltcGxvZGUoJywgJywgJHBhY2thZ2UtPmdldEluY2x1ZGVQYXRocygpKSk7Cn0KfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludFZlcnNpb25zKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJHZlcnNpb25zLCBJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvKTogdm9pZAp7CiR2ZXJzaW9ucyA9IGFycmF5X2tleXMoJHZlcnNpb25zKTsKJHZlcnNpb25zID0gU2VtdmVyOjpyc29ydCgkdmVyc2lvbnMpOwoKCmlmICgkaW5zdGFsbGVkUGFja2FnZXMgPSAkaW5zdGFsbGVkUmVwby0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRQYWNrYWdlcyBhcyAkaW5zdGFsbGVkUGFja2FnZSkgewokaW5zdGFsbGVkVmVyc2lvbiA9ICRpbnN0YWxsZWRQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRrZXkgPSBhcnJheV9zZWFyY2goJGluc3RhbGxlZFZlcnNpb24sICR2ZXJzaW9ucyk7CmlmIChmYWxzZSAhPT0gJGtleSkgewokdmVyc2lvbnNbJGtleV0gPSAnPGluZm8+KiAnIC4gJGluc3RhbGxlZFZlcnNpb24gLiAnPC9pbmZvPic7Cn0KfQp9CgokdmVyc2lvbnMgPSBpbXBsb2RlKCcsICcsICR2ZXJzaW9ucyk7CgokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoJzxpbmZvPnZlcnNpb25zPC9pbmZvPiA6ICcgLiAkdmVyc2lvbnMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRMaW5rcyhDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkbGlua1R5cGUsID9zdHJpbmcgJHRpdGxlID0gbnVsbCk6IHZvaWQKewokdGl0bGUgPSAkdGl0bGUgPzogJGxpbmtUeXBlOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKaWYgKCRsaW5rcyA9ICRwYWNrYWdlLT57J2dldCcudWNmaXJzdCgkbGlua1R5cGUpfSgpKSB7CiRpby0+d3JpdGUoIlxuPGluZm8+IiAuICR0aXRsZSAuICI8L2luZm8+Iik7Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJGlvLT53cml0ZSgkbGluay0+Z2V0VGFyZ2V0KCkgLiAnIDxjb21tZW50PicgLiAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpIC4gJzwvY29tbWVudD4nKTsKfQp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwcmludExpY2Vuc2VzKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewokc3BkeExpY2Vuc2VzID0gbmV3IFNwZHhMaWNlbnNlcygpOwoKJGxpY2Vuc2VzID0gJHBhY2thZ2UtPmdldExpY2Vuc2UoKTsKJGlvID0gJHRoaXMtPmdldElPKCk7Cgpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2VJZCkgewokbGljZW5zZSA9ICRzcGR4TGljZW5zZXMtPmdldExpY2Vuc2VCeUlkZW50aWZpZXIoJGxpY2Vuc2VJZCk7IAoKaWYgKCEkbGljZW5zZSkgewokb3V0ID0gJGxpY2Vuc2VJZDsKfSBlbHNlIHsKCmlmICgkbGljZW5zZVsxXSA9PT0gdHJ1ZSkgewokb3V0ID0gc3ByaW50ZignJXMgKCVzKSAoT1NJIGFwcHJvdmVkKSAlcycsICRsaWNlbnNlWzBdLCAkbGljZW5zZUlkLCAkbGljZW5zZVsyXSk7Cn0gZWxzZSB7CiRvdXQgPSBzcHJpbnRmKCclcyAoJXMpICVzJywgJGxpY2Vuc2VbMF0sICRsaWNlbnNlSWQsICRsaWNlbnNlWzJdKTsKfQp9CgokaW8tPndyaXRlKCc8aW5mbz5saWNlbnNlPC9pbmZvPiAgOiAnIC4gJG91dCk7Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJpbnRQYWNrYWdlSW5mb0FzSnNvbihDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGFycmF5ICR2ZXJzaW9ucywgSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgP1BhY2thZ2VJbnRlcmZhY2UgJGxhdGVzdFBhY2thZ2UgPSBudWxsKTogdm9pZAp7CiRqc29uID0gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJ2Rlc2NyaXB0aW9uJyA9PiAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSwKJ2tleXdvcmRzJyA9PiAkcGFja2FnZS0+Z2V0S2V5d29yZHMoKSA/OiBbXSwKJ3R5cGUnID0+ICRwYWNrYWdlLT5nZXRUeXBlKCksCidob21lcGFnZScgPT4gJHBhY2thZ2UtPmdldEhvbWVwYWdlKCksCiduYW1lcycgPT4gJHBhY2thZ2UtPmdldE5hbWVzKCksCl07CgokanNvbiA9ICR0aGlzLT5hcHBlbmRWZXJzaW9ucygkanNvbiwgJHZlcnNpb25zKTsKJGpzb24gPSAkdGhpcy0+YXBwZW5kTGljZW5zZXMoJGpzb24sICRwYWNrYWdlKTsKCmlmICgkbGF0ZXN0UGFja2FnZSkgewokanNvblsnbGF0ZXN0J10gPSAkbGF0ZXN0UGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9IGVsc2UgewokbGF0ZXN0UGFja2FnZSA9ICRwYWNrYWdlOwp9CgppZiAobnVsbCAhPT0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSkgewokanNvblsnc291cmNlJ10gPSBbCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpLAondXJsJyA9PiAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCksCidyZWZlcmVuY2UnID0+ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwKXTsKfQoKaWYgKG51bGwgIT09ICRwYWNrYWdlLT5nZXREaXN0VHlwZSgpKSB7CiRqc29uWydkaXN0J10gPSBbCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSwKJ3VybCcgPT4gJHBhY2thZ2UtPmdldERpc3RVcmwoKSwKJ3JlZmVyZW5jZScgPT4gJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSwKXTsKfQoKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRwYWNrYWdlLT5nZXROYW1lKCkpICYmICRpbnN0YWxsZWRSZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokcGF0aCA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKS0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChpc19zdHJpbmcoJHBhdGgpKSB7CiRwYXRoID0gcmVhbHBhdGgoJHBhdGgpOwppZiAoJHBhdGggIT09IGZhbHNlKSB7CiRqc29uWydwYXRoJ10gPSAkcGF0aDsKfQp9IGVsc2UgewokanNvblsncGF0aCddID0gbnVsbDsKfQoKaWYgKCRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpICE9PSBudWxsKSB7CiRqc29uWydyZWxlYXNlZCddID0gJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCktPmZvcm1hdChEQVRFX0FUT00pOwp9Cn0KCmlmICgkbGF0ZXN0UGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAmJiAkbGF0ZXN0UGFja2FnZS0+aXNBYmFuZG9uZWQoKSkgewokanNvblsncmVwbGFjZW1lbnQnXSA9ICRsYXRlc3RQYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKTsKfQoKaWYgKCRwYWNrYWdlLT5nZXRTdWdnZXN0cygpKSB7CiRqc29uWydzdWdnZXN0cyddID0gJHBhY2thZ2UtPmdldFN1Z2dlc3RzKCk7Cn0KCmlmICgkcGFja2FnZS0+Z2V0U3VwcG9ydCgpKSB7CiRqc29uWydzdXBwb3J0J10gPSAkcGFja2FnZS0+Z2V0U3VwcG9ydCgpOwp9CgokanNvbiA9ICR0aGlzLT5hcHBlbmRBdXRvbG9hZCgkanNvbiwgJHBhY2thZ2UpOwoKaWYgKCRwYWNrYWdlLT5nZXRJbmNsdWRlUGF0aHMoKSkgewokanNvblsnaW5jbHVkZV9wYXRoJ10gPSAkcGFja2FnZS0+Z2V0SW5jbHVkZVBhdGhzKCk7Cn0KCiRqc29uID0gJHRoaXMtPmFwcGVuZExpbmtzKCRqc29uLCAkcGFja2FnZSk7CgokdGhpcy0+Z2V0SU8oKS0+d3JpdGUoSnNvbkZpbGU6OmVuY29kZSgkanNvbikpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kVmVyc2lvbnMoYXJyYXkgJGpzb24sIGFycmF5ICR2ZXJzaW9ucyk6IGFycmF5CnsKdWFzb3J0KCR2ZXJzaW9ucywgJ3ZlcnNpb25fY29tcGFyZScpOwokdmVyc2lvbnMgPSBhcnJheV9rZXlzKGFycmF5X3JldmVyc2UoJHZlcnNpb25zKSk7CiRqc29uWyd2ZXJzaW9ucyddID0gJHZlcnNpb25zOwoKcmV0dXJuICRqc29uOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBlbmRMaWNlbnNlcyhhcnJheSAkanNvbiwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYXJyYXkKewppZiAoJGxpY2Vuc2VzID0gJHBhY2thZ2UtPmdldExpY2Vuc2UoKSkgewokc3BkeExpY2Vuc2VzID0gbmV3IFNwZHhMaWNlbnNlcygpOwoKJGpzb25bJ2xpY2Vuc2VzJ10gPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkbGljZW5zZUlkKSB1c2UgKCRzcGR4TGljZW5zZXMpIHsKJGxpY2Vuc2UgPSAkc3BkeExpY2Vuc2VzLT5nZXRMaWNlbnNlQnlJZGVudGlmaWVyKCRsaWNlbnNlSWQpOyAKCmlmICghJGxpY2Vuc2UpIHsKcmV0dXJuICRsaWNlbnNlSWQ7Cn0KCnJldHVybiBbCiduYW1lJyA9PiAkbGljZW5zZVswXSwKJ29zaScgPT4gJGxpY2Vuc2VJZCwKJ3VybCcgPT4gJGxpY2Vuc2VbMl0sCl07Cn0sICRsaWNlbnNlcyk7Cn0KCnJldHVybiAkanNvbjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kQXV0b2xvYWQoYXJyYXkgJGpzb24sIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKaWYgKFxjb3VudCgkcGFja2FnZS0+Z2V0QXV0b2xvYWQoKSkgPiAwKSB7CiRhdXRvbG9hZCA9IFtdOwoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldEF1dG9sb2FkKCkgYXMgJHR5cGUgPT4gJGF1dG9sb2FkcykgewppZiAoJHR5cGUgPT09ICdwc3ItMCcgfHwgJHR5cGUgPT09ICdwc3ItNCcpIHsKJHBzciA9IFtdOwoKZm9yZWFjaCAoJGF1dG9sb2FkcyBhcyAkbmFtZSA9PiAkcGF0aCkgewppZiAoISRwYXRoKSB7CiRwYXRoID0gJy4nOwp9CgokcHNyWyRuYW1lID86ICcqJ10gPSAkcGF0aDsKfQoKJGF1dG9sb2FkWyR0eXBlXSA9ICRwc3I7Cn0gZWxzZWlmICgkdHlwZSA9PT0gJ2NsYXNzbWFwJykgewokYXV0b2xvYWRbJ2NsYXNzbWFwJ10gPSAkYXV0b2xvYWRzOwp9Cn0KCiRqc29uWydhdXRvbG9hZCddID0gJGF1dG9sb2FkOwp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFwcGVuZExpbmtzKGFycmF5ICRqc29uLCBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CmZvcmVhY2ggKExpbms6OiRUWVBFUyBhcyAkbGlua1R5cGUpIHsKJGpzb24gPSAkdGhpcy0+YXBwZW5kTGluaygkanNvbiwgJHBhY2thZ2UsICRsaW5rVHlwZSk7Cn0KCnJldHVybiAkanNvbjsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kTGluayhhcnJheSAkanNvbiwgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGxpbmtUeXBlKTogYXJyYXkKewokbGlua3MgPSAkcGFja2FnZS0+eydnZXQnIC4gdWNmaXJzdCgkbGlua1R5cGUpfSgpOwoKaWYgKCRsaW5rcykgewokanNvblskbGlua1R5cGVdID0gW107Cgpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKJGpzb25bJGxpbmtUeXBlXVskbGluay0+Z2V0VGFyZ2V0KCldID0gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKfQp9CgpyZXR1cm4gJGpzb247Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0U3R5bGVzKE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiR0aGlzLT5jb2xvcnMgPSBbCidncmVlbicsCid5ZWxsb3cnLAonY3lhbicsCidtYWdlbnRhJywKJ2JsdWUnLApdOwoKZm9yZWFjaCAoJHRoaXMtPmNvbG9ycyBhcyAkY29sb3IpIHsKJHN0eWxlID0gbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCRjb2xvcik7CiRvdXRwdXQtPmdldEZvcm1hdHRlcigpLT5zZXRTdHlsZSgkY29sb3IsICRzdHlsZSk7Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGlzcGxheVBhY2thZ2VUcmVlKGFycmF5ICRhcnJheVRyZWUpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmZvcmVhY2ggKCRhcnJheVRyZWUgYXMgJHBhY2thZ2UpIHsKJGlvLT53cml0ZShzcHJpbnRmKCc8aW5mbz4lczwvaW5mbz4nLCAkcGFja2FnZVsnbmFtZSddKSwgZmFsc2UpOwokaW8tPndyaXRlKCcgJyAuICRwYWNrYWdlWyd2ZXJzaW9uJ10sIGZhbHNlKTsKaWYgKGlzc2V0KCRwYWNrYWdlWydkZXNjcmlwdGlvbiddKSkgewokaW8tPndyaXRlKCcgJyAuIHN0cnRvaygkcGFja2FnZVsnZGVzY3JpcHRpb24nXSwgIlxyXG4iKSk7Cn0gZWxzZSB7CgokaW8tPndyaXRlKCcnKTsKfQoKaWYgKGlzc2V0KCRwYWNrYWdlWydyZXF1aXJlcyddKSkgewokcmVxdWlyZXMgPSAkcGFja2FnZVsncmVxdWlyZXMnXTsKJHRyZWVCYXIgPSAn4pScJzsKJGogPSAwOwokdG90YWwgPSBjb3VudCgkcmVxdWlyZXMpOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcXVpcmUpIHsKJHJlcXVpcmVOYW1lID0gJHJlcXVpcmVbJ25hbWUnXTsKJGorKzsKaWYgKCRqID09PSAkdG90YWwpIHsKJHRyZWVCYXIgPSAn4pSUJzsKfQokbGV2ZWwgPSAxOwokY29sb3IgPSAkdGhpcy0+Y29sb3JzWyRsZXZlbF07CiRpbmZvID0gc3ByaW50ZigKJyVz4pSA4pSAPCVzPiVzPC8lcz4gJXMnLAokdHJlZUJhciwKJGNvbG9yLAokcmVxdWlyZU5hbWUsCiRjb2xvciwKJHJlcXVpcmVbJ3ZlcnNpb24nXQopOwokdGhpcy0+d3JpdGVUcmVlTGluZSgkaW5mbyk7CgokdHJlZUJhciA9IHN0cl9yZXBsYWNlKCfilJQnLCAnICcsICR0cmVlQmFyKTsKJHBhY2thZ2VzSW5UcmVlID0gWyRwYWNrYWdlWyduYW1lJ10sICRyZXF1aXJlTmFtZV07CgokdGhpcy0+ZGlzcGxheVRyZWUoJHJlcXVpcmUsICRwYWNrYWdlc0luVHJlZSwgJHRyZWVCYXIsICRsZXZlbCArIDEpOwp9Cn0KfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVBhY2thZ2VUcmVlKApQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLApJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLApSZXBvc2l0b3J5SW50ZXJmYWNlICRyZW1vdGVSZXBvcwopOiBhcnJheSB7CiRyZXF1aXJlcyA9ICRwYWNrYWdlLT5nZXRSZXF1aXJlcygpOwprc29ydCgkcmVxdWlyZXMpOwokY2hpbGRyZW4gPSBbXTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlTmFtZSA9PiAkcmVxdWlyZSkgewokcGFja2FnZXNJblRyZWUgPSBbJHBhY2thZ2UtPmdldE5hbWUoKSwgJHJlcXVpcmVOYW1lXTsKCiR0cmVlQ2hpbGREZXNjID0gWwonbmFtZScgPT4gJHJlcXVpcmVOYW1lLAondmVyc2lvbicgPT4gJHJlcXVpcmUtPmdldFByZXR0eUNvbnN0cmFpbnQoKSwKXTsKCiRkZWVwQ2hpbGRyZW4gPSAkdGhpcy0+YWRkVHJlZSgkcmVxdWlyZU5hbWUsICRyZXF1aXJlLCAkaW5zdGFsbGVkUmVwbywgJHJlbW90ZVJlcG9zLCAkcGFja2FnZXNJblRyZWUpOwoKaWYgKCRkZWVwQ2hpbGRyZW4pIHsKJHRyZWVDaGlsZERlc2NbJ3JlcXVpcmVzJ10gPSAkZGVlcENoaWxkcmVuOwp9CgokY2hpbGRyZW5bXSA9ICR0cmVlQ2hpbGREZXNjOwp9CiR0cmVlID0gWwonbmFtZScgPT4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksCidkZXNjcmlwdGlvbicgPT4gJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgPyAkcGFja2FnZS0+Z2V0RGVzY3JpcHRpb24oKSA6ICcnLApdOwoKaWYgKCRjaGlsZHJlbikgewokdHJlZVsncmVxdWlyZXMnXSA9ICRjaGlsZHJlbjsKfQoKcmV0dXJuICR0cmVlOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGlzcGxheVRyZWUoCiRwYWNrYWdlLAphcnJheSAkcGFja2FnZXNJblRyZWUsCnN0cmluZyAkcHJldmlvdXNUcmVlQmFyID0gJ+KUnCcsCmludCAkbGV2ZWwgPSAxCik6IHZvaWQgewokcHJldmlvdXNUcmVlQmFyID0gc3RyX3JlcGxhY2UoJ+KUnCcsICfilIInLCAkcHJldmlvdXNUcmVlQmFyKTsKaWYgKGlzX2FycmF5KCRwYWNrYWdlKSAmJiBpc3NldCgkcGFja2FnZVsncmVxdWlyZXMnXSkpIHsKJHJlcXVpcmVzID0gJHBhY2thZ2VbJ3JlcXVpcmVzJ107CiR0cmVlQmFyID0gJHByZXZpb3VzVHJlZUJhciAuICcgIOKUnCc7CiRpID0gMDsKJHRvdGFsID0gY291bnQoJHJlcXVpcmVzKTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CiRjdXJyZW50VHJlZSA9ICRwYWNrYWdlc0luVHJlZTsKJGkrKzsKaWYgKCRpID09PSAkdG90YWwpIHsKJHRyZWVCYXIgPSAkcHJldmlvdXNUcmVlQmFyIC4gJyAg4pSUJzsKfQokY29sb3JJZGVudCA9ICRsZXZlbCAlIGNvdW50KCR0aGlzLT5jb2xvcnMpOwokY29sb3IgPSAkdGhpcy0+Y29sb3JzWyRjb2xvcklkZW50XTsKCmFzc2VydChpc19zdHJpbmcoJHJlcXVpcmVbJ25hbWUnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRyZXF1aXJlWyd2ZXJzaW9uJ10pKTsKCiRjaXJjdWxhcldhcm4gPSBpbl9hcnJheSgKJHJlcXVpcmVbJ25hbWUnXSwKJGN1cnJlbnRUcmVlLAp0cnVlCikgPyAnKGNpcmN1bGFyIGRlcGVuZGVuY3kgYWJvcnRlZCBoZXJlKScgOiAnJzsKJGluZm8gPSBydHJpbShzcHJpbnRmKAonJXPilIDilIA8JXM+JXM8LyVzPiAlcyAlcycsCiR0cmVlQmFyLAokY29sb3IsCiRyZXF1aXJlWyduYW1lJ10sCiRjb2xvciwKJHJlcXVpcmVbJ3ZlcnNpb24nXSwKJGNpcmN1bGFyV2FybgopKTsKJHRoaXMtPndyaXRlVHJlZUxpbmUoJGluZm8pOwoKJHRyZWVCYXIgPSBzdHJfcmVwbGFjZSgn4pSUJywgJyAnLCAkdHJlZUJhcik7CgokY3VycmVudFRyZWVbXSA9ICRyZXF1aXJlWyduYW1lJ107CiR0aGlzLT5kaXNwbGF5VHJlZSgkcmVxdWlyZSwgJGN1cnJlbnRUcmVlLCAkdHJlZUJhciwgJGxldmVsICsgMSk7Cn0KfQp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkVHJlZSgKc3RyaW5nICRuYW1lLApMaW5rICRsaW5rLApJbnN0YWxsZWRSZXBvc2l0b3J5ICRpbnN0YWxsZWRSZXBvLApSZXBvc2l0b3J5SW50ZXJmYWNlICRyZW1vdGVSZXBvcywKYXJyYXkgJHBhY2thZ2VzSW5UcmVlCik6IGFycmF5IHsKJGNoaWxkcmVuID0gW107ClskcGFja2FnZV0gPSAkdGhpcy0+Z2V0UGFja2FnZSgKJGluc3RhbGxlZFJlcG8sCiRyZW1vdGVSZXBvcywKJG5hbWUsCiRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkgPT09ICdzZWxmLnZlcnNpb24nID8gJGxpbmstPmdldENvbnN0cmFpbnQoKSA6ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkKKTsKaWYgKGlzX29iamVjdCgkcGFja2FnZSkpIHsKJHJlcXVpcmVzID0gJHBhY2thZ2UtPmdldFJlcXVpcmVzKCk7Cmtzb3J0KCRyZXF1aXJlcyk7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxdWlyZU5hbWUgPT4gJHJlcXVpcmUpIHsKJGN1cnJlbnRUcmVlID0gJHBhY2thZ2VzSW5UcmVlOwoKJHRyZWVDaGlsZERlc2MgPSBbCiduYW1lJyA9PiAkcmVxdWlyZU5hbWUsCid2ZXJzaW9uJyA9PiAkcmVxdWlyZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpLApdOwoKaWYgKCFpbl9hcnJheSgkcmVxdWlyZU5hbWUsICRjdXJyZW50VHJlZSwgdHJ1ZSkpIHsKJGN1cnJlbnRUcmVlW10gPSAkcmVxdWlyZU5hbWU7CiRkZWVwQ2hpbGRyZW4gPSAkdGhpcy0+YWRkVHJlZSgkcmVxdWlyZU5hbWUsICRyZXF1aXJlLCAkaW5zdGFsbGVkUmVwbywgJHJlbW90ZVJlcG9zLCAkY3VycmVudFRyZWUpOwppZiAoJGRlZXBDaGlsZHJlbikgewokdHJlZUNoaWxkRGVzY1sncmVxdWlyZXMnXSA9ICRkZWVwQ2hpbGRyZW47Cn0KfQoKJGNoaWxkcmVuW10gPSAkdHJlZUNoaWxkRGVzYzsKfQp9CgpyZXR1cm4gJGNoaWxkcmVuOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHVwZGF0ZVN0YXR1c1RvVmVyc2lvblN0eWxlKHN0cmluZyAkdXBkYXRlU3RhdHVzKTogc3RyaW5nCnsKCgoKcmV0dXJuIHN0cl9yZXBsYWNlKFsndXAtdG8tZGF0ZScsICdzZW12ZXItc2FmZS11cGRhdGUnLCAndXBkYXRlLXBvc3NpYmxlJ10sIFsnaW5mbycsICdoaWdobGlnaHQnLCAnY29tbWVudCddLCAkdXBkYXRlU3RhdHVzKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRVcGRhdGVTdGF0dXMoUGFja2FnZUludGVyZmFjZSAkbGF0ZXN0UGFja2FnZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHN0cmluZwp7CmlmICgkbGF0ZXN0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKSA9PT0gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkpIHsKcmV0dXJuICd1cC10by1kYXRlJzsKfQoKJGNvbnN0cmFpbnQgPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwppZiAoMCAhPT0gc3RycG9zKCRjb25zdHJhaW50LCAnZGV2LScpKSB7CiRjb25zdHJhaW50ID0gJ14nLiRjb25zdHJhaW50Owp9CmlmICgkbGF0ZXN0UGFja2FnZS0+Z2V0VmVyc2lvbigpICYmIFNlbXZlcjo6c2F0aXNmaWVzKCRsYXRlc3RQYWNrYWdlLT5nZXRWZXJzaW9uKCksICRjb25zdHJhaW50KSkgewoKcmV0dXJuICdzZW12ZXItc2FmZS11cGRhdGUnOwp9CgoKcmV0dXJuICd1cGRhdGUtcG9zc2libGUnOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlVHJlZUxpbmUoc3RyaW5nICRsaW5lKTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwppZiAoISRpby0+aXNEZWNvcmF0ZWQoKSkgewokbGluZSA9IHN0cl9yZXBsYWNlKFsn4pSUJywgJ+KUnCcsICfilIDilIAnLCAn4pSCJ10sIFsnYC0nLCAnfC0nLCAnLScsICd8J10sICRsaW5lKTsKfQoKJGlvLT53cml0ZSgkbGluZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmluZExhdGVzdFBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgQ29tcG9zZXIgJGNvbXBvc2VyLCBQbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbywgYm9vbCAkbWFqb3JPbmx5LCBib29sICRtaW5vck9ubHksIGJvb2wgJHBhdGNoT25seSwgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXFGaWx0ZXIpOiA/UGFja2FnZUludGVyZmFjZQp7CgokbmFtZSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7CiR2ZXJzaW9uU2VsZWN0b3IgPSBuZXcgVmVyc2lvblNlbGVjdG9yKCR0aGlzLT5nZXRSZXBvc2l0b3J5U2V0KCRjb21wb3NlciksICRwbGF0Zm9ybVJlcG8pOwokc3RhYmlsaXR5ID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKJGZsYWdzID0gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFN0YWJpbGl0eUZsYWdzKCk7CmlmIChpc3NldCgkZmxhZ3NbJG5hbWVdKSkgewokc3RhYmlsaXR5ID0gYXJyYXlfc2VhcmNoKCRmbGFnc1skbmFtZV0sIEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUywgdHJ1ZSk7Cn0KCiRiZXN0U3RhYmlsaXR5ID0gJHN0YWJpbGl0eTsKaWYgKCRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRQcmVmZXJTdGFibGUoKSkgewokYmVzdFN0YWJpbGl0eSA9ICRwYWNrYWdlLT5nZXRTdGFiaWxpdHkoKTsKfQoKJHRhcmdldFZlcnNpb24gPSBudWxsOwppZiAoMCA9PT0gc3RycG9zKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICdkZXYtJykpIHsKJHRhcmdldFZlcnNpb24gPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwoKCmlmICgkbWFqb3JPbmx5KSB7CnJldHVybiBudWxsOwp9Cn0KCmlmICgkdGFyZ2V0VmVyc2lvbiA9PT0gbnVsbCkgewppZiAoJG1ham9yT25seSAmJiBQcmVnOjppc01hdGNoKCd7Xig/UDx6ZXJvX21ham9yPig/OjBcLikrKT8oP1A8Zmlyc3RfbWVhbmluZ2Z1bD5cZCspXC59JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJG1hdGNoKSkgewokdGFyZ2V0VmVyc2lvbiA9ICc+PScuJG1hdGNoWyd6ZXJvX21ham9yJ10uKCgoaW50KSAkbWF0Y2hbJ2ZpcnN0X21lYW5pbmdmdWwnXSkgKyAxKS4nLDw5OTk5OTk5LWRldic7Cn0KCmlmICgkbWlub3JPbmx5KSB7CiR0YXJnZXRWZXJzaW9uID0gJ14nLiRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7Cn0KCmlmICgkcGF0Y2hPbmx5KSB7CiR0cmltbWVkVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3soXC4wKSskfUQnLCAnJywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7CiRwYXJ0c05lZWRlZCA9IHN1YnN0cigkdHJpbW1lZFZlcnNpb24sIDAsIDEpID09PSAnMCcgPyA0IDogMzsKd2hpbGUgKHN1YnN0cl9jb3VudCgkdHJpbW1lZFZlcnNpb24sICcuJykgKyAxIDwgJHBhcnRzTmVlZGVkKSB7CiR0cmltbWVkVmVyc2lvbiAuPSAnLjAnOwp9CiR0YXJnZXRWZXJzaW9uID0gJ34nLiR0cmltbWVkVmVyc2lvbjsKfQp9CgppZiAoJHRoaXMtPmdldElPKCktPmlzVmVyYm9zZSgpKSB7CiRzaG93V2FybmluZ3MgPSB0cnVlOwp9IGVsc2Ugewokc2hvd1dhcm5pbmdzID0gc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRjYW5kaWRhdGUpIHVzZSAoJHBhY2thZ2UpOiBib29sIHsKaWYgKHN0cl9zdGFydHNfd2l0aCgkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCksICdkZXYtJykgfHwgc3RyX3N0YXJ0c193aXRoKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICdkZXYtJykpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdmVyc2lvbl9jb21wYXJlKCRjYW5kaWRhdGUtPmdldFZlcnNpb24oKSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJzw9Jyk7Cn07Cn0KJGNhbmRpZGF0ZSA9ICR2ZXJzaW9uU2VsZWN0b3ItPmZpbmRCZXN0Q2FuZGlkYXRlKCRuYW1lLCAkdGFyZ2V0VmVyc2lvbiwgJGJlc3RTdGFiaWxpdHksICRwbGF0Zm9ybVJlcUZpbHRlciwgMCwgJHRoaXMtPmdldElPKCksICRzaG93V2FybmluZ3MpOwp3aGlsZSAoJGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokY2FuZGlkYXRlID0gJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJGNhbmRpZGF0ZSAhPT0gZmFsc2UgPyAkY2FuZGlkYXRlIDogbnVsbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZXBvc2l0b3J5U2V0KENvbXBvc2VyICRjb21wb3Nlcik6IFJlcG9zaXRvcnlTZXQKewppZiAoISR0aGlzLT5yZXBvc2l0b3J5U2V0KSB7CiR0aGlzLT5yZXBvc2l0b3J5U2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKSwgJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFN0YWJpbGl0eUZsYWdzKCkpOwokdGhpcy0+cmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeShuZXcgQ29tcG9zaXRlUmVwb3NpdG9yeSgkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeVNldDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZWxhdGl2ZVRpbWUoRGF0ZVRpbWVJbnRlcmZhY2UgJHJlbGVhc2VEYXRlKTogc3RyaW5nCnsKaWYgKCRyZWxlYXNlRGF0ZS0+Zm9ybWF0KCdZbWQnKSA9PT0gZGF0ZSgnWW1kJykpIHsKcmV0dXJuICd0b2RheSc7Cn0KCiRkaWZmID0gJHJlbGVhc2VEYXRlLT5kaWZmKG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoKSk7CmlmICgkZGlmZi0+ZGF5cyA8IDcpIHsKcmV0dXJuICd0aGlzIHdlZWsnOwp9CgppZiAoJGRpZmYtPmRheXMgPCAxNCkgewpyZXR1cm4gJ2xhc3Qgd2Vlayc7Cn0KCmlmICgkZGlmZi0+bSA8IDEgJiYgJGRpZmYtPmRheXMgPCAzMSkgewpyZXR1cm4gZmxvb3IoJGRpZmYtPmRheXMgLyA3KSAuICcgd2Vla3MgYWdvJzsKfQoKaWYgKCRkaWZmLT55IDwgMSkgewpyZXR1cm4gJGRpZmYtPm0gLiAnIG1vbnRoJyAuICgkZGlmZi0+bSA+IDEgPyAncycgOiAnJykgLiAnIGFnbyc7Cn0KCnJldHVybiAkZGlmZi0+eSAuICcgeWVhcicgLiAoJGRpZmYtPnkgPiAxID8gJ3MnIDogJycpIC4gJyBhZ28nOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXENoYW5nZVJlcG9ydEludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRHZjc0Rvd25sb2FkZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFZjc0NhcGFibGVEb3dubG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXJcQXJyYXlEdW1wZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkd1ZXNzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwoKCgoKCmNsYXNzIFN0YXR1c0NvbW1hbmQgZXh0ZW5kcyBCYXNlQ29tbWFuZAp7CnByaXZhdGUgY29uc3QgRVhJVF9DT0RFX0VSUk9SUyA9IDE7CnByaXZhdGUgY29uc3QgRVhJVF9DT0RFX1VOUFVTSEVEX0NIQU5HRVMgPSAyOwpwcml2YXRlIGNvbnN0IEVYSVRfQ09ERV9WRVJTSU9OX0NIQU5HRVMgPSA0OwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCdzdGF0dXMnKQotPnNldERlc2NyaXB0aW9uKCdTaG93cyBhIGxpc3Qgb2YgbG9jYWxseSBtb2RpZmllZCBwYWNrYWdlcycpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dE9wdGlvbigndmVyYm9zZScsICd2fHZ2fHZ2dicsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2hvdyBtb2RpZmllZCBmaWxlcyBmb3IgZWFjaCBkaXJlY3RvcnkgdGhhdCBjb250YWlucyBjaGFuZ2VzLicpLApdKQotPnNldEhlbHAoCjw8PEVPVApUaGUgc3RhdHVzIGNvbW1hbmQgZGlzcGxheXMgYSBsaXN0IG9mIGRlcGVuZGVuY2llcyB0aGF0IGhhdmUKYmVlbiBtb2RpZmllZCBsb2NhbGx5LgoKUmVhZCBtb3JlIGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMy1jbGkubWQjc3RhdHVzCkVPVAopCjsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3N0YXR1cycsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgoKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQUkVfU1RBVFVTX0NNRCwgdHJ1ZSk7CgokZXhpdENvZGUgPSAkdGhpcy0+ZG9FeGVjdXRlKCRpbnB1dCk7CgoKJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2hTY3JpcHQoU2NyaXB0RXZlbnRzOjpQT1NUX1NUQVRVU19DTUQsIHRydWUpOwoKcmV0dXJuICRleGl0Q29kZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkb0V4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogaW50CnsKCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCiRpbnN0YWxsZWRSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKCiRkbSA9ICRjb21wb3Nlci0+Z2V0RG93bmxvYWRNYW5hZ2VyKCk7CiRpbSA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpOwoKJGVycm9ycyA9IFtdOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKJHVucHVzaGVkQ2hhbmdlcyA9IFtdOwokdmNzVmVyc2lvbkNoYW5nZXMgPSBbXTsKCiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJGd1ZXNzZXIgPSBuZXcgVmVyc2lvbkd1ZXNzZXIoJGNvbXBvc2VyLT5nZXRDb25maWcoKSwgJGNvbXBvc2VyLT5nZXRMb29wKCktPmdldFByb2Nlc3NFeGVjdXRvcigpID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKSwgJHBhcnNlciwgJGlvKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcjsKCgpmb3JlYWNoICgkaW5zdGFsbGVkUmVwby0+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+Z2V0T3B0aW9uKCdieS1wYWNrYWdlJykpIHsKJG1vZGUgfD0gU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcjo6TU9ERV9CWV9QQUNLQUdFOwp9CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2xpc3QnKSkgewokbW9kZSA9IFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI6Ok1PREVfTElTVDsKfQoKJHJlcG9ydGVyLT5vdXRwdXQoJG1vZGUsICRpbnN0YWxsZWRSZXBvLCBlbXB0eSgkZmlsdGVyKSAmJiAhJGlucHV0LT5nZXRPcHRpb24oJ2FsbCcpID8gJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCkgOiBudWxsKTsKCnJldHVybiAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbW1hbmQ7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUmVxdWVzdDsKdXNlIENvbXBvc2VyXEluc3RhbGxlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFJvb3RQYWNrYWdlTG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25TZWxlY3RvcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2l0ZVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE11bHRpQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxJbnRlcnZhbHM7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBDb21wb3NlclxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKY2xhc3MgVXBkYXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKdXNlIENvbXBsZXRpb25UcmFpdDsKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+c2V0TmFtZSgndXBkYXRlJykKLT5zZXRBbGlhc2VzKFsndScsICd1cGdyYWRlJ10pCi0+c2V0RGVzY3JpcHRpb24oJ1VwZGF0ZXMgeW91ciBkZXBlbmRlbmNpZXMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIGFjY29yZGluZyB0byBjb21wb3Nlci5qc29uLCBhbmQgdXBkYXRlcyB0aGUgY29tcG9zZXIubG9jayBmaWxlJykKLT5zZXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ3BhY2thZ2VzJywgSW5wdXRBcmd1bWVudDo6SVNfQVJSQVkgfCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1BhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIHVwZGF0ZWQsIGlmIG5vdCBwcm92aWRlZCBhbGwgcGFja2FnZXMgYXJlLicsIG51bGwsICR0aGlzLT5zdWdnZXN0SW5zdGFsbGVkUGFja2FnZShmYWxzZSkpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfSVNfQVJSQVkgfCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUZW1wb3JhcnkgdmVyc2lvbiBjb25zdHJhaW50IHRvIGFkZCwgZS5nLiBmb28vYmFyOjEuMC4wIG9yIGZvby9iYXI9MS4wLjAnKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItc291cmNlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdGb3JjZXMgaW5zdGFsbGF0aW9uIGZyb20gcGFja2FnZSBzb3VyY2VzIHdoZW4gcG9zc2libGUsIGluY2x1ZGluZyBWQ1MgaW5mb3JtYXRpb24uJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLWRpc3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ZvcmNlcyBpbnN0YWxsYXRpb24gZnJvbSBwYWNrYWdlIGRpc3QgKGRlZmF1bHQgYmVoYXZpb3IpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ByZWZlci1pbnN0YWxsJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnRm9yY2VzIGluc3RhbGxhdGlvbiBmcm9tIHBhY2thZ2UgZGlzdHxzb3VyY2V8YXV0byAoYXV0byBjaG9vc2VzIHNvdXJjZSBmb3IgZGV2IHZlcnNpb25zLCBkaXN0IGZvciB0aGUgcmVzdCkuJywgbnVsbCwgJHRoaXMtPnN1Z2dlc3RQcmVmZXJJbnN0YWxsKCkpLApuZXcgSW5wdXRPcHRpb24oJ2RyeS1ydW4nLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ091dHB1dHMgdGhlIG9wZXJhdGlvbnMgYnV0IHdpbGwgbm90IGV4ZWN1dGUgYW55dGhpbmcgKGltcGxpY2l0bHkgZW5hYmxlcyAtLXZlcmJvc2UpLicpLApuZXcgSW5wdXRPcHRpb24oJ2RldicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogRW5hYmxlcyBpbnN0YWxsYXRpb24gb2YgcmVxdWlyZS1kZXYgcGFja2FnZXMgKGVuYWJsZWQgYnkgZGVmYXVsdCwgb25seSBwcmVzZW50IGZvciBCQykuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tZGV2JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNhYmxlcyBpbnN0YWxsYXRpb24gb2YgcmVxdWlyZS1kZXYgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignbG9jaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT3ZlcndyaXRlcyB0aGUgbG9jayBmaWxlIGhhc2ggdG8gc3VwcHJlc3Mgd2FybmluZyBhYm91dCB0aGUgbG9jayBmaWxlIGJlaW5nIG91dCBvZiBkYXRlIHdpdGhvdXQgdXBkYXRpbmcgcGFja2FnZSB2ZXJzaW9ucy4gUGFja2FnZSBtZXRhZGF0YSBsaWtlIG1pcnJvcnMgYW5kIFVSTHMgYXJlIHVwZGF0ZWQgaWYgdGhleSBjaGFuZ2VkLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWluc3RhbGwnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXAgdGhlIGluc3RhbGwgc3RlcCBhZnRlciB1cGRhdGluZyB0aGUgY29tcG9zZXIubG9jayBmaWxlLicpLApuZXcgSW5wdXRPcHRpb24oJ25vLWF1ZGl0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdTa2lwIHRoZSBhdWRpdCBzdGVwIGFmdGVyIHVwZGF0aW5nIHRoZSBjb21wb3Nlci5sb2NrIGZpbGUgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX0FVRElUPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignYXVkaXQtZm9ybWF0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnQXVkaXQgb3V0cHV0IGZvcm1hdC4gTXVzdCBiZSAidGFibGUiLCAicGxhaW4iLCAianNvbiIsIG9yICJzdW1tYXJ5Ii4nLCBBdWRpdG9yOjpGT1JNQVRfU1VNTUFSWSwgQXVkaXRvcjo6Rk9STUFUUyksCm5ldyBJbnB1dE9wdGlvbignbm8tc2VjdXJpdHktYmxvY2tpbmcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0FsbG93cyBpbnN0YWxsaW5nIHBhY2thZ2VzIHdpdGggc2VjdXJpdHkgYWR2aXNvcmllcyBvciB0aGF0IGFyZSBhYmFuZG9uZWQgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX05PX1NFQ1VSSVRZX0JMT0NLSU5HPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tYXV0b2xvYWRlcicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnU2tpcHMgYXV0b2xvYWRlciBnZW5lcmF0aW9uJyksCm5ldyBJbnB1dE9wdGlvbignbm8tc3VnZ2VzdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnREVQUkVDQVRFRDogVGhpcyBmbGFnIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuJyksCm5ldyBJbnB1dE9wdGlvbignbm8tcHJvZ3Jlc3MnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBvdXRwdXQgZG93bmxvYWQgcHJvZ3Jlc3MuJyksCm5ldyBJbnB1dE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnLCAndycsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVXBkYXRlIGFsc28gZGVwZW5kZW5jaWVzIG9mIHBhY2thZ2VzIGluIHRoZSBhcmd1bWVudCBsaXN0LCBleGNlcHQgdGhvc2Ugd2hpY2ggYXJlIHJvb3QgcmVxdWlyZW1lbnRzIChjYW4gYWxzbyBiZSBzZXQgdmlhIHRoZSBDT01QT1NFUl9XSVRIX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtYWxsLWRlcGVuZGVuY2llcycsICdXJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdVcGRhdGUgYWxzbyBkZXBlbmRlbmNpZXMgb2YgcGFja2FnZXMgaW4gdGhlIGFyZ3VtZW50IGxpc3QsIGluY2x1ZGluZyB0aG9zZSB3aGljaCBhcmUgcm9vdCByZXF1aXJlbWVudHMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1dJVEhfQUxMX0RFUEVOREVOQ0lFUz0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ3ZlcmJvc2UnLCAndnx2dnx2dnYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1Nob3dzIG1vcmUgZGV0YWlscyBpbmNsdWRpbmcgbmV3IGNvbW1pdHMgcHVsbGVkIGluIHdoZW4gdXBkYXRpbmcgcGFja2FnZXMuJyksCm5ldyBJbnB1dE9wdGlvbignb3B0aW1pemUtYXV0b2xvYWRlcicsICdvJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPcHRpbWl6ZSBhdXRvbG9hZGVyIGR1cmluZyBhdXRvbG9hZGVyIGR1bXAuJyksCm5ldyBJbnB1dE9wdGlvbignY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScsICdhJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdBdXRvbG9hZCBjbGFzc2VzIGZyb20gdGhlIGNsYXNzbWFwIG9ubHkuIEltcGxpY2l0bHkgZW5hYmxlcyBgLS1vcHRpbWl6ZS1hdXRvbG9hZGVyYC4nKSwKbmV3IElucHV0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1VzZSBBUEN1IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzLicpLApuZXcgSW5wdXRPcHRpb24oJ2FwY3UtYXV0b2xvYWRlci1wcmVmaXgnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdVc2UgYSBjdXN0b20gcHJlZml4IGZvciB0aGUgQVBDdSBhdXRvbG9hZGVyIGNhY2hlLiBJbXBsaWNpdGx5IGVuYWJsZXMgLS1hcGN1LWF1dG9sb2FkZXInKSwKbmV3IElucHV0T3B0aW9uKCdpZ25vcmUtcGxhdGZvcm0tcmVxJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnSWdub3JlIGEgc3BlY2lmaWMgcGxhdGZvcm0gcmVxdWlyZW1lbnQgKHBocCAmIGV4dC0gcGFja2FnZXMpLicpLApuZXcgSW5wdXRPcHRpb24oJ2lnbm9yZS1wbGF0Zm9ybS1yZXFzJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdJZ25vcmUgYWxsIHBsYXRmb3JtIHJlcXVpcmVtZW50cyAocGhwICYgZXh0LSBwYWNrYWdlcykuJyksCm5ldyBJbnB1dE9wdGlvbigncHJlZmVyLXN0YWJsZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJlZmVyIHN0YWJsZSB2ZXJzaW9ucyBvZiBkZXBlbmRlbmNpZXMgKGNhbiBhbHNvIGJlIHNldCB2aWEgdGhlIENPTVBPU0VSX1BSRUZFUl9TVEFCTEU9MSBlbnYgdmFyKS4nKSwKbmV3IElucHV0T3B0aW9uKCdwcmVmZXItbG93ZXN0JywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdQcmVmZXIgbG93ZXN0IHZlcnNpb25zIG9mIGRlcGVuZGVuY2llcyAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfUFJFRkVSX0xPV0VTVD0xIGVudiB2YXIpLicpLApuZXcgSW5wdXRPcHRpb24oJ21pbmltYWwtY2hhbmdlcycsICdtJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdPbmx5IHBlcmZvcm0gYWJzb2x1dGVseSBuZWNlc3NhcnkgY2hhbmdlcyB0byBkZXBlbmRlbmNpZXMuIElmIHBhY2thZ2VzIGNhbm5vdCBiZSBrZXB0IGF0IHRoZWlyIGN1cnJlbnRseSBsb2NrZWQgdmVyc2lvbiB0aGV5IGFyZSB1cGRhdGVkLiBGb3IgcGFydGlhbCB1cGRhdGVzIHRoZSBhbGxvdy1saXN0ZWQgcGFja2FnZXMgYXJlIGFsd2F5cyB1cGRhdGVkIGZ1bGx5LiAoY2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgQ09NUE9TRVJfTUlOSU1BTF9DSEFOR0VTPTEgZW52IHZhcikuJyksCm5ldyBJbnB1dE9wdGlvbigncGF0Y2gtb25seScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnT25seSBhbGxvdyBwYXRjaCB2ZXJzaW9uIHVwZGF0ZXMgZm9yIGN1cnJlbnRseSBpbnN0YWxsZWQgZGVwZW5kZW5jaWVzLicpLApuZXcgSW5wdXRPcHRpb24oJ2ludGVyYWN0aXZlJywgJ2knLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0ludGVyYWN0aXZlIGludGVyZmFjZSB3aXRoIGF1dG9jb21wbGV0aW9uIHRvIHNlbGVjdCB0aGUgcGFja2FnZXMgdG8gdXBkYXRlLicpLApuZXcgSW5wdXRPcHRpb24oJ3Jvb3QtcmVxcycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUmVzdHJpY3RzIHRoZSB1cGRhdGUgdG8geW91ciBmaXJzdCBkZWdyZWUgZGVwZW5kZW5jaWVzLicpLApuZXcgSW5wdXRPcHRpb24oJ2J1bXAtYWZ0ZXItdXBkYXRlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX09QVElPTkFMLCAnUnVucyBidW1wIGFmdGVyIHBlcmZvcm1pbmcgdGhlIHVwZGF0ZS4nLCBmYWxzZSwgWydkZXYnLCAnbm8tZGV2JywgJ2FsbCddKSwKXSkKLT5zZXRIZWxwKAo8PDxFT1QKVGhlIDxpbmZvPnVwZGF0ZTwvaW5mbz4gY29tbWFuZCByZWFkcyB0aGUgY29tcG9zZXIuanNvbiBmaWxlIGZyb20gdGhlCmN1cnJlbnQgZGlyZWN0b3J5LCBwcm9jZXNzZXMgaXQsIGFuZCB1cGRhdGVzLCByZW1vdmVzIG9yIGluc3RhbGxzIGFsbCB0aGUKZGVwZW5kZW5jaWVzLgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgdXBkYXRlPC9pbmZvPgoKVG8gbGltaXQgdGhlIHVwZGF0ZSBvcGVyYXRpb24gdG8gYSBmZXcgcGFja2FnZXMsIHlvdSBjYW4gbGlzdCB0aGUgcGFja2FnZShzKQp5b3Ugd2FudCB0byB1cGRhdGUgYXMgc3VjaDoKCjxpbmZvPnBocCBjb21wb3Nlci5waGFyIHVwZGF0ZSB2ZW5kb3IvcGFja2FnZTEgZm9vL215cGFja2FnZSBbLi4uXTwvaW5mbz4KCllvdSBtYXkgYWxzbyB1c2UgYW4gYXN0ZXJpc2sgKCopIHBhdHRlcm4gdG8gbGltaXQgdGhlIHVwZGF0ZSBvcGVyYXRpb24gdG8gcGFja2FnZShzKQpmcm9tIGEgc3BlY2lmaWMgdmVuZG9yOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgdXBkYXRlIHZlbmRvci9wYWNrYWdlMSBmb28vKiBbLi4uXTwvaW5mbz4KClRvIHJ1biBhbiB1cGRhdGUgd2l0aCBtb3JlIHJlc3RyaWN0aXZlIGNvbnN0cmFpbnRzIHlvdSBjYW4gdXNlOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgdXBkYXRlIC0td2l0aCB2ZW5kb3IvcGFja2FnZToxLjAuKjwvaW5mbz4KClRvIHJ1biBhIHBhcnRpYWwgdXBkYXRlIHdpdGggbW9yZSByZXN0cmljdGl2ZSBjb25zdHJhaW50cyB5b3UgY2FuIHVzZSB0aGUgc2hvcnRoYW5kOgoKPGluZm8+cGhwIGNvbXBvc2VyLnBoYXIgdXBkYXRlIHZlbmRvci9wYWNrYWdlOjEuMC4qPC9pbmZvPgoKVG8gc2VsZWN0IHBhY2thZ2VzIG5hbWVzIGludGVyYWN0aXZlbHkgd2l0aCBhdXRvLWNvbXBsZXRpb24gdXNlIDxpbmZvPi1pPC9pbmZvPi4KClJlYWQgbW9yZSBhdCBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDMtY2xpLm1kI3VwZGF0ZS11LXVwZ3JhZGUKRU9UCikKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGlvID0gJHRoaXMtPmdldElPKCk7CmlmICgkaW5wdXQtPmdldE9wdGlvbignZGV2JykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Zb3UgYXJlIHVzaW5nIHRoZSBkZXByZWNhdGVkIG9wdGlvbiAiLS1kZXYiLiBJdCBoYXMgbm8gZWZmZWN0IGFuZCB3aWxsIGJyZWFrIGluIENvbXBvc2VyIDMuPC93YXJuaW5nPicpOwp9CmlmICgkaW5wdXQtPmdldE9wdGlvbignbm8tc3VnZ2VzdCcpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSB1c2luZyB0aGUgZGVwcmVjYXRlZCBvcHRpb24gIi0tbm8tc3VnZ2VzdCIuIEl0IGhhcyBubyBlZmZlY3QgYW5kIHdpbGwgYnJlYWsgaW4gQ29tcG9zZXIgMy48L3dhcm5pbmc+Jyk7Cn0KCiRjb21wb3NlciA9ICR0aGlzLT5yZXF1aXJlQ29tcG9zZXIoKTsKCmlmICghSHR0cERvd25sb2FkZXI6OmlzQ3VybEVuYWJsZWQoKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNvbXBvc2VyIGlzIG9wZXJhdGluZyBzaWduaWZpY2FudGx5IHNsb3dlciB0aGFuIG5vcm1hbCBiZWNhdXNlIHlvdSBkbyBub3QgaGF2ZSB0aGUgUEhQIGN1cmwgZXh0ZW5zaW9uIGVuYWJsZWQuPC93YXJuaW5nPicpOwp9CgokcGFja2FnZXMgPSAkaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpOwokcmVxcyA9ICR0aGlzLT5mb3JtYXRSZXF1aXJlbWVudHMoJGlucHV0LT5nZXRPcHRpb24oJ3dpdGgnKSk7CgoKaWYgKGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CiRhbGxvd2xpc3RQYWNrYWdlc1dpdGhSZXF1aXJlbWVudHMgPSBhcnJheV9maWx0ZXIoJHBhY2thZ2VzLCBzdGF0aWMgZnVuY3Rpb24gKCRwa2cpOiBib29sIHsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJ3tcUytbID06XVxTK30nLCAkcGtnKTsKfSk7CmZvcmVhY2ggKCR0aGlzLT5mb3JtYXRSZXF1aXJlbWVudHMoJGFsbG93bGlzdFBhY2thZ2VzV2l0aFJlcXVpcmVtZW50cykgYXMgJHBhY2thZ2UgPT4gJGNvbnN0cmFpbnQpIHsKJHJlcXNbJHBhY2thZ2VdID0gJGNvbnN0cmFpbnQ7Cn0KCgpmb3JlYWNoICgkYWxsb3dsaXN0UGFja2FnZXNXaXRoUmVxdWlyZW1lbnRzIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlTmFtZSA9IFByZWc6OnJlcGxhY2UoJ3teKFteID06XSspWyA9Ol0uKiR9JywgJyQxJywgJHBhY2thZ2UpOwokaW5kZXggPSBhcnJheV9zZWFyY2goJHBhY2thZ2UsICRwYWNrYWdlcyk7CiRwYWNrYWdlc1skaW5kZXhdID0gJHBhY2thZ2VOYW1lOwp9Cn0KCiRyb290UGFja2FnZSA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpOwokcm9vdFBhY2thZ2UtPnNldFJlZmVyZW5jZXMoUm9vdFBhY2thZ2VMb2FkZXI6OmV4dHJhY3RSZWZlcmVuY2VzKCRyZXFzLCAkcm9vdFBhY2thZ2UtPmdldFJlZmVyZW5jZXMoKSkpOwokcm9vdFBhY2thZ2UtPnNldFN0YWJpbGl0eUZsYWdzKFJvb3RQYWNrYWdlTG9hZGVyOjpleHRyYWN0U3RhYmlsaXR5RmxhZ3MoJHJlcXMsICRyb290UGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpLCAkcm9vdFBhY2thZ2UtPmdldFN0YWJpbGl0eUZsYWdzKCkpKTsKCiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJHRlbXBvcmFyeUNvbnN0cmFpbnRzID0gW107CiRyb290UmVxdWlyZW1lbnRzID0gYXJyYXlfbWVyZ2UoJHJvb3RQYWNrYWdlLT5nZXRSZXF1aXJlcygpLCAkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpOwpmb3JlYWNoICgkcmVxcyBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewokcGFja2FnZSA9IHN0cnRvbG93ZXIoJHBhY2thZ2UpOwokcGFyc2VkQ29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwokdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2VdID0gJHBhcnNlZENvbnN0cmFpbnQ7CmlmIChpc3NldCgkcm9vdFJlcXVpcmVtZW50c1skcGFja2FnZV0pICYmICFJbnRlcnZhbHM6OmhhdmVJbnRlcnNlY3Rpb25zKCRwYXJzZWRDb25zdHJhaW50LCAkcm9vdFJlcXVpcmVtZW50c1skcGFja2FnZV0tPmdldENvbnN0cmFpbnQoKSkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+VGhlIHRlbXBvcmFyeSBjb25zdHJhaW50ICInLiRjb25zdHJhaW50LiciIGZvciAiJy4kcGFja2FnZS4nIiBtdXN0IGJlIGEgc3Vic2V0IG9mIHRoZSBjb25zdHJhaW50IGluIHlvdXIgY29tcG9zZXIuanNvbiAoJy4kcm9vdFJlcXVpcmVtZW50c1skcGFja2FnZV0tPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nKTwvZXJyb3I+Jyk7CiRpby0+d3JpdGUoJzxpbmZvPlJ1biBgY29tcG9zZXIgcmVxdWlyZSAnLiRwYWNrYWdlLidgIG9yIGBjb21wb3NlciByZXF1aXJlICcuJHBhY2thZ2UuJzonLiRjb25zdHJhaW50LidgIGluc3RlYWQgdG8gcmVwbGFjZSB0aGUgY29uc3RyYWludDwvaW5mbz4nKTsKCnJldHVybiBzZWxmOjpGQUlMVVJFOwp9Cn0KCmlmICgkaW5wdXQtPmdldE9wdGlvbigncGF0Y2gtb25seScpKSB7CmlmICghJGNvbXBvc2VyLT5nZXRMb2NrZXIoKS0+aXNMb2NrZWQoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigncGF0Y2gtb25seSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBsb2NrIGZpbGUgcHJlc2VudCcpOwp9CmZvcmVhY2ggKCRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmdldExvY2tlZFJlcG9zaXRvcnkodHJ1ZSktPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5pc0RldigpKSB7CmNvbnRpbnVlOwp9CmlmICghUHJlZzo6aXNNYXRjaCgne14oXGQrXC5cZCtcLlxkKyl9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJG1hdGNoKSkgewpjb250aW51ZTsKfQokY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJ34nLiRtYXRjaFsxXSk7CmlmIChpc3NldCgkdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiR0ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9IE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKFskdGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0sICRjb25zdHJhaW50XSwgdHJ1ZSk7Cn0gZWxzZSB7CiR0ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRjb25zdHJhaW50Owp9Cn0KfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdpbnRlcmFjdGl2ZScpKSB7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlc0ludGVyYWN0aXZlbHkoJGlvLCAkaW5wdXQsICRvdXRwdXQsICRjb21wb3NlciwgJHBhY2thZ2VzKTsKfQoKaWYgKCRpbnB1dC0+Z2V0T3B0aW9uKCdyb290LXJlcXMnKSkgewokcmVxdWlyZXMgPSBhcnJheV9rZXlzKCRyb290UGFja2FnZS0+Z2V0UmVxdWlyZXMoKSk7CmlmICghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKSB7CiRyZXF1aXJlcyA9IGFycmF5X21lcmdlKCRyZXF1aXJlcywgYXJyYXlfa2V5cygkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpKTsKfQoKaWYgKCFlbXB0eSgkcGFja2FnZXMpKSB7CiRwYWNrYWdlcyA9IGFycmF5X2ludGVyc2VjdCgkcGFja2FnZXMsICRyZXF1aXJlcyk7Cn0gZWxzZSB7CiRwYWNrYWdlcyA9ICRyZXF1aXJlczsKfQp9CgoKCiRmaWx0ZXJlZFBhY2thZ2VzID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcGFja2FnZSk6IGJvb2wgewpyZXR1cm4gIWluX2FycmF5KCRwYWNrYWdlLCBbJ2xvY2snLCAnbm90aGluZycsICdtaXJyb3JzJ10sIHRydWUpOwp9KTsKJHVwZGF0ZU1pcnJvcnMgPSAkaW5wdXQtPmdldE9wdGlvbignbG9jaycpIHx8IGNvdW50KCRmaWx0ZXJlZFBhY2thZ2VzKSAhPT0gY291bnQoJHBhY2thZ2VzKTsKJHBhY2thZ2VzID0gJGZpbHRlcmVkUGFja2FnZXM7CgppZiAoJHVwZGF0ZU1pcnJvcnMgJiYgIWVtcHR5KCRwYWNrYWdlcykpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+WW91IGNhbm5vdCBzaW11bHRhbmVvdXNseSB1cGRhdGUgb25seSBhIHNlbGVjdGlvbiBvZiBwYWNrYWdlcyBhbmQgcmVnZW5lcmF0ZSB0aGUgbG9jayBmaWxlIG1ldGFkYXRhLjwvZXJyb3I+Jyk7CgpyZXR1cm4gLTE7Cn0KCiRjb21tYW5kRXZlbnQgPSBuZXcgQ29tbWFuZEV2ZW50KFBsdWdpbkV2ZW50czo6Q09NTUFORCwgJ3VwZGF0ZScsICRpbnB1dCwgJG91dHB1dCk7CiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmRpc3BhdGNoKCRjb21tYW5kRXZlbnQtPmdldE5hbWUoKSwgJGNvbW1hbmRFdmVudCk7CgokY29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+c2V0T3V0cHV0UHJvZ3Jlc3MoISRpbnB1dC0+Z2V0T3B0aW9uKCduby1wcm9ncmVzcycpKTsKCiRpbnN0YWxsID0gSW5zdGFsbGVyOjpjcmVhdGUoJGlvLCAkY29tcG9zZXIpOwoKJGNvbmZpZyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCk7ClskcHJlZmVyU291cmNlLCAkcHJlZmVyRGlzdF0gPSAkdGhpcy0+Z2V0UHJlZmVycmVkSW5zdGFsbE9wdGlvbnMoJGNvbmZpZywgJGlucHV0KTsKCiRvcHRpbWl6ZSA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdvcHRpbWl6ZS1hdXRvbG9hZGVyJykgfHwgJGNvbmZpZy0+Z2V0KCdvcHRpbWl6ZS1hdXRvbG9hZGVyJyk7CiRhdXRob3JpdGF0aXZlID0gJGlucHV0LT5nZXRPcHRpb24oJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKSB8fCAkY29uZmlnLT5nZXQoJ2NsYXNzbWFwLWF1dGhvcml0YXRpdmUnKTsKJGFwY3VQcmVmaXggPSAkaW5wdXQtPmdldE9wdGlvbignYXBjdS1hdXRvbG9hZGVyLXByZWZpeCcpOwokYXBjdSA9ICRhcGN1UHJlZml4ICE9PSBudWxsIHx8ICRpbnB1dC0+Z2V0T3B0aW9uKCdhcGN1LWF1dG9sb2FkZXInKSB8fCAkY29uZmlnLT5nZXQoJ2FwY3UtYXV0b2xvYWRlcicpOwokbWluaW1hbENoYW5nZXMgPSAkaW5wdXQtPmdldE9wdGlvbignbWluaW1hbC1jaGFuZ2VzJykgfHwgJGNvbmZpZy0+Z2V0KCd1cGRhdGUtd2l0aC1taW5pbWFsLWNoYW5nZXMnKTsKCiR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSBSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQ7CmlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1hbGwtZGVwZW5kZW5jaWVzJykpIHsKJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFM7Cn0gZWxzZWlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQU19OT19ST09UX1JFUVVJUkU7Cn0KCiRpbnN0YWxsCi0+c2V0RHJ5UnVuKCRpbnB1dC0+Z2V0T3B0aW9uKCdkcnktcnVuJykpCi0+c2V0VmVyYm9zZSgkaW5wdXQtPmdldE9wdGlvbigndmVyYm9zZScpKQotPnNldFByZWZlclNvdXJjZSgkcHJlZmVyU291cmNlKQotPnNldFByZWZlckRpc3QoJHByZWZlckRpc3QpCi0+c2V0RGV2TW9kZSghJGlucHV0LT5nZXRPcHRpb24oJ25vLWRldicpKQotPnNldER1bXBBdXRvbG9hZGVyKCEkaW5wdXQtPmdldE9wdGlvbignbm8tYXV0b2xvYWRlcicpKQotPnNldE9wdGltaXplQXV0b2xvYWRlcigkb3B0aW1pemUpCi0+c2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRhdXRob3JpdGF0aXZlKQotPnNldEFwY3VBdXRvbG9hZGVyKCRhcGN1LCAkYXBjdVByZWZpeCkKLT5zZXRVcGRhdGUodHJ1ZSkKLT5zZXRJbnN0YWxsKCEkaW5wdXQtPmdldE9wdGlvbignbm8taW5zdGFsbCcpKQotPnNldFVwZGF0ZU1pcnJvcnMoJHVwZGF0ZU1pcnJvcnMpCi0+c2V0VXBkYXRlQWxsb3dMaXN0KCRwYWNrYWdlcykKLT5zZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcykKLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCkpCi0+c2V0UHJlZmVyU3RhYmxlKCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItc3RhYmxlJykpCi0+c2V0UHJlZmVyTG93ZXN0KCRpbnB1dC0+Z2V0T3B0aW9uKCdwcmVmZXItbG93ZXN0JykpCi0+c2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoJHRlbXBvcmFyeUNvbnN0cmFpbnRzKQotPnNldEF1ZGl0Q29uZmlnKCR0aGlzLT5jcmVhdGVBdWRpdENvbmZpZygkY29tcG9zZXItPmdldENvbmZpZygpLCAkaW5wdXQpKQotPnNldE1pbmltYWxVcGRhdGUoJG1pbmltYWxDaGFuZ2VzKQo7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ25vLXBsdWdpbnMnKSkgewokaW5zdGFsbC0+ZGlzYWJsZVBsdWdpbnMoKTsKfQoKJHJlc3VsdCA9ICRpbnN0YWxsLT5ydW4oKTsKCmlmICgkcmVzdWx0ID09PSAwICYmICEkaW5wdXQtPmdldE9wdGlvbignbG9jaycpKSB7CiRidW1wQWZ0ZXJVcGRhdGUgPSAkaW5wdXQtPmdldE9wdGlvbignYnVtcC1hZnRlci11cGRhdGUnKTsKaWYgKGZhbHNlID09PSAkYnVtcEFmdGVyVXBkYXRlKSB7CiRidW1wQWZ0ZXJVcGRhdGUgPSAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2J1bXAtYWZ0ZXItdXBkYXRlJyk7Cn0KCmlmIChmYWxzZSAhPT0gJGJ1bXBBZnRlclVwZGF0ZSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkJ1bXBpbmcgZGVwZW5kZW5jaWVzPC9pbmZvPicpOwokYnVtcENvbW1hbmQgPSBuZXcgQnVtcENvbW1hbmQoKTsKJGJ1bXBDb21tYW5kLT5zZXRDb21wb3NlcigkY29tcG9zZXIpOwokcmVzdWx0ID0gJGJ1bXBDb21tYW5kLT5kb0J1bXAoCiRpbywKJGJ1bXBBZnRlclVwZGF0ZSA9PT0gJ2RldicsCiRidW1wQWZ0ZXJVcGRhdGUgPT09ICduby1kZXYnLAokaW5wdXQtPmdldE9wdGlvbignZHJ5LXJ1bicpLAokaW5wdXQtPmdldEFyZ3VtZW50KCdwYWNrYWdlcycpLAonLS1idW1wLWFmdGVyLXVwZGF0ZT1kZXYnCik7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VzSW50ZXJhY3RpdmVseShJT0ludGVyZmFjZSAkaW8sIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIENvbXBvc2VyICRjb21wb3NlciwgYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewppZiAoISRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCctLWludGVyYWN0aXZlIGNhbm5vdCBiZSB1c2VkIGluIG5vbi1pbnRlcmFjdGl2ZSB0ZXJtaW5hbHMuJyk7Cn0KCiRwbGF0Zm9ybVJlcUZpbHRlciA9ICR0aGlzLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKCRpbnB1dCk7CiRzdGFiaWxpdHlGbGFncyA9ICRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRTdGFiaWxpdHlGbGFncygpOwokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgKJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldFJlcXVpcmVzKCksCiRjb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXREZXZSZXF1aXJlcygpCik7CgokZmlsdGVyID0gXGNvdW50KCRwYWNrYWdlcykgPiAwID8gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKCRwYWNrYWdlcykgOiBudWxsOwoKJGlvLT53cml0ZUVycm9yKCc8aW5mbz5Mb2FkaW5nIHBhY2thZ2VzIHRoYXQgY2FuIGJlIHVwZGF0ZWQuLi48L2luZm8+Jyk7CiRhdXRvY29tcGxldGVyVmFsdWVzID0gW107CiRpbnN0YWxsZWRQYWNrYWdlcyA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCktPmlzTG9ja2VkKCkgPyAkY29tcG9zZXItPmdldExvY2tlcigpLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpLT5nZXRQYWNrYWdlcygpIDogJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKTsKJHZlcnNpb25TZWxlY3RvciA9ICR0aGlzLT5jcmVhdGVWZXJzaW9uU2VsZWN0b3IoJGNvbXBvc2VyKTsKZm9yZWFjaCAoJGluc3RhbGxlZFBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmICgkZmlsdGVyICE9PSBudWxsICYmICFQcmVnOjppc01hdGNoKCRmaWx0ZXIsICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmNvbnRpbnVlOwp9CiRjdXJyZW50VmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7CiRjb25zdHJhaW50ID0gaXNzZXQoJHJlcXVpcmVzWyRwYWNrYWdlLT5nZXROYW1lKCldKSA/ICRyZXF1aXJlc1skcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0UHJldHR5Q29uc3RyYWludCgpIDogbnVsbDsKJHN0YWJpbGl0eSA9IGlzc2V0KCRzdGFiaWxpdHlGbGFnc1skcGFja2FnZS0+Z2V0TmFtZSgpXSkgPyAoc3RyaW5nKSBhcnJheV9zZWFyY2goJHN0YWJpbGl0eUZsYWdzWyRwYWNrYWdlLT5nZXROYW1lKCldLCBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMsIHRydWUpIDogJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCktPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKJGxhdGVzdFZlcnNpb24gPSAkdmVyc2lvblNlbGVjdG9yLT5maW5kQmVzdENhbmRpZGF0ZSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkY29uc3RyYWludCwgJHN0YWJpbGl0eSwgJHBsYXRmb3JtUmVxRmlsdGVyKTsKaWYgKCRsYXRlc3RWZXJzaW9uICE9PSBmYWxzZSAmJiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSAhPT0gJGxhdGVzdFZlcnNpb24tPmdldFZlcnNpb24oKSB8fCAkbGF0ZXN0VmVyc2lvbi0+aXNEZXYoKSkpIHsKJGF1dG9jb21wbGV0ZXJWYWx1ZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAnPGNvbW1lbnQ+JyAuICRjdXJyZW50VmVyc2lvbiAuICc8L2NvbW1lbnQ+ID0+IDxjb21tZW50PicgLiAkbGF0ZXN0VmVyc2lvbi0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJzwvY29tbWVudD4nOwp9Cn0KaWYgKDAgPT09IFxjb3VudCgkaW5zdGFsbGVkUGFja2FnZXMpKSB7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxID0+ICRjb25zdHJhaW50KSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpKSB7CmNvbnRpbnVlOwp9CiRhdXRvY29tcGxldGVyVmFsdWVzWyRyZXFdID0gJyc7Cn0KfQoKaWYgKDAgPT09IFxjb3VudCgkYXV0b2NvbXBsZXRlclZhbHVlcykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZmluZCBhbnkgcGFja2FnZSB3aXRoIG5ldyB2ZXJzaW9ucyBhdmFpbGFibGUnKTsKfQoKJHBhY2thZ2VzID0gJGlvLT5zZWxlY3QoCidTZWxlY3QgcGFja2FnZXM6IChTZWxlY3QgbW9yZSB0aGFuIG9uZSB2YWx1ZSBzZXBhcmF0ZWQgYnkgY29tbWEpICcsCiRhdXRvY29tcGxldGVyVmFsdWVzLApmYWxzZSwKMSwKJ05vIHBhY2thZ2UgbmFtZWQgIiVzIiBpcyBpbnN0YWxsZWQuJywKdHJ1ZQopOwoKJHRhYmxlID0gbmV3IFRhYmxlKCRvdXRwdXQpOwokdGFibGUtPnNldEhlYWRlcnMoWydTZWxlY3RlZCBwYWNrYWdlcyddKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0YWJsZS0+YWRkUm93KFskcGFja2FnZV0pOwp9CiR0YWJsZS0+cmVuZGVyKCk7CgppZiAoJGlvLT5hc2tDb25maXJtYXRpb24oc3ByaW50ZigKJ1dvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlIGFuZCB1cGRhdGUgdGhlIGFib3ZlIHBhY2thZ2UlcyBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcsCjEgPT09IGNvdW50KCRwYWNrYWdlcykgPyAnJyA6ICdzJwopKSkgewpyZXR1cm4gJHBhY2thZ2VzOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0luc3RhbGxhdGlvbiBhYm9ydGVkLicpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVZlcnNpb25TZWxlY3RvcihDb21wb3NlciAkY29tcG9zZXIpOiBWZXJzaW9uU2VsZWN0b3IKewokcmVwb3NpdG9yeVNldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KG5ldyBDb21wb3NpdGVSZXBvc2l0b3J5KGFycmF5X2ZpbHRlcigkY29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldFJlcG9zaXRvcmllcygpLCBzdGF0aWMgZnVuY3Rpb24gKFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpIHsKcmV0dXJuICEkcmVwb3NpdG9yeSBpbnN0YW5jZW9mIFBsYXRmb3JtUmVwb3NpdG9yeTsKfSkpKTsKCnJldHVybiBuZXcgVmVyc2lvblNlbGVjdG9yKCRyZXBvc2l0b3J5U2V0KTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb21tYW5kOwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcVXRpbFxDb25maWdWYWxpZGF0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKCmNsYXNzIFZhbGlkYXRlQ29tbWFuZCBleHRlbmRzIEJhc2VDb21tYW5kCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpOiB2b2lkCnsKJHRoaXMKLT5zZXROYW1lKCd2YWxpZGF0ZScpCi0+c2V0RGVzY3JpcHRpb24oJ1ZhbGlkYXRlcyBhIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2snKQotPnNldERlZmluaXRpb24oWwpuZXcgSW5wdXRPcHRpb24oJ25vLWNoZWNrLWFsbCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IHZhbGlkYXRlIHJlcXVpcmVzIGZvciBvdmVybHkgc3RyaWN0L2xvb3NlIGNvbnN0cmFpbnRzJyksCm5ldyBJbnB1dE9wdGlvbignY2hlY2stbG9jaycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnQ2hlY2sgaWYgbG9jayBmaWxlIGlzIHVwIHRvIGRhdGUgKGV2ZW4gd2hlbiBjb25maWcubG9jayBpcyBmYWxzZSknKSwKbmV3IElucHV0T3B0aW9uKCduby1jaGVjay1sb2NrJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgY2hlY2sgaWYgbG9jayBmaWxlIGlzIHVwIHRvIGRhdGUnKSwKbmV3IElucHV0T3B0aW9uKCduby1jaGVjay1wdWJsaXNoJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEbyBub3QgY2hlY2sgZm9yIHB1Ymxpc2ggZXJyb3JzJyksCm5ldyBJbnB1dE9wdGlvbignbm8tY2hlY2stdmVyc2lvbicsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IHJlcG9ydCBhIHdhcm5pbmcgaWYgdGhlIHZlcnNpb24gZmllbGQgaXMgcHJlc2VudCcpLApuZXcgSW5wdXRPcHRpb24oJ3dpdGgtZGVwZW5kZW5jaWVzJywgJ0EnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Fsc28gdmFsaWRhdGUgdGhlIGNvbXBvc2VyLmpzb24gb2YgYWxsIGluc3RhbGxlZCBkZXBlbmRlbmNpZXMnKSwKbmV3IElucHV0T3B0aW9uKCdzdHJpY3QnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1JldHVybiBhIG5vbi16ZXJvIGV4aXQgY29kZSBmb3Igd2FybmluZ3MgYXMgd2VsbCBhcyBlcnJvcnMnKSwKbmV3IElucHV0QXJndW1lbnQoJ2ZpbGUnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ3BhdGggdG8gY29tcG9zZXIuanNvbiBmaWxlJyksCl0pCi0+c2V0SGVscCgKPDw8RU9UClRoZSB2YWxpZGF0ZSBjb21tYW5kIHZhbGlkYXRlcyBhIGdpdmVuIGNvbXBvc2VyLmpzb24gYW5kIGNvbXBvc2VyLmxvY2sKCkV4aXQgY29kZXMgaW4gY2FzZSBvZiBlcnJvcnMgYXJlOgoxIHZhbGlkYXRpb24gd2FybmluZyhzKSwgb25seSB3aGVuIC0tc3RyaWN0IGlzIGdpdmVuCjIgdmFsaWRhdGlvbiBlcnJvcihzKQozIGZpbGUgdW5yZWFkYWJsZSBvciBtaXNzaW5nCgpSZWFkIG1vcmUgYXQgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCN2YWxpZGF0ZQpFT1QKKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiRmaWxlID0gJGlucHV0LT5nZXRBcmd1bWVudCgnZmlsZScpID8/IEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpOwokaW8gPSAkdGhpcy0+Z2V0SU8oKTsKCmlmICghZmlsZV9leGlzdHMoJGZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicgLiAkZmlsZSAuICcgbm90IGZvdW5kLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMzsKfQppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicgLiAkZmlsZSAuICcgaXMgbm90IHJlYWRhYmxlLjwvZXJyb3I+Jyk7CgpyZXR1cm4gMzsKfQoKJHZhbGlkYXRvciA9IG5ldyBDb25maWdWYWxpZGF0b3IoJGlvKTsKJGNoZWNrQWxsID0gJGlucHV0LT5nZXRPcHRpb24oJ25vLWNoZWNrLWFsbCcpID8gMCA6IFZhbGlkYXRpbmdBcnJheUxvYWRlcjo6Q0hFQ0tfQUxMOwokY2hlY2tQdWJsaXNoID0gISRpbnB1dC0+Z2V0T3B0aW9uKCduby1jaGVjay1wdWJsaXNoJyk7CiRjaGVja0xvY2sgPSAhJGlucHV0LT5nZXRPcHRpb24oJ25vLWNoZWNrLWxvY2snKTsKJGNoZWNrVmVyc2lvbiA9ICRpbnB1dC0+Z2V0T3B0aW9uKCduby1jaGVjay12ZXJzaW9uJykgPyAwIDogQ29uZmlnVmFsaWRhdG9yOjpDSEVDS19WRVJTSU9OOwokaXNTdHJpY3QgPSAkaW5wdXQtPmdldE9wdGlvbignc3RyaWN0Jyk7ClskZXJyb3JzLCAkcHVibGlzaEVycm9ycywgJHdhcm5pbmdzXSA9ICR2YWxpZGF0b3ItPnZhbGlkYXRlKCRmaWxlLCAkY2hlY2tBbGwsICRjaGVja1ZlcnNpb24pOwoKJGxvY2tFcnJvcnMgPSBbXTsKJGNvbXBvc2VyID0gJHRoaXMtPmNyZWF0ZUNvbXBvc2VySW5zdGFuY2UoJGlucHV0LCAkaW8sICRmaWxlKTsKCiRjaGVja0xvY2sgPSAoJGNoZWNrTG9jayAmJiAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2xvY2snKSkgfHwgJGlucHV0LT5nZXRPcHRpb24oJ2NoZWNrLWxvY2snKTsKJGxvY2tlciA9ICRjb21wb3Nlci0+Z2V0TG9ja2VyKCk7CmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpICYmICEkbG9ja2VyLT5pc0ZyZXNoKCkpIHsKJGxvY2tFcnJvcnNbXSA9ICctIFRoZSBsb2NrIGZpbGUgaXMgbm90IHVwIHRvIGRhdGUgd2l0aCB0aGUgbGF0ZXN0IGNoYW5nZXMgaW4gY29tcG9zZXIuanNvbiwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgcnVuIGBjb21wb3NlciB1cGRhdGVgIG9yIGBjb21wb3NlciB1cGRhdGUgPHBhY2thZ2UgbmFtZT5gLic7Cn0KCmlmICgkbG9ja2VyLT5pc0xvY2tlZCgpKSB7CiRsb2NrRXJyb3JzID0gYXJyYXlfbWVyZ2UoJGxvY2tFcnJvcnMsICRsb2NrZXItPmdldE1pc3NpbmdSZXF1aXJlbWVudEluZm8oJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCksIHRydWUpKTsKfQoKJHRoaXMtPm91dHB1dFJlc3VsdCgkaW8sICRmaWxlLCAkZXJyb3JzLCAkd2FybmluZ3MsICRjaGVja1B1Ymxpc2gsICRwdWJsaXNoRXJyb3JzLCAkY2hlY2tMb2NrLCAkbG9ja0Vycm9ycywgdHJ1ZSk7CgoKJGV4aXRDb2RlID0gY291bnQoJGVycm9ycykgPiAwID8gMiA6ICgoJGlzU3RyaWN0ICYmIGNvdW50KCR3YXJuaW5ncykgPiAwKSA/IDEgOiAwKTsKCmlmICgkaW5wdXQtPmdldE9wdGlvbignd2l0aC1kZXBlbmRlbmNpZXMnKSkgewokbG9jYWxSZXBvID0gJGNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKZm9yZWFjaCAoJGxvY2FsUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcGF0aCA9ICRjb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CmlmIChudWxsID09PSAkcGF0aCkgewpjb250aW51ZTsKfQokZmlsZSA9ICRwYXRoIC4gJy9jb21wb3Nlci5qc29uJzsKaWYgKGlzX2RpcigkcGF0aCkgJiYgZmlsZV9leGlzdHMoJGZpbGUpKSB7ClskZXJyb3JzLCAkcHVibGlzaEVycm9ycywgJHdhcm5pbmdzXSA9ICR2YWxpZGF0b3ItPnZhbGlkYXRlKCRmaWxlLCAkY2hlY2tBbGwsICRjaGVja1ZlcnNpb24pOwoKJHRoaXMtPm91dHB1dFJlc3VsdCgkaW8sICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCksICRlcnJvcnMsICR3YXJuaW5ncywgJGNoZWNrUHVibGlzaCwgJHB1Ymxpc2hFcnJvcnMpOwoKCiRkZXBDb2RlID0gY291bnQoJGVycm9ycykgPiAwID8gMiA6ICgoJGlzU3RyaWN0ICYmIGNvdW50KCR3YXJuaW5ncykgPiAwKSA/IDEgOiAwKTsKJGV4aXRDb2RlID0gbWF4KCRkZXBDb2RlLCAkZXhpdENvZGUpOwp9Cn0KfQoKJGNvbW1hbmRFdmVudCA9IG5ldyBDb21tYW5kRXZlbnQoUGx1Z2luRXZlbnRzOjpDT01NQU5ELCAndmFsaWRhdGUnLCAkaW5wdXQsICRvdXRwdXQpOwokZXZlbnRDb2RlID0gJGNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+ZGlzcGF0Y2goJGNvbW1hbmRFdmVudC0+Z2V0TmFtZSgpLCAkY29tbWFuZEV2ZW50KTsKCnJldHVybiBtYXgoJGV2ZW50Q29kZSwgJGV4aXRDb2RlKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRSZXN1bHQoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJG5hbWUsIGFycmF5ICYkZXJyb3JzLCBhcnJheSAmJHdhcm5pbmdzLCBib29sICRjaGVja1B1Ymxpc2ggPSBmYWxzZSwgYXJyYXkgJHB1Ymxpc2hFcnJvcnMgPSBbXSwgYm9vbCAkY2hlY2tMb2NrID0gZmFsc2UsIGFycmF5ICRsb2NrRXJyb3JzID0gW10sIGJvb2wgJHByaW50U2NoZW1hVXJsID0gZmFsc2UpOiB2b2lkCnsKJGRvUHJpbnRTY2hlbWFVcmwgPSBmYWxzZTsKCmlmIChcY291bnQoJGVycm9ycykgPiAwKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPicgLiAkbmFtZSAuICcgaXMgaW52YWxpZCwgdGhlIGZvbGxvd2luZyBlcnJvcnMvd2FybmluZ3Mgd2VyZSBmb3VuZDo8L2Vycm9yPicpOwp9IGVsc2VpZiAoXGNvdW50KCRwdWJsaXNoRXJyb3JzKSA+IDAgJiYgJGNoZWNrUHVibGlzaCkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQgZm9yIHNpbXBsZSB1c2FnZSB3aXRoIENvbXBvc2VyIGJ1dCBoYXM8L2luZm8+Jyk7CiRpby0+d3JpdGVFcnJvcignPGluZm8+c3RyaWN0IGVycm9ycyB0aGF0IG1ha2UgaXQgdW5hYmxlIHRvIGJlIHB1Ymxpc2hlZCBhcyBhIHBhY2thZ2U8L2luZm8+Jyk7CiRkb1ByaW50U2NoZW1hVXJsID0gJHByaW50U2NoZW1hVXJsOwp9IGVsc2VpZiAoXGNvdW50KCR3YXJuaW5ncykgPiAwKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+JyAuICRuYW1lIC4gJyBpcyB2YWxpZCwgYnV0IHdpdGggYSBmZXcgd2FybmluZ3M8L2luZm8+Jyk7CiRkb1ByaW50U2NoZW1hVXJsID0gJHByaW50U2NoZW1hVXJsOwp9IGVsc2VpZiAoXGNvdW50KCRsb2NrRXJyb3JzKSA+IDApIHsKJGlvLT53cml0ZSgnPGluZm8+JyAuICRuYW1lIC4gJyBpcyB2YWxpZCBidXQgeW91ciBjb21wb3Nlci5sb2NrIGhhcyBzb21lICcuKCRjaGVja0xvY2sgPyAnZXJyb3JzJyA6ICd3YXJuaW5ncycpLic8L2luZm8+Jyk7Cn0gZWxzZSB7CiRpby0+d3JpdGUoJzxpbmZvPicgLiAkbmFtZSAuICcgaXMgdmFsaWQ8L2luZm8+Jyk7Cn0KCmlmICgkZG9QcmludFNjaGVtYVVybCkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDQtc2NoZW1hLm1kIGZvciBkZXRhaWxzIG9uIHRoZSBzY2hlbWE8L3dhcm5pbmc+Jyk7Cn0KCmlmIChcY291bnQoJGVycm9ycykgPiAwKSB7CiRlcnJvcnMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZXJyKTogc3RyaW5nIHsKcmV0dXJuICctICcgLiAkZXJyOwp9LCAkZXJyb3JzKTsKYXJyYXlfdW5zaGlmdCgkZXJyb3JzLCAnIyBHZW5lcmFsIGVycm9ycycpOwp9CmlmIChcY291bnQoJHdhcm5pbmdzKSA+IDApIHsKJHdhcm5pbmdzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVycik6IHN0cmluZyB7CnJldHVybiAnLSAnIC4gJGVycjsKfSwgJHdhcm5pbmdzKTsKYXJyYXlfdW5zaGlmdCgkd2FybmluZ3MsICcjIEdlbmVyYWwgd2FybmluZ3MnKTsKfQoKCiRleHRyYVdhcm5pbmdzID0gW107CgoKaWYgKFxjb3VudCgkcHVibGlzaEVycm9ycykgPiAwICYmICRjaGVja1B1Ymxpc2gpIHsKJHB1Ymxpc2hFcnJvcnMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZXJyKTogc3RyaW5nIHsKcmV0dXJuICctICcgLiAkZXJyOwp9LCAkcHVibGlzaEVycm9ycyk7CgphcnJheV91bnNoaWZ0KCRwdWJsaXNoRXJyb3JzLCAnIyBQdWJsaXNoIGVycm9ycycpOwokZXJyb3JzID0gYXJyYXlfbWVyZ2UoJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMpOwp9CgoKaWYgKFxjb3VudCgkbG9ja0Vycm9ycykgPiAwKSB7CmlmICgkY2hlY2tMb2NrKSB7CmFycmF5X3Vuc2hpZnQoJGxvY2tFcnJvcnMsICcjIExvY2sgZmlsZSBlcnJvcnMnKTsKJGVycm9ycyA9IGFycmF5X21lcmdlKCRlcnJvcnMsICRsb2NrRXJyb3JzKTsKfSBlbHNlIHsKYXJyYXlfdW5zaGlmdCgkbG9ja0Vycm9ycywgJyMgTG9jayBmaWxlIHdhcm5pbmdzJyk7CiRleHRyYVdhcm5pbmdzID0gYXJyYXlfbWVyZ2UoJGV4dHJhV2FybmluZ3MsICRsb2NrRXJyb3JzKTsKfQp9CgokbWVzc2FnZXMgPSBbCidlcnJvcicgPT4gJGVycm9ycywKJ3dhcm5pbmcnID0+IGFycmF5X21lcmdlKCR3YXJuaW5ncywgJGV4dHJhV2FybmluZ3MpLApdOwoKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRzdHlsZSA9PiAkbXNncykgewpmb3JlYWNoICgkbXNncyBhcyAkbXNnKSB7CmlmIChzdHJwb3MoJG1zZywgJyMnKSA9PT0gMCkgewokaW8tPndyaXRlRXJyb3IoJzwnIC4gJHN0eWxlIC4gJz4nIC4gJG1zZyAuICc8LycgLiAkc3R5bGUgLiAnPicpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJG1zZyk7Cn0KfQp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2NrZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luTWFuYWdlcjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcQXV0b2xvYWRcQXV0b2xvYWRHZW5lcmF0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyXEFyY2hpdmVNYW5hZ2VyOwoKCgoKCgpjbGFzcyBDb21wb3NlciBleHRlbmRzIFBhcnRpYWxDb21wb3Nlcgp7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgY29uc3QgVkVSU0lPTiA9ICcyLjkuNCc7CnB1YmxpYyBjb25zdCBCUkFOQ0hfQUxJQVNfVkVSU0lPTiA9ICcnOwpwdWJsaWMgY29uc3QgUkVMRUFTRV9EQVRFID0gJzIwMjYtMDEtMjIgMTQ6MDg6NTAnOwpwdWJsaWMgY29uc3QgU09VUkNFX1ZFUlNJT04gPSAnJzsKCgoKCgoKCgoKCnB1YmxpYyBjb25zdCBSVU5USU1FX0FQSV9WRVJTSU9OID0gJzIuMi4yJzsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcKewoKaWYgKHNlbGY6OlZFUlNJT04gPT09ICdAcGFja2FnZV92ZXJzaW9uJy4nQCcpIHsKcmV0dXJuIHNlbGY6OlNPVVJDRV9WRVJTSU9OOwp9CgoKaWYgKHNlbGY6OkJSQU5DSF9BTElBU19WRVJTSU9OICE9PSAnJyAmJiBQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9Jywgc2VsZjo6VkVSU0lPTikpIHsKcmV0dXJuIHNlbGY6OkJSQU5DSF9BTElBU19WRVJTSU9OLicrJy5zZWxmOjpWRVJTSU9OOwp9CgpyZXR1cm4gc2VsZjo6VkVSU0lPTjsKfQoKCgoKcHJpdmF0ZSAkbG9ja2VyOwoKCgoKcHJpdmF0ZSAkZG93bmxvYWRNYW5hZ2VyOwoKCgoKcHJpdmF0ZSAkcGx1Z2luTWFuYWdlcjsKCgoKCnByaXZhdGUgJGF1dG9sb2FkR2VuZXJhdG9yOwoKCgoKcHJpdmF0ZSAkYXJjaGl2ZU1hbmFnZXI7CgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9ja2VyKExvY2tlciAkbG9ja2VyKTogdm9pZAp7CiR0aGlzLT5sb2NrZXIgPSAkbG9ja2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9ja2VyKCk6IExvY2tlcgp7CnJldHVybiAkdGhpcy0+bG9ja2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RG93bmxvYWRNYW5hZ2VyKERvd25sb2FkTWFuYWdlciAkbWFuYWdlcik6IHZvaWQKewokdGhpcy0+ZG93bmxvYWRNYW5hZ2VyID0gJG1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZE1hbmFnZXIoKTogRG93bmxvYWRNYW5hZ2VyCnsKcmV0dXJuICR0aGlzLT5kb3dubG9hZE1hbmFnZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlTWFuYWdlcihBcmNoaXZlTWFuYWdlciAkbWFuYWdlcik6IHZvaWQKewokdGhpcy0+YXJjaGl2ZU1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVNYW5hZ2VyKCk6IEFyY2hpdmVNYW5hZ2VyCnsKcmV0dXJuICR0aGlzLT5hcmNoaXZlTWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFBsdWdpbk1hbmFnZXIoUGx1Z2luTWFuYWdlciAkbWFuYWdlcik6IHZvaWQKewokdGhpcy0+cGx1Z2luTWFuYWdlciA9ICRtYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2luTWFuYWdlcigpOiBQbHVnaW5NYW5hZ2VyCnsKcmV0dXJuICR0aGlzLT5wbHVnaW5NYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2xvYWRHZW5lcmF0b3IoQXV0b2xvYWRHZW5lcmF0b3IgJGF1dG9sb2FkR2VuZXJhdG9yKTogdm9pZAp7CiR0aGlzLT5hdXRvbG9hZEdlbmVyYXRvciA9ICRhdXRvbG9hZEdlbmVyYXRvcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEF1dG9sb2FkR2VuZXJhdG9yKCk6IEF1dG9sb2FkR2VuZXJhdG9yCnsKcmV0dXJuICR0aGlzLT5hdXRvbG9hZEdlbmVyYXRvcjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcQ29uZmlnXENvbmZpZ1NvdXJjZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CgoKCgpjbGFzcyBDb25maWcKewpwdWJsaWMgY29uc3QgU09VUkNFX0RFRkFVTFQgPSAnZGVmYXVsdCc7CnB1YmxpYyBjb25zdCBTT1VSQ0VfQ09NTUFORCA9ICdjb21tYW5kJzsKcHVibGljIGNvbnN0IFNPVVJDRV9VTktOT1dOID0gJ3Vua25vd24nOwoKcHVibGljIGNvbnN0IFJFTEFUSVZFX1BBVEhTID0gMTsKCgpwdWJsaWMgc3RhdGljICRkZWZhdWx0Q29uZmlnID0gWwoncHJvY2Vzcy10aW1lb3V0JyA9PiAzMDAsCid1c2UtaW5jbHVkZS1wYXRoJyA9PiBmYWxzZSwKJ2FsbG93LXBsdWdpbnMnID0+IFtdLAondXNlLXBhcmVudC1kaXInID0+ICdwcm9tcHQnLAoncHJlZmVycmVkLWluc3RhbGwnID0+ICdkaXN0JywKJ2F1ZGl0JyA9PiBbJ2lnbm9yZScgPT4gW10sICdhYmFuZG9uZWQnID0+IEF1ZGl0b3I6OkFCQU5ET05FRF9GQUlMXSwKJ25vdGlmeS1vbi1pbnN0YWxsJyA9PiB0cnVlLAonZ2l0aHViLXByb3RvY29scycgPT4gWydodHRwcycsICdzc2gnLCAnZ2l0J10sCidnaXRsYWItcHJvdG9jb2wnID0+IG51bGwsCid2ZW5kb3ItZGlyJyA9PiAndmVuZG9yJywKJ2Jpbi1kaXInID0+ICd7JHZlbmRvci1kaXJ9L2JpbicsCidjYWNoZS1kaXInID0+ICd7JGhvbWV9L2NhY2hlJywKJ2RhdGEtZGlyJyA9PiAneyRob21lfScsCidjYWNoZS1maWxlcy1kaXInID0+ICd7JGNhY2hlLWRpcn0vZmlsZXMnLAonY2FjaGUtcmVwby1kaXInID0+ICd7JGNhY2hlLWRpcn0vcmVwbycsCidjYWNoZS12Y3MtZGlyJyA9PiAneyRjYWNoZS1kaXJ9L3ZjcycsCidjYWNoZS10dGwnID0+IDE1NTUyMDAwLCAKJ2NhY2hlLWZpbGVzLXR0bCcgPT4gbnVsbCwgCidjYWNoZS1maWxlcy1tYXhzaXplJyA9PiAnMzAwTWlCJywKJ2NhY2hlLXJlYWQtb25seScgPT4gZmFsc2UsCidiaW4tY29tcGF0JyA9PiAnYXV0bycsCidkaXNjYXJkLWNoYW5nZXMnID0+IGZhbHNlLAonYXV0b2xvYWRlci1zdWZmaXgnID0+IG51bGwsCidzb3J0LXBhY2thZ2VzJyA9PiBmYWxzZSwKJ29wdGltaXplLWF1dG9sb2FkZXInID0+IGZhbHNlLAonY2xhc3NtYXAtYXV0aG9yaXRhdGl2ZScgPT4gZmFsc2UsCidhcGN1LWF1dG9sb2FkZXInID0+IGZhbHNlLAoncHJlcGVuZC1hdXRvbG9hZGVyJyA9PiB0cnVlLAondXBkYXRlLXdpdGgtbWluaW1hbC1jaGFuZ2VzJyA9PiBmYWxzZSwKJ2dpdGh1Yi1kb21haW5zJyA9PiBbJ2dpdGh1Yi5jb20nXSwKJ2JpdGJ1Y2tldC1leHBvc2UtaG9zdG5hbWUnID0+IHRydWUsCidkaXNhYmxlLXRscycgPT4gZmFsc2UsCidzZWN1cmUtaHR0cCcgPT4gdHJ1ZSwKJ3NlY3VyZS1zdm4tZG9tYWlucycgPT4gW10sCidjYWZpbGUnID0+IG51bGwsCidjYXBhdGgnID0+IG51bGwsCidnaXRodWItZXhwb3NlLWhvc3RuYW1lJyA9PiB0cnVlLAonZ2l0bGFiLWRvbWFpbnMnID0+IFsnZ2l0bGFiLmNvbSddLAonc3RvcmUtYXV0aHMnID0+ICdwcm9tcHQnLAoncGxhdGZvcm0nID0+IFtdLAonYXJjaGl2ZS1mb3JtYXQnID0+ICd0YXInLAonYXJjaGl2ZS1kaXInID0+ICcuJywKJ2h0YWNjZXNzLXByb3RlY3QnID0+IHRydWUsCid1c2UtZ2l0aHViLWFwaScgPT4gdHJ1ZSwKJ2xvY2snID0+IHRydWUsCidwbGF0Zm9ybS1jaGVjaycgPT4gJ3BocC1vbmx5JywKJ2JpdGJ1Y2tldC1vYXV0aCcgPT4gW10sCidnaXRodWItb2F1dGgnID0+IFtdLAonZ2l0bGFiLW9hdXRoJyA9PiBbXSwKJ2dpdGxhYi10b2tlbicgPT4gW10sCidodHRwLWJhc2ljJyA9PiBbXSwKJ2JlYXJlcicgPT4gW10sCidjdXN0b20taGVhZGVycycgPT4gW10sCididW1wLWFmdGVyLXVwZGF0ZScgPT4gZmFsc2UsCidhbGxvdy1taXNzaW5nLXJlcXVpcmVtZW50cycgPT4gZmFsc2UsCidjbGllbnQtY2VydGlmaWNhdGUnID0+IFtdLAonZm9yZ2Vqby1kb21haW5zJyA9PiBbJ2NvZGViZXJnLm9yZyddLAonZm9yZ2Vqby10b2tlbicgPT4gW10sCl07CgoKcHVibGljIHN0YXRpYyAkZGVmYXVsdFJlcG9zaXRvcmllcyA9IFsKJ3BhY2thZ2lzdC5vcmcnID0+IFsKJ3R5cGUnID0+ICdjb21wb3NlcicsCid1cmwnID0+ICdodHRwczovL3JlcG8ucGFja2FnaXN0Lm9yZycsCl0sCl07CgoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkYmFzZURpcjsKCnByaXZhdGUgJHJlcG9zaXRvcmllczsKCnByaXZhdGUgJGNvbmZpZ1NvdXJjZTsKCnByaXZhdGUgJGF1dGhDb25maWdTb3VyY2U7Cgpwcml2YXRlICRsb2NhbEF1dGhDb25maWdTb3VyY2UgPSBudWxsOwoKcHJpdmF0ZSAkdXNlRW52aXJvbm1lbnQ7Cgpwcml2YXRlICR3YXJuZWRIb3N0cyA9IFtdOwoKcHJpdmF0ZSAkc3NsVmVyaWZ5V2FybmVkSG9zdHMgPSBbXTsKCnByaXZhdGUgJHNvdXJjZU9mQ29uZmlnVmFsdWUgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYm9vbCAkdXNlRW52aXJvbm1lbnQgPSB0cnVlLCA/c3RyaW5nICRiYXNlRGlyID0gbnVsbCkKewoKJHRoaXMtPmNvbmZpZyA9IHN0YXRpYzo6JGRlZmF1bHRDb25maWc7CgokdGhpcy0+cmVwb3NpdG9yaWVzID0gc3RhdGljOjokZGVmYXVsdFJlcG9zaXRvcmllczsKJHRoaXMtPnVzZUVudmlyb25tZW50ID0gJHVzZUVudmlyb25tZW50OwokdGhpcy0+YmFzZURpciA9IGlzX3N0cmluZygkYmFzZURpcikgJiYgJycgIT09ICRiYXNlRGlyID8gJGJhc2VEaXIgOiBudWxsOwoKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZyBhcyAkY29uZmlnS2V5ID0+ICRjb25maWdWYWx1ZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkY29uZmlnVmFsdWUsICRjb25maWdLZXksIHNlbGY6OlNPVVJDRV9ERUZBVUxUKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkY29uZmlnS2V5ID0+ICRjb25maWdWYWx1ZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkY29uZmlnVmFsdWUsICdyZXBvc2l0b3JpZXMuJyAuICRjb25maWdLZXksIHNlbGY6OlNPVVJDRV9ERUZBVUxUKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJhc2VEaXIoP3N0cmluZyAkYmFzZURpcik6IHZvaWQKewokdGhpcy0+YmFzZURpciA9ICRiYXNlRGlyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnU291cmNlKENvbmZpZ1NvdXJjZUludGVyZmFjZSAkc291cmNlKTogdm9pZAp7CiR0aGlzLT5jb25maWdTb3VyY2UgPSAkc291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnU291cmNlKCk6IENvbmZpZ1NvdXJjZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y29uZmlnU291cmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aENvbmZpZ1NvdXJjZShDb25maWdTb3VyY2VJbnRlcmZhY2UgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+YXV0aENvbmZpZ1NvdXJjZSA9ICRzb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRoQ29uZmlnU291cmNlKCk6IENvbmZpZ1NvdXJjZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+YXV0aENvbmZpZ1NvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldExvY2FsQXV0aENvbmZpZ1NvdXJjZShDb25maWdTb3VyY2VJbnRlcmZhY2UgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+bG9jYWxBdXRoQ29uZmlnU291cmNlID0gJHNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOiA/Q29uZmlnU291cmNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5sb2NhbEF1dGhDb25maWdTb3VyY2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1lcmdlKGFycmF5ICRjb25maWcsIHN0cmluZyAkc291cmNlID0gc2VsZjo6U09VUkNFX1VOS05PV04pOiB2b2lkCnsKCmlmICghZW1wdHkoJGNvbmZpZ1snY29uZmlnJ10pICYmIGlzX2FycmF5KCRjb25maWdbJ2NvbmZpZyddKSkgewpmb3JlYWNoICgkY29uZmlnWydjb25maWcnXSBhcyAka2V5ID0+ICR2YWwpIHsKaWYgKGluX2FycmF5KCRrZXksIFsnYml0YnVja2V0LW9hdXRoJywgJ2dpdGh1Yi1vYXV0aCcsICdnaXRsYWItb2F1dGgnLCAnZ2l0bGFiLXRva2VuJywgJ2h0dHAtYmFzaWMnLCAnYmVhcmVyJywgJ2NsaWVudC1jZXJ0aWZpY2F0ZScsICdmb3JnZWpvLXRva2VuJ10sIHRydWUpICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pKSB7CiR0aGlzLT5jb25maWdbJGtleV0gPSBhcnJheV9tZXJnZSgkdGhpcy0+Y29uZmlnWyRrZXldLCAkdmFsKTsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJHNvdXJjZSk7Cn0gZWxzZWlmIChpbl9hcnJheSgka2V5LCBbJ2FsbG93LXBsdWdpbnMnXSwgdHJ1ZSkgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1ska2V5XSkgJiYgaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1ska2V5XSkgJiYgaXNfYXJyYXkoJHZhbCkpIHsKCgokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHZhbCwgJHRoaXMtPmNvbmZpZ1ska2V5XSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9IGVsc2VpZiAoaW5fYXJyYXkoJGtleSwgWydnaXRsYWItZG9tYWlucycsICdnaXRodWItZG9tYWlucyddLCB0cnVlKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfdW5pcXVlKGFycmF5X21lcmdlKCR0aGlzLT5jb25maWdbJGtleV0sICR2YWwpKTsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJHNvdXJjZSk7Cn0gZWxzZWlmICgncHJlZmVycmVkLWluc3RhbGwnID09PSAka2V5ICYmIGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV0pKSB7CmlmIChpc19hcnJheSgkdmFsKSB8fCBpc19hcnJheSgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewppZiAoaXNfc3RyaW5nKCR2YWwpKSB7CiR2YWwgPSBbJyonID0+ICR2YWxdOwp9CmlmIChpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1ska2V5XSkpIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9IFsnKicgPT4gJHRoaXMtPmNvbmZpZ1ska2V5XV07CiR0aGlzLT5zb3VyY2VPZkNvbmZpZ1ZhbHVlWyRrZXkgLiAnKiddID0gJHNvdXJjZTsKfQokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJGtleV1bJyonXSkpIHsKJHdpbGRjYXJkID0gJHRoaXMtPmNvbmZpZ1ska2V5XVsnKiddOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRrZXldWycqJ10pOwokdGhpcy0+Y29uZmlnWyRrZXldWycqJ10gPSAkd2lsZGNhcmQ7Cn0KfSBlbHNlIHsKJHRoaXMtPmNvbmZpZ1ska2V5XSA9ICR2YWw7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwp9Cn0gZWxzZWlmICgnYXVkaXQnID09PSAka2V5KSB7CiRjdXJyZW50SWdub3JlcyA9ICR0aGlzLT5jb25maWdbJ2F1ZGl0J11bJ2lnbm9yZSddOwokdGhpcy0+Y29uZmlnWyRrZXldID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbmZpZ1snYXVkaXQnXSwgJHZhbCk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRzb3VyY2UpOwokdGhpcy0+Y29uZmlnWydhdWRpdCddWydpZ25vcmUnXSA9IGFycmF5X21lcmdlKCRjdXJyZW50SWdub3JlcywgJHZhbFsnaWdub3JlJ10gPz8gW10pOwp9IGVsc2UgewokdGhpcy0+Y29uZmlnWyRrZXldID0gJHZhbDsKJHRoaXMtPnNldFNvdXJjZU9mQ29uZmlnVmFsdWUoJHZhbCwgJGtleSwgJHNvdXJjZSk7Cn0KfQp9CgppZiAoIWVtcHR5KCRjb25maWdbJ3JlcG9zaXRvcmllcyddKSAmJiBpc19hcnJheSgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkpIHsKJHRoaXMtPnJlcG9zaXRvcmllcyA9IGFycmF5X3JldmVyc2UoJHRoaXMtPnJlcG9zaXRvcmllcywgdHJ1ZSk7CiRuZXdSZXBvcyA9IGFycmF5X3JldmVyc2UoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10sIHRydWUpOwpmb3JlYWNoICgkbmV3UmVwb3MgYXMgJG5hbWUgPT4gJHJlcG9zaXRvcnkpIHsKCgppZiAoZmFsc2UgPT09ICRyZXBvc2l0b3J5KSB7CiR0aGlzLT5kaXNhYmxlUmVwb0J5TmFtZSgoc3RyaW5nKSAkbmFtZSk7CmNvbnRpbnVlOwp9CgoKaWYgKGlzX2FycmF5KCRyZXBvc2l0b3J5KSAmJiAxID09PSBjb3VudCgkcmVwb3NpdG9yeSkgJiYgZmFsc2UgPT09IGN1cnJlbnQoJHJlcG9zaXRvcnkpKSB7CiR0aGlzLT5kaXNhYmxlUmVwb0J5TmFtZSgoc3RyaW5nKSBrZXkoJHJlcG9zaXRvcnkpKTsKY29udGludWU7Cn0KCgppZiAoaXNzZXQoJHJlcG9zaXRvcnlbJ3R5cGUnXSwgJHJlcG9zaXRvcnlbJ3VybCddKSAmJiAkcmVwb3NpdG9yeVsndHlwZSddID09PSAnY29tcG9zZXInICYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vKD86W2EtejAtOS0uXStcLik/cGFja2FnaXN0Lm9yZygvfCQpfScsICRyZXBvc2l0b3J5Wyd1cmwnXSkpIHsKJHRoaXMtPmRpc2FibGVSZXBvQnlOYW1lKCdwYWNrYWdpc3Qub3JnJyk7Cn0KCgppZiAoaXNfaW50KCRuYW1lKSkgewppZiAoIWlzc2V0KCR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWVdKSkgewokdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lXSA9ICRyZXBvc2l0b3J5Owp9IGVsc2UgewokdGhpcy0+cmVwb3NpdG9yaWVzW10gPSAkcmVwb3NpdG9yeTsKfQokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkcmVwb3NpdG9yeSwgJ3JlcG9zaXRvcmllcy4nIC4gYXJyYXlfc2VhcmNoKCRyZXBvc2l0b3J5LCAkdGhpcy0+cmVwb3NpdG9yaWVzLCB0cnVlKSwgJHNvdXJjZSk7Cn0gZWxzZSB7CmlmICgkbmFtZSA9PT0gJ3BhY2thZ2lzdCcpIHsgCiR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWUgLiAnLm9yZyddID0gJHJlcG9zaXRvcnk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCRyZXBvc2l0b3J5LCAncmVwb3NpdG9yaWVzLicgLiAkbmFtZSAuICcub3JnJywgJHNvdXJjZSk7Cn0gZWxzZSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbJG5hbWVdID0gJHJlcG9zaXRvcnk7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCRyZXBvc2l0b3J5LCAncmVwb3NpdG9yaWVzLicgLiAkbmFtZSwgJHNvdXJjZSk7Cn0KfQp9CiR0aGlzLT5yZXBvc2l0b3JpZXMgPSBhcnJheV9yZXZlcnNlKCR0aGlzLT5yZXBvc2l0b3JpZXMsIHRydWUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcmllczsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAka2V5LCBpbnQgJGZsYWdzID0gMCkKewpzd2l0Y2ggKCRrZXkpIHsKCmNhc2UgJ3ZlbmRvci1kaXInOgpjYXNlICdiaW4tZGlyJzoKY2FzZSAncHJvY2Vzcy10aW1lb3V0JzoKY2FzZSAnZGF0YS1kaXInOgpjYXNlICdjYWNoZS1kaXInOgpjYXNlICdjYWNoZS1maWxlcy1kaXInOgpjYXNlICdjYWNoZS1yZXBvLWRpcic6CmNhc2UgJ2NhY2hlLXZjcy1kaXInOgpjYXNlICdjYWZpbGUnOgpjYXNlICdjYXBhdGgnOgoKJGVudiA9ICdDT01QT1NFUl8nIC4gc3RydG91cHBlcihzdHJ0cigka2V5LCAnLScsICdfJykpOwoKJHZhbCA9ICR0aGlzLT5nZXRDb21wb3NlckVudigkZW52KTsKaWYgKCR2YWwgIT09IGZhbHNlKSB7CiR0aGlzLT5zZXRTb3VyY2VPZkNvbmZpZ1ZhbHVlKCR2YWwsICRrZXksICRlbnYpOwp9CgppZiAoJGtleSA9PT0gJ3Byb2Nlc3MtdGltZW91dCcpIHsKcmV0dXJuIG1heCgwLCBmYWxzZSAhPT0gJHZhbCA/IChpbnQpICR2YWwgOiAkdGhpcy0+Y29uZmlnWyRrZXldKTsKfQoKJHZhbCA9IHJ0cmltKChzdHJpbmcpICR0aGlzLT5wcm9jZXNzKGZhbHNlICE9PSAkdmFsID8gJHZhbCA6ICR0aGlzLT5jb25maWdbJGtleV0sICRmbGFncyksICcvXFwnKTsKJHZhbCA9IFBsYXRmb3JtOjpleHBhbmRQYXRoKCR2YWwpOwoKaWYgKHN1YnN0cigka2V5LCAtNCkgIT09ICctZGlyJykgewpyZXR1cm4gJHZhbDsKfQoKcmV0dXJuICgoJGZsYWdzICYgc2VsZjo6UkVMQVRJVkVfUEFUSFMpID09PSBzZWxmOjpSRUxBVElWRV9QQVRIUykgPyAkdmFsIDogJHRoaXMtPnJlYWxwYXRoKCR2YWwpOwoKCmNhc2UgJ2NhY2hlLXJlYWQtb25seSc6CmNhc2UgJ2h0YWNjZXNzLXByb3RlY3QnOgoKJGVudiA9ICdDT01QT1NFUl8nIC4gc3RydG91cHBlcihzdHJ0cigka2V5LCAnLScsICdfJykpOwoKJHZhbCA9ICR0aGlzLT5nZXRDb21wb3NlckVudigkZW52KTsKaWYgKGZhbHNlID09PSAkdmFsKSB7CiR2YWwgPSAkdGhpcy0+Y29uZmlnWyRrZXldOwp9IGVsc2UgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsLCAka2V5LCAkZW52KTsKfQoKcmV0dXJuICR2YWwgIT09ICdmYWxzZScgJiYgKGJvb2wpICR2YWw7CgoKY2FzZSAnZGlzYWJsZS10bHMnOgpjYXNlICdzZWN1cmUtaHR0cCc6CmNhc2UgJ3VzZS1naXRodWItYXBpJzoKY2FzZSAnbG9jayc6CgppZiAoJGtleSA9PT0gJ3NlY3VyZS1odHRwJyAmJiAkdGhpcy0+Z2V0KCdkaXNhYmxlLXRscycpID09PSB0cnVlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR0aGlzLT5jb25maWdbJGtleV0gIT09ICdmYWxzZScgJiYgKGJvb2wpICR0aGlzLT5jb25maWdbJGtleV07CgoKY2FzZSAnY2FjaGUtdHRsJzoKcmV0dXJuIG1heCgwLCAoaW50KSAkdGhpcy0+Y29uZmlnWyRrZXldKTsKCgpjYXNlICdjYWNoZS1maWxlcy1tYXhzaXplJzoKaWYgKCFQcmVnOjppc01hdGNoKCcvXlxzKihbMC05Ll0rKVxzKig/Oihba21nXSkoPzppP2IpPyk/XHMqJC9pJywgKHN0cmluZykgJHRoaXMtPmNvbmZpZ1ska2V5XSwgJG1hdGNoZXMpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkNvdWxkIG5vdCBwYXJzZSB0aGUgdmFsdWUgb2YgJyRrZXknOiB7JHRoaXMtPmNvbmZpZ1ska2V5XX0iCik7Cn0KJHNpemUgPSAoZmxvYXQpICRtYXRjaGVzWzFdOwppZiAoaXNzZXQoJG1hdGNoZXNbMl0pKSB7CnN3aXRjaCAoc3RydG9sb3dlcigkbWF0Y2hlc1syXSkpIHsKY2FzZSAnZyc6CiRzaXplICo9IDEwMjQ7CgoKY2FzZSAnbSc6CiRzaXplICo9IDEwMjQ7CgoKY2FzZSAnayc6CiRzaXplICo9IDEwMjQ7CmJyZWFrOwp9Cn0KCnJldHVybiBtYXgoMCwgKGludCkgJHNpemUpOwoKCmNhc2UgJ2NhY2hlLWZpbGVzLXR0bCc6CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewpyZXR1cm4gbWF4KDAsIChpbnQpICR0aGlzLT5jb25maWdbJGtleV0pOwp9CgpyZXR1cm4gJHRoaXMtPmdldCgnY2FjaGUtdHRsJyk7CgpjYXNlICdob21lJzoKcmV0dXJuIHJ0cmltKCR0aGlzLT5wcm9jZXNzKFBsYXRmb3JtOjpleHBhbmRQYXRoKCR0aGlzLT5jb25maWdbJGtleV0pLCAkZmxhZ3MpLCAnL1xcJyk7CgpjYXNlICdiaW4tY29tcGF0JzoKJHZhbHVlID0gJHRoaXMtPmdldENvbXBvc2VyRW52KCdDT01QT1NFUl9CSU5fQ09NUEFUJykgPzogJHRoaXMtPmNvbmZpZ1ska2V5XTsKCmlmICghaW5fYXJyYXkoJHZhbHVlLCBbJ2F1dG8nLCAnZnVsbCcsICdwcm94eScsICdzeW1saW5rJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yICdiaW4tY29tcGF0JzogeyR2YWx1ZX0uIEV4cGVjdGVkIGF1dG8sIGZ1bGwgb3IgcHJveHkiCik7Cn0KCmlmICgkdmFsdWUgPT09ICdzeW1saW5rJykgewp0cmlnZ2VyX2Vycm9yKCdjb25maWcuYmluLWNvbXBhdCAic3ltbGluayIgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjIsIHVzZSBhdXRvLCBmdWxsIChmb3IgV2luZG93cyBjb21wYXRpYmlsaXR5KSBvciBwcm94eSBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKcmV0dXJuICR2YWx1ZTsKCmNhc2UgJ2Rpc2NhcmQtY2hhbmdlcyc6CiRlbnYgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJ0NPTVBPU0VSX0RJU0NBUkRfQ0hBTkdFUycpOwppZiAoJGVudiAhPT0gZmFsc2UpIHsKaWYgKCFpbl9hcnJheSgkZW52LCBbJ3N0YXNoJywgJ3RydWUnLCAnZmFsc2UnLCAnMScsICcwJ10sIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yIENPTVBPU0VSX0RJU0NBUkRfQ0hBTkdFUzogeyRlbnZ9LiBFeHBlY3RlZCAxLCAwLCB0cnVlLCBmYWxzZSBvciBzdGFzaCIKKTsKfQppZiAoJ3N0YXNoJyA9PT0gJGVudikgewpyZXR1cm4gJ3N0YXNoJzsKfQoKCnJldHVybiAkZW52ICE9PSAnZmFsc2UnICYmIChib29sKSAkZW52Owp9CgppZiAoIWluX2FycmF5KCR0aGlzLT5jb25maWdbJGtleV0sIFt0cnVlLCBmYWxzZSwgJ3N0YXNoJ10sIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKIkludmFsaWQgdmFsdWUgZm9yICdkaXNjYXJkLWNoYW5nZXMnOiB7JHRoaXMtPmNvbmZpZ1ska2V5XX0uIEV4cGVjdGVkIHRydWUsIGZhbHNlIG9yIHN0YXNoIgopOwp9CgpyZXR1cm4gJHRoaXMtPmNvbmZpZ1ska2V5XTsKCmNhc2UgJ2dpdGh1Yi1wcm90b2NvbHMnOgokcHJvdG9zID0gJHRoaXMtPmNvbmZpZ1snZ2l0aHViLXByb3RvY29scyddOwppZiAoJHRoaXMtPmNvbmZpZ1snc2VjdXJlLWh0dHAnXSAmJiBmYWxzZSAhPT0gKCRpbmRleCA9IGFycmF5X3NlYXJjaCgnZ2l0JywgJHByb3RvcykpKSB7CnVuc2V0KCRwcm90b3NbJGluZGV4XSk7Cn0KaWYgKHJlc2V0KCRwcm90b3MpID09PSAnaHR0cCcpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgaHR0cCBwcm90b2NvbCBmb3IgZ2l0aHViIGlzIG5vdCBhdmFpbGFibGUgYW55bW9yZSwgdXBkYXRlIHlvdXIgY29uZmlnXCdzIGdpdGh1Yi1wcm90b2NvbHMgdG8gdXNlICJodHRwcyIsICJnaXQiIG9yICJzc2giJyk7Cn0KCnJldHVybiAkcHJvdG9zOwoKY2FzZSAnYXV0b2xvYWRlci1zdWZmaXgnOgppZiAoJHRoaXMtPmNvbmZpZ1ska2V5XSA9PT0gJycpIHsgCnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MoJHRoaXMtPmNvbmZpZ1ska2V5XSwgJGZsYWdzKTsKCmNhc2UgJ2F1ZGl0JzoKJHJlc3VsdCA9ICR0aGlzLT5jb25maWdbJGtleV07CiRhYmFuZG9uZWRFbnYgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJ0NPTVBPU0VSX0FVRElUX0FCQU5ET05FRCcpOwppZiAoZmFsc2UgIT09ICRhYmFuZG9uZWRFbnYpIHsKaWYgKCFpbl9hcnJheSgkYWJhbmRvbmVkRW52LCAkdmFsaWRDaG9pY2VzID0gQXVkaXRvcjo6QUJBTkRPTkVEUywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAoiSW52YWxpZCB2YWx1ZSBmb3IgQ09NUE9TRVJfQVVESVRfQUJBTkRPTkVEOiB7JGFiYW5kb25lZEVudn0uIEV4cGVjdGVkIG9uZSBvZiAiLmltcGxvZGUoJywgJywgQXVkaXRvcjo6QUJBTkRPTkVEUykuIi4iCik7Cn0KJHJlc3VsdFsnYWJhbmRvbmVkJ10gPSAkYWJhbmRvbmVkRW52Owp9CgokYmxvY2tBYmFuZG9uZWRFbnYgPSAkdGhpcy0+Z2V0Q29tcG9zZXJFbnYoJ0NPTVBPU0VSX1NFQ1VSSVRZX0JMT0NLSU5HX0FCQU5ET05FRCcpOwppZiAoZmFsc2UgIT09ICRibG9ja0FiYW5kb25lZEVudikgewppZiAoIWluX2FycmF5KCRibG9ja0FiYW5kb25lZEVudiwgWycwJywgJzEnXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAoiSW52YWxpZCB2YWx1ZSBmb3IgQ09NUE9TRVJfU0VDVVJJVFlfQkxPQ0tJTkdfQUJBTkRPTkVEOiB7JGJsb2NrQWJhbmRvbmVkRW52fS4gRXhwZWN0ZWQgMCBvciAxLiIKKTsKfQokcmVzdWx0WydibG9jay1hYmFuZG9uZWQnXSA9IChib29sKSAoaW50KSAkYmxvY2tBYmFuZG9uZWRFbnY7Cn0KCnJldHVybiAkcmVzdWx0OwoKZGVmYXVsdDoKaWYgKCFpc3NldCgkdGhpcy0+Y29uZmlnWyRrZXldKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzKCR0aGlzLT5jb25maWdbJGtleV0sICRmbGFncyk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFsbChpbnQgJGZsYWdzID0gMCk6IGFycmF5CnsKJGFsbCA9IFsKJ3JlcG9zaXRvcmllcycgPT4gJHRoaXMtPmdldFJlcG9zaXRvcmllcygpLApdOwpmb3JlYWNoIChhcnJheV9rZXlzKCR0aGlzLT5jb25maWcpIGFzICRrZXkpIHsKJGFsbFsnY29uZmlnJ11bJGtleV0gPSAkdGhpcy0+Z2V0KCRrZXksICRmbGFncyk7Cn0KCnJldHVybiAkYWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlT2ZWYWx1ZShzdHJpbmcgJGtleSk6IHN0cmluZwp7CiR0aGlzLT5nZXQoJGtleSk7CgpyZXR1cm4gJHRoaXMtPnNvdXJjZU9mQ29uZmlnVmFsdWVbJGtleV0gPz8gc2VsZjo6U09VUkNFX1VOS05PV047Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0U291cmNlT2ZDb25maWdWYWx1ZSgkY29uZmlnVmFsdWUsIHN0cmluZyAkcGF0aCwgc3RyaW5nICRzb3VyY2UpOiB2b2lkCnsKJHRoaXMtPnNvdXJjZU9mQ29uZmlnVmFsdWVbJHBhdGhdID0gJHNvdXJjZTsKCmlmIChpc19hcnJheSgkY29uZmlnVmFsdWUpKSB7CmZvcmVhY2ggKCRjb25maWdWYWx1ZSBhcyAka2V5ID0+ICR2YWx1ZSkgewokdGhpcy0+c2V0U291cmNlT2ZDb25maWdWYWx1ZSgkdmFsdWUsICRwYXRoIC4gJy4nIC4gJGtleSwgJHNvdXJjZSk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmF3KCk6IGFycmF5CnsKcmV0dXJuIFsKJ3JlcG9zaXRvcmllcycgPT4gJHRoaXMtPmdldFJlcG9zaXRvcmllcygpLAonY29uZmlnJyA9PiAkdGhpcy0+Y29uZmlnLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKHN0cmluZyAka2V5KTogYm9vbAp7CnJldHVybiBhcnJheV9rZXlfZXhpc3RzKCRrZXksICR0aGlzLT5jb25maWcpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcHJvY2VzcygkdmFsdWUsIGludCAkZmxhZ3MpCnsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewpyZXR1cm4gJHZhbHVlOwp9CgpyZXR1cm4gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCcjXHtcJCguKylcfSMnLCBmdW5jdGlvbiAoJG1hdGNoKSB1c2UgKCRmbGFncykgewpyZXR1cm4gJHRoaXMtPmdldCgkbWF0Y2hbMV0sICRmbGFncyk7Cn0sICR2YWx1ZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZWFscGF0aChzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoUHJlZzo6aXNNYXRjaCgne14oPzovfFthLXpdOnxbYS16MC05Ll0rOi8vfFxcXFxcXFxcKX1pJywgJHBhdGgpKSB7CnJldHVybiAkcGF0aDsKfQoKcmV0dXJuICR0aGlzLT5iYXNlRGlyICE9PSBudWxsID8gJHRoaXMtPmJhc2VEaXIgLiAnLycgLiAkcGF0aCA6ICRwYXRoOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21wb3NlckVudihzdHJpbmcgJHZhcikKewppZiAoJHRoaXMtPnVzZUVudmlyb25tZW50KSB7CnJldHVybiBQbGF0Zm9ybTo6Z2V0RW52KCR2YXIpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGlzYWJsZVJlcG9CeU5hbWUoc3RyaW5nICRuYW1lKTogdm9pZAp7CmlmIChpc3NldCgkdGhpcy0+cmVwb3NpdG9yaWVzWyRuYW1lXSkpIHsKdW5zZXQoJHRoaXMtPnJlcG9zaXRvcmllc1skbmFtZV0pOwp9IGVsc2VpZiAoJG5hbWUgPT09ICdwYWNrYWdpc3QnKSB7IAp1bnNldCgkdGhpcy0+cmVwb3NpdG9yaWVzWydwYWNrYWdpc3Qub3JnJ10pOwp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2hpYml0VXJsQnlDb25maWcoc3RyaW5nICR1cmwsID9JT0ludGVyZmFjZSAkaW8gPSBudWxsLCBhcnJheSAkcmVwb09wdGlvbnMgPSBbXSk6IHZvaWQKewoKaWYgKGZhbHNlID09PSBmaWx0ZXJfdmFyKCR1cmwsIEZJTFRFUl9WQUxJREFURV9VUkwpICYmICFQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL30nLCAkdXJsKSkgewpyZXR1cm47Cn0KCgokc2NoZW1lID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfU0NIRU1FKTsKJGhvc3RuYW1lID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCk7CmlmIChpbl9hcnJheSgkc2NoZW1lLCBbJ2h0dHAnLCAnZ2l0JywgJ2Z0cCcsICdzdm4nXSkpIHsKaWYgKCR0aGlzLT5nZXQoJ3NlY3VyZS1odHRwJykpIHsKaWYgKCRzY2hlbWUgPT09ICdzdm4nKSB7CmlmIChpbl9hcnJheSgkaG9zdG5hbWUsICR0aGlzLT5nZXQoJ3NlY3VyZS1zdm4tZG9tYWlucycpLCB0cnVlKSkgewpyZXR1cm47Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIllvdXIgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBhbGxvdyBjb25uZWN0aW9ucyB0byAkdXJsLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA2LWNvbmZpZy5tZCNzZWN1cmUtc3ZuLWRvbWFpbnMgZm9yIGRldGFpbHMuIik7Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIllvdXIgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBhbGxvdyBjb25uZWN0aW9ucyB0byAkdXJsLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzA2LWNvbmZpZy5tZCNzZWN1cmUtaHR0cCBmb3IgZGV0YWlscy4iKTsKfQppZiAoJGlvICE9PSBudWxsKSB7CmlmIChpc19zdHJpbmcoJGhvc3RuYW1lKSkgewppZiAoIWlzc2V0KCR0aGlzLT53YXJuZWRIb3N0c1skaG9zdG5hbWVdKSkgewokaW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPldhcm5pbmc6IEFjY2Vzc2luZyAkaG9zdG5hbWUgb3ZlciAkc2NoZW1lIHdoaWNoIGlzIGFuIGluc2VjdXJlIHByb3RvY29sLjwvd2FybmluZz4iKTsKfQokdGhpcy0+d2FybmVkSG9zdHNbJGhvc3RuYW1lXSA9IHRydWU7Cn0KfQp9CgppZiAoJGlvICE9PSBudWxsICYmIGlzX3N0cmluZygkaG9zdG5hbWUpICYmICFpc3NldCgkdGhpcy0+c3NsVmVyaWZ5V2FybmVkSG9zdHNbJGhvc3RuYW1lXSkpIHsKJHdhcm5pbmcgPSBudWxsOwppZiAoaXNzZXQoJHJlcG9PcHRpb25zWydzc2wnXVsndmVyaWZ5X3BlZXInXSkgJiYgIShib29sKSAkcmVwb09wdGlvbnNbJ3NzbCddWyd2ZXJpZnlfcGVlciddKSB7CiR3YXJuaW5nID0gJ3ZlcmlmeV9wZWVyJzsKfQoKaWYgKGlzc2V0KCRyZXBvT3B0aW9uc1snc3NsJ11bJ3ZlcmlmeV9wZWVyX25hbWUnXSkgJiYgIShib29sKSAkcmVwb09wdGlvbnNbJ3NzbCddWyd2ZXJpZnlfcGVlcl9uYW1lJ10pIHsKJHdhcm5pbmcgPSAkd2FybmluZyA9PT0gbnVsbCA/ICd2ZXJpZnlfcGVlcl9uYW1lJyA6ICR3YXJuaW5nIC4gJyBhbmQgdmVyaWZ5X3BlZXJfbmFtZSc7Cn0KCmlmICgkd2FybmluZyAhPT0gbnVsbCkgewokaW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPldhcm5pbmc6IEFjY2Vzc2luZyAkaG9zdG5hbWUgd2l0aCAkd2FybmluZyBkaXNhYmxlZC48L3dhcm5pbmc+Iik7CiR0aGlzLT5zc2xWZXJpZnlXYXJuZWRIb3N0c1skaG9zdG5hbWVdID0gdHJ1ZTsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRpc2FibGVQcm9jZXNzVGltZW91dCgpOiB2b2lkCnsKClByb2Nlc3NFeGVjdXRvcjo6c2V0VGltZW91dCgwKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb25maWc7CgoKCgoKCgppbnRlcmZhY2UgQ29uZmlnU291cmNlSW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgYm9vbCAkYXBwZW5kID0gdHJ1ZSk6IHZvaWQ7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnNlcnRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgc3RyaW5nICRyZWZlcmVuY2VOYW1lLCBpbnQgJG9mZnNldCA9IDApOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcnlVcmwoc3RyaW5nICRuYW1lLCBzdHJpbmcgJHVybCk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbmZpZ1NldHRpbmcoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUNvbmZpZ1NldHRpbmcoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQcm9wZXJ0eShzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoc3RyaW5nICRuYW1lKTogdm9pZDsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbmZpZzsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uTWFuaXB1bGF0b3I7CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKCgoKCgoKCmNsYXNzIEpzb25Db25maWdTb3VyY2UgaW1wbGVtZW50cyBDb25maWdTb3VyY2VJbnRlcmZhY2UKewoKCgpwcml2YXRlICRmaWxlOwoKCgoKcHJpdmF0ZSAkYXV0aENvbmZpZzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChKc29uRmlsZSAkZmlsZSwgYm9vbCAkYXV0aENvbmZpZyA9IGZhbHNlKQp7CiR0aGlzLT5maWxlID0gJGZpbGU7CiR0aGlzLT5hdXRoQ29uZmlnID0gJGF1dGhDb25maWc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUsICRjb25maWcsIGJvb2wgJGFwcGVuZCA9IHRydWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdhZGRSZXBvc2l0b3J5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHJlcG8sICRyZXBvQ29uZmlnKSB1c2UgKCRhcHBlbmQpOiB2b2lkIHsKaWYgKCFhcnJheV9pc19saXN0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddID8/IFtdKSkgewokbGlzdCA9IFtdOwoKZm9yZWFjaCAoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gYXMgJHJlcG9zaXRvcnlJbmRleCA9PiAkcmVwb3NpdG9yeSkgewppZiAoaXNfc3RyaW5nKCRyZXBvc2l0b3J5SW5kZXgpICYmIGlzX2FycmF5KCRyZXBvc2l0b3J5KSkgewoKaWYgKCFpc3NldCgkcmVwb3NpdG9yeVsnbmFtZSddKSkgewokcmVwb3NpdG9yeSA9IFsnbmFtZScgPT4gJHJlcG9zaXRvcnlJbmRleF0gKyAkcmVwb3NpdG9yeTsKfQokbGlzdFtdID0gJHJlcG9zaXRvcnk7Cn0gZWxzZWlmIChpc19zdHJpbmcoJHJlcG9zaXRvcnlJbmRleCkpIHsKCiRsaXN0W10gPSBbJHJlcG9zaXRvcnlJbmRleCA9PiAkcmVwb3NpdG9yeV07Cn0gZWxzZSB7CiRsaXN0W10gPSAkcmVwb3NpdG9yeTsKfQp9CgokY29uZmlnWydyZXBvc2l0b3JpZXMnXSA9ICRsaXN0Owp9CgppZiAoJHJlcG9Db25maWcgPT09IGZhbHNlKSB7CmlmIChpc3NldCgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gYXMgJiRyZXBvc2l0b3J5KSB7CmlmICgoJHJlcG9zaXRvcnlbJ25hbWUnXSA/PyBudWxsKSA9PT0gJHJlcG8pIHsKJHJlcG9zaXRvcnkgPSBbJHJlcG8gPT4gJHJlcG9Db25maWddOwoKcmV0dXJuOwp9CgppZiAoJHJlcG9zaXRvcnkgPT09IFskcmVwbyA9PiBmYWxzZV0pIHsKcmV0dXJuOwp9Cn0KCnVuc2V0KCRyZXBvc2l0b3J5KTsKfSBlbHNlIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPSBbXTsKfQoKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bXSA9IFskcmVwbyA9PiAkcmVwb0NvbmZpZ107CgpyZXR1cm47Cn0KCmlmIChpc19hcnJheSgkcmVwb0NvbmZpZykgJiYgJHJlcG8gIT09ICcnICYmICFpc3NldCgkcmVwb0NvbmZpZ1snbmFtZSddKSkgewokcmVwb0NvbmZpZyA9IFsnbmFtZScgPT4gJHJlcG9dICsgJHJlcG9Db25maWc7Cn0KCgokY29uZmlnWydyZXBvc2l0b3JpZXMnXSA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPz8gW10sIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgdXNlICgkcmVwbykgewpyZXR1cm4gIWlzc2V0KCR2YWxbJ25hbWUnXSkgfHwgJHZhbFsnbmFtZSddICE9PSAkcmVwbyB8fCAkdmFsICE9PSBbJHJlcG8gPT4gZmFsc2VdOwp9KSk7CgppZiAoJGFwcGVuZCkgewokY29uZmlnWydyZXBvc2l0b3JpZXMnXVtdID0gJHJlcG9Db25maWc7Cn0gZWxzZSB7CmFycmF5X3Vuc2hpZnQoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10sICRyZXBvQ29uZmlnKTsKfQp9LCAkbmFtZSwgJGNvbmZpZywgJGFwcGVuZCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnNlcnRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgc3RyaW5nICRyZWZlcmVuY2VOYW1lLCBpbnQgJG9mZnNldCA9IDApOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdpbnNlcnRSZXBvc2l0b3J5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgc3RyaW5nICRuYW1lLCAkcmVwb0NvbmZpZywgc3RyaW5nICRyZWZlcmVuY2VOYW1lLCBpbnQgJG9mZnNldCk6IHZvaWQgewppZiAoIWFycmF5X2lzX2xpc3QoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPz8gW10pKSB7CiRsaXN0ID0gW107Cgpmb3JlYWNoICgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSBhcyAkcmVwb3NpdG9yeUluZGV4ID0+ICRyZXBvc2l0b3J5KSB7CmlmIChpc19zdHJpbmcoJHJlcG9zaXRvcnlJbmRleCkgJiYgaXNfYXJyYXkoJHJlcG9zaXRvcnkpKSB7CgppZiAoIWlzc2V0KCRyZXBvc2l0b3J5WyduYW1lJ10pKSB7CiRyZXBvc2l0b3J5ID0gWyduYW1lJyA9PiAkcmVwb3NpdG9yeUluZGV4XSArICRyZXBvc2l0b3J5Owp9CiRsaXN0W10gPSAkcmVwb3NpdG9yeTsKfSBlbHNlaWYgKGlzX3N0cmluZygkcmVwb3NpdG9yeUluZGV4KSkgewoKJGxpc3RbXSA9IFskcmVwb3NpdG9yeUluZGV4ID0+ICRyZXBvc2l0b3J5XTsKfSBlbHNlIHsKJGxpc3RbXSA9ICRyZXBvc2l0b3J5Owp9Cn0KCiRjb25maWdbJ3JlcG9zaXRvcmllcyddID0gJGxpc3Q7Cn0KCgokY29uZmlnWydyZXBvc2l0b3JpZXMnXSA9IGFycmF5X3ZhbHVlcyhhcnJheV9maWx0ZXIoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPz8gW10sIHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgdXNlICgkbmFtZSkgewpyZXR1cm4gIWlzc2V0KCR2YWxbJ25hbWUnXSkgfHwgJHZhbFsnbmFtZSddICE9PSAkbmFtZSB8fCAkdmFsICE9PSBbJG5hbWUgPT4gZmFsc2VdOwp9KSk7CgokaW5kZXhUb0luc2VydCA9IG51bGw7Cgpmb3JlYWNoICgkY29uZmlnWydyZXBvc2l0b3JpZXMnXSBhcyAkcmVwb3NpdG9yeUluZGV4ID0+ICRyZXBvc2l0b3J5KSB7CmlmICgoJHJlcG9zaXRvcnlbJ25hbWUnXSA/PyBudWxsKSA9PT0gJHJlZmVyZW5jZU5hbWUpIHsKJGluZGV4VG9JbnNlcnQgPSAkcmVwb3NpdG9yeUluZGV4OwpicmVhazsKfQoKaWYgKFskcmVmZXJlbmNlTmFtZSA9PiBmYWxzZV0gPT09ICRyZXBvc2l0b3J5KSB7CiRpbmRleFRvSW5zZXJ0ID0gJHJlcG9zaXRvcnlJbmRleDsKYnJlYWs7Cn0KfQoKaWYgKCRpbmRleFRvSW5zZXJ0ID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcmVmZXJlbmNlZCByZXBvc2l0b3J5ICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJHJlZmVyZW5jZU5hbWUpKTsKfQoKaWYgKGlzX2FycmF5KCRyZXBvQ29uZmlnKSAmJiAkbmFtZSAhPT0gJycgJiYgIWlzc2V0KCRyZXBvQ29uZmlnWyduYW1lJ10pKSB7CiRyZXBvQ29uZmlnID0gWyduYW1lJyA9PiAkbmFtZV0gKyAkcmVwb0NvbmZpZzsKfQoKYXJyYXlfc3BsaWNlKCRjb25maWdbJ3JlcG9zaXRvcmllcyddLCAkaW5kZXhUb0luc2VydCArICRvZmZzZXQsIDAsIFskcmVwb0NvbmZpZ10pOwp9LCAkbmFtZSwgJGNvbmZpZywgJHJlZmVyZW5jZU5hbWUsICRvZmZzZXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeVVybChzdHJpbmcgJG5hbWUsIHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbignc2V0UmVwb3NpdG9yeVVybCcsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRuYW1lLCAkdXJsKTogdm9pZCB7CmZvcmVhY2ggKCRjb25maWdbJ3JlcG9zaXRvcmllcyddID8/IFtdIGFzICRpbmRleCA9PiAkcmVwb3NpdG9yeSkgewppZiAoJG5hbWUgPT09ICRpbmRleCkgewokY29uZmlnWydyZXBvc2l0b3JpZXMnXVskaW5kZXhdWyd1cmwnXSA9ICR1cmw7CgpyZXR1cm47Cn0KCmlmICgkbmFtZSA9PT0gKCRyZXBvc2l0b3J5WyduYW1lJ10gPz8gbnVsbCkpIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bJGluZGV4XVsndXJsJ10gPSAkdXJsOwoKcmV0dXJuOwp9Cn0KfSwgJG5hbWUsICR1cmwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUmVwb3NpdG9yeShzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVSZXBvc2l0b3J5Jywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHJlcG8pOiB2b2lkIHsKaWYgKGlzc2V0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddWyRyZXBvXSkpIHsKdW5zZXQoJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ11bJHJlcG9dKTsKfSBlbHNlIHsKJGNvbmZpZ1sncmVwb3NpdG9yaWVzJ10gPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKCRjb25maWdbJ3JlcG9zaXRvcmllcyddID8/IFtdLCBzdGF0aWMgZnVuY3Rpb24gKCR2YWwpIHVzZSAoJHJlcG8pIHsKcmV0dXJuICFpc3NldCgkdmFsWyduYW1lJ10pIHx8ICR2YWxbJ25hbWUnXSAhPT0gJHJlcG8gfHwgJHZhbCAhPT0gWyRyZXBvID0+IGZhbHNlXTsKfSkpOwp9CgppZiAoW10gPT09ICRjb25maWdbJ3JlcG9zaXRvcmllcyddKSB7CnVuc2V0KCRjb25maWdbJ3JlcG9zaXRvcmllcyddKTsKfQp9LCAkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDb25maWdTZXR0aW5nKHN0cmluZyAkbmFtZSwgJHZhbHVlKTogdm9pZAp7CiRhdXRoQ29uZmlnID0gJHRoaXMtPmF1dGhDb25maWc7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbignYWRkQ29uZmlnU2V0dGluZycsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRrZXksICR2YWwpIHVzZSAoJGF1dGhDb25maWcpOiB2b2lkIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teKGJpdGJ1Y2tldC1vYXV0aHxnaXRodWItb2F1dGh8Z2l0bGFiLW9hdXRofGdpdGxhYi10b2tlbnxiZWFyZXJ8aHR0cC1iYXNpY3xjdXN0b20taGVhZGVyc3xmb3JnZWpvLXRva2VufHBsYXRmb3JtKVwufScsICRrZXkpKSB7Clska2V5LCAkaG9zdF0gPSBleHBsb2RlKCcuJywgJGtleSwgMik7CmlmICgkYXV0aENvbmZpZykgewokY29uZmlnWyRrZXldWyRob3N0XSA9ICR2YWw7Cn0gZWxzZSB7CiRjb25maWdbJ2NvbmZpZyddWyRrZXldWyRob3N0XSA9ICR2YWw7Cn0KfSBlbHNlIHsKJGNvbmZpZ1snY29uZmlnJ11bJGtleV0gPSAkdmFsOwp9Cn0sICRuYW1lLCAkdmFsdWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJGF1dGhDb25maWcgPSAkdGhpcy0+YXV0aENvbmZpZzsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVDb25maWdTZXR0aW5nJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJGtleSkgdXNlICgkYXV0aENvbmZpZyk6IHZvaWQgewppZiAoUHJlZzo6aXNNYXRjaCgne14oYml0YnVja2V0LW9hdXRofGdpdGh1Yi1vYXV0aHxnaXRsYWItb2F1dGh8Z2l0bGFiLXRva2VufGJlYXJlcnxodHRwLWJhc2ljfGN1c3RvbS1oZWFkZXJzfGZvcmdlam8tdG9rZW58cGxhdGZvcm0pXC59JywgJGtleSkpIHsKWyRrZXksICRob3N0XSA9IGV4cGxvZGUoJy4nLCAka2V5LCAyKTsKaWYgKCRhdXRoQ29uZmlnKSB7CnVuc2V0KCRjb25maWdbJGtleV1bJGhvc3RdKTsKfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1snY29uZmlnJ11bJGtleV1bJGhvc3RdKTsKfQp9IGVsc2Ugewp1bnNldCgkY29uZmlnWydjb25maWcnXVska2V5XSk7Cn0KfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUHJvcGVydHkoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdhZGRQcm9wZXJ0eScsIHN0YXRpYyBmdW5jdGlvbiAoJiRjb25maWcsICRrZXksICR2YWwpOiB2b2lkIHsKaWYgKHN0cnBvcygka2V5LCAnZXh0cmEuJykgPT09IDAgfHwgc3RycG9zKCRrZXksICdzY3JpcHRzLicpID09PSAwKSB7CiRiaXRzID0gZXhwbG9kZSgnLicsICRrZXkpOwokbGFzdCA9IGFycmF5X3BvcCgkYml0cyk7CiRhcnIgPSAmJGNvbmZpZ1tyZXNldCgkYml0cyldOwpmb3JlYWNoICgkYml0cyBhcyAkYml0KSB7CmlmICghaXNzZXQoJGFyclskYml0XSkpIHsKJGFyclskYml0XSA9IFtdOwp9CiRhcnIgPSAmJGFyclskYml0XTsKfQokYXJyWyRsYXN0XSA9ICR2YWw7Cn0gZWxzZSB7CiRjb25maWdbJGtleV0gPSAkdmFsOwp9Cn0sICRuYW1lLCAkdmFsdWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUHJvcGVydHkoc3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlUHJvcGVydHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAka2V5KTogdm9pZCB7CmlmIChzdHJwb3MoJGtleSwgJ2V4dHJhLicpID09PSAwIHx8IHN0cnBvcygka2V5LCAnc2NyaXB0cy4nKSA9PT0gMCB8fCBzdHJpcG9zKCRrZXksICdhdXRvbG9hZC4nKSA9PT0gMCB8fCBzdHJpcG9zKCRrZXksICdhdXRvbG9hZC1kZXYuJykgPT09IDApIHsKJGJpdHMgPSBleHBsb2RlKCcuJywgJGtleSk7CiRsYXN0ID0gYXJyYXlfcG9wKCRiaXRzKTsKJGFyciA9ICYkY29uZmlnW3Jlc2V0KCRiaXRzKV07CmZvcmVhY2ggKCRiaXRzIGFzICRiaXQpIHsKaWYgKCFpc3NldCgkYXJyWyRiaXRdKSkgewpyZXR1cm47Cn0KJGFyciA9ICYkYXJyWyRiaXRdOwp9CnVuc2V0KCRhcnJbJGxhc3RdKTsKfSBlbHNlIHsKdW5zZXQoJGNvbmZpZ1ska2V5XSk7Cn0KfSwgJG5hbWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGluayhzdHJpbmcgJHR5cGUsIHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQKewokdGhpcy0+bWFuaXB1bGF0ZUpzb24oJ2FkZExpbmsnLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkdHlwZSwgJG5hbWUsICR2YWx1ZSk6IHZvaWQgewokY29uZmlnWyR0eXBlXVskbmFtZV0gPSAkdmFsdWU7Cn0sICR0eXBlLCAkbmFtZSwgJHZhbHVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZUxpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJG5hbWUpOiB2b2lkCnsKJHRoaXMtPm1hbmlwdWxhdGVKc29uKCdyZW1vdmVTdWJOb2RlJywgc3RhdGljIGZ1bmN0aW9uICgmJGNvbmZpZywgJHR5cGUsICRuYW1lKTogdm9pZCB7CnVuc2V0KCRjb25maWdbJHR5cGVdWyRuYW1lXSk7Cn0sICR0eXBlLCAkbmFtZSk7CiR0aGlzLT5tYW5pcHVsYXRlSnNvbigncmVtb3ZlTWFpbktleUlmRW1wdHknLCBzdGF0aWMgZnVuY3Rpb24gKCYkY29uZmlnLCAkdHlwZSk6IHZvaWQgewppZiAoMCA9PT0gY291bnQoJGNvbmZpZ1skdHlwZV0pKSB7CnVuc2V0KCRjb25maWdbJHR5cGVdKTsKfQp9LCAkdHlwZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFuaXB1bGF0ZUpzb24oc3RyaW5nICRtZXRob2QsIGNhbGxhYmxlICRmYWxsYmFjaywgLi4uJGFyZ3MpOiB2b2lkCnsKaWYgKCR0aGlzLT5maWxlLT5leGlzdHMoKSkgewppZiAoIWlzX3dyaXRhYmxlKCR0aGlzLT5maWxlLT5nZXRQYXRoKCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgZmlsZSAiJXMiIGlzIG5vdCB3cml0YWJsZS4nLCAkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSk7Cn0KCmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVGhlIGZpbGUgIiVzIiBpcyBub3QgcmVhZGFibGUuJywgJHRoaXMtPmZpbGUtPmdldFBhdGgoKSkpOwp9CgokY29udGVudHMgPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpKTsKfSBlbHNlaWYgKCR0aGlzLT5hdXRoQ29uZmlnKSB7CiRjb250ZW50cyA9ICJ7XG59XG4iOwp9IGVsc2UgewokY29udGVudHMgPSAie1xuICAgIFwiY29uZmlnXCI6IHtcbiAgICB9XG59XG4iOwp9CgokbWFuaXB1bGF0b3IgPSBuZXcgSnNvbk1hbmlwdWxhdG9yKCRjb250ZW50cyk7CgokbmV3RmlsZSA9ICEkdGhpcy0+ZmlsZS0+ZXhpc3RzKCk7CgoKaWYgKCR0aGlzLT5hdXRoQ29uZmlnICYmICRtZXRob2QgPT09ICdhZGRDb25maWdTZXR0aW5nJykgewokbWV0aG9kID0gJ2FkZFN1Yk5vZGUnOwpbJG1haW5Ob2RlLCAkbmFtZV0gPSBleHBsb2RlKCcuJywgJGFyZ3NbMF0sIDIpOwokYXJncyA9IFskbWFpbk5vZGUsICRuYW1lLCAkYXJnc1sxXV07Cn0gZWxzZWlmICgkdGhpcy0+YXV0aENvbmZpZyAmJiAkbWV0aG9kID09PSAncmVtb3ZlQ29uZmlnU2V0dGluZycpIHsKJG1ldGhvZCA9ICdyZW1vdmVTdWJOb2RlJzsKWyRtYWluTm9kZSwgJG5hbWVdID0gZXhwbG9kZSgnLicsICRhcmdzWzBdLCAyKTsKJGFyZ3MgPSBbJG1haW5Ob2RlLCAkbmFtZV07Cn0KCgppZiAoY2FsbF91c2VyX2Z1bmNfYXJyYXkoWyRtYW5pcHVsYXRvciwgJG1ldGhvZF0sICRhcmdzKSkgewpmaWxlX3B1dF9jb250ZW50cygkdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpLCAkbWFuaXB1bGF0b3ItPmdldENvbnRlbnRzKCkpOwp9IGVsc2UgewoKJGNvbmZpZyA9ICR0aGlzLT5maWxlLT5yZWFkKCk7CiR0aGlzLT5hcnJheVVuc2hpZnRSZWYoJGFyZ3MsICRjb25maWcpOwokZmFsbGJhY2soLi4uJGFyZ3MpOwoKZm9yZWFjaCAoWydyZXF1aXJlJywgJ3JlcXVpcmUtZGV2JywgJ2NvbmZsaWN0JywgJ3Byb3ZpZGUnLCAncmVwbGFjZScsICdzdWdnZXN0JywgJ2NvbmZpZycsICdhdXRvbG9hZCcsICdhdXRvbG9hZC1kZXYnLCAnc2NyaXB0cycsICdzY3JpcHRzLWRlc2NyaXB0aW9ucycsICdzY3JpcHRzLWFsaWFzZXMnLCAnc3VwcG9ydCddIGFzICRwcm9wKSB7CmlmIChpc3NldCgkY29uZmlnWyRwcm9wXSkgJiYgJGNvbmZpZ1skcHJvcF0gPT09IFtdKSB7CiRjb25maWdbJHByb3BdID0gbmV3IFxzdGRDbGFzczsKfQp9CmZvcmVhY2ggKFsncHNyLTAnLCAncHNyLTQnXSBhcyAkcHJvcCkgewppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQnXVskcHJvcF0pICYmICRjb25maWdbJ2F1dG9sb2FkJ11bJHByb3BdID09PSBbXSkgewokY29uZmlnWydhdXRvbG9hZCddWyRwcm9wXSA9IG5ldyBcc3RkQ2xhc3M7Cn0KaWYgKGlzc2V0KCRjb25maWdbJ2F1dG9sb2FkLWRldiddWyRwcm9wXSkgJiYgJGNvbmZpZ1snYXV0b2xvYWQtZGV2J11bJHByb3BdID09PSBbXSkgewokY29uZmlnWydhdXRvbG9hZC1kZXYnXVskcHJvcF0gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KZm9yZWFjaCAoWydwbGF0Zm9ybScsICdodHRwLWJhc2ljJywgJ2JlYXJlcicsICdnaXRsYWItdG9rZW4nLCAnZ2l0bGFiLW9hdXRoJywgJ2dpdGh1Yi1vYXV0aCcsICdjdXN0b20taGVhZGVycycsICdmb3JnZWpvLXRva2VuJywgJ3ByZWZlcnJlZC1pbnN0YWxsJ10gYXMgJHByb3ApIHsKaWYgKGlzc2V0KCRjb25maWdbJ2NvbmZpZyddWyRwcm9wXSkgJiYgJGNvbmZpZ1snY29uZmlnJ11bJHByb3BdID09PSBbXSkgewokY29uZmlnWydjb25maWcnXVskcHJvcF0gPSBuZXcgXHN0ZENsYXNzOwp9Cn0KJHRoaXMtPmZpbGUtPndyaXRlKCRjb25maWcpOwp9Cgp0cnkgewokdGhpcy0+ZmlsZS0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxBWF9TQ0hFTUEpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewoKZmlsZV9wdXRfY29udGVudHMoJHRoaXMtPmZpbGUtPmdldFBhdGgoKSwgJGNvbnRlbnRzKTsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gdXBkYXRlIGNvbXBvc2VyLmpzb24gd2l0aCBhIHZhbGlkIGZvcm1hdCwgcmV2ZXJ0aW5nIHRvIHRoZSBvcmlnaW5hbCBjb250ZW50LiBQbGVhc2UgcmVwb3J0IGFuIGlzc3VlIHRvIHVzIHdpdGggZGV0YWlscyAoY29tbWFuZCB5b3UgcnVuIGFuZCBhIGNvcHkgb2YgeW91ciBjb21wb3Nlci5qc29uKS4gJy5QSFBfRU9MLmltcGxvZGUoUEhQX0VPTCwgJGUtPmdldEVycm9ycygpKSwgMCwgJGUpOwp9CgppZiAoJG5ld0ZpbGUpIHsKU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJHRoaXMtPmZpbGUtPmdldFBhdGgoKSwgMDYwMCk7Cn0KfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcnJheVVuc2hpZnRSZWYoYXJyYXkgJiRhcnJheSwgJiR2YWx1ZSk6IGludAp7CiRyZXR1cm4gPSBhcnJheV91bnNoaWZ0KCRhcnJheSwgJycpOwokYXJyYXlbMF0gPSAmJHZhbHVlOwoKcmV0dXJuICRyZXR1cm47Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ29uc29sZTsKCnVzZSBDb21wb3NlclxJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxJT1xOdWxsSU87CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIExvZ2ljRXhjZXB0aW9uOwp1c2UgUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb24gYXMgQmFzZUFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQgYXMgU3ltZm9ueUNvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxRdWVzdGlvbkhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU2VsZFxKc29uTGludFxQYXJzaW5nRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcQ29tbWFuZDsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xDb25zb2xlSU87CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcVXRpbFxFcnJvckhhbmRsZXI7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxOb1NzbEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBBcHBsaWNhdGlvbiBleHRlbmRzIEJhc2VBcHBsaWNhdGlvbgp7CgoKCnByb3RlY3RlZCAkY29tcG9zZXI7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCnByaXZhdGUgc3RhdGljICRsb2dvID0gJyAgIF9fX19fXwogIC8gX19fXy9fX18gIF9fX18gX19fICBfX19fICBfX19fICBfX19fX19fXyAgX19fX18KIC8gLyAgIC8gX18gXC8gX18gYF9fIFwvIF9fIFwvIF9fIFwvIF9fXy8gXyBcLyBfX18vCi8gL19fXy8gL18vIC8gLyAvIC8gLyAvIC9fLyAvIC9fLyAoX18gICkgIF9fLyAvClxfX19fL1xfX19fL18vIC9fLyAvXy8gLl9fXy9cX19fXy9fX19fL1xfX18vXy8KICAgICAgICAgICAgICAgICAgICAvXy8KJzsKCgpwcml2YXRlICRoYXNQbHVnaW5Db21tYW5kcyA9IGZhbHNlOwoKcHJpdmF0ZSAkZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQgPSBmYWxzZTsKCnByaXZhdGUgJGRpc2FibGVTY3JpcHRzQnlEZWZhdWx0ID0gZmFsc2U7CgoKCgpwcml2YXRlICRpbml0aWFsV29ya2luZ0RpcmVjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUgPSAnQ29tcG9zZXInLCBzdHJpbmcgJHZlcnNpb24gPSAnJykKewppZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJ3NldENhdGNoRXJyb3JzJykpIHsKJHRoaXMtPnNldENhdGNoRXJyb3JzKHRydWUpOwp9CgpzdGF0aWMgJHNodXRkb3duUmVnaXN0ZXJlZCA9IGZhbHNlOwppZiAoJHZlcnNpb24gPT09ICcnKSB7CiR2ZXJzaW9uID0gQ29tcG9zZXI6OmdldFZlcnNpb24oKTsKfQppZiAoZnVuY3Rpb25fZXhpc3RzKCdpbmlfc2V0JykgJiYgZXh0ZW5zaW9uX2xvYWRlZCgneGRlYnVnJykpIHsKaW5pX3NldCgneGRlYnVnLnNob3dfZXhjZXB0aW9uX3RyYWNlJywgJzAnKTsKaW5pX3NldCgneGRlYnVnLnNjcmVhbScsICcwJyk7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2RhdGVfZGVmYXVsdF90aW1lem9uZV9zZXQnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2RhdGVfZGVmYXVsdF90aW1lem9uZV9nZXQnKSkgewpkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KFNpbGVuY2VyOjpjYWxsKCdkYXRlX2RlZmF1bHRfdGltZXpvbmVfZ2V0JykpOwp9CgokdGhpcy0+aW8gPSBuZXcgTnVsbElPKCk7CgppZiAoISRzaHV0ZG93blJlZ2lzdGVyZWQpIHsKJHNodXRkb3duUmVnaXN0ZXJlZCA9IHRydWU7CgpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihzdGF0aWMgZnVuY3Rpb24gKCk6IHZvaWQgewokbGFzdEVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKCmlmICgkbGFzdEVycm9yICYmICRsYXN0RXJyb3JbJ21lc3NhZ2UnXSAmJgooc3RycG9zKCRsYXN0RXJyb3JbJ21lc3NhZ2UnXSwgJ0FsbG93ZWQgbWVtb3J5JykgIT09IGZhbHNlICB8fApzdHJwb3MoJGxhc3RFcnJvclsnbWVzc2FnZSddLCAnZXhjZWVkZWQgbWVtb3J5JykgIT09IGZhbHNlICkpIHsKZWNobyAiXG4iLiAnQ2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCNtZW1vcnktbGltaXQtZXJyb3JzIGZvciBtb3JlIGluZm8gb24gaG93IHRvIGhhbmRsZSBvdXQgb2YgbWVtb3J5IGVycm9ycy4nOwp9Cn0pOwp9CgokdGhpcy0+aW5pdGlhbFdvcmtpbmdEaXJlY3RvcnkgPSBnZXRjd2QoKTsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUsICR2ZXJzaW9uKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7Cn0KCnB1YmxpYyBmdW5jdGlvbiBydW4oP0lucHV0SW50ZXJmYWNlICRpbnB1dCA9IG51bGwsID9PdXRwdXRJbnRlcmZhY2UgJG91dHB1dCA9IG51bGwpOiBpbnQKewppZiAobnVsbCA9PT0gJG91dHB1dCkgewokb3V0cHV0ID0gRmFjdG9yeTo6Y3JlYXRlT3V0cHV0KCk7Cn0KCnJldHVybiBwYXJlbnQ6OnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZG9SdW4oSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IGludAp7CiR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCA9ICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctLW5vLXBsdWdpbnMnKTsKJHRoaXMtPmRpc2FibGVTY3JpcHRzQnlEZWZhdWx0ID0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oJy0tbm8tc2NyaXB0cycpOwoKc3RhdGljICRzdGRpbiA9IG51bGw7CmlmIChudWxsID09PSAkc3RkaW4pIHsKJHN0ZGluID0gZGVmaW5lZCgnU1RESU4nKSA/IFNURElOIDogZm9wZW4oJ3BocDovL3N0ZGluJywgJ3InKTsKfQppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfVEVTVFNfQVJFX1JVTk5JTkcnKSAhPT0gJzEnICYmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9OT19JTlRFUkFDVElPTicpIHx8ICRzdGRpbiA9PT0gZmFsc2UgfHwgIVBsYXRmb3JtOjppc1R0eSgkc3RkaW4pKSkgewokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKfQoKJGlvID0gJHRoaXMtPmlvID0gbmV3IENvbnNvbGVJTygkaW5wdXQsICRvdXRwdXQsIG5ldyBIZWxwZXJTZXQoWwpuZXcgUXVlc3Rpb25IZWxwZXIoKSwKXSkpOwoKCkVycm9ySGFuZGxlcjo6cmVnaXN0ZXIoJGlvKTsKCmlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1uby1jYWNoZScpKSB7CiRpby0+d3JpdGVFcnJvcignRGlzYWJsaW5nIGNhY2hlIHVzYWdlJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKUGxhdGZvcm06OnB1dEVudignQ09NUE9TRVJfQ0FDSEVfRElSJywgUGxhdGZvcm06OmlzV2luZG93cygpID8gJ251bCcgOiAnL2Rldi9udWxsJyk7Cn0KCgokbmV3V29ya0RpciA9ICR0aGlzLT5nZXROZXdXb3JraW5nRGlyKCRpbnB1dCk7CmlmIChudWxsICE9PSAkbmV3V29ya0Rpcikgewokb2xkV29ya2luZ0RpciA9IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CmNoZGlyKCRuZXdXb3JrRGlyKTsKJHRoaXMtPmluaXRpYWxXb3JraW5nRGlyZWN0b3J5ID0gZ2V0Y3dkKCk7CiRjd2QgPSBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwokaW8tPndyaXRlRXJyb3IoJ0NoYW5nZWQgQ1dEIHRvICcgLiAoJGN3ZCAhPT0gJycgPyAkY3dkIDogJG5ld1dvcmtEaXIpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgoKJGNvbW1hbmROYW1lID0gJyc7CmlmICgkbmFtZSA9ICR0aGlzLT5nZXRDb21tYW5kTmFtZUJlZm9yZUJpbmRpbmcoJGlucHV0KSkgewp0cnkgewokY29tbWFuZE5hbWUgPSAkdGhpcy0+ZmluZCgkbmFtZSktPmdldE5hbWUoKTsKfSBjYXRjaCAoQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uICRlKSB7CgokY29tbWFuZE5hbWUgPSBmYWxzZTsKfSBjYXRjaCAoXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewp9Cn0KCgppZiAoCm51bGwgPT09ICRuZXdXb3JrRGlyCgomJiAhaW5fYXJyYXkoJGNvbW1hbmROYW1lLCBbJycsICdsaXN0JywgJ2luaXQnLCAnYWJvdXQnLCAnaGVscCcsICdkaWFnbm9zZScsICdzZWxmLXVwZGF0ZScsICdnbG9iYWwnLCAnY3JlYXRlLXByb2plY3QnLCAnb3V0ZGF0ZWQnXSwgdHJ1ZSkKJiYgIWZpbGVfZXhpc3RzKEZhY3Rvcnk6OmdldENvbXBvc2VyRmlsZSgpKQoKJiYgKCR1c2VQYXJlbnREaXJJZk5vSnNvbkF2YWlsYWJsZSA9ICR0aGlzLT5nZXRVc2VQYXJlbnREaXJDb25maWdWYWx1ZSgpKSAhPT0gZmFsc2UKCiYmICgkY29tbWFuZE5hbWUgIT09ICdjb25maWcnIHx8ICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1maWxlJywgdHJ1ZSkgPT09IGZhbHNlICYmICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctZicsIHRydWUpID09PSBmYWxzZSkpCgomJiAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1oZWxwJywgdHJ1ZSkgPT09IGZhbHNlCiYmICRpbnB1dC0+aGFzUGFyYW1ldGVyT3B0aW9uKCctaCcsIHRydWUpID09PSBmYWxzZQopIHsKJGRpciA9IGRpcm5hbWUoUGxhdGZvcm06OmdldEN3ZCh0cnVlKSk7CiRob21lID0gcmVhbHBhdGgoUGxhdGZvcm06OmdldEVudignSE9NRScpID86IFBsYXRmb3JtOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykgPzogJy8nKTsKCgp3aGlsZSAoZGlybmFtZSgkZGlyKSAhPT0gJGRpciAmJiAkZGlyICE9PSAkaG9tZSkgewppZiAoZmlsZV9leGlzdHMoJGRpci4nLycuRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpKSB7CmlmICgkdXNlUGFyZW50RGlySWZOb0pzb25BdmFpbGFibGUgIT09IHRydWUgJiYgISRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRpby0+d3JpdGVFcnJvcignPGluZm8+Tm8gY29tcG9zZXIuanNvbiBpbiBjdXJyZW50IGRpcmVjdG9yeSwgdG8gdXNlIHRoZSBvbmUgYXQgJy4kZGlyLicgcnVuIGludGVyYWN0aXZlbHkgb3Igc2V0IGNvbmZpZy51c2UtcGFyZW50LWRpciB0byB0cnVlPC9pbmZvPicpOwpicmVhazsKfQppZiAoJHVzZVBhcmVudERpcklmTm9Kc29uQXZhaWxhYmxlID09PSB0cnVlIHx8ICRpby0+YXNrQ29uZmlybWF0aW9uKCc8aW5mbz5ObyBjb21wb3Nlci5qc29uIGluIGN1cnJlbnQgZGlyZWN0b3J5LCBkbyB5b3Ugd2FudCB0byB1c2UgdGhlIG9uZSBhdCAnLiRkaXIuJz88L2luZm8+IFs8Y29tbWVudD55LG48L2NvbW1lbnQ+XT8gJykpIHsKaWYgKCR1c2VQYXJlbnREaXJJZk5vSnNvbkF2YWlsYWJsZSA9PT0gdHJ1ZSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk5vIGNvbXBvc2VyLmpzb24gaW4gY3VycmVudCBkaXJlY3RvcnksIGNoYW5naW5nIHdvcmtpbmcgZGlyZWN0b3J5IHRvICcuJGRpci4nPC9pbmZvPicpOwp9IGVsc2UgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPkFsd2F5cyB3YW50IHRvIHVzZSB0aGUgcGFyZW50IGRpcj8gVXNlICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgdXNlLXBhcmVudC1kaXIgdHJ1ZSIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0LjwvaW5mbz4nKTsKfQokb2xkV29ya2luZ0RpciA9IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CmNoZGlyKCRkaXIpOwp9CmJyZWFrOwp9CiRkaXIgPSBkaXJuYW1lKCRkaXIpOwp9CnVuc2V0KCRkaXIsICRob21lKTsKfQoKJG5lZWRzU3Vkb0NoZWNrID0gIVBsYXRmb3JtOjppc1dpbmRvd3MoKQomJiBmdW5jdGlvbl9leGlzdHMoJ2V4ZWMnKQomJiAhUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfQUxMT1dfU1VQRVJVU0VSJykKJiYgIVBsYXRmb3JtOjppc0RvY2tlcigpOwokaXNOb25BbGxvd2VkUm9vdCA9IGZhbHNlOwoKCmlmICgkbmVlZHNTdWRvQ2hlY2spIHsKJGlzTm9uQWxsb3dlZFJvb3QgPSAkdGhpcy0+aXNSdW5uaW5nQXNSb290KCk7CgppZiAoJGlzTm9uQWxsb3dlZFJvb3QpIHsKaWYgKCR1aWQgPSAoaW50KSBQbGF0Zm9ybTo6Z2V0RW52KCdTVURPX1VJRCcpKSB7CgoKU2lsZW5jZXI6OmNhbGwoJ2V4ZWMnLCAic3VkbyAtdSBcXCN7JHVpZH0gc3VkbyAtSyA+IC9kZXYvbnVsbCAyPiYxIik7Cn0KfQoKClNpbGVuY2VyOjpjYWxsKCdleGVjJywgJ3N1ZG8gLUsgPiAvZGV2L251bGwgMj4mMScpOwp9CgoKCiRtYXlOZWVkUGx1Z2luQ29tbWFuZCA9IGZhbHNlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tdmVyc2lvbicsICctViddKQomJiAoCgpmYWxzZSA9PT0gJGNvbW1hbmROYW1lCgp8fCBpbl9hcnJheSgkY29tbWFuZE5hbWUsIFsnJywgJ2xpc3QnLCAnaGVscCddLCB0cnVlKQoKCnx8ICgkY29tbWFuZE5hbWUgPT09ICdfY29tcGxldGUnICYmICEkaXNOb25BbGxvd2VkUm9vdCkKKTsKCmlmICgkbWF5TmVlZFBsdWdpbkNvbW1hbmQgJiYgISR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCAmJiAhJHRoaXMtPmhhc1BsdWdpbkNvbW1hbmRzKSB7CgoKaWYgKCRpc05vbkFsbG93ZWRSb290KSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RG8gbm90IHJ1biBDb21wb3NlciBhcyByb290L3N1cGVyIHVzZXIhIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9yb290IGZvciBkZXRhaWxzPC93YXJuaW5nPicpOwoKaWYgKCRpby0+aXNJbnRlcmFjdGl2ZSgpICYmICRpby0+YXNrQ29uZmlybWF0aW9uKCc8aW5mbz5Db250aW51ZSBhcyByb290L3N1cGVyIHVzZXI8L2luZm8+IFs8Y29tbWVudD55ZXM8L2NvbW1lbnQ+XT8gJykpIHsKCiRpc05vbkFsbG93ZWRSb290ID0gZmFsc2U7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QWJvcnRpbmcgYXMgbm8gcGx1Z2luIHNob3VsZCBiZSBsb2FkZWQgaWYgcnVubmluZyBhcyBzdXBlciB1c2VyIGlzIG5vdCBleHBsaWNpdGx5IGFsbG93ZWQ8L3dhcm5pbmc+Jyk7CgpyZXR1cm4gMTsKfQp9Cgp0cnkgewpmb3JlYWNoICgkdGhpcy0+Z2V0UGx1Z2luQ29tbWFuZHMoKSBhcyAkY29tbWFuZCkgewppZiAoJHRoaXMtPmhhcygkY29tbWFuZC0+Z2V0TmFtZSgpKSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBsdWdpbiBjb21tYW5kICcuJGNvbW1hbmQtPmdldE5hbWUoKS4nICgnLmdldF9jbGFzcygkY29tbWFuZCkuJykgd291bGQgb3ZlcnJpZGUgYSBDb21wb3NlciBjb21tYW5kIGFuZCBoYXMgYmVlbiBza2lwcGVkPC93YXJuaW5nPicpOwp9IGVsc2UgewoKCm1ldGhvZF9leGlzdHMoJHRoaXMsICdhZGRDb21tYW5kJykgPyAkdGhpcy0+YWRkQ29tbWFuZCgkY29tbWFuZCkgOiAkdGhpcy0+YWRkKCRjb21tYW5kKTsKfQp9Cn0gY2F0Y2ggKE5vU3NsRXhjZXB0aW9uICRlKSB7Cgp9IGNhdGNoIChQYXJzaW5nRXhjZXB0aW9uICRlKSB7CiRkZXRhaWxzID0gJGUtPmdldERldGFpbHMoKTsKCiRmaWxlID0gcmVhbHBhdGgoRmFjdG9yeTo6Z2V0Q29tcG9zZXJGaWxlKCkpOwoKJGxpbmUgPSBudWxsOwppZiAoJGRldGFpbHMgJiYgaXNzZXQoJGRldGFpbHNbJ2xpbmUnXSkpIHsKJGxpbmUgPSAkZGV0YWlsc1snbGluZSddOwp9CgokZ2hlID0gbmV3IEdpdGh1YkFjdGlvbkVycm9yKCR0aGlzLT5pbyk7CiRnaGUtPmVtaXQoJGUtPmdldE1lc3NhZ2UoKSwgJGZpbGUsICRsaW5lKTsKCnRocm93ICRlOwp9CgokdGhpcy0+aGFzUGx1Z2luQ29tbWFuZHMgPSB0cnVlOwp9CgppZiAoISR0aGlzLT5kaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCAmJiAkaXNOb25BbGxvd2VkUm9vdCAmJiAhJGlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q29tcG9zZXIgcGx1Z2lucyBoYXZlIGJlZW4gZGlzYWJsZWQgZm9yIHNhZmV0eSBpbiB0aGlzIG5vbi1pbnRlcmFjdGl2ZSBzZXNzaW9uLjwvZXJyb3I+Jyk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlNldCBDT01QT1NFUl9BTExPV19TVVBFUlVTRVI9MSBpZiB5b3Ugd2FudCB0byBhbGxvdyBwbHVnaW5zIHRvIHJ1biBhcyByb290L3N1cGVyIHVzZXIuPC9lcnJvcj4nKTsKJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0ID0gdHJ1ZTsKfQoKCiRpc1Byb3h5Q29tbWFuZCA9IGZhbHNlOwppZiAoJG5hbWUgPSAkdGhpcy0+Z2V0Q29tbWFuZE5hbWVCZWZvcmVCaW5kaW5nKCRpbnB1dCkpIHsKdHJ5IHsKJGNvbW1hbmQgPSAkdGhpcy0+ZmluZCgkbmFtZSk7CiRjb21tYW5kTmFtZSA9ICRjb21tYW5kLT5nZXROYW1lKCk7CiRpc1Byb3h5Q29tbWFuZCA9ICgkY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRcQmFzZUNvbW1hbmQgJiYgJGNvbW1hbmQtPmlzUHJveHlDb21tYW5kKCkpOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7Cn0KfQoKaWYgKCEkaXNQcm94eUNvbW1hbmQpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoCidSdW5uaW5nICVzICglcykgd2l0aCAlcyBvbiAlcycsCkNvbXBvc2VyOjpnZXRWZXJzaW9uKCksCkNvbXBvc2VyOjpSRUxFQVNFX0RBVEUsCmRlZmluZWQoJ0hIVk1fVkVSU0lPTicpID8gJ0hIVk0gJy5ISFZNX1ZFUlNJT04gOiAnUEhQICcuUEhQX1ZFUlNJT04sCmZ1bmN0aW9uX2V4aXN0cygncGhwX3VuYW1lJykgPyBwaHBfdW5hbWUoJ3MnKSAuICcgLyAnIC4gcGhwX3VuYW1lKCdyJykgOiAnVW5rbm93biBPUycKKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA3MDIwNSkgewokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNvbXBvc2VyIHN1cHBvcnRzIFBIUCA3LjIuNSBhbmQgYWJvdmUsIHlvdSB3aWxsIG1vc3QgbGlrZWx5IGVuY291bnRlciBwcm9ibGVtcyB3aXRoIHlvdXIgUEhQICcuUEhQX1ZFUlNJT04uJy4gVXBncmFkaW5nIGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIGJ1dCB5b3UgY2FuIHVzZSBDb21wb3NlciAyLjIueCBMVFMgYXMgYSBmYWxsYmFjay48L3dhcm5pbmc+Jyk7Cn0KCmlmIChYZGVidWdIYW5kbGVyOjppc1hkZWJ1Z0FjdGl2ZSgpICYmICFQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX1hERUJVR19XQVJOJykpIHsKJGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Db21wb3NlciBpcyBvcGVyYXRpbmcgc2xvd2VyIHRoYW4gbm9ybWFsIGJlY2F1c2UgeW91IGhhdmUgWGRlYnVnIGVuYWJsZWQuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy94ZGVidWc8L3dhcm5pbmc+Jyk7Cn0KCmlmIChkZWZpbmVkKCdDT01QT1NFUl9ERVZfV0FSTklOR19USU1FJykgJiYgJGNvbW1hbmROYW1lICE9PSAnc2VsZi11cGRhdGUnICYmICRjb21tYW5kTmFtZSAhPT0gJ3NlbGZ1cGRhdGUnICYmIHRpbWUoKSA+IENPTVBPU0VSX0RFVl9XQVJOSU5HX1RJTUUpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzx3YXJuaW5nPldhcm5pbmc6IFRoaXMgZGV2ZWxvcG1lbnQgYnVpbGQgb2YgQ29tcG9zZXIgaXMgb3ZlciA2MCBkYXlzIG9sZC4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXBkYXRlIGl0IGJ5IHJ1bm5pbmcgIiVzIHNlbGYtdXBkYXRlIiB0byBnZXQgdGhlIGxhdGVzdCB2ZXJzaW9uLjwvd2FybmluZz4nLCAkX1NFUlZFUlsnUEhQX1NFTEYnXSkpOwp9CgppZiAoJGlzTm9uQWxsb3dlZFJvb3QpIHsKaWYgKCRjb21tYW5kTmFtZSAhPT0gJ3NlbGYtdXBkYXRlJyAmJiAkY29tbWFuZE5hbWUgIT09ICdzZWxmdXBkYXRlJyAmJiAkY29tbWFuZE5hbWUgIT09ICdfY29tcGxldGUnKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RG8gbm90IHJ1biBDb21wb3NlciBhcyByb290L3N1cGVyIHVzZXIhIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9yb290IGZvciBkZXRhaWxzPC93YXJuaW5nPicpOwoKaWYgKCRpby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICghJGlvLT5hc2tDb25maXJtYXRpb24oJzxpbmZvPkNvbnRpbnVlIGFzIHJvb3Qvc3VwZXIgdXNlcjwvaW5mbz4gWzxjb21tZW50PnllczwvY29tbWVudD5dPyAnKSkgewpyZXR1cm4gMTsKfQp9Cn0KfQoKClNpbGVuY2VyOjpjYWxsKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRpbyk6IHZvaWQgewokcGlkID0gZnVuY3Rpb25fZXhpc3RzKCdnZXRteXBpZCcpID8gZ2V0bXlwaWQoKSAuICctJyA6ICcnOwokdGVtcGZpbGUgPSBzeXNfZ2V0X3RlbXBfZGlyKCkgLiAnL3RlbXAtJyAuICRwaWQgLiBiaW4yaGV4KHJhbmRvbV9ieXRlcyg1KSk7CmlmICghKGZpbGVfcHV0X2NvbnRlbnRzKCR0ZW1wZmlsZSwgX19GSUxFX18pICYmIChmaWxlX2dldF9jb250ZW50cygkdGVtcGZpbGUpID09PSBfX0ZJTEVfXykgJiYgdW5saW5rKCR0ZW1wZmlsZSkgJiYgIWZpbGVfZXhpc3RzKCR0ZW1wZmlsZSkpKSB7CiRpby0+d3JpdGVFcnJvcihzcHJpbnRmKCc8ZXJyb3I+UEhQIHRlbXAgZGlyZWN0b3J5ICglcykgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IHdyaXRhYmxlIHRvIENvbXBvc2VyLiBTZXQgc3lzX3RlbXBfZGlyIGluIHlvdXIgcGhwLmluaTwvZXJyb3I+Jywgc3lzX2dldF90ZW1wX2RpcigpKSk7Cn0KfSk7CgoKJGZpbGUgPSBGYWN0b3J5OjpnZXRDb21wb3NlckZpbGUoKTsKaWYgKGlzX2ZpbGUoJGZpbGUpICYmIEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGZpbGUpICYmIGlzX2FycmF5KCRjb21wb3NlciA9IGpzb25fZGVjb2RlKGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKSwgdHJ1ZSkpKSB7CmlmIChpc3NldCgkY29tcG9zZXJbJ3NjcmlwdHMnXSkgJiYgaXNfYXJyYXkoJGNvbXBvc2VyWydzY3JpcHRzJ10pKSB7CmZvcmVhY2ggKCRjb21wb3Nlclsnc2NyaXB0cyddIGFzICRzY3JpcHQgPT4gJGR1bW15KSB7CmlmICghZGVmaW5lZCgnQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czo6Jy5zdHJfcmVwbGFjZSgnLScsICdfJywgc3RydG91cHBlcigkc2NyaXB0KSkpKSB7CmlmICgkdGhpcy0+aGFzKCRzY3JpcHQpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+QSBzY3JpcHQgbmFtZWQgJy4kc2NyaXB0Licgd291bGQgb3ZlcnJpZGUgYSBDb21wb3NlciBjb21tYW5kIGFuZCBoYXMgYmVlbiBza2lwcGVkPC93YXJuaW5nPicpOwp9IGVsc2UgewokZGVzY3JpcHRpb24gPSBudWxsOwoKaWYgKGlzc2V0KCRjb21wb3Nlclsnc2NyaXB0cy1kZXNjcmlwdGlvbnMnXVskc2NyaXB0XSkpIHsKJGRlc2NyaXB0aW9uID0gJGNvbXBvc2VyWydzY3JpcHRzLWRlc2NyaXB0aW9ucyddWyRzY3JpcHRdOwp9CgokYWxpYXNlcyA9ICRjb21wb3Nlclsnc2NyaXB0cy1hbGlhc2VzJ11bJHNjcmlwdF0gPz8gW107CgoKaWYgKGlzX3N0cmluZygkZHVtbXkpICYmIGNsYXNzX2V4aXN0cygkZHVtbXkpICYmIGlzX3N1YmNsYXNzX29mKCRkdW1teSwgU3ltZm9ueUNvbW1hbmQ6OmNsYXNzKSkgewokY21kID0gbmV3ICRkdW1teSgkc2NyaXB0KTsKCgppZiAoJGNtZC0+Z2V0TmFtZSgpICE9PSAnJyAmJiAkY21kLT5nZXROYW1lKCkgIT09IG51bGwgJiYgJGNtZC0+Z2V0TmFtZSgpICE9PSAkc2NyaXB0KSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlIHNjcmlwdCBuYW1lZCAnLiRzY3JpcHQuJyBpbiBjb21wb3Nlci5qc29uIGhhcyBhIG1pc21hdGNoZWQgbmFtZSBpbiBpdHMgY2xhc3MgZGVmaW5pdGlvbi4gRm9yIGNvbnNpc3RlbmN5LCBlaXRoZXIgdXNlIHRoZSBzYW1lIG5hbWUsIG9yIGRvIG5vdCBkZWZpbmUgb25lIGluc2lkZSB0aGUgY2xhc3MuPC93YXJuaW5nPicpOwokY21kLT5zZXROYW1lKCRzY3JpcHQpOyAKfQoKaWYgKCRjbWQtPmdldERlc2NyaXB0aW9uKCkgPT09ICcnICYmIGlzX3N0cmluZygkZGVzY3JpcHRpb24pKSB7CiRjbWQtPnNldERlc2NyaXB0aW9uKCRkZXNjcmlwdGlvbik7Cn0KfSBlbHNlIHsKCiRjbWQgPSBuZXcgQ29tbWFuZFxTY3JpcHRBbGlhc0NvbW1hbmQoJHNjcmlwdCwgJGRlc2NyaXB0aW9uLCAkYWxpYXNlcyk7Cn0KCgoKbWV0aG9kX2V4aXN0cygkdGhpcywgJ2FkZENvbW1hbmQnKSA/ICR0aGlzLT5hZGRDb21tYW5kKCRjbWQpIDogJHRoaXMtPmFkZCgkY21kKTsKfQp9Cn0KfQp9Cn0KCnRyeSB7CmlmICgkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbignLS1wcm9maWxlJykpIHsKJHN0YXJ0VGltZSA9IG1pY3JvdGltZSh0cnVlKTsKJHRoaXMtPmlvLT5lbmFibGVEZWJ1Z2dpbmcoJHN0YXJ0VGltZSk7Cn0KCiRyZXN1bHQgPSBwYXJlbnQ6OmRvUnVuKCRpbnB1dCwgJG91dHB1dCk7CgppZiAodHJ1ZSA9PT0gJGlucHV0LT5oYXNQYXJhbWV0ZXJPcHRpb24oWyctLXZlcnNpb24nLCAnLVYnXSwgdHJ1ZSkpIHsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJzxpbmZvPlBIUDwvaW5mbz4gdmVyc2lvbiA8Y29tbWVudD4lczwvY29tbWVudD4gKCVzKScsIFxQSFBfVkVSU0lPTiwgXFBIUF9CSU5BUlkpKTsKJGlvLT53cml0ZUVycm9yKCdSdW4gdGhlICJkaWFnbm9zZSIgY29tbWFuZCB0byBnZXQgbW9yZSBkZXRhaWxlZCBkaWFnbm9zdGljcyBvdXRwdXQuJyk7Cn0KCgppZiAoaXNzZXQoJG9sZFdvcmtpbmdEaXIpICYmICcnICE9PSAkb2xkV29ya2luZ0RpcikgewpTaWxlbmNlcjo6Y2FsbCgnY2hkaXInLCAkb2xkV29ya2luZ0Rpcik7Cn0KCmlmIChpc3NldCgkc3RhcnRUaW1lKSkgewokaW8tPndyaXRlRXJyb3IoJzxpbmZvPk1lbW9yeSB1c2FnZTogJy5yb3VuZChtZW1vcnlfZ2V0X3VzYWdlKCkgLyAxMDI0IC8gMTAyNCwgMikuJ01pQiAocGVhazogJy5yb3VuZChtZW1vcnlfZ2V0X3BlYWtfdXNhZ2UoKSAvIDEwMjQgLyAxMDI0LCAyKS4nTWlCKSwgdGltZTogJy5yb3VuZChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnRUaW1lLCAyKS4nczwvaW5mbz4nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0gY2F0Y2ggKFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbiAkZSkgewppZiAoJHRoaXMtPmdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCkgJiYgJHRoaXMtPmlzUnVubmluZ0FzUm9vdCgpICYmICEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5QbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IGFzIHlvdSBhcmUgcnVubmluZyBhcyByb290LCB0aGlzIG1heSBiZSB0aGUgY2F1c2Ugb2YgdGhlIHNjcmlwdCBmYWlsdXJlLjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+U2VlIGFsc28gaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvcm9vdDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQoKcmV0dXJuICRlLT5nZXRDb2RlKCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGdoZSA9IG5ldyBHaXRodWJBY3Rpb25FcnJvcigkdGhpcy0+aW8pOwokZ2hlLT5lbWl0KCRlLT5nZXRNZXNzYWdlKCkpOwoKJHRoaXMtPmhpbnRDb21tb25FcnJvcnMoJGUsICRvdXRwdXQpOwoKCgoKaWYgKCFtZXRob2RfZXhpc3RzKCR0aGlzLCAnc2V0Q2F0Y2hFcnJvcnMnKSAmJiAhJGUgaW5zdGFuY2VvZiBcRXhjZXB0aW9uKSB7CmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSkgewokdGhpcy0+cmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpKTsKfSBlbHNlIHsKJHRoaXMtPnJlbmRlclRocm93YWJsZSgkZSwgJG91dHB1dCk7Cn0KCnJldHVybiBtYXgoMSwgJGUtPmdldENvZGUoKSk7Cn0KCgoKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CiRyZWZsUHJvcCA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCRlLCAnY29kZScpOwooXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIGFuZCAkcmVmbFByb3AtPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRyZWZsUHJvcC0+c2V0VmFsdWUoJGUsIEluc3RhbGxlcjo6RVJST1JfVFJBTlNQT1JUX0VYQ0VQVElPTik7Cn0KCnRocm93ICRlOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldE5ld1dvcmtpbmdEaXIoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogP3N0cmluZwp7Cgokd29ya2luZ0RpciA9ICRpbnB1dC0+Z2V0UGFyYW1ldGVyT3B0aW9uKFsnLS13b3JraW5nLWRpcicsICctZCddLCBudWxsLCB0cnVlKTsKaWYgKG51bGwgIT09ICR3b3JraW5nRGlyICYmICFpc19kaXIoJHdvcmtpbmdEaXIpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIHdvcmtpbmcgZGlyZWN0b3J5IHNwZWNpZmllZCwgJy4kd29ya2luZ0Rpci4nIGRvZXMgbm90IGV4aXN0LicpOwp9CgpyZXR1cm4gJHdvcmtpbmdEaXI7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaGludENvbW1vbkVycm9ycyhcVGhyb3dhYmxlICRleGNlcHRpb24sIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogdm9pZAp7CiRpbyA9ICR0aGlzLT5nZXRJTygpOwoKaWYgKChnZXRfY2xhc3MoJGV4Y2VwdGlvbikgPT09IExvZ2ljRXhjZXB0aW9uOjpjbGFzcyB8fCAkZXhjZXB0aW9uIGluc3RhbmNlb2YgXEVycm9yKSAmJiAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSA8IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UpIHsKJG91dHB1dC0+c2V0VmVyYm9zaXR5KE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0UpOwp9CgpTaWxlbmNlcjo6c3VwcHJlc3MoKTsKdHJ5IHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldENvbXBvc2VyKGZhbHNlLCB0cnVlKTsKaWYgKG51bGwgIT09ICRjb21wb3NlciAmJiBmdW5jdGlvbl9leGlzdHMoJ2Rpc2tfZnJlZV9zcGFjZScpKSB7CiRjb25maWcgPSAkY29tcG9zZXItPmdldENvbmZpZygpOwoKJG1pblNwYWNlRnJlZSA9IDEwMCAqIDEwMjQgKiAxMDI0OwppZiAoKCgkZGYgPSBkaXNrX2ZyZWVfc3BhY2UoJGRpciA9ICRjb25maWctPmdldCgnaG9tZScpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCnx8ICgoJGRmID0gZGlza19mcmVlX3NwYWNlKCRkaXIgPSAkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKSkpICE9PSBmYWxzZSAmJiAkZGYgPCAkbWluU3BhY2VGcmVlKQp8fCAoKCRkZiA9IGRpc2tfZnJlZV9zcGFjZSgkZGlyID0gc3lzX2dldF90ZW1wX2RpcigpKSkgIT09IGZhbHNlICYmICRkZiA8ICRtaW5TcGFjZUZyZWUpCikgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgZGlzayBob3N0aW5nICcuJGRpci4nIGhhcyBsZXNzIHRoYW4gMTAwTWlCIG9mIGZyZWUgc3BhY2UsIHRoaXMgbWF5IGJlIHRoZSBjYXVzZSBvZiB0aGUgZm9sbG93aW5nIGV4Y2VwdGlvbjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQpTaWxlbmNlcjo6cmVzdG9yZSgpOwoKaWYgKCRleGNlcHRpb24gaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgc3RyX2NvbnRhaW5zKCRleGNlcHRpb24tPmdldE1lc3NhZ2UoKSwgJ1VuYWJsZSB0byB1c2UgYSBwcm94eScpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGluZGljYXRlcyB5b3VyIHByb3h5IGlzIG1pc2NvbmZpZ3VyZWQ8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9mYXFzL2hvdy10by11c2UtY29tcG9zZXItYmVoaW5kLWEtcHJveHkubWQgZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiBzdHJfY29udGFpbnMoJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCAndW5hYmxlIHRvIGdldCBsb2NhbCBpc3N1ZXIgY2VydGlmaWNhdGUnKSkgewokYXZhc3REZXRlY3QgPSBnbG9iKCdDOlxQcm9ncmFtIEZpbGVzXEF2YXN0KicpOwppZiAoaXNfYXJyYXkoJGF2YXN0RGV0ZWN0KSAmJiBjb3VudCgkYXZhc3REZXRlY3QpICE9PSAwKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGluZGljYXRlcyBhIHBvc3NpYmxlIGlzc3VlIHdpdGggdGhlIEF2YXN0IEZpcmV3YWxsPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5DaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9sb2NhbC1pc3N1ZXIgZm9yIGRldGFpbHM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0gZWxzZSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIGluZGljYXRlcyBhIHBvc3NpYmxlIGlzc3VlIHdpdGggYSBGaXJld2FsbC9BbnRpdmlydXM8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2xvY2FsLWlzc3VlciBmb3IgZGV0YWlsczwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKfQp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIGZhbHNlICE9PSBzdHJwb3MoJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpLCAnVGhlIHN5c3RlbSBjYW5ub3QgZmluZCB0aGUgcGF0aCBzcGVjaWZpZWQnKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBtYXkgYmUgY2F1c2VkIGJ5IGEgc3RhbGUgZW50cnkgaW4geW91ciBjbWQuZXhlIEF1dG9SdW48L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy90cm91Ymxlc2hvb3RpbmcubWQjLXRoZS1zeXN0ZW0tY2Fubm90LWZpbmQtdGhlLXBhdGgtc3BlY2lmaWVkLXdpbmRvd3MtIGZvciBkZXRhaWxzPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9CgppZiAoZmFsc2UgIT09IHN0cnBvcygkZXhjZXB0aW9uLT5nZXRNZXNzYWdlKCksICdmb3JrIGZhaWxlZCAtIENhbm5vdCBhbGxvY2F0ZSBtZW1vcnknKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpcyBjYXVzZWQgYnkgYSBsYWNrIG9mIG1lbW9yeSBvciBzd2FwLCBvciBub3QgaGF2aW5nIHN3YXAgY29uZmlndXJlZDwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKJGlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2hlY2sgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3Ryb3VibGVzaG9vdGluZy5tZCNwcm9jLW9wZW4tZm9yay1mYWlsZWQtZXJyb3JzIGZvciBkZXRhaWxzPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9CgppZiAoJGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbikgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBpcyBjYXVzZWQgYnkgYSBwcm9jZXNzIHRpbWVvdXQ8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPkNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNi1jb25maWcubWQjcHJvY2Vzcy10aW1lb3V0IGZvciBkZXRhaWxzPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9CgppZiAoJHRoaXMtPmdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCkgJiYgJHRoaXMtPmlzUnVubmluZ0FzUm9vdCgpICYmICEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokaW8tPndyaXRlRXJyb3IoJzxlcnJvcj5QbHVnaW5zIGhhdmUgYmVlbiBkaXNhYmxlZCBhdXRvbWF0aWNhbGx5IGFzIHlvdSBhcmUgcnVubmluZyBhcyByb290LCB0aGlzIG1heSBiZSB0aGUgY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBleGNlcHRpb24uIFNlZSBhbHNvIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3Q8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0gZWxzZWlmICgkZXhjZXB0aW9uIGluc3RhbmNlb2YgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uICYmICR0aGlzLT5nZXREaXNhYmxlUGx1Z2luc0J5RGVmYXVsdCgpKSB7CiRpby0+d3JpdGVFcnJvcignPGVycm9yPlBsdWdpbnMgaGF2ZSBiZWVuIGRpc2FibGVkLCB3aGljaCBtYXkgYmUgd2h5IHNvbWUgY29tbWFuZHMgYXJlIG1pc3NpbmcsIHVubGVzcyB5b3UgbWFkZSBhIHR5cG88L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCiRoaW50cyA9IEh0dHBEb3dubG9hZGVyOjpnZXRFeGNlcHRpb25IaW50cygkZXhjZXB0aW9uKTsKaWYgKG51bGwgIT09ICRoaW50cyAmJiBjb3VudCgkaGludHMpID4gMCkgewpmb3JlYWNoICgkaGludHMgYXMgJGhpbnQpIHsKJGlvLT53cml0ZUVycm9yKCRoaW50LCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp9Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoYm9vbCAkcmVxdWlyZWQgPSB0cnVlLCA/Ym9vbCAkZGlzYWJsZVBsdWdpbnMgPSBudWxsLCA/Ym9vbCAkZGlzYWJsZVNjcmlwdHMgPSBudWxsKTogP0NvbXBvc2VyCnsKaWYgKG51bGwgPT09ICRkaXNhYmxlUGx1Z2lucykgewokZGlzYWJsZVBsdWdpbnMgPSAkdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQ7Cn0KaWYgKG51bGwgPT09ICRkaXNhYmxlU2NyaXB0cykgewokZGlzYWJsZVNjcmlwdHMgPSAkdGhpcy0+ZGlzYWJsZVNjcmlwdHNCeURlZmF1bHQ7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Y29tcG9zZXIpIHsKdHJ5IHsKJHRoaXMtPmNvbXBvc2VyID0gRmFjdG9yeTo6Y3JlYXRlKFBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSA/IG5ldyBOdWxsSU8oKSA6ICR0aGlzLT5pbywgbnVsbCwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMpOwp9IGNhdGNoIChcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CmlmICgkcmVxdWlyZWQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRlLT5nZXRNZXNzYWdlKCkpOwppZiAoJHRoaXMtPmFyZUV4Y2VwdGlvbnNDYXVnaHQoKSkgewpleGl0KDEpOwp9CnRocm93ICRlOwp9Cn0gY2F0Y2ggKEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uICRlKSB7CmlmICgkcmVxdWlyZWQpIHsKdGhyb3cgJGU7Cn0KfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJHJlcXVpcmVkKSB7CnRocm93ICRlOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0Q29tcG9zZXIoKTogdm9pZAp7CiR0aGlzLT5jb21wb3NlciA9IG51bGw7CmlmIChtZXRob2RfZXhpc3RzKCR0aGlzLT5nZXRJTygpLCAncmVzZXRBdXRoZW50aWNhdGlvbnMnKSkgewokdGhpcy0+Z2V0SU8oKS0+cmVzZXRBdXRoZW50aWNhdGlvbnMoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVscCgpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6JGxvZ28gLiBwYXJlbnQ6OmdldEhlbHAoKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0Q29tbWFuZHMoKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfbWVyZ2UocGFyZW50OjpnZXREZWZhdWx0Q29tbWFuZHMoKSwgWwpuZXcgQ29tbWFuZFxBYm91dENvbW1hbmQoKSwKbmV3IENvbW1hbmRcQ29uZmlnQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxEZXBlbmRzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxQcm9oaWJpdHNDb21tYW5kKCksCm5ldyBDb21tYW5kXEluaXRDb21tYW5kKCksCm5ldyBDb21tYW5kXEluc3RhbGxDb21tYW5kKCksCm5ldyBDb21tYW5kXENyZWF0ZVByb2plY3RDb21tYW5kKCksCm5ldyBDb21tYW5kXFVwZGF0ZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcU2VhcmNoQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxWYWxpZGF0ZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcQXVkaXRDb21tYW5kKCksCm5ldyBDb21tYW5kXFNob3dDb21tYW5kKCksCm5ldyBDb21tYW5kXFN1Z2dlc3RzQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxSZXF1aXJlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxEdW1wQXV0b2xvYWRDb21tYW5kKCksCm5ldyBDb21tYW5kXFN0YXR1c0NvbW1hbmQoKSwKbmV3IENvbW1hbmRcQXJjaGl2ZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcRGlhZ25vc2VDb21tYW5kKCksCm5ldyBDb21tYW5kXFJ1blNjcmlwdENvbW1hbmQoKSwKbmV3IENvbW1hbmRcTGljZW5zZXNDb21tYW5kKCksCm5ldyBDb21tYW5kXEdsb2JhbENvbW1hbmQoKSwKbmV3IENvbW1hbmRcQ2xlYXJDYWNoZUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcUmVtb3ZlQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxIb21lQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxFeGVjQ29tbWFuZCgpLApuZXcgQ29tbWFuZFxPdXRkYXRlZENvbW1hbmQoKSwKbmV3IENvbW1hbmRcQ2hlY2tQbGF0Zm9ybVJlcXNDb21tYW5kKCksCm5ldyBDb21tYW5kXEZ1bmRDb21tYW5kKCksCm5ldyBDb21tYW5kXFJlaW5zdGFsbENvbW1hbmQoKSwKbmV3IENvbW1hbmRcQnVtcENvbW1hbmQoKSwKbmV3IENvbW1hbmRcUmVwb3NpdG9yeUNvbW1hbmQoKSwKbmV3IENvbW1hbmRcU2VsZlVwZGF0ZUNvbW1hbmQoKSwKXSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21tYW5kTmFtZUJlZm9yZUJpbmRpbmcoSW5wdXRJbnRlcmZhY2UgJGlucHV0KTogP3N0cmluZwp7CiRpbnB1dCA9IGNsb25lICRpbnB1dDsKdHJ5IHsKCiRpbnB1dC0+YmluZCgkdGhpcy0+Z2V0RGVmaW5pdGlvbigpKTsKfSBjYXRjaCAoRXhjZXB0aW9uSW50ZXJmYWNlICRlKSB7Cgp9CgpyZXR1cm4gJGlucHV0LT5nZXRGaXJzdEFyZ3VtZW50KCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb25nVmVyc2lvbigpOiBzdHJpbmcKewokYnJhbmNoQWxpYXNTdHJpbmcgPSAnJzsKaWYgKENvbXBvc2VyOjpCUkFOQ0hfQUxJQVNfVkVSU0lPTiAmJiBDb21wb3Nlcjo6QlJBTkNIX0FMSUFTX1ZFUlNJT04gIT09ICdAcGFja2FnZV9icmFuY2hfYWxpYXNfdmVyc2lvbicuJ0AnKSB7CiRicmFuY2hBbGlhc1N0cmluZyA9IHNwcmludGYoJyAoJXMpJywgQ29tcG9zZXI6OkJSQU5DSF9BTElBU19WRVJTSU9OKTsKfQoKcmV0dXJuIHNwcmludGYoCic8aW5mbz4lczwvaW5mbz4gdmVyc2lvbiA8Y29tbWVudD4lcyVzPC9jb21tZW50PiAlcycsCiR0aGlzLT5nZXROYW1lKCksCiR0aGlzLT5nZXRWZXJzaW9uKCksCiRicmFuY2hBbGlhc1N0cmluZywKQ29tcG9zZXI6OlJFTEVBU0VfREFURQopOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RGVmYXVsdElucHV0RGVmaW5pdGlvbigpOiBJbnB1dERlZmluaXRpb24KewokZGVmaW5pdGlvbiA9IHBhcmVudDo6Z2V0RGVmYXVsdElucHV0RGVmaW5pdGlvbigpOwokZGVmaW5pdGlvbi0+YWRkT3B0aW9uKG5ldyBJbnB1dE9wdGlvbignLS1wcm9maWxlJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5IHRpbWluZyBhbmQgbWVtb3J5IHVzYWdlIGluZm9ybWF0aW9uJykpOwokZGVmaW5pdGlvbi0+YWRkT3B0aW9uKG5ldyBJbnB1dE9wdGlvbignLS1uby1wbHVnaW5zJywgbnVsbCwgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdXaGV0aGVyIHRvIGRpc2FibGUgcGx1Z2lucy4nKSk7CiRkZWZpbml0aW9uLT5hZGRPcHRpb24obmV3IElucHV0T3B0aW9uKCctLW5vLXNjcmlwdHMnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1NraXBzIHRoZSBleGVjdXRpb24gb2YgYWxsIHNjcmlwdHMgZGVmaW5lZCBpbiBjb21wb3Nlci5qc29uIGZpbGUuJykpOwokZGVmaW5pdGlvbi0+YWRkT3B0aW9uKG5ldyBJbnB1dE9wdGlvbignLS13b3JraW5nLWRpcicsICctZCcsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ0lmIHNwZWNpZmllZCwgdXNlIHRoZSBnaXZlbiBkaXJlY3RvcnkgYXMgd29ya2luZyBkaXJlY3RvcnkuJykpOwokZGVmaW5pdGlvbi0+YWRkT3B0aW9uKG5ldyBJbnB1dE9wdGlvbignLS1uby1jYWNoZScsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnUHJldmVudCB1c2Ugb2YgdGhlIGNhY2hlJykpOwoKcmV0dXJuICRkZWZpbml0aW9uOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFBsdWdpbkNvbW1hbmRzKCk6IGFycmF5CnsKJGNvbW1hbmRzID0gW107CgokY29tcG9zZXIgPSAkdGhpcy0+Z2V0Q29tcG9zZXIoZmFsc2UsIGZhbHNlKTsKaWYgKG51bGwgPT09ICRjb21wb3NlcikgewokY29tcG9zZXIgPSBGYWN0b3J5OjpjcmVhdGVHbG9iYWwoJHRoaXMtPmlvLCAkdGhpcy0+ZGlzYWJsZVBsdWdpbnNCeURlZmF1bHQsICR0aGlzLT5kaXNhYmxlU2NyaXB0c0J5RGVmYXVsdCk7Cn0KCmlmIChudWxsICE9PSAkY29tcG9zZXIpIHsKJHBtID0gJGNvbXBvc2VyLT5nZXRQbHVnaW5NYW5hZ2VyKCk7CmZvcmVhY2ggKCRwbS0+Z2V0UGx1Z2luQ2FwYWJpbGl0aWVzKCdDb21wb3NlclxQbHVnaW5cQ2FwYWJpbGl0eVxDb21tYW5kUHJvdmlkZXInLCBbJ2NvbXBvc2VyJyA9PiAkY29tcG9zZXIsICdpbycgPT4gJHRoaXMtPmlvXSkgYXMgJGNhcGFiaWxpdHkpIHsKJG5ld0NvbW1hbmRzID0gJGNhcGFiaWxpdHktPmdldENvbW1hbmRzKCk7CmlmICghaXNfYXJyYXkoJG5ld0NvbW1hbmRzKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUGx1Z2luIGNhcGFiaWxpdHkgJy5nZXRfY2xhc3MoJGNhcGFiaWxpdHkpLicgZmFpbGVkIHRvIHJldHVybiBhbiBhcnJheSBmcm9tIGdldENvbW1hbmRzJyk7Cn0KZm9yZWFjaCAoJG5ld0NvbW1hbmRzIGFzICRjb21tYW5kKSB7CmlmICghJGNvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kXEJhc2VDb21tYW5kKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gY2FwYWJpbGl0eSAnLmdldF9jbGFzcygkY2FwYWJpbGl0eSkuJyByZXR1cm5lZCBhbiBpbnZhbGlkIHZhbHVlLCB3ZSBleHBlY3RlZCBhbiBhcnJheSBvZiBDb21wb3NlclxDb21tYW5kXEJhc2VDb21tYW5kIG9iamVjdHMnKTsKfQp9CiRjb21tYW5kcyA9IGFycmF5X21lcmdlKCRjb21tYW5kcywgJG5ld0NvbW1hbmRzKTsKfQp9CgpyZXR1cm4gJGNvbW1hbmRzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbml0aWFsV29ya2luZ0RpcmVjdG9yeSgpCnsKcmV0dXJuICR0aGlzLT5pbml0aWFsV29ya2luZ0RpcmVjdG9yeTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc2FibGVQbHVnaW5zQnlEZWZhdWx0KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRpc2FibGVQbHVnaW5zQnlEZWZhdWx0Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzYWJsZVNjcmlwdHNCeURlZmF1bHQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVNjcmlwdHNCeURlZmF1bHQ7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0VXNlUGFyZW50RGlyQ29uZmlnVmFsdWUoKQp7CiRjb25maWcgPSBGYWN0b3J5OjpjcmVhdGVDb25maWcoJHRoaXMtPmlvKTsKCnJldHVybiAkY29uZmlnLT5nZXQoJ3VzZS1wYXJlbnQtZGlyJyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gaXNSdW5uaW5nQXNSb290KCk6IGJvb2wKewpyZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXR1aWQnKSAmJiBwb3NpeF9nZXR1aWQoKSA9PT0gMDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDb25zb2xlOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCmZpbmFsIGNsYXNzIEdpdGh1YkFjdGlvbkVycm9yCnsKCgoKcHJvdGVjdGVkICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZW1pdChzdHJpbmcgJG1lc3NhZ2UsID9zdHJpbmcgJGZpbGUgPSBudWxsLCA/aW50ICRsaW5lID0gbnVsbCk6IHZvaWQKewppZiAoUGxhdGZvcm06OmdldEVudignR0lUSFVCX0FDVElPTlMnKSAmJiAhUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfVEVTVFNfQVJFX1JVTk5JTkcnKSkgewokbWVzc2FnZSA9ICR0aGlzLT5lc2NhcGVEYXRhKCRtZXNzYWdlKTsKCmlmICgkZmlsZSAmJiAkbGluZSkgewokZmlsZSA9ICR0aGlzLT5lc2NhcGVQcm9wZXJ0eSgkZmlsZSk7CiR0aGlzLT5pby0+d3JpdGUoIjo6ZXJyb3IgZmlsZT0iLiAkZmlsZSAuIixsaW5lPSIuICRsaW5lIC4iOjoiLiAkbWVzc2FnZSk7Cn0gZWxzZWlmICgkZmlsZSkgewokZmlsZSA9ICR0aGlzLT5lc2NhcGVQcm9wZXJ0eSgkZmlsZSk7CiR0aGlzLT5pby0+d3JpdGUoIjo6ZXJyb3IgZmlsZT0iLiAkZmlsZSAuIjo6Ii4gJG1lc3NhZ2UpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlKCI6OmVycm9yIDo6Ii4gJG1lc3NhZ2UpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBlc2NhcGVEYXRhKHN0cmluZyAkZGF0YSk6IHN0cmluZwp7CgokZGF0YSA9IHN0cl9yZXBsYWNlKCIlIiwgJyUyNScsICRkYXRhKTsKJGRhdGEgPSBzdHJfcmVwbGFjZSgiXHIiLCAnJTBEJywgJGRhdGEpOwokZGF0YSA9IHN0cl9yZXBsYWNlKCJcbiIsICclMEEnLCAkZGF0YSk7CgpyZXR1cm4gJGRhdGE7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlUHJvcGVydHkoc3RyaW5nICRwcm9wZXJ0eSk6IHN0cmluZwp7CgokcHJvcGVydHkgPSBzdHJfcmVwbGFjZSgiJSIsICclMjUnLCAkcHJvcGVydHkpOwokcHJvcGVydHkgPSBzdHJfcmVwbGFjZSgiXHIiLCAnJTBEJywgJHByb3BlcnR5KTsKJHByb3BlcnR5ID0gc3RyX3JlcGxhY2UoIlxuIiwgJyUwQScsICRwcm9wZXJ0eSk7CiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCI6IiwgJyUzQScsICRwcm9wZXJ0eSk7CiRwcm9wZXJ0eSA9IHN0cl9yZXBsYWNlKCIsIiwgJyUyQycsICRwcm9wZXJ0eSk7CgpyZXR1cm4gJHByb3BlcnR5Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGU7Cgp1c2UgQ2xvc3VyZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwoKCgoKY2xhc3MgSHRtbE91dHB1dEZvcm1hdHRlciBleHRlbmRzIE91dHB1dEZvcm1hdHRlcgp7Cgpwcml2YXRlIHN0YXRpYyAkYXZhaWxhYmxlRm9yZWdyb3VuZENvbG9ycyA9IFsKMzAgPT4gJ2JsYWNrJywKMzEgPT4gJ3JlZCcsCjMyID0+ICdncmVlbicsCjMzID0+ICd5ZWxsb3cnLAozNCA9PiAnYmx1ZScsCjM1ID0+ICdtYWdlbnRhJywKMzYgPT4gJ2N5YW4nLAozNyA9PiAnd2hpdGUnLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGF2YWlsYWJsZUJhY2tncm91bmRDb2xvcnMgPSBbCjQwID0+ICdibGFjaycsCjQxID0+ICdyZWQnLAo0MiA9PiAnZ3JlZW4nLAo0MyA9PiAneWVsbG93JywKNDQgPT4gJ2JsdWUnLAo0NSA9PiAnbWFnZW50YScsCjQ2ID0+ICdjeWFuJywKNDcgPT4gJ3doaXRlJywKXTsKCnByaXZhdGUgc3RhdGljICRhdmFpbGFibGVPcHRpb25zID0gWwoxID0+ICdib2xkJywKNCA9PiAndW5kZXJzY29yZScsCgoKCl07CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHN0eWxlcyA9IFtdKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QodHJ1ZSwgJHN0eWxlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoP3N0cmluZyAkbWVzc2FnZSk6ID9zdHJpbmcKewokZm9ybWF0dGVkID0gcGFyZW50Ojpmb3JtYXQoJG1lc3NhZ2UpOwoKaWYgKCRmb3JtYXR0ZWQgPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KCiRjbGVhckVzY2FwZUNvZGVzID0gJyg/OjM5fDQ5fDB8MjJ8MjR8MjV8Mjd8MjgpJzsKCnJldHVybiBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soIntcMDMzXFsoWzAtOTtdKyltKC4qPylcMDMzXFsoPzoiLiRjbGVhckVzY2FwZUNvZGVzLiI7KSo/Ii4kY2xlYXJFc2NhcGVDb2Rlcy4ibX1zIiwgQ2xvc3VyZTo6ZnJvbUNhbGxhYmxlKFskdGhpcywgJ2Zvcm1hdEh0bWwnXSksICRmb3JtYXR0ZWQpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZvcm1hdEh0bWwoYXJyYXkgJG1hdGNoZXMpOiBzdHJpbmcKewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWzFdKSk7CiRvdXQgPSAnPHNwYW4gc3R5bGU9Iic7CmZvcmVhY2ggKGV4cGxvZGUoJzsnLCAkbWF0Y2hlc1sxXSkgYXMgJGNvZGUpIHsKaWYgKGlzc2V0KHNlbGY6OiRhdmFpbGFibGVGb3JlZ3JvdW5kQ29sb3JzWyhpbnQpICRjb2RlXSkpIHsKJG91dCAuPSAnY29sb3I6Jy5zZWxmOjokYXZhaWxhYmxlRm9yZWdyb3VuZENvbG9yc1soaW50KSAkY29kZV0uJzsnOwp9IGVsc2VpZiAoaXNzZXQoc2VsZjo6JGF2YWlsYWJsZUJhY2tncm91bmRDb2xvcnNbKGludCkgJGNvZGVdKSkgewokb3V0IC49ICdiYWNrZ3JvdW5kLWNvbG9yOicuc2VsZjo6JGF2YWlsYWJsZUJhY2tncm91bmRDb2xvcnNbKGludCkgJGNvZGVdLic7JzsKfSBlbHNlaWYgKGlzc2V0KHNlbGY6OiRhdmFpbGFibGVPcHRpb25zWyhpbnQpICRjb2RlXSkpIHsKc3dpdGNoIChzZWxmOjokYXZhaWxhYmxlT3B0aW9uc1soaW50KSAkY29kZV0pIHsKY2FzZSAnYm9sZCc6CiRvdXQgLj0gJ2ZvbnQtd2VpZ2h0OmJvbGQ7JzsKYnJlYWs7CgpjYXNlICd1bmRlcnNjb3JlJzoKJG91dCAuPSAndGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTsnOwpicmVhazsKfQp9Cn0KCnJldHVybiAkb3V0LiciPicuJG1hdGNoZXNbMl0uJzwvc3Bhbj4nOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cU3VnZ2VzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50IGFzIEJhc2VJbnB1dEFyZ3VtZW50OwoKCgoKCgoKCgoKY2xhc3MgSW5wdXRBcmd1bWVudCBleHRlbmRzIEJhc2VJbnB1dEFyZ3VtZW50CnsKCgoKcHJpdmF0ZSAkc3VnZ2VzdGVkVmFsdWVzOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsLCAkc3VnZ2VzdGVkVmFsdWVzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpOwoKJHRoaXMtPnN1Z2dlc3RlZFZhbHVlcyA9ICRzdWdnZXN0ZWRWYWx1ZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKJHZhbHVlcyA9ICR0aGlzLT5zdWdnZXN0ZWRWYWx1ZXM7CmlmICgkdmFsdWVzIGluc3RhbmNlb2YgXENsb3N1cmUgJiYgIVxpc19hcnJheSgkdmFsdWVzID0gJHZhbHVlcygkaW5wdXQsICRzdWdnZXN0aW9ucykpKSB7IAp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignQ2xvc3VyZSBmb3Igb3B0aW9uICIlcyIgbXVzdCByZXR1cm4gYW4gYXJyYXkuIEdvdCAiJXMiLicsICR0aGlzLT5nZXROYW1lKCksIGdldF9kZWJ1Z190eXBlKCR2YWx1ZXMpKSk7Cn0KaWYgKFtdICE9PSAkdmFsdWVzKSB7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcygkdmFsdWVzKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cU3VnZ2VzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbiBhcyBCYXNlSW5wdXRPcHRpb247CgoKCgoKCgoKCgpjbGFzcyBJbnB1dE9wdGlvbiBleHRlbmRzIEJhc2VJbnB1dE9wdGlvbgp7CgoKCnByaXZhdGUgJHN1Z2dlc3RlZFZhbHVlczsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgJHNob3J0Y3V0ID0gbnVsbCwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsLCAkc3VnZ2VzdGVkVmFsdWVzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSwgJHNob3J0Y3V0LCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+c3VnZ2VzdGVkVmFsdWVzID0gJHN1Z2dlc3RlZFZhbHVlczsKCmlmIChbXSAhPT0gJHN1Z2dlc3RlZFZhbHVlcyAmJiAhJHRoaXMtPmFjY2VwdFZhbHVlKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdDYW5ub3Qgc2V0IHN1Z2dlc3RlZCB2YWx1ZXMgaWYgdGhlIG9wdGlvbiBkb2VzIG5vdCBhY2NlcHQgYSB2YWx1ZS4nKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CiR2YWx1ZXMgPSAkdGhpcy0+c3VnZ2VzdGVkVmFsdWVzOwppZiAoJHZhbHVlcyBpbnN0YW5jZW9mIFxDbG9zdXJlICYmICFcaXNfYXJyYXkoJHZhbHVlcyA9ICR2YWx1ZXMoJGlucHV0LCAkc3VnZ2VzdGlvbnMpKSkgeyAKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nsb3N1cmUgZm9yIGFyZ3VtZW50ICIlcyIgbXVzdCByZXR1cm4gYW4gYXJyYXkuIEdvdCAiJXMiLicsICR0aGlzLT5nZXROYW1lKCksIGdldF9kZWJ1Z190eXBlKCR2YWx1ZXMpKSk7Cn0KaWYgKFtdICE9PSAkdmFsdWVzKSB7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcygkdmFsdWVzKTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCgoKCgoKCmNsYXNzIERlY2lzaW9ucyBpbXBsZW1lbnRzIFxJdGVyYXRvciwgXENvdW50YWJsZQp7CnB1YmxpYyBjb25zdCBERUNJU0lPTl9MSVRFUkFMID0gMDsKcHVibGljIGNvbnN0IERFQ0lTSU9OX1JFQVNPTiA9IDE7CgoKcHJvdGVjdGVkICRwb29sOwoKcHJvdGVjdGVkICRkZWNpc2lvbk1hcDsKCgoKcHJvdGVjdGVkICRkZWNpc2lvblF1ZXVlID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUG9vbCAkcG9vbCkKewokdGhpcy0+cG9vbCA9ICRwb29sOwokdGhpcy0+ZGVjaXNpb25NYXAgPSBbXTsKfQoKcHVibGljIGZ1bmN0aW9uIGRlY2lkZShpbnQgJGxpdGVyYWwsIGludCAkbGV2ZWwsIFJ1bGUgJHdoeSk6IHZvaWQKewokdGhpcy0+YWRkRGVjaXNpb24oJGxpdGVyYWwsICRsZXZlbCk7CiR0aGlzLT5kZWNpc2lvblF1ZXVlW10gPSBbCnNlbGY6OkRFQ0lTSU9OX0xJVEVSQUwgPT4gJGxpdGVyYWwsCnNlbGY6OkRFQ0lTSU9OX1JFQVNPTiA9PiAkd2h5LApdOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2F0aXNmeShpbnQgJGxpdGVyYWwpOiBib29sCnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbCk7CgpyZXR1cm4gKAokbGl0ZXJhbCA+IDAgJiYgaXNzZXQoJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdKSAmJiAkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0gPiAwIHx8CiRsaXRlcmFsIDwgMCAmJiBpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA8IDAKKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNvbmZsaWN0KGludCAkbGl0ZXJhbCk6IGJvb2wKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCnJldHVybiAoCihpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA+IDAgJiYgJGxpdGVyYWwgPCAwKSB8fAooaXNzZXQoJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdKSAmJiAkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0gPCAwICYmICRsaXRlcmFsID4gMCkKKTsKfQoKcHVibGljIGZ1bmN0aW9uIGRlY2lkZWQoaW50ICRsaXRlcmFsT3JQYWNrYWdlSWQpOiBib29sCnsKcmV0dXJuICgkdGhpcy0+ZGVjaXNpb25NYXBbYWJzKCRsaXRlcmFsT3JQYWNrYWdlSWQpXSA/PyAwKSAhPT0gMDsKfQoKcHVibGljIGZ1bmN0aW9uIHVuZGVjaWRlZChpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IGJvb2wKewpyZXR1cm4gKCR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGxpdGVyYWxPclBhY2thZ2VJZCldID8/IDApID09PSAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGVjaWRlZEluc3RhbGwoaW50ICRsaXRlcmFsT3JQYWNrYWdlSWQpOiBib29sCnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbE9yUGFja2FnZUlkKTsKCnJldHVybiBpc3NldCgkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pICYmICR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA+IDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkZWNpc2lvbkxldmVsKGludCAkbGl0ZXJhbE9yUGFja2FnZUlkKTogaW50CnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbE9yUGFja2FnZUlkKTsKaWYgKGlzc2V0KCR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSkpIHsKcmV0dXJuIGFicygkdGhpcy0+ZGVjaXNpb25NYXBbJHBhY2thZ2VJZF0pOwp9CgpyZXR1cm4gMDsKfQoKcHVibGljIGZ1bmN0aW9uIGRlY2lzaW9uUnVsZShpbnQgJGxpdGVyYWxPclBhY2thZ2VJZCk6IFJ1bGUKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsT3JQYWNrYWdlSWQpOwoKZm9yZWFjaCAoJHRoaXMtPmRlY2lzaW9uUXVldWUgYXMgJGRlY2lzaW9uKSB7CmlmICgkcGFja2FnZUlkID09PSBhYnMoJGRlY2lzaW9uW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdKSkgewpyZXR1cm4gJGRlY2lzaW9uW3NlbGY6OkRFQ0lTSU9OX1JFQVNPTl07Cn0KfQoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRGlkIG5vdCBmaW5kIGEgZGVjaXNpb24gcnVsZSB1c2luZyAnLiRsaXRlcmFsT3JQYWNrYWdlSWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXRPZmZzZXQoaW50ICRxdWV1ZU9mZnNldCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5kZWNpc2lvblF1ZXVlWyRxdWV1ZU9mZnNldF07Cn0KCnB1YmxpYyBmdW5jdGlvbiB2YWxpZE9mZnNldChpbnQgJHF1ZXVlT2Zmc2V0KTogYm9vbAp7CnJldHVybiAkcXVldWVPZmZzZXQgPj0gMCAmJiAkcXVldWVPZmZzZXQgPCBcY291bnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gbGFzdFJlYXNvbigpOiBSdWxlCnsKcmV0dXJuICR0aGlzLT5kZWNpc2lvblF1ZXVlW1xjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSkgLSAxXVtzZWxmOjpERUNJU0lPTl9SRUFTT05dOwp9CgpwdWJsaWMgZnVuY3Rpb24gbGFzdExpdGVyYWwoKTogaW50CnsKcmV0dXJuICR0aGlzLT5kZWNpc2lvblF1ZXVlW1xjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSkgLSAxXVtzZWxmOjpERUNJU0lPTl9MSVRFUkFMXTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk6IHZvaWQKewp3aGlsZSAoJGRlY2lzaW9uID0gYXJyYXlfcG9wKCR0aGlzLT5kZWNpc2lvblF1ZXVlKSkgewokdGhpcy0+ZGVjaXNpb25NYXBbYWJzKCRkZWNpc2lvbltzZWxmOjpERUNJU0lPTl9MSVRFUkFMXSldID0gMDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRUb09mZnNldChpbnQgJG9mZnNldCk6IHZvaWQKewp3aGlsZSAoXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSA+ICRvZmZzZXQgKyAxKSB7CiRkZWNpc2lvbiA9IGFycmF5X3BvcCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7CiR0aGlzLT5kZWNpc2lvbk1hcFthYnMoJGRlY2lzaW9uW3NlbGY6OkRFQ0lTSU9OX0xJVEVSQUxdKV0gPSAwOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXZlcnRMYXN0KCk6IHZvaWQKewokdGhpcy0+ZGVjaXNpb25NYXBbYWJzKCR0aGlzLT5sYXN0TGl0ZXJhbCgpKV0gPSAwOwphcnJheV9wb3AoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuIFxjb3VudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXdpbmQoKTogdm9pZAp7CmVuZCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gY3VycmVudCgpCnsKcmV0dXJuIGN1cnJlbnQoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24ga2V5KCk6ID9pbnQKewpyZXR1cm4ga2V5KCR0aGlzLT5kZWNpc2lvblF1ZXVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIG5leHQoKTogdm9pZAp7CnByZXYoJHRoaXMtPmRlY2lzaW9uUXVldWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdmFsaWQoKTogYm9vbAp7CnJldHVybiBmYWxzZSAhPT0gY3VycmVudCgkdGhpcy0+ZGVjaXNpb25RdWV1ZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0VtcHR5KCk6IGJvb2wKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5kZWNpc2lvblF1ZXVlKSA9PT0gMDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZERlY2lzaW9uKGludCAkbGl0ZXJhbCwgaW50ICRsZXZlbCk6IHZvaWQKewokcGFja2FnZUlkID0gYWJzKCRsaXRlcmFsKTsKCiRwcmV2aW91c0RlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID8/IDA7CmlmICgkcHJldmlvdXNEZWNpc2lvbiAhPT0gMCkgewokbGl0ZXJhbFN0cmluZyA9ICR0aGlzLT5wb29sLT5saXRlcmFsVG9QcmV0dHlTdHJpbmcoJGxpdGVyYWwsIFtdKTsKJHBhY2thZ2UgPSAkdGhpcy0+cG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJUcnlpbmcgdG8gZGVjaWRlICRsaXRlcmFsU3RyaW5nIG9uIGxldmVsICRsZXZlbCwgZXZlbiB0aG91Z2ggJHBhY2thZ2Ugd2FzIHByZXZpb3VzbHkgZGVjaWRlZCBhcyAiLiRwcmV2aW91c0RlY2lzaW9uLiIuIgopOwp9CgppZiAoJGxpdGVyYWwgPiAwKSB7CiR0aGlzLT5kZWNpc2lvbk1hcFskcGFja2FnZUlkXSA9ICRsZXZlbDsKfSBlbHNlIHsKJHRoaXMtPmRlY2lzaW9uTWFwWyRwYWNrYWdlSWRdID0gLSRsZXZlbDsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoP1Bvb2wgJHBvb2wgPSBudWxsKTogc3RyaW5nCnsKJGRlY2lzaW9uTWFwID0gJHRoaXMtPmRlY2lzaW9uTWFwOwprc29ydCgkZGVjaXNpb25NYXApOwokc3RyID0gJ1snOwpmb3JlYWNoICgkZGVjaXNpb25NYXAgYXMgJHBhY2thZ2VJZCA9PiAkbGV2ZWwpIHsKJHN0ciAuPSAoJHBvb2wgIT09IG51bGwgPyAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkcGFja2FnZUlkKSA6ICRwYWNrYWdlSWQpLic6Jy4kbGV2ZWwuJywnOwp9CiRzdHIgLj0gJ10nOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dG9TdHJpbmcoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCgoKCgpjbGFzcyBEZWZhdWx0UG9saWN5IGltcGxlbWVudHMgUG9saWN5SW50ZXJmYWNlCnsKCnByaXZhdGUgJHByZWZlclN0YWJsZTsKCnByaXZhdGUgJHByZWZlckxvd2VzdDsKCnByaXZhdGUgJHByZWZlckRldk92ZXJQcmVyZWxlYXNlOwoKcHJpdmF0ZSAkcHJlZmVycmVkVmVyc2lvbnM7Cgpwcml2YXRlICRwcmVmZXJyZWRQYWNrYWdlUmVzdWx0Q2FjaGVQZXJQb29sOwoKcHJpdmF0ZSAkc29ydGluZ0NhY2hlUGVyUG9vbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChib29sICRwcmVmZXJTdGFibGUgPSBmYWxzZSwgYm9vbCAkcHJlZmVyTG93ZXN0ID0gZmFsc2UsID9hcnJheSAkcHJlZmVycmVkVmVyc2lvbnMgPSBudWxsKQp7CiR0aGlzLT5wcmVmZXJTdGFibGUgPSAkcHJlZmVyU3RhYmxlOwokdGhpcy0+cHJlZmVyTG93ZXN0ID0gJHByZWZlckxvd2VzdDsKJHRoaXMtPnByZWZlcnJlZFZlcnNpb25zID0gJHByZWZlcnJlZFZlcnNpb25zOwokdGhpcy0+cHJlZmVyRGV2T3ZlclByZXJlbGVhc2UgPSAoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUFJFRkVSX0RFVl9PVkVSX1BSRVJFTEVBU0UnKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmVyc2lvbkNvbXBhcmUoUGFja2FnZUludGVyZmFjZSAkYSwgUGFja2FnZUludGVyZmFjZSAkYiwgc3RyaW5nICRvcGVyYXRvcik6IGJvb2wKewppZiAoJHRoaXMtPnByZWZlclN0YWJsZSAmJiAoJHN0YWJBID0gJGEtPmdldFN0YWJpbGl0eSgpKSAhPT0gKCRzdGFiQiA9ICRiLT5nZXRTdGFiaWxpdHkoKSkpIHsKaWYgKCR0aGlzLT5wcmVmZXJMb3dlc3QgJiYgJHRoaXMtPnByZWZlckRldk92ZXJQcmVyZWxlYXNlICYmICdzdGFibGUnICE9PSAkc3RhYkEgJiYgJ3N0YWJsZScgIT09ICRzdGFiQikgewoKCgokc3RhYkEgPSAnZGV2JyA9PT0gJHN0YWJBID8gJ3N0YWJsZScgOiAkc3RhYkE7CiRzdGFiQiA9ICdkZXYnID09PSAkc3RhYkIgPyAnc3RhYmxlJyA6ICRzdGFiQjsKfQoKcmV0dXJuIEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skc3RhYkFdIDwgQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRzdGFiQl07Cn0KCgppZiAoKCRhLT5pc0RldigpICYmIHN0cl9zdGFydHNfd2l0aCgkYS0+Z2V0VmVyc2lvbigpLCAnZGV2LScpKSB8fCAoJGItPmlzRGV2KCkgJiYgc3RyX3N0YXJ0c193aXRoKCRiLT5nZXRWZXJzaW9uKCksICdkZXYtJykpKSB7CiRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJG9wZXJhdG9yLCAkYi0+Z2V0VmVyc2lvbigpKTsKJHZlcnNpb24gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkYS0+Z2V0VmVyc2lvbigpKTsKCnJldHVybiAkY29uc3RyYWludC0+bWF0Y2hTcGVjaWZpYygkdmVyc2lvbiwgdHJ1ZSk7Cn0KCnJldHVybiBDb21waWxpbmdNYXRjaGVyOjptYXRjaChuZXcgQ29uc3RyYWludCgkb3BlcmF0b3IsICRiLT5nZXRWZXJzaW9uKCkpLCBDb25zdHJhaW50OjpPUF9FUSwgJGEtPmdldFZlcnNpb24oKSk7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0UHJlZmVycmVkUGFja2FnZXMoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzLCA/c3RyaW5nICRyZXF1aXJlZFBhY2thZ2UgPSBudWxsKTogYXJyYXkKewpzb3J0KCRsaXRlcmFscyk7CiRyZXN1bHRDYWNoZUtleSA9IGltcGxvZGUoJywnLCAkbGl0ZXJhbHMpLiRyZXF1aXJlZFBhY2thZ2U7CiRwb29sSWQgPSBzcGxfb2JqZWN0X2lkKCRwb29sKTsKCmlmIChpc3NldCgkdGhpcy0+cHJlZmVycmVkUGFja2FnZVJlc3VsdENhY2hlUGVyUG9vbFskcG9vbElkXVskcmVzdWx0Q2FjaGVLZXldKSkgewpyZXR1cm4gJHRoaXMtPnByZWZlcnJlZFBhY2thZ2VSZXN1bHRDYWNoZVBlclBvb2xbJHBvb2xJZF1bJHJlc3VsdENhY2hlS2V5XTsKfQoKJHBhY2thZ2VzID0gJHRoaXMtPmdyb3VwTGl0ZXJhbHNCeU5hbWUoJHBvb2wsICRsaXRlcmFscyk7Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJiRuYW1lTGl0ZXJhbHMpIHsKdXNvcnQoJG5hbWVMaXRlcmFscywgZnVuY3Rpb24gKCRhLCAkYikgdXNlICgkcG9vbCwgJHJlcXVpcmVkUGFja2FnZSwgJHBvb2xJZCk6IGludCB7CiRjYWNoZUtleSA9ICdpJy4kYS4nLicuJGIuJHJlcXVpcmVkUGFja2FnZTsgCgppZiAoaXNzZXQoJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XSkpIHsKcmV0dXJuICR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV07Cn0KCnJldHVybiAkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldID0gJHRoaXMtPmNvbXBhcmVCeVByaW9yaXR5KCRwb29sLCAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkYSksICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRiKSwgJHJlcXVpcmVkUGFja2FnZSwgdHJ1ZSk7Cn0pOwp9Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJiRzb3J0ZWRMaXRlcmFscykgewokc29ydGVkTGl0ZXJhbHMgPSAkdGhpcy0+cHJ1bmVUb0Jlc3RWZXJzaW9uKCRwb29sLCAkc29ydGVkTGl0ZXJhbHMpOwokc29ydGVkTGl0ZXJhbHMgPSAkdGhpcy0+cHJ1bmVSZW1vdGVBbGlhc2VzKCRwb29sLCAkc29ydGVkTGl0ZXJhbHMpOwp9Cgokc2VsZWN0ZWQgPSBhcnJheV9tZXJnZSguLi5hcnJheV92YWx1ZXMoJHBhY2thZ2VzKSk7CgoKdXNvcnQoJHNlbGVjdGVkLCBmdW5jdGlvbiAoJGEsICRiKSB1c2UgKCRwb29sLCAkcmVxdWlyZWRQYWNrYWdlLCAkcG9vbElkKTogaW50IHsKJGNhY2hlS2V5ID0gJGEuJy4nLiRiLiRyZXF1aXJlZFBhY2thZ2U7IAoKaWYgKGlzc2V0KCR0aGlzLT5zb3J0aW5nQ2FjaGVQZXJQb29sWyRwb29sSWRdWyRjYWNoZUtleV0pKSB7CnJldHVybiAkdGhpcy0+c29ydGluZ0NhY2hlUGVyUG9vbFskcG9vbElkXVskY2FjaGVLZXldOwp9CgpyZXR1cm4gJHRoaXMtPnNvcnRpbmdDYWNoZVBlclBvb2xbJHBvb2xJZF1bJGNhY2hlS2V5XSA9ICR0aGlzLT5jb21wYXJlQnlQcmlvcml0eSgkcG9vbCwgJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGEpLCAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkYiksICRyZXF1aXJlZFBhY2thZ2UpOwp9KTsKCnJldHVybiAkdGhpcy0+cHJlZmVycmVkUGFja2FnZVJlc3VsdENhY2hlUGVyUG9vbFskcG9vbElkXVskcmVzdWx0Q2FjaGVLZXldID0gJHNlbGVjdGVkOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdyb3VwTGl0ZXJhbHNCeU5hbWUoUG9vbCAkcG9vbCwgYXJyYXkgJGxpdGVyYWxzKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRwYWNrYWdlTmFtZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKS0+Z2V0TmFtZSgpOwoKaWYgKCFpc3NldCgkcGFja2FnZXNbJHBhY2thZ2VOYW1lXSkpIHsKJHBhY2thZ2VzWyRwYWNrYWdlTmFtZV0gPSBbXTsKfQokcGFja2FnZXNbJHBhY2thZ2VOYW1lXVtdID0gJGxpdGVyYWw7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb21wYXJlQnlQcmlvcml0eShQb29sICRwb29sLCBCYXNlUGFja2FnZSAkYSwgQmFzZVBhY2thZ2UgJGIsID9zdHJpbmcgJHJlcXVpcmVkUGFja2FnZSA9IG51bGwsIGJvb2wgJGlnbm9yZVJlcGxhY2UgPSBmYWxzZSk6IGludAp7CgppZiAoJGEtPmdldE5hbWUoKSA9PT0gJGItPmdldE5hbWUoKSkgewokYUFsaWFzZWQgPSAkYSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZTsKJGJBbGlhc2VkID0gJGIgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2U7CmlmICgkYUFsaWFzZWQgJiYgISRiQWxpYXNlZCkgewpyZXR1cm4gLTE7IAp9CmlmICghJGFBbGlhc2VkICYmICRiQWxpYXNlZCkgewpyZXR1cm4gMTsgCn0KfQoKaWYgKCEkaWdub3JlUmVwbGFjZSkgewoKaWYgKCR0aGlzLT5yZXBsYWNlcygkYSwgJGIpKSB7CnJldHVybiAxOyAKfQppZiAoJHRoaXMtPnJlcGxhY2VzKCRiLCAkYSkpIHsKcmV0dXJuIC0xOyAKfQoKCgppZiAoJHJlcXVpcmVkUGFja2FnZSAhPT0gbnVsbCAmJiBmYWxzZSAhPT0gKCRwb3MgPSBzdHJwb3MoJHJlcXVpcmVkUGFja2FnZSwgJy8nKSkpIHsKJHJlcXVpcmVkVmVuZG9yID0gc3Vic3RyKCRyZXF1aXJlZFBhY2thZ2UsIDAsICRwb3MpOwoKJGFJc1NhbWVWZW5kb3IgPSBzdHJwb3MoJGEtPmdldE5hbWUoKSwgJHJlcXVpcmVkVmVuZG9yKSA9PT0gMDsKJGJJc1NhbWVWZW5kb3IgPSBzdHJwb3MoJGItPmdldE5hbWUoKSwgJHJlcXVpcmVkVmVuZG9yKSA9PT0gMDsKCmlmICgkYklzU2FtZVZlbmRvciAhPT0gJGFJc1NhbWVWZW5kb3IpIHsKcmV0dXJuICRhSXNTYW1lVmVuZG9yID8gLTEgOiAxOwp9Cn0KfQoKCmlmICgkYS0+aWQgPT09ICRiLT5pZCkgewpyZXR1cm4gMDsKfQoKcmV0dXJuICgkYS0+aWQgPCAkYi0+aWQpID8gLTEgOiAxOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVwbGFjZXMoQmFzZVBhY2thZ2UgJHNvdXJjZSwgQmFzZVBhY2thZ2UgJHRhcmdldCk6IGJvb2wKewpmb3JlYWNoICgkc291cmNlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICR0YXJnZXQtPmdldE5hbWUoKQoKCikgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJ1bmVUb0Jlc3RWZXJzaW9uKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscyk6IGFycmF5CnsKaWYgKCR0aGlzLT5wcmVmZXJyZWRWZXJzaW9ucyAhPT0gbnVsbCkgewokbmFtZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSktPmdldE5hbWUoKTsKaWYgKGlzc2V0KCR0aGlzLT5wcmVmZXJyZWRWZXJzaW9uc1skbmFtZV0pKSB7CiRwcmVmZXJyZWRWZXJzaW9uID0gJHRoaXMtPnByZWZlcnJlZFZlcnNpb25zWyRuYW1lXTsKJGJlc3RMaXRlcmFscyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKaWYgKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKS0+Z2V0VmVyc2lvbigpID09PSAkcHJlZmVycmVkVmVyc2lvbikgewokYmVzdExpdGVyYWxzW10gPSAkbGl0ZXJhbDsKfQp9CmlmIChcY291bnQoJGJlc3RMaXRlcmFscykgPiAwKSB7CnJldHVybiAkYmVzdExpdGVyYWxzOwp9Cn0KfQoKJG9wZXJhdG9yID0gJHRoaXMtPnByZWZlckxvd2VzdCA/ICc8JyA6ICc+JzsKJGJlc3RMaXRlcmFscyA9IFskbGl0ZXJhbHNbMF1dOwokYmVzdFBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGkgPT4gJGxpdGVyYWwpIHsKaWYgKDAgPT09ICRpKSB7CmNvbnRpbnVlOwp9CgokcGFja2FnZSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKCmlmICgkdGhpcy0+dmVyc2lvbkNvbXBhcmUoJHBhY2thZ2UsICRiZXN0UGFja2FnZSwgJG9wZXJhdG9yKSkgewokYmVzdFBhY2thZ2UgPSAkcGFja2FnZTsKJGJlc3RMaXRlcmFscyA9IFskbGl0ZXJhbF07Cn0gZWxzZWlmICgkdGhpcy0+dmVyc2lvbkNvbXBhcmUoJHBhY2thZ2UsICRiZXN0UGFja2FnZSwgJz09JykpIHsKJGJlc3RMaXRlcmFsc1tdID0gJGxpdGVyYWw7Cn0KfQoKcmV0dXJuICRiZXN0TGl0ZXJhbHM7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBydW5lUmVtb3RlQWxpYXNlcyhQb29sICRwb29sLCBhcnJheSAkbGl0ZXJhbHMpOiBhcnJheQp7CiRoYXNMb2NhbEFsaWFzID0gZmFsc2U7Cgpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmlzUm9vdFBhY2thZ2VBbGlhcygpKSB7CiRoYXNMb2NhbEFsaWFzID0gdHJ1ZTsKYnJlYWs7Cn0KfQoKaWYgKCEkaGFzTG9jYWxBbGlhcykgewpyZXR1cm4gJGxpdGVyYWxzOwp9Cgokc2VsZWN0ZWQgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRwYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwYWNrYWdlLT5pc1Jvb3RQYWNrYWdlQWxpYXMoKSkgewokc2VsZWN0ZWRbXSA9ICRsaXRlcmFsOwp9Cn0KCnJldHVybiAkc2VsZWN0ZWQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKY2xhc3MgR2VuZXJpY1J1bGUgZXh0ZW5kcyBSdWxlCnsKCnByb3RlY3RlZCAkbGl0ZXJhbHM7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRyZWFzb24sICRyZWFzb25EYXRhKTsKCgpzb3J0KCRsaXRlcmFscyk7CgokdGhpcy0+bGl0ZXJhbHMgPSAkbGl0ZXJhbHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaXRlcmFscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bGl0ZXJhbHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoKCkKewokZGF0YSA9IHVucGFjaygnaWhhc2gnLCAoc3RyaW5nKSBoYXNoKFxQSFBfVkVSU0lPTl9JRCA+IDgwMTAwID8gJ3h4aDMnIDogJ3NoYTEnLCBpbXBsb2RlKCcsJywgJHRoaXMtPmxpdGVyYWxzKSwgdHJ1ZSkpOwppZiAoZmFsc2UgPT09ICRkYXRhKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHVucGFja2luZzogJy5pbXBsb2RlKCcsICcsICR0aGlzLT5saXRlcmFscykpOwp9CgpyZXR1cm4gJGRhdGFbJ2hhc2gnXTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFJ1bGUgJHJ1bGUpOiBib29sCnsKcmV0dXJuICR0aGlzLT5saXRlcmFscyA9PT0gJHJ1bGUtPmdldExpdGVyYWxzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Fzc2VydGlvbigpOiBib29sCnsKcmV0dXJuIDEgPT09IFxjb3VudCgkdGhpcy0+bGl0ZXJhbHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewokcmVzdWx0ID0gJHRoaXMtPmlzRGlzYWJsZWQoKSA/ICdkaXNhYmxlZCgnIDogJygnOwoKZm9yZWFjaCAoJHRoaXMtPmxpdGVyYWxzIGFzICRpID0+ICRsaXRlcmFsKSB7CmlmICgkaSAhPT0gMCkgewokcmVzdWx0IC49ICd8JzsKfQokcmVzdWx0IC49ICRsaXRlcmFsOwp9CgokcmVzdWx0IC49ICcpJzsKCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CgoKCgoKY2xhc3MgTG9jYWxSZXBvVHJhbnNhY3Rpb24gZXh0ZW5kcyBUcmFuc2FjdGlvbgp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NrZWRSZXBvc2l0b3J5LCBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG9zaXRvcnkpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgKJGxvY2FsUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSwKJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCmNsYXNzIExvY2tUcmFuc2FjdGlvbiBleHRlbmRzIFRyYW5zYWN0aW9uCnsKCgoKCgoKCnByb3RlY3RlZCAkcHJlc2VudE1hcDsKCgoKCgoKCgpwcm90ZWN0ZWQgJHVubG9ja2FibGVNYXA7CgoKCgpwcm90ZWN0ZWQgJHJlc3VsdFBhY2thZ2VzOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb29sICRwb29sLCBhcnJheSAkcHJlc2VudE1hcCwgYXJyYXkgJHVubG9ja2FibGVNYXAsIERlY2lzaW9ucyAkZGVjaXNpb25zKQp7CiR0aGlzLT5wcmVzZW50TWFwID0gJHByZXNlbnRNYXA7CiR0aGlzLT51bmxvY2thYmxlTWFwID0gJHVubG9ja2FibGVNYXA7CgokdGhpcy0+c2V0UmVzdWx0UGFja2FnZXMoJHBvb2wsICRkZWNpc2lvbnMpOwpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0aGlzLT5wcmVzZW50TWFwLCAkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2FsbCddKTsKfQoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVzdWx0UGFja2FnZXMoUG9vbCAkcG9vbCwgRGVjaXNpb25zICRkZWNpc2lvbnMpOiB2b2lkCnsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzID0gWydhbGwnID0+IFtdLCAnbm9uLWRldicgPT4gW10sICdkZXYnID0+IFtdXTsKZm9yZWFjaCAoJGRlY2lzaW9ucyBhcyAkaSA9PiAkZGVjaXNpb24pIHsKJGxpdGVyYWwgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9MSVRFUkFMXTsKCmlmICgkbGl0ZXJhbCA+IDApIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CgokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2FsbCddW10gPSAkcGFja2FnZTsKaWYgKCFpc3NldCgkdGhpcy0+dW5sb2NrYWJsZU1hcFskcGFja2FnZS0+aWRdKSkgewokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ25vbi1kZXYnXVtdID0gJHBhY2thZ2U7Cn0KfQp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXROb25EZXZQYWNrYWdlcyhMb2NrVHJhbnNhY3Rpb24gJGV4dHJhY3Rpb25SZXN1bHQpOiB2b2lkCnsKJHBhY2thZ2VzID0gJGV4dHJhY3Rpb25SZXN1bHQtPmdldE5ld0xvY2tQYWNrYWdlcyhmYWxzZSk7CgokdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2RldiddID0gJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydub24tZGV2J107CiR0aGlzLT5yZXN1bHRQYWNrYWdlc1snbm9uLWRldiddID0gW107Cgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKZm9yZWFjaCAoJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydkZXYnXSBhcyAkaSA9PiAkcmVzdWx0UGFja2FnZSkgewoKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICRyZXN1bHRQYWNrYWdlLT5nZXROYW1lKCkpIHsKJHRoaXMtPnJlc3VsdFBhY2thZ2VzWydub24tZGV2J11bXSA9ICRyZXN1bHRQYWNrYWdlOwp1bnNldCgkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2RldiddWyRpXSk7Cn0KfQp9Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmV3TG9ja1BhY2thZ2VzKGJvb2wgJGRldk1vZGUsIGJvb2wgJHVwZGF0ZU1pcnJvcnMgPSBmYWxzZSk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlc1skZGV2TW9kZSA/ICdkZXYnIDogJ25vbi1kZXYnXSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCgppZiAoJHVwZGF0ZU1pcnJvcnMgPT09IHRydWUgJiYgIWFycmF5X2tleV9leGlzdHMoc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKSwgJHRoaXMtPnByZXNlbnRNYXApKSB7CiRwYWNrYWdlID0gJHRoaXMtPnVwZGF0ZU1pcnJvckFuZFVybHMoJHBhY2thZ2UpOwp9CgokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdXBkYXRlTWlycm9yQW5kVXJscyhCYXNlUGFja2FnZSAkcGFja2FnZSk6IEJhc2VQYWNrYWdlCnsKZm9yZWFjaCAoJHRoaXMtPnByZXNlbnRNYXAgYXMgJHByZXNlbnRQYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpICE9PSAkcHJlc2VudFBhY2thZ2UtPmdldE5hbWUoKSkgewpjb250aW51ZTsKfQoKaWYgKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgIT09ICRwcmVzZW50UGFja2FnZS0+Z2V0VmVyc2lvbigpKSB7CmNvbnRpbnVlOwp9CgppZiAoJHByZXNlbnRQYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKaWYgKCRwcmVzZW50UGFja2FnZS0+Z2V0U291cmNlVHlwZSgpICE9PSAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpKSB7CmNvbnRpbnVlOwp9CgppZiAoJHByZXNlbnRQYWNrYWdlIGluc3RhbmNlb2YgUGFja2FnZSkgewokcHJlc2VudFBhY2thZ2UtPnNldFNvdXJjZVVybCgkcGFja2FnZS0+Z2V0U291cmNlVXJsKCkpOwokcHJlc2VudFBhY2thZ2UtPnNldFNvdXJjZU1pcnJvcnMoJHBhY2thZ2UtPmdldFNvdXJjZU1pcnJvcnMoKSk7Cn0KCgppZiAoJHByZXNlbnRQYWNrYWdlLT5nZXREaXN0VHlwZSgpICE9PSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSkgewpyZXR1cm4gJHByZXNlbnRQYWNrYWdlOwp9CgoKaWYgKAokcGFja2FnZS0+Z2V0RGlzdFVybCgpICE9PSBudWxsCiYmICRwcmVzZW50UGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpICE9PSBudWxsCiYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vKD86KD86d3d3XC4pP2JpdGJ1Y2tldFwub3JnfChhcGlcLik/Z2l0aHViXC5jb218KD86d3d3XC4pP2dpdGxhYlwuY29tKS99aScsICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpCikgewokcHJlc2VudFBhY2thZ2UtPnNldERpc3RVcmwoUHJlZzo6cmVwbGFjZSgneyg/PD0vfHNoYT0pW2EtZjAtOV17NDB9KD89L3wkKX1pJywgJHByZXNlbnRQYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCksICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpKTsKfQokcHJlc2VudFBhY2thZ2UtPnNldERpc3RNaXJyb3JzKCRwYWNrYWdlLT5nZXREaXN0TWlycm9ycygpKTsKCnJldHVybiAkcHJlc2VudFBhY2thZ2U7Cn0KCnJldHVybiAkcGFja2FnZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcyhhcnJheSAkYWxpYXNlcyk6IGFycmF5CnsKJHVzZWRBbGlhc2VzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZXNbJ2FsbCddIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpmb3JlYWNoICgkYWxpYXNlcyBhcyAkaW5kZXggPT4gJGFsaWFzKSB7CmlmICgkYWxpYXNbJ3BhY2thZ2UnXSA9PT0gJHBhY2thZ2UtPmdldE5hbWUoKSkgewokdXNlZEFsaWFzZXNbXSA9ICRhbGlhczsKdW5zZXQoJGFsaWFzZXNbJGluZGV4XSk7Cn0KfQp9Cn0KCnVzb3J0KCR1c2VkQWxpYXNlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpOiBpbnQgewpyZXR1cm4gc3RyY21wKCRhWydwYWNrYWdlJ10sICRiWydwYWNrYWdlJ10pOwp9KTsKCnJldHVybiAkdXNlZEFsaWFzZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCgpjbGFzcyBNdWx0aUNvbmZsaWN0UnVsZSBleHRlbmRzIFJ1bGUKewoKcHJvdGVjdGVkICRsaXRlcmFsczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkbGl0ZXJhbHMsICRyZWFzb24sICRyZWFzb25EYXRhKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwoKaWYgKFxjb3VudCgkbGl0ZXJhbHMpIDwgMykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIm11bHRpIGNvbmZsaWN0IHJ1bGUgcmVxdWlyZXMgYXQgbGVhc3QgMyBsaXRlcmFscyIpOwp9CgoKc29ydCgkbGl0ZXJhbHMpOwoKJHRoaXMtPmxpdGVyYWxzID0gJGxpdGVyYWxzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGl0ZXJhbHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmxpdGVyYWxzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGFzaCgpCnsKJGRhdGEgPSB1bnBhY2soJ2loYXNoJywgKHN0cmluZykgaGFzaChcUEhQX1ZFUlNJT05fSUQgPiA4MDEwMCA/ICd4eGgzJyA6ICdzaGExJywgJ2M6Jy5pbXBsb2RlKCcsJywgJHRoaXMtPmxpdGVyYWxzKSwgdHJ1ZSkpOwppZiAoZmFsc2UgPT09ICRkYXRhKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHVucGFja2luZzogJy5pbXBsb2RlKCcsICcsICR0aGlzLT5saXRlcmFscykpOwp9CgpyZXR1cm4gJGRhdGFbJ2hhc2gnXTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzKFJ1bGUgJHJ1bGUpOiBib29sCnsKaWYgKCRydWxlIGluc3RhbmNlb2YgTXVsdGlDb25mbGljdFJ1bGUpIHsKcmV0dXJuICR0aGlzLT5saXRlcmFscyA9PT0gJHJ1bGUtPmdldExpdGVyYWxzKCk7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzQXNzZXJ0aW9uKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZSgpOiB2b2lkCnsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJEaXNhYmxpbmcgbXVsdGkgY29uZmxpY3QgcnVsZXMgaXMgbm90IHBvc3NpYmxlLiBQbGVhc2UgY29udGFjdCBjb21wb3NlciBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIgdG8gbGV0IHVzIGRlYnVnIHdoYXQgbGVhZCB0byB0aGlzIHNpdHVhdGlvbi4iKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKCiRyZXN1bHQgPSAkdGhpcy0+aXNEaXNhYmxlZCgpID8gJ2Rpc2FibGVkKG11bHRpKCcgOiAnKG11bHRpKCc7Cgpmb3JlYWNoICgkdGhpcy0+bGl0ZXJhbHMgYXMgJGkgPT4gJGxpdGVyYWwpIHsKaWYgKCRpICE9PSAwKSB7CiRyZXN1bHQgLj0gJ3wnOwp9CiRyZXN1bHQgLj0gJGxpdGVyYWw7Cn0KCiRyZXN1bHQgLj0gJykpJzsKCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBJbnN0YWxsT3BlcmF0aW9uIGV4dGVuZHMgU29sdmVyT3BlcmF0aW9uIGltcGxlbWVudHMgT3BlcmF0aW9uSW50ZXJmYWNlCnsKcHJvdGVjdGVkIGNvbnN0IFRZUEUgPSAnaW5zdGFsbCc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpmb3JtYXQoJHRoaXMtPnBhY2thZ2UsICRsb2NrKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkbG9jayA9IGZhbHNlKTogc3RyaW5nCnsKcmV0dXJuICgkbG9jayA/ICdMb2NraW5nICcgOiAnSW5zdGFsbGluZyAnKS4nPGluZm8+Jy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiRwYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpLic8L2NvbW1lbnQ+KSc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKCgoKCgoKY2xhc3MgTWFya0FsaWFzSW5zdGFsbGVkT3BlcmF0aW9uIGV4dGVuZHMgU29sdmVyT3BlcmF0aW9uIGltcGxlbWVudHMgT3BlcmF0aW9uSW50ZXJmYWNlCnsKcHJvdGVjdGVkIGNvbnN0IFRZUEUgPSAnbWFya0FsaWFzSW5zdGFsbGVkJzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChBbGlhc1BhY2thZ2UgJHBhY2thZ2UpCnsKJHRoaXMtPnBhY2thZ2UgPSAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2UoKTogQWxpYXNQYWNrYWdlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiAnTWFya2luZyA8aW5mbz4nLiR0aGlzLT5wYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHRoaXMtPnBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pIGFzIGluc3RhbGxlZCwgYWxpYXMgb2YgPGluZm8+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRQcmV0dHlOYW1lKCkuJzwvaW5mbz4gKDxjb21tZW50PicuJHRoaXMtPnBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PiknOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CgoKCgoKCmNsYXNzIE1hcmtBbGlhc1VuaW5zdGFsbGVkT3BlcmF0aW9uIGV4dGVuZHMgU29sdmVyT3BlcmF0aW9uIGltcGxlbWVudHMgT3BlcmF0aW9uSW50ZXJmYWNlCnsKcHJvdGVjdGVkIGNvbnN0IFRZUEUgPSAnbWFya0FsaWFzVW5pbnN0YWxsZWQnOwoKCgoKcHJvdGVjdGVkICRwYWNrYWdlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEFsaWFzUGFja2FnZSAkcGFja2FnZSkKewokdGhpcy0+cGFja2FnZSA9ICRwYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZSgpOiBBbGlhc1BhY2thZ2UKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KCRsb2NrKTogc3RyaW5nCnsKcmV0dXJuICdNYXJraW5nIDxpbmZvPicuJHRoaXMtPnBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kdGhpcy0+cGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PikgYXMgdW5pbnN0YWxsZWQsIGFsaWFzIG9mIDxpbmZvPicuJHRoaXMtPnBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiR0aGlzLT5wYWNrYWdlLT5nZXRBbGlhc09mKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkuJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKCgoKCgppbnRlcmZhY2UgT3BlcmF0aW9uSW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0aW9uVHlwZSgpOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNob3coYm9vbCAkbG9jayk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247CgoKCgoKCmFic3RyYWN0IGNsYXNzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CgoKCnByb3RlY3RlZCBjb25zdCBUWVBFID0gJyc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0aW9uVHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gc3RhdGljOjpUWVBFOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuICR0aGlzLT5zaG93KGZhbHNlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgVW5pbnN0YWxsT3BlcmF0aW9uIGV4dGVuZHMgU29sdmVyT3BlcmF0aW9uIGltcGxlbWVudHMgT3BlcmF0aW9uSW50ZXJmYWNlCnsKcHJvdGVjdGVkIGNvbnN0IFRZUEUgPSAndW5pbnN0YWxsJzsKCgoKCnByb3RlY3RlZCAkcGFja2FnZTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6IFBhY2thZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93KCRsb2NrKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmZvcm1hdCgkdGhpcy0+cGFja2FnZSwgJGxvY2spOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBib29sICRsb2NrID0gZmFsc2UpOiBzdHJpbmcKewpyZXR1cm4gJ1JlbW92aW5nIDxpbmZvPicuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nPC9pbmZvPiAoPGNvbW1lbnQ+Jy4kcGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKS4nPC9jb21tZW50PiknOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb247Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CgoKCgoKCmNsYXNzIFVwZGF0ZU9wZXJhdGlvbiBleHRlbmRzIFNvbHZlck9wZXJhdGlvbiBpbXBsZW1lbnRzIE9wZXJhdGlvbkludGVyZmFjZQp7CnByb3RlY3RlZCBjb25zdCBUWVBFID0gJ3VwZGF0ZSc7CgoKCgpwcm90ZWN0ZWQgJGluaXRpYWxQYWNrYWdlOwoKCgoKcHJvdGVjdGVkICR0YXJnZXRQYWNrYWdlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQpCnsKJHRoaXMtPmluaXRpYWxQYWNrYWdlID0gJGluaXRpYWw7CiR0aGlzLT50YXJnZXRQYWNrYWdlID0gJHRhcmdldDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluaXRpYWxQYWNrYWdlKCk6IFBhY2thZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmluaXRpYWxQYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0UGFja2FnZSgpOiBQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50YXJnZXRQYWNrYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2hvdygkbG9jayk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpmb3JtYXQoJHRoaXMtPmluaXRpYWxQYWNrYWdlLCAkdGhpcy0+dGFyZ2V0UGFja2FnZSwgJGxvY2spOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdChQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsUGFja2FnZSwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0UGFja2FnZSwgYm9vbCAkbG9jayA9IGZhbHNlKTogc3RyaW5nCnsKJGZyb21WZXJzaW9uID0gJGluaXRpYWxQYWNrYWdlLT5nZXRGdWxsUHJldHR5VmVyc2lvbigpOwokdG9WZXJzaW9uID0gJHRhcmdldFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7CgppZiAoJGZyb21WZXJzaW9uID09PSAkdG9WZXJzaW9uICYmICRpbml0aWFsUGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgIT09ICR0YXJnZXRQYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSkgewokZnJvbVZlcnNpb24gPSAkaW5pdGlhbFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKHRydWUsIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRik7CiR0b1ZlcnNpb24gPSAkdGFyZ2V0UGFja2FnZS0+Z2V0RnVsbFByZXR0eVZlcnNpb24odHJ1ZSwgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9TT1VSQ0VfUkVGKTsKfSBlbHNlaWYgKCRmcm9tVmVyc2lvbiA9PT0gJHRvVmVyc2lvbiAmJiAkaW5pdGlhbFBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSAhPT0gJHRhcmdldFBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSkgewokZnJvbVZlcnNpb24gPSAkaW5pdGlhbFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKHRydWUsIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfRElTVF9SRUYpOwokdG9WZXJzaW9uID0gJHRhcmdldFBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKHRydWUsIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfRElTVF9SRUYpOwp9CgokYWN0aW9uTmFtZSA9IFZlcnNpb25QYXJzZXI6OmlzVXBncmFkZSgkaW5pdGlhbFBhY2thZ2UtPmdldFZlcnNpb24oKSwgJHRhcmdldFBhY2thZ2UtPmdldFZlcnNpb24oKSkgPyAnVXBncmFkaW5nJyA6ICdEb3duZ3JhZGluZyc7CgpyZXR1cm4gJGFjdGlvbk5hbWUuJyA8aW5mbz4nLiRpbml0aWFsUGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLic8L2luZm8+ICg8Y29tbWVudD4nLiRmcm9tVmVyc2lvbi4nPC9jb21tZW50PiA9PiA8Y29tbWVudD4nLiR0b1ZlcnNpb24uJzwvY29tbWVudD4pJzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCmludGVyZmFjZSBQb2xpY3lJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gdmVyc2lvbkNvbXBhcmUoUGFja2FnZUludGVyZmFjZSAkYSwgUGFja2FnZUludGVyZmFjZSAkYiwgc3RyaW5nICRvcGVyYXRvcik6IGJvb2w7CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlbGVjdFByZWZlcnJlZFBhY2thZ2VzKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFscywgP3N0cmluZyAkcmVxdWlyZWRQYWNrYWdlID0gbnVsbCk6IGFycmF5Owp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbXBpbGluZ01hdGNoZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKCgoKCgoKCmNsYXNzIFBvb2wgaW1wbGVtZW50cyBcQ291bnRhYmxlCnsKCnByb3RlY3RlZCAkcGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkcGFja2FnZUJ5TmFtZSA9IFtdOwoKcHJvdGVjdGVkICR2ZXJzaW9uUGFyc2VyOwoKcHJvdGVjdGVkICRwcm92aWRlckNhY2hlID0gW107Cgpwcm90ZWN0ZWQgJHVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlczsKCnByb3RlY3RlZCAkcmVtb3ZlZFZlcnNpb25zID0gW107Cgpwcm90ZWN0ZWQgJHJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSA9IFtdOwoKcHJpdmF0ZSAkc2VjdXJpdHlSZW1vdmVkVmVyc2lvbnMgPSBbXTsKCnByaXZhdGUgJGFiYW5kb25lZFJlbW92ZWRWZXJzaW9ucyA9IFtdOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhY2thZ2VzID0gW10sIGFycmF5ICR1bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMgPSBbXSwgYXJyYXkgJHJlbW92ZWRWZXJzaW9ucyA9IFtdLCBhcnJheSAkcmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gW10sIGFycmF5ICRzZWN1cml0eVJlbW92ZWRWZXJzaW9ucyA9IFtdLCBhcnJheSAkYWJhbmRvbmVkUmVtb3ZlZFZlcnNpb25zID0gW10pCnsKJHRoaXMtPnZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJHRoaXMtPnNldFBhY2thZ2VzKCRwYWNrYWdlcyk7CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMgPSAkdW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzOwokdGhpcy0+cmVtb3ZlZFZlcnNpb25zID0gJHJlbW92ZWRWZXJzaW9uczsKJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSA9ICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2U7CiR0aGlzLT5zZWN1cml0eVJlbW92ZWRWZXJzaW9ucyA9ICRzZWN1cml0eVJlbW92ZWRWZXJzaW9uczsKJHRoaXMtPmFiYW5kb25lZFJlbW92ZWRWZXJzaW9ucyA9ICRhYmFuZG9uZWRSZW1vdmVkVmVyc2lvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZW1vdmVkVmVyc2lvbnMoc3RyaW5nICRuYW1lLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KTogYXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5yZW1vdmVkVmVyc2lvbnNbJG5hbWVdKSkgewpyZXR1cm4gW107Cn0KCiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlbW92ZWRWZXJzaW9uc1skbmFtZV0gYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKaWYgKCRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICR2ZXJzaW9uKSkpIHsKJHJlc3VsdFskdmVyc2lvbl0gPSAkcHJldHR5VmVyc2lvbjsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsbFJlbW92ZWRWZXJzaW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVtb3ZlZFZlcnNpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlKHN0cmluZyAkb2JqZWN0SGFzaCk6IGFycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlWyRvYmplY3RIYXNoXSkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZVskb2JqZWN0SGFzaF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGxSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzU2VjdXJpdHlSZW1vdmVkUGFja2FnZVZlcnNpb24oc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiBib29sCnsKZm9yZWFjaCAoJHRoaXMtPnNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zWyRwYWNrYWdlTmFtZV0gPz8gW10gYXMgJHZlcnNpb24gPT4gJHBhY2thZ2VXaXRoU2VjdXJpdHlBZHZpc29yaWVzKSB7CmlmICgkY29uc3RyYWludCAhPT0gbnVsbCAmJiAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkdmVyc2lvbikpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNlY3VyaXR5QWR2aXNvcnlJZGVudGlmaWVyc0ZvclBhY2thZ2VWZXJzaW9uKHN0cmluZyAkcGFja2FnZU5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KTogYXJyYXkKewpmb3JlYWNoICgkdGhpcy0+c2VjdXJpdHlSZW1vdmVkVmVyc2lvbnNbJHBhY2thZ2VOYW1lXSA/PyBbXSBhcyAkdmVyc2lvbiA9PiAkcGFja2FnZVdpdGhTZWN1cml0eUFkdmlzb3JpZXMpIHsKaWYgKCRjb25zdHJhaW50ICE9PSBudWxsICYmICRjb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICR2ZXJzaW9uKSkpIHsKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRhZHZpc29yeSkgewpyZXR1cm4gJGFkdmlzb3J5LT5hZHZpc29yeUlkOwp9LCAkcGFja2FnZVdpdGhTZWN1cml0eUFkdmlzb3JpZXMpOwp9Cn0KCnJldHVybiBbXTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzQWJhbmRvbmVkUmVtb3ZlZFBhY2thZ2VWZXJzaW9uKHN0cmluZyAkcGFja2FnZU5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT5hYmFuZG9uZWRSZW1vdmVkVmVyc2lvbnNbJHBhY2thZ2VOYW1lXSA/PyBbXSBhcyAkdmVyc2lvbiA9PiAkcHJldHR5VmVyc2lvbikgewppZiAoJGNvbnN0cmFpbnQgIT09IG51bGwgJiYgJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb24pKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGxTZWN1cml0eVJlbW92ZWRQYWNrYWdlVmVyc2lvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnNlY3VyaXR5UmVtb3ZlZFZlcnNpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsQWJhbmRvbmVkUmVtb3ZlZFBhY2thZ2VWZXJzaW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWJhbmRvbmVkUmVtb3ZlZFZlcnNpb25zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcyk6IHZvaWQKewokaWQgPSAxOwoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5wYWNrYWdlc1tdID0gJHBhY2thZ2U7CgokcGFja2FnZS0+aWQgPSAkaWQrKzsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcygpIGFzICRwcm92aWRlZCkgewokdGhpcy0+cGFja2FnZUJ5TmFtZVskcHJvdmlkZWRdW10gPSAkcGFja2FnZTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwYWNrYWdlQnlJZChpbnQgJGlkKTogQmFzZVBhY2thZ2UKewpyZXR1cm4gJHRoaXMtPnBhY2thZ2VzWyRpZCAtIDFdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuIFxjb3VudCgkdGhpcy0+cGFja2FnZXMpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aGF0UHJvdmlkZXMoc3RyaW5nICRuYW1lLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CiRrZXkgPSAoc3RyaW5nKSAkY29uc3RyYWludDsKaWYgKGlzc2V0KCR0aGlzLT5wcm92aWRlckNhY2hlWyRuYW1lXVska2V5XSkpIHsKcmV0dXJuICR0aGlzLT5wcm92aWRlckNhY2hlWyRuYW1lXVska2V5XTsKfQoKcmV0dXJuICR0aGlzLT5wcm92aWRlckNhY2hlWyRuYW1lXVska2V5XSA9ICR0aGlzLT5jb21wdXRlV2hhdFByb3ZpZGVzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29tcHV0ZVdoYXRQcm92aWRlcyhzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IGFycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cGFja2FnZUJ5TmFtZVskbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJG1hdGNoZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlQnlOYW1lWyRuYW1lXSBhcyAkY2FuZGlkYXRlKSB7CmlmICgkdGhpcy0+bWF0Y2goJGNhbmRpZGF0ZSwgJG5hbWUsICRjb25zdHJhaW50KSkgewokbWF0Y2hlc1tdID0gJGNhbmRpZGF0ZTsKfQp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBsaXRlcmFsVG9QYWNrYWdlKGludCAkbGl0ZXJhbCk6IEJhc2VQYWNrYWdlCnsKJHBhY2thZ2VJZCA9IGFicygkbGl0ZXJhbCk7CgpyZXR1cm4gJHRoaXMtPnBhY2thZ2VCeUlkKCRwYWNrYWdlSWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbGl0ZXJhbFRvUHJldHR5U3RyaW5nKGludCAkbGl0ZXJhbCwgYXJyYXkgJGluc3RhbGxlZE1hcCk6IHN0cmluZwp7CiRwYWNrYWdlID0gJHRoaXMtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwoKaWYgKGlzc2V0KCRpbnN0YWxsZWRNYXBbJHBhY2thZ2UtPmlkXSkpIHsKJHByZWZpeCA9ICgkbGl0ZXJhbCA+IDAgPyAna2VlcCcgOiAncmVtb3ZlJyk7Cn0gZWxzZSB7CiRwcmVmaXggPSAoJGxpdGVyYWwgPiAwID8gJ2luc3RhbGwnIDogJ2RvblwndCBpbnN0YWxsJyk7Cn0KCnJldHVybiAkcHJlZml4LicgJy4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXRjaChCYXNlUGFja2FnZSAkY2FuZGlkYXRlLCBzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IGJvb2wKewokY2FuZGlkYXRlTmFtZSA9ICRjYW5kaWRhdGUtPmdldE5hbWUoKTsKJGNhbmRpZGF0ZVZlcnNpb24gPSAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCk7CgppZiAoJGNhbmRpZGF0ZU5hbWUgPT09ICRuYW1lKSB7CnJldHVybiAkY29uc3RyYWludCA9PT0gbnVsbCB8fCBDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkY29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRjYW5kaWRhdGVWZXJzaW9uKTsKfQoKJHByb3ZpZGVzID0gJGNhbmRpZGF0ZS0+Z2V0UHJvdmlkZXMoKTsKJHJlcGxhY2VzID0gJGNhbmRpZGF0ZS0+Z2V0UmVwbGFjZXMoKTsKCgppZiAoaXNzZXQoJHJlcGxhY2VzWzBdKSB8fCBpc3NldCgkcHJvdmlkZXNbMF0pKSB7CmZvcmVhY2ggKCRwcm92aWRlcyBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkbmFtZSAmJiAoJGNvbnN0cmFpbnQgPT09IG51bGwgfHwgJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGxpbmstPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9Cn0KCmZvcmVhY2ggKCRyZXBsYWNlcyBhcyAkbGluaykgewppZiAoJGxpbmstPmdldFRhcmdldCgpID09PSAkbmFtZSAmJiAoJGNvbnN0cmFpbnQgPT09IG51bGwgfHwgJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGxpbmstPmdldENvbnN0cmFpbnQoKSkpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKaWYgKGlzc2V0KCRwcm92aWRlc1skbmFtZV0pICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkcHJvdmlkZXNbJG5hbWVdLT5nZXRDb25zdHJhaW50KCkpKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGlzc2V0KCRyZXBsYWNlc1skbmFtZV0pICYmICgkY29uc3RyYWludCA9PT0gbnVsbCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcygkcmVwbGFjZXNbJG5hbWVdLT5nZXRDb25zdHJhaW50KCkpKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gXGluX2FycmF5KCRwYWNrYWdlLCAkdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewokc3RyID0gIlBvb2w6XG4iOwoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRzdHIgLj0gJy0gJy5zdHJfcGFkKChzdHJpbmcpICRwYWNrYWdlLT5pZCwgNiwgJyAnLCBTVFJfUEFEX0xFRlQpLic6ICcuJHBhY2thZ2UtPmdldE5hbWUoKS4iXG4iOwp9CgpyZXR1cm4gJHN0cjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFN0YWJpbGl0eUZpbHRlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxQbHVnaW5cUHJlUG9vbENyZWF0ZUV2ZW50Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb21waWxpbmdNYXRjaGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaEFsbENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwoKCgoKY2xhc3MgUG9vbEJ1aWxkZXIKewpwcml2YXRlIGNvbnN0IExPQURfQkFUQ0hfU0laRSA9IDUwOwoKCgoKCnByaXZhdGUgJGFjY2VwdGFibGVTdGFiaWxpdGllczsKCgoKCnByaXZhdGUgJHN0YWJpbGl0eUZsYWdzOwoKCgoKcHJpdmF0ZSAkcm9vdEFsaWFzZXM7CgoKCgpwcml2YXRlICRyb290UmVmZXJlbmNlczsKCgoKcHJpdmF0ZSAkdGVtcG9yYXJ5Q29uc3RyYWludHM7CgoKCnByaXZhdGUgJGV2ZW50RGlzcGF0Y2hlcjsKCgoKcHJpdmF0ZSAkcG9vbE9wdGltaXplcjsKCgoKcHJpdmF0ZSAkaW87CgoKCgpwcml2YXRlICRhbGlhc01hcCA9IFtdOwoKCgoKcHJpdmF0ZSAkcGFja2FnZXNUb0xvYWQgPSBbXTsKCgoKCnByaXZhdGUgJGxvYWRlZFBhY2thZ2VzID0gW107CgoKCgpwcml2YXRlICRsb2FkZWRQZXJSZXBvID0gW107CgoKCnByaXZhdGUgJHBhY2thZ2VzID0gW107CgoKCnByaXZhdGUgJHVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9IFtdOwoKcHJpdmF0ZSAkdXBkYXRlQWxsb3dMaXN0ID0gW107Cgpwcml2YXRlICRza2lwcGVkTG9hZCA9IFtdOwoKcHJpdmF0ZSAkaWdub3JlZFR5cGVzID0gW107Cgpwcml2YXRlICRhbGxvd2VkVHlwZXMgPSBudWxsOwoKCgoKCgoKCgpwcml2YXRlICRyZXN0cmljdGVkUGFja2FnZXNMaXN0ID0gbnVsbDsKCgoKCgoKCgoKcHJpdmF0ZSAkcGF0aFJlcG9VbmxvY2tlZCA9IFtdOwoKCgoKCgoKCgoKCnByaXZhdGUgJG1heEV4dGVuZGVkUmVxcyA9IFtdOwoKCgoKcHJpdmF0ZSAkdXBkYXRlQWxsb3dXYXJuZWQgPSBbXTsKCgpwcml2YXRlICRpbmRleENvdW50ZXIgPSAwOwoKCnByaXZhdGUgJHNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyOwoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkcm9vdEFsaWFzZXMsIGFycmF5ICRyb290UmVmZXJlbmNlcywgSU9JbnRlcmZhY2UgJGlvLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsLCA/UG9vbE9wdGltaXplciAkcG9vbE9wdGltaXplciA9IG51bGwsIGFycmF5ICR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdLCA/U2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXIgJHNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyID0gbnVsbCkKewokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gJGFjY2VwdGFibGVTdGFiaWxpdGllczsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwokdGhpcy0+cm9vdEFsaWFzZXMgPSAkcm9vdEFsaWFzZXM7CiR0aGlzLT5yb290UmVmZXJlbmNlcyA9ICRyb290UmVmZXJlbmNlczsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7CiR0aGlzLT5wb29sT3B0aW1pemVyID0gJHBvb2xPcHRpbWl6ZXI7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzID0gJHRlbXBvcmFyeUNvbnN0cmFpbnRzOwokdGhpcy0+c2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXIgPSAkc2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXI7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElnbm9yZWRUeXBlcyhhcnJheSAkdHlwZXMpOiB2b2lkCnsKJHRoaXMtPmlnbm9yZWRUeXBlcyA9ICR0eXBlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxsb3dlZFR5cGVzKD9hcnJheSAkdHlwZXMpOiB2b2lkCnsKJHRoaXMtPmFsbG93ZWRUeXBlcyA9ICR0eXBlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGJ1aWxkUG9vbChhcnJheSAkcmVwb3NpdG9yaWVzLCBSZXF1ZXN0ICRyZXF1ZXN0KTogUG9vbAp7CiR0aGlzLT5yZXN0cmljdGVkUGFja2FnZXNMaXN0ID0gJHJlcXVlc3QtPmdldFJlc3RyaWN0ZWRQYWNrYWdlcygpICE9PSBudWxsID8gYXJyYXlfZmxpcCgkcmVxdWVzdC0+Z2V0UmVzdHJpY3RlZFBhY2thZ2VzKCkpIDogbnVsbDsKCmlmIChcY291bnQoJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93TGlzdCgpKSA+IDApIHsKJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCA9ICRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd0xpc3QoKTsKJHRoaXMtPndhcm5BYm91dE5vbk1hdGNoaW5nVXBkYXRlQWxsb3dMaXN0KCRyZXF1ZXN0KTsKCmlmIChudWxsID09PSAkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vIGxvY2sgcmVwbyBwcmVzZW50IGFuZCB5ZXQgYSBwYXJ0aWFsIHVwZGF0ZSB3YXMgcmVxdWVzdGVkLicpOwp9Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRsb2NrZWRQYWNrYWdlKSB7CmlmICghJHRoaXMtPmlzVXBkYXRlQWxsb3dlZCgkbG9ja2VkUGFja2FnZSkpIHsKCiR0aGlzLT5za2lwcGVkTG9hZFskbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gJGxvY2tlZFBhY2thZ2U7CmZvcmVhY2ggKCRsb2NrZWRQYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CiR0aGlzLT5za2lwcGVkTG9hZFskbGluay0+Z2V0VGFyZ2V0KCldW10gPSAkbG9ja2VkUGFja2FnZTsKfQoKCgoKCmlmICgkbG9ja2VkUGFja2FnZS0+Z2V0RGlzdFR5cGUoKSA9PT0gJ3BhdGgnKSB7CiR0cmFuc3BvcnRPcHRpb25zID0gJGxvY2tlZFBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKaWYgKCFpc3NldCgkdHJhbnNwb3J0T3B0aW9uc1snc3ltbGluayddKSB8fCAkdHJhbnNwb3J0T3B0aW9uc1snc3ltbGluayddICE9PSBmYWxzZSkgewokdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7CmNvbnRpbnVlOwp9Cn0KCiRyZXF1ZXN0LT5sb2NrUGFja2FnZSgkbG9ja2VkUGFja2FnZSk7Cn0KfQp9Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRPckxvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCgokdGhpcy0+bG9hZGVkUGFja2FnZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCk7CgoKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCk7Cn0KCgoKCmlmICgKJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlUmVwb3NpdG9yeQp8fCAkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpIGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5Cnx8IFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MsICRwYWNrYWdlLT5nZXROYW1lcygpLCAkcGFja2FnZS0+Z2V0U3RhYmlsaXR5KCkpCikgewokdGhpcy0+bG9hZFBhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRwYWNrYWdlLCBmYWxzZSk7Cn0gZWxzZSB7CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludCkgewoKaWYgKGlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRwYWNrYWdlTmFtZV0gPSAkY29uc3RyYWludDsKJHRoaXMtPm1heEV4dGVuZGVkUmVxc1skcGFja2FnZU5hbWVdID0gdHJ1ZTsKfQoKCmZvcmVhY2ggKCR0aGlzLT5wYWNrYWdlc1RvTG9hZCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoaXNzZXQoJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSkpIHsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSk7Cn0KfQoKd2hpbGUgKFxjb3VudCgkdGhpcy0+cGFja2FnZXNUb0xvYWQpID4gMCkgewokdGhpcy0+bG9hZFBhY2thZ2VzTWFya2VkRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcG9zaXRvcmllcyk7Cn0KCmlmIChcY291bnQoJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzKSA+IDApIHsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRpID0+ICRwYWNrYWdlKSB7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcygpIGFzICRwYWNrYWdlTmFtZSkgewppZiAoIWlzc2V0KCR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50c1skcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQoKJGNvbnN0cmFpbnQgPSAkdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHNbJHBhY2thZ2VOYW1lXTsKJHBhY2thZ2VBbmRBbGlhc2VzID0gWyRpID0+ICRwYWNrYWdlXTsKaWYgKGlzc2V0KCR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKJHBhY2thZ2VBbmRBbGlhc2VzICs9ICR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXTsKfQoKJGZvdW5kID0gZmFsc2U7CmZvcmVhY2ggKCRwYWNrYWdlQW5kQWxpYXNlcyBhcyAkcGFja2FnZU9yQWxpYXMpIHsKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJHBhY2thZ2VPckFsaWFzLT5nZXRWZXJzaW9uKCkpKSB7CiRmb3VuZCA9IHRydWU7Cn0KfQoKaWYgKCEkZm91bmQpIHsKZm9yZWFjaCAoJHBhY2thZ2VBbmRBbGlhc2VzIGFzICRpbmRleCA9PiAkcGFja2FnZU9yQWxpYXMpIHsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzWyRpbmRleF0pOwp9Cn0KfQp9Cn0KCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyICE9PSBudWxsKSB7CiRwcmVQb29sQ3JlYXRlRXZlbnQgPSBuZXcgUHJlUG9vbENyZWF0ZUV2ZW50KApQbHVnaW5FdmVudHM6OlBSRV9QT09MX0NSRUFURSwKJHJlcG9zaXRvcmllcywKJHJlcXVlc3QsCiR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsCiR0aGlzLT5zdGFiaWxpdHlGbGFncywKJHRoaXMtPnJvb3RBbGlhc2VzLAokdGhpcy0+cm9vdFJlZmVyZW5jZXMsCiR0aGlzLT5wYWNrYWdlcywKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcwopOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcHJlUG9vbENyZWF0ZUV2ZW50LT5nZXROYW1lKCksICRwcmVQb29sQ3JlYXRlRXZlbnQpOwokdGhpcy0+cGFja2FnZXMgPSAkcHJlUG9vbENyZWF0ZUV2ZW50LT5nZXRQYWNrYWdlcygpOwokdGhpcy0+dW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2VzID0gJHByZVBvb2xDcmVhdGVFdmVudC0+Z2V0VW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcygpOwp9CgokcG9vbCA9IG5ldyBQb29sKCR0aGlzLT5wYWNrYWdlcywgJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyk7CgokdGhpcy0+YWxpYXNNYXAgPSBbXTsKJHRoaXMtPnBhY2thZ2VzVG9Mb2FkID0gW107CiR0aGlzLT5sb2FkZWRQYWNrYWdlcyA9IFtdOwokdGhpcy0+bG9hZGVkUGVyUmVwbyA9IFtdOwokdGhpcy0+cGFja2FnZXMgPSBbXTsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlcyA9IFtdOwokdGhpcy0+bWF4RXh0ZW5kZWRSZXFzID0gW107CiR0aGlzLT5za2lwcGVkTG9hZCA9IFtdOwokdGhpcy0+aW5kZXhDb3VudGVyID0gMDsKCiR0aGlzLT5pby0+ZGVidWcoJ0J1aWx0IHBvb2wuJyk7CgoKCiRwb29sID0gJHRoaXMtPnJ1blNlY3VyaXR5QWR2aXNvcnlGaWx0ZXIoJHBvb2wsICRyZXBvc2l0b3JpZXMsICRyZXF1ZXN0KTsKJHBvb2wgPSAkdGhpcy0+cnVuT3B0aW1pemVyKCRyZXF1ZXN0LCAkcG9vbCk7CgpJbnRlcnZhbHM6OmNsZWFyKCk7CgpyZXR1cm4gJHBvb2w7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZyhSZXF1ZXN0ICRyZXF1ZXN0LCBzdHJpbmcgJG5hbWUsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpOiB2b2lkCnsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSkgewpyZXR1cm47Cn0KCgoKaWYgKGlzc2V0KCR0aGlzLT5tYXhFeHRlbmRlZFJlcXNbJG5hbWVdKSkgewpyZXR1cm47Cn0KCgoKCgokcm9vdFJlcXVpcmVzID0gJHJlcXVlc3QtPmdldFJlcXVpcmVzKCk7CmlmIChpc3NldCgkcm9vdFJlcXVpcmVzWyRuYW1lXSkgJiYgIUludGVydmFsczo6aXNTdWJzZXRPZigkY29uc3RyYWludCwgJHJvb3RSZXF1aXJlc1skbmFtZV0pKSB7CiRjb25zdHJhaW50ID0gJHJvb3RSZXF1aXJlc1skbmFtZV07Cn0KCgppZiAoIWlzc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pKSB7CgoKCmlmIChpc3NldCgkdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdKSkgewoKaWYgKEludGVydmFsczo6aXNTdWJzZXRPZigkY29uc3RyYWludCwgJHRoaXMtPnBhY2thZ2VzVG9Mb2FkWyRuYW1lXSkpIHsKcmV0dXJuOwp9CgoKJGNvbnN0cmFpbnQgPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKFskdGhpcy0+cGFja2FnZXNUb0xvYWRbJG5hbWVdLCAkY29uc3RyYWludF0sIGZhbHNlKSk7Cn0KCiR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0gPSAkY29uc3RyYWludDsKCnJldHVybjsKfQoKCgppZiAoSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdKSkgewpyZXR1cm47Cn0KCgoKCiR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0gPSBJbnRlcnZhbHM6OmNvbXBhY3RDb25zdHJhaW50KE11bHRpQ29uc3RyYWludDo6Y3JlYXRlKFskdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdLCAkY29uc3RyYWludF0sIGZhbHNlKSk7CnVuc2V0KCR0aGlzLT5sb2FkZWRQYWNrYWdlc1skbmFtZV0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQYWNrYWdlc01hcmtlZEZvckxvYWRpbmcoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcyk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+cGFja2FnZXNUb0xvYWQgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCR0aGlzLT5yZXN0cmljdGVkUGFja2FnZXNMaXN0ICE9PSBudWxsICYmICFpc3NldCgkdGhpcy0+cmVzdHJpY3RlZFBhY2thZ2VzTGlzdFskbmFtZV0pKSB7CnVuc2V0KCR0aGlzLT5wYWNrYWdlc1RvTG9hZFskbmFtZV0pOwpjb250aW51ZTsKfQokdGhpcy0+bG9hZGVkUGFja2FnZXNbJG5hbWVdID0gJGNvbnN0cmFpbnQ7Cn0KCgokcGFja2FnZUJhdGNoZXMgPSBhcnJheV9jaHVuaygkdGhpcy0+cGFja2FnZXNUb0xvYWQsIHNlbGY6OkxPQURfQkFUQ0hfU0laRSwgdHJ1ZSk7CiR0aGlzLT5wYWNrYWdlc1RvTG9hZCA9IFtdOwoKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwb0luZGV4ID0+ICRyZXBvc2l0b3J5KSB7CgoKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5IHx8ICRyZXBvc2l0b3J5ID09PSAkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpKSB7CmNvbnRpbnVlOwp9CgppZiAoMCA9PT0gXGNvdW50KCRwYWNrYWdlQmF0Y2hlcykpIHsKYnJlYWs7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlQmF0Y2hlcyBhcyAkYmF0Y2hJbmRleCA9PiAkcGFja2FnZUJhdGNoKSB7CiRyZXN1bHQgPSAkcmVwb3NpdG9yeS0+bG9hZFBhY2thZ2VzKCRwYWNrYWdlQmF0Y2gsICR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICR0aGlzLT5zdGFiaWxpdHlGbGFncywgJHRoaXMtPmxvYWRlZFBlclJlcG9bJHJlcG9JbmRleF0gPz8gW10pOwoKZm9yZWFjaCAoJHJlc3VsdFsnbmFtZXNGb3VuZCddIGFzICRuYW1lKSB7Cgp1bnNldCgkcGFja2FnZUJhdGNoZXNbJGJhdGNoSW5kZXhdWyRuYW1lXSk7Cn0KZm9yZWFjaCAoJHJlc3VsdFsncGFja2FnZXMnXSBhcyAkcGFja2FnZSkgewokdGhpcy0+bG9hZGVkUGVyUmVwb1skcmVwb0luZGV4XVskcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlOwoKaWYgKGluX2FycmF5KCRwYWNrYWdlLT5nZXRUeXBlKCksICR0aGlzLT5pZ25vcmVkVHlwZXMsIHRydWUpIHx8ICgkdGhpcy0+YWxsb3dlZFR5cGVzICE9PSBudWxsICYmICFpbl9hcnJheSgkcGFja2FnZS0+Z2V0VHlwZSgpLCAkdGhpcy0+YWxsb3dlZFR5cGVzLCB0cnVlKSkpIHsKY29udGludWU7Cn0KJHRoaXMtPmxvYWRQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcGFja2FnZSwgIWlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRwYWNrYWdlLT5nZXROYW1lKCldKSk7Cn0KfQoKJHBhY2thZ2VCYXRjaGVzID0gYXJyYXlfY2h1bmsoYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VCYXRjaGVzKSwgc2VsZjo6TE9BRF9CQVRDSF9TSVpFLCB0cnVlKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRQYWNrYWdlKFJlcXVlc3QgJHJlcXVlc3QsIGFycmF5ICRyZXBvc2l0b3JpZXMsIEJhc2VQYWNrYWdlICRwYWNrYWdlLCBib29sICRwcm9wYWdhdGVVcGRhdGUpOiB2b2lkCnsKJGluZGV4ID0gJHRoaXMtPmluZGV4Q291bnRlcisrOwokdGhpcy0+cGFja2FnZXNbJGluZGV4XSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UtPmdldEFsaWFzT2YoKSldWyRpbmRleF0gPSAkcGFja2FnZTsKfQoKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwoKCgoKaWYgKGlzc2V0KCR0aGlzLT5yb290UmVmZXJlbmNlc1skbmFtZV0pKSB7CgppZiAoISRyZXF1ZXN0LT5pc0xvY2tlZFBhY2thZ2UoJHBhY2thZ2UpICYmICEkcmVxdWVzdC0+aXNGaXhlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CiRwYWNrYWdlLT5zZXRTb3VyY2VEaXN0UmVmZXJlbmNlcygkdGhpcy0+cm9vdFJlZmVyZW5jZXNbJG5hbWVdKTsKfQp9CgoKCgoKCmlmICgoJHByb3BhZ2F0ZVVwZGF0ZSB8fCBpc3NldCgkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSkpICYmIGlzc2V0KCR0aGlzLT5yb290QWxpYXNlc1skbmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0pKSB7CiRhbGlhcyA9ICR0aGlzLT5yb290QWxpYXNlc1skbmFtZV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV07CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYmFzZVBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9IGVsc2UgewokYmFzZVBhY2thZ2UgPSAkcGFja2FnZTsKfQppZiAoJGJhc2VQYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CiRhbGlhc1BhY2thZ2UgPSBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJGJhc2VQYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfSBlbHNlIHsKJGFsaWFzUGFja2FnZSA9IG5ldyBBbGlhc1BhY2thZ2UoJGJhc2VQYWNrYWdlLCAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwgJGFsaWFzWydhbGlhcyddKTsKfQokYWxpYXNQYWNrYWdlLT5zZXRSb290UGFja2FnZUFsaWFzKHRydWUpOwoKJG5ld0luZGV4ID0gJHRoaXMtPmluZGV4Q291bnRlcisrOwokdGhpcy0+cGFja2FnZXNbJG5ld0luZGV4XSA9ICRhbGlhc1BhY2thZ2U7CiR0aGlzLT5hbGlhc01hcFtzcGxfb2JqZWN0X2hhc2goJGFsaWFzUGFja2FnZS0+Z2V0QWxpYXNPZigpKV1bJG5ld0luZGV4XSA9ICRhbGlhc1BhY2thZ2U7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRyZXF1aXJlID0gJGxpbmstPmdldFRhcmdldCgpOwokbGlua0NvbnN0cmFpbnQgPSAkbGluay0+Z2V0Q29uc3RyYWludCgpOwoKCmlmIChpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJHJlcXVpcmVdKSkgewoKCgppZiAoJHByb3BhZ2F0ZVVwZGF0ZSAmJiAkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCkpIHsKJHNraXBwZWRSb290UmVxdWlyZXMgPSAkdGhpcy0+Z2V0U2tpcHBlZFJvb3RSZXF1aXJlcygkcmVxdWVzdCwgJHJlcXVpcmUpOwoKaWYgKCRyZXF1ZXN0LT5nZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCkgfHwgMCA9PT0gXGNvdW50KCRza2lwcGVkUm9vdFJlcXVpcmVzKSkgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcXVpcmUpOwokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcXVpcmUsICRsaW5rQ29uc3RyYWludCk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRza2lwcGVkUm9vdFJlcXVpcmVzIGFzICRyb290UmVxdWlyZSkgewppZiAoIWlzc2V0KCR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdKSkgewokdGhpcy0+dXBkYXRlQWxsb3dXYXJuZWRbJHJvb3RSZXF1aXJlXSA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RGVwZW5kZW5jeSAnLiRyb290UmVxdWlyZS4nIGlzIGFsc28gYSByb290IHJlcXVpcmVtZW50LiBQYWNrYWdlIGhhcyBub3QgYmVlbiBsaXN0ZWQgYXMgYW4gdXBkYXRlIGFyZ3VtZW50LCBzbyBrZWVwaW5nIGxvY2tlZCBhdCBvbGQgdmVyc2lvbi4gVXNlIC0td2l0aC1hbGwtZGVwZW5kZW5jaWVzICgtVykgdG8gaW5jbHVkZSByb290IGRlcGVuZGVuY2llcy48L3dhcm5pbmc+Jyk7Cn0KfQp9Cn0gZWxzZWlmIChpc3NldCgkdGhpcy0+cGF0aFJlcG9VbmxvY2tlZFskcmVxdWlyZV0pICYmICFpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJHJlcXVpcmVdKSkgewoKCiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVxdWlyZSwgJGxpbmtDb25zdHJhaW50KTsKfQp9IGVsc2UgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcXVpcmUsICRsaW5rQ29uc3RyYWludCk7Cn0KfQoKCgppZiAoJHByb3BhZ2F0ZVVwZGF0ZSAmJiAkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCkpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKJHJlcGxhY2UgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CmlmIChpc3NldCgkdGhpcy0+bG9hZGVkUGFja2FnZXNbJHJlcGxhY2VdLCAkdGhpcy0+c2tpcHBlZExvYWRbJHJlcGxhY2VdKSkgewokc2tpcHBlZFJvb3RSZXF1aXJlcyA9ICR0aGlzLT5nZXRTa2lwcGVkUm9vdFJlcXVpcmVzKCRyZXF1ZXN0LCAkcmVwbGFjZSk7CgppZiAoJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKSB8fCAwID09PSBcY291bnQoJHNraXBwZWRSb290UmVxdWlyZXMpKSB7CiR0aGlzLT51bmxvY2tQYWNrYWdlKCRyZXF1ZXN0LCAkcmVwb3NpdG9yaWVzLCAkcmVwbGFjZSk7CgokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZ0lmUmVxdWlyZWQoJHJlcXVlc3QsICRyZXBsYWNlKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHNraXBwZWRSb290UmVxdWlyZXMgYXMgJHJvb3RSZXF1aXJlKSB7CmlmICghaXNzZXQoJHRoaXMtPnVwZGF0ZUFsbG93V2FybmVkWyRyb290UmVxdWlyZV0pKSB7CiR0aGlzLT51cGRhdGVBbGxvd1dhcm5lZFskcm9vdFJlcXVpcmVdID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5EZXBlbmRlbmN5ICcuJHJvb3RSZXF1aXJlLicgaXMgYWxzbyBhIHJvb3QgcmVxdWlyZW1lbnQuIFBhY2thZ2UgaGFzIG5vdCBiZWVuIGxpc3RlZCBhcyBhbiB1cGRhdGUgYXJndW1lbnQsIHNvIGtlZXBpbmcgbG9ja2VkIGF0IG9sZCB2ZXJzaW9uLiBVc2UgLS13aXRoLWFsbC1kZXBlbmRlbmNpZXMgKC1XKSB0byBpbmNsdWRlIHJvb3QgZGVwZW5kZW5jaWVzLjwvd2FybmluZz4nKTsKfQp9Cn0KfQp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzUm9vdFJlcXVpcmUoUmVxdWVzdCAkcmVxdWVzdCwgc3RyaW5nICRuYW1lKTogYm9vbAp7CiRyb290UmVxdWlyZXMgPSAkcmVxdWVzdC0+Z2V0UmVxdWlyZXMoKTsKCnJldHVybiBpc3NldCgkcm9vdFJlcXVpcmVzWyRuYW1lXSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2tpcHBlZFJvb3RSZXF1aXJlcyhSZXF1ZXN0ICRyZXF1ZXN0LCBzdHJpbmcgJG5hbWUpOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSkpIHsKcmV0dXJuIFtdOwp9Cgokcm9vdFJlcXVpcmVzID0gJHJlcXVlc3QtPmdldFJlcXVpcmVzKCk7CiRtYXRjaGVzID0gW107CgppZiAoaXNzZXQoJHJvb3RSZXF1aXJlc1skbmFtZV0pKSB7CnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKSB1c2UgKCRuYW1lKTogc3RyaW5nIHsKaWYgKCRuYW1lICE9PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4nICh2aWEgcmVwbGFjZSBvZiAnLiRuYW1lLicpJzsKfQoKcmV0dXJuICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0sICR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0pOwp9Cgpmb3JlYWNoICgkdGhpcy0+c2tpcHBlZExvYWRbJG5hbWVdIGFzICRwYWNrYWdlT3JSZXBsYWNlcikgewppZiAoaXNzZXQoJHJvb3RSZXF1aXJlc1skcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKV0pKSB7CiRtYXRjaGVzW10gPSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKTsKfQpmb3JlYWNoICgkcGFja2FnZU9yUmVwbGFjZXItPmdldFJlcGxhY2VzKCkgYXMgJGxpbmspIHsKaWYgKGlzc2V0KCRyb290UmVxdWlyZXNbJGxpbmstPmdldFRhcmdldCgpXSkpIHsKaWYgKCRuYW1lICE9PSAkcGFja2FnZU9yUmVwbGFjZXItPmdldE5hbWUoKSkgewokbWF0Y2hlc1tdID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCkgLicgKHZpYSByZXBsYWNlIG9mICcuJG5hbWUuJyknOwp9IGVsc2UgewokbWF0Y2hlc1tdID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCk7Cn0KYnJlYWs7Cn0KfQp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNVcGRhdGVBbGxvd2VkKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgYXMgJHBhdHRlcm4pIHsKJHBhdHRlcm5SZWdleHAgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gd2FybkFib3V0Tm9uTWF0Y2hpbmdVcGRhdGVBbGxvd0xpc3QoUmVxdWVzdCAkcmVxdWVzdCk6IHZvaWQKewppZiAobnVsbCA9PT0gJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyBsb2NrIHJlcG8gcHJlc2VudCBhbmQgeWV0IGEgcGFydGlhbCB1cGRhdGUgd2FzIHJlcXVlc3RlZC4nKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCBhcyAkcGF0dGVybikgewokbWF0Y2hlZFBsYXRmb3JtUGFja2FnZSA9IGZhbHNlOwoKJHBhdHRlcm5SZWdleHAgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7Cgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuUmVnZXhwLCAkcGFja2FnZS0+Z2V0TmFtZSgpKSkgewpjb250aW51ZSAyOwp9Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoUHJlZzo6aXNNYXRjaCgkcGF0dGVyblJlZ2V4cCwgJHBhY2thZ2VOYW1lKSkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZU5hbWUpKSB7CiRtYXRjaGVkUGxhdGZvcm1QYWNrYWdlID0gdHJ1ZTsKY29udGludWU7Cn0KY29udGludWUgMjsKfQp9CmlmICgkbWF0Y2hlZFBsYXRmb3JtUGFja2FnZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlBhdHRlcm4gIicgLiAkcGF0dGVybiAuICciIGxpc3RlZCBmb3IgdXBkYXRlIG1hdGNoZXMgcGxhdGZvcm0gcGFja2FnZXMsIGJ1dCB0aGVzZSBjYW5ub3QgYmUgdXBkYXRlZCBieSBDb21wb3Nlci48L3dhcm5pbmc+Jyk7Cn0gZWxzZWlmIChzdHJwb3MoJHBhdHRlcm4sICcqJykgIT09IGZhbHNlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGF0dGVybiAiJyAuICRwYXR0ZXJuIC4gJyIgbGlzdGVkIGZvciB1cGRhdGUgZG9lcyBub3QgbWF0Y2ggYW55IGxvY2tlZCBwYWNrYWdlcy48L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+UGFja2FnZSAiJyAuICRwYXR0ZXJuIC4gJyIgbGlzdGVkIGZvciB1cGRhdGUgaXMgbm90IGxvY2tlZC48L3dhcm5pbmc+Jyk7Cn0KfQp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHVubG9ja1BhY2thZ2UoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcywgc3RyaW5nICRuYW1lKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5za2lwcGVkTG9hZFskbmFtZV0gYXMgJHBhY2thZ2VPclJlcGxhY2VyKSB7CgoKaWYgKCRwYWNrYWdlT3JSZXBsYWNlci0+Z2V0TmFtZSgpICE9PSAkbmFtZSAmJiBpc3NldCgkdGhpcy0+c2tpcHBlZExvYWRbJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCldKSkgewokcmVwbGFjZXJOYW1lID0gJHBhY2thZ2VPclJlcGxhY2VyLT5nZXROYW1lKCk7CmlmICgkcmVxdWVzdC0+Z2V0VXBkYXRlQWxsb3dUcmFuc2l0aXZlUm9vdERlcGVuZGVuY2llcygpIHx8ICghJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRuYW1lKSAmJiAhJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRyZXBsYWNlck5hbWUpKSkgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcGxhY2VyTmFtZSk7CgppZiAoJHRoaXMtPmlzUm9vdFJlcXVpcmUoJHJlcXVlc3QsICRyZXBsYWNlck5hbWUpKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVwbGFjZXJOYW1lLCBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KTsKfSBlbHNlIHsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRsb2FkZWRQYWNrYWdlKSB7CiRyZXF1aXJlcyA9ICRsb2FkZWRQYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoaXNzZXQoJHJlcXVpcmVzWyRyZXBsYWNlck5hbWVdKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJHJlcGxhY2VyTmFtZSwgJHJlcXVpcmVzWyRyZXBsYWNlck5hbWVdLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQp9Cn0KfQoKaWYgKGlzc2V0KCR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRuYW1lXSkpIHsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRpbmRleCA9PiAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJG5hbWUpIHsKJHRoaXMtPnJlbW92ZUxvYWRlZFBhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRwYWNrYWdlLCAkaW5kZXgpOwp9Cn0KfQoKdW5zZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRuYW1lXSwgJHRoaXMtPmxvYWRlZFBhY2thZ2VzWyRuYW1lXSwgJHRoaXMtPm1heEV4dGVuZGVkUmVxc1skbmFtZV0sICR0aGlzLT5wYXRoUmVwb1VubG9ja2VkWyRuYW1lXSk7CgoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkgYXMgJGxvY2tlZFBhY2thZ2UpIHsKaWYgKCEoJGxvY2tlZFBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpICYmICRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCkgPT09ICRuYW1lKSB7CmlmIChmYWxzZSAhPT0gJGluZGV4ID0gYXJyYXlfc2VhcmNoKCRsb2NrZWRQYWNrYWdlLCAkdGhpcy0+cGFja2FnZXMsIHRydWUpKSB7CiRyZXF1ZXN0LT51bmxvY2tQYWNrYWdlKCRsb2NrZWRQYWNrYWdlKTsKJHRoaXMtPnJlbW92ZUxvYWRlZFBhY2thZ2UoJHJlcXVlc3QsICRyZXBvc2l0b3JpZXMsICRsb2NrZWRQYWNrYWdlLCAkaW5kZXgpOwoKCgoKCgpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRPckxvY2tlZFBhY2thZ2VzKCkgYXMgJGZpeGVkT3JMb2NrZWRQYWNrYWdlKSB7CmlmICgkZml4ZWRPckxvY2tlZFBhY2thZ2UgPT09ICRsb2NrZWRQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgppZiAoaXNzZXQoJHRoaXMtPnNraXBwZWRMb2FkWyRmaXhlZE9yTG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpXSkpIHsKJHJlcXVpcmVzID0gJGZpeGVkT3JMb2NrZWRQYWNrYWdlLT5nZXRSZXF1aXJlcygpOwppZiAoaXNzZXQoJHJlcXVpcmVzWyRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldKSkgewokdGhpcy0+bWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZygkcmVxdWVzdCwgJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKSwgJHJlcXVpcmVzWyRsb2NrZWRQYWNrYWdlLT5nZXROYW1lKCldLT5nZXRDb25zdHJhaW50KCkpOwp9Cgpmb3JlYWNoICgkbG9ja2VkUGFja2FnZS0+Z2V0UmVwbGFjZXMoKSBhcyAkcmVwbGFjZSkgewppZiAoaXNzZXQoJHJlcXVpcmVzWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV0sICR0aGlzLT5za2lwcGVkTG9hZFskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldKSkgewokdGhpcy0+dW5sb2NrUGFja2FnZSgkcmVxdWVzdCwgJHJlcG9zaXRvcmllcywgJHJlcGxhY2UtPmdldFRhcmdldCgpKTsKCiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkcmVwbGFjZS0+Z2V0VGFyZ2V0KCksICRyZXBsYWNlLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQp9Cn0KfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya1BhY2thZ2VOYW1lRm9yTG9hZGluZ0lmUmVxdWlyZWQoUmVxdWVzdCAkcmVxdWVzdCwgc3RyaW5nICRuYW1lKTogdm9pZAp7CmlmICgkdGhpcy0+aXNSb290UmVxdWlyZSgkcmVxdWVzdCwgJG5hbWUpKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkbmFtZSwgJHJlcXVlc3QtPmdldFJlcXVpcmVzKClbJG5hbWVdKTsKfQoKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CmlmICgkbmFtZSA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiR0aGlzLT5tYXJrUGFja2FnZU5hbWVGb3JMb2FkaW5nKCRyZXF1ZXN0LCAkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlbW92ZUxvYWRlZFBhY2thZ2UoUmVxdWVzdCAkcmVxdWVzdCwgYXJyYXkgJHJlcG9zaXRvcmllcywgQmFzZVBhY2thZ2UgJHBhY2thZ2UsIGludCAkaW5kZXgpOiB2b2lkCnsKJHJlcG9JbmRleCA9IGFycmF5X3NlYXJjaCgkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpLCAkcmVwb3NpdG9yaWVzLCB0cnVlKTsKCnVuc2V0KCR0aGlzLT5sb2FkZWRQZXJSZXBvWyRyZXBvSW5kZXhdWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldKTsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzWyRpbmRleF0pOwppZiAoaXNzZXQoJHRoaXMtPmFsaWFzTWFwW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewpmb3JlYWNoICgkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gYXMgJGFsaWFzSW5kZXggPT4gJGFsaWFzUGFja2FnZSkgewp1bnNldCgkdGhpcy0+bG9hZGVkUGVyUmVwb1skcmVwb0luZGV4XVskYWxpYXNQYWNrYWdlLT5nZXROYW1lKCldWyRhbGlhc1BhY2thZ2UtPmdldFZlcnNpb24oKV0pOwp1bnNldCgkdGhpcy0+cGFja2FnZXNbJGFsaWFzSW5kZXhdKTsKfQp1bnNldCgkdGhpcy0+YWxpYXNNYXBbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gcnVuT3B0aW1pemVyKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiBQb29sCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wb29sT3B0aW1pemVyKSB7CnJldHVybiAkcG9vbDsKfQoKJHRoaXMtPmlvLT5kZWJ1ZygnUnVubmluZyBwb29sIG9wdGltaXplci4nKTsKCiRiZWZvcmUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0b3RhbCA9IFxjb3VudCgkcG9vbC0+Z2V0UGFja2FnZXMoKSk7CgokcG9vbCA9ICR0aGlzLT5wb29sT3B0aW1pemVyLT5vcHRpbWl6ZSgkcmVxdWVzdCwgJHBvb2wpOwoKJGZpbHRlcmVkID0gJHRvdGFsIC0gXGNvdW50KCRwb29sLT5nZXRQYWNrYWdlcygpKTsKCmlmICgwID09PSAkZmlsdGVyZWQpIHsKcmV0dXJuICRwb29sOwp9CgokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJ1Bvb2wgb3B0aW1pemVyIGNvbXBsZXRlZCBpbiAlLjNmIHNlY29uZHMnLCBtaWNyb3RpbWUodHJ1ZSkgLSAkYmVmb3JlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZigKJzxpbmZvPkZvdW5kICVzIHBhY2thZ2UgdmVyc2lvbnMgcmVmZXJlbmNlZCBpbiB5b3VyIGRlcGVuZGVuY3kgZ3JhcGguICVzICglZCUlKSB3ZXJlIG9wdGltaXplZCBhd2F5LjwvaW5mbz4nLApudW1iZXJfZm9ybWF0KCR0b3RhbCksCm51bWJlcl9mb3JtYXQoJGZpbHRlcmVkKSwKcm91bmQoMTAwIC8gJHRvdGFsICogJGZpbHRlcmVkKQopLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSWV9WRVJCT1NFKTsKCnJldHVybiAkcG9vbDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBydW5TZWN1cml0eUFkdmlzb3J5RmlsdGVyKFBvb2wgJHBvb2wsIGFycmF5ICRyZXBvc2l0b3JpZXMsIFJlcXVlc3QgJHJlcXVlc3QpOiBQb29sCnsKaWYgKG51bGwgPT09ICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlcikgewpyZXR1cm4gJHBvb2w7Cn0KCiR0aGlzLT5pby0+ZGVidWcoJ1J1bm5pbmcgc2VjdXJpdHkgYWR2aXNvcnkgcG9vbCBmaWx0ZXIuJyk7CgokYmVmb3JlID0gbWljcm90aW1lKHRydWUpOwokdG90YWwgPSBcY291bnQoJHBvb2wtPmdldFBhY2thZ2VzKCkpOwoKJHBvb2wgPSAkdGhpcy0+c2VjdXJpdHlBZHZpc29yeVBvb2xGaWx0ZXItPmZpbHRlcigkcG9vbCwgJHJlcG9zaXRvcmllcywgJHJlcXVlc3QpOwoKJGZpbHRlcmVkID0gJHRvdGFsIC0gXGNvdW50KCRwb29sLT5nZXRQYWNrYWdlcygpKTsKCmlmICgwID09PSAkZmlsdGVyZWQpIHsKcmV0dXJuICRwb29sOwp9CgokdGhpcy0+aW8tPndyaXRlKHNwcmludGYoJ1NlY3VyaXR5IGFkdmlzb3J5IHBvb2wgZmlsdGVyIGNvbXBsZXRlZCBpbiAlLjNmIHNlY29uZHMnLCBtaWNyb3RpbWUodHJ1ZSkgLSAkYmVmb3JlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGUoc3ByaW50ZigKJzxpbmZvPkZvdW5kICVzIHBhY2thZ2UgdmVyc2lvbnMgcmVmZXJlbmNlZCBpbiB5b3VyIGRlcGVuZGVuY3kgZ3JhcGguICVzICglZCUlKSB3ZXJlIGZpbHRlcmVkIGF3YXkuPC9pbmZvPicsCm51bWJlcl9mb3JtYXQoJHRvdGFsKSwKbnVtYmVyX2Zvcm1hdCgkZmlsdGVyZWQpLApyb3VuZCgxMDAgLyAkdG90YWwgKiAkZmlsdGVyZWQpCiksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwoKcmV0dXJuICRwb29sOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb21waWxpbmdNYXRjaGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwoKCgoKCgpjbGFzcyBQb29sT3B0aW1pemVyCnsKCgoKcHJpdmF0ZSAkcG9saWN5OwoKCgoKcHJpdmF0ZSAkaXJyZW1vdmFibGVQYWNrYWdlcyA9IFtdOwoKCgoKcHJpdmF0ZSAkcmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZSA9IFtdOwoKCgoKcHJpdmF0ZSAkY29uZmxpY3RDb25zdHJhaW50c1BlclBhY2thZ2UgPSBbXTsKCgoKCnByaXZhdGUgJHBhY2thZ2VzVG9SZW1vdmUgPSBbXTsKCgoKCnByaXZhdGUgJGFsaWFzZXNQZXJQYWNrYWdlID0gW107CgoKCgpwcml2YXRlICRyZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2UgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSkKewokdGhpcy0+cG9saWN5ID0gJHBvbGljeTsKfQoKcHVibGljIGZ1bmN0aW9uIG9wdGltaXplKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiBQb29sCnsKJHRoaXMtPnByZXBhcmUoJHJlcXVlc3QsICRwb29sKTsKCiR0aGlzLT5vcHRpbWl6ZUJ5SWRlbnRpY2FsRGVwZW5kZW5jaWVzKCRyZXF1ZXN0LCAkcG9vbCk7CgokdGhpcy0+b3B0aW1pemVJbXBvc3NpYmxlUGFja2FnZXNBd2F5KCRyZXF1ZXN0LCAkcG9vbCk7Cgokb3B0aW1pemVkUG9vbCA9ICR0aGlzLT5hcHBseVJlbW92YWxzVG9Qb29sKCRwb29sKTsKCgoKCgoKJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXMgPSBbXTsKJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2UgPSBbXTsKJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlID0gW107CiR0aGlzLT5wYWNrYWdlc1RvUmVtb3ZlID0gW107CiR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZSA9IFtdOwokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlID0gW107CgpyZXR1cm4gJG9wdGltaXplZFBvb2w7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcHJlcGFyZShSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sKTogdm9pZAp7CiRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50R3JvdXBzID0gW107CgoKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkT3JMb2NrZWRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRpcnJlbW92YWJsZVBhY2thZ2VDb25zdHJhaW50R3JvdXBzWyRwYWNrYWdlLT5nZXROYW1lKCldW10gPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKfQoKCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRyZXF1aXJlID0+ICRjb25zdHJhaW50KSB7CiR0aGlzLT5leHRyYWN0UmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZSgkcmVxdWlyZSwgJGNvbnN0cmFpbnQpOwp9CgoKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiR0aGlzLT5leHRyYWN0UmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCkgYXMgJGxpbmspIHsKJHRoaXMtPmV4dHJhY3RDb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9CgoKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokdGhpcy0+YWxpYXNlc1BlclBhY2thZ2VbJHBhY2thZ2UtPmdldEFsaWFzT2YoKS0+aWRdW10gPSAkcGFja2FnZTsKfQp9CgokaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludHMgPSBbXTsKZm9yZWFjaCAoJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRHcm91cHMgYXMgJHBhY2thZ2VOYW1lID0+ICRjb25zdHJhaW50cykgewokaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludHNbJHBhY2thZ2VOYW1lXSA9IDEgPT09IFxjb3VudCgkY29uc3RyYWludHMpID8gJGNvbnN0cmFpbnRzWzBdIDogbmV3IE11bHRpQ29uc3RyYWludCgkY29uc3RyYWludHMsIGZhbHNlKTsKfQp1bnNldCgkaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludEdyb3Vwcyk7CgoKZm9yZWFjaCAoJHBvb2wtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkaXJyZW1vdmFibGVQYWNrYWdlQ29uc3RyYWludHNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoQ29tcGlsaW5nTWF0Y2hlcjo6bWF0Y2goJGlycmVtb3ZhYmxlUGFja2FnZUNvbnN0cmFpbnRzWyRwYWNrYWdlLT5nZXROYW1lKCldLCBDb25zdHJhaW50OjpPUF9FUSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlSXJyZW1vdmFibGUoJHBhY2thZ2UpOwp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrUGFja2FnZUlycmVtb3ZhYmxlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzWyRwYWNrYWdlLT5pZF0gPSB0cnVlOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKCgokdGhpcy0+bWFya1BhY2thZ2VJcnJlbW92YWJsZSgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKTsKfQppZiAoaXNzZXQoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0pKSB7CmZvcmVhY2ggKCR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZVskcGFja2FnZS0+aWRdIGFzICRhbGlhc1BhY2thZ2UpIHsKJHRoaXMtPmlycmVtb3ZhYmxlUGFja2FnZXNbJGFsaWFzUGFja2FnZS0+aWRdID0gdHJ1ZTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwbHlSZW1vdmFsc1RvUG9vbChQb29sICRwb29sKTogUG9vbAp7CiRwYWNrYWdlcyA9IFtdOwokcmVtb3ZlZFZlcnNpb25zID0gW107CmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICghaXNzZXQoJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJHBhY2thZ2UtPmlkXSkpIHsKJHBhY2thZ2VzW10gPSAkcGFja2FnZTsKfSBlbHNlIHsKJHJlbW92ZWRWZXJzaW9uc1skcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KfQoKJG9wdGltaXplZFBvb2wgPSBuZXcgUG9vbCgkcGFja2FnZXMsICRwb29sLT5nZXRVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMoKSwgJHJlbW92ZWRWZXJzaW9ucywgJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZSwgJHBvb2wtPmdldEFsbFNlY3VyaXR5UmVtb3ZlZFBhY2thZ2VWZXJzaW9ucygpLCAkcG9vbC0+Z2V0QWxsQWJhbmRvbmVkUmVtb3ZlZFBhY2thZ2VWZXJzaW9ucygpKTsKCnJldHVybiAkb3B0aW1pemVkUG9vbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBvcHRpbWl6ZUJ5SWRlbnRpY2FsRGVwZW5kZW5jaWVzKFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiB2b2lkCnsKJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZSA9IFtdOwokcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXAgPSBbXTsKCmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKCmlmIChpc3NldCgkdGhpcy0+aXJyZW1vdmFibGVQYWNrYWdlc1skcGFja2FnZS0+aWRdKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPm1hcmtQYWNrYWdlRm9yUmVtb3ZhbCgkcGFja2FnZS0+aWQpOwoKJGRlcGVuZGVuY3lIYXNoID0gJHRoaXMtPmNhbGN1bGF0ZURlcGVuZGVuY3lIYXNoKCRwYWNrYWdlKTsKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJHBhY2thZ2VOYW1lKSB7CmlmICghaXNzZXQoJHRoaXMtPnJlcXVpcmVDb25zdHJhaW50c1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCR0aGlzLT5yZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0gYXMgJHJlcXVpcmVDb25zdHJhaW50KSB7CiRncm91cEhhc2hQYXJ0cyA9IFtdOwoKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRyZXF1aXJlQ29uc3RyYWludCwgQ29uc3RyYWludDo6T1BfRVEsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSB7CiRncm91cEhhc2hQYXJ0c1tdID0gJ3JlcXVpcmU6JyAuIChzdHJpbmcpICRyZXF1aXJlQ29uc3RyYWludDsKfQoKaWYgKFxjb3VudCgkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKSkgPiAwKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CmlmIChDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkbGluay0+Z2V0Q29uc3RyYWludCgpLCBDb25zdHJhaW50OjpPUF9FUSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpIHsKCiRncm91cEhhc2hQYXJ0c1tdID0gJ3JlcXVpcmU6JyAuIChzdHJpbmcpICRsaW5rLT5nZXRDb25zdHJhaW50KCk7Cn0KfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZsaWN0Q29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlTmFtZV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZU5hbWVdIGFzICRjb25mbGljdENvbnN0cmFpbnQpIHsKaWYgKENvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25mbGljdENvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkgewokZ3JvdXBIYXNoUGFydHNbXSA9ICdjb25mbGljdDonIC4gKHN0cmluZykgJGNvbmZsaWN0Q29uc3RyYWludDsKfQp9Cn0KCmlmICgwID09PSBcY291bnQoJGdyb3VwSGFzaFBhcnRzKSkgewpjb250aW51ZTsKfQoKJGdyb3VwSGFzaCA9IGltcGxvZGUoJycsICRncm91cEhhc2hQYXJ0cyk7CiRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2VbJHBhY2thZ2VOYW1lXVskZ3JvdXBIYXNoXVskZGVwZW5kZW5jeUhhc2hdW10gPSAkcGFja2FnZTsKJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRwYWNrYWdlLT5pZF1bJHBhY2thZ2VOYW1lXSA9IFsnZ3JvdXBIYXNoJyA9PiAkZ3JvdXBIYXNoLCAnZGVwZW5kZW5jeUhhc2gnID0+ICRkZXBlbmRlbmN5SGFzaF07Cn0KfQp9Cgpmb3JlYWNoICgkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlIGFzICRjb25zdHJhaW50R3JvdXBzKSB7CmZvcmVhY2ggKCRjb25zdHJhaW50R3JvdXBzIGFzICRjb25zdHJhaW50R3JvdXApIHsKZm9yZWFjaCAoJGNvbnN0cmFpbnRHcm91cCBhcyAkcGFja2FnZXMpIHsKCmlmICgxID09PSBcY291bnQoJHBhY2thZ2VzKSkgewokdGhpcy0+a2VlcFBhY2thZ2UoJHBhY2thZ2VzWzBdLCAkaWRlbnRpY2FsRGVmaW5pdGlvbnNQZXJQYWNrYWdlLCAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXApOwpjb250aW51ZTsKfQoKCgokbGl0ZXJhbHMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGl0ZXJhbHNbXSA9ICRwYWNrYWdlLT5pZDsKfQoKZm9yZWFjaCAoJHRoaXMtPnBvbGljeS0+c2VsZWN0UHJlZmVycmVkUGFja2FnZXMoJHBvb2wsICRsaXRlcmFscykgYXMgJHByZWZlcnJlZExpdGVyYWwpIHsKJHRoaXMtPmtlZXBQYWNrYWdlKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRwcmVmZXJyZWRMaXRlcmFsKSwgJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZSwgJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwKTsKfQp9Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZURlcGVuZGVuY3lIYXNoKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogc3RyaW5nCnsKJGhhc2ggPSAnJzsKCiRoYXNoUmVsZXZhbnRMaW5rcyA9IFsKJ3JlcXVpcmVzJyA9PiAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwKJ2NvbmZsaWN0cycgPT4gJHBhY2thZ2UtPmdldENvbmZsaWN0cygpLAoncmVwbGFjZXMnID0+ICRwYWNrYWdlLT5nZXRSZXBsYWNlcygpLAoncHJvdmlkZXMnID0+ICRwYWNrYWdlLT5nZXRQcm92aWRlcygpLApdOwoKZm9yZWFjaCAoJGhhc2hSZWxldmFudExpbmtzIGFzICRrZXkgPT4gJGxpbmtzKSB7CmlmICgwID09PSBcY291bnQoJGxpbmtzKSkgewpjb250aW51ZTsKfQoKCiRoYXNoIC49ICRrZXkgLiAnOic7Cgokc3ViaGFzaCA9IFtdOwoKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CgoKCgokc3ViaGFzaFskbGluay0+Z2V0VGFyZ2V0KCldID0gKHN0cmluZykgJGxpbmstPmdldENvbnN0cmFpbnQoKTsKfQoKCmtzb3J0KCRzdWJoYXNoKTsKCmZvcmVhY2ggKCRzdWJoYXNoIGFzICR0YXJnZXQgPT4gJGNvbnN0cmFpbnQpIHsKJGhhc2ggLj0gJHRhcmdldCAuICdAJyAuICRjb25zdHJhaW50Owp9Cn0KCnJldHVybiAkaGFzaDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBtYXJrUGFja2FnZUZvclJlbW92YWwoaW50ICRpZCk6IHZvaWQKewoKaWYgKGlzc2V0KCR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzWyRpZF0pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0F0dGVtcHRlZCByZW1vdmluZyBhIHBhY2thZ2Ugd2hpY2ggd2FzIHByZXZpb3VzbHkgbWFya2VkIGlycmVtb3ZhYmxlJyk7Cn0KCiR0aGlzLT5wYWNrYWdlc1RvUmVtb3ZlWyRpZF0gPSB0cnVlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBrZWVwUGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSwgYXJyYXkgJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZSwgYXJyYXkgJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwKTogdm9pZAp7CgppZiAoIWlzc2V0KCR0aGlzLT5wYWNrYWdlc1RvUmVtb3ZlWyRwYWNrYWdlLT5pZF0pKSB7CnJldHVybjsKfQoKdW5zZXQoJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJHBhY2thZ2UtPmlkXSk7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKCgokdGhpcy0+a2VlcFBhY2thZ2UoJHBhY2thZ2UtPmdldEFsaWFzT2YoKSwgJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZSwgJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwKTsKfQoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cFskcGFja2FnZS0+aWRdWyRuYW1lXSkpIHsKJHBhY2thZ2VHcm91cFBvaW50ZXJzID0gJHBhY2thZ2VJZGVudGljYWxEZWZpbml0aW9uTG9va3VwWyRwYWNrYWdlLT5pZF1bJG5hbWVdOwokcGFja2FnZUdyb3VwID0gJGlkZW50aWNhbERlZmluaXRpb25zUGVyUGFja2FnZVskbmFtZV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydncm91cEhhc2gnXV1bJHBhY2thZ2VHcm91cFBvaW50ZXJzWydkZXBlbmRlbmN5SGFzaCddXTsKZm9yZWFjaCAoJHBhY2thZ2VHcm91cCBhcyAkcGtnKSB7CmlmICgkcGtnIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICRwa2ctPmdldFByZXR0eVZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBrZyA9ICRwa2ctPmdldEFsaWFzT2YoKTsKfQokdGhpcy0+cmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldWyRwa2ctPmdldFZlcnNpb24oKV0gPSAkcGtnLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KfQp9CgppZiAoaXNzZXQoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRwYWNrYWdlLT5pZF0pKSB7CmZvcmVhY2ggKCR0aGlzLT5hbGlhc2VzUGVyUGFja2FnZVskcGFja2FnZS0+aWRdIGFzICRhbGlhc1BhY2thZ2UpIHsKdW5zZXQoJHRoaXMtPnBhY2thZ2VzVG9SZW1vdmVbJGFsaWFzUGFja2FnZS0+aWRdKTsKCgpmb3JlYWNoICgkYWxpYXNQYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCRwYWNrYWdlSWRlbnRpY2FsRGVmaW5pdGlvbkxvb2t1cFskYWxpYXNQYWNrYWdlLT5pZF1bJG5hbWVdKSkgewokcGFja2FnZUdyb3VwUG9pbnRlcnMgPSAkcGFja2FnZUlkZW50aWNhbERlZmluaXRpb25Mb29rdXBbJGFsaWFzUGFja2FnZS0+aWRdWyRuYW1lXTsKJHBhY2thZ2VHcm91cCA9ICRpZGVudGljYWxEZWZpbml0aW9uc1BlclBhY2thZ2VbJG5hbWVdWyRwYWNrYWdlR3JvdXBQb2ludGVyc1snZ3JvdXBIYXNoJ11dWyRwYWNrYWdlR3JvdXBQb2ludGVyc1snZGVwZW5kZW5jeUhhc2gnXV07CmZvcmVhY2ggKCRwYWNrYWdlR3JvdXAgYXMgJHBrZykgewppZiAoJHBrZyBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGtnLT5nZXRQcmV0dHlWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiRwa2cgPSAkcGtnLT5nZXRBbGlhc09mKCk7Cn0KJHRoaXMtPnJlbW92ZWRWZXJzaW9uc0J5UGFja2FnZVtzcGxfb2JqZWN0X2hhc2goJGFsaWFzUGFja2FnZSldWyRwa2ctPmdldFZlcnNpb24oKV0gPSAkcGtnLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KfQp9Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gb3B0aW1pemVJbXBvc3NpYmxlUGFja2FnZXNBd2F5KFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiB2b2lkCnsKaWYgKFxjb3VudCgkcmVxdWVzdC0+Z2V0TG9ja2VkUGFja2FnZXMoKSkgPT09IDApIHsKcmV0dXJuOwp9CgokcGFja2FnZUluZGV4ID0gW107Cgpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokaWQgPSAkcGFja2FnZS0+aWQ7CgoKaWYgKGlzc2V0KCR0aGlzLT5pcnJlbW92YWJsZVBhY2thZ2VzWyRpZF0pKSB7CmNvbnRpbnVlOwp9CgppZiAoaXNzZXQoJHRoaXMtPmFsaWFzZXNQZXJQYWNrYWdlWyRpZF0pIHx8ICRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmNvbnRpbnVlOwp9CgppZiAoJHJlcXVlc3QtPmlzRml4ZWRQYWNrYWdlKCRwYWNrYWdlKSB8fCAkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpjb250aW51ZTsKfQoKJHBhY2thZ2VJbmRleFskcGFja2FnZS0+Z2V0TmFtZSgpXVskcGFja2FnZS0+aWRdID0gJHBhY2thZ2U7Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKJGlzVW51c2VkUGFja2FnZSA9IHRydWU7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJHBhY2thZ2VOYW1lKSB7CmlmIChpc3NldCgkdGhpcy0+cmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZU5hbWVdKSkgewokaXNVbnVzZWRQYWNrYWdlID0gZmFsc2U7CmJyZWFrOwp9Cn0KCmlmICgkaXNVbnVzZWRQYWNrYWdlKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewokcmVxdWlyZSA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKaWYgKCFpc3NldCgkcGFja2FnZUluZGV4WyRyZXF1aXJlXSkpIHsKY29udGludWU7Cn0KCiRsaW5rQ29uc3RyYWludCA9ICRsaW5rLT5nZXRDb25zdHJhaW50KCk7CmZvcmVhY2ggKCRwYWNrYWdlSW5kZXhbJHJlcXVpcmVdIGFzICRpZCA9PiAkcmVxdWlyZWRQa2cpIHsKaWYgKGZhbHNlID09PSBDb21waWxpbmdNYXRjaGVyOjptYXRjaCgkbGlua0NvbnN0cmFpbnQsIENvbnN0cmFpbnQ6Ok9QX0VRLCAkcmVxdWlyZWRQa2ctPmdldFZlcnNpb24oKSkpIHsKJHRoaXMtPm1hcmtQYWNrYWdlRm9yUmVtb3ZhbCgkaWQpOwp1bnNldCgkcGFja2FnZUluZGV4WyRyZXF1aXJlXVskaWRdKTsKfQp9Cn0KfQp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0UmVxdWlyZUNvbnN0cmFpbnRzUGVyUGFja2FnZShzdHJpbmcgJHBhY2thZ2UsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKZm9yZWFjaCAoJHRoaXMtPmV4cGFuZERpc2p1bmN0aXZlTXVsdGlDb25zdHJhaW50cygkY29uc3RyYWludCkgYXMgJGV4cGFuZGVkKSB7CiR0aGlzLT5yZXF1aXJlQ29uc3RyYWludHNQZXJQYWNrYWdlWyRwYWNrYWdlXVsoc3RyaW5nKSAkZXhwYW5kZWRdID0gJGV4cGFuZGVkOwp9Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RDb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZShzdHJpbmcgJHBhY2thZ2UsIENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQpCnsKZm9yZWFjaCAoJHRoaXMtPmV4cGFuZERpc2p1bmN0aXZlTXVsdGlDb25zdHJhaW50cygkY29uc3RyYWludCkgYXMgJGV4cGFuZGVkKSB7CiR0aGlzLT5jb25mbGljdENvbnN0cmFpbnRzUGVyUGFja2FnZVskcGFja2FnZV1bKHN0cmluZykgJGV4cGFuZGVkXSA9ICRleHBhbmRlZDsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4cGFuZERpc2p1bmN0aXZlTXVsdGlDb25zdHJhaW50cyhDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50KQp7CiRjb25zdHJhaW50ID0gSW50ZXJ2YWxzOjpjb21wYWN0Q29uc3RyYWludCgkY29uc3RyYWludCk7CgppZiAoJGNvbnN0cmFpbnQgaW5zdGFuY2VvZiBNdWx0aUNvbnN0cmFpbnQgJiYgJGNvbnN0cmFpbnQtPmlzRGlzanVuY3RpdmUoKSkgewoKCnJldHVybiAkY29uc3RyYWludC0+Z2V0Q29uc3RyYWludHMoKTsKfQoKCnJldHVybiBbJGNvbnN0cmFpbnRdOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XExvY2tBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNdWx0aUNvbnN0cmFpbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgoKCmNsYXNzIFByb2JsZW0KewoKCgoKcHJvdGVjdGVkICRyZWFzb25TZWVuOwoKCgoKCnByb3RlY3RlZCAkcmVhc29ucyA9IFtdOwoKCnByb3RlY3RlZCAkc2VjdGlvbiA9IDA7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSdWxlKFJ1bGUgJHJ1bGUpOiB2b2lkCnsKJHRoaXMtPmFkZFJlYXNvbihzcGxfb2JqZWN0X2hhc2goJHJ1bGUpLCAkcnVsZSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlYXNvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlYXNvbnM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoUmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCwgUmVxdWVzdCAkcmVxdWVzdCwgUG9vbCAkcG9vbCwgYm9vbCAkaXNWZXJib3NlLCBhcnJheSAkaW5zdGFsbGVkTWFwID0gW10sIGFycmF5ICRsZWFybmVkUG9vbCA9IFtdKTogc3RyaW5nCnsKCiRyZWFzb25zID0gYXJyYXlfbWVyZ2UoLi4uYXJyYXlfcmV2ZXJzZSgkdGhpcy0+cmVhc29ucykpOwoKaWYgKFxjb3VudCgkcmVhc29ucykgPT09IDEpIHsKcmVzZXQoJHJlYXNvbnMpOwokcnVsZSA9IGN1cnJlbnQoJHJlYXNvbnMpOwoKaWYgKCRydWxlLT5nZXRSZWFzb24oKSAhPT0gUnVsZTo6UlVMRV9ST09UX1JFUVVJUkUpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigiU2luZ2xlIHJlYXNvbiBwcm9ibGVtcyBtdXN0IGNvbnRhaW4gYSByb290IHJlcXVpcmUgcnVsZS4iKTsKfQoKJHJlYXNvbkRhdGEgPSAkcnVsZS0+Z2V0UmVhc29uRGF0YSgpOwokcGFja2FnZU5hbWUgPSAkcmVhc29uRGF0YVsncGFja2FnZU5hbWUnXTsKJGNvbnN0cmFpbnQgPSAkcmVhc29uRGF0YVsnY29uc3RyYWludCddOwoKJHBhY2thZ2VzID0gJHBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKaWYgKFxjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CnJldHVybiAiXG4gICAgIi5pbXBsb2RlKHNlbGY6OmdldE1pc3NpbmdQYWNrYWdlUmVhc29uKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UsICRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpKTsKfQp9Cgp1c29ydCgkcmVhc29ucywgZnVuY3Rpb24gKFJ1bGUgJHJ1bGUxLCBSdWxlICRydWxlMikgdXNlICgkcG9vbCkgewokcnVsZTFQcmlvID0gJHRoaXMtPmdldFJ1bGVQcmlvcml0eSgkcnVsZTEpOwokcnVsZTJQcmlvID0gJHRoaXMtPmdldFJ1bGVQcmlvcml0eSgkcnVsZTIpOwppZiAoJHJ1bGUxUHJpbyAhPT0gJHJ1bGUyUHJpbykgewpyZXR1cm4gJHJ1bGUyUHJpbyAtICRydWxlMVByaW87Cn0KCnJldHVybiAkdGhpcy0+Z2V0U29ydGFibGVTdHJpbmcoJHBvb2wsICRydWxlMSkgPD0+ICR0aGlzLT5nZXRTb3J0YWJsZVN0cmluZygkcG9vbCwgJHJ1bGUyKTsKfSk7CgpyZXR1cm4gc2VsZjo6Zm9ybWF0RGVkdXBsaWNhdGVkUnVsZXMoJHJlYXNvbnMsICcgICAgJywgJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCwgJGlzVmVyYm9zZSwgJGluc3RhbGxlZE1hcCwgJGxlYXJuZWRQb29sKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTb3J0YWJsZVN0cmluZyhQb29sICRwb29sLCBSdWxlICRydWxlKTogc3RyaW5nCnsKc3dpdGNoICgkcnVsZS0+Z2V0UmVhc29uKCkpIHsKY2FzZSBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRToKcmV0dXJuICRydWxlLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ107CmNhc2UgUnVsZTo6UlVMRV9GSVhFRDoKcmV0dXJuIChzdHJpbmcpICRydWxlLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2UnXTsKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1Q6CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTOgpyZXR1cm4gJHJ1bGUtPmdldFNvdXJjZVBhY2thZ2UoJHBvb2wpIC4gJy8vJyAuICRydWxlLT5nZXRSZWFzb25EYXRhKCktPmdldFByZXR0eVN0cmluZygkcnVsZS0+Z2V0U291cmNlUGFja2FnZSgkcG9vbCkpOwpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9TQU1FX05BTUU6CmNhc2UgUnVsZTo6UlVMRV9QQUNLQUdFX0FMSUFTOgpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9JTlZFUlNFX0FMSUFTOgpyZXR1cm4gKHN0cmluZykgJHJ1bGUtPmdldFJlYXNvbkRhdGEoKTsKY2FzZSBSdWxlOjpSVUxFX0xFQVJORUQ6CnJldHVybiBpbXBsb2RlKCctJywgJHJ1bGUtPmdldExpdGVyYWxzKCkpOwp9CgoKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVW5rbm93biBydWxlIHR5cGU6ICcuJHJ1bGUtPmdldFJlYXNvbigpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSdWxlUHJpb3JpdHkoUnVsZSAkcnVsZSk6IGludAp7CnN3aXRjaCAoJHJ1bGUtPmdldFJlYXNvbigpKSB7CmNhc2UgUnVsZTo6UlVMRV9GSVhFRDoKcmV0dXJuIDM7CmNhc2UgUnVsZTo6UlVMRV9ST09UX1JFUVVJUkU6CnJldHVybiAyOwpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9DT05GTElDVDoKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVM6CnJldHVybiAxOwpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9TQU1FX05BTUU6CmNhc2UgUnVsZTo6UlVMRV9MRUFSTkVEOgpjYXNlIFJ1bGU6OlJVTEVfUEFDS0FHRV9BTElBUzoKY2FzZSBSdWxlOjpSVUxFX1BBQ0tBR0VfSU5WRVJTRV9BTElBUzoKcmV0dXJuIDA7Cn0KCgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdVbmtub3duIHJ1bGUgdHlwZTogJy4kcnVsZS0+Z2V0UmVhc29uKCkpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdERlZHVwbGljYXRlZFJ1bGVzKGFycmF5ICRydWxlcywgc3RyaW5nICRpbmRlbnQsIFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgYXJyYXkgJGluc3RhbGxlZE1hcCA9IFtdLCBhcnJheSAkbGVhcm5lZFBvb2wgPSBbXSk6IHN0cmluZwp7CiRtZXNzYWdlcyA9IFtdOwokdGVtcGxhdGVzID0gW107CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJGRlZHVwbGljYXRhYmxlUnVsZVR5cGVzID0gW1J1bGU6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUywgUnVsZTo6UlVMRV9QQUNLQUdFX0NPTkZMSUNUXTsKZm9yZWFjaCAoJHJ1bGVzIGFzICRydWxlKSB7CiRtZXNzYWdlID0gJHJ1bGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlLCAkaW5zdGFsbGVkTWFwLCAkbGVhcm5lZFBvb2wpOwppZiAoaW5fYXJyYXkoJHJ1bGUtPmdldFJlYXNvbigpLCAkZGVkdXBsaWNhdGFibGVSdWxlVHlwZXMsIHRydWUpICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD9QPHBhY2thZ2U+XFMrKSAoP1A8dmVyc2lvbj5cUyspICg/UDx0eXBlPnJlcXVpcmVzfGNvbmZsaWN0cyl9JywgJG1lc3NhZ2UsICRtKSkgewokbWVzc2FnZSA9IHN0cl9yZXBsYWNlKCclJywgJyUlJywgJG1lc3NhZ2UpOwokdGVtcGxhdGUgPSBQcmVnOjpyZXBsYWNlKCd7XlxTKyBcUysgfScsICclcyVzICcsICRtZXNzYWdlKTsKJG1lc3NhZ2VzW10gPSAkdGVtcGxhdGU7CiR0ZW1wbGF0ZXNbJHRlbXBsYXRlXVskbVsxXV1bJHBhcnNlci0+bm9ybWFsaXplKCRtWzJdKV0gPSAkbVsyXTsKJHNvdXJjZVBhY2thZ2UgPSAkcnVsZS0+Z2V0U291cmNlUGFja2FnZSgkcG9vbCk7CmZvcmVhY2ggKCRwb29sLT5nZXRSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Uoc3BsX29iamVjdF9oYXNoKCRzb3VyY2VQYWNrYWdlKSkgYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKJHRlbXBsYXRlc1skdGVtcGxhdGVdWyRtWzFdXVskdmVyc2lvbl0gPSAkcHJldHR5VmVyc2lvbjsKfQp9IGVsc2VpZiAoJG1lc3NhZ2UgIT09ICcnKSB7CiRtZXNzYWdlc1tdID0gJG1lc3NhZ2U7Cn0KfQoKJHJlc3VsdCA9IFtdOwpmb3JlYWNoIChhcnJheV91bmlxdWUoJG1lc3NhZ2VzKSBhcyAkbWVzc2FnZSkgewppZiAoaXNzZXQoJHRlbXBsYXRlc1skbWVzc2FnZV0pKSB7CmZvcmVhY2ggKCR0ZW1wbGF0ZXNbJG1lc3NhZ2VdIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9ucykgewp1a3NvcnQoJHZlcnNpb25zLCAndmVyc2lvbl9jb21wYXJlJyk7CmlmICghJGlzVmVyYm9zZSkgewokdmVyc2lvbnMgPSBzZWxmOjpjb25kZW5zZVZlcnNpb25MaXN0KCR2ZXJzaW9ucywgMSk7Cn0KaWYgKFxjb3VudCgkdmVyc2lvbnMpID4gMSkgewoKJG1lc3NhZ2UgPSBQcmVnOjpyZXBsYWNlKCd7XiglcyVzICg/OnJlcXVpcmV8Y29uZmxpY3QpKXN9JywgJyQxJywgJG1lc3NhZ2UpOwokcmVzdWx0W10gPSBzcHJpbnRmKCRtZXNzYWdlLCAkcGFja2FnZSwgJ1snLmltcGxvZGUoJywgJywgJHZlcnNpb25zKS4nXScpOwp9IGVsc2UgewokcmVzdWx0W10gPSBzcHJpbnRmKCRtZXNzYWdlLCAkcGFja2FnZSwgJyAnLnJlc2V0KCR2ZXJzaW9ucykpOwp9Cn0KfSBlbHNlIHsKJHJlc3VsdFtdID0gJG1lc3NhZ2U7Cn0KfQoKcmV0dXJuICJcbiRpbmRlbnQtICIuaW1wbG9kZSgiXG4kaW5kZW50LSAiLCAkcmVzdWx0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzQ2F1c2VkQnlMb2NrKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wpOiBib29sCnsKZm9yZWFjaCAoJHRoaXMtPnJlYXNvbnMgYXMgJHNlY3Rpb25SdWxlcykgewpmb3JlYWNoICgkc2VjdGlvblJ1bGVzIGFzICRydWxlKSB7CmlmICgkcnVsZS0+aXNDYXVzZWRCeUxvY2soJHJlcG9zaXRvcnlTZXQsICRyZXF1ZXN0LCAkcG9vbCkpIHsKcmV0dXJuIHRydWU7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhZGRSZWFzb24oc3RyaW5nICRpZCwgUnVsZSAkcmVhc29uKTogdm9pZAp7CgoKCmlmICghaXNzZXQoJHRoaXMtPnJlYXNvblNlZW5bJGlkXSkpIHsKJHRoaXMtPnJlYXNvblNlZW5bJGlkXSA9IHRydWU7CiR0aGlzLT5yZWFzb25zWyR0aGlzLT5zZWN0aW9uXVtdID0gJHJlYXNvbjsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gbmV4dFNlY3Rpb24oKTogdm9pZAp7CiR0aGlzLT5zZWN0aW9uKys7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1pc3NpbmdQYWNrYWdlUmVhc29uKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgc3RyaW5nICRwYWNrYWdlTmFtZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZU5hbWUpKSB7CgppZiAoMCA9PT0gc3RyaXBvcygkcGFja2FnZU5hbWUsICdwaHAnKSB8fCAkcGFja2FnZU5hbWUgPT09ICdoaHZtJykgewokdmVyc2lvbiA9IHNlbGY6OmdldFBsYXRmb3JtUGFja2FnZVZlcnNpb24oJHBvb2wsICRwYWNrYWdlTmFtZSwgcGhwdmVyc2lvbigpKTsKCiRtc2cgPSAiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgIi4kcGFja2FnZU5hbWUuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJyBidXQgJzsKCmlmIChkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSB8fCAoJHBhY2thZ2VOYW1lID09PSAnaGh2bScgJiYgY291bnQoJHBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUpKSA+IDApKSB7CnJldHVybiBbJG1zZywgJ3lvdXIgSEhWTSB2ZXJzaW9uIGRvZXMgbm90IHNhdGlzZnkgdGhhdCByZXF1aXJlbWVudC4nXTsKfQoKaWYgKCRwYWNrYWdlTmFtZSA9PT0gJ2hodm0nKSB7CnJldHVybiBbJG1zZywgJ0hIVk0gd2FzIG5vdCBkZXRlY3RlZCBvbiB0aGlzIG1hY2hpbmUsIG1ha2Ugc3VyZSBpdCBpcyBpbiB5b3VyIFBBVEguJ107Cn0KCmlmIChudWxsID09PSAkdmVyc2lvbikgewpyZXR1cm4gWyRtc2csICd0aGUgJy4kcGFja2FnZU5hbWUuJyBwYWNrYWdlIGlzIGRpc2FibGVkIGJ5IHlvdXIgcGxhdGZvcm0gY29uZmlnLiBFbmFibGUgaXQgYWdhaW4gd2l0aCAiY29tcG9zZXIgY29uZmlnIHBsYXRmb3JtLicuJHBhY2thZ2VOYW1lLicgLS11bnNldCIuJ107Cn0KCnJldHVybiBbJG1zZywgJ3lvdXIgJy4kcGFja2FnZU5hbWUuJyB2ZXJzaW9uICgnLiAkdmVyc2lvbiAuJykgZG9lcyBub3Qgc2F0aXNmeSB0aGF0IHJlcXVpcmVtZW50LiddOwp9CgoKaWYgKDAgPT09IHN0cmlwb3MoJHBhY2thZ2VOYW1lLCAnZXh0LScpKSB7CmlmIChmYWxzZSAhPT0gc3RycG9zKCRwYWNrYWdlTmFtZSwgJyAnKSkgewpyZXR1cm4gWyctICcsICJQSFAgZXh0ZW5zaW9uICIuJHBhY2thZ2VOYW1lLicgc2hvdWxkIGJlIHJlcXVpcmVkIGFzICcuc3RyX3JlcGxhY2UoJyAnLCAnLScsICRwYWNrYWdlTmFtZSkuJy4nXTsKfQoKJGV4dCA9IHN1YnN0cigkcGFja2FnZU5hbWUsIDQpOwokbXNnID0gIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzIFBIUCBleHRlbnNpb24gIi4kcGFja2FnZU5hbWUuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJyBidXQgJzsKCiR2ZXJzaW9uID0gc2VsZjo6Z2V0UGxhdGZvcm1QYWNrYWdlVmVyc2lvbigkcG9vbCwgJHBhY2thZ2VOYW1lLCBwaHB2ZXJzaW9uKCRleHQpID09PSBmYWxzZSA/ICcwJyA6IHBocHZlcnNpb24oJGV4dCkpOwppZiAobnVsbCA9PT0gJHZlcnNpb24pIHsKJHByb3ZpZGVyc1N0ciA9IHNlbGY6OmdldFByb3ZpZGVyc0xpc3QoJHJlcG9zaXRvcnlTZXQsICRwYWNrYWdlTmFtZSwgNSk7CmlmICgkcHJvdmlkZXJzU3RyICE9PSBudWxsKSB7CiRwcm92aWRlcnNTdHIgPSAiXG5cbiAgICAgIEFsdGVybmF0aXZlbHkgeW91IGNhbiByZXF1aXJlIG9uZSBvZiB0aGVzZSBwYWNrYWdlcyB0aGF0IHByb3ZpZGUgdGhlIGV4dGVuc2lvbiAob3IgcGFydHMgb2YgaXQpOlxuIi4KIiAgICAgIDx3YXJuaW5nPktlZXAgaW4gbWluZCB0aGF0IHRoZSBzdWdnZXN0aW9ucyBhcmUgYXV0b21hdGVkIGFuZCBtYXkgbm90IGJlIHZhbGlkIG9yIHNhZmUgdG8gdXNlPC93YXJuaW5nPlxuJHByb3ZpZGVyc1N0ciI7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCRleHQpKSB7CnJldHVybiBbCiRtc2csCid0aGUgJy4kcGFja2FnZU5hbWUuJyBwYWNrYWdlIGlzIGRpc2FibGVkIGJ5IHlvdXIgcGxhdGZvcm0gY29uZmlnLiBFbmFibGUgaXQgYWdhaW4gd2l0aCAiY29tcG9zZXIgY29uZmlnIHBsYXRmb3JtLicuJHBhY2thZ2VOYW1lLicgLS11bnNldCIuJyAuICRwcm92aWRlcnNTdHIsCl07Cn0KCnJldHVybiBbJG1zZywgJ2l0IGlzIG1pc3NpbmcgZnJvbSB5b3VyIHN5c3RlbS4gSW5zdGFsbCBvciBlbmFibGUgUEhQXCdzICcuJGV4dC4nIGV4dGVuc2lvbi4nIC4gJHByb3ZpZGVyc1N0cl07Cn0KCnJldHVybiBbJG1zZywgJ2l0IGhhcyB0aGUgd3JvbmcgdmVyc2lvbiBpbnN0YWxsZWQgKCcuJHZlcnNpb24uJykuJ107Cn0KCgppZiAoMCA9PT0gc3RyaXBvcygkcGFja2FnZU5hbWUsICdsaWItJykpIHsKaWYgKHN0cnRvbG93ZXIoJHBhY2thZ2VOYW1lKSA9PT0gJ2xpYi1pY3UnKSB7CiRlcnJvciA9IGV4dGVuc2lvbl9sb2FkZWQoJ2ludGwnKSA/ICdpdCBoYXMgdGhlIHdyb25nIHZlcnNpb24gaW5zdGFsbGVkLCB0cnkgdXBncmFkaW5nIHRoZSBpbnRsIGV4dGVuc2lvbi4nIDogJ2l0IGlzIG1pc3NpbmcgZnJvbSB5b3VyIHN5c3RlbSwgbWFrZSBzdXJlIHRoZSBpbnRsIGV4dGVuc2lvbiBpcyBsb2FkZWQuJzsKCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzIGxpbmtlZCBsaWJyYXJ5ICIuJHBhY2thZ2VOYW1lLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpLicgYnV0ICcsICRlcnJvcl07Cn0KCiRwcm92aWRlcnNTdHIgPSBzZWxmOjpnZXRQcm92aWRlcnNMaXN0KCRyZXBvc2l0b3J5U2V0LCAkcGFja2FnZU5hbWUsIDUpOwppZiAoJHByb3ZpZGVyc1N0ciAhPT0gbnVsbCkgewokcHJvdmlkZXJzU3RyID0gIlxuXG4gICAgICBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcmVxdWlyZSBvbmUgb2YgdGhlc2UgcGFja2FnZXMgdGhhdCBwcm92aWRlIHRoZSBsaWJyYXJ5IChvciBwYXJ0cyBvZiBpdCk6XG4iLgoiICAgICAgPHdhcm5pbmc+S2VlcCBpbiBtaW5kIHRoYXQgdGhlIHN1Z2dlc3Rpb25zIGFyZSBhdXRvbWF0ZWQgYW5kIG1heSBub3QgYmUgdmFsaWQgb3Igc2FmZSB0byB1c2U8L3dhcm5pbmc+XG4kcHJvdmlkZXJzU3RyIjsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgbGlua2VkIGxpYnJhcnkgIi4kcGFja2FnZU5hbWUuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkuJyBidXQgJywgJ2l0IGhhcyB0aGUgd3JvbmcgdmVyc2lvbiBpbnN0YWxsZWQgb3IgaXMgbWlzc2luZyBmcm9tIHlvdXIgc3lzdGVtLCBtYWtlIHN1cmUgdG8gbG9hZCB0aGUgZXh0ZW5zaW9uIHByb3ZpZGluZyBpdC4nLiRwcm92aWRlcnNTdHJdOwp9Cn0KCiRsb2NrZWRQYWNrYWdlID0gbnVsbDsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldExvY2tlZFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICRwYWNrYWdlTmFtZSkgewokbG9ja2VkUGFja2FnZSA9ICRwYWNrYWdlOwppZiAoJHBvb2wtPmlzVW5hY2NlcHRhYmxlRml4ZWRPckxvY2tlZFBhY2thZ2UoJHBhY2thZ2UpKSB7CnJldHVybiBbIi0gIiwgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIGZpeGVkIHRvICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4nIChsb2NrIGZpbGUgdmVyc2lvbikgYnkgYSBwYXJ0aWFsIHVwZGF0ZSBidXQgdGhhdCB2ZXJzaW9uIGlzIHJlamVjdGVkIGJ5IHlvdXIgbWluaW11bS1zdGFiaWxpdHkuIE1ha2Ugc3VyZSB5b3UgbGlzdCBpdCBhcyBhbiBhcmd1bWVudCBmb3IgdGhlIHVwZGF0ZSBjb21tYW5kLiddOwp9CmJyZWFrOwp9Cn0KCmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIENvbnN0cmFpbnQgJiYgJGNvbnN0cmFpbnQtPmdldE9wZXJhdG9yKCkgPT09IENvbnN0cmFpbnQ6OlNUUl9PUF9FUSAmJiBQcmVnOjppc01hdGNoKCd7XmRldi0uKiMuKn0nLCAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkpKSB7CiRuZXdDb25zdHJhaW50ID0gUHJlZzo6cmVwbGFjZSgneyArYXMgKyhbXixcc3xdKykkfScsICcnLCAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkpOwokcGFja2FnZXMgPSAkcmVwb3NpdG9yeVNldC0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlTmFtZSwgbmV3IE11bHRpQ29uc3RyYWludChbCm5ldyBDb25zdHJhaW50KENvbnN0cmFpbnQ6OlNUUl9PUF9FUSwgJG5ld0NvbnN0cmFpbnQpLApuZXcgQ29uc3RyYWludChDb25zdHJhaW50OjpTVFJfT1BfRVEsIHN0cl9yZXBsYWNlKCcjJywgJysnLCAkbmV3Q29uc3RyYWludCkpLApdLCBmYWxzZSkpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJy4gVGhlICMgY2hhcmFjdGVyIGluIGJyYW5jaCBuYW1lcyBpcyByZXBsYWNlZCBieSBhICsgY2hhcmFjdGVyLiBNYWtlIHN1cmUgdG8gcmVxdWlyZSBpdCBhcyAiJy5zdHJfcmVwbGFjZSgnIycsICcrJywgJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpKS4nIi4nXTsKfQp9CgoKCiRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCk7CmlmIChcY291bnQoJHBhY2thZ2VzKSA+IDApIHsKJHJvb3RSZXFzID0gJHJlcG9zaXRvcnlTZXQtPmdldFJvb3RSZXF1aXJlcygpOwppZiAoaXNzZXQoJHJvb3RSZXFzWyRwYWNrYWdlTmFtZV0pKSB7CiRmaWx0ZXJlZCA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHApIHVzZSAoJHJvb3RSZXFzLCAkcGFja2FnZU5hbWUpOiBib29sIHsKcmV0dXJuICRyb290UmVxc1skcGFja2FnZU5hbWVdLT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwLT5nZXRWZXJzaW9uKCkpKTsKfSk7CmlmICgwID09PSBjb3VudCgkZmlsdGVyZWQpKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJy4oc2VsZjo6aGFzTXVsdGlwbGVOYW1lcygkcGFja2FnZXMpID8gJ3RoZXNlIGNvbmZsaWN0JyA6ICdpdCBjb25mbGljdHMnKS4nIHdpdGggeW91ciByb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZSAoJy4kcm9vdFJlcXNbJHBhY2thZ2VOYW1lXS0+Z2V0UHJldHR5U3RyaW5nKCkuJykuJ107Cn0KfQoKJHRlbXBSZXFzID0gJHJlcG9zaXRvcnlTZXQtPmdldFRlbXBvcmFyeUNvbnN0cmFpbnRzKCk7CmZvcmVhY2ggKHJlc2V0KCRwYWNrYWdlcyktPmdldE5hbWVzKCkgYXMgJG5hbWUpIHsKaWYgKGlzc2V0KCR0ZW1wUmVxc1skbmFtZV0pKSB7CiRmaWx0ZXJlZCA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHApIHVzZSAoJHRlbXBSZXFzLCAkbmFtZSk6IGJvb2wgewpyZXR1cm4gJHRlbXBSZXFzWyRuYW1lXS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcC0+Z2V0VmVyc2lvbigpKSk7Cn0pOwppZiAoMCA9PT0gY291bnQoJGZpbHRlcmVkKSkgewpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkbmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJy4oc2VsZjo6aGFzTXVsdGlwbGVOYW1lcygkcGFja2FnZXMpID8gJ3RoZXNlIGNvbmZsaWN0JyA6ICdpdCBjb25mbGljdHMnKS4nIHdpdGggeW91ciB0ZW1wb3JhcnkgdXBkYXRlIGNvbnN0cmFpbnQgKCcuJG5hbWUuJzonLiR0ZW1wUmVxc1skbmFtZV0tPmdldFByZXR0eVN0cmluZygpLicpLiddOwp9Cn0KfQoKaWYgKCRsb2NrZWRQYWNrYWdlICE9PSBudWxsKSB7CiRmaXhlZENvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkbG9ja2VkUGFja2FnZS0+Z2V0VmVyc2lvbigpKTsKJGZpbHRlcmVkID0gYXJyYXlfZmlsdGVyKCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkcCkgdXNlICgkZml4ZWRDb25zdHJhaW50KTogYm9vbCB7CnJldHVybiAkZml4ZWRDb25zdHJhaW50LT5tYXRjaGVzKG5ldyBDb25zdHJhaW50KCc9PScsICRwLT5nZXRWZXJzaW9uKCkpKTsKfSk7CmlmICgwID09PSBjb3VudCgkZmlsdGVyZWQpKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgdGhlIHBhY2thZ2UgaXMgZml4ZWQgdG8gJy4kbG9ja2VkUGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLicgKGxvY2sgZmlsZSB2ZXJzaW9uKSBieSBhIHBhcnRpYWwgdXBkYXRlIGFuZCB0aGF0IHZlcnNpb24gZG9lcyBub3QgbWF0Y2guIE1ha2Ugc3VyZSB5b3UgbGlzdCBpdCBhcyBhbiBhcmd1bWVudCBmb3IgdGhlIHVwZGF0ZSBjb21tYW5kLiddOwp9Cn0KCiRub25Mb2NrZWRQYWNrYWdlcyA9IGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHApOiBib29sIHsKcmV0dXJuICEkcC0+Z2V0UmVwb3NpdG9yeSgpIGluc3RhbmNlb2YgTG9ja0FycmF5UmVwb3NpdG9yeTsKfSk7CgppZiAoMCA9PT0gXGNvdW50KCRub25Mb2NrZWRQYWNrYWdlcykpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGluIHRoZSBsb2NrIGZpbGUgYnV0IG5vdCBpbiByZW1vdGUgcmVwb3NpdG9yaWVzLCBtYWtlIHN1cmUgeW91IGF2b2lkIHVwZGF0aW5nIHRoaXMgcGFja2FnZSB0byBrZWVwIHRoZSBvbmUgZnJvbSB0aGUgbG9jayBmaWxlLiddOwp9CgppZiAoJHBvb2wtPmlzQWJhbmRvbmVkUmVtb3ZlZFBhY2thZ2VWZXJzaW9uKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpKSB7CnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgdGhlc2Ugd2VyZSBub3QgbG9hZGVkLCBiZWNhdXNlIHRoZXkgYXJlIGFiYW5kb25lZCBhbmQgeW91IGNvbmZpZ3VyZWQgImJsb2NrLWFiYW5kb25lZCIgdG8gdHJ1ZSBpbiB5b3VyICJhdWRpdCIgY29uZmlnLiddOwp9CgppZiAoJHBvb2wtPmlzU2VjdXJpdHlSZW1vdmVkUGFja2FnZVZlcnNpb24oJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpIHsKJGFkdmlzb3JpZXMgPSAkcmVwb3NpdG9yeVNldC0+Z2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VzLCBmYWxzZSwgdHJ1ZSk7CmlmIChpc3NldCgkYWR2aXNvcmllc1snYWR2aXNvcmllcyddWyRwYWNrYWdlTmFtZV0pICYmIFxjb3VudCgkYWR2aXNvcmllc1snYWR2aXNvcmllcyddWyRwYWNrYWdlTmFtZV0pID4gMCkgewokYWR2aXNvcmllc0xpc3QgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChTZWN1cml0eUFkdmlzb3J5ICRhZHZpc29yeSk6IHN0cmluZyB7CmlmICgkYWR2aXNvcnktPmxpbmsgIT09IG51bGwgJiYgJGFkdmlzb3J5LT5saW5rICE9PSAnJykgewpyZXR1cm4gJzxocmVmPScuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJGFkdmlzb3J5LT5saW5rKS4nPicuJGFkdmlzb3J5LT5hZHZpc29yeUlkLic8Lz4nOwp9CgppZiAoc3RyX3N0YXJ0c193aXRoKCRhZHZpc29yeS0+YWR2aXNvcnlJZCwgJ1BLU0EtJykpIHsKcmV0dXJuICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCdodHRwczovL3BhY2thZ2lzdC5vcmcvc2VjdXJpdHktYWR2aXNvcmllcy8nLiRhZHZpc29yeS0+YWR2aXNvcnlJZCkuJz4nLiRhZHZpc29yeS0+YWR2aXNvcnlJZC4nPC8+JzsKfQoKcmV0dXJuICRhZHZpc29yeS0+YWR2aXNvcnlJZDsKfSwgJGFkdmlzb3JpZXNbJ2Fkdmlzb3JpZXMnXVskcGFja2FnZU5hbWVdKTsKfSBlbHNlIHsKJGFkdmlzb3JpZXNMaXN0ID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICRhZHZpc29yeUlkKTogc3RyaW5nIHsKaWYgKHN0cl9zdGFydHNfd2l0aCgkYWR2aXNvcnlJZCwgJ1BLU0EtJykpIHsKcmV0dXJuICc8aHJlZj0nLk91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCdodHRwczovL3BhY2thZ2lzdC5vcmcvc2VjdXJpdHktYWR2aXNvcmllcy8nLiRhZHZpc29yeUlkKS4nPicuJGFkdmlzb3J5SWQuJzwvPic7Cn0KCnJldHVybiAkYWR2aXNvcnlJZDsKfSwgJHBvb2wtPmdldFNlY3VyaXR5QWR2aXNvcnlJZGVudGlmaWVyc0ZvclBhY2thZ2VWZXJzaW9uKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpKTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCB0aGVzZSB3ZXJlIG5vdCBsb2FkZWQsIGJlY2F1c2UgdGhleSBhcmUgYWZmZWN0ZWQgYnkgc2VjdXJpdHkgYWR2aXNvcmllcyAoIicgLiBpbXBsb2RlKCciLCAiJywgJGFkdmlzb3JpZXNMaXN0KS4gJyIpLiBHbyB0byBodHRwczovL3BhY2thZ2lzdC5vcmcvc2VjdXJpdHktYWR2aXNvcmllcy8gdG8gZmluZCBhZHZpc29yeSBkZXRhaWxzLiBUbyBpZ25vcmUgdGhlIGFkdmlzb3JpZXMsIGFkZCB0aGVtIHRvIHRoZSBhdWRpdCAiaWdub3JlIiBjb25maWcuIFRvIHR1cm4gdGhlIGZlYXR1cmUgb2ZmIGVudGlyZWx5LCB5b3UgY2FuIHNldCAiYmxvY2staW5zZWN1cmUiIHRvIGZhbHNlIGluIHlvdXIgImF1ZGl0IiBjb25maWcuJ107Cn0KCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgdGhlc2Ugd2VyZSBub3QgbG9hZGVkLCBsaWtlbHkgYmVjYXVzZSAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhleSBjb25mbGljdCcgOiAnaXQgY29uZmxpY3RzJykuJyB3aXRoIGFub3RoZXIgcmVxdWlyZS4nXTsKfQoKCiRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCwgUmVwb3NpdG9yeVNldDo6QUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTKTsKaWYgKFxjb3VudCgkcGFja2FnZXMpID4gMCkgewoKJGFsbFJlcG9zUGFja2FnZXMgPSAkcmVwb3NpdG9yeVNldC0+ZmluZFBhY2thZ2VzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQsIFJlcG9zaXRvcnlTZXQ6OkFMTE9XX1NIQURPV0VEX1JFUE9TSVRPUklFUyk7CmlmIChcY291bnQoJGFsbFJlcG9zUGFja2FnZXMpID4gMCkgewpyZXR1cm4gc2VsZjo6Y29tcHV0ZUNoZWNrRm9yTG93ZXJQcmlvUmVwbygkcG9vbCwgJGlzVmVyYm9zZSwgJHBhY2thZ2VOYW1lLCAkcGFja2FnZXMsICRhbGxSZXBvc1BhY2thZ2VzLCAnbWluaW11bS1zdGFiaWxpdHknLCAkY29uc3RyYWludCk7Cn0KCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCAnLCAnZm91bmQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCkuJyBidXQgJy4oc2VsZjo6aGFzTXVsdGlwbGVOYW1lcygkcGFja2FnZXMpID8gJ3RoZXNlIGRvJyA6ICdpdCBkb2VzJykuJyBub3QgbWF0Y2ggeW91ciBtaW5pbXVtLXN0YWJpbGl0eS4nXTsKfQoKCiRwYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCBudWxsLCBSZXBvc2l0b3J5U2V0OjpBTExPV19VTkFDQ0VQVEFCTEVfU1RBQklMSVRJRVMpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CgokYWxsUmVwb3NQYWNrYWdlcyA9ICRyZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCwgUmVwb3NpdG9yeVNldDo6QUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTKTsKaWYgKFxjb3VudCgkYWxsUmVwb3NQYWNrYWdlcykgPiAwKSB7CnJldHVybiBzZWxmOjpjb21wdXRlQ2hlY2tGb3JMb3dlclByaW9SZXBvKCRwb29sLCAkaXNWZXJib3NlLCAkcGFja2FnZU5hbWUsICRwYWNrYWdlcywgJGFsbFJlcG9zUGFja2FnZXMsICdjb25zdHJhaW50JywgJGNvbnN0cmFpbnQpOwp9Cgokc3VmZml4ID0gJyc7CmlmICgkY29uc3RyYWludCBpbnN0YW5jZW9mIENvbnN0cmFpbnQgJiYgJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSA9PT0gJ2Rldi1tYXN0ZXInKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkY2FuZGlkYXRlKSB7CmlmIChpbl9hcnJheSgkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCksIFsnZGV2LWRlZmF1bHQnLCAnZGV2LW1haW4nXSwgdHJ1ZSkpIHsKJHN1ZmZpeCA9ICcgUGVyaGFwcyBkZXYtbWFzdGVyIHdhcyByZW5hbWVkIHRvICcuJGNhbmRpZGF0ZS0+Z2V0UHJldHR5VmVyc2lvbigpLic/JzsKYnJlYWs7Cn0KfQp9CgoKJGFsbFJlcG9zUGFja2FnZXMgPSAkcGFja2FnZXM7CiR0b3BQYWNrYWdlID0gcmVzZXQoJGFsbFJlcG9zUGFja2FnZXMpOwppZiAoJHRvcFBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSkgewokc3VmZml4ID0gJyBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZGVwLW9uLXJvb3QgZm9yIGRldGFpbHMgYW5kIGFzc2lzdGFuY2UuJzsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KSAuICcsICcsICdmb3VuZCAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRwYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGJ1dCAnLihzZWxmOjpoYXNNdWx0aXBsZU5hbWVzKCRwYWNrYWdlcykgPyAndGhlc2UgZG8nIDogJ2l0IGRvZXMnKS4nIG5vdCBtYXRjaCB0aGUgY29uc3RyYWludC4nIC4gJHN1ZmZpeF07Cn0KCmlmICghUHJlZzo6aXNNYXRjaCgne15bQS1aYS16MC05Xy4vLV0rJH0nLCAkcGFja2FnZU5hbWUpKSB7CiRpbGxlZ2FsQ2hhcnMgPSBQcmVnOjpyZXBsYWNlKCd7W0EtWmEtejAtOV8uLy1dK30nLCAnJywgJHBhY2thZ2VOYW1lKTsKCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSwgaXQgIiwgJ2NvdWxkIG5vdCBiZSBmb3VuZCwgaXQgbG9va3MgbGlrZSBpdHMgbmFtZSBpcyBpbnZhbGlkLCAiJy4kaWxsZWdhbENoYXJzLiciIGlzIG5vdCBhbGxvd2VkIGluIHBhY2thZ2UgbmFtZXMuJ107Cn0KCiRwcm92aWRlcnNTdHIgPSBzZWxmOjpnZXRQcm92aWRlcnNMaXN0KCRyZXBvc2l0b3J5U2V0LCAkcGFja2FnZU5hbWUsIDE1KTsKaWYgKCRwcm92aWRlcnNTdHIgIT09IG51bGwpIHsKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lIi5zZWxmOjpjb25zdHJhaW50VG9UZXh0KCRjb25zdHJhaW50KS4iLCBpdCAiLCAiY291bGQgbm90IGJlIGZvdW5kIGluIGFueSB2ZXJzaW9uLCBidXQgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBwcm92aWRlIGl0OlxuIi4kcHJvdmlkZXJzU3RyLiIgICAgICBDb25zaWRlciByZXF1aXJpbmcgb25lIG9mIHRoZXNlIHRvIHNhdGlzZnkgdGhlICRwYWNrYWdlTmFtZSByZXF1aXJlbWVudC4iXTsKfQoKcmV0dXJuIFsiLSBSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJHBhY2thZ2VOYW1lLCBpdCAiLCAiY291bGQgbm90IGJlIGZvdW5kIGluIGFueSB2ZXJzaW9uLCB0aGVyZSBtYXkgYmUgYSB0eXBvIGluIHRoZSBwYWNrYWdlIG5hbWUuIl07Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBhY2thZ2VMaXN0KGFycmF5ICRwYWNrYWdlcywgYm9vbCAkaXNWZXJib3NlLCA/UG9vbCAkcG9vbCA9IG51bGwsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgYm9vbCAkdXNlUmVtb3ZlZFZlcnNpb25Hcm91cCA9IGZhbHNlKTogc3RyaW5nCnsKJHByZXBhcmVkID0gW107CiRoYXNEZWZhdWx0QnJhbmNoID0gW107CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcHJlcGFyZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJ25hbWUnXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiRwcmVwYXJlZFskcGFja2FnZS0+Z2V0TmFtZSgpXVsndmVyc2lvbnMnXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlID8gJyAoYWxpYXMgb2YgJy4kcGFja2FnZS0+Z2V0QWxpYXNPZigpLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyknIDogJycpOwppZiAoJHBvb2wgIT09IG51bGwgJiYgJGNvbnN0cmFpbnQgIT09IG51bGwpIHsKZm9yZWFjaCAoJHBvb2wtPmdldFJlbW92ZWRWZXJzaW9ucygkcGFja2FnZS0+Z2V0TmFtZSgpLCAkY29uc3RyYWludCkgYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKJHByZXBhcmVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9ucyddWyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KaWYgKCRwb29sICE9PSBudWxsICYmICR1c2VSZW1vdmVkVmVyc2lvbkdyb3VwKSB7CmZvcmVhY2ggKCRwb29sLT5nZXRSZW1vdmVkVmVyc2lvbnNCeVBhY2thZ2Uoc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKSkgYXMgJHZlcnNpb24gPT4gJHByZXR0eVZlcnNpb24pIHsKJHByZXBhcmVkWyRwYWNrYWdlLT5nZXROYW1lKCldWyd2ZXJzaW9ucyddWyR2ZXJzaW9uXSA9ICRwcmV0dHlWZXJzaW9uOwp9Cn0KaWYgKCRwYWNrYWdlLT5pc0RlZmF1bHRCcmFuY2goKSkgewokaGFzRGVmYXVsdEJyYW5jaFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7Cn0KfQoKJHByZXBhcmVkU3RyaW5ncyA9IFtdOwpmb3JlYWNoICgkcHJlcGFyZWQgYXMgJG5hbWUgPT4gJHBhY2thZ2UpIHsKCmlmIChpc3NldCgkcGFja2FnZVsndmVyc2lvbnMnXVtWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBU10sICRoYXNEZWZhdWx0QnJhbmNoWyRuYW1lXSkpIHsKdW5zZXQoJHBhY2thZ2VbJ3ZlcnNpb25zJ11bVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVNdKTsKfQoKdWtzb3J0KCRwYWNrYWdlWyd2ZXJzaW9ucyddLCAndmVyc2lvbl9jb21wYXJlJyk7CgppZiAoISRpc1ZlcmJvc2UpIHsKJHBhY2thZ2VbJ3ZlcnNpb25zJ10gPSBzZWxmOjpjb25kZW5zZVZlcnNpb25MaXN0KCRwYWNrYWdlWyd2ZXJzaW9ucyddLCA0KTsKfQokcHJlcGFyZWRTdHJpbmdzW10gPSAkcGFja2FnZVsnbmFtZSddLidbJy5pbXBsb2RlKCcsICcsICRwYWNrYWdlWyd2ZXJzaW9ucyddKS4nXSc7Cn0KCnJldHVybiBpbXBsb2RlKCcsICcsICRwcmVwYXJlZFN0cmluZ3MpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1QYWNrYWdlVmVyc2lvbihQb29sICRwb29sLCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBzdHJpbmcgJHZlcnNpb24pOiA/c3RyaW5nCnsKJGF2YWlsYWJsZSA9ICRwb29sLT53aGF0UHJvdmlkZXMoJHBhY2thZ2VOYW1lKTsKCmlmIChcY291bnQoJGF2YWlsYWJsZSkgPiAwKSB7CiRzZWxlY3RlZCA9IG51bGw7CmZvcmVhY2ggKCRhdmFpbGFibGUgYXMgJHBrZykgewppZiAoJHBrZy0+Z2V0UmVwb3NpdG9yeSgpIGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5KSB7CiRzZWxlY3RlZCA9ICRwa2c7CmJyZWFrOwp9Cn0KaWYgKCRzZWxlY3RlZCA9PT0gbnVsbCkgewokc2VsZWN0ZWQgPSByZXNldCgkYXZhaWxhYmxlKTsKfQoKCmlmICgkc2VsZWN0ZWQtPmdldE5hbWUoKSAhPT0gJHBhY2thZ2VOYW1lKSB7Cgpmb3JlYWNoIChhcnJheV9tZXJnZShhcnJheV92YWx1ZXMoJHNlbGVjdGVkLT5nZXRQcm92aWRlcygpKSwgYXJyYXlfdmFsdWVzKCRzZWxlY3RlZC0+Z2V0UmVwbGFjZXMoKSkpIGFzICRsaW5rKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRwYWNrYWdlTmFtZSkgewpyZXR1cm4gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nICcuc3Vic3RyKCRsaW5rLT5nZXREZXNjcmlwdGlvbigpLCAwLCAtMSkuJ2QgYnkgJy4kc2VsZWN0ZWQtPmdldFByZXR0eVN0cmluZygpOwp9Cn0KfQoKJHZlcnNpb24gPSAkc2VsZWN0ZWQtPmdldFByZXR0eVZlcnNpb24oKTsKJGV4dHJhID0gJHNlbGVjdGVkLT5nZXRFeHRyYSgpOwppZiAoJHNlbGVjdGVkIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmIGlzc2V0KCRleHRyYVsnY29uZmlnLnBsYXRmb3JtJ10pICYmICRleHRyYVsnY29uZmlnLnBsYXRmb3JtJ10gPT09IHRydWUpIHsKJHZlcnNpb24gLj0gJzsgJyAuIHN0cl9yZXBsYWNlKCdQYWNrYWdlICcsICcnLCAoc3RyaW5nKSAkc2VsZWN0ZWQtPmdldERlc2NyaXB0aW9uKCkpOwp9Cn0gZWxzZSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHZlcnNpb247Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb25kZW5zZVZlcnNpb25MaXN0KGFycmF5ICR2ZXJzaW9ucywgaW50ICRtYXgsIGludCAkbWF4RGV2ID0gMTYpOiBhcnJheQp7CmlmIChjb3VudCgkdmVyc2lvbnMpIDw9ICRtYXgpIHsKcmV0dXJuIGFycmF5X3ZhbHVlcygkdmVyc2lvbnMpOwp9CgokZmlsdGVyZWQgPSBbXTsKJGJ5TWFqb3IgPSBbXTsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uID0+ICRwcmV0dHkpIHsKaWYgKDAgPT09IHN0cmlwb3MoKHN0cmluZykgJHZlcnNpb24sICdkZXYtJykpIHsKJGJ5TWFqb3JbJ2RldiddW10gPSAkcHJldHR5Owp9IGVsc2UgewokYnlNYWpvcltQcmVnOjpyZXBsYWNlKCd7XihcZCspXC4uKn0nLCAnJDEnLCAoc3RyaW5nKSAkdmVyc2lvbildW10gPSAkcHJldHR5Owp9Cn0KZm9yZWFjaCAoJGJ5TWFqb3IgYXMgJG1ham9yVmVyc2lvbiA9PiAkdmVyc2lvbnNGb3JNYWpvcikgewokbWF4VmVyc2lvbnMgPSAkbWFqb3JWZXJzaW9uID09PSAnZGV2JyA/ICRtYXhEZXYgOiAkbWF4OwppZiAoY291bnQoJHZlcnNpb25zRm9yTWFqb3IpID4gJG1heFZlcnNpb25zKSB7CgokZmlsdGVyZWRbXSA9ICR2ZXJzaW9uc0Zvck1ham9yWzBdOwokZmlsdGVyZWRbXSA9ICcuLi4nOwokZmlsdGVyZWRbXSA9ICR2ZXJzaW9uc0Zvck1ham9yW2NvdW50KCR2ZXJzaW9uc0Zvck1ham9yKSAtIDFdOwp9IGVsc2UgewokZmlsdGVyZWQgPSBhcnJheV9tZXJnZSgkZmlsdGVyZWQsICR2ZXJzaW9uc0Zvck1ham9yKTsKfQp9CgpyZXR1cm4gJGZpbHRlcmVkOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXNNdWx0aXBsZU5hbWVzKGFycmF5ICRwYWNrYWdlcyk6IGJvb2wKewokbmFtZSA9IG51bGw7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJG5hbWUgPT09IG51bGwgfHwgJG5hbWUgPT09ICRwYWNrYWdlLT5nZXROYW1lKCkpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwp9IGVsc2UgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29tcHV0ZUNoZWNrRm9yTG93ZXJQcmlvUmVwbyhQb29sICRwb29sLCBib29sICRpc1ZlcmJvc2UsIHN0cmluZyAkcGFja2FnZU5hbWUsIGFycmF5ICRoaWdoZXJSZXBvUGFja2FnZXMsIGFycmF5ICRhbGxSZXBvc1BhY2thZ2VzLCBzdHJpbmcgJHJlYXNvbiwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewokbmV4dFJlcG9QYWNrYWdlcyA9IFtdOwokbmV4dFJlcG8gPSBudWxsOwoKZm9yZWFjaCAoJGFsbFJlcG9zUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRuZXh0UmVwbyA9PT0gbnVsbCB8fCAkbmV4dFJlcG8gPT09ICRwYWNrYWdlLT5nZXRSZXBvc2l0b3J5KCkpIHsKJG5leHRSZXBvUGFja2FnZXNbXSA9ICRwYWNrYWdlOwokbmV4dFJlcG8gPSAkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpOwp9IGVsc2UgewpicmVhazsKfQp9Cgphc3NlcnQobnVsbCAhPT0gJG5leHRSZXBvKTsKCmlmIChcY291bnQoJGhpZ2hlclJlcG9QYWNrYWdlcykgPiAwKSB7CiR0b3BQYWNrYWdlID0gcmVzZXQoJGhpZ2hlclJlcG9QYWNrYWdlcyk7CmlmICgkdG9wUGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CnJldHVybiBbCiItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpLicsIGl0IGlzICcsCidzYXRpc2ZpYWJsZSBieSAnLnNlbGY6OmdldFBhY2thZ2VMaXN0KCRuZXh0UmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgZnJvbSAnLiRuZXh0UmVwby0+Z2V0UmVwb05hbWUoKS4nIGJ1dCAnLiR0b3BQYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyAnLiR0b3BQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBpcyB0aGUgcm9vdCBwYWNrYWdlIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kZXAtb24tcm9vdCBmb3IgZGV0YWlscyBhbmQgYXNzaXN0YW5jZS4nLApdOwp9Cn0KCmlmICgkbmV4dFJlcG8gaW5zdGFuY2VvZiBMb2NrQXJyYXlSZXBvc2l0b3J5KSB7CiRzaW5ndWxhciA9IGNvdW50KCRoaWdoZXJSZXBvUGFja2FnZXMpID09PSAxOwoKJHN1Z2dlc3Rpb24gPSAnTWFrZSBzdXJlIHlvdSBlaXRoZXIgZml4IHRoZSAnLiRyZWFzb24uJyBvciBhdm9pZCB1cGRhdGluZyB0aGlzIHBhY2thZ2UgdG8ga2VlcCB0aGUgb25lIHByZXNlbnQgaW4gdGhlIGxvY2sgZmlsZSAoJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkbmV4dFJlcG9QYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nKS4nOwoKaWYgKCRuZXh0UmVwb1BhY2thZ2VzWzBdLT5nZXREaXN0VHlwZSgpID09PSAncGF0aCcpIHsKJHRyYW5zcG9ydE9wdGlvbnMgPSAkbmV4dFJlcG9QYWNrYWdlc1swXS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwppZiAoIWlzc2V0KCR0cmFuc3BvcnRPcHRpb25zWydzeW1saW5rJ10pIHx8ICR0cmFuc3BvcnRPcHRpb25zWydzeW1saW5rJ10gIT09IGZhbHNlKSB7CiRzdWdnZXN0aW9uID0gJ01ha2Ugc3VyZSB5b3UgZml4IHRoZSAnLiRyZWFzb24uJyBhcyBwYWNrYWdlcyBpbnN0YWxsZWQgZnJvbSBzeW1saW5rZWQgcGF0aCByZXBvcyBhcmUgdXBkYXRlZCBldmVuIGluIHBhcnRpYWwgdXBkYXRlcyBhbmQgdGhlIG9uZSBmcm9tIHRoZSBsb2NrIGZpbGUgY2FuIHRodXMgbm90IGJlIHVzZWQuJzsKfQp9CgpyZXR1cm4gWyItIFJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlcyAkcGFja2FnZU5hbWUiLnNlbGY6OmNvbnN0cmFpbnRUb1RleHQoJGNvbnN0cmFpbnQpIC4gJywgJywKJ2ZvdW5kICcgLiBzZWxmOjpnZXRQYWNrYWdlTGlzdCgkaGlnaGVyUmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgYnV0ICcgLiAoJHNpbmd1bGFyID8gJ2l0IGRvZXMnIDogJ3RoZXNlIGRvJykgLiAnIG5vdCBtYXRjaCB5b3VyICcuJHJlYXNvbi4nIGFuZCAnIC4gKCRzaW5ndWxhciA/ICdpcycgOiAnYXJlJykgLiAnIHRoZXJlZm9yZSBub3QgaW5zdGFsbGFibGUuICcuJHN1Z2dlc3Rpb24sCl07Cn0KCnJldHVybiBbIi0gUm9vdCBjb21wb3Nlci5qc29uIHJlcXVpcmVzICRwYWNrYWdlTmFtZSIuc2VsZjo6Y29uc3RyYWludFRvVGV4dCgkY29uc3RyYWludCkgLiAnLCBpdCBpcyAnLCAnc2F0aXNmaWFibGUgYnkgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkbmV4dFJlcG9QYWNrYWdlcywgJGlzVmVyYm9zZSwgJHBvb2wsICRjb25zdHJhaW50KS4nIGZyb20gJy4kbmV4dFJlcG8tPmdldFJlcG9OYW1lKCkuJyBidXQgJy5zZWxmOjpnZXRQYWNrYWdlTGlzdCgkaGlnaGVyUmVwb1BhY2thZ2VzLCAkaXNWZXJib3NlLCAkcG9vbCwgJGNvbnN0cmFpbnQpLicgZnJvbSAnLnJlc2V0KCRoaWdoZXJSZXBvUGFja2FnZXMpLT5nZXRSZXBvc2l0b3J5KCktPmdldFJlcG9OYW1lKCkuJyBoYXMgaGlnaGVyIHJlcG9zaXRvcnkgcHJpb3JpdHkuIFRoZSBwYWNrYWdlcyBmcm9tIHRoZSBoaWdoZXIgcHJpb3JpdHkgcmVwb3NpdG9yeSBkbyBub3QgbWF0Y2ggeW91ciAnLiRyZWFzb24uJyBhbmQgYXJlIHRoZXJlZm9yZSBub3QgaW5zdGFsbGFibGUuIFRoYXQgcmVwb3NpdG9yeSBpcyBjYW5vbmljYWwgc28gdGhlIGxvd2VyIHByaW9yaXR5IHJlcG9cJ3MgcGFja2FnZXMgYXJlIG5vdCBpbnN0YWxsYWJsZS4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3JlcG9wcmlvIGZvciBkZXRhaWxzIGFuZCBhc3Npc3RhbmNlLiddOwp9CgoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGNvbnN0cmFpbnRUb1RleHQoP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsKTogc3RyaW5nCnsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiAkY29uc3RyYWludC0+Z2V0T3BlcmF0b3IoKSA9PT0gQ29uc3RyYWludDo6U1RSX09QX0VRICYmICFzdHJfc3RhcnRzX3dpdGgoJGNvbnN0cmFpbnQtPmdldFZlcnNpb24oKSwgJ2Rldi0nKSkgewppZiAoIVByZWc6OmlzTWF0Y2goJ3teXGQrKD86XC5cZCspKiR9JywgJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpKSkgewpyZXR1cm4gJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKSAuJyAoZXhhY3QgdmVyc2lvbiBtYXRjaCknOwp9CgokdmVyc2lvbnMgPSBbJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpXTsKZm9yICgkaSA9IDMgLSBzdWJzdHJfY291bnQoJHZlcnNpb25zWzBdLCAnLicpOyAkaSA+IDA7ICRpLS0pIHsKJHZlcnNpb25zW10gPSBlbmQoJHZlcnNpb25zKSAuICcuMCc7Cn0KCnJldHVybiAnICcgLiAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkgLiAnIChleGFjdCB2ZXJzaW9uIG1hdGNoOiAnIC4gKGNvdW50KCR2ZXJzaW9ucykgPiAxID8gaW1wbG9kZSgnLCAnLCBhcnJheV9zbGljZSgkdmVyc2lvbnMsIDAsIC0xKSkgLiAnIG9yICcgLiBlbmQoJHZlcnNpb25zKSA6ICR2ZXJzaW9uc1swXSkgLiAnKSc7Cn0KCnJldHVybiAkY29uc3RyYWludCAhPT0gbnVsbCA/ICcgJy4kY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkgOiAnJzsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzTGlzdChSZXBvc2l0b3J5U2V0ICRyZXBvc2l0b3J5U2V0LCBzdHJpbmcgJHBhY2thZ2VOYW1lLCBpbnQgJG1heFByb3ZpZGVycyk6ID9zdHJpbmcKewokcHJvdmlkZXJzID0gJHJlcG9zaXRvcnlTZXQtPmdldFByb3ZpZGVycygkcGFja2FnZU5hbWUpOwppZiAoXGNvdW50KCRwcm92aWRlcnMpID4gMCkgewokcHJvdmlkZXJzU3RyID0gaW1wbG9kZShhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcCk6IHN0cmluZyB7CiRkZXNjcmlwdGlvbiA9ICRwWydkZXNjcmlwdGlvbiddICE9PSAnJyAmJiAkcFsnZGVzY3JpcHRpb24nXSAhPT0gbnVsbCA/ICcgJy5zdWJzdHIoJHBbJ2Rlc2NyaXB0aW9uJ10sIDAsIDEwMCkgOiAnJzsKCnJldHVybiAnICAgICAgLSAnLiRwWyduYW1lJ10uJGRlc2NyaXB0aW9uLiJcbiI7Cn0sIGNvdW50KCRwcm92aWRlcnMpID4gJG1heFByb3ZpZGVycyArIDEgPyBhcnJheV9zbGljZSgkcHJvdmlkZXJzLCAwLCAkbWF4UHJvdmlkZXJzKSA6ICRwcm92aWRlcnMpKTsKaWYgKGNvdW50KCRwcm92aWRlcnMpID4gJG1heFByb3ZpZGVycyArIDEpIHsKJHByb3ZpZGVyc1N0ciAuPSAnICAgICAgLi4uIGFuZCAnLihjb3VudCgkcHJvdmlkZXJzKSAtICRtYXhQcm92aWRlcnMpLicgbW9yZS4nLiJcbiI7Cn0KCnJldHVybiAkcHJvdmlkZXJzU3RyOwp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcTG9ja0FycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaEFsbENvbnN0cmFpbnQ7CgoKCgpjbGFzcyBSZXF1ZXN0CnsKCgoKcHVibGljIGNvbnN0IFVQREFURV9PTkxZX0xJU1RFRCA9IDA7CgoKCgoKcHVibGljIGNvbnN0IFVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNfTk9fUk9PVF9SRVFVSVJFID0gMTsKCgoKCgpwdWJsaWMgY29uc3QgVVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUyA9IDI7CgoKcHJvdGVjdGVkICRsb2NrZWRSZXBvc2l0b3J5OwoKcHJvdGVjdGVkICRyZXF1aXJlcyA9IFtdOwoKcHJvdGVjdGVkICRmaXhlZFBhY2thZ2VzID0gW107Cgpwcm90ZWN0ZWQgJGxvY2tlZFBhY2thZ2VzID0gW107Cgpwcm90ZWN0ZWQgJGZpeGVkTG9ja2VkUGFja2FnZXMgPSBbXTsKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dMaXN0ID0gW107Cgpwcm90ZWN0ZWQgJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9IGZhbHNlOwoKcHJpdmF0ZSAkcmVzdHJpY3RlZFBhY2thZ2VzID0gbnVsbDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwb3NpdG9yeSA9IG51bGwpCnsKJHRoaXMtPmxvY2tlZFJlcG9zaXRvcnkgPSAkbG9ja2VkUmVwb3NpdG9yeTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlcXVpcmVOYW1lKHN0cmluZyAkcGFja2FnZU5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCk6IHZvaWQKewokcGFja2FnZU5hbWUgPSBzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSk7CgppZiAoJGNvbnN0cmFpbnQgPT09IG51bGwpIHsKJGNvbnN0cmFpbnQgPSBuZXcgTWF0Y2hBbGxDb25zdHJhaW50KCk7Cn0KaWYgKGlzc2V0KCR0aGlzLT5yZXF1aXJlc1skcGFja2FnZU5hbWVdKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdPdmVyd3JpdGluZyByZXF1aXJlcyBzZWVtcyBsaWtlIGEgYnVnICgnLiRwYWNrYWdlTmFtZS4nICcuJHRoaXMtPnJlcXVpcmVzWyRwYWNrYWdlTmFtZV0tPmdldFByZXR0eVN0cmluZygpLicgPT4gJy4kY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCkuJywgY2hlY2sgd2h5IGl0IGlzIGhhcHBlbmluZywgbWlnaHQgYmUgYSByb290IGFsaWFzJyk7Cn0KJHRoaXMtPnJlcXVpcmVzWyRwYWNrYWdlTmFtZV0gPSAkY29uc3RyYWludDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpeFBhY2thZ2UoQmFzZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHRoaXMtPmZpeGVkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2NrUGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IHZvaWQKewokdGhpcy0+bG9ja2VkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaXhMb2NrZWRQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5maXhlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gJHBhY2thZ2U7CiR0aGlzLT5maXhlZExvY2tlZFBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gJHBhY2thZ2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiB1bmxvY2tQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogdm9pZAp7CnVuc2V0KCR0aGlzLT5sb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSk7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlQWxsb3dMaXN0KGFycmF5ICR1cGRhdGVBbGxvd0xpc3QsICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMpOiB2b2lkCnsKJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCA9ICR1cGRhdGVBbGxvd0xpc3Q7CiR0aGlzLT51cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgPSAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXBkYXRlQWxsb3dMaXN0KCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT51cGRhdGVBbGxvd0xpc3Q7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzICE9PSBzZWxmOjpVUERBVEVfT05MWV9MSVNURUQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVcGRhdGVBbGxvd1RyYW5zaXRpdmVSb290RGVwZW5kZW5jaWVzKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9PT0gc2VsZjo6VVBEQVRFX0xJU1RFRF9XSVRIX1RSQU5TSVRJVkVfREVQUzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXF1aXJlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpeGVkUGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmZpeGVkUGFja2FnZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0ZpeGVkUGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoJHRoaXMtPmZpeGVkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9ja2VkUGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmxvY2tlZFBhY2thZ2VzOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNMb2NrZWRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5sb2NrZWRQYWNrYWdlc1tzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkgfHwgaXNzZXQoJHRoaXMtPmZpeGVkTG9ja2VkUGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rml4ZWRPckxvY2tlZFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuIGFycmF5X21lcmdlKCR0aGlzLT5maXhlZFBhY2thZ2VzLCAkdGhpcy0+bG9ja2VkUGFja2FnZXMpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVzZW50TWFwKGJvb2wgJHBhY2thZ2VJZHMgPSBmYWxzZSk6IGFycmF5CnsKJHByZXNlbnRNYXAgPSBbXTsKCmlmICgkdGhpcy0+bG9ja2VkUmVwb3NpdG9yeSAhPT0gbnVsbCkgewpmb3JlYWNoICgkdGhpcy0+bG9ja2VkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcHJlc2VudE1hcFskcGFja2FnZUlkcyA/ICRwYWNrYWdlLT5nZXRJZCgpIDogc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+Zml4ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcHJlc2VudE1hcFskcGFja2FnZUlkcyA/ICRwYWNrYWdlLT5nZXRJZCgpIDogc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQoKcmV0dXJuICRwcmVzZW50TWFwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rml4ZWRQYWNrYWdlc01hcCgpOiBhcnJheQp7CiRmaXhlZFBhY2thZ2VzTWFwID0gW107Cgpmb3JlYWNoICgkdGhpcy0+Zml4ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokZml4ZWRQYWNrYWdlc01hcFskcGFja2FnZS0+Z2V0SWQoKV0gPSAkcGFja2FnZTsKfQoKcmV0dXJuICRmaXhlZFBhY2thZ2VzTWFwOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9ja2VkUmVwb3NpdG9yeSgpOiA/TG9ja0FycmF5UmVwb3NpdG9yeQp7CnJldHVybiAkdGhpcy0+bG9ja2VkUmVwb3NpdG9yeTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzdHJpY3RQYWNrYWdlcyhhcnJheSAkbmFtZXMpOiB2b2lkCnsKJHRoaXMtPnJlc3RyaWN0ZWRQYWNrYWdlcyA9ICRuYW1lczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlc3RyaWN0ZWRQYWNrYWdlcygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlc3RyaWN0ZWRQYWNrYWdlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlTZXQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBSdWxlCnsKCnB1YmxpYyBjb25zdCBSVUxFX1JPT1RfUkVRVUlSRSA9IDI7IApwdWJsaWMgY29uc3QgUlVMRV9GSVhFRCA9IDM7IApwdWJsaWMgY29uc3QgUlVMRV9QQUNLQUdFX0NPTkZMSUNUID0gNjsgCnB1YmxpYyBjb25zdCBSVUxFX1BBQ0tBR0VfUkVRVUlSRVMgPSA3OyAKcHVibGljIGNvbnN0IFJVTEVfUEFDS0FHRV9TQU1FX05BTUUgPSAxMDsgCnB1YmxpYyBjb25zdCBSVUxFX0xFQVJORUQgPSAxMjsgCnB1YmxpYyBjb25zdCBSVUxFX1BBQ0tBR0VfQUxJQVMgPSAxMzsgCnB1YmxpYyBjb25zdCBSVUxFX1BBQ0tBR0VfSU5WRVJTRV9BTElBUyA9IDE0OyAKCgpwcml2YXRlIGNvbnN0IEJJVEZJRUxEX1RZUEUgPSAwOwpwcml2YXRlIGNvbnN0IEJJVEZJRUxEX1JFQVNPTiA9IDg7CnByaXZhdGUgY29uc3QgQklURklFTERfRElTQUJMRUQgPSAxNjsKCgpwcm90ZWN0ZWQgJGJpdGZpZWxkOwoKcHJvdGVjdGVkICRyZXF1ZXN0OwoKCgoKcHJvdGVjdGVkICRyZWFzb25EYXRhOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRyZWFzb24sICRyZWFzb25EYXRhKQp7CiR0aGlzLT5yZWFzb25EYXRhID0gJHJlYXNvbkRhdGE7CgokdGhpcy0+Yml0ZmllbGQgPSAoMCA8PCBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCkgfAooJHJlYXNvbiA8PCBzZWxmOjpCSVRGSUVMRF9SRUFTT04pIHwKKDI1NSA8PCBzZWxmOjpCSVRGSUVMRF9UWVBFKTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldExpdGVyYWxzKCk6IGFycmF5OwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGdldEhhc2goKTsKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZzsKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBlcXVhbHMoUnVsZSAkcnVsZSk6IGJvb2w7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVhc29uKCk6IGludAp7CnJldHVybiAoJHRoaXMtPmJpdGZpZWxkICYgKDI1NSA8PCBzZWxmOjpCSVRGSUVMRF9SRUFTT04pKSA+PiBzZWxmOjpCSVRGSUVMRF9SRUFTT047Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWFzb25EYXRhKCkKewpyZXR1cm4gJHRoaXMtPnJlYXNvbkRhdGE7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1aXJlZFBhY2thZ2UoKTogP3N0cmluZwp7CnN3aXRjaCAoJHRoaXMtPmdldFJlYXNvbigpKSB7CmNhc2Ugc2VsZjo6UlVMRV9ST09UX1JFUVVJUkU6CnJldHVybiAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpWydwYWNrYWdlTmFtZSddOwpjYXNlIHNlbGY6OlJVTEVfRklYRUQ6CnJldHVybiAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpWydwYWNrYWdlJ10tPmdldE5hbWUoKTsKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVM6CnJldHVybiAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpLT5nZXRUYXJnZXQoKTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUeXBlKCR0eXBlKTogdm9pZAp7CiR0aGlzLT5iaXRmaWVsZCA9ICgkdGhpcy0+Yml0ZmllbGQgJiB+KDI1NSA8PCBzZWxmOjpCSVRGSUVMRF9UWVBFKSkgfCAoKDI1NSAmICR0eXBlKSA8PCBzZWxmOjpCSVRGSUVMRF9UWVBFKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogaW50CnsKcmV0dXJuICgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX1RZUEUpKSA+PiBzZWxmOjpCSVRGSUVMRF9UWVBFOwp9CgpwdWJsaWMgZnVuY3Rpb24gZGlzYWJsZSgpOiB2b2lkCnsKJHRoaXMtPmJpdGZpZWxkID0gKCR0aGlzLT5iaXRmaWVsZCAmIH4oMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSkgfCAoMSA8PCBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmFibGUoKTogdm9pZAp7CiR0aGlzLT5iaXRmaWVsZCAmPSB+KDI1NSA8PCBzZWxmOjpCSVRGSUVMRF9ESVNBQkxFRCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0Rpc2FibGVkKCk6IGJvb2wKewpyZXR1cm4gMCAhPT0gKCgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSkgPj4gc2VsZjo6QklURklFTERfRElTQUJMRUQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNFbmFibGVkKCk6IGJvb2wKewpyZXR1cm4gMCA9PT0gKCgkdGhpcy0+Yml0ZmllbGQgJiAoMjU1IDw8IHNlbGY6OkJJVEZJRUxEX0RJU0FCTEVEKSkgPj4gc2VsZjo6QklURklFTERfRElTQUJMRUQpOwp9CgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gaXNBc3NlcnRpb24oKTogYm9vbDsKCnB1YmxpYyBmdW5jdGlvbiBpc0NhdXNlZEJ5TG9jayhSZXBvc2l0b3J5U2V0ICRyZXBvc2l0b3J5U2V0LCBSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sKTogYm9vbAp7CmlmICgkdGhpcy0+Z2V0UmVhc29uKCkgPT09IHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkdGhpcy0+Z2V0UmVhc29uRGF0YSgpLT5nZXRUYXJnZXQoKSkpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpICE9PSBudWxsKSB7CmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRMb2NrZWRSZXBvc2l0b3J5KCktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICR0aGlzLT5nZXRSZWFzb25EYXRhKCktPmdldFRhcmdldCgpKSB7CmlmICgkcG9vbC0+aXNVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIHRydWU7Cn0KaWYgKCEkdGhpcy0+Z2V0UmVhc29uRGF0YSgpLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICghJHJlcXVlc3QtPmlzTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIHRydWU7Cn0KYnJlYWs7Cn0KfQp9Cn0KCmlmICgkdGhpcy0+Z2V0UmVhc29uKCkgPT09IHNlbGY6OlJVTEVfUk9PVF9SRVFVSVJFKSB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2VOYW1lJ10pKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHJlcXVlc3QtPmdldExvY2tlZFJlcG9zaXRvcnkoKSAhPT0gbnVsbCkgewpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0TG9ja2VkUmVwb3NpdG9yeSgpLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpWydwYWNrYWdlTmFtZSddKSB7CmlmICgkcG9vbC0+aXNVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIHRydWU7Cn0KaWYgKCEkdGhpcy0+Z2V0UmVhc29uRGF0YSgpWydjb25zdHJhaW50J10tPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkpIHsKcmV0dXJuIHRydWU7Cn0KYnJlYWs7Cn0KfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVBhY2thZ2UoUG9vbCAkcG9vbCk6IEJhc2VQYWNrYWdlCnsKJGxpdGVyYWxzID0gJHRoaXMtPmdldExpdGVyYWxzKCk7Cgpzd2l0Y2ggKCR0aGlzLT5nZXRSZWFzb24oKSkgewpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9DT05GTElDVDoKJHBhY2thZ2UxID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1swXSkpOwokcGFja2FnZTIgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWxzWzFdKSk7CgokcmVhc29uRGF0YSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgppZiAoJHJlYXNvbkRhdGEtPmdldFNvdXJjZSgpID09PSAkcGFja2FnZTEtPmdldE5hbWUoKSkgewpbJHBhY2thZ2UyLCAkcGFja2FnZTFdID0gWyRwYWNrYWdlMSwgJHBhY2thZ2UyXTsKfQoKcmV0dXJuICRwYWNrYWdlMjsKCmNhc2Ugc2VsZjo6UlVMRV9QQUNLQUdFX1JFUVVJUkVTOgokc291cmNlTGl0ZXJhbCA9ICRsaXRlcmFsc1swXTsKJHNvdXJjZVBhY2thZ2UgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHNvdXJjZUxpdGVyYWwpKTsKCnJldHVybiAkc291cmNlUGFja2FnZTsKCmRlZmF1bHQ6CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vdCBpbXBsZW1lbnRlZCcpOwp9Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5U3RyaW5nKFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsIFJlcXVlc3QgJHJlcXVlc3QsIFBvb2wgJHBvb2wsIGJvb2wgJGlzVmVyYm9zZSwgYXJyYXkgJGluc3RhbGxlZE1hcCA9IFtdLCBhcnJheSAkbGVhcm5lZFBvb2wgPSBbXSk6IHN0cmluZwp7CiRsaXRlcmFscyA9ICR0aGlzLT5nZXRMaXRlcmFscygpOwoKc3dpdGNoICgkdGhpcy0+Z2V0UmVhc29uKCkpIHsKY2FzZSBzZWxmOjpSVUxFX1JPT1RfUkVRVUlSRToKJHJlYXNvbkRhdGEgPSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpOwokcGFja2FnZU5hbWUgPSAkcmVhc29uRGF0YVsncGFja2FnZU5hbWUnXTsKJGNvbnN0cmFpbnQgPSAkcmVhc29uRGF0YVsnY29uc3RyYWludCddOwoKJHBhY2thZ2VzID0gJHBvb2wtPndoYXRQcm92aWRlcygkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KTsKaWYgKDAgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CnJldHVybiAnTm8gcGFja2FnZSBmb3VuZCB0byBzYXRpc2Z5IHJvb3QgY29tcG9zZXIuanNvbiByZXF1aXJlICcuJHBhY2thZ2VOYW1lLicgJy4kY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KCiRwYWNrYWdlc05vbkFsaWFzID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcigkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoJHApOiBib29sIHsKcmV0dXJuICEoJHAgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpOwp9KSk7CmlmIChcY291bnQoJHBhY2thZ2VzTm9uQWxpYXMpID09PSAxKSB7CiRwYWNrYWdlID0gJHBhY2thZ2VzTm9uQWxpYXNbMF07CmlmICgkcmVxdWVzdC0+aXNMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIGxvY2tlZCB0byB2ZXJzaW9uICcuJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKS4iIGFuZCBhbiB1cGRhdGUgb2YgdGhpcyBwYWNrYWdlIHdhcyBub3QgcmVxdWVzdGVkLiI7Cn0KfQoKcmV0dXJuICdSb290IGNvbXBvc2VyLmpzb24gcmVxdWlyZXMgJy4kcGFja2FnZU5hbWUuJyAnLiRjb25zdHJhaW50LT5nZXRQcmV0dHlTdHJpbmcoKS4nIC0+IHNhdGlzZmlhYmxlIGJ5ICcuJHRoaXMtPmZvcm1hdFBhY2thZ2VzVW5pcXVlKCRwb29sLCAkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRjb25zdHJhaW50KS4nLic7CgpjYXNlIHNlbGY6OlJVTEVfRklYRUQ6CiRwYWNrYWdlID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCR0aGlzLT5nZXRSZWFzb25EYXRhKClbJ3BhY2thZ2UnXSk7CgppZiAoJHJlcXVlc3QtPmlzTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBpcyBsb2NrZWQgdG8gdmVyc2lvbiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJyBhbmQgYW4gdXBkYXRlIG9mIHRoaXMgcGFja2FnZSB3YXMgbm90IHJlcXVlc3RlZC4nOwp9CgpyZXR1cm4gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGlzIHByZXNlbnQgYXQgdmVyc2lvbiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnIGFuZCBjYW5ub3QgYmUgbW9kaWZpZWQgYnkgQ29tcG9zZXInOwoKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfQ09ORkxJQ1Q6CiRwYWNrYWdlMSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pKTsKJHBhY2thZ2UyID0gJHRoaXMtPmRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKCRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsc1sxXSkpOwoKJGNvbmZsaWN0VGFyZ2V0ID0gJHBhY2thZ2UxLT5nZXRQcmV0dHlTdHJpbmcoKTsKJHJlYXNvbkRhdGEgPSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpOwoKCmlmICgkcmVhc29uRGF0YS0+Z2V0U291cmNlKCkgPT09ICRwYWNrYWdlMS0+Z2V0TmFtZSgpKSB7ClskcGFja2FnZTIsICRwYWNrYWdlMV0gPSBbJHBhY2thZ2UxLCAkcGFja2FnZTJdOwokY29uZmxpY3RUYXJnZXQgPSAkcGFja2FnZTEtPmdldFByZXR0eU5hbWUoKS4nICcuJHJlYXNvbkRhdGEtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKfQoKCgppZiAoJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpICE9PSAkcGFja2FnZTEtPmdldE5hbWUoKSkgewokcHJvdmlkZVR5cGUgPSBudWxsOwokcHJvdmlkZWQgPSBudWxsOwpmb3JlYWNoICgkcGFja2FnZTEtPmdldFByb3ZpZGVzKCkgYXMgJHByb3ZpZGUpIHsKaWYgKCRwcm92aWRlLT5nZXRUYXJnZXQoKSA9PT0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpKSB7CiRwcm92aWRlVHlwZSA9ICdwcm92aWRlcyc7CiRwcm92aWRlZCA9ICRwcm92aWRlLT5nZXRQcmV0dHlDb25zdHJhaW50KCk7CmJyZWFrOwp9Cn0KZm9yZWFjaCAoJHBhY2thZ2UxLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CmlmICgkcmVwbGFjZS0+Z2V0VGFyZ2V0KCkgPT09ICRyZWFzb25EYXRhLT5nZXRUYXJnZXQoKSkgewokcHJvdmlkZVR5cGUgPSAncmVwbGFjZXMnOwokcHJvdmlkZWQgPSAkcmVwbGFjZS0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwpicmVhazsKfQp9CmlmIChudWxsICE9PSAkcHJvdmlkZVR5cGUpIHsKJGNvbmZsaWN0VGFyZ2V0ID0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpLicgJy4kcmVhc29uRGF0YS0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgKCcuJHBhY2thZ2UxLT5nZXRQcmV0dHlTdHJpbmcoKS4nICcuJHByb3ZpZGVUeXBlLicgJy4kcmVhc29uRGF0YS0+Z2V0VGFyZ2V0KCkuJyAnLiRwcm92aWRlZC4nKSc7Cn0KfQoKcmV0dXJuICRwYWNrYWdlMi0+Z2V0UHJldHR5U3RyaW5nKCkuJyBjb25mbGljdHMgd2l0aCAnLiRjb25mbGljdFRhcmdldC4nLic7CgpjYXNlIHNlbGY6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUzoKYXNzZXJ0KFxjb3VudCgkbGl0ZXJhbHMpID4gMCk7CiRzb3VyY2VMaXRlcmFsID0gYXJyYXlfc2hpZnQoJGxpdGVyYWxzKTsKJHNvdXJjZVBhY2thZ2UgPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJHNvdXJjZUxpdGVyYWwpKTsKJHJlYXNvbkRhdGEgPSAkdGhpcy0+Z2V0UmVhc29uRGF0YSgpOwoKJHJlcXVpcmVzID0gW107CmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewokcmVxdWlyZXNbXSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKfQoKJHRleHQgPSAkcmVhc29uRGF0YS0+Z2V0UHJldHR5U3RyaW5nKCRzb3VyY2VQYWNrYWdlKTsKaWYgKFxjb3VudCgkcmVxdWlyZXMpID4gMCkgewokdGV4dCAuPSAnIC0+IHNhdGlzZmlhYmxlIGJ5ICcgLiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRyZXF1aXJlcywgJGlzVmVyYm9zZSwgJHJlYXNvbkRhdGEtPmdldENvbnN0cmFpbnQoKSkgLiAnLic7Cn0gZWxzZSB7CiR0YXJnZXROYW1lID0gJHJlYXNvbkRhdGEtPmdldFRhcmdldCgpOwoKJHJlYXNvbiA9IFByb2JsZW06OmdldE1pc3NpbmdQYWNrYWdlUmVhc29uKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UsICR0YXJnZXROYW1lLCAkcmVhc29uRGF0YS0+Z2V0Q29uc3RyYWludCgpKTsKCnJldHVybiAkdGV4dCAuICcgLT4gJyAuICRyZWFzb25bMV07Cn0KCnJldHVybiAkdGV4dDsKCmNhc2Ugc2VsZjo6UlVMRV9QQUNLQUdFX1NBTUVfTkFNRToKJHBhY2thZ2VOYW1lcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKJHBhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbCk7CiRwYWNrYWdlTmFtZXNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSB0cnVlOwp9CnVuc2V0KCRsaXRlcmFsKTsKJHJlcGxhY2VkTmFtZSA9ICR0aGlzLT5nZXRSZWFzb25EYXRhKCk7CgppZiAoXGNvdW50KCRwYWNrYWdlTmFtZXMpID4gMSkgewppZiAoIWlzc2V0KCRwYWNrYWdlTmFtZXNbJHJlcGxhY2VkTmFtZV0pKSB7CiRyZWFzb24gPSAnVGhleSAnLihcY291bnQoJGxpdGVyYWxzKSA9PT0gMiA/ICdib3RoJyA6ICdhbGwnKS4nIHJlcGxhY2UgJy4kcmVwbGFjZWROYW1lLicgYW5kIHRodXMgY2Fubm90IGNvZXhpc3QuJzsKfSBlbHNlIHsKJHJlcGxhY2VyTmFtZXMgPSAkcGFja2FnZU5hbWVzOwp1bnNldCgkcmVwbGFjZXJOYW1lc1skcmVwbGFjZWROYW1lXSk7CiRyZXBsYWNlck5hbWVzID0gYXJyYXlfa2V5cygkcmVwbGFjZXJOYW1lcyk7CgppZiAoXGNvdW50KCRyZXBsYWNlck5hbWVzKSA9PT0gMSkgewokcmVhc29uID0gJHJlcGxhY2VyTmFtZXNbMF0gLiAnIHJlcGxhY2VzICc7Cn0gZWxzZSB7CiRyZWFzb24gPSAnWycuaW1wbG9kZSgnLCAnLCAkcmVwbGFjZXJOYW1lcykuJ10gcmVwbGFjZSAnOwp9CiRyZWFzb24gLj0gJHJlcGxhY2VkTmFtZS4nIGFuZCB0aHVzIGNhbm5vdCBjb2V4aXN0IHdpdGggaXQuJzsKfQoKJGluc3RhbGxlZFBhY2thZ2VzID0gW107CiRyZW1vdmFibGVQYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKaWYgKGlzc2V0KCRpbnN0YWxsZWRNYXBbYWJzKCRsaXRlcmFsKV0pKSB7CiRpbnN0YWxsZWRQYWNrYWdlc1tdID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwp9IGVsc2UgewokcmVtb3ZhYmxlUGFja2FnZXNbXSA9ICRwb29sLT5saXRlcmFsVG9QYWNrYWdlKCRsaXRlcmFsKTsKfQp9CgppZiAoXGNvdW50KCRpbnN0YWxsZWRQYWNrYWdlcykgPiAwICYmIFxjb3VudCgkcmVtb3ZhYmxlUGFja2FnZXMpID4gMCkgewpyZXR1cm4gJHRoaXMtPmZvcm1hdFBhY2thZ2VzVW5pcXVlKCRwb29sLCAkcmVtb3ZhYmxlUGFja2FnZXMsICRpc1ZlcmJvc2UsIG51bGwsIHRydWUpLicgY2Fubm90IGJlIGluc3RhbGxlZCBhcyB0aGF0IHdvdWxkIHJlcXVpcmUgcmVtb3ZpbmcgJy4kdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRpbnN0YWxsZWRQYWNrYWdlcywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkuJy4gJy4kcmVhc29uOwp9CgpyZXR1cm4gJ09ubHkgb25lIG9mIHRoZXNlIGNhbiBiZSBpbnN0YWxsZWQ6ICcuJHRoaXMtPmZvcm1hdFBhY2thZ2VzVW5pcXVlKCRwb29sLCAkbGl0ZXJhbHMsICRpc1ZlcmJvc2UsIG51bGwsIHRydWUpLicuICcuJHJlYXNvbjsKfQoKcmV0dXJuICdZb3UgY2FuIG9ubHkgaW5zdGFsbCBvbmUgdmVyc2lvbiBvZiBhIHBhY2thZ2UsIHNvIG9ubHkgb25lIG9mIHRoZXNlIGNhbiBiZSBpbnN0YWxsZWQ6ICcgLiAkdGhpcy0+Zm9ybWF0UGFja2FnZXNVbmlxdWUoJHBvb2wsICRsaXRlcmFscywgJGlzVmVyYm9zZSwgbnVsbCwgdHJ1ZSkgLiAnLic7CmNhc2Ugc2VsZjo6UlVMRV9MRUFSTkVEOgoKCgoKCgoKJGxlYXJuZWRTdHJpbmcgPSAnIChjb25mbGljdCBhbmFseXNpcyByZXN1bHQpJzsKCmlmIChcY291bnQoJGxpdGVyYWxzKSA9PT0gMSkgewokcnVsZVRleHQgPSAkcG9vbC0+bGl0ZXJhbFRvUHJldHR5U3RyaW5nKCRsaXRlcmFsc1swXSwgJGluc3RhbGxlZE1hcCk7Cn0gZWxzZSB7CiRncm91cHMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CiRwYWNrYWdlID0gJHBvb2wtPmxpdGVyYWxUb1BhY2thZ2UoJGxpdGVyYWwpOwppZiAoaXNzZXQoJGluc3RhbGxlZE1hcFskcGFja2FnZS0+aWRdKSkgewokZ3JvdXAgPSAkbGl0ZXJhbCA+IDAgPyAna2VlcCcgOiAncmVtb3ZlJzsKfSBlbHNlIHsKJGdyb3VwID0gJGxpdGVyYWwgPiAwID8gJ2luc3RhbGwnIDogJ2RvblwndCBpbnN0YWxsJzsKfQoKJGdyb3Vwc1skZ3JvdXBdW10gPSAkdGhpcy0+ZGVkdXBsaWNhdGVEZWZhdWx0QnJhbmNoQWxpYXMoJHBhY2thZ2UpOwp9CiRydWxlVGV4dHMgPSBbXTsKZm9yZWFjaCAoJGdyb3VwcyBhcyAkZ3JvdXAgPT4gJHBhY2thZ2VzKSB7CiRydWxlVGV4dHNbXSA9ICRncm91cCAuIChcY291bnQoJHBhY2thZ2VzKSA+IDEgPyAnIG9uZSBvZicgOiAnJykuJyAnIC4gJHRoaXMtPmZvcm1hdFBhY2thZ2VzVW5pcXVlKCRwb29sLCAkcGFja2FnZXMsICRpc1ZlcmJvc2UpOwp9CgokcnVsZVRleHQgPSBpbXBsb2RlKCcgfCAnLCAkcnVsZVRleHRzKTsKfQoKcmV0dXJuICdDb25jbHVzaW9uOiAnLiRydWxlVGV4dC4kbGVhcm5lZFN0cmluZzsKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfQUxJQVM6CiRhbGlhc1BhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pOwoKCmlmICgkYWxpYXNQYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CnJldHVybiAnJzsKfQokcGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMV0pKTsKCnJldHVybiAkYWxpYXNQYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKSAuJyBpcyBhbiBhbGlhcyBvZiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nIGFuZCB0aHVzIHJlcXVpcmVzIGl0IHRvIGJlIGluc3RhbGxlZCB0b28uJzsKY2FzZSBzZWxmOjpSVUxFX1BBQ0tBR0VfSU5WRVJTRV9BTElBUzoKCiRhbGlhc1BhY2thZ2UgPSAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMV0pOwoKCmlmICgkYWxpYXNQYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CnJldHVybiAnJzsKfQokcGFja2FnZSA9ICR0aGlzLT5kZWR1cGxpY2F0ZURlZmF1bHRCcmFuY2hBbGlhcygkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkbGl0ZXJhbHNbMF0pKTsKCnJldHVybiAkYWxpYXNQYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKSAuJyBpcyBhbiBhbGlhcyBvZiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nIGFuZCBtdXN0IGJlIGluc3RhbGxlZCB3aXRoIGl0Lic7CmRlZmF1bHQ6CiRydWxlVGV4dCA9ICcnOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGkgPT4gJGxpdGVyYWwpIHsKaWYgKCRpICE9PSAwKSB7CiRydWxlVGV4dCAuPSAnfCc7Cn0KJHJ1bGVUZXh0IC49ICRwb29sLT5saXRlcmFsVG9QcmV0dHlTdHJpbmcoJGxpdGVyYWwsICRpbnN0YWxsZWRNYXApOwp9CgpyZXR1cm4gJygnLiRydWxlVGV4dC4nKSc7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZvcm1hdFBhY2thZ2VzVW5pcXVlKFBvb2wgJHBvb2wsIGFycmF5ICRsaXRlcmFsc09yUGFja2FnZXMsIGJvb2wgJGlzVmVyYm9zZSwgP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQgPSBudWxsLCBib29sICR1c2VSZW1vdmVkVmVyc2lvbkdyb3VwID0gZmFsc2UpOiBzdHJpbmcKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJGxpdGVyYWxzT3JQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokcGFja2FnZXNbXSA9IFxpc19vYmplY3QoJHBhY2thZ2UpID8gJHBhY2thZ2UgOiAkcG9vbC0+bGl0ZXJhbFRvUGFja2FnZSgkcGFja2FnZSk7Cn0KCnJldHVybiBQcm9ibGVtOjpnZXRQYWNrYWdlTGlzdCgkcGFja2FnZXMsICRpc1ZlcmJvc2UsICRwb29sLCAkY29uc3RyYWludCwgJHVzZVJlbW92ZWRWZXJzaW9uR3JvdXApOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRlZHVwbGljYXRlRGVmYXVsdEJyYW5jaEFsaWFzKEJhc2VQYWNrYWdlICRwYWNrYWdlKTogQmFzZVBhY2thZ2UKewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgpyZXR1cm4gJHBhY2thZ2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKCmNsYXNzIFJ1bGUyTGl0ZXJhbHMgZXh0ZW5kcyBSdWxlCnsKCnByb3RlY3RlZCAkbGl0ZXJhbDE7Cgpwcm90ZWN0ZWQgJGxpdGVyYWwyOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkbGl0ZXJhbDEsIGludCAkbGl0ZXJhbDIsICRyZWFzb24sICRyZWFzb25EYXRhKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwoKaWYgKCRsaXRlcmFsMSA8ICRsaXRlcmFsMikgewokdGhpcy0+bGl0ZXJhbDEgPSAkbGl0ZXJhbDE7CiR0aGlzLT5saXRlcmFsMiA9ICRsaXRlcmFsMjsKfSBlbHNlIHsKJHRoaXMtPmxpdGVyYWwxID0gJGxpdGVyYWwyOwokdGhpcy0+bGl0ZXJhbDIgPSAkbGl0ZXJhbDE7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExpdGVyYWxzKCk6IGFycmF5CnsKcmV0dXJuIFskdGhpcy0+bGl0ZXJhbDEsICR0aGlzLT5saXRlcmFsMl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIYXNoKCkKewpyZXR1cm4gJHRoaXMtPmxpdGVyYWwxLicsJy4kdGhpcy0+bGl0ZXJhbDI7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFscyhSdWxlICRydWxlKTogYm9vbAp7CgppZiAoJHJ1bGUgaW5zdGFuY2VvZiBzZWxmKSB7CmlmICgkdGhpcy0+bGl0ZXJhbDEgIT09ICRydWxlLT5saXRlcmFsMSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+bGl0ZXJhbDIgIT09ICRydWxlLT5saXRlcmFsMikgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgokbGl0ZXJhbHMgPSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKaWYgKDIgIT09IFxjb3VudCgkbGl0ZXJhbHMpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5saXRlcmFsMSAhPT0gJGxpdGVyYWxzWzBdKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5saXRlcmFsMiAhPT0gJGxpdGVyYWxzWzFdKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgpwdWJsaWMgZnVuY3Rpb24gaXNBc3NlcnRpb24oKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKJHJlc3VsdCA9ICR0aGlzLT5pc0Rpc2FibGVkKCkgPyAnZGlzYWJsZWQoJyA6ICcoJzsKCiRyZXN1bHQgLj0gJHRoaXMtPmxpdGVyYWwxIC4gJ3wnIC4gJHRoaXMtPmxpdGVyYWwyIC4gJyknOwoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKCgoKCgoKCmNsYXNzIFJ1bGVTZXQgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUsIFxDb3VudGFibGUKewoKcHVibGljIGNvbnN0IFRZUEVfUEFDS0FHRSA9IDA7CnB1YmxpYyBjb25zdCBUWVBFX1JFUVVFU1QgPSAxOwpwdWJsaWMgY29uc3QgVFlQRV9MRUFSTkVEID0gNDsKCgoKCgoKcHVibGljICRydWxlQnlJZCA9IFtdOwoKcHVibGljIGNvbnN0IFRZUEVTID0gWwpzZWxmOjpUWVBFX1BBQ0tBR0UgPT4gJ1BBQ0tBR0UnLApzZWxmOjpUWVBFX1JFUVVFU1QgPT4gJ1JFUVVFU1QnLApzZWxmOjpUWVBFX0xFQVJORUQgPT4gJ0xFQVJORUQnLApdOwoKCnByb3RlY3RlZCAkcnVsZXM7CgoKcHJvdGVjdGVkICRuZXh0UnVsZUlkID0gMDsKCgpwcm90ZWN0ZWQgJHJ1bGVzQnlIYXNoID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CmZvcmVhY2ggKCR0aGlzLT5nZXRUeXBlcygpIGFzICR0eXBlKSB7CiR0aGlzLT5ydWxlc1skdHlwZV0gPSBbXTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKFJ1bGUgJHJ1bGUsICR0eXBlKTogdm9pZAp7CmlmICghaXNzZXQoc2VsZjo6VFlQRVNbJHR5cGVdKSkgewp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdVbmtub3duIHJ1bGUgdHlwZTogJyAuICR0eXBlKTsKfQoKJGhhc2ggPSAkcnVsZS0+Z2V0SGFzaCgpOwoKCmlmIChpc3NldCgkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdKSkgewokcG90ZW50aWFsRHVwbGljYXRlcyA9ICR0aGlzLT5ydWxlc0J5SGFzaFskaGFzaF07CmlmIChcaXNfYXJyYXkoJHBvdGVudGlhbER1cGxpY2F0ZXMpKSB7CmZvcmVhY2ggKCRwb3RlbnRpYWxEdXBsaWNhdGVzIGFzICRwb3RlbnRpYWxEdXBsaWNhdGUpIHsKaWYgKCRydWxlLT5lcXVhbHMoJHBvdGVudGlhbER1cGxpY2F0ZSkpIHsKcmV0dXJuOwp9Cn0KfSBlbHNlIHsKaWYgKCRydWxlLT5lcXVhbHMoJHBvdGVudGlhbER1cGxpY2F0ZXMpKSB7CnJldHVybjsKfQp9Cn0KCmlmICghaXNzZXQoJHRoaXMtPnJ1bGVzWyR0eXBlXSkpIHsKJHRoaXMtPnJ1bGVzWyR0eXBlXSA9IFtdOwp9CgokdGhpcy0+cnVsZXNbJHR5cGVdW10gPSAkcnVsZTsKJHRoaXMtPnJ1bGVCeUlkWyR0aGlzLT5uZXh0UnVsZUlkXSA9ICRydWxlOwokcnVsZS0+c2V0VHlwZSgkdHlwZSk7CgokdGhpcy0+bmV4dFJ1bGVJZCsrOwoKaWYgKCFpc3NldCgkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdKSkgewokdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdID0gJHJ1bGU7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXSkpIHsKJHRoaXMtPnJ1bGVzQnlIYXNoWyRoYXNoXVtdID0gJHJ1bGU7Cn0gZWxzZSB7CiRvcmlnaW5hbFJ1bGUgPSAkdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdOwokdGhpcy0+cnVsZXNCeUhhc2hbJGhhc2hdID0gWyRvcmlnaW5hbFJ1bGUsICRydWxlXTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuICR0aGlzLT5uZXh0UnVsZUlkOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVsZUJ5SWQoaW50ICRpZCk6IFJ1bGUKewpyZXR1cm4gJHRoaXMtPnJ1bGVCeUlkWyRpZF07Cn0KCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJ1bGVzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKTogUnVsZVNldEl0ZXJhdG9yCnsKcmV0dXJuIG5ldyBSdWxlU2V0SXRlcmF0b3IoJHRoaXMtPmdldFJ1bGVzKCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3JGb3IoJHR5cGVzKTogUnVsZVNldEl0ZXJhdG9yCnsKaWYgKCFcaXNfYXJyYXkoJHR5cGVzKSkgewokdHlwZXMgPSBbJHR5cGVzXTsKfQoKJGFsbFJ1bGVzID0gJHRoaXMtPmdldFJ1bGVzKCk7CgoKJHJ1bGVzID0gW107Cgpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKJHJ1bGVzWyR0eXBlXSA9ICRhbGxSdWxlc1skdHlwZV07Cn0KCnJldHVybiBuZXcgUnVsZVNldEl0ZXJhdG9yKCRydWxlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcldpdGhvdXQoJHR5cGVzKTogUnVsZVNldEl0ZXJhdG9yCnsKaWYgKCFcaXNfYXJyYXkoJHR5cGVzKSkgewokdHlwZXMgPSBbJHR5cGVzXTsKfQoKJHJ1bGVzID0gJHRoaXMtPmdldFJ1bGVzKCk7Cgpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKdW5zZXQoJHJ1bGVzWyR0eXBlXSk7Cn0KCnJldHVybiBuZXcgUnVsZVNldEl0ZXJhdG9yKCRydWxlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlcygpOiBhcnJheQp7CiR0eXBlcyA9IHNlbGY6OlRZUEVTOwoKcmV0dXJuIGFycmF5X2tleXMoJHR5cGVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyg/UmVwb3NpdG9yeVNldCAkcmVwb3NpdG9yeVNldCA9IG51bGwsID9SZXF1ZXN0ICRyZXF1ZXN0ID0gbnVsbCwgP1Bvb2wgJHBvb2wgPSBudWxsLCBib29sICRpc1ZlcmJvc2UgPSBmYWxzZSk6IHN0cmluZwp7CiRzdHJpbmcgPSAiXG4iOwpmb3JlYWNoICgkdGhpcy0+cnVsZXMgYXMgJHR5cGUgPT4gJHJ1bGVzKSB7CiRzdHJpbmcgLj0gc3RyX3BhZChzZWxmOjpUWVBFU1skdHlwZV0sIDgsICcgJykgLiAiOiAiOwpmb3JlYWNoICgkcnVsZXMgYXMgJHJ1bGUpIHsKJHN0cmluZyAuPSAoJHJlcG9zaXRvcnlTZXQgIT09IG51bGwgJiYgJHJlcXVlc3QgIT09IG51bGwgJiYgJHBvb2wgIT09IG51bGwgPyAkcnVsZS0+Z2V0UHJldHR5U3RyaW5nKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wsICRpc1ZlcmJvc2UpIDogJHJ1bGUpLiJcbiI7Cn0KJHN0cmluZyAuPSAiXG5cbiI7Cn0KCnJldHVybiAkc3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVN0cmluZygpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlcjsKCnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Owp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKCgoKCgpjbGFzcyBSdWxlU2V0R2VuZXJhdG9yCnsKCnByb3RlY3RlZCAkcG9saWN5OwoKcHJvdGVjdGVkICRwb29sOwoKcHJvdGVjdGVkICRydWxlczsKCnByb3RlY3RlZCAkYWRkZWRNYXAgPSBbXTsKCnByb3RlY3RlZCAkYWRkZWRQYWNrYWdlc0J5TmFtZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSwgUG9vbCAkcG9vbCkKewokdGhpcy0+cG9saWN5ID0gJHBvbGljeTsKJHRoaXMtPnBvb2wgPSAkcG9vbDsKJHRoaXMtPnJ1bGVzID0gbmV3IFJ1bGVTZXQ7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZVJlcXVpcmVSdWxlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBhcnJheSAkcHJvdmlkZXJzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk6ID9SdWxlCnsKJGxpdGVyYWxzID0gWy0kcGFja2FnZS0+aWRdOwoKZm9yZWFjaCAoJHByb3ZpZGVycyBhcyAkcHJvdmlkZXIpIHsKCmlmICgkcHJvdmlkZXIgPT09ICRwYWNrYWdlKSB7CnJldHVybiBudWxsOwp9CiRsaXRlcmFsc1tdID0gJHByb3ZpZGVyLT5pZDsKfQoKcmV0dXJuIG5ldyBHZW5lcmljUnVsZSgkbGl0ZXJhbHMsICRyZWFzb24sICRyZWFzb25EYXRhKTsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlSW5zdGFsbE9uZU9mUnVsZShhcnJheSAkcGFja2FnZXMsICRyZWFzb24sICRyZWFzb25EYXRhKTogUnVsZQp7CiRsaXRlcmFscyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGxpdGVyYWxzW10gPSAkcGFja2FnZS0+aWQ7Cn0KCnJldHVybiBuZXcgR2VuZXJpY1J1bGUoJGxpdGVyYWxzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZVJ1bGUyTGl0ZXJhbHMoQmFzZVBhY2thZ2UgJGlzc3VlciwgQmFzZVBhY2thZ2UgJHByb3ZpZGVyLCAkcmVhc29uLCAkcmVhc29uRGF0YSk6ID9SdWxlCnsKCmlmICgkaXNzdWVyID09PSAkcHJvdmlkZXIpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBuZXcgUnVsZTJMaXRlcmFscygtJGlzc3Vlci0+aWQsIC0kcHJvdmlkZXItPmlkLCAkcmVhc29uLCAkcmVhc29uRGF0YSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlTXVsdGlDb25mbGljdFJ1bGUoYXJyYXkgJHBhY2thZ2VzLCAkcmVhc29uLCAkcmVhc29uRGF0YSk6IFJ1bGUKewokbGl0ZXJhbHMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiRsaXRlcmFsc1tdID0gLSRwYWNrYWdlLT5pZDsKfQoKaWYgKFxjb3VudCgkbGl0ZXJhbHMpID09PSAyKSB7CnJldHVybiBuZXcgUnVsZTJMaXRlcmFscygkbGl0ZXJhbHNbMF0sICRsaXRlcmFsc1sxXSwgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwp9CgpyZXR1cm4gbmV3IE11bHRpQ29uZmxpY3RSdWxlKCRsaXRlcmFscywgJHJlYXNvbiwgJHJlYXNvbkRhdGEpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZFJ1bGUoJHR5cGUsID9SdWxlICRuZXdSdWxlID0gbnVsbCk6IHZvaWQKewppZiAobnVsbCA9PT0gJG5ld1J1bGUpIHsKcmV0dXJuOwp9CgokdGhpcy0+cnVsZXMtPmFkZCgkbmV3UnVsZSwgJHR5cGUpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkUnVsZXNGb3JQYWNrYWdlKEJhc2VQYWNrYWdlICRwYWNrYWdlLCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7Cgokd29ya1F1ZXVlID0gbmV3IFxTcGxRdWV1ZTsKJHdvcmtRdWV1ZS0+ZW5xdWV1ZSgkcGFja2FnZSk7Cgp3aGlsZSAoISR3b3JrUXVldWUtPmlzRW1wdHkoKSkgewokcGFja2FnZSA9ICR3b3JrUXVldWUtPmRlcXVldWUoKTsKaWYgKGlzc2V0KCR0aGlzLT5hZGRlZE1hcFskcGFja2FnZS0+aWRdKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5pZF0gPSAkcGFja2FnZTsKCmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkbmFtZSkgewokdGhpcy0+YWRkZWRQYWNrYWdlc0J5TmFtZXNbJG5hbWVdW10gPSAkcGFja2FnZTsKfQp9IGVsc2Ugewokd29ya1F1ZXVlLT5lbnF1ZXVlKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpOwokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVSZXF1aXJlUnVsZSgkcGFja2FnZSwgWyRwYWNrYWdlLT5nZXRBbGlhc09mKCldLCBSdWxlOjpSVUxFX1BBQ0tBR0VfQUxJQVMsICRwYWNrYWdlKSk7CgoKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlUmVxdWlyZVJ1bGUoJHBhY2thZ2UtPmdldEFsaWFzT2YoKSwgWyRwYWNrYWdlXSwgUnVsZTo6UlVMRV9QQUNLQUdFX0lOVkVSU0VfQUxJQVMsICRwYWNrYWdlLT5nZXRBbGlhc09mKCkpKTsKCgoKaWYgKCEkcGFja2FnZS0+aGFzU2VsZlZlcnNpb25SZXF1aXJlcygpKSB7CmNvbnRpbnVlOwp9Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50KTsKfQoKJHBvc3NpYmxlUmVxdWlyZXMgPSAkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQpOwoKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9QQUNLQUdFLCAkdGhpcy0+Y3JlYXRlUmVxdWlyZVJ1bGUoJHBhY2thZ2UsICRwb3NzaWJsZVJlcXVpcmVzLCBSdWxlOjpSVUxFX1BBQ0tBR0VfUkVRVUlSRVMsICRsaW5rKSk7Cgpmb3JlYWNoICgkcG9zc2libGVSZXF1aXJlcyBhcyAkcmVxdWlyZSkgewokd29ya1F1ZXVlLT5lbnF1ZXVlKCRyZXF1aXJlKTsKfQp9Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZENvbmZsaWN0UnVsZXMoUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik6IHZvaWQKewoKZm9yZWFjaCAoJHRoaXMtPmFkZGVkTWFwIGFzICRwYWNrYWdlKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewoKaWYgKCFpc3NldCgkdGhpcy0+YWRkZWRQYWNrYWdlc0J5TmFtZXNbJGxpbmstPmdldFRhcmdldCgpXSkpIHsKY29udGludWU7Cn0KCiRjb25zdHJhaW50ID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5pc0lnbm9yZWQoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfSBlbHNlaWYgKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpIHsKJGNvbnN0cmFpbnQgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+ZmlsdGVyQ29uc3RyYWludCgkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50LCBmYWxzZSk7Cn0KCiRjb25mbGljdHMgPSAkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGNvbnN0cmFpbnQpOwoKZm9yZWFjaCAoJGNvbmZsaWN0cyBhcyAkY29uZmxpY3QpIHsKCgoKaWYgKCEkY29uZmxpY3QgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgfHwgJGNvbmZsaWN0LT5nZXROYW1lKCkgPT09ICRsaW5rLT5nZXRUYXJnZXQoKSkgewokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVSdWxlMkxpdGVyYWxzKCRwYWNrYWdlLCAkY29uZmxpY3QsIFJ1bGU6OlJVTEVfUEFDS0FHRV9DT05GTElDVCwgJGxpbmspKTsKfQp9Cn0KfQoKZm9yZWFjaCAoJHRoaXMtPmFkZGVkUGFja2FnZXNCeU5hbWVzIGFzICRuYW1lID0+ICRwYWNrYWdlcykgewppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAxKSB7CiRyZWFzb24gPSBSdWxlOjpSVUxFX1BBQ0tBR0VfU0FNRV9OQU1FOwokdGhpcy0+YWRkUnVsZShSdWxlU2V0OjpUWVBFX1BBQ0tBR0UsICR0aGlzLT5jcmVhdGVNdWx0aUNvbmZsaWN0UnVsZSgkcGFja2FnZXMsICRyZWFzb24sICRuYW1lKSk7Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkUnVsZXNGb3JSZXF1ZXN0KFJlcXVlc3QgJHJlcXVlc3QsIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHJlcXVlc3QtPmdldEZpeGVkUGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UtPmlkID09PSAtMSkgewoKaWYgKCR0aGlzLT5wb29sLT5pc1VuYWNjZXB0YWJsZUZpeGVkT3JMb2NrZWRQYWNrYWdlKCRwYWNrYWdlKSkgewpjb250aW51ZTsKfQoKCnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oIkZpeGVkIHBhY2thZ2UgIi4kcGFja2FnZS0+Z2V0UHJldHR5U3RyaW5nKCkuIiB3YXMgbm90IGFkZGVkIHRvIHNvbHZlciBwb29sLiIpOwp9CgokdGhpcy0+YWRkUnVsZXNGb3JQYWNrYWdlKCRwYWNrYWdlLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CgokcnVsZSA9ICR0aGlzLT5jcmVhdGVJbnN0YWxsT25lT2ZSdWxlKFskcGFja2FnZV0sIFJ1bGU6OlJVTEVfRklYRUQsIFsKJ3BhY2thZ2UnID0+ICRwYWNrYWdlLApdKTsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9SRVFVRVNULCAkcnVsZSk7Cn0KCmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkcGFja2FnZU5hbWUpKSB7CmNvbnRpbnVlOwp9IGVsc2VpZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokY29uc3RyYWludCA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwp9CgokcGFja2FnZXMgPSAkdGhpcy0+cG9vbC0+d2hhdFByb3ZpZGVzKCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwppZiAoXGNvdW50KCRwYWNrYWdlcykgPiAwKSB7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdGhpcy0+YWRkUnVsZXNGb3JQYWNrYWdlKCRwYWNrYWdlLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7Cn0KCiRydWxlID0gJHRoaXMtPmNyZWF0ZUluc3RhbGxPbmVPZlJ1bGUoJHBhY2thZ2VzLCBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSwgWwoncGFja2FnZU5hbWUnID0+ICRwYWNrYWdlTmFtZSwKJ2NvbnN0cmFpbnQnID0+ICRjb25zdHJhaW50LApdKTsKJHRoaXMtPmFkZFJ1bGUoUnVsZVNldDo6VFlQRV9SRVFVRVNULCAkcnVsZSk7Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkUnVsZXNGb3JSb290QWxpYXNlcyhQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5wb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CgoKCmlmICghaXNzZXQoJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5pZF0pICYmCiRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmCigkcGFja2FnZS0+aXNSb290UGFja2FnZUFsaWFzKCkgfHwgaXNzZXQoJHRoaXMtPmFkZGVkTWFwWyRwYWNrYWdlLT5nZXRBbGlhc09mKCktPmlkXSkpCikgewokdGhpcy0+YWRkUnVsZXNGb3JQYWNrYWdlKCRwYWNrYWdlLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7Cn0KfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UnVsZXNGb3IoUmVxdWVzdCAkcmVxdWVzdCwgP1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBudWxsKTogUnVsZVNldAp7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPz8gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKCiR0aGlzLT5hZGRSdWxlc0ZvclJlcXVlc3QoJHJlcXVlc3QsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCiR0aGlzLT5hZGRSdWxlc0ZvclJvb3RBbGlhc2VzKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCiR0aGlzLT5hZGRDb25mbGljdFJ1bGVzKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKCgokdGhpcy0+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+d2F0Y2gyID0gJHRvOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXEFkdmlzb3J5XEF1ZGl0Q29uZmlnOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRvcjsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgpjbGFzcyBTZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlcgp7Cgpwcml2YXRlICRhdWRpdG9yOwoKcHJpdmF0ZSAkYXVkaXRDb25maWc7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCkF1ZGl0b3IgJGF1ZGl0b3IsCkF1ZGl0Q29uZmlnICRhdWRpdENvbmZpZwopIHsKJHRoaXMtPmF1ZGl0b3IgPSAkYXVkaXRvcjsKJHRoaXMtPmF1ZGl0Q29uZmlnID0gJGF1ZGl0Q29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsdGVyKFBvb2wgJHBvb2wsIGFycmF5ICRyZXBvc2l0b3JpZXMsIFJlcXVlc3QgJHJlcXVlc3QpOiBQb29sCnsKaWYgKCEkdGhpcy0+YXVkaXRDb25maWctPmJsb2NrSW5zZWN1cmUpIHsKcmV0dXJuICRwb29sOwp9CgokcmVwb1NldCA9IG5ldyBSZXBvc2l0b3J5U2V0KCk7CmZvcmVhY2ggKCRyZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKJHJlcG9TZXQtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9CgokcGFja2FnZXNGb3JBZHZpc29yaWVzID0gW107CmZvcmVhY2ggKCRwb29sLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290UGFja2FnZUludGVyZmFjZSAmJiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZS0+Z2V0TmFtZSgpKSAmJiAhJHJlcXVlc3QtPmlzTG9ja2VkUGFja2FnZSgkcGFja2FnZSkpIHsKJHBhY2thZ2VzRm9yQWR2aXNvcmllc1tdID0gJHBhY2thZ2U7Cn0KfQoKJGFsbEFkdmlzb3JpZXMgPSAkcmVwb1NldC0+Z2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VzRm9yQWR2aXNvcmllcywgdHJ1ZSwgdHJ1ZSk7CmlmICgkdGhpcy0+YXVkaXRvci0+bmVlZHNDb21wbGV0ZUFkdmlzb3J5TG9hZCgkYWxsQWR2aXNvcmllc1snYWR2aXNvcmllcyddLCAkdGhpcy0+YXVkaXRDb25maWctPmlnbm9yZUxpc3RGb3JCbG9ja2luZykpIHsKJGFsbEFkdmlzb3JpZXMgPSAkcmVwb1NldC0+Z2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VzRm9yQWR2aXNvcmllcywgZmFsc2UsIHRydWUpOwp9CgokYWR2aXNvcnlNYXAgPSAkdGhpcy0+YXVkaXRvci0+cHJvY2Vzc0Fkdmlzb3JpZXMoJGFsbEFkdmlzb3JpZXNbJ2Fkdmlzb3JpZXMnXSwgJHRoaXMtPmF1ZGl0Q29uZmlnLT5pZ25vcmVMaXN0Rm9yQmxvY2tpbmcsICR0aGlzLT5hdWRpdENvbmZpZy0+aWdub3JlU2V2ZXJpdHlGb3JCbG9ja2luZylbJ2Fkdmlzb3JpZXMnXTsKCiRwYWNrYWdlcyA9IFtdOwokc2VjdXJpdHlSZW1vdmVkVmVyc2lvbnMgPSBbXTsKJGFiYW5kb25lZFJlbW92ZWRWZXJzaW9ucyA9IFtdOwpmb3JlYWNoICgkcG9vbC0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewppZiAoJHRoaXMtPmF1ZGl0Q29uZmlnLT5ibG9ja0FiYW5kb25lZCAmJiBjb3VudCgkdGhpcy0+YXVkaXRvci0+ZmlsdGVyQWJhbmRvbmVkUGFja2FnZXMoWyRwYWNrYWdlXSwgJHRoaXMtPmF1ZGl0Q29uZmlnLT5pZ25vcmVBYmFuZG9uZWRGb3JCbG9ja2luZykpICE9PSAwKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJHBhY2thZ2VOYW1lKSB7CiRhYmFuZG9uZWRSZW1vdmVkVmVyc2lvbnNbJHBhY2thZ2VOYW1lXVskcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KY29udGludWU7Cn0KCiRtYXRjaGluZ0Fkdmlzb3JpZXMgPSAkdGhpcy0+Z2V0TWF0Y2hpbmdBZHZpc29yaWVzKCRwYWNrYWdlLCAkYWR2aXNvcnlNYXApOwppZiAoY291bnQoJG1hdGNoaW5nQWR2aXNvcmllcykgPiAwKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXROYW1lcyhmYWxzZSkgYXMgJHBhY2thZ2VOYW1lKSB7CiRzZWN1cml0eVJlbW92ZWRWZXJzaW9uc1skcGFja2FnZU5hbWVdWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldID0gJG1hdGNoaW5nQWR2aXNvcmllczsKfQoKY29udGludWU7Cn0KCiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7Cn0KCnJldHVybiBuZXcgUG9vbCgkcGFja2FnZXMsICRwb29sLT5nZXRVbmFjY2VwdGFibGVGaXhlZE9yTG9ja2VkUGFja2FnZXMoKSwgJHBvb2wtPmdldEFsbFJlbW92ZWRWZXJzaW9ucygpLCAkcG9vbC0+Z2V0QWxsUmVtb3ZlZFZlcnNpb25zQnlQYWNrYWdlKCksICRzZWN1cml0eVJlbW92ZWRWZXJzaW9ucywgJGFiYW5kb25lZFJlbW92ZWRWZXJzaW9ucyk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldE1hdGNoaW5nQWR2aXNvcmllcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkYWR2aXNvcnlNYXApOiBhcnJheQp7CmlmICgkcGFja2FnZS0+aXNEZXYoKSkgewpyZXR1cm4gW107Cn0KCiRtYXRjaGluZ0Fkdmlzb3JpZXMgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldE5hbWVzKGZhbHNlKSBhcyAkcGFja2FnZU5hbWUpIHsKaWYgKCFpc3NldCgkYWR2aXNvcnlNYXBbJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCiRwYWNrYWdlQ29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KENvbnN0cmFpbnQ6OlNUUl9PUF9FUSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7CmZvcmVhY2ggKCRhZHZpc29yeU1hcFskcGFja2FnZU5hbWVdIGFzICRhZHZpc29yeSkgewppZiAoJGFkdmlzb3J5LT5hZmZlY3RlZFZlcnNpb25zLT5tYXRjaGVzKCRwYWNrYWdlQ29uc3RyYWludCkpIHsKJG1hdGNoaW5nQWR2aXNvcmllc1tdID0gJGFkdmlzb3J5Owp9Cn0KfQoKcmV0dXJuICRtYXRjaGluZ0Fkdmlzb3JpZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwoKCgoKY2xhc3MgU29sdmVyCnsKcHJpdmF0ZSBjb25zdCBCUkFOQ0hfTElURVJBTFMgPSAwOwpwcml2YXRlIGNvbnN0IEJSQU5DSF9MRVZFTCA9IDE7CgoKcHJvdGVjdGVkICRwb2xpY3k7Cgpwcm90ZWN0ZWQgJHBvb2w7CgoKcHJvdGVjdGVkICRydWxlczsKCgpwcm90ZWN0ZWQgJHdhdGNoR3JhcGg7Cgpwcm90ZWN0ZWQgJGRlY2lzaW9uczsKCnByb3RlY3RlZCAkZml4ZWRNYXA7CgoKcHJvdGVjdGVkICRwcm9wYWdhdGVJbmRleDsKCnByb3RlY3RlZCAkYnJhbmNoZXMgPSBbXTsKCnByb3RlY3RlZCAkcHJvYmxlbXMgPSBbXTsKCnByb3RlY3RlZCAkbGVhcm5lZFBvb2wgPSBbXTsKCnByb3RlY3RlZCAkbGVhcm5lZFdoeSA9IFtdOwoKCnB1YmxpYyAkdGVzdEZsYWdMZWFybmVkUG9zaXRpdmVMaXRlcmFsID0gZmFsc2U7CgoKcHJvdGVjdGVkICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSwgUG9vbCAkcG9vbCwgSU9JbnRlcmZhY2UgJGlvKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPnBvbGljeSA9ICRwb2xpY3k7CiR0aGlzLT5wb29sID0gJHBvb2w7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSdWxlU2V0U2l6ZSgpOiBpbnQKewpyZXR1cm4gXGNvdW50KCR0aGlzLT5ydWxlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQb29sKCk6IFBvb2wKewpyZXR1cm4gJHRoaXMtPnBvb2w7Cn0KCgoKcHJpdmF0ZSBmdW5jdGlvbiBtYWtlQXNzZXJ0aW9uUnVsZURlY2lzaW9ucygpOiB2b2lkCnsKJGRlY2lzaW9uU3RhcnQgPSBcY291bnQoJHRoaXMtPmRlY2lzaW9ucykgLSAxOwoKJHJ1bGVzQ291bnQgPSBcY291bnQoJHRoaXMtPnJ1bGVzKTsKZm9yICgkcnVsZUluZGV4ID0gMDsgJHJ1bGVJbmRleCA8ICRydWxlc0NvdW50OyAkcnVsZUluZGV4KyspIHsKJHJ1bGUgPSAkdGhpcy0+cnVsZXMtPnJ1bGVCeUlkWyRydWxlSW5kZXhdOwoKaWYgKCEkcnVsZS0+aXNBc3NlcnRpb24oKSB8fCAkcnVsZS0+aXNEaXNhYmxlZCgpKSB7CmNvbnRpbnVlOwp9CgokbGl0ZXJhbHMgPSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKJGxpdGVyYWwgPSAkbGl0ZXJhbHNbMF07CgppZiAoISR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZWQoJGxpdGVyYWwpKSB7CiR0aGlzLT5kZWNpc2lvbnMtPmRlY2lkZSgkbGl0ZXJhbCwgMSwgJHJ1bGUpOwpjb250aW51ZTsKfQoKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoJGxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKFJ1bGVTZXQ6OlRZUEVfTEVBUk5FRCA9PT0gJHJ1bGUtPmdldFR5cGUoKSkgewokcnVsZS0+ZGlzYWJsZSgpOwpjb250aW51ZTsKfQoKJGNvbmZsaWN0ID0gJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25SdWxlKCRsaXRlcmFsKTsKCmlmIChSdWxlU2V0OjpUWVBFX1BBQ0tBR0UgPT09ICRjb25mbGljdC0+Z2V0VHlwZSgpKSB7CiRwcm9ibGVtID0gbmV3IFByb2JsZW0oKTsKCiRwcm9ibGVtLT5hZGRSdWxlKCRydWxlKTsKJHByb2JsZW0tPmFkZFJ1bGUoJGNvbmZsaWN0KTsKJHJ1bGUtPmRpc2FibGUoKTsKJHRoaXMtPnByb2JsZW1zW10gPSAkcHJvYmxlbTsKY29udGludWU7Cn0KCgokcHJvYmxlbSA9IG5ldyBQcm9ibGVtKCk7CiRwcm9ibGVtLT5hZGRSdWxlKCRydWxlKTsKJHByb2JsZW0tPmFkZFJ1bGUoJGNvbmZsaWN0KTsKCgoKZm9yZWFjaCAoJHRoaXMtPnJ1bGVzLT5nZXRJdGVyYXRvckZvcihSdWxlU2V0OjpUWVBFX1JFUVVFU1QpIGFzICRhc3NlcnRSdWxlKSB7CmlmICgkYXNzZXJ0UnVsZS0+aXNEaXNhYmxlZCgpIHx8ICEkYXNzZXJ0UnVsZS0+aXNBc3NlcnRpb24oKSkgewpjb250aW51ZTsKfQoKJGFzc2VydFJ1bGVMaXRlcmFscyA9ICRhc3NlcnRSdWxlLT5nZXRMaXRlcmFscygpOwokYXNzZXJ0UnVsZUxpdGVyYWwgPSAkYXNzZXJ0UnVsZUxpdGVyYWxzWzBdOwoKaWYgKGFicygkbGl0ZXJhbCkgIT09IGFicygkYXNzZXJ0UnVsZUxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CiRwcm9ibGVtLT5hZGRSdWxlKCRhc3NlcnRSdWxlKTsKJGFzc2VydFJ1bGUtPmRpc2FibGUoKTsKfQokdGhpcy0+cHJvYmxlbXNbXSA9ICRwcm9ibGVtOwoKJHRoaXMtPmRlY2lzaW9ucy0+cmVzZXRUb09mZnNldCgkZGVjaXNpb25TdGFydCk7CiRydWxlSW5kZXggPSAtMTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXBGaXhlZE1hcChSZXF1ZXN0ICRyZXF1ZXN0KTogdm9pZAp7CiR0aGlzLT5maXhlZE1hcCA9IFtdOwpmb3JlYWNoICgkcmVxdWVzdC0+Z2V0Rml4ZWRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5maXhlZE1hcFskcGFja2FnZS0+aWRdID0gJHBhY2thZ2U7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrRm9yUm9vdFJlcXVpcmVQcm9ibGVtcyhSZXF1ZXN0ICRyZXF1ZXN0LCBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTogdm9pZAp7CmZvcmVhY2ggKCRyZXF1ZXN0LT5nZXRSZXF1aXJlcygpIGFzICRwYWNrYWdlTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXItPmlzSWdub3JlZCgkcGFja2FnZU5hbWUpKSB7CmNvbnRpbnVlOwp9IGVsc2VpZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokY29uc3RyYWludCA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRwYWNrYWdlTmFtZSwgJGNvbnN0cmFpbnQpOwp9CgppZiAoMCA9PT0gXGNvdW50KCR0aGlzLT5wb29sLT53aGF0UHJvdmlkZXMoJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkpKSB7CiRwcm9ibGVtID0gbmV3IFByb2JsZW0oKTsKJHByb2JsZW0tPmFkZFJ1bGUobmV3IEdlbmVyaWNSdWxlKFtdLCBSdWxlOjpSVUxFX1JPT1RfUkVRVUlSRSwgWydwYWNrYWdlTmFtZScgPT4gJHBhY2thZ2VOYW1lLCAnY29uc3RyYWludCcgPT4gJGNvbnN0cmFpbnRdKSk7CiR0aGlzLT5wcm9ibGVtc1tdID0gJHByb2JsZW07Cn0KfQp9CgpwdWJsaWMgZnVuY3Rpb24gc29sdmUoUmVxdWVzdCAkcmVxdWVzdCwgP1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSBudWxsKTogTG9ja1RyYW5zYWN0aW9uCnsKJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA/PyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTo6aWdub3JlTm90aGluZygpOwoKJHRoaXMtPnNldHVwRml4ZWRNYXAoJHJlcXVlc3QpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdHZW5lcmF0aW5nIHJ1bGVzJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHJ1bGVTZXRHZW5lcmF0b3IgPSBuZXcgUnVsZVNldEdlbmVyYXRvcigkdGhpcy0+cG9saWN5LCAkdGhpcy0+cG9vbCk7CiR0aGlzLT5ydWxlcyA9ICRydWxlU2V0R2VuZXJhdG9yLT5nZXRSdWxlc0ZvcigkcmVxdWVzdCwgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwp1bnNldCgkcnVsZVNldEdlbmVyYXRvcik7CiR0aGlzLT5jaGVja0ZvclJvb3RSZXF1aXJlUHJvYmxlbXMoJHJlcXVlc3QsICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKTsKJHRoaXMtPmRlY2lzaW9ucyA9IG5ldyBEZWNpc2lvbnMoJHRoaXMtPnBvb2wpOwokdGhpcy0+d2F0Y2hHcmFwaCA9IG5ldyBSdWxlV2F0Y2hHcmFwaDsKCmZvcmVhY2ggKCR0aGlzLT5ydWxlcyBhcyAkcnVsZSkgewokdGhpcy0+d2F0Y2hHcmFwaC0+aW5zZXJ0KG5ldyBSdWxlV2F0Y2hOb2RlKCRydWxlKSk7Cn0KCgokdGhpcy0+bWFrZUFzc2VydGlvblJ1bGVEZWNpc2lvbnMoKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVzb2x2aW5nIGRlcGVuZGVuY2llcyB0aHJvdWdoIFNBVCcsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiRiZWZvcmUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0aGlzLT5ydW5TYXQoKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRGVwZW5kZW5jeSByZXNvbHV0aW9uIGNvbXBsZXRlZCBpbiAlLjNmIHNlY29uZHMnLCBtaWNyb3RpbWUodHJ1ZSkgLSAkYmVmb3JlKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKaWYgKFxjb3VudCgkdGhpcy0+cHJvYmxlbXMpID4gMCkgewp0aHJvdyBuZXcgU29sdmVyUHJvYmxlbXNFeGNlcHRpb24oJHRoaXMtPnByb2JsZW1zLCAkdGhpcy0+bGVhcm5lZFBvb2wpOwp9CgpyZXR1cm4gbmV3IExvY2tUcmFuc2FjdGlvbigkdGhpcy0+cG9vbCwgJHJlcXVlc3QtPmdldFByZXNlbnRNYXAoKSwgJHJlcXVlc3QtPmdldEZpeGVkUGFja2FnZXNNYXAoKSwgJHRoaXMtPmRlY2lzaW9ucyk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHByb3BhZ2F0ZShpbnQgJGxldmVsKTogP1J1bGUKewp3aGlsZSAoJHRoaXMtPmRlY2lzaW9ucy0+dmFsaWRPZmZzZXQoJHRoaXMtPnByb3BhZ2F0ZUluZGV4KSkgewokZGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25zLT5hdE9mZnNldCgkdGhpcy0+cHJvcGFnYXRlSW5kZXgpOwoKJGNvbmZsaWN0ID0gJHRoaXMtPndhdGNoR3JhcGgtPnByb3BhZ2F0ZUxpdGVyYWwoCiRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX0xJVEVSQUxdLAokbGV2ZWwsCiR0aGlzLT5kZWNpc2lvbnMKKTsKCiR0aGlzLT5wcm9wYWdhdGVJbmRleCsrOwoKaWYgKCRjb25mbGljdCAhPT0gbnVsbCkgewpyZXR1cm4gJGNvbmZsaWN0Owp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJldmVydChpbnQgJGxldmVsKTogdm9pZAp7CndoaWxlICghJHRoaXMtPmRlY2lzaW9ucy0+aXNFbXB0eSgpKSB7CiRsaXRlcmFsID0gJHRoaXMtPmRlY2lzaW9ucy0+bGFzdExpdGVyYWwoKTsKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT51bmRlY2lkZWQoJGxpdGVyYWwpKSB7CmJyZWFrOwp9CgokZGVjaXNpb25MZXZlbCA9ICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJGxpdGVyYWwpOwoKaWYgKCRkZWNpc2lvbkxldmVsIDw9ICRsZXZlbCkgewpicmVhazsKfQoKJHRoaXMtPmRlY2lzaW9ucy0+cmV2ZXJ0TGFzdCgpOwokdGhpcy0+cHJvcGFnYXRlSW5kZXggPSBcY291bnQoJHRoaXMtPmRlY2lzaW9ucyk7Cn0KCndoaWxlIChcY291bnQoJHRoaXMtPmJyYW5jaGVzKSA+IDAgJiYgJHRoaXMtPmJyYW5jaGVzW1xjb3VudCgkdGhpcy0+YnJhbmNoZXMpIC0gMV1bc2VsZjo6QlJBTkNIX0xFVkVMXSA+PSAkbGV2ZWwpIHsKYXJyYXlfcG9wKCR0aGlzLT5icmFuY2hlcyk7Cn0KfQoKCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0UHJvcGFnYXRlTGVhcm4oaW50ICRsZXZlbCwgaW50ICRsaXRlcmFsLCBSdWxlICRydWxlKTogaW50CnsKJGxldmVsKys7CgokdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGUoJGxpdGVyYWwsICRsZXZlbCwgJHJ1bGUpOwoKd2hpbGUgKHRydWUpIHsKJHJ1bGUgPSAkdGhpcy0+cHJvcGFnYXRlKCRsZXZlbCk7CgppZiAobnVsbCA9PT0gJHJ1bGUpIHsKYnJlYWs7Cn0KCmlmICgkbGV2ZWwgPT09IDEpIHsKJHRoaXMtPmFuYWx5emVVbnNvbHZhYmxlKCRydWxlKTsKCnJldHVybiAwOwp9CgoKWyRsZWFybkxpdGVyYWwsICRuZXdMZXZlbCwgJG5ld1J1bGUsICR3aHldID0gJHRoaXMtPmFuYWx5emUoJGxldmVsLCAkcnVsZSk7CgppZiAoJG5ld0xldmVsIDw9IDAgfHwgJG5ld0xldmVsID49ICRsZXZlbCkgewp0aHJvdyBuZXcgU29sdmVyQnVnRXhjZXB0aW9uKAoiVHJ5aW5nIHRvIHJldmVydCB0byBpbnZhbGlkIGxldmVsICIuJG5ld0xldmVsLiIgZnJvbSBsZXZlbCAiLiRsZXZlbC4iLiIKKTsKfQoKJGxldmVsID0gJG5ld0xldmVsOwoKJHRoaXMtPnJldmVydCgkbGV2ZWwpOwoKJHRoaXMtPnJ1bGVzLT5hZGQoJG5ld1J1bGUsIFJ1bGVTZXQ6OlRZUEVfTEVBUk5FRCk7CgokdGhpcy0+bGVhcm5lZFdoeVtzcGxfb2JqZWN0X2hhc2goJG5ld1J1bGUpXSA9ICR3aHk7CgokcnVsZU5vZGUgPSBuZXcgUnVsZVdhdGNoTm9kZSgkbmV3UnVsZSk7CiRydWxlTm9kZS0+d2F0Y2gyT25IaWdoZXN0KCR0aGlzLT5kZWNpc2lvbnMpOwokdGhpcy0+d2F0Y2hHcmFwaC0+aW5zZXJ0KCRydWxlTm9kZSk7CgokdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGUoJGxlYXJuTGl0ZXJhbCwgJGxldmVsLCAkbmV3UnVsZSk7Cn0KCnJldHVybiAkbGV2ZWw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2VsZWN0QW5kSW5zdGFsbChpbnQgJGxldmVsLCBhcnJheSAkZGVjaXNpb25RdWV1ZSwgUnVsZSAkcnVsZSk6IGludAp7CgokbGl0ZXJhbHMgPSAkdGhpcy0+cG9saWN5LT5zZWxlY3RQcmVmZXJyZWRQYWNrYWdlcygkdGhpcy0+cG9vbCwgJGRlY2lzaW9uUXVldWUsICRydWxlLT5nZXRSZXF1aXJlZFBhY2thZ2UoKSk7Cgokc2VsZWN0ZWRMaXRlcmFsID0gYXJyYXlfc2hpZnQoJGxpdGVyYWxzKTsKCgppZiAoXGNvdW50KCRsaXRlcmFscykgPiAwKSB7CiR0aGlzLT5icmFuY2hlc1tdID0gWyRsaXRlcmFscywgJGxldmVsXTsKfQoKcmV0dXJuICR0aGlzLT5zZXRQcm9wYWdhdGVMZWFybigkbGV2ZWwsICRzZWxlY3RlZExpdGVyYWwsICRydWxlKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFuYWx5emUoaW50ICRsZXZlbCwgUnVsZSAkcnVsZSk6IGFycmF5CnsKJGFuYWx5emVkUnVsZSA9ICRydWxlOwokcnVsZUxldmVsID0gMTsKJG51bSA9IDA7CiRsMW51bSA9IDA7CiRzZWVuID0gW107CiRsZWFybmVkTGl0ZXJhbCA9IG51bGw7CiRvdGhlckxlYXJuZWRMaXRlcmFscyA9IFtdOwoKJGRlY2lzaW9uSWQgPSBcY291bnQoJHRoaXMtPmRlY2lzaW9ucyk7CgokdGhpcy0+bGVhcm5lZFBvb2xbXSA9IFtdOwoKd2hpbGUgKHRydWUpIHsKJHRoaXMtPmxlYXJuZWRQb29sW1xjb3VudCgkdGhpcy0+bGVhcm5lZFBvb2wpIC0gMV1bXSA9ICRydWxlOwoKZm9yZWFjaCAoJHJ1bGUtPmdldExpdGVyYWxzKCkgYXMgJGxpdGVyYWwpIHsKCmlmICgkcnVsZSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlICYmICEkdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGVkKCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQoKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQoKaWYgKGlzc2V0KCRzZWVuW2FicygkbGl0ZXJhbCldKSkgewpjb250aW51ZTsKfQokc2VlblthYnMoJGxpdGVyYWwpXSA9IHRydWU7CgokbCA9ICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJGxpdGVyYWwpOwoKaWYgKDEgPT09ICRsKSB7CiRsMW51bSsrOwp9IGVsc2VpZiAoJGxldmVsID09PSAkbCkgewokbnVtKys7Cn0gZWxzZSB7Cgokb3RoZXJMZWFybmVkTGl0ZXJhbHNbXSA9ICRsaXRlcmFsOwoKaWYgKCRsID4gJHJ1bGVMZXZlbCkgewokcnVsZUxldmVsID0gJGw7Cn0KfQp9CnVuc2V0KCRsaXRlcmFsKTsKCiRsMXJldHJ5ID0gdHJ1ZTsKd2hpbGUgKCRsMXJldHJ5KSB7CiRsMXJldHJ5ID0gZmFsc2U7CgppZiAoMCA9PT0gJG51bSAmJiAwID09PSAtLSRsMW51bSkgewoKYnJlYWsgMjsKfQoKd2hpbGUgKHRydWUpIHsKaWYgKCRkZWNpc2lvbklkIDw9IDApIHsKdGhyb3cgbmV3IFNvbHZlckJ1Z0V4Y2VwdGlvbigKIlJlYWNoZWQgaW52YWxpZCBkZWNpc2lvbiBpZCAkZGVjaXNpb25JZCB3aGlsZSBsb29raW5nIHRocm91Z2ggJHJ1bGUgZm9yIGEgbGl0ZXJhbCBwcmVzZW50IGluIHRoZSBhbmFseXplZCBydWxlICRhbmFseXplZFJ1bGUuIgopOwp9CgokZGVjaXNpb25JZC0tOwoKJGRlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9ucy0+YXRPZmZzZXQoJGRlY2lzaW9uSWQpOwokbGl0ZXJhbCA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX0xJVEVSQUxdOwoKaWYgKGlzc2V0KCRzZWVuW2FicygkbGl0ZXJhbCldKSkgewpicmVhazsKfQp9Cgp1bnNldCgkc2VlblthYnMoJGxpdGVyYWwpXSk7CgppZiAoMCAhPT0gJG51bSAmJiAwID09PSAtLSRudW0pIHsKaWYgKCRsaXRlcmFsIDwgMCkgewokdGhpcy0+dGVzdEZsYWdMZWFybmVkUG9zaXRpdmVMaXRlcmFsID0gdHJ1ZTsKfQokbGVhcm5lZExpdGVyYWwgPSAtJGxpdGVyYWw7CgppZiAoMCA9PT0gJGwxbnVtKSB7CmJyZWFrIDI7Cn0KCmZvcmVhY2ggKCRvdGhlckxlYXJuZWRMaXRlcmFscyBhcyAkb3RoZXJMaXRlcmFsKSB7CnVuc2V0KCRzZWVuW2Ficygkb3RoZXJMaXRlcmFsKV0pOwp9CgokbDFudW0rKzsKJGwxcmV0cnkgPSB0cnVlOwp9IGVsc2UgewokZGVjaXNpb24gPSAkdGhpcy0+ZGVjaXNpb25zLT5hdE9mZnNldCgkZGVjaXNpb25JZCk7CiRydWxlID0gJGRlY2lzaW9uW0RlY2lzaW9uczo6REVDSVNJT05fUkVBU09OXTsKCmlmICgkcnVsZSBpbnN0YW5jZW9mIE11bHRpQ29uZmxpY3RSdWxlKSB7Cgpmb3JlYWNoICgkcnVsZS0+Z2V0TGl0ZXJhbHMoKSBhcyAkcnVsZUxpdGVyYWwpIHsKaWYgKCFpc3NldCgkc2VlblthYnMoJHJ1bGVMaXRlcmFsKV0pICYmICR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoLSRydWxlTGl0ZXJhbCkpIHsKJHRoaXMtPmxlYXJuZWRQb29sW1xjb3VudCgkdGhpcy0+bGVhcm5lZFBvb2wpIC0gMV1bXSA9ICRydWxlOwokbCA9ICR0aGlzLT5kZWNpc2lvbnMtPmRlY2lzaW9uTGV2ZWwoJHJ1bGVMaXRlcmFsKTsKaWYgKDEgPT09ICRsKSB7CiRsMW51bSsrOwp9IGVsc2VpZiAoJGxldmVsID09PSAkbCkgewokbnVtKys7Cn0gZWxzZSB7Cgokb3RoZXJMZWFybmVkTGl0ZXJhbHNbXSA9ICRydWxlTGl0ZXJhbDsKCmlmICgkbCA+ICRydWxlTGV2ZWwpIHsKJHJ1bGVMZXZlbCA9ICRsOwp9Cn0KJHNlZW5bYWJzKCRydWxlTGl0ZXJhbCldID0gdHJ1ZTsKYnJlYWs7Cn0KfQoKJGwxcmV0cnkgPSB0cnVlOwp9Cn0KfQoKJGRlY2lzaW9uID0gJHRoaXMtPmRlY2lzaW9ucy0+YXRPZmZzZXQoJGRlY2lzaW9uSWQpOwokcnVsZSA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX1JFQVNPTl07Cn0KCiR3aHkgPSBcY291bnQoJHRoaXMtPmxlYXJuZWRQb29sKSAtIDE7CgppZiAobnVsbCA9PT0gJGxlYXJuZWRMaXRlcmFsKSB7CnRocm93IG5ldyBTb2x2ZXJCdWdFeGNlcHRpb24oCiJEaWQgbm90IGZpbmQgYSBsZWFybmFibGUgbGl0ZXJhbCBpbiBhbmFseXplZCBydWxlICRhbmFseXplZFJ1bGUuIgopOwp9CgphcnJheV91bnNoaWZ0KCRvdGhlckxlYXJuZWRMaXRlcmFscywgJGxlYXJuZWRMaXRlcmFsKTsKJG5ld1J1bGUgPSBuZXcgR2VuZXJpY1J1bGUoJG90aGVyTGVhcm5lZExpdGVyYWxzLCBSdWxlOjpSVUxFX0xFQVJORUQsICR3aHkpOwoKcmV0dXJuIFskbGVhcm5lZExpdGVyYWwsICRydWxlTGV2ZWwsICRuZXdSdWxlLCAkd2h5XTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhbmFseXplVW5zb2x2YWJsZVJ1bGUoUHJvYmxlbSAkcHJvYmxlbSwgUnVsZSAkY29uZmxpY3RSdWxlLCBhcnJheSAmJHJ1bGVTZWVuKTogdm9pZAp7CiR3aHkgPSBzcGxfb2JqZWN0X2hhc2goJGNvbmZsaWN0UnVsZSk7CiRydWxlU2Vlblskd2h5XSA9IHRydWU7CgppZiAoJGNvbmZsaWN0UnVsZS0+Z2V0VHlwZSgpID09PSBSdWxlU2V0OjpUWVBFX0xFQVJORUQpIHsKJGxlYXJuZWRXaHkgPSAkdGhpcy0+bGVhcm5lZFdoeVskd2h5XTsKJHByb2JsZW1SdWxlcyA9ICR0aGlzLT5sZWFybmVkUG9vbFskbGVhcm5lZFdoeV07Cgpmb3JlYWNoICgkcHJvYmxlbVJ1bGVzIGFzICRwcm9ibGVtUnVsZSkgewppZiAoIWlzc2V0KCRydWxlU2VlbltzcGxfb2JqZWN0X2hhc2goJHByb2JsZW1SdWxlKV0pKSB7CiR0aGlzLT5hbmFseXplVW5zb2x2YWJsZVJ1bGUoJHByb2JsZW0sICRwcm9ibGVtUnVsZSwgJHJ1bGVTZWVuKTsKfQp9CgpyZXR1cm47Cn0KCmlmICgkY29uZmxpY3RSdWxlLT5nZXRUeXBlKCkgPT09IFJ1bGVTZXQ6OlRZUEVfUEFDS0FHRSkgewoKcmV0dXJuOwp9CgokcHJvYmxlbS0+bmV4dFNlY3Rpb24oKTsKJHByb2JsZW0tPmFkZFJ1bGUoJGNvbmZsaWN0UnVsZSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYW5hbHl6ZVVuc29sdmFibGUoUnVsZSAkY29uZmxpY3RSdWxlKTogdm9pZAp7CiRwcm9ibGVtID0gbmV3IFByb2JsZW0oKTsKJHByb2JsZW0tPmFkZFJ1bGUoJGNvbmZsaWN0UnVsZSk7CgokcnVsZVNlZW4gPSBbXTsKCiR0aGlzLT5hbmFseXplVW5zb2x2YWJsZVJ1bGUoJHByb2JsZW0sICRjb25mbGljdFJ1bGUsICRydWxlU2Vlbik7CgokdGhpcy0+cHJvYmxlbXNbXSA9ICRwcm9ibGVtOwoKJHNlZW4gPSBbXTsKJGxpdGVyYWxzID0gJGNvbmZsaWN0UnVsZS0+Z2V0TGl0ZXJhbHMoKTsKCmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkbGl0ZXJhbCkgewoKaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnNhdGlzZnkoJGxpdGVyYWwpKSB7CmNvbnRpbnVlOwp9CiRzZWVuW2FicygkbGl0ZXJhbCldID0gdHJ1ZTsKfQoKZm9yZWFjaCAoJHRoaXMtPmRlY2lzaW9ucyBhcyAkZGVjaXNpb24pIHsKJGRlY2lzaW9uTGl0ZXJhbCA9ICRkZWNpc2lvbltEZWNpc2lvbnM6OkRFQ0lTSU9OX0xJVEVSQUxdOwoKCmlmICghaXNzZXQoJHNlZW5bYWJzKCRkZWNpc2lvbkxpdGVyYWwpXSkpIHsKY29udGludWU7Cn0KCiR3aHkgPSAkZGVjaXNpb25bRGVjaXNpb25zOjpERUNJU0lPTl9SRUFTT05dOwoKJHByb2JsZW0tPmFkZFJ1bGUoJHdoeSk7CiR0aGlzLT5hbmFseXplVW5zb2x2YWJsZVJ1bGUoJHByb2JsZW0sICR3aHksICRydWxlU2Vlbik7CgokbGl0ZXJhbHMgPSAkd2h5LT5nZXRMaXRlcmFscygpOwpmb3JlYWNoICgkbGl0ZXJhbHMgYXMgJGxpdGVyYWwpIHsKCmlmICgkdGhpcy0+ZGVjaXNpb25zLT5zYXRpc2Z5KCRsaXRlcmFsKSkgewpjb250aW51ZTsKfQokc2VlblthYnMoJGxpdGVyYWwpXSA9IHRydWU7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJ1blNhdCgpOiB2b2lkCnsKJHRoaXMtPnByb3BhZ2F0ZUluZGV4ID0gMDsKCgoKCgoKCgoKCgokbGV2ZWwgPSAxOwokc3lzdGVtTGV2ZWwgPSAkbGV2ZWwgKyAxOwoKd2hpbGUgKHRydWUpIHsKaWYgKDEgPT09ICRsZXZlbCkgewokY29uZmxpY3RSdWxlID0gJHRoaXMtPnByb3BhZ2F0ZSgkbGV2ZWwpOwppZiAobnVsbCAhPT0gJGNvbmZsaWN0UnVsZSkgewokdGhpcy0+YW5hbHl6ZVVuc29sdmFibGUoJGNvbmZsaWN0UnVsZSk7CgpyZXR1cm47Cn0KfQoKCmlmICgkbGV2ZWwgPCAkc3lzdGVtTGV2ZWwpIHsKJGl0ZXJhdG9yID0gJHRoaXMtPnJ1bGVzLT5nZXRJdGVyYXRvckZvcihSdWxlU2V0OjpUWVBFX1JFUVVFU1QpOwpmb3JlYWNoICgkaXRlcmF0b3IgYXMgJHJ1bGUpIHsKaWYgKCRydWxlLT5pc0VuYWJsZWQoKSkgewokZGVjaXNpb25RdWV1ZSA9IFtdOwokbm9uZVNhdGlzZmllZCA9IHRydWU7Cgpmb3JlYWNoICgkcnVsZS0+Z2V0TGl0ZXJhbHMoKSBhcyAkbGl0ZXJhbCkgewppZiAoJHRoaXMtPmRlY2lzaW9ucy0+c2F0aXNmeSgkbGl0ZXJhbCkpIHsKJG5vbmVTYXRpc2ZpZWQgPSBmYWxzZTsKYnJlYWs7Cn0KaWYgKCRsaXRlcmFsID4gMCAmJiAkdGhpcy0+ZGVjaXNpb25zLT51bmRlY2lkZWQoJGxpdGVyYWwpKSB7CiRkZWNpc2lvblF1ZXVlW10gPSAkbGl0ZXJhbDsKfQp9CgppZiAoJG5vbmVTYXRpc2ZpZWQgJiYgXGNvdW50KCRkZWNpc2lvblF1ZXVlKSA+IDApIHsKCiRwcnVuZWRRdWV1ZSA9IFtdOwpmb3JlYWNoICgkZGVjaXNpb25RdWV1ZSBhcyAkbGl0ZXJhbCkgewppZiAoaXNzZXQoJHRoaXMtPmZpeGVkTWFwW2FicygkbGl0ZXJhbCldKSkgewokcHJ1bmVkUXVldWVbXSA9ICRsaXRlcmFsOwp9Cn0KaWYgKFxjb3VudCgkcHJ1bmVkUXVldWUpID4gMCkgewokZGVjaXNpb25RdWV1ZSA9ICRwcnVuZWRRdWV1ZTsKfQp9CgppZiAoJG5vbmVTYXRpc2ZpZWQgJiYgXGNvdW50KCRkZWNpc2lvblF1ZXVlKSA+IDApIHsKJG9MZXZlbCA9ICRsZXZlbDsKJGxldmVsID0gJHRoaXMtPnNlbGVjdEFuZEluc3RhbGwoJGxldmVsLCAkZGVjaXNpb25RdWV1ZSwgJHJ1bGUpOwoKaWYgKDAgPT09ICRsZXZlbCkgewpyZXR1cm47Cn0KaWYgKCRsZXZlbCA8PSAkb0xldmVsKSB7CmJyZWFrOwp9Cn0KfQp9Cgokc3lzdGVtTGV2ZWwgPSAkbGV2ZWwgKyAxOwoKCiRpdGVyYXRvci0+bmV4dCgpOwppZiAoJGl0ZXJhdG9yLT52YWxpZCgpKSB7CmNvbnRpbnVlOwp9Cn0KCmlmICgkbGV2ZWwgPCAkc3lzdGVtTGV2ZWwpIHsKJHN5c3RlbUxldmVsID0gJGxldmVsOwp9CgokcnVsZXNDb3VudCA9IFxjb3VudCgkdGhpcy0+cnVsZXMpOwokcGFzcyA9IDE7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0xvb2tpbmcgYXQgYWxsIHJ1bGVzLicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CmZvciAoJGkgPSAwLCAkbiA9IDA7ICRuIDwgJHJ1bGVzQ291bnQ7ICRpKyssICRuKyspIHsKaWYgKCRpID09PSAkcnVsZXNDb3VudCkgewppZiAoMSA9PT0gJHBhc3MpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJTb21ldGhpbmcncyBjaGFuZ2VkLCBsb29raW5nIGF0IGFsbCBydWxlcyBhZ2FpbiAocGFzcyAjJHBhc3MpIiwgZmFsc2UsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+b3ZlcndyaXRlRXJyb3IoIlNvbWV0aGluZydzIGNoYW5nZWQsIGxvb2tpbmcgYXQgYWxsIHJ1bGVzIGFnYWluIChwYXNzICMkcGFzcykiLCBmYWxzZSwgbnVsbCwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQoKJGkgPSAwOwokcGFzcysrOwp9CgokcnVsZSA9ICR0aGlzLT5ydWxlcy0+cnVsZUJ5SWRbJGldOwokbGl0ZXJhbHMgPSAkcnVsZS0+Z2V0TGl0ZXJhbHMoKTsKCmlmICgkcnVsZS0+aXNEaXNhYmxlZCgpKSB7CmNvbnRpbnVlOwp9CgokZGVjaXNpb25RdWV1ZSA9IFtdOwoKCgoKCgoKZm9yZWFjaCAoJGxpdGVyYWxzIGFzICRsaXRlcmFsKSB7CmlmICgkbGl0ZXJhbCA8PSAwKSB7CmlmICghJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaWRlZEluc3RhbGwoJGxpdGVyYWwpKSB7CmNvbnRpbnVlIDI7IAp9Cn0gZWxzZSB7CmlmICgkdGhpcy0+ZGVjaXNpb25zLT5kZWNpZGVkSW5zdGFsbCgkbGl0ZXJhbCkpIHsKY29udGludWUgMjsgCn0KaWYgKCR0aGlzLT5kZWNpc2lvbnMtPnVuZGVjaWRlZCgkbGl0ZXJhbCkpIHsKJGRlY2lzaW9uUXVldWVbXSA9ICRsaXRlcmFsOwp9Cn0KfQoKCmlmIChcY291bnQoJGRlY2lzaW9uUXVldWUpIDwgMikgewpjb250aW51ZTsKfQoKJGxldmVsID0gJHRoaXMtPnNlbGVjdEFuZEluc3RhbGwoJGxldmVsLCAkZGVjaXNpb25RdWV1ZSwgJHJ1bGUpOwoKaWYgKDAgPT09ICRsZXZlbCkgewpyZXR1cm47Cn0KCgokcnVsZXNDb3VudCA9IFxjb3VudCgkdGhpcy0+cnVsZXMpOwokbiA9IC0xOwp9CgppZiAoJGxldmVsIDwgJHN5c3RlbUxldmVsKSB7CmNvbnRpbnVlOwp9CgoKaWYgKFxjb3VudCgkdGhpcy0+YnJhbmNoZXMpID4gMCkgewokbGFzdExpdGVyYWwgPSBudWxsOwokbGFzdExldmVsID0gbnVsbDsKJGxhc3RCcmFuY2hJbmRleCA9IDA7CiRsYXN0QnJhbmNoT2Zmc2V0ID0gMDsKCmZvciAoJGkgPSBcY291bnQoJHRoaXMtPmJyYW5jaGVzKSAtIDE7ICRpID49IDA7ICRpLS0pIHsKWyRsaXRlcmFscywgJGxdID0gJHRoaXMtPmJyYW5jaGVzWyRpXTsKCmZvcmVhY2ggKCRsaXRlcmFscyBhcyAkb2Zmc2V0ID0+ICRsaXRlcmFsKSB7CmlmICgkbGl0ZXJhbCA+IDAgJiYgJHRoaXMtPmRlY2lzaW9ucy0+ZGVjaXNpb25MZXZlbCgkbGl0ZXJhbCkgPiAkbCArIDEpIHsKJGxhc3RMaXRlcmFsID0gJGxpdGVyYWw7CiRsYXN0QnJhbmNoSW5kZXggPSAkaTsKJGxhc3RCcmFuY2hPZmZzZXQgPSAkb2Zmc2V0OwokbGFzdExldmVsID0gJGw7Cn0KfQp9CgppZiAoJGxhc3RMaXRlcmFsICE9PSBudWxsKSB7CmFzc2VydCgkbGFzdExldmVsICE9PSBudWxsKTsKdW5zZXQoJHRoaXMtPmJyYW5jaGVzWyRsYXN0QnJhbmNoSW5kZXhdW3NlbGY6OkJSQU5DSF9MSVRFUkFMU11bJGxhc3RCcmFuY2hPZmZzZXRdKTsKCiRsZXZlbCA9ICRsYXN0TGV2ZWw7CiR0aGlzLT5yZXZlcnQoJGxldmVsKTsKCiR3aHkgPSAkdGhpcy0+ZGVjaXNpb25zLT5sYXN0UmVhc29uKCk7CgokbGV2ZWwgPSAkdGhpcy0+c2V0UHJvcGFnYXRlTGVhcm4oJGxldmVsLCAkbGFzdExpdGVyYWwsICR3aHkpOwoKaWYgKCRsZXZlbCA9PT0gMCkgewpyZXR1cm47Cn0KCmNvbnRpbnVlOwp9Cn0KCmJyZWFrOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKCgoKY2xhc3MgU29sdmVyQnVnRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoCiRtZXNzYWdlLiJcblRoaXMgZXhjZXB0aW9uIHdhcyBtb3N0IGxpa2VseSBjYXVzZWQgYnkgYSBidWcgaW4gQ29tcG9zZXIuXG4iLgoiUGxlYXNlIHJlcG9ydCB0aGUgY29tbWFuZCB5b3UgcmFuLCB0aGUgZXhhY3QgZXJyb3IgeW91IHJlY2VpdmVkLCBhbmQgeW91ciBjb21wb3Nlci5qc29uIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMgLSB0aGFuayB5b3UhXG4iCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFV0aWxcSW5pSGVscGVyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5U2V0OwoKCgoKCgpjbGFzcyBTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKcHVibGljIGNvbnN0IEVSUk9SX0RFUEVOREVOQ1lfUkVTT0xVVElPTl9GQUlMRUQgPSAyOwoKCnByb3RlY3RlZCAkcHJvYmxlbXM7Cgpwcm90ZWN0ZWQgJGxlYXJuZWRQb29sOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcHJvYmxlbXMsIGFycmF5ICRsZWFybmVkUG9vbCkKewokdGhpcy0+cHJvYmxlbXMgPSAkcHJvYmxlbXM7CiR0aGlzLT5sZWFybmVkUG9vbCA9ICRsZWFybmVkUG9vbDsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJ0ZhaWxlZCByZXNvbHZpbmcgZGVwZW5kZW5jaWVzIHdpdGggJy5cY291bnQoJHByb2JsZW1zKS4nIHByb2JsZW1zLCBjYWxsIGdldFByZXR0eVN0cmluZyB0byBnZXQgZm9ybWF0dGVkIGRldGFpbHMnLCBzZWxmOjpFUlJPUl9ERVBFTkRFTkNZX1JFU09MVVRJT05fRkFJTEVEKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyhSZXBvc2l0b3J5U2V0ICRyZXBvc2l0b3J5U2V0LCBSZXF1ZXN0ICRyZXF1ZXN0LCBQb29sICRwb29sLCBib29sICRpc1ZlcmJvc2UsIGJvb2wgJGlzRGV2RXh0cmFjdGlvbiA9IGZhbHNlKTogc3RyaW5nCnsKJGluc3RhbGxlZE1hcCA9ICRyZXF1ZXN0LT5nZXRQcmVzZW50TWFwKHRydWUpOwokbWlzc2luZ0V4dGVuc2lvbnMgPSBbXTsKJGlzQ2F1c2VkQnlMb2NrID0gZmFsc2U7CgokcHJvYmxlbXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnByb2JsZW1zIGFzICRwcm9ibGVtKSB7CiRwcm9ibGVtc1tdID0gJHByb2JsZW0tPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkaXNWZXJib3NlLCAkaW5zdGFsbGVkTWFwLCAkdGhpcy0+bGVhcm5lZFBvb2wpLiJcbiI7CgokbWlzc2luZ0V4dGVuc2lvbnMgPSBhcnJheV9tZXJnZSgkbWlzc2luZ0V4dGVuc2lvbnMsICR0aGlzLT5nZXRFeHRlbnNpb25Qcm9ibGVtcygkcHJvYmxlbS0+Z2V0UmVhc29ucygpKSk7CgokaXNDYXVzZWRCeUxvY2sgPSAkaXNDYXVzZWRCeUxvY2sgfHwgJHByb2JsZW0tPmlzQ2F1c2VkQnlMb2NrKCRyZXBvc2l0b3J5U2V0LCAkcmVxdWVzdCwgJHBvb2wpOwp9CgokaSA9IDE7CiR0ZXh0ID0gIlxuIjsKZm9yZWFjaCAoYXJyYXlfdW5pcXVlKCRwcm9ibGVtcykgYXMgJHByb2JsZW0pIHsKJHRleHQgLj0gIiAgUHJvYmxlbSAiLigkaSsrKS4kcHJvYmxlbTsKfQoKJGhpbnRzID0gW107CmlmICghJGlzRGV2RXh0cmFjdGlvbiAmJiAoc3RyX2NvbnRhaW5zKCR0ZXh0LCAnY291bGQgbm90IGJlIGZvdW5kJykgfHwgc3RyX2NvbnRhaW5zKCR0ZXh0LCAnbm8gbWF0Y2hpbmcgcGFja2FnZSBmb3VuZCcpKSkgewokaGludHNbXSA9ICJQb3RlbnRpYWwgY2F1c2VzOlxuIC0gQSB0eXBvIGluIHRoZSBwYWNrYWdlIG5hbWVcbiAtIFRoZSBwYWNrYWdlIGlzIG5vdCBhdmFpbGFibGUgaW4gYSBzdGFibGUtZW5vdWdoIHZlcnNpb24gYWNjb3JkaW5nIHRvIHlvdXIgbWluaW11bS1zdGFiaWxpdHkgc2V0dGluZ1xuICAgc2VlIDxodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvMDQtc2NoZW1hLm1kI21pbmltdW0tc3RhYmlsaXR5PiBmb3IgbW9yZSBkZXRhaWxzLlxuIC0gSXQncyBhIHByaXZhdGUgcGFja2FnZSBhbmQgeW91IGZvcmdvdCB0byBhZGQgYSBjdXN0b20gcmVwb3NpdG9yeSB0byBmaW5kIGl0XG5cblJlYWQgPGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy90cm91Ymxlc2hvb3RpbmcubWQ+IGZvciBmdXJ0aGVyIGNvbW1vbiBwcm9ibGVtcy4iOwp9CgppZiAoXGNvdW50KCRtaXNzaW5nRXh0ZW5zaW9ucykgPiAwKSB7CiRoaW50c1tdID0gJHRoaXMtPmNyZWF0ZUV4dGVuc2lvbkhpbnQoJG1pc3NpbmdFeHRlbnNpb25zKTsKfQoKaWYgKCRpc0NhdXNlZEJ5TG9jayAmJiAhJGlzRGV2RXh0cmFjdGlvbiAmJiAhJHJlcXVlc3QtPmdldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZVJvb3REZXBlbmRlbmNpZXMoKSkgewokaGludHNbXSA9ICJVc2UgdGhlIG9wdGlvbiAtLXdpdGgtYWxsLWRlcGVuZGVuY2llcyAoLVcpIHRvIGFsbG93IHVwZ3JhZGVzLCBkb3duZ3JhZGVzIGFuZCByZW1vdmFscyBmb3IgcGFja2FnZXMgY3VycmVudGx5IGxvY2tlZCB0byBzcGVjaWZpYyB2ZXJzaW9ucy4iOwp9CgppZiAoc3RyX2NvbnRhaW5zKCR0ZXh0LCAnZm91bmQgY29tcG9zZXItcGx1Z2luLWFwaVsyLjAuMF0gYnV0IGl0IGRvZXMgbm90IG1hdGNoJykgJiYgc3RyX2NvbnRhaW5zKCR0ZXh0LCAnLSBvY3JhbWl1cy9wYWNrYWdlLXZlcnNpb25zJykpIHsKJGhpbnRzW10gPSAiPHdhcm5pbmc+b2NyYW1pdXMvcGFja2FnZS12ZXJzaW9ucyBvbmx5IHByb3ZpZGVzIHN1cHBvcnQgZm9yIENvbXBvc2VyIDIgaW4gMS44Kywgd2hpY2ggcmVxdWlyZXMgUEhQIDcuNC48L3dhcm5pbmc+XG5JZiB5b3UgY2FuIG5vdCB1cGdyYWRlIFBIUCB5b3UgY2FuIHJlcXVpcmUgPGluZm8+Y29tcG9zZXIvcGFja2FnZS12ZXJzaW9ucy1kZXByZWNhdGVkPC9pbmZvPiB0byByZXNvbHZlIHRoaXMgd2l0aCBQSFAgNy4wKy4iOwp9CgppZiAoIWNsYXNzX2V4aXN0cygnUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2UnLCBmYWxzZSkpIHsKaWYgKHN0cl9jb250YWlucygkdGV4dCwgJ2ZvdW5kIGNvbXBvc2VyLXBsdWdpbi1hcGlbMi4wLjBdIGJ1dCBpdCBkb2VzIG5vdCBtYXRjaCcpKSB7CiRoaW50c1tdID0gIllvdSBhcmUgdXNpbmcgQ29tcG9zZXIgMiwgd2hpY2ggc29tZSBvZiB5b3VyIHBsdWdpbnMgc2VlbSB0byBiZSBpbmNvbXBhdGlibGUgd2l0aC4gTWFrZSBzdXJlIHlvdSB1cGRhdGUgeW91ciBwbHVnaW5zIG9yIHJlcG9ydCBhIHBsdWdpbi1pc3N1ZSB0byBhc2sgdGhlbSB0byBzdXBwb3J0IENvbXBvc2VyIDIuIjsKfQp9CgppZiAoXGNvdW50KCRoaW50cykgPiAwKSB7CiR0ZXh0IC49ICJcbiIgLiBpbXBsb2RlKCJcblxuIiwgJGhpbnRzKTsKfQoKcmV0dXJuICR0ZXh0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvYmxlbXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnByb2JsZW1zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUV4dGVuc2lvbkhpbnQoYXJyYXkgJG1pc3NpbmdFeHRlbnNpb25zKTogc3RyaW5nCnsKJHBhdGhzID0gSW5pSGVscGVyOjpnZXRBbGwoKTsKCmlmICgnJyA9PT0gJHBhdGhzWzBdKSB7CmlmIChjb3VudCgkcGF0aHMpID09PSAxKSB7CnJldHVybiAnJzsKfQoKYXJyYXlfc2hpZnQoJHBhdGhzKTsKfQoKJGlnbm9yZUV4dGVuc2lvbnNBcmd1bWVudHMgPSBpbXBsb2RlKCIgIiwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGV4dGVuc2lvbikgewpyZXR1cm4gIi0taWdub3JlLXBsYXRmb3JtLXJlcT0kZXh0ZW5zaW9uIjsKfSwgYXJyYXlfdW5pcXVlKCRtaXNzaW5nRXh0ZW5zaW9ucykpKTsKCiR0ZXh0ID0gIlRvIGVuYWJsZSBleHRlbnNpb25zLCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBlbmFibGVkIGluIHlvdXIgLmluaSBmaWxlczpcbiAgICAtICI7CiR0ZXh0IC49IGltcGxvZGUoIlxuICAgIC0gIiwgJHBhdGhzKTsKJHRleHQgLj0gIlxuWW91IGNhbiBhbHNvIHJ1biBgcGhwIC0taW5pYCBpbiBhIHRlcm1pbmFsIHRvIHNlZSB3aGljaCBmaWxlcyBhcmUgdXNlZCBieSBQSFAgaW4gQ0xJIG1vZGUuIjsKJHRleHQgLj0gIlxuQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBydW4gQ29tcG9zZXIgd2l0aCBgJGlnbm9yZUV4dGVuc2lvbnNBcmd1bWVudHNgIHRvIHRlbXBvcmFyaWx5IGlnbm9yZSB0aGVzZSByZXF1aXJlZCBleHRlbnNpb25zLiI7CgpyZXR1cm4gJHRleHQ7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEV4dGVuc2lvblByb2JsZW1zKGFycmF5ICRyZWFzb25TZXRzKTogYXJyYXkKewokbWlzc2luZ0V4dGVuc2lvbnMgPSBbXTsKZm9yZWFjaCAoJHJlYXNvblNldHMgYXMgJHJlYXNvblNldCkgewpmb3JlYWNoICgkcmVhc29uU2V0IGFzICRydWxlKSB7CiRyZXF1aXJlZCA9ICRydWxlLT5nZXRSZXF1aXJlZFBhY2thZ2UoKTsKaWYgKG51bGwgIT09ICRyZXF1aXJlZCAmJiAwID09PSBzdHJwb3MoJHJlcXVpcmVkLCAnZXh0LScpKSB7CiRtaXNzaW5nRXh0ZW5zaW9uc1skcmVxdWlyZWRdID0gMTsKfQp9Cn0KCnJldHVybiBhcnJheV9rZXlzKCRtaXNzaW5nRXh0ZW5zaW9ucyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cT3BlcmF0aW9uSW50ZXJmYWNlOwoKCgoKCmNsYXNzIFRyYW5zYWN0aW9uCnsKCgoKcHJvdGVjdGVkICRvcGVyYXRpb25zOwoKCgoKCnByb3RlY3RlZCAkcHJlc2VudFBhY2thZ2VzOwoKCgoKCnByb3RlY3RlZCAkcmVzdWx0UGFja2FnZU1hcDsKCgoKCnByb3RlY3RlZCAkcmVzdWx0UGFja2FnZXNCeU5hbWUgPSBbXTsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHByZXNlbnRQYWNrYWdlcywgYXJyYXkgJHJlc3VsdFBhY2thZ2VzKQp7CiR0aGlzLT5wcmVzZW50UGFja2FnZXMgPSAkcHJlc2VudFBhY2thZ2VzOwokdGhpcy0+c2V0UmVzdWx0UGFja2FnZU1hcHMoJHJlc3VsdFBhY2thZ2VzKTsKJHRoaXMtPm9wZXJhdGlvbnMgPSAkdGhpcy0+Y2FsY3VsYXRlT3BlcmF0aW9ucygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3BlcmF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+b3BlcmF0aW9uczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzZXRSZXN1bHRQYWNrYWdlTWFwcyhhcnJheSAkcmVzdWx0UGFja2FnZXMpOiB2b2lkCnsKJHBhY2thZ2VTb3J0ID0gc3RhdGljIGZ1bmN0aW9uIChQYWNrYWdlSW50ZXJmYWNlICRhLCBQYWNrYWdlSW50ZXJmYWNlICRiKTogaW50IHsKCmlmICgkYS0+Z2V0TmFtZSgpID09PSAkYi0+Z2V0TmFtZSgpKSB7CmlmICgkYSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAhPT0gJGIgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKcmV0dXJuICRhIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlID8gLTEgOiAxOwp9CgoKcmV0dXJuIHN0cmNtcCgkYi0+Z2V0VmVyc2lvbigpLCAkYS0+Z2V0VmVyc2lvbigpKTsKfQoKcmV0dXJuIHN0cmNtcCgkYi0+Z2V0TmFtZSgpLCAkYS0+Z2V0TmFtZSgpKTsKfTsKCiR0aGlzLT5yZXN1bHRQYWNrYWdlTWFwID0gW107CmZvcmVhY2ggKCRyZXN1bHRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdGhpcy0+cmVzdWx0UGFja2FnZU1hcFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewokdGhpcy0+cmVzdWx0UGFja2FnZXNCeU5hbWVbJG5hbWVdW10gPSAkcGFja2FnZTsKfQp9Cgp1YXNvcnQoJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXAsICRwYWNrYWdlU29ydCk7CmZvcmVhY2ggKCR0aGlzLT5yZXN1bHRQYWNrYWdlc0J5TmFtZSBhcyAkbmFtZSA9PiAkcGFja2FnZXMpIHsKdWFzb3J0KCR0aGlzLT5yZXN1bHRQYWNrYWdlc0J5TmFtZVskbmFtZV0sICRwYWNrYWdlU29ydCk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNhbGN1bGF0ZU9wZXJhdGlvbnMoKTogYXJyYXkKewokb3BlcmF0aW9ucyA9IFtdOwoKJHByZXNlbnRQYWNrYWdlTWFwID0gW107CiRyZW1vdmVNYXAgPSBbXTsKJHByZXNlbnRBbGlhc01hcCA9IFtdOwokcmVtb3ZlQWxpYXNNYXAgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnByZXNlbnRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHByZXNlbnRBbGlhc01hcFskcGFja2FnZS0+Z2V0TmFtZSgpLic6OicuJHBhY2thZ2UtPmdldFZlcnNpb24oKV0gPSAkcGFja2FnZTsKJHJlbW92ZUFsaWFzTWFwWyRwYWNrYWdlLT5nZXROYW1lKCkuJzo6Jy4kcGFja2FnZS0+Z2V0VmVyc2lvbigpXSA9ICRwYWNrYWdlOwp9IGVsc2UgewokcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkcGFja2FnZTsKJHJlbW92ZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9Cn0KCiRzdGFjayA9ICR0aGlzLT5nZXRSb290UGFja2FnZXMoKTsKCiR2aXNpdGVkID0gW107CiRwcm9jZXNzZWQgPSBbXTsKCndoaWxlIChcY291bnQoJHN0YWNrKSA+IDApIHsKJHBhY2thZ2UgPSBhcnJheV9wb3AoJHN0YWNrKTsKCmlmIChpc3NldCgkcHJvY2Vzc2VkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewpjb250aW51ZTsKfQoKaWYgKCFpc3NldCgkdmlzaXRlZFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSkpIHsKJHZpc2l0ZWRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSB0cnVlOwoKJHN0YWNrW10gPSAkcGFja2FnZTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRzdGFja1tdID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJGxpbmspIHsKJHBvc3NpYmxlUmVxdWlyZXMgPSAkdGhpcy0+Z2V0UHJvdmlkZXJzSW5SZXN1bHQoJGxpbmspOwoKZm9yZWFjaCAoJHBvc3NpYmxlUmVxdWlyZXMgYXMgJHJlcXVpcmUpIHsKJHN0YWNrW10gPSAkcmVxdWlyZTsKfQp9Cn0KfSBlbHNlaWYgKCFpc3NldCgkcHJvY2Vzc2VkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldKSkgewokcHJvY2Vzc2VkW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZSldID0gdHJ1ZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYWxpYXNLZXkgPSAkcGFja2FnZS0+Z2V0TmFtZSgpLic6OicuJHBhY2thZ2UtPmdldFZlcnNpb24oKTsKaWYgKGlzc2V0KCRwcmVzZW50QWxpYXNNYXBbJGFsaWFzS2V5XSkpIHsKdW5zZXQoJHJlbW92ZUFsaWFzTWFwWyRhbGlhc0tleV0pOwp9IGVsc2Ugewokb3BlcmF0aW9uc1tdID0gbmV3IE9wZXJhdGlvblxNYXJrQWxpYXNJbnN0YWxsZWRPcGVyYXRpb24oJHBhY2thZ2UpOwp9Cn0gZWxzZSB7CmlmIChpc3NldCgkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRzb3VyY2UgPSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV07CgoKCmlmICgkcGFja2FnZS0+Z2V0VmVyc2lvbigpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldFZlcnNpb24oKSB8fAokcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpICE9PSAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldERpc3RSZWZlcmVuY2UoKSB8fAokcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgIT09ICRwcmVzZW50UGFja2FnZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgfHwKKAokcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQomJiAkcHJlc2VudFBhY2thZ2VNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0gaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKJiYgKAokcGFja2FnZS0+aXNBYmFuZG9uZWQoKSAhPT0gJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldLT5pc0FiYW5kb25lZCgpCnx8ICRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSAhPT0gJHByZXNlbnRQYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKQopCikKKSB7CiRvcGVyYXRpb25zW10gPSBuZXcgT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbigkc291cmNlLCAkcGFja2FnZSk7Cn0KdW5zZXQoJHJlbW92ZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0gZWxzZSB7CiRvcGVyYXRpb25zW10gPSBuZXcgT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb24oJHBhY2thZ2UpOwp1bnNldCgkcmVtb3ZlTWFwWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKfQp9Cn0KfQoKZm9yZWFjaCAoJHJlbW92ZU1hcCBhcyAkbmFtZSA9PiAkcGFja2FnZSkgewphcnJheV91bnNoaWZ0KCRvcGVyYXRpb25zLCBuZXcgT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbigkcGFja2FnZSkpOwp9CmZvcmVhY2ggKCRyZW1vdmVBbGlhc01hcCBhcyAkbmFtZVZlcnNpb24gPT4gJHBhY2thZ2UpIHsKJG9wZXJhdGlvbnNbXSA9IG5ldyBPcGVyYXRpb25cTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb24oJHBhY2thZ2UpOwp9Cgokb3BlcmF0aW9ucyA9ICR0aGlzLT5tb3ZlUGx1Z2luc1RvRnJvbnQoJG9wZXJhdGlvbnMpOwoKCiRvcGVyYXRpb25zID0gJHRoaXMtPm1vdmVVbmluc3RhbGxzVG9Gcm9udCgkb3BlcmF0aW9ucyk7CgoKCgoKCgoKCgoKCgoKCgoKCgpyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbnMgPSAkb3BlcmF0aW9uczsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Um9vdFBhY2thZ2VzKCk6IGFycmF5CnsKJHJvb3RzID0gJHRoaXMtPnJlc3VsdFBhY2thZ2VNYXA7Cgpmb3JlYWNoICgkdGhpcy0+cmVzdWx0UGFja2FnZU1hcCBhcyAkcGFja2FnZUhhc2ggPT4gJHBhY2thZ2UpIHsKaWYgKCFpc3NldCgkcm9vdHNbJHBhY2thZ2VIYXNoXSkpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXF1aXJlcygpIGFzICRsaW5rKSB7CiRwb3NzaWJsZVJlcXVpcmVzID0gJHRoaXMtPmdldFByb3ZpZGVyc0luUmVzdWx0KCRsaW5rKTsKCmZvcmVhY2ggKCRwb3NzaWJsZVJlcXVpcmVzIGFzICRyZXF1aXJlKSB7CmlmICgkcmVxdWlyZSAhPT0gJHBhY2thZ2UpIHsKdW5zZXQoJHJvb3RzW3NwbF9vYmplY3RfaGFzaCgkcmVxdWlyZSldKTsKfQp9Cn0KfQoKcmV0dXJuICRyb290czsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFByb3ZpZGVyc0luUmVzdWx0KExpbmsgJGxpbmspOiBhcnJheQp7CmlmICghaXNzZXQoJHRoaXMtPnJlc3VsdFBhY2thZ2VzQnlOYW1lWyRsaW5rLT5nZXRUYXJnZXQoKV0pKSB7CnJldHVybiBbXTsKfQoKcmV0dXJuICR0aGlzLT5yZXN1bHRQYWNrYWdlc0J5TmFtZVskbGluay0+Z2V0VGFyZ2V0KCldOwp9CgoKCgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBtb3ZlUGx1Z2luc1RvRnJvbnQoYXJyYXkgJG9wZXJhdGlvbnMpOiBhcnJheQp7CiRkbE1vZGlmeWluZ1BsdWdpbnNOb0RlcHMgPSBbXTsKJGRsTW9kaWZ5aW5nUGx1Z2luc1dpdGhEZXBzID0gW107CiRkbE1vZGlmeWluZ1BsdWdpblJlcXVpcmVzID0gW107CiRwbHVnaW5zTm9EZXBzID0gW107CiRwbHVnaW5zV2l0aERlcHMgPSBbXTsKJHBsdWdpblJlcXVpcmVzID0gW107Cgpmb3JlYWNoIChhcnJheV9yZXZlcnNlKCRvcGVyYXRpb25zLCB0cnVlKSBhcyAkaWR4ID0+ICRvcCkgewppZiAoJG9wIGluc3RhbmNlb2YgT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb24pIHsKJHBhY2thZ2UgPSAkb3AtPmdldFBhY2thZ2UoKTsKfSBlbHNlaWYgKCRvcCBpbnN0YW5jZW9mIE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb24pIHsKJHBhY2thZ2UgPSAkb3AtPmdldFRhcmdldFBhY2thZ2UoKTsKfSBlbHNlIHsKY29udGludWU7Cn0KCiRleHRyYSA9ICRwYWNrYWdlLT5nZXRFeHRyYSgpOwokaXNEb3dubG9hZHNNb2RpZnlpbmdQbHVnaW4gPSAkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItcGx1Z2luJyAmJiBpc3NldCgkZXh0cmFbJ3BsdWdpbi1tb2RpZmllcy1kb3dubG9hZHMnXSkgJiYgJGV4dHJhWydwbHVnaW4tbW9kaWZpZXMtZG93bmxvYWRzJ10gPT09IHRydWU7CgoKaWYgKCRpc0Rvd25sb2Fkc01vZGlmeWluZ1BsdWdpbiB8fCBcY291bnQoYXJyYXlfaW50ZXJzZWN0KCRwYWNrYWdlLT5nZXROYW1lcygpLCAkZGxNb2RpZnlpbmdQbHVnaW5SZXF1aXJlcykpID4gMCkgewoKJHJlcXVpcmVzID0gYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkpLCBzdGF0aWMgZnVuY3Rpb24gKCRyZXEpOiBib29sIHsKcmV0dXJuICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpOwp9KTsKCgppZiAoJGlzRG93bmxvYWRzTW9kaWZ5aW5nUGx1Z2luICYmIDAgPT09IFxjb3VudCgkcmVxdWlyZXMpKSB7CgphcnJheV91bnNoaWZ0KCRkbE1vZGlmeWluZ1BsdWdpbnNOb0RlcHMsICRvcCk7Cn0gZWxzZSB7CgokZGxNb2RpZnlpbmdQbHVnaW5SZXF1aXJlcyA9IGFycmF5X21lcmdlKCRkbE1vZGlmeWluZ1BsdWdpblJlcXVpcmVzLCAkcmVxdWlyZXMpOwoKYXJyYXlfdW5zaGlmdCgkZGxNb2RpZnlpbmdQbHVnaW5zV2l0aERlcHMsICRvcCk7Cn0KCnVuc2V0KCRvcGVyYXRpb25zWyRpZHhdKTsKY29udGludWU7Cn0KCgokaXNQbHVnaW4gPSAkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItcGx1Z2luJyB8fCAkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItaW5zdGFsbGVyJzsKCgppZiAoJGlzUGx1Z2luIHx8IFxjb3VudChhcnJheV9pbnRlcnNlY3QoJHBhY2thZ2UtPmdldE5hbWVzKCksICRwbHVnaW5SZXF1aXJlcykpID4gMCkgewoKJHJlcXVpcmVzID0gYXJyYXlfZmlsdGVyKGFycmF5X2tleXMoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkpLCBzdGF0aWMgZnVuY3Rpb24gKCRyZXEpOiBib29sIHsKcmV0dXJuICFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpOwp9KTsKCgppZiAoJGlzUGx1Z2luICYmIDAgPT09IFxjb3VudCgkcmVxdWlyZXMpKSB7CgphcnJheV91bnNoaWZ0KCRwbHVnaW5zTm9EZXBzLCAkb3ApOwp9IGVsc2UgewoKJHBsdWdpblJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJHBsdWdpblJlcXVpcmVzLCAkcmVxdWlyZXMpOwoKYXJyYXlfdW5zaGlmdCgkcGx1Z2luc1dpdGhEZXBzLCAkb3ApOwp9Cgp1bnNldCgkb3BlcmF0aW9uc1skaWR4XSk7Cn0KfQoKcmV0dXJuIGFycmF5X21lcmdlKCRkbE1vZGlmeWluZ1BsdWdpbnNOb0RlcHMsICRkbE1vZGlmeWluZ1BsdWdpbnNXaXRoRGVwcywgJHBsdWdpbnNOb0RlcHMsICRwbHVnaW5zV2l0aERlcHMsICRvcGVyYXRpb25zKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbW92ZVVuaW5zdGFsbHNUb0Zyb250KGFycmF5ICRvcGVyYXRpb25zKTogYXJyYXkKewokdW5pbnN0T3BzID0gW107CmZvcmVhY2ggKCRvcGVyYXRpb25zIGFzICRpZHggPT4gJG9wKSB7CmlmICgkb3AgaW5zdGFuY2VvZiBPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uIHx8ICRvcCBpbnN0YW5jZW9mIE9wZXJhdGlvblxNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbikgewokdW5pbnN0T3BzW10gPSAkb3A7CnVuc2V0KCRvcGVyYXRpb25zWyRpZHhdKTsKfQp9CgpyZXR1cm4gYXJyYXlfbWVyZ2UoJHVuaW5zdE9wcywgJG9wZXJhdGlvbnMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxGaW5kZXI7CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQXJjaGl2ZURvd25sb2FkZXIgZXh0ZW5kcyBGaWxlRG93bmxvYWRlcgp7CgoKCnByb3RlY3RlZCAkY2xlYW51cEV4ZWN1dGVkID0gW107CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewp1bnNldCgkdGhpcy0+Y2xlYW51cEV4ZWN1dGVkWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKCnJldHVybiBwYXJlbnQ6OnByZXBhcmUoJHR5cGUsICRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRoaXMtPmNsZWFudXBFeGVjdXRlZFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IHRydWU7CgpyZXR1cm4gcGFyZW50OjpjbGVhbnVwKCR0eXBlLCAkcGFja2FnZSwgJHBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSAuICR0aGlzLT5nZXRJbnN0YWxsT3BlcmF0aW9uQXBwZW5kaXgoJHBhY2thZ2UsICRwYXRoKSk7Cn0KCiR2ZW5kb3JEaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKCgoKCmlmIChmYWxzZSA9PT0gc3RycG9zKCR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR2ZW5kb3JEaXIpLCAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkcGF0aC5ESVJFQ1RPUllfU0VQQVJBVE9SKSkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVtcHR5RGlyZWN0b3J5KCRwYXRoKTsKfQoKZG8gewokdGVtcG9yYXJ5RGlyID0gJHZlbmRvckRpci4nL2NvbXBvc2VyLycuYmluMmhleChyYW5kb21fYnl0ZXMoNCkpOwp9IHdoaWxlIChpc19kaXIoJHRlbXBvcmFyeURpcikpOwoKJHRoaXMtPmFkZENsZWFudXBQYXRoKCRwYWNrYWdlLCAkdGVtcG9yYXJ5RGlyKTsKCgppZiAoIWlzX2RpcigkcGF0aCkgfHwgcmVhbHBhdGgoJHBhdGgpICE9PSBQbGF0Zm9ybTo6Z2V0Q3dkKCkpIHsKJHRoaXMtPmFkZENsZWFudXBQYXRoKCRwYWNrYWdlLCAkcGF0aCk7Cn0KCiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRlbXBvcmFyeURpcik7CiRmaWxlTmFtZSA9ICR0aGlzLT5nZXRGaWxlTmFtZSgkcGFja2FnZSwgJHBhdGgpOwoKJGZpbGVzeXN0ZW0gPSAkdGhpcy0+ZmlsZXN5c3RlbTsKCiRjbGVhbnVwID0gZnVuY3Rpb24gKCkgdXNlICgkcGF0aCwgJGZpbGVzeXN0ZW0sICR0ZW1wb3JhcnlEaXIsICRwYWNrYWdlKSB7CgokdGhpcy0+Y2xlYXJMYXN0Q2FjaGVXcml0ZSgkcGFja2FnZSk7CgoKJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkdGVtcG9yYXJ5RGlyKTsKaWYgKGlzX2RpcigkcGF0aCkgJiYgcmVhbHBhdGgoJHBhdGgpICE9PSBQbGF0Zm9ybTo6Z2V0Q3dkKCkpIHsKJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkcGF0aCk7Cn0KJHRoaXMtPnJlbW92ZUNsZWFudXBQYXRoKCRwYWNrYWdlLCAkdGVtcG9yYXJ5RGlyKTsKJHJlYWxwYXRoID0gcmVhbHBhdGgoJHBhdGgpOwppZiAoJHJlYWxwYXRoICE9PSBmYWxzZSkgewokdGhpcy0+cmVtb3ZlQ2xlYW51cFBhdGgoJHBhY2thZ2UsICRyZWFscGF0aCk7Cn0KfTsKCnRyeSB7CiRwcm9taXNlID0gJHRoaXMtPmV4dHJhY3QoJHBhY2thZ2UsICRmaWxlTmFtZSwgJHRlbXBvcmFyeURpcik7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJGNsZWFudXAoKTsKdGhyb3cgJGU7Cn0KCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRwYWNrYWdlLCAkZmlsZXN5c3RlbSwgJGZpbGVOYW1lLCAkdGVtcG9yYXJ5RGlyLCAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UgewppZiAoZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkgewokZmlsZXN5c3RlbS0+dW5saW5rKCRmaWxlTmFtZSk7Cn0KCgoKCgoKCiRnZXRGb2xkZXJDb250ZW50ID0gc3RhdGljIGZ1bmN0aW9uICgkZGlyKTogYXJyYXkgewokZmluZGVyID0gRmluZGVyOjpjcmVhdGUoKQotPmlnbm9yZVZDUyhmYWxzZSkKLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSkKLT5ub3ROYW1lKCcuRFNfU3RvcmUnKQotPmRlcHRoKDApCi0+aW4oJGRpcik7CgpyZXR1cm4gaXRlcmF0b3JfdG9fYXJyYXkoJGZpbmRlcik7Cn07CiRyZW5hbWVSZWN1cnNpdmVseSA9IG51bGw7CgoKCgoKCgoKCgoKJHJlbmFtZVJlY3Vyc2l2ZWx5ID0gc3RhdGljIGZ1bmN0aW9uICgkZnJvbSwgJHRvKSB1c2UgKCRmaWxlc3lzdGVtLCAkZ2V0Rm9sZGVyQ29udGVudCwgJHBhY2thZ2UsICYkcmVuYW1lUmVjdXJzaXZlbHkpIHsKJGNvbnRlbnREaXIgPSAkZ2V0Rm9sZGVyQ29udGVudCgkZnJvbSk7CgoKZm9yZWFjaCAoJGNvbnRlbnREaXIgYXMgJGZpbGUpIHsKJGZpbGUgPSAoc3RyaW5nKSAkZmlsZTsKaWYgKGlzX2RpcigkdG8gLiAnLycgLiBiYXNlbmFtZSgkZmlsZSkpKSB7CmlmICghaXNfZGlyKCRmaWxlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0luc3RhbGxpbmcgJy4kcGFja2FnZS4nIHdvdWxkIGxlYWQgdG8gb3ZlcndyaXRpbmcgdGhlICcuJHRvLicvJy5iYXNlbmFtZSgkZmlsZSkuJyBkaXJlY3Rvcnkgd2l0aCBhIGZpbGUgZnJvbSB0aGUgcGFja2FnZSwgaW52YWxpZCBvcGVyYXRpb24uJyk7Cn0KJHJlbmFtZVJlY3Vyc2l2ZWx5KCRmaWxlLCAkdG8gLiAnLycgLiBiYXNlbmFtZSgkZmlsZSkpOwp9IGVsc2UgewokZmlsZXN5c3RlbS0+cmVuYW1lKCRmaWxlLCAkdG8gLiAnLycgLiBiYXNlbmFtZSgkZmlsZSkpOwp9Cn0KfTsKCiRyZW5hbWVBc09uZSA9IGZhbHNlOwppZiAoIWZpbGVfZXhpc3RzKCRwYXRoKSkgewokcmVuYW1lQXNPbmUgPSB0cnVlOwp9IGVsc2VpZiAoJGZpbGVzeXN0ZW0tPmlzRGlyRW1wdHkoJHBhdGgpKSB7CnRyeSB7CmlmICgkZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRwYXRoKSkgewokcmVuYW1lQXNPbmUgPSB0cnVlOwp9Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9Cn0KCiRjb250ZW50RGlyID0gJGdldEZvbGRlckNvbnRlbnQoJHRlbXBvcmFyeURpcik7CiRzaW5nbGVEaXJBdFRvcExldmVsID0gMSA9PT0gY291bnQoJGNvbnRlbnREaXIpICYmIGlzX2Rpcigoc3RyaW5nKSByZXNldCgkY29udGVudERpcikpOwoKaWYgKCRyZW5hbWVBc09uZSkgewoKaWYgKCRzaW5nbGVEaXJBdFRvcExldmVsKSB7CiRleHRyYWN0ZWREaXIgPSAoc3RyaW5nKSByZXNldCgkY29udGVudERpcik7Cn0gZWxzZSB7CiRleHRyYWN0ZWREaXIgPSAkdGVtcG9yYXJ5RGlyOwp9CiRmaWxlc3lzdGVtLT5yZW5hbWUoJGV4dHJhY3RlZERpciwgJHBhdGgpOwp9IGVsc2UgewoKJGZyb20gPSAkdGVtcG9yYXJ5RGlyOwppZiAoJHNpbmdsZURpckF0VG9wTGV2ZWwpIHsKJGZyb20gPSAoc3RyaW5nKSByZXNldCgkY29udGVudERpcik7Cn0KCiRyZW5hbWVSZWN1cnNpdmVseSgkZnJvbSwgJHBhdGgpOwp9CgokcHJvbWlzZSA9ICRmaWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlBc3luYygkdGVtcG9yYXJ5RGlyKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRwYWNrYWdlLCAkcGF0aCwgJHRlbXBvcmFyeURpcikgewokdGhpcy0+cmVtb3ZlQ2xlYW51cFBhdGgoJHBhY2thZ2UsICR0ZW1wb3JhcnlEaXIpOwokdGhpcy0+cmVtb3ZlQ2xlYW51cFBhdGgoJHBhY2thZ2UsICRwYXRoKTsKfSk7Cn0sIHN0YXRpYyBmdW5jdGlvbiAoJGUpIHVzZSAoJGNsZWFudXApIHsKJGNsZWFudXAoKTsKCnRocm93ICRlOwp9KTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEluc3RhbGxPcGVyYXRpb25BcHBlbmRpeChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewpyZXR1cm4gJzogRXh0cmFjdGluZyBhcmNoaXZlJzsKfQoKCgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIENoYW5nZVJlcG9ydEludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxFeGNlcHRpb25cSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBEb3dubG9hZE1hbmFnZXIKewoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRwcmVmZXJEaXN0ID0gZmFsc2U7Cgpwcml2YXRlICRwcmVmZXJTb3VyY2U7Cgpwcml2YXRlICRwYWNrYWdlUHJlZmVyZW5jZXMgPSBbXTsKCnByaXZhdGUgJGZpbGVzeXN0ZW07Cgpwcml2YXRlICRkb3dubG9hZGVycyA9IFtdOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIGJvb2wgJHByZWZlclNvdXJjZSA9IGZhbHNlLCA/RmlsZXN5c3RlbSAkZmlsZXN5c3RlbSA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cHJlZmVyU291cmNlID0gJHByZWZlclNvdXJjZTsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZmlsZXN5c3RlbSA/OiBuZXcgRmlsZXN5c3RlbSgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJTb3VyY2UoYm9vbCAkcHJlZmVyU291cmNlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJTb3VyY2UgPSAkcHJlZmVyU291cmNlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJEaXN0KGJvb2wgJHByZWZlckRpc3QpOiBzZWxmCnsKJHRoaXMtPnByZWZlckRpc3QgPSAkcHJlZmVyRGlzdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyZW5jZXMoYXJyYXkgJHByZWZlcmVuY2VzKTogc2VsZgp7CiR0aGlzLT5wYWNrYWdlUHJlZmVyZW5jZXMgPSAkcHJlZmVyZW5jZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREb3dubG9hZGVyKHN0cmluZyAkdHlwZSwgRG93bmxvYWRlckludGVyZmFjZSAkZG93bmxvYWRlcik6IHNlbGYKewokdHlwZSA9IHN0cnRvbG93ZXIoJHR5cGUpOwokdGhpcy0+ZG93bmxvYWRlcnNbJHR5cGVdID0gJGRvd25sb2FkZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZGVyKHN0cmluZyAkdHlwZSk6IERvd25sb2FkZXJJbnRlcmZhY2UKewokdHlwZSA9IHN0cnRvbG93ZXIoJHR5cGUpOwppZiAoIWlzc2V0KCR0aGlzLT5kb3dubG9hZGVyc1skdHlwZV0pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1Vua25vd24gZG93bmxvYWRlciB0eXBlOiAlcy4gQXZhaWxhYmxlIHR5cGVzOiAlcy4nLCAkdHlwZSwgaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKCR0aGlzLT5kb3dubG9hZGVycykpKSk7Cn0KCnJldHVybiAkdGhpcy0+ZG93bmxvYWRlcnNbJHR5cGVdOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZGVyRm9yUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP0Rvd25sb2FkZXJJbnRlcmZhY2UKewokaW5zdGFsbGF0aW9uU291cmNlID0gJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpOwoKaWYgKCdtZXRhcGFja2FnZScgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKcmV0dXJuIG51bGw7Cn0KCmlmICgnZGlzdCcgPT09ICRpbnN0YWxsYXRpb25Tb3VyY2UpIHsKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlcigkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKSk7Cn0gZWxzZWlmICgnc291cmNlJyA9PT0gJGluc3RhbGxhdGlvblNvdXJjZSkgewokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyKCRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigKJ1BhY2thZ2UgJy4kcGFja2FnZS4nIGRvZXMgbm90IGhhdmUgYW4gaW5zdGFsbGF0aW9uIHNvdXJjZSBzZXQnCik7Cn0KCmlmICgkaW5zdGFsbGF0aW9uU291cmNlICE9PSAkZG93bmxvYWRlci0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKAonRG93bmxvYWRlciAiJXMiIGlzIGEgJXMgdHlwZSBkb3dubG9hZGVyIGFuZCBjYW4gbm90IGJlIHVzZWQgdG8gZG93bmxvYWQgJXMgZm9yIHBhY2thZ2UgJXMnLApnZXRfY2xhc3MoJGRvd25sb2FkZXIpLAokZG93bmxvYWRlci0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCksCiRpbnN0YWxsYXRpb25Tb3VyY2UsCiRwYWNrYWdlCikpOwp9CgpyZXR1cm4gJGRvd25sb2FkZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREb3dubG9hZGVyVHlwZShEb3dubG9hZGVySW50ZXJmYWNlICRkb3dubG9hZGVyKTogc3RyaW5nCnsKcmV0dXJuIGFycmF5X3NlYXJjaCgkZG93bmxvYWRlciwgJHRoaXMtPmRvd25sb2FkZXJzKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGFyZ2V0RGlyKSk7Cgokc291cmNlcyA9ICR0aGlzLT5nZXRBdmFpbGFibGVTb3VyY2VzKCRwYWNrYWdlLCAkcHJldlBhY2thZ2UpOwoKJGlvID0gJHRoaXMtPmlvOwoKJGRvd25sb2FkID0gZnVuY3Rpb24gKCRyZXRyeSA9IGZhbHNlKSB1c2UgKCYkc291cmNlcywgJGlvLCAkcGFja2FnZSwgJHRhcmdldERpciwgJiRkb3dubG9hZCwgJHByZXZQYWNrYWdlKSB7CiRzb3VyY2UgPSBhcnJheV9zaGlmdCgkc291cmNlcyk7CmlmICgkcmV0cnkpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Tm93IHRyeWluZyB0byBkb3dubG9hZCBmcm9tICcgLiAkc291cmNlIC4gJzwvd2FybmluZz4nKTsKfQokcGFja2FnZS0+c2V0SW5zdGFsbGF0aW9uU291cmNlKCRzb3VyY2UpOwoKJGRvd25sb2FkZXIgPSAkdGhpcy0+Z2V0RG93bmxvYWRlckZvclBhY2thZ2UoJHBhY2thZ2UpOwppZiAoISRkb3dubG9hZGVyKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokaGFuZGxlRXJyb3IgPSBzdGF0aWMgZnVuY3Rpb24gKCRlKSB1c2UgKCRzb3VyY2VzLCAkc291cmNlLCAkcGFja2FnZSwgJGlvLCAkZG93bmxvYWQpIHsKaWYgKCRlIGluc3RhbmNlb2YgXFJ1bnRpbWVFeGNlcHRpb24gJiYgISRlIGluc3RhbmNlb2YgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uKSB7CmlmICghJHNvdXJjZXMpIHsKdGhyb3cgJGU7Cn0KCiRpby0+d3JpdGVFcnJvcigKJyAgICA8d2FybmluZz5GYWlsZWQgdG8gZG93bmxvYWQgJy4KJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4KJyBmcm9tICcgLiAkc291cmNlIC4gJzogJy4KJGUtPmdldE1lc3NhZ2UoKS4nPC93YXJuaW5nPicKKTsKCnJldHVybiAkZG93bmxvYWQodHJ1ZSk7Cn0KCnRocm93ICRlOwp9OwoKdHJ5IHsKJHJlc3VsdCA9ICRkb3dubG9hZGVyLT5kb3dubG9hZCgkcGFja2FnZSwgJHRhcmdldERpciwgJHByZXZQYWNrYWdlKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGhhbmRsZUVycm9yKCRlKTsKfQoKJHJlcyA9ICRyZXN1bHQtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgkcmVzKSB7CnJldHVybiAkcmVzOwp9LCAkaGFuZGxlRXJyb3IpOwoKcmV0dXJuICRyZXM7Cn07CgpyZXR1cm4gJGRvd25sb2FkKCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCRkb3dubG9hZGVyKSB7CnJldHVybiAkZG93bmxvYWRlci0+cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICR0YXJnZXREaXIsICRwcmV2UGFja2FnZSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICR0YXJnZXREaXIpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHRhcmdldERpciA9ICR0aGlzLT5ub3JtYWxpemVUYXJnZXREaXIoJHRhcmdldERpcik7CiRkb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRwYWNrYWdlKTsKaWYgKCRkb3dubG9hZGVyKSB7CnJldHVybiAkZG93bmxvYWRlci0+aW5zdGFsbCgkcGFja2FnZSwgJHRhcmdldERpcik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkdGFyZ2V0KTsKJGluaXRpYWxEb3dubG9hZGVyID0gJHRoaXMtPmdldERvd25sb2FkZXJGb3JQYWNrYWdlKCRpbml0aWFsKTsKCgppZiAoISRpbml0aWFsRG93bmxvYWRlciAmJiAhJGRvd25sb2FkZXIpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgppZiAoISRkb3dubG9hZGVyKSB7CnJldHVybiAkaW5pdGlhbERvd25sb2FkZXItPnJlbW92ZSgkaW5pdGlhbCwgJHRhcmdldERpcik7Cn0KCiRpbml0aWFsVHlwZSA9ICR0aGlzLT5nZXREb3dubG9hZGVyVHlwZSgkaW5pdGlhbERvd25sb2FkZXIpOwokdGFyZ2V0VHlwZSA9ICR0aGlzLT5nZXREb3dubG9hZGVyVHlwZSgkZG93bmxvYWRlcik7CmlmICgkaW5pdGlhbFR5cGUgPT09ICR0YXJnZXRUeXBlKSB7CnRyeSB7CnJldHVybiAkZG93bmxvYWRlci0+dXBkYXRlKCRpbml0aWFsLCAkdGFyZ2V0LCAkdGFyZ2V0RGlyKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewp0aHJvdyAkZTsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4gICAgVXBkYXRlIGZhaWxlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpPC9lcnJvcj4nKTsKaWYgKCEkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbignICAgIFdvdWxkIHlvdSBsaWtlIHRvIHRyeSByZWluc3RhbGxpbmcgdGhlIHBhY2thZ2UgaW5zdGVhZCBbPGNvbW1lbnQ+eWVzPC9jb21tZW50Pl0/ICcpKSB7CnRocm93ICRlOwp9Cn0KfQoKCgokcHJvbWlzZSA9ICRpbml0aWFsRG93bmxvYWRlci0+cmVtb3ZlKCRpbml0aWFsLCAkdGFyZ2V0RGlyKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoJHJlcykgdXNlICgkdGFyZ2V0LCAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiAkdGhpcy0+aW5zdGFsbCgkdGFyZ2V0LCAkdGFyZ2V0RGlyKTsKfSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICgkZG93bmxvYWRlcikgewpyZXR1cm4gJGRvd25sb2FkZXItPnJlbW92ZSgkcGFja2FnZSwgJHRhcmdldERpcik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cChzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkdGFyZ2V0RGlyLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CiR0YXJnZXREaXIgPSAkdGhpcy0+bm9ybWFsaXplVGFyZ2V0RGlyKCR0YXJnZXREaXIpOwokZG93bmxvYWRlciA9ICR0aGlzLT5nZXREb3dubG9hZGVyRm9yUGFja2FnZSgkcGFja2FnZSk7CmlmICgkZG93bmxvYWRlcikgewpyZXR1cm4gJGRvd25sb2FkZXItPmNsZWFudXAoJHR5cGUsICRwYWNrYWdlLCAkdGFyZ2V0RGlyLCAkcHJldlBhY2thZ2UpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVzb2x2ZVBhY2thZ2VJbnN0YWxsUHJlZmVyZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKZm9yZWFjaCAoJHRoaXMtPnBhY2thZ2VQcmVmZXJlbmNlcyBhcyAkcGF0dGVybiA9PiAkcHJlZmVyZW5jZSkgewokcGF0dGVybiA9ICd7Xicuc3RyX3JlcGxhY2UoJ1xcKicsICcuKicsIHByZWdfcXVvdGUoJHBhdHRlcm4pKS4nJH1pJzsKaWYgKFByZWc6OmlzTWF0Y2goJHBhdHRlcm4sICRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CmlmICgnZGlzdCcgPT09ICRwcmVmZXJlbmNlIHx8ICghJHBhY2thZ2UtPmlzRGV2KCkgJiYgJ2F1dG8nID09PSAkcHJlZmVyZW5jZSkpIHsKcmV0dXJuICdkaXN0JzsKfQoKcmV0dXJuICdzb3VyY2UnOwp9Cn0KCnJldHVybiAkcGFja2FnZS0+aXNEZXYoKSA/ICdzb3VyY2UnIDogJ2Rpc3QnOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBdmFpbGFibGVTb3VyY2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBhcnJheQp7CiRzb3VyY2VUeXBlID0gJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKTsKJGRpc3RUeXBlID0gJHBhY2thZ2UtPmdldERpc3RUeXBlKCk7CgoKJHNvdXJjZXMgPSBbXTsKaWYgKCRzb3VyY2VUeXBlKSB7CiRzb3VyY2VzW10gPSAnc291cmNlJzsKfQppZiAoJGRpc3RUeXBlKSB7CiRzb3VyY2VzW10gPSAnZGlzdCc7Cn0KCmlmIChlbXB0eSgkc291cmNlcykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kcGFja2FnZS4nIG11c3QgaGF2ZSBhIHNvdXJjZSBvciBkaXN0IHNwZWNpZmllZCcpOwp9CgppZiAoCiRwcmV2UGFja2FnZQoKJiYgaW5fYXJyYXkoJHByZXZQYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSwgJHNvdXJjZXMsIHRydWUpCgomJiAhKCEkcHJldlBhY2thZ2UtPmlzRGV2KCkgJiYgJHByZXZQYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSA9PT0gJ2Rpc3QnICYmICRwYWNrYWdlLT5pc0RldigpKQopIHsKJHByZXZTb3VyY2UgPSAkcHJldlBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpOwp1c29ydCgkc291cmNlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHByZXZTb3VyY2UpOiBpbnQgewpyZXR1cm4gJGEgPT09ICRwcmV2U291cmNlID8gLTEgOiAxOwp9KTsKCnJldHVybiAkc291cmNlczsKfQoKCmlmICghJHRoaXMtPnByZWZlclNvdXJjZSAmJiAoJHRoaXMtPnByZWZlckRpc3QgfHwgJ2Rpc3QnID09PSAkdGhpcy0+cmVzb2x2ZVBhY2thZ2VJbnN0YWxsUHJlZmVyZW5jZSgkcGFja2FnZSkpKSB7CiRzb3VyY2VzID0gYXJyYXlfcmV2ZXJzZSgkc291cmNlcyk7Cn0KCnJldHVybiAkc291cmNlczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vcm1hbGl6ZVRhcmdldERpcihzdHJpbmcgJGRpcik6IHN0cmluZwp7CmlmICgkZGlyID09PSAnXFwnIHx8ICRkaXIgPT09ICcvJykgewpyZXR1cm4gJGRpcjsKfQoKcmV0dXJuIHJ0cmltKCRkaXIsICdcXC8nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCmludGVyZmFjZSBEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6IHN0cmluZzsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBEdmNzRG93bmxvYWRlckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5wdXNoZWRDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXElPXE51bGxJTzsKdXNlIENvbXBvc2VyXEV4Y2VwdGlvblxJcnJlY292ZXJhYmxlRG93bmxvYWRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBhcmVyXENvbXBhcmVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVcGRhdGVPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXEluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVuaW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBsdWdpblxQbHVnaW5FdmVudHM7CnVzZSBDb21wb3NlclxQbHVnaW5cUG9zdEZpbGVEb3dubG9hZEV2ZW50Owp1c2UgQ29tcG9zZXJcUGx1Z2luXFByZUZpbGVEb3dubG9hZEV2ZW50Owp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFNpbGVuY2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcVXJsIGFzIFVybFV0aWw7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKY2xhc3MgRmlsZURvd25sb2FkZXIgaW1wbGVtZW50cyBEb3dubG9hZGVySW50ZXJmYWNlLCBDaGFuZ2VSZXBvcnRJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCnByb3RlY3RlZCAkZmlsZXN5c3RlbTsKCnByb3RlY3RlZCAkY2FjaGU7Cgpwcm90ZWN0ZWQgJGV2ZW50RGlzcGF0Y2hlcjsKCnByb3RlY3RlZCAkcHJvY2VzczsKCgoKCgpwdWJsaWMgc3RhdGljICRkb3dubG9hZE1ldGFkYXRhID0gW107CgoKCgoKCgoKcHVibGljIHN0YXRpYyAkcmVzcG9uc2VIZWFkZXJzID0gW107CgoKCgpwcml2YXRlICRsYXN0Q2FjaGVXcml0ZXMgPSBbXTsKCnByaXZhdGUgJGFkZGl0aW9uYWxDbGVhbnVwUGF0aHMgPSBbXTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsLCA/Q2FjaGUgJGNhY2hlID0gbnVsbCwgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+Y2FjaGUgPSAkY2FjaGU7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID8/IG5ldyBGaWxlc3lzdGVtKCR0aGlzLT5wcm9jZXNzKTsKCmlmICgkdGhpcy0+Y2FjaGUgIT09IG51bGwgJiYgJHRoaXMtPmNhY2hlLT5nY0lzTmVjZXNzYXJ5KCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdSdW5uaW5nIGNhY2hlIGdhcmJhZ2UgY29sbGVjdGlvbicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwokdGhpcy0+Y2FjaGUtPmdjKCRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtdHRsJyksICRjb25maWctPmdldCgnY2FjaGUtZmlsZXMtbWF4c2l6ZScpKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6IHN0cmluZwp7CnJldHVybiAnZGlzdCc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09ICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBnaXZlbiBwYWNrYWdlIGlzIG1pc3NpbmcgdXJsIGluZm9ybWF0aW9uJyk7Cn0KCiRjYWNoZUtleUdlbmVyYXRvciA9IHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgJGtleSk6IHN0cmluZyB7CiRjYWNoZUtleSA9IGhhc2goJ3NoYTEnLCAka2V5KTsKCnJldHVybiAkcGFja2FnZS0+Z2V0TmFtZSgpLicvJy4kY2FjaGVLZXkuJy4nLiRwYWNrYWdlLT5nZXREaXN0VHlwZSgpOwp9OwoKJHJldHJpZXMgPSAzOwokZGlzdFVybHMgPSAkcGFja2FnZS0+Z2V0RGlzdFVybHMoKTsKCiR1cmxzID0gW107CmZvcmVhY2ggKCRkaXN0VXJscyBhcyAkaW5kZXggPT4gJHVybCkgewokcHJvY2Vzc2VkVXJsID0gJHRoaXMtPnByb2Nlc3NVcmwoJHBhY2thZ2UsICR1cmwpOwokdXJsc1skaW5kZXhdID0gWwonYmFzZScgPT4gJHVybCwKJ3Byb2Nlc3NlZCcgPT4gJHByb2Nlc3NlZFVybCwKCgoKCidjYWNoZUtleScgPT4gJGNhY2hlS2V5R2VuZXJhdG9yKCRwYWNrYWdlLCAkcHJvY2Vzc2VkVXJsKSwKXTsKfQphc3NlcnQoY291bnQoJHVybHMpID4gMCk7CgokZmlsZU5hbWUgPSAkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkcGF0aCk7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkZmlsZU5hbWUpKTsKCiRhY2NlcHQgPSBudWxsOwokcmVqZWN0ID0gbnVsbDsKJGRvd25sb2FkID0gZnVuY3Rpb24gKCkgdXNlICgkb3V0cHV0LCAkY2FjaGVLZXlHZW5lcmF0b3IsICRwYWNrYWdlLCAkZmlsZU5hbWUsICYkdXJscywgJiRhY2NlcHQsICYkcmVqZWN0KSB7CiR1cmwgPSByZXNldCgkdXJscyk7CiRpbmRleCA9IGtleSgkdXJscyk7CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciAhPT0gbnVsbCkgewokcHJlRmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUHJlRmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfRklMRV9ET1dOTE9BRCwgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkdXJsWydwcm9jZXNzZWQnXSwgJ3BhY2thZ2UnLCAkcGFja2FnZSk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwppZiAoJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRDdXN0b21DYWNoZUtleSgpICE9PSBudWxsKSB7CiR1cmxbJ2NhY2hlS2V5J10gPSAkY2FjaGVLZXlHZW5lcmF0b3IoJHBhY2thZ2UsICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0Q3VzdG9tQ2FjaGVLZXkoKSk7Cn0gZWxzZWlmICgkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpICE9PSAkdXJsWydwcm9jZXNzZWQnXSkgewokdXJsWydjYWNoZUtleSddID0gJGNhY2hlS2V5R2VuZXJhdG9yKCRwYWNrYWdlLCAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpKTsKfQokdXJsWydwcm9jZXNzZWQnXSA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCk7Cn0KCiR1cmxzWyRpbmRleF0gPSAkdXJsOwoKJGNoZWNrc3VtID0gJHBhY2thZ2UtPmdldERpc3RTaGExQ2hlY2tzdW0oKTsKJGNhY2hlS2V5ID0gJHVybFsnY2FjaGVLZXknXTsKCgppZiAoJHRoaXMtPmNhY2hlICE9PSBudWxsICYmICgkY2hlY2tzdW0gPT09IG51bGwgfHwgJGNoZWNrc3VtID09PSAnJyB8fCAkY2hlY2tzdW0gPT09ICR0aGlzLT5jYWNoZS0+c2hhMSgkY2FjaGVLZXkpKSAmJiAkdGhpcy0+Y2FjaGUtPmNvcHlUbygkY2FjaGVLZXksICRmaWxlTmFtZSkpIHsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gTG9hZGluZyA8aW5mbz4iIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICI8L2luZm8+ICg8Y29tbWVudD4iIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgLiAiPC9jb21tZW50PikgZnJvbSBjYWNoZSIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJZX1ZFUkJPU0UpOwp9CgoKCmlmICghJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJHRoaXMtPmxhc3RDYWNoZVdyaXRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRjYWNoZUtleTsKfQokcmVzdWx0ID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkZmlsZU5hbWUpOwp9IGVsc2UgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSBEb3dubG9hZGluZyA8aW5mbz4iIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICI8L2luZm8+ICg8Y29tbWVudD4iIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgLiAiPC9jb21tZW50PikiKTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+YWRkQ29weSgkdXJsWydwcm9jZXNzZWQnXSwgJGZpbGVOYW1lLCAkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpKQotPnRoZW4oJGFjY2VwdCwgJHJlamVjdCk7Cn0KCnJldHVybiAkcmVzdWx0LT50aGVuKGZ1bmN0aW9uICgkcmVzdWx0KSB1c2UgKCRmaWxlTmFtZSwgJGNoZWNrc3VtLCAkdXJsLCAkcGFja2FnZSk6IHN0cmluZyB7CgoKCmlmIChudWxsID09PSAkcmVzdWx0KSB7CnJldHVybiAkZmlsZU5hbWU7Cn0KCmlmICghZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigkdXJsWydiYXNlJ10uJyBjb3VsZCBub3QgYmUgc2F2ZWQgdG8gJy4kZmlsZU5hbWUuJywgbWFrZSBzdXJlIHRoZScKLicgZGlyZWN0b3J5IGlzIHdyaXRhYmxlIGFuZCB5b3UgaGF2ZSBpbnRlcm5ldCBjb25uZWN0aXZpdHknKTsKfQoKaWYgKCRjaGVja3N1bSAhPT0gbnVsbCAmJiAkY2hlY2tzdW0gIT09ICcnICYmIGhhc2hfZmlsZSgnc2hhMScsICRmaWxlTmFtZSkgIT09ICRjaGVja3N1bSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVGhlIGNoZWNrc3VtIHZlcmlmaWNhdGlvbiBvZiB0aGUgZmlsZSBmYWlsZWQgKGRvd25sb2FkZWQgZnJvbSAnLiR1cmxbJ2Jhc2UnXS4nKScpOwp9CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciAhPT0gbnVsbCkgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgJGZpbGVOYW1lLCAkY2hlY2tzdW0sICR1cmxbJ3Byb2Nlc3NlZCddLCAncGFja2FnZScsICRwYWNrYWdlKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHBvc3RGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcG9zdEZpbGVEb3dubG9hZEV2ZW50KTsKfQoKcmV0dXJuICRmaWxlTmFtZTsKfSk7Cn07CgokYWNjZXB0ID0gZnVuY3Rpb24gKFJlc3BvbnNlICRyZXNwb25zZSkgdXNlICgkcGFja2FnZSwgJGZpbGVOYW1lLCAmJHVybHMpOiBzdHJpbmcgewokdXJsID0gcmVzZXQoJHVybHMpOwokY2FjaGVLZXkgPSAkdXJsWydjYWNoZUtleSddOwokZmlsZVNpemUgPSBAZmlsZXNpemUoJGZpbGVOYW1lKTsKaWYgKGZhbHNlID09PSAkZmlsZVNpemUpIHsKJGZpbGVTaXplID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJykgPz8gJz8nOwp9CkZpbGVEb3dubG9hZGVyOjokZG93bmxvYWRNZXRhZGF0YVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRmaWxlU2l6ZTsKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICE9PSBmYWxzZSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpID09PSBmYWxzZSkgewpGaWxlRG93bmxvYWRlcjo6JHJlc3BvbnNlSGVhZGVyc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVycygpOwp9CgppZiAoJHRoaXMtPmNhY2hlICE9PSBudWxsICYmICEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJGNhY2hlS2V5OwokdGhpcy0+Y2FjaGUtPmNvcHlGcm9tKCRjYWNoZUtleSwgJGZpbGVOYW1lKTsKfQoKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CgpyZXR1cm4gJGZpbGVOYW1lOwp9OwoKJHJlamVjdCA9IGZ1bmN0aW9uICgkZSkgdXNlICgmJHVybHMsICRkb3dubG9hZCwgJGZpbGVOYW1lLCAkcGFja2FnZSwgJiRyZXRyaWVzKSB7CgppZiAoZmlsZV9leGlzdHMoJGZpbGVOYW1lKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRmaWxlTmFtZSk7Cn0KJHRoaXMtPmNsZWFyTGFzdENhY2hlV3JpdGUoJHBhY2thZ2UpOwoKaWYgKCRlIGluc3RhbmNlb2YgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24pIHsKCmlmICgwICE9PSAkZS0+Z2V0Q29kZSgpICYmICFpbl9hcnJheSgkZS0+Z2V0Q29kZSgpLCBbNTAwLCA1MDIsIDUwMywgNTA0XSwgdHJ1ZSkpIHsKJHJldHJpZXMgPSAwOwp9Cn0KCgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDk5KSB7CiRyZXRyaWVzID0gMDsKJHVybHMgPSBbXTsKfQoKaWYgKCRyZXRyaWVzID4gMCkgewp1c2xlZXAoNTAwMDAwKTsKJHJldHJpZXMtLTsKCnJldHVybiAkZG93bmxvYWQoKTsKfQoKYXJyYXlfc2hpZnQoJHVybHMpOwppZiAoXGNvdW50KCR1cmxzKSA+IDApIHsKaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEZhaWxlZCBkb3dubG9hZGluZyAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRDb2RlKCkuJzogJy4kZS0+Z2V0TWVzc2FnZSgpKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgVHJ5aW5nIHRoZSBuZXh0IFVSTCBmb3IgJy4kcGFja2FnZS0+Z2V0TmFtZSgpKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkIGRvd25sb2FkaW5nICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nLCB0cnlpbmcgdGhlIG5leHQgVVJMICgnLiRlLT5nZXRDb2RlKCkuJzogJy4kZS0+Z2V0TWVzc2FnZSgpLicpJyk7Cn0KCiRyZXRyaWVzID0gMzsKdXNsZWVwKDEwMDAwMCk7CgpyZXR1cm4gJGRvd25sb2FkKCk7Cn0KCnRocm93ICRlOwp9OwoKcmV0dXJuICRkb3dubG9hZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGZpbGVOYW1lID0gJHRoaXMtPmdldEZpbGVOYW1lKCRwYWNrYWdlLCAkcGF0aCk7CmlmIChmaWxlX2V4aXN0cygkZmlsZU5hbWUpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT51bmxpbmsoJGZpbGVOYW1lKTsKfQoKJGRpcnNUb0NsZWFuVXAgPSBbCiRwYXRoLAokdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKS4nLycuZXhwbG9kZSgnLycsICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkpWzBdLAokdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKS4nL2NvbXBvc2VyLycsCiR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpLApdOwoKaWYgKGlzc2V0KCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpmb3JlYWNoICgkdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXSBhcyAkcGF0aFRvQ2xlYW4pIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZSgkcGF0aFRvQ2xlYW4pOwp9Cn0KCmZvcmVhY2ggKCRkaXJzVG9DbGVhblVwIGFzICRkaXIpIHsKaWYgKGlzX2RpcigkZGlyKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkZGlyKSAmJiByZWFscGF0aCgkZGlyKSAhPT0gUGxhdGZvcm06OmdldEN3ZCgpKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcik7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gSW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7Cn0KCiR2ZW5kb3JEaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKCgoKCmlmIChmYWxzZSA9PT0gc3RycG9zKCR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR2ZW5kb3JEaXIpLCAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkcGF0aC5ESVJFQ1RPUllfU0VQQVJBVE9SKSkpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPmVtcHR5RGlyZWN0b3J5KCRwYXRoKTsKfQokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRwYXRoKTsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbmFtZSgkdGhpcy0+Z2V0RmlsZU5hbWUoJHBhY2thZ2UsICRwYXRoKSwgJHBhdGggLiAnLycgLiAkdGhpcy0+Z2V0RGlzdFBhdGgoJHBhY2thZ2UsIFBBVEhJTkZPX0JBU0VOQU1FKSk7CgoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRCaW5hcmllcygpIGFzICRiaW4pIHsKaWYgKGZpbGVfZXhpc3RzKCRwYXRoIC4gJy8nIC4gJGJpbikgJiYgIWlzX2V4ZWN1dGFibGUoJHBhdGggLiAnLycgLiAkYmluKSkgewpTaWxlbmNlcjo6Y2FsbCgnY2htb2QnLCAkcGF0aCAuICcvJyAuICRiaW4sIDA3NzcgJiB+dW1hc2soKSk7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREaXN0UGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBpbnQgJGNvbXBvbmVudCk6IHN0cmluZwp7CnJldHVybiBwYXRoaW5mbygoc3RyaW5nKSBwYXJzZV91cmwoc3RydHIoKHN0cmluZykgJHBhY2thZ2UtPmdldERpc3RVcmwoKSwgJ1xcJywgJy8nKSwgUEhQX1VSTF9QQVRIKSwgJGNvbXBvbmVudCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjbGVhckxhc3RDYWNoZVdyaXRlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCR0aGlzLT5jYWNoZSAhPT0gbnVsbCAmJiBpc3NldCgkdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokdGhpcy0+Y2FjaGUtPnJlbW92ZSgkdGhpcy0+bGFzdENhY2hlV3JpdGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKTsKdW5zZXQoJHRoaXMtPmxhc3RDYWNoZVdyaXRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZENsZWFudXBQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHZvaWQKewokdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gJHBhdGg7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiByZW1vdmVDbGVhbnVwUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiB2b2lkCnsKaWYgKGlzc2V0KCR0aGlzLT5hZGRpdGlvbmFsQ2xlYW51cFBhdGhzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokaWR4ID0gYXJyYXlfc2VhcmNoKCRwYXRoLCAkdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXSwgdHJ1ZSk7CmlmIChmYWxzZSAhPT0gJGlkeCkgewp1bnNldCgkdGhpcy0+YWRkaXRpb25hbENsZWFudXBQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXVskaWR4XSk7Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVcGRhdGVPcGVyYXRpb246OmZvcm1hdCgkaW5pdGlhbCwgJHRhcmdldCkgLiAkdGhpcy0+Z2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KCR0YXJnZXQsICRwYXRoKSk7CgokcHJvbWlzZSA9ICR0aGlzLT5yZW1vdmUoJGluaXRpYWwsICRwYXRoLCBmYWxzZSk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkdGFyZ2V0LCAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gJHRoaXMtPmluc3RhbGwoJHRhcmdldCwgJHBhdGgsIGZhbHNlKTsKfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkpOwp9CiRwcm9taXNlID0gJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeUFzeW5jKCRwYXRoKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCRyZXN1bHQpIHVzZSAoJHBhdGgpOiB2b2lkIHsKaWYgKCEkcmVzdWx0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGNvbXBsZXRlbHkgZGVsZXRlICcuJHBhdGguJywgYWJvcnRpbmcuJyk7Cn0KfSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RmlsZU5hbWUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJGV4dGVuc2lvbiA9ICR0aGlzLT5nZXREaXN0UGF0aCgkcGFja2FnZSwgUEFUSElORk9fRVhURU5TSU9OKTsKaWYgKCRleHRlbnNpb24gPT09ICcnKSB7CiRleHRlbnNpb24gPSAkcGFja2FnZS0+Z2V0RGlzdFR5cGUoKTsKfQoKcmV0dXJuIHJ0cmltKCR0aGlzLT5jb25maWctPmdldCgndmVuZG9yLWRpcicpIC4gJy9jb21wb3Nlci90bXAtJyAuIGhhc2goJ21kNScsICRwYWNrYWdlIC4gc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKSkgLiAnLicgLiAkZXh0ZW5zaW9uLCAnLicpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiAnJzsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvY2Vzc1VybChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHVybCk6IHN0cmluZwp7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpICYmIDAgPT09IHN0cnBvcygkdXJsLCAnaHR0cHM6JykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIGRvd25sb2FkIGZpbGVzIHZpYSBodHRwcycpOwp9CgppZiAoJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKSAhPT0gbnVsbCkgewokdXJsID0gVXJsVXRpbDo6dXBkYXRlRGlzdFJlZmVyZW5jZSgkdGhpcy0+Y29uZmlnLCAkdXJsLCAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpKTsKfQoKcmV0dXJuICR1cmw7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewokcHJldklPID0gJHRoaXMtPmlvOwoKJHRoaXMtPmlvID0gbmV3IE51bGxJTzsKJHRoaXMtPmlvLT5sb2FkQ29uZmlndXJhdGlvbigkdGhpcy0+Y29uZmlnKTsKJGUgPSBudWxsOwokb3V0cHV0ID0gJyc7CgokdGFyZ2V0RGlyID0gRmlsZXN5c3RlbTo6dHJpbVRyYWlsaW5nU2xhc2goJHBhdGgpOwp0cnkgewppZiAoaXNfZGlyKCR0YXJnZXREaXIuJ19jb21wYXJlJykpIHsKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkdGFyZ2V0RGlyLidfY29tcGFyZScpOwp9CgokcHJvbWlzZSA9ICR0aGlzLT5kb3dubG9hZCgkcGFja2FnZSwgJHRhcmdldERpci4nX2NvbXBhcmUnLCBudWxsLCBmYWxzZSk7CiRwcm9taXNlLT50aGVuKG51bGwsIHN0YXRpYyBmdW5jdGlvbiAoJGV4KSB1c2UgKCYkZSkgewokZSA9ICRleDsKfSk7CiR0aGlzLT5odHRwRG93bmxvYWRlci0+d2FpdCgpOwppZiAoJGUgIT09IG51bGwpIHsKdGhyb3cgJGU7Cn0KJHByb21pc2UgPSAkdGhpcy0+aW5zdGFsbCgkcGFja2FnZSwgJHRhcmdldERpci4nX2NvbXBhcmUnLCBmYWxzZSk7CiRwcm9taXNlLT50aGVuKG51bGwsIHN0YXRpYyBmdW5jdGlvbiAoJGV4KSB1c2UgKCYkZSkgewokZSA9ICRleDsKfSk7CiR0aGlzLT5wcm9jZXNzLT53YWl0KCk7CmlmICgkZSAhPT0gbnVsbCkgewp0aHJvdyAkZTsKfQoKJGNvbXBhcmVyID0gbmV3IENvbXBhcmVyKCk7CiRjb21wYXJlci0+c2V0U291cmNlKCR0YXJnZXREaXIuJ19jb21wYXJlJyk7CiRjb21wYXJlci0+c2V0VXBkYXRlKCR0YXJnZXREaXIpOwokY29tcGFyZXItPmRvQ29tcGFyZSgpOwokb3V0cHV0ID0gJGNvbXBhcmVyLT5nZXRDaGFuZ2VkQXNTdHJpbmcodHJ1ZSk7CiR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVEaXJlY3RvcnkoJHRhcmdldERpci4nX2NvbXBhcmUnKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewp9CgokdGhpcy0+aW8gPSAkcHJldklPOwoKaWYgKCRlICE9PSBudWxsKSB7CmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewp0aHJvdyAkZTsKfQoKcmV0dXJuICdGYWlsZWQgdG8gZGV0ZWN0IGNoYW5nZXM6IFsnLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpOwp9Cgokb3V0cHV0ID0gdHJpbSgkb3V0cHV0KTsKCnJldHVybiBzdHJsZW4oJG91dHB1dCkgPiAwID8gJG91dHB1dCA6IG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCgoKCgoKY2xhc3MgRmlsZXN5c3RlbUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlID0gJycsIGludCAkY29kZSA9IDAsID9cRXhjZXB0aW9uICRwcmV2aW91cyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgiRmlsZXN5c3RlbSBleGNlcHRpb246IFxuIi4kbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgUnVudGltZUV4Y2VwdGlvbjsKCgoKCmNsYXNzIEZvc3NpbERvd25sb2FkZXIgZXh0ZW5kcyBWY3NEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CgokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR1cmwsICR0aGlzLT5pbyk7CgokcmVwb0ZpbGUgPSAkcGF0aCAuICcuZm9zc2lsJzsKJHJlYWxQYXRoID0gUGxhdGZvcm06OnJlYWxwYXRoKCRwYXRoKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiQ2xvbmluZyAiLiRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2Nsb25lJywgJy0tJywgJHVybCwgJHJlcG9GaWxlXSk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ29wZW4nLCAnLS1uZXN0ZWQnLCAnLS0nLCAkcmVwb0ZpbGVdLCAkcmVhbFBhdGgpOwokdGhpcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd1cGRhdGUnLCAnLS0nLCAoc3RyaW5nKSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCldLCAkcmVhbFBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIFVwZGF0aW5nIHRvICIuJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpOwoKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignVGhlIC5mc2xja291dCBmaWxlIGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokcmVhbFBhdGggPSBQbGF0Zm9ybTo6cmVhbHBhdGgoJHBhdGgpOwokdGhpcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdwdWxsJ10sICRyZWFsUGF0aCk7CiR0aGlzLT5leGVjdXRlKFsnZm9zc2lsJywgJ3VwJywgKHN0cmluZykgJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCldLCAkcmVhbFBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CmlmICghJHRoaXMtPmhhc01ldGFkYXRhUmVwb3NpdG9yeSgkcGF0aCkpIHsKcmV0dXJuIG51bGw7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2NoYW5nZXMnXSwgJG91dHB1dCwgUGxhdGZvcm06OnJlYWxwYXRoKCRwYXRoKSk7Cgokb3V0cHV0ID0gdHJpbSgkb3V0cHV0KTsKCnJldHVybiBzdHJsZW4oJG91dHB1dCkgPiAwID8gJG91dHB1dCA6IG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21taXRMb2dzKHN0cmluZyAkZnJvbVJlZmVyZW5jZSwgc3RyaW5nICR0b1JlZmVyZW5jZSwgc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHRoaXMtPmV4ZWN1dGUoWydmb3NzaWwnLCAndGltZWxpbmUnLCAnLXQnLCAnY2knLCAnLVcnLCAnMCcsICctbicsICcwJywgJ2JlZm9yZScsICR0b1JlZmVyZW5jZV0sIFBsYXRmb3JtOjpyZWFscGF0aCgkcGF0aCksICRvdXRwdXQpOwoKJGxvZyA9ICcnOwokbWF0Y2ggPSAnL1xkXGQ6XGRcZDpcZFxkXHMrXFsnIC4gJHRvUmVmZXJlbmNlIC4gJ1xdLyc7Cgpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkbGluZSkgewppZiAoUHJlZzo6aXNNYXRjaCgkbWF0Y2gsICRsaW5lKSkgewpicmVhazsKfQokbG9nIC49ICRsaW5lOwp9CgpyZXR1cm4gJGxvZzsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhlY3V0ZShhcnJheSAkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP3N0cmluZyAmJG91dHB1dCA9IG51bGwpOiB2b2lkCnsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkY3dkKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIGlzX2ZpbGUoJHBhdGggLiAnLy5mc2xja291dCcpIHx8IGlzX2ZpbGUoJHBhdGggLiAnL19GT1NTSUxfJyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKY2xhc3MgR2l0RG93bmxvYWRlciBleHRlbmRzIFZjc0Rvd25sb2FkZXIgaW1wbGVtZW50cyBEdmNzRG93bmxvYWRlckludGVyZmFjZQp7CgoKCgpwcml2YXRlICRoYXNTdGFzaGVkQ2hhbmdlcyA9IFtdOwoKCgoKcHJpdmF0ZSAkaGFzRGlzY2FyZGVkQ2hhbmdlcyA9IFtdOwoKCgpwcml2YXRlICRnaXRVdGlsOwoKCgoKcHJpdmF0ZSAkY2FjaGVkUGFja2FnZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP0ZpbGVzeXN0ZW0gJGZzID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcyk7CiR0aGlzLT5naXRVdGlsID0gbmV3IEdpdFV0aWwoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmZpbGVzeXN0ZW0pOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Eb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKCiRjYWNoZVBhdGggPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkdXJsKSkuJy8nOwokZ2l0VmVyc2lvbiA9IEdpdFV0aWw6OmdldFZlcnNpb24oJHRoaXMtPnByb2Nlc3MpOwoKCmlmICgkZ2l0VmVyc2lvbiAmJiB2ZXJzaW9uX2NvbXBhcmUoJGdpdFZlcnNpb24sICcyLjMuMC1yYzAnLCAnPj0nKSAmJiBDYWNoZTo6aXNVc2FibGUoJGNhY2hlUGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gU3luY2luZyA8aW5mbz4iIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICI8L2luZm8+ICg8Y29tbWVudD4iIC4gJHBhY2thZ2UtPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCkgLiAiPC9jb21tZW50PikgaW50byBjYWNoZSIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignICAgIENsb25pbmcgdG8gY2FjaGUgYXQgJXMnLCAkY2FjaGVQYXRoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKaWYgKCR0aGlzLT5naXRVdGlsLT5mZXRjaFJlZk9yU3luY01pcnJvcigkdXJsLCAkY2FjaGVQYXRoLCAkcmVmLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpKSAmJiBpc19kaXIoJGNhY2hlUGF0aCkpIHsKJHRoaXMtPmNhY2hlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRJZCgpXVskcmVmXSA9IHRydWU7Cn0KfSBlbHNlaWYgKG51bGwgPT09ICRnaXRWZXJzaW9uKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignZ2l0IHdhcyBub3QgZm91bmQgaW4geW91ciBQQVRILCBza2lwcGluZyBzb3VyY2UgZG93bmxvYWQnKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpHaXRVdGlsOjpjbGVhbkVudigkdGhpcy0+cHJvY2Vzcyk7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwokY2FjaGVQYXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJykuJy8nLlByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsIFVybDo6c2FuaXRpemUoJHVybCkpLicvJzsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKCmlmICghZW1wdHkoJHRoaXMtPmNhY2hlZFBhY2thZ2VzWyRwYWNrYWdlLT5nZXRJZCgpXVskcmVmXSkpIHsKJG1zZyA9ICJDbG9uaW5nICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKS4nIGZyb20gY2FjaGUnOwoKJGNsb25lRmxhZ3MgPSBbJy0tZGlzc29jaWF0ZScsICctLXJlZmVyZW5jZScsICRjYWNoZVBhdGhdOwokdHJhbnNwb3J0T3B0aW9ucyA9ICRwYWNrYWdlLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7CmlmIChpc3NldCgkdHJhbnNwb3J0T3B0aW9uc1snZ2l0J11bJ3NpbmdsZV91c2VfY2xvbmUnXSkgJiYgJHRyYW5zcG9ydE9wdGlvbnNbJ2dpdCddWydzaW5nbGVfdXNlX2Nsb25lJ10pIHsKJGNsb25lRmxhZ3MgPSBbXTsKfQoKJGNvbW1hbmRzID0gWwphcnJheV9tZXJnZShbJ2dpdCcsICdjbG9uZScsICctLW5vLWNoZWNrb3V0JywgJGNhY2hlUGF0aCwgJHBhdGhdLCAkY2xvbmVGbGFncyksClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICclc2FuaXRpemVkVXJsJSddLApbJ2dpdCcsICdyZW1vdGUnLCAnYWRkJywgJ2NvbXBvc2VyJywgJy0tJywgJyVzYW5pdGl6ZWRVcmwlJ10sCl07Cn0gZWxzZSB7CiRtc2cgPSAiQ2xvbmluZyAiLiR0aGlzLT5nZXRTaG9ydEhhc2goJHJlZik7CiRjb21tYW5kcyA9IFsKYXJyYXlfbWVyZ2UoWydnaXQnLCAnY2xvbmUnLCAnLS1uby1jaGVja291dCcsICctLScsICcldXJsJScsICRwYXRoXSksClsnZ2l0JywgJ3JlbW90ZScsICdhZGQnLCAnY29tcG9zZXInLCAnLS0nLCAnJXVybCUnXSwKWydnaXQnLCAnZmV0Y2gnLCAnY29tcG9zZXInXSwKWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnb3JpZ2luJywgJy0tJywgJyVzYW5pdGl6ZWRVcmwlJ10sClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ2NvbXBvc2VyJywgJy0tJywgJyVzYW5pdGl6ZWRVcmwlJ10sCl07CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSByZXF1aXJlZCBnaXQgcmVmZXJlbmNlIGZvciAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJyBpcyBub3QgaW4gY2FjaGUgYW5kIG5ldHdvcmsgaXMgZGlzYWJsZWQsIGFib3J0aW5nJyk7Cn0KfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtc2cpOwoKJHRoaXMtPmdpdFV0aWwtPnJ1bkNvbW1hbmRzKCRjb21tYW5kcywgJHVybCwgJHBhdGgsIHRydWUpOwoKJHNvdXJjZVVybCA9ICRwYWNrYWdlLT5nZXRTb3VyY2VVcmwoKTsKaWYgKCR1cmwgIT09ICRzb3VyY2VVcmwgJiYgJHNvdXJjZVVybCAhPT0gbnVsbCkgewokdGhpcy0+dXBkYXRlT3JpZ2luVXJsKCRwYXRoLCAkc291cmNlVXJsKTsKfSBlbHNlIHsKJHRoaXMtPnNldFB1c2hVcmwoJHBhdGgsICR1cmwpOwp9CgppZiAoJG5ld1JlZiA9ICR0aGlzLT51cGRhdGVUb0NvbW1pdCgkcGFja2FnZSwgJHBhdGgsIChzdHJpbmcpICRyZWYsICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkpKSB7CmlmICgkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpID09PSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKJHBhY2thZ2UtPnNldERpc3RSZWZlcmVuY2UoJG5ld1JlZik7Cn0KJHBhY2thZ2UtPnNldFNvdXJjZVJlZmVyZW5jZSgkbmV3UmVmKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb1VwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKR2l0VXRpbDo6Y2xlYW5FbnYoJHRoaXMtPnByb2Nlc3MpOwokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAuZ2l0IGRpcmVjdG9yeSBpcyBtaXNzaW5nIGZyb20gJy4kcGF0aC4nLCBzZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvY29tbWl0LWRlcHMgZm9yIG1vcmUgaW5mb3JtYXRpb24nKTsKfQoKJGNhY2hlUGF0aCA9ICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR1cmwpKS4nLyc7CiRyZWYgPSAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKCmlmICghZW1wdHkoJHRoaXMtPmNhY2hlZFBhY2thZ2VzWyR0YXJnZXQtPmdldElkKCldWyRyZWZdKSkgewokbXNnID0gIkNoZWNraW5nIG91dCAiLiR0aGlzLT5nZXRTaG9ydEhhc2goJHJlZikuJyBmcm9tIGNhY2hlJzsKJHJlbW90ZVVybCA9ICRjYWNoZVBhdGg7Cn0gZWxzZSB7CiRtc2cgPSAiQ2hlY2tpbmcgb3V0ICIuJHRoaXMtPmdldFNob3J0SGFzaCgkcmVmKTsKJHJlbW90ZVVybCA9ICcldXJsJSc7CmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSByZXF1aXJlZCBnaXQgcmVmZXJlbmNlIGZvciAnLiR0YXJnZXQtPmdldE5hbWUoKS4nIGlzIG5vdCBpbiBjYWNoZSBhbmQgbmV0d29yayBpcyBkaXNhYmxlZCwgYWJvcnRpbmcnKTsKfQp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1zZyk7CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmV2LXBhcnNlJywgJy0tcXVpZXQnLCAnLS12ZXJpZnknLCAkcmVmLidee2NvbW1pdH0nXSwgJG91dHB1dCwgJHBhdGgpKSB7CiRjb21tYW5kcyA9IFsKWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnY29tcG9zZXInLCAnLS0nLCAkcmVtb3RlVXJsXSwKWydnaXQnLCAnZmV0Y2gnLCAnY29tcG9zZXInXSwKWydnaXQnLCAnZmV0Y2gnLCAnLS10YWdzJywgJ2NvbXBvc2VyJ10sCl07CgokdGhpcy0+Z2l0VXRpbC0+cnVuQ29tbWFuZHMoJGNvbW1hbmRzLCAkdXJsLCAkcGF0aCk7Cn0KCiRjb21tYW5kID0gWydnaXQnLCAncmVtb3RlJywgJ3NldC11cmwnLCAnY29tcG9zZXInLCAnLS0nLCAnJXNhbml0aXplZFVybCUnXTsKJHRoaXMtPmdpdFV0aWwtPnJ1bkNvbW1hbmRzKFskY29tbWFuZF0sICR1cmwsICRwYXRoKTsKCmlmICgkbmV3UmVmID0gJHRoaXMtPnVwZGF0ZVRvQ29tbWl0KCR0YXJnZXQsICRwYXRoLCAoc3RyaW5nKSAkcmVmLCAkdGFyZ2V0LT5nZXRQcmV0dHlWZXJzaW9uKCkpKSB7CmlmICgkdGFyZ2V0LT5nZXREaXN0UmVmZXJlbmNlKCkgPT09ICR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CiR0YXJnZXQtPnNldERpc3RSZWZlcmVuY2UoJG5ld1JlZik7Cn0KJHRhcmdldC0+c2V0U291cmNlUmVmZXJlbmNlKCRuZXdSZWYpOwp9CgokdXBkYXRlT3JpZ2luVXJsID0gZmFsc2U7CmlmICgKMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmVtb3RlJywgJy12J10sICRvdXRwdXQsICRwYXRoKQomJiBQcmVnOjppc01hdGNoKCd7Xm9yaWdpblxzKyg/UDx1cmw+XFMrKX1tJywgJG91dHB1dCwgJG9yaWdpbk1hdGNoKQomJiBQcmVnOjppc01hdGNoKCd7XmNvbXBvc2VyXHMrKD9QPHVybD5cUyspfW0nLCAkb3V0cHV0LCAkY29tcG9zZXJNYXRjaCkKKSB7CmlmICgkb3JpZ2luTWF0Y2hbJ3VybCddID09PSAkY29tcG9zZXJNYXRjaFsndXJsJ10gJiYgJGNvbXBvc2VyTWF0Y2hbJ3VybCddICE9PSAkdGFyZ2V0LT5nZXRTb3VyY2VVcmwoKSkgewokdXBkYXRlT3JpZ2luVXJsID0gdHJ1ZTsKfQp9CmlmICgkdXBkYXRlT3JpZ2luVXJsICYmICR0YXJnZXQtPmdldFNvdXJjZVVybCgpICE9PSBudWxsKSB7CiR0aGlzLT51cGRhdGVPcmlnaW5VcmwoJHBhdGgsICR0YXJnZXQtPmdldFNvdXJjZVVybCgpKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNvbW1hbmQgPSBbJ2dpdCcsICdzdGF0dXMnLCAnLS1wb3JjZWxhaW4nLCAnLS11bnRyYWNrZWQtZmlsZXM9bm8nXTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQoKJG91dHB1dCA9IHRyaW0oJG91dHB1dCk7CgpyZXR1cm4gc3RybGVuKCRvdXRwdXQpID4gMCA/ICRvdXRwdXQgOiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5wdXNoZWRDaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6ID9zdHJpbmcKewpHaXRVdGlsOjpjbGVhbkVudigkdGhpcy0+cHJvY2Vzcyk7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnJldHVybiBudWxsOwp9CgokY29tbWFuZCA9IFsnZ2l0JywgJ3Nob3ctcmVmJywgJy0taGVhZCcsICctZCddOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgokcmVmcyA9IHRyaW0oJG91dHB1dCk7CmlmICghUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oW2EtZjAtOV0rKSBIRUFEJH1taScsICRyZWZzLCAkbWF0Y2gpKSB7CgpyZXR1cm4gbnVsbDsKfQoKJGhlYWRSZWYgPSAkbWF0Y2hbMV07CmlmICghUHJlZzo6aXNNYXRjaEFsbFN0cmljdEdyb3Vwcygne14nLnByZWdfcXVvdGUoJGhlYWRSZWYpLicgcmVmcy9oZWFkcy8oLispJH1taScsICRyZWZzLCAkbWF0Y2hlcykpIHsKCnJldHVybiBudWxsOwp9CgokY2FuZGlkYXRlQnJhbmNoZXMgPSAkbWF0Y2hlc1sxXTsKCiRicmFuY2ggPSAkY2FuZGlkYXRlQnJhbmNoZXNbMF07CiR1bnB1c2hlZENoYW5nZXMgPSBudWxsOwokYnJhbmNoTm90Rm91bmRFcnJvciA9IGZhbHNlOwoKCmZvciAoJGkgPSAwOyAkaSA8PSAxOyAkaSsrKSB7CiRyZW1vdGVCcmFuY2hlcyA9IFtdOwoKCmZvcmVhY2ggKCRjYW5kaWRhdGVCcmFuY2hlcyBhcyAkY2FuZGlkYXRlKSB7CmlmIChQcmVnOjppc01hdGNoQWxsU3RyaWN0R3JvdXBzKCd7XlthLWYwLTldKyByZWZzL3JlbW90ZXMvKCg/OlteL10rKS8nLnByZWdfcXVvdGUoJGNhbmRpZGF0ZSkuJykkfW1pJywgJHJlZnMsICRtYXRjaGVzKSkgewpmb3JlYWNoICgkbWF0Y2hlc1sxXSBhcyAkbWF0Y2gpIHsKJGJyYW5jaCA9ICRjYW5kaWRhdGU7CiRyZW1vdGVCcmFuY2hlc1tdID0gJG1hdGNoOwp9CmJyZWFrOwp9Cn0KCgoKCmlmIChjb3VudCgkcmVtb3RlQnJhbmNoZXMpID09PSAwKSB7CiR1bnB1c2hlZENoYW5nZXMgPSAnQnJhbmNoICcgLiAkYnJhbmNoIC4gJyBjb3VsZCBub3QgYmUgZm91bmQgb24gYW55IHJlbW90ZSBhbmQgYXBwZWFycyB0byBiZSB1bnB1c2hlZCc7CiRicmFuY2hOb3RGb3VuZEVycm9yID0gdHJ1ZTsKfSBlbHNlIHsKCgppZiAoJGJyYW5jaE5vdEZvdW5kRXJyb3IpIHsKJHVucHVzaGVkQ2hhbmdlcyA9IG51bGw7Cn0KZm9yZWFjaCAoJHJlbW90ZUJyYW5jaGVzIGFzICRyZW1vdGVCcmFuY2gpIHsKJGNvbW1hbmQgPSBbJ2dpdCcsICdkaWZmJywgJy0tbmFtZS1zdGF0dXMnLCAkcmVtb3RlQnJhbmNoLicuLi4nLiRicmFuY2gsICctLSddOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9Cgokb3V0cHV0ID0gdHJpbSgkb3V0cHV0KTsKCmlmICgkdW5wdXNoZWRDaGFuZ2VzID09PSBudWxsIHx8IHN0cmxlbigkb3V0cHV0KSA8IHN0cmxlbigkdW5wdXNoZWRDaGFuZ2VzKSkgewokdW5wdXNoZWRDaGFuZ2VzID0gJG91dHB1dDsKfQp9Cn0KCgoKaWYgKCR1bnB1c2hlZENoYW5nZXMgJiYgJGkgPT09IDApIHsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnZmV0Y2gnLCAnLS1hbGwnXSwgJG91dHB1dCwgJHBhdGgpOwoKCiRjb21tYW5kID0gWydnaXQnLCAnc2hvdy1yZWYnLCAnLS1oZWFkJywgJy1kJ107CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KJHJlZnMgPSB0cmltKCRvdXRwdXQpOwp9CgoKaWYgKCEkdW5wdXNoZWRDaGFuZ2VzKSB7CmJyZWFrOwp9Cn0KCnJldHVybiAkdW5wdXNoZWRDaGFuZ2VzOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2xlYW5DaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkdXBkYXRlKTogUHJvbWlzZUludGVyZmFjZQp7CkdpdFV0aWw6OmNsZWFuRW52KCR0aGlzLT5wcm9jZXNzKTsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CgokdW5wdXNoZWQgPSAkdGhpcy0+Z2V0VW5wdXNoZWRDaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCk7CmlmICgkdW5wdXNoZWQgJiYgKCR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpIHx8ICR0aGlzLT5jb25maWctPmdldCgnZGlzY2FyZC1jaGFuZ2VzJykgIT09IHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignU291cmNlIGRpcmVjdG9yeSAnIC4gJHBhdGggLiAnIGhhcyB1bnB1c2hlZCBjaGFuZ2VzIG9uIHRoZSBjdXJyZW50IGJyYW5jaDogJy4iXG4iLiR1bnB1c2hlZCk7Cn0KCmlmIChudWxsID09PSAoJGNoYW5nZXMgPSAkdGhpcy0+Z2V0TG9jYWxDaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCkpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiRkaXNjYXJkQ2hhbmdlcyA9ICR0aGlzLT5jb25maWctPmdldCgnZGlzY2FyZC1jaGFuZ2VzJyk7CmlmICh0cnVlID09PSAkZGlzY2FyZENoYW5nZXMpIHsKcmV0dXJuICR0aGlzLT5kaXNjYXJkQ2hhbmdlcygkcGF0aCk7Cn0KaWYgKCdzdGFzaCcgPT09ICRkaXNjYXJkQ2hhbmdlcykgewppZiAoISR1cGRhdGUpIHsKcmV0dXJuIHBhcmVudDo6Y2xlYW5DaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCwgJHVwZGF0ZSk7Cn0KCnJldHVybiAkdGhpcy0+c3Rhc2hDaGFuZ2VzKCRwYXRoKTsKfQoKcmV0dXJuIHBhcmVudDo6Y2xlYW5DaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCwgJHVwZGF0ZSk7Cn0KCiRjaGFuZ2VzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGVsZW0pOiBzdHJpbmcgewpyZXR1cm4gJyAgICAnLiRlbGVtOwp9LCBQcmVnOjpzcGxpdCgne1xzKlxyP1xuXHMqfScsICRjaGFuZ2VzKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDxlcnJvcj4nLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJyBoYXMgbW9kaWZpZWQgZmlsZXM6PC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKGFycmF5X3NsaWNlKCRjaGFuZ2VzLCAwLCAxMCkpOwppZiAoY291bnQoJGNoYW5nZXMpID4gMTApIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPGluZm8+JyAuIChjb3VudCgkY2hhbmdlcykgLSAxMCkgLiAnIG1vcmUgZmlsZXMgbW9kaWZpZWQsIGNob29zZSAidiIgdG8gdmlldyB0aGUgZnVsbCBsaXN0PC9pbmZvPicpOwp9Cgp3aGlsZSAodHJ1ZSkgewpzd2l0Y2ggKCR0aGlzLT5pby0+YXNrKCcgICAgPGluZm8+RGlzY2FyZCBjaGFuZ2VzIFt5LG4sdixkLCcuKCR1cGRhdGUgPyAncywnIDogJycpLic/XT88L2luZm8+ICcsICc/JykpIHsKY2FzZSAneSc6CiR0aGlzLT5kaXNjYXJkQ2hhbmdlcygkcGF0aCk7CmJyZWFrIDI7CgpjYXNlICdzJzoKaWYgKCEkdXBkYXRlKSB7CmdvdG8gaGVscDsKfQoKJHRoaXMtPnN0YXNoQ2hhbmdlcygkcGF0aCk7CmJyZWFrIDI7CgpjYXNlICduJzoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVcGRhdGUgYWJvcnRlZCcpOwoKY2FzZSAndic6CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkY2hhbmdlcyk7CmJyZWFrOwoKY2FzZSAnZCc6CiR0aGlzLT52aWV3RGlmZigkcGF0aCk7CmJyZWFrOwoKY2FzZSAnPyc6CmRlZmF1bHQ6CmhlbHAgOgokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwonICAgIHkgLSBkaXNjYXJkIGNoYW5nZXMgYW5kIGFwcGx5IHRoZSAnLigkdXBkYXRlID8gJ3VwZGF0ZScgOiAndW5pbnN0YWxsJyksCicgICAgbiAtIGFib3J0IHRoZSAnLigkdXBkYXRlID8gJ3VwZGF0ZScgOiAndW5pbnN0YWxsJykuJyBhbmQgbGV0IHlvdSBtYW51YWxseSBjbGVhbiB0aGluZ3MgdXAnLAonICAgIHYgLSB2aWV3IG1vZGlmaWVkIGZpbGVzJywKJyAgICBkIC0gdmlldyBsb2NhbCBtb2RpZmljYXRpb25zIChkaWZmKScsCl0pOwppZiAoJHVwZGF0ZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBzIC0gc3Rhc2ggY2hhbmdlcyBhbmQgdHJ5IHRvIHJlYXBwbHkgdGhlbSBhZnRlciB0aGUgdXBkYXRlJyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPyAtIHByaW50IGhlbHAnKTsKYnJlYWs7Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZWFwcGx5Q2hhbmdlcyhzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICghZW1wdHkoJHRoaXMtPmhhc1N0YXNoZWRDaGFuZ2VzWyRwYXRoXSkpIHsKdW5zZXQoJHRoaXMtPmhhc1N0YXNoZWRDaGFuZ2VzWyRwYXRoXSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDxpbmZvPlJlLWFwcGx5aW5nIHN0YXNoZWQgY2hhbmdlczwvaW5mbz4nKTsKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3N0YXNoJywgJ3BvcCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gYXBwbHkgc3Rhc2hlZCBjaGFuZ2VzOlxuXG4iLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9Cgp1bnNldCgkdGhpcy0+aGFzRGlzY2FyZGVkQ2hhbmdlc1skcGF0aF0pOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlVG9Db21taXQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHJlZmVyZW5jZSwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKTogP3N0cmluZwp7CiRmb3JjZSA9ICFlbXB0eSgkdGhpcy0+aGFzRGlzY2FyZGVkQ2hhbmdlc1skcGF0aF0pIHx8ICFlbXB0eSgkdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdKSA/IFsnLWYnXSA6IFtdOwoKCgoKCgoKJGJyYW5jaCA9IFByZWc6OnJlcGxhY2UoJ3soPzpeZGV2LXwoPzpcLngpPy1kZXYkKX1pJywgJycsICRwcmV0dHlWZXJzaW9uKTsKCgoKCgokZXhlY3V0ZSA9IGZ1bmN0aW9uIChhcnJheSAkY29tbWFuZCkgdXNlICgmJG91dHB1dCwgJHBhdGgpIHsKCiRvdXRwdXQgPSAnJzsKCnJldHVybiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHBhdGgpOwp9OwoKJGJyYW5jaGVzID0gbnVsbDsKaWYgKCRleGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCcsICctciddKSkgewokYnJhbmNoZXMgPSAkb3V0cHV0Owp9CgoKJGdpdFJlZiA9ICRyZWZlcmVuY2U7CmlmICghUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXs0MH0kfScsICRyZWZlcmVuY2UpCiYmIG51bGwgIT09ICRicmFuY2hlcwomJiBQcmVnOjppc01hdGNoKCd7XlxzK2NvbXBvc2VyLycucHJlZ19xdW90ZSgkcmVmZXJlbmNlKS4nJH1tJywgJGJyYW5jaGVzKQopIHsKJGNvbW1hbmQxID0gYXJyYXlfbWVyZ2UoWydnaXQnLCAnY2hlY2tvdXQnXSwgJGZvcmNlLCBbJy1CJywgJGJyYW5jaCwgJ2NvbXBvc2VyLycuJHJlZmVyZW5jZSwgJy0tJ10pOwokY29tbWFuZDIgPSBbJ2dpdCcsICdyZXNldCcsICctLWhhcmQnLCAnY29tcG9zZXIvJy4kcmVmZXJlbmNlLCAnLS0nXTsKCmlmICgkZXhlY3V0ZSgkY29tbWFuZDEpICYmICRleGVjdXRlKCRjb21tYW5kMikpIHsKcmV0dXJuIG51bGw7Cn0KfQoKCmlmIChQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9JywgJHJlZmVyZW5jZSkpIHsKCmlmIChudWxsICE9PSAkYnJhbmNoZXMgJiYgIVByZWc6OmlzTWF0Y2goJ3teXHMrY29tcG9zZXIvJy5wcmVnX3F1b3RlKCRicmFuY2gpLickfW0nLCAkYnJhbmNoZXMpICYmIFByZWc6OmlzTWF0Y2goJ3teXHMrY29tcG9zZXIvdicucHJlZ19xdW90ZSgkYnJhbmNoKS4nJH1tJywgJGJyYW5jaGVzKSkgewokYnJhbmNoID0gJ3YnIC4gJGJyYW5jaDsKfQoKJGNvbW1hbmQgPSBbJ2dpdCcsICdjaGVja291dCcsICRicmFuY2gsICctLSddOwokZmFsbGJhY2tDb21tYW5kID0gYXJyYXlfbWVyZ2UoWydnaXQnLCAnY2hlY2tvdXQnXSwgJGZvcmNlLCBbJy1CJywgJGJyYW5jaCwgJ2NvbXBvc2VyLycuJGJyYW5jaCwgJy0tJ10pOwokcmVzZXRDb21tYW5kID0gWydnaXQnLCAncmVzZXQnLCAnLS1oYXJkJywgJHJlZmVyZW5jZSwgJy0tJ107CgppZiAoKCRleGVjdXRlKCRjb21tYW5kKSB8fCAkZXhlY3V0ZSgkZmFsbGJhY2tDb21tYW5kKSkgJiYgJGV4ZWN1dGUoJHJlc2V0Q29tbWFuZCkpIHsKcmV0dXJuIG51bGw7Cn0KfQoKJGNvbW1hbmQxID0gYXJyYXlfbWVyZ2UoWydnaXQnLCAnY2hlY2tvdXQnXSwgJGZvcmNlLCBbJGdpdFJlZiwgJy0tJ10pOwokY29tbWFuZDIgPSBbJ2dpdCcsICdyZXNldCcsICctLWhhcmQnLCAkZ2l0UmVmLCAnLS0nXTsKaWYgKCRleGVjdXRlKCRjb21tYW5kMSkgJiYgJGV4ZWN1dGUoJGNvbW1hbmQyKSkgewpyZXR1cm4gbnVsbDsKfQoKJGV4Y2VwdGlvbkV4dHJhID0gJyc7CgoKaWYgKGZhbHNlICE9PSBzdHJwb3MoJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICRyZWZlcmVuY2UpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPicuJHJlZmVyZW5jZS4nIGlzIGdvbmUgKGhpc3Rvcnkgd2FzIHJld3JpdHRlbj8pPC93YXJuaW5nPicpOwokZXhjZXB0aW9uRXh0cmEgPSAiXG5JdCBsb29rcyBsaWtlIHRoZSBjb21taXQgaGFzaCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSByZXBvc2l0b3J5LCBtYXliZSAiLigkcGFja2FnZS0+aXNEZXYoKSA/ICd0aGUgY29tbWl0IHdhcyByZW1vdmVkIGZyb20gdGhlIGJyYW5jaCcgOiAndGhlIHRhZyB3YXMgcmVjcmVhdGVkJykuJz8gUnVuICJjb21wb3NlciB1cGRhdGUgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLiciIHRvIHJlc29sdmUgdGhpcy4nOwp9CgokY29tbWFuZCA9IGltcGxvZGUoJyAnLCAkY29tbWFuZDEpLiAnICYmICcuaW1wbG9kZSgnICcsICRjb21tYW5kMik7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oVXJsOjpzYW5pdGl6ZSgnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuICRjb21tYW5kIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkgLiAkZXhjZXB0aW9uRXh0cmEpKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHVwZGF0ZU9yaWdpblVybChzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICR1cmxdLCAkb3V0cHV0LCAkcGF0aCk7CiR0aGlzLT5zZXRQdXNoVXJsKCRwYXRoLCAkdXJsKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldFB1c2hVcmwoc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IHZvaWQKewoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD86aHR0cHM/fGdpdCk6Ly8nLkdpdFV0aWw6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKS4nLyhbXi9dKykvKFteL10rPykoPzpcLmdpdCk/JH0nLCAkdXJsLCAkbWF0Y2gpKSB7CiRwcm90b2NvbHMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1wcm90b2NvbHMnKTsKJHB1c2hVcmwgPSAnZ2l0QCcuJG1hdGNoWzFdLic6Jy4kbWF0Y2hbMl0uJy8nLiRtYXRjaFszXS4nLmdpdCc7CmlmICghaW5fYXJyYXkoJ3NzaCcsICRwcm90b2NvbHMsIHRydWUpKSB7CiRwdXNoVXJsID0gJ2h0dHBzOi8vJyAuICRtYXRjaFsxXSAuICcvJy4kbWF0Y2hbMl0uJy8nLiRtYXRjaFszXS4nLmdpdCc7Cn0KJGNtZCA9IFsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJy0tcHVzaCcsICdvcmlnaW4nLCAnLS0nLCAkcHVzaFVybF07CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjbWQsICRpZ25vcmVkT3V0cHV0LCAkcGF0aCk7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokcGF0aCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRwYXRoKTsKJGNvbW1hbmQgPSBHaXRVdGlsOjpidWlsZFJldkxpc3RDb21tYW5kKCR0aGlzLT5wcm9jZXNzLCBhcnJheV9tZXJnZShbJy0tZm9ybWF0PSVoIC0gJWFuOiAlcycsICRmcm9tUmVmZXJlbmNlLicuLicuJHRvUmVmZXJlbmNlXSwgR2l0VXRpbDo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZ3MoJHRoaXMtPnByb2Nlc3MpKSk7CgppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleGVjdXRlICcgLiBpbXBsb2RlKCcgJywgJGNvbW1hbmQpIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpyZXR1cm4gR2l0VXRpbDo6cGFyc2VSZXZMaXN0T3V0cHV0KCRvdXRwdXQsICR0aGlzLT5wcm9jZXNzKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXNjYXJkQ2hhbmdlcyhzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjbGVhbicsICctZGYnXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHJlc2V0IGNoYW5nZXNcblxuOiIuJG91dHB1dCk7Cn0KaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Jlc2V0JywgJy0taGFyZCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgcmVzZXQgY2hhbmdlc1xuXG46Ii4kb3V0cHV0KTsKfQoKJHRoaXMtPmhhc0Rpc2NhcmRlZENoYW5nZXNbJHBhdGhdID0gdHJ1ZTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHN0YXNoQ2hhbmdlcyhzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkcGF0aCk7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdzdGFzaCcsICctLWluY2x1ZGUtdW50cmFja2VkJ10sICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCBzdGFzaCBjaGFuZ2VzXG5cbjoiLiRvdXRwdXQpOwp9CgokdGhpcy0+aGFzU3Rhc2hlZENoYW5nZXNbJHBhdGhdID0gdHJ1ZTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmlld0RpZmYoc3RyaW5nICRwYXRoKTogdm9pZAp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnZGlmZicsICdIRUFEJ10sICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNvdWxkIG5vdCB2aWV3IGRpZmZcblxuOiIuJG91dHB1dCk7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigkb3V0cHV0KTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBzdHJsZW4oJHBhdGgpID4gMCkgewokYmFzZVBhdGggPSAkcGF0aDsKJHJlbW92ZWQgPSBbXTsKCndoaWxlICghaXNfZGlyKCRiYXNlUGF0aCkgJiYgJGJhc2VQYXRoICE9PSAnXFwnKSB7CmFycmF5X3Vuc2hpZnQoJHJlbW92ZWQsIGJhc2VuYW1lKCRiYXNlUGF0aCkpOwokYmFzZVBhdGggPSBkaXJuYW1lKCRiYXNlUGF0aCk7Cn0KCmlmICgkYmFzZVBhdGggPT09ICdcXCcpIHsKcmV0dXJuICRwYXRoOwp9CgokcGF0aCA9IHJ0cmltKHJlYWxwYXRoKCRiYXNlUGF0aCkgLiAnLycgLiBpbXBsb2RlKCcvJywgJHJlbW92ZWQpLCAnLycpOwp9CgpyZXR1cm4gJHBhdGg7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNNZXRhZGF0YVJlcG9zaXRvcnkoc3RyaW5nICRwYXRoKTogYm9vbAp7CiRwYXRoID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHBhdGgpOwoKcmV0dXJuIGlzX2RpcigkcGF0aC4nLy5naXQnKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNob3J0SGFzaChzdHJpbmcgJHJlZmVyZW5jZSk6IHN0cmluZwp7CmlmICghJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSAmJiBQcmVnOjppc01hdGNoKCd7XlswLTlhLWZdezQwfSR9JywgJHJlZmVyZW5jZSkpIHsKcmV0dXJuIHN1YnN0cigkcmVmZXJlbmNlLCAwLCAxMCk7Cn0KCnJldHVybiAkcmVmZXJlbmNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCgoKCgoKY2xhc3MgR3ppcERvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7CnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CiRmaWxlbmFtZSA9IHBhdGhpbmZvKHBhcnNlX3VybChzdHJ0cigoc3RyaW5nKSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpLCAnXFwnLCAnLycpLCBQSFBfVVJMX1BBVEgpLCBQQVRISU5GT19GSUxFTkFNRSk7CiR0YXJnZXRGaWxlcGF0aCA9ICRwYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRmaWxlbmFtZTsKCgppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokY29tbWFuZCA9IFsnc2gnLCAnLWMnLCAnZ3ppcCAtY2QgLS0gIiQwIiA+ICIkMSInLCAkZmlsZSwgJHRhcmdldEZpbGVwYXRoXTsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJGlnbm9yZWRPdXRwdXQpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKSB7CgokdGhpcy0+ZXh0cmFjdFVzaW5nRXh0KCRmaWxlLCAkdGFyZ2V0RmlsZXBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRwcm9jZXNzRXJyb3IpOwp9CgoKJHRoaXMtPmV4dHJhY3RVc2luZ0V4dCgkZmlsZSwgJHRhcmdldEZpbGVwYXRoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RVc2luZ0V4dChzdHJpbmcgJGZpbGUsIHN0cmluZyAkdGFyZ2V0RmlsZXBhdGgpOiB2b2lkCnsKJGFyY2hpdmVGaWxlID0gZ3pvcGVuKCRmaWxlLCAncmInKTsKJHRhcmdldEZpbGUgPSBmb3BlbigkdGFyZ2V0RmlsZXBhdGgsICd3YicpOwp3aGlsZSAoJHN0cmluZyA9IGd6cmVhZCgkYXJjaGl2ZUZpbGUsIDQwOTYpKSB7CmZ3cml0ZSgkdGFyZ2V0RmlsZSwgJHN0cmluZywgUGxhdGZvcm06OnN0cmxlbigkc3RyaW5nKSk7Cn0KZ3pjbG9zZSgkYXJjaGl2ZUZpbGUpOwpmY2xvc2UoJHRhcmdldEZpbGUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxIZyBhcyBIZ1V0aWxzOwoKCgoKY2xhc3MgSGdEb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlcgp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0Rvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgPT09IEhnVXRpbHM6OmdldFZlcnNpb24oJHRoaXMtPnByb2Nlc3MpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignaGcgd2FzIG5vdCBmb3VuZCBpbiB5b3VyIFBBVEgsIHNraXBwaW5nIHNvdXJjZSBkb3dubG9hZCcpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvSW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CiRoZ1V0aWxzID0gbmV3IEhnVXRpbHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CgokY2xvbmVDb21tYW5kID0gc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJHVybCkgdXNlICgkcGF0aCk6IGFycmF5IHsKcmV0dXJuIFsnaGcnLCAnY2xvbmUnLCAnLS0nLCAkdXJsLCAkcGF0aF07Cn07CgokaGdVdGlscy0+cnVuQ29tbWFuZCgkY2xvbmVDb21tYW5kLCAkdXJsLCAkcGF0aCk7CgokY29tbWFuZCA9IFsnaGcnLCAndXAnLCAnLS0nLCAoc3RyaW5nKSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCldOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCByZWFscGF0aCgkcGF0aCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CiRoZ1V0aWxzID0gbmV3IEhnVXRpbHMoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CgokcmVmID0gJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIFVwZGF0aW5nIHRvICIuJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCkpOwoKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAuaGcgZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokY29tbWFuZCA9IHN0YXRpYyBmdW5jdGlvbiAoJHVybCk6IGFycmF5IHsKcmV0dXJuIFsnaGcnLCAncHVsbCcsICctLScsICR1cmxdOwp9OwokaGdVdGlscy0+cnVuQ29tbWFuZCgkY29tbWFuZCwgJHVybCwgJHBhdGgpOwoKJGNvbW1hbmQgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkcmVmKTogYXJyYXkgewpyZXR1cm4gWydoZycsICd1cCcsICctLScsICRyZWZdOwp9OwokaGdVdGlscy0+cnVuQ29tbWFuZCgkY29tbWFuZCwgJHVybCwgJHBhdGgpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NhbENoYW5nZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZwp7CmlmICghaXNfZGlyKCRwYXRoLicvLmhnJykpIHsKcmV0dXJuIG51bGw7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnc3QnXSwgJG91dHB1dCwgcmVhbHBhdGgoJHBhdGgpKTsKCiRvdXRwdXQgPSB0cmltKCRvdXRwdXQpOwoKcmV0dXJuIHN0cmxlbigkb3V0cHV0KSA+IDAgPyAkb3V0cHV0IDogbnVsbDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewokY29tbWFuZCA9IFsnaGcnLCAnbG9nJywgJy1yJywgJGZyb21SZWZlcmVuY2UuJzonLiR0b1JlZmVyZW5jZSwgJy0tc3R5bGUnLCAnY29tcGFjdCddOwoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCByZWFscGF0aCgkcGF0aCkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnJldHVybiAkb3V0cHV0Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gaXNfZGlyKCRwYXRoIC4gJy8uaGcnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKY2xhc3MgTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbiBleHRlbmRzIFRyYW5zcG9ydEV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlclxBcmNoaXZhYmxlRmlsZXNGaW5kZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXElPRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxGaWxlc3lzdGVtIGFzIFN5bWZvbnlGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgoKCgpjbGFzcyBQYXRoRG93bmxvYWRlciBleHRlbmRzIEZpbGVEb3dubG9hZGVyIGltcGxlbWVudHMgVmNzQ2FwYWJsZURvd25sb2FkZXJJbnRlcmZhY2UKewpwcml2YXRlIGNvbnN0IFNUUkFURUdZX1NZTUxJTksgPSAxMDsKcHJpdmF0ZSBjb25zdCBTVFJBVEVHWV9NSVJST1IgPSAyMDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSBGaWxlc3lzdGVtOjp0cmltVHJhaWxpbmdTbGFzaCgkcGF0aCk7CiR1cmwgPSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpOwppZiAobnVsbCA9PT0gJHVybCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBwYWNrYWdlICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGhhcyBubyBkaXN0IHVybCBjb25maWd1cmVkLCBjYW5ub3QgZG93bmxvYWQuJyk7Cn0KJHJlYWxVcmwgPSByZWFscGF0aCgkdXJsKTsKaWYgKGZhbHNlID09PSAkcmVhbFVybCB8fCAhZmlsZV9leGlzdHMoJHJlYWxVcmwpIHx8ICFpc19kaXIoJHJlYWxVcmwpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKAonU291cmNlIHBhdGggIiVzIiBpcyBub3QgZm91bmQgZm9yIHBhY2thZ2UgJXMnLAokdXJsLAokcGFja2FnZS0+Z2V0TmFtZSgpCikpOwp9CgppZiAocmVhbHBhdGgoJHBhdGgpID09PSAkcmVhbFVybCkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKaWYgKHN0cnBvcyhyZWFscGF0aCgkcGF0aCkgLiBESVJFQ1RPUllfU0VQQVJBVE9SLCAkcmVhbFVybCAuIERJUkVDVE9SWV9TRVBBUkFUT1IpID09PSAwKSB7CgoKCgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZigKJ1BhY2thZ2UgJXMgY2Fubm90IGluc3RhbGwgdG8gIiVzIiBpbnNpZGUgaXRzIHNvdXJjZSBhdCAiJXMiJywKJHBhY2thZ2UtPmdldE5hbWUoKSwKcmVhbHBhdGgoJHBhdGgpLAokcmVhbFVybAopKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkb3V0cHV0ID0gdHJ1ZSk6IFByb21pc2VJbnRlcmZhY2UKewokcGF0aCA9IEZpbGVzeXN0ZW06OnRyaW1UcmFpbGluZ1NsYXNoKCRwYXRoKTsKJHVybCA9ICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmIChudWxsID09PSAkdXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG5vIGRpc3QgdXJsIGNvbmZpZ3VyZWQsIGNhbm5vdCBpbnN0YWxsLicpOwp9CiRyZWFsVXJsID0gcmVhbHBhdGgoJHVybCk7CmlmIChmYWxzZSA9PT0gJHJlYWxVcmwpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmVhbHBhdGggJy4kdXJsKTsKfQoKaWYgKHJlYWxwYXRoKCRwYXRoKSA9PT0gJHJlYWxVcmwpIHsKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkgLiAkdGhpcy0+Z2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KCRwYWNrYWdlLCAkcGF0aCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCiR0cmFuc3BvcnRPcHRpb25zID0gJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKSArIFsncmVsYXRpdmUnID0+IHRydWVdOwoKWyRjdXJyZW50U3RyYXRlZ3ksICRhbGxvd2VkU3RyYXRlZ2llc10gPSAkdGhpcy0+Y29tcHV0ZUFsbG93ZWRTdHJhdGVnaWVzKCR0cmFuc3BvcnRPcHRpb25zKTsKCiRzeW1mb255RmlsZXN5c3RlbSA9IG5ldyBTeW1mb255RmlsZXN5c3RlbSgpOwokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRwYXRoKTsKCmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBJbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpLic6ICcsIGZhbHNlKTsKfQoKJGlzRmFsbGJhY2sgPSBmYWxzZTsKaWYgKHNlbGY6OlNUUkFURUdZX1NZTUxJTksgPT09ICRjdXJyZW50U3RyYXRlZ3kpIHsKdHJ5IHsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewoKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ0p1bmN0aW9uaW5nIGZyb20gJXMnLCAkdXJsKSwgZmFsc2UpOwp9CiR0aGlzLT5maWxlc3lzdGVtLT5qdW5jdGlvbigkcmVhbFVybCwgJHBhdGgpOwp9IGVsc2UgewokcGF0aCA9IHJ0cmltKCRwYXRoLCAiLyIpOwppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignU3ltbGlua2luZyBmcm9tICVzJywgJHVybCksIGZhbHNlKTsKfQppZiAoJHRyYW5zcG9ydE9wdGlvbnNbJ3JlbGF0aXZlJ10gPT09IHRydWUpIHsKJGFic29sdXRlUGF0aCA9ICRwYXRoOwppZiAoISR0aGlzLT5maWxlc3lzdGVtLT5pc0Fic29sdXRlUGF0aCgkYWJzb2x1dGVQYXRoKSkgewokYWJzb2x1dGVQYXRoID0gUGxhdGZvcm06OmdldEN3ZCgpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRwYXRoOwp9CiRzaG9ydGVzdFBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkYWJzb2x1dGVQYXRoLCAkcmVhbFVybCwgZmFsc2UsIHRydWUpOwokc3ltZm9ueUZpbGVzeXN0ZW0tPnN5bWxpbmsoJHNob3J0ZXN0UGF0aC4nLycsICRwYXRoKTsKfSBlbHNlIHsKJHN5bWZvbnlGaWxlc3lzdGVtLT5zeW1saW5rKCRyZWFsVXJsLicvJywgJHBhdGgpOwp9Cn0KfSBjYXRjaCAoSU9FeGNlcHRpb24gJGUpIHsKaWYgKGluX2FycmF5KHNlbGY6OlNUUkFURUdZX01JUlJPUiwgJGFsbG93ZWRTdHJhdGVnaWVzLCB0cnVlKSkgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8ZXJyb3I+U3ltbGluayBmYWlsZWQsIGZhbGxiYWNrIHRvIHVzZSBtaXJyb3JpbmchPC9lcnJvcj4nKTsKfQokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwokaXNGYWxsYmFjayA9IHRydWU7Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdTeW1saW5rIGZyb20gIiVzIiB0byAiJXMiIGZhaWxlZCEnLCAkcmVhbFVybCwgJHBhdGgpKTsKfQp9Cn0KCgppZiAoc2VsZjo6U1RSQVRFR1lfTUlSUk9SID09PSAkY3VycmVudFN0cmF0ZWd5KSB7CiRyZWFsVXJsID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJHJlYWxVcmwpOwoKaWYgKCRvdXRwdXQpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJyVzTWlycm9yaW5nIGZyb20gJXMnLCAkaXNGYWxsYmFjayA/ICcgICAgJyA6ICcnLCAkdXJsKSwgZmFsc2UpOwp9CiRpdGVyYXRvciA9IG5ldyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIoJHJlYWxVcmwsIFtdKTsKJHN5bWZvbnlGaWxlc3lzdGVtLT5taXJyb3IoJHJlYWxVcmwsICRwYXRoLCAkaXRlcmF0b3IpOwp9CgppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJycpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsIGJvb2wgJG91dHB1dCA9IHRydWUpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHBhdGggPSBGaWxlc3lzdGVtOjp0cmltVHJhaWxpbmdTbGFzaCgkcGF0aCk7CgoKCgoKCgoKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJHRoaXMtPmZpbGVzeXN0ZW0tPmlzSnVuY3Rpb24oJHBhdGgpKSB7CmlmICgkb3V0cHV0KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBVbmluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuIiwgc291cmNlIGlzIHN0aWxsIHByZXNlbnQgaW4gJHBhdGgiKTsKfQppZiAoISR0aGlzLT5maWxlc3lzdGVtLT5yZW1vdmVKdW5jdGlvbigkcGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgICAgPHdhcm5pbmc+Q291bGQgbm90IHJlbW92ZSBqdW5jdGlvbiBhdCAiIC4gJHBhdGggLiAiIC0gaXMgYW5vdGhlciBwcm9jZXNzIGxvY2tpbmcgaXQ/PC93YXJuaW5nPiIpOwp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWxpYWJseSByZW1vdmUganVuY3Rpb24gZm9yIHBhY2thZ2UgJyAuICRwYWNrYWdlLT5nZXROYW1lKCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHVybCA9ICRwYWNrYWdlLT5nZXREaXN0VXJsKCk7CmlmIChudWxsID09PSAkdXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIHBhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG5vIGRpc3QgdXJsIGNvbmZpZ3VyZWQsIGNhbm5vdCByZW1vdmUuJyk7Cn0KCgoKCgokZnMgPSBuZXcgRmlsZXN5c3RlbTsKJGFic1BhdGggPSAkZnMtPmlzQWJzb2x1dGVQYXRoKCRwYXRoKSA/ICRwYXRoIDogUGxhdGZvcm06OmdldEN3ZCgpIC4gJy8nIC4gJHBhdGg7CiRhYnNEaXN0VXJsID0gJGZzLT5pc0Fic29sdXRlUGF0aCgkdXJsKSA/ICR1cmwgOiBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiAnLycgLiAkdXJsOwppZiAoJGZzLT5ub3JtYWxpemVQYXRoKCRhYnNQYXRoKSA9PT0gJGZzLT5ub3JtYWxpemVQYXRoKCRhYnNEaXN0VXJsKSkgewppZiAoJG91dHB1dCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVW5pbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpLiIsIHNvdXJjZSBpcyBzdGlsbCBwcmVzZW50IGluICRwYXRoIik7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpyZXR1cm4gcGFyZW50OjpyZW1vdmUoJHBhY2thZ2UsICRwYXRoLCAkb3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZjc1JlZmVyZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKJHBhdGggPSBGaWxlc3lzdGVtOjp0cmltVHJhaWxpbmdTbGFzaCgkcGF0aCk7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJGd1ZXNzZXIgPSBuZXcgVmVyc2lvbkd1ZXNzZXIoJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICRwYXJzZXIsICR0aGlzLT5pbyk7CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXI7CgokcGFja2FnZUNvbmZpZyA9ICRkdW1wZXItPmR1bXAoJHBhY2thZ2UpOwokcGFja2FnZVZlcnNpb24gPSAkZ3Vlc3Nlci0+Z3Vlc3NWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCk7CmlmICgkcGFja2FnZVZlcnNpb24gIT09IG51bGwpIHsKcmV0dXJuICRwYWNrYWdlVmVyc2lvblsnY29tbWl0J107Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0SW5zdGFsbE9wZXJhdGlvbkFwcGVuZGl4KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CiR1cmwgPSAkcGFja2FnZS0+Z2V0RGlzdFVybCgpOwppZiAobnVsbCA9PT0gJHVybCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBwYWNrYWdlICcuJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGhhcyBubyBkaXN0IHVybCBjb25maWd1cmVkLCBjYW5ub3QgaW5zdGFsbC4nKTsKfQokcmVhbFVybCA9IHJlYWxwYXRoKCR1cmwpOwppZiAoZmFsc2UgPT09ICRyZWFsVXJsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIHJlYWxwYXRoICcuJHVybCk7Cn0KCmlmIChyZWFscGF0aCgkcGF0aCkgPT09ICRyZWFsVXJsKSB7CnJldHVybiAnOiBTb3VyY2UgYWxyZWFkeSBwcmVzZW50JzsKfQoKWyRjdXJyZW50U3RyYXRlZ3ldID0gJHRoaXMtPmNvbXB1dGVBbGxvd2VkU3RyYXRlZ2llcygkcGFja2FnZS0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpKTsKCmlmICgkY3VycmVudFN0cmF0ZWd5ID09PSBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LKSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuICc6IEp1bmN0aW9uaW5nIGZyb20gJy4kcGFja2FnZS0+Z2V0RGlzdFVybCgpOwp9CgpyZXR1cm4gJzogU3ltbGlua2luZyBmcm9tICcuJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKfQoKcmV0dXJuICc6IE1pcnJvcmluZyBmcm9tICcuJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbXB1dGVBbGxvd2VkU3RyYXRlZ2llcyhhcnJheSAkdHJhbnNwb3J0T3B0aW9ucyk6IGFycmF5CnsKCiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9TWU1MSU5LOwokYWxsb3dlZFN0cmF0ZWdpZXMgPSBbc2VsZjo6U1RSQVRFR1lfU1lNTElOSywgc2VsZjo6U1RSQVRFR1lfTUlSUk9SXTsKCiRtaXJyb3JQYXRoUmVwb3MgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9NSVJST1JfUEFUSF9SRVBPUycpOwppZiAoKGJvb2wpICRtaXJyb3JQYXRoUmVwb3MpIHsKJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX01JUlJPUjsKfQoKJHN5bWxpbmtPcHRpb24gPSAkdHJhbnNwb3J0T3B0aW9uc1snc3ltbGluayddID8/IG51bGw7CgppZiAodHJ1ZSA9PT0gJHN5bWxpbmtPcHRpb24pIHsKJGN1cnJlbnRTdHJhdGVneSA9IHNlbGY6OlNUUkFURUdZX1NZTUxJTks7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9TWU1MSU5LXTsKfSBlbHNlaWYgKGZhbHNlID09PSAkc3ltbGlua09wdGlvbikgewokY3VycmVudFN0cmF0ZWd5ID0gc2VsZjo6U1RSQVRFR1lfTUlSUk9SOwokYWxsb3dlZFN0cmF0ZWdpZXMgPSBbc2VsZjo6U1RSQVRFR1lfTUlSUk9SXTsKfQoKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgc2VsZjo6U1RSQVRFR1lfU1lNTElOSyA9PT0gJGN1cnJlbnRTdHJhdGVneSAmJiAhJHRoaXMtPnNhZmVKdW5jdGlvbnMoKSkgewppZiAoIWluX2FycmF5KHNlbGY6OlNUUkFURUdZX01JUlJPUiwgJGFsbG93ZWRTdHJhdGVnaWVzLCB0cnVlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdSBhcmUgb24gYW4gb2xkIFdpbmRvd3MgLyBvbGQgUEhQIGNvbWJvIHdoaWNoIGRvZXMgbm90IGFsbG93IENvbXBvc2VyIHRvIHVzZSBqdW5jdGlvbnMvc3ltbGlua3MgYW5kIHRoaXMgcGF0aCByZXBvc2l0b3J5IGhhcyBzeW1saW5rOnRydWUgaW4gaXRzIG9wdGlvbnMgc28gY29weWluZyBpcyBub3QgYWxsb3dlZCcpOwp9CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwp9CgoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgc2VsZjo6U1RSQVRFR1lfU1lNTElOSyA9PT0gJGN1cnJlbnRTdHJhdGVneSAmJiAhZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKaWYgKCFpbl9hcnJheShzZWxmOjpTVFJBVEVHWV9NSVJST1IsICRhbGxvd2VkU3RyYXRlZ2llcywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3VyIFBIUCBoYXMgdGhlIHN5bWxpbmsoKSBmdW5jdGlvbiBkaXNhYmxlZCB3aGljaCBkb2VzIG5vdCBhbGxvdyBDb21wb3NlciB0byB1c2Ugc3ltbGlua3MgYW5kIHRoaXMgcGF0aCByZXBvc2l0b3J5IGhhcyBzeW1saW5rOnRydWUgaW4gaXRzIG9wdGlvbnMgc28gY29weWluZyBpcyBub3QgYWxsb3dlZCcpOwp9CiRjdXJyZW50U3RyYXRlZ3kgPSBzZWxmOjpTVFJBVEVHWV9NSVJST1I7CiRhbGxvd2VkU3RyYXRlZ2llcyA9IFtzZWxmOjpTVFJBVEVHWV9NSVJST1JdOwp9CgpyZXR1cm4gWyRjdXJyZW50U3RyYXRlZ3ksICRhbGxvd2VkU3RyYXRlZ2llc107Cn0KCgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzYWZlSnVuY3Rpb25zKCk6IGJvb2wKewoKcmV0dXJuIGZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykgJiYKKFBIUF9XSU5ET1dTX1ZFUlNJT05fTUFKT1IgPiA2IHx8CihQSFBfV0lORE9XU19WRVJTSU9OX01BSk9SID09PSA2ICYmIFBIUF9XSU5ET1dTX1ZFUlNJT05fTUlOT1IgPj0gMSkpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxQZXJmb3JjZTsKCgoKCmNsYXNzIFBlcmZvcmNlRG93bmxvYWRlciBleHRlbmRzIFZjc0Rvd25sb2FkZXIKewoKcHJvdGVjdGVkICRwZXJmb3JjZTsKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0Rvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb0luc3RhbGwoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewokcmVmID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwokbGFiZWwgPSAkdGhpcy0+Z2V0TGFiZWxGcm9tU291cmNlUmVmZXJlbmNlKChzdHJpbmcpICRyZWYpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdDbG9uaW5nICcgLiAkcmVmKTsKJHRoaXMtPmluaXRQZXJmb3JjZSgkcGFja2FnZSwgJHBhdGgsICR1cmwpOwokdGhpcy0+cGVyZm9yY2UtPnNldFN0cmVhbSgkcmVmKTsKJHRoaXMtPnBlcmZvcmNlLT5wNExvZ2luKCk7CiR0aGlzLT5wZXJmb3JjZS0+d3JpdGVQNENsaWVudFNwZWMoKTsKJHRoaXMtPnBlcmZvcmNlLT5jb25uZWN0Q2xpZW50KCk7CiR0aGlzLT5wZXJmb3JjZS0+c3luY0NvZGVCYXNlKCRsYWJlbCk7CiR0aGlzLT5wZXJmb3JjZS0+Y2xlYW51cENsaWVudFNwZWMoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldExhYmVsRnJvbVNvdXJjZVJlZmVyZW5jZShzdHJpbmcgJHJlZik6ID9zdHJpbmcKewokcG9zID0gc3RycG9zKCRyZWYsICdAJyk7CmlmIChmYWxzZSAhPT0gJHBvcykgewpyZXR1cm4gc3Vic3RyKCRyZWYsICRwb3MgKyAxKTsKfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbml0UGVyZm9yY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IHZvaWQKewppZiAoIWVtcHR5KCR0aGlzLT5wZXJmb3JjZSkpIHsKJHRoaXMtPnBlcmZvcmNlLT5pbml0aWFsaXplUGF0aCgkcGF0aCk7CgpyZXR1cm47Cn0KCiRyZXBvc2l0b3J5ID0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKTsKJHJlcG9Db25maWcgPSBudWxsOwppZiAoJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBWY3NSZXBvc2l0b3J5KSB7CiRyZXBvQ29uZmlnID0gJHRoaXMtPmdldFJlcG9Db25maWcoJHJlcG9zaXRvcnkpOwp9CiR0aGlzLT5wZXJmb3JjZSA9IFBlcmZvcmNlOjpjcmVhdGUoJHJlcG9Db25maWcsICR1cmwsICRwYXRoLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmlvKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSZXBvQ29uZmlnKFZjc1JlcG9zaXRvcnkgJHJlcG9zaXRvcnkpOiBhcnJheQp7CnJldHVybiAkcmVwb3NpdG9yeS0+Z2V0UmVwb0NvbmZpZygpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9VcGRhdGUoUGFja2FnZUludGVyZmFjZSAkaW5pdGlhbCwgUGFja2FnZUludGVyZmFjZSAkdGFyZ2V0LCBzdHJpbmcgJHBhdGgsIHN0cmluZyAkdXJsKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZG9JbnN0YWxsKCR0YXJnZXQsICRwYXRoLCAkdXJsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdQZXJmb3JjZSBkcml2ZXIgZG9lcyBub3QgY2hlY2sgZm9yIGxvY2FsIGNoYW5nZXMgYmVmb3JlIG92ZXJyaWRpbmcnKTsKCnJldHVybiBudWxsOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cGVyZm9yY2UtPmdldENvbW1pdExvZ3MoJGZyb21SZWZlcmVuY2UsICR0b1JlZmVyZW5jZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQZXJmb3JjZShQZXJmb3JjZSAkcGVyZm9yY2UpOiB2b2lkCnsKJHRoaXMtPnBlcmZvcmNlID0gJHBlcmZvcmNlOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzTWV0YWRhdGFSZXBvc2l0b3J5KHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgUGhhckRvd25sb2FkZXIgZXh0ZW5kcyBBcmNoaXZlRG93bmxvYWRlcgp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleHRyYWN0KFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkZmlsZSwgc3RyaW5nICRwYXRoKTogUHJvbWlzZUludGVyZmFjZQp7CgokYXJjaGl2ZSA9IG5ldyBcUGhhcigkZmlsZSk7CiRhcmNoaXZlLT5leHRyYWN0VG8oJHBhdGgsIG51bGwsIHRydWUpOwoKCgoKCgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcSW5pSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJhckFyY2hpdmU7CgoKCgoKCgoKY2xhc3MgUmFyRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHByb2Nlc3NFcnJvciA9IG51bGw7CgoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGNvbW1hbmQgPSBbJ3NoJywgJy1jJywgJ3VucmFyIHggLS0gIiQwIiAiJDEiID4vZGV2L251bGwgJiYgY2htb2QgLVIgdSt3ICIkMSInLCAkZmlsZSwgJHBhdGhdOwoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfQoKaWYgKCFjbGFzc19leGlzdHMoJ1JhckFyY2hpdmUnKSkgewoKJGluaU1lc3NhZ2UgPSBJbmlIZWxwZXI6OmdldE1lc3NhZ2UoKTsKCiRlcnJvciA9ICJDb3VsZCBub3QgZGVjb21wcmVzcyB0aGUgYXJjaGl2ZSwgZW5hYmxlIHRoZSBQSFAgcmFyIGV4dGVuc2lvbiBvciBpbnN0YWxsIHVucmFyLlxuIgouICRpbmlNZXNzYWdlIC4gIlxuIiAuICRwcm9jZXNzRXJyb3I7CgppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokZXJyb3IgPSAiQ291bGQgbm90IGRlY29tcHJlc3MgdGhlIGFyY2hpdmUsIGVuYWJsZSB0aGUgUEhQIHJhciBleHRlbnNpb24uXG4iIC4gJGluaU1lc3NhZ2U7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZXJyb3IpOwp9CgokcmFyQXJjaGl2ZSA9IFJhckFyY2hpdmU6Om9wZW4oJGZpbGUpOwoKaWYgKGZhbHNlID09PSAkcmFyQXJjaGl2ZSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignQ291bGQgbm90IG9wZW4gUkFSIGFyY2hpdmU6ICcgLiAkZmlsZSk7Cn0KCiRlbnRyaWVzID0gJHJhckFyY2hpdmUtPmdldEVudHJpZXMoKTsKCmlmIChmYWxzZSA9PT0gJGVudHJpZXMpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmV0cmlldmUgUkFSIGFyY2hpdmUgZW50cmllcycpOwp9Cgpmb3JlYWNoICgkZW50cmllcyBhcyAkZW50cnkpIHsKaWYgKGZhbHNlID09PSAkZW50cnktPmV4dHJhY3QoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGV4dHJhY3QgZW50cnknKTsKfQp9CgokcmFyQXJjaGl2ZS0+Y2xvc2UoKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxTdm4gYXMgU3ZuVXRpbDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgpjbGFzcyBTdm5Eb3dubG9hZGVyIGV4dGVuZHMgVmNzRG93bmxvYWRlcgp7Cgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvRG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewpTdm5VdGlsOjpjbGVhbkVudigpOwokdXRpbCA9IG5ldyBTdm5VdGlsKCR1cmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwppZiAobnVsbCA9PT0gJHV0aWwtPmJpbmFyeVZlcnNpb24oKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3N2biB3YXMgbm90IGZvdW5kIGluIHlvdXIgUEFUSCwgc2tpcHBpbmcgc291cmNlIGRvd25sb2FkJyk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlCnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKJHJlZiA9ICRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKCiRyZXBvID0gJHBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKTsKaWYgKCRyZXBvIGluc3RhbmNlb2YgVmNzUmVwb3NpdG9yeSkgewokcmVwb0NvbmZpZyA9ICRyZXBvLT5nZXRSZXBvQ29uZmlnKCk7CmlmIChhcnJheV9rZXlfZXhpc3RzKCdzdm4tY2FjaGUtY3JlZGVudGlhbHMnLCAkcmVwb0NvbmZpZykpIHsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAoYm9vbCkgJHJlcG9Db25maWdbJ3N2bi1jYWNoZS1jcmVkZW50aWFscyddOwp9Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIENoZWNraW5nIG91dCAiLiRwYWNrYWdlLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSk7CiR0aGlzLT5leGVjdXRlKCRwYWNrYWdlLCAkdXJsLCBbJ3N2bicsICdjbyddLCBzcHJpbnRmKCIlcy8lcyIsICR1cmwsICRyZWYpLCBudWxsLCAkcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2UKewpTdm5VdGlsOjpjbGVhbkVudigpOwokcmVmID0gJHRhcmdldC0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CgppZiAoISR0aGlzLT5oYXNNZXRhZGF0YVJlcG9zaXRvcnkoJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIC5zdm4gZGlyZWN0b3J5IGlzIG1pc3NpbmcgZnJvbSAnLiRwYXRoLicsIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9jb21taXQtZGVwcyBmb3IgbW9yZSBpbmZvcm1hdGlvbicpOwp9CgokdXRpbCA9IG5ldyBTdm5VdGlsKCR1cmwsICR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokZmxhZ3MgPSBbXTsKaWYgKHZlcnNpb25fY29tcGFyZSgkdXRpbC0+YmluYXJ5VmVyc2lvbigpLCAnMS43LjAnLCAnPj0nKSkgewokZmxhZ3NbXSA9ICctLWlnbm9yZS1hbmNlc3RyeSc7Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcigiIENoZWNraW5nIG91dCAiIC4gJHJlZik7CiR0aGlzLT5leGVjdXRlKCR0YXJnZXQsICR1cmwsIGFycmF5X21lcmdlKFsnc3ZuJywgJ3N3aXRjaCddLCAkZmxhZ3MpLCBzcHJpbnRmKCIlcy8lcyIsICR1cmwsICRyZWYpLCAkcGF0aCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsQ2hhbmdlcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKaWYgKCEkdGhpcy0+aGFzTWV0YWRhdGFSZXBvc2l0b3J5KCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAnc3RhdHVzJywgJy0taWdub3JlLWV4dGVybmFscyddLCAkb3V0cHV0LCAkcGF0aCk7CgpyZXR1cm4gUHJlZzo6aXNNYXRjaCgne14gKlteWCBdICt9bScsICRvdXRwdXQpID8gJG91dHB1dCA6IG51bGw7Cn0KCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRiYXNlVXJsLCBhcnJheSAkY29tbWFuZCwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsKTogc3RyaW5nCnsKJHV0aWwgPSBuZXcgU3ZuVXRpbCgkYmFzZVVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiR1dGlsLT5zZXRDYWNoZUNyZWRlbnRpYWxzKCR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzKTsKdHJ5IHsKcmV0dXJuICR1dGlsLT5leGVjdXRlKCRjb21tYW5kLCAkdXJsLCAkY3dkLCAkcGF0aCwgJHRoaXMtPmlvLT5pc1ZlcmJvc2UoKSk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKS4nIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCAnLiRlLT5nZXRNZXNzYWdlKCkKKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2xlYW5DaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkdXBkYXRlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAoJGNoYW5nZXMgPSAkdGhpcy0+Z2V0TG9jYWxDaGFuZ2VzKCRwYWNrYWdlLCAkcGF0aCkpKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CmlmICh0cnVlID09PSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2Rpc2NhcmQtY2hhbmdlcycpKSB7CnJldHVybiAkdGhpcy0+ZGlzY2FyZENoYW5nZXMoJHBhdGgpOwp9CgpyZXR1cm4gcGFyZW50OjpjbGVhbkNoYW5nZXMoJHBhY2thZ2UsICRwYXRoLCAkdXBkYXRlKTsKfQoKJGNoYW5nZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkZWxlbSk6IHN0cmluZyB7CnJldHVybiAnICAgICcuJGVsZW07Cn0sIFByZWc6OnNwbGl0KCd7XHMqXHI/XG5ccyp9JywgJGNoYW5nZXMpKTsKJGNvdW50Q2hhbmdlcyA9IGNvdW50KCRjaGFuZ2VzKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJyAgICA8ZXJyb3I+Jy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaGFzIG1vZGlmaWVkIGZpbGUlczo8L2Vycm9yPicsICRjb3VudENoYW5nZXMgPT09IDEgPyAnJyA6ICdzJykpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoYXJyYXlfc2xpY2UoJGNoYW5nZXMsIDAsIDEwKSk7CmlmICgkY291bnRDaGFuZ2VzID4gMTApIHsKJHJlbWFpbmluZ0NoYW5nZXMgPSAkY291bnRDaGFuZ2VzIC0gMTA7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigKc3ByaW50ZigKJyAgICA8aW5mbz4nLiRyZW1haW5pbmdDaGFuZ2VzLicgbW9yZSBmaWxlJXMgbW9kaWZpZWQsIGNob29zZSAidiIgdG8gdmlldyB0aGUgZnVsbCBsaXN0PC9pbmZvPicsCiRyZW1haW5pbmdDaGFuZ2VzID09PSAxID8gJycgOiAncycKKQopOwp9Cgp3aGlsZSAodHJ1ZSkgewpzd2l0Y2ggKCR0aGlzLT5pby0+YXNrKCcgICAgPGluZm8+RGlzY2FyZCBjaGFuZ2VzIFt5LG4sdiw/XT88L2luZm8+ICcsICc/JykpIHsKY2FzZSAneSc6CiR0aGlzLT5kaXNjYXJkQ2hhbmdlcygkcGF0aCk7CmJyZWFrIDI7CgpjYXNlICduJzoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdVcGRhdGUgYWJvcnRlZCcpOwoKY2FzZSAndic6CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkY2hhbmdlcyk7CmJyZWFrOwoKY2FzZSAnPyc6CmRlZmF1bHQ6CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicgICAgeSAtIGRpc2NhcmQgY2hhbmdlcyBhbmQgYXBwbHkgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKSwKJyAgICBuIC0gYWJvcnQgdGhlICcuKCR1cGRhdGUgPyAndXBkYXRlJyA6ICd1bmluc3RhbGwnKS4nIGFuZCBsZXQgeW91IG1hbnVhbGx5IGNsZWFuIHRoaW5ncyB1cCcsCicgICAgdiAtIHZpZXcgbW9kaWZpZWQgZmlsZXMnLAonICAgID8gLSBwcmludCBoZWxwJywKXSk7CmJyZWFrOwp9Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29tbWl0TG9ncyhzdHJpbmcgJGZyb21SZWZlcmVuY2UsIHN0cmluZyAkdG9SZWZlcmVuY2UsIHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoKCd7QChcZCspJH0nLCAkZnJvbVJlZmVyZW5jZSkgJiYgUHJlZzo6aXNNYXRjaCgne0AoXGQrKSR9JywgJHRvUmVmZXJlbmNlKSkgewoKJGNvbW1hbmQgPSBbJ3N2bicsICdpbmZvJywgJy0tbm9uLWludGVyYWN0aXZlJywgJy0teG1sJywgJy0tJywgJHBhdGhdOwppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gaW1wbG9kZSgnICcsICRjb21tYW5kKSAuICJcblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpCik7Cn0KCiR1cmxQYXR0ZXJuID0gJyM8dXJsPiguKik8L3VybD4jJzsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJHVybFBhdHRlcm4sICRvdXRwdXQsICRtYXRjaGVzKSkgewokYmFzZVVybCA9ICRtYXRjaGVzWzFdOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCidVbmFibGUgdG8gZGV0ZXJtaW5lIHN2biB1cmwgZm9yIHBhdGggJy4gJHBhdGgKKTsKfQoKCiRmcm9tUmV2aXNpb24gPSBQcmVnOjpyZXBsYWNlKCd7LipAKFxkKykkfScsICckMScsICRmcm9tUmVmZXJlbmNlKTsKJHRvUmV2aXNpb24gPSBQcmVnOjpyZXBsYWNlKCd7LipAKFxkKykkfScsICckMScsICR0b1JlZmVyZW5jZSk7CgokY29tbWFuZCA9IFsnc3ZuJywgJ2xvZycsICctcicsICRmcm9tUmV2aXNpb24uJzonLiR0b1JldmlzaW9uLCAnLS1pbmNyZW1lbnRhbCddOwoKJHV0aWwgPSBuZXcgU3ZuVXRpbCgkYmFzZVVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiR1dGlsLT5zZXRDYWNoZUNyZWRlbnRpYWxzKCR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzKTsKdHJ5IHsKcmV0dXJuICR1dGlsLT5leGVjdXRlTG9jYWwoJGNvbW1hbmQsICRwYXRoLCBudWxsLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIuJGUtPmdldE1lc3NhZ2UoKQopOwp9Cn0KCnJldHVybiAiQ291bGQgbm90IHJldHJpZXZlIGNoYW5nZXMgYmV0d2VlbiAkZnJvbVJlZmVyZW5jZSBhbmQgJHRvUmVmZXJlbmNlIGR1ZSB0byBtaXNzaW5nIHJldmlzaW9uIGluZm9ybWF0aW9uIjsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRpc2NhcmRDaGFuZ2VzKHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoMCAhPT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAncmV2ZXJ0JywgJy1SJywgJy4nXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IHJlc2V0IGNoYW5nZXNcblxuOiIuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIGlzX2RpcigkcGF0aC4nLy5zdm4nKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgVGFyRG93bmxvYWRlciBleHRlbmRzIEFyY2hpdmVEb3dubG9hZGVyCnsKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKCiRhcmNoaXZlID0gbmV3IFxQaGFyRGF0YSgkZmlsZSk7CiRhcmNoaXZlLT5leHRyYWN0VG8oJHBhdGgsIG51bGwsIHRydWUpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCgoKCmNsYXNzIFRyYW5zcG9ydEV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKCnByb3RlY3RlZCAkaGVhZGVyczsKCnByb3RlY3RlZCAkcmVzcG9uc2U7Cgpwcm90ZWN0ZWQgJHN0YXR1c0NvZGU7Cgpwcm90ZWN0ZWQgJHJlc3BvbnNlSW5mbyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSA9ICIiLCBpbnQgJGNvZGUgPSA0MDAsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIZWFkZXJzKGFycmF5ICRoZWFkZXJzKTogdm9pZAp7CiR0aGlzLT5oZWFkZXJzID0gJGhlYWRlcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXJzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+aGVhZGVyczsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJlc3BvbnNlKD9zdHJpbmcgJHJlc3BvbnNlKTogdm9pZAp7CiR0aGlzLT5yZXNwb25zZSA9ICRyZXNwb25zZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlc3BvbnNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnJlc3BvbnNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RhdHVzQ29kZSgkc3RhdHVzQ29kZSk6IHZvaWQKewokdGhpcy0+c3RhdHVzQ29kZSA9ICRzdGF0dXNDb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpOiA/aW50CnsKcmV0dXJuICR0aGlzLT5zdGF0dXNDb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVzcG9uc2VJbmZvKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXNwb25zZUluZm87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXNwb25zZUluZm8oYXJyYXkgJHJlc3BvbnNlSW5mbyk6IHZvaWQKewokdGhpcy0+cmVzcG9uc2VJbmZvID0gJHJlc3BvbnNlSW5mbzsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIFZjc0NhcGFibGVEb3dubG9hZGVySW50ZXJmYWNlCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWY3NSZWZlcmVuY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoKTogP3N0cmluZzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRG93bmxvYWRlcjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxJbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CgoKCgphYnN0cmFjdCBjbGFzcyBWY3NEb3dubG9hZGVyIGltcGxlbWVudHMgRG93bmxvYWRlckludGVyZmFjZSwgQ2hhbmdlUmVwb3J0SW50ZXJmYWNlLCBWY3NDYXBhYmxlRG93bmxvYWRlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcm90ZWN0ZWQgJGhhc0NsZWFuZWRDaGFuZ2VzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9GaWxlc3lzdGVtICRmcyA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzID8/IG5ldyBGaWxlc3lzdGVtKCR0aGlzLT5wcm9jZXNzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvblNvdXJjZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3NvdXJjZSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCEkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbWlzc2luZyByZWZlcmVuY2UgaW5mb3JtYXRpb24nKTsKfQoKJHVybHMgPSAkdGhpcy0+cHJlcGFyZVVybHMoJHBhY2thZ2UtPmdldFNvdXJjZVVybHMoKSk7Cgp3aGlsZSAoJHVybCA9IGFycmF5X3NoaWZ0KCR1cmxzKSkgewp0cnkgewpyZXR1cm4gJHRoaXMtPmRvRG93bmxvYWQoJHBhY2thZ2UsICRwYXRoLCAkdXJsLCAkcHJldlBhY2thZ2UpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CgppZiAoJGUgaW5zdGFuY2VvZiBcUEhQVW5pdFxGcmFtZXdvcmtcRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZhaWxlZDogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCkpOwp9IGVsc2VpZiAoY291bnQoJHVybHMpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIEZhaWxlZCwgdHJ5aW5nIHRoZSBuZXh0IFVSTCcpOwp9CmlmICghY291bnQoJHVybHMpKSB7CnRocm93ICRlOwp9Cn0KfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkdHlwZSA9PT0gJ3VwZGF0ZScpIHsKJHRoaXMtPmNsZWFuQ2hhbmdlcygkcHJldlBhY2thZ2UsICRwYXRoLCB0cnVlKTsKJHRoaXMtPmhhc0NsZWFuZWRDaGFuZ2VzWyRwcmV2UGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSA9IHRydWU7Cn0gZWxzZWlmICgkdHlwZSA9PT0gJ2luc3RhbGwnKSB7CiR0aGlzLT5maWxlc3lzdGVtLT5lbXB0eURpcmVjdG9yeSgkcGF0aCk7Cn0gZWxzZWlmICgkdHlwZSA9PT0gJ3VuaW5zdGFsbCcpIHsKJHRoaXMtPmNsZWFuQ2hhbmdlcygkcGFja2FnZSwgJHBhdGgsIGZhbHNlKTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKHN0cmluZyAkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkdHlwZSA9PT0gJ3VwZGF0ZScgJiYgaXNzZXQoJHRoaXMtPmhhc0NsZWFuZWRDaGFuZ2VzWyRwcmV2UGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSkpIHsKJHRoaXMtPnJlYXBwbHlDaGFuZ2VzKCRwYXRoKTsKdW5zZXQoJHRoaXMtPmhhc0NsZWFuZWRDaGFuZ2VzWyRwcmV2UGFja2FnZS0+Z2V0VW5pcXVlTmFtZSgpXSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKCEkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbWlzc2luZyByZWZlcmVuY2UgaW5mb3JtYXRpb24nKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIEluc3RhbGxPcGVyYXRpb246OmZvcm1hdCgkcGFja2FnZSkuJzogJywgZmFsc2UpOwoKJHVybHMgPSAkdGhpcy0+cHJlcGFyZVVybHMoJHBhY2thZ2UtPmdldFNvdXJjZVVybHMoKSk7CndoaWxlICgkdXJsID0gYXJyYXlfc2hpZnQoJHVybHMpKSB7CnRyeSB7CiR0aGlzLT5kb0luc3RhbGwoJHBhY2thZ2UsICRwYXRoLCAkdXJsKTsKYnJlYWs7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCmlmICgkZSBpbnN0YW5jZW9mIFxQSFBVbml0XEZyYW1ld29ya1xFeGNlcHRpb24pIHsKdGhyb3cgJGU7Cn0KaWYgKCR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRmFpbGVkOiBbJy5nZXRfY2xhc3MoJGUpLiddICcuJGUtPmdldE1lc3NhZ2UoKSk7Cn0gZWxzZWlmIChjb3VudCgkdXJscykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgRmFpbGVkLCB0cnlpbmcgdGhlIG5leHQgVVJMJyk7Cn0KaWYgKCFjb3VudCgkdXJscykpIHsKdGhyb3cgJGU7Cn0KfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoISR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlICcuJHRhcmdldC0+Z2V0UHJldHR5TmFtZSgpLicgaXMgbWlzc2luZyByZWZlcmVuY2UgaW5mb3JtYXRpb24nKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVwZGF0ZU9wZXJhdGlvbjo6Zm9ybWF0KCRpbml0aWFsLCAkdGFyZ2V0KS4nOiAnLCBmYWxzZSk7CgokdXJscyA9ICR0aGlzLT5wcmVwYXJlVXJscygkdGFyZ2V0LT5nZXRTb3VyY2VVcmxzKCkpOwoKJGV4Y2VwdGlvbiA9IG51bGw7CndoaWxlICgkdXJsID0gYXJyYXlfc2hpZnQoJHVybHMpKSB7CnRyeSB7CiR0aGlzLT5kb1VwZGF0ZSgkaW5pdGlhbCwgJHRhcmdldCwgJHBhdGgsICR1cmwpOwoKJGV4Y2VwdGlvbiA9IG51bGw7CmJyZWFrOwp9IGNhdGNoIChcRXhjZXB0aW9uICRleGNlcHRpb24pIHsKCmlmICgkZXhjZXB0aW9uIGluc3RhbmNlb2YgXFBIUFVuaXRcRnJhbWV3b3JrXEV4Y2VwdGlvbikgewp0aHJvdyAkZXhjZXB0aW9uOwp9CmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZhaWxlZDogWycuZ2V0X2NsYXNzKCRleGNlcHRpb24pLiddICcuJGV4Y2VwdGlvbi0+Z2V0TWVzc2FnZSgpKTsKfSBlbHNlaWYgKGNvdW50KCR1cmxzKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBGYWlsZWQsIHRyeWluZyB0aGUgbmV4dCBVUkwnKTsKfQp9Cn0KCgoKaWYgKCEkZXhjZXB0aW9uICYmICR0aGlzLT5pby0+aXNWZXJib3NlKCkgJiYgJHRoaXMtPmhhc01ldGFkYXRhUmVwb3NpdG9yeSgkcGF0aCkpIHsKJG1lc3NhZ2UgPSAnUHVsbGluZyBpbiBjaGFuZ2VzOic7CiRsb2dzID0gJHRoaXMtPmdldENvbW1pdExvZ3MoJGluaXRpYWwtPmdldFNvdXJjZVJlZmVyZW5jZSgpLCAkdGFyZ2V0LT5nZXRTb3VyY2VSZWZlcmVuY2UoKSwgJHBhdGgpOwoKaWYgKCcnID09PSB0cmltKCRsb2dzKSkgewokbWVzc2FnZSA9ICdSb2xsaW5nIGJhY2sgY2hhbmdlczonOwokbG9ncyA9ICR0aGlzLT5nZXRDb21taXRMb2dzKCR0YXJnZXQtPmdldFNvdXJjZVJlZmVyZW5jZSgpLCAkaW5pdGlhbC0+Z2V0U291cmNlUmVmZXJlbmNlKCksICRwYXRoKTsKfQoKaWYgKCcnICE9PSB0cmltKCRsb2dzKSkgewokbG9ncyA9IGltcGxvZGUoIlxuIiwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGxpbmUpOiBzdHJpbmcgewpyZXR1cm4gJyAgICAgICcgLiAkbGluZTsKfSwgZXhwbG9kZSgiXG4iLCAkbG9ncykpKTsKCgokbG9ncyA9IHN0cl9yZXBsYWNlKCc8JywgJ1w8JywgJGxvZ3MpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgJy4kbWVzc2FnZSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbG9ncyk7Cn0KfQoKaWYgKCEkdXJscyAmJiAkZXhjZXB0aW9uKSB7CnRocm93ICRleGNlcHRpb247Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIiAgLSAiIC4gVW5pbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKCiRwcm9taXNlID0gJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeUFzeW5jKCRwYXRoKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKGJvb2wgJHJlc3VsdCkgdXNlICgkcGF0aCkgewppZiAoISRyZXN1bHQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY29tcGxldGVseSBkZWxldGUgJy4kcGF0aC4nLCBhYm9ydGluZy4nKTsKfQp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZjc1JlZmVyZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJHBhdGgpOiA/c3RyaW5nCnsKJHBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyOwokZ3Vlc3NlciA9IG5ldyBWZXJzaW9uR3Vlc3NlcigkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHBhcnNlciwgJHRoaXMtPmlvKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcjsKCiRwYWNrYWdlQ29uZmlnID0gJGR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CmlmICgkcGFja2FnZVZlcnNpb24gPSAkZ3Vlc3Nlci0+Z3Vlc3NWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCkpIHsKcmV0dXJuICRwYWNrYWdlVmVyc2lvblsnY29tbWl0J107Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2xlYW5DaGFuZ2VzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgYm9vbCAkdXBkYXRlKTogUHJvbWlzZUludGVyZmFjZQp7CgppZiAobnVsbCAhPT0gJHRoaXMtPmdldExvY2FsQ2hhbmdlcygkcGFja2FnZSwgJHBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignU291cmNlIGRpcmVjdG9yeSAnIC4gJHBhdGggLiAnIGhhcyB1bmNvbW1pdHRlZCBjaGFuZ2VzLicpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcmVhcHBseUNoYW5nZXMoc3RyaW5nICRwYXRoKTogdm9pZAp7Cn0KCgoKCgoKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkb0Rvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9JbnN0YWxsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIHN0cmluZyAkcGF0aCwgc3RyaW5nICR1cmwpOiBQcm9taXNlSW50ZXJmYWNlOwoKCgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCwgc3RyaW5nICRwYXRoLCBzdHJpbmcgJHVybCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlLCBzdHJpbmcgJHBhdGgpOiBzdHJpbmc7CgoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc01ldGFkYXRhUmVwb3NpdG9yeShzdHJpbmcgJHBhdGgpOiBib29sOwoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmVVcmxzKGFycmF5ICR1cmxzKTogYXJyYXkKewpmb3JlYWNoICgkdXJscyBhcyAkaW5kZXggPT4gJHVybCkgewppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKCgokZmlsZVByb3RvY29sID0gJ2ZpbGU6Ly8nOwokaXNGaWxlUHJvdG9jb2wgPSBmYWxzZTsKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAkZmlsZVByb3RvY29sKSkgewokdXJsID0gc3Vic3RyKCR1cmwsIHN0cmxlbigkZmlsZVByb3RvY29sKSk7CiRpc0ZpbGVQcm90b2NvbCA9IHRydWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cnBvcygkdXJsLCAnJScpKSB7CiR1cmwgPSByYXd1cmxkZWNvZGUoJHVybCk7Cn0KCiR1cmxzWyRpbmRleF0gPSByZWFscGF0aCgkdXJsKTsKCmlmICgkaXNGaWxlUHJvdG9jb2wpIHsKJHVybHNbJGluZGV4XSA9ICRmaWxlUHJvdG9jb2wgLiAkdXJsc1skaW5kZXhdOwp9Cn0KfQoKcmV0dXJuICR1cmxzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXERvd25sb2FkZXI7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgoKY2xhc3MgWHpEb3dubG9hZGVyIGV4dGVuZHMgQXJjaGl2ZURvd25sb2FkZXIKewpwcm90ZWN0ZWQgZnVuY3Rpb24gZXh0cmFjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewokY29tbWFuZCA9IFsndGFyJywgJy14SmYnLCAkZmlsZSwgJy1DJywgJHBhdGhdOwoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCkpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRwcm9jZXNzRXJyb3IgPSAnRmFpbGVkIHRvIGV4ZWN1dGUgJyAuIGltcGxvZGUoJyAnLCAkY29tbWFuZCkgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkcHJvY2Vzc0Vycm9yKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxEb3dubG9hZGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSW5pSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhlY3V0YWJsZUZpbmRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKdXNlIFppcEFyY2hpdmU7CgoKCgpjbGFzcyBaaXBEb3dubG9hZGVyIGV4dGVuZHMgQXJjaGl2ZURvd25sb2FkZXIKewoKcHJpdmF0ZSBzdGF0aWMgJHVuemlwQ29tbWFuZHM7Cgpwcml2YXRlIHN0YXRpYyAkaGFzWmlwQXJjaGl2ZTsKCnByaXZhdGUgc3RhdGljICRpc1dpbmRvd3M7CgoKcHJpdmF0ZSAkemlwQXJjaGl2ZU9iamVjdDsgCgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRwYXRoLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsLCBib29sICRvdXRwdXQgPSB0cnVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSBzZWxmOjokdW56aXBDb21tYW5kcykgewpzZWxmOjokdW56aXBDb21tYW5kcyA9IFtdOwokZmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXI7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgKCRjbWQgPSAkZmluZGVyLT5maW5kKCc3eicsIG51bGwsIFsnQzpcUHJvZ3JhbSBGaWxlc1w3LVppcCddKSkpIHsKc2VsZjo6JHVuemlwQ29tbWFuZHNbXSA9IFsnN3onLCAkY21kLCAneCcsICctYmIwJywgJy15JywgJyVmaWxlJScsICctbyVwYXRoJSddOwp9CmlmICgkY21kID0gJGZpbmRlci0+ZmluZCgndW56aXAnKSkgewpzZWxmOjokdW56aXBDb21tYW5kc1tdID0gWyd1bnppcCcsICRjbWQsICctcXEnLCAnJWZpbGUlJywgJy1kJywgJyVwYXRoJSddOwp9CmlmICghUGxhdGZvcm06OmlzV2luZG93cygpICYmICgkY21kID0gJGZpbmRlci0+ZmluZCgnN3onKSkpIHsgCnNlbGY6OiR1bnppcENvbW1hbmRzW10gPSBbJzd6JywgJGNtZCwgJ3gnLCAnLWJiMCcsICcteScsICclZmlsZSUnLCAnLW8lcGF0aCUnXTsKfQppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAoJGNtZCA9ICRmaW5kZXItPmZpbmQoJzd6eicpKSkgeyAKc2VsZjo6JHVuemlwQ29tbWFuZHNbXSA9IFsnN3p6JywgJGNtZCwgJ3gnLCAnLWJiMCcsICcteScsICclZmlsZSUnLCAnLW8lcGF0aCUnXTsKfQp9CgokcHJvY09wZW5NaXNzaW5nID0gZmFsc2U7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpzZWxmOjokdW56aXBDb21tYW5kcyA9IFtdOwokcHJvY09wZW5NaXNzaW5nID0gdHJ1ZTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRoYXNaaXBBcmNoaXZlKSB7CnNlbGY6OiRoYXNaaXBBcmNoaXZlID0gY2xhc3NfZXhpc3RzKCdaaXBBcmNoaXZlJyk7Cn0KCmlmICghc2VsZjo6JGhhc1ppcEFyY2hpdmUgJiYgIXNlbGY6OiR1bnppcENvbW1hbmRzKSB7CgokaW5pTWVzc2FnZSA9IEluaUhlbHBlcjo6Z2V0TWVzc2FnZSgpOwppZiAoJHByb2NPcGVuTWlzc2luZykgewokZXJyb3IgPSAiVGhlIHppcCBleHRlbnNpb24gaXMgbWlzc2luZyBhbmQgdW56aXAvN3ogY29tbWFuZHMgY2Fubm90IGJlIGNhbGxlZCBhcyBwcm9jX29wZW4gaXMgZGlzYWJsZWQsIHNraXBwaW5nLlxuIiAuICRpbmlNZXNzYWdlOwp9IGVsc2UgewokZXJyb3IgPSAiVGhlIHppcCBleHRlbnNpb24gYW5kIHVuemlwLzd6IGNvbW1hbmRzIGFyZSBib3RoIG1pc3NpbmcsIHNraXBwaW5nLlxuIiAuICRpbmlNZXNzYWdlOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJGVycm9yKTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRpc1dpbmRvd3MpIHsKc2VsZjo6JGlzV2luZG93cyA9IFBsYXRmb3JtOjppc1dpbmRvd3MoKTsKCmlmICghc2VsZjo6JGlzV2luZG93cyAmJiAhc2VsZjo6JHVuemlwQ29tbWFuZHMpIHsKaWYgKCRwcm9jT3Blbk1pc3NpbmcpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCI8d2FybmluZz5wcm9jX29wZW4gaXMgZGlzYWJsZWQgc28gJ3VuemlwJyBhbmQgJzd6JyBjb21tYW5kcyBjYW5ub3QgYmUgdXNlZCwgemlwIGZpbGVzIGFyZSBiZWluZyB1bnBhY2tlZCB1c2luZyB0aGUgUEhQIHppcCBleHRlbnNpb24uPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPlRoaXMgbWF5IGNhdXNlIGludmFsaWQgcmVwb3J0cyBvZiBjb3JydXB0ZWQgYXJjaGl2ZXMuIEJlc2lkZXMsIGFueSBVTklYIHBlcm1pc3Npb25zIChlLmcuIGV4ZWN1dGFibGUpIGRlZmluZWQgaW4gdGhlIGFyY2hpdmVzIHdpbGwgYmUgbG9zdC48L3dhcm5pbmc+Iik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+RW5hYmxpbmcgcHJvY19vcGVuIGFuZCBpbnN0YWxsaW5nICd1bnppcCcgb3IgJzd6JyAoMjEuMDErKSBtYXkgcmVtZWRpYXRlIHRoZW0uPC93YXJuaW5nPiIpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPkFzIHRoZXJlIGlzIG5vICd1bnppcCcgbm9yICc3eicgY29tbWFuZCBpbnN0YWxsZWQgemlwIGZpbGVzIGFyZSBiZWluZyB1bnBhY2tlZCB1c2luZyB0aGUgUEhQIHppcCBleHRlbnNpb24uPC93YXJuaW5nPiIpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoIjx3YXJuaW5nPlRoaXMgbWF5IGNhdXNlIGludmFsaWQgcmVwb3J0cyBvZiBjb3JydXB0ZWQgYXJjaGl2ZXMuIEJlc2lkZXMsIGFueSBVTklYIHBlcm1pc3Npb25zIChlLmcuIGV4ZWN1dGFibGUpIGRlZmluZWQgaW4gdGhlIGFyY2hpdmVzIHdpbGwgYmUgbG9zdC48L3dhcm5pbmc+Iik7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiPHdhcm5pbmc+SW5zdGFsbGluZyAndW56aXAnIG9yICc3eicgKDIxLjAxKykgbWF5IHJlbWVkaWF0ZSB0aGVtLjwvd2FybmluZz4iKTsKfQp9Cn0KCnJldHVybiBwYXJlbnQ6OmRvd25sb2FkKCRwYWNrYWdlLCAkcGF0aCwgJHByZXZQYWNrYWdlLCAkb3V0cHV0KTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFdpdGhTeXN0ZW1VbnppcChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBzdHJpbmcgJGZpbGUsIHN0cmluZyAkcGF0aCk6IFByb21pc2VJbnRlcmZhY2UKewpzdGF0aWMgJHdhcm5lZDdaaXBMaW51eCA9IGZhbHNlOwoKCiRpc0xhc3RDaGFuY2UgPSAhc2VsZjo6JGhhc1ppcEFyY2hpdmU7CgppZiAoMCA9PT0gXGNvdW50KHNlbGY6OiR1bnppcENvbW1hbmRzKSkgewoKCnJldHVybiAkdGhpcy0+ZXh0cmFjdFdpdGhaaXBBcmNoaXZlKCRwYWNrYWdlLCAkZmlsZSwgJHBhdGgpOwp9CgokY29tbWFuZFNwZWMgPSByZXNldChzZWxmOjokdW56aXBDb21tYW5kcyk7CiRleGVjdXRhYmxlID0gJGNvbW1hbmRTcGVjWzBdOwokY29tbWFuZCA9IGFycmF5X3NsaWNlKCRjb21tYW5kU3BlYywgMSk7CiRtYXAgPSBbCgoKJyVmaWxlJScgPT4gc3RydHIoJGZpbGUsICcvJywgRElSRUNUT1JZX1NFUEFSQVRPUiksCiclcGF0aCUnID0+IHN0cnRyKCRwYXRoLCAnLycsIERJUkVDVE9SWV9TRVBBUkFUT1IpLApdOwokY29tbWFuZCA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkbWFwKSB7CnJldHVybiBzdHJ0cigkdmFsdWUsICRtYXApOwp9LCAkY29tbWFuZCk7CgppZiAoISR3YXJuZWQ3WmlwTGludXggJiYgIVBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBpbl9hcnJheSgkZXhlY3V0YWJsZSwgWyc3eicsICc3enonXSwgdHJ1ZSkpIHsKJHdhcm5lZDdaaXBMaW51eCA9IHRydWU7CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJGNvbW1hbmRTcGVjWzFdXSwgJG91dHB1dCkpIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teXHMqNy1aaXAoPzogXFs2NFxdKT8gKFswLTkuXSspfScsICRvdXRwdXQsICRtYXRjaCkgJiYgdmVyc2lvbl9jb21wYXJlKCRtYXRjaFsxXSwgJzIxLjAxJywgJzwnKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5VbnppcHBpbmcgdXNpbmcgJy4kZXhlY3V0YWJsZS4nICcuJG1hdGNoWzFdLicgbWF5IHJlc3VsdCBpbiBpbmNvcnJlY3QgZmlsZSBwZXJtaXNzaW9ucy4gSW5zdGFsbCAnLiRleGVjdXRhYmxlLicgMjEuMDErIG9yIHVuemlwIHRvIGVuc3VyZSB5b3UgZ2V0IGNvcnJlY3QgcGVybWlzc2lvbnMuPC93YXJuaW5nPicpOwp9Cn0KfQoKJGlvID0gJHRoaXMtPmlvOwokdHJ5RmFsbGJhY2sgPSBmdW5jdGlvbiAoXFRocm93YWJsZSAkcHJvY2Vzc0Vycm9yKSB1c2UgKCRpc0xhc3RDaGFuY2UsICRpbywgJGZpbGUsICRwYXRoLCAkcGFja2FnZSwgJGV4ZWN1dGFibGUpOiBQcm9taXNlSW50ZXJmYWNlIHsKaWYgKCRpc0xhc3RDaGFuY2UpIHsKdGhyb3cgJHByb2Nlc3NFcnJvcjsKfQoKaWYgKHN0cl9jb250YWlucygkcHJvY2Vzc0Vycm9yLT5nZXRNZXNzYWdlKCksICd6aXAgYm9tYicpKSB7CnRocm93ICRwcm9jZXNzRXJyb3I7Cn0KCmlmICghaXNfZmlsZSgkZmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Jy4kcHJvY2Vzc0Vycm9yLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+VGhpcyBtb3N0IGxpa2VseSBpcyBkdWUgdG8gYSBjdXN0b20gaW5zdGFsbGVyIHBsdWdpbiBub3QgaGFuZGxpbmcgdGhlIHJldHVybmVkIFByb21pc2UgZnJvbSB0aGUgZG93bmxvYWRlcjwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+U2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9pbnN0YWxsZXJzL2NvbW1pdC81MDA2ZDBjMjg3MzBhZGUyMzNhOGY0MmVjMzFhYzY4ZmIxYzVjOWJiIGZvciBhbiBleGFtcGxlIGZpeDwvd2FybmluZz4nKTsKfSBlbHNlIHsKJGlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+Jy4kcHJvY2Vzc0Vycm9yLT5nZXRNZXNzYWdlKCkuJzwvd2FybmluZz4nKTsKJGlvLT53cml0ZUVycm9yKCcgICAgVGhlIGFyY2hpdmUgbWF5IGNvbnRhaW4gaWRlbnRpY2FsIGZpbGUgbmFtZXMgd2l0aCBkaWZmZXJlbnQgY2FwaXRhbGl6YXRpb24gKHdoaWNoIGZhaWxzIG9uIGNhc2UgaW5zZW5zaXRpdmUgZmlsZXN5c3RlbXMpJyk7CiRpby0+d3JpdGVFcnJvcignICAgIFVuemlwIHdpdGggJy4kZXhlY3V0YWJsZS4nIGNvbW1hbmQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gWmlwQXJjaGl2ZSBjbGFzcycpOwoKCmlmIChQbGF0Zm9ybTo6Z2V0RW52KCdHSVRIVUJfQUNUSU9OUycpICE9PSBmYWxzZSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9URVNUU19BUkVfUlVOTklORycpID09PSBmYWxzZSkgewokaW8tPndyaXRlRXJyb3IoJyAgICA8d2FybmluZz5BZGRpdGlvbmFsIGRlYnVnIGluZm8sIHBsZWFzZSByZXBvcnQgdG8gaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy8xMTE0OCBpZiB5b3Ugc2VlIHRoaXM6PC93YXJuaW5nPicpOwokaW8tPndyaXRlRXJyb3IoJ0ZpbGUgc2l6ZTogJy5AZmlsZXNpemUoJGZpbGUpKTsKJGlvLT53cml0ZUVycm9yKCdGaWxlIFNIQTE6ICcuaGFzaF9maWxlKCdzaGExJywgJGZpbGUpKTsKJGlvLT53cml0ZUVycm9yKCdGaXJzdCAxMDAgYnl0ZXMgKGhleCk6ICcuYmluMmhleChzdWJzdHIoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCAwLCAxMDApKSk7CiRpby0+d3JpdGVFcnJvcignTGFzdCAxMDAgYnl0ZXMgKGhleCk6ICcuYmluMmhleChzdWJzdHIoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCAtMTAwKSkpOwppZiAoc3RybGVuKChzdHJpbmcpICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpID4gMCkgewokaW8tPndyaXRlRXJyb3IoJ09yaWdpbiBVUkw6ICcuJHRoaXMtPnByb2Nlc3NVcmwoJHBhY2thZ2UsIChzdHJpbmcpICRwYWNrYWdlLT5nZXREaXN0VXJsKCkpKTsKJGlvLT53cml0ZUVycm9yKCdSZXNwb25zZSBIZWFkZXJzOiAnLmpzb25fZW5jb2RlKEZpbGVEb3dubG9hZGVyOjokcmVzcG9uc2VIZWFkZXJzWyRwYWNrYWdlLT5nZXROYW1lKCldID8/IFtdKSk7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPmV4dHJhY3RXaXRoWmlwQXJjaGl2ZSgkcGFja2FnZSwgJGZpbGUsICRwYXRoKTsKfTsKCnRyeSB7CiRwcm9taXNlID0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGVBc3luYygkY29tbWFuZCk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKFByb2Nlc3MgJHByb2Nlc3MpIHVzZSAoJHRyeUZhbGxiYWNrLCAkY29tbWFuZCwgJHBhY2thZ2UsICRmaWxlKSB7CmlmICghJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSB7CmlmIChpc3NldCgkdGhpcy0+Y2xlYW51cEV4ZWN1dGVkWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleHRyYWN0ICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nIGFzIHRoZSBpbnN0YWxsYXRpb24gd2FzIGFib3J0ZWQgYnkgYW5vdGhlciBwYWNrYWdlIG9wZXJhdGlvbi4nKTsKfQoKJG91dHB1dCA9ICRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwokb3V0cHV0ID0gc3RyX3JlcGxhY2UoJywgJy4kZmlsZS4nLnppcCBvciAnLiRmaWxlLicuWklQJywgJycsICRvdXRwdXQpOwoKcmV0dXJuICR0cnlGYWxsYmFjayhuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBleHRyYWN0ICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiAoJy4kcHJvY2Vzcy0+Z2V0RXhpdENvZGUoKS4nKSAnLmltcGxvZGUoJyAnLCAkY29tbWFuZCkuIlxuXG4iLiRvdXRwdXQpKTsKfQp9KTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewpyZXR1cm4gJHRyeUZhbGxiYWNrKCRlKTsKfQp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0V2l0aFppcEFyY2hpdmUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKJHByb2Nlc3NFcnJvciA9IG51bGw7CiR6aXBBcmNoaXZlID0gJHRoaXMtPnppcEFyY2hpdmVPYmplY3QgPzogbmV3IFppcEFyY2hpdmUoKTsKCnRyeSB7CmlmICghZmlsZV9leGlzdHMoJGZpbGUpIHx8ICgkZmlsZXNpemUgPSBmaWxlc2l6ZSgkZmlsZSkpID09PSBmYWxzZSB8fCAkZmlsZXNpemUgPT09IDApIHsKJHJldHZhbCA9IC0xOwp9IGVsc2UgewokcmV0dmFsID0gJHppcEFyY2hpdmUtPm9wZW4oJGZpbGUpOwp9CgppZiAodHJ1ZSA9PT0gJHJldHZhbCkgewokdG90YWxTaXplID0gMDsKJGFyY2hpdmVTaXplID0gZmlsZXNpemUoJGZpbGUpOwokdG90YWxGaWxlcyA9ICR6aXBBcmNoaXZlLT5jb3VudCgpOwppZiAoJHRvdGFsRmlsZXMgPiAwKSB7CiRpbnNwZWN0QWxsID0gZmFsc2U7CiRmaWxlc1RvSW5zcGVjdCA9IG1pbigkdG90YWxGaWxlcywgNSk7CmZvciAoJGkgPSAwOyAkaSA8ICRmaWxlc1RvSW5zcGVjdDsgJGkrKykgewokc3RhdCA9ICR6aXBBcmNoaXZlLT5zdGF0SW5kZXgoJGluc3BlY3RBbGwgPyAkaSA6IHJhbmRvbV9pbnQoMCwgJHRvdGFsRmlsZXMgLSAxKSk7CmlmICgkc3RhdCA9PT0gZmFsc2UpIHsKY29udGludWU7Cn0KJHRvdGFsU2l6ZSArPSAkc3RhdFsnc2l6ZSddOwppZiAoISRpbnNwZWN0QWxsICYmICRzdGF0WydzaXplJ10gPiAkc3RhdFsnY29tcF9zaXplJ10gKiAyMDApIHsKJHRvdGFsU2l6ZSA9IDA7CiRpbnNwZWN0QWxsID0gdHJ1ZTsKJGkgPSAtMTsKJGZpbGVzVG9JbnNwZWN0ID0gJHRvdGFsRmlsZXM7Cn0KfQppZiAoJGFyY2hpdmVTaXplICE9PSBmYWxzZSAmJiAkdG90YWxTaXplID4gJGFyY2hpdmVTaXplICogMTAwICYmICR0b3RhbFNpemUgPiA1MCAqIDEwMjQgKiAxMDI0KSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCB6aXAgZmlsZSBmb3IgIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiB3aXRoIGNvbXByZXNzaW9uIHJhdGlvID45OSUgKHBvc3NpYmxlIHppcCBib21iKScpOwp9Cn0KCiRleHRyYWN0UmVzdWx0ID0gJHppcEFyY2hpdmUtPmV4dHJhY3RUbygkcGF0aCk7CgppZiAodHJ1ZSA9PT0gJGV4dHJhY3RSZXN1bHQpIHsKJHppcEFyY2hpdmUtPmNsb3NlKCk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb2Nlc3NFcnJvciA9IG5ldyBcUnVudGltZUV4Y2VwdGlvbihydHJpbSgiVGhlcmUgd2FzIGFuIGVycm9yIGV4dHJhY3RpbmcgdGhlIFpJUCBmaWxlIGZvciBcInskcGFja2FnZS0+Z2V0TmFtZSgpfVwiLCBpdCBpcyBlaXRoZXIgY29ycnVwdGVkIG9yIHVzaW5nIGFuIGludmFsaWQgZm9ybWF0LlxuIikpOwp9IGVsc2UgewokcHJvY2Vzc0Vycm9yID0gbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24ocnRyaW0oJHRoaXMtPmdldEVycm9yTWVzc2FnZSgkcmV0dmFsLCAkZmlsZSkuIlxuIiksICRyZXR2YWwpOwp9Cn0gY2F0Y2ggKFxFcnJvckV4Y2VwdGlvbiAkZSkgewokcHJvY2Vzc0Vycm9yID0gbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgYXJjaGl2ZSBmb3IgIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiBtYXkgY29udGFpbiBpZGVudGljYWwgZmlsZSBuYW1lcyB3aXRoIGRpZmZlcmVudCBjYXBpdGFsaXphdGlvbiAod2hpY2ggZmFpbHMgb24gY2FzZSBpbnNlbnNpdGl2ZSBmaWxlc3lzdGVtcyk6ICcuJGUtPmdldE1lc3NhZ2UoKSwgMCwgJGUpOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CiRwcm9jZXNzRXJyb3IgPSAkZTsKfQoKdGhyb3cgJHByb2Nlc3NFcnJvcjsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4dHJhY3QoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmaWxlLCBzdHJpbmcgJHBhdGgpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5leHRyYWN0V2l0aFN5c3RlbVVuemlwKCRwYWNrYWdlLCAkZmlsZSwgJHBhdGgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RXJyb3JNZXNzYWdlKGludCAkcmV0dmFsLCBzdHJpbmcgJGZpbGUpOiBzdHJpbmcKewpzd2l0Y2ggKCRyZXR2YWwpIHsKY2FzZSBaaXBBcmNoaXZlOjpFUl9FWElTVFM6CnJldHVybiBzcHJpbnRmKCJGaWxlICclcycgYWxyZWFkeSBleGlzdHMuIiwgJGZpbGUpOwpjYXNlIFppcEFyY2hpdmU6OkVSX0lOQ09OUzoKcmV0dXJuIHNwcmludGYoIlppcCBhcmNoaXZlICclcycgaXMgaW5jb25zaXN0ZW50LiIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9JTlZBTDoKcmV0dXJuIHNwcmludGYoIkludmFsaWQgYXJndW1lbnQgKCVzKSIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9NRU1PUlk6CnJldHVybiBzcHJpbnRmKCJNYWxsb2MgZmFpbHVyZSAoJXMpIiwgJGZpbGUpOwpjYXNlIFppcEFyY2hpdmU6OkVSX05PRU5UOgpyZXR1cm4gc3ByaW50ZigiTm8gc3VjaCB6aXAgZmlsZTogJyVzJyIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9OT1pJUDoKcmV0dXJuIHNwcmludGYoIiclcycgaXMgbm90IGEgemlwIGFyY2hpdmUuIiwgJGZpbGUpOwpjYXNlIFppcEFyY2hpdmU6OkVSX09QRU46CnJldHVybiBzcHJpbnRmKCJDYW4ndCBvcGVuIHppcCBmaWxlOiAlcyIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9SRUFEOgpyZXR1cm4gc3ByaW50ZigiWmlwIHJlYWQgZXJyb3IgKCVzKSIsICRmaWxlKTsKY2FzZSBaaXBBcmNoaXZlOjpFUl9TRUVLOgpyZXR1cm4gc3ByaW50ZigiWmlwIHNlZWsgZXJyb3IgKCVzKSIsICRmaWxlKTsKY2FzZSAtMToKcmV0dXJuIHNwcmludGYoIiclcycgaXMgYSBjb3JydXB0ZWQgemlwIGFyY2hpdmUgKDAgYnl0ZXMpLCB0cnkgYWdhaW4uIiwgJGZpbGUpOwpkZWZhdWx0OgpyZXR1cm4gc3ByaW50ZigiJyVzJyBpcyBub3QgYSB2YWxpZCB6aXAgYXJjaGl2ZSwgZ290IGVycm9yIGNvZGU6ICVzIiwgJGZpbGUsICRyZXR2YWwpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKCgpjbGFzcyBFdmVudAp7CgoKCnByb3RlY3RlZCAkbmFtZTsKCgoKCnByb3RlY3RlZCAkYXJnczsKCgoKCnByb3RlY3RlZCAkZmxhZ3M7CgoKCgpwcml2YXRlICRwcm9wYWdhdGlvblN0b3BwZWQgPSBmYWxzZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBhcnJheSAkYXJncyA9IFtdLCBhcnJheSAkZmxhZ3MgPSBbXSkKewokdGhpcy0+bmFtZSA9ICRuYW1lOwokdGhpcy0+YXJncyA9ICRhcmdzOwokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFyZ3M7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZsYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5mbGFnczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQcm9wYWdhdGlvblN0b3BwZWQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cHJvcGFnYXRpb25TdG9wcGVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcFByb3BhZ2F0aW9uKCk6IHZvaWQKewokdGhpcy0+cHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXI7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFRyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxlckV2ZW50Owp1c2UgQ29tcG9zZXJcSU9cQ29uc29sZUlPOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBsdWdpblxDb21tYW5kRXZlbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cUHJlQ29tbWFuZFJ1bkV2ZW50Owp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cT3BlcmF0aW9uSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2NyaXB0Owp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXFBhY2thZ2VFdmVudDsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxCaW5hcnlJbnN0YWxsZXI7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFNjcmlwdFxFdmVudCBhcyBTY3JpcHRFdmVudDsKdXNlIENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxTdHJpbmdJbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBocEV4ZWN1dGFibGVGaW5kZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CgoKCgoKCgoKCgoKCgoKY2xhc3MgRXZlbnREaXNwYXRjaGVyCnsKCnByb3RlY3RlZCAkY29tcG9zZXI7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRsb2FkZXI7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGxpc3RlbmVycyA9IFtdOwoKcHJvdGVjdGVkICRydW5TY3JpcHRzID0gdHJ1ZTsKCnByaXZhdGUgJGV2ZW50U3RhY2s7Cgpwcml2YXRlICRza2lwU2NyaXB0czsKCnByaXZhdGUgJHByZXZpb3VzSGFzaCA9IG51bGw7Cgpwcml2YXRlICRwcmV2aW91c0xpc3RlbmVycyA9IFtdOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFBhcnRpYWxDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPmNvbXBvc2VyID0gJGNvbXBvc2VyOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPz8gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+ZXZlbnRTdGFjayA9IFtdOwokdGhpcy0+c2tpcFNjcmlwdHMgPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKAphcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgKHN0cmluZykgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfU0tJUF9TQ1JJUFRTJykpKSwKc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CnJldHVybiAkdmFsICE9PSAnJzsKfQopKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UnVuU2NyaXB0cyhib29sICRydW5TY3JpcHRzID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cnVuU2NyaXB0cyA9ICRydW5TY3JpcHRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwYXRjaCg/c3RyaW5nICRldmVudE5hbWUsID9FdmVudCAkZXZlbnQgPSBudWxsKTogaW50CnsKaWYgKG51bGwgPT09ICRldmVudCkgewppZiAobnVsbCA9PT0gJGV2ZW50TmFtZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSWYgbm8gJGV2ZW50IGlzIHBhc3NlZCBpbiB0byAnLl9fTUVUSE9EX18uJyB5b3UgaGF2ZSB0byBwYXNzIGluIGFuICRldmVudE5hbWUsIGdvdCBudWxsLicpOwp9CiRldmVudCA9IG5ldyBFdmVudCgkZXZlbnROYW1lKTsKfQoKcmV0dXJuICR0aGlzLT5kb0Rpc3BhdGNoKCRldmVudCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwYXRjaFNjcmlwdChzdHJpbmcgJGV2ZW50TmFtZSwgYm9vbCAkZGV2TW9kZSA9IGZhbHNlLCBhcnJheSAkYWRkaXRpb25hbEFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pOiBpbnQKewphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIsIG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hlZCB3aXRoIGEgZnVsbHkgbG9hZGVkIENvbXBvc2VyJykpOwoKcmV0dXJuICR0aGlzLT5kb0Rpc3BhdGNoKG5ldyBTY3JpcHRFdmVudCgkZXZlbnROYW1lLCAkdGhpcy0+Y29tcG9zZXIsICR0aGlzLT5pbywgJGRldk1vZGUsICRhZGRpdGlvbmFsQXJncywgJGZsYWdzKSk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwYXRjaFBhY2thZ2VFdmVudChzdHJpbmcgJGV2ZW50TmFtZSwgYm9vbCAkZGV2TW9kZSwgUmVwb3NpdG9yeUludGVyZmFjZSAkbG9jYWxSZXBvLCBhcnJheSAkb3BlcmF0aW9ucywgT3BlcmF0aW9uSW50ZXJmYWNlICRvcGVyYXRpb24pOiBpbnQKewphc3NlcnQoJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIsIG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoaXMgc2hvdWxkIG9ubHkgYmUgcmVhY2hlZCB3aXRoIGEgZnVsbHkgbG9hZGVkIENvbXBvc2VyJykpOwoKcmV0dXJuICR0aGlzLT5kb0Rpc3BhdGNoKG5ldyBQYWNrYWdlRXZlbnQoJGV2ZW50TmFtZSwgJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8sICRkZXZNb2RlLCAkbG9jYWxSZXBvLCAkb3BlcmF0aW9ucywgJG9wZXJhdGlvbikpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNwYXRjaEluc3RhbGxlckV2ZW50KHN0cmluZyAkZXZlbnROYW1lLCBib29sICRkZXZNb2RlLCBib29sICRleGVjdXRlT3BlcmF0aW9ucywgVHJhbnNhY3Rpb24gJHRyYW5zYWN0aW9uKTogaW50CnsKYXNzZXJ0KCR0aGlzLT5jb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyLCBuZXcgXExvZ2ljRXhjZXB0aW9uKCdUaGlzIHNob3VsZCBvbmx5IGJlIHJlYWNoZWQgd2l0aCBhIGZ1bGx5IGxvYWRlZCBDb21wb3NlcicpKTsKCnJldHVybiAkdGhpcy0+ZG9EaXNwYXRjaChuZXcgSW5zdGFsbGVyRXZlbnQoJGV2ZW50TmFtZSwgJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8sICRkZXZNb2RlLCAkZXhlY3V0ZU9wZXJhdGlvbnMsICR0cmFuc2FjdGlvbikpOwp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkb0Rpc3BhdGNoKEV2ZW50ICRldmVudCkKewppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfREVCVUdfRVZFTlRTJykpIHsKJGRldGFpbHMgPSBudWxsOwppZiAoJGV2ZW50IGluc3RhbmNlb2YgUGFja2FnZUV2ZW50KSB7CiRkZXRhaWxzID0gKHN0cmluZykgJGV2ZW50LT5nZXRPcGVyYXRpb24oKTsKfSBlbHNlaWYgKCRldmVudCBpbnN0YW5jZW9mIENvbW1hbmRFdmVudCkgewokZGV0YWlscyA9ICRldmVudC0+Z2V0Q29tbWFuZE5hbWUoKTsKfSBlbHNlaWYgKCRldmVudCBpbnN0YW5jZW9mIFByZUNvbW1hbmRSdW5FdmVudCkgewokZGV0YWlscyA9ICRldmVudC0+Z2V0Q29tbWFuZCgpOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRGlzcGF0Y2hpbmcgPGluZm8+Jy4kZXZlbnQtPmdldE5hbWUoKS4nPC9pbmZvPicuKCRkZXRhaWxzID8gJyAoJy4kZGV0YWlscy4nKScgOiAnJykuJyBldmVudCcpOwp9CgokbGlzdGVuZXJzID0gJHRoaXMtPmdldExpc3RlbmVycygkZXZlbnQpOwoKJHRoaXMtPnB1c2hFdmVudCgkZXZlbnQpOwoKJGF1dG9sb2FkZXJzQmVmb3JlID0gc3BsX2F1dG9sb2FkX2Z1bmN0aW9ucygpOwoKdHJ5IHsKJHJldHVybk1heCA9IDA7CmZvcmVhY2ggKCRsaXN0ZW5lcnMgYXMgJGNhbGxhYmxlKSB7CiRyZXR1cm4gPSAwOwokdGhpcy0+ZW5zdXJlQmluRGlySXNJblBhdGgoKTsKCiRhZGRpdGlvbmFsQXJncyA9ICRldmVudC0+Z2V0QXJndW1lbnRzKCk7CmlmIChpc19zdHJpbmcoJGNhbGxhYmxlKSAmJiBzdHJfY29udGFpbnMoJGNhbGxhYmxlLCAnQG5vX2FkZGl0aW9uYWxfYXJncycpKSB7CiRjYWxsYWJsZSA9IFByZWc6OnJlcGxhY2UoJ3sgP0Bub19hZGRpdGlvbmFsX2FyZ3N9JywgJycsICRjYWxsYWJsZSk7CiRhZGRpdGlvbmFsQXJncyA9IFtdOwp9CiRmb3JtYXR0ZWRFdmVudE5hbWVXaXRoQXJncyA9ICRldmVudC0+Z2V0TmFtZSgpIC4gKCRhZGRpdGlvbmFsQXJncyAhPT0gW10gPyAnICgnIC4gaW1wbG9kZSgnLCAnLCAkYWRkaXRpb25hbEFyZ3MpIC4gJyknIDogJycpOwppZiAoIWlzX3N0cmluZygkY2FsbGFibGUpKSB7CiR0aGlzLT5tYWtlQXV0b2xvYWRlcigkZXZlbnQsICRjYWxsYWJsZSk7CmlmICghaXNfY2FsbGFibGUoJGNhbGxhYmxlKSkgewokY2xhc3NOYW1lID0gaXNfb2JqZWN0KCRjYWxsYWJsZVswXSkgPyBnZXRfY2xhc3MoJGNhbGxhYmxlWzBdKSA6ICRjYWxsYWJsZVswXTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignU3Vic2NyaWJlciAnLiRjbGFzc05hbWUuJzo6Jy4kY2FsbGFibGVbMV0uJyBmb3IgZXZlbnQgJy4kZXZlbnQtPmdldE5hbWUoKS4nIGlzIG5vdCBjYWxsYWJsZSwgbWFrZSBzdXJlIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGFuZCBwdWJsaWMnKTsKfQppZiAoaXNfYXJyYXkoJGNhbGxhYmxlKSAmJiAoaXNfc3RyaW5nKCRjYWxsYWJsZVswXSkgfHwgaXNfb2JqZWN0KCRjYWxsYWJsZVswXSkpICYmIGlzX3N0cmluZygkY2FsbGFibGVbMV0pKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlcycsICRmb3JtYXR0ZWRFdmVudE5hbWVXaXRoQXJncywgKGlzX29iamVjdCgkY2FsbGFibGVbMF0pID8gZ2V0X2NsYXNzKCRjYWxsYWJsZVswXSkgOiAkY2FsbGFibGVbMF0pLictPicuJGNhbGxhYmxlWzFdKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CiRyZXR1cm4gPSBmYWxzZSA9PT0gJGNhbGxhYmxlKCRldmVudCkgPyAxIDogMDsKfSBlbHNlaWYgKCR0aGlzLT5pc0NvbXBvc2VyU2NyaXB0KCRjYWxsYWJsZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJz4gJXM6ICVzJywgJGZvcm1hdHRlZEV2ZW50TmFtZVdpdGhBcmdzLCAkY2FsbGFibGUpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cgokc2NyaXB0ID0gZXhwbG9kZSgnICcsIHN1YnN0cigkY2FsbGFibGUsIDEpKTsKJHNjcmlwdE5hbWUgPSAkc2NyaXB0WzBdOwp1bnNldCgkc2NyaXB0WzBdKTsKCiRpbmRleCA9IGFycmF5X3NlYXJjaCgnQGFkZGl0aW9uYWxfYXJncycsICRzY3JpcHQsIHRydWUpOwppZiAoJGluZGV4ICE9PSBmYWxzZSkgewokYXJncyA9IGFycmF5X3NwbGljZSgkc2NyaXB0LCAkaW5kZXgsIDAsICRhZGRpdGlvbmFsQXJncyk7Cn0gZWxzZSB7CiRhcmdzID0gYXJyYXlfbWVyZ2UoJHNjcmlwdCwgJGFkZGl0aW9uYWxBcmdzKTsKfQokZmxhZ3MgPSAkZXZlbnQtPmdldEZsYWdzKCk7CmlmIChpc3NldCgkZmxhZ3NbJ3NjcmlwdC1hbGlhcy1pbnB1dCddKSkgewokYXJnc1N0cmluZyA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkYXJnKSB7IHJldHVybiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkYXJnKTsgfSwgJHNjcmlwdCkpOwokZmxhZ3NbJ3NjcmlwdC1hbGlhcy1pbnB1dCddID0gJGFyZ3NTdHJpbmcgLiAnICcgLiAkZmxhZ3NbJ3NjcmlwdC1hbGlhcy1pbnB1dCddOwp1bnNldCgkYXJnc1N0cmluZyk7Cn0KaWYgKHN0cnBvcygkY2FsbGFibGUsICdAY29tcG9zZXIgJykgPT09IDApIHsKJGV4ZWMgPSAkdGhpcy0+Z2V0UGhwRXhlY0NvbW1hbmQoKSAuICcgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0JJTkFSWScpKSAuICcgJyAuIGltcGxvZGUoJyAnLCAkYXJncyk7CmlmICgwICE9PSAoJGV4aXRDb2RlID0gJHRoaXMtPmV4ZWN1dGVUdHkoJGV4ZWMpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGVycm9yPlNjcmlwdCAlcyBoYW5kbGluZyB0aGUgJXMgZXZlbnQgcmV0dXJuZWQgd2l0aCBlcnJvciBjb2RlICcuJGV4aXRDb2RlLic8L2Vycm9yPicsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwoKdGhyb3cgbmV3IFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbignRXJyb3IgT3V0cHV0OiAnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAkZXhpdENvZGUpOwp9Cn0gZWxzZSB7CmlmICghJHRoaXMtPmdldExpc3RlbmVycyhuZXcgRXZlbnQoJHNjcmlwdE5hbWUpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPHdhcm5pbmc+WW91IG1hZGUgYSByZWZlcmVuY2UgdG8gYSBub24tZXhpc3RlbnQgc2NyaXB0ICVzPC93YXJuaW5nPicsICRjYWxsYWJsZSksIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCnRyeSB7Cgokc2NyaXB0RXZlbnQgPSBuZXcgU2NyaXB0RXZlbnQoJHNjcmlwdE5hbWUsICRldmVudC0+Z2V0Q29tcG9zZXIoKSwgJGV2ZW50LT5nZXRJTygpLCAkZXZlbnQtPmlzRGV2TW9kZSgpLCAkYXJncywgJGZsYWdzKTsKJHNjcmlwdEV2ZW50LT5zZXRPcmlnaW5hdGluZ0V2ZW50KCRldmVudCk7CiRyZXR1cm4gPSAkdGhpcy0+ZGlzcGF0Y2goJHNjcmlwdE5hbWUsICRzY3JpcHRFdmVudCk7Cn0gY2F0Y2ggKFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGVycm9yPlNjcmlwdCAlcyB3YXMgY2FsbGVkIHZpYSAlczwvZXJyb3I+JywgJGNhbGxhYmxlLCAkZXZlbnQtPmdldE5hbWUoKSksIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CnRocm93ICRlOwp9Cn0KfSBlbHNlaWYgKCR0aGlzLT5pc1BocFNjcmlwdCgkY2FsbGFibGUpKSB7CiRjbGFzc05hbWUgPSBzdWJzdHIoJGNhbGxhYmxlLCAwLCBzdHJwb3MoJGNhbGxhYmxlLCAnOjonKSk7CiRtZXRob2ROYW1lID0gc3Vic3RyKCRjYWxsYWJsZSwgc3RycG9zKCRjYWxsYWJsZSwgJzo6JykgKyAyKTsKCiR0aGlzLT5tYWtlQXV0b2xvYWRlcigkZXZlbnQsICRjYWxsYWJsZSk7CmlmICghY2xhc3NfZXhpc3RzKCRjbGFzc05hbWUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q2xhc3MgJy4kY2xhc3NOYW1lLicgaXMgbm90IGF1dG9sb2FkYWJsZSwgY2FuIG5vdCBjYWxsICcuJGV2ZW50LT5nZXROYW1lKCkuJyBzY3JpcHQ8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKY29udGludWU7Cn0KaWYgKCFpc19jYWxsYWJsZSgkY2FsbGFibGUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+TWV0aG9kICcuJGNhbGxhYmxlLicgaXMgbm90IGNhbGxhYmxlLCBjYW4gbm90IGNhbGwgJy4kZXZlbnQtPmdldE5hbWUoKS4nIHNjcmlwdDwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwpjb250aW51ZTsKfQoKdHJ5IHsKJHJldHVybiA9IGZhbHNlID09PSAkdGhpcy0+ZXhlY3V0ZUV2ZW50UGhwU2NyaXB0KCRjbGFzc05hbWUsICRtZXRob2ROYW1lLCAkZXZlbnQpID8gMSA6IDA7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJG1lc3NhZ2UgPSAiU2NyaXB0ICVzIGhhbmRsaW5nIHRoZSAlcyBldmVudCB0ZXJtaW5hdGVkIHdpdGggYW4gZXhjZXB0aW9uIjsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Jy5zcHJpbnRmKCRtZXNzYWdlLCAkY2FsbGFibGUsICRldmVudC0+Z2V0TmFtZSgpKS4nPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwp0aHJvdyAkZTsKfQp9IGVsc2VpZiAoJHRoaXMtPmlzQ29tbWFuZENsYXNzKCRjYWxsYWJsZSkpIHsKJGNsYXNzTmFtZSA9ICRjYWxsYWJsZTsKCiR0aGlzLT5tYWtlQXV0b2xvYWRlcigkZXZlbnQsIFskY2FsbGFibGUsICdydW4nXSk7CmlmICghY2xhc3NfZXhpc3RzKCRjbGFzc05hbWUpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Q2xhc3MgJy4kY2xhc3NOYW1lLicgaXMgbm90IGF1dG9sb2FkYWJsZSwgY2FuIG5vdCBjYWxsICcuJGV2ZW50LT5nZXROYW1lKCkuJyBzY3JpcHQ8L3dhcm5pbmc+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKY29udGludWU7Cn0KaWYgKCFpc19hKCRjbGFzc05hbWUsIENvbW1hbmQ6OmNsYXNzLCB0cnVlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkNsYXNzICcuJGNsYXNzTmFtZS4nIGRvZXMgbm90IGV4dGVuZCAnLkNvbW1hbmQ6OmNsYXNzLicsIGNhbiBub3QgY2FsbCAnLiRldmVudC0+Z2V0TmFtZSgpLicgc2NyaXB0PC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CmNvbnRpbnVlOwp9CmlmIChkZWZpbmVkKCdDb21wb3NlclxTY3JpcHRcU2NyaXB0RXZlbnRzOjonLnN0cl9yZXBsYWNlKCctJywgJ18nLCBzdHJ0b3VwcGVyKCRldmVudC0+Z2V0TmFtZSgpKSkpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGNhbm5vdCBiaW5kICcuJGV2ZW50LT5nZXROYW1lKCkuJyB0byBhIENvbW1hbmQgY2xhc3MsIHVzZSBhIG5vbi1yZXNlcnZlZCBuYW1lPC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CmNvbnRpbnVlOwp9CgokYXBwID0gbmV3IEFwcGxpY2F0aW9uKCk7CiRhcHAtPnNldENhdGNoRXhjZXB0aW9ucyhmYWxzZSk7CmlmIChtZXRob2RfZXhpc3RzKCRhcHAsICdzZXRDYXRjaEVycm9ycycpKSB7CiRhcHAtPnNldENhdGNoRXJyb3JzKGZhbHNlKTsKfQokYXBwLT5zZXRBdXRvRXhpdChmYWxzZSk7CiRjbWQgPSBuZXcgJGNsYXNzTmFtZSgkZXZlbnQtPmdldE5hbWUoKSk7CgppZiAobWV0aG9kX2V4aXN0cygkYXBwLCAnYWRkQ29tbWFuZCcpKSB7CiRhcHAtPmFkZENvbW1hbmQoJGNtZCk7Cn0gZWxzZSB7CgoKJGFwcC0+YWRkKCRjbWQpOwp9CiRhcHAtPnNldERlZmF1bHRDb21tYW5kKChzdHJpbmcpICRjbWQtPmdldE5hbWUoKSwgdHJ1ZSk7CnRyeSB7CiRhcmdzID0gaW1wbG9kZSgnICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRhcmcpIHsgcmV0dXJuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRhcmcpOyB9LCAkYWRkaXRpb25hbEFyZ3MpKTsKCgppZiAoJHRoaXMtPmlvIGluc3RhbmNlb2YgQ29uc29sZUlPKSB7CiRyZWZsUHJvcCA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCR0aGlzLT5pbywgJ291dHB1dCcpOwppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIHsKJHJlZmxQcm9wLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwp9CiRvdXRwdXQgPSAkcmVmbFByb3AtPmdldFZhbHVlKCR0aGlzLT5pbyk7Cn0gZWxzZSB7CiRvdXRwdXQgPSBuZXcgQ29uc29sZU91dHB1dCgpOwp9CiRyZXR1cm4gPSAkYXBwLT5ydW4obmV3IFN0cmluZ0lucHV0KCRldmVudC0+Z2V0RmxhZ3MoKVsnc2NyaXB0LWFsaWFzLWlucHV0J10gPz8gJGFyZ3MpLCAkb3V0cHV0KTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9ICJTY3JpcHQgJXMgaGFuZGxpbmcgdGhlICVzIGV2ZW50IHRlcm1pbmF0ZWQgd2l0aCBhbiBleGNlcHRpb24iOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj4nLnNwcmludGYoJG1lc3NhZ2UsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CnRocm93ICRlOwp9Cn0gZWxzZSB7CiRhcmdzID0gaW1wbG9kZSgnICcsIGFycmF5X21hcChbJ0NvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yJywgJ2VzY2FwZSddLCAkYWRkaXRpb25hbEFyZ3MpKTsKCgppZiAoc3RycG9zKCRjYWxsYWJsZSwgJ0BwdXRlbnYgJykgPT09IDApIHsKJGV4ZWMgPSAkY2FsbGFibGU7Cn0gZWxzZSB7CmlmIChzdHJfY29udGFpbnMoJGNhbGxhYmxlLCAnQGFkZGl0aW9uYWxfYXJncycpKSB7CiRleGVjID0gc3RyX3JlcGxhY2UoJ0BhZGRpdGlvbmFsX2FyZ3MnLCAkYXJncywgJGNhbGxhYmxlKTsKfSBlbHNlIHsKJGV4ZWMgPSAkY2FsbGFibGUgLiAoJGFyZ3MgPT09ICcnID8gJycgOiAnICcuJGFyZ3MpOwp9Cn0KCmlmICgkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlcycsICRldmVudC0+Z2V0TmFtZSgpLCAkZXhlYykpOwp9IGVsc2VpZiAoJHRoaXMtPmV2ZW50TmVlZHNUb091dHB1dCgkZXZlbnQpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzJywgJGV4ZWMpKTsKfQoKJHBvc3NpYmxlTG9jYWxCaW5hcmllcyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UGFja2FnZSgpLT5nZXRCaW5hcmllcygpOwppZiAoY291bnQoJHBvc3NpYmxlTG9jYWxCaW5hcmllcykgPiAwKSB7CmZvcmVhY2ggKCRwb3NzaWJsZUxvY2FsQmluYXJpZXMgYXMgJGxvY2FsRXhlYykgewppZiAoUHJlZzo6aXNNYXRjaCgne1xiJy5wcmVnX3F1b3RlKCRjYWxsYWJsZSkuJyR9JywgJGxvY2FsRXhlYykpIHsKJGNhbGxlciA9IEJpbmFyeUluc3RhbGxlcjo6ZGV0ZXJtaW5lQmluYXJ5Q2FsbGVyKCRsb2NhbEV4ZWMpOwokZXhlYyA9IFByZWc6OnJlcGxhY2UoJ3teJy5wcmVnX3F1b3RlKCRjYWxsYWJsZSkuJ30nLCAkY2FsbGVyIC4gJyAnIC4gJGxvY2FsRXhlYywgJGV4ZWMpOwpicmVhazsKfQp9Cn0KCmlmIChzdHJwb3MoJGV4ZWMsICdAcHV0ZW52ICcpID09PSAwKSB7CmlmIChmYWxzZSA9PT0gc3RycG9zKCRleGVjLCAnPScpKSB7ClBsYXRmb3JtOjpjbGVhckVudihzdWJzdHIoJGV4ZWMsIDgpKTsKfSBlbHNlIHsKWyR2YXIsICR2YWx1ZV0gPSBleHBsb2RlKCc9Jywgc3Vic3RyKCRleGVjLCA4KSwgMik7ClBsYXRmb3JtOjpwdXRFbnYoJHZhciwgJHZhbHVlKTsKfQoKY29udGludWU7Cn0KaWYgKHN0cnBvcygkZXhlYywgJ0BwaHAgJykgPT09IDApIHsKJHBhdGhBbmRBcmdzID0gc3Vic3RyKCRleGVjLCA1KTsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokcGF0aEFuZEFyZ3MgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3teXFMrfScsIHN0YXRpYyBmdW5jdGlvbiAoJHBhdGgpIHsKcmV0dXJuIHN0cl9yZXBsYWNlKCcvJywgJ1xcJywgJHBhdGhbMF0pOwp9LCAkcGF0aEFuZEFyZ3MpOwp9CgoKJG1hdGNoZWQgPSBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlteXCciXHMvXFxcXF0rfScsICRwYXRoQW5kQXJncywgJG1hdGNoKTsKaWYgKCRtYXRjaGVkICYmICFmaWxlX2V4aXN0cygkbWF0Y2hbMF0pKSB7CiRmaW5kZXIgPSBuZXcgRXhlY3V0YWJsZUZpbmRlcjsKaWYgKCRwYXRoVG9FeGVjID0gJGZpbmRlci0+ZmluZCgkbWF0Y2hbMF0pKSB7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJGV4ZWNXaXRob3V0RXh0ID0gUHJlZzo6cmVwbGFjZSgne1wuKGV4ZXxiYXR8Y21kfGNvbSkkfWknLCAnJywgJHBhdGhUb0V4ZWMpOwoKaWYgKGZpbGVfZXhpc3RzKCRleGVjV2l0aG91dEV4dCkpIHsKJHBhdGhUb0V4ZWMgPSAkZXhlY1dpdGhvdXRFeHQ7Cn0KdW5zZXQoJGV4ZWNXaXRob3V0RXh0KTsKfQokcGF0aEFuZEFyZ3MgPSAkcGF0aFRvRXhlYyAuIHN1YnN0cigkcGF0aEFuZEFyZ3MsIHN0cmxlbigkbWF0Y2hbMF0pKTsKfQp9CiRleGVjID0gJHRoaXMtPmdldFBocEV4ZWNDb21tYW5kKCkgLiAnICcgLiAkcGF0aEFuZEFyZ3M7Cn0gZWxzZSB7CiRmaW5kZXIgPSBuZXcgUGhwRXhlY3V0YWJsZUZpbmRlcigpOwokcGhwUGF0aCA9ICRmaW5kZXItPmZpbmQoZmFsc2UpOwppZiAoJHBocFBhdGgpIHsKUGxhdGZvcm06OnB1dEVudignUEhQX0JJTkFSWScsICRwaHBQYXRoKTsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewokZXhlYyA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygne15cUyt9Jywgc3RhdGljIGZ1bmN0aW9uICgkcGF0aCkgewpyZXR1cm4gc3RyX3JlcGxhY2UoJy8nLCAnXFwnLCAkcGF0aFswXSk7Cn0sICRleGVjKTsKfQp9CgoKCgppZiAoc3RycG9zKCRleGVjLCAnY29tcG9zZXIgJykgPT09IDApIHsKJGV4ZWMgPSAkdGhpcy0+Z2V0UGhwRXhlY0NvbW1hbmQoKSAuICcgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0JJTkFSWScpKSAuIHN1YnN0cigkZXhlYywgOCk7Cn0KCmlmICgwICE9PSAoJGV4aXRDb2RlID0gJHRoaXMtPmV4ZWN1dGVUdHkoJGV4ZWMpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPGVycm9yPlNjcmlwdCAlcyBoYW5kbGluZyB0aGUgJXMgZXZlbnQgcmV0dXJuZWQgd2l0aCBlcnJvciBjb2RlICcuJGV4aXRDb2RlLic8L2Vycm9yPicsICRjYWxsYWJsZSwgJGV2ZW50LT5nZXROYW1lKCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6UVVJRVQpOwoKdGhyb3cgbmV3IFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbignRXJyb3IgT3V0cHV0OiAnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAkZXhpdENvZGUpOwp9Cn0KCiRyZXR1cm5NYXggPSBtYXgoJHJldHVybk1heCwgJHJldHVybik7CgppZiAoJGV2ZW50LT5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpKSB7CmJyZWFrOwp9Cn0KfSBmaW5hbGx5IHsKJHRoaXMtPnBvcEV2ZW50KCk7Cgoka25vd25JZGVudGlmaWVycyA9IFtdOwpmb3JlYWNoICgkYXV0b2xvYWRlcnNCZWZvcmUgYXMgJGtleSA9PiAkY2IpIHsKJGtub3duSWRlbnRpZmllcnNbJHRoaXMtPmdldENhbGxiYWNrSWRlbnRpZmllcigkY2IpXSA9IFsna2V5JyA9PiAka2V5LCAnY2FsbGJhY2snID0+ICRjYl07Cn0KZm9yZWFjaCAoc3BsX2F1dG9sb2FkX2Z1bmN0aW9ucygpIGFzICRjYikgewoKaWYgKGlzc2V0KCRrbm93bklkZW50aWZpZXJzWyR0aGlzLT5nZXRDYWxsYmFja0lkZW50aWZpZXIoJGNiKV0pICYmICRrbm93bklkZW50aWZpZXJzWyR0aGlzLT5nZXRDYWxsYmFja0lkZW50aWZpZXIoJGNiKV1bJ2tleSddID09PSAwKSB7CmJyZWFrOwp9CgoKaWYgKCRjYiBpbnN0YW5jZW9mIENsYXNzTG9hZGVyKSB7CiRjYi0+dW5yZWdpc3RlcigpOwokY2ItPnJlZ2lzdGVyKGZhbHNlKTsKfSBlbHNlIHsKc3BsX2F1dG9sb2FkX3VucmVnaXN0ZXIoJGNiKTsKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKCRjYik7Cn0KfQp9CgpyZXR1cm4gJHJldHVybk1heDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGV4ZWN1dGVUdHkoc3RyaW5nICRleGVjKTogaW50CnsKaWYgKCR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZVR0eSgkZXhlYyk7Cn0KCnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkZXhlYyk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQaHBFeGVjQ29tbWFuZCgpOiBzdHJpbmcKewokZmluZGVyID0gbmV3IFBocEV4ZWN1dGFibGVGaW5kZXIoKTsKJHBocFBhdGggPSAkZmluZGVyLT5maW5kKGZhbHNlKTsKaWYgKCEkcGhwUGF0aCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBsb2NhdGUgUEhQIGJpbmFyeSB0byBleGVjdXRlICcuJHBocFBhdGgpOwp9CiRwaHBBcmdzID0gJGZpbmRlci0+ZmluZEFyZ3VtZW50cygpOwokcGhwQXJncyA9IFxjb3VudCgkcGhwQXJncykgPiAwID8gJyAnIC4gaW1wbG9kZSgnICcsICRwaHBBcmdzKSA6ICcnOwokYWxsb3dVcmxGT3BlbkZsYWcgPSAnIC1kIGFsbG93X3VybF9mb3Blbj0nIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoaW5pX2dldCgnYWxsb3dfdXJsX2ZvcGVuJykpOwokZGlzYWJsZUZ1bmN0aW9uc0ZsYWcgPSAnIC1kIGRpc2FibGVfZnVuY3Rpb25zPScgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKTsKJG1lbW9yeUxpbWl0RmxhZyA9ICcgLWQgbWVtb3J5X2xpbWl0PScgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShpbmlfZ2V0KCdtZW1vcnlfbGltaXQnKSk7CgpyZXR1cm4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBocFBhdGgpIC4gJHBocEFyZ3MgLiAkYWxsb3dVcmxGT3BlbkZsYWcgLiAkZGlzYWJsZUZ1bmN0aW9uc0ZsYWcgLiAkbWVtb3J5TGltaXRGbGFnOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlRXZlbnRQaHBTY3JpcHQoc3RyaW5nICRjbGFzc05hbWUsIHN0cmluZyAkbWV0aG9kTmFtZSwgRXZlbnQgJGV2ZW50KQp7CmlmICgkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCc+ICVzOiAlczo6JXMnLCAkZXZlbnQtPmdldE5hbWUoKSwgJGNsYXNzTmFtZSwgJG1ldGhvZE5hbWUpKTsKfSBlbHNlaWYgKCR0aGlzLT5ldmVudE5lZWRzVG9PdXRwdXQoJGV2ZW50KSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignPiAlczo6JXMnLCAkY2xhc3NOYW1lLCAkbWV0aG9kTmFtZSkpOwp9CgpyZXR1cm4gJGNsYXNzTmFtZTo6JG1ldGhvZE5hbWUoJGV2ZW50KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBldmVudE5lZWRzVG9PdXRwdXQoRXZlbnQgJGV2ZW50KTogYm9vbAp7CgppZiAoJGV2ZW50LT5nZXROYW1lKCkgPT09ICdfX2V4ZWNfY29tbWFuZCcpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKCgkZXZlbnQtPmdldEZsYWdzKClbJ3NjcmlwdC1hbGlhcy1pbnB1dCddID8/IG51bGwpICE9PSBudWxsKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGlzdGVuZXIoc3RyaW5nICRldmVudE5hbWUsICRsaXN0ZW5lciwgaW50ICRwcmlvcml0eSA9IDApOiB2b2lkCnsKJHRoaXMtPmxpc3RlbmVyc1skZXZlbnROYW1lXVskcHJpb3JpdHldW10gPSAkbGlzdGVuZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcigkbGlzdGVuZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHRoaXMtPmxpc3RlbmVycyBhcyAkZXZlbnROYW1lID0+ICRwcmlvcml0aWVzKSB7CmZvcmVhY2ggKCRwcmlvcml0aWVzIGFzICRwcmlvcml0eSA9PiAkbGlzdGVuZXJzKSB7CmZvcmVhY2ggKCRsaXN0ZW5lcnMgYXMgJGluZGV4ID0+ICRjYW5kaWRhdGUpIHsKaWYgKCRsaXN0ZW5lciA9PT0gJGNhbmRpZGF0ZSB8fCAoaXNfYXJyYXkoJGNhbmRpZGF0ZSkgJiYgaXNfb2JqZWN0KCRsaXN0ZW5lcikgJiYgJGNhbmRpZGF0ZVswXSA9PT0gJGxpc3RlbmVyKSkgewp1bnNldCgkdGhpcy0+bGlzdGVuZXJzWyRldmVudE5hbWVdWyRwcmlvcml0eV1bJGluZGV4XSk7Cn0KfQp9Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU3Vic2NyaWJlcihFdmVudFN1YnNjcmliZXJJbnRlcmZhY2UgJHN1YnNjcmliZXIpOiB2b2lkCnsKZm9yZWFjaCAoJHN1YnNjcmliZXItPmdldFN1YnNjcmliZWRFdmVudHMoKSBhcyAkZXZlbnROYW1lID0+ICRwYXJhbXMpIHsKaWYgKGlzX3N0cmluZygkcGFyYW1zKSkgewokdGhpcy0+YWRkTGlzdGVuZXIoJGV2ZW50TmFtZSwgWyRzdWJzY3JpYmVyLCAkcGFyYW1zXSk7Cn0gZWxzZWlmIChpc19zdHJpbmcoJHBhcmFtc1swXSkpIHsKJHRoaXMtPmFkZExpc3RlbmVyKCRldmVudE5hbWUsIFskc3Vic2NyaWJlciwgJHBhcmFtc1swXV0sICRwYXJhbXNbMV0gPz8gMCk7Cn0gZWxzZSB7CmZvcmVhY2ggKCRwYXJhbXMgYXMgJGxpc3RlbmVyKSB7CiR0aGlzLT5hZGRMaXN0ZW5lcigkZXZlbnROYW1lLCBbJHN1YnNjcmliZXIsICRsaXN0ZW5lclswXV0sICRsaXN0ZW5lclsxXSA/PyAwKTsKfQp9Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TGlzdGVuZXJzKEV2ZW50ICRldmVudCk6IGFycmF5CnsKJHNjcmlwdExpc3RlbmVycyA9ICR0aGlzLT5ydW5TY3JpcHRzID8gJHRoaXMtPmdldFNjcmlwdExpc3RlbmVycygkZXZlbnQpIDogW107CgppZiAoIWlzc2V0KCR0aGlzLT5saXN0ZW5lcnNbJGV2ZW50LT5nZXROYW1lKCldWzBdKSkgewokdGhpcy0+bGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXVswXSA9IFtdOwp9Cmtyc29ydCgkdGhpcy0+bGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXSk7CgokbGlzdGVuZXJzID0gJHRoaXMtPmxpc3RlbmVyczsKJGxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV1bMF0gPSBhcnJheV9tZXJnZSgkbGlzdGVuZXJzWyRldmVudC0+Z2V0TmFtZSgpXVswXSwgJHNjcmlwdExpc3RlbmVycyk7CgpyZXR1cm4gYXJyYXlfbWVyZ2UoLi4uJGxpc3RlbmVyc1skZXZlbnQtPmdldE5hbWUoKV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzRXZlbnRMaXN0ZW5lcnMoRXZlbnQgJGV2ZW50KTogYm9vbAp7CiRsaXN0ZW5lcnMgPSAkdGhpcy0+Z2V0TGlzdGVuZXJzKCRldmVudCk7CgpyZXR1cm4gY291bnQoJGxpc3RlbmVycykgPiAwOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0U2NyaXB0TGlzdGVuZXJzKEV2ZW50ICRldmVudCk6IGFycmF5CnsKJHBhY2thZ2UgPSAkdGhpcy0+Y29tcG9zZXItPmdldFBhY2thZ2UoKTsKJHNjcmlwdHMgPSAkcGFja2FnZS0+Z2V0U2NyaXB0cygpOwoKaWYgKGVtcHR5KCRzY3JpcHRzWyRldmVudC0+Z2V0TmFtZSgpXSkpIHsKcmV0dXJuIFtdOwp9CgppZiAoaW5fYXJyYXkoJGV2ZW50LT5nZXROYW1lKCksICR0aGlzLT5za2lwU2NyaXB0cywgdHJ1ZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdTa2lwcGVkIHNjcmlwdCBsaXN0ZW5lcnMgZm9yIDxpbmZvPicuJGV2ZW50LT5nZXROYW1lKCkuJzwvaW5mbz4gYmVjYXVzZSBvZiBDT01QT1NFUl9TS0lQX1NDUklQVFMnLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgpyZXR1cm4gW107Cn0KCnJldHVybiAkc2NyaXB0c1skZXZlbnQtPmdldE5hbWUoKV07Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc1BocFNjcmlwdChzdHJpbmcgJGNhbGxhYmxlKTogYm9vbAp7CnJldHVybiBmYWxzZSA9PT0gc3RycG9zKCRjYWxsYWJsZSwgJyAnKSAmJiBmYWxzZSAhPT0gc3RycG9zKCRjYWxsYWJsZSwgJzo6Jyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpc0NvbW1hbmRDbGFzcyhzdHJpbmcgJGNhbGxhYmxlKTogYm9vbAp7CnJldHVybiBzdHJfY29udGFpbnMoJGNhbGxhYmxlLCAnXFwnKSAmJiAhc3RyX2NvbnRhaW5zKCRjYWxsYWJsZSwgJyAnKSAmJiBzdHJfZW5kc193aXRoKCRjYWxsYWJsZSwgJ0NvbW1hbmQnKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzQ29tcG9zZXJTY3JpcHQoc3RyaW5nICRjYWxsYWJsZSk6IGJvb2wKewpyZXR1cm4gc3RyX3N0YXJ0c193aXRoKCRjYWxsYWJsZSwgJ0AnKSAmJiAhc3RyX3N0YXJ0c193aXRoKCRjYWxsYWJsZSwgJ0BwaHAgJykgJiYgIXN0cl9zdGFydHNfd2l0aCgkY2FsbGFibGUsICdAcHV0ZW52ICcpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwdXNoRXZlbnQoRXZlbnQgJGV2ZW50KTogaW50CnsKJGV2ZW50TmFtZSA9ICRldmVudC0+Z2V0TmFtZSgpOwppZiAoaW5fYXJyYXkoJGV2ZW50TmFtZSwgJHRoaXMtPmV2ZW50U3RhY2spKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCJDaXJjdWxhciBjYWxsIHRvIHNjcmlwdCBoYW5kbGVyICclcycgZGV0ZWN0ZWQiLCAkZXZlbnROYW1lKSk7Cn0KCnJldHVybiBhcnJheV9wdXNoKCR0aGlzLT5ldmVudFN0YWNrLCAkZXZlbnROYW1lKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBvcEV2ZW50KCk6ID9zdHJpbmcKewpyZXR1cm4gYXJyYXlfcG9wKCR0aGlzLT5ldmVudFN0YWNrKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBlbnN1cmVCaW5EaXJJc0luUGF0aCgpOiB2b2lkCnsKJHBhdGhFbnYgPSAnUEFUSCc7CgoKCgppZiAoIWlzc2V0KCRfU0VSVkVSWyRwYXRoRW52XSkgJiYgaXNzZXQoJF9TRVJWRVJbJ1BhdGgnXSkpIHsKJHBhdGhFbnYgPSAnUGF0aCc7Cn0KCgokYmluRGlyID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tZGlyJyk7CmlmIChpc19kaXIoJGJpbkRpcikpIHsKJGJpbkRpciA9IHJlYWxwYXRoKCRiaW5EaXIpOwokcGF0aFZhbHVlID0gKHN0cmluZykgUGxhdGZvcm06OmdldEVudigkcGF0aEVudik7CmlmICghUHJlZzo6aXNNYXRjaCgneyhefCcuUEFUSF9TRVBBUkFUT1IuJyknLnByZWdfcXVvdGUoJGJpbkRpcikuJygkfCcuUEFUSF9TRVBBUkFUT1IuJyl9JywgJHBhdGhWYWx1ZSkpIHsKUGxhdGZvcm06OnB1dEVudigkcGF0aEVudiwgJGJpbkRpci5QQVRIX1NFUEFSQVRPUi4kcGF0aFZhbHVlKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q2FsbGJhY2tJZGVudGlmaWVyKCRjYik6IHN0cmluZwp7CmlmIChpc19zdHJpbmcoJGNiKSkgewpyZXR1cm4gJ2ZuOicuJGNiOwp9CmlmIChpc19vYmplY3QoJGNiKSkgewpyZXR1cm4gJ29iajonLnNwbF9vYmplY3RfaGFzaCgkY2IpOwp9CmlmIChpc19hcnJheSgkY2IpKSB7CnJldHVybiAnYXJyYXk6Jy4oaXNfc3RyaW5nKCRjYlswXSkgPyAkY2JbMF0gOiBnZXRfY2xhc3MoJGNiWzBdKSAuJyMnLnNwbF9vYmplY3RfaGFzaCgkY2JbMF0pKS4nOjonLiRjYlsxXTsKfQoKCnJldHVybiAndW5zdXBwb3J0ZWQnOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1ha2VBdXRvbG9hZGVyKEV2ZW50ICRldmVudCwgJGNhbGxhYmxlKTogdm9pZAp7CmlmICghJHRoaXMtPmNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIpIHsKcmV0dXJuOwp9CgppZiAoaXNfYXJyYXkoJGNhbGxhYmxlKSkgewppZiAoaXNfc3RyaW5nKCRjYWxsYWJsZVswXSkpIHsKJGNhbGxhYmxlS2V5ID0gJGNhbGxhYmxlWzBdIC4gJzo6JyAuICRjYWxsYWJsZVsxXTsKfSBlbHNlIHsKJGNhbGxhYmxlS2V5ID0gZ2V0X2NsYXNzKCRjYWxsYWJsZVswXSkuJzo6Jy4kY2FsbGFibGVbMV07Cn0KfSBlbHNlaWYgKGlzX3N0cmluZygkY2FsbGFibGUpKSB7CiRjYWxsYWJsZUtleSA9ICRjYWxsYWJsZTsKfSBlbHNlaWYgKCRjYWxsYWJsZSBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRjYWxsYWJsZUtleSA9ICdjbG9zdXJlJzsKfSBlbHNlIHsKJGNhbGxhYmxlS2V5ID0gJ3Vua25vd24nOwp9CmlmIChpc3NldCgkdGhpcy0+cHJldmlvdXNMaXN0ZW5lcnNbJGNhbGxhYmxlS2V5XSkpIHsKcmV0dXJuOwp9CiR0aGlzLT5wcmV2aW91c0xpc3RlbmVyc1skY2FsbGFibGVLZXldID0gdHJ1ZTsKCiRwYWNrYWdlID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRQYWNrYWdlKCk7CiRwYWNrYWdlcyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCktPmdldENhbm9uaWNhbFBhY2thZ2VzKCk7CiRnZW5lcmF0b3IgPSAkdGhpcy0+Y29tcG9zZXItPmdldEF1dG9sb2FkR2VuZXJhdG9yKCk7CiRoYXNoID0gaW1wbG9kZSgnLCcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJHApIHsKcmV0dXJuICRwLT5nZXROYW1lKCkuJy8nLiRwLT5nZXRWZXJzaW9uKCk7Cn0sICRwYWNrYWdlcykpOwppZiAoJGV2ZW50IGluc3RhbmNlb2YgU2NyaXB0RXZlbnQgfHwgJGV2ZW50IGluc3RhbmNlb2YgUGFja2FnZUV2ZW50IHx8ICRldmVudCBpbnN0YW5jZW9mIEluc3RhbGxlckV2ZW50KSB7CiRnZW5lcmF0b3ItPnNldERldk1vZGUoJGV2ZW50LT5pc0Rldk1vZGUoKSk7CiRoYXNoIC49ICRldmVudC0+aXNEZXZNb2RlKCkgPyAnL2RldicgOiAnJzsKfQokaGFzaCA9IGhhc2goJ3NoYTI1NicsICRoYXNoKTsKCmlmICgkdGhpcy0+cHJldmlvdXNIYXNoID09PSAkaGFzaCkgewpyZXR1cm47Cn0KCiR0aGlzLT5wcmV2aW91c0hhc2ggPSAkaGFzaDsKCiRwYWNrYWdlTWFwID0gJGdlbmVyYXRvci0+YnVpbGRQYWNrYWdlTWFwKCR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLCAkcGFja2FnZSwgJHBhY2thZ2VzKTsKJG1hcCA9ICRnZW5lcmF0b3ItPnBhcnNlQXV0b2xvYWRzKCRwYWNrYWdlTWFwLCAkcGFja2FnZSk7CgppZiAoJHRoaXMtPmxvYWRlciAhPT0gbnVsbCkgewokdGhpcy0+bG9hZGVyLT51bnJlZ2lzdGVyKCk7Cn0KCiR0aGlzLT5sb2FkZXIgPSAkZ2VuZXJhdG9yLT5jcmVhdGVMb2FkZXIoJG1hcCwgJHRoaXMtPmNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCd2ZW5kb3ItZGlyJykpOwokdGhpcy0+bG9hZGVyLT5yZWdpc3RlcihmYWxzZSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKCgoKCgoKCgoKaW50ZXJmYWNlIEV2ZW50U3Vic2NyaWJlckludGVyZmFjZQp7CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZEV2ZW50cygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXI7CgoKCgoKCmNsYXNzIFNjcmlwdEV4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSXJyZWNvdmVyYWJsZURvd25sb2FkRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxFeGNlcHRpb247CgoKCgoKCmNsYXNzIE5vU3NsRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxDb25maWdcSnNvbkNvbmZpZ1NvdXJjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkd1ZXNzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxGaWxlc3lzdGVtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxGaWxlc3lzdGVtOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcTG9vcDsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luRXZlbnRzOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgUGhhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlclN0eWxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dDsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxBdXRvbG9hZFxBdXRvbG9hZEdlbmVyYXRvcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uOwp1c2UgWmlwQXJjaGl2ZTsKCgoKCgoKCgoKY2xhc3MgRmFjdG9yeQp7CgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gZ2V0SG9tZURpcigpOiBzdHJpbmcKewokaG9tZSA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0hPTUUnKTsKaWYgKCRob21lKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewppZiAoIVBsYXRmb3JtOjpnZXRFbnYoJ0FQUERBVEEnKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBBUFBEQVRBIG9yIENPTVBPU0VSX0hPTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZSBzZXQgZm9yIGNvbXBvc2VyIHRvIHJ1biBjb3JyZWN0bHknKTsKfQoKcmV0dXJuIHJ0cmltKHN0cnRyKFBsYXRmb3JtOjpnZXRFbnYoJ0FQUERBVEEnKSwgJ1xcJywgJy8nKSwgJy8nKSAuICcvQ29tcG9zZXInOwp9CgokdXNlckRpciA9IHNlbGY6OmdldFVzZXJEaXIoKTsKJGRpcnMgPSBbXTsKCmlmIChzZWxmOjp1c2VYZGcoKSkgewoKJHhkZ0NvbmZpZyA9IFBsYXRmb3JtOjpnZXRFbnYoJ1hER19DT05GSUdfSE9NRScpOwppZiAoISR4ZGdDb25maWcpIHsKJHhkZ0NvbmZpZyA9ICR1c2VyRGlyIC4gJy8uY29uZmlnJzsKfQoKJGRpcnNbXSA9ICR4ZGdDb25maWcgLiAnL2NvbXBvc2VyJzsKfQoKJGRpcnNbXSA9ICR1c2VyRGlyIC4gJy8uY29tcG9zZXInOwoKCmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKFNpbGVuY2VyOjpjYWxsKCdpc19kaXInLCAkZGlyKSkgewpyZXR1cm4gJGRpcjsKfQp9CgoKcmV0dXJuICRkaXJzWzBdOwp9Cgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldENhY2hlRGlyKHN0cmluZyAkaG9tZSk6IHN0cmluZwp7CiRjYWNoZURpciA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0NBQ0hFX0RJUicpOwppZiAoJGNhY2hlRGlyKSB7CnJldHVybiAkY2FjaGVEaXI7Cn0KCiRob21lRW52ID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSE9NRScpOwppZiAoJGhvbWVFbnYpIHsKcmV0dXJuICRob21lRW52IC4gJy9jYWNoZSc7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKaWYgKCRjYWNoZURpciA9IFBsYXRmb3JtOjpnZXRFbnYoJ0xPQ0FMQVBQREFUQScpKSB7CiRjYWNoZURpciAuPSAnL0NvbXBvc2VyJzsKfSBlbHNlIHsKJGNhY2hlRGlyID0gJGhvbWUgLiAnL2NhY2hlJzsKfQoKcmV0dXJuIHJ0cmltKHN0cnRyKCRjYWNoZURpciwgJ1xcJywgJy8nKSwgJy8nKTsKfQoKJHVzZXJEaXIgPSBzZWxmOjpnZXRVc2VyRGlyKCk7CmlmIChQSFBfT1MgPT09ICdEYXJ3aW4nKSB7CgppZiAoaXNfZGlyKCRob21lIC4gJy9jYWNoZScpICYmICFpc19kaXIoJHVzZXJEaXIgLiAnL0xpYnJhcnkvQ2FjaGVzL2NvbXBvc2VyJykpIHsKU2lsZW5jZXI6OmNhbGwoJ3JlbmFtZScsICRob21lIC4gJy9jYWNoZScsICR1c2VyRGlyIC4gJy9MaWJyYXJ5L0NhY2hlcy9jb21wb3NlcicpOwp9CgpyZXR1cm4gJHVzZXJEaXIgLiAnL0xpYnJhcnkvQ2FjaGVzL2NvbXBvc2VyJzsKfQoKaWYgKCRob21lID09PSAkdXNlckRpciAuICcvLmNvbXBvc2VyJyAmJiBpc19kaXIoJGhvbWUgLiAnL2NhY2hlJykpIHsKcmV0dXJuICRob21lIC4gJy9jYWNoZSc7Cn0KCmlmIChzZWxmOjp1c2VYZGcoKSkgewokeGRnQ2FjaGUgPSBQbGF0Zm9ybTo6Z2V0RW52KCdYREdfQ0FDSEVfSE9NRScpID86ICR1c2VyRGlyIC4gJy8uY2FjaGUnOwoKcmV0dXJuICR4ZGdDYWNoZSAuICcvY29tcG9zZXInOwp9CgpyZXR1cm4gJGhvbWUgLiAnL2NhY2hlJzsKfQoKcHJvdGVjdGVkIHN0YXRpYyBmdW5jdGlvbiBnZXREYXRhRGlyKHN0cmluZyAkaG9tZSk6IHN0cmluZwp7CiRob21lRW52ID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSE9NRScpOwppZiAoJGhvbWVFbnYpIHsKcmV0dXJuICRob21lRW52Owp9CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBzdHJ0cigkaG9tZSwgJ1xcJywgJy8nKTsKfQoKJHVzZXJEaXIgPSBzZWxmOjpnZXRVc2VyRGlyKCk7CmlmICgkaG9tZSAhPT0gJHVzZXJEaXIgLiAnLy5jb21wb3NlcicgJiYgc2VsZjo6dXNlWGRnKCkpIHsKJHhkZ0RhdGEgPSBQbGF0Zm9ybTo6Z2V0RW52KCdYREdfREFUQV9IT01FJykgPzogJHVzZXJEaXIgLiAnLy5sb2NhbC9zaGFyZSc7CgpyZXR1cm4gJHhkZ0RhdGEgLiAnL2NvbXBvc2VyJzsKfQoKcmV0dXJuICRob21lOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUNvbmZpZyg/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IENvbmZpZwp7CiRjd2QgPSAkY3dkID8/IFBsYXRmb3JtOjpnZXRDd2QodHJ1ZSk7CgokY29uZmlnID0gbmV3IENvbmZpZyh0cnVlLCAkY3dkKTsKCgokaG9tZSA9IHNlbGY6OmdldEhvbWVEaXIoKTsKJGNvbmZpZy0+bWVyZ2UoWwonY29uZmlnJyA9PiBbCidob21lJyA9PiAkaG9tZSwKJ2NhY2hlLWRpcicgPT4gc2VsZjo6Z2V0Q2FjaGVEaXIoJGhvbWUpLAonZGF0YS1kaXInID0+IHNlbGY6OmdldERhdGFEaXIoJGhvbWUpLApdLApdLCBDb25maWc6OlNPVVJDRV9ERUZBVUxUKTsKCgokZmlsZSA9IG5ldyBKc29uRmlsZSgkY29uZmlnLT5nZXQoJ2hvbWUnKS4nL2NvbmZpZy5qc29uJyk7CmlmICgkZmlsZS0+ZXhpc3RzKCkpIHsKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignTG9hZGluZyBjb25maWcgZmlsZSAnIC4gJGZpbGUtPmdldFBhdGgoKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQpzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJGlvLCAkZmlsZSk7CiRjb25maWctPm1lcmdlKCRmaWxlLT5yZWFkKCksICRmaWxlLT5nZXRQYXRoKCkpOwp9CiRjb25maWctPnNldENvbmZpZ1NvdXJjZShuZXcgSnNvbkNvbmZpZ1NvdXJjZSgkZmlsZSkpOwoKJGh0YWNjZXNzUHJvdGVjdCA9ICRjb25maWctPmdldCgnaHRhY2Nlc3MtcHJvdGVjdCcpOwppZiAoJGh0YWNjZXNzUHJvdGVjdCkgewoKCgokZGlycyA9IFskY29uZmlnLT5nZXQoJ2hvbWUnKSwgJGNvbmZpZy0+Z2V0KCdjYWNoZS1kaXInKSwgJGNvbmZpZy0+Z2V0KCdkYXRhLWRpcicpXTsKZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewppZiAoIWZpbGVfZXhpc3RzKCRkaXIgLiAnLy5odGFjY2VzcycpKSB7CmlmICghaXNfZGlyKCRkaXIpKSB7ClNpbGVuY2VyOjpjYWxsKCdta2RpcicsICRkaXIsIDA3NzcsIHRydWUpOwp9ClNpbGVuY2VyOjpjYWxsKCdmaWxlX3B1dF9jb250ZW50cycsICRkaXIgLiAnLy5odGFjY2VzcycsICdEZW55IGZyb20gYWxsJyk7Cn0KfQp9CgoKJGZpbGUgPSBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCdob21lJykuJy9hdXRoLmpzb24nKTsKaWYgKCRmaWxlLT5leGlzdHMoKSkgewppZiAoJGlvIGluc3RhbmNlb2YgSU9JbnRlcmZhY2UpIHsKJGlvLT53cml0ZUVycm9yKCdMb2FkaW5nIGNvbmZpZyBmaWxlICcgLiAkZmlsZS0+Z2V0UGF0aCgpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CnNlbGY6OnZhbGlkYXRlSnNvblNjaGVtYSgkaW8sICRmaWxlLCBKc29uRmlsZTo6QVVUSF9TQ0hFTUEpOwokY29uZmlnLT5tZXJnZShbJ2NvbmZpZycgPT4gJGZpbGUtPnJlYWQoKV0sICRmaWxlLT5nZXRQYXRoKCkpOwp9CiRjb25maWctPnNldEF1dGhDb25maWdTb3VyY2UobmV3IEpzb25Db25maWdTb3VyY2UoJGZpbGUsIHRydWUpKTsKCnNlbGY6OmxvYWRDb21wb3NlckF1dGhFbnYoJGNvbmZpZywgJGlvKTsKCnJldHVybiAkY29uZmlnOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbXBvc2VyRmlsZSgpOiBzdHJpbmcKewokZW52ID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVInKTsKaWYgKGlzX3N0cmluZygkZW52KSkgewokZW52ID0gdHJpbSgkZW52KTsKaWYgKCcnICE9PSAkZW52KSB7CmlmIChpc19kaXIoJGVudikpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgQ09NUE9TRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvICcuJGVudi4nIHdoaWNoIGlzIGEgZGlyZWN0b3J5LCB0aGlzIHZhcmlhYmxlIHNob3VsZCBwb2ludCB0byBhIGNvbXBvc2VyLmpzb24gb3IgYmUgbGVmdCB1bnNldC4nKTsKfQoKcmV0dXJuICRlbnY7Cn0KfQoKcmV0dXJuICcuL2NvbXBvc2VyLmpzb24nOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldExvY2tGaWxlKHN0cmluZyAkY29tcG9zZXJGaWxlKTogc3RyaW5nCnsKcmV0dXJuICJqc29uIiA9PT0gcGF0aGluZm8oJGNvbXBvc2VyRmlsZSwgUEFUSElORk9fRVhURU5TSU9OKQo/IHN1YnN0cigkY29tcG9zZXJGaWxlLCAwLCAtNCkuJ2xvY2snCjogJGNvbXBvc2VyRmlsZSAuICcubG9jayc7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlQWRkaXRpb25hbFN0eWxlcygpOiBhcnJheQp7CnJldHVybiBbCidoaWdobGlnaHQnID0+IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgncmVkJyksCid3YXJuaW5nJyA9PiBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoJ2JsYWNrJywgJ3llbGxvdycpLApdOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZU91dHB1dCgpOiBDb25zb2xlT3V0cHV0CnsKJHN0eWxlcyA9IHNlbGY6OmNyZWF0ZUFkZGl0aW9uYWxTdHlsZXMoKTsKJGZvcm1hdHRlciA9IG5ldyBPdXRwdXRGb3JtYXR0ZXIoZmFsc2UsICRzdHlsZXMpOwoKcmV0dXJuIG5ldyBDb25zb2xlT3V0cHV0KENvbnNvbGVPdXRwdXQ6OlZFUkJPU0lUWV9OT1JNQUwsIG51bGwsICRmb3JtYXR0ZXIpOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVDb21wb3NlcihJT0ludGVyZmFjZSAkaW8sICRsb2NhbENvbmZpZyA9IG51bGwsICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlLCA/c3RyaW5nICRjd2QgPSBudWxsLCBib29sICRmdWxsTG9hZCA9IHRydWUsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UpCnsKCmlmIChpc19zdHJpbmcoJGxvY2FsQ29uZmlnKSAmJiBpc19maWxlKCRsb2NhbENvbmZpZykgJiYgbnVsbCA9PT0gJGN3ZCkgewokY3dkID0gZGlybmFtZSgkbG9jYWxDb25maWcpOwp9CgokY3dkID0gJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpOwoKCmlmIChudWxsID09PSAkbG9jYWxDb25maWcpIHsKJGxvY2FsQ29uZmlnID0gc3RhdGljOjpnZXRDb21wb3NlckZpbGUoKTsKfQoKJGxvY2FsQ29uZmlnU291cmNlID0gQ29uZmlnOjpTT1VSQ0VfVU5LTk9XTjsKaWYgKGlzX3N0cmluZygkbG9jYWxDb25maWcpKSB7CiRjb21wb3NlckZpbGUgPSAkbG9jYWxDb25maWc7CgokZmlsZSA9IG5ldyBKc29uRmlsZSgkbG9jYWxDb25maWcsIG51bGwsICRpbyk7CgppZiAoISRmaWxlLT5leGlzdHMoKSkgewppZiAoJGxvY2FsQ29uZmlnID09PSAnLi9jb21wb3Nlci5qc29uJyB8fCAkbG9jYWxDb25maWcgPT09ICdjb21wb3Nlci5qc29uJykgewokbWVzc2FnZSA9ICdDb21wb3NlciBjb3VsZCBub3QgZmluZCBhIGNvbXBvc2VyLmpzb24gZmlsZSBpbiAnLiRjd2Q7Cn0gZWxzZSB7CiRtZXNzYWdlID0gJ0NvbXBvc2VyIGNvdWxkIG5vdCBmaW5kIHRoZSBjb25maWcgZmlsZTogJy4kbG9jYWxDb25maWc7Cn0KJGluc3RydWN0aW9ucyA9ICRmdWxsTG9hZCA/ICdUbyBpbml0aWFsaXplIGEgcHJvamVjdCwgcGxlYXNlIGNyZWF0ZSBhIGNvbXBvc2VyLmpzb24gZmlsZS4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2Jhc2ljLXVzYWdlJyA6ICcnOwp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbWVzc2FnZS5QSFBfRU9MLiRpbnN0cnVjdGlvbnMpOwp9CgppZiAoIVBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewp0cnkgewokZmlsZS0+dmFsaWRhdGVTY2hlbWEoSnNvbkZpbGU6OkxBWF9TQ0hFTUEpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokZXJyb3JzID0gJyAtICcgLiBpbXBsb2RlKFBIUF9FT0wgLiAnIC0gJywgJGUtPmdldEVycm9ycygpKTsKJG1lc3NhZ2UgPSAkZS0+Z2V0TWVzc2FnZSgpIC4gJzonIC4gUEhQX0VPTCAuICRlcnJvcnM7CnRocm93IG5ldyBKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKJGxvY2FsQ29uZmlnID0gJGZpbGUtPnJlYWQoKTsKJGxvY2FsQ29uZmlnU291cmNlID0gJGZpbGUtPmdldFBhdGgoKTsKfQoKCiRjb25maWcgPSBzdGF0aWM6OmNyZWF0ZUNvbmZpZygkaW8sICRjd2QpOwokaXNHbG9iYWwgPSAkbG9jYWxDb25maWdTb3VyY2UgIT09IENvbmZpZzo6U09VUkNFX1VOS05PV04gJiYgcmVhbHBhdGgoJGNvbmZpZy0+Z2V0KCdob21lJykpID09PSByZWFscGF0aChkaXJuYW1lKCRsb2NhbENvbmZpZ1NvdXJjZSkpOwokY29uZmlnLT5tZXJnZSgkbG9jYWxDb25maWcsICRsb2NhbENvbmZpZ1NvdXJjZSk7CgppZiAoaXNzZXQoJGNvbXBvc2VyRmlsZSkpIHsKJGlvLT53cml0ZUVycm9yKCdMb2FkaW5nIGNvbmZpZyBmaWxlICcgLiAkY29tcG9zZXJGaWxlIC4nICgnLnJlYWxwYXRoKCRjb21wb3NlckZpbGUpLicpJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJGNvbmZpZy0+c2V0Q29uZmlnU291cmNlKG5ldyBKc29uQ29uZmlnU291cmNlKG5ldyBKc29uRmlsZShyZWFscGF0aCgkY29tcG9zZXJGaWxlKSwgbnVsbCwgJGlvKSkpOwoKJGxvY2FsQXV0aEZpbGUgPSBuZXcgSnNvbkZpbGUoZGlybmFtZShyZWFscGF0aCgkY29tcG9zZXJGaWxlKSkgLiAnL2F1dGguanNvbicsIG51bGwsICRpbyk7CmlmICgkbG9jYWxBdXRoRmlsZS0+ZXhpc3RzKCkpIHsKJGlvLT53cml0ZUVycm9yKCdMb2FkaW5nIGNvbmZpZyBmaWxlICcgLiAkbG9jYWxBdXRoRmlsZS0+Z2V0UGF0aCgpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwpzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJGlvLCAkbG9jYWxBdXRoRmlsZSwgSnNvbkZpbGU6OkFVVEhfU0NIRU1BKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+ICRsb2NhbEF1dGhGaWxlLT5yZWFkKCldLCAkbG9jYWxBdXRoRmlsZS0+Z2V0UGF0aCgpKTsKJGNvbmZpZy0+c2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKG5ldyBKc29uQ29uZmlnU291cmNlKCRsb2NhbEF1dGhGaWxlLCB0cnVlKSk7Cn0KfQoKCnNlbGY6OmxvYWRDb21wb3NlckF1dGhFbnYoJGNvbmZpZywgJGlvKTsKCiR2ZW5kb3JEaXIgPSAkY29uZmlnLT5nZXQoJ3ZlbmRvci1kaXInKTsKCgokY29tcG9zZXIgPSAkZnVsbExvYWQgPyBuZXcgQ29tcG9zZXIoKSA6IG5ldyBQYXJ0aWFsQ29tcG9zZXIoKTsKJGNvbXBvc2VyLT5zZXRDb25maWcoJGNvbmZpZyk7CmlmICgkaXNHbG9iYWwpIHsKJGNvbXBvc2VyLT5zZXRHbG9iYWwoKTsKfQoKaWYgKCRmdWxsTG9hZCkgewoKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKCgoKaWYgKGZhbHNlID09PSAkZGlzYWJsZVBsdWdpbnMgJiYgZmFsc2UgPT09ICRkaXNhYmxlU2NyaXB0cyAmJiAhY2xhc3NfZXhpc3RzKCdDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9ucycsIGZhbHNlKSAmJiBmaWxlX2V4aXN0cygkaW5zdGFsbGVkVmVyc2lvbnNQYXRoID0gJGNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJykuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJykpIHsKCgppZiAoY2xhc3NfZXhpc3RzKCdDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9ucycpKSB7CkZpbGVzeXN0ZW1SZXBvc2l0b3J5OjpzYWZlbHlMb2FkSW5zdGFsbGVkVmVyc2lvbnMoJGluc3RhbGxlZFZlcnNpb25zUGF0aCk7Cn0KfQp9CgokaHR0cERvd25sb2FkZXIgPSBzZWxmOjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpOwokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJGxvb3AgPSBuZXcgTG9vcCgkaHR0cERvd25sb2FkZXIsICRwcm9jZXNzKTsKJGNvbXBvc2VyLT5zZXRMb29wKCRsb29wKTsKCgokZGlzcGF0Y2hlciA9IG5ldyBFdmVudERpc3BhdGNoZXIoJGNvbXBvc2VyLCAkaW8sICRwcm9jZXNzKTsKJGRpc3BhdGNoZXItPnNldFJ1blNjcmlwdHMoISRkaXNhYmxlU2NyaXB0cyk7CiRjb21wb3Nlci0+c2V0RXZlbnREaXNwYXRjaGVyKCRkaXNwYXRjaGVyKTsKCgokcm0gPSBSZXBvc2l0b3J5RmFjdG9yeTo6bWFuYWdlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGRpc3BhdGNoZXIsICRwcm9jZXNzKTsKJGNvbXBvc2VyLT5zZXRSZXBvc2l0b3J5TWFuYWdlcigkcm0pOwoKCgppZiAoISRmdWxsTG9hZCAmJiAhaXNzZXQoJGxvY2FsQ29uZmlnWyd2ZXJzaW9uJ10pKSB7CiRsb2NhbENvbmZpZ1sndmVyc2lvbiddID0gJzEuMC4wJzsKfQoKCiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKJGd1ZXNzZXIgPSBuZXcgVmVyc2lvbkd1ZXNzZXIoJGNvbmZpZywgJHByb2Nlc3MsICRwYXJzZXIsICRpbyk7CiRsb2FkZXIgPSAkdGhpcy0+bG9hZFJvb3RQYWNrYWdlKCRybSwgJGNvbmZpZywgJHBhcnNlciwgJGd1ZXNzZXIsICRpbyk7CiRwYWNrYWdlID0gJGxvYWRlci0+bG9hZCgkbG9jYWxDb25maWcsICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJywgJGN3ZCk7CiRjb21wb3Nlci0+c2V0UGFja2FnZSgkcGFja2FnZSk7CgoKJHRoaXMtPmFkZExvY2FsUmVwb3NpdG9yeSgkaW8sICRybSwgJHZlbmRvckRpciwgJHBhY2thZ2UsICRwcm9jZXNzKTsKCgokaW0gPSAkdGhpcy0+Y3JlYXRlSW5zdGFsbGF0aW9uTWFuYWdlcigkbG9vcCwgJGlvLCAkZGlzcGF0Y2hlcik7CiRjb21wb3Nlci0+c2V0SW5zdGFsbGF0aW9uTWFuYWdlcigkaW0pOwoKaWYgKCRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CgokZG0gPSAkdGhpcy0+Y3JlYXRlRG93bmxvYWRNYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkcHJvY2VzcywgJGRpc3BhdGNoZXIpOwokY29tcG9zZXItPnNldERvd25sb2FkTWFuYWdlcigkZG0pOwoKCiRnZW5lcmF0b3IgPSBuZXcgQXV0b2xvYWRHZW5lcmF0b3IoJGRpc3BhdGNoZXIsICRpbyk7CiRjb21wb3Nlci0+c2V0QXV0b2xvYWRHZW5lcmF0b3IoJGdlbmVyYXRvcik7CgoKJGFtID0gJHRoaXMtPmNyZWF0ZUFyY2hpdmVNYW5hZ2VyKCRjb25maWcsICRkbSwgJGxvb3ApOwokY29tcG9zZXItPnNldEFyY2hpdmVNYW5hZ2VyKCRhbSk7Cn0KCgokdGhpcy0+Y3JlYXRlRGVmYXVsdEluc3RhbGxlcnMoJGltLCAkY29tcG9zZXIsICRpbywgJHByb2Nlc3MpOwoKCmlmICgkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciAmJiBpc3NldCgkY29tcG9zZXJGaWxlKSkgewokbG9ja0ZpbGUgPSBzZWxmOjpnZXRMb2NrRmlsZSgkY29tcG9zZXJGaWxlKTsKaWYgKCEkY29uZmlnLT5nZXQoJ2xvY2snKSAmJiBmaWxlX2V4aXN0cygkbG9ja0ZpbGUpKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kbG9ja0ZpbGUuJyBpcyBwcmVzZW50IGJ1dCBpZ25vcmVkIGFzIHRoZSAibG9jayIgY29uZmlnIG9wdGlvbiBpcyBkaXNhYmxlZC48L3dhcm5pbmc+Jyk7Cn0KCiRsb2NrZXIgPSBuZXcgUGFja2FnZVxMb2NrZXIoJGlvLCBuZXcgSnNvbkZpbGUoJGNvbmZpZy0+Z2V0KCdsb2NrJykgPyAkbG9ja0ZpbGUgOiBQbGF0Zm9ybTo6Z2V0RGV2TnVsbCgpLCBudWxsLCAkaW8pLCAkaW0sIGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wb3NlckZpbGUpLCAkcHJvY2Vzcyk7CiRjb21wb3Nlci0+c2V0TG9ja2VyKCRsb2NrZXIpOwp9IGVsc2VpZiAoJGNvbXBvc2VyIGluc3RhbmNlb2YgQ29tcG9zZXIpIHsKJGxvY2tlciA9IG5ldyBQYWNrYWdlXExvY2tlcigkaW8sIG5ldyBKc29uRmlsZShQbGF0Zm9ybTo6Z2V0RGV2TnVsbCgpLCBudWxsLCAkaW8pLCAkaW0sIEpzb25GaWxlOjplbmNvZGUoJGxvY2FsQ29uZmlnKSwgJHByb2Nlc3MpOwokY29tcG9zZXItPnNldExvY2tlcigkbG9ja2VyKTsKfQoKaWYgKCRjb21wb3NlciBpbnN0YW5jZW9mIENvbXBvc2VyKSB7CiRnbG9iYWxDb21wb3NlciA9IG51bGw7CmlmICghJGNvbXBvc2VyLT5pc0dsb2JhbCgpKSB7CiRnbG9iYWxDb21wb3NlciA9ICR0aGlzLT5jcmVhdGVHbG9iYWxDb21wb3NlcigkaW8sICRjb25maWcsICRkaXNhYmxlUGx1Z2lucywgJGRpc2FibGVTY3JpcHRzKTsKfQoKJHBtID0gJHRoaXMtPmNyZWF0ZVBsdWdpbk1hbmFnZXIoJGlvLCAkY29tcG9zZXIsICRnbG9iYWxDb21wb3NlciwgJGRpc2FibGVQbHVnaW5zKTsKJGNvbXBvc2VyLT5zZXRQbHVnaW5NYW5hZ2VyKCRwbSk7CgppZiAoJGNvbXBvc2VyLT5pc0dsb2JhbCgpKSB7CiRwbS0+c2V0UnVubmluZ0luR2xvYmFsRGlyKHRydWUpOwp9CgokcG0tPmxvYWRJbnN0YWxsZWRQbHVnaW5zKCk7Cn0KCmlmICgkZnVsbExvYWQpIHsKJGluaXRFdmVudCA9IG5ldyBFdmVudChQbHVnaW5FdmVudHM6OklOSVQpOwokY29tcG9zZXItPmdldEV2ZW50RGlzcGF0Y2hlcigpLT5kaXNwYXRjaCgkaW5pdEV2ZW50LT5nZXROYW1lKCksICRpbml0RXZlbnQpOwoKCgokdGhpcy0+cHVyZ2VQYWNrYWdlcygkcm0tPmdldExvY2FsUmVwb3NpdG9yeSgpLCAkaW0pOwp9CgpyZXR1cm4gJGNvbXBvc2VyOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVHbG9iYWwoSU9JbnRlcmZhY2UgJGlvLCBib29sICRkaXNhYmxlUGx1Z2lucyA9IGZhbHNlLCBib29sICRkaXNhYmxlU2NyaXB0cyA9IGZhbHNlKTogP0NvbXBvc2VyCnsKJGZhY3RvcnkgPSBuZXcgc3RhdGljKCk7CgpyZXR1cm4gJGZhY3RvcnktPmNyZWF0ZUdsb2JhbENvbXBvc2VyKCRpbywgc3RhdGljOjpjcmVhdGVDb25maWcoJGlvKSwgJGRpc2FibGVQbHVnaW5zLCAkZGlzYWJsZVNjcmlwdHMsIHRydWUpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkTG9jYWxSZXBvc2l0b3J5KElPSW50ZXJmYWNlICRpbywgUmVwb3NpdG9yeU1hbmFnZXIgJHJtLCBzdHJpbmcgJHZlbmRvckRpciwgUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCk6IHZvaWQKewokZnMgPSBudWxsOwppZiAoJHByb2Nlc3MpIHsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oJHByb2Nlc3MpOwp9Cgokcm0tPnNldExvY2FsUmVwb3NpdG9yeShuZXcgUmVwb3NpdG9yeVxJbnN0YWxsZWRGaWxlc3lzdGVtUmVwb3NpdG9yeShuZXcgSnNvbkZpbGUoJHZlbmRvckRpci4nL2NvbXBvc2VyL2luc3RhbGxlZC5qc29uJywgbnVsbCwgJGlvKSwgdHJ1ZSwgJHJvb3RQYWNrYWdlLCAkZnMpKTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlR2xvYmFsQ29tcG9zZXIoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgJGRpc2FibGVQbHVnaW5zLCBib29sICRkaXNhYmxlU2NyaXB0cywgYm9vbCAkZnVsbExvYWQgPSBmYWxzZSk6ID9QYXJ0aWFsQ29tcG9zZXIKewoKJGRpc2FibGVQbHVnaW5zID0gJGRpc2FibGVQbHVnaW5zID09PSAnZ2xvYmFsJyB8fCAkZGlzYWJsZVBsdWdpbnMgPT09IHRydWU7CgokY29tcG9zZXIgPSBudWxsOwp0cnkgewokY29tcG9zZXIgPSAkdGhpcy0+Y3JlYXRlQ29tcG9zZXIoJGlvLCAkY29uZmlnLT5nZXQoJ2hvbWUnKSAuICcvY29tcG9zZXIuanNvbicsICRkaXNhYmxlUGx1Z2lucywgJGNvbmZpZy0+Z2V0KCdob21lJyksICRmdWxsTG9hZCwgJGRpc2FibGVTY3JpcHRzKTsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokaW8tPndyaXRlRXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIGdsb2JhbCBjb21wb3NlcjogJy4kZS0+Z2V0TWVzc2FnZSgpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CgpyZXR1cm4gJGNvbXBvc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlRG93bmxvYWRNYW5hZ2VyKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsKTogRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXIKewokY2FjaGUgPSBudWxsOwppZiAoJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy10dGwnKSA+IDApIHsKJGNhY2hlID0gbmV3IENhY2hlKCRpbywgJGNvbmZpZy0+Z2V0KCdjYWNoZS1maWxlcy1kaXInKSwgJ2EtejAtOV8uLycpOwokY2FjaGUtPnNldFJlYWRPbmx5KCRjb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwp9CgokZnMgPSBuZXcgRmlsZXN5c3RlbSgkcHJvY2Vzcyk7CgokZG0gPSBuZXcgRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXIoJGlvLCBmYWxzZSwgJGZzKTsKc3dpdGNoICgkcHJlZmVycmVkID0gJGNvbmZpZy0+Z2V0KCdwcmVmZXJyZWQtaW5zdGFsbCcpKSB7CmNhc2UgJ2Rpc3QnOgokZG0tPnNldFByZWZlckRpc3QodHJ1ZSk7CmJyZWFrOwpjYXNlICdzb3VyY2UnOgokZG0tPnNldFByZWZlclNvdXJjZSh0cnVlKTsKYnJlYWs7CmNhc2UgJ2F1dG8nOgpkZWZhdWx0OgoKYnJlYWs7Cn0KCmlmIChpc19hcnJheSgkcHJlZmVycmVkKSkgewokZG0tPnNldFByZWZlcmVuY2VzKCRwcmVmZXJyZWQpOwp9CgokZG0tPnNldERvd25sb2FkZXIoJ2dpdCcsIG5ldyBEb3dubG9hZGVyXEdpdERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgJGZzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignc3ZuJywgbmV3IERvd25sb2FkZXJcU3ZuRG93bmxvYWRlcigkaW8sICRjb25maWcsICRwcm9jZXNzLCAkZnMpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdmb3NzaWwnLCBuZXcgRG93bmxvYWRlclxGb3NzaWxEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ2hnJywgbmV3IERvd25sb2FkZXJcSGdEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3BlcmZvcmNlJywgbmV3IERvd25sb2FkZXJcUGVyZm9yY2VEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJHByb2Nlc3MsICRmcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3ppcCcsIG5ldyBEb3dubG9hZGVyXFppcERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3JhcicsIG5ldyBEb3dubG9hZGVyXFJhckRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3RhcicsIG5ldyBEb3dubG9hZGVyXFRhckRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ2d6aXAnLCBuZXcgRG93bmxvYWRlclxHemlwRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcigneHonLCBuZXcgRG93bmxvYWRlclxYekRvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwokZG0tPnNldERvd25sb2FkZXIoJ3BoYXInLCBuZXcgRG93bmxvYWRlclxQaGFyRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlciwgJGV2ZW50RGlzcGF0Y2hlciwgJGNhY2hlLCAkZnMsICRwcm9jZXNzKSk7CiRkbS0+c2V0RG93bmxvYWRlcignZmlsZScsIG5ldyBEb3dubG9hZGVyXEZpbGVEb3dubG9hZGVyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkY2FjaGUsICRmcywgJHByb2Nlc3MpKTsKJGRtLT5zZXREb3dubG9hZGVyKCdwYXRoJywgbmV3IERvd25sb2FkZXJcUGF0aERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkaHR0cERvd25sb2FkZXIsICRldmVudERpc3BhdGNoZXIsICRjYWNoZSwgJGZzLCAkcHJvY2VzcykpOwoKcmV0dXJuICRkbTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlQXJjaGl2ZU1hbmFnZXIoQ29uZmlnICRjb25maWcsIERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyICRkbSwgTG9vcCAkbG9vcCkKewokYW0gPSBuZXcgQXJjaGl2ZXJcQXJjaGl2ZU1hbmFnZXIoJGRtLCAkbG9vcCk7CmlmIChjbGFzc19leGlzdHMoWmlwQXJjaGl2ZTo6Y2xhc3MpKSB7CiRhbS0+YWRkQXJjaGl2ZXIobmV3IEFyY2hpdmVyXFppcEFyY2hpdmVyKTsKfQppZiAoY2xhc3NfZXhpc3RzKFBoYXI6OmNsYXNzKSkgewokYW0tPmFkZEFyY2hpdmVyKG5ldyBBcmNoaXZlclxQaGFyQXJjaGl2ZXIpOwp9CgpyZXR1cm4gJGFtOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY3JlYXRlUGx1Z2luTWFuYWdlcihJT0ludGVyZmFjZSAkaW8sIENvbXBvc2VyICRjb21wb3NlciwgP1BhcnRpYWxDb21wb3NlciAkZ2xvYmFsQ29tcG9zZXIgPSBudWxsLCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSk6IFBsdWdpblxQbHVnaW5NYW5hZ2VyCnsKcmV0dXJuIG5ldyBQbHVnaW5cUGx1Z2luTWFuYWdlcigkaW8sICRjb21wb3NlciwgJGdsb2JhbENvbXBvc2VyLCAkZGlzYWJsZVBsdWdpbnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW5zdGFsbGF0aW9uTWFuYWdlcihMb29wICRsb29wLCBJT0ludGVyZmFjZSAkaW8sID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwpOiBJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlcgp7CnJldHVybiBuZXcgSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXIoJGxvb3AsICRpbywgJGV2ZW50RGlzcGF0Y2hlcik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0SW5zdGFsbGVycyhJbnN0YWxsZXJcSW5zdGFsbGF0aW9uTWFuYWdlciAkaW0sIFBhcnRpYWxDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpOiB2b2lkCnsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oJHByb2Nlc3MpOwokYmluYXJ5SW5zdGFsbGVyID0gbmV3IEluc3RhbGxlclxCaW5hcnlJbnN0YWxsZXIoJGlvLCBydHJpbSgkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1kaXInKSwgJy8nKSwgJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdiaW4tY29tcGF0JyksICRmcywgcnRyaW0oJGNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCd2ZW5kb3ItZGlyJyksICcvJykpOwoKJGltLT5hZGRJbnN0YWxsZXIobmV3IEluc3RhbGxlclxMaWJyYXJ5SW5zdGFsbGVyKCRpbywgJGNvbXBvc2VyLCBudWxsLCAkZnMsICRiaW5hcnlJbnN0YWxsZXIpKTsKJGltLT5hZGRJbnN0YWxsZXIobmV3IEluc3RhbGxlclxQbHVnaW5JbnN0YWxsZXIoJGlvLCAkY29tcG9zZXIsICRmcywgJGJpbmFyeUluc3RhbGxlcikpOwokaW0tPmFkZEluc3RhbGxlcihuZXcgSW5zdGFsbGVyXE1ldGFwYWNrYWdlSW5zdGFsbGVyKCRpbykpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHB1cmdlUGFja2FnZXMoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXIgJGltKTogdm9pZAp7CmZvcmVhY2ggKCRyZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICghJGltLT5pc1BhY2thZ2VJbnN0YWxsZWQoJHJlcG8sICRwYWNrYWdlKSkgewokcmVwby0+cmVtb3ZlUGFja2FnZSgkcGFja2FnZSk7Cn0KfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gbG9hZFJvb3RQYWNrYWdlKFJlcG9zaXRvcnlNYW5hZ2VyICRybSwgQ29uZmlnICRjb25maWcsIFZlcnNpb25QYXJzZXIgJHBhcnNlciwgVmVyc2lvbkd1ZXNzZXIgJGd1ZXNzZXIsIElPSW50ZXJmYWNlICRpbyk6IFBhY2thZ2VcTG9hZGVyXFJvb3RQYWNrYWdlTG9hZGVyCnsKcmV0dXJuIG5ldyBQYWNrYWdlXExvYWRlclxSb290UGFja2FnZUxvYWRlcigkcm0sICRjb25maWcsICRwYXJzZXIsICRndWVzc2VyLCAkaW8pOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoSU9JbnRlcmZhY2UgJGlvLCAkY29uZmlnID0gbnVsbCwgJGRpc2FibGVQbHVnaW5zID0gZmFsc2UsIGJvb2wgJGRpc2FibGVTY3JpcHRzID0gZmFsc2UpOiBDb21wb3Nlcgp7CiRmYWN0b3J5ID0gbmV3IHN0YXRpYygpOwoKCgoKCmlmICgkY29uZmlnICE9PSBudWxsICYmICRjb25maWcgIT09IHNlbGY6OmdldENvbXBvc2VyRmlsZSgpICYmICRkaXNhYmxlUGx1Z2lucyA9PT0gZmFsc2UpIHsKJGRpc2FibGVQbHVnaW5zID0gJ2xvY2FsJzsKfQoKcmV0dXJuICRmYWN0b3J5LT5jcmVhdGVDb21wb3NlcigkaW8sICRjb25maWcsICRkaXNhYmxlUGx1Z2lucywgbnVsbCwgdHJ1ZSwgJGRpc2FibGVTY3JpcHRzKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlSHR0cERvd25sb2FkZXIoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJG9wdGlvbnMgPSBbXSk6IEh0dHBEb3dubG9hZGVyCnsKc3RhdGljICR3YXJuZWQgPSBmYWxzZTsKJGRpc2FibGVUbHMgPSBmYWxzZTsKCmlmIChpc3NldCgkX1NFUlZFUlsnYXJndiddKSAmJiBpbl9hcnJheSgnZGlzYWJsZS10bHMnLCAkX1NFUlZFUlsnYXJndiddKSAmJiAoaW5fYXJyYXkoJ2NvbmYnLCAkX1NFUlZFUlsnYXJndiddKSB8fCBpbl9hcnJheSgnY29uZmlnJywgJF9TRVJWRVJbJ2FyZ3YnXSkpKSB7CiR3YXJuZWQgPSB0cnVlOwokZGlzYWJsZVRscyA9ICFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJyk7Cn0gZWxzZWlmICgkY29uZmlnLT5nZXQoJ2Rpc2FibGUtdGxzJykgPT09IHRydWUpIHsKaWYgKCEkd2FybmVkKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+WW91IGFyZSBydW5uaW5nIENvbXBvc2VyIHdpdGggU1NML1RMUyBwcm90ZWN0aW9uIGRpc2FibGVkLjwvd2FybmluZz4nKTsKfQokd2FybmVkID0gdHJ1ZTsKJGRpc2FibGVUbHMgPSB0cnVlOwp9IGVsc2VpZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgRXhjZXB0aW9uXE5vU3NsRXhjZXB0aW9uKCdUaGUgb3BlbnNzbCBleHRlbnNpb24gaXMgcmVxdWlyZWQgZm9yIFNTTC9UTFMgcHJvdGVjdGlvbiBidXQgaXMgbm90IGF2YWlsYWJsZS4gJwouICdJZiB5b3UgY2FuIG5vdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uLCB5b3UgY2FuIGRpc2FibGUgdGhpcyBlcnJvciwgYXQgeW91ciBvd24gcmlzaywgYnkgc2V0dGluZyB0aGUgXCdkaXNhYmxlLXRsc1wnIG9wdGlvbiB0byB0cnVlLicpOwp9CiRodHRwRG93bmxvYWRlck9wdGlvbnMgPSBbXTsKaWYgKCRkaXNhYmxlVGxzID09PSBmYWxzZSkgewppZiAoJycgIT09ICRjb25maWctPmdldCgnY2FmaWxlJykpIHsKJGh0dHBEb3dubG9hZGVyT3B0aW9uc1snc3NsJ11bJ2NhZmlsZSddID0gJGNvbmZpZy0+Z2V0KCdjYWZpbGUnKTsKfQppZiAoJycgIT09ICRjb25maWctPmdldCgnY2FwYXRoJykpIHsKJGh0dHBEb3dubG9hZGVyT3B0aW9uc1snc3NsJ11bJ2NhcGF0aCddID0gJGNvbmZpZy0+Z2V0KCdjYXBhdGgnKTsKfQokaHR0cERvd25sb2FkZXJPcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJGh0dHBEb3dubG9hZGVyT3B0aW9ucywgJG9wdGlvbnMpOwp9CnRyeSB7CiRodHRwRG93bmxvYWRlciA9IG5ldyBIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcsICRodHRwRG93bmxvYWRlck9wdGlvbnMsICRkaXNhYmxlVGxzKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmIChmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdjYWZpbGUnKSkgewokaW8tPndyaXRlKCc8ZXJyb3I+VW5hYmxlIHRvIGxvY2F0ZSBhIHZhbGlkIENBIGNlcnRpZmljYXRlIGZpbGUuIFlvdSBtdXN0IHNldCBhIHZhbGlkIFwnY2FmaWxlXCcgb3B0aW9uLjwvZXJyb3I+Jyk7CiRpby0+d3JpdGUoJzxlcnJvcj5BIHZhbGlkIENBIGNlcnRpZmljYXRlIGZpbGUgaXMgcmVxdWlyZWQgZm9yIFNTTC9UTFMgcHJvdGVjdGlvbi48L2Vycm9yPicpOwokaW8tPndyaXRlKCc8ZXJyb3I+WW91IGNhbiBkaXNhYmxlIHRoaXMgZXJyb3IsIGF0IHlvdXIgb3duIHJpc2ssIGJ5IHNldHRpbmcgdGhlIFwnZGlzYWJsZS10bHNcJyBvcHRpb24gdG8gdHJ1ZS48L2Vycm9yPicpOwp9CnRocm93ICRlOwp9CgpyZXR1cm4gJGh0dHBEb3dubG9hZGVyOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBsb2FkQ29tcG9zZXJBdXRoRW52KENvbmZpZyAkY29uZmlnLCA/SU9JbnRlcmZhY2UgJGlvKTogdm9pZAp7CiRjb21wb3NlckF1dGhFbnYgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9BVVRIJyk7CmlmIChmYWxzZSA9PT0gJGNvbXBvc2VyQXV0aEVudiB8fCAnJyA9PT0gJGNvbXBvc2VyQXV0aEVudikgewpyZXR1cm47Cn0KCiRhdXRoRGF0YSA9IGpzb25fZGVjb2RlKCRjb21wb3NlckF1dGhFbnYpOwppZiAobnVsbCA9PT0gJGF1dGhEYXRhKSB7CnRocm93IG5ldyBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0NPTVBPU0VSX0FVVEggZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgbWFsZm9ybWVkLCBzaG91bGQgYmUgYSB2YWxpZCBKU09OIG9iamVjdCcpOwp9CgppZiAoJGlvIGluc3RhbmNlb2YgSU9JbnRlcmZhY2UpIHsKJGlvLT53cml0ZUVycm9yKCdMb2FkaW5nIGF1dGggY29uZmlnIGZyb20gQ09NUE9TRVJfQVVUSCcsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0Kc2VsZjo6dmFsaWRhdGVKc29uU2NoZW1hKCRpbywgJGF1dGhEYXRhLCBKc29uRmlsZTo6QVVUSF9TQ0hFTUEsICdDT01QT1NFUl9BVVRIJyk7CiRhdXRoRGF0YSA9IGpzb25fZGVjb2RlKCRjb21wb3NlckF1dGhFbnYsIHRydWUpOwppZiAobnVsbCAhPT0gJGF1dGhEYXRhKSB7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiAkYXV0aERhdGFdLCAnQ09NUE9TRVJfQVVUSCcpOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHVzZVhkZygpOiBib29sCnsKZm9yZWFjaCAoYXJyYXlfa2V5cygkX1NFUlZFUikgYXMgJGtleSkgewppZiAoc3RycG9zKChzdHJpbmcpICRrZXksICdYREdfJykgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKaWYgKFNpbGVuY2VyOjpjYWxsKCdpc19kaXInLCAnL2V0Yy94ZGcnKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRVc2VyRGlyKCk6IHN0cmluZwp7CiRob21lID0gUGxhdGZvcm06OmdldEVudignSE9NRScpOwppZiAoISRob21lKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIEhPTUUgb3IgQ09NUE9TRVJfSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBtdXN0IGJlIHNldCBmb3IgY29tcG9zZXIgdG8gcnVuIGNvcnJlY3RseScpOwp9CgpyZXR1cm4gcnRyaW0oc3RydHIoJGhvbWUsICdcXCcsICcvJyksICcvJyk7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUpzb25TY2hlbWEoP0lPSW50ZXJmYWNlICRpbywgJGZpbGVPckRhdGEsIGludCAkc2NoZW1hID0gSnNvbkZpbGU6OkxBWF9TQ0hFTUEsID9zdHJpbmcgJHNvdXJjZSA9IG51bGwpOiB2b2lkCnsKaWYgKFBsYXRmb3JtOjppc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKSkgewpyZXR1cm47Cn0KCnRyeSB7CmlmICgkZmlsZU9yRGF0YSBpbnN0YW5jZW9mIEpzb25GaWxlKSB7CiRmaWxlT3JEYXRhLT52YWxpZGF0ZVNjaGVtYSgkc2NoZW1hKTsKfSBlbHNlIHsKaWYgKG51bGwgPT09ICRzb3VyY2UpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRzb3VyY2UgaXMgcmVxdWlyZWQgdG8gYmUgcHJvdmlkZWQgaWYgJGZpbGVPckRhdGEgaXMgYXJiaXRyYXJ5IGRhdGEnKTsKfQpKc29uRmlsZTo6dmFsaWRhdGVKc29uU2NoZW1hKCRzb3VyY2UsICRmaWxlT3JEYXRhLCAkc2NoZW1hKTsKfQp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewokbXNnID0gJGUtPmdldE1lc3NhZ2UoKS4nLCB0aGlzIG1heSByZXN1bHQgaW4gZXJyb3JzIGFuZCBzaG91bGQgYmUgcmVzb2x2ZWQ6Jy5QSFBfRU9MLicgLSAnLmltcGxvZGUoUEhQX0VPTC4nIC0gJywgJGUtPmdldEVycm9ycygpKTsKaWYgKCRpbyBpbnN0YW5jZW9mIElPSW50ZXJmYWNlKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kbXNnLic8Lz4nKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigkbXNnKTsKfQp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CgpmaW5hbCBjbGFzcyBJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGltcGxlbWVudHMgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnB1YmxpYyBmdW5jdGlvbiBpc0lnbm9yZWQoc3RyaW5nICRyZXEpOiBib29sCnsKcmV0dXJuIFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJHJlcSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aXNJZ25vcmVkKCRyZXEpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsOwp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKCmZpbmFsIGNsYXNzIElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGltcGxlbWVudHMgUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CgoKCnByaXZhdGUgJGlnbm9yZVJlZ2V4OwoKCgoKcHJpdmF0ZSAkaWdub3JlVXBwZXJCb3VuZFJlZ2V4OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXFMaXN0KQp7CiRpZ25vcmVBbGwgPSAkaWdub3JlVXBwZXJCb3VuZCA9IFtdOwpmb3JlYWNoICgkcmVxTGlzdCBhcyAkcmVxKSB7CmlmIChzdWJzdHIoJHJlcSwgLTEpID09PSAnKycpIHsKJGlnbm9yZVVwcGVyQm91bmRbXSA9IHN1YnN0cigkcmVxLCAwLCAtMSk7Cn0gZWxzZSB7CiRpZ25vcmVBbGxbXSA9ICRyZXE7Cn0KfQokdGhpcy0+aWdub3JlUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJGlnbm9yZUFsbCk7CiR0aGlzLT5pZ25vcmVVcHBlckJvdW5kUmVnZXggPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJGlnbm9yZVVwcGVyQm91bmQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiBQcmVnOjppc01hdGNoKCR0aGlzLT5pZ25vcmVSZWdleCwgJHJlcSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CmlmICghUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVxKSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiAkdGhpcy0+aXNJZ25vcmVkKCRyZXEpIHx8IFByZWc6OmlzTWF0Y2goJHRoaXMtPmlnbm9yZVVwcGVyQm91bmRSZWdleCwgJHJlcSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWx0ZXJDb25zdHJhaW50KHN0cmluZyAkcmVxLCBDb25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50LCBib29sICRhbGxvd1VwcGVyQm91bmRPdmVycmlkZSA9IHRydWUpOiBDb25zdHJhaW50SW50ZXJmYWNlCnsKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXEpKSB7CnJldHVybiAkY29uc3RyYWludDsKfQoKaWYgKCEkYWxsb3dVcHBlckJvdW5kT3ZlcnJpZGUgfHwgIVByZWc6OmlzTWF0Y2goJHRoaXMtPmlnbm9yZVVwcGVyQm91bmRSZWdleCwgJHJlcSkpIHsKcmV0dXJuICRjb25zdHJhaW50Owp9CgppZiAoUHJlZzo6aXNNYXRjaCgkdGhpcy0+aWdub3JlUmVnZXgsICRyZXEpKSB7CnJldHVybiBuZXcgTWF0Y2hBbGxDb25zdHJhaW50Owp9CgokaW50ZXJ2YWxzID0gSW50ZXJ2YWxzOjpnZXQoJGNvbnN0cmFpbnQpOwokbGFzdCA9IGVuZCgkaW50ZXJ2YWxzWydudW1lcmljJ10pOwppZiAoJGxhc3QgIT09IGZhbHNlICYmIChzdHJpbmcpICRsYXN0LT5nZXRFbmQoKSAhPT0gKHN0cmluZykgSW50ZXJ2YWw6OnVudGlsUG9zaXRpdmVJbmZpbml0eSgpKSB7CiRjb25zdHJhaW50ID0gbmV3IE11bHRpQ29uc3RyYWludChbJGNvbnN0cmFpbnQsIG5ldyBDb25zdHJhaW50KCc+PScsICRsYXN0LT5nZXRFbmQoKS0+Z2V0VmVyc2lvbigpKV0sIGZhbHNlKTsKfQoKcmV0dXJuICRjb25zdHJhaW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKZmluYWwgY2xhc3MgSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW1wbGVtZW50cyBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1VwcGVyQm91bmRJZ25vcmVkKHN0cmluZyAkcmVxKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCmZpbmFsIGNsYXNzIFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5CnsKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tQm9vbE9yTGlzdCgkYm9vbE9yTGlzdCk6IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UKewppZiAoaXNfYm9vbCgkYm9vbE9yTGlzdCkpIHsKcmV0dXJuICRib29sT3JMaXN0ID8gc2VsZjo6aWdub3JlQWxsKCkgOiBzZWxmOjppZ25vcmVOb3RoaW5nKCk7Cn0KCmlmIChpc19hcnJheSgkYm9vbE9yTGlzdCkpIHsKcmV0dXJuIG5ldyBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigkYm9vbE9yTGlzdCk7Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKApzcHJpbnRmKAonUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjogVW5rbm93biAkYm9vbE9yTGlzdCBwYXJhbWV0ZXIgJXMuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuJywKZ2V0X2RlYnVnX3R5cGUoJGJvb2xPckxpc3QpCikKKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpZ25vcmVBbGwoKTogUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnJldHVybiBuZXcgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcigpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlnbm9yZU5vdGhpbmcoKTogUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckludGVyZmFjZQp7CnJldHVybiBuZXcgSWdub3JlTm90aGluZ1BsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCmludGVyZmFjZSBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIGlzSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2w7CgpwdWJsaWMgZnVuY3Rpb24gaXNVcHBlckJvdW5kSWdub3JlZChzdHJpbmcgJHJlcSk6IGJvb2w7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXElPOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxTaWxlbmNlcjsKdXNlIFBzclxMb2dcTG9nTGV2ZWw7CgphYnN0cmFjdCBjbGFzcyBCYXNlSU8gaW1wbGVtZW50cyBJT0ludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGF1dGhlbnRpY2F0aW9ucyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhlbnRpY2F0aW9ucygpCnsKcmV0dXJuICR0aGlzLT5hdXRoZW50aWNhdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldEF1dGhlbnRpY2F0aW9ucygpCnsKJHRoaXMtPmF1dGhlbnRpY2F0aW9ucyA9IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+YXV0aGVudGljYXRpb25zWyRyZXBvc2l0b3J5TmFtZV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lKQp7CmlmIChpc3NldCgkdGhpcy0+YXV0aGVudGljYXRpb25zWyRyZXBvc2l0b3J5TmFtZV0pKSB7CnJldHVybiAkdGhpcy0+YXV0aGVudGljYXRpb25zWyRyZXBvc2l0b3J5TmFtZV07Cn0KCnJldHVybiBbJ3VzZXJuYW1lJyA9PiBudWxsLCAncGFzc3dvcmQnID0+IG51bGxdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aGVudGljYXRpb24oJHJlcG9zaXRvcnlOYW1lLCAkdXNlcm5hbWUsICRwYXNzd29yZCA9IG51bGwpCnsKJHRoaXMtPmF1dGhlbnRpY2F0aW9uc1skcmVwb3NpdG9yeU5hbWVdID0gWyd1c2VybmFtZScgPT4gJHVzZXJuYW1lLCAncGFzc3dvcmQnID0+ICRwYXNzd29yZF07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZVJhdygkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+d3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT53cml0ZUVycm9yKCRtZXNzYWdlcywgJG5ld2xpbmUsICR2ZXJib3NpdHkpOwp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbihzdHJpbmcgJHJlcG9zaXRvcnlOYW1lLCBzdHJpbmcgJHVzZXJuYW1lLCA/c3RyaW5nICRwYXNzd29yZCA9IG51bGwpCnsKaWYgKCR0aGlzLT5oYXNBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUpKSB7CiRhdXRoID0gJHRoaXMtPmdldEF1dGhlbnRpY2F0aW9uKCRyZXBvc2l0b3J5TmFtZSk7CmlmICgkYXV0aFsndXNlcm5hbWUnXSA9PT0gJHVzZXJuYW1lICYmICRhdXRoWydwYXNzd29yZCddID09PSAkcGFzc3dvcmQpIHsKcmV0dXJuOwp9CgokdGhpcy0+d3JpdGVFcnJvcigKc3ByaW50ZigKIjx3YXJuaW5nPldhcm5pbmc6IFlvdSBzaG91bGQgYXZvaWQgb3ZlcndyaXRpbmcgYWxyZWFkeSBkZWZpbmVkIGF1dGggc2V0dGluZ3MgZm9yICVzLjwvd2FybmluZz4iLAokcmVwb3NpdG9yeU5hbWUKKQopOwp9CiR0aGlzLT5zZXRBdXRoZW50aWNhdGlvbigkcmVwb3NpdG9yeU5hbWUsICR1c2VybmFtZSwgJHBhc3N3b3JkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRDb25maWd1cmF0aW9uKENvbmZpZyAkY29uZmlnKQp7CiRiaXRidWNrZXRPYXV0aCA9ICRjb25maWctPmdldCgnYml0YnVja2V0LW9hdXRoJyk7CiRnaXRodWJPYXV0aCA9ICRjb25maWctPmdldCgnZ2l0aHViLW9hdXRoJyk7CiRnaXRsYWJPYXV0aCA9ICRjb25maWctPmdldCgnZ2l0bGFiLW9hdXRoJyk7CiRnaXRsYWJUb2tlbiA9ICRjb25maWctPmdldCgnZ2l0bGFiLXRva2VuJyk7CiRmb3JnZWpvVG9rZW4gPSAkY29uZmlnLT5nZXQoJ2Zvcmdlam8tdG9rZW4nKTsKJGh0dHBCYXNpYyA9ICRjb25maWctPmdldCgnaHR0cC1iYXNpYycpOwokYmVhcmVyVG9rZW4gPSAkY29uZmlnLT5nZXQoJ2JlYXJlcicpOwokY3VzdG9tSGVhZGVycyA9ICRjb25maWctPmdldCgnY3VzdG9tLWhlYWRlcnMnKTsKJGNsaWVudENlcnRpZmljYXRlID0gJGNvbmZpZy0+Z2V0KCdjbGllbnQtY2VydGlmaWNhdGUnKTsKCgoKZm9yZWFjaCAoJGJpdGJ1Y2tldE9hdXRoIGFzICRkb21haW4gPT4gJGNyZWQpIHsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJGNyZWRbJ2NvbnN1bWVyLWtleSddLCAkY3JlZFsnY29uc3VtZXItc2VjcmV0J10pOwp9Cgpmb3JlYWNoICgkZ2l0aHViT2F1dGggYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKaWYgKCRkb21haW4gIT09ICdnaXRodWIuY29tJyAmJiAhaW5fYXJyYXkoJGRvbWFpbiwgJGNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpLCB0cnVlKSkgewokdGhpcy0+ZGVidWcoJGRvbWFpbi4nIGlzIG5vdCBpbiB0aGUgY29uZmlndXJlZCBnaXRodWItZG9tYWlucywgYWRkaW5nIGl0IGltcGxpY2l0bHkgYXMgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCBmb3IgdGhpcyBkb21haW4nKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnZ2l0aHViLWRvbWFpbnMnID0+IGFycmF5X21lcmdlKCRjb25maWctPmdldCgnZ2l0aHViLWRvbWFpbnMnKSwgWyRkb21haW5dKV1dLCAnaW1wbGljaXQtZHVlLXRvLWF1dGgnKTsKfQoKCgppZiAoIVByZWc6OmlzTWF0Y2goJ3teWy5BLVphLXowLTlfXSskfScsICR0b2tlbikpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1lvdXIgZ2l0aHViIG9hdXRoIHRva2VuIGZvciAnLiRkb21haW4uJyBjb250YWlucyBpbnZhbGlkIGNoYXJhY3RlcnM6ICInLiR0b2tlbi4nIicpOwp9CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ3gtb2F1dGgtYmFzaWMnKTsKfQoKZm9yZWFjaCAoJGdpdGxhYk9hdXRoIGFzICRkb21haW4gPT4gJHRva2VuKSB7CmlmICgkZG9tYWluICE9PSAnZ2l0bGFiLmNvbScgJiYgIWluX2FycmF5KCRkb21haW4sICRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKJHRoaXMtPmRlYnVnKCRkb21haW4uJyBpcyBub3QgaW4gdGhlIGNvbmZpZ3VyZWQgZ2l0bGFiLWRvbWFpbnMsIGFkZGluZyBpdCBpbXBsaWNpdGx5IGFzIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgZG9tYWluJyk7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiBbJ2dpdGxhYi1kb21haW5zJyA9PiBhcnJheV9tZXJnZSgkY29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIFskZG9tYWluXSldXSwgJ2ltcGxpY2l0LWR1ZS10by1hdXRoJyk7Cn0KCiR0b2tlbiA9IGlzX2FycmF5KCR0b2tlbikgPyAkdG9rZW5bInRva2VuIl0gOiAkdG9rZW47CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICR0b2tlbiwgJ29hdXRoMicpOwp9Cgpmb3JlYWNoICgkZ2l0bGFiVG9rZW4gYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKaWYgKCRkb21haW4gIT09ICdnaXRsYWIuY29tJyAmJiAhaW5fYXJyYXkoJGRvbWFpbiwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdGhpcy0+ZGVidWcoJGRvbWFpbi4nIGlzIG5vdCBpbiB0aGUgY29uZmlndXJlZCBnaXRsYWItZG9tYWlucywgYWRkaW5nIGl0IGltcGxpY2l0bHkgYXMgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZCBmb3IgdGhpcyBkb21haW4nKTsKJGNvbmZpZy0+bWVyZ2UoWydjb25maWcnID0+IFsnZ2l0bGFiLWRvbWFpbnMnID0+IGFycmF5X21lcmdlKCRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgWyRkb21haW5dKV1dLCAnaW1wbGljaXQtZHVlLXRvLWF1dGgnKTsKfQoKJHVzZXJuYW1lID0gaXNfYXJyYXkoJHRva2VuKSA/ICR0b2tlblsidXNlcm5hbWUiXSA6ICR0b2tlbjsKJHBhc3N3b3JkID0gaXNfYXJyYXkoJHRva2VuKSA/ICR0b2tlblsidG9rZW4iXSA6ICdwcml2YXRlLXRva2VuJzsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQpOwp9Cgpmb3JlYWNoICgkZm9yZ2Vqb1Rva2VuIGFzICRkb21haW4gPT4gJGNyZWQpIHsKaWYgKCFpbl9hcnJheSgkZG9tYWluLCAkY29uZmlnLT5nZXQoJ2Zvcmdlam8tZG9tYWlucycpLCB0cnVlKSkgewokdGhpcy0+ZGVidWcoJGRvbWFpbi4nIGlzIG5vdCBpbiB0aGUgY29uZmlndXJlZCBmb3JnZWpvLWRvbWFpbnMsIGFkZGluZyBpdCBpbXBsaWNpdGx5IGFzIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgZm9yIHRoaXMgZG9tYWluJyk7CiRjb25maWctPm1lcmdlKFsnY29uZmlnJyA9PiBbJ2Zvcmdlam8tZG9tYWlucycgPT4gYXJyYXlfbWVyZ2UoJGNvbmZpZy0+Z2V0KCdmb3JnZWpvLWRvbWFpbnMnKSwgWyRkb21haW5dKV1dLCAnaW1wbGljaXQtZHVlLXRvLWF1dGgnKTsKfQoKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJGNyZWRbJ3VzZXJuYW1lJ10sICRjcmVkWyd0b2tlbiddKTsKfQoKCmZvcmVhY2ggKCRodHRwQmFzaWMgYXMgJGRvbWFpbiA9PiAkY3JlZCkgewokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAkY3JlZFsndXNlcm5hbWUnXSwgJGNyZWRbJ3Bhc3N3b3JkJ10pOwp9Cgpmb3JlYWNoICgkYmVhcmVyVG9rZW4gYXMgJGRvbWFpbiA9PiAkdG9rZW4pIHsKJHRoaXMtPmNoZWNrQW5kU2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJHRva2VuLCAnYmVhcmVyJyk7Cn0KCgpmb3JlYWNoICgkY3VzdG9tSGVhZGVycyBhcyAkZG9tYWluID0+ICRoZWFkZXJzKSB7CmlmICgkaGVhZGVycyAhPT0gbnVsbCkgewokdGhpcy0+Y2hlY2tBbmRTZXRBdXRoZW50aWNhdGlvbigkZG9tYWluLCAoc3RyaW5nKSBqc29uX2VuY29kZSgkaGVhZGVycyksICdjdXN0b20taGVhZGVycycpOwp9Cn0KCgpmb3JlYWNoICgkY2xpZW50Q2VydGlmaWNhdGUgYXMgJGRvbWFpbiA9PiAkY3JlZCkgewokc3NsT3B0aW9ucyA9IGFycmF5X2ZpbHRlcigKWwonbG9jYWxfY2VydCcgPT4gJGNyZWRbJ2xvY2FsX2NlcnQnXSA/PyBudWxsLAonbG9jYWxfcGsnID0+ICRjcmVkWydsb2NhbF9wayddID8/IG51bGwsCidwYXNzcGhyYXNlJyA9PiAkY3JlZFsncGFzc3BocmFzZSddID8/IG51bGwsCl0sCnN0YXRpYyBmdW5jdGlvbiAoP3N0cmluZyAkdmFsdWUpOiBib29sIHsgcmV0dXJuICR2YWx1ZSAhPT0gbnVsbDsgfQopOwppZiAoIWlzc2V0KCRzc2xPcHRpb25zWydsb2NhbF9jZXJ0J10pKSB7CiR0aGlzLT53cml0ZUVycm9yKApzcHJpbnRmKAonPHdhcm5pbmc+V2FybmluZzogQ2xpZW50IGNlcnRpZmljYXRlIGNvbmZpZ3VyYXRpb24gaXMgbWlzc2luZyBrZXkgYGxvY2FsX2NlcnRgIGZvciAlcy48L3dhcm5pbmc+JywKJGRvbWFpbgopCik7CmNvbnRpbnVlOwp9CiR0aGlzLT5jaGVja0FuZFNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICdjbGllbnQtY2VydGlmaWNhdGUnLCAoc3RyaW5nKSBqc29uX2VuY29kZSgkc3NsT3B0aW9ucykpOwp9CgoKUHJvY2Vzc0V4ZWN1dG9yOjpzZXRUaW1lb3V0KCRjb25maWctPmdldCgncHJvY2Vzcy10aW1lb3V0JykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVNRVJHRU5DWSwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFsZXJ0KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkFMRVJULCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JpdGljYWwoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Q1JJVElDQUwsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFUlJPUiwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pOiB2b2lkCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6V0FSTklORywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vdGljZSgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpOT1RJQ0UsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IFtdKTogdm9pZAp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OklORk8sICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokdGhpcy0+bG9nKExvZ0xldmVsOjpERUJVRywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBbXSk6IHZvaWQKewokbWVzc2FnZSA9IChzdHJpbmcpICRtZXNzYWdlOwoKaWYgKCRjb250ZXh0ICE9PSBbXSkgewokanNvbiA9IFNpbGVuY2VyOjpjYWxsKCdqc29uX2VuY29kZScsICRjb250ZXh0LCBKU09OX0lOVkFMSURfVVRGOF9JR05PUkUgfCBKU09OX1VORVNDQVBFRF9TTEFTSEVTIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSk7CmlmICgkanNvbiAhPT0gZmFsc2UpIHsKJG1lc3NhZ2UgLj0gJyAnIC4gJGpzb247Cn0KfQoKaWYgKGluX2FycmF5KCRsZXZlbCwgW0xvZ0xldmVsOjpFTUVSR0VOQ1ksIExvZ0xldmVsOjpBTEVSVCwgTG9nTGV2ZWw6OkNSSVRJQ0FMLCBMb2dMZXZlbDo6RVJST1JdKSkgewokdGhpcy0+d3JpdGVFcnJvcignPGVycm9yPicuJG1lc3NhZ2UuJzwvZXJyb3I+Jyk7Cn0gZWxzZWlmICgkbGV2ZWwgPT09IExvZ0xldmVsOjpXQVJOSU5HKSB7CiR0aGlzLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRtZXNzYWdlLic8L3dhcm5pbmc+Jyk7Cn0gZWxzZWlmICgkbGV2ZWwgPT09IExvZ0xldmVsOjpOT1RJQ0UpIHsKJHRoaXMtPndyaXRlRXJyb3IoJzxpbmZvPicuJG1lc3NhZ2UuJzwvaW5mbz4nLCB0cnVlLCBzZWxmOjpWRVJCT1NFKTsKfSBlbHNlaWYgKCRsZXZlbCA9PT0gTG9nTGV2ZWw6OklORk8pIHsKJHRoaXMtPndyaXRlRXJyb3IoJzxpbmZvPicuJG1lc3NhZ2UuJzwvaW5mbz4nLCB0cnVlLCBzZWxmOjpWRVJZX1ZFUkJPU0UpOwp9IGVsc2UgewokdGhpcy0+d3JpdGVFcnJvcigkbWVzc2FnZSwgdHJ1ZSwgc2VsZjo6REVCVUcpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcUXVlc3Rpb25IZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxTdHJlYW1PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XFN0cmVhbWFibGVJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcU3RyaW5nSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CgoKCgpjbGFzcyBCdWZmZXJJTyBleHRlbmRzIENvbnNvbGVJTwp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGlucHV0ID0gJycsIGludCAkdmVyYm9zaXR5ID0gU3RyZWFtT3V0cHV0OjpWRVJCT1NJVFlfTk9STUFMLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CiRpbnB1dCA9IG5ldyBTdHJpbmdJbnB1dCgkaW5wdXQpOwokaW5wdXQtPnNldEludGVyYWN0aXZlKGZhbHNlKTsKCiRzdHJlYW0gPSBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3J3Jyk7CmlmICgkc3RyZWFtID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBvcGVuIG1lbW9yeSBvdXRwdXQgc3RyZWFtJyk7Cn0KJG91dHB1dCA9IG5ldyBTdHJlYW1PdXRwdXQoJHN0cmVhbSwgJHZlcmJvc2l0eSwgJGZvcm1hdHRlciAhPT0gbnVsbCA/ICRmb3JtYXR0ZXItPmlzRGVjb3JhdGVkKCkgOiBmYWxzZSwgJGZvcm1hdHRlcik7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbnB1dCwgJG91dHB1dCwgbmV3IEhlbHBlclNldChbCm5ldyBRdWVzdGlvbkhlbHBlcigpLApdKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKTogc3RyaW5nCnsKYXNzZXJ0KCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBTdHJlYW1PdXRwdXQpOwpmc2VlaygkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSwgMCk7Cgokb3V0cHV0ID0gKHN0cmluZykgc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSk7Cgokb3V0cHV0ID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCJ7KD88PV58XG58XHgwOCkoLis/KShceDA4Kyl9Iiwgc3RhdGljIGZ1bmN0aW9uICgkbWF0Y2hlcyk6IHN0cmluZyB7CiRwcmUgPSBzdHJpcF90YWdzKCRtYXRjaGVzWzFdKTsKCmlmIChzdHJsZW4oJHByZSkgPT09IHN0cmxlbigkbWF0Y2hlc1syXSkpIHsKcmV0dXJuICcnOwp9CgoKcmV0dXJuIHJ0cmltKCRtYXRjaGVzWzFdKS4iXG4iOwp9LCAkb3V0cHV0KTsKCnJldHVybiAkb3V0cHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVc2VySW5wdXRzKGFycmF5ICRpbnB1dHMpOiB2b2lkCnsKaWYgKCEkdGhpcy0+aW5wdXQgaW5zdGFuY2VvZiBTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdTZXR0aW5nIHRoZSB1c2VyIGlucHV0cyByZXF1aXJlcyBhdCBsZWFzdCB0aGUgdmVyc2lvbiAzLjIgb2YgdGhlIHN5bWZvbnkvY29uc29sZSBjb21wb25lbnQuJyk7Cn0KCiR0aGlzLT5pbnB1dC0+c2V0U3RyZWFtKCR0aGlzLT5jcmVhdGVTdHJlYW0oJGlucHV0cykpOwokdGhpcy0+aW5wdXQtPnNldEludGVyYWN0aXZlKHRydWUpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlU3RyZWFtKGFycmF5ICRpbnB1dHMpCnsKJHN0cmVhbSA9IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncisnKTsKaWYgKCRzdHJlYW0gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIG9wZW4gbWVtb3J5IG91dHB1dCBzdHJlYW0nKTsKfQoKZm9yZWFjaCAoJGlucHV0cyBhcyAkaW5wdXQpIHsKZndyaXRlKCRzdHJlYW0sICRpbnB1dC5QSFBfRU9MKTsKfQoKcmV3aW5kKCRzdHJlYW0pOwoKcmV0dXJuICRzdHJlYW07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUXVlc3Rpb25cU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxQcm9ncmVzc0JhcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFRhYmxlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKCgoKCgoKCmNsYXNzIENvbnNvbGVJTyBleHRlbmRzIEJhc2VJTwp7Cgpwcm90ZWN0ZWQgJGlucHV0OwoKcHJvdGVjdGVkICRvdXRwdXQ7Cgpwcm90ZWN0ZWQgJGhlbHBlclNldDsKCnByb3RlY3RlZCAkbGFzdE1lc3NhZ2UgPSAnJzsKCnByb3RlY3RlZCAkbGFzdE1lc3NhZ2VFcnIgPSAnJzsKCgpwcml2YXRlICRzdGFydFRpbWU7Cgpwcml2YXRlICR2ZXJib3NpdHlNYXA7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIEhlbHBlclNldCAkaGVscGVyU2V0KQp7CiR0aGlzLT5pbnB1dCA9ICRpbnB1dDsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT5oZWxwZXJTZXQgPSAkaGVscGVyU2V0OwokdGhpcy0+dmVyYm9zaXR5TWFwID0gWwpzZWxmOjpRVUlFVCA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCwKc2VsZjo6Tk9STUFMID0+IE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX05PUk1BTCwKc2VsZjo6VkVSQk9TRSA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFLApzZWxmOjpWRVJZX1ZFUkJPU0UgPT4gT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFLApzZWxmOjpERUJVRyA9PiBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9ERUJVRywKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuYWJsZURlYnVnZ2luZyhmbG9hdCAkc3RhcnRUaW1lKQp7CiR0aGlzLT5zdGFydFRpbWUgPSAkc3RhcnRUaW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnRlcmFjdGl2ZSgpCnsKcmV0dXJuICR0aGlzLT5pbnB1dC0+aXNJbnRlcmFjdGl2ZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcnlWZXJib3NlKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNWZXJ5VmVyYm9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWJ1ZygpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVidWcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiRtZXNzYWdlcyA9IHNlbGY6OnNhbml0aXplKCRtZXNzYWdlcyk7CgokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCBmYWxzZSwgJHZlcmJvc2l0eSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiRtZXNzYWdlcyA9IHNlbGY6OnNhbml0aXplKCRtZXNzYWdlcyk7CgokdGhpcy0+ZG9Xcml0ZSgkbWVzc2FnZXMsICRuZXdsaW5lLCB0cnVlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKQp7CiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsIGZhbHNlLCAkdmVyYm9zaXR5LCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3JSYXcoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpCnsKJHRoaXMtPmRvV3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgdHJ1ZSwgJHZlcmJvc2l0eSwgdHJ1ZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9Xcml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUsIGJvb2wgJHN0ZGVyciwgaW50ICR2ZXJib3NpdHksIGJvb2wgJHJhdyA9IGZhbHNlKTogdm9pZAp7CiRzZlZlcmJvc2l0eSA9ICR0aGlzLT52ZXJib3NpdHlNYXBbJHZlcmJvc2l0eV07CmlmICgkc2ZWZXJib3NpdHkgPiAkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewpyZXR1cm47Cn0KCmlmICgkcmF3KSB7CiRzZlZlcmJvc2l0eSB8PSBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9SQVc7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+c3RhcnRUaW1lKSB7CiRtZW1vcnlVc2FnZSA9IG1lbW9yeV9nZXRfdXNhZ2UoKSAvIDEwMjQgLyAxMDI0OwokdGltZVNwZW50ID0gbWljcm90aW1lKHRydWUpIC0gJHRoaXMtPnN0YXJ0VGltZTsKJG1lc3NhZ2VzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJG1lc3NhZ2UpIHVzZSAoJG1lbW9yeVVzYWdlLCAkdGltZVNwZW50KTogc3RyaW5nIHsKcmV0dXJuIHNwcmludGYoJ1slLjFmTWlCLyUuMmZzXSAlcycsICRtZW1vcnlVc2FnZSwgJHRpbWVTcGVudCwgJG1lc3NhZ2UpOwp9LCAoYXJyYXkpICRtZXNzYWdlcyk7Cn0KCmlmICh0cnVlID09PSAkc3RkZXJyICYmICR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiR0aGlzLT5vdXRwdXQtPmdldEVycm9yT3V0cHV0KCktPndyaXRlKCRtZXNzYWdlcywgJG5ld2xpbmUsICRzZlZlcmJvc2l0eSk7CiR0aGlzLT5sYXN0TWVzc2FnZUVyciA9IGltcGxvZGUoJG5ld2xpbmUgPyAiXG4iIDogJycsIChhcnJheSkgJG1lc3NhZ2VzKTsKCnJldHVybjsKfQoKJHRoaXMtPm91dHB1dC0+d3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHNmVmVyYm9zaXR5KTsKJHRoaXMtPmxhc3RNZXNzYWdlID0gaW1wbG9kZSgkbmV3bGluZSA/ICJcbiIgOiAnJywgKGFycmF5KSAkbWVzc2FnZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+ZG9PdmVyd3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHNpemUsIGZhbHNlLCAkdmVyYm9zaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCkKewokdGhpcy0+ZG9PdmVyd3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHNpemUsIHRydWUsICR2ZXJib3NpdHkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvT3ZlcndyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSwgP2ludCAkc2l6ZSwgYm9vbCAkc3RkZXJyLCBpbnQgJHZlcmJvc2l0eSk6IHZvaWQKewoKJG1lc3NhZ2VzID0gaW1wbG9kZSgkbmV3bGluZSA/ICJcbiIgOiAnJywgKGFycmF5KSAkbWVzc2FnZXMpOwoKCmlmICghaXNzZXQoJHNpemUpKSB7Cgokc2l6ZSA9IHN0cmxlbihzdHJpcF90YWdzKCRzdGRlcnIgPyAkdGhpcy0+bGFzdE1lc3NhZ2VFcnIgOiAkdGhpcy0+bGFzdE1lc3NhZ2UpKTsKfQoKJHRoaXMtPmRvV3JpdGUoc3RyX3JlcGVhdCgiXHgwOCIsICRzaXplKSwgZmFsc2UsICRzdGRlcnIsICR2ZXJib3NpdHkpOwoKCiR0aGlzLT5kb1dyaXRlKCRtZXNzYWdlcywgZmFsc2UsICRzdGRlcnIsICR2ZXJib3NpdHkpOwoKCgoKJGZpbGwgPSAkc2l6ZSAtIHN0cmxlbihzdHJpcF90YWdzKCRtZXNzYWdlcykpOwppZiAoJGZpbGwgPiAwKSB7CgokdGhpcy0+ZG9Xcml0ZShzdHJfcmVwZWF0KCcgJywgJGZpbGwpLCBmYWxzZSwgJHN0ZGVyciwgJHZlcmJvc2l0eSk7CgokdGhpcy0+ZG9Xcml0ZShzdHJfcmVwZWF0KCJceDA4IiwgJGZpbGwpLCBmYWxzZSwgJHN0ZGVyciwgJHZlcmJvc2l0eSk7Cn0KCmlmICgkbmV3bGluZSkgewokdGhpcy0+ZG9Xcml0ZSgnJywgdHJ1ZSwgJHN0ZGVyciwgJHZlcmJvc2l0eSk7Cn0KCmlmICgkc3RkZXJyKSB7CiR0aGlzLT5sYXN0TWVzc2FnZUVyciA9ICRtZXNzYWdlczsKfSBlbHNlIHsKJHRoaXMtPmxhc3RNZXNzYWdlID0gJG1lc3NhZ2VzOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9ncmVzc0JhcihpbnQgJG1heCA9IDApCnsKcmV0dXJuIG5ldyBQcm9ncmVzc0JhcigkdGhpcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJG1heCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IG51bGwpCnsKCiRoZWxwZXIgPSAkdGhpcy0+aGVscGVyU2V0LT5nZXQoJ3F1ZXN0aW9uJyk7CiRxdWVzdGlvbiA9IG5ldyBRdWVzdGlvbihzZWxmOjpzYW5pdGl6ZSgkcXVlc3Rpb24pLCBpc19zdHJpbmcoJGRlZmF1bHQpID8gc2VsZjo6c2FuaXRpemUoJGRlZmF1bHQpIDogJGRlZmF1bHQpOwoKcmV0dXJuICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbiwgJGRlZmF1bHQgPSB0cnVlKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgU3RyaWN0Q29uZmlybWF0aW9uUXVlc3Rpb24oc2VsZjo6c2FuaXRpemUoJHF1ZXN0aW9uKSwgaXNfc3RyaW5nKCRkZWZhdWx0KSA/IHNlbGY6OnNhbml0aXplKCRkZWZhdWx0KSA6ICRkZWZhdWx0KTsKCnJldHVybiAkaGVscGVyLT5hc2soJHRoaXMtPmlucHV0LCAkdGhpcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZFZhbGlkYXRlKCRxdWVzdGlvbiwgJHZhbGlkYXRvciwgJGF0dGVtcHRzID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oc2VsZjo6c2FuaXRpemUoJHF1ZXN0aW9uKSwgaXNfc3RyaW5nKCRkZWZhdWx0KSA/IHNlbGY6OnNhbml0aXplKCRkZWZhdWx0KSA6ICRkZWZhdWx0KTsKJHF1ZXN0aW9uLT5zZXRWYWxpZGF0b3IoJHZhbGlkYXRvcik7CiRxdWVzdGlvbi0+c2V0TWF4QXR0ZW1wdHMoJGF0dGVtcHRzKTsKCnJldHVybiAkaGVscGVyLT5hc2soJHRoaXMtPmlucHV0LCAkdGhpcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZEhpZGVBbnN3ZXIoJHF1ZXN0aW9uKQp7CgokaGVscGVyID0gJHRoaXMtPmhlbHBlclNldC0+Z2V0KCdxdWVzdGlvbicpOwokcXVlc3Rpb24gPSBuZXcgUXVlc3Rpb24oc2VsZjo6c2FuaXRpemUoJHF1ZXN0aW9uKSk7CiRxdWVzdGlvbi0+c2V0SGlkZGVuKHRydWUpOwoKcmV0dXJuICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0LCAkYXR0ZW1wdHMgPSBmYWxzZSwgJGVycm9yTWVzc2FnZSA9ICdWYWx1ZSAiJXMiIGlzIGludmFsaWQnLCAkbXVsdGlzZWxlY3QgPSBmYWxzZSkKewoKJGhlbHBlciA9ICR0aGlzLT5oZWxwZXJTZXQtPmdldCgncXVlc3Rpb24nKTsKJHF1ZXN0aW9uID0gbmV3IENob2ljZVF1ZXN0aW9uKHNlbGY6OnNhbml0aXplKCRxdWVzdGlvbiksIHNlbGY6OnNhbml0aXplKCRjaG9pY2VzKSwgaXNfc3RyaW5nKCRkZWZhdWx0KSA/IHNlbGY6OnNhbml0aXplKCRkZWZhdWx0KSA6ICRkZWZhdWx0KTsKJHF1ZXN0aW9uLT5zZXRNYXhBdHRlbXB0cygkYXR0ZW1wdHMgPzogbnVsbCk7IAokcXVlc3Rpb24tPnNldEVycm9yTWVzc2FnZSgkZXJyb3JNZXNzYWdlKTsKJHF1ZXN0aW9uLT5zZXRNdWx0aXNlbGVjdCgkbXVsdGlzZWxlY3QpOwoKJHJlc3VsdCA9ICRoZWxwZXItPmFzaygkdGhpcy0+aW5wdXQsICR0aGlzLT5nZXRFcnJvck91dHB1dCgpLCAkcXVlc3Rpb24pOwoKJGlzQXNzb2MgPSAoYm9vbCkgXGNvdW50KGFycmF5X2ZpbHRlcihhcnJheV9rZXlzKCRjaG9pY2VzKSwgJ2lzX3N0cmluZycpKTsKaWYgKCRpc0Fzc29jKSB7CnJldHVybiAkcmVzdWx0Owp9CgppZiAoIWlzX2FycmF5KCRyZXN1bHQpKSB7CnJldHVybiAoc3RyaW5nKSBhcnJheV9zZWFyY2goJHJlc3VsdCwgJGNob2ljZXMsIHRydWUpOwp9CgokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkY2hvaWNlcyBhcyAkaW5kZXggPT4gJGNob2ljZSkgewppZiAoaW5fYXJyYXkoJGNob2ljZSwgJHJlc3VsdCwgdHJ1ZSkpIHsKJHJlc3VsdHNbXSA9IChzdHJpbmcpICRpbmRleDsKfQp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWJsZSgpOiBUYWJsZQp7CnJldHVybiBuZXcgVGFibGUoJHRoaXMtPm91dHB1dCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKTogT3V0cHV0SW50ZXJmYWNlCnsKaWYgKCR0aGlzLT5vdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgpyZXR1cm4gJHRoaXMtPm91dHB1dDsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2FuaXRpemUoJG1lc3NhZ2VzLCBib29sICRhbGxvd05ld2xpbmVzID0gdHJ1ZSkKewoKCgoKJGVzY2FwZVBhdHRlcm4gPSAnXHgxQlxbW1x4MzAtXHgzRl0qW1x4MjAtXHgyRl0qW1x4NDAtXHg3RV18XHgxQlxdLio/KD86XHgxQlxcXFx8XHgwNyl8XHgxQi4nOwokcGF0dGVybiA9ICRhbGxvd05ld2xpbmVzID8gInt7JGVzY2FwZVBhdHRlcm59fFtceDAxLVx4MDlceDBCXHgwQ1x4MEUtXHgxQV18XHIoPyFcbil9dSIgOiAie3skZXNjYXBlUGF0dGVybn18W1x4MDEtXHgxQV19dSI7CmlmIChpc19zdHJpbmcoJG1lc3NhZ2VzKSkgewokbWVzc2FnZXMgPSBzZWxmOjplbnN1cmVWYWxpZFV0ZjgoJG1lc3NhZ2VzKTsKcmV0dXJuIFByZWc6OnJlcGxhY2UoJHBhdHRlcm4sICcnLCAkbWVzc2FnZXMpOwp9Cgokc2FuaXRpemVkID0gW107CmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAka2V5ID0+ICRtZXNzYWdlKSB7CiRtZXNzYWdlID0gc2VsZjo6ZW5zdXJlVmFsaWRVdGY4KCRtZXNzYWdlKTsKJHNhbml0aXplZFska2V5XSA9IFByZWc6OnJlcGxhY2UoJHBhdHRlcm4sICcnLCAkbWVzc2FnZSk7Cn0KCnJldHVybiAkc2FuaXRpemVkOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlbnN1cmVWYWxpZFV0Zjgoc3RyaW5nICRzdHJpbmcpOiBzdHJpbmcKewoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnbWJfY2hlY2tfZW5jb2RpbmcnKSAmJiBtYl9jaGVja19lbmNvZGluZygkc3RyaW5nLCAnVVRGLTgnKSkgewpyZXR1cm4gJHN0cmluZzsKfQoKCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKcmV0dXJuIChzdHJpbmcpIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJ1VURi04JywgJ1VURi04Jyk7Cn0KCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7CiRjbGVhbmVkID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vVFJBTlNMSVQnLCAkc3RyaW5nKTsKaWYgKCRjbGVhbmVkICE9PSBmYWxzZSkgewpyZXR1cm4gJGNsZWFuZWQ7Cn0KfQoKCnJldHVybiAkc3RyaW5nOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXElPOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgSU9JbnRlcmZhY2UgZXh0ZW5kcyBMb2dnZXJJbnRlcmZhY2UKewpwdWJsaWMgY29uc3QgUVVJRVQgPSAxOwpwdWJsaWMgY29uc3QgTk9STUFMID0gMjsKcHVibGljIGNvbnN0IFZFUkJPU0UgPSA0OwpwdWJsaWMgY29uc3QgVkVSWV9WRVJCT1NFID0gODsKcHVibGljIGNvbnN0IERFQlVHID0gMTY7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgaW50ICR2ZXJib3NpdHkgPSBzZWxmOjpOT1JNQUwpOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUVycm9yUmF3KCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG92ZXJ3cml0ZUVycm9yKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKHN0cmluZyAkcXVlc3Rpb24sICRkZWZhdWx0ID0gbnVsbCk7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0NvbmZpcm1hdGlvbihzdHJpbmcgJHF1ZXN0aW9uLCBib29sICRkZWZhdWx0ID0gdHJ1ZSk7CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQW5kVmFsaWRhdGUoc3RyaW5nICRxdWVzdGlvbiwgY2FsbGFibGUgJHZhbGlkYXRvciwgP2ludCAkYXR0ZW1wdHMgPSBudWxsLCAkZGVmYXVsdCA9IG51bGwpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tBbmRIaWRlQW5zd2VyKHN0cmluZyAkcXVlc3Rpb24pOwoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlbGVjdChzdHJpbmcgJHF1ZXN0aW9uLCBhcnJheSAkY2hvaWNlcywgJGRlZmF1bHQsICRhdHRlbXB0cyA9IGZhbHNlLCBzdHJpbmcgJGVycm9yTWVzc2FnZSA9ICdWYWx1ZSAiJXMiIGlzIGludmFsaWQnLCBib29sICRtdWx0aXNlbGVjdCA9IGZhbHNlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dGhlbnRpY2F0aW9ucygpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNBdXRoZW50aWNhdGlvbihzdHJpbmcgJHJlcG9zaXRvcnlOYW1lKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb24oc3RyaW5nICRyZXBvc2l0b3J5TmFtZSk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aGVudGljYXRpb24oc3RyaW5nICRyZXBvc2l0b3J5TmFtZSwgc3RyaW5nICR1c2VybmFtZSwgP3N0cmluZyAkcGFzc3dvcmQgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRDb25maWd1cmF0aW9uKENvbmZpZyAkY29uZmlnKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSU87CgoKCgoKCmNsYXNzIE51bGxJTyBleHRlbmRzIEJhc2VJTwp7CgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ludGVyYWN0aXZlKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk6IHZvaWQKewp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVFcnJvcigkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSB0cnVlLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk6IHZvaWQKewp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IHRydWUsID9pbnQgJHNpemUgPSBudWxsLCBpbnQgJHZlcmJvc2l0eSA9IHNlbGY6Ok5PUk1BTCk6IHZvaWQKewp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gb3ZlcndyaXRlRXJyb3IoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gdHJ1ZSwgP2ludCAkc2l6ZSA9IG51bGwsIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6Tk9STUFMKTogdm9pZAp7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2soJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IG51bGwpCnsKcmV0dXJuICRkZWZhdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrQ29uZmlybWF0aW9uKCRxdWVzdGlvbiwgJGRlZmF1bHQgPSB0cnVlKTogYm9vbAp7CnJldHVybiAkZGVmYXVsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZFZhbGlkYXRlKCRxdWVzdGlvbiwgJHZhbGlkYXRvciwgJGF0dGVtcHRzID0gbnVsbCwgJGRlZmF1bHQgPSBudWxsKQp7CnJldHVybiAkZGVmYXVsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0FuZEhpZGVBbnN3ZXIoJHF1ZXN0aW9uKTogP3N0cmluZwp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VsZWN0KCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0LCAkYXR0ZW1wdHMgPSBmYWxzZSwgJGVycm9yTWVzc2FnZSA9ICdWYWx1ZSAiJXMiIGlzIGludmFsaWQnLCAkbXVsdGlzZWxlY3QgPSBmYWxzZSkKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXI7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcQXVkaXRDb25maWc7CnVzZSBDb21wb3NlclxBdXRvbG9hZFxBdXRvbG9hZEdlbmVyYXRvcjsKdXNlIENvbXBvc2VyXENvbnNvbGVcR2l0aHViQWN0aW9uRXJyb3I7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcRGVmYXVsdFBvbGljeTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxMb2NhbFJlcG9UcmFuc2FjdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxMb2NrVHJhbnNhY3Rpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvb2xPcHRpbWl6ZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbDsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFNvbHZlcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxTb2x2ZXJQcm9ibGVtc0V4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb2xpY3lJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXERvd25sb2FkTWFuYWdlcjsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXElnbm9yZUxpc3RQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGVyRXZlbnRzOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcQ29tcG9zaXRlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvY2tlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxMb2NrQXJyYXlSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2NyaXB0XFNjcmlwdEV2ZW50czsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxBZHZpc29yeVxBdWRpdG9yOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCgoKCgoKCmNsYXNzIEluc3RhbGxlcgp7CnB1YmxpYyBjb25zdCBFUlJPUl9OT05FID0gMDsgCnB1YmxpYyBjb25zdCBFUlJPUl9HRU5FUklDX0ZBSUxVUkUgPSAxOwpwdWJsaWMgY29uc3QgRVJST1JfTk9fTE9DS19GSUxFX0ZPUl9QQVJUSUFMX1VQREFURSA9IDM7CnB1YmxpYyBjb25zdCBFUlJPUl9MT0NLX0ZJTEVfSU5WQUxJRCA9IDQ7CgpwdWJsaWMgY29uc3QgRVJST1JfREVQRU5ERU5DWV9SRVNPTFVUSU9OX0ZBSUxFRCA9IDI7CnB1YmxpYyBjb25zdCBFUlJPUl9BVURJVF9GQUlMRUQgPSA1OwoKcHVibGljIGNvbnN0IEVSUk9SX1RSQU5TUE9SVF9FWENFUFRJT04gPSAxMDA7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCgoKcHJvdGVjdGVkICRjb25maWc7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2U7CgoKCgoKcHJvdGVjdGVkICRmaXhlZFJvb3RQYWNrYWdlOwoKCgoKcHJvdGVjdGVkICRkb3dubG9hZE1hbmFnZXI7CgoKCgpwcm90ZWN0ZWQgJHJlcG9zaXRvcnlNYW5hZ2VyOwoKCgoKcHJvdGVjdGVkICRsb2NrZXI7CgoKCgpwcm90ZWN0ZWQgJGluc3RhbGxhdGlvbk1hbmFnZXI7CgoKCgpwcm90ZWN0ZWQgJGV2ZW50RGlzcGF0Y2hlcjsKCgoKCnByb3RlY3RlZCAkYXV0b2xvYWRHZW5lcmF0b3I7CgoKcHJvdGVjdGVkICRwcmVmZXJTb3VyY2UgPSBmYWxzZTsKCnByb3RlY3RlZCAkcHJlZmVyRGlzdCA9IGZhbHNlOwoKcHJvdGVjdGVkICRvcHRpbWl6ZUF1dG9sb2FkZXIgPSBmYWxzZTsKCnByb3RlY3RlZCAkY2xhc3NNYXBBdXRob3JpdGF0aXZlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGFwY3VBdXRvbG9hZGVyID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGFwY3VBdXRvbG9hZGVyUHJlZml4ID0gbnVsbDsKCnByb3RlY3RlZCAkZGV2TW9kZSA9IGZhbHNlOwoKcHJvdGVjdGVkICRkcnlSdW4gPSBmYWxzZTsKCnByb3RlY3RlZCAkZG93bmxvYWRPbmx5ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHZlcmJvc2UgPSBmYWxzZTsKCnByb3RlY3RlZCAkdXBkYXRlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGluc3RhbGwgPSB0cnVlOwoKcHJvdGVjdGVkICRkdW1wQXV0b2xvYWRlciA9IHRydWU7Cgpwcm90ZWN0ZWQgJHJ1blNjcmlwdHMgPSB0cnVlOwoKcHJvdGVjdGVkICRwcmVmZXJTdGFibGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkcHJlZmVyTG93ZXN0ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJG1pbmltYWxVcGRhdGUgPSBmYWxzZTsKCnByb3RlY3RlZCAkd3JpdGVMb2NrOwoKcHJvdGVjdGVkICRleGVjdXRlT3BlcmF0aW9ucyA9IHRydWU7Cgpwcm90ZWN0ZWQgJGF1ZGl0ID0gdHJ1ZTsKCnByb3RlY3RlZCAkZXJyb3JPbkF1ZGl0ID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJGF1ZGl0Rm9ybWF0ID0gQXVkaXRvcjo6Rk9STUFUX1NVTU1BUlk7Cgpwcml2YXRlICRhdWRpdENvbmZpZyA9IG51bGw7Cgpwcml2YXRlICRpZ25vcmVkVHlwZXMgPSBbJ3BocC1leHQnLCAncGhwLWV4dC16ZW5kJ107Cgpwcml2YXRlICRhbGxvd2VkVHlwZXMgPSBudWxsOwoKCnByb3RlY3RlZCAkdXBkYXRlTWlycm9ycyA9IGZhbHNlOwoKCgoKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dMaXN0ID0gbnVsbDsKCnByb3RlY3RlZCAkdXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID0gUmVxdWVzdDo6VVBEQVRFX09OTFlfTElTVEVEOwoKCgoKcHJvdGVjdGVkICRzdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOwoKCgoKcHJvdGVjdGVkICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwoKCgoKcHJvdGVjdGVkICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5OwoKCnByb3RlY3RlZCAkdGVtcG9yYXJ5Q29uc3RyYWludHMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBEb3dubG9hZE1hbmFnZXIgJGRvd25sb2FkTWFuYWdlciwgUmVwb3NpdG9yeU1hbmFnZXIgJHJlcG9zaXRvcnlNYW5hZ2VyLCBMb2NrZXIgJGxvY2tlciwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlciwgRXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIsIEF1dG9sb2FkR2VuZXJhdG9yICRhdXRvbG9hZEdlbmVyYXRvcikKewokdGhpcy0+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+aW5zdGFsbGF0aW9uTWFuYWdlciwKJ2NvbXBvc2VyJywKJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlciwKbnVsbCwKJHRoaXMtPmxvY2tlcgopOwp9CgppZiAoJHRoaXMtPmluc3RhbGwgJiYgJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zKSB7Cgpmb3JlYWNoICgkbG9jYWxSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyLT5lbnN1cmVCaW5hcmllc1ByZXNlbmNlKCRwYWNrYWdlKTsKfQp9CgokZnVuZEVudiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0ZVTkQnKTsKJHNob3dGdW5kaW5nID0gdHJ1ZTsKaWYgKGlzX251bWVyaWMoJGZ1bmRFbnYpKSB7CiRzaG93RnVuZGluZyA9IGludHZhbCgkZnVuZEVudikgIT09IDA7Cn0KCmlmICgkc2hvd0Z1bmRpbmcpIHsKJGZ1bmRpbmdDb3VudCA9IDA7CmZvcmVhY2ggKCRsb2NhbFJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICEkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0RnVuZGluZygpKSB7CiRmdW5kaW5nQ291bnQrKzsKfQp9CmlmICgkZnVuZGluZ0NvdW50ID4gMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwpzcHJpbnRmKAoiPGluZm8+JWQgcGFja2FnZSVzIHlvdSBhcmUgdXNpbmcgJXMgbG9va2luZyBmb3IgZnVuZGluZy48L2luZm8+IiwKJGZ1bmRpbmdDb3VudCwKMSA9PT0gJGZ1bmRpbmdDb3VudCA/ICcnIDogJ3MnLAoxID09PSAkZnVuZGluZ0NvdW50ID8gJ2lzJyA6ICdhcmUnCiksCic8aW5mbz5Vc2UgdGhlIGBjb21wb3NlciBmdW5kYCBjb21tYW5kIHRvIGZpbmQgb3V0IG1vcmUhPC9pbmZvPicsCl0pOwp9Cn0KCmlmICgkdGhpcy0+cnVuU2NyaXB0cykgewoKJGV2ZW50TmFtZSA9ICR0aGlzLT51cGRhdGUgPyBTY3JpcHRFdmVudHM6OlBPU1RfVVBEQVRFX0NNRCA6IFNjcmlwdEV2ZW50czo6UE9TVF9JTlNUQUxMX0NNRDsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hTY3JpcHQoJGV2ZW50TmFtZSwgJHRoaXMtPmRldk1vZGUpOwp9CgoKaWYgKCFkZWZpbmVkKCdISFZNX1ZFUlNJT04nKSkgewpnY19lbmFibGUoKTsKfQoKJGF1ZGl0Q29uZmlnID0gJHRoaXMtPmdldEF1ZGl0Q29uZmlnKCk7CgppZiAoJGF1ZGl0Q29uZmlnLT5hdWRpdCkgewppZiAoJHRoaXMtPnVwZGF0ZSAmJiAhJHRoaXMtPmluc3RhbGwpIHsKJHBhY2thZ2VzID0gJGxvY2tlZFJlcG9zaXRvcnktPmdldENhbm9uaWNhbFBhY2thZ2VzKCk7CiR0YXJnZXQgPSAnbG9ja2VkJzsKfSBlbHNlIHsKJHBhY2thZ2VzID0gJGxvY2FsUmVwby0+Z2V0Q2Fub25pY2FsUGFja2FnZXMoKTsKJHRhcmdldCA9ICdpbnN0YWxsZWQnOwp9CmlmIChjb3VudCgkcGFja2FnZXMpID4gMCkgewp0cnkgewokYXVkaXRvciA9IG5ldyBBdWRpdG9yKCk7CiRyZXBvU2V0ID0gbmV3IFJlcG9zaXRvcnlTZXQoKTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwbykgewokcmVwb1NldC0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KCnJldHVybiAkYXVkaXRvci0+YXVkaXQoJHRoaXMtPmlvLCAkcmVwb1NldCwgJHBhY2thZ2VzLCAkYXVkaXRDb25maWctPmF1ZGl0Rm9ybWF0LCB0cnVlLCAkYXVkaXRDb25maWctPmlnbm9yZUxpc3RGb3JBdWRpdCwgJGF1ZGl0Q29uZmlnLT5hdWRpdEFiYW5kb25lZCwgJGF1ZGl0Q29uZmlnLT5pZ25vcmVTZXZlcml0eUZvckF1ZGl0LCAkYXVkaXRDb25maWctPmlnbm9yZVVucmVhY2hhYmxlLCAkYXVkaXRDb25maWctPmlnbm9yZUFiYW5kb25lZEZvckF1ZGl0KSA+IDAgJiYgJHRoaXMtPmVycm9yT25BdWRpdCA/IHNlbGY6OkVSUk9SX0FVRElUX0ZBSUxFRCA6IDA7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPmVycm9yKCdGYWlsZWQgdG8gYXVkaXQgJy4kdGFyZ2V0LicgcGFja2FnZXMuJyk7CmlmICgkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKSB7CiR0aGlzLT5pby0+ZXJyb3IoJ1snLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpKTsKfQp9Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignTm8gJy4kdGFyZ2V0LicgcGFja2FnZXMgLSBza2lwcGluZyBhdWRpdC4nKTsKfQp9CgpyZXR1cm4gMDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvVXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2FsUmVwbywgYm9vbCAkZG9JbnN0YWxsKTogaW50CnsKJHBsYXRmb3JtUmVwbyA9ICR0aGlzLT5jcmVhdGVQbGF0Zm9ybVJlcG8odHJ1ZSk7CiRhbGlhc2VzID0gJHRoaXMtPmdldFJvb3RBbGlhc2VzKHRydWUpOwoKJGxvY2tlZFJlcG9zaXRvcnkgPSBudWxsOwoKdHJ5IHsKaWYgKCR0aGlzLT5sb2NrZXItPmlzTG9ja2VkKCkpIHsKJGxvY2tlZFJlcG9zaXRvcnkgPSAkdGhpcy0+bG9ja2VyLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpOwp9Cn0gY2F0Y2ggKFxTZWxkXEpzb25MaW50XFBhcnNpbmdFeGNlcHRpb24gJGUpIHsKaWYgKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgIT09IG51bGwgfHwgJHRoaXMtPnVwZGF0ZU1pcnJvcnMpIHsKCnRocm93ICRlOwp9CgoKfQoKaWYgKCgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsIHx8ICR0aGlzLT51cGRhdGVNaXJyb3JzKSAmJiAhJGxvY2tlZFJlcG9zaXRvcnkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+Q2Fubm90IHVwZGF0ZSAnIC4gKCR0aGlzLT51cGRhdGVNaXJyb3JzID8gJ2xvY2sgZmlsZSBpbmZvcm1hdGlvbicgOiAnb25seSBhIHBhcnRpYWwgc2V0IG9mIHBhY2thZ2VzJykgLiAnIHdpdGhvdXQgYSBsb2NrIGZpbGUgcHJlc2VudC4gUnVuIGBjb21wb3NlciB1cGRhdGVgIHRvIGdlbmVyYXRlIGEgbG9jayBmaWxlLjwvZXJyb3I+JywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlFVSUVUKTsKCnJldHVybiBzZWxmOjpFUlJPUl9OT19MT0NLX0ZJTEVfRk9SX1BBUlRJQUxfVVBEQVRFOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxpbmZvPkxvYWRpbmcgY29tcG9zZXIgcmVwb3NpdG9yaWVzIHdpdGggcGFja2FnZSBpbmZvcm1hdGlvbjwvaW5mbz4nKTsKCgokcG9saWN5ID0gJHRoaXMtPmNyZWF0ZVBvbGljeSh0cnVlLCAkbG9ja2VkUmVwb3NpdG9yeSk7CiRyZXBvc2l0b3J5U2V0ID0gJHRoaXMtPmNyZWF0ZVJlcG9zaXRvcnlTZXQodHJ1ZSwgJHBsYXRmb3JtUmVwbywgJGFsaWFzZXMpOwokcmVwb3NpdG9yaWVzID0gJHRoaXMtPnJlcG9zaXRvcnlNYW5hZ2VyLT5nZXRSZXBvc2l0b3JpZXMoKTsKZm9yZWFjaCAoJHJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkcmVwb3NpdG9yeSk7Cn0KaWYgKCRsb2NrZWRSZXBvc2l0b3J5KSB7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KCRsb2NrZWRSZXBvc2l0b3J5KTsKfQoKJHJlcXVlc3QgPSAkdGhpcy0+Y3JlYXRlUmVxdWVzdCgkdGhpcy0+Zml4ZWRSb290UGFja2FnZSwgJHBsYXRmb3JtUmVwbywgJGxvY2tlZFJlcG9zaXRvcnkpOwokdGhpcy0+cmVxdWlyZVBhY2thZ2VzRm9yVXBkYXRlKCRyZXF1ZXN0LCAkbG9ja2VkUmVwb3NpdG9yeSwgdHJ1ZSk7CgoKaWYgKCR0aGlzLT51cGRhdGVBbGxvd0xpc3QgIT09IG51bGwpIHsKJHJlcXVlc3QtPnNldFVwZGF0ZUFsbG93TGlzdCgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0LCAkdGhpcy0+dXBkYXRlQWxsb3dUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKTsKfQoKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbCgkcmVxdWVzdCwgJHRoaXMtPmlvLCAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyLCAkdGhpcy0+Y3JlYXRlUG9vbE9wdGltaXplcigkcG9saWN5KSwgJHRoaXMtPmlnbm9yZWRUeXBlcywgJHRoaXMtPmFsbG93ZWRUeXBlcywgJHRoaXMtPmNyZWF0ZVNlY3VyaXR5QXVkaXRQb29sRmlsdGVyKCkpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8aW5mbz5VcGRhdGluZyBkZXBlbmRlbmNpZXM8L2luZm8+Jyk7CgoKJHNvbHZlciA9IG5ldyBTb2x2ZXIoJHBvbGljeSwgJHBvb2wsICR0aGlzLT5pbyk7CnRyeSB7CiRsb2NrVHJhbnNhY3Rpb24gPSAkc29sdmVyLT5zb2x2ZSgkcmVxdWVzdCwgJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOwokcnVsZVNldFNpemUgPSAkc29sdmVyLT5nZXRSdWxlU2V0U2l6ZSgpOwokc29sdmVyID0gbnVsbDsKfSBjYXRjaCAoU29sdmVyUHJvYmxlbXNFeGNlcHRpb24gJGUpIHsKJGVyciA9ICdZb3VyIHJlcXVpcmVtZW50cyBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYW4gaW5zdGFsbGFibGUgc2V0IG9mIHBhY2thZ2VzLic7CiRwcmV0dHlQcm9ibGVtID0gJGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPicuICRlcnIgLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcHJldHR5UHJvYmxlbSk7CmlmICghJHRoaXMtPmRldk1vZGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5SdW5uaW5nIHVwZGF0ZSB3aXRoIC0tbm8tZGV2IGRvZXMgbm90IG1lYW4gcmVxdWlyZS1kZXYgaXMgaWdub3JlZCwgaXQganVzdCBtZWFucyB0aGUgcGFja2FnZXMgd2lsbCBub3QgYmUgaW5zdGFsbGVkLiBJZiBkZXYgcmVxdWlyZW1lbnRzIGFyZSBibG9ja2luZyB0aGUgdXBkYXRlIHlvdSBoYXZlIHRvIHJlc29sdmUgdGhvc2UgcHJvYmxlbXMuPC93YXJuaW5nPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7Cn0KCiRnaGUgPSBuZXcgR2l0aHViQWN0aW9uRXJyb3IoJHRoaXMtPmlvKTsKJGdoZS0+ZW1pdCgkZXJyLiJcbiIuJHByZXR0eVByb2JsZW0pOwoKcmV0dXJuIG1heChzZWxmOjpFUlJPUl9HRU5FUklDX0ZBSUxVUkUsICRlLT5nZXRDb2RlKCkpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkFuYWx5emVkICIuY291bnQoJHBvb2wpLiIgcGFja2FnZXMgdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXMiLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiQW5hbHl6ZWQgIi4kcnVsZVNldFNpemUuIiBydWxlcyB0byByZXNvbHZlIGRlcGVuZGVuY2llcyIsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCiRwb29sID0gbnVsbDsKCmlmICghJGxvY2tUcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignTm90aGluZyB0byBtb2RpZnkgaW4gbG9jayBmaWxlJyk7CgppZiAoJHRoaXMtPm1pbmltYWxVcGRhdGUgJiYgJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCA9PT0gbnVsbCAmJiAkdGhpcy0+bG9ja2VyLT5pc0ZyZXNoKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgLS1taW5pbWFsLWNoYW5nZXMgb3B0aW9uIHNob3VsZCBiZSB1c2VkIHdpdGggcGFja2FnZSBhcmd1bWVudHMgb3IgYWZ0ZXIgbW9kaWZ5aW5nIGNvbXBvc2VyLmpzb24gcmVxdWlyZW1lbnRzLCBvdGhlcndpc2UgaXQgd2lsbCBsaWtlbHkgbm90IHlpZWxkIGFueSBkZXBlbmRlbmN5IGNoYW5nZXMuPC93YXJuaW5nPicpOwp9Cn0KCiRleGl0Q29kZSA9ICR0aGlzLT5leHRyYWN0RGV2UGFja2FnZXMoJGxvY2tUcmFuc2FjdGlvbiwgJHBsYXRmb3JtUmVwbywgJGFsaWFzZXMsICRwb2xpY3ksICRsb2NrZWRSZXBvc2l0b3J5KTsKaWYgKCRleGl0Q29kZSAhPT0gMCkgewpyZXR1cm4gJGV4aXRDb2RlOwp9CgpTZW12ZXJcQ29tcGlsaW5nTWF0Y2hlcjo6Y2xlYXIoKTsKCgokcGxhdGZvcm1SZXFzID0gJHRoaXMtPmV4dHJhY3RQbGF0Zm9ybVJlcXVpcmVtZW50cygkdGhpcy0+cGFja2FnZS0+Z2V0UmVxdWlyZXMoKSk7CiRwbGF0Zm9ybURldlJlcXMgPSAkdGhpcy0+ZXh0cmFjdFBsYXRmb3JtUmVxdWlyZW1lbnRzKCR0aGlzLT5wYWNrYWdlLT5nZXREZXZSZXF1aXJlcygpKTsKCiRpbnN0YWxsc1VwZGF0ZXMgPSAkdW5pbnN0YWxscyA9IFtdOwppZiAoJGxvY2tUcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpKSB7CiRpbnN0YWxsTmFtZXMgPSAkdXBkYXRlTmFtZXMgPSAkdW5pbnN0YWxsTmFtZXMgPSBbXTsKZm9yZWFjaCAoJGxvY2tUcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpIGFzICRvcGVyYXRpb24pIHsKaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uKSB7CiRpbnN0YWxsc1VwZGF0ZXNbXSA9ICRvcGVyYXRpb247CiRpbnN0YWxsTmFtZXNbXSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpLic6Jy4kb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZWlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uKSB7CgoKaWYgKCR0aGlzLT51cGRhdGVNaXJyb3JzCiYmICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCktPmdldE5hbWUoKSA9PT0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXROYW1lKCkKJiYgJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKS0+Z2V0VmVyc2lvbigpID09PSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldFZlcnNpb24oKQopIHsKY29udGludWU7Cn0KCiRpbnN0YWxsc1VwZGF0ZXNbXSA9ICRvcGVyYXRpb247CiR1cGRhdGVOYW1lc1tdID0gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCkuJzonLiRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKfSBlbHNlaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBVbmluc3RhbGxPcGVyYXRpb24pIHsKJHVuaW5zdGFsbHNbXSA9ICRvcGVyYXRpb247CiR1bmluc3RhbGxOYW1lc1tdID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCk7Cn0KfQoKaWYgKCR0aGlzLT5jb25maWctPmdldCgnbG9jaycpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKAoiPGluZm8+TG9jayBmaWxlIG9wZXJhdGlvbnM6ICVkIGluc3RhbGwlcywgJWQgdXBkYXRlJXMsICVkIHJlbW92YWwlczwvaW5mbz4iLApjb3VudCgkaW5zdGFsbE5hbWVzKSwKMSA9PT0gY291bnQoJGluc3RhbGxOYW1lcykgPyAnJyA6ICdzJywKY291bnQoJHVwZGF0ZU5hbWVzKSwKMSA9PT0gY291bnQoJHVwZGF0ZU5hbWVzKSA/ICcnIDogJ3MnLApjb3VudCgkdW5pbnN0YWxscyksCjEgPT09IGNvdW50KCR1bmluc3RhbGxzKSA/ICcnIDogJ3MnCikpOwppZiAoJGluc3RhbGxOYW1lcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkluc3RhbGxzOiAiLmltcGxvZGUoJywgJywgJGluc3RhbGxOYW1lcyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQppZiAoJHVwZGF0ZU5hbWVzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiVXBkYXRlczogIi5pbXBsb2RlKCcsICcsICR1cGRhdGVOYW1lcyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQppZiAoJHVuaW5zdGFsbHMpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJSZW1vdmFsczogIi5pbXBsb2RlKCcsICcsICR1bmluc3RhbGxOYW1lcyksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQp9Cn0KCiRzb3J0QnlOYW1lID0gc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpOiBpbnQgewppZiAoJGEgaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24pIHsKJGEgPSAkYS0+Z2V0VGFyZ2V0UGFja2FnZSgpLT5nZXROYW1lKCk7Cn0gZWxzZSB7CiRhID0gJGEtPmdldFBhY2thZ2UoKS0+Z2V0TmFtZSgpOwp9CmlmICgkYiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbikgewokYiA9ICRiLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldE5hbWUoKTsKfSBlbHNlIHsKJGIgPSAkYi0+Z2V0UGFja2FnZSgpLT5nZXROYW1lKCk7Cn0KCnJldHVybiBzdHJjbXAoJGEsICRiKTsKfTsKdXNvcnQoJHVuaW5zdGFsbHMsICRzb3J0QnlOYW1lKTsKdXNvcnQoJGluc3RhbGxzVXBkYXRlcywgJHNvcnRCeU5hbWUpOwoKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHVuaW5zdGFsbHMsICRpbnN0YWxsc1VwZGF0ZXMpIGFzICRvcGVyYXRpb24pIHsKCmlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikgewokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlci0+YWRkU3VnZ2VzdGlvbnNGcm9tUGFja2FnZSgkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCkpOwp9CgoKaWYgKCR0aGlzLT5jb25maWctPmdldCgnbG9jaycpICYmIChmYWxzZSA9PT0gc3RycG9zKCRvcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSwgJ0FsaWFzJykgfHwgJHRoaXMtPmlvLT5pc0RlYnVnKCkpKSB7CiRzb3VyY2VSZXBvID0gJyc7CmlmICgkdGhpcy0+aW8tPmlzVmVyeVZlcmJvc2UoKSAmJiBmYWxzZSA9PT0gc3RycG9zKCRvcGVyYXRpb24tPmdldE9wZXJhdGlvblR5cGUoKSwgJ0FsaWFzJykpIHsKJG9wZXJhdGlvblBrZyA9ICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uID8gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpIDogJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpKTsKaWYgKCRvcGVyYXRpb25Qa2ctPmdldFJlcG9zaXRvcnkoKSAhPT0gbnVsbCkgewokc291cmNlUmVwbyA9ICcgZnJvbSAnIC4gJG9wZXJhdGlvblBrZy0+Z2V0UmVwb3NpdG9yeSgpLT5nZXRSZXBvTmFtZSgpOwp9Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgIC0gJyAuICRvcGVyYXRpb24tPnNob3codHJ1ZSkgLiAkc291cmNlUmVwbyk7Cn0KfQoKJHVwZGF0ZWRMb2NrID0gJHRoaXMtPmxvY2tlci0+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+d3JpdGVFcnJvcigkbWlzc2luZ1JlcXVpcmVtZW50SW5mbyk7CgppZiAoISR0aGlzLT5jb25maWctPmdldCgnYWxsb3ctbWlzc2luZy1yZXF1aXJlbWVudHMnKSkgewpyZXR1cm4gc2VsZjo6RVJST1JfTE9DS19GSUxFX0lOVkFMSUQ7Cn0KfQoKZm9yZWFjaCAoJGxvY2tlZFJlcG9zaXRvcnktPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHJlcXVlc3QtPmZpeExvY2tlZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cgokcm9vdFJlcXVpcmVzID0gJHRoaXMtPnBhY2thZ2UtPmdldFJlcXVpcmVzKCk7CmlmICgkdGhpcy0+ZGV2TW9kZSkgewokcm9vdFJlcXVpcmVzID0gYXJyYXlfbWVyZ2UoJHJvb3RSZXF1aXJlcywgJHRoaXMtPnBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpOwp9CmZvcmVhY2ggKCRyb290UmVxdWlyZXMgYXMgJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpKSkgewokcmVxdWVzdC0+cmVxdWlyZU5hbWUoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKTsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+bG9ja2VyLT5nZXRQbGF0Zm9ybVJlcXVpcmVtZW50cygkdGhpcy0+ZGV2TW9kZSkgYXMgJGxpbmspIHsKaWYgKCFpc3NldCgkcm9vdFJlcXVpcmVzWyRsaW5rLT5nZXRUYXJnZXQoKV0pKSB7CiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KdW5zZXQoJHJvb3RSZXF1aXJlcywgJGxpbmspOwoKJHBvb2wgPSAkcmVwb3NpdG9yeVNldC0+Y3JlYXRlUG9vbCgkcmVxdWVzdCwgJHRoaXMtPmlvLCAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyLCBudWxsLCAkdGhpcy0+aWdub3JlZFR5cGVzLCAkdGhpcy0+YWxsb3dlZFR5cGVzLCBudWxsKTsKCgokc29sdmVyID0gbmV3IFNvbHZlcigkcG9saWN5LCAkcG9vbCwgJHRoaXMtPmlvKTsKdHJ5IHsKJGxvY2tUcmFuc2FjdGlvbiA9ICRzb2x2ZXItPnNvbHZlKCRyZXF1ZXN0LCAkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7CiRzb2x2ZXIgPSBudWxsOwoKCmlmICgwICE9PSBjb3VudCgkbG9ja1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPllvdXIgbG9jayBmaWxlIGNhbm5vdCBiZSBpbnN0YWxsZWQgb24gdGhpcyBzeXN0ZW0gd2l0aG91dCBjaGFuZ2VzLiBQbGVhc2UgcnVuIGNvbXBvc2VyIHVwZGF0ZS48L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CgpyZXR1cm4gc2VsZjo6RVJST1JfTE9DS19GSUxFX0lOVkFMSUQ7Cn0KfSBjYXRjaCAoU29sdmVyUHJvYmxlbXNFeGNlcHRpb24gJGUpIHsKJGVyciA9ICdZb3VyIGxvY2sgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgY29tcGF0aWJsZSBzZXQgb2YgcGFja2FnZXMuIFBsZWFzZSBydW4gY29tcG9zZXIgdXBkYXRlLic7CiRwcmV0dHlQcm9ibGVtID0gJGUtPmdldFByZXR0eVN0cmluZygkcmVwb3NpdG9yeVNldCwgJHJlcXVlc3QsICRwb29sLCAkdGhpcy0+aW8tPmlzVmVyYm9zZSgpKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPicuICRlcnIgLic8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpRVUlFVCk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcHJldHR5UHJvYmxlbSk7CgokZ2hlID0gbmV3IEdpdGh1YkFjdGlvbkVycm9yKCR0aGlzLT5pbyk7CiRnaGUtPmVtaXQoJGVyci4iXG4iLiRwcmV0dHlQcm9ibGVtKTsKCnJldHVybiBtYXgoc2VsZjo6RVJST1JfR0VORVJJQ19GQUlMVVJFLCAkZS0+Z2V0Q29kZSgpKTsKfQp9CgoKJGxvY2FsUmVwb1RyYW5zYWN0aW9uID0gbmV3IExvY2FsUmVwb1RyYW5zYWN0aW9uKCRsb2NrZWRSZXBvc2l0b3J5LCAkbG9jYWxSZXBvKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2hJbnN0YWxsZXJFdmVudChJbnN0YWxsZXJFdmVudHM6OlBSRV9PUEVSQVRJT05TX0VYRUMsICR0aGlzLT5kZXZNb2RlLCAkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnMsICRsb2NhbFJlcG9UcmFuc2FjdGlvbik7CgokaW5zdGFsbHMgPSAkdXBkYXRlcyA9ICR1bmluc3RhbGxzID0gW107CmZvcmVhY2ggKCRsb2NhbFJlcG9UcmFuc2FjdGlvbi0+Z2V0T3BlcmF0aW9ucygpIGFzICRvcGVyYXRpb24pIHsKaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uKSB7CiRpbnN0YWxsc1tdID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpLT5nZXRQcmV0dHlOYW1lKCkuJzonLiRvcGVyYXRpb24tPmdldFBhY2thZ2UoKS0+Z2V0RnVsbFByZXR0eVZlcnNpb24oKTsKfSBlbHNlaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24pIHsKJHVwZGF0ZXNbXSA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKS0+Z2V0UHJldHR5TmFtZSgpLic6Jy4kb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCktPmdldEZ1bGxQcmV0dHlWZXJzaW9uKCk7Cn0gZWxzZWlmICgkb3BlcmF0aW9uIGluc3RhbmNlb2YgVW5pbnN0YWxsT3BlcmF0aW9uKSB7CiR1bmluc3RhbGxzW10gPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCktPmdldFByZXR0eU5hbWUoKTsKfQp9CgppZiAoJGluc3RhbGxzID09PSBbXSAmJiAkdXBkYXRlcyA9PT0gW10gJiYgJHVuaW5zdGFsbHMgPT09IFtdKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignTm90aGluZyB0byBpbnN0YWxsLCB1cGRhdGUgb3IgcmVtb3ZlJyk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKAoiPGluZm8+UGFja2FnZSBvcGVyYXRpb25zOiAlZCBpbnN0YWxsJXMsICVkIHVwZGF0ZSVzLCAlZCByZW1vdmFsJXM8L2luZm8+IiwKY291bnQoJGluc3RhbGxzKSwKMSA9PT0gY291bnQoJGluc3RhbGxzKSA/ICcnIDogJ3MnLApjb3VudCgkdXBkYXRlcyksCjEgPT09IGNvdW50KCR1cGRhdGVzKSA/ICcnIDogJ3MnLApjb3VudCgkdW5pbnN0YWxscyksCjEgPT09IGNvdW50KCR1bmluc3RhbGxzKSA/ICcnIDogJ3MnCikpOwppZiAoJGluc3RhbGxzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiSW5zdGFsbHM6ICIuaW1wbG9kZSgnLCAnLCAkaW5zdGFsbHMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KaWYgKCR1cGRhdGVzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiVXBkYXRlczogIi5pbXBsb2RlKCcsICcsICR1cGRhdGVzKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwp9CmlmICgkdW5pbnN0YWxscykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlJlbW92YWxzOiAiLmltcGxvZGUoJywgJywgJHVuaW5zdGFsbHMpLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7Cn0KfQoKaWYgKCR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucykgewokbG9jYWxSZXBvLT5zZXREZXZQYWNrYWdlTmFtZXMoJHRoaXMtPmxvY2tlci0+Z2V0RGV2UGFja2FnZU5hbWVzKCkpOwokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlci0+ZXhlY3V0ZSgkbG9jYWxSZXBvLCAkbG9jYWxSZXBvVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSwgJHRoaXMtPmRldk1vZGUsICR0aGlzLT5ydW5TY3JpcHRzLCAkdGhpcy0+ZG93bmxvYWRPbmx5KTsKCgppZiAoY291bnQoJGxvY2FsUmVwb1RyYW5zYWN0aW9uLT5nZXRPcGVyYXRpb25zKCkpID4gMCkgewokdmVuZG9yRGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCd2ZW5kb3ItZGlyJyk7CmlmIChpc19kaXIoJHZlbmRvckRpcikpIHsKCgpAdG91Y2goJHZlbmRvckRpcik7Cn0KfQp9IGVsc2Ugewpmb3JlYWNoICgkbG9jYWxSZXBvVHJhbnNhY3Rpb24tPmdldE9wZXJhdGlvbnMoKSBhcyAkb3BlcmF0aW9uKSB7CgppZiAoZmFsc2UgPT09IHN0cnBvcygkb3BlcmF0aW9uLT5nZXRPcGVyYXRpb25UeXBlKCksICdBbGlhcycpIHx8ICR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAtICcgLiAkb3BlcmF0aW9uLT5zaG93KGZhbHNlKSk7Cn0KfQp9CgpyZXR1cm4gMDsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZVBsYXRmb3JtUmVwbyhib29sICRmb3JVcGRhdGUpOiBQbGF0Zm9ybVJlcG9zaXRvcnkKewppZiAoJGZvclVwZGF0ZSkgewokcGxhdGZvcm1PdmVycmlkZXMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3BsYXRmb3JtJykgPzogW107Cn0gZWxzZSB7CiRwbGF0Zm9ybU92ZXJyaWRlcyA9ICR0aGlzLT5sb2NrZXItPmdldFBsYXRmb3JtT3ZlcnJpZGVzKCk7Cn0KCnJldHVybiBuZXcgUGxhdGZvcm1SZXBvc2l0b3J5KFtdLCAkcGxhdGZvcm1PdmVycmlkZXMpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUmVwb3NpdG9yeVNldChib29sICRmb3JVcGRhdGUsIFBsYXRmb3JtUmVwb3NpdG9yeSAkcGxhdGZvcm1SZXBvLCBhcnJheSAkcm9vdEFsaWFzZXMgPSBbXSwgP1JlcG9zaXRvcnlJbnRlcmZhY2UgJGxvY2tlZFJlcG9zaXRvcnkgPSBudWxsKTogUmVwb3NpdG9yeVNldAp7CmlmICgkZm9yVXBkYXRlKSB7CiRtaW5pbXVtU3RhYmlsaXR5ID0gJHRoaXMtPnBhY2thZ2UtPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKJHN0YWJpbGl0eUZsYWdzID0gJHRoaXMtPnBhY2thZ2UtPmdldFN0YWJpbGl0eUZsYWdzKCk7CgokcmVxdWlyZXMgPSBhcnJheV9tZXJnZSgkdGhpcy0+cGFja2FnZS0+Z2V0UmVxdWlyZXMoKSwgJHRoaXMtPnBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpOwp9IGVsc2UgewokbWluaW11bVN0YWJpbGl0eSA9ICR0aGlzLT5sb2NrZXItPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKJHN0YWJpbGl0eUZsYWdzID0gJHRoaXMtPmxvY2tlci0+Z2V0U3RhYmlsaXR5RmxhZ3MoKTsKCiRyZXF1aXJlcyA9IFtdOwpmb3JlYWNoICgkbG9ja2VkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7CiRjb25zdHJhaW50LT5zZXRQcmV0dHlTdHJpbmcoJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSk7CiRyZXF1aXJlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRjb25zdHJhaW50Owp9Cn0KCiRyb290UmVxdWlyZXMgPSBbXTsKZm9yZWFjaCAoJHJlcXVpcmVzIGFzICRyZXEgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRjb25zdHJhaW50IGluc3RhbmNlb2YgTGluaykgewokY29uc3RyYWludCA9ICRjb25zdHJhaW50LT5nZXRDb25zdHJhaW50KCk7Cn0KCmlmICgkdGhpcy0+cGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRyZXEpKSB7CmNvbnRpbnVlOwp9IGVsc2VpZiAoJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikgewokY29uc3RyYWludCA9ICR0aGlzLT5wbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRyZXEsICRjb25zdHJhaW50KTsKfQokcm9vdFJlcXVpcmVzWyRyZXFdID0gJGNvbnN0cmFpbnQ7Cn0KCiR0aGlzLT5maXhlZFJvb3RQYWNrYWdlID0gY2xvbmUgJHRoaXMtPnBhY2thZ2U7CiR0aGlzLT5maXhlZFJvb3RQYWNrYWdlLT5zZXRSZXF1aXJlcyhbXSk7CiR0aGlzLT5maXhlZFJvb3RQYWNrYWdlLT5zZXREZXZSZXF1aXJlcyhbXSk7Cgokc3RhYmlsaXR5RmxhZ3NbJHRoaXMtPnBhY2thZ2UtPmdldE5hbWUoKV0gPSBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVNbVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHRoaXMtPnBhY2thZ2UtPmdldFZlcnNpb24oKSldOwoKJHJlcG9zaXRvcnlTZXQgPSBuZXcgUmVwb3NpdG9yeVNldCgkbWluaW11bVN0YWJpbGl0eSwgJHN0YWJpbGl0eUZsYWdzLCAkcm9vdEFsaWFzZXMsICR0aGlzLT5wYWNrYWdlLT5nZXRSZWZlcmVuY2VzKCksICRyb290UmVxdWlyZXMsICR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cyk7CiRyZXBvc2l0b3J5U2V0LT5hZGRSZXBvc2l0b3J5KG5ldyBSb290UGFja2FnZVJlcG9zaXRvcnkoJHRoaXMtPmZpeGVkUm9vdFBhY2thZ2UpKTsKJHJlcG9zaXRvcnlTZXQtPmFkZFJlcG9zaXRvcnkoJHBsYXRmb3JtUmVwbyk7CmlmICgkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSkgewoKCiRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgPSAkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeTsKaWYgKCRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CiRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3JpZXMgPSAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzLT5nZXRSZXBvc2l0b3JpZXMoKTsKfSBlbHNlIHsKJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcmllcyA9IFskYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzXTsKfQpmb3JlYWNoICgkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yaWVzIGFzICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5KSB7CmlmICgkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnkgfHwgJGFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkgaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlKSB7CiRyZXBvc2l0b3J5U2V0LT5hbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcygpOwpicmVhazsKfQp9CgokcmVwb3NpdG9yeVNldC0+YWRkUmVwb3NpdG9yeSgkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSk7Cn0KCnJldHVybiAkcmVwb3NpdG9yeVNldDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQb2xpY3koYm9vbCAkZm9yVXBkYXRlLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwbyA9IG51bGwpOiBEZWZhdWx0UG9saWN5CnsKJHByZWZlclN0YWJsZSA9IG51bGw7CiRwcmVmZXJMb3dlc3QgPSBudWxsOwppZiAoISRmb3JVcGRhdGUpIHsKJHByZWZlclN0YWJsZSA9ICR0aGlzLT5sb2NrZXItPmdldFByZWZlclN0YWJsZSgpOwokcHJlZmVyTG93ZXN0ID0gJHRoaXMtPmxvY2tlci0+Z2V0UHJlZmVyTG93ZXN0KCk7Cn0KCgppZiAobnVsbCA9PT0gJHByZWZlclN0YWJsZSkgewokcHJlZmVyU3RhYmxlID0gJHRoaXMtPnByZWZlclN0YWJsZSB8fCAkdGhpcy0+cGFja2FnZS0+Z2V0UHJlZmVyU3RhYmxlKCk7Cn0KaWYgKG51bGwgPT09ICRwcmVmZXJMb3dlc3QpIHsKJHByZWZlckxvd2VzdCA9ICR0aGlzLT5wcmVmZXJMb3dlc3Q7Cn0KCiRwcmVmZXJyZWRWZXJzaW9ucyA9IG51bGw7CmlmICgkZm9yVXBkYXRlICYmICR0aGlzLT5taW5pbWFsVXBkYXRlICYmICRsb2NrZWRSZXBvICE9PSBudWxsKSB7CiRwcmVmZXJyZWRWZXJzaW9ucyA9IFtdOwpmb3JlYWNoICgkbG9ja2VkUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGtnKSB7CmlmICgkcGtnIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlIHx8ICgkdGhpcy0+dXBkYXRlQWxsb3dMaXN0ICE9PSBudWxsICYmIGluX2FycmF5KCRwa2ctPmdldE5hbWUoKSwgJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCwgdHJ1ZSkpKSB7CmNvbnRpbnVlOwp9CiRwcmVmZXJyZWRWZXJzaW9uc1skcGtnLT5nZXROYW1lKCldID0gJHBrZy0+Z2V0VmVyc2lvbigpOwp9Cn0KCnJldHVybiBuZXcgRGVmYXVsdFBvbGljeSgkcHJlZmVyU3RhYmxlLCAkcHJlZmVyTG93ZXN0LCAkcHJlZmVycmVkVmVyc2lvbnMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3QoUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlLCBQbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbywgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG9zaXRvcnkgPSBudWxsKTogUmVxdWVzdAp7CiRyZXF1ZXN0ID0gbmV3IFJlcXVlc3QoJGxvY2tlZFJlcG9zaXRvcnkpOwoKJHJlcXVlc3QtPmZpeFBhY2thZ2UoJHJvb3RQYWNrYWdlKTsKaWYgKCRyb290UGFja2FnZSBpbnN0YW5jZW9mIFJvb3RBbGlhc1BhY2thZ2UpIHsKJHJlcXVlc3QtPmZpeFBhY2thZ2UoJHJvb3RQYWNrYWdlLT5nZXRBbGlhc09mKCkpOwp9CgokZml4ZWRQYWNrYWdlcyA9ICRwbGF0Zm9ybVJlcG8tPmdldFBhY2thZ2VzKCk7CmlmICgkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSkgewokZml4ZWRQYWNrYWdlcyA9IGFycmF5X21lcmdlKCRmaXhlZFBhY2thZ2VzLCAkdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKSk7Cn0KCgoKCiRwcm92aWRlZCA9ICRyb290UGFja2FnZS0+Z2V0UHJvdmlkZXMoKTsKZm9yZWFjaCAoJGZpeGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKCmlmICgkcGFja2FnZS0+Z2V0UmVwb3NpdG9yeSgpICE9PSAkcGxhdGZvcm1SZXBvCnx8ICFpc3NldCgkcHJvdmlkZWRbJHBhY2thZ2UtPmdldE5hbWUoKV0pCnx8ICEkcHJvdmlkZWRbJHBhY2thZ2UtPmdldE5hbWUoKV0tPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKQopIHsKJHJlcXVlc3QtPmZpeFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCnJldHVybiAkcmVxdWVzdDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZXF1aXJlUGFja2FnZXNGb3JVcGRhdGUoUmVxdWVzdCAkcmVxdWVzdCwgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG9zaXRvcnkgPSBudWxsLCBib29sICRpbmNsdWRlRGV2UmVxdWlyZXMgPSB0cnVlKTogdm9pZAp7CgppZiAoJHRoaXMtPnVwZGF0ZU1pcnJvcnMpIHsKJGV4Y2x1ZGVkUGFja2FnZXMgPSBbXTsKaWYgKCEkaW5jbHVkZURldlJlcXVpcmVzKSB7CiRleGNsdWRlZFBhY2thZ2VzID0gYXJyYXlfZmxpcCgkdGhpcy0+bG9ja2VyLT5nZXREZXZQYWNrYWdlTmFtZXMoKSk7Cn0KCmZvcmVhY2ggKCRsb2NrZWRSZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRsb2NrZWRQYWNrYWdlKSB7CgoKaWYgKCEkbG9ja2VkUGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAhaXNzZXQoJGV4Y2x1ZGVkUGFja2FnZXNbJGxvY2tlZFBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkbG9ja2VkUGFja2FnZS0+Z2V0TmFtZSgpLCBuZXcgQ29uc3RyYWludCgnPT0nLCAkbG9ja2VkUGFja2FnZS0+Z2V0VmVyc2lvbigpKSk7Cn0KfQp9IGVsc2UgewokbGlua3MgPSAkdGhpcy0+cGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKaWYgKCRpbmNsdWRlRGV2UmVxdWlyZXMpIHsKJGxpbmtzID0gYXJyYXlfbWVyZ2UoJGxpbmtzLCAkdGhpcy0+cGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0KZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkbGluay0+Z2V0VGFyZ2V0KCksICRsaW5rLT5nZXRDb25zdHJhaW50KCkpOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJvb3RBbGlhc2VzKGJvb2wgJGZvclVwZGF0ZSk6IGFycmF5CnsKaWYgKCRmb3JVcGRhdGUpIHsKJGFsaWFzZXMgPSAkdGhpcy0+cGFja2FnZS0+Z2V0QWxpYXNlcygpOwp9IGVsc2UgewokYWxpYXNlcyA9ICR0aGlzLT5sb2NrZXItPmdldEFsaWFzZXMoKTsKfQoKcmV0dXJuICRhbGlhc2VzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXh0cmFjdFBsYXRmb3JtUmVxdWlyZW1lbnRzKGFycmF5ICRsaW5rcyk6IGFycmF5CnsKJHBsYXRmb3JtUmVxcyA9IFtdOwpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpKSkgewokcGxhdGZvcm1SZXFzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpOwp9Cn0KCnJldHVybiAkcGxhdGZvcm1SZXFzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbW9ja0xvY2FsUmVwb3NpdG9yaWVzKFJlcG9zaXRvcnlNYW5hZ2VyICRybSk6IHZvaWQKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHJtLT5nZXRMb2NhbFJlcG9zaXRvcnkoKS0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokcGFja2FnZXNbKHN0cmluZykgJHBhY2thZ2VdID0gY2xvbmUgJHBhY2thZ2U7Cn0KZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRrZXkgPT4gJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRhbGlhcyA9IChzdHJpbmcpICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7CiRjbGFzc05hbWUgPSBnZXRfY2xhc3MoJHBhY2thZ2UpOwokcGFja2FnZXNbJGtleV0gPSBuZXcgJGNsYXNzTmFtZSgkcGFja2FnZXNbJGFsaWFzXSwgJHBhY2thZ2UtPmdldFZlcnNpb24oKSwgJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSk7Cn0KfQokcm0tPnNldExvY2FsUmVwb3NpdG9yeSgKbmV3IEluc3RhbGxlZEFycmF5UmVwb3NpdG9yeSgkcGFja2FnZXMpCik7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlUG9vbE9wdGltaXplcihQb2xpY3lJbnRlcmZhY2UgJHBvbGljeSk6ID9Qb29sT3B0aW1pemVyCnsKCgoKaWYgKCcwJyA9PT0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUE9PTF9PUFRJTUlaRVInKSkgewokdGhpcy0+aW8tPndyaXRlKCdQb29sIE9wdGltaXplciB3YXMgZGlzYWJsZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBuZXcgUG9vbE9wdGltaXplcigkcG9saWN5KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRBdWRpdENvbmZpZygpOiBBdWRpdENvbmZpZwp7CmlmIChudWxsID09PSAkdGhpcy0+YXVkaXRDb25maWcpIHsKJHRoaXMtPmF1ZGl0Q29uZmlnID0gQXVkaXRDb25maWc6OmZyb21Db25maWcoJHRoaXMtPmNvbmZpZywgJHRoaXMtPmF1ZGl0LCAkdGhpcy0+YXVkaXRGb3JtYXQpOwp9CgpyZXR1cm4gJHRoaXMtPmF1ZGl0Q29uZmlnOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVNlY3VyaXR5QXVkaXRQb29sRmlsdGVyKCk6ID9TZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlcgp7CiRhdWRpdENvbmZpZyA9ICR0aGlzLT5nZXRBdWRpdENvbmZpZygpOwoKaWYgKCRhdWRpdENvbmZpZy0+YmxvY2tJbnNlY3VyZSAmJiAhJHRoaXMtPnVwZGF0ZU1pcnJvcnMpIHsKcmV0dXJuIG5ldyBTZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlcihuZXcgQXVkaXRvcigpLCAkYXVkaXRDb25maWcpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGUoSU9JbnRlcmZhY2UgJGlvLCBDb21wb3NlciAkY29tcG9zZXIpOiBzZWxmCnsKcmV0dXJuIG5ldyBzdGF0aWMoCiRpbywKJGNvbXBvc2VyLT5nZXRDb25maWcoKSwKJGNvbXBvc2VyLT5nZXRQYWNrYWdlKCksCiRjb21wb3Nlci0+Z2V0RG93bmxvYWRNYW5hZ2VyKCksCiRjb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKSwKJGNvbXBvc2VyLT5nZXRMb2NrZXIoKSwKJGNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCksCiRjb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCksCiRjb21wb3Nlci0+Z2V0QXV0b2xvYWRHZW5lcmF0b3IoKQopOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWdub3JlZFR5cGVzKGFycmF5ICR0eXBlcyk6IHNlbGYKewokdGhpcy0+aWdub3JlZFR5cGVzID0gJHR5cGVzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QWxsb3dlZFR5cGVzKD9hcnJheSAkdHlwZXMpOiBzZWxmCnsKJHRoaXMtPmFsbG93ZWRUeXBlcyA9ICR0eXBlczsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFkZGl0aW9uYWxGaXhlZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkYWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSk6IHNlbGYKewokdGhpcy0+YWRkaXRpb25hbEZpeGVkUmVwb3NpdG9yeSA9ICRhZGRpdGlvbmFsRml4ZWRSZXBvc2l0b3J5OwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoYXJyYXkgJGNvbnN0cmFpbnRzKTogc2VsZgp7CiR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cyA9ICRjb25zdHJhaW50czsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERyeVJ1bihib29sICRkcnlSdW4gPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5kcnlSdW4gPSAkZHJ5UnVuOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEcnlSdW4oKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZHJ5UnVuOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RG93bmxvYWRPbmx5KGJvb2wgJGRvd25sb2FkT25seSA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmRvd25sb2FkT25seSA9ICRkb3dubG9hZE9ubHk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJTb3VyY2UoYm9vbCAkcHJlZmVyU291cmNlID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cHJlZmVyU291cmNlID0gJHByZWZlclNvdXJjZTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlckRpc3QoYm9vbCAkcHJlZmVyRGlzdCA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPnByZWZlckRpc3QgPSAkcHJlZmVyRGlzdDsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGltaXplQXV0b2xvYWRlcihib29sICRvcHRpbWl6ZUF1dG9sb2FkZXIpOiBzZWxmCnsKJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlciA9ICRvcHRpbWl6ZUF1dG9sb2FkZXI7CmlmICghJHRoaXMtPm9wdGltaXplQXV0b2xvYWRlcikgewoKCiR0aGlzLT5zZXRDbGFzc01hcEF1dGhvcml0YXRpdmUoZmFsc2UpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKGJvb2wgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZSk6IHNlbGYKewokdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlID0gJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUpIHsKCiR0aGlzLT5zZXRPcHRpbWl6ZUF1dG9sb2FkZXIodHJ1ZSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFwY3VBdXRvbG9hZGVyKGJvb2wgJGFwY3VBdXRvbG9hZGVyLCA/c3RyaW5nICRhcGN1QXV0b2xvYWRlclByZWZpeCA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPmFwY3VBdXRvbG9hZGVyID0gJGFwY3VBdXRvbG9hZGVyOwokdGhpcy0+YXBjdUF1dG9sb2FkZXJQcmVmaXggPSAkYXBjdUF1dG9sb2FkZXJQcmVmaXg7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVcGRhdGUoYm9vbCAkdXBkYXRlKTogc2VsZgp7CiR0aGlzLT51cGRhdGUgPSAkdXBkYXRlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5zdGFsbChib29sICRpbnN0YWxsKTogc2VsZgp7CiR0aGlzLT5pbnN0YWxsID0gJGluc3RhbGw7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZNb2RlKGJvb2wgJGRldk1vZGUgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5kZXZNb2RlID0gJGRldk1vZGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldER1bXBBdXRvbG9hZGVyKGJvb2wgJGR1bXBBdXRvbG9hZGVyID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+ZHVtcEF1dG9sb2FkZXIgPSAkZHVtcEF1dG9sb2FkZXI7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UnVuU2NyaXB0cyhib29sICRydW5TY3JpcHRzID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cnVuU2NyaXB0cyA9ICRydW5TY3JpcHRzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKENvbmZpZyAkY29uZmlnKTogc2VsZgp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyYm9zZShib29sICR2ZXJib3NlID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+dmVyYm9zZSA9ICR2ZXJib3NlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnZlcmJvc2U7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJZ25vcmVQbGF0Zm9ybVJlcXVpcmVtZW50cygkaWdub3JlUGxhdGZvcm1SZXFzKTogc2VsZgp7CnRyaWdnZXJfZXJyb3IoJ0luc3RhbGxlcjo6c2V0SWdub3JlUGxhdGZvcm1SZXF1aXJlbWVudHMgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjIsIHVzZSBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKcmV0dXJuICR0aGlzLT5zZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkaWdub3JlUGxhdGZvcm1SZXFzKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2UgJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIpOiBzZWxmCnsKJHRoaXMtPnBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgPSAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcjsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZU1pcnJvcnMoYm9vbCAkdXBkYXRlTWlycm9ycyk6IHNlbGYKewokdGhpcy0+dXBkYXRlTWlycm9ycyA9ICR1cGRhdGVNaXJyb3JzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXBkYXRlQWxsb3dMaXN0KGFycmF5ICRwYWNrYWdlcyk6IHNlbGYKewppZiAoY291bnQoJHBhY2thZ2VzKSA9PT0gMCkgewokdGhpcy0+dXBkYXRlQWxsb3dMaXN0ID0gbnVsbDsKfSBlbHNlIHsKJHRoaXMtPnVwZGF0ZUFsbG93TGlzdCA9IGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoYXJyYXlfbWFwKCdzdHJ0b2xvd2VyJywgJHBhY2thZ2VzKSkpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhpbnQgJHVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyk6IHNlbGYKewppZiAoIWluX2FycmF5KCR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMsIFtSZXF1ZXN0OjpVUERBVEVfT05MWV9MSVNURUQsIFJlcXVlc3Q6OlVQREFURV9MSVNURURfV0lUSF9UUkFOU0lUSVZFX0RFUFNfTk9fUk9PVF9SRVFVSVJFLCBSZXF1ZXN0OjpVUERBVEVfTElTVEVEX1dJVEhfVFJBTlNJVElWRV9ERVBTXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJJbnZhbGlkIHZhbHVlIGZvciB1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXMgc3VwcGxpZWQiKTsKfQoKJHRoaXMtPnVwZGF0ZUFsbG93VHJhbnNpdGl2ZURlcGVuZGVuY2llcyA9ICR1cGRhdGVBbGxvd1RyYW5zaXRpdmVEZXBlbmRlbmNpZXM7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcmVmZXJTdGFibGUoYm9vbCAkcHJlZmVyU3RhYmxlID0gdHJ1ZSk6IHNlbGYKewokdGhpcy0+cHJlZmVyU3RhYmxlID0gJHByZWZlclN0YWJsZTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlckxvd2VzdChib29sICRwcmVmZXJMb3dlc3QgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5wcmVmZXJMb3dlc3QgPSAkcHJlZmVyTG93ZXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNaW5pbWFsVXBkYXRlKGJvb2wgJG1pbmltYWxVcGRhdGUgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT5taW5pbWFsVXBkYXRlID0gJG1pbmltYWxVcGRhdGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFdyaXRlTG9jayhib29sICR3cml0ZUxvY2sgPSB0cnVlKTogc2VsZgp7CiR0aGlzLT53cml0ZUxvY2sgPSAkd3JpdGVMb2NrOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFeGVjdXRlT3BlcmF0aW9ucyhib29sICRleGVjdXRlT3BlcmF0aW9ucyA9IHRydWUpOiBzZWxmCnsKJHRoaXMtPmV4ZWN1dGVPcGVyYXRpb25zID0gJGV4ZWN1dGVPcGVyYXRpb25zOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdWRpdChib29sICRhdWRpdCk6IHNlbGYKewokdGhpcy0+YXVkaXQgPSAkYXVkaXQ7CiR0aGlzLT5hdWRpdENvbmZpZyA9IG51bGw7IAoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXJyb3JPbkF1ZGl0KGJvb2wgJGVycm9yT25BdWRpdCk6IHNlbGYKewokdGhpcy0+ZXJyb3JPbkF1ZGl0ID0gJGVycm9yT25BdWRpdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdWRpdEZvcm1hdChzdHJpbmcgJGF1ZGl0Rm9ybWF0KTogc2VsZgp7CiR0aGlzLT5hdWRpdEZvcm1hdCA9ICRhdWRpdEZvcm1hdDsKJHRoaXMtPmF1ZGl0Q29uZmlnID0gbnVsbDsgCgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdWRpdENvbmZpZyhBdWRpdENvbmZpZyAkYXVkaXRDb25maWcpOiBzZWxmCnsKJHRoaXMtPmF1ZGl0Q29uZmlnID0gJGF1ZGl0Q29uZmlnOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGVQbHVnaW5zKCk6IHNlbGYKewokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlci0+ZGlzYWJsZVBsdWdpbnMoKTsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFN1Z2dlc3RlZFBhY2thZ2VzUmVwb3J0ZXIoU3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciAkc3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlcik6IHNlbGYKewokdGhpcy0+c3VnZ2VzdGVkUGFja2FnZXNSZXBvcnRlciA9ICRzdWdnZXN0ZWRQYWNrYWdlc1JlcG9ydGVyOwoKcmV0dXJuICR0aGlzOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CgoKCgoKCgoKY2xhc3MgQmluYXJ5SW5zdGFsbGVyCnsKCnByb3RlY3RlZCAkYmluRGlyOwoKcHJvdGVjdGVkICRiaW5Db21wYXQ7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRmaWxlc3lzdGVtOwoKcHJpdmF0ZSAkdmVuZG9yRGlyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgc3RyaW5nICRiaW5EaXIsIHN0cmluZyAkYmluQ29tcGF0LCA/RmlsZXN5c3RlbSAkZmlsZXN5c3RlbSA9IG51bGwsID9zdHJpbmcgJHZlbmRvckRpciA9IG51bGwpCnsKJHRoaXMtPmJpbkRpciA9ICRiaW5EaXI7CiR0aGlzLT5iaW5Db21wYXQgPSAkYmluQ29tcGF0OwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW0oKTsKJHRoaXMtPnZlbmRvckRpciA9ICR2ZW5kb3JEaXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsQmluYXJpZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRpbnN0YWxsUGF0aCwgYm9vbCAkd2Fybk9uT3ZlcndyaXRlID0gdHJ1ZSk6IHZvaWQKewokYmluYXJpZXMgPSAkdGhpcy0+Z2V0QmluYXJpZXMoJHBhY2thZ2UpOwppZiAoISRiaW5hcmllcykgewpyZXR1cm47Cn0KClBsYXRmb3JtOjp3b3JrYXJvdW5kRmlsZXN5c3RlbUlzc3VlcygpOwoKZm9yZWFjaCAoJGJpbmFyaWVzIGFzICRiaW4pIHsKJGJpblBhdGggPSAkaW5zdGFsbFBhdGguJy8nLiRiaW47CmlmICghZmlsZV9leGlzdHMoJGJpblBhdGgpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIDx3YXJuaW5nPlNraXBwZWQgaW5zdGFsbGF0aW9uIG9mIGJpbiAnLiRiaW4uJyBmb3IgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogZmlsZSBub3QgZm91bmQgaW4gcGFja2FnZTwvd2FybmluZz4nKTsKY29udGludWU7Cn0KaWYgKGlzX2RpcigkYmluUGF0aCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgPHdhcm5pbmc+U2tpcHBlZCBpbnN0YWxsYXRpb24gb2YgYmluICcuJGJpbi4nIGZvciBwYWNrYWdlICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nOiBmb3VuZCBhIGRpcmVjdG9yeSBhdCB0aGF0IHBhdGg8L3dhcm5pbmc+Jyk7CmNvbnRpbnVlOwp9CmlmICghJHRoaXMtPmZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCRiaW5QYXRoKSkgewoKCgoKJGJpblBhdGggPSByZWFscGF0aCgkYmluUGF0aCk7Cn0KJHRoaXMtPmluaXRpYWxpemVCaW5EaXIoKTsKJGxpbmsgPSAkdGhpcy0+YmluRGlyLicvJy5iYXNlbmFtZSgkYmluKTsKaWYgKGZpbGVfZXhpc3RzKCRsaW5rKSkgewppZiAoIWlzX2xpbmsoJGxpbmspKSB7CmlmICgkd2Fybk9uT3ZlcndyaXRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignICAgIFNraXBwZWQgaW5zdGFsbGF0aW9uIG9mIGJpbiAnLiRiaW4uJyBmb3IgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogbmFtZSBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBmaWxlJyk7Cn0KY29udGludWU7Cn0KaWYgKHJlYWxwYXRoKCRsaW5rKSA9PT0gcmVhbHBhdGgoJGJpblBhdGgpKSB7CgokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRsaW5rKTsKfQp9CgokYmluQ29tcGF0ID0gJHRoaXMtPmJpbkNvbXBhdDsKaWYgKCRiaW5Db21wYXQgPT09ICJhdXRvIiAmJiAoUGxhdGZvcm06OmlzV2luZG93cygpIHx8IFBsYXRmb3JtOjppc1dpbmRvd3NTdWJzeXN0ZW1Gb3JMaW51eCgpKSkgewokYmluQ29tcGF0ID0gJ2Z1bGwnOwp9CgppZiAoJGJpbkNvbXBhdCA9PT0gImZ1bGwiKSB7CiR0aGlzLT5pbnN0YWxsRnVsbEJpbmFyaWVzKCRiaW5QYXRoLCAkbGluaywgJGJpbiwgJHBhY2thZ2UpOwp9IGVsc2UgewokdGhpcy0+aW5zdGFsbFVuaXh5UHJveHlCaW5hcmllcygkYmluUGF0aCwgJGxpbmspOwp9ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICRiaW5QYXRoLCAwNzc3ICYgfnVtYXNrKCkpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVCaW5hcmllcyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5pbml0aWFsaXplQmluRGlyKCk7CgokYmluYXJpZXMgPSAkdGhpcy0+Z2V0QmluYXJpZXMoJHBhY2thZ2UpOwppZiAoISRiaW5hcmllcykgewpyZXR1cm47Cn0KZm9yZWFjaCAoJGJpbmFyaWVzIGFzICRiaW4pIHsKJGxpbmsgPSAkdGhpcy0+YmluRGlyLicvJy5iYXNlbmFtZSgkYmluKTsKaWYgKGlzX2xpbmsoJGxpbmspIHx8IGZpbGVfZXhpc3RzKCRsaW5rKSkgeyAKJHRoaXMtPmZpbGVzeXN0ZW0tPnVubGluaygkbGluayk7Cn0KaWYgKGlzX2ZpbGUoJGxpbmsuJy5iYXQnKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+dW5saW5rKCRsaW5rLicuYmF0Jyk7Cn0KfQoKCmlmIChpc19kaXIoJHRoaXMtPmJpbkRpcikgJiYgJHRoaXMtPmZpbGVzeXN0ZW0tPmlzRGlyRW1wdHkoJHRoaXMtPmJpbkRpcikpIHsKU2lsZW5jZXI6OmNhbGwoJ3JtZGlyJywgJHRoaXMtPmJpbkRpcik7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXRlcm1pbmVCaW5hcnlDYWxsZXIoc3RyaW5nICRiaW4pOiBzdHJpbmcKewppZiAoJy5iYXQnID09PSBzdWJzdHIoJGJpbiwgLTQpIHx8ICcuZXhlJyA9PT0gc3Vic3RyKCRiaW4sIC00KSkgewpyZXR1cm4gJ2NhbGwnOwp9CgokaGFuZGxlID0gZm9wZW4oJGJpbiwgJ3InKTsKJGxpbmUgPSBmZ2V0cygkaGFuZGxlKTsKZmNsb3NlKCRoYW5kbGUpOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14jIS8oPzp1c3IvYmluL2VudiApPyg/OlteL10rLykqKC4rKSR9bScsIChzdHJpbmcpICRsaW5lLCAkbWF0Y2gpKSB7CnJldHVybiB0cmltKCRtYXRjaFsxXSk7Cn0KCnJldHVybiAncGhwJzsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldEJpbmFyaWVzKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CnJldHVybiAkcGFja2FnZS0+Z2V0QmluYXJpZXMoKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluc3RhbGxGdWxsQmluYXJpZXMoc3RyaW5nICRiaW5QYXRoLCBzdHJpbmcgJGxpbmssIHN0cmluZyAkYmluLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CgppZiAoJy5iYXQnICE9PSBzdWJzdHIoJGJpblBhdGgsIC00KSkgewokdGhpcy0+aW5zdGFsbFVuaXh5UHJveHlCaW5hcmllcygkYmluUGF0aCwgJGxpbmspOwokbGluayAuPSAnLmJhdCc7CmlmIChmaWxlX2V4aXN0cygkbGluaykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgU2tpcHBlZCBpbnN0YWxsYXRpb24gb2YgYmluICcuJGJpbi4nLmJhdCBwcm94eSBmb3IgcGFja2FnZSAnLiRwYWNrYWdlLT5nZXROYW1lKCkuJzogYSAuYmF0IHByb3h5IHdhcyBhbHJlYWR5IGluc3RhbGxlZCcpOwp9Cn0KaWYgKCFmaWxlX2V4aXN0cygkbGluaykpIHsKZmlsZV9wdXRfY29udGVudHMoJGxpbmssICR0aGlzLT5nZW5lcmF0ZVdpbmRvd3NQcm94eUNvZGUoJGJpblBhdGgsICRsaW5rKSk7ClNpbGVuY2VyOjpjYWxsKCdjaG1vZCcsICRsaW5rLCAwNzc3ICYgfnVtYXNrKCkpOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbnN0YWxsVW5peHlQcm94eUJpbmFyaWVzKHN0cmluZyAkYmluUGF0aCwgc3RyaW5nICRsaW5rKTogdm9pZAp7CmZpbGVfcHV0X2NvbnRlbnRzKCRsaW5rLCAkdGhpcy0+Z2VuZXJhdGVVbml4eVByb3h5Q29kZSgkYmluUGF0aCwgJGxpbmspKTsKU2lsZW5jZXI6OmNhbGwoJ2NobW9kJywgJGxpbmssIDA3NzcgJiB+dW1hc2soKSk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplQmluRGlyKCk6IHZvaWQKewokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0aGlzLT5iaW5EaXIpOwokdGhpcy0+YmluRGlyID0gcmVhbHBhdGgoJHRoaXMtPmJpbkRpcik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVdpbmRvd3NQcm94eUNvZGUoc3RyaW5nICRiaW4sIHN0cmluZyAkbGluayk6IHN0cmluZwp7CiRiaW5QYXRoID0gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGgoJGxpbmssICRiaW4pOwokY2FsbGVyID0gc2VsZjo6ZGV0ZXJtaW5lQmluYXJ5Q2FsbGVyKCRiaW4pOwoKCgoKaWYgKCRjYWxsZXIgPT09ICdwaHAnKSB7CnJldHVybiAiQEVDSE8gT0ZGXHJcbiIuCiJzZXRsb2NhbCBESVNBQkxFREVMQVlFREVYUEFOU0lPTlxyXG4iLgoiU0VUIEJJTl9UQVJHRVQ9JX5kcDAvIi50cmltKFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKGJhc2VuYW1lKCRsaW5rLCAnLmJhdCcpKSwgJyJcJycpLiJcclxuIi4KIlNFVCBDT01QT1NFUl9SVU5USU1FX0JJTl9ESVI9JX5kcDBcclxuIi4KInskY2FsbGVyfSBcIiVCSU5fVEFSR0VUJVwiICUqXHJcbiI7Cn0KCnJldHVybiAiQEVDSE8gT0ZGXHJcbiIuCiJzZXRsb2NhbCBESVNBQkxFREVMQVlFREVYUEFOU0lPTlxyXG4iLgoiU0VUIEJJTl9UQVJHRVQ9JX5kcDAvIi50cmltKFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRiaW5QYXRoKSwgJyJcJycpLiJcclxuIi4KIlNFVCBDT01QT1NFUl9SVU5USU1FX0JJTl9ESVI9JX5kcDBcclxuIi4KInskY2FsbGVyfSBcIiVCSU5fVEFSR0VUJVwiICUqXHJcbiI7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVVuaXh5UHJveHlDb2RlKHN0cmluZyAkYmluLCBzdHJpbmcgJGxpbmspOiBzdHJpbmcKewokYmluUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRsaW5rLCAkYmluKTsKCiRiaW5EaXIgPSBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZShkaXJuYW1lKCRiaW5QYXRoKSk7CiRiaW5GaWxlID0gYmFzZW5hbWUoJGJpblBhdGgpOwoKJGJpbkNvbnRlbnRzID0gKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGJpbiwgZmFsc2UsIG51bGwsIDAsIDUwMCk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKCMhLipccj9cbik/W1xyXG5cdCBdKjxcP3BocH0nLCAkYmluQ29udGVudHMsICRtYXRjaCkpIHsKCiRwcm94eUNvZGUgPSAkbWF0Y2hbMV0gPT09IG51bGwgPyAnIyEvdXNyL2Jpbi9lbnYgcGhwJyA6IHRyaW0oJG1hdGNoWzFdKTsKJGJpblBhdGhFeHBvcnRlZCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoQ29kZSgkbGluaywgJGJpbiwgZmFsc2UsIHRydWUpOwokc3RyZWFtUHJveHlDb2RlID0gJHN0cmVhbUhpbnQgPSAnJzsKJGdsb2JhbHNDb2RlID0gJyRHTE9CQUxTW1wnX2NvbXBvc2VyX2Jpbl9kaXJcJ10gPSBfX0RJUl9fOycuIlxuIjsKJHBocHVuaXRIYWNrMSA9ICRwaHB1bml0SGFjazIgPSAnJzsKCmlmICgkdGhpcy0+dmVuZG9yRGlyICE9PSBudWxsKSB7CgokdmVuZG9yRGlyUmVhbCA9IHJlYWxwYXRoKCR0aGlzLT52ZW5kb3JEaXIpOwppZiAoJHZlbmRvckRpclJlYWwgPT09IGZhbHNlKSB7CiR2ZW5kb3JEaXJSZWFsID0gJHRoaXMtPnZlbmRvckRpcjsKfQokZ2xvYmFsc0NvZGUgLj0gJyRHTE9CQUxTW1wnX2NvbXBvc2VyX2F1dG9sb2FkX3BhdGhcJ10gPSAnIC4gJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbmRTaG9ydGVzdFBhdGhDb2RlKCRsaW5rLCAkdmVuZG9yRGlyUmVhbCAuICcvYXV0b2xvYWQucGhwJywgZmFsc2UsIHRydWUpLiI7XG4iOwp9CgppZiAoJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgoJGJpbikgPT09ICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKCR0aGlzLT52ZW5kb3JEaXIuJy9waHB1bml0L3BocHVuaXQvcGhwdW5pdCcpKSB7CgokZ2xvYmFsc0NvZGUgLj0gJyRHTE9CQUxTW1wnX19QSFBVTklUX0lTT0xBVElPTl9FWENMVURFX0xJU1RcJ10gPSAkR0xPQkFMU1tcJ19fUEhQVU5JVF9JU09MQVRJT05fQkxBQ0tMSVNUXCddID0gYXJyYXkocmVhbHBhdGgoJy4kYmluUGF0aEV4cG9ydGVkLicpKTsnLiJcbiI7CgokcGhwdW5pdEhhY2sxID0gIidwaHB2ZnNjb21wb3NlcjovLycuIjsKJHBocHVuaXRIYWNrMiA9ICcKICAgICAgICAgICAgICAgICRkYXRhID0gc3RyX3JlcGxhY2UoXCdfX0RJUl9fXCcsIHZhcl9leHBvcnQoZGlybmFtZSgkdGhpcy0+cmVhbHBhdGgpLCB0cnVlKSwgJGRhdGEpOwogICAgICAgICAgICAgICAgJGRhdGEgPSBzdHJfcmVwbGFjZShcJ19fRklMRV9fXCcsIHZhcl9leHBvcnQoJHRoaXMtPnJlYWxwYXRoLCB0cnVlKSwgJGRhdGEpOyc7Cn0KaWYgKHRyaW0oJG1hdGNoWzBdKSAhPT0gJzw/cGhwJykgewokc3RyZWFtSGludCA9ICcgdXNpbmcgYSBzdHJlYW0gd3JhcHBlciB0byBwcmV2ZW50IHRoZSBzaGViYW5nIGZyb20gYmVpbmcgb3V0cHV0IG9uIFBIUDw4Jy4iXG4gKiI7CiRzdHJlYW1Qcm94eUNvZGUgPSA8PDxTVFJFQU1QUk9YWQppZiAoUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewogICAgaWYgKCFjbGFzc19leGlzdHMoJ0NvbXBvc2VyXEJpblByb3h5V3JhcHBlcicpKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGludGVybmFsCiAgICAgICAgICovCiAgICAgICAgZmluYWwgY2xhc3MgQmluUHJveHlXcmFwcGVyCiAgICAgICAgewogICAgICAgICAgICBwcml2YXRlIFwkaGFuZGxlOwogICAgICAgICAgICBwcml2YXRlIFwkcG9zaXRpb247CiAgICAgICAgICAgIHByaXZhdGUgXCRyZWFscGF0aDsKCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fb3BlbihcJHBhdGgsIFwkbW9kZSwgXCRvcHRpb25zLCAmXCRvcGVuZWRfcGF0aCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gZ2V0IHJpZCBvZiBwaHB2ZnNjb21wb3NlcjovLyBwcmVmaXggZm9yIF9fRklMRV9fICYgX19ESVJfXyByZXNvbHV0aW9uCiAgICAgICAgICAgICAgICBcJG9wZW5lZF9wYXRoID0gc3Vic3RyKFwkcGF0aCwgMTcpOwogICAgICAgICAgICAgICAgXCR0aGlzLT5yZWFscGF0aCA9IHJlYWxwYXRoKFwkb3BlbmVkX3BhdGgpID86IFwkb3BlbmVkX3BhdGg7CiAgICAgICAgICAgICAgICBcJG9wZW5lZF9wYXRoID0gJHBocHVuaXRIYWNrMVwkdGhpcy0+cmVhbHBhdGg7CiAgICAgICAgICAgICAgICBcJHRoaXMtPmhhbmRsZSA9IGZvcGVuKFwkdGhpcy0+cmVhbHBhdGgsIFwkbW9kZSk7CiAgICAgICAgICAgICAgICBcJHRoaXMtPnBvc2l0aW9uID0gMDsKCiAgICAgICAgICAgICAgICByZXR1cm4gKGJvb2wpIFwkdGhpcy0+aGFuZGxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX3JlYWQoXCRjb3VudCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgXCRkYXRhID0gZnJlYWQoXCR0aGlzLT5oYW5kbGUsIFwkY291bnQpOwoKICAgICAgICAgICAgICAgIGlmIChcJHRoaXMtPnBvc2l0aW9uID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgXCRkYXRhID0gcHJlZ19yZXBsYWNlKCd7XiMhLipcXHI/XFxufScsICcnLCBcJGRhdGEpOwogICAgICAgICAgICAgICAgfSRwaHB1bml0SGFjazIKCiAgICAgICAgICAgICAgICBcJHRoaXMtPnBvc2l0aW9uICs9IHN0cmxlbihcJGRhdGEpOwoKICAgICAgICAgICAgICAgIHJldHVybiBcJGRhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fY2FzdChcJGNhc3RBcykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIFwkdGhpcy0+aGFuZGxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2Nsb3NlKCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZmNsb3NlKFwkdGhpcy0+aGFuZGxlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9sb2NrKFwkb3BlcmF0aW9uKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gXCRvcGVyYXRpb24gPyBmbG9jayhcJHRoaXMtPmhhbmRsZSwgXCRvcGVyYXRpb24pIDogdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zZWVrKFwkb2Zmc2V0LCBcJHdoZW5jZSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKDAgPT09IGZzZWVrKFwkdGhpcy0+aGFuZGxlLCBcJG9mZnNldCwgXCR3aGVuY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgXCR0aGlzLT5wb3NpdGlvbiA9IGZ0ZWxsKFwkdGhpcy0+aGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fdGVsbCgpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJHRoaXMtPnBvc2l0aW9uOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gc3RyZWFtX2VvZigpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiBmZW9mKFwkdGhpcy0+aGFuZGxlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVibGljIGZ1bmN0aW9uIHN0cmVhbV9zdGF0KCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1YmxpYyBmdW5jdGlvbiBzdHJlYW1fc2V0X29wdGlvbihcJG9wdGlvbiwgXCRhcmcxLCBcJGFyZzIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdWJsaWMgZnVuY3Rpb24gdXJsX3N0YXQoXCRwYXRoLCBcJGZsYWdzKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBcJHBhdGggPSBzdWJzdHIoXCRwYXRoLCAxNyk7CiAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoXCRwYXRoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0KFwkcGF0aCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICgKICAgICAgICAoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1fZ2V0X3dyYXBwZXJzJykgJiYgaW5fYXJyYXkoJ3BocHZmc2NvbXBvc2VyJywgc3RyZWFtX2dldF93cmFwcGVycygpLCB0cnVlKSkKICAgICAgICB8fCAoZnVuY3Rpb25fZXhpc3RzKCdzdHJlYW1fd3JhcHBlcl9yZWdpc3RlcicpICYmIHN0cmVhbV93cmFwcGVyX3JlZ2lzdGVyKCdwaHB2ZnNjb21wb3NlcicsICdDb21wb3NlclxCaW5Qcm94eVdyYXBwZXInKSkKICAgICkgewogICAgICAgIHJldHVybiBpbmNsdWRlKCJwaHB2ZnNjb21wb3NlcjovLyIgLiAkYmluUGF0aEV4cG9ydGVkKTsKICAgIH0KfQoKU1RSRUFNUFJPWFk7Cn0KCnJldHVybiAkcHJveHlDb2RlIC4gIlxuIiAuIDw8PFBST1hZCjw/cGhwCgovKioKICogUHJveHkgUEhQIGZpbGUgZ2VuZXJhdGVkIGJ5IENvbXBvc2VyCiAqCiAqIFRoaXMgZmlsZSBpbmNsdWRlcyB0aGUgcmVmZXJlbmNlZCBiaW4gcGF0aCAoJGJpblBhdGgpCiAqJHN0cmVhbUhpbnQKICogQGdlbmVyYXRlZAogKi8KCm5hbWVzcGFjZSBDb21wb3NlcjsKCiRnbG9iYWxzQ29kZQokc3RyZWFtUHJveHlDb2RlCnJldHVybiBpbmNsdWRlICRiaW5QYXRoRXhwb3J0ZWQ7CgpQUk9YWTsKfQoKcmV0dXJuIDw8PFBST1hZCiMhL3Vzci9iaW4vZW52IHNoCgojIFN1cHBvcnQgYmFzaCB0byBzdXBwb3J0IGBzb3VyY2VgIHdpdGggZmFsbGJhY2sgb24gJDAgaWYgdGhpcyBkb2VzIG5vdCBydW4gd2l0aCBiYXNoCiMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzM1MDA2NTA1LzY1MTIKc2VsZkFyZz0iXCRCQVNIX1NPVVJDRSIKaWYgWyAteiAiXCRzZWxmQXJnIiBdOyB0aGVuCiAgICBzZWxmQXJnPSJcJDAiCmZpCgpzZWxmPVwkKHJlYWxwYXRoICJcJHNlbGZBcmciIDI+IC9kZXYvbnVsbCkKaWYgWyAteiAiXCRzZWxmIiBdOyB0aGVuCiAgICBzZWxmPSJcJHNlbGZBcmciCmZpCgpkaXI9XCQoY2QgIlwke3NlbGYlWy9cXFxcXSp9IiA+IC9kZXYvbnVsbDsgY2QgJGJpbkRpciAmJiBwd2QpCgppZiBbIC1kIC9wcm9jL2N5Z2RyaXZlIF07IHRoZW4KICAgIGNhc2UgXCQod2hpY2ggcGhwKSBpbgogICAgICAgIFwkKHJlYWRsaW5rIC1uIC9wcm9jL2N5Z2RyaXZlKS8qKQogICAgICAgICAgICAjIFdlIGFyZSBpbiBDeWd3aW4gdXNpbmcgV2luZG93cyBwaHAsIHNvIHRoZSBwYXRoIG11c3QgYmUgdHJhbnNsYXRlZAogICAgICAgICAgICBkaXI9XCQoY3lncGF0aCAtbSAiXCRkaXIiKTsKICAgICAgICAgICAgOzsKICAgIGVzYWMKZmkKCmV4cG9ydCBDT01QT1NFUl9SVU5USU1FX0JJTl9ESVI9IlwkKGNkICJcJHtzZWxmJVsvXFxcXF0qfSIgPiAvZGV2L251bGw7IHB3ZCkiCgojIElmIGJhc2ggaXMgc291cmNpbmcgdGhpcyBmaWxlLCB3ZSBoYXZlIHRvIHNvdXJjZSB0aGUgdGFyZ2V0IGFzIHdlbGwKYmFzaFNvdXJjZT0iXCRCQVNIX1NPVVJDRSIKaWYgWyAtbiAiXCRiYXNoU291cmNlIiBdOyB0aGVuCiAgICBpZiBbICJcJGJhc2hTb3VyY2UiICE9ICJcJDAiIF07IHRoZW4KICAgICAgICBzb3VyY2UgIlwke2Rpcn0vJGJpbkZpbGUiICJcJEAiCiAgICAgICAgcmV0dXJuCiAgICBmaQpmaQoKZXhlYyAiXCR7ZGlyfS8kYmluRmlsZSIgIlwkQCIKClBST1hZOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBCaW5hcnlQcmVzZW5jZUludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5zdXJlQmluYXJpZXNQcmVzZW5jZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cQ29uc29sZUlPOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE9wZXJhdGlvbkludGVyZmFjZTsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVXBkYXRlT3BlcmF0aW9uOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxVbmluc3RhbGxPcGVyYXRpb247CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXE1hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cTWFya0FsaWFzVW5pbnN0YWxsZWRPcGVyYXRpb247CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXEZpbGVEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFV0aWxcTG9vcDsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBTZWxkXFNpZ25hbFxTaWduYWxIYW5kbGVyOwoKCgoKCgoKCmNsYXNzIEluc3RhbGxhdGlvbk1hbmFnZXIKewoKcHJpdmF0ZSAkaW5zdGFsbGVycyA9IFtdOwoKcHJpdmF0ZSAkY2FjaGUgPSBbXTsKCnByaXZhdGUgJG5vdGlmaWFibGVQYWNrYWdlcyA9IFtdOwoKcHJpdmF0ZSAkbG9vcDsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkZXZlbnREaXNwYXRjaGVyOwoKcHJpdmF0ZSAkb3V0cHV0UHJvZ3Jlc3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoTG9vcCAkbG9vcCwgSU9JbnRlcmZhY2UgJGlvLCA/RXZlbnREaXNwYXRjaGVyICRldmVudERpc3BhdGNoZXIgPSBudWxsKQp7CiR0aGlzLT5sb29wID0gJGxvb3A7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciA9ICRldmVudERpc3BhdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKJHRoaXMtPm5vdGlmaWFibGVQYWNrYWdlcyA9IFtdOwpGaWxlRG93bmxvYWRlcjo6JGRvd25sb2FkTWV0YWRhdGEgPSBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkSW5zdGFsbGVyKEluc3RhbGxlckludGVyZmFjZSAkaW5zdGFsbGVyKTogdm9pZAp7CmFycmF5X3Vuc2hpZnQoJHRoaXMtPmluc3RhbGxlcnMsICRpbnN0YWxsZXIpOwokdGhpcy0+Y2FjaGUgPSBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSW5zdGFsbGVyKEluc3RhbGxlckludGVyZmFjZSAkaW5zdGFsbGVyKTogdm9pZAp7CmlmIChmYWxzZSAhPT0gKCRrZXkgPSBhcnJheV9zZWFyY2goJGluc3RhbGxlciwgJHRoaXMtPmluc3RhbGxlcnMsIHRydWUpKSkgewphcnJheV9zcGxpY2UoJHRoaXMtPmluc3RhbGxlcnMsICRrZXksIDEpOwokdGhpcy0+Y2FjaGUgPSBbXTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGVQbHVnaW5zKCk6IHZvaWQKewpmb3JlYWNoICgkdGhpcy0+aW5zdGFsbGVycyBhcyAkaSA9PiAkaW5zdGFsbGVyKSB7CmlmICghJGluc3RhbGxlciBpbnN0YW5jZW9mIFBsdWdpbkluc3RhbGxlcikgewpjb250aW51ZTsKfQoKJGluc3RhbGxlci0+ZGlzYWJsZVBsdWdpbnMoKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxlcihzdHJpbmcgJHR5cGUpOiBJbnN0YWxsZXJJbnRlcmZhY2UKewokdHlwZSA9IHN0cnRvbG93ZXIoJHR5cGUpOwoKaWYgKGlzc2V0KCR0aGlzLT5jYWNoZVskdHlwZV0pKSB7CnJldHVybiAkdGhpcy0+Y2FjaGVbJHR5cGVdOwp9Cgpmb3JlYWNoICgkdGhpcy0+aW5zdGFsbGVycyBhcyAkaW5zdGFsbGVyKSB7CmlmICgkaW5zdGFsbGVyLT5zdXBwb3J0cygkdHlwZSkpIHsKcmV0dXJuICR0aGlzLT5jYWNoZVskdHlwZV0gPSAkaW5zdGFsbGVyOwp9Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbmtub3duIGluc3RhbGxlciB0eXBlOiAnLiR0eXBlKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUGFja2FnZUluc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpyZXR1cm4gJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpICYmICR0aGlzLT5pc1BhY2thZ2VJbnN0YWxsZWQoJHJlcG8sICRwYWNrYWdlLT5nZXRBbGlhc09mKCkpOwp9CgpyZXR1cm4gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKS0+aXNJbnN0YWxsZWQoJHJlcG8sICRwYWNrYWdlKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewp0cnkgewokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKfSBjYXRjaCAoXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewoKcmV0dXJuOwp9CgoKaWYgKCRpbnN0YWxsZXIgaW5zdGFuY2VvZiBCaW5hcnlQcmVzZW5jZUludGVyZmFjZSkgewokaW5zdGFsbGVyLT5lbnN1cmVCaW5hcmllc1ByZXNlbmNlKCRwYWNrYWdlKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBhcnJheSAkb3BlcmF0aW9ucywgYm9vbCAkZGV2TW9kZSA9IHRydWUsIGJvb2wgJHJ1blNjcmlwdHMgPSB0cnVlLCBib29sICRkb3dubG9hZE9ubHkgPSBmYWxzZSk6IHZvaWQKewoKJGNsZWFudXBQcm9taXNlcyA9IFtdOwoKJHNpZ25hbEhhbmRsZXIgPSBTaWduYWxIYW5kbGVyOjpjcmVhdGUoW1NpZ25hbEhhbmRsZXI6OlNJR0lOVCwgU2lnbmFsSGFuZGxlcjo6U0lHVEVSTSwgU2lnbmFsSGFuZGxlcjo6U0lHSFVQXSwgZnVuY3Rpb24gKHN0cmluZyAkc2lnbmFsLCBTaWduYWxIYW5kbGVyICRoYW5kbGVyKSB1c2UgKCYkY2xlYW51cFByb21pc2VzKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmVjZWl2ZWQgJy4kc2lnbmFsLicsIGFib3J0aW5nJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnJ1bkNsZWFudXAoJGNsZWFudXBQcm9taXNlcyk7CiRoYW5kbGVyLT5leGl0V2l0aExhc3RTaWduYWwoKTsKfSk7Cgp0cnkgewoKCiRiYXRjaGVzID0gW107CiRiYXRjaCA9IFtdOwpmb3JlYWNoICgkb3BlcmF0aW9ucyBhcyAkaW5kZXggPT4gJG9wZXJhdGlvbikgewppZiAoJG9wZXJhdGlvbiBpbnN0YW5jZW9mIFVwZGF0ZU9wZXJhdGlvbiB8fCAkb3BlcmF0aW9uIGluc3RhbmNlb2YgSW5zdGFsbE9wZXJhdGlvbikgewokcGFja2FnZSA9ICRvcGVyYXRpb24gaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24gPyAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCkgOiAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CmlmICgkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItcGx1Z2luJykgewokZXh0cmEgPSAkcGFja2FnZS0+Z2V0RXh0cmEoKTsKaWYgKGlzc2V0KCRleHRyYVsncGx1Z2luLW1vZGlmaWVzLWRvd25sb2FkcyddKSAmJiAkZXh0cmFbJ3BsdWdpbi1tb2RpZmllcy1kb3dubG9hZHMnXSA9PT0gdHJ1ZSkgewppZiAoY291bnQoJGJhdGNoKSA+IDApIHsKJGJhdGNoZXNbXSA9ICRiYXRjaDsKfQokYmF0Y2hlc1tdID0gWyRpbmRleCA9PiAkb3BlcmF0aW9uXTsKJGJhdGNoID0gW107Cgpjb250aW51ZTsKfQp9Cn0KJGJhdGNoWyRpbmRleF0gPSAkb3BlcmF0aW9uOwp9CgppZiAoY291bnQoJGJhdGNoKSA+IDApIHsKJGJhdGNoZXNbXSA9ICRiYXRjaDsKfQoKZm9yZWFjaCAoJGJhdGNoZXMgYXMgJGJhdGNoVG9FeGVjdXRlKSB7CiR0aGlzLT5kb3dubG9hZEFuZEV4ZWN1dGVCYXRjaCgkcmVwbywgJGJhdGNoVG9FeGVjdXRlLCAkY2xlYW51cFByb21pc2VzLCAkZGV2TW9kZSwgJHJ1blNjcmlwdHMsICRkb3dubG9hZE9ubHksICRvcGVyYXRpb25zKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5ydW5DbGVhbnVwKCRjbGVhbnVwUHJvbWlzZXMpOwoKdGhyb3cgJGU7Cn0gZmluYWxseSB7CiRzaWduYWxIYW5kbGVyLT51bnJlZ2lzdGVyKCk7Cn0KCmlmICgkZG93bmxvYWRPbmx5KSB7CnJldHVybjsKfQoKCgoKJHJlcG8tPndyaXRlKCRkZXZNb2RlLCAkdGhpcyk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb3dubG9hZEFuZEV4ZWN1dGVCYXRjaChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBhcnJheSAkb3BlcmF0aW9ucywgYXJyYXkgJiRjbGVhbnVwUHJvbWlzZXMsIGJvb2wgJGRldk1vZGUsIGJvb2wgJHJ1blNjcmlwdHMsIGJvb2wgJGRvd25sb2FkT25seSwgYXJyYXkgJGFsbE9wZXJhdGlvbnMpOiB2b2lkCnsKJHByb21pc2VzID0gW107Cgpmb3JlYWNoICgkb3BlcmF0aW9ucyBhcyAkaW5kZXggPT4gJG9wZXJhdGlvbikgewokb3BUeXBlID0gJG9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpOwoKCmlmICghaW5fYXJyYXkoJG9wVHlwZSwgWyd1cGRhdGUnLCAnaW5zdGFsbCcsICd1bmluc3RhbGwnXSwgdHJ1ZSkpIHsKY29udGludWU7Cn0KCmlmICgkb3BUeXBlID09PSAndXBkYXRlJykgewoKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCk7CiRpbml0aWFsUGFja2FnZSA9ICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCk7Cn0gZWxzZSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gbnVsbDsKfQokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKCiRjbGVhbnVwUHJvbWlzZXNbJGluZGV4XSA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRvcFR5cGUsICRpbnN0YWxsZXIsICRwYWNrYWdlLCAkaW5pdGlhbFBhY2thZ2UpOiA/UHJvbWlzZUludGVyZmFjZSB7CgoKaWYgKG51bGwgPT09ICRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKcmV0dXJuICRpbnN0YWxsZXItPmNsZWFudXAoJG9wVHlwZSwgJHBhY2thZ2UsICRpbml0aWFsUGFja2FnZSk7Cn07CgppZiAoJG9wVHlwZSAhPT0gJ3VuaW5zdGFsbCcpIHsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5kb3dubG9hZCgkcGFja2FnZSwgJGluaXRpYWxQYWNrYWdlKTsKaWYgKG51bGwgIT09ICRwcm9taXNlKSB7CiRwcm9taXNlc1tdID0gJHByb21pc2U7Cn0KfQp9CgoKaWYgKGNvdW50KCRwcm9taXNlcykgPiAwKSB7CiR0aGlzLT53YWl0T25Qcm9taXNlcygkcHJvbWlzZXMpOwp9CgppZiAoJGRvd25sb2FkT25seSkgewokdGhpcy0+cnVuQ2xlYW51cCgkY2xlYW51cFByb21pc2VzKTsKCnJldHVybjsKfQoKCgokYmF0Y2hlcyA9IFtdOwokYmF0Y2ggPSBbXTsKZm9yZWFjaCAoJG9wZXJhdGlvbnMgYXMgJGluZGV4ID0+ICRvcGVyYXRpb24pIHsKaWYgKCRvcGVyYXRpb24gaW5zdGFuY2VvZiBJbnN0YWxsT3BlcmF0aW9uIHx8ICRvcGVyYXRpb24gaW5zdGFuY2VvZiBVcGRhdGVPcGVyYXRpb24pIHsKJHBhY2thZ2UgPSAkb3BlcmF0aW9uIGluc3RhbmNlb2YgVXBkYXRlT3BlcmF0aW9uID8gJG9wZXJhdGlvbi0+Z2V0VGFyZ2V0UGFja2FnZSgpIDogJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwppZiAoJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicgfHwgJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLWluc3RhbGxlcicpIHsKaWYgKGNvdW50KCRiYXRjaCkgPiAwKSB7CiRiYXRjaGVzW10gPSAkYmF0Y2g7Cn0KJGJhdGNoZXNbXSA9IFskaW5kZXggPT4gJG9wZXJhdGlvbl07CiRiYXRjaCA9IFtdOwoKY29udGludWU7Cn0KfQokYmF0Y2hbJGluZGV4XSA9ICRvcGVyYXRpb247Cn0KCmlmIChjb3VudCgkYmF0Y2gpID4gMCkgewokYmF0Y2hlc1tdID0gJGJhdGNoOwp9Cgpmb3JlYWNoICgkYmF0Y2hlcyBhcyAkYmF0Y2hUb0V4ZWN1dGUpIHsKJHRoaXMtPmV4ZWN1dGVCYXRjaCgkcmVwbywgJGJhdGNoVG9FeGVjdXRlLCAkY2xlYW51cFByb21pc2VzLCAkZGV2TW9kZSwgJHJ1blNjcmlwdHMsICRhbGxPcGVyYXRpb25zKTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZXhlY3V0ZUJhdGNoKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBhcnJheSAkY2xlYW51cFByb21pc2VzLCBib29sICRkZXZNb2RlLCBib29sICRydW5TY3JpcHRzLCBhcnJheSAkYWxsT3BlcmF0aW9ucyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKJHBvc3RFeGVjQ2FsbGJhY2tzID0gW107Cgpmb3JlYWNoICgkb3BlcmF0aW9ucyBhcyAkaW5kZXggPT4gJG9wZXJhdGlvbikgewokb3BUeXBlID0gJG9wZXJhdGlvbi0+Z2V0T3BlcmF0aW9uVHlwZSgpOwoKCmlmICghaW5fYXJyYXkoJG9wVHlwZSwgWyd1cGRhdGUnLCAnaW5zdGFsbCcsICd1bmluc3RhbGwnXSwgdHJ1ZSkpIHsKCmlmICgkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgLSAnIC4gJG9wZXJhdGlvbi0+c2hvdyhmYWxzZSkpOwp9CiR0aGlzLT57JG9wVHlwZX0oJHJlcG8sICRvcGVyYXRpb24pOwoKY29udGludWU7Cn0KCmlmICgkb3BUeXBlID09PSAndXBkYXRlJykgewoKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRUYXJnZXRQYWNrYWdlKCk7CiRpbml0aWFsUGFja2FnZSA9ICRvcGVyYXRpb24tPmdldEluaXRpYWxQYWNrYWdlKCk7Cn0gZWxzZSB7CgokcGFja2FnZSA9ICRvcGVyYXRpb24tPmdldFBhY2thZ2UoKTsKJGluaXRpYWxQYWNrYWdlID0gbnVsbDsKfQoKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJHBhY2thZ2UtPmdldFR5cGUoKSk7CgokZXZlbnROYW1lID0gWwonaW5zdGFsbCcgPT4gUGFja2FnZUV2ZW50czo6UFJFX1BBQ0tBR0VfSU5TVEFMTCwKJ3VwZGF0ZScgPT4gUGFja2FnZUV2ZW50czo6UFJFX1BBQ0tBR0VfVVBEQVRFLAondW5pbnN0YWxsJyA9PiBQYWNrYWdlRXZlbnRzOjpQUkVfUEFDS0FHRV9VTklOU1RBTEwsCl1bJG9wVHlwZV07CgppZiAoJHJ1blNjcmlwdHMgJiYgJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciAhPT0gbnVsbCkgewokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaFBhY2thZ2VFdmVudCgkZXZlbnROYW1lLCAkZGV2TW9kZSwgJHJlcG8sICRhbGxPcGVyYXRpb25zLCAkb3BlcmF0aW9uKTsKfQoKJGRpc3BhdGNoZXIgPSAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyOwokaW8gPSAkdGhpcy0+aW87CgokcHJvbWlzZSA9ICRpbnN0YWxsZXItPnByZXBhcmUoJG9wVHlwZSwgJHBhY2thZ2UsICRpbml0aWFsUGFja2FnZSk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRwcm9taXNlID0gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCRvcFR5cGUsICRyZXBvLCAkb3BlcmF0aW9uKSB7CnJldHVybiAkdGhpcy0+eyRvcFR5cGV9KCRyZXBvLCAkb3BlcmF0aW9uKTsKfSktPnRoZW4oJGNsZWFudXBQcm9taXNlc1skaW5kZXhdKQotPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkZGV2TW9kZSwgJHJlcG8pOiB2b2lkIHsKJHJlcG8tPndyaXRlKCRkZXZNb2RlLCAkdGhpcyk7Cn0sIHN0YXRpYyBmdW5jdGlvbiAoJGUpIHVzZSAoJG9wVHlwZSwgJHBhY2thZ2UsICRpbyk6IHZvaWQgewokaW8tPndyaXRlRXJyb3IoJyAgICA8ZXJyb3I+JyAuIHVjZmlyc3QoJG9wVHlwZSkgLicgb2YgJy4kcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLicgZmFpbGVkPC9lcnJvcj4nKTsKCnRocm93ICRlOwp9KTsKCiRldmVudE5hbWUgPSBbCidpbnN0YWxsJyA9PiBQYWNrYWdlRXZlbnRzOjpQT1NUX1BBQ0tBR0VfSU5TVEFMTCwKJ3VwZGF0ZScgPT4gUGFja2FnZUV2ZW50czo6UE9TVF9QQUNLQUdFX1VQREFURSwKJ3VuaW5zdGFsbCcgPT4gUGFja2FnZUV2ZW50czo6UE9TVF9QQUNLQUdFX1VOSU5TVEFMTCwKXVskb3BUeXBlXTsKCmlmICgkcnVuU2NyaXB0cyAmJiAkZGlzcGF0Y2hlciAhPT0gbnVsbCkgewokcG9zdEV4ZWNDYWxsYmFja3NbXSA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRkaXNwYXRjaGVyLCAkZXZlbnROYW1lLCAkZGV2TW9kZSwgJHJlcG8sICRhbGxPcGVyYXRpb25zLCAkb3BlcmF0aW9uKTogdm9pZCB7CiRkaXNwYXRjaGVyLT5kaXNwYXRjaFBhY2thZ2VFdmVudCgkZXZlbnROYW1lLCAkZGV2TW9kZSwgJHJlcG8sICRhbGxPcGVyYXRpb25zLCAkb3BlcmF0aW9uKTsKfTsKfQoKJHByb21pc2VzW10gPSAkcHJvbWlzZTsKfQoKCmlmIChjb3VudCgkcHJvbWlzZXMpID4gMCkgewokdGhpcy0+d2FpdE9uUHJvbWlzZXMoJHByb21pc2VzKTsKfQoKUGxhdGZvcm06Ondvcmthcm91bmRGaWxlc3lzdGVtSXNzdWVzKCk7Cgpmb3JlYWNoICgkcG9zdEV4ZWNDYWxsYmFja3MgYXMgJGNiKSB7CiRjYigpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gd2FpdE9uUHJvbWlzZXMoYXJyYXkgJHByb21pc2VzKTogdm9pZAp7CiRwcm9ncmVzcyA9IG51bGw7CmlmICgKJHRoaXMtPm91dHB1dFByb2dyZXNzCiYmICR0aGlzLT5pbyBpbnN0YW5jZW9mIENvbnNvbGVJTwomJiAhKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDSScpKQomJiAhJHRoaXMtPmlvLT5pc0RlYnVnKCkKJiYgY291bnQoJHByb21pc2VzKSA+IDEKKSB7CiRwcm9ncmVzcyA9ICR0aGlzLT5pby0+Z2V0UHJvZ3Jlc3NCYXIoKTsKfQokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMsICRwcm9ncmVzcyk7CmlmICgkcHJvZ3Jlc3MgIT09IG51bGwpIHsKJHByb2dyZXNzLT5jbGVhcigpOwoKaWYgKCEkdGhpcy0+aW8tPmlzRGVjb3JhdGVkKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnKTsKfQp9Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/UHJvbWlzZUludGVyZmFjZQp7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwokcHJvbWlzZSA9ICRpbnN0YWxsZXItPmNsZWFudXAoImluc3RhbGwiLCAkcGFja2FnZSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBJbnN0YWxsT3BlcmF0aW9uICRvcGVyYXRpb24pOiA/UHJvbWlzZUludGVyZmFjZQp7CiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkcGFja2FnZS0+Z2V0VHlwZSgpKTsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5pbnN0YWxsKCRyZXBvLCAkcGFja2FnZSk7CiR0aGlzLT5tYXJrRm9yTm90aWZpY2F0aW9uKCRwYWNrYWdlKTsKCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgVXBkYXRlT3BlcmF0aW9uICRvcGVyYXRpb24pOiA/UHJvbWlzZUludGVyZmFjZQp7CiRpbml0aWFsID0gJG9wZXJhdGlvbi0+Z2V0SW5pdGlhbFBhY2thZ2UoKTsKJHRhcmdldCA9ICRvcGVyYXRpb24tPmdldFRhcmdldFBhY2thZ2UoKTsKCiRpbml0aWFsVHlwZSA9ICRpbml0aWFsLT5nZXRUeXBlKCk7CiR0YXJnZXRUeXBlID0gJHRhcmdldC0+Z2V0VHlwZSgpOwoKaWYgKCRpbml0aWFsVHlwZSA9PT0gJHRhcmdldFR5cGUpIHsKJGluc3RhbGxlciA9ICR0aGlzLT5nZXRJbnN0YWxsZXIoJGluaXRpYWxUeXBlKTsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT51cGRhdGUoJHJlcG8sICRpbml0aWFsLCAkdGFyZ2V0KTsKJHRoaXMtPm1hcmtGb3JOb3RpZmljYXRpb24oJHRhcmdldCk7Cn0gZWxzZSB7CiRwcm9taXNlID0gJHRoaXMtPmdldEluc3RhbGxlcigkaW5pdGlhbFR5cGUpLT51bmluc3RhbGwoJHJlcG8sICRpbml0aWFsKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokaW5zdGFsbGVyID0gJHRoaXMtPmdldEluc3RhbGxlcigkdGFyZ2V0VHlwZSk7CiRwcm9taXNlID0gJHByb21pc2UtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGluc3RhbGxlciwgJHJlcG8sICR0YXJnZXQpOiBQcm9taXNlSW50ZXJmYWNlIHsKJHByb21pc2UgPSAkaW5zdGFsbGVyLT5pbnN0YWxsKCRyZXBvLCAkdGFyZ2V0KTsKaWYgKCRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewpyZXR1cm4gJHByb21pc2U7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9KTsKfQoKcmV0dXJuICRwcm9taXNlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBVbmluc3RhbGxPcGVyYXRpb24gJG9wZXJhdGlvbik6ID9Qcm9taXNlSW50ZXJmYWNlCnsKJHBhY2thZ2UgPSAkb3BlcmF0aW9uLT5nZXRQYWNrYWdlKCk7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwoKcmV0dXJuICRpbnN0YWxsZXItPnVuaW5zdGFsbCgkcmVwbywgJHBhY2thZ2UpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWFya0FsaWFzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIE1hcmtBbGlhc0luc3RhbGxlZE9wZXJhdGlvbiAkb3BlcmF0aW9uKTogdm9pZAp7CiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwoKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKJHJlcG8tPmFkZFBhY2thZ2UoY2xvbmUgJHBhY2thZ2UpOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtYXJrQWxpYXNVbmluc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBNYXJrQWxpYXNVbmluc3RhbGxlZE9wZXJhdGlvbiAkb3BlcmF0aW9uKTogdm9pZAp7CiRwYWNrYWdlID0gJG9wZXJhdGlvbi0+Z2V0UGFja2FnZSgpOwoKJHJlcG8tPnJlbW92ZVBhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogP3N0cmluZwp7CiRpbnN0YWxsZXIgPSAkdGhpcy0+Z2V0SW5zdGFsbGVyKCRwYWNrYWdlLT5nZXRUeXBlKCkpOwoKcmV0dXJuICRpbnN0YWxsZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldE91dHB1dFByb2dyZXNzKGJvb2wgJG91dHB1dFByb2dyZXNzKTogdm9pZAp7CiR0aGlzLT5vdXRwdXRQcm9ncmVzcyA9ICRvdXRwdXRQcm9ncmVzczsKfQoKcHVibGljIGZ1bmN0aW9uIG5vdGlmeUluc3RhbGxzKElPSW50ZXJmYWNlICRpbyk6IHZvaWQKewokcHJvbWlzZXMgPSBbXTsKCnRyeSB7CmZvcmVhY2ggKCR0aGlzLT5ub3RpZmlhYmxlUGFja2FnZXMgYXMgJHJlcG9VcmwgPT4gJHBhY2thZ2VzKSB7CgppZiAoc3RyX2NvbnRhaW5zKCRyZXBvVXJsLCAnJXBhY2thZ2UlJykpIHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CiR1cmwgPSBzdHJfcmVwbGFjZSgnJXBhY2thZ2UlJywgJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKSwgJHJlcG9VcmwpOwoKJHBhcmFtcyA9IFsKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksCid2ZXJzaW9uX25vcm1hbGl6ZWQnID0+ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksCl07CiRvcHRzID0gWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKJ2h0dHAnID0+IFsKJ21ldGhvZCcgPT4gJ1BPU1QnLAonaGVhZGVyJyA9PiBbJ0NvbnRlbnQtdHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ10sCidjb250ZW50JyA9PiBodHRwX2J1aWxkX3F1ZXJ5KCRwYXJhbXMsICcnLCAnJicpLAondGltZW91dCcgPT4gMywKXSwKXTsKCiRwcm9taXNlc1tdID0gJHRoaXMtPmxvb3AtPmdldEh0dHBEb3dubG9hZGVyKCktPmFkZCgkdXJsLCAkb3B0cyk7Cn0KCmNvbnRpbnVlOwp9CgokcG9zdERhdGEgPSBbJ2Rvd25sb2FkcycgPT4gW11dOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2VOb3RpZmljYXRpb24gPSBbCiduYW1lJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLAondmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFZlcnNpb24oKSwKXTsKaWYgKHN0cnBvcygkcmVwb1VybCwgJ3BhY2thZ2lzdC5vcmcvJykgIT09IGZhbHNlKSB7CmlmIChpc3NldChGaWxlRG93bmxvYWRlcjo6JGRvd25sb2FkTWV0YWRhdGFbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRwYWNrYWdlTm90aWZpY2F0aW9uWydkb3dubG9hZGVkJ10gPSBGaWxlRG93bmxvYWRlcjo6JGRvd25sb2FkTWV0YWRhdGFbJHBhY2thZ2UtPmdldE5hbWUoKV07Cn0gZWxzZSB7CiRwYWNrYWdlTm90aWZpY2F0aW9uWydkb3dubG9hZGVkJ10gPSBmYWxzZTsKfQp9CiRwb3N0RGF0YVsnZG93bmxvYWRzJ11bXSA9ICRwYWNrYWdlTm90aWZpY2F0aW9uOwp9Cgokb3B0cyA9IFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCidodHRwJyA9PiBbCidtZXRob2QnID0+ICdQT1NUJywKJ2hlYWRlcicgPT4gWydDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24nXSwKJ2NvbnRlbnQnID0+IGpzb25fZW5jb2RlKCRwb3N0RGF0YSksCid0aW1lb3V0JyA9PiA2LApdLApdOwoKJHByb21pc2VzW10gPSAkdGhpcy0+bG9vcC0+Z2V0SHR0cERvd25sb2FkZXIoKS0+YWRkKCRyZXBvVXJsLCAkb3B0cyk7Cn0KCiR0aGlzLT5sb29wLT53YWl0KCRwcm9taXNlcyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQoKJHRoaXMtPnJlc2V0KCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya0Zvck5vdGlmaWNhdGlvbihQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmlmICgkcGFja2FnZS0+Z2V0Tm90aWZpY2F0aW9uVXJsKCkgIT09IG51bGwpIHsKJHRoaXMtPm5vdGlmaWFibGVQYWNrYWdlc1skcGFja2FnZS0+Z2V0Tm90aWZpY2F0aW9uVXJsKCldWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBydW5DbGVhbnVwKGFycmF5ICRjbGVhbnVwUHJvbWlzZXMpOiB2b2lkCnsKJHByb21pc2VzID0gW107CgokdGhpcy0+bG9vcC0+YWJvcnRKb2JzKCk7Cgpmb3JlYWNoICgkY2xlYW51cFByb21pc2VzIGFzICRjbGVhbnVwKSB7CiRwcm9taXNlc1tdID0gbmV3IFxSZWFjdFxQcm9taXNlXFByb21pc2Uoc3RhdGljIGZ1bmN0aW9uICgkcmVzb2x2ZSkgdXNlICgkY2xlYW51cCk6IHZvaWQgewokcHJvbWlzZSA9ICRjbGVhbnVwKCk7CmlmICghJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CiRyZXNvbHZlKG51bGwpOwp9IGVsc2UgewokcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkcmVzb2x2ZSk6IHZvaWQgewokcmVzb2x2ZShudWxsKTsKfSk7Cn0KfSk7Cn0KCmlmIChjb3VudCgkcHJvbWlzZXMpID4gMCkgewokdGhpcy0+bG9vcC0+d2FpdCgkcHJvbWlzZXMpOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFRyYW5zYWN0aW9uOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgpjbGFzcyBJbnN0YWxsZXJFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkY29tcG9zZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGU7CgoKCgpwcml2YXRlICRleGVjdXRlT3BlcmF0aW9uczsKCgoKCnByaXZhdGUgJHRyYW5zYWN0aW9uOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZXZlbnROYW1lLCBDb21wb3NlciAkY29tcG9zZXIsIElPSW50ZXJmYWNlICRpbywgYm9vbCAkZGV2TW9kZSwgYm9vbCAkZXhlY3V0ZU9wZXJhdGlvbnMsIFRyYW5zYWN0aW9uICR0cmFuc2FjdGlvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRldmVudE5hbWUpOwoKJHRoaXMtPmNvbXBvc2VyID0gJGNvbXBvc2VyOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5kZXZNb2RlID0gJGRldk1vZGU7CiR0aGlzLT5leGVjdXRlT3BlcmF0aW9ucyA9ICRleGVjdXRlT3BlcmF0aW9uczsKJHRoaXMtPnRyYW5zYWN0aW9uID0gJHRyYW5zYWN0aW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoKTogQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZXZNb2RlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0V4ZWN1dGluZ09wZXJhdGlvbnMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZXhlY3V0ZU9wZXJhdGlvbnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc2FjdGlvbigpOiA/VHJhbnNhY3Rpb24KewpyZXR1cm4gJHRoaXMtPnRyYW5zYWN0aW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCmNsYXNzIEluc3RhbGxlckV2ZW50cwp7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9PUEVSQVRJT05TX0VYRUMgPSAncHJlLW9wZXJhdGlvbnMtZXhlYyc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgppbnRlcmZhY2UgSW5zdGFsbGVySW50ZXJmYWNlCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0luc3RhbGxlZChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOwoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZShzdHJpbmcgJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCk7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk7CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoc3RyaW5nICR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhcnRpYWxDb21wb3NlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxEb3dubG9hZE1hbmFnZXI7CgoKCgoKCgpjbGFzcyBMaWJyYXJ5SW5zdGFsbGVyIGltcGxlbWVudHMgSW5zdGFsbGVySW50ZXJmYWNlLCBCaW5hcnlQcmVzZW5jZUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGNvbXBvc2VyOwoKcHJvdGVjdGVkICR2ZW5kb3JEaXI7Cgpwcm90ZWN0ZWQgJGRvd25sb2FkTWFuYWdlcjsKCnByb3RlY3RlZCAkaW87Cgpwcm90ZWN0ZWQgJHR5cGU7Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcm90ZWN0ZWQgJGJpbmFyeUluc3RhbGxlcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIFBhcnRpYWxDb21wb3NlciAkY29tcG9zZXIsID9zdHJpbmcgJHR5cGUgPSAnbGlicmFyeScsID9GaWxlc3lzdGVtICRmaWxlc3lzdGVtID0gbnVsbCwgP0JpbmFyeUluc3RhbGxlciAkYmluYXJ5SW5zdGFsbGVyID0gbnVsbCkKewokdGhpcy0+Y29tcG9zZXIgPSAkY29tcG9zZXI7CiR0aGlzLT5kb3dubG9hZE1hbmFnZXIgPSAkY29tcG9zZXIgaW5zdGFuY2VvZiBDb21wb3NlciA/ICRjb21wb3Nlci0+Z2V0RG93bmxvYWRNYW5hZ2VyKCkgOiBudWxsOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT50eXBlID0gJHR5cGU7CgokdGhpcy0+ZmlsZXN5c3RlbSA9ICRmaWxlc3lzdGVtID86IG5ldyBGaWxlc3lzdGVtKCk7CiR0aGlzLT52ZW5kb3JEaXIgPSBydHJpbSgkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3ZlbmRvci1kaXInKSwgJy8nKTsKJHRoaXMtPmJpbmFyeUluc3RhbGxlciA9ICRiaW5hcnlJbnN0YWxsZXIgPzogbmV3IEJpbmFyeUluc3RhbGxlcigkdGhpcy0+aW8sIHJ0cmltKCRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYmluLWRpcicpLCAnLycpLCAkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2Jpbi1jb21wYXQnKSwgJHRoaXMtPmZpbGVzeXN0ZW0sICR0aGlzLT52ZW5kb3JEaXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSkKewpyZXR1cm4gJHBhY2thZ2VUeXBlID09PSAkdGhpcy0+dHlwZSB8fCBudWxsID09PSAkdGhpcy0+dHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKaWYgKEZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJGluc3RhbGxQYXRoKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkdGhpcy0+ZmlsZXN5c3RlbS0+aXNKdW5jdGlvbigkaW5zdGFsbFBhdGgpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNfbGluaygkaW5zdGFsbFBhdGgpKSB7CmlmIChyZWFscGF0aCgkaW5zdGFsbFBhdGgpID09PSBmYWxzZSkgewpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkb3dubG9hZChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXplVmVuZG9yRGlyKCk7CiRkb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICR0aGlzLT5nZXREb3dubG9hZE1hbmFnZXIoKS0+ZG93bmxvYWQoJHBhY2thZ2UsICRkb3dubG9hZFBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXplVmVuZG9yRGlyKCk7CiRkb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICR0aGlzLT5nZXREb3dubG9hZE1hbmFnZXIoKS0+cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICRkb3dubG9hZFBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbGVhbnVwKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXplVmVuZG9yRGlyKCk7CiRkb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICR0aGlzLT5nZXREb3dubG9hZE1hbmFnZXIoKS0+Y2xlYW51cCgkdHlwZSwgJHBhY2thZ2UsICRkb3dubG9hZFBhdGgsICRwcmV2UGFja2FnZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnN0YWxsKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSk7CgoKaWYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRkb3dubG9hZFBhdGgpICYmICRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokdGhpcy0+YmluYXJ5SW5zdGFsbGVyLT5yZW1vdmVCaW5hcmllcygkcGFja2FnZSk7Cn0KCiRwcm9taXNlID0gJHRoaXMtPmluc3RhbGxDb2RlKCRwYWNrYWdlKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokYmluYXJ5SW5zdGFsbGVyID0gJHRoaXMtPmJpbmFyeUluc3RhbGxlcjsKJGluc3RhbGxQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKCnJldHVybiAkcHJvbWlzZS0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgkYmluYXJ5SW5zdGFsbGVyLCAkaW5zdGFsbFBhdGgsICRwYWNrYWdlLCAkcmVwbyk6IHZvaWQgewokYmluYXJ5SW5zdGFsbGVyLT5pbnN0YWxsQmluYXJpZXMoJHBhY2thZ2UsICRpbnN0YWxsUGF0aCk7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKfQp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVwZGF0ZShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQpCnsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkaW5pdGlhbCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BhY2thZ2UgaXMgbm90IGluc3RhbGxlZDogJy4kaW5pdGlhbCk7Cn0KCiR0aGlzLT5pbml0aWFsaXplVmVuZG9yRGlyKCk7CgokdGhpcy0+YmluYXJ5SW5zdGFsbGVyLT5yZW1vdmVCaW5hcmllcygkaW5pdGlhbCk7CiRwcm9taXNlID0gJHRoaXMtPnVwZGF0ZUNvZGUoJGluaXRpYWwsICR0YXJnZXQpOwppZiAoISRwcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZUludGVyZmFjZSkgewokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCiRiaW5hcnlJbnN0YWxsZXIgPSAkdGhpcy0+YmluYXJ5SW5zdGFsbGVyOwokaW5zdGFsbFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHRhcmdldCk7CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJGJpbmFyeUluc3RhbGxlciwgJGluc3RhbGxQYXRoLCAkdGFyZ2V0LCAkaW5pdGlhbCwgJHJlcG8pOiB2b2lkIHsKJGJpbmFyeUluc3RhbGxlci0+aW5zdGFsbEJpbmFyaWVzKCR0YXJnZXQsICRpbnN0YWxsUGF0aCk7CiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRpbml0aWFsKTsKaWYgKCEkcmVwby0+aGFzUGFja2FnZSgkdGFyZ2V0KSkgewokcmVwby0+YWRkUGFja2FnZShjbG9uZSAkdGFyZ2V0KTsKfQp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJHBhY2thZ2UpOwp9CgokcHJvbWlzZSA9ICR0aGlzLT5yZW1vdmVDb2RlKCRwYWNrYWdlKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgokYmluYXJ5SW5zdGFsbGVyID0gJHRoaXMtPmJpbmFyeUluc3RhbGxlcjsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRQYWNrYWdlQmFzZVBhdGgoJHBhY2thZ2UpOwokZmlsZXN5c3RlbSA9ICR0aGlzLT5maWxlc3lzdGVtOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCRiaW5hcnlJbnN0YWxsZXIsICRmaWxlc3lzdGVtLCAkZG93bmxvYWRQYXRoLCAkcGFja2FnZSwgJHJlcG8pOiB2b2lkIHsKJGJpbmFyeUluc3RhbGxlci0+cmVtb3ZlQmluYXJpZXMoJHBhY2thZ2UpOwokcmVwby0+cmVtb3ZlUGFja2FnZSgkcGFja2FnZSk7CgppZiAoc3RycG9zKCRwYWNrYWdlLT5nZXROYW1lKCksICcvJykpIHsKJHBhY2thZ2VWZW5kb3JEaXIgPSBkaXJuYW1lKCRkb3dubG9hZFBhdGgpOwppZiAoaXNfZGlyKCRwYWNrYWdlVmVuZG9yRGlyKSAmJiAkZmlsZXN5c3RlbS0+aXNEaXJFbXB0eSgkcGFja2FnZVZlbmRvckRpcikpIHsKU2lsZW5jZXI6OmNhbGwoJ3JtZGlyJywgJHBhY2thZ2VWZW5kb3JEaXIpOwp9Cn0KfSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJHRoaXMtPmluaXRpYWxpemVWZW5kb3JEaXIoKTsKCiRiYXNlUGF0aCA9ICgkdGhpcy0+dmVuZG9yRGlyID8gJHRoaXMtPnZlbmRvckRpci4nLycgOiAnJykgLiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpOwokdGFyZ2V0RGlyID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwoKcmV0dXJuICRiYXNlUGF0aCAuICgkdGFyZ2V0RGlyID8gJy8nLiR0YXJnZXREaXIgOiAnJyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZUJpbmFyaWVzUHJlc2VuY2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGhpcy0+YmluYXJ5SW5zdGFsbGVyLT5pbnN0YWxsQmluYXJpZXMoJHBhY2thZ2UsICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkcGFja2FnZSksIGZhbHNlKTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UGFja2FnZUJhc2VQYXRoKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJGluc3RhbGxQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKJHRhcmdldERpciA9ICRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKTsKCmlmICgkdGFyZ2V0RGlyKSB7CnJldHVybiBQcmVnOjpyZXBsYWNlKCd7LyonLnN0cl9yZXBsYWNlKCcvJywgJy8rJywgcHJlZ19xdW90ZSgkdGFyZ2V0RGlyKSkuJy8/JH0nLCAnJywgJGluc3RhbGxQYXRoKTsKfQoKcmV0dXJuICRpbnN0YWxsUGF0aDsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbnN0YWxsQ29kZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiRkb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICR0aGlzLT5nZXREb3dubG9hZE1hbmFnZXIoKS0+aW5zdGFsbCgkcGFja2FnZSwgJGRvd25sb2FkUGF0aCk7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlQ29kZShQYWNrYWdlSW50ZXJmYWNlICRpbml0aWFsLCBQYWNrYWdlSW50ZXJmYWNlICR0YXJnZXQpCnsKJGluaXRpYWxEb3dubG9hZFBhdGggPSAkdGhpcy0+Z2V0SW5zdGFsbFBhdGgoJGluaXRpYWwpOwokdGFyZ2V0RG93bmxvYWRQYXRoID0gJHRoaXMtPmdldEluc3RhbGxQYXRoKCR0YXJnZXQpOwppZiAoJHRhcmdldERvd25sb2FkUGF0aCAhPT0gJGluaXRpYWxEb3dubG9hZFBhdGgpIHsKCgppZiAoc3RycG9zKCRpbml0aWFsRG93bmxvYWRQYXRoLCAkdGFyZ2V0RG93bmxvYWRQYXRoKSA9PT0gMAp8fCBzdHJwb3MoJHRhcmdldERvd25sb2FkUGF0aCwgJGluaXRpYWxEb3dubG9hZFBhdGgpID09PSAwCikgewokcHJvbWlzZSA9ICR0aGlzLT5yZW1vdmVDb2RlKCRpbml0aWFsKTsKaWYgKCEkcHJvbWlzZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKJHByb21pc2UgPSBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgpyZXR1cm4gJHByb21pc2UtPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkdGFyZ2V0KTogUHJvbWlzZUludGVyZmFjZSB7CiRwcm9taXNlID0gJHRoaXMtPmluc3RhbGxDb2RlKCR0YXJnZXQpOwppZiAoJHByb21pc2UgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnJldHVybiAkcHJvbWlzZTsKfQoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0pOwp9CgokdGhpcy0+ZmlsZXN5c3RlbS0+cmVuYW1lKCRpbml0aWFsRG93bmxvYWRQYXRoLCAkdGFyZ2V0RG93bmxvYWRQYXRoKTsKfQoKcmV0dXJuICR0aGlzLT5nZXREb3dubG9hZE1hbmFnZXIoKS0+dXBkYXRlKCRpbml0aWFsLCAkdGFyZ2V0LCAkdGFyZ2V0RG93bmxvYWRQYXRoKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZW1vdmVDb2RlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKJGRvd25sb2FkUGF0aCA9ICR0aGlzLT5nZXRQYWNrYWdlQmFzZVBhdGgoJHBhY2thZ2UpOwoKcmV0dXJuICR0aGlzLT5nZXREb3dubG9hZE1hbmFnZXIoKS0+cmVtb3ZlKCRwYWNrYWdlLCAkZG93bmxvYWRQYXRoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemVWZW5kb3JEaXIoKQp7CiR0aGlzLT5maWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRoaXMtPnZlbmRvckRpcik7CiR0aGlzLT52ZW5kb3JEaXIgPSByZWFscGF0aCgkdGhpcy0+dmVuZG9yRGlyKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERvd25sb2FkTWFuYWdlcigpOiBEb3dubG9hZE1hbmFnZXIKewphc3NlcnQoJHRoaXMtPmRvd25sb2FkTWFuYWdlciBpbnN0YW5jZW9mIERvd25sb2FkTWFuYWdlciwgbmV3IFxMb2dpY0V4Y2VwdGlvbihzZWxmOjpjbGFzcy4nIHNob3VsZCBiZSBpbml0aWFsaXplZCB3aXRoIGEgZnVsbHkgbG9hZGVkIENvbXBvc2VyIGluc3RhbmNlIHRvIGJlIGFibGUgdG8gaW5zdGFsbC8uLi4gcGFja2FnZXMnKSk7CgpyZXR1cm4gJHRoaXMtPmRvd25sb2FkTWFuYWdlcjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcT3BlcmF0aW9uXFVwZGF0ZU9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cSW5zdGFsbE9wZXJhdGlvbjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxPcGVyYXRpb25cVW5pbnN0YWxsT3BlcmF0aW9uOwoKCgoKCgpjbGFzcyBNZXRhcGFja2FnZUluc3RhbGxlciBpbXBsZW1lbnRzIEluc3RhbGxlckludGVyZmFjZQp7Cgpwcml2YXRlICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSkKewpyZXR1cm4gJHBhY2thZ2VUeXBlID09PSAnbWV0YXBhY2thZ2UnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWQoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFudXAoJHR5cGUsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigiICAtICIgLiBJbnN0YWxsT3BlcmF0aW9uOjpmb3JtYXQoJHBhY2thZ2UpKTsKCiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICRwYWNrYWdlKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRpbml0aWFsKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAnLiRpbml0aWFsKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVwZGF0ZU9wZXJhdGlvbjo6Zm9ybWF0KCRpbml0aWFsLCAkdGFyZ2V0KSk7CgokcmVwby0+cmVtb3ZlUGFja2FnZSgkaW5pdGlhbCk7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICR0YXJnZXQpOwoKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAnLiRwYWNrYWdlKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCIgIC0gIiAuIFVuaW5zdGFsbE9wZXJhdGlvbjo6Zm9ybWF0KCRwYWNrYWdlKSk7CgokcmVwby0+cmVtb3ZlUGFja2FnZSgkcGFja2FnZSk7CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxJbnN0YWxsZXI7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgoKCmNsYXNzIE5vb3BJbnN0YWxsZXIgaW1wbGVtZW50cyBJbnN0YWxsZXJJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gc3VwcG9ydHMoc3RyaW5nICRwYWNrYWdlVHlwZSkKewpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKcmV0dXJuICRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsID9QYWNrYWdlSW50ZXJmYWNlICRwcmV2UGFja2FnZSA9IG51bGwpCnsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUobnVsbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwYXJlKCR0eXBlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKQp7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluc3RhbGwoSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwbywgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRwYWNrYWdlKSkgewokcmVwby0+YWRkUGFja2FnZShjbG9uZSAkcGFja2FnZSk7Cn0KCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlKEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIFBhY2thZ2VJbnRlcmZhY2UgJGluaXRpYWwsIFBhY2thZ2VJbnRlcmZhY2UgJHRhcmdldCkKewppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCRpbml0aWFsKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUGFja2FnZSBpcyBub3QgaW5zdGFsbGVkOiAnLiRpbml0aWFsKTsKfQoKJHJlcG8tPnJlbW92ZVBhY2thZ2UoJGluaXRpYWwpOwppZiAoISRyZXBvLT5oYXNQYWNrYWdlKCR0YXJnZXQpKSB7CiRyZXBvLT5hZGRQYWNrYWdlKGNsb25lICR0YXJnZXQpOwp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZShudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHVuaW5zdGFsbChJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQ6ICcuJHBhY2thZ2UpOwp9CiRyZXBvLT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKG51bGwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokdGFyZ2V0RGlyID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwoKcmV0dXJuICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkgLiAoJHRhcmdldERpciA/ICcvJy4kdGFyZ2V0RGlyIDogJycpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEluc3RhbGxlcjsKCnVzZSBDb21wb3NlclxDb21wb3NlcjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXE9wZXJhdGlvblxPcGVyYXRpb25JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CgoKCgoKCmNsYXNzIFBhY2thZ2VFdmVudCBleHRlbmRzIEV2ZW50CnsKCgoKcHJpdmF0ZSAkY29tcG9zZXI7CgoKCgpwcml2YXRlICRpbzsKCgoKCnByaXZhdGUgJGRldk1vZGU7CgoKCgpwcml2YXRlICRsb2NhbFJlcG87CgoKCgpwcml2YXRlICRvcGVyYXRpb25zOwoKCgoKcHJpdmF0ZSAkb3BlcmF0aW9uOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRldmVudE5hbWUsIENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvLCBib29sICRkZXZNb2RlLCBSZXBvc2l0b3J5SW50ZXJmYWNlICRsb2NhbFJlcG8sIGFycmF5ICRvcGVyYXRpb25zLCBPcGVyYXRpb25JbnRlcmZhY2UgJG9wZXJhdGlvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRldmVudE5hbWUpOwoKJHRoaXMtPmNvbXBvc2VyID0gJGNvbXBvc2VyOwokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5kZXZNb2RlID0gJGRldk1vZGU7CiR0aGlzLT5sb2NhbFJlcG8gPSAkbG9jYWxSZXBvOwokdGhpcy0+b3BlcmF0aW9ucyA9ICRvcGVyYXRpb25zOwokdGhpcy0+b3BlcmF0aW9uID0gJG9wZXJhdGlvbjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VyKCk6IENvbXBvc2VyCnsKcmV0dXJuICR0aGlzLT5jb21wb3NlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldElPKCk6IElPSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5pbzsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRGV2TW9kZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5kZXZNb2RlOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxSZXBvKCk6IFJlcG9zaXRvcnlJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmxvY2FsUmVwbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdGlvbnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPm9wZXJhdGlvbnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcGVyYXRpb24oKTogT3BlcmF0aW9uSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5vcGVyYXRpb247Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKCgoKCgpjbGFzcyBQYWNrYWdlRXZlbnRzCnsKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfUEFDS0FHRV9JTlNUQUxMID0gJ3ByZS1wYWNrYWdlLWluc3RhbGwnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1BBQ0tBR0VfSU5TVEFMTCA9ICdwb3N0LXBhY2thZ2UtaW5zdGFsbCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QQUNLQUdFX1VQREFURSA9ICdwcmUtcGFja2FnZS11cGRhdGUnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1BBQ0tBR0VfVVBEQVRFID0gJ3Bvc3QtcGFja2FnZS11cGRhdGUnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfUEFDS0FHRV9VTklOU1RBTEwgPSAncHJlLXBhY2thZ2UtdW5pbnN0YWxsJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9QQUNLQUdFX1VOSU5TVEFMTCA9ICdwb3N0LXBhY2thZ2UtdW5pbnN0YWxsJzsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSW5zdGFsbGVyOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYXJ0aWFsQ29tcG9zZXI7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luTWFuYWdlcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBQbHVnaW5JbnN0YWxsZXIgZXh0ZW5kcyBMaWJyYXJ5SW5zdGFsbGVyCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgUGFydGlhbENvbXBvc2VyICRjb21wb3NlciwgP0ZpbGVzeXN0ZW0gJGZzID0gbnVsbCwgP0JpbmFyeUluc3RhbGxlciAkYmluYXJ5SW5zdGFsbGVyID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpbywgJGNvbXBvc2VyLCAnY29tcG9zZXItcGx1Z2luJywgJGZzLCAkYmluYXJ5SW5zdGFsbGVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkcGFja2FnZVR5cGUpCnsKcmV0dXJuICRwYWNrYWdlVHlwZSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicgfHwgJHBhY2thZ2VUeXBlID09PSAnY29tcG9zZXItaW5zdGFsbGVyJzsKfQoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGVQbHVnaW5zKCk6IHZvaWQKewokdGhpcy0+Z2V0UGx1Z2luTWFuYWdlcigpLT5kaXNhYmxlUGx1Z2lucygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJlcGFyZSgkdHlwZSwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgP1BhY2thZ2VJbnRlcmZhY2UgJHByZXZQYWNrYWdlID0gbnVsbCkKewoKaWYgKCgkdHlwZSA9PT0gJ2luc3RhbGwnIHx8ICR0eXBlID09PSAndXBkYXRlJykgJiYgISR0aGlzLT5nZXRQbHVnaW5NYW5hZ2VyKCktPmFyZVBsdWdpbnNEaXNhYmxlZCgnbG9jYWwnKSkgewokdGhpcy0+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/UGFja2FnZUludGVyZmFjZSAkb25seURlcGVuZGVudHNPZiA9IG51bGwpOiBhcnJheQp7CiRzdWdnZXN0ZWRQYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwokaW5zdGFsbGVkTmFtZXMgPSBbXTsKaWYgKG51bGwgIT09ICRpbnN0YWxsZWRSZXBvICYmICFlbXB0eSgkc3VnZ2VzdGVkUGFja2FnZXMpKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRSZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRpbnN0YWxsZWROYW1lcyA9IGFycmF5X21lcmdlKAokaW5zdGFsbGVkTmFtZXMsCiRwYWNrYWdlLT5nZXROYW1lcygpCik7Cn0KfQoKJHNvdXJjZUZpbHRlciA9IFtdOwppZiAoJG9ubHlEZXBlbmRlbnRzT2YpIHsKJHNvdXJjZUZpbHRlciA9IGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRsaW5rKTogc3RyaW5nIHsKcmV0dXJuICRsaW5rLT5nZXRUYXJnZXQoKTsKfSwgYXJyYXlfbWVyZ2UoJG9ubHlEZXBlbmRlbnRzT2YtPmdldFJlcXVpcmVzKCksICRvbmx5RGVwZW5kZW50c09mLT5nZXREZXZSZXF1aXJlcygpKSk7CiRzb3VyY2VGaWx0ZXJbXSA9ICRvbmx5RGVwZW5kZW50c09mLT5nZXROYW1lKCk7Cn0KCiRzdWdnZXN0aW9ucyA9IFtdOwpmb3JlYWNoICgkc3VnZ2VzdGVkUGFja2FnZXMgYXMgJHN1Z2dlc3Rpb24pIHsKaWYgKGluX2FycmF5KCRzdWdnZXN0aW9uWyd0YXJnZXQnXSwgJGluc3RhbGxlZE5hbWVzKSB8fCAoXGNvdW50KCRzb3VyY2VGaWx0ZXIpID4gMCAmJiAhaW5fYXJyYXkoJHN1Z2dlc3Rpb25bJ3NvdXJjZSddLCAkc291cmNlRmlsdGVyKSkpIHsKY29udGludWU7Cn0KCiRzdWdnZXN0aW9uc1tdID0gJHN1Z2dlc3Rpb247Cn0KCnJldHVybiAkc3VnZ2VzdGlvbnM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlT3V0cHV0KHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKcmV0dXJuIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKAokdGhpcy0+cmVtb3ZlQ29udHJvbENoYXJhY3RlcnMoJHN0cmluZykKKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZW1vdmVDb250cm9sQ2hhcmFjdGVycyhzdHJpbmcgJHN0cmluZyk6IHN0cmluZwp7CnJldHVybiBQcmVnOjpyZXBsYWNlKAonL1tbOmNudHJsOl1dLycsCicnLApzdHJfcmVwbGFjZSgiXG4iLCAnICcsICRzdHJpbmcpCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKdXNlIFNlbGRcSnNvbkxpbnRcSnNvblBhcnNlcjsKdXNlIFNlbGRcSnNvbkxpbnRcUGFyc2luZ0V4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwoKCgoKCgoKY2xhc3MgSnNvbkZpbGUKewpwdWJsaWMgY29uc3QgTEFYX1NDSEVNQSA9IDE7CnB1YmxpYyBjb25zdCBTVFJJQ1RfU0NIRU1BID0gMjsKcHVibGljIGNvbnN0IEFVVEhfU0NIRU1BID0gMzsKcHVibGljIGNvbnN0IExPQ0tfU0NIRU1BID0gNDsKCgpwdWJsaWMgY29uc3QgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyA9IDY0OwoKcHVibGljIGNvbnN0IEpTT05fUFJFVFRZX1BSSU5UID0gMTI4OwoKcHVibGljIGNvbnN0IEpTT05fVU5FU0NBUEVEX1VOSUNPREUgPSAyNTY7CgpwdWJsaWMgY29uc3QgQ09NUE9TRVJfU0NIRU1BX1BBVEggPSBfX0RJUl9fIC4gJy8uLi8uLi8uLi9yZXMvY29tcG9zZXItc2NoZW1hLmpzb24nOwpwdWJsaWMgY29uc3QgTE9DS19TQ0hFTUFfUEFUSCA9IF9fRElSX18gLiAnLy4uLy4uLy4uL3Jlcy9jb21wb3Nlci1sb2NrLXNjaGVtYS5qc29uJzsKCnB1YmxpYyBjb25zdCBJTkRFTlRfREVGQVVMVCA9ICcgICAgJzsKCgpwcml2YXRlICRwYXRoOwoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGluZGVudCA9IHNlbGY6OklOREVOVF9ERUZBVUxUOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhdGgsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+cGF0aCA9ICRwYXRoOwoKaWYgKG51bGwgPT09ICRodHRwRG93bmxvYWRlciAmJiBQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL31pJywgJHBhdGgpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdodHRwIHVybHMgcmVxdWlyZSBhIEh0dHBEb3dubG9hZGVyIGluc3RhbmNlIHRvIGJlIHBhc3NlZCcpOwp9CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmlvID0gJGlvOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGF0aCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBhdGg7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBleGlzdHMoKTogYm9vbAp7CnJldHVybiBpc19maWxlKCR0aGlzLT5wYXRoKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWFkKCkKewp0cnkgewppZiAoJHRoaXMtPmh0dHBEb3dubG9hZGVyKSB7CiRqc29uID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHRoaXMtPnBhdGgpLT5nZXRCb2R5KCk7Cn0gZWxzZSB7CmlmICghRmlsZXN5c3RlbTo6aXNSZWFkYWJsZSgkdGhpcy0+cGF0aCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgZmlsZSAiJy4kdGhpcy0+cGF0aC4nIiBpcyBub3QgcmVhZGFibGUuJyk7Cn0KaWYgKCR0aGlzLT5pbyAmJiAkdGhpcy0+aW8tPmlzRGVidWcoKSkgewokcmVhbHBhdGhJbmZvID0gJyc7CiRyZWFscGF0aCA9IHJlYWxwYXRoKCR0aGlzLT5wYXRoKTsKaWYgKGZhbHNlICE9PSAkcmVhbHBhdGggJiYgJHJlYWxwYXRoICE9PSAkdGhpcy0+cGF0aCkgewokcmVhbHBhdGhJbmZvID0gJyAoJyAuICRyZWFscGF0aCAuICcpJzsKfQokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1JlYWRpbmcgJyAuICR0aGlzLT5wYXRoIC4gJHJlYWxwYXRoSW5mbyk7Cn0KJGpzb24gPSBmaWxlX2dldF9jb250ZW50cygkdGhpcy0+cGF0aCk7Cn0KfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAwLCAkZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcmVhZCAnLiR0aGlzLT5wYXRoLiJcblxuIi4kZS0+Z2V0TWVzc2FnZSgpKTsKfQoKaWYgKCRqc29uID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZWFkICcuJHRoaXMtPnBhdGgpOwp9CgokdGhpcy0+aW5kZW50ID0gc2VsZjo6ZGV0ZWN0SW5kZW50aW5nKCRqc29uKTsKCnJldHVybiBzdGF0aWM6OnBhcnNlSnNvbigkanNvbiwgJHRoaXMtPnBhdGgpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShhcnJheSAkaGFzaCwgaW50ICRvcHRpb25zID0gSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fUFJFVFRZX1BSSU5UIHwgSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSkKewppZiAoJHRoaXMtPnBhdGggPT09ICdwaHA6Ly9tZW1vcnknKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0aGlzLT5wYXRoLCBzdGF0aWM6OmVuY29kZSgkaGFzaCwgJG9wdGlvbnMsICR0aGlzLT5pbmRlbnQpKTsKCnJldHVybjsKfQoKJGRpciA9IGRpcm5hbWUoJHRoaXMtPnBhdGgpOwppZiAoIWlzX2RpcigkZGlyKSkgewppZiAoZmlsZV9leGlzdHMoJGRpcikpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oCnJlYWxwYXRoKCRkaXIpLicgZXhpc3RzIGFuZCBpcyBub3QgYSBkaXJlY3RvcnkuJwopOwp9CmlmICghQG1rZGlyKCRkaXIsIDA3NzcsIHRydWUpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKAokZGlyLicgZG9lcyBub3QgZXhpc3QgYW5kIGNvdWxkIG5vdCBiZSBjcmVhdGVkLicKKTsKfQp9CgokcmV0cmllcyA9IDM7CndoaWxlICgkcmV0cmllcy0tKSB7CnRyeSB7CiR0aGlzLT5maWxlUHV0Q29udGVudHNJZk1vZGlmaWVkKCR0aGlzLT5wYXRoLCBzdGF0aWM6OmVuY29kZSgkaGFzaCwgJG9wdGlvbnMsICR0aGlzLT5pbmRlbnQpLiAoJG9wdGlvbnMgJiBKU09OX1BSRVRUWV9QUklOVCA/ICJcbiIgOiAnJykpOwpicmVhazsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewppZiAoJHJldHJpZXMgPiAwKSB7CnVzbGVlcCg1MDAwMDApOwpjb250aW51ZTsKfQoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZChzdHJpbmcgJHBhdGgsIHN0cmluZyAkY29udGVudCkKewokY3VycmVudENvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJHBhdGgpOwppZiAoZmFsc2UgPT09ICRjdXJyZW50Q29udGVudCB8fCAkY3VycmVudENvbnRlbnQgIT09ICRjb250ZW50KSB7CnJldHVybiBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJGNvbnRlbnQpOwp9CgpyZXR1cm4gMDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVTY2hlbWEoaW50ICRzY2hlbWEgPSBzZWxmOjpTVFJJQ1RfU0NIRU1BLCA/c3RyaW5nICRzY2hlbWFGaWxlID0gbnVsbCk6IGJvb2wKewppZiAoIUZpbGVzeXN0ZW06OmlzUmVhZGFibGUoJHRoaXMtPnBhdGgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGZpbGUgIicuJHRoaXMtPnBhdGguJyIgaXMgbm90IHJlYWRhYmxlLicpOwp9CiRjb250ZW50ID0gZmlsZV9nZXRfY29udGVudHMoJHRoaXMtPnBhdGgpOwokZGF0YSA9IGpzb25fZGVjb2RlKCRjb250ZW50KTsKCmlmIChudWxsID09PSAkZGF0YSAmJiAnbnVsbCcgIT09ICRjb250ZW50KSB7CnNlbGY6OnZhbGlkYXRlU3ludGF4KCRjb250ZW50LCAkdGhpcy0+cGF0aCk7Cn0KCnJldHVybiBzZWxmOjp2YWxpZGF0ZUpzb25TY2hlbWEoJHRoaXMtPnBhdGgsICRkYXRhLCAkc2NoZW1hLCAkc2NoZW1hRmlsZSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB2YWxpZGF0ZUpzb25TY2hlbWEoc3RyaW5nICRzb3VyY2UsICRkYXRhLCBpbnQgJHNjaGVtYSwgP3N0cmluZyAkc2NoZW1hRmlsZSA9IG51bGwpOiBib29sCnsKJGlzQ29tcG9zZXJTY2hlbWFGaWxlID0gZmFsc2U7CmlmIChudWxsID09PSAkc2NoZW1hRmlsZSkgewppZiAoJHNjaGVtYSA9PT0gc2VsZjo6TE9DS19TQ0hFTUEpIHsKJHNjaGVtYUZpbGUgPSBzZWxmOjpMT0NLX1NDSEVNQV9QQVRIOwp9IGVsc2UgewokaXNDb21wb3NlclNjaGVtYUZpbGUgPSB0cnVlOwokc2NoZW1hRmlsZSA9IHNlbGY6OkNPTVBPU0VSX1NDSEVNQV9QQVRIOwp9Cn0KCgppZiAoZmFsc2UgPT09IHN0cnBvcygkc2NoZW1hRmlsZSwgJzovLycpKSB7CiRzY2hlbWFGaWxlID0gJ2ZpbGU6Ly8nIC4gJHNjaGVtYUZpbGU7Cn0KCiRzY2hlbWFEYXRhID0gKG9iamVjdCkgWyckcmVmJyA9PiAkc2NoZW1hRmlsZSwgJyRzY2hlbWEnID0+ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIl07CgppZiAoJHNjaGVtYSA9PT0gc2VsZjo6U1RSSUNUX1NDSEVNQSAmJiAkaXNDb21wb3NlclNjaGVtYUZpbGUpIHsKJHNjaGVtYURhdGEgPSBqc29uX2RlY29kZSgoc3RyaW5nKSBmaWxlX2dldF9jb250ZW50cygkc2NoZW1hRmlsZSkpOwokc2NoZW1hRGF0YS0+YWRkaXRpb25hbFByb3BlcnRpZXMgPSBmYWxzZTsKJHNjaGVtYURhdGEtPnJlcXVpcmVkID0gWyduYW1lJywgJ2Rlc2NyaXB0aW9uJ107Cn0gZWxzZWlmICgkc2NoZW1hID09PSBzZWxmOjpBVVRIX1NDSEVNQSAmJiAkaXNDb21wb3NlclNjaGVtYUZpbGUpIHsKJHNjaGVtYURhdGEgPSAob2JqZWN0KSBbJyRyZWYnID0+ICRzY2hlbWFGaWxlLicjL3Byb3BlcnRpZXMvY29uZmlnJywgJyRzY2hlbWEnID0+ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIl07Cn0KCiR2YWxpZGF0b3IgPSBuZXcgVmFsaWRhdG9yKCk7CgokZGF0YSA9IGpzb25fZGVjb2RlKChzdHJpbmcpIGpzb25fZW5jb2RlKCRkYXRhKSk7CiR2YWxpZGF0b3ItPnZhbGlkYXRlKCRkYXRhLCAkc2NoZW1hRGF0YSk7CgppZiAoISR2YWxpZGF0b3ItPmlzVmFsaWQoKSkgewokZXJyb3JzID0gW107CmZvcmVhY2ggKCR2YWxpZGF0b3ItPmdldEVycm9ycygpIGFzICRlcnJvcikgewokZXJyb3JzW10gPSAoJGVycm9yWydwcm9wZXJ0eSddID8gJGVycm9yWydwcm9wZXJ0eSddLicgOiAnIDogJycpLiRlcnJvclsnbWVzc2FnZSddOwp9CnRocm93IG5ldyBKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbignIicuJHNvdXJjZS4nIiBkb2VzIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgSlNPTiBzY2hlbWEnLCAkZXJyb3JzKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlbmNvZGUoJGRhdGEsIGludCAkb3B0aW9ucyA9IFxKU09OX1VORVNDQVBFRF9TTEFTSEVTIHwgXEpTT05fUFJFVFRZX1BSSU5UIHwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUsIHN0cmluZyAkaW5kZW50ID0gc2VsZjo6SU5ERU5UX0RFRkFVTFQpOiBzdHJpbmcKewokanNvbiA9IGpzb25fZW5jb2RlKCRkYXRhLCAkb3B0aW9ucyk7CgppZiAoZmFsc2UgPT09ICRqc29uKSB7CnNlbGY6OnRocm93RW5jb2RlRXJyb3IoanNvbl9sYXN0X2Vycm9yKCkpOwp9CgppZiAoKCRvcHRpb25zICYgSlNPTl9QUkVUVFlfUFJJTlQpID4gMCAmJiAkaW5kZW50ICE9PSBzZWxmOjpJTkRFTlRfREVGQVVMVCkgewoKcmV0dXJuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygKJyNeIHs0LH0jbScsCnN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoKSB1c2UgKCRpbmRlbnQpOiBzdHJpbmcgewpyZXR1cm4gc3RyX3JlcGVhdCgkaW5kZW50LCAoaW50KSAoc3RybGVuKCRtYXRjaFswXSkgLyA0KSk7Cn0sCiRqc29uCik7Cn0KCnJldHVybiAkanNvbjsKfQoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRocm93RW5jb2RlRXJyb3IoaW50ICRjb2RlKTogdm9pZAp7CnN3aXRjaCAoJGNvZGUpIHsKY2FzZSBKU09OX0VSUk9SX0RFUFRIOgokbXNnID0gJ01heGltdW0gc3RhY2sgZGVwdGggZXhjZWVkZWQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1NUQVRFX01JU01BVENIOgokbXNnID0gJ1VuZGVyZmxvdyBvciB0aGUgbW9kZXMgbWlzbWF0Y2gnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX0NUUkxfQ0hBUjoKJG1zZyA9ICdVbmV4cGVjdGVkIGNvbnRyb2wgY2hhcmFjdGVyIGZvdW5kJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9VVEY4OgokbXNnID0gJ01hbGZvcm1lZCBVVEYtOCBjaGFyYWN0ZXJzLCBwb3NzaWJseSBpbmNvcnJlY3RseSBlbmNvZGVkJzsKYnJlYWs7CmRlZmF1bHQ6CiRtc2cgPSAnVW5rbm93biBlcnJvcic7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSlNPTiBlbmNvZGluZyBmYWlsZWQ6ICcuJG1zZyk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VKc29uKD9zdHJpbmcgJGpzb24sID9zdHJpbmcgJGZpbGUgPSBudWxsKQp7CmlmIChudWxsID09PSAkanNvbikgewpyZXR1cm4gbnVsbDsKfQokZGF0YSA9IGpzb25fZGVjb2RlKCRqc29uLCB0cnVlKTsKaWYgKG51bGwgPT09ICRkYXRhICYmIEpTT05fRVJST1JfTk9ORSAhPT0ganNvbl9sYXN0X2Vycm9yKCkpIHsKCmlmICgkZmlsZSAhPT0gbnVsbCAmJiBzdHJfZW5kc193aXRoKCRmaWxlLCAnLmxvY2snKSAmJiBzdHJfY29udGFpbnMoJGpzb24sICciY29udGVudC1oYXNoIicpKSB7CiRyZXBsYWNlZCA9IFByZWc6OnJlcGxhY2UoCid7XHI/XG48PDw8PDw8IFteXHJcbl0rXHI/XG5ccysiY29udGVudC1oYXNoIjogKiJbMC05YS1mXSsiLCAqXHI/XG4oPzpcfHs3fSBbXlxyXG5dK1xyP1xuXHMrImNvbnRlbnQtaGFzaCI6ICoiWzAtOWEtZl0rIiwgKlxyP1xuKT89PT09PT09XHI/XG5ccysiY29udGVudC1oYXNoIjogKiJbMC05YS1mXSsiLCAqXHI/XG4+Pj4+Pj4+IFteXHJcbl0rKFxyP1xuKX0nLAonICAgICJjb250ZW50LWhhc2giOiAiVkNTIG1lcmdlIGNvbmZsaWN0IGRldGVjdGVkLiBQbGVhc2UgcnVuIGBjb21wb3NlciB1cGRhdGUgLS1sb2NrYC4iLCQxJywKJGpzb24sCjEsCiRjb3VudAopOwppZiAoJGNvdW50ID09PSAxKSB7CiRkYXRhID0ganNvbl9kZWNvZGUoJHJlcGxhY2VkLCB0cnVlKTsKaWYgKCRkYXRhICE9PSBudWxsKSB7CnJldHVybiAkZGF0YTsKfQp9Cn0KCnNlbGY6OnZhbGlkYXRlU3ludGF4KCRqc29uLCAkZmlsZSk7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKCgoKCnByb3RlY3RlZCBzdGF0aWMgZnVuY3Rpb24gdmFsaWRhdGVTeW50YXgoc3RyaW5nICRqc29uLCA/c3RyaW5nICRmaWxlID0gbnVsbCk6IGJvb2wKewokcGFyc2VyID0gbmV3IEpzb25QYXJzZXIoKTsKJHJlc3VsdCA9ICRwYXJzZXItPmxpbnQoJGpzb24pOwppZiAobnVsbCA9PT0gJHJlc3VsdCkgewppZiAoZGVmaW5lZCgnSlNPTl9FUlJPUl9VVEY4JykgJiYgSlNPTl9FUlJPUl9VVEY4ID09PSBqc29uX2xhc3RfZXJyb3IoKSkgewppZiAoJGZpbGUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1RoZSBpbnB1dCBpcyBub3QgVVRGLTgsIGNvdWxkIG5vdCBwYXJzZSBhcyBKU09OJyk7Cn0gZWxzZSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCciJyAuICRmaWxlIC4gJyIgaXMgbm90IFVURi04LCBjb3VsZCBub3QgcGFyc2UgYXMgSlNPTicpOwp9Cn0KCnJldHVybiB0cnVlOwp9CgppZiAoJGZpbGUgPT09IG51bGwpIHsKdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oCidUaGUgaW5wdXQgZG9lcyBub3QgY29udGFpbiB2YWxpZCBKU09OJyAuICJcbiIgLiAkcmVzdWx0LT5nZXRNZXNzYWdlKCksCiRyZXN1bHQtPmdldERldGFpbHMoKQopOwp9IGVsc2Ugewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigKJyInIC4gJGZpbGUgLiAnIiBkb2VzIG5vdCBjb250YWluIHZhbGlkIEpTT04nIC4gIlxuIiAuICRyZXN1bHQtPmdldE1lc3NhZ2UoKSwKJHJlc3VsdC0+Z2V0RGV0YWlscygpCik7Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZXRlY3RJbmRlbnRpbmcoP3N0cmluZyAkanNvbik6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXihbIFx0XSspIiNtJywgJGpzb24gPz8gJycsICRtYXRjaCkpIHsKcmV0dXJuICRtYXRjaFsxXTsKfQoKcmV0dXJuIHNlbGY6OklOREVOVF9ERUZBVUxUOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEpzb247Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgoKCgoKCmNsYXNzIEpzb25Gb3JtYXR0ZXIKewoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZvcm1hdChzdHJpbmcgJGpzb24sIGJvb2wgJHVuZXNjYXBlVW5pY29kZSwgYm9vbCAkdW5lc2NhcGVTbGFzaGVzKTogc3RyaW5nCnsKJHJlc3VsdCA9ICcnOwokcG9zID0gMDsKJHN0ckxlbiA9IHN0cmxlbigkanNvbik7CiRpbmRlbnRTdHIgPSAnICAgICc7CiRuZXdMaW5lID0gIlxuIjsKJG91dE9mUXVvdGVzID0gdHJ1ZTsKJGJ1ZmZlciA9ICcnOwokbm9lc2NhcGUgPSB0cnVlOwoKZm9yICgkaSA9IDA7ICRpIDwgJHN0ckxlbjsgJGkrKykgewoKJGNoYXIgPSBzdWJzdHIoJGpzb24sICRpLCAxKTsKCgppZiAoJyInID09PSAkY2hhciAmJiAkbm9lc2NhcGUpIHsKJG91dE9mUXVvdGVzID0gISRvdXRPZlF1b3RlczsKfQoKaWYgKCEkb3V0T2ZRdW90ZXMpIHsKJGJ1ZmZlciAuPSAkY2hhcjsKJG5vZXNjYXBlID0gJ1xcJyA9PT0gJGNoYXIgPyAhJG5vZXNjYXBlIDogdHJ1ZTsKY29udGludWU7Cn0KaWYgKCcnICE9PSAkYnVmZmVyKSB7CmlmICgkdW5lc2NhcGVTbGFzaGVzKSB7CiRidWZmZXIgPSBzdHJfcmVwbGFjZSgnXFwvJywgJy8nLCAkYnVmZmVyKTsKfQoKaWYgKCR1bmVzY2FwZVVuaWNvZGUgJiYgZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKCiRidWZmZXIgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJy8oXFxcXCspdShbMC05YS1mXXs0fSkvaScsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoKTogc3RyaW5nIHsKJGwgPSBzdHJsZW4oJG1hdGNoWzFdKTsKCmlmICgkbCAlIDIpIHsKJGNvZGUgPSBoZXhkZWMoJG1hdGNoWzJdKTsKCgppZiAoMHhEODAwIDw9ICRjb2RlICYmIDB4REZGRiA+PSAkY29kZSkgewpyZXR1cm4gJG1hdGNoWzBdOwp9CgpyZXR1cm4gc3RyX3JlcGVhdCgnXFwnLCAkbCAtIDEpIC4gbWJfY29udmVydF9lbmNvZGluZygKcGFjaygnSConLCAkbWF0Y2hbMl0pLAonVVRGLTgnLAonVUNTLTJCRScKKTsKfQoKcmV0dXJuICRtYXRjaFswXTsKfSwgJGJ1ZmZlcik7Cn0KCiRyZXN1bHQgLj0gJGJ1ZmZlci4kY2hhcjsKJGJ1ZmZlciA9ICcnOwpjb250aW51ZTsKfQoKaWYgKCc6JyA9PT0gJGNoYXIpIHsKCiRjaGFyIC49ICcgJzsKfSBlbHNlaWYgKCd9JyA9PT0gJGNoYXIgfHwgJ10nID09PSAkY2hhcikgewokcG9zLS07CiRwcmV2Q2hhciA9IHN1YnN0cigkanNvbiwgJGkgLSAxLCAxKTsKCmlmICgneycgIT09ICRwcmV2Q2hhciAmJiAnWycgIT09ICRwcmV2Q2hhcikgewoKCiRyZXN1bHQgLj0gJG5ld0xpbmU7CiRyZXN1bHQgLj0gc3RyX3JlcGVhdCgkaW5kZW50U3RyLCAkcG9zKTsKfSBlbHNlIHsKCiRyZXN1bHQgPSBydHJpbSgkcmVzdWx0KTsKfQp9CgokcmVzdWx0IC49ICRjaGFyOwoKCgppZiAoJywnID09PSAkY2hhciB8fCAneycgPT09ICRjaGFyIHx8ICdbJyA9PT0gJGNoYXIpIHsKJHJlc3VsdCAuPSAkbmV3TGluZTsKCmlmICgneycgPT09ICRjaGFyIHx8ICdbJyA9PT0gJGNoYXIpIHsKJHBvcysrOwp9CgokcmVzdWx0IC49IHN0cl9yZXBlYXQoJGluZGVudFN0ciwgJHBvcyk7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcSnNvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKCgoKCmNsYXNzIEpzb25NYW5pcHVsYXRvcgp7Cgpwcml2YXRlIGNvbnN0IERFRklORVMgPSAnKD8oREVGSU5FKQogICAgICAgKD88bnVtYmVyPiAgICAtPyAoPz0gWzEtOV18MCg/IVxkKSApIFxkKysgKD86XC5cZCsrKT8gKD86W2VFXSBbKy1dPysgXGQrKyk/ICkKICAgICAgICg/PGJvb2xlYW4+ICAgdHJ1ZSB8IGZhbHNlIHwgbnVsbCApCiAgICAgICAoPzxzdHJpbmc+ICAgICIgKD86W14iXFxcXF0qKyB8IFxcXFwgWyJcXFxcYmZucnRcL10gfCBcXFxcIHUgWzAtOUEtRmEtZl17NH0gKSogIiApCiAgICAgICAoPzxhcnJheT4gICAgIFxbICAoPzogICg/Jmpzb24pIFxzKisgKD86ICwgKD8manNvbikgXHMqKyApKisgICk/KyAgXHMqKyBcXSApCiAgICAgICAoPzxwYWlyPiAgICAgIFxzKisgKD8mc3RyaW5nKSBccyorIDogKD8manNvbikgXHMqKyApCiAgICAgICAoPzxvYmplY3Q+ICAgIFx7ICAoPzogICg/JnBhaXIpICAoPzogLCAoPyZwYWlyKSAgKSorICApPysgIFxzKisgXH0gKQogICAgICAgKD88anNvbj4gICAgICBccyorICg/OiAoPyZudW1iZXIpIHwgKD8mYm9vbGVhbikgfCAoPyZzdHJpbmcpIHwgKD8mYXJyYXkpIHwgKD8mb2JqZWN0KSApICkKICAgICknOwoKCnByaXZhdGUgJGNvbnRlbnRzOwoKcHJpdmF0ZSAkbmV3bGluZTsKCnByaXZhdGUgJGluZGVudDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGNvbnRlbnRzKQp7CiRjb250ZW50cyA9IHRyaW0oJGNvbnRlbnRzKTsKaWYgKCRjb250ZW50cyA9PT0gJycpIHsKJGNvbnRlbnRzID0gJ3t9JzsKfQppZiAoIVByZWc6OmlzTWF0Y2goJyNeXHsoLiopXH0kI3MnLCAkY29udGVudHMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUganNvbiBmaWxlIG11c3QgYmUgYW4gb2JqZWN0ICh7fSknKTsKfQokdGhpcy0+bmV3bGluZSA9IGZhbHNlICE9PSBzdHJwb3MoJGNvbnRlbnRzLCAiXHJcbiIpID8gIlxyXG4iIDogIlxuIjsKJHRoaXMtPmNvbnRlbnRzID0gJGNvbnRlbnRzID09PSAne30nID8gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiAnfScgOiAkY29udGVudHM7CiR0aGlzLT5kZXRlY3RJbmRlbnRpbmcoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnRzKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29udGVudHMgLiAkdGhpcy0+bmV3bGluZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZExpbmsoc3RyaW5nICR0eXBlLCBzdHJpbmcgJHBhY2thZ2UsIHN0cmluZyAkY29uc3RyYWludCwgYm9vbCAkc29ydFBhY2thZ2VzID0gZmFsc2UpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskdHlwZV0pKSB7CnJldHVybiAkdGhpcy0+YWRkTWFpbktleSgkdHlwZSwgWyRwYWNrYWdlID0+ICRjb25zdHJhaW50XSk7Cn0KCiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8pJy4KJyg/UDxwcm9wZXJ0eT4nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkdHlwZSkpLidccyo6XHMqKSg/UDx2YWx1ZT4oPyZqc29uKSkoP1A8ZW5kPi4qKX1zeCc7CmlmICghUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CnJldHVybiBmYWxzZTsKfQphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3ZhbHVlJ10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCiRsaW5rcyA9ICRtYXRjaGVzWyd2YWx1ZSddOwoKCiRwYWNrYWdlUmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRwYWNrYWdlKSk7CiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLiciKD9QPHBhY2thZ2U+Jy4kcGFja2FnZVJlZ2V4LicpIihccyo6XHMqKSg/JnN0cmluZyl9aXgnOwppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICRsaW5rcywgJHBhY2thZ2VNYXRjaGVzKSkgewphc3NlcnQoaXNfc3RyaW5nKCRwYWNrYWdlTWF0Y2hlc1sncGFja2FnZSddKSk7CgokZXhpc3RpbmdQYWNrYWdlID0gJHBhY2thZ2VNYXRjaGVzWydwYWNrYWdlJ107CiRwYWNrYWdlUmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRleGlzdGluZ1BhY2thZ2UpKTsKJGxpbmtzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCd7Jy5zZWxmOjpERUZJTkVTLiciJy4kcGFja2FnZVJlZ2V4LiciKD9QPHNlcGFyYXRvcj5ccyo6XHMqKSg/JnN0cmluZyl9aXgnLCBzdGF0aWMgZnVuY3Rpb24gKCRtKSB1c2UgKCRleGlzdGluZ1BhY2thZ2UsICRjb25zdHJhaW50KTogc3RyaW5nIHsKcmV0dXJuIEpzb25GaWxlOjplbmNvZGUoc3RyX3JlcGxhY2UoJ1xcLycsICcvJywgJGV4aXN0aW5nUGFja2FnZSkpIC4gJG1bJ3NlcGFyYXRvciddIC4gJyInIC4gJGNvbnN0cmFpbnQgLiAnIic7Cn0sICRsaW5rcyk7Cn0gZWxzZSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcjXlxzKlx7XHMqXFMrLio/KFxzKlx9XHMqKSQjcycsICRsaW5rcywgJG1hdGNoKSkgewoKJGxpbmtzID0gUHJlZzo6cmVwbGFjZSgKJ3snLnByZWdfcXVvdGUoJG1hdGNoWzFdKS4nJH0nLAoKYWRkY3NsYXNoZXMoJywnIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJHBhY2thZ2UpLic6ICcuSnNvbkZpbGU6OmVuY29kZSgkY29uc3RyYWludCkgLiAkbWF0Y2hbMV0sICdcXCQnKSwKJGxpbmtzCik7Cn0gZWxzZSB7CgokbGlua3MgPSAneycgLiAkdGhpcy0+bmV3bGluZSAuCiR0aGlzLT5pbmRlbnQgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgkcGFja2FnZSkuJzogJy5Kc29uRmlsZTo6ZW5jb2RlKCRjb25zdHJhaW50KSAuICR0aGlzLT5uZXdsaW5lIC4KJHRoaXMtPmluZGVudCAuICd9JzsKfQp9CgppZiAodHJ1ZSA9PT0gJHNvcnRQYWNrYWdlcykgewokcmVxdWlyZW1lbnRzID0ganNvbl9kZWNvZGUoJGxpbmtzLCB0cnVlKTsKJHRoaXMtPnNvcnRQYWNrYWdlcygkcmVxdWlyZW1lbnRzKTsKJGxpbmtzID0gJHRoaXMtPmZvcm1hdCgkcmVxdWlyZW1lbnRzKTsKfQoKJHRoaXMtPmNvbnRlbnRzID0gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkbWF0Y2hlc1sncHJvcGVydHknXSAuICRsaW5rcyAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzb3J0UGFja2FnZXMoYXJyYXkgJiRwYWNrYWdlcyA9IFtdKTogdm9pZAp7CiRwcmVmaXggPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXF1aXJlbWVudCk6IHN0cmluZyB7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZXF1aXJlbWVudCkpIHsKcmV0dXJuIFByZWc6OnJlcGxhY2UoClsKJy9ecGhwLycsCicvXmhodm0vJywKJy9eZXh0LycsCicvXmxpYi8nLAonL15cRC8nLApdLApbCicwLSQwJywKJzEtJDAnLAonMi0kMCcsCiczLSQwJywKJzQtJDAnLApdLAokcmVxdWlyZW1lbnQKKTsKfQoKcmV0dXJuICc1LScuJHJlcXVpcmVtZW50Owp9OwoKdWtzb3J0KCRwYWNrYWdlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpIHVzZSAoJHByZWZpeCk6IGludCB7CnJldHVybiBzdHJuYXRjbXAoJHByZWZpeCgkYSksICRwcmVmaXgoJGIpKTsKfSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgYm9vbCAkYXBwZW5kID0gdHJ1ZSk6IGJvb2wKewppZiAoIiIgIT09ICRuYW1lICYmICEkdGhpcy0+ZG9SZW1vdmVSZXBvc2l0b3J5KCRuYW1lKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghJHRoaXMtPmRvQ29udmVydFJlcG9zaXRvcmllc0Zyb21Bc3NvY1RvTGlzdCgpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKGlzX2FycmF5KCRjb25maWcpICYmICFpc19udW1lcmljKCRuYW1lKSAmJiAnJyAhPT0gJG5hbWUpIHsKJGNvbmZpZyA9IFsnbmFtZScgPT4gJG5hbWVdICsgJGNvbmZpZzsKfSBlbHNlaWYgKCRjb25maWcgPT09IGZhbHNlKSB7CiRjb25maWcgPSBbJG5hbWUgPT4gJGNvbmZpZ107Cn0KCnJldHVybiAkdGhpcy0+YWRkTGlzdEl0ZW0oJ3JlcG9zaXRvcmllcycsICRjb25maWcsICRhcHBlbmQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRvQ29udmVydFJlcG9zaXRvcmllc0Zyb21Bc3NvY1RvTGlzdCgpOiBib29sCnsKJGRlY29kZWQgPSBqc29uX2RlY29kZSgkdGhpcy0+Y29udGVudHMsIGZhbHNlKTsKCmlmICgoJGRlY29kZWQtPnJlcG9zaXRvcmllcyA/PyBudWxsKSBpbnN0YW5jZW9mIFxzdGRDbGFzcykgewoKJGVudHJpZXNUb1JldmVydCA9IGFycmF5X3JldmVyc2UoYXJyYXlfa2V5cygoYXJyYXkpICRkZWNvZGVkLT5yZXBvc2l0b3JpZXMpKTsKCmZvcmVhY2ggKCRlbnRyaWVzVG9SZXZlcnQgYXMgJGVudHJ5S2V5KSB7CmlmICghJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3JlcG9zaXRvcmllcycsIChzdHJpbmcpICRlbnRyeUtleSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCiR0aGlzLT5jaGFuZ2VFbXB0eU1haW5LZXlGcm9tQXNzb2NUb0xpc3QoJ3JlcG9zaXRvcmllcycpOwoKCmZvcmVhY2ggKCgoYXJyYXkpICRkZWNvZGVkLT5yZXBvc2l0b3JpZXMpIGFzICRyZXBvc2l0b3J5TmFtZSA9PiAkcmVwb3NpdG9yeSkgewppZiAoISRyZXBvc2l0b3J5IGluc3RhbmNlb2YgXHN0ZENsYXNzKSB7CmlmICghJHRoaXMtPmFkZExpc3RJdGVtKCdyZXBvc2l0b3JpZXMnLCBbJHJlcG9zaXRvcnlOYW1lID0+ICRyZXBvc2l0b3J5XSwgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0gZWxzZWlmIChpc19udW1lcmljKCRyZXBvc2l0b3J5TmFtZSkpIHsKaWYgKCEkdGhpcy0+YWRkTGlzdEl0ZW0oJ3JlcG9zaXRvcmllcycsICRyZXBvc2l0b3J5LCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBlbHNlIHsKJHJlcG9zaXRvcnkgPSAoYXJyYXkpICRyZXBvc2l0b3J5OwoKJHJlcG9zaXRvcnkgPSBbJ25hbWUnID0+ICRyZXBvc2l0b3J5TmFtZV0gKyAkcmVwb3NpdG9yeTsKaWYgKCEkdGhpcy0+YWRkTGlzdEl0ZW0oJ3JlcG9zaXRvcmllcycsICRyZXBvc2l0b3J5LCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQp9Cn0KCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yeVVybChzdHJpbmcgJG5hbWUsIHN0cmluZyAkdXJsKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwokcmVwb3NpdG9yeUluZGV4ID0gbnVsbDsKCmZvcmVhY2ggKCRkZWNvZGVkWydyZXBvc2l0b3JpZXMnXSA/PyBbXSBhcyAkaW5kZXggPT4gJHJlcG9zaXRvcnkpIHsKaWYgKCRuYW1lID09PSAkaW5kZXgpIHsKJHJlcG9zaXRvcnlJbmRleCA9ICRpbmRleDsKYnJlYWs7Cn0KCmlmICgkbmFtZSA9PT0gKCRyZXBvc2l0b3J5WyduYW1lJ10gPz8gbnVsbCkpIHsKJHJlcG9zaXRvcnlJbmRleCA9ICRpbmRleDsKYnJlYWs7Cn0KfQoKaWYgKG51bGwgPT09ICRyZXBvc2l0b3J5SW5kZXgpIHsKcmV0dXJuIGZhbHNlOwp9CgokbGlzdFJlZ2V4ID0gbnVsbDsKCmlmIChpc19pbnQoJHJlcG9zaXRvcnlJbmRleCkpIHsKJGxpc3RSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8icmVwb3NpdG9yaWVzIlxzKjpccypcW1xzKigoPyZqc29uKVxzKissXHMqKyl7JyAuIG1heCgwLCAkcmVwb3NpdG9yeUluZGV4KSAuICd9KSg/UDxyZXBvc2l0b3J5Pig/Jm9iamVjdCkpKD9QPGVuZD4uKil9c3gnOwp9Cgokb2JqZWN0UmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD5ccypce1xzKig/Oig/JnN0cmluZylccyo6XHMqKD8manNvbilccyosXHMqKSo/InJlcG9zaXRvcmllcyJccyo6XHMqXHtccyooPzooPyZzdHJpbmcpXHMqOlxzKig/Jmpzb24pXHMqLFxzKikqPycgLiBwcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJHJlcG9zaXRvcnlJbmRleCkpIC4gJ1xzKjpccyopKD9QPHJlcG9zaXRvcnk+KD8mb2JqZWN0KSkoP1A8ZW5kPi4qKX1zeCc7CiRtYXRjaGVzID0gbnVsbDsKCmlmICgoJGxpc3RSZWdleCAhPT0gbnVsbCAmJiBQcmVnOjppc01hdGNoKCRsaXN0UmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB8fCBQcmVnOjppc01hdGNoKCRvYmplY3RSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKYXNzZXJ0KGlzc2V0KCRtYXRjaGVzWydzdGFydCddKSAmJiBpc19zdHJpbmcoJG1hdGNoZXNbJ3N0YXJ0J10pKTsKYXNzZXJ0KGlzc2V0KCRtYXRjaGVzWydyZXBvc2l0b3J5J10pICYmIGlzX3N0cmluZygkbWF0Y2hlc1sncmVwb3NpdG9yeSddKSk7CmFzc2VydChpc3NldCgkbWF0Y2hlc1snZW5kJ10pICYmIGlzX3N0cmluZygkbWF0Y2hlc1snZW5kJ10pKTsKCgppZiAoZmFsc2UgPT09IEBqc29uX2RlY29kZSgkbWF0Y2hlc1sncmVwb3NpdG9yeSddKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRyZXBvc2l0b3J5UmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD5ccypce1xzKig/Oig/JnN0cmluZylccyo6XHMqKD8manNvbilccyosXHMqKSo/InVybCJccyo6XHMqKSg/UDx1cmw+KD8mc3RyaW5nKSkoP1A8ZW5kPi4qKX1zeCc7CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuIFByZWc6OnJlcGxhY2VDYWxsYmFjaygkcmVwb3NpdG9yeVJlZ2V4LCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRyZXBvc2l0b3J5TWF0Y2hlcykgdXNlICgkdXJsKTogc3RyaW5nIHsKcmV0dXJuICRyZXBvc2l0b3J5TWF0Y2hlc1snc3RhcnQnXSAuIEpzb25GaWxlOjplbmNvZGUoJHVybCkgLiAkcmVwb3NpdG9yeU1hdGNoZXNbJ2VuZCddOwp9LCAkbWF0Y2hlc1sncmVwb3NpdG9yeSddKSAuICRtYXRjaGVzWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnNlcnRSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSwgJGNvbmZpZywgc3RyaW5nICRyZWZlcmVuY2VOYW1lLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKaWYgKCIiICE9PSAkbmFtZSAmJiAhJHRoaXMtPmRvUmVtb3ZlUmVwb3NpdG9yeSgkbmFtZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoISR0aGlzLT5kb0NvbnZlcnRSZXBvc2l0b3JpZXNGcm9tQXNzb2NUb0xpc3QoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRpbmRleFRvSW5zZXJ0ID0gbnVsbDsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7Cgpmb3JlYWNoICgkZGVjb2RlZFsncmVwb3NpdG9yaWVzJ10gYXMgJHJlcG9zaXRvcnlJbmRleCA9PiAkcmVwb3NpdG9yeSkgewppZiAoKCRyZXBvc2l0b3J5WyduYW1lJ10gPz8gbnVsbCkgPT09ICRyZWZlcmVuY2VOYW1lKSB7CiRpbmRleFRvSW5zZXJ0ID0gJHJlcG9zaXRvcnlJbmRleDsKYnJlYWs7Cn0KCmlmICgkcmVwb3NpdG9yeUluZGV4ID09PSAkcmVmZXJlbmNlTmFtZSkgewokaW5kZXhUb0luc2VydCA9ICRyZXBvc2l0b3J5SW5kZXg7CmJyZWFrOwp9CgppZiAoWyRyZWZlcmVuY2VOYW1lID0+IGZhbHNlXSA9PT0gJHJlcG9zaXRvcnkpIHsKJGluZGV4VG9JbnNlcnQgPSAkcmVwb3NpdG9yeUluZGV4OwpicmVhazsKfQp9CgppZiAoJGluZGV4VG9JbnNlcnQgPT09IG51bGwpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoaXNfYXJyYXkoJGNvbmZpZykgJiYgIWlzX251bWVyaWMoJG5hbWUpICYmICcnICE9PSAkbmFtZSkgewokY29uZmlnID0gWyduYW1lJyA9PiAkbmFtZV0gKyAkY29uZmlnOwp9IGVsc2VpZiAoJGNvbmZpZyA9PT0gZmFsc2UpIHsKJGNvbmZpZyA9IFsnbmFtZScgPT4gJGNvbmZpZ107Cn0KCnJldHVybiAkdGhpcy0+aW5zZXJ0TGlzdEl0ZW0oJ3JlcG9zaXRvcmllcycsICRjb25maWcsICRpbmRleFRvSW5zZXJ0ICsgJG9mZnNldCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVSZXBvc2l0b3J5KHN0cmluZyAkbmFtZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRvUmVtb3ZlUmVwb3NpdG9yeSgkbmFtZSkgJiYgJHRoaXMtPnJlbW92ZU1haW5LZXlJZkVtcHR5KCdyZXBvc2l0b3JpZXMnKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkb1JlbW92ZVJlcG9zaXRvcnkoc3RyaW5nICRuYW1lKTogYm9vbAp7CiRkZWNvZGVkID0ganNvbl9kZWNvZGUoJHRoaXMtPmNvbnRlbnRzLCBmYWxzZSk7CiRpc0Fzc29jID0gKCRkZWNvZGVkLT5yZXBvc2l0b3JpZXMgPz8gbnVsbCkgaW5zdGFuY2VvZiBcc3RkQ2xhc3M7Cgpmb3JlYWNoICgoYXJyYXkpICgkZGVjb2RlZC0+cmVwb3NpdG9yaWVzID8/IFtdKSBhcyAkcmVwb3NpdG9yeUluZGV4ID0+ICRyZXBvc2l0b3J5KSB7CmlmICgkcmVwb3NpdG9yeUluZGV4ID09PSAkbmFtZSAmJiAkaXNBc3NvYykgewppZiAoISR0aGlzLT5yZW1vdmVTdWJOb2RlKCdyZXBvc2l0b3JpZXMnLCAkcmVwb3NpdG9yeUluZGV4KSkgewpyZXR1cm4gZmFsc2U7Cn0KCmJyZWFrOwp9CgppZiAoKCRyZXBvc2l0b3J5LT5uYW1lID8/IG51bGwpID09PSAkbmFtZSkgewppZiAoJGlzQXNzb2MpIHsKaWYgKCEkdGhpcy0+cmVtb3ZlU3ViTm9kZSgncmVwb3NpdG9yaWVzJywgKHN0cmluZykgJHJlcG9zaXRvcnlJbmRleCkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0gZWxzZSB7CmlmICghJHRoaXMtPnJlbW92ZUxpc3RJdGVtKCdyZXBvc2l0b3JpZXMnLCAoaW50KSAkcmVwb3NpdG9yeUluZGV4KSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKYnJlYWs7Cn0KCmlmICgkaXNBc3NvYykgewppZiAoJG5hbWUgPT09ICRyZXBvc2l0b3J5SW5kZXggJiYgZmFsc2UgPT09ICRyZXBvc2l0b3J5KSB7CmlmICghJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3JlcG9zaXRvcmllcycsICRyZXBvc2l0b3J5SW5kZXgpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KfSBlbHNlIHsKJHJlcG9zaXRvcnlBc0FycmF5ID0gKGFycmF5KSAkcmVwb3NpdG9yeTsKCmlmIChmYWxzZSA9PT0gKCRyZXBvc2l0b3J5QXNBcnJheVskbmFtZV0gPz8gbnVsbCkgJiYgMSA9PT0gY291bnQoJHJlcG9zaXRvcnlBc0FycmF5KSkgewppZiAoISR0aGlzLT5yZW1vdmVMaXN0SXRlbSgncmVwb3NpdG9yaWVzJywgKGludCkgJHJlcG9zaXRvcnlJbmRleCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ2NvbmZpZycsICRuYW1lLCAkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlQ29uZmlnU2V0dGluZyhzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdjb25maWcnLCAkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQcm9wZXJ0eShzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IGJvb2wKewppZiAoc3RycG9zKCRuYW1lLCAnc3VnZ2VzdC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPmFkZFN1Yk5vZGUoJ3N1Z2dlc3QnLCBzdWJzdHIoJG5hbWUsIDgpLCAkdmFsdWUpOwp9CgppZiAoc3RycG9zKCRuYW1lLCAnZXh0cmEuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5hZGRTdWJOb2RlKCdleHRyYScsIHN1YnN0cigkbmFtZSwgNiksICR2YWx1ZSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdzY3JpcHRzLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+YWRkU3ViTm9kZSgnc2NyaXB0cycsIHN1YnN0cigkbmFtZSwgOCksICR2YWx1ZSk7Cn0KCnJldHVybiAkdGhpcy0+YWRkTWFpbktleSgkbmFtZSwgJHZhbHVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVByb3BlcnR5KHN0cmluZyAkbmFtZSk6IGJvb2wKewppZiAoc3RycG9zKCRuYW1lLCAnc3VnZ2VzdC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ3N1Z2dlc3QnLCBzdWJzdHIoJG5hbWUsIDgpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ2V4dHJhLicpID09PSAwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlU3ViTm9kZSgnZXh0cmEnLCBzdWJzdHIoJG5hbWUsIDYpKTsKfQoKaWYgKHN0cnBvcygkbmFtZSwgJ3NjcmlwdHMuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdzY3JpcHRzJywgc3Vic3RyKCRuYW1lLCA4KSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdhdXRvbG9hZC4nKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZVN1Yk5vZGUoJ2F1dG9sb2FkJywgc3Vic3RyKCRuYW1lLCA5KSk7Cn0KCmlmIChzdHJwb3MoJG5hbWUsICdhdXRvbG9hZC1kZXYuJykgPT09IDApIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVTdWJOb2RlKCdhdXRvbG9hZC1kZXYnLCBzdWJzdHIoJG5hbWUsIDEzKSk7Cn0KCnJldHVybiAkdGhpcy0+cmVtb3ZlTWFpbktleSgkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTdWJOb2RlKHN0cmluZyAkbWFpbk5vZGUsIHN0cmluZyAkbmFtZSwgJHZhbHVlLCBib29sICRhcHBlbmQgPSB0cnVlKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKJHN1Yk5hbWUgPSBudWxsOwppZiAoaW5fYXJyYXkoJG1haW5Ob2RlLCBbJ2NvbmZpZycsICdleHRyYScsICdzY3JpcHRzJ10pICYmIGZhbHNlICE9PSBzdHJwb3MoJG5hbWUsICcuJykpIHsKWyRuYW1lLCAkc3ViTmFtZV0gPSBleHBsb2RlKCcuJywgJG5hbWUsIDIpOwp9CgoKaWYgKCFpc3NldCgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJHRoaXMtPmFkZE1haW5LZXkoJG1haW5Ob2RlLCBbJG5hbWUgPT4gWyRzdWJOYW1lID0+ICR2YWx1ZV1dKTsKfSBlbHNlIHsKJHRoaXMtPmFkZE1haW5LZXkoJG1haW5Ob2RlLCBbJG5hbWUgPT4gJHZhbHVlXSk7Cn0KCnJldHVybiB0cnVlOwp9CgoKJG5vZGVSZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PiBccyogXHsgXHMqICg/OiAoPyZzdHJpbmcpIFxzKiA6ICg/Jmpzb24pIFxzKiAsIFxzKiApKj8nLgpwcmVnX3F1b3RlKEpzb25GaWxlOjplbmNvZGUoJG1haW5Ob2RlKSkuJ1xzKjpccyopKD9QPGNvbnRlbnQ+KD8mb2JqZWN0KSkoP1A8ZW5kPi4qKX1zeCc7Cgp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgppZiAoIUBqc29uX2RlY29kZSgkY2hpbGRyZW4pKSB7CnJldHVybiBmYWxzZTsKfQoKCiRjaGlsZFJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJyg/UDxzdGFydD4iJy5wcmVnX3F1b3RlKCRuYW1lKS4nIlxzKjpccyopKD9QPGNvbnRlbnQ+KD8manNvbikpKD9QPGVuZD4sPyl9eCc7CmlmIChQcmVnOjppc01hdGNoKCRjaGlsZFJlZ2V4LCAkY2hpbGRyZW4sICRtYXRjaGVzKSkgewokY2hpbGRyZW4gPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJGNoaWxkUmVnZXgsIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgkc3ViTmFtZSwgJHZhbHVlKTogc3RyaW5nIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsICYmIGlzX3N0cmluZygkbWF0Y2hlc1snY29udGVudCddKSkgewokY3VyVmFsID0ganNvbl9kZWNvZGUoJG1hdGNoZXNbJ2NvbnRlbnQnXSwgdHJ1ZSk7CmlmICghaXNfYXJyYXkoJGN1clZhbCkpIHsKJGN1clZhbCA9IFtdOwp9CiRjdXJWYWxbJHN1Yk5hbWVdID0gJHZhbHVlOwokdmFsdWUgPSAkY3VyVmFsOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkdGhpcy0+Zm9ybWF0KCR2YWx1ZSwgMSkgLiAkbWF0Y2hlc1snZW5kJ107Cn0sICRjaGlsZHJlbik7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcjXlx7KD9QPGxlYWRpbmdzcGFjZT5ccyo/KSg/UDxjb250ZW50PlxTKy4qPyk/KD9QPHRyYWlsaW5nc3BhY2U+XHMqKVx9JCNzJywgJGNoaWxkcmVuLCAkbWF0Y2gpKSB7CiR3aGl0ZXNwYWNlID0gJG1hdGNoWyd0cmFpbGluZ3NwYWNlJ107CmlmIChudWxsICE9PSAkbWF0Y2hbJ2NvbnRlbnQnXSkgewppZiAoJHN1Yk5hbWUgIT09IG51bGwpIHsKJHZhbHVlID0gWyRzdWJOYW1lID0+ICR2YWx1ZV07Cn0KCgppZiAoJGFwcGVuZCkgewokY2hpbGRyZW4gPSBQcmVnOjpyZXBsYWNlKAonIycuJHdoaXRlc3BhY2UuJ30kIycsCmFkZGNzbGFzaGVzKCcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQgLiBKc29uRmlsZTo6ZW5jb2RlKCRuYW1lKS4nOiAnLiR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICR3aGl0ZXNwYWNlIC4gJ30nLCAnXFwkJyksCiRjaGlsZHJlbgopOwp9IGVsc2Ugewokd2hpdGVzcGFjZSA9ICRtYXRjaFsnbGVhZGluZ3NwYWNlJ107CiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2UoCicjXnsnLiR3aGl0ZXNwYWNlLicjJywKYWRkY3NsYXNoZXMoJ3snIC4gJHdoaXRlc3BhY2UgLiBKc29uRmlsZTo6ZW5jb2RlKCRuYW1lKS4nOiAnLiR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICcsJyAuICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQsICdcXCQnKSwKJGNoaWxkcmVuCik7Cn0KfSBlbHNlIHsKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiR2YWx1ZSA9IFskc3ViTmFtZSA9PiAkdmFsdWVdOwp9CgoKJGNoaWxkcmVuID0gJ3snIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJG5hbWUpLic6ICcuJHRoaXMtPmZvcm1hdCgkdmFsdWUsIDEpIC4gJHdoaXRlc3BhY2UgLiAnfSc7Cn0KfSBlbHNlIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTm90aGluZyBtYXRjaGVkIGFib3ZlIGZvcjogJy4kY2hpbGRyZW4pOwp9CgokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJG5vZGVSZWdleCwgc3RhdGljIGZ1bmN0aW9uICgkbSkgdXNlICgkY2hpbGRyZW4pOiBzdHJpbmcgewpyZXR1cm4gJG1bJ3N0YXJ0J10gLiAkY2hpbGRyZW4gLiAkbVsnZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgpyZXR1cm4gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVN1Yk5vZGUoc3RyaW5nICRtYWluTm9kZSwgc3RyaW5nICRuYW1lKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKCmlmIChlbXB0eSgkZGVjb2RlZFskbWFpbk5vZGVdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCiRub2RlUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD4gXHMqIFx7IFxzKiAoPzogKD8mc3RyaW5nKSBccyogOiAoPyZqc29uKSBccyogLCBccyogKSo/Jy4KcHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRtYWluTm9kZSkpLidccyo6XHMqKSg/UDxjb250ZW50Pig/Jm9iamVjdCkpKD9QPGVuZD4uKil9c3gnOwp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgoKaWYgKCFAanNvbl9kZWNvZGUoJGNoaWxkcmVuLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzdWJOYW1lID0gbnVsbDsKaWYgKGluX2FycmF5KCRtYWluTm9kZSwgWydjb25maWcnLCAnZXh0cmEnLCAnc2NyaXB0cyddKSAmJiBmYWxzZSAhPT0gc3RycG9zKCRuYW1lLCAnLicpKSB7ClskbmFtZSwgJHN1Yk5hbWVdID0gZXhwbG9kZSgnLicsICRuYW1lLCAyKTsKfQoKCmlmICghaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXVskbmFtZV0pIHx8ICgkc3ViTmFtZSAmJiAhaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXVskbmFtZV1bJHN1Yk5hbWVdKSkpIHsKcmV0dXJuIHRydWU7Cn0KCgoka2V5UmVnZXggPSBzdHJfcmVwbGFjZSgnLycsICdcXFxcPy8nLCBwcmVnX3F1b3RlKCRuYW1lKSk7CmlmIChQcmVnOjppc01hdGNoKCd7IicuJGtleVJlZ2V4LiciXHMqOn1pJywgJGNoaWxkcmVuKSkgewoKaWYgKFByZWc6OmlzTWF0Y2hBbGwoJ3snLnNlbGY6OkRFRklORVMuJyInLiRrZXlSZWdleC4nIlxzKjpccyooPzooPyZqc29uKSl9eCcsICRjaGlsZHJlbiwgJG1hdGNoZXMpKSB7CiRiZXN0TWF0Y2ggPSAnJzsKZm9yZWFjaCAoJG1hdGNoZXNbMF0gYXMgJG1hdGNoKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoKSk7CmlmIChzdHJsZW4oJGJlc3RNYXRjaCkgPCBzdHJsZW4oJG1hdGNoKSkgewokYmVzdE1hdGNoID0gJG1hdGNoOwp9Cn0KJGNoaWxkcmVuQ2xlYW4gPSBQcmVnOjpyZXBsYWNlKCd7LFxzKicucHJlZ19xdW90ZSgkYmVzdE1hdGNoKS4nfWknLCAnJywgJGNoaWxkcmVuLCAtMSwgJGNvdW50KTsKaWYgKDEgIT09ICRjb3VudCkgewokY2hpbGRyZW5DbGVhbiA9IFByZWc6OnJlcGxhY2UoJ3snLnByZWdfcXVvdGUoJGJlc3RNYXRjaCkuJ1xzKiw/XHMqfWknLCAnJywgJGNoaWxkcmVuQ2xlYW4sIC0xLCAkY291bnQpOwppZiAoMSAhPT0gJGNvdW50KSB7CnJldHVybiBmYWxzZTsKfQp9Cn0KfSBlbHNlIHsKJGNoaWxkcmVuQ2xlYW4gPSAkY2hpbGRyZW47Cn0KCmlmICghaXNzZXQoJGNoaWxkcmVuQ2xlYW4pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJKc29uTWFuaXB1bGF0b3I6IFwkY2hpbGRyZW5DbGVhbiBpcyBub3QgZGVmaW5lZC4gUGxlYXNlIHJlcG9ydCBhdCBodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY29tcG9zZXIvaXNzdWVzL25ldy4iKTsKfQoKCnVuc2V0KCRtYXRjaCk7CmlmIChQcmVnOjppc01hdGNoKCcjXlx7XHMqPyg/UDxjb250ZW50PlxTKy4qPyk/KD9QPHRyYWlsaW5nc3BhY2U+XHMqKVx9JCNzJywgJGNoaWxkcmVuQ2xlYW4sICRtYXRjaCkpIHsKaWYgKG51bGwgPT09ICRtYXRjaFsnY29udGVudCddKSB7CiRuZXdsaW5lID0gJHRoaXMtPm5ld2xpbmU7CiRpbmRlbnQgPSAkdGhpcy0+aW5kZW50OwoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpIHVzZSAoJGluZGVudCwgJG5ld2xpbmUpOiBzdHJpbmcgewpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAneycgLiAkbmV3bGluZSAuICRpbmRlbnQgLiAnfScgLiAkbWF0Y2hlc1snZW5kJ107Cn0sICR0aGlzLT5jb250ZW50cyk7CgoKaWYgKCRzdWJOYW1lICE9PSBudWxsKSB7CiRjdXJWYWwgPSBqc29uX2RlY29kZSgkY2hpbGRyZW4sIHRydWUpOwp1bnNldCgkY3VyVmFsWyRuYW1lXVskc3ViTmFtZV0pOwppZiAoJGN1clZhbFskbmFtZV0gPT09IFtdKSB7CiRjdXJWYWxbJG5hbWVdID0gbmV3IFxBcnJheU9iamVjdCgpOwp9CiR0aGlzLT5hZGRTdWJOb2RlKCRtYWluTm9kZSwgJG5hbWUsICRjdXJWYWxbJG5hbWVdKTsKfQoKcmV0dXJuIHRydWU7Cn0KfQoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIGZ1bmN0aW9uICgkbWF0Y2hlcykgdXNlICgkbmFtZSwgJHN1Yk5hbWUsICRjaGlsZHJlbkNsZWFuKTogc3RyaW5nIHsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1snY29udGVudCddKSk7CmlmICgkc3ViTmFtZSAhPT0gbnVsbCkgewokY3VyVmFsID0ganNvbl9kZWNvZGUoJG1hdGNoZXNbJ2NvbnRlbnQnXSwgdHJ1ZSk7CnVuc2V0KCRjdXJWYWxbJG5hbWVdWyRzdWJOYW1lXSk7CmlmICgkY3VyVmFsWyRuYW1lXSA9PT0gW10pIHsKJGN1clZhbFskbmFtZV0gPSBuZXcgXEFycmF5T2JqZWN0KCk7Cn0KJGNoaWxkcmVuQ2xlYW4gPSAkdGhpcy0+Zm9ybWF0KCRjdXJWYWwsIDAsIHRydWUpOwp9CgpyZXR1cm4gJG1hdGNoZXNbJ3N0YXJ0J10gLiAkY2hpbGRyZW5DbGVhbiAuICRtYXRjaGVzWydlbmQnXTsKfSwgJHRoaXMtPmNvbnRlbnRzKTsKCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkTGlzdEl0ZW0oc3RyaW5nICRtYWluTm9kZSwgJHZhbHVlLCBib29sICRhcHBlbmQgPSB0cnVlKTogYm9vbAp7CiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKCmlmICghaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXSkpIHsKaWYgKCEkdGhpcy0+YWRkTWFpbktleSgkbWFpbk5vZGUsIFtdKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKCiRub2RlUmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD4gXHMqIFx7IFxzKiAoPzogKD8mc3RyaW5nKSBccyogOiAoPyZqc29uKSBccyogLCBccyogKSo/Jy4KcHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRtYWluTm9kZSkpLidccyo6XHMqKSg/UDxjb250ZW50Pig/JmFycmF5KSkoP1A8ZW5kPi4qKX1zeCc7Cgp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgppZiAoZmFsc2UgPT09IEBqc29uX2RlY29kZSgkY2hpbGRyZW4pKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJyNeXFsoP1A8bGVhZGluZ3NwYWNlPlxzKj8pKD9QPGNvbnRlbnQ+XFMrLio/KT8oP1A8dHJhaWxpbmdzcGFjZT5ccyopXF0kI3MnLCAkY2hpbGRyZW4sICRtYXRjaCkpIHsKJGxlYWRpbmdXaGl0ZXNwYWNlID0gJG1hdGNoWydsZWFkaW5nc3BhY2UnXTsKJHdoaXRlc3BhY2UgPSAkbWF0Y2hbJ3RyYWlsaW5nc3BhY2UnXTsKJGxlYWRpbmdJdGVtV2hpdGVzcGFjZSA9ICR0aGlzLT5uZXdsaW5lIC4gJHRoaXMtPmluZGVudCAuICR0aGlzLT5pbmRlbnQ7CiR0cmFpbGluZ0l0ZW1XaGl0ZXNwYWNlID0gJHdoaXRlc3BhY2U7CiRpdGVtRGVwdGggPSAxOwoKCmlmICghc3RyX2NvbnRhaW5zKCR3aGl0ZXNwYWNlLCAkdGhpcy0+bmV3bGluZSkpIHsKJGxlYWRpbmdJdGVtV2hpdGVzcGFjZSA9ICRsZWFkaW5nV2hpdGVzcGFjZTsKJHRyYWlsaW5nSXRlbVdoaXRlc3BhY2UgPSAkbGVhZGluZ1doaXRlc3BhY2U7CiRpdGVtRGVwdGggPSAwOwp9CgppZiAobnVsbCAhPT0gJG1hdGNoWydjb250ZW50J10pIHsKCmlmICgkYXBwZW5kKSB7CiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2UoCicjJy4kd2hpdGVzcGFjZS4nXSQjJywKYWRkY3NsYXNoZXMoJywnIC4gJGxlYWRpbmdJdGVtV2hpdGVzcGFjZSAuICR0aGlzLT5mb3JtYXQoJHZhbHVlLCAkaXRlbURlcHRoKSAuICR0cmFpbGluZ0l0ZW1XaGl0ZXNwYWNlIC4gJ10nLCAnXFwkJyksCiRjaGlsZHJlbgopOwp9IGVsc2Ugewokd2hpdGVzcGFjZSA9ICRtYXRjaFsnbGVhZGluZ3NwYWNlJ107CiRjaGlsZHJlbiA9IFByZWc6OnJlcGxhY2UoCicjXlxbJy4kd2hpdGVzcGFjZS4nIycsCmFkZGNzbGFzaGVzKCdbJyAuICR3aGl0ZXNwYWNlIC4gJHRoaXMtPmZvcm1hdCgkdmFsdWUsICRpdGVtRGVwdGgpIC4gJywnIC4gJGxlYWRpbmdJdGVtV2hpdGVzcGFjZSwgJ1xcJCcpLAokY2hpbGRyZW4KKTsKfQp9IGVsc2UgewoKJGNoaWxkcmVuID0gJ1snIC4gJGxlYWRpbmdJdGVtV2hpdGVzcGFjZSAuICR0aGlzLT5mb3JtYXQoJHZhbHVlLCAkaXRlbURlcHRoKSAuICR0cmFpbGluZ0l0ZW1XaGl0ZXNwYWNlIC4gJ10nOwp9Cn0gZWxzZSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ05vdGhpbmcgbWF0Y2hlZCBhYm92ZSBmb3I6ICcuJGNoaWxkcmVuKTsKfQoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoJG0pIHVzZSAoJGNoaWxkcmVuKTogc3RyaW5nIHsKcmV0dXJuICRtWydzdGFydCddIC4gJGNoaWxkcmVuIC4gJG1bJ2VuZCddOwp9LCAkdGhpcy0+Y29udGVudHMpOwoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbnNlcnRMaXN0SXRlbShzdHJpbmcgJG1haW5Ob2RlLCAkdmFsdWUsIGludCAkaW5kZXgpOiBib29sCnsKaWYgKCRpbmRleCA8IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0luZGV4IGNhbiBvbmx5IGJlIHBvc2l0aXZlIGludGVnZXInKTsKfQoKaWYgKCRpbmRleCA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPmFkZExpc3RJdGVtKCRtYWluTm9kZSwgJHZhbHVlLCBmYWxzZSk7Cn0KCiRkZWNvZGVkID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Y29udGVudHMpOwoKCmlmICghaXNzZXQoJGRlY29kZWRbJG1haW5Ob2RlXSkpIHsKaWYgKCEkdGhpcy0+YWRkTWFpbktleSgkbWFpbk5vZGUsIFtdKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKaWYgKGNvdW50KCRkZWNvZGVkWyRtYWluTm9kZV0pID09PSAkaW5kZXgpIHsKcmV0dXJuICR0aGlzLT5hZGRMaXN0SXRlbSgkbWFpbk5vZGUsICR2YWx1ZSwgdHJ1ZSk7Cn0KCgokbm9kZVJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+IFxzKiBceyBccyogKD86ICg/JnN0cmluZykgXHMqIDogKD8manNvbikgXHMqICwgXHMqICkqPycuCnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkbWFpbk5vZGUpKS4nXHMqOlxzKikoP1A8Y29udGVudD4oPyZhcnJheSkpKD9QPGVuZD4uKil9c3gnOwoKdHJ5IHsKaWYgKCFQcmVnOjppc01hdGNoKCRub2RlUmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoKSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IFBSRUdfQkFDS1RSQUNLX0xJTUlUX0VSUk9SKSB7CnJldHVybiBmYWxzZTsKfQp0aHJvdyAkZTsKfQoKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ3N0YXJ0J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hbJ2NvbnRlbnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnZW5kJ10pKTsKCiRjaGlsZHJlbiA9ICRtYXRjaFsnY29udGVudCddOwoKaWYgKGZhbHNlID09PSBAanNvbl9kZWNvZGUoJGNoaWxkcmVuKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRsaXN0U2tpcFRvSXRlbVJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+XFtccyooKD8manNvbilccyorLFxzKj8peycgLiBtYXgoMCwgJGluZGV4KSAuICd9KSg/UDxzcGFjZV9iZWZvcmVfaXRlbT4oXHMqKSkoP1A8ZW5kPi4qKX1zeCc7CgokY2hpbGRyZW4gPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJGxpc3RTa2lwVG9JdGVtUmVnZXgsIGZ1bmN0aW9uICgkbSkgdXNlICgkdmFsdWUpOiBzdHJpbmcgewpyZXR1cm4gJG1bJ3N0YXJ0J10gLiAkbVsnc3BhY2VfYmVmb3JlX2l0ZW0nXSAuICR0aGlzLT5mb3JtYXQoJHZhbHVlLCAxKSAuICcsJyAuICRtWydzcGFjZV9iZWZvcmVfaXRlbSddIC4gJG1bJ2VuZCddOwp9LCAkY2hpbGRyZW4pOwoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrKCRub2RlUmVnZXgsIHN0YXRpYyBmdW5jdGlvbiAoJG0pIHVzZSAoJGNoaWxkcmVuKTogc3RyaW5nIHsKcmV0dXJuICRtWydzdGFydCddIC4gJGNoaWxkcmVuIC4gJG1bJ2VuZCddOwp9LCAkdGhpcy0+Y29udGVudHMpOwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVMaXN0SXRlbShzdHJpbmcgJG1haW5Ob2RlLCBpbnQgJG5vZGVJbmRleCk6IGJvb2wKewoKaWYgKCRub2RlSW5kZXggPCAwKSB7CnJldHVybiB0cnVlOwp9CgokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCgppZiAoW10gPT09ICRkZWNvZGVkWyRtYWluTm9kZV0pIHsKcmV0dXJuIHRydWU7Cn0KCgokbm9kZVJlZ2V4ID0gJ3snLnNlbGY6OkRFRklORVMuJ14oP1A8c3RhcnQ+IFxzKiBceyBccyogKD86ICg/JnN0cmluZykgXHMqIDogKD8manNvbikgXHMqICwgXHMqICkqPycuCnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgkbWFpbk5vZGUpKS4nXHMqOlxzKikoP1A8Y29udGVudD4oPyZhcnJheSkpKD9QPGVuZD4uKil9c3gnOwp0cnkgewppZiAoIVByZWc6OmlzTWF0Y2goJG5vZGVSZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gpKSB7CnJldHVybiBmYWxzZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoJGUtPmdldENvZGUoKSA9PT0gUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1IpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93ICRlOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnc3RhcnQnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFsnY29udGVudCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoWydlbmQnXSkpOwoKJGNoaWxkcmVuID0gJG1hdGNoWydjb250ZW50J107CgoKaWYgKGZhbHNlID09PSBAanNvbl9kZWNvZGUoJGNoaWxkcmVuLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoIWlzc2V0KCRkZWNvZGVkWyRtYWluTm9kZV1bJG5vZGVJbmRleF0pKSB7CnJldHVybiB0cnVlOwp9CgokY29udGVudFJlZ2V4ID0gJyg/Jmpzb24pJzsKCmlmICgkbm9kZUluZGV4ID4gMSkgewokc3RhcnRSZWdleCA9ICcoPyZqc29uKVxzKisoPzosKD8manNvbilccyorKXsnIC4gKCRub2RlSW5kZXggLSAxKSAuICd9JzsKCiRjb250ZW50UmVnZXggPSAnXHMqKyw/XHMqKycgLiAkY29udGVudFJlZ2V4OwokZW5kUmVnZXggPSAnKD86KFxzKissXHMqKyg/Jmpzb24pKSooPzpccyorKD8manNvbikpPylccyorJzsKfSBlbHNlaWYgKCRub2RlSW5kZXggPiAwKSB7CiRzdGFydFJlZ2V4ID0gJyg/Jmpzb24pXHMqKyc7CgokY29udGVudFJlZ2V4ID0gJ1xzKissP1xzKisnIC4gJGNvbnRlbnRSZWdleDsKJGVuZFJlZ2V4ID0gJyg/OihccyorLFxzKisoPyZqc29uKSkqKD86XHMqKyg/Jmpzb24pKT8pXHMqKyc7Cn0gZWxzZSB7CiRzdGFydFJlZ2V4ID0gJ1xzKisnOwoKJGNvbnRlbnRSZWdleCA9ICRjb250ZW50UmVnZXggLiAnXHMqKyw/XHMqKyc7CiRlbmRSZWdleCA9ICcoPzooKD8manNvbilccyorLFxzKispKig/OlxzKisoPyZqc29uKSk/KVxzKisnOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgneycuc2VsZjo6REVGSU5FUy4nKD9QPHN0YXJ0PlxbJyAuICRzdGFydFJlZ2V4IC4gJykoP1A8Y29udGVudD4nIC4gJGNvbnRlbnRSZWdleCAuICcpKD9QPGVuZD4nIC4gJGVuZFJlZ2V4IC4gJ1xdKX1zeCcsICRjaGlsZHJlbiwgJGNoaWxkTWF0Y2gpKSB7CiR0aGlzLT5jb250ZW50cyA9ICRtYXRjaFsnc3RhcnQnXSAuICRjaGlsZE1hdGNoWydzdGFydCddIC4gJGNoaWxkTWF0Y2hbJ2VuZCddIC4gJG1hdGNoWydlbmQnXTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRNYWluS2V5KHN0cmluZyAka2V5LCAkY29udGVudCk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKJGNvbnRlbnQgPSAkdGhpcy0+Zm9ybWF0KCRjb250ZW50KTsKCgokcmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD5ccypce1xzKig/Oig/JnN0cmluZylccyo6XHMqKD8manNvbilccyosXHMqKSo/KScuCicoP1A8a2V5PicucHJlZ19xdW90ZShKc29uRmlsZTo6ZW5jb2RlKCRrZXkpKS4nXHMqOlxzKig/Jmpzb24pKSg/UDxlbmQ+LiopfXN4JzsKaWYgKGlzc2V0KCRkZWNvZGVkWyRrZXldKSAmJiBQcmVnOjppc01hdGNoKCRyZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2hlcykpIHsKCmlmICghQGpzb25fZGVjb2RlKCd7Jy4kbWF0Y2hlc1sna2V5J10uJ30nKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT5jb250ZW50cyA9ICRtYXRjaGVzWydzdGFydCddIC4gSnNvbkZpbGU6OmVuY29kZSgka2V5KS4nOiAnLiRjb250ZW50IC4gJG1hdGNoZXNbJ2VuZCddOwoKcmV0dXJuIHRydWU7Cn0KCgppZiAoUHJlZzo6aXNNYXRjaCgnI1tee1xzXShccyopXH0kIycsICR0aGlzLT5jb250ZW50cywgJG1hdGNoKSkgewokdGhpcy0+Y29udGVudHMgPSBQcmVnOjpyZXBsYWNlKAonIycuJG1hdGNoWzFdLidcfSQjJywKYWRkY3NsYXNoZXMoJywnIC4gJHRoaXMtPm5ld2xpbmUgLiAkdGhpcy0+aW5kZW50IC4gSnNvbkZpbGU6OmVuY29kZSgka2V5KS4gJzogJy4gJGNvbnRlbnQgLiAkdGhpcy0+bmV3bGluZSAuICd9JywgJ1xcJCcpLAokdGhpcy0+Y29udGVudHMKKTsKCnJldHVybiB0cnVlOwp9CgoKJHRoaXMtPmNvbnRlbnRzID0gUHJlZzo6cmVwbGFjZSgKJyNcfSQjJywKYWRkY3NsYXNoZXMoJHRoaXMtPmluZGVudCAuIEpzb25GaWxlOjplbmNvZGUoJGtleSkuICc6ICcuJGNvbnRlbnQgLiAkdGhpcy0+bmV3bGluZSAuICd9JywgJ1xcJCcpLAokdGhpcy0+Y29udGVudHMKKTsKCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTWFpbktleShzdHJpbmcgJGtleSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCmlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVjb2RlZCkpIHsKcmV0dXJuIHRydWU7Cn0KCgokcmVnZXggPSAneycuc2VsZjo6REVGSU5FUy4nXig/UDxzdGFydD5ccypce1xzKig/Oig/JnN0cmluZylccyo6XHMqKD8manNvbilccyosXHMqKSo/KScuCicoP1A8cmVtb3ZhbD4nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgka2V5KSkuJ1xzKjpccyooPyZqc29uKSlccyosP1xzKig/UDxlbmQ+LiopfXN4JzsKaWYgKFByZWc6OmlzTWF0Y2goJHJlZ2V4LCAkdGhpcy0+Y29udGVudHMsICRtYXRjaGVzKSkgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydzdGFydCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3JlbW92YWwnXSkpOwphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWydlbmQnXSkpOwoKCmlmICghQGpzb25fZGVjb2RlKCd7Jy4kbWF0Y2hlc1sncmVtb3ZhbCddLid9JykpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyMsXHMqJCMnLCAkbWF0Y2hlc1snc3RhcnQnXSkgJiYgUHJlZzo6aXNNYXRjaCgnI15cfSQjJywgJG1hdGNoZXNbJ2VuZCddKSkgewokbWF0Y2hlc1snc3RhcnQnXSA9IHJ0cmltKFByZWc6OnJlcGxhY2UoJyMsKFxzKikkIycsICckMScsICRtYXRjaGVzWydzdGFydCddKSwgJHRoaXMtPmluZGVudCk7Cn0KCiR0aGlzLT5jb250ZW50cyA9ICRtYXRjaGVzWydzdGFydCddIC4gJG1hdGNoZXNbJ2VuZCddOwppZiAoUHJlZzo6aXNNYXRjaCgnI15ce1xzKlx9XHMqJCMnLCAkdGhpcy0+Y29udGVudHMpKSB7CiR0aGlzLT5jb250ZW50cyA9ICJ7XG59IjsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoYW5nZUVtcHR5TWFpbktleUZyb21Bc3NvY1RvTGlzdChzdHJpbmcgJGtleSk6IGJvb2wKewokZGVjb2RlZCA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHRoaXMtPmNvbnRlbnRzKTsKCmlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkZGVjb2RlZCkpIHsKcmV0dXJuIHRydWU7Cn0KCiRyZWdleCA9ICd7Jy5zZWxmOjpERUZJTkVTLideKD9QPHN0YXJ0PlxzKlx7XHMqKD86KD8mc3RyaW5nKVxzKjpccyooPyZqc29uKVxzKixccyopKj8nLnByZWdfcXVvdGUoSnNvbkZpbGU6OmVuY29kZSgka2V5KSkuJ1xzKjpccyopKD9QPHJlbW92YWw+XHsoP1A8cmVtb3ZhbF9zcGFjZT5ccyorKVx9KSg/UDxlbmQ+XHMqLD9ccyouKil9c3gnOwppZiAoUHJlZzo6aXNNYXRjaCgkcmVnZXgsICR0aGlzLT5jb250ZW50cywgJG1hdGNoZXMpKSB7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ3N0YXJ0J10pKTsKYXNzZXJ0KGlzX3N0cmluZygkbWF0Y2hlc1sncmVtb3ZhbCddKSk7CmFzc2VydChpc19zdHJpbmcoJG1hdGNoZXNbJ2VuZCddKSk7CgoKaWYgKGZhbHNlID09PSBAanNvbl9kZWNvZGUoJG1hdGNoZXNbJ3JlbW92YWwnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgokdGhpcy0+Y29udGVudHMgPSAkbWF0Y2hlc1snc3RhcnQnXSAuICdbJyAuICRtYXRjaGVzWydyZW1vdmFsX3NwYWNlJ10gLiAnXScgLiAkbWF0Y2hlc1snZW5kJ107CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlTWFpbktleUlmRW1wdHkoc3RyaW5nICRrZXkpOiBib29sCnsKJGRlY29kZWQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCR0aGlzLT5jb250ZW50cyk7CgppZiAoIWFycmF5X2tleV9leGlzdHMoJGtleSwgJGRlY29kZWQpKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNfYXJyYXkoJGRlY29kZWRbJGtleV0pICYmIGNvdW50KCRkZWNvZGVkWyRrZXldKSA9PT0gMCkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZU1haW5LZXkoJGtleSk7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0KCRkYXRhLCBpbnQgJGRlcHRoID0gMCwgYm9vbCAkd2FzT2JqZWN0ID0gZmFsc2UpOiBzdHJpbmcKewppZiAoJGRhdGEgaW5zdGFuY2VvZiBcc3RkQ2xhc3MgfHwgJGRhdGEgaW5zdGFuY2VvZiBcQXJyYXlPYmplY3QpIHsKJGRhdGEgPSAoYXJyYXkpICRkYXRhOwokd2FzT2JqZWN0ID0gdHJ1ZTsKfQoKaWYgKGlzX2FycmF5KCRkYXRhKSkgewppZiAoXGNvdW50KCRkYXRhKSA9PT0gMCkgewpyZXR1cm4gJHdhc09iamVjdCA/ICd7JyAuICR0aGlzLT5uZXdsaW5lIC4gc3RyX3JlcGVhdCgkdGhpcy0+aW5kZW50LCAkZGVwdGggKyAxKSAuICd9JyA6ICdbXSc7Cn0KCmlmIChhcnJheV9pc19saXN0KCRkYXRhKSkgewpmb3JlYWNoICgkZGF0YSBhcyAka2V5ID0+ICR2YWwpIHsKJGRhdGFbJGtleV0gPSAkdGhpcy0+Zm9ybWF0KCR2YWwsICRkZXB0aCArIDEpOwp9CgpyZXR1cm4gJ1snLmltcGxvZGUoJywgJywgJGRhdGEpLiddJzsKfQoKJG91dCA9ICd7JyAuICR0aGlzLT5uZXdsaW5lOwokZWxlbXMgPSBbXTsKZm9yZWFjaCAoJGRhdGEgYXMgJGtleSA9PiAkdmFsKSB7CiRlbGVtc1tdID0gc3RyX3JlcGVhdCgkdGhpcy0+aW5kZW50LCAkZGVwdGggKyAyKSAuIEpzb25GaWxlOjplbmNvZGUoKHN0cmluZykgJGtleSkuICc6ICcuJHRoaXMtPmZvcm1hdCgkdmFsLCAkZGVwdGggKyAxKTsKfQoKcmV0dXJuICRvdXQgLiBpbXBsb2RlKCcsJy4kdGhpcy0+bmV3bGluZSwgJGVsZW1zKSAuICR0aGlzLT5uZXdsaW5lIC4gc3RyX3JlcGVhdCgkdGhpcy0+aW5kZW50LCAkZGVwdGggKyAxKSAuICd9JzsKfQoKcmV0dXJuIEpzb25GaWxlOjplbmNvZGUoJGRhdGEpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGV0ZWN0SW5kZW50aW5nKCk6IHZvaWQKewokdGhpcy0+aW5kZW50ID0gSnNvbkZpbGU6OmRldGVjdEluZGVudGluZygkdGhpcy0+Y29udGVudHMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXEpzb247Cgp1c2UgRXhjZXB0aW9uOwoKCgoKY2xhc3MgSnNvblZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KewoKCgpwcm90ZWN0ZWQgJGVycm9yczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG1lc3NhZ2UsIGFycmF5ICRlcnJvcnMgPSBbXSwgP0V4Y2VwdGlvbiAkcHJldmlvdXMgPSBudWxsKQp7CiR0aGlzLT5lcnJvcnMgPSAkZXJyb3JzOwpwYXJlbnQ6Ol9fY29uc3RydWN0KChzdHJpbmcpICRtZXNzYWdlLCAwLCAkcHJldmlvdXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxNZXRob2RDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxUeXBlXEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxCb29sZWFuVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEFycmF5VHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEJvb2xlYW5UeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50U3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxJbnRlZ2VyUmFuZ2VUeXBlOwp1c2UgUEhQU3RhblxUeXBlXEludGVnZXJUeXBlOwp1c2UgUEhQU3RhblxUeXBlXE1peGVkVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZVV0aWxzOwp1c2UgUEhQU3RhblxUeXBlXFVuaW9uVHlwZTsKCmZpbmFsIGNsYXNzIENvbmZpZ1JldHVyblR5cGVFeHRlbnNpb24gaW1wbGVtZW50cyBEeW5hbWljTWV0aG9kUmV0dXJuVHlwZUV4dGVuc2lvbgp7Cgpwcml2YXRlICRwcm9wZXJ0aWVzID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiRzY2hlbWEgPSBKc29uRmlsZTo6cGFyc2VKc29uKChzdHJpbmcpIGZpbGVfZ2V0X2NvbnRlbnRzKEpzb25GaWxlOjpDT01QT1NFUl9TQ0hFTUFfUEFUSCkpOwoKCgpmb3JlYWNoICgkc2NoZW1hWydwcm9wZXJ0aWVzJ11bJ2NvbmZpZyddWydwcm9wZXJ0aWVzJ10gYXMgJHByb3AgPT4gJGNvbmYpIHsKJHR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRjb25mLCAkcHJvcCk7CgokdGhpcy0+cHJvcGVydGllc1skcHJvcF0gPSAkdHlwZTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3MoKTogc3RyaW5nCnsKcmV0dXJuIENvbmZpZzo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc01ldGhvZFN1cHBvcnRlZChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uKTogYm9vbAp7CnJldHVybiBzdHJ0b2xvd2VyKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCkpID09PSAnZ2V0JzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGVGcm9tTWV0aG9kQ2FsbChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBNZXRob2RDYWxsICRtZXRob2RDYWxsLCBTY29wZSAkc2NvcGUpOiA/VHlwZQp7CiRhcmdzID0gJG1ldGhvZENhbGwtPmdldEFyZ3MoKTsKCmlmIChjb3VudCgkYXJncykgPCAxKSB7CnJldHVybiBudWxsOwp9Cgoka2V5VHlwZSA9ICRzY29wZS0+Z2V0VHlwZSgkYXJnc1swXS0+dmFsdWUpOwppZiAobWV0aG9kX2V4aXN0cygka2V5VHlwZSwgJ2dldENvbnN0YW50U3RyaW5ncycpKSB7IAokc3RyaW5ncyA9ICRrZXlUeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKTsKfSBlbHNlIHsKCiRzdHJpbmdzID0gVHlwZVV0aWxzOjpnZXRDb25zdGFudFN0cmluZ3MoJGtleVR5cGUpOyAKfQppZiAoJHN0cmluZ3MgIT09IFtdKSB7CiR0eXBlcyA9IFtdOwpmb3JlYWNoICgkc3RyaW5ncyBhcyAkc3RyaW5nKSB7CmlmICghaXNzZXQoJHRoaXMtPnByb3BlcnRpZXNbJHN0cmluZy0+Z2V0VmFsdWUoKV0pKSB7CnJldHVybiBudWxsOwp9CiR0eXBlc1tdID0gJHRoaXMtPnByb3BlcnRpZXNbJHN0cmluZy0+Z2V0VmFsdWUoKV07Cn0KCnJldHVybiBUeXBlQ29tYmluYXRvcjo6dW5pb24oLi4uJHR5cGVzKTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcGFyc2VUeXBlKGFycmF5ICRkZWYsIHN0cmluZyAkcGF0aCk6IFR5cGUKewppZiAoaXNzZXQoJGRlZlsndHlwZSddKSkgewokdHlwZXMgPSBbXTsKZm9yZWFjaCAoKGFycmF5KSAkZGVmWyd0eXBlJ10gYXMgJHR5cGUpIHsKc3dpdGNoICgkdHlwZSkgewpjYXNlICdpbnRlZ2VyJzoKaWYgKGluX2FycmF5KCRwYXRoLCBbJ3Byb2Nlc3MtdGltZW91dCcsICdjYWNoZS10dGwnLCAnY2FjaGUtZmlsZXMtdHRsJywgJ2NhY2hlLWZpbGVzLW1heHNpemUnXSwgdHJ1ZSkpIHsKJHR5cGVzW10gPSBJbnRlZ2VyUmFuZ2VUeXBlOjpjcmVhdGVBbGxHcmVhdGVyVGhhbk9yRXF1YWxUbygwKTsKfSBlbHNlIHsKJHR5cGVzW10gPSBuZXcgSW50ZWdlclR5cGUoKTsKfQpicmVhazsKCmNhc2UgJ3N0cmluZyc6CmlmICgkcGF0aCA9PT0gJ2NhY2hlLWZpbGVzLW1heHNpemUnKSB7Cgp9IGVsc2VpZiAoJHBhdGggPT09ICdkaXNjYXJkLWNoYW5nZXMnKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnc3Rhc2gnKTsKfSBlbHNlaWYgKCRwYXRoID09PSAndXNlLXBhcmVudC1kaXInKSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgncHJvbXB0Jyk7Cn0gZWxzZWlmICgkcGF0aCA9PT0gJ3N0b3JlLWF1dGhzJykgewokdHlwZXNbXSA9IG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3Byb21wdCcpOwp9IGVsc2VpZiAoJHBhdGggPT09ICdwbGF0Zm9ybS1jaGVjaycpIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdwaHAtb25seScpOwp9IGVsc2VpZiAoJHBhdGggPT09ICdnaXRodWItcHJvdG9jb2xzJykgewokdHlwZXNbXSA9IG5ldyBVbmlvblR5cGUoW25ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2dpdCcpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdodHRwcycpLCBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCdzc2gnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnaHR0cCcpXSk7Cn0gZWxzZWlmIChzdHJfc3RhcnRzX3dpdGgoJHBhdGgsICdwcmVmZXJyZWQtaW5zdGFsbCcpKSB7CiR0eXBlc1tdID0gbmV3IFVuaW9uVHlwZShbbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnc291cmNlJyksIG5ldyBDb25zdGFudFN0cmluZ1R5cGUoJ2Rpc3QnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnYXV0bycpXSk7Cn0gZWxzZSB7CiR0eXBlc1tdID0gbmV3IFN0cmluZ1R5cGUoKTsKfQpicmVhazsKCmNhc2UgJ2Jvb2xlYW4nOgppZiAoJHBhdGggPT09ICdwbGF0Zm9ybS5hZGRpdGlvbmFsUHJvcGVydGllcycpIHsKJHR5cGVzW10gPSBuZXcgQ29uc3RhbnRCb29sZWFuVHlwZShmYWxzZSk7Cn0gZWxzZSB7CiR0eXBlc1tdID0gbmV3IEJvb2xlYW5UeXBlKCk7Cn0KYnJlYWs7CgpjYXNlICdvYmplY3QnOgokYWRkbFByb3BUeXBlID0gbnVsbDsKaWYgKGlzc2V0KCRkZWZbJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJ10pKSB7CiRhZGRsUHJvcFR5cGUgPSAkdGhpcy0+cGFyc2VUeXBlKCRkZWZbJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJ10sICRwYXRoLicuYWRkaXRpb25hbFByb3BlcnRpZXMnKTsKfQoKaWYgKGlzc2V0KCRkZWZbJ3Byb3BlcnRpZXMnXSkpIHsKJGtleU5hbWVzID0gW107CiR2YWxUeXBlcyA9IFtdOwokb3B0aW9uYWxLZXlzID0gW107CiRwcm9wSW5kZXggPSAwOwpmb3JlYWNoICgkZGVmWydwcm9wZXJ0aWVzJ10gYXMgJHByb3BOYW1lID0+ICRwcm9wZGVmKSB7CiRrZXlOYW1lc1tdID0gbmV3IENvbnN0YW50U3RyaW5nVHlwZSgkcHJvcE5hbWUpOwokdmFsVHlwZSA9ICR0aGlzLT5wYXJzZVR5cGUoJHByb3BkZWYsICRwYXRoLicuJy4kcHJvcE5hbWUpOwppZiAoIWlzc2V0KCRkZWZbJ3JlcXVpcmVkJ10pIHx8ICFpbl9hcnJheSgkcHJvcE5hbWUsICRkZWZbJ3JlcXVpcmVkJ10sIHRydWUpKSB7CiR2YWxUeXBlID0gVHlwZUNvbWJpbmF0b3I6OmFkZE51bGwoJHZhbFR5cGUpOwokb3B0aW9uYWxLZXlzW10gPSAkcHJvcEluZGV4Owp9CiR2YWxUeXBlc1tdID0gJHZhbFR5cGU7CiRwcm9wSW5kZXgrKzsKfQoKaWYgKCRhZGRsUHJvcFR5cGUgIT09IG51bGwpIHsKJHR5cGVzW10gPSBuZXcgQXJyYXlUeXBlKFR5cGVDb21iaW5hdG9yOjp1bmlvbihuZXcgU3RyaW5nVHlwZSgpLCAuLi4ka2V5TmFtZXMpLCBUeXBlQ29tYmluYXRvcjo6dW5pb24oJGFkZGxQcm9wVHlwZSwgLi4uJHZhbFR5cGVzKSk7Cn0gZWxzZSB7CiR0eXBlc1tdID0gbmV3IENvbnN0YW50QXJyYXlUeXBlKCRrZXlOYW1lcywgJHZhbFR5cGVzLCBbMF0sICRvcHRpb25hbEtleXMpOwp9Cn0gZWxzZSB7CiR0eXBlc1tdID0gbmV3IEFycmF5VHlwZShuZXcgU3RyaW5nVHlwZSgpLCAkYWRkbFByb3BUeXBlID8/IG5ldyBNaXhlZFR5cGUoKSk7Cn0KYnJlYWs7CgpjYXNlICdhcnJheSc6CmlmIChpc3NldCgkZGVmWydpdGVtcyddKSkgewokdmFsVHlwZSA9ICR0aGlzLT5wYXJzZVR5cGUoJGRlZlsnaXRlbXMnXSwgJHBhdGguJy5pdGVtcycpOwp9IGVsc2UgewokdmFsVHlwZSA9IG5ldyBNaXhlZFR5cGUoKTsKfQoKJHR5cGVzW10gPSBuZXcgQXJyYXlUeXBlKG5ldyBJbnRlZ2VyVHlwZSgpLCAkdmFsVHlwZSk7CmJyZWFrOwoKZGVmYXVsdDoKJHR5cGVzW10gPSBuZXcgTWl4ZWRUeXBlKCk7Cn0KfQoKJHR5cGUgPSBUeXBlQ29tYmluYXRvcjo6dW5pb24oLi4uJHR5cGVzKTsKfSBlbHNlaWYgKGlzc2V0KCRkZWZbJ2VudW0nXSkpIHsKJHR5cGUgPSBUeXBlQ29tYmluYXRvcjo6dW5pb24oLi4uYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICR2YWx1ZSk6IENvbnN0YW50U3RyaW5nVHlwZSB7CnJldHVybiBuZXcgQ29uc3RhbnRTdHJpbmdUeXBlKCR2YWx1ZSk7Cn0sICRkZWZbJ2VudW0nXSkpOwp9IGVsc2UgewokdHlwZSA9IG5ldyBNaXhlZFR5cGUoKTsKfQoKCmlmICgkcGF0aCA9PT0gJ2FsbG93LXBsdWdpbnMnICYmIHRpbWUoKSA8IHN0cnRvdGltZSgnMjAyMi0wNy0wMScpKSB7CiR0eXBlID0gVHlwZUNvbWJpbmF0b3I6OmFkZE51bGwoJHR5cGUpOwp9CgoKaWYgKGluX2FycmF5KCRwYXRoLCBbJ2F1dG9sb2FkZXItc3VmZml4JywgJ2dpdGxhYi1wcm90b2NvbCddLCB0cnVlKSkgewokdHlwZSA9IFR5cGVDb21iaW5hdG9yOjphZGROdWxsKCR0eXBlKTsKfQoKcmV0dXJuICR0eXBlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJ1bGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMaW5rOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcTWV0aG9kQ2FsbDsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU2NvcGU7CnVzZSBQSFBTdGFuXFJlZmxlY3Rpb25cTWV0aG9kUmVmbGVjdGlvbjsKdXNlIFBIUFN0YW5cVHlwZVxBY2Nlc3NvcnlcQWNjZXNzb3J5Tm9uRW1wdHlTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50QXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50U3RyaW5nVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxDb25zdGFudFxDb25zdGFudEludGVnZXJUeXBlOwp1c2UgUEhQU3RhblxUeXBlXER5bmFtaWNNZXRob2RSZXR1cm5UeXBlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxUeXBlXEludGVnZXJUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFN0cmluZ1R5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxPYmplY3RUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGVDb21iaW5hdG9yOwp1c2UgUGhwUGFyc2VyXE5vZGVcSWRlbnRpZmllcjsKCmZpbmFsIGNsYXNzIFJ1bGVSZWFzb25EYXRhUmV0dXJuVHlwZUV4dGVuc2lvbiBpbXBsZW1lbnRzIER5bmFtaWNNZXRob2RSZXR1cm5UeXBlRXh0ZW5zaW9uCnsKcHVibGljIGZ1bmN0aW9uIGdldENsYXNzKCk6IHN0cmluZwp7CnJldHVybiBSdWxlOjpjbGFzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24pOiBib29sCnsKcmV0dXJuIHN0cnRvbG93ZXIoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSkgPT09ICdnZXRyZWFzb25kYXRhJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGVGcm9tTWV0aG9kQ2FsbChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBNZXRob2RDYWxsICRtZXRob2RDYWxsLCBTY29wZSAkc2NvcGUpOiBUeXBlCnsKJHJlYXNvblR5cGUgPSAkc2NvcGUtPmdldFR5cGUobmV3IE1ldGhvZENhbGwoJG1ldGhvZENhbGwtPnZhciwgbmV3IElkZW50aWZpZXIoJ2dldFJlYXNvbicpKSk7CgokdHlwZXMgPSBbClJ1bGU6OlJVTEVfUk9PVF9SRVFVSVJFID0+IG5ldyBDb25zdGFudEFycmF5VHlwZShbbmV3IENvbnN0YW50U3RyaW5nVHlwZSgncGFja2FnZU5hbWUnKSwgbmV3IENvbnN0YW50U3RyaW5nVHlwZSgnY29uc3RyYWludCcpXSwgW25ldyBTdHJpbmdUeXBlLCBuZXcgT2JqZWN0VHlwZShDb25zdHJhaW50SW50ZXJmYWNlOjpjbGFzcyldKSwKUnVsZTo6UlVMRV9GSVhFRCA9PiBuZXcgQ29uc3RhbnRBcnJheVR5cGUoW25ldyBDb25zdGFudFN0cmluZ1R5cGUoJ3BhY2thZ2UnKV0sIFtuZXcgT2JqZWN0VHlwZShCYXNlUGFja2FnZTo6Y2xhc3MpXSksClJ1bGU6OlJVTEVfUEFDS0FHRV9DT05GTElDVCA9PiBuZXcgT2JqZWN0VHlwZShMaW5rOjpjbGFzcyksClJ1bGU6OlJVTEVfUEFDS0FHRV9SRVFVSVJFUyA9PiBuZXcgT2JqZWN0VHlwZShMaW5rOjpjbGFzcyksClJ1bGU6OlJVTEVfUEFDS0FHRV9TQU1FX05BTUUgPT4gVHlwZUNvbWJpbmF0b3I6OmludGVyc2VjdChuZXcgU3RyaW5nVHlwZSwgbmV3IEFjY2Vzc29yeU5vbkVtcHR5U3RyaW5nVHlwZSgpKSwKUnVsZTo6UlVMRV9MRUFSTkVEID0+IG5ldyBJbnRlZ2VyVHlwZSgpLApSdWxlOjpSVUxFX1BBQ0tBR0VfQUxJQVMgPT4gbmV3IE9iamVjdFR5cGUoQmFzZVBhY2thZ2U6OmNsYXNzKSwKUnVsZTo6UlVMRV9QQUNLQUdFX0lOVkVSU0VfQUxJQVMgPT4gbmV3IE9iamVjdFR5cGUoQmFzZVBhY2thZ2U6OmNsYXNzKSwKXTsKCmZvcmVhY2ggKCR0eXBlcyBhcyAkY29uc3QgPT4gJHR5cGUpIHsKaWYgKChuZXcgQ29uc3RhbnRJbnRlZ2VyVHlwZSgkY29uc3QpKS0+aXNTdXBlclR5cGVPZigkcmVhc29uVHlwZSktPnllcygpKSB7CnJldHVybiAkdHlwZTsKfQp9CgpyZXR1cm4gVHlwZUNvbWJpbmF0b3I6OnVuaW9uKC4uLiR0eXBlcyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CgoKCgpjbGFzcyBBbGlhc1BhY2thZ2UgZXh0ZW5kcyBCYXNlUGFja2FnZQp7Cgpwcm90ZWN0ZWQgJHZlcnNpb247Cgpwcm90ZWN0ZWQgJHByZXR0eVZlcnNpb247Cgpwcm90ZWN0ZWQgJGRldjsKCnByb3RlY3RlZCAkcm9vdFBhY2thZ2VBbGlhcyA9IGZhbHNlOwoKCgoKcHJvdGVjdGVkICRzdGFiaWxpdHk7Cgpwcm90ZWN0ZWQgJGhhc1NlbGZWZXJzaW9uUmVxdWlyZXMgPSBmYWxzZTsKCgpwcm90ZWN0ZWQgJGFsaWFzT2Y7Cgpwcm90ZWN0ZWQgJHJlcXVpcmVzOwoKcHJvdGVjdGVkICRkZXZSZXF1aXJlczsKCnByb3RlY3RlZCAkY29uZmxpY3RzOwoKcHJvdGVjdGVkICRwcm92aWRlczsKCnByb3RlY3RlZCAkcmVwbGFjZXM7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEJhc2VQYWNrYWdlICRhbGlhc09mLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRhbGlhc09mLT5nZXROYW1lKCkpOwoKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKJHRoaXMtPnByZXR0eVZlcnNpb24gPSAkcHJldHR5VmVyc2lvbjsKJHRoaXMtPmFsaWFzT2YgPSAkYWxpYXNPZjsKJHRoaXMtPnN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKTsKJHRoaXMtPmRldiA9ICR0aGlzLT5zdGFiaWxpdHkgPT09ICdkZXYnOwoKZm9yZWFjaCAoTGluazo6JFRZUEVTIGFzICR0eXBlKSB7CiRsaW5rcyA9ICRhbGlhc09mLT57J2dldCcgLiB1Y2ZpcnN0KCR0eXBlKX0oKTsKJHRoaXMtPnskdHlwZX0gPSAkdGhpcy0+cmVwbGFjZVNlbGZWZXJzaW9uRGVwZW5kZW5jaWVzKCRsaW5rcywgJHR5cGUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc09mKCkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2Y7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnN0YWJpbGl0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5wcmV0dHlWZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXYoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGV2Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVxdWlyZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcXVpcmVzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZsaWN0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y29uZmxpY3RzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wcm92aWRlczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwbGFjZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZSZXF1aXJlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZGV2UmVxdWlyZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJvb3RQYWNrYWdlQWxpYXMoYm9vbCAkdmFsdWUpOiB2b2lkCnsKJHRoaXMtPnJvb3RQYWNrYWdlQWxpYXMgPSAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1Jvb3RQYWNrYWdlQWxpYXMoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cm9vdFBhY2thZ2VBbGlhczsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcyhhcnJheSAkbGlua3MsICRsaW5rVHlwZSk6IGFycmF5CnsKCiRwcmV0dHlWZXJzaW9uID0gJHRoaXMtPnByZXR0eVZlcnNpb247CmlmICgkcHJldHR5VmVyc2lvbiA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHByZXR0eVZlcnNpb24gPSAkdGhpcy0+YWxpYXNPZi0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CgppZiAoXGluX2FycmF5KCRsaW5rVHlwZSwgW0xpbms6OlRZUEVfQ09ORkxJQ1QsIExpbms6OlRZUEVfUFJPVklERSwgTGluazo6VFlQRV9SRVBMQUNFXSwgdHJ1ZSkpIHsKJG5ld0xpbmtzID0gW107CmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewoKaWYgKCdzZWxmLnZlcnNpb24nID09PSAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpKSB7CiRuZXdMaW5rc1tdID0gbmV3IExpbmsoJGxpbmstPmdldFNvdXJjZSgpLCAkbGluay0+Z2V0VGFyZ2V0KCksICRjb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkdGhpcy0+dmVyc2lvbiksICRsaW5rVHlwZSwgJHByZXR0eVZlcnNpb24pOwokY29uc3RyYWludC0+c2V0UHJldHR5U3RyaW5nKCRwcmV0dHlWZXJzaW9uKTsKfQp9CiRsaW5rcyA9IGFycmF5X21lcmdlKCRsaW5rcywgJG5ld0xpbmtzKTsKfSBlbHNlIHsKZm9yZWFjaCAoJGxpbmtzIGFzICRpbmRleCA9PiAkbGluaykgewppZiAoJ3NlbGYudmVyc2lvbicgPT09ICRsaW5rLT5nZXRQcmV0dHlDb25zdHJhaW50KCkpIHsKaWYgKCRsaW5rVHlwZSA9PT0gTGluazo6VFlQRV9SRVFVSVJFKSB7CiR0aGlzLT5oYXNTZWxmVmVyc2lvblJlcXVpcmVzID0gdHJ1ZTsKfQokbGlua3NbJGluZGV4XSA9IG5ldyBMaW5rKCRsaW5rLT5nZXRTb3VyY2UoKSwgJGxpbmstPmdldFRhcmdldCgpLCAkY29uc3RyYWludCA9IG5ldyBDb25zdHJhaW50KCc9JywgJHRoaXMtPnZlcnNpb24pLCAkbGlua1R5cGUsICRwcmV0dHlWZXJzaW9uKTsKJGNvbnN0cmFpbnQtPnNldFByZXR0eVN0cmluZygkcHJldHR5VmVyc2lvbik7Cn0KfQp9CgpyZXR1cm4gJGxpbmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzU2VsZlZlcnNpb25SZXF1aXJlcygpOiBib29sCnsKcmV0dXJuICR0aGlzLT5oYXNTZWxmVmVyc2lvblJlcXVpcmVzOwp9CgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpOiBzdHJpbmcKewpyZXR1cm4gcGFyZW50OjpfX3RvU3RyaW5nKCkuJyAoJy4oJHRoaXMtPnJvb3RQYWNrYWdlQWxpYXMgPyAncm9vdCAnIDogJycpLiAnYWxpYXMgb2YgJy4kdGhpcy0+YWxpYXNPZi0+Z2V0VmVyc2lvbigpLicpJzsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0VHlwZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFRhcmdldERpcigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0cmEoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEV4dHJhKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25Tb3VyY2UoP3N0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0SW5zdGFsbGF0aW9uU291cmNlKCR0eXBlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvblNvdXJjZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVR5cGUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U291cmNlVHlwZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZVVybCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVXJscygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U291cmNlVXJscygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlUmVmZXJlbmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZVJlZmVyZW5jZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlUmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U291cmNlUmVmZXJlbmNlKCRyZWZlcmVuY2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlTWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFNvdXJjZU1pcnJvcnMoJG1pcnJvcnMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlTWlycm9ycygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFNvdXJjZU1pcnJvcnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RUeXBlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RUeXBlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERpc3RVcmwoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RVcmxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0VXJscygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFJlZmVyZW5jZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREaXN0UmVmZXJlbmNlKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0UmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGlzdFJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RTaGExQ2hlY2tzdW0oKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdFNoYTFDaGVja3N1bSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJhbnNwb3J0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0VHJhbnNwb3J0T3B0aW9ucygkb3B0aW9ucyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnRPcHRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0TWlycm9ycyg/YXJyYXkgJG1pcnJvcnMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERpc3RNaXJyb3JzKCRtaXJyb3JzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RNaXJyb3JzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RGlzdE1pcnJvcnMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEF1dG9sb2FkKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRBdXRvbG9hZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2QXV0b2xvYWQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldERldkF1dG9sb2FkKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJbmNsdWRlUGF0aHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEluY2x1ZGVQYXRocygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGhwRXh0KCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UGhwRXh0KCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWxlYXNlRGF0ZSgpOiA/XERhdGVUaW1lSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRSZWxlYXNlRGF0ZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmluYXJpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEJpbmFyaWVzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdWdnZXN0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U3VnZ2VzdHMoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvblVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXROb3RpZmljYXRpb25VcmwoKTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRGVmYXVsdEJyYW5jaCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5pc0RlZmF1bHRCcmFuY2goKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RVcmwoP3N0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXREaXN0VXJsKCR1cmwpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFR5cGUoP3N0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGlzdFR5cGUoJHR5cGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlRGlzdFJlZmVyZW5jZXMoc3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFNvdXJjZURpc3RSZWZlcmVuY2VzKCRyZWZlcmVuY2UpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgRmlsdGVySXRlcmF0b3I7CnVzZSBJdGVyYXRvcjsKdXNlIFBoYXJEYXRhOwp1c2UgU3BsRmlsZUluZm87CgoKCgpjbGFzcyBBcmNoaXZhYmxlRmlsZXNGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXJJdGVyYXRvcgp7Cgpwcml2YXRlICRkaXJzID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCk6IGJvb2wKewokZmlsZSA9ICR0aGlzLT5nZXRJbm5lckl0ZXJhdG9yKCktPmN1cnJlbnQoKTsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR0aGlzLT5kaXJzW10gPSAoc3RyaW5nKSAkZmlsZTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhZGRFbXB0eURpcihQaGFyRGF0YSAkcGhhciwgc3RyaW5nICRzb3VyY2VzKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5kaXJzIGFzICRmaWxlcGF0aCkgewokbG9jYWxuYW1lID0gc3RyX3JlcGxhY2UoJHNvdXJjZXMgLiAiLyIsICcnLCAkZmlsZXBhdGgpOwokcGhhci0+YWRkRW1wdHlEaXIoJGxvY2FsbmFtZSk7Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIEZpbGVzeXN0ZW1JdGVyYXRvcjsKdXNlIEZpbHRlckl0ZXJhdG9yOwp1c2UgSXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXFNwbEZpbGVJbmZvOwoKCgoKCgoKCgoKY2xhc3MgQXJjaGl2YWJsZUZpbGVzRmluZGVyIGV4dGVuZHMgRmlsdGVySXRlcmF0b3IKewoKCgpwcm90ZWN0ZWQgJGZpbmRlcjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRzb3VyY2VzLCBhcnJheSAkZXhjbHVkZXMsIGJvb2wgJGlnbm9yZUZpbHRlcnMgPSBmYWxzZSkKewokZnMgPSBuZXcgRmlsZXN5c3RlbSgpOwoKJHNvdXJjZXNSZWFsUGF0aCA9IHJlYWxwYXRoKCRzb3VyY2VzKTsKaWYgKCRzb3VyY2VzUmVhbFBhdGggPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHJlYWxwYXRoKCkgdGhlIHNvdXJjZSBkaXJlY3RvcnkgIicuJHNvdXJjZXMuJyInKTsKfQokc291cmNlcyA9ICRmcy0+bm9ybWFsaXplUGF0aCgkc291cmNlc1JlYWxQYXRoKTsKCmlmICgkaWdub3JlRmlsdGVycykgewokZmlsdGVycyA9IFtdOwp9IGVsc2UgewokZmlsdGVycyA9IFsKbmV3IEdpdEV4Y2x1ZGVGaWx0ZXIoJHNvdXJjZXMpLApuZXcgQ29tcG9zZXJFeGNsdWRlRmlsdGVyKCRzb3VyY2VzLCAkZXhjbHVkZXMpLApdOwp9CgokdGhpcy0+ZmluZGVyID0gbmV3IEZpbmRlcigpOwoKJGZpbHRlciA9IHN0YXRpYyBmdW5jdGlvbiAoXFNwbEZpbGVJbmZvICRmaWxlKSB1c2UgKCRzb3VyY2VzLCAkZmlsdGVycywgJGZzKTogYm9vbCB7CiRyZWFscGF0aCA9ICRmaWxlLT5nZXRSZWFsUGF0aCgpOwppZiAoJHJlYWxwYXRoID09PSBmYWxzZSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCRmaWxlLT5pc0xpbmsoKSAmJiBzdHJwb3MoJHJlYWxwYXRoLCAkc291cmNlcykgIT09IDApIHsKcmV0dXJuIGZhbHNlOwp9CgokcmVsYXRpdmVQYXRoID0gUHJlZzo6cmVwbGFjZSgKJyNeJy5wcmVnX3F1b3RlKCRzb3VyY2VzLCAnIycpLicjJywKJycsCiRmcy0+bm9ybWFsaXplUGF0aCgkcmVhbHBhdGgpCik7CgokZXhjbHVkZSA9IGZhbHNlOwpmb3JlYWNoICgkZmlsdGVycyBhcyAkZmlsdGVyKSB7CiRleGNsdWRlID0gJGZpbHRlci0+ZmlsdGVyKCRyZWxhdGl2ZVBhdGgsICRleGNsdWRlKTsKfQoKcmV0dXJuICEkZXhjbHVkZTsKfTsKCiR0aGlzLT5maW5kZXIKLT5pbigkc291cmNlcykKLT5maWx0ZXIoJGZpbHRlcikKLT5pZ25vcmVWQ1ModHJ1ZSkKLT5pZ25vcmVEb3RGaWxlcyhmYWxzZSkKLT5zb3J0QnlOYW1lKCk7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0aGlzLT5maW5kZXItPmdldEl0ZXJhdG9yKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCk6IGJvb2wKewoKJGN1cnJlbnQgPSAkdGhpcy0+Z2V0SW5uZXJJdGVyYXRvcigpLT5jdXJyZW50KCk7CgppZiAoISRjdXJyZW50LT5pc0RpcigpKSB7CnJldHVybiB0cnVlOwp9CgokaXRlcmF0b3IgPSBuZXcgRmlsZXN5c3RlbUl0ZXJhdG9yKChzdHJpbmcpICRjdXJyZW50LCBGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyk7CgpyZXR1cm4gISRpdGVyYXRvci0+dmFsaWQoKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXEFyY2hpdmVyOwoKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcTG9vcDsKdXNlIENvbXBvc2VyXFV0aWxcU3luY0hlbHBlcjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKCgoKCgpjbGFzcyBBcmNoaXZlTWFuYWdlcgp7Cgpwcm90ZWN0ZWQgJGRvd25sb2FkTWFuYWdlcjsKCnByb3RlY3RlZCAkbG9vcDsKCgoKCnByb3RlY3RlZCAkYXJjaGl2ZXJzID0gW107CgoKCgpwcm90ZWN0ZWQgJG92ZXJ3cml0ZUZpbGVzID0gdHJ1ZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChEb3dubG9hZE1hbmFnZXIgJGRvd25sb2FkTWFuYWdlciwgTG9vcCAkbG9vcCkKewokdGhpcy0+ZG93bmxvYWRNYW5hZ2VyID0gJGRvd25sb2FkTWFuYWdlcjsKJHRoaXMtPmxvb3AgPSAkbG9vcDsKfQoKcHVibGljIGZ1bmN0aW9uIGFkZEFyY2hpdmVyKEFyY2hpdmVySW50ZXJmYWNlICRhcmNoaXZlcik6IHZvaWQKewokdGhpcy0+YXJjaGl2ZXJzW10gPSAkYXJjaGl2ZXI7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3ZlcndyaXRlRmlsZXMoYm9vbCAkb3ZlcndyaXRlRmlsZXMpOiBzZWxmCnsKJHRoaXMtPm92ZXJ3cml0ZUZpbGVzID0gJG92ZXJ3cml0ZUZpbGVzOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VGaWxlbmFtZVBhcnRzKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKJGJhc2VOYW1lID0gJHBhY2thZ2UtPmdldEFyY2hpdmVOYW1lKCk7CmlmIChudWxsID09PSAkYmFzZU5hbWUpIHsKJGJhc2VOYW1lID0gUHJlZzo6cmVwbGFjZSgnI1teYS16MC05LV9dI2knLCAnLScsICRwYWNrYWdlLT5nZXROYW1lKCkpOwp9CgokcGFydHMgPSBbCidiYXNlJyA9PiAkYmFzZU5hbWUsCl07CgokZGlzdFJlZmVyZW5jZSA9ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCk7CmlmIChudWxsICE9PSAkZGlzdFJlZmVyZW5jZSAmJiBQcmVnOjppc01hdGNoKCd7XlthLWYwLTldezQwfSR9JywgJGRpc3RSZWZlcmVuY2UpKSB7CiRwYXJ0c1snZGlzdF9yZWZlcmVuY2UnXSA9ICRkaXN0UmVmZXJlbmNlOwokcGFydHNbJ2Rpc3RfdHlwZSddID0gJHBhY2thZ2UtPmdldERpc3RUeXBlKCk7Cn0gZWxzZSB7CiRwYXJ0c1sndmVyc2lvbiddID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKJHBhcnRzWydkaXN0X3JlZmVyZW5jZSddID0gJGRpc3RSZWZlcmVuY2U7Cn0KCiRzb3VyY2VSZWZlcmVuY2UgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCk7CmlmIChudWxsICE9PSAkc291cmNlUmVmZXJlbmNlKSB7CiRwYXJ0c1snc291cmNlX3JlZmVyZW5jZSddID0gc3Vic3RyKGhhc2goJ3NoYTEnLCAkc291cmNlUmVmZXJlbmNlKSwgMCwgNik7Cn0KCiRwYXJ0cyA9IGFycmF5X2ZpbHRlcigkcGFydHMsIHN0YXRpYyBmdW5jdGlvbiAoP3N0cmluZyAkcGFydCkgewpyZXR1cm4gJHBhcnQgIT09IG51bGw7Cn0pOwpmb3JlYWNoICgkcGFydHMgYXMgJGtleSA9PiAkcGFydCkgewokcGFydHNbJGtleV0gPSBzdHJfcmVwbGFjZSgnLycsICctJywgJHBhcnQpOwp9CgpyZXR1cm4gJHBhcnRzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlRmlsZW5hbWVGcm9tUGFydHMoYXJyYXkgJHBhcnRzKTogc3RyaW5nCnsKcmV0dXJuIGltcGxvZGUoJy0nLCAkcGFydHMpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VGaWxlbmFtZShDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldFBhY2thZ2VGaWxlbmFtZUZyb21QYXJ0cygkdGhpcy0+Z2V0UGFja2FnZUZpbGVuYW1lUGFydHMoJHBhY2thZ2UpKTsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmNoaXZlKENvbXBsZXRlUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgc3RyaW5nICRmb3JtYXQsIHN0cmluZyAkdGFyZ2V0RGlyLCA/c3RyaW5nICRmaWxlTmFtZSA9IG51bGwsIGJvb2wgJGlnbm9yZUZpbHRlcnMgPSBmYWxzZSk6IHN0cmluZwp7CmlmIChlbXB0eSgkZm9ybWF0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRm9ybWF0IG11c3QgYmUgc3BlY2lmaWVkJyk7Cn0KCgokdXNhYmxlQXJjaGl2ZXIgPSBudWxsOwpmb3JlYWNoICgkdGhpcy0+YXJjaGl2ZXJzIGFzICRhcmNoaXZlcikgewppZiAoJGFyY2hpdmVyLT5zdXBwb3J0cygkZm9ybWF0LCAkcGFja2FnZS0+Z2V0U291cmNlVHlwZSgpKSkgewokdXNhYmxlQXJjaGl2ZXIgPSAkYXJjaGl2ZXI7CmJyZWFrOwp9Cn0KCgppZiAobnVsbCA9PT0gJHVzYWJsZUFyY2hpdmVyKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdObyBhcmNoaXZlciBmb3VuZCB0byBzdXBwb3J0ICVzIGZvcm1hdCcsICRmb3JtYXQpKTsKfQoKJGZpbGVzeXN0ZW0gPSBuZXcgRmlsZXN5c3RlbSgpOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHNvdXJjZVBhdGggPSByZWFscGF0aCgnLicpOwp9IGVsc2UgewoKJHNvdXJjZVBhdGggPSBzeXNfZ2V0X3RlbXBfZGlyKCkuJy9jb21wb3Nlcl9hcmNoaXZlJy5iaW4yaGV4KHJhbmRvbV9ieXRlcyg1KSk7CiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHNvdXJjZVBhdGgpOwoKdHJ5IHsKCiRwcm9taXNlID0gJHRoaXMtPmRvd25sb2FkTWFuYWdlci0+ZG93bmxvYWQoJHBhY2thZ2UsICRzb3VyY2VQYXRoKTsKU3luY0hlbHBlcjo6YXdhaXQoJHRoaXMtPmxvb3AsICRwcm9taXNlKTsKJHByb21pc2UgPSAkdGhpcy0+ZG93bmxvYWRNYW5hZ2VyLT5pbnN0YWxsKCRwYWNrYWdlLCAkc291cmNlUGF0aCk7ClN5bmNIZWxwZXI6OmF3YWl0KCR0aGlzLT5sb29wLCAkcHJvbWlzZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkc291cmNlUGF0aCk7CnRocm93ICRlOwp9CgoKaWYgKGZpbGVfZXhpc3RzKCRjb21wb3Nlckpzb25QYXRoID0gJHNvdXJjZVBhdGguJy9jb21wb3Nlci5qc29uJykpIHsKJGpzb25GaWxlID0gbmV3IEpzb25GaWxlKCRjb21wb3Nlckpzb25QYXRoKTsKJGpzb25EYXRhID0gJGpzb25GaWxlLT5yZWFkKCk7CmlmICghZW1wdHkoJGpzb25EYXRhWydhcmNoaXZlJ11bJ25hbWUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVOYW1lKCRqc29uRGF0YVsnYXJjaGl2ZSddWyduYW1lJ10pOwp9CmlmICghZW1wdHkoJGpzb25EYXRhWydhcmNoaXZlJ11bJ2V4Y2x1ZGUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVFeGNsdWRlcygkanNvbkRhdGFbJ2FyY2hpdmUnXVsnZXhjbHVkZSddKTsKfQp9Cn0KCiRzdXBwb3J0ZWRGb3JtYXRzID0gJHRoaXMtPmdldFN1cHBvcnRlZEZvcm1hdHMoKTsKJHBhY2thZ2VOYW1lUGFydHMgPSBudWxsID09PSAkZmlsZU5hbWUgPwokdGhpcy0+Z2V0UGFja2FnZUZpbGVuYW1lUGFydHMoJHBhY2thZ2UpCjogWydiYXNlJyA9PiAkZmlsZU5hbWVdOwoKJHBhY2thZ2VOYW1lID0gJHRoaXMtPmdldFBhY2thZ2VGaWxlbmFtZUZyb21QYXJ0cygkcGFja2FnZU5hbWVQYXJ0cyk7CiRleGNsdWRlUGF0dGVybnMgPSAkdGhpcy0+YnVpbGRFeGNsdWRlUGF0dGVybnMoJHBhY2thZ2VOYW1lUGFydHMsICRzdXBwb3J0ZWRGb3JtYXRzKTsKCgokZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0YXJnZXREaXIpOwokdGFyZ2V0ID0gcmVhbHBhdGgoJHRhcmdldERpcikuJy8nLiRwYWNrYWdlTmFtZS4nLicuJGZvcm1hdDsKJGZpbGVzeXN0ZW0tPmVuc3VyZURpcmVjdG9yeUV4aXN0cyhkaXJuYW1lKCR0YXJnZXQpKTsKCmlmICghJHRoaXMtPm92ZXJ3cml0ZUZpbGVzICYmIGZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CnJldHVybiAkdGFyZ2V0Owp9CgoKJHRlbXBUYXJnZXQgPSBzeXNfZ2V0X3RlbXBfZGlyKCkuJy9jb21wb3Nlcl9hcmNoaXZlJy5iaW4yaGV4KHJhbmRvbV9ieXRlcyg1KSkuJy4nLiRmb3JtYXQ7CiRmaWxlc3lzdGVtLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGVtcFRhcmdldCkpOwoKJGFyY2hpdmVQYXRoID0gJHVzYWJsZUFyY2hpdmVyLT5hcmNoaXZlKAokc291cmNlUGF0aCwKJHRlbXBUYXJnZXQsCiRmb3JtYXQsCmFycmF5X21lcmdlKCRleGNsdWRlUGF0dGVybnMsICRwYWNrYWdlLT5nZXRBcmNoaXZlRXhjbHVkZXMoKSksCiRpZ25vcmVGaWx0ZXJzCik7CiRmaWxlc3lzdGVtLT5yZW5hbWUoJGFyY2hpdmVQYXRoLCAkdGFyZ2V0KTsKCgppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJGZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkc291cmNlUGF0aCk7Cn0KJGZpbGVzeXN0ZW0tPnJlbW92ZSgkdGVtcFRhcmdldCk7CgpyZXR1cm4gJHRhcmdldDsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBidWlsZEV4Y2x1ZGVQYXR0ZXJucyhhcnJheSAkcGFydHMsIGFycmF5ICRmb3JtYXRzKTogYXJyYXkKewokYmFzZSA9ICRwYXJ0c1snYmFzZSddOwppZiAoY291bnQoJHBhcnRzKSA+IDEpIHsKJGJhc2UgLj0gJy0qJzsKfQoKJHBhdHRlcm5zID0gW107CmZvcmVhY2ggKCRmb3JtYXRzIGFzICRmb3JtYXQpIHsKJHBhdHRlcm5zW10gPSAiJGJhc2UuJGZvcm1hdCI7Cn0KCnJldHVybiAkcGF0dGVybnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U3VwcG9ydGVkRm9ybWF0cygpOiBhcnJheQp7CgoKCgoKJGZvcm1hdHMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFyY2hpdmVycyBhcyAkYXJjaGl2ZXIpIHsKJGl0ZW1zID0gW107CnN3aXRjaCAoZ2V0X2NsYXNzKCRhcmNoaXZlcikpIHsKY2FzZSBaaXBBcmNoaXZlcjo6Y2xhc3M6CiRpdGVtcyA9IFsnemlwJ107CmJyZWFrOwoKY2FzZSBQaGFyQXJjaGl2ZXI6OmNsYXNzOgokaXRlbXMgPSBbJ3ppcCcsICd0YXInLCAndGFyLmd6JywgJ3Rhci5iejInXTsKYnJlYWs7Cn0KCiRmb3JtYXRzID0gYXJyYXlfbWVyZ2UoJGZvcm1hdHMsICRpdGVtcyk7Cn0KCnJldHVybiBhcnJheV91bmlxdWUoJGZvcm1hdHMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7CgoKCgoKCmludGVyZmFjZSBBcmNoaXZlckludGVyZmFjZQp7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFyY2hpdmUoc3RyaW5nICRzb3VyY2VzLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRmb3JtYXQsIGFycmF5ICRleGNsdWRlcyA9IFtdLCBib29sICRpZ25vcmVGaWx0ZXJzID0gZmFsc2UpOiBzdHJpbmc7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJGZvcm1hdCwgP3N0cmluZyAkc291cmNlVHlwZSk6IGJvb2w7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKCgoKYWJzdHJhY3QgY2xhc3MgQmFzZUV4Y2x1ZGVGaWx0ZXIKewoKCgpwcm90ZWN0ZWQgJHNvdXJjZVBhdGg7CgoKCgpwcm90ZWN0ZWQgJGV4Y2x1ZGVQYXR0ZXJuczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNvdXJjZVBhdGgpCnsKJHRoaXMtPnNvdXJjZVBhdGggPSAkc291cmNlUGF0aDsKJHRoaXMtPmV4Y2x1ZGVQYXR0ZXJucyA9IFtdOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbHRlcihzdHJpbmcgJHJlbGF0aXZlUGF0aCwgYm9vbCAkZXhjbHVkZSk6IGJvb2wKewpmb3JlYWNoICgkdGhpcy0+ZXhjbHVkZVBhdHRlcm5zIGFzICRwYXR0ZXJuRGF0YSkgewpbJHBhdHRlcm4sICRuZWdhdGUsICRzdHJpcExlYWRpbmdTbGFzaF0gPSAkcGF0dGVybkRhdGE7CgppZiAoJHN0cmlwTGVhZGluZ1NsYXNoKSB7CiRwYXRoID0gc3Vic3RyKCRyZWxhdGl2ZVBhdGgsIDEpOwp9IGVsc2UgewokcGF0aCA9ICRyZWxhdGl2ZVBhdGg7Cn0KCnRyeSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuLCAkcGF0aCkpIHsKJGV4Y2x1ZGUgPSAhJG5lZ2F0ZTsKfQp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewoKfQp9CgpyZXR1cm4gJGV4Y2x1ZGU7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlTGluZXMoYXJyYXkgJGxpbmVzLCBjYWxsYWJsZSAkbGluZVBhcnNlcik6IGFycmF5CnsKcmV0dXJuIGFycmF5X2ZpbHRlcigKYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRsaW5lKSB1c2UgKCRsaW5lUGFyc2VyKSB7CiRsaW5lID0gdHJpbSgkbGluZSk7CgppZiAoISRsaW5lIHx8IDAgPT09IHN0cnBvcygkbGluZSwgJyMnKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRsaW5lUGFyc2VyKCRsaW5lKTsKfSwKJGxpbmVzCiksCnN0YXRpYyBmdW5jdGlvbiAoJHBhdHRlcm4pOiBib29sIHsKcmV0dXJuICRwYXR0ZXJuICE9PSBudWxsOwp9Cik7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2VuZXJhdGVQYXR0ZXJucyhhcnJheSAkcnVsZXMpOiBhcnJheQp7CiRwYXR0ZXJucyA9IFtdOwpmb3JlYWNoICgkcnVsZXMgYXMgJHJ1bGUpIHsKJHBhdHRlcm5zW10gPSAkdGhpcy0+Z2VuZXJhdGVQYXR0ZXJuKCRydWxlKTsKfQoKcmV0dXJuICRwYXR0ZXJuczsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVBhdHRlcm4oc3RyaW5nICRydWxlKTogYXJyYXkKewokbmVnYXRlID0gZmFsc2U7CiRwYXR0ZXJuID0gJyc7CgppZiAoJHJ1bGUgIT09ICcnICYmICRydWxlWzBdID09PSAnIScpIHsKJG5lZ2F0ZSA9IHRydWU7CiRydWxlID0gbHRyaW0oJHJ1bGUsICchJyk7Cn0KCiRmaXJzdFNsYXNoUG9zaXRpb24gPSBzdHJwb3MoJHJ1bGUsICcvJyk7CmlmICgwID09PSAkZmlyc3RTbGFzaFBvc2l0aW9uKSB7CiRwYXR0ZXJuID0gJ14vJzsKfSBlbHNlaWYgKGZhbHNlID09PSAkZmlyc3RTbGFzaFBvc2l0aW9uIHx8IHN0cmxlbigkcnVsZSkgLSAxID09PSAkZmlyc3RTbGFzaFBvc2l0aW9uKSB7CiRwYXR0ZXJuID0gJy8nOwp9CgokcnVsZSA9IHRyaW0oJHJ1bGUsICcvJyk7CgoKJHJ1bGUgPSBzdWJzdHIoRmluZGVyXEdsb2I6OnRvUmVnZXgoJHJ1bGUpLCAyLCAtMik7CgpyZXR1cm4gWyd7Jy4kcGF0dGVybi4kcnVsZS4nKD89JHwvKX0nLCAkbmVnYXRlLCBmYWxzZV07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCgoKCgoKY2xhc3MgQ29tcG9zZXJFeGNsdWRlRmlsdGVyIGV4dGVuZHMgQmFzZUV4Y2x1ZGVGaWx0ZXIKewoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc291cmNlUGF0aCwgYXJyYXkgJGV4Y2x1ZGVSdWxlcykKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRzb3VyY2VQYXRoKTsKJHRoaXMtPmV4Y2x1ZGVQYXR0ZXJucyA9ICR0aGlzLT5nZW5lcmF0ZVBhdHRlcm5zKCRleGNsdWRlUnVsZXMpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgoKCmNsYXNzIEdpdEV4Y2x1ZGVGaWx0ZXIgZXh0ZW5kcyBCYXNlRXhjbHVkZUZpbHRlcgp7CgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNvdXJjZVBhdGgpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkc291cmNlUGF0aCk7CgppZiAoZmlsZV9leGlzdHMoJHNvdXJjZVBhdGguJy8uZ2l0YXR0cmlidXRlcycpKSB7CiR0aGlzLT5leGNsdWRlUGF0dGVybnMgPSBhcnJheV9tZXJnZSgKJHRoaXMtPmV4Y2x1ZGVQYXR0ZXJucywKJHRoaXMtPnBhcnNlTGluZXMoCmZpbGUoJHNvdXJjZVBhdGguJy8uZ2l0YXR0cmlidXRlcycpLApbJHRoaXMsICdwYXJzZUdpdEF0dHJpYnV0ZXNMaW5lJ10KKQopOwp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VHaXRBdHRyaWJ1dGVzTGluZShzdHJpbmcgJGxpbmUpOiA/YXJyYXkKewokcGFydHMgPSBQcmVnOjpzcGxpdCgnI1xzKyMnLCAkbGluZSk7CgppZiAoY291bnQoJHBhcnRzKSA9PT0gMiAmJiAkcGFydHNbMV0gPT09ICdleHBvcnQtaWdub3JlJykgewpyZXR1cm4gJHRoaXMtPmdlbmVyYXRlUGF0dGVybigkcGFydHNbMF0pOwp9CgppZiAoY291bnQoJHBhcnRzKSA9PT0gMiAmJiAkcGFydHNbMV0gPT09ICctZXhwb3J0LWlnbm9yZScpIHsKcmV0dXJuICR0aGlzLT5nZW5lcmF0ZVBhdHRlcm4oJyEnLiRwYXJ0c1swXSk7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcQXJjaGl2ZXI7Cgp1c2UgUGhhckRhdGE7CgoKCgoKCmNsYXNzIFBoYXJBcmNoaXZlciBpbXBsZW1lbnRzIEFyY2hpdmVySW50ZXJmYWNlCnsKCnByb3RlY3RlZCBzdGF0aWMgJGZvcm1hdHMgPSBbCid6aXAnID0+IFxQaGFyOjpaSVAsCid0YXInID0+IFxQaGFyOjpUQVIsCid0YXIuZ3onID0+IFxQaGFyOjpUQVIsCid0YXIuYnoyJyA9PiBcUGhhcjo6VEFSLApdOwoKCnByb3RlY3RlZCBzdGF0aWMgJGNvbXByZXNzRm9ybWF0cyA9IFsKJ3Rhci5neicgPT4gXFBoYXI6OkdaLAondGFyLmJ6MicgPT4gXFBoYXI6OkJaMiwKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmNoaXZlKHN0cmluZyAkc291cmNlcywgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkZm9ybWF0LCBhcnJheSAkZXhjbHVkZXMgPSBbXSwgYm9vbCAkaWdub3JlRmlsdGVycyA9IGZhbHNlKTogc3RyaW5nCnsKJHNvdXJjZXMgPSByZWFscGF0aCgkc291cmNlcyk7CgoKaWYgKGZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7CnVubGluaygkdGFyZ2V0KTsKfQoKdHJ5IHsKJGZpbGVuYW1lID0gc3Vic3RyKCR0YXJnZXQsIDAsIHN0cnJwb3MoJHRhcmdldCwgJGZvcm1hdCkgLSAxKTsKCgppZiAoaXNzZXQoc3RhdGljOjokY29tcHJlc3NGb3JtYXRzWyRmb3JtYXRdKSkgewoKJHRhcmdldCA9ICRmaWxlbmFtZSAuICcudGFyJzsKfQoKJHBoYXIgPSBuZXcgUGhhckRhdGEoCiR0YXJnZXQsClxGaWxlc3lzdGVtSXRlcmF0b3I6OktFWV9BU19QQVRITkFNRSB8IFxGaWxlc3lzdGVtSXRlcmF0b3I6OkNVUlJFTlRfQVNfRklMRUlORk8sCicnLApzdGF0aWM6OiRmb3JtYXRzWyRmb3JtYXRdCik7CiRmaWxlcyA9IG5ldyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIoJHNvdXJjZXMsICRleGNsdWRlcywgJGlnbm9yZUZpbHRlcnMpOwokZmlsZXNPbmx5ID0gbmV3IEFyY2hpdmFibGVGaWxlc0ZpbHRlcigkZmlsZXMpOwokcGhhci0+YnVpbGRGcm9tSXRlcmF0b3IoJGZpbGVzT25seSwgJHNvdXJjZXMpOwokZmlsZXNPbmx5LT5hZGRFbXB0eURpcigkcGhhciwgJHNvdXJjZXMpOwoKaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSkgewokdGFyZ2V0ID0gJGZpbGVuYW1lIC4gJy4nIC4gJGZvcm1hdDsKdW5zZXQoJHBoYXIpOwoKaWYgKCRmb3JtYXQgPT09ICd0YXInKSB7CgpmaWxlX3B1dF9jb250ZW50cygkdGFyZ2V0LCBzdHJfcmVwZWF0KCJcMCIsIDEwMjQwKSk7Cn0gZWxzZWlmICgkZm9ybWF0ID09PSAnemlwJykgewoKJGVvY2QgPSBwYWNrKAonVnZ2dnZWVnYnLAoweDA2MDU0YjUwLCAKMCwgCjAsIAowLCAKMCwgCjAsIAowLCAKMCAKKTsKCmZpbGVfcHV0X2NvbnRlbnRzKCR0YXJnZXQsICRlb2NkKTsKfSBlbHNlaWYgKCRmb3JtYXQgPT09ICd0YXIuZ3onIHx8ICRmb3JtYXQgPT09ICd0YXIuYnoyJykgewppZiAoIVBoYXJEYXRhOjpjYW5Db21wcmVzcyhzdGF0aWM6OiRjb21wcmVzc0Zvcm1hdHNbJGZvcm1hdF0pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdDYW4gbm90IGNvbXByZXNzIHRvICVzIGZvcm1hdCcsICRmb3JtYXQpKTsKfQppZiAoJGZvcm1hdCA9PT0gJ3Rhci5neicgJiYgZnVuY3Rpb25fZXhpc3RzKCdnemNvbXByZXNzJykpIHsKZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgZ3pjb21wcmVzcyhzdHJfcmVwZWF0KCJcMCIsIDEwMjQwKSkpOwp9IGVsc2VpZiAoJGZvcm1hdCA9PT0gJ3Rhci5iejInICYmIGZ1bmN0aW9uX2V4aXN0cygnYnpjb21wcmVzcycpKSB7CmZpbGVfcHV0X2NvbnRlbnRzKCR0YXJnZXQsIGJ6Y29tcHJlc3Moc3RyX3JlcGVhdCgiXDAiLCAxMDI0MCkpKTsKfQp9CgpyZXR1cm4gJHRhcmdldDsKfQoKaWYgKGlzc2V0KHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKCmlmICghUGhhckRhdGE6OmNhbkNvbXByZXNzKHN0YXRpYzo6JGNvbXByZXNzRm9ybWF0c1skZm9ybWF0XSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0NhbiBub3QgY29tcHJlc3MgdG8gJXMgZm9ybWF0JywgJGZvcm1hdCkpOwp9CgoKdW5saW5rKCR0YXJnZXQpOwoKCiRwaGFyLT5jb21wcmVzcyhzdGF0aWM6OiRjb21wcmVzc0Zvcm1hdHNbJGZvcm1hdF0pOwoKCiR0YXJnZXQgPSAkZmlsZW5hbWUgLiAnLicgLiAkZm9ybWF0Owp9CgpyZXR1cm4gJHRhcmdldDsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewokbWVzc2FnZSA9IHNwcmludGYoCiJDb3VsZCBub3QgY3JlYXRlIGFyY2hpdmUgJyVzJyBmcm9tICclcyc6ICVzIiwKJHRhcmdldCwKJHNvdXJjZXMsCiRlLT5nZXRNZXNzYWdlKCkKKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSwgJGUtPmdldENvZGUoKSwgJGUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0cyhzdHJpbmcgJGZvcm1hdCwgP3N0cmluZyAkc291cmNlVHlwZSk6IGJvb2wKewpyZXR1cm4gaXNzZXQoc3RhdGljOjokZm9ybWF0c1skZm9ybWF0XSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxBcmNoaXZlcjsKCnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgWmlwQXJjaGl2ZTsKCgoKCmNsYXNzIFppcEFyY2hpdmVyIGltcGxlbWVudHMgQXJjaGl2ZXJJbnRlcmZhY2UKewoKcHJvdGVjdGVkIHN0YXRpYyAkZm9ybWF0cyA9IFsKJ3ppcCcgPT4gdHJ1ZSwKXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmNoaXZlKHN0cmluZyAkc291cmNlcywgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkZm9ybWF0LCBhcnJheSAkZXhjbHVkZXMgPSBbXSwgYm9vbCAkaWdub3JlRmlsdGVycyA9IGZhbHNlKTogc3RyaW5nCnsKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJHNvdXJjZXNSZWFscGF0aCA9IHJlYWxwYXRoKCRzb3VyY2VzKTsKaWYgKGZhbHNlICE9PSAkc291cmNlc1JlYWxwYXRoKSB7CiRzb3VyY2VzID0gJHNvdXJjZXNSZWFscGF0aDsKfQp1bnNldCgkc291cmNlc1JlYWxwYXRoKTsKJHNvdXJjZXMgPSAkZnMtPm5vcm1hbGl6ZVBhdGgoJHNvdXJjZXMpOwoKJHppcCA9IG5ldyBaaXBBcmNoaXZlKCk7CiRyZXMgPSAkemlwLT5vcGVuKCR0YXJnZXQsIFppcEFyY2hpdmU6OkNSRUFURSk7CmlmICgkcmVzID09PSB0cnVlKSB7CiRmaWxlcyA9IG5ldyBBcmNoaXZhYmxlRmlsZXNGaW5kZXIoJHNvdXJjZXMsICRleGNsdWRlcywgJGlnbm9yZUZpbHRlcnMpOwpmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsKCiRmaWxlcGF0aCA9ICRmaWxlLT5nZXRQYXRobmFtZSgpOwokcmVsYXRpdmVQYXRoID0gJGZpbGUtPmdldFJlbGF0aXZlUGF0aG5hbWUoKTsKCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHJlbGF0aXZlUGF0aCA9IHN0cnRyKCRyZWxhdGl2ZVBhdGgsICdcXCcsICcvJyk7Cn0KCmlmICgkZmlsZS0+aXNEaXIoKSkgewokemlwLT5hZGRFbXB0eURpcigkcmVsYXRpdmVQYXRoKTsKfSBlbHNlIHsKJHppcC0+YWRkRmlsZSgkZmlsZXBhdGgsICRyZWxhdGl2ZVBhdGgpOwp9CgoKCgppZiAobWV0aG9kX2V4aXN0cygkemlwLCAnc2V0RXh0ZXJuYWxBdHRyaWJ1dGVzTmFtZScpKSB7CiRwZXJtcyA9IGZpbGVwZXJtcygkZmlsZXBhdGgpOwoKCgoKJHppcC0+c2V0RXh0ZXJuYWxBdHRyaWJ1dGVzTmFtZSgkcmVsYXRpdmVQYXRoLCBaaXBBcmNoaXZlOjpPUFNZU19VTklYLCAkcGVybXMgPDwgMTYpOwp9Cn0KaWYgKCR6aXAtPmNsb3NlKCkpIHsKaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSkgewoKJGVvY2QgPSBwYWNrKAonVnZ2dnZWVnYnLAoweDA2MDU0YjUwLCAKMCwgCjAsIAowLCAKMCwgCjAsIAowLCAKMCAKKTsKZmlsZV9wdXRfY29udGVudHMoJHRhcmdldCwgJGVvY2QpOwp9CgpyZXR1cm4gJHRhcmdldDsKfQp9CiRtZXNzYWdlID0gc3ByaW50ZigKIkNvdWxkIG5vdCBjcmVhdGUgYXJjaGl2ZSAnJXMnIGZyb20gJyVzJzogJXMiLAokdGFyZ2V0LAokc291cmNlcywKJHppcC0+Z2V0U3RhdHVzU3RyaW5nKCkKKTsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRtZXNzYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHN1cHBvcnRzKHN0cmluZyAkZm9ybWF0LCA/c3RyaW5nICRzb3VyY2VUeXBlKTogYm9vbAp7CnJldHVybiBpc3NldChzdGF0aWM6OiRmb3JtYXRzWyRmb3JtYXRdKSAmJiAkdGhpcy0+Y29tcHJlc3Npb25BdmFpbGFibGUoKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjb21wcmVzc2lvbkF2YWlsYWJsZSgpOiBib29sCnsKcmV0dXJuIGNsYXNzX2V4aXN0cygnWmlwQXJjaGl2ZScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7Cgp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CgoKCgoKCmFic3RyYWN0IGNsYXNzIEJhc2VQYWNrYWdlIGltcGxlbWVudHMgUGFja2FnZUludGVyZmFjZQp7CgoKCgpwdWJsaWMgc3RhdGljICRzdXBwb3J0ZWRMaW5rVHlwZXMgPSBbCidyZXF1aXJlJyA9PiBbJ2Rlc2NyaXB0aW9uJyA9PiAncmVxdWlyZXMnLCAnbWV0aG9kJyA9PiBMaW5rOjpUWVBFX1JFUVVJUkVdLAonY29uZmxpY3QnID0+IFsnZGVzY3JpcHRpb24nID0+ICdjb25mbGljdHMnLCAnbWV0aG9kJyA9PiBMaW5rOjpUWVBFX0NPTkZMSUNUXSwKJ3Byb3ZpZGUnID0+IFsnZGVzY3JpcHRpb24nID0+ICdwcm92aWRlcycsICdtZXRob2QnID0+IExpbms6OlRZUEVfUFJPVklERV0sCidyZXBsYWNlJyA9PiBbJ2Rlc2NyaXB0aW9uJyA9PiAncmVwbGFjZXMnLCAnbWV0aG9kJyA9PiBMaW5rOjpUWVBFX1JFUExBQ0VdLAoncmVxdWlyZS1kZXYnID0+IFsnZGVzY3JpcHRpb24nID0+ICdyZXF1aXJlcyAoZm9yIGRldmVsb3BtZW50KScsICdtZXRob2QnID0+IExpbms6OlRZUEVfREVWX1JFUVVJUkVdLApdOwoKcHVibGljIGNvbnN0IFNUQUJJTElUWV9TVEFCTEUgPSAwOwpwdWJsaWMgY29uc3QgU1RBQklMSVRZX1JDID0gNTsKcHVibGljIGNvbnN0IFNUQUJJTElUWV9CRVRBID0gMTA7CnB1YmxpYyBjb25zdCBTVEFCSUxJVFlfQUxQSEEgPSAxNTsKcHVibGljIGNvbnN0IFNUQUJJTElUWV9ERVYgPSAyMDsKCnB1YmxpYyBjb25zdCBTVEFCSUxJVElFUyA9IFsKJ3N0YWJsZScgPT4gc2VsZjo6U1RBQklMSVRZX1NUQUJMRSwKJ1JDJyA9PiBzZWxmOjpTVEFCSUxJVFlfUkMsCidiZXRhJyA9PiBzZWxmOjpTVEFCSUxJVFlfQkVUQSwKJ2FscGhhJyA9PiBzZWxmOjpTVEFCSUxJVFlfQUxQSEEsCidkZXYnID0+IHNlbGY6OlNUQUJJTElUWV9ERVYsCl07CgoKCgoKCgpwdWJsaWMgc3RhdGljICRzdGFiaWxpdGllcyA9IHNlbGY6OlNUQUJJTElUSUVTOwoKCgoKCgpwdWJsaWMgJGlkOwoKcHJvdGVjdGVkICRuYW1lOwoKcHJvdGVjdGVkICRwcmV0dHlOYW1lOwoKcHJvdGVjdGVkICRyZXBvc2l0b3J5ID0gbnVsbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSkKewokdGhpcy0+cHJldHR5TmFtZSA9ICRuYW1lOwokdGhpcy0+bmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwokdGhpcy0+aWQgPSAtMTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnByZXR0eU5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lcygkcHJvdmlkZXMgPSB0cnVlKTogYXJyYXkKewokbmFtZXMgPSBbCiR0aGlzLT5nZXROYW1lKCkgPT4gdHJ1ZSwKXTsKCmlmICgkcHJvdmlkZXMpIHsKZm9yZWFjaCAoJHRoaXMtPmdldFByb3ZpZGVzKCkgYXMgJGxpbmspIHsKJG5hbWVzWyRsaW5rLT5nZXRUYXJnZXQoKV0gPSB0cnVlOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CiRuYW1lc1skbGluay0+Z2V0VGFyZ2V0KCldID0gdHJ1ZTsKfQoKcmV0dXJuIGFycmF5X2tleXMoJG5hbWVzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElkKGludCAkaWQpOiB2b2lkCnsKJHRoaXMtPmlkID0gJGlkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SWQoKTogaW50CnsKcmV0dXJuICR0aGlzLT5pZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewppZiAoJHRoaXMtPnJlcG9zaXRvcnkgJiYgJHJlcG9zaXRvcnkgIT09ICR0aGlzLT5yZXBvc2l0b3J5KSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZigKJ1BhY2thZ2UgIiVzIiBjYW5ub3QgYmUgYWRkZWQgdG8gcmVwb3NpdG9yeSAiJXMiIGFzIGl0IGlzIGFscmVhZHkgaW4gcmVwb3NpdG9yeSAiJXMiLicsCiR0aGlzLT5nZXRQcmV0dHlOYW1lKCksCiRyZXBvc2l0b3J5LT5nZXRSZXBvTmFtZSgpLAokdGhpcy0+cmVwb3NpdG9yeS0+Z2V0UmVwb05hbWUoKQopKTsKfQokdGhpcy0+cmVwb3NpdG9yeSA9ICRyZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeSgpOiA/UmVwb3NpdG9yeUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yeTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUGxhdGZvcm0oKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Z2V0UmVwb3NpdG9yeSgpIGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VW5pcXVlTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmdldE5hbWUoKS4nLScuJHRoaXMtPmdldFZlcnNpb24oKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVxdWFscyhQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CiRzZWxmID0gJHRoaXM7CmlmICgkdGhpcyBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokc2VsZiA9ICR0aGlzLT5nZXRBbGlhc09mKCk7Cn0KaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRwYWNrYWdlID0gJHBhY2thZ2UtPmdldEFsaWFzT2YoKTsKfQoKcmV0dXJuICRwYWNrYWdlID09PSAkc2VsZjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRVbmlxdWVOYW1lKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlTdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRQcmV0dHlOYW1lKCkuJyAnLiR0aGlzLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGdWxsUHJldHR5VmVyc2lvbihib29sICR0cnVuY2F0ZSA9IHRydWUsIGludCAkZGlzcGxheU1vZGUgPSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUZfSUZfREVWKTogc3RyaW5nCnsKaWYgKAokZGlzcGxheU1vZGUgPT09IFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYKJiYgKAohJHRoaXMtPmlzRGV2KCkKfHwgKAohXGluX2FycmF5KCR0aGlzLT5nZXRTb3VyY2VUeXBlKCksIFsnaGcnLCAnZ2l0J10pCiYmICgoc3RyaW5nKSAkdGhpcy0+Z2V0U291cmNlVHlwZSgpICE9PSAnJyB8fCAoc3RyaW5nKSAkdGhpcy0+Z2V0RGlzdFJlZmVyZW5jZSgpID09PSAnJykKKQopCikgewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKc3dpdGNoICgkZGlzcGxheU1vZGUpIHsKY2FzZSBQYWNrYWdlSW50ZXJmYWNlOjpESVNQTEFZX1NPVVJDRV9SRUZfSUZfREVWOgokcmVmZXJlbmNlID0gKHN0cmluZykgJHRoaXMtPmdldFNvdXJjZVJlZmVyZW5jZSgpICE9PSAnJyA/ICR0aGlzLT5nZXRTb3VyY2VSZWZlcmVuY2UoKSA6ICR0aGlzLT5nZXREaXN0UmVmZXJlbmNlKCk7CmJyZWFrOwpjYXNlIFBhY2thZ2VJbnRlcmZhY2U6OkRJU1BMQVlfU09VUkNFX1JFRjoKJHJlZmVyZW5jZSA9ICR0aGlzLT5nZXRTb3VyY2VSZWZlcmVuY2UoKTsKYnJlYWs7CmNhc2UgUGFja2FnZUludGVyZmFjZTo6RElTUExBWV9ESVNUX1JFRjoKJHJlZmVyZW5jZSA9ICR0aGlzLT5nZXREaXN0UmVmZXJlbmNlKCk7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRGlzcGxheSBtb2RlICcuJGRpc3BsYXlNb2RlLicgaXMgbm90IHN1cHBvcnRlZCcpOwp9CgppZiAobnVsbCA9PT0gJHJlZmVyZW5jZSkgewpyZXR1cm4gJHRoaXMtPmdldFByZXR0eVZlcnNpb24oKTsKfQoKCmlmICgkdHJ1bmNhdGUgJiYgXHN0cmxlbigkcmVmZXJlbmNlKSA9PT0gNDAgJiYgJHRoaXMtPmdldFNvdXJjZVR5cGUoKSAhPT0gJ3N2bicpIHsKcmV0dXJuICR0aGlzLT5nZXRQcmV0dHlWZXJzaW9uKCkgLiAnICcgLiBzdWJzdHIoJHJlZmVyZW5jZSwgMCwgNyk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0UHJldHR5VmVyc2lvbigpIC4gJyAnIC4gJHJlZmVyZW5jZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eVByaW9yaXR5KCk6IGludAp7CnJldHVybiBzZWxmOjpTVEFCSUxJVElFU1skdGhpcy0+Z2V0U3RhYmlsaXR5KCldOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKJHRoaXMtPnJlcG9zaXRvcnkgPSBudWxsOwokdGhpcy0+aWQgPSAtMTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYWNrYWdlTmFtZVRvUmVnZXhwKHN0cmluZyAkYWxsb3dQYXR0ZXJuLCBzdHJpbmcgJHdyYXAgPSAne14lcyR9aScpOiBzdHJpbmcKewokY2xlYW5lZEFsbG93UGF0dGVybiA9IHN0cl9yZXBsYWNlKCdcXConLCAnLionLCBwcmVnX3F1b3RlKCRhbGxvd1BhdHRlcm4pKTsKCnJldHVybiBzcHJpbnRmKCR3cmFwLCAkY2xlYW5lZEFsbG93UGF0dGVybik7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhY2thZ2VOYW1lc1RvUmVnZXhwKGFycmF5ICRwYWNrYWdlTmFtZXMsIHN0cmluZyAkd3JhcCA9ICd7Xig/OiVzKSR9aUQnKTogc3RyaW5nCnsKJHBhY2thZ2VOYW1lcyA9IGFycmF5X21hcCgKc3RhdGljIGZ1bmN0aW9uICgkcGFja2FnZU5hbWUpOiBzdHJpbmcgewpyZXR1cm4gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lVG9SZWdleHAoJHBhY2thZ2VOYW1lLCAnJXMnKTsKfSwKJHBhY2thZ2VOYW1lcwopOwoKcmV0dXJuIHNwcmludGYoJHdyYXAsIGltcGxvZGUoJ3wnLCAkcGFja2FnZU5hbWVzKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxDb21wYXJlcjsKCnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgpjbGFzcyBDb21wYXJlcgp7Cgpwcml2YXRlICRzb3VyY2U7Cgpwcml2YXRlICR1cGRhdGU7Cgpwcml2YXRlICRjaGFuZ2VkOwoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZShzdHJpbmcgJHNvdXJjZSk6IHZvaWQKewokdGhpcy0+c291cmNlID0gJHNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFVwZGF0ZShzdHJpbmcgJHVwZGF0ZSk6IHZvaWQKewokdGhpcy0+dXBkYXRlID0gJHVwZGF0ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZWQoYm9vbCAkZXhwbGljYXRlZCA9IGZhbHNlKQp7CiRjaGFuZ2VkID0gJHRoaXMtPmNoYW5nZWQ7CmlmICghY291bnQoJGNoYW5nZWQpKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJGV4cGxpY2F0ZWQpIHsKZm9yZWFjaCAoJGNoYW5nZWQgYXMgJHNlY3Rpb25LZXkgPT4gJGl0ZW1TZWN0aW9uKSB7CmZvcmVhY2ggKCRpdGVtU2VjdGlvbiBhcyAkaXRlbUtleSA9PiAkaXRlbSkgewokY2hhbmdlZFskc2VjdGlvbktleV1bJGl0ZW1LZXldID0gJGl0ZW0uJyAoJy4kc2VjdGlvbktleS4nKSc7Cn0KfQp9CgpyZXR1cm4gJGNoYW5nZWQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VkQXNTdHJpbmcoYm9vbCAkdG9TdHJpbmcgPSBmYWxzZSwgYm9vbCAkZXhwbGljYXRlZCA9IGZhbHNlKTogc3RyaW5nCnsKJGNoYW5nZWQgPSAkdGhpcy0+Z2V0Q2hhbmdlZCgkZXhwbGljYXRlZCk7CmlmIChmYWxzZSA9PT0gJGNoYW5nZWQpIHsKcmV0dXJuICcnOwp9Cgokc3RyaW5ncyA9IFtdOwpmb3JlYWNoICgkY2hhbmdlZCBhcyAkc2VjdGlvbktleSA9PiAkaXRlbVNlY3Rpb24pIHsKZm9yZWFjaCAoJGl0ZW1TZWN0aW9uIGFzICRpdGVtS2V5ID0+ICRpdGVtKSB7CiRzdHJpbmdzW10gPSAkaXRlbS4iXHJcbiI7Cn0KfQoKcmV0dXJuIHRyaW0oaW1wbG9kZSgiXHJcbiIsICRzdHJpbmdzKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBkb0NvbXBhcmUoKTogdm9pZAp7CiRzb3VyY2UgPSBbXTsKJGRlc3RpbmF0aW9uID0gW107CiR0aGlzLT5jaGFuZ2VkID0gW107CiRjdXJyZW50RGlyZWN0b3J5ID0gUGxhdGZvcm06OmdldEN3ZCgpOwpjaGRpcigkdGhpcy0+c291cmNlKTsKJHNvdXJjZSA9ICR0aGlzLT5kb1RyZWUoJy4nLCAkc291cmNlKTsKaWYgKCFpc19hcnJheSgkc291cmNlKSkgewpyZXR1cm47Cn0KY2hkaXIoJGN1cnJlbnREaXJlY3RvcnkpOwpjaGRpcigkdGhpcy0+dXBkYXRlKTsKJGRlc3RpbmF0aW9uID0gJHRoaXMtPmRvVHJlZSgnLicsICRkZXN0aW5hdGlvbik7CmlmICghaXNfYXJyYXkoJGRlc3RpbmF0aW9uKSkgewpleGl0Owp9CmNoZGlyKCRjdXJyZW50RGlyZWN0b3J5KTsKZm9yZWFjaCAoJHNvdXJjZSBhcyAkZGlyID0+ICR2YWx1ZSkgewpmb3JlYWNoICgkdmFsdWUgYXMgJGZpbGUgPT4gJGhhc2gpIHsKaWYgKGlzc2V0KCRkZXN0aW5hdGlvblskZGlyXVskZmlsZV0pKSB7CmlmICgkaGFzaCAhPT0gJGRlc3RpbmF0aW9uWyRkaXJdWyRmaWxlXSkgewokdGhpcy0+Y2hhbmdlZFsnY2hhbmdlZCddW10gPSAkZGlyLicvJy4kZmlsZTsKfQp9IGVsc2UgewokdGhpcy0+Y2hhbmdlZFsncmVtb3ZlZCddW10gPSAkZGlyLicvJy4kZmlsZTsKfQp9Cn0KZm9yZWFjaCAoJGRlc3RpbmF0aW9uIGFzICRkaXIgPT4gJHZhbHVlKSB7CmZvcmVhY2ggKCR2YWx1ZSBhcyAkZmlsZSA9PiAkaGFzaCkgewppZiAoIWlzc2V0KCRzb3VyY2VbJGRpcl1bJGZpbGVdKSkgewokdGhpcy0+Y2hhbmdlZFsnYWRkZWQnXVtdID0gJGRpci4nLycuJGZpbGU7Cn0KfQp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1RyZWUoc3RyaW5nICRkaXIsIGFycmF5ICYkYXJyYXkpCnsKaWYgKCRkaCA9IG9wZW5kaXIoJGRpcikpIHsKd2hpbGUgKCRmaWxlID0gcmVhZGRpcigkZGgpKSB7CmlmICgkZmlsZSAhPT0gJy4nICYmICRmaWxlICE9PSAnLi4nKSB7CmlmIChpc19saW5rKCRkaXIuJy8nLiRmaWxlKSkgewokYXJyYXlbJGRpcl1bJGZpbGVdID0gcmVhZGxpbmsoJGRpci4nLycuJGZpbGUpOwp9IGVsc2VpZiAoaXNfZGlyKCRkaXIuJy8nLiRmaWxlKSkgewppZiAoIWNvdW50KCRhcnJheSkpIHsKJGFycmF5WzBdID0gJ1RlbXAnOwp9CmlmICghJHRoaXMtPmRvVHJlZSgkZGlyLicvJy4kZmlsZSwgJGFycmF5KSkgewpyZXR1cm4gZmFsc2U7Cn0KfSBlbHNlaWYgKGlzX2ZpbGUoJGRpci4nLycuJGZpbGUpICYmIGZpbGVzaXplKCRkaXIuJy8nLiRmaWxlKSkgewokYXJyYXlbJGRpcl1bJGZpbGVdID0gaGFzaF9maWxlKFxQSFBfVkVSU0lPTl9JRCA+IDgwMTAwID8gJ3h4aDMnIDogJ3NoYTEnLCAkZGlyLicvJy4kZmlsZSk7Cn0KfQp9CmlmIChjb3VudCgkYXJyYXkpID4gMSAmJiBpc3NldCgkYXJyYXlbJzAnXSkpIHsKdW5zZXQoJGFycmF5WycwJ10pOwp9CgpyZXR1cm4gJGFycmF5Owp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCmNsYXNzIENvbXBsZXRlQWxpYXNQYWNrYWdlIGV4dGVuZHMgQWxpYXNQYWNrYWdlIGltcGxlbWVudHMgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkYWxpYXNPZjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29tcGxldGVQYWNrYWdlICRhbGlhc09mLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRhbGlhc09mLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNPZigpCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2NyaXB0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0U2NyaXB0cygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U2NyaXB0cyhhcnJheSAkc2NyaXB0cyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U2NyaXB0cygkc2NyaXB0cyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFJlcG9zaXRvcmllcygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwb3NpdG9yaWVzKGFycmF5ICRyZXBvc2l0b3JpZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFJlcG9zaXRvcmllcygkcmVwb3NpdG9yaWVzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldExpY2Vuc2UoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldExpY2Vuc2UoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldExpY2Vuc2UoYXJyYXkgJGxpY2Vuc2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldExpY2Vuc2UoJGxpY2Vuc2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5d29yZHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEtleXdvcmRzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRLZXl3b3JkcyhhcnJheSAka2V5d29yZHMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEtleXdvcmRzKCRrZXl3b3Jkcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdGlvbigpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXREZXNjcmlwdGlvbigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVzY3JpcHRpb24oP3N0cmluZyAkZGVzY3JpcHRpb24pOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldERlc2NyaXB0aW9uKCRkZXNjcmlwdGlvbik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIb21lcGFnZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRIb21lcGFnZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SG9tZXBhZ2UoP3N0cmluZyAkaG9tZXBhZ2UpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEhvbWVwYWdlKCRob21lcGFnZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRBdXRob3JzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRob3JzKGFycmF5ICRhdXRob3JzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBdXRob3JzKCRhdXRob3JzKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN1cHBvcnQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFN1cHBvcnQoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFN1cHBvcnQoYXJyYXkgJHN1cHBvcnQpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFN1cHBvcnQoJHN1cHBvcnQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RnVuZGluZygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0RnVuZGluZygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RnVuZGluZyhhcnJheSAkZnVuZGluZyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RnVuZGluZygkZnVuZGluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0FiYW5kb25lZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5pc0FiYW5kb25lZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFJlcGxhY2VtZW50UGFja2FnZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QWJhbmRvbmVkKCRhYmFuZG9uZWQpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEFiYW5kb25lZCgkYWJhbmRvbmVkKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVOYW1lKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEFyY2hpdmVOYW1lKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlTmFtZSg/c3RyaW5nICRuYW1lKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRBcmNoaXZlTmFtZSgkbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlRXhjbHVkZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldEFyY2hpdmVFeGNsdWRlcygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZUV4Y2x1ZGVzKGFycmF5ICRleGNsdWRlcyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QXJjaGl2ZUV4Y2x1ZGVzKCRleGNsdWRlcyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCgoKY2xhc3MgQ29tcGxldGVQYWNrYWdlIGV4dGVuZHMgUGFja2FnZSBpbXBsZW1lbnRzIENvbXBsZXRlUGFja2FnZUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHJlcG9zaXRvcmllcyA9IFtdOwoKcHJvdGVjdGVkICRsaWNlbnNlID0gW107Cgpwcm90ZWN0ZWQgJGtleXdvcmRzID0gW107Cgpwcm90ZWN0ZWQgJGF1dGhvcnMgPSBbXTsKCnByb3RlY3RlZCAkZGVzY3JpcHRpb24gPSBudWxsOwoKcHJvdGVjdGVkICRob21lcGFnZSA9IG51bGw7Cgpwcm90ZWN0ZWQgJHNjcmlwdHMgPSBbXTsKCnByb3RlY3RlZCAkc3VwcG9ydCA9IFtdOwoKcHJvdGVjdGVkICRmdW5kaW5nID0gW107Cgpwcm90ZWN0ZWQgJGFiYW5kb25lZCA9IGZhbHNlOwoKcHJvdGVjdGVkICRhcmNoaXZlTmFtZSA9IG51bGw7Cgpwcm90ZWN0ZWQgJGFyY2hpdmVFeGNsdWRlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNjcmlwdHMoYXJyYXkgJHNjcmlwdHMpOiB2b2lkCnsKJHRoaXMtPnNjcmlwdHMgPSAkc2NyaXB0czsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNjcmlwdHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnNjcmlwdHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3JpZXMoYXJyYXkgJHJlcG9zaXRvcmllcyk6IHZvaWQKewokdGhpcy0+cmVwb3NpdG9yaWVzID0gJHJlcG9zaXRvcmllczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TGljZW5zZShhcnJheSAkbGljZW5zZSk6IHZvaWQKewokdGhpcy0+bGljZW5zZSA9ICRsaWNlbnNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGljZW5zZSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bGljZW5zZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEtleXdvcmRzKGFycmF5ICRrZXl3b3Jkcyk6IHZvaWQKewokdGhpcy0+a2V5d29yZHMgPSAka2V5d29yZHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRLZXl3b3JkcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+a2V5d29yZHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRob3JzKGFycmF5ICRhdXRob3JzKTogdm9pZAp7CiR0aGlzLT5hdXRob3JzID0gJGF1dGhvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hdXRob3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVzY3JpcHRpb24oP3N0cmluZyAkZGVzY3JpcHRpb24pOiB2b2lkCnsKJHRoaXMtPmRlc2NyaXB0aW9uID0gJGRlc2NyaXB0aW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVzY3JpcHRpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIb21lcGFnZSg/c3RyaW5nICRob21lcGFnZSk6IHZvaWQKewokdGhpcy0+aG9tZXBhZ2UgPSAkaG9tZXBhZ2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIb21lcGFnZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5ob21lcGFnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN1cHBvcnQoYXJyYXkgJHN1cHBvcnQpOiB2b2lkCnsKJHRoaXMtPnN1cHBvcnQgPSAkc3VwcG9ydDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN1cHBvcnQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN1cHBvcnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGdW5kaW5nKGFycmF5ICRmdW5kaW5nKTogdm9pZAp7CiR0aGlzLT5mdW5kaW5nID0gJGZ1bmRpbmc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGdW5kaW5nKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5mdW5kaW5nOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBYmFuZG9uZWQoKTogYm9vbAp7CnJldHVybiAoYm9vbCkgJHRoaXMtPmFiYW5kb25lZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFiYW5kb25lZCgkYWJhbmRvbmVkKTogdm9pZAp7CiR0aGlzLT5hYmFuZG9uZWQgPSAkYWJhbmRvbmVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZW1lbnRQYWNrYWdlKCk6ID9zdHJpbmcKewpyZXR1cm4gXGlzX3N0cmluZygkdGhpcy0+YWJhbmRvbmVkKSA/ICR0aGlzLT5hYmFuZG9uZWQgOiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZU5hbWUoP3N0cmluZyAkbmFtZSk6IHZvaWQKewokdGhpcy0+YXJjaGl2ZU5hbWUgPSAkbmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyY2hpdmVOYW1lKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFyY2hpdmVOYW1lOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJjaGl2ZUV4Y2x1ZGVzKGFycmF5ICRleGNsdWRlcyk6IHZvaWQKewokdGhpcy0+YXJjaGl2ZUV4Y2x1ZGVzID0gJGV4Y2x1ZGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXJjaGl2ZUV4Y2x1ZGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hcmNoaXZlRXhjbHVkZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCgoKCgppbnRlcmZhY2UgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlIGV4dGVuZHMgUGFja2FnZUludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNjcmlwdHMoKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U2NyaXB0cyhhcnJheSAkc2NyaXB0cyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3JpZXMoYXJyYXkgJHJlcG9zaXRvcmllcyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TGljZW5zZShhcnJheSAkbGljZW5zZSk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRLZXl3b3JkcygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEtleXdvcmRzKGFycmF5ICRrZXl3b3Jkcyk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKTogP3N0cmluZzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbihzdHJpbmcgJGRlc2NyaXB0aW9uKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIb21lcGFnZSgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhvbWVwYWdlKHN0cmluZyAkaG9tZXBhZ2UpOiB2b2lkOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRob3JzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0aG9ycyhhcnJheSAkYXV0aG9ycyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdXBwb3J0KCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VwcG9ydChhcnJheSAkc3VwcG9ydCk6IHZvaWQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZ1bmRpbmcoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGdW5kaW5nKGFycmF5ICRmdW5kaW5nKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0FiYW5kb25lZCgpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcGxhY2VtZW50UGFja2FnZSgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFiYW5kb25lZCgkYWJhbmRvbmVkKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlTmFtZSgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFyY2hpdmVOYW1lKHN0cmluZyAkbmFtZSk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmNoaXZlRXhjbHVkZXMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcmNoaXZlRXhjbHVkZXMoYXJyYXkgJGV4Y2x1ZGVzKTogdm9pZDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxEdW1wZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKCgoKCgpjbGFzcyBBcnJheUR1bXBlcgp7CgoKCnB1YmxpYyBmdW5jdGlvbiBkdW1wKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBhcnJheQp7CiRrZXlzID0gWwonYmluYXJpZXMnID0+ICdiaW4nLAondHlwZScsCidleHRyYScsCidpbnN0YWxsYXRpb25Tb3VyY2UnID0+ICdpbnN0YWxsYXRpb24tc291cmNlJywKJ2F1dG9sb2FkJywKJ2RldkF1dG9sb2FkJyA9PiAnYXV0b2xvYWQtZGV2JywKJ25vdGlmaWNhdGlvblVybCcgPT4gJ25vdGlmaWNhdGlvbi11cmwnLAonaW5jbHVkZVBhdGhzJyA9PiAnaW5jbHVkZS1wYXRoJywKJ3BocEV4dCcgPT4gJ3BocC1leHQnLApdOwoKJGRhdGEgPSBbXTsKJGRhdGFbJ25hbWUnXSA9ICRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCk7CiRkYXRhWyd2ZXJzaW9uJ10gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwokZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwoKaWYgKCRwYWNrYWdlLT5nZXRUYXJnZXREaXIoKSAhPT0gbnVsbCkgewokZGF0YVsndGFyZ2V0LWRpciddID0gJHBhY2thZ2UtPmdldFRhcmdldERpcigpOwp9CgppZiAoJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKSAhPT0gbnVsbCkgewokZGF0YVsnc291cmNlJ11bJ3R5cGUnXSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCk7CiRkYXRhWydzb3VyY2UnXVsndXJsJ10gPSAkcGFja2FnZS0+Z2V0U291cmNlVXJsKCk7CmlmIChudWxsICE9PSAoJHZhbHVlID0gJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpKSkgewokZGF0YVsnc291cmNlJ11bJ3JlZmVyZW5jZSddID0gJHZhbHVlOwp9CmlmICgkbWlycm9ycyA9ICRwYWNrYWdlLT5nZXRTb3VyY2VNaXJyb3JzKCkpIHsKJGRhdGFbJ3NvdXJjZSddWydtaXJyb3JzJ10gPSAkbWlycm9yczsKfQp9CgppZiAoJHBhY2thZ2UtPmdldERpc3RUeXBlKCkgIT09IG51bGwpIHsKJGRhdGFbJ2Rpc3QnXVsndHlwZSddID0gJHBhY2thZ2UtPmdldERpc3RUeXBlKCk7CiRkYXRhWydkaXN0J11bJ3VybCddID0gJHBhY2thZ2UtPmdldERpc3RVcmwoKTsKaWYgKG51bGwgIT09ICgkdmFsdWUgPSAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpKSkgewokZGF0YVsnZGlzdCddWydyZWZlcmVuY2UnXSA9ICR2YWx1ZTsKfQppZiAobnVsbCAhPT0gKCR2YWx1ZSA9ICRwYWNrYWdlLT5nZXREaXN0U2hhMUNoZWNrc3VtKCkpKSB7CiRkYXRhWydkaXN0J11bJ3NoYXN1bSddID0gJHZhbHVlOwp9CmlmICgkbWlycm9ycyA9ICRwYWNrYWdlLT5nZXREaXN0TWlycm9ycygpKSB7CiRkYXRhWydkaXN0J11bJ21pcnJvcnMnXSA9ICRtaXJyb3JzOwp9Cn0KCmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRvcHRzKSB7CiRsaW5rcyA9ICRwYWNrYWdlLT57J2dldCcudWNmaXJzdCgkb3B0c1snbWV0aG9kJ10pfSgpOwppZiAoXGNvdW50KCRsaW5rcykgPT09IDApIHsKY29udGludWU7Cn0KZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRkYXRhWyR0eXBlXVskbGluay0+Z2V0VGFyZ2V0KCldID0gJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKfQprc29ydCgkZGF0YVskdHlwZV0pOwp9CgokcGFja2FnZXMgPSAkcGFja2FnZS0+Z2V0U3VnZ2VzdHMoKTsKaWYgKFxjb3VudCgkcGFja2FnZXMpID4gMCkgewprc29ydCgkcGFja2FnZXMpOwokZGF0YVsnc3VnZ2VzdCddID0gJHBhY2thZ2VzOwp9CgppZiAoJHBhY2thZ2UtPmdldFJlbGVhc2VEYXRlKCkgaW5zdGFuY2VvZiBcRGF0ZVRpbWVJbnRlcmZhY2UpIHsKJGRhdGFbJ3RpbWUnXSA9ICRwYWNrYWdlLT5nZXRSZWxlYXNlRGF0ZSgpLT5mb3JtYXQoREFURV9SRkMzMzM5KTsKfQoKaWYgKCRwYWNrYWdlLT5pc0RlZmF1bHRCcmFuY2goKSkgewokZGF0YVsnZGVmYXVsdC1icmFuY2gnXSA9IHRydWU7Cn0KCiRkYXRhID0gJHRoaXMtPmR1bXBWYWx1ZXMoJHBhY2thZ2UsICRrZXlzLCAkZGF0YSk7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKaWYgKCRwYWNrYWdlLT5nZXRBcmNoaXZlTmFtZSgpKSB7CiRkYXRhWydhcmNoaXZlJ11bJ25hbWUnXSA9ICRwYWNrYWdlLT5nZXRBcmNoaXZlTmFtZSgpOwp9CmlmICgkcGFja2FnZS0+Z2V0QXJjaGl2ZUV4Y2x1ZGVzKCkpIHsKJGRhdGFbJ2FyY2hpdmUnXVsnZXhjbHVkZSddID0gJHBhY2thZ2UtPmdldEFyY2hpdmVFeGNsdWRlcygpOwp9Cgoka2V5cyA9IFsKJ3NjcmlwdHMnLAonbGljZW5zZScsCidhdXRob3JzJywKJ2Rlc2NyaXB0aW9uJywKJ2hvbWVwYWdlJywKJ2tleXdvcmRzJywKJ3JlcG9zaXRvcmllcycsCidzdXBwb3J0JywKJ2Z1bmRpbmcnLApdOwoKJGRhdGEgPSAkdGhpcy0+ZHVtcFZhbHVlcygkcGFja2FnZSwgJGtleXMsICRkYXRhKTsKCmlmIChpc3NldCgkZGF0YVsna2V5d29yZHMnXSkgJiYgXGlzX2FycmF5KCRkYXRhWydrZXl3b3JkcyddKSkgewpzb3J0KCRkYXRhWydrZXl3b3JkcyddKTsKfQoKaWYgKCRwYWNrYWdlLT5pc0FiYW5kb25lZCgpKSB7CiRkYXRhWydhYmFuZG9uZWQnXSA9ICRwYWNrYWdlLT5nZXRSZXBsYWNlbWVudFBhY2thZ2UoKSA/OiB0cnVlOwp9Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRtaW5pbXVtU3RhYmlsaXR5ID0gJHBhY2thZ2UtPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKaWYgKCRtaW5pbXVtU3RhYmlsaXR5ICE9PSAnJykgewokZGF0YVsnbWluaW11bS1zdGFiaWxpdHknXSA9ICRtaW5pbXVtU3RhYmlsaXR5Owp9Cn0KCmlmIChcY291bnQoJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKSkgPiAwKSB7CiRkYXRhWyd0cmFuc3BvcnQtb3B0aW9ucyddID0gJHBhY2thZ2UtPmdldFRyYW5zcG9ydE9wdGlvbnMoKTsKfQoKcmV0dXJuICRkYXRhOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBWYWx1ZXMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJGtleXMsIGFycmF5ICRkYXRhKTogYXJyYXkKewpmb3JlYWNoICgka2V5cyBhcyAkbWV0aG9kID0+ICRrZXkpIHsKaWYgKGlzX251bWVyaWMoJG1ldGhvZCkpIHsKJG1ldGhvZCA9ICRrZXk7Cn0KCiRnZXR0ZXIgPSAnZ2V0Jy51Y2ZpcnN0KCRtZXRob2QpOwokdmFsdWUgPSAkcGFja2FnZS0+eyRnZXR0ZXJ9KCk7CgppZiAobnVsbCAhPT0gJHZhbHVlICYmICEoXGlzX2FycmF5KCR2YWx1ZSkgJiYgMCA9PT0gXGNvdW50KCR2YWx1ZSkpKSB7CiRkYXRhWyRrZXldID0gJHZhbHVlOwp9Cn0KCnJldHVybiAkZGF0YTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlOwoKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIExpbmsKewpwdWJsaWMgY29uc3QgVFlQRV9SRVFVSVJFID0gJ3JlcXVpcmVzJzsKcHVibGljIGNvbnN0IFRZUEVfREVWX1JFUVVJUkUgPSAnZGV2UmVxdWlyZXMnOwpwdWJsaWMgY29uc3QgVFlQRV9QUk9WSURFID0gJ3Byb3ZpZGVzJzsKcHVibGljIGNvbnN0IFRZUEVfQ09ORkxJQ1QgPSAnY29uZmxpY3RzJzsKcHVibGljIGNvbnN0IFRZUEVfUkVQTEFDRSA9ICdyZXBsYWNlcyc7CgoKCgoKcHVibGljIGNvbnN0IFRZUEVfRE9FU19OT1RfUkVRVUlSRSA9ICdkb2VzIG5vdCByZXF1aXJlJzsKCnByaXZhdGUgY29uc3QgVFlQRV9VTktOT1dOID0gJ3JlbGF0ZXMgdG8nOwoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgJFRZUEVTID0gWwpzZWxmOjpUWVBFX1JFUVVJUkUsCnNlbGY6OlRZUEVfREVWX1JFUVVJUkUsCnNlbGY6OlRZUEVfUFJPVklERSwKc2VsZjo6VFlQRV9DT05GTElDVCwKc2VsZjo6VFlQRV9SRVBMQUNFLApdOwoKCgoKcHJvdGVjdGVkICRzb3VyY2U7CgoKCgpwcm90ZWN0ZWQgJHRhcmdldDsKCgoKCnByb3RlY3RlZCAkY29uc3RyYWludDsKCgoKCgpwcm90ZWN0ZWQgJGRlc2NyaXB0aW9uOwoKCgoKcHJvdGVjdGVkICRwcmV0dHlDb25zdHJhaW50OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KApzdHJpbmcgJHNvdXJjZSwKc3RyaW5nICR0YXJnZXQsCkNvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsCiRkZXNjcmlwdGlvbiA9IHNlbGY6OlRZUEVfVU5LTk9XTiwKP3N0cmluZyAkcHJldHR5Q29uc3RyYWludCA9IG51bGwKKSB7CiR0aGlzLT5zb3VyY2UgPSBzdHJ0b2xvd2VyKCRzb3VyY2UpOwokdGhpcy0+dGFyZ2V0ID0gc3RydG9sb3dlcigkdGFyZ2V0KTsKJHRoaXMtPmNvbnN0cmFpbnQgPSAkY29uc3RyYWludDsKJHRoaXMtPmRlc2NyaXB0aW9uID0gc2VsZjo6VFlQRV9ERVZfUkVRVUlSRSA9PT0gJGRlc2NyaXB0aW9uID8gJ3JlcXVpcmVzIChmb3IgZGV2ZWxvcG1lbnQpJyA6ICRkZXNjcmlwdGlvbjsKJHRoaXMtPnByZXR0eUNvbnN0cmFpbnQgPSAkcHJldHR5Q29uc3RyYWludDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlc2NyaXB0aW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVzY3JpcHRpb247Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2UoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXQoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50YXJnZXQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25zdHJhaW50KCk6IENvbnN0cmFpbnRJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmNvbnN0cmFpbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlDb25zdHJhaW50KCk6IHN0cmluZwp7CmlmIChudWxsID09PSAkdGhpcy0+cHJldHR5Q29uc3RyYWludCkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbihzcHJpbnRmKCdMaW5rICVzIGhhcyBiZWVuIG1pc2NvbmZpZ3VyZWQgYW5kIGhhZCBubyBwcmV0dHlDb25zdHJhaW50IGdpdmVuLicsICR0aGlzKSk7Cn0KCnJldHVybiAkdGhpcy0+cHJldHR5Q29uc3RyYWludDsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2UuJyAnLiR0aGlzLT5kZXNjcmlwdGlvbi4nICcuJHRoaXMtPnRhcmdldC4nICgnLiR0aGlzLT5jb25zdHJhaW50LicpJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZyhQYWNrYWdlSW50ZXJmYWNlICRzb3VyY2VQYWNrYWdlKTogc3RyaW5nCnsKcmV0dXJuICRzb3VyY2VQYWNrYWdlLT5nZXRQcmV0dHlTdHJpbmcoKS4nICcuJHRoaXMtPmRlc2NyaXB0aW9uLicgJy4kdGhpcy0+dGFyZ2V0LicgJy4kdGhpcy0+Y29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCmNsYXNzIEFycmF5TG9hZGVyIGltcGxlbWVudHMgTG9hZGVySW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkdmVyc2lvblBhcnNlcjsKCnByb3RlY3RlZCAkbG9hZE9wdGlvbnM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP1ZlcnNpb25QYXJzZXIgJHBhcnNlciA9IG51bGwsIGJvb2wgJGxvYWRPcHRpb25zID0gZmFsc2UpCnsKaWYgKCEkcGFyc2VyKSB7CiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcjsKfQokdGhpcy0+dmVyc2lvblBhcnNlciA9ICRwYXJzZXI7CiR0aGlzLT5sb2FkT3B0aW9ucyA9ICRsb2FkT3B0aW9uczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZQp7CmlmICgkY2xhc3MgIT09ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScgJiYgJGNsYXNzICE9PSAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScpIHsKdHJpZ2dlcl9lcnJvcignVGhlICRjbGFzcyBhcmcgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHJlYWNoIG91dCB0byBDb21wb3NlciBtYWludGFpbmVycyBBU0FQIGlmIHlvdSBzdGlsbCBuZWVkIHRoaXMuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9CgokcGFja2FnZSA9ICR0aGlzLT5jcmVhdGVPYmplY3QoJGNvbmZpZywgJGNsYXNzKTsKCmZvcmVhY2ggKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzIGFzICR0eXBlID0+ICRvcHRzKSB7CmlmICghaXNzZXQoJGNvbmZpZ1skdHlwZV0pIHx8ICFpc19hcnJheSgkY29uZmlnWyR0eXBlXSkpIHsKY29udGludWU7Cn0KJG1ldGhvZCA9ICdzZXQnLnVjZmlyc3QoJG9wdHNbJ21ldGhvZCddKTsKJHBhY2thZ2UtPnskbWV0aG9kfSgKJHRoaXMtPnBhcnNlTGlua3MoCiRwYWNrYWdlLT5nZXROYW1lKCksCiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCksCiRvcHRzWydtZXRob2QnXSwKJGNvbmZpZ1skdHlwZV0KKQopOwp9CgokcGFja2FnZSA9ICR0aGlzLT5jb25maWd1cmVPYmplY3QoJHBhY2thZ2UsICRjb25maWcpOwoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHZlcnNpb25zKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKJGxpbmtDYWNoZSA9IFtdOwoKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CiRwYWNrYWdlID0gJHRoaXMtPmNyZWF0ZU9iamVjdCgkdmVyc2lvbiwgJ0NvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlJyk7CgokdGhpcy0+Y29uZmlndXJlQ2FjaGVkTGlua3MoJGxpbmtDYWNoZSwgJHBhY2thZ2UsICR2ZXJzaW9uKTsKJHBhY2thZ2UgPSAkdGhpcy0+Y29uZmlndXJlT2JqZWN0KCRwYWNrYWdlLCAkdmVyc2lvbik7CgokcGFja2FnZXNbXSA9ICRwYWNrYWdlOwp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVPYmplY3QoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyk6IENvbXBsZXRlUGFja2FnZQp7CmlmICghaXNzZXQoJGNvbmZpZ1snbmFtZSddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVW5rbm93biBwYWNrYWdlIGhhcyBubyBuYW1lIGRlZmluZWQgKCcuanNvbl9lbmNvZGUoJGNvbmZpZykuJykuJyk7Cn0KaWYgKCFpc3NldCgkY29uZmlnWyd2ZXJzaW9uJ10pIHx8ICFpc19zY2FsYXIoJGNvbmZpZ1sndmVyc2lvbiddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUGFja2FnZSAnLiRjb25maWdbJ25hbWUnXS4nIGhhcyBubyB2ZXJzaW9uIGRlZmluZWQuJyk7Cn0KaWYgKCFpc19zdHJpbmcoJGNvbmZpZ1sndmVyc2lvbiddKSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAoc3RyaW5nKSAkY29uZmlnWyd2ZXJzaW9uJ107Cn0KCgppZiAoaXNzZXQoJGNvbmZpZ1sndmVyc2lvbl9ub3JtYWxpemVkJ10pICYmIGlzX3N0cmluZygkY29uZmlnWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkpIHsKJHZlcnNpb24gPSAkY29uZmlnWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXTsKCgppZiAoJHZlcnNpb24gPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkY29uZmlnWyd2ZXJzaW9uJ10pOwp9Cn0gZWxzZSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkY29uZmlnWyd2ZXJzaW9uJ10pOwp9CgpyZXR1cm4gbmV3ICRjbGFzcygkY29uZmlnWyduYW1lJ10sICR2ZXJzaW9uLCAkY29uZmlnWyd2ZXJzaW9uJ10pOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbmZpZ3VyZU9iamVjdChQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkY29uZmlnKTogQmFzZVBhY2thZ2UKewppZiAoISRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0FycmF5TG9hZGVyIGV4cGVjdHMgaW5zdGFuY2VzIG9mIHRoZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZSBjbGFzcyB0byBmdW5jdGlvbiBjb3JyZWN0bHknKTsKfQoKJHBhY2thZ2UtPnNldFR5cGUoaXNzZXQoJGNvbmZpZ1sndHlwZSddKSA/IHN0cnRvbG93ZXIoJGNvbmZpZ1sndHlwZSddKSA6ICdsaWJyYXJ5Jyk7CgppZiAoaXNzZXQoJGNvbmZpZ1sndGFyZ2V0LWRpciddKSkgewokcGFja2FnZS0+c2V0VGFyZ2V0RGlyKCRjb25maWdbJ3RhcmdldC1kaXInXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydleHRyYSddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snZXh0cmEnXSkpIHsKJHBhY2thZ2UtPnNldEV4dHJhKCRjb25maWdbJ2V4dHJhJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYmluJ10pKSB7CmlmICghXGlzX2FycmF5KCRjb25maWdbJ2JpbiddKSkgewokY29uZmlnWydiaW4nXSA9IFskY29uZmlnWydiaW4nXV07Cn0KZm9yZWFjaCAoJGNvbmZpZ1snYmluJ10gYXMgJGtleSA9PiAkYmluKSB7CiRjb25maWdbJ2JpbiddWyRrZXldID0gbHRyaW0oJGJpbiwgJy8nKTsKfQokcGFja2FnZS0+c2V0QmluYXJpZXMoJGNvbmZpZ1snYmluJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snaW5zdGFsbGF0aW9uLXNvdXJjZSddKSkgewokcGFja2FnZS0+c2V0SW5zdGFsbGF0aW9uU291cmNlKCRjb25maWdbJ2luc3RhbGxhdGlvbi1zb3VyY2UnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydkZWZhdWx0LWJyYW5jaCddKSAmJiAkY29uZmlnWydkZWZhdWx0LWJyYW5jaCddID09PSB0cnVlKSB7CiRwYWNrYWdlLT5zZXRJc0RlZmF1bHRCcmFuY2godHJ1ZSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydzb3VyY2UnXSkpIHsKaWYgKCFpc3NldCgkY29uZmlnWydzb3VyY2UnXVsndHlwZSddLCAkY29uZmlnWydzb3VyY2UnXVsndXJsJ10sICRjb25maWdbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oc3ByaW50ZigKIlBhY2thZ2UgJXMncyBzb3VyY2Uga2V5IHNob3VsZCBiZSBzcGVjaWZpZWQgYXMge1widHlwZVwiOiAuLi4sIFwidXJsXCI6IC4uLiwgXCJyZWZlcmVuY2VcIjogLi4ufSxcbiVzIGdpdmVuLiIsCiRjb25maWdbJ25hbWUnXSwKanNvbl9lbmNvZGUoJGNvbmZpZ1snc291cmNlJ10pCikpOwp9CiRwYWNrYWdlLT5zZXRTb3VyY2VUeXBlKCRjb25maWdbJ3NvdXJjZSddWyd0eXBlJ10pOwokcGFja2FnZS0+c2V0U291cmNlVXJsKCRjb25maWdbJ3NvdXJjZSddWyd1cmwnXSk7CiRwYWNrYWdlLT5zZXRTb3VyY2VSZWZlcmVuY2UoaXNzZXQoJGNvbmZpZ1snc291cmNlJ11bJ3JlZmVyZW5jZSddKSA/IChzdHJpbmcpICRjb25maWdbJ3NvdXJjZSddWydyZWZlcmVuY2UnXSA6IG51bGwpOwppZiAoaXNzZXQoJGNvbmZpZ1snc291cmNlJ11bJ21pcnJvcnMnXSkpIHsKJHBhY2thZ2UtPnNldFNvdXJjZU1pcnJvcnMoJGNvbmZpZ1snc291cmNlJ11bJ21pcnJvcnMnXSk7Cn0KfQoKaWYgKGlzc2V0KCRjb25maWdbJ2Rpc3QnXSkpIHsKaWYgKCFpc3NldCgkY29uZmlnWydkaXN0J11bJ3R5cGUnXSwgJGNvbmZpZ1snZGlzdCddWyd1cmwnXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oc3ByaW50ZigKIlBhY2thZ2UgJXMncyBkaXN0IGtleSBzaG91bGQgYmUgc3BlY2lmaWVkIGFzICIuCiJ7XCJ0eXBlXCI6IC4uLiwgXCJ1cmxcIjogLi4uLCBcInJlZmVyZW5jZVwiOiAuLi4sIFwic2hhc3VtXCI6IC4uLn0sXG4lcyBnaXZlbi4iLAokY29uZmlnWyduYW1lJ10sCmpzb25fZW5jb2RlKCRjb25maWdbJ2Rpc3QnXSkKKSk7Cn0KJHBhY2thZ2UtPnNldERpc3RUeXBlKCRjb25maWdbJ2Rpc3QnXVsndHlwZSddKTsKJHBhY2thZ2UtPnNldERpc3RVcmwoJGNvbmZpZ1snZGlzdCddWyd1cmwnXSk7CiRwYWNrYWdlLT5zZXREaXN0UmVmZXJlbmNlKGlzc2V0KCRjb25maWdbJ2Rpc3QnXVsncmVmZXJlbmNlJ10pID8gKHN0cmluZykgJGNvbmZpZ1snZGlzdCddWydyZWZlcmVuY2UnXSA6IG51bGwpOwokcGFja2FnZS0+c2V0RGlzdFNoYTFDaGVja3N1bSgkY29uZmlnWydkaXN0J11bJ3NoYXN1bSddID8/IG51bGwpOwppZiAoaXNzZXQoJGNvbmZpZ1snZGlzdCddWydtaXJyb3JzJ10pKSB7CiRwYWNrYWdlLT5zZXREaXN0TWlycm9ycygkY29uZmlnWydkaXN0J11bJ21pcnJvcnMnXSk7Cn0KfQoKaWYgKGlzc2V0KCRjb25maWdbJ3N1Z2dlc3QnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ3N1Z2dlc3QnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snc3VnZ2VzdCddIGFzICR0YXJnZXQgPT4gJHJlYXNvbikgewppZiAoJ3NlbGYudmVyc2lvbicgPT09IHRyaW0oJHJlYXNvbikpIHsKJGNvbmZpZ1snc3VnZ2VzdCddWyR0YXJnZXRdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQp9CiRwYWNrYWdlLT5zZXRTdWdnZXN0cygkY29uZmlnWydzdWdnZXN0J10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQnXSkpIHsKJHBhY2thZ2UtPnNldEF1dG9sb2FkKCRjb25maWdbJ2F1dG9sb2FkJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snYXV0b2xvYWQtZGV2J10pKSB7CiRwYWNrYWdlLT5zZXREZXZBdXRvbG9hZCgkY29uZmlnWydhdXRvbG9hZC1kZXYnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydpbmNsdWRlLXBhdGgnXSkpIHsKJHBhY2thZ2UtPnNldEluY2x1ZGVQYXRocygkY29uZmlnWydpbmNsdWRlLXBhdGgnXSk7Cn0KCmlmIChpc3NldCgkY29uZmlnWydwaHAtZXh0J10pKSB7CiRwYWNrYWdlLT5zZXRQaHBFeHQoJGNvbmZpZ1sncGhwLWV4dCddKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWyd0aW1lJ10pKSB7CiR0aW1lID0gUHJlZzo6aXNNYXRjaCgnL15cZCsrJC9EJywgJGNvbmZpZ1sndGltZSddKSA/ICdAJy4kY29uZmlnWyd0aW1lJ10gOiAkY29uZmlnWyd0aW1lJ107Cgp0cnkgewokZGF0ZSA9IG5ldyBcRGF0ZVRpbWUoJHRpbWUsIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7CiRwYWNrYWdlLT5zZXRSZWxlYXNlRGF0ZSgkZGF0ZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgppZiAoIWVtcHR5KCRjb25maWdbJ25vdGlmaWNhdGlvbi11cmwnXSkpIHsKJHBhY2thZ2UtPnNldE5vdGlmaWNhdGlvblVybCgkY29uZmlnWydub3RpZmljYXRpb24tdXJsJ10pOwp9CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKaWYgKCFlbXB0eSgkY29uZmlnWydhcmNoaXZlJ11bJ25hbWUnXSkpIHsKJHBhY2thZ2UtPnNldEFyY2hpdmVOYW1lKCRjb25maWdbJ2FyY2hpdmUnXVsnbmFtZSddKTsKfQppZiAoIWVtcHR5KCRjb25maWdbJ2FyY2hpdmUnXVsnZXhjbHVkZSddKSkgewokcGFja2FnZS0+c2V0QXJjaGl2ZUV4Y2x1ZGVzKCRjb25maWdbJ2FyY2hpdmUnXVsnZXhjbHVkZSddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3NjcmlwdHMnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ3NjcmlwdHMnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snc2NyaXB0cyddIGFzICRldmVudCA9PiAkbGlzdGVuZXJzKSB7CiRjb25maWdbJ3NjcmlwdHMnXVskZXZlbnRdID0gKGFycmF5KSAkbGlzdGVuZXJzOwp9CmZvcmVhY2ggKFsnY29tcG9zZXInLCAncGhwJywgJ3B1dGVudiddIGFzICRyZXNlcnZlZCkgewppZiAoaXNzZXQoJGNvbmZpZ1snc2NyaXB0cyddWyRyZXNlcnZlZF0pKSB7CnRyaWdnZXJfZXJyb3IoJ1RoZSBgJy4kcmVzZXJ2ZWQuJ2Agc2NyaXB0IG5hbWUgaXMgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZSwgcGxlYXNlIGF2b2lkIGRlZmluaW5nIGl0JywgRV9VU0VSX0RFUFJFQ0FURUQpOwp9Cn0KJHBhY2thZ2UtPnNldFNjcmlwdHMoJGNvbmZpZ1snc2NyaXB0cyddKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydkZXNjcmlwdGlvbiddKSAmJiBcaXNfc3RyaW5nKCRjb25maWdbJ2Rlc2NyaXB0aW9uJ10pKSB7CiRwYWNrYWdlLT5zZXREZXNjcmlwdGlvbigkY29uZmlnWydkZXNjcmlwdGlvbiddKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydob21lcGFnZSddKSAmJiBcaXNfc3RyaW5nKCRjb25maWdbJ2hvbWVwYWdlJ10pKSB7CiRwYWNrYWdlLT5zZXRIb21lcGFnZSgkY29uZmlnWydob21lcGFnZSddKTsKfQoKaWYgKCFlbXB0eSgkY29uZmlnWydrZXl3b3JkcyddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1sna2V5d29yZHMnXSkpIHsKJHBhY2thZ2UtPnNldEtleXdvcmRzKGFycmF5X21hcCgnc3RydmFsJywgJGNvbmZpZ1sna2V5d29yZHMnXSkpOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2xpY2Vuc2UnXSkpIHsKJHBhY2thZ2UtPnNldExpY2Vuc2UoXGlzX2FycmF5KCRjb25maWdbJ2xpY2Vuc2UnXSkgPyAkY29uZmlnWydsaWNlbnNlJ10gOiBbJGNvbmZpZ1snbGljZW5zZSddXSk7Cn0KCmlmICghZW1wdHkoJGNvbmZpZ1snYXV0aG9ycyddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snYXV0aG9ycyddKSkgewokcGFja2FnZS0+c2V0QXV0aG9ycygkY29uZmlnWydhdXRob3JzJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snc3VwcG9ydCddKSAmJiBcaXNfYXJyYXkoJGNvbmZpZ1snc3VwcG9ydCddKSkgewokcGFja2FnZS0+c2V0U3VwcG9ydCgkY29uZmlnWydzdXBwb3J0J10pOwp9CgppZiAoIWVtcHR5KCRjb25maWdbJ2Z1bmRpbmcnXSkgJiYgXGlzX2FycmF5KCRjb25maWdbJ2Z1bmRpbmcnXSkpIHsKJHBhY2thZ2UtPnNldEZ1bmRpbmcoJGNvbmZpZ1snZnVuZGluZyddKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ2FiYW5kb25lZCddKSkgewokcGFja2FnZS0+c2V0QWJhbmRvbmVkKCRjb25maWdbJ2FiYW5kb25lZCddKTsKfQp9CgppZiAoJHRoaXMtPmxvYWRPcHRpb25zICYmIGlzc2V0KCRjb25maWdbJ3RyYW5zcG9ydC1vcHRpb25zJ10pKSB7CiRwYWNrYWdlLT5zZXRUcmFuc3BvcnRPcHRpb25zKCRjb25maWdbJ3RyYW5zcG9ydC1vcHRpb25zJ10pOwp9CgppZiAoJGFsaWFzTm9ybWFsaXplZCA9ICR0aGlzLT5nZXRCcmFuY2hBbGlhcygkY29uZmlnKSkgewokcHJldHR5QWxpYXMgPSBQcmVnOjpyZXBsYWNlKCd7KFwuOXs3fSkrfScsICcueCcsICRhbGlhc05vcm1hbGl6ZWQpOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2UpIHsKcmV0dXJuIG5ldyBSb290QWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXNOb3JtYWxpemVkLCAkcHJldHR5QWxpYXMpOwp9CgpyZXR1cm4gbmV3IENvbXBsZXRlQWxpYXNQYWNrYWdlKCRwYWNrYWdlLCAkYWxpYXNOb3JtYWxpemVkLCAkcHJldHR5QWxpYXMpOwp9CgpyZXR1cm4gJHBhY2thZ2U7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbmZpZ3VyZUNhY2hlZExpbmtzKGFycmF5ICYkbGlua0NhY2hlLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkY29uZmlnKTogdm9pZAp7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKJHByZXR0eVZlcnNpb24gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwoKZm9yZWFjaCAoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMgYXMgJHR5cGUgPT4gJG9wdHMpIHsKaWYgKGlzc2V0KCRjb25maWdbJHR5cGVdKSkgewokbWV0aG9kID0gJ3NldCcudWNmaXJzdCgkb3B0c1snbWV0aG9kJ10pOwoKJGxpbmtzID0gW107CmZvcmVhY2ggKCRjb25maWdbJHR5cGVdIGFzICRwcmV0dHlUYXJnZXQgPT4gJGNvbnN0cmFpbnQpIHsKJHRhcmdldCA9IHN0cnRvbG93ZXIoJHByZXR0eVRhcmdldCk7CgoKaWYgKCR0YXJnZXQgPT09ICRuYW1lKSB7CmNvbnRpbnVlOwp9CgppZiAoJGNvbnN0cmFpbnQgPT09ICdzZWxmLnZlcnNpb24nKSB7CiRsaW5rc1skdGFyZ2V0XSA9ICR0aGlzLT5jcmVhdGVMaW5rKCRuYW1lLCAkcHJldHR5VmVyc2lvbiwgJG9wdHNbJ21ldGhvZCddLCAkdGFyZ2V0LCAkY29uc3RyYWludCk7Cn0gZWxzZSB7CmlmICghaXNzZXQoJGxpbmtDYWNoZVskbmFtZV1bJHR5cGVdWyR0YXJnZXRdWyRjb25zdHJhaW50XSkpIHsKJGxpbmtDYWNoZVskbmFtZV1bJHR5cGVdWyR0YXJnZXRdWyRjb25zdHJhaW50XSA9IFskdGFyZ2V0LCAkdGhpcy0+Y3JlYXRlTGluaygkbmFtZSwgJHByZXR0eVZlcnNpb24sICRvcHRzWydtZXRob2QnXSwgJHRhcmdldCwgJGNvbnN0cmFpbnQpXTsKfQoKWyR0YXJnZXQsICRsaW5rXSA9ICRsaW5rQ2FjaGVbJG5hbWVdWyR0eXBlXVskdGFyZ2V0XVskY29uc3RyYWludF07CiRsaW5rc1skdGFyZ2V0XSA9ICRsaW5rOwp9Cn0KCiRwYWNrYWdlLT57JG1ldGhvZH0oJGxpbmtzKTsKfQp9Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VMaW5rcyhzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICRzb3VyY2VWZXJzaW9uLCBzdHJpbmcgJGRlc2NyaXB0aW9uLCBhcnJheSAkbGlua3MpOiBhcnJheQp7CiRyZXMgPSBbXTsKZm9yZWFjaCAoJGxpbmtzIGFzICR0YXJnZXQgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCFpc19zdHJpbmcoJGNvbnN0cmFpbnQpKSB7CmNvbnRpbnVlOwp9CiR0YXJnZXQgPSBzdHJ0b2xvd2VyKChzdHJpbmcpICR0YXJnZXQpOwokcmVzWyR0YXJnZXRdID0gJHRoaXMtPmNyZWF0ZUxpbmsoJHNvdXJjZSwgJHNvdXJjZVZlcnNpb24sICRkZXNjcmlwdGlvbiwgJHRhcmdldCwgJGNvbnN0cmFpbnQpOwp9CgpyZXR1cm4gJHJlczsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlTGluayhzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICRzb3VyY2VWZXJzaW9uLCBzdHJpbmcgJGRlc2NyaXB0aW9uLCBzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRwcmV0dHlDb25zdHJhaW50KTogTGluawp7CmlmICghXGlzX3N0cmluZygkcHJldHR5Q29uc3RyYWludCkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0xpbmsgY29uc3RyYWludCBpbiAnLiRzb3VyY2UuJyAnLiRkZXNjcmlwdGlvbi4nID4gJy4kdGFyZ2V0Licgc2hvdWxkIGJlIGEgc3RyaW5nLCBnb3QgJy5cZ2V0X2RlYnVnX3R5cGUoJHByZXR0eUNvbnN0cmFpbnQpIC4gJyAoJyAuIHZhcl9leHBvcnQoJHByZXR0eUNvbnN0cmFpbnQsIHRydWUpIC4gJyknKTsKfQppZiAoJ3NlbGYudmVyc2lvbicgPT09ICRwcmV0dHlDb25zdHJhaW50KSB7CiRwYXJzZWRDb25zdHJhaW50ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJHNvdXJjZVZlcnNpb24pOwp9IGVsc2UgewokcGFyc2VkQ29uc3RyYWludCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRwcmV0dHlDb25zdHJhaW50KTsKfQoKcmV0dXJuIG5ldyBMaW5rKCRzb3VyY2UsICR0YXJnZXQsICRwYXJzZWRDb25zdHJhaW50LCAkZGVzY3JpcHRpb24sICRwcmV0dHlDb25zdHJhaW50KTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hBbGlhcyhhcnJheSAkY29uZmlnKTogP3N0cmluZwp7CmlmICghaXNzZXQoJGNvbmZpZ1sndmVyc2lvbiddKSB8fCAhaXNfc2NhbGFyKCRjb25maWdbJ3ZlcnNpb24nXSkpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ25vL2ludmFsaWQgdmVyc2lvbiBkZWZpbmVkJyk7Cn0KaWYgKCFpc19zdHJpbmcoJGNvbmZpZ1sndmVyc2lvbiddKSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAoc3RyaW5nKSAkY29uZmlnWyd2ZXJzaW9uJ107Cn0KCmlmIChzdHJwb3MoJGNvbmZpZ1sndmVyc2lvbiddLCAnZGV2LScpICE9PSAwICYmICctZGV2JyAhPT0gc3Vic3RyKCRjb25maWdbJ3ZlcnNpb24nXSwgLTQpKSB7CnJldHVybiBudWxsOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10pICYmIFxpc19hcnJheSgkY29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10gYXMgJHNvdXJjZUJyYW5jaCA9PiAkdGFyZ2V0QnJhbmNoKSB7CiRzb3VyY2VCcmFuY2ggPSAoc3RyaW5nKSAkc291cmNlQnJhbmNoOwoKCmlmICgnLWRldicgIT09IHN1YnN0cigkdGFyZ2V0QnJhbmNoLCAtNCkpIHsKY29udGludWU7Cn0KCgppZiAoJHRhcmdldEJyYW5jaCA9PT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJHZhbGlkYXRlZFRhcmdldEJyYW5jaCA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9IGVsc2UgewokdmFsaWRhdGVkVGFyZ2V0QnJhbmNoID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaChzdWJzdHIoJHRhcmdldEJyYW5jaCwgMCwgLTQpKTsKfQppZiAoJy1kZXYnICE9PSBzdWJzdHIoJHZhbGlkYXRlZFRhcmdldEJyYW5jaCwgLTQpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKHN0cnRvbG93ZXIoJGNvbmZpZ1sndmVyc2lvbiddKSAhPT0gc3RydG9sb3dlcigkc291cmNlQnJhbmNoKSkgewpjb250aW51ZTsKfQoKCmlmICgoJHNvdXJjZVByZWZpeCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5wYXJzZU51bWVyaWNBbGlhc1ByZWZpeCgkc291cmNlQnJhbmNoKSkKJiYgKCR0YXJnZXRQcmVmaXggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJHRhcmdldEJyYW5jaCkpCiYmIChzdHJpcG9zKCR0YXJnZXRQcmVmaXgsICRzb3VyY2VQcmVmaXgpICE9PSAwKQopIHsKY29udGludWU7Cn0KCnJldHVybiAkdmFsaWRhdGVkVGFyZ2V0QnJhbmNoOwp9Cn0KCmlmICgKaXNzZXQoJGNvbmZpZ1snZGVmYXVsdC1icmFuY2gnXSkKJiYgJGNvbmZpZ1snZGVmYXVsdC1icmFuY2gnXSA9PT0gdHJ1ZQomJiBmYWxzZSA9PT0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KFByZWc6OnJlcGxhY2UoJ3tedn0nLCAnJywgJGNvbmZpZ1sndmVyc2lvbiddKSkKKSB7CnJldHVybiBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUzsKfQoKcmV0dXJuIG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7CgoKCgpjbGFzcyBJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbiBleHRlbmRzIFxFeGNlcHRpb24KewoKcHJpdmF0ZSAkZXJyb3JzOwoKcHJpdmF0ZSAkd2FybmluZ3M7Cgpwcml2YXRlICRkYXRhOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJGVycm9ycywgYXJyYXkgJHdhcm5pbmdzLCBhcnJheSAkZGF0YSkKewokdGhpcy0+ZXJyb3JzID0gJGVycm9yczsKJHRoaXMtPndhcm5pbmdzID0gJHdhcm5pbmdzOwokdGhpcy0+ZGF0YSA9ICRkYXRhOwpwYXJlbnQ6Ol9fY29uc3RydWN0KCJJbnZhbGlkIHBhY2thZ2UgaW5mb3JtYXRpb246IFxuIi5pbXBsb2RlKCJcbiIsIGFycmF5X21lcmdlKCRlcnJvcnMsICR3YXJuaW5ncykpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERhdGEoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRhdGE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFdhcm5pbmdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT53YXJuaW5nczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RBbGlhc1BhY2thZ2U7CgoKCgpjbGFzcyBKc29uTG9hZGVyCnsKCnByaXZhdGUgJGxvYWRlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChMb2FkZXJJbnRlcmZhY2UgJGxvYWRlcikKewokdGhpcy0+bG9hZGVyID0gJGxvYWRlcjsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkKCRqc29uKTogQmFzZVBhY2thZ2UKewppZiAoJGpzb24gaW5zdGFuY2VvZiBKc29uRmlsZSkgewokY29uZmlnID0gJGpzb24tPnJlYWQoKTsKfSBlbHNlaWYgKGZpbGVfZXhpc3RzKCRqc29uKSkgewokY29uZmlnID0gSnNvbkZpbGU6OnBhcnNlSnNvbihmaWxlX2dldF9jb250ZW50cygkanNvbiksICRqc29uKTsKfSBlbHNlaWYgKGlzX3N0cmluZygkanNvbikpIHsKJGNvbmZpZyA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGpzb24pOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKAoiSnNvbkxvYWRlcjogVW5rbm93biBcJGpzb24gcGFyYW1ldGVyICVzLiBQbGVhc2UgcmVwb3J0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jb21wb3Nlci9pc3N1ZXMvbmV3LiIsCmdldF9kZWJ1Z190eXBlKCRqc29uKQopKTsKfQoKcmV0dXJuICR0aGlzLT5sb2FkZXItPmxvYWQoJGNvbmZpZyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CgoKCgoKCmludGVyZmFjZSBMb2FkZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXI7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290QWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5RmFjdG9yeTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uR3Vlc3NlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeU1hbmFnZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CgoKCgoKCgoKY2xhc3MgUm9vdFBhY2thZ2VMb2FkZXIgZXh0ZW5kcyBBcnJheUxvYWRlcgp7CgoKCnByaXZhdGUgJG1hbmFnZXI7CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICR2ZXJzaW9uR3Vlc3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlNYW5hZ2VyICRtYW5hZ2VyLCBDb25maWcgJGNvbmZpZywgP1ZlcnNpb25QYXJzZXIgJHBhcnNlciA9IG51bGwsID9WZXJzaW9uR3Vlc3NlciAkdmVyc2lvbkd1ZXNzZXIgPSBudWxsLCA/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRwYXJzZXIpOwoKJHRoaXMtPm1hbmFnZXIgPSAkbWFuYWdlcjsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CmlmIChudWxsID09PSAkdmVyc2lvbkd1ZXNzZXIpIHsKJHByb2Nlc3NFeGVjdXRvciA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHByb2Nlc3NFeGVjdXRvci0+ZW5hYmxlQXN5bmMoKTsKJHZlcnNpb25HdWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb25maWcsICRwcm9jZXNzRXhlY3V0b3IsICR0aGlzLT52ZXJzaW9uUGFyc2VyKTsKfQokdGhpcy0+dmVyc2lvbkd1ZXNzZXIgPSAkdmVyc2lvbkd1ZXNzZXI7CiR0aGlzLT5pbyA9ICRpbzsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkKGFycmF5ICRjb25maWcsIHN0cmluZyAkY2xhc3MgPSAnQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZScsID9zdHJpbmcgJGN3ZCA9IG51bGwpOiBCYXNlUGFja2FnZQp7CmlmICgkY2xhc3MgIT09ICdDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlJykgewp0cmlnZ2VyX2Vycm9yKCdUaGUgJGNsYXNzIGFyZyBpcyBkZXByZWNhdGVkLCBwbGVhc2UgcmVhY2ggb3V0IHRvIENvbXBvc2VyIG1haW50YWluZXJzIEFTQVAgaWYgeW91IHN0aWxsIG5lZWQgdGhpcy4nLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KCmlmICghaXNzZXQoJGNvbmZpZ1snbmFtZSddKSkgewokY29uZmlnWyduYW1lJ10gPSAnX19yb290X18nOwp9IGVsc2VpZiAoJGVyciA9IFZhbGlkYXRpbmdBcnJheUxvYWRlcjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRjb25maWdbJ25hbWUnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3VyIHBhY2thZ2UgbmFtZSAnLiRlcnIpOwp9CiRhdXRvVmVyc2lvbmVkID0gZmFsc2U7CmlmICghaXNzZXQoJGNvbmZpZ1sndmVyc2lvbiddKSkgewokY29tbWl0ID0gbnVsbDsKCgppZiAoUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJykpIHsKJGNvbmZpZ1sndmVyc2lvbiddID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5nZXRSb290VmVyc2lvbkZyb21FbnYoKTsKfSBlbHNlIHsKJHZlcnNpb25EYXRhID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5ndWVzc1ZlcnNpb24oJGNvbmZpZywgJGN3ZCA/PyBQbGF0Zm9ybTo6Z2V0Q3dkKHRydWUpKTsKaWYgKCR2ZXJzaW9uRGF0YSkgewokY29uZmlnWyd2ZXJzaW9uJ10gPSAkdmVyc2lvbkRhdGFbJ3ByZXR0eV92ZXJzaW9uJ107CiRjb25maWdbJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ107CiRjb21taXQgPSAkdmVyc2lvbkRhdGFbJ2NvbW1pdCddOwp9Cn0KCmlmICghaXNzZXQoJGNvbmZpZ1sndmVyc2lvbiddKSkgewppZiAoJHRoaXMtPmlvICE9PSBudWxsICYmICRjb25maWdbJ25hbWUnXSAhPT0gJ19fcm9vdF9fJyAmJiAncHJvamVjdCcgIT09ICgkY29uZmlnWyd0eXBlJ10gPz8gJycpKSB7CiR0aGlzLT5pby0+d2FybmluZygKc3ByaW50ZigKIkNvbXBvc2VyIGNvdWxkIG5vdCBkZXRlY3QgdGhlIHJvb3QgcGFja2FnZSAoJXMpIHZlcnNpb24sIGRlZmF1bHRpbmcgdG8gJzEuMC4wJy4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL3Jvb3QtdmVyc2lvbiIsCiRjb25maWdbJ25hbWUnXQopCik7Cn0KJGNvbmZpZ1sndmVyc2lvbiddID0gJzEuMC4wJzsKJGF1dG9WZXJzaW9uZWQgPSB0cnVlOwp9CgppZiAoJGNvbW1pdCkgewokY29uZmlnWydzb3VyY2UnXSA9IFsKJ3R5cGUnID0+ICcnLAondXJsJyA9PiAnJywKJ3JlZmVyZW5jZScgPT4gJGNvbW1pdCwKXTsKJGNvbmZpZ1snZGlzdCddID0gWwondHlwZScgPT4gJycsCid1cmwnID0+ICcnLAoncmVmZXJlbmNlJyA9PiAkY29tbWl0LApdOwp9Cn0KCgokcGFja2FnZSA9IHBhcmVudDo6bG9hZCgkY29uZmlnLCAkY2xhc3MpOwppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBSb290QWxpYXNQYWNrYWdlKSB7CiRyZWFsUGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0gZWxzZSB7CiRyZWFsUGFja2FnZSA9ICRwYWNrYWdlOwp9CgppZiAoISRyZWFsUGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGluZyBhIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2UgYXQgdGhpcyBwb2ludCcpOwp9CgppZiAoJGF1dG9WZXJzaW9uZWQpIHsKJHJlYWxQYWNrYWdlLT5yZXBsYWNlVmVyc2lvbigkcmVhbFBhY2thZ2UtPmdldFZlcnNpb24oKSwgUm9vdFBhY2thZ2U6OkRFRkFVTFRfUFJFVFRZX1ZFUlNJT04pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXSkpIHsKJHJlYWxQYWNrYWdlLT5zZXRNaW5pbXVtU3RhYmlsaXR5KFZlcnNpb25QYXJzZXI6Om5vcm1hbGl6ZVN0YWJpbGl0eSgkY29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKSk7Cn0KCiRhbGlhc2VzID0gW107CiRzdGFiaWxpdHlGbGFncyA9IFtdOwokcmVmZXJlbmNlcyA9IFtdOwpmb3JlYWNoIChbJ3JlcXVpcmUnLCAncmVxdWlyZS1kZXYnXSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRjb25maWdbJGxpbmtUeXBlXSkpIHsKJGxpbmtJbmZvID0gQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXNbJGxpbmtUeXBlXTsKJG1ldGhvZCA9ICdnZXQnLnVjZmlyc3QoJGxpbmtJbmZvWydtZXRob2QnXSk7CiRsaW5rcyA9IFtdOwpmb3JlYWNoICgkcmVhbFBhY2thZ2UtPnskbWV0aG9kfSgpIGFzICRsaW5rKSB7CiRsaW5rc1skbGluay0+Z2V0VGFyZ2V0KCldID0gJGxpbmstPmdldENvbnN0cmFpbnQoKS0+Z2V0UHJldHR5U3RyaW5nKCk7Cn0KJGFsaWFzZXMgPSAkdGhpcy0+ZXh0cmFjdEFsaWFzZXMoJGxpbmtzLCAkYWxpYXNlcyk7CiRzdGFiaWxpdHlGbGFncyA9IHNlbGY6OmV4dHJhY3RTdGFiaWxpdHlGbGFncygkbGlua3MsICRyZWFsUGFja2FnZS0+Z2V0TWluaW11bVN0YWJpbGl0eSgpLCAkc3RhYmlsaXR5RmxhZ3MpOwokcmVmZXJlbmNlcyA9IHNlbGY6OmV4dHJhY3RSZWZlcmVuY2VzKCRsaW5rcywgJHJlZmVyZW5jZXMpOwoKaWYgKGlzc2V0KCRsaW5rc1skY29uZmlnWyduYW1lJ11dKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignUm9vdCBwYWNrYWdlIFwnJXNcJyBjYW5ub3QgcmVxdWlyZSBpdHNlbGYgaW4gaXRzIGNvbXBvc2VyLmpzb24nIC4gUEhQX0VPTCAuCidEaWQgeW91IGFjY2lkZW50YWxseSBuYW1lIHlvdXIgcm9vdCBwYWNrYWdlIGFmdGVyIGFuIGV4dGVybmFsIHBhY2thZ2U/JywgJGNvbmZpZ1snbmFtZSddKSk7Cn0KfQp9Cgpmb3JlYWNoIChhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjokc3VwcG9ydGVkTGlua1R5cGVzKSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRjb25maWdbJGxpbmtUeXBlXSkpIHsKZm9yZWFjaCAoJGNvbmZpZ1skbGlua1R5cGVdIGFzICRsaW5rTmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoJGVyciA9IFZhbGlkYXRpbmdBcnJheUxvYWRlcjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRsaW5rTmFtZSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRsaW5rVHlwZS4nLicuJGVycik7Cn0KfQp9Cn0KCiRyZWFsUGFja2FnZS0+c2V0QWxpYXNlcygkYWxpYXNlcyk7CiRyZWFsUGFja2FnZS0+c2V0U3RhYmlsaXR5RmxhZ3MoJHN0YWJpbGl0eUZsYWdzKTsKJHJlYWxQYWNrYWdlLT5zZXRSZWZlcmVuY2VzKCRyZWZlcmVuY2VzKTsKCmlmIChpc3NldCgkY29uZmlnWydwcmVmZXItc3RhYmxlJ10pKSB7CiRyZWFsUGFja2FnZS0+c2V0UHJlZmVyU3RhYmxlKChib29sKSAkY29uZmlnWydwcmVmZXItc3RhYmxlJ10pOwp9CgppZiAoaXNzZXQoJGNvbmZpZ1snY29uZmlnJ10pKSB7CiRyZWFsUGFja2FnZS0+c2V0Q29uZmlnKCRjb25maWdbJ2NvbmZpZyddKTsKfQoKJHJlcG9zID0gUmVwb3NpdG9yeUZhY3Rvcnk6OmRlZmF1bHRSZXBvcyhudWxsLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+bWFuYWdlcik7CmZvcmVhY2ggKCRyZXBvcyBhcyAkcmVwbykgewokdGhpcy0+bWFuYWdlci0+YWRkUmVwb3NpdG9yeSgkcmVwbyk7Cn0KJHJlYWxQYWNrYWdlLT5zZXRSZXBvc2l0b3JpZXMoJHRoaXMtPmNvbmZpZy0+Z2V0UmVwb3NpdG9yaWVzKCkpOwoKcmV0dXJuICRwYWNrYWdlOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RBbGlhc2VzKGFycmF5ICRyZXF1aXJlcywgYXJyYXkgJGFsaWFzZXMpOiBhcnJheQp7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxTmFtZSA9PiAkcmVxVmVyc2lvbikgewppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygneyg/Ol58XHwgKnwsICopKFteLFxzI3xdKykoPzojW14gXSspPyArYXMgKyhbXixcc3xdKykoPzokfCAqXHx8ICosKX0nLCAkcmVxVmVyc2lvbiwgJG1hdGNoKSkgewokYWxpYXNlc1tdID0gWwoncGFja2FnZScgPT4gc3RydG9sb3dlcigkcmVxTmFtZSksCid2ZXJzaW9uJyA9PiAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRtYXRjaFsxXSwgJHJlcVZlcnNpb24pLAonYWxpYXMnID0+ICRtYXRjaFsyXSwKJ2FsaWFzX25vcm1hbGl6ZWQnID0+ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJG1hdGNoWzJdLCAkcmVxVmVyc2lvbiksCl07Cn0gZWxzZWlmIChzdHJwb3MoJHJlcVZlcnNpb24sICcgYXMgJykgIT09IGZhbHNlKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIGFsaWFzIGRlZmluaXRpb24gaW4gIicuJHJlcU5hbWUuJyI6ICInLiRyZXFWZXJzaW9uLiciLiBBbGlhc2VzIHNob3VsZCBiZSBpbiB0aGUgZm9ybSAiZXhhY3QtdmVyc2lvbiBhcyBvdGhlci1leGFjdC12ZXJzaW9uIi4nKTsKfQp9CgpyZXR1cm4gJGFsaWFzZXM7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdFN0YWJpbGl0eUZsYWdzKGFycmF5ICRyZXF1aXJlcywgc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5LCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MpOiBhcnJheQp7CiRzdGFiaWxpdGllcyA9IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUzsKJG1pbmltdW1TdGFiaWxpdHkgPSAkc3RhYmlsaXRpZXNbJG1pbmltdW1TdGFiaWxpdHldOwpmb3JlYWNoICgkcmVxdWlyZXMgYXMgJHJlcU5hbWUgPT4gJHJlcVZlcnNpb24pIHsKJGNvbnN0cmFpbnRzID0gW107CgoKJG9yU3BsaXQgPSBQcmVnOjpzcGxpdCgne1xzKlx8XHw/XHMqfScsIHRyaW0oJHJlcVZlcnNpb24pKTsKZm9yZWFjaCAoJG9yU3BsaXQgYXMgJG9yQ29uc3RyYWludCkgewokYW5kU3BsaXQgPSBQcmVnOjpzcGxpdCgneyg/PCFefGFzfFs9PjwgLF0pICooPzwhLSlbLCBdKD8hLSkgKig/ISx8YXN8JCl9JywgJG9yQ29uc3RyYWludCk7CmZvcmVhY2ggKCRhbmRTcGxpdCBhcyAkYW5kQ29uc3RyYWludCkgewokY29uc3RyYWludHNbXSA9ICRhbmRDb25zdHJhaW50Owp9Cn0KCgokbWF0Y2hlZCA9IGZhbHNlOwpmb3JlYWNoICgkY29uc3RyYWludHMgYXMgJGNvbnN0cmFpbnQpIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teW15AXSo/QCgnLmltcGxvZGUoJ3wnLCBhcnJheV9rZXlzKCRzdGFiaWxpdGllcykpLicpJH1pJywgJGNvbnN0cmFpbnQsICRtYXRjaCkpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXFOYW1lKTsKJHN0YWJpbGl0eSA9ICRzdGFiaWxpdGllc1tWZXJzaW9uUGFyc2VyOjpub3JtYWxpemVTdGFiaWxpdHkoJG1hdGNoWzFdKV07CgppZiAoaXNzZXQoJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSkgJiYgJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA+ICRzdGFiaWxpdHkpIHsKY29udGludWU7Cn0KJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA9ICRzdGFiaWxpdHk7CiRtYXRjaGVkID0gdHJ1ZTsKfQp9CgppZiAoJG1hdGNoZWQpIHsKY29udGludWU7Cn0KCmZvcmVhY2ggKCRjb25zdHJhaW50cyBhcyAkY29uc3RyYWludCkgewoKCiRyZXFWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne14oW14sXHNAXSspIGFzIC4rJH0nLCAnJDEnLCAkY29uc3RyYWludCk7CmlmIChQcmVnOjppc01hdGNoKCd7XlteLFxzQF0rJH0nLCAkcmVxVmVyc2lvbikgJiYgJ3N0YWJsZScgIT09ICgkc3RhYmlsaXR5TmFtZSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCRyZXFWZXJzaW9uKSkpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXFOYW1lKTsKJHN0YWJpbGl0eSA9ICRzdGFiaWxpdGllc1skc3RhYmlsaXR5TmFtZV07CmlmICgoaXNzZXQoJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSkgJiYgJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSA+ICRzdGFiaWxpdHkpIHx8ICgkbWluaW11bVN0YWJpbGl0eSA+ICRzdGFiaWxpdHkpKSB7CmNvbnRpbnVlOwp9CiRzdGFiaWxpdHlGbGFnc1skbmFtZV0gPSAkc3RhYmlsaXR5Owp9Cn0KfQoKcmV0dXJuICRzdGFiaWxpdHlGbGFnczsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4dHJhY3RSZWZlcmVuY2VzKGFycmF5ICRyZXF1aXJlcywgYXJyYXkgJHJlZmVyZW5jZXMpOiBhcnJheQp7CmZvcmVhY2ggKCRyZXF1aXJlcyBhcyAkcmVxTmFtZSA9PiAkcmVxVmVyc2lvbikgewokcmVxVmVyc2lvbiA9IFByZWc6OnJlcGxhY2UoJ3teKFteLFxzQF0rKSBhcyAuKyR9JywgJyQxJywgJHJlcVZlcnNpb24pOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15bXixcc0BdKz8jKFthLWYwLTldKykkfScsICRyZXFWZXJzaW9uLCAkbWF0Y2gpICYmICdkZXYnID09PSBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkcmVxVmVyc2lvbikpIHsKJG5hbWUgPSBzdHJ0b2xvd2VyKCRyZXFOYW1lKTsKJHJlZmVyZW5jZXNbJG5hbWVdID0gJG1hdGNoWzFdOwp9Cn0KCnJldHVybiAkcmVmZXJlbmNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQYWNrYWdlXExvYWRlcjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxNYXRjaE5vbmVDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXEludGVydmFsczsKdXNlIENvbXBvc2VyXFNwZHhcU3BkeExpY2Vuc2VzOwoKCgoKY2xhc3MgVmFsaWRhdGluZ0FycmF5TG9hZGVyIGltcGxlbWVudHMgTG9hZGVySW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IENIRUNLX0FMTCA9IDM7CnB1YmxpYyBjb25zdCBDSEVDS19VTkJPVU5EX0NPTlNUUkFJTlRTID0gMTsKcHVibGljIGNvbnN0IENIRUNLX1NUUklDVF9DT05TVFJBSU5UUyA9IDI7CgoKcHJpdmF0ZSAkbG9hZGVyOwoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCnByaXZhdGUgJGVycm9yczsKCnByaXZhdGUgJHdhcm5pbmdzOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkZmxhZ3M7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoTG9hZGVySW50ZXJmYWNlICRsb2FkZXIsIGJvb2wgJHN0cmljdE5hbWUgPSB0cnVlLCA/VmVyc2lvblBhcnNlciAkcGFyc2VyID0gbnVsbCwgaW50ICRmbGFncyA9IDApCnsKJHRoaXMtPmxvYWRlciA9ICRsb2FkZXI7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gJHBhcnNlciA/PyBuZXcgVmVyc2lvblBhcnNlcigpOwokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7CgppZiAoJHN0cmljdE5hbWUgIT09IHRydWUpIHsgCnRyaWdnZXJfZXJyb3IoJyRzdHJpY3ROYW1lIG11c3QgYmUgc2V0IHRvIHRydWUgaW4gVmFsaWRhdGluZ0FycmF5TG9hZGVyXCdzIGNvbnN0cnVjdG9yIGFzIG9mIDIuMiwgYW5kIGl0IHdpbGwgYmUgcmVtb3ZlZCBpbiAzLjAnLCBFX1VTRVJfREVQUkVDQVRFRCk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWQoYXJyYXkgJGNvbmZpZywgc3RyaW5nICRjbGFzcyA9ICdDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZScpOiBCYXNlUGFja2FnZQp7CiR0aGlzLT5lcnJvcnMgPSBbXTsKJHRoaXMtPndhcm5pbmdzID0gW107CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwoKJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCduYW1lJywgdHJ1ZSk7CmlmIChpc3NldCgkY29uZmlnWyduYW1lJ10pICYmIG51bGwgIT09ICgkZXJyID0gc2VsZjo6aGFzUGFja2FnZU5hbWluZ0Vycm9yKCRjb25maWdbJ25hbWUnXSkpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICduYW1lIDogJy4kZXJyOwp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1sndmVyc2lvbiddKSkgewppZiAoIWlzX3NjYWxhcigkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CiR0aGlzLT52YWxpZGF0ZVN0cmluZygndmVyc2lvbicpOwp9IGVsc2UgewppZiAoIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pKSB7CiR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSA9IChzdHJpbmcpICR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXTsKfQp0cnkgewokdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3ZlcnNpb24gOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ3ZlcnNpb24nXS4nKTogJy4kZS0+Z2V0TWVzc2FnZSgpOwp1bnNldCgkdGhpcy0+Y29uZmlnWyd2ZXJzaW9uJ10pOwp9Cn0KfQoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ2NvbmZpZyddWydwbGF0Zm9ybSddKSkgewpmb3JlYWNoICgoYXJyYXkpICR0aGlzLT5jb25maWdbJ2NvbmZpZyddWydwbGF0Zm9ybSddIGFzICRrZXkgPT4gJHBsYXRmb3JtKSB7CmlmIChmYWxzZSA9PT0gJHBsYXRmb3JtKSB7CmNvbnRpbnVlOwp9CmlmICghaXNfc3RyaW5nKCRwbGF0Zm9ybSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2NvbmZpZy5wbGF0Zm9ybS4nIC4gJGtleSAuICcgOiBpbnZhbGlkIHZhbHVlICgnLmdldF9kZWJ1Z190eXBlKCRwbGF0Zm9ybSkuJyAnLnZhcl9leHBvcnQoJHBsYXRmb3JtLCB0cnVlKS4nKTogZXhwZWN0ZWQgc3RyaW5nIG9yIGZhbHNlJzsKY29udGludWU7Cn0KdHJ5IHsKJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcGxhdGZvcm0pOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdjb25maWcucGxhdGZvcm0uJyAuICRrZXkgLiAnIDogaW52YWxpZCB2YWx1ZSAoJy4kcGxhdGZvcm0uJyk6ICcuJGUtPmdldE1lc3NhZ2UoKTsKfQp9Cn0KCiR0aGlzLT52YWxpZGF0ZVJlZ2V4KCd0eXBlJywgJ1tBLVphLXowLTktXSsnKTsKJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCd0YXJnZXQtZGlyJyk7CiR0aGlzLT52YWxpZGF0ZUFycmF5KCdleHRyYScpOwoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ2JpbiddKSkgewppZiAoaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJ2JpbiddKSkgewokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ2JpbicpOwp9IGVsc2UgewokdGhpcy0+dmFsaWRhdGVGbGF0QXJyYXkoJ2JpbicpOwp9Cn0KCiR0aGlzLT52YWxpZGF0ZUFycmF5KCdzY3JpcHRzJyk7IAokdGhpcy0+dmFsaWRhdGVTdHJpbmcoJ2Rlc2NyaXB0aW9uJyk7CiR0aGlzLT52YWxpZGF0ZVVybCgnaG9tZXBhZ2UnKTsKJHRoaXMtPnZhbGlkYXRlRmxhdEFycmF5KCdrZXl3b3JkcycsICdbXHB7Tn1ccHtMfSAuXy1dKycpOwoKJHJlbGVhc2VEYXRlID0gbnVsbDsKJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCd0aW1lJyk7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyd0aW1lJ10pKSB7CnRyeSB7CiRyZWxlYXNlRGF0ZSA9IG5ldyBcRGF0ZVRpbWUoJHRoaXMtPmNvbmZpZ1sndGltZSddLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICd0aW1lIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWyd0aW1lJ10uJyk6ICcuJGUtPmdldE1lc3NhZ2UoKTsKdW5zZXQoJHRoaXMtPmNvbmZpZ1sndGltZSddKTsKfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snbGljZW5zZSddKSkgewoKaWYgKGlzX2FycmF5KCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSkgfHwgaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSkpIHsKJGxpY2Vuc2VzID0gKGFycmF5KSAkdGhpcy0+Y29uZmlnWydsaWNlbnNlJ107Cgpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGluZGV4ID0+ICRsaWNlbnNlKSB7CmlmICghaXNfc3RyaW5nKCRsaWNlbnNlKSkgewokdGhpcy0+d2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICVzIHNob3VsZCBiZSBhIHN0cmluZy4nLApqc29uX2VuY29kZSgkbGljZW5zZSkKKTsKdW5zZXQoJGxpY2Vuc2VzWyRpbmRleF0pOwp9Cn0KCgppZiAobnVsbCA9PT0gJHJlbGVhc2VEYXRlIHx8ICRyZWxlYXNlRGF0ZS0+Z2V0VGltZXN0YW1wKCkgPj0gc3RydG90aW1lKCctOGRheXMnKSkgewokbGljZW5zZVZhbGlkYXRvciA9IG5ldyBTcGR4TGljZW5zZXMoKTsKZm9yZWFjaCAoJGxpY2Vuc2VzIGFzICRsaWNlbnNlKSB7CgppZiAoJ3Byb3ByaWV0YXJ5JyA9PT0gJGxpY2Vuc2UpIHsKY29udGludWU7Cn0KJGxpY2Vuc2VUb1ZhbGlkYXRlID0gc3RyX3JlcGxhY2UoJ3Byb3ByaWV0YXJ5JywgJ01JVCcsICRsaWNlbnNlKTsKaWYgKCEkbGljZW5zZVZhbGlkYXRvci0+dmFsaWRhdGUoJGxpY2Vuc2VUb1ZhbGlkYXRlKSkgewppZiAoJGxpY2Vuc2VWYWxpZGF0b3ItPnZhbGlkYXRlKHRyaW0oJGxpY2Vuc2VUb1ZhbGlkYXRlKSkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSAlcyBtdXN0IG5vdCBjb250YWluIGV4dHJhIHNwYWNlcywgbWFrZSBzdXJlIHRvIHRyaW0gaXQuJywKanNvbl9lbmNvZGUoJGxpY2Vuc2UpCik7Cn0gZWxzZSB7CiR0aGlzLT53YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgJXMgaXMgbm90IGEgdmFsaWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHNlZSBodHRwczovL3NwZHgub3JnL2xpY2Vuc2VzLyBpZiB5b3UgdXNlIGFuIG9wZW4gbGljZW5zZS4nIC4gUEhQX0VPTCAuCidJZiB0aGUgc29mdHdhcmUgaXMgY2xvc2VkLXNvdXJjZSwgeW91IG1heSB1c2UgInByb3ByaWV0YXJ5IiBhcyBsaWNlbnNlLicsCmpzb25fZW5jb2RlKCRsaWNlbnNlKQopOwp9Cn0KfQp9CgokdGhpcy0+Y29uZmlnWydsaWNlbnNlJ10gPSBhcnJheV92YWx1ZXMoJGxpY2Vuc2VzKTsKfSBlbHNlIHsKJHRoaXMtPndhcm5pbmdzW10gPSBzcHJpbnRmKAonTGljZW5zZSBtdXN0IGJlIGEgc3RyaW5nIG9yIGFycmF5IG9mIHN0cmluZ3MsIGdvdCAlcy4nLApqc29uX2VuY29kZSgkdGhpcy0+Y29uZmlnWydsaWNlbnNlJ10pCik7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2xpY2Vuc2UnXSk7Cn0KfQoKaWYgKCR0aGlzLT52YWxpZGF0ZUFycmF5KCdhdXRob3JzJykpIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddIGFzICRrZXkgPT4gJGF1dGhvcikgewppZiAoIWlzX2FycmF5KCRhdXRob3IpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdhdXRob3JzLicuJGtleS4nIDogc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldF9kZWJ1Z190eXBlKCRhdXRob3IpLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV0pOwpjb250aW51ZTsKfQpmb3JlYWNoIChbJ2hvbWVwYWdlJywgJ2VtYWlsJywgJ25hbWUnLCAncm9sZSddIGFzICRhdXRob3JEYXRhKSB7CmlmIChpc3NldCgkYXV0aG9yWyRhdXRob3JEYXRhXSkgJiYgIWlzX3N0cmluZygkYXV0aG9yWyRhdXRob3JEYXRhXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicuJy4kYXV0aG9yRGF0YS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XVskYXV0aG9yRGF0YV0pOwp9Cn0KaWYgKGlzc2V0KCRhdXRob3JbJ2hvbWVwYWdlJ10pICYmICEkdGhpcy0+ZmlsdGVyVXJsKCRhdXRob3JbJ2hvbWVwYWdlJ10pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicuaG9tZXBhZ2UgOiBpbnZhbGlkIHZhbHVlICgnLiRhdXRob3JbJ2hvbWVwYWdlJ10uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ11bJGtleV1bJ2hvbWVwYWdlJ10pOwp9CmlmIChpc3NldCgkYXV0aG9yWydlbWFpbCddKSAmJiBmYWxzZSA9PT0gZmlsdGVyX3ZhcigkYXV0aG9yWydlbWFpbCddLCBGSUxURVJfVkFMSURBVEVfRU1BSUwpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2F1dGhvcnMuJy4ka2V5LicuZW1haWwgOiBpbnZhbGlkIHZhbHVlICgnLiRhdXRob3JbJ2VtYWlsJ10uJyksIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldWydlbWFpbCddKTsKfQppZiAoXGNvdW50KCR0aGlzLT5jb25maWdbJ2F1dGhvcnMnXVska2V5XSkgPT09IDApIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddWyRrZXldKTsKfQp9CmlmIChcY291bnQoJHRoaXMtPmNvbmZpZ1snYXV0aG9ycyddKSA9PT0gMCkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRob3JzJ10pOwp9Cn0KCmlmICgkdGhpcy0+dmFsaWRhdGVBcnJheSgnc3VwcG9ydCcpICYmICFlbXB0eSgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J10pKSB7CmZvcmVhY2ggKFsnaXNzdWVzJywgJ2ZvcnVtJywgJ3dpa2knLCAnc291cmNlJywgJ2VtYWlsJywgJ2lyYycsICdkb2NzJywgJ3JzcycsICdjaGF0JywgJ3NlY3VyaXR5J10gYXMgJGtleSkgewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3N1cHBvcnQuJy4ka2V5LicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKTsKfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydlbWFpbCddKSAmJiAhZmlsdGVyX3ZhcigkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2VtYWlsJ10sIEZJTFRFUl9WQUxJREFURV9FTUFJTCkpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAnc3VwcG9ydC5lbWFpbCA6IGludmFsaWQgdmFsdWUgKCcuJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydlbWFpbCddLicpLCBtdXN0IGJlIGEgdmFsaWQgZW1haWwgYWRkcmVzcyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVsnZW1haWwnXSk7Cn0KCmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddKSAmJiAhJHRoaXMtPmZpbHRlclVybCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddLCBbJ2lyYycsICdpcmNzJ10pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ3N1cHBvcnQuaXJjIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJ2lyYyddLicpLCBtdXN0IGJlIGEgaXJjOi8vPHNlcnZlcj4vPGNoYW5uZWw+IG9yIGlyY3M6Ly8gVVJMJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWydpcmMnXSk7Cn0KCmZvcmVhY2ggKFsnaXNzdWVzJywgJ2ZvcnVtJywgJ3dpa2knLCAnc291cmNlJywgJ2RvY3MnLCAnY2hhdCcsICdzZWN1cml0eSddIGFzICRrZXkpIHsKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXVska2V5XSkgJiYgISR0aGlzLT5maWx0ZXJVcmwoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddWyRrZXldKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdzdXBwb3J0LicuJGtleS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydzdXBwb3J0J11bJGtleV0pOwp9Cn0KaWYgKGVtcHR5KCR0aGlzLT5jb25maWdbJ3N1cHBvcnQnXSkpIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snc3VwcG9ydCddKTsKfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2Z1bmRpbmcnKSAmJiAhZW1wdHkoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddKSkgewpmb3JlYWNoICgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ10gYXMgJGtleSA9PiAkZnVuZGluZ09wdGlvbikgewppZiAoIWlzX2FycmF5KCRmdW5kaW5nT3B0aW9uKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnZnVuZGluZy4nLiRrZXkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXRfZGVidWdfdHlwZSgkZnVuZGluZ09wdGlvbikuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXVska2V5XSk7CmNvbnRpbnVlOwp9CmZvcmVhY2ggKFsndHlwZScsICd1cmwnXSBhcyAkZnVuZGluZ0RhdGEpIHsKaWYgKGlzc2V0KCRmdW5kaW5nT3B0aW9uWyRmdW5kaW5nRGF0YV0pICYmICFpc19zdHJpbmcoJGZ1bmRpbmdPcHRpb25bJGZ1bmRpbmdEYXRhXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2Z1bmRpbmcuJy4ka2V5LicuJy4kZnVuZGluZ0RhdGEuJyA6IGludmFsaWQgdmFsdWUsIG11c3QgYmUgYSBzdHJpbmcnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV1bJGZ1bmRpbmdEYXRhXSk7Cn0KfQppZiAoaXNzZXQoJGZ1bmRpbmdPcHRpb25bJ3VybCddKSAmJiAhJHRoaXMtPmZpbHRlclVybCgkZnVuZGluZ09wdGlvblsndXJsJ10pKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2Z1bmRpbmcuJy4ka2V5LicudXJsIDogaW52YWxpZCB2YWx1ZSAoJy4kZnVuZGluZ09wdGlvblsndXJsJ10uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV1bJ3VybCddKTsKfQppZiAoZW1wdHkoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddWyRrZXldKSkgewp1bnNldCgkdGhpcy0+Y29uZmlnWydmdW5kaW5nJ11bJGtleV0pOwp9Cn0KaWYgKGVtcHR5KCR0aGlzLT5jb25maWdbJ2Z1bmRpbmcnXSkpIHsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZnVuZGluZyddKTsKfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1sncGhwLWV4dCddKSAmJiAkdGhpcy0+dmFsaWRhdGVBcnJheSgncGhwLWV4dCcpKSB7CmlmICghaW5fYXJyYXkoJHRoaXMtPmNvbmZpZ1sndHlwZSddID8/ICcnLCBbJ3BocC1leHQnLCAncGhwLWV4dC16ZW5kJ10sIHRydWUpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0IGNhbiBvbmx5IGJlIHNldCBieSBwYWNrYWdlcyBvZiB0eXBlICJwaHAtZXh0IiBvciAicGhwLWV4dC16ZW5kIiB3aGljaCBtdXN0IGJlIEMgZXh0ZW5zaW9ucyc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3BocC1leHQnXSk7Cn0KCiRwaHBFeHQgPSAmJHRoaXMtPmNvbmZpZ1sncGhwLWV4dCddOwoKaWYgKGlzc2V0KCRwaHBFeHRbJ2V4dGVuc2lvbi1uYW1lJ10pICYmICFpc19zdHJpbmcoJHBocEV4dFsnZXh0ZW5zaW9uLW5hbWUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuZXh0ZW5zaW9uLW5hbWUgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJHBocEV4dFsnZXh0ZW5zaW9uLW5hbWUnXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ2V4dGVuc2lvbi1uYW1lJ10pOwp9CgppZiAoaXNzZXQoJHBocEV4dFsncHJpb3JpdHknXSkgJiYgIWlzX2ludCgkcGhwRXh0Wydwcmlvcml0eSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5wcmlvcml0eSA6IHNob3VsZCBiZSBhbiBpbnRlZ2VyLCAnLmdldF9kZWJ1Z190eXBlKCRwaHBFeHRbJ3ByaW9yaXR5J10pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0Wydwcmlvcml0eSddKTsKfQoKaWYgKGlzc2V0KCRwaHBFeHRbJ3N1cHBvcnQtenRzJ10pICYmICFpc19ib29sKCRwaHBFeHRbJ3N1cHBvcnQtenRzJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LnN1cHBvcnQtenRzIDogc2hvdWxkIGJlIGEgYm9vbGVhbiwgJy5nZXRfZGVidWdfdHlwZSgkcGhwRXh0WydzdXBwb3J0LXp0cyddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnc3VwcG9ydC16dHMnXSk7Cn0KCmlmIChpc3NldCgkcGhwRXh0WydzdXBwb3J0LW50cyddKSAmJiAhaXNfYm9vbCgkcGhwRXh0WydzdXBwb3J0LW50cyddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5zdXBwb3J0LW50cyA6IHNob3VsZCBiZSBhIGJvb2xlYW4sICcuZ2V0X2RlYnVnX3R5cGUoJHBocEV4dFsnc3VwcG9ydC1udHMnXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ3N1cHBvcnQtbnRzJ10pOwp9CgppZiAoaXNzZXQoJHBocEV4dFsnYnVpbGQtcGF0aCddKSAmJiAhaXNfc3RyaW5nKCRwaHBFeHRbJ2J1aWxkLXBhdGgnXSkgJiYgIWlzX251bGwoJHBocEV4dFsnYnVpbGQtcGF0aCddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5idWlsZC1wYXRoIDogc2hvdWxkIGJlIGEgc3RyaW5nIG9yIG51bGwsICcuZ2V0X2RlYnVnX3R5cGUoJHBocEV4dFsnYnVpbGQtcGF0aCddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnYnVpbGQtcGF0aCddKTsKfQoKaWYgKGlzc2V0KCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSkpIHsKaWYgKCFpc19zdHJpbmcoJHBocEV4dFsnZG93bmxvYWQtdXJsLW1ldGhvZCddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5kb3dubG9hZC11cmwtbWV0aG9kIDogc2hvdWxkIGJlIGEgc3RyaW5nLCAnLmdldF9kZWJ1Z190eXBlKCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ2Rvd25sb2FkLXVybC1tZXRob2QnXSk7Cn0gZWxzZWlmICghaW5fYXJyYXkoJHBocEV4dFsnZG93bmxvYWQtdXJsLW1ldGhvZCddLCBbJ2NvbXBvc2VyLWRlZmF1bHQnLCAncHJlLXBhY2thZ2VkLXNvdXJjZSddLCB0cnVlKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5kb3dubG9hZC11cmwtbWV0aG9kIDogaW52YWxpZCB2YWx1ZSAoJy4kcGhwRXh0Wydkb3dubG9hZC11cmwtbWV0aG9kJ10uJyksIG11c3QgYmUgb25lIG9mIGNvbXBvc2VyLWRlZmF1bHQsIHByZS1wYWNrYWdlZC1zb3VyY2UnOwp1bnNldCgkcGhwRXh0Wydkb3dubG9hZC11cmwtbWV0aG9kJ10pOwp9Cn0KCmlmIChpc3NldCgkcGhwRXh0Wydvcy1mYW1pbGllcyddKSAmJiBpc3NldCgkcGhwRXh0Wydvcy1mYW1pbGllcy1leGNsdWRlJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0IDogb3MtZmFtaWxpZXMgYW5kIG9zLWZhbWlsaWVzLWV4Y2x1ZGUgY2Fubm90IGJvdGggYmUgc3BlY2lmaWVkJzsKdW5zZXQoJHBocEV4dFsnb3MtZmFtaWxpZXMnXSwgJHBocEV4dFsnb3MtZmFtaWxpZXMtZXhjbHVkZSddKTsKfSBlbHNlIHsKJHZhbGlkT3NGYW1pbGllcyA9IFsnd2luZG93cycsICdic2QnLCAnZGFyd2luJywgJ3NvbGFyaXMnLCAnbGludXgnLCAndW5rbm93biddOwoKZm9yZWFjaCAoWydvcy1mYW1pbGllcycsICdvcy1mYW1pbGllcy1leGNsdWRlJ10gYXMgJGZpZWxkTmFtZSkgewppZiAoaXNzZXQoJHBocEV4dFskZmllbGROYW1lXSkpIHsKaWYgKCFpc19hcnJheSgkcGhwRXh0WyRmaWVsZE5hbWVdKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC4nLiRmaWVsZE5hbWUuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXRfZGVidWdfdHlwZSgkcGhwRXh0WyRmaWVsZE5hbWVdKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFskZmllbGROYW1lXSk7Cn0gZWxzZWlmIChbXSA9PT0gJHBocEV4dFskZmllbGROYW1lXSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC4nLiRmaWVsZE5hbWUuJyA6IG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZWxlbWVudCc7CnVuc2V0KCRwaHBFeHRbJGZpZWxkTmFtZV0pOwp9IGVsc2Ugewpmb3JlYWNoICgkcGhwRXh0WyRmaWVsZE5hbWVdIGFzICRrZXkgPT4gJG9zRmFtaWx5KSB7CmlmICghaXNfc3RyaW5nKCRvc0ZhbWlseSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuJy4kZmllbGROYW1lLicuJy4ka2V5LicgOiBzaG91bGQgYmUgYSBzdHJpbmcsICcuZ2V0X2RlYnVnX3R5cGUoJG9zRmFtaWx5KS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFskZmllbGROYW1lXVska2V5XSk7Cn0gZWxzZWlmICghaW5fYXJyYXkoJG9zRmFtaWx5LCAkdmFsaWRPc0ZhbWlsaWVzLCB0cnVlKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC4nLiRmaWVsZE5hbWUuJy4nLiRrZXkuJyA6IGludmFsaWQgdmFsdWUgKCcuJG9zRmFtaWx5LicpLCBtdXN0IGJlIG9uZSBvZiAnLmltcGxvZGUoJywgJywgJHZhbGlkT3NGYW1pbGllcyk7CnVuc2V0KCRwaHBFeHRbJGZpZWxkTmFtZV1bJGtleV0pOwp9Cn0KaWYgKFtdID09PSAkcGhwRXh0WyRmaWVsZE5hbWVdKSB7CnVuc2V0KCRwaHBFeHRbJGZpZWxkTmFtZV0pOwp9Cn0KfQp9Cn0KCmlmIChpc3NldCgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddKSkgewppZiAoIWlzX2FycmF5KCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmNvbmZpZ3VyZS1vcHRpb25zIDogc2hvdWxkIGJlIGFuIGFycmF5LCAnLmdldF9kZWJ1Z190eXBlKCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ10pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddKTsKfSBlbHNlIHsKZm9yZWFjaCAoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXSBhcyAka2V5ID0+ICRvcHRpb24pIHsKaWYgKCFpc19hcnJheSgkb3B0aW9uKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5jb25maWd1cmUtb3B0aW9ucy4nLiRrZXkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXRfZGVidWdfdHlwZSgkb3B0aW9uKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXVska2V5XSk7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCRvcHRpb25bJ25hbWUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ3BocC1leHQuY29uZmlndXJlLW9wdGlvbnMuJy4ka2V5LicubmFtZSA6IG11c3QgYmUgcHJlc2VudCc7CnVuc2V0KCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ11bJGtleV0pOwpjb250aW51ZTsKfQoKaWYgKCFpc19zdHJpbmcoJG9wdGlvblsnbmFtZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAncGhwLWV4dC5jb25maWd1cmUtb3B0aW9ucy4nLiRrZXkuJy5uYW1lIDogc2hvdWxkIGJlIGEgc3RyaW5nLCAnLmdldF9kZWJ1Z190eXBlKCRvcHRpb25bJ25hbWUnXSkuJyBnaXZlbic7CnVuc2V0KCRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ11bJGtleV0pOwpjb250aW51ZTsKfQoKaWYgKGlzc2V0KCRvcHRpb25bJ25lZWRzLXZhbHVlJ10pICYmICFpc19ib29sKCRvcHRpb25bJ25lZWRzLXZhbHVlJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmNvbmZpZ3VyZS1vcHRpb25zLicuJGtleS4nLm5lZWRzLXZhbHVlIDogc2hvdWxkIGJlIGEgYm9vbGVhbiwgJy5nZXRfZGVidWdfdHlwZSgkb3B0aW9uWyduZWVkcy12YWx1ZSddKS4nIGdpdmVuJzsKdW5zZXQoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXVska2V5XVsnbmVlZHMtdmFsdWUnXSk7Cn0KCmlmIChpc3NldCgkb3B0aW9uWydkZXNjcmlwdGlvbiddKSAmJiAhaXNfc3RyaW5nKCRvcHRpb25bJ2Rlc2NyaXB0aW9uJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdwaHAtZXh0LmNvbmZpZ3VyZS1vcHRpb25zLicuJGtleS4nLmRlc2NyaXB0aW9uIDogc2hvdWxkIGJlIGEgc3RyaW5nLCAnLmdldF9kZWJ1Z190eXBlKCRvcHRpb25bJ2Rlc2NyaXB0aW9uJ10pLicgZ2l2ZW4nOwp1bnNldCgkcGhwRXh0Wydjb25maWd1cmUtb3B0aW9ucyddWyRrZXldWydkZXNjcmlwdGlvbiddKTsKfQp9CgppZiAoW10gPT09ICRwaHBFeHRbJ2NvbmZpZ3VyZS1vcHRpb25zJ10pIHsKdW5zZXQoJHBocEV4dFsnY29uZmlndXJlLW9wdGlvbnMnXSk7Cn0KfQp9CgoKaWYgKFtdID09PSAkcGhwRXh0KSB7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3BocC1leHQnXSk7Cn0KCnVuc2V0KCRwaHBFeHQpOwp9CgokdW5ib3VuZENvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPScsICcxMDAwMDAwMC1kZXYnKTsKCmZvcmVhY2ggKGFycmF5X2tleXMoQmFzZVBhY2thZ2U6OiRzdXBwb3J0ZWRMaW5rVHlwZXMpIGFzICRsaW5rVHlwZSkgewppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJGxpbmtUeXBlKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV0pKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXSBhcyAkcGFja2FnZSA9PiAkY29uc3RyYWludCkgewokcGFja2FnZSA9IChzdHJpbmcpICRwYWNrYWdlOwppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snbmFtZSddKSAmJiAwID09PSBzdHJjYXNlY21wKCRwYWNrYWdlLCAkdGhpcy0+Y29uZmlnWyduYW1lJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IGEgcGFja2FnZSBjYW5ub3Qgc2V0IGEgJy4kbGlua1R5cGUuJyBvbiBpdHNlbGYnOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV1bJHBhY2thZ2VdKTsKY29udGludWU7Cn0KaWYgKCRlcnIgPSBzZWxmOjpoYXNQYWNrYWdlTmFtaW5nRXJyb3IoJHBhY2thZ2UsIHRydWUpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJGxpbmtUeXBlLicuJy4kZXJyOwp9IGVsc2VpZiAoIVByZWc6OmlzTWF0Y2goJ3teW0EtWmEtejAtOV8uLy1dKyR9JywgJHBhY2thZ2UpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IGludmFsaWQga2V5LCBwYWNrYWdlIG5hbWVzIG11c3QgYmUgc3RyaW5ncyBjb250YWluaW5nIG9ubHkgW0EtWmEtejAtOV8uLy1dJzsKfQppZiAoIWlzX3N0cmluZygkY29uc3RyYWludCkpIHsKJHRoaXMtPmVycm9yc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogaW52YWxpZCB2YWx1ZSwgbXVzdCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgdmVyc2lvbiBjb25zdHJhaW50JzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1skbGlua1R5cGVdWyRwYWNrYWdlXSk7Cn0gZWxzZWlmICgnc2VsZi52ZXJzaW9uJyAhPT0gJGNvbnN0cmFpbnQpIHsKdHJ5IHsKJGxpbmtDb25zdHJhaW50ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRsaW5rVHlwZS4nLicuJHBhY2thZ2UuJyA6IGludmFsaWQgdmVyc2lvbiBjb25zdHJhaW50ICgnLiRlLT5nZXRNZXNzYWdlKCkuJyknOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRsaW5rVHlwZV1bJHBhY2thZ2VdKTsKY29udGludWU7Cn0KCgppZiAoCigkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpDSEVDS19VTkJPVU5EX0NPTlNUUkFJTlRTKQomJiAncmVxdWlyZScgPT09ICRsaW5rVHlwZQomJiAkbGlua0NvbnN0cmFpbnQtPm1hdGNoZXMoJHVuYm91bmRDb25zdHJhaW50KQomJiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZSkKKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogdW5ib3VuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICgnLiRjb25zdHJhaW50LicpIHNob3VsZCBiZSBhdm9pZGVkJzsKfSBlbHNlaWYgKAoKKCR0aGlzLT5mbGFncyAmIHNlbGY6OkNIRUNLX1NUUklDVF9DT05TVFJBSU5UUykKJiYgJ3JlcXVpcmUnID09PSAkbGlua1R5cGUKJiYgJGxpbmtDb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludCAmJiBpbl9hcnJheSgkbGlua0NvbnN0cmFpbnQtPmdldE9wZXJhdG9yKCksIFsnPT0nLCAnPSddLCB0cnVlKQomJiAobmV3IENvbnN0cmFpbnQoJz49JywgJzEuMC4wLjAtZGV2JykpLT5tYXRjaGVzKCRsaW5rQ29uc3RyYWludCkKKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJGxpbmtUeXBlLicuJy4kcGFja2FnZS4nIDogZXhhY3QgdmVyc2lvbiBjb25zdHJhaW50cyAoJy4kY29uc3RyYWludC4nKSBzaG91bGQgYmUgYXZvaWRlZCBpZiB0aGUgcGFja2FnZSBmb2xsb3dzIHNlbWFudGljIHZlcnNpb25pbmcnOwp9CgokY29tcGFjdGVkID0gSW50ZXJ2YWxzOjpjb21wYWN0Q29uc3RyYWludCgkbGlua0NvbnN0cmFpbnQpOwppZiAoJGNvbXBhY3RlZCBpbnN0YW5jZW9mIE1hdGNoTm9uZUNvbnN0cmFpbnQpIHsKJHRoaXMtPndhcm5pbmdzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiB0aGlzIHZlcnNpb24gY29uc3RyYWludCBjYW5ub3QgcG9zc2libHkgbWF0Y2ggYW55dGhpbmcgKCcuJGNvbnN0cmFpbnQuJyknOwp9Cn0KCmlmICgkbGlua1R5cGUgPT09ICdjb25mbGljdCcgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1sncmVwbGFjZSddKSAmJiAka2V5cyA9IGFycmF5X2ludGVyc2VjdF9rZXkoJHRoaXMtPmNvbmZpZ1sncmVwbGFjZSddLCAkdGhpcy0+Y29uZmlnWydjb25mbGljdCddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkbGlua1R5cGUuJy4nLiRwYWNrYWdlLicgOiB5b3UgY2Fubm90IGNvbmZsaWN0IHdpdGggYSBwYWNrYWdlIHRoYXQgaXMgYWxzbyByZXBsYWNlZCwgYXMgcmVwbGFjZSBhbHJlYWR5IGNyZWF0ZXMgYW4gaW1wbGljaXQgY29uZmxpY3QgcnVsZSc7CnVuc2V0KCR0aGlzLT5jb25maWdbJGxpbmtUeXBlXVskcGFja2FnZV0pOwp9Cn0KfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3N1Z2dlc3QnKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydzdWdnZXN0J10pKSB7CmZvcmVhY2ggKCR0aGlzLT5jb25maWdbJ3N1Z2dlc3QnXSBhcyAkcGFja2FnZSA9PiAkZGVzY3JpcHRpb24pIHsKaWYgKCFpc19zdHJpbmcoJGRlc2NyaXB0aW9uKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnc3VnZ2VzdC4nLiRwYWNrYWdlLicgOiBpbnZhbGlkIHZhbHVlLCBtdXN0IGJlIGEgc3RyaW5nIGRlc2NyaWJpbmcgd2h5IHRoZSBwYWNrYWdlIGlzIHN1Z2dlc3RlZCc7CnVuc2V0KCR0aGlzLT5jb25maWdbJ3N1Z2dlc3QnXVskcGFja2FnZV0pOwp9Cn0KfQoKaWYgKCR0aGlzLT52YWxpZGF0ZVN0cmluZygnbWluaW11bS1zdGFiaWxpdHknKSAmJiBpc3NldCgkdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKSkgewppZiAoIWlzc2V0KEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1tzdHJ0b2xvd2VyKCR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10pXSkgJiYgJHRoaXMtPmNvbmZpZ1snbWluaW11bS1zdGFiaWxpdHknXSAhPT0gJ1JDJykgewokdGhpcy0+ZXJyb3JzW10gPSAnbWluaW11bS1zdGFiaWxpdHkgOiBpbnZhbGlkIHZhbHVlICgnLiR0aGlzLT5jb25maWdbJ21pbmltdW0tc3RhYmlsaXR5J10uJyksIG11c3QgYmUgb25lIG9mICcuaW1wbG9kZSgnLCAnLCBhcnJheV9rZXlzKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUykpOwp1bnNldCgkdGhpcy0+Y29uZmlnWydtaW5pbXVtLXN0YWJpbGl0eSddKTsKfQp9CgppZiAoJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ2F1dG9sb2FkJykgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1snYXV0b2xvYWQnXSkpIHsKJHR5cGVzID0gWydwc3ItMCcsICdwc3ItNCcsICdjbGFzc21hcCcsICdmaWxlcycsICdleGNsdWRlLWZyb20tY2xhc3NtYXAnXTsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1snYXV0b2xvYWQnXSBhcyAkdHlwZSA9PiAkdHlwZUNvbmZpZykgewppZiAoIWluX2FycmF5KCR0eXBlLCAkdHlwZXMpKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICdhdXRvbG9hZCA6IGludmFsaWQgdmFsdWUgKCcuJHR5cGUuJyksIG11c3QgYmUgb25lIG9mICcuaW1wbG9kZSgnLCAnLCAkdHlwZXMpOwp1bnNldCgkdGhpcy0+Y29uZmlnWydhdXRvbG9hZCddWyR0eXBlXSk7Cn0KaWYgKCR0eXBlID09PSAncHNyLTQnKSB7CmZvcmVhY2ggKCR0eXBlQ29uZmlnIGFzICRuYW1lc3BhY2UgPT4gJGRpcnMpIHsKaWYgKCRuYW1lc3BhY2UgIT09ICcnICYmICdcXCcgIT09IHN1YnN0cigoc3RyaW5nKSAkbmFtZXNwYWNlLCAtMSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJ2F1dG9sb2FkLnBzci00IDogaW52YWxpZCB2YWx1ZSAoJy4kbmFtZXNwYWNlLicpLCBuYW1lc3BhY2VzIG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLCBzaG91bGQgYmUgJy4kbmFtZXNwYWNlLidcXFxcJzsKfQp9Cn0KfQp9CgppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1snYXV0b2xvYWQnXVsncHNyLTQnXSkgJiYgaXNzZXQoJHRoaXMtPmNvbmZpZ1sndGFyZ2V0LWRpciddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAndGFyZ2V0LWRpciA6IHRoaXMgY2FuIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggdGhlIGF1dG9sb2FkLnBzci00IHNldHRpbmcsIHJlbW92ZSB0YXJnZXQtZGlyIHRvIHVwZ3JhZGUgdG8gcHNyLTQnOwoKCnVuc2V0KCR0aGlzLT5jb25maWdbJ2F1dG9sb2FkJ11bJ3Bzci00J10pOwp9Cgpmb3JlYWNoIChbJ3NvdXJjZScsICdkaXN0J10gYXMgJHNyY1R5cGUpIHsKaWYgKCR0aGlzLT52YWxpZGF0ZUFycmF5KCRzcmNUeXBlKSAmJiAhZW1wdHkoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV0pKSB7CmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3R5cGUnXSkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHNyY1R5cGUgLiAnLnR5cGUgOiBtdXN0IGJlIHByZXNlbnQnOwp9CmlmICghaXNzZXQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3VybCddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcudXJsIDogbXVzdCBiZSBwcmVzZW50JzsKfQppZiAoJHNyY1R5cGUgPT09ICdzb3VyY2UnICYmICFpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy5yZWZlcmVuY2UgOiBtdXN0IGJlIHByZXNlbnQnOwp9CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndHlwZSddKSAmJiAhaXNfc3RyaW5nKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd0eXBlJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy50eXBlIDogc2hvdWxkIGJlIGEgc3RyaW5nLCAnLmdldF9kZWJ1Z190eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd0eXBlJ10pLicgZ2l2ZW4nOwp9CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pICYmICFpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3VybCddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcudXJsIDogc2hvdWxkIGJlIGEgc3RyaW5nLCAnLmdldF9kZWJ1Z190eXBlKCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWyd1cmwnXSkuJyBnaXZlbic7Cn0KaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJHNyY1R5cGVdWydyZWZlcmVuY2UnXSkgJiYgIWlzX3N0cmluZygkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pICYmICFpc19pbnQoJHRoaXMtPmNvbmZpZ1skc3JjVHlwZV1bJ3JlZmVyZW5jZSddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkc3JjVHlwZSAuICcucmVmZXJlbmNlIDogc2hvdWxkIGJlIGEgc3RyaW5nIG9yIGludCwgJy5nZXRfZGVidWdfdHlwZSgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pLicgZ2l2ZW4nOwp9CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqLX0nLCAoc3RyaW5nKSAkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy5yZWZlcmVuY2UgOiBtdXN0IG5vdCBzdGFydCB3aXRoIGEgIi0iLCAiJy4kdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsncmVmZXJlbmNlJ10uJyIgZ2l2ZW4nOwp9CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqLX0nLCAoc3RyaW5nKSAkdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10pKSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRzcmNUeXBlIC4gJy51cmwgOiBtdXN0IG5vdCBzdGFydCB3aXRoIGEgIi0iLCAiJy4kdGhpcy0+Y29uZmlnWyRzcmNUeXBlXVsndXJsJ10uJyIgZ2l2ZW4nOwp9Cn0KfQoKCgoKJHRoaXMtPnZhbGlkYXRlRmxhdEFycmF5KCdpbmNsdWRlLXBhdGgnKTsKJHRoaXMtPnZhbGlkYXRlQXJyYXkoJ3RyYW5zcG9ydC1vcHRpb25zJyk7CgoKaWYgKGlzc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddKSkgewppZiAoIWlzX2FycmF5KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddKSkgewokdGhpcy0+ZXJyb3JzW10gPSAnZXh0cmEuYnJhbmNoLWFsaWFzIDogbXVzdCBiZSBhbiBhcnJheSBvZiB2ZXJzaW9ucyA9PiBhbGlhc2VzJzsKfSBlbHNlIHsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ10gYXMgJHNvdXJjZUJyYW5jaCA9PiAkdGFyZ2V0QnJhbmNoKSB7CmlmICghaXNfc3RyaW5nKCR0YXJnZXRCcmFuY2gpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2V4dHJhLmJyYW5jaC1hbGlhcy4nLiRzb3VyY2VCcmFuY2guJyA6IHRoZSB0YXJnZXQgYnJhbmNoICgnLmpzb25fZW5jb2RlKCR0YXJnZXRCcmFuY2gpLicpIG11c3QgYmUgYSBzdHJpbmcsICInLmdldF9kZWJ1Z190eXBlKCR0YXJnZXRCcmFuY2gpLiciIHJlY2VpdmVkLic7CnVuc2V0KCR0aGlzLT5jb25maWdbJ2V4dHJhJ11bJ2JyYW5jaC1hbGlhcyddWyRzb3VyY2VCcmFuY2hdKTsKCmNvbnRpbnVlOwp9CgoKaWYgKCctZGV2JyAhPT0gc3Vic3RyKCR0YXJnZXRCcmFuY2gsIC00KSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICdleHRyYS5icmFuY2gtYWxpYXMuJy4kc291cmNlQnJhbmNoLicgOiB0aGUgdGFyZ2V0IGJyYW5jaCAoJy4kdGFyZ2V0QnJhbmNoLicpIG11c3QgZW5kIGluIC1kZXYnOwp1bnNldCgkdGhpcy0+Y29uZmlnWydleHRyYSddWydicmFuY2gtYWxpYXMnXVskc291cmNlQnJhbmNoXSk7Cgpjb250aW51ZTsKfQoKCiR2YWxpZGF0ZWRUYXJnZXRCcmFuY2ggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKHN1YnN0cigkdGFyZ2V0QnJhbmNoLCAwLCAtNCkpOwppZiAoJy1kZXYnICE9PSBzdWJzdHIoJHZhbGlkYXRlZFRhcmdldEJyYW5jaCwgLTQpKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2V4dHJhLmJyYW5jaC1hbGlhcy4nLiRzb3VyY2VCcmFuY2guJyA6IHRoZSB0YXJnZXQgYnJhbmNoICgnLiR0YXJnZXRCcmFuY2guJykgbXVzdCBiZSBhIHBhcnNlYWJsZSBudW1iZXIgbGlrZSAyLjAtZGV2JzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHNvdXJjZUJyYW5jaF0pOwoKY29udGludWU7Cn0KCgppZiAoKCRzb3VyY2VQcmVmaXggPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+cGFyc2VOdW1lcmljQWxpYXNQcmVmaXgoJHNvdXJjZUJyYW5jaCkpCiYmICgkdGFyZ2V0UHJlZml4ID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlTnVtZXJpY0FsaWFzUHJlZml4KCR0YXJnZXRCcmFuY2gpKQomJiAoc3RyaXBvcygkdGFyZ2V0UHJlZml4LCAkc291cmNlUHJlZml4KSAhPT0gMCkKKSB7CiR0aGlzLT53YXJuaW5nc1tdID0gJ2V4dHJhLmJyYW5jaC1hbGlhcy4nLiRzb3VyY2VCcmFuY2guJyA6IHRoZSB0YXJnZXQgYnJhbmNoICgnLiR0YXJnZXRCcmFuY2guJykgaXMgbm90IGEgdmFsaWQgbnVtZXJpYyBhbGlhcyBmb3IgdGhpcyB2ZXJzaW9uJzsKdW5zZXQoJHRoaXMtPmNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHNvdXJjZUJyYW5jaF0pOwp9Cn0KfQp9CgppZiAoJHRoaXMtPmVycm9ycykgewp0aHJvdyBuZXcgSW52YWxpZFBhY2thZ2VFeGNlcHRpb24oJHRoaXMtPmVycm9ycywgJHRoaXMtPndhcm5pbmdzLCAkY29uZmlnKTsKfQoKJHBhY2thZ2UgPSAkdGhpcy0+bG9hZGVyLT5sb2FkKCR0aGlzLT5jb25maWcsICRjbGFzcyk7CiR0aGlzLT5jb25maWcgPSBbXTsKCnJldHVybiAkcGFja2FnZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFdhcm5pbmdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT53YXJuaW5nczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZXJyb3JzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc1BhY2thZ2VOYW1pbmdFcnJvcihzdHJpbmcgJG5hbWUsIGJvb2wgJGlzTGluayA9IGZhbHNlKTogP3N0cmluZwp7CmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7XlthLXowLTldKD86W18uLV0/W2EtejAtOV0rKykqKy9bYS16MC05XSg/Oig/OltfLl18LXsxLDJ9KT9bYS16MC05XSsrKSorJH1pRCcsICRuYW1lKSkgewpyZXR1cm4gJG5hbWUuJyBpcyBpbnZhbGlkLCBpdCBzaG91bGQgaGF2ZSBhIHZlbmRvciBuYW1lLCBhIGZvcndhcmQgc2xhc2gsIGFuZCBhIHBhY2thZ2UgbmFtZS4gVGhlIHZlbmRvciBhbmQgcGFja2FnZSBuYW1lIGNhbiBiZSB3b3JkcyBzZXBhcmF0ZWQgYnkgLSwgLiBvciBfLiBUaGUgY29tcGxldGUgbmFtZSBzaG91bGQgbWF0Y2ggIl5bYS16MC05XShbXy4tXT9bYS16MC05XSspKi9bYS16MC05XSgoW18uXT98LXswLDJ9KVthLXowLTldKykqJCIuJzsKfQoKJHJlc2VydmVkTmFtZXMgPSBbJ251bCcsICdjb24nLCAncHJuJywgJ2F1eCcsICdjb20xJywgJ2NvbTInLCAnY29tMycsICdjb200JywgJ2NvbTUnLCAnY29tNicsICdjb203JywgJ2NvbTgnLCAnY29tOScsICdscHQxJywgJ2xwdDInLCAnbHB0MycsICdscHQ0JywgJ2xwdDUnLCAnbHB0NicsICdscHQ3JywgJ2xwdDgnLCAnbHB0OSddOwokYml0cyA9IGV4cGxvZGUoJy8nLCBzdHJ0b2xvd2VyKCRuYW1lKSk7CmlmIChpbl9hcnJheSgkYml0c1swXSwgJHJlc2VydmVkTmFtZXMsIHRydWUpIHx8IGluX2FycmF5KCRiaXRzWzFdLCAkcmVzZXJ2ZWROYW1lcywgdHJ1ZSkpIHsKcmV0dXJuICRuYW1lLicgaXMgcmVzZXJ2ZWQsIHBhY2thZ2UgYW5kIHZlbmRvciBuYW1lcyBjYW4gbm90IG1hdGNoIGFueSBvZjogJy5pbXBsb2RlKCcsICcsICRyZXNlcnZlZE5hbWVzKS4nLic7Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7XC5qc29uJH0nLCAkbmFtZSkpIHsKcmV0dXJuICRuYW1lLicgaXMgaW52YWxpZCwgcGFja2FnZSBuYW1lcyBjYW4gbm90IGVuZCBpbiAuanNvbiwgY29uc2lkZXIgcmVuYW1pbmcgaXQgb3IgcGVyaGFwcyB1c2luZyBhIC1qc29uIHN1ZmZpeCBpbnN0ZWFkLic7Cn0KCmlmIChQcmVnOjppc01hdGNoKCd7W0EtWl19JywgJG5hbWUpKSB7CmlmICgkaXNMaW5rKSB7CnJldHVybiAkbmFtZS4nIGlzIGludmFsaWQsIGl0IHNob3VsZCBub3QgY29udGFpbiB1cHBlcmNhc2UgY2hhcmFjdGVycy4gUGxlYXNlIHVzZSAnLnN0cnRvbG93ZXIoJG5hbWUpLicgaW5zdGVhZC4nOwp9Cgokc3VnZ2VzdE5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7KD86KFthLXpdKShbQS1aXSl8KFtBLVpdKShbQS1aXVthLXpdKSl9JywgJ1xcMVxcMy1cXDJcXDQnLCAkbmFtZSk7CiRzdWdnZXN0TmFtZSA9IHN0cnRvbG93ZXIoJHN1Z2dlc3ROYW1lKTsKCnJldHVybiAkbmFtZS4nIGlzIGludmFsaWQsIGl0IHNob3VsZCBub3QgY29udGFpbiB1cHBlcmNhc2UgY2hhcmFjdGVycy4gV2Ugc3VnZ2VzdCB1c2luZyAnLiRzdWdnZXN0TmFtZS4nIGluc3RlYWQuJzsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlUmVnZXgoc3RyaW5nICRwcm9wZXJ0eSwgc3RyaW5nICRyZWdleCwgYm9vbCAkbWFuZGF0b3J5ID0gZmFsc2UpOiBib29sCnsKaWYgKCEkdGhpcy0+dmFsaWRhdGVTdHJpbmcoJHByb3BlcnR5LCAkbWFuZGF0b3J5KSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghUHJlZzo6aXNNYXRjaCgne14nLiRyZWdleC4nJH11JywgJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewokbWVzc2FnZSA9ICRwcm9wZXJ0eS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0uJyksIG11c3QgbWF0Y2ggJy4kcmVnZXg7CmlmICgkbWFuZGF0b3J5KSB7CiR0aGlzLT5lcnJvcnNbXSA9ICRtZXNzYWdlOwp9IGVsc2UgewokdGhpcy0+d2FybmluZ3NbXSA9ICRtZXNzYWdlOwp9CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlU3RyaW5nKHN0cmluZyAkcHJvcGVydHksIGJvb2wgJG1hbmRhdG9yeSA9IGZhbHNlKTogYm9vbAp7CmlmIChpc3NldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pICYmICFpc19zdHJpbmcoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IHNob3VsZCBiZSBhIHN0cmluZywgJy5nZXRfZGVidWdfdHlwZSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkgfHwgdHJpbSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pID09PSAnJykgewppZiAoJG1hbmRhdG9yeSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IG11c3QgYmUgcHJlc2VudCc7Cn0KdW5zZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVBcnJheShzdHJpbmcgJHByb3BlcnR5LCBib29sICRtYW5kYXRvcnkgPSBmYWxzZSk6IGJvb2wKewppZiAoaXNzZXQoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSAmJiAhaXNfYXJyYXkoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJyA6IHNob3VsZCBiZSBhbiBhcnJheSwgJy5nZXRfZGVidWdfdHlwZSgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pLicgZ2l2ZW4nOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkgfHwgIWNvdW50KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSkpIHsKaWYgKCRtYW5kYXRvcnkpIHsKJHRoaXMtPmVycm9yc1tdID0gJHByb3BlcnR5LicgOiBtdXN0IGJlIHByZXNlbnQgYW5kIGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVsZW1lbnQnOwp9CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUZsYXRBcnJheShzdHJpbmcgJHByb3BlcnR5LCA/c3RyaW5nICRyZWdleCA9IG51bGwsIGJvb2wgJG1hbmRhdG9yeSA9IGZhbHNlKTogYm9vbAp7CmlmICghJHRoaXMtPnZhbGlkYXRlQXJyYXkoJHByb3BlcnR5LCAkbWFuZGF0b3J5KSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwYXNzID0gdHJ1ZTsKZm9yZWFjaCAoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICghaXNfc3RyaW5nKCR2YWx1ZSkgJiYgIWlzX251bWVyaWMoJHZhbHVlKSkgewokdGhpcy0+ZXJyb3JzW10gPSAkcHJvcGVydHkuJy4nLiRrZXkuJyA6IG11c3QgYmUgYSBzdHJpbmcgb3IgaW50LCAnLmdldF9kZWJ1Z190eXBlKCR2YWx1ZSkuJyBnaXZlbic7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XVska2V5XSk7CiRwYXNzID0gZmFsc2U7Cgpjb250aW51ZTsKfQoKaWYgKCRyZWdleCAmJiAhUHJlZzo6aXNNYXRjaCgne14nLiRyZWdleC4nJH11JywgKHN0cmluZykgJHZhbHVlKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICRwcm9wZXJ0eS4nLicuJGtleS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kdmFsdWUuJyksIG11c3QgbWF0Y2ggJy4kcmVnZXg7CnVuc2V0KCR0aGlzLT5jb25maWdbJHByb3BlcnR5XVska2V5XSk7CiRwYXNzID0gZmFsc2U7Cn0KfQoKcmV0dXJuICRwYXNzOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlVXJsKHN0cmluZyAkcHJvcGVydHksIGJvb2wgJG1hbmRhdG9yeSA9IGZhbHNlKTogYm9vbAp7CmlmICghJHRoaXMtPnZhbGlkYXRlU3RyaW5nKCRwcm9wZXJ0eSwgJG1hbmRhdG9yeSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoISR0aGlzLT5maWx0ZXJVcmwoJHRoaXMtPmNvbmZpZ1skcHJvcGVydHldKSkgewokdGhpcy0+d2FybmluZ3NbXSA9ICRwcm9wZXJ0eS4nIDogaW52YWxpZCB2YWx1ZSAoJy4kdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0uJyksIG11c3QgYmUgYW4gaHR0cC9odHRwcyBVUkwnOwp1bnNldCgkdGhpcy0+Y29uZmlnWyRwcm9wZXJ0eV0pOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsdGVyVXJsKCR2YWx1ZSwgYXJyYXkgJHNjaGVtZXMgPSBbJ2h0dHAnLCAnaHR0cHMnXSk6IGJvb2wKewppZiAoJHZhbHVlID09PSAnJykgewpyZXR1cm4gdHJ1ZTsKfQoKJGJpdHMgPSBwYXJzZV91cmwoJHZhbHVlKTsKaWYgKGVtcHR5KCRiaXRzWydzY2hlbWUnXSkgfHwgZW1wdHkoJGJpdHNbJ2hvc3QnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWluX2FycmF5KCRiaXRzWydzY2hlbWUnXSwgJHNjaGVtZXMsIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XEluc3RhbGxlZFJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XExvY2tBcnJheVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUm9vdFBhY2thZ2VSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgU2VsZFxKc29uTGludFxQYXJzaW5nRXhjZXB0aW9uOwoKCgoKCgoKY2xhc3MgTG9ja2VyCnsKCnByaXZhdGUgJGxvY2tGaWxlOwoKcHJpdmF0ZSAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKCnByaXZhdGUgJGhhc2g7Cgpwcml2YXRlICRjb250ZW50SGFzaDsKCnByaXZhdGUgJGxvYWRlcjsKCnByaXZhdGUgJGR1bXBlcjsKCnByaXZhdGUgJHByb2Nlc3M7Cgpwcml2YXRlICRsb2NrRGF0YUNhY2hlID0gbnVsbDsKCnByaXZhdGUgJHZpcnR1YWxGaWxlV3JpdHRlbiA9IGZhbHNlOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIEpzb25GaWxlICRsb2NrRmlsZSwgSW5zdGFsbGF0aW9uTWFuYWdlciAkaW5zdGFsbGF0aW9uTWFuYWdlciwgc3RyaW5nICRjb21wb3NlckZpbGVDb250ZW50cywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPmxvY2tGaWxlID0gJGxvY2tGaWxlOwokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlciA9ICRpbnN0YWxsYXRpb25NYW5hZ2VyOwokdGhpcy0+aGFzaCA9IGhhc2goJ21kNScsICRjb21wb3NlckZpbGVDb250ZW50cyk7CiR0aGlzLT5jb250ZW50SGFzaCA9IHNlbGY6OmdldENvbnRlbnRIYXNoKCRjb21wb3NlckZpbGVDb250ZW50cyk7CiR0aGlzLT5sb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSk7CiR0aGlzLT5kdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXIoKTsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRKc29uRmlsZSgpOiBKc29uRmlsZQp7CnJldHVybiAkdGhpcy0+bG9ja0ZpbGU7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRDb250ZW50SGFzaChzdHJpbmcgJGNvbXBvc2VyRmlsZUNvbnRlbnRzKTogc3RyaW5nCnsKJGNvbnRlbnQgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRjb21wb3NlckZpbGVDb250ZW50cywgJ2NvbXBvc2VyLmpzb24nKTsKCiRyZWxldmFudEtleXMgPSBbCiduYW1lJywKJ3ZlcnNpb24nLAoncmVxdWlyZScsCidyZXF1aXJlLWRldicsCidjb25mbGljdCcsCidyZXBsYWNlJywKJ3Byb3ZpZGUnLAonbWluaW11bS1zdGFiaWxpdHknLAoncHJlZmVyLXN0YWJsZScsCidyZXBvc2l0b3JpZXMnLAonZXh0cmEnLApdOwoKJHJlbGV2YW50Q29udGVudCA9IFtdOwoKZm9yZWFjaCAoYXJyYXlfaW50ZXJzZWN0KCRyZWxldmFudEtleXMsIGFycmF5X2tleXMoJGNvbnRlbnQpKSBhcyAka2V5KSB7CiRyZWxldmFudENvbnRlbnRbJGtleV0gPSAkY29udGVudFska2V5XTsKfQppZiAoaXNzZXQoJGNvbnRlbnRbJ2NvbmZpZyddWydwbGF0Zm9ybSddKSkgewokcmVsZXZhbnRDb250ZW50Wydjb25maWcnXVsncGxhdGZvcm0nXSA9ICRjb250ZW50Wydjb25maWcnXVsncGxhdGZvcm0nXTsKfQoKa3NvcnQoJHJlbGV2YW50Q29udGVudCk7CgpyZXR1cm4gaGFzaCgnbWQ1JywgSnNvbkZpbGU6OmVuY29kZSgkcmVsZXZhbnRDb250ZW50LCAwKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0xvY2tlZCgpOiBib29sCnsKaWYgKCEkdGhpcy0+dmlydHVhbEZpbGVXcml0dGVuICYmICEkdGhpcy0+bG9ja0ZpbGUtPmV4aXN0cygpKSB7CnJldHVybiBmYWxzZTsKfQoKJGRhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiBpc3NldCgkZGF0YVsncGFja2FnZXMnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0ZyZXNoKCk6IGJvb2wKewokbG9jayA9ICR0aGlzLT5sb2NrRmlsZS0+cmVhZCgpOwoKaWYgKCFlbXB0eSgkbG9ja1snY29udGVudC1oYXNoJ10pKSB7CgpyZXR1cm4gJHRoaXMtPmNvbnRlbnRIYXNoID09PSAkbG9ja1snY29udGVudC1oYXNoJ107Cn0KCgppZiAoIWVtcHR5KCRsb2NrWydoYXNoJ10pKSB7CnJldHVybiAkdGhpcy0+aGFzaCA9PT0gJGxvY2tbJ2hhc2gnXTsKfQoKCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2tlZFJlcG9zaXRvcnkoYm9vbCAkd2l0aERldlJlcXMgPSBmYWxzZSk6IExvY2tBcnJheVJlcG9zaXRvcnkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKJHBhY2thZ2VzID0gbmV3IExvY2tBcnJheVJlcG9zaXRvcnkoKTsKCiRsb2NrZWRQYWNrYWdlcyA9ICRsb2NrRGF0YVsncGFja2FnZXMnXTsKaWYgKCR3aXRoRGV2UmVxcykgewppZiAoaXNzZXQoJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSkpIHsKJGxvY2tlZFBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJGxvY2tlZFBhY2thZ2VzLCAkbG9ja0RhdGFbJ3BhY2thZ2VzLWRldiddKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgbG9jayBmaWxlIGRvZXMgbm90IGNvbnRhaW4gcmVxdWlyZS1kZXYgaW5mb3JtYXRpb24sIHJ1biBpbnN0YWxsIHdpdGggdGhlIC0tbm8tZGV2IG9wdGlvbiBvciBkZWxldGUgaXQgYW5kIHJ1biBjb21wb3NlciB1cGRhdGUgdG8gZ2VuZXJhdGUgYSBuZXcgbG9jayBmaWxlLicpOwp9Cn0KCmlmIChlbXB0eSgkbG9ja2VkUGFja2FnZXMpKSB7CnJldHVybiAkcGFja2FnZXM7Cn0KCmlmIChpc3NldCgkbG9ja2VkUGFja2FnZXNbMF1bJ25hbWUnXSkpIHsKJHBhY2thZ2VCeU5hbWUgPSBbXTsKZm9yZWFjaCAoJGxvY2tlZFBhY2thZ2VzIGFzICRpbmZvKSB7CiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkaW5mbyk7CiRwYWNrYWdlcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7CiRwYWNrYWdlQnlOYW1lWyRwYWNrYWdlLT5nZXROYW1lKCldID0gJHBhY2thZ2U7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2VCeU5hbWVbJHBhY2thZ2UtPmdldEFsaWFzT2YoKS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KfQoKaWYgKGlzc2V0KCRsb2NrRGF0YVsnYWxpYXNlcyddKSkgewpmb3JlYWNoICgkbG9ja0RhdGFbJ2FsaWFzZXMnXSBhcyAkYWxpYXMpIHsKaWYgKGlzc2V0KCRwYWNrYWdlQnlOYW1lWyRhbGlhc1sncGFja2FnZSddXSkpIHsKJGFsaWFzUGtnID0gbmV3IENvbXBsZXRlQWxpYXNQYWNrYWdlKCRwYWNrYWdlQnlOYW1lWyRhbGlhc1sncGFja2FnZSddXSwgJGFsaWFzWydhbGlhc19ub3JtYWxpemVkJ10sICRhbGlhc1snYWxpYXMnXSk7CiRhbGlhc1BrZy0+c2V0Um9vdFBhY2thZ2VBbGlhcyh0cnVlKTsKJHBhY2thZ2VzLT5hZGRQYWNrYWdlKCRhbGlhc1BrZyk7Cn0KfQp9CgpyZXR1cm4gJHBhY2thZ2VzOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1lvdXIgY29tcG9zZXIubG9jayBpcyBpbnZhbGlkLiBSdW4gImNvbXBvc2VyIHVwZGF0ZSIgdG8gZ2VuZXJhdGUgYSBuZXcgb25lLicpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2UGFja2FnZU5hbWVzKCk6IGFycmF5CnsKJG5hbWVzID0gW107CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwppZiAoaXNzZXQoJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSkpIHsKZm9yZWFjaCAoJGxvY2tEYXRhWydwYWNrYWdlcy1kZXYnXSBhcyAkcGFja2FnZSkgewokbmFtZXNbXSA9IHN0cnRvbG93ZXIoJHBhY2thZ2VbJ25hbWUnXSk7Cn0KfQoKcmV0dXJuICRuYW1lczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsYXRmb3JtUmVxdWlyZW1lbnRzKGJvb2wgJHdpdGhEZXZSZXFzID0gZmFsc2UpOiBhcnJheQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwokcmVxdWlyZW1lbnRzID0gW107CgppZiAoIWVtcHR5KCRsb2NrRGF0YVsncGxhdGZvcm0nXSkpIHsKJHJlcXVpcmVtZW50cyA9ICR0aGlzLT5sb2FkZXItPnBhcnNlTGlua3MoCidfX3Jvb3RfXycsCicxLjAuMCcsCkxpbms6OlRZUEVfUkVRVUlSRSwKJGxvY2tEYXRhWydwbGF0Zm9ybSddID8/IFtdCik7Cn0KCmlmICgkd2l0aERldlJlcXMgJiYgIWVtcHR5KCRsb2NrRGF0YVsncGxhdGZvcm0tZGV2J10pKSB7CiRkZXZSZXF1aXJlbWVudHMgPSAkdGhpcy0+bG9hZGVyLT5wYXJzZUxpbmtzKAonX19yb290X18nLAonMS4wLjAnLApMaW5rOjpUWVBFX1JFUVVJUkUsCiRsb2NrRGF0YVsncGxhdGZvcm0tZGV2J10gPz8gW10KKTsKCiRyZXF1aXJlbWVudHMgPSBhcnJheV9tZXJnZSgkcmVxdWlyZW1lbnRzLCAkZGV2UmVxdWlyZW1lbnRzKTsKfQoKcmV0dXJuICRyZXF1aXJlbWVudHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRNaW5pbXVtU3RhYmlsaXR5KCk6IHN0cmluZwp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsnbWluaW11bS1zdGFiaWxpdHknXSA/PyAnc3RhYmxlJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eUZsYWdzKCk6IGFycmF5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydzdGFiaWxpdHktZmxhZ3MnXSA/PyBbXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlclN0YWJsZSgpOiA/Ym9vbAp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKCgpyZXR1cm4gJGxvY2tEYXRhWydwcmVmZXItc3RhYmxlJ10gPz8gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlckxvd2VzdCgpOiA/Ym9vbAp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKCgpyZXR1cm4gJGxvY2tEYXRhWydwcmVmZXItbG93ZXN0J10gPz8gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsYXRmb3JtT3ZlcnJpZGVzKCk6IGFycmF5CnsKJGxvY2tEYXRhID0gJHRoaXMtPmdldExvY2tEYXRhKCk7CgpyZXR1cm4gJGxvY2tEYXRhWydwbGF0Zm9ybS1vdmVycmlkZXMnXSA/PyBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpOiBhcnJheQp7CiRsb2NrRGF0YSA9ICR0aGlzLT5nZXRMb2NrRGF0YSgpOwoKcmV0dXJuICRsb2NrRGF0YVsnYWxpYXNlcyddID8/IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2luQXBpKCkKewokbG9ja0RhdGEgPSAkdGhpcy0+Z2V0TG9ja0RhdGEoKTsKCnJldHVybiAkbG9ja0RhdGFbJ3BsdWdpbi1hcGktdmVyc2lvbiddID8/ICcxLjEuMCc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMb2NrRGF0YSgpOiBhcnJheQp7CmlmIChudWxsICE9PSAkdGhpcy0+bG9ja0RhdGFDYWNoZSkgewpyZXR1cm4gJHRoaXMtPmxvY2tEYXRhQ2FjaGU7Cn0KCmlmICghJHRoaXMtPmxvY2tGaWxlLT5leGlzdHMoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyBsb2NrZmlsZSBmb3VuZC4gVW5hYmxlIHRvIHJlYWQgbG9ja2VkIHBhY2thZ2VzJyk7Cn0KCnJldHVybiAkdGhpcy0+bG9ja0RhdGFDYWNoZSA9ICR0aGlzLT5sb2NrRmlsZS0+cmVhZCgpOwp9CgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRMb2NrRGF0YShhcnJheSAkcGFja2FnZXMsID9hcnJheSAkZGV2UGFja2FnZXMsIGFycmF5ICRwbGF0Zm9ybVJlcXMsIGFycmF5ICRwbGF0Zm9ybURldlJlcXMsIGFycmF5ICRhbGlhc2VzLCBzdHJpbmcgJG1pbmltdW1TdGFiaWxpdHksIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYm9vbCAkcHJlZmVyU3RhYmxlLCBib29sICRwcmVmZXJMb3dlc3QsIGFycmF5ICRwbGF0Zm9ybU92ZXJyaWRlcywgYm9vbCAkd3JpdGUgPSB0cnVlKTogYm9vbAp7CgoKJGFsaWFzZXMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkYWxpYXMpOiBhcnJheSB7CmlmIChpbl9hcnJheSgkYWxpYXNbJ3ZlcnNpb24nXSwgWydkZXYtbWFzdGVyJywgJ2Rldi10cnVuaycsICdkZXYtZGVmYXVsdCddLCB0cnVlKSkgewokYWxpYXNbJ3ZlcnNpb24nXSA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9CgpyZXR1cm4gJGFsaWFzOwp9LCAkYWxpYXNlcyk7CgokbG9jayA9IFsKJ19yZWFkbWUnID0+IFsnVGhpcyBmaWxlIGxvY2tzIHRoZSBkZXBlbmRlbmNpZXMgb2YgeW91ciBwcm9qZWN0IHRvIGEga25vd24gc3RhdGUnLAonUmVhZCBtb3JlIGFib3V0IGl0IGF0IGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wMS1iYXNpYy11c2FnZS5tZCNpbnN0YWxsaW5nLWRlcGVuZGVuY2llcycsCidUaGlzIGZpbGUgaXMgQGdlbmVyJy4nYXRlZCBhdXRvbWF0aWNhbGx5JywgXSwKJ2NvbnRlbnQtaGFzaCcgPT4gJHRoaXMtPmNvbnRlbnRIYXNoLAoncGFja2FnZXMnID0+ICR0aGlzLT5sb2NrUGFja2FnZXMoJHBhY2thZ2VzKSwKJ3BhY2thZ2VzLWRldicgPT4gbnVsbCwKJ2FsaWFzZXMnID0+ICRhbGlhc2VzLAonbWluaW11bS1zdGFiaWxpdHknID0+ICRtaW5pbXVtU3RhYmlsaXR5LAonc3RhYmlsaXR5LWZsYWdzJyA9PiAkc3RhYmlsaXR5RmxhZ3MsCidwcmVmZXItc3RhYmxlJyA9PiAkcHJlZmVyU3RhYmxlLAoncHJlZmVyLWxvd2VzdCcgPT4gJHByZWZlckxvd2VzdCwKXTsKCmlmIChudWxsICE9PSAkZGV2UGFja2FnZXMpIHsKJGxvY2tbJ3BhY2thZ2VzLWRldiddID0gJHRoaXMtPmxvY2tQYWNrYWdlcygkZGV2UGFja2FnZXMpOwp9CgokbG9ja1sncGxhdGZvcm0nXSA9ICRwbGF0Zm9ybVJlcXM7CiRsb2NrWydwbGF0Zm9ybS1kZXYnXSA9ICRwbGF0Zm9ybURldlJlcXM7CmlmIChcY291bnQoJHBsYXRmb3JtT3ZlcnJpZGVzKSA+IDApIHsKJGxvY2tbJ3BsYXRmb3JtLW92ZXJyaWRlcyddID0gJHBsYXRmb3JtT3ZlcnJpZGVzOwp9CiRsb2NrWydwbHVnaW4tYXBpLXZlcnNpb24nXSA9IFBsdWdpbkludGVyZmFjZTo6UExVR0lOX0FQSV9WRVJTSU9OOwoKJGxvY2sgPSAkdGhpcy0+Zml4dXBKc29uRGF0YVR5cGUoJGxvY2spOwoKdHJ5IHsKJGlzTG9ja2VkID0gJHRoaXMtPmlzTG9ja2VkKCk7Cn0gY2F0Y2ggKFBhcnNpbmdFeGNlcHRpb24gJGUpIHsKJGlzTG9ja2VkID0gZmFsc2U7Cn0KaWYgKCEkaXNMb2NrZWQgfHwgJGxvY2sgIT09ICR0aGlzLT5nZXRMb2NrRGF0YSgpKSB7CmlmICgkd3JpdGUpIHsKJHRoaXMtPmxvY2tGaWxlLT53cml0ZSgkbG9jayk7CiR0aGlzLT5sb2NrRGF0YUNhY2hlID0gbnVsbDsKJHRoaXMtPnZpcnR1YWxGaWxlV3JpdHRlbiA9IGZhbHNlOwp9IGVsc2UgewokdGhpcy0+dmlydHVhbEZpbGVXcml0dGVuID0gdHJ1ZTsKJHRoaXMtPmxvY2tEYXRhQ2FjaGUgPSBKc29uRmlsZTo6cGFyc2VKc29uKEpzb25GaWxlOjplbmNvZGUoJGxvY2spKTsKfQoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXBkYXRlSGFzaChKc29uRmlsZSAkY29tcG9zZXJKc29uLCA/Y2FsbGFibGUgJGRhdGFQcm9jZXNzb3IgPSBudWxsKTogdm9pZAp7CiRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRjb21wb3Nlckpzb24tPmdldFBhdGgoKSk7CmlmIChmYWxzZSA9PT0gJGNvbnRlbnRzKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIHJlYWQgJy4kY29tcG9zZXJKc29uLT5nZXRQYXRoKCkuJyBjb250ZW50cyB0byB1cGRhdGUgdGhlIGxvY2sgZmlsZSBoYXNoLicpOwp9CgokbG9ja010aW1lID0gZmlsZW10aW1lKCR0aGlzLT5sb2NrRmlsZS0+Z2V0UGF0aCgpKTsKJGxvY2tEYXRhID0gJHRoaXMtPmxvY2tGaWxlLT5yZWFkKCk7CiRsb2NrRGF0YVsnY29udGVudC1oYXNoJ10gPSBMb2NrZXI6OmdldENvbnRlbnRIYXNoKCRjb250ZW50cyk7CmlmICgkZGF0YVByb2Nlc3NvciAhPT0gbnVsbCkgewokbG9ja0RhdGEgPSAkZGF0YVByb2Nlc3NvcigkbG9ja0RhdGEpOwp9CgokdGhpcy0+bG9ja0ZpbGUtPndyaXRlKCR0aGlzLT5maXh1cEpzb25EYXRhVHlwZSgkbG9ja0RhdGEpKTsKJHRoaXMtPmxvY2tEYXRhQ2FjaGUgPSBudWxsOwokdGhpcy0+dmlydHVhbEZpbGVXcml0dGVuID0gZmFsc2U7CmlmIChpc19pbnQoJGxvY2tNdGltZSkpIHsKQHRvdWNoKCR0aGlzLT5sb2NrRmlsZS0+Z2V0UGF0aCgpLCAkbG9ja010aW1lKTsKfQp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZpeHVwSnNvbkRhdGFUeXBlKGFycmF5ICRsb2NrRGF0YSk6IGFycmF5CnsKZm9yZWFjaCAoWydzdGFiaWxpdHktZmxhZ3MnLCAncGxhdGZvcm0nLCAncGxhdGZvcm0tZGV2J10gYXMgJGtleSkgewppZiAoaXNzZXQoJGxvY2tEYXRhWyRrZXldKSAmJiBpc19hcnJheSgkbG9ja0RhdGFbJGtleV0pICYmIFxjb3VudCgkbG9ja0RhdGFbJGtleV0pID09PSAwKSB7CiRsb2NrRGF0YVska2V5XSA9IG5ldyBcc3RkQ2xhc3MoKTsKfQp9CgppZiAoaXNfYXJyYXkoJGxvY2tEYXRhWydzdGFiaWxpdHktZmxhZ3MnXSkpIHsKa3NvcnQoJGxvY2tEYXRhWydzdGFiaWxpdHktZmxhZ3MnXSk7Cn0KCnJldHVybiAkbG9ja0RhdGE7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvY2tQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMpOiBhcnJheQp7CiRsb2NrZWQgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCiRuYW1lID0gJHBhY2thZ2UtPmdldFByZXR0eU5hbWUoKTsKJHZlcnNpb24gPSAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwoKaWYgKCEkbmFtZSB8fCAhJHZlcnNpb24pIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKAonUGFja2FnZSAiJXMiIGhhcyBubyB2ZXJzaW9uIG9yIG5hbWUgYW5kIGNhbiBub3QgYmUgbG9ja2VkJywKJHBhY2thZ2UKKSk7Cn0KCiRzcGVjID0gJHRoaXMtPmR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CnVuc2V0KCRzcGVjWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSk7CgoKJHRpbWUgPSAkc3BlY1sndGltZSddID8/IG51bGw7CnVuc2V0KCRzcGVjWyd0aW1lJ10pOwppZiAoJHBhY2thZ2UtPmlzRGV2KCkgJiYgJHBhY2thZ2UtPmdldEluc3RhbGxhdGlvblNvdXJjZSgpID09PSAnc291cmNlJykgewoKJHRpbWUgPSAkdGhpcy0+Z2V0UGFja2FnZVRpbWUoJHBhY2thZ2UpID86ICR0aW1lOwp9CmlmIChudWxsICE9PSAkdGltZSkgewokc3BlY1sndGltZSddID0gJHRpbWU7Cn0KCnVuc2V0KCRzcGVjWydpbnN0YWxsYXRpb24tc291cmNlJ10pOwoKJGxvY2tlZFtdID0gJHNwZWM7Cn0KCnVzb3J0KCRsb2NrZWQsIHN0YXRpYyBmdW5jdGlvbiAoJGEsICRiKSB7CiRjb21wYXJpc29uID0gc3RyY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOwoKaWYgKDAgIT09ICRjb21wYXJpc29uKSB7CnJldHVybiAkY29tcGFyaXNvbjsKfQoKCnJldHVybiBzdHJjbXAoJGFbJ3ZlcnNpb24nXSwgJGJbJ3ZlcnNpb24nXSk7Cn0pOwoKcmV0dXJuICRsb2NrZWQ7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0UGFja2FnZVRpbWUoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6ID9zdHJpbmcKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygncHJvY19vcGVuJykpIHsKcmV0dXJuIG51bGw7Cn0KCiRwYXRoID0gJHRoaXMtPmluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKaWYgKCRwYXRoID09PSBudWxsKSB7CnJldHVybiBudWxsOwp9CiRwYXRoID0gcmVhbHBhdGgoJHBhdGgpOwokc291cmNlVHlwZSA9ICRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCk7CiRkYXRldGltZSA9IG51bGw7CgppZiAoJHBhdGggJiYgaW5fYXJyYXkoJHNvdXJjZVR5cGUsIFsnZ2l0JywgJ2hnJ10pKSB7CiRzb3VyY2VSZWYgPSAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgPzogJHBhY2thZ2UtPmdldERpc3RSZWZlcmVuY2UoKTsKc3dpdGNoICgkc291cmNlVHlwZSkgewpjYXNlICdnaXQnOgpHaXRVdGlsOjpjbGVhbkVudigkdGhpcy0+cHJvY2Vzcyk7CgokY29tbWFuZCA9IEdpdFV0aWw6OmJ1aWxkUmV2TGlzdENvbW1hbmQoJHRoaXMtPnByb2Nlc3MsIGFycmF5X21lcmdlKFsnLW4xJywgJy0tZm9ybWF0PSVjdCcsIChzdHJpbmcpICRzb3VyY2VSZWZdLCBHaXRVdGlsOjpnZXROb1Nob3dTaWduYXR1cmVGbGFncygkdGhpcy0+cHJvY2VzcykpKTsKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkb3V0cHV0LCAkcGF0aCkpIHsKJG91dHB1dCA9IHRyaW0oR2l0VXRpbDo6cGFyc2VSZXZMaXN0T3V0cHV0KCRvdXRwdXQsICR0aGlzLT5wcm9jZXNzKSk7CmlmIChQcmVnOjppc01hdGNoKCd7XlxzKlxkK1xzKiR9JywgJG91dHB1dCkpIHsKJGRhdGV0aW1lID0gbmV3IFxEYXRlVGltZSgnQCcudHJpbSgkb3V0cHV0KSwgbmV3IFxEYXRlVGltZVpvbmUoJ1VUQycpKTsKfQp9CmJyZWFrOwoKY2FzZSAnaGcnOgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICdsb2cnLCAnLS10ZW1wbGF0ZScsICd7ZGF0ZXxoZ2RhdGV9JywgJy1yJywgKHN0cmluZykgJHNvdXJjZVJlZl0sICRvdXRwdXQsICRwYXRoKSAmJiBQcmVnOjppc01hdGNoKCd7XlxzKihcZCspXHMqfScsICRvdXRwdXQsICRtYXRjaCkpIHsKJGRhdGV0aW1lID0gbmV3IFxEYXRlVGltZSgnQCcuJG1hdGNoWzFdLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9CmJyZWFrOwp9Cn0KCnJldHVybiAkZGF0ZXRpbWUgPyAkZGF0ZXRpbWUtPmZvcm1hdChEQVRFX1JGQzMzMzkpIDogbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1pc3NpbmdSZXF1aXJlbWVudEluZm8oUm9vdFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UsIGJvb2wgJGluY2x1ZGVEZXYpOiBhcnJheQp7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvID0gW107CiRtaXNzaW5nUmVxdWlyZW1lbnRzID0gZmFsc2U7CiRzZXRzID0gW1sncmVwbycgPT4gJHRoaXMtPmdldExvY2tlZFJlcG9zaXRvcnkoZmFsc2UpLCAnbWV0aG9kJyA9PiAnZ2V0UmVxdWlyZXMnLCAnZGVzY3JpcHRpb24nID0+ICdSZXF1aXJlZCddXTsKaWYgKCRpbmNsdWRlRGV2ID09PSB0cnVlKSB7CiRzZXRzW10gPSBbJ3JlcG8nID0+ICR0aGlzLT5nZXRMb2NrZWRSZXBvc2l0b3J5KHRydWUpLCAnbWV0aG9kJyA9PiAnZ2V0RGV2UmVxdWlyZXMnLCAnZGVzY3JpcHRpb24nID0+ICdSZXF1aXJlZCAoaW4gcmVxdWlyZS1kZXYpJ107Cn0KJHJvb3RSZXBvID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeShjbG9uZSAkcGFja2FnZSk7Cgpmb3JlYWNoICgkc2V0cyBhcyAkc2V0KSB7CiRpbnN0YWxsZWRSZXBvID0gbmV3IEluc3RhbGxlZFJlcG9zaXRvcnkoWyRzZXRbJ3JlcG8nXSwgJHJvb3RSZXBvXSk7Cgpmb3JlYWNoIChjYWxsX3VzZXJfZnVuYyhbJHBhY2thZ2UsICRzZXRbJ21ldGhvZCddXSkgYXMgJGxpbmspIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpKSkgewpjb250aW51ZTsKfQppZiAoJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSA9PT0gJ3NlbGYudmVyc2lvbicpIHsKY29udGludWU7Cn0KaWYgKCRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZXNXaXRoUmVwbGFjZXJzQW5kUHJvdmlkZXJzKCRsaW5rLT5nZXRUYXJnZXQoKSwgJGxpbmstPmdldENvbnN0cmFpbnQoKSkgPT09IFtdKSB7CiRyZXN1bHRzID0gJGluc3RhbGxlZFJlcG8tPmZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoJGxpbmstPmdldFRhcmdldCgpKTsKCmlmICgkcmVzdWx0cyAhPT0gW10pIHsKJHByb3ZpZGVyID0gcmVzZXQoJHJlc3VsdHMpOwokZGVzY3JpcHRpb24gPSAkcHJvdmlkZXItPmdldFByZXR0eVZlcnNpb24oKTsKaWYgKCRwcm92aWRlci0+Z2V0TmFtZSgpICE9PSAkbGluay0+Z2V0VGFyZ2V0KCkpIHsKZm9yZWFjaCAoWydnZXRSZXBsYWNlcycgPT4gJ3JlcGxhY2VkIGFzICVzIGJ5ICVzJywgJ2dldFByb3ZpZGVzJyA9PiAncHJvdmlkZWQgYXMgJXMgYnkgJXMnXSBhcyAkbWV0aG9kID0+ICR0ZXh0KSB7CmZvcmVhY2ggKGNhbGxfdXNlcl9mdW5jKFskcHJvdmlkZXIsICRtZXRob2RdKSBhcyAkcHJvdmlkZXJMaW5rKSB7CmlmICgkcHJvdmlkZXJMaW5rLT5nZXRUYXJnZXQoKSA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiRkZXNjcmlwdGlvbiA9IHNwcmludGYoJHRleHQsICRwcm92aWRlckxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKSwgJHByb3ZpZGVyLT5nZXRQcmV0dHlOYW1lKCkuJyAnLiRwcm92aWRlci0+Z2V0UHJldHR5VmVyc2lvbigpKTsKYnJlYWsgMjsKfQp9Cn0KfQokbWlzc2luZ1JlcXVpcmVtZW50SW5mb1tdID0gJy0gJyAuICRzZXRbJ2Rlc2NyaXB0aW9uJ10uJyBwYWNrYWdlICInIC4gJGxpbmstPmdldFRhcmdldCgpIC4gJyIgaXMgaW4gdGhlIGxvY2sgZmlsZSBhcyAiJy4kZGVzY3JpcHRpb24uJyIgYnV0IHRoYXQgZG9lcyBub3Qgc2F0aXNmeSB5b3VyIGNvbnN0cmFpbnQgIicuJGxpbmstPmdldFByZXR0eUNvbnN0cmFpbnQoKS4nIi4nOwp9IGVsc2UgewokbWlzc2luZ1JlcXVpcmVtZW50SW5mb1tdID0gJy0gJyAuICRzZXRbJ2Rlc2NyaXB0aW9uJ10uJyBwYWNrYWdlICInIC4gJGxpbmstPmdldFRhcmdldCgpIC4gJyIgaXMgbm90IHByZXNlbnQgaW4gdGhlIGxvY2sgZmlsZS4nOwp9CiRtaXNzaW5nUmVxdWlyZW1lbnRzID0gdHJ1ZTsKfQp9Cn0KCmlmICgkbWlzc2luZ1JlcXVpcmVtZW50cykgewokbWlzc2luZ1JlcXVpcmVtZW50SW5mb1tdID0gJ1RoaXMgdXN1YWxseSBoYXBwZW5zIHdoZW4gY29tcG9zZXIgZmlsZXMgYXJlIGluY29ycmVjdGx5IG1lcmdlZCBvciB0aGUgY29tcG9zZXIuanNvbiBmaWxlIGlzIG1hbnVhbGx5IGVkaXRlZC4nOwokbWlzc2luZ1JlcXVpcmVtZW50SW5mb1tdID0gJ1JlYWQgbW9yZSBhYm91dCBjb3JyZWN0bHkgcmVzb2x2aW5nIG1lcmdlIGNvbmZsaWN0cyBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvcmVzb2x2aW5nLW1lcmdlLWNvbmZsaWN0cy5tZCc7CiRtaXNzaW5nUmVxdWlyZW1lbnRJbmZvW10gPSAnYW5kIHByZWZlciB1c2luZyB0aGUgInJlcXVpcmUiIGNvbW1hbmQgb3ZlciBlZGl0aW5nIHRoZSBjb21wb3Nlci5qc29uIGZpbGUgZGlyZWN0bHkgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jLzAzLWNsaS5tZCNyZXF1aXJlLXInOwp9CgpyZXR1cm4gJG1pc3NpbmdSZXF1aXJlbWVudEluZm87Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcQ29tcG9zZXJNaXJyb3I7CgoKCgoKCgoKCgpjbGFzcyBQYWNrYWdlIGV4dGVuZHMgQmFzZVBhY2thZ2UKewoKcHJvdGVjdGVkICR0eXBlOwoKcHJvdGVjdGVkICR0YXJnZXREaXI7Cgpwcm90ZWN0ZWQgJGluc3RhbGxhdGlvblNvdXJjZTsKCnByb3RlY3RlZCAkc291cmNlVHlwZTsKCnByb3RlY3RlZCAkc291cmNlVXJsOwoKcHJvdGVjdGVkICRzb3VyY2VSZWZlcmVuY2U7Cgpwcm90ZWN0ZWQgJHNvdXJjZU1pcnJvcnM7Cgpwcm90ZWN0ZWQgJGRpc3RUeXBlOwoKcHJvdGVjdGVkICRkaXN0VXJsOwoKcHJvdGVjdGVkICRkaXN0UmVmZXJlbmNlOwoKcHJvdGVjdGVkICRkaXN0U2hhMUNoZWNrc3VtOwoKcHJvdGVjdGVkICRkaXN0TWlycm9yczsKCnByb3RlY3RlZCAkdmVyc2lvbjsKCnByb3RlY3RlZCAkcHJldHR5VmVyc2lvbjsKCnByb3RlY3RlZCAkcmVsZWFzZURhdGU7Cgpwcm90ZWN0ZWQgJGV4dHJhID0gW107Cgpwcm90ZWN0ZWQgJGJpbmFyaWVzID0gW107Cgpwcm90ZWN0ZWQgJGRldjsKCgoKCnByb3RlY3RlZCAkc3RhYmlsaXR5OwoKcHJvdGVjdGVkICRub3RpZmljYXRpb25Vcmw7CgoKcHJvdGVjdGVkICRyZXF1aXJlcyA9IFtdOwoKcHJvdGVjdGVkICRjb25mbGljdHMgPSBbXTsKCnByb3RlY3RlZCAkcHJvdmlkZXMgPSBbXTsKCnByb3RlY3RlZCAkcmVwbGFjZXMgPSBbXTsKCnByb3RlY3RlZCAkZGV2UmVxdWlyZXMgPSBbXTsKCnByb3RlY3RlZCAkc3VnZ2VzdHMgPSBbXTsKCgoKCnByb3RlY3RlZCAkYXV0b2xvYWQgPSBbXTsKCgoKCnByb3RlY3RlZCAkZGV2QXV0b2xvYWQgPSBbXTsKCnByb3RlY3RlZCAkaW5jbHVkZVBhdGhzID0gW107Cgpwcm90ZWN0ZWQgJGlzRGVmYXVsdEJyYW5jaCA9IGZhbHNlOwoKcHJvdGVjdGVkICR0cmFuc3BvcnRPcHRpb25zID0gW107CgoKCgpwcm90ZWN0ZWQgJHBocEV4dCA9IG51bGw7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJHByZXR0eVZlcnNpb24pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSk7CgokdGhpcy0+dmVyc2lvbiA9ICR2ZXJzaW9uOwokdGhpcy0+cHJldHR5VmVyc2lvbiA9ICRwcmV0dHlWZXJzaW9uOwoKJHRoaXMtPnN0YWJpbGl0eSA9IFZlcnNpb25QYXJzZXI6OnBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKTsKJHRoaXMtPmRldiA9ICR0aGlzLT5zdGFiaWxpdHkgPT09ICdkZXYnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXYoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZGV2Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0VHlwZShzdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50eXBlID86ICdsaWJyYXJ5JzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnN0YWJpbGl0eTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFRhcmdldERpcig/c3RyaW5nICR0YXJnZXREaXIpOiB2b2lkCnsKJHRoaXMtPnRhcmdldERpciA9ICR0YXJnZXREaXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYXJnZXREaXIoKTogP3N0cmluZwp7CmlmIChudWxsID09PSAkdGhpcy0+dGFyZ2V0RGlyKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gbHRyaW0oUHJlZzo6cmVwbGFjZSgneyAoPzpefFtcXFxcL10rKSBcLlwuPyAoPzpbXFxcXC9dK3wkKSAoPzpcLlwuPyAoPzpbXFxcXC9dK3wkKSApKn14JywgJy8nLCAkdGhpcy0+dGFyZ2V0RGlyKSwgJy8nKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEV4dHJhKGFycmF5ICRleHRyYSk6IHZvaWQKewokdGhpcy0+ZXh0cmEgPSAkZXh0cmE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRyYSgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZXh0cmE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRCaW5hcmllcyhhcnJheSAkYmluYXJpZXMpOiB2b2lkCnsKJHRoaXMtPmJpbmFyaWVzID0gJGJpbmFyaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmluYXJpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmJpbmFyaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SW5zdGFsbGF0aW9uU291cmNlKD9zdHJpbmcgJHR5cGUpOiB2b2lkCnsKJHRoaXMtPmluc3RhbGxhdGlvblNvdXJjZSA9ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmluc3RhbGxhdGlvblNvdXJjZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZVR5cGUoP3N0cmluZyAkdHlwZSk6IHZvaWQKewokdGhpcy0+c291cmNlVHlwZSA9ICR0eXBlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlVHlwZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2VUeXBlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlVXJsKD9zdHJpbmcgJHVybCk6IHZvaWQKewokdGhpcy0+c291cmNlVXJsID0gJHVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zb3VyY2VVcmw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VSZWZlcmVuY2UgPSAkcmVmZXJlbmNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlUmVmZXJlbmNlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnNvdXJjZVJlZmVyZW5jZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZAp7CiR0aGlzLT5zb3VyY2VNaXJyb3JzID0gJG1pcnJvcnM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VNaXJyb3JzKCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+c291cmNlTWlycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmdldFVybHMoJHRoaXMtPnNvdXJjZVVybCwgJHRoaXMtPnNvdXJjZU1pcnJvcnMsICR0aGlzLT5zb3VyY2VSZWZlcmVuY2UsICR0aGlzLT5zb3VyY2VUeXBlLCAnc291cmNlJyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREaXN0VHlwZSg/c3RyaW5nICR0eXBlKTogdm9pZAp7CiR0aGlzLT5kaXN0VHlwZSA9ICR0eXBlID09PSAnJyA/IG51bGwgOiAkdHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RUeXBlKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmRpc3RUeXBlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFVybCg/c3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmRpc3RVcmwgPSAkdXJsID09PSAnJyA/IG51bGwgOiAkdXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFVybCgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kaXN0VXJsOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFJlZmVyZW5jZSg/c3RyaW5nICRyZWZlcmVuY2UpOiB2b2lkCnsKJHRoaXMtPmRpc3RSZWZlcmVuY2UgPSAkcmVmZXJlbmNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFJlZmVyZW5jZSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kaXN0UmVmZXJlbmNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFNoYTFDaGVja3N1bSg/c3RyaW5nICRzaGExY2hlY2tzdW0pOiB2b2lkCnsKJHRoaXMtPmRpc3RTaGExQ2hlY2tzdW0gPSAkc2hhMWNoZWNrc3VtOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdFNoYTFDaGVja3N1bSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kaXN0U2hhMUNoZWNrc3VtOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdE1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZAp7CiR0aGlzLT5kaXN0TWlycm9ycyA9ICRtaXJyb3JzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdE1pcnJvcnMoKTogP2FycmF5CnsKcmV0dXJuICR0aGlzLT5kaXN0TWlycm9yczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RVcmxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5nZXRVcmxzKCR0aGlzLT5kaXN0VXJsLCAkdGhpcy0+ZGlzdE1pcnJvcnMsICR0aGlzLT5kaXN0UmVmZXJlbmNlLCAkdGhpcy0+ZGlzdFR5cGUsICdkaXN0Jyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnRPcHRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT50cmFuc3BvcnRPcHRpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJhbnNwb3J0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQKewokdGhpcy0+dHJhbnNwb3J0T3B0aW9ucyA9ICRvcHRpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnZlcnNpb247Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJldHR5VmVyc2lvbjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFJlbGVhc2VEYXRlKD9cRGF0ZVRpbWVJbnRlcmZhY2UgJHJlbGVhc2VEYXRlKTogdm9pZAp7CiR0aGlzLT5yZWxlYXNlRGF0ZSA9ICRyZWxlYXNlRGF0ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGVhc2VEYXRlKCk6ID9cRGF0ZVRpbWVJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnJlbGVhc2VEYXRlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXF1aXJlcyhhcnJheSAkcmVxdWlyZXMpOiB2b2lkCnsKaWYgKGlzc2V0KCRyZXF1aXJlc1swXSkpIHsgCiRyZXF1aXJlcyA9ICR0aGlzLT5jb252ZXJ0TGlua3NUb01hcCgkcmVxdWlyZXMsICdzZXRSZXF1aXJlcycpOwp9CgokdGhpcy0+cmVxdWlyZXMgPSAkcmVxdWlyZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXF1aXJlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVxdWlyZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZsaWN0cyhhcnJheSAkY29uZmxpY3RzKTogdm9pZAp7CmlmIChpc3NldCgkY29uZmxpY3RzWzBdKSkgeyAKJGNvbmZsaWN0cyA9ICR0aGlzLT5jb252ZXJ0TGlua3NUb01hcCgkY29uZmxpY3RzLCAnc2V0Q29uZmxpY3RzJyk7Cn0KCiR0aGlzLT5jb25mbGljdHMgPSAkY29uZmxpY3RzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZsaWN0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y29uZmxpY3RzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm92aWRlcyhhcnJheSAkcHJvdmlkZXMpOiB2b2lkCnsKaWYgKGlzc2V0KCRwcm92aWRlc1swXSkpIHsgCiRwcm92aWRlcyA9ICR0aGlzLT5jb252ZXJ0TGlua3NUb01hcCgkcHJvdmlkZXMsICdzZXRQcm92aWRlcycpOwp9CgokdGhpcy0+cHJvdmlkZXMgPSAkcHJvdmlkZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnByb3ZpZGVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBsYWNlcyhhcnJheSAkcmVwbGFjZXMpOiB2b2lkCnsKaWYgKGlzc2V0KCRyZXBsYWNlc1swXSkpIHsgCiRyZXBsYWNlcyA9ICR0aGlzLT5jb252ZXJ0TGlua3NUb01hcCgkcmVwbGFjZXMsICdzZXRSZXBsYWNlcycpOwp9CgokdGhpcy0+cmVwbGFjZXMgPSAkcmVwbGFjZXM7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwbGFjZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcGxhY2VzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZSZXF1aXJlcyhhcnJheSAkZGV2UmVxdWlyZXMpOiB2b2lkCnsKaWYgKGlzc2V0KCRkZXZSZXF1aXJlc1swXSkpIHsgCiRkZXZSZXF1aXJlcyA9ICR0aGlzLT5jb252ZXJ0TGlua3NUb01hcCgkZGV2UmVxdWlyZXMsICdzZXREZXZSZXF1aXJlcycpOwp9CgokdGhpcy0+ZGV2UmVxdWlyZXMgPSAkZGV2UmVxdWlyZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZSZXF1aXJlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZGV2UmVxdWlyZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN1Z2dlc3RzKGFycmF5ICRzdWdnZXN0cyk6IHZvaWQKewokdGhpcy0+c3VnZ2VzdHMgPSAkc3VnZ2VzdHM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdWdnZXN0cygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3VnZ2VzdHM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b2xvYWQoYXJyYXkgJGF1dG9sb2FkKTogdm9pZAp7CiR0aGlzLT5hdXRvbG9hZCA9ICRhdXRvbG9hZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dG9sb2FkKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hdXRvbG9hZDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZBdXRvbG9hZChhcnJheSAkZGV2QXV0b2xvYWQpOiB2b2lkCnsKJHRoaXMtPmRldkF1dG9sb2FkID0gJGRldkF1dG9sb2FkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2QXV0b2xvYWQoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmRldkF1dG9sb2FkOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbmNsdWRlUGF0aHMoYXJyYXkgJGluY2x1ZGVQYXRocyk6IHZvaWQKewokdGhpcy0+aW5jbHVkZVBhdGhzID0gJGluY2x1ZGVQYXRoczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRocygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+aW5jbHVkZVBhdGhzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UGhwRXh0KD9hcnJheSAkcGhwRXh0KTogdm9pZAp7CiR0aGlzLT5waHBFeHQgPSAkcGhwRXh0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGhwRXh0KCk6ID9hcnJheQp7CnJldHVybiAkdGhpcy0+cGhwRXh0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Tm90aWZpY2F0aW9uVXJsKHN0cmluZyAkbm90aWZpY2F0aW9uVXJsKTogdm9pZAp7CiR0aGlzLT5ub3RpZmljYXRpb25VcmwgPSAkbm90aWZpY2F0aW9uVXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm90aWZpY2F0aW9uVXJsKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5vdGlmaWNhdGlvblVybDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldElzRGVmYXVsdEJyYW5jaChib29sICRkZWZhdWx0QnJhbmNoKTogdm9pZAp7CiR0aGlzLT5pc0RlZmF1bHRCcmFuY2ggPSAkZGVmYXVsdEJyYW5jaDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVmYXVsdEJyYW5jaCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5pc0RlZmF1bHRCcmFuY2g7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VEaXN0UmVmZXJlbmNlcyhzdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQKewokdGhpcy0+c2V0U291cmNlUmVmZXJlbmNlKCRyZWZlcmVuY2UpOwoKCgppZiAoCiR0aGlzLT5nZXREaXN0VXJsKCkgIT09IG51bGwKJiYgUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzooPzp3d3dcLik/Yml0YnVja2V0XC5vcmd8KGFwaVwuKT9naXRodWJcLmNvbXwoPzp3d3dcLik/Z2l0bGFiXC5jb20pL31pJywgJHRoaXMtPmdldERpc3RVcmwoKSkKKSB7CiR0aGlzLT5zZXREaXN0UmVmZXJlbmNlKCRyZWZlcmVuY2UpOwokdGhpcy0+c2V0RGlzdFVybChQcmVnOjpyZXBsYWNlKCd7KD88PS98c2hhPSlbYS1mMC05XXs0MH0oPz0vfCQpfWknLCAkcmVmZXJlbmNlLCAkdGhpcy0+Z2V0RGlzdFVybCgpKSk7Cn0gZWxzZWlmICgkdGhpcy0+Z2V0RGlzdFJlZmVyZW5jZSgpKSB7IAokdGhpcy0+c2V0RGlzdFJlZmVyZW5jZSgkcmVmZXJlbmNlKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VWZXJzaW9uKHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRwcmV0dHlWZXJzaW9uKTogdm9pZAp7CiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT5wcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CgokdGhpcy0+c3RhYmlsaXR5ID0gVmVyc2lvblBhcnNlcjo6cGFyc2VTdGFiaWxpdHkoJHZlcnNpb24pOwokdGhpcy0+ZGV2ID0gJHRoaXMtPnN0YWJpbGl0eSA9PT0gJ2Rldic7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VXJscyg/c3RyaW5nICR1cmwsID9hcnJheSAkbWlycm9ycywgP3N0cmluZyAkcmVmLCA/c3RyaW5nICR0eXBlLCBzdHJpbmcgJHVybFR5cGUpOiBhcnJheQp7CmlmICghJHVybCkgewpyZXR1cm4gW107Cn0KCmlmICgkdXJsVHlwZSA9PT0gJ2Rpc3QnICYmIGZhbHNlICE9PSBzdHJwb3MoJHVybCwgJyUnKSkgewokdXJsID0gQ29tcG9zZXJNaXJyb3I6OnByb2Nlc3NVcmwoJHVybCwgJHRoaXMtPm5hbWUsICR0aGlzLT52ZXJzaW9uLCAkcmVmLCAkdHlwZSwgJHRoaXMtPnByZXR0eVZlcnNpb24pOwp9CgokdXJscyA9IFskdXJsXTsKaWYgKCRtaXJyb3JzKSB7CmZvcmVhY2ggKCRtaXJyb3JzIGFzICRtaXJyb3IpIHsKaWYgKCR1cmxUeXBlID09PSAnZGlzdCcpIHsKJG1pcnJvclVybCA9IENvbXBvc2VyTWlycm9yOjpwcm9jZXNzVXJsKCRtaXJyb3JbJ3VybCddLCAkdGhpcy0+bmFtZSwgJHRoaXMtPnZlcnNpb24sICRyZWYsICR0eXBlLCAkdGhpcy0+cHJldHR5VmVyc2lvbik7Cn0gZWxzZWlmICgkdXJsVHlwZSA9PT0gJ3NvdXJjZScgJiYgJHR5cGUgPT09ICdnaXQnKSB7CiRtaXJyb3JVcmwgPSBDb21wb3Nlck1pcnJvcjo6cHJvY2Vzc0dpdFVybCgkbWlycm9yWyd1cmwnXSwgJHRoaXMtPm5hbWUsICR1cmwsICR0eXBlKTsKfSBlbHNlaWYgKCR1cmxUeXBlID09PSAnc291cmNlJyAmJiAkdHlwZSA9PT0gJ2hnJykgewokbWlycm9yVXJsID0gQ29tcG9zZXJNaXJyb3I6OnByb2Nlc3NIZ1VybCgkbWlycm9yWyd1cmwnXSwgJHRoaXMtPm5hbWUsICR1cmwsICR0eXBlKTsKfSBlbHNlIHsKY29udGludWU7Cn0KaWYgKCFcaW5fYXJyYXkoJG1pcnJvclVybCwgJHVybHMpKSB7CiRmdW5jID0gJG1pcnJvclsncHJlZmVycmVkJ10gPyAnYXJyYXlfdW5zaGlmdCcgOiAnYXJyYXlfcHVzaCc7CiRmdW5jKCR1cmxzLCAkbWlycm9yVXJsKTsKfQp9Cn0KCnJldHVybiAkdXJsczsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gY29udmVydExpbmtzVG9NYXAoYXJyYXkgJGxpbmtzLCBzdHJpbmcgJHNvdXJjZSk6IGFycmF5CnsKdHJpZ2dlcl9lcnJvcignUGFja2FnZTo6Jy4kc291cmNlLicgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIG1hcCBvZiBsb3dlcmNhc2VkIHBhY2thZ2UgbmFtZSA9PiBMaW5rIG9iamVjdCwgZ290IGEgaW5kZXhlZCBhcnJheSwgdGhpcyBpcyBkZXByZWNhdGVkIGFuZCB5b3Ugc2hvdWxkIGZpeCB5b3VyIHVzYWdlLicpOwokbmV3TGlua3MgPSBbXTsKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiRuZXdMaW5rc1skbGluay0+Z2V0VGFyZ2V0KCldID0gJGxpbms7Cn0KCnJldHVybiAkbmV3TGlua3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCmludGVyZmFjZSBQYWNrYWdlSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IERJU1BMQVlfU09VUkNFX1JFRl9JRl9ERVYgPSAwOwpwdWJsaWMgY29uc3QgRElTUExBWV9TT1VSQ0VfUkVGID0gMTsKcHVibGljIGNvbnN0IERJU1BMQVlfRElTVF9SRUYgPSAyOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKCk6IHN0cmluZzsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZXMoYm9vbCAkcHJvdmlkZXMgPSB0cnVlKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWQoaW50ICRpZCk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZCgpOiBpbnQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXYoKTogYm9vbDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0RGlyKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRyYSgpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnN0YWxsYXRpb25Tb3VyY2UoP3N0cmluZyAkdHlwZSk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uU291cmNlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VUeXBlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VVcmwoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZVVybHMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2VSZWZlcmVuY2UoKTogP3N0cmluZzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZU1pcnJvcnMoKTogP2FycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFNvdXJjZU1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3RUeXBlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJsKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0VXJscygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0UmVmZXJlbmNlKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0U2hhMUNoZWNrc3VtKCk6ID9zdHJpbmc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0TWlycm9ycygpOiA/YXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdE1pcnJvcnMoP2FycmF5ICRtaXJyb3JzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigpOiBzdHJpbmc7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGdWxsUHJldHR5VmVyc2lvbihib29sICR0cnVuY2F0ZSA9IHRydWUsIGludCAkZGlzcGxheU1vZGUgPSBzZWxmOjpESVNQTEFZX1NPVVJDRV9SRUZfSUZfREVWKTogc3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlbGVhc2VEYXRlKCk6ID9cRGF0ZVRpbWVJbnRlcmZhY2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHkoKTogc3RyaW5nOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVpcmVzKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZsaWN0cygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBsYWNlcygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZSZXF1aXJlcygpOiBhcnJheTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3VnZ2VzdHMoKTogYXJyYXk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBdXRvbG9hZCgpOiBhcnJheTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldkF1dG9sb2FkKCk6IGFycmF5OwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEluY2x1ZGVQYXRocygpOiBhcnJheTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQaHBFeHQoKTogP2FycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeSgpOiA/UmVwb3NpdG9yeUludGVyZmFjZTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJpbmFyaWVzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVuaXF1ZU5hbWUoKTogc3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5vdGlmaWNhdGlvblVybCgpOiA/c3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nOwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZXR0eVN0cmluZygpOiBzdHJpbmc7CgpwdWJsaWMgZnVuY3Rpb24gaXNEZWZhdWx0QnJhbmNoKCk6IGJvb2w7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnRPcHRpb25zKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VHJhbnNwb3J0T3B0aW9ucyhhcnJheSAkb3B0aW9ucyk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0U291cmNlUmVmZXJlbmNlKD9zdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQ7CgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlzdFVybCg/c3RyaW5nICR1cmwpOiB2b2lkOwoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RUeXBlKD9zdHJpbmcgJHR5cGUpOiB2b2lkOwoKcHVibGljIGZ1bmN0aW9uIHNldERpc3RSZWZlcmVuY2UoP3N0cmluZyAkcmVmZXJlbmNlKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTb3VyY2VEaXN0UmVmZXJlbmNlcyhzdHJpbmcgJHJlZmVyZW5jZSk6IHZvaWQ7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2U7CgoKCgpjbGFzcyBSb290QWxpYXNQYWNrYWdlIGV4dGVuZHMgQ29tcGxldGVBbGlhc1BhY2thZ2UgaW1wbGVtZW50cyBSb290UGFja2FnZUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGFsaWFzT2Y7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJvb3RQYWNrYWdlICRhbGlhc09mLCBzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkcHJldHR5VmVyc2lvbikKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRhbGlhc09mLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNPZigpCnsKcmV0dXJuICR0aGlzLT5hbGlhc09mOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QWxpYXNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0QWxpYXNlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldE1pbmltdW1TdGFiaWxpdHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eUZsYWdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRTdGFiaWxpdHlGbGFncygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+YWxpYXNPZi0+Z2V0UmVmZXJlbmNlcygpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJlZmVyU3RhYmxlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmFsaWFzT2YtPmdldFByZWZlclN0YWJsZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5hbGlhc09mLT5nZXRDb25maWcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFJlcXVpcmVzKGFycmF5ICRyZXF1aXJlcyk6IHZvaWQKewokdGhpcy0+cmVxdWlyZXMgPSAkdGhpcy0+cmVwbGFjZVNlbGZWZXJzaW9uRGVwZW5kZW5jaWVzKCRyZXF1aXJlcywgTGluazo6VFlQRV9SRVFVSVJFKTsKCiR0aGlzLT5hbGlhc09mLT5zZXRSZXF1aXJlcygkcmVxdWlyZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGV2UmVxdWlyZXMoYXJyYXkgJGRldlJlcXVpcmVzKTogdm9pZAp7CiR0aGlzLT5kZXZSZXF1aXJlcyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJGRldlJlcXVpcmVzLCBMaW5rOjpUWVBFX0RFVl9SRVFVSVJFKTsKCiR0aGlzLT5hbGlhc09mLT5zZXREZXZSZXF1aXJlcygkZGV2UmVxdWlyZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmxpY3RzKGFycmF5ICRjb25mbGljdHMpOiB2b2lkCnsKJHRoaXMtPmNvbmZsaWN0cyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJGNvbmZsaWN0cywgTGluazo6VFlQRV9DT05GTElDVCk7CiR0aGlzLT5hbGlhc09mLT5zZXRDb25mbGljdHMoJGNvbmZsaWN0cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm92aWRlcyhhcnJheSAkcHJvdmlkZXMpOiB2b2lkCnsKJHRoaXMtPnByb3ZpZGVzID0gJHRoaXMtPnJlcGxhY2VTZWxmVmVyc2lvbkRlcGVuZGVuY2llcygkcHJvdmlkZXMsIExpbms6OlRZUEVfUFJPVklERSk7CiR0aGlzLT5hbGlhc09mLT5zZXRQcm92aWRlcygkcHJvdmlkZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwbGFjZXMoYXJyYXkgJHJlcGxhY2VzKTogdm9pZAp7CiR0aGlzLT5yZXBsYWNlcyA9ICR0aGlzLT5yZXBsYWNlU2VsZlZlcnNpb25EZXBlbmRlbmNpZXMoJHJlcGxhY2VzLCBMaW5rOjpUWVBFX1JFUExBQ0UpOwokdGhpcy0+YWxpYXNPZi0+c2V0UmVwbGFjZXMoJHJlcGxhY2VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9sb2FkKGFycmF5ICRhdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0QXV0b2xvYWQoJGF1dG9sb2FkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldkF1dG9sb2FkKGFycmF5ICRkZXZBdXRvbG9hZCk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0RGV2QXV0b2xvYWQoJGRldkF1dG9sb2FkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN0YWJpbGl0eUZsYWdzKGFycmF5ICRzdGFiaWxpdHlGbGFncyk6IHZvaWQKewokdGhpcy0+YWxpYXNPZi0+c2V0U3RhYmlsaXR5RmxhZ3MoJHN0YWJpbGl0eUZsYWdzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1pbmltdW1TdGFiaWxpdHkoc3RyaW5nICRtaW5pbXVtU3RhYmlsaXR5KTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRNaW5pbXVtU3RhYmlsaXR5KCRtaW5pbXVtU3RhYmlsaXR5KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclN0YWJsZShib29sICRwcmVmZXJTdGFibGUpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldFByZWZlclN0YWJsZSgkcHJlZmVyU3RhYmxlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvbmZpZyhhcnJheSAkY29uZmlnKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRDb25maWcoJGNvbmZpZyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZWZlcmVuY2VzKGFycmF5ICRyZWZlcmVuY2VzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRSZWZlcmVuY2VzKCRyZWZlcmVuY2VzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzT2YtPnNldEFsaWFzZXMoJGFsaWFzZXMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3VnZ2VzdHMoYXJyYXkgJHN1Z2dlc3RzKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRTdWdnZXN0cygkc3VnZ2VzdHMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXh0cmEoYXJyYXkgJGV4dHJhKTogdm9pZAp7CiR0aGlzLT5hbGlhc09mLT5zZXRFeHRyYSgkZXh0cmEpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKcGFyZW50OjpfX2Nsb25lKCk7CiR0aGlzLT5hbGlhc09mID0gY2xvbmUgJHRoaXMtPmFsaWFzT2Y7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCgoKY2xhc3MgUm9vdFBhY2thZ2UgZXh0ZW5kcyBDb21wbGV0ZVBhY2thZ2UgaW1wbGVtZW50cyBSb290UGFja2FnZUludGVyZmFjZQp7CnB1YmxpYyBjb25zdCBERUZBVUxUX1BSRVRUWV9WRVJTSU9OID0gJzEuMC4wK25vLXZlcnNpb24tc2V0JzsKCgpwcm90ZWN0ZWQgJG1pbmltdW1TdGFiaWxpdHkgPSAnc3RhYmxlJzsKCnByb3RlY3RlZCAkcHJlZmVyU3RhYmxlID0gZmFsc2U7Cgpwcm90ZWN0ZWQgJHN0YWJpbGl0eUZsYWdzID0gW107Cgpwcm90ZWN0ZWQgJGNvbmZpZyA9IFtdOwoKcHJvdGVjdGVkICRyZWZlcmVuY2VzID0gW107Cgpwcm90ZWN0ZWQgJGFsaWFzZXMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNaW5pbXVtU3RhYmlsaXR5KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSk6IHZvaWQKewokdGhpcy0+bWluaW11bVN0YWJpbGl0eSA9ICRtaW5pbXVtU3RhYmlsaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm1pbmltdW1TdGFiaWxpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdGFiaWxpdHlGbGFncyhhcnJheSAkc3RhYmlsaXR5RmxhZ3MpOiB2b2lkCnsKJHRoaXMtPnN0YWJpbGl0eUZsYWdzID0gJHN0YWJpbGl0eUZsYWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhYmlsaXR5RmxhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnN0YWJpbGl0eUZsYWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UHJlZmVyU3RhYmxlKGJvb2wgJHByZWZlclN0YWJsZSk6IHZvaWQKewokdGhpcy0+cHJlZmVyU3RhYmxlID0gJHByZWZlclN0YWJsZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlclN0YWJsZSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5wcmVmZXJTdGFibGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoYXJyYXkgJGNvbmZpZyk6IHZvaWQKewokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbmZpZygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVmZXJlbmNlcyhhcnJheSAkcmVmZXJlbmNlcyk6IHZvaWQKewokdGhpcy0+cmVmZXJlbmNlcyA9ICRyZWZlcmVuY2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVmZXJlbmNlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVmZXJlbmNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoYXJyYXkgJGFsaWFzZXMpOiB2b2lkCnsKJHRoaXMtPmFsaWFzZXMgPSAkYWxpYXNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFsaWFzZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZTsKCgoKCgoKCgoKCgppbnRlcmZhY2UgUm9vdFBhY2thZ2VJbnRlcmZhY2UgZXh0ZW5kcyBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbGlhc2VzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWluaW11bVN0YWJpbGl0eSgpOiBzdHJpbmc7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YWJpbGl0eUZsYWdzKCk6IGFycmF5OwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZWZlcmVuY2VzKCk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByZWZlclN0YWJsZSgpOiBib29sOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVxdWlyZXMoYXJyYXkgJHJlcXVpcmVzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldlJlcXVpcmVzKGFycmF5ICRkZXZSZXF1aXJlcyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25mbGljdHMoYXJyYXkgJGNvbmZsaWN0cyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm92aWRlcyhhcnJheSAkcHJvdmlkZXMpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVwbGFjZXMoYXJyYXkgJHJlcGxhY2VzKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvbG9hZChhcnJheSAkYXV0b2xvYWQpOiB2b2lkOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldkF1dG9sb2FkKGFycmF5ICRkZXZBdXRvbG9hZCk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdGFiaWxpdHlGbGFncyhhcnJheSAkc3RhYmlsaXR5RmxhZ3MpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TWluaW11bVN0YWJpbGl0eShzdHJpbmcgJG1pbmltdW1TdGFiaWxpdHkpOiB2b2lkOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByZWZlclN0YWJsZShib29sICRwcmVmZXJTdGFibGUpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKGFycmF5ICRjb25maWcpOiB2b2lkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVmZXJlbmNlcyhhcnJheSAkcmVmZXJlbmNlcyk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBbGlhc2VzKGFycmF5ICRhbGlhc2VzKTogdm9pZDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN1Z2dlc3RzKGFycmF5ICRzdWdnZXN0cyk6IHZvaWQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RXh0cmEoYXJyYXkgJGV4dHJhKTogdm9pZDsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CgoKCgpjbGFzcyBTdGFiaWxpdHlGaWx0ZXIKewoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNQYWNrYWdlQWNjZXB0YWJsZShhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRuYW1lcywgc3RyaW5nICRzdGFiaWxpdHkpOiBib29sCnsKZm9yZWFjaCAoJG5hbWVzIGFzICRuYW1lKSB7CgppZiAoaXNzZXQoJHN0YWJpbGl0eUZsYWdzWyRuYW1lXSkpIHsKaWYgKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skc3RhYmlsaXR5XSA8PSAkc3RhYmlsaXR5RmxhZ3NbJG5hbWVdKSB7CnJldHVybiB0cnVlOwp9Cn0gZWxzZWlmIChpc3NldCgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzWyRzdGFiaWxpdHldKSkgewoKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxTZW12ZXJcSW50ZXJ2YWxzOwp1c2UgQ29tcG9zZXJcVXRpbFxQbGF0Zm9ybTsKCgoKCgpjbGFzcyBWZXJzaW9uQnVtcGVyCnsKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYnVtcFJlcXVpcmVtZW50KENvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsIFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiBzdHJpbmcKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKJHByZXR0eUNvbnN0cmFpbnQgPSAkY29uc3RyYWludC0+Z2V0UHJldHR5U3RyaW5nKCk7CmlmIChzdHJfc3RhcnRzX3dpdGgoJGNvbnN0cmFpbnQtPmdldFByZXR0eVN0cmluZygpLCAnZGV2LScpKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKJHZlcnNpb24gPSAkcGFja2FnZS0+Z2V0VmVyc2lvbigpOwppZiAoc3RyX3N0YXJ0c193aXRoKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICdkZXYtJykpIHsKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigkcGFyc2VyKTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwokZXh0cmEgPSAkbG9hZGVyLT5nZXRCcmFuY2hBbGlhcygkZHVtcGVyLT5kdW1wKCRwYWNrYWdlKSk7CgoKaWYgKG51bGwgPT09ICRleHRyYSB8fCAkZXh0cmEgPT09IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTKSB7CnJldHVybiAkcHJldHR5Q29uc3RyYWludDsKfQoKJHZlcnNpb24gPSAkZXh0cmE7Cn0KCiRpbnRlcnZhbHMgPSBJbnRlcnZhbHM6OmdldCgkY29uc3RyYWludCk7CgoKaWYgKFxjb3VudCgkaW50ZXJ2YWxzWydicmFuY2hlcyddWyduYW1lcyddKSA+IDApIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgokbWFqb3IgPSBQcmVnOjpyZXBsYWNlKCd7XihbMS05XVswLTldKnwwXC5cZCspLip9JywgJyQxJywgJHZlcnNpb24pOwokdmVyc2lvbldpdGhvdXRTdWZmaXggPSBQcmVnOjpyZXBsYWNlKCd7KD86XC4oPzowfDk5OTk5OTkpKSsoLWRldik/JH0nLCAnJywgJHZlcnNpb24pOwokbmV3UHJldHR5Q29uc3RyYWludCA9ICdeJy4kdmVyc2lvbldpdGhvdXRTdWZmaXg7CgoKaWYgKCFQcmVnOjppc01hdGNoKCd7XlxeXGQrKFwuXGQrKSokfScsICRuZXdQcmV0dHlDb25zdHJhaW50KSkgewpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KCiRwYXR0ZXJuID0gJ3sKICAgICAgICAgICAgKD88PSx8XCB8XHx8XikgIyBsZWFkaW5nIHNlcGFyYXRvcgogICAgICAgICAgICAoP1A8Y29uc3RyYWludD4KICAgICAgICAgICAgICAgIFxedj8nLiRtYWpvci4nKD86XC5cZCspKiAjIGUuZy4gXjIuYW55dGhpbmcKICAgICAgICAgICAgICAgIHwgfnY/Jy4kbWFqb3IuJyg/OlwuXGQrKXsxLDN9ICMgZS5nLiB+Mi4yIG9yIH4yLjIuMiBvciB+Mi4yLjIuMgogICAgICAgICAgICAgICAgfCB2PycuJG1ham9yLicoPzpcLlsqeF0pKyAjIGUuZy4gMi4qIG9yIDIuKi4qIG9yIDIueC54LnggZXRjCiAgICAgICAgICAgICAgICB8ID49dj9cZCg/OlwuXGQrKSogIyBlLmcuID49MiBvciA+PTEuMiBldGMKICAgICAgICAgICAgICAgIHwgXCogIyBmdWxsIHdpbGRjYXJkCiAgICAgICAgICAgICkKICAgICAgICAgICAgKD89LHwkfFwgfFx8fEApICMgdHJhaWxpbmcgc2VwYXJhdG9yCiAgICAgICAgfXgnOwppZiAoUHJlZzo6aXNNYXRjaEFsbFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkcHJldHR5Q29uc3RyYWludCwgJG1hdGNoZXMpKSB7CiRtb2RpZmllZCA9ICRwcmV0dHlDb25zdHJhaW50Owpmb3JlYWNoIChhcnJheV9yZXZlcnNlKCRtYXRjaGVzWydjb25zdHJhaW50J10pIGFzICRtYXRjaCkgewphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaFswXSkpOwokc3VmZml4ID0gJyc7CmlmIChzdWJzdHJfY291bnQoJG1hdGNoWzBdLCAnLicpID09PSAyICYmIHN1YnN0cl9jb3VudCgkdmVyc2lvbldpdGhvdXRTdWZmaXgsICcuJykgPT09IDEpIHsKJHN1ZmZpeCA9ICcuMCc7Cn0KaWYgKHN0cl9zdGFydHNfd2l0aCgkbWF0Y2hbMF0sICd+JykgJiYgc3Vic3RyX2NvdW50KCRtYXRjaFswXSwgJy4nKSAhPT0gMSkgewoKJHZlcnNpb25CaXRzID0gZXhwbG9kZSgnLicsICR2ZXJzaW9uV2l0aG91dFN1ZmZpeCk7CiR2ZXJzaW9uQml0cyA9IGFycmF5X3BhZCgkdmVyc2lvbkJpdHMsIHN1YnN0cl9jb3VudCgkbWF0Y2hbMF0sICcuJykgKyAxLCAnMCcpOwokcmVwbGFjZW1lbnQgPSAnficuaW1wbG9kZSgnLicsIGFycmF5X3NsaWNlKCR2ZXJzaW9uQml0cywgMCwgc3Vic3RyX2NvdW50KCRtYXRjaFswXSwgJy4nKSArIDEpKTsKfSBlbHNlaWYgKCRtYXRjaFswXSA9PT0gJyonIHx8IHN0cl9zdGFydHNfd2l0aCgkbWF0Y2hbMF0sICc+PScpKSB7CiRyZXBsYWNlbWVudCA9ICc+PScuJHZlcnNpb25XaXRob3V0U3VmZml4LiRzdWZmaXg7Cn0gZWxzZSB7CiRyZXBsYWNlbWVudCA9ICRuZXdQcmV0dHlDb25zdHJhaW50LiRzdWZmaXg7Cn0KJG1vZGlmaWVkID0gc3Vic3RyX3JlcGxhY2UoJG1vZGlmaWVkLCAkcmVwbGFjZW1lbnQsICRtYXRjaFsxXSwgUGxhdGZvcm06OnN0cmxlbigkbWF0Y2hbMF0pKTsKfQoKCiRuZXdDb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygkbW9kaWZpZWQpOwppZiAoSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRuZXdDb25zdHJhaW50LCAkY29uc3RyYWludCkgJiYgSW50ZXJ2YWxzOjppc1N1YnNldE9mKCRjb25zdHJhaW50LCAkbmV3Q29uc3RyYWludCkpIHsKcmV0dXJuICRwcmV0dHlDb25zdHJhaW50Owp9CgpyZXR1cm4gJG1vZGlmaWVkOwp9CgpyZXR1cm4gJHByZXR0eUNvbnN0cmFpbnQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcSGdEcml2ZXI7CnVzZSBDb21wb3NlclxJT1xOdWxsSU87CnVzZSBDb21wb3NlclxTZW12ZXJcVmVyc2lvblBhcnNlciBhcyBTZW12ZXJWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcVXRpbFxHaXQgYXMgR2l0VXRpbDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXFN2biBhcyBTdm5VdGlsOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgoKCgpjbGFzcyBWZXJzaW9uR3Vlc3Nlcgp7CgoKCnByaXZhdGUgJGNvbmZpZzsKCgoKCnByaXZhdGUgJHByb2Nlc3M7CgoKCgpwcml2YXRlICR2ZXJzaW9uUGFyc2VyOwoKCgoKcHJpdmF0ZSAkaW87CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQ29uZmlnICRjb25maWcsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgU2VtdmVyVmVyc2lvblBhcnNlciAkdmVyc2lvblBhcnNlciwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpCnsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CiR0aGlzLT52ZXJzaW9uUGFyc2VyID0gJHZlcnNpb25QYXJzZXI7CiR0aGlzLT5pbyA9ICRpbzsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGd1ZXNzVmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgc3RyaW5nICRwYXRoKTogP2FycmF5CnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnJldHVybiBudWxsOwp9CgoKCmlmIChQbGF0Zm9ybTo6aXNJbnB1dENvbXBsZXRpb25Qcm9jZXNzKCkpIHsKcmV0dXJuIG51bGw7Cn0KCiR2ZXJzaW9uRGF0YSA9ICR0aGlzLT5ndWVzc0dpdFZlcnNpb24oJHBhY2thZ2VDb25maWcsICRwYXRoKTsKaWYgKG51bGwgIT09ICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddKSB7CnJldHVybiAkdGhpcy0+cG9zdHByb2Nlc3MoJHZlcnNpb25EYXRhKTsKfQoKJHZlcnNpb25EYXRhID0gJHRoaXMtPmd1ZXNzSGdWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkcGF0aCk7CmlmIChudWxsICE9PSAkdmVyc2lvbkRhdGEgJiYgbnVsbCAhPT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pIHsKcmV0dXJuICR0aGlzLT5wb3N0cHJvY2VzcygkdmVyc2lvbkRhdGEpOwp9CgokdmVyc2lvbkRhdGEgPSAkdGhpcy0+Z3Vlc3NGb3NzaWxWZXJzaW9uKCRwYXRoKTsKaWYgKG51bGwgIT09ICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddKSB7CnJldHVybiAkdGhpcy0+cG9zdHByb2Nlc3MoJHZlcnNpb25EYXRhKTsKfQoKJHZlcnNpb25EYXRhID0gJHRoaXMtPmd1ZXNzU3ZuVmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHBhdGgpOwppZiAobnVsbCAhPT0gJHZlcnNpb25EYXRhICYmIG51bGwgIT09ICR2ZXJzaW9uRGF0YVsndmVyc2lvbiddKSB7CnJldHVybiAkdGhpcy0+cG9zdHByb2Nlc3MoJHZlcnNpb25EYXRhKTsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwb3N0cHJvY2VzcyhhcnJheSAkdmVyc2lvbkRhdGEpOiBhcnJheQp7CmlmICghZW1wdHkoJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSkgJiYgJHZlcnNpb25EYXRhWydmZWF0dXJlX3ZlcnNpb24nXSA9PT0gJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10gJiYgJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ10gPT09ICR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXSkgewp1bnNldCgkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddLCAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nXSk7Cn0KCmlmICgnLWRldicgPT09IHN1YnN0cigkdmVyc2lvbkRhdGFbJ3ZlcnNpb24nXSwgLTQpICYmIFByZWc6OmlzTWF0Y2goJ3tcLjl7N319JywgJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pKSB7CiR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXSA9IFByZWc6OnJlcGxhY2UoJ3soXC45ezd9KSt9JywgJy54JywgJHZlcnNpb25EYXRhWyd2ZXJzaW9uJ10pOwp9CgppZiAoIWVtcHR5KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10pICYmICctZGV2JyA9PT0gc3Vic3RyKCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10sIC00KSAmJiBQcmVnOjppc01hdGNoKCd7XC45ezd9fScsICR2ZXJzaW9uRGF0YVsnZmVhdHVyZV92ZXJzaW9uJ10pKSB7CiR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddID0gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkdmVyc2lvbkRhdGFbJ2ZlYXR1cmVfdmVyc2lvbiddKTsKfQoKcmV0dXJuICR2ZXJzaW9uRGF0YTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzR2l0VmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgc3RyaW5nICRwYXRoKTogYXJyYXkKewpHaXRVdGlsOjpjbGVhbkVudigkdGhpcy0+cHJvY2Vzcyk7CiRjb21taXQgPSBudWxsOwokdmVyc2lvbiA9IG51bGw7CiRwcmV0dHlWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVWZXJzaW9uID0gbnVsbDsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gbnVsbDsKJGlzRGV0YWNoZWQgPSBmYWxzZTsKCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnYnJhbmNoJywgJy1hJywgJy0tbm8tY29sb3InLCAnLS1uby1hYmJyZXYnLCAnLXYnXSwgJG91dHB1dCwgJHBhdGgpKSB7CiRicmFuY2hlcyA9IFtdOwokaXNGZWF0dXJlQnJhbmNoID0gZmFsc2U7CgoKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OlwqICkgKihcKG5vIGJyYW5jaFwpfFwoZGV0YWNoZWQgZnJvbSBcUytcKXxcKEhFQUQgZGV0YWNoZWQgYXQgXFMrXCl8XFMrKSAqKFthLWYwLTldKykgLiokfScsICRicmFuY2gsICRtYXRjaCkpIHsKaWYgKAokbWF0Y2hbMV0gPT09ICcobm8gYnJhbmNoKScKfHwgc3RycG9zKCRtYXRjaFsxXSwgJyhkZXRhY2hlZCAnKSA9PT0gMAp8fCBzdHJwb3MoJG1hdGNoWzFdLCAnKEhFQUQgZGV0YWNoZWQgYXQnKSA9PT0gMAopIHsKJHZlcnNpb24gPSAnZGV2LScgLiAkbWF0Y2hbMl07CiRwcmV0dHlWZXJzaW9uID0gJHZlcnNpb247CiRpc0ZlYXR1cmVCcmFuY2ggPSB0cnVlOwokaXNEZXRhY2hlZCA9IHRydWU7Cn0gZWxzZSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaCgkbWF0Y2hbMV0pOwokcHJldHR5VmVyc2lvbiA9ICdkZXYtJyAuICRtYXRjaFsxXTsKJGlzRmVhdHVyZUJyYW5jaCA9ICR0aGlzLT5pc0ZlYXR1cmVCcmFuY2goJHBhY2thZ2VDb25maWcsICRtYXRjaFsxXSk7Cn0KCiRjb21taXQgPSAkbWF0Y2hbMl07Cn0KCmlmICgkYnJhbmNoICYmICFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiAqLisvSEVBRCB9JywgJGJyYW5jaCkpIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86XCogKT8gKigoPzpyZW1vdGVzLyg/Om9yaWdpbnx1cHN0cmVhbSkvKT9bXlxzL10rKSAqKFthLWYwLTldKykgLiokfScsICRicmFuY2gsICRtYXRjaCkpIHsKJGJyYW5jaGVzW10gPSAkbWF0Y2hbMV07Cn0KfQp9CgppZiAoJGlzRmVhdHVyZUJyYW5jaCkgewokZmVhdHVyZVZlcnNpb24gPSAkdmVyc2lvbjsKJGZlYXR1cmVQcmV0dHlWZXJzaW9uID0gJHByZXR0eVZlcnNpb247CgoKJHJlc3VsdCA9ICR0aGlzLT5ndWVzc0ZlYXR1cmVWZXJzaW9uKCRwYWNrYWdlQ29uZmlnLCAkdmVyc2lvbiwgJGJyYW5jaGVzLCBbJ2dpdCcsICdyZXYtbGlzdCcsICclY2FuZGlkYXRlJS4uJWJyYW5jaCUnXSwgJHBhdGgpOwokdmVyc2lvbiA9ICRyZXN1bHRbJ3ZlcnNpb24nXTsKJHByZXR0eVZlcnNpb24gPSAkcmVzdWx0WydwcmV0dHlfdmVyc2lvbiddOwp9Cn0KR2l0VXRpbDo6Y2hlY2tGb3JSZXBvT3duZXJzaGlwRXJyb3IoJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICRwYXRoLCAkdGhpcy0+aW8pOwoKaWYgKCEkdmVyc2lvbiB8fCAkaXNEZXRhY2hlZCkgewokcmVzdWx0ID0gJHRoaXMtPnZlcnNpb25Gcm9tR2l0VGFncygkcGF0aCk7CmlmICgkcmVzdWx0KSB7CiR2ZXJzaW9uID0gJHJlc3VsdFsndmVyc2lvbiddOwokcHJldHR5VmVyc2lvbiA9ICRyZXN1bHRbJ3ByZXR0eV92ZXJzaW9uJ107CiRmZWF0dXJlVmVyc2lvbiA9IG51bGw7CiRmZWF0dXJlUHJldHR5VmVyc2lvbiA9IG51bGw7Cn0KfQoKaWYgKG51bGwgPT09ICRjb21taXQpIHsKJGNvbW1hbmQgPSBHaXRVdGlsOjpidWlsZFJldkxpc3RDb21tYW5kKCR0aGlzLT5wcm9jZXNzLCBhcnJheV9tZXJnZShbJy0tZm9ybWF0PSVIJywgJy1uMScsICdIRUFEJ10sIEdpdFV0aWw6OmdldE5vU2hvd1NpZ25hdHVyZUZsYWdzKCR0aGlzLT5wcm9jZXNzKSkpOwppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewokY29tbWl0ID0gdHJpbShHaXRVdGlsOjpwYXJzZVJldkxpc3RPdXRwdXQoJG91dHB1dCwgJHRoaXMtPnByb2Nlc3MpKSA/OiBudWxsOwp9Cn0KCmlmICgkZmVhdHVyZVZlcnNpb24pIHsKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICRjb21taXQsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb24sICdmZWF0dXJlX3ZlcnNpb24nID0+ICRmZWF0dXJlVmVyc2lvbiwgJ2ZlYXR1cmVfcHJldHR5X3ZlcnNpb24nID0+ICRmZWF0dXJlUHJldHR5VmVyc2lvbl07Cn0KCnJldHVybiBbJ3ZlcnNpb24nID0+ICR2ZXJzaW9uLCAnY29tbWl0JyA9PiAkY29tbWl0LCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2ZXJzaW9uRnJvbUdpdFRhZ3Moc3RyaW5nICRwYXRoKTogP2FycmF5CnsKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdkZXNjcmliZScsICctLWV4YWN0LW1hdGNoJywgJy0tdGFncyddLCAkb3V0cHV0LCAkcGF0aCkpIHsKdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKHRyaW0oJG91dHB1dCkpOwoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdwcmV0dHlfdmVyc2lvbicgPT4gdHJpbSgkb3V0cHV0KV07Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzSGdWZXJzaW9uKGFycmF5ICRwYWNrYWdlQ29uZmlnLCBzdHJpbmcgJHBhdGgpOiA/YXJyYXkKewoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnYnJhbmNoJ10sICRvdXRwdXQsICRwYXRoKSkgewokYnJhbmNoID0gdHJpbSgkb3V0cHV0KTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRicmFuY2gpOwokaXNGZWF0dXJlQnJhbmNoID0gMCA9PT0gc3RycG9zKCR2ZXJzaW9uLCAnZGV2LScpOwoKaWYgKFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTID09PSAkdmVyc2lvbikgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gbnVsbCwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAnZGV2LScuJGJyYW5jaF07Cn0KCmlmICghJGlzRmVhdHVyZUJyYW5jaCkgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gbnVsbCwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkdmVyc2lvbl07Cn0KCgokaW8gPSBuZXcgTnVsbElPKCk7CiRkcml2ZXIgPSBuZXcgSGdEcml2ZXIoWyd1cmwnID0+ICRwYXRoXSwgJGlvLCAkdGhpcy0+Y29uZmlnLCBuZXcgSHR0cERvd25sb2FkZXIoJGlvLCAkdGhpcy0+Y29uZmlnKSwgJHRoaXMtPnByb2Nlc3MpOwokYnJhbmNoZXMgPSBhcnJheV9tYXAoJ3N0cnZhbCcsIGFycmF5X2tleXMoJGRyaXZlci0+Z2V0QnJhbmNoZXMoKSkpOwoKCiRyZXN1bHQgPSAkdGhpcy0+Z3Vlc3NGZWF0dXJlVmVyc2lvbigkcGFja2FnZUNvbmZpZywgJHZlcnNpb24sICRicmFuY2hlcywgWydoZycsICdsb2cnLCAnLXInLCAnbm90IGFuY2VzdG9ycyhcJyVjYW5kaWRhdGUlXCcpIGFuZCBhbmNlc3RvcnMoXCclYnJhbmNoJVwnKScsICctLXRlbXBsYXRlJywgJyJ7bm9kZX1cXG4iJ10sICRwYXRoKTsKJHJlc3VsdFsnY29tbWl0J10gPSAnJzsKJHJlc3VsdFsnZmVhdHVyZV92ZXJzaW9uJ10gPSAkdmVyc2lvbjsKJHJlc3VsdFsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddID0gJHZlcnNpb247CgpyZXR1cm4gJHJlc3VsdDsKfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzRmVhdHVyZVZlcnNpb24oYXJyYXkgJHBhY2thZ2VDb25maWcsID9zdHJpbmcgJHZlcnNpb24sIGFycmF5ICRicmFuY2hlcywgYXJyYXkgJHNjbUNtZGxpbmUsIHN0cmluZyAkcGF0aCk6IGFycmF5CnsKJHByZXR0eVZlcnNpb24gPSAkdmVyc2lvbjsKCgoKaWYgKCFpc3NldCgkcGFja2FnZUNvbmZpZ1snZXh0cmEnXVsnYnJhbmNoLWFsaWFzJ11bJHZlcnNpb25dKQp8fCBzdHJwb3MoanNvbl9lbmNvZGUoJHBhY2thZ2VDb25maWcpLCAnInNlbGYudmVyc2lvbiInKQopIHsKJGJyYW5jaCA9IFByZWc6OnJlcGxhY2UoJ3teZGV2LX0nLCAnJywgJHZlcnNpb24pOwokbGVuZ3RoID0gUEhQX0lOVF9NQVg7CgoKaWYgKCEkdGhpcy0+aXNGZWF0dXJlQnJhbmNoKCRwYWNrYWdlQ29uZmlnLCAkYnJhbmNoKSkgewpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ3ByZXR0eV92ZXJzaW9uJyA9PiAkcHJldHR5VmVyc2lvbl07Cn0KCgoKCnVzb3J0KCRicmFuY2hlcywgc3RhdGljIGZ1bmN0aW9uICgkYSwgJGIpOiBpbnQgewokYVJlbW90ZSA9IDAgPT09IHN0cnBvcygkYSwgJ3JlbW90ZXMvJyk7CiRiUmVtb3RlID0gMCA9PT0gc3RycG9zKCRiLCAncmVtb3Rlcy8nKTsKCmlmICgkYVJlbW90ZSAhPT0gJGJSZW1vdGUpIHsKcmV0dXJuICRhUmVtb3RlID8gMSA6IC0xOwp9CgpyZXR1cm4gc3RybmF0Y2FzZWNtcCgkYiwgJGEpOwp9KTsKCiRwcm9taXNlcyA9IFtdOwokdGhpcy0+cHJvY2Vzcy0+c2V0TWF4Sm9icygzMCk7CnRyeSB7CiRsYXN0SW5kZXggPSAtMTsKZm9yZWFjaCAoJGJyYW5jaGVzIGFzICRpbmRleCA9PiAkY2FuZGlkYXRlKSB7CiRjYW5kaWRhdGVWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgne15yZW1vdGVzL1xTKy99JywgJycsICRjYW5kaWRhdGUpOwoKCmlmICgkY2FuZGlkYXRlID09PSAkYnJhbmNoIHx8ICR0aGlzLT5pc0ZlYXR1cmVCcmFuY2goJHBhY2thZ2VDb25maWcsICRjYW5kaWRhdGVWZXJzaW9uKSkgewpjb250aW51ZTsKfQoKJGNtZExpbmUgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChzdHJpbmcgJGNvbXBvbmVudCkgdXNlICgkY2FuZGlkYXRlLCAkYnJhbmNoKSB7CnJldHVybiBzdHJfcmVwbGFjZShbJyVjYW5kaWRhdGUlJywgJyVicmFuY2glJ10sIFskY2FuZGlkYXRlLCAkYnJhbmNoXSwgJGNvbXBvbmVudCk7Cn0sICRzY21DbWRsaW5lKTsKJHByb21pc2VzW10gPSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZUFzeW5jKCRjbWRMaW5lLCAkcGF0aCktPnRoZW4oZnVuY3Rpb24gKFByb2Nlc3MgJHByb2Nlc3MpIHVzZSAoJiRsYXN0SW5kZXgsICRpbmRleCwgJiRsZW5ndGgsICYkdmVyc2lvbiwgJiRwcmV0dHlWZXJzaW9uLCAkY2FuZGlkYXRlVmVyc2lvbiwgJiRwcm9taXNlcyk6IHZvaWQgewppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewpyZXR1cm47Cn0KCiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0T3V0cHV0KCk7CgoKCmlmIChzdHJsZW4oJG91dHB1dCkgPCAkbGVuZ3RoIHx8IChzdHJsZW4oJG91dHB1dCkgPT09ICRsZW5ndGggJiYgJGxhc3RJbmRleCA8ICRpbmRleCkpIHsKJGxhc3RJbmRleCA9ICRpbmRleDsKJGxlbmd0aCA9IHN0cmxlbigkb3V0cHV0KTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRjYW5kaWRhdGVWZXJzaW9uKTsKJHByZXR0eVZlcnNpb24gPSAnZGV2LScgLiAkY2FuZGlkYXRlVmVyc2lvbjsKaWYgKCRsZW5ndGggPT09IDApIHsKZm9yZWFjaCAoJHByb21pc2VzIGFzICRwcm9taXNlKSB7CgpcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRwcm9taXNlKS0+Y2FuY2VsKCk7Cn0KfQp9Cn0pOwp9CgokdGhpcy0+cHJvY2Vzcy0+d2FpdCgpOwp9IGZpbmFsbHkgewokdGhpcy0+cHJvY2Vzcy0+cmVzZXRNYXhKb2JzKCk7Cn0KfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzRmVhdHVyZUJyYW5jaChhcnJheSAkcGFja2FnZUNvbmZpZywgP3N0cmluZyAkYnJhbmNoTmFtZSk6IGJvb2wKewokbm9uRmVhdHVyZUJyYW5jaGVzID0gJyc7CmlmICghZW1wdHkoJHBhY2thZ2VDb25maWdbJ25vbi1mZWF0dXJlLWJyYW5jaGVzJ10pKSB7CiRub25GZWF0dXJlQnJhbmNoZXMgPSBpbXBsb2RlKCd8JywgJHBhY2thZ2VDb25maWdbJ25vbi1mZWF0dXJlLWJyYW5jaGVzJ10pOwp9CgpyZXR1cm4gIVByZWc6OmlzTWF0Y2goJ3teKCcgLiAkbm9uRmVhdHVyZUJyYW5jaGVzIC4gJ3xtYXN0ZXJ8bWFpbnxsYXRlc3R8bmV4dHxjdXJyZW50fHN1cHBvcnR8dGlwfHRydW5rfGRlZmF1bHR8ZGV2ZWxvcHxcZCtcLi4rKSR9JywgJGJyYW5jaE5hbWUsICRtYXRjaCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ3Vlc3NGb3NzaWxWZXJzaW9uKHN0cmluZyAkcGF0aCk6IGFycmF5CnsKJHZlcnNpb24gPSBudWxsOwokcHJldHR5VmVyc2lvbiA9IG51bGw7CgoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2JyYW5jaCcsICdsaXN0J10sICRvdXRwdXQsICRwYXRoKSkgewokYnJhbmNoID0gdHJpbSgkb3V0cHV0KTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplQnJhbmNoKCRicmFuY2gpOwokcHJldHR5VmVyc2lvbiA9ICdkZXYtJyAuICRicmFuY2g7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAndGFnJywgJ2xpc3QnXSwgJG91dHB1dCwgJHBhdGgpKSB7CnRyeSB7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSh0cmltKCRvdXRwdXQpKTsKJHByZXR0eVZlcnNpb24gPSB0cmltKCRvdXRwdXQpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KfQoKcmV0dXJuIFsndmVyc2lvbicgPT4gJHZlcnNpb24sICdjb21taXQnID0+ICcnLCAncHJldHR5X3ZlcnNpb24nID0+ICRwcmV0dHlWZXJzaW9uXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGd1ZXNzU3ZuVmVyc2lvbihhcnJheSAkcGFja2FnZUNvbmZpZywgc3RyaW5nICRwYXRoKTogP2FycmF5CnsKU3ZuVXRpbDo6Y2xlYW5FbnYoKTsKCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydzdm4nLCAnaW5mbycsICctLXhtbCddLCAkb3V0cHV0LCAkcGF0aCkpIHsKJHRydW5rUGF0aCA9IGlzc2V0KCRwYWNrYWdlQ29uZmlnWyd0cnVuay1wYXRoJ10pID8gcHJlZ19xdW90ZSgkcGFja2FnZUNvbmZpZ1sndHJ1bmstcGF0aCddLCAnIycpIDogJ3RydW5rJzsKJGJyYW5jaGVzUGF0aCA9IGlzc2V0KCRwYWNrYWdlQ29uZmlnWydicmFuY2hlcy1wYXRoJ10pID8gcHJlZ19xdW90ZSgkcGFja2FnZUNvbmZpZ1snYnJhbmNoZXMtcGF0aCddLCAnIycpIDogJ2JyYW5jaGVzJzsKJHRhZ3NQYXRoID0gaXNzZXQoJHBhY2thZ2VDb25maWdbJ3RhZ3MtcGF0aCddKSA/IHByZWdfcXVvdGUoJHBhY2thZ2VDb25maWdbJ3RhZ3MtcGF0aCddLCAnIycpIDogJ3RhZ3MnOwoKJHVybFBhdHRlcm4gPSAnIzx1cmw+LiovKCcgLiAkdHJ1bmtQYXRoIC4gJ3woJyAuICRicmFuY2hlc1BhdGggLiAnfCcgLiAkdGFnc1BhdGggLiAnKS8oLiopKTwvdXJsPiMnOwoKaWYgKFByZWc6OmlzTWF0Y2goJHVybFBhdHRlcm4sICRvdXRwdXQsICRtYXRjaGVzKSkgewppZiAoaXNzZXQoJG1hdGNoZXNbMl0sICRtYXRjaGVzWzNdKSAmJiAoJGJyYW5jaGVzUGF0aCA9PT0gJG1hdGNoZXNbMl0gfHwgJHRhZ3NQYXRoID09PSAkbWF0Y2hlc1syXSkpIHsKCiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZUJyYW5jaCgkbWF0Y2hlc1szXSk7CiRwcmV0dHlWZXJzaW9uID0gJ2Rldi0nIC4gJG1hdGNoZXNbM107CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gJycsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9Cgphc3NlcnQoaXNfc3RyaW5nKCRtYXRjaGVzWzFdKSk7CiRwcmV0dHlWZXJzaW9uID0gdHJpbSgkbWF0Y2hlc1sxXSk7CmlmICgkcHJldHR5VmVyc2lvbiA9PT0gJ3RydW5rJykgewokdmVyc2lvbiA9ICdkZXYtdHJ1bmsnOwp9IGVsc2UgewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgpyZXR1cm4gWyd2ZXJzaW9uJyA9PiAkdmVyc2lvbiwgJ2NvbW1pdCcgPT4gJycsICdwcmV0dHlfdmVyc2lvbicgPT4gJHByZXR0eVZlcnNpb25dOwp9Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdFZlcnNpb25Gcm9tRW52KCk6IHN0cmluZwp7CiR2ZXJzaW9uID0gUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfUk9PVF9WRVJTSU9OJyk7CmlmICghaXNfc3RyaW5nKCR2ZXJzaW9uKSB8fCAkdmVyc2lvbiA9PT0gJycpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDT01QT1NFUl9ST09UX1ZFUlNJT04gbm90IHNldCBvciBlbXB0eScpOwp9CmlmIChQcmVnOjppc01hdGNoKCd7XihcZCsoPzpcLlxkKykqKS1kZXYkfWknLCAkdmVyc2lvbiwgJG1hdGNoKSkgewokdmVyc2lvbiA9ICRtYXRjaFsxXS4nLngtZGV2JzsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFBsYXRmb3JtUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyIGFzIFNlbXZlclZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcU2VtdmVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKCmNsYXNzIFZlcnNpb25QYXJzZXIgZXh0ZW5kcyBTZW12ZXJWZXJzaW9uUGFyc2VyCnsKcHVibGljIGNvbnN0IERFRkFVTFRfQlJBTkNIX0FMSUFTID0gJzk5OTk5OTktZGV2JzsKCgpwcml2YXRlIHN0YXRpYyAkY29uc3RyYWludHMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBwYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50cyk6IENvbnN0cmFpbnRJbnRlcmZhY2UKewppZiAoIWlzc2V0KHNlbGY6OiRjb25zdHJhaW50c1skY29uc3RyYWludHNdKSkgewpzZWxmOjokY29uc3RyYWludHNbJGNvbnN0cmFpbnRzXSA9IHBhcmVudDo6cGFyc2VDb25zdHJhaW50cygkY29uc3RyYWludHMpOwp9CgpyZXR1cm4gc2VsZjo6JGNvbnN0cmFpbnRzWyRjb25zdHJhaW50c107Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2VOYW1lVmVyc2lvblBhaXJzKGFycmF5ICRwYWlycyk6IGFycmF5CnsKJHBhaXJzID0gYXJyYXlfdmFsdWVzKCRwYWlycyk7CiRyZXN1bHQgPSBbXTsKCmZvciAoJGkgPSAwLCAkY291bnQgPSBjb3VudCgkcGFpcnMpOyAkaSA8ICRjb3VudDsgJGkrKykgewokcGFpciA9IFByZWc6OnJlcGxhY2UoJ3teKFtePTogXSspWz06IF0oLiopJH0nLCAnJDEgJDInLCB0cmltKCRwYWlyc1skaV0pKTsKaWYgKGZhbHNlID09PSBzdHJwb3MoJHBhaXIsICcgJykgJiYgaXNzZXQoJHBhaXJzWyRpICsgMV0pICYmIGZhbHNlID09PSBzdHJwb3MoJHBhaXJzWyRpICsgMV0sICcvJykgJiYgIVByZWc6OmlzTWF0Y2goJ3soPzw9W2EtejAtOV8vLV0pXCp8XCooPz1bYS16MC05Xy8tXSl9aScsICRwYWlyc1skaSArIDFdKSAmJiAhUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFpcnNbJGkgKyAxXSkpIHsKJHBhaXIgLj0gJyAnLiRwYWlyc1skaSArIDFdOwokaSsrOwp9CgppZiAoc3RycG9zKCRwYWlyLCAnICcpKSB7ClskbmFtZSwgJHZlcnNpb25dID0gZXhwbG9kZSgnICcsICRwYWlyLCAyKTsKJHJlc3VsdFtdID0gWyduYW1lJyA9PiAkbmFtZSwgJ3ZlcnNpb24nID0+ICR2ZXJzaW9uXTsKfSBlbHNlIHsKJHJlc3VsdFtdID0gWyduYW1lJyA9PiAkcGFpcl07Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNVcGdyYWRlKHN0cmluZyAkbm9ybWFsaXplZEZyb20sIHN0cmluZyAkbm9ybWFsaXplZFRvKTogYm9vbAp7CmlmICgkbm9ybWFsaXplZEZyb20gPT09ICRub3JtYWxpemVkVG8pIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpbl9hcnJheSgkbm9ybWFsaXplZEZyb20sIFsnZGV2LW1hc3RlcicsICdkZXYtdHJ1bmsnLCAnZGV2LWRlZmF1bHQnXSwgdHJ1ZSkpIHsKJG5vcm1hbGl6ZWRGcm9tID0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVM7Cn0KaWYgKGluX2FycmF5KCRub3JtYWxpemVkVG8sIFsnZGV2LW1hc3RlcicsICdkZXYtdHJ1bmsnLCAnZGV2LWRlZmF1bHQnXSwgdHJ1ZSkpIHsKJG5vcm1hbGl6ZWRUbyA9IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTOwp9CgppZiAoc3RycG9zKCRub3JtYWxpemVkRnJvbSwgJ2Rldi0nKSA9PT0gMCB8fCBzdHJwb3MoJG5vcm1hbGl6ZWRUbywgJ2Rldi0nKSA9PT0gMCkgewpyZXR1cm4gdHJ1ZTsKfQoKJHNvcnRlZCA9IFNlbXZlcjo6c29ydChbJG5vcm1hbGl6ZWRUbywgJG5vcm1hbGl6ZWRGcm9tXSk7CgpyZXR1cm4gJHNvcnRlZFswXSA9PT0gJG5vcm1hbGl6ZWRGcm9tOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvbjsKCnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxJZ25vcmVBbGxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyOwp1c2UgQ29tcG9zZXJcRmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJcSWdub3JlTGlzdFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXI7CnVzZSBDb21wb3NlclxGaWx0ZXJcUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyRmFjdG9yeTsKdXNlIENvbXBvc2VyXEZpbHRlclxQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyXFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXER1bXBlclxBcnJheUR1bXBlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUmVwb3NpdG9yeVNldDsKdXNlIENvbXBvc2VyXFJlcG9zaXRvcnlcUGxhdGZvcm1SZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBWZXJzaW9uU2VsZWN0b3IKewoKcHJpdmF0ZSAkcmVwb3NpdG9yeVNldDsKCgpwcml2YXRlICRwbGF0Zm9ybUNvbnN0cmFpbnRzID0gW107CgoKcHJpdmF0ZSAkcGFyc2VyOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlcG9zaXRvcnlTZXQgJHJlcG9zaXRvcnlTZXQsID9QbGF0Zm9ybVJlcG9zaXRvcnkgJHBsYXRmb3JtUmVwbyA9IG51bGwpCnsKJHRoaXMtPnJlcG9zaXRvcnlTZXQgPSAkcmVwb3NpdG9yeVNldDsKaWYgKCRwbGF0Zm9ybVJlcG8pIHsKZm9yZWFjaCAoJHBsYXRmb3JtUmVwby0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50c1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7Cn0KfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZEJlc3RDYW5kaWRhdGUoc3RyaW5nICRwYWNrYWdlTmFtZSwgP3N0cmluZyAkdGFyZ2V0UGFja2FnZVZlcnNpb24gPSBudWxsLCBzdHJpbmcgJHByZWZlcnJlZFN0YWJpbGl0eSA9ICdzdGFibGUnLCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IG51bGwsIGludCAkcmVwb1NldEZsYWdzID0gMCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwsICRzaG93V2FybmluZ3MgPSB0cnVlKQp7CmlmICghaXNzZXQoQmFzZVBhY2thZ2U6OlNUQUJJTElUSUVTWyRwcmVmZXJyZWRTdGFiaWxpdHldKSkgewoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ0V4cGVjdGVkIGEgdmFsaWQgc3RhYmlsaXR5IG5hbWUgYXMgM3JkIGFyZ3VtZW50LCBnb3QgJy4kcHJlZmVycmVkU3RhYmlsaXR5KTsKfQoKaWYgKG51bGwgPT09ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyKSB7CiRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyID0gUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlckZhY3Rvcnk6Omlnbm9yZU5vdGhpbmcoKTsKfSBlbHNlaWYgKCEoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlKSkgewp0cmlnZ2VyX2Vycm9yKCdWZXJzaW9uU2VsZWN0b3I6OmZpbmRCZXN0Q2FuZGlkYXRlIHdpdGggaWdub3JlZCBwbGF0Zm9ybSByZXFzIGFzIGJvb2x8YXJyYXkgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjIsIHVzZSBhbiBpbnN0YW5jZSBvZiBQbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVySW50ZXJmYWNlIGluc3RlYWQuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwokcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciA9IFBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXJGYWN0b3J5Ojpmcm9tQm9vbE9yTGlzdCgkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcik7Cn0KCiRjb25zdHJhaW50ID0gJHRhcmdldFBhY2thZ2VWZXJzaW9uID8gJHRoaXMtPmdldFBhcnNlcigpLT5wYXJzZUNvbnN0cmFpbnRzKCR0YXJnZXRQYWNrYWdlVmVyc2lvbikgOiBudWxsOwokY2FuZGlkYXRlcyA9ICR0aGlzLT5yZXBvc2l0b3J5U2V0LT5maW5kUGFja2FnZXMoc3RydG9sb3dlcigkcGFja2FnZU5hbWUpLCAkY29uc3RyYWludCwgJHJlcG9TZXRGbGFncyk7CgokbWluUHJpb3JpdHkgPSBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVNbJHByZWZlcnJlZFN0YWJpbGl0eV07CnVzb3J0KCRjYW5kaWRhdGVzLCBzdGF0aWMgZnVuY3Rpb24gKFBhY2thZ2VJbnRlcmZhY2UgJGEsIFBhY2thZ2VJbnRlcmZhY2UgJGIpIHVzZSAoJG1pblByaW9yaXR5KSB7CiRhUHJpb3JpdHkgPSAkYS0+Z2V0U3RhYmlsaXR5UHJpb3JpdHkoKTsKJGJQcmlvcml0eSA9ICRiLT5nZXRTdGFiaWxpdHlQcmlvcml0eSgpOwoKCgppZiAoJG1pblByaW9yaXR5IDwgJGFQcmlvcml0eSAmJiAkYlByaW9yaXR5IDwgJGFQcmlvcml0eSkgewpyZXR1cm4gMTsKfQoKCgppZiAoJG1pblByaW9yaXR5IDwgJGFQcmlvcml0eSAmJiAkYVByaW9yaXR5IDwgJGJQcmlvcml0eSkgewpyZXR1cm4gLTE7Cn0KCgoKaWYgKCRtaW5Qcmlvcml0eSA+PSAkYVByaW9yaXR5ICYmICRtaW5Qcmlvcml0eSA8ICRiUHJpb3JpdHkpIHsKcmV0dXJuIC0xOwp9CgoKcmV0dXJuIHZlcnNpb25fY29tcGFyZSgkYi0+Z2V0VmVyc2lvbigpLCAkYS0+Z2V0VmVyc2lvbigpKTsKfSk7CgppZiAoY291bnQoJHRoaXMtPnBsYXRmb3JtQ29uc3RyYWludHMpID4gMCAmJiAhKCRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyIGluc3RhbmNlb2YgSWdub3JlQWxsUGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlcikpIHsKCiRhbHJlYWR5V2FybmVkTmFtZXMgPSBbXTsKCiRhbHJlYWR5U2Vlbk5hbWVzID0gW107Cgpmb3JlYWNoICgkY2FuZGlkYXRlcyBhcyAkcGtnKSB7CiRyZXFzID0gJHBrZy0+Z2V0UmVxdWlyZXMoKTsKJHNraXAgPSBmYWxzZTsKZm9yZWFjaCAoJHJlcXMgYXMgJG5hbWUgPT4gJGxpbmspIHsKaWYgKCFQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSB8fCAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNJZ25vcmVkKCRuYW1lKSkgewpjb250aW51ZTsKfQppZiAoaXNzZXQoJHRoaXMtPnBsYXRmb3JtQ29uc3RyYWludHNbJG5hbWVdKSkgewpmb3JlYWNoICgkdGhpcy0+cGxhdGZvcm1Db25zdHJhaW50c1skbmFtZV0gYXMgJHByb3ZpZGVkQ29uc3RyYWludCkgewppZiAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkcHJvdmlkZWRDb25zdHJhaW50KSkgewoKY29udGludWUgMjsKfQppZiAoJHBsYXRmb3JtUmVxdWlyZW1lbnRGaWx0ZXIgaW5zdGFuY2VvZiBJZ25vcmVMaXN0UGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlciAmJiAkcGxhdGZvcm1SZXF1aXJlbWVudEZpbHRlci0+aXNVcHBlckJvdW5kSWdub3JlZCgkbmFtZSkpIHsKJGZpbHRlcmVkQ29uc3RyYWludCA9ICRwbGF0Zm9ybVJlcXVpcmVtZW50RmlsdGVyLT5maWx0ZXJDb25zdHJhaW50KCRuYW1lLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKTsKaWYgKCRmaWx0ZXJlZENvbnN0cmFpbnQtPm1hdGNoZXMoJHByb3ZpZGVkQ29uc3RyYWludCkpIHsKCmNvbnRpbnVlIDI7Cn0KfQp9CgoKJHJlYXNvbiA9ICdpcyBub3Qgc2F0aXNmaWVkIGJ5IHlvdXIgcGxhdGZvcm0nOwp9IGVsc2UgewoKCiRyZWFzb24gPSAnaXMgbWlzc2luZyBmcm9tIHlvdXIgcGxhdGZvcm0nOwp9CgokaXNMYXRlc3RWZXJzaW9uID0gIWlzc2V0KCRhbHJlYWR5U2Vlbk5hbWVzWyRwa2ctPmdldE5hbWUoKV0pOwokYWxyZWFkeVNlZW5OYW1lc1skcGtnLT5nZXROYW1lKCldID0gdHJ1ZTsKaWYgKCRpbyAhPT0gbnVsbCAmJiAoJHNob3dXYXJuaW5ncyA9PT0gdHJ1ZSB8fCAoaXNfY2FsbGFibGUoJHNob3dXYXJuaW5ncykgJiYgJHNob3dXYXJuaW5ncygkcGtnKSkpKSB7CiRpc0ZpcnN0V2FybmluZyA9ICFpc3NldCgkYWxyZWFkeVdhcm5lZE5hbWVzWyRwa2ctPmdldE5hbWUoKS4nLycuJGxpbmstPmdldFRhcmdldCgpXSk7CiRhbHJlYWR5V2FybmVkTmFtZXNbJHBrZy0+Z2V0TmFtZSgpLicvJy4kbGluay0+Z2V0VGFyZ2V0KCldID0gdHJ1ZTsKJGxhdGVzdCA9ICRpc0xhdGVzdFZlcnNpb24gPyAiJ3MgbGF0ZXN0IHZlcnNpb24iIDogJyc7CiRpby0+d3JpdGVFcnJvcigKJzx3YXJuaW5nPkNhbm5vdCB1c2UgJy4kcGtnLT5nZXRQcmV0dHlOYW1lKCkuJGxhdGVzdC4nICcuJHBrZy0+Z2V0UHJldHR5VmVyc2lvbigpLicgYXMgaXQgJy4kbGluay0+Z2V0RGVzY3JpcHRpb24oKS4nICcuJGxpbmstPmdldFRhcmdldCgpLicgJy4kbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgd2hpY2ggJy4kcmVhc29uLicuPC8+JywKdHJ1ZSwKJGlzRmlyc3RXYXJuaW5nID8gSU9JbnRlcmZhY2U6Ok5PUk1BTCA6IElPSW50ZXJmYWNlOjpWRVJCT1NFCik7Cn0KCgokc2tpcCA9IHRydWU7Cn0KCmlmICgkc2tpcCkgewpjb250aW51ZTsKfQoKJHBhY2thZ2UgPSAkcGtnOwpicmVhazsKfQp9IGVsc2UgewokcGFja2FnZSA9IGNvdW50KCRjYW5kaWRhdGVzKSA+IDAgPyAkY2FuZGlkYXRlc1swXSA6IG51bGw7Cn0KCmlmICghaXNzZXQoJHBhY2thZ2UpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAkcGFja2FnZS0+Z2V0VmVyc2lvbigpID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KCnJldHVybiAkcGFja2FnZTsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUmVjb21tZW5kZWRSZXF1aXJlVmVyc2lvbihQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogc3RyaW5nCnsKCgppZiAoMCA9PT0gc3RycG9zKCRwYWNrYWdlLT5nZXROYW1lKCksICdleHQtJykpIHsKJHBocFZlcnNpb24gPSBQSFBfTUFKT1JfVkVSU0lPTiAuICcuJyAuIFBIUF9NSU5PUl9WRVJTSU9OIC4gJy4nIC4gUEhQX1JFTEVBU0VfVkVSU0lPTjsKJGV4dFZlcnNpb24gPSBpbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoZXhwbG9kZSgnLicsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpLCAwLCAzKSk7CmlmICgkcGhwVmVyc2lvbiA9PT0gJGV4dFZlcnNpb24pIHsKcmV0dXJuICcqJzsKfQp9CgokdmVyc2lvbiA9ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCk7CmlmICghJHBhY2thZ2UtPmlzRGV2KCkpIHsKcmV0dXJuICR0aGlzLT50cmFuc2Zvcm1WZXJzaW9uKCR2ZXJzaW9uLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLCAkcGFja2FnZS0+Z2V0U3RhYmlsaXR5KCkpOwp9CgokbG9hZGVyID0gbmV3IEFycmF5TG9hZGVyKCR0aGlzLT5nZXRQYXJzZXIoKSk7CiRkdW1wZXIgPSBuZXcgQXJyYXlEdW1wZXIoKTsKJGV4dHJhID0gJGxvYWRlci0+Z2V0QnJhbmNoQWxpYXMoJGR1bXBlci0+ZHVtcCgkcGFja2FnZSkpOwppZiAoJGV4dHJhICYmICRleHRyYSAhPT0gVmVyc2lvblBhcnNlcjo6REVGQVVMVF9CUkFOQ0hfQUxJQVMpIHsKJGV4dHJhID0gUHJlZzo6cmVwbGFjZSgne14oXGQrXC5cZCtcLlxkKykoXC45OTk5OTk5KS1kZXYkfScsICckMS4wJywgJGV4dHJhLCAtMSwgJGNvdW50KTsKaWYgKCRjb3VudCA+IDApIHsKJGV4dHJhID0gc3RyX3JlcGxhY2UoJy45OTk5OTk5JywgJy4wJywgJGV4dHJhKTsKCnJldHVybiAkdGhpcy0+dHJhbnNmb3JtVmVyc2lvbigkZXh0cmEsICRleHRyYSwgJ2RldicpOwp9Cn0KCnJldHVybiAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHRyYW5zZm9ybVZlcnNpb24oc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJHByZXR0eVZlcnNpb24sIHN0cmluZyAkc3RhYmlsaXR5KTogc3RyaW5nCnsKCgokc2VtYW50aWNWZXJzaW9uUGFydHMgPSBleHBsb2RlKCcuJywgJHZlcnNpb24pOwoKCmlmIChjb3VudCgkc2VtYW50aWNWZXJzaW9uUGFydHMpID09PSA0ICYmIFByZWc6OmlzTWF0Y2goJ3teXGQrXEQ/fScsICRzZW1hbnRpY1ZlcnNpb25QYXJ0c1szXSkpIHsKCmlmICgkc2VtYW50aWNWZXJzaW9uUGFydHNbMF0gPT09ICcwJykgewp1bnNldCgkc2VtYW50aWNWZXJzaW9uUGFydHNbM10pOwp9IGVsc2Ugewp1bnNldCgkc2VtYW50aWNWZXJzaW9uUGFydHNbMl0sICRzZW1hbnRpY1ZlcnNpb25QYXJ0c1szXSk7Cn0KJHZlcnNpb24gPSBpbXBsb2RlKCcuJywgJHNlbWFudGljVmVyc2lvblBhcnRzKTsKfSBlbHNlIHsKcmV0dXJuICRwcmV0dHlWZXJzaW9uOwp9CgoKaWYgKCRzdGFiaWxpdHkgIT09ICdzdGFibGUnKSB7CiR2ZXJzaW9uIC49ICdAJy4kc3RhYmlsaXR5Owp9CgoKcmV0dXJuICdeJyAuICR2ZXJzaW9uOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhcnNlcigpOiBWZXJzaW9uUGFyc2VyCnsKaWYgKCR0aGlzLT5wYXJzZXIgPT09IG51bGwpIHsKJHRoaXMtPnBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7Cn0KCnJldHVybiAkdGhpcy0+cGFyc2VyOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxVdGlsXExvb3A7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJlcG9zaXRvcnlNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwoKCgoKY2xhc3MgUGFydGlhbENvbXBvc2VyCnsKCgoKcHJpdmF0ZSAkZ2xvYmFsID0gZmFsc2U7CgoKCgpwcml2YXRlICRwYWNrYWdlOwoKCgoKcHJpdmF0ZSAkbG9vcDsKCgoKCnByaXZhdGUgJHJlcG9zaXRvcnlNYW5hZ2VyOwoKCgoKcHJpdmF0ZSAkaW5zdGFsbGF0aW9uTWFuYWdlcjsKCgoKCnByaXZhdGUgJGNvbmZpZzsKCgoKCnByaXZhdGUgJGV2ZW50RGlzcGF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBzZXRQYWNrYWdlKFJvb3RQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CiR0aGlzLT5wYWNrYWdlID0gJHBhY2thZ2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6IFJvb3RQYWNrYWdlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29uZmlnKENvbmZpZyAkY29uZmlnKTogdm9pZAp7CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29uZmlnKCk6IENvbmZpZwp7CnJldHVybiAkdGhpcy0+Y29uZmlnOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9vcChMb29wICRsb29wKTogdm9pZAp7CiR0aGlzLT5sb29wID0gJGxvb3A7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRMb29wKCk6IExvb3AKewpyZXR1cm4gJHRoaXMtPmxvb3A7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3J5TWFuYWdlcihSZXBvc2l0b3J5TWFuYWdlciAkbWFuYWdlcik6IHZvaWQKewokdGhpcy0+cmVwb3NpdG9yeU1hbmFnZXIgPSAkbWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnlNYW5hZ2VyKCk6IFJlcG9zaXRvcnlNYW5hZ2VyCnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3J5TWFuYWdlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEluc3RhbGxhdGlvbk1hbmFnZXIoSW5zdGFsbGF0aW9uTWFuYWdlciAkbWFuYWdlcik6IHZvaWQKewokdGhpcy0+aW5zdGFsbGF0aW9uTWFuYWdlciA9ICRtYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpOiBJbnN0YWxsYXRpb25NYW5hZ2VyCnsKcmV0dXJuICR0aGlzLT5pbnN0YWxsYXRpb25NYW5hZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RXZlbnREaXNwYXRjaGVyKEV2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyKTogdm9pZAp7CiR0aGlzLT5ldmVudERpc3BhdGNoZXIgPSAkZXZlbnREaXNwYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXZlbnREaXNwYXRjaGVyKCk6IEV2ZW50RGlzcGF0Y2hlcgp7CnJldHVybiAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNHbG9iYWwoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+Z2xvYmFsOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0R2xvYmFsKCk6IHZvaWQKewokdGhpcy0+Z2xvYmFsID0gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbGF0Zm9ybTsKCnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4ZWN1dGFibGVGaW5kZXI7CgpjbGFzcyBIaHZtRGV0ZWN0b3IKewoKcHJpdmF0ZSBzdGF0aWMgJGhodm1WZXJzaW9uID0gbnVsbDsKCnByaXZhdGUgJGV4ZWN1dGFibGVGaW5kZXI7Cgpwcml2YXRlICRwcm9jZXNzRXhlY3V0b3I7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0V4ZWN1dGFibGVGaW5kZXIgJGV4ZWN1dGFibGVGaW5kZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzRXhlY3V0b3IgPSBudWxsKQp7CiR0aGlzLT5leGVjdXRhYmxlRmluZGVyID0gJGV4ZWN1dGFibGVGaW5kZXI7CiR0aGlzLT5wcm9jZXNzRXhlY3V0b3IgPSAkcHJvY2Vzc0V4ZWN1dG9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CnNlbGY6OiRoaHZtVmVyc2lvbiA9IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCk6ID9zdHJpbmcKewppZiAobnVsbCAhPT0gc2VsZjo6JGhodm1WZXJzaW9uKSB7CnJldHVybiBzZWxmOjokaGh2bVZlcnNpb24gPzogbnVsbDsKfQoKc2VsZjo6JGhodm1WZXJzaW9uID0gZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykgPyBISFZNX1ZFUlNJT04gOiBudWxsOwppZiAoc2VsZjo6JGhodm1WZXJzaW9uID09PSBudWxsICYmICFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKc2VsZjo6JGhodm1WZXJzaW9uID0gZmFsc2U7CiR0aGlzLT5leGVjdXRhYmxlRmluZGVyID0gJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXIgPzogbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKJGhodm1QYXRoID0gJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXItPmZpbmQoJ2hodm0nKTsKaWYgKCRoaHZtUGF0aCAhPT0gbnVsbCkgewokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCk7CiRleGl0Q29kZSA9ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3ItPmV4ZWN1dGUoWyRoaHZtUGF0aCwgJy0tcGhwJywgJy1kJywgJ2hodm0uaml0PTAnLCAnLXInLCAnZWNobyBISFZNX1ZFUlNJT047J10sIHNlbGY6OiRoaHZtVmVyc2lvbik7CmlmICgkZXhpdENvZGUgIT09IDApIHsKc2VsZjo6JGhodm1WZXJzaW9uID0gZmFsc2U7Cn0KfQp9CgpyZXR1cm4gc2VsZjo6JGhodm1WZXJzaW9uID86IG51bGw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGxhdGZvcm07CgpjbGFzcyBSdW50aW1lCnsKCgoKcHVibGljIGZ1bmN0aW9uIGhhc0NvbnN0YW50KHN0cmluZyAkY29uc3RhbnQsID9zdHJpbmcgJGNsYXNzID0gbnVsbCk6IGJvb2wKewpyZXR1cm4gZGVmaW5lZChsdHJpbSgkY2xhc3MuJzo6Jy4kY29uc3RhbnQsICc6JykpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25zdGFudChzdHJpbmcgJGNvbnN0YW50LCA/c3RyaW5nICRjbGFzcyA9IG51bGwpCnsKcmV0dXJuIGNvbnN0YW50KGx0cmltKCRjbGFzcy4nOjonLiRjb25zdGFudCwgJzonKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNGdW5jdGlvbihzdHJpbmcgJGZuKTogYm9vbAp7CnJldHVybiBmdW5jdGlvbl9leGlzdHMoJGZuKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW52b2tlKGNhbGxhYmxlICRjYWxsYWJsZSwgYXJyYXkgJGFyZ3VtZW50cyA9IFtdKQp7CnJldHVybiAkY2FsbGFibGUoLi4uJGFyZ3VtZW50cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNDbGFzcyhzdHJpbmcgJGNsYXNzKTogYm9vbAp7CnJldHVybiBjbGFzc19leGlzdHMoJGNsYXNzLCBmYWxzZSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb25zdHJ1Y3Qoc3RyaW5nICRjbGFzcywgYXJyYXkgJGFyZ3VtZW50cyA9IFtdKTogb2JqZWN0CnsKaWYgKGVtcHR5KCRhcmd1bWVudHMpKSB7CnJldHVybiBuZXcgJGNsYXNzOwp9CgokcmVmbCA9IG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcyk7CgpyZXR1cm4gJHJlZmwtPm5ld0luc3RhbmNlQXJncygkYXJndW1lbnRzKTsKfQoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFeHRlbnNpb25zKCk6IGFycmF5CnsKcmV0dXJuIGdldF9sb2FkZWRfZXh0ZW5zaW9ucygpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uVmVyc2lvbihzdHJpbmcgJGV4dGVuc2lvbik6IHN0cmluZwp7CiR2ZXJzaW9uID0gcGhwdmVyc2lvbigkZXh0ZW5zaW9uKTsKaWYgKCR2ZXJzaW9uID09PSBmYWxzZSkgewokdmVyc2lvbiA9ICcwJzsKfQoKcmV0dXJuICR2ZXJzaW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9uSW5mbyhzdHJpbmcgJGV4dGVuc2lvbik6IHN0cmluZwp7CiRyZWZsZWN0b3IgPSBuZXcgXFJlZmxlY3Rpb25FeHRlbnNpb24oJGV4dGVuc2lvbik7CgpvYl9zdGFydCgpOwokcmVmbGVjdG9yLT5pbmZvKCk7CgpyZXR1cm4gb2JfZ2V0X2NsZWFuKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGxhdGZvcm07Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgVmVyc2lvbgp7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZU9wZW5zc2woc3RyaW5nICRvcGVuc3NsVmVyc2lvbiwgP2Jvb2wgJiRpc0ZpcHMpOiA/c3RyaW5nCnsKJGlzRmlwcyA9IGZhbHNlOwoKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXig/PHZlcnNpb24+WzAtOS5dKykoPzxwYXRjaD5bYS16XXswLDJ9KSg/PHN1ZmZpeD4oPzotPyg/OmRldnxwcmV8YWxwaGF8YmV0YXxyY3xmaXBzKVtcZF0qKSopKD86LVx3Kyk/KD86IFwoLis/XCkpPyQvJywgJG9wZW5zc2xWZXJzaW9uLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCgokcGF0Y2ggPSAnJzsKaWYgKHZlcnNpb25fY29tcGFyZSgkbWF0Y2hlc1sndmVyc2lvbiddLCAnMy4wLjAnLCAnPCcpKSB7CiRwYXRjaCA9ICcuJy5zZWxmOjpjb252ZXJ0QWxwaGFWZXJzaW9uVG9JbnRWZXJzaW9uKCRtYXRjaGVzWydwYXRjaCddKTsKfQoKJGlzRmlwcyA9IHN0cnBvcygkbWF0Y2hlc1snc3VmZml4J10sICdmaXBzJykgIT09IGZhbHNlOwokc3VmZml4ID0gc3RydHIoJy0nLmx0cmltKCRtYXRjaGVzWydzdWZmaXgnXSwgJy0nKSwgWyctZmlwcycgPT4gJycsICctcHJlJyA9PiAnLWFscGhhJ10pOwoKcmV0dXJuIHJ0cmltKCRtYXRjaGVzWyd2ZXJzaW9uJ10uJHBhdGNoLiRzdWZmaXgsICctJyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcGFyc2VMaWJqcGVnKHN0cmluZyAkbGlianBlZ1ZlcnNpb24pOiA/c3RyaW5nCnsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXig/PG1ham9yPlxkKykoPzxtaW5vcj5bYS16XSopJC8nLCAkbGlianBlZ1ZlcnNpb24sICRtYXRjaGVzKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRtYXRjaGVzWydtYWpvciddLicuJy5zZWxmOjpjb252ZXJ0QWxwaGFWZXJzaW9uVG9JbnRWZXJzaW9uKCRtYXRjaGVzWydtaW5vciddKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZVpvbmVpbmZvVmVyc2lvbihzdHJpbmcgJHpvbmVpbmZvVmVyc2lvbik6ID9zdHJpbmcKewppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eKD88eWVhcj5cZHs0fSkoPzxyZXZpc2lvbj5bYS16XSopJC8nLCAkem9uZWluZm9WZXJzaW9uLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkbWF0Y2hlc1sneWVhciddLicuJy5zZWxmOjpjb252ZXJ0QWxwaGFWZXJzaW9uVG9JbnRWZXJzaW9uKCRtYXRjaGVzWydyZXZpc2lvbiddKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY29udmVydEFscGhhVmVyc2lvblRvSW50VmVyc2lvbihzdHJpbmcgJGFscGhhKTogaW50CnsKcmV0dXJuIHN0cmxlbigkYWxwaGEpICogKC1vcmQoJ2EnKSArIDEpICsgYXJyYXlfc3VtKGFycmF5X21hcCgnb3JkJywgc3RyX3NwbGl0KCRhbHBoYSkpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0TGlieHBtVmVyc2lvbklkKGludCAkdmVyc2lvbklkKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6OmNvbnZlcnRWZXJzaW9uSWQoJHZlcnNpb25JZCwgMTAwKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0T3BlbmxkYXBWZXJzaW9uSWQoaW50ICR2ZXJzaW9uSWQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6Y29udmVydFZlcnNpb25JZCgkdmVyc2lvbklkLCAxMDApOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjb252ZXJ0VmVyc2lvbklkKGludCAkdmVyc2lvbklkLCBpbnQgJGJhc2UpOiBzdHJpbmcKewpyZXR1cm4gc3ByaW50ZigKJyVkLiVkLiVkJywKJHZlcnNpb25JZCAvICgkYmFzZSAqICRiYXNlKSwKKGludCkgKCR2ZXJzaW9uSWQgLyAkYmFzZSkgJSAkYmFzZSwKJHZlcnNpb25JZCAlICRiYXNlCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luXENhcGFiaWxpdHk7CgoKCgoKCgppbnRlcmZhY2UgQ2FwYWJpbGl0eQp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpblxDYXBhYmlsaXR5OwoKCgoKCgoKCgoKCmludGVyZmFjZSBDb21tYW5kUHJvdmlkZXIgZXh0ZW5kcyBDYXBhYmlsaXR5CnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZHMoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKCgoKCgoKCmludGVyZmFjZSBDYXBhYmxlCnsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENhcGFiaWxpdGllcygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgQ29tbWFuZEV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRjb21tYW5kTmFtZTsKCgoKCnByaXZhdGUgJGlucHV0OwoKCgoKcHJpdmF0ZSAkb3V0cHV0OwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBzdHJpbmcgJGNvbW1hbmROYW1lLCBJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBhcnJheSAkYXJncyA9IFtdLCBhcnJheSAkZmxhZ3MgPSBbXSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lLCAkYXJncywgJGZsYWdzKTsKJHRoaXMtPmNvbW1hbmROYW1lID0gJGNvbW1hbmROYW1lOwokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKTogSW5wdXRJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3V0cHV0KCk6IE91dHB1dEludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kTmFtZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uOwoKY2xhc3MgUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbiBleHRlbmRzIFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCgoKCgoKY2xhc3MgUGx1Z2luRXZlbnRzCnsKCgoKCgoKCgpwdWJsaWMgY29uc3QgSU5JVCA9ICdpbml0JzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IENPTU1BTkQgPSAnY29tbWFuZCc7CgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfRklMRV9ET1dOTE9BRCA9ICdwcmUtZmlsZS1kb3dubG9hZCc7CgoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX0ZJTEVfRE9XTkxPQUQgPSAncG9zdC1maWxlLWRvd25sb2FkJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9DT01NQU5EX1JVTiA9ICdwcmUtY29tbWFuZC1ydW4nOwoKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBSRV9QT09MX0NSRUFURSA9ICdwcmUtcG9vbC1jcmVhdGUnOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgoKaW50ZXJmYWNlIFBsdWdpbkludGVyZmFjZQp7CgoKCgoKCgoKCgpwdWJsaWMgY29uc3QgUExVR0lOX0FQSV9WRVJTSU9OID0gJzIuOS4wJzsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFjdGl2YXRlKENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvKTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWFjdGl2YXRlKENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5pbnN0YWxsKENvbXBvc2VyICRjb21wb3NlciwgSU9JbnRlcmZhY2UgJGlvKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50U3Vic2NyaWJlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsZXJJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9ja2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGFydGlhbENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxJbnN0YWxsZWRSZXBvc2l0b3J5Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5VXRpbHM7CnVzZSBDb21wb3NlclxSZXBvc2l0b3J5XFJvb3RQYWNrYWdlUmVwb3NpdG9yeTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxQbHVnaW5cQ2FwYWJpbGl0eVxDYXBhYmlsaXR5Owp1c2UgQ29tcG9zZXJcVXRpbFxQYWNrYWdlU29ydGVyOwoKCgoKCgoKY2xhc3MgUGx1Z2luTWFuYWdlcgp7Cgpwcm90ZWN0ZWQgJGNvbXBvc2VyOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkZ2xvYmFsQ29tcG9zZXI7Cgpwcm90ZWN0ZWQgJHZlcnNpb25QYXJzZXI7Cgpwcm90ZWN0ZWQgJGRpc2FibGVQbHVnaW5zID0gZmFsc2U7CgoKcHJvdGVjdGVkICRwbHVnaW5zID0gW107Cgpwcm90ZWN0ZWQgJHJlZ2lzdGVyZWRQbHVnaW5zID0gW107CgoKCgpwcml2YXRlICRhbGxvd1BsdWdpblJ1bGVzOwoKCgoKcHJpdmF0ZSAkYWxsb3dHbG9iYWxQbHVnaW5SdWxlczsKCgpwcml2YXRlICRydW5uaW5nSW5HbG9iYWxEaXIgPSBmYWxzZTsKCgpwcml2YXRlIHN0YXRpYyAkY2xhc3NDb3VudGVyID0gMDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbXBvc2VyICRjb21wb3NlciwgP1BhcnRpYWxDb21wb3NlciAkZ2xvYmFsQ29tcG9zZXIgPSBudWxsLCAkZGlzYWJsZVBsdWdpbnMgPSBmYWxzZSkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmdsb2JhbENvbXBvc2VyID0gJGdsb2JhbENvbXBvc2VyOwokdGhpcy0+dmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiR0aGlzLT5kaXNhYmxlUGx1Z2lucyA9ICRkaXNhYmxlUGx1Z2luczsKJHRoaXMtPmFsbG93UGx1Z2luUnVsZXMgPSAkdGhpcy0+cGFyc2VBbGxvd2VkUGx1Z2lucygkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ2FsbG93LXBsdWdpbnMnKSwgJGNvbXBvc2VyLT5nZXRMb2NrZXIoKSk7CiR0aGlzLT5hbGxvd0dsb2JhbFBsdWdpblJ1bGVzID0gJHRoaXMtPnBhcnNlQWxsb3dlZFBsdWdpbnMoJGdsb2JhbENvbXBvc2VyICE9PSBudWxsID8gJGdsb2JhbENvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCdhbGxvdy1wbHVnaW5zJykgOiBmYWxzZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRSdW5uaW5nSW5HbG9iYWxEaXIoYm9vbCAkcnVubmluZ0luR2xvYmFsRGlyKTogdm9pZAp7CiR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPSAkcnVubmluZ0luR2xvYmFsRGlyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZEluc3RhbGxlZFBsdWdpbnMoKTogdm9pZAp7CmlmICghJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgnbG9jYWwnKSkgewokcmVwbyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiR0aGlzLT5sb2FkUmVwb3NpdG9yeSgkcmVwbywgZmFsc2UsICR0aGlzLT5jb21wb3Nlci0+Z2V0UGFja2FnZSgpKTsKfQoKaWYgKCR0aGlzLT5nbG9iYWxDb21wb3NlciAhPT0gbnVsbCAmJiAhJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgnZ2xvYmFsJykpIHsKJHRoaXMtPmxvYWRSZXBvc2l0b3J5KCR0aGlzLT5nbG9iYWxDb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCksIHRydWUpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWFjdGl2YXRlSW5zdGFsbGVkUGx1Z2lucygpOiB2b2lkCnsKaWYgKCEkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCdsb2NhbCcpKSB7CiRyZXBvID0gJHRoaXMtPmNvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKJHRoaXMtPmRlYWN0aXZhdGVSZXBvc2l0b3J5KCRyZXBvLCBmYWxzZSk7Cn0KCmlmICgkdGhpcy0+Z2xvYmFsQ29tcG9zZXIgIT09IG51bGwgJiYgISR0aGlzLT5hcmVQbHVnaW5zRGlzYWJsZWQoJ2dsb2JhbCcpKSB7CiR0aGlzLT5kZWFjdGl2YXRlUmVwb3NpdG9yeSgkdGhpcy0+Z2xvYmFsQ29tcG9zZXItPmdldFJlcG9zaXRvcnlNYW5hZ2VyKCktPmdldExvY2FsUmVwb3NpdG9yeSgpLCB0cnVlKTsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQbHVnaW5zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wbHVnaW5zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZFBsdWdpbnMoKTogYXJyYXkKewpyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0R2xvYmFsQ29tcG9zZXIoKTogP1BhcnRpYWxDb21wb3Nlcgp7CnJldHVybiAkdGhpcy0+Z2xvYmFsQ29tcG9zZXI7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBib29sICRmYWlsT25NaXNzaW5nQ2xhc3NlcyA9IGZhbHNlLCBib29sICRpc0dsb2JhbFBsdWdpbiA9IGZhbHNlKTogdm9pZAp7CmlmICgkdGhpcy0+YXJlUGx1Z2luc0Rpc2FibGVkKCRpc0dsb2JhbFBsdWdpbiA/ICdnbG9iYWwnIDogJ2xvY2FsJykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicuJHBhY2thZ2UtPmdldE5hbWUoKS4nIiBwbHVnaW4gd2FzIG5vdCBsb2FkZWQgYXMgcGx1Z2lucyBhcmUgZGlzYWJsZWQuPC93YXJuaW5nPicpOwoKcmV0dXJuOwp9CgppZiAoJHBhY2thZ2UtPmdldFR5cGUoKSA9PT0gJ2NvbXBvc2VyLXBsdWdpbicpIHsKJHJlcXVpcmVzQ29tcG9zZXIgPSBudWxsOwpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgeyAKaWYgKCdjb21wb3Nlci1wbHVnaW4tYXBpJyA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiRyZXF1aXJlc0NvbXBvc2VyID0gJGxpbmstPmdldENvbnN0cmFpbnQoKTsKYnJlYWs7Cn0KfQoKaWYgKCEkcmVxdWlyZXNDb21wb3Nlcikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlBsdWdpbiAiLiRwYWNrYWdlLT5nZXROYW1lKCkuIiBpcyBtaXNzaW5nIGEgcmVxdWlyZSBzdGF0ZW1lbnQgZm9yIGEgdmVyc2lvbiBvZiB0aGUgY29tcG9zZXItcGx1Z2luLWFwaSBwYWNrYWdlLiIpOwp9CgokY3VycmVudFBsdWdpbkFwaVZlcnNpb24gPSAkdGhpcy0+Z2V0UGx1Z2luQXBpVmVyc2lvbigpOwokY3VycmVudFBsdWdpbkFwaUNvbnN0cmFpbnQgPSBuZXcgQ29uc3RyYWludCgnPT0nLCAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRjdXJyZW50UGx1Z2luQXBpVmVyc2lvbikpOwoKaWYgKCRyZXF1aXJlc0NvbXBvc2VyLT5nZXRQcmV0dHlTdHJpbmcoKSA9PT0gJHRoaXMtPmdldFBsdWdpbkFwaVZlcnNpb24oKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoZSAiJyAuICRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiBwbHVnaW4gcmVxdWlyZXMgY29tcG9zZXItcGx1Z2luLWFwaSAnLiR0aGlzLT5nZXRQbHVnaW5BcGlWZXJzaW9uKCkuJywgdGhpcyAqV0lMTCogYnJlYWsgaW4gdGhlIGZ1dHVyZSBhbmQgaXQgc2hvdWxkIGJlIGZpeGVkIEFTQVAgKHJlcXVpcmUgXicuJHRoaXMtPmdldFBsdWdpbkFwaVZlcnNpb24oKS4nIGluc3RlYWQgZm9yIGV4YW1wbGUpLjwvd2FybmluZz4nKTsKfSBlbHNlaWYgKCEkcmVxdWlyZXNDb21wb3Nlci0+bWF0Y2hlcygkY3VycmVudFBsdWdpbkFwaUNvbnN0cmFpbnQpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInIC4gJHBhY2thZ2UtPmdldE5hbWUoKSAuICciIHBsdWdpbiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLid3YXMgc2tpcHBlZCBiZWNhdXNlIGl0IHJlcXVpcmVzIGEgUGx1Z2luIEFQSSB2ZXJzaW9uICgiJyAuICRyZXF1aXJlc0NvbXBvc2VyLT5nZXRQcmV0dHlTdHJpbmcoKSAuICciKSB0aGF0IGRvZXMgbm90IG1hdGNoIHlvdXIgQ29tcG9zZXIgaW5zdGFsbGF0aW9uICgiJyAuICRjdXJyZW50UGx1Z2luQXBpVmVyc2lvbiAuICciKS4gWW91IG1heSBuZWVkIHRvIHJ1biBjb21wb3NlciB1cGRhdGUgd2l0aCB0aGUgIi0tbm8tcGx1Z2lucyIgb3B0aW9uLjwvd2FybmluZz4nKTsKCnJldHVybjsKfQoKaWYgKCRwYWNrYWdlLT5nZXROYW1lKCkgPT09ICdzeW1mb255L2ZsZXgnICYmIFByZWc6OmlzTWF0Y2goJ3teWzAtOS5dKyR9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkgJiYgdmVyc2lvbl9jb21wYXJlKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCksICcxLjkuOCcsICc8JykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5UaGUgIicgLiAkcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgcGx1Z2luICcuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyhpbnN0YWxsZWQgZ2xvYmFsbHkpICcgOiAnJykuJ3dhcyBza2lwcGVkIGJlY2F1c2UgaXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBDb21wb3NlciAyKy4gTWFrZSBzdXJlIHRvIHVwZGF0ZSBpdCB0byB2ZXJzaW9uIDEuOS44IG9yIGdyZWF0ZXIuPC93YXJuaW5nPicpOwoKcmV0dXJuOwp9Cn0KCmlmICghJHRoaXMtPmlzUGx1Z2luQWxsb3dlZCgkcGFja2FnZS0+Z2V0TmFtZSgpLCAkaXNHbG9iYWxQbHVnaW4sIHRydWUgPT09ICgkcGFja2FnZS0+Z2V0RXh0cmEoKVsncGx1Z2luLW9wdGlvbmFsJ10gPz8gZmFsc2UpKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1NraXBwZWQgbG9hZGluZyAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nYXMgaXQgaXMgbm90IGluIGNvbmZpZy5hbGxvdy1wbHVnaW5zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCnJldHVybjsKfQoKJG9sZEluc3RhbGxlclBsdWdpbiA9ICgkcGFja2FnZS0+Z2V0VHlwZSgpID09PSAnY29tcG9zZXItaW5zdGFsbGVyJyk7CgppZiAoaXNzZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpyZXR1cm47Cn0KCiRleHRyYSA9ICRwYWNrYWdlLT5nZXRFeHRyYSgpOwppZiAoZW1wdHkoJGV4dHJhWydjbGFzcyddKSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnLiRwYWNrYWdlLT5nZXRQcmV0dHlOYW1lKCkuJywgY29tcG9zZXItcGx1Z2luIHBhY2thZ2VzIHNob3VsZCBoYXZlIGEgY2xhc3MgZGVmaW5lZCBpbiB0aGVpciBleHRyYSBrZXkgdG8gYmUgdXNhYmxlLicpOwp9CiRjbGFzc2VzID0gaXNfYXJyYXkoJGV4dHJhWydjbGFzcyddKSA/ICRleHRyYVsnY2xhc3MnXSA6IFskZXh0cmFbJ2NsYXNzJ11dOwoKJGxvY2FsUmVwbyA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0UmVwb3NpdG9yeU1hbmFnZXIoKS0+Z2V0TG9jYWxSZXBvc2l0b3J5KCk7CiRnbG9iYWxSZXBvID0gJHRoaXMtPmdsb2JhbENvbXBvc2VyICE9PSBudWxsID8gJHRoaXMtPmdsb2JhbENvbXBvc2VyLT5nZXRSZXBvc2l0b3J5TWFuYWdlcigpLT5nZXRMb2NhbFJlcG9zaXRvcnkoKSA6IG51bGw7Cgokcm9vdFBhY2thZ2UgPSBjbG9uZSAkdGhpcy0+Y29tcG9zZXItPmdldFBhY2thZ2UoKTsKCgoKJHJvb3RQYWNrYWdlQXV0b2xvYWRzID0gJHJvb3RQYWNrYWdlLT5nZXRBdXRvbG9hZCgpOwokcm9vdFBhY2thZ2VBdXRvbG9hZHNbJ2ZpbGVzJ10gPSBbXTsKJHJvb3RQYWNrYWdlLT5zZXRBdXRvbG9hZCgkcm9vdFBhY2thZ2VBdXRvbG9hZHMpOwokcm9vdFBhY2thZ2VBdXRvbG9hZHMgPSAkcm9vdFBhY2thZ2UtPmdldERldkF1dG9sb2FkKCk7CiRyb290UGFja2FnZUF1dG9sb2Fkc1snZmlsZXMnXSA9IFtdOwokcm9vdFBhY2thZ2UtPnNldERldkF1dG9sb2FkKCRyb290UGFja2FnZUF1dG9sb2Fkcyk7CnVuc2V0KCRyb290UGFja2FnZUF1dG9sb2Fkcyk7Cgokcm9vdFBhY2thZ2VSZXBvID0gbmV3IFJvb3RQYWNrYWdlUmVwb3NpdG9yeSgkcm9vdFBhY2thZ2UpOwokaW5zdGFsbGVkUmVwbyA9IG5ldyBJbnN0YWxsZWRSZXBvc2l0b3J5KFskbG9jYWxSZXBvLCAkcm9vdFBhY2thZ2VSZXBvXSk7CmlmICgkZ2xvYmFsUmVwbykgewokaW5zdGFsbGVkUmVwby0+YWRkUmVwb3NpdG9yeSgkZ2xvYmFsUmVwbyk7Cn0KCiRhdXRvbG9hZFBhY2thZ2VzID0gWyRwYWNrYWdlLT5nZXROYW1lKCkgPT4gJHBhY2thZ2VdOwokYXV0b2xvYWRQYWNrYWdlcyA9ICR0aGlzLT5jb2xsZWN0RGVwZW5kZW5jaWVzKCRpbnN0YWxsZWRSZXBvLCAkYXV0b2xvYWRQYWNrYWdlcywgJHBhY2thZ2UpOwoKJGdlbmVyYXRvciA9ICR0aGlzLT5jb21wb3Nlci0+Z2V0QXV0b2xvYWRHZW5lcmF0b3IoKTsKJGF1dG9sb2FkcyA9IFtbJHJvb3RQYWNrYWdlLCAnJ11dOwpmb3JlYWNoICgkYXV0b2xvYWRQYWNrYWdlcyBhcyAkYXV0b2xvYWRQYWNrYWdlKSB7CmlmICgkYXV0b2xvYWRQYWNrYWdlID09PSAkcm9vdFBhY2thZ2UpIHsKY29udGludWU7Cn0KCiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5nZXRJbnN0YWxsUGF0aCgkYXV0b2xvYWRQYWNrYWdlLCAkZ2xvYmFsUmVwbyAmJiAkZ2xvYmFsUmVwby0+aGFzUGFja2FnZSgkYXV0b2xvYWRQYWNrYWdlKSk7CmlmICgkaW5zdGFsbFBhdGggPT09IG51bGwpIHsKY29udGludWU7Cn0KJGF1dG9sb2Fkc1tdID0gWyRhdXRvbG9hZFBhY2thZ2UsICRpbnN0YWxsUGF0aF07Cn0KCiRtYXAgPSAkZ2VuZXJhdG9yLT5wYXJzZUF1dG9sb2FkcygkYXV0b2xvYWRzLCAkcm9vdFBhY2thZ2UpOwokY2xhc3NMb2FkZXIgPSAkZ2VuZXJhdG9yLT5jcmVhdGVMb2FkZXIoJG1hcCwgJHRoaXMtPmNvbXBvc2VyLT5nZXRDb25maWcoKS0+Z2V0KCd2ZW5kb3ItZGlyJykpOwokY2xhc3NMb2FkZXItPnJlZ2lzdGVyKGZhbHNlKTsKCmZvcmVhY2ggKCRtYXBbJ2ZpbGVzJ10gYXMgJGZpbGVJZGVudGlmaWVyID0+ICRmaWxlKSB7CgoKCmlmICgkZmlsZUlkZW50aWZpZXIgPT09ICc3ZTliZDYxMmNjNDQ0YjNlZWQ3ODhlYmJlNDYyNjNhMCcpIHsKY29udGludWU7Cn0KXENvbXBvc2VyXEF1dG9sb2FkXGNvbXBvc2VyUmVxdWlyZSgkZmlsZUlkZW50aWZpZXIsICRmaWxlKTsKfQoKZm9yZWFjaCAoJGNsYXNzZXMgYXMgJGNsYXNzKSB7CmlmIChjbGFzc19leGlzdHMoJGNsYXNzLCBmYWxzZSkpIHsKJGNsYXNzID0gdHJpbSgkY2xhc3MsICdcXCcpOwokcGF0aCA9ICRjbGFzc0xvYWRlci0+ZmluZEZpbGUoJGNsYXNzKTsKJGNvZGUgPSBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiRzZXBhcmF0b3JQb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJyk7CiRjbGFzc05hbWUgPSAkY2xhc3M7CmlmICgkc2VwYXJhdG9yUG9zKSB7CiRjbGFzc05hbWUgPSBzdWJzdHIoJGNsYXNzLCAkc2VwYXJhdG9yUG9zICsgMSk7Cn0KJGNvZGUgPSBQcmVnOjpyZXBsYWNlKCd7XigoPzooPzpmaW5hbHxyZWFkb25seSlccyspKig/OlxzKikpY2xhc3NccysoJy5wcmVnX3F1b3RlKCRjbGFzc05hbWUpLicpfW1pJywgJyQxY2xhc3MgJDJfY29tcG9zZXJfdG1wJy5zZWxmOjokY2xhc3NDb3VudGVyLCAkY29kZSwgMSk7CiRjb2RlID0gc3RydHIoJGNvZGUsIFsKJ19fRklMRV9fJyA9PiB2YXJfZXhwb3J0KCRwYXRoLCB0cnVlKSwKJ19fRElSX18nID0+IHZhcl9leHBvcnQoZGlybmFtZSgkcGF0aCksIHRydWUpLAonX19DTEFTU19fJyA9PiB2YXJfZXhwb3J0KCRjbGFzcywgdHJ1ZSksCl0pOwokY29kZSA9IFByZWc6OnJlcGxhY2UoJy9eXHMqPFw/KHBocCk/L2knLCAnJywgJGNvZGUsIDEpOwpldmFsKCRjb2RlKTsKJGNsYXNzIC49ICdfY29tcG9zZXJfdG1wJy5zZWxmOjokY2xhc3NDb3VudGVyOwpzZWxmOjokY2xhc3NDb3VudGVyKys7Cn0KCmlmICgkb2xkSW5zdGFsbGVyUGx1Z2luKSB7CmlmICghaXNfYSgkY2xhc3MsICdDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGVySW50ZXJmYWNlJywgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgYWN0aXZhdGUgcGx1Z2luICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgYXMgIicuJGNsYXNzLiciIGRvZXMgbm90IGltcGxlbWVudCBDb21wb3NlclxJbnN0YWxsZXJcSW5zdGFsbGVySW50ZXJmYWNlJyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Mb2FkaW5nICInLiRwYWNrYWdlLT5nZXROYW1lKCkgLiAnIiAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICcoaW5zdGFsbGVkIGdsb2JhbGx5KSAnIDogJycpLid3aGljaCBpcyBhIGxlZ2FjeSBjb21wb3Nlci1pbnN0YWxsZXIgYnVpbHQgZm9yIENvbXBvc2VyIDEueCwgaXQgaXMgbGlrZWx5IHRvIGNhdXNlIGlzc3VlcyBhcyB5b3UgYXJlIHJ1bm5pbmcgQ29tcG9zZXIgMi54Ljwvd2FybmluZz4nKTsKJGluc3RhbGxlciA9IG5ldyAkY2xhc3MoJHRoaXMtPmlvLCAkdGhpcy0+Y29tcG9zZXIpOwokdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+YWRkSW5zdGFsbGVyKCRpbnN0YWxsZXIpOwokdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV1bXSA9ICRpbnN0YWxsZXI7Cn0gZWxzZWlmIChjbGFzc19leGlzdHMoJGNsYXNzKSkgewppZiAoIWlzX2EoJGNsYXNzLCAnQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkludGVyZmFjZScsIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGFjdGl2YXRlIHBsdWdpbiAiJy4kcGFja2FnZS0+Z2V0TmFtZSgpLiciIGFzICInLiRjbGFzcy4nIiBkb2VzIG5vdCBpbXBsZW1lbnQgQ29tcG9zZXJcUGx1Z2luXFBsdWdpbkludGVyZmFjZScpOwp9CiRwbHVnaW4gPSBuZXcgJGNsYXNzKCk7CiR0aGlzLT5hZGRQbHVnaW4oJHBsdWdpbiwgJGlzR2xvYmFsUGx1Z2luLCAkcGFja2FnZSk7CiR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXVtdID0gJHBsdWdpbjsKfSBlbHNlaWYgKCRmYWlsT25NaXNzaW5nQ2xhc3Nlcykgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignUGx1Z2luICcuJHBhY2thZ2UtPmdldE5hbWUoKS4nIGNvdWxkIG5vdCBiZSBpbml0aWFsaXplZCwgY2xhc3Mgbm90IGZvdW5kOiAnLiRjbGFzcyk7Cn0KfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWFjdGl2YXRlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmlmICghaXNzZXQoJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewpyZXR1cm47Cn0KCiRwbHVnaW5zID0gJHRoaXMtPnJlZ2lzdGVyZWRQbHVnaW5zWyRwYWNrYWdlLT5nZXROYW1lKCldOwpmb3JlYWNoICgkcGx1Z2lucyBhcyAkcGx1Z2luKSB7CmlmICgkcGx1Z2luIGluc3RhbmNlb2YgSW5zdGFsbGVySW50ZXJmYWNlKSB7CiR0aGlzLT5jb21wb3Nlci0+Z2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpLT5yZW1vdmVJbnN0YWxsZXIoJHBsdWdpbik7Cn0gZWxzZSB7CiR0aGlzLT5yZW1vdmVQbHVnaW4oJHBsdWdpbik7Cn0KfQp1bnNldCgkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV0pOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGxQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCFpc3NldCgkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CnJldHVybjsKfQoKJHBsdWdpbnMgPSAkdGhpcy0+cmVnaXN0ZXJlZFBsdWdpbnNbJHBhY2thZ2UtPmdldE5hbWUoKV07CmZvcmVhY2ggKCRwbHVnaW5zIGFzICRwbHVnaW4pIHsKaWYgKCRwbHVnaW4gaW5zdGFuY2VvZiBJbnN0YWxsZXJJbnRlcmZhY2UpIHsKJHRoaXMtPmNvbXBvc2VyLT5nZXRJbnN0YWxsYXRpb25NYW5hZ2VyKCktPnJlbW92ZUluc3RhbGxlcigkcGx1Z2luKTsKfSBlbHNlIHsKJHRoaXMtPnJlbW92ZVBsdWdpbigkcGx1Z2luKTsKJHRoaXMtPnVuaW5zdGFsbFBsdWdpbigkcGx1Z2luKTsKfQp9CnVuc2V0KCR0aGlzLT5yZWdpc3RlcmVkUGx1Z2luc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQbHVnaW5BcGlWZXJzaW9uKCk6IHN0cmluZwp7CnJldHVybiBQbHVnaW5JbnRlcmZhY2U6OlBMVUdJTl9BUElfVkVSU0lPTjsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQbHVnaW4oUGx1Z2luSW50ZXJmYWNlICRwbHVnaW4sIGJvb2wgJGlzR2xvYmFsUGx1Z2luID0gZmFsc2UsID9QYWNrYWdlSW50ZXJmYWNlICRzb3VyY2VQYWNrYWdlID0gbnVsbCk6IHZvaWQKewppZiAoJHRoaXMtPmFyZVBsdWdpbnNEaXNhYmxlZCgkaXNHbG9iYWxQbHVnaW4gPyAnZ2xvYmFsJyA6ICdsb2NhbCcpKSB7CnJldHVybjsKfQoKaWYgKCRzb3VyY2VQYWNrYWdlID09PSBudWxsKSB7CnRyaWdnZXJfZXJyb3IoJ0NhbGxpbmcgUGx1Z2luTWFuYWdlcjo6YWRkUGx1Z2luIHdpdGhvdXQgJHNvdXJjZVBhY2thZ2UgaXMgZGVwcmVjYXRlZCwgaWYgeW91IGFyZSB1c2luZyB0aGlzIHBsZWFzZSBnZXQgaW4gdG91Y2ggd2l0aCB1cyB0byBleHBsYWluIHRoZSB1c2UgY2FzZScsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfSBlbHNlaWYgKCEkdGhpcy0+aXNQbHVnaW5BbGxvd2VkKCRzb3VyY2VQYWNrYWdlLT5nZXROYW1lKCksICRpc0dsb2JhbFBsdWdpbiwgdHJ1ZSA9PT0gKCRzb3VyY2VQYWNrYWdlLT5nZXRFeHRyYSgpWydwbHVnaW4tb3B0aW9uYWwnXSA/PyBmYWxzZSkpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignU2tpcHBlZCBsb2FkaW5nICInLmdldF9jbGFzcygkcGx1Z2luKS4nIGZyb20gJy4kc291cmNlUGFja2FnZS0+Z2V0TmFtZSgpIC4gJyIgJy4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnKGluc3RhbGxlZCBnbG9iYWxseSkgJyA6ICcnKS4nIGFzIGl0IGlzIG5vdCBpbiBjb25maWcuYWxsb3ctcGx1Z2lucycsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CgpyZXR1cm47Cn0KCiRkZXRhaWxzID0gW107CmlmICgkc291cmNlUGFja2FnZSkgewokZGV0YWlsc1tdID0gJ2Zyb20gJy4kc291cmNlUGFja2FnZS0+Z2V0TmFtZSgpOwp9CmlmICgkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpcikgewokZGV0YWlsc1tdID0gJ2luc3RhbGxlZCBnbG9iYWxseSc7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCdMb2FkaW5nIHBsdWdpbiAnLmdldF9jbGFzcygkcGx1Z2luKS4oJGRldGFpbHMgPyAnICgnLmltcGxvZGUoJywgJywgJGRldGFpbHMpLicpJyA6ICcnKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPnBsdWdpbnNbXSA9ICRwbHVnaW47CiRwbHVnaW4tPmFjdGl2YXRlKCR0aGlzLT5jb21wb3NlciwgJHRoaXMtPmlvKTsKCmlmICgkcGx1Z2luIGluc3RhbmNlb2YgRXZlbnRTdWJzY3JpYmVySW50ZXJmYWNlKSB7CiR0aGlzLT5jb21wb3Nlci0+Z2V0RXZlbnREaXNwYXRjaGVyKCktPmFkZFN1YnNjcmliZXIoJHBsdWdpbik7Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVBsdWdpbihQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbik6IHZvaWQKewokaW5kZXggPSBhcnJheV9zZWFyY2goJHBsdWdpbiwgJHRoaXMtPnBsdWdpbnMsIHRydWUpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewpyZXR1cm47Cn0KCiR0aGlzLT5pby0+d3JpdGVFcnJvcignVW5sb2FkaW5nIHBsdWdpbiAnLmdldF9jbGFzcygkcGx1Z2luKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKdW5zZXQoJHRoaXMtPnBsdWdpbnNbJGluZGV4XSk7CiRwbHVnaW4tPmRlYWN0aXZhdGUoJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8pOwoKJHRoaXMtPmNvbXBvc2VyLT5nZXRFdmVudERpc3BhdGNoZXIoKS0+cmVtb3ZlTGlzdGVuZXIoJHBsdWdpbik7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmluc3RhbGxQbHVnaW4oUGx1Z2luSW50ZXJmYWNlICRwbHVnaW4pOiB2b2lkCnsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdVbmluc3RhbGxpbmcgcGx1Z2luICcuZ2V0X2NsYXNzKCRwbHVnaW4pLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokcGx1Z2luLT51bmluc3RhbGwoJHRoaXMtPmNvbXBvc2VyLCAkdGhpcy0+aW8pOwp9CgoKCgoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGJvb2wgJGlzR2xvYmFsUmVwbywgP1Jvb3RQYWNrYWdlSW50ZXJmYWNlICRyb290UGFja2FnZSA9IG51bGwpOiB2b2lkCnsKJHBhY2thZ2VzID0gJHJlcG8tPmdldFBhY2thZ2VzKCk7Cgokd2VpZ2h0cyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlLT5nZXRUeXBlKCkgPT09ICdjb21wb3Nlci1wbHVnaW4nKSB7CiRleHRyYSA9ICRwYWNrYWdlLT5nZXRFeHRyYSgpOwppZiAoJHBhY2thZ2UtPmdldE5hbWUoKSA9PT0gJ2NvbXBvc2VyL2luc3RhbGxlcnMnIHx8IHRydWUgPT09ICgkZXh0cmFbJ3BsdWdpbi1tb2RpZmllcy1pbnN0YWxsLXBhdGgnXSA/PyBmYWxzZSkpIHsKJHdlaWdodHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAtMTAwMDA7Cn0KfQp9Cgokc29ydGVkUGFja2FnZXMgPSBQYWNrYWdlU29ydGVyOjpzb3J0UGFja2FnZXMoJHBhY2thZ2VzLCAkd2VpZ2h0cyk7CmlmICghJGlzR2xvYmFsUmVwbykgewokcmVxdWlyZWRQYWNrYWdlcyA9IFJlcG9zaXRvcnlVdGlsczo6ZmlsdGVyUmVxdWlyZWRQYWNrYWdlcygkcGFja2FnZXMsICRyb290UGFja2FnZSwgdHJ1ZSk7Cn0KCmZvcmVhY2ggKCRzb3J0ZWRQYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoISgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkpIHsKY29udGludWU7Cn0KCmlmICghaW5fYXJyYXkoJHBhY2thZ2UtPmdldFR5cGUoKSwgWydjb21wb3Nlci1wbHVnaW4nLCAnY29tcG9zZXItaW5zdGFsbGVyJ10sIHRydWUpKSB7CmNvbnRpbnVlOwp9CgppZiAoCiEkaXNHbG9iYWxSZXBvCiYmICFpbl9hcnJheSgkcGFja2FnZSwgJHJlcXVpcmVkUGFja2FnZXMsIHRydWUpCiYmICEkdGhpcy0+aXNQbHVnaW5BbGxvd2VkKCRwYWNrYWdlLT5nZXROYW1lKCksIGZhbHNlLCB0cnVlLCBmYWxzZSkKKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+VGhlICInLiRwYWNrYWdlLT5nZXROYW1lKCkuJyIgcGx1Z2luIHdhcyBub3QgbG9hZGVkIGFzIGl0IGlzIG5vdCBsaXN0ZWQgaW4gYWxsb3ctcGx1Z2lucyBhbmQgaXMgbm90IHJlcXVpcmVkIGJ5IHRoZSByb290IHBhY2thZ2UgYW55bW9yZS48L3dhcm5pbmc+Jyk7CmNvbnRpbnVlOwp9CgppZiAoJ2NvbXBvc2VyLXBsdWdpbicgPT09ICRwYWNrYWdlLT5nZXRUeXBlKCkpIHsKJHRoaXMtPnJlZ2lzdGVyUGFja2FnZSgkcGFja2FnZSwgZmFsc2UsICRpc0dsb2JhbFJlcG8pOwoKfSBlbHNlaWYgKCdjb21wb3Nlci1pbnN0YWxsZXInID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CiR0aGlzLT5yZWdpc3RlclBhY2thZ2UoJHBhY2thZ2UsIGZhbHNlLCAkaXNHbG9iYWxSZXBvKTsKfQp9Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlYWN0aXZhdGVSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8sIGJvb2wgJGlzR2xvYmFsUmVwbyk6IHZvaWQKewokcGFja2FnZXMgPSAkcmVwby0+Z2V0UGFja2FnZXMoKTsKJHNvcnRlZFBhY2thZ2VzID0gYXJyYXlfcmV2ZXJzZShQYWNrYWdlU29ydGVyOjpzb3J0UGFja2FnZXMoJHBhY2thZ2VzKSk7Cgpmb3JlYWNoICgkc29ydGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCEoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpKSB7CmNvbnRpbnVlOwp9CmlmICgnY29tcG9zZXItcGx1Z2luJyA9PT0gJHBhY2thZ2UtPmdldFR5cGUoKSkgewokdGhpcy0+ZGVhY3RpdmF0ZVBhY2thZ2UoJHBhY2thZ2UpOwoKfSBlbHNlaWYgKCdjb21wb3Nlci1pbnN0YWxsZXInID09PSAkcGFja2FnZS0+Z2V0VHlwZSgpKSB7CiR0aGlzLT5kZWFjdGl2YXRlUGFja2FnZSgkcGFja2FnZSk7Cn0KfQp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNvbGxlY3REZXBlbmRlbmNpZXMoSW5zdGFsbGVkUmVwb3NpdG9yeSAkaW5zdGFsbGVkUmVwbywgYXJyYXkgJGNvbGxlY3RlZCwgUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGFycmF5CnsKZm9yZWFjaCAoJHBhY2thZ2UtPmdldFJlcXVpcmVzKCkgYXMgJHJlcXVpcmVMaW5rKSB7CmZvcmVhY2ggKCRpbnN0YWxsZWRSZXBvLT5maW5kUGFja2FnZXNXaXRoUmVwbGFjZXJzQW5kUHJvdmlkZXJzKCRyZXF1aXJlTGluay0+Z2V0VGFyZ2V0KCkpIGFzICRyZXF1aXJlZFBhY2thZ2UpIHsKaWYgKCFpc3NldCgkY29sbGVjdGVkWyRyZXF1aXJlZFBhY2thZ2UtPmdldE5hbWUoKV0pKSB7CiRjb2xsZWN0ZWRbJHJlcXVpcmVkUGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRyZXF1aXJlZFBhY2thZ2U7CiRjb2xsZWN0ZWQgPSAkdGhpcy0+Y29sbGVjdERlcGVuZGVuY2llcygkaW5zdGFsbGVkUmVwbywgJGNvbGxlY3RlZCwgJHJlcXVpcmVkUGFja2FnZSk7Cn0KfQp9CgpyZXR1cm4gJGNvbGxlY3RlZDsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5zdGFsbFBhdGgoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYm9vbCAkZ2xvYmFsID0gZmFsc2UpOiA/c3RyaW5nCnsKaWYgKCEkZ2xvYmFsKSB7CnJldHVybiAkdGhpcy0+Y29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwp9Cgphc3NlcnQobnVsbCAhPT0gJHRoaXMtPmdsb2JhbENvbXBvc2VyKTsKCnJldHVybiAkdGhpcy0+Z2xvYmFsQ29tcG9zZXItPmdldEluc3RhbGxhdGlvbk1hbmFnZXIoKS0+Z2V0SW5zdGFsbFBhdGgoJHBhY2thZ2UpOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENhcGFiaWxpdHlJbXBsZW1lbnRhdGlvbkNsYXNzTmFtZShQbHVnaW5JbnRlcmZhY2UgJHBsdWdpbiwgc3RyaW5nICRjYXBhYmlsaXR5KTogP3N0cmluZwp7CmlmICghKCRwbHVnaW4gaW5zdGFuY2VvZiBDYXBhYmxlKSkgewpyZXR1cm4gbnVsbDsKfQoKJGNhcGFiaWxpdGllcyA9IChhcnJheSkgJHBsdWdpbi0+Z2V0Q2FwYWJpbGl0aWVzKCk7CgppZiAoIWVtcHR5KCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSAmJiBpc19zdHJpbmcoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pICYmIHRyaW0oJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pKSB7CnJldHVybiB0cmltKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKTsKfQoKaWYgKAphcnJheV9rZXlfZXhpc3RzKCRjYXBhYmlsaXR5LCAkY2FwYWJpbGl0aWVzKQomJiAoZW1wdHkoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pIHx8ICFpc19zdHJpbmcoJGNhcGFiaWxpdGllc1skY2FwYWJpbGl0eV0pIHx8ICF0cmltKCRjYXBhYmlsaXRpZXNbJGNhcGFiaWxpdHldKSkKKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdQbHVnaW4gJy5nZXRfY2xhc3MoJHBsdWdpbikuJyBwcm92aWRlZCBpbnZhbGlkIGNhcGFiaWxpdHkgY2xhc3MgbmFtZShzKSwgZ290ICcudmFyX2V4cG9ydCgkY2FwYWJpbGl0aWVzWyRjYXBhYmlsaXR5XSwgdHJ1ZSkpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBsdWdpbkNhcGFiaWxpdHkoUGx1Z2luSW50ZXJmYWNlICRwbHVnaW4sICRjYXBhYmlsaXR5Q2xhc3NOYW1lLCBhcnJheSAkY3RvckFyZ3MgPSBbXSk6ID9DYXBhYmlsaXR5CnsKaWYgKCRjYXBhYmlsaXR5Q2xhc3MgPSAkdGhpcy0+Z2V0Q2FwYWJpbGl0eUltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCRwbHVnaW4sICRjYXBhYmlsaXR5Q2xhc3NOYW1lKSkgewppZiAoIWNsYXNzX2V4aXN0cygkY2FwYWJpbGl0eUNsYXNzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBpbnN0YW50aWF0ZSBDYXBhYmlsaXR5LCBhcyBjbGFzcyAkY2FwYWJpbGl0eUNsYXNzIGZyb20gcGx1Z2luICIuZ2V0X2NsYXNzKCRwbHVnaW4pLiIgZG9lcyBub3QgZXhpc3QuIik7Cn0KCiRjdG9yQXJnc1sncGx1Z2luJ10gPSAkcGx1Z2luOwokY2FwYWJpbGl0eU9iaiA9IG5ldyAkY2FwYWJpbGl0eUNsYXNzKCRjdG9yQXJncyk7CgoKaWYgKCEkY2FwYWJpbGl0eU9iaiBpbnN0YW5jZW9mIENhcGFiaWxpdHkgfHwgISRjYXBhYmlsaXR5T2JqIGluc3RhbmNlb2YgJGNhcGFiaWxpdHlDbGFzc05hbWUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonQ2xhc3MgJyAuICRjYXBhYmlsaXR5Q2xhc3MgLiAnIG11c3QgaW1wbGVtZW50IGJvdGggQ29tcG9zZXJcUGx1Z2luXENhcGFiaWxpdHlcQ2FwYWJpbGl0eSBhbmQgJy4gJGNhcGFiaWxpdHlDbGFzc05hbWUgLiAnLicKKTsKfQoKcmV0dXJuICRjYXBhYmlsaXR5T2JqOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGx1Z2luQ2FwYWJpbGl0aWVzKCRjYXBhYmlsaXR5Q2xhc3NOYW1lLCBhcnJheSAkY3RvckFyZ3MgPSBbXSk6IGFycmF5CnsKJGNhcGFiaWxpdGllcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0UGx1Z2lucygpIGFzICRwbHVnaW4pIHsKJGNhcGFiaWxpdHkgPSAkdGhpcy0+Z2V0UGx1Z2luQ2FwYWJpbGl0eSgkcGx1Z2luLCAkY2FwYWJpbGl0eUNsYXNzTmFtZSwgJGN0b3JBcmdzKTsKaWYgKG51bGwgIT09ICRjYXBhYmlsaXR5KSB7CiRjYXBhYmlsaXRpZXNbXSA9ICRjYXBhYmlsaXR5Owp9Cn0KCnJldHVybiAkY2FwYWJpbGl0aWVzOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUFsbG93ZWRQbHVnaW5zKCRhbGxvd1BsdWdpbnNDb25maWcsID9Mb2NrZXIgJGxvY2tlciA9IG51bGwpOiA/YXJyYXkKewppZiAoW10gPT09ICRhbGxvd1BsdWdpbnNDb25maWcgJiYgJGxvY2tlciAhPT0gbnVsbCAmJiAkbG9ja2VyLT5pc0xvY2tlZCgpICYmIHZlcnNpb25fY29tcGFyZSgkbG9ja2VyLT5nZXRQbHVnaW5BcGkoKSwgJzIuMi4wJywgJzwnKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKHRydWUgPT09ICRhbGxvd1BsdWdpbnNDb25maWcpIHsKcmV0dXJuIFsne30nID0+IHRydWVdOwp9CgppZiAoZmFsc2UgPT09ICRhbGxvd1BsdWdpbnNDb25maWcpIHsKcmV0dXJuIFsne30nID0+IGZhbHNlXTsKfQoKJHJ1bGVzID0gW107CmZvcmVhY2ggKCRhbGxvd1BsdWdpbnNDb25maWcgYXMgJHBhdHRlcm4gPT4gJGFsbG93KSB7CiRydWxlc1tCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybildID0gJGFsbG93Owp9CgpyZXR1cm4gJHJ1bGVzOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlUGx1Z2luc0Rpc2FibGVkKCR0eXBlKQp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVBsdWdpbnMgPT09IHRydWUgfHwgJHRoaXMtPmRpc2FibGVQbHVnaW5zID09PSAkdHlwZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGRpc2FibGVQbHVnaW5zKCk6IHZvaWQKewokdGhpcy0+ZGlzYWJsZVBsdWdpbnMgPSB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNQbHVnaW5BbGxvd2VkKHN0cmluZyAkcGFja2FnZSwgYm9vbCAkaXNHbG9iYWxQbHVnaW4sIGJvb2wgJG9wdGlvbmFsID0gZmFsc2UsIGJvb2wgJHByb21wdCA9IHRydWUpOiBib29sCnsKaWYgKCRpc0dsb2JhbFBsdWdpbikgewokcnVsZXMgPSAmJHRoaXMtPmFsbG93R2xvYmFsUGx1Z2luUnVsZXM7Cn0gZWxzZSB7CiRydWxlcyA9ICYkdGhpcy0+YWxsb3dQbHVnaW5SdWxlczsKfQoKCgppZiAoJHJ1bGVzID09PSBudWxsKSB7CmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Gb3IgYWRkaXRpb25hbCBzZWN1cml0eSB5b3Ugc2hvdWxkIGRlY2xhcmUgdGhlIGFsbG93LXBsdWdpbnMgY29uZmlnIHdpdGggYSBsaXN0IG9mIHBhY2thZ2VzIG5hbWVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gcnVuIGNvZGUuIFNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9hbGxvdy1wbHVnaW5zPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlRoaXMgd2FybmluZyB3aWxsIGJlY29tZSBhbiBleGNlcHRpb24gb25jZSB5b3UgcnVuIGNvbXBvc2VyIHVwZGF0ZSE8L3dhcm5pbmc+Jyk7CgokcnVsZXMgPSBbJ3t9JyA9PiB0cnVlXTsKCgpyZXR1cm4gdHJ1ZTsKfQoKCiRydWxlcyA9IFtdOwp9Cgpmb3JlYWNoICgkcnVsZXMgYXMgJHBhdHRlcm4gPT4gJGFsbG93KSB7CmlmIChQcmVnOjppc01hdGNoKCRwYXR0ZXJuLCAkcGFja2FnZSkpIHsKcmV0dXJuICRhbGxvdyA9PT0gdHJ1ZTsKfQp9CgppZiAoJHBhY2thZ2UgPT09ICdjb21wb3Nlci9wYWNrYWdlLXZlcnNpb25zLWRlcHJlY2F0ZWQnKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpICYmICRwcm9tcHQpIHsKJGNvbXBvc2VyID0gJGlzR2xvYmFsUGx1Z2luICYmICR0aGlzLT5nbG9iYWxDb21wb3NlciAhPT0gbnVsbCA/ICR0aGlzLT5nbG9iYWxDb21wb3NlciA6ICR0aGlzLT5jb21wb3NlcjsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kcGFja2FnZS4oJGlzR2xvYmFsUGx1Z2luIHx8ICR0aGlzLT5ydW5uaW5nSW5HbG9iYWxEaXIgPyAnIChpbnN0YWxsZWQgZ2xvYmFsbHkpJyA6ICcnKS4nIGNvbnRhaW5zIGEgQ29tcG9zZXIgcGx1Z2luIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgaW4geW91ciBhbGxvdy1wbHVnaW5zIGNvbmZpZy4gU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2FsbG93LXBsdWdpbnM8L3dhcm5pbmc+Jyk7CiRhdHRlbXB0cyA9IDA7CndoaWxlICh0cnVlKSB7CgoKJGRlZmF1bHQgPSAnPyc7CmlmICgkYXR0ZW1wdHMgPiA1KSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG9vIG1hbnkgZmFpbGVkIHByb21wdHMsIGFib3J0aW5nLicpOwpicmVhazsKfQoKc3dpdGNoICgkYW5zd2VyID0gJHRoaXMtPmlvLT5hc2soJ0RvIHlvdSB0cnVzdCAiPGZnPWdyZWVuO29wdGlvbnM9Ym9sZD4nLiRwYWNrYWdlLic8Lz4iIHRvIGV4ZWN1dGUgY29kZSBhbmQgd2lzaCB0byBlbmFibGUgaXQgbm93PyAod3JpdGVzICJhbGxvdy1wbHVnaW5zIiB0byBjb21wb3Nlci5qc29uKSBbPGNvbW1lbnQ+eSxuLGQsPzwvY29tbWVudD5dICcsICRkZWZhdWx0KSkgewpjYXNlICd5JzoKY2FzZSAnbic6CmNhc2UgJ2QnOgokYWxsb3cgPSAkYW5zd2VyID09PSAneSc7CgoKJHJ1bGVzW0Jhc2VQYWNrYWdlOjpwYWNrYWdlTmFtZVRvUmVnZXhwKCRwYWNrYWdlKV0gPSAkYWxsb3c7CgoKaWYgKCRhbnN3ZXIgPT09ICd5JyB8fCAkYW5zd2VyID09PSAnbicpIHsKJGFsbG93UGx1Z2lucyA9ICRjb21wb3Nlci0+Z2V0Q29uZmlnKCktPmdldCgnYWxsb3ctcGx1Z2lucycpOwppZiAoaXNfYXJyYXkoJGFsbG93UGx1Z2lucykpIHsKJGFsbG93UGx1Z2luc1skcGFja2FnZV0gPSAkYWxsb3c7CmlmICgkY29tcG9zZXItPmdldENvbmZpZygpLT5nZXQoJ3NvcnQtcGFja2FnZXMnKSkgewprc29ydCgkYWxsb3dQbHVnaW5zKTsKfQokY29tcG9zZXItPmdldENvbmZpZygpLT5nZXRDb25maWdTb3VyY2UoKS0+YWRkQ29uZmlnU2V0dGluZygnYWxsb3ctcGx1Z2lucycsICRhbGxvd1BsdWdpbnMpOwokY29tcG9zZXItPmdldENvbmZpZygpLT5tZXJnZShbJ2NvbmZpZycgPT4gWydhbGxvdy1wbHVnaW5zJyA9PiAkYWxsb3dQbHVnaW5zXV0pOwp9Cn0KCnJldHVybiAkYWxsb3c7CgpjYXNlICc/JzoKZGVmYXVsdDoKJGF0dGVtcHRzKys7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCid5IC0gYWRkIHBhY2thZ2UgdG8gYWxsb3ctcGx1Z2lucyBpbiBjb21wb3Nlci5qc29uIGFuZCBsZXQgaXQgcnVuIGltbWVkaWF0ZWx5JywKJ24gLSBhZGQgcGFja2FnZSAoYXMgZGlzYWxsb3dlZCkgdG8gYWxsb3ctcGx1Z2lucyBpbiBjb21wb3Nlci5qc29uIHRvIHN1cHByZXNzIGZ1cnRoZXIgcHJvbXB0cycsCidkIC0gZGlzY2FyZCB0aGlzLCBkbyBub3QgY2hhbmdlIGNvbXBvc2VyLmpzb24gYW5kIGRvIG5vdCBhbGxvdyB0aGUgcGx1Z2luIHRvIHJ1bicsCic/IC0gcHJpbnQgaGVscCcsCl0pOwpicmVhazsKfQp9Cn0gZWxzZWlmICgkb3B0aW9uYWwpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgUGx1Z2luQmxvY2tlZEV4Y2VwdGlvbigKJHBhY2thZ2UuKCRpc0dsb2JhbFBsdWdpbiB8fCAkdGhpcy0+cnVubmluZ0luR2xvYmFsRGlyID8gJyAoaW5zdGFsbGVkIGdsb2JhbGx5KScgOiAnJykuJyBjb250YWlucyBhIENvbXBvc2VyIHBsdWdpbiB3aGljaCBpcyBibG9ja2VkIGJ5IHlvdXIgYWxsb3ctcGx1Z2lucyBjb25maWcuIFlvdSBtYXkgYWRkIGl0IHRvIHRoZSBsaXN0IGlmIHlvdSBjb25zaWRlciBpdCBzYWZlLicuUEhQX0VPTC4KJ1lvdSBjYW4gcnVuICJjb21wb3NlciAnLigkaXNHbG9iYWxQbHVnaW4gfHwgJHRoaXMtPnJ1bm5pbmdJbkdsb2JhbERpciA/ICdnbG9iYWwgJyA6ICcnKS4nY29uZmlnIC0tbm8tcGx1Z2lucyBhbGxvdy1wbHVnaW5zLicuJHBhY2thZ2UuJyBbdHJ1ZXxmYWxzZV0iIHRvIGVuYWJsZSBpdCAodHJ1ZSkgb3IgZGlzYWJsZSBpdCBleHBsaWNpdGx5IGFuZCBzdXBwcmVzcyB0aGlzIGV4Y2VwdGlvbiAoZmFsc2UpJy5QSFBfRU9MLgonU2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2FsbG93LXBsdWdpbnMnCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGx1Z2luOwoKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgUG9zdEZpbGVEb3dubG9hZEV2ZW50IGV4dGVuZHMgRXZlbnQKewoKCgpwcml2YXRlICRmaWxlTmFtZTsKCgoKCnByaXZhdGUgJGNoZWNrc3VtOwoKCgoKcHJpdmF0ZSAkdXJsOwoKCgoKcHJpdmF0ZSAkY29udGV4dDsKCgoKCnByaXZhdGUgJHR5cGU7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgP3N0cmluZyAkZmlsZU5hbWUsID9zdHJpbmcgJGNoZWNrc3VtLCBzdHJpbmcgJHVybCwgc3RyaW5nICR0eXBlLCAkY29udGV4dCA9IG51bGwpCnsKCmlmICgkY29udGV4dCA9PT0gbnVsbCAmJiAkdHlwZSBpbnN0YW5jZW9mIFBhY2thZ2VJbnRlcmZhY2UpIHsKJGNvbnRleHQgPSAkdHlwZTsKJHR5cGUgPSAncGFja2FnZSc7CnRyaWdnZXJfZXJyb3IoJ1Bvc3RGaWxlRG93bmxvYWRFdmVudDo6X19jb25zdHJ1Y3Qgc2hvdWxkIHJlY2VpdmUgYSAkdHlwZT1wYWNrYWdlIGFuZCB0aGUgcGFja2FnZSBvYmplY3QgaW4gJGNvbnRleHQgc2luY2UgQ29tcG9zZXIgMi4xLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSk7CiR0aGlzLT5maWxlTmFtZSA9ICRmaWxlTmFtZTsKJHRoaXMtPmNoZWNrc3VtID0gJGNoZWNrc3VtOwokdGhpcy0+dXJsID0gJHVybDsKJHRoaXMtPmNvbnRleHQgPSAkY29udGV4dDsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZU5hbWUoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+ZmlsZU5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGVja3N1bSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jaGVja3N1bTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnVybDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGV4dCgpCnsKcmV0dXJuICR0aGlzLT5jb250ZXh0Owp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWNrYWdlKCk6ID9QYWNrYWdlSW50ZXJmYWNlCnsKdHJpZ2dlcl9lcnJvcignUG9zdEZpbGVEb3dubG9hZEV2ZW50OjpnZXRQYWNrYWdlIGlzIGRlcHJlY2F0ZWQgc2luY2UgQ29tcG9zZXIgMi4xLCB1c2UgZ2V0Q29udGV4dCBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKJGNvbnRleHQgPSAkdGhpcy0+Z2V0Q29udGV4dCgpOwoKcmV0dXJuICRjb250ZXh0IGluc3RhbmNlb2YgUGFja2FnZUludGVyZmFjZSA/ICRjb250ZXh0IDogbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT50eXBlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBsdWdpbjsKCnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBQcmVDb21tYW5kUnVuRXZlbnQgZXh0ZW5kcyBFdmVudAp7CgoKCnByaXZhdGUgJGlucHV0OwoKCgoKcHJpdmF0ZSAkY29tbWFuZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgc3RyaW5nICRjb21tYW5kKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUpOwokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7CiR0aGlzLT5jb21tYW5kID0gJGNvbW1hbmQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJbnB1dCgpOiBJbnB1dEludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+aW5wdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Y29tbWFuZDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKCgoKCgoKY2xhc3MgUHJlRmlsZURvd25sb2FkRXZlbnQgZXh0ZW5kcyBFdmVudAp7CgoKCnByaXZhdGUgJGh0dHBEb3dubG9hZGVyOwoKCgoKcHJpdmF0ZSAkcHJvY2Vzc2VkVXJsOwoKCgoKcHJpdmF0ZSAkY3VzdG9tQ2FjaGVLZXk7CgoKCgpwcml2YXRlICR0eXBlOwoKCgoKcHJpdmF0ZSAkY29udGV4dDsKCgoKCnByaXZhdGUgJHRyYW5zcG9ydE9wdGlvbnMgPSBbXTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsIHN0cmluZyAkcHJvY2Vzc2VkVXJsLCBzdHJpbmcgJHR5cGUsICRjb250ZXh0ID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRuYW1lKTsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+cHJvY2Vzc2VkVXJsID0gJHByb2Nlc3NlZFVybDsKJHRoaXMtPnR5cGUgPSAkdHlwZTsKJHRoaXMtPmNvbnRleHQgPSAkY29udGV4dDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEh0dHBEb3dubG9hZGVyKCk6IEh0dHBEb3dubG9hZGVyCnsKcmV0dXJuICR0aGlzLT5odHRwRG93bmxvYWRlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc2VkVXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cHJvY2Vzc2VkVXJsOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9jZXNzZWRVcmwoc3RyaW5nICRwcm9jZXNzZWRVcmwpOiB2b2lkCnsKJHRoaXMtPnByb2Nlc3NlZFVybCA9ICRwcm9jZXNzZWRVcmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDdXN0b21DYWNoZUtleSgpOiA/c3RyaW5nCnsKcmV0dXJuICR0aGlzLT5jdXN0b21DYWNoZUtleTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q3VzdG9tQ2FjaGVLZXkoP3N0cmluZyAkY3VzdG9tQ2FjaGVLZXkpOiB2b2lkCnsKJHRoaXMtPmN1c3RvbUNhY2hlS2V5ID0gJGN1c3RvbUNhY2hlS2V5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnR5cGU7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRleHQoKQp7CnJldHVybiAkdGhpcy0+Y29udGV4dDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUcmFuc3BvcnRPcHRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT50cmFuc3BvcnRPcHRpb25zOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRyYW5zcG9ydE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiB2b2lkCnsKJHRoaXMtPnRyYW5zcG9ydE9wdGlvbnMgPSAkb3B0aW9uczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQbHVnaW47Cgp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50Owp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxSZXBvc2l0b3J5SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFJlcXVlc3Q7CnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwoKCgoKCgpjbGFzcyBQcmVQb29sQ3JlYXRlRXZlbnQgZXh0ZW5kcyBFdmVudAp7CgoKCnByaXZhdGUgJHJlcG9zaXRvcmllczsKCgoKcHJpdmF0ZSAkcmVxdWVzdDsKCgoKCnByaXZhdGUgJGFjY2VwdGFibGVTdGFiaWxpdGllczsKCgoKCnByaXZhdGUgJHN0YWJpbGl0eUZsYWdzOwoKCgoKcHJpdmF0ZSAkcm9vdEFsaWFzZXM7CgoKCgpwcml2YXRlICRyb290UmVmZXJlbmNlczsKCgoKcHJpdmF0ZSAkcGFja2FnZXM7CgoKCnByaXZhdGUgJHVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXM7CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBhcnJheSAkcmVwb3NpdG9yaWVzLCBSZXF1ZXN0ICRyZXF1ZXN0LCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRyb290QWxpYXNlcywgYXJyYXkgJHJvb3RSZWZlcmVuY2VzLCBhcnJheSAkcGFja2FnZXMsIGFycmF5ICR1bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG5hbWUpOwoKJHRoaXMtPnJlcG9zaXRvcmllcyA9ICRyZXBvc2l0b3JpZXM7CiR0aGlzLT5yZXF1ZXN0ID0gJHJlcXVlc3Q7CiR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzOwokdGhpcy0+c3RhYmlsaXR5RmxhZ3MgPSAkc3RhYmlsaXR5RmxhZ3M7CiR0aGlzLT5yb290QWxpYXNlcyA9ICRyb290QWxpYXNlczsKJHRoaXMtPnJvb3RSZWZlcmVuY2VzID0gJHJvb3RSZWZlcmVuY2VzOwokdGhpcy0+cGFja2FnZXMgPSAkcGFja2FnZXM7CiR0aGlzLT51bmFjY2VwdGFibGVGaXhlZFBhY2thZ2VzID0gJHVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvc2l0b3JpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcmllczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcXVlc3QoKTogUmVxdWVzdAp7CnJldHVybiAkdGhpcy0+cmVxdWVzdDsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBY2NlcHRhYmxlU3RhYmlsaXRpZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllczsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGFiaWxpdHlGbGFncygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+c3RhYmlsaXR5RmxhZ3M7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdEFsaWFzZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnJvb3RBbGlhc2VzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RSZWZlcmVuY2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yb290UmVmZXJlbmNlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wYWNrYWdlczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMpOiB2b2lkCnsKJHRoaXMtPnBhY2thZ2VzID0gJHBhY2thZ2VzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VW5hY2NlcHRhYmxlRml4ZWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMpOiB2b2lkCnsKJHRoaXMtPnVuYWNjZXB0YWJsZUZpeGVkUGFja2FnZXMgPSAkcGFja2FnZXM7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUXVlc3Rpb247Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKCgoKCgoKCgpjbGFzcyBTdHJpY3RDb25maXJtYXRpb25RdWVzdGlvbiBleHRlbmRzIFF1ZXN0aW9uCnsKCnByaXZhdGUgJHRydWVBbnN3ZXJSZWdleDsKCnByaXZhdGUgJGZhbHNlQW5zd2VyUmVnZXg7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHF1ZXN0aW9uLCBib29sICRkZWZhdWx0ID0gdHJ1ZSwgc3RyaW5nICR0cnVlQW5zd2VyUmVnZXggPSAnL155KD86ZXMpPyQvaScsIHN0cmluZyAkZmFsc2VBbnN3ZXJSZWdleCA9ICcvXm5vPyQvaScpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcXVlc3Rpb24sICRkZWZhdWx0KTsKCiR0aGlzLT50cnVlQW5zd2VyUmVnZXggPSAkdHJ1ZUFuc3dlclJlZ2V4OwokdGhpcy0+ZmFsc2VBbnN3ZXJSZWdleCA9ICRmYWxzZUFuc3dlclJlZ2V4OwokdGhpcy0+c2V0Tm9ybWFsaXplcigkdGhpcy0+Z2V0RGVmYXVsdE5vcm1hbGl6ZXIoKSk7CiR0aGlzLT5zZXRWYWxpZGF0b3IoJHRoaXMtPmdldERlZmF1bHRWYWxpZGF0b3IoKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdE5vcm1hbGl6ZXIoKTogY2FsbGFibGUKewokZGVmYXVsdCA9ICR0aGlzLT5nZXREZWZhdWx0KCk7CiR0cnVlUmVnZXggPSAkdGhpcy0+dHJ1ZUFuc3dlclJlZ2V4OwokZmFsc2VSZWdleCA9ICR0aGlzLT5mYWxzZUFuc3dlclJlZ2V4OwoKcmV0dXJuIHN0YXRpYyBmdW5jdGlvbiAoJGFuc3dlcikgdXNlICgkZGVmYXVsdCwgJHRydWVSZWdleCwgJGZhbHNlUmVnZXgpIHsKaWYgKGlzX2Jvb2woJGFuc3dlcikpIHsKcmV0dXJuICRhbnN3ZXI7Cn0KaWYgKGVtcHR5KCRhbnN3ZXIpICYmICFlbXB0eSgkZGVmYXVsdCkpIHsKcmV0dXJuICRkZWZhdWx0Owp9CgppZiAoUHJlZzo6aXNNYXRjaCgkdHJ1ZVJlZ2V4LCAkYW5zd2VyKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJGZhbHNlUmVnZXgsICRhbnN3ZXIpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIG51bGw7Cn07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbGlkYXRvcigpOiBjYWxsYWJsZQp7CnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKCRhbnN3ZXIpOiBib29sIHsKaWYgKCFpc19ib29sKCRhbnN3ZXIpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BsZWFzZSBhbnN3ZXIgeWVzLCB5LCBubywgb3Igbi4nKTsKfQoKcmV0dXJuICRhbnN3ZXI7Cn07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxTZWN1cml0eUFkdmlzb3J5OwoKCgoKCgoKaW50ZXJmYWNlIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gaGFzU2VjdXJpdHlBZHZpc29yaWVzKCk6IGJvb2w7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZUNvbnN0cmFpbnRNYXAsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5Owp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVBbGlhc1BhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CgoKCgoKCmNsYXNzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIFJlcG9zaXRvcnlJbnRlcmZhY2UKewoKcHJvdGVjdGVkICRwYWNrYWdlcyA9IG51bGw7CgoKCgpwcm90ZWN0ZWQgJHBhY2thZ2VNYXAgPSBudWxsOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRwYWNrYWdlcyA9IFtdKQp7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCkKewpyZXR1cm4gJ2FycmF5IHJlcG8gKGRlZmluaW5nICcuJHRoaXMtPmNvdW50KCkuJyBwYWNrYWdlJy4oJHRoaXMtPmNvdW50KCkgPiAxID8gJ3MnIDogJycpLicpJzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGxvYWRQYWNrYWdlcyhhcnJheSAkcGFja2FnZU5hbWVNYXAsIGFycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsIGFycmF5ICRzdGFiaWxpdHlGbGFncywgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSkKewokcGFja2FnZXMgPSAkdGhpcy0+Z2V0UGFja2FnZXMoKTsKCiRyZXN1bHQgPSBbXTsKJG5hbWVzRm91bmQgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CmlmIChhcnJheV9rZXlfZXhpc3RzKCRwYWNrYWdlLT5nZXROYW1lKCksICRwYWNrYWdlTmFtZU1hcCkpIHsKaWYgKAooISRwYWNrYWdlTmFtZU1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSB8fCAkcGFja2FnZU5hbWVNYXBbJHBhY2thZ2UtPmdldE5hbWUoKV0tPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSkpKQomJiBTdGFiaWxpdHlGaWx0ZXI6OmlzUGFja2FnZUFjY2VwdGFibGUoJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkcGFja2FnZS0+Z2V0TmFtZXMoKSwgJHBhY2thZ2UtPmdldFN0YWJpbGl0eSgpKQomJiAhaXNzZXQoJGFscmVhZHlMb2FkZWRbJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV0pCikgewoKJHJlc3VsdFtzcGxfb2JqZWN0X2hhc2goJHBhY2thZ2UpXSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlICYmICFpc3NldCgkcmVzdWx0W3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKV0pKSB7CiRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KfQoKJG5hbWVzRm91bmRbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSB0cnVlOwp9Cn0KCgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CmlmIChpc3NldCgkcmVzdWx0W3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKV0pKSB7CiRyZXN1bHRbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKfQp9Cn0KCnJldHVybiBbJ25hbWVzRm91bmQnID0+IGFycmF5X2tleXMoJG5hbWVzRm91bmQpLCAncGFja2FnZXMnID0+ICRyZXN1bHRdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2Uoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCkKewokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwoKaWYgKCEkY29uc3RyYWludCBpbnN0YW5jZW9mIENvbnN0cmFpbnRJbnRlcmZhY2UpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KTsKfQoKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRuYW1lID09PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CiRwa2dDb25zdHJhaW50ID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7CmlmICgkY29uc3RyYWludC0+bWF0Y2hlcygkcGtnQ29uc3RyYWludCkpIHsKcmV0dXJuICRwYWNrYWdlOwp9Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZXMoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpCnsKCiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CiRwYWNrYWdlcyA9IFtdOwoKaWYgKG51bGwgIT09ICRjb25zdHJhaW50ICYmICEkY29uc3RyYWludCBpbnN0YW5jZW9mIENvbnN0cmFpbnRJbnRlcmZhY2UpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRjb25zdHJhaW50KTsKfQoKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRuYW1lID09PSAkcGFja2FnZS0+Z2V0TmFtZSgpKSB7CmlmIChudWxsID09PSAkY29uc3RyYWludCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSkpIHsKJHBhY2thZ2VzW10gPSAkcGFja2FnZTsKfQp9Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpCnsKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfRlVMTFRFWFQpIHsKJHJlZ2V4ID0gJ3soPzonLmltcGxvZGUoJ3wnLCBQcmVnOjpzcGxpdCgne1xzK30nLCBwcmVnX3F1b3RlKCRxdWVyeSkpKS4nKX1pJzsKfSBlbHNlIHsKCiRyZWdleCA9ICd7KD86Jy5pbXBsb2RlKCd8JywgUHJlZzo6c3BsaXQoJ3tccyt9JywgJHF1ZXJ5KSkuJyl9aSc7Cn0KCiRtYXRjaGVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRuYW1lID0gJHBhY2thZ2UtPmdldE5hbWUoKTsKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfVkVORE9SKSB7ClskbmFtZV0gPSBleHBsb2RlKCcvJywgJG5hbWUpOwp9CmlmIChpc3NldCgkbWF0Y2hlc1skbmFtZV0pKSB7CmNvbnRpbnVlOwp9CmlmIChudWxsICE9PSAkdHlwZSAmJiAkcGFja2FnZS0+Z2V0VHlwZSgpICE9PSAkdHlwZSkgewpjb250aW51ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJHJlZ2V4LCAkbmFtZSkKfHwgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfRlVMTFRFWFQgJiYgJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UgJiYgUHJlZzo6aXNNYXRjaCgkcmVnZXgsIGltcGxvZGUoJyAnLCAoYXJyYXkpICRwYWNrYWdlLT5nZXRLZXl3b3JkcygpKSAuICcgJyAuICRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpKSkKKSB7CmlmICgkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX1ZFTkRPUikgewokbWF0Y2hlc1skbmFtZV0gPSBbCiduYW1lJyA9PiAkbmFtZSwKJ2Rlc2NyaXB0aW9uJyA9PiBudWxsLApdOwp9IGVsc2UgewokbWF0Y2hlc1skbmFtZV0gPSBbCiduYW1lJyA9PiAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpLAonZGVzY3JpcHRpb24nID0+ICRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJHBhY2thZ2UtPmdldERlc2NyaXB0aW9uKCkgOiBudWxsLApdOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmICRwYWNrYWdlLT5pc0FiYW5kb25lZCgpKSB7CiRtYXRjaGVzWyRuYW1lXVsnYWJhbmRvbmVkJ10gPSAkcGFja2FnZS0+Z2V0UmVwbGFjZW1lbnRQYWNrYWdlKCkgPzogdHJ1ZTsKfQp9Cn0KfQoKcmV0dXJuIGFycmF5X3ZhbHVlcygkbWF0Y2hlcyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKaWYgKCR0aGlzLT5wYWNrYWdlTWFwID09PSBudWxsKSB7CiR0aGlzLT5wYWNrYWdlTWFwID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRyZXBvUGFja2FnZSkgewokdGhpcy0+cGFja2FnZU1hcFskcmVwb1BhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKV0gPSAkcmVwb1BhY2thZ2U7Cn0KfQoKcmV0dXJuIGlzc2V0KCR0aGlzLT5wYWNrYWdlTWFwWyRwYWNrYWdlLT5nZXRVbmlxdWVOYW1lKCldKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKQp7CmlmICghJHBhY2thZ2UgaW5zdGFuY2VvZiBCYXNlUGFja2FnZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignT25seSBzdWJjbGFzc2VzIG9mIEJhc2VQYWNrYWdlIGFyZSBzdXBwb3J0ZWQnKTsKfQppZiAobnVsbCA9PT0gJHRoaXMtPnBhY2thZ2VzKSB7CiR0aGlzLT5pbml0aWFsaXplKCk7Cn0KJHBhY2thZ2UtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokdGhpcy0+cGFja2FnZXNbXSA9ICRwYWNrYWdlOwoKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQWxpYXNQYWNrYWdlKSB7CiRhbGlhc2VkUGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7CmlmIChudWxsID09PSAkYWxpYXNlZFBhY2thZ2UtPmdldFJlcG9zaXRvcnkoKSkgewokdGhpcy0+YWRkUGFja2FnZSgkYWxpYXNlZFBhY2thZ2UpOwp9Cn0KCgokdGhpcy0+cGFja2FnZU1hcCA9IG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoc3RyaW5nICRwYWNrYWdlTmFtZSkKewokcmVzdWx0ID0gW107Cgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkY2FuZGlkYXRlKSB7CmlmIChpc3NldCgkcmVzdWx0WyRjYW5kaWRhdGUtPmdldE5hbWUoKV0pKSB7CmNvbnRpbnVlOwp9CmZvcmVhY2ggKCRjYW5kaWRhdGUtPmdldFByb3ZpZGVzKCkgYXMgJGxpbmspIHsKaWYgKCRwYWNrYWdlTmFtZSA9PT0gJGxpbmstPmdldFRhcmdldCgpKSB7CiRyZXN1bHRbJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpXSA9IFsKJ25hbWUnID0+ICRjYW5kaWRhdGUtPmdldE5hbWUoKSwKJ2Rlc2NyaXB0aW9uJyA9PiAkY2FuZGlkYXRlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlID8gJGNhbmRpZGF0ZS0+Z2V0RGVzY3JpcHRpb24oKSA6IG51bGwsCid0eXBlJyA9PiAkY2FuZGlkYXRlLT5nZXRUeXBlKCksCl07CmNvbnRpbnVlIDI7Cn0KfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNyZWF0ZUFsaWFzUGFja2FnZShCYXNlUGFja2FnZSAkcGFja2FnZSwgc3RyaW5nICRhbGlhcywgc3RyaW5nICRwcmV0dHlBbGlhcykKewp3aGlsZSAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKJHBhY2thZ2UgPSAkcGFja2FnZS0+Z2V0QWxpYXNPZigpOwp9CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2UpIHsKcmV0dXJuIG5ldyBDb21wbGV0ZUFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzLCAkcHJldHR5QWxpYXMpOwp9CgpyZXR1cm4gbmV3IEFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzLCAkcHJldHR5QWxpYXMpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewokcGFja2FnZUlkID0gJHBhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKTsKCmZvcmVhY2ggKCR0aGlzLT5nZXRQYWNrYWdlcygpIGFzICRrZXkgPT4gJHJlcG9QYWNrYWdlKSB7CmlmICgkcGFja2FnZUlkID09PSAkcmVwb1BhY2thZ2UtPmdldFVuaXF1ZU5hbWUoKSkgewphcnJheV9zcGxpY2UoJHRoaXMtPnBhY2thZ2VzLCAka2V5LCAxKTsKCgokdGhpcy0+cGFja2FnZU1hcCA9IG51bGw7CgpyZXR1cm47Cn0KfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKQp7CmlmIChudWxsID09PSAkdGhpcy0+cGFja2FnZXMpIHsKJHRoaXMtPmluaXRpYWxpemUoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5wYWNrYWdlcykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdpbml0aWFsaXplIGZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBwYWNrYWdlcyBhcnJheScpOwp9CgpyZXR1cm4gJHRoaXMtPnBhY2thZ2VzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewppZiAobnVsbCA9PT0gJHRoaXMtPnBhY2thZ2VzKSB7CiR0aGlzLT5pbml0aWFsaXplKCk7Cn0KCnJldHVybiBjb3VudCgkdGhpcy0+cGFja2FnZXMpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewokdGhpcy0+cGFja2FnZXMgPSBbXTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXExvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFRhcjsKdXNlIENvbXBvc2VyXFV0aWxcWmlwOwoKCgoKY2xhc3MgQXJ0aWZhY3RSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJGxvYWRlcjsKCgpwcm90ZWN0ZWQgJGxvb2t1cDsKCnByb3RlY3RlZCAkcmVwb0NvbmZpZzsKCnByaXZhdGUgJGlvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvQ29uZmlnLCBJT0ludGVyZmFjZSAkaW8pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgpOwppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ3ppcCcpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGFydGlmYWN0IHJlcG9zaXRvcnkgcmVxdWlyZXMgUEhQXCdzIHppcCBleHRlbnNpb24nKTsKfQoKJHRoaXMtPmxvYWRlciA9IG5ldyBBcnJheUxvYWRlcigpOwokdGhpcy0+bG9va3VwID0gUGxhdGZvcm06OmV4cGFuZFBhdGgoJHJlcG9Db25maWdbJ3VybCddKTsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+cmVwb0NvbmZpZyA9ICRyZXBvQ29uZmlnOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKQp7CnJldHVybiAnYXJ0aWZhY3QgcmVwbyAoJy4kdGhpcy0+bG9va3VwLicpJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9Db25maWcoKQp7CnJldHVybiAkdGhpcy0+cmVwb0NvbmZpZzsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKQp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKJHRoaXMtPnNjYW5EaXJlY3RvcnkoJHRoaXMtPmxvb2t1cCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2NhbkRpcmVjdG9yeShzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJGlvID0gJHRoaXMtPmlvOwoKJGRpcmVjdG9yeSA9IG5ldyBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHBhdGgsIFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6Rk9MTE9XX1NZTUxJTktTKTsKJGl0ZXJhdG9yID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRkaXJlY3RvcnkpOwokcmVnZXggPSBuZXcgXFJlZ2V4SXRlcmF0b3IoJGl0ZXJhdG9yLCAnL14uK1wuKHppcHx0YXJ8Z3p8dGd6KSQvaScpOwpmb3JlYWNoICgkcmVnZXggYXMgJGZpbGUpIHsKCmlmICghJGZpbGUtPmlzRmlsZSgpKSB7CmNvbnRpbnVlOwp9CgokcGFja2FnZSA9ICR0aGlzLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCRmaWxlKTsKaWYgKCEkcGFja2FnZSkgewokaW8tPndyaXRlRXJyb3IoIkZpbGUgPGNvbW1lbnQ+eyRmaWxlLT5nZXRCYXNlbmFtZSgpfTwvY29tbWVudD4gZG9lc24ndCBzZWVtIHRvIGhvbGQgYSBwYWNrYWdlIiwgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwpjb250aW51ZTsKfQoKJHRlbXBsYXRlID0gJ0ZvdW5kIHBhY2thZ2UgPGluZm8+JXM8L2luZm8+ICg8Y29tbWVudD4lczwvY29tbWVudD4pIGluIGZpbGUgPGluZm8+JXM8L2luZm8+JzsKJGlvLT53cml0ZUVycm9yKHNwcmludGYoJHRlbXBsYXRlLCAkcGFja2FnZS0+Z2V0TmFtZSgpLCAkcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpLCAkZmlsZS0+Z2V0QmFzZW5hbWUoKSksIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCiR0aGlzLT5hZGRQYWNrYWdlKCRwYWNrYWdlKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oXFNwbEZpbGVJbmZvICRmaWxlKTogP0Jhc2VQYWNrYWdlCnsKJGpzb24gPSBudWxsOwokZmlsZVR5cGUgPSBudWxsOwokZmlsZUV4dGVuc2lvbiA9IHBhdGhpbmZvKCRmaWxlLT5nZXRQYXRobmFtZSgpLCBQQVRISU5GT19FWFRFTlNJT04pOwppZiAoaW5fYXJyYXkoJGZpbGVFeHRlbnNpb24sIFsnZ3onLCAndGFyJywgJ3RneiddLCB0cnVlKSkgewokZmlsZVR5cGUgPSAndGFyJzsKfSBlbHNlaWYgKCRmaWxlRXh0ZW5zaW9uID09PSAnemlwJykgewokZmlsZVR5cGUgPSAnemlwJzsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGaWxlcyB3aXRoICInLiRmaWxlRXh0ZW5zaW9uLiciIGV4dGVuc2lvbnMgYXJlblwndCBzdXBwb3J0ZWQuIE9ubHkgWklQIGFuZCBUQVIvVEFSLkdaL1RHWiBhcmNoaXZlcyBhcmUgc3VwcG9ydGVkLicpOwp9Cgp0cnkgewppZiAoJGZpbGVUeXBlID09PSAndGFyJykgewokanNvbiA9IFRhcjo6Z2V0Q29tcG9zZXJKc29uKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfSBlbHNlIHsKJGpzb24gPSBaaXA6OmdldENvbXBvc2VySnNvbigkZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZXhjZXB0aW9uKSB7CiR0aGlzLT5pby0+d3JpdGUoJ0ZhaWxlZCBsb2FkaW5nIHBhY2thZ2UgJy4kZmlsZS0+Z2V0UGF0aG5hbWUoKS4nOiAnLiRleGNlcHRpb24tPmdldE1lc3NhZ2UoKSwgZmFsc2UsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKfQoKaWYgKG51bGwgPT09ICRqc29uKSB7CnJldHVybiBudWxsOwp9CgokcGFja2FnZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGpzb24sICRmaWxlLT5nZXRQYXRobmFtZSgpLicjY29tcG9zZXIuanNvbicpOwokcGFja2FnZVsnZGlzdCddID0gWwondHlwZScgPT4gJGZpbGVUeXBlLAondXJsJyA9PiBzdHJ0cigkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJ1xcJywgJy8nKSwKJ3NoYXN1bScgPT4gaGFzaF9maWxlKCdzaGExJywgJGZpbGUtPmdldFJlYWxQYXRoKCkpLApdOwoKdHJ5IHsKJHBhY2thZ2UgPSAkdGhpcy0+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+Z2V0UGFja2FnZU5hbWVzKCk7CgokdW5pcXVlcyA9IFtdOwpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKJHVuaXF1ZXNbZXhwbG9kZSgnLycsICRuYW1lLCAyKVswXV0gPSB0cnVlOwp9CgokdmVuZG9ycyA9IGFycmF5X2tleXMoJHVuaXF1ZXMpOwoKaWYgKCEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgaW1wbG9kZSgiXG4iLCAkdmVuZG9ycykpOwp9CgpyZXR1cm4gJHZlbmRvcnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFBhY2thZ2VMaXN0KD9zdHJpbmcgJHBhY2thZ2VGaWx0ZXIgPSBudWxsKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxpc3RVcmwpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignTWFrZSBzdXJlIHRvIGNhbGwgbG9hZFJvb3RTZXJ2ZXJGaWxlIGJlZm9yZSBsb2FkUGFja2FnZUxpc3QnKTsKfQoKJHVybCA9ICR0aGlzLT5saXN0VXJsOwppZiAoaXNfc3RyaW5nKCRwYWNrYWdlRmlsdGVyKSAmJiAkcGFja2FnZUZpbHRlciAhPT0gJycpIHsKJHVybCAuPSAnP2ZpbHRlcj0nLnVybGVuY29kZSgkcGFja2FnZUZpbHRlcik7CiRyZXN1bHQgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkdXJsLCAkdGhpcy0+b3B0aW9ucyktPmRlY29kZUpzb24oKTsKCnJldHVybiAkcmVzdWx0WydwYWNrYWdlTmFtZXMnXTsKfQoKJGNhY2hlS2V5ID0gJ3BhY2thZ2UtbGlzdC50eHQnOwokY2FjaGVBZ2UgPSAkdGhpcy0+Y2FjaGUtPmdldEFnZSgkY2FjaGVLZXkpOwppZiAoZmFsc2UgIT09ICRjYWNoZUFnZSAmJiAkY2FjaGVBZ2UgPCA2MDAgJiYgKCRjYWNoZWREYXRhID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSkpICE9PSBmYWxzZSkgewokY2FjaGVkRGF0YSA9IGV4cGxvZGUoIlxuIiwgJGNhY2hlZERhdGEpOwoKcmV0dXJuICRjYWNoZWREYXRhOwp9CgokcmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CmlmICghJHRoaXMtPmNhY2hlLT5pc1JlYWRPbmx5KCkpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkY2FjaGVLZXksIGltcGxvZGUoIlxuIiwgJHJlc3VsdFsncGFja2FnZU5hbWVzJ10pKTsKfQoKcmV0dXJuICRyZXN1bHRbJ3BhY2thZ2VOYW1lcyddOwp9CgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKQp7CgokaGFzUHJvdmlkZXJzID0gJHRoaXMtPmhhc1Byb3ZpZGVycygpOwoKaWYgKCEkaGFzUHJvdmlkZXJzICYmICEkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgJiYgbnVsbCA9PT0gJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKcmV0dXJuIHBhcmVudDo6bG9hZFBhY2thZ2VzKCRwYWNrYWdlTmFtZU1hcCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7Cn0KCiRwYWNrYWdlcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwoKaWYgKCRoYXNQcm92aWRlcnMgfHwgJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpKSB7CmZvcmVhY2ggKCRwYWNrYWdlTmFtZU1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewokbWF0Y2hlcyA9IFtdOwoKCgppZiAoISRoYXNQcm92aWRlcnMgJiYgIWlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdKSkgewpjb250aW51ZTsKfQoKJGNhbmRpZGF0ZXMgPSAkdGhpcy0+d2hhdFByb3ZpZGVzKCRuYW1lLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsICRhbHJlYWR5TG9hZGVkKTsKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJGNhbmRpZGF0ZS0+Z2V0TmFtZSgpICE9PSAkbmFtZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCd3aGF0UHJvdmlkZXMgc2hvdWxkIG5ldmVyIHJldHVybiBhIHBhY2thZ2Ugd2l0aCBhIGRpZmZlcmVudCBuYW1lIHRoYW4gdGhlIHJlcXVlc3RlZCBvbmUnKTsKfQokbmFtZXNGb3VuZFskbmFtZV0gPSB0cnVlOwoKaWYgKCEkY29uc3RyYWludCB8fCAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPT0nLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCkpKSkgewokbWF0Y2hlc1tzcGxfb2JqZWN0X2hhc2goJGNhbmRpZGF0ZSldID0gJGNhbmRpZGF0ZTsKaWYgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgIWlzc2V0KCRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlLT5nZXRBbGlhc09mKCkpXSkpIHsKJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUtPmdldEFsaWFzT2YoKSldID0gJGNhbmRpZGF0ZS0+Z2V0QWxpYXNPZigpOwp9Cn0KfQoKCmZvcmVhY2ggKCRjYW5kaWRhdGVzIGFzICRjYW5kaWRhdGUpIHsKaWYgKCRjYW5kaWRhdGUgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKaWYgKGlzc2V0KCRtYXRjaGVzW3NwbF9vYmplY3RfaGFzaCgkY2FuZGlkYXRlLT5nZXRBbGlhc09mKCkpXSkpIHsKJG1hdGNoZXNbc3BsX29iamVjdF9oYXNoKCRjYW5kaWRhdGUpXSA9ICRjYW5kaWRhdGU7Cn0KfQp9CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJG1hdGNoZXMpOwoKdW5zZXQoJHBhY2thZ2VOYW1lTWFwWyRuYW1lXSk7Cn0KfQoKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsICYmIGNvdW50KCRwYWNrYWdlTmFtZU1hcCkpIHsKaWYgKCR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCkgewpmb3JlYWNoICgkcGFja2FnZU5hbWVNYXAgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCEkdGhpcy0+bGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyhzdHJ0b2xvd2VyKCRuYW1lKSkpIHsKdW5zZXQoJHBhY2thZ2VOYW1lTWFwWyRuYW1lXSk7Cn0KfQp9CgokcmVzdWx0ID0gJHRoaXMtPmxvYWRBc3luY1BhY2thZ2VzKCRwYWNrYWdlTmFtZU1hcCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7CiRwYWNrYWdlcyA9IGFycmF5X21lcmdlKCRwYWNrYWdlcywgJHJlc3VsdFsncGFja2FnZXMnXSk7CiRuYW1lc0ZvdW5kID0gYXJyYXlfbWVyZ2UoJG5hbWVzRm91bmQsICRyZXN1bHRbJ25hbWVzRm91bmQnXSk7Cn0KCnJldHVybiBbJ25hbWVzRm91bmQnID0+IGFycmF5X2tleXMoJG5hbWVzRm91bmQpLCAncGFja2FnZXMnID0+ICRwYWNrYWdlc107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpCnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSg2MDApOwoKaWYgKCR0aGlzLT5zZWFyY2hVcmwgJiYgJG1vZGUgPT09IHNlbGY6OlNFQVJDSF9GVUxMVEVYVCkgewokdXJsID0gc3RyX3JlcGxhY2UoWyclcXVlcnklJywgJyV0eXBlJSddLCBbdXJsZW5jb2RlKCRxdWVyeSksICR0eXBlXSwgJHRoaXMtPnNlYXJjaFVybCk7Cgokc2VhcmNoID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJHRoaXMtPm9wdGlvbnMpLT5kZWNvZGVKc29uKCk7CgppZiAoZW1wdHkoJHNlYXJjaFsncmVzdWx0cyddKSkgewpyZXR1cm4gW107Cn0KCiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCRzZWFyY2hbJ3Jlc3VsdHMnXSBhcyAkcmVzdWx0KSB7CgppZiAoIWVtcHR5KCRyZXN1bHRbJ3ZpcnR1YWwnXSkpIHsKY29udGludWU7Cn0KCiRyZXN1bHRzW10gPSAkcmVzdWx0Owp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCmlmICgkbW9kZSA9PT0gc2VsZjo6U0VBUkNIX1ZFTkRPUikgewokcmVzdWx0cyA9IFtdOwokcmVnZXggPSAneyg/OicuaW1wbG9kZSgnfCcsIFByZWc6OnNwbGl0KCd7XHMrfScsICRxdWVyeSkpLicpfWknOwoKJHZlbmRvck5hbWVzID0gJHRoaXMtPmdldFZlbmRvck5hbWVzKCk7CmZvcmVhY2ggKFByZWc6OmdyZXAoJHJlZ2V4LCAkdmVuZG9yTmFtZXMpIGFzICRuYW1lKSB7CiRyZXN1bHRzW10gPSBbJ25hbWUnID0+ICRuYW1lLCAnZGVzY3JpcHRpb24nID0+ICcnXTsKfQoKcmV0dXJuICRyZXN1bHRzOwp9CgppZiAoJHRoaXMtPmhhc1Byb3ZpZGVycygpIHx8ICR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsKSB7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15cXig/UDxxdWVyeT4oP1A8dmVuZG9yPlthLXowLTlfLi1dKykvW2EtejAtOV8uLV0qKVwqPyR9aScsICRxdWVyeSwgJG1hdGNoKSAmJiAkdGhpcy0+bGlzdFVybCAhPT0gbnVsbCkgewokdXJsID0gJHRoaXMtPmxpc3RVcmwgLiAnP3ZlbmRvcj0nLnVybGVuY29kZSgkbWF0Y2hbJ3ZlbmRvciddKS4nJmZpbHRlcj0nLnVybGVuY29kZSgkbWF0Y2hbJ3F1ZXJ5J10uJyonKTsKJHJlc3VsdCA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCR1cmwsICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKJHJlc3VsdHMgPSBbXTsKZm9yZWFjaCAoJHJlc3VsdFsncGFja2FnZU5hbWVzJ10gYXMgJG5hbWUpIHsKJHJlc3VsdHNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICdkZXNjcmlwdGlvbicgPT4gJyddOwp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCiRyZXN1bHRzID0gW107CiRyZWdleCA9ICd7KD86Jy5pbXBsb2RlKCd8JywgUHJlZzo6c3BsaXQoJ3tccyt9JywgJHF1ZXJ5KSkuJyl9aSc7CgokcGFja2FnZU5hbWVzID0gJHRoaXMtPmdldFBhY2thZ2VOYW1lcygpOwpmb3JlYWNoIChQcmVnOjpncmVwKCRyZWdleCwgJHBhY2thZ2VOYW1lcykgYXMgJG5hbWUpIHsKJHJlc3VsdHNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICdkZXNjcmlwdGlvbicgPT4gJyddOwp9CgpyZXR1cm4gJHJlc3VsdHM7Cn0KCnJldHVybiBwYXJlbnQ6OnNlYXJjaCgkcXVlcnksICRtb2RlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1NlY3VyaXR5QWR2aXNvcmllcygpOiBib29sCnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSg2MDApOwoKcmV0dXJuICR0aGlzLT5zZWN1cml0eUFkdmlzb3J5Q29uZmlnICE9PSBudWxsICYmICgkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snbWV0YWRhdGEnXSB8fCAkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snYXBpLXVybCddICE9PSBudWxsKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZUNvbnN0cmFpbnRNYXAsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSg2MDApOwppZiAobnVsbCA9PT0gJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWcpIHsKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gW10sICdhZHZpc29yaWVzJyA9PiBbXV07Cn0KCiRhZHZpc29yaWVzID0gW107CiRuYW1lc0ZvdW5kID0gW107CgokYXBpVXJsID0gJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ2FwaS11cmwnXTsKCgppZiAoJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0KSB7CmZvcmVhY2ggKCRwYWNrYWdlQ29uc3RyYWludE1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoISR0aGlzLT5sYXp5UHJvdmlkZXJzUmVwb0NvbnRhaW5zKHN0cnRvbG93ZXIoJG5hbWUpKSkgewp1bnNldCgkcGFja2FnZUNvbnN0cmFpbnRNYXBbJG5hbWVdKTsKfQp9Cn0KCiRwYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwoKCgoKCiRjcmVhdGUgPSBmdW5jdGlvbiAoYXJyYXkgJGRhdGEsIHN0cmluZyAkbmFtZSkgdXNlICgkcGFyc2VyLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgJiRwYWNrYWdlQ29uc3RyYWludE1hcCk6ID9QYXJ0aWFsU2VjdXJpdHlBZHZpc29yeSB7CiRhZHZpc29yeSA9IFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5OjpjcmVhdGUoJG5hbWUsICRkYXRhLCAkcGFyc2VyKTsKaWYgKCEkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyAmJiAhJGFkdmlzb3J5IGluc3RhbmNlb2YgU2VjdXJpdHlBZHZpc29yeSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0Fkdmlzb3J5IGZvciAnLiRuYW1lLicgY291bGQgbm90IGJlIGxvYWRlZCBhcyBhIGZ1bGwgYWR2aXNvcnkgZnJvbSAnLiR0aGlzLT5nZXRSZXBvTmFtZSgpIC4gUEhQX0VPTCAuIHZhcl9leHBvcnQoJGRhdGEsIHRydWUpKTsKfQppZiAoISRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+bWF0Y2hlcygkcGFja2FnZUNvbnN0cmFpbnRNYXBbJG5hbWVdKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRhZHZpc29yeTsKfTsKCmlmICgkdGhpcy0+c2VjdXJpdHlBZHZpc29yeUNvbmZpZ1snbWV0YWRhdGEnXSAmJiAoJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgfHwgJGFwaVVybCA9PT0gbnVsbCkpIHsKJHByb21pc2VzID0gW107CmZvcmVhY2ggKCRwYWNrYWdlQ29uc3RyYWludE1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewokbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOwoKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRuYW1lKSB8fCAnX19yb290X18nID09PSAkbmFtZSkgewpjb250aW51ZTsKfQoKJHByb21pc2VzW10gPSAkdGhpcy0+c3RhcnRDYWNoZWRBc3luY0Rvd25sb2FkKCRuYW1lLCAkbmFtZSkKLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHNwZWMpIHVzZSAoJiRhZHZpc29yaWVzLCAmJG5hbWVzRm91bmQsICYkcGFja2FnZUNvbnN0cmFpbnRNYXAsICRuYW1lLCAkY3JlYXRlKTogdm9pZCB7ClskcmVzcG9uc2VdID0gJHNwZWM7CgppZiAoIWlzc2V0KCRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSB8fCAhaXNfYXJyYXkoJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10pKSB7CnJldHVybjsKfQoKJG5hbWVzRm91bmRbJG5hbWVdID0gdHJ1ZTsKaWYgKGNvdW50KCRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSA+IDApIHsKJGFkdmlzb3JpZXNbJG5hbWVdID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcihhcnJheV9tYXAoCnN0YXRpYyBmdW5jdGlvbiAoJGRhdGEpIHVzZSAoJG5hbWUsICRjcmVhdGUpIHsKcmV0dXJuICRjcmVhdGUoJGRhdGEsICRuYW1lKTsKfSwKJHJlc3BvbnNlWydzZWN1cml0eS1hZHZpc29yaWVzJ10KKSkpOwp9CnVuc2V0KCRwYWNrYWdlQ29uc3RyYWludE1hcFskbmFtZV0pOwp9KTsKfQoKJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzKTsKfQoKaWYgKCRhcGlVcmwgIT09IG51bGwgJiYgY291bnQoJHBhY2thZ2VDb25zdHJhaW50TWFwKSA+IDApIHsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKJG9wdGlvbnNbJ2h0dHAnXVsnbWV0aG9kJ10gPSAnUE9TVCc7CmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAoYXJyYXkpICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp9CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnQ29udGVudC10eXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnOwokb3B0aW9uc1snaHR0cCddWyd0aW1lb3V0J10gPSAxMDsKJG9wdGlvbnNbJ2h0dHAnXVsnY29udGVudCddID0gaHR0cF9idWlsZF9xdWVyeShbJ3BhY2thZ2VzJyA9PiBhcnJheV9rZXlzKCRwYWNrYWdlQ29uc3RyYWludE1hcCldKTsKCiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRhcGlVcmwsICRvcHRpb25zKTsKJHdhcm5lZCA9IGZhbHNlOwoKZm9yZWFjaCAoJHJlc3BvbnNlLT5kZWNvZGVKc29uKClbJ2Fkdmlzb3JpZXMnXSBhcyAkbmFtZSA9PiAkbGlzdCkgewppZiAoIWlzc2V0KCRwYWNrYWdlQ29uc3RyYWludE1hcFskbmFtZV0pKSB7CmlmICghJHdhcm5lZCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJHRoaXMtPmdldFJlcG9OYW1lKCkuJyByZXR1cm5lZCBuYW1lcyB3aGljaCB3ZXJlIG5vdCByZXF1ZXN0ZWQgaW4gcmVzcG9uc2UgdG8gdGhlIHNlY3VyaXR5LWFkdmlzb3JpZXMgQVBJLiAnLiRuYW1lLicgd2FzIG5vdCByZXF1ZXN0ZWQgYnV0IGlzIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlLiBSZXF1ZXN0ZWQgbmFtZXMgd2VyZTogJy5pbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJHBhY2thZ2VDb25zdHJhaW50TWFwKSkuJzwvd2FybmluZz4nKTsKJHdhcm5lZCA9IHRydWU7Cn0KY29udGludWU7Cn0KaWYgKGNvdW50KCRsaXN0KSA+IDApIHsKJGFkdmlzb3JpZXNbJG5hbWVdID0gYXJyYXlfdmFsdWVzKGFycmF5X2ZpbHRlcihhcnJheV9tYXAoCnN0YXRpYyBmdW5jdGlvbiAoJGRhdGEpIHVzZSAoJG5hbWUsICRjcmVhdGUpIHsKcmV0dXJuICRjcmVhdGUoJGRhdGEsICRuYW1lKTsKfSwKJGxpc3QKKSkpOwp9CiRuYW1lc0ZvdW5kWyRuYW1lXSA9IHRydWU7Cn0KfQoKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gYXJyYXlfa2V5cygkbmFtZXNGb3VuZCksICdhZHZpc29yaWVzJyA9PiBhcnJheV9maWx0ZXIoJGFkdmlzb3JpZXMsIHN0YXRpYyBmdW5jdGlvbiAoJGFkdik6IGJvb2wgeyByZXR1cm4gXGNvdW50KCRhZHYpID4gMDsgfSldOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKHN0cmluZyAkcGFja2FnZU5hbWUpCnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwokcmVzdWx0ID0gW107CgppZiAoJHRoaXMtPnByb3ZpZGVyc0FwaVVybCkgewp0cnkgewokYXBpUmVzdWx0ID0gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRwYWNrYWdlTmFtZSwgJHRoaXMtPnByb3ZpZGVyc0FwaVVybCksICR0aGlzLT5vcHRpb25zKS0+ZGVjb2RlSnNvbigpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewpyZXR1cm4gJHJlc3VsdDsKfQp0aHJvdyAkZTsKfQoKZm9yZWFjaCAoJGFwaVJlc3VsdFsncHJvdmlkZXJzJ10gYXMgJHByb3ZpZGVyKSB7CiRyZXN1bHRbJHByb3ZpZGVyWyduYW1lJ11dID0gJHByb3ZpZGVyOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKCR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMoKSkgewppZiAoIWlzX2FycmF5KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2hhc1BhcnRpYWxQYWNrYWdlcyBmYWlsZWQgdG8gaW5pdGlhbGl6ZSAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lJyk7Cn0KZm9yZWFjaCAoJHRoaXMtPnBhcnRpYWxQYWNrYWdlc0J5TmFtZSBhcyAkdmVyc2lvbnMpIHsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICRjYW5kaWRhdGUpIHsKaWYgKGlzc2V0KCRyZXN1bHRbJGNhbmRpZGF0ZVsnbmFtZSddXSkgfHwgIWlzc2V0KCRjYW5kaWRhdGVbJ3Byb3ZpZGUnXVskcGFja2FnZU5hbWVdKSkgewpjb250aW51ZTsKfQokcmVzdWx0WyRjYW5kaWRhdGVbJ25hbWUnXV0gPSBbCiduYW1lJyA9PiAkY2FuZGlkYXRlWyduYW1lJ10sCidkZXNjcmlwdGlvbicgPT4gJGNhbmRpZGF0ZVsnZGVzY3JpcHRpb24nXSA/PyAnJywKJ3R5cGUnID0+ICRjYW5kaWRhdGVbJ3R5cGUnXSA/PyAnJywKXTsKfQp9Cn0KCmlmICgkdGhpcy0+cGFja2FnZXMpIHsKJHJlc3VsdCA9IGFycmF5X21lcmdlKCRyZXN1bHQsIHBhcmVudDo6Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSkpOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcm92aWRlck5hbWVzKCk6IGFycmF5CnsKJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwoKaWYgKG51bGwgPT09ICR0aGlzLT5wcm92aWRlckxpc3RpbmcpIHsKJGRhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmIChpc19hcnJheSgkZGF0YSkpIHsKJHRoaXMtPmxvYWRQcm92aWRlckxpc3RpbmdzKCRkYXRhKTsKfQp9CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKCnJldHVybiBbXTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5wcm92aWRlcnNVcmwgJiYgbnVsbCAhPT0gJHRoaXMtPnByb3ZpZGVyTGlzdGluZykgewpyZXR1cm4gYXJyYXlfa2V5cygkdGhpcy0+cHJvdmlkZXJMaXN0aW5nKTsKfQoKcmV0dXJuIFtdOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlUGFja2FnZVRyYW5zcG9ydE9wdGlvbnMoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IHZvaWQKewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0RGlzdFVybHMoKSBhcyAkdXJsKSB7CmlmIChzdHJwb3MoJHVybCwgJHRoaXMtPmJhc2VVcmwpID09PSAwKSB7CiRwYWNrYWdlLT5zZXRUcmFuc3BvcnRPcHRpb25zKCR0aGlzLT5vcHRpb25zKTsKCnJldHVybjsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gaGFzUHJvdmlkZXJzKCk6IGJvb2wKewokdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CgpyZXR1cm4gJHRoaXMtPmhhc1Byb3ZpZGVyczsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gd2hhdFByb3ZpZGVzKHN0cmluZyAkbmFtZSwgP2FycmF5ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgPSBudWxsLCA/YXJyYXkgJHN0YWJpbGl0eUZsYWdzID0gbnVsbCwgYXJyYXkgJGFscmVhZHlMb2FkZWQgPSBbXSk6IGFycmF5CnsKJHBhY2thZ2VzU291cmNlID0gbnVsbDsKaWYgKCEkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzKCkgfHwgIWlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5hbWVdKSkgewoKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpIHx8ICdfX3Jvb3RfXycgPT09ICRuYW1lKSB7CnJldHVybiBbXTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5wcm92aWRlckxpc3RpbmcpIHsKJGRhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmIChpc19hcnJheSgkZGF0YSkpIHsKJHRoaXMtPmxvYWRQcm92aWRlckxpc3RpbmdzKCRkYXRhKTsKfQp9CgokdXNlTGFzdE1vZGlmaWVkQ2hlY2sgPSBmYWxzZTsKaWYgKCR0aGlzLT5sYXp5UHJvdmlkZXJzVXJsICYmICFpc3NldCgkdGhpcy0+cHJvdmlkZXJMaXN0aW5nWyRuYW1lXSkpIHsKJGhhc2ggPSBudWxsOwokdXJsID0gc3RyX3JlcGxhY2UoJyVwYWNrYWdlJScsICRuYW1lLCAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCk7CiRjYWNoZUtleSA9ICdwcm92aWRlci0nLnN0cnRyKCRuYW1lLCAnLycsICckJykuJy5qc29uJzsKJHVzZUxhc3RNb2RpZmllZENoZWNrID0gdHJ1ZTsKfSBlbHNlaWYgKCR0aGlzLT5wcm92aWRlcnNVcmwpIHsKCmlmICghaXNzZXQoJHRoaXMtPnByb3ZpZGVyTGlzdGluZ1skbmFtZV0pKSB7CnJldHVybiBbXTsKfQoKJGhhc2ggPSAkdGhpcy0+cHJvdmlkZXJMaXN0aW5nWyRuYW1lXVsnc2hhMjU2J107CiR1cmwgPSBzdHJfcmVwbGFjZShbJyVwYWNrYWdlJScsICclaGFzaCUnXSwgWyRuYW1lLCAkaGFzaF0sICR0aGlzLT5wcm92aWRlcnNVcmwpOwokY2FjaGVLZXkgPSAncHJvdmlkZXItJy5zdHJ0cigkbmFtZSwgJy8nLCAnJCcpLicuanNvbic7Cn0gZWxzZSB7CnJldHVybiBbXTsKfQoKJHBhY2thZ2VzID0gbnVsbDsKaWYgKCEkdXNlTGFzdE1vZGlmaWVkQ2hlY2sgJiYgJGhhc2ggJiYgJHRoaXMtPmNhY2hlLT5zaGEyNTYoJGNhY2hlS2V5KSA9PT0gJGhhc2gpIHsKJHBhY2thZ2VzID0ganNvbl9kZWNvZGUoJHRoaXMtPmNhY2hlLT5yZWFkKCRjYWNoZUtleSksIHRydWUpOwokcGFja2FnZXNTb3VyY2UgPSAnY2FjaGVkIGZpbGUgKCcuJGNhY2hlS2V5Licgb3JpZ2luYXRpbmcgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9IGVsc2VpZiAoJHVzZUxhc3RNb2RpZmllZENoZWNrKSB7CmlmICgkY29udGVudHMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSkgewokY29udGVudHMgPSBqc29uX2RlY29kZSgkY29udGVudHMsIHRydWUpOwoKaWYgKGlzc2V0KCRhbHJlYWR5TG9hZGVkWyRuYW1lXSkpIHsKJHBhY2thZ2VzID0gJGNvbnRlbnRzOwokcGFja2FnZXNTb3VyY2UgPSAnY2FjaGVkIGZpbGUgKCcuJGNhY2hlS2V5Licgb3JpZ2luYXRpbmcgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJyknOwp9IGVsc2VpZiAoaXNzZXQoJGNvbnRlbnRzWydsYXN0LW1vZGlmaWVkJ10pKSB7CiRyZXNwb25zZSA9ICR0aGlzLT5mZXRjaEZpbGVJZkxhc3RNb2RpZmllZCgkdXJsLCAkY2FjaGVLZXksICRjb250ZW50c1snbGFzdC1tb2RpZmllZCddKTsKJHBhY2thZ2VzID0gdHJ1ZSA9PT0gJHJlc3BvbnNlID8gJGNvbnRlbnRzIDogJHJlc3BvbnNlOwokcGFja2FnZXNTb3VyY2UgPSB0cnVlID09PSAkcmVzcG9uc2UgPyAnY2FjaGVkIGZpbGUgKCcuJGNhY2hlS2V5Licgb3JpZ2luYXRpbmcgZnJvbSAnLlVybDo6c2FuaXRpemUoJHVybCkuJyknIDogJ2Rvd25sb2FkZWQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKfQp9Cn0KCmlmICghJHBhY2thZ2VzKSB7CnRyeSB7CiRwYWNrYWdlcyA9ICR0aGlzLT5mZXRjaEZpbGUoJHVybCwgJGNhY2hlS2V5LCAkaGFzaCwgJHVzZUxhc3RNb2RpZmllZENoZWNrKTsKJHBhY2thZ2VzU291cmNlID0gJ2Rvd25sb2FkZWQgZmlsZSAoJy5Vcmw6OnNhbml0aXplKCR1cmwpLicpJzsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CgppZiAoJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgJiYgaW5fYXJyYXkoJGUtPmdldFN0YXR1c0NvZGUoKSwgWzQwNCwgNDk5XSwgdHJ1ZSkpIHsKJHBhY2thZ2VzID0gWydwYWNrYWdlcycgPT4gW11dOwokcGFja2FnZXNTb3VyY2UgPSAnbm90LWZvdW5kIGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7CmlmICgkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0OTkpIHsKJHRoaXMtPmlvLT5lcnJvcignPHdhcm5pbmc+JyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC93YXJuaW5nPicpOwp9Cn0gZWxzZSB7CnRocm93ICRlOwp9Cn0KfQoKJGxvYWRpbmdQYXJ0aWFsUGFja2FnZSA9IGZhbHNlOwp9IGVsc2UgewokcGFja2FnZXMgPSBbJ3BhY2thZ2VzJyA9PiBbJ3ZlcnNpb25zJyA9PiAkdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lWyRuYW1lXV1dOwokcGFja2FnZXNTb3VyY2UgPSAncm9vdCBmaWxlICgnLlVybDo6c2FuaXRpemUoJHRoaXMtPmdldFBhY2thZ2VzSnNvblVybCgpKS4nKSc7CiRsb2FkaW5nUGFydGlhbFBhY2thZ2UgPSB0cnVlOwp9CgokcmVzdWx0ID0gW107CiR2ZXJzaW9uc1RvTG9hZCA9IFtdOwpmb3JlYWNoICgkcGFja2FnZXNbJ3BhY2thZ2VzJ10gYXMgJHZlcnNpb25zKSB7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewokbm9ybWFsaXplZE5hbWUgPSBzdHJ0b2xvd2VyKCR2ZXJzaW9uWyduYW1lJ10pOwoKCmlmICgkbm9ybWFsaXplZE5hbWUgIT09ICRuYW1lKSB7CmNvbnRpbnVlOwp9CgppZiAoISRsb2FkaW5nUGFydGlhbFBhY2thZ2UgJiYgJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcygpICYmIGlzc2V0KCR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJG5vcm1hbGl6ZWROYW1lXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJHZlcnNpb25zVG9Mb2FkWyR2ZXJzaW9uWyd1aWQnXV0pKSB7CmlmICghaXNzZXQoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9IGVsc2VpZiAoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewoKJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkdmVyc2lvblsndmVyc2lvbiddKTsKfQoKCmlmIChpc3NldCgkYWxyZWFkeUxvYWRlZFskbmFtZV1bJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddXSkpIHsKY29udGludWU7Cn0KCmlmICgkdGhpcy0+aXNWZXJzaW9uQWNjZXB0YWJsZShudWxsLCAkbm9ybWFsaXplZE5hbWUsICR2ZXJzaW9uLCAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MpKSB7CiR2ZXJzaW9uc1RvTG9hZFskdmVyc2lvblsndWlkJ11dID0gJHZlcnNpb247Cn0KfQp9Cn0KCgokbG9hZGVkUGFja2FnZXMgPSAkdGhpcy0+Y3JlYXRlUGFja2FnZXMoJHZlcnNpb25zVG9Mb2FkLCAkcGFja2FnZXNTb3VyY2UpOwokdWlkcyA9IGFycmF5X2tleXMoJHZlcnNpb25zVG9Mb2FkKTsKCmZvcmVhY2ggKCRsb2FkZWRQYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKJHBhY2thZ2UtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokdWlkID0gJHVpZHNbJGluZGV4XTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokYWxpYXNlZCA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7CiRhbGlhc2VkLT5zZXRSZXBvc2l0b3J5KCR0aGlzKTsKCiRyZXN1bHRbJHVpZF0gPSAkYWxpYXNlZDsKJHJlc3VsdFskdWlkLictYWxpYXMnXSA9ICRwYWNrYWdlOwp9IGVsc2UgewokcmVzdWx0WyR1aWRdID0gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCiRyZXBvRGF0YSA9ICR0aGlzLT5sb2FkRGF0YUZyb21TZXJ2ZXIoKTsKCmZvcmVhY2ggKCR0aGlzLT5jcmVhdGVQYWNrYWdlcygkcmVwb0RhdGEsICdyb290IGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCkpLicpJykgYXMgJHBhY2thZ2UpIHsKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpCnsKcGFyZW50OjphZGRQYWNrYWdlKCRwYWNrYWdlKTsKJHRoaXMtPmNvbmZpZ3VyZVBhY2thZ2VUcmFuc3BvcnRPcHRpb25zKCRwYWNrYWdlKTsKfQoKCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRBc3luY1BhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZXMsID9hcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gbnVsbCwgP2FycmF5ICRzdGFiaWxpdHlGbGFncyA9IG51bGwsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CiR0aGlzLT5sb2FkUm9vdFNlcnZlckZpbGUoKTsKCiRwYWNrYWdlcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwokcHJvbWlzZXMgPSBbXTsKCmlmIChudWxsID09PSAkdGhpcy0+bGF6eVByb3ZpZGVyc1VybCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdsb2FkQXN5bmNQYWNrYWdlcyBvbmx5IHN1cHBvcnRzIHYyIHByb3RvY29sIGNvbXBvc2VyIHJlcG9zIHdpdGggYSBtZXRhZGF0YS11cmwnKTsKfQoKCmZvcmVhY2ggKCRwYWNrYWdlTmFtZXMgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgPT09IG51bGwgfHwgJHN0YWJpbGl0eUZsYWdzID09PSBudWxsIHx8IFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkc3RhYmlsaXR5RmxhZ3MsIFskbmFtZV0sICdkZXYnKSkgewokcGFja2FnZU5hbWVzWyRuYW1lLid+ZGV2J10gPSAkY29uc3RyYWludDsKfQoKaWYgKGlzc2V0KCRhY2NlcHRhYmxlU3RhYmlsaXRpZXNbJ2RldiddKSAmJiBjb3VudCgkYWNjZXB0YWJsZVN0YWJpbGl0aWVzKSA9PT0gMSAmJiBjb3VudCgkc3RhYmlsaXR5RmxhZ3MpID09PSAwKSB7CnVuc2V0KCRwYWNrYWdlTmFtZXNbJG5hbWVdKTsKfQp9Cgpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRuYW1lID0+ICRjb25zdHJhaW50KSB7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgokcmVhbE5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7fmRldiR9JywgJycsICRuYW1lKTsKCmlmIChQbGF0Zm9ybVJlcG9zaXRvcnk6OmlzUGxhdGZvcm1QYWNrYWdlKCRyZWFsTmFtZSkgfHwgJ19fcm9vdF9fJyA9PT0gJHJlYWxOYW1lKSB7CmNvbnRpbnVlOwp9CgokcHJvbWlzZXNbXSA9ICR0aGlzLT5zdGFydENhY2hlZEFzeW5jRG93bmxvYWQoJG5hbWUsICRyZWFsTmFtZSkKLT50aGVuKGZ1bmN0aW9uIChhcnJheSAkc3BlYykgdXNlICgmJHBhY2thZ2VzLCAmJG5hbWVzRm91bmQsICRyZWFsTmFtZSwgJGNvbnN0cmFpbnQsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOiB2b2lkIHsKWyRyZXNwb25zZSwgJHBhY2thZ2VzU291cmNlXSA9ICRzcGVjOwppZiAobnVsbCA9PT0gJHJlc3BvbnNlIHx8ICFpc3NldCgkcmVzcG9uc2VbJ3BhY2thZ2VzJ11bJHJlYWxOYW1lXSkpIHsKcmV0dXJuOwp9CgokdmVyc2lvbnMgPSAkcmVzcG9uc2VbJ3BhY2thZ2VzJ11bJHJlYWxOYW1lXTsKCmlmIChpc3NldCgkcmVzcG9uc2VbJ21pbmlmaWVkJ10pICYmICRyZXNwb25zZVsnbWluaWZpZWQnXSA9PT0gJ2NvbXBvc2VyLzIuMCcpIHsKJHZlcnNpb25zID0gTWV0YWRhdGFNaW5pZmllcjo6ZXhwYW5kKCR2ZXJzaW9ucyk7Cn0KCiRuYW1lc0ZvdW5kWyRyZWFsTmFtZV0gPSB0cnVlOwokdmVyc2lvbnNUb0xvYWQgPSBbXTsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CmlmICghaXNzZXQoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddKSkgewokdmVyc2lvblsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCR2ZXJzaW9uWyd2ZXJzaW9uJ10pOwp9IGVsc2VpZiAoJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID09PSBWZXJzaW9uUGFyc2VyOjpERUZBVUxUX0JSQU5DSF9BTElBUykgewoKJHZlcnNpb25bJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkdmVyc2lvblsndmVyc2lvbiddKTsKfQoKCmlmIChpc3NldCgkYWxyZWFkeUxvYWRlZFskcmVhbE5hbWVdWyR2ZXJzaW9uWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoJHRoaXMtPmlzVmVyc2lvbkFjY2VwdGFibGUoJGNvbnN0cmFpbnQsICRyZWFsTmFtZSwgJHZlcnNpb24sICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncykpIHsKJHZlcnNpb25zVG9Mb2FkW10gPSAkdmVyc2lvbjsKfQp9CgokbG9hZGVkUGFja2FnZXMgPSAkdGhpcy0+Y3JlYXRlUGFja2FnZXMoJHZlcnNpb25zVG9Mb2FkLCAkcGFja2FnZXNTb3VyY2UpOwpmb3JlYWNoICgkbG9hZGVkUGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJHBhY2thZ2UtPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokcGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlKV0gPSAkcGFja2FnZTsKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSAmJiAhaXNzZXQoJHBhY2thZ2VzW3NwbF9vYmplY3RfaGFzaCgkcGFja2FnZS0+Z2V0QWxpYXNPZigpKV0pKSB7CiRwYWNrYWdlLT5nZXRBbGlhc09mKCktPnNldFJlcG9zaXRvcnkoJHRoaXMpOwokcGFja2FnZXNbc3BsX29iamVjdF9oYXNoKCRwYWNrYWdlLT5nZXRBbGlhc09mKCkpXSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KfQp9KTsKfQoKJHRoaXMtPmxvb3AtPndhaXQoJHByb21pc2VzKTsKCnJldHVybiBbJ25hbWVzRm91bmQnID0+ICRuYW1lc0ZvdW5kLCAncGFja2FnZXMnID0+ICRwYWNrYWdlc107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc3RhcnRDYWNoZWRBc3luY0Rvd25sb2FkKHN0cmluZyAkZmlsZU5hbWUsID9zdHJpbmcgJHBhY2thZ2VOYW1lID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignc3RhcnRDYWNoZWRBc3luY0Rvd25sb2FkIG9ubHkgc3VwcG9ydHMgdjIgcHJvdG9jb2wgY29tcG9zZXIgcmVwb3Mgd2l0aCBhIG1ldGFkYXRhLXVybCcpOwp9CgokbmFtZSA9IHN0cnRvbG93ZXIoJGZpbGVOYW1lKTsKJHBhY2thZ2VOYW1lID0gJHBhY2thZ2VOYW1lID8/ICRuYW1lOwoKJHVybCA9IHN0cl9yZXBsYWNlKCclcGFja2FnZSUnLCAkbmFtZSwgJHRoaXMtPmxhenlQcm92aWRlcnNVcmwpOwokY2FjaGVLZXkgPSAncHJvdmlkZXItJy5zdHJ0cigkbmFtZSwgJy8nLCAnficpLicuanNvbic7CgokbGFzdE1vZGlmaWVkID0gbnVsbDsKaWYgKCRjb250ZW50cyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpKSB7CiRjb250ZW50cyA9IGpzb25fZGVjb2RlKCRjb250ZW50cywgdHJ1ZSk7CiRsYXN0TW9kaWZpZWQgPSAkY29udGVudHNbJ2xhc3QtbW9kaWZpZWQnXSA/PyBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPmFzeW5jRmV0Y2hGaWxlKCR1cmwsICRjYWNoZUtleSwgJGxhc3RNb2RpZmllZCkKLT50aGVuKHN0YXRpYyBmdW5jdGlvbiAoJHJlc3BvbnNlKSB1c2UgKCR1cmwsICRjYWNoZUtleSwgJGNvbnRlbnRzLCAkcGFja2FnZU5hbWUpOiBhcnJheSB7CiRwYWNrYWdlc1NvdXJjZSA9ICdkb3dubG9hZGVkIGZpbGUgKCcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7CgppZiAodHJ1ZSA9PT0gJHJlc3BvbnNlKSB7CiRwYWNrYWdlc1NvdXJjZSA9ICdjYWNoZWQgZmlsZSAoJy4kY2FjaGVLZXkuJyBvcmlnaW5hdGluZyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nKSc7CiRyZXNwb25zZSA9ICRjb250ZW50czsKfQoKaWYgKCFpc3NldCgkcmVzcG9uc2VbJ3BhY2thZ2VzJ11bJHBhY2thZ2VOYW1lXSkgJiYgIWlzc2V0KCRyZXNwb25zZVsnc2VjdXJpdHktYWR2aXNvcmllcyddKSkgewpyZXR1cm4gW251bGwsICRwYWNrYWdlc1NvdXJjZV07Cn0KCnJldHVybiBbJHJlc3BvbnNlLCAkcGFja2FnZXNTb3VyY2VdOwp9KTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlzVmVyc2lvbkFjY2VwdGFibGUoP0NvbnN0cmFpbnRJbnRlcmZhY2UgJGNvbnN0cmFpbnQsIHN0cmluZyAkbmFtZSwgYXJyYXkgJHZlcnNpb25EYXRhLCA/YXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcyA9IG51bGwsID9hcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBudWxsKTogYm9vbAp7CiR2ZXJzaW9ucyA9IFskdmVyc2lvbkRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddXTsKCmlmICgkYWxpYXMgPSAkdGhpcy0+bG9hZGVyLT5nZXRCcmFuY2hBbGlhcygkdmVyc2lvbkRhdGEpKSB7CiR2ZXJzaW9uc1tdID0gJGFsaWFzOwp9Cgpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24pIHsKaWYgKG51bGwgIT09ICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMgJiYgbnVsbCAhPT0gJHN0YWJpbGl0eUZsYWdzICYmICFTdGFiaWxpdHlGaWx0ZXI6OmlzUGFja2FnZUFjY2VwdGFibGUoJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCBbJG5hbWVdLCBWZXJzaW9uUGFyc2VyOjpwYXJzZVN0YWJpbGl0eSgkdmVyc2lvbikpKSB7CmNvbnRpbnVlOwp9CgppZiAoJGNvbnN0cmFpbnQgJiYgIUNvbXBpbGluZ01hdGNoZXI6Om1hdGNoKCRjb25zdHJhaW50LCBDb25zdHJhaW50OjpPUF9FUSwgJHZlcnNpb24pKSB7CmNvbnRpbnVlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFBhY2thZ2VzSnNvblVybCgpOiBzdHJpbmcKewokanNvblVybFBhcnRzID0gcGFyc2VfdXJsKHN0cnRyKCR0aGlzLT51cmwsICdcXCcsICcvJykpOwoKaWYgKGlzc2V0KCRqc29uVXJsUGFydHNbJ3BhdGgnXSkgJiYgZmFsc2UgIT09IHN0cnBvcygkanNvblVybFBhcnRzWydwYXRoJ10sICcuanNvbicpKSB7CnJldHVybiAkdGhpcy0+dXJsOwp9CgpyZXR1cm4gJHRoaXMtPnVybCAuICcvcGFja2FnZXMuanNvbic7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBsb2FkUm9vdFNlcnZlckZpbGUoP2ludCAkcm9vdE1heEFnZSA9IG51bGwpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yb290RGF0YSkgewpyZXR1cm4gJHRoaXMtPnJvb3REYXRhOwp9CgppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSAmJiBzdHJwb3MoJHRoaXMtPnVybCwgJ2h0dHBzJykgPT09IDApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIGluIHlvdXIgcGhwLmluaSB0byBsb2FkIGluZm9ybWF0aW9uIGZyb20gJy4kdGhpcy0+dXJsKTsKfQoKaWYgKCRjYWNoZWREYXRhID0gJHRoaXMtPmNhY2hlLT5yZWFkKCdwYWNrYWdlcy5qc29uJykpIHsKJGNhY2hlZERhdGEgPSBqc29uX2RlY29kZSgkY2FjaGVkRGF0YSwgdHJ1ZSk7CmlmICgkcm9vdE1heEFnZSAhPT0gbnVsbCAmJiAoJGFnZSA9ICR0aGlzLT5jYWNoZS0+Z2V0QWdlKCdwYWNrYWdlcy5qc29uJykpICE9PSBmYWxzZSAmJiAkYWdlIDw9ICRyb290TWF4QWdlKSB7CiRkYXRhID0gJGNhY2hlZERhdGE7Cn0gZWxzZWlmIChpc3NldCgkY2FjaGVkRGF0YVsnbGFzdC1tb2RpZmllZCddKSkgewokcmVzcG9uc2UgPSAkdGhpcy0+ZmV0Y2hGaWxlSWZMYXN0TW9kaWZpZWQoJHRoaXMtPmdldFBhY2thZ2VzSnNvblVybCgpLCAncGFja2FnZXMuanNvbicsICRjYWNoZWREYXRhWydsYXN0LW1vZGlmaWVkJ10pOwokZGF0YSA9IHRydWUgPT09ICRyZXNwb25zZSA/ICRjYWNoZWREYXRhIDogJHJlc3BvbnNlOwp9Cn0KCmlmICghaXNzZXQoJGRhdGEpKSB7CiRkYXRhID0gJHRoaXMtPmZldGNoRmlsZSgkdGhpcy0+Z2V0UGFja2FnZXNKc29uVXJsKCksICdwYWNrYWdlcy5qc29uJywgbnVsbCwgdHJ1ZSk7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ25vdGlmeS1iYXRjaCddKSkgewokdGhpcy0+bm90aWZ5VXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsnbm90aWZ5LWJhdGNoJ10pOwp9IGVsc2VpZiAoIWVtcHR5KCRkYXRhWydub3RpZnknXSkpIHsKJHRoaXMtPm5vdGlmeVVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ25vdGlmeSddKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsnc2VhcmNoJ10pKSB7CiR0aGlzLT5zZWFyY2hVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydzZWFyY2gnXSk7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ21pcnJvcnMnXSkpIHsKZm9yZWFjaCAoJGRhdGFbJ21pcnJvcnMnXSBhcyAkbWlycm9yKSB7CmlmICghZW1wdHkoJG1pcnJvclsnZ2l0LXVybCddKSkgewokdGhpcy0+c291cmNlTWlycm9yc1snZ2l0J11bXSA9IFsndXJsJyA9PiAkbWlycm9yWydnaXQtdXJsJ10sICdwcmVmZXJyZWQnID0+ICFlbXB0eSgkbWlycm9yWydwcmVmZXJyZWQnXSldOwp9CmlmICghZW1wdHkoJG1pcnJvclsnaGctdXJsJ10pKSB7CiR0aGlzLT5zb3VyY2VNaXJyb3JzWydoZyddW10gPSBbJ3VybCcgPT4gJG1pcnJvclsnaGctdXJsJ10sICdwcmVmZXJyZWQnID0+ICFlbXB0eSgkbWlycm9yWydwcmVmZXJyZWQnXSldOwp9CmlmICghZW1wdHkoJG1pcnJvclsnZGlzdC11cmwnXSkpIHsKJHRoaXMtPmRpc3RNaXJyb3JzW10gPSBbCid1cmwnID0+ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJG1pcnJvclsnZGlzdC11cmwnXSksCidwcmVmZXJyZWQnID0+ICFlbXB0eSgkbWlycm9yWydwcmVmZXJyZWQnXSksCl07Cn0KfQp9CgppZiAoIWVtcHR5KCRkYXRhWydwcm92aWRlcnMtbGF6eS11cmwnXSkpIHsKJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydwcm92aWRlcnMtbGF6eS11cmwnXSk7CiR0aGlzLT5oYXNQcm92aWRlcnMgPSB0cnVlOwoKJHRoaXMtPmhhc1BhcnRpYWxQYWNrYWdlcyA9ICFlbXB0eSgkZGF0YVsncGFja2FnZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3BhY2thZ2VzJ10pOwp9CgoKCgppZiAoIWVtcHR5KCRkYXRhWydtZXRhZGF0YS11cmwnXSkpIHsKJHRoaXMtPmxhenlQcm92aWRlcnNVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydtZXRhZGF0YS11cmwnXSk7CiR0aGlzLT5wcm92aWRlcnNVcmwgPSBudWxsOwokdGhpcy0+aGFzUHJvdmlkZXJzID0gZmFsc2U7CiR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXMgPSAhZW1wdHkoJGRhdGFbJ3BhY2thZ2VzJ10pICYmIGlzX2FycmF5KCRkYXRhWydwYWNrYWdlcyddKTsKJHRoaXMtPmFsbG93U3NsRG93bmdyYWRlID0gZmFsc2U7CgoKCgppZiAoIWVtcHR5KCRkYXRhWydhdmFpbGFibGUtcGFja2FnZXMnXSkpIHsKJGF2YWlsUGFja2FnZXMgPSBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAkZGF0YVsnYXZhaWxhYmxlLXBhY2thZ2VzJ10pOwokdGhpcy0+YXZhaWxhYmxlUGFja2FnZXMgPSBhcnJheV9jb21iaW5lKCRhdmFpbFBhY2thZ2VzLCAkYXZhaWxQYWNrYWdlcyk7CiR0aGlzLT5oYXNBdmFpbGFibGVQYWNrYWdlTGlzdCA9IHRydWU7Cn0KCgoKCmlmICghZW1wdHkoJGRhdGFbJ2F2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zJ10pKSB7CiR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMgPSBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkcGF0dGVybik6IHN0cmluZyB7CnJldHVybiBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVUb1JlZ2V4cCgkcGF0dGVybik7Cn0sICRkYXRhWydhdmFpbGFibGUtcGFja2FnZS1wYXR0ZXJucyddKTsKJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0ID0gdHJ1ZTsKfQoKCgp1bnNldCgkZGF0YVsncHJvdmlkZXJzLXVybCddLCAkZGF0YVsncHJvdmlkZXJzJ10sICRkYXRhWydwcm92aWRlcnMtaW5jbHVkZXMnXSk7CgppZiAoaXNzZXQoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXSkgJiYgaXNfYXJyYXkoJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXSkpIHsKJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWcgPSBbCidtZXRhZGF0YScgPT4gJGRhdGFbJ3NlY3VyaXR5LWFkdmlzb3JpZXMnXVsnbWV0YWRhdGEnXSA/PyBmYWxzZSwKJ2FwaS11cmwnID0+IGlzc2V0KCRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ2FwaS11cmwnXSkgJiYgaXNfc3RyaW5nKCRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ2FwaS11cmwnXSkgPyAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydzZWN1cml0eS1hZHZpc29yaWVzJ11bJ2FwaS11cmwnXSkgOiBudWxsLApdOwppZiAoJHRoaXMtPnNlY3VyaXR5QWR2aXNvcnlDb25maWdbJ2FwaS11cmwnXSA9PT0gbnVsbCAmJiAhJHRoaXMtPmhhc0F2YWlsYWJsZVBhY2thZ2VMaXN0KSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIHNlY3VyaXR5IGFkdmlzb3J5IGNvbmZpZ3VyYXRpb24gb24gJy4kdGhpcy0+Z2V0UmVwb05hbWUoKS4nOiBJZiB0aGUgcmVwb3NpdG9yeSBkb2VzIG5vdCBwcm92aWRlIGEgc2VjdXJpdHktYWR2aXNvcmllcy5hcGktdXJsIHRoZW4gYXZhaWxhYmxlLXBhY2thZ2VzIG9yIGF2YWlsYWJsZS1wYWNrYWdlLXBhdHRlcm5zIGFyZSByZXF1aXJlZCB0byBiZSBwcm92aWRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29uLicpOwp9Cn0KfQoKaWYgKCR0aGlzLT5hbGxvd1NzbERvd25ncmFkZSkgewokdGhpcy0+dXJsID0gc3RyX3JlcGxhY2UoJ2h0dHBzOi8vJywgJ2h0dHA6Ly8nLCAkdGhpcy0+dXJsKTsKJHRoaXMtPmJhc2VVcmwgPSBzdHJfcmVwbGFjZSgnaHR0cHM6Ly8nLCAnaHR0cDovLycsICR0aGlzLT5iYXNlVXJsKTsKfQoKaWYgKCFlbXB0eSgkZGF0YVsncHJvdmlkZXJzLXVybCddKSkgewokdGhpcy0+cHJvdmlkZXJzVXJsID0gJHRoaXMtPmNhbm9uaWNhbGl6ZVVybCgkZGF0YVsncHJvdmlkZXJzLXVybCddKTsKJHRoaXMtPmhhc1Byb3ZpZGVycyA9IHRydWU7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ2xpc3QnXSkpIHsKJHRoaXMtPmxpc3RVcmwgPSAkdGhpcy0+Y2Fub25pY2FsaXplVXJsKCRkYXRhWydsaXN0J10pOwp9CgppZiAoIWVtcHR5KCRkYXRhWydwcm92aWRlcnMnXSkgfHwgIWVtcHR5KCRkYXRhWydwcm92aWRlcnMtaW5jbHVkZXMnXSkpIHsKJHRoaXMtPmhhc1Byb3ZpZGVycyA9IHRydWU7Cn0KCmlmICghZW1wdHkoJGRhdGFbJ3Byb3ZpZGVycy1hcGknXSkpIHsKJHRoaXMtPnByb3ZpZGVyc0FwaVVybCA9ICR0aGlzLT5jYW5vbmljYWxpemVVcmwoJGRhdGFbJ3Byb3ZpZGVycy1hcGknXSk7Cn0KCnJldHVybiAkdGhpcy0+cm9vdERhdGEgPSAkZGF0YTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjYW5vbmljYWxpemVVcmwoc3RyaW5nICR1cmwpOiBzdHJpbmcKewppZiAoc3RybGVuKCR1cmwpID09PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdFeHBlY3RlZCBhIHN0cmluZyB3aXRoIGEgdmFsdWUgYW5kIG5vdCBhbiBlbXB0eSBzdHJpbmcnKTsKfQoKaWYgKHN0cl9zdGFydHNfd2l0aCgkdXJsLCAnLycpKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XlteOl0rKzovL1teL10qK30nLCAkdGhpcy0+dXJsLCAkbWF0Y2hlcykpIHsKcmV0dXJuICRtYXRjaGVzWzBdIC4gJHVybDsKfQoKcmV0dXJuICR0aGlzLT51cmw7Cn0KCnJldHVybiAkdXJsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWREYXRhRnJvbVNlcnZlcigpOiBhcnJheQp7CiRkYXRhID0gJHRoaXMtPmxvYWRSb290U2VydmVyRmlsZSgpOwppZiAodHJ1ZSA9PT0gJGRhdGEpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignbG9hZFJvb3RTZXJ2ZXJGaWxlIHNob3VsZCBub3QgcmV0dXJuIHRydWUgZHVyaW5nIGluaXRpYWxpemF0aW9uJyk7Cn0KCnJldHVybiAkdGhpcy0+bG9hZEluY2x1ZGVzKCRkYXRhKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBoYXNQYXJ0aWFsUGFja2FnZXMoKTogYm9vbAp7CmlmICgkdGhpcy0+aGFzUGFydGlhbFBhY2thZ2VzICYmIG51bGwgPT09ICR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWUpIHsKJHRoaXMtPmluaXRpYWxpemVQYXJ0aWFsUGFja2FnZXMoKTsKfQoKcmV0dXJuICR0aGlzLT5oYXNQYXJ0aWFsUGFja2FnZXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbG9hZFByb3ZpZGVyTGlzdGluZ3MoJGRhdGEpOiB2b2lkCnsKaWYgKGlzc2V0KCRkYXRhWydwcm92aWRlcnMnXSkpIHsKaWYgKCFpc19hcnJheSgkdGhpcy0+cHJvdmlkZXJMaXN0aW5nKSkgewokdGhpcy0+cHJvdmlkZXJMaXN0aW5nID0gW107Cn0KJHRoaXMtPnByb3ZpZGVyTGlzdGluZyA9IGFycmF5X21lcmdlKCR0aGlzLT5wcm92aWRlckxpc3RpbmcsICRkYXRhWydwcm92aWRlcnMnXSk7Cn0KCmlmICgkdGhpcy0+cHJvdmlkZXJzVXJsICYmIGlzc2V0KCRkYXRhWydwcm92aWRlci1pbmNsdWRlcyddKSkgewokaW5jbHVkZXMgPSAkZGF0YVsncHJvdmlkZXItaW5jbHVkZXMnXTsKZm9yZWFjaCAoJGluY2x1ZGVzIGFzICRpbmNsdWRlID0+ICRtZXRhZGF0YSkgewokdXJsID0gJHRoaXMtPmJhc2VVcmwgLiAnLycgLiBzdHJfcmVwbGFjZSgnJWhhc2glJywgJG1ldGFkYXRhWydzaGEyNTYnXSwgJGluY2x1ZGUpOwokY2FjaGVLZXkgPSBzdHJfcmVwbGFjZShbJyVoYXNoJScsJyQnXSwgJycsICRpbmNsdWRlKTsKaWYgKCR0aGlzLT5jYWNoZS0+c2hhMjU2KCRjYWNoZUtleSkgPT09ICRtZXRhZGF0YVsnc2hhMjU2J10pIHsKJGluY2x1ZGVkRGF0YSA9IGpzb25fZGVjb2RlKCR0aGlzLT5jYWNoZS0+cmVhZCgkY2FjaGVLZXkpLCB0cnVlKTsKfSBlbHNlIHsKJGluY2x1ZGVkRGF0YSA9ICR0aGlzLT5mZXRjaEZpbGUoJHVybCwgJGNhY2hlS2V5LCAkbWV0YWRhdGFbJ3NoYTI1NiddKTsKfQoKJHRoaXMtPmxvYWRQcm92aWRlckxpc3RpbmdzKCRpbmNsdWRlZERhdGEpOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRJbmNsdWRlcyhhcnJheSAkZGF0YSk6IGFycmF5CnsKJHBhY2thZ2VzID0gW107CgoKaWYgKCFpc3NldCgkZGF0YVsncGFja2FnZXMnXSkgJiYgIWlzc2V0KCRkYXRhWydpbmNsdWRlcyddKSkgewpmb3JlYWNoICgkZGF0YSBhcyAkcGtnKSB7CmlmIChpc3NldCgkcGtnWyd2ZXJzaW9ucyddKSAmJiBpc19hcnJheSgkcGtnWyd2ZXJzaW9ucyddKSkgewpmb3JlYWNoICgkcGtnWyd2ZXJzaW9ucyddIGFzICRtZXRhZGF0YSkgewokcGFja2FnZXNbXSA9ICRtZXRhZGF0YTsKfQp9Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCmlmIChpc3NldCgkZGF0YVsncGFja2FnZXMnXSkpIHsKZm9yZWFjaCAoJGRhdGFbJ3BhY2thZ2VzJ10gYXMgJHBhY2thZ2UgPT4gJHZlcnNpb25zKSB7CiRwYWNrYWdlTmFtZSA9IHN0cnRvbG93ZXIoKHN0cmluZykgJHBhY2thZ2UpOwpmb3JlYWNoICgkdmVyc2lvbnMgYXMgJHZlcnNpb24gPT4gJG1ldGFkYXRhKSB7CiRwYWNrYWdlc1tdID0gJG1ldGFkYXRhOwppZiAoISR0aGlzLT5kaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCAmJiAkcGFja2FnZU5hbWUgIT09IHN0cnRvbG93ZXIoKHN0cmluZykgKCRtZXRhZGF0YVsnbmFtZSddID8/ICcnKSkpIHsKJHRoaXMtPmRpc3BsYXllZFdhcm5pbmdBYm91dE5vbk1hdGNoaW5nUGFja2FnZUluZGV4ID0gdHJ1ZTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoIjx3YXJuaW5nPldhcm5pbmc6IHRoZSBwYWNrYWdlcyBrZXkgJyVzJyBkb2Vzbid0IG1hdGNoIHRoZSBuYW1lIGRlZmluZWQgaW4gdGhlIHBhY2thZ2UgbWV0YWRhdGEgJyVzJyBpbiByZXBvc2l0b3J5ICVzPC93YXJuaW5nPiIsICRwYWNrYWdlLCAkbWV0YWRhdGFbJ25hbWUnXSA/PyAnJywgJHRoaXMtPmJhc2VVcmwpKTsKfQp9Cn0KfQoKaWYgKGlzc2V0KCRkYXRhWydpbmNsdWRlcyddKSkgewpmb3JlYWNoICgkZGF0YVsnaW5jbHVkZXMnXSBhcyAkaW5jbHVkZSA9PiAkbWV0YWRhdGEpIHsKaWYgKGlzc2V0KCRtZXRhZGF0YVsnc2hhMSddKSAmJiAkdGhpcy0+Y2FjaGUtPnNoYTEoKHN0cmluZykgJGluY2x1ZGUpID09PSAkbWV0YWRhdGFbJ3NoYTEnXSkgewokaW5jbHVkZWREYXRhID0ganNvbl9kZWNvZGUoJHRoaXMtPmNhY2hlLT5yZWFkKChzdHJpbmcpICRpbmNsdWRlKSwgdHJ1ZSk7Cn0gZWxzZSB7CiRpbmNsdWRlZERhdGEgPSAkdGhpcy0+ZmV0Y2hGaWxlKCRpbmNsdWRlKTsKfQokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcGFja2FnZXMsICR0aGlzLT5sb2FkSW5jbHVkZXMoJGluY2x1ZGVkRGF0YSkpOwp9Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMsID9zdHJpbmcgJHNvdXJjZSA9IG51bGwpOiBhcnJheQp7CmlmICghJHBhY2thZ2VzKSB7CnJldHVybiBbXTsKfQoKdHJ5IHsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICYkZGF0YSkgewppZiAoIWlzc2V0KCRkYXRhWydub3RpZmljYXRpb24tdXJsJ10pKSB7CiRkYXRhWydub3RpZmljYXRpb24tdXJsJ10gPSAkdGhpcy0+bm90aWZ5VXJsOwp9Cn0KCiRwYWNrYWdlSW5zdGFuY2VzID0gJHRoaXMtPmxvYWRlci0+bG9hZFBhY2thZ2VzKCRwYWNrYWdlcyk7Cgpmb3JlYWNoICgkcGFja2FnZUluc3RhbmNlcyBhcyAkcGFja2FnZSkgewppZiAoaXNzZXQoJHRoaXMtPnNvdXJjZU1pcnJvcnNbJHBhY2thZ2UtPmdldFNvdXJjZVR5cGUoKV0pKSB7CiRwYWNrYWdlLT5zZXRTb3VyY2VNaXJyb3JzKCR0aGlzLT5zb3VyY2VNaXJyb3JzWyRwYWNrYWdlLT5nZXRTb3VyY2VUeXBlKCldKTsKfQokcGFja2FnZS0+c2V0RGlzdE1pcnJvcnMoJHRoaXMtPmRpc3RNaXJyb3JzKTsKJHRoaXMtPmNvbmZpZ3VyZVBhY2thZ2VUcmFuc3BvcnRPcHRpb25zKCRwYWNrYWdlKTsKfQoKcmV0dXJuICRwYWNrYWdlSW5zdGFuY2VzOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IGxvYWQgcGFja2FnZXMgaW4gJy4kdGhpcy0+Z2V0UmVwb05hbWUoKS4oJHNvdXJjZSA/ICcgZnJvbSAnLiRzb3VyY2UgOiAnJykuJzogWycuZ2V0X2NsYXNzKCRlKS4nXSAnLiRlLT5nZXRNZXNzYWdlKCksIDAsICRlKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hGaWxlKHN0cmluZyAkZmlsZW5hbWUsID9zdHJpbmcgJGNhY2hlS2V5ID0gbnVsbCwgP3N0cmluZyAkc2hhMjU2ID0gbnVsbCwgYm9vbCAkc3RvcmVMYXN0TW9kaWZpZWRUaW1lID0gZmFsc2UpCnsKaWYgKCcnID09PSAkZmlsZW5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRmaWxlbmFtZSBzaG91bGQgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9CgppZiAobnVsbCA9PT0gJGNhY2hlS2V5KSB7CiRjYWNoZUtleSA9ICRmaWxlbmFtZTsKJGZpbGVuYW1lID0gJHRoaXMtPmJhc2VVcmwuJy8nLiRmaWxlbmFtZTsKfQoKCmlmICgoJHBvcyA9IHN0cnBvcygkZmlsZW5hbWUsICckJykpICYmIFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vfWknLCAkZmlsZW5hbWUpKSB7CiRmaWxlbmFtZSA9IHN1YnN0cigkZmlsZW5hbWUsIDAsICRwb3MpIC4gJyUyNCcgLiBzdWJzdHIoJGZpbGVuYW1lLCAkcG9zICsgMSk7Cn0KCiRyZXRyaWVzID0gMzsKd2hpbGUgKCRyZXRyaWVzLS0pIHsKdHJ5IHsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHByZUZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFByZUZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UFJFX0ZJTEVfRE9XTkxPQUQsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiRwcmVGaWxlRG93bmxvYWRFdmVudC0+c2V0VHJhbnNwb3J0T3B0aW9ucygkdGhpcy0+b3B0aW9ucyk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwokZmlsZW5hbWUgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpOwokb3B0aW9ucyA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkZmlsZW5hbWUsICRvcHRpb25zKTsKJGpzb24gPSAoc3RyaW5nKSAkcmVzcG9uc2UtPmdldEJvZHkoKTsKaWYgKCRzaGEyNTYgJiYgJHNoYTI1NiAhPT0gaGFzaCgnc2hhMjU2JywgJGpzb24pKSB7CgppZiAoJHRoaXMtPmFsbG93U3NsRG93bmdyYWRlKSB7CiR0aGlzLT51cmwgPSBzdHJfcmVwbGFjZSgnaHR0cDovLycsICdodHRwczovLycsICR0aGlzLT51cmwpOwokdGhpcy0+YmFzZVVybCA9IHN0cl9yZXBsYWNlKCdodHRwOi8vJywgJ2h0dHBzOi8vJywgJHRoaXMtPmJhc2VVcmwpOwokZmlsZW5hbWUgPSBzdHJfcmVwbGFjZSgnaHR0cDovLycsICdodHRwczovLycsICRmaWxlbmFtZSk7Cn0KCmlmICgkcmV0cmllcyA+IDApIHsKdXNsZWVwKDEwMDAwMCk7Cgpjb250aW51ZTsKfQoKCnRocm93IG5ldyBSZXBvc2l0b3J5U2VjdXJpdHlFeGNlcHRpb24oJ1RoZSBjb250ZW50cyBvZiAnLiRmaWxlbmFtZS4nIGRvIG5vdCBtYXRjaCBpdHMgc2lnbmF0dXJlLiBUaGlzIGNvdWxkIGluZGljYXRlIGEgbWFuLWluLXRoZS1taWRkbGUgYXR0YWNrIG9yIGUuZy4gYW50aXZpcnVzIHNvZnR3YXJlIGNvcnJ1cHRpbmcgZmlsZXMuIFRyeSBydW5uaW5nIGNvbXBvc2VyIGFnYWluIGFuZCByZXBvcnQgdGhpcyBpZiB5b3UgdGhpbmsgaXQgaXMgYSBtaXN0YWtlLicpOwp9CgppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgbnVsbCwgJHNoYTI1NiwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3Jlc3BvbnNlJyA9PiAkcmVzcG9uc2UsICdyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcG9zdEZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwb3N0RmlsZURvd25sb2FkRXZlbnQpOwp9CgokZGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJHRoaXMtPmlvLCAkdGhpcy0+dXJsLCAkZGF0YSk7CgppZiAoJGNhY2hlS2V5ICYmICEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewppZiAoJHN0b3JlTGFzdE1vZGlmaWVkVGltZSkgewokbGFzdE1vZGlmaWVkRGF0ZSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsYXN0LW1vZGlmaWVkJyk7CmlmICgkbGFzdE1vZGlmaWVkRGF0ZSkgewokZGF0YVsnbGFzdC1tb2RpZmllZCddID0gJGxhc3RNb2RpZmllZERhdGU7CiRqc29uID0gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSwgMCk7Cn0KfQokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgJGpzb24pOwp9CgokcmVzcG9uc2UtPmNvbGxlY3QoKTsKCmJyZWFrOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkZSBpbnN0YW5jZW9mIFxMb2dpY0V4Y2VwdGlvbikgewp0aHJvdyAkZTsKfQoKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uICYmICRlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewp0aHJvdyAkZTsKfQoKaWYgKCRlIGluc3RhbmNlb2YgUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGNhY2hlS2V5ICYmICgkY29udGVudHMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGNhY2hlS2V5KSkpIHsKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kdGhpcy0+dXJsLicgY291bGQgbm90IGJlIGZ1bGx5IGxvYWRlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpLCBwYWNrYWdlIGluZm9ybWF0aW9uIHdhcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgY2FjaGUgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZTwvd2FybmluZz4nKTsKfQokdGhpcy0+ZGVncmFkZWRNb2RlID0gdHJ1ZTsKJGRhdGEgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRjb250ZW50cywgJHRoaXMtPmNhY2hlLT5nZXRSb290KCkuJGNhY2hlS2V5KTsKCmJyZWFrOwp9Cgp0aHJvdyAkZTsKfQp9CgppZiAoIWlzc2V0KCRkYXRhKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCJDb21wb3NlclJlcG9zaXRvcnk6IFVuZGVmaW5lZCBcJGRhdGEuIFBsZWFzZSByZXBvcnQgYXQgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy9uZXcuIik7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmZXRjaEZpbGVJZkxhc3RNb2RpZmllZChzdHJpbmcgJGZpbGVuYW1lLCBzdHJpbmcgJGNhY2hlS2V5LCBzdHJpbmcgJGxhc3RNb2RpZmllZFRpbWUpCnsKaWYgKCcnID09PSAkZmlsZW5hbWUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRmaWxlbmFtZSBzaG91bGQgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9Cgp0cnkgewokb3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwppZiAoJHRoaXMtPmV2ZW50RGlzcGF0Y2hlcikgewokcHJlRmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUHJlRmlsZURvd25sb2FkRXZlbnQoUGx1Z2luRXZlbnRzOjpQUkVfRklMRV9ET1dOTE9BRCwgJHRoaXMtPmh0dHBEb3dubG9hZGVyLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVwb3NpdG9yeScgPT4gJHRoaXNdKTsKJHByZUZpbGVEb3dubG9hZEV2ZW50LT5zZXRUcmFuc3BvcnRPcHRpb25zKCR0aGlzLT5vcHRpb25zKTsKJHRoaXMtPmV2ZW50RGlzcGF0Y2hlci0+ZGlzcGF0Y2goJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwcmVGaWxlRG93bmxvYWRFdmVudCk7CiRmaWxlbmFtZSA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0UHJvY2Vzc2VkVXJsKCk7CiRvcHRpb25zID0gJHByZUZpbGVEb3dubG9hZEV2ZW50LT5nZXRUcmFuc3BvcnRPcHRpb25zKCk7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSAoYXJyYXkpICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp9CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnSWYtTW9kaWZpZWQtU2luY2U6ICcuJGxhc3RNb2RpZmllZFRpbWU7CiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRmaWxlbmFtZSwgJG9wdGlvbnMpOwokanNvbiA9IChzdHJpbmcpICRyZXNwb25zZS0+Z2V0Qm9keSgpOwppZiAoJGpzb24gPT09ICcnICYmICRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSAzMDQpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgkdGhpcy0+ZXZlbnREaXNwYXRjaGVyKSB7CiRwb3N0RmlsZURvd25sb2FkRXZlbnQgPSBuZXcgUG9zdEZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UE9TVF9GSUxFX0RPV05MT0FELCBudWxsLCBudWxsLCAkZmlsZW5hbWUsICdtZXRhZGF0YScsIFsncmVzcG9uc2UnID0+ICRyZXNwb25zZSwgJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwb3N0RmlsZURvd25sb2FkRXZlbnQtPmdldE5hbWUoKSwgJHBvc3RGaWxlRG93bmxvYWRFdmVudCk7Cn0KCiRkYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+aW8sICR0aGlzLT51cmwsICRkYXRhKTsKCiRsYXN0TW9kaWZpZWREYXRlID0gJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2xhc3QtbW9kaWZpZWQnKTsKJHJlc3BvbnNlLT5jb2xsZWN0KCk7CmlmICgkbGFzdE1vZGlmaWVkRGF0ZSkgewokZGF0YVsnbGFzdC1tb2RpZmllZCddID0gJGxhc3RNb2RpZmllZERhdGU7CiRqc29uID0gSnNvbkZpbGU6OmVuY29kZSgkZGF0YSwgMCk7Cn0KaWYgKCEkdGhpcy0+Y2FjaGUtPmlzUmVhZE9ubHkoKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRjYWNoZUtleSwgJGpzb24pOwp9CgpyZXR1cm4gJGRhdGE7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgXExvZ2ljRXhjZXB0aW9uKSB7CnRocm93ICRlOwp9CgppZiAoJGUgaW5zdGFuY2VvZiBUcmFuc3BvcnRFeGNlcHRpb24gJiYgJGUtPmdldFN0YXR1c0NvZGUoKSA9PT0gNDA0KSB7CnRocm93ICRlOwp9CgppZiAoISR0aGlzLT5kZWdyYWRlZE1vZGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiR0aGlzLT51cmwuJyBjb3VsZCBub3QgYmUgZnVsbHkgbG9hZGVkICgnLiRlLT5nZXRNZXNzYWdlKCkuJyksIHBhY2thZ2UgaW5mb3JtYXRpb24gd2FzIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBjYWNoZSBhbmQgbWF5IGJlIG91dCBvZiBkYXRlPC93YXJuaW5nPicpOwp9CiR0aGlzLT5kZWdyYWRlZE1vZGUgPSB0cnVlOwoKcmV0dXJuIHRydWU7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhc3luY0ZldGNoRmlsZShzdHJpbmcgJGZpbGVuYW1lLCBzdHJpbmcgJGNhY2hlS2V5LCA/c3RyaW5nICRsYXN0TW9kaWZpZWRUaW1lID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoJycgPT09ICRmaWxlbmFtZSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGZpbGVuYW1lIHNob3VsZCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KCmlmIChpc3NldCgkdGhpcy0+cGFja2FnZXNOb3RGb3VuZENhY2hlWyRmaWxlbmFtZV0pKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKFsncGFja2FnZXMnID0+IFtdXSk7Cn0KCmlmIChpc3NldCgkdGhpcy0+ZnJlc2hNZXRhZGF0YVVybHNbJGZpbGVuYW1lXSkgJiYgJGxhc3RNb2RpZmllZFRpbWUpIHsKCgokcHJvbWlzZSA9IFxSZWFjdFxQcm9taXNlXHJlc29sdmUodHJ1ZSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCiRodHRwRG93bmxvYWRlciA9ICR0aGlzLT5odHRwRG93bmxvYWRlcjsKJG9wdGlvbnMgPSAkdGhpcy0+b3B0aW9uczsKaWYgKCR0aGlzLT5ldmVudERpc3BhdGNoZXIpIHsKJHByZUZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFByZUZpbGVEb3dubG9hZEV2ZW50KFBsdWdpbkV2ZW50czo6UFJFX0ZJTEVfRE9XTkxPQUQsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3JlcG9zaXRvcnknID0+ICR0aGlzXSk7CiRwcmVGaWxlRG93bmxvYWRFdmVudC0+c2V0VHJhbnNwb3J0T3B0aW9ucygkdGhpcy0+b3B0aW9ucyk7CiR0aGlzLT5ldmVudERpc3BhdGNoZXItPmRpc3BhdGNoKCRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0TmFtZSgpLCAkcHJlRmlsZURvd25sb2FkRXZlbnQpOwokZmlsZW5hbWUgPSAkcHJlRmlsZURvd25sb2FkRXZlbnQtPmdldFByb2Nlc3NlZFVybCgpOwokb3B0aW9ucyA9ICRwcmVGaWxlRG93bmxvYWRFdmVudC0+Z2V0VHJhbnNwb3J0T3B0aW9ucygpOwp9CgppZiAoJGxhc3RNb2RpZmllZFRpbWUpIHsKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IChhcnJheSkgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107Cn0KJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9ICdJZi1Nb2RpZmllZC1TaW5jZTogJy4kbGFzdE1vZGlmaWVkVGltZTsKfQoKJGlvID0gJHRoaXMtPmlvOwokdXJsID0gJHRoaXMtPnVybDsKJGNhY2hlID0gJHRoaXMtPmNhY2hlOwokZGVncmFkZWRNb2RlID0gJiR0aGlzLT5kZWdyYWRlZE1vZGU7CiRldmVudERpc3BhdGNoZXIgPSAkdGhpcy0+ZXZlbnREaXNwYXRjaGVyOwoKCgoKJGFjY2VwdCA9IGZ1bmN0aW9uICgkcmVzcG9uc2UpIHVzZSAoJGlvLCAkdXJsLCAkZmlsZW5hbWUsICRjYWNoZSwgJGNhY2hlS2V5LCAkZXZlbnREaXNwYXRjaGVyKSB7CgppZiAoJHJlc3BvbnNlLT5nZXRTdGF0dXNDb2RlKCkgPT09IDQwNCkgewokdGhpcy0+cGFja2FnZXNOb3RGb3VuZENhY2hlWyRmaWxlbmFtZV0gPSB0cnVlOwoKcmV0dXJuIFsncGFja2FnZXMnID0+IFtdXTsKfQoKJGpzb24gPSAoc3RyaW5nKSAkcmVzcG9uc2UtPmdldEJvZHkoKTsKaWYgKCRqc29uID09PSAnJyAmJiAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSA9PT0gMzA0KSB7CiR0aGlzLT5mcmVzaE1ldGFkYXRhVXJsc1skZmlsZW5hbWVdID0gdHJ1ZTsKCnJldHVybiB0cnVlOwp9CgppZiAoJGV2ZW50RGlzcGF0Y2hlcikgewokcG9zdEZpbGVEb3dubG9hZEV2ZW50ID0gbmV3IFBvc3RGaWxlRG93bmxvYWRFdmVudChQbHVnaW5FdmVudHM6OlBPU1RfRklMRV9ET1dOTE9BRCwgbnVsbCwgbnVsbCwgJGZpbGVuYW1lLCAnbWV0YWRhdGEnLCBbJ3Jlc3BvbnNlJyA9PiAkcmVzcG9uc2UsICdyZXBvc2l0b3J5JyA9PiAkdGhpc10pOwokZXZlbnREaXNwYXRjaGVyLT5kaXNwYXRjaCgkcG9zdEZpbGVEb3dubG9hZEV2ZW50LT5nZXROYW1lKCksICRwb3N0RmlsZURvd25sb2FkRXZlbnQpOwp9CgokZGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJGlvLCAkdXJsLCAkZGF0YSk7CgokbGFzdE1vZGlmaWVkRGF0ZSA9ICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdsYXN0LW1vZGlmaWVkJyk7CiRyZXNwb25zZS0+Y29sbGVjdCgpOwppZiAoJGxhc3RNb2RpZmllZERhdGUpIHsKJGRhdGFbJ2xhc3QtbW9kaWZpZWQnXSA9ICRsYXN0TW9kaWZpZWREYXRlOwokanNvbiA9IEpzb25GaWxlOjplbmNvZGUoJGRhdGEsIEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBKU09OX1VORVNDQVBFRF9VTklDT0RFKTsKfQppZiAoISRjYWNoZS0+aXNSZWFkT25seSgpKSB7CiRjYWNoZS0+d3JpdGUoJGNhY2hlS2V5LCAkanNvbik7Cn0KJHRoaXMtPmZyZXNoTWV0YWRhdGFVcmxzWyRmaWxlbmFtZV0gPSB0cnVlOwoKcmV0dXJuICRkYXRhOwp9OwoKJHJlamVjdCA9IGZ1bmN0aW9uICgkZSkgdXNlICgkZmlsZW5hbWUsICRhY2NlcHQsICRpbywgJHVybCwgJiRkZWdyYWRlZE1vZGUsICRsYXN0TW9kaWZpZWRUaW1lKSB7CmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQpIHsKJHRoaXMtPnBhY2thZ2VzTm90Rm91bmRDYWNoZVskZmlsZW5hbWVdID0gdHJ1ZTsKCnJldHVybiBmYWxzZTsKfQoKaWYgKCEkZGVncmFkZWRNb2RlKSB7CiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Jy4kdXJsLicgY291bGQgbm90IGJlIGZ1bGx5IGxvYWRlZCAoJy4kZS0+Z2V0TWVzc2FnZSgpLicpLCBwYWNrYWdlIGluZm9ybWF0aW9uIHdhcyBsb2FkZWQgZnJvbSB0aGUgbG9jYWwgY2FjaGUgYW5kIG1heSBiZSBvdXQgb2YgZGF0ZTwvd2FybmluZz4nKTsKfQokZGVncmFkZWRNb2RlID0gdHJ1ZTsKCgppZiAoJGxhc3RNb2RpZmllZFRpbWUpIHsKcmV0dXJuICRhY2NlcHQobmV3IFJlc3BvbnNlKFsndXJsJyA9PiAkdXJsXSwgMzA0LCBbXSwgJycpKTsKfQoKCmlmICgkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiAmJiAkZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0OTkpIHsKcmV0dXJuICRhY2NlcHQobmV3IFJlc3BvbnNlKFsndXJsJyA9PiAkdXJsXSwgNDA0LCBbXSwgJycpKTsKfQoKdGhyb3cgJGU7Cn07CgpyZXR1cm4gJGh0dHBEb3dubG9hZGVyLT5hZGQoJGZpbGVuYW1lLCAkb3B0aW9ucyktPnRoZW4oJGFjY2VwdCwgJHJlamVjdCk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0aWFsaXplUGFydGlhbFBhY2thZ2VzKCk6IHZvaWQKewokcm9vdERhdGEgPSAkdGhpcy0+bG9hZFJvb3RTZXJ2ZXJGaWxlKCk7CmlmICgkcm9vdERhdGEgPT09IHRydWUpIHsKcmV0dXJuOwp9CgokdGhpcy0+cGFydGlhbFBhY2thZ2VzQnlOYW1lID0gW107CmZvcmVhY2ggKCRyb290RGF0YVsncGFja2FnZXMnXSBhcyAkcGFja2FnZSA9PiAkdmVyc2lvbnMpIHsKZm9yZWFjaCAoJHZlcnNpb25zIGFzICR2ZXJzaW9uKSB7CiR2ZXJzaW9uUGFja2FnZU5hbWUgPSBzdHJ0b2xvd2VyKChzdHJpbmcpICgkdmVyc2lvblsnbmFtZSddID8/ICcnKSk7CiR0aGlzLT5wYXJ0aWFsUGFja2FnZXNCeU5hbWVbJHZlcnNpb25QYWNrYWdlTmFtZV1bXSA9ICR2ZXJzaW9uOwppZiAoISR0aGlzLT5kaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCAmJiAkdmVyc2lvblBhY2thZ2VOYW1lICE9PSBzdHJ0b2xvd2VyKCRwYWNrYWdlKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigiPHdhcm5pbmc+V2FybmluZzogdGhlIHBhY2thZ2VzIGtleSAnJXMnIGRvZXNuJ3QgbWF0Y2ggdGhlIG5hbWUgZGVmaW5lZCBpbiB0aGUgcGFja2FnZSBtZXRhZGF0YSAnJXMnIGluIHJlcG9zaXRvcnkgJXM8L3dhcm5pbmc+IiwgJHBhY2thZ2UsICR2ZXJzaW9uWyduYW1lJ10gPz8gJycsICR0aGlzLT5iYXNlVXJsKSk7CiR0aGlzLT5kaXNwbGF5ZWRXYXJuaW5nQWJvdXROb25NYXRjaGluZ1BhY2thZ2VJbmRleCA9IHRydWU7Cn0KfQp9CgoKJHRoaXMtPnJvb3REYXRhID0gdHJ1ZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyhzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzQXZhaWxhYmxlUGFja2FnZUxpc3QpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignbGF6eVByb3ZpZGVyc1JlcG9Db250YWlucyBzaG91bGQgbm90IGJlIGNhbGxlZCB1bmxlc3MgaGFzQXZhaWxhYmxlUGFja2FnZUxpc3QgaXMgdHJ1ZScpOwp9CgppZiAoaXNfYXJyYXkoJHRoaXMtPmF2YWlsYWJsZVBhY2thZ2VzKSAmJiBpc3NldCgkdGhpcy0+YXZhaWxhYmxlUGFja2FnZXNbJG5hbWVdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGlzX2FycmF5KCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMpKSB7CmZvcmVhY2ggKCR0aGlzLT5hdmFpbGFibGVQYWNrYWdlUGF0dGVybnMgYXMgJHByb3ZpZGVyUmVnZXgpIHsKaWYgKFByZWc6OmlzTWF0Y2goJHByb3ZpZGVyUmVnZXgsICRuYW1lKSkgewpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFBhY2thZ2VJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIENvbXBvc2l0ZVJlcG9zaXRvcnkgaW1wbGVtZW50cyBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCgoKCnByaXZhdGUgJHJlcG9zaXRvcmllczsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHJlcG9zaXRvcmllcykKewokdGhpcy0+cmVwb3NpdG9yaWVzID0gW107CmZvcmVhY2ggKCRyZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKJHRoaXMtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ2NvbXBvc2l0ZSByZXBvICgnLmltcGxvZGUoJywgJywgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHJlcG8pOiBzdHJpbmcgewpyZXR1cm4gJHJlcG8tPmdldFJlcG9OYW1lKCk7Cn0sICR0aGlzLT5yZXBvc2l0b3JpZXMpKS4nKSc7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcmllcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwb3NpdG9yaWVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogYm9vbAp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCmlmICgkcmVwb3NpdG9yeS0+aGFzUGFja2FnZSgkcGFja2FnZSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KTogP0Jhc2VQYWNrYWdlCnsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHBhY2thZ2UgPSAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KTsKaWYgKG51bGwgIT09ICRwYWNrYWdlKSB7CnJldHVybiAkcGFja2FnZTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQgPSBudWxsKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHBhY2thZ2VzW10gPSAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCk7Cn0KCnJldHVybiAkcGFja2FnZXMgPyBhcnJheV9tZXJnZSguLi4kcGFja2FnZXMpIDogW107Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOiBhcnJheQp7CiRwYWNrYWdlcyA9IFtdOwokbmFtZXNGb3VuZCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokcmVzdWx0ID0gJHJlcG9zaXRvcnktPmxvYWRQYWNrYWdlcygkcGFja2FnZU5hbWVNYXAsICRhY2NlcHRhYmxlU3RhYmlsaXRpZXMsICRzdGFiaWxpdHlGbGFncywgJGFscmVhZHlMb2FkZWQpOwokcGFja2FnZXNbXSA9ICRyZXN1bHRbJ3BhY2thZ2VzJ107CiRuYW1lc0ZvdW5kW10gPSAkcmVzdWx0WyduYW1lc0ZvdW5kJ107Cn0KCnJldHVybiBbCidwYWNrYWdlcycgPT4gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdLAonbmFtZXNGb3VuZCcgPT4gJG5hbWVzRm91bmQgPyBhcnJheV91bmlxdWUoYXJyYXlfbWVyZ2UoLi4uJG5hbWVzRm91bmQpKSA6IFtdLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKTogYXJyYXkKewokbWF0Y2hlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokbWF0Y2hlc1tdID0gJHJlcG9zaXRvcnktPnNlYXJjaCgkcXVlcnksICRtb2RlLCAkdHlwZSk7Cn0KCnJldHVybiBcY291bnQoJG1hdGNoZXMpID4gMCA/IGFycmF5X21lcmdlKC4uLiRtYXRjaGVzKSA6IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewoKJHBhY2thZ2VzW10gPSAkcmVwb3NpdG9yeS0+Z2V0UGFja2FnZXMoKTsKfQoKcmV0dXJuICRwYWNrYWdlcyA/IGFycmF5X21lcmdlKC4uLiRwYWNrYWdlcykgOiBbXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycygkcGFja2FnZU5hbWUpOiBhcnJheQp7CiRyZXN1bHRzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKCiRyZXN1bHRzW10gPSAkcmVwb3NpdG9yeS0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSk7Cn0KCnJldHVybiAkcmVzdWx0cyA/IGFycmF5X21lcmdlKC4uLiRyZXN1bHRzKSA6IFtdOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2YgV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlKSB7CiRyZXBvc2l0b3J5LT5yZW1vdmVQYWNrYWdlKCRwYWNrYWdlKTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpOiBpbnQKewokdG90YWwgPSAwOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgokdG90YWwgKz0gJHJlcG9zaXRvcnktPmNvdW50KCk7Cn0KCnJldHVybiAkdG90YWw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkCnsKaWYgKCRyZXBvc2l0b3J5IGluc3RhbmNlb2Ygc2VsZikgewpmb3JlYWNoICgkcmVwb3NpdG9yeS0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKJHRoaXMtPmFkZFJlcG9zaXRvcnkoJHJlcG8pOwp9Cn0gZWxzZSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbXSA9ICRyZXBvc2l0b3J5Owp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKaW50ZXJmYWNlIENvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXEFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcRHVtcGVyXEFycmF5RHVtcGVyOwp1c2UgQ29tcG9zZXJcSW5zdGFsbGVyXEluc3RhbGxhdGlvbk1hbmFnZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwoKCgoKCgoKY2xhc3MgRmlsZXN5c3RlbVJlcG9zaXRvcnkgZXh0ZW5kcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeQp7Cgpwcm90ZWN0ZWQgJGZpbGU7Cgpwcml2YXRlICRkdW1wVmVyc2lvbnM7Cgpwcml2YXRlICRyb290UGFja2FnZTsKCnByaXZhdGUgJGZpbGVzeXN0ZW07Cgpwcml2YXRlICRkZXZNb2RlID0gbnVsbDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChKc29uRmlsZSAkcmVwb3NpdG9yeUZpbGUsIGJvb2wgJGR1bXBWZXJzaW9ucyA9IGZhbHNlLCA/Um9vdFBhY2thZ2VJbnRlcmZhY2UgJHJvb3RQYWNrYWdlID0gbnVsbCwgP0ZpbGVzeXN0ZW0gJGZpbGVzeXN0ZW0gPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKJHRoaXMtPmZpbGUgPSAkcmVwb3NpdG9yeUZpbGU7CiR0aGlzLT5kdW1wVmVyc2lvbnMgPSAkZHVtcFZlcnNpb25zOwokdGhpcy0+cm9vdFBhY2thZ2UgPSAkcm9vdFBhY2thZ2U7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZpbGVzeXN0ZW0gPzogbmV3IEZpbGVzeXN0ZW07CmlmICgkZHVtcFZlcnNpb25zICYmICEkcm9vdFBhY2thZ2UpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0V4cGVjdGVkIGEgcm9vdCBwYWNrYWdlIGluc3RhbmNlIGlmICRkdW1wVmVyc2lvbnMgaXMgdHJ1ZScpOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZNb2RlKCkKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKCkKewpwYXJlbnQ6OmluaXRpYWxpemUoKTsKCmlmICghJHRoaXMtPmZpbGUtPmV4aXN0cygpKSB7CnJldHVybjsKfQoKdHJ5IHsKJGRhdGEgPSAkdGhpcy0+ZmlsZS0+cmVhZCgpOwppZiAoaXNzZXQoJGRhdGFbJ3BhY2thZ2VzJ10pKSB7CiRwYWNrYWdlcyA9ICRkYXRhWydwYWNrYWdlcyddOwp9IGVsc2UgewokcGFja2FnZXMgPSAkZGF0YTsKfQoKaWYgKGlzc2V0KCRkYXRhWydkZXYtcGFja2FnZS1uYW1lcyddKSkgewokdGhpcy0+c2V0RGV2UGFja2FnZU5hbWVzKCRkYXRhWydkZXYtcGFja2FnZS1uYW1lcyddKTsKfQppZiAoaXNzZXQoJGRhdGFbJ2RldiddKSkgewokdGhpcy0+ZGV2TW9kZSA9ICRkYXRhWydkZXYnXTsKfQoKaWYgKCFpc19hcnJheSgkcGFja2FnZXMpKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgcGFja2FnZSBsaXN0IGZyb20gdGhlIHJlcG9zaXRvcnknKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBJbnZhbGlkUmVwb3NpdG9yeUV4Y2VwdGlvbignSW52YWxpZCByZXBvc2l0b3J5IGRhdGEgaW4gJy4kdGhpcy0+ZmlsZS0+Z2V0UGF0aCgpLicsIHBhY2thZ2VzIGNvdWxkIG5vdCBiZSBsb2FkZWQ6IFsnLmdldF9jbGFzcygkZSkuJ10gJy4kZS0+Z2V0TWVzc2FnZSgpKTsKfQoKJGxvYWRlciA9IG5ldyBBcnJheUxvYWRlcihudWxsLCB0cnVlKTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlRGF0YSkgewokcGFja2FnZSA9ICRsb2FkZXItPmxvYWQoJHBhY2thZ2VEYXRhKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBhY2thZ2UpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiByZWxvYWQoKQp7CiR0aGlzLT5wYWNrYWdlcyA9IG51bGw7CiR0aGlzLT5pbml0aWFsaXplKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShib29sICRkZXZNb2RlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyKQp7CiRkYXRhID0gWydwYWNrYWdlcycgPT4gW10sICdkZXYnID0+ICRkZXZNb2RlLCAnZGV2LXBhY2thZ2UtbmFtZXMnID0+IFtdXTsKJGR1bXBlciA9IG5ldyBBcnJheUR1bXBlcigpOwoKCgoKJHJlcG9EaXIgPSBkaXJuYW1lKCR0aGlzLT5maWxlLT5nZXRQYXRoKCkpOwokdGhpcy0+ZmlsZXN5c3RlbS0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRyZXBvRGlyKTsKCiRyZXBvRGlyID0gJHRoaXMtPmZpbGVzeXN0ZW0tPm5vcm1hbGl6ZVBhdGgocmVhbHBhdGgoJHJlcG9EaXIpKTsKJGluc3RhbGxQYXRocyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPmdldENhbm9uaWNhbFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKJHBrZ0FycmF5ID0gJGR1bXBlci0+ZHVtcCgkcGFja2FnZSk7CiRwYXRoID0gJGluc3RhbGxhdGlvbk1hbmFnZXItPmdldEluc3RhbGxQYXRoKCRwYWNrYWdlKTsKJGluc3RhbGxQYXRoID0gbnVsbDsKaWYgKCcnICE9PSAkcGF0aCAmJiBudWxsICE9PSAkcGF0aCkgewokbm9ybWFsaXplZFBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+bm9ybWFsaXplUGF0aCgkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJHBhdGgpID8gJHBhdGggOiBQbGF0Zm9ybTo6Z2V0Q3dkKCkgLiAnLycgLiAkcGF0aCk7CiRpbnN0YWxsUGF0aCA9ICR0aGlzLT5maWxlc3lzdGVtLT5maW5kU2hvcnRlc3RQYXRoKCRyZXBvRGlyLCAkbm9ybWFsaXplZFBhdGgsIHRydWUpOwp9CiRpbnN0YWxsUGF0aHNbJHBhY2thZ2UtPmdldE5hbWUoKV0gPSAkaW5zdGFsbFBhdGg7CgokcGtnQXJyYXlbJ2luc3RhbGwtcGF0aCddID0gJGluc3RhbGxQYXRoOwokZGF0YVsncGFja2FnZXMnXVtdID0gJHBrZ0FycmF5OwoKCgppZiAoaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJHRoaXMtPmRldlBhY2thZ2VOYW1lcywgdHJ1ZSkpIHsKJGRhdGFbJ2Rldi1wYWNrYWdlLW5hbWVzJ11bXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQoKc29ydCgkZGF0YVsnZGV2LXBhY2thZ2UtbmFtZXMnXSk7CnVzb3J0KCRkYXRhWydwYWNrYWdlcyddLCBzdGF0aWMgZnVuY3Rpb24gKCRhLCAkYik6IGludCB7CnJldHVybiBzdHJjbXAoJGFbJ25hbWUnXSwgJGJbJ25hbWUnXSk7Cn0pOwoKJHRoaXMtPmZpbGUtPndyaXRlKCRkYXRhKTsKCmlmICgkdGhpcy0+ZHVtcFZlcnNpb25zKSB7CiR2ZXJzaW9ucyA9ICR0aGlzLT5nZW5lcmF0ZUluc3RhbGxlZFZlcnNpb25zKCRpbnN0YWxsYXRpb25NYW5hZ2VyLCAkaW5zdGFsbFBhdGhzLCAkZGV2TW9kZSwgJHJlcG9EaXIpOwoKJHRoaXMtPmZpbGVzeXN0ZW0tPmZpbGVQdXRDb250ZW50c0lmTW9kaWZpZWQoJHJlcG9EaXIuJy9pbnN0YWxsZWQucGhwJywgJzw/cGhwIHJldHVybiAnIC4gJHRoaXMtPmR1bXBUb1BocENvZGUoJHZlcnNpb25zKSAuICc7Jy4iXG4iKTsKJGluc3RhbGxlZFZlcnNpb25zQ2xhc3MgPSBmaWxlX2dldF9jb250ZW50cyhfX0RJUl9fLicvLi4vSW5zdGFsbGVkVmVyc2lvbnMucGhwJyk7CgoKaWYgKCRpbnN0YWxsZWRWZXJzaW9uc0NsYXNzICE9PSBmYWxzZSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+ZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZCgkcmVwb0Rpci4nL0luc3RhbGxlZFZlcnNpb25zLnBocCcsICRpbnN0YWxsZWRWZXJzaW9uc0NsYXNzKTsKCgpcQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OnJlbG9hZCgkdmVyc2lvbnMpOwoKCgoKdHJ5IHsKJHJlZmxQcm9wID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoXENvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zOjpjbGFzcywgJ3NlbGZEaXInKTsKKFxQSFBfVkVSU0lPTl9JRCA8IDgwMTAwKSBhbmQgJHJlZmxQcm9wLT5zZXRBY2Nlc3NpYmxlKHRydWUpOwokcmVmbFByb3AtPnNldFZhbHVlKG51bGwsIHN0cnRyKCRyZXBvRGlyLCAnXFwnLCAnLycpKTsKCiRyZWZsUHJvcCA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KFxDb21wb3NlclxJbnN0YWxsZWRWZXJzaW9uczo6Y2xhc3MsICdpbnN0YWxsZWRJc0xvY2FsRGlyJyk7CihcUEhQX1ZFUlNJT05fSUQgPCA4MDEwMCkgYW5kICRyZWZsUHJvcC0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHJlZmxQcm9wLT5zZXRWYWx1ZShudWxsLCB0cnVlKTsKfSBjYXRjaCAoXFJlZmxlY3Rpb25FeGNlcHRpb24gJGUpIHsKaWYgKCFQcmVnOjppc01hdGNoKCd7UHJvcGVydHkgLio/IGRvZXMgbm90IGV4aXN0fWknLCAkZS0+Z2V0TWVzc2FnZSgpKSkgewp0aHJvdyAkZTsKfQoKfQp9Cn0KfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhZmVseUxvYWRJbnN0YWxsZWRWZXJzaW9ucyhzdHJpbmcgJHBhdGgpOiBib29sCnsKJGluc3RhbGxlZFZlcnNpb25zRGF0YSA9IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCk7CiRwYXR0ZXJuID0gPDw8J1JFR0VYJwp7KD8oREVGSU5FKQogICAoPzxudW1iZXI+ICAtPyBccyorIFxkKysgKD86XC5cZCsrKT8gKQogICAoPzxib29sZWFuPiB0cnVlIHwgZmFsc2UgfCBudWxsICkKICAgKD88c3RyaW5ncz4gKD8mc3RyaW5nKSAoPzogXHMqKyBcLiBccyorICg/JnN0cmluZykpKisgKQogICAoPzxzdHJpbmc+ICAoPzogIiAoPzpbXiJcXCRdKisgfCBcXCBbIlxcMF0gKSogIiB8ICcgKD86W14nXFxdKisgfCBcXCBbJ1xcXSApKiAnICkgKQogICAoPzxhcnJheT4gICBhcnJheVwoIFxzKisgKD86ICg/Oig/Jm51bWJlcil8KD8mc3RyaW5ncykpIFxzKisgPT4gXHMqKyAoPzogKD86X19ESVJfXyBccyorIFwuIFxzKispPyAoPyZzdHJpbmdzKSB8ICg/JnZhbHVlKSApIFxzKissIFxzKisgKSorICBccyorIFwpICkKICAgKD88dmFsdWU+ICAgKD86ICg/Jm51bWJlcikgfCAoPyZib29sZWFuKSB8ICg/JnN0cmluZ3MpIHwgKD8mYXJyYXkpICkgKQopCl48XD9waHBccysrcmV0dXJuXHMrKyg/JmFycmF5KVxzKis7JH1peApSRUdFWDsKaWYgKGlzX3N0cmluZygkaW5zdGFsbGVkVmVyc2lvbnNEYXRhKSAmJiBQcmVnOjppc01hdGNoKCRwYXR0ZXJuLCB0cmltKCRpbnN0YWxsZWRWZXJzaW9uc0RhdGEpKSkgewpcQ29tcG9zZXJcSW5zdGFsbGVkVmVyc2lvbnM6OnJlbG9hZChldmFsKCc/PicuUHJlZzo6cmVwbGFjZSgnez0+XHMqK19fRElSX19ccyorXC5ccyorKFtcJyJdKX0nLCAnPT4gJy52YXJfZXhwb3J0KGRpcm5hbWUoJHBhdGgpLCB0cnVlKS4nIC4gJDEnLCAkaW5zdGFsbGVkVmVyc2lvbnNEYXRhKSkpOwoKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkdW1wVG9QaHBDb2RlKGFycmF5ICRhcnJheSA9IFtdLCBpbnQgJGxldmVsID0gMCk6IHN0cmluZwp7CiRsaW5lcyA9ICJhcnJheShcbiI7CiRsZXZlbCsrOwoKZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CiRsaW5lcyAuPSBzdHJfcmVwZWF0KCcgICAgJywgJGxldmVsKTsKJGxpbmVzIC49IGlzX2ludCgka2V5KSA/ICRrZXkgLiAnID0+ICcgOiB2YXJfZXhwb3J0KCRrZXksIHRydWUpIC4gJyA9PiAnOwoKaWYgKGlzX2FycmF5KCR2YWx1ZSkpIHsKaWYgKCFlbXB0eSgkdmFsdWUpKSB7CiRsaW5lcyAuPSAkdGhpcy0+ZHVtcFRvUGhwQ29kZSgkdmFsdWUsICRsZXZlbCk7Cn0gZWxzZSB7CiRsaW5lcyAuPSAiYXJyYXkoKSxcbiI7Cn0KfSBlbHNlaWYgKCRrZXkgPT09ICdpbnN0YWxsX3BhdGgnICYmIGlzX3N0cmluZygkdmFsdWUpKSB7CmlmICgkdGhpcy0+ZmlsZXN5c3RlbS0+aXNBYnNvbHV0ZVBhdGgoJHZhbHVlKSkgewokbGluZXMgLj0gdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpIC4gIixcbiI7Cn0gZWxzZSB7CiRsaW5lcyAuPSAiX19ESVJfXyAuICIgLiB2YXJfZXhwb3J0KCcvJyAuICR2YWx1ZSwgdHJ1ZSkgLiAiLFxuIjsKfQp9IGVsc2VpZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJGxpbmVzIC49IHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKSAuICIsXG4iOwp9IGVsc2VpZiAoaXNfYm9vbCgkdmFsdWUpKSB7CiRsaW5lcyAuPSAoJHZhbHVlID8gJ3RydWUnIDogJ2ZhbHNlJykgLiAiLFxuIjsKfSBlbHNlaWYgKGlzX251bGwoJHZhbHVlKSkgewokbGluZXMgLj0gIm51bGwsXG4iOwp9IGVsc2Ugewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignVW5leHBlY3RlZCB0eXBlICcuZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKSk7Cn0KfQoKJGxpbmVzIC49IHN0cl9yZXBlYXQoJyAgICAnLCAkbGV2ZWwgLSAxKSAuICcpJyAuICgkbGV2ZWwgLSAxID09PSAwID8gJycgOiAiLFxuIik7CgpyZXR1cm4gJGxpbmVzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2VuZXJhdGVJbnN0YWxsZWRWZXJzaW9ucyhJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyLCBhcnJheSAkaW5zdGFsbFBhdGhzLCBib29sICRkZXZNb2RlLCBzdHJpbmcgJHJlcG9EaXIpOiBhcnJheQp7CiRkZXZQYWNrYWdlcyA9IGFycmF5X2ZsaXAoJHRoaXMtPmRldlBhY2thZ2VOYW1lcyk7CiRwYWNrYWdlcyA9ICR0aGlzLT5nZXRQYWNrYWdlcygpOwppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RQYWNrYWdlKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0l0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gZHVtcCBwYWNrYWdlcyBpZiBubyByb290IHBhY2thZ2UgaXMgZ2l2ZW4nKTsKfQokcGFja2FnZXNbXSA9ICRyb290UGFja2FnZSA9ICR0aGlzLT5yb290UGFja2FnZTsKCndoaWxlICgkcm9vdFBhY2thZ2UgaW5zdGFuY2VvZiBSb290QWxpYXNQYWNrYWdlKSB7CiRyb290UGFja2FnZSA9ICRyb290UGFja2FnZS0+Z2V0QWxpYXNPZigpOwokcGFja2FnZXNbXSA9ICRyb290UGFja2FnZTsKfQokdmVyc2lvbnMgPSBbCidyb290JyA9PiAkdGhpcy0+ZHVtcFJvb3RQYWNrYWdlKCRyb290UGFja2FnZSwgJGluc3RhbGxQYXRocywgJGRldk1vZGUsICRyZXBvRGlyLCAkZGV2UGFja2FnZXMpLAondmVyc2lvbnMnID0+IFtdLApdOwoKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UpIHsKY29udGludWU7Cn0KCiR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICR0aGlzLT5kdW1wSW5zdGFsbGVkUGFja2FnZSgkcGFja2FnZSwgJGluc3RhbGxQYXRocywgJHJlcG9EaXIsICRkZXZQYWNrYWdlcyk7Cn0KCgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKJGlzRGV2UGFja2FnZSA9IGlzc2V0KCRkZXZQYWNrYWdlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSk7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRyZXBsYWNlKSB7CgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcmVwbGFjZS0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSAkaXNEZXZQYWNrYWdlOwp9IGVsc2VpZiAoISRpc0RldlBhY2thZ2UpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddID0gZmFsc2U7Cn0KJHJlcGxhY2VkID0gJHJlcGxhY2UtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKaWYgKCRyZXBsYWNlZCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJHJlcGxhY2VkID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQppZiAoIWlzc2V0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcmVwbGFjZS0+Z2V0VGFyZ2V0KCldWydyZXBsYWNlZCddKSB8fCAhaW5fYXJyYXkoJHJlcGxhY2VkLCAkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHJlcGxhY2UtPmdldFRhcmdldCgpXVsncmVwbGFjZWQnXSwgdHJ1ZSkpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRyZXBsYWNlLT5nZXRUYXJnZXQoKV1bJ3JlcGxhY2VkJ11bXSA9ICRyZXBsYWNlZDsKfQp9CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRQcm92aWRlcygpIGFzICRwcm92aWRlKSB7CgppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcHJvdmlkZS0+Z2V0VGFyZ2V0KCkpKSB7CmNvbnRpbnVlOwp9CmlmICghaXNzZXQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddKSkgewokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsnZGV2X3JlcXVpcmVtZW50J10gPSAkaXNEZXZQYWNrYWdlOwp9IGVsc2VpZiAoISRpc0RldlBhY2thZ2UpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ2Rldl9yZXF1aXJlbWVudCddID0gZmFsc2U7Cn0KJHByb3ZpZGVkID0gJHByb3ZpZGUtPmdldFByZXR0eUNvbnN0cmFpbnQoKTsKaWYgKCRwcm92aWRlZCA9PT0gJ3NlbGYudmVyc2lvbicpIHsKJHByb3ZpZGVkID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQppZiAoIWlzc2V0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXVskcHJvdmlkZS0+Z2V0VGFyZ2V0KCldWydwcm92aWRlZCddKSB8fCAhaW5fYXJyYXkoJHByb3ZpZGVkLCAkdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHByb3ZpZGUtPmdldFRhcmdldCgpXVsncHJvdmlkZWQnXSwgdHJ1ZSkpIHsKJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRwcm92aWRlLT5nZXRUYXJnZXQoKV1bJ3Byb3ZpZGVkJ11bXSA9ICRwcm92aWRlZDsKfQp9Cn0KCgpmb3JlYWNoICgkcGFja2FnZXMgYXMgJHBhY2thZ2UpIHsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewpjb250aW51ZTsKfQokdmVyc2lvbnNbJ3ZlcnNpb25zJ11bJHBhY2thZ2UtPmdldE5hbWUoKV1bJ2FsaWFzZXMnXVtdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHZlcnNpb25zWydyb290J11bJ2FsaWFzZXMnXVtdID0gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKTsKfQp9Cgprc29ydCgkdmVyc2lvbnNbJ3ZlcnNpb25zJ10pOwprc29ydCgkdmVyc2lvbnMpOwoKZm9yZWFjaCAoJHZlcnNpb25zWyd2ZXJzaW9ucyddIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CmZvcmVhY2ggKFsnYWxpYXNlcycsICdyZXBsYWNlZCcsICdwcm92aWRlZCddIGFzICRrZXkpIHsKaWYgKGlzc2V0KCR2ZXJzaW9uc1sndmVyc2lvbnMnXVskbmFtZV1bJGtleV0pKSB7CnNvcnQoJHZlcnNpb25zWyd2ZXJzaW9ucyddWyRuYW1lXVska2V5XSwgU09SVF9OQVRVUkFMKTsKfQp9Cn0KCnJldHVybiAkdmVyc2lvbnM7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkdW1wSW5zdGFsbGVkUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCBhcnJheSAkaW5zdGFsbFBhdGhzLCBzdHJpbmcgJHJlcG9EaXIsIGFycmF5ICRkZXZQYWNrYWdlcyk6IGFycmF5CnsKJHJlZmVyZW5jZSA9IG51bGw7CmlmICgkcGFja2FnZS0+Z2V0SW5zdGFsbGF0aW9uU291cmNlKCkpIHsKJHJlZmVyZW5jZSA9ICRwYWNrYWdlLT5nZXRJbnN0YWxsYXRpb25Tb3VyY2UoKSA9PT0gJ3NvdXJjZScgPyAkcGFja2FnZS0+Z2V0U291cmNlUmVmZXJlbmNlKCkgOiAkcGFja2FnZS0+Z2V0RGlzdFJlZmVyZW5jZSgpOwp9CmlmIChudWxsID09PSAkcmVmZXJlbmNlKSB7CiRyZWZlcmVuY2UgPSAoJHBhY2thZ2UtPmdldFNvdXJjZVJlZmVyZW5jZSgpID86ICRwYWNrYWdlLT5nZXREaXN0UmVmZXJlbmNlKCkpID86IG51bGw7Cn0KCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiR0byA9ICR0aGlzLT5maWxlc3lzdGVtLT5ub3JtYWxpemVQYXRoKHJlYWxwYXRoKFBsYXRmb3JtOjpnZXRDd2QoKSkpOwokaW5zdGFsbFBhdGggPSAkdGhpcy0+ZmlsZXN5c3RlbS0+ZmluZFNob3J0ZXN0UGF0aCgkcmVwb0RpciwgJHRvLCB0cnVlKTsKfSBlbHNlIHsKJGluc3RhbGxQYXRoID0gJGluc3RhbGxQYXRoc1skcGFja2FnZS0+Z2V0TmFtZSgpXTsKfQoKJGRhdGEgPSBbCidwcmV0dHlfdmVyc2lvbicgPT4gJHBhY2thZ2UtPmdldFByZXR0eVZlcnNpb24oKSwKJ3ZlcnNpb24nID0+ICRwYWNrYWdlLT5nZXRWZXJzaW9uKCksCidyZWZlcmVuY2UnID0+ICRyZWZlcmVuY2UsCid0eXBlJyA9PiAkcGFja2FnZS0+Z2V0VHlwZSgpLAonaW5zdGFsbF9wYXRoJyA9PiAkaW5zdGFsbFBhdGgsCidhbGlhc2VzJyA9PiBbXSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gaXNzZXQoJGRldlBhY2thZ2VzWyRwYWNrYWdlLT5nZXROYW1lKCldKSwKXTsKCnJldHVybiAkZGF0YTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGR1bXBSb290UGFja2FnZShSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSwgYXJyYXkgJGluc3RhbGxQYXRocywgYm9vbCAkZGV2TW9kZSwgc3RyaW5nICRyZXBvRGlyLCBhcnJheSAkZGV2UGFja2FnZXMpCnsKJGRhdGEgPSAkdGhpcy0+ZHVtcEluc3RhbGxlZFBhY2thZ2UoJHBhY2thZ2UsICRpbnN0YWxsUGF0aHMsICRyZXBvRGlyLCAkZGV2UGFja2FnZXMpOwoKcmV0dXJuIFsKJ25hbWUnID0+ICRwYWNrYWdlLT5nZXROYW1lKCksCidwcmV0dHlfdmVyc2lvbicgPT4gJGRhdGFbJ3ByZXR0eV92ZXJzaW9uJ10sCid2ZXJzaW9uJyA9PiAkZGF0YVsndmVyc2lvbiddLAoncmVmZXJlbmNlJyA9PiAkZGF0YVsncmVmZXJlbmNlJ10sCid0eXBlJyA9PiAkZGF0YVsndHlwZSddLAonaW5zdGFsbF9wYXRoJyA9PiAkZGF0YVsnaW5zdGFsbF9wYXRoJ10sCidhbGlhc2VzJyA9PiAkZGF0YVsnYWxpYXNlcyddLAonZGV2JyA9PiAkZGV2TW9kZSwKXTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQmFzZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCmNsYXNzIEZpbHRlclJlcG9zaXRvcnkgaW1wbGVtZW50cyBSZXBvc2l0b3J5SW50ZXJmYWNlLCBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlCnsKCnByaXZhdGUgJG9ubHkgPSBudWxsOwoKcHJpdmF0ZSAkZXhjbHVkZSA9IG51bGw7Cgpwcml2YXRlICRjYW5vbmljYWwgPSB0cnVlOwoKcHJpdmF0ZSAkcmVwbzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBhcnJheSAkb3B0aW9ucykKewppZiAoaXNzZXQoJG9wdGlvbnNbJ29ubHknXSkpIHsKaWYgKCFpc19hcnJheSgkb3B0aW9uc1snb25seSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignIm9ubHkiIGtleSBmb3IgcmVwb3NpdG9yeSAnLiRyZXBvLT5nZXRSZXBvTmFtZSgpLicgc2hvdWxkIGJlIGFuIGFycmF5Jyk7Cn0KJHRoaXMtPm9ubHkgPSBCYXNlUGFja2FnZTo6cGFja2FnZU5hbWVzVG9SZWdleHAoJG9wdGlvbnNbJ29ubHknXSk7Cn0KaWYgKGlzc2V0KCRvcHRpb25zWydleGNsdWRlJ10pKSB7CmlmICghaXNfYXJyYXkoJG9wdGlvbnNbJ2V4Y2x1ZGUnXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyJleGNsdWRlIiBrZXkgZm9yIHJlcG9zaXRvcnkgJy4kcmVwby0+Z2V0UmVwb05hbWUoKS4nIHNob3VsZCBiZSBhbiBhcnJheScpOwp9CiR0aGlzLT5leGNsdWRlID0gQmFzZVBhY2thZ2U6OnBhY2thZ2VOYW1lc1RvUmVnZXhwKCRvcHRpb25zWydleGNsdWRlJ10pOwp9CmlmICgkdGhpcy0+ZXhjbHVkZSAmJiAkdGhpcy0+b25seSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignT25seSBvbmUgb2YgIm9ubHkiIGFuZCAiZXhjbHVkZSIgY2FuIGJlIHNwZWNpZmllZCBmb3IgcmVwb3NpdG9yeSAnLiRyZXBvLT5nZXRSZXBvTmFtZSgpKTsKfQppZiAoaXNzZXQoJG9wdGlvbnNbJ2Nhbm9uaWNhbCddKSkgewppZiAoIWlzX2Jvb2woJG9wdGlvbnNbJ2Nhbm9uaWNhbCddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignImNhbm9uaWNhbCIga2V5IGZvciByZXBvc2l0b3J5ICcuJHJlcG8tPmdldFJlcG9OYW1lKCkuJyBzaG91bGQgYmUgYSBib29sZWFuJyk7Cn0KJHRoaXMtPmNhbm9uaWNhbCA9ICRvcHRpb25zWydjYW5vbmljYWwnXTsKfQoKJHRoaXMtPnJlcG8gPSAkcmVwbzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cmVwby0+Z2V0UmVwb05hbWUoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9zaXRvcnkoKTogUmVwb3NpdG9yeUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cmVwbzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1BhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnJlcG8tPmhhc1BhY2thZ2UoJHBhY2thZ2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KTogP0Jhc2VQYWNrYWdlCnsKaWYgKCEkdGhpcy0+aXNBbGxvd2VkKCRuYW1lKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5yZXBvLT5maW5kUGFja2FnZSgkbmFtZSwgJGNvbnN0cmFpbnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKCRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CmlmICghJHRoaXMtPmlzQWxsb3dlZCgkbmFtZSkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG8tPmZpbmRQYWNrYWdlcygkbmFtZSwgJGNvbnN0cmFpbnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9hZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlTmFtZU1hcCwgYXJyYXkgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgYXJyYXkgJHN0YWJpbGl0eUZsYWdzLCBhcnJheSAkYWxyZWFkeUxvYWRlZCA9IFtdKTogYXJyYXkKewpmb3JlYWNoICgkcGFja2FnZU5hbWVNYXAgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKCEkdGhpcy0+aXNBbGxvd2VkKCRuYW1lKSkgewp1bnNldCgkcGFja2FnZU5hbWVNYXBbJG5hbWVdKTsKfQp9CgppZiAoISRwYWNrYWdlTmFtZU1hcCkgewpyZXR1cm4gWyduYW1lc0ZvdW5kJyA9PiBbXSwgJ3BhY2thZ2VzJyA9PiBbXV07Cn0KCiRyZXN1bHQgPSAkdGhpcy0+cmVwby0+bG9hZFBhY2thZ2VzKCRwYWNrYWdlTmFtZU1hcCwgJGFjY2VwdGFibGVTdGFiaWxpdGllcywgJHN0YWJpbGl0eUZsYWdzLCAkYWxyZWFkeUxvYWRlZCk7CmlmICghJHRoaXMtPmNhbm9uaWNhbCkgewokcmVzdWx0WyduYW1lc0ZvdW5kJ10gPSBbXTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpOiBhcnJheQp7CiRyZXN1bHQgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5yZXBvLT5zZWFyY2goJHF1ZXJ5LCAkbW9kZSwgJHR5cGUpIGFzICRwYWNrYWdlKSB7CmlmICgkdGhpcy0+aXNBbGxvd2VkKCRwYWNrYWdlWyduYW1lJ10pKSB7CiRyZXN1bHRbXSA9ICRwYWNrYWdlOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFja2FnZXMoKTogYXJyYXkKewokcmVzdWx0ID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvLT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CmlmICgkdGhpcy0+aXNBbGxvd2VkKCRwYWNrYWdlLT5nZXROYW1lKCkpKSB7CiRyZXN1bHRbXSA9ICRwYWNrYWdlOwp9Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSk6IGFycmF5CnsKJHJlc3VsdCA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwby0+Z2V0UHJvdmlkZXJzKCRwYWNrYWdlTmFtZSkgYXMgJG5hbWUgPT4gJHByb3ZpZGVyKSB7CmlmICgkdGhpcy0+aXNBbGxvd2VkKCRwcm92aWRlclsnbmFtZSddKSkgewokcmVzdWx0WyRuYW1lXSA9ICRwcm92aWRlcjsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CmlmICgkdGhpcy0+cmVwby0+Y291bnQoKSA+IDApIHsKcmV0dXJuIGNvdW50KCR0aGlzLT5nZXRQYWNrYWdlcygpKTsKfQoKcmV0dXJuIDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNTZWN1cml0eUFkdmlzb3JpZXMoKTogYm9vbAp7CmlmICghJHRoaXMtPnJlcG8gaW5zdGFuY2VvZiBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR0aGlzLT5yZXBvLT5oYXNTZWN1cml0eUFkdmlzb3JpZXMoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNlY3VyaXR5QWR2aXNvcmllcyhhcnJheSAkcGFja2FnZUNvbnN0cmFpbnRNYXAsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgPSBmYWxzZSk6IGFycmF5CnsKaWYgKCEkdGhpcy0+cmVwbyBpbnN0YW5jZW9mIEFkdmlzb3J5UHJvdmlkZXJJbnRlcmZhY2UpIHsKcmV0dXJuIFsnbmFtZXNGb3VuZCcgPT4gW10sICdhZHZpc29yaWVzJyA9PiBbXV07Cn0KCmZvcmVhY2ggKCRwYWNrYWdlQ29uc3RyYWludE1hcCBhcyAkbmFtZSA9PiAkY29uc3RyYWludCkgewppZiAoISR0aGlzLT5pc0FsbG93ZWQoJG5hbWUpKSB7CnVuc2V0KCRwYWNrYWdlQ29uc3RyYWludE1hcFskbmFtZV0pOwp9Cn0KCnJldHVybiAkdGhpcy0+cmVwby0+Z2V0U2VjdXJpdHlBZHZpc29yaWVzKCRwYWNrYWdlQ29uc3RyYWludE1hcCwgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGlzQWxsb3dlZChzdHJpbmcgJG5hbWUpOiBib29sCnsKaWYgKCEkdGhpcy0+b25seSAmJiAhJHRoaXMtPmV4Y2x1ZGUpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgkdGhpcy0+b25seSkgewpyZXR1cm4gUHJlZzo6aXNNYXRjaCgkdGhpcy0+b25seSwgJG5hbWUpOwp9CgppZiAoJHRoaXMtPmV4Y2x1ZGUgPT09IG51bGwpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiAhUHJlZzo6aXNNYXRjaCgkdGhpcy0+ZXhjbHVkZSwgJG5hbWUpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgoKCgoKCgoKY2xhc3MgSW5zdGFsbGVkQXJyYXlSZXBvc2l0b3J5IGV4dGVuZHMgV3JpdGFibGVBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiAnaW5zdGFsbGVkICcucGFyZW50OjpnZXRSZXBvTmFtZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNGcmVzaCgpOiBib29sCnsKCgpyZXR1cm4gJHRoaXMtPmNvdW50KCkgPT09IDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKY2xhc3MgSW5zdGFsbGVkRmlsZXN5c3RlbVJlcG9zaXRvcnkgZXh0ZW5kcyBGaWxlc3lzdGVtUmVwb3NpdG9yeSBpbXBsZW1lbnRzIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UKewpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKQp7CnJldHVybiAnaW5zdGFsbGVkICcucGFyZW50OjpnZXRSZXBvTmFtZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNGcmVzaCgpCnsKcmV0dXJuICEkdGhpcy0+ZmlsZS0+ZXhpc3RzKCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXEJhc2VQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XE1hdGNoQWxsQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUm9vdFBhY2thZ2VJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXExpbms7CgoKCgoKCgoKCgpjbGFzcyBJbnN0YWxsZWRSZXBvc2l0b3J5IGV4dGVuZHMgQ29tcG9zaXRlUmVwb3NpdG9yeQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlc1dpdGhSZXBsYWNlcnNBbmRQcm92aWRlcnMoc3RyaW5nICRuYW1lLCAkY29uc3RyYWludCA9IG51bGwpOiBhcnJheQp7CiRuYW1lID0gc3RydG9sb3dlcigkbmFtZSk7CgppZiAobnVsbCAhPT0gJGNvbnN0cmFpbnQgJiYgISRjb25zdHJhaW50IGluc3RhbmNlb2YgQ29uc3RyYWludEludGVyZmFjZSkgewokdmVyc2lvblBhcnNlciA9IG5ldyBWZXJzaW9uUGFyc2VyKCk7CiRjb25zdHJhaW50ID0gJHZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJGNvbnN0cmFpbnQpOwp9CgokbWF0Y2hlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0UmVwb3NpdG9yaWVzKCkgYXMgJHJlcG8pIHsKZm9yZWFjaCAoJHJlcG8tPmdldFBhY2thZ2VzKCkgYXMgJGNhbmRpZGF0ZSkgewppZiAoJG5hbWUgPT09ICRjYW5kaWRhdGUtPmdldE5hbWUoKSkgewppZiAobnVsbCA9PT0gJGNvbnN0cmFpbnQgfHwgJGNvbnN0cmFpbnQtPm1hdGNoZXMobmV3IENvbnN0cmFpbnQoJz09JywgJGNhbmRpZGF0ZS0+Z2V0VmVyc2lvbigpKSkpIHsKJG1hdGNoZXNbXSA9ICRjYW5kaWRhdGU7Cn0KY29udGludWU7Cn0KCmZvcmVhY2ggKGFycmF5X21lcmdlKCRjYW5kaWRhdGUtPmdldFByb3ZpZGVzKCksICRjYW5kaWRhdGUtPmdldFJlcGxhY2VzKCkpIGFzICRsaW5rKSB7CmlmICgKJG5hbWUgPT09ICRsaW5rLT5nZXRUYXJnZXQoKQomJiAoJGNvbnN0cmFpbnQgPT09IG51bGwgfHwgJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGxpbmstPmdldENvbnN0cmFpbnQoKSkpCikgewokbWF0Y2hlc1tdID0gJGNhbmRpZGF0ZTsKY29udGludWUgMjsKfQp9Cn0KfQoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVwZW5kZW50cygkbmVlZGxlLCA/Q29uc3RyYWludEludGVyZmFjZSAkY29uc3RyYWludCA9IG51bGwsIGJvb2wgJGludmVydCA9IGZhbHNlLCBib29sICRyZWN1cnNlID0gdHJ1ZSwgP2FycmF5ICRwYWNrYWdlc0ZvdW5kID0gbnVsbCk6IGFycmF5CnsKJG5lZWRsZXMgPSBhcnJheV9tYXAoJ3N0cnRvbG93ZXInLCAoYXJyYXkpICRuZWVkbGUpOwokcmVzdWx0cyA9IFtdOwoKCmlmIChudWxsID09PSAkcGFja2FnZXNGb3VuZCkgewokcGFja2FnZXNGb3VuZCA9ICRuZWVkbGVzOwp9CgoKJHJvb3RQYWNrYWdlID0gbnVsbDsKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBhY2thZ2UpIHsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJHJvb3RQYWNrYWdlID0gJHBhY2thZ2U7CmJyZWFrOwp9Cn0KCgpmb3JlYWNoICgkdGhpcy0+Z2V0UGFja2FnZXMoKSBhcyAkcGFja2FnZSkgewokbGlua3MgPSAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKCgoKJHBhY2thZ2VzSW5UcmVlID0gJHBhY2thZ2VzRm91bmQ7CgoKaWYgKCEkaW52ZXJ0KSB7CiRsaW5rcyArPSAkcGFja2FnZS0+Z2V0UmVwbGFjZXMoKTsKCgoKCmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRSZXBsYWNlcygpIGFzICRsaW5rKSB7CmZvcmVhY2ggKCRuZWVkbGVzIGFzICRuZWVkbGUpIHsKaWYgKCRsaW5rLT5nZXRTb3VyY2UoKSA9PT0gJG5lZWRsZSkgewppZiAoJGNvbnN0cmFpbnQgPT09IG51bGwgfHwgKCRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJGNvbnN0cmFpbnQpID09PSB0cnVlKSkgewoKaWYgKGluX2FycmF5KCRsaW5rLT5nZXRUYXJnZXQoKSwgJHBhY2thZ2VzSW5UcmVlKSkgewokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgZmFsc2VdOwpjb250aW51ZTsKfQokcGFja2FnZXNJblRyZWVbXSA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKJGRlcGVuZGVudHMgPSAkcmVjdXJzZSA/ICR0aGlzLT5nZXREZXBlbmRlbnRzKCRsaW5rLT5nZXRUYXJnZXQoKSwgbnVsbCwgZmFsc2UsIHRydWUsICRwYWNrYWdlc0luVHJlZSkgOiBbXTsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssICRkZXBlbmRlbnRzXTsKJG5lZWRsZXNbXSA9ICRsaW5rLT5nZXRUYXJnZXQoKTsKfQp9Cn0KfQp1bnNldCgkbmVlZGxlKTsKfQoKCmlmICgkcGFja2FnZSBpbnN0YW5jZW9mIFJvb3RQYWNrYWdlSW50ZXJmYWNlKSB7CiRsaW5rcyArPSAkcGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKTsKfQoKCmZvcmVhY2ggKCRsaW5rcyBhcyAkbGluaykgewpmb3JlYWNoICgkbmVlZGxlcyBhcyAkbmVlZGxlKSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRuZWVkbGUpIHsKaWYgKCRjb25zdHJhaW50ID09PSBudWxsIHx8ICgkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCRjb25zdHJhaW50KSA9PT0gISRpbnZlcnQpKSB7CgppZiAoaW5fYXJyYXkoJGxpbmstPmdldFNvdXJjZSgpLCAkcGFja2FnZXNJblRyZWUpKSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07CmNvbnRpbnVlOwp9CiRwYWNrYWdlc0luVHJlZVtdID0gJGxpbmstPmdldFNvdXJjZSgpOwokZGVwZW5kZW50cyA9ICRyZWN1cnNlID8gJHRoaXMtPmdldERlcGVuZGVudHMoJGxpbmstPmdldFNvdXJjZSgpLCBudWxsLCBmYWxzZSwgdHJ1ZSwgJHBhY2thZ2VzSW5UcmVlKSA6IFtdOwokcmVzdWx0c1tdID0gWyRwYWNrYWdlLCAkbGluaywgJGRlcGVuZGVudHNdOwp9Cn0KfQp9CgoKaWYgKCRpbnZlcnQgJiYgaW5fYXJyYXkoJHBhY2thZ2UtPmdldE5hbWUoKSwgJG5lZWRsZXMsIHRydWUpKSB7CmZvcmVhY2ggKCRwYWNrYWdlLT5nZXRDb25mbGljdHMoKSBhcyAkbGluaykgewpmb3JlYWNoICgkdGhpcy0+ZmluZFBhY2thZ2VzKCRsaW5rLT5nZXRUYXJnZXQoKSkgYXMgJHBrZykgewokdmVyc2lvbiA9IG5ldyBDb25zdHJhaW50KCc9JywgJHBrZy0+Z2V0VmVyc2lvbigpKTsKaWYgKCRsaW5rLT5nZXRDb25zdHJhaW50KCktPm1hdGNoZXMoJHZlcnNpb24pID09PSAkaW52ZXJ0KSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07Cn0KfQp9Cn0KCgpmb3JlYWNoICgkcGFja2FnZS0+Z2V0Q29uZmxpY3RzKCkgYXMgJGxpbmspIHsKaWYgKGluX2FycmF5KCRsaW5rLT5nZXRUYXJnZXQoKSwgJG5lZWRsZXMsIHRydWUpKSB7CmZvcmVhY2ggKCR0aGlzLT5maW5kUGFja2FnZXMoJGxpbmstPmdldFRhcmdldCgpKSBhcyAkcGtnKSB7CiR2ZXJzaW9uID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGtnLT5nZXRWZXJzaW9uKCkpOwppZiAoJGxpbmstPmdldENvbnN0cmFpbnQoKS0+bWF0Y2hlcygkdmVyc2lvbikgPT09ICRpbnZlcnQpIHsKJHJlc3VsdHNbXSA9IFskcGFja2FnZSwgJGxpbmssIGZhbHNlXTsKfQp9Cn0KfQoKCmlmICgkaW52ZXJ0ICYmICRjb25zdHJhaW50ICYmIGluX2FycmF5KCRwYWNrYWdlLT5nZXROYW1lKCksICRuZWVkbGVzLCB0cnVlKSAmJiAkY29uc3RyYWludC0+bWF0Y2hlcyhuZXcgQ29uc3RyYWludCgnPScsICRwYWNrYWdlLT5nZXRWZXJzaW9uKCkpKSkgewpmb3JlYWNoICgkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKSBhcyAkbGluaykgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkbGluay0+Z2V0VGFyZ2V0KCkpKSB7CmlmICgkdGhpcy0+ZmluZFBhY2thZ2UoJGxpbmstPmdldFRhcmdldCgpLCAkbGluay0+Z2V0Q29uc3RyYWludCgpKSkgewpjb250aW51ZTsKfQoKJHBsYXRmb3JtUGtnID0gJHRoaXMtPmZpbmRQYWNrYWdlKCRsaW5rLT5nZXRUYXJnZXQoKSwgJyonKTsKJGRlc2NyaXB0aW9uID0gJHBsYXRmb3JtUGtnID8gJ2J1dCAnLiRwbGF0Zm9ybVBrZy0+Z2V0UHJldHR5VmVyc2lvbigpLicgaXMgaW5zdGFsbGVkJyA6ICdidXQgaXQgaXMgbWlzc2luZyc7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsIG5ldyBMaW5rKCRwYWNrYWdlLT5nZXROYW1lKCksICRsaW5rLT5nZXRUYXJnZXQoKSwgbmV3IE1hdGNoQWxsQ29uc3RyYWludCwgTGluazo6VFlQRV9SRVFVSVJFLCAkbGluay0+Z2V0UHJldHR5Q29uc3RyYWludCgpLicgJy4kZGVzY3JpcHRpb24pLCBmYWxzZV07Cgpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHRoaXMtPmdldFBhY2thZ2VzKCkgYXMgJHBrZykgewppZiAoIWluX2FycmF5KCRsaW5rLT5nZXRUYXJnZXQoKSwgJHBrZy0+Z2V0TmFtZXMoKSkpIHsKY29udGludWU7Cn0KCiR2ZXJzaW9uID0gbmV3IENvbnN0cmFpbnQoJz0nLCAkcGtnLT5nZXRWZXJzaW9uKCkpOwoKaWYgKCRsaW5rLT5nZXRUYXJnZXQoKSAhPT0gJHBrZy0+Z2V0TmFtZSgpKSB7CmZvcmVhY2ggKGFycmF5X21lcmdlKCRwa2ctPmdldFJlcGxhY2VzKCksICRwa2ctPmdldFByb3ZpZGVzKCkpIGFzICRwcm92KSB7CmlmICgkbGluay0+Z2V0VGFyZ2V0KCkgPT09ICRwcm92LT5nZXRUYXJnZXQoKSkgewokdmVyc2lvbiA9ICRwcm92LT5nZXRDb25zdHJhaW50KCk7CmJyZWFrOwp9Cn0KfQoKaWYgKCEkbGluay0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCR2ZXJzaW9uKSkgewoKCmlmICgkcm9vdFBhY2thZ2UpIHsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoJHJvb3RQYWNrYWdlLT5nZXRSZXF1aXJlcygpLCAkcm9vdFBhY2thZ2UtPmdldERldlJlcXVpcmVzKCkpIGFzICRyb290UmVxKSB7CmlmIChpbl9hcnJheSgkcm9vdFJlcS0+Z2V0VGFyZ2V0KCksICRwa2ctPmdldE5hbWVzKCkpICYmICEkcm9vdFJlcS0+Z2V0Q29uc3RyYWludCgpLT5tYXRjaGVzKCRsaW5rLT5nZXRDb25zdHJhaW50KCkpKSB7CiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07CiRyZXN1bHRzW10gPSBbJHJvb3RQYWNrYWdlLCAkcm9vdFJlcSwgZmFsc2VdOwpjb250aW51ZSAzOwp9Cn0KCiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07CiRyZXN1bHRzW10gPSBbJHJvb3RQYWNrYWdlLCBuZXcgTGluaygkcm9vdFBhY2thZ2UtPmdldE5hbWUoKSwgJGxpbmstPmdldFRhcmdldCgpLCBuZXcgTWF0Y2hBbGxDb25zdHJhaW50LCBMaW5rOjpUWVBFX0RPRVNfTk9UX1JFUVVJUkUsICdidXQgJyAuICRwa2ctPmdldFByZXR0eVZlcnNpb24oKSAuICcgaXMgaW5zdGFsbGVkJyksIGZhbHNlXTsKfSBlbHNlIHsKCiRyZXN1bHRzW10gPSBbJHBhY2thZ2UsICRsaW5rLCBmYWxzZV07Cn0KfQoKY29udGludWUgMjsKfQp9Cn0KfQoKa3NvcnQoJHJlc3VsdHMpOwoKcmV0dXJuICRyZXN1bHRzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdpbnN0YWxsZWQgcmVwbyAoJy5pbXBsb2RlKCcsICcsIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRyZXBvKTogc3RyaW5nIHsKcmV0dXJuICRyZXBvLT5nZXRSZXBvTmFtZSgpOwp9LCAkdGhpcy0+Z2V0UmVwb3NpdG9yaWVzKCkpKS4nKSc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG9zaXRvcnkpOiB2b2lkCnsKaWYgKAokcmVwb3NpdG9yeSBpbnN0YW5jZW9mIExvY2tBcnJheVJlcG9zaXRvcnkKfHwgJHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlCnx8ICRyZXBvc2l0b3J5IGluc3RhbmNlb2YgUm9vdFBhY2thZ2VSZXBvc2l0b3J5Cnx8ICRyZXBvc2l0b3J5IGluc3RhbmNlb2YgUGxhdGZvcm1SZXBvc2l0b3J5CikgewpwYXJlbnQ6OmFkZFJlcG9zaXRvcnkoJHJlcG9zaXRvcnkpOwoKcmV0dXJuOwp9Cgp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdBbiBJbnN0YWxsZWRSZXBvc2l0b3J5IGNhbiBub3QgY29udGFpbiBhIHJlcG9zaXRvcnkgb2YgdHlwZSAnLmdldF9jbGFzcygkcmVwb3NpdG9yeSkuJyAoJy4kcmVwb3NpdG9yeS0+Z2V0UmVwb05hbWUoKS4nKScpOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7CgoKCgoKCgoKaW50ZXJmYWNlIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgZXh0ZW5kcyBXcml0YWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGV2TW9kZSgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRnJlc2goKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKY2xhc3MgSW52YWxpZFJlcG9zaXRvcnlFeGNlcHRpb24gZXh0ZW5kcyBcRXhjZXB0aW9uCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgpjbGFzcyBMb2NrQXJyYXlSZXBvc2l0b3J5IGV4dGVuZHMgQXJyYXlSZXBvc2l0b3J5CnsKdXNlIENhbm9uaWNhbFBhY2thZ2VzVHJhaXQ7CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdsb2NrIHJlcG8nOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcQWR2aXNvcnlcUGFydGlhbFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxTZWN1cml0eUFkdmlzb3J5Owp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxWYWxpZGF0aW5nQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgoKY2xhc3MgUGFja2FnZVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBBZHZpc29yeVByb3ZpZGVySW50ZXJmYWNlCnsKCnByaXZhdGUgJGNvbmZpZzsKCgpwcml2YXRlICRzZWN1cml0eUFkdmlzb3JpZXM7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29uZmlnKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoKTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWdbJ3BhY2thZ2UnXTsKCgppZiAoIWlzX251bWVyaWMoa2V5KCR0aGlzLT5jb25maWcpKSkgewokdGhpcy0+Y29uZmlnID0gWyR0aGlzLT5jb25maWddOwp9CgokdGhpcy0+c2VjdXJpdHlBZHZpc29yaWVzID0gJGNvbmZpZ1snc2VjdXJpdHktYWR2aXNvcmllcyddID8/IFtdOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokbG9hZGVyID0gbmV3IFZhbGlkYXRpbmdBcnJheUxvYWRlcihuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSksIHRydWUpOwpmb3JlYWNoICgkdGhpcy0+Y29uZmlnIGFzICRwYWNrYWdlKSB7CnRyeSB7CiRwYWNrYWdlID0gJGxvYWRlci0+bG9hZCgkcGFja2FnZSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IEludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uKCdBIHJlcG9zaXRvcnkgb2YgdHlwZSAicGFja2FnZSIgY29udGFpbnMgYW4gaW52YWxpZCBwYWNrYWdlIGRlZmluaXRpb246ICcuJGUtPmdldE1lc3NhZ2UoKS4iXG5cbkludmFsaWQgcGFja2FnZSBkZWZpbml0aW9uOlxuIi5qc29uX2VuY29kZSgkcGFja2FnZSkpOwp9CgokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk6IHN0cmluZwp7CnJldHVybiBQcmVnOjpyZXBsYWNlKCd7XmFycmF5IH0nLCAncGFja2FnZSAnLCBwYXJlbnQ6OmdldFJlcG9OYW1lKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaGFzU2VjdXJpdHlBZHZpc29yaWVzKCk6IGJvb2wKewpyZXR1cm4gY291bnQoJHRoaXMtPnNlY3VyaXR5QWR2aXNvcmllcykgPiAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlQ29uc3RyYWludE1hcCwgYm9vbCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcyA9IGZhbHNlKTogYXJyYXkKewokcGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKCiRhZHZpc29yaWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5zZWN1cml0eUFkdmlzb3JpZXMgYXMgJHBhY2thZ2VOYW1lID0+ICRwYWNrYWdlQWR2aXNvcmllcykgewppZiAoaXNzZXQoJHBhY2thZ2VDb25zdHJhaW50TWFwWyRwYWNrYWdlTmFtZV0pKSB7CiRhZHZpc29yaWVzWyRwYWNrYWdlTmFtZV0gPSBhcnJheV92YWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21hcChmdW5jdGlvbiAoYXJyYXkgJGRhdGEpIHVzZSAoJHBhY2thZ2VOYW1lLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcywgJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkcGFyc2VyKSB7CiRhZHZpc29yeSA9IFBhcnRpYWxTZWN1cml0eUFkdmlzb3J5OjpjcmVhdGUoJHBhY2thZ2VOYW1lLCAkZGF0YSwgJHBhcnNlcik7CmlmICghJGFsbG93UGFydGlhbEFkdmlzb3JpZXMgJiYgISRhZHZpc29yeSBpbnN0YW5jZW9mIFNlY3VyaXR5QWR2aXNvcnkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBZHZpc29yeSBmb3IgJy4kcGFja2FnZU5hbWUuJyBjb3VsZCBub3QgYmUgbG9hZGVkIGFzIGEgZnVsbCBhZHZpc29yeSBmcm9tICcuJHRoaXMtPmdldFJlcG9OYW1lKCkgLiBQSFBfRU9MIC4gdmFyX2V4cG9ydCgkZGF0YSwgdHJ1ZSkpOwp9CgppZiAoISRhZHZpc29yeS0+YWZmZWN0ZWRWZXJzaW9ucy0+bWF0Y2hlcygkcGFja2FnZUNvbnN0cmFpbnRNYXBbJHBhY2thZ2VOYW1lXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkYWR2aXNvcnk7Cn0sICRwYWNrYWdlQWR2aXNvcmllcykpKTsKfQp9CgpyZXR1cm4gWydhZHZpc29yaWVzJyA9PiBhcnJheV9maWx0ZXIoJGFkdmlzb3JpZXMsIHN0YXRpYyBmdW5jdGlvbiAoJGFkdik6IGJvb2wgeyByZXR1cm4gXGNvdW50KCRhZHYpID4gMDsgfSksICduYW1lc0ZvdW5kJyA9PiBhcnJheV9rZXlzKCRhZHZpc29yaWVzKV07Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcQXJyYXlMb2FkZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvbkd1ZXNzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cVmVyc2lvblBhcnNlcjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBQYXRoUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZVJlcG9zaXRvcnlJbnRlcmZhY2UKewoKCgpwcml2YXRlICRsb2FkZXI7CgoKCgpwcml2YXRlICR2ZXJzaW9uR3Vlc3NlcjsKCgoKCnByaXZhdGUgJHVybDsKCgoKCgpwcml2YXRlICRyZXBvQ29uZmlnOwoKCgoKcHJpdmF0ZSAkcHJvY2VzczsKCgoKCnByaXZhdGUgJG9wdGlvbnM7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVwb0NvbmZpZywgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwsID9FdmVudERpc3BhdGNoZXIgJGRpc3BhdGNoZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCkKewppZiAoIWlzc2V0KCRyZXBvQ29uZmlnWyd1cmwnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdZb3UgbXVzdCBzcGVjaWZ5IHRoZSBgdXJsYCBjb25maWd1cmF0aW9uIGZvciB0aGUgcGF0aCByZXBvc2l0b3J5Jyk7Cn0KCiR0aGlzLT5sb2FkZXIgPSBuZXcgQXJyYXlMb2FkZXIobnVsbCwgdHJ1ZSk7CiR0aGlzLT51cmwgPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzID8/IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJHRoaXMtPnZlcnNpb25HdWVzc2VyID0gbmV3IFZlcnNpb25HdWVzc2VyKCRjb25maWcsICR0aGlzLT5wcm9jZXNzLCBuZXcgVmVyc2lvblBhcnNlcigpLCAkaW8pOwokdGhpcy0+cmVwb0NvbmZpZyA9ICRyZXBvQ29uZmlnOwokdGhpcy0+b3B0aW9ucyA9ICRyZXBvQ29uZmlnWydvcHRpb25zJ10gPz8gW107CmlmICghaXNzZXQoJHRoaXMtPm9wdGlvbnNbJ3JlbGF0aXZlJ10pKSB7CiRmaWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oKTsKJHRoaXMtPm9wdGlvbnNbJ3JlbGF0aXZlJ10gPSAhJGZpbGVzeXN0ZW0tPmlzQWJzb2x1dGVQYXRoKCR0aGlzLT51cmwpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvTmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJ3BhdGggcmVwbyAoJy5Vcmw6OnNhbml0aXplKCR0aGlzLT5yZXBvQ29uZmlnWyd1cmwnXSkuJyknOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0NvbmZpZygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cmVwb0NvbmZpZzsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKcGFyZW50Ojppbml0aWFsaXplKCk7CgokdXJsTWF0Y2hlcyA9ICR0aGlzLT5nZXRVcmxNYXRjaGVzKCk7CgppZiAoZW1wdHkoJHVybE1hdGNoZXMpKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Wyp7fV19JywgJHRoaXMtPnVybCkpIHsKJHVybCA9ICR0aGlzLT51cmw7CndoaWxlIChQcmVnOjppc01hdGNoKCd7Wyp7fV19JywgJHVybCkpIHsKJHVybCA9IGRpcm5hbWUoJHVybCk7Cn0KCmlmIChpc19kaXIoJHVybCkpIHsKcmV0dXJuOwp9Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlIGB1cmxgIHN1cHBsaWVkIGZvciB0aGUgcGF0aCAoJyAuICR0aGlzLT51cmwgLiAnKSByZXBvc2l0b3J5IGRvZXMgbm90IGV4aXN0Jyk7Cn0KCmZvcmVhY2ggKCR1cmxNYXRjaGVzIGFzICR1cmwpIHsKJHBhdGggPSByZWFscGF0aCgkdXJsKSAuIERJUkVDVE9SWV9TRVBBUkFUT1I7CiRjb21wb3NlckZpbGVQYXRoID0gJHBhdGguJ2NvbXBvc2VyLmpzb24nOwoKaWYgKCFmaWxlX2V4aXN0cygkY29tcG9zZXJGaWxlUGF0aCkpIHsKY29udGludWU7Cn0KCiRqc29uID0gZmlsZV9nZXRfY29udGVudHMoJGNvbXBvc2VyRmlsZVBhdGgpOwokcGFja2FnZSA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGpzb24sICRjb21wb3NlckZpbGVQYXRoKTsKJHBhY2thZ2VbJ2Rpc3QnXSA9IFsKJ3R5cGUnID0+ICdwYXRoJywKJ3VybCcgPT4gJHVybCwKXTsKJHJlZmVyZW5jZSA9ICR0aGlzLT5vcHRpb25zWydyZWZlcmVuY2UnXSA/PyAnYXV0byc7CmlmICgnbm9uZScgPT09ICRyZWZlcmVuY2UpIHsKJHBhY2thZ2VbJ2Rpc3QnXVsncmVmZXJlbmNlJ10gPSBudWxsOwp9IGVsc2VpZiAoJ2NvbmZpZycgPT09ICRyZWZlcmVuY2UgfHwgJ2F1dG8nID09PSAkcmVmZXJlbmNlKSB7CiRwYWNrYWdlWydkaXN0J11bJ3JlZmVyZW5jZSddID0gaGFzaCgnc2hhMScsICRqc29uIC4gc2VyaWFsaXplKCR0aGlzLT5vcHRpb25zKSk7Cn0KCgokcGFja2FnZVsndHJhbnNwb3J0LW9wdGlvbnMnXSA9IGFycmF5X2ludGVyc2VjdF9rZXkoJHRoaXMtPm9wdGlvbnMsIFsnc3ltbGluaycgPT4gdHJ1ZSwgJ3JlbGF0aXZlJyA9PiB0cnVlXSk7CgppZiAoaXNzZXQoJHBhY2thZ2VbJ25hbWUnXSwgJHRoaXMtPm9wdGlvbnNbJ3ZlcnNpb25zJ11bJHBhY2thZ2VbJ25hbWUnXV0pKSB7CiRwYWNrYWdlWyd2ZXJzaW9uJ10gPSAkdGhpcy0+b3B0aW9uc1sndmVyc2lvbnMnXVskcGFja2FnZVsnbmFtZSddXTsKfQoKCmlmICghaXNzZXQoJHBhY2thZ2VbJ3ZlcnNpb24nXSkgJiYgKCRyb290VmVyc2lvbiA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX1JPT1RfVkVSU0lPTicpKSkgewppZiAoCjAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Jldi1wYXJzZScsICdIRUFEJ10sICRyZWYxLCAkcGF0aCkKJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAncmV2LXBhcnNlJywgJ0hFQUQnXSwgJHJlZjIpCiYmICRyZWYxID09PSAkcmVmMgopIHsKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICR0aGlzLT52ZXJzaW9uR3Vlc3Nlci0+Z2V0Um9vdFZlcnNpb25Gcm9tRW52KCk7Cn0KfQoKJG91dHB1dCA9ICcnOwokY29tbWFuZCA9IEdpdFV0aWw6OmJ1aWxkUmV2TGlzdENvbW1hbmQoJHRoaXMtPnByb2Nlc3MsIGFycmF5X21lcmdlKFsnLW4xJywgJy0tZm9ybWF0PSVIJywgJ0hFQUQnXSwgR2l0VXRpbDo6Z2V0Tm9TaG93U2lnbmF0dXJlRmxhZ3MoJHRoaXMtPnByb2Nlc3MpKSk7CmlmICgnYXV0bycgPT09ICRyZWZlcmVuY2UgJiYgaXNfZGlyKCRwYXRoIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICcuZ2l0JykgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRvdXRwdXQsICRwYXRoKSkgewokcGFja2FnZVsnZGlzdCddWydyZWZlcmVuY2UnXSA9IHRyaW0oR2l0VXRpbDo6cGFyc2VSZXZMaXN0T3V0cHV0KCRvdXRwdXQsICR0aGlzLT5wcm9jZXNzKSk7Cn0KCmlmICghaXNzZXQoJHBhY2thZ2VbJ3ZlcnNpb24nXSkpIHsKJHZlcnNpb25EYXRhID0gJHRoaXMtPnZlcnNpb25HdWVzc2VyLT5ndWVzc1ZlcnNpb24oJHBhY2thZ2UsICRwYXRoKTsKaWYgKGlzX2FycmF5KCR2ZXJzaW9uRGF0YSkgJiYgJHZlcnNpb25EYXRhWydwcmV0dHlfdmVyc2lvbiddKSB7CgppZiAoIWVtcHR5KCR2ZXJzaW9uRGF0YVsnZmVhdHVyZV9wcmV0dHlfdmVyc2lvbiddKSkgewokcGFja2FnZVsndmVyc2lvbiddID0gJHZlcnNpb25EYXRhWydmZWF0dXJlX3ByZXR0eV92ZXJzaW9uJ107CiR0aGlzLT5hZGRQYWNrYWdlKCR0aGlzLT5sb2FkZXItPmxvYWQoJHBhY2thZ2UpKTsKfQoKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICR2ZXJzaW9uRGF0YVsncHJldHR5X3ZlcnNpb24nXTsKfSBlbHNlIHsKJHBhY2thZ2VbJ3ZlcnNpb24nXSA9ICdkZXYtbWFpbic7Cn0KfQoKdHJ5IHsKJHRoaXMtPmFkZFBhY2thZ2UoJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZSkpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIGxvYWRpbmcgdGhlIHBhY2thZ2UgaW4gJy4kY29tcG9zZXJGaWxlUGF0aCwgMCwgJGUpOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFVybE1hdGNoZXMoKTogYXJyYXkKewokZmxhZ3MgPSBHTE9CX01BUksgfCBHTE9CX09OTFlESVI7CgppZiAoZGVmaW5lZCgnR0xPQl9CUkFDRScpKSB7CiRmbGFncyB8PSBHTE9CX0JSQUNFOwp9IGVsc2VpZiAoc3RycG9zKCR0aGlzLT51cmwsICd7JykgIT09IGZhbHNlIHx8IHN0cnBvcygkdGhpcy0+dXJsLCAnfScpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgR0xPQl9CUkFDRSB3aGljaCBpcyByZXF1aXJlZCBmb3IgdGhlIHVybCAnLiAkdGhpcy0+dXJsKTsKfQoKCnJldHVybiBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKTogc3RyaW5nIHsKcmV0dXJuIHJ0cmltKHN0cl9yZXBsYWNlKERJUkVDVE9SWV9TRVBBUkFUT1IsICcvJywgJHZhbCksICcvJyk7Cn0sIGdsb2IoJHRoaXMtPnVybCwgJGZsYWdzKSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKCgoKCgoKY2xhc3MgUGVhclJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgUEVBUiByZXBvc2l0b3J5IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBDb21wb3NlciAyLngnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZVBhY2thZ2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTGluazsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcVmVyc2lvblxWZXJzaW9uUGFyc2VyOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cSGh2bURldGVjdG9yOwp1c2UgQ29tcG9zZXJcUGxhdGZvcm1cUnVudGltZTsKdXNlIENvbXBvc2VyXFBsYXRmb3JtXFZlcnNpb247CnVzZSBDb21wb3NlclxQbHVnaW5cUGx1Z2luSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFV0aWxcU2lsZW5jZXI7CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CgoKCgpjbGFzcyBQbGF0Zm9ybVJlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkKewoKCgoKcHVibGljIGNvbnN0IFBMQVRGT1JNX1BBQ0tBR0VfUkVHRVggPSAne14oPzpwaHAoPzotNjRiaXR8LWlwdjZ8LXp0c3wtZGVidWcpP3xoaHZtfCg/OmV4dHxsaWIpLVthLXowLTldKD86W18uLV0/W2EtejAtOV0rKSp8Y29tcG9zZXIoPzotKD86cGx1Z2lufHJ1bnRpbWUpLWFwaSk/KSR9aUQnOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGxhc3RTZWVuUGxhdGZvcm1QaHAgPSBudWxsOwoKCgoKcHJpdmF0ZSAkdmVyc2lvblBhcnNlcjsKCgoKCgoKCgpwcml2YXRlICRvdmVycmlkZXMgPSBbXTsKCgoKCgoKcHJpdmF0ZSAkZGlzYWJsZWRQYWNrYWdlcyA9IFtdOwoKCnByaXZhdGUgJHJ1bnRpbWU7Cgpwcml2YXRlICRoaHZtRGV0ZWN0b3I7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhY2thZ2VzID0gW10sIGFycmF5ICRvdmVycmlkZXMgPSBbXSwgP1J1bnRpbWUgJHJ1bnRpbWUgPSBudWxsLCA/SGh2bURldGVjdG9yICRoaHZtRGV0ZWN0b3IgPSBudWxsKQp7CiR0aGlzLT5ydW50aW1lID0gJHJ1bnRpbWUgPzogbmV3IFJ1bnRpbWUoKTsKJHRoaXMtPmhodm1EZXRlY3RvciA9ICRoaHZtRGV0ZWN0b3IgPzogbmV3IEhodm1EZXRlY3RvcigpOwpmb3JlYWNoICgkb3ZlcnJpZGVzIGFzICRuYW1lID0+ICR2ZXJzaW9uKSB7CmlmICghaXNfc3RyaW5nKCR2ZXJzaW9uKSAmJiBmYWxzZSAhPT0gJHZlcnNpb24pIHsgCnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdjb25maWcucGxhdGZvcm0uJy4kbmFtZS4nIHNob3VsZCBiZSBhIHN0cmluZyBvciBmYWxzZSwgYnV0IGdvdCAnLmdldF9kZWJ1Z190eXBlKCR2ZXJzaW9uKS4nICcudmFyX2V4cG9ydCgkdmVyc2lvbiwgdHJ1ZSkpOwp9CmlmICgkbmFtZSA9PT0gJ3BocCcgJiYgJHZlcnNpb24gPT09IGZhbHNlKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdjb25maWcucGxhdGZvcm0uJy4kbmFtZS4nIGNhbm5vdCBiZSBzZXQgdG8gZmFsc2UgYXMgeW91IGNhbm5vdCBkaXNhYmxlIHBocCBlbnRpcmVseS4nKTsKfQokdGhpcy0+b3ZlcnJpZGVzW3N0cnRvbG93ZXIoJG5hbWUpXSA9IFsnbmFtZScgPT4gJG5hbWUsICd2ZXJzaW9uJyA9PiAkdmVyc2lvbl07Cn0KcGFyZW50OjpfX2NvbnN0cnVjdCgkcGFja2FnZXMpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdwbGF0Zm9ybSByZXBvJzsKfQoKcHVibGljIGZ1bmN0aW9uIGlzUGxhdGZvcm1QYWNrYWdlRGlzYWJsZWQoc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiBpc3NldCgkdGhpcy0+ZGlzYWJsZWRQYWNrYWdlc1skbmFtZV0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzYWJsZWRQYWNrYWdlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZWRQYWNrYWdlczsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CnBhcmVudDo6aW5pdGlhbGl6ZSgpOwoKJGxpYnJhcmllcyA9IFtdOwoKJHRoaXMtPnZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwoKCgpmb3JlYWNoICgkdGhpcy0+b3ZlcnJpZGVzIGFzICRvdmVycmlkZSkgewoKaWYgKCFzZWxmOjppc1BsYXRmb3JtUGFja2FnZSgkb3ZlcnJpZGVbJ25hbWUnXSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgcGxhdGZvcm0gcGFja2FnZSBuYW1lIGluIGNvbmZpZy5wbGF0Zm9ybTogJy4kb3ZlcnJpZGVbJ25hbWUnXSk7Cn0KCmlmICgkb3ZlcnJpZGVbJ3ZlcnNpb24nXSAhPT0gZmFsc2UpIHsKJHRoaXMtPmFkZE92ZXJyaWRkZW5QYWNrYWdlKCRvdmVycmlkZSk7Cn0KfQoKJHByZXR0eVZlcnNpb24gPSBDb21wb3Nlcjo6Z2V0VmVyc2lvbigpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXIgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdjb21wb3NlcicsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRjb21wb3Nlci0+c2V0RGVzY3JpcHRpb24oJ0NvbXBvc2VyIHBhY2thZ2UnKTsKJHRoaXMtPmFkZFBhY2thZ2UoJGNvbXBvc2VyKTsKCiRwcmV0dHlWZXJzaW9uID0gUGx1Z2luSW50ZXJmYWNlOjpQTFVHSU5fQVBJX1ZFUlNJT047CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkcHJldHR5VmVyc2lvbik7CiRjb21wb3NlclBsdWdpbkFwaSA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ2NvbXBvc2VyLXBsdWdpbi1hcGknLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokY29tcG9zZXJQbHVnaW5BcGktPnNldERlc2NyaXB0aW9uKCdUaGUgQ29tcG9zZXIgUGx1Z2luIEFQSScpOwokdGhpcy0+YWRkUGFja2FnZSgkY29tcG9zZXJQbHVnaW5BcGkpOwoKJHByZXR0eVZlcnNpb24gPSBDb21wb3Nlcjo6UlVOVElNRV9BUElfVkVSU0lPTjsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyUnVudGltZUFwaSA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ2NvbXBvc2VyLXJ1bnRpbWUtYXBpJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGNvbXBvc2VyUnVudGltZUFwaS0+c2V0RGVzY3JpcHRpb24oJ1RoZSBDb21wb3NlciBSdW50aW1lIEFQSScpOwokdGhpcy0+YWRkUGFja2FnZSgkY29tcG9zZXJSdW50aW1lQXBpKTsKCnRyeSB7CiRwcmV0dHlWZXJzaW9uID0gJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQSFBfVkVSU0lPTicpOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRwcmV0dHlWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgnI14oW15+Ky1dKykuKiQjJywgJyQxJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQSFBfVkVSU0lPTicpKTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfQoKJHBocCA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ3BocCcsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHAtPnNldERlc2NyaXB0aW9uKCdUaGUgUEhQIGludGVycHJldGVyJyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwaHApOwoKaWYgKCR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnUEhQX0RFQlVHJykpIHsKJHBocGRlYnVnID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLWRlYnVnJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJHBocGRlYnVnLT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgd2l0aCBkZWJ1Z2dpbmcgc3ltYm9scycpOwokdGhpcy0+YWRkUGFja2FnZSgkcGhwZGVidWcpOwp9CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdQSFBfWlRTJykgJiYgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQSFBfWlRTJykpIHsKJHBocHp0cyA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ3BocC16dHMnLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokcGhwenRzLT5zZXREZXNjcmlwdGlvbignVGhlIFBIUCBpbnRlcnByZXRlciwgd2l0aCBaZW5kIFRocmVhZCBTYWZldHknKTsKJHRoaXMtPmFkZFBhY2thZ2UoJHBocHp0cyk7Cn0KCmlmICgkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1BIUF9JTlRfU0laRScpID09PSA4KSB7CiRwaHA2NCA9IG5ldyBDb21wbGV0ZVBhY2thZ2UoJ3BocC02NGJpdCcsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRwaHA2NC0+c2V0RGVzY3JpcHRpb24oJ1RoZSBQSFAgaW50ZXJwcmV0ZXIsIDY0Yml0Jyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwaHA2NCk7Cn0KCgoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDb25zdGFudCgnQUZfSU5FVDYnKSB8fCBTaWxlbmNlcjo6Y2FsbChbJHRoaXMtPnJ1bnRpbWUsICdpbnZva2UnXSwgJ2luZXRfcHRvbicsIFsnOjonXSkgIT09IGZhbHNlKSB7CiRwaHBJcHY2ID0gbmV3IENvbXBsZXRlUGFja2FnZSgncGhwLWlwdjYnLCAkdmVyc2lvbiwgJHByZXR0eVZlcnNpb24pOwokcGhwSXB2Ni0+c2V0RGVzY3JpcHRpb24oJ1RoZSBQSFAgaW50ZXJwcmV0ZXIsIHdpdGggSVB2NiBzdXBwb3J0Jyk7CiR0aGlzLT5hZGRQYWNrYWdlKCRwaHBJcHY2KTsKfQoKJGxvYWRlZEV4dGVuc2lvbnMgPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9ucygpOwoKCmZvcmVhY2ggKCRsb2FkZWRFeHRlbnNpb25zIGFzICRuYW1lKSB7CmlmIChpbl9hcnJheSgkbmFtZSwgWydzdGFuZGFyZCcsICdDb3JlJ10pKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXh0ZW5zaW9uKCRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uVmVyc2lvbigkbmFtZSkpOwp9CgoKaWYgKCFpbl9hcnJheSgneGRlYnVnJywgJGxvYWRlZEV4dGVuc2lvbnMsIHRydWUpICYmICgkcHJldHR5VmVyc2lvbiA9IFhkZWJ1Z0hhbmRsZXI6OmdldFNraXBwZWRWZXJzaW9uKCkpKSB7CiR0aGlzLT5hZGRFeHRlbnNpb24oJ3hkZWJ1ZycsICRwcmV0dHlWZXJzaW9uKTsKfQoKCgoKZm9yZWFjaCAoJGxvYWRlZEV4dGVuc2lvbnMgYXMgJG5hbWUpIHsKc3dpdGNoICgkbmFtZSkgewpjYXNlICdhbXFwJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlicmFiYml0bXEgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYnJhYmJpdG1xTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJyYWJiaXRtcScsICRsaWJyYWJiaXRtcU1hdGNoZXNbJ3ZlcnNpb24nXSwgJ0FNUVAgbGlicmFiYml0bXEgdmVyc2lvbicpOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eQU1RUCBwcm90b2NvbCB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkcHJvdG9jb2xNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLXByb3RvY29sJywgc3RyX3JlcGxhY2UoJy0nLCAnLicsICRwcm90b2NvbE1hdGNoZXNbJ3ZlcnNpb24nXSksICdBTVFQIHByb3RvY29sIHZlcnNpb24nKTsKfQpicmVhazsKCmNhc2UgJ2J6Mic6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXkJaaXAyIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKiksL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJG1hdGNoZXNbJ3ZlcnNpb24nXSk7Cn0KYnJlYWs7CgpjYXNlICdjdXJsJzoKJGN1cmxWZXJzaW9uID0gJHRoaXMtPnJ1bnRpbWUtPmludm9rZSgnY3VybF92ZXJzaW9uJyk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkY3VybFZlcnNpb25bJ3ZlcnNpb24nXSk7CgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15TU0wgVmVyc2lvbiA9PiAoPzxsaWJyYXJ5PlteL10rKS8oPzx2ZXJzaW9uPi4rKSR9aW0nLCAkaW5mbywgJHNzbE1hdGNoZXMpKSB7CiRsaWJyYXJ5ID0gc3RydG9sb3dlcigkc3NsTWF0Y2hlc1snbGlicmFyeSddKTsKaWYgKCRsaWJyYXJ5ID09PSAnb3BlbnNzbCcpIHsKJHBhcnNlZFZlcnNpb24gPSBWZXJzaW9uOjpwYXJzZU9wZW5zc2woJHNzbE1hdGNoZXNbJ3ZlcnNpb24nXSwgJGlzRmlwcyk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictb3BlbnNzbCcuKCRpc0ZpcHMgPyAnLWZpcHMnIDogJycpLCAkcGFyc2VkVmVyc2lvbiwgJ2N1cmwgT3BlblNTTCB2ZXJzaW9uICgnLiRwYXJzZWRWZXJzaW9uLicpJywgW10sICRpc0ZpcHMgPyBbJ2N1cmwtb3BlbnNzbCddIDogW10pOwp9IGVsc2UgewppZiAoc3RyX3N0YXJ0c193aXRoKCRsaWJyYXJ5LCAnKHNlY3VyZXRyYW5zcG9ydCknKSAmJiBQcmVnOjppc01hdGNoKCd7Xlwoc2VjdXJldHJhbnNwb3J0XCkgKFthLXowLTldKyl9JywgJGxpYnJhcnksICRzZWN1cmV0cmFuc3BvcnRNYXRjaGVzKSkgewokc2hvcnRsaWIgPSAnc2VjdXJldHJhbnNwb3J0JzsKJHNzbExpYiA9ICdjdXJsLScuJHNlY3VyZXRyYW5zcG9ydE1hdGNoZXNbMV07Cn0gZWxzZSB7CiRzaG9ydGxpYiA9ICRsaWJyYXJ5Owokc3NsTGliID0gJ2N1cmwtb3BlbnNzbCc7Cn0KJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy0nLiRzaG9ydGxpYiwgJHNzbE1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2N1cmwgJy4kbGlicmFyeS4nIHZlcnNpb24gKCcuJHNzbE1hdGNoZXNbJ3ZlcnNpb24nXS4nKScsIFskc3NsTGliXSk7Cn0KfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XmxpYlNTSCBWZXJzaW9uID0+ICg/PGxpYnJhcnk+W14vXSspLyg/PHZlcnNpb24+Lis/KSg/Oi8uKik/JH1pbScsICRpbmZvLCAkc3NoTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy0nLnN0cnRvbG93ZXIoJHNzaE1hdGNoZXNbJ2xpYnJhcnknXSksICRzc2hNYXRjaGVzWyd2ZXJzaW9uJ10sICdjdXJsICcuJHNzaE1hdGNoZXNbJ2xpYnJhcnknXS4nIHZlcnNpb24nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlpMaWIgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSR9aW0nLCAkaW5mbywgJHpsaWJNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLXpsaWInLCAkemxpYk1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2N1cmwgemxpYiB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdkYXRlJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9edGltZWxpYiB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkdGltZWxpYk1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictdGltZWxpYicsICR0aW1lbGliTWF0Y2hlc1sndmVyc2lvbiddLCAnZGF0ZSB0aW1lbGliIHZlcnNpb24nKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlRpbWV6b25lIERhdGFiYXNlID0+ICg/PHNvdXJjZT5pbnRlcm5hbHxleHRlcm5hbCkkL2ltJywgJGluZm8sICR6b25laW5mb1NvdXJjZU1hdGNoZXMpKSB7CiRleHRlcm5hbCA9ICR6b25laW5mb1NvdXJjZU1hdGNoZXNbJ3NvdXJjZSddID09PSAnZXh0ZXJuYWwnOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14iT2xzb24iIFRpbWV6b25lIERhdGFiYXNlIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKz8pKD86XC5zeXN0ZW0pPyQvaW0nLCAkaW5mbywgJHpvbmVpbmZvTWF0Y2hlcykpIHsKCmlmICgkZXh0ZXJuYWwgJiYgaW5fYXJyYXkoJ3RpbWV6b25lZGInLCAkbG9hZGVkRXh0ZW5zaW9ucywgdHJ1ZSkpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ3RpbWV6b25lZGItem9uZWluZm8nLCAkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGRhdGUgKHJlcGxhY2VkIGJ5IHRpbWV6b25lZGIpJywgWyRuYW1lLictem9uZWluZm8nXSk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictem9uZWluZm8nLCAkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGRhdGUnKTsKfQp9Cn0KYnJlYWs7CgpjYXNlICdmaWxlaW5mbyc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYm1hZ2ljID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkbWFnaWNNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYm1hZ2ljJywgJG1hZ2ljTWF0Y2hlc1sndmVyc2lvbiddLCAnZmlsZWluZm8gbGlibWFnaWMgdmVyc2lvbicpOwp9CmJyZWFrOwoKY2FzZSAnZ2QnOgokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdHRF9WRVJTSU9OJykpOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJKUEVHIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKz8pKD86IGNvbXBhdGlibGUpPyQvaW0nLCAkaW5mbywgJGxpYmpwZWdNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYmpwZWcnLCBWZXJzaW9uOjpwYXJzZUxpYmpwZWcoJGxpYmpwZWdNYXRjaGVzWyd2ZXJzaW9uJ10pLCAnbGlianBlZyB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15saWJQTkcgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYnBuZ01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlicG5nJywgJGxpYnBuZ01hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYnBuZyB2ZXJzaW9uIGZvciBnZCcpOwp9CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL15GcmVlVHlwZSBWZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkZnJlZXR5cGVNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWZyZWV0eXBlJywgJGZyZWV0eXBlTWF0Y2hlc1sndmVyc2lvbiddLCAnZnJlZXR5cGUgdmVyc2lvbiBmb3IgZ2QnKTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGliWHBtIFZlcnNpb24gPT4gKD88dmVyc2lvbklkPlxkKykkL2ltJywgJGluZm8sICRsaWJ4cG1NYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnhwbScsIFZlcnNpb246OmNvbnZlcnRMaWJ4cG1WZXJzaW9uSWQoKGludCkgJGxpYnhwbU1hdGNoZXNbJ3ZlcnNpb25JZCddKSwgJ2xpYnhwbSB2ZXJzaW9uIGZvciBnZCcpOwp9CgpicmVhazsKCmNhc2UgJ2dtcCc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0dNUF9WRVJTSU9OJykpOwpicmVhazsKCmNhc2UgJ2ljb252JzoKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnSUNPTlZfVkVSU0lPTicpKTsKYnJlYWs7CgpjYXNlICdpbnRsJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgokZGVzY3JpcHRpb24gPSAnVGhlIElDVSB1bmljb2RlIGFuZCBnbG9iYWxpemF0aW9uIHN1cHBvcnQgbGlicmFyeSc7CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdJTlRMX0lDVV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2ljdScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnSU5UTF9JQ1VfVkVSU0lPTicpLCAkZGVzY3JpcHRpb24pOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgnL15JQ1UgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdpY3UnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAkZGVzY3JpcHRpb24pOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eSUNVIFRaRGF0YSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LiopJC9pbScsICRpbmZvLCAkem9uZWluZm9NYXRjaGVzKSAmJiBudWxsICE9PSAoJHZlcnNpb24gPSBWZXJzaW9uOjpwYXJzZVpvbmVpbmZvVmVyc2lvbigkem9uZWluZm9NYXRjaGVzWyd2ZXJzaW9uJ10pKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1LXpvbmVpbmZvJywgJHZlcnNpb24sICd6b25laW5mbyAoIk9sc29uIikgZGF0YWJhc2UgZm9yIGljdScpOwp9CgoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDbGFzcygnUmVzb3VyY2VCdW5kbGUnKSkgewokcmVzb3VyY2VCdW5kbGUgPSAkdGhpcy0+cnVudGltZS0+aW52b2tlKFsnUmVzb3VyY2VCdW5kbGUnLCAnY3JlYXRlJ10sIFsncm9vdCcsICdJQ1VEQVRBJywgZmFsc2VdKTsKaWYgKCRyZXNvdXJjZUJ1bmRsZSAhPT0gbnVsbCkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1LWNsZHInLCAkcmVzb3VyY2VCdW5kbGUtPmdldCgnVmVyc2lvbicpLCAnSUNVIENMRFIgcHJvamVjdCB2ZXJzaW9uJyk7Cn0KfQoKaWYgKCR0aGlzLT5ydW50aW1lLT5oYXNDbGFzcygnSW50bENoYXInKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAnaWN1LXVuaWNvZGUnLCBpbXBsb2RlKCcuJywgYXJyYXlfc2xpY2UoJHRoaXMtPnJ1bnRpbWUtPmludm9rZShbJ0ludGxDaGFyJywgJ2dldFVuaWNvZGVWZXJzaW9uJ10pLCAwLCAzKSksICdJQ1UgdW5pY29kZSB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdpbWFnaWNrJzoKCiRpbWFnZU1hZ2lja1ZlcnNpb24gPSAkdGhpcy0+cnVudGltZS0+Y29uc3RydWN0KCdJbWFnaWNrJyktPmdldFZlcnNpb24oKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15JbWFnZU1hZ2ljayAoPzx2ZXJzaW9uPltcZC5dKykoPzotKD88cGF0Y2g+XGQrKSk/LycsICRpbWFnZU1hZ2lja1ZlcnNpb25bJ3ZlcnNpb25TdHJpbmcnXSwgJG1hdGNoZXMpKSB7CiR2ZXJzaW9uID0gJG1hdGNoZXNbJ3ZlcnNpb24nXTsKaWYgKGlzc2V0KCRtYXRjaGVzWydwYXRjaCddKSkgewokdmVyc2lvbiAuPSAnLicuJG1hdGNoZXNbJ3BhdGNoJ107Cn0KCiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictaW1hZ2VtYWdpY2snLCAkdmVyc2lvbiwgbnVsbCwgWydpbWFnaWNrJ10pOwp9CmJyZWFrOwoKY2FzZSAnbGRhcCc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eVmVuZG9yIFZlcnNpb24gPT4gKD88dmVyc2lvbklkPlxkKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcvXlZlbmRvciBOYW1lID0+ICg/PHZlbmRvcj4uKykkL2ltJywgJGluZm8sICR2ZW5kb3JNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLScuc3RydG9sb3dlcigkdmVuZG9yTWF0Y2hlc1sndmVuZG9yJ10pLCBWZXJzaW9uOjpjb252ZXJ0T3BlbmxkYXBWZXJzaW9uSWQoKGludCkgJG1hdGNoZXNbJ3ZlcnNpb25JZCddKSwgJHZlbmRvck1hdGNoZXNbJ3ZlbmRvciddLicgdmVyc2lvbiBvZiBsZGFwJyk7Cn0KYnJlYWs7CgpjYXNlICdsaWJ4bWwnOgoKJGxpYnhtbFByb3ZpZGVzID0gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJGV4dGVuc2lvbik6IHN0cmluZyB7CnJldHVybiAkZXh0ZW5zaW9uIC4gJy1saWJ4bWwnOwp9LCBhcnJheV9pbnRlcnNlY3QoJGxvYWRlZEV4dGVuc2lvbnMsIFsnZG9tJywgJ3NpbXBsZXhtbCcsICd4bWwnLCAneG1scmVhZGVyJywgJ3htbHdyaXRlciddKSk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ0xJQlhNTF9ET1RURURfVkVSU0lPTicpLCAnbGlieG1sIGxpYnJhcnkgdmVyc2lvbicsIFtdLCAkbGlieG1sUHJvdmlkZXMpOwoKYnJlYWs7CgpjYXNlICdtYnN0cmluZyc6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKCmlmIChQcmVnOjppc01hdGNoKCcvXmxpYm1iZmwgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYm1iZmxNYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYm1iZmwnLCAkbGlibWJmbE1hdGNoZXNbJ3ZlcnNpb24nXSwgJ21ic3RyaW5nIGxpYm1iZmwgdmVyc2lvbicpOwp9CgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdNQl9PTklHVVJVTUFfVkVSU0lPTicpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictb25pZ3VydW1hJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdNQl9PTklHVVJVTUFfVkVSU0lPTicpLCAnbWJzdHJpbmcgb25pZ3VydW1hIHZlcnNpb24nKTsKCgoKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJy9eKD86b25pZ3VydW1hfE11bHRpYnl0ZSByZWdleCBcKG9uaWd1cnVtYVwpKSB2ZXJzaW9uID0+ICg/PHZlcnNpb24+LispJC9pbScsICRpbmZvLCAkb25pZ3VydW1hTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1vbmlndXJ1bWEnLCAkb25pZ3VydW1hTWF0Y2hlc1sndmVyc2lvbiddLCAnbWJzdHJpbmcgb25pZ3VydW1hIHZlcnNpb24nKTsKfQoKYnJlYWs7CgpjYXNlICdtZW1jYWNoZWQnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJtZW1jYWNoZWQgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlibWVtY2FjaGVkJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYm1lbWNhY2hlZCB2ZXJzaW9uJyk7Cn0KYnJlYWs7CgpjYXNlICdvcGVuc3NsJzoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/Ok9wZW5TU0x8TGlicmVTU0wpP1xzKig/PHZlcnNpb24+XFMrKX1pJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdPUEVOU1NMX1ZFUlNJT05fVEVYVCcpLCAkbWF0Y2hlcykpIHsKJHBhcnNlZFZlcnNpb24gPSBWZXJzaW9uOjpwYXJzZU9wZW5zc2woJG1hdGNoZXNbJ3ZlcnNpb24nXSwgJGlzRmlwcyk7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLigkaXNGaXBzID8gJy1maXBzJyA6ICcnKSwgJHBhcnNlZFZlcnNpb24sICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnT1BFTlNTTF9WRVJTSU9OX1RFWFQnKSwgW10sICRpc0ZpcHMgPyBbJG5hbWVdIDogW10pOwp9CmJyZWFrOwoKY2FzZSAncGNyZSc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLCBQcmVnOjpyZXBsYWNlKCd7XihcUyspLip9JywgJyQxJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQQ1JFX1ZFUlNJT04nKSkpOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9eUENSRSBVbmljb2RlIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRwY3JlVW5pY29kZU1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictdW5pY29kZScsICRwY3JlVW5pY29kZU1hdGNoZXNbJ3ZlcnNpb24nXSwgJ1BDUkUgVW5pY29kZSB2ZXJzaW9uIHN1cHBvcnQnKTsKfQoKYnJlYWs7CgpjYXNlICdteXNxbG5kJzoKY2FzZSAncGRvX215c3FsJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnL14oPzpDbGllbnQgQVBJIHZlcnNpb258VmVyc2lvbikgPT4gbXlzcWxuZCAoPzx2ZXJzaW9uPi4rPykgL21pJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLW15c3FsbmQnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbXlzcWxuZCBsaWJyYXJ5IHZlcnNpb24gZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAnbW9uZ29kYic6CiRpbmZvID0gJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpOwoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGlibW9uZ29jIGJ1bmRsZWQgdmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJGxpYm1vbmdvY01hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlibW9uZ29jJywgJGxpYm1vbmdvY01hdGNoZXNbJ3ZlcnNpb24nXSwgJ2xpYm1vbmdvYyB2ZXJzaW9uIG9mIG1vbmdvZGInKTsKfQoKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJy9ebGliYnNvbiBidW5kbGVkIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRsaWJic29uTWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJic29uJywgJGxpYmJzb25NYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJic29uIHZlcnNpb24gb2YgbW9uZ29kYicpOwp9CmJyZWFrOwoKY2FzZSAncGdzcWwnOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdQR1NRTF9MSUJQUV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ3Bnc3FsLWxpYnBxJywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdQR1NRTF9MSUJQUV9WRVJTSU9OJyksICdsaWJwcSBmb3IgcGdzcWwnKTsKYnJlYWs7Cn0KCgpjYXNlICdwZG9fcGdzcWwnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCmlmIChQcmVnOjppc01hdGNoKCcvXlBvc3RncmVTUUxcKGxpYnBxXCkgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4qKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictbGlicHEnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbGlicHEgZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAncHEnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCRuYW1lKTsKCgoKaWYgKFByZWc6OmlzTWF0Y2goJy9ebGlicHEgPT4gKD88Y29tcGlsZWQ+LispID0+ICg/PGxpbmtlZD4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnBxJywgJG1hdGNoZXNbJ2xpbmtlZCddLCAnbGlicHEgZm9yICcuJG5hbWUpOwp9CmJyZWFrOwoKY2FzZSAncmRrYWZrYSc6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ1JEX0tBRktBX1ZFUlNJT04nKSkgewoKCgoKCgoKCgokbGliUmRLYWZrYVZlcnNpb25JbnQgPSAkdGhpcy0+cnVudGltZS0+Z2V0Q29uc3RhbnQoJ1JEX0tBRktBX1ZFUlNJT04nKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUuJy1saWJyZGthZmthJywgc3ByaW50ZignJWQuJWQuJWQnLCAoJGxpYlJkS2Fma2FWZXJzaW9uSW50ICYgMHg3RjAwMDAwMCkgPj4gMjQsICgkbGliUmRLYWZrYVZlcnNpb25JbnQgJiAweDAwRkYwMDAwKSA+PiAxNiwgKCRsaWJSZEthZmthVmVyc2lvbkludCAmIDB4MDAwMEZGMDApID4+IDgpLCAnbGlicmRrYWZrYSBmb3IgJy4kbmFtZSk7Cn0KYnJlYWs7CgpjYXNlICdsaWJzb2RpdW0nOgpjYXNlICdzb2RpdW0nOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdTT0RJVU1fTElCUkFSWV9WRVJTSU9OJykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2xpYnNvZGl1bScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnU09ESVVNX0xJQlJBUllfVkVSU0lPTicpKTsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJ2xpYnNvZGl1bScsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnU09ESVVNX0xJQlJBUllfVkVSU0lPTicpKTsKfQpicmVhazsKCmNhc2UgJ3NxbGl0ZTMnOgpjYXNlICdwZG9fc3FsaXRlJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15TUUxpdGUgTGlicmFyeSA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICRuYW1lLictc3FsaXRlJywgJG1hdGNoZXNbJ3ZlcnNpb24nXSk7Cn0KYnJlYWs7CgpjYXNlICdzc2gyJzoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygkbmFtZSk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15saWJzc2gyIHZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnNzaDInLCAkbWF0Y2hlc1sndmVyc2lvbiddKTsKfQpicmVhazsKCmNhc2UgJ3hzbCc6CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdsaWJ4c2x0JywgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdMSUJYU0xUX0RPVFRFRF9WRVJTSU9OJyksIG51bGwsIFsneHNsJ10pOwoKJGluZm8gPSAkdGhpcy0+cnVudGltZS0+Z2V0RXh0ZW5zaW9uSW5mbygneHNsJyk7CmlmIChQcmVnOjppc01hdGNoKCcvXmxpYnhzbHQgY29tcGlsZWQgYWdhaW5zdCBsaWJ4bWwgVmVyc2lvbiA9PiAoPzx2ZXJzaW9uPi4rKSQvaW0nLCAkaW5mbywgJG1hdGNoZXMpKSB7CiR0aGlzLT5hZGRMaWJyYXJ5KCRsaWJyYXJpZXMsICdsaWJ4c2x0LWxpYnhtbCcsICRtYXRjaGVzWyd2ZXJzaW9uJ10sICdsaWJ4bWwgdmVyc2lvbiBsaWJ4c2x0IGlzIGNvbXBpbGVkIGFnYWluc3QnKTsKfQpicmVhazsKCmNhc2UgJ3lhbWwnOgokaW5mbyA9ICR0aGlzLT5ydW50aW1lLT5nZXRFeHRlbnNpb25JbmZvKCd5YW1sJyk7CgppZiAoUHJlZzo6aXNNYXRjaCgnL15MaWJZQU1MIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJGluZm8sICRtYXRjaGVzKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnlhbWwnLCAkbWF0Y2hlc1sndmVyc2lvbiddLCAnbGlieWFtbCB2ZXJzaW9uIG9mIHlhbWwnKTsKfQpicmVhazsKCmNhc2UgJ3ppcCc6CmlmICgkdGhpcy0+cnVudGltZS0+aGFzQ29uc3RhbnQoJ0xJQlpJUF9WRVJTSU9OJywgJ1ppcEFyY2hpdmUnKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZS4nLWxpYnppcCcsICR0aGlzLT5ydW50aW1lLT5nZXRDb25zdGFudCgnTElCWklQX1ZFUlNJT04nLCAnWmlwQXJjaGl2ZScpLCBudWxsLCBbJ3ppcCddKTsKfQpicmVhazsKCmNhc2UgJ3psaWInOgppZiAoJHRoaXMtPnJ1bnRpbWUtPmhhc0NvbnN0YW50KCdaTElCX1ZFUlNJT04nKSkgewokdGhpcy0+YWRkTGlicmFyeSgkbGlicmFyaWVzLCAkbmFtZSwgJHRoaXMtPnJ1bnRpbWUtPmdldENvbnN0YW50KCdaTElCX1ZFUlNJT04nKSk7CgoKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJy9eTGlua2VkIFZlcnNpb24gPT4gKD88dmVyc2lvbj4uKykkL2ltJywgJHRoaXMtPnJ1bnRpbWUtPmdldEV4dGVuc2lvbkluZm8oJG5hbWUpLCAkbWF0Y2hlcykpIHsKJHRoaXMtPmFkZExpYnJhcnkoJGxpYnJhcmllcywgJG5hbWUsICRtYXRjaGVzWyd2ZXJzaW9uJ10pOwp9CmJyZWFrOwoKZGVmYXVsdDoKYnJlYWs7Cn0KfQoKJGhodm1WZXJzaW9uID0gJHRoaXMtPmhodm1EZXRlY3Rvci0+Z2V0VmVyc2lvbigpOwppZiAoJGhodm1WZXJzaW9uKSB7CnRyeSB7CiRwcmV0dHlWZXJzaW9uID0gJGhodm1WZXJzaW9uOwokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRwcmV0dHlWZXJzaW9uID0gUHJlZzo6cmVwbGFjZSgnI14oW15+Ky1dKykuKiQjJywgJyQxJywgJGhodm1WZXJzaW9uKTsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfQoKJGhodm0gPSBuZXcgQ29tcGxldGVQYWNrYWdlKCdoaHZtJywgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGhodm0tPnNldERlc2NyaXB0aW9uKCdUaGUgSEhWTSBSdW50aW1lICg2NGJpdCknKTsKJHRoaXMtPmFkZFBhY2thZ2UoJGhodm0pOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiB2b2lkCnsKaWYgKCEkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZSkgewp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRXhwZWN0ZWQgQ29tcGxldGVQYWNrYWdlIGJ1dCBnb3QgJy5nZXRfY2xhc3MoJHBhY2thZ2UpKTsKfQoKCmlmIChpc3NldCgkdGhpcy0+b3ZlcnJpZGVzWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewppZiAoJHRoaXMtPm92ZXJyaWRlc1skcGFja2FnZS0+Z2V0TmFtZSgpXVsndmVyc2lvbiddID09PSBmYWxzZSkgewokdGhpcy0+YWRkRGlzYWJsZWRQYWNrYWdlKCRwYWNrYWdlKTsKCnJldHVybjsKfQoKJG92ZXJyaWRlciA9ICR0aGlzLT5maW5kUGFja2FnZSgkcGFja2FnZS0+Z2V0TmFtZSgpLCAnKicpOwppZiAoJHBhY2thZ2UtPmdldFZlcnNpb24oKSA9PT0gJG92ZXJyaWRlci0+Z2V0VmVyc2lvbigpKSB7CiRhY3R1YWxUZXh0ID0gJ3NhbWUgYXMgYWN0dWFsJzsKfSBlbHNlIHsKJGFjdHVhbFRleHQgPSAnYWN0dWFsOiAnLiRwYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCk7Cn0KaWYgKCRvdmVycmlkZXIgaW5zdGFuY2VvZiBDb21wbGV0ZVBhY2thZ2VJbnRlcmZhY2UpIHsKJG92ZXJyaWRlci0+c2V0RGVzY3JpcHRpb24oJG92ZXJyaWRlci0+Z2V0RGVzY3JpcHRpb24oKS4nLCAnLiRhY3R1YWxUZXh0KTsKfQoKcmV0dXJuOwp9CgoKaWYgKGlzc2V0KCR0aGlzLT5vdmVycmlkZXNbJ3BocCddKSAmJiAwID09PSBzdHJwb3MoJHBhY2thZ2UtPmdldE5hbWUoKSwgJ3BocC0nKSkgewokb3ZlcnJpZGVyID0gJHRoaXMtPmFkZE92ZXJyaWRkZW5QYWNrYWdlKCR0aGlzLT5vdmVycmlkZXNbJ3BocCddLCAkcGFja2FnZS0+Z2V0UHJldHR5TmFtZSgpKTsKaWYgKCRwYWNrYWdlLT5nZXRWZXJzaW9uKCkgPT09ICRvdmVycmlkZXItPmdldFZlcnNpb24oKSkgewokYWN0dWFsVGV4dCA9ICdzYW1lIGFzIGFjdHVhbCc7Cn0gZWxzZSB7CiRhY3R1YWxUZXh0ID0gJ2FjdHVhbDogJy4kcGFja2FnZS0+Z2V0UHJldHR5VmVyc2lvbigpOwp9CiRvdmVycmlkZXItPnNldERlc2NyaXB0aW9uKCRvdmVycmlkZXItPmdldERlc2NyaXB0aW9uKCkuJywgJy4kYWN0dWFsVGV4dCk7CgpyZXR1cm47Cn0KCnBhcmVudDo6YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkT3ZlcnJpZGRlblBhY2thZ2UoYXJyYXkgJG92ZXJyaWRlLCA/c3RyaW5nICRuYW1lID0gbnVsbCk6IENvbXBsZXRlUGFja2FnZQp7CiR2ZXJzaW9uID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkb3ZlcnJpZGVbJ3ZlcnNpb24nXSk7CiRwYWNrYWdlID0gbmV3IENvbXBsZXRlUGFja2FnZSgkbmFtZSA/OiAkb3ZlcnJpZGVbJ25hbWUnXSwgJHZlcnNpb24sICRvdmVycmlkZVsndmVyc2lvbiddKTsKJHBhY2thZ2UtPnNldERlc2NyaXB0aW9uKCdQYWNrYWdlIG92ZXJyaWRkZW4gdmlhIGNvbmZpZy5wbGF0Zm9ybScpOwokcGFja2FnZS0+c2V0RXh0cmEoWydjb25maWcucGxhdGZvcm0nID0+IHRydWVdKTsKcGFyZW50OjphZGRQYWNrYWdlKCRwYWNrYWdlKTsKCmlmICgkcGFja2FnZS0+Z2V0TmFtZSgpID09PSAncGhwJykgewpzZWxmOjokbGFzdFNlZW5QbGF0Zm9ybVBocCA9IGltcGxvZGUoJy4nLCBhcnJheV9zbGljZShleHBsb2RlKCcuJywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSksIDAsIDMpKTsKfQoKcmV0dXJuICRwYWNrYWdlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGFkZERpc2FibGVkUGFja2FnZShDb21wbGV0ZVBhY2thZ2UgJHBhY2thZ2UpOiB2b2lkCnsKJHBhY2thZ2UtPnNldERlc2NyaXB0aW9uKCRwYWNrYWdlLT5nZXREZXNjcmlwdGlvbigpLicuIDx3YXJuaW5nPlBhY2thZ2UgZGlzYWJsZWQgdmlhIGNvbmZpZy5wbGF0Zm9ybTwvd2FybmluZz4nKTsKJHBhY2thZ2UtPnNldEV4dHJhKFsnY29uZmlnLnBsYXRmb3JtJyA9PiB0cnVlXSk7CgokdGhpcy0+ZGlzYWJsZWRQYWNrYWdlc1skcGFja2FnZS0+Z2V0TmFtZSgpXSA9ICRwYWNrYWdlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZEV4dGVuc2lvbihzdHJpbmcgJG5hbWUsIHN0cmluZyAkcHJldHR5VmVyc2lvbik6IHZvaWQKewokZXh0cmFEZXNjcmlwdGlvbiA9IG51bGw7Cgp0cnkgewokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9IGNhdGNoIChcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CiRleHRyYURlc2NyaXB0aW9uID0gJyAoYWN0dWFsIHZlcnNpb246ICcuJHByZXR0eVZlcnNpb24uJyknOwppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oXGQrXC5cZCtcLlxkKyg/OlwuXGQrKT8pfScsICRwcmV0dHlWZXJzaW9uLCAkbWF0Y2gpKSB7CiRwcmV0dHlWZXJzaW9uID0gJG1hdGNoWzFdOwp9IGVsc2UgewokcHJldHR5VmVyc2lvbiA9ICcwJzsKfQokdmVyc2lvbiA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHByZXR0eVZlcnNpb24pOwp9CgokcGFja2FnZU5hbWUgPSAkdGhpcy0+YnVpbGRQYWNrYWdlTmFtZSgkbmFtZSk7CiRleHQgPSBuZXcgQ29tcGxldGVQYWNrYWdlKCRwYWNrYWdlTmFtZSwgJHZlcnNpb24sICRwcmV0dHlWZXJzaW9uKTsKJGV4dC0+c2V0RGVzY3JpcHRpb24oJ1RoZSAnLiRuYW1lLicgUEhQIGV4dGVuc2lvbicuJGV4dHJhRGVzY3JpcHRpb24pOwokZXh0LT5zZXRUeXBlKCdwaHAtZXh0Jyk7CgppZiAoJG5hbWUgPT09ICd1dWlkJykgewokZXh0LT5zZXRSZXBsYWNlcyhbCidsaWItdXVpZCcgPT4gbmV3IExpbmsoJ2V4dC11dWlkJywgJ2xpYi11dWlkJywgbmV3IENvbnN0cmFpbnQoJz0nLCAkdmVyc2lvbiksIExpbms6OlRZUEVfUkVQTEFDRSwgJGV4dC0+Z2V0UHJldHR5VmVyc2lvbigpKSwKXSk7Cn0KCiR0aGlzLT5hZGRQYWNrYWdlKCRleHQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGJ1aWxkUGFja2FnZU5hbWUoc3RyaW5nICRuYW1lKTogc3RyaW5nCnsKcmV0dXJuICdleHQtJyAuIHN0cl9yZXBsYWNlKCcgJywgJy0nLCBzdHJ0b2xvd2VyKCRuYW1lKSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRMaWJyYXJ5KGFycmF5ICYkbGlicmFyaWVzLCBzdHJpbmcgJG5hbWUsID9zdHJpbmcgJHByZXR0eVZlcnNpb24sID9zdHJpbmcgJGRlc2NyaXB0aW9uID0gbnVsbCwgYXJyYXkgJHJlcGxhY2VzID0gW10sIGFycmF5ICRwcm92aWRlcyA9IFtdKTogdm9pZAp7CmlmIChudWxsID09PSAkcHJldHR5VmVyc2lvbikgewpyZXR1cm47Cn0KdHJ5IHsKJHZlcnNpb24gPSAkdGhpcy0+dmVyc2lvblBhcnNlci0+bm9ybWFsaXplKCRwcmV0dHlWZXJzaW9uKTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewpyZXR1cm47Cn0KCgoKaWYgKGlzc2V0KCRsaWJyYXJpZXNbJ2xpYi0nLiRuYW1lXSkpIHsKcmV0dXJuOwp9CiRsaWJyYXJpZXNbJ2xpYi0nLiRuYW1lXSA9IHRydWU7CgppZiAoJGRlc2NyaXB0aW9uID09PSBudWxsKSB7CiRkZXNjcmlwdGlvbiA9ICdUaGUgJy4kbmFtZS4nIGxpYnJhcnknOwp9CgokbGliID0gbmV3IENvbXBsZXRlUGFja2FnZSgnbGliLScuJG5hbWUsICR2ZXJzaW9uLCAkcHJldHR5VmVyc2lvbik7CiRsaWItPnNldERlc2NyaXB0aW9uKCRkZXNjcmlwdGlvbik7CgokcmVwbGFjZUxpbmtzID0gW107CmZvcmVhY2ggKCRyZXBsYWNlcyBhcyAkcmVwbGFjZSkgewokcmVwbGFjZSA9IHN0cnRvbG93ZXIoJHJlcGxhY2UpOwokcmVwbGFjZUxpbmtzWyRyZXBsYWNlXSA9IG5ldyBMaW5rKCdsaWItJy4kbmFtZSwgJ2xpYi0nLiRyZXBsYWNlLCBuZXcgQ29uc3RyYWludCgnPScsICR2ZXJzaW9uKSwgTGluazo6VFlQRV9SRVBMQUNFLCAkbGliLT5nZXRQcmV0dHlWZXJzaW9uKCkpOwp9CiRwcm92aWRlTGlua3MgPSBbXTsKZm9yZWFjaCAoJHByb3ZpZGVzIGFzICRwcm92aWRlKSB7CiRwcm92aWRlID0gc3RydG9sb3dlcigkcHJvdmlkZSk7CiRwcm92aWRlTGlua3NbJHByb3ZpZGVdID0gbmV3IExpbmsoJ2xpYi0nLiRuYW1lLCAnbGliLScuJHByb3ZpZGUsIG5ldyBDb25zdHJhaW50KCc9JywgJHZlcnNpb24pLCBMaW5rOjpUWVBFX1BST1ZJREUsICRsaWItPmdldFByZXR0eVZlcnNpb24oKSk7Cn0KJGxpYi0+c2V0UmVwbGFjZXMoJHJlcGxhY2VMaW5rcyk7CiRsaWItPnNldFByb3ZpZGVzKCRwcm92aWRlTGlua3MpOwoKJHRoaXMtPmFkZFBhY2thZ2UoJGxpYik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNQbGF0Zm9ybVBhY2thZ2Uoc3RyaW5nICRuYW1lKTogYm9vbAp7CnN0YXRpYyAkY2FjaGUgPSBbXTsKCmlmIChpc3NldCgkY2FjaGVbJG5hbWVdKSkgewpyZXR1cm4gJGNhY2hlWyRuYW1lXTsKfQoKcmV0dXJuICRjYWNoZVskbmFtZV0gPSBQcmVnOjppc01hdGNoKFBsYXRmb3JtUmVwb3NpdG9yeTo6UExBVEZPUk1fUEFDS0FHRV9SRUdFWCwgJG5hbWUpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYXRmb3JtUGhwVmVyc2lvbigpOiA/c3RyaW5nCnsKcmV0dXJuIHNlbGY6OiRsYXN0U2VlblBsYXRmb3JtUGhwOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2VhcmNoKHN0cmluZyAkcXVlcnksIGludCAkbW9kZSA9IDAsID9zdHJpbmcgJHR5cGUgPSBudWxsKTogYXJyYXkKewoKaWYgKCRtb2RlID09PSBzZWxmOjpTRUFSQ0hfVkVORE9SKSB7CnJldHVybiBbXTsKfQoKcmV0dXJuIHBhcmVudDo6c2VhcmNoKCRxdWVyeSwgJG1vZGUsICR0eXBlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEV2ZW50RGlzcGF0Y2hlclxFdmVudERpc3BhdGNoZXI7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwoKCgoKY2xhc3MgUmVwb3NpdG9yeUZhY3RvcnkKewoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmcoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICRyZXBvc2l0b3J5LCBib29sICRhbGxvd0ZpbGVzeXN0ZW0gPSBmYWxzZSkKewppZiAoMCA9PT0gc3RycG9zKCRyZXBvc2l0b3J5LCAnaHR0cCcpKSB7CiRyZXBvQ29uZmlnID0gWyd0eXBlJyA9PiAnY29tcG9zZXInLCAndXJsJyA9PiAkcmVwb3NpdG9yeV07Cn0gZWxzZWlmICgianNvbiIgPT09IHBhdGhpbmZvKCRyZXBvc2l0b3J5LCBQQVRISU5GT19FWFRFTlNJT04pKSB7CiRqc29uID0gbmV3IEpzb25GaWxlKCRyZXBvc2l0b3J5LCBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpKTsKJGRhdGEgPSAkanNvbi0+cmVhZCgpOwppZiAoIWVtcHR5KCRkYXRhWydwYWNrYWdlcyddKSB8fCAhZW1wdHkoJGRhdGFbJ2luY2x1ZGVzJ10pIHx8ICFlbXB0eSgkZGF0YVsncHJvdmlkZXItaW5jbHVkZXMnXSkpIHsKJHJlcG9Db25maWcgPSBbJ3R5cGUnID0+ICdjb21wb3NlcicsICd1cmwnID0+ICdmaWxlOi8vJyAuIHN0cnRyKHJlYWxwYXRoKCRyZXBvc2l0b3J5KSwgJ1xcJywgJy8nKV07Cn0gZWxzZWlmICgkYWxsb3dGaWxlc3lzdGVtKSB7CiRyZXBvQ29uZmlnID0gWyd0eXBlJyA9PiAnZmlsZXN5c3RlbScsICdqc29uJyA9PiAkanNvbl07Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHJlcG9zaXRvcnkgVVJMICgkcmVwb3NpdG9yeSkgZ2l2ZW4uIFRoaXMgZmlsZSBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQgY29tcG9zZXIgcmVwb3NpdG9yeS4iKTsKfQp9IGVsc2VpZiAoc3RycG9zKCRyZXBvc2l0b3J5LCAneycpID09PSAwKSB7CgokcmVwb0NvbmZpZyA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcG9zaXRvcnkpOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByZXBvc2l0b3J5IHVybCAoJHJlcG9zaXRvcnkpIGdpdmVuLiBIYXMgdG8gYmUgYSAuanNvbiBmaWxlLCBhbiBodHRwIHVybCBvciBhIEpTT04gb2JqZWN0LiIpOwp9CgpyZXR1cm4gJHJlcG9Db25maWc7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVN0cmluZyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHJlcG9zaXRvcnksIGJvb2wgJGFsbG93RmlsZXN5c3RlbSA9IGZhbHNlLCA/UmVwb3NpdG9yeU1hbmFnZXIgJHJtID0gbnVsbCk6IFJlcG9zaXRvcnlJbnRlcmZhY2UKewokcmVwb0NvbmZpZyA9IHN0YXRpYzo6Y29uZmlnRnJvbVN0cmluZygkaW8sICRjb25maWcsICRyZXBvc2l0b3J5LCAkYWxsb3dGaWxlc3lzdGVtKTsKCnJldHVybiBzdGF0aWM6OmNyZWF0ZVJlcG8oJGlvLCAkY29uZmlnLCAkcmVwb0NvbmZpZywgJHJtKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjcmVhdGVSZXBvKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIGFycmF5ICRyZXBvQ29uZmlnLCA/UmVwb3NpdG9yeU1hbmFnZXIgJHJtID0gbnVsbCk6IFJlcG9zaXRvcnlJbnRlcmZhY2UKewppZiAoISRybSkgewpAdHJpZ2dlcl9lcnJvcignTm90IHBhc3NpbmcgYSByZXBvc2l0b3J5IG1hbmFnZXIgd2hlbiBjYWxsaW5nIGNyZWF0ZVJlcG8gaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjMuNicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKJHJtID0gc3RhdGljOjptYW5hZ2VyKCRpbywgJGNvbmZpZyk7Cn0KJHJlcG9zID0gc2VsZjo6Y3JlYXRlUmVwb3MoJHJtLCBbJHJlcG9Db25maWddKTsKCnJldHVybiByZXNldCgkcmVwb3MpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGRlZmF1bHRSZXBvcyg/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCwgP0NvbmZpZyAkY29uZmlnID0gbnVsbCwgP1JlcG9zaXRvcnlNYW5hZ2VyICRybSA9IG51bGwpOiBhcnJheQp7CmlmIChudWxsID09PSAkcm0pIHsKQHRyaWdnZXJfZXJyb3IoJ05vdCBwYXNzaW5nIGEgcmVwb3NpdG9yeSBtYW5hZ2VyIHdoZW4gY2FsbGluZyBkZWZhdWx0UmVwb3MgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjMuNiwgdXNlIGRlZmF1bHRSZXBvc1dpdGhEZWZhdWx0TWFuYWdlcigpIGluc3RlYWQgaWYgeW91IGNhbm5vdCBnZXQgYSBtYW5hZ2VyLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKfQoKaWYgKG51bGwgPT09ICRjb25maWcpIHsKJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pOwp9CmlmIChudWxsICE9PSAkaW8pIHsKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKfQppZiAobnVsbCA9PT0gJHJtKSB7CmlmIChudWxsID09PSAkaW8pIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoaXMgZnVuY3Rpb24gcmVxdWlyZXMgZWl0aGVyIGFuIElPSW50ZXJmYWNlIG9yIGEgUmVwb3NpdG9yeU1hbmFnZXInKTsKfQokcm0gPSBzdGF0aWM6Om1hbmFnZXIoJGlvLCAkY29uZmlnLCBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkaW8sICRjb25maWcpKTsKfQoKcmV0dXJuIHNlbGY6OmNyZWF0ZVJlcG9zKCRybSwgJGNvbmZpZy0+Z2V0UmVwb3NpdG9yaWVzKCkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hbmFnZXIoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP0h0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciA9IG51bGwsID9FdmVudERpc3BhdGNoZXIgJGV2ZW50RGlzcGF0Y2hlciA9IG51bGwsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKTogUmVwb3NpdG9yeU1hbmFnZXIKewppZiAoJGh0dHBEb3dubG9hZGVyID09PSBudWxsKSB7CiRodHRwRG93bmxvYWRlciA9IEZhY3Rvcnk6OmNyZWF0ZUh0dHBEb3dubG9hZGVyKCRpbywgJGNvbmZpZyk7Cn0KaWYgKCRwcm9jZXNzID09PSBudWxsKSB7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokcHJvY2Vzcy0+ZW5hYmxlQXN5bmMoKTsKfQoKJHJtID0gbmV3IFJlcG9zaXRvcnlNYW5hZ2VyKCRpbywgJGNvbmZpZywgJGh0dHBEb3dubG9hZGVyLCAkZXZlbnREaXNwYXRjaGVyLCAkcHJvY2Vzcyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdjb21wb3NlcicsICdDb21wb3NlclxSZXBvc2l0b3J5XENvbXBvc2VyUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygndmNzJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygncGFja2FnZScsICdDb21wb3NlclxSZXBvc2l0b3J5XFBhY2thZ2VSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdwZWFyJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcUGVhclJlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2dpdCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2JpdGJ1Y2tldCcsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2dpdC1iaXRidWNrZXQnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdnaXRodWInLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdnaXRsYWInLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdzdm4nLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdmb3NzaWwnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NSZXBvc2l0b3J5Jyk7CiRybS0+c2V0UmVwb3NpdG9yeUNsYXNzKCdwZXJmb3JjZScsICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1JlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ2hnJywgJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzUmVwb3NpdG9yeScpOwokcm0tPnNldFJlcG9zaXRvcnlDbGFzcygnYXJ0aWZhY3QnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxBcnRpZmFjdFJlcG9zaXRvcnknKTsKJHJtLT5zZXRSZXBvc2l0b3J5Q2xhc3MoJ3BhdGgnLCAnQ29tcG9zZXJcUmVwb3NpdG9yeVxQYXRoUmVwb3NpdG9yeScpOwoKcmV0dXJuICRybTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkZWZhdWx0UmVwb3NXaXRoRGVmYXVsdE1hbmFnZXIoSU9JbnRlcmZhY2UgJGlvKTogYXJyYXkKewokbWFuYWdlciA9IFJlcG9zaXRvcnlGYWN0b3J5OjptYW5hZ2VyKCRpbywgJGNvbmZpZyA9IEZhY3Rvcnk6OmNyZWF0ZUNvbmZpZygkaW8pKTsKJGlvLT5sb2FkQ29uZmlndXJhdGlvbigkY29uZmlnKTsKCnJldHVybiBSZXBvc2l0b3J5RmFjdG9yeTo6ZGVmYXVsdFJlcG9zKCRpbywgJGNvbmZpZywgJG1hbmFnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVJlcG9zKFJlcG9zaXRvcnlNYW5hZ2VyICRybSwgYXJyYXkgJHJlcG9Db25maWdzKTogYXJyYXkKewokcmVwb3MgPSBbXTsKCmZvcmVhY2ggKCRyZXBvQ29uZmlncyBhcyAkaW5kZXggPT4gJHJlcG8pIHsKaWYgKGlzX3N0cmluZygkcmVwbykpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJyJyZXBvc2l0b3JpZXMiIHNob3VsZCBiZSBhbiBhcnJheSBvZiByZXBvc2l0b3J5IGRlZmluaXRpb25zLCBvbmx5IGEgc2luZ2xlIHJlcG9zaXRvcnkgd2FzIGdpdmVuJyk7Cn0KaWYgKCFpc19hcnJheSgkcmVwbykpIHsKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1JlcG9zaXRvcnkgIicuJGluZGV4LiciICgnLmpzb25fZW5jb2RlKCRyZXBvKS4nKSBzaG91bGQgYmUgYW4gYXJyYXksICcuZ2V0X2RlYnVnX3R5cGUoJHJlcG8pLicgZ2l2ZW4nKTsKfQppZiAoIWlzc2V0KCRyZXBvWyd0eXBlJ10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdSZXBvc2l0b3J5ICInLiRpbmRleC4nIiAoJy5qc29uX2VuY29kZSgkcmVwbykuJykgbXVzdCBoYXZlIGEgdHlwZSBkZWZpbmVkJyk7Cn0KCiRuYW1lID0gc2VsZjo6Z2VuZXJhdGVSZXBvc2l0b3J5TmFtZSgkaW5kZXgsICRyZXBvLCAkcmVwb3MpOwppZiAoJHJlcG9bJ3R5cGUnXSA9PT0gJ2ZpbGVzeXN0ZW0nKSB7CiRyZXBvc1skbmFtZV0gPSBuZXcgRmlsZXN5c3RlbVJlcG9zaXRvcnkoJHJlcG9bJ2pzb24nXSk7Cn0gZWxzZSB7CiRyZXBvc1skbmFtZV0gPSAkcm0tPmNyZWF0ZVJlcG9zaXRvcnkoJHJlcG9bJ3R5cGUnXSwgJHJlcG8sIChzdHJpbmcpICRpbmRleCk7Cn0KfQoKcmV0dXJuICRyZXBvczsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdlbmVyYXRlUmVwb3NpdG9yeU5hbWUoJGluZGV4LCBhcnJheSAkcmVwbywgYXJyYXkgJGV4aXN0aW5nUmVwb3MpOiBzdHJpbmcKewokbmFtZSA9IGlzX2ludCgkaW5kZXgpICYmIGlzc2V0KCRyZXBvWyd1cmwnXSkgPyBQcmVnOjpyZXBsYWNlKCd7Xmh0dHBzPzovL31pJywgJycsICRyZXBvWyd1cmwnXSkgOiAoc3RyaW5nKSAkaW5kZXg7CndoaWxlIChpc3NldCgkZXhpc3RpbmdSZXBvc1skbmFtZV0pKSB7CiRuYW1lIC49ICcyJzsKfQoKcmV0dXJuICRuYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CgoKCgoKCgoKaW50ZXJmYWNlIFJlcG9zaXRvcnlJbnRlcmZhY2UgZXh0ZW5kcyBcQ291bnRhYmxlCnsKcHVibGljIGNvbnN0IFNFQVJDSF9GVUxMVEVYVCA9IDA7CnB1YmxpYyBjb25zdCBTRUFSQ0hfTkFNRSA9IDE7CnB1YmxpYyBjb25zdCBTRUFSQ0hfVkVORE9SID0gMjsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFja2FnZShQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlKTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZFBhY2thZ2VzKHN0cmluZyAkbmFtZSwgJGNvbnN0cmFpbnQgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFBhY2thZ2VzKCk7CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lTWFwLCBhcnJheSAkYWNjZXB0YWJsZVN0YWJpbGl0aWVzLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MsIGFycmF5ICRhbHJlYWR5TG9hZGVkID0gW10pOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWFyY2goc3RyaW5nICRxdWVyeSwgaW50ICRtb2RlID0gMCwgP3N0cmluZyAkdHlwZSA9IG51bGwpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlcnMoc3RyaW5nICRwYWNrYWdlTmFtZSk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJlcG9OYW1lKCk7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnREaXNwYXRjaGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcUHJvY2Vzc0V4ZWN1dG9yOwoKCgoKCgoKCmNsYXNzIFJlcG9zaXRvcnlNYW5hZ2VyCnsKCnByaXZhdGUgJGxvY2FsUmVwb3NpdG9yeTsKCnByaXZhdGUgJHJlcG9zaXRvcmllcyA9IFtdOwoKcHJpdmF0ZSAkcmVwb3NpdG9yeUNsYXNzZXMgPSBbXTsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRldmVudERpc3BhdGNoZXI7Cgpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlciwgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+ZXZlbnREaXNwYXRjaGVyID0gJGV2ZW50RGlzcGF0Y2hlcjsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kUGFja2FnZShzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KTogP1BhY2thZ2VJbnRlcmZhY2UKewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CgppZiAoJHBhY2thZ2UgPSAkcmVwb3NpdG9yeS0+ZmluZFBhY2thZ2UoJG5hbWUsICRjb25zdHJhaW50KSkgewpyZXR1cm4gJHBhY2thZ2U7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsICRjb25zdHJhaW50KTogYXJyYXkKewokcGFja2FnZXMgPSBbXTsKCmZvcmVhY2ggKCR0aGlzLT5nZXRSZXBvc2l0b3JpZXMoKSBhcyAkcmVwb3NpdG9yeSkgewokcGFja2FnZXMgPSBhcnJheV9tZXJnZSgkcGFja2FnZXMsICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50KSk7Cn0KCnJldHVybiAkcGFja2FnZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFJlcG9zaXRvcnkoUmVwb3NpdG9yeUludGVyZmFjZSAkcmVwb3NpdG9yeSk6IHZvaWQKewokdGhpcy0+cmVwb3NpdG9yaWVzW10gPSAkcmVwb3NpdG9yeTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kUmVwb3NpdG9yeShSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CmFycmF5X3Vuc2hpZnQoJHRoaXMtPnJlcG9zaXRvcmllcywgJHJlcG9zaXRvcnkpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVSZXBvc2l0b3J5KHN0cmluZyAkdHlwZSwgYXJyYXkgJGNvbmZpZywgP3N0cmluZyAkbmFtZSA9IG51bGwpOiBSZXBvc2l0b3J5SW50ZXJmYWNlCnsKaWYgKCFpc3NldCgkdGhpcy0+cmVwb3NpdG9yeUNsYXNzZXNbJHR5cGVdKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUmVwb3NpdG9yeSB0eXBlIGlzIG5vdCByZWdpc3RlcmVkOiAnLiR0eXBlKTsKfQoKaWYgKGlzc2V0KCRjb25maWdbJ3BhY2thZ2lzdCddKSAmJiBmYWxzZSA9PT0gJGNvbmZpZ1sncGFja2FnaXN0J10pIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5SZXBvc2l0b3J5ICInLiRuYW1lLiciICgnLmpzb25fZW5jb2RlKCRjb25maWcpLicpIGhhcyBhIHBhY2thZ2lzdCBrZXkgd2hpY2ggc2hvdWxkIGJlIGluIGl0cyBvd24gcmVwb3NpdG9yeSBkZWZpbml0aW9uPC93YXJuaW5nPicpOwp9CgokY2xhc3MgPSAkdGhpcy0+cmVwb3NpdG9yeUNsYXNzZXNbJHR5cGVdOwoKaWYgKGlzc2V0KCRjb25maWdbJ29ubHknXSkgfHwgaXNzZXQoJGNvbmZpZ1snZXhjbHVkZSddKSB8fCBpc3NldCgkY29uZmlnWydjYW5vbmljYWwnXSkpIHsKJGZpbHRlckNvbmZpZyA9ICRjb25maWc7CnVuc2V0KCRjb25maWdbJ29ubHknXSwgJGNvbmZpZ1snZXhjbHVkZSddLCAkY29uZmlnWydjYW5vbmljYWwnXSk7Cn0KCiRyZXBvc2l0b3J5ID0gbmV3ICRjbGFzcygkY29uZmlnLCAkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5odHRwRG93bmxvYWRlciwgJHRoaXMtPmV2ZW50RGlzcGF0Y2hlciwgJHRoaXMtPnByb2Nlc3MpOwoKaWYgKGlzc2V0KCRmaWx0ZXJDb25maWcpKSB7CiRyZXBvc2l0b3J5ID0gbmV3IEZpbHRlclJlcG9zaXRvcnkoJHJlcG9zaXRvcnksICRmaWx0ZXJDb25maWcpOwp9CgpyZXR1cm4gJHJlcG9zaXRvcnk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRSZXBvc2l0b3J5Q2xhc3Moc3RyaW5nICR0eXBlLCAkY2xhc3MpOiB2b2lkCnsKJHRoaXMtPnJlcG9zaXRvcnlDbGFzc2VzWyR0eXBlXSA9ICRjbGFzczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yaWVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3JpZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvY2FsUmVwb3NpdG9yeShJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvc2l0b3J5KTogdm9pZAp7CiR0aGlzLT5sb2NhbFJlcG9zaXRvcnkgPSAkcmVwb3NpdG9yeTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvY2FsUmVwb3NpdG9yeSgpOiBJbnN0YWxsZWRSZXBvc2l0b3J5SW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5sb2NhbFJlcG9zaXRvcnk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCgoKCgoKY2xhc3MgUmVwb3NpdG9yeVNlY3VyaXR5RXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnk7Cgp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFBvb2xPcHRpbWl6ZXI7CnVzZSBDb21wb3NlclxEZXBlbmRlbmN5UmVzb2x2ZXJcUG9vbDsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxQb29sQnVpbGRlcjsKdXNlIENvbXBvc2VyXERlcGVuZGVuY3lSZXNvbHZlclxSZXF1ZXN0Owp1c2UgQ29tcG9zZXJcRGVwZW5kZW5jeVJlc29sdmVyXFNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXEFkdmlzb3J5XFNlY3VyaXR5QWR2aXNvcnk7CnVzZSBDb21wb3NlclxBZHZpc29yeVxQYXJ0aWFsU2VjdXJpdHlBZHZpc29yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSU9cTnVsbElPOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxCYXNlUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQWxpYXNQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxDb21wbGV0ZUFsaWFzUGFja2FnZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcQ29tcGxldGVQYWNrYWdlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcQ29uc3RyYWludDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQYWNrYWdlXFZlcnNpb25cU3RhYmlsaXR5RmlsdGVyOwp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTWF0Y2hBbGxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcU2VtdmVyXENvbnN0cmFpbnRcTXVsdGlDb25zdHJhaW50OwoKCgoKCgpjbGFzcyBSZXBvc2l0b3J5U2V0CnsKCgoKcHVibGljIGNvbnN0IEFMTE9XX1VOQUNDRVBUQUJMRV9TVEFCSUxJVElFUyA9IDE7CgoKCnB1YmxpYyBjb25zdCBBTExPV19TSEFET1dFRF9SRVBPU0lUT1JJRVMgPSAyOwoKCgoKCnByaXZhdGUgJHJvb3RBbGlhc2VzOwoKCgoKCnByaXZhdGUgJHJvb3RSZWZlcmVuY2VzOwoKCnByaXZhdGUgJHJlcG9zaXRvcmllcyA9IFtdOwoKCgoKCnByaXZhdGUgJGFjY2VwdGFibGVTdGFiaWxpdGllczsKCgoKCgpwcml2YXRlICRzdGFiaWxpdHlGbGFnczsKCgoKCgpwcml2YXRlICRyb290UmVxdWlyZXM7CgoKCgpwcml2YXRlICR0ZW1wb3JhcnlDb25zdHJhaW50czsKCgpwcml2YXRlICRsb2NrZWQgPSBmYWxzZTsKCnByaXZhdGUgJGFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzID0gZmFsc2U7CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWluaW11bVN0YWJpbGl0eSA9ICdzdGFibGUnLCBhcnJheSAkc3RhYmlsaXR5RmxhZ3MgPSBbXSwgYXJyYXkgJHJvb3RBbGlhc2VzID0gW10sIGFycmF5ICRyb290UmVmZXJlbmNlcyA9IFtdLCBhcnJheSAkcm9vdFJlcXVpcmVzID0gW10sIGFycmF5ICR0ZW1wb3JhcnlDb25zdHJhaW50cyA9IFtdKQp7CiR0aGlzLT5yb290QWxpYXNlcyA9IHNlbGY6OmdldFJvb3RBbGlhc2VzUGVyUGFja2FnZSgkcm9vdEFsaWFzZXMpOwokdGhpcy0+cm9vdFJlZmVyZW5jZXMgPSAkcm9vdFJlZmVyZW5jZXM7CgokdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzID0gW107CmZvcmVhY2ggKEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFUyBhcyAkc3RhYmlsaXR5ID0+ICR2YWx1ZSkgewppZiAoJHZhbHVlIDw9IEJhc2VQYWNrYWdlOjpTVEFCSUxJVElFU1skbWluaW11bVN0YWJpbGl0eV0pIHsKJHRoaXMtPmFjY2VwdGFibGVTdGFiaWxpdGllc1skc3RhYmlsaXR5XSA9ICR2YWx1ZTsKfQp9CiR0aGlzLT5zdGFiaWxpdHlGbGFncyA9ICRzdGFiaWxpdHlGbGFnczsKJHRoaXMtPnJvb3RSZXF1aXJlcyA9ICRyb290UmVxdWlyZXM7CmZvcmVhY2ggKCRyb290UmVxdWlyZXMgYXMgJG5hbWUgPT4gJGNvbnN0cmFpbnQpIHsKaWYgKFBsYXRmb3JtUmVwb3NpdG9yeTo6aXNQbGF0Zm9ybVBhY2thZ2UoJG5hbWUpKSB7CnVuc2V0KCR0aGlzLT5yb290UmVxdWlyZXNbJG5hbWVdKTsKfQp9CgokdGhpcy0+dGVtcG9yYXJ5Q29uc3RyYWludHMgPSAkdGVtcG9yYXJ5Q29uc3RyYWludHM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhbGxvd0luc3RhbGxlZFJlcG9zaXRvcmllcyhib29sICRhbGxvdyA9IHRydWUpOiB2b2lkCnsKJHRoaXMtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzID0gJGFsbG93Owp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RSZXF1aXJlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cm9vdFJlcXVpcmVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGVtcG9yYXJ5Q29uc3RyYWludHMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnRlbXBvcmFyeUNvbnN0cmFpbnRzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRSZXBvc2l0b3J5KFJlcG9zaXRvcnlJbnRlcmZhY2UgJHJlcG8pOiB2b2lkCnsKaWYgKCR0aGlzLT5sb2NrZWQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCJQb29sIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCBmcm9tIHRoaXMgcmVwb3NpdG9yeSBzZXQsIGl0IGNhbm5vdCBiZSBtb2RpZmllZCBhbnltb3JlLiIpOwp9CgppZiAoJHJlcG8gaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CiRyZXBvcyA9ICRyZXBvLT5nZXRSZXBvc2l0b3JpZXMoKTsKfSBlbHNlIHsKJHJlcG9zID0gWyRyZXBvXTsKfQoKZm9yZWFjaCAoJHJlcG9zIGFzICRyZXBvKSB7CiR0aGlzLT5yZXBvc2l0b3JpZXNbXSA9ICRyZXBvOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRQYWNrYWdlcyhzdHJpbmcgJG5hbWUsID9Db25zdHJhaW50SW50ZXJmYWNlICRjb25zdHJhaW50ID0gbnVsbCwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRpZ25vcmVTdGFiaWxpdHkgPSAoJGZsYWdzICYgc2VsZjo6QUxMT1dfVU5BQ0NFUFRBQkxFX1NUQUJJTElUSUVTKSAhPT0gMDsKJGxvYWRGcm9tQWxsUmVwb3MgPSAoJGZsYWdzICYgc2VsZjo6QUxMT1dfU0hBRE9XRURfUkVQT1NJVE9SSUVTKSAhPT0gMDsKCiRwYWNrYWdlcyA9IFtdOwppZiAoJGxvYWRGcm9tQWxsUmVwb3MpIHsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewokcGFja2FnZXNbXSA9ICRyZXBvc2l0b3J5LT5maW5kUGFja2FnZXMoJG5hbWUsICRjb25zdHJhaW50KSA/OiBbXTsKfQp9IGVsc2Ugewpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CiRyZXN1bHQgPSAkcmVwb3NpdG9yeS0+bG9hZFBhY2thZ2VzKFskbmFtZSA9PiAkY29uc3RyYWludF0sICRpZ25vcmVTdGFiaWxpdHkgPyBCYXNlUGFja2FnZTo6U1RBQklMSVRJRVMgOiAkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkaWdub3JlU3RhYmlsaXR5ID8gW10gOiAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MpOwoKJHBhY2thZ2VzW10gPSAkcmVzdWx0WydwYWNrYWdlcyddOwpmb3JlYWNoICgkcmVzdWx0WyduYW1lc0ZvdW5kJ10gYXMgJG5hbWVGb3VuZCkgewoKaWYgKCRuYW1lID09PSAkbmFtZUZvdW5kKSB7CmJyZWFrIDI7Cn0KfQp9Cn0KCiRjYW5kaWRhdGVzID0gJHBhY2thZ2VzID8gYXJyYXlfbWVyZ2UoLi4uJHBhY2thZ2VzKSA6IFtdOwoKCmlmICgkaWdub3JlU3RhYmlsaXR5IHx8ICEkbG9hZEZyb21BbGxSZXBvcykgewpyZXR1cm4gJGNhbmRpZGF0ZXM7Cn0KCiRyZXN1bHQgPSBbXTsKZm9yZWFjaCAoJGNhbmRpZGF0ZXMgYXMgJGNhbmRpZGF0ZSkgewppZiAoJHRoaXMtPmlzUGFja2FnZUFjY2VwdGFibGUoJGNhbmRpZGF0ZS0+Z2V0TmFtZXMoKSwgJGNhbmRpZGF0ZS0+Z2V0U3RhYmlsaXR5KCkpKSB7CiRyZXN1bHRbXSA9ICRjYW5kaWRhdGU7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U2VjdXJpdHlBZHZpc29yaWVzKGFycmF5ICRwYWNrYWdlTmFtZXMsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMsIGJvb2wgJGlnbm9yZVVucmVhY2hhYmxlID0gZmFsc2UpOiBhcnJheQp7CiRtYXAgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VOYW1lcyBhcyAkbmFtZSkgewokbWFwWyRuYW1lXSA9IG5ldyBNYXRjaEFsbENvbnN0cmFpbnQoKTsKfQoKJHVucmVhY2hhYmxlUmVwb3MgPSBbXTsKJGFkdmlzb3JpZXMgPSAkdGhpcy0+Z2V0U2VjdXJpdHlBZHZpc29yaWVzRm9yQ29uc3RyYWludHMoJG1hcCwgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMsICRpZ25vcmVVbnJlYWNoYWJsZSwgJHVucmVhY2hhYmxlUmVwb3MpOwoKcmV0dXJuIFsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXMsICd1bnJlYWNoYWJsZVJlcG9zJyA9PiAkdW5yZWFjaGFibGVSZXBvc107Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWF0Y2hpbmdTZWN1cml0eUFkdmlzb3JpZXMoYXJyYXkgJHBhY2thZ2VzLCBib29sICRhbGxvd1BhcnRpYWxBZHZpc29yaWVzID0gZmFsc2UsIGJvb2wgJGlnbm9yZVVucmVhY2hhYmxlID0gZmFsc2UpOiBhcnJheQp7CiRtYXAgPSBbXTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlKSB7CgppZiAoJHBhY2thZ2UgaW5zdGFuY2VvZiBBbGlhc1BhY2thZ2UgJiYgJHBhY2thZ2UtPmlzUm9vdFBhY2thZ2VBbGlhcygpKSB7CmNvbnRpbnVlOwp9CmlmIChpc3NldCgkbWFwWyRwYWNrYWdlLT5nZXROYW1lKCldKSkgewokbWFwWyRwYWNrYWdlLT5nZXROYW1lKCldID0gbmV3IE11bHRpQ29uc3RyYWludChbbmV3IENvbnN0cmFpbnQoJz0nLCAkcGFja2FnZS0+Z2V0VmVyc2lvbigpKSwgJG1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXV0sIGZhbHNlKTsKfSBlbHNlIHsKJG1hcFskcGFja2FnZS0+Z2V0TmFtZSgpXSA9IG5ldyBDb25zdHJhaW50KCc9JywgJHBhY2thZ2UtPmdldFZlcnNpb24oKSk7Cn0KfQoKJHVucmVhY2hhYmxlUmVwb3MgPSBbXTsKJGFkdmlzb3JpZXMgPSAkdGhpcy0+Z2V0U2VjdXJpdHlBZHZpc29yaWVzRm9yQ29uc3RyYWludHMoJG1hcCwgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMsICRpZ25vcmVVbnJlYWNoYWJsZSwgJHVucmVhY2hhYmxlUmVwb3MpOwoKcmV0dXJuIFsnYWR2aXNvcmllcycgPT4gJGFkdmlzb3JpZXMsICd1bnJlYWNoYWJsZVJlcG9zJyA9PiAkdW5yZWFjaGFibGVSZXBvc107Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTZWN1cml0eUFkdmlzb3JpZXNGb3JDb25zdHJhaW50cyhhcnJheSAkcGFja2FnZUNvbnN0cmFpbnRNYXAsIGJvb2wgJGFsbG93UGFydGlhbEFkdmlzb3JpZXMsIGJvb2wgJGlnbm9yZVVucmVhY2hhYmxlID0gZmFsc2UsIGFycmF5ICYkdW5yZWFjaGFibGVSZXBvcyA9IFtdKTogYXJyYXkKewokcmVwb0Fkdmlzb3JpZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwb3NpdG9yeSkgewp0cnkgewppZiAoISRyZXBvc2l0b3J5IGluc3RhbmNlb2YgQWR2aXNvcnlQcm92aWRlckludGVyZmFjZSB8fCAhJHJlcG9zaXRvcnktPmhhc1NlY3VyaXR5QWR2aXNvcmllcygpKSB7CmNvbnRpbnVlOwp9CgokcmVwb0Fkdmlzb3JpZXNbXSA9ICRyZXBvc2l0b3J5LT5nZXRTZWN1cml0eUFkdmlzb3JpZXMoJHBhY2thZ2VDb25zdHJhaW50TWFwLCAkYWxsb3dQYXJ0aWFsQWR2aXNvcmllcylbJ2Fkdmlzb3JpZXMnXTsKfSBjYXRjaCAoXENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CmlmICghJGlnbm9yZVVucmVhY2hhYmxlKSB7CnRocm93ICRlOwp9CiR1bnJlYWNoYWJsZVJlcG9zW10gPSAkZS0+Z2V0TWVzc2FnZSgpOwp9Cn0KCiRhZHZpc29yaWVzID0gY291bnQoJHJlcG9BZHZpc29yaWVzKSA+IDAgPyBhcnJheV9tZXJnZV9yZWN1cnNpdmUoW10sIC4uLiRyZXBvQWR2aXNvcmllcykgOiBbXTsKa3NvcnQoJGFkdmlzb3JpZXMpOwoKcmV0dXJuICRhZHZpc29yaWVzOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3ZpZGVycyhzdHJpbmcgJHBhY2thZ2VOYW1lKTogYXJyYXkKewokcHJvdmlkZXJzID0gW107CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG9zaXRvcnkpIHsKaWYgKCRyZXBvUHJvdmlkZXJzID0gJHJlcG9zaXRvcnktPmdldFByb3ZpZGVycygkcGFja2FnZU5hbWUpKSB7CiRwcm92aWRlcnMgPSBhcnJheV9tZXJnZSgkcHJvdmlkZXJzLCAkcmVwb1Byb3ZpZGVycyk7Cn0KfQoKcmV0dXJuICRwcm92aWRlcnM7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1BhY2thZ2VBY2NlcHRhYmxlKGFycmF5ICRuYW1lcywgc3RyaW5nICRzdGFiaWxpdHkpOiBib29sCnsKcmV0dXJuIFN0YWJpbGl0eUZpbHRlcjo6aXNQYWNrYWdlQWNjZXB0YWJsZSgkdGhpcy0+YWNjZXB0YWJsZVN0YWJpbGl0aWVzLCAkdGhpcy0+c3RhYmlsaXR5RmxhZ3MsICRuYW1lcywgJHN0YWJpbGl0eSk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sKFJlcXVlc3QgJHJlcXVlc3QsIElPSW50ZXJmYWNlICRpbywgP0V2ZW50RGlzcGF0Y2hlciAkZXZlbnREaXNwYXRjaGVyID0gbnVsbCwgP1Bvb2xPcHRpbWl6ZXIgJHBvb2xPcHRpbWl6ZXIgPSBudWxsLCBhcnJheSAkaWdub3JlZFR5cGVzID0gW10sID9hcnJheSAkYWxsb3dlZFR5cGVzID0gbnVsbCwgP1NlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyICRzZWN1cml0eUFkdmlzb3J5UG9vbEZpbHRlciA9IG51bGwpOiBQb29sCnsKJHBvb2xCdWlsZGVyID0gbmV3IFBvb2xCdWlsZGVyKCR0aGlzLT5hY2NlcHRhYmxlU3RhYmlsaXRpZXMsICR0aGlzLT5zdGFiaWxpdHlGbGFncywgJHRoaXMtPnJvb3RBbGlhc2VzLCAkdGhpcy0+cm9vdFJlZmVyZW5jZXMsICRpbywgJGV2ZW50RGlzcGF0Y2hlciwgJHBvb2xPcHRpbWl6ZXIsICR0aGlzLT50ZW1wb3JhcnlDb25zdHJhaW50cywgJHNlY3VyaXR5QWR2aXNvcnlQb29sRmlsdGVyKTsKJHBvb2xCdWlsZGVyLT5zZXRJZ25vcmVkVHlwZXMoJGlnbm9yZWRUeXBlcyk7CiRwb29sQnVpbGRlci0+c2V0QWxsb3dlZFR5cGVzKCRhbGxvd2VkVHlwZXMpOwoKZm9yZWFjaCAoJHRoaXMtPnJlcG9zaXRvcmllcyBhcyAkcmVwbykgewppZiAoKCRyZXBvIGluc3RhbmNlb2YgSW5zdGFsbGVkUmVwb3NpdG9yeUludGVyZmFjZSB8fCAkcmVwbyBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnkpICYmICEkdGhpcy0+YWxsb3dJbnN0YWxsZWRSZXBvc2l0b3JpZXMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIHBvb2wgY2FuIG5vdCBhY2NlcHQgcGFja2FnZXMgZnJvbSBhbiBpbnN0YWxsZWQgcmVwb3NpdG9yeScpOwp9Cn0KCiR0aGlzLT5sb2NrZWQgPSB0cnVlOwoKcmV0dXJuICRwb29sQnVpbGRlci0+YnVpbGRQb29sKCR0aGlzLT5yZXBvc2l0b3JpZXMsICRyZXF1ZXN0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVBvb2xXaXRoQWxsUGFja2FnZXMoKTogUG9vbAp7CmZvcmVhY2ggKCR0aGlzLT5yZXBvc2l0b3JpZXMgYXMgJHJlcG8pIHsKaWYgKCgkcmVwbyBpbnN0YW5jZW9mIEluc3RhbGxlZFJlcG9zaXRvcnlJbnRlcmZhY2UgfHwgJHJlcG8gaW5zdGFuY2VvZiBJbnN0YWxsZWRSZXBvc2l0b3J5KSAmJiAhJHRoaXMtPmFsbG93SW5zdGFsbGVkUmVwb3NpdG9yaWVzKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBwb29sIGNhbiBub3QgYWNjZXB0IHBhY2thZ2VzIGZyb20gYW4gaW5zdGFsbGVkIHJlcG9zaXRvcnknKTsKfQp9CgokdGhpcy0+bG9ja2VkID0gdHJ1ZTsKCiRwYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+cmVwb3NpdG9yaWVzIGFzICRyZXBvc2l0b3J5KSB7CmZvcmVhY2ggKCRyZXBvc2l0b3J5LT5nZXRQYWNrYWdlcygpIGFzICRwYWNrYWdlKSB7CiRwYWNrYWdlc1tdID0gJHBhY2thZ2U7CgppZiAoaXNzZXQoJHRoaXMtPnJvb3RBbGlhc2VzWyRwYWNrYWdlLT5nZXROYW1lKCldWyRwYWNrYWdlLT5nZXRWZXJzaW9uKCldKSkgewokYWxpYXMgPSAkdGhpcy0+cm9vdEFsaWFzZXNbJHBhY2thZ2UtPmdldE5hbWUoKV1bJHBhY2thZ2UtPmdldFZlcnNpb24oKV07CndoaWxlICgkcGFja2FnZSBpbnN0YW5jZW9mIEFsaWFzUGFja2FnZSkgewokcGFja2FnZSA9ICRwYWNrYWdlLT5nZXRBbGlhc09mKCk7Cn0KaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlKSB7CiRhbGlhc1BhY2thZ2UgPSBuZXcgQ29tcGxldGVBbGlhc1BhY2thZ2UoJHBhY2thZ2UsICRhbGlhc1snYWxpYXNfbm9ybWFsaXplZCddLCAkYWxpYXNbJ2FsaWFzJ10pOwp9IGVsc2UgewokYWxpYXNQYWNrYWdlID0gbmV3IEFsaWFzUGFja2FnZSgkcGFja2FnZSwgJGFsaWFzWydhbGlhc19ub3JtYWxpemVkJ10sICRhbGlhc1snYWxpYXMnXSk7Cn0KJGFsaWFzUGFja2FnZS0+c2V0Um9vdFBhY2thZ2VBbGlhcyh0cnVlKTsKJHBhY2thZ2VzW10gPSAkYWxpYXNQYWNrYWdlOwp9Cn0KfQoKcmV0dXJuIG5ldyBQb29sKCRwYWNrYWdlcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sRm9yUGFja2FnZShzdHJpbmcgJHBhY2thZ2VOYW1lLCA/TG9ja0FycmF5UmVwb3NpdG9yeSAkbG9ja2VkUmVwbyA9IG51bGwpOiBQb29sCnsKCnJldHVybiAkdGhpcy0+Y3JlYXRlUG9vbEZvclBhY2thZ2VzKFskcGFja2FnZU5hbWVdLCAkbG9ja2VkUmVwbyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVQb29sRm9yUGFja2FnZXMoYXJyYXkgJHBhY2thZ2VOYW1lcywgP0xvY2tBcnJheVJlcG9zaXRvcnkgJGxvY2tlZFJlcG8gPSBudWxsKTogUG9vbAp7CiRyZXF1ZXN0ID0gbmV3IFJlcXVlc3QoJGxvY2tlZFJlcG8pOwoKJGFsbG93ZWRQYWNrYWdlcyA9IFtdOwpmb3JlYWNoICgkcGFja2FnZU5hbWVzIGFzICRwYWNrYWdlTmFtZSkgewppZiAoUGxhdGZvcm1SZXBvc2l0b3J5Ojppc1BsYXRmb3JtUGFja2FnZSgkcGFja2FnZU5hbWUpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ2NyZWF0ZVBvb2xGb3JQYWNrYWdlKHMpIGNhbiBub3QgYmUgdXNlZCBmb3IgcGxhdGZvcm0gcGFja2FnZXMsIGFzIHRoZXkgYXJlIG5ldmVyIGxvYWRlZCBieSB0aGUgUG9vbEJ1aWxkZXIgd2hpY2ggZXhwZWN0cyB0aGVtIHRvIGJlIGZpeGVkLiBVc2UgY3JlYXRlUG9vbFdpdGhBbGxQYWNrYWdlcyBvciBwYXNzIGluIGEgcHJvcGVyIHJlcXVlc3Qgd2l0aCB0aGUgcGxhdGZvcm0gcGFja2FnZXMgeW91IG5lZWQgZml4ZWQgaW4gaXQuJyk7Cn0KCiRyZXF1ZXN0LT5yZXF1aXJlTmFtZSgkcGFja2FnZU5hbWUpOwokYWxsb3dlZFBhY2thZ2VzW10gPSBzdHJ0b2xvd2VyKCRwYWNrYWdlTmFtZSk7Cn0KCmlmIChjb3VudCgkYWxsb3dlZFBhY2thZ2VzKSA+IDApIHsKJHJlcXVlc3QtPnJlc3RyaWN0UGFja2FnZXMoJGFsbG93ZWRQYWNrYWdlcyk7Cn0KCnJldHVybiAkdGhpcy0+Y3JlYXRlUG9vbCgkcmVxdWVzdCwgbmV3IE51bGxJTygpKTsKfQoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Um9vdEFsaWFzZXNQZXJQYWNrYWdlKGFycmF5ICRhbGlhc2VzKTogYXJyYXkKewokbm9ybWFsaXplZEFsaWFzZXMgPSBbXTsKCmZvcmVhY2ggKCRhbGlhc2VzIGFzICRhbGlhcykgewokbm9ybWFsaXplZEFsaWFzZXNbJGFsaWFzWydwYWNrYWdlJ11dWyRhbGlhc1sndmVyc2lvbiddXSA9IFsKJ2FsaWFzJyA9PiAkYWxpYXNbJ2FsaWFzJ10sCidhbGlhc19ub3JtYWxpemVkJyA9PiAkYWxpYXNbJ2FsaWFzX25vcm1hbGl6ZWQnXSwKXTsKfQoKcmV0dXJuICRub3JtYWxpemVkQWxpYXNlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgUmVwb3NpdG9yeVV0aWxzCnsKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaWx0ZXJSZXF1aXJlZFBhY2thZ2VzKGFycmF5ICRwYWNrYWdlcywgUGFja2FnZUludGVyZmFjZSAkcmVxdWlyZXIsIGJvb2wgJGluY2x1ZGVSZXF1aXJlRGV2ID0gZmFsc2UsIGFycmF5ICRidWNrZXQgPSBbXSk6IGFycmF5CnsKJHJlcXVpcmVzID0gJHJlcXVpcmVyLT5nZXRSZXF1aXJlcygpOwppZiAoJGluY2x1ZGVSZXF1aXJlRGV2KSB7CiRyZXF1aXJlcyA9IGFycmF5X21lcmdlKCRyZXF1aXJlcywgJHJlcXVpcmVyLT5nZXREZXZSZXF1aXJlcygpKTsKfQoKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRjYW5kaWRhdGUpIHsKZm9yZWFjaCAoJGNhbmRpZGF0ZS0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoaXNzZXQoJHJlcXVpcmVzWyRuYW1lXSkpIHsKaWYgKCFpbl9hcnJheSgkY2FuZGlkYXRlLCAkYnVja2V0LCB0cnVlKSkgewokYnVja2V0W10gPSAkY2FuZGlkYXRlOwokYnVja2V0ID0gc2VsZjo6ZmlsdGVyUmVxdWlyZWRQYWNrYWdlcygkcGFja2FnZXMsICRjYW5kaWRhdGUsIGZhbHNlLCAkYnVja2V0KTsKfQpicmVhazsKfQp9Cn0KCnJldHVybiAkYnVja2V0Owp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmxhdHRlblJlcG9zaXRvcmllcyhSZXBvc2l0b3J5SW50ZXJmYWNlICRyZXBvLCBib29sICR1bndyYXBGaWx0ZXJSZXBvcyA9IHRydWUpOiBhcnJheQp7CgppZiAoJHVud3JhcEZpbHRlclJlcG9zICYmICRyZXBvIGluc3RhbmNlb2YgRmlsdGVyUmVwb3NpdG9yeSkgewokcmVwbyA9ICRyZXBvLT5nZXRSZXBvc2l0b3J5KCk7Cn0KCmlmICghJHJlcG8gaW5zdGFuY2VvZiBDb21wb3NpdGVSZXBvc2l0b3J5KSB7CnJldHVybiBbJHJlcG9dOwp9CgokcmVwb3MgPSBbXTsKZm9yZWFjaCAoJHJlcG8tPmdldFJlcG9zaXRvcmllcygpIGFzICRyKSB7CmZvcmVhY2ggKHNlbGY6OmZsYXR0ZW5SZXBvc2l0b3JpZXMoJHIsICR1bndyYXBGaWx0ZXJSZXBvcykgYXMgJHIyKSB7CiRyZXBvc1tdID0gJHIyOwp9Cn0KCnJldHVybiAkcmVwb3M7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCnVzZSBDb21wb3NlclxQYWNrYWdlXFJvb3RQYWNrYWdlSW50ZXJmYWNlOwoKCgoKCgoKCmNsYXNzIFJvb3RQYWNrYWdlUmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeQp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSb290UGFja2FnZUludGVyZmFjZSAkcGFja2FnZSkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KFskcGFja2FnZV0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb05hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdyb290IHBhY2thZ2UgcmVwbyc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcRm9yZ2VqbzsKdXNlIENvbXBvc2VyXFV0aWxcRm9yZ2Vqb1JlcG9zaXRvcnlEYXRhOwp1c2UgQ29tcG9zZXJcVXRpbFxGb3JnZWpvVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKY2xhc3MgRm9yZ2Vqb0RyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcml2YXRlICRmb3JnZWpvVXJsOwoKcHJpdmF0ZSAkcmVwb3NpdG9yeURhdGE7CgoKcHJvdGVjdGVkICRnaXREcml2ZXIgPSBudWxsOwoKcHJpdmF0ZSAkdGFnczsKCnByaXZhdGUgJGJyYW5jaGVzOwoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CiR0aGlzLT5mb3JnZWpvVXJsID0gRm9yZ2Vqb1VybDo6Y3JlYXRlKCR0aGlzLT51cmwpOwokdGhpcy0+b3JpZ2luVXJsID0gJHRoaXMtPmZvcmdlam9VcmwtPm9yaWdpblVybDsKCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPmZvcmdlam9VcmwtPm93bmVyLicvJy4kdGhpcy0+Zm9yZ2Vqb1VybC0+cmVwb3NpdG9yeSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7CgokdGhpcy0+ZmV0Y2hSZXBvc2l0b3J5RGF0YSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIgIT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEZpbGVDb250ZW50KCRmaWxlLCAkaWRlbnRpZmllcik7Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5mb3JnZWpvVXJsLT5hcGlVcmwuJy9jb250ZW50cy8nIC4gJGZpbGUgLiAnP3JlZj0nLnVybGVuY29kZSgkaWRlbnRpZmllcik7CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CgoKCmlmICgoIWlzc2V0KCRyZXNvdXJjZVsnY29udGVudCddKSB8fCAkcmVzb3VyY2VbJ2NvbnRlbnQnXSA9PT0gJycpICYmICRyZXNvdXJjZVsnZW5jb2RpbmcnXSA9PT0gJ25vbmUnICYmIGlzc2V0KCRyZXNvdXJjZVsnZ2l0X3VybCddKSkgewokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlWydnaXRfdXJsJ10pLT5kZWNvZGVKc29uKCk7Cn0KCmlmICghaXNzZXQoJHJlc291cmNlWydjb250ZW50J10pIHx8ICRyZXNvdXJjZVsnZW5jb2RpbmcnXSAhPT0gJ2Jhc2U2NCcgfHwgZmFsc2UgPT09ICgkY29udGVudCA9IGJhc2U2NF9kZWNvZGUoJHJlc291cmNlWydjb250ZW50J10sIHRydWUpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZXRyaWV2ZSAnIC4gJGZpbGUgLiAnIGZvciAnLiRpZGVudGlmaWVyKTsKfQoKcmV0dXJuICRjb250ZW50Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKCR0aGlzLT5naXREcml2ZXIgIT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENoYW5nZURhdGUoJGlkZW50aWZpZXIpOwp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Zm9yZ2Vqb1VybC0+YXBpVXJsLicvZ2l0L2NvbW1pdHMvJy51cmxlbmNvZGUoJGlkZW50aWZpZXIpLic/dmVyaWZpY2F0aW9uPWZhbHNlJmZpbGVzPWZhbHNlJzsKJGNvbW1pdCA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CgpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSgkY29tbWl0Wydjb21taXQnXVsnY29tbWl0dGVyJ11bJ2RhdGUnXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKTsKfQoKcmV0dXJuICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+ZGVmYXVsdEJyYW5jaDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIgIT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEJyYW5jaGVzKCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRyZXNvdXJjZSA9ICR0aGlzLT5mb3JnZWpvVXJsLT5hcGlVcmwuJy9icmFuY2hlcz9wZXJfcGFnZT0xMDAnOwoKZG8gewokcmVzcG9uc2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKTsKJGJyYW5jaERhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJGJyYW5jaERhdGEgYXMgJGJyYW5jaCkgewokYnJhbmNoZXNbJGJyYW5jaFsnbmFtZSddXSA9ICRicmFuY2hbJ2NvbW1pdCddWydpZCddOwp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSB3aGlsZSAoJHJlc291cmNlKTsKCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlciAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0VGFncygpOwp9CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwokcmVzb3VyY2UgPSAkdGhpcy0+Zm9yZ2Vqb1VybC0+YXBpVXJsLicvdGFncz9wZXJfcGFnZT0xMDAnOwoKZG8gewokcmVzcG9uc2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKTsKJHRhZ3NEYXRhID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7CmZvcmVhY2ggKCR0YWdzRGF0YSBhcyAkdGFnKSB7CiR0YWdzWyR0YWdbJ25hbWUnXV0gPSAkdGFnWydjb21taXQnXVsnc2hhJ107Cn0KCiRyZXNvdXJjZSA9ICR0aGlzLT5nZXROZXh0UGFnZSgkcmVzcG9uc2UpOwp9IHdoaWxlICgkcmVzb3VyY2UpOwoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokdXJsID0gJHRoaXMtPmZvcmdlam9VcmwtPmFwaVVybC4nL2FyY2hpdmUvJy4kaWRlbnRpZmllci4nLnppcCc7CgpyZXR1cm4gWyd0eXBlJyA9PiAnemlwJywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsICdzaGFzdW0nID0+ICcnXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIgIT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiBmYWxzZSAhPT0gKCRyZXMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGlkZW50aWZpZXIpKSkgewokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9IGVsc2UgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllciwgSnNvbkZpbGU6OmVuY29kZSgkY29tcG9zZXIsIFxKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgXEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpKTsKfQp9CgppZiAoJGNvbXBvc2VyICE9PSBudWxsKSB7CgppZiAoaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J10pICYmICFpc19hcnJheSgkY29tcG9zZXJbJ3N1cHBvcnQnXSkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J10gPSBbXTsKfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSkpIHsKaWYgKGZhbHNlICE9PSAoJGxhYmVsID0gYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0VGFncygpLCB0cnVlKSkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5odG1sVXJsLicvdGFnLycgLiAkbGFiZWw7Cn0gZWxzZWlmIChmYWxzZSAhPT0gKCRsYWJlbCA9IGFycmF5X3NlYXJjaCgkaWRlbnRpZmllciwgJHRoaXMtPmdldEJyYW5jaGVzKCksIHRydWUpKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXVsnc291cmNlJ10gPSAkdGhpcy0+cmVwb3NpdG9yeURhdGEtPmh0bWxVcmwuJy9icmFuY2gvJy4kbGFiZWw7Cn0gZWxzZSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9ICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+aHRtbFVybC4nL2NvbW1pdC8nLiRpZGVudGlmaWVyOwp9Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10pICYmICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+aGFzSXNzdWVzKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSA9ICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+aHRtbFVybC4nL2lzc3Vlcyc7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ2FiYW5kb25lZCddKSAmJiAkdGhpcy0+cmVwb3NpdG9yeURhdGEtPmlzQXJjaGl2ZWQpIHsKJGNvbXBvc2VyWydhYmFuZG9uZWQnXSA9IHRydWU7Cn0KfQoKJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0gPSAkY29tcG9zZXI7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyICE9PSBudWxsKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRTb3VyY2UoJGlkZW50aWZpZXIpOwp9CgpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIgIT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFVybCgpOwp9CgpyZXR1cm4gJHRoaXMtPnJlcG9zaXRvcnlEYXRhLT5pc1ByaXZhdGUgPyAkdGhpcy0+cmVwb3NpdG9yeURhdGEtPnNzaFVybCA6ICR0aGlzLT5yZXBvc2l0b3J5RGF0YS0+aHR0cENsb25lVXJsOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKJGZvcmdlam9VcmwgPSBGb3JnZWpvVXJsOjp0cnlGcm9tKCR1cmwpOwppZiAoJGZvcmdlam9VcmwgPT09IG51bGwpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWluX2FycmF5KHN0cnRvbG93ZXIoJGZvcmdlam9VcmwtPm9yaWdpblVybCksICRjb25maWctPmdldCgnZm9yZ2Vqby1kb21haW5zJyksIHRydWUpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGlvLT53cml0ZUVycm9yKCdTa2lwcGluZyBGb3JnZWpvIGRyaXZlciBmb3IgJy4kdXJsLicgYmVjYXVzZSB0aGUgT3BlblNTTCBQSFAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwR2l0RHJpdmVyKHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5naXREcml2ZXIgPSBuZXcgR2l0RHJpdmVyKApbJ3VybCcgPT4gJHVybF0sCiR0aGlzLT5pbywKJHRoaXMtPmNvbmZpZywKJHRoaXMtPmh0dHBEb3dubG9hZGVyLAokdGhpcy0+cHJvY2VzcwopOwokdGhpcy0+Z2l0RHJpdmVyLT5pbml0aWFsaXplKCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZmV0Y2hSZXBvc2l0b3J5RGF0YSgpOiB2b2lkCnsKaWYgKCR0aGlzLT5yZXBvc2l0b3J5RGF0YSAhPT0gbnVsbCkgewpyZXR1cm47Cn0KCiRkYXRhID0gJHRoaXMtPmdldENvbnRlbnRzKCR0aGlzLT5mb3JnZWpvVXJsLT5hcGlVcmwsIHRydWUpLT5kZWNvZGVKc29uKCk7CgppZiAobnVsbCA9PT0gJGRhdGEgJiYgbnVsbCAhPT0gJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm47Cn0KCiR0aGlzLT5yZXBvc2l0b3J5RGF0YSA9IEZvcmdlam9SZXBvc2l0b3J5RGF0YTo6ZnJvbVJlbW90ZURhdGEoJGRhdGEpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TmV4dFBhZ2UoUmVzcG9uc2UgJHJlc3BvbnNlKTogP3N0cmluZwp7CiRoZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGluaycpOwppZiAoJGhlYWRlciA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKJGxpbmtzID0gZXhwbG9kZSgnLCcsICRoZWFkZXIpOwpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3s8KC4rPyk+OyAqcmVsPSJuZXh0In0nLCAkbGluaywgJG1hdGNoKSkgewpyZXR1cm4gJG1hdGNoWzFdOwp9Cn0KCnJldHVybiBudWxsOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICR1cmwsIGJvb2wgJGZldGNoaW5nUmVwb0RhdGEgPSBmYWxzZSk6IFJlc3BvbnNlCnsKJGZvcmdlam8gPSBuZXcgRm9yZ2VqbygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5odHRwRG93bmxvYWRlcik7Cgp0cnkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CnN3aXRjaCAoJGUtPmdldENvZGUoKSkgewpjYXNlIDQwMToKY2FzZSA0MDM6CmNhc2UgNDA0OgpjYXNlIDQyOToKaWYgKCEkZmV0Y2hpbmdSZXBvRGF0YSkgewp0aHJvdyAkZTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9CgppZiAoCiEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCR0aGlzLT5vcmlnaW5VcmwpICYmCiRmb3JnZWpvLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJHRoaXMtPmZvcmdlam9VcmwtPm9yaWdpblVybCwgJGUtPmdldENvZGUoKSA9PT0gNDI5ID8gJ0FQSSBsaW1pdCBleGhhdXN0ZWQuIEVudGVyIHlvdXIgRm9yZ2VqbyBjcmVkZW50aWFscyB0byBnZXQgYSBsYXJnZXIgQVBJIGxpbWl0ICg8aW5mbz4nLiR0aGlzLT51cmwuJzwvaW5mbz4pJyA6IG51bGwpCikgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKdGhyb3cgJGU7CmRlZmF1bHQ6CnRocm93ICRlOwp9Cn0KfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGF0dGVtcHRDbG9uZUZhbGxiYWNrKCk6IGJvb2wKewp0cnkgewoKCgoKJHRoaXMtPnNldHVwR2l0RHJpdmVyKCR0aGlzLT5mb3JnZWpvVXJsLT5nZW5lcmF0ZVNzaFVybCgpKTsKCnJldHVybiB0cnVlOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewokdGhpcy0+Z2l0RHJpdmVyID0gbnVsbDsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byBjbG9uZSB0aGUgJy4kdGhpcy0+Zm9yZ2Vqb1VybC0+Z2VuZXJhdGVTc2hVcmwoKS4nIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgRm9yZ2VqbyBjcmVkZW50aWFsczwvZXJyb3I+Jyk7CnRocm93ICRlOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwoKCgoKY2xhc3MgRm9zc2lsRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyID0gbnVsbDsKCnByb3RlY3RlZCAkcmVwb0ZpbGUgPSBudWxsOwoKcHJvdGVjdGVkICRjaGVja291dERpcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewoKJHRoaXMtPmNoZWNrRm9zc2lsKCk7CgoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdGhpcy0+dXJsLCAkdGhpcy0+aW8pOwoKCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHRoaXMtPnVybCkgJiYgaXNfZGlyKCR0aGlzLT51cmwpKSB7CiR0aGlzLT5jaGVja291dERpciA9ICR0aGlzLT51cmw7Cn0gZWxzZSB7CmlmICghQ2FjaGU6OmlzVXNhYmxlKCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKSkgfHwgIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGb3NzaWxEcml2ZXIgcmVxdWlyZXMgYSB1c2FibGUgY2FjaGUgZGlyZWN0b3J5LCBhbmQgaXQgbG9va3MgbGlrZSB5b3Ugc2V0IGl0IHRvIGJlIGRpc2FibGVkJyk7Cn0KCiRsb2NhbE5hbWUgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTldfWknLCAnLScsICR0aGlzLT51cmwpOwokdGhpcy0+cmVwb0ZpbGUgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXJlcG8tZGlyJykgLiAnLycgLiAkbG9jYWxOYW1lIC4gJy5mb3NzaWwnOwokdGhpcy0+Y2hlY2tvdXREaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSAuICcvJyAuICRsb2NhbE5hbWUgLiAnLyc7CgokdGhpcy0+dXBkYXRlTG9jYWxSZXBvKCk7Cn0KCiR0aGlzLT5nZXRUYWdzKCk7CiR0aGlzLT5nZXRCcmFuY2hlcygpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tGb3NzaWwoKTogdm9pZAp7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd2ZXJzaW9uJ10sICRpZ25vcmVkT3V0cHV0KSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oImZvc3NpbCB3YXMgbm90IGZvdW5kLCBjaGVjayB0aGF0IGl0IGlzIGluc3RhbGxlZCBhbmQgaW4geW91ciBQQVRIIGVudi5cblxuIiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdXBkYXRlTG9jYWxSZXBvKCk6IHZvaWQKewphc3NlcnQoJHRoaXMtPnJlcG9GaWxlICE9PSBudWxsKTsKCiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCR0aGlzLT5jaGVja291dERpcik7CgppZiAoIWlzX3dyaXRhYmxlKGRpcm5hbWUoJHRoaXMtPmNoZWNrb3V0RGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuJHRoaXMtPmNoZWNrb3V0RGlyLiciIGRpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUgYnkgdGhlIGN1cnJlbnQgdXNlci4nKTsKfQoKCmlmIChpc19maWxlKCR0aGlzLT5yZXBvRmlsZSkgJiYgaXNfZGlyKCR0aGlzLT5jaGVja291dERpcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnaW5mbyddLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpKSB7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdwdWxsJ10sICRvdXRwdXQsICR0aGlzLT5jaGVja291dERpcikpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIHVwZGF0ZSAnLiR0aGlzLT51cmwuJywgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcmVwb3NpdG9yeSBtYXkgYmUgb3V0ZGF0ZWQgKCcuJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkuJyk8L2Vycm9yPicpOwp9Cn0gZWxzZSB7CgokZnMtPnJlbW92ZURpcmVjdG9yeSgkdGhpcy0+Y2hlY2tvdXREaXIpOwokZnMtPnJlbW92ZSgkdGhpcy0+cmVwb0ZpbGUpOwoKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRoaXMtPmNoZWNrb3V0RGlyKTsKCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdjbG9uZScsICctLScsICR0aGlzLT51cmwsICR0aGlzLT5yZXBvRmlsZV0sICRvdXRwdXQpKSB7CiRvdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcuJHRoaXMtPnVybC4nIHRvIHJlcG9zaXRvcnkgJyAuICR0aGlzLT5yZXBvRmlsZSAuICJcblxuIiAuJG91dHB1dCk7Cn0KCmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdvcGVuJywgJy0tbmVzdGVkJywgJy0tJywgJHRoaXMtPnJlcG9GaWxlXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKSkgewokb3V0cHV0ID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byBvcGVuIHJlcG9zaXRvcnkgJy4kdGhpcy0+cmVwb0ZpbGUuJyBpbiAnIC4gJHRoaXMtPmNoZWNrb3V0RGlyIC4gIlxuXG4iIC4kb3V0cHV0KTsKfQp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICd0cnVuayc7Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnZm9zc2lsJywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnY2F0JywgJy1yJywgJGlkZW50aWZpZXIsICctLScsICRmaWxlXSwgJGNvbnRlbnQsICR0aGlzLT5jaGVja291dERpcik7CgppZiAoJycgPT09IHRyaW0oJGNvbnRlbnQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICdmaW5mbycsICctYicsICctbicsICcxJywgJ2NvbXBvc2VyLmpzb24nXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKTsKWywgJGRhdGVdID0gZXhwbG9kZSgnICcsIHRyaW0oJG91dHB1dCksIDMpOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJGRhdGUsIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2Zvc3NpbCcsICd0YWcnLCAnbGlzdCddLCAkb3V0cHV0LCAkdGhpcy0+Y2hlY2tvdXREaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkdGFnKSB7CiR0YWdzWyR0YWddID0gJHRhZzsKfQoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydmb3NzaWwnLCAnYnJhbmNoJywgJ2xpc3QnXSwgJG91dHB1dCwgJHRoaXMtPmNoZWNrb3V0RGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGJyYW5jaCkgewokYnJhbmNoID0gdHJpbShQcmVnOjpyZXBsYWNlKCcvXlwqLycsICcnLCB0cmltKCRicmFuY2gpKSk7CiRicmFuY2hlc1skYnJhbmNoXSA9ICRicmFuY2g7Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmIChQcmVnOjppc01hdGNoKCcjKF4oPzpodHRwcz98c3NoKTovLyg/OlteQF1AKT8oPzpjaGlzZWxhcHBcLmNvbXxmb3NzaWxcLikpI2knLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJyEvZm9zc2lsL3xcLmZvc3NpbCEnLCAkdXJsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdXJsKSkgewokdXJsID0gRmlsZXN5c3RlbTo6Z2V0UGxhdGZvcm1QYXRoKCR1cmwpOwppZiAoIWlzX2RpcigkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwoKaWYgKCRwcm9jZXNzLT5leGVjdXRlKFsnZm9zc2lsJywgJ2luZm8nXSwgJG91dHB1dCwgJHVybCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEJpdGJ1Y2tldDsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKCgoKCmNsYXNzIEdpdEJpdGJ1Y2tldERyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJG93bmVyOwoKcHJvdGVjdGVkICRyZXBvc2l0b3J5OwoKcHJpdmF0ZSAkaGFzSXNzdWVzID0gZmFsc2U7Cgpwcml2YXRlICRyb290SWRlbnRpZmllcjsKCnByaXZhdGUgJHRhZ3M7Cgpwcml2YXRlICRicmFuY2hlczsKCnByaXZhdGUgJGJyYW5jaGVzVXJsID0gJyc7Cgpwcml2YXRlICR0YWdzVXJsID0gJyc7Cgpwcml2YXRlICRob21lVXJsID0gJyc7Cgpwcml2YXRlICR3ZWJzaXRlID0gJyc7Cgpwcml2YXRlICRjbG9uZUh0dHBzVXJsID0gJyc7Cgpwcml2YXRlICRyZXBvRGF0YTsKCgoKCnByb3RlY3RlZCAkZmFsbGJhY2tEcml2ZXIgPSBudWxsOwoKcHJpdmF0ZSAkdmNzVHlwZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoIVByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyNeaHR0cHM/Oi8vYml0YnVja2V0XC5vcmcvKFteL10rKS8oW14vXSs/KSg/OlwuZ2l0fC8/KT8kI2knLCAkdGhpcy0+dXJsLCAkbWF0Y2gpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBCaXRidWNrZXQgcmVwb3NpdG9yeSBVUkwgJXMgaXMgaW52YWxpZC4gSXQgbXVzdCBiZSB0aGUgSFRUUFMgVVJMIG9mIGEgQml0YnVja2V0IHJlcG9zaXRvcnkuJywgJHRoaXMtPnVybCkpOwp9CgokdGhpcy0+b3duZXIgPSAkbWF0Y2hbMV07CiR0aGlzLT5yZXBvc2l0b3J5ID0gJG1hdGNoWzJdOwokdGhpcy0+b3JpZ2luVXJsID0gJ2JpdGJ1Y2tldC5vcmcnOwokdGhpcy0+Y2FjaGUgPSBuZXcgQ2FjaGUoCiR0aGlzLT5pbywKaW1wbG9kZSgnLycsIFsKJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLAokdGhpcy0+b3JpZ2luVXJsLAokdGhpcy0+b3duZXIsCiR0aGlzLT5yZXBvc2l0b3J5LApdKQopOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0VXJsKCk7Cn0KCnJldHVybiAkdGhpcy0+Y2xvbmVIdHRwc1VybDsKfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFJlcG9EYXRhKCk6IGJvb2wKewokcmVzb3VyY2UgPSBzcHJpbnRmKAonaHR0cHM6Ly9hcGkuYml0YnVja2V0Lm9yZy8yLjAvcmVwb3NpdG9yaWVzLyVzLyVzPyVzJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKaHR0cF9idWlsZF9xdWVyeSgKWydmaWVsZHMnID0+ICctcHJvamVjdCwtb3duZXInXSwKJycsCicmJwopCik7CgokcmVwb0RhdGEgPSAkdGhpcy0+ZmV0Y2hXaXRoT0F1dGhDcmVkZW50aWFscygkcmVzb3VyY2UsIHRydWUpLT5kZWNvZGVKc29uKCk7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuIGZhbHNlOwp9CiR0aGlzLT5wYXJzZUNsb25lVXJscygkcmVwb0RhdGFbJ2xpbmtzJ11bJ2Nsb25lJ10pOwoKJHRoaXMtPmhhc0lzc3VlcyA9ICFlbXB0eSgkcmVwb0RhdGFbJ2hhc19pc3N1ZXMnXSk7CiR0aGlzLT5icmFuY2hlc1VybCA9ICRyZXBvRGF0YVsnbGlua3MnXVsnYnJhbmNoZXMnXVsnaHJlZiddOwokdGhpcy0+dGFnc1VybCA9ICRyZXBvRGF0YVsnbGlua3MnXVsndGFncyddWydocmVmJ107CiR0aGlzLT5ob21lVXJsID0gJHJlcG9EYXRhWydsaW5rcyddWydodG1sJ11bJ2hyZWYnXTsKJHRoaXMtPndlYnNpdGUgPSAkcmVwb0RhdGFbJ3dlYnNpdGUnXTsKJHRoaXMtPnZjc1R5cGUgPSAkcmVwb0RhdGFbJ3NjbSddOwoKJHRoaXMtPnJlcG9EYXRhID0gJHJlcG9EYXRhOwoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7Cn0KCmlmICghaXNzZXQoJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl0pKSB7CmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpICYmICRyZXMgPSAkdGhpcy0+Y2FjaGUtPnJlYWQoJGlkZW50aWZpZXIpKSB7CiRjb21wb3NlciA9IEpzb25GaWxlOjpwYXJzZUpzb24oJHJlcyk7Cn0gZWxzZSB7CiRjb21wb3NlciA9ICR0aGlzLT5nZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLCBKc29uRmlsZTo6ZW5jb2RlKCRjb21wb3NlciwgXEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBcSlNPTl9VTkVTQ0FQRURfU0xBU0hFUykpOwp9Cn0KCmlmICgkY29tcG9zZXIgIT09IG51bGwpIHsKCmlmIChpc3NldCgkY29tcG9zZXJbJ3N1cHBvcnQnXSkgJiYgIWlzX2FycmF5KCRjb21wb3Nlclsnc3VwcG9ydCddKSkgewokY29tcG9zZXJbJ3N1cHBvcnQnXSA9IFtdOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddKSkgewokbGFiZWwgPSBhcnJheV9zZWFyY2goCiRpZGVudGlmaWVyLAokdGhpcy0+Z2V0VGFncygpCikgPzogYXJyYXlfc2VhcmNoKAokaWRlbnRpZmllciwKJHRoaXMtPmdldEJyYW5jaGVzKCkKKSA/OiAkaWRlbnRpZmllcjsKCmlmIChhcnJheV9rZXlfZXhpc3RzKCRsYWJlbCwgJHRhZ3MgPSAkdGhpcy0+Z2V0VGFncygpKSkgewokaGFzaCA9ICR0YWdzWyRsYWJlbF07Cn0gZWxzZWlmIChhcnJheV9rZXlfZXhpc3RzKCRsYWJlbCwgJGJyYW5jaGVzID0gJHRoaXMtPmdldEJyYW5jaGVzKCkpKSB7CiRoYXNoID0gJGJyYW5jaGVzWyRsYWJlbF07Cn0KCmlmICghaXNzZXQoJGhhc2gpKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSA9IHNwcmludGYoCidodHRwczovLyVzLyVzLyVzL3NyYycsCiR0aGlzLT5vcmlnaW5VcmwsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnkKKTsKfSBlbHNlIHsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gc3ByaW50ZigKJ2h0dHBzOi8vJXMvJXMvJXMvc3JjLyVzLz9hdD0lcycsCiR0aGlzLT5vcmlnaW5VcmwsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCiRoYXNoLAokbGFiZWwKKTsKfQp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J11bJ2lzc3VlcyddKSAmJiAkdGhpcy0+aGFzSXNzdWVzKSB7CiRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSA9IHNwcmludGYoCidodHRwczovLyVzLyVzLyVzL2lzc3VlcycsCiR0aGlzLT5vcmlnaW5VcmwsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnkKKTsKfQppZiAoIWlzc2V0KCRjb21wb3NlclsnaG9tZXBhZ2UnXSkpIHsKJGNvbXBvc2VyWydob21lcGFnZSddID0gZW1wdHkoJHRoaXMtPndlYnNpdGUpID8gJHRoaXMtPmhvbWVVcmwgOiAkdGhpcy0+d2Vic2l0ZTsKfQp9CgokdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSA9ICRjb21wb3NlcjsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXRGaWxlQ29udGVudCgkZmlsZSwgJGlkZW50aWZpZXIpOwp9CgppZiAoc3RycG9zKCRpZGVudGlmaWVyLCAnLycpICE9PSBmYWxzZSkgewokYnJhbmNoZXMgPSAkdGhpcy0+Z2V0QnJhbmNoZXMoKTsKaWYgKGlzc2V0KCRicmFuY2hlc1skaWRlbnRpZmllcl0pKSB7CiRpZGVudGlmaWVyID0gJGJyYW5jaGVzWyRpZGVudGlmaWVyXTsKfQp9CgokcmVzb3VyY2UgPSBzcHJpbnRmKAonaHR0cHM6Ly9hcGkuYml0YnVja2V0Lm9yZy8yLjAvcmVwb3NpdG9yaWVzLyVzLyVzL3NyYy8lcy8lcycsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCiRpZGVudGlmaWVyLAokZmlsZQopOwoKcmV0dXJuICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmdldEJvZHkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENoYW5nZURhdGUoc3RyaW5nICRpZGVudGlmaWVyKTogP1xEYXRlVGltZUltbXV0YWJsZQp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Q2hhbmdlRGF0ZSgkaWRlbnRpZmllcik7Cn0KCmlmIChzdHJwb3MoJGlkZW50aWZpZXIsICcvJykgIT09IGZhbHNlKSB7CiRicmFuY2hlcyA9ICR0aGlzLT5nZXRCcmFuY2hlcygpOwppZiAoaXNzZXQoJGJyYW5jaGVzWyRpZGVudGlmaWVyXSkpIHsKJGlkZW50aWZpZXIgPSAkYnJhbmNoZXNbJGlkZW50aWZpZXJdOwp9Cn0KCiRyZXNvdXJjZSA9IHNwcmludGYoCidodHRwczovL2FwaS5iaXRidWNrZXQub3JnLzIuMC9yZXBvc2l0b3JpZXMvJXMvJXMvY29tbWl0LyVzP2ZpZWxkcz1kYXRlJywKJHRoaXMtPm93bmVyLAokdGhpcy0+cmVwb3NpdG9yeSwKJGlkZW50aWZpZXIKKTsKJGNvbW1pdCA9ICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRjb21taXRbJ2RhdGUnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFNvdXJjZSgkaWRlbnRpZmllcik7Cn0KCnJldHVybiBbJ3R5cGUnID0+ICR0aGlzLT52Y3NUeXBlLCAndXJsJyA9PiAkdGhpcy0+Z2V0VXJsKCksICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCR0aGlzLT5mYWxsYmFja0RyaXZlcikgewpyZXR1cm4gJHRoaXMtPmZhbGxiYWNrRHJpdmVyLT5nZXREaXN0KCRpZGVudGlmaWVyKTsKfQoKJHVybCA9IHNwcmludGYoCidodHRwczovL2JpdGJ1Y2tldC5vcmcvJXMvJXMvZ2V0LyVzLnppcCcsCiR0aGlzLT5vd25lciwKJHRoaXMtPnJlcG9zaXRvcnksCiRpZGVudGlmaWVyCik7CgpyZXR1cm4gWyd0eXBlJyA9PiAnemlwJywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsICdzaGFzdW0nID0+ICcnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFRhZ3MoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0YWdzID0gW107CiRyZXNvdXJjZSA9IHNwcmludGYoCiclcz8lcycsCiR0aGlzLT50YWdzVXJsLApodHRwX2J1aWxkX3F1ZXJ5KApbCidwYWdlbGVuJyA9PiAxMDAsCidmaWVsZHMnID0+ICd2YWx1ZXMubmFtZSx2YWx1ZXMudGFyZ2V0Lmhhc2gsbmV4dCcsCidzb3J0JyA9PiAnLXRhcmdldC5kYXRlJywKXSwKJycsCicmJwopCik7CiRoYXNOZXh0ID0gdHJ1ZTsKd2hpbGUgKCRoYXNOZXh0KSB7CiR0YWdzRGF0YSA9ICR0aGlzLT5mZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJHRhZ3NEYXRhWyd2YWx1ZXMnXSBhcyAkZGF0YSkgewokdGFnc1skZGF0YVsnbmFtZSddXSA9ICRkYXRhWyd0YXJnZXQnXVsnaGFzaCddOwp9CmlmIChlbXB0eSgkdGFnc0RhdGFbJ25leHQnXSkpIHsKJGhhc05leHQgPSBmYWxzZTsKfSBlbHNlIHsKJHJlc291cmNlID0gJHRhZ3NEYXRhWyduZXh0J107Cn0KfQoKJHRoaXMtPnRhZ3MgPSAkdGFnczsKfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAoJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldEJyYW5jaGVzKCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRyZXNvdXJjZSA9IHNwcmludGYoCiclcz8lcycsCiR0aGlzLT5icmFuY2hlc1VybCwKaHR0cF9idWlsZF9xdWVyeSgKWwoncGFnZWxlbicgPT4gMTAwLAonZmllbGRzJyA9PiAndmFsdWVzLm5hbWUsdmFsdWVzLnRhcmdldC5oYXNoLHZhbHVlcy5oZWFkcyxuZXh0JywKJ3NvcnQnID0+ICctdGFyZ2V0LmRhdGUnLApdLAonJywKJyYnCikKKTsKJGhhc05leHQgPSB0cnVlOwp3aGlsZSAoJGhhc05leHQpIHsKJGJyYW5jaERhdGEgPSAkdGhpcy0+ZmV0Y2hXaXRoT0F1dGhDcmVkZW50aWFscygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CmZvcmVhY2ggKCRicmFuY2hEYXRhWyd2YWx1ZXMnXSBhcyAkZGF0YSkgewokYnJhbmNoZXNbJGRhdGFbJ25hbWUnXV0gPSAkZGF0YVsndGFyZ2V0J11bJ2hhc2gnXTsKfQppZiAoZW1wdHkoJGJyYW5jaERhdGFbJ25leHQnXSkpIHsKJGhhc05leHQgPSBmYWxzZTsKfSBlbHNlIHsKJHJlc291cmNlID0gJGJyYW5jaERhdGFbJ25leHQnXTsKfQp9CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFdpdGhPQXV0aENyZWRlbnRpYWxzKHN0cmluZyAkdXJsLCBib29sICRmZXRjaGluZ1JlcG9EYXRhID0gZmFsc2UpOiBSZXNwb25zZQp7CnRyeSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJGJpdGJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5odHRwRG93bmxvYWRlcik7CgppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDA0XSwgdHJ1ZSkgfHwgKDQwMSA9PT0gJGUtPmdldENvZGUoKSAmJiBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCcpID09PSAwKSkgewppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkKJiYgJGJpdGJ1Y2tldFV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpCikgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAkZmV0Y2hpbmdSZXBvRGF0YSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9Cn0KCnRocm93ICRlOwp9Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZW5lcmF0ZVNzaFVybCgpOiBzdHJpbmcKewpyZXR1cm4gJ2dpdEAnIC4gJHRoaXMtPm9yaWdpblVybCAuICc6JyAuICR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0ZW1wdENsb25lRmFsbGJhY2soKTogYm9vbAp7CnRyeSB7CiR0aGlzLT5zZXR1cEZhbGxiYWNrRHJpdmVyKCR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpKTsKCnJldHVybiB0cnVlOwp9IGNhdGNoIChcUnVudGltZUV4Y2VwdGlvbiAkZSkgewokdGhpcy0+ZmFsbGJhY2tEcml2ZXIgPSBudWxsOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKAonPGVycm9yPkZhaWxlZCB0byBjbG9uZSB0aGUgJyAuICR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpIC4gJyByZXBvc2l0b3J5LCB0cnkgcnVubmluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlJwouICcgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgQml0YnVja2V0IE9BdXRoIGNvbnN1bWVyIGNyZWRlbnRpYWxzPC9lcnJvcj4nCik7CnRocm93ICRlOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBzZXR1cEZhbGxiYWNrRHJpdmVyKHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5mYWxsYmFja0RyaXZlciA9IG5ldyBHaXREcml2ZXIoClsndXJsJyA9PiAkdXJsXSwKJHRoaXMtPmlvLAokdGhpcy0+Y29uZmlnLAokdGhpcy0+aHR0cERvd25sb2FkZXIsCiR0aGlzLT5wcm9jZXNzCik7CiR0aGlzLT5mYWxsYmFja0RyaXZlci0+aW5pdGlhbGl6ZSgpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VDbG9uZVVybHMoYXJyYXkgJGNsb25lTGlua3MpOiB2b2lkCnsKZm9yZWFjaCAoJGNsb25lTGlua3MgYXMgJGNsb25lTGluaykgewppZiAoJGNsb25lTGlua1snbmFtZSddID09PSAnaHR0cHMnKSB7CgoKJHRoaXMtPmNsb25lSHR0cHNVcmwgPSBQcmVnOjpyZXBsYWNlKCcvaHR0cHM6XC9cLyhbXkBdK0ApPy8nLCAnaHR0cHM6Ly8nLCAkY2xvbmVMaW5rWydocmVmJ10pOwp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFJvb3RJZGVudGlmaWVyKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+ZmFsbGJhY2tEcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5mYWxsYmFja0RyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKTsKfQoKaWYgKG51bGwgPT09ICR0aGlzLT5yb290SWRlbnRpZmllcikgewppZiAoISR0aGlzLT5nZXRSZXBvRGF0YSgpKSB7CmlmICghJHRoaXMtPmZhbGxiYWNrRHJpdmVyKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0EgZmFsbGJhY2sgZHJpdmVyIHNob3VsZCBiZSBzZXR1cCBpZiBnZXRSZXBvRGF0YSByZXR1cm5zIGZhbHNlJyk7Cn0KCnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCk7Cn0KCmlmICgkdGhpcy0+dmNzVHlwZSAhPT0gJ2dpdCcpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAokdGhpcy0+dXJsLicgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGEgZ2l0IHJlcG9zaXRvcnksIHVzZSAnLgokdGhpcy0+Y2xvbmVIdHRwc1VybC4nIGJ1dCByZW1lbWJlciB0aGF0IEJpdGJ1Y2tldCBubyBsb25nZXIgc3VwcG9ydHMgdGhlIG1lcmN1cmlhbCByZXBvc2l0b3JpZXMuICcuCidodHRwczovL2JpdGJ1Y2tldC5vcmcvYmxvZy9zdW5zZXR0aW5nLW1lcmN1cmlhbC1zdXBwb3J0LWluLWJpdGJ1Y2tldCcKKTsKfQoKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJHRoaXMtPnJlcG9EYXRhWydtYWluYnJhbmNoJ11bJ25hbWUnXSA/PyAnbWFzdGVyJzsKfQoKcmV0dXJuICR0aGlzLT5yb290SWRlbnRpZmllcjsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICghUHJlZzo6aXNNYXRjaCgnI15odHRwcz86Ly9iaXRidWNrZXRcLm9yZy8oW14vXSspLyhbXi9dKz8pKFwuZ2l0fC8/KT8kI2knLCAkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CiRpby0+d3JpdGVFcnJvcignU2tpcHBpbmcgQml0YnVja2V0IGdpdCBkcml2ZXIgZm9yICcuJHVybC4nIGJlY2F1c2UgdGhlIE9wZW5TU0wgUEhQIGV4dGVuc2lvbiBpcyBtaXNzaW5nLicsIHRydWUsIElPSW50ZXJmYWNlOjpWRVJCT1NFKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxQcm9jZXNzRXhlY3V0b3I7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFV0aWxcR2l0IGFzIEdpdFV0aWw7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwoKCgoKY2xhc3MgR2l0RHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyOwoKcHJvdGVjdGVkICRyZXBvRGlyOwoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZAp7CmlmIChGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSkgewokdGhpcy0+dXJsID0gUHJlZzo6cmVwbGFjZSgne1tcXC9dXC5naXQvPyR9JywgJycsICR0aGlzLT51cmwpOwppZiAoIWlzX2RpcigkdGhpcy0+dXJsKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhaWxlZCB0byByZWFkIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSAnLiR0aGlzLT51cmwuJyBhcyB0aGUgcGF0aCBkb2VzIG5vdCBleGlzdCcpOwp9CiR0aGlzLT5yZXBvRGlyID0gJHRoaXMtPnVybDsKJGNhY2hlVXJsID0gcmVhbHBhdGgoJHRoaXMtPnVybCk7Cn0gZWxzZSB7CmlmICghQ2FjaGU6OmlzVXNhYmxlKCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtdmNzLWRpcicpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0dpdERyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJHRoaXMtPnJlcG9EaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSAuICcvJyAuIFByZWc6OnJlcGxhY2UoJ3tbXmEtejAtOS5dfWknLCAnLScsIFVybDo6c2FuaXRpemUoJHRoaXMtPnVybCkpIC4gJy8nOwoKR2l0VXRpbDo6Y2xlYW5FbnYoJHRoaXMtPnByb2Nlc3MpOwoKJGZzID0gbmV3IEZpbGVzeXN0ZW0oKTsKJGZzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoZGlybmFtZSgkdGhpcy0+cmVwb0RpcikpOwoKaWYgKCFpc193cml0YWJsZShkaXJuYW1lKCR0aGlzLT5yZXBvRGlyKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDYW4gbm90IGNsb25lICcuJHRoaXMtPnVybC4nIHRvIGFjY2VzcyBwYWNrYWdlIGluZm9ybWF0aW9uLiBUaGUgIicuZGlybmFtZSgkdGhpcy0+cmVwb0RpcikuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgppZiAoUHJlZzo6aXNNYXRjaCgne15zc2g6Ly9bXkBdK0BbXjpdKzpbXjAtOV0rfScsICR0aGlzLT51cmwpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgc291cmNlIFVSTCAnLiR0aGlzLT51cmwuJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nLiJcbiIuJ1VzZSBzc2g6Ly9naXRAZXhhbXBsZS5jb206MjIvcGF0aCBvciBqdXN0IGdpdEBleGFtcGxlLmNvbTpwYXRoIGlmIHlvdSBkbyBub3Qgd2FudCB0byBwcm92aWRlIGEgcGFzc3dvcmQgb3IgY3VzdG9tIHBvcnQuJyk7Cn0KCiRnaXRVdGlsID0gbmV3IEdpdFV0aWwoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJGZzKTsKaWYgKCEkZ2l0VXRpbC0+c3luY01pcnJvcigkdGhpcy0+dXJsLCAkdGhpcy0+cmVwb0RpcikpIHsKaWYgKCFpc19kaXIoJHRoaXMtPnJlcG9EaXIpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcuJHRoaXMtPnVybC4nIHRvIHJlYWQgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIGl0Jyk7Cn0KJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIHVwZGF0ZSAnLiR0aGlzLT51cmwuJywgcGFja2FnZSBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgcmVwb3NpdG9yeSBtYXkgYmUgb3V0ZGF0ZWQ8L2Vycm9yPicpOwp9CgokY2FjaGVVcmwgPSAkdGhpcy0+dXJsOwp9CgokdGhpcy0+Z2V0VGFncygpOwokdGhpcy0+Z2V0QnJhbmNoZXMoKTsKCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuUHJlZzo6cmVwbGFjZSgne1teYS16MC05Ll19aScsICctJywgVXJsOjpzYW5pdGl6ZSgkY2FjaGVVcmwpKSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICdtYXN0ZXInOwoKJGdpdFV0aWwgPSBuZXcgR2l0VXRpbCgkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCBuZXcgRmlsZXN5c3RlbSgpKTsKaWYgKCFGaWxlc3lzdGVtOjppc0xvY2FsUGF0aCgkdGhpcy0+dXJsKSkgewokZGVmYXVsdEJyYW5jaCA9ICRnaXRVdGlsLT5nZXRNaXJyb3JEZWZhdWx0QnJhbmNoKCR0aGlzLT51cmwsICR0aGlzLT5yZXBvRGlyLCBmYWxzZSk7CmlmICgkZGVmYXVsdEJyYW5jaCAhPT0gbnVsbCkgewpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJGRlZmF1bHRCcmFuY2g7Cn0KfQoKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCcsICctLW5vLWNvbG9yJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKJGJyYW5jaGVzID0gJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCk7CmlmICghaW5fYXJyYXkoJyogbWFzdGVyJywgJGJyYW5jaGVzKSkgewpmb3JlYWNoICgkYnJhbmNoZXMgYXMgJGJyYW5jaCkgewppZiAoJGJyYW5jaCAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XlwqICsoXFMrKX0nLCAkYnJhbmNoLCAkbWF0Y2gpKSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICRtYXRjaFsxXTsKYnJlYWs7Cn0KfQp9Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBnaXQgaWRlbnRpZmllciBkZXRlY3RlZC4gSWRlbnRpZmllciBtdXN0IG5vdCBzdGFydCB3aXRoIGEgLSwgZ2l2ZW46ICcgLiAkaWRlbnRpZmllcik7Cn0KCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3Nob3cnLCAkaWRlbnRpZmllci4nOicuJGZpbGVdLCAkY29udGVudCwgJHRoaXMtPnJlcG9EaXIpOwoKaWYgKHRyaW0oJGNvbnRlbnQpID09PSAnJykgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKJGNvbW1hbmQgPSBHaXRVdGlsOjpidWlsZFJldkxpc3RDb21tYW5kKCR0aGlzLT5wcm9jZXNzLCBbJy1uMScsICctLWZvcm1hdD0lYXQnLCAkaWRlbnRpZmllcl0pOwokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkY29tbWFuZCwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwoKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJ0AnLnRyaW0oR2l0VXRpbDo6cGFyc2VSZXZMaXN0T3V0cHV0KCRvdXRwdXQsICR0aGlzLT5wcm9jZXNzKSksIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT50YWdzKSB7CiR0aGlzLT50YWdzID0gW107CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdzaG93LXJlZicsICctLXRhZ3MnLCAnLS1kZXJlZmVyZW5jZSddLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICR0YWcpIHsKaWYgKCR0YWcgIT09ICcnICYmIFByZWc6OmlzTWF0Y2goJ3teKFthLWYwLTldezQwfSkgcmVmcy90YWdzLyhcUys/KShcXlx7XH0pPyR9JywgJHRhZywgJG1hdGNoKSkgewokdGhpcy0+dGFnc1skbWF0Y2hbMl1dID0gJG1hdGNoWzFdOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT50YWdzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPmJyYW5jaGVzKSB7CiRicmFuY2hlcyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnYnJhbmNoJywgJy0tbm8tY29sb3InLCAnLS1uby1hYmJyZXYnLCAnLXYnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICE9PSAnJyAmJiAhUHJlZzo6aXNNYXRjaCgne14gKlteL10rL0hFQUQgfScsICRicmFuY2gpKSB7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xig/OlwqICk/ICooXFMrKSAqKFthLWYwLTldKykoPzogLiopPyR9JywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYnJhbmNoZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9Cn0KCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmIChQcmVnOjppc01hdGNoKCcjKF5naXQ6Ly98XC5naXQvPyR8Z2l0KD86b2xpdGUpP0B8Ly9naXRcLnwvL2dpdGh1Yi5jb20vKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKJHVybCA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkdXJsKTsKaWYgKCFpc19kaXIoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKCmlmICgkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICd0YWcnXSwgJG91dHB1dCwgJHVybCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KR2l0VXRpbDo6Y2hlY2tGb3JSZXBvT3duZXJzaGlwRXJyb3IoJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICR1cmwpOwp9CgppZiAoISRkZWVwKSB7CnJldHVybiBmYWxzZTsKfQoKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiRnaXRVdGlsID0gbmV3IEdpdFV0aWwoJGlvLCAkY29uZmlnLCAkcHJvY2VzcywgbmV3IEZpbGVzeXN0ZW0oKSk7CkdpdFV0aWw6OmNsZWFuRW52KCRwcm9jZXNzKTsKCnRyeSB7CiRnaXRVdGlsLT5ydW5Db21tYW5kcyhbWydnaXQnLCAnbHMtcmVtb3RlJywgJy0taGVhZHMnLCAnLS0nLCAnJXVybCUnXV0sICR1cmwsIHN5c19nZXRfdGVtcF9kaXIoKSk7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcR2l0SHViOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKY2xhc3MgR2l0SHViRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkb3duZXI7Cgpwcm90ZWN0ZWQgJHJlcG9zaXRvcnk7Cgpwcm90ZWN0ZWQgJHRhZ3M7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzOwoKcHJvdGVjdGVkICRyb290SWRlbnRpZmllcjsKCnByb3RlY3RlZCAkcmVwb0RhdGE7Cgpwcm90ZWN0ZWQgJGhhc0lzc3VlcyA9IGZhbHNlOwoKcHJvdGVjdGVkICRpc1ByaXZhdGUgPSBmYWxzZTsKCnByaXZhdGUgJGlzQXJjaGl2ZWQgPSBmYWxzZTsKCnByaXZhdGUgJGZ1bmRpbmdJbmZvOwoKcHJpdmF0ZSAkYWxsb3dHaXRGYWxsYmFjayA9IHRydWU7CgoKCgoKCnByb3RlY3RlZCAkZ2l0RHJpdmVyID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoIVByZWc6OmlzTWF0Y2goJyNeKD86KD86aHR0cHM/fGdpdCk6Ly8oW14vXSspL3xnaXRAKFteOl0rKTovPykoW14vXSspLyhbXi9dKz8pKD86XC5naXR8Lyk/JCMnLCAkdGhpcy0+dXJsLCAkbWF0Y2gpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBHaXRIdWIgcmVwb3NpdG9yeSBVUkwgJXMgaXMgaW52YWxpZC4nLCAkdGhpcy0+dXJsKSk7Cn0KCiR0aGlzLT5vd25lciA9ICRtYXRjaFszXTsKJHRoaXMtPnJlcG9zaXRvcnkgPSAkbWF0Y2hbNF07CiR0aGlzLT5vcmlnaW5VcmwgPSBzdHJ0b2xvd2VyKCRtYXRjaFsxXSA/PyAoc3RyaW5nKSAkbWF0Y2hbMl0pOwppZiAoJHRoaXMtPm9yaWdpblVybCA9PT0gJ3d3dy5naXRodWIuY29tJykgewokdGhpcy0+b3JpZ2luVXJsID0gJ2dpdGh1Yi5jb20nOwp9CiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeSk7CiR0aGlzLT5jYWNoZS0+c2V0UmVhZE9ubHkoJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZWFkLW9ubHknKSk7CgppZiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ2FsbG93LWdpdC1mYWxsYmFjayddKSAmJiAkdGhpcy0+cmVwb0NvbmZpZ1snYWxsb3ctZ2l0LWZhbGxiYWNrJ10gPT09IGZhbHNlKSB7CiR0aGlzLT5hbGxvd0dpdEZhbGxiYWNrID0gZmFsc2U7Cn0KCmlmICgkdGhpcy0+Y29uZmlnLT5nZXQoJ3VzZS1naXRodWItYXBpJykgPT09IGZhbHNlIHx8IChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1snbm8tYXBpJ10pICYmICR0aGlzLT5yZXBvQ29uZmlnWyduby1hcGknXSkpIHsKJHRoaXMtPnNldHVwR2l0RHJpdmVyKCR0aGlzLT51cmwpOwoKcmV0dXJuOwp9CgokdGhpcy0+ZmV0Y2hSb290SWRlbnRpZmllcigpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb3NpdG9yeVVybCgpOiBzdHJpbmcKewpyZXR1cm4gJ2h0dHBzOi8vJy4kdGhpcy0+b3JpZ2luVXJsLicvJy4kdGhpcy0+b3duZXIuJy8nLiR0aGlzLT5yZXBvc2l0b3J5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCk7Cn0KCnJldHVybiAkdGhpcy0+cm9vdElkZW50aWZpZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldFVybCgpOwp9CgpyZXR1cm4gJ2h0dHBzOi8vJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBcGlVcmwoKTogc3RyaW5nCnsKaWYgKCdnaXRodWIuY29tJyA9PT0gJHRoaXMtPm9yaWdpblVybCkgewokYXBpVXJsID0gJ2FwaS5naXRodWIuY29tJzsKfSBlbHNlIHsKJGFwaVVybCA9ICR0aGlzLT5vcmlnaW5VcmwgLiAnL2FwaS92Myc7Cn0KCnJldHVybiAnaHR0cHM6Ly8nIC4gJGFwaVVybDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNvdXJjZShzdHJpbmcgJGlkZW50aWZpZXIpOiBhcnJheQp7CmlmICgkdGhpcy0+Z2l0RHJpdmVyKSB7CnJldHVybiAkdGhpcy0+Z2l0RHJpdmVyLT5nZXRTb3VyY2UoJGlkZW50aWZpZXIpOwp9CmlmICgkdGhpcy0+aXNQcml2YXRlKSB7CgoKJHVybCA9ICR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpOwp9IGVsc2UgewokdXJsID0gJHRoaXMtPmdldFVybCgpOwp9CgpyZXR1cm4gWyd0eXBlJyA9PiAnZ2l0JywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXJdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokdXJsID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy96aXBiYWxsLycuJGlkZW50aWZpZXI7CgpyZXR1cm4gWyd0eXBlJyA9PiAnemlwJywgJ3VybCcgPT4gJHVybCwgJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsICdzaGFzdW0nID0+ICcnXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyKSkgewokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9IGVsc2UgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllciwgSnNvbkZpbGU6OmVuY29kZSgkY29tcG9zZXIsIFxKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgXEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpKTsKfQp9CgppZiAoJGNvbXBvc2VyICE9PSBudWxsKSB7CgppZiAoaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J10pICYmICFpc19hcnJheSgkY29tcG9zZXJbJ3N1cHBvcnQnXSkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J10gPSBbXTsKfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSkpIHsKJGxhYmVsID0gYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+Z2V0VGFncygpKSA/OiBhcnJheV9zZWFyY2goJGlkZW50aWZpZXIsICR0aGlzLT5nZXRCcmFuY2hlcygpKSA/OiAkaWRlbnRpZmllcjsKJGNvbXBvc2VyWydzdXBwb3J0J11bJ3NvdXJjZSddID0gc3ByaW50ZignaHR0cHM6Ly8lcy8lcy8lcy90cmVlLyVzJywgJHRoaXMtPm9yaWdpblVybCwgJHRoaXMtPm93bmVyLCAkdGhpcy0+cmVwb3NpdG9yeSwgJGxhYmVsKTsKfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydpc3N1ZXMnXSkgJiYgJHRoaXMtPmhhc0lzc3VlcykgewokY29tcG9zZXJbJ3N1cHBvcnQnXVsnaXNzdWVzJ10gPSBzcHJpbnRmKCdodHRwczovLyVzLyVzLyVzL2lzc3VlcycsICR0aGlzLT5vcmlnaW5VcmwsICR0aGlzLT5vd25lciwgJHRoaXMtPnJlcG9zaXRvcnkpOwp9CmlmICghaXNzZXQoJGNvbXBvc2VyWydhYmFuZG9uZWQnXSkgJiYgJHRoaXMtPmlzQXJjaGl2ZWQpIHsKJGNvbXBvc2VyWydhYmFuZG9uZWQnXSA9IHRydWU7Cn0KaWYgKCFpc3NldCgkY29tcG9zZXJbJ2Z1bmRpbmcnXSkgJiYgJGZ1bmRpbmcgPSAkdGhpcy0+Z2V0RnVuZGluZ0luZm8oKSkgewokY29tcG9zZXJbJ2Z1bmRpbmcnXSA9ICRmdW5kaW5nOwp9Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RnVuZGluZ0luZm8oKQp7CmlmIChudWxsICE9PSAkdGhpcy0+ZnVuZGluZ0luZm8pIHsKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbzsKfQoKaWYgKCR0aGlzLT5vcmlnaW5VcmwgIT09ICdnaXRodWIuY29tJykgewpyZXR1cm4gJHRoaXMtPmZ1bmRpbmdJbmZvID0gZmFsc2U7Cn0KCmZvcmVhY2ggKFskdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nL2NvbnRlbnRzLy5naXRodWIvRlVORElORy55bWwnLCAkdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvLmdpdGh1Yi9jb250ZW50cy9GVU5ESU5HLnltbCddIGFzICRmaWxlKSB7CnRyeSB7CiRyZXNwb25zZSA9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCRmaWxlLCBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLApdKS0+ZGVjb2RlSnNvbigpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKY29udGludWU7Cn0KaWYgKGVtcHR5KCRyZXNwb25zZVsnY29udGVudCddKSB8fCAkcmVzcG9uc2VbJ2VuY29kaW5nJ10gIT09ICdiYXNlNjQnIHx8ICEoJGZ1bmRpbmcgPSBiYXNlNjRfZGVjb2RlKCRyZXNwb25zZVsnY29udGVudCddKSkpIHsKY29udGludWU7Cn0KYnJlYWs7Cn0KaWYgKGVtcHR5KCRmdW5kaW5nKSkgewpyZXR1cm4gJHRoaXMtPmZ1bmRpbmdJbmZvID0gZmFsc2U7Cn0KCiRyZXN1bHQgPSBbXTsKJGtleSA9IG51bGw7CmZvcmVhY2ggKFByZWc6OnNwbGl0KCd7XHI/XG59JywgJGZ1bmRpbmcpIGFzICRsaW5lKSB7CiRsaW5lID0gdHJpbSgkbGluZSk7CmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihcdyspXHMqOlxzKiguKykkfScsICRsaW5lLCAkbWF0Y2gpKSB7CmlmICgkbWF0Y2hbMl0gPT09ICdbJykgewoka2V5ID0gJG1hdGNoWzFdOwpjb250aW51ZTsKfQppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15cWyguKj8pXF0oPzpccyojLiopPyR9JywgJG1hdGNoWzJdLCAkbWF0Y2gyKSkgewpmb3JlYWNoIChhcnJheV9tYXAoJ3RyaW0nLCBQcmVnOjpzcGxpdCgne1tcJyJdP1xzKixccypbXCciXT99JywgJG1hdGNoMlsxXSkpIGFzICRpdGVtKSB7CiRyZXN1bHRbXSA9IFsndHlwZScgPT4gJG1hdGNoWzFdLCAndXJsJyA9PiB0cmltKCRpdGVtLCAnIlwnICcpXTsKfQp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oW14jXS4qPykoPzpccysjLiopPyR9JywgJG1hdGNoWzJdLCAkbWF0Y2gyKSkgewokcmVzdWx0W10gPSBbJ3R5cGUnID0+ICRtYXRjaFsxXSwgJ3VybCcgPT4gdHJpbSgkbWF0Y2gyWzFdLCAnIlwnICcpXTsKfQoka2V5ID0gbnVsbDsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKFx3Kylccyo6XHMqI1xzKiR9JywgJGxpbmUsICRtYXRjaCkpIHsKJGtleSA9ICRtYXRjaFsxXTsKfSBlbHNlaWYgKCRrZXkgIT09IG51bGwgJiYgKApQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xi1ccyooLispKD86XHMrIy4qKT8kfScsICRsaW5lLCAkbWF0Y2gpCnx8IFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKC4rKSwoPzpccyojLiopPyR9JywgJGxpbmUsICRtYXRjaCkKKSkgewokcmVzdWx0W10gPSBbJ3R5cGUnID0+ICRrZXksICd1cmwnID0+IHRyaW0oJG1hdGNoWzFdLCAnIlwnICcpXTsKfSBlbHNlaWYgKCRrZXkgIT09IG51bGwgJiYgJGxpbmUgPT09ICddJykgewoka2V5ID0gbnVsbDsKfQp9Cgpmb3JlYWNoICgkcmVzdWx0IGFzICRrZXkgPT4gJGl0ZW0pIHsKc3dpdGNoICgkaXRlbVsndHlwZSddKSB7CmNhc2UgJ2NvbW11bml0eV9icmlkZ2UnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2Z1bmRpbmcuY29tbXVuaXR5YnJpZGdlLm9yZy9wcm9qZWN0cy8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ2dpdGh1Yic6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ2lzc3VlaHVudCc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vaXNzdWVodW50LmlvL3IvJyAuICRpdGVtWyd1cmwnXTsKYnJlYWs7CmNhc2UgJ2tvX2ZpJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9rby1maS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdsaWJlcmFwYXknOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL2xpYmVyYXBheS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICdvcGVuX2NvbGxlY3RpdmUnOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ3BhdHJlb24nOgokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovL3d3dy5wYXRyZW9uLmNvbS8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ3RpZGVsaWZ0JzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvJyAuICRpdGVtWyd1cmwnXTsKYnJlYWs7CmNhc2UgJ3BvbGFyJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9wb2xhci5zaC8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ2J1eV9tZV9hX2NvZmZlZSc6CiRyZXN1bHRbJGtleV1bJ3VybCddID0gJ2h0dHBzOi8vd3d3LmJ1eW1lYWNvZmZlZS5jb20vJyAuIGJhc2VuYW1lKCRpdGVtWyd1cmwnXSk7CmJyZWFrOwpjYXNlICd0aGFua3NfZGV2JzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly90aGFua3MuZGV2LycgLiAkaXRlbVsndXJsJ107CmJyZWFrOwpjYXNlICdvdGVjaGllJzoKJHJlc3VsdFska2V5XVsndXJsJ10gPSAnaHR0cHM6Ly9vdGVjaGllLmNvbS8nIC4gYmFzZW5hbWUoJGl0ZW1bJ3VybCddKTsKYnJlYWs7CmNhc2UgJ2N1c3RvbSc6CiRiaXRzID0gcGFyc2VfdXJsKCRpdGVtWyd1cmwnXSk7CmlmICgkYml0cyA9PT0gZmFsc2UpIHsKdW5zZXQoJHJlc3VsdFska2V5XSk7CmJyZWFrOwp9CgppZiAoIWFycmF5X2tleV9leGlzdHMoJ3NjaGVtZScsICRiaXRzKSAmJiAhYXJyYXlfa2V5X2V4aXN0cygnaG9zdCcsICRiaXRzKSkgewppZiAoUHJlZzo6aXNNYXRjaCgne15bYS16MC05LV0rK1wuW2Etel17MiwzfSR9JywgJGl0ZW1bJ3VybCddKSkgewokcmVzdWx0WyRrZXldWyd1cmwnXSA9ICdodHRwczovLycuJGl0ZW1bJ3VybCddOwpicmVhazsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5GdW5kaW5nIFVSTCAnLiRpdGVtWyd1cmwnXS4nIG5vdCBpbiBhIHN1cHBvcnRlZCBmb3JtYXQuPC93YXJuaW5nPicpOwp1bnNldCgkcmVzdWx0WyRrZXldKTsKYnJlYWs7Cn0KYnJlYWs7Cn0KfQoKcmV0dXJuICR0aGlzLT5mdW5kaW5nSW5mbyA9ICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0RmlsZUNvbnRlbnQoJGZpbGUsICRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9jb250ZW50cy8nIC4gJGZpbGUgLiAnP3JlZj0nLnVybGVuY29kZSgkaWRlbnRpZmllcik7CiRyZXNvdXJjZSA9ICR0aGlzLT5nZXRDb250ZW50cygkcmVzb3VyY2UpLT5kZWNvZGVKc29uKCk7CgoKCmlmICgoIWlzc2V0KCRyZXNvdXJjZVsnY29udGVudCddKSB8fCAkcmVzb3VyY2VbJ2NvbnRlbnQnXSA9PT0gJycpICYmICRyZXNvdXJjZVsnZW5jb2RpbmcnXSA9PT0gJ25vbmUnICYmIGlzc2V0KCRyZXNvdXJjZVsnZ2l0X3VybCddKSkgewokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlWydnaXRfdXJsJ10pLT5kZWNvZGVKc29uKCk7Cn0KCmlmICghaXNzZXQoJHJlc291cmNlWydjb250ZW50J10pIHx8ICRyZXNvdXJjZVsnZW5jb2RpbmcnXSAhPT0gJ2Jhc2U2NCcgfHwgZmFsc2UgPT09ICgkY29udGVudCA9IGJhc2U2NF9kZWNvZGUoJHJlc291cmNlWydjb250ZW50J10pKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCByZXRyaWV2ZSAnIC4gJGZpbGUgLiAnIGZvciAnLiRpZGVudGlmaWVyKTsKfQoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENoYW5nZURhdGUoJGlkZW50aWZpZXIpOwp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nL2NvbW1pdHMvJy51cmxlbmNvZGUoJGlkZW50aWZpZXIpOwokY29tbWl0ID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSktPmRlY29kZUpzb24oKTsKCnJldHVybiBuZXcgXERhdGVUaW1lSW1tdXRhYmxlKCRjb21taXRbJ2NvbW1pdCddWydjb21taXR0ZXInXVsnZGF0ZSddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewppZiAoJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm4gJHRoaXMtPmdpdERyaXZlci0+Z2V0VGFncygpOwp9CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCkgLiAnL3JlcG9zLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nL3RhZ3M/cGVyX3BhZ2U9MTAwJzsKCmRvIHsKJHJlc3BvbnNlID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSk7CiR0YWdzRGF0YSA9ICRyZXNwb25zZS0+ZGVjb2RlSnNvbigpOwpmb3JlYWNoICgkdGFnc0RhdGEgYXMgJHRhZykgewokdGFnc1skdGFnWyduYW1lJ11dID0gJHRhZ1snY29tbWl0J11bJ3NoYSddOwp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSB3aGlsZSAoJHJlc291cmNlKTsKCiR0aGlzLT50YWdzID0gJHRhZ3M7Cn0KCnJldHVybiAkdGhpcy0+dGFnczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldEJyYW5jaGVzKCk7Cn0KaWYgKG51bGwgPT09ICR0aGlzLT5icmFuY2hlcykgewokYnJhbmNoZXMgPSBbXTsKJHJlc291cmNlID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy9naXQvcmVmcy9oZWFkcz9wZXJfcGFnZT0xMDAnOwoKZG8gewokcmVzcG9uc2UgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlc291cmNlKTsKJGJyYW5jaERhdGEgPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKZm9yZWFjaCAoJGJyYW5jaERhdGEgYXMgJGJyYW5jaCkgewokbmFtZSA9IHN1YnN0cigkYnJhbmNoWydyZWYnXSwgMTEpOwppZiAoJG5hbWUgIT09ICdnaC1wYWdlcycpIHsKJGJyYW5jaGVzWyRuYW1lXSA9ICRicmFuY2hbJ29iamVjdCddWydzaGEnXTsKfQp9CgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSB3aGlsZSAoJHJlc291cmNlKTsKCiR0aGlzLT5icmFuY2hlcyA9ICRicmFuY2hlczsKfQoKcmV0dXJuICR0aGlzLT5icmFuY2hlczsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICghUHJlZzo6aXNNYXRjaCgnI14oKD86aHR0cHM/fGdpdCk6Ly8oW14vXSspL3xnaXRAKFteOl0rKTovPykoW14vXSspLyhbXi9dKz8pKD86XC5naXR8Lyk/JCMnLCAkdXJsLCAkbWF0Y2hlcykpIHsKcmV0dXJuIGZhbHNlOwp9Cgokb3JpZ2luVXJsID0gJG1hdGNoZXNbMl0gPz8gKHN0cmluZykgJG1hdGNoZXNbM107CmlmICghaW5fYXJyYXkoc3RydG9sb3dlcihQcmVnOjpyZXBsYWNlKCd7Xnd3d1wufWknLCAnJywgJG9yaWdpblVybCkpLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFleHRlbnNpb25fbG9hZGVkKCdvcGVuc3NsJykpIHsKJGlvLT53cml0ZUVycm9yKCdTa2lwcGluZyBHaXRIdWIgZHJpdmVyIGZvciAnLiR1cmwuJyBiZWNhdXNlIHRoZSBPcGVuU1NMIFBIUCBleHRlbnNpb24gaXMgbWlzc2luZy4nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CgpyZXR1cm4gZmFsc2U7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSZXBvRGF0YSgpOiA/YXJyYXkKewokdGhpcy0+ZmV0Y2hSb290SWRlbnRpZmllcigpOwoKcmV0dXJuICR0aGlzLT5yZXBvRGF0YTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CmlmIChmYWxzZSAhPT0gc3RycG9zKCR0aGlzLT5vcmlnaW5VcmwsICc6JykpIHsKcmV0dXJuICdzc2g6Ly9naXRAJyAuICR0aGlzLT5vcmlnaW5VcmwgLiAnLycuJHRoaXMtPm93bmVyLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICR1cmwsIGJvb2wgJGZldGNoaW5nUmVwb0RhdGEgPSBmYWxzZSk6IFJlc3BvbnNlCnsKdHJ5IHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokZ2l0SHViVXRpbCA9IG5ldyBHaXRIdWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCnN3aXRjaCAoJGUtPmdldENvZGUoKSkgewpjYXNlIDQwMToKY2FzZSA0MDQ6CgppZiAoISRmZXRjaGluZ1JlcG9EYXRhKSB7CnRocm93ICRlOwp9CgppZiAoJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygkZSk7CgpyZXR1cm4gbmV3IFJlc3BvbnNlKFsndXJsJyA9PiAnZHVtbXknXSwgMjAwLCBbXSwgJ251bGwnKTsKfQoKJHNjb3Blc0lzc3VlZCA9IFtdOwokc2NvcGVzTmVlZGVkID0gW107CmlmICgkaGVhZGVycyA9ICRlLT5nZXRIZWFkZXJzKCkpIHsKaWYgKCRzY29wZXMgPSBSZXNwb25zZTo6ZmluZEhlYWRlclZhbHVlKCRoZWFkZXJzLCAnWC1PQXV0aC1TY29wZXMnKSkgewokc2NvcGVzSXNzdWVkID0gZXhwbG9kZSgnICcsICRzY29wZXMpOwp9CmlmICgkc2NvcGVzID0gUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaGVhZGVycywgJ1gtQWNjZXB0ZWQtT0F1dGgtU2NvcGVzJykpIHsKJHNjb3Blc05lZWRlZCA9IGV4cGxvZGUoJyAnLCAkc2NvcGVzKTsKfQp9CiRzY29wZXNGYWlsZWQgPSBhcnJheV9kaWZmKCRzY29wZXNOZWVkZWQsICRzY29wZXNJc3N1ZWQpOwoKCmlmICghJGhlYWRlcnMgfHwgIWNvdW50KCRzY29wZXNOZWVkZWQpIHx8IGNvdW50KCRzY29wZXNGYWlsZWQpKSB7CiRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJHRoaXMtPm9yaWdpblVybCwgJ1lvdXIgR2l0SHViIGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCB0byBmZXRjaCBwcml2YXRlIHJlcG9zaXRvcnkgbWV0YWRhdGEgKDxpbmZvPicuJHRoaXMtPnVybC4nPC9pbmZvPiknKTsKfQoKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7CgpjYXNlIDQwMzoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCR0aGlzLT5vcmlnaW5VcmwpICYmICRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aCgkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSAmJiAkZmV0Y2hpbmdSZXBvRGF0YSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soJGUpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KCiRyYXRlTGltaXRlZCA9ICRnaXRIdWJVdGlsLT5pc1JhdGVMaW1pdGVkKChhcnJheSkgJGUtPmdldEhlYWRlcnMoKSk7CgppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkpIHsKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5HaXRIdWIgQVBJIGxpbWl0IGV4aGF1c3RlZC4gRmFpbGVkIHRvIGdldCBtZXRhZGF0YSBmb3IgdGhlICcuJHRoaXMtPnVybC4nIHJlcG9zaXRvcnksIHRyeSBydW5uaW5nIGluIGludGVyYWN0aXZlIG1vZGUgc28gdGhhdCB5b3UgY2FuIGVudGVyIHlvdXIgR2l0SHViIGNyZWRlbnRpYWxzIHRvIGluY3JlYXNlIHRoZSBBUEkgbGltaXQ8L2Vycm9yPicpOwp0aHJvdyAkZTsKfQoKJGdpdEh1YlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkdGhpcy0+b3JpZ2luVXJsLCAnQVBJIGxpbWl0IGV4aGF1c3RlZC4gRW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHMgdG8gZ2V0IGEgbGFyZ2VyIEFQSSBsaW1pdCAoPGluZm8+Jy4kdGhpcy0+dXJsLic8L2luZm8+KScpOwoKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICgkcmF0ZUxpbWl0ZWQpIHsKJHJhdGVMaW1pdCA9ICRnaXRIdWJVdGlsLT5nZXRSYXRlTGltaXQoJGUtPmdldEhlYWRlcnMoKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKAonPGVycm9yPkdpdEh1YiBBUEkgbGltaXQgKCVkIGNhbGxzL2hyKSBpcyBleGhhdXN0ZWQuIFlvdSBhcmUgYWxyZWFkeSBhdXRob3JpemVkIHNvIHlvdSBoYXZlIHRvIHdhaXQgdW50aWwgJXMgYmVmb3JlIGRvaW5nIG1vcmUgcmVxdWVzdHM8L2Vycm9yPicsCiRyYXRlTGltaXRbJ2xpbWl0J10sCiRyYXRlTGltaXRbJ3Jlc2V0J10KKSk7Cn0KCnRocm93ICRlOwoKZGVmYXVsdDoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBmZXRjaFJvb3RJZGVudGlmaWVyKCk6IHZvaWQKewppZiAoJHRoaXMtPnJlcG9EYXRhKSB7CnJldHVybjsKfQoKJHJlcG9EYXRhVXJsID0gJHRoaXMtPmdldEFwaVVybCgpIC4gJy9yZXBvcy8nLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnk7Cgp0cnkgewokdGhpcy0+cmVwb0RhdGEgPSAkdGhpcy0+Z2V0Q29udGVudHMoJHJlcG9EYXRhVXJsLCB0cnVlKS0+ZGVjb2RlSnNvbigpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQ5OSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soJGUpOwp9IGVsc2Ugewp0aHJvdyAkZTsKfQp9CmlmIChudWxsID09PSAkdGhpcy0+cmVwb0RhdGEgJiYgbnVsbCAhPT0gJHRoaXMtPmdpdERyaXZlcikgewpyZXR1cm47Cn0KCiR0aGlzLT5vd25lciA9ICR0aGlzLT5yZXBvRGF0YVsnb3duZXInXVsnbG9naW4nXTsKJHRoaXMtPnJlcG9zaXRvcnkgPSAkdGhpcy0+cmVwb0RhdGFbJ25hbWUnXTsKCiR0aGlzLT5pc1ByaXZhdGUgPSAhZW1wdHkoJHRoaXMtPnJlcG9EYXRhWydwcml2YXRlJ10pOwppZiAoaXNzZXQoJHRoaXMtPnJlcG9EYXRhWydkZWZhdWx0X2JyYW5jaCddKSkgewokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkdGhpcy0+cmVwb0RhdGFbJ2RlZmF1bHRfYnJhbmNoJ107Cn0gZWxzZWlmIChpc3NldCgkdGhpcy0+cmVwb0RhdGFbJ21hc3Rlcl9icmFuY2gnXSkpIHsKJHRoaXMtPnJvb3RJZGVudGlmaWVyID0gJHRoaXMtPnJlcG9EYXRhWydtYXN0ZXJfYnJhbmNoJ107Cn0gZWxzZSB7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICdtYXN0ZXInOwp9CiR0aGlzLT5oYXNJc3N1ZXMgPSAhZW1wdHkoJHRoaXMtPnJlcG9EYXRhWydoYXNfaXNzdWVzJ10pOwokdGhpcy0+aXNBcmNoaXZlZCA9ICFlbXB0eSgkdGhpcy0+cmVwb0RhdGFbJ2FyY2hpdmVkJ10pOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0ZW1wdENsb25lRmFsbGJhY2soP1xUaHJvd2FibGUgJGUgPSBudWxsKTogYm9vbAp7CmlmICghJHRoaXMtPmFsbG93R2l0RmFsbGJhY2spIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWxsYmFjayB0byBnaXQgZHJpdmVyIGRpc2FibGVkJywgMCwgJGUpOwp9CgokdGhpcy0+aXNQcml2YXRlID0gdHJ1ZTsKCnRyeSB7CgoKCgokdGhpcy0+c2V0dXBHaXREcml2ZXIoJHRoaXMtPmdlbmVyYXRlU3NoVXJsKCkpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5naXREcml2ZXIgPSBudWxsOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIGNsb25lIHRoZSAnLiR0aGlzLT5nZW5lcmF0ZVNzaFVybCgpLicgcmVwb3NpdG9yeSwgdHJ5IHJ1bm5pbmcgaW4gaW50ZXJhY3RpdmUgbW9kZSBzbyB0aGF0IHlvdSBjYW4gZW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHM8L2Vycm9yPicpOwp0aHJvdyAkZTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gc2V0dXBHaXREcml2ZXIoc3RyaW5nICR1cmwpOiB2b2lkCnsKaWYgKCEkdGhpcy0+YWxsb3dHaXRGYWxsYmFjaykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0ZhbGxiYWNrIHRvIGdpdCBkcml2ZXIgZGlzYWJsZWQnKTsKfQokdGhpcy0+Z2l0RHJpdmVyID0gbmV3IEdpdERyaXZlcigKWyd1cmwnID0+ICR1cmxdLAokdGhpcy0+aW8sCiR0aGlzLT5jb25maWcsCiR0aGlzLT5odHRwRG93bmxvYWRlciwKJHRoaXMtPnByb2Nlc3MKKTsKJHRoaXMtPmdpdERyaXZlci0+aW5pdGlhbGl6ZSgpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TmV4dFBhZ2UoUmVzcG9uc2UgJHJlc3BvbnNlKTogP3N0cmluZwp7CiRoZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGluaycpOwppZiAoISRoZWFkZXIpIHsKcmV0dXJuIG51bGw7Cn0KCiRsaW5rcyA9IGV4cGxvZGUoJywnLCAkaGVhZGVyKTsKZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CmlmIChQcmVnOjppc01hdGNoKCd7PCguKz8pPjsgKnJlbD0ibmV4dCJ9JywgJGxpbmssICRtYXRjaCkpIHsKcmV0dXJuICRtYXRjaFsxXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcSnNvblxKc29uRmlsZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXFV0aWxcR2l0TGFiOwp1c2UgQ29tcG9zZXJcVXRpbFxIdHRwXFJlc3BvbnNlOwoKCgoKCgoKY2xhc3MgR2l0TGFiRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCgoKCnByaXZhdGUgJHNjaGVtZTsKCnByaXZhdGUgJG5hbWVzcGFjZTsKCnByaXZhdGUgJHJlcG9zaXRvcnk7CgoKCgpwcml2YXRlICRwcm9qZWN0ID0gbnVsbDsKCgoKCnByaXZhdGUgJGNvbW1pdHMgPSBbXTsKCgpwcml2YXRlICR0YWdzOwoKCnByaXZhdGUgJGJyYW5jaGVzOwoKCgoKCgpwcm90ZWN0ZWQgJGdpdERyaXZlciA9IG51bGw7CgoKCgoKCnByb3RlY3RlZCAkcHJvdG9jb2w7CgoKCgoKCnByaXZhdGUgJGlzUHJpdmF0ZSA9IHRydWU7CgoKCgpwcml2YXRlICRoYXNOb25zdGFuZGFyZE9yaWdpbiA9IGZhbHNlOwoKcHVibGljIGNvbnN0IFVSTF9SRUdFWCA9ICcjXig/Oig/UDxzY2hlbWU+aHR0cHM/KTovLyg/UDxkb21haW4+Lis/KSg/OjooP1A8cG9ydD5bMC05XSspKT8vfGdpdEAoP1A8ZG9tYWluMj5bXjpdKyk6KSg/UDxwYXJ0cz4uKykvKD9QPHJlcG8+W14vXSs/KSg/OlwuZ2l0fC8pPyQjJzsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpOiB2b2lkCnsKaWYgKCFQcmVnOjppc01hdGNoKHNlbGY6OlVSTF9SRUdFWCwgJHRoaXMtPnVybCwgJG1hdGNoKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgR2l0TGFiIHJlcG9zaXRvcnkgVVJMICVzIGlzIGludmFsaWQuIEl0IG11c3QgYmUgdGhlIEhUVFAgVVJMIG9mIGEgR2l0TGFiIHByb2plY3QuJywgJHRoaXMtPnVybCkpOwp9CgokZ3Vlc3NlZERvbWFpbiA9ICRtYXRjaFsnZG9tYWluJ10gPz8gKHN0cmluZykgJG1hdGNoWydkb21haW4yJ107CiRjb25maWd1cmVkRG9tYWlucyA9ICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKTsKJHVybFBhcnRzID0gZXhwbG9kZSgnLycsICRtYXRjaFsncGFydHMnXSk7CgokdGhpcy0+c2NoZW1lID0gaW5fYXJyYXkoJG1hdGNoWydzY2hlbWUnXSwgWydodHRwcycsICdodHRwJ10sIHRydWUpCj8gJG1hdGNoWydzY2hlbWUnXQo6IChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1snc2VjdXJlLWh0dHAnXSkgJiYgJHRoaXMtPnJlcG9Db25maWdbJ3NlY3VyZS1odHRwJ10gPT09IGZhbHNlID8gJ2h0dHAnIDogJ2h0dHBzJykKOwokb3JpZ2luID0gc2VsZjo6ZGV0ZXJtaW5lT3JpZ2luKCRjb25maWd1cmVkRG9tYWlucywgJGd1ZXNzZWREb21haW4sICR1cmxQYXJ0cywgJG1hdGNoWydwb3J0J10pOwppZiAoZmFsc2UgPT09ICRvcmlnaW4pIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignSXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBjcmVhdGUgYSBnaXRsYWIgZHJpdmVyIHdpdGggYW4gdW5wYXJzYWJsZSBvcmlnaW4gVVJMICgnLiR0aGlzLT51cmwuJyknKTsKfQokdGhpcy0+b3JpZ2luVXJsID0gJG9yaWdpbjsKCmlmIChpc19zdHJpbmcoJHByb3RvY29sID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItcHJvdG9jb2wnKSkpIHsKCmlmICghaW5fYXJyYXkoJHByb3RvY29sLCBbJ2dpdCcsICdodHRwJywgJ2h0dHBzJ10sIHRydWUpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignZ2l0bGFiLXByb3RvY29sIG11c3QgYmUgb25lIG9mIGdpdCwgaHR0cC4nKTsKfQokdGhpcy0+cHJvdG9jb2wgPSAkcHJvdG9jb2wgPT09ICdnaXQnID8gJ3NzaCcgOiAnaHR0cCc7Cn0KCmlmIChmYWxzZSAhPT0gc3RycG9zKCR0aGlzLT5vcmlnaW5VcmwsICc6JykgfHwgZmFsc2UgIT09IHN0cnBvcygkdGhpcy0+b3JpZ2luVXJsLCAnLycpKSB7CiR0aGlzLT5oYXNOb25zdGFuZGFyZE9yaWdpbiA9IHRydWU7Cn0KCiR0aGlzLT5uYW1lc3BhY2UgPSBpbXBsb2RlKCcvJywgJHVybFBhcnRzKTsKJHRoaXMtPnJlcG9zaXRvcnkgPSBQcmVnOjpyZXBsYWNlKCcjKFwuZ2l0KSQjJywgJycsICRtYXRjaFsncmVwbyddKTsKCiR0aGlzLT5jYWNoZSA9IG5ldyBDYWNoZSgkdGhpcy0+aW8sICR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVwby1kaXInKS4nLycuJHRoaXMtPm9yaWdpblVybC4nLycuJHRoaXMtPm5hbWVzcGFjZS4nLycuJHRoaXMtPnJlcG9zaXRvcnkpOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwoKJHRoaXMtPmZldGNoUHJvamVjdCgpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SHR0cERvd25sb2FkZXIoSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyKTogdm9pZAp7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCR0aGlzLT5naXREcml2ZXIpIHsKcmV0dXJuICR0aGlzLT5naXREcml2ZXItPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyKSkgewokY29tcG9zZXIgPSBKc29uRmlsZTo6cGFyc2VKc29uKCRyZXMpOwp9IGVsc2UgewokY29tcG9zZXIgPSAkdGhpcy0+Z2V0QmFzZUNvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwoKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikpIHsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllciwgSnNvbkZpbGU6OmVuY29kZSgkY29tcG9zZXIsIFxKU09OX1VORVNDQVBFRF9VTklDT0RFIHwgXEpTT05fVU5FU0NBUEVEX1NMQVNIRVMpKTsKfQp9CgppZiAobnVsbCAhPT0gJGNvbXBvc2VyKSB7CgppZiAoaXNzZXQoJGNvbXBvc2VyWydzdXBwb3J0J10pICYmICFpc19hcnJheSgkY29tcG9zZXJbJ3N1cHBvcnQnXSkpIHsKJGNvbXBvc2VyWydzdXBwb3J0J10gPSBbXTsKfQppZiAoIWlzc2V0KCRjb21wb3Nlclsnc3VwcG9ydCddWydzb3VyY2UnXSkgJiYgaXNzZXQoJHRoaXMtPnByb2plY3RbJ3dlYl91cmwnXSkpIHsKJGxhYmVsID0gYXJyYXlfc2VhcmNoKCRpZGVudGlmaWVyLCAkdGhpcy0+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+Z2V0TmV4dFBhZ2UoJHJlc3BvbnNlKTsKfSBlbHNlIHsKJHJlc291cmNlID0gZmFsc2U7Cn0KfSB3aGlsZSAoJHJlc291cmNlKTsKCnJldHVybiAkcmVmZXJlbmNlczsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZldGNoUHJvamVjdCgpOiB2b2lkCnsKaWYgKCFpc19udWxsKCR0aGlzLT5wcm9qZWN0KSkgewpyZXR1cm47Cn0KCgokcmVzb3VyY2UgPSAkdGhpcy0+Z2V0QXBpVXJsKCk7CiR0aGlzLT5wcm9qZWN0ID0gJHRoaXMtPmdldENvbnRlbnRzKCRyZXNvdXJjZSwgdHJ1ZSktPmRlY29kZUpzb24oKTsKaWYgKGlzc2V0KCR0aGlzLT5wcm9qZWN0Wyd2aXNpYmlsaXR5J10pKSB7CiR0aGlzLT5pc1ByaXZhdGUgPSAkdGhpcy0+cHJvamVjdFsndmlzaWJpbGl0eSddICE9PSAncHVibGljJzsKfSBlbHNlIHsKCiR0aGlzLT5pc1ByaXZhdGUgPSBmYWxzZTsKfQp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYXR0ZW1wdENsb25lRmFsbGJhY2soKTogYm9vbAp7CmlmICgkdGhpcy0+aXNQcml2YXRlID09PSBmYWxzZSkgewokdXJsID0gJHRoaXMtPmdlbmVyYXRlUHVibGljVXJsKCk7Cn0gZWxzZSB7CiR1cmwgPSAkdGhpcy0+Z2VuZXJhdGVTc2hVcmwoKTsKfQoKdHJ5IHsKCgoKJHRoaXMtPnNldHVwR2l0RHJpdmVyKCR1cmwpOwoKcmV0dXJuIHRydWU7Cn0gY2F0Y2ggKFxSdW50aW1lRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5naXREcml2ZXIgPSBudWxsOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+RmFpbGVkIHRvIGNsb25lIHRoZSAnLiR1cmwuJyByZXBvc2l0b3J5LCB0cnkgcnVubmluZyBpbiBpbnRlcmFjdGl2ZSBtb2RlIHNvIHRoYXQgeW91IGNhbiBlbnRlciB5b3VyIGNyZWRlbnRpYWxzPC9lcnJvcj4nKTsKdGhyb3cgJGU7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+aGFzTm9uc3RhbmRhcmRPcmlnaW4pIHsKcmV0dXJuICdzc2g6Ly9naXRAJy4kdGhpcy0+b3JpZ2luVXJsLicvJy4kdGhpcy0+bmFtZXNwYWNlLicvJy4kdGhpcy0+cmVwb3NpdG9yeS4nLmdpdCc7Cn0KCnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonLiR0aGlzLT5uYW1lc3BhY2UuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicuZ2l0JzsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdlbmVyYXRlUHVibGljVXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c2NoZW1lIC4gJzovLycgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJy8nLiR0aGlzLT5uYW1lc3BhY2UuJy8nLiR0aGlzLT5yZXBvc2l0b3J5LicuZ2l0JzsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNldHVwR2l0RHJpdmVyKHN0cmluZyAkdXJsKTogdm9pZAp7CiR0aGlzLT5naXREcml2ZXIgPSBuZXcgR2l0RHJpdmVyKApbJ3VybCcgPT4gJHVybF0sCiR0aGlzLT5pbywKJHRoaXMtPmNvbmZpZywKJHRoaXMtPmh0dHBEb3dubG9hZGVyLAokdGhpcy0+cHJvY2VzcwopOwokdGhpcy0+Z2l0RHJpdmVyLT5pbml0aWFsaXplKCk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb250ZW50cyhzdHJpbmcgJHVybCwgYm9vbCAkZmV0Y2hpbmdSZXBvRGF0YSA9IGZhbHNlKTogUmVzcG9uc2UKewp0cnkgewokcmVzcG9uc2UgPSBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwoKaWYgKCRmZXRjaGluZ1JlcG9EYXRhKSB7CiRqc29uID0gJHJlc3BvbnNlLT5kZWNvZGVKc29uKCk7CgoKCgppZiAoIWlzc2V0KCRqc29uWydkZWZhdWx0X2JyYW5jaCddKSAmJiBpc3NldCgkanNvblsncGVybWlzc2lvbnMnXSkpIHsKJHRoaXMtPmlzUHJpdmF0ZSA9ICRqc29uWyd2aXNpYmlsaXR5J10gIT09ICdwdWJsaWMnOwoKJG1vcmVUaGFuR3Vlc3RBY2Nlc3MgPSBmYWxzZTsKCgoKZm9yZWFjaCAoJGpzb25bJ3Blcm1pc3Npb25zJ10gYXMgJHBlcm1pc3Npb24pIHsKaWYgKCRwZXJtaXNzaW9uICYmICRwZXJtaXNzaW9uWydhY2Nlc3NfbGV2ZWwnXSA+PSAyMCkgewokbW9yZVRoYW5HdWVzdEFjY2VzcyA9IHRydWU7Cn0KfQoKaWYgKCEkbW9yZVRoYW5HdWVzdEFjY2VzcykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkdpdExhYiB0b2tlbiB3aXRoIEd1ZXN0IG9yIFBsYW5uZXIgb25seSBhY2Nlc3MgZGV0ZWN0ZWQ8L3dhcm5pbmc+Jyk7CgokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9Cn0KCgppZiAoIWlzc2V0KCRqc29uWydkZWZhdWx0X2JyYW5jaCddKSkgewoKaWYgKGlzc2V0KCRqc29uWydyZXBvc2l0b3J5X2FjY2Vzc19sZXZlbCddKSAmJiAkanNvblsncmVwb3NpdG9yeV9hY2Nlc3NfbGV2ZWwnXSA9PT0gJ2Rpc2FibGVkJykgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgR2l0TGFiIHJlcG9zaXRvcnkgaXMgZGlzYWJsZWQgaW4gdGhlIHByb2plY3QnLCA0MDApOwp9CgppZiAoIWVtcHR5KCRqc29uWydpZCddKSkgewokdGhpcy0+aXNQcml2YXRlID0gZmFsc2U7Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0dpdExhYiBBUEkgc2VlbXMgdG8gbm90IGJlIGF1dGhlbnRpY2F0ZWQgYXMgaXQgZGlkIG5vdCByZXR1cm4gYSBkZWZhdWx0X2JyYW5jaCcsIDQwMSk7Cn0KfQoKcmV0dXJuICRyZXNwb25zZTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRnaXRMYWJVdGlsID0gbmV3IEdpdExhYigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzLCAkdGhpcy0+aHR0cERvd25sb2FkZXIpOwoKc3dpdGNoICgkZS0+Z2V0Q29kZSgpKSB7CmNhc2UgNDAxOgpjYXNlIDQwNDoKCmlmICghJGZldGNoaW5nUmVwb0RhdGEpIHsKdGhyb3cgJGU7Cn0KCmlmICgkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGgoJHRoaXMtPm9yaWdpblVybCkpIHsKcmV0dXJuIHBhcmVudDo6Z2V0Q29udGVudHMoJHVybCk7Cn0KCmlmICgkZ2l0TGFiVXRpbC0+aXNPQXV0aEV4cGlyZWQoJHRoaXMtPm9yaWdpblVybCkgJiYgJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoUmVmcmVzaCgkdGhpcy0+c2NoZW1lLCAkdGhpcy0+b3JpZ2luVXJsKSkgewpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKfQoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokdGhpcy0+YXR0ZW1wdENsb25lRmFsbGJhY2soKTsKCnJldHVybiBuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICdkdW1teSddLCAyMDAsIFtdLCAnbnVsbCcpOwp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+RmFpbGVkIHRvIGRvd25sb2FkICcgLiAkdGhpcy0+bmFtZXNwYWNlIC4gJy8nIC4gJHRoaXMtPnJlcG9zaXRvcnkgLiAnOicgLiAkZS0+Z2V0TWVzc2FnZSgpIC4gJzwvd2FybmluZz4nKTsKJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkdGhpcy0+c2NoZW1lLCAkdGhpcy0+b3JpZ2luVXJsLCAnWW91ciBjcmVkZW50aWFscyBhcmUgcmVxdWlyZWQgdG8gZmV0Y2ggcHJpdmF0ZSByZXBvc2l0b3J5IG1ldGFkYXRhICg8aW5mbz4nLiR0aGlzLT51cmwuJzwvaW5mbz4pJyk7CgpyZXR1cm4gcGFyZW50OjpnZXRDb250ZW50cygkdXJsKTsKCmNhc2UgNDAzOgppZiAoISR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJHRoaXMtPm9yaWdpblVybCkgJiYgJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoKCR0aGlzLT5vcmlnaW5VcmwpKSB7CnJldHVybiBwYXJlbnQ6OmdldENvbnRlbnRzKCR1cmwpOwp9CgppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpICYmICRmZXRjaGluZ1JlcG9EYXRhKSB7CiR0aGlzLT5hdHRlbXB0Q2xvbmVGYWxsYmFjaygpOwoKcmV0dXJuIG5ldyBSZXNwb25zZShbJ3VybCcgPT4gJ2R1bW15J10sIDIwMCwgW10sICdudWxsJyk7Cn0KCnRocm93ICRlOwoKZGVmYXVsdDoKdGhyb3cgJGU7Cn0KfQp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sCnsKaWYgKCFQcmVnOjppc01hdGNoKHNlbGY6OlVSTF9SRUdFWCwgJHVybCwgJG1hdGNoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzY2hlbWUgPSAkbWF0Y2hbJ3NjaGVtZSddOwokZ3Vlc3NlZERvbWFpbiA9ICRtYXRjaFsnZG9tYWluJ10gPz8gKHN0cmluZykgJG1hdGNoWydkb21haW4yJ107CiR1cmxQYXJ0cyA9IGV4cGxvZGUoJy8nLCAkbWF0Y2hbJ3BhcnRzJ10pOwoKaWYgKGZhbHNlID09PSBzZWxmOjpkZXRlcm1pbmVPcmlnaW4oJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCAkZ3Vlc3NlZERvbWFpbiwgJHVybFBhcnRzLCAkbWF0Y2hbJ3BvcnQnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJ2h0dHBzJyA9PT0gJHNjaGVtZSAmJiAhZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CiRpby0+d3JpdGVFcnJvcignU2tpcHBpbmcgR2l0TGFiIGRyaXZlciBmb3IgJy4kdXJsLicgYmVjYXVzZSB0aGUgT3BlblNTTCBQSFAgZXh0ZW5zaW9uIGlzIG1pc3NpbmcuJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUkJPU0UpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmVwb0RhdGEoKTogP2FycmF5CnsKJHRoaXMtPmZldGNoUHJvamVjdCgpOwoKcmV0dXJuICR0aGlzLT5wcm9qZWN0Owp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0TmV4dFBhZ2UoUmVzcG9uc2UgJHJlc3BvbnNlKTogP3N0cmluZwp7CiRoZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbGluaycpOwoKJGxpbmtzID0gZXhwbG9kZSgnLCcsICRoZWFkZXIpOwpmb3JlYWNoICgkbGlua3MgYXMgJGxpbmspIHsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3s8KC4rPyk+OyAqcmVsPSJuZXh0In0nLCAkbGluaywgJG1hdGNoKSkgewpyZXR1cm4gJG1hdGNoWzFdOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkZXRlcm1pbmVPcmlnaW4oYXJyYXkgJGNvbmZpZ3VyZWREb21haW5zLCBzdHJpbmcgJGd1ZXNzZWREb21haW4sIGFycmF5ICYkdXJsUGFydHMsID9zdHJpbmcgJHBvcnROdW1iZXIpCnsKJGd1ZXNzZWREb21haW4gPSBzdHJ0b2xvd2VyKCRndWVzc2VkRG9tYWluKTsKCmlmIChpbl9hcnJheSgkZ3Vlc3NlZERvbWFpbiwgJGNvbmZpZ3VyZWREb21haW5zKSB8fCAobnVsbCAhPT0gJHBvcnROdW1iZXIgJiYgaW5fYXJyYXkoJGd1ZXNzZWREb21haW4uJzonLiRwb3J0TnVtYmVyLCAkY29uZmlndXJlZERvbWFpbnMpKSkgewppZiAobnVsbCAhPT0gJHBvcnROdW1iZXIpIHsKcmV0dXJuICRndWVzc2VkRG9tYWluLic6Jy4kcG9ydE51bWJlcjsKfQoKcmV0dXJuICRndWVzc2VkRG9tYWluOwp9CgppZiAobnVsbCAhPT0gJHBvcnROdW1iZXIpIHsKJGd1ZXNzZWREb21haW4gLj0gJzonLiRwb3J0TnVtYmVyOwp9Cgp3aGlsZSAobnVsbCAhPT0gKCRwYXJ0ID0gYXJyYXlfc2hpZnQoJHVybFBhcnRzKSkpIHsKJGd1ZXNzZWREb21haW4gLj0gJy8nIC4gJHBhcnQ7CgppZiAoaW5fYXJyYXkoJGd1ZXNzZWREb21haW4sICRjb25maWd1cmVkRG9tYWlucykgfHwgKG51bGwgIT09ICRwb3J0TnVtYmVyICYmIGluX2FycmF5KFByZWc6OnJlcGxhY2UoJ3s6XGQrfScsICcnLCAkZ3Vlc3NlZERvbWFpbiksICRjb25maWd1cmVkRG9tYWlucykpKSB7CnJldHVybiAkZ3Vlc3NlZERvbWFpbjsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3M7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcQ2FjaGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEhnIGFzIEhnVXRpbHM7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CgoKCgpjbGFzcyBIZ0RyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJHRhZ3M7Cgpwcm90ZWN0ZWQgJGJyYW5jaGVzOwoKcHJvdGVjdGVkICRyb290SWRlbnRpZmllcjsKCnByb3RlY3RlZCAkcmVwb0RpcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHRoaXMtPnVybCkpIHsKJHRoaXMtPnJlcG9EaXIgPSAkdGhpcy0+dXJsOwp9IGVsc2UgewppZiAoIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdIZ0RyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJGNhY2hlRGlyID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS12Y3MtZGlyJyk7CiR0aGlzLT5yZXBvRGlyID0gJGNhY2hlRGlyIC4gJy8nIC4gUHJlZzo6cmVwbGFjZSgne1teYS16MC05XX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR0aGlzLT51cmwpKSAuICcvJzsKCiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CiRmcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRjYWNoZURpcik7CgppZiAoIWlzX3dyaXRhYmxlKGRpcm5hbWUoJHRoaXMtPnJlcG9EaXIpKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NhbiBub3QgY2xvbmUgJy4kdGhpcy0+dXJsLicgdG8gYWNjZXNzIHBhY2thZ2UgaW5mb3JtYXRpb24uIFRoZSAiJy4kY2FjaGVEaXIuJyIgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSBieSB0aGUgY3VycmVudCB1c2VyLicpOwp9CgoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdGhpcy0+dXJsLCAkdGhpcy0+aW8pOwoKJGhnVXRpbHMgPSBuZXcgSGdVdGlscygkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKCgppZiAoaXNfZGlyKCR0aGlzLT5yZXBvRGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3N1bW1hcnknXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpKSB7CmlmICgwICE9PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3B1bGwnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkZhaWxlZCB0byB1cGRhdGUgJy4kdGhpcy0+dXJsLicsIHBhY2thZ2UgaW5mb3JtYXRpb24gZnJvbSB0aGlzIHJlcG9zaXRvcnkgbWF5IGJlIG91dGRhdGVkICgnLiR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLicpPC9lcnJvcj4nKTsKfQp9IGVsc2UgewoKJGZzLT5yZW1vdmVEaXJlY3RvcnkoJHRoaXMtPnJlcG9EaXIpOwoKJHJlcG9EaXIgPSAkdGhpcy0+cmVwb0RpcjsKJGNvbW1hbmQgPSBzdGF0aWMgZnVuY3Rpb24gKCR1cmwpIHVzZSAoJHJlcG9EaXIpOiBhcnJheSB7CnJldHVybiBbJ2hnJywgJ2Nsb25lJywgJy0tbm91cGRhdGUnLCAnLS0nLCAkdXJsLCAkcmVwb0Rpcl07Cn07CgokaGdVdGlscy0+cnVuQ29tbWFuZCgkY29tbWFuZCwgJHRoaXMtPnVybCwgbnVsbCk7Cn0KfQoKJHRoaXMtPmdldFRhZ3MoKTsKJHRoaXMtPmdldEJyYW5jaGVzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnJvb3RJZGVudGlmaWVyKSB7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAndGlwJywgJy0tdGVtcGxhdGUnLCAne25vZGV9J10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKJG91dHB1dCA9ICR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpOwokdGhpcy0+cm9vdElkZW50aWZpZXIgPSAkb3V0cHV0WzBdOwp9CgpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsndHlwZScgPT4gJ2hnJywgJ3VybCcgPT4gJHRoaXMtPmdldFVybCgpLCAncmVmZXJlbmNlJyA9PiAkaWRlbnRpZmllcl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKaWYgKGlzc2V0KCRpZGVudGlmaWVyWzBdKSAmJiAkaWRlbnRpZmllclswXSA9PT0gJy0nKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBoZyBpZGVudGlmaWVyIGRldGVjdGVkLiBJZGVudGlmaWVyIG11c3Qgbm90IHN0YXJ0IHdpdGggYSAtLCBnaXZlbjogJyAuICRpZGVudGlmaWVyKTsKfQoKJHJlc291cmNlID0gWydoZycsICdjYXQnLCAnLXInLCAkaWRlbnRpZmllciwgJy0tJywgJGZpbGVdOwokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgkcmVzb3VyY2UsICRjb250ZW50LCAkdGhpcy0+cmVwb0Rpcik7CgppZiAoIXRyaW0oJGNvbnRlbnQpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGNvbnRlbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZSgKWydoZycsICdsb2cnLCAnLS10ZW1wbGF0ZScsICd7ZGF0ZXxyZmMzMzM5ZGF0ZX0nLCAnLXInLCAkaWRlbnRpZmllcl0sCiRvdXRwdXQsCiR0aGlzLT5yZXBvRGlyCik7CgpyZXR1cm4gbmV3IFxEYXRlVGltZUltbXV0YWJsZSh0cmltKCRvdXRwdXQpLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwoKJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICd0YWdzJ10sICRvdXRwdXQsICR0aGlzLT5yZXBvRGlyKTsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJHRhZykgewppZiAoJHRhZyAmJiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCcoXihbXlxzXSspXHMrXGQrOiguKikkKScsICR0YWcsICRtYXRjaCkpIHsKJHRhZ3NbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9CnVuc2V0KCR0YWdzWyd0aXAnXSk7CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CiRib29rbWFya3MgPSBbXTsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnYnJhbmNoZXMnXSwgJG91dHB1dCwgJHRoaXMtPnJlcG9EaXIpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkYnJhbmNoKSB7CmlmICgkYnJhbmNoICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJyheKFteXHNdKylccytcZCs6KFthLWYwLTldKykpJywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYnJhbmNoZXNbJG1hdGNoWzFdXSA9ICRtYXRjaFsyXTsKfQp9CgokdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ2Jvb2ttYXJrcyddLCAkb3V0cHV0LCAkdGhpcy0+cmVwb0Rpcik7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRicmFuY2gpIHsKaWYgKCRicmFuY2ggJiYgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3VwcygnKF4oPzpbXHMqXSopKFteXHNdKylccytcZCs6KC4qKSQpJywgJGJyYW5jaCwgJG1hdGNoKSAmJiAkbWF0Y2hbMV1bMF0gIT09ICctJykgewokYm9va21hcmtzWyRtYXRjaFsxXV0gPSAkbWF0Y2hbMl07Cn0KfQoKCiR0aGlzLT5icmFuY2hlcyA9IGFycmF5X21lcmdlKCRib29rbWFya3MsICRicmFuY2hlcyk7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewppZiAoUHJlZzo6aXNNYXRjaCgnIyheKD86aHR0cHM/fHNzaCk6Ly8oPzpbXkBdK0ApP2JpdGJ1Y2tldC5vcmd8aHR0cHM6Ly8oPzouKj8pXC5raWxuaGcuY29tKSNpJywgJHVybCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKJHVybCA9IEZpbGVzeXN0ZW06OmdldFBsYXRmb3JtUGF0aCgkdXJsKTsKaWYgKCFpc19kaXIoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKCmlmICgkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2hnJywgJ3N1bW1hcnknXSwgJG91dHB1dCwgJHVybCkgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQoKaWYgKCEkZGVlcCkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokZXhpdCA9ICRwcm9jZXNzLT5leGVjdXRlKFsnaGcnLCAnaWRlbnRpZnknLCAnLS0nLCAkdXJsXSwgJGlnbm9yZWQpOwoKcmV0dXJuICRleGl0ID09PSAwOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcUGVyZm9yY2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgoKCgpjbGFzcyBQZXJmb3JjZURyaXZlciBleHRlbmRzIFZjc0RyaXZlcgp7Cgpwcm90ZWN0ZWQgJGRlcG90OwoKcHJvdGVjdGVkICRicmFuY2g7Cgpwcm90ZWN0ZWQgJHBlcmZvcmNlID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewokdGhpcy0+ZGVwb3QgPSAkdGhpcy0+cmVwb0NvbmZpZ1snZGVwb3QnXTsKJHRoaXMtPmJyYW5jaCA9ICcnOwppZiAoIWVtcHR5KCR0aGlzLT5yZXBvQ29uZmlnWydicmFuY2gnXSkpIHsKJHRoaXMtPmJyYW5jaCA9ICR0aGlzLT5yZXBvQ29uZmlnWydicmFuY2gnXTsKfQoKJHRoaXMtPmluaXRQZXJmb3JjZSgkdGhpcy0+cmVwb0NvbmZpZyk7CiR0aGlzLT5wZXJmb3JjZS0+cDRMb2dpbigpOwokdGhpcy0+cGVyZm9yY2UtPmNoZWNrU3RyZWFtKCk7CgokdGhpcy0+cGVyZm9yY2UtPndyaXRlUDRDbGllbnRTcGVjKCk7CiR0aGlzLT5wZXJmb3JjZS0+Y29ubmVjdENsaWVudCgpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGluaXRQZXJmb3JjZShhcnJheSAkcmVwb0NvbmZpZyk6IHZvaWQKewppZiAoIWVtcHR5KCR0aGlzLT5wZXJmb3JjZSkpIHsKcmV0dXJuOwp9CgppZiAoIUNhY2hlOjppc1VzYWJsZSgkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdQZXJmb3JjZURyaXZlciByZXF1aXJlcyBhIHVzYWJsZSBjYWNoZSBkaXJlY3RvcnksIGFuZCBpdCBsb29rcyBsaWtlIHlvdSBzZXQgaXQgdG8gYmUgZGlzYWJsZWQnKTsKfQoKJHJlcG9EaXIgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2NhY2hlLXZjcy1kaXInKSAuICcvJyAuICR0aGlzLT5kZXBvdDsKJHRoaXMtPnBlcmZvcmNlID0gUGVyZm9yY2U6OmNyZWF0ZSgkcmVwb0NvbmZpZywgJHRoaXMtPmdldFVybCgpLCAkcmVwb0RpciwgJHRoaXMtPnByb2Nlc3MsICR0aGlzLT5pbyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnBlcmZvcmNlLT5nZXRGaWxlQ29udGVudCgkZmlsZSwgJGlkZW50aWZpZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlCnsKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJyYW5jaDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaGVzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5wZXJmb3JjZS0+Z2V0QnJhbmNoZXMoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPnBlcmZvcmNlLT5nZXRUYWdzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREaXN0KHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheQp7CnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U291cmNlKHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKcmV0dXJuIFsKJ3R5cGUnID0+ICdwZXJmb3JjZScsCid1cmwnID0+ICR0aGlzLT5yZXBvQ29uZmlnWyd1cmwnXSwKJ3JlZmVyZW5jZScgPT4gJGlkZW50aWZpZXIsCidwNHVzZXInID0+ICR0aGlzLT5wZXJmb3JjZS0+Z2V0VXNlcigpLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+dXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zZXJGaWxlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2wKewokY29tcG9zZXJJbmZvID0gJHRoaXMtPnBlcmZvcmNlLT5nZXRDb21wb3NlckluZm9ybWF0aW9uKCcvLycgLiAkdGhpcy0+ZGVwb3QgLiAnLycgLiAkaWRlbnRpZmllcik7CgpyZXR1cm4gIWVtcHR5KCRjb21wb3NlckluZm8pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICR1cmwpOiBSZXNwb25zZQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignTm90IGltcGxlbWVudGVkL3VzZWQgaW4gUGVyZm9yY2VEcml2ZXInKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdXBwb3J0cyhJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBzdHJpbmcgJHVybCwgYm9vbCAkZGVlcCA9IGZhbHNlKTogYm9vbAp7CmlmICgkZGVlcCB8fCBQcmVnOjppc01hdGNoKCcjXGIocGVyZm9yY2V8cDQpXGIjaScsICR1cmwpKSB7CnJldHVybiBQZXJmb3JjZTo6Y2hlY2tTZXJ2ZXJFeGlzdHMoJHVybCwgbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkCnsKJHRoaXMtPnBlcmZvcmNlLT5jbGVhbnVwQ2xpZW50U3BlYygpOwokdGhpcy0+cGVyZm9yY2UgPSBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVwb3QoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5kZXBvdDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJyYW5jaCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJyYW5jaDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDYWNoZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcRmlsZXN5c3RlbTsKdXNlIENvbXBvc2VyXFV0aWxcVXJsOwp1c2UgQ29tcG9zZXJcVXRpbFxTdm4gYXMgU3ZuVXRpbDsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKY2xhc3MgU3ZuRHJpdmVyIGV4dGVuZHMgVmNzRHJpdmVyCnsKCnByb3RlY3RlZCAkYmFzZVVybDsKCnByb3RlY3RlZCAkdGFnczsKCnByb3RlY3RlZCAkYnJhbmNoZXM7Cgpwcm90ZWN0ZWQgJHJvb3RJZGVudGlmaWVyOwoKCnByb3RlY3RlZCAkdHJ1bmtQYXRoID0gJ3RydW5rJzsKCnByb3RlY3RlZCAkYnJhbmNoZXNQYXRoID0gJ2JyYW5jaGVzJzsKCnByb3RlY3RlZCAkdGFnc1BhdGggPSAndGFncyc7Cgpwcm90ZWN0ZWQgJHBhY2thZ2VQYXRoID0gJyc7Cgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJpdmF0ZSAkdXRpbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbml0aWFsaXplKCk6IHZvaWQKewokdGhpcy0+dXJsID0gJHRoaXMtPmJhc2VVcmwgPSBydHJpbShzZWxmOjpub3JtYWxpemVVcmwoJHRoaXMtPnVybCksICcvJyk7CgpTdm5VdGlsOjpjbGVhbkVudigpOwoKaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWyd0cnVuay1wYXRoJ10pKSB7CiR0aGlzLT50cnVua1BhdGggPSAkdGhpcy0+cmVwb0NvbmZpZ1sndHJ1bmstcGF0aCddOwp9CmlmIChpc3NldCgkdGhpcy0+cmVwb0NvbmZpZ1snYnJhbmNoZXMtcGF0aCddKSkgewokdGhpcy0+YnJhbmNoZXNQYXRoID0gJHRoaXMtPnJlcG9Db25maWdbJ2JyYW5jaGVzLXBhdGgnXTsKfQppZiAoaXNzZXQoJHRoaXMtPnJlcG9Db25maWdbJ3RhZ3MtcGF0aCddKSkgewokdGhpcy0+dGFnc1BhdGggPSAkdGhpcy0+cmVwb0NvbmZpZ1sndGFncy1wYXRoJ107Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3N2bi1jYWNoZS1jcmVkZW50aWFscycsICR0aGlzLT5yZXBvQ29uZmlnKSkgewokdGhpcy0+Y2FjaGVDcmVkZW50aWFscyA9IChib29sKSAkdGhpcy0+cmVwb0NvbmZpZ1snc3ZuLWNhY2hlLWNyZWRlbnRpYWxzJ107Cn0KaWYgKGlzc2V0KCR0aGlzLT5yZXBvQ29uZmlnWydwYWNrYWdlLXBhdGgnXSkpIHsKJHRoaXMtPnBhY2thZ2VQYXRoID0gJy8nIC4gdHJpbSgkdGhpcy0+cmVwb0NvbmZpZ1sncGFja2FnZS1wYXRoJ10sICcvJyk7Cn0KCmlmIChmYWxzZSAhPT0gKCRwb3MgPSBzdHJycG9zKCR0aGlzLT51cmwsICcvJyAuICR0aGlzLT50cnVua1BhdGgpKSkgewokdGhpcy0+YmFzZVVybCA9IHN1YnN0cigkdGhpcy0+dXJsLCAwLCAkcG9zKTsKfQoKJHRoaXMtPmNhY2hlID0gbmV3IENhY2hlKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZy0+Z2V0KCdjYWNoZS1yZXBvLWRpcicpLicvJy5QcmVnOjpyZXBsYWNlKCd7W15hLXowLTkuXX1pJywgJy0nLCBVcmw6OnNhbml0aXplKCR0aGlzLT5iYXNlVXJsKSkpOwokdGhpcy0+Y2FjaGUtPnNldFJlYWRPbmx5KCR0aGlzLT5jb25maWctPmdldCgnY2FjaGUtcmVhZC1vbmx5JykpOwoKJHRoaXMtPmdldEJyYW5jaGVzKCk7CiR0aGlzLT5nZXRUYWdzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSb290SWRlbnRpZmllcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnJvb3RJZGVudGlmaWVyID86ICR0aGlzLT50cnVua1BhdGg7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmwoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT51cmw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXkKewpyZXR1cm4gWyd0eXBlJyA9PiAnc3ZuJywgJ3VybCcgPT4gJHRoaXMtPmJhc2VVcmwsICdyZWZlcmVuY2UnID0+ICRpZGVudGlmaWVyXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERpc3Qoc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKcmV0dXJuIG51bGw7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBzaG91bGRDYWNoZShzdHJpbmcgJGlkZW50aWZpZXIpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jYWNoZSAmJiBQcmVnOjppc01hdGNoKCd7QFxkKyR9JywgJGlkZW50aWZpZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewppZiAoIWlzc2V0KCR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdKSkgewppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSAmJiAkcmVzID0gJHRoaXMtPmNhY2hlLT5yZWFkKCRpZGVudGlmaWVyLicuanNvbicpKSB7CgoKaWYgKCRyZXMgPT09ICciIicpIHsKJHJlcyA9ICdudWxsJzsKJHRoaXMtPmNhY2hlLT53cml0ZSgkaWRlbnRpZmllci4nLmpzb24nLCAkcmVzKTsKfQoKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfQoKdHJ5IHsKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKfSBjYXRjaCAoVHJhbnNwb3J0RXhjZXB0aW9uICRlKSB7CiRtZXNzYWdlID0gJGUtPmdldE1lc3NhZ2UoKTsKaWYgKHN0cmlwb3MoJG1lc3NhZ2UsICdwYXRoIG5vdCBmb3VuZCcpID09PSBmYWxzZSAmJiBzdHJpcG9zKCRtZXNzYWdlLCAnc3ZuOiB3YXJuaW5nOiBXMTYwMDEzJykgPT09IGZhbHNlKSB7CnRocm93ICRlOwp9CgokY29tcG9zZXIgPSBudWxsOwp9CgppZiAoJHRoaXMtPnNob3VsZENhY2hlKCRpZGVudGlmaWVyKSkgewokdGhpcy0+Y2FjaGUtPndyaXRlKCRpZGVudGlmaWVyLicuanNvbicsIEpzb25GaWxlOjplbmNvZGUoJGNvbXBvc2VyLCBcSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IFxKU09OX1VORVNDQVBFRF9TTEFTSEVTKSk7Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgoKaWYgKCFpc19hcnJheSgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVDb250ZW50KHN0cmluZyAkZmlsZSwgc3RyaW5nICRpZGVudGlmaWVyKTogP3N0cmluZwp7CiRpZGVudGlmaWVyID0gJy8nIC4gdHJpbSgkaWRlbnRpZmllciwgJy8nKSAuICcvJzsKCmlmIChQcmVnOjppc01hdGNoKCd7XiguKz8pKEBcZCspPy8kfScsICRpZGVudGlmaWVyLCAkbWF0Y2gpICYmICRtYXRjaFsyXSAhPT0gbnVsbCkgewokcGF0aCA9ICRtYXRjaFsxXTsKJHJldiA9ICRtYXRjaFsyXTsKfSBlbHNlIHsKJHBhdGggPSAkaWRlbnRpZmllcjsKJHJldiA9ICcnOwp9Cgp0cnkgewokcmVzb3VyY2UgPSAkcGF0aC4kZmlsZTsKJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlKFsnc3ZuJywgJ2NhdCddLCAkdGhpcy0+YmFzZVVybCAuICRyZXNvdXJjZSAuICRyZXYpOwppZiAoJycgPT09IHRyaW0oJG91dHB1dCkpIHsKcmV0dXJuIG51bGw7Cn0KfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpKTsKfQoKcmV0dXJuICRvdXRwdXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFuZ2VEYXRlKHN0cmluZyAkaWRlbnRpZmllcik6ID9cRGF0ZVRpbWVJbW11dGFibGUKewokaWRlbnRpZmllciA9ICcvJyAuIHRyaW0oJGlkZW50aWZpZXIsICcvJykgLiAnLyc7CgppZiAoUHJlZzo6aXNNYXRjaCgne14oLis/KShAXGQrKT8vJH0nLCAkaWRlbnRpZmllciwgJG1hdGNoKSAmJiBudWxsICE9PSAkbWF0Y2hbMl0pIHsKJHBhdGggPSAkbWF0Y2hbMV07CiRyZXYgPSAkbWF0Y2hbMl07Cn0gZWxzZSB7CiRwYXRoID0gJGlkZW50aWZpZXI7CiRyZXYgPSAnJzsKfQoKJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlKFsnc3ZuJywgJ2luZm8nXSwgJHRoaXMtPmJhc2VVcmwgLiAkcGF0aCAuICRyZXYpOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KSBhcyAkbGluZSkgewppZiAoJGxpbmUgIT09ICcnICYmIFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teTGFzdCBDaGFuZ2VkIERhdGU6IChbXihdKyl9JywgJGxpbmUsICRtYXRjaCkpIHsKcmV0dXJuIG5ldyBcRGF0ZVRpbWVJbW11dGFibGUoJG1hdGNoWzFdLCBuZXcgXERhdGVUaW1lWm9uZSgnVVRDJykpOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFncygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+dGFncykgewokdGFncyA9IFtdOwoKaWYgKCR0aGlzLT50YWdzUGF0aCAhPT0gZmFsc2UpIHsKJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlKFsnc3ZuJywgJ2xzJywgJy0tdmVyYm9zZSddLCAkdGhpcy0+YmFzZVVybCAuICcvJyAuICR0aGlzLT50YWdzUGF0aCk7CmlmICgkb3V0cHV0ICE9PSAnJykgewokbGFzdFJldiA9IDA7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzLT5zcGxpdExpbmVzKCRvdXRwdXQpIGFzICRsaW5lKSB7CiRsaW5lID0gdHJpbSgkbGluZSk7CmlmICgkbGluZSAhPT0gJycgJiYgUHJlZzo6aXNNYXRjaCgne15ccyooXFMrKS4qPyhcUyspXHMqJH0nLCAkbGluZSwgJG1hdGNoKSkgewppZiAoJG1hdGNoWzJdID09PSAnLi8nKSB7CiRsYXN0UmV2ID0gKGludCkgJG1hdGNoWzFdOwp9IGVsc2UgewokdGFnc1tydHJpbSgkbWF0Y2hbMl0sICcvJyldID0gJHRoaXMtPmJ1aWxkSWRlbnRpZmllcigKJy8nIC4gJHRoaXMtPnRhZ3NQYXRoIC4gJy8nIC4gJG1hdGNoWzJdLAptYXgoJGxhc3RSZXYsIChpbnQpICRtYXRjaFsxXSkKKTsKfQp9Cn0KfQp9CgokdGhpcy0+dGFncyA9ICR0YWdzOwp9CgpyZXR1cm4gJHRoaXMtPnRhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+YnJhbmNoZXMpIHsKJGJyYW5jaGVzID0gW107CgppZiAoZmFsc2UgPT09ICR0aGlzLT50cnVua1BhdGgpIHsKJHRydW5rUGFyZW50ID0gJHRoaXMtPmJhc2VVcmwgLiAnLyc7Cn0gZWxzZSB7CiR0cnVua1BhcmVudCA9ICR0aGlzLT5iYXNlVXJsIC4gJy8nIC4gJHRoaXMtPnRydW5rUGF0aDsKfQoKJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlKFsnc3ZuJywgJ2xzJywgJy0tdmVyYm9zZSddLCAkdHJ1bmtQYXJlbnQpOwppZiAoJG91dHB1dCAhPT0gJycpIHsKZm9yZWFjaCAoJHRoaXMtPnByb2Nlc3MtPnNwbGl0TGluZXMoJG91dHB1dCkgYXMgJGxpbmUpIHsKJGxpbmUgPSB0cmltKCRsaW5lKTsKaWYgKCRsaW5lICE9PSAnJyAmJiBQcmVnOjppc01hdGNoKCd7XlxzKihcUyspLio/KFxTKylccyokfScsICRsaW5lLCAkbWF0Y2gpKSB7CmlmICgkbWF0Y2hbMl0gPT09ICcuLycpIHsKJGJyYW5jaGVzWyd0cnVuayddID0gJHRoaXMtPmJ1aWxkSWRlbnRpZmllcigKJy8nIC4gJHRoaXMtPnRydW5rUGF0aCwKKGludCkgJG1hdGNoWzFdCik7CiR0aGlzLT5yb290SWRlbnRpZmllciA9ICRicmFuY2hlc1sndHJ1bmsnXTsKYnJlYWs7Cn0KfQp9Cn0KdW5zZXQoJG91dHB1dCk7CgppZiAoJHRoaXMtPmJyYW5jaGVzUGF0aCAhPT0gZmFsc2UpIHsKJG91dHB1dCA9ICR0aGlzLT5leGVjdXRlKFsnc3ZuJywgJ2xzJywgJy0tdmVyYm9zZSddLCAkdGhpcy0+YmFzZVVybCAuICcvJyAuICR0aGlzLT5icmFuY2hlc1BhdGgpOwppZiAoJG91dHB1dCAhPT0gJycpIHsKJGxhc3RSZXYgPSAwOwpmb3JlYWNoICgkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcyh0cmltKCRvdXRwdXQpKSBhcyAkbGluZSkgewokbGluZSA9IHRyaW0oJGxpbmUpOwppZiAoJGxpbmUgIT09ICcnICYmIFByZWc6OmlzTWF0Y2goJ3teXHMqKFxTKykuKj8oXFMrKVxzKiR9JywgJGxpbmUsICRtYXRjaCkpIHsKaWYgKCRtYXRjaFsyXSA9PT0gJy4vJykgewokbGFzdFJldiA9IChpbnQpICRtYXRjaFsxXTsKfSBlbHNlIHsKJGJyYW5jaGVzW3J0cmltKCRtYXRjaFsyXSwgJy8nKV0gPSAkdGhpcy0+YnVpbGRJZGVudGlmaWVyKAonLycgLiAkdGhpcy0+YnJhbmNoZXNQYXRoIC4gJy8nIC4gJG1hdGNoWzJdLAptYXgoJGxhc3RSZXYsIChpbnQpICRtYXRjaFsxXSkKKTsKfQp9Cn0KfQp9CgokdGhpcy0+YnJhbmNoZXMgPSAkYnJhbmNoZXM7Cn0KCnJldHVybiAkdGhpcy0+YnJhbmNoZXM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3VwcG9ydHMoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIGJvb2wgJGRlZXAgPSBmYWxzZSk6IGJvb2wKewokdXJsID0gc2VsZjo6bm9ybWFsaXplVXJsKCR1cmwpOwppZiAoUHJlZzo6aXNNYXRjaCgnIyhec3ZuOi8vfF5zdm5cK3NzaDovL3xzdm5cLikjaScsICR1cmwpKSB7CnJldHVybiB0cnVlOwp9CgoKaWYgKCEkZGVlcCAmJiAhRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHVybCkpIHsKcmV0dXJuIGZhbHNlOwp9CgokcHJvY2VzcyA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoJGlvKTsKJGV4aXQgPSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ3N2bicsICdpbmZvJywgJy0tbm9uLWludGVyYWN0aXZlJywgJy0tJywgJHVybF0sICRpZ25vcmVkT3V0cHV0KTsKCmlmICgkZXhpdCA9PT0gMCkgewoKcmV0dXJuIHRydWU7Cn0KCgppZiAoZmFsc2UgIT09IHN0cmlwb3MoJHByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCksICdhdXRob3JpemF0aW9uIGZhaWxlZDonKSkgewoKCnJldHVybiB0cnVlOwp9CgoKaWYgKGZhbHNlICE9PSBzdHJpcG9zKCRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpLCAnQXV0aGVudGljYXRpb24gZmFpbGVkJykpIHsKCgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVVybChzdHJpbmcgJHVybCk6IHN0cmluZwp7CiRmcyA9IG5ldyBGaWxlc3lzdGVtKCk7CmlmICgkZnMtPmlzQWJzb2x1dGVQYXRoKCR1cmwpKSB7CnJldHVybiAnZmlsZTovLycgLiBzdHJ0cigkdXJsLCAnXFwnLCAnLycpOwp9CgpyZXR1cm4gJHVybDsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShhcnJheSAkY29tbWFuZCwgc3RyaW5nICR1cmwpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJHRoaXMtPnV0aWwpIHsKJHRoaXMtPnV0aWwgPSBuZXcgU3ZuVXRpbCgkdGhpcy0+YmFzZVVybCwgJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2Vzcyk7CiR0aGlzLT51dGlsLT5zZXRDYWNoZUNyZWRlbnRpYWxzKCR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzKTsKfQoKdHJ5IHsKcmV0dXJuICR0aGlzLT51dGlsLT5leGVjdXRlKCRjb21tYW5kLCAkdXJsKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKaWYgKG51bGwgPT09ICR0aGlzLT51dGlsLT5iaW5hcnlWZXJzaW9uKCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gbG9hZCAnLiR0aGlzLT51cmwuJywgc3ZuIHdhcyBub3QgZm91bmQsIGNoZWNrIHRoYXQgaXQgaXMgaW5zdGFsbGVkIGFuZCBpbiB5b3VyIFBBVEggZW52LicgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJ1JlcG9zaXRvcnkgJy4kdGhpcy0+dXJsLicgY291bGQgbm90IGJlIHByb2Nlc3NlZCwgJy4kZS0+Z2V0TWVzc2FnZSgpCik7Cn0KfQoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGJ1aWxkSWRlbnRpZmllcihzdHJpbmcgJGJhc2VEaXIsIGludCAkcmV2aXNpb24pOiBzdHJpbmcKewpyZXR1cm4gcnRyaW0oJGJhc2VEaXIsICcvJykgLiAkdGhpcy0+cGFja2FnZVBhdGggLiAnL0AnIC4gJHJldmlzaW9uOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFJlcG9zaXRvcnlcVmNzOwoKdXNlIENvbXBvc2VyXENhY2hlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXEZpbGVzeXN0ZW07CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIFZjc0RyaXZlciBpbXBsZW1lbnRzIFZjc0RyaXZlckludGVyZmFjZQp7Cgpwcm90ZWN0ZWQgJHVybDsKCnByb3RlY3RlZCAkb3JpZ2luVXJsOwoKcHJvdGVjdGVkICRyZXBvQ29uZmlnOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICRodHRwRG93bmxvYWRlcjsKCnByb3RlY3RlZCAkaW5mb0NhY2hlID0gW107Cgpwcm90ZWN0ZWQgJGNhY2hlOwoKCgoKCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvQ29uZmlnLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcykKewppZiAoRmlsZXN5c3RlbTo6aXNMb2NhbFBhdGgoJHJlcG9Db25maWdbJ3VybCddKSkgewokcmVwb0NvbmZpZ1sndXJsJ10gPSBGaWxlc3lzdGVtOjpnZXRQbGF0Zm9ybVBhdGgoJHJlcG9Db25maWdbJ3VybCddKTsKfQoKJHRoaXMtPnVybCA9ICRyZXBvQ29uZmlnWyd1cmwnXTsKJHRoaXMtPm9yaWdpblVybCA9ICRyZXBvQ29uZmlnWyd1cmwnXTsKJHRoaXMtPnJlcG9Db25maWcgPSAkcmVwb0NvbmZpZzsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwp9CgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHNob3VsZENhY2hlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmNhY2hlICYmIFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17NDB9JH1pRCcsICRpZGVudGlmaWVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+aW5mb0NhY2hlWyRpZGVudGlmaWVyXSkpIHsKaWYgKCR0aGlzLT5zaG91bGRDYWNoZSgkaWRlbnRpZmllcikgJiYgJHJlcyA9ICR0aGlzLT5jYWNoZS0+cmVhZCgkaWRlbnRpZmllcikpIHsKcmV0dXJuICR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gSnNvbkZpbGU6OnBhcnNlSnNvbigkcmVzKTsKfQoKJGNvbXBvc2VyID0gJHRoaXMtPmdldEJhc2VDb21wb3NlckluZm9ybWF0aW9uKCRpZGVudGlmaWVyKTsKCmlmICgkdGhpcy0+c2hvdWxkQ2FjaGUoJGlkZW50aWZpZXIpKSB7CiR0aGlzLT5jYWNoZS0+d3JpdGUoJGlkZW50aWZpZXIsIEpzb25GaWxlOjplbmNvZGUoJGNvbXBvc2VyLCBcSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSB8IFxKU09OX1VORVNDQVBFRF9TTEFTSEVTKSk7Cn0KCiR0aGlzLT5pbmZvQ2FjaGVbJGlkZW50aWZpZXJdID0gJGNvbXBvc2VyOwp9CgpyZXR1cm4gJHRoaXMtPmluZm9DYWNoZVskaWRlbnRpZmllcl07Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRCYXNlQ29tcG9zZXJJbmZvcm1hdGlvbihzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXkKewokY29tcG9zZXJGaWxlQ29udGVudCA9ICR0aGlzLT5nZXRGaWxlQ29udGVudCgnY29tcG9zZXIuanNvbicsICRpZGVudGlmaWVyKTsKCmlmICghJGNvbXBvc2VyRmlsZUNvbnRlbnQpIHsKcmV0dXJuIG51bGw7Cn0KCiRjb21wb3NlciA9IEpzb25GaWxlOjpwYXJzZUpzb24oJGNvbXBvc2VyRmlsZUNvbnRlbnQsICRpZGVudGlmaWVyIC4gJzpjb21wb3Nlci5qc29uJyk7CgppZiAoW10gPT09ICRjb21wb3NlciB8fCAhaXNfYXJyYXkoJGNvbXBvc2VyKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKGVtcHR5KCRjb21wb3NlclsndGltZSddKSAmJiBudWxsICE9PSAoJGNoYW5nZURhdGUgPSAkdGhpcy0+Z2V0Q2hhbmdlRGF0ZSgkaWRlbnRpZmllcikpKSB7CiRjb21wb3NlclsndGltZSddID0gJGNoYW5nZURhdGUtPmZvcm1hdChEQVRFX1JGQzMzMzkpOwp9CgpyZXR1cm4gJGNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zZXJGaWxlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2wKewp0cnkgewpyZXR1cm4gbnVsbCAhPT0gJHRoaXMtPmdldENvbXBvc2VySW5mb3JtYXRpb24oJGlkZW50aWZpZXIpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFNjaGVtZSgpOiBzdHJpbmcKewppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnb3BlbnNzbCcpKSB7CnJldHVybiAnaHR0cHMnOwp9CgpyZXR1cm4gJ2h0dHAnOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbnRlbnRzKHN0cmluZyAkdXJsKTogUmVzcG9uc2UKewokb3B0aW9ucyA9ICR0aGlzLT5yZXBvQ29uZmlnWydvcHRpb25zJ10gPz8gW107CgpyZXR1cm4gJHRoaXMtPmh0dHBEb3dubG9hZGVyLT5nZXQoJHVybCwgJG9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkCnsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5XFZjczsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgppbnRlcmZhY2UgVmNzRHJpdmVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoKTogdm9pZDsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21wb3NlckluZm9ybWF0aW9uKHN0cmluZyAkaWRlbnRpZmllcik6ID9hcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlQ29udGVudChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2hhbmdlRGF0ZShzdHJpbmcgJGlkZW50aWZpZXIpOiA/XERhdGVUaW1lSW1tdXRhYmxlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um9vdElkZW50aWZpZXIoKTogc3RyaW5nOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0QnJhbmNoZXMoKTogYXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdzKCk6IGFycmF5OwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzdChzdHJpbmcgJGlkZW50aWZpZXIpOiA/YXJyYXk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTb3VyY2Uoc3RyaW5nICRpZGVudGlmaWVyKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJsKCk6IHN0cmluZzsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ29tcG9zZXJGaWxlKHN0cmluZyAkaWRlbnRpZmllcik6IGJvb2w7CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cCgpOiB2b2lkOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzKElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsLCBib29sICRkZWVwID0gZmFsc2UpOiBib29sOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcVmNzRHJpdmVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxQYWNrYWdlXExvYWRlclxBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXFZhbGlkYXRpbmdBcnJheUxvYWRlcjsKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEludmFsaWRQYWNrYWdlRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcTG9hZGVySW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlcjsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFByb2Nlc3NFeGVjdXRvcjsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxVdGlsXFVybDsKdXNlIENvbXBvc2VyXFNlbXZlclxDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKCgoKCmNsYXNzIFZjc1JlcG9zaXRvcnkgZXh0ZW5kcyBBcnJheVJlcG9zaXRvcnkgaW1wbGVtZW50cyBDb25maWd1cmFibGVSZXBvc2l0b3J5SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkdXJsOwoKcHJvdGVjdGVkICRwYWNrYWdlTmFtZTsKCnByb3RlY3RlZCAkaXNWZXJib3NlOwoKcHJvdGVjdGVkICRpc1ZlcnlWZXJib3NlOwoKcHJvdGVjdGVkICRpbzsKCnByb3RlY3RlZCAkY29uZmlnOwoKcHJvdGVjdGVkICR2ZXJzaW9uUGFyc2VyOwoKcHJvdGVjdGVkICR0eXBlOwoKcHJvdGVjdGVkICRsb2FkZXI7Cgpwcm90ZWN0ZWQgJHJlcG9Db25maWc7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKcHJvdGVjdGVkICRwcm9jZXNzRXhlY3V0b3I7Cgpwcm90ZWN0ZWQgJGJyYW5jaEVycm9yT2NjdXJyZWQgPSBmYWxzZTsKCnByaXZhdGUgJGRyaXZlcnM7Cgpwcml2YXRlICRkcml2ZXI7Cgpwcml2YXRlICR2ZXJzaW9uQ2FjaGU7Cgpwcml2YXRlICRlbXB0eVJlZmVyZW5jZXMgPSBbXTsKCnByaXZhdGUgJHZlcnNpb25UcmFuc3BvcnRFeGNlcHRpb25zID0gW107CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXBvQ29uZmlnLCBJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9FdmVudERpc3BhdGNoZXIgJGRpc3BhdGNoZXIgPSBudWxsLCA/UHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzID0gbnVsbCwgP2FycmF5ICRkcml2ZXJzID0gbnVsbCwgP1ZlcnNpb25DYWNoZUludGVyZmFjZSAkdmVyc2lvbkNhY2hlID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7CiR0aGlzLT5kcml2ZXJzID0gJGRyaXZlcnMgPzogWwonZ2l0aHViJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcR2l0SHViRHJpdmVyJywKJ2dpdGxhYicgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEdpdExhYkRyaXZlcicsCidiaXRidWNrZXQnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXRCaXRidWNrZXREcml2ZXInLAonZ2l0LWJpdGJ1Y2tldCcgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEdpdEJpdGJ1Y2tldERyaXZlcicsCidmb3JnZWpvJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcRm9yZ2Vqb0RyaXZlcicsCidnaXQnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xHaXREcml2ZXInLAonaGcnID0+ICdDb21wb3NlclxSZXBvc2l0b3J5XFZjc1xIZ0RyaXZlcicsCidwZXJmb3JjZScgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXFBlcmZvcmNlRHJpdmVyJywKJ2Zvc3NpbCcgPT4gJ0NvbXBvc2VyXFJlcG9zaXRvcnlcVmNzXEZvc3NpbERyaXZlcicsCgonc3ZuJyA9PiAnQ29tcG9zZXJcUmVwb3NpdG9yeVxWY3NcU3ZuRHJpdmVyJywKXTsKCiR0aGlzLT51cmwgPSAkcmVwb0NvbmZpZ1sndXJsJ10gPSBQbGF0Zm9ybTo6ZXhwYW5kUGF0aCgkcmVwb0NvbmZpZ1sndXJsJ10pOwokdGhpcy0+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+KSc7CgoKJHRhZyA9IHN0cl9yZXBsYWNlKCdyZWxlYXNlLScsICcnLCAkdGFnKTsKCiRjYWNoZWRQYWNrYWdlID0gJHRoaXMtPmdldENhY2hlZFBhY2thZ2VWZXJzaW9uKCR0YWcsICRpZGVudGlmaWVyLCAkaXNWZXJib3NlLCAkaXNWZXJ5VmVyYm9zZSk7CmlmICgkY2FjaGVkUGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkY2FjaGVkUGFja2FnZSk7Cgpjb250aW51ZTsKfQppZiAoJGNhY2hlZFBhY2thZ2UgPT09IGZhbHNlKSB7CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwoKY29udGludWU7Cn0KCmlmICghJHBhcnNlZFRhZyA9ICR0aGlzLT52YWxpZGF0ZVRhZygkdGFnKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgaW52YWxpZCB0YWcgbmFtZTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfQoKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKfSBlbHNlaWYgKCRpc1ZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcigkbXNnLCBmYWxzZSk7Cn0KCnRyeSB7CiRkYXRhID0gJGRyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CmlmIChudWxsID09PSAkZGF0YSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgbm8gY29tcG9zZXIgZmlsZTwvd2FybmluZz4nKTsKfQokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKY29udGludWU7Cn0KCgppZiAoaXNzZXQoJGRhdGFbJ3ZlcnNpb24nXSkpIHsKJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gJHRoaXMtPnZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZSgkZGF0YVsndmVyc2lvbiddKTsKfSBlbHNlIHsKCiRkYXRhWyd2ZXJzaW9uJ10gPSAkdGFnOwokZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10gPSAkcGFyc2VkVGFnOwp9CgoKJGRhdGFbJ3ZlcnNpb24nXSA9IFByZWc6OnJlcGxhY2UoJ3tbLi1dP2RldiR9aScsICcnLCAkZGF0YVsndmVyc2lvbiddKTsKJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddID0gUHJlZzo6cmVwbGFjZSgneyheZGV2LXxbLi1dP2RldiQpfWknLCAnJywgJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddKTsKCgp1bnNldCgkZGF0YVsnZGVmYXVsdC1icmFuY2gnXSk7CgoKaWYgKCRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSAhPT0gJHBhcnNlZFRhZykgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3soXmRldi18Wy4tXT9kZXYkKX1pJywgJHBhcnNlZFRhZykpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIHRhZyAnLiR0YWcuJywgaW52YWxpZCB0YWcgbmFtZSwgdGFncyBjYW4gbm90IHVzZSBkZXYgcHJlZml4ZXMgb3Igc3VmZml4ZXM8L3dhcm5pbmc+Jyk7Cn0gZWxzZSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U2tpcHBlZCB0YWcgJy4kdGFnLicsIHRhZyAoJy4kcGFyc2VkVGFnLicpIGRvZXMgbm90IG1hdGNoIHZlcnNpb24gKCcuJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddLicpIGluIGNvbXBvc2VyLmpzb248L3dhcm5pbmc+Jyk7Cn0KfQpjb250aW51ZTsKfQoKJHRhZ1BhY2thZ2VOYW1lID0gJHRoaXMtPnBhY2thZ2VOYW1lID86ICgkZGF0YVsnbmFtZSddID8/ICcnKTsKaWYgKCRleGlzdGluZ1BhY2thZ2UgPSAkdGhpcy0+ZmluZFBhY2thZ2UoJHRhZ1BhY2thZ2VOYW1lLCAkZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10pKSB7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgdGFnICcuJHRhZy4nLCBpdCBjb25mbGljdHMgd2l0aCBhbiBhbm90aGVyIHRhZyAoJy4kZXhpc3RpbmdQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJykgYXMgYm90aCByZXNvbHZlIHRvICcuJGRhdGFbJ3ZlcnNpb25fbm9ybWFsaXplZCddLicgaW50ZXJuYWxseTwvd2FybmluZz4nKTsKfQpjb250aW51ZTsKfQoKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignSW1wb3J0aW5nIHRhZyAnLiR0YWcuJyAoJy4kZGF0YVsndmVyc2lvbl9ub3JtYWxpemVkJ10uJyknKTsKfQoKJHRoaXMtPmFkZFBhY2thZ2UoJHRoaXMtPmxvYWRlci0+bG9hZCgkdGhpcy0+cHJlUHJvY2VzcygkZHJpdmVyLCAkZGF0YSwgJGlkZW50aWZpZXIpKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CiR0aGlzLT52ZXJzaW9uVHJhbnNwb3J0RXhjZXB0aW9uc1sndGFncyddWyR0YWddID0gJGU7CmlmICgkZS0+Z2V0Q29kZSgpID09PSA0MDQpIHsKJHRoaXMtPmVtcHR5UmVmZXJlbmNlc1tdID0gJGlkZW50aWZpZXI7Cn0KaWYgKCR0aGlzLT5zaG91bGRSZXRocm93VHJhbnNwb3J0RXhjZXB0aW9uKCRlKSkgewp0aHJvdyAkZTsKfQp9CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgdGFnICcuJHRhZy4nLCAnLigkZSBpbnN0YW5jZW9mIFRyYW5zcG9ydEV4Y2VwdGlvbiA/ICdubyBjb21wb3NlciBmaWxlIHdhcyBmb3VuZCAoJyAuICRlLT5nZXRDb2RlKCkgLiAnIEhUVFAgc3RhdHVzIGNvZGUpJyA6ICRlLT5nZXRNZXNzYWdlKCkpLic8L3dhcm5pbmc+Jyk7Cn0KY29udGludWU7Cn0KfQoKaWYgKCEkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCcnLCBmYWxzZSk7Cn0KCiRicmFuY2hlcyA9ICRkcml2ZXItPmdldEJyYW5jaGVzKCk7CgppZiAoJGhhc1Jvb3RJZGVudGlmaWVyQ29tcG9zZXJKc29uICYmIGlzc2V0KCRicmFuY2hlc1skZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpXSkpIHsKJGJyYW5jaGVzID0gWyRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCkgPT4gJGJyYW5jaGVzWyRkcml2ZXItPmdldFJvb3RJZGVudGlmaWVyKCldXSArICRicmFuY2hlczsKfQoKZm9yZWFjaCAoJGJyYW5jaGVzIGFzICRicmFuY2ggPT4gJGlkZW50aWZpZXIpIHsKJGJyYW5jaCA9IChzdHJpbmcpICRicmFuY2g7CiRtc2cgPSAnUmVhZGluZyBjb21wb3Nlci5qc29uIG9mIDxpbmZvPicgLiAoJHRoaXMtPnBhY2thZ2VOYW1lID86ICR0aGlzLT51cmwpIC4gJzwvaW5mbz4gKDxjb21tZW50PicgLiAkYnJhbmNoIC4gJzwvY29tbWVudD4pJzsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKfSBlbHNlaWYgKCRpc1ZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcigkbXNnLCBmYWxzZSk7Cn0KCmlmICghJHBhcnNlZEJyYW5jaCA9ICR0aGlzLT52YWxpZGF0ZUJyYW5jaCgkYnJhbmNoKSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgaW52YWxpZCBuYW1lPC93YXJuaW5nPicpOwp9CmNvbnRpbnVlOwp9CgoKaWYgKHN0cnBvcygkcGFyc2VkQnJhbmNoLCAnZGV2LScpID09PSAwIHx8IFZlcnNpb25QYXJzZXI6OkRFRkFVTFRfQlJBTkNIX0FMSUFTID09PSAkcGFyc2VkQnJhbmNoKSB7CiR2ZXJzaW9uID0gJ2Rldi0nIC4gc3RyX3JlcGxhY2UoJyMnLCAnKycsICRicmFuY2gpOwokcGFyc2VkQnJhbmNoID0gc3RyX3JlcGxhY2UoJyMnLCAnKycsICRwYXJzZWRCcmFuY2gpOwp9IGVsc2UgewokcHJlZml4ID0gc3RycG9zKCRicmFuY2gsICd2JykgPT09IDAgPyAndicgOiAnJzsKJHZlcnNpb24gPSAkcHJlZml4IC4gUHJlZzo6cmVwbGFjZSgneyhcLjl7N30pK30nLCAnLngnLCAkcGFyc2VkQnJhbmNoKTsKfQoKJGNhY2hlZFBhY2thZ2UgPSAkdGhpcy0+Z2V0Q2FjaGVkUGFja2FnZVZlcnNpb24oJHZlcnNpb24sICRpZGVudGlmaWVyLCAkaXNWZXJib3NlLCAkaXNWZXJ5VmVyYm9zZSwgJGRyaXZlci0+Z2V0Um9vdElkZW50aWZpZXIoKSA9PT0gJGJyYW5jaCk7CmlmICgkY2FjaGVkUGFja2FnZSkgewokdGhpcy0+YWRkUGFja2FnZSgkY2FjaGVkUGFja2FnZSk7Cgpjb250aW51ZTsKfQppZiAoJGNhY2hlZFBhY2thZ2UgPT09IGZhbHNlKSB7CiR0aGlzLT5lbXB0eVJlZmVyZW5jZXNbXSA9ICRpZGVudGlmaWVyOwoKY29udGludWU7Cn0KCnRyeSB7CiRkYXRhID0gJGRyaXZlci0+Z2V0Q29tcG9zZXJJbmZvcm1hdGlvbigkaWRlbnRpZmllcik7CmlmIChudWxsID09PSAkZGF0YSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkIGJyYW5jaCAnLiRicmFuY2guJywgbm8gY29tcG9zZXIgZmlsZTwvd2FybmluZz4nKTsKfQokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKY29udGludWU7Cn0KCgokZGF0YVsndmVyc2lvbiddID0gJHZlcnNpb247CiRkYXRhWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSA9ICRwYXJzZWRCcmFuY2g7Cgp1bnNldCgkZGF0YVsnZGVmYXVsdC1icmFuY2gnXSk7CmlmICgkZHJpdmVyLT5nZXRSb290SWRlbnRpZmllcigpID09PSAkYnJhbmNoKSB7CiRkYXRhWydkZWZhdWx0LWJyYW5jaCddID0gdHJ1ZTsKfQoKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignSW1wb3J0aW5nIGJyYW5jaCAnLiRicmFuY2guJyAoJy4kZGF0YVsndmVyc2lvbiddLicpJyk7Cn0KCiRwYWNrYWdlRGF0YSA9ICR0aGlzLT5wcmVQcm9jZXNzKCRkcml2ZXIsICRkYXRhLCAkaWRlbnRpZmllcik7CiRwYWNrYWdlID0gJHRoaXMtPmxvYWRlci0+bG9hZCgkcGFja2FnZURhdGEpOwppZiAoJHRoaXMtPmxvYWRlciBpbnN0YW5jZW9mIFZhbGlkYXRpbmdBcnJheUxvYWRlciAmJiBcY291bnQoJHRoaXMtPmxvYWRlci0+Z2V0V2FybmluZ3MoKSkgPiAwKSB7CnRocm93IG5ldyBJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbigkdGhpcy0+bG9hZGVyLT5nZXRFcnJvcnMoKSwgJHRoaXMtPmxvYWRlci0+Z2V0V2FybmluZ3MoKSwgJHBhY2thZ2VEYXRhKTsKfQokdGhpcy0+YWRkUGFja2FnZSgkcGFja2FnZSk7Cn0gY2F0Y2ggKFRyYW5zcG9ydEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+dmVyc2lvblRyYW5zcG9ydEV4Y2VwdGlvbnNbJ2JyYW5jaGVzJ11bJGJyYW5jaF0gPSAkZTsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQwNCkgewokdGhpcy0+ZW1wdHlSZWZlcmVuY2VzW10gPSAkaWRlbnRpZmllcjsKfQppZiAoJHRoaXMtPnNob3VsZFJldGhyb3dUcmFuc3BvcnRFeGNlcHRpb24oJGUpKSB7CnRocm93ICRlOwp9CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgYnJhbmNoICcuJGJyYW5jaC4nLCBubyBjb21wb3NlciBmaWxlIHdhcyBmb3VuZCAoJyAuICRlLT5nZXRDb2RlKCkgLiAnIEhUVFAgc3RhdHVzIGNvZGUpPC93YXJuaW5nPicpOwp9CmNvbnRpbnVlOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICghJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnKTsKfQokdGhpcy0+YnJhbmNoRXJyb3JPY2N1cnJlZCA9IHRydWU7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPlNraXBwZWQgYnJhbmNoICcuJGJyYW5jaC4nLCAnLiRlLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignJyk7CmNvbnRpbnVlOwp9Cn0KJGRyaXZlci0+Y2xlYW51cCgpOwoKaWYgKCEkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCcnLCBmYWxzZSk7Cn0KCmlmICghJHRoaXMtPmdldFBhY2thZ2VzKCkpIHsKdGhyb3cgbmV3IEludmFsaWRSZXBvc2l0b3J5RXhjZXB0aW9uKCdObyB2YWxpZCBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBpbiBhbnkgYnJhbmNoIG9yIHRhZyBvZiAnLiR0aGlzLT51cmwuJywgY291bGQgbm90IGxvYWQgYSBwYWNrYWdlIGZyb20gaXQuJyk7Cn0KfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJlUHJvY2VzcyhWY3NEcml2ZXJJbnRlcmZhY2UgJGRyaXZlciwgYXJyYXkgJGRhdGEsIHN0cmluZyAkaWRlbnRpZmllcik6IGFycmF5CnsKCgoKJGRhdGFQYWNrYWdlTmFtZSA9ICRkYXRhWyduYW1lJ10gPz8gbnVsbDsKJGRhdGFbJ25hbWUnXSA9ICR0aGlzLT5wYWNrYWdlTmFtZSA/OiAkZGF0YVBhY2thZ2VOYW1lOwoKaWYgKCFpc3NldCgkZGF0YVsnZGlzdCddKSkgewokZGF0YVsnZGlzdCddID0gJGRyaXZlci0+Z2V0RGlzdCgkaWRlbnRpZmllcik7Cn0KaWYgKCFpc3NldCgkZGF0YVsnc291cmNlJ10pKSB7CiRkYXRhWydzb3VyY2UnXSA9ICRkcml2ZXItPmdldFNvdXJjZSgkaWRlbnRpZmllcik7Cn0KCgppZiAoaXNfYXJyYXkoJGRhdGFbJ2Rpc3QnXSkgJiYgIWlzc2V0KCRkYXRhWydkaXN0J11bJ3JlZmVyZW5jZSddKSAmJiBpc3NldCgkZGF0YVsnc291cmNlJ11bJ3JlZmVyZW5jZSddKSkgewokZGF0YVsnZGlzdCddWydyZWZlcmVuY2UnXSA9ICRkYXRhWydzb3VyY2UnXVsncmVmZXJlbmNlJ107Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUJyYW5jaChzdHJpbmcgJGJyYW5jaCkKewp0cnkgewokbm9ybWFsaXplZEJyYW5jaCA9ICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemVCcmFuY2goJGJyYW5jaCk7CgoKJHRoaXMtPnZlcnNpb25QYXJzZXItPnBhcnNlQ29uc3RyYWludHMoJG5vcm1hbGl6ZWRCcmFuY2gpOwoKcmV0dXJuICRub3JtYWxpemVkQnJhbmNoOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVRhZyhzdHJpbmcgJHZlcnNpb24pCnsKdHJ5IHsKcmV0dXJuICR0aGlzLT52ZXJzaW9uUGFyc2VyLT5ub3JtYWxpemUoJHZlcnNpb24pOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDYWNoZWRQYWNrYWdlVmVyc2lvbihzdHJpbmcgJHZlcnNpb24sIHN0cmluZyAkaWRlbnRpZmllciwgYm9vbCAkaXNWZXJib3NlLCBib29sICRpc1ZlcnlWZXJib3NlLCBib29sICRpc0RlZmF1bHRCcmFuY2ggPSBmYWxzZSkKewppZiAoISR0aGlzLT52ZXJzaW9uQ2FjaGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRjYWNoZWRQYWNrYWdlID0gJHRoaXMtPnZlcnNpb25DYWNoZS0+Z2V0VmVyc2lvblBhY2thZ2UoJHZlcnNpb24sICRpZGVudGlmaWVyKTsKaWYgKCRjYWNoZWRQYWNrYWdlID09PSBmYWxzZSkgewppZiAoJGlzVmVyeVZlcmJvc2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Ta2lwcGVkICcuJHZlcnNpb24uJywgbm8gY29tcG9zZXIgZmlsZSAoY2FjaGVkIGZyb20gcmVmICcuJGlkZW50aWZpZXIuJyk8L3dhcm5pbmc+Jyk7Cn0KCnJldHVybiBmYWxzZTsKfQoKaWYgKCRjYWNoZWRQYWNrYWdlKSB7CiRtc2cgPSAnRm91bmQgY2FjaGVkIGNvbXBvc2VyLmpzb24gb2YgPGluZm8+JyAuICgkdGhpcy0+cGFja2FnZU5hbWUgPzogJHRoaXMtPnVybCkgLiAnPC9pbmZvPiAoPGNvbW1lbnQ+JyAuICR2ZXJzaW9uIC4gJzwvY29tbWVudD4pJzsKaWYgKCRpc1ZlcnlWZXJib3NlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbXNnKTsKfSBlbHNlaWYgKCRpc1ZlcmJvc2UpIHsKJHRoaXMtPmlvLT5vdmVyd3JpdGVFcnJvcigkbXNnLCBmYWxzZSk7Cn0KCnVuc2V0KCRjYWNoZWRQYWNrYWdlWydkZWZhdWx0LWJyYW5jaCddKTsKaWYgKCRpc0RlZmF1bHRCcmFuY2gpIHsKJGNhY2hlZFBhY2thZ2VbJ2RlZmF1bHQtYnJhbmNoJ10gPSB0cnVlOwp9CgppZiAoJGV4aXN0aW5nUGFja2FnZSA9ICR0aGlzLT5maW5kUGFja2FnZSgkY2FjaGVkUGFja2FnZVsnbmFtZSddLCBuZXcgQ29uc3RyYWludCgnPScsICRjYWNoZWRQYWNrYWdlWyd2ZXJzaW9uX25vcm1hbGl6ZWQnXSkpKSB7CmlmICgkaXNWZXJ5VmVyYm9zZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPlNraXBwZWQgY2FjaGVkIHZlcnNpb24gJy4kdmVyc2lvbi4nLCBpdCBjb25mbGljdHMgd2l0aCBhbiBhbm90aGVyIHRhZyAoJy4kZXhpc3RpbmdQYWNrYWdlLT5nZXRQcmV0dHlWZXJzaW9uKCkuJykgYXMgYm90aCByZXNvbHZlIHRvICcuJGNhY2hlZFBhY2thZ2VbJ3ZlcnNpb25fbm9ybWFsaXplZCddLicgaW50ZXJuYWxseTwvd2FybmluZz4nKTsKfQokY2FjaGVkUGFja2FnZSA9IG51bGw7Cn0KfQoKaWYgKCRjYWNoZWRQYWNrYWdlKSB7CnJldHVybiAkdGhpcy0+bG9hZGVyLT5sb2FkKCRjYWNoZWRQYWNrYWdlKTsKfQoKcmV0dXJuIG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2hvdWxkUmV0aHJvd1RyYW5zcG9ydEV4Y2VwdGlvbihUcmFuc3BvcnRFeGNlcHRpb24gJGUpOiBib29sCnsKcmV0dXJuIGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDEsIDQwMywgNDI5XSwgdHJ1ZSkgfHwgJGUtPmdldENvZGUoKSA+PSA1MDA7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUmVwb3NpdG9yeTsKCmludGVyZmFjZSBWZXJzaW9uQ2FjaGVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyc2lvblBhY2thZ2Uoc3RyaW5nICR2ZXJzaW9uLCBzdHJpbmcgJGlkZW50aWZpZXIpOwp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwoKCgoKCgpjbGFzcyBXcml0YWJsZUFycmF5UmVwb3NpdG9yeSBleHRlbmRzIEFycmF5UmVwb3NpdG9yeSBpbXBsZW1lbnRzIFdyaXRhYmxlUmVwb3NpdG9yeUludGVyZmFjZQp7CnVzZSBDYW5vbmljYWxQYWNrYWdlc1RyYWl0OwoKCgoKcHJvdGVjdGVkICRkZXZQYWNrYWdlTmFtZXMgPSBbXTsKCgpwcml2YXRlICRkZXZNb2RlID0gbnVsbDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZNb2RlKCkKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXZQYWNrYWdlTmFtZXMoYXJyYXkgJGRldlBhY2thZ2VOYW1lcykKewokdGhpcy0+ZGV2UGFja2FnZU5hbWVzID0gJGRldlBhY2thZ2VOYW1lczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldlBhY2thZ2VOYW1lcygpCnsKcmV0dXJuICR0aGlzLT5kZXZQYWNrYWdlTmFtZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShib29sICRkZXZNb2RlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyKQp7CiR0aGlzLT5kZXZNb2RlID0gJGRldk1vZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZWxvYWQoKQp7CiR0aGlzLT5kZXZNb2RlID0gbnVsbDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxSZXBvc2l0b3J5OwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXEluc3RhbGxlclxJbnN0YWxsYXRpb25NYW5hZ2VyOwoKCgoKCgppbnRlcmZhY2UgV3JpdGFibGVSZXBvc2l0b3J5SW50ZXJmYWNlIGV4dGVuZHMgUmVwb3NpdG9yeUludGVyZmFjZQp7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZShib29sICRkZXZNb2RlLCBJbnN0YWxsYXRpb25NYW5hZ2VyICRpbnN0YWxsYXRpb25NYW5hZ2VyKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQYWNrYWdlKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZVBhY2thZ2UoUGFja2FnZUludGVyZmFjZSAkcGFja2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDYW5vbmljYWxQYWNrYWdlcygpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVsb2FkKCk7CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERldlBhY2thZ2VOYW1lcyhhcnJheSAkZGV2UGFja2FnZU5hbWVzKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXZQYWNrYWdlTmFtZXMoKTsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2NyaXB0OwoKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxFdmVudERpc3BhdGNoZXJcRXZlbnQgYXMgQmFzZUV2ZW50OwoKCgoKCgoKY2xhc3MgRXZlbnQgZXh0ZW5kcyBCYXNlRXZlbnQKewoKCgpwcml2YXRlICRjb21wb3NlcjsKCgoKCnByaXZhdGUgJGlvOwoKCgoKcHJpdmF0ZSAkZGV2TW9kZTsKCgoKCnByaXZhdGUgJG9yaWdpbmF0aW5nRXZlbnQ7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgQ29tcG9zZXIgJGNvbXBvc2VyLCBJT0ludGVyZmFjZSAkaW8sIGJvb2wgJGRldk1vZGUgPSBmYWxzZSwgYXJyYXkgJGFyZ3MgPSBbXSwgYXJyYXkgJGZsYWdzID0gW10pCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbmFtZSwgJGFyZ3MsICRmbGFncyk7CiR0aGlzLT5jb21wb3NlciA9ICRjb21wb3NlcjsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+ZGV2TW9kZSA9ICRkZXZNb2RlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXIoKTogQ29tcG9zZXIKewpyZXR1cm4gJHRoaXMtPmNvbXBvc2VyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SU8oKTogSU9JbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmlvOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXZNb2RlKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRldk1vZGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcmlnaW5hdGluZ0V2ZW50KCk6ID9CYXNlRXZlbnQKewpyZXR1cm4gJHRoaXMtPm9yaWdpbmF0aW5nRXZlbnQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9yaWdpbmF0aW5nRXZlbnQoQmFzZUV2ZW50ICRldmVudCk6IHNlbGYKewokdGhpcy0+b3JpZ2luYXRpbmdFdmVudCA9ICR0aGlzLT5jYWxjdWxhdGVPcmlnaW5hdGluZ0V2ZW50KCRldmVudCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY2FsY3VsYXRlT3JpZ2luYXRpbmdFdmVudChCYXNlRXZlbnQgJGV2ZW50KTogQmFzZUV2ZW50CnsKaWYgKCRldmVudCBpbnN0YW5jZW9mIEV2ZW50ICYmICRldmVudC0+Z2V0T3JpZ2luYXRpbmdFdmVudCgpKSB7CnJldHVybiAkdGhpcy0+Y2FsY3VsYXRlT3JpZ2luYXRpbmdFdmVudCgkZXZlbnQtPmdldE9yaWdpbmF0aW5nRXZlbnQoKSk7Cn0KCnJldHVybiAkZXZlbnQ7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2NyaXB0OwoKCgoKCgoKY2xhc3MgU2NyaXB0RXZlbnRzCnsKCgoKCgoKCnB1YmxpYyBjb25zdCBQUkVfSU5TVEFMTF9DTUQgPSAncHJlLWluc3RhbGwtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9JTlNUQUxMX0NNRCA9ICdwb3N0LWluc3RhbGwtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1VQREFURV9DTUQgPSAncHJlLXVwZGF0ZS1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1VQREFURV9DTUQgPSAncG9zdC11cGRhdGUtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX1NUQVRVU19DTUQgPSAncHJlLXN0YXR1cy1jbWQnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX1NUQVRVU19DTUQgPSAncG9zdC1zdGF0dXMtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0FVVE9MT0FEX0RVTVAgPSAncHJlLWF1dG9sb2FkLWR1bXAnOwoKCgoKCgoKCnB1YmxpYyBjb25zdCBQT1NUX0FVVE9MT0FEX0RVTVAgPSAncG9zdC1hdXRvbG9hZC1kdW1wJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUE9TVF9ST09UX1BBQ0tBR0VfSU5TVEFMTCA9ICdwb3N0LXJvb3QtcGFja2FnZS1pbnN0YWxsJzsKCgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfQ1JFQVRFX1BST0pFQ1RfQ01EID0gJ3Bvc3QtY3JlYXRlLXByb2plY3QtY21kJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgUFJFX0FSQ0hJVkVfQ01EID0gJ3ByZS1hcmNoaXZlLWNtZCc7CgoKCgoKCgoKcHVibGljIGNvbnN0IFBPU1RfQVJDSElWRV9DTUQgPSAncG9zdC1hcmNoaXZlLWNtZCc7Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFNlbGZVcGRhdGU7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgS2V5cwp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmluZ2VycHJpbnQoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJGhhc2ggPSBzdHJ0b3VwcGVyKGhhc2goJ3NoYTI1NicsIFByZWc6OnJlcGxhY2UoJ3tcc30nLCAnJywgZmlsZV9nZXRfY29udGVudHMoJHBhdGgpKSkpOwoKcmV0dXJuIGltcGxvZGUoJyAnLCBbCnN1YnN0cigkaGFzaCwgMCwgOCksCnN1YnN0cigkaGFzaCwgOCwgOCksCnN1YnN0cigkaGFzaCwgMTYsIDgpLApzdWJzdHIoJGhhc2gsIDI0LCA4KSwKJycsIApzdWJzdHIoJGhhc2gsIDMyLCA4KSwKc3Vic3RyKCRoYXNoLCA0MCwgOCksCnN1YnN0cigkaGFzaCwgNDgsIDgpLApzdWJzdHIoJGhhc2gsIDU2LCA4KSwKXSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU2VsZlVwZGF0ZTsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cERvd25sb2FkZXI7CnVzZSBDb21wb3NlclxDb25maWc7CgoKCgpjbGFzcyBWZXJzaW9ucwp7CgoKCgpwdWJsaWMgc3RhdGljICRjaGFubmVscyA9IHNlbGY6OkNIQU5ORUxTOwoKcHVibGljIGNvbnN0IENIQU5ORUxTID0gWydzdGFibGUnLCAncHJldmlldycsICdzbmFwc2hvdCcsICcxJywgJzInLCAnMi4yJ107CgoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRjaGFubmVsOwoKcHJpdmF0ZSAkdmVyc2lvbnNEYXRhID0gbnVsbDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChDb25maWcgJGNvbmZpZywgSHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyKQp7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlcjsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGFubmVsKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Y2hhbm5lbCkgewpyZXR1cm4gJHRoaXMtPmNoYW5uZWw7Cn0KCiRjaGFubmVsRmlsZSA9ICR0aGlzLT5jb25maWctPmdldCgnaG9tZScpLicvdXBkYXRlLWNoYW5uZWwnOwppZiAoZmlsZV9leGlzdHMoJGNoYW5uZWxGaWxlKSkgewokY2hhbm5lbCA9IHRyaW0oZmlsZV9nZXRfY29udGVudHMoJGNoYW5uZWxGaWxlKSk7CmlmIChpbl9hcnJheSgkY2hhbm5lbCwgWydzdGFibGUnLCAncHJldmlldycsICdzbmFwc2hvdCcsICcyLjInXSwgdHJ1ZSkpIHsKcmV0dXJuICR0aGlzLT5jaGFubmVsID0gJGNoYW5uZWw7Cn0KfQoKcmV0dXJuICR0aGlzLT5jaGFubmVsID0gJ3N0YWJsZSc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDaGFubmVsKHN0cmluZyAkY2hhbm5lbCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpOiB2b2lkCnsKaWYgKCFpbl9hcnJheSgkY2hhbm5lbCwgc2VsZjo6Q0hBTk5FTFMsIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIGNoYW5uZWwgJy4kY2hhbm5lbC4nLCBtdXN0IGJlIG9uZSBvZjogJyAuIGltcGxvZGUoJywgJywgc2VsZjo6Q0hBTk5FTFMpKTsKfQoKJGNoYW5uZWxGaWxlID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdob21lJykuJy91cGRhdGUtY2hhbm5lbCc7CiR0aGlzLT5jaGFubmVsID0gJGNoYW5uZWw7CgoKJHN0b3JlZENoYW5uZWwgPSBQcmVnOjppc01hdGNoKCd7XlxkKyR9RCcsICRjaGFubmVsKSA/ICdzdGFibGUnIDogJGNoYW5uZWw7CiRwcmV2aW91c2x5U3RvcmVkID0gZmlsZV9leGlzdHMoJGNoYW5uZWxGaWxlKSA/IHRyaW0oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGNoYW5uZWxGaWxlKSkgOiBudWxsOwpmaWxlX3B1dF9jb250ZW50cygkY2hhbm5lbEZpbGUsICRzdG9yZWRDaGFubmVsLlBIUF9FT0wpOwoKaWYgKCRpbyAhPT0gbnVsbCAmJiAkcHJldmlvdXNseVN0b3JlZCAhPT0gJHN0b3JlZENoYW5uZWwpIHsKJGlvLT53cml0ZUVycm9yKCdTdG9yaW5nICI8aW5mbz4nLiRzdG9yZWRDaGFubmVsLic8L2luZm8+IiBhcyBkZWZhdWx0IHVwZGF0ZSBjaGFubmVsIGZvciB0aGUgbmV4dCBzZWxmLXVwZGF0ZSBydW4uJyk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExhdGVzdCg/c3RyaW5nICRjaGFubmVsID0gbnVsbCk6IGFycmF5CnsKJHZlcnNpb25zID0gJHRoaXMtPmdldFZlcnNpb25zRGF0YSgpOwoKZm9yZWFjaCAoJHZlcnNpb25zWyRjaGFubmVsID86ICR0aGlzLT5nZXRDaGFubmVsKCldIGFzICR2ZXJzaW9uKSB7CmlmICgkdmVyc2lvblsnbWluLXBocCddIDw9IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gJHZlcnNpb247Cn0KfQoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJ1RoZXJlIGlzIG5vIHZlcnNpb24gb2YgQ29tcG9zZXIgYXZhaWxhYmxlIGZvciB5b3VyIFBIUCB2ZXJzaW9uICgnLlBIUF9WRVJTSU9OLicpJyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0VmVyc2lvbnNEYXRhKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT52ZXJzaW9uc0RhdGEpIHsKaWYgKCR0aGlzLT5jb25maWctPmdldCgnZGlzYWJsZS10bHMnKSA9PT0gdHJ1ZSkgewokcHJvdG9jb2wgPSAnaHR0cCc7Cn0gZWxzZSB7CiRwcm90b2NvbCA9ICdodHRwcyc7Cn0KCiR0aGlzLT52ZXJzaW9uc0RhdGEgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkcHJvdG9jb2wgLiAnOi8vZ2V0Y29tcG9zZXIub3JnL3ZlcnNpb25zJyktPmRlY29kZUpzb24oKTsKfQoKcmV0dXJuICR0aGlzLT52ZXJzaW9uc0RhdGE7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgQXV0aEhlbHBlcgp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcml2YXRlICRkaXNwbGF5ZWRPcmlnaW5BdXRoZW50aWNhdGlvbnMgPSBbXTsKCnByaXZhdGUgJGJpdGJ1Y2tldFJldHJ5ID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZykKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcmVBdXRoKHN0cmluZyAkb3JpZ2luLCAkc3RvcmVBdXRoKTogdm9pZAp7CiRzdG9yZSA9IGZhbHNlOwokY29uZmlnU291cmNlID0gJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwppZiAoJHN0b3JlQXV0aCA9PT0gdHJ1ZSkgewokc3RvcmUgPSAkY29uZmlnU291cmNlOwp9IGVsc2VpZiAoJHN0b3JlQXV0aCA9PT0gJ3Byb21wdCcpIHsKJGFuc3dlciA9ICR0aGlzLT5pby0+YXNrQW5kVmFsaWRhdGUoCidEbyB5b3Ugd2FudCB0byBzdG9yZSBjcmVkZW50aWFscyBmb3IgJy4kb3JpZ2luLicgaW4gJy4kY29uZmlnU291cmNlLT5nZXROYW1lKCkuJyA/IFtZbl0gJywKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpOiBzdHJpbmcgewokaW5wdXQgPSBzdHJ0b2xvd2VyKHN1YnN0cih0cmltKCR2YWx1ZSksIDAsIDEpKTsKaWYgKGluX2FycmF5KCRpbnB1dCwgWyd5JywnbiddKSkgewpyZXR1cm4gJGlucHV0Owp9CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUGxlYXNlIGFuc3dlciAoeSllcyBvciAobilvJyk7Cn0sCm51bGwsCid5JwopOwoKaWYgKCRhbnN3ZXIgPT09ICd5Jykgewokc3RvcmUgPSAkY29uZmlnU291cmNlOwp9Cn0KaWYgKCRzdG9yZSkgewokc3RvcmUtPmFkZENvbmZpZ1NldHRpbmcoCidodHRwLWJhc2ljLicuJG9yaWdpbiwKJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKQopOwp9Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9tcHRBdXRoSWZOZWVkZWQoc3RyaW5nICR1cmwsIHN0cmluZyAkb3JpZ2luLCBpbnQgJHN0YXR1c0NvZGUsID9zdHJpbmcgJHJlYXNvbiA9IG51bGwsIGFycmF5ICRoZWFkZXJzID0gW10sIGludCAkcmV0cnlDb3VudCA9IDApOiBhcnJheQp7CiRzdG9yZUF1dGggPSBmYWxzZTsKCmlmIChpbl9hcnJheSgkb3JpZ2luLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiRnaXRIdWJVdGlsID0gbmV3IEdpdEh1YigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsIG51bGwpOwokbWVzc2FnZSA9ICJcbiI7CgokcmF0ZUxpbWl0ZWQgPSAkZ2l0SHViVXRpbC0+aXNSYXRlTGltaXRlZCgkaGVhZGVycyk7CiRyZXF1aXJlc1NzbyA9ICRnaXRIdWJVdGlsLT5yZXF1aXJlc1NzbygkaGVhZGVycyk7CgppZiAoJHJlcXVpcmVzU3NvKSB7CiRzc29VcmwgPSAkZ2l0SHViVXRpbC0+Z2V0U3NvVXJsKCRoZWFkZXJzKTsKJG1lc3NhZ2UgPSAnR2l0SHViIEFQSSB0b2tlbiByZXF1aXJlcyBTU08gYXV0aG9yaXphdGlvbi4gQXV0aG9yaXplIHRoaXMgdG9rZW4gYXQgJyAuICRzc29VcmwgLiAiXG4iOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwppZiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnIC4gJG9yaWdpbiwgNDAzKTsKfQokdGhpcy0+aW8tPmFzaygnQWZ0ZXIgYXV0aG9yaXppbmcgeW91ciB0b2tlbiwgY29uZmlybSB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHJldHJ5IHRoZSByZXF1ZXN0Jyk7CgpyZXR1cm4gWydyZXRyeScgPT4gdHJ1ZSwgJ3N0b3JlQXV0aCcgPT4gJHN0b3JlQXV0aF07Cn0KCmlmICgkcmF0ZUxpbWl0ZWQpIHsKJHJhdGVMaW1pdCA9ICRnaXRIdWJVdGlsLT5nZXRSYXRlTGltaXQoJGhlYWRlcnMpOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokbWVzc2FnZSA9ICdSZXZpZXcgeW91ciBjb25maWd1cmVkIEdpdEh1YiBPQXV0aCB0b2tlbiBvciBlbnRlciBhIG5ldyBvbmUgdG8gZ28gb3ZlciB0aGUgQVBJIHJhdGUgbGltaXQuJzsKfSBlbHNlIHsKJG1lc3NhZ2UgPSAnQ3JlYXRlIGEgR2l0SHViIE9BdXRoIHRva2VuIHRvIGdvIG92ZXIgdGhlIEFQSSByYXRlIGxpbWl0Lic7Cn0KCiRtZXNzYWdlID0gc3ByaW50ZigKJ0dpdEh1YiBBUEkgbGltaXQgKCVkIGNhbGxzL2hyKSBpcyBleGhhdXN0ZWQsIGNvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJy4gJy4kbWVzc2FnZS4nIFlvdSBjYW4gYWxzbyB3YWl0IHVudGlsICVzIGZvciB0aGUgcmF0ZSBsaW1pdCB0byByZXNldC4nLAokcmF0ZUxpbWl0WydsaW1pdCddLAokcmF0ZUxpbWl0WydyZXNldCddCikuIlxuIjsKfSBlbHNlIHsKJG1lc3NhZ2UgLj0gJ0NvdWxkIG5vdCBmZXRjaCAnLiR1cmwuJywgcGxlYXNlICc7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRtZXNzYWdlIC49ICdyZXZpZXcgeW91ciBjb25maWd1cmVkIEdpdEh1YiBPQXV0aCB0b2tlbiBvciBlbnRlciBhIG5ldyBvbmUgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwp9IGVsc2UgewokbWVzc2FnZSAuPSAnY3JlYXRlIGEgR2l0SHViIE9BdXRoIHRva2VuIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKfQp9CgppZiAoISRnaXRIdWJVdGlsLT5hdXRob3JpemVPQXV0aCgkb3JpZ2luKQomJiAoISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpIHx8ICEkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRvcmlnaW4sICRtZXNzYWdlKSkKKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ0NvdWxkIG5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCAnLiRvcmlnaW4sIDQwMSk7Cn0KfSBlbHNlaWYgKGluX2FycmF5KCRvcmlnaW4sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKJG1lc3NhZ2UgPSAiXG4iLidDb3VsZCBub3QgZmV0Y2ggJy4kdXJsLicsIGVudGVyIHlvdXIgJyAuICRvcmlnaW4gLiAnIGNyZWRlbnRpYWxzICcgLigkc3RhdHVzQ29kZSA9PT0gNDAxID8gJ3RvIGFjY2VzcyBwcml2YXRlIHJlcG9zJyA6ICd0byBnbyBvdmVyIHRoZSBBUEkgcmF0ZSBsaW1pdCcpOwokZ2l0TGFiVXRpbCA9IG5ldyBHaXRMYWIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCBudWxsKTsKCiRhdXRoID0gbnVsbDsKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW4pOwppZiAoaW5fYXJyYXkoJGF1dGhbJ3Bhc3N3b3JkJ10sIFsnZ2l0bGFiLWNpLXRva2VuJywgJ3ByaXZhdGUtdG9rZW4nLCAnb2F1dGgyJ10sIHRydWUpKSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIkludmFsaWQgY3JlZGVudGlhbHMgZm9yICciIC4gJHVybCAuICInLCBhYm9ydGluZy4iLCAkc3RhdHVzQ29kZSk7Cn0KfQoKaWYgKCEkZ2l0TGFiVXRpbC0+YXV0aG9yaXplT0F1dGgoJG9yaWdpbikKJiYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSB8fCAhJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseShwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9TQ0hFTUUpLCAkb3JpZ2luLCAkbWVzc2FnZSkpCikgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDb3VsZCBub3QgYXV0aGVudGljYXRlIGFnYWluc3QgJy4kb3JpZ2luLCA0MDEpOwp9CgppZiAoJGF1dGggIT09IG51bGwgJiYgJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewppZiAoJGF1dGggPT09ICR0aGlzLT5pby0+Z2V0QXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjcmVkZW50aWFscyBmb3IgJyIgLiAkdXJsIC4gIicsIGFib3J0aW5nLiIsICRzdGF0dXNDb2RlKTsKfQp9Cn0gZWxzZWlmICgkb3JpZ2luID09PSAnYml0YnVja2V0Lm9yZycgfHwgJG9yaWdpbiA9PT0gJ2FwaS5iaXRidWNrZXQub3JnJykgewokYXNrRm9yT0F1dGhUb2tlbiA9IHRydWU7CiRvcmlnaW4gPSAnYml0YnVja2V0Lm9yZyc7CmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRvcmlnaW4pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKTsKaWYgKCRhdXRoWyd1c2VybmFtZSddICE9PSAneC10b2tlbi1hdXRoJykgewokYml0YnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnKTsKJGFjY2Vzc1Rva2VuID0gJGJpdGJ1Y2tldFV0aWwtPnJlcXVlc3RUb2tlbigkb3JpZ2luLCAkYXV0aFsndXNlcm5hbWUnXSwgJGF1dGhbJ3Bhc3N3b3JkJ10pOwppZiAoIWVtcHR5KCRhY2Nlc3NUb2tlbikpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luLCAneC10b2tlbi1hdXRoJywgJGFjY2Vzc1Rva2VuKTsKJGFza0Zvck9BdXRoVG9rZW4gPSBmYWxzZTsKfQp9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5iaXRidWNrZXRSZXRyeVskdXJsXSkpIHsKCgoKJGFza0Zvck9BdXRoVG9rZW4gPSBmYWxzZTsKJHRoaXMtPmJpdGJ1Y2tldFJldHJ5WyR1cmxdID0gdHJ1ZTsKfSBlbHNlIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0ICcgLiAkb3JpZ2luLCA0MDEpOwp9Cn0KCmlmICgkYXNrRm9yT0F1dGhUb2tlbikgewokbWVzc2FnZSA9ICJcbiIuJ0NvdWxkIG5vdCBmZXRjaCAnIC4gJHVybCAuICcsIHBsZWFzZSBjcmVhdGUgYSBiaXRidWNrZXQgT0F1dGggdG9rZW4gdG8gJyAuICgoJHN0YXR1c0NvZGUgPT09IDQwMSB8fCAkc3RhdHVzQ29kZSA9PT0gNDAzKSA/ICdhY2Nlc3MgcHJpdmF0ZSByZXBvcycgOiAnZ28gb3ZlciB0aGUgQVBJIHJhdGUgbGltaXQnKTsKJGJpdEJ1Y2tldFV0aWwgPSBuZXcgQml0YnVja2V0KCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZyk7CmlmICghJGJpdEJ1Y2tldFV0aWwtPmF1dGhvcml6ZU9BdXRoKCRvcmlnaW4pCiYmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkgfHwgISRiaXRCdWNrZXRVdGlsLT5hdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoJG9yaWdpbiwgJG1lc3NhZ2UpKQopIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignQ291bGQgbm90IGF1dGhlbnRpY2F0ZSBhZ2FpbnN0ICcgLiAkb3JpZ2luLCA0MDEpOwp9Cn0KfSBlbHNlIHsKCmlmICgkc3RhdHVzQ29kZSA9PT0gNDA0KSB7CnJldHVybiBbJ3JldHJ5JyA9PiBmYWxzZSwgJ3N0b3JlQXV0aCcgPT4gZmFsc2VdOwp9CgoKaWYgKCEkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewppZiAoJHN0YXR1c0NvZGUgPT09IDQwMSkgewokbWVzc2FnZSA9ICJUaGUgJyIgLiAkdXJsIC4gIicgVVJMIHJlcXVpcmVkIGF1dGhlbnRpY2F0aW9uIChIVFRQIDQwMSkuXG5Zb3UgbXVzdCBiZSB1c2luZyB0aGUgaW50ZXJhY3RpdmUgY29uc29sZSB0byBhdXRoZW50aWNhdGUiOwp9IGVsc2VpZiAoJHN0YXR1c0NvZGUgPT09IDQwMykgewokbWVzc2FnZSA9ICJUaGUgJyIgLiAkdXJsIC4gIicgVVJMIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZCAoSFRUUCA0MDMpOiAiIC4gJHJlYXNvbjsKfSBlbHNlIHsKJG1lc3NhZ2UgPSAiVW5rbm93biBlcnJvciBjb2RlICciIC4gJHN0YXR1c0NvZGUgLiAiJywgcmVhc29uOiAiIC4gJHJlYXNvbjsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigkbWVzc2FnZSwgJHN0YXR1c0NvZGUpOwp9CgoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJG9yaWdpbikpIHsKCgppZiAoJHJldHJ5Q291bnQgPT09IDApIHsKcmV0dXJuIFsncmV0cnknID0+IHRydWUsICdzdG9yZUF1dGgnID0+IGZhbHNlXTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbigiSW52YWxpZCBjcmVkZW50aWFscyAoSFRUUCAkc3RhdHVzQ29kZSkgZm9yICckdXJsJywgYWJvcnRpbmcuIiwgJHN0YXR1c0NvZGUpOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCAoPGluZm8+Jy4kb3JpZ2luLic8L2luZm8+KTonKTsKJHVzZXJuYW1lID0gJHRoaXMtPmlvLT5hc2soJyAgICAgIFVzZXJuYW1lOiAnKTsKJHBhc3N3b3JkID0gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCcgICAgICBQYXNzd29yZDogJyk7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpbiwgJHVzZXJuYW1lLCAkcGFzc3dvcmQpOwokc3RvcmVBdXRoID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdzdG9yZS1hdXRocycpOwp9CgpyZXR1cm4gWydyZXRyeScgPT4gdHJ1ZSwgJ3N0b3JlQXV0aCcgPT4gJHN0b3JlQXV0aF07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQXV0aGVudGljYXRpb25IZWFkZXIoYXJyYXkgJGhlYWRlcnMsIHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHVybCk6IGFycmF5CnsKdHJpZ2dlcl9lcnJvcignQXV0aEhlbHBlcjo6YWRkQXV0aGVudGljYXRpb25IZWFkZXIgaXMgZGVwcmVjYXRlZCBzaW5jZSBDb21wb3NlciAyLjkgdXNlIGFkZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiRvcHRpb25zID0gWydodHRwJyA9PiBbJ2hlYWRlcicgPT4gJiRoZWFkZXJzXV07CiRvcHRpb25zID0gJHRoaXMtPmFkZEF1dGhlbnRpY2F0aW9uT3B0aW9ucygkb3B0aW9ucywgJG9yaWdpbiwgJHVybCk7CgpyZXR1cm4gJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEF1dGhlbnRpY2F0aW9uT3B0aW9ucyhhcnJheSAkb3B0aW9ucywgc3RyaW5nICRvcmlnaW4sIHN0cmluZyAkdXJsKTogYXJyYXkKewppZiAoIWlzc2V0KCRvcHRpb25zWydodHRwJ10pKSB7CiRvcHRpb25zWydodHRwJ10gPSBbXTsKfQppZiAoIWlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IFtdOwp9CiRoZWFkZXJzID0gJiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkb3JpZ2luKSkgewokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9IG51bGw7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luKTsKaWYgKCRhdXRoWydwYXNzd29yZCddID09PSAnYmVhcmVyJykgewokaGVhZGVyc1tdID0gJ0F1dGhvcml6YXRpb246IEJlYXJlciAnLiRhdXRoWyd1c2VybmFtZSddOwp9IGVsc2VpZiAoJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdjdXN0b20taGVhZGVycycpIHsKCiRjdXN0b21IZWFkZXJzID0gbnVsbDsKaWYgKGlzX3N0cmluZygkYXV0aFsndXNlcm5hbWUnXSkpIHsKJGN1c3RvbUhlYWRlcnMgPSBqc29uX2RlY29kZSgkYXV0aFsndXNlcm5hbWUnXSwgdHJ1ZSk7Cn0KaWYgKGlzX2FycmF5KCRjdXN0b21IZWFkZXJzKSkgewpmb3JlYWNoICgkY3VzdG9tSGVhZGVycyBhcyAkaGVhZGVyKSB7CiRoZWFkZXJzW10gPSAkaGVhZGVyOwp9CiRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlID0gJ1VzaW5nIGN1c3RvbSBIVFRQIGhlYWRlcnMgZm9yIGF1dGhlbnRpY2F0aW9uJzsKfQp9IGVsc2VpZiAoJ2dpdGh1Yi5jb20nID09PSAkb3JpZ2luICYmICd4LW9hdXRoLWJhc2ljJyA9PT0gJGF1dGhbJ3Bhc3N3b3JkJ10pIHsKCmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL2FwaVwuZ2l0aHViXC5jb20vfScsICR1cmwpKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogdG9rZW4gJy4kYXV0aFsndXNlcm5hbWUnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgR2l0SHViIHRva2VuIGF1dGhlbnRpY2F0aW9uJzsKfQp9IGVsc2VpZiAoCmluX2FycmF5KCRhdXRoWydwYXNzd29yZCddLCBbJ29hdXRoMicsICdwcml2YXRlLXRva2VuJywgJ2dpdGxhYi1jaS10b2tlbiddLCB0cnVlKQomJiBpbl9hcnJheSgkb3JpZ2luLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpCikgewppZiAoJGF1dGhbJ3Bhc3N3b3JkJ10gPT09ICdvYXV0aDInKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICcuJGF1dGhbJ3VzZXJuYW1lJ107CiRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlID0gJ1VzaW5nIEdpdExhYiBPQXV0aCB0b2tlbiBhdXRoZW50aWNhdGlvbic7Cn0gZWxzZSB7CiRoZWFkZXJzW10gPSAnUFJJVkFURS1UT0tFTjogJy4kYXV0aFsndXNlcm5hbWUnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgR2l0TGFiIHByaXZhdGUgdG9rZW4gYXV0aGVudGljYXRpb24nOwp9Cn0gZWxzZWlmICgKJ2JpdGJ1Y2tldC5vcmcnID09PSAkb3JpZ2luCiYmICR1cmwgIT09IEJpdGJ1Y2tldDo6T0FVVEgyX0FDQ0VTU19UT0tFTl9VUkwKJiYgJ3gtdG9rZW4tYXV0aCcgPT09ICRhdXRoWyd1c2VybmFtZSddCikgewppZiAoISR0aGlzLT5pc1B1YmxpY0JpdEJ1Y2tldERvd25sb2FkKCR1cmwpKSB7CiRoZWFkZXJzW10gPSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICcgLiAkYXV0aFsncGFzc3dvcmQnXTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgQml0YnVja2V0IE9BdXRoIHRva2VuIGF1dGhlbnRpY2F0aW9uJzsKfQp9IGVsc2VpZiAoJ2NsaWVudC1jZXJ0aWZpY2F0ZScgPT09ICRhdXRoWyd1c2VybmFtZSddKSB7CiRvcHRpb25zWydzc2wnXSA9IGFycmF5X21lcmdlKCRvcHRpb25zWydzc2wnXSA/PyBbXSwganNvbl9kZWNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10sIHRydWUpKTsKJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UgPSAnVXNpbmcgU1NMIGNsaWVudCBjZXJ0aWZpY2F0ZSc7Cn0gZWxzZSB7CiRhdXRoU3RyID0gYmFzZTY0X2VuY29kZSgkYXV0aFsndXNlcm5hbWUnXSAuICc6JyAuICRhdXRoWydwYXNzd29yZCddKTsKJGhlYWRlcnNbXSA9ICdBdXRob3JpemF0aW9uOiBCYXNpYyAnLiRhdXRoU3RyOwokYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSA9ICdVc2luZyBIVFRQIGJhc2ljIGF1dGhlbnRpY2F0aW9uIHdpdGggdXNlcm5hbWUgIicgLiAkYXV0aFsndXNlcm5hbWUnXSAuICciJzsKfQoKaWYgKCRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlICYmICghaXNzZXQoJHRoaXMtPmRpc3BsYXllZE9yaWdpbkF1dGhlbnRpY2F0aW9uc1skb3JpZ2luXSkgfHwgJHRoaXMtPmRpc3BsYXllZE9yaWdpbkF1dGhlbnRpY2F0aW9uc1skb3JpZ2luXSAhPT0gJGF1dGhlbnRpY2F0aW9uRGlzcGxheU1lc3NhZ2UpKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkYXV0aGVudGljYXRpb25EaXNwbGF5TWVzc2FnZSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKJHRoaXMtPmRpc3BsYXllZE9yaWdpbkF1dGhlbnRpY2F0aW9uc1skb3JpZ2luXSA9ICRhdXRoZW50aWNhdGlvbkRpc3BsYXlNZXNzYWdlOwp9Cn0gZWxzZWlmIChpbl9hcnJheSgkb3JpZ2luLCBbJ2FwaS5iaXRidWNrZXQub3JnJywgJ2FwaS5naXRodWIuY29tJ10sIHRydWUpKSB7CnJldHVybiAkdGhpcy0+YWRkQXV0aGVudGljYXRpb25PcHRpb25zKCRvcHRpb25zLCBzdHJfcmVwbGFjZSgnYXBpLicsICcnLCAkb3JpZ2luKSwgJHVybCk7Cn0KCnJldHVybiAkb3B0aW9uczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1B1YmxpY0JpdEJ1Y2tldERvd25sb2FkKHN0cmluZyAkdXJsVG9CaXRCdWNrZXRGaWxlKTogYm9vbAp7CiRkb21haW4gPSBwYXJzZV91cmwoJHVybFRvQml0QnVja2V0RmlsZSwgUEhQX1VSTF9IT1NUKTsKaWYgKHN0cnBvcygkZG9tYWluLCAnYml0YnVja2V0Lm9yZycpID09PSBmYWxzZSkgewoKCnJldHVybiB0cnVlOwp9CgokcGF0aCA9IHBhcnNlX3VybCgkdXJsVG9CaXRCdWNrZXRGaWxlLCBQSFBfVVJMX1BBVEgpOwoKCgokcGF0aFBhcnRzID0gZXhwbG9kZSgnLycsICRwYXRoKTsKCnJldHVybiBjb3VudCgkcGF0aFBhcnRzKSA+PSA0ICYmICRwYXRoUGFydHNbM10gPT09ICdkb3dubG9hZHMnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcRmFjdG9yeTsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgpjbGFzcyBCaXRidWNrZXQKewoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRwcm9jZXNzOwoKcHJpdmF0ZSAkaHR0cERvd25sb2FkZXI7Cgpwcml2YXRlICR0b2tlbiA9IG51bGw7Cgpwcml2YXRlICR0aW1lOwoKcHVibGljIGNvbnN0IE9BVVRIMl9BQ0NFU1NfVE9LRU5fVVJMID0gJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy9zaXRlL29hdXRoMi9hY2Nlc3NfdG9rZW4nOwoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsLCA/SHR0cERvd25sb2FkZXIgJGh0dHBEb3dubG9hZGVyID0gbnVsbCwgP2ludCAkdGltZSA9IG51bGwpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzcyA/OiBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCRpbyk7CiR0aGlzLT5odHRwRG93bmxvYWRlciA9ICRodHRwRG93bmxvYWRlciA/OiBGYWN0b3J5OjpjcmVhdGVIdHRwRG93bmxvYWRlcigkdGhpcy0+aW8sICRjb25maWcpOwokdGhpcy0+dGltZSA9ICR0aW1lOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW4oKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGgoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKaWYgKCRvcmlnaW5VcmwgIT09ICdiaXRidWNrZXQub3JnJykgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY29uZmlnJywgJ2JpdGJ1Y2tldC5hY2Nlc3N0b2tlbiddLCAkb3V0cHV0KSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICd4LXRva2VuLWF1dGgnLCB0cmltKCRvdXRwdXQpKTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVxdWVzdEFjY2Vzc1Rva2VuKCk6IGJvb2wKewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldChzZWxmOjpPQVVUSDJfQUNDRVNTX1RPS0VOX1VSTCwgWwoncmV0cnktYXV0aC1mYWlsdXJlJyA9PiBmYWxzZSwKJ2h0dHAnID0+IFsKJ21ldGhvZCcgPT4gJ1BPU1QnLAonY29udGVudCcgPT4gJ2dyYW50X3R5cGU9Y2xpZW50X2NyZWRlbnRpYWxzJywKXSwKXSk7CgokdG9rZW4gPSAkcmVzcG9uc2UtPmRlY29kZUpzb24oKTsKaWYgKCFpc3NldCgkdG9rZW5bJ2V4cGlyZXNfaW4nXSkgfHwgIWlzc2V0KCR0b2tlblsnYWNjZXNzX3Rva2VuJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0V4cGVjdGVkIGEgdG9rZW4gY29uZmlndXJlZCB3aXRoIGV4cGlyZXNfaW4gYW5kIGFjY2Vzc190b2tlbiBwcmVzZW50LCBnb3QgJy5qc29uX2VuY29kZSgkdG9rZW4pKTsKfQoKJHRoaXMtPnRva2VuID0gJHRva2VuOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKCRlLT5nZXRDb2RlKCkgPT09IDQwMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5JbnZhbGlkIE9BdXRoIGNvbnN1bWVyIHByb3ZpZGVkLjwvZXJyb3I+Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVGhpcyBjYW4gaGF2ZSB0aHJlZSByZWFzb25zOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzEuIFlvdSBhcmUgYXV0aGVudGljYXRpbmcgd2l0aCBhIGJpdGJ1Y2tldCB1c2VybmFtZS9wYXNzd29yZCBjb21iaW5hdGlvbicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzIuIFlvdSBhcmUgdXNpbmcgYW4gT0F1dGggY29uc3VtZXIsIGJ1dCBkaWRuXCd0IGNvbmZpZ3VyZSBhIChkdW1teSkgY2FsbGJhY2sgdXJsJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignMy4gWW91IGFyZSB1c2luZyBhbiBPQXV0aCBjb25zdW1lciwgYnV0IGRpZG5cJ3QgY29uZmlndXJlIGl0IGFzIHByaXZhdGUgY29uc3VtZXInKTsKCnJldHVybiBmYWxzZTsKfQppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDAxXSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBPQXV0aCBjb25zdW1lciBwcm92aWRlZC48L2Vycm9yPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggYml0YnVja2V0LW9hdXRoLmJpdGJ1Y2tldC5vcmcgPGNvbnN1bWVyLWtleT4gPGNvbnN1bWVyLXNlY3JldD4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93ICRlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseShzdHJpbmcgJG9yaWdpblVybCwgP3N0cmluZyAkbWVzc2FnZSA9IG51bGwpOiBib29sCnsKaWYgKCRtZXNzYWdlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkbWVzc2FnZSk7Cn0KCiRsb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTsKJHVybCA9ICdodHRwczovL3N1cHBvcnQuYXRsYXNzaWFuLmNvbS9iaXRidWNrZXQtY2xvdWQvZG9jcy91c2Utb2F1dGgtb24tYml0YnVja2V0LWNsb3VkLyc7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgaGVyZTonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCR1cmwpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZigndG8gY3JlYXRlIGEgY29uc3VtZXIuIEl0IHdpbGwgYmUgc3RvcmVkIGluICIlcyIgZm9yIGZ1dHVyZSB1c2UgYnkgQ29tcG9zZXIuJywgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnLT5nZXROYW1lKCkgLiAnIE9SICcgOiAnJykgLiAkdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPmdldE5hbWUoKSkpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0Vuc3VyZSB5b3UgZW50ZXIgYSAiQ2FsbGJhY2sgVVJMIiAoaHR0cDovL2V4YW1wbGUuY29tIGlzIGZpbmUpIG9yIGl0IHdpbGwgbm90IGJlIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbiBBY2Nlc3MgVG9rZW4gKHRoaXMgY2FsbGJhY2sgdXJsIHdpbGwgbm90IGJlIHVzZWQgYnkgY29tcG9zZXIpJyk7Cgokc3RvcmVJbkxvY2FsQXV0aENvbmZpZyA9IGZhbHNlOwppZiAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCkgewokc3RvcmVJbkxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5pby0+YXNrQ29uZmlybWF0aW9uKCdBIGxvY2FsIGF1dGggY29uZmlnIHNvdXJjZSB3YXMgZm91bmQsIGRvIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0b2tlbiB0aGVyZT8nLCB0cnVlKTsKfQoKJGNvbnN1bWVyS2V5ID0gdHJpbSgoc3RyaW5nKSAkdGhpcy0+aW8tPmFza0FuZEhpZGVBbnN3ZXIoJ0NvbnN1bWVyIEtleSAoaGlkZGVuKTogJykpOwoKaWYgKCEkY29uc3VtZXJLZXkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz5ObyBjb25zdW1lciBrZXkgZ2l2ZW4sIGFib3J0aW5nLjwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGJpdGJ1Y2tldC1vYXV0aC5iaXRidWNrZXQub3JnIDxjb25zdW1lci1rZXk+IDxjb25zdW1lci1zZWNyZXQ+IicpOwoKcmV0dXJuIGZhbHNlOwp9CgokY29uc3VtZXJTZWNyZXQgPSB0cmltKChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignQ29uc3VtZXIgU2VjcmV0IChoaWRkZW4pOiAnKSk7CgppZiAoISRjb25zdW1lclNlY3JldCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPk5vIGNvbnN1bWVyIHNlY3JldCBnaXZlbiwgYWJvcnRpbmcuPC93YXJuaW5nPicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1lvdSBjYW4gYWxzbyBhZGQgaXQgbWFudWFsbHkgbGF0ZXIgYnkgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggYml0YnVja2V0LW9hdXRoLmJpdGJ1Y2tldC5vcmcgPGNvbnN1bWVyLWtleT4gPGNvbnN1bWVyLXNlY3JldD4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJGNvbnN1bWVyS2V5LCAkY29uc3VtZXJTZWNyZXQpOwoKaWYgKCEkdGhpcy0+cmVxdWVzdEFjY2Vzc1Rva2VuKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKJGF1dGhDb25maWdTb3VyY2UgPSAkc3RvcmVJbkxvY2FsQXV0aENvbmZpZyAmJiAkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZyA6ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKJHRoaXMtPnN0b3JlSW5BdXRoQ29uZmlnKCRhdXRoQ29uZmlnU291cmNlLCAkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CgoKJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5yZW1vdmVDb25maWdTZXR0aW5nKCdodHRwLWJhc2ljLicgLiAkb3JpZ2luVXJsKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+Q29uc3VtZXIgc3RvcmVkIHN1Y2Nlc3NmdWxseS48L2luZm8+Jyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlcXVlc3RUb2tlbihzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRjb25zdW1lcktleSwgc3RyaW5nICRjb25zdW1lclNlY3JldCk6IHN0cmluZwp7CmlmICgkdGhpcy0+dG9rZW4gIT09IG51bGwgfHwgJHRoaXMtPmdldFRva2VuRnJvbUNvbmZpZygkb3JpZ2luVXJsKSkgewpyZXR1cm4gJHRoaXMtPnRva2VuWydhY2Nlc3NfdG9rZW4nXTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkY29uc3VtZXJLZXksICRjb25zdW1lclNlY3JldCk7CmlmICghJHRoaXMtPnJlcXVlc3RBY2Nlc3NUb2tlbigpKSB7CnJldHVybiAnJzsKfQoKJHRoaXMtPnN0b3JlSW5BdXRoQ29uZmlnKCR0aGlzLT5jb25maWctPmdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpID8/ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKSwgJG9yaWdpblVybCwgJGNvbnN1bWVyS2V5LCAkY29uc3VtZXJTZWNyZXQpOwoKaWYgKCFpc3NldCgkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0b2tlbiBhYm92ZScpOwp9CgpyZXR1cm4gJHRoaXMtPnRva2VuWydhY2Nlc3NfdG9rZW4nXTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzdG9yZUluQXV0aENvbmZpZyhDb25maWdcQ29uZmlnU291cmNlSW50ZXJmYWNlICRhdXRoQ29uZmlnU291cmNlLCBzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRjb25zdW1lcktleSwgc3RyaW5nICRjb25zdW1lclNlY3JldCk6IHZvaWQKewokdGhpcy0+Y29uZmlnLT5nZXRDb25maWdTb3VyY2UoKS0+cmVtb3ZlQ29uZmlnU2V0dGluZygnYml0YnVja2V0LW9hdXRoLicuJG9yaWdpblVybCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPnRva2VuIHx8ICFpc3NldCgkdGhpcy0+dG9rZW5bJ2V4cGlyZXNfaW4nXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignRXhwZWN0ZWQgYSB0b2tlbiBjb25maWd1cmVkIHdpdGggZXhwaXJlc19pbiBwcmVzZW50LCBnb3QgJy5qc29uX2VuY29kZSgkdGhpcy0+dG9rZW4pKTsKfQoKJHRpbWUgPSBudWxsID09PSAkdGhpcy0+dGltZSA/IHRpbWUoKSA6ICR0aGlzLT50aW1lOwokY29uc3VtZXIgPSBbCiJjb25zdW1lci1rZXkiID0+ICRjb25zdW1lcktleSwKImNvbnN1bWVyLXNlY3JldCIgPT4gJGNvbnN1bWVyU2VjcmV0LAoiYWNjZXNzLXRva2VuIiA9PiAkdGhpcy0+dG9rZW5bJ2FjY2Vzc190b2tlbiddLAoiYWNjZXNzLXRva2VuLWV4cGlyYXRpb24iID0+ICR0aW1lICsgJHRoaXMtPnRva2VuWydleHBpcmVzX2luJ10sCl07CgokdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPmFkZENvbmZpZ1NldHRpbmcoJ2JpdGJ1Y2tldC1vYXV0aC4nLiRvcmlnaW5VcmwsICRjb25zdW1lcik7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0VG9rZW5Gcm9tQ29uZmlnKHN0cmluZyAkb3JpZ2luVXJsKTogYm9vbAp7CiRhdXRoQ29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdiaXRidWNrZXQtb2F1dGgnKTsKCmlmICgKIWlzc2V0KCRhdXRoQ29uZmlnWyRvcmlnaW5VcmxdWydhY2Nlc3MtdG9rZW4nXSwgJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbi1leHBpcmF0aW9uJ10pCnx8IHRpbWUoKSA+ICRhdXRoQ29uZmlnWyRvcmlnaW5VcmxdWydhY2Nlc3MtdG9rZW4tZXhwaXJhdGlvbiddCikgewpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT50b2tlbiA9IFsKJ2FjY2Vzc190b2tlbicgPT4gJGF1dGhDb25maWdbJG9yaWdpblVybF1bJ2FjY2Vzcy10b2tlbiddLApdOwoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCmNsYXNzIENvbXBvc2VyTWlycm9yCnsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvY2Vzc1VybChzdHJpbmcgJG1pcnJvclVybCwgc3RyaW5nICRwYWNrYWdlTmFtZSwgc3RyaW5nICR2ZXJzaW9uLCA/c3RyaW5nICRyZWZlcmVuY2UsID9zdHJpbmcgJHR5cGUsID9zdHJpbmcgJHByZXR0eVZlcnNpb24gPSBudWxsKTogc3RyaW5nCnsKaWYgKCRyZWZlcmVuY2UpIHsKJHJlZmVyZW5jZSA9IFByZWc6OmlzTWF0Y2goJ3teKFthLWYwLTldKnwlcmVmZXJlbmNlJSkkfScsICRyZWZlcmVuY2UpID8gJHJlZmVyZW5jZSA6IGhhc2goJ21kNScsICRyZWZlcmVuY2UpOwp9CiR2ZXJzaW9uID0gc3RycG9zKCR2ZXJzaW9uLCAnLycpID09PSBmYWxzZSA/ICR2ZXJzaW9uIDogaGFzaCgnbWQ1JywgJHZlcnNpb24pOwoKJGZyb20gPSBbJyVwYWNrYWdlJScsICcldmVyc2lvbiUnLCAnJXJlZmVyZW5jZSUnLCAnJXR5cGUlJ107CiR0byA9IFskcGFja2FnZU5hbWUsICR2ZXJzaW9uLCAkcmVmZXJlbmNlLCAkdHlwZV07CmlmIChudWxsICE9PSAkcHJldHR5VmVyc2lvbikgewokZnJvbVtdID0gJyVwcmV0dHlWZXJzaW9uJSc7CiR0b1tdID0gJHByZXR0eVZlcnNpb247Cn0KCiR1cmwgPSBzdHJfcmVwbGFjZSgkZnJvbSwgJHRvLCAkbWlycm9yVXJsKTsKYXNzZXJ0KCR1cmwgIT09ICcnKTsKCnJldHVybiAkdXJsOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb2Nlc3NHaXRVcmwoc3RyaW5nICRtaXJyb3JVcmwsIHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkdXJsLCA/c3RyaW5nICR0eXBlKTogc3RyaW5nCnsKaWYgKFByZWc6OmlzTWF0Y2goJyNeKD86KD86aHR0cHM/fGdpdCk6Ly9naXRodWJcLmNvbS98Z2l0QGdpdGh1YlwuY29tOikoW14vXSspLyguKz8pKD86XC5naXQpPyQjJywgJHVybCwgJG1hdGNoKSkgewokdXJsID0gJ2doLScuJG1hdGNoWzFdLicvJy4kbWF0Y2hbMl07Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCcjXmh0dHBzOi8vYml0YnVja2V0XC5vcmcvKFteL10rKS8oLis/KSg/OlwuZ2l0KT8vPyQjJywgJHVybCwgJG1hdGNoKSkgewokdXJsID0gJ2JiLScuJG1hdGNoWzFdLicvJy4kbWF0Y2hbMl07Cn0gZWxzZSB7CiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7W15hLXowLTlfLi1dfWknLCAnLScsIHRyaW0oJHVybCwgJy8nKSk7Cn0KCnJldHVybiBzdHJfcmVwbGFjZSgKWyclcGFja2FnZSUnLCAnJW5vcm1hbGl6ZWRVcmwlJywgJyV0eXBlJSddLApbJHBhY2thZ2VOYW1lLCAkdXJsLCAkdHlwZV0sCiRtaXJyb3JVcmwKKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9jZXNzSGdVcmwoc3RyaW5nICRtaXJyb3JVcmwsIHN0cmluZyAkcGFja2FnZU5hbWUsIHN0cmluZyAkdXJsLCBzdHJpbmcgJHR5cGUpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6cHJvY2Vzc0dpdFVybCgkbWlycm9yVXJsLCAkcGFja2FnZU5hbWUsICR1cmwsICR0eXBlKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBhY2thZ2VcTG9hZGVyXEFycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcVmFsaWRhdGluZ0FycmF5TG9hZGVyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxMb2FkZXJcSW52YWxpZFBhY2thZ2VFeGNlcHRpb247CnVzZSBDb21wb3NlclxKc29uXEpzb25WYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxKc29uXEpzb25GaWxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcU3BkeFxTcGR4TGljZW5zZXM7CnVzZSBTZWxkXEpzb25MaW50XER1cGxpY2F0ZUtleUV4Y2VwdGlvbjsKdXNlIFNlbGRcSnNvbkxpbnRcSnNvblBhcnNlcjsKCgoKCgoKCmNsYXNzIENvbmZpZ1ZhbGlkYXRvcgp7CnB1YmxpYyBjb25zdCBDSEVDS19WRVJTSU9OID0gMTsKCgpwcml2YXRlICRpbzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8pCnsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGUoc3RyaW5nICRmaWxlLCBpbnQgJGFycmF5TG9hZGVyVmFsaWRhdGlvbkZsYWdzID0gVmFsaWRhdGluZ0FycmF5TG9hZGVyOjpDSEVDS19BTEwsIGludCAkZmxhZ3MgPSBzZWxmOjpDSEVDS19WRVJTSU9OKTogYXJyYXkKewokZXJyb3JzID0gW107CiRwdWJsaXNoRXJyb3JzID0gW107CiR3YXJuaW5ncyA9IFtdOwoKCiRsYXhWYWxpZCA9IGZhbHNlOwokbWFuaWZlc3QgPSBudWxsOwp0cnkgewokanNvbiA9IG5ldyBKc29uRmlsZSgkZmlsZSwgbnVsbCwgJHRoaXMtPmlvKTsKJG1hbmlmZXN0ID0gJGpzb24tPnJlYWQoKTsKCiRqc29uLT52YWxpZGF0ZVNjaGVtYShKc29uRmlsZTo6TEFYX1NDSEVNQSk7CiRsYXhWYWxpZCA9IHRydWU7CiRqc29uLT52YWxpZGF0ZVNjaGVtYSgpOwp9IGNhdGNoIChKc29uVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewpmb3JlYWNoICgkZS0+Z2V0RXJyb3JzKCkgYXMgJG1lc3NhZ2UpIHsKaWYgKCRsYXhWYWxpZCkgewokcHVibGlzaEVycm9yc1tdID0gJG1lc3NhZ2U7Cn0gZWxzZSB7CiRlcnJvcnNbXSA9ICRtZXNzYWdlOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokZXJyb3JzW10gPSAkZS0+Z2V0TWVzc2FnZSgpOwoKcmV0dXJuIFskZXJyb3JzLCAkcHVibGlzaEVycm9ycywgJHdhcm5pbmdzXTsKfQoKaWYgKGlzX2FycmF5KCRtYW5pZmVzdCkpIHsKJGpzb25QYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOwp0cnkgewokanNvblBhcnNlci0+cGFyc2UoKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJGZpbGUpLCBKc29uUGFyc2VyOjpERVRFQ1RfS0VZX0NPTkZMSUNUUyk7Cn0gY2F0Y2ggKER1cGxpY2F0ZUtleUV4Y2VwdGlvbiAkZSkgewokZGV0YWlscyA9ICRlLT5nZXREZXRhaWxzKCk7CiR3YXJuaW5nc1tdID0gJ0tleSAnLiRkZXRhaWxzWydrZXknXS4nIGlzIGEgZHVwbGljYXRlIGluICcuJGZpbGUuJyBhdCBsaW5lICcuJGRldGFpbHNbJ2xpbmUnXTsKfQp9CgoKaWYgKGVtcHR5KCRtYW5pZmVzdFsnbGljZW5zZSddKSkgewokd2FybmluZ3NbXSA9ICdObyBsaWNlbnNlIHNwZWNpZmllZCwgaXQgaXMgcmVjb21tZW5kZWQgdG8gZG8gc28uIEZvciBjbG9zZWQtc291cmNlIHNvZnR3YXJlIHlvdSBtYXkgdXNlICJwcm9wcmlldGFyeSIgYXMgbGljZW5zZS4nOwp9IGVsc2UgewokbGljZW5zZXMgPSAoYXJyYXkpICRtYW5pZmVzdFsnbGljZW5zZSddOwoKCmZvcmVhY2ggKCRsaWNlbnNlcyBhcyAka2V5ID0+ICRsaWNlbnNlKSB7CmlmICgncHJvcHJpZXRhcnknID09PSAkbGljZW5zZSkgewp1bnNldCgkbGljZW5zZXNbJGtleV0pOwp9Cn0KCiRsaWNlbnNlVmFsaWRhdG9yID0gbmV3IFNwZHhMaWNlbnNlcygpOwpmb3JlYWNoICgkbGljZW5zZXMgYXMgJGxpY2Vuc2UpIHsKJHNwZHhMaWNlbnNlID0gJGxpY2Vuc2VWYWxpZGF0b3ItPmdldExpY2Vuc2VCeUlkZW50aWZpZXIoJGxpY2Vuc2UpOwppZiAoJHNwZHhMaWNlbnNlICYmICRzcGR4TGljZW5zZVszXSkgewppZiAoUHJlZzo6aXNNYXRjaCgne15bQUxdP0dQTC1bMTIzXShcLlswMV0pP1wrJH1pJywgJGxpY2Vuc2UpKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgIiVzIiBpcyBhIGRlcHJlY2F0ZWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHVzZSAiJy5zdHJfcmVwbGFjZSgnKycsICcnLCAkbGljZW5zZSkuJy1vci1sYXRlciIgaW5zdGVhZCcsCiRsaWNlbnNlCik7Cn0gZWxzZWlmIChQcmVnOjppc01hdGNoKCd7XltBTF0/R1BMLVsxMjNdKFwuWzAxXSk/JH1pJywgJGxpY2Vuc2UpKSB7CiR3YXJuaW5nc1tdID0gc3ByaW50ZigKJ0xpY2Vuc2UgIiVzIiBpcyBhIGRlcHJlY2F0ZWQgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIsIHVzZSAiJy4kbGljZW5zZS4nLW9ubHkiIG9yICInLiRsaWNlbnNlLictb3ItbGF0ZXIiIGluc3RlYWQnLAokbGljZW5zZQopOwp9IGVsc2Ugewokd2FybmluZ3NbXSA9IHNwcmludGYoCidMaWNlbnNlICIlcyIgaXMgYSBkZXByZWNhdGVkIFNQRFggbGljZW5zZSBpZGVudGlmaWVyLCBzZWUgaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8nLAokbGljZW5zZQopOwp9Cn0KfQp9CgppZiAoKCRmbGFncyAmIHNlbGY6OkNIRUNLX1ZFUlNJT04pICYmIGlzc2V0KCRtYW5pZmVzdFsndmVyc2lvbiddKSkgewokd2FybmluZ3NbXSA9ICdUaGUgdmVyc2lvbiBmaWVsZCBpcyBwcmVzZW50LCBpdCBpcyByZWNvbW1lbmRlZCB0byBsZWF2ZSBpdCBvdXQgaWYgdGhlIHBhY2thZ2UgaXMgcHVibGlzaGVkIG9uIFBhY2thZ2lzdC4nOwp9CgppZiAoIWVtcHR5KCRtYW5pZmVzdFsnbmFtZSddKSAmJiBQcmVnOjppc01hdGNoKCd7W0EtWl19JywgJG1hbmlmZXN0WyduYW1lJ10pKSB7CiRzdWdnZXN0TmFtZSA9IFByZWc6OnJlcGxhY2UoJ3soPzooW2Etel0pKFtBLVpdKXwoW0EtWl0pKFtBLVpdW2Etel0pKX0nLCAnXFwxXFwzLVxcMlxcNCcsICRtYW5pZmVzdFsnbmFtZSddKTsKJHN1Z2dlc3ROYW1lID0gc3RydG9sb3dlcigkc3VnZ2VzdE5hbWUpOwoKJHB1Ymxpc2hFcnJvcnNbXSA9IHNwcmludGYoCidOYW1lICIlcyIgZG9lcyBub3QgbWF0Y2ggdGhlIGJlc3QgcHJhY3RpY2UgKGUuZy4gbG93ZXItY2FzZWQvd2l0aC1kYXNoZXMpLiBXZSBzdWdnZXN0IHVzaW5nICIlcyIgaW5zdGVhZC4gQXMgc3VjaCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byBzdWJtaXQgaXQgdG8gUGFja2FnaXN0LicsCiRtYW5pZmVzdFsnbmFtZSddLAokc3VnZ2VzdE5hbWUKKTsKfQoKaWYgKCFlbXB0eSgkbWFuaWZlc3RbJ3R5cGUnXSkgJiYgJG1hbmlmZXN0Wyd0eXBlJ10gPT09ICdjb21wb3Nlci1pbnN0YWxsZXInKSB7CiR3YXJuaW5nc1tdID0gIlRoZSBwYWNrYWdlIHR5cGUgJ2NvbXBvc2VyLWluc3RhbGxlcicgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIGRpc3RyaWJ1dGUgeW91ciBjdXN0b20gaW5zdGFsbGVycyBhcyBwbHVnaW5zIGZyb20gbm93IG9uLiBTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL3BsdWdpbnMubWQgZm9yIHBsdWdpbiBkb2N1bWVudGF0aW9uLiI7Cn0KCgppZiAoaXNzZXQoJG1hbmlmZXN0WydyZXF1aXJlJ10sICRtYW5pZmVzdFsncmVxdWlyZS1kZXYnXSkpIHsKJHJlcXVpcmVPdmVycmlkZXMgPSBhcnJheV9pbnRlcnNlY3Rfa2V5KCRtYW5pZmVzdFsncmVxdWlyZSddLCAkbWFuaWZlc3RbJ3JlcXVpcmUtZGV2J10pOwoKaWYgKCFlbXB0eSgkcmVxdWlyZU92ZXJyaWRlcykpIHsKJHBsdXJhbCA9IChjb3VudCgkcmVxdWlyZU92ZXJyaWRlcykgPiAxKSA/ICdhcmUnIDogJ2lzJzsKJHdhcm5pbmdzW10gPSBpbXBsb2RlKCcsICcsIGFycmF5X2tleXMoJHJlcXVpcmVPdmVycmlkZXMpKS4gIiB7JHBsdXJhbH0gcmVxdWlyZWQgYm90aCBpbiByZXF1aXJlIGFuZCByZXF1aXJlLWRldiwgdGhpcyBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yIjsKfQp9CgoKZm9yZWFjaCAoWydwcm92aWRlJywgJ3JlcGxhY2UnXSBhcyAkbGlua1R5cGUpIHsKaWYgKGlzc2V0KCRtYW5pZmVzdFskbGlua1R5cGVdKSkgewpmb3JlYWNoIChbJ3JlcXVpcmUnLCAncmVxdWlyZS1kZXYnXSBhcyAkcmVxdWlyZVR5cGUpIHsKaWYgKGlzc2V0KCRtYW5pZmVzdFskcmVxdWlyZVR5cGVdKSkgewpmb3JlYWNoICgkbWFuaWZlc3RbJGxpbmtUeXBlXSBhcyAkcHJvdmlkZSA9PiAkY29uc3RyYWludCkgewppZiAoaXNzZXQoJG1hbmlmZXN0WyRyZXF1aXJlVHlwZV1bJHByb3ZpZGVdKSkgewokd2FybmluZ3NbXSA9ICdUaGUgcGFja2FnZSAnIC4gJHByb3ZpZGUgLiAnIGluICcuJHJlcXVpcmVUeXBlLicgaXMgYWxzbyBsaXN0ZWQgaW4gJy4kbGlua1R5cGUuJyB3aGljaCBzYXRpc2ZpZXMgdGhlIHJlcXVpcmVtZW50LiBSZW1vdmUgaXQgZnJvbSAnLiRsaW5rVHlwZS4nIGlmIHlvdSB3aXNoIHRvIGluc3RhbGwgaXQuJzsKfQp9Cn0KfQp9Cn0KCgokcmVxdWlyZSA9ICRtYW5pZmVzdFsncmVxdWlyZSddID8/IFtdOwokcmVxdWlyZURldiA9ICRtYW5pZmVzdFsncmVxdWlyZS1kZXYnXSA/PyBbXTsKJHBhY2thZ2VzID0gYXJyYXlfbWVyZ2UoJHJlcXVpcmUsICRyZXF1aXJlRGV2KTsKZm9yZWFjaCAoJHBhY2thZ2VzIGFzICRwYWNrYWdlID0+ICR2ZXJzaW9uKSB7CmlmIChQcmVnOjppc01hdGNoKCcvIy8nLCAkdmVyc2lvbikpIHsKJHdhcm5pbmdzW10gPSBzcHJpbnRmKAonVGhlIHBhY2thZ2UgIiVzIiBpcyBwb2ludGluZyB0byBhIGNvbW1pdC1yZWYsIHRoaXMgaXMgYmFkIHByYWN0aWNlIGFuZCBjYW4gY2F1c2UgdW5mb3Jlc2VlbiBpc3N1ZXMuJywKJHBhY2thZ2UKKTsKfQp9CgoKJHNjcmlwdHNEZXNjcmlwdGlvbnMgPSAkbWFuaWZlc3RbJ3NjcmlwdHMtZGVzY3JpcHRpb25zJ10gPz8gW107CiRzY3JpcHRzID0gJG1hbmlmZXN0WydzY3JpcHRzJ10gPz8gW107CmZvcmVhY2ggKCRzY3JpcHRzRGVzY3JpcHRpb25zIGFzICRzY3JpcHROYW1lID0+ICRzY3JpcHREZXNjcmlwdGlvbikgewppZiAoIWFycmF5X2tleV9leGlzdHMoJHNjcmlwdE5hbWUsICRzY3JpcHRzKSkgewokd2FybmluZ3NbXSA9IHNwcmludGYoCidEZXNjcmlwdGlvbiBmb3Igbm9uLWV4aXN0ZW50IHNjcmlwdCAiJXMiIGZvdW5kIGluICJzY3JpcHRzLWRlc2NyaXB0aW9ucyInLAokc2NyaXB0TmFtZQopOwp9Cn0KCgokc2NyaXB0QWxpYXNlcyA9ICRtYW5pZmVzdFsnc2NyaXB0cy1hbGlhc2VzJ10gPz8gW107CmZvcmVhY2ggKCRzY3JpcHRBbGlhc2VzIGFzICRzY3JpcHROYW1lID0+ICRzY3JpcHRBbGlhcykgewppZiAoIWFycmF5X2tleV9leGlzdHMoJHNjcmlwdE5hbWUsICRzY3JpcHRzKSkgewokd2FybmluZ3NbXSA9IHNwcmludGYoCidBbGlhc2VzIGZvciBub24tZXhpc3RlbnQgc2NyaXB0ICIlcyIgZm91bmQgaW4gInNjcmlwdHMtYWxpYXNlcyInLAokc2NyaXB0TmFtZQopOwp9Cn0KCgppZiAoaXNzZXQoJG1hbmlmZXN0WydhdXRvbG9hZCddWydwc3ItMCddWycnXSkpIHsKJHdhcm5pbmdzW10gPSAiRGVmaW5pbmcgYXV0b2xvYWQucHNyLTAgd2l0aCBhbiBlbXB0eSBuYW1lc3BhY2UgcHJlZml4IGlzIGEgYmFkIGlkZWEgZm9yIHBlcmZvcm1hbmNlIjsKfQppZiAoaXNzZXQoJG1hbmlmZXN0WydhdXRvbG9hZCddWydwc3ItNCddWycnXSkpIHsKJHdhcm5pbmdzW10gPSAiRGVmaW5pbmcgYXV0b2xvYWQucHNyLTQgd2l0aCBhbiBlbXB0eSBuYW1lc3BhY2UgcHJlZml4IGlzIGEgYmFkIGlkZWEgZm9yIHBlcmZvcm1hbmNlIjsKfQoKJGxvYWRlciA9IG5ldyBWYWxpZGF0aW5nQXJyYXlMb2FkZXIobmV3IEFycmF5TG9hZGVyKCksIHRydWUsIG51bGwsICRhcnJheUxvYWRlclZhbGlkYXRpb25GbGFncyk7CnRyeSB7CmlmICghaXNzZXQoJG1hbmlmZXN0Wyd2ZXJzaW9uJ10pKSB7CiRtYW5pZmVzdFsndmVyc2lvbiddID0gJzEuMC4wJzsKfQppZiAoIWlzc2V0KCRtYW5pZmVzdFsnbmFtZSddKSkgewokbWFuaWZlc3RbJ25hbWUnXSA9ICdkdW1teS9kdW1teSc7Cn0KJGxvYWRlci0+bG9hZCgkbWFuaWZlc3QpOwp9IGNhdGNoIChJbnZhbGlkUGFja2FnZUV4Y2VwdGlvbiAkZSkgewokZXJyb3JzID0gYXJyYXlfbWVyZ2UoJGVycm9ycywgJGUtPmdldEVycm9ycygpKTsKfQoKJHdhcm5pbmdzID0gYXJyYXlfbWVyZ2UoJHdhcm5pbmdzLCAkbG9hZGVyLT5nZXRXYXJuaW5ncygpKTsKCnJldHVybiBbJGVycm9ycywgJHB1Ymxpc2hFcnJvcnMsICR3YXJuaW5nc107Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKCgoKCgoKY2xhc3MgRXJyb3JIYW5kbGVyCnsKCnByaXZhdGUgc3RhdGljICRpbzsKCgpwcml2YXRlIHN0YXRpYyAkaGFzU2hvd25EZXByZWNhdGlvbk5vdGljZSA9IDA7CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlKGludCAkbGV2ZWwsIHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRmaWxlLCBpbnQgJGxpbmUpOiBib29sCnsKJGlzRGVwcmVjYXRpb25Ob3RpY2UgPSAkbGV2ZWwgPT09IEVfREVQUkVDQVRFRCB8fCAkbGV2ZWwgPT09IEVfVVNFUl9ERVBSRUNBVEVEOwoKCmlmICghJGlzRGVwcmVjYXRpb25Ob3RpY2UgJiYgMCA9PT0gKGVycm9yX3JlcG9ydGluZygpICYgJGxldmVsKSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKGZpbHRlcl92YXIoaW5pX2dldCgneGRlYnVnLnNjcmVhbScpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikpIHsKJG1lc3NhZ2UgLj0gIlxuXG5XYXJuaW5nOiBZb3UgaGF2ZSB4ZGVidWcuc2NyZWFtIGVuYWJsZWQsIHRoZSB3YXJuaW5nIGFib3ZlIG1heSBiZSIuCiJcbmEgbGVnaXRpbWF0ZWx5IHN1cHByZXNzZWQgZXJyb3IgdGhhdCB5b3Ugd2VyZSBub3Qgc3VwcG9zZWQgdG8gc2VlLiI7Cn0KCmlmICghJGlzRGVwcmVjYXRpb25Ob3RpY2UpIHsKCgppZiAoaW5fYXJyYXkoJGxldmVsLCBbRV9XQVJOSU5HLCBFX1VTRVJfV0FSTklOR10sIHRydWUpICYmIHN0cl9jb250YWlucygkbWVzc2FnZSwgJ3Nob3VsZCBlaXRoZXIgYmUgdXNlZCBvciBpbnRlbnRpb25hbGx5IGlnbm9yZWQgYnkgY2FzdGluZyBpdCBhcyAodm9pZCknKSkgewpzZWxmOjpvdXRwdXRXYXJuaW5nKCdJZ25vcmVkIG5ldyBQSFAgd2FybmluZyBidXQgaXQgc2hvdWxkIGJlIHJlcG9ydGVkIGFuZCBmaXhlZDogJy4kbWVzc2FnZS4nIGluICcuJGZpbGUuJzonLiRsaW5lLCB0cnVlKTsKCnJldHVybiB0cnVlOwp9Cgp0aHJvdyBuZXcgXEVycm9yRXhjZXB0aW9uKCRtZXNzYWdlLCAwLCAkbGV2ZWwsICRmaWxlLCAkbGluZSk7Cn0KCmlmIChzZWxmOjokaW8gIT09IG51bGwpIHsKaWYgKHNlbGY6OiRoYXNTaG93bkRlcHJlY2F0aW9uTm90aWNlID4gMCAmJiAhc2VsZjo6JGlvLT5pc1ZlcmJvc2UoKSkgewppZiAoc2VsZjo6JGhhc1Nob3duRGVwcmVjYXRpb25Ob3RpY2UgPT09IDEpIHsKc2VsZjo6JGlvLT53cml0ZUVycm9yKCc8d2FybmluZz5Nb3JlIGRlcHJlY2F0aW9uIG5vdGljZXMgd2VyZSBoaWRkZW4sIHJ1biBhZ2FpbiB3aXRoIGAtdmAgdG8gc2hvdyB0aGVtLjwvd2FybmluZz4nKTsKc2VsZjo6JGhhc1Nob3duRGVwcmVjYXRpb25Ob3RpY2UgPSAyOwp9CgpyZXR1cm4gdHJ1ZTsKfQpzZWxmOjokaGFzU2hvd25EZXByZWNhdGlvbk5vdGljZSA9IDE7CnNlbGY6Om91dHB1dFdhcm5pbmcoJ0RlcHJlY2F0aW9uIE5vdGljZTogJy4kbWVzc2FnZS4nIGluICcuJGZpbGUuJzonLiRsaW5lKTsKfQoKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVnaXN0ZXIoP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpOiB2b2lkCnsKc2V0X2Vycm9yX2hhbmRsZXIoW19fQ0xBU1NfXywgJ2hhbmRsZSddKTsKZXJyb3JfcmVwb3J0aW5nKEVfQUxMKTsKc2VsZjo6JGlvID0gJGlvOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBvdXRwdXRXYXJuaW5nKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkb3V0cHV0RXZlbldpdGhvdXRJTyA9IGZhbHNlKTogdm9pZAp7CmlmIChzZWxmOjokaW8gIT09IG51bGwpIHsKc2VsZjo6JGlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nLiRtZXNzYWdlLic8L3dhcm5pbmc+Jyk7CmlmIChzZWxmOjokaW8tPmlzVmVyYm9zZSgpKSB7CnNlbGY6OiRpby0+d3JpdGVFcnJvcignPHdhcm5pbmc+U3RhY2sgdHJhY2U6PC93YXJuaW5nPicpOwpzZWxmOjokaW8tPndyaXRlRXJyb3IoYXJyYXlfZmlsdGVyKGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRhKTogP3N0cmluZyB7CmlmIChpc3NldCgkYVsnbGluZSddLCAkYVsnZmlsZSddKSkgewpyZXR1cm4gJzx3YXJuaW5nPiAnLiRhWydmaWxlJ10uJzonLiRhWydsaW5lJ10uJzwvd2FybmluZz4nOwp9CgpyZXR1cm4gbnVsbDsKfSwgYXJyYXlfc2xpY2UoZGVidWdfYmFja3RyYWNlKCksIDIpKSwgc3RhdGljIGZ1bmN0aW9uICg/c3RyaW5nICRsaW5lKSB7CnJldHVybiAkbGluZSAhPT0gbnVsbDsKfSkpOwp9CgpyZXR1cm47Cn0KCmlmICgkb3V0cHV0RXZlbldpdGhvdXRJTykgewppZiAoZGVmaW5lZCgnU1RERVJSJykgJiYgaXNfcmVzb3VyY2UoU1RERVJSKSkgewpmd3JpdGUoU1RERVJSLCAnV2FybmluZzogJy4kbWVzc2FnZS5QSFBfRU9MKTsKfSBlbHNlIHsKZWNobyAnV2FybmluZzogJy4kbWVzc2FnZS5QSFBfRU9MOwp9Cn0KfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIEVycm9yRXhjZXB0aW9uOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I7CnVzZSBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb25cSU9FeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwoKCgoKCmNsYXNzIEZpbGVzeXN0ZW0KewoKcHJpdmF0ZSAkcHJvY2Vzc0V4ZWN1dG9yOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9Qcm9jZXNzRXhlY3V0b3IgJGV4ZWN1dG9yID0gbnVsbCkKewokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJGV4ZWN1dG9yOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKHN0cmluZyAkZmlsZSkKewppZiAoaXNfZGlyKCRmaWxlKSkgewpyZXR1cm4gJHRoaXMtPnJlbW92ZURpcmVjdG9yeSgkZmlsZSk7Cn0KCmlmIChmaWxlX2V4aXN0cygkZmlsZSkpIHsKcmV0dXJuICR0aGlzLT51bmxpbmsoJGZpbGUpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGlyRW1wdHkoc3RyaW5nICRkaXIpCnsKJGZpbmRlciA9IEZpbmRlcjo6Y3JlYXRlKCkKLT5pZ25vcmVWQ1MoZmFsc2UpCi0+aWdub3JlRG90RmlsZXMoZmFsc2UpCi0+ZGVwdGgoMCkKLT5pbigkZGlyKTsKCnJldHVybiBcY291bnQoJGZpbmRlcikgPT09IDA7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbXB0eURpcmVjdG9yeShzdHJpbmcgJGRpciwgYm9vbCAkZW5zdXJlRGlyZWN0b3J5RXhpc3RzID0gdHJ1ZSkKewppZiAoaXNfbGluaygkZGlyKSAmJiBmaWxlX2V4aXN0cygkZGlyKSkgewokdGhpcy0+dW5saW5rKCRkaXIpOwp9CgppZiAoJGVuc3VyZURpcmVjdG9yeUV4aXN0cykgewokdGhpcy0+ZW5zdXJlRGlyZWN0b3J5RXhpc3RzKCRkaXIpOwp9CgppZiAoaXNfZGlyKCRkaXIpKSB7CiRmaW5kZXIgPSBGaW5kZXI6OmNyZWF0ZSgpCi0+aWdub3JlVkNTKGZhbHNlKQotPmlnbm9yZURvdEZpbGVzKGZhbHNlKQotPmRlcHRoKDApCi0+aW4oJGRpcik7Cgpmb3JlYWNoICgkZmluZGVyIGFzICRwYXRoKSB7CiR0aGlzLT5yZW1vdmUoKHN0cmluZykgJHBhdGgpOwp9Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZURpcmVjdG9yeShzdHJpbmcgJGRpcmVjdG9yeSkKewokZWRnZUNhc2VSZXN1bHQgPSAkdGhpcy0+cmVtb3ZlRWRnZUNhc2VzKCRkaXJlY3RvcnkpOwppZiAoJGVkZ2VDYXNlUmVzdWx0ICE9PSBudWxsKSB7CnJldHVybiAkZWRnZUNhc2VSZXN1bHQ7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCgppZiAoc3RyX2NvbnRhaW5zKCRkaXJlY3RvcnksICc9JykpIHsKcmV0dXJuICR0aGlzLT5yZW1vdmVEaXJlY3RvcnlQaHAoJGRpcmVjdG9yeSk7Cn0KCiRjbWQgPSBbJ3JtZGlyJywgJy9TJywgJy9RJywgUGxhdGZvcm06OnJlYWxwYXRoKCRkaXJlY3RvcnkpXTsKfSBlbHNlIHsKJGNtZCA9IFsncm0nLCAnLXJmJywgJGRpcmVjdG9yeV07Cn0KCiRyZXN1bHQgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlKCRjbWQsICRvdXRwdXQpID09PSAwOwoKCmNsZWFyc3RhdGNhY2hlKCk7CgppZiAoJHJlc3VsdCAmJiAhaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gJHRoaXMtPnJlbW92ZURpcmVjdG9yeVBocCgkZGlyZWN0b3J5KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVEaXJlY3RvcnlBc3luYyhzdHJpbmcgJGRpcmVjdG9yeSkKewokZWRnZUNhc2VSZXN1bHQgPSAkdGhpcy0+cmVtb3ZlRWRnZUNhc2VzKCRkaXJlY3RvcnkpOwppZiAoJGVkZ2VDYXNlUmVzdWx0ICE9PSBudWxsKSB7CnJldHVybiBcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRlZGdlQ2FzZVJlc3VsdCk7Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCgppZiAoc3RyX2NvbnRhaW5zKCRkaXJlY3RvcnksICc9JykpIHsKcmV0dXJuIFxSZWFjdFxQcm9taXNlXHJlc29sdmUoJHRoaXMtPnJlbW92ZURpcmVjdG9yeVBocCgkZGlyZWN0b3J5KSk7Cn0KCiRjbWQgPSBbJ3JtZGlyJywgJy9TJywgJy9RJywgUGxhdGZvcm06OnJlYWxwYXRoKCRkaXJlY3RvcnkpXTsKfSBlbHNlIHsKJGNtZCA9IFsncm0nLCAnLXJmJywgJGRpcmVjdG9yeV07Cn0KCiRwcm9taXNlID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZUFzeW5jKCRjbWQpOwoKcmV0dXJuICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgkcHJvY2VzcykgdXNlICgkZGlyZWN0b3J5KSB7CgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKCRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkgewppZiAoIWlzX2RpcigkZGlyZWN0b3J5KSkgewpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSh0cnVlKTsKfQp9CgpyZXR1cm4gXFJlYWN0XFByb21pc2VccmVzb2x2ZSgkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRkaXJlY3RvcnkpKTsKfSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVtb3ZlRWRnZUNhc2VzKHN0cmluZyAkZGlyZWN0b3J5LCBib29sICRmYWxsYmFja1RvUGhwID0gdHJ1ZSk6ID9ib29sCnsKaWYgKCR0aGlzLT5pc1N5bWxpbmtlZERpcmVjdG9yeSgkZGlyZWN0b3J5KSkgewpyZXR1cm4gJHRoaXMtPnVubGlua1N5bWxpbmtlZERpcmVjdG9yeSgkZGlyZWN0b3J5KTsKfQoKaWYgKCR0aGlzLT5pc0p1bmN0aW9uKCRkaXJlY3RvcnkpKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlSnVuY3Rpb24oJGRpcmVjdG9yeSk7Cn0KCmlmIChpc19saW5rKCRkaXJlY3RvcnkpKSB7CnJldHVybiB1bmxpbmsoJGRpcmVjdG9yeSk7Cn0KCmlmICghaXNfZGlyKCRkaXJlY3RvcnkpIHx8ICFmaWxlX2V4aXN0cygkZGlyZWN0b3J5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKFByZWc6OmlzTWF0Y2goJ3teKD86W2Etel06KT9bL1xcXFxdKyR9aScsICRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQWJvcnRpbmcgYW4gYXR0ZW1wdGVkIGRlbGV0aW9uIG9mICcuJGRpcmVjdG9yeS4nLCB0aGlzIHdhcyBwcm9iYWJseSBub3QgaW50ZW5kZWQsIGlmIGl0IGlzIGEgcmVhbCB1c2UgY2FzZSBwbGVhc2UgcmVwb3J0IGl0LicpOwp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpICYmICRmYWxsYmFja1RvUGhwKSB7CnJldHVybiAkdGhpcy0+cmVtb3ZlRGlyZWN0b3J5UGhwKCRkaXJlY3RvcnkpOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZURpcmVjdG9yeVBocChzdHJpbmcgJGRpcmVjdG9yeSkKewokZWRnZUNhc2VSZXN1bHQgPSAkdGhpcy0+cmVtb3ZlRWRnZUNhc2VzKCRkaXJlY3RvcnksIGZhbHNlKTsKaWYgKCRlZGdlQ2FzZVJlc3VsdCAhPT0gbnVsbCkgewpyZXR1cm4gJGVkZ2VDYXNlUmVzdWx0Owp9Cgp0cnkgewokaXQgPSBuZXcgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpcmVjdG9yeSwgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUyk7Cn0gY2F0Y2ggKFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gJGUpIHsKCgpjbGVhcnN0YXRjYWNoZSgpOwp1c2xlZXAoMTAwMDAwKTsKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkpIHsKcmV0dXJuIHRydWU7Cn0KJGl0ID0gbmV3IFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yKCRkaXJlY3RvcnksIFJlY3Vyc2l2ZURpcmVjdG9yeUl0ZXJhdG9yOjpTS0lQX0RPVFMpOwp9CiRyaSA9IG5ldyBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKCRpdCwgUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcjo6Q0hJTERfRklSU1QpOwoKZm9yZWFjaCAoJHJpIGFzICRmaWxlKSB7CmlmICgkZmlsZS0+aXNEaXIoKSkgewokdGhpcy0+cm1kaXIoJGZpbGUtPmdldFBhdGhuYW1lKCkpOwp9IGVsc2UgewokdGhpcy0+dW5saW5rKCRmaWxlLT5nZXRQYXRobmFtZSgpKTsKfQp9CgoKdW5zZXQoJHJpLCAkaXQsICRmaWxlKTsKCnJldHVybiAkdGhpcy0+cm1kaXIoJGRpcmVjdG9yeSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVEaXJlY3RvcnlFeGlzdHMoc3RyaW5nICRkaXJlY3RvcnkpCnsKaWYgKCFpc19kaXIoJGRpcmVjdG9yeSkpIHsKaWYgKGZpbGVfZXhpc3RzKCRkaXJlY3RvcnkpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigKJGRpcmVjdG9yeS4nIGV4aXN0cyBhbmQgaXMgbm90IGEgZGlyZWN0b3J5LicKKTsKfQoKaWYgKGlzX2xpbmsoJGRpcmVjdG9yeSkgJiYgIUAkdGhpcy0+dW5saW5rSW1wbGVtZW50YXRpb24oJGRpcmVjdG9yeSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGVsZXRlIHN5bWJvbGljIGxpbmsgJy4kZGlyZWN0b3J5Lic6ICcuKGVycm9yX2dldF9sYXN0KClbJ21lc3NhZ2UnXSA/PyAnJykpOwp9CgppZiAoIUBta2RpcigkZGlyZWN0b3J5LCAwNzc3LCB0cnVlKSkgewokZSA9IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkZGlyZWN0b3J5LicgZG9lcyBub3QgZXhpc3QgYW5kIGNvdWxkIG5vdCBiZSBjcmVhdGVkOiAnLihlcnJvcl9nZXRfbGFzdCgpWydtZXNzYWdlJ10gPz8gJycpKTsKCgoKCgokbm9ybWFsaXplZCA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRkaXJlY3RvcnkpOwppZiAoJG5vcm1hbGl6ZWQgIT09ICRkaXJlY3RvcnkpIHsKdHJ5IHsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkbm9ybWFsaXplZCk7CgpyZXR1cm47Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGlnbm9yZWRFeCkgewp9Cn0KCnRocm93ICRlOwp9Cn0KfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVubGluayhzdHJpbmcgJHBhdGgpCnsKJHVubGlua2VkID0gQCR0aGlzLT51bmxpbmtJbXBsZW1lbnRhdGlvbigkcGF0aCk7CmlmICghJHVubGlua2VkKSB7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnVzbGVlcCgzNTAwMDApOwokdW5saW5rZWQgPSBAJHRoaXMtPnVubGlua0ltcGxlbWVudGF0aW9uKCRwYXRoKTsKfQoKaWYgKCEkdW5saW5rZWQpIHsKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKJG1lc3NhZ2UgPSAnQ291bGQgbm90IGRlbGV0ZSAnLiRwYXRoLic6ICcgLiAoJGVycm9yWydtZXNzYWdlJ10gPz8gJycpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRtZXNzYWdlIC49ICJcblRoaXMgY2FuIGJlIGR1ZSB0byBhbiBhbnRpdmlydXMgb3IgdGhlIFdpbmRvd3MgU2VhcmNoIEluZGV4ZXIgbG9ja2luZyB0aGUgZmlsZSB3aGlsZSB0aGV5IGFyZSBhbmFseXplZCI7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBybWRpcihzdHJpbmcgJHBhdGgpCnsKJGRlbGV0ZWQgPSBAcm1kaXIoJHBhdGgpOwppZiAoISRkZWxldGVkKSB7CgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnVzbGVlcCgzNTAwMDApOwokZGVsZXRlZCA9IEBybWRpcigkcGF0aCk7Cn0KCmlmICghJGRlbGV0ZWQpIHsKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKJG1lc3NhZ2UgPSAnQ291bGQgbm90IGRlbGV0ZSAnLiRwYXRoLic6ICcgLiAoJGVycm9yWydtZXNzYWdlJ10gPz8gJycpOwppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiRtZXNzYWdlIC49ICJcblRoaXMgY2FuIGJlIGR1ZSB0byBhbiBhbnRpdmlydXMgb3IgdGhlIFdpbmRvd3MgU2VhcmNoIEluZGV4ZXIgbG9ja2luZyB0aGUgZmlsZSB3aGlsZSB0aGV5IGFyZSBhbmFseXplZCI7Cn0KCnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHlUaGVuUmVtb3ZlKHN0cmluZyAkc291cmNlLCBzdHJpbmcgJHRhcmdldCkKewokdGhpcy0+Y29weSgkc291cmNlLCAkdGFyZ2V0KTsKaWYgKCFpc19kaXIoJHNvdXJjZSkpIHsKJHRoaXMtPnVubGluaygkc291cmNlKTsKCnJldHVybjsKfQoKJHRoaXMtPnJlbW92ZURpcmVjdG9yeVBocCgkc291cmNlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJHNvdXJjZSwgc3RyaW5nICR0YXJnZXQpCnsKCiR0YXJnZXQgPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkdGFyZ2V0KTsKCmlmICghaXNfZGlyKCRzb3VyY2UpKSB7CnRyeSB7CnJldHVybiBjb3B5KCRzb3VyY2UsICR0YXJnZXQpOwp9IGNhdGNoIChFcnJvckV4Y2VwdGlvbiAkZSkgewoKCmlmIChzdHJfY29udGFpbnMoJGUtPmdldE1lc3NhZ2UoKSwgJ0JhZCBhZGRyZXNzJykpIHsKJHNvdXJjZUhhbmRsZSA9IGZvcGVuKCRzb3VyY2UsICdyJyk7CiR0YXJnZXRIYW5kbGUgPSBmb3BlbigkdGFyZ2V0LCAndycpOwppZiAoZmFsc2UgPT09ICRzb3VyY2VIYW5kbGUgfHwgZmFsc2UgPT09ICR0YXJnZXRIYW5kbGUpIHsKdGhyb3cgJGU7Cn0Kd2hpbGUgKCFmZW9mKCRzb3VyY2VIYW5kbGUpKSB7CmlmIChmYWxzZSA9PT0gZndyaXRlKCR0YXJnZXRIYW5kbGUsIChzdHJpbmcpIGZyZWFkKCRzb3VyY2VIYW5kbGUsIDEwMjQgKiAxMDI0KSkpIHsKdGhyb3cgJGU7Cn0KfQpmY2xvc2UoJHNvdXJjZUhhbmRsZSk7CmZjbG9zZSgkdGFyZ2V0SGFuZGxlKTsKCnJldHVybiB0cnVlOwp9CnRocm93ICRlOwp9Cn0KCiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkc291cmNlLCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKJHRoaXMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkdGFyZ2V0KTsKCiRyZXN1bHQgPSB0cnVlOwpmb3JlYWNoICgkcmkgYXMgJGZpbGUpIHsKJHRhcmdldFBhdGggPSAkdGFyZ2V0IC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRyaS0+Z2V0U3ViUGF0aG5hbWUoKTsKaWYgKCRmaWxlLT5pc0RpcigpKSB7CiR0aGlzLT5lbnN1cmVEaXJlY3RvcnlFeGlzdHMoJHRhcmdldFBhdGgpOwp9IGVsc2UgewokcmVzdWx0ID0gJHJlc3VsdCAmJiBjb3B5KCRmaWxlLT5nZXRQYXRobmFtZSgpLCAkdGFyZ2V0UGF0aCk7Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZW5hbWUoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KQp7CmlmICh0cnVlID09PSBAcmVuYW1lKCRzb3VyY2UsICR0YXJnZXQpKSB7CnJldHVybjsKfQoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewokdGhpcy0+Y29weVRoZW5SZW1vdmUoJHNvdXJjZSwgJHRhcmdldCk7CgpyZXR1cm47Cn0KCmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKCiRyZXN1bHQgPSAkdGhpcy0+Z2V0UHJvY2VzcygpLT5leGVjdXRlKFsneGNvcHknLCAkc291cmNlLCAkdGFyZ2V0LCAnL0UnLCAnL0knLCAnL1EnLCAnL1knXSwgJG91dHB1dCk7CgoKY2xlYXJzdGF0Y2FjaGUoKTsKCmlmICgwID09PSAkcmVzdWx0KSB7CiR0aGlzLT5yZW1vdmUoJHNvdXJjZSk7CgpyZXR1cm47Cn0KfSBlbHNlIHsKCgokcmVzdWx0ID0gJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZShbJ212JywgJHNvdXJjZSwgJHRhcmdldF0sICRvdXRwdXQpOwoKCmNsZWFyc3RhdGNhY2hlKCk7CgppZiAoMCA9PT0gJHJlc3VsdCkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmNvcHlUaGVuUmVtb3ZlKCRzb3VyY2UsICR0YXJnZXQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU2hvcnRlc3RQYXRoKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgYm9vbCAkZGlyZWN0b3JpZXMgPSBmYWxzZSwgYm9vbCAkcHJlZmVyUmVsYXRpdmUgPSBmYWxzZSkKewppZiAoISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkZnJvbSkgfHwgISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkdG8pKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJyRmcm9tICglcykgYW5kICR0byAoJXMpIG11c3QgYmUgYWJzb2x1dGUgcGF0aHMuJywgJGZyb20sICR0bykpOwp9CgokZnJvbSA9ICR0aGlzLT5ub3JtYWxpemVQYXRoKCRmcm9tKTsKJHRvID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJHRvKTsKCmlmICgkZGlyZWN0b3JpZXMpIHsKJGZyb20gPSBydHJpbSgkZnJvbSwgJy8nKSAuICcvZHVtbXlfZmlsZSc7Cn0KCmlmIChcZGlybmFtZSgkZnJvbSkgPT09IFxkaXJuYW1lKCR0bykpIHsKcmV0dXJuICcuLycuYmFzZW5hbWUoJHRvKTsKfQoKJGNvbW1vblBhdGggPSAkdG87CndoaWxlIChzdHJwb3MoJGZyb20uJy8nLCAkY29tbW9uUGF0aC4nLycpICE9PSAwICYmICcvJyAhPT0gJGNvbW1vblBhdGggJiYgIVByZWc6OmlzTWF0Y2goJ3teW0EtWl06Lz8kfWknLCAkY29tbW9uUGF0aCkpIHsKJGNvbW1vblBhdGggPSBzdHJ0cihcZGlybmFtZSgkY29tbW9uUGF0aCksICdcXCcsICcvJyk7Cn0KCgppZiAoMCAhPT0gc3RycG9zKCRmcm9tLCAkY29tbW9uUGF0aCkpIHsKcmV0dXJuICR0bzsKfQoKJGNvbW1vblBhdGggPSBydHJpbSgkY29tbW9uUGF0aCwgJy8nKSAuICcvJzsKJHNvdXJjZVBhdGhEZXB0aCA9IHN1YnN0cl9jb3VudCgoc3RyaW5nKSBzdWJzdHIoJGZyb20sIFxzdHJsZW4oJGNvbW1vblBhdGgpKSwgJy8nKTsKJGNvbW1vblBhdGhDb2RlID0gc3RyX3JlcGVhdCgnLi4vJywgJHNvdXJjZVBhdGhEZXB0aCk7CgoKaWYgKCEkcHJlZmVyUmVsYXRpdmUgJiYgJy8nID09PSAkY29tbW9uUGF0aCAmJiAkc291cmNlUGF0aERlcHRoID4gMSkgewpyZXR1cm4gJHRvOwp9CgokcmVzdWx0ID0gJGNvbW1vblBhdGhDb2RlIC4gc3Vic3RyKCR0bywgXHN0cmxlbigkY29tbW9uUGF0aCkpOwppZiAoXHN0cmxlbigkcmVzdWx0KSA9PT0gMCkgewpyZXR1cm4gJy4vJzsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmRTaG9ydGVzdFBhdGhDb2RlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0bywgYm9vbCAkZGlyZWN0b3JpZXMgPSBmYWxzZSwgYm9vbCAkc3RhdGljQ29kZSA9IGZhbHNlLCBib29sICRwcmVmZXJSZWxhdGl2ZSA9IGZhbHNlKQp7CmlmICghJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCRmcm9tKSB8fCAhJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCR0bykpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignJGZyb20gKCVzKSBhbmQgJHRvICglcykgbXVzdCBiZSBhYnNvbHV0ZSBwYXRocy4nLCAkZnJvbSwgJHRvKSk7Cn0KCiRmcm9tID0gJHRoaXMtPm5vcm1hbGl6ZVBhdGgoJGZyb20pOwokdG8gPSAkdGhpcy0+bm9ybWFsaXplUGF0aCgkdG8pOwoKaWYgKCRmcm9tID09PSAkdG8pIHsKcmV0dXJuICRkaXJlY3RvcmllcyA/ICdfX0RJUl9fJyA6ICdfX0ZJTEVfXyc7Cn0KCiRjb21tb25QYXRoID0gJHRvOwp3aGlsZSAoc3RycG9zKCRmcm9tLicvJywgJGNvbW1vblBhdGguJy8nKSAhPT0gMCAmJiAnLycgIT09ICRjb21tb25QYXRoICYmICFQcmVnOjppc01hdGNoKCd7XltBLVpdOi8/JH1pJywgJGNvbW1vblBhdGgpICYmICcuJyAhPT0gJGNvbW1vblBhdGgpIHsKJGNvbW1vblBhdGggPSBzdHJ0cihcZGlybmFtZSgkY29tbW9uUGF0aCksICdcXCcsICcvJyk7Cn0KCgppZiAoMCAhPT0gc3RycG9zKCRmcm9tLCAkY29tbW9uUGF0aCkgfHwgJy4nID09PSAkY29tbW9uUGF0aCkgewpyZXR1cm4gdmFyX2V4cG9ydCgkdG8sIHRydWUpOwp9CgokY29tbW9uUGF0aCA9IHJ0cmltKCRjb21tb25QYXRoLCAnLycpIC4gJy8nOwppZiAoc3RyX3N0YXJ0c193aXRoKCR0bywgJGZyb20uJy8nKSkgewpyZXR1cm4gJ19fRElSX18gLiAnLnZhcl9leHBvcnQoKHN0cmluZykgc3Vic3RyKCR0bywgXHN0cmxlbigkZnJvbSkpLCB0cnVlKTsKfQokc291cmNlUGF0aERlcHRoID0gc3Vic3RyX2NvdW50KChzdHJpbmcpIHN1YnN0cigkZnJvbSwgXHN0cmxlbigkY29tbW9uUGF0aCkpLCAnLycpICsgKGludCkgJGRpcmVjdG9yaWVzOwoKCmlmICghJHByZWZlclJlbGF0aXZlICYmICcvJyA9PT0gJGNvbW1vblBhdGggJiYgJHNvdXJjZVBhdGhEZXB0aCA+IDEpIHsKcmV0dXJuIHZhcl9leHBvcnQoJHRvLCB0cnVlKTsKfQoKaWYgKCRzdGF0aWNDb2RlKSB7CiRjb21tb25QYXRoQ29kZSA9ICJfX0RJUl9fIC4gJyIuc3RyX3JlcGVhdCgnLy4uJywgJHNvdXJjZVBhdGhEZXB0aCkuIiciOwp9IGVsc2UgewokY29tbW9uUGF0aENvZGUgPSBzdHJfcmVwZWF0KCdkaXJuYW1lKCcsICRzb3VyY2VQYXRoRGVwdGgpLidfX0RJUl9fJy5zdHJfcmVwZWF0KCcpJywgJHNvdXJjZVBhdGhEZXB0aCk7Cn0KJHJlbFRhcmdldCA9IChzdHJpbmcpIHN1YnN0cigkdG8sIFxzdHJsZW4oJGNvbW1vblBhdGgpKTsKCnJldHVybiAkY29tbW9uUGF0aENvZGUgLiAoXHN0cmxlbigkcmVsVGFyZ2V0KSA+IDAgPyAnLicgLiB2YXJfZXhwb3J0KCcvJyAuICRyZWxUYXJnZXQsIHRydWUpIDogJycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChzdHJpbmcgJHBhdGgpCnsKcmV0dXJuIHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCB8fCBzdWJzdHIoJHBhdGgsIDEsIDEpID09PSAnOicgfHwgc3RycG9zKCRwYXRoLCAnXFxcXCcpID09PSAwOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaXplKHN0cmluZyAkcGF0aCkKewppZiAoIWZpbGVfZXhpc3RzKCRwYXRoKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIiRwYXRoIGRvZXMgbm90IGV4aXN0LiIpOwp9CmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiAkdGhpcy0+ZGlyZWN0b3J5U2l6ZSgkcGF0aCk7Cn0KCnJldHVybiAoaW50KSBmaWxlc2l6ZSgkcGF0aCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aChzdHJpbmcgJHBhdGgpCnsKJHBhcnRzID0gW107CiRwYXRoID0gc3RydHIoJHBhdGgsICdcXCcsICcvJyk7CiRwcmVmaXggPSAnJzsKJGFic29sdXRlID0gJyc7CgoKaWYgKHN0cnBvcygkcGF0aCwgJy8vJykgPT09IDAgJiYgXHN0cmxlbigkcGF0aCkgPiAyKSB7CiRhYnNvbHV0ZSA9ICcvLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAyKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiggWzAtOWEtel17Mix9KzogKD86IC8vICg/OiBbYS16XTogKT8gKT8gfCBbYS16XTogKX1peCcsICRwYXRoLCAkbWF0Y2gpKSB7CiRwcmVmaXggPSAkbWF0Y2hbMV07CiRwYXRoID0gc3Vic3RyKCRwYXRoLCBcc3RybGVuKCRwcmVmaXgpKTsKfQoKaWYgKHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCkgewokYWJzb2x1dGUgPSAnLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHVwID0gZmFsc2U7CmZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJGNodW5rKSB7CmlmICgnLi4nID09PSAkY2h1bmsgJiYgKFxzdHJsZW4oJGFic29sdXRlKSA+IDAgfHwgJHVwKSkgewphcnJheV9wb3AoJHBhcnRzKTsKJHVwID0gIShcY291bnQoJHBhcnRzKSA9PT0gMCB8fCAnLi4nID09PSBlbmQoJHBhcnRzKSk7Cn0gZWxzZWlmICgnLicgIT09ICRjaHVuayAmJiAnJyAhPT0gJGNodW5rKSB7CiRwYXJ0c1tdID0gJGNodW5rOwokdXAgPSAnLi4nICE9PSAkY2h1bms7Cn0KfQoKCiRwcmVmaXggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3soXnw6Ly8pW2Etel06JH1pJywgc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkbSkgewpyZXR1cm4gc3RydG91cHBlcigkbVswXSk7Cn0sICRwcmVmaXgpOwoKcmV0dXJuICRwcmVmaXguJGFic29sdXRlLmltcGxvZGUoJy8nLCAkcGFydHMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cmltVHJhaWxpbmdTbGFzaChzdHJpbmcgJHBhdGgpCnsKaWYgKCFQcmVnOjppc01hdGNoKCd7XlsvXFxcXF0rJH0nLCAkcGF0aCkpIHsKJHBhdGggPSBydHJpbSgkcGF0aCwgJy9cXCcpOwp9CgpyZXR1cm4gJHBhdGg7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0xvY2FsUGF0aChzdHJpbmcgJHBhdGgpCnsKCgppZiAoUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBQcmVnOjppc01hdGNoKCd7XihmaWxlOi8vKD8hLy8pfC8oPyEvKXwvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OmlzTWF0Y2goJ3teKGZpbGU6Ly98L3wvP1thLXpdOltcXFxcL118XC5cLltcXFxcL118W2EtejAtOV8uLV0rW1xcXFwvXSl9aScsICRwYXRoKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVBhdGgoc3RyaW5nICRwYXRoKQp7CmlmIChQbGF0Zm9ybTo6aXNXaW5kb3dzKCkpIHsKJHBhdGggPSBQcmVnOjpyZXBsYWNlKCd7Xig/OmZpbGU6Ly8vKFthLXpdKTo/Lyl9aScsICdmaWxlOi8vJDE6LycsICRwYXRoKTsKfQoKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teZmlsZTovL31pJywgJycsICRwYXRoKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRwYXRoKQp7CmlmIChpc19yZWFkYWJsZSgkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19maWxlKCRwYXRoKSkgewpyZXR1cm4gZmFsc2UgIT09IFNpbGVuY2VyOjpjYWxsKCdmaWxlX2dldF9jb250ZW50cycsICRwYXRoLCBmYWxzZSwgbnVsbCwgMCwgMSk7Cn0KCmlmIChpc19kaXIoJHBhdGgpKSB7CnJldHVybiBmYWxzZSAhPT0gU2lsZW5jZXI6OmNhbGwoJ29wZW5kaXInLCAkcGF0aCk7Cn0KCgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkaXJlY3RvcnlTaXplKHN0cmluZyAkZGlyZWN0b3J5KQp7CiRpdCA9IG5ldyBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcigkZGlyZWN0b3J5LCBSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6U0tJUF9ET1RTKTsKJHJpID0gbmV3IFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IoJGl0LCBSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpDSElMRF9GSVJTVCk7Cgokc2l6ZSA9IDA7CmZvcmVhY2ggKCRyaSBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmlzRmlsZSgpKSB7CiRzaXplICs9ICRmaWxlLT5nZXRTaXplKCk7Cn0KfQoKcmV0dXJuICRzaXplOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvciA9IG5ldyBQcm9jZXNzRXhlY3V0b3IoKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzRXhlY3V0b3I7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtJbXBsZW1lbnRhdGlvbihzdHJpbmcgJHBhdGgpOiBib29sCnsKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiBpc19kaXIoJHBhdGgpICYmIGlzX2xpbmsoJHBhdGgpKSB7CnJldHVybiBybWRpcigkcGF0aCk7Cn0KCnJldHVybiB1bmxpbmsoJHBhdGgpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbGF0aXZlU3ltbGluayhzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRsaW5rKQp7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzeW1saW5rJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokY3dkID0gUGxhdGZvcm06OmdldEN3ZCgpOwoKJHJlbGF0aXZlUGF0aCA9ICR0aGlzLT5maW5kU2hvcnRlc3RQYXRoKCRsaW5rLCAkdGFyZ2V0KTsKY2hkaXIoXGRpcm5hbWUoJGxpbmspKTsKJHJlc3VsdCA9IEBzeW1saW5rKCRyZWxhdGl2ZVBhdGgsICRsaW5rKTsKCmNoZGlyKCRjd2QpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3ltbGlua2VkRGlyZWN0b3J5KHN0cmluZyAkZGlyZWN0b3J5KQp7CmlmICghaXNfZGlyKCRkaXJlY3RvcnkpKSB7CnJldHVybiBmYWxzZTsKfQoKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuIGlzX2xpbmsoJHJlc29sdmVkKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB1bmxpbmtTeW1saW5rZWREaXJlY3Rvcnkoc3RyaW5nICRkaXJlY3RvcnkpOiBib29sCnsKJHJlc29sdmVkID0gJHRoaXMtPnJlc29sdmVTeW1saW5rZWREaXJlY3RvcnlTeW1saW5rKCRkaXJlY3RvcnkpOwoKcmV0dXJuICR0aGlzLT51bmxpbmsoJHJlc29sdmVkKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZVN5bWxpbmtlZERpcmVjdG9yeVN5bWxpbmsoc3RyaW5nICRwYXRobmFtZSk6IHN0cmluZwp7CmlmICghaXNfZGlyKCRwYXRobmFtZSkpIHsKcmV0dXJuICRwYXRobmFtZTsKfQoKJHJlc29sdmVkID0gcnRyaW0oJHBhdGhuYW1lLCAnLycpOwoKaWYgKDAgPT09IFxzdHJsZW4oJHJlc29sdmVkKSkgewpyZXR1cm4gJHBhdGhuYW1lOwp9CgpyZXR1cm4gJHJlc29sdmVkOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBqdW5jdGlvbihzdHJpbmcgJHRhcmdldCwgc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Z1bmN0aW9uICVzIGlzIG5vdCBhdmFpbGFibGUgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm0nLCBfX0NMQVNTX18pKTsKfQppZiAoIWlzX2RpcigkdGFyZ2V0KSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IGp1bmN0aW9uIHRvICIlcyIgYXMgaXQgaXMgbm90IGEgZGlyZWN0b3J5LicsICR0YXJnZXQpLCAwLCBudWxsLCAkdGFyZ2V0KTsKfQoKCmlmICghaXNfZGlyKCRqdW5jdGlvbikgfHwgJHRoaXMtPmlzSnVuY3Rpb24oJGp1bmN0aW9uKSkgewpAcm1kaXIoJGp1bmN0aW9uKTsKfQoKJGNtZCA9IFsnbWtsaW5rJywgJy9KJywgc3RyX3JlcGxhY2UoJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkanVuY3Rpb24pLCBQbGF0Zm9ybTo6cmVhbHBhdGgoJHRhcmdldCldOwppZiAoJHRoaXMtPmdldFByb2Nlc3MoKS0+ZXhlY3V0ZSgkY21kLCAkb3V0cHV0KSAhPT0gMCkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNyZWF0ZSBqdW5jdGlvbiB0byAiJXMiIGF0ICIlcyIuJywgJHRhcmdldCwgJGp1bmN0aW9uKSwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KY2xlYXJzdGF0Y2FjaGUodHJ1ZSwgJGp1bmN0aW9uKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNKdW5jdGlvbihzdHJpbmcgJGp1bmN0aW9uKQp7CmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiBmYWxzZTsKfQoKCmNsZWFyc3RhdGNhY2hlKHRydWUsICRqdW5jdGlvbik7CgppZiAoIWlzX2RpcigkanVuY3Rpb24pIHx8IGlzX2xpbmsoJGp1bmN0aW9uKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRzdGF0ID0gbHN0YXQoJGp1bmN0aW9uKTsKCgpyZXR1cm4gaXNfYXJyYXkoJHN0YXQpID8gMHg0MDAwICE9PSAoJHN0YXRbJ21vZGUnXSAmIDB4RjAwMCkgOiBmYWxzZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSnVuY3Rpb24oc3RyaW5nICRqdW5jdGlvbikKewppZiAoIVBsYXRmb3JtOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gZmFsc2U7Cn0KJGp1bmN0aW9uID0gcnRyaW0oc3RyX3JlcGxhY2UoJy8nLCBESVJFQ1RPUllfU0VQQVJBVE9SLCAkanVuY3Rpb24pLCBESVJFQ1RPUllfU0VQQVJBVE9SKTsKaWYgKCEkdGhpcy0+aXNKdW5jdGlvbigkanVuY3Rpb24pKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCclcyBpcyBub3QgYSBqdW5jdGlvbiBhbmQgdGh1cyBjYW5ub3QgYmUgcmVtb3ZlZCBhcyBvbmUnLCAkanVuY3Rpb24pKTsKfQoKcmV0dXJuICR0aGlzLT5ybWRpcigkanVuY3Rpb24pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsZVB1dENvbnRlbnRzSWZNb2RpZmllZChzdHJpbmcgJHBhdGgsIHN0cmluZyAkY29udGVudCkKewokY3VycmVudENvbnRlbnQgPSBTaWxlbmNlcjo6Y2FsbCgnZmlsZV9nZXRfY29udGVudHMnLCAkcGF0aCk7CmlmIChmYWxzZSA9PT0gJGN1cnJlbnRDb250ZW50IHx8ICRjdXJyZW50Q29udGVudCAhPT0gJGNvbnRlbnQpIHsKcmV0dXJuIGZpbGVfcHV0X2NvbnRlbnRzKCRwYXRoLCAkY29udGVudCk7Cn0KCnJldHVybiAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2FmZUNvcHkoc3RyaW5nICRzb3VyY2UsIHN0cmluZyAkdGFyZ2V0KTogdm9pZAp7CmlmICghZmlsZV9leGlzdHMoJHRhcmdldCkgfHwgIWZpbGVfZXhpc3RzKCRzb3VyY2UpIHx8ICEkdGhpcy0+ZmlsZXNBcmVFcXVhbCgkc291cmNlLCAkdGFyZ2V0KSkgewokc291cmNlSGFuZGxlID0gZm9wZW4oJHNvdXJjZSwgJ3InKTsKYXNzZXJ0KCRzb3VyY2VIYW5kbGUgIT09IGZhbHNlLCAnQ291bGQgbm90IG9wZW4gIicuJHNvdXJjZS4nIiBmb3IgcmVhZGluZy4nKTsKJHRhcmdldEhhbmRsZSA9IGZvcGVuKCR0YXJnZXQsICd3KycpOwphc3NlcnQoJHRhcmdldEhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kdGFyZ2V0LiciIGZvciB3cml0aW5nLicpOwoKc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRzb3VyY2VIYW5kbGUsICR0YXJnZXRIYW5kbGUpOwpmY2xvc2UoJHNvdXJjZUhhbmRsZSk7CmZjbG9zZSgkdGFyZ2V0SGFuZGxlKTsKCnRvdWNoKCR0YXJnZXQsIChpbnQpIGZpbGVtdGltZSgkc291cmNlKSwgKGludCkgZmlsZWF0aW1lKCRzb3VyY2UpKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxlc0FyZUVxdWFsKHN0cmluZyAkYSwgc3RyaW5nICRiKTogYm9vbAp7CgppZiAoZmlsZXNpemUoJGEpICE9PSBmaWxlc2l6ZSgkYikpIHsKcmV0dXJuIGZhbHNlOwp9CgoKJGFIYW5kbGUgPSBmb3BlbigkYSwgJ3JiJyk7CmFzc2VydCgkYUhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kYS4nIiBmb3IgcmVhZGluZy4nKTsKJGJIYW5kbGUgPSBmb3BlbigkYiwgJ3JiJyk7CmFzc2VydCgkYkhhbmRsZSAhPT0gZmFsc2UsICdDb3VsZCBub3Qgb3BlbiAiJy4kYi4nIiBmb3IgcmVhZGluZy4nKTsKCiRyZXN1bHQgPSB0cnVlOwp3aGlsZSAoIWZlb2YoJGFIYW5kbGUpKSB7CmlmIChmcmVhZCgkYUhhbmRsZSwgODE5MikgIT09IGZyZWFkKCRiSGFuZGxlLCA4MTkyKSkgewokcmVzdWx0ID0gZmFsc2U7CmJyZWFrOwp9Cn0KCmZjbG9zZSgkYUhhbmRsZSk7CmZjbG9zZSgkYkhhbmRsZSk7CgpyZXR1cm4gJHJlc3VsdDsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKZmluYWwgY2xhc3MgRm9yZ2Vqbwp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJGh0dHBEb3dubG9hZGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIEh0dHBEb3dubG9hZGVyICRodHRwRG93bmxvYWRlcikKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXI7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoc3RyaW5nICRvcmlnaW5VcmwsID9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsKTogYm9vbAp7CmlmICgkbWVzc2FnZSAhPT0gbnVsbCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJG1lc3NhZ2UpOwp9CgokdXJsID0gJ2h0dHBzOi8vJy4kb3JpZ2luVXJsLicvdXNlci9zZXR0aW5ncy9hcHBsaWNhdGlvbnMnOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1NldHVwIGEgcGVyc29uYWwgYWNjZXNzIHRva2VuIHdpdGggcmVwb3NpdG9yeTpyZWFkIHBlcm1pc3Npb25zIG9uOicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHVybCk7CiRsb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+Y29uZmlnLT5nZXRMb2NhbEF1dGhDb25maWdTb3VyY2UoKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ1Rva2VucyB3aWxsIGJlIHN0b3JlZCBpbiBwbGFpbiB0ZXh0IGluICIlcyIgZm9yIGZ1dHVyZSB1c2UgYnkgQ29tcG9zZXIuJywgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnLT5nZXROYW1lKCkgLiAnIE9SICcgOiAnJykgLiAkdGhpcy0+Y29uZmlnLT5nZXRBdXRoQ29uZmlnU291cmNlKCktPmdldE5hbWUoKSkpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0ZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLCBjaGVjayBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvYXV0aGVudGljYXRpb24tZm9yLXByaXZhdGUtcGFja2FnZXMubWQjZm9yZ2Vqby10b2tlbicpOwoKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSBmYWxzZTsKaWYgKCRsb2NhbEF1dGhDb25maWcgIT09IG51bGwpIHsKJHN0b3JlSW5Mb2NhbEF1dGhDb25maWcgPSAkdGhpcy0+aW8tPmFza0NvbmZpcm1hdGlvbignQSBsb2NhbCBhdXRoIGNvbmZpZyBzb3VyY2Ugd2FzIGZvdW5kLCBkbyB5b3Ugd2FudCB0byBzdG9yZSB0aGUgdG9rZW4gdGhlcmU/JywgdHJ1ZSk7Cn0KCiR1c2VybmFtZSA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2soJ1VzZXJuYW1lOiAnKSk7CiR0b2tlbiA9IHRyaW0oKHN0cmluZykgJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdUb2tlbiAoaGlkZGVuKTogJykpOwoKJGFkZFRva2VuTWFudWFsbHkgPSBzcHJpbnRmKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGZvcmdlam8tdG9rZW4uJXMgPHVzZXJuYW1lPiA8dG9rZW4+IicsICRvcmlnaW5VcmwpOwppZiAoJHRva2VuID09PSAnJyB8fCAkdXNlcm5hbWUgPT09ICcnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gdXNlcm5hbWUvdG9rZW4gZ2l2ZW4sIGFib3J0aW5nLjwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRhZGRUb2tlbk1hbnVhbGx5KTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkdXNlcm5hbWUsICR0b2tlbik7Cgp0cnkgewokdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgnaHR0cHM6Ly8nLiAkb3JpZ2luVXJsIC4gJy9hcGkvdjEvdmVyc2lvbicsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDMsIDQwMSwgNDA0XSwgdHJ1ZSkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8ZXJyb3I+SW52YWxpZCBhY2Nlc3MgdG9rZW4gcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRhZGRUb2tlbk1hbnVhbGx5KTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgJGU7Cn0KCgokYXV0aENvbmZpZ1NvdXJjZSA9ICRzdG9yZUluTG9jYWxBdXRoQ29uZmlnICYmICRsb2NhbEF1dGhDb25maWcgIT09IG51bGwgPyAkbG9jYWxBdXRoQ29uZmlnIDogJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpOwokdGhpcy0+Y29uZmlnLT5nZXRDb25maWdTb3VyY2UoKS0+cmVtb3ZlQ29uZmlnU2V0dGluZygnZm9yZ2Vqby10b2tlbi4nLiRvcmlnaW5VcmwpOwokYXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygnZm9yZ2Vqby10b2tlbi4nLiRvcmlnaW5VcmwsIFsndXNlcm5hbWUnID0+ICR1c2VybmFtZSwgJ3Rva2VuJyA9PiAkdG9rZW5dKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+VG9rZW4gc3RvcmVkIHN1Y2Nlc3NmdWxseS48L2luZm8+Jyk7CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKCgoKCmZpbmFsIGNsYXNzIEZvcmdlam9SZXBvc2l0b3J5RGF0YQp7CgpwdWJsaWMgJGh0bWxVcmw7CgpwdWJsaWMgJHNzaFVybDsKCnB1YmxpYyAkaHR0cENsb25lVXJsOwoKcHVibGljICRpc1ByaXZhdGU7CgpwdWJsaWMgJGRlZmF1bHRCcmFuY2g7CgpwdWJsaWMgJGhhc0lzc3VlczsKCnB1YmxpYyAkaXNBcmNoaXZlZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKc3RyaW5nICRodG1sVXJsLApzdHJpbmcgJGh0dHBDbG9uZVVybCwKc3RyaW5nICRzc2hVcmwsCmJvb2wgJGlzUHJpdmF0ZSwKc3RyaW5nICRkZWZhdWx0QnJhbmNoLApib29sICRoYXNJc3N1ZXMsCmJvb2wgJGlzQXJjaGl2ZWQKKSB7CiR0aGlzLT5odG1sVXJsID0gJGh0bWxVcmw7CiR0aGlzLT5odHRwQ2xvbmVVcmwgPSAkaHR0cENsb25lVXJsOwokdGhpcy0+c3NoVXJsID0gJHNzaFVybDsKJHRoaXMtPmlzUHJpdmF0ZSA9ICRpc1ByaXZhdGU7CiR0aGlzLT5kZWZhdWx0QnJhbmNoID0gJGRlZmF1bHRCcmFuY2g7CiR0aGlzLT5oYXNJc3N1ZXMgPSAkaGFzSXNzdWVzOwokdGhpcy0+aXNBcmNoaXZlZCA9ICRpc0FyY2hpdmVkOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21SZW1vdGVEYXRhKGFycmF5ICRkYXRhKTogc2VsZgp7CnJldHVybiBuZXcgc2VsZigKJGRhdGFbJ2h0bWxfdXJsJ10sCiRkYXRhWydjbG9uZV91cmwnXSwKJGRhdGFbJ3NzaF91cmwnXSwKJGRhdGFbJ3ByaXZhdGUnXSwKJGRhdGFbJ2RlZmF1bHRfYnJhbmNoJ10sCiRkYXRhWydoYXNfaXNzdWVzJ10sCiRkYXRhWydhcmNoaXZlZCddCik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKZmluYWwgY2xhc3MgRm9yZ2Vqb1VybAp7CnB1YmxpYyBjb25zdCBVUkxfUkVHRVggPSAne14oPzooPzpodHRwcz98Z2l0KTovLyhbXi9dKykvfGdpdEAoW146XSspOi8/KShbXi9dKykvKFteL10rPykoPzpcLmdpdHwvKT8kfSc7CgoKcHVibGljICRvd25lcjsKCnB1YmxpYyAkcmVwb3NpdG9yeTsKCnB1YmxpYyAkb3JpZ2luVXJsOwoKcHVibGljICRhcGlVcmw7Cgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KApzdHJpbmcgJG93bmVyLApzdHJpbmcgJHJlcG9zaXRvcnksCnN0cmluZyAkb3JpZ2luVXJsLApzdHJpbmcgJGFwaVVybAopIHsKJHRoaXMtPm93bmVyID0gJG93bmVyOwokdGhpcy0+cmVwb3NpdG9yeSA9ICRyZXBvc2l0b3J5OwokdGhpcy0+b3JpZ2luVXJsID0gJG9yaWdpblVybDsKJHRoaXMtPmFwaVVybCA9ICRhcGlVcmw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKHN0cmluZyAkcmVwb1VybCk6IHNlbGYKewokdXJsID0gc2VsZjo6dHJ5RnJvbSgkcmVwb1VybCk7CmlmICgkdXJsICE9PSBudWxsKSB7CnJldHVybiAkdXJsOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhpcyBpcyBub3QgYSB2YWxpZCBGb3JnZWpvIFVSTDogJyAuICRyZXBvVXJsKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0cnlGcm9tKD9zdHJpbmcgJHJlcG9VcmwpOiA/c2VsZgp7CmlmICgkcmVwb1VybCA9PT0gbnVsbCB8fCAhUHJlZzo6aXNNYXRjaChzZWxmOjpVUkxfUkVHRVgsICRyZXBvVXJsLCAkbWF0Y2gpKSB7CnJldHVybiBudWxsOwp9Cgokb3JpZ2luVXJsID0gc3RydG9sb3dlcigkbWF0Y2hbMV0gPz8gKHN0cmluZykgJG1hdGNoWzJdKTsKJGFwaUJhc2UgPSAkb3JpZ2luVXJsIC4gJy9hcGkvdjEnOwoKcmV0dXJuIG5ldyBzZWxmKAokbWF0Y2hbM10sCiRtYXRjaFs0XSwKJG9yaWdpblVybCwKc3ByaW50ZignaHR0cHM6Ly8lcy9yZXBvcy8lcy8lcycsICRhcGlCYXNlLCAkbWF0Y2hbM10sICRtYXRjaFs0XSkKKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlU3NoVXJsKCk6IHN0cmluZwp7CnJldHVybiAnZ2l0QCcgLiAkdGhpcy0+b3JpZ2luVXJsIC4gJzonLiR0aGlzLT5vd25lci4nLycuJHRoaXMtPnJlcG9zaXRvcnkuJy5naXQnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBHaXQKewoKcHJpdmF0ZSBzdGF0aWMgJHZlcnNpb24gPSBmYWxzZTsKCgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGZpbGVzeXN0ZW07Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgRmlsZXN5c3RlbSAkZnMpCnsKJHRoaXMtPmlvID0gJGlvOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKJHRoaXMtPmZpbGVzeXN0ZW0gPSAkZnM7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hlY2tGb3JSZXBvT3duZXJzaGlwRXJyb3Ioc3RyaW5nICRvdXRwdXQsIHN0cmluZyAkcGF0aCwgP0lPSW50ZXJmYWNlICRpbyA9IG51bGwpOiB2b2lkCnsKaWYgKHN0cl9jb250YWlucygkb3V0cHV0LCAnZmF0YWw6IGRldGVjdGVkIGR1YmlvdXMgb3duZXJzaGlwJykpIHsKJG1zZyA9ICdUaGUgcmVwb3NpdG9yeSBhdCAiJyAuICRwYXRoIC4gJyIgZG9lcyBub3QgaGF2ZSB0aGUgY29ycmVjdCBvd25lcnNoaXAgYW5kIGdpdCByZWZ1c2VzIHRvIHVzZSBpdDonIC4gUEhQX0VPTCAuIFBIUF9FT0wgLiAkb3V0cHV0OwppZiAoJGlvID09PSBudWxsKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbigkbXNnKTsKfQokaW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPicuJG1zZy4nPC93YXJuaW5nPicpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRIdHRwRG93bmxvYWRlcihIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIpOiB2b2lkCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZHMoYXJyYXkgJGNvbW1hbmRzLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkLCBib29sICRpbml0aWFsQ2xvbmUgPSBmYWxzZSwgJiRjb21tYW5kT3V0cHV0ID0gbnVsbCk6IHZvaWQKewokY2FsbGFibGVzID0gW107CmZvcmVhY2ggKCRjb21tYW5kcyBhcyAkY21kKSB7CiRjYWxsYWJsZXNbXSA9IHN0YXRpYyBmdW5jdGlvbiAoc3RyaW5nICR1cmwpIHVzZSAoJGNtZCk6IGFycmF5IHsKJG1hcCA9IFsKJyV1cmwlJyA9PiAkdXJsLAonJXNhbml0aXplZFVybCUnID0+IFByZWc6OnJlcGxhY2UoJ3s6Ly8oW15AXSs/KTooLis/KUB9JywgJzovLycsICR1cmwpLApdOwoKcmV0dXJuIGFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkbWFwKTogc3RyaW5nIHsKcmV0dXJuICRtYXBbJHZhbHVlXSA/PyAkdmFsdWU7Cn0sICRjbWQpOwp9Owp9CgoKJHRoaXMtPnJ1bkNvbW1hbmQoJGNhbGxhYmxlcywgJHVybCwgJGN3ZCwgJGluaXRpYWxDbG9uZSwgJGNvbW1hbmRPdXRwdXQpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZCgkY29tbWFuZENhbGxhYmxlLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkLCBib29sICRpbml0aWFsQ2xvbmUgPSBmYWxzZSwgJiRjb21tYW5kT3V0cHV0ID0gbnVsbCk6IHZvaWQKewokY29tbWFuZENhbGxhYmxlcyA9IGlzX2NhbGxhYmxlKCRjb21tYW5kQ2FsbGFibGUpID8gWyRjb21tYW5kQ2FsbGFibGVdIDogJGNvbW1hbmRDYWxsYWJsZTsKJGxhc3RDb21tYW5kID0gJyc7CgoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKaWYgKCRpbml0aWFsQ2xvbmUpIHsKJG9yaWdDd2QgPSAkY3dkOwp9CgokcnVuQ29tbWFuZHMgPSBmdW5jdGlvbiAoJHVybCkgdXNlICgkY29tbWFuZENhbGxhYmxlcywgJGN3ZCwgJiRjb21tYW5kT3V0cHV0LCAmJGxhc3RDb21tYW5kLCAkaW5pdGlhbENsb25lKSB7CiRjb2xsZWN0T3V0cHV0cyA9ICFpc19jYWxsYWJsZSgkY29tbWFuZE91dHB1dCk7CiRvdXRwdXRzID0gW107Cgokc3RhdHVzID0gMDsKJGNvdW50ZXIgPSAwOwpmb3JlYWNoICgkY29tbWFuZENhbGxhYmxlcyBhcyAkY2FsbGFibGUpIHsKJGxhc3RDb21tYW5kID0gJGNhbGxhYmxlKCR1cmwpOwppZiAoJGNvbGxlY3RPdXRwdXRzKSB7CiRvdXRwdXRzW10gPSAnJzsKJG91dHB1dCA9ICYkb3V0cHV0c1tjb3VudCgkb3V0cHV0cykgLSAxXTsKfSBlbHNlIHsKJG91dHB1dCA9ICYkY29tbWFuZE91dHB1dDsKfQokc3RhdHVzID0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGxhc3RDb21tYW5kLCAkb3V0cHV0LCAkaW5pdGlhbENsb25lICYmICRjb3VudGVyID09PSAwID8gbnVsbCA6ICRjd2QpOwppZiAoJHN0YXR1cyAhPT0gMCkgewpicmVhazsKfQokY291bnRlcisrOwp9CgppZiAoJGNvbGxlY3RPdXRwdXRzKSB7CiRjb21tYW5kT3V0cHV0ID0gaW1wbG9kZSgnJywgJG91dHB1dHMpOwp9CgpyZXR1cm4gJHN0YXR1czsKfTsKCmlmIChQcmVnOjppc01hdGNoKCd7XnNzaDovL1teQF0rQFteOl0rOlteMC05XSt9JywgJHVybCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBzb3VyY2UgVVJMICcgLiAkdXJsIC4gJyBpcyBpbnZhbGlkLCBzc2ggVVJMcyBzaG91bGQgaGF2ZSBhIHBvcnQgbnVtYmVyIGFmdGVyICI6Ii4nIC4gIlxuIiAuICdVc2Ugc3NoOi8vZ2l0QGV4YW1wbGUuY29tOjIyL3BhdGggb3IganVzdCBnaXRAZXhhbXBsZS5jb206cGF0aCBpZiB5b3UgZG8gbm90IHdhbnQgdG8gcHJvdmlkZSBhIHBhc3N3b3JkIG9yIGN1c3RvbSBwb3J0LicpOwp9CgppZiAoISRpbml0aWFsQ2xvbmUpIHsKCiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3JlbW90ZScsICctdiddLCAkb3V0cHV0LCAkY3dkKTsKaWYgKFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teKD86Y29tcG9zZXJ8b3JpZ2luKVxzK2h0dHBzPzovLyguKyk6KC4rKUAoW14vXSspfWltJywgJG91dHB1dCwgJG1hdGNoKSAmJiAhJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbM10pKSB7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG1hdGNoWzNdLCByYXd1cmxkZWNvZGUoJG1hdGNoWzFdKSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsyXSkpOwp9Cn0KCiRwcm90b2NvbHMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGh1Yi1wcm90b2NvbHMnKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oPzpodHRwcz98Z2l0KTovLycgLiBzZWxmOjpnZXRHaXRIdWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnLyguKil9JywgJHVybCwgJG1hdGNoKSkgewokbWVzc2FnZXMgPSBbXTsKZm9yZWFjaCAoJHByb3RvY29scyBhcyAkcHJvdG9jb2wpIHsKaWYgKCdzc2gnID09PSAkcHJvdG9jb2wpIHsKJHByb3RvVXJsID0gImdpdEAiIC4gJG1hdGNoWzFdIC4gIjoiIC4gJG1hdGNoWzJdOwp9IGVsc2UgewokcHJvdG9VcmwgPSAkcHJvdG9jb2wgLiAiOi8vIiAuICRtYXRjaFsxXSAuICIvIiAuICRtYXRjaFsyXTsKfQoKaWYgKDAgPT09ICRydW5Db21tYW5kcygkcHJvdG9VcmwpKSB7CnJldHVybjsKfQokbWVzc2FnZXNbXSA9ICctICcgLiAkcHJvdG9VcmwgLiAiXG4iIC4gUHJlZzo6cmVwbGFjZSgnI14jbScsICcgICcsICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKCmlmICgkaW5pdGlhbENsb25lICYmIGlzc2V0KCRvcmlnQ3dkKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRvcmlnQ3dkKTsKfQp9CgoKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkgJiYgISR0aGlzLT5pby0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT50aHJvd0V4Y2VwdGlvbignRmFpbGVkIHRvIGNsb25lICcgLiAkdXJsIC4gJyB2aWEgJyAuIGltcGxvZGUoJywgJywgJHByb3RvY29scykgLiAnIHByb3RvY29scywgYWJvcnRpbmcuJyAuICJcblxuIiAuIGltcGxvZGUoIlxuIiwgJG1lc3NhZ2VzKSwgJHVybCk7Cn0KfQoKCiRieXBhc3NTc2hGb3JHaXRIdWIgPSBQcmVnOjppc01hdGNoKCd7XmdpdEAnIC4gc2VsZjo6Z2V0R2l0SHViRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJzooLis/KVwuZ2l0JH1pJywgJHVybCkgJiYgIWluX2FycmF5KCdzc2gnLCAkcHJvdG9jb2xzLCB0cnVlKTsKCiRhdXRoID0gbnVsbDsKJGNyZWRlbnRpYWxzID0gW107CmlmICgkYnlwYXNzU3NoRm9yR2l0SHViIHx8IDAgIT09ICRydW5Db21tYW5kcygkdXJsKSkgewokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKCgppZiAoUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne15naXRAJyAuIHNlbGY6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICc6KC4rPylcLmdpdCR9aScsICR1cmwsICRtYXRjaCkKCnx8IFByZWc6OmlzTWF0Y2hTdHJpY3RHcm91cHMoJ3teaHR0cHM/Oi8vJyAuIHNlbGY6OmdldEdpdEh1YkRvbWFpbnNSZWdleCgkdGhpcy0+Y29uZmlnKSAuICcvKC4qPykoPzpcLmdpdCk/JH1pJywgJHVybCwgJG1hdGNoKQopIHsKaWYgKCEkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkpIHsKJGdpdEh1YlV0aWwgPSBuZXcgR2l0SHViKCR0aGlzLT5pbywgJHRoaXMtPmNvbmZpZywgJHRoaXMtPnByb2Nlc3MpOwokbWVzc2FnZSA9ICdDbG9uaW5nIGZhaWxlZCB1c2luZyBhbiBzc2gga2V5IGZvciBhdXRoZW50aWNhdGlvbiwgZW50ZXIgeW91ciBHaXRIdWIgY3JlZGVudGlhbHMgdG8gYWNjZXNzIHByaXZhdGUgcmVwb3MnOwoKaWYgKCEkZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGgoJG1hdGNoWzFdKSAmJiAkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokZ2l0SHViVXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRtYXRjaFsxXSwgJG1lc3NhZ2UpOwp9Cn0KCmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSkpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFsxXSk7CiRhdXRoVXJsID0gJ2h0dHBzOi8vJyAuIHJhd3VybGVuY29kZSgkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJG1hdGNoWzFdIC4gJy8nIC4gJG1hdGNoWzJdIC4gJy5naXQnOwppZiAoMCA9PT0gJHJ1bkNvbW1hbmRzKCRhdXRoVXJsKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KCn0gZWxzZWlmICgKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oaHR0cHM/KTovLyhiaXRidWNrZXRcLm9yZykvKC4qPykoPzpcLmdpdCk/JH1pJywgJHVybCwgJG1hdGNoKQp8fCBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihnaXQpQChiaXRidWNrZXRcLm9yZyk6KC4rP1wuZ2l0KSR9aScsICR1cmwsICRtYXRjaCkKKSB7IAokYml0YnVja2V0VXRpbCA9IG5ldyBCaXRidWNrZXQoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnLCAkdGhpcy0+cHJvY2VzcywgJHRoaXMtPmh0dHBEb3dubG9hZGVyKTsKCiRkb21haW4gPSAkbWF0Y2hbMl07CiRyZXBvX3dpdGhfZ2l0X3BhcnQgPSAkbWF0Y2hbM107CmlmICghc3RyX2VuZHNfd2l0aCgkcmVwb193aXRoX2dpdF9wYXJ0LCAnLmdpdCcpKSB7CiRyZXBvX3dpdGhfZ2l0X3BhcnQgLj0gJy5naXQnOwp9CmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkZG9tYWluKSkgewokbWVzc2FnZSA9ICdFbnRlciB5b3VyIEJpdGJ1Y2tldCBjcmVkZW50aWFscyB0byBhY2Nlc3MgcHJpdmF0ZSByZXBvcyc7CgppZiAoISRiaXRidWNrZXRVdGlsLT5hdXRob3JpemVPQXV0aCgkZG9tYWluKSAmJiAkdGhpcy0+aW8tPmlzSW50ZXJhY3RpdmUoKSkgewokYml0YnVja2V0VXRpbC0+YXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KCRkb21haW4sICRtZXNzYWdlKTsKJGFjY2Vzc1Rva2VuID0gJGJpdGJ1Y2tldFV0aWwtPmdldFRva2VuKCk7CiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJGRvbWFpbiwgJ3gtdG9rZW4tYXV0aCcsICRhY2Nlc3NUb2tlbik7Cn0KfQoKCgoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJGRvbWFpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRkb21haW4pOwoKCgppZiAoc3RycG9zKChzdHJpbmcpICRhdXRoWydwYXNzd29yZCddLCAnQVRBVCcpID09PSAwKSB7CiRhdXRoWyd1c2VybmFtZSddID0gJ3gtYml0YnVja2V0LWFwaS10b2tlbi1hdXRoJzsKfQoKJGF1dGhVcmwgPSAnaHR0cHM6Ly8nIC4gcmF3dXJsZW5jb2RlKCRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkZG9tYWluIC4gJy8nIC4gJHJlcG9fd2l0aF9naXRfcGFydDsKCmlmICgwID09PSAkcnVuQ29tbWFuZHMoJGF1dGhVcmwpKSB7CgoKcmV0dXJuOwp9CgoKaWYgKCRhdXRoWyd1c2VybmFtZSddICE9PSAneC10b2tlbi1hdXRoJykgewokYWNjZXNzVG9rZW4gPSAkYml0YnVja2V0VXRpbC0+cmVxdWVzdFRva2VuKCRkb21haW4sICRhdXRoWyd1c2VybmFtZSddLCAkYXV0aFsncGFzc3dvcmQnXSk7CmlmICghZW1wdHkoJGFjY2Vzc1Rva2VuKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRkb21haW4sICd4LXRva2VuLWF1dGgnLCAkYWNjZXNzVG9rZW4pOwp9Cn0KfQoKaWYgKCR0aGlzLT5pby0+aGFzQXV0aGVudGljYXRpb24oJGRvbWFpbikpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRkb21haW4pOwokYXV0aFVybCA9ICdodHRwczovLycgLiByYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJzonIC4gcmF3dXJsZW5jb2RlKCRhdXRoWydwYXNzd29yZCddKSAuICdAJyAuICRkb21haW4gLiAnLycgLiAkcmVwb193aXRoX2dpdF9wYXJ0OwppZiAoMCA9PT0gJHJ1bkNvbW1hbmRzKCRhdXRoVXJsKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKfQoKJHNzaFVybCA9ICdnaXRAYml0YnVja2V0Lm9yZzonIC4gJHJlcG9fd2l0aF9naXRfcGFydDsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcgICAgTm8gYml0YnVja2V0IGF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyZWQuIEZhbGxpbmcgYmFjayB0byBzc2guJyk7CmlmICgwID09PSAkcnVuQ29tbWFuZHMoJHNzaFVybCkpIHsKcmV0dXJuOwp9CgokZXJyb3JNc2cgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfSBlbHNlaWYgKAoKUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oZ2l0KUAnIC4gc2VsZjo6Z2V0R2l0TGFiRG9tYWluc1JlZ2V4KCR0aGlzLT5jb25maWcpIC4gJzooLis/XC5naXQpJH1pJywgJHVybCwgJG1hdGNoKQoKfHwgUHJlZzo6aXNNYXRjaFN0cmljdEdyb3Vwcygne14oaHR0cHM/KTovLycgLiBzZWxmOjpnZXRHaXRMYWJEb21haW5zUmVnZXgoJHRoaXMtPmNvbmZpZykgLiAnLyguKil9aScsICR1cmwsICRtYXRjaCkKKSB7CmlmICgkbWF0Y2hbMV0gPT09ICdnaXQnKSB7CiRtYXRjaFsxXSA9ICdodHRwcyc7Cn0KCmlmICghJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pKSB7CiRnaXRMYWJVdGlsID0gbmV3IEdpdExhYigkdGhpcy0+aW8sICR0aGlzLT5jb25maWcsICR0aGlzLT5wcm9jZXNzKTsKJG1lc3NhZ2UgPSAnQ2xvbmluZyBmYWlsZWQsIGVudGVyIHlvdXIgR2l0TGFiIGNyZWRlbnRpYWxzIHRvIGFjY2VzcyBwcml2YXRlIHJlcG9zJzsKCmlmICghJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoKCRtYXRjaFsyXSkgJiYgJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGdpdExhYlV0aWwtPmF1dGhvcml6ZU9BdXRoSW50ZXJhY3RpdmVseSgkbWF0Y2hbMV0sICRtYXRjaFsyXSwgJG1lc3NhZ2UpOwp9Cn0KCmlmICgkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSkpIHsKJGF1dGggPSAkdGhpcy0+aW8tPmdldEF1dGhlbnRpY2F0aW9uKCRtYXRjaFsyXSk7CmlmICgkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ3ByaXZhdGUtdG9rZW4nIHx8ICRhdXRoWydwYXNzd29yZCddID09PSAnb2F1dGgyJyB8fCAkYXV0aFsncGFzc3dvcmQnXSA9PT0gJ2dpdGxhYi1jaS10b2tlbicpIHsKJGF1dGhVcmwgPSAkbWF0Y2hbMV0gLiAnOi8vJyAuIHJhd3VybGVuY29kZSgkYXV0aFsncGFzc3dvcmQnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3VzZXJuYW1lJ10pIC4gJ0AnIC4gJG1hdGNoWzJdIC4gJy8nIC4gJG1hdGNoWzNdOyAKfSBlbHNlIHsKJGF1dGhVcmwgPSAkbWF0Y2hbMV0gLiAnOi8vJyAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJG1hdGNoWzJdIC4gJy8nIC4gJG1hdGNoWzNdOwp9CgppZiAoMCA9PT0gJHJ1bkNvbW1hbmRzKCRhdXRoVXJsKSkgewpyZXR1cm47Cn0KCiRjcmVkZW50aWFscyA9IFtyYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3VzZXJuYW1lJ10pLCByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10pXTsKJGVycm9yTXNnID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7Cn0KfSBlbHNlaWYgKG51bGwgIT09ICgkbWF0Y2ggPSAkdGhpcy0+Z2V0QXV0aGVudGljYXRpb25GYWlsdXJlKCR1cmwpKSkgeyAKaWYgKHN0cl9jb250YWlucygkbWF0Y2hbMl0sICdAJykpIHsKWyRhdXRoUGFydHMsICRtYXRjaFsyXV0gPSBleHBsb2RlKCdAJywgJG1hdGNoWzJdLCAyKTsKfQoKJHN0b3JlQXV0aCA9IGZhbHNlOwppZiAoJHRoaXMtPmlvLT5oYXNBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pKSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0pOwp9IGVsc2VpZiAoJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKJGRlZmF1bHRVc2VybmFtZSA9IG51bGw7CmlmIChpc3NldCgkYXV0aFBhcnRzKSAmJiAkYXV0aFBhcnRzICE9PSAnJykgewppZiAoc3RyX2NvbnRhaW5zKCRhdXRoUGFydHMsICc6JykpIHsKWyRkZWZhdWx0VXNlcm5hbWVdID0gZXhwbG9kZSgnOicsICRhdXRoUGFydHMsIDIpOwp9IGVsc2UgewokZGVmYXVsdFVzZXJuYW1lID0gJGF1dGhQYXJ0czsKfQp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoJyAgICBBdXRoZW50aWNhdGlvbiByZXF1aXJlZCAoPGluZm8+JyAuICRtYXRjaFsyXSAuICc8L2luZm8+KTonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCc8d2FybmluZz4nIC4gdHJpbSgkZXJyb3JNc2cpIC4gJzwvd2FybmluZz4nLCB0cnVlLCBJT0ludGVyZmFjZTo6VkVSQk9TRSk7CiRhdXRoID0gWwondXNlcm5hbWUnID0+ICR0aGlzLT5pby0+YXNrKCcgICAgICBVc2VybmFtZTogJywgJGRlZmF1bHRVc2VybmFtZSksCidwYXNzd29yZCcgPT4gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCcgICAgICBQYXNzd29yZDogJyksCl07CiRzdG9yZUF1dGggPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ3N0b3JlLWF1dGhzJyk7Cn0KCmlmIChudWxsICE9PSAkYXV0aCkgewokYXV0aFVybCA9ICRtYXRjaFsxXSAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsndXNlcm5hbWUnXSkgLiAnOicgLiByYXd1cmxlbmNvZGUoKHN0cmluZykgJGF1dGhbJ3Bhc3N3b3JkJ10pIC4gJ0AnIC4gJG1hdGNoWzJdIC4gJG1hdGNoWzNdOwoKaWYgKDAgPT09ICRydW5Db21tYW5kcygkYXV0aFVybCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hbMl0sICRhdXRoWyd1c2VybmFtZSddLCAkYXV0aFsncGFzc3dvcmQnXSk7CiRhdXRoSGVscGVyID0gbmV3IEF1dGhIZWxwZXIoJHRoaXMtPmlvLCAkdGhpcy0+Y29uZmlnKTsKJGF1dGhIZWxwZXItPnN0b3JlQXV0aCgkbWF0Y2hbMl0sICRzdG9yZUF1dGgpOwoKcmV0dXJuOwp9CgokY3JlZGVudGlhbHMgPSBbcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWyd1c2VybmFtZSddKSwgcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWydwYXNzd29yZCddKV07CiRlcnJvck1zZyA9ICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9Cn0KCmlmICgkaW5pdGlhbENsb25lICYmIGlzc2V0KCRvcmlnQ3dkKSkgewokdGhpcy0+ZmlsZXN5c3RlbS0+cmVtb3ZlRGlyZWN0b3J5KCRvcmlnQ3dkKTsKfQoKaWYgKFxpc19hcnJheSgkbGFzdENvbW1hbmQpKSB7CiRsYXN0Q29tbWFuZCA9IGltcGxvZGUoJyAnLCAkbGFzdENvbW1hbmQpOwp9CmlmIChjb3VudCgkY3JlZGVudGlhbHMpID4gMCkgewokbGFzdENvbW1hbmQgPSAkdGhpcy0+bWFza0NyZWRlbnRpYWxzKCRsYXN0Q29tbWFuZCwgJGNyZWRlbnRpYWxzKTsKJGVycm9yTXNnID0gJHRoaXMtPm1hc2tDcmVkZW50aWFscygkZXJyb3JNc2csICRjcmVkZW50aWFscyk7Cn0KJHRoaXMtPnRocm93RXhjZXB0aW9uKCdGYWlsZWQgdG8gZXhlY3V0ZSAnIC4gJGxhc3RDb21tYW5kIC4gIlxuXG4iIC4gJGVycm9yTXNnLCAkdXJsKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gc3luY01pcnJvcihzdHJpbmcgJHVybCwgc3RyaW5nICRkaXIpOiBib29sCnsKaWYgKChib29sKSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9ESVNBQkxFX05FVFdPUksnKSAhPT0gJ3ByaW1lJykgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkFib3J0aW5nIGdpdCBtaXJyb3Igc3luYyBvZiAnLiR1cmwuJyBhcyBuZXR3b3JrIGlzIGRpc2FibGVkPC93YXJuaW5nPicpOwoKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKGlzX2RpcigkZGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sICRvdXRwdXQsICRkaXIpICYmIHRyaW0oJG91dHB1dCkgPT09ICcuJykgewp0cnkgewokY29tbWFuZHMgPSBbClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICcldXJsJSddLApbJ2dpdCcsICdyZW1vdGUnLCAndXBkYXRlJywgJy0tcHJ1bmUnLCAnb3JpZ2luJ10sClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICclc2FuaXRpemVkVXJsJSddLApbJ2dpdCcsICdnYycsICctLWF1dG8nXSwKXTsKCiR0aGlzLT5ydW5Db21tYW5kcygkY29tbWFuZHMsICR1cmwsICRkaXIpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPlN5bmMgbWlycm9yIGZhaWxlZDogJyAuICRlLT5nZXRNZXNzYWdlKCkgLiAnPC9lcnJvcj4nLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQpzZWxmOjpjaGVja0ZvclJlcG9Pd25lcnNoaXBFcnJvcigkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGRpcik7CgoKJHRoaXMtPmZpbGVzeXN0ZW0tPnJlbW92ZURpcmVjdG9yeSgkZGlyKTsKCiR0aGlzLT5ydW5Db21tYW5kcyhbWydnaXQnLCAnY2xvbmUnLCAnLS1taXJyb3InLCAnLS0nLCAnJXVybCUnLCAkZGlyXV0sICR1cmwsICRkaXIsIHRydWUpOwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmZXRjaFJlZk9yU3luY01pcnJvcihzdHJpbmcgJHVybCwgc3RyaW5nICRkaXIsIHN0cmluZyAkcmVmLCA/c3RyaW5nICRwcmV0dHlWZXJzaW9uID0gbnVsbCk6IGJvb2wKewppZiAoJHRoaXMtPmNoZWNrUmVmSXNJbk1pcnJvcigkZGlyLCAkcmVmKSkgewppZiAoUHJlZzo6aXNNYXRjaCgne15bYS1mMC05XXs0MH0kfScsICRyZWYpICYmICRwcmV0dHlWZXJzaW9uICE9PSBudWxsKSB7CiRicmFuY2ggPSBQcmVnOjpyZXBsYWNlKCd7KD86XmRldi18KD86XC54KT8tZGV2JCl9aScsICcnLCAkcHJldHR5VmVyc2lvbik7CiRicmFuY2hlcyA9IG51bGw7CiR0YWdzID0gbnVsbDsKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2JyYW5jaCddLCAkb3V0cHV0LCAkZGlyKSkgewokYnJhbmNoZXMgPSAkb3V0cHV0Owp9CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICd0YWcnXSwgJG91dHB1dCwgJGRpcikpIHsKJHRhZ3MgPSAkb3V0cHV0Owp9CgoKCgoKaWYgKG51bGwgIT09ICRicmFuY2hlcyAmJiAhUHJlZzo6aXNNYXRjaCgne15bXHMqXSp2PycucHJlZ19xdW90ZSgkYnJhbmNoKS4nJH1tJywgJGJyYW5jaGVzKQomJiBudWxsICE9PSAkdGFncyAmJiAhUHJlZzo6aXNNYXRjaCgne15bXHMqXSonLnByZWdfcXVvdGUoJGJyYW5jaCkuJyR9bScsICR0YWdzKQopIHsKJHRoaXMtPnN5bmNNaXJyb3IoJHVybCwgJGRpcik7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCmlmICgkdGhpcy0+c3luY01pcnJvcigkdXJsLCAkZGlyKSkgewpyZXR1cm4gJHRoaXMtPmNoZWNrUmVmSXNJbk1pcnJvcigkZGlyLCAkcmVmKTsKfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vU2hvd1NpZ25hdHVyZUZsYWcoUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKTogc3RyaW5nCnsKJGdpdFZlcnNpb24gPSBzZWxmOjpnZXRWZXJzaW9uKCRwcm9jZXNzKTsKaWYgKCRnaXRWZXJzaW9uICE9PSBudWxsICYmIHZlcnNpb25fY29tcGFyZSgkZ2l0VmVyc2lvbiwgJzIuMTAuMC1yYzAnLCAnPj0nKSkgewpyZXR1cm4gJyAtLW5vLXNob3ctc2lnbmF0dXJlJzsKfQoKcmV0dXJuICcnOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE5vU2hvd1NpZ25hdHVyZUZsYWdzKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IGFycmF5CnsKJGZsYWdzID0gc3RhdGljOjpnZXROb1Nob3dTaWduYXR1cmVGbGFnKCRwcm9jZXNzKTsKaWYgKCcnID09PSAkZmxhZ3MpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gZXhwbG9kZSgnICcsIHN1YnN0cigkZmxhZ3MsIDEpKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHBvcnRzTm9Db21taXRIZWFkZXJGbGFnKFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IGJvb2wKewokZ2l0VmVyc2lvbiA9IHNlbGY6OmdldFZlcnNpb24oJHByb2Nlc3MpOwoKcmV0dXJuICRnaXRWZXJzaW9uICE9PSBudWxsICYmIHZlcnNpb25fY29tcGFyZSgkZ2l0VmVyc2lvbiwgJzIuMzMuMC1yYzAnLCAnPj0nKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnVpbGRSZXZMaXN0Q29tbWFuZChQcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MsIGFycmF5ICRhcmd1bWVudHMpOiBhcnJheQp7CiRjb21tYW5kID0gWydnaXQnLCAncmV2LWxpc3QnXTsKaWYgKHNlbGY6OnN1cHBvcnRzTm9Db21taXRIZWFkZXJGbGFnKCRwcm9jZXNzKSkgewokY29tbWFuZFtdID0gJy0tbm8tY29tbWl0LWhlYWRlcic7Cn0KCnJldHVybiBhcnJheV9tZXJnZSgkY29tbWFuZCwgJGFyZ3VtZW50cyk7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwYXJzZVJldkxpc3RPdXRwdXQoc3RyaW5nICRvdXRwdXQsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2Vzcyk6IHN0cmluZwp7CgppZiAoc2VsZjo6c3VwcG9ydHNOb0NvbW1pdEhlYWRlckZsYWcoJHByb2Nlc3MpKSB7CnJldHVybiAkb3V0cHV0Owp9CgoKcmV0dXJuIFByZWc6OnJlcGxhY2UoJ3teY29tbWl0IFthLWYwLTldezQwfVxuP31tJywgJycsICRvdXRwdXQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrUmVmSXNJbk1pcnJvcihzdHJpbmcgJGRpciwgc3RyaW5nICRyZWYpOiBib29sCnsKaWYgKGlzX2RpcigkZGlyKSAmJiAwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1naXQtZGlyJ10sICRvdXRwdXQsICRkaXIpICYmIHRyaW0oJG91dHB1dCkgPT09ICcuJykgewokZXhpdENvZGUgPSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdyZXYtcGFyc2UnLCAnLS1xdWlldCcsICctLXZlcmlmeScsICRyZWYuJ157Y29tbWl0fSddLCAkaWdub3JlZE91dHB1dCwgJGRpcik7CmlmICgkZXhpdENvZGUgPT09IDApIHsKcmV0dXJuIHRydWU7Cn0KfQpzZWxmOjpjaGVja0ZvclJlcG9Pd25lcnNoaXBFcnJvcigkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKSwgJGRpcik7CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0QXV0aGVudGljYXRpb25GYWlsdXJlKHN0cmluZyAkdXJsKTogP2FycmF5CnsKaWYgKCFQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XihodHRwcz86Ly8pKFteL10rKSguKikkfWknLCAkdXJsLCAkbWF0Y2gpKSB7CnJldHVybiBudWxsOwp9CgokYXV0aEZhaWx1cmVzID0gWwonZmF0YWw6IEF1dGhlbnRpY2F0aW9uIGZhaWxlZCcsCidyZW1vdGUgZXJyb3I6IEludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQuJywKJ2Vycm9yOiA0MDEgVW5hdXRob3JpemVkJywKJ2ZhdGFsOiB1bmFibGUgdG8gYWNjZXNzJywKJ2ZhdGFsOiBjb3VsZCBub3QgcmVhZCBVc2VybmFtZScsCl07CgokZXJyb3JPdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKZm9yZWFjaCAoJGF1dGhGYWlsdXJlcyBhcyAkYXV0aEZhaWx1cmUpIHsKaWYgKHN0cnBvcygkZXJyb3JPdXRwdXQsICRhdXRoRmFpbHVyZSkgIT09IGZhbHNlKSB7CnJldHVybiAkbWF0Y2g7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRNaXJyb3JEZWZhdWx0QnJhbmNoKHN0cmluZyAkdXJsLCBzdHJpbmcgJGRpciwgYm9vbCAkaXNMb2NhbFBhdGhSZXBvc2l0b3J5KTogP3N0cmluZwp7CmlmICgoYm9vbCkgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLJykpIHsKcmV0dXJuIG51bGw7Cn0KCnRyeSB7CmlmICgkaXNMb2NhbFBhdGhSZXBvc2l0b3J5KSB7CiR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ3JlbW90ZScsICdzaG93JywgJ29yaWdpbiddLCAkb3V0cHV0LCAkZGlyKTsKfSBlbHNlIHsKJGNvbW1hbmRzID0gWwpbJ2dpdCcsICdyZW1vdGUnLCAnc2V0LXVybCcsICdvcmlnaW4nLCAnLS0nLCAnJXVybCUnXSwKWydnaXQnLCAncmVtb3RlJywgJ3Nob3cnLCAnb3JpZ2luJ10sClsnZ2l0JywgJ3JlbW90ZScsICdzZXQtdXJsJywgJ29yaWdpbicsICctLScsICclc2FuaXRpemVkVXJsJSddLApdOwoKJHRoaXMtPnJ1bkNvbW1hbmRzKCRjb21tYW5kcywgJHVybCwgJGRpciwgZmFsc2UsICRvdXRwdXQpOwp9CgokbGluZXMgPSAkdGhpcy0+cHJvY2Vzcy0+c3BsaXRMaW5lcygkb3V0cHV0KTsKZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XlxzKkhFQUQgYnJhbmNoOlxzKC4rKVxzKiR9bScsICRsaW5lLCAkbWF0Y2hlcykpIHsKcmV0dXJuICRtYXRjaGVzWzFdOwp9Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzxlcnJvcj5GYWlsZWQgdG8gZmV0Y2ggcm9vdCBpZGVudGlmaWVyIGZyb20gcmVtb3RlOiAnIC4gJGUtPmdldE1lc3NhZ2UoKSAuICc8L2Vycm9yPicsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFuRW52KD9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3MgPSBudWxsKTogdm9pZAp7CiRnaXRWZXJzaW9uID0gc2VsZjo6Z2V0VmVyc2lvbigkcHJvY2VzcyA/PyBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCkpOwppZiAoJGdpdFZlcnNpb24gIT09IG51bGwgJiYgdmVyc2lvbl9jb21wYXJlKCRnaXRWZXJzaW9uLCAnMi4zLjAnLCAnPj0nKSkgewoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVF9URVJNSU5BTF9QUk9NUFQnKSAhPT0gJzAnKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0dJVF9URVJNSU5BTF9QUk9NUFQnLCAnMCcpOwp9Cn0gZWxzZSB7CgppZiAoUGxhdGZvcm06OmdldEVudignR0lUX0FTS1BBU1MnKSAhPT0gJ2VjaG8nKSB7ClBsYXRmb3JtOjpwdXRFbnYoJ0dJVF9BU0tQQVNTJywgJ2VjaG8nKTsKfQp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0dJVF9ESVInKSkgewpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0dJVF9ESVInKTsKfQppZiAoUGxhdGZvcm06OmdldEVudignR0lUX1dPUktfVFJFRScpKSB7ClBsYXRmb3JtOjpjbGVhckVudignR0lUX1dPUktfVFJFRScpOwp9CgoKaWYgKFBsYXRmb3JtOjpnZXRFbnYoJ0xBTkdVQUdFJykgIT09ICdDJykgewpQbGF0Zm9ybTo6cHV0RW52KCdMQU5HVUFHRScsICdDJyk7Cn0KCgpQbGF0Zm9ybTo6Y2xlYXJFbnYoJ0RZTERfTElCUkFSWV9QQVRIJyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0R2l0SHViRG9tYWluc1JlZ2V4KENvbmZpZyAkY29uZmlnKTogc3RyaW5nCnsKcmV0dXJuICcoJyAuIGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJykpKSAuICcpJzsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRHaXRMYWJEb21haW5zUmVnZXgoQ29uZmlnICRjb25maWcpOiBzdHJpbmcKewpyZXR1cm4gJygnIC4gaW1wbG9kZSgnfCcsIGFycmF5X21hcCgncHJlZ19xdW90ZScsICRjb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSkpIC4gJyknOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24oJG1lc3NhZ2UsIHN0cmluZyAkdXJsKTogdm9pZAp7CgpjbGVhcnN0YXRjYWNoZSgpOwoKaWYgKDAgIT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJy0tdmVyc2lvbiddLCAkaWdub3JlZE91dHB1dCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJ0ZhaWxlZCB0byBjbG9uZSAnIC4gJHVybCAuICcsIGdpdCB3YXMgbm90IGZvdW5kLCBjaGVjayB0aGF0IGl0IGlzIGluc3RhbGxlZCBhbmQgaW4geW91ciBQQVRIIGVudi4nIC4gIlxuXG4iIC4gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCkpKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJG1lc3NhZ2UpKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKTogP3N0cmluZwp7CmlmIChmYWxzZSA9PT0gc2VsZjo6JHZlcnNpb24pIHsKc2VsZjo6JHZlcnNpb24gPSBudWxsOwppZiAoMCA9PT0gJHByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnLS12ZXJzaW9uJ10sICRvdXRwdXQpICYmIFByZWc6OmlzTWF0Y2goJy9eZ2l0IHZlcnNpb24gKFxkKyg/OlwuXGQrKSspL20nLCAkb3V0cHV0LCAkbWF0Y2hlcykpIHsKc2VsZjo6JHZlcnNpb24gPSAkbWF0Y2hlc1sxXTsKfQp9CgpyZXR1cm4gc2VsZjo6JHZlcnNpb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFza0NyZWRlbnRpYWxzKHN0cmluZyAkZXJyb3IsIGFycmF5ICRjcmVkZW50aWFscyk6IHN0cmluZwp7CiRtYXNrZWRDcmVkZW50aWFscyA9IFtdOwoKZm9yZWFjaCAoJGNyZWRlbnRpYWxzIGFzICRjcmVkZW50aWFsKSB7CmlmIChpbl9hcnJheSgkY3JlZGVudGlhbCwgWydwcml2YXRlLXRva2VuJywgJ3gtdG9rZW4tYXV0aCcsICdvYXV0aDInLCAnZ2l0bGFiLWNpLXRva2VuJywgJ3gtb2F1dGgtYmFzaWMnXSkpIHsKJG1hc2tlZENyZWRlbnRpYWxzW10gPSAkY3JlZGVudGlhbDsKfSBlbHNlaWYgKHN0cmxlbigkY3JlZGVudGlhbCkgPiA2KSB7CiRtYXNrZWRDcmVkZW50aWFsc1tdID0gc3Vic3RyKCRjcmVkZW50aWFsLCAwLCAzKSAuICcuLi4nIC4gc3Vic3RyKCRjcmVkZW50aWFsLCAtMyk7Cn0gZWxzZWlmIChzdHJsZW4oJGNyZWRlbnRpYWwpID4gMykgewokbWFza2VkQ3JlZGVudGlhbHNbXSA9IHN1YnN0cigkY3JlZGVudGlhbCwgMCwgMykgLiAnLi4uJzsKfSBlbHNlIHsKJG1hc2tlZENyZWRlbnRpYWxzW10gPSAnWFhYJzsKfQp9CgpyZXR1cm4gc3RyX3JlcGxhY2UoJGNyZWRlbnRpYWxzLCAkbWFza2VkQ3JlZGVudGlhbHMsICRlcnJvcik7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxGYWN0b3J5Owp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxDb25maWc7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEdpdEh1Ygp7CnB1YmxpYyBjb25zdCBHSVRIVUJfVE9LRU5fUkVHRVggPSAne14oW2EtZjAtOV17MTIsfXxnaFthLXpdX1thLXpBLVowLTlfXSt8Z2l0aHViX3BhdF9bYS16QS1aMC05X10rKSR9JzsKCgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPzogbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXIgPzogRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJHRoaXMtPmlvLCAkY29uZmlnKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGF1dGhvcml6ZU9BdXRoKHN0cmluZyAkb3JpZ2luVXJsKTogYm9vbAp7CmlmICghaW5fYXJyYXkoJG9yaWdpblVybCwgJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItZG9tYWlucycpKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY29uZmlnJywgJ2dpdGh1Yi5hY2Nlc3N0b2tlbiddLCAkb3V0cHV0KSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsIHRyaW0oJG91dHB1dCksICd4LW9hdXRoLWJhc2ljJyk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhJbnRlcmFjdGl2ZWx5KHN0cmluZyAkb3JpZ2luVXJsLCA/c3RyaW5nICRtZXNzYWdlID0gbnVsbCk6IGJvb2wKewppZiAoJG1lc3NhZ2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKfQoKJG5vdGUgPSAnQ29tcG9zZXInOwppZiAoJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRodWItZXhwb3NlLWhvc3RuYW1lJykgPT09IHRydWUgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydob3N0bmFtZSddLCAkb3V0cHV0KSkgewokbm90ZSAuPSAnIG9uICcgLiB0cmltKCRvdXRwdXQpOwp9CiRub3RlIC49ICcgJyAuIGRhdGUoJ1ktbS1kIEhpJyk7CgokbG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmNvbmZpZy0+Z2V0TG9jYWxBdXRoQ29uZmlnU291cmNlKCk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwonWW91IG5lZWQgdG8gcHJvdmlkZSBhIEdpdEh1YiBhY2Nlc3MgdG9rZW4uJywKc3ByaW50ZignVG9rZW5zIHdpbGwgYmUgc3RvcmVkIGluIHBsYWluIHRleHQgaW4gIiVzIiBmb3IgZnV0dXJlIHVzZSBieSBDb21wb3Nlci4nLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSwKJ0R1ZSB0byB0aGUgc2VjdXJpdHkgcmlzayBvZiB0b2tlbnMgYmVpbmcgZXhmaWx0cmF0ZWQsIHVzZSB0b2tlbnMgd2l0aCBzaG9ydCBleHBpcmF0aW9uIHRpbWVzIGFuZCBvbmx5IHRoZSBtaW5pbXVtIHBlcm1pc3Npb25zIG5lY2Vzc2FyeS4nLAonJywKJ0NhcmVmdWxseSBjb25zaWRlciB0aGUgZm9sbG93aW5nIG9wdGlvbnMgaW4gb3JkZXI6JywKJycsCl0pOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKFsKJzEuIFdoZW4geW91IGRvblwndCB1c2UgXCd2Y3NcJyAgdHlwZSBcJ3JlcG9zaXRvcmllc1wnICBpbiBjb21wb3Nlci5qc29uIGFuZCBkbyBub3QgbmVlZCB0byBjbG9uZSBzb3VyY2Ugb3IgZG93bmxvYWQgZGlzdCBmaWxlcycsCidmcm9tIHByaXZhdGUgR2l0SHViIHJlcG9zaXRvcmllcyBvdmVyIEhUVFBTLCB1c2UgYSBmaW5lLWdyYWluZWQgdG9rZW4gd2l0aCByZWFkLW9ubHkgYWNjZXNzIHRvIHB1YmxpYyBpbmZvcm1hdGlvbi4nLAonVXNlIHRoZSBmb2xsb3dpbmcgVVJMIHRvIGNyZWF0ZSBzdWNoIGEgdG9rZW46JywKJ2h0dHBzOi8vJy4kb3JpZ2luVXJsLicvc2V0dGluZ3MvcGVyc29uYWwtYWNjZXNzLXRva2Vucy9uZXc/bmFtZT0nIC4gc3RyX3JlcGxhY2UoJyUyMCcsICcrJywgcmF3dXJsZW5jb2RlKCRub3RlKSksCicnLApdKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcihbCicyLiBXaGVuIGFsbCByZWxldmFudCBfcHJpdmF0ZV8gR2l0SHViIHJlcG9zaXRvcmllcyBiZWxvbmcgdG8gYSBzaW5nbGUgdXNlciBvciBvcmdhbmlzYXRpb24sIHVzZSBhIGZpbmUtZ3JhaW5lZCB0b2tlbiB3aXRoJywKJ3JlcG9zaXRvcnkgImNvbnRlbnQiIHJlYWQtb25seSBwZXJtaXNzaW9ucy4gWW91IGNhbiBzdGFydCB3aXRoIHRoZSBmb2xsb3dpbmcgVVJMLCBidXQgeW91IG1heSBuZWVkIHRvIGNoYW5nZSB0aGUgcmVzb3VyY2Ugb3duZXInLAondG8gdGhlIHJpZ2h0IHVzZXIgb3Igb3JnYW5pc2F0aW9uLiBBZGRpdGlvbmFsbHksIHlvdSBjYW4gc2NvcGUgcGVybWlzc2lvbnMgZG93biB0byBhcHBseSBvbmx5IHRvIHNlbGVjdGVkIHJlcG9zaXRvcmllcy4nLAonaHR0cHM6Ly8nLiRvcmlnaW5VcmwuJy9zZXR0aW5ncy9wZXJzb25hbC1hY2Nlc3MtdG9rZW5zL25ldz9jb250ZW50cz1yZWFkJm5hbWU9JyAuIHN0cl9yZXBsYWNlKCclMjAnLCAnKycsIHJhd3VybGVuY29kZSgkbm90ZSkpLAonJywKXSk7CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoWwonMy4gQSAiY2xhc3NpYyIgdG9rZW4gZ3JhbnRzIGJyb2FkIHBlcm1pc3Npb25zIG9uIHlvdXIgYmVoYWxmIHRvIGFsbCByZXBvc2l0b3JpZXMgYWNjZXNzaWJsZSBieSB5b3UuJywKJ1RoaXMgbWF5IGluY2x1ZGUgd3JpdGUgcGVybWlzc2lvbnMsIGV2ZW4gdGhvdWdoIG5vdCBuZWVkZWQgYnkgQ29tcG9zZXIuIFVzZSBpdCBvbmx5IHdoZW4geW91IG5lZWQgdG8gYWNjZXNzJywKJ3ByaXZhdGUgcmVwb3NpdG9yaWVzIGFjcm9zcyBtdWx0aXBsZSBvcmdhbmlzYXRpb25zIGF0IHRoZSBzYW1lIHRpbWUgYW5kIHVzaW5nIGRpcmVjdG9yeS1zcGVjaWZpYyBhdXRoZW50aWNhdGlvbiBzb3VyY2VzJywKJ2lzIG5vdCBhbiBvcHRpb24uIFlvdSBjYW4gZ2VuZXJhdGUgYSBjbGFzc2ljIHRva2VuIGhlcmU6JywKJ2h0dHBzOi8vJy4kb3JpZ2luVXJsLicvc2V0dGluZ3MvdG9rZW5zL25ldz9zY29wZXM9cmVwbyZkZXNjcmlwdGlvbj0nIC4gc3RyX3JlcGxhY2UoJyUyMCcsICcrJywgcmF3dXJsZW5jb2RlKCRub3RlKSksCicnLApdKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIGNoZWNrIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy9hcnRpY2xlcy9hdXRoZW50aWNhdGlvbi1mb3ItcHJpdmF0ZS1wYWNrYWdlcy5tZCNnaXRodWItb2F1dGgnKTsKCiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gZmFsc2U7CmlmICgkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsKSB7CiRzdG9yZUluTG9jYWxBdXRoQ29uZmlnID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oJ0EgbG9jYWwgYXV0aCBjb25maWcgc291cmNlIHdhcyBmb3VuZCwgZG8geW91IHdhbnQgdG8gc3RvcmUgdGhlIHRva2VuIHRoZXJlPycsIHRydWUpOwp9CgokdG9rZW4gPSB0cmltKChzdHJpbmcpICR0aGlzLT5pby0+YXNrQW5kSGlkZUFuc3dlcignVG9rZW4gKGhpZGRlbik6ICcpKTsKCmlmICgkdG9rZW4gPT09ICcnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPHdhcm5pbmc+Tm8gdG9rZW4gZ2l2ZW4sIGFib3J0aW5nLjwvd2FybmluZz4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGdpdGh1Yi1vYXV0aC5naXRodWIuY29tIDx0b2tlbj4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHRva2VuLCAneC1vYXV0aC1iYXNpYycpOwoKdHJ5IHsKJGFwaVVybCA9ICgnZ2l0aHViLmNvbScgPT09ICRvcmlnaW5VcmwpID8gJ2FwaS5naXRodWIuY29tLycgOiAkb3JpZ2luVXJsIC4gJy9hcGkvdjMvJzsKCiR0aGlzLT5odHRwRG93bmxvYWRlci0+Z2V0KCdodHRwczovLycuICRhcGlVcmwsIFsKJ3JldHJ5LWF1dGgtZmFpbHVyZScgPT4gZmFsc2UsCl0pOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKaWYgKGluX2FycmF5KCRlLT5nZXRDb2RlKCksIFs0MDMsIDQwMV0pKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGVycm9yPkludmFsaWQgdG9rZW4gcHJvdmlkZWQuPC9lcnJvcj4nKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gYWRkIGl0IG1hbnVhbGx5IGxhdGVyIGJ5IHVzaW5nICJjb21wb3NlciBjb25maWcgLS1nbG9iYWwgLS1hdXRoIGdpdGh1Yi1vYXV0aC5naXRodWIuY29tIDx0b2tlbj4iJyk7CgpyZXR1cm4gZmFsc2U7Cn0KCnRocm93ICRlOwp9CgoKJGF1dGhDb25maWdTb3VyY2UgPSAkc3RvcmVJbkxvY2FsQXV0aENvbmZpZyAmJiAkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZyA6ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKJHRoaXMtPmNvbmZpZy0+Z2V0Q29uZmlnU291cmNlKCktPnJlbW92ZUNvbmZpZ1NldHRpbmcoJ2dpdGh1Yi1vYXV0aC4nLiRvcmlnaW5VcmwpOwokYXV0aENvbmZpZ1NvdXJjZS0+YWRkQ29uZmlnU2V0dGluZygnZ2l0aHViLW9hdXRoLicuJG9yaWdpblVybCwgJHRva2VuKTsKCiR0aGlzLT5pby0+d3JpdGVFcnJvcignPGluZm8+VG9rZW4gc3RvcmVkIHN1Y2Nlc3NmdWxseS48L2luZm8+Jyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRSYXRlTGltaXQoYXJyYXkgJGhlYWRlcnMpOiBhcnJheQp7CiRyYXRlTGltaXQgPSBbCidsaW1pdCcgPT4gJz8nLAoncmVzZXQnID0+ICc/JywKXTsKCmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKJGhlYWRlciA9IHRyaW0oJGhlYWRlcik7CmlmIChmYWxzZSA9PT0gc3RyaXBvcygkaGVhZGVyLCAneC1yYXRlbGltaXQtJykpIHsKY29udGludWU7Cn0KWyR0eXBlLCAkdmFsdWVdID0gZXhwbG9kZSgnOicsICRoZWFkZXIsIDIpOwpzd2l0Y2ggKHN0cnRvbG93ZXIoJHR5cGUpKSB7CmNhc2UgJ3gtcmF0ZWxpbWl0LWxpbWl0JzoKJHJhdGVMaW1pdFsnbGltaXQnXSA9IChpbnQpIHRyaW0oJHZhbHVlKTsKYnJlYWs7CmNhc2UgJ3gtcmF0ZWxpbWl0LXJlc2V0JzoKJHJhdGVMaW1pdFsncmVzZXQnXSA9IGRhdGUoJ1ktbS1kIEg6aTpzJywgKGludCkgdHJpbSgkdmFsdWUpKTsKYnJlYWs7Cn0KfQoKcmV0dXJuICRyYXRlTGltaXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFNzb1VybChhcnJheSAkaGVhZGVycyk6ID9zdHJpbmcKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CiRoZWFkZXIgPSB0cmltKCRoZWFkZXIpOwppZiAoZmFsc2UgPT09IHN0cmlwb3MoJGhlYWRlciwgJ3gtZ2l0aHViLXNzbzogcmVxdWlyZWQnKSkgewpjb250aW51ZTsKfQppZiAoUHJlZzo6aXNNYXRjaCgne1xidXJsPSg/UDx1cmw+W15ccztdKyl9JywgJGhlYWRlciwgJG1hdGNoKSkgewpyZXR1cm4gJG1hdGNoWyd1cmwnXTsKfQp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNSYXRlTGltaXRlZChhcnJheSAkaGVhZGVycyk6IGJvb2wKewpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XngtcmF0ZWxpbWl0LXJlbWFpbmluZzogKjAkfWknLCB0cmltKCRoZWFkZXIpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVxdWlyZXNTc28oYXJyYXkgJGhlYWRlcnMpOiBib29sCnsKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne154LWdpdGh1Yi1zc286IHJlcXVpcmVkfWknLCB0cmltKCRoZWFkZXIpKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXEZhY3Rvcnk7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIEdpdExhYgp7Cgpwcm90ZWN0ZWQgJGlvOwoKcHJvdGVjdGVkICRjb25maWc7Cgpwcm90ZWN0ZWQgJHByb2Nlc3M7Cgpwcm90ZWN0ZWQgJGh0dHBEb3dubG9hZGVyOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwsID9IdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIgPSBudWxsKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPzogbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwokdGhpcy0+aHR0cERvd25sb2FkZXIgPSAkaHR0cERvd25sb2FkZXIgPzogRmFjdG9yeTo6Y3JlYXRlSHR0cERvd25sb2FkZXIoJHRoaXMtPmlvLCAkY29uZmlnKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aChzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewoKJGJjT3JpZ2luVXJsID0gUHJlZzo6cmVwbGFjZSgnezpcZCt9JywgJycsICRvcmlnaW5VcmwpOwoKaWYgKCFpbl9hcnJheSgkb3JpZ2luVXJsLCAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1kb21haW5zJyksIHRydWUpICYmICFpbl9hcnJheSgkYmNPcmlnaW5VcmwsICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkpIHsKcmV0dXJuIGZhbHNlOwp9CgoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKFsnZ2l0JywgJ2NvbmZpZycsICdnaXRsYWIuYWNjZXNzdG9rZW4nXSwgJG91dHB1dCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCB0cmltKCRvdXRwdXQpLCAnb2F1dGgyJyk7CgpyZXR1cm4gdHJ1ZTsKfQoKCmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ2dpdCcsICdjb25maWcnLCAnZ2l0bGFiLmRlcGxveXRva2VuLnVzZXInXSwgJHRva2VuVXNlcikgJiYgMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoWydnaXQnLCAnY29uZmlnJywgJ2dpdGxhYi5kZXBsb3l0b2tlbi50b2tlbiddLCAkdG9rZW5QYXNzd29yZCkpIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCB0cmltKCR0b2tlblVzZXIpLCB0cmltKCR0b2tlblBhc3N3b3JkKSk7CgpyZXR1cm4gdHJ1ZTsKfQoKCiRhdXRoVG9rZW5zID0gJHRoaXMtPmNvbmZpZy0+Z2V0KCdnaXRsYWItdG9rZW4nKTsKCmlmIChpc3NldCgkYXV0aFRva2Vuc1skb3JpZ2luVXJsXSkpIHsKJHRva2VuID0gJGF1dGhUb2tlbnNbJG9yaWdpblVybF07Cn0KCmlmIChpc3NldCgkYXV0aFRva2Vuc1skYmNPcmlnaW5VcmxdKSkgewokdG9rZW4gPSAkYXV0aFRva2Vuc1skYmNPcmlnaW5VcmxdOwp9CgppZiAoaXNzZXQoJHRva2VuKSkgewokdXNlcm5hbWUgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ1c2VybmFtZSJdIDogJHRva2VuOwokcGFzc3dvcmQgPSBpc19hcnJheSgkdG9rZW4pID8gJHRva2VuWyJ0b2tlbiJdIDogJ3ByaXZhdGUtdG9rZW4nOwoKCgppZiAoaW5fYXJyYXkoJHVzZXJuYW1lLCBbJ3ByaXZhdGUtdG9rZW4nLCAnZ2l0bGFiLWNpLXRva2VuJywgJ29hdXRoMiddLCB0cnVlKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRvcmlnaW5VcmwsICRwYXNzd29yZCwgJHVzZXJuYW1lKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkdXNlcm5hbWUsICRwYXNzd29yZCk7Cn0KCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdXRob3JpemVPQXV0aEludGVyYWN0aXZlbHkoc3RyaW5nICRzY2hlbWUsIHN0cmluZyAkb3JpZ2luVXJsLCA/c3RyaW5nICRtZXNzYWdlID0gbnVsbCk6IGJvb2wKewppZiAoJG1lc3NhZ2UpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRtZXNzYWdlKTsKfQoKJGxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldExvY2FsQXV0aENvbmZpZ1NvdXJjZSgpOwokcGVyc29uYWxBY2Nlc3NUb2tlbkxpbmsgPSAkc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3VzZXJfc2V0dGluZ3MvcGVyc29uYWxfYWNjZXNzX3Rva2Vucyc7CiRyZXZva2VMaW5rID0gJHNjaGVtZS4nOi8vJy4kb3JpZ2luVXJsLicvLS91c2VyX3NldHRpbmdzL2FwcGxpY2F0aW9ucyc7CiR0aGlzLT5pby0+d3JpdGVFcnJvcihzcHJpbnRmKCdBIHRva2VuIHdpbGwgYmUgY3JlYXRlZCBhbmQgc3RvcmVkIGluICIlcyIsIHlvdXIgcGFzc3dvcmQgd2lsbCBuZXZlciBiZSBzdG9yZWQnLCAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCA/ICRsb2NhbEF1dGhDb25maWctPmdldE5hbWUoKSAuICcgT1IgJyA6ICcnKSAuICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKS0+Z2V0TmFtZSgpKSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG8gcmV2b2tlIGFjY2VzcyB0byB0aGlzIHRva2VuIHlvdSBjYW4gdmlzaXQ6Jyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigkcmV2b2tlTGluayk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignQWx0ZXJuYXRpdmVseSB5b3UgY2FuIHNldHVwIGFuIHBlcnNvbmFsIGFjY2VzcyB0b2tlbiBvbjonKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCRwZXJzb25hbEFjY2Vzc1Rva2VuTGluayk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignYW5kIHN0b3JlIGl0IHVuZGVyICJnaXRsYWItdG9rZW4iIHNlZSBodHRwczovL2dldGNvbXBvc2VyLm9yZy9kb2MvYXJ0aWNsZXMvYXV0aGVudGljYXRpb24tZm9yLXByaXZhdGUtcGFja2FnZXMubWQjZ2l0bGFiLXRva2VuIGZvciBtb3JlIGRldGFpbHMuJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG9jL2FydGljbGVzL2F1dGhlbnRpY2F0aW9uLWZvci1wcml2YXRlLXBhY2thZ2VzLm1kI2dpdGxhYi10b2tlbicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ2ZvciBtb3JlIGRldGFpbHMuJyk7Cgokc3RvcmVJbkxvY2FsQXV0aENvbmZpZyA9IGZhbHNlOwppZiAoJGxvY2FsQXV0aENvbmZpZyAhPT0gbnVsbCkgewokc3RvcmVJbkxvY2FsQXV0aENvbmZpZyA9ICR0aGlzLT5pby0+YXNrQ29uZmlybWF0aW9uKCdBIGxvY2FsIGF1dGggY29uZmlnIHNvdXJjZSB3YXMgZm91bmQsIGRvIHlvdSB3YW50IHRvIHN0b3JlIHRoZSB0b2tlbiB0aGVyZT8nLCB0cnVlKTsKfQoKJGF0dGVtcHRDb3VudGVyID0gMDsKCndoaWxlICgkYXR0ZW1wdENvdW50ZXIrKyA8IDUpIHsKdHJ5IHsKJHJlc3BvbnNlID0gJHRoaXMtPmNyZWF0ZVRva2VuKCRzY2hlbWUsICRvcmlnaW5VcmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKCgppZiAoaW5fYXJyYXkoJGUtPmdldENvZGUoKSwgWzQwMywgNDAxXSkpIHsKaWYgKDQwMSA9PT0gJGUtPmdldENvZGUoKSkgewokcmVzcG9uc2UgPSBqc29uX2RlY29kZSgkZS0+Z2V0UmVzcG9uc2UoKSwgdHJ1ZSk7CmlmIChpc3NldCgkcmVzcG9uc2VbJ2Vycm9yJ10pICYmICRyZXNwb25zZVsnZXJyb3InXSA9PT0gJ2ludmFsaWRfZ3JhbnQnKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignQmFkIGNyZWRlbnRpYWxzLiBJZiB5b3UgaGF2ZSB0d28gZmFjdG9yIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQgeW91IHdpbGwgaGF2ZSB0byBtYW51YWxseSBjcmVhdGUgYSBwZXJzb25hbCBhY2Nlc3MgdG9rZW4nKTsKfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdCYWQgY3JlZGVudGlhbHMuJyk7Cn0KfSBlbHNlIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdNYXhpbXVtIG51bWJlciBvZiBsb2dpbiBhdHRlbXB0cyBleGNlZWRlZC4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nKTsKfQoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdZb3UgY2FuIGFsc28gbWFudWFsbHkgY3JlYXRlIGEgcGVyc29uYWwgYWNjZXNzIHRva2VuIGVuYWJsaW5nIHRoZSAicmVhZF9hcGkiIHNjb3BlIGF0OicpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJHBlcnNvbmFsQWNjZXNzVG9rZW5MaW5rKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdBZGQgaXQgdXNpbmcgImNvbXBvc2VyIGNvbmZpZyAtLWdsb2JhbCAtLWF1dGggZ2l0bGFiLXRva2VuLicuJG9yaWdpblVybC4nIDx0b2tlbj4iJyk7Cgpjb250aW51ZTsKfQoKdGhyb3cgJGU7Cn0KCiR0aGlzLT5pby0+c2V0QXV0aGVudGljYXRpb24oJG9yaWdpblVybCwgJHJlc3BvbnNlWydhY2Nlc3NfdG9rZW4nXSwgJ29hdXRoMicpOwoKJGF1dGhDb25maWdTb3VyY2UgPSAkc3RvcmVJbkxvY2FsQXV0aENvbmZpZyAmJiAkbG9jYWxBdXRoQ29uZmlnICE9PSBudWxsID8gJGxvY2FsQXV0aENvbmZpZyA6ICR0aGlzLT5jb25maWctPmdldEF1dGhDb25maWdTb3VyY2UoKTsKCmlmIChpc3NldCgkcmVzcG9uc2VbJ2V4cGlyZXNfaW4nXSkpIHsKJGF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoCidnaXRsYWItb2F1dGguJy4kb3JpZ2luVXJsLApbCidleHBpcmVzLWF0JyA9PiBpbnR2YWwoJHJlc3BvbnNlWydjcmVhdGVkX2F0J10pICsgaW50dmFsKCRyZXNwb25zZVsnZXhwaXJlc19pbiddKSwKJ3JlZnJlc2gtdG9rZW4nID0+ICRyZXNwb25zZVsncmVmcmVzaF90b2tlbiddLAondG9rZW4nID0+ICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10sCl0KKTsKfSBlbHNlIHsKJGF1dGhDb25maWdTb3VyY2UtPmFkZENvbmZpZ1NldHRpbmcoJ2dpdGxhYi1vYXV0aC4nLiRvcmlnaW5VcmwsICRyZXNwb25zZVsnYWNjZXNzX3Rva2VuJ10pOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdJbnZhbGlkIEdpdExhYiBjcmVkZW50aWFscyA1IHRpbWVzIGluIGEgcm93LCBhYm9ydGluZy4nKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXV0aG9yaXplT0F1dGhSZWZyZXNoKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGJvb2wKewp0cnkgewokcmVzcG9uc2UgPSAkdGhpcy0+cmVmcmVzaFRva2VuKCRzY2hlbWUsICRvcmlnaW5VcmwpOwp9IGNhdGNoIChUcmFuc3BvcnRFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCJDb3VsZG4ndCByZWZyZXNoIGFjY2VzcyB0b2tlbjogIi4kZS0+Z2V0TWVzc2FnZSgpKTsKCnJldHVybiBmYWxzZTsKfQoKJHRoaXMtPmlvLT5zZXRBdXRoZW50aWNhdGlvbigkb3JpZ2luVXJsLCAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLCAnb2F1dGgyJyk7CgoKJHRoaXMtPmNvbmZpZy0+Z2V0QXV0aENvbmZpZ1NvdXJjZSgpLT5hZGRDb25maWdTZXR0aW5nKAonZ2l0bGFiLW9hdXRoLicuJG9yaWdpblVybCwKWwonZXhwaXJlcy1hdCcgPT4gaW50dmFsKCRyZXNwb25zZVsnY3JlYXRlZF9hdCddKSArIGludHZhbCgkcmVzcG9uc2VbJ2V4cGlyZXNfaW4nXSksCidyZWZyZXNoLXRva2VuJyA9PiAkcmVzcG9uc2VbJ3JlZnJlc2hfdG9rZW4nXSwKJ3Rva2VuJyA9PiAkcmVzcG9uc2VbJ2FjY2Vzc190b2tlbiddLApdCik7CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVRva2VuKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGFycmF5CnsKJHVzZXJuYW1lID0gJHRoaXMtPmlvLT5hc2soJ1VzZXJuYW1lOiAnKTsKJHBhc3N3b3JkID0gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdQYXNzd29yZDogJyk7CgokaGVhZGVycyA9IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXTsKCiRhcGlVcmwgPSAkb3JpZ2luVXJsOwokZGF0YSA9IGh0dHBfYnVpbGRfcXVlcnkoWwondXNlcm5hbWUnID0+ICR1c2VybmFtZSwKJ3Bhc3N3b3JkJyA9PiAkcGFzc3dvcmQsCidncmFudF90eXBlJyA9PiAncGFzc3dvcmQnLApdLCAnJywgJyYnKTsKJG9wdGlvbnMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+ICRoZWFkZXJzLAonY29udGVudCcgPT4gJGRhdGEsCl0sCl07CgokdG9rZW4gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkc2NoZW1lLic6Ly8nLiRhcGlVcmwuJy9vYXV0aC90b2tlbicsICRvcHRpb25zKS0+ZGVjb2RlSnNvbigpOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdUb2tlbiBzdWNjZXNzZnVsbHkgY3JlYXRlZCcpOwoKcmV0dXJuICR0b2tlbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNPQXV0aEV4cGlyZWQoc3RyaW5nICRvcmlnaW5VcmwpOiBib29sCnsKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwppZiAoaXNzZXQoJGF1dGhUb2tlbnNbJG9yaWdpblVybF1bJ2V4cGlyZXMtYXQnXSkpIHsKaWYgKCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydleHBpcmVzLWF0J10gPCB0aW1lKCkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVmcmVzaFRva2VuKHN0cmluZyAkc2NoZW1lLCBzdHJpbmcgJG9yaWdpblVybCk6IGFycmF5CnsKJGF1dGhUb2tlbnMgPSAkdGhpcy0+Y29uZmlnLT5nZXQoJ2dpdGxhYi1vYXV0aCcpOwppZiAoIWlzc2V0KCRhdXRoVG9rZW5zWyRvcmlnaW5VcmxdWydyZWZyZXNoLXRva2VuJ10pKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignTm8gR2l0TGFiIHJlZnJlc2ggdG9rZW4gcHJlc2VudCBmb3IgJy4kb3JpZ2luVXJsLicuJyk7Cn0KCiRyZWZyZXNoVG9rZW4gPSAkYXV0aFRva2Vuc1skb3JpZ2luVXJsXVsncmVmcmVzaC10b2tlbiddOwokaGVhZGVycyA9IFsnQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnXTsKCiRkYXRhID0gaHR0cF9idWlsZF9xdWVyeShbCidyZWZyZXNoX3Rva2VuJyA9PiAkcmVmcmVzaFRva2VuLAonZ3JhbnRfdHlwZScgPT4gJ3JlZnJlc2hfdG9rZW4nLApdLCAnJywgJyYnKTsKJG9wdGlvbnMgPSBbCidyZXRyeS1hdXRoLWZhaWx1cmUnID0+IGZhbHNlLAonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiAnUE9TVCcsCidoZWFkZXInID0+ICRoZWFkZXJzLAonY29udGVudCcgPT4gJGRhdGEsCl0sCl07CgokdG9rZW4gPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmdldCgkc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy9vYXV0aC90b2tlbicsICRvcHRpb25zKS0+ZGVjb2RlSnNvbigpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0dpdExhYiB0b2tlbiBzdWNjZXNzZnVsbHkgcmVmcmVzaGVkJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignVG8gcmV2b2tlIGFjY2VzcyB0byB0aGlzIHRva2VuIHlvdSBjYW4gdmlzaXQgJy4kc2NoZW1lLic6Ly8nLiRvcmlnaW5VcmwuJy8tL3VzZXJfc2V0dGluZ3MvYXBwbGljYXRpb25zJywgdHJ1ZSwgSU9JbnRlcmZhY2U6OlZFUllfVkVSQk9TRSk7CgpyZXR1cm4gJHRva2VuOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBIZwp7Cgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvbiA9IGZhbHNlOwoKCgoKcHJpdmF0ZSAkaW87CgoKCgpwcml2YXRlICRjb25maWc7CgoKCgpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KElPSW50ZXJmYWNlICRpbywgQ29uZmlnICRjb25maWcsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcykKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5jb25maWcgPSAkY29uZmlnOwokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuQ29tbWFuZChjYWxsYWJsZSAkY29tbWFuZENhbGxhYmxlLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkY3dkKTogdm9pZAp7CiR0aGlzLT5jb25maWctPnByb2hpYml0VXJsQnlDb25maWcoJHVybCwgJHRoaXMtPmlvKTsKCgokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJHVybCk7CgppZiAoMCA9PT0gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICRpZ25vcmVkT3V0cHV0LCAkY3dkKSkgewpyZXR1cm47Cn0KCgppZiAoClByZWc6OmlzTWF0Y2goJ3teKD9QPHByb3RvPnNzaHxodHRwcz8pOi8vKD86KD9QPHVzZXI+W146QF0rKSg/OjooP1A8cGFzcz5bXjpAXSspKT9AKT8oP1A8aG9zdD5bXi9dKykoP1A8cGF0aD4vLiopP31taScsICR1cmwsICRtYXRjaGVzKQomJiAkdGhpcy0+aW8tPmhhc0F1dGhlbnRpY2F0aW9uKCRtYXRjaGVzWydob3N0J10pCikgewppZiAoJG1hdGNoZXNbJ3Byb3RvJ10gPT09ICdzc2gnKSB7CiR1c2VyID0gJyc7CmlmICgkbWF0Y2hlc1sndXNlciddICE9PSBudWxsKSB7CiR1c2VyID0gcmF3dXJsZW5jb2RlKCRtYXRjaGVzWyd1c2VyJ10pIC4gJ0AnOwp9CiRhdXRoZW50aWNhdGVkVXJsID0gJG1hdGNoZXNbJ3Byb3RvJ10gLiAnOi8vJyAuICR1c2VyIC4gJG1hdGNoZXNbJ2hvc3QnXSAuICRtYXRjaGVzWydwYXRoJ107Cn0gZWxzZSB7CiRhdXRoID0gJHRoaXMtPmlvLT5nZXRBdXRoZW50aWNhdGlvbigkbWF0Y2hlc1snaG9zdCddKTsKJGF1dGhlbnRpY2F0ZWRVcmwgPSAkbWF0Y2hlc1sncHJvdG8nXSAuICc6Ly8nIC4gcmF3dXJsZW5jb2RlKChzdHJpbmcpICRhdXRoWyd1c2VybmFtZSddKSAuICc6JyAuIHJhd3VybGVuY29kZSgoc3RyaW5nKSAkYXV0aFsncGFzc3dvcmQnXSkgLiAnQCcgLiAkbWF0Y2hlc1snaG9zdCddIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfQokY29tbWFuZCA9ICRjb21tYW5kQ2FsbGFibGUoJGF1dGhlbnRpY2F0ZWRVcmwpOwoKaWYgKDAgPT09ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaWdub3JlZE91dHB1dCwgJGN3ZCkpIHsKcmV0dXJuOwp9CgokZXJyb3IgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKfSBlbHNlIHsKJGVycm9yID0gJ1RoZSBnaXZlbiBVUkwgKCcgLiR1cmwuICcpIGRvZXMgbm90IG1hdGNoIHRoZSByZXF1aXJlZCBmb3JtYXQgKHNzaHxodHRwKHMpOi8vKHVzZXJuYW1lOnBhc3N3b3JkQClleGFtcGxlLmNvbS9wYXRoLXRvLXJlcG9zaXRvcnkpJzsKfQoKJHRoaXMtPnRocm93RXhjZXB0aW9uKCJGYWlsZWQgdG8gY2xvbmUgJHVybCwgXG5cbiIgLiAkZXJyb3IsICR1cmwpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdGhyb3dFeGNlcHRpb24oJG1lc3NhZ2UsIHN0cmluZyAkdXJsKTogdm9pZAp7CmlmIChudWxsID09PSBzZWxmOjpnZXRWZXJzaW9uKCR0aGlzLT5wcm9jZXNzKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oVXJsOjpzYW5pdGl6ZSgKJ0ZhaWxlZCB0byBjbG9uZSAnIC4gJHVybCAuICcsIGhnIHdhcyBub3QgZm91bmQsIGNoZWNrIHRoYXQgaXQgaXMgaW5zdGFsbGVkIGFuZCBpbiB5b3VyIFBBVEggZW52LicgLiAiXG5cbiIgLiAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKQopKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKFVybDo6c2FuaXRpemUoJG1lc3NhZ2UpKTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb24oUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzKTogP3N0cmluZwp7CmlmIChmYWxzZSA9PT0gc2VsZjo6JHZlcnNpb24pIHsKc2VsZjo6JHZlcnNpb24gPSBudWxsOwppZiAoMCA9PT0gJHByb2Nlc3MtPmV4ZWN1dGUoWydoZycsICctLXZlcnNpb24nXSwgJG91dHB1dCkgJiYgUHJlZzo6aXNNYXRjaCgnL14uKz8gKFxkKyg/OlwuXGQrKSspKD86XCsuKj8pP1wpP1xyP1xuLycsICRvdXRwdXQsICRtYXRjaGVzKSkgewpzZWxmOjokdmVyc2lvbiA9ICRtYXRjaGVzWzFdOwp9Cn0KCnJldHVybiBzZWxmOjokdmVyc2lvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcUGxhdGZvcm07CnVzZSBDb21wb3NlclxVdGlsXFN0cmVhbUNvbnRleHRGYWN0b3J5Owp1c2UgQ29tcG9zZXJcVXRpbFxBdXRoSGVscGVyOwp1c2UgQ29tcG9zZXJcVXRpbFxVcmw7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBEb3dubG9hZGVyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlOwoKCgoKCgoKCmNsYXNzIEN1cmxEb3dubG9hZGVyCnsKCgoKCgoKcHJpdmF0ZSBjb25zdCBCQURfTVVMVElQTEVYSU5HX0NVUkxfVkVSU0lPTlMgPSBbJzcuODcuMCcsICc3Ljg4LjAnLCAnNy44OC4xJ107CgoKcHJpdmF0ZSAkbXVsdGlIYW5kbGU7Cgpwcml2YXRlICRzaGFyZUhhbmRsZTsKCnByaXZhdGUgJGpvYnMgPSBbXTsKCnByaXZhdGUgJGlvOwoKcHJpdmF0ZSAkY29uZmlnOwoKcHJpdmF0ZSAkYXV0aEhlbHBlcjsKCnByaXZhdGUgJHNlbGVjdFRpbWVvdXQgPSA1LjA7Cgpwcml2YXRlICRtYXhSZWRpcmVjdHMgPSAyMDsKCnByaXZhdGUgJG1heFJldHJpZXMgPSAzOwoKcHJvdGVjdGVkICRtdWx0aUVycm9ycyA9IFsKQ1VSTE1fQkFEX0hBTkRMRSA9PiBbJ0NVUkxNX0JBRF9IQU5ETEUnLCAnVGhlIHBhc3NlZC1pbiBoYW5kbGUgaXMgbm90IGEgdmFsaWQgQ1VSTE0gaGFuZGxlLiddLApDVVJMTV9CQURfRUFTWV9IQU5ETEUgPT4gWydDVVJMTV9CQURfRUFTWV9IQU5ETEUnLCAiQW4gZWFzeSBoYW5kbGUgd2FzIG5vdCBnb29kL3ZhbGlkLiBJdCBjb3VsZCBtZWFuIHRoYXQgaXQgaXNuJ3QgYW4gZWFzeSBoYW5kbGUgYXQgYWxsLCBvciBwb3NzaWJseSB0aGF0IHRoZSBoYW5kbGUgYWxyZWFkeSBpcyBpbiB1c2VkIGJ5IHRoaXMgb3IgYW5vdGhlciBtdWx0aSBoYW5kbGUuIl0sCkNVUkxNX09VVF9PRl9NRU1PUlkgPT4gWydDVVJMTV9PVVRfT0ZfTUVNT1JZJywgJ1lvdSBhcmUgZG9vbWVkLiddLApDVVJMTV9JTlRFUk5BTF9FUlJPUiA9PiBbJ0NVUkxNX0lOVEVSTkFMX0VSUk9SJywgJ1RoaXMgY2FuIG9ubHkgYmUgcmV0dXJuZWQgaWYgbGliY3VybCBidWdzLiBQbGVhc2UgcmVwb3J0IGl0IHRvIHVzISddLApdOwoKCnByaXZhdGUgc3RhdGljICRvcHRpb25zID0gWwonaHR0cCcgPT4gWwonbWV0aG9kJyA9PiBDVVJMT1BUX0NVU1RPTVJFUVVFU1QsCidjb250ZW50JyA9PiBDVVJMT1BUX1BPU1RGSUVMRFMsCidoZWFkZXInID0+IENVUkxPUFRfSFRUUEhFQURFUiwKJ3RpbWVvdXQnID0+IENVUkxPUFRfVElNRU9VVCwKXSwKJ3NzbCcgPT4gWwonY2FmaWxlJyA9PiBDVVJMT1BUX0NBSU5GTywKJ2NhcGF0aCcgPT4gQ1VSTE9QVF9DQVBBVEgsCid2ZXJpZnlfcGVlcicgPT4gQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiwKJ3ZlcmlmeV9wZWVyX25hbWUnID0+IENVUkxPUFRfU1NMX1ZFUklGWUhPU1QsCidsb2NhbF9jZXJ0JyA9PiBDVVJMT1BUX1NTTENFUlQsCidsb2NhbF9waycgPT4gQ1VSTE9QVF9TU0xLRVksCidwYXNzcGhyYXNlJyA9PiBDVVJMT1BUX1NTTEtFWVBBU1NXRCwKXSwKXTsKCgpwcml2YXRlIHN0YXRpYyAkdGltZUluZm8gPSBbCid0b3RhbF90aW1lJyA9PiB0cnVlLAonbmFtZWxvb2t1cF90aW1lJyA9PiB0cnVlLAonY29ubmVjdF90aW1lJyA9PiB0cnVlLAoncHJldHJhbnNmZXJfdGltZScgPT4gdHJ1ZSwKJ3N0YXJ0dHJhbnNmZXJfdGltZScgPT4gdHJ1ZSwKJ3JlZGlyZWN0X3RpbWUnID0+IHRydWUsCl07CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgYXJyYXkgJG9wdGlvbnMgPSBbXSwgYm9vbCAkZGlzYWJsZVRscyA9IGZhbHNlKQp7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CgokdGhpcy0+bXVsdGlIYW5kbGUgPSAkbWggPSBjdXJsX211bHRpX2luaXQoKTsKaWYgKGZ1bmN0aW9uX2V4aXN0cygnY3VybF9tdWx0aV9zZXRvcHQnKSkgewppZiAoUHJveHlNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpLT5oYXNQcm94eSgpICYmICgkdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpKSAhPT0gZmFsc2UgJiYgaW5fYXJyYXkoJHZlcnNpb25bJ3ZlcnNpb24nXSwgc2VsZjo6QkFEX01VTFRJUExFWElOR19DVVJMX1ZFUlNJT05TLCB0cnVlKSkgewoKCgoKCgoKY3VybF9tdWx0aV9zZXRvcHQoJG1oLCBDVVJMTU9QVF9QSVBFTElOSU5HLCAgMCk7Cn0gZWxzZSB7CmN1cmxfbXVsdGlfc2V0b3B0KCRtaCwgQ1VSTE1PUFRfUElQRUxJTklORywgXFBIUF9WRVJTSU9OX0lEID49IDcwNDAwID8gIDIgOiAgMyk7Cn0KaWYgKGRlZmluZWQoJ0NVUkxNT1BUX01BWF9IT1NUX0NPTk5FQ1RJT05TJykgJiYgIWRlZmluZWQoJ0hIVk1fVkVSU0lPTicpKSB7CmN1cmxfbXVsdGlfc2V0b3B0KCRtaCwgQ1VSTE1PUFRfTUFYX0hPU1RfQ09OTkVDVElPTlMsIDgpOwp9Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc2hhcmVfaW5pdCcpKSB7CiR0aGlzLT5zaGFyZUhhbmRsZSA9ICRzaCA9IGN1cmxfc2hhcmVfaW5pdCgpOwpjdXJsX3NoYXJlX3NldG9wdCgkc2gsIENVUkxTSE9QVF9TSEFSRSwgQ1VSTF9MT0NLX0RBVEFfQ09PS0lFKTsKY3VybF9zaGFyZV9zZXRvcHQoJHNoLCBDVVJMU0hPUFRfU0hBUkUsIENVUkxfTE9DS19EQVRBX0ROUyk7CmN1cmxfc2hhcmVfc2V0b3B0KCRzaCwgQ1VSTFNIT1BUX1NIQVJFLCBDVVJMX0xPQ0tfREFUQV9TU0xfU0VTU0lPTik7Cn0KCiR0aGlzLT5hdXRoSGVscGVyID0gbmV3IEF1dGhIZWxwZXIoJGlvLCAkY29uZmlnKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0LCBzdHJpbmcgJG9yaWdpbiwgc3RyaW5nICR1cmwsIGFycmF5ICRvcHRpb25zLCA/c3RyaW5nICRjb3B5VG8gPSBudWxsKTogaW50CnsKJGF0dHJpYnV0ZXMgPSBbXTsKaWYgKGlzc2V0KCRvcHRpb25zWydyZXRyeS1hdXRoLWZhaWx1cmUnXSkpIHsKJGF0dHJpYnV0ZXNbJ3JldHJ5QXV0aEZhaWx1cmUnXSA9ICRvcHRpb25zWydyZXRyeS1hdXRoLWZhaWx1cmUnXTsKdW5zZXQoJG9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddKTsKfQoKcmV0dXJuICR0aGlzLT5pbml0RG93bmxvYWQoJHJlc29sdmUsICRyZWplY3QsICRvcmlnaW4sICR1cmwsICRvcHRpb25zLCAkY29weVRvLCAkYXR0cmlidXRlcyk7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0RG93bmxvYWQoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QsIHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMsID9zdHJpbmcgJGNvcHlUbyA9IG51bGwsIGFycmF5ICRhdHRyaWJ1dGVzID0gW10pOiBpbnQKewokYXR0cmlidXRlcyA9IGFycmF5X21lcmdlKFsKJ3JldHJ5QXV0aEZhaWx1cmUnID0+IHRydWUsCidyZWRpcmVjdHMnID0+IDAsCidyZXRyaWVzJyA9PiAwLAonc3RvcmVBdXRoJyA9PiBmYWxzZSwKJ2lwUmVzb2x2ZScgPT4gbnVsbCwKXSwgJGF0dHJpYnV0ZXMpOwoKaWYgKCRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9PT0gbnVsbCAmJiBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9JUFJFU09MVkUnKSA9PT0gJzQnKSB7CiRhdHRyaWJ1dGVzWydpcFJlc29sdmUnXSA9IDQ7Cn0gZWxzZWlmICgkYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPT09IG51bGwgJiYgUGxhdGZvcm06OmdldEVudignQ09NUE9TRVJfSVBSRVNPTFZFJykgPT09ICc2JykgewokYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPSA2Owp9Cgokb3JpZ2luYWxPcHRpb25zID0gJG9wdGlvbnM7CgoKaWYgKCFQcmVnOjppc01hdGNoKCd7Xmh0dHA6Ly8ocmVwb1wuKT9wYWNrYWdpc3RcLm9yZy9wL30nLCAkdXJsKSB8fCAoZmFsc2UgPT09IHN0cnBvcygkdXJsLCAnJCcpICYmIGZhbHNlID09PSBzdHJwb3MoJHVybCwgJyUyNCcpKSkgewokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCR1cmwsICR0aGlzLT5pbywgJG9wdGlvbnMpOwp9CgokY3VybEhhbmRsZSA9IGN1cmxfaW5pdCgpOwokaGVhZGVySGFuZGxlID0gZm9wZW4oJ3BocDovL3RlbXAvbWF4bWVtb3J5OjMyNzY4JywgJ3crYicpOwppZiAoZmFsc2UgPT09ICRoZWFkZXJIYW5kbGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gb3BlbiBhIHRlbXAgc3RyZWFtIHRvIHN0b3JlIGN1cmwgaGVhZGVycycpOwp9CgppZiAoJGNvcHlUbyAhPT0gbnVsbCkgewokYm9keVRhcmdldCA9ICRjb3B5VG8uJ34nOwp9IGVsc2UgewokYm9keVRhcmdldCA9ICdwaHA6Ly90ZW1wL21heG1lbW9yeTo1MjQyODgnOwp9CgokZXJyb3JNZXNzYWdlID0gJyc7CnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoaW50ICRjb2RlLCBzdHJpbmcgJG1zZykgdXNlICgmJGVycm9yTWVzc2FnZSk6IGJvb2wgewppZiAoJGVycm9yTWVzc2FnZSkgewokZXJyb3JNZXNzYWdlIC49ICJcbiI7Cn0KJGVycm9yTWVzc2FnZSAuPSBQcmVnOjpyZXBsYWNlKCd7XmZvcGVuXCguKj9cKTogfScsICcnLCAkbXNnKTsKCnJldHVybiB0cnVlOwp9KTsKJGJvZHlIYW5kbGUgPSBmb3BlbigkYm9keVRhcmdldCwgJ3crYicpOwpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKaWYgKGZhbHNlID09PSAkYm9keUhhbmRsZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJHVybC4nIiBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuIHRvICcuKCRjb3B5VG8gPz8gJ2EgdGVtcG9yYXJ5IGZpbGUnKS4nOiAnLiRlcnJvck1lc3NhZ2UpOwp9CgpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9VUkwsICR1cmwpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgZmFsc2UpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCwgMTApOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9USU1FT1VULCBtYXgoKGludCkgaW5pX2dldCgiZGVmYXVsdF9zb2NrZXRfdGltZW91dCIpLCAzMDApKTsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfV1JJVEVIRUFERVIsICRoZWFkZXJIYW5kbGUpOwpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9GSUxFLCAkYm9keUhhbmRsZSk7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0VOQ09ESU5HLCAiIik7IApjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgQ1VSTE9QVF9QUk9UT0NPTFMsIENVUkxQUk9UT19IVFRQIHwgQ1VSTFBST1RPX0hUVFBTKTsKCmlmICgkYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPT09IDQpIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfSVBSRVNPTFZFLCBDVVJMX0lQUkVTT0xWRV9WNCk7Cn0gZWxzZWlmICgkYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPT09IDYpIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfSVBSRVNPTFZFLCBDVVJMX0lQUkVTT0xWRV9WNik7Cn0KCmlmIChmdW5jdGlvbl9leGlzdHMoJ2N1cmxfc2hhcmVfaW5pdCcpKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX1NIQVJFLCAkdGhpcy0+c2hhcmVIYW5kbGUpOwp9CgppZiAoIWlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IFtdOwp9Cgokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9IGFycmF5X2RpZmYoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sIFsnQ29ubmVjdGlvbjogY2xvc2UnXSk7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAnQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSc7CgokdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpOwokZmVhdHVyZXMgPSAkdmVyc2lvblsnZmVhdHVyZXMnXTsKCiRwcm94eSA9IFByb3h5TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKS0+Z2V0UHJveHlGb3JSZXF1ZXN0KCR1cmwpOwoKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAnaHR0cHM6Ly8nKSkgewokd2lsbFVzZVByb3h5ID0gJHByb3h5LT5nZXRTdGF0dXMoKSAhPT0gJycgJiYgISRwcm94eS0+aXNFeGNsdWRlZEJ5Tm9Qcm94eSgpOwoKaWYgKCEkd2lsbFVzZVByb3h5ICYmIFxkZWZpbmVkKCdDVVJMX1ZFUlNJT05fSFRUUDMnKSAmJiBcZGVmaW5lZCgnQ1VSTF9IVFRQX1ZFUlNJT05fMycpICYmIChDVVJMX1ZFUlNJT05fSFRUUDMgJiAkZmVhdHVyZXMpICE9PSAwKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0hUVFBfVkVSU0lPTiwgQ1VSTF9IVFRQX1ZFUlNJT05fMyk7Cn0gZWxzZWlmIChcZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX0hUVFAyJykgJiYgXGRlZmluZWQoJ0NVUkxfSFRUUF9WRVJTSU9OXzJfMCcpICYmIChDVVJMX1ZFUlNJT05fSFRUUDIgJiAkZmVhdHVyZXMpICE9PSAwKSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCBDVVJMT1BUX0hUVFBfVkVSU0lPTiwgQ1VSTF9IVFRQX1ZFUlNJT05fMl8wKTsKfQp9CgoKCmlmIChpc3NldCgkdmVyc2lvblsndmVyc2lvbiddKSAmJiBpbl9hcnJheSgkdmVyc2lvblsndmVyc2lvbiddLCBbJzguNy4wJywgJzguNy4xJ10sIHRydWUpICYmIFxkZWZpbmVkKCdDVVJMX1ZFUlNJT05fTElCWicpICYmIChDVVJMX1ZFUlNJT05fTElCWiAmICRmZWF0dXJlcykgIT09IDApIHsKY3VybF9zZXRvcHQoJGN1cmxIYW5kbGUsIENVUkxPUFRfRU5DT0RJTkcsICJnemlwIik7Cn0KCiRvcHRpb25zID0gJHRoaXMtPmF1dGhIZWxwZXItPmFkZEF1dGhlbnRpY2F0aW9uT3B0aW9ucygkb3B0aW9ucywgJG9yaWdpbiwgJHVybCk7CiRvcHRpb25zID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmluaXRPcHRpb25zKCR1cmwsICRvcHRpb25zLCB0cnVlKTsKCmZvcmVhY2ggKHNlbGY6OiRvcHRpb25zIGFzICR0eXBlID0+ICRjdXJsT3B0aW9ucykgewpmb3JlYWNoICgkY3VybE9wdGlvbnMgYXMgJG5hbWUgPT4gJGN1cmxPcHRpb24pIHsKaWYgKGlzc2V0KCRvcHRpb25zWyR0eXBlXVskbmFtZV0pKSB7CmlmICgkdHlwZSA9PT0gJ3NzbCcgJiYgJG5hbWUgPT09ICd2ZXJpZnlfcGVlcl9uYW1lJykgewpjdXJsX3NldG9wdCgkY3VybEhhbmRsZSwgJGN1cmxPcHRpb24sICRvcHRpb25zWyR0eXBlXVskbmFtZV0gPT09IHRydWUgPyAyIDogJG9wdGlvbnNbJHR5cGVdWyRuYW1lXSk7Cn0gZWxzZSB7CmN1cmxfc2V0b3B0KCRjdXJsSGFuZGxlLCAkY3VybE9wdGlvbiwgJG9wdGlvbnNbJHR5cGVdWyRuYW1lXSk7Cn0KfQp9Cn0KCmN1cmxfc2V0b3B0X2FycmF5KCRjdXJsSGFuZGxlLCAkcHJveHktPmdldEN1cmxPcHRpb25zKCRvcHRpb25zWydzc2wnXSA/PyBbXSkpOwoKJHByb2dyZXNzID0gYXJyYXlfZGlmZl9rZXkoY3VybF9nZXRpbmZvKCRjdXJsSGFuZGxlKSwgc2VsZjo6JHRpbWVJbmZvKTsKCiR0aGlzLT5qb2JzWyhpbnQpICRjdXJsSGFuZGxlXSA9IFsKJ3VybCcgPT4gJHVybCwKJ29yaWdpbicgPT4gJG9yaWdpbiwKJ2F0dHJpYnV0ZXMnID0+ICRhdHRyaWJ1dGVzLAonb3B0aW9ucycgPT4gJG9yaWdpbmFsT3B0aW9ucywKJ3Byb2dyZXNzJyA9PiAkcHJvZ3Jlc3MsCidjdXJsSGFuZGxlJyA9PiAkY3VybEhhbmRsZSwKJ2ZpbGVuYW1lJyA9PiAkY29weVRvLAonaGVhZGVySGFuZGxlJyA9PiAkaGVhZGVySGFuZGxlLAonYm9keUhhbmRsZScgPT4gJGJvZHlIYW5kbGUsCidyZXNvbHZlJyA9PiAkcmVzb2x2ZSwKJ3JlamVjdCcgPT4gJHJlamVjdCwKJ3ByaW1hcnlJcCcgPT4gJycsCl07CgokdXNpbmdQcm94eSA9ICRwcm94eS0+Z2V0U3RhdHVzKCcgdXNpbmcgcHJveHkgKCVzKScpOwokaWZNb2RpZmllZCA9IGZhbHNlICE9PSBzdHJpcG9zKGltcGxvZGUoJywnLCAkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSksICdpZi1tb2RpZmllZC1zaW5jZTonKSA/ICcgaWYgbW9kaWZpZWQnIDogJyc7CmlmICgkYXR0cmlidXRlc1sncmVkaXJlY3RzJ10gPT09IDAgJiYgJGF0dHJpYnV0ZXNbJ3JldHJpZXMnXSA9PT0gMCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0Rvd25sb2FkaW5nICcgLiBVcmw6OnNhbml0aXplKCR1cmwpIC4gJHVzaW5nUHJveHkgLiAkaWZNb2RpZmllZCwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKfQoKJHRoaXMtPmNoZWNrQ3VybFJlc3VsdChjdXJsX211bHRpX2FkZF9oYW5kbGUoJHRoaXMtPm11bHRpSGFuZGxlLCAkY3VybEhhbmRsZSkpOwoKCnJldHVybiAoaW50KSAkY3VybEhhbmRsZTsKfQoKcHVibGljIGZ1bmN0aW9uIGFib3J0UmVxdWVzdChpbnQgJGlkKTogdm9pZAp7CmlmIChpc3NldCgkdGhpcy0+am9ic1skaWRdLCAkdGhpcy0+am9ic1skaWRdWydjdXJsSGFuZGxlJ10pKSB7CiRqb2IgPSAkdGhpcy0+am9ic1skaWRdOwpjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoJHRoaXMtPm11bHRpSGFuZGxlLCAkam9iWydjdXJsSGFuZGxlJ10pOwppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAwMDApIHsKY3VybF9jbG9zZSgkam9iWydjdXJsSGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydoZWFkZXJIYW5kbGUnXSkpIHsKZmNsb3NlKCRqb2JbJ2hlYWRlckhhbmRsZSddKTsKfQppZiAoaXNfcmVzb3VyY2UoJGpvYlsnYm9keUhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnYm9keUhhbmRsZSddKTsKfQppZiAobnVsbCAhPT0gJGpvYlsnZmlsZW5hbWUnXSkgewpAdW5saW5rKCRqb2JbJ2ZpbGVuYW1lJ10uJ34nKTsKfQp1bnNldCgkdGhpcy0+am9ic1skaWRdKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gdGljaygpOiB2b2lkCnsKc3RhdGljICR0aW1lb3V0V2FybmluZyA9IGZhbHNlOwoKaWYgKGNvdW50KCR0aGlzLT5qb2JzKSA9PT0gMCkgewpyZXR1cm47Cn0KCiRhY3RpdmUgPSB0cnVlOwokdGhpcy0+Y2hlY2tDdXJsUmVzdWx0KGN1cmxfbXVsdGlfZXhlYygkdGhpcy0+bXVsdGlIYW5kbGUsICRhY3RpdmUpKTsKaWYgKC0xID09PSBjdXJsX211bHRpX3NlbGVjdCgkdGhpcy0+bXVsdGlIYW5kbGUsICR0aGlzLT5zZWxlY3RUaW1lb3V0KSkgewoKdXNsZWVwKDE1MCk7Cn0KCndoaWxlICgkcHJvZ3Jlc3MgPSBjdXJsX211bHRpX2luZm9fcmVhZCgkdGhpcy0+bXVsdGlIYW5kbGUpKSB7CiRjdXJsSGFuZGxlID0gJHByb2dyZXNzWydoYW5kbGUnXTsKJHJlc3VsdCA9ICRwcm9ncmVzc1sncmVzdWx0J107CiRpID0gKGludCkgJGN1cmxIYW5kbGU7CmlmICghaXNzZXQoJHRoaXMtPmpvYnNbJGldKSkgewpjb250aW51ZTsKfQoKJHByb2dyZXNzID0gY3VybF9nZXRpbmZvKCRjdXJsSGFuZGxlKTsKaWYgKGZhbHNlID09PSAkcHJvZ3Jlc3MpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgZ2V0dGluZyBpbmZvIGZyb20gY3VybCBoYW5kbGUgJy4kaS4nICgnLiR0aGlzLT5qb2JzWyRpXVsndXJsJ10uJyknKTsKfQokam9iID0gJHRoaXMtPmpvYnNbJGldOwp1bnNldCgkdGhpcy0+am9ic1skaV0pOwokZXJyb3IgPSBjdXJsX2Vycm9yKCRjdXJsSGFuZGxlKTsKJGVycm5vID0gY3VybF9lcnJubygkY3VybEhhbmRsZSk7CmN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgkdGhpcy0+bXVsdGlIYW5kbGUsICRjdXJsSGFuZGxlKTsKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmN1cmxfY2xvc2UoJGN1cmxIYW5kbGUpOwp9CgokaGVhZGVycyA9IG51bGw7CiRzdGF0dXNDb2RlID0gbnVsbDsKJHJlc3BvbnNlID0gbnVsbDsKdHJ5IHsKCmlmIChDVVJMRV9PSyAhPT0gJGVycm5vIHx8ICRlcnJvciB8fCAkcmVzdWx0ICE9PSBDVVJMRV9PSykgewokZXJybm8gPSAkZXJybm8gPzogJHJlc3VsdDsKaWYgKCEkZXJyb3IgJiYgZnVuY3Rpb25fZXhpc3RzKCdjdXJsX3N0cmVycm9yJykpIHsKJGVycm9yID0gY3VybF9zdHJlcnJvcigkZXJybm8pOwp9CiRwcm9ncmVzc1snZXJyb3JfY29kZSddID0gJGVycm5vOwoKaWYgKCRlcnJubyA9PT0gMjggICYmIFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCAmJiAkcHJvZ3Jlc3NbJ25hbWVsb29rdXBfdGltZSddID09PSAwLjAgJiYgISR0aW1lb3V0V2FybmluZykgewokdGltZW91dFdhcm5pbmcgPSB0cnVlOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJzx3YXJuaW5nPkEgY29ubmVjdGlvbiB0aW1lb3V0IHdhcyBlbmNvdW50ZXJlZC4gSWYgeW91IGludGVuZCB0byBydW4gQ29tcG9zZXIgd2l0aG91dCBjb25uZWN0aW5nIHRvIHRoZSBpbnRlcm5ldCwgcnVuIHRoZSBjb21tYW5kIGFnYWluIHByZWZpeGVkIHdpdGggQ09NUE9TRVJfRElTQUJMRV9ORVRXT1JLPTEgdG8gbWFrZSBDb21wb3NlciBydW4gaW4gb2ZmbGluZSBtb2RlLjwvd2FybmluZz4nKTsKfQoKaWYgKAooIWlzc2V0KCRqb2JbJ29wdGlvbnMnXVsnaHR0cCddWydtZXRob2QnXSkgfHwgJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddID09PSAnR0VUJykKJiYgKAppbl9hcnJheSgkZXJybm8sIFs3ICwgMTYgLCA5MiAsIDYgLCAyOCBdLCB0cnVlKQp8fCAoaW5fYXJyYXkoJGVycm5vLCBbNTYgLCAzNSBdLCB0cnVlKSAmJiBzdHJfY29udGFpbnMoKHN0cmluZykgJGVycm9yLCAnQ29ubmVjdGlvbiByZXNldCBieSBwZWVyJykpCikgJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gPCAkdGhpcy0+bWF4UmV0cmllcwopIHsKJGF0dHJpYnV0ZXMgPSBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV07CmlmICgkZXJybm8gPT09IDcgJiYgIWlzc2V0KCRqb2JbJ2F0dHJpYnV0ZXMnXVsnaXBSZXNvbHZlJ10pKSB7IAokYXR0cmlidXRlc1snaXBSZXNvbHZlJ10gPSA0Owp9CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gY3VybCBlcnJvciAnLiAkZXJybm8sIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCAkYXR0cmlidXRlcyk7CmNvbnRpbnVlOwp9CgoKaWYgKCRlcnJubyA9PT0gNTUgKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gY3VybCBlcnJvciAnLiAkZXJybm8sIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV0pOwpjb250aW51ZTsKfQoKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignY3VybCBlcnJvciAnLiRlcnJuby4nIHdoaWxlIGRvd25sb2FkaW5nICcuVXJsOjpzYW5pdGl6ZSgkcHJvZ3Jlc3NbJ3VybCddKS4nOiAnLiRlcnJvcik7Cn0KJHN0YXR1c0NvZGUgPSAkcHJvZ3Jlc3NbJ2h0dHBfY29kZSddOwpyZXdpbmQoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwokaGVhZGVycyA9IGV4cGxvZGUoIlxyXG4iLCBydHJpbShzdHJlYW1fZ2V0X2NvbnRlbnRzKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkpOwpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwoKaWYgKCRzdGF0dXNDb2RlID09PSAwKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1JlY2VpdmVkIHVuZXhwZWN0ZWQgaHR0cCBzdGF0dXMgY29kZSAwIHdpdGhvdXQgZXJyb3IgZm9yICcuVXJsOjpzYW5pdGl6ZSgkcHJvZ3Jlc3NbJ3VybCddKS4nOiBoZWFkZXJzICcudmFyX2V4cG9ydCgkaGVhZGVycywgdHJ1ZSkuJyBjdXJsIGluZm8gJy52YXJfZXhwb3J0KCRwcm9ncmVzcywgdHJ1ZSkpOwp9CgoKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKJGNvbnRlbnRzID0gJGpvYlsnZmlsZW5hbWUnXS4nfic7CmlmICgkc3RhdHVzQ29kZSA+PSAzMDApIHsKcmV3aW5kKCRqb2JbJ2JvZHlIYW5kbGUnXSk7CiRjb250ZW50cyA9IHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnYm9keUhhbmRsZSddKTsKfQokcmVzcG9uc2UgPSBuZXcgQ3VybFJlc3BvbnNlKFsndXJsJyA9PiAkam9iWyd1cmwnXV0sICRzdGF0dXNDb2RlLCAkaGVhZGVycywgJGNvbnRlbnRzLCAkcHJvZ3Jlc3MpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ1snLiRzdGF0dXNDb2RlLiddICcuVXJsOjpzYW5pdGl6ZSgkam9iWyd1cmwnXSksIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7Cn0gZWxzZSB7CiRtYXhGaWxlU2l6ZSA9ICRqb2JbJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddID8/IG51bGw7CnJld2luZCgkam9iWydib2R5SGFuZGxlJ10pOwppZiAoJG1heEZpbGVTaXplICE9PSBudWxsKSB7CiRjb250ZW50cyA9IHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnYm9keUhhbmRsZSddLCAkbWF4RmlsZVNpemUpOwoKCmlmICgkY29udGVudHMgIT09IGZhbHNlICYmIFBsYXRmb3JtOjpzdHJsZW4oJGNvbnRlbnRzKSA+PSAkbWF4RmlsZVNpemUpIHsKdGhyb3cgbmV3IE1heEZpbGVTaXplRXhjZWVkZWRFeGNlcHRpb24oJ01heGltdW0gYWxsb3dlZCBkb3dubG9hZCBzaXplIHJlYWNoZWQuIERvd25sb2FkZWQgJyAuIFBsYXRmb3JtOjpzdHJsZW4oJGNvbnRlbnRzKSAuICcgb2YgYWxsb3dlZCAnIC4gJG1heEZpbGVTaXplIC4gJyBieXRlcycpOwp9Cn0gZWxzZSB7CiRjb250ZW50cyA9IHN0cmVhbV9nZXRfY29udGVudHMoJGpvYlsnYm9keUhhbmRsZSddKTsKfQoKJHJlc3BvbnNlID0gbmV3IEN1cmxSZXNwb25zZShbJ3VybCcgPT4gJGpvYlsndXJsJ11dLCAkc3RhdHVzQ29kZSwgJGhlYWRlcnMsICRjb250ZW50cywgJHByb2dyZXNzKTsKJHRoaXMtPmlvLT53cml0ZUVycm9yKCdbJy4kc3RhdHVzQ29kZS4nXSAnLlVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwp9CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwoKaWYgKCRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID49IDMwMCAmJiAkcmVzcG9uc2UtPmdldEhlYWRlcignY29udGVudC10eXBlJykgPT09ICdhcHBsaWNhdGlvbi9qc29uJykgewpIdHRwRG93bmxvYWRlcjo6b3V0cHV0V2FybmluZ3MoJHRoaXMtPmlvLCAkam9iWydvcmlnaW4nXSwganNvbl9kZWNvZGUoJHJlc3BvbnNlLT5nZXRCb2R5KCksIHRydWUpKTsKfQoKJHJlc3VsdCA9ICR0aGlzLT5pc0F1dGhlbnRpY2F0ZWRSZXRyeU5lZWRlZCgkam9iLCAkcmVzcG9uc2UpOwppZiAoJHJlc3VsdFsncmV0cnknXSkgewokdGhpcy0+cmVzdGFydEpvYigkam9iLCAkam9iWyd1cmwnXSwgWydzdG9yZUF1dGgnID0+ICRyZXN1bHRbJ3N0b3JlQXV0aCddLCAncmV0cmllcycgPT4gJGpvYlsnYXR0cmlidXRlcyddWydyZXRyaWVzJ10gKyAxXSk7CmNvbnRpbnVlOwp9CgoKaWYgKCRzdGF0dXNDb2RlID49IDMwMCAmJiAkc3RhdHVzQ29kZSA8PSAzOTkgJiYgJHN0YXR1c0NvZGUgIT09IDMwNCAmJiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JlZGlyZWN0cyddIDwgJHRoaXMtPm1heFJlZGlyZWN0cykgewokbG9jYXRpb24gPSAkdGhpcy0+aGFuZGxlUmVkaXJlY3QoJGpvYiwgJHJlc3BvbnNlKTsKaWYgKCRsb2NhdGlvbikgewokdGhpcy0+cmVzdGFydEpvYigkam9iLCAkbG9jYXRpb24sIFsncmVkaXJlY3RzJyA9PiAkam9iWydhdHRyaWJ1dGVzJ11bJ3JlZGlyZWN0cyddICsgMV0pOwpjb250aW51ZTsKfQp9CgoKaWYgKCRzdGF0dXNDb2RlID49IDQwMCAmJiAkc3RhdHVzQ29kZSA8PSA1OTkpIHsKaWYgKAooIWlzc2V0KCRqb2JbJ29wdGlvbnMnXVsnaHR0cCddWydtZXRob2QnXSkgfHwgJGpvYlsnb3B0aW9ucyddWydodHRwJ11bJ21ldGhvZCddID09PSAnR0VUJykKJiYgaW5fYXJyYXkoJHN0YXR1c0NvZGUsIFs0MjMsIDQyNSwgNTAwLCA1MDIsIDUwMywgNTA0LCA1MDcsIDUxMF0sIHRydWUpCiYmICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddIDwgJHRoaXMtPm1heFJldHJpZXMKKSB7CiR0aGlzLT5pby0+d3JpdGVFcnJvcignUmV0cnlpbmcgKCcuKCRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMSkuJykgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsndXJsJ10pIC4gJyBkdWUgdG8gc3RhdHVzIGNvZGUgJy4gJHN0YXR1c0NvZGUsIHRydWUsIElPSW50ZXJmYWNlOjpERUJVRyk7CiR0aGlzLT5yZXN0YXJ0Sm9iV2l0aERlbGF5KCRqb2IsICRqb2JbJ3VybCddLCBbJ3JldHJpZXMnID0+ICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddICsgMV0pOwpjb250aW51ZTsKfQoKdGhyb3cgJHRoaXMtPmZhaWxSZXNwb25zZSgkam9iLCAkcmVzcG9uc2UsICRyZXNwb25zZS0+Z2V0U3RhdHVzTWVzc2FnZSgpKTsKfQoKaWYgKCRqb2JbJ2F0dHJpYnV0ZXMnXVsnc3RvcmVBdXRoJ10gIT09IGZhbHNlKSB7CiR0aGlzLT5hdXRoSGVscGVyLT5zdG9yZUF1dGgoJGpvYlsnb3JpZ2luJ10sICRqb2JbJ2F0dHJpYnV0ZXMnXVsnc3RvcmVBdXRoJ10pOwp9CgoKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKcmVuYW1lKCRqb2JbJ2ZpbGVuYW1lJ10uJ34nLCAkam9iWydmaWxlbmFtZSddKTsKJGpvYlsncmVzb2x2ZSddKCRyZXNwb25zZSk7Cn0gZWxzZSB7CiRqb2JbJ3Jlc29sdmUnXSgkcmVzcG9uc2UpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CmlmIChudWxsICE9PSAkaGVhZGVycykgewokZS0+c2V0SGVhZGVycygkaGVhZGVycyk7CiRlLT5zZXRTdGF0dXNDb2RlKCRzdGF0dXNDb2RlKTsKfQppZiAobnVsbCAhPT0gJHJlc3BvbnNlKSB7CiRlLT5zZXRSZXNwb25zZSgkcmVzcG9uc2UtPmdldEJvZHkoKSk7Cn0KJGUtPnNldFJlc3BvbnNlSW5mbygkcHJvZ3Jlc3MpOwp9CgokdGhpcy0+cmVqZWN0Sm9iKCRqb2IsICRlKTsKfQp9Cgpmb3JlYWNoICgkdGhpcy0+am9icyBhcyAkaSA9PiAkY3VybEhhbmRsZSkgewokY3VybEhhbmRsZSA9ICR0aGlzLT5qb2JzWyRpXVsnY3VybEhhbmRsZSddOwokcHJvZ3Jlc3MgPSBhcnJheV9kaWZmX2tleShjdXJsX2dldGluZm8oJGN1cmxIYW5kbGUpLCBzZWxmOjokdGltZUluZm8pOwoKaWYgKCR0aGlzLT5qb2JzWyRpXVsncHJvZ3Jlc3MnXSAhPT0gJHByb2dyZXNzKSB7CiR0aGlzLT5qb2JzWyRpXVsncHJvZ3Jlc3MnXSA9ICRwcm9ncmVzczsKCmlmIChpc3NldCgkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddKSkgewoKaWYgKCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydtYXhfZmlsZV9zaXplJ10gPCAkcHJvZ3Jlc3NbJ2Rvd25sb2FkX2NvbnRlbnRfbGVuZ3RoJ10pIHsKJHRoaXMtPnJlamVjdEpvYigkdGhpcy0+am9ic1skaV0sIG5ldyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKCdNYXhpbXVtIGFsbG93ZWQgZG93bmxvYWQgc2l6ZSByZWFjaGVkLiBDb250ZW50LWxlbmd0aCBoZWFkZXIgaW5kaWNhdGVzICcgLiAkcHJvZ3Jlc3NbJ2Rvd25sb2FkX2NvbnRlbnRfbGVuZ3RoJ10gLiAnIGJ5dGVzLiBBbGxvd2VkICcgLiAkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddIC4gJyBieXRlcycpKTsKfQoKCmlmICgkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsnbWF4X2ZpbGVfc2l6ZSddIDwgJHByb2dyZXNzWydzaXplX2Rvd25sb2FkJ10pIHsKJHRoaXMtPnJlamVjdEpvYigkdGhpcy0+am9ic1skaV0sIG5ldyBNYXhGaWxlU2l6ZUV4Y2VlZGVkRXhjZXB0aW9uKCdNYXhpbXVtIGFsbG93ZWQgZG93bmxvYWQgc2l6ZSByZWFjaGVkLiBEb3dubG9hZGVkICcgLiAkcHJvZ3Jlc3NbJ3NpemVfZG93bmxvYWQnXSAuICcgb2YgYWxsb3dlZCAnIC4gJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ21heF9maWxlX3NpemUnXSAuICcgYnl0ZXMnKSk7Cn0KfQoKaWYgKGlzc2V0KCRwcm9ncmVzc1sncHJpbWFyeV9pcCddKSAmJiAkcHJvZ3Jlc3NbJ3ByaW1hcnlfaXAnXSAhPT0gJHRoaXMtPmpvYnNbJGldWydwcmltYXJ5SXAnXSkgewppZiAoCmlzc2V0KCR0aGlzLT5qb2JzWyRpXVsnb3B0aW9ucyddWydwcmV2ZW50X2lwX2FjY2Vzc19jYWxsYWJsZSddKSAmJgppc19jYWxsYWJsZSgkdGhpcy0+am9ic1skaV1bJ29wdGlvbnMnXVsncHJldmVudF9pcF9hY2Nlc3NfY2FsbGFibGUnXSkgJiYKJHRoaXMtPmpvYnNbJGldWydvcHRpb25zJ11bJ3ByZXZlbnRfaXBfYWNjZXNzX2NhbGxhYmxlJ10oJHByb2dyZXNzWydwcmltYXJ5X2lwJ10pCikgewokdGhpcy0+cmVqZWN0Sm9iKCR0aGlzLT5qb2JzWyRpXSwgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihzcHJpbnRmKCdJUCAiJXMiIGlzIGJsb2NrZWQgZm9yICIlcyIuJywgJHByb2dyZXNzWydwcmltYXJ5X2lwJ10sICRwcm9ncmVzc1sndXJsJ10pKSk7Cn0KCiR0aGlzLT5qb2JzWyRpXVsncHJpbWFyeUlwJ10gPSAoc3RyaW5nKSAkcHJvZ3Jlc3NbJ3ByaW1hcnlfaXAnXTsKfQoKCn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGhhbmRsZVJlZGlyZWN0KGFycmF5ICRqb2IsIFJlc3BvbnNlICRyZXNwb25zZSk6IHN0cmluZwp7CmlmICgkbG9jYXRpb25IZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbG9jYXRpb24nKSkgewppZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9TQ0hFTUUpKSB7CgokdGFyZ2V0VXJsID0gJGxvY2F0aW9uSGVhZGVyOwp9IGVsc2VpZiAocGFyc2VfdXJsKCRsb2NhdGlvbkhlYWRlciwgUEhQX1VSTF9IT1NUKSkgewoKJHRhcmdldFVybCA9IHBhcnNlX3VybCgkam9iWyd1cmwnXSwgUEhQX1VSTF9TQ0hFTUUpLic6Jy4kbG9jYXRpb25IZWFkZXI7Cn0gZWxzZWlmICgnLycgPT09ICRsb2NhdGlvbkhlYWRlclswXSkgewoKJHVybEhvc3QgPSBwYXJzZV91cmwoJGpvYlsndXJsJ10sIFBIUF9VUkxfSE9TVCk7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rKD86Ly98QCknLnByZWdfcXVvdGUoJHVybEhvc3QpLicoPzo6XGQrKT8pKD86Wy9cP10uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJGpvYlsndXJsJ10pOwp9IGVsc2UgewoKCiR0YXJnZXRVcmwgPSBQcmVnOjpyZXBsYWNlKCd7XiguKy8pW14vP10qKD86XD8uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJGpvYlsndXJsJ10pOwp9Cn0KCmlmICghZW1wdHkoJHRhcmdldFVybCkpIHsKJHRoaXMtPmlvLT53cml0ZUVycm9yKHNwcmludGYoJ0ZvbGxvd2luZyByZWRpcmVjdCAoJXUpICVzJywgJGpvYlsnYXR0cmlidXRlcyddWydyZWRpcmVjdHMnXSArIDEsIFVybDo6c2FuaXRpemUoJHRhcmdldFVybCkpLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwoKcmV0dXJuICR0YXJnZXRVcmw7Cn0KCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kam9iWyd1cmwnXS4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCBnb3QgcmVkaXJlY3Qgd2l0aG91dCBMb2NhdGlvbiAoJy4kcmVzcG9uc2UtPmdldFN0YXR1c01lc3NhZ2UoKS4nKScpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc0F1dGhlbnRpY2F0ZWRSZXRyeU5lZWRlZChhcnJheSAkam9iLCBSZXNwb25zZSAkcmVzcG9uc2UpOiBhcnJheQp7CmlmIChpbl9hcnJheSgkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSwgWzQwMSwgNDAzXSkgJiYgJGpvYlsnYXR0cmlidXRlcyddWydyZXRyeUF1dGhGYWlsdXJlJ10pIHsKJHJlc3VsdCA9ICR0aGlzLT5hdXRoSGVscGVyLT5wcm9tcHRBdXRoSWZOZWVkZWQoJGpvYlsndXJsJ10sICRqb2JbJ29yaWdpbiddLCAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSwgJHJlc3BvbnNlLT5nZXRTdGF0dXNNZXNzYWdlKCksICRyZXNwb25zZS0+Z2V0SGVhZGVycygpLCAkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJpZXMnXSk7CgppZiAoJHJlc3VsdFsncmV0cnknXSkgewpyZXR1cm4gJHJlc3VsdDsKfQp9CgokbG9jYXRpb25IZWFkZXIgPSAkcmVzcG9uc2UtPmdldEhlYWRlcignbG9jYXRpb24nKTsKJG5lZWRzQXV0aFJldHJ5ID0gZmFsc2U7CgoKaWYgKAokam9iWydvcmlnaW4nXSA9PT0gJ2JpdGJ1Y2tldC5vcmcnCiYmICEkdGhpcy0+YXV0aEhlbHBlci0+aXNQdWJsaWNCaXRCdWNrZXREb3dubG9hZCgkam9iWyd1cmwnXSkKJiYgc3Vic3RyKCRqb2JbJ3VybCddLCAtNCkgPT09ICcuemlwJwomJiAoISRsb2NhdGlvbkhlYWRlciB8fCBzdWJzdHIoJGxvY2F0aW9uSGVhZGVyLCAtNCkgIT09ICcuemlwJykKJiYgUHJlZzo6aXNNYXRjaCgne150ZXh0L2h0bWxcYn1pJywgJHJlc3BvbnNlLT5nZXRIZWFkZXIoJ2NvbnRlbnQtdHlwZScpKQopIHsKJG5lZWRzQXV0aFJldHJ5ID0gJ0JpdGJ1Y2tldCByZXF1aXJlcyBhdXRoZW50aWNhdGlvbiBhbmQgaXQgd2FzIG5vdCBwcm92aWRlZCc7Cn0KCgppZiAoCiRyZXNwb25zZS0+Z2V0U3RhdHVzQ29kZSgpID09PSA0MDQKJiYgaW5fYXJyYXkoJGpvYlsnb3JpZ2luJ10sICR0aGlzLT5jb25maWctPmdldCgnZ2l0bGFiLWRvbWFpbnMnKSwgdHJ1ZSkKJiYgZmFsc2UgIT09IHN0cnBvcygkam9iWyd1cmwnXSwgJ2FyY2hpdmUuemlwJykKKSB7CiRuZWVkc0F1dGhSZXRyeSA9ICdHaXRMYWIgcmVxdWlyZXMgYXV0aGVudGljYXRpb24gYW5kIGl0IHdhcyBub3QgcHJvdmlkZWQnOwp9CgppZiAoJG5lZWRzQXV0aFJldHJ5KSB7CmlmICgkam9iWydhdHRyaWJ1dGVzJ11bJ3JldHJ5QXV0aEZhaWx1cmUnXSkgewokcmVzdWx0ID0gJHRoaXMtPmF1dGhIZWxwZXItPnByb21wdEF1dGhJZk5lZWRlZCgkam9iWyd1cmwnXSwgJGpvYlsnb3JpZ2luJ10sIDQwMSwgbnVsbCwgW10sICRqb2JbJ2F0dHJpYnV0ZXMnXVsncmV0cmllcyddKTsKaWYgKCRyZXN1bHRbJ3JldHJ5J10pIHsKcmV0dXJuICRyZXN1bHQ7Cn0KfQoKdGhyb3cgJHRoaXMtPmZhaWxSZXNwb25zZSgkam9iLCAkcmVzcG9uc2UsICRuZWVkc0F1dGhSZXRyeSk7Cn0KCnJldHVybiBbJ3JldHJ5JyA9PiBmYWxzZSwgJ3N0b3JlQXV0aCcgPT4gZmFsc2VdOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlc3RhcnRKb2IoYXJyYXkgJGpvYiwgc3RyaW5nICR1cmwsIGFycmF5ICRhdHRyaWJ1dGVzID0gW10pOiB2b2lkCnsKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KCiRhdHRyaWJ1dGVzID0gYXJyYXlfbWVyZ2UoJGpvYlsnYXR0cmlidXRlcyddLCAkYXR0cmlidXRlcyk7CiRvcmlnaW4gPSBVcmw6OmdldE9yaWdpbigkdGhpcy0+Y29uZmlnLCAkdXJsKTsKCiR0aGlzLT5pbml0RG93bmxvYWQoJGpvYlsncmVzb2x2ZSddLCAkam9iWydyZWplY3QnXSwgJG9yaWdpbiwgJHVybCwgJGpvYlsnb3B0aW9ucyddLCAkam9iWydmaWxlbmFtZSddLCAkYXR0cmlidXRlcyk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVzdGFydEpvYldpdGhEZWxheShhcnJheSAkam9iLCBzdHJpbmcgJHVybCwgYXJyYXkgJGF0dHJpYnV0ZXMpOiB2b2lkCnsKaWYgKCRhdHRyaWJ1dGVzWydyZXRyaWVzJ10gPj0gMykgewp1c2xlZXAoNTAwMDAwKTsgCn0gZWxzZWlmICgkYXR0cmlidXRlc1sncmV0cmllcyddID49IDIpIHsKdXNsZWVwKDEwMDAwMCk7IAp9IAoKJHRoaXMtPnJlc3RhcnRKb2IoJGpvYiwgJHVybCwgJGF0dHJpYnV0ZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZhaWxSZXNwb25zZShhcnJheSAkam9iLCBSZXNwb25zZSAkcmVzcG9uc2UsIHN0cmluZyAkZXJyb3JNZXNzYWdlKTogVHJhbnNwb3J0RXhjZXB0aW9uCnsKaWYgKG51bGwgIT09ICRqb2JbJ2ZpbGVuYW1lJ10pIHsKQHVubGluaygkam9iWydmaWxlbmFtZSddLid+Jyk7Cn0KCiRkZXRhaWxzID0gJyc7CmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKChzdHJpbmcpICRyZXNwb25zZS0+Z2V0SGVhZGVyKCdjb250ZW50LXR5cGUnKSksIFsnYXBwbGljYXRpb24vanNvbicsICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04J10sIHRydWUpKSB7CiRkZXRhaWxzID0gJzonLlBIUF9FT0wuc3Vic3RyKCRyZXNwb25zZS0+Z2V0Qm9keSgpLCAwLCAyMDApLihzdHJsZW4oJHJlc3BvbnNlLT5nZXRCb2R5KCkpID4gMjAwID8gJy4uLicgOiAnJyk7Cn0KCnJldHVybiBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdUaGUgIicuJGpvYlsndXJsJ10uJyIgZmlsZSBjb3VsZCBub3QgYmUgZG93bmxvYWRlZCAoJy4kZXJyb3JNZXNzYWdlLicpJyAuICRkZXRhaWxzLCAkcmVzcG9uc2UtPmdldFN0YXR1c0NvZGUoKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVqZWN0Sm9iKGFycmF5ICRqb2IsIFxFeGNlcHRpb24gJGUpOiB2b2lkCnsKaWYgKGlzX3Jlc291cmNlKCRqb2JbJ2hlYWRlckhhbmRsZSddKSkgewpmY2xvc2UoJGpvYlsnaGVhZGVySGFuZGxlJ10pOwp9CmlmIChpc19yZXNvdXJjZSgkam9iWydib2R5SGFuZGxlJ10pKSB7CmZjbG9zZSgkam9iWydib2R5SGFuZGxlJ10pOwp9CmlmIChudWxsICE9PSAkam9iWydmaWxlbmFtZSddKSB7CkB1bmxpbmsoJGpvYlsnZmlsZW5hbWUnXS4nficpOwp9CiRqb2JbJ3JlamVjdCddKCRlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0N1cmxSZXN1bHQoaW50ICRjb2RlKTogdm9pZAp7CmlmICgkY29kZSAhPT0gQ1VSTE1fT0sgJiYgJGNvZGUgIT09IENVUkxNX0NBTExfTVVMVElfUEVSRk9STSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oCmlzc2V0KCR0aGlzLT5tdWx0aUVycm9yc1skY29kZV0pCj8gImNVUkwgZXJyb3I6IHskY29kZX0gKHskdGhpcy0+bXVsdGlFcnJvcnNbJGNvZGVdWzBdfSk6IGNVUkwgbWVzc2FnZTogeyR0aGlzLT5tdWx0aUVycm9yc1skY29kZV1bMV19Igo6ICdVbmV4cGVjdGVkIGNVUkwgZXJyb3I6ICcgLiAkY29kZQopOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKCgoKY2xhc3MgQ3VybFJlc3BvbnNlIGV4dGVuZHMgUmVzcG9uc2UKewoKCgoKCnByaXZhdGUgJGN1cmxJbmZvOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRyZXF1ZXN0LCA/aW50ICRjb2RlLCBhcnJheSAkaGVhZGVycywgP3N0cmluZyAkYm9keSwgYXJyYXkgJGN1cmxJbmZvKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHJlcXVlc3QsICRjb2RlLCAkaGVhZGVycywgJGJvZHkpOwokdGhpcy0+Y3VybEluZm8gPSAkY3VybEluZm87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDdXJsSW5mbygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+Y3VybEluZm87Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKCgoKCmNsYXNzIFByb3h5SXRlbQp7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRzYWZlVXJsOwoKcHJpdmF0ZSAkY3VybEF1dGg7Cgpwcml2YXRlICRvcHRpb25zUHJveHk7Cgpwcml2YXRlICRvcHRpb25zQXV0aDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcHJveHlVcmwsIHN0cmluZyAkZW52TmFtZSkKewokc3ludGF4RXJyb3IgPSBzcHJpbnRmKCd1bnN1cHBvcnRlZCBgJXNgIHN5bnRheCcsICRlbnZOYW1lKTsKCmlmIChzdHJwYnJrKCRwcm94eVVybCwgIlxyXG5cdCIpICE9PSBmYWxzZSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJHN5bnRheEVycm9yKTsKfQppZiAoZmFsc2UgPT09ICgkcHJveHkgPSBwYXJzZV91cmwoJHByb3h5VXJsKSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRzeW50YXhFcnJvcik7Cn0KaWYgKCFpc3NldCgkcHJveHlbJ2hvc3QnXSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCd1bmFibGUgdG8gZmluZCBwcm94eSBob3N0IGluICcgLiAkZW52TmFtZSk7Cn0KCiRzY2hlbWUgPSBpc3NldCgkcHJveHlbJ3NjaGVtZSddKSA/IHN0cnRvbG93ZXIoJHByb3h5WydzY2hlbWUnXSkgLiAnOi8vJyA6ICdodHRwOi8vJzsKJHNhZmUgPSAnJzsKCmlmIChpc3NldCgkcHJveHlbJ3VzZXInXSkpIHsKJHNhZmUgPSAnKioqJzsKJHVzZXIgPSAkcHJveHlbJ3VzZXInXTsKJGF1dGggPSByYXd1cmxkZWNvZGUoJHByb3h5Wyd1c2VyJ10pOwoKaWYgKGlzc2V0KCRwcm94eVsncGFzcyddKSkgewokc2FmZSAuPSAnOioqKic7CiR1c2VyIC49ICc6JyAuICRwcm94eVsncGFzcyddOwokYXV0aCAuPSAnOicgLiByYXd1cmxkZWNvZGUoJHByb3h5WydwYXNzJ10pOwp9Cgokc2FmZSAuPSAnQCc7CgppZiAoc3RybGVuKCR1c2VyKSA+IDApIHsKJHRoaXMtPmN1cmxBdXRoID0gJHVzZXI7CiR0aGlzLT5vcHRpb25zQXV0aCA9ICdQcm94eS1BdXRob3JpemF0aW9uOiBCYXNpYyAnIC4gYmFzZTY0X2VuY29kZSgkYXV0aCk7Cn0KfQoKJGhvc3QgPSAkcHJveHlbJ2hvc3QnXTsKJHBvcnQgPSBudWxsOwoKaWYgKGlzc2V0KCRwcm94eVsncG9ydCddKSkgewokcG9ydCA9ICRwcm94eVsncG9ydCddOwp9IGVsc2VpZiAoJHNjaGVtZSA9PT0gJ2h0dHA6Ly8nKSB7CiRwb3J0ID0gODA7Cn0gZWxzZWlmICgkc2NoZW1lID09PSAnaHR0cHM6Ly8nKSB7CiRwb3J0ID0gNDQzOwp9CgoKCmlmICgkcG9ydCA9PT0gbnVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3VuYWJsZSB0byBmaW5kIHByb3h5IHBvcnQgaW4gJyAuICRlbnZOYW1lKTsKfQppZiAoJHBvcnQgPT09IDApIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdwb3J0IDAgaXMgcmVzZXJ2ZWQgaW4gJyAuICRlbnZOYW1lKTsKfQoKJHRoaXMtPnVybCA9IHNwcmludGYoJyVzJXM6JWQnLCAkc2NoZW1lLCAkaG9zdCwgJHBvcnQpOwokdGhpcy0+c2FmZVVybCA9IHNwcmludGYoJyVzJXMlczolZCcsICRzY2hlbWUsICRzYWZlLCAkaG9zdCwgJHBvcnQpOwoKJHNjaGVtZSA9IHN0cl9yZXBsYWNlKFsnaHR0cDovLycsICdodHRwczovLyddLCBbJ3RjcDovLycsICdzc2w6Ly8nXSwgJHNjaGVtZSk7CiR0aGlzLT5vcHRpb25zUHJveHkgPSBzcHJpbnRmKCclcyVzOiVkJywgJHNjaGVtZSwgJGhvc3QsICRwb3J0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdG9SZXF1ZXN0UHJveHkoc3RyaW5nICRzY2hlbWUpOiBSZXF1ZXN0UHJveHkKewokb3B0aW9ucyA9IFsnaHR0cCcgPT4gWydwcm94eScgPT4gJHRoaXMtPm9wdGlvbnNQcm94eV1dOwoKaWYgKCR0aGlzLT5vcHRpb25zQXV0aCAhPT0gbnVsbCkgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSA9ICR0aGlzLT5vcHRpb25zQXV0aDsKfQoKaWYgKCRzY2hlbWUgPT09ICdodHRwJykgewokb3B0aW9uc1snaHR0cCddWydyZXF1ZXN0X2Z1bGx1cmknXSA9IHRydWU7Cn0KCnJldHVybiBuZXcgUmVxdWVzdFByb3h5KCR0aGlzLT51cmwsICR0aGlzLT5jdXJsQXV0aCwgJG9wdGlvbnMsICR0aGlzLT5zYWZlVXJsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxVdGlsXE5vUHJveHlQYXR0ZXJuOwoKCgoKCmNsYXNzIFByb3h5TWFuYWdlcgp7Cgpwcml2YXRlICRlcnJvciA9IG51bGw7Cgpwcml2YXRlICRodHRwUHJveHkgPSBudWxsOwoKcHJpdmF0ZSAkaHR0cHNQcm94eSA9IG51bGw7Cgpwcml2YXRlICRub1Byb3h5SGFuZGxlciA9IG51bGw7CgoKcHJpdmF0ZSBzdGF0aWMgJGluc3RhbmNlID0gbnVsbDsKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CnRyeSB7CiR0aGlzLT5nZXRQcm94eURhdGEoKTsKfSBjYXRjaCAoXFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKJHRoaXMtPmVycm9yID0gJGUtPmdldE1lc3NhZ2UoKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbmNlKCk6IFByb3h5TWFuYWdlcgp7CmlmIChzZWxmOjokaW5zdGFuY2UgPT09IG51bGwpIHsKc2VsZjo6JGluc3RhbmNlID0gbmV3IHNlbGYoKTsKfQoKcmV0dXJuIHNlbGY6OiRpbnN0YW5jZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKc2VsZjo6JGluc3RhbmNlID0gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1Byb3h5KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmh0dHBQcm94eSAhPT0gbnVsbCB8fCAkdGhpcy0+aHR0cHNQcm94eSAhPT0gbnVsbDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJveHlGb3JSZXF1ZXN0KHN0cmluZyAkcmVxdWVzdFVybCk6IFJlcXVlc3RQcm94eQp7CmlmICgkdGhpcy0+ZXJyb3IgIT09IG51bGwpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVW5hYmxlIHRvIHVzZSBhIHByb3h5OiAnLiR0aGlzLT5lcnJvcik7Cn0KCiRzY2hlbWUgPSAoc3RyaW5nKSBwYXJzZV91cmwoJHJlcXVlc3RVcmwsIFBIUF9VUkxfU0NIRU1FKTsKJHByb3h5ID0gJHRoaXMtPmdldFByb3h5Rm9yU2NoZW1lKCRzY2hlbWUpOwoKaWYgKCRwcm94eSA9PT0gbnVsbCkgewpyZXR1cm4gUmVxdWVzdFByb3h5Ojpub25lKCk7Cn0KCmlmICgkdGhpcy0+bm9Qcm94eSgkcmVxdWVzdFVybCkpIHsKcmV0dXJuIFJlcXVlc3RQcm94eTo6bm9Qcm94eSgpOwp9CgpyZXR1cm4gJHByb3h5LT50b1JlcXVlc3RQcm94eSgkc2NoZW1lKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcm94eUZvclNjaGVtZShzdHJpbmcgJHNjaGVtZSk6ID9Qcm94eUl0ZW0KewppZiAoJHNjaGVtZSA9PT0gJ2h0dHAnKSB7CnJldHVybiAkdGhpcy0+aHR0cFByb3h5Owp9CgppZiAoJHNjaGVtZSA9PT0gJ2h0dHBzJykgewpyZXR1cm4gJHRoaXMtPmh0dHBzUHJveHk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3h5RGF0YSgpOiB2b2lkCnsKCmlmIChQSFBfU0FQSSA9PT0gJ2NsaScgfHwgUEhQX1NBUEkgPT09ICdwaHBkYmcnKSB7ClskZW52LCAkbmFtZV0gPSAkdGhpcy0+Z2V0UHJveHlFbnYoJ2h0dHBfcHJveHknKTsKaWYgKCRlbnYgIT09IG51bGwpIHsKJHRoaXMtPmh0dHBQcm94eSA9IG5ldyBQcm94eUl0ZW0oJGVudiwgJG5hbWUpOwp9Cn0KCgppZiAoJHRoaXMtPmh0dHBQcm94eSA9PT0gbnVsbCkgewpbJGVudiwgJG5hbWVdID0gJHRoaXMtPmdldFByb3h5RW52KCdjZ2lfaHR0cF9wcm94eScpOwppZiAoJGVudiAhPT0gbnVsbCkgewokdGhpcy0+aHR0cFByb3h5ID0gbmV3IFByb3h5SXRlbSgkZW52LCAkbmFtZSk7Cn0KfQoKClskZW52LCAkbmFtZV0gPSAkdGhpcy0+Z2V0UHJveHlFbnYoJ2h0dHBzX3Byb3h5Jyk7CmlmICgkZW52ICE9PSBudWxsKSB7CiR0aGlzLT5odHRwc1Byb3h5ID0gbmV3IFByb3h5SXRlbSgkZW52LCAkbmFtZSk7Cn0KCgpbJGVudiwgJG5hbWVdID0gJHRoaXMtPmdldFByb3h5RW52KCdub19wcm94eScpOwppZiAoJGVudiAhPT0gbnVsbCkgewokdGhpcy0+bm9Qcm94eUhhbmRsZXIgPSBuZXcgTm9Qcm94eVBhdHRlcm4oJGVudik7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFByb3h5RW52KHN0cmluZyAkZW52TmFtZSk6IGFycmF5CnsKJG5hbWVzID0gW3N0cnRvbG93ZXIoJGVudk5hbWUpLCBzdHJ0b3VwcGVyKCRlbnZOYW1lKV07Cgpmb3JlYWNoICgkbmFtZXMgYXMgJG5hbWUpIHsKaWYgKGlzX3N0cmluZygkX1NFUlZFUlskbmFtZV0gPz8gbnVsbCkpIHsKaWYgKCRfU0VSVkVSWyRuYW1lXSAhPT0gJycpIHsKcmV0dXJuIFskX1NFUlZFUlskbmFtZV0sICRuYW1lXTsKfQp9Cn0KCnJldHVybiBbbnVsbCwgJyddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vUHJveHkoc3RyaW5nICRyZXF1ZXN0VXJsKTogYm9vbAp7CmlmICgkdGhpcy0+bm9Qcm94eUhhbmRsZXIgPT09IG51bGwpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPm5vUHJveHlIYW5kbGVyLT50ZXN0KCRyZXF1ZXN0VXJsKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsXEh0dHA7Cgp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBSZXF1ZXN0UHJveHkKewoKcHJpdmF0ZSAkY29udGV4dE9wdGlvbnM7Cgpwcml2YXRlICRzdGF0dXM7Cgpwcml2YXRlICR1cmw7Cgpwcml2YXRlICRhdXRoOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJHVybCwgP3N0cmluZyAkYXV0aCwgP2FycmF5ICRjb250ZXh0T3B0aW9ucywgP3N0cmluZyAkc3RhdHVzKQp7CiR0aGlzLT51cmwgPSAkdXJsOwokdGhpcy0+YXV0aCA9ICRhdXRoOwokdGhpcy0+Y29udGV4dE9wdGlvbnMgPSAkY29udGV4dE9wdGlvbnM7CiR0aGlzLT5zdGF0dXMgPSAkc3RhdHVzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vbmUoKTogUmVxdWVzdFByb3h5CnsKcmV0dXJuIG5ldyBzZWxmKG51bGwsIG51bGwsIG51bGwsIG51bGwpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vUHJveHkoKTogUmVxdWVzdFByb3h5CnsKcmV0dXJuIG5ldyBzZWxmKG51bGwsIG51bGwsIG51bGwsICdleGNsdWRlZCBieSBub19wcm94eScpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb250ZXh0T3B0aW9ucygpOiA/YXJyYXkKewpyZXR1cm4gJHRoaXMtPmNvbnRleHRPcHRpb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q3VybE9wdGlvbnMoYXJyYXkgJHNzbE9wdGlvbnMpOiBhcnJheQp7CmlmICgkdGhpcy0+aXNTZWN1cmUoKSAmJiAhJHRoaXMtPnN1cHBvcnRzU2VjdXJlUHJveHkoKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdDYW5ub3QgdXNlIGFuIEhUVFBTIHByb3h5LiBQSFAgPj0gNy4zIGFuZCBjVXJsID49IDcuNTIuMCBhcmUgcmVxdWlyZWQuJyk7Cn0KCgoKJG9wdGlvbnMgPSBbQ1VSTE9QVF9QUk9YWSA9PiAoc3RyaW5nKSAkdGhpcy0+dXJsXTsKCgppZiAoJHRoaXMtPnVybCAhPT0gbnVsbCkgewokb3B0aW9uc1tDVVJMT1BUX05PUFJPWFldID0gJyc7Cn0KCgppZiAoJHRoaXMtPmF1dGggIT09IG51bGwpIHsKJG9wdGlvbnNbQ1VSTE9QVF9QUk9YWUFVVEhdID0gQ1VSTEFVVEhfQkFTSUM7CiRvcHRpb25zW0NVUkxPUFRfUFJPWFlVU0VSUFdEXSA9ICR0aGlzLT5hdXRoOwp9CgppZiAoJHRoaXMtPmlzU2VjdXJlKCkpIHsKaWYgKGlzc2V0KCRzc2xPcHRpb25zWydjYWZpbGUnXSkpIHsKJG9wdGlvbnNbQ1VSTE9QVF9QUk9YWV9DQUlORk9dID0gJHNzbE9wdGlvbnNbJ2NhZmlsZSddOwp9CmlmIChpc3NldCgkc3NsT3B0aW9uc1snY2FwYXRoJ10pKSB7CiRvcHRpb25zW0NVUkxPUFRfUFJPWFlfQ0FQQVRIXSA9ICRzc2xPcHRpb25zWydjYXBhdGgnXTsKfQp9CgpyZXR1cm4gJG9wdGlvbnM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzKD9zdHJpbmcgJGZvcm1hdCA9IG51bGwpOiBzdHJpbmcKewppZiAoJHRoaXMtPnN0YXR1cyA9PT0gbnVsbCkgewpyZXR1cm4gJyc7Cn0KCiRmb3JtYXQgPSAkZm9ybWF0ID8/ICclcyc7CmlmIChzdHJwb3MoJGZvcm1hdCwgJyVzJykgIT09IGZhbHNlKSB7CnJldHVybiBzcHJpbnRmKCRmb3JtYXQsICR0aGlzLT5zdGF0dXMpOwp9Cgp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3RyaW5nIGZvcm1hdCBzcGVjaWZpZXIgaXMgbWlzc2luZycpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0V4Y2x1ZGVkQnlOb1Byb3h5KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPnN0YXR1cyAhPT0gbnVsbCAmJiAkdGhpcy0+dXJsID09PSBudWxsOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNTZWN1cmUoKTogYm9vbAp7CnJldHVybiAwID09PSBzdHJwb3MoKHN0cmluZykgJHRoaXMtPnVybCwgJ2h0dHBzOi8vJyk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdXBwb3J0c1NlY3VyZVByb3h5KCk6IGJvb2wKewppZiAoZmFsc2UgPT09ICgkdmVyc2lvbiA9IGN1cmxfdmVyc2lvbigpKSB8fCAhZGVmaW5lZCgnQ1VSTF9WRVJTSU9OX0hUVFBTX1BST1hZJykpIHsKcmV0dXJuIGZhbHNlOwp9CgokZmVhdHVyZXMgPSAkdmVyc2lvblsnZmVhdHVyZXMnXTsKCnJldHVybiAoYm9vbCkgKCRmZWF0dXJlcyAmIENVUkxfVkVSU0lPTl9IVFRQU19QUk9YWSk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbFxIdHRwOwoKdXNlIENvbXBvc2VyXEpzb25cSnNvbkZpbGU7CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgpjbGFzcyBSZXNwb25zZQp7Cgpwcml2YXRlICRyZXF1ZXN0OwoKcHJpdmF0ZSAkY29kZTsKCnByaXZhdGUgJGhlYWRlcnM7Cgpwcml2YXRlICRib2R5OwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkcmVxdWVzdCwgP2ludCAkY29kZSwgYXJyYXkgJGhlYWRlcnMsID9zdHJpbmcgJGJvZHkpCnsKaWYgKCFpc3NldCgkcmVxdWVzdFsndXJsJ10pKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ3VybCBrZXkgbWlzc2luZyBmcm9tIHJlcXVlc3QgYXJyYXknKTsKfQokdGhpcy0+cmVxdWVzdCA9ICRyZXF1ZXN0OwokdGhpcy0+Y29kZSA9IChpbnQpICRjb2RlOwokdGhpcy0+aGVhZGVycyA9ICRoZWFkZXJzOwokdGhpcy0+Ym9keSA9ICRib2R5Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmNvZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdGF0dXNNZXNzYWdlKCk6ID9zdHJpbmcKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkdGhpcy0+aGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XkhUVFAvXFMrIFxkK31pJywgJGhlYWRlcikpIHsKCgokdmFsdWUgPSAkaGVhZGVyOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXJzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5oZWFkZXJzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGVhZGVyKHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewpyZXR1cm4gc2VsZjo6ZmluZEhlYWRlclZhbHVlKCR0aGlzLT5oZWFkZXJzLCAkbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRCb2R5KCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJvZHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWNvZGVKc29uKCkKewpyZXR1cm4gSnNvbkZpbGU6OnBhcnNlSnNvbigkdGhpcy0+Ym9keSwgJHRoaXMtPnJlcXVlc3RbJ3VybCddKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbGxlY3QoKTogdm9pZAp7CnVuc2V0KCR0aGlzLT5yZXF1ZXN0LCAkdGhpcy0+Y29kZSwgJHRoaXMtPmhlYWRlcnMsICR0aGlzLT5ib2R5KTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZmluZEhlYWRlclZhbHVlKGFycmF5ICRoZWFkZXJzLCBzdHJpbmcgJG5hbWUpOiA/c3RyaW5nCnsKJHZhbHVlID0gbnVsbDsKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewppZiAoUHJlZzo6aXNNYXRjaCgne14nLnByZWdfcXVvdGUoJG5hbWUpLic6XHMqKC4rPylccyokfWknLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CiR2YWx1ZSA9ICRtYXRjaFsxXTsKfQp9CgpyZXR1cm4gJHZhbHVlOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CnVzZSBDb21wb3NlclxEb3dubG9hZGVyXFRyYW5zcG9ydEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxSZXNwb25zZTsKdXNlIENvbXBvc2VyXFV0aWxcSHR0cFxDdXJsRG93bmxvYWRlcjsKdXNlIENvbXBvc2VyXENvbXBvc2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxWZXJzaW9uXFZlcnNpb25QYXJzZXI7CnVzZSBDb21wb3NlclxTZW12ZXJcQ29uc3RyYWludFxDb25zdHJhaW50Owp1c2UgQ29tcG9zZXJcRXhjZXB0aW9uXElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbjsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZTsKdXNlIFJlYWN0XFByb21pc2VcUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKY2xhc3MgSHR0cERvd25sb2FkZXIKewpwcml2YXRlIGNvbnN0IFNUQVRVU19RVUVVRUQgPSAxOwpwcml2YXRlIGNvbnN0IFNUQVRVU19TVEFSVEVEID0gMjsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQ09NUExFVEVEID0gMzsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfRkFJTEVEID0gNDsKcHJpdmF0ZSBjb25zdCBTVEFUVVNfQUJPUlRFRCA9IDU7CgoKcHJpdmF0ZSAkaW87Cgpwcml2YXRlICRjb25maWc7Cgpwcml2YXRlICRqb2JzID0gW107Cgpwcml2YXRlICRvcHRpb25zID0gW107Cgpwcml2YXRlICRydW5uaW5nSm9icyA9IDA7Cgpwcml2YXRlICRtYXhKb2JzID0gMTI7Cgpwcml2YXRlICRjdXJsOwoKcHJpdmF0ZSAkcmZzOwoKcHJpdmF0ZSAkaWRHZW4gPSAwOwoKcHJpdmF0ZSAkZGlzYWJsZWQ7Cgpwcml2YXRlICRhbGxvd0FzeW5jID0gZmFsc2U7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UpCnsKJHRoaXMtPmlvID0gJGlvOwoKJHRoaXMtPmRpc2FibGVkID0gKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX0RJU0FCTEVfTkVUV09SSycpOwoKCgppZiAoJGRpc2FibGVUbHMgPT09IGZhbHNlKSB7CiR0aGlzLT5vcHRpb25zID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldFRsc0RlZmF1bHRzKCRvcHRpb25zLCAkaW8pOwp9CgoKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwokdGhpcy0+Y29uZmlnID0gJGNvbmZpZzsKCmlmIChzZWxmOjppc0N1cmxFbmFibGVkKCkpIHsKJHRoaXMtPmN1cmwgPSBuZXcgQ3VybERvd25sb2FkZXIoJGlvLCAkY29uZmlnLCAkb3B0aW9ucywgJGRpc2FibGVUbHMpOwp9CgokdGhpcy0+cmZzID0gbmV3IFJlbW90ZUZpbGVzeXN0ZW0oJGlvLCAkY29uZmlnLCAkb3B0aW9ucywgJGRpc2FibGVUbHMpOwoKaWYgKGlzX251bWVyaWMoJG1heEpvYnMgPSBQbGF0Zm9ybTo6Z2V0RW52KCdDT01QT1NFUl9NQVhfUEFSQUxMRUxfSFRUUCcpKSkgewokdGhpcy0+bWF4Sm9icyA9IG1heCgxLCBtaW4oNTAsIChpbnQpICRtYXhKb2JzKSk7Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewppZiAoJycgPT09ICR1cmwpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyR1cmwgbXVzdCBub3QgYmUgYW4gZW1wdHkgc3RyaW5nJyk7Cn0KWyRqb2IsICRwcm9taXNlXSA9ICR0aGlzLT5hZGRKb2IoWyd1cmwnID0+ICR1cmwsICdvcHRpb25zJyA9PiAkb3B0aW9ucywgJ2NvcHlUbycgPT4gbnVsbF0sIHRydWUpOwokcHJvbWlzZS0+dGhlbihudWxsLCBzdGF0aWMgZnVuY3Rpb24gKFxUaHJvd2FibGUgJGUpIHsKCn0pOwokdGhpcy0+d2FpdCgkam9iWydpZCddKTsKCiRyZXNwb25zZSA9ICR0aGlzLT5nZXRSZXNwb25zZSgkam9iWydpZCddKTsKCnJldHVybiAkcmVzcG9uc2U7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKHN0cmluZyAkdXJsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbLCAkcHJvbWlzZV0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+IG51bGxdKTsKCnJldHVybiAkcHJvbWlzZTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb3B5KHN0cmluZyAkdXJsLCBzdHJpbmcgJHRvLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgnJyA9PT0gJHVybCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHVybCBtdXN0IG5vdCBiZSBhbiBlbXB0eSBzdHJpbmcnKTsKfQpbJGpvYl0gPSAkdGhpcy0+YWRkSm9iKFsndXJsJyA9PiAkdXJsLCAnb3B0aW9ucycgPT4gJG9wdGlvbnMsICdjb3B5VG8nID0+ICR0b10sIHRydWUpOwokdGhpcy0+d2FpdCgkam9iWydpZCddKTsKCnJldHVybiAkdGhpcy0+Z2V0UmVzcG9uc2UoJGpvYlsnaWQnXSk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvcHkoc3RyaW5nICR1cmwsIHN0cmluZyAkdG8sIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCcnID09PSAkdXJsKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckdXJsIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZycpOwp9ClssICRwcm9taXNlXSA9ICR0aGlzLT5hZGRKb2IoWyd1cmwnID0+ICR1cmwsICdvcHRpb25zJyA9PiAkb3B0aW9ucywgJ2NvcHlUbycgPT4gJHRvXSk7CgpyZXR1cm4gJHByb21pc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbnMoKQp7CnJldHVybiAkdGhpcy0+b3B0aW9uczsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpCnsKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkSm9iKGFycmF5ICRyZXF1ZXN0LCBib29sICRzeW5jID0gZmFsc2UpOiBhcnJheQp7CiRyZXF1ZXN0WydvcHRpb25zJ10gPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkdGhpcy0+b3B0aW9ucywgJHJlcXVlc3RbJ29wdGlvbnMnXSk7CgoKJGpvYiA9IFsKJ2lkJyA9PiAkdGhpcy0+aWRHZW4rKywKJ3N0YXR1cycgPT4gc2VsZjo6U1RBVFVTX1FVRVVFRCwKJ3JlcXVlc3QnID0+ICRyZXF1ZXN0LAonc3luYycgPT4gJHN5bmMsCidvcmlnaW4nID0+IFVybDo6Z2V0T3JpZ2luKCR0aGlzLT5jb25maWcsICRyZXF1ZXN0Wyd1cmwnXSksCl07CgppZiAoISRzeW5jICYmICEkdGhpcy0+YWxsb3dBc3luYykgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdZb3UgbXVzdCB1c2UgdGhlIEh0dHBEb3dubG9hZGVyIGluc3RhbmNlIHdoaWNoIGlzIHBhcnQgb2YgYSBDb21wb3NlclxMb29wIGluc3RhbmNlIHRvIGJlIGFibGUgdG8gcnVuIGFzeW5jIGh0dHAgcmVxdWVzdHMnKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7Xmh0dHBzPzovLyhbXjovXSspOihbXkAvXSspQChbXi9dKyl9aScsICRyZXF1ZXN0Wyd1cmwnXSwgJG1hdGNoKSkgewokdGhpcy0+aW8tPnNldEF1dGhlbnRpY2F0aW9uKCRqb2JbJ29yaWdpbiddLCByYXd1cmxkZWNvZGUoJG1hdGNoWzFdKSwgcmF3dXJsZGVjb2RlKCRtYXRjaFsyXSkpOwp9CgokcmZzID0gJHRoaXMtPnJmczsKCmlmICgkdGhpcy0+Y2FuVXNlQ3VybCgkam9iKSkgewokcmVzb2x2ZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCRyZXNvbHZlLCAkcmVqZWN0KSB1c2UgKCYkam9iKTogdm9pZCB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19RVUVVRUQ7CiRqb2JbJ3Jlc29sdmUnXSA9ICRyZXNvbHZlOwokam9iWydyZWplY3QnXSA9ICRyZWplY3Q7Cn07Cn0gZWxzZSB7CiRyZXNvbHZlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpIHVzZSAoJiRqb2IsICRyZnMpOiB2b2lkIHsKCiR1cmwgPSAkam9iWydyZXF1ZXN0J11bJ3VybCddOwokb3B0aW9ucyA9ICRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddOwoKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX1NUQVJURUQ7CgppZiAoJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSkgewokcmZzLT5jb3B5KCRqb2JbJ29yaWdpbiddLCAkdXJsLCAkam9iWydyZXF1ZXN0J11bJ2NvcHlUbyddLCBmYWxzZSAsICRvcHRpb25zKTsKCiRoZWFkZXJzID0gJHJmcy0+Z2V0TGFzdEhlYWRlcnMoKTsKJHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCRqb2JbJ3JlcXVlc3QnXSwgJHJmcy0+ZmluZFN0YXR1c0NvZGUoJGhlYWRlcnMpLCAkaGVhZGVycywgJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXS4nficpOwoKJHJlc29sdmUoJHJlc3BvbnNlKTsKfSBlbHNlIHsKJGJvZHkgPSAkcmZzLT5nZXRDb250ZW50cygkam9iWydvcmlnaW4nXSwgJHVybCwgZmFsc2UgLCAkb3B0aW9ucyk7CiRoZWFkZXJzID0gJHJmcy0+Z2V0TGFzdEhlYWRlcnMoKTsKJHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCRqb2JbJ3JlcXVlc3QnXSwgJHJmcy0+ZmluZFN0YXR1c0NvZGUoJGhlYWRlcnMpLCAkaGVhZGVycywgJGJvZHkpOwoKJHJlc29sdmUoJHJlc3BvbnNlKTsKfQp9Owp9CgokY3VybCA9ICR0aGlzLT5jdXJsOwoKJGNhbmNlbGVyID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJiRqb2IsICRjdXJsKTogdm9pZCB7CmlmICgkam9iWydzdGF0dXMnXSA9PT0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19RVUVVRUQpIHsKJGpvYlsnc3RhdHVzJ10gPSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX0FCT1JURUQ7Cn0KaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBIdHRwRG93bmxvYWRlcjo6U1RBVFVTX1NUQVJURUQpIHsKcmV0dXJuOwp9CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19BQk9SVEVEOwppZiAoaXNzZXQoJGpvYlsnY3VybF9pZCddKSkgewokY3VybC0+YWJvcnRSZXF1ZXN0KCRqb2JbJ2N1cmxfaWQnXSk7Cn0KdGhyb3cgbmV3IElycmVjb3ZlcmFibGVEb3dubG9hZEV4Y2VwdGlvbignRG93bmxvYWQgb2YgJyAuIFVybDo6c2FuaXRpemUoJGpvYlsncmVxdWVzdCddWyd1cmwnXSkgLiAnIGNhbmNlbGVkJyk7Cn07CgokcHJvbWlzZSA9IG5ldyBQcm9taXNlKCRyZXNvbHZlciwgJGNhbmNlbGVyKTsKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbihmdW5jdGlvbiAoJHJlc3BvbnNlKSB1c2UgKCYkam9iKSB7CiRqb2JbJ3N0YXR1cyddID0gSHR0cERvd25sb2FkZXI6OlNUQVRVU19DT01QTEVURUQ7CiRqb2JbJ3Jlc3BvbnNlJ10gPSAkcmVzcG9uc2U7CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnJldHVybiAkcmVzcG9uc2U7Cn0sIGZ1bmN0aW9uICgkZSkgdXNlICgmJGpvYik6IHZvaWQgewokam9iWydzdGF0dXMnXSA9IEh0dHBEb3dubG9hZGVyOjpTVEFUVVNfRkFJTEVEOwokam9iWydleGNlcHRpb24nXSA9ICRlOwoKJHRoaXMtPm1hcmtKb2JEb25lKCk7Cgp0aHJvdyAkZTsKfSk7CiR0aGlzLT5qb2JzWyRqb2JbJ2lkJ11dID0gJiRqb2I7CgppZiAoJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKJHRoaXMtPnN0YXJ0Sm9iKCRqb2JbJ2lkJ10pOwp9CgpyZXR1cm4gWyRqb2IsICRwcm9taXNlXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzdGFydEpvYihpbnQgJGlkKTogdm9pZAp7CiRqb2IgPSAmJHRoaXMtPmpvYnNbJGlkXTsKaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBzZWxmOjpTVEFUVVNfUVVFVUVEKSB7CnJldHVybjsKfQoKCiRqb2JbJ3N0YXR1cyddID0gc2VsZjo6U1RBVFVTX1NUQVJURUQ7CiR0aGlzLT5ydW5uaW5nSm9icysrOwoKYXNzZXJ0KGlzc2V0KCRqb2JbJ3Jlc29sdmUnXSkpOwphc3NlcnQoaXNzZXQoJGpvYlsncmVqZWN0J10pKTsKCiRyZXNvbHZlID0gJGpvYlsncmVzb2x2ZSddOwokcmVqZWN0ID0gJGpvYlsncmVqZWN0J107CiR1cmwgPSAkam9iWydyZXF1ZXN0J11bJ3VybCddOwokb3B0aW9ucyA9ICRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddOwokb3JpZ2luID0gJGpvYlsnb3JpZ2luJ107CgppZiAoJHRoaXMtPmRpc2FibGVkKSB7CmlmIChpc3NldCgkam9iWydyZXF1ZXN0J11bJ29wdGlvbnMnXVsnaHR0cCddWydoZWFkZXInXSkgJiYgZmFsc2UgIT09IHN0cmlwb3MoaW1wbG9kZSgnJywgJGpvYlsncmVxdWVzdCddWydvcHRpb25zJ11bJ2h0dHAnXVsnaGVhZGVyJ10pLCAnaWYtbW9kaWZpZWQtc2luY2UnKSkgewokcmVzb2x2ZShuZXcgUmVzcG9uc2UoWyd1cmwnID0+ICR1cmxdLCAzMDQsIFtdLCAnJykpOwp9IGVsc2UgewokZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ05ldHdvcmsgZGlzYWJsZWQsIHJlcXVlc3QgY2FuY2VsZWQ6ICcuVXJsOjpzYW5pdGl6ZSgkdXJsKSwgNDk5KTsKJGUtPnNldFN0YXR1c0NvZGUoNDk5KTsKJHJlamVjdCgkZSk7Cn0KCnJldHVybjsKfQoKdHJ5IHsKaWYgKCRqb2JbJ3JlcXVlc3QnXVsnY29weVRvJ10pIHsKJGpvYlsnY3VybF9pZCddID0gJHRoaXMtPmN1cmwtPmRvd25sb2FkKCRyZXNvbHZlLCAkcmVqZWN0LCAkb3JpZ2luLCAkdXJsLCAkb3B0aW9ucywgJGpvYlsncmVxdWVzdCddWydjb3B5VG8nXSk7Cn0gZWxzZSB7CiRqb2JbJ2N1cmxfaWQnXSA9ICR0aGlzLT5jdXJsLT5kb3dubG9hZCgkcmVzb2x2ZSwgJHJlamVjdCwgJG9yaWdpbiwgJHVybCwgJG9wdGlvbnMpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGV4Y2VwdGlvbikgewokcmVqZWN0KCRleGNlcHRpb24pOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gbWFya0pvYkRvbmUoKTogdm9pZAp7CiR0aGlzLT5ydW5uaW5nSm9icy0tOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhaXQoP2ludCAkaW5kZXggPSBudWxsKQp7CmRvIHsKJGpvYkNvdW50ID0gJHRoaXMtPmNvdW50QWN0aXZlSm9icygkaW5kZXgpOwp9IHdoaWxlICgkam9iQ291bnQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlQXN5bmMoKTogdm9pZAp7CiR0aGlzLT5hbGxvd0FzeW5jID0gdHJ1ZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50QWN0aXZlSm9icyg/aW50ICRpbmRleCA9IG51bGwpOiBpbnQKewppZiAoJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKZm9yZWFjaCAoJHRoaXMtPmpvYnMgYXMgJGpvYikgewppZiAoJGpvYlsnc3RhdHVzJ10gPT09IHNlbGY6OlNUQVRVU19RVUVVRUQgJiYgJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKJHRoaXMtPnN0YXJ0Sm9iKCRqb2JbJ2lkJ10pOwp9Cn0KfQoKaWYgKCR0aGlzLT5jdXJsKSB7CiR0aGlzLT5jdXJsLT50aWNrKCk7Cn0KCmlmIChudWxsICE9PSAkaW5kZXgpIHsKcmV0dXJuICR0aGlzLT5qb2JzWyRpbmRleF1bJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCA/IDEgOiAwOwp9CgokYWN0aXZlID0gMDsKZm9yZWFjaCAoJHRoaXMtPmpvYnMgYXMgJGpvYikgewppZiAoJGpvYlsnc3RhdHVzJ10gPCBzZWxmOjpTVEFUVVNfQ09NUExFVEVEKSB7CiRhY3RpdmUrKzsKfSBlbHNlaWYgKCEkam9iWydzeW5jJ10pIHsKdW5zZXQoJHRoaXMtPmpvYnNbJGpvYlsnaWQnXV0pOwp9Cn0KCnJldHVybiAkYWN0aXZlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldFJlc3BvbnNlKGludCAkaW5kZXgpOiBSZXNwb25zZQp7CmlmICghaXNzZXQoJHRoaXMtPmpvYnNbJGluZGV4XSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignSW52YWxpZCByZXF1ZXN0IGlkJyk7Cn0KCmlmICgkdGhpcy0+am9ic1skaW5kZXhdWydzdGF0dXMnXSA9PT0gc2VsZjo6U1RBVFVTX0ZBSUxFRCkgewphc3NlcnQoaXNzZXQoJHRoaXMtPmpvYnNbJGluZGV4XVsnZXhjZXB0aW9uJ10pKTsKdGhyb3cgJHRoaXMtPmpvYnNbJGluZGV4XVsnZXhjZXB0aW9uJ107Cn0KCmlmICghaXNzZXQoJHRoaXMtPmpvYnNbJGluZGV4XVsncmVzcG9uc2UnXSkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignUmVzcG9uc2Ugbm90IGF2YWlsYWJsZSB5ZXQsIGNhbGwgd2FpdCgpIGZpcnN0Jyk7Cn0KCiRyZXNwID0gJHRoaXMtPmpvYnNbJGluZGV4XVsncmVzcG9uc2UnXTsKCnVuc2V0KCR0aGlzLT5qb2JzWyRpbmRleF0pOwoKcmV0dXJuICRyZXNwOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gb3V0cHV0V2FybmluZ3MoSU9JbnRlcmZhY2UgJGlvLCBzdHJpbmcgJHVybCwgJGRhdGEpOiB2b2lkCnsKJGNsZWFuTWVzc2FnZSA9IHN0YXRpYyBmdW5jdGlvbiAoJG1zZykgdXNlICgkaW8pIHsKaWYgKCEkaW8tPmlzRGVjb3JhdGVkKCkpIHsKJG1zZyA9IFByZWc6OnJlcGxhY2UoJ3snLmNocigyNykuJ1xcW1s7XGRdKm19dScsICcnLCAkbXNnKTsKfQoKcmV0dXJuICRtc2c7Cn07CgoKZm9yZWFjaCAoWyd3YXJuaW5nJywgJ2luZm8nXSBhcyAkdHlwZSkgewppZiAoZW1wdHkoJGRhdGFbJHR5cGVdKSkgewpjb250aW51ZTsKfQoKaWYgKCFlbXB0eSgkZGF0YVskdHlwZSAuICctdmVyc2lvbnMnXSkpIHsKJHZlcnNpb25QYXJzZXIgPSBuZXcgVmVyc2lvblBhcnNlcigpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRkYXRhWyR0eXBlIC4gJy12ZXJzaW9ucyddKTsKJGNvbXBvc2VyID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZShDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKSk7CmlmICghJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGNvbXBvc2VyKSkgewpjb250aW51ZTsKfQp9CgokaW8tPndyaXRlRXJyb3IoJzwnLiR0eXBlLic+Jy51Y2ZpcnN0KCR0eXBlKS4nIGZyb20gJy5Vcmw6OnNhbml0aXplKCR1cmwpLic6ICcuJGNsZWFuTWVzc2FnZSgkZGF0YVskdHlwZV0pLic8LycuJHR5cGUuJz4nKTsKfQoKCmZvcmVhY2ggKFsnd2FybmluZ3MnLCAnaW5mb3MnXSBhcyAka2V5KSB7CmlmIChlbXB0eSgkZGF0YVska2V5XSkpIHsKY29udGludWU7Cn0KCiR2ZXJzaW9uUGFyc2VyID0gbmV3IFZlcnNpb25QYXJzZXIoKTsKZm9yZWFjaCAoJGRhdGFbJGtleV0gYXMgJHNwZWMpIHsKJHR5cGUgPSBzdWJzdHIoJGtleSwgMCwgLTEpOwokY29uc3RyYWludCA9ICR2ZXJzaW9uUGFyc2VyLT5wYXJzZUNvbnN0cmFpbnRzKCRzcGVjWyd2ZXJzaW9ucyddKTsKJGNvbXBvc2VyID0gbmV3IENvbnN0cmFpbnQoJz09JywgJHZlcnNpb25QYXJzZXItPm5vcm1hbGl6ZShDb21wb3Nlcjo6Z2V0VmVyc2lvbigpKSk7CmlmICghJGNvbnN0cmFpbnQtPm1hdGNoZXMoJGNvbXBvc2VyKSkgewpjb250aW51ZTsKfQoKJGlvLT53cml0ZUVycm9yKCc8Jy4kdHlwZS4nPicudWNmaXJzdCgkdHlwZSkuJyBmcm9tICcuVXJsOjpzYW5pdGl6ZSgkdXJsKS4nOiAnLiRjbGVhbk1lc3NhZ2UoJHNwZWNbJ21lc3NhZ2UnXSkuJzwvJy4kdHlwZS4nPicpOwp9Cn0KfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEV4Y2VwdGlvbkhpbnRzKFxUaHJvd2FibGUgJGUpOiA/YXJyYXkKewppZiAoISRlIGluc3RhbmNlb2YgVHJhbnNwb3J0RXhjZXB0aW9uKSB7CnJldHVybiBudWxsOwp9CgppZiAoCmZhbHNlICE9PSBzdHJwb3MoJGUtPmdldE1lc3NhZ2UoKSwgJ1Jlc29sdmluZyB0aW1lZCBvdXQnKQp8fCBmYWxzZSAhPT0gc3RycG9zKCRlLT5nZXRNZXNzYWdlKCksICdDb3VsZCBub3QgcmVzb2x2ZSBob3N0JykKKSB7ClNpbGVuY2VyOjpzdXBwcmVzcygpOwokdGVzdENvbm5lY3Rpdml0eSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCdodHRwczovLzguOC44LjgnLCBmYWxzZSwgc3RyZWFtX2NvbnRleHRfY3JlYXRlKFsKJ3NzbCcgPT4gWyd2ZXJpZnlfcGVlcicgPT4gZmFsc2VdLAonaHR0cCcgPT4gWydmb2xsb3dfbG9jYXRpb24nID0+IGZhbHNlLCAnaWdub3JlX2Vycm9ycycgPT4gdHJ1ZV0sCl0pKTsKU2lsZW5jZXI6OnJlc3RvcmUoKTsKaWYgKGZhbHNlICE9PSAkdGVzdENvbm5lY3Rpdml0eSkgewpyZXR1cm4gWwonPGVycm9yPlRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uIHByb2JhYmx5IGluZGljYXRlcyB5b3UgaGF2ZSBtaXNjb25maWd1cmVkIEROUyByZXNvbHZlcihzKTwvZXJyb3I+JywKXTsKfQoKcmV0dXJuIFsKJzxlcnJvcj5UaGUgZm9sbG93aW5nIGV4Y2VwdGlvbiBwcm9iYWJseSBpbmRpY2F0ZXMgeW91IGFyZSBvZmZsaW5lIG9yIGhhdmUgbWlzY29uZmlndXJlZCBETlMgcmVzb2x2ZXIocyk8L2Vycm9yPicsCl07Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhblVzZUN1cmwoYXJyYXkgJGpvYik6IGJvb2wKewppZiAoISR0aGlzLT5jdXJsKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovL31pJywgJGpvYlsncmVxdWVzdCddWyd1cmwnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoIWVtcHR5KCRqb2JbJ3JlcXVlc3QnXVsnb3B0aW9ucyddWydzc2wnXVsnYWxsb3dfc2VsZl9zaWduZWQnXSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0N1cmxFbmFibGVkKCk6IGJvb2wKewpyZXR1cm4gXGV4dGVuc2lvbl9sb2FkZWQoJ2N1cmwnKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdjdXJsX211bHRpX2V4ZWMnKSAmJiBcZnVuY3Rpb25fZXhpc3RzKCdjdXJsX211bHRpX2luaXQnKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXJcWGRlYnVnSGFuZGxlcjsKCgoKCgoKCgpjbGFzcyBJbmlIZWxwZXIKewoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsKCk6IGFycmF5CnsKcmV0dXJuIFhkZWJ1Z0hhbmRsZXI6OmdldEFsbEluaUZpbGVzKCk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpOiBzdHJpbmcKewokcGF0aHMgPSBzZWxmOjpnZXRBbGwoKTsKCmlmIChlbXB0eSgkcGF0aHNbMF0pKSB7CmFycmF5X3NoaWZ0KCRwYXRocyk7Cn0KCiRpbmkgPSBhcnJheV9zaGlmdCgkcGF0aHMpOwoKaWYgKGVtcHR5KCRpbmkpKSB7CnJldHVybiAnQSBwaHAuaW5pIGZpbGUgZG9lcyBub3QgZXhpc3QuIFlvdSB3aWxsIGhhdmUgdG8gY3JlYXRlIG9uZS4nOwp9CgppZiAoIWVtcHR5KCRwYXRocykpIHsKcmV0dXJuICdZb3VyIGNvbW1hbmQtbGluZSBQSFAgaXMgdXNpbmcgbXVsdGlwbGUgaW5pIGZpbGVzLiBSdW4gYHBocCAtLWluaWAgdG8gc2hvdyB0aGVtLic7Cn0KCnJldHVybiAnVGhlIHBocC5pbmkgdXNlZCBieSB5b3VyIGNvbW1hbmQtbGluZSBQSFAgaXM6ICcuJGluaTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2dyZXNzQmFyOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKCgoKY2xhc3MgTG9vcAp7Cgpwcml2YXRlICRodHRwRG93bmxvYWRlcjsKCnByaXZhdGUgJHByb2Nlc3NFeGVjdXRvcjsKCnByaXZhdGUgJGN1cnJlbnRQcm9taXNlcyA9IFtdOwoKcHJpdmF0ZSAkd2FpdEluZGV4ID0gMDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChIdHRwRG93bmxvYWRlciAkaHR0cERvd25sb2FkZXIsID9Qcm9jZXNzRXhlY3V0b3IgJHByb2Nlc3NFeGVjdXRvciA9IG51bGwpCnsKJHRoaXMtPmh0dHBEb3dubG9hZGVyID0gJGh0dHBEb3dubG9hZGVyOwokdGhpcy0+aHR0cERvd25sb2FkZXItPmVuYWJsZUFzeW5jKCk7CgokdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yID0gJHByb2Nlc3NFeGVjdXRvcjsKaWYgKCR0aGlzLT5wcm9jZXNzRXhlY3V0b3IpIHsKJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+ZW5hYmxlQXN5bmMoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SHR0cERvd25sb2FkZXIoKTogSHR0cERvd25sb2FkZXIKewpyZXR1cm4gJHRoaXMtPmh0dHBEb3dubG9hZGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2Vzc0V4ZWN1dG9yKCk6ID9Qcm9jZXNzRXhlY3V0b3IKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3NFeGVjdXRvcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdhaXQoYXJyYXkgJHByb21pc2VzLCA/UHJvZ3Jlc3NCYXIgJHByb2dyZXNzID0gbnVsbCk6IHZvaWQKewokdW5jYXVnaHQgPSBudWxsOwoKXFJlYWN0XFByb21pc2VcYWxsKCRwcm9taXNlcyktPnRoZW4oCnN0YXRpYyBmdW5jdGlvbiAoKTogdm9pZCB7Cn0sCnN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkZSkgdXNlICgmJHVuY2F1Z2h0KTogdm9pZCB7CiR1bmNhdWdodCA9ICRlOwp9Cik7CgoKCiR3YWl0SW5kZXggPSAkdGhpcy0+d2FpdEluZGV4Kys7CiR0aGlzLT5jdXJyZW50UHJvbWlzZXNbJHdhaXRJbmRleF0gPSAkcHJvbWlzZXM7CgppZiAoJHByb2dyZXNzKSB7CiR0b3RhbEpvYnMgPSAwOwokdG90YWxKb2JzICs9ICR0aGlzLT5odHRwRG93bmxvYWRlci0+Y291bnRBY3RpdmVKb2JzKCk7CmlmICgkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yKSB7CiR0b3RhbEpvYnMgKz0gJHRoaXMtPnByb2Nlc3NFeGVjdXRvci0+Y291bnRBY3RpdmVKb2JzKCk7Cn0KJHByb2dyZXNzLT5zdGFydCgkdG90YWxKb2JzKTsKfQoKJGxhc3RVcGRhdGUgPSAwOwp3aGlsZSAodHJ1ZSkgewokYWN0aXZlSm9icyA9IDA7CgokYWN0aXZlSm9icyArPSAkdGhpcy0+aHR0cERvd25sb2FkZXItPmNvdW50QWN0aXZlSm9icygpOwppZiAoJHRoaXMtPnByb2Nlc3NFeGVjdXRvcikgewokYWN0aXZlSm9icyArPSAkdGhpcy0+cHJvY2Vzc0V4ZWN1dG9yLT5jb3VudEFjdGl2ZUpvYnMoKTsKfQoKaWYgKCRwcm9ncmVzcyAmJiBtaWNyb3RpbWUodHJ1ZSkgLSAkbGFzdFVwZGF0ZSA+IDAuMSkgewokbGFzdFVwZGF0ZSA9IG1pY3JvdGltZSh0cnVlKTsKJHByb2dyZXNzLT5zZXRQcm9ncmVzcygkcHJvZ3Jlc3MtPmdldE1heFN0ZXBzKCkgLSAkYWN0aXZlSm9icyk7Cn0KCmlmICghJGFjdGl2ZUpvYnMpIHsKYnJlYWs7Cn0KfQoKCmlmICgkcHJvZ3Jlc3MpIHsKJHByb2dyZXNzLT5maW5pc2goKTsKfQoKdW5zZXQoJHRoaXMtPmN1cnJlbnRQcm9taXNlc1skd2FpdEluZGV4XSk7CmlmIChudWxsICE9PSAkdW5jYXVnaHQpIHsKdGhyb3cgJHVuY2F1Z2h0Owp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBhYm9ydEpvYnMoKTogdm9pZAp7CmZvcmVhY2ggKCR0aGlzLT5jdXJyZW50UHJvbWlzZXMgYXMgJHByb21pc2VHcm91cCkgewpmb3JlYWNoICgkcHJvbWlzZUdyb3VwIGFzICRwcm9taXNlKSB7CgpcUmVhY3RcUHJvbWlzZVxyZXNvbHZlKCRwcm9taXNlKS0+Y2FuY2VsKCk7Cn0KfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgpAdHJpZ2dlcl9lcnJvcignQ29tcG9zZXJcVXRpbFxNZXRhZGF0YU1pbmlmaWVyIGlzIGRlcHJlY2F0ZWQsIHVzZSBDb21wb3NlclxNZXRhZGF0YU1pbmlmaWVyXE1ldGFkYXRhTWluaWZpZXIgZnJvbSBjb21wb3Nlci9tZXRhZGF0YS1taW5pZmllciBpbnN0ZWFkLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCgoKCmNsYXNzIE1ldGFkYXRhTWluaWZpZXIgZXh0ZW5kcyBcQ29tcG9zZXJcTWV0YWRhdGFNaW5pZmllclxNZXRhZGF0YU1pbmlmaWVyCnsKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBzdGRDbGFzczsKCgoKCmNsYXNzIE5vUHJveHlQYXR0ZXJuCnsKCgoKcHJvdGVjdGVkICRob3N0TmFtZXMgPSBbXTsKCgoKCnByb3RlY3RlZCAkcnVsZXMgPSBbXTsKCgoKCnByb3RlY3RlZCAkbm9wcm94eTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHBhdHRlcm4pCnsKJHRoaXMtPmhvc3ROYW1lcyA9IFByZWc6OnNwbGl0KCd7W1xzLF0rfScsICRwYXR0ZXJuLCAtMSwgUFJFR19TUExJVF9OT19FTVBUWSk7CiR0aGlzLT5ub3Byb3h5ID0gZW1wdHkoJHRoaXMtPmhvc3ROYW1lcykgfHwgJyonID09PSAkdGhpcy0+aG9zdE5hbWVzWzBdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGVzdChzdHJpbmcgJHVybCk6IGJvb2wKewppZiAoJHRoaXMtPm5vcHJveHkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICghJHVybERhdGEgPSAkdGhpcy0+Z2V0VXJsRGF0YSgkdXJsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmZvcmVhY2ggKCR0aGlzLT5ob3N0TmFtZXMgYXMgJGluZGV4ID0+ICRob3N0TmFtZSkgewppZiAoJHRoaXMtPm1hdGNoKCRpbmRleCwgJGhvc3ROYW1lLCAkdXJsRGF0YSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRVcmxEYXRhKHN0cmluZyAkdXJsKQp7CmlmICghJGhvc3QgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRwb3J0ID0gcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfUE9SVCk7CgppZiAoZW1wdHkoJHBvcnQpKSB7CnN3aXRjaCAocGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfU0NIRU1FKSkgewpjYXNlICdodHRwJzoKJHBvcnQgPSA4MDsKYnJlYWs7CmNhc2UgJ2h0dHBzJzoKJHBvcnQgPSA0NDM7CmJyZWFrOwp9Cn0KCiRob3N0TmFtZSA9ICRob3N0IC4gKCRwb3J0ID8gJzonIC4gJHBvcnQgOiAnJyk7ClskaG9zdCwgJHBvcnQsICRlcnJdID0gJHRoaXMtPnNwbGl0SG9zdFBvcnQoJGhvc3ROYW1lKTsKCmlmICgkZXJyIHx8ICEkdGhpcy0+aXBDaGVja0RhdGEoJGhvc3QsICRpcGRhdGEpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICR0aGlzLT5tYWtlRGF0YSgkaG9zdCwgJHBvcnQsICRpcGRhdGEpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbWF0Y2goaW50ICRpbmRleCwgc3RyaW5nICRob3N0TmFtZSwgc3RkQ2xhc3MgJHVybCk6IGJvb2wKewppZiAoISRydWxlID0gJHRoaXMtPmdldFJ1bGUoJGluZGV4LCAkaG9zdE5hbWUpKSB7CgpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkcnVsZS0+aXBkYXRhKSB7CgppZiAoISR1cmwtPmlwZGF0YSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkcnVsZS0+aXBkYXRhLT5uZXRtYXNrKSB7CnJldHVybiAkdGhpcy0+bWF0Y2hSYW5nZSgkcnVsZS0+aXBkYXRhLCAkdXJsLT5pcGRhdGEpOwp9CgokbWF0Y2ggPSAkcnVsZS0+aXBkYXRhLT5pcCA9PT0gJHVybC0+aXBkYXRhLT5pcDsKfSBlbHNlIHsKCiRoYXlzdGFjayA9IHN1YnN0cigkdXJsLT5uYW1lLCAtc3RybGVuKCRydWxlLT5uYW1lKSk7CiRtYXRjaCA9IHN0cmlwb3MoJGhheXN0YWNrLCAkcnVsZS0+bmFtZSkgPT09IDA7Cn0KCmlmICgkbWF0Y2ggJiYgJHJ1bGUtPnBvcnQpIHsKJG1hdGNoID0gJHJ1bGUtPnBvcnQgPT09ICR1cmwtPnBvcnQ7Cn0KCnJldHVybiAkbWF0Y2g7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaFJhbmdlKHN0ZENsYXNzICRuZXR3b3JrLCBzdGRDbGFzcyAkdGFyZ2V0KTogYm9vbAp7CiRuZXQgPSB1bnBhY2soJ0MqJywgJG5ldHdvcmstPmlwKTsKJG1hc2sgPSB1bnBhY2soJ0MqJywgJG5ldHdvcmstPm5ldG1hc2spOwokaXAgPSB1bnBhY2soJ0MqJywgJHRhcmdldC0+aXApOwppZiAoZmFsc2UgPT09ICRuZXQpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgbmV0d29yayBJUCAnLiRuZXR3b3JrLT5pcCk7Cn0KaWYgKGZhbHNlID09PSAkbWFzaykgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSBuZXRtYXNrICcuJG5ldHdvcmstPm5ldG1hc2spOwp9CmlmIChmYWxzZSA9PT0gJGlwKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHBhcnNlIHRhcmdldCBJUCAnLiR0YXJnZXQtPmlwKTsKfQoKZm9yICgkaSA9IDE7ICRpIDwgMTc7ICsrJGkpIHsKaWYgKCgkbmV0WyRpXSAmICRtYXNrWyRpXSkgIT09ICgkaXBbJGldICYgJG1hc2tbJGldKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRSdWxlKGludCAkaW5kZXgsIHN0cmluZyAkaG9zdE5hbWUpOiA/c3RkQ2xhc3MKewppZiAoYXJyYXlfa2V5X2V4aXN0cygkaW5kZXgsICR0aGlzLT5ydWxlcykpIHsKcmV0dXJuICR0aGlzLT5ydWxlc1skaW5kZXhdOwp9CgokdGhpcy0+cnVsZXNbJGluZGV4XSA9IG51bGw7ClskaG9zdCwgJHBvcnQsICRlcnJdID0gJHRoaXMtPnNwbGl0SG9zdFBvcnQoJGhvc3ROYW1lKTsKCmlmICgkZXJyIHx8ICEkdGhpcy0+aXBDaGVja0RhdGEoJGhvc3QsICRpcGRhdGEsIHRydWUpKSB7CnJldHVybiBudWxsOwp9CgokdGhpcy0+cnVsZXNbJGluZGV4XSA9ICR0aGlzLT5tYWtlRGF0YSgkaG9zdCwgJHBvcnQsICRpcGRhdGEpOwoKcmV0dXJuICR0aGlzLT5ydWxlc1skaW5kZXhdOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBDaGVja0RhdGEoc3RyaW5nICRob3N0LCA/c3RkQ2xhc3MgJiRpcGRhdGEsIGJvb2wgJGFsbG93UHJlZml4ID0gZmFsc2UpOiBib29sCnsKJGlwZGF0YSA9IG51bGw7CiRuZXRtYXNrID0gbnVsbDsKJHByZWZpeCA9IG51bGw7CiRtb2RpZmllZCA9IGZhbHNlOwoKCmlmIChzdHJwb3MoJGhvc3QsICcvJykgIT09IGZhbHNlKSB7ClskaG9zdCwgJHByZWZpeF0gPSBleHBsb2RlKCcvJywgJGhvc3QpOwoKaWYgKCEkYWxsb3dQcmVmaXggfHwgISR0aGlzLT52YWxpZGF0ZUludCgkcHJlZml4LCAwLCAxMjgpKSB7CnJldHVybiBmYWxzZTsKfQokcHJlZml4ID0gKGludCkgJHByZWZpeDsKJG1vZGlmaWVkID0gdHJ1ZTsKfQoKCmlmICghZmlsdGVyX3ZhcigkaG9zdCwgRklMVEVSX1ZBTElEQVRFX0lQKSkgewpyZXR1cm4gISRtb2RpZmllZDsKfQoKWyRpcCwgJHNpemVdID0gJHRoaXMtPmlwR2V0QWRkcigkaG9zdCk7CgppZiAoJHByZWZpeCAhPT0gbnVsbCkgewoKaWYgKCRwcmVmaXggPiAkc2l6ZSAqIDgpIHsKcmV0dXJuIGZhbHNlOwp9CgpbJGlwLCAkbmV0bWFza10gPSAkdGhpcy0+aXBHZXROZXR3b3JrKCRpcCwgJHNpemUsICRwcmVmaXgpOwp9CgokaXBkYXRhID0gJHRoaXMtPm1ha2VJcERhdGEoJGlwLCAkc2l6ZSwgJG5ldG1hc2spOwoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpcEdldEFkZHIoc3RyaW5nICRob3N0KTogYXJyYXkKewokaXAgPSBpbmV0X3B0b24oJGhvc3QpOwokc2l6ZSA9IHN0cmxlbigkaXApOwokbWFwcGVkID0gJHRoaXMtPmlwTWFwVG82KCRpcCwgJHNpemUpOwoKcmV0dXJuIFskbWFwcGVkLCAkc2l6ZV07Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBHZXRNYXNrKGludCAkcHJlZml4LCBpbnQgJHNpemUpOiBzdHJpbmcKewokbWFzayA9ICcnOwoKaWYgKCRvbmVzID0gZmxvb3IoJHByZWZpeCAvIDgpKSB7CiRtYXNrID0gc3RyX3JlcGVhdChjaHIoMjU1KSwgKGludCkgJG9uZXMpOwp9CgppZiAoJHJlbWFpbmRlciA9ICRwcmVmaXggJSA4KSB7CiRtYXNrIC49IGNocigweGZmIF4gKDB4ZmYgPj4gJHJlbWFpbmRlcikpOwp9CgokbWFzayA9IHN0cl9wYWQoJG1hc2ssICRzaXplLCBjaHIoMCkpOwoKcmV0dXJuICR0aGlzLT5pcE1hcFRvNigkbWFzaywgJHNpemUpOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGlwR2V0TmV0d29yayhzdHJpbmcgJHJhbmdlSXAsIGludCAkc2l6ZSwgaW50ICRwcmVmaXgpOiBhcnJheQp7CiRuZXRtYXNrID0gJHRoaXMtPmlwR2V0TWFzaygkcHJlZml4LCAkc2l6ZSk7CgoKJG1hc2sgPSB1bnBhY2soJ0MqJywgJG5ldG1hc2spOwokaXAgPSB1bnBhY2soJ0MqJywgJHJhbmdlSXApOwokbmV0ID0gJyc7CmlmIChmYWxzZSA9PT0gJG1hc2spIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgcGFyc2UgbmV0bWFzayAnLiRuZXRtYXNrKTsKfQppZiAoZmFsc2UgPT09ICRpcCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBwYXJzZSByYW5nZSBJUCAnLiRyYW5nZUlwKTsKfQoKZm9yICgkaSA9IDE7ICRpIDwgMTc7ICsrJGkpIHsKJG5ldCAuPSBjaHIoJGlwWyRpXSAmICRtYXNrWyRpXSk7Cn0KCnJldHVybiBbJG5ldCwgJG5ldG1hc2tdOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXBNYXBUbzYoc3RyaW5nICRiaW5hcnksIGludCAkc2l6ZSk6IHN0cmluZwp7CmlmICgkc2l6ZSA9PT0gNCkgewokcHJlZml4ID0gc3RyX3JlcGVhdChjaHIoMCksIDEwKSAuIHN0cl9yZXBlYXQoY2hyKDI1NSksIDIpOwokYmluYXJ5ID0gJHByZWZpeCAuICRiaW5hcnk7Cn0KCnJldHVybiAkYmluYXJ5Owp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1ha2VEYXRhKHN0cmluZyAkaG9zdCwgaW50ICRwb3J0LCA/c3RkQ2xhc3MgJGlwZGF0YSk6IHN0ZENsYXNzCnsKcmV0dXJuIChvYmplY3QpIFsKJ2hvc3QnID0+ICRob3N0LAonbmFtZScgPT4gJy4nIC4gbHRyaW0oJGhvc3QsICcuJyksCidwb3J0JyA9PiAkcG9ydCwKJ2lwZGF0YScgPT4gJGlwZGF0YSwKXTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFrZUlwRGF0YShzdHJpbmcgJGlwLCBpbnQgJHNpemUsID9zdHJpbmcgJG5ldG1hc2spOiBzdGRDbGFzcwp7CnJldHVybiAob2JqZWN0KSBbCidpcCcgPT4gJGlwLAonc2l6ZScgPT4gJHNpemUsCiduZXRtYXNrJyA9PiAkbmV0bWFzaywKXTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNwbGl0SG9zdFBvcnQoc3RyaW5nICRob3N0TmFtZSk6IGFycmF5CnsKCiRlcnJvciA9IFsnJywgJycsIHRydWVdOwokcG9ydCA9IDA7CiRpcDYgPSAnJzsKCgppZiAoJGhvc3ROYW1lWzBdID09PSAnWycpIHsKJGluZGV4ID0gc3RycG9zKCRob3N0TmFtZSwgJ10nKTsKCgppZiAoZmFsc2UgPT09ICRpbmRleCB8fCAkaW5kZXggPCAzKSB7CnJldHVybiAkZXJyb3I7Cn0KCiRpcDYgPSBzdWJzdHIoJGhvc3ROYW1lLCAxLCAkaW5kZXggLSAxKTsKJGhvc3ROYW1lID0gc3Vic3RyKCRob3N0TmFtZSwgJGluZGV4ICsgMSk7CgppZiAoc3RycGJyaygkaG9zdE5hbWUsICdbXScpICE9PSBmYWxzZSB8fCBzdWJzdHJfY291bnQoJGhvc3ROYW1lLCAnOicpID4gMSkgewpyZXR1cm4gJGVycm9yOwp9Cn0KCmlmIChzdWJzdHJfY291bnQoJGhvc3ROYW1lLCAnOicpID09PSAxKSB7CiRpbmRleCA9IHN0cnBvcygkaG9zdE5hbWUsICc6Jyk7CiRwb3J0ID0gc3Vic3RyKCRob3N0TmFtZSwgJGluZGV4ICsgMSk7CiRob3N0TmFtZSA9IHN1YnN0cigkaG9zdE5hbWUsIDAsICRpbmRleCk7CgppZiAoISR0aGlzLT52YWxpZGF0ZUludCgkcG9ydCwgMSwgNjU1MzUpKSB7CnJldHVybiAkZXJyb3I7Cn0KCiRwb3J0ID0gKGludCkgJHBvcnQ7Cn0KCiRob3N0ID0gJGlwNiAuICRob3N0TmFtZTsKCnJldHVybiBbJGhvc3QsICRwb3J0LCBmYWxzZV07Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVJbnQoc3RyaW5nICRpbnQsIGludCAkbWluLCBpbnQgJG1heCk6IGJvb2wKewokb3B0aW9ucyA9IFsKJ29wdGlvbnMnID0+IFsKJ21pbl9yYW5nZScgPT4gJG1pbiwKJ21heF9yYW5nZScgPT4gJG1heCwKXSwKXTsKCnJldHVybiBmYWxzZSAhPT0gZmlsdGVyX3ZhcigkaW50LCBGSUxURVJfVkFMSURBVEVfSU5ULCAkb3B0aW9ucyk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxQYWNrYWdlXENvbXBsZXRlUGFja2FnZUludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBhY2thZ2VcUGFja2FnZUludGVyZmFjZTsKCmNsYXNzIFBhY2thZ2VJbmZvCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWaWV3U291cmNlVXJsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgQ29tcGxldGVQYWNrYWdlSW50ZXJmYWNlICYmIGlzc2V0KCRwYWNrYWdlLT5nZXRTdXBwb3J0KClbJ3NvdXJjZSddKSAmJiAnJyAhPT0gJHBhY2thZ2UtPmdldFN1cHBvcnQoKVsnc291cmNlJ10pIHsKcmV0dXJuICRwYWNrYWdlLT5nZXRTdXBwb3J0KClbJ3NvdXJjZSddOwp9CgpyZXR1cm4gJHBhY2thZ2UtPmdldFNvdXJjZVVybCgpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZpZXdTb3VyY2VPckhvbWVwYWdlVXJsKFBhY2thZ2VJbnRlcmZhY2UgJHBhY2thZ2UpOiA/c3RyaW5nCnsKJHVybCA9IHNlbGY6OmdldFZpZXdTb3VyY2VVcmwoJHBhY2thZ2UpID8/ICgkcGFja2FnZSBpbnN0YW5jZW9mIENvbXBsZXRlUGFja2FnZUludGVyZmFjZSA/ICRwYWNrYWdlLT5nZXRIb21lcGFnZSgpIDogbnVsbCk7CgppZiAoJHVybCA9PT0gJycpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkdXJsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxSb290UGFja2FnZUludGVyZmFjZTsKCmNsYXNzIFBhY2thZ2VTb3J0ZXIKewoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldE1vc3RDdXJyZW50VmVyc2lvbihhcnJheSAkcGFja2FnZXMpOiA/UGFja2FnZUludGVyZmFjZQp7CmlmIChjb3VudCgkcGFja2FnZXMpID09PSAwKSB7CnJldHVybiBudWxsOwp9CgokaGlnaGVzdCA9IHJlc2V0KCRwYWNrYWdlcyk7CmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkY2FuZGlkYXRlKSB7CmlmICgkY2FuZGlkYXRlLT5pc0RlZmF1bHRCcmFuY2goKSkgewpyZXR1cm4gJGNhbmRpZGF0ZTsKfQoKaWYgKHZlcnNpb25fY29tcGFyZSgkaGlnaGVzdC0+Z2V0VmVyc2lvbigpLCAkY2FuZGlkYXRlLT5nZXRWZXJzaW9uKCksICc8JykpIHsKJGhpZ2hlc3QgPSAkY2FuZGlkYXRlOwp9Cn0KCnJldHVybiAkaGlnaGVzdDsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc29ydFBhY2thZ2VzQWxwaGFiZXRpY2FsbHkoYXJyYXkgJHBhY2thZ2VzKTogYXJyYXkKewp1c29ydCgkcGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoUGFja2FnZUludGVyZmFjZSAkYSwgUGFja2FnZUludGVyZmFjZSAkYikgewpyZXR1cm4gJGEtPmdldE5hbWUoKSA8PT4gJGItPmdldE5hbWUoKTsKfSk7CgpyZXR1cm4gJHBhY2thZ2VzOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNvcnRQYWNrYWdlcyhhcnJheSAkcGFja2FnZXMsIGFycmF5ICR3ZWlnaHRzID0gW10pOiBhcnJheQp7CiR1c2FnZUxpc3QgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkcGFja2FnZSkgewokbGlua3MgPSAkcGFja2FnZS0+Z2V0UmVxdWlyZXMoKTsKaWYgKCRwYWNrYWdlIGluc3RhbmNlb2YgUm9vdFBhY2thZ2VJbnRlcmZhY2UpIHsKJGxpbmtzID0gYXJyYXlfbWVyZ2UoJGxpbmtzLCAkcGFja2FnZS0+Z2V0RGV2UmVxdWlyZXMoKSk7Cn0KZm9yZWFjaCAoJGxpbmtzIGFzICRsaW5rKSB7CiR0YXJnZXQgPSAkbGluay0+Z2V0VGFyZ2V0KCk7CiR1c2FnZUxpc3RbJHRhcmdldF1bXSA9ICRwYWNrYWdlLT5nZXROYW1lKCk7Cn0KfQokY29tcHV0aW5nID0gW107CiRjb21wdXRlZCA9IFtdOwokY29tcHV0ZUltcG9ydGFuY2UgPSBzdGF0aWMgZnVuY3Rpb24gKCRuYW1lKSB1c2UgKCYkY29tcHV0ZUltcG9ydGFuY2UsICYkY29tcHV0aW5nLCAmJGNvbXB1dGVkLCAkdXNhZ2VMaXN0LCAkd2VpZ2h0cykgewoKaWYgKGlzc2V0KCRjb21wdXRlZFskbmFtZV0pKSB7CnJldHVybiAkY29tcHV0ZWRbJG5hbWVdOwp9CgoKaWYgKGlzc2V0KCRjb21wdXRpbmdbJG5hbWVdKSkgewpyZXR1cm4gMDsKfQoKJGNvbXB1dGluZ1skbmFtZV0gPSB0cnVlOwokd2VpZ2h0ID0gJHdlaWdodHNbJG5hbWVdID8/IDA7CgppZiAoaXNzZXQoJHVzYWdlTGlzdFskbmFtZV0pKSB7CmZvcmVhY2ggKCR1c2FnZUxpc3RbJG5hbWVdIGFzICR1c2VyKSB7CiR3ZWlnaHQgLT0gMSAtICRjb21wdXRlSW1wb3J0YW5jZSgkdXNlcik7Cn0KfQoKdW5zZXQoJGNvbXB1dGluZ1skbmFtZV0pOwokY29tcHV0ZWRbJG5hbWVdID0gJHdlaWdodDsKCnJldHVybiAkd2VpZ2h0Owp9OwoKJHdlaWdodGVkUGFja2FnZXMgPSBbXTsKCmZvcmVhY2ggKCRwYWNrYWdlcyBhcyAkaW5kZXggPT4gJHBhY2thZ2UpIHsKJG5hbWUgPSAkcGFja2FnZS0+Z2V0TmFtZSgpOwokd2VpZ2h0ID0gJGNvbXB1dGVJbXBvcnRhbmNlKCRuYW1lKTsKJHdlaWdodGVkUGFja2FnZXNbXSA9IFsnbmFtZScgPT4gJG5hbWUsICd3ZWlnaHQnID0+ICR3ZWlnaHQsICdpbmRleCcgPT4gJGluZGV4XTsKfQoKdXNvcnQoJHdlaWdodGVkUGFja2FnZXMsIHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJGEsIGFycmF5ICRiKTogaW50IHsKaWYgKCRhWyd3ZWlnaHQnXSAhPT0gJGJbJ3dlaWdodCddKSB7CnJldHVybiAkYVsnd2VpZ2h0J10gLSAkYlsnd2VpZ2h0J107Cn0KCnJldHVybiBzdHJuYXRjYXNlY21wKCRhWyduYW1lJ10sICRiWyduYW1lJ10pOwp9KTsKCiRzb3J0ZWRQYWNrYWdlcyA9IFtdOwoKZm9yZWFjaCAoJHdlaWdodGVkUGFja2FnZXMgYXMgJHBrZykgewokc29ydGVkUGFja2FnZXNbXSA9ICRwYWNrYWdlc1skcGtnWydpbmRleCddXTsKfQoKcmV0dXJuICRzb3J0ZWRQYWNrYWdlczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpjbGFzcyBQZXJmb3JjZQp7Cgpwcm90ZWN0ZWQgJHBhdGg7Cgpwcm90ZWN0ZWQgJHA0RGVwb3Q7Cgpwcm90ZWN0ZWQgJHA0Q2xpZW50OwoKcHJvdGVjdGVkICRwNFVzZXI7Cgpwcm90ZWN0ZWQgJHA0UGFzc3dvcmQ7Cgpwcm90ZWN0ZWQgJHA0UG9ydDsKCnByb3RlY3RlZCAkcDRTdHJlYW07Cgpwcm90ZWN0ZWQgJHA0Q2xpZW50U3BlYzsKCnByb3RlY3RlZCAkcDREZXBvdFR5cGU7Cgpwcm90ZWN0ZWQgJHA0QnJhbmNoOwoKcHJvdGVjdGVkICRwcm9jZXNzOwoKcHJvdGVjdGVkICR1bmlxdWVQZXJmb3JjZUNsaWVudE5hbWU7Cgpwcm90ZWN0ZWQgJHdpbmRvd3NGbGFnOwoKcHJvdGVjdGVkICRjb21tYW5kUmVzdWx0OwoKCnByb3RlY3RlZCAkaW87CgoKcHJvdGVjdGVkICRmaWxlc3lzdGVtOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRyZXBvQ29uZmlnLCBzdHJpbmcgJHBvcnQsIHN0cmluZyAkcGF0aCwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzLCBib29sICRpc1dpbmRvd3MsIElPSW50ZXJmYWNlICRpbykKewokdGhpcy0+d2luZG93c0ZsYWcgPSAkaXNXaW5kb3dzOwokdGhpcy0+cDRQb3J0ID0gJHBvcnQ7CiR0aGlzLT5pbml0aWFsaXplUGF0aCgkcGF0aCk7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3M7CiR0aGlzLT5pbml0aWFsaXplKCRyZXBvQ29uZmlnKTsKJHRoaXMtPmlvID0gJGlvOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZSgkcmVwb0NvbmZpZywgc3RyaW5nICRwb3J0LCBzdHJpbmcgJHBhdGgsIFByb2Nlc3NFeGVjdXRvciAkcHJvY2VzcywgSU9JbnRlcmZhY2UgJGlvKTogc2VsZgp7CnJldHVybiBuZXcgUGVyZm9yY2UoJHJlcG9Db25maWcsICRwb3J0LCAkcGF0aCwgJHByb2Nlc3MsIFBsYXRmb3JtOjppc1dpbmRvd3MoKSwgJGlvKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjaGVja1NlcnZlckV4aXN0cyhzdHJpbmcgJHVybCwgUHJvY2Vzc0V4ZWN1dG9yICRwcm9jZXNzRXhlY3V0b3IpOiBib29sCnsKcmV0dXJuIDAgPT09ICRwcm9jZXNzRXhlY3V0b3ItPmV4ZWN1dGUoWydwNCcsICctcCcsICR1cmwsICdpbmZvJywgJy1zJ10sICRpZ25vcmVkT3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemUoJHJlcG9Db25maWcpOiB2b2lkCnsKJHRoaXMtPnVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSA9ICR0aGlzLT5nZW5lcmF0ZVVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSgpOwppZiAoISRyZXBvQ29uZmlnKSB7CnJldHVybjsKfQppZiAoaXNzZXQoJHJlcG9Db25maWdbJ3VuaXF1ZV9wZXJmb3JjZV9jbGllbnRfbmFtZSddKSkgewokdGhpcy0+dW5pcXVlUGVyZm9yY2VDbGllbnROYW1lID0gJHJlcG9Db25maWdbJ3VuaXF1ZV9wZXJmb3JjZV9jbGllbnRfbmFtZSddOwp9CgppZiAoaXNzZXQoJHJlcG9Db25maWdbJ2RlcG90J10pKSB7CiR0aGlzLT5wNERlcG90ID0gJHJlcG9Db25maWdbJ2RlcG90J107Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydicmFuY2gnXSkpIHsKJHRoaXMtPnA0QnJhbmNoID0gJHJlcG9Db25maWdbJ2JyYW5jaCddOwp9CmlmIChpc3NldCgkcmVwb0NvbmZpZ1sncDR1c2VyJ10pKSB7CiR0aGlzLT5wNFVzZXIgPSAkcmVwb0NvbmZpZ1sncDR1c2VyJ107Cn0gZWxzZSB7CiR0aGlzLT5wNFVzZXIgPSAkdGhpcy0+Z2V0UDR2YXJpYWJsZSgnUDRVU0VSJyk7Cn0KaWYgKGlzc2V0KCRyZXBvQ29uZmlnWydwNHBhc3N3b3JkJ10pKSB7CiR0aGlzLT5wNFBhc3N3b3JkID0gJHJlcG9Db25maWdbJ3A0cGFzc3dvcmQnXTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gaW5pdGlhbGl6ZURlcG90QW5kQnJhbmNoKD9zdHJpbmcgJGRlcG90LCA/c3RyaW5nICRicmFuY2gpOiB2b2lkCnsKaWYgKGlzc2V0KCRkZXBvdCkpIHsKJHRoaXMtPnA0RGVwb3QgPSAkZGVwb3Q7Cn0KaWYgKGlzc2V0KCRicmFuY2gpKSB7CiR0aGlzLT5wNEJyYW5jaCA9ICRicmFuY2g7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlVW5pcXVlUGVyZm9yY2VDbGllbnROYW1lKCk6IHN0cmluZwp7CnJldHVybiBnZXRob3N0bmFtZSgpIC4gIl8iIC4gdGltZSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2xlYW51cENsaWVudFNwZWMoKTogdm9pZAp7CiRjbGllbnQgPSAkdGhpcy0+Z2V0Q2xpZW50KCk7CiR0YXNrID0gJ2NsaWVudCAtZCAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJGNsaWVudCk7CiR1c2VQNENsaWVudCA9IGZhbHNlOwokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgkdGFzaywgJHVzZVA0Q2xpZW50KTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJGNsaWVudFNwZWMgPSAkdGhpcy0+Z2V0UDRDbGllbnRTcGVjKCk7CiRmaWxlU3lzdGVtID0gJHRoaXMtPmdldEZpbGVzeXN0ZW0oKTsKJGZpbGVTeXN0ZW0tPnJlbW92ZSgkY2xpZW50U3BlYyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlQ29tbWFuZCgkY29tbWFuZCk6IGludAp7CiR0aGlzLT5jb21tYW5kUmVzdWx0ID0gJyc7CgpyZXR1cm4gJHRoaXMtPnByb2Nlc3MtPmV4ZWN1dGUoJGNvbW1hbmQsICR0aGlzLT5jb21tYW5kUmVzdWx0KTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENsaWVudCgpOiBzdHJpbmcKewppZiAoIWlzc2V0KCR0aGlzLT5wNENsaWVudCkpIHsKJGNsZWFuU3RyZWFtTmFtZSA9IHN0cl9yZXBsYWNlKFsnLy8nLCAnLycsICdAJ10sIFsnJywgJ18nLCAnJ10sICR0aGlzLT5nZXRTdHJlYW0oKSk7CiR0aGlzLT5wNENsaWVudCA9ICdjb21wb3Nlcl9wZXJmb3JjZV8nIC4gJHRoaXMtPnVuaXF1ZVBlcmZvcmNlQ2xpZW50TmFtZSAuICdfJyAuICRjbGVhblN0cmVhbU5hbWU7Cn0KCnJldHVybiAkdGhpcy0+cDRDbGllbnQ7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQYXRoKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cGF0aDsKfQoKcHVibGljIGZ1bmN0aW9uIGluaXRpYWxpemVQYXRoKHN0cmluZyAkcGF0aCk6IHZvaWQKewokdGhpcy0+cGF0aCA9ICRwYXRoOwokZnMgPSAkdGhpcy0+Z2V0RmlsZXN5c3RlbSgpOwokZnMtPmVuc3VyZURpcmVjdG9yeUV4aXN0cygkcGF0aCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQb3J0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cDRQb3J0Owp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0U3RyZWFtKHN0cmluZyAkc3RyZWFtKTogdm9pZAp7CiR0aGlzLT5wNFN0cmVhbSA9ICRzdHJlYW07CiRpbmRleCA9IHN0cnJwb3MoJHN0cmVhbSwgJy8nKTsKCmlmICgkaW5kZXggPiAyKSB7CiR0aGlzLT5wNERlcG90VHlwZSA9ICdzdHJlYW0nOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1N0cmVhbSgpOiBib29sCnsKcmV0dXJuIGlzX3N0cmluZygkdGhpcy0+cDREZXBvdFR5cGUpICYmIChzdHJjbXAoJHRoaXMtPnA0RGVwb3RUeXBlLCAnc3RyZWFtJykgPT09IDApOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RyZWFtKCk6IHN0cmluZwp7CmlmICghaXNzZXQoJHRoaXMtPnA0U3RyZWFtKSkgewppZiAoJHRoaXMtPmlzU3RyZWFtKCkpIHsKJHRoaXMtPnA0U3RyZWFtID0gJy8vJyAuICR0aGlzLT5wNERlcG90IC4gJy8nIC4gJHRoaXMtPnA0QnJhbmNoOwp9IGVsc2UgewokdGhpcy0+cDRTdHJlYW0gPSAnLy8nIC4gJHRoaXMtPnA0RGVwb3Q7Cn0KfQoKcmV0dXJuICR0aGlzLT5wNFN0cmVhbTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbVdpdGhvdXRMYWJlbChzdHJpbmcgJHN0cmVhbSk6IHN0cmluZwp7CiRpbmRleCA9IHN0cnBvcygkc3RyZWFtLCAnQCcpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewpyZXR1cm4gJHN0cmVhbTsKfQoKcmV0dXJuIHN1YnN0cigkc3RyZWFtLCAwLCAkaW5kZXgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UDRDbGllbnRTcGVjKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+cGF0aCAuICcvJyAuICR0aGlzLT5nZXRDbGllbnQoKSAuICcucDQuc3BlYyc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVc2VyKCk6ID9zdHJpbmcKewpyZXR1cm4gJHRoaXMtPnA0VXNlcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFVzZXIoP3N0cmluZyAkdXNlcik6IHZvaWQKewokdGhpcy0+cDRVc2VyID0gJHVzZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBxdWVyeVA0VXNlcigpOiB2b2lkCnsKJHRoaXMtPmdldFVzZXIoKTsKaWYgKHN0cmxlbigoc3RyaW5nKSAkdGhpcy0+cDRVc2VyKSA+IDApIHsKcmV0dXJuOwp9CiR0aGlzLT5wNFVzZXIgPSAkdGhpcy0+Z2V0UDR2YXJpYWJsZSgnUDRVU0VSJyk7CmlmIChzdHJsZW4oKHN0cmluZykgJHRoaXMtPnA0VXNlcikgPiAwKSB7CnJldHVybjsKfQokdGhpcy0+cDRVc2VyID0gJHRoaXMtPmlvLT5hc2soJ0VudGVyIFA0IFVzZXI6Jyk7CmlmICgkdGhpcy0+d2luZG93c0ZsYWcpIHsKJGNvbW1hbmQgPSAkdGhpcy0+Z2V0UDRFeGVjdXRhYmxlKCkuJyBzZXQgUDRVU0VSPScgLiAkdGhpcy0+cDRVc2VyOwp9IGVsc2UgewokY29tbWFuZCA9ICdleHBvcnQgUDRVU0VSPScgLiAkdGhpcy0+cDRVc2VyOwp9CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRQNHZhcmlhYmxlKHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewppZiAoJHRoaXMtPndpbmRvd3NGbGFnKSB7CiRjb21tYW5kID0gJHRoaXMtPmdldFA0RXhlY3V0YWJsZSgpLicgc2V0JzsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9IHRyaW0oJHRoaXMtPmNvbW1hbmRSZXN1bHQpOwokcmVzQXJyYXkgPSBleHBsb2RlKFBIUF9FT0wsICRyZXN1bHQpOwpmb3JlYWNoICgkcmVzQXJyYXkgYXMgJGxpbmUpIHsKJGZpZWxkcyA9IGV4cGxvZGUoJz0nLCAkbGluZSk7CmlmIChzdHJjbXAoJG5hbWUsICRmaWVsZHNbMF0pID09PSAwKSB7CiRpbmRleCA9IHN0cnBvcygkZmllbGRzWzFdLCAnICcpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewokdmFsdWUgPSAkZmllbGRzWzFdOwp9IGVsc2UgewokdmFsdWUgPSBzdWJzdHIoJGZpZWxkc1sxXSwgMCwgJGluZGV4KTsKfQokdmFsdWUgPSB0cmltKCR2YWx1ZSk7CgpyZXR1cm4gJHZhbHVlOwp9Cn0KCnJldHVybiBudWxsOwp9CgokY29tbWFuZCA9ICdlY2hvICQnIC4gJG5hbWU7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSB0cmltKCR0aGlzLT5jb21tYW5kUmVzdWx0KTsKCnJldHVybiAkcmVzdWx0Owp9CgpwdWJsaWMgZnVuY3Rpb24gcXVlcnlQNFBhc3N3b3JkKCk6ID9zdHJpbmcKewppZiAoaXNzZXQoJHRoaXMtPnA0UGFzc3dvcmQpKSB7CnJldHVybiAkdGhpcy0+cDRQYXNzd29yZDsKfQokcGFzc3dvcmQgPSAkdGhpcy0+Z2V0UDR2YXJpYWJsZSgnUDRQQVNTV0QnKTsKaWYgKHN0cmxlbigoc3RyaW5nKSAkcGFzc3dvcmQpIDw9IDApIHsKJHBhc3N3b3JkID0gJHRoaXMtPmlvLT5hc2tBbmRIaWRlQW5zd2VyKCdFbnRlciBwYXNzd29yZCBmb3IgUGVyZm9yY2UgdXNlciAnIC4gJHRoaXMtPmdldFVzZXIoKSAuICc6ICcpOwp9CiR0aGlzLT5wNFBhc3N3b3JkID0gJHBhc3N3b3JkOwoKcmV0dXJuICRwYXNzd29yZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlUDRDb21tYW5kKHN0cmluZyAkY29tbWFuZCwgYm9vbCAkdXNlQ2xpZW50ID0gdHJ1ZSk6IHN0cmluZwp7CiRwNENvbW1hbmQgPSAkdGhpcy0+Z2V0UDRFeGVjdXRhYmxlKCkuJyAnOwokcDRDb21tYW5kIC49ICctdSAnIC4gJHRoaXMtPmdldFVzZXIoKSAuICcgJzsKaWYgKCR1c2VDbGllbnQpIHsKJHA0Q29tbWFuZCAuPSAnLWMgJyAuICR0aGlzLT5nZXRDbGllbnQoKSAuICcgJzsKfQokcDRDb21tYW5kIC49ICctcCAnIC4gJHRoaXMtPmdldFBvcnQoKSAuICcgJyAuICRjb21tYW5kOwoKcmV0dXJuICRwNENvbW1hbmQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0xvZ2dlZEluKCk6IGJvb2wKewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnbG9naW4gLXMnLCBmYWxzZSk7CiRleGl0Q29kZSA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CmlmICgkZXhpdENvZGUpIHsKJGVycm9yT3V0cHV0ID0gJHRoaXMtPnByb2Nlc3MtPmdldEVycm9yT3V0cHV0KCk7CiRpbmRleCA9IHN0cnBvcygkZXJyb3JPdXRwdXQsICR0aGlzLT5nZXRVc2VyKCkpOwppZiAoJGluZGV4ID09PSBmYWxzZSkgewokaW5kZXggPSBzdHJwb3MoJGVycm9yT3V0cHV0LCAncDQnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKcmV0dXJuIGZhbHNlOwp9CnRocm93IG5ldyBcRXhjZXB0aW9uKCdwNCBjb21tYW5kIG5vdCBmb3VuZCBpbiBwYXRoOiAnIC4gJGVycm9yT3V0cHV0KTsKfQp0aHJvdyBuZXcgXEV4Y2VwdGlvbignSW52YWxpZCB1c2VyIG5hbWU6ICcgLiAkdGhpcy0+Z2V0VXNlcigpKTsKfQoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb25uZWN0Q2xpZW50KCk6IHZvaWQKewokcDRDcmVhdGVDbGllbnRDb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKAonY2xpZW50IC1pIDwgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCR0aGlzLT5nZXRQNENsaWVudFNwZWMoKSkKKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRwNENyZWF0ZUNsaWVudENvbW1hbmQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3luY0NvZGVCYXNlKD9zdHJpbmcgJHNvdXJjZVJlZmVyZW5jZSk6IHZvaWQKewokcHJldkRpciA9IFBsYXRmb3JtOjpnZXRDd2QoKTsKY2hkaXIoJHRoaXMtPnBhdGgpOwokcDRTeW5jQ29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnc3luYyAtZiAnKTsKaWYgKG51bGwgIT09ICRzb3VyY2VSZWZlcmVuY2UpIHsKJHA0U3luY0NvbW1hbmQgLj0gJ0AnIC4gJHNvdXJjZVJlZmVyZW5jZTsKfQokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJHA0U3luY0NvbW1hbmQpOwpjaGRpcigkcHJldkRpcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZUNsaWVudFNwZWNUb0ZpbGUoJHNwZWMpOiB2b2lkCnsKZndyaXRlKCRzcGVjLCAnQ2xpZW50OiAnIC4gJHRoaXMtPmdldENsaWVudCgpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdVcGRhdGU6ICcgLiBkYXRlKCdZL20vZCBIOmk6cycpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdBY2Nlc3M6ICcgLiBkYXRlKCdZL20vZCBIOmk6cycpIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ093bmVyOiAgJyAuICR0aGlzLT5nZXRVc2VyKCkgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ0Rlc2NyaXB0aW9uOicgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnICBDcmVhdGVkIGJ5ICcgLiAkdGhpcy0+Z2V0VXNlcigpIC4gJyBmcm9tIGNvbXBvc2VyLicgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ1Jvb3Q6ICcgLiAkdGhpcy0+Z2V0UGF0aCgpIC4gUEhQX0VPTCAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICdPcHRpb25zOiAgbm9hbGx3cml0ZSBub2Nsb2JiZXIgbm9jb21wcmVzcyB1bmxvY2tlZCBtb2R0aW1lIHJtZGlyJyAuIFBIUF9FT0wgLiBQSFBfRU9MKTsKZndyaXRlKCRzcGVjLCAnU3VibWl0T3B0aW9uczogIHJldmVydHVuY2hhbmdlZCcgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmZ3cml0ZSgkc3BlYywgJ0xpbmVFbmQ6ICBsb2NhbCcgLiBQSFBfRU9MIC4gUEhQX0VPTCk7CmlmICgkdGhpcy0+aXNTdHJlYW0oKSkgewpmd3JpdGUoJHNwZWMsICdTdHJlYW06JyAuIFBIUF9FT0wpOwpmd3JpdGUoJHNwZWMsICcgICcgLiAkdGhpcy0+Z2V0U3RyZWFtV2l0aG91dExhYmVsKCR0aGlzLT5wNFN0cmVhbSkgLiBQSFBfRU9MKTsKfSBlbHNlIHsKZndyaXRlKAokc3BlYywKJ1ZpZXc6ICAnIC4gJHRoaXMtPmdldFN0cmVhbSgpIC4gJy8uLi4gIC8vJyAuICR0aGlzLT5nZXRDbGllbnQoKSAuICcvLi4uICcgLiBQSFBfRU9MCik7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHdyaXRlUDRDbGllbnRTcGVjKCk6IHZvaWQKewokY2xpZW50U3BlYyA9ICR0aGlzLT5nZXRQNENsaWVudFNwZWMoKTsKJHNwZWMgPSBmb3BlbigkY2xpZW50U3BlYywgJ3cnKTsKdHJ5IHsKJHRoaXMtPndyaXRlQ2xpZW50U3BlY1RvRmlsZSgkc3BlYyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKZmNsb3NlKCRzcGVjKTsKdGhyb3cgJGU7Cn0KZmNsb3NlKCRzcGVjKTsKfQoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZWFkKCRwaXBlLCAkbmFtZSk6IHZvaWQKewppZiAoZmVvZigkcGlwZSkpIHsKcmV0dXJuOwp9CiRsaW5lID0gZmdldHMoJHBpcGUpOwp3aGlsZSAoJGxpbmUgIT09IGZhbHNlKSB7CiRsaW5lID0gZmdldHMoJHBpcGUpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB3aW5kb3dzTG9naW4oP3N0cmluZyAkcGFzc3dvcmQpOiBpbnQKewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnIGxvZ2luIC1hJyk7CgokcHJvY2VzcyA9IFByb2Nlc3M6OmZyb21TaGVsbENvbW1hbmRsaW5lKCRjb21tYW5kLCBudWxsLCBudWxsLCAkcGFzc3dvcmQpOwoKcmV0dXJuICRwcm9jZXNzLT5ydW4oKTsKfQoKcHVibGljIGZ1bmN0aW9uIHA0TG9naW4oKTogdm9pZAp7CiR0aGlzLT5xdWVyeVA0VXNlcigpOwppZiAoISR0aGlzLT5pc0xvZ2dlZEluKCkpIHsKJHBhc3N3b3JkID0gJHRoaXMtPnF1ZXJ5UDRQYXNzd29yZCgpOwppZiAoJHRoaXMtPndpbmRvd3NGbGFnKSB7CiR0aGlzLT53aW5kb3dzTG9naW4oJHBhc3N3b3JkKTsKfSBlbHNlIHsKJGNvbW1hbmQgPSAnZWNobyAnIC4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHBhc3N3b3JkKSAuICcgfCAnIC4gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCcgbG9naW4gLWEnLCBmYWxzZSk7CiRleGl0Q29kZSA9ICR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CmlmICgkZXhpdENvZGUpIHsKdGhyb3cgbmV3IFxFeGNlcHRpb24oIkVycm9yIGxvZ2dpbmcgaW46IiAuICR0aGlzLT5wcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpKTsKfQp9Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbXBvc2VySW5mb3JtYXRpb24oc3RyaW5nICRpZGVudGlmaWVyKTogP2FycmF5CnsKJGNvbXBvc2VyRmlsZUNvbnRlbnQgPSAkdGhpcy0+Z2V0RmlsZUNvbnRlbnQoJ2NvbXBvc2VyLmpzb24nLCAkaWRlbnRpZmllcik7CgppZiAoISRjb21wb3NlckZpbGVDb250ZW50KSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4ganNvbl9kZWNvZGUoJGNvbXBvc2VyRmlsZUNvbnRlbnQsIHRydWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZUNvbnRlbnQoc3RyaW5nICRmaWxlLCBzdHJpbmcgJGlkZW50aWZpZXIpOiA/c3RyaW5nCnsKJHBhdGggPSAkdGhpcy0+Z2V0RmlsZVBhdGgoJGZpbGUsICRpZGVudGlmaWVyKTsKCiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCcgcHJpbnQgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwYXRoKSk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKCmlmICghdHJpbSgkcmVzdWx0KSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlUGF0aChzdHJpbmcgJGZpbGUsIHN0cmluZyAkaWRlbnRpZmllcik6ID9zdHJpbmcKewokaW5kZXggPSBzdHJwb3MoJGlkZW50aWZpZXIsICdAJyk7CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CnJldHVybiAkaWRlbnRpZmllci4gJy8nIC4gJGZpbGU7Cn0KCiRwYXRoID0gc3Vic3RyKCRpZGVudGlmaWVyLCAwLCAkaW5kZXgpIC4gJy8nIC4gJGZpbGUgLiBzdWJzdHIoJGlkZW50aWZpZXIsICRpbmRleCk7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCcgZmlsZXMgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRwYXRoKSwgZmFsc2UpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CiRpbmRleDIgPSBzdHJwb3MoJHJlc3VsdCwgJ25vIHN1Y2ggZmlsZShzKS4nKTsKaWYgKCRpbmRleDIgPT09IGZhbHNlKSB7CiRpbmRleDMgPSBzdHJwb3MoJHJlc3VsdCwgJ2NoYW5nZScpOwppZiAoJGluZGV4MyAhPT0gZmFsc2UpIHsKJHBocmFzZSA9IHRyaW0oc3Vic3RyKCRyZXN1bHQsICRpbmRleDMpKTsKJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkcGhyYXNlKTsKCnJldHVybiBzdWJzdHIoJGlkZW50aWZpZXIsIDAsICRpbmRleCkgLiAnLycgLiAkZmlsZSAuICdAJyAuICRmaWVsZHNbMV07Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCcmFuY2hlcygpOiBhcnJheQp7CiRwb3NzaWJsZUJyYW5jaGVzID0gW107CmlmICghJHRoaXMtPmlzU3RyZWFtKCkpIHsKJHBvc3NpYmxlQnJhbmNoZXNbJHRoaXMtPnA0QnJhbmNoXSA9ICR0aGlzLT5nZXRTdHJlYW0oKTsKfSBlbHNlIHsKJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ3N0cmVhbXMgJy5Qcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgnLy8nIC4gJHRoaXMtPnA0RGVwb3QgLiAnLy4uLicpKTsKJHRoaXMtPmV4ZWN1dGVDb21tYW5kKCRjb21tYW5kKTsKJHJlc3VsdCA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwokcmVzQXJyYXkgPSBleHBsb2RlKFBIUF9FT0wsICRyZXN1bHQpOwpmb3JlYWNoICgkcmVzQXJyYXkgYXMgJGxpbmUpIHsKJHJlc0JpdHMgPSBleHBsb2RlKCcgJywgJGxpbmUpOwppZiAoY291bnQoJHJlc0JpdHMpID4gNCkgewokYnJhbmNoID0gUHJlZzo6cmVwbGFjZSgnL1teQS1aYS16MC05IF0vJywgJycsICRyZXNCaXRzWzRdKTsKJHBvc3NpYmxlQnJhbmNoZXNbJGJyYW5jaF0gPSAkcmVzQml0c1sxXTsKfQp9Cn0KJGNvbW1hbmQgPSAkdGhpcy0+Z2VuZXJhdGVQNENvbW1hbmQoJ2NoYW5nZXMgJy4gUHJvY2Vzc0V4ZWN1dG9yOjplc2NhcGUoJHRoaXMtPmdldFN0cmVhbSgpIC4gJy8uLi4nKSwgZmFsc2UpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CiRyZXNBcnJheSA9IGV4cGxvZGUoUEhQX0VPTCwgJHJlc3VsdCk7CiRsYXN0Q29tbWl0ID0gJHJlc0FycmF5WzBdOwokbGFzdENvbW1pdEFyciA9IGV4cGxvZGUoJyAnLCAkbGFzdENvbW1pdCk7CiRsYXN0Q29tbWl0TnVtID0gJGxhc3RDb21taXRBcnJbMV07CgpyZXR1cm4gWydtYXN0ZXInID0+ICRwb3NzaWJsZUJyYW5jaGVzWyR0aGlzLT5wNEJyYW5jaF0gLiAnQCcuICRsYXN0Q29tbWl0TnVtXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFRhZ3MoKTogYXJyYXkKewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnbGFiZWxzJyk7CiR0aGlzLT5leGVjdXRlQ29tbWFuZCgkY29tbWFuZCk7CiRyZXN1bHQgPSAkdGhpcy0+Y29tbWFuZFJlc3VsdDsKJHJlc0FycmF5ID0gZXhwbG9kZShQSFBfRU9MLCAkcmVzdWx0KTsKJHRhZ3MgPSBbXTsKZm9yZWFjaCAoJHJlc0FycmF5IGFzICRsaW5lKSB7CmlmIChzdHJwb3MoJGxpbmUsICdMYWJlbCcpICE9PSBmYWxzZSkgewokZmllbGRzID0gZXhwbG9kZSgnICcsICRsaW5lKTsKJHRhZ3NbJGZpZWxkc1sxXV0gPSAkdGhpcy0+Z2V0U3RyZWFtKCkgLiAnQCcgLiAkZmllbGRzWzFdOwp9Cn0KCnJldHVybiAkdGFnczsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrU3RyZWFtKCk6IGJvb2wKewokY29tbWFuZCA9ICR0aGlzLT5nZW5lcmF0ZVA0Q29tbWFuZCgnZGVwb3RzJywgZmFsc2UpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokcmVzdWx0ID0gJHRoaXMtPmNvbW1hbmRSZXN1bHQ7CiRyZXNBcnJheSA9IGV4cGxvZGUoUEhQX0VPTCwgJHJlc3VsdCk7CmZvcmVhY2ggKCRyZXNBcnJheSBhcyAkbGluZSkgewppZiAoc3RycG9zKCRsaW5lLCAnRGVwb3QnKSAhPT0gZmFsc2UpIHsKJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkbGluZSk7CmlmIChzdHJjbXAoJHRoaXMtPnA0RGVwb3QsICRmaWVsZHNbMV0pID09PSAwKSB7CiR0aGlzLT5wNERlcG90VHlwZSA9ICRmaWVsZHNbM107CgpyZXR1cm4gJHRoaXMtPmlzU3RyZWFtKCk7Cn0KfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDaGFuZ2VMaXN0KHN0cmluZyAkcmVmZXJlbmNlKTogbWl4ZWQKewokaW5kZXggPSBzdHJwb3MoJHJlZmVyZW5jZSwgJ0AnKTsKaWYgKCRpbmRleCA9PT0gZmFsc2UpIHsKcmV0dXJuIG51bGw7Cn0KJGxhYmVsID0gc3Vic3RyKCRyZWZlcmVuY2UsICRpbmRleCk7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCcgY2hhbmdlcyAtbTEgJyAuIFByb2Nlc3NFeGVjdXRvcjo6ZXNjYXBlKCRsYWJlbCkpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwokY2hhbmdlcyA9ICR0aGlzLT5jb21tYW5kUmVzdWx0OwppZiAoc3RycG9zKCRjaGFuZ2VzLCAnQ2hhbmdlJykgIT09IDApIHsKcmV0dXJuIG51bGw7Cn0KJGZpZWxkcyA9IGV4cGxvZGUoJyAnLCAkY2hhbmdlcyk7CgpyZXR1cm4gJGZpZWxkc1sxXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1pdExvZ3Moc3RyaW5nICRmcm9tUmVmZXJlbmNlLCBzdHJpbmcgJHRvUmVmZXJlbmNlKTogbWl4ZWQKewokZnJvbUNoYW5nZUxpc3QgPSAkdGhpcy0+Z2V0Q2hhbmdlTGlzdCgkZnJvbVJlZmVyZW5jZSk7CmlmICgkZnJvbUNoYW5nZUxpc3QgPT09IG51bGwpIHsKcmV0dXJuIG51bGw7Cn0KJHRvQ2hhbmdlTGlzdCA9ICR0aGlzLT5nZXRDaGFuZ2VMaXN0KCR0b1JlZmVyZW5jZSk7CmlmICgkdG9DaGFuZ2VMaXN0ID09PSBudWxsKSB7CnJldHVybiBudWxsOwp9CiRpbmRleCA9IHN0cnBvcygkZnJvbVJlZmVyZW5jZSwgJ0AnKTsKJG1haW4gPSBzdWJzdHIoJGZyb21SZWZlcmVuY2UsIDAsICRpbmRleCkgLiAnLy4uLic7CiRjb21tYW5kID0gJHRoaXMtPmdlbmVyYXRlUDRDb21tYW5kKCdmaWxlbG9nICcgLiBQcm9jZXNzRXhlY3V0b3I6OmVzY2FwZSgkbWFpbiAuICdAJyAuICRmcm9tQ2hhbmdlTGlzdC4gJywnIC4gJHRvQ2hhbmdlTGlzdCkpOwokdGhpcy0+ZXhlY3V0ZUNvbW1hbmQoJGNvbW1hbmQpOwoKcmV0dXJuICR0aGlzLT5jb21tYW5kUmVzdWx0Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZXN5c3RlbSgpOiBGaWxlc3lzdGVtCnsKaWYgKG51bGwgPT09ICR0aGlzLT5maWxlc3lzdGVtKSB7CiR0aGlzLT5maWxlc3lzdGVtID0gbmV3IEZpbGVzeXN0ZW0oJHRoaXMtPnByb2Nlc3MpOwp9CgpyZXR1cm4gJHRoaXMtPmZpbGVzeXN0ZW07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRGaWxlc3lzdGVtKEZpbGVzeXN0ZW0gJGZzKTogdm9pZAp7CiR0aGlzLT5maWxlc3lzdGVtID0gJGZzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFA0RXhlY3V0YWJsZSgpOiBzdHJpbmcKewpzdGF0aWMgJHA0RXhlY3V0YWJsZTsKCmlmICgkcDRFeGVjdXRhYmxlKSB7CnJldHVybiAkcDRFeGVjdXRhYmxlOwp9CgokZmluZGVyID0gbmV3IEV4ZWN1dGFibGVGaW5kZXIoKTsKCnJldHVybiAkcDRFeGVjdXRhYmxlID0gJGZpbmRlci0+ZmluZCgncDQnKSA/PyAncDQnOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCgpjbGFzcyBQbGF0Zm9ybQp7Cgpwcml2YXRlIHN0YXRpYyAkaXNWaXJ0dWFsQm94R3Vlc3QgPSBudWxsOwoKcHJpdmF0ZSBzdGF0aWMgJGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gbnVsbDsKCnByaXZhdGUgc3RhdGljICRpc0RvY2tlciA9IG51bGw7CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q3dkKGJvb2wgJGFsbG93RW1wdHkgPSBmYWxzZSk6IHN0cmluZwp7CiRjd2QgPSBnZXRjd2QoKTsKCgppZiAoZmFsc2UgPT09ICRjd2QpIHsKJGN3ZCA9IHJlYWxwYXRoKCcnKTsKfQoKCmlmIChmYWxzZSA9PT0gJGN3ZCkgewppZiAoJGFsbG93RW1wdHkpIHsKcmV0dXJuICcnOwp9Cgp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnknKTsKfQoKcmV0dXJuICRjd2Q7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVhbHBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHJlYWxQYXRoID0gcmVhbHBhdGgoJHBhdGgpOwppZiAoJHJlYWxQYXRoID09PSBmYWxzZSkgewpyZXR1cm4gJHBhdGg7Cn0KCnJldHVybiAkcmVhbFBhdGg7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEVudihzdHJpbmcgJG5hbWUpCnsKaWYgKGFycmF5X2tleV9leGlzdHMoJG5hbWUsICRfU0VSVkVSKSkgewpyZXR1cm4gKHN0cmluZykgJF9TRVJWRVJbJG5hbWVdOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkX0VOVikpIHsKcmV0dXJuIChzdHJpbmcpICRfRU5WWyRuYW1lXTsKfQoKcmV0dXJuIGdldGVudigkbmFtZSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHV0RW52KHN0cmluZyAkbmFtZSwgc3RyaW5nICR2YWx1ZSk6IHZvaWQKewpwdXRlbnYoJG5hbWUgLiAnPScgLiAkdmFsdWUpOwokX1NFUlZFUlskbmFtZV0gPSAkX0VOVlskbmFtZV0gPSAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2xlYXJFbnYoc3RyaW5nICRuYW1lKTogdm9pZAp7CnB1dGVudigkbmFtZSk7CnVuc2V0KCRfU0VSVkVSWyRuYW1lXSwgJF9FTlZbJG5hbWVdKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBleHBhbmRQYXRoKHN0cmluZyAkcGF0aCk6IHN0cmluZwp7CmlmIChQcmVnOjppc01hdGNoKCcjXn5bXFwvXSMnLCAkcGF0aCkpIHsKcmV0dXJuIHNlbGY6OmdldFVzZXJEaXJlY3RvcnkoKSAuIHN1YnN0cigkcGF0aCwgMSk7Cn0KCnJldHVybiBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJyNeKFwkfCg/UDxwZXJjZW50PiUpKSg/UDx2YXI+XHcrKykoPyhwZXJjZW50KSUpKD9QPHBhdGg+LiopIycsIHN0YXRpYyBmdW5jdGlvbiAoJG1hdGNoZXMpOiBzdHJpbmcgewoKaWYgKFBsYXRmb3JtOjppc1dpbmRvd3MoKSAmJiAkbWF0Y2hlc1sndmFyJ10gPT09ICdIT01FJykgewppZiAoKGJvb2wpIFBsYXRmb3JtOjpnZXRFbnYoJ0hPTUUnKSkgewpyZXR1cm4gUGxhdGZvcm06OmdldEVudignSE9NRScpIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfQoKcmV0dXJuIFBsYXRmb3JtOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykgLiAkbWF0Y2hlc1sncGF0aCddOwp9CgpyZXR1cm4gUGxhdGZvcm06OmdldEVudigkbWF0Y2hlc1sndmFyJ10pIC4gJG1hdGNoZXNbJ3BhdGgnXTsKfSwgJHBhdGgpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRVc2VyRGlyZWN0b3J5KCk6IHN0cmluZwp7CmlmIChmYWxzZSAhPT0gKCRob21lID0gc2VsZjo6Z2V0RW52KCdIT01FJykpKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKHNlbGY6OmlzV2luZG93cygpICYmIGZhbHNlICE9PSAoJGhvbWUgPSBzZWxmOjpnZXRFbnYoJ1VTRVJQUk9GSUxFJykpKSB7CnJldHVybiAkaG9tZTsKfQoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHVpZCcpICYmIFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2dldHB3dWlkJykpIHsKJGluZm8gPSBwb3NpeF9nZXRwd3VpZChwb3NpeF9nZXR1aWQoKSk7CgppZiAoaXNfYXJyYXkoJGluZm8pKSB7CnJldHVybiAkaW5mb1snZGlyJ107Cn0KfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZXJtaW5lIHVzZXIgZGlyZWN0b3J5Jyk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXgpIHsKc2VsZjo6JGlzV2luZG93c1N1YnN5c3RlbUZvckxpbnV4ID0gZmFsc2U7CgoKaWYgKHNlbGY6OmlzV2luZG93cygpKSB7CnJldHVybiBzZWxmOjokaXNXaW5kb3dzU3Vic3lzdGVtRm9yTGludXggPSBmYWxzZTsKfQoKaWYgKAohKGJvb2wpIGluaV9nZXQoJ29wZW5fYmFzZWRpcicpCiYmIGlzX3JlYWRhYmxlKCcvcHJvYy92ZXJzaW9uJykKJiYgZmFsc2UgIT09IHN0cmlwb3MoKHN0cmluZykgU2lsZW5jZXI6OmNhbGwoJ2ZpbGVfZ2V0X2NvbnRlbnRzJywgJy9wcm9jL3ZlcnNpb24nKSwgJ21pY3Jvc29mdCcpCiYmICFzZWxmOjppc0RvY2tlcigpIAopIHsKcmV0dXJuIHNlbGY6OiRpc1dpbmRvd3NTdWJzeXN0ZW1Gb3JMaW51eCA9IHRydWU7Cn0KfQoKcmV0dXJuIHNlbGY6OiRpc1dpbmRvd3NTdWJzeXN0ZW1Gb3JMaW51eDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1dpbmRvd3MoKTogYm9vbAp7CnJldHVybiBcZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzRG9ja2VyKCk6IGJvb2wKewppZiAobnVsbCAhPT0gc2VsZjo6JGlzRG9ja2VyKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXI7Cn0KCgppZiAoKGJvb2wpIGluaV9nZXQoJ29wZW5fYmFzZWRpcicpKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSBmYWxzZTsKfQoKCmlmIChmaWxlX2V4aXN0cygnLy5kb2NrZXJlbnYnKSB8fCBmaWxlX2V4aXN0cygnL3J1bi8uY29udGFpbmVyZW52JykgfHwgZmlsZV9leGlzdHMoJy92YXIvcnVuLy5jb250YWluZXJlbnYnKSkgewpyZXR1cm4gc2VsZjo6JGlzRG9ja2VyID0gdHJ1ZTsKfQoKCiRjZ3JvdXBzID0gWwonL3Byb2Mvc2VsZi9tb3VudGluZm8nLCAKJy9wcm9jLzEvY2dyb3VwJywgCl07CmZvcmVhY2ggKCRjZ3JvdXBzIGFzICRjZ3JvdXApIHsKaWYgKCFpc19yZWFkYWJsZSgkY2dyb3VwKSkgewpjb250aW51ZTsKfQoKCnRyeSB7CiRkYXRhID0gQGZpbGVfZ2V0X2NvbnRlbnRzKCRjZ3JvdXApOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CmJyZWFrOwp9CmlmICghaXNfc3RyaW5nKCRkYXRhKSkgewpjb250aW51ZTsKfQoKaWYgKHN0cl9jb250YWlucygkZGF0YSwgJy92YXIvbGliL2RvY2tlci8nKSB8fCBzdHJfY29udGFpbnMoJGRhdGEsICcvaW8uY29udGFpbmVyZC5zbmFwc2hvdHRlcicpKSB7CnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSB0cnVlOwp9Cn0KCnJldHVybiBzZWxmOjokaXNEb2NrZXIgPSBmYWxzZTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW4oc3RyaW5nICRzdHIpOiBpbnQKewpzdGF0aWMgJHVzZU1iU3RyaW5nID0gbnVsbDsKaWYgKG51bGwgPT09ICR1c2VNYlN0cmluZykgewokdXNlTWJTdHJpbmcgPSBcZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSAmJiAoYm9vbCkgaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpOwp9CgppZiAoJHVzZU1iU3RyaW5nKSB7CnJldHVybiBtYl9zdHJsZW4oJHN0ciwgJzhiaXQnKTsKfQoKcmV0dXJuIFxzdHJsZW4oJHN0cik7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNUdHkoJGZkID0gbnVsbCk6IGJvb2wKewppZiAoJGZkID09PSBudWxsKSB7CiRmZCA9IGRlZmluZWQoJ1NURE9VVCcpID8gU1RET1VUIDogZm9wZW4oJ3BocDovL3N0ZG91dCcsICd3Jyk7CmlmICgkZmQgPT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKCmlmIChpbl9hcnJheShzdHJ0b3VwcGVyKChzdHJpbmcpIHNlbGY6OmdldEVudignTVNZU1RFTScpKSwgWydNSU5HVzMyJywgJ01JTkdXNjQnXSwgdHJ1ZSkpIHsKcmV0dXJuIHRydWU7Cn0KCgoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnc3RyZWFtX2lzYXR0eScpKSB7CnJldHVybiBzdHJlYW1faXNhdHR5KCRmZCk7Cn0KCgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9pc2F0dHknKSAmJiBwb3NpeF9pc2F0dHkoJGZkKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJHN0YXQgPSBAZnN0YXQoJGZkKTsKaWYgKCRzdGF0ID09PSBmYWxzZSkgewpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gMDAyMDAwMCA9PT0gKCRzdGF0Wydtb2RlJ10gJiAwMTcwMDAwKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0lucHV0Q29tcGxldGlvblByb2Nlc3MoKTogYm9vbAp7CnJldHVybiAnX2NvbXBsZXRlJyA9PT0gKCRfU0VSVkVSWydhcmd2J11bMV0gPz8gbnVsbCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gd29ya2Fyb3VuZEZpbGVzeXN0ZW1Jc3N1ZXMoKTogdm9pZAp7CmlmIChzZWxmOjppc1ZpcnR1YWxCb3hHdWVzdCgpKSB7CnVzbGVlcCgyMDAwMDApOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNWaXJ0dWFsQm94R3Vlc3QoKTogYm9vbAp7CmlmIChudWxsID09PSBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QpIHsKc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0ID0gZmFsc2U7CmlmIChzZWxmOjppc1dpbmRvd3MoKSkgewpyZXR1cm4gc2VsZjo6JGlzVmlydHVhbEJveEd1ZXN0Owp9CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwd3VpZCcpICYmIGZ1bmN0aW9uX2V4aXN0cygncG9zaXhfZ2V0ZXVpZCcpKSB7CiRwcm9jZXNzVXNlciA9IHBvc2l4X2dldHB3dWlkKHBvc2l4X2dldGV1aWQoKSk7CmlmIChpc19hcnJheSgkcHJvY2Vzc1VzZXIpICYmICRwcm9jZXNzVXNlclsnbmFtZSddID09PSAndmFncmFudCcpIHsKcmV0dXJuIHNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdCA9IHRydWU7Cn0KfQoKaWYgKHNlbGY6OmdldEVudignQ09NUE9TRVJfUlVOVElNRV9FTlYnKSA9PT0gJ3ZpcnR1YWxib3gnKSB7CnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3QgPSB0cnVlOwp9CgppZiAoZGVmaW5lZCgnUEhQX09TX0ZBTUlMWScpICYmIFBIUF9PU19GQU1JTFkgPT09ICdMaW51eCcpIHsKJHByb2Nlc3MgPSBuZXcgUHJvY2Vzc0V4ZWN1dG9yKCk7CnRyeSB7CmlmICgwID09PSAkcHJvY2Vzcy0+ZXhlY3V0ZShbJ2xzbW9kJ10sICRvdXRwdXQpICYmIHN0cl9jb250YWlucygkb3V0cHV0LCAndmJveGd1ZXN0JykpIHsKcmV0dXJuIHNlbGY6OiRpc1ZpcnR1YWxCb3hHdWVzdCA9IHRydWU7Cn0KfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKfQp9Cn0KCnJldHVybiBzZWxmOjokaXNWaXJ0dWFsQm94R3Vlc3Q7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGV2TnVsbCgpOiBzdHJpbmcKewppZiAoc2VsZjo6aXNXaW5kb3dzKCkpIHsKcmV0dXJuICdOVUwnOwp9CgpyZXR1cm4gJy9kZXYvbnVsbCc7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCnVzZSBDb21wb3NlclxJT1xJT0ludGVyZmFjZTsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFNlbGRcU2lnbmFsXFNpZ25hbEhhbmRsZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGVjdXRhYmxlRmluZGVyOwoKCgoKCmNsYXNzIFByb2Nlc3NFeGVjdXRvcgp7CnByaXZhdGUgY29uc3QgU1RBVFVTX1FVRVVFRCA9IDE7CnByaXZhdGUgY29uc3QgU1RBVFVTX1NUQVJURUQgPSAyOwpwcml2YXRlIGNvbnN0IFNUQVRVU19DT01QTEVURUQgPSAzOwpwcml2YXRlIGNvbnN0IFNUQVRVU19GQUlMRUQgPSA0Owpwcml2YXRlIGNvbnN0IFNUQVRVU19BQk9SVEVEID0gNTsKCnByaXZhdGUgY29uc3QgQlVJTFRJTl9DTURfQ09NTUFORFMgPSBbCidhc3NvYycsICdicmVhaycsICdjYWxsJywgJ2NkJywgJ2NoZGlyJywgJ2NscycsICdjb2xvcicsICdjb3B5JywgJ2RhdGUnLAonZGVsJywgJ2RpcicsICdlY2hvJywgJ2VuZGxvY2FsJywgJ2VyYXNlJywgJ2V4aXQnLCAnZm9yJywgJ2Z0eXBlJywgJ2dvdG8nLAonaGVscCcsICdpZicsICdsYWJlbCcsICdtZCcsICdta2RpcicsICdta2xpbmsnLCAnbW92ZScsICdwYXRoJywgJ3BhdXNlJywKJ3BvcGQnLCAncHJvbXB0JywgJ3B1c2hkJywgJ3JkJywgJ3JlbScsICdyZW4nLCAncmVuYW1lJywgJ3JtZGlyJywgJ3NldCcsCidzZXRsb2NhbCcsICdzaGlmdCcsICdzdGFydCcsICd0aW1lJywgJ3RpdGxlJywgJ3R5cGUnLCAndmVyJywgJ3ZvbCcsCl07Cgpwcml2YXRlIGNvbnN0IEdJVF9DTURTX05FRURfR0lUX0RJUiA9IFsKWydzaG93J10sClsnbG9nJ10sClsnYnJhbmNoJ10sClsncmVtb3RlJywgJ3NldC11cmwnXSwKXTsKCgpwcm90ZWN0ZWQgc3RhdGljICR0aW1lb3V0ID0gMzAwOwoKCnByb3RlY3RlZCAkY2FwdHVyZU91dHB1dCA9IGZhbHNlOwoKcHJvdGVjdGVkICRlcnJvck91dHB1dCA9ICcnOwoKcHJvdGVjdGVkICRpbzsKCgoKCnByaXZhdGUgJGpvYnMgPSBbXTsKCnByaXZhdGUgJHJ1bm5pbmdKb2JzID0gMDsKCnByaXZhdGUgJG1heEpvYnMgPSAxMDsKCnByaXZhdGUgJGlkR2VuID0gMDsKCnByaXZhdGUgJGFsbG93QXN5bmMgPSBmYWxzZTsKCgpwcml2YXRlIHN0YXRpYyAkZXhlY3V0YWJsZXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/SU9JbnRlcmZhY2UgJGlvID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CiR0aGlzLT5yZXNldE1heEpvYnMoKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoJGNvbW1hbmQsICYkb3V0cHV0ID0gbnVsbCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IGludAp7CmlmIChmdW5jX251bV9hcmdzKCkgPiAxKSB7CnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSwgJG91dHB1dCk7Cn0KCnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZVR0eSgkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCk6IGludAp7CmlmIChQbGF0Zm9ybTo6aXNUdHkoKSkgewpyZXR1cm4gJHRoaXMtPmRvRXhlY3V0ZSgkY29tbWFuZCwgJGN3ZCwgdHJ1ZSk7Cn0KCnJldHVybiAkdGhpcy0+ZG9FeGVjdXRlKCRjb21tYW5kLCAkY3dkLCBmYWxzZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBydW5Qcm9jZXNzKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsID9hcnJheSAkZW52LCBib29sICR0dHksICYkb3V0cHV0ID0gbnVsbCk6ID9pbnQKewoKCgppZiAoaXNfc3RyaW5nKCRjb21tYW5kKSkgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIFByZWc6OmlzTWF0Y2goJ3teKFteOi9cXFxcXSsrKSB9JywgJGNvbW1hbmQsICRtYXRjaCkpIHsKJGNvbW1hbmQgPSBzdWJzdHJfcmVwbGFjZSgkY29tbWFuZCwgc2VsZjo6ZXNjYXBlKHNlbGY6OmdldEV4ZWN1dGFibGUoJG1hdGNoWzFdKSksIDAsIHN0cmxlbigkbWF0Y2hbMV0pKTsKfQoKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgJGN3ZCwgJGVudiwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9IGVsc2UgewppZiAoUGxhdGZvcm06OmlzV2luZG93cygpICYmIFxzdHJsZW4oJGNvbW1hbmRbMF0pID09PSBzdHJjc3BuKCRjb21tYW5kWzBdLCAnOi9cXCcpKSB7CiRjb21tYW5kWzBdID0gc2VsZjo6Z2V0RXhlY3V0YWJsZSgkY29tbWFuZFswXSk7Cn0KCiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJGNvbW1hbmQsICRjd2QsICRlbnYsIG51bGwsIHN0YXRpYzo6Z2V0VGltZW91dCgpKTsKfQoKaWYgKCFQbGF0Zm9ybTo6aXNXaW5kb3dzKCkgJiYgJHR0eSkgewp0cnkgewokcHJvY2Vzcy0+c2V0VHR5KHRydWUpOwp9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uICRlKSB7Cgp9Cn0KCiRjYWxsYmFjayA9IGlzX2NhbGxhYmxlKCRvdXRwdXQpID8gJG91dHB1dCA6IGZ1bmN0aW9uIChzdHJpbmcgJHR5cGUsIHN0cmluZyAkYnVmZmVyKTogdm9pZCB7CiR0aGlzLT5vdXRwdXRIYW5kbGVyKCR0eXBlLCAkYnVmZmVyKTsKfTsKCiRzaWduYWxIYW5kbGVyID0gU2lnbmFsSGFuZGxlcjo6Y3JlYXRlKApbU2lnbmFsSGFuZGxlcjo6U0lHSU5ULCBTaWduYWxIYW5kbGVyOjpTSUdURVJNLCBTaWduYWxIYW5kbGVyOjpTSUdIVVBdLApmdW5jdGlvbiAoc3RyaW5nICRzaWduYWwpIHsKaWYgKCR0aGlzLT5pbyAhPT0gbnVsbCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoCidSZWNlaXZlZCAnLiRzaWduYWwuJywgYWJvcnRpbmcgd2hlbiBjaGlsZCBwcm9jZXNzIGlzIGRvbmUnLAp0cnVlLApJT0ludGVyZmFjZTo6REVCVUcKKTsKfQp9Cik7Cgp0cnkgewokcHJvY2Vzcy0+cnVuKCRjYWxsYmFjayk7CgppZiAoJHRoaXMtPmNhcHR1cmVPdXRwdXQgJiYgIWlzX2NhbGxhYmxlKCRvdXRwdXQpKSB7CiRvdXRwdXQgPSAkcHJvY2Vzcy0+Z2V0T3V0cHV0KCk7Cn0KCiR0aGlzLT5lcnJvck91dHB1dCA9ICRwcm9jZXNzLT5nZXRFcnJvck91dHB1dCgpOwp9IGNhdGNoIChQcm9jZXNzU2lnbmFsZWRFeGNlcHRpb24gJGUpIHsKaWYgKCRzaWduYWxIYW5kbGVyLT5pc1RyaWdnZXJlZCgpKSB7Cgokc2lnbmFsSGFuZGxlci0+ZXhpdFdpdGhMYXN0U2lnbmFsKCk7Cn0KfSBmaW5hbGx5IHsKJHNpZ25hbEhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQoKcmV0dXJuICRwcm9jZXNzLT5nZXRFeGl0Q29kZSgpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0V4ZWN1dGUoJGNvbW1hbmQsID9zdHJpbmcgJGN3ZCwgYm9vbCAkdHR5LCAmJG91dHB1dCA9IG51bGwpOiBpbnQKewokdGhpcy0+b3V0cHV0Q29tbWFuZFJ1bigkY29tbWFuZCwgJGN3ZCwgZmFsc2UpOwoKJHRoaXMtPmNhcHR1cmVPdXRwdXQgPSBmdW5jX251bV9hcmdzKCkgPiAzOwokdGhpcy0+ZXJyb3JPdXRwdXQgPSAnJzsKCiRlbnYgPSBudWxsOwoKJHJlcXVpcmVzR2l0RGlyRW52ID0gJHRoaXMtPnJlcXVpcmVzR2l0RGlyRW52KCRjb21tYW5kKTsKaWYgKCRjd2QgIT09IG51bGwgJiYgJHJlcXVpcmVzR2l0RGlyRW52KSB7CiRpc0JhcmVSZXBvc2l0b3J5ID0gIWlzX2RpcihzcHJpbnRmKCclcy8uZ2l0JywgcnRyaW0oJGN3ZCwgJy8nKSkpOwppZiAoJGlzQmFyZVJlcG9zaXRvcnkpIHsKJGNvbmZpZ1ZhbHVlID0gJyc7CiR0aGlzLT5ydW5Qcm9jZXNzKFsnZ2l0JywgJ2NvbmZpZycsICdzYWZlLmJhcmVSZXBvc2l0b3J5J10sICRjd2QsIFsnR0lUX0RJUicgPT4gJGN3ZF0sICR0dHksICRjb25maWdWYWx1ZSk7CiRjb25maWdWYWx1ZSA9IHRyaW0oJGNvbmZpZ1ZhbHVlKTsKaWYgKCRjb25maWdWYWx1ZSA9PT0gJ2V4cGxpY2l0JykgewokZW52ID0gWydHSVRfRElSJyA9PiAkY3dkXTsKfQp9Cn0KCnJldHVybiAkdGhpcy0+cnVuUHJvY2VzcygkY29tbWFuZCwgJGN3ZCwgJGVudiwgJHR0eSwgJG91dHB1dCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZUFzeW5jKCRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICghJHRoaXMtPmFsbG93QXN5bmMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignWW91IG11c3QgdXNlIHRoZSBQcm9jZXNzRXhlY3V0b3IgaW5zdGFuY2Ugd2hpY2ggaXMgcGFydCBvZiBhIENvbXBvc2VyXExvb3AgaW5zdGFuY2UgdG8gYmUgYWJsZSB0byBydW4gYXN5bmMgcHJvY2Vzc2VzJyk7Cn0KCiRqb2IgPSBbCidpZCcgPT4gJHRoaXMtPmlkR2VuKyssCidzdGF0dXMnID0+IHNlbGY6OlNUQVRVU19RVUVVRUQsCidjb21tYW5kJyA9PiAkY29tbWFuZCwKJ2N3ZCcgPT4gJGN3ZCwKXTsKCiRyZXNvbHZlciA9IHN0YXRpYyBmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpIHVzZSAoJiRqb2IpOiB2b2lkIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19RVUVVRUQ7CiRqb2JbJ3Jlc29sdmUnXSA9ICRyZXNvbHZlOwokam9iWydyZWplY3QnXSA9ICRyZWplY3Q7Cn07CgokY2FuY2VsZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJGpvYik6IHZvaWQgewppZiAoJGpvYlsnc3RhdHVzJ10gPT09IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX1FVRVVFRCkgewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0FCT1JURUQ7Cn0KaWYgKCRqb2JbJ3N0YXR1cyddICE9PSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19TVEFSVEVEKSB7CnJldHVybjsKfQokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0FCT1JURUQ7CnRyeSB7CmlmIChkZWZpbmVkKCdTSUdJTlQnKSkgewokam9iWydwcm9jZXNzJ10tPnNpZ25hbChTSUdJTlQpOwp9Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKCn0KJGpvYlsncHJvY2VzcyddLT5zdG9wKDEpOwoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdBYm9ydGVkIHByb2Nlc3MnKTsKfTsKCiRwcm9taXNlID0gbmV3IFByb21pc2UoJHJlc29sdmVyLCAkY2FuY2VsZXIpOwokcHJvbWlzZSA9ICRwcm9taXNlLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJiRqb2IpIHsKaWYgKCRqb2JbJ3Byb2Nlc3MnXS0+aXNTdWNjZXNzZnVsKCkpIHsKJGpvYlsnc3RhdHVzJ10gPSBQcm9jZXNzRXhlY3V0b3I6OlNUQVRVU19DT01QTEVURUQ7Cn0gZWxzZSB7CiRqb2JbJ3N0YXR1cyddID0gUHJvY2Vzc0V4ZWN1dG9yOjpTVEFUVVNfRkFJTEVEOwp9CgokdGhpcy0+bWFya0pvYkRvbmUoKTsKCnJldHVybiAkam9iWydwcm9jZXNzJ107Cn0sIGZ1bmN0aW9uICgkZSkgdXNlICgmJGpvYik6IHZvaWQgewokam9iWydzdGF0dXMnXSA9IFByb2Nlc3NFeGVjdXRvcjo6U1RBVFVTX0ZBSUxFRDsKCiR0aGlzLT5tYXJrSm9iRG9uZSgpOwoKdGhyb3cgJGU7Cn0pOwokdGhpcy0+am9ic1skam9iWydpZCddXSA9ICYkam9iOwoKaWYgKCR0aGlzLT5ydW5uaW5nSm9icyA8ICR0aGlzLT5tYXhKb2JzKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQoKcmV0dXJuICRwcm9taXNlOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gb3V0cHV0SGFuZGxlcihzdHJpbmcgJHR5cGUsIHN0cmluZyAkYnVmZmVyKTogdm9pZAp7CmlmICgkdGhpcy0+Y2FwdHVyZU91dHB1dCkgewpyZXR1cm47Cn0KCmlmIChudWxsID09PSAkdGhpcy0+aW8pIHsKZWNobyAkYnVmZmVyOwoKcmV0dXJuOwp9CgppZiAoUHJvY2Vzczo6RVJSID09PSAkdHlwZSkgewokdGhpcy0+aW8tPndyaXRlRXJyb3JSYXcoJGJ1ZmZlciwgZmFsc2UpOwp9IGVsc2UgewokdGhpcy0+aW8tPndyaXRlUmF3KCRidWZmZXIsIGZhbHNlKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHN0YXJ0Sm9iKGludCAkaWQpOiB2b2lkCnsKJGpvYiA9ICYkdGhpcy0+am9ic1skaWRdOwppZiAoJGpvYlsnc3RhdHVzJ10gIT09IHNlbGY6OlNUQVRVU19RVUVVRUQpIHsKcmV0dXJuOwp9CgoKJGpvYlsnc3RhdHVzJ10gPSBzZWxmOjpTVEFUVVNfU1RBUlRFRDsKJHRoaXMtPnJ1bm5pbmdKb2JzKys7CgokY29tbWFuZCA9ICRqb2JbJ2NvbW1hbmQnXTsKJGN3ZCA9ICRqb2JbJ2N3ZCddOwoKJHRoaXMtPm91dHB1dENvbW1hbmRSdW4oJGNvbW1hbmQsICRjd2QsIHRydWUpOwoKdHJ5IHsKaWYgKGlzX3N0cmluZygkY29tbWFuZCkpIHsKJHByb2Nlc3MgPSBQcm9jZXNzOjpmcm9tU2hlbGxDb21tYW5kbGluZSgkY29tbWFuZCwgJGN3ZCwgbnVsbCwgbnVsbCwgc3RhdGljOjpnZXRUaW1lb3V0KCkpOwp9IGVsc2UgewokcHJvY2VzcyA9IG5ldyBQcm9jZXNzKCRjb21tYW5kLCAkY3dkLCBudWxsLCBudWxsLCBzdGF0aWM6OmdldFRpbWVvdXQoKSk7Cn0KfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewokam9iWydyZWplY3QnXSgkZSk7CgpyZXR1cm47Cn0KCiRqb2JbJ3Byb2Nlc3MnXSA9ICRwcm9jZXNzOwoKdHJ5IHsKJHByb2Nlc3MtPnN0YXJ0KCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJGpvYlsncmVqZWN0J10oJGUpOwoKcmV0dXJuOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRNYXhKb2JzKGludCAkbWF4Sm9icyk6IHZvaWQKewokdGhpcy0+bWF4Sm9icyA9ICRtYXhKb2JzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVzZXRNYXhKb2JzKCk6IHZvaWQKewppZiAoaXNfbnVtZXJpYygkbWF4Sm9icyA9IFBsYXRmb3JtOjpnZXRFbnYoJ0NPTVBPU0VSX01BWF9QQVJBTExFTF9QUk9DRVNTRVMnKSkpIHsKJHRoaXMtPm1heEpvYnMgPSBtYXgoMSwgbWluKDUwLCAoaW50KSAkbWF4Sm9icykpOwp9IGVsc2UgewokdGhpcy0+bWF4Sm9icyA9IDEwOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0KCRpbmRleCA9IG51bGwpOiB2b2lkCnsKd2hpbGUgKHRydWUpIHsKaWYgKDAgPT09ICR0aGlzLT5jb3VudEFjdGl2ZUpvYnMoJGluZGV4KSkgewpyZXR1cm47Cn0KCnVzbGVlcCgxMDAwKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5hYmxlQXN5bmMoKTogdm9pZAp7CiR0aGlzLT5hbGxvd0FzeW5jID0gdHJ1ZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50QWN0aXZlSm9icygkaW5kZXggPSBudWxsKTogaW50CnsKCmZvcmVhY2ggKCR0aGlzLT5qb2JzIGFzICRqb2IpIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBzZWxmOjpTVEFUVVNfU1RBUlRFRCkgewppZiAoISRqb2JbJ3Byb2Nlc3MnXS0+aXNSdW5uaW5nKCkpIHsKY2FsbF91c2VyX2Z1bmMoJGpvYlsncmVzb2x2ZSddLCAkam9iWydwcm9jZXNzJ10pOwp9Cgokam9iWydwcm9jZXNzJ10tPmNoZWNrVGltZW91dCgpOwp9CgppZiAoJHRoaXMtPnJ1bm5pbmdKb2JzIDwgJHRoaXMtPm1heEpvYnMpIHsKaWYgKCRqb2JbJ3N0YXR1cyddID09PSBzZWxmOjpTVEFUVVNfUVVFVUVEKSB7CiR0aGlzLT5zdGFydEpvYigkam9iWydpZCddKTsKfQp9Cn0KCmlmIChudWxsICE9PSAkaW5kZXgpIHsKcmV0dXJuICR0aGlzLT5qb2JzWyRpbmRleF1bJ3N0YXR1cyddIDwgc2VsZjo6U1RBVFVTX0NPTVBMRVRFRCA/IDEgOiAwOwp9CgokYWN0aXZlID0gMDsKZm9yZWFjaCAoJHRoaXMtPmpvYnMgYXMgJGpvYikgewppZiAoJGpvYlsnc3RhdHVzJ10gPCBzZWxmOjpTVEFUVVNfQ09NUExFVEVEKSB7CiRhY3RpdmUrKzsKfSBlbHNlIHsKdW5zZXQoJHRoaXMtPmpvYnNbJGpvYlsnaWQnXV0pOwp9Cn0KCnJldHVybiAkYWN0aXZlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIG1hcmtKb2JEb25lKCk6IHZvaWQKewokdGhpcy0+cnVubmluZ0pvYnMtLTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNwbGl0TGluZXMoP3N0cmluZyAkb3V0cHV0KTogYXJyYXkKewokb3V0cHV0ID0gdHJpbSgoc3RyaW5nKSAkb3V0cHV0KTsKCnJldHVybiAkb3V0cHV0ID09PSAnJyA/IFtdIDogUHJlZzo6c3BsaXQoJ3tccj9cbn0nLCAkb3V0cHV0KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9yT3V0cHV0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZXJyb3JPdXRwdXQ7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGltZW91dCgpOiBpbnQKewpyZXR1cm4gc3RhdGljOjokdGltZW91dDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRUaW1lb3V0KGludCAkdGltZW91dCk6IHZvaWQKewpzdGF0aWM6OiR0aW1lb3V0ID0gJHRpbWVvdXQ7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZSgkYXJndW1lbnQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6ZXNjYXBlQXJndW1lbnQoJGFyZ3VtZW50KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdXRwdXRDb21tYW5kUnVuKCRjb21tYW5kLCA/c3RyaW5nICRjd2QsIGJvb2wgJGFzeW5jKTogdm9pZAp7CmlmIChudWxsID09PSAkdGhpcy0+aW8gfHwgISR0aGlzLT5pby0+aXNEZWJ1ZygpKSB7CnJldHVybjsKfQoKJGNvbW1hbmRTdHJpbmcgPSBpc19zdHJpbmcoJGNvbW1hbmQpID8gJGNvbW1hbmQgOiBpbXBsb2RlKCcgJywgYXJyYXlfbWFwKHNlbGY6OmNsYXNzLic6OmVzY2FwZScsICRjb21tYW5kKSk7CiRzYWZlQ29tbWFuZCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygnezovLyg/UDx1c2VyPlteOi9cc10rKTooP1A8cGFzc3dvcmQ+W15AXHMvXSspQH1pJywgc3RhdGljIGZ1bmN0aW9uICgkbSk6IHN0cmluZyB7CgppZiAoUHJlZzo6aXNNYXRjaChHaXRIdWI6OkdJVEhVQl9UT0tFTl9SRUdFWCwgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICc6Ly8qKio6KioqQCc7Cn0KaWYgKFByZWc6OmlzTWF0Y2goJ3teW2EtZjAtOV17MTIsfSR9JywgJG1bJ3VzZXInXSkpIHsKcmV0dXJuICc6Ly8qKio6KioqQCc7Cn0KCnJldHVybiAnOi8vJy4kbVsndXNlciddLic6KioqQCc7Cn0sICRjb21tYW5kU3RyaW5nKTsKJHNhZmVDb21tYW5kID0gUHJlZzo6cmVwbGFjZSgiey0tcGFzc3dvcmQgKC4qW15cXFxcXVwnKSB9IiwgJy0tcGFzc3dvcmQgXCcqKipcJyAnLCAkc2FmZUNvbW1hbmQpOwokdGhpcy0+aW8tPndyaXRlRXJyb3IoJ0V4ZWN1dGluZycuKCRhc3luYyA/ICcgYXN5bmMnIDogJycpLicgY29tbWFuZCAoJy4oJGN3ZCA/OiAnQ1dEJykuJyk6ICcuJHNhZmVDb21tYW5kKTsKfQoKCgoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZUFyZ3VtZW50KCRhcmd1bWVudCk6IHN0cmluZwp7CmlmICgnJyA9PT0gKCRhcmd1bWVudCA9IChzdHJpbmcpICRhcmd1bWVudCkpIHsKcmV0dXJuIGVzY2FwZXNoZWxsYXJnKCRhcmd1bWVudCk7Cn0KCmlmICghUGxhdGZvcm06OmlzV2luZG93cygpKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJndW1lbnQpLiInIjsKfQoKCgoKJGFyZ3VtZW50ID0gc3RydHIoJGFyZ3VtZW50LCBbCiJcbiIgPT4gJyAnLAoiXHV7ZmYwMn0iID0+ICciJywKIlx1ezAyYmF9IiA9PiAnIicsCiJcdXszMDFkfSIgPT4gJyInLAoiXHV7MzAxZX0iID0+ICciJywKIlx1ezAzMGV9IiA9PiAnIicsCiJcdXtmZjFhfSIgPT4gJzonLAoiXHV7MDU4OX0iID0+ICc6JywKIlx1ezIyMzZ9IiA9PiAnOicsCiJcdXtmZjBmfSIgPT4gJy8nLAoiXHV7MjA0NH0iID0+ICcvJywKIlx1ezIyMTV9IiA9PiAnLycsCiJcdXswMGI0fSIgPT4gJy8nLApdKTsKCgokcXVvdGUgPSBzdHJwYnJrKCRhcmd1bWVudCwgIiBcdCwiKSAhPT0gZmFsc2U7CiRhcmd1bWVudCA9IFByZWc6OnJlcGxhY2UoJy8oXFxcXCopIi8nLCAnJDEkMVxcIicsICRhcmd1bWVudCwgLTEsICRkcXVvdGVzKTsKJG1ldGEgPSAkZHF1b3RlcyA+IDAgfHwgUHJlZzo6aXNNYXRjaCgnLyVbXiVdKyV8IVteIV0rIS8nLCAkYXJndW1lbnQpOwoKaWYgKCEkbWV0YSAmJiAhJHF1b3RlKSB7CiRxdW90ZSA9IHN0cnBicmsoJGFyZ3VtZW50LCAnXiZ8PD4oKScpICE9PSBmYWxzZTsKfQoKaWYgKCRxdW90ZSkgewokYXJndW1lbnQgPSAnIicuUHJlZzo6cmVwbGFjZSgnLyhcXFxcKikkLycsICckMSQxJywgJGFyZ3VtZW50KS4nIic7Cn0KCmlmICgkbWV0YSkgewokYXJndW1lbnQgPSBQcmVnOjpyZXBsYWNlKCcvKFsiXiZ8PD4oKSVdKS8nLCAnXiQxJywgJGFyZ3VtZW50KTsKJGFyZ3VtZW50ID0gUHJlZzo6cmVwbGFjZSgnLyghKS8nLCAnXl4kMScsICRhcmd1bWVudCk7Cn0KCnJldHVybiAkYXJndW1lbnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXF1aXJlc0dpdERpckVudigkY29tbWFuZCk6IGJvb2wKewokY21kID0gIWlzX2FycmF5KCRjb21tYW5kKSA/IGV4cGxvZGUoJyAnLCAkY29tbWFuZCkgOiAkY29tbWFuZDsKaWYgKCRjbWRbMF0gIT09ICdnaXQnKSB7CnJldHVybiBmYWxzZTsKfQoKZm9yZWFjaCAoc2VsZjo6R0lUX0NNRFNfTkVFRF9HSVRfRElSIGFzICRnaXRDbWQpIHsKaWYgKGFycmF5X2ludGVyc2VjdCgkY21kLCAkZ2l0Q21kKSA9PT0gJGdpdENtZCkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEV4ZWN1dGFibGUoc3RyaW5nICRuYW1lKTogc3RyaW5nCnsKaWYgKFxpbl9hcnJheShzdHJ0b2xvd2VyKCRuYW1lKSwgc2VsZjo6QlVJTFRJTl9DTURfQ09NTUFORFMsIHRydWUpKSB7CnJldHVybiAkbmFtZTsKfQoKaWYgKCFpc3NldChzZWxmOjokZXhlY3V0YWJsZXNbJG5hbWVdKSkgewokcGF0aCA9IChuZXcgRXhlY3V0YWJsZUZpbmRlcigpKS0+ZmluZCgkbmFtZSwgJG5hbWUpOwppZiAoJHBhdGggIT09IG51bGwpIHsKc2VsZjo6JGV4ZWN1dGFibGVzWyRuYW1lXSA9ICRwYXRoOwp9Cn0KCnJldHVybiBzZWxmOjokZXhlY3V0YWJsZXNbJG5hbWVdID8/ICRuYW1lOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ2xvc3VyZTsKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcRG93bmxvYWRlclxUcmFuc3BvcnRFeGNlcHRpb247CnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUmVzcG9uc2U7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwoKCgoKCgoKY2xhc3MgUmVtb3RlRmlsZXN5c3RlbQp7Cgpwcml2YXRlICRpbzsKCnByaXZhdGUgJGNvbmZpZzsKCnByaXZhdGUgJHNjaGVtZTsKCnByaXZhdGUgJGJ5dGVzTWF4OwoKcHJpdmF0ZSAkb3JpZ2luVXJsOwoKcHJpdmF0ZSAkZmlsZVVybDsKCnByaXZhdGUgJGZpbGVOYW1lOwoKcHJpdmF0ZSAkcmV0cnkgPSBmYWxzZTsKCnByaXZhdGUgJHByb2dyZXNzOwoKcHJpdmF0ZSAkbGFzdFByb2dyZXNzOwoKcHJpdmF0ZSAkb3B0aW9ucyA9IFtdOwoKcHJpdmF0ZSAkZGlzYWJsZVRscyA9IGZhbHNlOwoKcHJpdmF0ZSAkbGFzdEhlYWRlcnM7Cgpwcml2YXRlICRzdG9yZUF1dGggPSBmYWxzZTsKCnByaXZhdGUgJGF1dGhIZWxwZXI7Cgpwcml2YXRlICRkZWdyYWRlZE1vZGUgPSBmYWxzZTsKCnByaXZhdGUgJHJlZGlyZWN0czsKCnByaXZhdGUgJG1heFJlZGlyZWN0cyA9IDIwOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChJT0ludGVyZmFjZSAkaW8sIENvbmZpZyAkY29uZmlnLCBhcnJheSAkb3B0aW9ucyA9IFtdLCBib29sICRkaXNhYmxlVGxzID0gZmFsc2UsID9BdXRoSGVscGVyICRhdXRoSGVscGVyID0gbnVsbCkKewokdGhpcy0+aW8gPSAkaW87CgoKCmlmICgkZGlzYWJsZVRscyA9PT0gZmFsc2UpIHsKJHRoaXMtPm9wdGlvbnMgPSBTdHJlYW1Db250ZXh0RmFjdG9yeTo6Z2V0VGxzRGVmYXVsdHMoJG9wdGlvbnMsICRpbyk7Cn0gZWxzZSB7CiR0aGlzLT5kaXNhYmxlVGxzID0gdHJ1ZTsKfQoKCiR0aGlzLT5vcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJHRoaXMtPm9wdGlvbnMsICRvcHRpb25zKTsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5hdXRoSGVscGVyID0gJGF1dGhIZWxwZXIgPz8gbmV3IEF1dGhIZWxwZXIoJGlvLCAkY29uZmlnKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29weShzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCBzdHJpbmcgJGZpbGVOYW1lLCBib29sICRwcm9ncmVzcyA9IHRydWUsIGFycmF5ICRvcHRpb25zID0gW10pCnsKcmV0dXJuICR0aGlzLT5nZXQoJG9yaWdpblVybCwgJGZpbGVVcmwsICRvcHRpb25zLCAkZmlsZU5hbWUsICRwcm9ncmVzcyk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudHMoc3RyaW5nICRvcmlnaW5VcmwsIHN0cmluZyAkZmlsZVVybCwgYm9vbCAkcHJvZ3Jlc3MgPSB0cnVlLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CnJldHVybiAkdGhpcy0+Z2V0KCRvcmlnaW5VcmwsICRmaWxlVXJsLCAkb3B0aW9ucywgbnVsbCwgJHByb2dyZXNzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0T3B0aW9ucygpCnsKcmV0dXJuICR0aGlzLT5vcHRpb25zOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucykKewokdGhpcy0+b3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVGxzRGlzYWJsZWQoKQp7CnJldHVybiAkdGhpcy0+ZGlzYWJsZVRscyA9PT0gdHJ1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TGFzdEhlYWRlcnMoKQp7CnJldHVybiAkdGhpcy0+bGFzdEhlYWRlcnM7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZpbmRTdGF0dXNDb2RlKGFycmF5ICRoZWFkZXJzKQp7CiR2YWx1ZSA9IG51bGw7CmZvcmVhY2ggKCRoZWFkZXJzIGFzICRoZWFkZXIpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3teSFRUUC9cUysgKFxkKyl9aScsICRoZWFkZXIsICRtYXRjaCkpIHsKCgokdmFsdWUgPSAoaW50KSAkbWF0Y2hbMV07Cn0KfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kU3RhdHVzTWVzc2FnZShhcnJheSAkaGVhZGVycykKewokdmFsdWUgPSBudWxsOwpmb3JlYWNoICgkaGVhZGVycyBhcyAkaGVhZGVyKSB7CmlmIChQcmVnOjppc01hdGNoKCd7XkhUVFAvXFMrIFxkK31pJywgJGhlYWRlcikpIHsKCgokdmFsdWUgPSAkaGVhZGVyOwp9Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldChzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMgPSBbXSwgP3N0cmluZyAkZmlsZU5hbWUgPSBudWxsLCBib29sICRwcm9ncmVzcyA9IHRydWUpCnsKJHRoaXMtPnNjaGVtZSA9IHBhcnNlX3VybChzdHJ0cigkZmlsZVVybCwgJ1xcJywgJy8nKSwgUEhQX1VSTF9TQ0hFTUUpOwokdGhpcy0+Ynl0ZXNNYXggPSAwOwokdGhpcy0+b3JpZ2luVXJsID0gJG9yaWdpblVybDsKJHRoaXMtPmZpbGVVcmwgPSAkZmlsZVVybDsKJHRoaXMtPmZpbGVOYW1lID0gJGZpbGVOYW1lOwokdGhpcy0+cHJvZ3Jlc3MgPSAkcHJvZ3Jlc3M7CiR0aGlzLT5sYXN0UHJvZ3Jlc3MgPSBudWxsOwokcmV0cnlBdXRoRmFpbHVyZSA9IHRydWU7CiR0aGlzLT5sYXN0SGVhZGVycyA9IFtdOwokdGhpcy0+cmVkaXJlY3RzID0gMTsgCgokdGVtcEFkZGl0aW9uYWxPcHRpb25zID0gJGFkZGl0aW9uYWxPcHRpb25zOwppZiAoaXNzZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pKSB7CiRyZXRyeUF1dGhGYWlsdXJlID0gKGJvb2wpICR0ZW1wQWRkaXRpb25hbE9wdGlvbnNbJ3JldHJ5LWF1dGgtZmFpbHVyZSddOwoKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmV0cnktYXV0aC1mYWlsdXJlJ10pOwp9CgokaXNSZWRpcmVjdCA9IGZhbHNlOwppZiAoaXNzZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10pKSB7CiR0aGlzLT5yZWRpcmVjdHMgPSAkdGVtcEFkZGl0aW9uYWxPcHRpb25zWydyZWRpcmVjdHMnXTsKJGlzUmVkaXJlY3QgPSB0cnVlOwoKdW5zZXQoJHRlbXBBZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10pOwp9Cgokb3B0aW9ucyA9ICR0aGlzLT5nZXRPcHRpb25zRm9yVXJsKCRvcmlnaW5VcmwsICR0ZW1wQWRkaXRpb25hbE9wdGlvbnMpOwp1bnNldCgkdGVtcEFkZGl0aW9uYWxPcHRpb25zKTsKCiRvcmlnRmlsZVVybCA9ICRmaWxlVXJsOwoKaWYgKGlzc2V0KCRvcHRpb25zWydwcmV2ZW50X2lwX2FjY2Vzc19jYWxsYWJsZSddKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oIlJlbW90ZUZpbGVzeXN0ZW0gZG9lc24ndCBzdXBwb3J0IHRoZSAncHJldmVudF9pcF9hY2Nlc3NfY2FsbGFibGUnIGNvbmZpZy4iKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydnaXRsYWItdG9rZW4nXSkpIHsKJGZpbGVVcmwgLj0gKGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICc/JykgPyAnPycgOiAnJicpIC4gJ2FjY2Vzc190b2tlbj0nLiRvcHRpb25zWydnaXRsYWItdG9rZW4nXTsKdW5zZXQoJG9wdGlvbnNbJ2dpdGxhYi10b2tlbiddKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2lnbm9yZV9lcnJvcnMnXSA9IHRydWU7Cn0KCmlmICgkdGhpcy0+ZGVncmFkZWRNb2RlICYmIHN0cnBvcygkZmlsZVVybCwgJ2h0dHA6Ly9yZXBvLnBhY2thZ2lzdC5vcmcvJykgPT09IDApIHsKCiRmaWxlVXJsID0gJ2h0dHA6Ly8nIC4gZ2V0aG9zdGJ5bmFtZSgncmVwby5wYWNrYWdpc3Qub3JnJykgLiBzdWJzdHIoJGZpbGVVcmwsIDIwKTsKJGRlZ3JhZGVkUGFja2FnaXN0ID0gdHJ1ZTsKfQoKJG1heEZpbGVTaXplID0gbnVsbDsKaWYgKGlzc2V0KCRvcHRpb25zWydtYXhfZmlsZV9zaXplJ10pKSB7CiRtYXhGaWxlU2l6ZSA9ICRvcHRpb25zWydtYXhfZmlsZV9zaXplJ107CnVuc2V0KCRvcHRpb25zWydtYXhfZmlsZV9zaXplJ10pOwp9CgokY3R4ID0gU3RyZWFtQ29udGV4dEZhY3Rvcnk6OmdldENvbnRleHQoJGZpbGVVcmwsICRvcHRpb25zLCBbJ25vdGlmaWNhdGlvbicgPT4gQ2xvc3VyZTo6ZnJvbUNhbGxhYmxlKFskdGhpcywgJ2NhbGxiYWNrR2V0J10pXSk7CgokcHJveHkgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmdldFByb3h5Rm9yUmVxdWVzdCgkZmlsZVVybCk7CiR1c2luZ1Byb3h5ID0gJHByb3h5LT5nZXRTdGF0dXMoJyB1c2luZyBwcm94eSAoJXMpJyk7CiR0aGlzLT5pby0+d3JpdGVFcnJvcigoc3RycG9zKCRvcmlnRmlsZVVybCwgJ2h0dHAnKSA9PT0gMCA/ICdEb3dubG9hZGluZyAnIDogJ1JlYWRpbmcgJykgLiBVcmw6OnNhbml0aXplKCRvcmlnRmlsZVVybCkgLiAkdXNpbmdQcm94eSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKdW5zZXQoJG9yaWdGaWxlVXJsLCAkcHJveHksICR1c2luZ1Byb3h5KTsKCgppZiAoKCFQcmVnOjppc01hdGNoKCd7Xmh0dHA6Ly8ocmVwb1wuKT9wYWNrYWdpc3RcLm9yZy9wL30nLCAkZmlsZVVybCkgfHwgKGZhbHNlID09PSBzdHJwb3MoJGZpbGVVcmwsICckJykgJiYgZmFsc2UgPT09IHN0cnBvcygkZmlsZVVybCwgJyUyNCcpKSkgJiYgZW1wdHkoJGRlZ3JhZGVkUGFja2FnaXN0KSkgewokdGhpcy0+Y29uZmlnLT5wcm9oaWJpdFVybEJ5Q29uZmlnKCRmaWxlVXJsLCAkdGhpcy0+aW8pOwp9CgppZiAoJHRoaXMtPnByb2dyZXNzICYmICEkaXNSZWRpcmVjdCkgewokdGhpcy0+aW8tPndyaXRlRXJyb3IoIkRvd25sb2FkaW5nICg8Y29tbWVudD5jb25uZWN0aW5nLi4uPC9jb21tZW50PikiLCBmYWxzZSk7Cn0KCiRlcnJvck1lc3NhZ2UgPSAnJzsKJGVycm9yQ29kZSA9IDA7CiRyZXN1bHQgPSBmYWxzZTsKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkY29kZSwgJG1zZykgdXNlICgmJGVycm9yTWVzc2FnZSk6IGJvb2wgewppZiAoJGVycm9yTWVzc2FnZSkgewokZXJyb3JNZXNzYWdlIC49ICJcbiI7Cn0KJGVycm9yTWVzc2FnZSAuPSBQcmVnOjpyZXBsYWNlKCd7XmZpbGVfZ2V0X2NvbnRlbnRzXCguKj9cKTogfScsICcnLCAkbXNnKTsKCnJldHVybiB0cnVlOwp9KTsKJGh0dHBfcmVzcG9uc2VfaGVhZGVyID0gW107CnRyeSB7CiRyZXN1bHQgPSAkdGhpcy0+Z2V0UmVtb3RlQ29udGVudHMoJG9yaWdpblVybCwgJGZpbGVVcmwsICRjdHgsICRodHRwX3Jlc3BvbnNlX2hlYWRlciwgJG1heEZpbGVTaXplKTsKCmlmICghZW1wdHkoJGh0dHBfcmVzcG9uc2VfaGVhZGVyWzBdKSkgewokc3RhdHVzQ29kZSA9IHNlbGY6OmZpbmRTdGF0dXNDb2RlKCRodHRwX3Jlc3BvbnNlX2hlYWRlcik7CmlmICgkc3RhdHVzQ29kZSA+PSAzMDAgJiYgUmVzcG9uc2U6OmZpbmRIZWFkZXJWYWx1ZSgkaHR0cF9yZXNwb25zZV9oZWFkZXIsICdjb250ZW50LXR5cGUnKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7Ckh0dHBEb3dubG9hZGVyOjpvdXRwdXRXYXJuaW5ncygkdGhpcy0+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+ZmlsZU5hbWUsICR0aGlzLT5wcm9ncmVzcyk7Cn0KCnRocm93ICRlOwp9CgppZiAoIWVtcHR5KCRodHRwX3Jlc3BvbnNlX2hlYWRlclswXSkpIHsKJHRoaXMtPmxhc3RIZWFkZXJzID0gJGh0dHBfcmVzcG9uc2VfaGVhZGVyOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRSZW1vdGVDb250ZW50cyhzdHJpbmcgJG9yaWdpblVybCwgc3RyaW5nICRmaWxlVXJsLCAkY29udGV4dCwgP2FycmF5ICYkcmVzcG9uc2VIZWFkZXJzID0gbnVsbCwgP2ludCAkbWF4RmlsZVNpemUgPSBudWxsKQp7CiRyZXN1bHQgPSBmYWxzZTsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODA0MDApIHsKaHR0cF9jbGVhcl9sYXN0X3Jlc3BvbnNlX2hlYWRlcnMoKTsKfQoKdHJ5IHsKJGUgPSBudWxsOwppZiAoJG1heEZpbGVTaXplICE9PSBudWxsKSB7CiRyZXN1bHQgPSBmaWxlX2dldF9jb250ZW50cygkZmlsZVVybCwgZmFsc2UsICRjb250ZXh0LCAwLCAkbWF4RmlsZVNpemUpOwp9IGVsc2UgewoKJHJlc3VsdCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlVXJsLCBmYWxzZSwgJGNvbnRleHQpOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKfQoKaWYgKCRyZXN1bHQgIT09IGZhbHNlICYmICRtYXhGaWxlU2l6ZSAhPT0gbnVsbCAmJiBQbGF0Zm9ybTo6c3RybGVuKCRyZXN1bHQpID49ICRtYXhGaWxlU2l6ZSkgewp0aHJvdyBuZXcgTWF4RmlsZVNpemVFeGNlZWRlZEV4Y2VwdGlvbignTWF4aW11bSBhbGxvd2VkIGRvd25sb2FkIHNpemUgcmVhY2hlZC4gRG93bmxvYWRlZCAnIC4gUGxhdGZvcm06OnN0cmxlbigkcmVzdWx0KSAuICcgb2YgYWxsb3dlZCAnIC4gJG1heEZpbGVTaXplIC4gJyBieXRlcycpOwp9CgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDQwMCkgewokcmVzcG9uc2VIZWFkZXJzID0gaHR0cF9nZXRfbGFzdF9yZXNwb25zZV9oZWFkZXJzKCkgPz8gW107Cmh0dHBfY2xlYXJfbGFzdF9yZXNwb25zZV9oZWFkZXJzKCk7Cn0gZWxzZSB7CiRyZXNwb25zZUhlYWRlcnMgPSAkaHR0cF9yZXNwb25zZV9oZWFkZXIgPz8gW107Cn0KCmlmIChudWxsICE9PSAkZSkgewp0aHJvdyAkZTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNhbGxiYWNrR2V0KGludCAkbm90aWZpY2F0aW9uQ29kZSwgaW50ICRzZXZlcml0eSwgP3N0cmluZyAkbWVzc2FnZSwgaW50ICRtZXNzYWdlQ29kZSwgaW50ICRieXRlc1RyYW5zZmVycmVkLCBpbnQgJGJ5dGVzTWF4KQp7CnN3aXRjaCAoJG5vdGlmaWNhdGlvbkNvZGUpIHsKY2FzZSBTVFJFQU1fTk9USUZZX0ZBSUxVUkU6CmlmICg0MDAgPT09ICRtZXNzYWdlQ29kZSkgewoKCnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oIlRoZSAnIiAuICR0aGlzLT5maWxlVXJsIC4gIicgVVJMIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZDogIiAuICRtZXNzYWdlLCAkbWVzc2FnZUNvZGUpOwp9CmJyZWFrOwoKY2FzZSBTVFJFQU1fTk9USUZZX0ZJTEVfU0laRV9JUzoKJHRoaXMtPmJ5dGVzTWF4ID0gJGJ5dGVzTWF4OwpicmVhazsKCmNhc2UgU1RSRUFNX05PVElGWV9QUk9HUkVTUzoKaWYgKCR0aGlzLT5ieXRlc01heCA+IDAgJiYgJHRoaXMtPnByb2dyZXNzKSB7CiRwcm9ncmVzc2lvbiA9IG1pbigxMDAsIChpbnQpIHJvdW5kKCRieXRlc1RyYW5zZmVycmVkIC8gJHRoaXMtPmJ5dGVzTWF4ICogMTAwKSk7CgppZiAoKDAgPT09ICRwcm9ncmVzc2lvbiAlIDUpICYmIDEwMCAhPT0gJHByb2dyZXNzaW9uICYmICRwcm9ncmVzc2lvbiAhPT0gJHRoaXMtPmxhc3RQcm9ncmVzcykgewokdGhpcy0+bGFzdFByb2dyZXNzID0gJHByb2dyZXNzaW9uOwokdGhpcy0+aW8tPm92ZXJ3cml0ZUVycm9yKCJEb3dubG9hZGluZyAoPGNvbW1lbnQ+JHByb2dyZXNzaW9uJTwvY29tbWVudD4pIiwgZmFsc2UpOwp9Cn0KYnJlYWs7CgpkZWZhdWx0OgpicmVhazsKfQp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcHJvbXB0QXV0aEFuZFJldHJ5KCRodHRwU3RhdHVzLCA/c3RyaW5nICRyZWFzb24gPSBudWxsLCBhcnJheSAkaGVhZGVycyA9IFtdKQp7CiRyZXN1bHQgPSAkdGhpcy0+YXV0aEhlbHBlci0+cHJvbXB0QXV0aElmTmVlZGVkKCR0aGlzLT5maWxlVXJsLCAkdGhpcy0+b3JpZ2luVXJsLCAkaHR0cFN0YXR1cywgJHJlYXNvbiwgJGhlYWRlcnMsIDEgKTsKCiR0aGlzLT5zdG9yZUF1dGggPSAkcmVzdWx0WydzdG9yZUF1dGgnXTsKJHRoaXMtPnJldHJ5ID0gJHJlc3VsdFsncmV0cnknXTsKCmlmICgkdGhpcy0+cmV0cnkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignUkVUUlknKTsKfQp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRPcHRpb25zRm9yVXJsKHN0cmluZyAkb3JpZ2luVXJsLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMpCnsKJHRsc09wdGlvbnMgPSBbXTsKJGhlYWRlcnMgPSBbXTsKCmlmIChleHRlbnNpb25fbG9hZGVkKCd6bGliJykpIHsKJGhlYWRlcnNbXSA9ICdBY2NlcHQtRW5jb2Rpbmc6IGd6aXAnOwp9Cgokb3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCR0aGlzLT5vcHRpb25zLCAkdGxzT3B0aW9ucywgJGFkZGl0aW9uYWxPcHRpb25zKTsKaWYgKCEkdGhpcy0+ZGVncmFkZWRNb2RlKSB7CgoKJG9wdGlvbnNbJ2h0dHAnXVsncHJvdG9jb2xfdmVyc2lvbiddID0gMS4xOwokaGVhZGVyc1tdID0gJ0Nvbm5lY3Rpb246IGNsb3NlJzsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSAmJiAhaXNfYXJyYXkoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gZXhwbG9kZSgiXHJcbiIsIHRyaW0oJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10sICJcclxuIikpOwp9CiRvcHRpb25zID0gJHRoaXMtPmF1dGhIZWxwZXItPmFkZEF1dGhlbnRpY2F0aW9uT3B0aW9ucygkb3B0aW9ucywgJG9yaWdpblVybCwgJHRoaXMtPmZpbGVVcmwpOwoKJG9wdGlvbnNbJ2h0dHAnXVsnZm9sbG93X2xvY2F0aW9uJ10gPSAwOwoKZm9yZWFjaCAoJGhlYWRlcnMgYXMgJGhlYWRlcikgewokb3B0aW9uc1snaHR0cCddWydoZWFkZXInXVtdID0gJGhlYWRlcjsKfQoKcmV0dXJuICRvcHRpb25zOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVSZWRpcmVjdChhcnJheSAkcmVzcG9uc2VIZWFkZXJzLCBhcnJheSAkYWRkaXRpb25hbE9wdGlvbnMsICRyZXN1bHQpCnsKaWYgKCRsb2NhdGlvbkhlYWRlciA9IFJlc3BvbnNlOjpmaW5kSGVhZGVyVmFsdWUoJHJlc3BvbnNlSGVhZGVycywgJ2xvY2F0aW9uJykpIHsKaWYgKHBhcnNlX3VybCgkbG9jYXRpb25IZWFkZXIsIFBIUF9VUkxfU0NIRU1FKSkgewoKJHRhcmdldFVybCA9ICRsb2NhdGlvbkhlYWRlcjsKfSBlbHNlaWYgKHBhcnNlX3VybCgkbG9jYXRpb25IZWFkZXIsIFBIUF9VUkxfSE9TVCkpIHsKCiR0YXJnZXRVcmwgPSAkdGhpcy0+c2NoZW1lLic6Jy4kbG9jYXRpb25IZWFkZXI7Cn0gZWxzZWlmICgnLycgPT09ICRsb2NhdGlvbkhlYWRlclswXSkgewoKJHVybEhvc3QgPSBwYXJzZV91cmwoJHRoaXMtPmZpbGVVcmwsIFBIUF9VUkxfSE9TVCk7CgoKJHRhcmdldFVybCA9IFByZWc6OnJlcGxhY2UoJ3teKC4rKD86Ly98QCknLnByZWdfcXVvdGUoJHVybEhvc3QpLicoPzo6XGQrKT8pKD86Wy9cP10uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJHRoaXMtPmZpbGVVcmwpOwp9IGVsc2UgewoKCiR0YXJnZXRVcmwgPSBQcmVnOjpyZXBsYWNlKCd7XiguKy8pW14vP10qKD86XD8uKik/JH0nLCAnXDEnLiRsb2NhdGlvbkhlYWRlciwgJHRoaXMtPmZpbGVVcmwpOwp9Cn0KCmlmICghZW1wdHkoJHRhcmdldFVybCkpIHsKJHRoaXMtPnJlZGlyZWN0cysrOwoKJHRoaXMtPmlvLT53cml0ZUVycm9yKCcnLCB0cnVlLCBJT0ludGVyZmFjZTo6REVCVUcpOwokdGhpcy0+aW8tPndyaXRlRXJyb3Ioc3ByaW50ZignRm9sbG93aW5nIHJlZGlyZWN0ICgldSkgJXMnLCAkdGhpcy0+cmVkaXJlY3RzLCBVcmw6OnNhbml0aXplKCR0YXJnZXRVcmwpKSwgdHJ1ZSwgSU9JbnRlcmZhY2U6OkRFQlVHKTsKCiRhZGRpdGlvbmFsT3B0aW9uc1sncmVkaXJlY3RzJ10gPSAkdGhpcy0+cmVkaXJlY3RzOwoKcmV0dXJuICR0aGlzLT5nZXQocGFyc2VfdXJsKCR0YXJnZXRVcmwsIFBIUF9VUkxfSE9TVCksICR0YXJnZXRVcmwsICRhZGRpdGlvbmFsT3B0aW9ucywgJHRoaXMtPmZpbGVOYW1lLCAkdGhpcy0+cHJvZ3Jlc3MpOwp9CgppZiAoISR0aGlzLT5yZXRyeSkgewokZSA9IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1RoZSAiJy4kdGhpcy0+ZmlsZVVybC4nIiBmaWxlIGNvdWxkIG5vdCBiZSBkb3dubG9hZGVkLCBnb3QgcmVkaXJlY3Qgd2l0aG91dCBMb2NhdGlvbiAoJy4kcmVzcG9uc2VIZWFkZXJzWzBdLicpJyk7CiRlLT5zZXRIZWFkZXJzKCRyZXNwb25zZUhlYWRlcnMpOwokZS0+c2V0UmVzcG9uc2UoJHRoaXMtPmRlY29kZVJlc3VsdCgkcmVzdWx0LCAkcmVzcG9uc2VIZWFkZXJzKSk7Cgp0aHJvdyAkZTsKfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkZWNvZGVSZXN1bHQoJHJlc3VsdCwgYXJyYXkgJHJlc3BvbnNlSGVhZGVycyk6ID9zdHJpbmcKewoKaWYgKCRyZXN1bHQgJiYgZXh0ZW5zaW9uX2xvYWRlZCgnemxpYicpKSB7CiRjb250ZW50RW5jb2RpbmcgPSBSZXNwb25zZTo6ZmluZEhlYWRlclZhbHVlKCRyZXNwb25zZUhlYWRlcnMsICdjb250ZW50LWVuY29kaW5nJyk7CiRkZWNvZGUgPSAkY29udGVudEVuY29kaW5nICYmICdnemlwJyA9PT0gc3RydG9sb3dlcigkY29udGVudEVuY29kaW5nKTsKCmlmICgkZGVjb2RlKSB7CiRyZXN1bHQgPSB6bGliX2RlY29kZSgkcmVzdWx0KTsKCmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdGYWlsZWQgdG8gZGVjb2RlIHpsaWIgc3RyZWFtJyk7Cn0KfQp9CgpyZXR1cm4gJHRoaXMtPm5vcm1hbGl6ZVJlc3VsdCgkcmVzdWx0KTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBub3JtYWxpemVSZXN1bHQoJHJlc3VsdCk6ID9zdHJpbmcKewppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7CgoKCgoKCmNsYXNzIFNpbGVuY2VyCnsKCgoKcHJpdmF0ZSBzdGF0aWMgJHN0YWNrID0gW107CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN1cHByZXNzKD9pbnQgJG1hc2sgPSBudWxsKTogaW50CnsKaWYgKCFpc3NldCgkbWFzaykpIHsKJG1hc2sgPSBFX1dBUk5JTkcgfCBFX05PVElDRSB8IEVfVVNFUl9XQVJOSU5HIHwgRV9VU0VSX05PVElDRSB8IEVfREVQUkVDQVRFRCB8IEVfVVNFUl9ERVBSRUNBVEVEOwp9CiRvbGQgPSBlcnJvcl9yZXBvcnRpbmcoKTsKc2VsZjo6JHN0YWNrW10gPSAkb2xkOwplcnJvcl9yZXBvcnRpbmcoJG9sZCAmIH4kbWFzayk7CgpyZXR1cm4gJG9sZDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXN0b3JlKCk6IHZvaWQKewppZiAoIWVtcHR5KHNlbGY6OiRzdGFjaykpIHsKZXJyb3JfcmVwb3J0aW5nKGFycmF5X3BvcChzZWxmOjokc3RhY2spKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2FsbChjYWxsYWJsZSAkY2FsbGFibGUsIC4uLiRwYXJhbWV0ZXJzKQp7CnRyeSB7CnNlbGY6OnN1cHByZXNzKCk7CiRyZXN1bHQgPSAkY2FsbGFibGUoLi4uJHBhcmFtZXRlcnMpOwpzZWxmOjpyZXN0b3JlKCk7CgpyZXR1cm4gJHJlc3VsdDsKfSBjYXRjaCAoXEV4Y2VwdGlvbiAkZSkgewoKc2VsZjo6cmVzdG9yZSgpOwp0aHJvdyAkZTsKfQp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29tcG9zZXI7CnVzZSBDb21wb3NlclxDYUJ1bmRsZVxDYUJ1bmRsZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcVHJhbnNwb3J0RXhjZXB0aW9uOwp1c2UgQ29tcG9zZXJcUmVwb3NpdG9yeVxQbGF0Zm9ybVJlcG9zaXRvcnk7CnVzZSBDb21wb3NlclxVdGlsXEh0dHBcUHJveHlNYW5hZ2VyOwp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CgoKCgoKCgpmaW5hbCBjbGFzcyBTdHJlYW1Db250ZXh0RmFjdG9yeQp7CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRleHQoc3RyaW5nICR1cmwsIGFycmF5ICRkZWZhdWx0T3B0aW9ucyA9IFtdLCBhcnJheSAkZGVmYXVsdFBhcmFtcyA9IFtdKQp7CiRvcHRpb25zID0gWydodHRwJyA9PiBbCgonZm9sbG93X2xvY2F0aW9uJyA9PiAxLAonbWF4X3JlZGlyZWN0cycgPT4gMjAsCl1dOwoKJG9wdGlvbnMgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkb3B0aW9ucywgc2VsZjo6aW5pdE9wdGlvbnMoJHVybCwgJGRlZmF1bHRPcHRpb25zKSk7CnVuc2V0KCRkZWZhdWx0T3B0aW9uc1snaHR0cCddWydoZWFkZXInXSk7CiRvcHRpb25zID0gYXJyYXlfcmVwbGFjZV9yZWN1cnNpdmUoJG9wdGlvbnMsICRkZWZhdWx0T3B0aW9ucyk7CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gc2VsZjo6Zml4SHR0cEhlYWRlckZpZWxkKCRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKfQoKcmV0dXJuIHN0cmVhbV9jb250ZXh0X2NyZWF0ZSgkb3B0aW9ucywgJGRlZmF1bHRQYXJhbXMpOwp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpbml0T3B0aW9ucyhzdHJpbmcgJHVybCwgYXJyYXkgJG9wdGlvbnMsIGJvb2wgJGZvckN1cmwgPSBmYWxzZSk6IGFycmF5CnsKCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddID0gW107Cn0KaWYgKGlzX3N0cmluZygkb3B0aW9uc1snaHR0cCddWydoZWFkZXInXSkpIHsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10gPSBleHBsb2RlKCJcclxuIiwgJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pOwp9CgoKaWYgKCEkZm9yQ3VybCkgewokcHJveHkgPSBQcm94eU1hbmFnZXI6OmdldEluc3RhbmNlKCktPmdldFByb3h5Rm9yUmVxdWVzdCgkdXJsKTsKJHByb3h5T3B0aW9ucyA9ICRwcm94eS0+Z2V0Q29udGV4dE9wdGlvbnMoKTsKaWYgKCRwcm94eU9wdGlvbnMgIT09IG51bGwpIHsKJGlzSHR0cHNSZXF1ZXN0ID0gMCA9PT0gc3RycG9zKCR1cmwsICdodHRwczovLycpOwoKaWYgKCRwcm94eS0+aXNTZWN1cmUoKSkgewppZiAoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIHVzZSBhIHNlY3VyZSBwcm94eS4nKTsKfQppZiAoJGlzSHR0cHNSZXF1ZXN0KSB7CnRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oJ1lvdSBtdXN0IGVuYWJsZSB0aGUgY3VybCBleHRlbnNpb24gdG8gbWFrZSBodHRwcyByZXF1ZXN0cyB0aHJvdWdoIGEgc2VjdXJlIHByb3h5LicpOwp9Cn0gZWxzZWlmICgkaXNIdHRwc1JlcXVlc3QgJiYgIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSkgewp0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKCdZb3UgbXVzdCBlbmFibGUgdGhlIG9wZW5zc2wgZXh0ZW5zaW9uIHRvIG1ha2UgaHR0cHMgcmVxdWVzdHMgdGhyb3VnaCBhIHByb3h5LicpOwp9CgoKaWYgKGlzc2V0KCRwcm94eU9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pKSB7CiRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddW10gPSAkcHJveHlPcHRpb25zWydodHRwJ11bJ2hlYWRlciddOwp1bnNldCgkcHJveHlPcHRpb25zWydodHRwJ11bJ2hlYWRlciddKTsKfQokb3B0aW9ucyA9IGFycmF5X3JlcGxhY2VfcmVjdXJzaXZlKCRvcHRpb25zLCAkcHJveHlPcHRpb25zKTsKfQp9CgppZiAoZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKJHBocFZlcnNpb24gPSAnSEhWTSAnIC4gSEhWTV9WRVJTSU9OOwp9IGVsc2UgewokcGhwVmVyc2lvbiA9ICdQSFAgJyAuIFBIUF9NQUpPUl9WRVJTSU9OIC4gJy4nIC4gUEhQX01JTk9SX1ZFUlNJT04gLiAnLicgLiBQSFBfUkVMRUFTRV9WRVJTSU9OOwp9CgppZiAoJGZvckN1cmwpIHsKJGN1cmwgPSBjdXJsX3ZlcnNpb24oKTsKJGh0dHBWZXJzaW9uID0gJ2NVUkwgJy4kY3VybFsndmVyc2lvbiddOwp9IGVsc2UgewokaHR0cFZlcnNpb24gPSAnc3RyZWFtcyc7Cn0KCmlmICghaXNzZXQoJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ10pIHx8IGZhbHNlID09PSBzdHJpcG9zKGltcGxvZGUoJycsICRvcHRpb25zWydodHRwJ11bJ2hlYWRlciddKSwgJ3VzZXItYWdlbnQnKSkgewokcGxhdGZvcm1QaHBWZXJzaW9uID0gUGxhdGZvcm1SZXBvc2l0b3J5OjpnZXRQbGF0Zm9ybVBocFZlcnNpb24oKTsKJG9wdGlvbnNbJ2h0dHAnXVsnaGVhZGVyJ11bXSA9IHNwcmludGYoCidVc2VyLUFnZW50OiBDb21wb3Nlci8lcyAoJXM7ICVzOyAlczsgJXMlcyVzKScsCkNvbXBvc2VyOjpnZXRWZXJzaW9uKCksCmZ1bmN0aW9uX2V4aXN0cygncGhwX3VuYW1lJykgPyBwaHBfdW5hbWUoJ3MnKSA6ICdVbmtub3duJywKZnVuY3Rpb25fZXhpc3RzKCdwaHBfdW5hbWUnKSA/IHBocF91bmFtZSgncicpIDogJ1Vua25vd24nLAokcGhwVmVyc2lvbiwKJGh0dHBWZXJzaW9uLAokcGxhdGZvcm1QaHBWZXJzaW9uID8gJzsgUGxhdGZvcm0tUEhQICcuJHBsYXRmb3JtUGhwVmVyc2lvbiA6ICcnLApQbGF0Zm9ybTo6Z2V0RW52KCdDSScpID8gJzsgQ0knIDogJycKKTsKfQoKcmV0dXJuICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VGxzRGVmYXVsdHMoYXJyYXkgJG9wdGlvbnMsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpOiBhcnJheQp7CiRjaXBoZXJzID0gaW1wbG9kZSgnOicsIFsKJ0VDREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidFQ0RIRS1FQ0RTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidFQ0RIRS1SU0EtQUVTMjU2LUdDTS1TSEEzODQnLAonRUNESEUtRUNEU0EtQUVTMjU2LUdDTS1TSEEzODQnLAonREhFLVJTQS1BRVMxMjgtR0NNLVNIQTI1NicsCidESEUtRFNTLUFFUzEyOC1HQ00tU0hBMjU2JywKJ2tFREgrQUVTR0NNJywKJ0VDREhFLVJTQS1BRVMxMjgtU0hBMjU2JywKJ0VDREhFLUVDRFNBLUFFUzEyOC1TSEEyNTYnLAonRUNESEUtUlNBLUFFUzEyOC1TSEEnLAonRUNESEUtRUNEU0EtQUVTMTI4LVNIQScsCidFQ0RIRS1SU0EtQUVTMjU2LVNIQTM4NCcsCidFQ0RIRS1FQ0RTQS1BRVMyNTYtU0hBMzg0JywKJ0VDREhFLVJTQS1BRVMyNTYtU0hBJywKJ0VDREhFLUVDRFNBLUFFUzI1Ni1TSEEnLAonREhFLVJTQS1BRVMxMjgtU0hBMjU2JywKJ0RIRS1SU0EtQUVTMTI4LVNIQScsCidESEUtRFNTLUFFUzEyOC1TSEEyNTYnLAonREhFLVJTQS1BRVMyNTYtU0hBMjU2JywKJ0RIRS1EU1MtQUVTMjU2LVNIQScsCidESEUtUlNBLUFFUzI1Ni1TSEEnLAonQUVTMTI4LUdDTS1TSEEyNTYnLAonQUVTMjU2LUdDTS1TSEEzODQnLAonQUVTMTI4LVNIQTI1NicsCidBRVMyNTYtU0hBMjU2JywKJ0FFUzEyOC1TSEEnLAonQUVTMjU2LVNIQScsCidBRVMnLAonQ0FNRUxMSUEnLAonREVTLUNCQzMtU0hBJywKJyFhTlVMTCcsCichZU5VTEwnLAonIUVYUE9SVCcsCichREVTJywKJyFSQzQnLAonIU1ENScsCichUFNLJywKJyFhRUNESCcsCichRURILURTUy1ERVMtQ0JDMy1TSEEnLAonIUVESC1SU0EtREVTLUNCQzMtU0hBJywKJyFLUkI1LURFUy1DQkMzLVNIQScsCl0pOwoKCgoKCgoKJGRlZmF1bHRzID0gWwonc3NsJyA9PiBbCidjaXBoZXJzJyA9PiAkY2lwaGVycywKJ3ZlcmlmeV9wZWVyJyA9PiB0cnVlLAondmVyaWZ5X2RlcHRoJyA9PiA3LAonU05JX2VuYWJsZWQnID0+IHRydWUsCidjYXB0dXJlX3BlZXJfY2VydCcgPT4gdHJ1ZSwKXSwKXTsKCmlmIChpc3NldCgkb3B0aW9uc1snc3NsJ10pKSB7CiRkZWZhdWx0c1snc3NsJ10gPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZSgkZGVmYXVsdHNbJ3NzbCddLCAkb3B0aW9uc1snc3NsJ10pOwp9CgoKCgoKaWYgKCFpc3NldCgkZGVmYXVsdHNbJ3NzbCddWydjYWZpbGUnXSkgJiYgIWlzc2V0KCRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddKSkgewokcmVzdWx0ID0gQ2FCdW5kbGU6OmdldFN5c3RlbUNhUm9vdEJ1bmRsZVBhdGgoJGxvZ2dlcik7CgppZiAoaXNfZGlyKCRyZXN1bHQpKSB7CiRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddID0gJHJlc3VsdDsKfSBlbHNlIHsKJGRlZmF1bHRzWydzc2wnXVsnY2FmaWxlJ10gPSAkcmVzdWx0Owp9Cn0KCmlmIChpc3NldCgkZGVmYXVsdHNbJ3NzbCddWydjYWZpbGUnXSkgJiYgKCFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddKSB8fCAhQ2FCdW5kbGU6OnZhbGlkYXRlQ2FGaWxlKCRkZWZhdWx0c1snc3NsJ11bJ2NhZmlsZSddLCAkbG9nZ2VyKSkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlIGNvbmZpZ3VyZWQgY2FmaWxlIHdhcyBub3QgdmFsaWQgb3IgY291bGQgbm90IGJlIHJlYWQuJyk7Cn0KCmlmIChpc3NldCgkZGVmYXVsdHNbJ3NzbCddWydjYXBhdGgnXSkgJiYgKCFpc19kaXIoJGRlZmF1bHRzWydzc2wnXVsnY2FwYXRoJ10pIHx8ICFGaWxlc3lzdGVtOjppc1JlYWRhYmxlKCRkZWZhdWx0c1snc3NsJ11bJ2NhcGF0aCddKSkpIHsKdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbignVGhlIGNvbmZpZ3VyZWQgY2FwYXRoIHdhcyBub3QgdmFsaWQgb3IgY291bGQgbm90IGJlIHJlYWQuJyk7Cn0KCgoKCiRkZWZhdWx0c1snc3NsJ11bJ2Rpc2FibGVfY29tcHJlc3Npb24nXSA9IHRydWU7CgpyZXR1cm4gJGRlZmF1bHRzOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZml4SHR0cEhlYWRlckZpZWxkKCRoZWFkZXIpOiBhcnJheQp7CmlmICghaXNfYXJyYXkoJGhlYWRlcikpIHsKJGhlYWRlciA9IGV4cGxvZGUoIlxyXG4iLCAkaGVhZGVyKTsKfQp1YXNvcnQoJGhlYWRlciwgc3RhdGljIGZ1bmN0aW9uICgkZWwpOiBpbnQgewpyZXR1cm4gc3RyaXBvcygkZWwsICdjb250ZW50LXR5cGUnKSA9PT0gMCA/IDEgOiAtMTsKfSk7CgpyZXR1cm4gJGhlYWRlcjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENvbmZpZzsKdXNlIENvbXBvc2VyXElPXElPSW50ZXJmYWNlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCmNsYXNzIFN2bgp7CnByaXZhdGUgY29uc3QgTUFYX1FUWV9BVVRIX1RSSUVTID0gNTsKCgoKCnByb3RlY3RlZCAkY3JlZGVudGlhbHM7CgoKCgpwcm90ZWN0ZWQgJGhhc0F1dGg7CgoKCgpwcm90ZWN0ZWQgJGlvOwoKCgoKcHJvdGVjdGVkICR1cmw7CgoKCgpwcm90ZWN0ZWQgJGNhY2hlQ3JlZGVudGlhbHMgPSB0cnVlOwoKCgoKcHJvdGVjdGVkICRwcm9jZXNzOwoKCgoKcHJvdGVjdGVkICRxdHlBdXRoVHJpZXMgPSAwOwoKCgoKcHJvdGVjdGVkICRjb25maWc7CgoKCgpwcml2YXRlIHN0YXRpYyAkdmVyc2lvbjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHVybCwgSU9JbnRlcmZhY2UgJGlvLCBDb25maWcgJGNvbmZpZywgP1Byb2Nlc3NFeGVjdXRvciAkcHJvY2VzcyA9IG51bGwpCnsKJHRoaXMtPnVybCA9ICR1cmw7CiR0aGlzLT5pbyA9ICRpbzsKJHRoaXMtPmNvbmZpZyA9ICRjb25maWc7CiR0aGlzLT5wcm9jZXNzID0gJHByb2Nlc3MgPzogbmV3IFByb2Nlc3NFeGVjdXRvcigkaW8pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNsZWFuRW52KCk6IHZvaWQKewoKUGxhdGZvcm06OmNsZWFyRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZShhcnJheSAkY29tbWFuZCwgc3RyaW5nICR1cmwsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsLCBib29sICR2ZXJib3NlID0gZmFsc2UpOiBzdHJpbmcKewoKJHRoaXMtPmNvbmZpZy0+cHJvaGliaXRVcmxCeUNvbmZpZygkdXJsLCAkdGhpcy0+aW8pOwoKcmV0dXJuICR0aGlzLT5leGVjdXRlV2l0aEF1dGhSZXRyeSgkY29tbWFuZCwgJGN3ZCwgJHVybCwgJHBhdGgsICR2ZXJib3NlKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhlY3V0ZUxvY2FsKGFycmF5ICRjb21tYW5kLCBzdHJpbmcgJHBhdGgsID9zdHJpbmcgJGN3ZCA9IG51bGwsIGJvb2wgJHZlcmJvc2UgPSBmYWxzZSk6IHN0cmluZwp7CgpyZXR1cm4gJHRoaXMtPmV4ZWN1dGVXaXRoQXV0aFJldHJ5KCRjb21tYW5kLCAkY3dkLCAnJywgJHBhdGgsICR2ZXJib3NlKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleGVjdXRlV2l0aEF1dGhSZXRyeShhcnJheSAkc3ZuQ29tbWFuZCwgP3N0cmluZyAkY3dkLCBzdHJpbmcgJHVybCwgP3N0cmluZyAkcGF0aCwgYm9vbCAkdmVyYm9zZSk6ID9zdHJpbmcKewoKJGNvbW1hbmQgPSAkdGhpcy0+Z2V0Q29tbWFuZCgkc3ZuQ29tbWFuZCwgJHVybCwgJHBhdGgpOwoKJG91dHB1dCA9IG51bGw7CiRpbyA9ICR0aGlzLT5pbzsKJGhhbmRsZXIgPSBzdGF0aWMgZnVuY3Rpb24gKCR0eXBlLCAkYnVmZmVyKSB1c2UgKCYkb3V0cHV0LCAkaW8sICR2ZXJib3NlKSB7CmlmICgkdHlwZSAhPT0gJ291dCcpIHsKcmV0dXJuIG51bGw7Cn0KaWYgKHN0cnBvcygkYnVmZmVyLCAnUmVkaXJlY3RpbmcgdG8gVVJMICcpID09PSAwKSB7CnJldHVybiBudWxsOwp9CiRvdXRwdXQgLj0gJGJ1ZmZlcjsKaWYgKCR2ZXJib3NlKSB7CiRpby0+d3JpdGVFcnJvcigkYnVmZmVyLCBmYWxzZSk7Cn0KfTsKJHN0YXR1cyA9ICR0aGlzLT5wcm9jZXNzLT5leGVjdXRlKCRjb21tYW5kLCAkaGFuZGxlciwgJGN3ZCk7CmlmICgwID09PSAkc3RhdHVzKSB7CnJldHVybiAkb3V0cHV0Owp9CgokZXJyb3JPdXRwdXQgPSAkdGhpcy0+cHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKTsKJGZ1bGxPdXRwdXQgPSB0cmltKGltcGxvZGUoIlxuIiwgWyRvdXRwdXQsICRlcnJvck91dHB1dF0pKTsKCgppZiAoZmFsc2UgPT09IHN0cmlwb3MoJGZ1bGxPdXRwdXQsICdDb3VsZCBub3QgYXV0aGVudGljYXRlIHRvIHNlcnZlcjonKQomJiBmYWxzZSA9PT0gc3RyaXBvcygkZnVsbE91dHB1dCwgJ2F1dGhvcml6YXRpb24gZmFpbGVkJykKJiYgZmFsc2UgPT09IHN0cmlwb3MoJGZ1bGxPdXRwdXQsICdzdm46IEUxNzAwMDE6JykKJiYgZmFsc2UgPT09IHN0cmlwb3MoJGZ1bGxPdXRwdXQsICdzdm46IEUyMTUwMDQ6JykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCRmdWxsT3V0cHV0KTsKfQoKaWYgKCEkdGhpcy0+aGFzQXV0aCgpKSB7CiR0aGlzLT5kb0F1dGhEYW5jZSgpOwp9CgoKaWYgKCR0aGlzLT5xdHlBdXRoVHJpZXMrKyA8IHNlbGY6Ok1BWF9RVFlfQVVUSF9UUklFUykgewoKcmV0dXJuICR0aGlzLT5leGVjdXRlV2l0aEF1dGhSZXRyeSgkc3ZuQ29tbWFuZCwgJGN3ZCwgJHVybCwgJHBhdGgsICR2ZXJib3NlKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAond3JvbmcgY3JlZGVudGlhbHMgcHJvdmlkZWQgKCcuJGZ1bGxPdXRwdXQuJyknCik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDYWNoZUNyZWRlbnRpYWxzKGJvb2wgJGNhY2hlQ3JlZGVudGlhbHMpOiB2b2lkCnsKJHRoaXMtPmNhY2hlQ3JlZGVudGlhbHMgPSAkY2FjaGVDcmVkZW50aWFsczsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9BdXRoRGFuY2UoKTogU3ZuCnsKCmlmICghJHRoaXMtPmlvLT5pc0ludGVyYWN0aXZlKCkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonY2FuIG5vdCBhc2sgZm9yIGF1dGhlbnRpY2F0aW9uIGluIG5vbiBpbnRlcmFjdGl2ZSBtb2RlJwopOwp9CgokdGhpcy0+aW8tPndyaXRlRXJyb3IoIlRoZSBTdWJ2ZXJzaW9uIHNlcnZlciAoeyR0aGlzLT51cmx9KSByZXF1ZXN0ZWQgY3JlZGVudGlhbHM6Iik7CgokdGhpcy0+aGFzQXV0aCA9IHRydWU7CiR0aGlzLT5jcmVkZW50aWFscyA9IFsKJ3VzZXJuYW1lJyA9PiAoc3RyaW5nKSAkdGhpcy0+aW8tPmFzaygiVXNlcm5hbWU6ICIsICcnKSwKJ3Bhc3N3b3JkJyA9PiAoc3RyaW5nKSAkdGhpcy0+aW8tPmFza0FuZEhpZGVBbnN3ZXIoIlBhc3N3b3JkOiAiKSwKXTsKCiR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzID0gJHRoaXMtPmlvLT5hc2tDb25maXJtYXRpb24oIlNob3VsZCBTdWJ2ZXJzaW9uIGNhY2hlIHRoZXNlIGNyZWRlbnRpYWxzPyAoeWVzL25vKSAiKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldENvbW1hbmQoYXJyYXkgJGNtZCwgc3RyaW5nICR1cmwsID9zdHJpbmcgJHBhdGggPSBudWxsKTogYXJyYXkKewokY21kID0gYXJyYXlfbWVyZ2UoCiRjbWQsClsnLS1ub24taW50ZXJhY3RpdmUnXSwKJHRoaXMtPmdldENyZWRlbnRpYWxBcmdzKCksClsnLS0nLCAkdXJsXQopOwoKaWYgKCRwYXRoICE9PSBudWxsKSB7CiRjbWRbXSA9ICRwYXRoOwp9CgpyZXR1cm4gJGNtZDsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDcmVkZW50aWFsQXJncygpOiBhcnJheQp7CmlmICghJHRoaXMtPmhhc0F1dGgoKSkgewpyZXR1cm4gW107Cn0KCnJldHVybiBhcnJheV9tZXJnZSgKJHRoaXMtPmdldEF1dGhDYWNoZUFyZ3MoKSwKWyctLXVzZXJuYW1lJywgJHRoaXMtPmdldFVzZXJuYW1lKCksICctLXBhc3N3b3JkJywgJHRoaXMtPmdldFBhc3N3b3JkKCldCik7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFBhc3N3b3JkKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Y3JlZGVudGlhbHMgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigiTm8gc3ZuIGF1dGggZGV0ZWN0ZWQuIik7Cn0KCnJldHVybiAkdGhpcy0+Y3JlZGVudGlhbHNbJ3Bhc3N3b3JkJ107Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldFVzZXJuYW1lKCk6IHN0cmluZwp7CmlmICgkdGhpcy0+Y3JlZGVudGlhbHMgPT09IG51bGwpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbigiTm8gc3ZuIGF1dGggZGV0ZWN0ZWQuIik7Cn0KCnJldHVybiAkdGhpcy0+Y3JlZGVudGlhbHNbJ3VzZXJuYW1lJ107Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNBdXRoKCk6IGJvb2wKewppZiAobnVsbCAhPT0gJHRoaXMtPmhhc0F1dGgpIHsKcmV0dXJuICR0aGlzLT5oYXNBdXRoOwp9CgppZiAoZmFsc2UgPT09ICR0aGlzLT5jcmVhdGVBdXRoRnJvbUNvbmZpZygpKSB7CiR0aGlzLT5jcmVhdGVBdXRoRnJvbVVybCgpOwp9CgpyZXR1cm4gKGJvb2wpICR0aGlzLT5oYXNBdXRoOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRBdXRoQ2FjaGVBcmdzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5jYWNoZUNyZWRlbnRpYWxzID8gW10gOiBbJy0tbm8tYXV0aC1jYWNoZSddOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUF1dGhGcm9tQ29uZmlnKCk6IGJvb2wKewppZiAoISR0aGlzLT5jb25maWctPmhhcygnaHR0cC1iYXNpYycpKSB7CnJldHVybiAkdGhpcy0+aGFzQXV0aCA9IGZhbHNlOwp9CgokYXV0aENvbmZpZyA9ICR0aGlzLT5jb25maWctPmdldCgnaHR0cC1iYXNpYycpOwoKJGhvc3QgPSBwYXJzZV91cmwoJHRoaXMtPnVybCwgUEhQX1VSTF9IT1NUKTsKaWYgKGlzc2V0KCRhdXRoQ29uZmlnWyRob3N0XSkpIHsKJHRoaXMtPmNyZWRlbnRpYWxzID0gWwondXNlcm5hbWUnID0+ICRhdXRoQ29uZmlnWyRob3N0XVsndXNlcm5hbWUnXSwKJ3Bhc3N3b3JkJyA9PiAkYXV0aENvbmZpZ1skaG9zdF1bJ3Bhc3N3b3JkJ10sCl07CgpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSB0cnVlOwp9CgpyZXR1cm4gJHRoaXMtPmhhc0F1dGggPSBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVBdXRoRnJvbVVybCgpOiBib29sCnsKJHVyaSA9IHBhcnNlX3VybCgkdGhpcy0+dXJsKTsKaWYgKGVtcHR5KCR1cmlbJ3VzZXInXSkpIHsKcmV0dXJuICR0aGlzLT5oYXNBdXRoID0gZmFsc2U7Cn0KCiR0aGlzLT5jcmVkZW50aWFscyA9IFsKJ3VzZXJuYW1lJyA9PiAkdXJpWyd1c2VyJ10sCidwYXNzd29yZCcgPT4gIWVtcHR5KCR1cmlbJ3Bhc3MnXSkgPyAkdXJpWydwYXNzJ10gOiAnJywKXTsKCnJldHVybiAkdGhpcy0+aGFzQXV0aCA9IHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBiaW5hcnlWZXJzaW9uKCk6ID9zdHJpbmcKewppZiAoIXNlbGY6OiR2ZXJzaW9uKSB7CmlmICgwID09PSAkdGhpcy0+cHJvY2Vzcy0+ZXhlY3V0ZShbJ3N2bicsICctLXZlcnNpb24nXSwgJG91dHB1dCkpIHsKaWYgKFByZWc6OmlzTWF0Y2goJ3soXGQrKD86XC5cZCspKyl9JywgJG91dHB1dCwgJG1hdGNoKSkgewpzZWxmOjokdmVyc2lvbiA9ICRtYXRjaFsxXTsKfQp9Cn0KCnJldHVybiBzZWxmOjokdmVyc2lvbjsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRlckludGVyZmFjZTsKdXNlIENvbXBvc2VyXERvd25sb2FkZXJcRG93bmxvYWRNYW5hZ2VyOwp1c2UgQ29tcG9zZXJcUGFja2FnZVxQYWNrYWdlSW50ZXJmYWNlOwp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwoKY2xhc3MgU3luY0hlbHBlcgp7CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBkb3dubG9hZEFuZEluc3RhbGxQYWNrYWdlU3luYyhMb29wICRsb29wLCAkZG93bmxvYWRlciwgc3RyaW5nICRwYXRoLCBQYWNrYWdlSW50ZXJmYWNlICRwYWNrYWdlLCA/UGFja2FnZUludGVyZmFjZSAkcHJldlBhY2thZ2UgPSBudWxsKTogdm9pZAp7CmFzc2VydCgkZG93bmxvYWRlciBpbnN0YW5jZW9mIERvd25sb2FkZXJJbnRlcmZhY2UgfHwgJGRvd25sb2FkZXIgaW5zdGFuY2VvZiBEb3dubG9hZE1hbmFnZXIpOwoKJHR5cGUgPSAkcHJldlBhY2thZ2UgIT09IG51bGwgPyAndXBkYXRlJyA6ICdpbnN0YWxsJzsKCnRyeSB7CnNlbGY6OmF3YWl0KCRsb29wLCAkZG93bmxvYWRlci0+ZG93bmxvYWQoJHBhY2thZ2UsICRwYXRoLCAkcHJldlBhY2thZ2UpKTsKCnNlbGY6OmF3YWl0KCRsb29wLCAkZG93bmxvYWRlci0+cHJlcGFyZSgkdHlwZSwgJHBhY2thZ2UsICRwYXRoLCAkcHJldlBhY2thZ2UpKTsKCmlmICgkdHlwZSA9PT0gJ3VwZGF0ZScgJiYgJHByZXZQYWNrYWdlICE9PSBudWxsKSB7CnNlbGY6OmF3YWl0KCRsb29wLCAkZG93bmxvYWRlci0+dXBkYXRlKCRwYWNrYWdlLCAkcHJldlBhY2thZ2UsICRwYXRoKSk7Cn0gZWxzZSB7CnNlbGY6OmF3YWl0KCRsb29wLCAkZG93bmxvYWRlci0+aW5zdGFsbCgkcGFja2FnZSwgJHBhdGgpKTsKfQp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CnNlbGY6OmF3YWl0KCRsb29wLCAkZG93bmxvYWRlci0+Y2xlYW51cCgkdHlwZSwgJHBhY2thZ2UsICRwYXRoLCAkcHJldlBhY2thZ2UpKTsKdGhyb3cgJGU7Cn0KCnNlbGY6OmF3YWl0KCRsb29wLCAkZG93bmxvYWRlci0+Y2xlYW51cCgkdHlwZSwgJHBhY2thZ2UsICRwYXRoLCAkcHJldlBhY2thZ2UpKTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBhd2FpdChMb29wICRsb29wLCA/UHJvbWlzZUludGVyZmFjZSAkcHJvbWlzZSA9IG51bGwpOiB2b2lkCnsKaWYgKCRwcm9taXNlICE9PSBudWxsKSB7CiRsb29wLT53YWl0KFskcHJvbWlzZV0pOwp9Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCgoKCmNsYXNzIFRhcgp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJKc29uKHN0cmluZyAkcGF0aFRvQXJjaGl2ZSk6ID9zdHJpbmcKewokcGhhciA9IG5ldyBcUGhhckRhdGEoJHBhdGhUb0FyY2hpdmUpOwoKaWYgKCEkcGhhci0+dmFsaWQoKSkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIHNlbGY6OmV4dHJhY3RDb21wb3Nlckpzb25Gcm9tRm9sZGVyKCRwaGFyKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZXh0cmFjdENvbXBvc2VySnNvbkZyb21Gb2xkZXIoXFBoYXJEYXRhICRwaGFyKTogc3RyaW5nCnsKaWYgKGlzc2V0KCRwaGFyWydjb21wb3Nlci5qc29uJ10pKSB7CnJldHVybiAkcGhhclsnY29tcG9zZXIuanNvbiddLT5nZXRDb250ZW50KCk7Cn0KCiR0b3BMZXZlbFBhdGhzID0gW107CmZvcmVhY2ggKCRwaGFyIGFzICRmb2xkZXJGaWxlKSB7CiRuYW1lID0gJGZvbGRlckZpbGUtPmdldEJhc2VuYW1lKCk7CgppZiAoJGZvbGRlckZpbGUtPmlzRGlyKCkpIHsKJHRvcExldmVsUGF0aHNbJG5hbWVdID0gdHJ1ZTsKaWYgKFxjb3VudCgkdG9wTGV2ZWxQYXRocykgPiAxKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQXJjaGl2ZSBoYXMgbW9yZSB0aGFuIG9uZSB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMsIGFuZCBubyBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBvbiB0aGUgdG9wIGxldmVsLCBzbyBpdFwncyBhbiBpbnZhbGlkIGFyY2hpdmUuIFRvcCBsZXZlbCBwYXRocyBmb3VuZCB3ZXJlOiAnLmltcGxvZGUoJywnLCBhcnJheV9rZXlzKCR0b3BMZXZlbFBhdGhzKSkpOwp9Cn0KfQoKJGNvbXBvc2VySnNvblBhdGggPSBrZXkoJHRvcExldmVsUGF0aHMpLicvY29tcG9zZXIuanNvbic7CmlmIChcY291bnQoJHRvcExldmVsUGF0aHMpID4gMCAmJiBpc3NldCgkcGhhclskY29tcG9zZXJKc29uUGF0aF0pKSB7CnJldHVybiAkcGhhclskY29tcG9zZXJKc29uUGF0aF0tPmdldENvbnRlbnQoKTsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGVpdGhlciBhdCB0aGUgdG9wIGxldmVsIG9yIHdpdGhpbiB0aGUgdG9wbW9zdCBkaXJlY3RvcnknKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxVdGlsOwoKdXNlIENvbXBvc2VyXENhQnVuZGxlXENhQnVuZGxlOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKCmZpbmFsIGNsYXNzIFRsc0hlbHBlcgp7CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNoZWNrQ2VydGlmaWNhdGVIb3N0KCRjZXJ0aWZpY2F0ZSwgc3RyaW5nICRob3N0bmFtZSwgP3N0cmluZyAmJGNuID0gbnVsbCk6IGJvb2wKewokbmFtZXMgPSBzZWxmOjpnZXRDZXJ0aWZpY2F0ZU5hbWVzKCRjZXJ0aWZpY2F0ZSk7CgppZiAoZW1wdHkoJG5hbWVzKSkgewpyZXR1cm4gZmFsc2U7Cn0KCiRjb21iaW5lZE5hbWVzID0gYXJyYXlfbWVyZ2UoJG5hbWVzWydzYW4nXSwgWyRuYW1lc1snY24nXV0pOwokaG9zdG5hbWUgPSBzdHJ0b2xvd2VyKCRob3N0bmFtZSk7Cgpmb3JlYWNoICgkY29tYmluZWROYW1lcyBhcyAkY2VydE5hbWUpIHsKJG1hdGNoZXIgPSBzZWxmOjpjZXJ0TmFtZU1hdGNoZXIoJGNlcnROYW1lKTsKCmlmICgkbWF0Y2hlciAmJiAkbWF0Y2hlcigkaG9zdG5hbWUpKSB7CiRjbiA9ICRuYW1lc1snY24nXTsKCnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q2VydGlmaWNhdGVOYW1lcygkY2VydGlmaWNhdGUpOiA/YXJyYXkKewppZiAoaXNfYXJyYXkoJGNlcnRpZmljYXRlKSkgewokaW5mbyA9ICRjZXJ0aWZpY2F0ZTsKfSBlbHNlaWYgKENhQnVuZGxlOjppc09wZW5zc2xQYXJzZVNhZmUoKSkgewokaW5mbyA9IG9wZW5zc2xfeDUwOV9wYXJzZSgkY2VydGlmaWNhdGUsIGZhbHNlKTsKfQoKaWYgKCFpc3NldCgkaW5mb1snc3ViamVjdCddWydjb21tb25OYW1lJ10pKSB7CnJldHVybiBudWxsOwp9CgokY29tbW9uTmFtZSA9IHN0cnRvbG93ZXIoJGluZm9bJ3N1YmplY3QnXVsnY29tbW9uTmFtZSddKTsKJHN1YmplY3RBbHROYW1lcyA9IFtdOwoKaWYgKGlzc2V0KCRpbmZvWydleHRlbnNpb25zJ11bJ3N1YmplY3RBbHROYW1lJ10pKSB7CiRzdWJqZWN0QWx0TmFtZXMgPSBQcmVnOjpzcGxpdCgne1xzKixccyp9JywgJGluZm9bJ2V4dGVuc2lvbnMnXVsnc3ViamVjdEFsdE5hbWUnXSk7CiRzdWJqZWN0QWx0TmFtZXMgPSBhcnJheV9maWx0ZXIoCmFycmF5X21hcChzdGF0aWMgZnVuY3Rpb24gKCRuYW1lKTogP3N0cmluZyB7CmlmICgwID09PSBzdHJwb3MoJG5hbWUsICdETlM6JykpIHsKcmV0dXJuIHN0cnRvbG93ZXIobHRyaW0oc3Vic3RyKCRuYW1lLCA0KSkpOwp9CgpyZXR1cm4gbnVsbDsKfSwgJHN1YmplY3RBbHROYW1lcyksCnN0YXRpYyBmdW5jdGlvbiAoP3N0cmluZyAkc2FuKSB7CnJldHVybiAkc2FuICE9PSBudWxsOwp9Cik7CiRzdWJqZWN0QWx0TmFtZXMgPSBhcnJheV92YWx1ZXMoJHN1YmplY3RBbHROYW1lcyk7Cn0KCnJldHVybiBbCidjbicgPT4gJGNvbW1vbk5hbWUsCidzYW4nID0+ICRzdWJqZWN0QWx0TmFtZXMsCl07Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q2VydGlmaWNhdGVGaW5nZXJwcmludChzdHJpbmcgJGNlcnRpZmljYXRlKTogc3RyaW5nCnsKJHB1YmtleSA9IG9wZW5zc2xfZ2V0X3B1YmxpY2tleSgkY2VydGlmaWNhdGUpOwppZiAoJHB1YmtleSA9PT0gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHB1YmxpYyBrZXkgZnJvbSBjZXJ0aWZpY2F0ZScpOwp9CiRwdWJrZXlkZXRhaWxzID0gb3BlbnNzbF9wa2V5X2dldF9kZXRhaWxzKCRwdWJrZXkpOwokcHVia2V5cGVtID0gJHB1YmtleWRldGFpbHNbJ2tleSddOwoKJHN0YXJ0ID0gJy0tLS0tQkVHSU4gUFVCTElDIEtFWS0tLS0tJzsKJGVuZCA9ICctLS0tLUVORCBQVUJMSUMgS0VZLS0tLS0nOwokcGVtdHJpbSA9IHN1YnN0cigkcHVia2V5cGVtLCBzdHJwb3MoJHB1YmtleXBlbSwgJHN0YXJ0KSArIHN0cmxlbigkc3RhcnQpLCAoc3RybGVuKCRwdWJrZXlwZW0pIC0gc3RycG9zKCRwdWJrZXlwZW0sICRlbmQpKSAqICgtMSkpOwokZGVyID0gYmFzZTY0X2RlY29kZSgkcGVtdHJpbSk7CgpyZXR1cm4gaGFzaCgnc2hhMScsICRkZXIpOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT3BlbnNzbFBhcnNlU2FmZSgpOiBib29sCnsKcmV0dXJuIENhQnVuZGxlOjppc09wZW5zc2xQYXJzZVNhZmUoKTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjZXJ0TmFtZU1hdGNoZXIoc3RyaW5nICRjZXJ0TmFtZSk6ID9jYWxsYWJsZQp7CiR3aWxkY2FyZHMgPSBzdWJzdHJfY291bnQoJGNlcnROYW1lLCAnKicpOwoKaWYgKDAgPT09ICR3aWxkY2FyZHMpIHsKCnJldHVybiBzdGF0aWMgZnVuY3Rpb24gKCRob3N0bmFtZSkgdXNlICgkY2VydE5hbWUpOiBib29sIHsKcmV0dXJuICRob3N0bmFtZSA9PT0gJGNlcnROYW1lOwp9Owp9CgppZiAoMSA9PT0gJHdpbGRjYXJkcykgewokY29tcG9uZW50cyA9IGV4cGxvZGUoJy4nLCAkY2VydE5hbWUpOwoKaWYgKDMgPiBjb3VudCgkY29tcG9uZW50cykpIHsKCnJldHVybiBudWxsOwp9CgokZmlyc3RDb21wb25lbnQgPSAkY29tcG9uZW50c1swXTsKCgppZiAoJyonICE9PSAkZmlyc3RDb21wb25lbnRbc3RybGVuKCRmaXJzdENvbXBvbmVudCkgLSAxXSkgewpyZXR1cm4gbnVsbDsKfQoKJHdpbGRjYXJkUmVnZXggPSBwcmVnX3F1b3RlKCRjZXJ0TmFtZSk7CiR3aWxkY2FyZFJlZ2V4ID0gc3RyX3JlcGxhY2UoJ1xcKicsICdbYS16MC05LV0rJywgJHdpbGRjYXJkUmVnZXgpOwokd2lsZGNhcmRSZWdleCA9ICJ7Xnskd2lsZGNhcmRSZWdleH0kfSI7CgpyZXR1cm4gc3RhdGljIGZ1bmN0aW9uICgkaG9zdG5hbWUpIHVzZSAoJHdpbGRjYXJkUmVnZXgpOiBib29sIHsKcmV0dXJuIFByZWc6OmlzTWF0Y2goJHdpbGRjYXJkUmVnZXgsICRob3N0bmFtZSk7Cn07Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFV0aWw7Cgp1c2UgQ29tcG9zZXJcQ29uZmlnOwp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgVXJsCnsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdXBkYXRlRGlzdFJlZmVyZW5jZShDb25maWcgJGNvbmZpZywgc3RyaW5nICR1cmwsIHN0cmluZyAkcmVmKTogc3RyaW5nCnsKJGhvc3QgPSBwYXJzZV91cmwoJHVybCwgUEhQX1VSTF9IT1NUKTsKCmlmICgkaG9zdCA9PT0gJ2FwaS5naXRodWIuY29tJyB8fCAkaG9zdCA9PT0gJ2dpdGh1Yi5jb20nIHx8ICRob3N0ID09PSAnd3d3LmdpdGh1Yi5jb20nKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9naXRodWJcLmNvbS8oW14vXSspLyhbXi9dKykvKHppcHx0YXIpYmFsbC8oLispJH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9IGVsc2VpZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzp3d3dcLik/Z2l0aHViXC5jb20vKFteL10rKS8oW14vXSspL2FyY2hpdmUvLitcLih6aXB8dGFyKSg/OlwuZ3opPyR9aScsICR1cmwsICRtYXRjaCkpIHsKCiR1cmwgPSAnaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy8nIC4gJG1hdGNoWzFdIC4gJy8nLiAkbWF0Y2hbMl0gLiAnLycgLiAkbWF0Y2hbM10gLiAnYmFsbC8nIC4gJHJlZjsKfSBlbHNlaWYgKFByZWc6OmlzTWF0Y2goJ3teaHR0cHM/Oi8vYXBpXC5naXRodWJcLmNvbS9yZXBvcy8oW14vXSspLyhbXi9dKykvKHppcHx0YXIpYmFsbCg/Oi8uKyk/JH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zLycgLiAkbWF0Y2hbMV0gLiAnLycuICRtYXRjaFsyXSAuICcvJyAuICRtYXRjaFszXSAuICdiYWxsLycgLiAkcmVmOwp9Cn0gZWxzZWlmICgkaG9zdCA9PT0gJ2JpdGJ1Y2tldC5vcmcnIHx8ICRob3N0ID09PSAnd3d3LmJpdGJ1Y2tldC5vcmcnKSB7CmlmIChQcmVnOjppc01hdGNoKCd7Xmh0dHBzPzovLyg/Ond3d1wuKT9iaXRidWNrZXRcLm9yZy8oW14vXSspLyhbXi9dKykvZ2V0LyguKylcLih6aXB8dGFyXC5nenx0YXJcLmJ6MikkfWknLCAkdXJsLCAkbWF0Y2gpKSB7CgokdXJsID0gJ2h0dHBzOi8vYml0YnVja2V0Lm9yZy8nIC4gJG1hdGNoWzFdIC4gJy8nLiAkbWF0Y2hbMl0gLiAnL2dldC8nIC4gJHJlZiAuICcuJyAuICRtYXRjaFs0XTsKfQp9IGVsc2VpZiAoJGhvc3QgPT09ICdnaXRsYWIuY29tJyB8fCAkaG9zdCA9PT0gJ3d3dy5naXRsYWIuY29tJykgewppZiAoUHJlZzo6aXNNYXRjaCgne15odHRwcz86Ly8oPzp3d3dcLik/Z2l0bGFiXC5jb20vYXBpL3ZbMzRdL3Byb2plY3RzLyhbXi9dKykvcmVwb3NpdG9yeS9hcmNoaXZlXC4oemlwfHRhclwuZ3p8dGFyXC5iejJ8dGFyKVw/c2hhPS4rJH1pJywgJHVybCwgJG1hdGNoKSkgewoKJHVybCA9ICdodHRwczovL2dpdGxhYi5jb20vYXBpL3Y0L3Byb2plY3RzLycgLiAkbWF0Y2hbMV0gLiAnL3JlcG9zaXRvcnkvYXJjaGl2ZS4nIC4gJG1hdGNoWzJdIC4gJz9zaGE9JyAuICRyZWY7Cn0KfSBlbHNlaWYgKGluX2FycmF5KCRob3N0LCAkY29uZmlnLT5nZXQoJ2dpdGh1Yi1kb21haW5zJyksIHRydWUpKSB7CiR1cmwgPSBQcmVnOjpyZXBsYWNlKCd7KC9yZXBvcy9bXi9dKy9bXi9dKy8oemlwfHRhciliYWxsKSg/Oi8uKyk/JH1pJywgJyQxLycuJHJlZiwgJHVybCk7Cn0gZWxzZWlmIChpbl9hcnJheSgkaG9zdCwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKSkgewokdXJsID0gUHJlZzo6cmVwbGFjZSgneygvYXBpL3ZbMzRdL3Byb2plY3RzL1teL10rL3JlcG9zaXRvcnkvYXJjaGl2ZVwuKD86emlwfHRhclwuZ3p8dGFyXC5iejJ8dGFyKVw/c2hhPSkuKyR9aScsICckezF9Jy4kcmVmLCAkdXJsKTsKfQoKYXNzZXJ0KCR1cmwgIT09ICcnKTsKCnJldHVybiAkdXJsOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRPcmlnaW4oQ29uZmlnICRjb25maWcsIHN0cmluZyAkdXJsKTogc3RyaW5nCnsKaWYgKDAgPT09IHN0cnBvcygkdXJsLCAnZmlsZTovLycpKSB7CnJldHVybiAkdXJsOwp9Cgokb3JpZ2luID0gKHN0cmluZykgcGFyc2VfdXJsKCR1cmwsIFBIUF9VUkxfSE9TVCk7CmlmICgkcG9ydCA9IHBhcnNlX3VybCgkdXJsLCBQSFBfVVJMX1BPUlQpKSB7CiRvcmlnaW4gLj0gJzonLiRwb3J0Owp9CgppZiAoc3RyX2VuZHNfd2l0aCgkb3JpZ2luLCAnLmdpdGh1Yi5jb20nKSAmJiAkb3JpZ2luICE9PSAnY29kZWxvYWQuZ2l0aHViLmNvbScpIHsKcmV0dXJuICdnaXRodWIuY29tJzsKfQoKaWYgKCRvcmlnaW4gPT09ICdyZXBvLnBhY2thZ2lzdC5vcmcnKSB7CnJldHVybiAncGFja2FnaXN0Lm9yZyc7Cn0KCmlmICgkb3JpZ2luID09PSAnJykgewokb3JpZ2luID0gJHVybDsKfQoKCgppZiAoCmZhbHNlID09PSBzdHJwb3MoJG9yaWdpbiwgJy8nKQomJiAhaW5fYXJyYXkoJG9yaWdpbiwgJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpLCB0cnVlKQopIHsKZm9yZWFjaCAoJGNvbmZpZy0+Z2V0KCdnaXRsYWItZG9tYWlucycpIGFzICRnaXRsYWJEb21haW4pIHsKaWYgKCRnaXRsYWJEb21haW4gIT09ICcnICYmIHN0cl9zdGFydHNfd2l0aCgkZ2l0bGFiRG9tYWluLCAkb3JpZ2luKSkgewpyZXR1cm4gJGdpdGxhYkRvbWFpbjsKfQp9Cn0KCnJldHVybiAkb3JpZ2luOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHNhbml0aXplKHN0cmluZyAkdXJsKTogc3RyaW5nCnsKCgokdXJsID0gUHJlZzo6cmVwbGFjZSgneyhbJj9dYWNjZXNzX3Rva2VuPSlbXiZdK30nLCAnJDEqKionLCAkdXJsKTsKCiR1cmwgPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3teKD9QPHByZWZpeD5bYS16MC05XSs6Ly8pPyg/UDx1c2VyPlteOi9cc0BdKyk6KD9QPHBhc3N3b3JkPlteQFxzL10rKUB9aScsIHN0YXRpYyBmdW5jdGlvbiAoJG0pOiBzdHJpbmcgewoKaWYgKFByZWc6OmlzTWF0Y2goR2l0SHViOjpHSVRIVUJfVE9LRU5fUkVHRVgsICRtWyd1c2VyJ10pKSB7CnJldHVybiAkbVsncHJlZml4J10uJyoqKjoqKipAJzsKfQoKcmV0dXJuICRtWydwcmVmaXgnXS4kbVsndXNlciddLic6KioqQCc7Cn0sICR1cmwpOwoKcmV0dXJuICR1cmw7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcVXRpbDsKCgoKCmNsYXNzIFppcAp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Q29tcG9zZXJKc29uKHN0cmluZyAkcGF0aFRvWmlwKTogP3N0cmluZwp7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgnemlwJykpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdUaGUgWmlwIFV0aWwgcmVxdWlyZXMgUEhQXCdzIHppcCBleHRlbnNpb24nKTsKfQoKJHppcCA9IG5ldyBcWmlwQXJjaGl2ZSgpOwppZiAoJHppcC0+b3BlbigkcGF0aFRvWmlwKSAhPT0gdHJ1ZSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKDAgPT09ICR6aXAtPm51bUZpbGVzKSB7CiR6aXAtPmNsb3NlKCk7CgpyZXR1cm4gbnVsbDsKfQoKJGZvdW5kRmlsZUluZGV4ID0gc2VsZjo6bG9jYXRlRmlsZSgkemlwLCAnY29tcG9zZXIuanNvbicpOwoKJGNvbnRlbnQgPSBudWxsOwokY29uZmlndXJhdGlvbkZpbGVOYW1lID0gJHppcC0+Z2V0TmFtZUluZGV4KCRmb3VuZEZpbGVJbmRleCk7CiRzdHJlYW0gPSAkemlwLT5nZXRTdHJlYW0oJGNvbmZpZ3VyYXRpb25GaWxlTmFtZSk7CgppZiAoZmFsc2UgIT09ICRzdHJlYW0pIHsKJGNvbnRlbnQgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRzdHJlYW0pOwp9CgokemlwLT5jbG9zZSgpOwoKcmV0dXJuICRjb250ZW50Owp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGxvY2F0ZUZpbGUoXFppcEFyY2hpdmUgJHppcCwgc3RyaW5nICRmaWxlbmFtZSk6IGludAp7CgppZiAoZmFsc2UgIT09ICgkaW5kZXggPSAkemlwLT5sb2NhdGVOYW1lKCRmaWxlbmFtZSkpICYmICR6aXAtPmdldEZyb21JbmRleCgkaW5kZXgpICE9PSBmYWxzZSkgewpyZXR1cm4gJGluZGV4Owp9CgokdG9wTGV2ZWxQYXRocyA9IFtdOwpmb3IgKCRpID0gMDsgJGkgPCAkemlwLT5udW1GaWxlczsgJGkrKykgewokbmFtZSA9ICR6aXAtPmdldE5hbWVJbmRleCgkaSk7CiRkaXJuYW1lID0gZGlybmFtZSgkbmFtZSk7CgoKaWYgKHN0cnBvcygkbmFtZSwgJ19fTUFDT1NYJykgIT09IGZhbHNlKSB7CmNvbnRpbnVlOwp9CgoKaWYgKCRkaXJuYW1lID09PSAnLicpIHsKJHRvcExldmVsUGF0aHNbJG5hbWVdID0gdHJ1ZTsKaWYgKFxjb3VudCgkdG9wTGV2ZWxQYXRocykgPiAxKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQXJjaGl2ZSBoYXMgbW9yZSB0aGFuIG9uZSB0b3AgbGV2ZWwgZGlyZWN0b3JpZXMsIGFuZCBubyBjb21wb3Nlci5qc29uIHdhcyBmb3VuZCBvbiB0aGUgdG9wIGxldmVsLCBzbyBpdFwncyBhbiBpbnZhbGlkIGFyY2hpdmUuIFRvcCBsZXZlbCBwYXRocyBmb3VuZCB3ZXJlOiAnLmltcGxvZGUoJywnLCBhcnJheV9rZXlzKCR0b3BMZXZlbFBhdGhzKSkpOwp9CmNvbnRpbnVlOwp9CgoKaWYgKGZhbHNlID09PSBzdHJwb3MoJGRpcm5hbWUsICdcXCcpICYmIGZhbHNlID09PSBzdHJwb3MoJGRpcm5hbWUsICcvJykpIHsKJHRvcExldmVsUGF0aHNbJGRpcm5hbWUuJy8nXSA9IHRydWU7CmlmIChcY291bnQoJHRvcExldmVsUGF0aHMpID4gMSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0FyY2hpdmUgaGFzIG1vcmUgdGhhbiBvbmUgdG9wIGxldmVsIGRpcmVjdG9yaWVzLCBhbmQgbm8gY29tcG9zZXIuanNvbiB3YXMgZm91bmQgb24gdGhlIHRvcCBsZXZlbCwgc28gaXRcJ3MgYW4gaW52YWxpZCBhcmNoaXZlLiBUb3AgbGV2ZWwgcGF0aHMgZm91bmQgd2VyZTogJy5pbXBsb2RlKCcsJywgYXJyYXlfa2V5cygkdG9wTGV2ZWxQYXRocykpKTsKfQp9Cn0KCmlmICgkdG9wTGV2ZWxQYXRocyAmJiBmYWxzZSAhPT0gKCRpbmRleCA9ICR6aXAtPmxvY2F0ZU5hbWUoa2V5KCR0b3BMZXZlbFBhdGhzKS4kZmlsZW5hbWUpKSAmJiAkemlwLT5nZXRGcm9tSW5kZXgoJGluZGV4KSAhPT0gZmFsc2UpIHsKcmV0dXJuICRpbmRleDsKfQoKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdObyBjb21wb3Nlci5qc29uIGZvdW5kIGVpdGhlciBhdCB0aGUgdG9wIGxldmVsIG9yIHdpdGhpbiB0aGUgdG9wbW9zdCBkaXJlY3RvcnknKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKCmZ1bmN0aW9uIGluY2x1ZGVJZkV4aXN0cyhzdHJpbmcgJGZpbGUpOiA/Q2xhc3NMb2FkZXIKewpyZXR1cm4gZmlsZV9leGlzdHMoJGZpbGUpID8gaW5jbHVkZSAkZmlsZSA6IG51bGw7Cn0KCmlmICgoISRsb2FkZXIgPSBpbmNsdWRlSWZFeGlzdHMoX19ESVJfXy4nLy4uL3ZlbmRvci9hdXRvbG9hZC5waHAnKSkgJiYgKCEkbG9hZGVyID0gaW5jbHVkZUlmRXhpc3RzKF9fRElSX18uJy8uLi8uLi8uLi9hdXRvbG9hZC5waHAnKSkpIHsKZWNobyAnWW91IG11c3Qgc2V0IHVwIHRoZSBwcm9qZWN0IGRlcGVuZGVuY2llcyB1c2luZyBgY29tcG9zZXIgaW5zdGFsbGAnLlBIUF9FT0wuCidTZWUgaHR0cHM6Ly9nZXRjb21wb3Nlci5vcmcvZG93bmxvYWQvIGZvciBpbnN0cnVjdGlvbnMgb24gaW5zdGFsbGluZyBDb21wb3NlcicuUEhQX0VPTDsKZXhpdCgxKTsKfQoKcmV0dXJuICRsb2FkZXI7Cjw/cGhwCgovKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBDb21wb3Nlci4KICoKICogKGMpIE5pbHMgQWRlcm1hbm4gPG5hZGVybWFuQG5hZGVybWFuLmRlPgogKiAgICAgSm9yZGkgQm9nZ2lhbm8gPGouYm9nZ2lhbm9Ac2VsZC5iZT4KICoKICogRm9yIHRoZSBmdWxsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpZXcgdGhlIExJQ0VOU0UKICogZmlsZSB0aGF0IHdhcyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc291cmNlIGNvZGUuCiAqLwoKbmFtZXNwYWNlIENvbXBvc2VyXEF1dG9sb2FkOwoKLyoqCiAqIENsYXNzTG9hZGVyIGltcGxlbWVudHMgYSBQU1ItMCwgUFNSLTQgYW5kIGNsYXNzbWFwIGNsYXNzIGxvYWRlci4KICoKICogICAgICRsb2FkZXIgPSBuZXcgXENvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyKCk7CiAqCiAqICAgICAvLyByZWdpc3RlciBjbGFzc2VzIHdpdGggbmFtZXNwYWNlcwogKiAgICAgJGxvYWRlci0+YWRkKCdTeW1mb255XENvbXBvbmVudCcsIF9fRElSX18uJy9jb21wb25lbnQnKTsKICogICAgICRsb2FkZXItPmFkZCgnU3ltZm9ueScsICAgICAgICAgICBfX0RJUl9fLicvZnJhbWV3b3JrJyk7CiAqCiAqICAgICAvLyBhY3RpdmF0ZSB0aGUgYXV0b2xvYWRlcgogKiAgICAgJGxvYWRlci0+cmVnaXN0ZXIoKTsKICoKICogICAgIC8vIHRvIGVuYWJsZSBzZWFyY2hpbmcgdGhlIGluY2x1ZGUgcGF0aCAoZWcuIGZvciBQRUFSIHBhY2thZ2VzKQogKiAgICAgJGxvYWRlci0+c2V0VXNlSW5jbHVkZVBhdGgodHJ1ZSk7CiAqCiAqIEluIHRoaXMgZXhhbXBsZSwgaWYgeW91IHRyeSB0byB1c2UgYSBjbGFzcyBpbiB0aGUgU3ltZm9ueVxDb21wb25lbnQKICogbmFtZXNwYWNlIG9yIG9uZSBvZiBpdHMgY2hpbGRyZW4gKFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGUgZm9yIGluc3RhbmNlKSwKICogdGhlIGF1dG9sb2FkZXIgd2lsbCBmaXJzdCBsb29rIGZvciB0aGUgY2xhc3MgdW5kZXIgdGhlIGNvbXBvbmVudC8KICogZGlyZWN0b3J5LCBhbmQgaXQgd2lsbCB0aGVuIGZhbGxiYWNrIHRvIHRoZSBmcmFtZXdvcmsvIGRpcmVjdG9yeSBpZiBub3QKICogZm91bmQgYmVmb3JlIGdpdmluZyB1cC4KICoKICogVGhpcyBjbGFzcyBpcyBsb29zZWx5IGJhc2VkIG9uIHRoZSBTeW1mb255IFVuaXZlcnNhbENsYXNzTG9hZGVyLgogKgogKiBAYXV0aG9yIEZhYmllbiBQb3RlbmNpZXIgPGZhYmllbkBzeW1mb255LmNvbT4KICogQGF1dGhvciBKb3JkaSBCb2dnaWFubyA8ai5ib2dnaWFub0BzZWxkLmJlPgogKiBAc2VlICAgIGh0dHBzOi8vd3d3LnBocC1maWcub3JnL3Bzci9wc3ItMC8KICogQHNlZSAgICBodHRwczovL3d3dy5waHAtZmlnLm9yZy9wc3IvcHNyLTQvCiAqLwpjbGFzcyBDbGFzc0xvYWRlcgp7CiAgICAvKiogQHZhciBcQ2xvc3VyZShzdHJpbmcpOnZvaWQgKi8KICAgIHByaXZhdGUgc3RhdGljICRpbmNsdWRlRmlsZTsKCiAgICAvKiogQHZhciBzdHJpbmd8bnVsbCAqLwogICAgcHJpdmF0ZSAkdmVuZG9yRGlyOwoKICAgIC8vIFBTUi00CiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBhcnJheTxzdHJpbmcsIGludD4+CiAgICAgKi8KICAgIHByaXZhdGUgJHByZWZpeExlbmd0aHNQc3I0ID0gYXJyYXkoKTsKICAgIC8qKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHJpdmF0ZSAkcHJlZml4RGlyc1BzcjQgPSBhcnJheSgpOwogICAgLyoqCiAgICAgKiBAdmFyIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwcml2YXRlICRmYWxsYmFja0RpcnNQc3I0ID0gYXJyYXkoKTsKCiAgICAvLyBQU1ItMAogICAgLyoqCiAgICAgKiBMaXN0IG9mIFBTUi0wIHByZWZpeGVzCiAgICAgKgogICAgICogU3RydWN0dXJlZCBhcyBhcnJheSgnRiAoZmlyc3QgbGV0dGVyKScgPT4gYXJyYXkoJ0Zvb1xCYXIgKGZ1bGwgcHJlZml4KScgPT4gYXJyYXkoJ3BhdGgnLCAncGF0aDInKSkpCiAgICAgKgogICAgICogQHZhciBhcnJheTxzdHJpbmcsIGFycmF5PHN0cmluZywgbGlzdDxzdHJpbmc+Pj4KICAgICAqLwogICAgcHJpdmF0ZSAkcHJlZml4ZXNQc3IwID0gYXJyYXkoKTsKICAgIC8qKgogICAgICogQHZhciBsaXN0PHN0cmluZz4KICAgICAqLwogICAgcHJpdmF0ZSAkZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5KCk7CgogICAgLyoqIEB2YXIgYm9vbCAqLwogICAgcHJpdmF0ZSAkdXNlSW5jbHVkZVBhdGggPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBzdHJpbmc+CiAgICAgKi8KICAgIHByaXZhdGUgJGNsYXNzTWFwID0gYXJyYXkoKTsKCiAgICAvKiogQHZhciBib29sICovCiAgICBwcml2YXRlICRjbGFzc01hcEF1dGhvcml0YXRpdmUgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEB2YXIgYXJyYXk8c3RyaW5nLCBib29sPgogICAgICovCiAgICBwcml2YXRlICRtaXNzaW5nQ2xhc3NlcyA9IGFycmF5KCk7CgogICAgLyoqIEB2YXIgc3RyaW5nfG51bGwgKi8KICAgIHByaXZhdGUgJGFwY3VQcmVmaXg7CgogICAgLyoqCiAgICAgKiBAdmFyIGFycmF5PHN0cmluZywgc2VsZj4KICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJHJlZ2lzdGVyZWRMb2FkZXJzID0gYXJyYXkoKTsKCiAgICAvKioKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkdmVuZG9yRGlyCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmVuZG9yRGlyID0gbnVsbCkKICAgIHsKICAgICAgICAkdGhpcy0+dmVuZG9yRGlyID0gJHZlbmRvckRpcjsKICAgICAgICBzZWxmOjppbml0aWFsaXplSW5jbHVkZUNsb3N1cmUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXk8c3RyaW5nLCBsaXN0PHN0cmluZz4+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmaXhlcygpCiAgICB7CiAgICAgICAgaWYgKCFlbXB0eSgkdGhpcy0+cHJlZml4ZXNQc3IwKSkgewogICAgICAgICAgICByZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2FycmF5X21lcmdlJywgYXJyYXlfdmFsdWVzKCR0aGlzLT5wcmVmaXhlc1BzcjApKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIGxpc3Q8c3RyaW5nPj4KICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGdldFByZWZpeGVzUHNyNCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5wcmVmaXhEaXJzUHNyNDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGYWxsYmFja0RpcnMoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMDsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBnZXRGYWxsYmFja0RpcnNQc3I0KCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5PHN0cmluZywgc3RyaW5nPiBBcnJheSBvZiBjbGFzc25hbWUgPT4gcGF0aAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3NNYXAoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NNYXA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gYXJyYXk8c3RyaW5nLCBzdHJpbmc+ICRjbGFzc01hcCBDbGFzcyB0byBmaWxlbmFtZSBtYXAKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZENsYXNzTWFwKGFycmF5ICRjbGFzc01hcCkKICAgIHsKICAgICAgICBpZiAoJHRoaXMtPmNsYXNzTWFwKSB7CiAgICAgICAgICAgICR0aGlzLT5jbGFzc01hcCA9IGFycmF5X21lcmdlKCR0aGlzLT5jbGFzc01hcCwgJGNsYXNzTWFwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+Y2xhc3NNYXAgPSAkY2xhc3NNYXA7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgc2V0IG9mIFBTUi0wIGRpcmVjdG9yaWVzIGZvciBhIGdpdmVuIHByZWZpeCwgZWl0aGVyCiAgICAgKiBhcHBlbmRpbmcgb3IgcHJlcGVuZGluZyB0byB0aGUgb25lcyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBwcmVmaXguCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCAgVGhlIHByZWZpeAogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJHBhdGhzICAgVGhlIFBTUi0wIHJvb3QgZGlyZWN0b3JpZXMKICAgICAqIEBwYXJhbSBib29sICAgICAgICAgICAgICAgICRwcmVwZW5kIFdoZXRoZXIgdG8gcHJlcGVuZCB0aGUgZGlyZWN0b3JpZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGFkZCgkcHJlZml4LCAkcGF0aHMsICRwcmVwZW5kID0gZmFsc2UpCiAgICB7CiAgICAgICAgJHBhdGhzID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgaWYgKCEkcHJlZml4KSB7CiAgICAgICAgICAgIGlmICgkcHJlcGVuZCkgewogICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICAgICAkcGF0aHMsCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3IwLAogICAgICAgICAgICAgICAgICAgICRwYXRocwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJGZpcnN0ID0gJHByZWZpeFswXTsKICAgICAgICBpZiAoIWlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSkpIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gJHBhdGhzOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoJHByZXBlbmQpIHsKICAgICAgICAgICAgJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAkcGF0aHMsCiAgICAgICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0KICAgICAgICAgICAgKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSwKICAgICAgICAgICAgICAgICRwYXRocwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHNldCBvZiBQU1ItNCBkaXJlY3RvcmllcyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UsIGVpdGhlcgogICAgICogYXBwZW5kaW5nIG9yIHByZXBlbmRpbmcgdG8gdGhlIG9uZXMgcHJldmlvdXNseSBzZXQgZm9yIHRoaXMgbmFtZXNwYWNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICRwcmVmaXggIFRoZSBwcmVmaXgvbmFtZXNwYWNlLCB3aXRoIHRyYWlsaW5nICdcXCcKICAgICAqIEBwYXJhbSBsaXN0PHN0cmluZz58c3RyaW5nICRwYXRocyAgIFRoZSBQU1ItNCBiYXNlIGRpcmVjdG9yaWVzCiAgICAgKiBAcGFyYW0gYm9vbCAgICAgICAgICAgICAgICAkcHJlcGVuZCBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGRpcmVjdG9yaWVzCiAgICAgKgogICAgICogQHRocm93cyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBhZGRQc3I0KCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKICAgIHsKICAgICAgICAkcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKICAgICAgICBpZiAoISRwcmVmaXgpIHsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZGlyZWN0b3JpZXMgZm9yIHRoZSByb290IG5hbWVzcGFjZS4KICAgICAgICAgICAgaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgICAgICRwYXRocywKICAgICAgICAgICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gYXJyYXlfbWVyZ2UoCiAgICAgICAgICAgICAgICAgICAgJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQsCiAgICAgICAgICAgICAgICAgICAgJHBhdGhzCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0pKSB7CiAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGRpcmVjdG9yaWVzIGZvciBhIG5ldyBuYW1lc3BhY2UuCiAgICAgICAgICAgICRsZW5ndGggPSBzdHJsZW4oJHByZWZpeCk7CiAgICAgICAgICAgIGlmICgnXFwnICE9PSAkcHJlZml4WyRsZW5ndGggLSAxXSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkEgbm9uLWVtcHR5IFBTUi00IHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgbmFtZXNwYWNlIHNlcGFyYXRvci4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJHByZWZpeFswXV1bJHByZWZpeF0gPSAkbGVuZ3RoOwogICAgICAgICAgICAkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSAkcGF0aHM7CiAgICAgICAgfSBlbHNlaWYgKCRwcmVwZW5kKSB7CiAgICAgICAgICAgIC8vIFByZXBlbmQgZGlyZWN0b3JpZXMgZm9yIGFuIGFscmVhZHkgcmVnaXN0ZXJlZCBuYW1lc3BhY2UuCiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IGFycmF5X21lcmdlKAogICAgICAgICAgICAgICAgJHBhdGhzLAogICAgICAgICAgICAgICAgJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdCiAgICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQXBwZW5kIGRpcmVjdG9yaWVzIGZvciBhbiBhbHJlYWR5IHJlZ2lzdGVyZWQgbmFtZXNwYWNlLgogICAgICAgICAgICAkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKICAgICAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSwKICAgICAgICAgICAgICAgICRwYXRocwogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHNldCBvZiBQU1ItMCBkaXJlY3RvcmllcyBmb3IgYSBnaXZlbiBwcmVmaXgsCiAgICAgKiByZXBsYWNpbmcgYW55IG90aGVycyBwcmV2aW91c2x5IHNldCBmb3IgdGhpcyBwcmVmaXguCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAgICAgICAgICAgICAgJHByZWZpeCBUaGUgcHJlZml4CiAgICAgKiBAcGFyYW0gbGlzdDxzdHJpbmc+fHN0cmluZyAkcGF0aHMgIFRoZSBQU1ItMCBiYXNlIGRpcmVjdG9yaWVzCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiBzZXQoJHByZWZpeCwgJHBhdGhzKQogICAgewogICAgICAgIGlmICghJHByZWZpeCkgewogICAgICAgICAgICAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhlc1BzcjBbJHByZWZpeFswXV1bJHByZWZpeF0gPSAoYXJyYXkpICRwYXRoczsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBzZXQgb2YgUFNSLTQgZGlyZWN0b3JpZXMgZm9yIGEgZ2l2ZW4gbmFtZXNwYWNlLAogICAgICogcmVwbGFjaW5nIGFueSBvdGhlcnMgcHJldmlvdXNseSBzZXQgZm9yIHRoaXMgbmFtZXNwYWNlLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmcgICAgICAgICAgICAgICRwcmVmaXggVGhlIHByZWZpeC9uYW1lc3BhY2UsIHdpdGggdHJhaWxpbmcgJ1xcJwogICAgICogQHBhcmFtIGxpc3Q8c3RyaW5nPnxzdHJpbmcgJHBhdGhzICBUaGUgUFNSLTQgYmFzZSBkaXJlY3RvcmllcwogICAgICoKICAgICAqIEB0aHJvd3MgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0UHNyNCgkcHJlZml4LCAkcGF0aHMpCiAgICB7CiAgICAgICAgaWYgKCEkcHJlZml4KSB7CiAgICAgICAgICAgICR0aGlzLT5mYWxsYmFja0RpcnNQc3I0ID0gKGFycmF5KSAkcGF0aHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgJGxlbmd0aCA9IHN0cmxlbigkcHJlZml4KTsKICAgICAgICAgICAgaWYgKCdcXCcgIT09ICRwcmVmaXhbJGxlbmd0aCAtIDFdKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiQSBub24tZW1wdHkgUFNSLTQgcHJlZml4IG11c3QgZW5kIHdpdGggYSBuYW1lc3BhY2Ugc2VwYXJhdG9yLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhMZW5ndGhzUHNyNFskcHJlZml4WzBdXVskcHJlZml4XSA9ICRsZW5ndGg7CiAgICAgICAgICAgICR0aGlzLT5wcmVmaXhEaXJzUHNyNFskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFR1cm5zIG9uIHNlYXJjaGluZyB0aGUgaW5jbHVkZSBwYXRoIGZvciBjbGFzcyBmaWxlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkdXNlSW5jbHVkZVBhdGgKICAgICAqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIHNldFVzZUluY2x1ZGVQYXRoKCR1c2VJbmNsdWRlUGF0aCkKICAgIHsKICAgICAgICAkdGhpcy0+dXNlSW5jbHVkZVBhdGggPSAkdXNlSW5jbHVkZVBhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0aGUgYXV0b2xvYWRlciB1c2VzIHRoZSBpbmNsdWRlIHBhdGggdG8gY2hlY2sKICAgICAqIGZvciBjbGFzc2VzLgogICAgICoKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0VXNlSW5jbHVkZVBhdGgoKQogICAgewogICAgICAgIHJldHVybiAkdGhpcy0+dXNlSW5jbHVkZVBhdGg7CiAgICB9CgogICAgLyoqCiAgICAgKiBUdXJucyBvZmYgc2VhcmNoaW5nIHRoZSBwcmVmaXggYW5kIGZhbGxiYWNrIGRpcmVjdG9yaWVzIGZvciBjbGFzc2VzCiAgICAgKiB0aGF0IGhhdmUgbm90IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBjbGFzcyBtYXAuCiAgICAgKgogICAgICogQHBhcmFtIGJvb2wgJGNsYXNzTWFwQXV0aG9yaXRhdGl2ZQogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRjbGFzc01hcEF1dGhvcml0YXRpdmUpCiAgICB7CiAgICAgICAgJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9ICRjbGFzc01hcEF1dGhvcml0YXRpdmU7CiAgICB9CgogICAgLyoqCiAgICAgKiBTaG91bGQgY2xhc3MgbG9va3VwIGZhaWwgaWYgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGNsYXNzIG1hcD8KICAgICAqCiAgICAgKiBAcmV0dXJuIGJvb2wKICAgICAqLwogICAgcHVibGljIGZ1bmN0aW9uIGlzQ2xhc3NNYXBBdXRob3JpdGF0aXZlKCkKICAgIHsKICAgICAgICByZXR1cm4gJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEFQQ3UgcHJlZml4IHRvIHVzZSB0byBjYWNoZSBmb3VuZC9ub3QtZm91bmQgY2xhc3NlcywgaWYgdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkLgogICAgICoKICAgICAqIEBwYXJhbSBzdHJpbmd8bnVsbCAkYXBjdVByZWZpeAogICAgICoKICAgICAqIEByZXR1cm4gdm9pZAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gc2V0QXBjdVByZWZpeCgkYXBjdVByZWZpeCkKICAgIHsKICAgICAgICAkdGhpcy0+YXBjdVByZWZpeCA9IGZ1bmN0aW9uX2V4aXN0cygnYXBjdV9mZXRjaCcpICYmIGZpbHRlcl92YXIoaW5pX2dldCgnYXBjLmVuYWJsZWQnKSwgRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4pID8gJGFwY3VQcmVmaXggOiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIEFQQ3UgcHJlZml4IGluIHVzZSwgb3IgbnVsbCBpZiBBUEN1IGNhY2hpbmcgaXMgbm90IGVuYWJsZWQuCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8bnVsbAogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZ2V0QXBjdVByZWZpeCgpCiAgICB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5hcGN1UHJlZml4OwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoaXMgaW5zdGFuY2UgYXMgYW4gYXV0b2xvYWRlci4KICAgICAqCiAgICAgKiBAcGFyYW0gYm9vbCAkcHJlcGVuZCBXaGV0aGVyIHRvIHByZXBlbmQgdGhlIGF1dG9sb2FkZXIgb3Igbm90CiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQogICAgewogICAgICAgIHNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7CgogICAgICAgIGlmIChudWxsID09PSAkdGhpcy0+dmVuZG9yRGlyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkcHJlcGVuZCkgewogICAgICAgICAgICBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgkdGhpcy0+dmVuZG9yRGlyID0+ICR0aGlzKSArIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyczsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwogICAgICAgICAgICBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0gPSAkdGhpczsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBVbnJlZ2lzdGVycyB0aGlzIGluc3RhbmNlIGFzIGFuIGF1dG9sb2FkZXIuCiAgICAgKgogICAgICogQHJldHVybiB2b2lkCiAgICAgKi8KICAgIHB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyKCkKICAgIHsKICAgICAgICBzcGxfYXV0b2xvYWRfdW5yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpKTsKCiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT52ZW5kb3JEaXIpIHsKICAgICAgICAgICAgdW5zZXQoc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzWyR0aGlzLT52ZW5kb3JEaXJdKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb2FkcyB0aGUgZ2l2ZW4gY2xhc3Mgb3IgaW50ZXJmYWNlLgogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICRjbGFzcyBUaGUgbmFtZSBvZiB0aGUgY2xhc3MKICAgICAqIEByZXR1cm4gdHJ1ZXxudWxsIFRydWUgaWYgbG9hZGVkLCBudWxsIG90aGVyd2lzZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gbG9hZENsYXNzKCRjbGFzcykKICAgIHsKICAgICAgICBpZiAoJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGUoJGNsYXNzKSkgewogICAgICAgICAgICAkaW5jbHVkZUZpbGUgPSBzZWxmOjokaW5jbHVkZUZpbGU7CiAgICAgICAgICAgICRpbmNsdWRlRmlsZSgkZmlsZSk7CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogRmluZHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgd2hlcmUgdGhlIGNsYXNzIGlzIGRlZmluZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0cmluZyAkY2xhc3MgVGhlIG5hbWUgb2YgdGhlIGNsYXNzCiAgICAgKgogICAgICogQHJldHVybiBzdHJpbmd8ZmFsc2UgVGhlIHBhdGggaWYgZm91bmQsIGZhbHNlIG90aGVyd2lzZQogICAgICovCiAgICBwdWJsaWMgZnVuY3Rpb24gZmluZEZpbGUoJGNsYXNzKQogICAgewogICAgICAgIC8vIGNsYXNzIG1hcCBsb29rdXAKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPmNsYXNzTWFwWyRjbGFzc10pKSB7CiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Y2xhc3NNYXBbJGNsYXNzXTsKICAgICAgICB9CiAgICAgICAgaWYgKCR0aGlzLT5jbGFzc01hcEF1dGhvcml0YXRpdmUgfHwgaXNzZXQoJHRoaXMtPm1pc3NpbmdDbGFzc2VzWyRjbGFzc10pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5hcGN1UHJlZml4KSB7CiAgICAgICAgICAgICRmaWxlID0gYXBjdV9mZXRjaCgkdGhpcy0+YXBjdVByZWZpeC4kY2xhc3MsICRoaXQpOwogICAgICAgICAgICBpZiAoJGhpdCkgewogICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkZmlsZSA9ICR0aGlzLT5maW5kRmlsZVdpdGhFeHRlbnNpb24oJGNsYXNzLCAnLnBocCcpOwoKICAgICAgICAvLyBTZWFyY2ggZm9yIEhhY2sgZmlsZXMgaWYgd2UgYXJlIHJ1bm5pbmcgb24gSEhWTQogICAgICAgIGlmIChmYWxzZSA9PT0gJGZpbGUgJiYgZGVmaW5lZCgnSEhWTV9WRVJTSU9OJykpIHsKICAgICAgICAgICAgJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJy5oaCcpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgIT09ICR0aGlzLT5hcGN1UHJlZml4KSB7CiAgICAgICAgICAgIGFwY3VfYWRkKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGZpbGUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGZhbHNlID09PSAkZmlsZSkgewogICAgICAgICAgICAvLyBSZW1lbWJlciB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QgZXhpc3QuCiAgICAgICAgICAgICR0aGlzLT5taXNzaW5nQ2xhc3Nlc1skY2xhc3NdID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkZmlsZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIGxvYWRlcnMga2V5ZWQgYnkgdGhlaXIgY29ycmVzcG9uZGluZyB2ZW5kb3IgZGlyZWN0b3JpZXMuCiAgICAgKgogICAgICogQHJldHVybiBhcnJheTxzdHJpbmcsIHNlbGY+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmVnaXN0ZXJlZExvYWRlcnMoKQogICAgewogICAgICAgIHJldHVybiBzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0gIHN0cmluZyAgICAgICAkY2xhc3MKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgICRleHQKICAgICAqIEByZXR1cm4gc3RyaW5nfGZhbHNlCiAgICAgKi8KICAgIHByaXZhdGUgZnVuY3Rpb24gZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJGV4dCkKICAgIHsKICAgICAgICAvLyBQU1ItNCBsb29rdXAKICAgICAgICAkbG9naWNhbFBhdGhQc3I0ID0gc3RydHIoJGNsYXNzLCAnXFwnLCBESVJFQ1RPUllfU0VQQVJBVE9SKSAuICRleHQ7CgogICAgICAgICRmaXJzdCA9ICRjbGFzc1swXTsKICAgICAgICBpZiAoaXNzZXQoJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRmaXJzdF0pKSB7CiAgICAgICAgICAgICRzdWJQYXRoID0gJGNsYXNzOwogICAgICAgICAgICB3aGlsZSAoZmFsc2UgIT09ICRsYXN0UG9zID0gc3RycnBvcygkc3ViUGF0aCwgJ1xcJykpIHsKICAgICAgICAgICAgICAgICRzdWJQYXRoID0gc3Vic3RyKCRzdWJQYXRoLCAwLCAkbGFzdFBvcyk7CiAgICAgICAgICAgICAgICAkc2VhcmNoID0gJHN1YlBhdGggLiAnXFwnOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskc2VhcmNoXSkpIHsKICAgICAgICAgICAgICAgICAgICAkcGF0aEVuZCA9IERJUkVDVE9SWV9TRVBBUkFUT1IgLiBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJGxhc3RQb3MgKyAxKTsKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoICgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHNlYXJjaF0gYXMgJGRpcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gJHBhdGhFbmQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBTUi00IGZhbGxiYWNrIGRpcnMKICAgICAgICBmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCBhcyAkZGlyKSB7CiAgICAgICAgICAgIGlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyNCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkZmlsZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUFNSLTAgbG9va3VwCiAgICAgICAgaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkY2xhc3MsICdcXCcpKSB7CiAgICAgICAgICAgIC8vIG5hbWVzcGFjZWQgY2xhc3MgbmFtZQogICAgICAgICAgICAkbG9naWNhbFBhdGhQc3IwID0gc3Vic3RyKCRsb2dpY2FsUGF0aFBzcjQsIDAsICRwb3MgKyAxKQogICAgICAgICAgICAgICAgLiBzdHJ0cihzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgJHBvcyArIDEpLCAnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFBFQVItbGlrZSBjbGFzcyBuYW1lCiAgICAgICAgICAgICRsb2dpY2FsUGF0aFBzcjAgPSBzdHJ0cigkY2xhc3MsICdfJywgRElSRUNUT1JZX1NFUEFSQVRPUikgLiAkZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XSkpIHsKICAgICAgICAgICAgZm9yZWFjaCAoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdIGFzICRwcmVmaXggPT4gJGRpcnMpIHsKICAgICAgICAgICAgICAgIGlmICgwID09PSBzdHJwb3MoJGNsYXNzLCAkcHJlZml4KSkgewogICAgICAgICAgICAgICAgICAgIGZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCRmaWxlID0gJGRpciAuIERJUkVDVE9SWV9TRVBBUkFUT1IgLiAkbG9naWNhbFBhdGhQc3IwKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRmaWxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQU1ItMCBmYWxsYmFjayBkaXJzCiAgICAgICAgZm9yZWFjaCAoJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgYXMgJGRpcikgewogICAgICAgICAgICBpZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjApKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBTUi0wIGluY2x1ZGUgcGF0aHMuCiAgICAgICAgaWYgKCR0aGlzLT51c2VJbmNsdWRlUGF0aCAmJiAkZmlsZSA9IHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aCgkbG9naWNhbFBhdGhQc3IwKSkgewogICAgICAgICAgICByZXR1cm4gJGZpbGU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdGlhbGl6ZUluY2x1ZGVDbG9zdXJlKCkKICAgIHsKICAgICAgICBpZiAoc2VsZjo6JGluY2x1ZGVGaWxlICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNjb3BlIGlzb2xhdGVkIGluY2x1ZGUuCiAgICAgICAgICoKICAgICAgICAgKiBQcmV2ZW50cyBhY2Nlc3MgdG8gJHRoaXMvc2VsZiBmcm9tIGluY2x1ZGVkIGZpbGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtICBzdHJpbmcgJGZpbGUKICAgICAgICAgKiBAcmV0dXJuIHZvaWQKICAgICAgICAgKi8KICAgICAgICBzZWxmOjokaW5jbHVkZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24oJGZpbGUpIHsKICAgICAgICAgICAgaW5jbHVkZSAkZmlsZTsKICAgICAgICB9LCBudWxsLCBudWxsKTsKICAgIH0KfQo8P3BocAoKLyoKICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgQ29tcG9zZXIuCiAqCiAqIChjKSBOaWxzIEFkZXJtYW5uIDxuYWRlcm1hbkBuYWRlcm1hbi5kZT4KICogICAgIEpvcmRpIEJvZ2dpYW5vIDxqLmJvZ2dpYW5vQHNlbGQuYmU+CiAqCiAqIEZvciB0aGUgZnVsbCBjb3B5cmlnaHQgYW5kIGxpY2Vuc2UgaW5mb3JtYXRpb24sIHBsZWFzZSB2aWV3IHRoZSBMSUNFTlNFCiAqIGZpbGUgdGhhdCB3YXMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvdXJjZSBjb2RlLgogKi8KCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwoKLyoqCiAqIFRoaXMgY2xhc3MgaXMgY29waWVkIGluIGV2ZXJ5IENvbXBvc2VyIGluc3RhbGxlZCBwcm9qZWN0IGFuZCBhdmFpbGFibGUgdG8gYWxsCiAqCiAqIFNlZSBhbHNvIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNy1ydW50aW1lLm1kI2luc3RhbGxlZC12ZXJzaW9ucwogKgogKiBUbyByZXF1aXJlIGl0cyBwcmVzZW5jZSwgeW91IGNhbiByZXF1aXJlIGBjb21wb3Nlci1ydW50aW1lLWFwaSBeMi4wYAogKgogKiBAZmluYWwKICovCmNsYXNzIEluc3RhbGxlZFZlcnNpb25zCnsKICAgIC8qKgogICAgICogQHZhciBzdHJpbmd8bnVsbCBpZiBzZXQgKGJ5IHJlZmxlY3Rpb24gYnkgQ29tcG9zZXIpLCB0aGlzIHNob3VsZCBiZSBzZXQgdG8gdGhlIHBhdGggd2hlcmUgdGhpcyBjbGFzcyBpcyBiZWluZyBjb3BpZWQgdG8KICAgICAqIEBpbnRlcm5hbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkc2VsZkRpciA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAdmFyIG1peGVkW118bnVsbAogICAgICogQHBzYWxtLXZhciBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fXxhcnJheXt9fG51bGwKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgJGluc3RhbGxlZDsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbAogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkSXNMb2NhbERpcjsKCiAgICAvKioKICAgICAqIEB2YXIgYm9vbHxudWxsCiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRjYW5HZXRWZW5kb3JzOwoKICAgIC8qKgogICAgICogQHZhciBhcnJheVtdCiAgICAgKiBAcHNhbG0tdmFyIGFycmF5PHN0cmluZywgYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0+CiAgICAgKi8KICAgIHByaXZhdGUgc3RhdGljICRpbnN0YWxsZWRCeVZlbmRvciA9IGFycmF5KCk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lcyB3aGljaCBhcmUgcHJlc2VudCwgZWl0aGVyIGJ5IGJlaW5nIGluc3RhbGxlZCwgcmVwbGFjZWQgb3IgcHJvdmlkZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHN0cmluZ1tdCiAgICAgKiBAcHNhbG0tcmV0dXJuIGxpc3Q8c3RyaW5nPgogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZFBhY2thZ2VzKCkKICAgIHsKICAgICAgICAkcGFja2FnZXMgPSBhcnJheSgpOwogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgJHBhY2thZ2VzW10gPSBhcnJheV9rZXlzKCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAkcGFja2FnZXNbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXlfa2V5cyhhcnJheV9mbGlwKFxjYWxsX3VzZXJfZnVuY19hcnJheSgnYXJyYXlfbWVyZ2UnLCAkcGFja2FnZXMpKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgcGFja2FnZSBuYW1lcyB3aXRoIGEgc3BlY2lmaWMgdHlwZSBlLmcuICdsaWJyYXJ5JwogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgJHR5cGUKICAgICAqIEByZXR1cm4gc3RyaW5nW10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxzdHJpbmc+CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXNCeVR5cGUoJHR5cGUpCiAgICB7CiAgICAgICAgJHBhY2thZ2VzQnlUeXBlID0gYXJyYXkoKTsKCiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBmb3JlYWNoICgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddIGFzICRuYW1lID0+ICRwYWNrYWdlKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNzZXQoJHBhY2thZ2VbJ3R5cGUnXSkgJiYgJHBhY2thZ2VbJ3R5cGUnXSA9PT0gJHR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAkcGFja2FnZXNCeVR5cGVbXSA9ICRuYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHBhY2thZ2VzQnlUeXBlOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgaXMgaW5zdGFsbGVkCiAgICAgKgogICAgICogVGhpcyBhbHNvIHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIHByb3ZpZGVkIG9yIHJlcGxhY2VkIGJ5IGFub3RoZXIgcGFja2FnZQogICAgICoKICAgICAqIEBwYXJhbSAgc3RyaW5nICRwYWNrYWdlTmFtZQogICAgICogQHBhcmFtICBib29sICAgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMKICAgICAqIEByZXR1cm4gYm9vbAogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzSW5zdGFsbGVkKCRwYWNrYWdlTmFtZSwgJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMgPSB0cnVlKQogICAgewogICAgICAgIGZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAkaW5jbHVkZURldlJlcXVpcmVtZW50cyB8fCAhaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSkgfHwgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydkZXZfcmVxdWlyZW1lbnQnXSA9PT0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYWNrYWdlIHNhdGlzZmllcyBhIHZlcnNpb24gY29uc3RyYWludAogICAgICoKICAgICAqIGUuZy4gSWYgeW91IHdhbnQgdG8ga25vdyB3aGV0aGVyIHZlcnNpb24gMi4zKyBvZiBwYWNrYWdlIGZvby9iYXIgaXMgaW5zdGFsbGVkLCB5b3Ugd291bGQgY2FsbDoKICAgICAqCiAgICAgKiAgIENvbXBvc2VyXEluc3RhbGxlZFZlcnNpb25zOjpzYXRpc2ZpZXMobmV3IFZlcnNpb25QYXJzZXIsICdmb28vYmFyJywgJ14yLjMnKQogICAgICoKICAgICAqIEBwYXJhbSAgVmVyc2lvblBhcnNlciAkcGFyc2VyICAgICAgSW5zdGFsbCBjb21wb3Nlci9zZW12ZXIgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhpcyBjbGFzcyBhbmQgZnVuY3Rpb25hbGl0eQogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAgICRwYWNrYWdlTmFtZQogICAgICogQHBhcmFtICBzdHJpbmd8bnVsbCAgICRjb25zdHJhaW50ICBBIHZlcnNpb24gY29uc3RyYWludCB0byBjaGVjayBmb3IsIGlmIHlvdSBwYXNzIG9uZSB5b3UgaGF2ZSB0byBtYWtlIHN1cmUgY29tcG9zZXIvc2VtdmVyIGlzIHJlcXVpcmVkIGJ5IHlvdXIgcGFja2FnZQogICAgICogQHJldHVybiBib29sCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2F0aXNmaWVzKFZlcnNpb25QYXJzZXIgJHBhcnNlciwgJHBhY2thZ2VOYW1lLCAkY29uc3RyYWludCkKICAgIHsKICAgICAgICAkY29uc3RyYWludCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoKHN0cmluZykgJGNvbnN0cmFpbnQpOwogICAgICAgICRwcm92aWRlZCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoc2VsZjo6Z2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpKTsKCiAgICAgICAgcmV0dXJuICRwcm92aWRlZC0+bWF0Y2hlcygkY29uc3RyYWludCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgdmVyc2lvbiBjb25zdHJhaW50IHJlcHJlc2VudGluZyBhbGwgdGhlIHJhbmdlKHMpIHdoaWNoIGFyZSBpbnN0YWxsZWQgZm9yIGEgZ2l2ZW4gcGFja2FnZQogICAgICoKICAgICAqIEl0IGlzIGVhc2llciB0byB1c2UgdGhpcyB2aWEgaXNJbnN0YWxsZWQoKSB3aXRoIHRoZSAkY29uc3RyYWludCBhcmd1bWVudCBpZiB5b3UgbmVlZCB0byBjaGVjawogICAgICogd2hldGhlciBhIGdpdmVuIHZlcnNpb24gb2YgYSBwYWNrYWdlIGlzIGluc3RhbGxlZCwgYW5kIG5vdCBqdXN0IHdoZXRoZXIgaXQgZXhpc3RzCiAgICAgKgogICAgICogQHBhcmFtICBzdHJpbmcgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZyBWZXJzaW9uIGNvbnN0cmFpbnQgdXNhYmxlIHdpdGggY29tcG9zZXIvc2VtdmVyCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkcmFuZ2VzID0gYXJyYXkoKTsKICAgICAgICAgICAgaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgICRyYW5nZXNbXSA9ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJyYXlfa2V5X2V4aXN0cygnYWxpYXNlcycsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgICRyYW5nZXMgPSBhcnJheV9tZXJnZSgkcmFuZ2VzLCAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2FsaWFzZXMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ3JlcGxhY2VkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVwbGFjZWQnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJ3Byb3ZpZGVkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJvdmlkZWQnXSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBpbXBsb2RlKCcgfHwgJywgJHJhbmdlcyk7CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgdmVyc2lvbiwgdXNlIHNhdGlzZmllcyBvciBnZXRWZXJzaW9uUmFuZ2VzIGlmIHlvdSBuZWVkIHRvIGtub3cgaWYgYSBnaXZlbiB2ZXJzaW9uIGlzIHByZXNlbnQKICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWZXJzaW9uKCRwYWNrYWdlTmFtZSkKICAgIHsKICAgICAgICBmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWyd2ZXJzaW9uJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsndmVyc2lvbiddOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsIElmIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlcGxhY2VkIG9yIHByb3ZpZGVkIGJ1dCBpcyBub3QgcmVhbGx5IGluc3RhbGxlZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFzIHZlcnNpb24sIHVzZSBzYXRpc2ZpZXMgb3IgZ2V0VmVyc2lvblJhbmdlcyBpZiB5b3UgbmVlZCB0byBrbm93IGlmIGEgZ2l2ZW4gdmVyc2lvbiBpcyBwcmVzZW50CiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UHJldHR5VmVyc2lvbigkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddOwogICAgICAgIH0KCiAgICAgICAgdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSAgc3RyaW5nICAgICAgJHBhY2thZ2VOYW1lCiAgICAgKiBAcmV0dXJuIHN0cmluZ3xudWxsIElmIHRoZSBwYWNrYWdlIGlzIGJlaW5nIHJlcGxhY2VkIG9yIHByb3ZpZGVkIGJ1dCBpcyBub3QgcmVhbGx5IGluc3RhbGxlZCwgbnVsbCB3aWxsIGJlIHJldHVybmVkIGFzIHJlZmVyZW5jZQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlZmVyZW5jZSgkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ10pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVmZXJlbmNlJ107CiAgICAgICAgfQoKICAgICAgICB0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtICBzdHJpbmcgICAgICAkcGFja2FnZU5hbWUKICAgICAqIEByZXR1cm4gc3RyaW5nfG51bGwgSWYgdGhlIHBhY2thZ2UgaXMgYmVpbmcgcmVwbGFjZWQgb3IgcHJvdmlkZWQgYnV0IGlzIG5vdCByZWFsbHkgaW5zdGFsbGVkLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgYXMgaW5zdGFsbCBwYXRoLiBQYWNrYWdlcyBvZiB0eXBlIG1ldGFwYWNrYWdlcyBhbHNvIGhhdmUgYSBudWxsIGluc3RhbGwgcGF0aC4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aCgkcGFja2FnZU5hbWUpCiAgICB7CiAgICAgICAgZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydpbnN0YWxsX3BhdGgnXSkgPyAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2luc3RhbGxfcGF0aCddIDogbnVsbDsKICAgICAgICB9CgogICAgICAgIHRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIGFycmF5CiAgICAgKiBAcHNhbG0tcmV0dXJuIGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3RQYWNrYWdlKCkKICAgIHsKICAgICAgICAkaW5zdGFsbGVkID0gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CgogICAgICAgIHJldHVybiAkaW5zdGFsbGVkWzBdWydyb290J107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSByYXcgaW5zdGFsbGVkLnBocCBkYXRhIGZvciBjdXN0b20gaW1wbGVtZW50YXRpb25zCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEFsbFJhd0RhdGEoKSBpbnN0ZWFkIHdoaWNoIHJldHVybnMgYWxsIGRhdGFzZXRzIGZvciBhbGwgYXV0b2xvYWRlcnMgcHJlc2VudCBpbiB0aGUgcHJvY2Vzcy4gZ2V0UmF3RGF0YSBvbmx5IHJldHVybnMgdGhlIGZpcnN0IGRhdGFzZXQgbG9hZGVkLCB3aGljaCBtYXkgbm90IGJlIHdoYXQgeW91IGV4cGVjdC4KICAgICAqIEByZXR1cm4gYXJyYXlbXQogICAgICogQHBzYWxtLXJldHVybiBhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fQogICAgICovCiAgICBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJhd0RhdGEoKQogICAgewogICAgICAgIEB0cmlnZ2VyX2Vycm9yKCdnZXRSYXdEYXRhIG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgZGF0YXNldCBsb2FkZWQsIHdoaWNoIG1heSBub3QgYmUgd2hhdCB5b3UgZXhwZWN0LiBVc2UgZ2V0QWxsUmF3RGF0YSgpIGluc3RlYWQgd2hpY2ggcmV0dXJucyBhbGwgZGF0YXNldHMgZm9yIGFsbCBhdXRvbG9hZGVycyBwcmVzZW50IGluIHRoZSBwcm9jZXNzLicsIEVfVVNFUl9ERVBSRUNBVEVEKTsKCiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgLy8gb25seSByZXF1aXJlIHRoZSBpbnN0YWxsZWQucGhwIGZpbGUgaWYgdGhpcyBmaWxlIGlzIGxvYWRlZCBmcm9tIGl0cyBkdW1wZWQgbG9jYXRpb24sCiAgICAgICAgICAgIC8vIGFuZCBub3QgZnJvbSBpdHMgc291cmNlIGxvY2F0aW9uIGluIHRoZSBjb21wb3Nlci9jb21wb3NlciBwYWNrYWdlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy85OTM3CiAgICAgICAgICAgIGlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSBpbmNsdWRlIF9fRElSX18gLiAnL2luc3RhbGxlZC5waHAnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZCA9IGFycmF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokaW5zdGFsbGVkOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcmF3IGRhdGEgb2YgYWxsIGluc3RhbGxlZC5waHAgd2hpY2ggYXJlIGN1cnJlbnRseSBsb2FkZWQgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMKICAgICAqCiAgICAgKiBAcmV0dXJuIGFycmF5W10KICAgICAqIEBwc2FsbS1yZXR1cm4gbGlzdDxhcnJheXtyb290OiBhcnJheXtuYW1lOiBzdHJpbmcsIHByZXR0eV92ZXJzaW9uOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcmVmZXJlbmNlOiBzdHJpbmd8bnVsbCwgdHlwZTogc3RyaW5nLCBpbnN0YWxsX3BhdGg6IHN0cmluZywgYWxpYXNlczogc3RyaW5nW10sIGRldjogYm9vbH0sIHZlcnNpb25zOiBhcnJheTxzdHJpbmcsIGFycmF5e3ByZXR0eV92ZXJzaW9uPzogc3RyaW5nLCB2ZXJzaW9uPzogc3RyaW5nLCByZWZlcmVuY2U/OiBzdHJpbmd8bnVsbCwgdHlwZT86IHN0cmluZywgaW5zdGFsbF9wYXRoPzogc3RyaW5nLCBhbGlhc2VzPzogc3RyaW5nW10sIGRldl9yZXF1aXJlbWVudDogYm9vbCwgcmVwbGFjZWQ/OiBzdHJpbmdbXSwgcHJvdmlkZWQ/OiBzdHJpbmdbXX0+fT4KICAgICAqLwogICAgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxSYXdEYXRhKCkKICAgIHsKICAgICAgICByZXR1cm4gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMZXRzIHlvdSByZWxvYWQgdGhlIHN0YXRpYyBhcnJheSBmcm9tIGFub3RoZXIgZmlsZQogICAgICoKICAgICAqIFRoaXMgaXMgb25seSB1c2VmdWwgZm9yIGNvbXBsZXggaW50ZWdyYXRpb25zIGluIHdoaWNoIGEgcHJvamVjdCBuZWVkcyB0byB1c2UKICAgICAqIHRoaXMgY2xhc3MgYnV0IHRoZW4gYWxzbyBuZWVkcyB0byBleGVjdXRlIGFub3RoZXIgcHJvamVjdCdzIGF1dG9sb2FkZXIgaW4gcHJvY2VzcywKICAgICAqIGFuZCB3YW50cyB0byBlbnN1cmUgYm90aCBwcm9qZWN0cyBoYXZlIGFjY2VzcyB0byB0aGVpciB2ZXJzaW9uIG9mIGluc3RhbGxlZC5waHAuCiAgICAgKgogICAgICogQSB0eXBpY2FsIGNhc2Ugd291bGQgYmUgUEhQVW5pdCwgd2hlcmUgaXQgd291bGQgbmVlZCB0byBtYWtlIHN1cmUgaXQgcmVhZHMgYWxsCiAgICAgKiB0aGUgZGF0YSBpdCBuZWVkcyBmcm9tIHRoaXMgY2xhc3MsIHRoZW4gY2FsbCByZWxvYWQoKSB3aXRoCiAgICAgKiBgcmVxdWlyZSAkQ1dEL3ZlbmRvci9jb21wb3Nlci9pbnN0YWxsZWQucGhwYCAob3Igc2ltaWxhcikgYXMgaW5wdXQgdG8gbWFrZSBzdXJlCiAgICAgKiB0aGUgcHJvamVjdCBpbiB3aGljaCBpdCBydW5zIGNhbiB0aGVuIGFsc28gdXNlIHRoaXMgY2xhc3Mgc2FmZWx5LCB3aXRob3V0CiAgICAgKiBpbnRlcmZlcmVuY2UgYmV0d2VlbiBQSFBVbml0J3MgZGVwZW5kZW5jaWVzIGFuZCB0aGUgcHJvamVjdCdzIGRlcGVuZGVuY2llcy4KICAgICAqCiAgICAgKiBAcGFyYW0gIGFycmF5W10gJGRhdGEgQSB2ZW5kb3IvY29tcG9zZXIvaW5zdGFsbGVkLnBocCBkYXRhIHNldAogICAgICogQHJldHVybiB2b2lkCiAgICAgKgogICAgICogQHBzYWxtLXBhcmFtIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59ICRkYXRhCiAgICAgKi8KICAgIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVsb2FkKCRkYXRhKQogICAgewogICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkZGF0YTsKICAgICAgICBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3IgPSBhcnJheSgpOwoKICAgICAgICAvLyB3aGVuIHVzaW5nIHJlbG9hZCwgd2UgZGlzYWJsZSB0aGUgZHVwbGljYXRlIHByb3RlY3Rpb24gdG8gZW5zdXJlIHRoYXQgc2VsZjo6JGluc3RhbGxlZCBkYXRhIGlzCiAgICAgICAgLy8gYWx3YXlzIHJldHVybmVkLCBidXQgd2UgY2Fubm90IGtub3cgd2hldGhlciBpdCBjb21lcyBmcm9tIHRoZSBpbnN0YWxsZWQucGhwIGluIF9fRElSX18gb3Igbm90LAogICAgICAgIC8vIHNvIHdlIGhhdmUgdG8gYXNzdW1lIGl0IGRvZXMgbm90LCBhbmQgdGhhdCBtYXkgcmVzdWx0IGluIGR1cGxpY2F0ZSBkYXRhIGJlaW5nIHJldHVybmVkIHdoZW4gbGlzdGluZwogICAgICAgIC8vIGFsbCBpbnN0YWxsZWQgcGFja2FnZXMgZm9yIGV4YW1wbGUKICAgICAgICBzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiBzdHJpbmcKICAgICAqLwogICAgcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U2VsZkRpcigpCiAgICB7CiAgICAgICAgaWYgKHNlbGY6OiRzZWxmRGlyID09PSBudWxsKSB7CiAgICAgICAgICAgIHNlbGY6OiRzZWxmRGlyID0gc3RydHIoX19ESVJfXywgJ1xcJywgJy8nKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzZWxmOjokc2VsZkRpcjsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4gYXJyYXlbXQogICAgICogQHBzYWxtLXJldHVybiBsaXN0PGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59PgogICAgICovCiAgICBwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWQoKQogICAgewogICAgICAgIGlmIChudWxsID09PSBzZWxmOjokY2FuR2V0VmVuZG9ycykgewogICAgICAgICAgICBzZWxmOjokY2FuR2V0VmVuZG9ycyA9IG1ldGhvZF9leGlzdHMoJ0NvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyJywgJ2dldFJlZ2lzdGVyZWRMb2FkZXJzJyk7CiAgICAgICAgfQoKICAgICAgICAkaW5zdGFsbGVkID0gYXJyYXkoKTsKICAgICAgICAkY29waWVkTG9jYWxEaXIgPSBmYWxzZTsKCiAgICAgICAgaWYgKHNlbGY6OiRjYW5HZXRWZW5kb3JzKSB7CiAgICAgICAgICAgICRzZWxmRGlyID0gc2VsZjo6Z2V0U2VsZkRpcigpOwogICAgICAgICAgICBmb3JlYWNoIChDbGFzc0xvYWRlcjo6Z2V0UmVnaXN0ZXJlZExvYWRlcnMoKSBhcyAkdmVuZG9yRGlyID0+ICRsb2FkZXIpIHsKICAgICAgICAgICAgICAgICR2ZW5kb3JEaXIgPSBzdHJ0cigkdmVuZG9yRGlyLCAnXFwnLCAnLycpOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KHNlbGY6OiRpbnN0YWxsZWRCeVZlbmRvclskdmVuZG9yRGlyXSkpIHsKICAgICAgICAgICAgICAgICAgICAkaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl07CiAgICAgICAgICAgICAgICB9IGVsc2VpZiAoaXNfZmlsZSgkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCcpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB2YXIgYXJyYXl7cm9vdDogYXJyYXl7bmFtZTogc3RyaW5nLCBwcmV0dHlfdmVyc2lvbjogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIHJlZmVyZW5jZTogc3RyaW5nfG51bGwsIHR5cGU6IHN0cmluZywgaW5zdGFsbF9wYXRoOiBzdHJpbmcsIGFsaWFzZXM6IHN0cmluZ1tdLCBkZXY6IGJvb2x9LCB2ZXJzaW9uczogYXJyYXk8c3RyaW5nLCBhcnJheXtwcmV0dHlfdmVyc2lvbj86IHN0cmluZywgdmVyc2lvbj86IHN0cmluZywgcmVmZXJlbmNlPzogc3RyaW5nfG51bGwsIHR5cGU/OiBzdHJpbmcsIGluc3RhbGxfcGF0aD86IHN0cmluZywgYWxpYXNlcz86IHN0cmluZ1tdLCBkZXZfcmVxdWlyZW1lbnQ6IGJvb2wsIHJlcGxhY2VkPzogc3RyaW5nW10sIHByb3ZpZGVkPzogc3RyaW5nW119Pn0gJHJlcXVpcmVkICovCiAgICAgICAgICAgICAgICAgICAgJHJlcXVpcmVkID0gcmVxdWlyZSAkdmVuZG9yRGlyLicvY29tcG9zZXIvaW5zdGFsbGVkLnBocCc7CiAgICAgICAgICAgICAgICAgICAgc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdID0gJHJlcXVpcmVkOwogICAgICAgICAgICAgICAgICAgICRpbnN0YWxsZWRbXSA9ICRyZXF1aXJlZDsKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZjo6JGluc3RhbGxlZCA9PT0gbnVsbCAmJiAkdmVuZG9yRGlyLicvY29tcG9zZXInID09PSAkc2VsZkRpcikgewogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gJHJlcXVpcmVkOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyICYmICR2ZW5kb3JEaXIuJy9jb21wb3NlcicgPT09ICRzZWxmRGlyKSB7CiAgICAgICAgICAgICAgICAgICAgJGNvcGllZExvY2FsRGlyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKICAgICAgICAgICAgLy8gb25seSByZXF1aXJlIHRoZSBpbnN0YWxsZWQucGhwIGZpbGUgaWYgdGhpcyBmaWxlIGlzIGxvYWRlZCBmcm9tIGl0cyBkdW1wZWQgbG9jYXRpb24sCiAgICAgICAgICAgIC8vIGFuZCBub3QgZnJvbSBpdHMgc291cmNlIGxvY2F0aW9uIGluIHRoZSBjb21wb3Nlci9jb21wb3NlciBwYWNrYWdlLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NvbXBvc2VyL2lzc3Vlcy85OTM3CiAgICAgICAgICAgIGlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKICAgICAgICAgICAgICAgIC8qKiBAdmFyIGFycmF5e3Jvb3Q6IGFycmF5e25hbWU6IHN0cmluZywgcHJldHR5X3ZlcnNpb246IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCByZWZlcmVuY2U6IHN0cmluZ3xudWxsLCB0eXBlOiBzdHJpbmcsIGluc3RhbGxfcGF0aDogc3RyaW5nLCBhbGlhc2VzOiBzdHJpbmdbXSwgZGV2OiBib29sfSwgdmVyc2lvbnM6IGFycmF5PHN0cmluZywgYXJyYXl7cHJldHR5X3ZlcnNpb24/OiBzdHJpbmcsIHZlcnNpb24/OiBzdHJpbmcsIHJlZmVyZW5jZT86IHN0cmluZ3xudWxsLCB0eXBlPzogc3RyaW5nLCBpbnN0YWxsX3BhdGg/OiBzdHJpbmcsIGFsaWFzZXM/OiBzdHJpbmdbXSwgZGV2X3JlcXVpcmVtZW50OiBib29sLCByZXBsYWNlZD86IHN0cmluZ1tdLCBwcm92aWRlZD86IHN0cmluZ1tdfT59ICRyZXF1aXJlZCAqLwogICAgICAgICAgICAgICAgJHJlcXVpcmVkID0gcmVxdWlyZSBfX0RJUl9fIC4gJy9pbnN0YWxsZWQucGhwJzsKICAgICAgICAgICAgICAgIHNlbGY6OiRpbnN0YWxsZWQgPSAkcmVxdWlyZWQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxmOjokaW5zdGFsbGVkID0gYXJyYXkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHNlbGY6OiRpbnN0YWxsZWQgIT09IGFycmF5KCkgJiYgISRjb3BpZWRMb2NhbERpcikgewogICAgICAgICAgICAkaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRpbnN0YWxsZWQ7CiAgICB9Cn0KewogICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgICAidGl0bGUiOiAiQ29tcG9zZXIgTG9jayBGaWxlIiwKICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAicmVxdWlyZWQiOiBbICJjb250ZW50LWhhc2giLCAicGFja2FnZXMiLCAicGFja2FnZXMtZGV2IiBdLAogICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZSwKICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICJfcmVhZG1lIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZm9ybWF0aW9uYWwgdGV4dCBmb3IgaHVtYW5zIHJlYWRpbmcgdGhlIGZpbGUiCiAgICAgICAgfSwKICAgICAgICAiY29udGVudC1oYXNoIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSGFzaCBvZiBhbGwgcmVsZXZhbnQgcHJvcGVydGllcyBvZiB0aGUgY29tcG9zZXIuanNvbiB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGxvY2sgZmlsZS4iCiAgICAgICAgfSwKICAgICAgICAicGFja2FnZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIHBhY2thZ2VzIHRoYXQgYXJlIHJlcXVpcmVkLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICIkcmVmIjogIi4vY29tcG9zZXItc2NoZW1hLmpzb24iLAogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJuYW1lIiwgInZlcnNpb24iXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGFja2FnZXMtZGV2IjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBwYWNrYWdlcyB0aGF0IGFyZSByZXF1aXJlZCBpbiByZXF1aXJlLWRldi4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAiJHJlZiI6ICIuL2NvbXBvc2VyLXNjaGVtYS5qc29uIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYWxpYXNlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW5saW5lIGFsaWFzZXMgZGVmaW5lZCBpbiB0aGUgcm9vdCBwYWNrYWdlLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJwYWNrYWdlIiwgInZlcnNpb24iLCAiYWxpYXMiLCAiYWxpYXNfbm9ybWFsaXplZCIgXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiYWxpYXNfbm9ybWFsaXplZCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIm1pbmltdW0tc3RhYmlsaXR5IjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIG1pbmltdW0tc3RhYmlsaXR5IHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0sCiAgICAgICAgInN0YWJpbGl0eS1mbGFncyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlJvb3QgcGFja2FnZSBzdGFiaWxpdHkgZmxhZ3MgY2hhbmdpbmcgdGhlIG1pbmltdW0tc3RhYmlsaXR5IGZvciBzcGVjaWZpYyBwYWNrYWdlcy4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicHJlZmVyLXN0YWJsZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRoZSAtLXByZWZlci1zdGFibGUgZmxhZyB3YXMgdXNlZCB3aGVuIGJ1aWxkaW5nIHRoaXMgbG9jayBmaWxlLiIKICAgICAgICB9LAogICAgICAgICJwcmVmZXItbG93ZXN0IjogewogICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgdGhlIC0tcHJlZmVyLWxvd2VzdCBmbGFnIHdhcyB1c2VkIHdoZW4gYnVpbGRpbmcgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0sCiAgICAgICAgInBsYXRmb3JtIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGxhdGZvcm0gcmVxdWlyZW1lbnRzIG9mIHRoZSByb290IHBhY2thZ2UuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGxhdGZvcm0tZGV2IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGxhdGZvcm0gZGV2LXJlcXVpcmVtZW50cyBvZiB0aGUgcm9vdCBwYWNrYWdlLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBsYXRmb3JtLW92ZXJyaWRlcyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBsYXRmb3JtIGNvbmZpZyBvdmVycmlkZXMgb2YgdGhlIHJvb3QgcGFja2FnZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJwbHVnaW4tYXBpLXZlcnNpb24iOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29tcG9zZXItcGx1Z2luLWFwaSB2ZXJzaW9uIHRoYXQgd2FzIHVzZWQgdG8gZ2VuZXJhdGUgdGhpcyBsb2NrIGZpbGUuIgogICAgICAgIH0KICAgIH0KfQp7CiAgICAiJHNjaGVtYSI6ICJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEjIiwKICAgICJ0aXRsZSI6ICJDb21wb3NlciBQYWNrYWdlIFJlcG9zaXRvcnkiLAogICAgInR5cGUiOiAib2JqZWN0IiwKICAgICJvbmVPZiI6IFsKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgInBhY2thZ2VzIiBdIH0sCiAgICAgICAgeyAicmVxdWlyZWQiOiBbICJwcm92aWRlcnMiIF0gfSwKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgInByb3ZpZGVyLWluY2x1ZGVzIiwgInByb3ZpZGVycy11cmwiIF0gfSwKICAgICAgICB7ICJyZXF1aXJlZCI6IFsgIm1ldGFkYXRhLXVybCIgXSB9CiAgICBdLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgInBhY2thZ2VzIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGhhc2htYXAgb2YgcGFja2FnZSBuYW1lcyBpbiB0aGUgZm9ybSBvZiA8dmVuZG9yPi88bmFtZT4uIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3ZlcnNpb25zIiB9CiAgICAgICAgfSwKICAgICAgICAibWV0YWRhdGEtdXJsIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gcmV0cmlldmUgcGFja2FnZSBtZXRhZGF0YSBkYXRhIGZyb20sIGluIENvbXBvc2VyIHYyIGZvcm1hdCwgZS5nLiAnL3AyLyVwYWNrYWdlJS5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAiYXZhaWxhYmxlLXBhY2thZ2VzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHlvdXIgcmVwb3NpdG9yeSBvbmx5IGhhcyBhIHNtYWxsIG51bWJlciBvZiBwYWNrYWdlcywgYW5kIHlvdSB3YW50IHRvIGF2b2lkIHNlcnZpbmcgbWFueSA0MDRzLCBzcGVjaWZ5IGFsbCB0aGUgcGFja2FnZSBuYW1lcyB0aGF0IHlvdXIgcmVwb3NpdG9yeSBjb250YWlucyBoZXJlLiIKICAgICAgICB9LAogICAgICAgICJhdmFpbGFibGUtcGFja2FnZS1wYXR0ZXJucyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB5b3VyIHJlcG9zaXRvcnkgb25seSBoYXMgYSBzbWFsbCBudW1iZXIgb2YgcGFja2FnZXMsIGFuZCB5b3Ugd2FudCB0byBhdm9pZCBzZXJ2aW5nIG1hbnkgNDA0cywgc3BlY2lmeSBwYWNrYWdlIG5hbWUgcGF0dGVybnMgY29udGFpbmluZyB3aWxkY2FyZHMgKCopIHRoYXQgeW91ciByZXBvc2l0b3J5IGNvbnRhaW5zIGhlcmUuIgogICAgICAgIH0sCiAgICAgICAgInNlY3VyaXR5LWFkdmlzb3JpZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibWV0YWRhdGEiLCAiYXBpLXVybCJdLAogICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgIm1ldGFkYXRhIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgbWV0YWRhdGEgZmlsZXMgY29udGFpbiBzZWN1cml0eSBhZHZpc29yeSBkYXRhIG9yIHdoZXRoZXIgaXQgc2hvdWxkIGFsd2F5cyBiZSBxdWVyaWVkIHVzaW5nIHRoZSBBUEkgVVJMLiIKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICJhcGktdXJsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gY2FsbCB0byByZXRyaWV2ZSBzZWN1cml0eSBhZHZpc29yaWVzIGRhdGEuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgIm1ldGFkYXRhLWNoYW5nZXMtdXJsIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gcmV0cmlldmUgcGFja2FnZSBtZXRhZGF0YSB1cGRhdGVzIGZyb20uIFRoaXMgc2hvdWxkIHJlY2VpdmUgYSB0aW1lc3RhbXAgc2luY2UgbGFzdCBjYWxsIHRvIGJlIGFibGUgdG8gcmV0dXJuIG5ldyBjaGFuZ2VzLiBlLmcuICcvbWV0YWRhdGEvY2hhbmdlcy5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZXJzLWFwaSI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuZHBvaW50IHRvIHJldHJpZXZlIHBhY2thZ2UgbmFtZXMgcHJvdmlkaW5nIGEgZ2l2ZW4gbmFtZSBmcm9tLCBlLmcuICcvcHJvdmlkZXJzLyVwYWNrYWdlJS5qc29uJy4iCiAgICAgICAgfSwKICAgICAgICAibm90aWZ5LWJhdGNoIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW5kcG9pbnQgdG8gY2FsbCBhZnRlciBtdWx0aXBsZSBwYWNrYWdlcyBoYXZlIGJlZW4gaW5zdGFsbGVkLCBlLmcuICcvZG93bmxvYWRzLycuIgogICAgICAgIH0sCiAgICAgICAgInNlYXJjaCI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVuZHBvaW50IHRoYXQgcHJvdmlkZXMgc2VhcmNoIGNhcGFiaWxpdGllcywgZS5nLiAnL3NlYXJjaC5qc29uP3E9JXF1ZXJ5JSZ0eXBlPSV0eXBlJScuIgogICAgICAgIH0sCiAgICAgICAgImxpc3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFbmRwb2ludCB0aGF0IHByb3ZpZGVzIGEgZnVsbCBsaXN0IG9mIHBhY2thZ2VzIHByZXNlbnQgaW4gdGhlIHJlcG9zaXRvcnkuIEl0IHNob3VsZCBhY2NlcHQgYW4gb3B0aW9uYWwgYD9maWx0ZXI9eHhgIHF1ZXJ5IHBhcmFtLCB3aGljaCBjYW4gY29udGFpbiBgKmAgYXMgd2lsZGNhcmRzIG1hdGNoaW5nIGFueSBzdWJzdHJpbmcuIGUuZy4gJy9saXN0Lmpzb24nLiIKICAgICAgICB9LAogICAgICAgICJ3YXJuaW5ncyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJtZXNzYWdlIiwgInZlcnNpb25zIl0sCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbWVzc2FnZSB0aGF0IHdpbGwgYmUgb3V0cHV0IGJ5IENvbXBvc2VyIGFzIGEgd2FybmluZyB3aGVuIHRoaXMgc291cmNlIGlzIGNvbnN1bHRlZC4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVyc2lvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHZlcnNpb24gY29uc3RyYWludCB0byBsaW1pdCB0byB3aGljaCBDb21wb3NlciB2ZXJzaW9ucyB0aGUgd2FybmluZyBzaG91bGQgYmUgc2hvd24uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImluZm9zIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm1lc3NhZ2UiLCAidmVyc2lvbnMiXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgaW5mbyB3aGVuIHRoaXMgc291cmNlIGlzIGNvbnN1bHRlZC4iCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAidmVyc2lvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHZlcnNpb24gY29uc3RyYWludCB0byBsaW1pdCB0byB3aGljaCBDb21wb3NlciB2ZXJzaW9ucyB0aGUgaW5mbyBzaG91bGQgYmUgc2hvd24uIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVycy11cmwiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBFbmRwb2ludCB0byByZXRyaWV2ZSBwcm92aWRlciBkYXRhIGZyb20sIGUuZy4gJy9wLyVwYWNrYWdlJSQlaGFzaCUuanNvbicuIgogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVyLWluY2x1ZGVzIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBoYXNobWFwIG9mIHByb3ZpZGVyIGxpc3RpbmdzLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9wcm92aWRlciIgfQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVycyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEEgaGFzaG1hcCBvZiBwYWNrYWdlIG5hbWVzIGluIHRoZSBmb3JtIG9mIDx2ZW5kb3I+LzxuYW1lPi4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcHJvdmlkZXIiIH0KICAgICAgICB9LAogICAgICAgICJ3YXJuaW5nIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgYSB3YXJuaW5nIHdoZW4gdGhpcyBzb3VyY2UgaXMgY29uc3VsdGVkLiIKICAgICAgICB9LAogICAgICAgICJ3YXJuaW5nLXZlcnNpb25zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gbGltaXQgdG8gd2hpY2ggQ29tcG9zZXIgdmVyc2lvbnMgdGhlIHdhcm5pbmcgc2hvdWxkIGJlIHNob3duLiIKICAgICAgICB9LAogICAgICAgICJpbmZvIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSBtZXNzYWdlIHRoYXQgd2lsbCBiZSBvdXRwdXQgYnkgQ29tcG9zZXIgYXMgYSBpbmZvIHdoZW4gdGhpcyBzb3VyY2UgaXMgY29uc3VsdGVkLiIKICAgICAgICB9LAogICAgICAgICJpbmZvLXZlcnNpb25zIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogQSB2ZXJzaW9uIGNvbnN0cmFpbnQgdG8gbGltaXQgdG8gd2hpY2ggQ29tcG9zZXIgdmVyc2lvbnMgdGhlIGluZm8gc2hvdWxkIGJlIHNob3duLiIKICAgICAgICB9CiAgICB9LAogICAgImRlZmluaXRpb25zIjogewogICAgICAgICJ2ZXJzaW9ucyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgaGFzaG1hcCBvZiB2ZXJzaW9ucyBhbmQgdGhlaXIgbWV0YWRhdGEuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3ZlcnNpb24iIH0KICAgICAgICB9LAogICAgICAgICJ2ZXJzaW9uIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAib25lT2YiOiBbCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGFja2FnZSIgfSwKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9tZXRhcGFja2FnZSIgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAicGFja2FnZS1iYXNlIjogewogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInZlcnNpb24iOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTm9ybWFsaXplZCB2ZXJzaW9uLCBvcHRpb25hbCBidXQgY2FuIHNhdmUgY29tcHV0YXRpb25hbCB0aW1lIG9uIGNsaWVudCBzaWRlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0b2xvYWQiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICJyZXF1aXJlIjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAicmVwbGFjZSI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgImNvbmZsaWN0IjogeyAidHlwZSI6ICJvYmplY3QiIH0sCiAgICAgICAgICAgICAgICAicHJvdmlkZSI6IHsgInR5cGUiOiAib2JqZWN0IiB9LAogICAgICAgICAgICAgICAgInRpbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAicGFja2FnZSI6IHsKICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhY2thZ2UtYmFzZSIgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImRpc3QiOiB7ICJ0eXBlIjogIm9iamVjdCIgfSwKICAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSI6IHsgInR5cGUiOiAib2JqZWN0IiB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsgIm9uZU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2ZXJzaW9uIiwgInNvdXJjZSIgXSB9LAogICAgICAgICAgICAgICAgICAgIHsgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2ZXJzaW9uIiwgImRpc3QiIF0gfQogICAgICAgICAgICAgICAgXSB9CiAgICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgICJtZXRhcGFja2FnZSI6IHsKICAgICAgICAgICAgImFsbE9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhY2thZ2UtYmFzZSIgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyAibWV0YXBhY2thZ2UiIF0gfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyAibmFtZSIsICJ2ZXJzaW9uIiwgInR5cGUiIF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgInByb3ZpZGVyIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJzaGEyNTYiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSGFzaCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSByZXNvdXJjZS4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KewogICAgIiRzY2hlbWEiOiAiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsCiAgICAidGl0bGUiOiAiQ29tcG9zZXIgUGFja2FnZSIsCiAgICAidHlwZSI6ICJvYmplY3QiLAogICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgIm5hbWUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYWNrYWdlIG5hbWUsIGluY2x1ZGluZyAndmVuZG9yLW5hbWUvJyBwcmVmaXguIiwKICAgICAgICAgICAgInBhdHRlcm4iOiAiXlthLXowLTldKFtfLi1dP1thLXowLTldKykqXC9bYS16MC05XSgoW18uXXwtezEsMn0pP1thLXowLTldKykqJCIKICAgICAgICB9LAogICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNob3J0IHBhY2thZ2UgZGVzY3JpcHRpb24uIgogICAgICAgIH0sCiAgICAgICAgImxpY2Vuc2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkxpY2Vuc2UgbmFtZS4gT3IgYW4gYXJyYXkgb2YgbGljZW5zZSBuYW1lcy4iCiAgICAgICAgfSwKICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgdHlwZSwgZWl0aGVyICdsaWJyYXJ5JyBmb3IgY29tbW9uIHBhY2thZ2VzLCAnY29tcG9zZXItcGx1Z2luJyBmb3IgcGx1Z2lucywgJ21ldGFwYWNrYWdlJyBmb3IgZW1wdHkgcGFja2FnZXMsIG9yIGEgY3VzdG9tIHR5cGUgKFthLXowLTktXSspIGRlZmluZWQgYnkgd2hhdGV2ZXIgcHJvamVjdCB0aGlzIHBhY2thZ2UgYXBwbGllcyB0by4iLAogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAicGF0dGVybiI6ICJeW2EtejAtOS1dKyQiCiAgICAgICAgfSwKICAgICAgICAiYWJhbmRvbmVkIjogewogICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiIsICJzdHJpbmciXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkluZGljYXRlcyB3aGV0aGVyIHRoaXMgcGFja2FnZSBoYXMgYmVlbiBhYmFuZG9uZWQsIGl0IGNhbiBiZSBib29sZWFuIG9yIGEgcGFja2FnZSBuYW1lL1VSTCBwb2ludGluZyB0byBhIHJlY29tbWVuZGVkIGFsdGVybmF0aXZlLiBEZWZhdWx0cyB0byBmYWxzZS4iCiAgICAgICAgfSwKICAgICAgICAidmVyc2lvbiI6IHsKICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgdmVyc2lvbiwgc2VlIGh0dHBzOi8vZ2V0Y29tcG9zZXIub3JnL2RvYy8wNC1zY2hlbWEubWQjdmVyc2lvbiBmb3IgbW9yZSBpbmZvIG9uIHZhbGlkIHNjaGVtZXMuIiwKICAgICAgICAgICAgInBhdHRlcm4iOiAiXlt2Vl0/XFxkKyg/OlsuLV1cXGQrKXswLDN9Wy5fLV0/KD86KD86W3NTXVt0VF1bYUFdW2JCXVtsTF1bZUVdfFtiQl1bZUVdW3RUXVthQV18W2JCXXxbclJdW2NDXXxbYUFdW2xMXVtwUF1baEhdW2FBXXxbYUFdfFtwUF1bYUFdW3RUXVtjQ11baEhdfFtwUF1bbExdfFtwUF0pKD86KD86Wy4tXT9cXGQrKSopPyk/KD86Wy4tXT9bZERdW2VFXVt2Vl18XFwueC1kZXYpPyg/OlxcKy4qKT8kfF5kZXYtLiokIgogICAgICAgIH0sCiAgICAgICAgImRlZmF1bHQtYnJhbmNoIjogewogICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSW50ZXJuYWwgdXNlIG9ubHksIGRvIG5vdCBzcGVjaWZ5IHRoaXMgaW4gY29tcG9zZXIuanNvbi4gSW5kaWNhdGVzIHdoZXRoZXIgdGhpcyB2ZXJzaW9uIGlzIHRoZSBkZWZhdWx0IGJyYW5jaCBvZiB0aGUgbGlua2VkIFZDUyByZXBvc2l0b3J5LiBEZWZhdWx0cyB0byBmYWxzZS4iCiAgICAgICAgfSwKICAgICAgICAibm9uLWZlYXR1cmUtYnJhbmNoZXMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzZXQgb2Ygc3RyaW5nIG9yIHJlZ2V4IHBhdHRlcm5zIGZvciBub24tbnVtZXJpYyBicmFuY2ggbmFtZXMgdGhhdCB3aWxsIG5vdCBiZSBoYW5kbGVkIGFzIGZlYXR1cmUgYnJhbmNoZXMuIiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAia2V5d29yZHMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHRhZy9rZXl3b3JkIHRoYXQgdGhpcyBwYWNrYWdlIHJlbGF0ZXMgdG8uIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVhZG1lIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVsYXRpdmUgcGF0aCB0byB0aGUgcmVhZG1lIGRvY3VtZW50LiIKICAgICAgICB9LAogICAgICAgICJ0aW1lIjogewogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGFja2FnZSByZWxlYXNlIGRhdGUsIGluICdZWVlZLU1NLUREJywgJ1lZWVktTU0tREQgSEg6TU06U1MnIG9yICdZWVlZLU1NLUREVEhIOk1NOlNTWicgZm9ybWF0LiIKICAgICAgICB9LAogICAgICAgICJhdXRob3JzIjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2F1dGhvcnMiCiAgICAgICAgfSwKICAgICAgICAiaG9tZXBhZ2UiOiB7CiAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIb21lcGFnZSBVUkwgZm9yIHRoZSBwcm9qZWN0LiIsCiAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgIH0sCiAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImVtYWlsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkVtYWlsIGFkZHJlc3MgZm9yIHN1cHBvcnQuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogImVtYWlsIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBpc3N1ZSB0cmFja2VyLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImZvcnVtIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgZm9ydW0uIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAid2lraSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIHdpa2kuIiwKICAgICAgICAgICAgICAgICAgICAiZm9ybWF0IjogInVyaSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiaXJjIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklSQyBjaGFubmVsIGZvciBzdXBwb3J0LCBhcyBpcmM6Ly9zZXJ2ZXIvY2hhbm5lbC4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjaGF0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgc3VwcG9ydCBjaGF0LiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gYnJvd3NlIG9yIGRvd25sb2FkIHRoZSBzb3VyY2VzLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRvY3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVVJMIHRvIHRoZSBkb2N1bWVudGF0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJzcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJVUkwgdG8gdGhlIFJTUyBmZWVkLiIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNlY3VyaXR5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byB0aGUgdnVsbmVyYWJpbGl0eSBkaXNjbG9zdXJlIHBvbGljeSAoVkRQKS4iLAogICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAidXJpIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiZnVuZGluZyI6IHsKICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIG9wdGlvbnMgdG8gZnVuZCB0aGUgZGV2ZWxvcG1lbnQgYW5kIG1haW50ZW5hbmNlIG9mIHRoZSBwYWNrYWdlLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlR5cGUgb2YgZnVuZGluZyBvciBwbGF0Zm9ybSB0aHJvdWdoIHdoaWNoIGZ1bmRpbmcgaXMgcG9zc2libGUuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgInVybCI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlVSTCB0byBhIHdlYnNpdGUgd2l0aCBkZXRhaWxzIG9uIGZ1bmRpbmcgYW5kIGEgd2F5IHRvIGZ1bmQgdGhlIHBhY2thZ2UuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3NvdXJjZSIKICAgICAgICB9LAogICAgICAgICJkaXN0IjogewogICAgICAgICAgICAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2Rpc3QiCiAgICAgICAgfSwKICAgICAgICAiX2NvbW1lbnQiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEga2V5IHRvIHN0b3JlIGNvbW1lbnRzIGluIgogICAgICAgIH0sCiAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICh2YWx1ZXMpIHRoYXQgYXJlIHJlcXVpcmVkIHRvIHJ1biB0aGlzIHBhY2thZ2UuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICh2YWx1ZXMpIHRoYXQgdGhpcyBwYWNrYWdlIHJlcXVpcmVzIGZvciBkZXZlbG9waW5nIGl0ICh0ZXN0aW5nIHRvb2xzIGFuZCBzdWNoKS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXBsYWNlIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiBjb25zdHJhaW50cyAodmFsdWVzKSB0aGF0IGNhbiBiZSByZXBsYWNlZCBieSB0aGlzIHBhY2thZ2UuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiY29uZmxpY3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBwYWNrYWdlIG5hbWUgKGtleXMpIGFuZCB2ZXJzaW9uIGNvbnN0cmFpbnRzICh2YWx1ZXMpIHRoYXQgY29uZmxpY3Qgd2l0aCB0aGlzIHBhY2thZ2UuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicHJvdmlkZSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHBhY2thZ2UgbmFtZSAoa2V5cykgYW5kIHZlcnNpb24gY29uc3RyYWludHMgKHZhbHVlcykgdGhhdCB0aGlzIHBhY2thZ2UgcHJvdmlkZXMgaW4gYWRkaXRpb24gdG8gdGhpcyBwYWNrYWdlJ3MgbmFtZS4iLAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJzdWdnZXN0IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgZGVzY3JpcHRpb25zICh2YWx1ZXMpIHRoYXQgdGhpcyBwYWNrYWdlIHN1Z2dlc3RzIHdvcmsgd2VsbCB3aXRoIGl0ICh0aGlzIHdpbGwgYmUgc3VnZ2VzdGVkIHRvIHRoZSB1c2VyIGR1cmluZyBpbnN0YWxsYXRpb24pLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInJlcG9zaXRvcmllcyI6IHsKICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzZXQgb2YgYWRkaXRpb25hbCByZXBvc2l0b3JpZXMgd2hlcmUgcGFja2FnZXMgY2FuIGJlIGZvdW5kLiIsCiAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYW5vbnltb3VzLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICAgICAgeyAidHlwZSI6ICJib29sZWFuIiwgImVudW0iOiBbZmFsc2VdIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAidHlwZSI6ICJib29sZWFuIiwgImVudW0iOiBbZmFsc2VdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJtaW5Qcm9wZXJ0aWVzIjogMSwKICAgICAgICAgICAgICAgICAgICAgICAgIm1heFByb3BlcnRpZXMiOiAxCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAibWluaW11bS1zdGFiaWxpdHkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBtaW5pbXVtIHN0YWJpbGl0eSB0aGUgcGFja2FnZXMgbXVzdCBoYXZlIHRvIGJlIGluc3RhbGwtYWJsZS4gUG9zc2libGUgdmFsdWVzIGFyZTogZGV2LCBhbHBoYSwgYmV0YSwgUkMsIHN0YWJsZS4iLAogICAgICAgICAgICAiZW51bSI6IFsiZGV2IiwgImFscGhhIiwgImJldGEiLCAicmMiLCAiUkMiLCAic3RhYmxlIl0KICAgICAgICB9LAogICAgICAgICJwcmVmZXItc3RhYmxlIjogewogICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgc2V0IHRvIHRydWUsIHN0YWJsZSBwYWNrYWdlcyB3aWxsIGJlIHByZWZlcnJlZCB0byBkZXYgcGFja2FnZXMgd2hlbiBwb3NzaWJsZSwgZXZlbiBpZiB0aGUgbWluaW11bS1zdGFiaWxpdHkgYWxsb3dzIHVuc3RhYmxlIHBhY2thZ2VzLiIKICAgICAgICB9LAogICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hdXRvbG9hZCIKICAgICAgICB9LAogICAgICAgICJhdXRvbG9hZC1kZXYiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXNjcmlwdGlvbiBvZiBhZGRpdGlvbmFsIGF1dG9sb2FkIHJ1bGVzIGZvciBkZXZlbG9wbWVudCBwdXJwb3NlIChlZy4gYSB0ZXN0IHN1aXRlKS4iLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJwc3ItMCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIGRpcmVjdG9yaWVzIHRoZXkgY2FuIGJlIGZvdW5kIGludG8gKHZhbHVlcywgY2FuIGJlIGFycmF5cyBvZiBwYXRocykgYnkgdGhlIGF1dG9sb2FkZXIuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIFBTUi00IGRpcmVjdG9yaWVzIHRoZXkgY2FuIG1hcCB0byAodmFsdWVzLCBjYW4gYmUgYXJyYXlzIG9mIHBhdGhzKSBieSB0aGUgYXV0b2xvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBwYXRocyB0aGF0IGNvbnRhaW4gY2xhc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3MtbWFwIGdlbmVyYXRpb24gcHJvY2Vzcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBmaWxlcyB0aGF0IGFyZSBhbHdheXMgcmVxdWlyZWQgb24gZXZlcnkgcmVxdWVzdC4iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJ0YXJnZXQtZGlyIjogewogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiREVQUkVDQVRFRDogRm9yY2VzIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RhbGxlZCBpbnRvIHRoZSBnaXZlbiBzdWJkaXJlY3RvcnkgcGF0aC4gVGhpcyBpcyB1c2VkIGZvciBhdXRvbG9hZGluZyBQU1ItMCBwYWNrYWdlcyB0aGF0IGRvIG5vdCBjb250YWluIHRoZWlyIGZ1bGwgcGF0aC4gVXNlIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGF0aWJpbGl0eS4iLAogICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICAiaW5jbHVkZS1wYXRoIjogewogICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEEgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaCBzaG91bGQgZ2V0IGFkZGVkIHRvIFBIUCdzIGluY2x1ZGUgcGF0aC4gVGhpcyBpcyBvbmx5IHByZXNlbnQgdG8gc3VwcG9ydCBsZWdhY3kgcHJvamVjdHMsIGFuZCBhbGwgbmV3IGNvZGUgc2hvdWxkIHByZWZlcmFibHkgdXNlIGF1dG9sb2FkaW5nLiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImJpbiI6IHsKICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBzZXQgb2YgZmlsZXMsIG9yIGEgc2luZ2xlIGZpbGUsIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYmluYXJpZXMgYW5kIHN5bWxpbmtlZCBpbnRvIGJpbi1kaXIgKGZyb20gY29uZmlnKS4iLAogICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJhcmNoaXZlIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPcHRpb25zIGZvciBjcmVhdGluZyBwYWNrYWdlIGFyY2hpdmVzIGZvciBkaXN0cmlidXRpb24uIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGJhc2UgbmFtZSBmb3IgYXJjaGl2ZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgcGF0dGVybnMgZm9yIHBhdGhzIHRvIGV4Y2x1ZGUgb3IgaW5jbHVkZSBpZiBwcmVmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGhwLWV4dCI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNldHRpbmdzIGZvciBQSFAgZXh0ZW5zaW9uIHBhY2thZ2VzLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgImV4dGVuc2lvbi1uYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiwgd2hlcmUgbmVlZGVkIGJ5IHRvb2xpbmcuIElmIHRoaXMgaXMgbm90IHNwZWNpZmllZCwgdGhlIGV4dGVuc2lvbiBuYW1lIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBDb21wb3NlciBwYWNrYWdlIG5hbWUgKGUuZy4gYHZlbmRvci9uYW1lYCB3b3VsZCBiZWNvbWUgYGV4dC1uYW1lYCkuIFRoZSBleHRlbnNpb24gbmFtZSBtYXkgYmUgc3BlY2lmaWVkIHdpdGggb3Igd2l0aG91dCB0aGUgYGV4dC1gIHByZWZpeCwgYW5kIHRvb2xzIHRoYXQgdXNlIHRoaXMgbXVzdCBub3JtYWxpc2UgdGhpcyBhcHByb3ByaWF0ZWx5LiIsCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAiZXh0LXhkZWJ1ZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJpb3JpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgdXNlZCB0byBhZGQgYSBwcmVmaXggdG8gdGhlIElOSSBmaWxlLCBlLmcuIGA5MC14ZGVidWcuaW5pYCB3aGljaCBhZmZlY3RzIHRoZSBsb2FkaW5nIG9yZGVyLiBUaGUgcHJpb3JpdHkgaXMgYSBudW1iZXIgaW4gdGhlIHJhbmdlIDEwLTk5IGluY2x1c2l2ZSwgd2l0aCAxMCBiZWluZyB0aGUgaGlnaGVzdCBwcmlvcml0eSAoaS5lLiB3aWxsIGJlIHByb2Nlc3NlZCBmaXJzdCksIGFuZCA5OSBiZWluZyB0aGUgbG93ZXN0IHByaW9yaXR5IChpLmUuIHdpbGwgYmUgcHJvY2Vzc2VkIGxhc3QpLiBUaGVyZSBhcmUgdHdvIGRpZ2l0cyBzbyB0aGF0IHRoZSBmaWxlcyBzb3J0IGNvcnJlY3RseSBvbiBhbnkgcGxhdGZvcm0sIHdoZXRoZXIgdGhlIHNvcnRpbmcgaXMgbmF0dXJhbCBvciBub3QuIiwKICAgICAgICAgICAgICAgICAgICAibWluaW11bSI6IDEwLAogICAgICAgICAgICAgICAgICAgICJtYXhpbXVtIjogOTksCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiA4MCwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IDgwCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInN1cHBvcnQtenRzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEb2VzIHRoaXMgcGFja2FnZSBzdXBwb3J0IFplbmQgVGhyZWFkIFNhZmV0eSIsCiAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3VwcG9ydC1udHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRvZXMgdGhpcyBwYWNrYWdlIHN1cHBvcnQgbm9uLVRocmVhZCBTYWZlIG1vZGUiLAogICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJ1aWxkLXBhdGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJudWxsIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyBpcyB0aGUgc3ViZGlyZWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkIHRoZSBleHRlbnNpb24gaW5zdGVhZCBvZiB0aGUgcm9vdCBvZiB0aGUgcHJvamVjdC4iLAogICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogIm15LWV4dGVuc2lvbi1zb3VyY2UiLAogICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogbnVsbAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkb3dubG9hZC11cmwtbWV0aG9kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHNwZWNpZmllZCwgdGhpcyB0ZWNobmlxdWUgd2lsbCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBVUkwgdGhhdCBQSUUgdXNlcyB0byBkb3dubG9hZCB0aGUgYXNzZXQuIFRoZSBkZWZhdWx0LCBpZiBub3Qgc3BlY2lmaWVkLCBpcyBjb21wb3Nlci1kZWZhdWx0LiIsCiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImNvbXBvc2VyLWRlZmF1bHQiLCAicHJlLXBhY2thZ2VkLXNvdXJjZSJdLAogICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogImNvbXBvc2VyLWRlZmF1bHQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9zLWZhbWlsaWVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAibWluSXRlbXMiOiAxLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBhcnJheSBvZiBPUyBmYW1pbGllcyB0byBtYXJrIGFzIGNvbXBhdGlibGUgd2l0aCB0aGUgZXh0ZW5zaW9uLiBTcGVjaWZ5aW5nIHRoaXMgcHJvcGVydHkgd2lsbCBtZWFuIHRoaXMgcGFja2FnZSBpcyBub3QgaW5zdGFsbGFibGUgd2l0aCBQSUUgb24gYW55IE9TIGZhbWlseSBub3QgbGlzdGVkIGhlcmUuIE11c3Qgbm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgb3MtZmFtaWxpZXMtZXhjbHVkZS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbIndpbmRvd3MiLCAiYnNkIiwgImRhcndpbiIsICJzb2xhcmlzIiwgImxpbnV4IiwgInVua25vd24iXSwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBuYW1lIG9mIHRoZSBPUyBmYW1pbHkgdG8gbWFyayBhcyBjb21wYXRpYmxlLiIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9zLWZhbWlsaWVzLWV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJtaW5JdGVtcyI6IDEsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIGFycmF5IG9mIE9TIGZhbWlsaWVzIHRvIG1hcmsgYXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGV4dGVuc2lvbi4gU3BlY2lmeWluZyB0aGlzIHByb3BlcnR5IHdpbGwgbWVhbiB0aGlzIHBhY2thZ2UgaXMgaW5zdGFsbGFibGUgb24gYW55IE9TIGZhbWlseSBleGNlcHQgdGhvc2UgbGlzdGVkIGhlcmUuIE11c3Qgbm90IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgb3MtZmFtaWxpZXMuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJ3aW5kb3dzIiwgImJzZCIsICJkYXJ3aW4iLCAic29sYXJpcyIsICJsaW51eCIsICJ1bmtub3duIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbmFtZSBvZiB0aGUgT1MgZmFtaWx5IHRvIGV4Y2x1ZGUuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY29uZmlndXJlLW9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGVzZSBjb25maWd1cmUgb3B0aW9ucyBtYWtlIHVwIHRoZSBmbGFncyB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gLi9jb25maWd1cmUgd2hlbiBpbnN0YWxsaW5nIHRoZSBleHRlbnNpb24uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsibmFtZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBuYW1lIG9mIHRoZSBmbGFnLCB0aGlzIHdvdWxkIHR5cGljYWxseSBiZSBwcmVmaXhlZCB3aXRoIGAtLWAsIGZvciBleGFtcGxlLCB0aGUgdmFsdWUgJ3RoZS1mbGFnJyB3b3VsZCBiZSBwYXNzZWQgYXMgYC4vY29uZmlndXJlIC0tdGhlLWZsYWdgLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAid2l0aG91dC14ZGVidWctY29tcHJlc3Npb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXR0ZXJuIjogIl5bYS16QS1aMC05XVthLXpBLVowLTktX10qJCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibmVlZHMtdmFsdWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIHRoaXMgaXMgc2V0IHRvIHRydWUsIHRoZSBmbGFnIG5lZWRzIGEgdmFsdWUgKGUuZy4gLS13aXRoLXNvbWVsaWI9PHBhdGg+KSwgb3RoZXJ3aXNlIGl0IGlzIGEgZmxhZyB3aXRob3V0IGEgdmFsdWUgKGUuZy4gLS1lbmFibGUtc29tZS1mZWF0dXJlKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGFtcGxlIjogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmF1bHQiOiBmYWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGUgZmxhZyBkb2VzIG9yIG1lYW5zLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4YW1wbGUiOiAiRGlzYWJsZSBjb21wcmVzc2lvbiB0aHJvdWdoIHpsaWIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibm90IjogewogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbIm9zLWZhbWlsaWVzIiwgIm9zLWZhbWlsaWVzLWV4Y2x1ZGUiXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgImNvbmZpZyI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbXBvc2VyIG9wdGlvbnMuIiwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAicGxhdGZvcm0iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBvYmplY3Qgb2YgcGFja2FnZSBuYW1lIChrZXlzKSBhbmQgdmVyc2lvbiAodmFsdWVzKSB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb2NrIHRoZSBwbGF0Zm9ybSBwYWNrYWdlcyBvbiB0aGlzIG1hY2hpbmUsIHRoZSB2ZXJzaW9uIGNhbiBiZSBzZXQgdG8gZmFsc2UgdG8gbWFrZSBpdCBhcHBlYXIgbGlrZSB0aGUgcGFja2FnZSBpcyBub3QgcHJlc2VudC4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFsbG93LXBsdWdpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCIsICJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIHtcInBhdHRlcm5cIjogdHJ1ZXxmYWxzZX0gd2l0aCBwYWNrYWdlcyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBsb2FkZWQgYXMgcGx1Z2lucywgb3IgdHJ1ZSB0byBhbGxvdyBhbGwsIGZhbHNlIHRvIGFsbG93IG5vbmUuIERlZmF1bHRzIHRvIHt9IHdoaWNoIHByb21wdHMgd2hlbiBhbiB1bmtub3duIHBsdWdpbiBpcyBhZGRlZC4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJvY2Vzcy10aW1lb3V0IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgdGltZW91dCBpbiBzZWNvbmRzIGZvciBwcm9jZXNzIGV4ZWN1dGlvbnMsIGRlZmF1bHRzIHRvIDMwMCAoNW1pbnMpLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXNlLWluY2x1ZGUtcGF0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIENvbXBvc2VyIGF1dG9sb2FkZXIgd2lsbCBhbHNvIGxvb2sgZm9yIGNsYXNzZXMgaW4gdGhlIFBIUCBpbmNsdWRlIHBhdGguIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ1c2UtcGFyZW50LWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hlbiBydW5uaW5nIENvbXBvc2VyIGluIGEgZGlyZWN0b3J5IHdoZXJlIHRoZXJlIGlzIG5vIGNvbXBvc2VyLmpzb24sIGlmIHRoZXJlIGlzIG9uZSBwcmVzZW50IGluIGEgZGlyZWN0b3J5IGFib3ZlIENvbXBvc2VyIHdpbGwgYnkgZGVmYXVsdCBhc2sgeW91IHdoZXRoZXIgeW91IHdhbnQgdG8gdXNlIHRoYXQgZGlyZWN0b3J5J3MgY29tcG9zZXIuanNvbiBpbnN0ZWFkLiBPbmUgb2Y6IHRydWUgKGFsd2F5cyB1c2UgcGFyZW50IGlmIG5lZWRlZCksIGZhbHNlIChuZXZlciBhc2sgb3IgdXNlIGl0KSBvciBcInByb21wdFwiIChhc2sgZXZlcnkgdGltZSksIGRlZmF1bHRzIHRvIHByb21wdC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZWZlcnJlZC1pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBpbnN0YWxsIG1ldGhvZCBDb21wb3NlciB3aWxsIHByZWZlciB0byB1c2UsIGRlZmF1bHRzIHRvIGF1dG8gYW5kIGNhbiBiZSBhbnkgb2Ygc291cmNlLCBkaXN0LCBhdXRvLCBvciBhbiBvYmplY3Qgb2Yge1wicGF0dGVyblwiOiBcInByZWZlcmVuY2VcIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciXQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXVkaXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VjdXJpdHkgYXVkaXQgYW5kIHZlcnNpb24gYmxvY2tpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbnlPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgYWR2aXNvcnkgaWRzLCByZW1vdGUgaWRzLCBDVkUgaWRzIG9yIHBhY2thZ2UgbmFtZXMgKGtleXMpIHdpdGggZWl0aGVyIGV4cGxhbmF0aW9ucyAoc3RyaW5nIHZhbHVlcykgb3IgZGV0YWlsZWQgY29uZmlndXJhdGlvbiAob2JqZWN0IHZhbHVlcyB3aXRoICdhcHBseScgYW5kICdyZWFzb24nIGZpZWxkcykgZm9yIHdoeSB0aGV5J3JlIGlnbm9yZWQuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4cGxhbmF0aW9uIGZvciBpZ25vcmluZyB0aGlzIGFkdmlzb3J5IChhcHBsaWVzIHRvIGF1ZGl0IHJlcG9ydHMgYW5kIHZlcnNpb24gYmxvY2tpbmcpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGV0YWlsZWQgY29uZmlndXJhdGlvbiBmb3IgaWdub3JpbmcgdGhpcyBhZHZpc29yeSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcGx5IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbImF1ZGl0IiwgImJsb2NrIiwgImFsbCJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGVyZSB0byBhcHBseSB0aGlzIGlnbm9yZTogJ2F1ZGl0JyAob25seSBhdWRpdCByZXBvcnRzKSwgJ2Jsb2NrJyAob25seSB2ZXJzaW9uIGJsb2NraW5nKSwgb3IgJ2FsbCcgKGJvdGgpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFzb24iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwbGFuYXRpb24gZm9yIGlnbm9yaW5nIHRoaXMgYWR2aXNvcnksIGUuZy4gdnVsbmVyYWJsZSBjb2RlIHBhdGggbm90IHJlYWNoYWJsZSBpbiBhcHBsaWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklnbm9yZSB3aXRob3V0IGV4cGxhbmF0aW9uIChhcHBsaWVzIHRvIGF1ZGl0IHJlcG9ydHMgYW5kIHZlcnNpb24gYmxvY2tpbmcpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBhZHZpc29yeSBpZHMsIHJlbW90ZSBpZHMsIENWRSBpZHMgb3IgcGFja2FnZSBuYW1lcyB0aGF0IGFyZSByZXBvcnRlZCBidXQgbGV0IHRoZSBhdWRpdCBjb21tYW5kIHBhc3MuIEFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZy4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJhYmFuZG9uZWQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiaWdub3JlIiwgInJlcG9ydCIsICJmYWlsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciBhYmFuZG9uZWQgcGFja2FnZXMgc2hvdWxkIGJlIGlnbm9yZWQsIHJlcG9ydGVkIGFzIHByb2JsZW1zIG9yIGNhdXNlIGFuIGF1ZGl0IGZhaWx1cmUuIEFwcGxpZXMgb25seSB0byBhdWRpdCByZXBvcnRzLCBub3QgdG8gdmVyc2lvbiBibG9ja2luZy4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUtc2V2ZXJpdHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHNldmVyaXRpZXMgKGtleXMpIHdpdGggZWl0aGVyIGV4cGxhbmF0aW9ucyAoc3RyaW5nIHZhbHVlcykgb3IgZGV0YWlsZWQgY29uZmlndXJhdGlvbiAob2JqZWN0IHZhbHVlcyB3aXRoICdhcHBseScgZmllbGRzKSBmb3Igd2h5IHRoZXkncmUgaWdub3JlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwbGFuYXRpb24gZm9yIGlnbm9yaW5nIHRoaXMgc2V2ZXJpdHkgKGFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRhaWxlZCBjb25maWd1cmF0aW9uIGZvciBpZ25vcmluZyB0aGlzIHNldmVyaXR5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiYXVkaXQiLCAiYmxvY2siLCAiYWxsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXJlIHRvIGFwcGx5IHRoaXMgaWdub3JlOiAnYXVkaXQnIChvbmx5IGF1ZGl0IHJlcG9ydHMpLCAnYmxvY2snIChvbmx5IHZlcnNpb24gYmxvY2tpbmcpLCBvciAnYWxsJyAoYm90aCkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAibnVsbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZ25vcmUgd2l0aG91dCBleHBsYW5hdGlvbiAoYXBwbGllcyB0byBhdWRpdCByZXBvcnRzIGFuZCB2ZXJzaW9uIGJsb2NraW5nKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHNldmVyaXRpZXMgZm9yIHdoaWNoIGFkdmlzb3JpZXMgd2l0aCBtYXRjaGluZyBzZXZlcml0eSB3aWxsIGJlIGlnbm9yZWQsIGUuZy4gY3JpdGljYWwsIGhpZ2gsIG1lZGl1bSwgbG93LCBvciBub25lLiBBcHBsaWVzIHRvIGF1ZGl0IHJlcG9ydHMgYW5kIHZlcnNpb24gYmxvY2tpbmcuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiaWdub3JlLXVucmVhY2hhYmxlIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciByZXBvc2l0b3JpZXMgdGhhdCBhcmUgdW5yZWFjaGFibGUgb3IgcmV0dXJuIGEgbm9uLTIwMCBzdGF0dXMgY29kZSBzaG91bGQgYmUgaWdub3JlZCBvciBub3QuIEFwcGxpZXMgb25seSB0byB0aGUgY29tcG9zZXIgYXVkaXQgY29tbWFuZCwgZG9lcyBub3QgYWZmZWN0IGF1ZGl0IHJlcG9ydCBzdW1tYXJpZXMgaW4gb3RoZXIgY29tbWFuZHMgb3IgdmVyc2lvbiBibG9ja2luZy4iCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJibG9jay1pbnNlY3VyZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXRoZXIgaW5zZWN1cmUgdmVyc2lvbnMgc2hvdWxkIGJlIGJsb2NrZWQgZHVyaW5nIGEgY29tcG9zZXIgdXBkYXRlL3JlcXVpcmUgY29tbWFuZCBvciBub3QuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IjogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAiYmxvY2stYWJhbmRvbmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiV2hldGhlciBhYmFuZG9uZWQgcGFja2FnZXMgc2hvdWxkIGJlIGJsb2NrZWQgZHVyaW5nIGEgY29tcG9zZXIgdXBkYXRlL3JlcXVpcmUgY29tbWFuZCBvciBub3QuIEFwcGxpZXMgb25seSBpZiBibG9ja2luZyBvZiBpbnNlY3VyZSB2ZXJzaW9ucyBpcyBlbmFibGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCI6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmUtYWJhbmRvbmVkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlzdCBvZiBhYmFuZG9uZWQgcGFja2FnZSBuYW1lcyAoa2V5cykgd2l0aCBlaXRoZXIgZXhwbGFuYXRpb25zIChzdHJpbmcgdmFsdWVzKSBvciBkZXRhaWxlZCBjb25maWd1cmF0aW9uIChvYmplY3QgdmFsdWVzIHdpdGggJ2FwcGx5JyBhbmQgJ3JlYXNvbicgZmllbGRzKSBmb3Igd2h5IHRoZXkncmUgaWdub3JlZC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW55T2YiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRXhwbGFuYXRpb24gZm9yIGlnbm9yaW5nIHRoaXMgYWJhbmRvbmVkIHBhY2thZ2UgKGFwcGxpZXMgdG8gYXVkaXQgcmVwb3J0cyBhbmQgdmVyc2lvbiBibG9ja2luZykiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZXRhaWxlZCBjb25maWd1cmF0aW9uIGZvciBpZ25vcmluZyB0aGlzIGFiYW5kb25lZCBwYWNrYWdlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbHkiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSI6IFsiYXVkaXQiLCAiYmxvY2siLCAiYWxsIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoZXJlIHRvIGFwcGx5IHRoaXMgaWdub3JlOiAnYXVkaXQnIChvbmx5IGF1ZGl0IHJlcG9ydHMpLCAnYmxvY2snIChvbmx5IHZlcnNpb24gYmxvY2tpbmcpLCBvciAnYWxsJyAoYm90aCkiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYXNvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFeHBsYW5hdGlvbiBmb3IgaWdub3JpbmcgdGhpcyBhYmFuZG9uZWQgcGFja2FnZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJudWxsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklnbm9yZSB3aXRob3V0IGV4cGxhbmF0aW9uIChhcHBsaWVzIHRvIGF1ZGl0IHJlcG9ydHMgYW5kIHZlcnNpb24gYmxvY2tpbmcpIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBhYmFuZG9uZWQgcGFja2FnZSBuYW1lcyB0aGF0IGFyZSByZXBvcnRlZCBidXQgbGV0IHRoZSBhdWRpdCBjb21tYW5kIHBhc3MgYW5kIHRoYXQgYXJlIG5vdCBibG9ja2VkIGR1cmluZyB1cGRhdGVzL3JlcXVpcmVzLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibm90aWZ5LW9uLWluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkNvbXBvc2VyIGFsbG93cyByZXBvc2l0b3JpZXMgdG8gZGVmaW5lIGEgbm90aWZpY2F0aW9uIFVSTCwgc28gdGhhdCB0aGV5IGdldCBub3RpZmllZCB3aGVuZXZlciBhIHBhY2thZ2UgZnJvbSB0aGF0IHJlcG9zaXRvcnkgaXMgaW5zdGFsbGVkLiBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGRpc2FibGUgdGhhdCBiZWhhdmlvdXIsIGRlZmF1bHRzIHRvIHRydWUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRodWItcHJvdG9jb2xzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIHByb3RvY29scyB0byB1c2UgZm9yIGdpdGh1Yi5jb20gY2xvbmVzLCBpbiBwcmlvcml0eSBvcmRlciwgZGVmYXVsdHMgdG8gW1wiaHR0cHNcIiwgXCJzc2hcIiwgXCJnaXRcIl0uIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGh1Yi1vYXV0aCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4gZ2l0aHViIEFQSSBvYXV0aCB0b2tlbnMsIHR5cGljYWxseSB7XCJnaXRodWIuY29tXCI6XCI8dG9rZW4+XCJ9LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJnaXRsYWItb2F1dGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IGdpdGxhYiBBUEkgb2F1dGggdG9rZW5zLCB0eXBpY2FsbHkge1wiZ2l0bGFiLmNvbVwiOntcImV4cGlyZXMtYXRcIjpcIjxleHBpcmF0aW9uIGRhdGU+XCIsIFwicmVmcmVzaC10b2tlblwiOlwiPHJlZnJlc2ggdG9rZW4+XCIsIFwidG9rZW5cIjpcIjx0b2tlbj5cIn19LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgIm9iamVjdCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbICJ0b2tlbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBpcmVzLWF0IjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImludGVnZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZXhwaXJhdGlvbiBkYXRlIGZvciB0aGlzIEdpdExhYiB0b2tlbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVmcmVzaC10b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgcmVmcmVzaCB0b2tlbiB1c2VkIGZvciBHaXRMYWIgYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRva2VuIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB0b2tlbiB1c2VkIGZvciBHaXRMYWIgYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGxhYi10b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4gZ2l0bGFiIHByaXZhdGUgdG9rZW5zLCB0eXBpY2FsbHkge1wiZ2l0bGFiLmNvbVwiOlwiPHRva2VuPlwifSwgb3IgYW4gb2JqZWN0IHdpdGggdXNlcm5hbWUgYW5kIHRva2VuIGtleXMuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAib2JqZWN0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidXNlcm5hbWUiLCAidG9rZW4iXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHVzZXJuYW1lIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9rZW4iOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHRva2VuIHVzZWQgZm9yIEdpdExhYiBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0bGFiLXByb3RvY29sIjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJnaXQiLCAiaHR0cCIsICJodHRwcyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHByb3RvY29sIHRvIGZvcmNlIHVzZSBvZiB3aGVuIGNyZWF0aW5nIGEgcmVwb3NpdG9yeSBVUkwgZm9yIHRoZSBgc291cmNlYCB2YWx1ZSBvZiB0aGUgcGFja2FnZSBtZXRhZGF0YS4gT25lIG9mIGBnaXRgIG9yIGBodHRwYC4gQnkgZGVmYXVsdCwgQ29tcG9zZXIgd2lsbCBnZW5lcmF0ZSBhIGdpdCBVUkwgZm9yIHByaXZhdGUgcmVwb3NpdG9yaWVzIGFuZCBodHRwIG9uZSBmb3IgcHVibGljIHJlcG9zLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYmVhcmVyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFuIG9iamVjdCBvZiBkb21haW4gbmFtZSA9PiBiZWFyZXIgYXV0aGVudGljYXRpb24gdG9rZW4sIGZvciBleGFtcGxlIHtcImV4YW1wbGUuY29tXCI6XCI8dG9rZW4+XCJ9LiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjdXN0b20taGVhZGVycyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJDdXN0b20gSFRUUCBoZWFkZXJzIGZvciBzcGVjaWZpYyBkb21haW5zLiIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBoZWFkZXIgaW4gZm9ybWF0ICdIZWFkZXItTmFtZTogSGVhZGVyLVZhbHVlJyIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZm9yZ2Vqby10b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbiBvYmplY3Qgb2YgZG9tYWluIG5hbWUgPT4gZm9yZ2VqbyB1c2VybmFtZS9hY2Nlc3MgdG9rZW4sIHR5cGljYWxseSB7XCJjb2RlYmVyZy5vcmdcIjp7XCJ1c2VybmFtZVwiOiBcIjx1c2VybmFtZT5cIiwgXCJ0b2tlblwiOiBcIjxhY2Nlc3MtdG9rZW4+XCJ9fS4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAgICAgICAgICAgICAicmVxdWlyZWQiOiBbInVzZXJuYW1lIiwgInRva2VuIl0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInVzZXJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSB1c2VybmFtZSB1c2VkIGZvciBGb3JnZWpvIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b2tlbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgYWNjZXNzIHRva2VuIHVzZWQgZm9yIEZvcmdlam8gYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc2FibGUtdGxzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBgZmFsc2VgLiBJZiBzZXQgdG8gdHJ1ZSBhbGwgSFRUUFMgVVJMcyB3aWxsIGJlIHRyaWVkIHdpdGggSFRUUCBpbnN0ZWFkIGFuZCBubyBuZXR3b3JrIGxldmVsIGVuY3J5cHRpb24gaXMgcGVyZm9ybWVkLiBFbmFibGluZyB0aGlzIGlzIGEgc2VjdXJpdHkgcmlzayBhbmQgaXMgTk9UIHJlY29tbWVuZGVkLiBUaGUgYmV0dGVyIHdheSBpcyB0byBlbmFibGUgdGhlIHBocF9vcGVuc3NsIGV4dGVuc2lvbiBpbiBwaHAuaW5pLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic2VjdXJlLWh0dHAiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGB0cnVlYC4gSWYgc2V0IHRvIHRydWUgb25seSBIVFRQUyBVUkxzIGFyZSBhbGxvd2VkIHRvIGJlIGRvd25sb2FkZWQgdmlhIENvbXBvc2VyLiBJZiB5b3UgcmVhbGx5IGFic29sdXRlbHkgbmVlZCBIVFRQIGFjY2VzcyB0byBzb21ldGhpbmcgdGhlbiB5b3UgY2FuIGRpc2FibGUgaXQsIGJ1dCB1c2luZyBcIkxldCdzIEVuY3J5cHRcIiB0byBnZXQgYSBmcmVlIFNTTCBjZXJ0aWZpY2F0ZSBpcyBnZW5lcmFsbHkgYSBiZXR0ZXIgYWx0ZXJuYXRpdmUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzZWN1cmUtc3ZuLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB3aGljaCBzaG91bGQgYmUgdHJ1c3RlZC9tYXJrZWQgYXMgdXNpbmcgYSBzZWN1cmUgU3VidmVyc2lvbi9TVk4gdHJhbnNwb3J0LiBCeSBkZWZhdWx0IHN2bjovLyBwcm90b2NvbCBpcyBzZWVuIGFzIGluc2VjdXJlIGFuZCB3aWxsIHRocm93LiBUaGlzIGlzIGEgYmV0dGVyL3NhZmVyIGFsdGVybmF0aXZlIHRvIGRpc2FibGluZyBgc2VjdXJlLWh0dHBgIGFsdG9nZXRoZXIuIiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhZmlsZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHdheSB0byBzZXQgdGhlIHBhdGggdG8gdGhlIG9wZW5zc2wgQ0EgZmlsZS4gSW4gUEhQIDUuNisgeW91IHNob3VsZCByYXRoZXIgc2V0IHRoaXMgdmlhIG9wZW5zc2wuY2FmaWxlIGluIHBocC5pbmksIGFsdGhvdWdoIFBIUCA1LjYrIHNob3VsZCBiZSBhYmxlIHRvIGRldGVjdCB5b3VyIHN5c3RlbSBDQSBmaWxlIGF1dG9tYXRpY2FsbHkuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYXBhdGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgY2FmaWxlIGlzIG5vdCBzcGVjaWZpZWQgb3IgaWYgdGhlIGNlcnRpZmljYXRlIGlzIG5vdCBmb3VuZCB0aGVyZSwgdGhlIGRpcmVjdG9yeSBwb2ludGVkIHRvIGJ5IGNhcGF0aCBpcyBzZWFyY2hlZCBmb3IgYSBzdWl0YWJsZSBjZXJ0aWZpY2F0ZS4gY2FwYXRoIG11c3QgYmUgYSBjb3JyZWN0bHkgaGFzaGVkIGNlcnRpZmljYXRlIGRpcmVjdG9yeS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImh0dHAtYmFzaWMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IHtcInVzZXJuYW1lXCI6IFwiLi4uXCIsIFwicGFzc3dvcmRcIjogXCIuLi5cIn0uIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidXNlcm5hbWUiLCAicGFzc3dvcmQiXSwKICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlcm5hbWUiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIHVzZXJuYW1lIHVzZWQgZm9yIEhUVFAgQmFzaWMgYXV0aGVudGljYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhc3N3b3JkIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBwYXNzd29yZCB1c2VkIGZvciBIVFRQIEJhc2ljIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGllbnQtY2VydGlmaWNhdGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IHtcImxvY2FsX2NlcnRcIjogXCIuLi5cIiwgXCJsb2NhbF9wa1wiPzogXCIuLi5cIiwgXCJwYXNzcGhyYXNlXCI/OiBcIi4uLlwifSB0byBwcm92aWRlIGNsaWVudCBjZXJ0aWZpY2F0ZS4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJsb2NhbF9jZXJ0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsX2NlcnQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUGF0aCB0byBhIGNlcnRpZmljYXRlIChwZW0pIG9yIHBhaXIgY2VydGlmaWNhdGUra2V5IChwZW0pIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbF9wayI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYXRoIHRvIGEgcHJpdmF0ZSBrZXkgZmlsZSAocGVtKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFzc3BocmFzZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQYXNzcGhyYXNlIGZvciBwcml2YXRlIGtleSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic3RvcmUtYXV0aHMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIldoYXQgdG8gZG8gYWZ0ZXIgcHJvbXB0aW5nIGZvciBhdXRoZW50aWNhdGlvbiwgb25lIG9mOiB0cnVlIChzdG9yZSksIGZhbHNlIChkbyBub3Qgc3RvcmUpIG9yIFwicHJvbXB0XCIgKGFzayBldmVyeSB0aW1lKSwgZGVmYXVsdHMgdG8gcHJvbXB0LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidmVuZG9yLWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbG9jYXRpb24gd2hlcmUgYWxsIHBhY2thZ2VzIGFyZSBpbnN0YWxsZWQsIGRlZmF1bHRzIHRvIFwidmVuZG9yXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiaW4tZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSBhbGwgYmluYXJpZXMgYXJlIGxpbmtlZCwgZGVmYXVsdHMgdG8gXCJ2ZW5kb3IvYmluXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkYXRhLWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbG9jYXRpb24gd2hlcmUgb2xkIHBoYXIgZmlsZXMgYXJlIHN0b3JlZCwgZGVmYXVsdHMgdG8gXCIkaG9tZVwiIGV4Y2VwdCBvbiBYREcgQmFzZSBEaXJlY3RvcnkgY29tcGxpYW50IHVuaXhlcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbG9jYXRpb24gd2hlcmUgYWxsIGNhY2hlcyBhcmUgbG9jYXRlZCwgZGVmYXVsdHMgdG8gXCJ+Ly5jb21wb3Nlci9jYWNoZVwiIG9uICpuaXggYW5kIFwiJUxPQ0FMQVBQREFUQSVcXENvbXBvc2VyXCIgb24gd2luZG93cy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLWZpbGVzLWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbG9jYXRpb24gd2hlcmUgZmlsZXMgKHppcCBkb3dubG9hZHMpIGFyZSBjYWNoZWQsIGRlZmF1bHRzIHRvIFwieyRjYWNoZS1kaXJ9L2ZpbGVzXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYWNoZS1yZXBvLWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgbG9jYXRpb24gd2hlcmUgcmVwbyAoZ2l0L2hnIHJlcG8gY2xvbmVzKSBhcmUgY2FjaGVkLCBkZWZhdWx0cyB0byBcInskY2FjaGUtZGlyfS9yZXBvXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYWNoZS12Y3MtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBsb2NhdGlvbiB3aGVyZSB2Y3MgaW5mb3MgKGdpdCBjbG9uZXMsIGdpdGh1YiBhcGkgY2FsbHMsIGV0Yy4gd2hlbiByZWFkaW5nIHZjcyByZXBvcykgYXJlIGNhY2hlZCwgZGVmYXVsdHMgdG8gXCJ7JGNhY2hlLWRpcn0vdmNzXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYWNoZS10dGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiaW50ZWdlciIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBkZWZhdWx0IGNhY2hlIHRpbWUtdG8tbGl2ZSwgZGVmYXVsdHMgdG8gMTU1NTIwMDAgKDYgbW9udGhzKS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLWZpbGVzLXR0bCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGNhY2hlIHRpbWUtdG8tbGl2ZSBmb3IgZmlsZXMsIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiBjYWNoZS10dGwuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjYWNoZS1maWxlcy1tYXhzaXplIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiaW50ZWdlciJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY2FjaGUgbWF4IHNpemUgZm9yIHRoZSBmaWxlcyBjYWNoZSwgZGVmYXVsdHMgdG8gXCIzMDBNaUJcIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNhY2hlLXJlYWQtb25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJXaGV0aGVyIHRvIHVzZSB0aGUgQ29tcG9zZXIgY2FjaGUgaW4gcmVhZC1vbmx5IG1vZGUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiaW4tY29tcGF0IjogewogICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJhdXRvIiwgImZ1bGwiLCAicHJveHkiLCAic3ltbGluayJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29tcGF0aWJpbGl0eSBvZiB0aGUgYmluYXJpZXMsIGRlZmF1bHRzIHRvIFwiYXV0b1wiIChhdXRvbWF0aWNhbGx5IGd1ZXNzZWQpLCBjYW4gYmUgXCJmdWxsXCIgKGNvbXBhdGlibGUgd2l0aCBib3RoIFdpbmRvd3MgYW5kIFVuaXgtYmFzZWQgc3lzdGVtcykgYW5kIFwicHJveHlcIiAob25seSBiYXNoLXN0eWxlIHByb3h5KS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc2NhcmQtY2hhbmdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsic3RyaW5nIiwgImJvb2xlYW4iXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgc3R5bGUgb2YgaGFuZGxpbmcgZGlydHkgdXBkYXRlcywgZGVmYXVsdHMgdG8gZmFsc2UgYW5kIGNhbiBiZSBhbnkgb2YgdHJ1ZSwgZmFsc2Ugb3IgXCJzdGFzaFwiLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXV0b2xvYWRlci1zdWZmaXgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT3B0aW9uYWwgc3RyaW5nIHRvIGJlIHVzZWQgYXMgYSBzdWZmaXggZm9yIHRoZSBnZW5lcmF0ZWQgQ29tcG9zZXIgYXV0b2xvYWRlci4gV2hlbiBudWxsIGEgcmFuZG9tIG9uZSB3aWxsIGJlIGdlbmVyYXRlZC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9wdGltaXplLWF1dG9sb2FkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkFsd2F5cyBvcHRpbWl6ZSB3aGVuIGR1bXBpbmcgdGhlIGF1dG9sb2FkZXIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmVwZW5kLWF1dG9sb2FkZXIiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIklmIGZhbHNlLCB0aGUgY29tcG9zZXIgYXV0b2xvYWRlciB3aWxsIG5vdCBiZSBwcmVwZW5kZWQgdG8gZXhpc3RpbmcgYXV0b2xvYWRlcnMsIGRlZmF1bHRzIHRvIHRydWUuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcC1hdXRob3JpdGF0aXZlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImJvb2xlYW4iLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJJZiB0cnVlLCB0aGUgY29tcG9zZXIgYXV0b2xvYWRlciB3aWxsIG5vdCBzY2FuIHRoZSBmaWxlc3lzdGVtIGZvciBjbGFzc2VzIHRoYXQgYXJlIG5vdCBmb3VuZCBpbiB0aGUgY2xhc3MgbWFwLCBkZWZhdWx0cyB0byBmYWxzZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFwY3UtYXV0b2xvYWRlciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiSWYgdHJ1ZSwgdGhlIENvbXBvc2VyIGF1dG9sb2FkZXIgd2lsbCBjaGVjayBmb3IgQVBDdSBhbmQgdXNlIGl0IHRvIGNhY2hlIGZvdW5kL25vdC1mb3VuZCBjbGFzc2VzIHdoZW4gdGhlIGV4dGVuc2lvbiBpcyBlbmFibGVkLCBkZWZhdWx0cyB0byBmYWxzZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGh1Yi1kb21haW5zIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGRvbWFpbnMgdG8gdXNlIGluIGdpdGh1YiBtb2RlLiBUaGlzIGlzIHVzZWQgZm9yIEdpdEh1YiBFbnRlcnByaXNlIHNldHVwcywgZGVmYXVsdHMgdG8gW1wiZ2l0aHViLmNvbVwiXS4iLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZ2l0aHViLWV4cG9zZS1ob3N0bmFtZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gdHJ1ZS4gSWYgc2V0IHRvIGZhbHNlLCB0aGUgT0F1dGggdG9rZW5zIGNyZWF0ZWQgdG8gYWNjZXNzIHRoZSBnaXRodWIgQVBJIHdpbGwgaGF2ZSBhIGRhdGUgaW5zdGVhZCBvZiB0aGUgbWFjaGluZSBob3N0bmFtZS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImdpdGxhYi1kb21haW5zIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaXN0IG9mIGRvbWFpbnMgdG8gdXNlIGluIGdpdGxhYiBtb2RlLiBUaGlzIGlzIHVzZWQgZm9yIGN1c3RvbSBHaXRMYWIgc2V0dXBzLCBkZWZhdWx0cyB0byBbXCJnaXRsYWIuY29tXCJdLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJmb3JnZWpvLWRvbWFpbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIGxpc3Qgb2YgZG9tYWlucyB0byB1c2UgaW4gZm9yZ2VqbyBtb2RlLiBUaGlzIGlzIHVzZWQgZm9yIGN1c3RvbSBGb3JnZWpvIHNldHVwcywgZGVmYXVsdHMgdG8gW1wiY29kZWJlcmcub3JnXCJdLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiaXRidWNrZXQtb2F1dGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQW4gb2JqZWN0IG9mIGRvbWFpbiBuYW1lID0+IHtcImNvbnN1bWVyLWtleVwiOiBcIi4uLlwiLCBcImNvbnN1bWVyLXNlY3JldFwiOiBcIi4uLlwifS4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInJlcXVpcmVkIjogWyJjb25zdW1lci1rZXkiLCAiY29uc3VtZXItc2VjcmV0Il0sCiAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWVyLWtleSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgY29uc3VtZXIta2V5IHVzZWQgZm9yIE9BdXRoIGF1dGhlbnRpY2F0aW9uIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb25zdW1lci1zZWNyZXQiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGNvbnN1bWVyLXNlY3JldCB1c2VkIGZvciBPQXV0aCBhdXRoZW50aWNhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWNjZXNzLXRva2VuIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoZSBPQXV0aCB0b2tlbiByZXRyaWV2ZWQgZnJvbSBCaXRidWNrZXQncyBBUEksIHRoaXMgaXMgd3JpdHRlbiBieSBDb21wb3NlciBhbmQgeW91IHNob3VsZCBub3Qgc2V0IGl0IG5vciBtb2RpZnkgaXQuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhY2Nlc3MtdG9rZW4tZXhwaXJhdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJpbnRlZ2VyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGdlbmVyYXRlZCB0b2tlbidzIGV4cGlyYXRpb24gdGltZXN0YW1wLCB0aGlzIGlzIHdyaXR0ZW4gYnkgQ29tcG9zZXIgYW5kIHlvdSBzaG91bGQgbm90IHNldCBpdCBub3IgbW9kaWZ5IGl0LiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXNlLWdpdGh1Yi1hcGkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIHRydWUuICBJZiBzZXQgdG8gZmFsc2UsIGdsb2JhbGx5IGRpc2FibGVzIHRoZSB1c2Ugb2YgdGhlIEdpdEh1YiBBUEkgZm9yIGFsbCBHaXRIdWIgcmVwb3NpdG9yaWVzIGFuZCBjbG9uZXMgdGhlIHJlcG9zaXRvcnkgYXMgaXQgd291bGQgZm9yIGFueSBvdGhlciByZXBvc2l0b3J5LiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYXJjaGl2ZS1mb3JtYXQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhlIGRlZmF1bHQgYXJjaGl2aW5nIGZvcm1hdCB3aGVuIG5vdCBwcm92aWRlZCBvbiBjbGksIGRlZmF1bHRzIHRvIFwidGFyXCIuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhcmNoaXZlLWRpciI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGUgZGVmYXVsdCBhcmNoaXZlIHBhdGggd2hlbiBub3QgcHJvdmlkZWQgb24gY2xpLCBkZWZhdWx0cyB0byBcIi5cIi4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImh0YWNjZXNzLXByb3RlY3QiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIHRydWUuIElmIHNldCB0byBmYWxzZSwgQ29tcG9zZXIgd2lsbCBub3QgY3JlYXRlIC5odGFjY2VzcyBmaWxlcyBpbiB0aGUgY29tcG9zZXIgaG9tZSwgY2FjaGUsIGFuZCBkYXRhIGRpcmVjdG9yaWVzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAic29ydC1wYWNrYWdlcyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJib29sZWFuIiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVmYXVsdHMgdG8gZmFsc2UuIElmIHNldCB0byB0cnVlLCBDb21wb3NlciB3aWxsIHNvcnQgcGFja2FnZXMgd2hlbiBhZGRpbmcvdXBkYXRpbmcgYSBuZXcgZGVwZW5kZW5jeS4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImxvY2siOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIHRydWUuIElmIHNldCB0byBmYWxzZSwgQ29tcG9zZXIgd2lsbCBub3QgY3JlYXRlIGEgY29tcG9zZXIubG9jayBmaWxlLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicGxhdGZvcm0tY2hlY2siOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImJvb2xlYW4iLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImVudW0iOiBbInBocC1vbmx5IiwgdHJ1ZSwgZmFsc2VdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBcInBocC1vbmx5XCIgd2hpY2ggY2hlY2tzIG9ubHkgdGhlIFBIUCB2ZXJzaW9uLiBTZXR0aW5nIHRvIHRydWUgd2lsbCBhbHNvIGNoZWNrIHRoZSBwcmVzZW5jZSBvZiByZXF1aXJlZCBQSFAgZXh0ZW5zaW9ucy4gSWYgc2V0IHRvIGZhbHNlLCBDb21wb3NlciB3aWxsIG5vdCBjcmVhdGUgYW5kIHJlcXVpcmUgYSBwbGF0Zm9ybV9jaGVjay5waHAgZmlsZSBhcyBwYXJ0IG9mIHRoZSBhdXRvbG9hZGVyIGJvb3RzdHJhcC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJ1bXAtYWZ0ZXItdXBkYXRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJlbnVtIjogWyJkZXYiLCAibm8tZGV2IiwgdHJ1ZSwgZmFsc2VdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBmYWxzZSBhbmQgY2FuIGJlIGFueSBvZiB0cnVlLCBmYWxzZSwgXCJkZXZcImAgb3IgXCJuby1kZXZcImAuIElmIHNldCB0byB0cnVlLCBDb21wb3NlciB3aWxsIHJ1biB0aGUgYnVtcCBjb21tYW5kIGFmdGVyIHJ1bm5pbmcgdGhlIHVwZGF0ZSBjb21tYW5kLiBJZiBzZXQgdG8gXCJkZXZcIiBvciBcIm5vLWRldlwiIHRoZW4gb25seSB0aGUgY29ycmVzcG9uZGluZyBkZXBlbmRlbmNpZXMgd2lsbCBiZSBidW1wZWQuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJhbGxvdy1taXNzaW5nLXJlcXVpcmVtZW50cyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYm9vbGVhbiJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJEZWZhdWx0cyB0byBmYWxzZS4gSWYgc2V0IHRvIHRydWUsIENvbXBvc2VyIHdpbGwgYWxsb3cgaW5zdGFsbCB3aGVuIGxvY2sgZmlsZSBpcyBub3QgdXAgdG8gZGF0ZSB3aXRoIHRoZSBsYXRlc3QgY2hhbmdlcyBpbiBjb21wb3Nlci5qc29uLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXBkYXRlLXdpdGgtbWluaW1hbC1jaGFuZ2VzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJib29sZWFuIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlZmF1bHRzIHRvIGZhbHNlLiBJZiBzZXQgdG8gdHJ1ZSwgQ29tcG9zZXIgd2lsbCBvbmx5IHBlcmZvcm0gYWJzb2x1dGVseSBuZWNlc3NhcnkgY2hhbmdlcyB0byB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBkdXJpbmcgdXBkYXRlLiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0IiwgImFycmF5Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBcmJpdHJhcnkgZXh0cmEgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIGJ5IHBsdWdpbnMsIGZvciBleGFtcGxlLCBwYWNrYWdlIG9mIHR5cGUgY29tcG9zZXItcGx1Z2luIG1heSBoYXZlIGEgJ2NsYXNzJyBrZXkgZGVmaW5pbmcgYW4gaW5zdGFsbGVyIGNsYXNzIG5hbWUuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZQogICAgICAgIH0sCiAgICAgICAgInNjcmlwdHMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNjcmlwdCBsaXN0ZW5lcnMgdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIGJlZm9yZS9hZnRlciBzb21lIGV2ZW50cy4iLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJwcmUtaW5zdGFsbC1jbWQiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIHRoZSBpbnN0YWxsIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1pbnN0YWxsLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciB0aGUgaW5zdGFsbCBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS11cGRhdGUtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGJlZm9yZSB0aGUgdXBkYXRlIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC11cGRhdGUtY21kIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIHRoZSB1cGRhdGUgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtc3RhdHVzLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgdGhlIHN0YXR1cyBjb21tYW5kIGlzIGV4ZWN1dGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3Qtc3RhdHVzLWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciB0aGUgc3RhdHVzIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJlLXBhY2thZ2UtaW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgYSBwYWNrYWdlIGlzIGluc3RhbGxlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXBhY2thZ2UtaW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciBhIHBhY2thZ2UgaXMgaW5zdGFsbGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInByZS1wYWNrYWdlLXVwZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgYSBwYWNrYWdlIGlzIHVwZGF0ZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1wYWNrYWdlLXVwZGF0ZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciBhIHBhY2thZ2UgaXMgdXBkYXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtcGFja2FnZS11bmluc3RhbGwiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5IiwgInN0cmluZyJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJPY2N1cnMgYmVmb3JlIGEgcGFja2FnZSBoYXMgYmVlbiB1bmluc3RhbGxlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LXBhY2thZ2UtdW5pbnN0YWxsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJhcnJheSIsICJzdHJpbmciXSwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiT2NjdXJzIGFmdGVyIGEgcGFja2FnZSBoYXMgYmVlbiB1bmluc3RhbGxlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwcmUtYXV0b2xvYWQtZHVtcCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBiZWZvcmUgdGhlIGF1dG9sb2FkZXIgaXMgZHVtcGVkLCBjb250YWlucyBvbmUgb3IgbW9yZSBDbGFzczo6bWV0aG9kIGNhbGxhYmxlcyBvciBzaGVsbCBjb21tYW5kcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInBvc3QtYXV0b2xvYWQtZHVtcCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciB0aGUgYXV0b2xvYWRlciBpcyBkdW1wZWQsIGNvbnRhaW5zIG9uZSBvciBtb3JlIENsYXNzOjptZXRob2QgY2FsbGFibGVzIG9yIHNoZWxsIGNvbW1hbmRzLiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicG9zdC1yb290LXBhY2thZ2UtaW5zdGFsbCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciB0aGUgcm9vdC1wYWNrYWdlIGlzIGluc3RhbGxlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwb3N0LWNyZWF0ZS1wcm9qZWN0LWNtZCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsiYXJyYXkiLCAic3RyaW5nIl0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIk9jY3VycyBhZnRlciB0aGUgY3JlYXRlLXByb2plY3QgY29tbWFuZCBpcyBleGVjdXRlZCwgY29udGFpbnMgb25lIG9yIG1vcmUgQ2xhc3M6Om1ldGhvZCBjYWxsYWJsZXMgb3Igc2hlbGwgY29tbWFuZHMuIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAic2NyaXB0cy1kZXNjcmlwdGlvbnMiOiB7CiAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRlc2NyaXB0aW9ucyBmb3IgY3VzdG9tIGNvbW1hbmRzLCBzaG93biBpbiBjb25zb2xlIGhlbHAuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAic2NyaXB0cy1hbGlhc2VzIjogewogICAgICAgICAgICAidHlwZSI6IFsib2JqZWN0Il0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBbGlhc2VzIGZvciBjdXN0b20gY29tbWFuZHMuIiwKICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9LAogICAgImRlZmluaXRpb25zIjogewogICAgICAgICJhdXRob3JzIjogewogICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJMaXN0IG9mIGF1dGhvcnMgdGhhdCBjb250cmlidXRlZCB0byB0aGUgcGFja2FnZS4gVGhpcyBpcyB0eXBpY2FsbHkgdGhlIG1haW4gbWFpbnRhaW5lcnMsIG5vdCB0aGUgZnVsbCBsaXN0LiIsCiAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiBmYWxzZSwKICAgICAgICAgICAgICAgICJyZXF1aXJlZCI6IFsgIm5hbWUiXSwKICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRnVsbCBuYW1lIG9mIHRoZSBhdXRob3IuIgogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRW1haWwgYWRkcmVzcyBvZiB0aGUgYXV0aG9yLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJmb3JtYXQiOiAiZW1haWwiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJIb21lcGFnZSBVUkwgZm9yIHRoZSBhdXRob3IuIiwKICAgICAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAicm9sZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkF1dGhvcidzIHJvbGUgaW4gdGhlIHByb2plY3QuIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRGVzY3JpcHRpb24gb2YgaG93IHRoZSBwYWNrYWdlIGNhbiBiZSBhdXRvbG9hZGVkLiIsCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgInBzci0wIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gb2JqZWN0IG9mIG5hbWVzcGFjZXMgKGtleXMpIGFuZCB0aGUgZGlyZWN0b3JpZXMgdGhleSBjYW4gYmUgZm91bmQgaW4gKHZhbHVlcywgY2FuIGJlIGFycmF5cyBvZiBwYXRocykgYnkgdGhlIGF1dG9sb2FkZXIuIiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJzdHJpbmciLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJUaGlzIGlzIGFuIG9iamVjdCBvZiBuYW1lc3BhY2VzIChrZXlzKSBhbmQgdGhlIFBTUi00IGRpcmVjdG9yaWVzIHRoZXkgY2FuIG1hcCB0byAodmFsdWVzLCBjYW4gYmUgYXJyYXlzIG9mIHBhdGhzKSBieSB0aGUgYXV0b2xvYWRlci4iLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBwYXRocyB0aGF0IGNvbnRhaW4gY2xhc3NlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgY2xhc3MtbWFwIGdlbmVyYXRpb24gcHJvY2Vzcy4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImZpbGVzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiVGhpcyBpcyBhbiBhcnJheSBvZiBmaWxlcyB0aGF0IGFyZSBhbHdheXMgcmVxdWlyZWQgb24gZXZlcnkgcmVxdWVzdC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlRoaXMgaXMgYW4gYXJyYXkgb2YgcGF0dGVybnMgdG8gZXhjbHVkZSBmcm9tIGF1dG9sb2FkIGNsYXNzbWFwIGdlbmVyYXRpb24uIChlLmcuIFwiZXhjbHVkZS1mcm9tLWNsYXNzbWFwXCI6IFtcIi90ZXN0L1wiLCBcIi90ZXN0cy9cIiwgXCIvVGVzdHMvXCJdIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgImFueU9mIjogWwogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2NvbXBvc2VyLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvdmNzLXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGF0aC1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2FydGlmYWN0LXJlcG9zaXRvcnkiIH0sCiAgICAgICAgICAgICAgICB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvcGVhci1yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL3BhY2thZ2UtcmVwb3NpdG9yeSIgfQogICAgICAgICAgICBdCiAgICAgICAgfSwKICAgICAgICAiYW5vbnltb3VzLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJhbGxPZiI6IFsKICAgICAgICAgICAgICAgIHsgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9yZXBvc2l0b3J5IiB9LAogICAgICAgICAgICAgICAgeyAibm90IjogeyAicmVxdWlyZWQiOiBbIm5hbWUiXSB9IH0KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICAgICAgImNvbXBvc2VyLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAgInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsiY29tcG9zZXIiXSB9LAogICAgICAgICAgICAgICAgInVybCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImNhbm9uaWNhbCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJvbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAib3B0aW9ucyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHRydWUKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiYWxsb3dfc3NsX2Rvd25ncmFkZSI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJmb3JjZS1sYXp5LXByb3ZpZGVycyI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAidmNzLXJlcG9zaXRvcnkiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAgInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsidmNzIiwgImdpdGh1YiIsICJnaXQiLCAiZ2l0bGFiIiwgImJpdGJ1Y2tldCIsICJnaXQtYml0YnVja2V0IiwgImhnIiwgImZvc3NpbCIsICJwZXJmb3JjZSIsICJzdm4iLCAiZm9yZ2VqbyJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJuby1hcGkiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAic2VjdXJlLWh0dHAiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAic3ZuLWNhY2hlLWNyZWRlbnRpYWxzIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgInRydW5rLXBhdGgiOiB7ICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdIH0sCiAgICAgICAgICAgICAgICAiYnJhbmNoZXMtcGF0aCI6IHsgInR5cGUiOiBbInN0cmluZyIsICJib29sZWFuIl0gfSwKICAgICAgICAgICAgICAgICJ0YWdzLXBhdGgiOiB7ICJ0eXBlIjogWyJzdHJpbmciLCAiYm9vbGVhbiJdIH0sCiAgICAgICAgICAgICAgICAicGFja2FnZS1wYXRoIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiZGVwb3QiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJicmFuY2giOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ1bmlxdWVfcGVyZm9yY2VfY2xpZW50X25hbWUiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJwNHVzZXIiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJwNHBhc3N3b3JkIjogeyAidHlwZSI6ICJzdHJpbmciIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBhdGgtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJwYXRoIl0gfSwKICAgICAgICAgICAgICAgICJ1cmwiOiB7ICJ0eXBlIjogInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJjYW5vbmljYWwiOiB7ICJ0eXBlIjogImJvb2xlYW4iIH0sCiAgICAgICAgICAgICAgICAib25seSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm9wdGlvbnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6IHsgInR5cGUiOiBbInN0cmluZyJdLCAiZW51bSI6IFsibm9uZSIsICJjb25maWciLCAiYXV0byJdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJzeW1saW5rIjogeyAidHlwZSI6IFsiYm9vbGVhbiIsICJudWxsIl0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIjogeyAidHlwZSI6IFsiYm9vbGVhbiJdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9ucyI6IHsgInR5cGUiOiAib2JqZWN0IiwgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogeyAidHlwZSI6ICJzdHJpbmciIH0gfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogdHJ1ZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAiYXJ0aWZhY3QtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInVybCJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogeyAidHlwZSI6ICAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgInR5cGUiOiB7ICJ0eXBlIjogInN0cmluZyIsICJlbnVtIjogWyJhcnRpZmFjdCJdIH0sCiAgICAgICAgICAgICAgICAidXJsIjogeyAidHlwZSI6ICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicGVhci1yZXBvc2l0b3J5IjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIl0sCiAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgIm5hbWUiOiB7ICJ0eXBlIjogICJzdHJpbmciIH0sCiAgICAgICAgICAgICAgICAidHlwZSI6IHsgInR5cGUiOiAic3RyaW5nIiwgImVudW0iOiBbInBlYXIiXSB9LAogICAgICAgICAgICAgICAgInVybCI6IHsgInR5cGUiOiAic3RyaW5nIiB9LAogICAgICAgICAgICAgICAgImNhbm9uaWNhbCI6IHsgInR5cGUiOiAiYm9vbGVhbiIgfSwKICAgICAgICAgICAgICAgICJvbmx5IjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidmVuZG9yLWFsaWFzIjogeyAidHlwZSI6ICJzdHJpbmciIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgInBhY2thZ2UtcmVwb3NpdG9yeSI6IHsKICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgInJlcXVpcmVkIjogWyJ0eXBlIiwgInBhY2thZ2UiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAibmFtZSI6IHsgInR5cGUiOiAgInN0cmluZyIgfSwKICAgICAgICAgICAgICAgICJ0eXBlIjogeyAidHlwZSI6ICJzdHJpbmciLCAiZW51bSI6IFsicGFja2FnZSJdIH0sCiAgICAgICAgICAgICAgICAiY2Fub25pY2FsIjogeyAidHlwZSI6ICJib29sZWFuIiB9LAogICAgICAgICAgICAgICAgIm9ubHkiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiLAogICAgICAgICAgICAgICAgICAgICJpdGVtcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJwYWNrYWdlIjogewogICAgICAgICAgICAgICAgICAgICJvbmVPZiI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgeyAiJHJlZiI6ICIjL2RlZmluaXRpb25zL2lubGluZS1wYWNrYWdlIiB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7ICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvaW5saW5lLXBhY2thZ2UiIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImlubGluZS1wYWNrYWdlIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbIm5hbWUiLCAidmVyc2lvbiJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJuYW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBhY2thZ2UgbmFtZSwgaW5jbHVkaW5nICd2ZW5kb3ItbmFtZS8nIHByZWZpeC4iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInR5cGUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0YXJnZXQtZGlyIjogewogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJERVBSRUNBVEVEOiBGb3JjZXMgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdGFsbGVkIGludG8gdGhlIGdpdmVuIHN1YmRpcmVjdG9yeSBwYXRoLiBUaGlzIGlzIHVzZWQgZm9yIGF1dG9sb2FkaW5nIFBTUi0wIHBhY2thZ2VzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhlaXIgZnVsbCBwYXRoLiBVc2UgZm9yd2FyZCBzbGFzaGVzIGZvciBjcm9zcy1wbGF0Zm9ybSBjb21wYXRpYmlsaXR5LiIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImtleXdvcmRzIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IiwKICAgICAgICAgICAgICAgICAgICAiaXRlbXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImhvbWVwYWdlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgImZvcm1hdCI6ICJ1cmkiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInZlcnNpb24iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJ0aW1lIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibGljZW5zZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJhcnJheSIKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF1dGhvcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9hdXRob3JzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJyZXBsYWNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicHJvdmlkZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAgICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAic3RyaW5nIgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib2JqZWN0IiwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogWyJvYmplY3QiLCAiYXJyYXkiXSwKICAgICAgICAgICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgICAgICIkcmVmIjogIiMvZGVmaW5pdGlvbnMvYXV0b2xvYWQiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImFyY2hpdmUiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbIm9iamVjdCJdLAogICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0aWVzIjogewogICAgICAgICAgICAgICAgICAgICAgICAiZXhjbHVkZSI6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImFycmF5IgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJiaW4iOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbInN0cmluZyIsICJhcnJheSJdLAogICAgICAgICAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJBIHNldCBvZiBmaWxlcywgb3IgYSBzaW5nbGUgZmlsZSwgdGhhdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBiaW5hcmllcyBhbmQgc3ltbGlua2VkIGludG8gYmluLWRpciAoZnJvbSBjb25maWcpLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJpbmNsdWRlLXBhdGgiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiBbImFycmF5Il0sCiAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkRFUFJFQ0FURUQ6IEEgbGlzdCBvZiBkaXJlY3RvcmllcyB3aGljaCBzaG91bGQgZ2V0IGFkZGVkIHRvIFBIUCdzIGluY2x1ZGUgcGF0aC4gVGhpcyBpcyBvbmx5IHByZXNlbnQgdG8gc3VwcG9ydCBsZWdhY3kgcHJvamVjdHMsIGFuZCBhbGwgbmV3IGNvZGUgc2hvdWxkIHByZWZlcmFibHkgdXNlIGF1dG9sb2FkaW5nLiIsCiAgICAgICAgICAgICAgICAgICAgIml0ZW1zIjogewogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9zb3VyY2UiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAgICAgIiRyZWYiOiAiIy9kZWZpbml0aW9ucy9kaXN0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiOiB0cnVlCiAgICAgICAgfSwKICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAidHlwZSI6ICJvYmplY3QiLAogICAgICAgICAgICAicmVxdWlyZWQiOiBbInR5cGUiLCAidXJsIiwgInJlZmVyZW5jZSJdLAogICAgICAgICAgICAicHJvcGVydGllcyI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAidXJsIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogewogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInN0cmluZyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAibWlycm9ycyI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJhcnJheSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICJ0eXBlIjogIm9iamVjdCIsCiAgICAgICAgICAgICJyZXF1aXJlZCI6IFsidHlwZSIsICJ1cmwiXSwKICAgICAgICAgICAgInByb3BlcnRpZXMiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInVybCI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgInNoYXN1bSI6IHsKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJzdHJpbmciCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgIm1pcnJvcnMiOiB7CiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiYXJyYXkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KPD9waHAKCgoKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNTA2MDApIHsKaWYgKCFoZWFkZXJzX3NlbnQoKSkgewpoZWFkZXIoJ0hUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3InKTsKfQokZXJyID0gJ0NvbXBvc2VyIDIuMy4wIGRyb3BwZWQgc3VwcG9ydCBmb3IgYXV0b2xvYWRpbmcgb24gUEhQIDw1LjYgYW5kIHlvdSBhcmUgcnVubmluZyAnLlBIUF9WRVJTSU9OLicsIHBsZWFzZSB1cGdyYWRlIFBIUCBvciB1c2UgQ29tcG9zZXIgMi4yIExUUyB2aWEgImNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tMi4yIi4gQWJvcnRpbmcuJy5QSFBfRU9MOwppZiAoIWluaV9nZXQoJ2Rpc3BsYXlfZXJyb3JzJykpIHsKaWYgKFBIUF9TQVBJID09PSAnY2xpJyB8fCBQSFBfU0FQSSA9PT0gJ3BocGRiZycpIHsKZndyaXRlKFNUREVSUiwgJGVycik7Cn0gZWxzZWlmICghaGVhZGVyc19zZW50KCkpIHsKZWNobyAkZXJyOwp9Cn0KdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJGVycik7Cn0KCnJlcXVpcmVfb25jZSBfX0RJUl9fIC4gJy9jb21wb3Nlci9hdXRvbG9hZF9yZWFsLnBocCc7CgpyZXR1cm4gQ29tcG9zZXJBdXRvbG9hZGVySW5pdENvbXBvc2VyUGhhcjE3NjkwODczMzA6OmdldExvYWRlcigpOwo8P3BocAoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBDbGFzc0xvYWRlcgp7Cgpwcml2YXRlIHN0YXRpYyAkaW5jbHVkZUZpbGU7CgoKcHJpdmF0ZSAkdmVuZG9yRGlyOwoKCgoKCnByaXZhdGUgJHByZWZpeExlbmd0aHNQc3I0ID0gYXJyYXkoKTsKCgoKcHJpdmF0ZSAkcHJlZml4RGlyc1BzcjQgPSBhcnJheSgpOwoKCgpwcml2YXRlICRmYWxsYmFja0RpcnNQc3I0ID0gYXJyYXkoKTsKCgoKCgoKCgoKcHJpdmF0ZSAkcHJlZml4ZXNQc3IwID0gYXJyYXkoKTsKCgoKcHJpdmF0ZSAkZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5KCk7CgoKcHJpdmF0ZSAkdXNlSW5jbHVkZVBhdGggPSBmYWxzZTsKCgoKCnByaXZhdGUgJGNsYXNzTWFwID0gYXJyYXkoKTsKCgpwcml2YXRlICRjbGFzc01hcEF1dGhvcml0YXRpdmUgPSBmYWxzZTsKCgoKCnByaXZhdGUgJG1pc3NpbmdDbGFzc2VzID0gYXJyYXkoKTsKCgpwcml2YXRlICRhcGN1UHJlZml4OwoKCgoKcHJpdmF0ZSBzdGF0aWMgJHJlZ2lzdGVyZWRMb2FkZXJzID0gYXJyYXkoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkdmVuZG9yRGlyID0gbnVsbCkKewokdGhpcy0+dmVuZG9yRGlyID0gJHZlbmRvckRpcjsKc2VsZjo6aW5pdGlhbGl6ZUluY2x1ZGVDbG9zdXJlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmaXhlcygpCnsKaWYgKCFlbXB0eSgkdGhpcy0+cHJlZml4ZXNQc3IwKSkgewpyZXR1cm4gY2FsbF91c2VyX2Z1bmNfYXJyYXkoJ2FycmF5X21lcmdlJywgYXJyYXlfdmFsdWVzKCR0aGlzLT5wcmVmaXhlc1BzcjApKTsKfQoKcmV0dXJuIGFycmF5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcmVmaXhlc1BzcjQoKQp7CnJldHVybiAkdGhpcy0+cHJlZml4RGlyc1BzcjQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGYWxsYmFja0RpcnMoKQp7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZhbGxiYWNrRGlyc1BzcjQoKQp7CnJldHVybiAkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENsYXNzTWFwKCkKewpyZXR1cm4gJHRoaXMtPmNsYXNzTWFwOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDbGFzc01hcChhcnJheSAkY2xhc3NNYXApCnsKaWYgKCR0aGlzLT5jbGFzc01hcCkgewokdGhpcy0+Y2xhc3NNYXAgPSBhcnJheV9tZXJnZSgkdGhpcy0+Y2xhc3NNYXAsICRjbGFzc01hcCk7Cn0gZWxzZSB7CiR0aGlzLT5jbGFzc01hcCA9ICRjbGFzc01hcDsKfQp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZCgkcHJlZml4LCAkcGF0aHMsICRwcmVwZW5kID0gZmFsc2UpCnsKJHBhdGhzID0gKGFycmF5KSAkcGF0aHM7CmlmICghJHByZWZpeCkgewppZiAoJHByZXBlbmQpIHsKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgPSBhcnJheV9tZXJnZSgKJHBhdGhzLAokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMAopOwp9IGVsc2UgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCA9IGFycmF5X21lcmdlKAokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyMCwKJHBhdGhzCik7Cn0KCnJldHVybjsKfQoKJGZpcnN0ID0gJHByZWZpeFswXTsKaWYgKCFpc3NldCgkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0pKSB7CiR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSA9ICRwYXRoczsKCnJldHVybjsKfQppZiAoJHByZXBlbmQpIHsKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiRwYXRocywKJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdWyRwcmVmaXhdCik7Cn0gZWxzZSB7CiR0aGlzLT5wcmVmaXhlc1BzcjBbJGZpcnN0XVskcHJlZml4XSA9IGFycmF5X21lcmdlKAokdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF1bJHByZWZpeF0sCiRwYXRocwopOwp9Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRQc3I0KCRwcmVmaXgsICRwYXRocywgJHByZXBlbmQgPSBmYWxzZSkKewokcGF0aHMgPSAoYXJyYXkpICRwYXRoczsKaWYgKCEkcHJlZml4KSB7CgppZiAoJHByZXBlbmQpIHsKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjQgPSBhcnJheV9tZXJnZSgKJHBhdGhzLAokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNAopOwp9IGVsc2UgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCA9IGFycmF5X21lcmdlKAokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCwKJHBhdGhzCik7Cn0KfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0pKSB7CgokbGVuZ3RoID0gc3RybGVuKCRwcmVmaXgpOwppZiAoJ1xcJyAhPT0gJHByZWZpeFskbGVuZ3RoIC0gMV0pIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkEgbm9uLWVtcHR5IFBTUi00IHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgbmFtZXNwYWNlIHNlcGFyYXRvci4iKTsKfQokdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJHByZWZpeFswXV1bJHByZWZpeF0gPSAkbGVuZ3RoOwokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSAkcGF0aHM7Cn0gZWxzZWlmICgkcHJlcGVuZCkgewoKJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdID0gYXJyYXlfbWVyZ2UoCiRwYXRocywKJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdCik7Cn0gZWxzZSB7CgokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSBhcnJheV9tZXJnZSgKJHRoaXMtPnByZWZpeERpcnNQc3I0WyRwcmVmaXhdLAokcGF0aHMKKTsKfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0KCRwcmVmaXgsICRwYXRocykKewppZiAoISRwcmVmaXgpIHsKJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgPSAoYXJyYXkpICRwYXRoczsKfSBlbHNlIHsKJHRoaXMtPnByZWZpeGVzUHNyMFskcHJlZml4WzBdXVskcHJlZml4XSA9IChhcnJheSkgJHBhdGhzOwp9Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBzcjQoJHByZWZpeCwgJHBhdGhzKQp7CmlmICghJHByZWZpeCkgewokdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCA9IChhcnJheSkgJHBhdGhzOwp9IGVsc2UgewokbGVuZ3RoID0gc3RybGVuKCRwcmVmaXgpOwppZiAoJ1xcJyAhPT0gJHByZWZpeFskbGVuZ3RoIC0gMV0pIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oIkEgbm9uLWVtcHR5IFBTUi00IHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgbmFtZXNwYWNlIHNlcGFyYXRvci4iKTsKfQokdGhpcy0+cHJlZml4TGVuZ3Roc1BzcjRbJHByZWZpeFswXV1bJHByZWZpeF0gPSAkbGVuZ3RoOwokdGhpcy0+cHJlZml4RGlyc1BzcjRbJHByZWZpeF0gPSAoYXJyYXkpICRwYXRoczsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFVzZUluY2x1ZGVQYXRoKCR1c2VJbmNsdWRlUGF0aCkKewokdGhpcy0+dXNlSW5jbHVkZVBhdGggPSAkdXNlSW5jbHVkZVBhdGg7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVc2VJbmNsdWRlUGF0aCgpCnsKcmV0dXJuICR0aGlzLT51c2VJbmNsdWRlUGF0aDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2xhc3NNYXBBdXRob3JpdGF0aXZlKCRjbGFzc01hcEF1dGhvcml0YXRpdmUpCnsKJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZSA9ICRjbGFzc01hcEF1dGhvcml0YXRpdmU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzQ2xhc3NNYXBBdXRob3JpdGF0aXZlKCkKewpyZXR1cm4gJHRoaXMtPmNsYXNzTWFwQXV0aG9yaXRhdGl2ZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBcGN1UHJlZml4KCRhcGN1UHJlZml4KQp7CiR0aGlzLT5hcGN1UHJlZml4ID0gZnVuY3Rpb25fZXhpc3RzKCdhcGN1X2ZldGNoJykgJiYgZmlsdGVyX3ZhcihpbmlfZ2V0KCdhcGMuZW5hYmxlZCcpLCBGSUxURVJfVkFMSURBVEVfQk9PTEVBTikgPyAkYXBjdVByZWZpeCA6IG51bGw7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFwY3VQcmVmaXgoKQp7CnJldHVybiAkdGhpcy0+YXBjdVByZWZpeDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcigkcHJlcGVuZCA9IGZhbHNlKQp7CnNwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2xvYWRDbGFzcycpLCB0cnVlLCAkcHJlcGVuZCk7CgppZiAobnVsbCA9PT0gJHRoaXMtPnZlbmRvckRpcikgewpyZXR1cm47Cn0KCmlmICgkcHJlcGVuZCkgewpzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnMgPSBhcnJheSgkdGhpcy0+dmVuZG9yRGlyID0+ICR0aGlzKSArIHNlbGY6OiRyZWdpc3RlcmVkTG9hZGVyczsKfSBlbHNlIHsKdW5zZXQoc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzWyR0aGlzLT52ZW5kb3JEaXJdKTsKc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzWyR0aGlzLT52ZW5kb3JEaXJdID0gJHRoaXM7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5yZWdpc3RlcigpCnsKc3BsX2F1dG9sb2FkX3VucmVnaXN0ZXIoYXJyYXkoJHRoaXMsICdsb2FkQ2xhc3MnKSk7CgppZiAobnVsbCAhPT0gJHRoaXMtPnZlbmRvckRpcikgewp1bnNldChzZWxmOjokcmVnaXN0ZXJlZExvYWRlcnNbJHRoaXMtPnZlbmRvckRpcl0pOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2FkQ2xhc3MoJGNsYXNzKQp7CmlmICgkZmlsZSA9ICR0aGlzLT5maW5kRmlsZSgkY2xhc3MpKSB7CiRpbmNsdWRlRmlsZSA9IHNlbGY6OiRpbmNsdWRlRmlsZTsKJGluY2x1ZGVGaWxlKCRmaWxlKTsKCnJldHVybiB0cnVlOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kRmlsZSgkY2xhc3MpCnsKCmlmIChpc3NldCgkdGhpcy0+Y2xhc3NNYXBbJGNsYXNzXSkpIHsKcmV0dXJuICR0aGlzLT5jbGFzc01hcFskY2xhc3NdOwp9CmlmICgkdGhpcy0+Y2xhc3NNYXBBdXRob3JpdGF0aXZlIHx8IGlzc2V0KCR0aGlzLT5taXNzaW5nQ2xhc3Nlc1skY2xhc3NdKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKG51bGwgIT09ICR0aGlzLT5hcGN1UHJlZml4KSB7CiRmaWxlID0gYXBjdV9mZXRjaCgkdGhpcy0+YXBjdVByZWZpeC4kY2xhc3MsICRoaXQpOwppZiAoJGhpdCkgewpyZXR1cm4gJGZpbGU7Cn0KfQoKJGZpbGUgPSAkdGhpcy0+ZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJy5waHAnKTsKCgppZiAoZmFsc2UgPT09ICRmaWxlICYmIGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpKSB7CiRmaWxlID0gJHRoaXMtPmZpbmRGaWxlV2l0aEV4dGVuc2lvbigkY2xhc3MsICcuaGgnKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5hcGN1UHJlZml4KSB7CmFwY3VfYWRkKCR0aGlzLT5hcGN1UHJlZml4LiRjbGFzcywgJGZpbGUpOwp9CgppZiAoZmFsc2UgPT09ICRmaWxlKSB7CgokdGhpcy0+bWlzc2luZ0NsYXNzZXNbJGNsYXNzXSA9IHRydWU7Cn0KCnJldHVybiAkZmlsZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlZ2lzdGVyZWRMb2FkZXJzKCkKewpyZXR1cm4gc2VsZjo6JHJlZ2lzdGVyZWRMb2FkZXJzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmluZEZpbGVXaXRoRXh0ZW5zaW9uKCRjbGFzcywgJGV4dCkKewoKJGxvZ2ljYWxQYXRoUHNyNCA9IHN0cnRyKCRjbGFzcywgJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUikgLiAkZXh0OwoKJGZpcnN0ID0gJGNsYXNzWzBdOwppZiAoaXNzZXQoJHRoaXMtPnByZWZpeExlbmd0aHNQc3I0WyRmaXJzdF0pKSB7CiRzdWJQYXRoID0gJGNsYXNzOwp3aGlsZSAoZmFsc2UgIT09ICRsYXN0UG9zID0gc3RycnBvcygkc3ViUGF0aCwgJ1xcJykpIHsKJHN1YlBhdGggPSBzdWJzdHIoJHN1YlBhdGgsIDAsICRsYXN0UG9zKTsKJHNlYXJjaCA9ICRzdWJQYXRoIC4gJ1xcJzsKaWYgKGlzc2V0KCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskc2VhcmNoXSkpIHsKJHBhdGhFbmQgPSBESVJFQ1RPUllfU0VQQVJBVE9SIC4gc3Vic3RyKCRsb2dpY2FsUGF0aFBzcjQsICRsYXN0UG9zICsgMSk7CmZvcmVhY2ggKCR0aGlzLT5wcmVmaXhEaXJzUHNyNFskc2VhcmNoXSBhcyAkZGlyKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiAkcGF0aEVuZCkpIHsKcmV0dXJuICRmaWxlOwp9Cn0KfQp9Cn0KCgpmb3JlYWNoICgkdGhpcy0+ZmFsbGJhY2tEaXJzUHNyNCBhcyAkZGlyKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGxvZ2ljYWxQYXRoUHNyNCkpIHsKcmV0dXJuICRmaWxlOwp9Cn0KCgppZiAoZmFsc2UgIT09ICRwb3MgPSBzdHJycG9zKCRjbGFzcywgJ1xcJykpIHsKCiRsb2dpY2FsUGF0aFBzcjAgPSBzdWJzdHIoJGxvZ2ljYWxQYXRoUHNyNCwgMCwgJHBvcyArIDEpCi4gc3RydHIoc3Vic3RyKCRsb2dpY2FsUGF0aFBzcjQsICRwb3MgKyAxKSwgJ18nLCBESVJFQ1RPUllfU0VQQVJBVE9SKTsKfSBlbHNlIHsKCiRsb2dpY2FsUGF0aFBzcjAgPSBzdHJ0cigkY2xhc3MsICdfJywgRElSRUNUT1JZX1NFUEFSQVRPUikgLiAkZXh0Owp9CgppZiAoaXNzZXQoJHRoaXMtPnByZWZpeGVzUHNyMFskZmlyc3RdKSkgewpmb3JlYWNoICgkdGhpcy0+cHJlZml4ZXNQc3IwWyRmaXJzdF0gYXMgJHByZWZpeCA9PiAkZGlycykgewppZiAoMCA9PT0gc3RycG9zKCRjbGFzcywgJHByZWZpeCkpIHsKZm9yZWFjaCAoJGRpcnMgYXMgJGRpcikgewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjApKSB7CnJldHVybiAkZmlsZTsKfQp9Cn0KfQp9CgoKZm9yZWFjaCAoJHRoaXMtPmZhbGxiYWNrRGlyc1BzcjAgYXMgJGRpcikgewppZiAoZmlsZV9leGlzdHMoJGZpbGUgPSAkZGlyIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRsb2dpY2FsUGF0aFBzcjApKSB7CnJldHVybiAkZmlsZTsKfQp9CgoKaWYgKCR0aGlzLT51c2VJbmNsdWRlUGF0aCAmJiAkZmlsZSA9IHN0cmVhbV9yZXNvbHZlX2luY2x1ZGVfcGF0aCgkbG9naWNhbFBhdGhQc3IwKSkgewpyZXR1cm4gJGZpbGU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdGlhbGl6ZUluY2x1ZGVDbG9zdXJlKCkKewppZiAoc2VsZjo6JGluY2x1ZGVGaWxlICE9PSBudWxsKSB7CnJldHVybjsKfQoKCgoKCgoKCgpzZWxmOjokaW5jbHVkZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24oJGZpbGUpIHsKaW5jbHVkZSAkZmlsZTsKfSwgbnVsbCwgbnVsbCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlcjsKCnVzZSBDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcjsKdXNlIENvbXBvc2VyXFNlbXZlclxWZXJzaW9uUGFyc2VyOwoKCgoKCgoKCgoKY2xhc3MgSW5zdGFsbGVkVmVyc2lvbnMKewoKCgoKcHJpdmF0ZSBzdGF0aWMgJHNlbGZEaXIgPSBudWxsOwoKCgoKCnByaXZhdGUgc3RhdGljICRpbnN0YWxsZWQ7CgoKCgpwcml2YXRlIHN0YXRpYyAkaW5zdGFsbGVkSXNMb2NhbERpcjsKCgoKCnByaXZhdGUgc3RhdGljICRjYW5HZXRWZW5kb3JzOwoKCgoKCnByaXZhdGUgc3RhdGljICRpbnN0YWxsZWRCeVZlbmRvciA9IGFycmF5KCk7CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEluc3RhbGxlZFBhY2thZ2VzKCkKewokcGFja2FnZXMgPSBhcnJheSgpOwpmb3JlYWNoIChzZWxmOjpnZXRJbnN0YWxsZWQoKSBhcyAkaW5zdGFsbGVkKSB7CiRwYWNrYWdlc1tdID0gYXJyYXlfa2V5cygkaW5zdGFsbGVkWyd2ZXJzaW9ucyddKTsKfQoKaWYgKDEgPT09IFxjb3VudCgkcGFja2FnZXMpKSB7CnJldHVybiAkcGFja2FnZXNbMF07Cn0KCnJldHVybiBhcnJheV9rZXlzKGFycmF5X2ZsaXAoXGNhbGxfdXNlcl9mdW5jX2FycmF5KCdhcnJheV9tZXJnZScsICRwYWNrYWdlcykpKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFsbGVkUGFja2FnZXNCeVR5cGUoJHR5cGUpCnsKJHBhY2thZ2VzQnlUeXBlID0gYXJyYXkoKTsKCmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKZm9yZWFjaCAoJGluc3RhbGxlZFsndmVyc2lvbnMnXSBhcyAkbmFtZSA9PiAkcGFja2FnZSkgewppZiAoaXNzZXQoJHBhY2thZ2VbJ3R5cGUnXSkgJiYgJHBhY2thZ2VbJ3R5cGUnXSA9PT0gJHR5cGUpIHsKJHBhY2thZ2VzQnlUeXBlW10gPSAkbmFtZTsKfQp9Cn0KCnJldHVybiAkcGFja2FnZXNCeVR5cGU7Cn0KCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbnN0YWxsZWQoJHBhY2thZ2VOYW1lLCAkaW5jbHVkZURldlJlcXVpcmVtZW50cyA9IHRydWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewpyZXR1cm4gJGluY2x1ZGVEZXZSZXF1aXJlbWVudHMgfHwgIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnZGV2X3JlcXVpcmVtZW50J10pIHx8ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnZGV2X3JlcXVpcmVtZW50J10gPT09IGZhbHNlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzYXRpc2ZpZXMoVmVyc2lvblBhcnNlciAkcGFyc2VyLCAkcGFja2FnZU5hbWUsICRjb25zdHJhaW50KQp7CiRjb25zdHJhaW50ID0gJHBhcnNlci0+cGFyc2VDb25zdHJhaW50cygoc3RyaW5nKSAkY29uc3RyYWludCk7CiRwcm92aWRlZCA9ICRwYXJzZXItPnBhcnNlQ29uc3RyYWludHMoc2VsZjo6Z2V0VmVyc2lvblJhbmdlcygkcGFja2FnZU5hbWUpKTsKCnJldHVybiAkcHJvdmlkZWQtPm1hdGNoZXMoJGNvbnN0cmFpbnQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFZlcnNpb25SYW5nZXMoJHBhY2thZ2VOYW1lKQp7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgokcmFuZ2VzID0gYXJyYXkoKTsKaWYgKGlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKJHJhbmdlc1tdID0gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcmV0dHlfdmVyc2lvbiddOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdhbGlhc2VzJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewokcmFuZ2VzID0gYXJyYXlfbWVyZ2UoJHJhbmdlcywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydhbGlhc2VzJ10pOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdyZXBsYWNlZCcsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKJHJhbmdlcyA9IGFycmF5X21lcmdlKCRyYW5nZXMsICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncmVwbGFjZWQnXSk7Cn0KaWYgKGFycmF5X2tleV9leGlzdHMoJ3Byb3ZpZGVkJywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdKSkgewokcmFuZ2VzID0gYXJyYXlfbWVyZ2UoJHJhbmdlcywgJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydwcm92aWRlZCddKTsKfQoKcmV0dXJuIGltcGxvZGUoJyB8fCAnLCAkcmFuZ2VzKTsKfQoKdGhyb3cgbmV3IFxPdXRPZkJvdW5kc0V4Y2VwdGlvbignUGFja2FnZSAiJyAuICRwYWNrYWdlTmFtZSAuICciIGlzIG5vdCBpbnN0YWxsZWQnKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0VmVyc2lvbigkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWyd2ZXJzaW9uJ10pKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWyd2ZXJzaW9uJ107Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFByZXR0eVZlcnNpb24oJHBhY2thZ2VOYW1lKQp7CmZvcmVhY2ggKHNlbGY6OmdldEluc3RhbGxlZCgpIGFzICRpbnN0YWxsZWQpIHsKaWYgKCFpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV0pKSB7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsncHJldHR5X3ZlcnNpb24nXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3ByZXR0eV92ZXJzaW9uJ107Cn0KCnRocm93IG5ldyBcT3V0T2ZCb3VuZHNFeGNlcHRpb24oJ1BhY2thZ2UgIicgLiAkcGFja2FnZU5hbWUgLiAnIiBpcyBub3QgaW5zdGFsbGVkJyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlZmVyZW5jZSgkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCmlmICghaXNzZXQoJGluc3RhbGxlZFsndmVyc2lvbnMnXVskcGFja2FnZU5hbWVdWydyZWZlcmVuY2UnXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiAkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ3JlZmVyZW5jZSddOwp9Cgp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsUGF0aCgkcGFja2FnZU5hbWUpCnsKZm9yZWFjaCAoc2VsZjo6Z2V0SW5zdGFsbGVkKCkgYXMgJGluc3RhbGxlZCkgewppZiAoIWlzc2V0KCRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXSkpIHsKY29udGludWU7Cn0KCnJldHVybiBpc3NldCgkaW5zdGFsbGVkWyd2ZXJzaW9ucyddWyRwYWNrYWdlTmFtZV1bJ2luc3RhbGxfcGF0aCddKSA/ICRpbnN0YWxsZWRbJ3ZlcnNpb25zJ11bJHBhY2thZ2VOYW1lXVsnaW5zdGFsbF9wYXRoJ10gOiBudWxsOwp9Cgp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdQYWNrYWdlICInIC4gJHBhY2thZ2VOYW1lIC4gJyIgaXMgbm90IGluc3RhbGxlZCcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSb290UGFja2FnZSgpCnsKJGluc3RhbGxlZCA9IHNlbGY6OmdldEluc3RhbGxlZCgpOwoKcmV0dXJuICRpbnN0YWxsZWRbMF1bJ3Jvb3QnXTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UmF3RGF0YSgpCnsKQHRyaWdnZXJfZXJyb3IoJ2dldFJhd0RhdGEgb25seSByZXR1cm5zIHRoZSBmaXJzdCBkYXRhc2V0IGxvYWRlZCwgd2hpY2ggbWF5IG5vdCBiZSB3aGF0IHlvdSBleHBlY3QuIFVzZSBnZXRBbGxSYXdEYXRhKCkgaW5zdGVhZCB3aGljaCByZXR1cm5zIGFsbCBkYXRhc2V0cyBmb3IgYWxsIGF1dG9sb2FkZXJzIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MuJywgRV9VU0VSX0RFUFJFQ0FURUQpOwoKaWYgKG51bGwgPT09IHNlbGY6OiRpbnN0YWxsZWQpIHsKCgppZiAoc3Vic3RyKF9fRElSX18sIC04LCAxKSAhPT0gJ0MnKSB7CnNlbGY6OiRpbnN0YWxsZWQgPSBpbmNsdWRlIF9fRElSX18gLiAnL2luc3RhbGxlZC5waHAnOwp9IGVsc2UgewpzZWxmOjokaW5zdGFsbGVkID0gYXJyYXkoKTsKfQp9CgpyZXR1cm4gc2VsZjo6JGluc3RhbGxlZDsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRBbGxSYXdEYXRhKCkKewpyZXR1cm4gc2VsZjo6Z2V0SW5zdGFsbGVkKCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVsb2FkKCRkYXRhKQp7CnNlbGY6OiRpbnN0YWxsZWQgPSAkZGF0YTsKc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yID0gYXJyYXkoKTsKCgoKCgpzZWxmOjokaW5zdGFsbGVkSXNMb2NhbERpciA9IGZhbHNlOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRTZWxmRGlyKCkKewppZiAoc2VsZjo6JHNlbGZEaXIgPT09IG51bGwpIHsKc2VsZjo6JHNlbGZEaXIgPSBzdHJ0cihfX0RJUl9fLCAnXFwnLCAnLycpOwp9CgpyZXR1cm4gc2VsZjo6JHNlbGZEaXI7Cn0KCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRJbnN0YWxsZWQoKQp7CmlmIChudWxsID09PSBzZWxmOjokY2FuR2V0VmVuZG9ycykgewpzZWxmOjokY2FuR2V0VmVuZG9ycyA9IG1ldGhvZF9leGlzdHMoJ0NvbXBvc2VyXEF1dG9sb2FkXENsYXNzTG9hZGVyJywgJ2dldFJlZ2lzdGVyZWRMb2FkZXJzJyk7Cn0KCiRpbnN0YWxsZWQgPSBhcnJheSgpOwokY29waWVkTG9jYWxEaXIgPSBmYWxzZTsKCmlmIChzZWxmOjokY2FuR2V0VmVuZG9ycykgewokc2VsZkRpciA9IHNlbGY6OmdldFNlbGZEaXIoKTsKZm9yZWFjaCAoQ2xhc3NMb2FkZXI6OmdldFJlZ2lzdGVyZWRMb2FkZXJzKCkgYXMgJHZlbmRvckRpciA9PiAkbG9hZGVyKSB7CiR2ZW5kb3JEaXIgPSBzdHJ0cigkdmVuZG9yRGlyLCAnXFwnLCAnLycpOwppZiAoaXNzZXQoc2VsZjo6JGluc3RhbGxlZEJ5VmVuZG9yWyR2ZW5kb3JEaXJdKSkgewokaW5zdGFsbGVkW10gPSBzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl07Cn0gZWxzZWlmIChpc19maWxlKCR2ZW5kb3JEaXIuJy9jb21wb3Nlci9pbnN0YWxsZWQucGhwJykpIHsKCiRyZXF1aXJlZCA9IHJlcXVpcmUgJHZlbmRvckRpci4nL2NvbXBvc2VyL2luc3RhbGxlZC5waHAnOwpzZWxmOjokaW5zdGFsbGVkQnlWZW5kb3JbJHZlbmRvckRpcl0gPSAkcmVxdWlyZWQ7CiRpbnN0YWxsZWRbXSA9ICRyZXF1aXJlZDsKaWYgKHNlbGY6OiRpbnN0YWxsZWQgPT09IG51bGwgJiYgJHZlbmRvckRpci4nL2NvbXBvc2VyJyA9PT0gJHNlbGZEaXIpIHsKc2VsZjo6JGluc3RhbGxlZCA9ICRyZXF1aXJlZDsKc2VsZjo6JGluc3RhbGxlZElzTG9jYWxEaXIgPSB0cnVlOwp9Cn0KaWYgKHNlbGY6OiRpbnN0YWxsZWRJc0xvY2FsRGlyICYmICR2ZW5kb3JEaXIuJy9jb21wb3NlcicgPT09ICRzZWxmRGlyKSB7CiRjb3BpZWRMb2NhbERpciA9IHRydWU7Cn0KfQp9CgppZiAobnVsbCA9PT0gc2VsZjo6JGluc3RhbGxlZCkgewoKCmlmIChzdWJzdHIoX19ESVJfXywgLTgsIDEpICE9PSAnQycpIHsKCiRyZXF1aXJlZCA9IHJlcXVpcmUgX19ESVJfXyAuICcvaW5zdGFsbGVkLnBocCc7CnNlbGY6OiRpbnN0YWxsZWQgPSAkcmVxdWlyZWQ7Cn0gZWxzZSB7CnNlbGY6OiRpbnN0YWxsZWQgPSBhcnJheSgpOwp9Cn0KCmlmIChzZWxmOjokaW5zdGFsbGVkICE9PSBhcnJheSgpICYmICEkY29waWVkTG9jYWxEaXIpIHsKJGluc3RhbGxlZFtdID0gc2VsZjo6JGluc3RhbGxlZDsKfQoKcmV0dXJuICRpbnN0YWxsZWQ7Cn0KfQo8P3BocAoKCgokdmVuZG9yRGlyID0gZGlybmFtZShfX0RJUl9fKTsKJGJhc2VEaXIgPSBkaXJuYW1lKCR2ZW5kb3JEaXIpOwoKcmV0dXJuIGFycmF5KAonQXR0cmlidXRlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9BdHRyaWJ1dGUucGhwJywKJ0NVUkxTdHJpbmdGaWxlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9DVVJMU3RyaW5nRmlsZS5waHAnLAonQ29tcG9zZXJcXEluc3RhbGxlZFZlcnNpb25zJyA9PiAkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9JbnN0YWxsZWRWZXJzaW9ucy5waHAnLAonRGVwcmVjYXRlZCcgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9SZXNvdXJjZXMvc3R1YnMvRGVwcmVjYXRlZC5waHAnLAonSnNvbkV4Y2VwdGlvbicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9SZXNvdXJjZXMvc3R1YnMvSnNvbkV4Y2VwdGlvbi5waHAnLAonTm9ybWFsaXplcicgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvUmVzb3VyY2VzL3N0dWJzL05vcm1hbGl6ZXIucGhwJywKJ1BocFRva2VuJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL1Jlc291cmNlcy9zdHVicy9QaHBUb2tlbi5waHAnLAonUmVmbGVjdGlvbkNvbnN0YW50JyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9SZWZsZWN0aW9uQ29uc3RhbnQucGhwJywKJ1JldHVyblR5cGVXaWxsQ2hhbmdlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9SZXR1cm5UeXBlV2lsbENoYW5nZS5waHAnLAonU3RyaW5nYWJsZScgPT4gJHZlbmRvckRpciAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3N0dWJzL1N0cmluZ2FibGUucGhwJywKJ1VuaGFuZGxlZE1hdGNoRXJyb3InID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwJywKJ1ZhbHVlRXJyb3InID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1ZhbHVlRXJyb3IucGhwJywKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKJ2E0YTExOWE1NmU1MGZiYjI5MzI4MWQ5YTQ4MDA3ZTBlJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwL2Jvb3RzdHJhcC5waHAnLAonNmUzZmFlMjk2MzFlZjI4MDY2MGIzY2RhZDA2ZjI1YTgnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzL2Z1bmN0aW9uLnBocCcsCicwZTZkN2JmNGE1ODExYmZhNWNmNDBjNWNjZDZmYWU2YScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwJywKJzMyMGNkZTIyZjY2ZGQ0ZjVkM2ZkNjIxZDNlODhiOThmJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlL2Jvb3RzdHJhcC5waHAnLAonODgyNWVkZTgzZjJmMjg5MTI3NzIyZDRlODQyY2Y3ZTgnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS9ib290c3RyYXAucGhwJywKJ2U2OWY3ZjZlZTI4N2I5NjkxOThjM2M5ZDY3NzdiZDM4JyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhwJywKJzBkNTllZTI0MGE0Y2Q5NmRkYmI0ZmYxNjRmY2NlYTRkJyA9PiAkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczL2Jvb3RzdHJhcC5waHAnLAonYjZiOTkxYTU3NjIwZTJmYjZiMmY2NmYwM2ZlOWRkYzInID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvc3RyaW5nL1Jlc291cmNlcy9mdW5jdGlvbnMucGhwJywKJ2FkMTU1ZjhmMWNmMGQ0MThmZTQ5ZTI0OGRiOGM2NjFiJyA9PiAkdmVuZG9yRGlyIC4gJy9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHAnLAonMjNjMTgwNDZmNTJiZWYzZWVhMDM0NjU3YmFmZGE1MGYnID0+ICR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvYm9vdHN0cmFwLnBocCcsCic5ZDJiOWZjNmRiMGYxNTNhMGExNDlmZWZiMTgyNDE1ZScgPT4gJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC9ib290c3RyYXAucGhwJywKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKKTsKPD9waHAKCgoKJHZlbmRvckRpciA9IGRpcm5hbWUoX19ESVJfXyk7CiRiYXNlRGlyID0gZGlybmFtZSgkdmVuZG9yRGlyKTsKCnJldHVybiBhcnJheSgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4NFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0JyksCidTeW1mb255XFxQb2x5ZmlsbFxcUGhwODFcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScpLAonU3ltZm9ueVxcUG9seWZpbGxcXFBocDgwXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczJyksCidTeW1mb255XFxQb2x5ZmlsbFxcTWJzdHJpbmdcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycpLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXE5vcm1hbGl6ZXJcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXInKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3BvbHlmaWxsLWN0eXBlJyksCidTeW1mb255XFxDb250cmFjdHNcXFNlcnZpY2VcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cycpLAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9zdHJpbmcnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zeW1mb255L3Byb2Nlc3MnKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmluZGVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL3N5bWZvbnkvZmluZGVyJyksCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9maWxlc3lzdGVtJyksCidTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc3ltZm9ueS9jb25zb2xlJyksCidTZWxkXFxTaWduYWxcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvc2VsZC9zaWduYWwtaGFuZGxlci9zcmMnKSwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zZWxkL3BoYXItdXRpbHMvc3JjJyksCidTZWxkXFxKc29uTGludFxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9zZWxkL2pzb25saW50L3NyYy9TZWxkL0pzb25MaW50JyksCidSZWFjdFxcUHJvbWlzZVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9yZWFjdC9wcm9taXNlL3NyYycpLAonUHNyXFxMb2dcXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvcHNyL2xvZy9Qc3IvTG9nJyksCidQc3JcXENvbnRhaW5lclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9wc3IvY29udGFpbmVyL3NyYycpLAonTWFiZUVudW1cXCcgPT4gYXJyYXkoJHZlbmRvckRpciAuICcvbWFyYy1tYWJlL3BocC1lbnVtL3NyYycpLAonSnNvblNjaGVtYVxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hJyksCidDb21wb3NlclxcWGRlYnVnSGFuZGxlclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci94ZGVidWctaGFuZGxlci9zcmMnKSwKJ0NvbXBvc2VyXFxTcGR4XFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvc3JjJyksCidDb21wb3NlclxcU2VtdmVyXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3NlbXZlci9zcmMnKSwKJ0NvbXBvc2VyXFxQY3JlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL3BjcmUvc3JjJyksCidDb21wb3NlclxcTWV0YWRhdGFNaW5pZmllclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci9zcmMnKSwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PiBhcnJheSgkdmVuZG9yRGlyIC4gJy9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYycpLAonQ29tcG9zZXJcXENhQnVuZGxlXFwnID0+IGFycmF5KCR2ZW5kb3JEaXIgLiAnL2NvbXBvc2VyL2NhLWJ1bmRsZS9zcmMnKSwKJ0NvbXBvc2VyXFwnID0+IGFycmF5KCRiYXNlRGlyIC4gJy9zcmMvQ29tcG9zZXInKSwKKTsKPD9waHAKCgoKY2xhc3MgQ29tcG9zZXJBdXRvbG9hZGVySW5pdENvbXBvc2VyUGhhcjE3NjkwODczMzAKewpwcml2YXRlIHN0YXRpYyAkbG9hZGVyOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBsb2FkQ2xhc3NMb2FkZXIoJGNsYXNzKQp7CmlmICgnQ29tcG9zZXJcQXV0b2xvYWRcQ2xhc3NMb2FkZXInID09PSAkY2xhc3MpIHsKcmVxdWlyZSBfX0RJUl9fIC4gJy9DbGFzc0xvYWRlci5waHAnOwp9Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TG9hZGVyKCkKewppZiAobnVsbCAhPT0gc2VsZjo6JGxvYWRlcikgewpyZXR1cm4gc2VsZjo6JGxvYWRlcjsKfQoKc3BsX2F1dG9sb2FkX3JlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc2OTA4NzMzMCcsICdsb2FkQ2xhc3NMb2FkZXInKSwgdHJ1ZSwgdHJ1ZSk7CnNlbGY6OiRsb2FkZXIgPSAkbG9hZGVyID0gbmV3IFxDb21wb3NlclxBdXRvbG9hZFxDbGFzc0xvYWRlcihcZGlybmFtZShfX0RJUl9fKSk7CnNwbF9hdXRvbG9hZF91bnJlZ2lzdGVyKGFycmF5KCdDb21wb3NlckF1dG9sb2FkZXJJbml0Q29tcG9zZXJQaGFyMTc2OTA4NzMzMCcsICdsb2FkQ2xhc3NMb2FkZXInKSk7CgpyZXF1aXJlIF9fRElSX18gLiAnL2F1dG9sb2FkX3N0YXRpYy5waHAnOwpjYWxsX3VzZXJfZnVuYyhcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc2OTA4NzMzMDo6Z2V0SW5pdGlhbGl6ZXIoJGxvYWRlcikpOwoKJGxvYWRlci0+cmVnaXN0ZXIodHJ1ZSk7CgokZmlsZXNUb0xvYWQgPSBcQ29tcG9zZXJcQXV0b2xvYWRcQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc2OTA4NzMzMDo6JGZpbGVzOwokcmVxdWlyZUZpbGUgPSBcQ2xvc3VyZTo6YmluZChzdGF0aWMgZnVuY3Rpb24gKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpIHsKaWYgKGVtcHR5KCRHTE9CQUxTWydfX2NvbXBvc2VyX2F1dG9sb2FkX2ZpbGVzJ11bJGZpbGVJZGVudGlmaWVyXSkpIHsKJEdMT0JBTFNbJ19fY29tcG9zZXJfYXV0b2xvYWRfZmlsZXMnXVskZmlsZUlkZW50aWZpZXJdID0gdHJ1ZTsKCnJlcXVpcmUgJGZpbGU7Cn0KfSwgbnVsbCwgbnVsbCk7CmZvcmVhY2ggKCRmaWxlc1RvTG9hZCBhcyAkZmlsZUlkZW50aWZpZXIgPT4gJGZpbGUpIHsKJHJlcXVpcmVGaWxlKCRmaWxlSWRlbnRpZmllciwgJGZpbGUpOwp9CgpyZXR1cm4gJGxvYWRlcjsKfQp9Cjw/cGhwCgoKCm5hbWVzcGFjZSBDb21wb3NlclxBdXRvbG9hZDsKCmNsYXNzIENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE3NjkwODczMzAKewpwdWJsaWMgc3RhdGljICRmaWxlcyA9IGFycmF5ICgKJ2E0YTExOWE1NmU1MGZiYjI5MzI4MWQ5YTQ4MDA3ZTBlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvYm9vdHN0cmFwLnBocCcsCic2ZTNmYWUyOTYzMWVmMjgwNjYwYjNjZGFkMDZmMjVhOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy9mdW5jdGlvbi5waHAnLAonMGU2ZDdiZjRhNTgxMWJmYTVjZjQwYzVjY2Q2ZmFlNmEnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy9ib290c3RyYXAucGhwJywKJzMyMGNkZTIyZjY2ZGQ0ZjVkM2ZkNjIxZDNlODhiOThmJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvYm9vdHN0cmFwLnBocCcsCic4ODI1ZWRlODNmMmYyODkxMjc3MjJkNGU4NDJjZjdlOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvYm9vdHN0cmFwLnBocCcsCidlNjlmN2Y2ZWUyODdiOTY5MTk4YzNjOWQ2Nzc3YmQzOCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9ib290c3RyYXAucGhwJywKJzBkNTllZTI0MGE0Y2Q5NmRkYmI0ZmYxNjRmY2NlYTRkJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwNzMvYm9vdHN0cmFwLnBocCcsCidiNmI5OTFhNTc2MjBlMmZiNmIyZjY2ZjAzZmU5ZGRjMicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3N0cmluZy9SZXNvdXJjZXMvZnVuY3Rpb25zLnBocCcsCidhZDE1NWY4ZjFjZjBkNDE4ZmU0OWUyNDhkYjhjNjYxYicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9yZWFjdC9wcm9taXNlL3NyYy9mdW5jdGlvbnNfaW5jbHVkZS5waHAnLAonMjNjMTgwNDZmNTJiZWYzZWVhMDM0NjU3YmFmZGE1MGYnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS9ib290c3RyYXAucGhwJywKJzlkMmI5ZmM2ZGIwZjE1M2EwYTE0OWZlZmIxODI0MTVlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvYm9vdHN0cmFwLnBocCcsCik7CgpwdWJsaWMgc3RhdGljICRwcmVmaXhMZW5ndGhzUHNyNCA9IGFycmF5ICgKJ1MnID0+CmFycmF5ICgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4NFxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PiAyMywKJ1N5bWZvbnlcXFBvbHlmaWxsXFxNYnN0cmluZ1xcJyA9PiAyNiwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+IDMzLAonU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXEdyYXBoZW1lXFwnID0+IDMxLAonU3ltZm9ueVxcUG9seWZpbGxcXEN0eXBlXFwnID0+IDIzLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+IDI2LAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4gMjUsCidTeW1mb255XFxDb21wb25lbnRcXFByb2Nlc3NcXCcgPT4gMjYsCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PiAyNSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcRmlsZXN5c3RlbVxcJyA9PiAyOSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcQ29uc29sZVxcJyA9PiAyNiwKJ1NlbGRcXFNpZ25hbFxcJyA9PiAxMiwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PiAxNSwKJ1NlbGRcXEpzb25MaW50XFwnID0+IDE0LAopLAonUicgPT4KYXJyYXkgKAonUmVhY3RcXFByb21pc2VcXCcgPT4gMTQsCiksCidQJyA9PgphcnJheSAoCidQc3JcXExvZ1xcJyA9PiA4LAonUHNyXFxDb250YWluZXJcXCcgPT4gMTQsCiksCidNJyA9PgphcnJheSAoCidNYWJlRW51bVxcJyA9PiA5LAopLAonSicgPT4KYXJyYXkgKAonSnNvblNjaGVtYVxcJyA9PiAxMSwKKSwKJ0MnID0+CmFycmF5ICgKJ0NvbXBvc2VyXFxYZGVidWdIYW5kbGVyXFwnID0+IDIzLAonQ29tcG9zZXJcXFNwZHhcXCcgPT4gMTQsCidDb21wb3NlclxcU2VtdmVyXFwnID0+IDE2LAonQ29tcG9zZXJcXFBjcmVcXCcgPT4gMTQsCidDb21wb3NlclxcTWV0YWRhdGFNaW5pZmllclxcJyA9PiAyNiwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PiAyNywKJ0NvbXBvc2VyXFxDYUJ1bmRsZVxcJyA9PiAxOCwKJ0NvbXBvc2VyXFwnID0+IDksCiksCik7CgpwdWJsaWMgc3RhdGljICRwcmVmaXhEaXJzUHNyNCA9IGFycmF5ICgKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4NFxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0JywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MFxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgwJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxQaHA3M1xcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDczJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxNYnN0cmluZ1xcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxOb3JtYWxpemVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJywKKSwKJ1N5bWZvbnlcXFBvbHlmaWxsXFxJbnRsXFxHcmFwaGVtZVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUnLAopLAonU3ltZm9ueVxcUG9seWZpbGxcXEN0eXBlXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUnLAopLAonU3ltZm9ueVxcQ29udHJhY3RzXFxTZXJ2aWNlXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxTdHJpbmdcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9zdHJpbmcnLAopLAonU3ltZm9ueVxcQ29tcG9uZW50XFxQcm9jZXNzXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcHJvY2VzcycsCiksCidTeW1mb255XFxDb21wb25lbnRcXEZpbmRlclxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2ZpbmRlcicsCiksCidTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9maWxlc3lzdGVtJywKKSwKJ1N5bWZvbnlcXENvbXBvbmVudFxcQ29uc29sZVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L2NvbnNvbGUnLAopLAonU2VsZFxcU2lnbmFsXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvc2lnbmFsLWhhbmRsZXIvc3JjJywKKSwKJ1NlbGRcXFBoYXJVdGlsc1xcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zZWxkL3BoYXItdXRpbHMvc3JjJywKKSwKJ1NlbGRcXEpzb25MaW50XFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3NlbGQvanNvbmxpbnQvc3JjL1NlbGQvSnNvbkxpbnQnLAopLAonUmVhY3RcXFByb21pc2VcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvcmVhY3QvcHJvbWlzZS9zcmMnLAopLAonUHNyXFxMb2dcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvcHNyL2xvZy9Qc3IvTG9nJywKKSwKJ1BzclxcQ29udGFpbmVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3Bzci9jb250YWluZXIvc3JjJywKKSwKJ01hYmVFbnVtXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL21hcmMtbWFiZS9waHAtZW51bS9zcmMnLAopLAonSnNvblNjaGVtYVxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9qdXN0aW5yYWluYm93L2pzb24tc2NoZW1hL3NyYy9Kc29uU2NoZW1hJywKKSwKJ0NvbXBvc2VyXFxYZGVidWdIYW5kbGVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL3NyYycsCiksCidDb21wb3NlclxcU3BkeFxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3NyYycsCiksCidDb21wb3NlclxcU2VtdmVyXFwnID0+CmFycmF5ICgKMCA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL3NlbXZlci9zcmMnLAopLAonQ29tcG9zZXJcXFBjcmVcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvcGNyZS9zcmMnLAopLAonQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvc3JjJywKKSwKJ0NvbXBvc2VyXFxDbGFzc01hcEdlbmVyYXRvclxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3NyYycsCiksCidDb21wb3NlclxcQ2FCdW5kbGVcXCcgPT4KYXJyYXkgKAowID0+IF9fRElSX18gLiAnLy4uJyAuICcvY29tcG9zZXIvY2EtYnVuZGxlL3NyYycsCiksCidDb21wb3NlclxcJyA9PgphcnJheSAoCjAgPT4gX19ESVJfXyAuICcvLi4vLi4nIC4gJy9zcmMvQ29tcG9zZXInLAopLAopOwoKcHVibGljIHN0YXRpYyAkY2xhc3NNYXAgPSBhcnJheSAoCidBdHRyaWJ1dGUnID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvQXR0cmlidXRlLnBocCcsCidDVVJMU3RyaW5nRmlsZScgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDgxL1Jlc291cmNlcy9zdHVicy9DVVJMU3RyaW5nRmlsZS5waHAnLAonQ29tcG9zZXJcXEluc3RhbGxlZFZlcnNpb25zJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL2NvbXBvc2VyL0luc3RhbGxlZFZlcnNpb25zLnBocCcsCidEZXByZWNhdGVkJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODQvUmVzb3VyY2VzL3N0dWJzL0RlcHJlY2F0ZWQucGhwJywKJ0pzb25FeGNlcHRpb24nID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My9SZXNvdXJjZXMvc3R1YnMvSnNvbkV4Y2VwdGlvbi5waHAnLAonTm9ybWFsaXplcicgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplci9SZXNvdXJjZXMvc3R1YnMvTm9ybWFsaXplci5waHAnLAonUGhwVG9rZW4nID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvUGhwVG9rZW4ucGhwJywKJ1JlZmxlY3Rpb25Db25zdGFudCcgPT4gX19ESVJfXyAuICcvLi4nIC4gJy9zeW1mb255L3BvbHlmaWxsLXBocDg0L1Jlc291cmNlcy9zdHVicy9SZWZsZWN0aW9uQ29uc3RhbnQucGhwJywKJ1JldHVyblR5cGVXaWxsQ2hhbmdlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvUmVzb3VyY2VzL3N0dWJzL1JldHVyblR5cGVXaWxsQ2hhbmdlLnBocCcsCidTdHJpbmdhYmxlJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL21hcmMtbWFiZS9waHAtZW51bS9zdHVicy9TdHJpbmdhYmxlLnBocCcsCidVbmhhbmRsZWRNYXRjaEVycm9yJyA9PiBfX0RJUl9fIC4gJy8uLicgLiAnL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvUmVzb3VyY2VzL3N0dWJzL1VuaGFuZGxlZE1hdGNoRXJyb3IucGhwJywKJ1ZhbHVlRXJyb3InID0+IF9fRElSX18gLiAnLy4uJyAuICcvc3ltZm9ueS9wb2x5ZmlsbC1waHA4MC9SZXNvdXJjZXMvc3R1YnMvVmFsdWVFcnJvci5waHAnLAopOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRJbml0aWFsaXplcihDbGFzc0xvYWRlciAkbG9hZGVyKQp7CnJldHVybiBcQ2xvc3VyZTo6YmluZChmdW5jdGlvbiAoKSB1c2UgKCRsb2FkZXIpIHsKJGxvYWRlci0+cHJlZml4TGVuZ3Roc1BzcjQgPSBDb21wb3NlclN0YXRpY0luaXRDb21wb3NlclBoYXIxNzY5MDg3MzMwOjokcHJlZml4TGVuZ3Roc1BzcjQ7CiRsb2FkZXItPnByZWZpeERpcnNQc3I0ID0gQ29tcG9zZXJTdGF0aWNJbml0Q29tcG9zZXJQaGFyMTc2OTA4NzMzMDo6JHByZWZpeERpcnNQc3I0OwokbG9hZGVyLT5jbGFzc01hcCA9IENvbXBvc2VyU3RhdGljSW5pdENvbXBvc2VyUGhhcjE3NjkwODczMzA6OiRjbGFzc01hcDsKCn0sIG51bGwsIENsYXNzTG9hZGVyOjpjbGFzcyk7Cn0KfQoKQ29weXJpZ2h0IChDKSAyMDE2IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvCnNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKIyMKIyMgQnVuZGxlIG9mIENBIFJvb3QgQ2VydGlmaWNhdGVzCiMjCiMjIENlcnRpZmljYXRlIGRhdGEgZnJvbSBNb3ppbGxhIGFzIG9mOiBUdWUgRGVjICAyIDA0OjEyOjAyIDIwMjUgR01UCiMjCiMjIEZpbmQgdXBkYXRlZCB2ZXJzaW9ucyBoZXJlOiBodHRwczovL2N1cmwuc2UvZG9jcy9jYWV4dHJhY3QuaHRtbAojIwojIyBUaGlzIGlzIGEgYnVuZGxlIG9mIFguNTA5IGNlcnRpZmljYXRlcyBvZiBwdWJsaWMgQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMKIyMgKENBKS4gVGhlc2Ugd2VyZSBhdXRvbWF0aWNhbGx5IGV4dHJhY3RlZCBmcm9tIE1vemlsbGEncyByb290IGNlcnRpZmljYXRlcwojIyBmaWxlIChjZXJ0ZGF0YS50eHQpLiAgVGhpcyBmaWxlIGNhbiBiZSBmb3VuZCBpbiB0aGUgbW96aWxsYSBzb3VyY2UgdHJlZToKIyMgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vemlsbGEtZmlyZWZveC9maXJlZm94L3JlZnMvaGVhZHMvcmVsZWFzZS9zZWN1cml0eS9uc3MvbGliL2NrZncvYnVpbHRpbnMvY2VydGRhdGEudHh0CiMjCiMjIEl0IGNvbnRhaW5zIHRoZSBjZXJ0aWZpY2F0ZXMgaW4gUEVNIGZvcm1hdCBhbmQgdGhlcmVmb3JlCiMjIGNhbiBiZSBkaXJlY3RseSB1c2VkIHdpdGggY3VybCAvIGxpYmN1cmwgLyBwaHBfY3VybCwgb3Igd2l0aAojIyBhbiBBcGFjaGUrbW9kX3NzbCB3ZWJzZXJ2ZXIgZm9yIFNTTCBjbGllbnQgYXV0aGVudGljYXRpb24uCiMjIEp1c3QgY29uZmlndXJlIHRoaXMgZmlsZSBhcyB0aGUgU1NMQ0FDZXJ0aWZpY2F0ZUZpbGUuCiMjCiMjIENvbnZlcnNpb24gZG9uZSB3aXRoIG1rLWNhLWJ1bmRsZS5wbCB2ZXJzaW9uIDEuMzAuCiMjIFNIQTI1NjogYTkwM2IzY2QwNTIzMWUzOTMzMjUxNWVmN2ViZTM3ZTY5NzI2MmYzOTUxNWE1MjAxNWMyM2M2MjgwNWI3M2NkMAojIwoKCkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVrVENDQTNtZ0F3SUJBZ0lFUld0UVZEQU5CZ2txaGtpRzl3MEJBUVVGQURDQnNERUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlYKQkFvVERVVnVkSEoxYzNRc0lFbHVZeTR4T1RBM0JnTlZCQXNUTUhkM2R5NWxiblJ5ZFhOMExtNWxkQzlEVUZNZ2FYTWdhVzVqYjNKdwpiM0poZEdWa0lHSjVJSEpsWm1WeVpXNWpaVEVmTUIwR0ExVUVDeE1XS0dNcElESXdNRFlnUlc1MGNuVnpkQ3dnU1c1akxqRXRNQ3NHCkExVUVBeE1rUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TUI0WERUQTJNVEV5TnpJd01qTTAKTWxvWERUSTJNVEV5TnpJd05UTTBNbG93Z2JBeEN6QUpCZ05WQkFZVEFsVlRNUll3RkFZRFZRUUtFdzFGYm5SeWRYTjBMQ0JKYm1NdQpNVGt3TndZRFZRUUxFekIzZDNjdVpXNTBjblZ6ZEM1dVpYUXZRMUJUSUdseklHbHVZMjl5Y0c5eVlYUmxaQ0JpZVNCeVpXWmxjbVZ1ClkyVXhIekFkQmdOVkJBc1RGaWhqS1NBeU1EQTJJRVZ1ZEhKMWMzUXNJRWx1WXk0eExUQXJCZ05WQkFNVEpFVnVkSEoxYzNRZ1VtOXYKZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQgpBTGFWdGtOQytzWnRLbTlJMzVSTU9WY0Y3c041RVVGb051M3MvcG9CajZFNEtQejNFRVptTGswZUdyRWFUc2JSd0pXSXNNbi9NWXN6CkE5dTNnM3MrSUlSZTdiSldLS2Y0NExsQWNUZkZ5MGNPbHlwb3dDS1ZZaFhiUjluMTBDdi9na3ZKclQ3ZVROdVFnRkEvQ1lxRUFPd3cKQ2owWXpmdjlLbG1hSTVVWExFV2VIMjVEZVcwTVhKaitTS2ZGSTBkY1h2MXU1eDYwOW1oRjBZYURXNktLamJIaktZRCtKWEdJcmI2OApqNnhTbGt1cVVZM2tFekVaNkU1Tm45dXNzMnJWdkRsVWNjcDZlbitRM1gwZGdObUJ1MWttd2hIKzVwUGk5NERrWmZzME53NHBnSEJOCnJ6aUdMcDUvVjYrZUY2N3JITXNvSVYrMkhOam5vZ1FpK2RQYTJNc0NBd0VBQWFPQnNEQ0JyVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFyQmdOVkhSQUVKREFpZ0E4eU1EQTJNVEV5TnpJd01qTTBNbHFCRHpJd01qWXhNVEkzTWpBMQpNelF5V2pBZkJnTlZIU01FR0RBV2dCUm9rT1JucEtaVGdNZUdacVR4OTB0RCs0UzliVEFkQmdOVkhRNEVGZ1FVYUpEa1o2U21VNERICmhtYWs4ZmRMUS91RXZXMHdIUVlKS29aSWh2WjlCMEVBQkJBd0Roc0lWamN1TVRvMExqQURBZ1NRTUEwR0NTcUdTSWIzRFFFQkJRVUEKQTRJQkFRQ1QxREN3MXdNZ0t0RDVZK2lSREFVZ3FWOFp5bnR5VHRTeDI5Q1crMVJhR1N3TUNQZXl2SVdvblg5dE8xS3pLdHZuMUlTTQpZL1lQeXlZQmtWQnM5RjhVNHBOMHdCT2VNRHBRNDdSZ3hSendJa1NOY1Vlc3lCcko2WnVhQUdBVC8zQitYeEZOU1J1ekZWSjd5VlRhCnY1MlZyMnVhMko3cDhlUkRqZUlSUkRxL3I3MkRRbk5TaTZxN3B5blA5V1FjQ2szUnZLcXNueXJRLzM5LzJuM3FzZTB3SmNHRTJqVFMKVzNpRFZ1eWNOc01tNGhIMlowa2RrcXVNKyt2L2V1NkZTcWRRZ1BDblhFcVVMbDhGbVR4U1FlRE50R1BQQVVPNm5JUGNqMkE3ODFxMAp0SHV1Mmd1UU9IWHZnUjFtMHZkWGNEYXp2L3dvcjNFbGhWc1QvaDUvV3JROAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDIKPT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGdHpDQ0E1K2dBd0lCQWdJQ0JRa3dEUVlKS29aSWh2Y05BUUVGQlFBd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9UCkVGRjFiMVpoWkdseklFeHBiV2wwWldReEd6QVpCZ05WQkFNVEVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01qQWVGdzB3TmpFeE1qUXgKT0RJM01EQmFGdzB6TVRFeE1qUXhPREl6TXpOYU1FVXhDekFKQmdOVkJBWVRBa0pOTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTQphVzFwZEdWa01Sc3dHUVlEVlFRREV4SlJkVzlXWVdScGN5QlNiMjkwSUVOQklESXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRQ2FHTXBMbEEwQUxhOERLWXJ3RDRISXJrd1poUjBJbjZzcFJJWHpMNEd0TWg2UVJyK2poaVlhSHY1K0hCZzYKWEp4Z0Z5bzZkSU16TUgxaFZCSEw3YXZnNXRLaWZ2VnJieGkzQ2dzdC9lays3d3JHc3hEcDNNSkdGL2hkL2FUYS81NUpXcHptTStZawpsdmMvdWxzckhIbzF3dFpuL3F0bVVJdHRLR0FyNzlkZ3c4ZVR2STAya2ZOLytOc1JFOFNjZDNiQnJyY0Nhb0Y2cVVXRDRnWG11VmJCCmxEZVBTSEZqSXV3WFpRZVZpa3ZmajhaYUN1V3c0MTllYXhHckRQbUY2MFRwK0FSejh1bitYSmlNOVhPdmE3Uit6ZFJjQWl0TU9lR3kKbFpVdFFvZlgxYk9RUTdkc0UvSGUzZmJFK0lrLzBYWDFrc09SMVlxSTBKRHMzRzNlaWNKbGNaYUxEUVA5bkw5YkZxeVMyK3IrZVh5dAo2Ni8zRnN2YnpTVXI1Ui83bXAvaVVjdzZVd3hJNWc2OXliUjJCbExtRVJPRmNtTURCT0FFTmlzZ0dRTG9kS2NmdHNsV1p2QjFKZHhuCndRNWhZSWl6UHRHby9LUGFIYkRSc1NOVTMwUjJiZTFCMk1HeUlyWlRITjgxSGR5aGR5b3g1QzMxNWVYYnlPRC81WURYQzJPZy96T2gKRDdvc0ZSWHFsN1BTb3JXKzhveVdIaHFQSFd5a1lUZTVobk16MTVlV25pTjlncVJNZ2VLaDBicG5YNVVIb3ljUjdoWVFlN3hGU2t5eQpCTktyNzlYOURGSE9VR29JTWZtUjJneVBaRndEd3pxTElEOXVqV2M5T3RiK2ZWdUl5Vjc3ekdIY2l6TjMwMFF5TlFsaUJKSVdFTmllCkowZjdPeUhqK09zZFd3SURBUUFCbzRHd01JR3RNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWQKRGdRV0JCUWFoR0s4U0V3ekpRVFU3dEQyQThRWlJ0R1VhekJ1QmdOVkhTTUVaekJsZ0JRYWhHSzhTRXd6SlFUVTd0RDJBOFFaUnRHVQphNkZKcEVjd1JURUxNQWtHQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1UCkVsRjFiMVpoWkdseklGSnZiM1FnUTBFZ01vSUNCUWt3RFFZSktvWklodmNOQVFFRkJRQURnZ0lCQUQ0S0ZrMmZCbHVvcm5GZEx3VXYKWitZVFJZUEVOdmJ6d0NZTURiVkhaRjM0dEhMSlJxVURHQ2RWaVhoOWR1cVdOSUFYSU56bmcvaU4vQWU0Mmw5TkxtZXloUDNaUlB4MwpVSUhtZkxUSkRRdHlVL2gyQndkQlI1WU0rK0NDSnBOVmpQNGlIMkJsZkYvbkpyUDNNcENZVU5RM2NWWDJraUY0OTVWNSt2Z3RKb2RtClZqQjNwamQ0TTFJUVdLNC9ZWTd5YXJIdkdINUtXV1BLamFKVzFhY3Z2RllmenpuQjR2c0txQlVzZlUxNlk4WnNsMFE4MG0vRFNoY0sKK0pEU1Y2SVpVYVV0bDBIYUIwK3BVTnFRalpSRzRUN3dsUDBRQURqMU8raEE0YlJ1VmhvZ3pHOVlqZTB1UlkvVzZaTS81N0VzM3pyVwpJb3pjaExzaWI5RDQ1TVk1NlFTSVBNTzY2MVY2YllDWkpQVnNBZnY0bDdDVVcrdjkwbS94ZDJnTk5XUWpyTGhWb1FQUlRVSVozUGgxCldWYWorYWhKZWZpdkRya1JvSHkzYXUwMDBMWW1ZamdhaHd6NDZQMHUwNUIvQjVFcUhkWitYSVdEbWJBNENEL3BYdmsxQitUSlltNVgKZjZkUWxmZTZ5SnZtanFJQnhkWm12M2xoOHp3YzRibUNYRjJndytuWVNMMFpvaEVVR1c2eWhodG9Qa2czR29pM1haWmVuTWZ2SjJJSQo0cEVaWE5MeElkMjZGMEtDbDNHQlV6R3BuL1o5WXI5eTRhT1RIY3lLSmxvSk9ORE8xdzJBRnJSNHBUcUhUSTJLcGRWR2wvSXNFTG04ClZDTEFBVkJwUTU3MHN1OXQrT3phOGVPeDc5K1JqMVFxQ3lYQkpobkVVaEFGWmRXQ0VPckNNYzB1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMwo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUduVENDQklXZ0F3SUJBZ0lDQmNZd0RRWUpLb1pJaHZjTkFRRUZCUUF3UlRFTE1Ba0dBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1QKRUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4R3pBWkJnTlZCQU1URWxGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXpBZUZ3MHdOakV4TWpReApPVEV4TWpOYUZ3MHpNVEV4TWpReE9UQTJORFJhTUVVeEN6QUpCZ05WQkFZVEFrSk5NUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNCmFXMXBkR1ZrTVJzd0dRWURWUVFERXhKUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUMKRHdBd2dnSUtBb0lDQVFETVYwSVdWSnptbU5QVFRlNys3Y2VmUXpsS1piUG9Gb2cwMncxWmtYVFBrcmdFUUswQ1N6R3J2STJSYU5nZwpEaG9CNGhwN1RoZGQ0b3EzUDVrYXpldGhxOEpscGgrM3Q3MjNqL3o5Y0k4TG9HZStBYUpaejNIbUR5bDIvN0ZXZVVVckg1NTZWT2lqCktUVm9wQUZQRDZRdU4rOGJ2K09QRUtoeXExaFg1MVNHeU1uelc5b3MybDJPYmp5alB0cjdndVhkOGx5eUJUTnZpamJPMEJOTy83OUsKRERSTXBzTWh2VkFFVmV1eHU1MzdSUjVrRmQ1VkFZd0NkclhMb1Q5Q2Fid3Z2V2hERmxhSktqZGhrZjJtcms3QXl4UmxsRGRMa2didgpCTkRJbklqYkMzdUJyN0U5S3NSbE9uaTI3dHlBc2RMVG1adzY3bXRhYTdPTnQ5WE9uTUsrcFVzdkZyR2VhRHNHYjY1OW4vamU3TXdwCnA1aWpKVU12Ny9GZkp1R0lUZmhlYnRmWkZHNFpNMm1uTzRTSms4UlRWUk9oVVhoQStMakpvdTU3dWxKQ2c1NFU3UVZTV2xsV3A1ZjgKblQ4S0tkamNUNUVPRTd6ZWxhVGZpNW0rckpzemlPKzFnYThieGlKVHlQYkg3cGNVc01WOGVGTEk4TTV1ZDJDRXB1a3FkaUR0V0FFWApNSlBwR292Z2MyUFphcEtVU1U2MHJVcUZ4S01pTVB3SjdXZ2ljNmFJREZVaFdNWGhPcDhxM2NyaGtPRFpjNnRzZ0xqb0MyU1RvSnlNCkdmK3owZ3pza1NhSGlyT2k0WENQTEFybHpXMW9VZXZhUHdWL2l6TG1FMXhyL2w5QTRpTEl0TFJrVDlhNmZVZytxR2tNMTd1R2NjbHoKdUQ4N25TVkwydjlBNndJREFRQUJvNElCbFRDQ0FaRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96Q0I0UVlEVlIwZ0JJSFpNSUhXTUlIVApCZ2tyQmdFRUFiNVlBQU13Z2NVd2daTUdDQ3NHQVFVRkJ3SUNNSUdHR29HRFFXNTVJSFZ6WlNCdlppQjBhR2x6SUVObGNuUnBabWxqCllYUmxJR052Ym5OMGFYUjFkR1Z6SUdGalkyVndkR0Z1WTJVZ2IyWWdkR2hsSUZGMWIxWmhaR2x6SUZKdmIzUWdRMEVnTXlCRFpYSjAKYVdacFkyRjBaU0JRYjJ4cFkza2dMeUJEWlhKMGFXWnBZMkYwYVc5dUlGQnlZV04wYVdObElGTjBZWFJsYldWdWRDNHdMUVlJS3dZQgpCUVVIQWdFV0lXaDBkSEE2THk5M2QzY3VjWFZ2ZG1Ga2FYTm5iRzlpWVd3dVkyOXRMMk53Y3pBTEJnTlZIUThFQkFNQ0FRWXdIUVlEClZSME9CQllFRlBMQUUrQ0NRejc3N2k5bk1wWTFYTnU0eXdMUU1HNEdBMVVkSXdSbk1HV0FGUExBRStDQ1F6Nzc3aTluTXBZMVhOdTQKeXdMUW9VbWtSekJGTVFzd0NRWURWUVFHRXdKQ1RURVpNQmNHQTFVRUNoTVFVWFZ2Vm1Ga2FYTWdUR2x0YVhSbFpERWJNQmtHQTFVRQpBeE1TVVhWdlZtRmthWE1nVW05dmRDQkRRU0F6Z2dJRnhqQU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FnRUFUNjJnTEV6NndQSnY5MlpWCnF5TTA3dWNwMnNOYnRyQ0QyZERRNGlINzgyQ25PMTFnVXllaW0vWUlJaXJudjZCeTVad2thakd4a0hvbjI0UVJpU2VtZDFvNDE3K3MKaHZ6dVhZTzhCc2JSZDJzUGJTUXZTM3BzcHdlV3l1T0VuNjJJaXgyckZvMWJaaGZaRnZTTGdOTGQrTEoydy93NEU2b00za0pwSzI3egpQT3VBSjl2MXBrUU5uMXBWV1F2VkRWSkl4YTZmOGkrQXhlb3lVRFVTbHk3QjRmL3hJNGhST0oveVpsWjI1dzlSbDZWU0RFMUpVWlUyClBiK2lTd3dRSFlhWlRLcnpjaEdUNU9yMm05cW9YYWROdDU0Q3JuTUF5Tm9qQStqNTZobDBZZ0NVeXlJZ3ZwU25XYldDYXI2WmVYcXAKOGtva1V2ZDAvYnBPNXFnZEFtNnhEWUJFd2E3VEl6ZGZ1NFY4SzVJdTZINmxpOTJaNGI4bmJ5MWRxbnVIL2dyZFMveU85U2JrYm5CQwpialBzTVo1N2s4SGt5V2thUGNCclRpSnQ3cXRZVGNiUVFjRXI2azhTaDE3clJkaHM5WmdDMDZEWVZZb0dtUm1pb0hmUk1KNnN6SFh1CmcvV3dZam5QYkZmaVROS1JDdzUxS0J1YXYvMGFRL0hLZC9zN2oyRzRhU2dXUWdSZWNDb2NJZGlQNGIwald5MTBRSkxaWXhrTmM5MXAKdkdKSHZPQjBLN0xyZmI1Qkc3WEFSc1doSXN0ZlRzRW9rdDRZdXRVcUtMc1JpeGVUbUpsZ2xGd2p6MW9ubDE0TEJRYVROeDQ3YVRicgpxWjVoSFk4eTJvNE0xblErZXdrazJnRjNSOFE3elRTTW1mWEs0U1ZoTTdKWkcrSnUxemRYdGcycEV0bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHR6Q0NBcCtnQXdJQkFnSVFET2ZnNVJmWVJ2NlA1V0Q4Ry9Bd09UQU5CZ2txaGtpRzl3MEJBUVVGQURCbE1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3CklnWURWUVFERXh0RWFXZHBRMlZ5ZENCQmMzTjFjbVZrSUVsRUlGSnZiM1FnUTBFd0hoY05NRFl4TVRFd01EQXdNREF3V2hjTk16RXgKTVRFd01EQXdNREF3V2pCbE1Rc3dDUVlEVlFRR0V3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTApFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU1F3SWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdRMEV3CmdnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0RGhYTzVFT0FYTEdIODdkZytYRVNwYTdjSnBTSXF2VE8KOVNBNUtGaGdEUGlBMnFrVmxUSmhQTFd4S0lTS2l0eWZDZ3lERjNxUGtLeUs1M2xUWERHRUt2WVBtREkyZHN6ZTNUeW9vdTlxK3lIeQpVbUhmbnlEWEgrS3gyZjRZWk5JU1cxLzVXQmcxdkVmTm9UYjVhMy9Vc0RnK3dSdkRqRFBaMkM4WS9pZ1BzNmVEMXNOdVJNQmhOWllXCi9sbWNpM1p0MS9HaVN3MHIvd3R5MnA1ZzBJNlFOY1o0VlljZ29jL2xiUXJJU1h3eG1ETnNJdW1IMERKYW9yb1RnaEh0T1JlZG1UcHkKb2ViNnBOblZGekYxcm9WOUlxNC9BVWFHOWloNXlMSGE1RmNYeEg0Y0RyQzBrcVpXczcyeWwrMnFwL0MzeGFnL2xSYlEvNkdXNndoZgpHSGRQQWdNQkFBR2pZekJoTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlJGCjY2S3Y5SkxMZ2pFdFVZdW5weUdkODIzSUR6QWZCZ05WSFNNRUdEQVdnQlJGNjZLdjlKTExnakV0VVl1bnB5R2Q4MjNJRHpBTkJna3EKaGtpRzl3MEJBUVVGQUFPQ0FRRUFvZzY4MytMdDhPTnljM3BrbEwvM2NtYllNdVJDZFdLdWgrdnkxZG5lVnJPZnpNNFVLTGtObDJCYwpFa3hZNU5NOWcwbEZXSmMxYVJxb1IrcFd4bm1yRXRobmdZVGZmd2s4bE9hNEppd2d2VDJ6S0luM1gvOGk0cGVFSCtsbDc0ZmczOEZuClNiTmQ2N0lKS3VzbTdYaStmVDhyODdjbU5XMWZpUUcyU1Z1ZkFRV2JxejBsd2N5MmY4THhiNGJHK21SbzY0RXRsT3RDdC9xTUh0MWkKOGI1UVo3ZHN2ZlB4SDJzTU5nY1dmemQ4cVZ0dGV2RVNSbUNEMXljRXZrdk9sNzdEWnlwb0VkK0E1d3d6WnI4VERSUnU4MzhmWXhBZQorbzBiSlcxc2o2VzNZUUd4MHFNbW9SQnhuYTNpdy9uRG1WRzNLd2NJemk3bVVMS24rZ3BGTDZMdzhnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgR2xvYmFsIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURyekNDQXBlZ0F3SUJBZ0lRQ0R2Z1ZwQkNSckdoZFdySldaSEhTakFOQmdrcWhraUc5dzBCQVFVRkFEQmhNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNBdwpIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JEUVRBZUZ3MHdOakV4TVRBd01EQXdNREJhRncwek1URXhNVEF3Ck1EQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDMKZHk1a2FXZHBZMlZ5ZEM1amIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVOQk1JSUJJakFOQmdrcQpoa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQTRqdmhFWExlcUtUVG8xZXFVS0tQQzNlUXlhS2w3aExPbGxzQkNTRE1BWk9uClRqQzNVL2REeEdrQVY1M2lqU0xkaHdaQUFJRUp6czRiZzcvZnpUdHhSdUxXWnNjRnMzWW5Gbzk3bmg2VmZlNjNTS01JMnRhdmVndzUKQm1WL1NsMGZ2QmY0cTc3dUtOZDBmM3A0bVZtRmFHNWNJekpMdjA3QTZGcHQ0M0MvZHhDLy9BSDJoZG1vUkJCWU1xbDFHTlhSb3I1SAo0aWRxOUpveitFa0lZSXZVWDdRNmhMK2hxa3BNZlQ3UFQxOXNkbDZnU3plUm50d2k1bTNPRkJxT2Fzdit6Yk1VWkJmSFd5bWVNci95Cjd2clRDMExVcTdkQk10b00xTy80Z2RXN2pWZy90UnZvU1NpaWNOb3hCTjMzc2hieVRBcE9CNmp0U2oxZXRYK2prTU92SndJREFRQUIKbzJNd1lUQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUE5NVFOVmJSVEx0bQo4S1BpR3h2RGw3STkwVlV3SHdZRFZSMGpCQmd3Rm9BVUE5NVFOVmJSVEx0bThLUGlHeHZEbDdJOTBWVXdEUVlKS29aSWh2Y05BUUVGCkJRQURnZ0VCQU11Y042cElFeElLK3QxRW5FOVNzUFRmcmdUMWVYa0lveVFZL0VzcmhNQXR1ZFhIL3ZUQkgxakx1RzJjZW5Ubm1DbXIKRWJYamNLQ2h6VXlJbVpPTWtYRGlxdzhjdnBPcC8yUFY1QWRnMDZPL25Wc0o4ZFdPNDFQMGptUDZQNmZidEdiZlltYlcwVzVCamZJdAp0ZXAzU3ArZFdPSXJXY0JBSSswdEtJSkZQbmxVa2lhWTRJQklxRGZ2OE5aNVlCYmVyT2dPelc2c1JCYzRMMG5hNFVVK0tyazJVODg2ClVBYjNMdWpFVjBsc1lTRVkxUVN0ZUR3c09vQnJwK3V2RlJUcDJJbkJ1VGhzNHBGc2l2OWt1WGNsVnpEQUd5U2o0ZHpwMzBkOHRiUWsKQ0FVdzdDMjlDNzlGdjFDNXFmUHJtQUVTcmNpSXhwZzBYNDBLUE1icDFaV1ZiZDQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHhUQ0NBcTJnQXdJQkFnSVFBcXhjSm1vTFFKdVBDM255cmtZbGR6QU5CZ2txaGtpRzl3MEJBUVVGQURCc01Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU3N3CktRWURWUVFERXlKRWFXZHBRMlZ5ZENCSWFXZG9JRUZ6YzNWeVlXNWpaU0JGVmlCU2IyOTBJRU5CTUI0WERUQTJNVEV4TURBd01EQXcKTUZvWERUTXhNVEV4TURBd01EQXdNRm93YkRFTE1Ba0dBMVVFQmhNQ1ZWTXhGVEFUQmdOVkJBb1RERVJwWjJsRFpYSjBJRWx1WXpFWgpNQmNHQTFVRUN4TVFkM2QzTG1ScFoybGpaWEowTG1OdmJURXJNQ2tHQTFVRUF4TWlSR2xuYVVObGNuUWdTR2xuYUNCQmMzTjFjbUZ1ClkyVWdSVllnVW05dmRDQkRRVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNYk01WFBtKzlTNzVTMHQKTXFiZjVZRS95YzBsU2JaeEtzUFZsRFJub2dvY3NGOXBwa0N4eExleWo5Q1lwS2xCV1RyVDNKVFdQTnQwT0tSS3pFMGxndmRLcFZNUwpPTzd6U1cxeGtYNWp0cXVtWDhPa2hQaFBZbEcrK01YczJ6aVM0d2JsQ0pFTXhDaEJWZnZMV29rVmZuSG9OYjlOY2drOXZqbzRVRnQzCk1SdU5zOGNrUlpxbnJHMEFGRm9FdDdvVDYxRUttRUZCSWs1bFlZZUJRVkNtZVZ5SjNobEtWOVV1NWwwY1V5eCttTTBhQmhha2FIUFEKTkFRVFhLRngwMXA4VmR0ZVpPRTNoekJXQk9VUnRDbUFFdkY1T1lpaUFoRjhKMmEzaUxkNDhzb0txRGlyQ21UQ3YyWmRsWVRCb1NVZQpoMTBhVUFzZ0VzeEJ1MjRMVVRpNFM4c0NBd0VBQWFOak1HRXdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BOEdBMVVkRXdFQi93UUZNQU1CCkFmOHdIUVlEVlIwT0JCWUVGTEUrdzJrRCtMOUhBZFNZSmhvSUF1OWpaQ3ZETUI4R0ExVWRJd1FZTUJhQUZMRSt3MmtEK0w5SEFkU1kKSmhvSUF1OWpaQ3ZETUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFBY0dnYVgzTmVjbnp5SVpnWUlWeUhiSVVmNEttZXF2eGd5ZGtBUQpWOEdLODNyWkVXV09OZnFlL0VXMW50bE1NVXU0a2VoRExJNnplTTdiNDFONWNkYmxJWlFCMmxXSG1pUms5b3Btek42Y044Mm9OTEZwCm15UElubmdpSzNCRDQxVkhNV0VaNzFqRmhTOU9NUGFnTVJZanlPZmlaUll6eTc4YUc2QTkrTXBlaXpHTFlBaUpMUXdHWEZLM3hQa0sKbU5FVlg1OFN2bncyWXppOVJLUi81Q1lyQ3NTWGFRM3BqT0xBRUZlNHlIWVNrVlh5U0duWXZDb0NXdzlFMUNBeDIvUzZjQ1pka0dDZQp2RXNYQ1MrMHl4NURhTWtISjhIU1hQZnFJYmxvRXB3OG5MK2UvSUJjbTJQTjdFZXFKU2Rub0RmekFJSjlWTmVwK09rdUU2TjM2QjlLCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzU2lnbiBHb2xkIENBIC0gRzIKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnVqQ0NBNktnQXdJQkFnSUpBTHRBSEVQMVhrK3dNQTBHQ1NxR1NJYjNEUUVCQlFVQU1FVXhDekFKQmdOVkJBWVRBa05JTVJVdwpFd1lEVlFRS0V3eFRkMmx6YzFOcFoyNGdRVWN4SHpBZEJnTlZCQU1URmxOM2FYTnpVMmxuYmlCSGIyeGtJRU5CSUMwZ1J6SXdIaGNOCk1EWXhNREkxTURnek1ETTFXaGNOTXpZeE1ESTFNRGd6TURNMVdqQkZNUXN3Q1FZRFZRUUdFd0pEU0RFVk1CTUdBMVVFQ2hNTVUzZHAKYzNOVGFXZHVJRUZITVI4d0hRWURWUVFERXhaVGQybHpjMU5wWjI0Z1IyOXNaQ0JEUVNBdElFY3lNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFyK1R1Zm9za0RoSnVxVkF0RmtRN2twSmN5cmhkaEpKQ0V5cThaVmVDUUQ1WEpNMVFpeVVxCnQyLzg3NkxRd0I4Q0pFb1RsbzhqRStZb1dBQ2pSOGNHcDRRaks3dTlsaXQvVmN5THdWY2ZEbUpsRDkwOVZvcHoycTUrYmJxQkhINUMKakNBMTJVTk5oUHFFMjFJczh3NG5kd3RydnhFdmNuaWZMdGcrNWhnM1dpcHkrZHBpa0pLVnloK2M2Yk04Szh2ekFSTy9Xcy9CdFFwZwp2ZDIxbVdSVHVLQ1dzMi9pSm5lUmpPQmlFQUtmTkErazFaSXpVZDYramJxRWVtQThhdHVmSyt6ZTNnRS9iazNsVUliTHRLL3RSRURGCnlscU0ydElyZktqdXZxYmxDcW9PcGQ4RlVyZFZ4eUpkTW1xWGwyTVQyOG5iZVRaN2hUcEt4VktKK1NUbm5YZXBndjlWSEtWeGFTdlIKQWlUeXN5YlVhOW9FVmVYQkNzZHRNRGVRS3VTZUZETmVGaGRWeFZ1MXl6U0prdkdkSm8raEI5VEdzbmhRMnd3TUMzd0xqRUhYdWVuZApqSWozbzAyeU1zellGOXJOdDg1bW5kVDlYdis5bHo0cGRlZCtwMkpZcnlVMHBVSEhQYndOVU1vREF3OElXaCtWYzNoaXY2OXlGR2tPCnBlVUREbmlPSmloQzhBY0xZaUFRWnpsRytxa0R6QVE0ZW1idklJTzFqRXBXanBFQS9JNWNndDZJb01QaWFHNTlqZTg4M1dYMFhheFIKN3lTQXJxcFdsMi81clgzYVlUK1lkenlsa2JZY2pDYmFaYUlKYmNIaVZPTzV5a3hNZ0k5M2UyQ2FIdCsyOGtnZURycE9WRzJZNE9HaQpHcUozVU0vRVk1THNSeG1kNitacnpzRUNBd0VBQWFPQnJEQ0JxVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFkQmdOVkhRNEVGZ1FVV3lWN2xxUmxVWDY0T2ZQQWVHWmU2RHJuOE80d0h3WURWUjBqQkJnd0ZvQVVXeVY3bHFSbFVYNjQKT2ZQQWVHWmU2RHJuOE80d1JnWURWUjBnQkQ4d1BUQTdCZ2xnaFhRQldRRUNBUUV3TGpBc0JnZ3JCZ0VGQlFjQ0FSWWdhSFIwY0RvdgpMM0psY0c5emFYUnZjbmt1YzNkcGMzTnphV2R1TG1OdmJTOHdEUVlKS29aSWh2Y05BUUVGQlFBRGdnSUJBQ2U2NDVSODhhN0EzaGZtCjVkalY5VlN3Zy9TN3pWNEZlMCtmZFdhdlBPaFdmdnh5ZURnRDJTdGlHd0M1K09sZ3pjek9VWXJIVURGdTRVcCtHQzlwV2JZOVpJRXIKNDRPRTVpS0hqbjNnN2dLWlliZ2U5TGdyaUJJV2hNSXhremlXTWFhNU8xTS93eVNUVmx0cGt1ekZ3YnM0QU9Qc0Y2bTQzTWQ4QVlPZgpNa2U2VWlJMEhUSjZDVmFuZkNVMnFUMUwyc0NDYndxN0VzaUhTeWNSK1I0dHg1TS9udHRmSm10UzJTNks4UlRHUkkwVnFiZS92ZDZtCkd1NnVMZnRJZHhmK3UreXZHUFVxVWZBNWhKZVZiRzRid3l2RWRHQjVKYkFLSjkvZlh0STV6MFY5UWt2ZnN5d2V4Y1pkeWxVNm9KeHAKbW8vYTc3S3dQSitIYkJJclpYQVZVakVhSk05dk1TTlFINHhQanlQRGRFRmpIRldvRk4wKzRGRlF6L0ViTUZZT2tyQ0NoZGlEeXlKawp2QzI0SmRWVW9yZ0c2cTJTcENTZ3dZYTFTaE5xUjg4dUMxYVZWTXZPbXR0cXRLYXkyMEVJaGlkMzkycWdRbXdMT003WGRWQXlrc0xmCkt6QWlTTkRWUVRnbFhhVHBYWi9HbEhYUVJmMHdsME9Qa0tzS3g0WnpZRXBwTGQ2bGVOY0cybXFlU3o1M09pQVRJZ0hRdjJpZVkyQnIKTlUwTGJicWhQY0NUNEg4anMxV3RjaVZPUnZuU0Z1K3daTUVCbnVuS29HcVlEcy9ZWVBJdlNiamtRdUU0TlJiMHlHNVA5NEZXNkxxagp2aU92cnYxdkErQUNPekIyK2h0dFFjOEJzZW00eVdiMDJ5YnpPcVIwOGtra1c4bXcwRmZCK2o1NjRaZkoKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlVHJ1c3QgQ0EKPT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1RENDQXFDZ0F3SUJBZ0lRRFBDT1hBZ1dwYTFDZi9Eckp4aFowREFOQmdrcWhraUc5dzBCQVFVRkFEQklNUXN3Q1FZRFZRUUcKRXdKVlV6RWdNQjRHQTFVRUNoTVhVMlZqZFhKbFZISjFjM1FnUTI5eWNHOXlZWFJwYjI0eEZ6QVZCZ05WQkFNVERsTmxZM1Z5WlZSeQpkWE4wSUVOQk1CNFhEVEEyTVRFd056RTVNekV4T0ZvWERUSTVNVEl6TVRFNU5EQTFOVm93U0RFTE1Ba0dBMVVFQmhNQ1ZWTXhJREFlCkJnTlZCQW9URjFObFkzVnlaVlJ5ZFhOMElFTnZjbkJ2Y21GMGFXOXVNUmN3RlFZRFZRUURFdzVUWldOMWNtVlVjblZ6ZENCRFFUQ0MKQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFLdWtnZVdWemZYMkZJN0NUOHJVNG5pVldKeEI0UTJaUUNRWApPWkV6WnVtKzRZT3ZZbHlKMGZ3a1cyR3o0QkVSUVJ3ZGJ2QzR1L2plcDRHNnBrakdueDI5dm82cFFUNjRsTzBwR3RTTzBnTWRBKzl0CkRXY2NWOWNHcmNySTlmNE9yMllsU0FTV0MxMmp1aGJEQ0UvUlJ2Z1VYUExJWGdHWmJmMkl6SWFvd1c4eFFteFNQbWpMOHhrMDM3dUgKR0ZhQUpzVFEzTUJ2Mzk2Z3dwRVdvR1FSUzBTOEh2Ym4rbVBlWnF4MnBIR2o3RGFVYUhwM3BMSG5EaStCZXVLMWNvYnZvbXVMOEEvYgowMWsvdW5LOFJDU2M0M096OTY5WEwwSW1uYWwwdWdCUzhrdk5VM3hIQ3phRkRtYXBDSmNXTkZmQlp2ZUE0KzF3Vk1lVDRDNG9GVm1ICnVyc0NBd0VBQWFPQm5UQ0JtakFUQmdrckJnRUVBWUkzRkFJRUJoNEVBRU1BUVRBTEJnTlZIUThFQkFNQ0FZWXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVUWpLMkZ2b0UvZjVkUzNyRC9mZE1RQjFhUTY4d05BWURWUjBmQkMwd0t6QXBvQ2VnSllZagphSFIwY0RvdkwyTnliQzV6WldOMWNtVjBjblZ6ZEM1amIyMHZVMVJEUVM1amNtd3dFQVlKS3dZQkJBR0NOeFVCQkFNQ0FRQXdEUVlKCktvWklodmNOQVFFRkJRQURnZ0VCQUREdFQwcmhXRHBTY2x1MXBxTmxHS2E3VVR0MzZaM3EwNTljNEVWbGV3M0tXK0p3VUxLVUJSU3UKU2NlTlFRY1NjNVIrRENNaC9id1FmMkFRV25MMW1BNnM3TGwvM1hwdlhkTWM5UCtJQldsQ3FRVnh5TGVzSnVndXRJeHEvM0hjdUxIZgptYng4SVZRcjVGaWl1MWNwcnA2cG94a21ENWt1Q0xEdi9XblBtUm9KamVPbm55dkpOalI3SkxONFRKVVhwQVltSHJaa1VqWmZZR2ZaCm5NVUZkQXZuWnlQU0NQeUk2YTZMZitFdzlEZCsvY1l5MmkyZVJEQXdiTzRIM3RJMC9OTC9RUFpMOUdaR0JsU204aklLWXlZd2E1dlIKM0l0SHV1RzUxV0xRb3FEMFp3VjRLV01hYndUVytNWk1vNXF4TjdTTjVTaExIWjRzd3Job3ZPMEM3akU9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZSBHbG9iYWwgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHZEQ0NBcVNnQXdJQkFnSVFCMVlpcE9qVWlvbE45QlBJOFBqcXBUQU5CZ2txaGtpRzl3MEJBUVVGQURCS01Rc3dDUVlEVlFRRwpFd0pWVXpFZ01CNEdBMVVFQ2hNWFUyVmpkWEpsVkhKMWMzUWdRMjl5Y0c5eVlYUnBiMjR4R1RBWEJnTlZCQU1URUZObFkzVnlaU0JICmJHOWlZV3dnUTBFd0hoY05NRFl4TVRBM01UazBNakk0V2hjTk1qa3hNak14TVRrMU1qQTJXakJLTVFzd0NRWURWUVFHRXdKVlV6RWcKTUI0R0ExVUVDaE1YVTJWamRYSmxWSEoxYzNRZ1EyOXljRzl5WVhScGIyNHhHVEFYQmdOVkJBTVRFRk5sWTNWeVpTQkhiRzlpWVd3ZwpRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ3ZOUzdZckd4VmFRWng1Uk5vSkxOUDJNd2hSL2p4CllEaUppUVBwdmVwZVJsTUozRnoxV3VqM1JTb0M2ekZoMXlrelRNN0hmQW8zZmcrNk1wamhIWmV2ajhmY3lUaVc4OXNhL0ZIdGFNYlEKYnFSOEpOR3VRc2lXVUdNdTRQNTEvcGluWDBrdWxlTTVNMlNPSHFSZmtOSm5QTExaL2tHNVZhY0pqbklGSG92ZFJJV0NRdEJKd0IxZwo4TkVYTEpYcjlxWEJrcVBGd3FjSVlBMWdCQkNXZVo0V05PYXB0dm9sUlRuSUhtWDVrL1dxOFZMY21aZzlwWVlhRERVeitrdWxCQVlWCkhER0E3Nm9ZYThKNzE5ck8rVE1nMWZXOWFqTXRnUVQ3c0Z6VW5LUGlYQjNqcVVKMVhudlVkKzg1VkxySkNoZ2JFcGxKTDRoTC9WQmkKMFhQbmozcERBZ01CQUFHamdaMHdnWm93RXdZSkt3WUJCQUdDTnhRQ0JBWWVCQUJEQUVFd0N3WURWUjBQQkFRREFnR0dNQThHQTFVZApFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRks5RUJNSkJma2lEMjA0NUF1enNoSHJtenNta01EUUdBMVVkSHdRdE1Dc3dLYUFuCm9DV0dJMmgwZEhBNkx5OWpjbXd1YzJWamRYSmxkSEoxYzNRdVkyOXRMMU5IUTBFdVkzSnNNQkFHQ1NzR0FRUUJnamNWQVFRREFnRUEKTUEwR0NTcUdTSWIzRFFFQkJRVUFBNElCQVFCakdnaEFmYVJlVXcxMzJIcXVIdzBMVVJZRDd4aDh5T092YWxpVEZHQ1Jzb1RjaUU2KwpPWW82OCthQ2lWMEJON09ySktRVkRwSTFXa3BFWGs1WCtuWE9IMGpPWnZROFFDYVNtR3diN2lSR0RCZXpVcVhicFpHUnp6ZlRiK2NuCkNEcE9HUjg2cDFoY0Y4OTVQNHZrcDlNbUk1MG1EMWhwL0VkK3N0Q05pNU8vS1U5RGFYUjJaMHZQQjR6bUF2ZTE0YlJEdFVzdEZKLzUKM0NZTnY2WkhkQWJZaU5FNktUQ0V6dEk1Z0dJYnFNZFhTYnhxVlZGbkZVcStOUWZrMVhXWU4za3dGTnNwbld6RmFjeEhWYUl3OTh4YwpmOExEbUJ4clRoYUE2M3A0WlVXaUFCcXZEQTFWWkRSSXVKSzU4YlJRS2ZKUEl4L2FiS3dmUk9IZEkzaFJXOGNXCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVIVENDQXdXZ0F3SUJBZ0lRVG9FdGlvSmw0QXNDN2o0MUFrYmxQVEFOQmdrcWhraUc5dzBCQVFVRkFEQ0JnVEVMTUFrR0ExVUUKQmhNQ1IwSXhHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnRwpBMVVFQ2hNUlEwOU5UMFJQSUVOQklFeHBiV2wwWldReEp6QWxCZ05WQkFNVEhrTlBUVTlFVHlCRFpYSjBhV1pwWTJGMGFXOXVJRUYxCmRHaHZjbWwwZVRBZUZ3MHdOakV5TURFd01EQXdNREJhRncweU9URXlNekV5TXpVNU5UbGFNSUdCTVFzd0NRWURWUVFHRXdKSFFqRWIKTUJrR0ExVUVDQk1TUjNKbFlYUmxjaUJOWVc1amFHVnpkR1Z5TVJBd0RnWURWUVFIRXdkVFlXeG1iM0prTVJvd0dBWURWUVFLRXhGRApUMDFQUkU4Z1EwRWdUR2x0YVhSbFpERW5NQ1VHQTFVRUF4TWVRMDlOVDBSUElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBMEVDTGkzTGprUnYzVWNFYlZBU1kwNm0vd2VhS1hUdUgKKzd1SXpnM2pMejhHbHZDaUtWQ1pydHM3b1Zld2RGRnh6ZTFDa1UxQi9xbkkyR3FHZDBTN1dXYVhVRjYwMUN4d1JNL2FONVZDYVR3dwp4SEd6VXZBaFRhSFl1amw4SEo2akpKM3lneGFZcWhaOFE1c1ZXN2V1TkpIKzFHSW1HRWFhUCt2QitmR1FWK3VzZWcyTDIzSXdhbWJWCjRFYWpjTnhvMmY4RVNJbDMzclhwKzJkdFFlbThPYjB5MldJQzhiR29QVzQzbk9JdjR0T2lKb3ZHdUZWRGlPRWpQcVhTSkRscVI2c0EKMUtHenFTWCtEVCtuSGJyVFVjRUxwTnFzT085VlVDUUZaVWFUTkU4dGphM0cxQ0VaMG83S0JXRnhCM05INVlvWkVyMEVUYzVPbktWSQpyTHNtOXdJREFRQUJvNEdPTUlHTE1CMEdBMVVkRGdRV0JCUUxXT1dMeGt3Vk42UkFxVENwSWI1SE5scFcvekFPQmdOVkhROEJBZjhFCkJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekJKQmdOVkhSOEVRakJBTUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1OdmJXOWsKYjJOaExtTnZiUzlEVDAxUFJFOURaWEowYVdacFkyRjBhVzl1UVhWMGFHOXlhWFI1TG1OeWJEQU5CZ2txaGtpRzl3MEJBUVVGQUFPQwpBUUVBUHBpZW0vWWI2ZGM1dDNpdUhYSVlTZE9INUVPQzZ6L0pxdldvdGU5VmZDRlNaZm5WRGVGczlENk1rM09STGdMRVRnZHhiOENQCk9HRUlxQjZCQ3NBdklDOUJpNUhjU0VXODhjYmV1blpyTThnQUxURkdUTzNubmMrSWxQOHp3RmJvSklZbXVOZzRPTjhxYTkwU3pNYy8KUnhkTW9zSUdsZ25XMi80L1BFWkIzMWppVmc4OE84RWNrelhaT0ZLczdzanNMakJPbERXMEpCOUxlR25hOGdJNHpKVlNrL0J3SlZtYwpJR2ZFN3ZtTFYySDBrblo5UDRTTlZiZm81YXpWOGZVWlZxWmErNUFjcjVQcjVSelVaNWRkQkE2K0M0T21GNE81TUJLZ3hUTVZCYmtOCis4Y0ZkdVBZU28zOE5CZWp4aUVvdmpCRk1SN0hlTDVZWVRpc08rSUJaUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ2lUQ0NBZytnQXdJQkFnSVFIMGV2cW1JQWNGQlVUQUdlbTJPWktqQUtCZ2dxaGtqT1BRUURBekNCaFRFTE1Ba0dBMVVFQmhNQwpSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCkNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QkZRME1nUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3SGhjTk1EZ3dNekEyTURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JoVEVMTUFrR0ExVUVCaE1DUjBJeApHekFaQmdOVkJBZ1RFa2R5WldGMFpYSWdUV0Z1WTJobGMzUmxjakVRTUE0R0ExVUVCeE1IVTJGc1ptOXlaREVhTUJnR0ExVUVDaE1SClEwOU5UMFJQSUVOQklFeHBiV2wwWldReEt6QXBCZ05WQkFNVElrTlBUVTlFVHlCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm8KYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRRFIzc3ZkY21DRllYN2RlU1JGdFNyWXBuMVBsSUxCczVCQUgrWAo0UW9rUEIwQkJPNDkwbzBKbHd6Z2RlVDYrM2VLS3ZVRFlFczJpeFlqRnEwSmNmUks5Q2hRdFA2SUhHNC9iQzh2Q1ZsYnBWc0xNNW5pCnd6MkorV29zNzdMVEJ1bWpRakJBTUIwR0ExVWREZ1FXQkJSMWNhY1pTQm04blozcVFVZmZsTVJJZDVuVGVUQU9CZ05WSFE4QkFmOEUKQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqRUE3d05iZXF5M2VBcHl0NGpmLzdWRwpGQWtLK3FEbWZRakdHb2U5R0toenZTYktZQXlkenBtZnoxd1BNT0crRkRIcUFqQVU5Sk04U2FjemVwQkdSN05qZlJPYlRyZHZHRGVBClUvN2RJT0ExbWpiUnh3RzU1dHpkOC84ZExEb1dWOW1TT2RZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0aWduYQo9PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHFEQ0NBcENnQXdJQkFnSUpBUDdjNHdFUHlVai9NQTBHQ1NxR1NJYjNEUUVCQlFVQU1EUXhDekFKQmdOVkJBWVRBa1pTTVJJdwpFQVlEVlFRS0RBbEVhR2x0ZVc5MGFYTXhFVEFQQmdOVkJBTU1DRU5sY25ScFoyNWhNQjRYRFRBM01EWXlPVEUxTVRNd05Wb1hEVEkzCk1EWXlPVEUxTVRNd05Wb3dOREVMTUFrR0ExVUVCaE1DUmxJeEVqQVFCZ05WQkFvTUNVUm9hVzE1YjNScGN6RVJNQThHQTFVRUF3d0kKUTJWeWRHbG5ibUV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRElhUEhKMXRhek5IVW1naDdzdEw3cQpYT0VtN1JGSFllR2lmQlo0UUNIa1lKNWF5R1BoeExHV2t2OFliV2tqNFN0aTk5M2lOaStSQjdsSXp3N3NlYllzNXpSTGNBZ2xvenlICkd4bnlnUWNQT0pBWjB4SCtoclR5MFY0ZUhwYk5nR3pPT3pHVHR2S2cwS21WRW4ybG1zeHJ5SVJXaWpPcDV5SVZVeGJ3ekJmc1YxL3AKb2dxWUNkN2pYNXh2M0VqamhRc1ZXcWE2bjZ4STR3bXk5L1F5M2w0MHZoeDRYVUpiemc0aWowMlExMzB5R0xNTExHcS9qajhVRVlrZwpEbmNVdFQyVUNJZjNKUjdWc21BQTdHOHFLQ1Z1S2o0WVl4Y2xQejVFSUJiMkpzZ2xyZ1ZLdE9kakxQT01GbE4rWFBzUkdnakJSbUtmCklyanh3bzFwM1BvNldBYmZBZ01CQUFHamdid3dnYmt3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVR3UzK1FUbVEKdENSWnZnSHlVdFZGOWxvNTNCRXdaQVlEVlIwakJGMHdXNEFVR3UzK1FUbVF0Q1JadmdIeVV0VkY5bG81M0JHaE9LUTJNRFF4Q3pBSgpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14RVRBUEJnTlZCQU1NQ0VObGNuUnBaMjVoZ2drQS90empBUS9KClNQOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CRUdDV0NHU0FHRytFSUJBUVFFQXdJQUJ6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUEKaFFNZWtuSDJRcS9obzJHZTYvUEFEL0tsMU5xVjV0YSthRFk5Zm00ZlRJcnYwUThoYlY2bFVtUE9Fdmp2S3RwdjZ6ZitFd0xIeXpzKwpJbXZhWVM1LzFISTkzVERoSGt4QUdZd1AxNXpSZ3pCN21GbmNmY2E1RENsTW9UT2k2MmM2WllUVGx1THRka1Z3ajdVcjN2a2oxa2x1ClBCUzF4cDgxSGxEUXdZOXFjRVFDWXN1dUhXaEJwNnBYNkZPcUI5SUc5dFVVQmd1UkEzVXNiSEsxWVpXYURZdTVEZWYxMzFUTjN1YlkKMWdrSWwyUGx3UzZ3dDBRbXdDYkFyMVV3bmp2Vk5pb1pCUFJjSHYvUExMZi8wUDJIUUJIVkVTTzdTTUFocWFRb0xmMFYrTEJPSy9RdwpXeUg4RVpFMHZrSHZlNTJYZGYrWGxjQ1dXQy9xdTBiWHUrVFpMZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZzRENDQTVpZ0F3SUJBZ0lRRmNpOVpVZGNyN2lYQUY3a0J0SzhuVEFOQmdrcWhraUc5dzBCQVFVRkFEQmVNUXN3Q1FZRFZRUUcKRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MFpDNHhLakFvQmdOVkJBc01JV1ZRUzBrZwpVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEFlRncwd05ERXlNakF3TWpNeE1qZGFGdzB6TkRFeU1qQXdNak14Ck1qZGFNRjR4Q3pBSkJnTlZCQVlUQWxSWE1TTXdJUVlEVlFRS0RCcERhSFZ1WjJoM1lTQlVaV3hsWTI5dElFTnZMaXdnVEhSa0xqRXEKTUNnR0ExVUVDd3doWlZCTFNTQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUE0U1VQN28zYmlETjFaODJ0SDMwNlRtMmQweThVODJOMHl3RWhhamZxaEZBSFN5WmJDVU5zCklaNXF5TlVEOVdCcGo4endJdVFmNS9kcUlqRzNMQlh5NFA0QWFrUC9oMlhHdFJyQnAweHRJbkFoaWpIeWwzU0pDUkltSEo3SzJSS2kKbFR6YTZXZS9DS0JrNDlaQ3QwWHZsL1QyOWRlMVNoVUNXSDJZV0V0Z3ZNM1hEWm9UTTFQUllmbDYxZGQ0czVvejl3Q0d6aDFObERpdgpxT3g0VVhDS1hCQ0RVU0gzRVQwMGhsN2xTTTJYZ1lJMVRCbnNaZlpyeFFXaDdrY1Qxck1oSjVRUUN0a2tPN3ErUkJOR01EK1hQTmpYCjEycnVPempqSzlTWERya2I1d2RKZnpjcStYZDR6MVR0VzBhZG80QU9rVVBCMWx0ZkZMcWZwbzBrUjBCWnYzSTRzalpzTi8rWjBWME8KV1FxcmFmZkFzZ1JGZWxRQXJyNVQ5clhuNGZnOG96SFNxZjRoVW1URnBtZndkUWNHbEJTQlZjWW41QUdQRjhGcWNkZStTL3VVV0gxKwpFVE94UXZkaWJCald6d2xvUG45czloNlBZcTJsWTlzSnB4OGlRa0VlYjVtS1B0ZjVQMEI2ZWJDbEFaTFNuVDBJRmFVUUFTMnpNbmFvCmxRMnplcHI3QnhCNEVXL2hqOGU2RHlVYWRDcmxISmhCbWQ4aGgraVZCbW9LczJwSGRtWDJPcytQWWhjWmV3b296UnJTZ3g0aHh5eS8KdnY5aGFMZG5HN3Q0VFkzT1orWGt3WTYzSTJiaW5aQjFOSmlwTml1S21wUzVuZXpNaXJINEpZbGNXcll2akI5dGVTU25VbWpEaERYaQpabzFqRGlWTjFSbXk1bmszcHlLZFZERUNBd0VBQWFOcU1HZ3dIUVlEVlIwT0JCWUVGQjRNOTdabjh1R1NKZ2xGd0ZVNUxuYy9Ra3FpCk1Bd0dBMVVkRXdRRk1BTUJBZjh3T1FZRVp5b0hBQVF4TUM4d0xRSUJBREFKQmdVckRnTUNHZ1VBTUFjR0JXY3FBd0FBQkJSRnNNTEgKQ2xaODdsdDRESlg1R0ZQQnBoellFREFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBQ2JPRFUxa0JQcFZKdWZHQnV2bDJJQ08xSjJCMAoxR3FaTkY1c0FGUFpuL0ttc1NRSFJHb3F4cVdPZUJMb1I5bFlHeE1xWG5tYm53b3FaNllsUHdacFZuUERpbVpJK3ltQlYzUUd5cHpxCktPZzRaeVlyOGRXMVAyV1QrRFpkam8yTlFDQ0hHZXJ2SjhBOXREa1BKWHRvVUhSVm5BeFpmVm85UVpRbFVnamdSeXdWTVJuVnZ3ZFYKeHJzU3RaZjBYNE9GdW5IQjJXeUJFWFlLQ3JDL2dwZjM2ajM2K3V3dHFTaVVPMWJkMGxFdXJzQzlDQldNZDFJMGx0YWJyTk1kam1FUApOWHVicmpscEMySmdRQ0EyajYvN051NHRDRW9kdUwrYlhQanFwUnVnYzZiWStHN2dNd1JmYUtvbmgrM1p3WkNjN2IzamFqV3ZZOStyCkdObTY1dWxLNmxDS0QyR1RIdUl0R2VJd2xEV1NYUTYyQjY4WmdJOUhrRkZMTGszZGhlTFNDbElLRjVyOEdyQlFBdVVCbzJNM0lVeEUKeEp0Um1SRU9jNXdHajFRdXB5aGVSRG1IVmkwM3ZZVkVsT0VNU3l5Y3c1S0ZOR0hMRDdpYlNrTlMvalE2ZmJqcEtkeDJxY2d3K0JSeApnTVllTmtoMElrRmNoNExvR0hHTFFZbEU1MzVZVzZpNGpSUHBwMnpEUisyekdwMWlybzJDNnBTZTNWa1F3NjNkNGszak1kWEg3T2p5CnNQNlNIaFlLR3Z6WjgvZ250c20rSGJSc1pKQi85T1RFVzljM3JrSU8zYVFhYjN5SVZNVVdidUY2YUM3NE9yOE5wRHlKTzNpblRtT0QKQkNFSVo0M3lna25RVy8yeHpRK0RoTlErSUlYM1NqMHJuUDBxQ2dsTjZvSDRFWnc9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmNlcnRTSUdOIFJPT1QgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRE9EQ0NBaUNnQXdJQkFnSUdJQVlGRm5BQ01BMEdDU3FHU0liM0RRRUJCUVVBTURzeEN6QUpCZ05WQkFZVEFsSlBNUkV3RHdZRApWUVFLRXdoalpYSjBVMGxIVGpFWk1CY0dBMVVFQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRBZUZ3MHdOakEzTURReE56SXdNRFJhCkZ3MHpNVEEzTURReE56SXdNRFJhTURzeEN6QUpCZ05WQkFZVEFsSlBNUkV3RHdZRFZRUUtFd2hqWlhKMFUwbEhUakVaTUJjR0ExVUUKQ3hNUVkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTGN6dVg3SQpKVXFPdGR1MEtCdXFWNURvMFNMVFpMclRrK2pVcklaaFFHcGdWMmhVaEUyOGFsUUNCZi9mbTVvcXJsMEhqMHJES0gvdit5djZlZkhICnJmQVFVeVNRaTJiSnFJaXJyMXFqQU9tK3VrYnVXM043TEJlQ2dWNWlMS0VDWmJPOXhTc0Fmc1Q4QXpOWERlM2krczVkUmRZNHpUVzIKc3NIUW5JRktxdVN5QVZ3ZGoxK1p4TEd0MjRnaDY1QUlnb0R6TUtORDVwQ0NybFVvU2UxYjE2a1FPQTcrajB4Ym0wYnFRZld3Q0hURAowSWd6dG56WGROL2NoTkZERG5VNW9TVkFLT3A0eXc0c0xqbWRqSXR1Rmh3dkpvSVE0dU5sbEFvRXdGNzNYVnY0RU9MUXVucEwrOTQzCkFBQWFXeWpqMHB4elBqS0htS0hKVVMvWDNxd3pzMDhDQXdFQUFhTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEIKQWY4RUJBTUNBY1l3SFFZRFZSME9CQllFRk9DTW05c2xTYlB4ZkliV3NrS0hDOUJyb05ua01BMEdDU3FHU0liM0RRRUJCUVVBQTRJQgpBUUErMGh5SkxqWDgrSFhkNW45bGlQUnlUTWtzMXpKTzg5MFplVWU5amp0Ymt3OVFTU1FUYXhRR2N1OEowNkdoNDBDRXllY1lNblE4ClNHNFBuMHZVOXg3VGs0WmtWSmRqY2xEVlZjLzZJSk1Db3B2REk1Tk9GbFYyb0hCNWJjMGhIODh2TGJ3WjQ0Z3grRmthZ1FuSWw2WjAKeDJERVc4eFhqckoxL1JzQ0NkdFpiM0tUYWZjeFFkYUlPTCtIc3IwV2VmbXE1TDZJSmQxaEp5TWN0VEVIQkRhMEdwQzlvSFJ4VUlsdAp2QlRqRDRhdThhcyt4NkFKektOSTBlRGJaT2VTdGMrdmNrTndpL25EaER3VHFuNlNtMWRUay9wd3dwRU9NZm1iWjEzcGxqaGVYN056ClRvZ1ZaOTZlZGhCaUlMNVZhWlZEQURsTjl1NndXazVKUkZSWVgwS0QKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUZUQ0NBdjJnQXdJQkFnSUdTVUVzNUFBUU1BMEdDU3FHU0liM0RRRUJDd1VBTUlHbk1Rc3dDUVlEVlFRR0V3SklWVEVSTUE4RwpBMVVFQnd3SVFuVmtZWEJsYzNReEZUQVRCZ05WQkFvTURFNWxkRXh2WTJzZ1MyWjBMakUzTURVR0ExVUVDd3d1VkdGdXc3cHp3NjEwCmRzT2hibmxyYVdGa3c3TnJJQ2hEWlhKMGFXWnBZMkYwYVc5dUlGTmxjblpwWTJWektURTFNRE1HQTFVRUF3d3NUbVYwVEc5amF5QkIKY21GdWVTQW9RMnhoYzNNZ1IyOXNaQ2tnUnNXUmRHRnV3N3B6dzYxMGRzT2hibmt3SGhjTk1EZ3hNakV4TVRVd09ESXhXaGNOTWpneApNakEyTVRVd09ESXhXakNCcHpFTE1Ba0dBMVVFQmhNQ1NGVXhFVEFQQmdOVkJBY01DRUoxWkdGd1pYTjBNUlV3RXdZRFZRUUtEQXhPClpYUk1iMk5ySUV0bWRDNHhOekExQmdOVkJBc01MbFJoYnNPNmM4T3RkSGJEb1c1NWEybGhaTU96YXlBb1EyVnlkR2xtYVdOaGRHbHYKYmlCVFpYSjJhV05sY3lreE5UQXpCZ05WQkFNTUxFNWxkRXh2WTJzZ1FYSmhibmtnS0VOc1lYTnpJRWR2YkdRcElFYkZrWFJoYnNPNgpjOE90ZEhiRG9XNTVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXhDUmVjNzVMYlJURG9mVGpsNUJ1CjBqQkZIanp1WjlsazRCcUtmOG93eW9QaklNSGo5RHJUbEY4YWZGdHR2ekJQaENmMm54OUp2TWFaQ3BEeUQvVi9RNFEzWTFHTGVxVncKL0hwWXpZNmI3Y05HYklSd1hkcnpBWkFqL0U0d3FYN2hKMlBuN1dROG9MakpNMlArRnBEL3NMajkxNmpBd0pSREM3YlZXYWFlVnRBawpIM0I1cjlzNVZBMWxkZGtWUVpRQnIxN3M5bzN4LzYxay9pQ2ExMXpyL3FZZkNHU2ppM1pWclI0N0tHQXVoeVhvcXE4ZnhtUkdJTGR3CmZ6emVTTnVXVTdjNWQrUWE0c2NXaEhhWFd5KzdHUldGK0dtRjlabW5xZkkwcDZtMnBnUDhiNFk5Vkh4MkJKdHIrVUJkQURUSExwbDEKbmVXSUE2cE4rQVBTUW5iQUd3SURBS2lMbzBVd1F6QVNCZ05WSFJNQkFmOEVDREFHQVFIL0FnRUVNQTRHQTFVZER3RUIvd1FFQXdJQgpCakFkQmdOVkhRNEVGZ1FVelBwbmsvQzJ1TkNsd0I3elUvMk1VOStEMTVZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFLdC83aHdXCnFadzhVUUNnd0JFSUJhZVo1bThCaUZSaGJ2RzVHSzFLcmY2QlFDT1VML3QxZkM4b1MySWtnWUlMOVdIeEhHNjRZVGpyZ2ZwaW9UdGEKWXRPVVpjVGg1bTJDK0M4bGNMSWhKc0Z5VVIrTUxNT0VrTU5hajdyUDlLZGxwZXVZMGZzRnNrWjFGU05xYjRWak1JRHcxWjRmS1J6QwpiTEJRV1YyUVd6dW9EVERQdjMxL3p2R2RnNzNKUm00Z3B2bGhVYm9oTDN1K3BSVmpvZFNWaC9HZXVmT0o4ejJGdUxqYnZyVzVLZm5hCk53VUFTWlFEaEVUbnYwTXh6M1dMSmRIMHBtVDFrdmFyQmVzOTZhVUxObUxhekFaZk5vdTJYakc0S3Z0ZTluSGZSQ2FleE9ZTmtiUXUKZFpXQVVXcExNS2F3WXFHVDhadll6c1JqZFQ5WlI3RT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQSAyMDA5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRUNqQ0NBdktnQXdJQkFnSUpBTUorUXdST1J6OFpNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRFZRUUdFd0pJVlRFUgpNQThHQTFVRUJ3d0lRblZrWVhCbGMzUXhGakFVQmdOVkJBb01EVTFwWTNKdmMyVmpJRXgwWkM0eEp6QWxCZ05WQkFNTUhrMXBZM0p2CmMyVmpJR1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF3T1RFZk1CMEdDU3FHU0liM0RRRUpBUllRYVc1bWIwQmxMWE42YVdkdWJ5NW8KZFRBZUZ3MHdPVEEyTVRZeE1UTXdNVGhhRncweU9URXlNekF4TVRNd01UaGFNSUdDTVFzd0NRWURWUVFHRXdKSVZURVJNQThHQTFVRQpCd3dJUW5Wa1lYQmxjM1F4RmpBVUJnTlZCQW9NRFUxcFkzSnZjMlZqSUV4MFpDNHhKekFsQmdOVkJBTU1IazFwWTNKdmMyVmpJR1V0ClUzcHBaMjV2SUZKdmIzUWdRMEVnTWpBd09URWZNQjBHQ1NxR1NJYjNEUUVKQVJZUWFXNW1iMEJsTFhONmFXZHVieTVvZFRDQ0FTSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQU9uNGovTmpyZHFHMktmZ1F2dlBrZDZtSnZpWnBXTndyWnV1eWpOQQpmVzJXYnFFT1JPN2hFNTJVUWxLYXZYV0ZkQ3lvRGgyVHRoaTNqQ3lvei90Y2NibmE3UDdvZm8va0x4MnlxSFdIMkxlaDVUdlBtVXBHCjBJTVpmY0NoRWh5VmJVcjAyTWVsVFRNdWhUbEFkWDRVZklBU21GREhRV2U0b0lCaFZLWnNUaC9nblE0SDZjbTZNK2Yrd0ZVb0xBS0EKcHhuMW50eFZVd09YZXdkSS81bjdONG9reEZuTVVCQmpqcXFwR3JDRUdvYjVYN3V4VUc2azBRck0xWEYrSDZjYmZQVlRiaUpmeXl2bQoxSHhkcnRiQ3hremxCUUhaN1ZmOHdTTjUvUHJJSklPVjg3VnFVUUhRZDlicEVxSDVHb1A3Z2h1NXNKZjBkZ1l6UTBtZy93dTErclVDCkF3RUFBYU9CZ0RCK01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJUTEQ4YmYKUWtQTVBjdTFTQ09oR25xbUtyczBhREFmQmdOVkhTTUVHREFXZ0JUTEQ4YmZRa1BNUGN1MVNDT2hHbnFtS3JzMGFEQWJCZ05WSFJFRQpGREFTZ1JCcGJtWnZRR1V0YzNwcFoyNXZMbWgxTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFESjBRNWVMdFhNczN3K3kvdzkvdzBvCmxaTUV5TC9helhtNFE1RHdwTDd2OHU4aG1MelUxRjBHOXU1QzdEQnNvS3FweXZHdml2by9DM05xUHVvdVFINGZybFJoZWVzdUNEZlgKSS9PTW43NGRzZUdrZGR1ZzRsUVVzYm9jS2FRWTloSzZvaFFVNHpFMXlFRC90K0FGZGxmQkhGbnkrTC9rN1NWaVhJVHdmbjRmczc3NQp0eUVSekFNQlZuQ25FSkllR3pTQkhxMmNHc01FUE8wQ1lkWWVCdk5mT29meUsvRkZoK1U5ck5ISFY0UzlhNjdjMlBtMkcySndDejAyCnlVTHlNdGQ2WWViUzJ6M1B5S25KbTl6YldFVFhieml2ZjNqVG82MGFkYm9jd1RaOGp4NXRITU4xUnE0MUJhYjJYRDBoN2xid3lZSWkKTFhwVXEzRERmU0psZ25DVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFh6Q0NBa2VnQXdJQkFnSUxCQUFBQUFBQklWaFRDS0l3RFFZSktvWklodmNOQVFFTEJRQXdUREVnTUI0R0ExVUVDeE1YUjJ4dgpZbUZzVTJsbmJpQlNiMjkwSUVOQklDMGdVak14RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHNiMkpoCmJGTnBaMjR3SGhjTk1Ea3dNekU0TVRBd01EQXdXaGNOTWprd016RTRNVEF3TURBd1dqQk1NU0F3SGdZRFZRUUxFeGRIYkc5aVlXeFQKYVdkdUlGSnZiM1FnUTBFZ0xTQlNNekVUTUJFR0ExVUVDaE1LUjJ4dlltRnNVMmxuYmpFVE1CRUdBMVVFQXhNS1IyeHZZbUZzVTJsbgpiakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFNd2xkcEI1Qm5naUZ2WEFnN2FFeWlpZS9RVjJFY1d0CmlITDhSZ0pEeDdLS25RUmZKTXN1UytGZ2drYmhVcXNNZ1Vkd2JOMWswZXYxTEtNUGdqME1LNjZYMTdZVWhoQjV1enNUZ0hlTUNPRkoKMG1waUx4OWUrcFpvMzRrbmxUaWZCdGMreWNzbVdRMXozckRJNlNZT2d4WEc3MXVMMGdSZ3lrbW1LUFpwTy9iTHlDaVI1WjJLWVZjMwpySFFVM0hUZ091NXlMeTZjKzlDN3YvVTlBT0VHTStpQ0s2NVRwam9XYzR6ZFFRNGdPc0MwcDZIcHNrK1FMakpnNlZmTHVRU1NhR2psCk9DWmdkYktmZC8rUkZPK3VJRW44clVBVlNORUNNV0VaWHJpWDc2MTN0MlNhZXI5ZndSUHZtMkw3RFd6Z1ZHa1dxUVBhYnVtRGszRjIKeG1tRmdoY0NBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRQpGSS93UzMrb0xrVWtyazFRK21PYWk5N2kzUnU4TUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCTFFOdkFVS3IreUF6djk1WlVSVW03CmxnQUpRYXl6RTRhR0tBY3p5bXZtZExtNkFDMnVwQXJUOWZIeEQ0cS9jMmRLZzhkRWUzamdyMjVzYndNcGpqTTVSY09PNUxsWGJLcjgKRXBic1U4WXQ1Q1JzdVpSais5eFRhR2RXUG9PNHp6VWh3OGxvL3M3YXdsT3F6SkNLNmZCZFJveVYzWHBZS0JvdkhkN05BRGRCaisxRQpiZGRUS0pkKzgyY0VIaFhYaXBhMDA5NU1KNlJNRzNOemR2UVhtY0lmZWc3akxRaXRDaHdzL3p5clZRNFBrWDQyNjhOWFNiN2hMaTE4CllJdkRRVkVUSTUzTzl6SnJsQUdvbWVjc014ODZPeVhTaGtET095eUdlTWxoTHhTNjd0dFZiOStFN2dVSlRiMG8ySExPMDJKUVpSN3IKa3BlRE1kbXp0Y3BIV0Q5ZgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJemVucGUuY29tCj09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY4VENDQTltZ0F3SUJBZ0lRQUxDM1doWklYNy9oeS9XTDF4bm1mVEFOQmdrcWhraUc5dzBCQVFzRkFEQTRNUXN3Q1FZRFZRUUcKRXdKRlV6RVVNQklHQTFVRUNnd0xTVnBGVGxCRklGTXVRUzR4RXpBUkJnTlZCQU1NQ2tsNlpXNXdaUzVqYjIwd0hoY05NRGN4TWpFegpNVE13T0RJNFdoY05NemN4TWpFek1EZ3lOekkxV2pBNE1Rc3dDUVlEVlFRR0V3SkZVekVVTUJJR0ExVUVDZ3dMU1ZwRlRsQkZJRk11ClFTNHhFekFSQmdOVkJBTU1Da2w2Wlc1d1pTNWpiMjB3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRREoKMDNyS0R4NnNwNGJvRm1WcXNjSWJSVEp4bGRuK0VGdk1yK2VsZVFHUGljUEs4bFZ4OTNlK2Q1VHpjcVFzUk5pZWtwc1VPcUhuSkpBSwpDbGFPeGRnbWxPSFpTT0V0UHRvS2N0MmptUlhhZ2FLSDlIdHVKbmVKV0szVzZ3eXlRWHB6Ym0zYmVuaEI2UWlJRW42SExtWVJZMnhVCit6eWRjc0M4THYvQ3Q5ME5kdU02MS9lMGFMNmk5ZU9CYnNGR2IxMk40RTNHVkZXSkdqTXhDckZYdWFPS21NUHNPelRGbFVGcGZuWEMKUENERllicFJSNkFna0pPaGtFdnpUbnlGUlZTYTBRVW1RYkMxVFIwenZzUUR5Q1Y4d1hEYk8vUUpMVlFuU0t3djRjU3NQc2pMa2t4VApPVGNqN05NQitlQUpSRTFOWk1EaERWcUhJcnl0RzZQK0pyVVY4NmY4aEJucDdLR0l0RVJwaElQemlkRjBCcW5NQzliQzNpZUZVQ2JLCkY3akplb2RXTEJvQkhteStFNjBRckxVazlUaVJvZFpMMnZHNzB0NUh0Zkc4Z2ZaWmE4OFpVK21ORmN0S3k2bHZST1ViUWMvaGhxZksKMEdxZnZFeU5Cak5hb29YbGtEV2dZbHdXVHZEam92b0RHclFzY2JOWUxONTdDOXNhRCt2ZUlSOEdkd1lEc01udm1mekF1VThMaGlqKwowcm5xNDlxbHcwZHBFdURiOFBZWmkrMTdjTmNDMXUySEdDZ3NCQ1JNZCtSSWlockdPNXJVRDhyNmRkSUJRRnFOZWIrTHowdlBxaGJCCmxlU3RUSW8rRjVIVXNXTGxndVdBQktRRGZvMi8ybitpRDVkUEROTU4rOWZSNVhKK0hNaDMvMXVhRDdldUJVYmw4YWdXN0Vla0Z3SUQKQVFBQm80SDJNSUh6TUlHd0JnTlZIUkVFZ2Fnd2dhV0JEMmx1Wm05QWFYcGxibkJsTG1OdmJhU0JrVENCampGSE1FVUdBMVVFQ2d3KwpTVnBGVGxCRklGTXVRUzRnTFNCRFNVWWdRVEF4TXpNM01qWXdMVkpOWlhKakxsWnBkRzl5YVdFdFIyRnpkR1ZwZWlCVU1UQTFOU0JHCk5qSWdVemd4UXpCQkJnTlZCQWtNT2tGMlpHRWdaR1ZzSUUxbFpHbDBaWEp5WVc1bGJ5QkZkRzl5WW1sa1pXRWdNVFFnTFNBd01UQXgKTUNCV2FYUnZjbWxoTFVkaGMzUmxhWG93RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwTwpCQllFRkIwY1pRNm84aVY3dEpIUDVMR3g1cjFWZEd3Rk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQjRwZ3dXU3A5TWlEckF5dzZsCkZuMmZ1VWhmR0k4TllqYjJ6Umxyckt2VjlwRjlybkh6UDdNT2VJV2JsYVFuSVVkQ1NueElPdlZGZkxNTWpsRjRySlVUM3NiOWZiZ2EKa0V5cmtnUEg3VUlCemcvWXNmcWlrdUZnYmE1NmF3bXF4aW51YUVsbk1JQWtlakVXT1Z0KzhSd3UzV3dKcmZJeHdZSk91YnY1dnI4cQpoVC9BUUtNNldmeFpTendvSk51MEZYV3VEWWk2TG5QQXZWaUg1VUx5NjE3dUhqQWltY3MzMGNRaGJJSHN2bTBtNWh6a1FpQ2VSN0NzCmcxbHdMRFhXcnpZMHRNMDcrREtvNytONGlmdU5SU3phbkxoK1FCeGg1ejZpa2l4TDhzMzZtTFlwLy9QeWU2a2ZMcUNUVnl2ZWhRUDUKYVRmTG5uaHFCYlRGTVhpSjdIcW5oZUc1ZXp6ZXZoNTVoTTZmY0E1WndqVXVrQ294MmVSRmVrR2tMaE9iTkE1bWUwbXJaSmZRUnNONQpuWEpRWTZhWVd3YTlTRzNZT1lOdzZEWHdCZEdxdk9QYnlBTHFmUDJDMnNKYlVqV3VtRHF0dWpXVEk2Y2ZTTjAxUnBpeUVHamtwVEhDCkNsZ3VHWUVReVZCMS9PcGFGczRSMSs3dlVJZ3RZZjgvUW5NRmxFUFZqanhPQVRvWnBSOUdUbmZRWGVXQklpR0gvcFI5aE5pVHJkWm8KUTBpeTIrdHpKT2VSZjFTa3RvQStuYU04VEhMQ1Y4U2cxTXc0Sjg3VkJwNmlTTm5wbjg2Q2NEYVRtanZmbGlIaldiY00ycEUzOFAxWgpXck9aeUdsc1F5WUJOV05nVllrRE9uWFl1a3JaVlAvdTNvRFlMZEU0MVY0dEM1aDlQbXpiL0NhSXh3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEeFRDQ0FxMmdBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURDQmd6RUxNQWtHQTFVRUJoTUNWVk14RURBT0JnTlZCQWdUCkIwRnlhWHB2Ym1FeEV6QVJCZ05WQkFjVENsTmpiM1IwYzJSaGJHVXhHakFZQmdOVkJBb1RFVWR2UkdGa1pIa3VZMjl0TENCSmJtTXUKTVRFd0x3WURWUVFERXloSGJ5QkVZV1JrZVNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNQpNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWU14Q3pBSkJnTlZCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2CmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVJvd0dBWURWUVFLRXhGSGIwUmhaR1I1TG1OdmJTd2dTVzVqTGpFeE1DOEcKQTFVRUF4TW9SMjhnUkdGa1pIa2dVbTl2ZENCRFpYSjBhV1pwWTJGMFpTQkJkWFJvYjNKcGRIa2dMU0JITWpDQ0FTSXdEUVlKS29aSQpodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCQUw5eFlnangrbGswOXh2SkdLUDNnRWxZNlNLREU2YkZJRU1CTzRUeDVvVkpueWZxCjlvUWJUcUMwMjNDWXh6SUJzUVUrQjA3dTlQcFBMMWt3SXVlckdWWnI0b0FIL1BNV2RZQTVVWHZsK1RXMmRFNnBqWUlUNUxZL3FRT0QKK3FLK2loVnFmOTRMdzdZWkZBWEs2c09vQkpRN1Jud3lEZk1BWmlMSWpXbHROb3dSR0xmVHNoeGd0RGo2QW96TzA5MUdCOTRLUHV0ZApmTWg4KzdBclU2U1NZbWxSSlFWaEdrU0JqQ3lwUTVZajM2dzZnWm9PS2NVY3FlbGRIcmFlbmpBS09jN3hpSUQ3UzEzTU11eUZZa01sCk5BSldKd0dSdER0d0tqOXVzZWljaUFGOW45VDUyMU50WUoyL0xPZFlxN2hmUnZ6T3hCc0RQQW5yU1RGY2FVYXo0RWNDQXdFQUFhTkMKTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME9CQllFRkRxYWhRY1FaeWkyNy9hOQpCVUZ1SU1HVTJnL2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUNaMjExNTFmbVhXV2NEWWZGK093WXhkUzJoSUk1UFpZZTA5NmFjCnZOanBMOURiV3U3UGRJeHp0RGhDMmdWNytBSjF1UDJsc2RldTl0ZmVFOHRURUg2S1J0R1grcmN1S3hHcmtMQW5nUG5vbjFycE41K3IKNU45c3M0VVhuVDNaSkU5NWtUWFdYd1RyZ0lPcm1nSXR0UkQwMkpESEJITkE3WElsb0ttZjdKNnJhQktaVjhhUEVqb0pwTDFFL1FZVgpOOEdiNURLajdUam8yR1R6TEg0VS9BTHFuODMvQjJnWDJ5S1FPQzE2amRGVThXbmpYelBLZWoxN0N1UEtmMTg1NWVKMXVzVjJHRFBPCkxQQXZUSzMzc2VmT1Q2akVtMHBVQnNWL2ZkVUlEK0ljL240WHVLeGU5dFFXc2tNSkRFMzJwMnUwbVlSbHlucUk0dUpFdmx6MzZoejEKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU3RhcmZpZWxkIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0gRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQzVENDQXNXZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCanpFTE1Ba0dBMVVFQmhNQ1ZWTXhFREFPQmdOVkJBZ1QKQjBGeWFYcHZibUV4RXpBUkJnTlZCQWNUQ2xOamIzUjBjMlJoYkdVeEpUQWpCZ05WQkFvVEhGTjBZWEptYVdWc1pDQlVaV05vYm05cwpiMmRwWlhNc0lFbHVZeTR4TWpBd0JnTlZCQU1US1ZOMFlYSm1hV1ZzWkNCU2IyOTBJRU5sY25ScFptbGpZWFJsSUVGMWRHaHZjbWwwCmVTQXRJRWN5TUI0WERUQTVNRGt3TVRBd01EQXdNRm9YRFRNM01USXpNVEl6TlRrMU9Wb3dnWTh4Q3pBSkJnTlZCQVlUQWxWVE1SQXcKRGdZRFZRUUlFd2RCY21sNmIyNWhNUk13RVFZRFZRUUhFd3BUWTI5MGRITmtZV3hsTVNVd0l3WURWUVFLRXh4VGRHRnlabWxsYkdRZwpWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNVEl3TUFZRFZRUURFeWxUZEdGeVptbGxiR1FnVW05dmRDQkRaWEowYVdacFkyRjBaU0JCCmRYUm9iM0pwZEhrZ0xTQkhNakNDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DZ2dFQkFMM3R3UVA4OW8vOEFyRnYKVzU5STJaMTU0cUszQTJGV0dNTkh0dGZLUFRVdWlVUDNvV21iM29vYS9STWduTFJKZHpJcFZ2MjU3SXpkSXZweTNDZGhsKzcyV29UcwpiaG01aVN6Y2hGdlZkUHRyWDhXSnBSQlNpVVpWOUxoMUhPWi81RlN1Uy9oVmNsY0NHZmdYY1ZuckhpZ0hkTVdkU0w1c3RQU2tzUE5rCk4zbVN3T3hHWG4vaGJWTk1ZcS9OSHd0anV6cWQrL3g1QUpoaGRNOG1na0JqODdKeWFoa05tY3JVRG5YTU4vdUxpY0ZaOFdKL1g3TmYKWlRENHA3ZE5kbG9lZGw0MHdPaVdWcG1Lcy9CL3BNMjkzREl4ZkpIUDRGOFIrR3VxU1Z6Um1aVFJvdU5qV3dsMnRWWmk0VXQwSFpiVQpKdFFJQkZuUW1BNE81dDc4dyt3ZmtQRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdIUVlEVlIwT0JCWUVGSHdNTWgrbjJUQi94SDFvbzJLb29jNnJCMXNuTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBUldmb2wKVHdOdmxKazdtaCtDaFRuVWRnV1VYdUVvazIxaVhRbkNvS2pVc0hVNDhUUnFuZVNmaW9ZbVVlWXMwY1l0YnBVZ1NwSUI3TGlLWjNzeAo0bWN1akpVREppNURuVW94OWc2MURMdTM0amQvSXJvQW93NTdVdnRydXp2RTAzbFJUczJROUdjSEdjZzhSbm9OQVgzRldPZHQ1b1V3CkY1b2t4QkRnQlBmZzhuL1VxZ3IvUWgwMzdaVGxaRmtTSUhjNDB6SStPSUYxbG5QNmFJK3h5ODRmeGV6Nm5IN1Bmckh4QnkyMi9ML0sKcEwvUWx3Vkt2T29ZS0FLUXZWUjRDU0Z4MDlGOUhka1dzS2xoUGRBS0FDTDh4M3ZMQ1dSRkN6dEFnZmQ5ZkRMMW1NcFlqbjBxN3BCWgpjMlQ1Tm5SZUphSDFaZ1V1ZnprVnFTcjdVSXVPaFduMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTdGFyZmllbGQgU2VydmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRDd6Q0NBdGVnQXdJQkFnSUJBREFOQmdrcWhraUc5dzBCQVFzRkFEQ0JtREVMTUFrR0ExVUVCaE1DVlZNeEVEQU9CZ05WQkFnVApCMEZ5YVhwdmJtRXhFekFSQmdOVkJBY1RDbE5qYjNSMGMyUmhiR1V4SlRBakJnTlZCQW9USEZOMFlYSm1hV1ZzWkNCVVpXTm9ibTlzCmIyZHBaWE1zSUVsdVl5NHhPekE1QmdOVkJBTVRNbE4wWVhKbWFXVnNaQ0JUWlhKMmFXTmxjeUJTYjI5MElFTmxjblJwWm1sallYUmwKSUVGMWRHaHZjbWwwZVNBdElFY3lNQjRYRFRBNU1Ea3dNVEF3TURBd01Gb1hEVE0zTVRJek1USXpOVGsxT1Zvd2daZ3hDekFKQmdOVgpCQVlUQWxWVE1SQXdEZ1lEVlFRSUV3ZEJjbWw2YjI1aE1STXdFUVlEVlFRSEV3cFRZMjkwZEhOa1lXeGxNU1V3SXdZRFZRUUtFeHhUCmRHRnlabWxsYkdRZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdU1Uc3dPUVlEVlFRREV6SlRkR0Z5Wm1sbGJHUWdVMlZ5ZG1salpYTWcKVW05dmRDQkRaWEowYVdacFkyRjBaU0JCZFhSb2IzSnBkSGtnTFNCSE1qQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQwpBUW9DZ2dFQkFOVU1Pc1FxK1U3aTliNFpsMStPaUZPeEh6L0x6NThnRTIwcE9zZ1BmVHozYTNZNFk5azJZS2liWGx3QWdMSXZXWC8yCmgva2xRNGJuYVJ0U21wRGhjZVBZTFExT2IvYklTZG0yOHhwV3JpdTJkQlRyei9zbTR4cTZIWll1YWp0WWxJbEhWdjhsb0pOd1U0UGEKaEhRVXcyZWVCR2c2MzQ1QVdoMUtUczlEa1R2blZ0WUFjTXRTN250OXJqcm52REg1UmZiQ1lNOFRXUUlyZ013MFI5KzUzcEJsYlFMUApMSkdtcHVmZWhSaEpmR1pPb3pwdHFiWHVOQzY2RFFPNE05OUg2N0ZyalNYWm04NkIwVVZHTXBad2g5NENEa2xEaGJac2M3dGs2bUZCCnJNblVWTitITDhjaXNpYk1uMWxVYUovOHZpb3Z4RlVjZFVCZ0Y0VUNWVG1MZndVQ0F3RUFBYU5DTUVBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZKeGZBTitxQWRjd0t6aUlvcmh0U3B6eUVaR0RNQTBHQ1NxRwpTSWIzRFFFQkN3VUFBNElCQVFCTE5xYUVkMm5kT3htZlp5TUlidzVoeWYyRTNGL1lOb0hOMkJ0QkxaOWczY2NhYU5uUmJvYmhpQ1BQCkU5NUR6K0kwc3dTZEh5blZ2L2hleU5YQnZlNlNiekowOHBHQ0w3MkNRbnF0S3JjZ2ZVMjhlbFVTd2hYcXZmZHFsUzVzZEovUEhMVHkKeFFHamhkQnlQcTF6cXd1YmRReHRSYmVPbEt5V043V2cwSThWUnc3ajZJUGRqLzN2UVFGM3pDZXBZb1V6OGpjSTczSFBkd2JleUJrZAppRURQZlVZZC94N0g0YzcvSTl2RytvMVZUcWtDNTBjUlJqNzAvYjE3S1NhN3FXRmlOeWkyTFNyMkVJWmt5WENuMHEyM0tYQjU2anphCll5V2YvV2kzTU94dyszV0t0MjFnWjdJZXlMbnAyS2h2QW90bkRVMG1WM0hhSVB6QlNsQ05zU2k2Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IENvbW1lcmNpYWwKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlkM2NHSnlhcHNYd3dEUVlKS29aSWh2Y05BUUVMQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01CNFhEVEV3Ck1ERXlPVEUwTURZd05sb1hEVE13TVRJek1URTBNRFl3Tmxvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCRGIyMXRaWEpqYVdGc01JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQTlodFBad2Nyb1JYMUJpTExId0d5NDNORkJrUkpMTHRKSlJUV3pzTzNxeXhQeGtFeWxGZjZFcWRiCkR1S1BIeDZHR2FlcXRTMjVYdzJLd3ErRk5Ya3lMYnNjWWpmeXNWdEtQY3JOY1YvcFFyNlU2TWplK1NKSVpNYmxxOFlyYmEwRjhQclYKQzgrYTVmQlFwSXM3UjZValczcDYrRE0vdU8rWmwrTWd3ZFlvaWMrVSs3bEY3ZU5BRnhIVWRQQUxNZUlySm1xYlRGZXVyQ0ErdWtWNgpCZk85bTJrVnJuMU9JR1BFTlhZNkJ3TEpOLzNIUis3bzhYWWRjeFh5bDZTMXlIcDUyVUtxSzM5Yy9zNG1UNk5tZ1RXdlJMcFVIaHd3Ck1tV2Q1anlUWGxCT2V1TTYxRzdNR3Z2NTBqZXVKQ3FyVndNaUtBMUpkWCszS05wMXY0N2ozQTU1TVFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVuWlBHVTR0ZXlxOC9ueDRQNVptVnZDVDJsSTh3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUZpczlBUU96Y0FOL3dyOTFMb1dYeW05ZTJpWldFblN0QjAzVFg4bmZVWUdYVVBHCmhpNCtjN0ltZlUrVHFiYkVLcHFySVpjVXNkNk0wNnVKRmRockpOVHhGcTdZcEZ6VWYxR083UmdCc1pOanZiejRZWUNhbnJIT1FuRGkKcVgwR0pYMG5vZjV2N0xNZUpOcmpTMVVhQURzMXREdloxMTB3L1lFVGlmTENCaXZ0WjhTT3lVT3lYR3NWaVFLOFl2eE84clV6cXJKdgowd3FpVU9QMk8rZ3VSTUxiWmppcE0xWkk4VzBiTTQwTmpEOWdONTNUeW0xK05INE5uM0oyaXh1ZmN2MVNOVUZGQXBZdkhMS2FjMGtoCnNVbEhSVWUwNzJvMEVjbE5tc3hadDlZQ25scE9aYldVcmh2ZktiQVc4YjhBbmdjNkYyUzFCTFVqSVprS2xUdVhmTzg9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IE5ldHdvcmtpbmcKPT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFREQ0NBalNnQXdJQkFnSUlmRThFT1J6VW1TMHdEUVlKS29aSWh2Y05BUUVGQlFBd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1CNFhEVEV3Ck1ERXlPVEUwTURneU5Gb1hEVE13TVRJek1URTBNRGd5TkZvd1JERUxNQWtHQTFVRUJoTUNWVk14RkRBU0JnTlZCQW9NQzBGbVptbHkKYlZSeWRYTjBNUjh3SFFZRFZRUUREQlpCWm1acGNtMVVjblZ6ZENCT1pYUjNiM0pyYVc1bk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRgpBQU9DQVE4QU1JSUJDZ0tDQVFFQXRJVE1NeGN1YTVSc2EyRlNvT3VqejNtVVRPV1VnSm5MVldSRVpZOW5aT0lHNDF3M1NmWXZtNFNFCkhpM3lZSjB3VHN5RWhlSXN6eDZlL2phck0zYzFSTmcxbGhvOU51aDZEdGpWUjZGcWFZdlovTHM2cm5sYTFmVFdjYnVha0NOcm1yZUkKZEljTUhsKzVuaTM2cTFNcjNMdDJQcE5NQ0FpTUhxSWpITlJxclNLNm1RRXViV1hMdmlSbVZTUkxRRVN4RzlmaHdvWEEzaEEvUGUyNAovUEh4STFQY3YyV1hiOW41UUhHTmZiMlYxTTYrb0Y0bkk5NzlwdEFtRGdBcDZ6eEc4RDFndno5UTB0d21RVkdlRkRkQ0JLTndWNmdiCmgrMHQrbnZ1akFyanFXYUpHY3RCK2QxRU5tSFA0bmRHeUgzMjlKS0JOdjNiTlBGeWZ2TU1GcjIwRlFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVVCeC9TNTV6YXdtNmlRTFN3ZWxBUVVIVEV5TDB3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQwpBUVl3RFFZSktvWklodmNOQVFFRkJRQURnZ0VCQUlsWHNoWjZxTUw5MXRtYm16VENuTFF5RkUybnBOL3N2cWUrK0VQYmtUZk90REl1ClVGVWFOVTUyUTNFZzc1TjNUaFZ3TG9mRHdSMXQzTXUxSjlRc1Z0RlNVenBFMG5QSXhCc0ZaVnBpa3B6dVFZMHgyK2MwNmxraDFRRjYKMTJTNFpEbk55ZTJ2N1VzRFNLZWdtUUdBM0dXak5xNWxXVWhQZ2t2SVpmRlhIZVZaTGdvL2JOalI5ZVVKdEd4VUFBcmdGVTJIZFcyMwpXSlphM1czU0FLRDBtMGkrd3pla3VqYmdmSWVGbHhvVm90NHVvbHU5cnhqNWtGRE5jRm40SjJkSHk4ZWdCenA5MFN4ZGJCazZaclY5Ci9aRnZnckcrQ0pQYkZFZnhvamZIUlo0OHgzZXZaS2lUMy9acGc0Smc4a2xDTk8xYUFGU0ZIQlkya2d4YytxYXR2OXM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFmZmlybVRydXN0IFByZW1pdW0KPT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSUliWXdVUnJHbUN1NHdEUVlKS29aSWh2Y05BUUVNQlFBd1FURUxNQWtHQTFVRUJoTUNWVk14RkRBUwpCZ05WQkFvTUMwRm1abWx5YlZSeWRYTjBNUnd3R2dZRFZRUUREQk5CWm1acGNtMVVjblZ6ZENCUWNtVnRhWFZ0TUI0WERURXdNREV5Ck9URTBNVEF6TmxvWERUUXdNVEl6TVRFME1UQXpObG93UVRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVkJBb01DMEZtWm1seWJWUnkKZFhOME1Sd3dHZ1lEVlFRRERCTkJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4QkxmcVYvK1FkM2Q5WitLNC9hczRUeDRtcnpZOEg5Nm9ETXEzSTBnVzY0dGIrZVQyVFp3YW1qUGpsR2poVnRuCkJLQVFKRzlkS0lMQmwxZllTQ2tUdHVHK2tVM2ZoUXhUR0pvZUpLSlBqL0NpaFF2TDlDbC8wcVJZN2laTnlhcW9lNXJaK2pqZVJGY1YKNWZpTXlObEk0ZzBXSngwZXlJT0ZKYmU2cWxWQnpBTWlTeTJSall2bWlhOW14K24vSytrOHJOclNzOFBoYUp5SitIb0FWdDcwVlpWcworN3BrM1dLTDN3dDNNdXRpekNhYW03dXFZb05NdEFaNk1NZ3B2KzBHVFplNUhNUXhLOVZmdkZNU0Y1eVpWeWxtZDJFaE1RY3VKVW1kCkdQTHU4eXR4akxXNk9RZEpkL3p2THBLUUJZMHRMM2Q3NzBPL05idWEyUGx6cHl6eTBGZnVLRTRtWDQrUWFBa3Z1UGpjQnVrdW1qNVIKcDlFaXhBcW5PRWhzcy9uL2ZhdUdWK082MW9WNGQ3cEQ2a2gvOXRpK0kyMGV2OUUyYkZoYzhlNmtHVlFhOVFQU2R1YmhqTDA4czlOSQpTK0xJK0grU3FIWkduRUpsUHFRZXdRY0RXa1l0dUpmenQ5V3lWU0h2dXR4TUFKZjdGSlVuTTcvb1EwZEcwZ2laRm1BN21uN1M1dTA0CjZ1d0JIanhJVmtrSngwdzNBSjZJRHNCejRXOW02WEpITUQ0UTVRc0R5WnBDQUd6RmxINWh4SXJmZjRJYUMxbkVXVEozczd4Z2FWWTUKL2JRR2V5eldaRGJadlVqdGhCOStwU0tQS3JoQzlJSzMxRk9RZUU0dEd2MkJiMFRYT3dGMGxrTGdBT0l1YStyRjduS3N1Ny8rNnFxbworTnoyc25tS3RtY0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGSjNBWjZZTUl0a205VVdycG1WU0VTZllSYXhqTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUEwR0NTcUdTSWIzRFFFQkRBVUFBNElDQVFDelYwMFFZazQ2NUt6cXVCeXYKTWlQSXMwbGFVWngyS0kxNXFsZEdGOVgxVXZhM1JPZ0lSTDhZaE5JTGdNM0ZFdjBBVlFWaGgwSGN0U1NlUE1UWXlQdHduaTk0bG9NZwpOdDU4RDJrVGlLVjFOcGdJcHNiZnJNN2pXTmEzUHQ2NjgrczBRTmlpZ2ZWNFB5L1ZwZnpab3RSZUJBNFhyZjVCOE9XeWN2cEVnak5DCjZDMVk5MWFNWWorNlFyQ2NERngrTG1VbVhGTlBBTEo0ZnFFTm1TMk51QjJPb3NTdy9XRFFNS1NPeUFSaXFjVHROZDU2bCswT09GNlMKTDVOd3BhbWNiNmQ5RXgxK3hnaElzVjVuNjFFSUplbm1KV3RTS1pHYzBqbHpDRmZlbVFhMFc1MFFCdUhDQUtpNEhFb0NDaFRRd1VISworNHcxSVgyQ09QS3BWSkVaTlpPVWJXbzZ4YkxRdTRtR2sraWJ5UTg2cDNxNG9mQjRSdnI4TnkvbGlvVHozLzRFMmFGb29DOGs0Z21WCkJ0V1Z5dUVrbHV0ODlwTUZ1KzF6NlMzUmRUblg1eVRiMkU1ZlE0K2UwQlE1djFWd1NKbFhNYlNjN2txWUE1WXdIMkFHN2hzai9vRmcKSXhwSFlvV2x6QmswZ0crenJCcmpuL0I3U0szVkFkbG50cWx5aytvdFpyV3l1T1E5UExMdlRJenE2d2UvcXpXYVZZYThHS2ExcUY2MApnMnhyYVVEVG45enh3MmxydWVGdENmVHhxbEIyQ25wOWVoZWhWWlpDbVRFSjNXQVJqUVV3ZnVhT1J0R2RGTnJIRitRRmxvekVKTFViCnp4UUhza0Q0bzU1Qmhyd0UwR3VXeUNxQU5QMi83d2FqM1ZqRmhUMCtqLzZlS2VDMnVBbG9HUndZUXc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQi9qQ0NBWVdnQXdJQkFnSUlkSmNsaXNjL2VsUXdDZ1lJS29aSXpqMEVBd013UlRFTE1Ba0dBMVVFQmhNQ1ZWTXhGREFTQmdOVgpCQW9NQzBGbVptbHliVlJ5ZFhOME1TQXdIZ1lEVlFRRERCZEJabVpwY20xVWNuVnpkQ0JRY21WdGFYVnRJRVZEUXpBZUZ3MHhNREF4Ck1qa3hOREl3TWpSYUZ3MDBNREV5TXpFeE5ESXdNalJhTUVVeEN6QUpCZ05WQkFZVEFsVlRNUlF3RWdZRFZRUUtEQXRCWm1acGNtMVUKY25WemRERWdNQjRHQTFVRUF3d1hRV1ptYVhKdFZISjFjM1FnVUhKbGJXbDFiU0JGUTBNd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQQpJZ05pQUFRTk1GNGJGWjBEMEtGNU5iYzZQSko2eWhVY3pXTHpuQ1pjQnozbFZQcWoxc3dTNnZRVVgraU9HYXN2TGtqbXJCaERlS3pRCk44TzlzczBzNWtmaUd1Wmp1RDB1TDNqRVQ5djBENlJvVEZWeWE1VWRUaGhDbFhqTU56eVI0cHRsS3ltalFqQkFNQjBHQTFVZERnUVcKQkJTYXJ5bDZ3QkUxTlNaUk1BRERhdjVBMWE3V1BEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBSwpCZ2dxaGtqT1BRUURBd05uQURCa0FqQVhDZk9IaUZCYXI4akFRcjlIWC9Wc2FvYmd4Q2QwNURoVDF3Vi9HelRqeGkrenlnazhONTNYCjU3aEc4ZjJoNG5FQ01FSlpoMFBVVWQrNjB3a3lXczZJZmxjOW5GOUNhL1VITGJYd2dwUDVXVyt1WlBwWTVZc2U0Mk8rdFlITmJ3S00KZVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUR1ekNDQXFPZ0F3SUJBZ0lEQkVUQU1BMEdDU3FHU0liM0RRRUJCUVVBTUg0eEN6QUpCZ05WQkFZVEFsQk1NU0l3SUFZRFZRUUsKRXhsVmJtbDZaWFJ2SUZSbFkyaHViMnh2WjJsbGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeWRHbG1hV05oZEdsdgpiaUJCZFhSb2IzSnBkSGt4SWpBZ0JnTlZCQU1UR1VObGNuUjFiU0JVY25WemRHVmtJRTVsZEhkdmNtc2dRMEV3SGhjTk1EZ3hNREl5Ck1USXdOek0zV2hjTk1qa3hNak14TVRJd056TTNXakIrTVFzd0NRWURWUVFHRXdKUVRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlUKWldOb2JtOXNiMmRwWlhNZ1V5NUJMakVuTUNVR0ExVUVDeE1lUTJWeWRIVnRJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpNU0l3SUFZRFZRUURFeGxEWlhKMGRXMGdWSEoxYzNSbFpDQk9aWFIzYjNKcklFTkJNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DCkFROEFNSUlCQ2dLQ0FRRUE0L3Q5bzNLNnd2REpGSWYxYXdGTzRXNUFCN3B0SjExLzkxc3RzMXJIVVYrcnBES21ZWWUyYmcrRzBqQUMKbC9qWGFWZWhHRGxkYW1SNXhnRlpyRHd4U2poODBnVFNTeWpvSUY4N0I2TE1UWFBiODY1UHgxYlZXcWVXaWZyenEyalVJNFpaSjg4SgpKN3lzYm5LREhEQnkzK0NpNmRMaGRIVVp2U3FlZXhWVUJCdlhRem10VlNqRjRocTc5TURrcmpoSk04eDJoWjg1UmRLa252SVNqRkg0CmZPUXRmL1dzWCtzV243RXQwYnJNa1VKM1RDWEprRGh2Mi9ETSs0NGVsMWsrMVdCTzVnVW83VWw1RTB1NlNOc3YrWExUT2NyK0g5ZzAKY3ZXMFFNOHhBY1BzM2hFdEYxMGZ1RkRSWGhtbmFkNEhNeWpLVUpYNXAxVExWSVpRUmFuNVNRSURBUUFCbzBJd1FEQVBCZ05WSFJNQgpBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlFJZHMzTEIvOGs5c1hON2J1UXZPS0VOMFoxOXpBT0JnTlZIUThCQWY4RUJBTUNBUVl3CkRRWUpLb1pJaHZjTkFRRUZCUUFEZ2dFQkFLYW9yU0xPQVQybW8vOWkwRWlkaTE1eXNIaEU0OXdjcnduOUkwajZ2U3JFdVZVRXRSQ2oKalNmZUM0SmowTzdlRERkNVFWc2lzckNhUVZ5bWNPRFUwSGZMSTlNQTRHeFdMK0ZwRFEzWnFyOGhnVkRaQnFXby81VTMwS3IrNHJQMQptUzFGaElybFFnblhkQUl2OTRuWW1lbThKOVJIamJvTlJoeDN6eFNrSExta01jU2NLSFFETlA4ekdTYWw2UTEwdHo2WHhuYm9KNWFqClp0M2hydkpCVzhxWVZvTnpjT1NHR3RJeFFib3Z2aTBUV25adlR1aE9nUTQvV3dNaW9CSytabGdSU3NzRHhMUXFLaTJXRitBNVZMeEkKMDNZbm5ab3RCcWJKN0RuU3E5dWZtZ3NuQWpVcHNVQ1Y1L25vbkZXSUdVYld0elQxZnM0NW10azQ4VkgzVHl3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUV0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZXpDQ0FtT2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURCZk1Rc3dDUVlEVlFRR0V3SlVWekVTTUJBR0ExVUVDZ3dKClZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmgKZEdsdmJpQkJkWFJvYjNKcGRIa3dIaGNOTURnd09ESTRNRGN5TkRNeldoY05NekF4TWpNeE1UVTFPVFU1V2pCZk1Rc3dDUVlEVlFRRwpFd0pVVnpFU01CQUdBMVVFQ2d3SlZFRkpWMEZPTFVOQk1SQXdEZ1lEVlFRTERBZFNiMjkwSUVOQk1Tb3dLQVlEVlFRRERDRlVWME5CCklGSnZiM1FnUTJWeWRHbG1hV05oZEdsdmJpQkJkWFJvYjNKcGRIa3dnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUsKQW9JQkFRQ3dmbks0cEFPVTVxZmVDVGlSU2hGQWg2ZDhXV1FVZTdVUkVOMyt2OVhBdTFiaWhTWDBOWElQK0ZQUVFlRkVBY0swSE1NeApRaFpIaFRNaWRySUtidy9sSlZCUGhZYSt2NWd1RUdjZXZoRUZoZ1dReEZuUWZIZ1FzSUJjdCtISEszWExmSit1dGRHZEl6ZGpwOXhDCm9pMlNCQnRRd1h1NFBodkpWZ1NMTDFLYnJhbFc2Y0gvcmFsWWh6QzJnZmVYUmZ3WlZ6c3JiK1JIOUpsRi9oM3grSmVqaUIwM0hGeVAKNEhZbG1sRDRvRlQvUkpCMkk5SXl4c09yQnIvOCs3L3pyWDJTWWdKYktkTTFvNU9hUTJSZ1hiTDZNdjg3Qks5TlFHcjV4K1B2SS8xcgp5K1VQaXpnTjdncjgvZytZbnpBeDNXeFNaZm1MZ2I0aTRSeFlBN3FSRzRrSEFnTUJBQUdqUWpCQU1BNEdBMVVkRHdFQi93UUVBd0lCCkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFPRnNtamQ2TFd2SlBlbFNER1JqakNEV211akFOQmdrcWhraUcKOXcwQkFRVUZBQU9DQVFFQVBOVjNQZHJmaWJxSERBaFVhaUJRa3I2d1FUMjVKbVNEQ2kvb1FNQ1hLQ2VDTUVySmsvOXE1NllBZjRsQwptdFlSNVZQT0w4enkyZ1hFL3VKUXhEcUdmY3phZmhBSk81STFLbE95L3VzckJkbHNYZWJRNzlOcVpwNFZLSVY2NklJQXJCNm5DV2xXClF0Tm9VUmkrVkpxL1JFRzZTYjRndW1sYzdyaDN6YzVzSDYyRGxoaDlEclVVT1lUeEtPa3RvNTU3SG5weVdvT3plVy92dFB6UUNxVlkKVDBiZisyMTVXZktFSWxLdUQ4ejdmRHZuYXNwSFljTjYrTk9TQkIrNElJVGhObFFXeDBEZU80cHozTi9HQ1V6ZjdOci8xRk5Db2NueQpZaDBpZ3p5WHhma1pZaWVzWlNMWDB6ekc1WTZ5VTh4Snpyd3cvbnNPTTVENzdkSVVrUjhIcnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEZHpDQ0FsK2dBd0lCQWdJQkFEQU5CZ2txaGtpRzl3MEJBUXNGQURCZE1Rc3dDUVlEVlFRR0V3SktVREVsTUNNR0ExVUVDaE1jClUwVkRUMDBnVkhKMWMzUWdVM2x6ZEdWdGN5QkRUeTRzVEZSRUxqRW5NQ1VHQTFVRUN4TWVVMlZqZFhKcGRIa2dRMjl0YlhWdWFXTmgKZEdsdmJpQlNiMjkwUTBFeU1CNFhEVEE1TURVeU9UQTFNREF6T1ZvWERUSTVNRFV5T1RBMU1EQXpPVm93WFRFTE1Ba0dBMVVFQmhNQwpTbEF4SlRBakJnTlZCQW9USEZORlEwOU5JRlJ5ZFhOMElGTjVjM1JsYlhNZ1EwOHVMRXhVUkM0eEp6QWxCZ05WQkFzVEhsTmxZM1Z5CmFYUjVJRU52YlcxMWJtbGpZWFJwYjI0Z1VtOXZkRU5CTWpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU5BVk9WS3hVck82eFZtQ3hGMVNyanBEWllCTHgvS1d2TnMybDlhbVpJeW9YdkRqQ2h6MzM1YzlTNjcyWGV3aHRVR3J6YmwrZHArKworVDQyTktBN3dmWXhFVVYwa3oxWGdNWDVpWm5LNWF0cTFMWGFRWkFRd2RiV1FvbkN2L1E0RXBWTVZBWDNOdVJGZzNzVVpkYmNERTNSCjNuNE1xenZFRmI0NlZxWmFiM1pwVXFsNnVjanJhcHBkVXRBdENtczFGZ2tRaE5CcXlqb0dBRGRINUg1WFR6K0w2MmU0aUtyRnZsTlYKc3BIRWZibXdoUmtHZUM3YllScjZoZlZLa2FIbkZ0V09vam5mbExod0h5Zy9pL3hBWG1PRFBJTXFHcGxyejk1WmFqdjhieGJYSC8xSwpFT3RPZ2hZNnJDY01VL0d0MVNTd2F3TlF3UzA4RnQxRU5DY2FkZnNDQXdFQUFhTkNNRUF3SFFZRFZSME9CQllFRkFxRnFYZGxCWmg4ClFJSDRENWNzT1BFSzdEelBNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUJNT3FORXJMbEZzY2VUZnNnTENrTGZaT29jN2xsc0NMcUpYMnJLU3BXZWVvOEh4ZHBGY29KeERqclN6RytudEtFagp1L1lrbjhzWC9veW16c0xTMjh5Ti9ISDhBeW5CYkYwelgyUzJaVHVKYnhoMmVQWGNva2dmR1QrT2srdngraGZ1elU3akJCSlYxdVhrCjNmcytCWHppSFY3R3A3eVhUMmc2OWVrdUNrTzJyMWRjWW1oOHQvMmppb1NnckdLK0t3bUhOUEJxQWJ1YktWWTgvZ0EzenlOczhVNnEKdG5SR0VteVI3alRWN0pxUjUwUytrREZ5MVVrQzlnTGw5Qi9yZk5tV1Zhbi83SXI1bVVmL05Wb0NxZ1RMaWx1SGNTbVJ2YVMwZWcyOQptdlZYSXdBSElSYy9Tam5SQlVrTHA3WTNnYVZkaktvelhvRW9mS2Q5SitzQXJvMDMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnV6Q0NBNk9nQXdJQkFnSUlWd29SbDBMRTQ4d3dEUVlKS29aSWh2Y05BUUVMQlFBd2F6RUxNQWtHQTFVRUJoTUNTVlF4RGpBTQpCZ05WQkFjTUJVMXBiR0Z1TVNNd0lRWURWUVFLREJwQlkzUmhiR2x6SUZNdWNDNUJMaTh3TXpNMU9EVXlNRGsyTnpFbk1DVUdBMVVFCkF3d2VRV04wWVd4cGN5QkJkWFJvWlc1MGFXTmhkR2x2YmlCU2IyOTBJRU5CTUI0WERURXhNRGt5TWpFeE1qSXdNbG9YRFRNd01Ea3kKTWpFeE1qSXdNbG93YXpFTE1Ba0dBMVVFQmhNQ1NWUXhEakFNQmdOVkJBY01CVTFwYkdGdU1TTXdJUVlEVlFRS0RCcEJZM1JoYkdsegpJRk11Y0M1QkxpOHdNek0xT0RVeU1EazJOekVuTUNVR0ExVUVBd3dlUVdOMFlXeHBjeUJCZFhSb1pXNTBhV05oZEdsdmJpQlNiMjkwCklFTkJNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXA4YkVwU21rTE8vbEdNV3dVS052VVR1ZkNsckoKd2tnNENzSWNvQmgva2JXSHVVQS8zUjFvSHdpRDFTMGVpS0Q0ajFhUGJaa0NrcEFXMVY4SWJJblg0YXk4SU1LeDRJTlJpbWxOQUpaYQpieS9BUkg2akR1U1J6Vmp1M1B2SEhrVkgzU2U1Q0FHZnBpRWQ5VUV0TDB6OUtLM2dpcTBpdEZabGpvWlVqNU5ES2Q0NVJuaWpNQ082CnpmQjlFMWZBWGRLRGEwaE14S3VmZ0ZwYk9yM0pweUkvZ0Njeld3NjNpZ3hkQnpjSXkyelNla2NpUkRYRnpNd3VqdDBxN2JkOVpnMWYKWVZFaVZSdmpSdVBqUGRBMVlwcmJyeFRJVzZITWlSdmhNQ2I4b0pzZmdhZEhId1Ryb3ptU0JwK1owNy9UNms5UW5Cbitsb2NlUEdYMgpveGdrZzRZUTUxUStxRHAySkUrQkljWGpEd0w0azVSSElMdisxQTdUYUxuZHhIcUVndU5UVkhuZDI1elM4Z2ViTHJhOFB1MkZiZThsCkVmS1hHa0poOTBxWDZJdXhFQWY2WllHeW9qblA5enovR1B2RzhWcUxXZUlDckh1UzBFNFVUMWxGOWd4ZUtGK3c2RDlGejgrdm0yLzcKaE5OM1dwVnZySlNFbnU2OHdFcVBTcFA0UkNIaU1VVmhVRTRRMk9NMWZFd1p0TjRGdjZNR244aTF6ZVFmMXhjR0RYcVZkRlVOYUJyOApFQnRpWkoxdDRKV2d3NVFIVncwVTVyMEYrN2lmNXQrTDRzYm5mcGIyVThXQU5GQW9XUEFTVUhFWE1Mcm1lR084OUxLdG15dXkvdUU1CmpGNjZDeUNVM251RHVQL2pWbzIzRWVrN2pQS3h3VjJkcEF0TUs5bXlHUFcxbjBzQ0F3RUFBYU5qTUdFd0hRWURWUjBPQkJZRUZGTFkKaURySW4zaG03WW56ZXpod2xNa0NBamJRTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVVV0aUlPc2lmZUdidAppZk43T0hDVXlRSUNOdEF3RGdZRFZSMFBBUUgvQkFRREFnRUdNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUFMZTNLSHdHQ21TVXlJCldPWWRpUGNVWkVpbTJGZ0tEazhUTmQ4MUhkVHRCakhJZ1Q1cTFkMDdHakx1a0QwUjBpNzBqc05qTGlObXNHZStiN2JBRXpsZ3FxSTAKSlpOMVV0Nm5uYTBPaDRsU2NXb1dQQmtkZy9pYUtXVys5RCthMmZEeldvY2hjWUJOeStBNG16KzcrdUF3VGMrRzAyVVFHUmpSbHdLeApLM0pDYUt5Z3ZVNWEyaGkvYTVpQjBQMmF2bDRWU00wUkZibkFLVnkwNklqM1BqYXV0Mkw5SG1MZWNIZ1FIRWhiMnJ5a09McG43VlUrClhsZmYxQU5BVElHazBrOWpwd2xDQ1JUOEFLbkNnSE5QTHNCQTJSRjdTT3A2QXNEVDZ5Z0JKbGgwd2NCekltMlRsZjA1ZmJzcTQvYUMKNHl5WFgwNGZrWlQ2L2l5ajJIWWF1RTJ5T0UrYitoMUlZSGttNHZQOXFkQ2E2SENQU1hyVzViMEtEdHN0ODQyLzYrT2tmY3ZIbFhIbwoycU44eGNMNGRKSUVHNGFzcENKVFFMYXMva3gyei91VU1zQTFuM1kvYnVXUWJxQ21KcUs0TEw3Uks0WDlwMmpJdWdFcnNXeDBIYmh6CmxlZnV0OGNsOEFCTUFMSit0Z3VMSFBQQVVKNGx1ZUFJM2pabS96ZWwwYnRVWkN6Sko3VkxrbjVsLzlNdDRibE92SCtrUVNHUVFYZW0KT1IvcW51T2YwR1p2QmV5cWRuNi9heGFnNjdYSC9KSlVMeXNSSnlVM2VFeFJhckR6ekZoZEZQRnFTQlgvd2dlMnNZMFBqbHhRUnJNOQp2d0dZVDdKWlZFYytOSHQ0YlZhVExuUHFaaWg0elIwVXY2Q1BMeTY0TG83eUZJck02YlY4KzJ5ZERLWGhsZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJ1eXBhc3MgQ2xhc3MgMiBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV1RDQ0EwR2dBd0lCQWdJQkFqQU5CZ2txaGtpRzl3MEJBUXNGQURCT01Rc3dDUVlEVlFRR0V3Sk9UekVkTUJzR0ExVUVDZ3dVClFuVjVjR0Z6Y3lCQlV5MDVPRE14TmpNek1qY3hJREFlQmdOVkJBTU1GMEoxZVhCaGMzTWdRMnhoYzNNZ01pQlNiMjkwSUVOQk1CNFgKRFRFd01UQXlOakE0TXpnd00xb1hEVFF3TVRBeU5qQTRNemd3TTFvd1RqRUxNQWtHQTFVRUJoTUNUazh4SFRBYkJnTlZCQW9NRkVKMQplWEJoYzNNZ1FWTXRPVGd6TVRZek16STNNU0F3SGdZRFZRUUREQmRDZFhsd1lYTnpJRU5zWVhOeklESWdVbTl2ZENCRFFUQ0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFOZkhYdmZCQjlSMyswTWg5UFQxYWVUdU1nSGJvNFlmNUZrTnV1ZDEKZzFMcjZoeGhGVWk3SFFmS2pLNnczSmFkNnNOZ2tvYUNLSE9jVmdiL1MyVHdEQ28zU2JYbHp3eDg3dkZLdTNNd1pmUFZMNE8yZnVQbgo5WjZyWVBuVDhaMlNkSXJrSEphc1c0RHB0ZlF4aDZOUi9NZCtvVytPVTNmVWw4RlZNNUkrR0M5MTFLMkdTY3VWcjFRR2JOZ0dFNDFiCi8rRW1HVm5BSkxxQmNYbVFSRkJvSkpSZnVMTVI4U2xCWWFOQnl5TTIxY0h4TWxBUVRuLzBocFBzaE5PT3ZFdS9YQUZPQnozY0ZJcVUKQ3FUcWMvc0xVZWdUQnhqNkR2RXIwVlFWZlR6aDk3UVpRbWRpWG5mZ29sWHN0dGxwRjlVNnIwVHRTc1dlNUhvbmZPVjExNnJMSmVmZgphd3JiRDAyVFRxaWd6WHN1OGxrQmFyY051QWVCZm9zNEd6am1DbGVaUGU0aDZLUDFEQmJkaSt3MGpwd3FIQUFWRjQxb2c5SndueGdJCnpSRm8xY2xyVXMzRVJvL2N0ZlBZVjNNZTZaUTVCTC9UM2pqZXRGUHNhUnlpZnNTUDVCdHdyZktpK2Z2M0ZtUm1hWjlKVWFMaUZSaG4KQmtwLzFXeTFUYk16NEdIclhiN3BtQTh5MXgxTFBDNWFBVktSQ2ZMZjZvM1lCa0JqcWhIay9zTTNuaFJTUC9UaXpQSmhrOUg5WjJ2WApVcTYvYUt0QVE2QlhOVk40OEZQNFlVSUhaTWJYYjV0TU9BMWpyR0t2Tm91aWN3b045U0c5ZEtwTjZuSURTZHZIWHgxaVk4ZjkzWkhzCk0rNzFiYlJ1TUdqZXlOWW1zSFZlZTdRSElKaWhkaks0VFd4UEFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWUQKVlIwT0JCWUVGTW1BZCtCaWtvTDFScHp6dXZkTXc5NjRvNjA1TUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRgpBQU9DQWdFQVUxOGg5YnF3T2xJNUxKS3diQURKNzg0Zzd3YnlscDdwcEhSL2VoYjh0L1cyK3hVYlA2dW13SEpkRUxGeDdyeFA0NjJzCkEyMHVjUzZ2eE9PdG83ME1FYWUwLzBxeWV4QVFINmRYUWJMQXJ2UXNXZFpIRUlqeklWRXBNTXBnaHE5R3F4M3RPbHV3bE41RTQwRUkKb3NIc0hkYjlUN2JXUjlBVUM4cm15clY3ZDM1QkgxNkR4N2FNT1phd1A1YUJRVzlna09Mbytmc2ljZGw5c3oxR3Y3U0VyNUFjRDQ4UwphcS92N2g1NnJnSktpaGNyZHY2c1ZJa2tMRTgvdHJLblRveW9rWmY3S2NaN1hDMjV5MmEydDZoYkVsR0Z0UWwrWW5ody9xbHFZTFlkCkRua00vY3JxSklCeXc1Yy84bmVyUXlJS3grdTJESVNDTElCclFZb0l3T3VsYTkrWkVzdUsxVjZBREpIZ0pnZzJTTVg2T0JFMS95V0QKTGZKNnY5cjlqdjZseTBVc0g4U0lVNjUzRHRtYWRzV09MQjJqdXRYc01xN0FxcXozMFhwTjY5UUg0a2ozSW82d3BKOXF6bzZ5c21EMApveUxRSSt1VVducHAzUSsvUUZlc2ExbFEyYU9aNFc3K2pRRjVKeU1WM3BLZGV3bE5XdWRMU0RCYUdPWUtiZWFQNE5LNzV0OThiaUdDCndXZzVUYlNZV0daaXpFcVFYc1A2SndTeGVSVjBtY3krclNEZUptQWM2MVpScHFQcTVLTS9wLzloM1BGYVRXd3lJMFB1cktqdTdrb1MKQ1R4ZGNjSytlZnJDaDJnZEMvMWNhY3dHMEpwOVZKa3F5VGthR2E5TEtrUHpZMTFhV09JdjR4M2txZGJRQ3RDZXY5ZUJDZkhKeHlZTgpySmdXVnFBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCdXlwYXNzIENsYXNzIDMgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRldUQ0NBMEdnQXdJQkFnSUJBakFOQmdrcWhraUc5dzBCQVFzRkFEQk9NUXN3Q1FZRFZRUUdFd0pPVHpFZE1Cc0dBMVVFQ2d3VQpRblY1Y0dGemN5QkJVeTA1T0RNeE5qTXpNamN4SURBZUJnTlZCQU1NRjBKMWVYQmhjM01nUTJ4aGMzTWdNeUJTYjI5MElFTkJNQjRYCkRURXdNVEF5TmpBNE1qZzFPRm9YRFRRd01UQXlOakE0TWpnMU9Gb3dUakVMTUFrR0ExVUVCaE1DVGs4eEhUQWJCZ05WQkFvTUZFSjEKZVhCaGMzTWdRVk10T1Rnek1UWXpNekkzTVNBd0hnWURWUVFEREJkQ2RYbHdZWE56SUVOc1lYTnpJRE1nVW05dmRDQkRRVENDQWlJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBS1hhQ3BVV1VPT1Y4bDZkZGpFR01ucWI4UkIydUFDYXRWSTJ6U1JICnNKOFlaTHlhOXZyVmVkaVFZa3dpTDk0NFBkYmdxT2tjTE50NEVlbU9hRkVWY3Nmek00ZmtvRjBMWE9CWEJ5b3c5YzNFTjNjb1RSaVIKNXIvVlV2MXhMWEErNThiRWl1UHdLQXYwZHBpaGk0ZFZzam9UL0xjK0p6ZU9JdU9vVHlydllMczl0em5ERGdGSG1WMFNUOXREK2xlaAo3Zm1kdmhGSEpsc1RtS3RkRm9xd054eFhuVVgvaUpZMnY3dktCM3R2aDJQWDBESnExbDFzRFBHemJqbmlhekV1T1FBbkZONDR3T3daClpvWVM2SjF5RmhOa1VzZXBOeHo5Z2pEdGhCZ2Q5SzVjLzNBVEFPdXg5VE42UzlaVitBV05TMm13OWJNb05sd1V4RkZ6VFdzTDhUUUgKMnhjNTE5d29lMnYxbi9NdXdVOFhLaER6ek1ybzYvMXJxeTZhbnkyQ2JnVFVVZ0dUTFQyRy9INzgzKzlDSGFacjc3a2d4dmU5b0tlVgovYWZtaVNUWXpJdzBiT0lqTDlrU0dpRzVWWkZ2QzVGNUdReXRRSWdMY09KNjBnN1lhRWk3Z2hNNUVGanAyQ29IeGhMYldOdlNPMVVRClJ3VVZaMkorR0dPbVJqOEpEbFF5WHI4Tllub243NERvMjlsTEJsbzNXaVhRQ0JKMzFHOEpVSmM5eUIzRDM0eEZNRmJHMDJTclp2UEEKWHBhY3c4VHZ3M3hyaXpwNWY3Tkp6ejNpaVorZ01FdUZ1WnlVSkhtUGZXdXBSV2dQSzlEeDJoekxhYmpLU1dKdHlOQmpZdDFnRDFpcQpqNkc4QmFWbW9zOGJkcktFWkxGTU9WTEFNTHJ3akVzQ3NMYTNBZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEClZSME9CQllFRkVlNHpmL2xiKzc0c3V3dlRnNzVKYkNPUEd2RE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0YKQUFPQ0FnRUFBQ0FqUVRVRWtNSkFZbUR2NGpWTTF6K3M0alNRdUtGdmR2b1dGcVJJTnl6cGtNTHlQUGdLbjlpQjVidGIyaVVzcEtkVgpjU1F5OXNnTDhyeHErSk9zc2dmQ1g1L2J6TWlLcXI1cWIrRkpFTXd4MTRDN3U4allvZzVrVitxaTljS3BNUlhTSUdycy9DSUJLTStHCnVJQWVxY3dScFR6eUZyTkhuZnpTZ0NIRXk5QkhjRUdoeW9NWkNDeHQ4bDEzbklvVUU5UTJISkx3NVFZMzNLYm1rSnM0ajF4ckcwYUcKUTBKZlBnRUhVMVJkWlgzM2luT2htbFJhSHlsREZDZkNoUSsxaUhzYU81UzNIV0NudFp6bktXbFhXcHVUZWtNd0d3UFhZc2hBcHFyOApaT1JLMTVGVEFhZ2dpRzZjWDBTNXkyQ0JOT3h2MDMzYVNGL3J0SkM4TGFrY0M2d2MxYUpvSUlBRTF2eXhqeSs3U2pFTlNvWWM2K0kyCktTYjEydGpFOG5WaHozNnVkbU5LZWtCbGs0ZjRIb0NNaHVXRzFvOE8vRk1zWU9nV1lScWlQa043elRsZ1ZHcjE4b2ttQVdpRFNLSXoKNk1rRWtiSVJOQkUrNnRCREdSOERrNUFNLzFFOVYvUkJidUhMb0w3cnlXUE5iY3prK0RhcWFKM3R2VjJYY0VRTnRnNDEzT0VNWGJ1ZwpVWlRMZmhickVTK2pra1hJVEhIWnZNbVpVbGRHTDFEUHZUVnA5RDBWemdhbExBOCs5b0c2bEx2RHU3OWxlTktHZWY5Sk94cUREUERlCmVPekk4azFNR3Q2Q0tmakJXdHJ0N3VZblh1aEYwSjBjVWFob3EwVGowSXRxNC9nN3U5eE4xMlR5VWI3bXFxdGE2VEh1QnJ4enZ4TmkKQ3AvSHVaYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVC1UZWxlU2VjIEdsb2JhbFJvb3QgQ2xhc3MgMwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEd3pDQ0FxdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQmdqRUxNQWtHQTFVRUJoTUNSRVV4S3pBcEJnTlZCQW9NCklsUXRVM2x6ZEdWdGN5QkZiblJsY25CeWFYTmxJRk5sY25acFkyVnpJRWR0WWtneEh6QWRCZ05WQkFzTUZsUXRVM2x6ZEdWdGN5QlUKY25WemRDQkRaVzUwWlhJeEpUQWpCZ05WQkFNTUhGUXRWR1ZzWlZObFl5QkhiRzlpWVd4U2IyOTBJRU5zWVhOeklETXdIaGNOTURneApNREF4TVRBeU9UVTJXaGNOTXpNeE1EQXhNak0xT1RVNVdqQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTUlsUXRVM2x6CmRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVY25WemRDQkQKWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJRE13Z2dFaU1BMEdDU3FHU0liMwpEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM5ZFpQd1lpSnZKSzdnZW5hc2ZiM1pKTlc0dC96TjhFTGc2M2lJVmw2Ym1sUWRUUXlLCjl0UFBjUFJTdGRpVEJPTkdobkZCU2l2d0tpeFZBOVpJdytBNU9PM3lYRHcvUkx5VFBXR3JUczBOdnZBZ0oxZ09SSDhFR29lbDE1WVUKTnBEUVNYdWhkZnNhYTNPeCtNNnBDU3p5VTlYREZFUzRocVgyaXlzNTJxTXpWTm42Y2hyM0loVWNpSkZyZjJibHcycUFzQ1R6MzRaRgppUDBaZjNXSEh4K3hHd3B6SkZ1NVplQXNWTWhnMDJZWFArSE1WRE56a1FJNnBuOTdkam1pSDVhMk9LNjF5Sk4wSFo2NXRPVmduUzlXCjBlRHJYbHRNRW5BTWJFUWdxeEhZOUJuMjBweFNOK2Y2dHNJeE8wclVGSm10eHhyMVhWLzZCN2g4RFIvV2d4NnpBZ01CQUFHalFqQkEKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZERnUVdCQlMxQS9kMk8yR0NhaEtxR0ZQcgpBeUdVdi83T3lqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFWajN2bE5XOTJuT3lXTDZ1a0syWUo1ZitBYkd3VWdDNFRlUWJJWFFiCmZzRHVYbWtxSmE5YzFoM2Ewbm5KODVjcDRJYUgzZ1JaRC9GWjFHU0ZTNW12SlFRZXlVYXBsOTZDc2h0d241ejJyM0V4M1hzRnBTelQKdWNwSDlzcnk5dWV0dVVnL3ZCYTN3VzMwNmdtdjdQTzE1d1dlcGg2S1UxSFdrNEhNZEpQMnVkcW1KUVYwZVZwK1FENkNTeVlSTUc3aApQMEhIUndBMTFmWFQ5MVErZ1QzYVNXcWFzKzhRUGVicmI5SElJa2ZMek04Qk1aTFpHT01pdmdrZUdqNWFzdVJyREZSNmZVTk91SW1sCmU5ZWlQWmFHelBJbU5DMXFrcDJhR3RBdzRsMU9CTEJmaXlCK2Q4RTlsWUxSUnBvN1BIaTRiNkhRRFdTaWVCNHBUcFBEcEZRVVd3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRC1UUlVTVCBSb290IENsYXNzIDMgQ0EgMiAyMDA5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRU16Q0NBeHVnQXdJQkFnSURDWVB6TUEwR0NTcUdTSWIzRFFFQkN3VUFNRTB4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRSwpEQXhFTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTUhrUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ01qQXdPVEFlCkZ3MHdPVEV4TURVd09ETTFOVGhhRncweU9URXhNRFV3T0RNMU5UaGFNRTB4Q3pBSkJnTlZCQVlUQWtSRk1SVXdFd1lEVlFRS0RBeEUKTFZSeWRYTjBJRWR0WWtneEp6QWxCZ05WQkFNTUhrUXRWRkpWVTFRZ1VtOXZkQ0JEYkdGemN5QXpJRU5CSURJZ01qQXdPVENDQVNJdwpEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTk95U3M5NlIrOTFteVA2T2kvV1VFV0pOVHJHYTl2KzJ3Qm9xT0FECkVSMDNVQWlmVFVwb2xEV3pVOUdVWTZjZ1ZxL2VVWGpzS2ozelNFaFFQZ3JmUmxXTEoyM0RFRTBOa1ZKRDJJZmdYVTQydFNIS1h6bEEKQkY5YmZzeWp4aXVwUUI3Wk5vVFdTUE9TSGpSR0lDVEJwRkdPU2hydlVEOXBYUmwvUmNQSEFZOVJ5U1BvY3E2MHZGWUpmeExMSExHdgpLWkFLeVZYTUQ5TzBHdTFITlZwSzdaeHpCQ0hRcXIwTUU3VUF5aVpzeEdzTWxGcVZsTnBRbXZIL3BTdG1NYVRKT0tEZkhSKzRDUzd6CnAraG5VcXVWSCtCR1B0aWt3OHBheFRHQTZFaWFuNVJwL2huZDJITjhnY3FXM283dHN6SUZaWVEwNXViOVZ4QzFYM2EvTDdBUURjVUMKQXdFQUFhT0NBUm93Z2dFV01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZQM2FGTVNmTU40aHZSNUNPZnlyWXlOSgo0UEdFTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCMHdZRFZSMGZCSUhMTUlISU1JR0FvSDZnZklaNmJHUmhjRG92TDJScGNtVmpkRzl5CmVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1VtOXZkQ1V5TUVOc1lYTnpKVEl3TXlVeU1FTkJKVEl3TWlVeU1ESXcKTURrc1R6MUVMVlJ5ZFhOMEpUSXdSMjFpU0N4RFBVUkZQMk5sY25ScFptbGpZWFJsY21WMmIyTmhkR2x2Ym14cGMzUXdRNkJCb0QrRwpQV2gwZEhBNkx5OTNkM2N1WkMxMGNuVnpkQzV1WlhRdlkzSnNMMlF0ZEhKMWMzUmZjbTl2ZEY5amJHRnpjMTh6WDJOaFh6SmZNakF3Ck9TNWpjbXd3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUgrWDJ6REkzNlNjZlNGNmdIRE9GQkpwaUJTVllFUUJyTExwTUUrYlVNSm0KMkg2Tk1MVndNZW5pYWNmemNOc2dGWWJRRGZDK3JBRjFoTTUrbjAyL3QyQTduUFBLSGVKZWFOaWpuWmZsUUdEU05pSCswTFM0RjlwMApvMy9VMzdDWUFxeHZhMnNzSlNSeW9XWHVKVnJsNWpMbjh0K3JTZnJ6a0drajJ3VFo1MXhZL0dYVWw3N00vQzRLekNVcU5RVDRZSkVWCmRUMUIveU1mR2NoczY0SlRCS2JrVENKTmpZeTZ6bHR6N0dSVVVHM1JuRlg3YWNNMnc0eThQSVdtYXdvbURlQ1RtR0N1ZnNZa2w0cGgKWDVHT1pwSUpoemJOaTVzdFB2WlIxRkRVV1NpOWcvTE1LSHRUaG0zWUpvaHcxK3FSelQ2NXlzQ1FibHJHWG5SbDExeitvK0k9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVRekNDQXl1Z0F3SUJBZ0lEQ1lQME1BMEdDU3FHU0liM0RRRUJDd1VBTUZBeEN6QUpCZ05WQkFZVEFrUkZNUlV3RXdZRFZRUUsKREF4RUxWUnlkWE4wSUVkdFlrZ3hLakFvQmdOVkJBTU1JVVF0VkZKVlUxUWdVbTl2ZENCRGJHRnpjeUF6SUVOQklESWdSVllnTWpBdwpPVEFlRncwd09URXhNRFV3T0RVd05EWmFGdzB5T1RFeE1EVXdPRFV3TkRaYU1GQXhDekFKQmdOVkJBWVRBa1JGTVJVd0V3WURWUVFLCkRBeEVMVlJ5ZFhOMElFZHRZa2d4S2pBb0JnTlZCQU1NSVVRdFZGSlZVMVFnVW05dmRDQkRiR0Z6Y3lBeklFTkJJRElnUlZZZ01qQXcKT1RDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBSm54aERSd3VpKzNNS0NPdlh3RXo3NWl2Sm45Z3BmUwplZ3BubGpnSjloQk9sU0p6bVkzYUZTM25CZndaY3lLM2pwZ0F2RHc5cktGcys5WjVKVXV0OE14azJvZytLYmdQQ2RNMDNUUDFZdEhoCnpSbnA3aGhQVEZpdTRoN1dERnNWV3RnNnVNUVlaQjdqTTdLMWlYZE9ETC9abEdzVGwyOFNvLzZacVFUTUZleGdhRGJ0Q0h1MzliK1QKN1dZeGc0ekdjVFNIVGhmcXI0dVJqUnhXUWE0aU4xNDM4aDNaMFMwTkwybFJwNzVtcG9vNktyM0hHckhoRlBDK09oMjV6MXV4YXY2MApzVVlnb3ZzZU8zRHZrNWg5akhPVzhzWHZoWEN0S1NiOEhnUStIS0RZRDh0U2cySjg3b3RUbFpDcFY2THFZUVhZK1UzRUovcHVyZTM1CjExSDNhNlVDQXdFQUFhT0NBU1F3Z2dFZ01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZOT1Vpa3hpRXlvWkxzeXYKY29wOU50ZWFITnhuTUE0R0ExVWREd0VCL3dRRUF3SUJCakNCM1FZRFZSMGZCSUhWTUlIU01JR0hvSUdFb0lHQmhuOXNaR0Z3T2k4dgpaR2x5WldOMGIzSjVMbVF0ZEhKMWMzUXVibVYwTDBOT1BVUXRWRkpWVTFRbE1qQlNiMjkwSlRJd1EyeGhjM01sTWpBekpUSXdRMEVsCk1qQXlKVEl3UlZZbE1qQXlNREE1TEU4OVJDMVVjblZ6ZENVeU1FZHRZa2dzUXoxRVJUOWpaWEowYVdacFkyRjBaWEpsZG05allYUnAKYjI1c2FYTjBNRWFnUktCQ2hrQm9kSFJ3T2k4dmQzZDNMbVF0ZEhKMWMzUXVibVYwTDJOeWJDOWtMWFJ5ZFhOMFgzSnZiM1JmWTJ4aApjM05mTTE5allWOHlYMlYyWHpJd01Ea3VZM0pzTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFBMDdYdGFQS1NVaU84YUVYVUhMN1ArClBQb2VVU2JyaC9ZcDN1RHgxTVlrQ2VuQnoxVWJ0RERaemhyK0JsR21GYVF0NzdKTHZ5QW9KVW5ScGpaM05PaGszMUt4RWNkemVzMDUKbnNLdGpIRWg4bHBycjk4OFRsV3Zzb1JsRkltNWQ4c3FNYjdQbzIzUGIwaVVNa1p2NTNHTW9LYUVHVGNIOGdORkNTdUdkWHpmWDJsWApBTnR1MktaeUlrdFExSFdZVnQrM0dQOURRMUN1ZWtSNzhIbFIxME05cDlPQjAvREpUN25heHBlRzBJTEQ1RUp0L3JEaVpFNE9KdWRBCk5DYTFDSW5YQ0dOak9DZDFIalBxYnFqZG41bFBkRTJCaVlCTDNacVhLVnd2dm9GQnVZei82bjFnQnA3TjF6M1RMcU1WdktqbUp1VnYKdzl5NEF5SHFueGJ4TEZTMQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDQSBEaXNpZyBSb290IFIyCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhVENDQTFHZ0F3SUJBZ0lKQUpLNGlOdXdpc0ZqTUEwR0NTcUdTSWIzRFFFQkN3VUFNRkl4Q3pBSkJnTlZCQVlUQWxOTE1STXcKRVFZRFZRUUhFd3BDY21GMGFYTnNZWFpoTVJNd0VRWURWUVFLRXdwRWFYTnBaeUJoTG5NdU1Sa3dGd1lEVlFRREV4QkRRU0JFYVhOcApaeUJTYjI5MElGSXlNQjRYRFRFeU1EY3hPVEE1TVRVek1Gb1hEVFF5TURjeE9UQTVNVFV6TUZvd1VqRUxNQWtHQTFVRUJoTUNVMHN4CkV6QVJCZ05WQkFjVENrSnlZWFJwYzJ4aGRtRXhFekFSQmdOVkJBb1RDa1JwYzJsbklHRXVjeTR4R1RBWEJnTlZCQU1URUVOQklFUnAKYzJsbklGSnZiM1FnVWpJd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNpbzhRQUNkYUZYUzF0RlBiQwp3M09lTmNKeFZYNkIrNnRHVU9EQmZFbDQ1cXQ1V0R6YS8zd2NuOWlYQW5nK2EwRUU2VUc5dmdNc1JmWXZaTlNyWGFOSFBXU2I2V2lhCnhzd2JQN3Erc29zMEFpNllWUm44akcrcVg5cE16azBESWFQWTBqU1RWcGJMVEF3QUZqeGZHczNJeDJ5bXJkTXhwN3pvNWVGbTF0TDcKQTdSQlpja1FyZzRGWThhQWFta3cvZEx1a084Tko5K2ZsWFAwNFNYYWJCYmVRVGcwNm92ODBlZ0VGR0V0UVg2c3gzZE95MUZVKzE2UwpHQnNFV21qR3ljVDZ0eE9nbUxjUks3ZldWOHg4bmhmUnl5WCtoazRrTGxZTWVFMmVBUkttSzZjQlpXNThZaDJFaE4vcXdHdTFwU3FWCmc4TlRFUXh6SFF1eVJwRFJRanJPUUc2VnJmL0dsSzF1bDRTT2ZXK2Vpb0FOU1cxejRudVNIc1B6d2ZQckxnVnYyUnZQTjNZRXlMUmEKNUJlbnk5MTJIOUFaZHVnc0JiUFduRFRZbHR4aGg1RUY1RVFJTThIYXVRaGwxSzZ5TmczcnVqaTZET1dibnV1Tlp0Mlp6OWFKUWZZRQprb29wS1cxck9oem5kWDBDY1E3endPZTl5eG5kbldDeXdtWmd0ckVFN3NubWhybWFaa0NvNXhIdGdVVURpL1puV2VqQkJoRzkzYytBCkFrOWxRSGhjUjFESW0rWWZnWHZrUktoYmhacmkzbHJWeC9rNlJHWkw1REpVZk9Sc25MTU9QUmVpc2pRUzFuNnlxRW03MFhvb1FMNmkKRmgvZjVEY2ZFWFA3a0FwbFE2SU5mUGdHQVZVemZiQU51UFQxcnFWQ1YzdzJFWXg3WHNRRG5ZeDVuUUlEQVFBQm8wSXdRREFQQmdOVgpIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVdFpuNHI3Q1U5ZU1nMWdxdHprNVdwQzV1ClF1MHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQ1lHWG5EblpUUElnbTdabkJjNkczcG1zZ0gyZUR0cFhpL3EvMDc1S01PWUttRk0KdENRU2luMXRFUlQzbkxYSzVyeWVKNDVNR2NpcHZYckExellPYllWeWJxakdvbTMyK25OamY3eHVlUWdjbllxZkdvcFRwdGk3MlRWVgpzUkhGcVFPelZqdTVoSk1pWG43QjloSlNpK29zWjd6K05rejF1TS9SczBtU085TXBEcGtibHZkaHVEdkVLN1o0YkxRamIvRDkwN0plCmRSK1psYWlzOXRyaHhURjcrOUZHczlLOFo3UmlWTG9KOTJPd2s2S2ErZWxTTG90Z0Vxdjg5V0JXN3hCY2k4UWFRdHlEVzJRT3k3VzgKMWsvQmZEeHVqUk50KzN2ck1ORGNUYS9GMWJhbFRGdHh5ZWd4dnVnNEJraWhHdUxxMHQ0U09WZ2EvNEFPZ25YbXQ4a0hiQTd2L3pqeAptSEhFdDM4T0ZkQWxhYjBpblN2dEJmWkdSNnp0d1BEVU8rTHM3cFpia0JOT0hsWTY2N0R2bHJ1V0l4RzY4a09HZEdTVnlDaDEzeDAxCnV0STNnemhUT0RZN3oyenArV3NPMFBzRTZFOTMxMlVCZUlZTWVqNGhZdkYvWTNFTXlaOUUyNmdub25XK2JvRSsxOERyRzVnUGNGdzAKc29yTXdJVVk2MjU2cy9kYW9RZS9xVUtTODJBaWwrUVVvUWViVG5iQWpuMzlwQ1hIUiszL0gzT3N6TU9sNlc4S2pwdGx3bENGdGFPZwpVeExNVllkaDg0R3VFRVpodlVRaHVNSTlkTTkrSkRYNkhBY09tejBpeXU4eEw0eXNFcjN2UUNqOEtXZWZzaE5QWmlURVV4bnBIaWtWCjcrWnRzSDh0Wi8zemJCdDFScVBsU2hmcHBOY0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQUNDVlJBSVoxCj09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJSDB6Q0NCYnVnQXdJQkFnSUlYc08zcGtOL3BPQXdEUVlKS29aSWh2Y05BUUVGQlFBd1FqRVNNQkFHQTFVRUF3d0pRVU5EVmxKQgpTVm94TVJBd0RnWURWUVFMREFkUVMwbEJRME5XTVEwd0N3WURWUVFLREFSQlEwTldNUXN3Q1FZRFZRUUdFd0pGVXpBZUZ3MHhNVEExCk1EVXdPVE0zTXpkYUZ3MHpNREV5TXpFd09UTTNNemRhTUVJeEVqQVFCZ05WQkFNTUNVRkRRMVpTUVVsYU1URVFNQTRHQTFVRUN3d0gKVUV0SlFVTkRWakVOTUFzR0ExVUVDZ3dFUVVORFZqRUxNQWtHQTFVRUJoTUNSVk13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQwpEd0F3Z2dJS0FvSUNBUUNicWF1L1lVcVhyeStYWnBwMFg5RFpsdjNQNHVSbTd4OGZSelBDUktQZm10NGZ0VlRkRlh4cE5SRnZ1OGdNCmptb1lIdGlQMlJhOEVFZzJYUEJqczVCYVhDUTMxNlBXeXdseHVmRUJjb1N3ZmR0TmdNMzgwMi9KK05xMkRvTFNSWVdvRzJpb1BlajAKUkd5OW9jTExBNzZNUGhNQWhOOUtTTURqSWdybzZUZW5HRXl4Q1EwalZuOEVUZGtYaEJpbHlOcEFsSFByemc1WFBBT0JPcDBLb1ZkRAphYXhYYlhtUWVPVzF0RHZZdkV5TktLR25vNmU2QWs0bDBTcXU3YTRESXJocklBOHdLRlNWZitEdXpncG1uZEZBTFc0aXI1MGF3UVVaCjBtL0E4cC80ZTdNQ1F2dFFxUjB0a3c4anE4YkJENUwvMEtJVjlWTUpjUnovUlJPRTVpWmUrT0NJSEFyOEZyYW9jd2E0OEdPRUFxREcKV3V6bmROOXdycU9ESmVyV3g1ZUhrNmZHaW9vemwyQTNFRDZYUG00cEZkYWhEOUdJTEJLZmI2cWt4a0xyUWFMamxVUFRBWVZ0anJzNwo4eU0yeC80NzRLRWxCMGlyeVlsMC93aVBnTC9BbG1Yejd1eExhTDJkaU1NeHMwRHg2TS8yT0x1YzVORi8xT1ZZbTN6NjFQTU9tM1dSCjVMcFNMaGwrMGZYTldobjh1Z2IyKzFLb1M1a0UzZmo1dEl0UW8wNWlpZkNISlBxRFFzR0grdFV0S1NwYWNYcGthdGNuWUdNTjI4NUoKOVkwZmtJa3lGL2h6UTdqU1dwT0dZZGJoZFFycWVXWjJpRTl4NndRbDFncGFlcFBsdVVzWFFBK3h0cm4xM2svYzRMT3NPeEZ3WUlSSwpRMjZaSU1BcGNRckFaUUlEQVFBQm80SUN5ekNDQXNjd2ZRWUlLd1lCQlFVSEFRRUVjVEJ2TUV3R0NDc0dBUVVGQnpBQ2hrQm9kSFJ3Ck9pOHZkM2QzTG1GalkzWXVaWE12Wm1sc1pXRmtiV2x1TDBGeVkyaHBkbTl6TDJObGNuUnBabWxqWVdSdmN5OXlZV2w2WVdOamRqRXUKWTNKME1COEdDQ3NHQVFVRkJ6QUJoaE5vZEhSd09pOHZiMk56Y0M1aFkyTjJMbVZ6TUIwR0ExVWREZ1FXQkJUU2g3VGozemNuazFYMgpWdXFCNVRiTWpCNC92VEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRk5LSHRPUGZOeWVUVmZaVzZvSGxOc3lNCkhqKzlNSUlCY3dZRFZSMGdCSUlCYWpDQ0FXWXdnZ0ZpQmdSVkhTQUFNSUlCV0RDQ0FTSUdDQ3NHQVFVRkJ3SUNNSUlCRkI2Q0FSQUEKUVFCMUFIUUFid0J5QUdrQVpBQmhBR1FBSUFCa0FHVUFJQUJEQUdVQWNnQjBBR2tBWmdCcEFHTUFZUUJqQUdrQTh3QnVBQ0FBVWdCaApBTzBBZWdBZ0FHUUFaUUFnQUd3QVlRQWdBRUVBUXdCREFGWUFJQUFvQUVFQVp3QmxBRzRBWXdCcEFHRUFJQUJrQUdVQUlBQlVBR1VBCll3QnVBRzhBYkFCdkFHY0E3UUJoQUNBQWVRQWdBRU1BWlFCeUFIUUFhUUJtQUdrQVl3QmhBR01BYVFEekFHNEFJQUJGQUd3QVpRQmoKQUhRQWNnRHpBRzRBYVFCakFHRUFMQUFnQUVNQVNRQkdBQ0FBVVFBMEFEWUFNQUF4QURFQU5RQTJBRVVBS1FBdUFDQUFRd0JRQUZNQQpJQUJsQUc0QUlBQm9BSFFBZEFCd0FEb0FMd0F2QUhjQWR3QjNBQzRBWVFCakFHTUFkZ0F1QUdVQWN6QXdCZ2dyQmdFRkJRY0NBUllrCmFIUjBjRG92TDNkM2R5NWhZMk4yTG1WekwyeGxaMmx6YkdGamFXOXVYMk11YUhSdE1GVUdBMVVkSHdST01Fd3dTcUJJb0VhR1JHaDAKZEhBNkx5OTNkM2N1WVdOamRpNWxjeTltYVd4bFlXUnRhVzR2UVhKamFHbDJiM012WTJWeWRHbG1hV05oWkc5ekwzSmhhWHBoWTJOMgpNVjlrWlhJdVkzSnNNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVhCZ05WSFJFRUVEQU9nUXhoWTJOMlFHRmpZM1l1WlhNd0RRWUpLb1pJCmh2Y05BUUVGQlFBRGdnSUJBSmN4QXAvbi9VTm5TRVFVNUNtSDdVd29adENQTmRwTlliZEtsMDIxMjVEZ0JTNE94bm5ROHBkcEQ3MEUKUjltKzI3VXAycHZacnFtWjFkTThNSlAxamFHby9BYU5SUFRLRnBWOE05eGlpNmczK0NmWUNTMGI3OGdVSnlDcFpFVC9MdFoxcW14TgpZRUFaU1VOVVk5cml6THBtNVU5RWVsdlphb0VyUU5WLytRRW5XQ3pJN1VpUmZEK21BTS9FS1hNUk50NkdHVDZkN2htS0c5V3c3WTQ5Cm5DckFEZGc5WnVNOERiM1ZsRnppNHFjMUd3UUE5ajlhamVwRHZWK0pIYW5Cc015WjRrMEFDdHJKSjF2bkU1QmM1UFV6b2xWdDNPQUoKVFMreEpsc25kUUFKeEdKM0tRaGZubG1zdG42dG4xUXdJZ1BCSG5Gay92azRDcFlZM1FJVXJDUExCaHdlcEgyTkRkNG5RZWl0MmhXMwpzQ1BkSzZqVDJpV0g3ZWhWUkUySTlEWitoSnA0clBjT1Zra08xak1sMW9SUVFtd2dFaDBxMWI2ODhuQ0JwSEJndmdXMW01NEVSTDVoCkk2enBwU1NNRVlDVVdxS2l1VW5Td2R6UnArMHhFU3llR2FidTRWWGh3T3JQRFlUa0Y3ZWlmS1hlVlNVRzdzekFoMXhBMnN5VlAxWGcKTmNlNGhMNjBYYzE2Z3dGeTdvZm1YeDJ1dFlYR0p0L213WnJwSGdKSG55cW9iYWxieit4RmQzK1lKNW95WFNyamhPN0ZtR1l2bGlBZAozZGpESjlldytmN1pmYzNRbjQ4TEZGaFJueStMd3pndDN1aVAxbzJIcFBWV1F4YVpMUFNrVnJRMHVHRTN5Y0pZZ0J1Z2w2SDhXWTNwCkVmYlJEMHRWTkVZcWk0WTcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVFdDQSBHbG9iYWwgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGUVRDQ0F5bWdBd0lCQWdJQ0RMNHdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHQTFVRUJoTUNWRmN4RWpBUUJnTlZCQW9UCkNWUkJTVmRCVGkxRFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURWNNQm9HQTFVRUF4TVRWRmREUVNCSGJHOWlZV3dnVW05dmRDQkQKUVRBZUZ3MHhNakEyTWpjd05qSTRNek5hRncwek1ERXlNekV4TlRVNU5UbGFNRkV4Q3pBSkJnTlZCQVlUQWxSWE1SSXdFQVlEVlFRSwpFd2xVUVVsWFFVNHRRMEV4RURBT0JnTlZCQXNUQjFKdmIzUWdRMEV4SERBYUJnTlZCQU1URTFSWFEwRWdSMnh2WW1Gc0lGSnZiM1FnClEwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDd0Jkdkk2NHpFYm9vaDc0NU5uSEVLSDFKdzdXMkMKbkpmRjEweE9SVW5MUUVLMUVqUnNHY0owcERGZmhRS1g3RU16Q2xQU25JeU90N2g1Mnl2VmF2S09ac1R1S3dFSGt0U3owQUxmVVBaVgpyMllPeStCSFlDOHJNamsxVWpvb2cvaDdGc1lZdUdMV1J5V1J6dkFaRWsydFkvWFRQM1ZmS2ZDaE1Cd3FvSmltRmIzdS9SazI4T0tSClE0LzZ5dFlRSjBsTTc5M0I4WVZ3bThycXFGcEQvRzJHYjNQcE4wV3A4RGJIekloMUhydHNCditiYXo0WDdHR3FjWHpHSGFMM1Nla1YKdFR6V29XSDFFZmNGYngzOUViN1FNQWZDS2JBSlRpYmM0Nktva1dvZndwRkZpRnpsbUxoeHBSVVp5WHgxRWN4d2RFOHRteDJSUlAxVwpLS0QrdTRacXlQcGNDMWpjeGt0MnlLc2kyWE1QcGZSYUFvay9UNTRpZ3U2aWRGTXFQVk1uYVIxc2pqSXNaQUFtWTJFMlRxTkd0ejk5CnN5MnNiWkNpbGFMT3o5cUM1d2MwR1picHVDR3FLWDZtT0w2T0tVb2habmtmczhPMUNXZmUxdFFIUnZNcTJ1WWlOMkRMZ2JZUG9BL3AKeUpWL3YxV1JCWHJQUFJYQWI5NEpsQUdEMXpRYnpFQ2w4TGliWjlXWWtUdW5oSGlWSnFSYUNQZ3JkTFFBQkR6ZnVCU082Titwald4bgprak1kd0xmUzdKTEl2Z20vTENrRmJ3SnJudSs4dnlxOFc4QlFqMEZ3Y1lleVRiY0VxWVNqTXErdTdtc1hpN0t4L216aGtJeUlxSmRJCnpzaE55L01HejE5cUNrS3hIaDUzTDQ2ZzVwSU9CdndGSXRJbTRURlJmVExjRHdJREFRQUJveU13SVRBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVh6U0JkdStXSGRYbHRka0NZNFFXd2E2ZwpjRkduOTB4SE5jZ0wxeWc5aVhIWnFqTkI2aFFiYkNFQXdHeENHWDZmYVZzZ1F0K2kwdHJFZkpkTGpiRG9yTWp1cFdrRW1RcVNwcXNuCkxocE5nYitFMUhBZXJVZisvVXFkTStEeXVjUkZDQ0VLMm1scGMzSU52alQrbEl1dHd4NDExNktENytVNHg2V0ZINnZQTk93L0tQNE0KOFZlR1RzbFY5eHpVMktWOUJucHYxZDhRMzRGT0lXV3h0dUVYZVpWRkJzNWZ6TnhHaVdOb1JJMlQ5R1J3b0QyZEtBWERPWEM0WW5zZwovZVRiNlFpaHVKNDlDY2RQK3l6NGszWkIzbExnNFZmU25RTzhkNTcrbmlsZTk4RlJZQi9lMmd1eUxYVzNRMGlUNS9aNXhvUmRnRmxnCmxQeDRtSTg4azFIdFFKQUgzMlJqSk10T2NRV2gxNVFhaURMeEluUWlycVdtMkJKcFRHQ2pBdTRyN05SamtndGV2aTkyYTZPMkpyeVAKQTlnSzhreGtScjA1WXVXVzZ6UmpFU2pNbGZHdDcrL2NnRmhJNlV1NDZtV3M2ZnlBdGJYSVJmbXN3Wi9adWVwaWlJN0U4VXVERXEzbQppNFRXbnNMcmd4aWZhcnNiSkdBemNNenM5ekx6WE5sNWZlK2VwUDdKSThNazdoV1NzVDJSVHlhR3ZXWnpKQlBxcEs1andhMTloQU04CkVIaUdHM25qeFBQeUJKVWdyaU9DeExNNkFHSy81allrNFZlNnh4NlFkZFZmUDVWaEs4RTd6ZVd6YUdIUVJpYXBJVkpwTGVzdXgrdDMKenFZNnRRTXpUM2JSNTF4VUFWM0xlUFRKREwvUEVvNFhMU05vbE9lci9xbXlLd2JRQk0wPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUZWxpYVNvbmVyYSBSb290IENBIHYxCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZPRENDQXlDZ0F3SUJBZ0lSQUpXK0ZxRDNMa2J4ZXptQ2N2cUx6Wll3RFFZSktvWklodmNOQVFFRkJRQXdOekVVTUJJR0ExVUUKQ2d3TFZHVnNhV0ZUYjI1bGNtRXhIekFkQmdOVkJBTU1GbFJsYkdsaFUyOXVaWEpoSUZKdmIzUWdRMEVnZGpFd0hoY05NRGN4TURFNApNVEl3TURVd1doY05Nekl4TURFNE1USXdNRFV3V2pBM01SUXdFZ1lEVlFRS0RBdFVaV3hwWVZOdmJtVnlZVEVmTUIwR0ExVUVBd3dXClZHVnNhV0ZUYjI1bGNtRWdVbTl2ZENCRFFTQjJNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFNSysKNnlmd0lhUHphU1pWZnAzRlZSYVJYUDN2SWI5VGdIb3QwcEdNWXpIdzdDVHd3NlhTY253UWJmUTN0K1htZkhucWpMV0NpNjVJdHF3QQozR1YxN0NwTlg4R0g5U0JsSzRHb1J6NkpJNVV3RnBCLzZGY0hTT2NacnI5Rlo3RTNHd1lxL3Q3NXJIMkQrMTY2NUkrWFo3NUxqbzFrCkIxYzRWV2swTmowVFNPOVA0dE5tSHFUUEdyZGVOalBVdEFhOUdBSDlkNFJRQUVYMWpGM29JN3grL2pYaDdWQjdxVENOR2RNSmptaG4KWGI4OGx4aFR1eWxpeGNwZWNzSEhsdFRiTGFDMEgya0Q3T3JpVVBFTVBQQ3M4MU10OEJ6MTdXdzVPWE9BRnNoU3NDUE40RDdjM1R4SApvTHMxaXVLWWFJdSs1Yjl5N3RMNnBlMFM3ZnlZR0trbWR0d29TeEFnSE5OL0ZuY3Q3VytBOTBtN1V3VzdYV2pIMU1oMUZqK0pXb3YzCkYwZlVUUEhTaVhrK1RUMllxR0hlT2g3UytGNEQ0TUhKSEl6VGpVM1RsVGF6TjE5alk1c3pGUEF0Sm10VGZJbU1Nc0p1N0QwaEFEbkoKb1dqaVVJTXVzRG9yOHphZ3JDL2tiMkhDVVFrNVBvdFR1YnRuMnR4VHVYWlpOcDFENVNEZ1BUSmdoU0pSdDhjenU5MFZMNlI0cGdkNwpnVVkyQkliZGVUWEhsU3c3c0tNWE5lVnpIN1JjV2UvYTZoQmxlM3JRZjUrenRDbzNPM0NMbTF1NUs3ZnNzbEVTbDFNcFd0VHdFaERjClR3SzdFcEl2WXRRL2FVTjhEZGI4V0hVQmlKMVlGa3ZldXBEL1J3R0pCbXIyWDdLUWFyTUNwZ0tJdjdOSGZpcloxZnBvZURWTkFnTUIKQUFHalB6QTlNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdDd1lEVlIwUEJBUURBZ0VHTUIwR0ExVWREZ1FXQkJUd2oxazRBTFAxajVxVwpETlhyK251cUYrZ1RFakFOQmdrcWhraUc5dzBCQVFVRkFBT0NBZ0VBdnVSY1lrNGs5QXdJLy9EVERHamtrMGtpUDBRbmI3dHQzb05tCnpxak1EZnoxbWdibGR4U1I2NTFCZTVrcWhPWC8vQ0hCWGZEa0gxZTNkYW1oWHdJbS85Zkg5MDdlVC9qM0hFYkFlazlBTENJMThCbXgKMEd0bkxMQ280TUJBTnpYMmhGeGM0NjlDZVA2bnlRMVE2ZzJFZHZaUjc0TlR4bnIvRGxaSkxvOTYxZ3ptSjFUalRRcGdjbUxOa1FmVwpwYi9JbVd2dHhCbm1xMHdST01Wdk1lSnVTY2cvZG9BbUF5WXA0RGIyOWlCVDR4ZHdOQmVkWTJnZWErekRUWWE0RXpBdlhVWU5SMFBWCkc2cFpEcmxjalFaSXJYU0hYOGY4TVZSQkUrTEhJUTZlNEI0TjRjQjdRNFdReFlwWXhtVUtlRmZ5eGlNUEFka2dTOTRQKzVLRmRTcGMKYzQxdGV5V1J5dTVGcmdaTEFNelRzVmxRMmpxSU95bERSbDZYSzFUT1UyK05TdWVXK3I5eERrS0xmUDBvb05CSXl0ckVnVXk3b25PVApKc2pyRE5ZbWlMYkFKTSs3dlZ2cmRYM3BDSTZHTXl4NWR3bHBwWW44czNDUWgzYVAweUs3UXM2OWN3c2dKaXJRbXoxd0hpUnN6WWQyCnFSZVd0ODhOa3Z1T0dLbVlTZEdlL21CRWNpRzVHZTNDOVRIeE9VaUlrQ1IxVkJhdHp2VDRhUlJrT2Z1anVMcHdRTWNuSEwvRVZsUDYKWTJYUTh4d09GdlZyaGxoTkdOVGtEWTZsblZ1UjNIWWtVRC9HS3Z2WnQ1eTExdWJRMmVnWml4VnhTSzIzNnRoWmlOU1F2eGF6MmVtcwpXV0ZVeUJ5NnlzSEs0YmtnVEk4Nms0bWxvTXkvMC9aMXBIV1diVlk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHd6Q0NBcXVnQXdJQkFnSUJBVEFOQmdrcWhraUc5dzBCQVFzRkFEQ0JnakVMTUFrR0ExVUVCaE1DUkVVeEt6QXBCZ05WQkFvTQpJbFF0VTNsemRHVnRjeUJGYm5SbGNuQnlhWE5sSUZObGNuWnBZMlZ6SUVkdFlrZ3hIekFkQmdOVkJBc01GbFF0VTNsemRHVnRjeUJVCmNuVnpkQ0JEWlc1MFpYSXhKVEFqQmdOVkJBTU1IRlF0VkdWc1pWTmxZeUJIYkc5aVlXeFNiMjkwSUVOc1lYTnpJREl3SGhjTk1EZ3gKTURBeE1UQTBNREUwV2hjTk16TXhNREF4TWpNMU9UVTVXakNCZ2pFTE1Ba0dBMVVFQmhNQ1JFVXhLekFwQmdOVkJBb01JbFF0VTNsegpkR1Z0Y3lCRmJuUmxjbkJ5YVhObElGTmxjblpwWTJWeklFZHRZa2d4SHpBZEJnTlZCQXNNRmxRdFUzbHpkR1Z0Y3lCVWNuVnpkQ0JEClpXNTBaWEl4SlRBakJnTlZCQU1NSEZRdFZHVnNaVk5sWXlCSGJHOWlZV3hTYjI5MElFTnNZWE56SURJd2dnRWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDcVg5b2JYK2h6a2VYYVhQU2k1a2ZsODJoVllBVWRBcVN6bTFuekhvcXZOSzM4RGNMWgpTQm51YVkvSklQd2hxZ2NaN2JCY3JHWEhYKzBDZkh0OExSdld1cm1Bd2hpQ0ZvVDZackFJeGxRamdlVE51VWsvOWs5dU4wZ29PQS9GCnZ1ZG9jUDA1bDAzU3g1aVJVS3JFUkxNamZUbEg2VkppMWhLVFhyY3hsa0lGKzNhbkhxUDF3dnpwZXNWc3FYRlA2c3Q0dkdDdng5NzAKMmN1K2ZqT2xicFNEOERUNklhdnFqbktnUDZUZU1GdnZoazFxbFZ0RFJLZ1FGUnpsQVZmRm1QSG1CaWlScWlERnQxTW1VVU95Q3hHVgpXT0hBRDNiWndJMThnZk55Y0o1di9ocU8yVjgxeHJKdk5IeStTRS9pV2puWDJKMTRucCtHUGdOZUdZdEVvdFhIQWdNQkFBR2pRakJBCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJTL1dTQTJBSG1nb0NKcmpOWHkKWWRLNExNdUNTakFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBTVFPaVlRc2ZkT2h5TnNadCtVMmUraUtvNFlGV3o4MjduK3Fya1JrNApyNnA4RlUzenRxT05wZlNPOWtTcHArZ2hsYTArQUdJV2lQQUN1dnhoSStZem16QjZhelppZTYwRUk0UllaZUxiSzRybkpWTTNZbE5mCnZOb0JZaW1pcGlkeDVqb2lmc0Z2SFpWd0lFb0hOTi9xL3hXQTViclhldGhiZFh3RmVpbEhma0NvTVJOM3pVQTd0RkZIZWk0UjQwY1IKM3AxbTBJdlZWR2I2ZzFYcWZNSXBpUnZwYjdQTzRnV0V5UzgrZUlWaWJzbGZ3WGhqZEZqQVNCZ01tVG5ycE13YXRYbGFqUldjMkJRTgo5bm9IVjhjaWd3VXRQSnNsSmowWXM2bERmTWpJcTJTUERxTy9uQnVkTU52YTBCa3Vxanp4K3pPQWR1VE5yUmxQQlNlT0U2RnV3Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF0b3MgVHJ1c3RlZFJvb3QgMjAxMQo9PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURkekNDQWwrZ0F3SUJBZ0lJWERQTFlpeGZzekl3RFFZSktvWklodmNOQVFFTEJRQXdQREVlTUJ3R0ExVUVBd3dWUVhSdmN5QlUKY25WemRHVmtVbTl2ZENBeU1ERXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3dDUVlEVlFRR0V3SkVSVEFlRncweE1UQTNNRGN4TkRVNApNekJhRncwek1ERXlNekV5TXpVNU5UbGFNRHd4SGpBY0JnTlZCQU1NRlVGMGIzTWdWSEoxYzNSbFpGSnZiM1FnTWpBeE1URU5NQXNHCkExVUVDZ3dFUVhSdmN6RUxNQWtHQTFVRUJoTUNSRVV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQ1YKaFR1WGJ5bzdManZQcHZNcE5iN1BHS3crcXRuNFRhQStHa2U1dkpyZjh2N01Qa2ZvZXBiQ0pJNDE5S2tNL0lMOWJjRnlZaWU5Nm12cgo1NHJNVkQ2UVVNK0ExSlg3NkxXQzFCVEZ0cWxWSlZmYnNWRDJzR0JrV1hwcHp3TzNidzIreWo1dmRITHFxakFxYzJLK1NaRmh5QkgrCkRnTXE5Mm9nM0FJVkRWNFZhdnpqZ3NHMXhaMWtDV3lqV1pnSEo4Y2JsaXRoZEhGc1EvSDNOWWtRNEo3c1ZhRTNJcUtIQkFVc1IzMjAKSExsaUtXWW95cmZoay9Xa2xBT1p1WENGdGVaSTZvMVEvTm5lekc4SER0MExjcDJBTUJZSGxUOG9EdjNGZFU5VDFuU2F0Q1F1amdLUgp6M2JGbXg1VmRKeDRJYkh3TGZFTG44TFZsaGdmOEZRaWVvd0hBZ01CQUFHamZUQjdNQjBHQTFVZERnUVdCQlNucFFheExLWUpZTzdSCmwrbHdycnc3R1d6YklUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGS2VsQnJFc3BnbGc3dEdYNlhDdXZEc1oKYk5zaE1CZ0dBMVVkSUFRUk1BOHdEUVlMS3dZQkJBR3dMUU1FQVFFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQgpDd1VBQTRJQkFRQW1kelRibEVpR0trR2RMRDRHa0dERWpLd0xWTGdmdVh2VEJ6bmsrajU3c2oxTzdaOGp2WmZ6YTF6djd2MUFwdCtoCms2RUtocXp2SU5CNUFiMTQ5eG5ZSkRFMEJBR211aFdhd3lmYzJFOFB6QmhqLzVrUERwRnJkUmJoSWZ6WUpzZEh0NmJQV0hKeGZycmgKVFpWSE84bXZiYUcwd2V5SjlyUVBPTFhpWk53bHo2YmI2NXBjbWFIRkNONzk1dHJWMWxwRkRNUzN3clVVNzdRUi93NFZ0ZlgxMjhhOQo2MXFuOEZZaXFUeGxWTVlWcUwyR25zMkRsbWg2Y1lHSjRRdmg2aEViYUFqTWFaN3Nua0dlUkRJbWV1S0hDbkU5NitSYXBOTGJ4YzNHCjNtQi91Zk5QUkpMdktyY1lQcWNaMlF0OXNUZEJRckM2WUIzeS9na1JzUENIZTZlZAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpRdW9WYWRpcyBSb290IENBIDEgRzMKPT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJVWVGaGZMcTBzR1V2ak53YzFOQk1vdFpiVVpaTXdEUVlKS29aSWh2Y05BUUVMQlFBd1NERUxNQWtHCkExVUVCaE1DUWsweEdUQVhCZ05WQkFvVEVGRjFiMVpoWkdseklFeHBiV2wwWldReEhqQWNCZ05WQkFNVEZWRjFiMVpoWkdseklGSnYKYjNRZ1EwRWdNU0JITXpBZUZ3MHhNakF4TVRJeE56STNORFJhRncwME1qQXhNVEl4TnpJM05EUmFNRWd4Q3pBSkJnTlZCQVlUQWtKTgpNUmt3RndZRFZRUUtFeEJSZFc5V1lXUnBjeUJNYVcxcGRHVmtNUjR3SEFZRFZRUURFeFZSZFc5V1lXUnBjeUJTYjI5MElFTkJJREVnClJ6TXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDZ3ZsQVFqdW55YkVDMEJKeUZ1VEhLM0Mza0Vha0UKUEJ0VndlZFlNQjBrdE1QdmhkNk1MT0hCUGQrQzVrK3RSNGRzN0Z0SndVclZ1NC9zaDZ4L2dwcUc3RDBEbVZJQjBqV2VyTnJ3VThsbQpQTlNzQWdIYUpOTTdxQUpHcjZRYzQvaHpXSGEzOWc2UURiWHd6OHo2K2NaTTVjT0dNQXFORjM0MTY4WGZ1dzZjd0kySDQ0ZzRoV2Y2ClBzZXI0Qk9jQlJpWXo1UDFzWkswL0NQVHo5WEVKMG5nbmp5YkNLT0xYU29oNFB3NXFsUGFmWDdQR2dsVHZGMEZCTStoU28rTGRvSU4Kb2ZqU3h4UjNXNUEyQjRHYlBnYjZVbDVqeGFZQS9xWHBVaHRTdFpJNWNnTUpZcjJ3WUJadXB0MGx3Z05tM2ZNRTBVRGlUb3VHOUcvbApnNkFuaEY0RXdmV1F2VEE5eE8rb2FidzRtNlNrbHRGaTJtbkFBWmF1eThSUk5Pb01xdjhoamxtUFNsemtZWnFuMHVrcWVJMVJQVG9WCjdxSlpqcWxjM3NYNWtDTGxpRVZ4M1pHWmJIcWZQVDJZZkY3MnZoWm9vRjZ1Q3lQOFdnK3FJbll0eWFFUUhlVFRSQ09RaUovR0t1YlgKOVpxeldCNHZNSWtJRzFTaXRaZ2o3QWgzSEpWZFlkSExpWnhmb2txUm11OGhxa2tXQ0tpOVlTZ3h5WFN0aGZiWnhiR0wwZVVRTWsxZgppeUE2UEVrZk00VlpEZHZMQ1hWRGFYUDdhM0Y5OE4vRVRIM0dveTdJbFhuTGM2S09UazBrKzE3a0JMNXlHNlluTFVsYW1YclhYQWtnCnQzK1V1VS94RFJ4ZWlFSWJFYmZua2R1ZWJQUnEzNHdHbUFPdHpDanZwVWZ6VXdJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQUQKQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVW81Zlc4MTZpRU9HclJaODhGMlE4N2dGd25Nd3dEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUJqNlczWDhQbnJIWDNmSHl0L1BYOE1TeEVCZDFES3F1R3JYMVJVVlJwZ2pwZWFRV3hpWlRPT3RRcU9DCk1UYUl6ZW43eEFTV1NJc0J4NDBCejFzekJwWkdablFkVCszQnRybTBEV0hNWTM3WExuZU1saHdxSTJocmhWZDJjRE1UL3VGUHBpTjMKR1BvYWpPaTlaY25QUC9USkY5enJ4N3pBQkM0dFJpOXBac01iai83c1B0UEtsTDkyQ2lVTnFYc0NIS25RTzE4THdJRTZQV1RodjZjdApUcjFOeE5ncHhpSVkwTVdzY2dLQ1A2bzZvam9pbHpIZENHUERkUlM1WUNndFcyamdGcWxtZ2lOUjlldFQyREdiZSttM25VdnJpQmJQCitWMDRpa2t3aiszeDZ4bjBkeG94R0UxblZHd3ZiMlg1Mnozc0lleGU5UFNMeW1CbFZORnhaUFQ1cHFPQk16WXpjZkNrZUY5T3JZTWgKM2pSSmplaFpySjN5ZGxvMjhoUDByK0FKeDJFcWJQZmduYTY3aGtvb2J5N3V0SG5Oa0RQRHMzYjY5ZkJzblFHUStwNlE5cHh5ejBmYQp3eC9rTlNCVDhsVFIzMkdEcGdMaUpUamVoVEl0WG5PUVVsMUN4TTQ5UytINUdZUWQxYUpRekVIN1FSVER2ZGJKV3FOalpnS0F2UVU2Ck8wZWM3QUFtVFBXSVViK29JMzhZQjdBTDdZc21vV1RUWVVyclhKL2VzNjluQTdNZjNXMWRhV2hwcTE0NjdIeHB2TWM3aFU2ZUZibTAKRlUvRGxYcFkxOGxzNld5NTh5bGpYclFzOEMwOTdWcGw0S2xiUU1KSW1ZRnRuaDhHS2p3U3RJc1BtNklrOEthTjFucmdTN1prbG1PVgpoTUpLelJ3dUpJY3pZT1hECi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClF1b1ZhZGlzIFJvb3QgQ0EgMiBHMwo9PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZZRENDQTBpZ0F3SUJBZ0lVUkZjMEpGdUJpWnMxOHM2NEt6dGJweWJ3ZFNnd0RRWUpLb1pJaHZjTkFRRUxCUUF3U0RFTE1Ba0cKQTFVRUJoTUNRazB4R1RBWEJnTlZCQW9URUZGMWIxWmhaR2x6SUV4cGJXbDBaV1F4SGpBY0JnTlZCQU1URlZGMWIxWmhaR2x6SUZKdgpiM1FnUTBFZ01pQkhNekFlRncweE1qQXhNVEl4T0RVNU16SmFGdzAwTWpBeE1USXhPRFU1TXpKYU1FZ3hDekFKQmdOVkJBWVRBa0pOCk1Sa3dGd1lEVlFRS0V4QlJkVzlXWVdScGN5Qk1hVzFwZEdWa01SNHdIQVlEVlFRREV4VlJkVzlXWVdScGN5QlNiMjkwSUVOQklESWcKUnpNd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUUNocmlXeUFSamNWNGcvUnV2NXIrTHJJM0hpbXRGaApaaUZmcXE4blVlVnVHeGJVTFgxUXNGTjN2WGc2WU9Ka0FwdDhocHZXR282dC94OFZmOVdWSGhMTDVoU0VCTUhmTnJNV240cmp5ZHVZCk5NN1lNeGNvUnZ5bnlmRFN0TlZOQ1hKSitmS0g0Nm5hZmFGOWE3STZKYWx0VWtTcytMNXUrOXltYzVHUVlhWURGQ0R5NTRlamlLMnQKb0l6L3Bnc2xVaVhuRmdIVnk3ZzFnUXlqTy9EaDRmeGFYYzZBY1czNFNhcytPN3E0MTRBQis2WHJXN1BGWG1BcU1hQ3ZOK2dnT3ArbwpNaXdNekFrZDA1Nk9YYnhNbU83RkdtaDc3Rk9tNlJRMW85L05nSjhNU1BzYzlQRy9Tcmo2MVl4eFNzY2ZyZjVCbXJPRFhmS0VWdStsClYwUE9LYTJNcTFXL3hQdGJBZDBqSWFGWUFJN0QwR29UN1JQakVpdUEzR2ZtbGJMTkhpSnVLdmhCMVBMS0ZBZU5pbFVTeG1uMXVJWm8KTDFOZXNOS3FJY0dZNWpEaloxWEhtMjZzR2FoVnBrVUcwQ002Mit0bFhTb1JFZkE3VDhwdDlEVEVjZVQvQUZyMlhLNGpZSVZ6OGVRUQpzU1d1MVpLN0U4RU00RG5hdERsWHRhczFxbkloTzRNMTV6SGZlaUZ1dURJSWZSMHlrUlZLWW5MUDQzZWh2TlVSRzNZQlp3amdRUXZECjZ4VnUrS1FaMmFLcnIrSW5VbFlyQW9vc0ZDVDV2MElDdnliSXhvL2diamg5VXkzbDdaaXpsV05vZi9rMTlOK0l4V0Exa3NCOGFSeGgKbFJiUTY5NExyejRFRUVWbFdGQTRyMGp5V2JZVzhqd05rQUxHY0M0QnJUd1Yxd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVN2VkdmRscS9ZT3hKVzhhbGQ3dHlGbkdieEQwd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBSkhmZ0Q5RENYNXh3dmZyczRpUDRWR3l2RDExK1NoZHlMeVptM3RkcXVYSzRRcjM2TExUbjkxbk1YNjYKQWFySGFrRTdrTlFJWExKZ2FwRHd5TTREWXZtTDdmdHVLdHdHVFR3cEQ0a1dpbGhNU0Evb2hHSHFQSEttZCtSQ3JvaWpRMWg1ZnE3SwpwVk1OcVQxd3ZTQVpZYVJzT1B4RE11SEJSLy80N1BFUklqS1duTUwyVzJtV2V5QU1RMEdhVy9aWkdZamVWWWczVVF0NFhBb2VvMEw5Cng1MklEOER5ZUFJa1ZKT3ZpWWVJeVVxQUhlclFiajVoTGphN05RNG5sdjFtTkR0aGNuUHhGbHhIQmxSSkFIcFlFckFLNzRYOXNiZ3oKZFdxVEhCTG1ZRjV2SFgvSkh5UExoR0dmSG9KRStWK3RZbFVrbWxLWTdWSG5vWDZYT3VZdkh4SGFVNEFzaFo2ck5SRGJJbDlxeFY2WApVL0l5QWdrd28xandEUUhWY3NheGZHbDd3L1UyUmN4aGJsNU1sTVZlcnVnT1hvdS85ODNnN2FFT0d6UHVWQmorRDc3dmZvUnJRK053Cm1OdGRkYklOV1FlRkZTTTUxdkhmcVNZUDFrakhzNllpOVRNM1dwVkhuM3U2R0JWdi85WVVaSU5KMGdwbklkc1BOV05nS0NManNaV0QKellXbTNTOFA1MmRTYnJzdmhYejFTblBueFQ3QXZTRVNCVC84dHdOSkFsdklKZWJpVkRqMWVZZU1IVk95VG9WN0JqakhMUGo0c0hLTgpKZVYzVXZRREhFaW1VRitJSURCdThvSkRxejJYaE9kVCt5SEJUdzhpbW9hNFdTcjJSejBaaUMzb2hlR2U3SVVJYXJGc05Na2Q3RWdyCk8zanRac1NPZVdtRDNuK00KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKUXVvVmFkaXMgUm9vdCBDQSAzIEczCj09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRllEQ0NBMGlnQXdJQkFnSVVMdldiQWlpbjIzci8xYU9wN3IwRG9NOFNhaDB3RFFZSktvWklodmNOQVFFTEJRQXdTREVMTUFrRwpBMVVFQmhNQ1FrMHhHVEFYQmdOVkJBb1RFRkYxYjFaaFpHbHpJRXhwYldsMFpXUXhIakFjQmdOVkJBTVRGVkYxYjFaaFpHbHpJRkp2CmIzUWdRMEVnTXlCSE16QWVGdzB4TWpBeE1USXlNREkyTXpKYUZ3MDBNakF4TVRJeU1ESTJNekphTUVneEN6QUpCZ05WQkFZVEFrSk4KTVJrd0Z3WURWUVFLRXhCUmRXOVdZV1JwY3lCTWFXMXBkR1ZrTVI0d0hBWURWUVFERXhWUmRXOVdZV1JwY3lCU2IyOTBJRU5CSURNZwpSek13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3p5dzRRWjQ3cUZKZW5NaW9LVmpaL2FFekhzMjg2Ckl4U1IveGwvcGNxczdyTjJuWHJwaXh1cmF6SGIrZ3RUVEsvRnBScDVQSXBNLzZ6ZkpkNU8yWUl5QzBUZXl0dU1yS051Rm9NN3BtUkwKTW9uN0ZoWTRmdXRENHROMFNzSmlDbk1LM1VtelY5S3dDb1dkY1R6ZW84dkFNdk1CT1NCREd6WFJVN094N3NXVGFZSStGclVvUnFIZQo2b2tKN1VPNEJVYUtodlZaUjc0YmJ3RWhFTG45cWRJb3loQTVDY29UTnMrY3JhMUFkSGtyQWo4MC8vb2dhWDNUN21IMXVyUG5NTkEzCkk0WnlZVVVwU0Zsb2IzZW1Mb0crQjAxdnI4N0VSUk9SRkhBR2p4K2YrSWRwc1E3dnc0a1o2K29jWWZ4NmJJcmMxZ01MbmlhNkV0M1UKVkRtckpxTXo2bldCMmkzTkQwL2tBOUh2RlpjYmE1REZBcENUWmdJaHNVZmVpNXBLZ0xsVmo3V2lMOERXTTJmYWZzU250QVJFNjBmNwo1bGk1OXd6d2V5dXh3SEFwdzBCaUxUdElhZHdqUEVqcmV3bDVxVzNhcURDWXo0QnlBNGltVzBhdWNubDhDQU1oWmE2MzRSeWxzU3FpCk1kNW1CUGZBZE9oeDN2ODlXY3lXSmhLTGhaVlhHcXRyZFF0RVBSRW9QSHRodCtLUFowL2w3RHhNWUlCcFZ6Z2VBVnVOVmVqSDM4RE0KZHlNMFNYVjg5cGdSNnkzZTdVRXVGQVVDZitEK0lPczE1eEdzSXM1WFBkN0pNRzBRQTRYTjhmK01GclhCc2o2SWJHQi9rRStWOS9ZdApyUUU1QndUNmRZQjl2MGxRN2UvSnhId2M2NEIrMjdiUTNSUCt5ZE9jMTdLWHFRSURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVV4aGZRdktqcUFrUHlHd2FaWFN1UUlMblhuT1F3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dJQkFEUmgyVmExRW9kVlRkMmpOVEZHdTZRSGNyeGZZV0xvcGZzTE43RTh0clA2S1oxL0F2V2t5YWlUdDNweApLR21QYytGU2tOclZ2anJsdDNacVZvQWgzMTNtNlRxZTVUNzJvbW5IS2dxd0dFZmNJSEI5VXFNK1dYekJ1c25JRlVCaHluTFdjS3pTCnQvQWM1SVlwOE03dmFHUFF0U0NLRldHYWZvYVl0TW5DZHZ2TXVqQVd6S05oeG5RVDVXdnZveFhxQS80VGkyVGswOEhTNklUN1NkRVEKVFhsbTY2cjk5STB4SG5BVXJkemVaeE5NZ1JWaHZMZlprWGR4R1lGZ3UvQllwYldjQy9lUElsVW53RXNCYlR1WkRkUWRtMk5uTDlEdQpEY3BtdkpSUHBxM3QvTzVqckZjL1pTWFBzb2FQMEFqL3VIWVVidDdsSit5cmVMVlR1YlkvNkNENTBxaStZVWJLaDR5RTgvbnhvR2liCkloNkJKcHNRQkpGeHdBWWYzS0RUdVZhbjQ1Z3RmNE9kMzR3cm5ES09NcFR3QVR3aUtwOUR3aTdEbURrSE9IdjhYZ0JDSC9NeUpubUQKaFBibDhNRlJFc0FMSGdRakRGU2xUQzlKeFVyUnRtNWdEV3Y4YTR1RkpHUzNpUTZySlVkYlBNOStTYjNINlFyRzJ2ZCtEaGNJMDBpWAowSEdTOEE4NVBqUnFISDNZOGlLdXUybjBNN1NtU0ZYUkR3NG02T3kyQ3kybmhUWE4vVm5JbjlITlBsb3BOTGs5aE02eFpkUlprWkZXCmRTSEJkNTc1ZXVGZ25kT3RCQmowZk90ZWs0OVRTaUlwK0VnclBrMkdyRnQveXdhWldXRFlXR1dWalVUUjkzOStKMzk5cm9EMUIweTIKUHB4eFZKa0VTLzFZK1pqMAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbGpDQ0FuNmdBd0lCQWdJUUM1TWNPdFk1Witwbkk3L0RyNXIwU3pBTkJna3Foa2lHOXcwQkFRc0ZBREJsTVFzd0NRWURWUVFHCkV3SlZVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXcKSWdZRFZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSekl3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpndwpNVEUxTVRJd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMCkV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6SXcKZ2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRRFo1eWd2VWo4MmNrbUlrelR6K0dvZU1WU0FuNjFVUWJWSAozNWFvMUsrQUxia0t6M1g5aWFWOUpQcmpJZ3dydkpVWEN6Ty9HVTFCQnBBQXZReE5FUDRIdGVjY2JpSlZNV1dYdmRNWDBoNWk4OXZxCmJGQ01QNFFNbHMrM3l3UGd5bTJoRkV3YmlkM3RBTEJTZksrUmJMRTRFOUhwRWdqQUFMQWNLeEhhZDNBMm02N09lWWZjZ25EbUNYUncKVldtdm8yaWZ2OTIyZWJQeW5YQXBWZlNyLzVWaDg4bEFieDNSdnBPNzA0Z3F1NTIvY2xwV2NUcy8xUFBSQ3Y0bzc2UHUyWm12QTlPUApZTGZ5a3FHeHZZbUpIekROdzZZdVlqT3VGZ0ozUkZybmdRbzhwMFF1ZWJnL0JMeGNvSWZoRzY5UmpzM3NMUHI0L20zd09ueXFpK1JuCmxUR05BZ01CQUFHalFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01CMEdBMVVkRGdRV0JCVE8KdzBxNW1WWHl1TnRndjZsK3ZWYTFsemFuMWpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQXlxVlZqT1BJUVc1cEo2ZDFFZTg4aGpadgowcDNHZURnZGFaYWlrbWt1T0d5YmZRVFVpYVd4TVRlS3lTSE1xMnpOaXh5YTFyOUkwakptd1lyQTh5ODY3OERqMUpHRzBWRGpBOXR6CmQyOUtPVlB0M2liSHRYMnZLMExSZFdMalNpc0N4MUJMNEduaWxtd09SR1lRUkkrdEJldjRlYXltRytnM05KMVR5V0dxb2xLdlNuQVcKaHNJNnlMRVRjRGJZeis3MENqVFZXMHo5QjV5aXV0a0JjbHp6VGNIZERyRWNEY1JqdnEzMEZQdUo3S0pCRGt6TXlGZEEwRzREcXMwTQpqb21abVd6d1BEQ3ZPTjl2dktPK0tTQW5xM1QvRXlKNDNwZFNWUjZEdFZRZ0ErNnV3RTlXM2pmTXczK3FCQ2U3MDNlNFl0c1hmSndvCkloTnpiTThtOVlvcDV3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IEczCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1JqQ0NBYzJnQXdJQkFnSVFDNkZhK2gzZm9MVkpSSy9OSktCczdEQUtCZ2dxaGtqT1BRUURBekJsTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEClZRUURFeHRFYVdkcFEyVnlkQ0JCYzNOMWNtVmtJRWxFSUZKdmIzUWdSek13SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTEKTVRJd01EQXdXakJsTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TUXdJZ1lEVlFRREV4dEVhV2RwUTJWeWRDQkJjM04xY21Wa0lFbEVJRkp2YjNRZ1J6TXdkakFRCkJnY3Foa2pPUFFJQkJnVXJnUVFBSWdOaUFBUVo1N3lzUkdYdHpiZy9XUHVOc1ZlcFJDMEZGZkx2Qy84UWRKKzFZbEpmWm40ZjVkd2IKUlhrTHpNWlRDcDJOWFFMWnFWbmVBbHIybFNvT2pUaEtpa25Hdk1ZRE9BZGZWZHArQ1c3aWYxN1FSU0FQV1hZUTFxQWs4QzNlTnZKcwpLVG1qUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJUTDBMMnA0WmdGClVhRk5ONktEZWM2TkhTcmtoREFLQmdncWhrak9QUVFEQXdObkFEQmtBakFscElGRkFtc1NTM1YwVDhnajQzRHlkWExlZklud3o1RnkKWVo1ZUVKSlpWcm1EeHhEbk9PbFlKalo5MWVRMGhqa0NNSHcyVS9BdzVXSmpPcG5pdHFNN216VDZIdG9Ra25GZWtST24zYVJ1a3N3eQoxdlVoWnNjdjZwWmphbVZGa3BVQnRBPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgR2xvYmFsIFJvb3QgRzIKPT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURqakNDQW5hZ0F3SUJBZ0lRQXpyeDVxY1JxYUM3S0dTeEhRbjY1VEFOQmdrcWhraUc5dzBCQVFzRkFEQmhNUXN3Q1FZRFZRUUcKRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCM2QzY3VaR2xuYVdObGNuUXVZMjl0TVNBdwpIZ1lEVlFRREV4ZEVhV2RwUTJWeWRDQkhiRzlpWVd3Z1VtOXZkQ0JITWpBZUZ3MHhNekE0TURFeE1qQXdNREJhRncwek9EQXhNVFV4Ck1qQXdNREJhTUdFeEN6QUpCZ05WQkFZVEFsVlRNUlV3RXdZRFZRUUtFd3hFYVdkcFEyVnlkQ0JKYm1NeEdUQVhCZ05WQkFzVEVIZDMKZHk1a2FXZHBZMlZ5ZEM1amIyMHhJREFlQmdOVkJBTVRGMFJwWjJsRFpYSjBJRWRzYjJKaGJDQlNiMjkwSUVjeU1JSUJJakFOQmdrcQpoa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXV6Zk5OTng3YThteWFKQ3RTblgvUnJvaENnaU45UmxVeWZ1STIvT3U4anFKCmtUeDY1cXNHR212UHJDM29YZ2trUkxwaW1uN1dvNmgrNEZSMUlBV3NVTGVjWXhwc01OemFIeG14MXg3ZS9kZmd5NVNETjY3c0gwTk8KM1hzczByMHVwUy9rcWJpdE90U1pwTFlsNlp0ckFHQ1NZUDlQSVVrWTkyZVFxMkVHbkkveXV1bTA2Wkl5YTdYelYraGRHODJNSGF1VgpCSlZKOHpVdGx1TkpiZDEzNC90SlM3U3NWUWVwajVXenRDTzdURzFGOFBhcHNwVXd0UDFNVll3blNsY1VmSUtkelhPUzB4WktCZ3lNClVOR1BIZ20rRjZIbUljcjlnK1VRdklPbENzUm5LUFp6RkJROVJuYkRoeFNKSVRSTnJ3OUZES1pKb2JxN25NV3hNNE1waFFJREFRQUIKbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVVRpSlVJQmlWNXVOdQo1Zy82K3JrUzdRWVhqemt3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUdCbktKUnZEa2hqNnpIZDZtY1kxWWw5UE1XTFNuL3B2dHNyCkY5K3dYM04zS2pJVE9ZRm5Rb1FqOGtWbk5leUl2L2lQc0dFTU5LU3VJRXlFeHR2NE5lRjIyZCttUXJ2SFJBaUdmelowSkZyYWJBMFUKV1RXOThrbmR0aC9Kc3cxSEtqMlpMN3RjdTdYVUlPR1pYMU5HRmR0b20vRHpNTlUrTWVLTmhKN2ppdHJhbGo0MUU2VmY4UGx3VUhCSApRUkZYR1U3QWo2NEd4SlVURnk4YkpaOTE4ckdPbWFGdkU3RkJjZjZJS3NoUEVDQlYxL01VUmVYZ1JQVHFoNVV5a3c3K1UwYjZMSjMvCml5SzVTOWtKUmFUZXBMaWFXTjBiZlZLZmpsbERpSUdrbmliVmI2M2REY1kzZmUwRGtodmxkMTkyN2p5TnhGMVdXNkxaWm02ek5UZmwKTXJZPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1B6Q0NBY1dnQXdJQkFnSVFCVlZXdlBKZXBEVTF3NlFQMWF0RmNqQUtCZ2dxaGtqT1BRUURBekJoTVFzd0NRWURWUVFHRXdKVgpVekVWTUJNR0ExVUVDaE1NUkdsbmFVTmxjblFnU1c1ak1Sa3dGd1lEVlFRTEV4QjNkM2N1WkdsbmFXTmxjblF1WTI5dE1TQXdIZ1lEClZRUURFeGRFYVdkcFEyVnlkQ0JIYkc5aVlXd2dVbTl2ZENCSE16QWVGdzB4TXpBNE1ERXhNakF3TURCYUZ3MHpPREF4TVRVeE1qQXcKTURCYU1HRXhDekFKQmdOVkJBWVRBbFZUTVJVd0V3WURWUVFLRXd4RWFXZHBRMlZ5ZENCSmJtTXhHVEFYQmdOVkJBc1RFSGQzZHk1awphV2RwWTJWeWRDNWpiMjB4SURBZUJnTlZCQU1URjBScFoybERaWEowSUVkc2IySmhiQ0JTYjI5MElFY3pNSFl3RUFZSEtvWkl6ajBDCkFRWUZLNEVFQUNJRFlnQUUzYWZadTRxNEMvc0xmeUhTOEw2K2MvTXpYUnE4Tk9yZXhwdTgwSlgyOE16UUM3cGhXMUZHZnA0dG4rNk8KWXd3WDdBZHc5YytFTGtDRG5PZy9RVzA3cmRPa0ZGazJlSjBEUSs0UUUyeHkzcTZJcDZGcnRVUE9aOXdqL3dNY28rSStvMEl3UURBUApCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVXM5dElwUG1oeGRpdU5rSE1FV05wCllpbThTOFl3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl4QUsyODhtdy9Fa3JSTFRuRENnbVhjL1NJTm95SUo3dm1pSTFRaGFkaitaNHkKM21hVEQvSE1zUW1QM1d5cittdC9vQUl3T1daYndtU051SjVRM0tqVlNhTHR4OXpSU1g4WEFiaklobzlPaklncnFKcXBpc1hSQUwzNApWT0thNVZ0OHN5Y1gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0Cj09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmtEQ0NBM2lnQXdJQkFnSVFCWnNiVjU2T0lUTGlPUWU5cDNkMVhEQU5CZ2txaGtpRzl3MEJBUXdGQURCaU1Rc3dDUVlEVlFRRwpFd0pWVXpFVk1CTUdBMVVFQ2hNTVJHbG5hVU5sY25RZ1NXNWpNUmt3RndZRFZRUUxFeEIzZDNjdVpHbG5hV05sY25RdVkyOXRNU0V3Ckh3WURWUVFERXhoRWFXZHBRMlZ5ZENCVWNuVnpkR1ZrSUZKdmIzUWdSelF3SGhjTk1UTXdPREF4TVRJd01EQXdXaGNOTXpnd01URTEKTVRJd01EQXdXakJpTVFzd0NRWURWUVFHRXdKVlV6RVZNQk1HQTFVRUNoTU1SR2xuYVVObGNuUWdTVzVqTVJrd0Z3WURWUVFMRXhCMwpkM2N1WkdsbmFXTmxjblF1WTI5dE1TRXdId1lEVlFRREV4aEVhV2RwUTJWeWRDQlVjblZ6ZEdWa0lGSnZiM1FnUnpRd2dnSWlNQTBHCkNTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDLzVwQnphTjY3NUYxS1BEQWlNR2t6N01LbkpTN0pJVDN5aXRoWnd1RXAKcHoxWXEzYWF6YTU3RzRRTnhEQWY4eHVrT0JiclZzYVhiUjJyc25ueXloSFM1Ri9XQlR4U0QxSWZ4cDRWcFg2K242bFhGbGxWY3E5bwprM0RDc3JwMW1XcHpNcFRSRUVRUUx0K0M4d2VFNW5RN2JYSGlMUXdiN2lEVnlTQWRZeWt0enV4ZVRzaVQrQ0ZobXpUckJjWmU3RnNhCnZPdkp6ODJzTkVCZnNYcG03bmZJU0tobVYxZWZWRmlPREN1M1Q2Y3cyVmJ1eW50ZDQ2M0pUMTdsTmVjeHk5cVRYdHlPajREYXRwR1kKUUpCNXczakh0ckhFdFdvWU9BTVFqZGpVTjZRdUJYMkk5WUkrRUpGd3ExV0NRVExYMndSekttNlJBWHdoVE5TOHJoc0RkVjE0WnRrNgpNVVNhTTBDL0NOZGFTYVRDNXFtZ1o5MmtKN3loVHptMUVWZ1g5eVJjUm85azk4RnBpSGFZZGoxWlhVSjJoNG1YYVhwSThPQ2lFaHRtCm1uVEsza3NlNXc1anJ1YlU3NUtTT3A0OTNBRGtSU1dKdHBwRUdTdCt3SlMwMG1GdDZ6UFp4ZDlMQkFETWZSeVZ3NC8zSWJLeUViZTcKZi9MVmpIQXNRV0Nxc1dNWVJKVWFkbUorOW9DdysraGtwalBSaVFmaHZiZm1RNlFZdUtaM0FlRVBsQXdoSGJKVUtTV0piT1VPVWxGSApkTDRtckxaQmRkNTZyRitOUDhtODAwRVJFbHZsRUZEck1jWEtjaFlpQ2Q5OFRIVS9ZK3doWDhRZ1VXdHZzYXVHaTAvQzFrVmZuU0Q4Cm9SN0Z3SStpc1g0S0pwbjE1R2t2bUIwdDlkbXBzaDNsR3dJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWQKRHdFQi93UUVBd0lCaGpBZEJnTlZIUTRFRmdRVTdOZmpndEp4WFdSTTN5NW5QK2U2bUs0Y0QwOHdEUVlKS29aSWh2Y05BUUVNQlFBRApnZ0lCQUx0aDJYMnBiTDRYeEpFYnc2R2lBSTNqWkdnUFZzOTNybkQ1L1pwS21ibkplRndNREYvazVoUXBWZ3MyU1YxRVkrQ3RuSllZClpoc2pEVDE1NlcxcjFsVDQwanpCUTBDdUhWRDFVdnlRTzd1WW1XbHJ4OEducUdpa0o5eWQrU2V1TUlXNTltZE5PajZQV1RraVUwVHIKeUYwRHl1MVFlbjFpSVFxQXlITm0wYUFGWUYvb3BiU25yNmozYlRXY2ZGcUsxcUk0bWZONGkvUk4waUFMM2dUdWpKdEhnWElOd0JReQo3ekJaTHE3Z2NmSlc1R3FYYjVKUWJaYU5hSHFhc2pZVWVnYnlKTGtKRVZEWENMRzRpWHFFSTJGQ0tlV2p6YUlnUWRmUm5HVFo2aWFoCml4VFhUQm15VUVGeFBUOU5jQ09HREVyY2dkTE1NcFNFRFFnSmx4eFB3TzVySUhRdzB1QTVOQkNGSVJVQkNPaFZNdDV4U2Rrb0YxQk4KNXI1TjBYV3MwTXI3UWJoRHBhclR3d1ZFVHl3Mm0rTDY0a1c0STFOc0JtOW5WWDlHdFV3L2JpaGFlU2JTcEtoaWw5SWU0dTFLaTd3YgovVWRLRGQ5blpuNnlXMEhRTytUME8vUUVZK252d2xRQVVhQ0tLc25PZU16VjZvY0VHTFBPcjBtSXIvT1NtYmF6NW1FUDBvVUE1MUFhCjVCdVZuUm1odVp5eG03RUFIdS9RRDA5Q2JNa0t2TzVEK2pweHBjaE5KcVUxL1lsZHZJVmlIVExTb0N0VTdacFh3ZHY2RU04WnQ0dEsKRzQ4QnRpZVZVK2kyaVcxYnZHalVJK2lMVWFKVytmQ21nS0RXSHJPOER3OVRkU21xNmhOMzVONk1nU0d0QnhCSEVhMkhQUWZSZGJ6UAo4MlorCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjJEQ0NBOENnQXdJQkFnSVFUS3I1eXR0amIrQWY5MDdZV3dPR25UQU5CZ2txaGtpRzl3MEJBUXdGQURDQmhURUxNQWtHQTFVRQpCaE1DUjBJeEd6QVpCZ05WQkFnVEVrZHlaV0YwWlhJZ1RXRnVZMmhsYzNSbGNqRVFNQTRHQTFVRUJ4TUhVMkZzWm05eVpERWFNQmdHCkExVUVDaE1SUTA5TlQwUlBJRU5CSUV4cGJXbDBaV1F4S3pBcEJnTlZCQU1USWtOUFRVOUVUeUJTVTBFZ1EyVnlkR2xtYVdOaGRHbHYKYmlCQmRYUm9iM0pwZEhrd0hoY05NVEF3TVRFNU1EQXdNREF3V2hjTk16Z3dNVEU0TWpNMU9UVTVXakNCaFRFTE1Ba0dBMVVFQmhNQwpSMEl4R3pBWkJnTlZCQWdURWtkeVpXRjBaWElnVFdGdVkyaGxjM1JsY2pFUU1BNEdBMVVFQnhNSFUyRnNabTl5WkRFYU1CZ0dBMVVFCkNoTVJRMDlOVDBSUElFTkJJRXhwYldsMFpXUXhLekFwQmdOVkJBTVRJa05QVFU5RVR5QlNVMEVnUTJWeWRHbG1hV05oZEdsdmJpQkIKZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ1I2RlNTMGdwV3Nhd05KTjNGejBSbgpkSmtyTjZOOUkzQUFjYnhUMzhUNktoS1BTMzhRVnIyZmNISzNZWC9KU3c4WHB6M2pzQVJoN3Y4Umw4ZjBoajRLK2o1YytaUG1OSHJaCkZHdm5uTE9Gb0lKNmRxOXhrTmZzL1EzNm5HejYzN0NDOUJSKytiN0VwaTlQZjVsL3RmeG5RM0s5REFEV2lldHJMTlB0ajVnY0ZLdCsKNWVOdS9OaW81SklrMmtOcllyaFYvZXJCdkd5MmkvTU9qWnJrbTJ4cG1maDRTREJGMWEzaERUeEZZUHd5bGxFbnZHZkR5aTYyYStwRwp4OGNnb0xFZlpkNUlDTHFrVHFueWcwWTNoT3ZveklGSVEyZE9jaXFiWEwxTUd5aUtYQ0o3dEt1WTJlN2dVWVBEQ1VaT2JUNlorcFVYCjJud3pWMEU4alZIdEM3WmNyeXhqR3Q5WHlEKzg2VjNFbTY5Rm1lS2pXaVMwdXFsV1BjOXZxdjlKV0w3d3FQLzB1SzNwTi91NnVQUUwKT3Zub1EwSWVpZGlFeXhQeDJidmhpV0M0akNoV3JCUWRuQXJuY2V2UER0MDlxWmFoU0wwODk2KzFEU0pNd0JHQjdGWTc5dE9pNGx1MwpzZ1FpVXBXQWsybm9qa3hsOFpFRExYQjBBdXFMWnhVcGFWSUN1OWZmVUdwVlJyK2dveWhoZjNEUXc2S3FMQ0dxUjg0b25BWkZkcitDCkdDZTAxYTYweTFEbWEvUk1obkV3NmFiZkZvYmcyUDlBM2Z2UVFvaC9vek02TGx3ZVFSR0JZODRZY1dzcjdLYUt0ekZjT21wSDRNTjUKV2RZZ0dxL3lhcGlxY3J4WFN0SkxuYnNRL0xCTVFlWHRIVDFlS0oyY3pMK3pVZHFuUitXRVV3SURBUUFCbzBJd1FEQWRCZ05WSFE0RQpGZ1FVdTY5K0FqMzZwdkU4aEk2dDdqaVk3Tmt5TXRRd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3CkRRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFBcngxVWFFdDY1UnUyeXlUVUVVQUpOTW5Ndmx3RlRQb0NXT0F2bjlzS0lOOVNDWVBCTXQKckZhaXNOWitFWkxwTHJxZUxwcHlzYjBaUkd4aE5hS2F0QllTYVZxTTRkYytwQnJvTHdQMHJtRWRFQnNxcEl0NnhmNEZwdUhBMXNqKwpucTZQSzdvOW1malljd2xZUm02bW5QVFhKOU9WMmplRGNoelRjK0NpUjVrRE9GM1ZTWGtBS1J6SDdKc2dIQWNrYVZkNHNqbjhPb1NnCnRaeDhqYjh1azJJbnR6bmFGeGl1dlR3SmFQK0VtenpWMWdzRDQxZWVGUGZSNjAvSXZZY2p0N1pKUTNtRlhMcnJrZ3VoeHVob3FFd1cKc1JxWkN1aFRMSks3b1FrWWRReGxxSHZMSTdjYXdpaUZ3eHYvMEN0aTc2UjdDWkdZWjR3VUFjMW9CbXBqSVhVRGdJaUtib0hHaGZLcApwQzNuOUtVa0VFZUR5czMwalhsWXNRYWI1eG9xMlowQjE1Ujk3UU5LeXZEYjZLa0JQdlZXbWNrZWprazl1K1VKdWVCUFNaSTlGb0pBCnpNeFp4dVk2N1JJdWFUeHNsYkg5cWgxN2Y0YStIZzR5UnZ2N0U0OTFmMHlMUzBaai9nQTBRSERCdzdtaDNhWnc0Z1N6UWJ6cGdKSHEKWkp4NjRTSURxWnh1Ync1bFQyeUhoMTd6YnFENWRhV2JRT2hUc2llZFNybkFkeUdOLzRmeTNyeU03eGZmdDBrTDBmSnVNQXNhRGs1Mgo3Ukg4OWVsV3NuMi94MjBLazR5bDBNQzJIYjQ2VHBTaTEyNXNDOEtLZlBvZzg4VGs1YzBOcU11UmtyRjhoZXkxRkdsbURvTG56YzdJCkxhWlJmeUhCTlZPRkJrcGRuNjI3RzE5MAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzakNDQThhZ0F3SUJBZ0lRQWYxdE1QeWp5bEdvRzd4a0RqVURMVEFOQmdrcWhraUc5dzBCQVF3RkFEQ0JpREVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRSwpFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3SGhjTk1UQXdNakF4TURBd01EQXdXaGNOTXpnd01URTRNak0xT1RVNVdqQ0JpREVMTUFrR0ExVUUKQmhNQ1ZWTXhFekFSQmdOVkJBZ1RDazVsZHlCS1pYSnpaWGt4RkRBU0JnTlZCQWNUQzBwbGNuTmxlU0JEYVhSNU1SNHdIQVlEVlFRSwpFeFZVYUdVZ1ZWTkZVbFJTVlZOVUlFNWxkSGR2Y21zeExqQXNCZ05WQkFNVEpWVlRSVkpVY25WemRDQlNVMEVnUTJWeWRHbG1hV05oCmRHbHZiaUJCZFhSb2IzSnBkSGt3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ0FFbVVYTmc3RDJ3aXoKMEt4WERYYnR6U2ZUVEsxUWcySGlxaUJOQ1Mxa0Nkek9pWi9NUGFuczlzL0IzUEhUc2RaN055Z1JLMGZhT2NhOE9obTBYNmE5ZloyagpZMEsyZHZLcE95dVIrT0p2ME93V0lKQUpQdUxvZE1rWXRKSFVZbVRiZjZNRzhZZ1lhcEFpUEx6K0UvQ0hGSHYyNUIrTzFPUlJ4aEZuClJnaFJ5NFlVVkQrOE0vNStiSnovRnAwWXZWR09OYWFuWnNoeVo5c2hackhVbTNnRHdGQTY2TXp3M0x5ZVRQNnZCWlkxSDFkYXQvL08KK1QyM0xMYjJWTjNJNXhJNlRhNU1pcmRjbXJTM0lEM0tmeUkwcm40N2FHWUJST2NCVGtaVG16Tmc5NVMrVXplUWMwUHpNc05UNzl1cQovblJPYWNkcmpHQ1Qzc1RIRE4vaE1xN01renRSZUpWbmkrNDlWdjRNMEdrUEd3L3pKU1pyTTIzM2JrZjZjMFBsZmc2bFpyRXBmREtFClkxV0p4QTNCazFRd0dST3MwMzAzcCt0ZE9tdzFYTnRCMXhMYXFVa0wzOWlBaWdtVFlvNjFaczhsaU0yRXVMRS9wRGtQMlFLZTZ4Sk0KbFh6emF3V3BYaGFEekxobjR1Z1RuY3hiZ3ROTXMrMWIvOTdsYzZ3ak95MEF2elZWZEFsSjJFbFlHbitTTnVaUmtnN3pKbjBjVFJlOAp5ZXhESnRDL1FWOUFxVVJFOUpublY0ZWVVQjlYVktnKy9YUmpMN0ZRWlFubVdFSXVReHBNdFBBbFIxbjZCQjZUMUNaR1NsQ0JzdDYrCmVMZjhaeFhoeVZlRUhnOWoxdWxpdXRaZlZTN3FYTVlvQ0FRbE9iZ09LNm55VEpjY0J6OE5Vdlh0N3krQ0R3SURBUUFCbzBJd1FEQWQKQmdOVkhRNEVGZ1FVVTNtL1dxb3JTczlVZ09IWW04Q2Q4cklEWnNzd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRgpNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFGelVmQTNQOXdGOVFabGxESFBGVXAvTCtNK1pCbjhiMmtNVm41NENWVmVXCkZQRlNQQ2VIbENqdEh6b0JONkoyL0ZOUXdJU2J4bXRPdW93aFQ2S09WV0tSODJrVjJMeUk0OFNxQy8zdnFPbExWU29HSUcxVmVDa1oKN2w4d1hFc2tFVlgvSkpwdVhpb3I3Z3RObjMvM0FUaVVGSlZEQnduN1lLbnVIS3NTaktDYVhxZVlhbGx0aXo4SSs4alJSYThZRldTUQpFZzl6S0M3RjRpUk8vRmpzOFBSRi9pS3o2eStPMHRsRllRWEJsMitvZG5LUGk0dzJyNzhOQmM1eGplYW1ieDlzcG5GaXhkalFnM0lNCjhXY1JpUXljRTB4eU5OKzgxWEhmcW5IZDRibHNqRHdTWFdYYXZWY1N0a05yLytYZVRXWVJVYytacnV3WHR1aHhrWXplU2Y3ZE5YR2kKRlNlVUhNOWg0eWE3YjZObkpTRmQ1dDBkQ3k1b0d6dUNyK3lEWjRYVW1GRjBzYm1aZ0luL2YzZ1pYSGxLWUM2U1FLNU1OeW9zeWNkaQp5QTVkOXpaYnl1QWxKUUcwM1JvSG5IY0FQOURjMWV3OTFQcTdQOHlGMW05L3FTM2Z1UUwzOVplYXRUWGF3MmV3aDBxcEtKNGpqdjljCkoydmhzRS96Qis0QUx0UlpoOHRTUVpYcTlFZlg3bVJCVlh5TldRS1YzV0tkd3JudVdpaDBoS1didDVESERBZmY5WWsyZERMV0tNR3cKc0F2Z25FekRITmI4NDJtMVIwYUJMNktDcTlOalJIREVqZjh0TTdxdGozdTFjSWl1UGhuUFFDalkvTWlRdTEyWkl2VlM1bGpGSDRneApRKzZJSGRmR2pqeERhaDJuR041OVBSYnhZdm5La0tqOQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVU0VSVHJ1c3QgRUNDIENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqekNDQWhXZ0F3SUJBZ0lRWEl1WnhWcVV4ZEp4VnQ3TmlZRE1KakFLQmdncWhrak9QUVFEQXpDQmlERUxNQWtHQTFVRUJoTUMKVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVQphR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dIaGNOTVRBd01qQXhNREF3TURBd1doY05Nemd3TVRFNE1qTTFPVFU1V2pDQmlERUxNQWtHQTFVRUJoTUMKVlZNeEV6QVJCZ05WQkFnVENrNWxkeUJLWlhKelpYa3hGREFTQmdOVkJBY1RDMHBsY25ObGVTQkRhWFI1TVI0d0hBWURWUVFLRXhWVQphR1VnVlZORlVsUlNWVk5VSUU1bGRIZHZjbXN4TGpBc0JnTlZCQU1USlZWVFJWSlVjblZ6ZENCRlEwTWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRYXJGUmFxZmxvSStkNjFTUnZVOFphMkV1cnh0VzIKMGVaemNhN2RuTllNWWYzYm9Ja0R1QVVVN0ZmTzdsMC80aUd6enZmVWlubmdvNE4rTFpmUVljVHhtZHdsa1dPcmZ6Q2p0SERpeDZFegpuUE8vTGx4VHNWK3pmVEovaWpUamVYbWpRakJBTUIwR0ExVWREZ1FXQkJRNjRRbUcxTThad3BaMmRFbDIzT0ExeG1Oam1qQU9CZ05WCkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05vQURCbEFqQTJaNkVXQ056a2x3QkIKSFU2KzRXTUJ6enVxUWhGa29KMlVPUUlSZVZ4N0hmcGt1ZTRXUXJPL2lzSUp4T3prc1UwQ01RRHBLbUZIakZKS1MwNFljUGJXUk5adQo5WU82YlZpOUpObFdTT3J2eEtKR2dZaHFPa2JScVp0TnlXSGEwVjFYYWhnPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIEVDQyBSb290IENBIC0gUjUKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSGpDQ0FhU2dBd0lCQWdJUllGbEo0Q1l1dTFYNUNuZUtjZmxLMkd3d0NnWUlLb1pJemowRUF3TXdVREVrTUNJR0ExVUVDeE1iClIyeHZZbUZzVTJsbmJpQkZRME1nVW05dmRDQkRRU0F0SUZJMU1STXdFUVlEVlFRS0V3cEhiRzlpWVd4VGFXZHVNUk13RVFZRFZRUUQKRXdwSGJHOWlZV3hUYVdkdU1CNFhEVEV5TVRFeE16QXdNREF3TUZvWERUTTRNREV4T1RBek1UUXdOMW93VURFa01DSUdBMVVFQ3hNYgpSMnh2WW1Gc1UybG5iaUJGUTBNZ1VtOXZkQ0JEUVNBdElGSTFNUk13RVFZRFZRUUtFd3BIYkc5aVlXeFRhV2R1TVJNd0VRWURWUVFECkV3cEhiRzlpWVd4VGFXZHVNSFl3RUFZSEtvWkl6ajBDQVFZRks0RUVBQ0lEWWdBRVIwVU9sdnQ5WGIvcE9kRWgrSjhMdHRWN0hwSTYKU0ZrYzhHSXhMY0I2S1A0YXAxeXp0c3lYNTBYVVdQclJkMjFEb3NDSFpUUUtIM3JkNnp3em9jV2RUYVJ2UVpVNGY4a2VoT3ZSbmttUwpoNVNIRERxRlNtYWZuVm1UVFpkaEJvWktvMEl3UURBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkCkJnTlZIUTRFRmdRVVBlWXBTSnZxQjhvaFJFb20zbTdlMG9QUW4xa3dDZ1lJS29aSXpqMEVBd01EYUFBd1pRSXhBT1ZwRXNsdTI4WXgKdWdsQjRaZjQrLzJhNG4wU3llMThaTlBMQlNXTFZ0bWc1MTVkVGd1RG5GdDJLYUFKSmlGcVlnSXdjZEsxajF6cU8rRjRDWVdvZFpJNwp5Rno5U084TmRDS29DT0p1eFVuT3h3eThwMkZwOGZjNzRTckwrU3Z6WnBBMwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENBIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWURDQ0EwaWdBd0lCQWdJUUNnRkNnQUFBQVVVanlFUzFBQUFBQWpBTkJna3Foa2lHOXcwQkFRc0ZBREJLTVFzd0NRWURWUVFHCkV3SlZVekVTTUJBR0ExVUVDaE1KU1dSbGJsUnlkWE4wTVNjd0pRWURWUVFERXg1SlpHVnVWSEoxYzNRZ1EyOXRiV1Z5WTJsaGJDQlMKYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRneE1qSXpXaGNOTXpRd01URTJNVGd4TWpJeldqQktNUXN3Q1FZRFZRUUdFd0pWVXpFUwpNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU2N3SlFZRFZRUURFeDVKWkdWdVZISjFjM1FnUTI5dGJXVnlZMmxoYkNCU2IyOTBJRU5CCklERXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDblVCbmVQNWs5MURORzhXOVJZWUt5cVUrUFo0bGQKaE5sVDNRd28yZGZ3LzY2VlEzS1orYlZkZklyQlF1RXhVSFRSZ1ExOHpac2hxMFBpcksxZWhtN3pDWW9mV2pLOW91dVUrZWhjQ3V6LwptTkt2Y2JPMFU1OU9oKytTdkwzc1R6SXdpRXNYWGxmRVU4TDJBcGVOMldJcnZ5UWZZbzNmdzdncFMwbDRQSk5naUNMOG1kbzJ5TUtpCjFDeFVBR2MxYm5PL0FsandwTjNsc0tJbWVzcmdOcVVaRnZYOXQrK3VQMEQxYlZvRS9jNDB5aVRjZENNYlhUTVRFbDNFQVNYMk1OMEMKWFovZzFVZTl0T3Nib2J0SlNkaWZXd0x6aXVRa2tPUmlUMC9CcjRzT2RCZW8wWEtJYW5vQlNjeTBSbm5HRjdIYW1CNEhXZnAxSVlWbAozWkJXenZ1cnBXQ2R4SjM1VXJDTHZZZjVqeXNqQ2lOMk8vY3o0Y2tBODJuNVM2TGdUcngra3ptRUIvZEVjSDcrQjFybHNhelJHTXp5Ck5lVkpTUWpLVnNrOSt3OFlmWXM3d1JQQ1RZL0pUdzQzNlIraERtcmZZaTdMTlFaUmVTeklKVGowK2t1bmlWeWMwdU1OT1laS2RIelYKV1lmQ1AwNE1YRkwwUGZkU2d2SHFvNno5U1RRYUtQTkJpRG9UN3VqZS81a2RYN3JMNkI3eXVWQmd3REhUYytYdnZxRHRNd3QwdmlBZwp4R2RzOEFnRGVsV0FmMFpPbHFmMEhqN2g5dGdKNFROa0syUFhNbDZmK2NCN0QzaHZsN3lUbXZtY0VwQjRlb0NIRmRkeWRKeFZkSGl4CnV1RnVjQVM2VDZDNmFNTjcvekh3Y3owOWxDcXhDMEVPb1A1TmlHVnJlVE8wMXdJREFRQUJvMEl3UURBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVTdVUVp3TlB3Qm92dXBIdStRdWNtVk1pT05uWXdEUVlKS29aSQpodmNOQVFFTEJRQURnZ0lCQUEydWtETDJwa3Q4UkhZWllSNG5LTTFlVk84bHZPTUlrUGtwMTY1b0NPR1VBRmp2TGk1K1UxS010bHdICjZvaTZtWXRRbE5lQ2dOOWhDUUNUclEwVTVzN0I4amVVZUxCZm5MT2ljN2lQQlpNNHpZMCtzTGo3d00reDh1d3RMUnZNN0txYXM2cGcKZ2hzdE84T0VQVmVLbGg2Y2RialRNTTFnQ0lPUTA0NVU4VTFtd0YxMEEwQ2o3b1Yrd2g5M25BYm93YWNZWFZLVjdjbmRKWjV0K3FudApvem8wMEZsNzJ1MVE4elcvN2VzVVRUSEhZUFRhOFllYzRraml4c1UzK3dZUStuVlpaakZIS2RwMm1oenBncTd2bXJsUjk0Z2ptbW1WCllqemxWWUEyMTFRQy8vRzVYYzdVSTIvWVJZUktXMlh2aVF6ZEZLY2d5eGlsSmJRTitRSHdvdEwwQU1oMGpxRXFTSTVsMnhQRTRpVVgKZmV1K2gxc1hJRlJSazBwVEF3dnNYY296N1dMOVJjY3ZXOXhZb0lBNTV2clgvaE1VcHUwOWxFcENkTlREZDFsenpZOUd2bFU0Ny9ybwprVExxbDFnRUl0NDR3OHk4YmNrek9tb0thVCtneU9weWo0eGpoaU85YlR5V25wWGdTVXlxb3JrcUc1dzJnWGp0dytoRzRpWlpSSFVlCjJYV0pVYzBRaEoxaFlNdGQrWmNpVFk2WTV1Ti85bHU3cnMzS1NvRnJYZ3Z6VWVGMEsrbCtKNmZabVVsTytLV0EyeVVQSEdOaWlza3oKWjJzOEVJUEdyZDZvelJhT2pmQUhOM0dmOHF2OFFmWEJpK3dBTjEwSjVVNkE3L3F4WERnR3BSdEs0ZHc0TFR6Y3F4K1FHdFZLbk83UgpjR3pNN3ZSWCtCaTZoRzZICi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCklkZW5UcnVzdCBQdWJsaWMgU2VjdG9yIFJvb3QgQ0EgMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaakNDQTA2Z0F3SUJBZ0lRQ2dGQ2dBQUFBVVVqejBaOEFBQUFBakFOQmdrcWhraUc5dzBCQVFzRkFEQk5NUXN3Q1FZRFZRUUcKRXdKVlV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdVZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdgpjaUJTYjI5MElFTkJJREV3SGhjTk1UUXdNVEUyTVRjMU16TXlXaGNOTXpRd01URTJNVGMxTXpNeVdqQk5NUXN3Q1FZRFZRUUdFd0pWClV6RVNNQkFHQTFVRUNoTUpTV1JsYmxSeWRYTjBNU293S0FZRFZRUURFeUZKWkdWdVZISjFjM1FnVUhWaWJHbGpJRk5sWTNSdmNpQlMKYjI5MElFTkJJREV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzJJcFQ4cEVpdjZFZHJDdnNuZHVUeQpQNG83ZWtvc01TcU1qYkNwd3pGcnFIZDJoQ2EycklGQ0RRanJWVmk3ZXZpOFpYM3lvRzJMcUVmcFluWWVFZTRJRk5HeVJCYjA2dEQ2CkhpOWUyOHR6UWE2OEFMQktLMEN5ck9FN1M4SXRuZVNobSt3YU9oN3dDTFBRNUNRMUI1K2N0TWxTYmRzSHlvKzFXL0NEODAvSExhWEkKcmN1VklLUXhLRmRZV3VTTkc1cXJuZzBNOGdvek9TSTVDcGN1ODFOM3VVUkYvWVRMTmlDQldTMmFiMjFJU0dIS1ROOVQwYTlTdkVTZgpxeTlyZzNMdmRZRGFCak1iWGNqYVk4Wk56YXhtTWMzUjNqNkhFRGJodWFSNjcyQlFzc3ZLcGxiZ042K3JOQk01SmVnNVp1U1llcW9TCm1KeFpab1krcmZHd3lqNEdEM3Z3RVVzM29FUnRlOHVvakhIMDFiV1JOc3p3RmNZcjNsRVhzWmRNVUQyeGxWbDhCWDB0SWRVQXZ3Rm4Kb2w1N3Bsenk5eUx4a0EyVDI2cEVVV2JNZlhZRDYycW9LamdabDNZTmE0cGgrYnoyN25iOWNDdmRLVHo0Q2g1YlFoeUxWaTlWR3h5aApMclhIRnViNHFqeVNqbW0yQWNHMWhwMkpEd3M0bEZUbzZ0eWVQU1c4VXlidDFhczVxc1ZBVEZTcnNyVFoyZmpYY3RzY3ZHMjlaVi92CmlEVXFaaS91OXJObDhET05mSmhCYVVZUFF4eHArcHUxMEdGcXpjcEwyVXlRUnFzVldhRkhWQ2t1Z3loZkhNS2lxM0lYQUFhT1JleUwKNGpNOWY5b1pST1JpY3NQZklzYnlWdFRkWDVWeTdXMWY5MGdEVy8zRktxRDJjeU9FRUJzQjV3SURBUUFCbzBJd1FEQU9CZ05WSFE4QgpBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU0M0hnbnRpblF0bmJjWkZybEpQcnc2UFJGS013CkRRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFFZjYzUXF3RVpFNHJVMWQ5K1VPbDFRWmdraUhWSXlxWkpuWVd2NklBY1ZZcFpteEkxUWoKdDJvZElGZmxBV0pCRjlNSjIzWExibFNRZGY0YW40RUt3dDNYOXduUVczSVY1QjRKYWowejh5R2E1aFYrclZIVkRSRHRmVUxBais3QQptZ2pWUWRaY0RpRnBib0JoRGhYQXVNL0ZTUkpTekw0NnpOUXVPQVhlTmYwZmI3aUFhSmc5VGFES1FHWFNjM3oxaTlrS2xUL1lQeU50Ckd0RXFKQm5aaGJNWDczaHVxVmpSSTlQSEUrMXlKWDlkc1hOdzBIOEdsd21FS1lCaEhmcGUvM09zb09PSnVCeHhGY2JlTVg4UzNPRnQKbTYvbjZKOTFlRXlyUmp1YXpyOEZHRjFORlR3V21obFFCSnF5bW05bGkxSmZQRmdFS0NYQVptRXhmcm5nZGJrYXFJSFdjaGV6eFFNeApOUkY0ZUtMZzZUQ01mNERmV044OHVpZVc0b0EwYmVPWTAyUW5yRWgrS0hkY3hpVmhKZmlGREdYNnhESXZwWmdGNVBnTFp4WVd4b0s0Ck1objUrYmw1M0IvTjY2K3JEdDBiMjBYa2V1Y0M0cFZkL0dud1UybGhsWFY1QzE1VjVqZ2NsS2xaTTU3SWNYUjVmMUdKdHNocXVEREkKYWpqRGJwN2hOeGJxQldKTVd4Skg3YWUwczFoV3gwbnpmeEpvQ1RGeDhHMzRUa2Y3MW9YdXhWaEFHYVFkcC9sTFF6ZmNhRnBQeit2QwpaSFRldEJYWjlGUlVHaThjMTVkeFZKQ08yU0NkVXl0L3E0L2k2akM4VURmdjhVZTFmWHdzQk94b25iUkpSQkQwY2tzY1pPZjg1bXVRCjNXbDlhZjBBVnFXM3JMYXR0OG8rQWUrYwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpFbnRydXN0IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRVBqQ0NBeWFnQXdJQkFnSUVTbE9NS0RBTkJna3Foa2lHOXcwQkFRc0ZBRENCdmpFTE1Ba0dBMVVFQmhNQ1ZWTXhGakFVQmdOVgpCQW9URFVWdWRISjFjM1FzSUVsdVl5NHhLREFtQmdOVkJBc1RIMU5sWlNCM2QzY3VaVzUwY25WemRDNXVaWFF2YkdWbllXd3RkR1Z5CmJYTXhPVEEzQmdOVkJBc1RNQ2hqS1NBeU1EQTVJRVZ1ZEhKMWMzUXNJRWx1WXk0Z0xTQm1iM0lnWVhWMGFHOXlhWHBsWkNCMWMyVWcKYjI1c2VURXlNREFHQTFVRUF4TXBSVzUwY25WemRDQlNiMjkwSUVObGNuUnBabWxqWVhScGIyNGdRWFYwYUc5eWFYUjVJQzBnUnpJdwpIaGNOTURrd056QTNNVGN5TlRVMFdoY05NekF4TWpBM01UYzFOVFUwV2pDQnZqRUxNQWtHQTFVRUJoTUNWVk14RmpBVUJnTlZCQW9UCkRVVnVkSEoxYzNRc0lFbHVZeTR4S0RBbUJnTlZCQXNUSDFObFpTQjNkM2N1Wlc1MGNuVnpkQzV1WlhRdmJHVm5ZV3d0ZEdWeWJYTXgKT1RBM0JnTlZCQXNUTUNoaktTQXlNREE1SUVWdWRISjFjM1FzSUVsdVl5NGdMU0JtYjNJZ1lYVjBhRzl5YVhwbFpDQjFjMlVnYjI1cwplVEV5TURBR0ExVUVBeE1wUlc1MGNuVnpkQ0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUMwZ1J6SXdnZ0VpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQkR3QXdnZ0VLQW9JQkFRQzZoTFp5MjU0TWErS1o2VEFCcDNicU1yaVZRUnJKMm1GT1dITFAKL3ZhQ2ViOXpZUVlLcFNmWXMxL1RSVTRjY3RaT012SnlpZy8zZ3huUWFvQ0FBRVVlc01mbm1yOFNWeWNjbzJndkNvZTlhbXNPWG1YegpISGZWMUlXTmNDRzBzekxuaTZMVmhqa0NzYmpTUjg3a3lVbkVPNmZlKzFSOVY3N3c2RzdDZWJJNkMxWGlVSmdXTWhOY0wzaFd3Y0tVCnMvSmE1Q2VhbnlUWHh1elFteVdDNDh6Q3hFWEZqSmQ2Qm1zcUVaK3BDbTVJTzIvYjFCRVpRdmVQQjcvMVUxK2NQdlFYTE9acHJFNHkKVEdKMzZyZm81YnMwdkJtTHJweFI1N2QrdFZPeE15TGxiYzl3UEJyNjRwdG50b1AwamFXdllreE40RmlzWkRRU0EvaTJqWlJqSktSeApBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUnFjaVo2CjBCN3ZmZWM3YVZIVWJJMmZrQkptcXpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQVFFQWVaOGRsc2EyZVQ4aWpZZlRod01FWUdwcm1pNVoKaVhNUnJFUFI5UlAvalRrcndQSzlUM0NNcVMvcUY4UUxWSjdVRzVhWU16eW9yV0tpQUhhcldXbHVCaDEreExsRWpaaXZFdFJoMndvWgpSa2Z6Ni9kandVQUZRS1hTdC9TMW1qYS9xWWgyaUFSVkJDdWNoMzhhTnp4K0xhVWEyTlNKWHNxOXJEMXMyRzJ2MWZOMkQ4MDdpRGdpCm5XeVRtc1E5djRJYlpUK21EMTJxL09XeUZjcTFyY2E4UGRDRTZPb0djckJOT1RKNHZ6NFJuQXVrblpvaDgvQ2JDekI0MjhIY2gwUCsKdkdPYXlzWENITW5IamY4N0VsZ0k1clk5N0hvc1R2dURsczRNUEdtSFZIT2tjOEtULzFFUXJCVlVBZGo4QmJHSm9YOTBnNXBKMTl4TwplNHBJYjR0RjlnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRUMxCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQytUQ0NBb0NnQXdJQkFnSU5BS2FMZVNrQUFBQUFVTkNSK1RBS0JnZ3Foa2pPUFFRREF6Q0J2ekVMTUFrR0ExVUVCaE1DVlZNeApGakFVQmdOVkJBb1REVVZ1ZEhKMWMzUXNJRWx1WXk0eEtEQW1CZ05WQkFzVEgxTmxaU0IzZDNjdVpXNTBjblZ6ZEM1dVpYUXZiR1ZuCllXd3RkR1Z5YlhNeE9UQTNCZ05WQkFzVE1DaGpLU0F5TURFeUlFVnVkSEoxYzNRc0lFbHVZeTRnTFNCbWIzSWdZWFYwYUc5eWFYcGwKWkNCMWMyVWdiMjVzZVRFek1ERUdBMVVFQXhNcVJXNTBjblZ6ZENCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNQpJQzBnUlVNeE1CNFhEVEV5TVRJeE9ERTFNalV6TmxvWERUTTNNVEl4T0RFMU5UVXpObG93Z2I4eEN6QUpCZ05WQkFZVEFsVlRNUll3CkZBWURWUVFLRXcxRmJuUnlkWE4wTENCSmJtTXVNU2d3SmdZRFZRUUxFeDlUWldVZ2QzZDNMbVZ1ZEhKMWMzUXVibVYwTDJ4bFoyRnMKTFhSbGNtMXpNVGt3TndZRFZRUUxFekFvWXlrZ01qQXhNaUJGYm5SeWRYTjBMQ0JKYm1NdUlDMGdabTl5SUdGMWRHaHZjbWw2WldRZwpkWE5sSUc5dWJIa3hNekF4QmdOVkJBTVRLa1Z1ZEhKMWMzUWdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0F0CklFVkRNVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJJUVR5ZEM2YlVGNzRtelE2MVZmWmdJYUpQUmJpV2xINDdqQ2ZmSHkKQXNXZm9QWmIxWXNHR1laUFV4QnRCeVFub2FENDFVY1pZVXg5eXBNbjZuUU03MitXQ2Y1ajdIQmROcTFuZDY3Sm5YeFZSRHFpWTFFZgo5ZU5pMUtsSEJ6N01JS05DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFCkZMZGo1eHJkamVrSXBsV0RwT0JxVUVGbEVVSkpNQW9HQ0NxR1NNNDlCQU1EQTJjQU1HUUNNR0Y1Mk9WQ1I5OGNybE9aRjdadkhIM2gKdnhHVTBRT0lkZVNOaWFTS2QwYmViV0h2QXZYN3RkL00vazcvL3FubXB3SXdXNW5YaFRjR3RYc0kvZXNuaTBxVStlSDZwNDRtQ09oOAprbWh0Yzlodkpxd2hBcmladHlaQld5VmdydEJJR3U0RwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDRkNBIEVWIFJPT1QKPT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGalRDQ0EzV2dBd0lCQWdJRUdFck0xakFOQmdrcWhraUc5dzBCQVFzRkFEQldNUXN3Q1FZRFZRUUdFd0pEVGpFd01DNEdBMVVFCkNnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJVd0V3WURWUVFEREF4RFJrTkIKSUVWV0lGSlBUMVF3SGhjTk1USXdPREE0TURNd056QXhXaGNOTWpreE1qTXhNRE13TnpBeFdqQldNUXN3Q1FZRFZRUUdFd0pEVGpFdwpNQzRHQTFVRUNnd25RMmhwYm1FZ1JtbHVZVzVqYVdGc0lFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1TVJVd0V3WURWUVFECkRBeERSa05CSUVWV0lGSlBUMVF3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRFhYV3ZORUQ4ZkJWblYKQlUwM3NRN3NtQ3VPRlIzNmswc1hnaUZ4RUZMWFVXUndGc0pWYVUyT0ZXMmZ2d3did3VDalo5WU1yTThpcnE5M1ZDcExUSXBUVW5yRAo3aTdlczNFbHdlbGRQZTZoTDZQM0tqekpJeDFxcXgyaHAvSHo3S0RWUk04VnozSXZIV09YNkpuNS9aT2tWSUJNVXRSU3F5NUozNUROCnVGKytQOTZoeWswZzFDWG9oQ2xUdDdHSUgvLzYycENmQ3FrdFFUK3g4UmdwN2haWkxEUkpHcWdHMTZpSTBnTnllakxpNm1oTmJpeVcKWlh2S1dmcnk0dDN1TUN6N3pFYXN4R1ByYjM4Mkt6UnpFcFIvMzh3bW52RnlYVkJsV1k5cHM0ZGVNbS9ER0lxMWxZK3dlamZlV2tVNwp4emJoNzJmUk9kT1hXM05pR1VndGh4d0crM1NZSUVsejhBWFNHN0dnbzdjYmNOT0lhYmxhMWpqMFl0d2xpM2kvK09oK3VGekpsVTlmCnB5MjVJR3ZQYTkzMURmU0N0L1N5Wmk0UUtQYVhXbnVXRm84QkdTMXNibjg1V0Faa2d3R0RnOE5Oa3QweXhvZWtOK2tXenFvdGFLOEsKZ1dVNmNNR2JyVTF0Vk1vcUxVdUZHN09BNW5CRkRXdGVOZkIvTzdpYzVBUndpUklsazlvS21TSmdhbU5nVG5ZR21FNjlnNjBkV0lvbApoZExIWlI0dGpzYmZ0c2JoZjRvRUlSVXBkUEErbkpDZERDN3hpajVhcWd3SkhzZlZQS1B0bDhNZU5QbzQrUWdPNDhCZEs0UFJWbXJKCnRxaFVVeTU0TW1jOWduOTAwUHZodGdWZ3VYRGJqZ3Y1RTFodmNXQVFVaEM1d1VFSjczSWZaekY0LzVZRmpRSURBUUFCbzJNd1lUQWYKQmdOVkhTTUVHREFXZ0JUai9pMzlLTkFMdGJxMm9zUy9CcW9GakpQN0x6QVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQgovd1FFQXdJQkJqQWRCZ05WSFE0RUZnUVU0LzR0L1NqUUM3VzZ0cUxFdndhcUJZeVQreTh3RFFZSktvWklodmNOQVFFTEJRQURnZ0lCCkFDWEd1bXZyaDh2ZWdqbVdQZkJFcDJ1RWN3UGVuU3RQdWlCL3ZIaXl6NWV3RzV6ejEza3U5VWkyMHZzWGlPYlRlai90VXhQUTRpOXEKZWNzQUl5am1IamRYTlltRXduWlBORGF0WjhQT1FRYUl4ZmZ1MkJxNDFndC9VUCtUcWhkTGpPenRVbUN5cEFicVR1djBheG45Ni9VYQo0Q1VxbXR6SFFUYjN5SFFGaERtVk9kWUxPNlFuK2dqWVhCNzRCR0JTRVNnb0EvL3ZVMllBcFVvMEZtWjgvUW1rcnA1bkdtOUJDMnNHCkU1dVBobkVGdEMrTmlXWXpLWFpVbWhINEovcXlQNUhnemcwYjh6QWFyYjhpWFJ2VHZ5VUZUZUdTR24rWm56eEVrOHJVUUVsc2dJZlgKQkRyRE1sSTFEbGI0cGQxOXhJc05FUjlUeXg2eUY3Wm9kMXJnMU12SUI2NzFPaTZPTjdmUUFVdERLWGVNT1plUGdscjRVZVdKb0JqbgphSDlkQ2k3N28wY09QYVlqZXNZQng0L0lYcjl0Z0ZhK2lpUzZNK3FmNFRJUm52SFNUNEQyRzBDdk9KNFJVSGx6RWhMTjVteWRMSWh5ClBEQ0JCcEVpNmxtdDJoa3VJc0tOdVl5SDRHYThjeU5mSVdSamdFajFvRHdZUFpUSVNFRWRRTHBlL3Y1V09hSEl6MTZlR1dSR0VOb1gKa2JjRmdLeUxtWko5NTZMWUJ3czJKK2RJZVdDS3c5Y1RYUGh5UU45S3k4K1pBQW9BQ3hHVjJsWkZBNGdLbjJmUTFYbXhxSTFBYlEzQwpla0Q2ODE5a1I1TExVN203V2M1UC9kQVZVd0hZMyt2WjVuYnYwQ083TzZsNXM5VUNLYzJKbzVZUFNqWG5Ua0xBZGMwSHorWXM2M3N1Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk9JU1RFIFdJU2VLZXkgR2xvYmFsIFJvb3QgR0IgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRHRUQ0NBcDJnQXdJQkFnSVFkckVnVW5Ud2hZZEdzL2dqR3ZiQ3dEQU5CZ2txaGtpRzl3MEJBUXNGQURCdE1Rc3dDUVlEVlFRRwpFd0pEU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sClpERW9NQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWlZV3dnVW05dmRDQkhRaUJEUVRBZUZ3MHhOREV5TURFeE5UQXcKTXpKYUZ3MHpPVEV5TURFeE5URXdNekZhTUcweEN6QUpCZ05WQkFZVEFrTklNUkF3RGdZRFZRUUtFd2RYU1ZObFMyVjVNU0l3SUFZRApWUVFMRXhsUFNWTlVSU0JHYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYU1ZObFMyVjVJRWRzCmIySmhiQ0JTYjI5MElFZENJRU5CTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUEyQmUzSEVva0t0YVgKc2NyaUh2dDlPTytZOWJJNW1FNG51QkZkZTlJbGxJaUNGU1pxR3pHN3FGc2hJU3ZZRDA2Zld2R3hXdVI1MWpJaksrRlR6SmxGWEh0UApyYnkvaDBvTFM1ZGFxUFpJN0gxN0RjMGhCdCtlRmYxQmlraTNJUFNoZWh0WDFGMVEvN3BuMkNPWkg4Zy80OTcvYjF0M3NXdHV1TWxrCjkrSEtRVVlPS1hIUXVTUDh5WUZmVHZkdjM3K0VyWE5rdTdkQ2ptbjIxSFlkZnAybnVGZUtVV2R5MTlTb3VKVlVRSE1EOXVyMDYvNG8KUW5jL25TTWJzclk5Z0JRSFRDNVA5OVVLRmcyOVprTTNmaU5EZWNOQWh2Vk1LZHFPbXEwTnBRU0hpQjZGNCtsVDFadklpd05qZU92ZwpHVXB1dXk5ck0yUllrNjFwdjQ4Yjc0Skl4d0lEQVFBQm8xRXdUekFMQmdOVkhROEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVOUS9JTm1OZTRxUHMrVHRtRmM1UlV1T1JtajB3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3RFFZSktvWkkKaHZjTkFRRUxCUUFEZ2dFQkFFQk0rNGV5bVlHUWZwM0ZzTEFtelloN0t6S05icmdoY1ZpWGZhNDNGSzgrNS9lYTRuMzJjWmlaQktwRApkSGlqNDBsaFBuT01UWlRnK1hIRXRoWU9VM2dmMXFLSEx3STVnU2s4cnhXWUlURCtLSkFBak5IaHkvcGV5UDM0RUVZN29uaENrUmQwClZRcmVVR2ROWnRHbi8vM1p3TFdvbzRyT1p2VVBRODJuSzFkN1kwWnFxaTVTMlBUdDRXMnRLWkI0U0xyaEk2cWppZXkxcTViQXRFdWkKSFplZWV2SnVRSEhmYVBGbFRjNThCZDlUWmFtbDhMR1hCSEFWUmdPWTFOSy9WTFNnV0gxU2I5cFdKbUxVMk51Sk1XOGM4Q0xDMDJJYwpOYzFNYVJWVUdwQ1kzdXNlWDhwM3g4dU9QVU5wbkpwWTBDUTczeHRBbG40MXJZSEhUbkc2aUJNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTWkFGSVIgUk9PVCBDQTIKPT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEY2pDQ0FscWdBd0lCQWdJVVBvcGRCK3hWMGpMVnQrTzJYd0hyTGR6azF1UXdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHCkExVUVCaE1DVUV3eEtEQW1CZ05WQkFvTUgwdHlZV3B2ZDJFZ1NYcGlZU0JTYjNwc2FXTjZaVzVwYjNkaElGTXVRUzR4R0RBV0JnTlYKQkFNTUQxTmFRVVpKVWlCU1QwOVVJRU5CTWpBZUZ3MHhOVEV3TVRrd056UXpNekJhRncwek5URXdNVGt3TnpRek16QmFNRkV4Q3pBSgpCZ05WQkFZVEFsQk1NU2d3SmdZRFZRUUtEQjlMY21GcWIzZGhJRWw2WW1FZ1VtOTZiR2xqZW1WdWFXOTNZU0JUTGtFdU1SZ3dGZ1lEClZRUUREQTlUV2tGR1NWSWdVazlQVkNCRFFUSXdnZ0VpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElCRHdBd2dnRUtBb0lCQVFDM3ZENVEKcUV2TlFMWE9ZZWVXeXJTaDJnd2lzUHExZTNZQWQ0d0x6MzJvaHN3bVVlUWdQWVVNMWxqajUvUXFHSjNhMGE0bTd1dFQzUFNRMWhOSwpESkE4dy9UYTBvNE5ranJjc2JIL09ON0R1aTFmZ0xrQ3ZVcWRHdyswdzhMQlp3UGQzQnVjUGJPdzNnQWVxRFJIdTVyci9nc1V2VGFFCjJnMGd2L3BieTZrV0lLMDVZTzR2ZGJibmw1ejVQdjErVFc5TkwrK0lEV3I2M2ZFOWJpQ2xvQkswVFhDNXp0ZHlPNG1UcDRDRUhDZEoKY2ttMS96dVZuc0hNeUFIczZBNktDcGJuczZhSDVkYjVCU3NObDBCd1BMcXNkVnFjMVUyZEFnclNTNXRtUzBZSEYyV3RuMnlJQU53aQppZURoWk5SbnZERjVZVHk3eWtITlhHb0F5RHc0amxpdkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCUXVGcWxLR0xYTHpQVnZVUE1qWC9oZDU2end5REFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQVFFQXRYUDRBOXhaV3gxMjZhTXFlNUFvc2szQU0wK3FtckhVdU9Rbi82bVdtYzVHNEcxOFRLSTRwQVp3OFBSQkVldy9SNDAvY29mNQpPLzJrYnl0VEFPRC9PYmxxQnc3ckhSejJvbktReTRJOUVZS0wwcnVmS3E4aDVtT0duWGtaNy9lN0REV1F3NHJ0VHcvMXpCTFpwRDY3Cm9Qd2dsVjlQSmk4Ukk0Tk9kUWNQdjV2UnRCM3BFQVQreW1DUG9reTRyYy9oa0EvTnJnckhYWHUzVU5MVVlmclZGZHZYbjRkUlZPdWwKNCt2SmhhQWxJRGY3anM0TU5JVGhQSUd5ZDA1RHBZaGZobWVoUGVhMFhHRzJQdHYrdHlqRm9nZXV0Y3JLalNvUzc1ZnR3akNreVNwNgorL05OSXh1Wk16U2dMdldwQ3ovVVhlSFBoSi9pR2NKZml0WWdIdU56dHc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBIDIKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMGpDQ0E3cWdBd0lCQWdJUUlkYlFTazhsRDhreU4veXFYaEtONlRBTkJna3Foa2lHOXcwQkFRMEZBRENCZ0RFTE1Ba0dBMVVFCkJoTUNVRXd4SWpBZ0JnTlZCQW9UR1ZWdWFYcGxkRzhnVkdWamFHNXZiRzluYVdWeklGTXVRUzR4SnpBbEJnTlZCQXNUSGtObGNuUjEKYlNCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlVEVrTUNJR0ExVUVBeE1iUTJWeWRIVnRJRlJ5ZFhOMFpXUWdUbVYwZDI5eQpheUJEUVNBeU1DSVlEekl3TVRFeE1EQTJNRGd6T1RVMldoZ1BNakEwTmpFd01EWXdPRE01TlRaYU1JR0FNUXN3Q1FZRFZRUUdFd0pRClRERWlNQ0FHQTFVRUNoTVpWVzVwZW1WMGJ5QlVaV05vYm05c2IyZHBaWE1nVXk1QkxqRW5NQ1VHQTFVRUN4TWVRMlZ5ZEhWdElFTmwKY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNU1TUXdJZ1lEVlFRREV4dERaWEowZFcwZ1ZISjFjM1JsWkNCT1pYUjNiM0pySUVOQgpJREl3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzkrWGo0NXRXQURHU2RoaHVXWkdjL0lqb2VkUUY5CjcvdGNaNHpKekZ4cnFaSG11VUxsSUV1YjJwdDd1WmxkMlp1QVM5ZUVRQ3NuMCtpNk1McytDUnFuU1pYdkswQWt3cGZIcCs2YkplK28KQ2dDWGhWcXFuZHdweWVJMUIrdHdUVXJXd2JOV3VLRkJPSnZSK3pGL2orQmY0YkUvRDQ0V1NXRFhCbzBZK2FvbUVLc3EwOURSWjQwYgpScjVITU5VdWN0SEZZOXJuWTNsRWZrdGpKSW1HTGpRL0tVeFNpeXFud09LUktJbTV3RnY1SGRubko2My9tZ0tYd2NaUWtwc0NMTDJwCnVUUlpDcitFU3YvZi9yT2Y2OW1lNEpnajdLWnJkeFlxMjh5dE94eWtoOXhHYzE0WlltaEZWK1NRZ2tLN1F0YndZZURCb3oxbW8xMzAKR082SXlZMFhSU21aTW5VQ01lNHBKc2hyQXVhMVlrVi9OeFZhSTJpSjFEN2VUaWV3OEVBTXZFMFh5MDJpc3g3UUJscmQ5cFBQVjNXWgo5ZnFHR21kNHM3K1cvalRjdmVkU1Z1V3o1WFY3MTBHUkJkeGRhZU9WRFVPNS9JT1dPWlY3YklCYVR4Tnl4dGQ5S1hwRXVsS2tLdFZCClJna2cvaUtndGxzd2pieUpETlhYY1BpSFV2M2E3NnhSTGdlelR2N1FDZHB3NzVqNlZ1WnQyN1ZYUzl6bExDVVZ5SjR1ZUU3NDJweWUKaGl6S1YvTWE1Y2lTaXhxQ2xuckR2RkFTYWRnT1drYUxPdXNtK2lQSnRyQ0J2a0lBcFBqVy9qQXV4OUpHOXVXT2RmM3l6TG5RaDF2TQpCaEJndTRNMXQxNW4za2ZzbVVqeHBLRVYvcTJNWW80NVZVODVGcm14WTUzL3R3SURBUUFCbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFECkFRSC9NQjBHQTFVZERnUVdCQlMyb1ZRNUFzT2dQNDZLdlByVStCeW0wVG9PL1RBT0JnTlZIUThCQWY4RUJBTUNBUVl3RFFZSktvWkkKaHZjTkFRRU5CUUFEZ2dJQkFIR2xEczdrNmI4L09OV0pXc1FDWWZ0TXhSUVhMWXRQVTJzUUYveGxoTWNRU1pEZTI4Y21rNGdtYjNEVwpBbDQ1b1BlUHE1YTFwUk5jZ1JSdERvR0NFUnVLVHNaUHBkMWlIa1RmQ1ZuMFczY0xOK21MSU1iNENrNHVXQnpyTTlEUGhtREoydnVBCkw1NU1ZSVI0UFNGazF2dEJIeGdQNThsMWNiMjlYTjQwaHo1QnNBNzJ1ZFkvQ1JPV0ZDL2VtaDFhdVZiT05UcXdYM0JOWHVNcDhTTW8KY2xtMnE4S01aaVljZHl3bWRqV0xLS2Rwb1BrNzlTUGRoUkIweVpBRFZwSG5yN3BIMUJLWEVTTGpva21VYk9lM2xFdTZMYVRhTTR0TQpwa1QvV2p6R0hXVFl0VEhrcGp4NnFGY0wyKzFoR3N2eHpuTjNZNlNIYjB4Uk9OYmtYOGVmdG9FcTVJVkllVmhlTy9qYkFvSm53VG5iCnczUkxQVFllK1NtVGlHaGJxRVFaSWZDbjZJRU5MT2lUTnJRM3NzcXdHeVo2bWlVZm1wcUFua3NxUC91am12NXpNbkhDbnNaeTRZcG8KSi9Ia0Q3VEVUS1Zoay9pWEVBY3FNQ1dwdWNoeHVPOW96QzErOWVCK0Q0S29iN2E2YklORGQ4MktraGVobmx0NEZqMUY0ak55M2VGbQp5cG5UeWNVbS9RMW9CRWF1dHRtYmpMNFp2ckhHOGhualhBTEtMTmh2U2dmWnlUWGFRSFh5eEtjWmI1NUNFSmgxNXBXTFlMenR4UkxYCmlzN1ZtRnhXbGdQRjduY0dOZi9QNU80L0UySHUyOW90aGZETnJwMnlHQWxGdzVLaGNoZjhSN2FnQ3l6eHhONURhQWhxWHp2d2RtUDcKekFZc3BzYmlEclc1dmlTUAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDE1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdDekNDQS9PZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBRENCcGpFTE1Ba0dBMVVFQmhNQ1IxSXhEekFOQmdOVkJBY1QKQmtGMGFHVnVjekZFTUVJR0ExVUVDaE03U0dWc2JHVnVhV01nUVdOaFpHVnRhV01nWVc1a0lGSmxjMlZoY21Ob0lFbHVjM1JwZEhWMAphVzl1Y3lCRFpYSjBMaUJCZFhSb2IzSnBkSGt4UURBK0JnTlZCQU1UTjBobGJHeGxibWxqSUVGallXUmxiV2xqSUdGdVpDQlNaWE5sCllYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1VtOXZkRU5CSURJd01UVXdIaGNOTVRVd056QTNNVEF4TVRJeFdoY05OREF3TmpNd01UQXgKTVRJeFdqQ0JwakVMTUFrR0ExVUVCaE1DUjFJeER6QU5CZ05WQkFjVEJrRjBhR1Z1Y3pGRU1FSUdBMVVFQ2hNN1NHVnNiR1Z1YVdNZwpRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkRaWEowTGlCQmRYUm9iM0pwZEhreFFEQStCZ05WCkJBTVROMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdVbTl2ZEVOQklESXcKTVRVd2dnSWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUNEd0F3Z2dJS0FvSUNBUURDK0trL0c0bjhQRHdFWFQyUU5yQ1JPbms4WmxydgpiVGtCU1JxMHQ4OS9UU05UdDVBQTR4TXFLS1l4OFpFQTR5anNyaUZCemgvYS9YMFNXd0dERDdtd1g1bmg4aEtEZ0UwR1B0K3NyK2VoCmlHc3hyL0NMMEJnenVOdEZhalQwQW9Ba0tBb0NGWlZlZGlvTm1Ub1VXL2JMeTFPOEUwMEJpRGVVSlJ0Q3ZDTFlqcU9XWGpyWk10cysKNlBBUVplMTA0UytuZks4bk5Mc3BmWnUyenduSTVkTUsvSWhsWlhRSzNITWNYTTFBc1J6VXRvU01URkRQYUk2b1dhN0NKMDZDb2pYZApGUFFmLzdKMzFZY3ZxbTU5SkNmbnhzc201dVgrWndkajJFVU4zVHBaWlRsWWVwS1pjajJjaEY2SUlialY5Q3o4MlhCU1QzaTR2VHdyCmk1V1k5YlBSYU04Z0ZINU1YRi9uaStYMU5ZRVpOOWNSQ0xkbXZ0Tkt6b05YQURyRGdmZ1h5NUkyWGRHajJIVWI0WXNuNm5wSVFmMUYKR1FhdEo1bE93WEJIM2JXZmdWTVM1YkdNU0YweFF4ZmpqTVo2WTVaTEtUQk9oRTVpR1Y0OHpwZVFwWDhCNjUzZytJdUozU1dZUFpLMgpmdS9aOFZGUmZTMG15R2xaWWVDc2FyZ3FOaEVFZWxDOU1vUytMOXh5MWRjZEZrZmtSMllnUC9TV3hhK09BWHFsRDNwazlRMFloOW11CmlOWDZoTUU2d0drb0xmSU5hRkdxNDZWM3hxU1FEcUUzaXpFalI4RUpDT3R1OTNpYjE0TDhoQ0NaU1JtMkVrYXgrMFZWRnFtalpheWMKQncvcWE5d2ZMZ1p5N0lhSUV1UXQyMThGTCtUd0E5TW1NK2VBd3MxQ29SYzBDd0lEQVFBQm8wSXdRREFQQmdOVkhSTUJBZjhFQlRBRApBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFkQmdOVkhRNEVGZ1FVY1JWbnlNakp2WFZkY3RBNEdHcWQ4M0VrVkFzd0RRWUpLb1pJCmh2Y05BUUVMQlFBRGdnSUJBSFc3YlZSTHFoQllSalR5WXRjV05sMElYdFZzeUllOXRDNUc4akg0Zk9wQ3RaTVdWZHloREJLZzJtRisKRDFoWWMyUnl4K2hGanR5cDhpWS94bm1Nc1ZNSU00R3dWaE8rNWxGYzJKc0tUMHVjVmxNQzZVLzJEV0RxVFVKVjZId2JJU0hUR3pyTQpkL0s0a1BGb3gvbGEvdm90OUwvSjlVVWJ6amdRS2plS2VhTzA0d2xzaFlhVC80bVdKM2lCajJmalJuUlVqdGtOYWVKSzlFMTBBLyt5CmQrMlZaNWZrc2NXcnYyb2o2TlNVNGtRb1lzUkw0dkRZNGlsckduQitKR0dUZTA4RE1pVU5SU1FybHJSR2FyOUtDL2VhajhHc0dzVm4KODI4MDB2cHpZNHp2RnJDb3BFWXErT3NTN0hLMDcvZ3Jmb3hTd0l1RVZQa3ZQdU5WcU54bXNkbmhYOWl6akZrMFdhU3JUMnk3SHhqYgpkYXZZeTVMTmxEaGhEZ2NHSDB0R0VQRVZ2bzJGWER0S0s0RjVEN1JwbjBsUWwwMzNEbFpkd0pWcXdqYkRHMmpKOVNyY1I1cStzczdGCkplajZBN25hK1JadWtZVDFIQ2pJL0NiTTF4eVFWcWRmYnpvRXZNMTRpUXVPRHkranFrK2lHeEk5RmdoQUQvRkdUTmVxZXdqQkN2VnQKSjk0Q2o4ckR0U3ZLNmV2SUlWTTRwY3c3MkhjM01LSlAyVy9SOGtDdFFYb1h4ZFpLTlltM1FkVjhobjlWVFlOS3BYTWd3RHF2a1BHYQpKSTdaam5IS2U3aUcycktQbVQ0ZEV3MFNFZTdVcS9EcEZYWUM1T0RmcWlBZVcyR0ZaRUNwa0pjTnJWUFNXaDJIYWdDWFpXSzB2bTlxCnAvVXNRdTB5cmJZaG5yNjgKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBFQ0MgUm9vdENBIDIwMTUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN3ekNDQWtxZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQ0JxakVMTUFrR0ExVUVCaE1DUjFJeER6QU5CZ05WQkFjVEJrRjAKYUdWdWN6RkVNRUlHQTFVRUNoTTdTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dQpjeUJEWlhKMExpQkJkWFJvYjNKcGRIa3hSREJDQmdOVkJBTVRPMGhsYkd4bGJtbGpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqCmFDQkpibk4wYVhSMWRHbHZibk1nUlVORElGSnZiM1JEUVNBeU1ERTFNQjRYRFRFMU1EY3dOekV3TXpjeE1sb1hEVFF3TURZek1ERXcKTXpjeE1sb3dnYW94Q3pBSkJnTlZCQVlUQWtkU01ROHdEUVlEVlFRSEV3WkJkR2hsYm5NeFJEQkNCZ05WQkFvVE8waGxiR3hsYm1sagpJRUZqWVdSbGJXbGpJR0Z1WkNCU1pYTmxZWEpqYUNCSmJuTjBhWFIxZEdsdmJuTWdRMlZ5ZEM0Z1FYVjBhRzl5YVhSNU1VUXdRZ1lEClZRUURFenRJWld4c1pXNXBZeUJCWTJGa1pXMXBZeUJoYm1RZ1VtVnpaV0Z5WTJnZ1NXNXpkR2wwZFhScGIyNXpJRVZEUXlCU2IyOTAKUTBFZ01qQXhOVEIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJKS2dRZWhMZ29SYzR2Z3hFWm1HWkU0SkpTK2RRUzhLcmpWUApkSld5VVdScmpXdm1QM0NWOEFWRVI2WnlPRkIybFFKYWpxNG9udmt0VHBudkxFaHZUQ1VwNk5GeFc5OGR3WFUzdE5mNmUzcENuR29LClZscDhhUXVxZ0Fra2JIN0JScU5DTUVBd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBT0JnTlZIUThCQWY4RUJBTUNBUVl3SFFZRFZSME8KQkJZRUZMUWlDNEtaSkFFT25MdmtEdjIvKzVjZ2s1a3FNQW9HQ0NxR1NNNDlCQU1DQTJjQU1HUUNNR2ZPRm1JNG9xeGlSYWVwbFNUQQpHaWVjTWp2QXdOVzZxZWY0QkVOVGhlNVNJZDZkOVNXRFBwNVlTeS9YWnhNT0lRSXdCZUYxQWQ1bzdTb2ZUVXdKQ0Ezc1M2MWtGeWpuCmRjNUZaWEloRjhzaVFRNk1FNWc0bWxSdG04cmlmT29DV0NLUgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJU1JHIFJvb3QgWDEKPT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGYXpDQ0ExT2dBd0lCQWdJUkFJSVF6N0RTUU9OWlJHUGd1Mk9DaXdBd0RRWUpLb1pJaHZjTkFRRUxCUUF3VHpFTE1Ba0dBMVVFCkJoTUNWVk14S1RBbkJnTlZCQW9USUVsdWRHVnlibVYwSUZObFkzVnlhWFI1SUZKbGMyVmhjbU5vSUVkeWIzVndNUlV3RXdZRFZRUUQKRXd4SlUxSkhJRkp2YjNRZ1dERXdIaGNOTVRVd05qQTBNVEV3TkRNNFdoY05NelV3TmpBME1URXdORE00V2pCUE1Rc3dDUVlEVlFRRwpFd0pWVXpFcE1DY0dBMVVFQ2hNZ1NXNTBaWEp1WlhRZ1UyVmpkWEpwZEhrZ1VtVnpaV0Z5WTJnZ1IzSnZkWEF4RlRBVEJnTlZCQU1UCkRFbFRVa2NnVW05dmRDQllNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFLM29KSFAwRkRmem01NHIKVnlnY2g3N2N0OTg0a0l4dVBPWlhvSGozZGNLaS92VnFidllBVHlqYjNtaUdiRVNUdHJGai9SUVNhNzhmMHVveG15RiswVE04dWtqMQozWG5mczdqL0V2RWhta3ZCaW9aeGFVcG1abXlQZmp4d3Y2MHBJZ2J6NU1EbWdLN2lTNCszbVg2VUE1L1RSNWQ4bVVnalUrZzRyazhLCmI0TXUwVWxYaklCMHR0b3YwRGlOZXdOd0lSdDE4akE4K28rdTNkcGpxK3NXVDhLT0VVdCt6d3ZvLzdWM0x2U3llMHJnVEJJbERIQ04KQXltZzRWTWs3QlBaN2htL0VMTktqRCtKbzJGUjNxeUhCNVQwWTNIc0x1SnZXNWlCNFlsY05IbHNkdTg3a0dKNTV0dWttaThteGRBUQo0UTdlMlJDT0Z2dTM5NmozeCtVQ0I1aVBOZ2lWNStJM2xnMDJkWjc3RG5LeEhadThBL2xKQmRpQjNRVzBLdFpCNmF3QmRwVUtEOWpmCjFiMFNIelV2S0JkczBwakJxQWxrZDI1SE43ck9yRmxlYUoxL2N0YUp4UVpCS1Q1WlB0MG05U1RKRWFkYW8weEFIMGFobWJXbk9sRnUKaGp1ZWZYS25FZ1Y0V2UwK1VYZ1ZDd09QamRBdkJiSStlMG9jUzNNRkV2ekc2dUJRRTN4RGszU3p5blRuamg4QkNOQXcxRnR4TnJRSAp1c0V3TUZ4SXQ0STdtS1o5WUlxaW95bUN6THE5Z3dRYm9vTURRYUhXQmZFYndyYndxSHlHTzBhb1NDcUkzSGFhZHI4ZmFxVTlHWS9yCk9QTmszc2dyRFFvby8vZmI0aFZDMUNMUUoxM2hlZjRZNTNDSXJVN20yWXM2eHQwblVXNy92R1QxTTBOUEFnTUJBQUdqUWpCQU1BNEcKQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjV0Rm5tZTdibDVBRnpnQWlJeUJwWQo5dW1iYmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVZSOVlxYnl5cUZEUURMSFlHbWtnSnlrSXJHRjFYSXB1K0lMbGFTL1Y5bFpMCnViaHpFRm5USVpkKzUweHgrN0xTWUswNXFBdnFGeUZXaGZGUURsbnJ6dUJaNmJySkZlK0duWStFZ1BiazZaR1EzQmViWWh0RjhHYVYKMG54dnd1bzc3eC9QeTlhdUovR3BzTWl1L1gxK212b2lCT3YvMlgvcWtTc2lzUmNPai9LS05GdFkyUHdCeVZTNXVDYk1pb2d6aVV3dApoRHlDMys2V1Z3VzZMTHYzeExmSFRqdUN2akhJSW5Oemt0SENnS1E1T1JBekk0Sk1QSitHc2xXWUhiNHBob3dpbTU3aWF6dFhPb0p3ClRkd0p4NG5MQ2dkTmJPaGRqc252enF2SHU3VXJUa1hXU3RBbXpPVnl5Z2hxcFpYakZhSDNwTzNKTEYrbCsvK3NLQUl1dnRkN3UrTngKZTVBVzB3ZGVSbE44TndkQ2pOUEVscHpWbWJVcTRKVWFnRWl1VERrSHpzeEhwRktWSzdxNCs2M1NNMU45NVIxTmJkV2hzY2RDYitaQQpKelZjb3lpM0I0M25qVE9RNXlPZisxQ2NlV3hHMWJRVnM1WnVmcHNNbGpxNFVpMC8xbHZoK3dqQ2hQNGtxS09KMnF4cTRSZ3FzYWhECllWdlRIOXc3alhieUxlaU5kZDhYTTJ3OVUvdDd5MEZmLzl5aTBHRTQ0WmE0ckYyTE45ZDExVFBBbVJHdW5VSEJjbldFdmdKQlFsOW4KSkVpVTBac252Z2MvdWJoUGdYUlI0WHEzN1owajRyN2cxU2dFRXp3eEE1N2RlbXlQeGdjWXhuL2VSNDQvS0o0RUJzK2xWRFIzdmV5SgptK2tYUTk5YjIxLytqaDVYb3MxQW5YNWlJdHJlR0NjPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBQyBSQUlaIEZOTVQtUkNNCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZnekNDQTJ1Z0F3SUJBZ0lQWFpPTk1HYzJ5QVlkR3NkVWhHa0hNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ec3hDekFKQmdOVkJBWVQKQWtWVE1SRXdEd1lEVlFRS0RBaEdUazFVTFZKRFRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSldpQkdUazFVTFZKRFRUQWVGdzB3T0RFdwpNamt4TlRVNU5UWmFGdzB6TURBeE1ERXdNREF3TURCYU1Ec3hDekFKQmdOVkJBWVRBa1ZUTVJFd0R3WURWUVFLREFoR1RrMVVMVkpEClRURVpNQmNHQTFVRUN3d1FRVU1nVWtGSldpQkdUazFVTFZKRFRUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0MKZ2dJQkFMcHhnSHBNaG01L3lCTnR3TVo5SEFDWGp5d01JN3NRbWtDcEdyZUhpUGliVm1yNzVudU9pNUtPcHlWZFdSSGJOaTYzVVJjZgpxUWdmQkJja1dLbzNTaGpmNVRuVVYvM1h3U3lSQVpIaUl0UUR3Rmo4ZDBmc2p6NTBRN3FzTkkxTk9IWm5qckRJYnpBeldIRmN0UFZyCmJ0UUJVTGdUZm14S28wblJJQm51dk1BcEdHV24zdjd2M1FxUUllY2FaNUpDRUpoZlR6QzhQaHhGdEJEWGFFQVV3RUQ2NTNjWGV1WUwKajJWYlBObWFVdHUxdlo1R3p6M3JrUVVDd0pheWRreE5FSlk3a3ZxY2Z3K1ozNzRqTlVVZUFseit0YWlibVNYYVh2TWl3em4xNUNvdQowOFlmeEd5cXhSeHFBUVZLTDlMRndhZzBKbDFtcGRJQ0lma1l0d2IxVHBsdnFLdE1VZWpQVUJqRmQ4ZzVDU3hKa2pLWnFMc1hGM213CldzWG1vOFJaWlVjMWcxNnA2RFVMbWJ2a3pTREdtMG9HT2JWby9DSzY3bFdNSzA3cTg3SGovTGFabXRWQytuRk5DTStISG1weGZmblQKdE9tbGNZRjd3azVIbHFYMmRvV2pLSS9wZ0c2QlU2VnRYN2hJK2NMNU5xWXVTZis0bHNLTUI3T2JpRmo4NnhzYzNpMXc0cGVTTUtHSgo0N3hWcUNmV1MrMlFyWXY2WXlWWkxhZzEzY3FYTTd6bHpjZWQwZXp2WGc1S2tBWW1ZNjI1MlRVdEI3cDJaU3lzVjQ5OTlBZVUxNEVDCmxsMmpCMG5WZXRCWCtSdm5VMFoxcXJCNVFzdG9jUWpwWUwwNWFjNzByOE5XUU1ldFVxSUo1RytHUjRvZjZ5Z25YWU1ncndUSmJGYWEKaTBiMUFnTUJBQUdqZ1lNd2dZQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRQpGUGQ5eGYzRTZKb2JkMlNuOVIyZ3pMK0hZSnB0TUQ0R0ExVWRJQVEzTURVd013WUVWUjBnQURBck1Da0dDQ3NHQVFVRkJ3SUJGaDFvCmRIUndPaTh2ZDNkM0xtTmxjblF1Wm01dGRDNWxjeTlrY0dOekx6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFCNUJLMy9NalR2REQKbkZGbG01d2lvb29NaGZOektXdE4vZ0hpcVF4akFiOEVaNldkbUYvOUFSUDY3SnBpNlliK3RtTFNia3lVKzhCMVJYeGxEUGl5TjgrcwpEOCtOYi9rWjk0L3NIdkp3bnZES3VPKzMvM1kzZGx2MmJvanpyMkl5SXBNTk9tcU9GR1lNTFZOMFYyVWUxYkxkSTRFN3BXWWpKMmNKCmorRjNxa1BOWlZFSTdWRlkvdVk1K2N0SGhLUVY4WGE3cE82a084UmY3N0l6bGhFWXQ4bGx2aGpobzZUYytoajUwN3dUbXpsNk5MclQKUWZ2Nk1vb3F0eXVHQzJtRE9MN05paTRMY0syTkpwTHVIdlVCS3dyWjFwZWJidUNvR1J3NklZc01Ia0N0QStmZFpuNzF1U0FOQStpVworWUpGMURuZ29BQmQxNWptZlo1bmM4T2FLdmVyaTZFNkZPODB2RklPaVppYUJFQ0VIWDVGYVpOWHp1dk8rRkI4VHh4dUJFT2IrZFk3Ckl4anA2bzdSVFVhTjhUdmthc3E2K3lPM20vcVpBU2xhV0ZvdDQvblViUTRtcmNGdU5Md3krQXdGK21XajJ6czNneUxwMXR4eU0vMWQKOGlDOWRqd2oyaWozK1J2cldXVFYzRjl5ZmlEOHpZbTFrR2ROWW5vL1RxMGR3em4rZXZRb0Z0OUI5a2lBQmRjUFVYbXNFS3ZVN0FObQo1bXF3dWpHU1FrQnF2anJUY3VGcU4xVzhyQjJWdDJsaDhrT1JkT2FnMHdva1JxRUlyOWJhUlJtVzFGTWRXNFI1OE1EM1IrK0xqOFVHCnJwMU1ZcDMvUmdUNDA4bTJFQ1ZBZGY0V3FzbEtZSVl2dXU4d2QrUlU0cmlFbVZpQXFoT0xVVHBQU1BhTHRyTT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQW1hem9uIFJvb3QgQ0EgMQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEUVRDQ0FpbWdBd0lCQWdJVEJteWZ6NW0vakFvNTR2QjRpa1BtbGpaYnlqQU5CZ2txaGtpRzl3MEJBUXNGQURBNU1Rc3dDUVlEClZRUUdFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnVW05dmRDQkRRU0F4TUI0WERURTEKTURVeU5qQXdNREF3TUZvWERUTTRNREV4TnpBd01EQXdNRm93T1RFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdgpiakVaTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZ1EwRWdNVENDQVNJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dFUEFEQ0NBUW9DCmdnRUJBTEo0Z0hIS2VOWGpjYTlIZ0ZCMGZXN1kxNGgyOUpsbzkxZ2hZUGwwaEFFdnJBSXRodE9nUTNwT3NxVFFOcm9Cdm8zYlNNZ0gKRnpaTTlPNklJOGMrNnpmMXRSbjRTV2l3M3RlNWRqZ2RZWjZrL29JMnBlVktWdVJGNGZuOXRCYjZkTnFjbXpVNUwvcXdJRkFHYkhyUQpnTEttK2Evc1J4bVBVRGdIM0tLSE9WajR1dFdwK1Vobk1KYnVsSGhlYjRtalVjQXdobWFoUldhNlZPdWp3NUg1U056LzBlZ3dMWDB0CmRIQTExNGdrOTU3RVdXNjdjNGNYOGpKR0tMaEQrcmNkcXNxMDhwOGtEaTFMOTNGY1htbi82cFVDeXppS3JsQTRiOXY3TFdJYnhjY2UKVk9GMzRHZklENXlISTlZL1FDQi9JSURFZ0V3K095UW1qZ1N1YkpySXFnMENBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdIUVlEVlIwT0JCWUVGSVFZeklVMDdMd01sSlF1Q0ZtY3g3SVFUZ29JTUEwR0NTcUdTSWIzCkRRRUJDd1VBQTRJQkFRQ1k4amRhUVpDaEdzVjJVU2dnTmlNT3J1WW91NnI0bEs1SXBEQi9HL3dralV1MHlLR1g5cmJ4ZW5ESVU1UE0KQ0Nqam1DWFBJNlQ1M2lIVGZJVUpyVTZhZFRyQ0MycUplSFpFUnhobGJJMUJqanQvbXN2MHRhZFExd1VzTitnRFM2M3BZYUFDYnZYeQo4TVd5N1Z1MzNQcVVYSGVlRTZWL1VxMlY4dmlUTzk2TFhGdktXbEpiWUs4VTkwdnZvL3VmUUpWdE1WVDhRdFBIUmg4anJka1BTSENhCjJYVjRjZEZ5UXpSMWJsZFp3Z0pjSm1BcHp5TVpGbzZJUTZYVTVNc0kreU1SUStoREtYSmlvYWxkWGdqVWtLNjQyTTRVd3RCVjhvYjIKeEpORGQyWmh3TG5vUWRlWGVHQURia3B5cnFYUmZib1Fub1pzRzRxNVdUUDQ2OFNRdnZHNQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBbWF6b24gUm9vdCBDQSAyCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZRVENDQXltZ0F3SUJBZ0lUQm15ZjBwWTFocDhLRCtXR2VQaGJKcnVLTnpBTkJna3Foa2lHOXcwQkFRd0ZBREE1TVFzd0NRWUQKVlFRR0V3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGdVbTl2ZENCRFFTQXlNQjRYRFRFMQpNRFV5TmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2CmJqRVpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnUTBFZ01qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0MKZ2dJQkFLMldueTJjU2t4S2dYbFJtZXlLeTJ0Z1VSTzhUVzBHL0xBSWpkMFpFR3JISmd3MTJNQnZJSVRwbExHYmhRUERXOXRLNk1qNAprSGJaVzAvalRPZ0dOazNNbXF3OURKQXJrdFFHR1dDc04wUjVoWUdDclZvMzRBM01uYVpNVW5icVE1MjNCTkZROWxYZzFkS21TWVhwCk4rbktmcTVjbFUxSW1qK3VJRnB0aUpYWk5MaFNHa09Rc0w5c0JibTJlTGZxME9RNlBCSlRZdjlLOG51K05RV3BFalRqODJSMFlpdzkKQUVsYUtQNHlSTHVIM1dVbkFuRTcya3IzSDlyTjl5RlZrRThQN0s2QzRaOXIyVVhUdS9CZmgrMDhMRG1HMmovZTdISlY2M21qcmR2ZApmTEM2SE03ODNrODFkczhQK0hnZmFqWlJSaWRoVyttZXovQ2lWWDE4Sllwdkw3VEZ6NFF1Sy8wTlVSQnMrMThidkJ0K3hhNDdtQUV4Cmt2OExWL1Nhc3JsWDZhdnZEWGJSOE83MHpvYW40RzdwdEdtaDMybjJNOFpwTHBjVG5xV0hzRmNRZ1RmSlU3TzdmL2FTMFp6UUdQU1MKYnRxRFQ2WmptVXlsKzE3dklXUjZJRjlzWklVVnl6ZnBZZ3dMS2hiY0FTNHkyajVMOVo0NjloZEFsTytla1FpRytyNWpxRm96N010MApRNVg1YkdsU05zY3BiL3hWQTF3Zis1KzlSK3ZuU1VlVkMwNkpJZ2xKNFBWaEh2Ry9Mb3B5Ym9CWi8xYzYrWFV5bzA1ZjdPMG9ZdGxOCmMvTE1nUmRnN2MzcjNOdW55c1YrQXIzeVZBaFUvYlF0Q1N3WFZFcVkwVlRoVVdjSTB1MXVmbTgvMGkyQldTbG15NUE1bFJFZWRDZisKM2V1dkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUIwR0ExVWREZ1FXQkJTdwpEUEJNTVBRRldBSkkvVFBsVXE5TGhPTm1VakFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBcXFpQWp3NTRvK0NpMU0zbTlaaDZPK29BCkE3Q1hEcE84V3FqMkxJeHloNm14L0g5ei9XTnhlS1dIV2M4dzRRMFFzaE5hYllMMWF1YUFuNkFGQzJqa1IydkhhdCsyL1hjeWN1VVkKK2duMG9KTXNYZEtNZFlWMlpaQU1BM20zTVNOanJYaURDWVpvaE1yLytjOG1tcEo1NTgxTHhlZGhweGZMODZrU2s1TnJwK2d2VTVMRQpZRml3ekFKUkdGdUZqV0paWTdhdHRONmEreWIzQUNmQVhWVTNkSm5KVUgvaldTNUU0eXdsN3V4TU1uZTBueHJwUzEwZ3hkcjlISWNXCnhrUG8xTHNtbWtWd1hxa0xOMVBpUm5zbi9lQkc4b20zekVLMnl5Z21idG1seVRySVFSTmc5MUNNRmE2eWJSb1ZHbGQ0NXBJcTJXV1EKZ2o5c0FxK3VFam9ubGpZRTF4MmlnR09wbS9IbHVyUjhGTEJPeWJFZmRGODQ5bEhxbS9vc29oSFVxUzBuR2tXeHI3Sk9jUTNBV0ViVwphUWJMVTh1ei9tdEJ6VUYrZlV3UGZISjVlbG5OWGtvT3JKdXBtSE41ZkxUMHpMbTRCd3l5ZEZ5NHgyK0lvWkNuOUtyNXYyYzY5Qm9WClloNjNuNzQ5c1Ntdlo2RVM4bGdRR1ZNRE1CdTRHb24ybkwyWEE0NmpDZk1kaXlIeHROL2tITkdmWlFJRzZseldFN09FNzZLbFhJeDMKS2Fkb3dHdXVRTktvdE9yTjhJMUxPSndabWhzb1ZMaUprTy9LZFlFK0h2SmtKTWNZcjA3L1I1NEg5alZscE5NS1Z2LzFGMlJzNzZnaQpKVW1UdHQ4QUY5cFlmbDN1eFJ1dzBkRmZJUkRIK2ZPNkFnb25COFh4MXNmVDRQc0pZR3c9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFtYXpvbiBSb290IENBIDMKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQnRqQ0NBVnVnQXdJQkFnSVRCbXlmMVhTWE5tWS9Pd3VhMmVpZWRnUHlTakFLQmdncWhrak9QUVFEQWpBNU1Rc3dDUVlEVlFRRwpFd0pWVXpFUE1BMEdBMVVFQ2hNR1FXMWhlbTl1TVJrd0Z3WURWUVFERXhCQmJXRjZiMjRnVW05dmRDQkRRU0F6TUI0WERURTFNRFV5Ck5qQXdNREF3TUZvWERUUXdNRFV5TmpBd01EQXdNRm93T1RFTE1Ba0dBMVVFQmhNQ1ZWTXhEekFOQmdOVkJBb1RCa0Z0WVhwdmJqRVoKTUJjR0ExVUVBeE1RUVcxaGVtOXVJRkp2YjNRZ1EwRWdNekJaTUJNR0J5cUdTTTQ5QWdFR0NDcUdTTTQ5QXdFSEEwSUFCQ21YcDhaQgpmOEFObStnQkcxYkc4bEtsdWkyeUV1alNMdGY2eWNYWXFtMGZjNEU3TzVock9Yd3pwY1ZPaG82QUYyaGlSVmQ5UkZnZHN6Zmxad2pyClp0NmpRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnR0dNQjBHQTFVZERnUVdCQlNydHR2WEJwNDMKckRDR0I1Rnd4NXpFR2JGNHdEQUtCZ2dxaGtqT1BRUURBZ05KQURCR0FpRUE0SVdTb3hlM2pma3JCcVdUckJxWWFHRnkrdUdoMFBzYwplR0NtUTVuRnVNUUNJUUNjQXUveGxKeXpsdm5yeGlyNHRpeitPcEFVRnRlTVl5UklITjh3ZmRWb093PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQW1hem9uIFJvb3QgQ0EgNAo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlCOGpDQ0FYaWdBd0lCQWdJVEJteWYxOEc3RUV3cFErVnhlM3NzeUJyQkRqQUtCZ2dxaGtqT1BRUURBekE1TVFzd0NRWURWUVFHCkV3SlZVekVQTUEwR0ExVUVDaE1HUVcxaGVtOXVNUmt3RndZRFZRUURFeEJCYldGNmIyNGdVbTl2ZENCRFFTQTBNQjRYRFRFMU1EVXkKTmpBd01EQXdNRm9YRFRRd01EVXlOakF3TURBd01Gb3dPVEVMTUFrR0ExVUVCaE1DVlZNeER6QU5CZ05WQkFvVEJrRnRZWHB2YmpFWgpNQmNHQTFVRUF4TVFRVzFoZW05dUlGSnZiM1FnUTBFZ05EQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk5LcmlqZFBvMU1OCi9zR0tlMHVvZTBaTFk3Qmk5aTBiMndoeElkSUE2R085bWlmNzhEbHVYZW85cGNtQnFxTmJJSmhGWFJiYi9lZ1FiZU9jNE9POVg0UmkKODNCa002RExKQzl3dW9paEtxQjErSUd1WWdiRWdkczViaW13SHZvdVhLTkNNRUF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVgpIUThCQWY4RUJBTUNBWVl3SFFZRFZSME9CQllFRk5Qc3h6cGxic3poMm5hYVZ2dWM4NFp0VitXQk1Bb0dDQ3FHU000OUJBTURBMmdBCk1HVUNNRHFMSWZHOWZoR3QwTzlZbGkvVzY1MStrSTByejJaVnd5empLS2x3Q2tjTzhEZFpFdjh0bVpRb1RpcFBOVTB6V2dJeEFPcDEKQUU0N3hEcVVFcEhKV0VhZElSTnlwNGljaXVSTVN0dVcxS3lMYTJ0SkVsTXpyZGZrdmlUOHRRcDIxS1c4RUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUVUJJVEFLIEthbXUgU00gU1NMIEtvayBTZXJ0aWZpa2FzaSAtIFN1cnVtIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlFWXpDQ0EwdWdBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUXNGQURDQjBqRUxNQWtHQTFVRUJoTUNWRkl4R0RBV0JnTlZCQWNUCkQwZGxZbnBsSUMwZ1MyOWpZV1ZzYVRGQ01FQUdBMVVFQ2hNNVZIVnlhMmw1WlNCQ2FXeHBiWE5sYkNCMlpTQlVaV3R1YjJ4dmFtbHIKSUVGeVlYTjBhWEp0WVNCTGRYSjFiWFVnTFNCVVZVSkpWRUZMTVMwd0t3WURWUVFMRXlSTFlXMTFJRk5sY25ScFptbHJZWE41YjI0ZwpUV1Z5YTJWNmFTQXRJRXRoYlhVZ1UwMHhOakEwQmdOVkJBTVRMVlJWUWtsVVFVc2dTMkZ0ZFNCVFRTQlRVMHdnUzI5cklGTmxjblJwClptbHJZWE5wSUMwZ1UzVnlkVzBnTVRBZUZ3MHhNekV4TWpVd09ESTFOVFZhRncwME16RXdNalV3T0RJMU5UVmFNSUhTTVFzd0NRWUQKVlFRR0V3SlVVakVZTUJZR0ExVUVCeE1QUjJWaWVtVWdMU0JMYjJOaFpXeHBNVUl3UUFZRFZRUUtFemxVZFhKcmFYbGxJRUpwYkdsdApjMlZzSUhabElGUmxhMjV2Ykc5cWFXc2dRWEpoYzNScGNtMWhJRXQxY25WdGRTQXRJRlJWUWtsVVFVc3hMVEFyQmdOVkJBc1RKRXRoCmJYVWdVMlZ5ZEdsbWFXdGhjM2x2YmlCTlpYSnJaWHBwSUMwZ1MyRnRkU0JUVFRFMk1EUUdBMVVFQXhNdFZGVkNTVlJCU3lCTFlXMTEKSUZOTklGTlRUQ0JMYjJzZ1UyVnlkR2xtYVd0aGMya2dMU0JUZFhKMWJTQXhNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QQpNSUlCQ2dLQ0FRRUFyM1V3TTZxN2E5T1pMQkkzaE5tTmU1ZUEwMjduLzV0UWxUNlFsVlpDMXhsOEpvU05rdm9CSFRvUDRtUTR0NHk4CjZJajVpeVNyTHFQMU4rUkFqaGdsZVlOMUh6di9iS2pGeGxiNHRPMktSS09yYkV6OEhkRGM3Mmk5eitTcXp2QlY5NkkwMUlOck4zd2MKd3Y2MUEreFh6cnkwdGNYdEFBOVROeXBOOUU4TWcvdUd6OHYrakU2OWgvbW5peUZYbkhyZkEyZUpMSjJYWWFjUXVGV1FmdzR0SnpoMAozK2Y5Mms0UzQwMFZJZ0xJNE9EOEQ2MksxOGxVVU13N0Q4b1dnSVRRVVZiRGpsWi9pU0l6TCthRkNyMmxxQnMyM3RQY0xHMDd4eE85CldTTXM1dVdrOTlnTDdlcVFRRVNvbGJ1VDFkQ0FOTFpHZUE0ZkFKTkc0ZTdwK2V4UEZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVUKWlQvSGlvYkdQTjA4VkZ3MStEcnRVZ3hIVjhnd0RnWURWUjBQQVFIL0JBUURBZ0VHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFDby80ZkV5anE3aG1GeExYczlySG1vSjBpS3BFc2RlVjMxelZtU0FoSHFUNUFtNUVNMmZLaWZoCkFIZStTTWcxcUlHZjVMZ3N5WDhPc05KTE4xM3F1ZFVMWGpTOTlITXB3KzBtRlp4K0NGT0tXSTNRU3lqZndiUGZJUFA1NCtNNjM4eWMKbE5oT1Q4TnJGN2YzY3VpdFpqTzFKVk9yNFBoTXFaMzk4ZzI2cnJuWnFzWnIrWk83cnF1NGx6d0RHcnBEeHBhNVJYSTRzNmVobGoyUgplMzdBSVZOTWgrM3lDMVNWVVpQVklxVU5pdkdURGo1VURyRFl5VTdjOGpFeVZ1cGsrZXExblJabVFuTHpmOU94TVVQOHBJNFg4VzBqCnE1Um0rSzM3RHdodUppMS9Gd2NKc296N1VNQ2ZsbzNQdHYwQW5Wb1VtcjhDUlBYQndwOGlYcUlQb2VNPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHRENBIFRydXN0QVVUSCBSNSBST09UCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZpRENDQTNDZ0F3SUJBZ0lJZlFtWC92Qkg2bm93RFFZSktvWklodmNOQVFFTEJRQXdZakVMTUFrR0ExVUVCaE1DUTA0eE1qQXcKQmdOVkJBb01LVWRWUVU1SElFUlBUa2NnUTBWU1ZFbEdTVU5CVkVVZ1FWVlVTRTlTU1ZSWklFTlBMaXhNVkVRdU1SOHdIUVlEVlFRRApEQlpIUkVOQklGUnlkWE4wUVZWVVNDQlNOU0JTVDA5VU1CNFhEVEUwTVRFeU5qQTFNVE14TlZvWERUUXdNVEl6TVRFMU5UazFPVm93CllqRUxNQWtHQTFVRUJoTUNRMDR4TWpBd0JnTlZCQW9NS1VkVlFVNUhJRVJQVGtjZ1EwVlNWRWxHU1VOQlZFVWdRVlZVU0U5U1NWUloKSUVOUExpeE1WRVF1TVI4d0hRWURWUVFEREJaSFJFTkJJRlJ5ZFhOMFFWVlVTQ0JTTlNCU1QwOVVNSUlDSWpBTkJna3Foa2lHOXcwQgpBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUEyYU1XOE1oMGRIZWI3ek1OT3daK1ZmeTFZSTkyaGhKQ2ZWWm1Qb2lDN1hKakRwNkwzVFFzCkFsRlJ3eG45V1ZTRXlmRnJzMHl3NmVoR1hUakdvcWN1RVZlNmdoV2luSTl0c0psS0N2THJpWEJqVG5uRXQxdTlvbDJ4OGtFQ0s2MnAKT3FQc2VRcnNYenJqL2UrQVBLMDBteHFyaUNaN1ZxS0NoaC9yTlltRGYxK3VLVTQ5dG03c3JzSHdKNXV1NC9Uczc2NS85NFk5Y25ycgpwZnRaVHFmcmxZd2lPWG5oTFFpUHpMeVJ1RUgzRk1FanFjT3Rta1ZFczdMWExNM0dLZUpRRUs1Y3k0S09GeGcyZlpmbWlKcXdUVFFKCjlDeTVXbVlxc0JlYm5oNTJuVXBtTVVIZlAvdkZCdThidG40YVJqYjNaR003NHprWUkrZG5kUlRWZFZlU043MithaHNtVVBJMkpnYVEKeFhBQlpHMTJadUdSMjI0SHdHR0FMckl1TDR4d3A5RTdQTE9SNUc2MnhEdHc4bXlTbHduTlIzMFl3UE83bmcvV2k2NEh0bG9QemdzTQpSNmZsUHJpOWZjZWJOYUJobHpwQmRSZk1LNVozS3BJaEh0bVZkaUJuYU04TnZkL1dId2xxbXVMTWMzR2tMMzBTZ0xkVE1FWmVTMVNaCkQyZkpwY2p5SU1HQzdKMFIzOElDK3hvNzBlMGdtdTlsWkpJUURTcmkzbkR4R0dlQ2pHSGV1THpSTDV6N0Q5QXI3UnQydWVRNVZmajQKb1IyNHFvQUFUSUxuc244SnVMd3dvQzhOOVZLZWp2ZVNzd29BSFFCVWx3YmdzUWZaeHc5Y1pYMDhiVmxYNU8ybGplbEFVNThWUzZCeAo5aG9oNDlwd0JpRllGSWVGZDNtcWdua0NBd0VBQWFOQ01FQXdIUVlEVlIwT0JCWUVGT0xKUUo5Tnp1aWFvWHpQRGo5bHhTbUlhaGxSCk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFEUlNWZmcKcDh4b1dMb0JEeXNaelkyd1lVV3NFZTFqVUduNEgzKytGby85bmVzTHFqSkhkdEpuSk8yOWZETXlseXJIQllabURSZDlGQlViMU92OQpINXIyWHBkcHR4b2xwQXF6a1Q5Zk5xeUw3RmVvUHVlQmloaFhPWVYwR2tMSDZWc1RYNC81Q09tU2RJMzFSOUtyTzliN2VHWk9ObjM1CjZaTHBCTjc5U1dQOGJmc1VjWk5uTDBkS3Q3bi9IaXB6Y0VZd3YxcnlMM21sNFkwTTJmbXlZemVNTjJXRmNHcGNXd2x5dWExalBMSGQKK1B3eXZ6ZUc1THVPbUNkK3VoOFc0WEFSOGdQZkpXSXlKeVlZTW9TZi93QTZFN3FhVGZSUHVCUndJckhLSzVET0tjRnc5QytkZi9LUQpIdFphMzdkRy9PYUcrc3ZnSUhaNnVxYkw5WHplWXFXeGkrN2VnbWFLVGpvd0h6K0F5NjBudWd4ZTE5Q3hWc3AzY2JLMWRhRlFxVUJECkY4SW8yYzlTaTF2SVk5UkNQcUF6ZWtZdTl3b2dSbFIrYWs4eDhZRitRblE0WlhNbjdzWjh1STdYcFRyWG1LR2NqQkJWMDl0TDdFQ1EKOHMxdVY5SmlEbnhYazdHbmJjMmRnN3NxNStXMk8zRllyZjNSUmJ4YWtlNVRGVy9UUlFsMWJycVFYUjRFenpmZkhxaG1zWXptSUdydgovRWhPZEpoQ3J5bHZMbXJIKzMzUlpqRWl6SVlBZm1hRERFTDB2VFNTd3hycVQ4cCtjazBMY0l5bVNMdW1vUlQyKzFoRW1SU3VxZ3VUCmFhQXBKVXFseXl2ZGltWUhGbmdWVjNFYjdQVkhoUE9lTVRkNjFYOGtyZVM4L2YzTWJvUG9ES2kzUVd3SDNiMDhocGN2MGc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgUlNBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUYzVENDQThXZ0F3SUJBZ0lJZXl5YjB4YUFNcGt3RFFZSktvWklodmNOQVFFTEJRQXdmREVMTUFrR0ExVUVCaE1DVlZNeERqQU0KQmdOVkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eApNVEF2QmdOVkJBTU1LRk5UVEM1amIyMGdVbTl2ZENCRFpYSjBhV1pwWTJGMGFXOXVJRUYxZEdodmNtbDBlU0JTVTBFd0hoY05NVFl3Ck1qRXlNVGN6T1RNNVdoY05OREV3TWpFeU1UY3pPVE01V2pCOE1Rc3dDUVlEVlFRR0V3SlZVekVPTUF3R0ExVUVDQXdGVkdWNFlYTXgKRURBT0JnTlZCQWNNQjBodmRYTjBiMjR4R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakV4TUM4R0ExVUVBd3dvVTFOTQpMbU52YlNCU2IyOTBJRU5sY25ScFptbGpZWFJwYjI0Z1FYVjBhRzl5YVhSNUlGSlRRVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFECmdnSVBBRENDQWdvQ2dnSUJBUGtQM2FNcmZjdlFLdjdzWjRXbTV5NGJ1bmZoNC9XdnBPejZTbDJSeEZkSGF4aDNhM2J5L1pQa1BRL0MKRnA0TFpzTldsSjRYZzRYT1Z1L3lGdjBBWXZVaUNWVG9aUmRPUWJuZ1QwYVhxaHZJdUc1aVhtbXhYOXNxQW43OGJNcnpRZGp0ME9qOApQMkZJN2JBREZCMFFEa3NaNEx0TzdJWmwvemJ6WG1jQ0M1MkdWV0g5ZWpqdC91SVpBTGR2b1ZCaWRYUThvUHJJSlpLMGJub2l4L2dlCm9lT3kzWkV4cXlzZEJQK2xTZ1EzNllXa015djk0dFpWTkh3WnBFcG94N0tvMDdmS29aT0k2OEdYdkl6NUhka2loQ1IweHdROWFxa3AKazh6cnVGdmgvbDhscWpSWXlNRWpWSjBibUJIRE9KeCtQWVpzcFE5QWhud0M5RndDVHlqTHJuR2ZEenJJTS80UkpUWHEvTHJGWUQzWgpmQmpWc3FuVGRYZ0RjaUxLT3NNZjd5emxMcW42bml5MlVVYjlyd1BXNm1CbzZvVVdObXVGNlI3QXM5M0VKTnlBS29GQmJaUSt5T0RKCmdVRUFubDYvZjhVSW1LSVlMRUpBcy9sdk9DZExUb0QwUFlGSDRJaDg2aHpPdFhWY1VTNGNLMzhhY2lqbkFMWFJkTWJYNUordEI1TzIKVXpVMS9EZmt3L1pkRnI0aGM5NlNDdmlnWTJxOGxwSnFQdmk4WlZXYjN2VU5pU1lFL0NVYXBpVnB5OEp0eW56aVdWK1hyT3Z2THNpOAoxeHRaUEN2TThobklrMnNuWXhuUC9Pa20rTXB4bTMrVC9qUm5oRTZaNi95emVBa3pjTHBtcG5idEczUHJHcVVOeENJVElKUldDazRzCmJFNngvYytjQ2JxaU0rMkhBZ01CQUFHall6QmhNQjBHQTFVZERnUVdCQlRkQkFrSG92VjZmVkpURXBLVjdqaUFKUTJtV1RBUEJnTlYKSFJNQkFmOEVCVEFEQVFIL01COEdBMVVkSXdRWU1CYUFGTjBFQ1FlaTlYcDlVbE1Ta3BYdU9JQWxEYVpaTUE0R0ExVWREd0VCL3dRRQpBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUlCZ1JsQ243SnAwY0hoNXdZZkdWY3BOeEpLMW9rMWlPTXE4YnMzQUQvQ1VyCmRJV1FQWGhxOUxtTHBaYzd0UmlSdXg2bitVQmJrZmxWbWE4ZUVkQmNIYWRtNDdHVUJ3d3lPYWJxRzdCNTJCMmNjRVRqaXQzRStaVWYKaWpoRFB3R0ZwVWVuUFVheXZPVWlhUGQ3bk5nc1Bnb2h5QzB6ckwvRmdaa3hkTUYxY2NXK3NmQWpSZlNkYS93Wlk1Mmp2QVRHR0FzbAp1MU9KRDdPQVVONUY3a1IvcTVSNFpKalQ5aWpkaDlod1pYVDdEcmtUNjZjUFlha3lsc3pldSsxalRCaTdxVUQzb0ZSdUlJaHhkUmpxCmVyUTBjdUFqSjNkY3RwRHFoaVZBcSs4ekQ4dWZncjZpSVB2MnRTMGE1c0tGc1hRUCs4aGxBcVJTQVVmZFNTTEJ2OWpyYTZ4KzN1eGoKTXhXM0l3aVB4ZytOUVZyZGpzVzVqK1ZGUDNqYnV0SWJRTEgrY1UwLzRJR2l1bDYwN0JYZ2s5MElIMzdoVlprTElkNlRuZ3I3NXFOSgp2VFl3L3VkM3NxQjFsN1V0Z1lnWFpTRDMycEFBbjhsU3pETEtOWHoxUFEvWUs5ZjFKbXpKQmpTV0Z1cHdXUm95ZVhrTHRvaC9EMUpJClBiOXMyS0pFTHRGT3QzSlkwNGtUbGY1RXEvalhpeHR1bkx3c29GdlZhZ0N2WHpmaDFmb1FDNWljaHVjbWo4N3c3RzZLVnd1QTQwNnkKd0tCallaQzZWV2czZEdxMmt0dWZvWVlpdG1VbkR1eTJuMEpnNUdmQ3RkcEJDOFRUaTJFYnZQb2ZrU3ZYUkFkZXVpbXMyY1hwNzFOSQpXdXVBOFNoWUljMndCbFg3Sno5VGtIQ3BCQjVYSjdrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTU0wuY29tIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRUNDCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNqVENDQWhTZ0F3SUJBZ0lJZGViZnk4Rm9XNmd3Q2dZSUtvWkl6ajBFQXdJd2ZERUxNQWtHQTFVRUJoTUNWVk14RGpBTUJnTlYKQkFnTUJWUmxlR0Z6TVJBd0RnWURWUVFIREFkSWIzVnpkRzl1TVJnd0ZnWURWUVFLREE5VFUwd2dRMjl5Y0c5eVlYUnBiMjR4TVRBdgpCZ05WQkFNTUtGTlRUQzVqYjIwZ1VtOXZkQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVTQkZRME13SGhjTk1UWXdNakV5Ck1UZ3hOREF6V2hjTk5ERXdNakV5TVRneE5EQXpXakI4TVFzd0NRWURWUVFHRXdKVlV6RU9NQXdHQTFVRUNBd0ZWR1Y0WVhNeEVEQU8KQmdOVkJBY01CMGh2ZFhOMGIyNHhHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRXhNQzhHQTFVRUF3d29VMU5NTG1OdgpiU0JTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBCkJFVnVxVkRFcGlNMm5sOG9qUmZMbGlKa1A5eDZqaDNNQ0xPaWNTUzZqa201QkJ0SGxsaXJMWlhJN1o0SU5jZ242NG1NVTFqcllvcisKOEZzUGF6RlNZMEU3aWMzczdMYU5HZE0wQjl5N3hnWi93a1dWN010L3FDUGdDZW1CK3ZOSDA2TmpNR0V3SFFZRFZSME9CQllFRklMUgpoWE13NXpVRTA0NENrdnZscE5IRUllak5NQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVZ3RHRmN6RG5OUVRUCmpnS1MrK1drMGNRaDZNMHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmNBTUdRQ01HL242MWtScEdEUFliQ1cKZSswRitTOFRrZHp0NWZ4UWF4RkdSck1jSVFCaXU3N0Q1K2pOQjVuNURRdGRjajdFcWdJd0g3eTZDK0l3SlB0OGJZQlZDcGsrZ0Ewego1V2FqczZPN3BkV0xqd2tzcGwxKzR2QUhDR2h0MG54cGJsL2Y1V3BsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNTTC5jb20gRVYgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSBSU0EgUjIKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRjZ6Q0NBOU9nQXdJQkFnSUlWcllwelRTOGVQWXdEUVlKS29aSWh2Y05BUUVMQlFBd2dZSXhDekFKQmdOVkJBWVRBbFZUTVE0dwpEQVlEVlFRSURBVlVaWGhoY3pFUU1BNEdBMVVFQnd3SFNHOTFjM1J2YmpFWU1CWUdBMVVFQ2d3UFUxTk1JRU52Y25CdmNtRjBhVzl1Ck1UY3dOUVlEVlFRRERDNVRVMHd1WTI5dElFVldJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGtnVWxOQklGSXkKTUI0WERURTNNRFV6TVRFNE1UUXpOMW9YRFRReU1EVXpNREU0TVRRek4xb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1RNHdEQVlEVlFRSQpEQVZVWlhoaGN6RVFNQTRHQTFVRUJ3d0hTRzkxYzNSdmJqRVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1UY3dOUVlEClZRUUREQzVUVTB3dVkyOXRJRVZXSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhrZ1VsTkJJRkl5TUlJQ0lqQU4KQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBanpabFFPSFdUY0RYdE9sRzJtdnFNMGZOVFBsOWZiNjlMVDN3MjNqaApocVhadWdsWGFPMVhQcURRQ0VHRDV5aEJKQi9qY2hYUUFScjdYbkFqc3N1Zk9lUFB4VTdHa20wbXhudTdzOW9ublFxRzZZRTNCZjd3CmNYSHN3eHpwWTZJWEZKM3ZHMmZUaFZVQ0F0Wkp5Y3hhNGJIM2J6S2Z5ZFE3aUVHb25MM0xxOXR0ZXdrZm9reHlrTm9yQ1B6UFBGVE8KWncrb3oxMldHUXZFNDNMcnJkRjlIU2Z2a3VzUXYxdnJPNi9QZ04zQjBwWUVXM3ArcEtrOE9IYWtZbzZnT1Y3cWQ4OWRBRm1QWml3KwpCNktqQlNZUmFaZnFoYmNQbGd0THlFRGhVTG91aXN2M0Q1b2k1MythTnhQTjhrMFRheUhSd013aThxRkc5a1Jwbk1waE5RY0FiOVpoCkNCSHF1cmoyNmJOZzVVMjU3SjhVWnNsWFdOdk5oMm40aW9ZU0EwZS9aaE4yckhkOU5DU0ZnODNYcXB5UUdwOGhMSDk0dDJTNDJPaW0KOUhpelZjdUUwakxFZUs2amoySGR6Z2hUcmV5SS9CWGttZzNtbnhwM3preVB1QlFWUFdLY2hqZ0dBR1lTNUZsMldsUEFBcGlpRUN0bwpSSHVPZWM0elNuYXFXNEVXRzdXSzJOQUFlMTVpdEFuV2htTU9wZ1dWU2Jvb2k0aVRzalFjMktSVmJyY2MwTjZaVlRzajlDTGcrU2xtCkp1d2dVSGZiU2d1UHZ1VUNZSEJCWHRTdVVEa2lGQ2JMc2p0emRGVkhCM21CT2Fnd0UwVGxCSXF1bGhNbFFnKzVVOFNiL00za0hONDgKK3F2V0Jrb2ZaNmFZTUJ6ZExOdmNHSlZYWnNiL1hJdFc5WGNDQXdFQUFhTmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVgpIU01FR0RBV2dCVDVZTHZVNDlVMDlyajFCb0FscDNQYlJtbW9uakFkQmdOVkhRNEVGZ1FVK1dDNzFPUFZOUGE0OVFhQUphZHoyMFpwCnFKNHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01BMEdDU3FHU0liM0RRRUJDd1VBQTRJQ0FRQldzNDdMQ3AxSmpyK2t4Skc3WmhjRlVaaDEKKytWUUxIcWU4UlQ2cTlPS1B2K1JLWTlqaTlpMHFWUUJEYjZUaGkvNVNtM0hYdlZYK2NwVkhCSytSdzgyeGQ5cXQ5dDF3a2NsZjdueApZL2hvTFZVRTBmS05zS1RQdkR4ZUgzam5wYUFnY0xBRXhiZjNjcWZlSWcyOU15VkdqR1NTSnVNK0xtT1cycHVNUGZnWUNkY0R6SDJHCmd1REtCQWRSVU5mL2t0VU03OXFHbjVuWDY3ZXZhT0k1SnBTNmFMZS9nOVBxZW1jOVltZXVKZVZ5Nk9MazdLNFM5a3NyUEovcHNFRHoKT0ZTei9iZG95TnJHajFFOHN2dVIzQnpubTUzaHR3MXlqK0treEtsNCtlc1VyTVpEQmNKbE9TZ1lBc09Dc3AwRnZtWHRsbDlsZER6NwpDVFV1ZTV3VC9Sc1BYY2R0Z1RwV0Q4dzc0YThDTHlLc1JzcEdQS0FjVE5aRXRGNHVYQlZtQ2VFbUtmN0dVbUc2c1hQL3d3eWM1V3hxCmxEOFV5a0FXbFlUeldhbXNYMHhoazIzUk84eWlsUXdpcG1kblJDNjUyZEtLUWJObUMxcjdmU09sOGhxdy85NmJnNVF1MFQvZmtyZVIKcndVN1pjZWdiTEhOWWhMRGtCdmpKYzQwdkc5M2RyRVF3L2NGR3NEV3IzUmlTQmQza21tUVlSemVsWUIwVkk4WUhNUHpBOUMvcEVOMQpobE1ZZWdvdUNSdzJuNUg5Z29vaVM5RU9VQ1hkeXdNTUY4bURBQWhPTlUyS2krM3dBcFJtTEVSL3k1VW5saGV0Q1RDc3RuRVhib3NYCjlod0oxQzA3bUtWeDAxUVQyV0R6OVV0bVQvcng3aUFTamJTc1Y3RkZZNkdzZHFuQyt3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBFViBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IEVDQwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDbERDQ0FocWdBd0lCQWdJSUxDbWNXeGJ0QlpVd0NnWUlLb1pJemowRUF3SXdmekVMTUFrR0ExVUVCaE1DVlZNeERqQU1CZ05WCkJBZ01CVlJsZUdGek1SQXdEZ1lEVlFRSERBZEliM1Z6ZEc5dU1SZ3dGZ1lEVlFRS0RBOVRVMHdnUTI5eWNHOXlZWFJwYjI0eE5EQXkKQmdOVkJBTU1LMU5UVEM1amIyMGdSVllnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVNCRlEwTXdIaGNOTVRZdwpNakV5TVRneE5USXpXaGNOTkRFd01qRXlNVGd4TlRJeldqQi9NUXN3Q1FZRFZRUUdFd0pWVXpFT01Bd0dBMVVFQ0F3RlZHVjRZWE14CkVEQU9CZ05WQkFjTUIwaHZkWE4wYjI0eEdEQVdCZ05WQkFvTUQxTlRUQ0JEYjNKd2IzSmhkR2x2YmpFME1ESUdBMVVFQXd3clUxTk0KTG1OdmJTQkZWaUJTYjI5MElFTmxjblJwWm1sallYUnBiMjRnUVhWMGFHOXlhWFI1SUVWRFF6QjJNQkFHQnlxR1NNNDlBZ0VHQlN1QgpCQUFpQTJJQUJLb1NSNUNZRy92dncwQUhneUJPOFRDQ29nYlI4cEtHWWZMMklXaktBTVRINmtNQVZJYmMvUi9mQUxoQllsemNjQll5CjNoK1oxTXpGQjhnSUgyRVdCMUU5ZlZ3SFUrTTFPSXpmelovWkxnMUt0aGt1V25CYUJ1Mis4S0d3eXRBSkthTmpNR0V3SFFZRFZSME8KQkJZRUZGdktYdVhlMG9HcXphZ3RaRkcyMlhLYmwrWlBNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVVzhwZQo1ZDdTZ2FyTnFDMWtVYmJaY3B1WDVrOHdEZ1lEVlIwUEFRSC9CQVFEQWdHR01Bb0dDQ3FHU000OUJBTUNBMmdBTUdVQ01RQ0s1a0NKCk4rdnAxUlBaeXRSckpQT3dQWWRHV0Jyc3NkOXYrMWE2Y0d2SE9Nem9zWXhQRC9meFozWU9nOUFlVVk4Q01EMzJJeWdtVE1aZ2g1TW0KbTdJMUhyclc5enpSSE03NkpUeW1Hb0VWVy9NU0QyenVaWXJKaDZqNUIrQmltb3hjU2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgQ0EgLSBSNgo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmd6Q0NBMnVnQXdJQkFnSU9SZWE3QTRNenc0VmxTT2IvUlZFd0RRWUpLb1pJaHZjTkFRRU1CUUF3VERFZ01CNEdBMVVFQ3hNWApSMnh2WW1Gc1UybG5iaUJTYjI5MElFTkJJQzBnVWpZeEV6QVJCZ05WQkFvVENrZHNiMkpoYkZOcFoyNHhFekFSQmdOVkJBTVRDa2RzCmIySmhiRk5wWjI0d0hoY05NVFF4TWpFd01EQXdNREF3V2hjTk16UXhNakV3TURBd01EQXdXakJNTVNBd0hnWURWUVFMRXhkSGJHOWkKWVd4VGFXZHVJRkp2YjNRZ1EwRWdMU0JTTmpFVE1CRUdBMVVFQ2hNS1IyeHZZbUZzVTJsbmJqRVRNQkVHQTFVRUF4TUtSMnh2WW1GcwpVMmxuYmpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBSlVINkhQS1p2bnNGTXA3UFBjTkNQRzBSUXNzCmdyUkl4dXRiUEs2RHVFR1NNeFNrYjMvcEtzekdzSWhyeGJhSjBjYXkveFRPVVJRaDdFcmRHMXJHMW9mdVRUb1ZCdTFrWmd1U2dNcEUKM25PVVR2T25pWDlQZUdNSXlCSlFiVUptTDAyNWVTaE5VaHFLR29DM0dZRU9mc1NLdkdSTUlSeERhTmM5UElyRnNtYlZrSnEzTVFiRgp2dUp0TWdhbUh2bTU2NnFqdUwrK2dtTlEwUEFZaWQva0QzbjE2cUlmS3RKd0xudm52Sk83YlZQaVNIeU1FQWM0LzJheWQyRis0T3FNClBLcTBwUGJ6bFVvU0IyMzlqTEtKejlDZ1lYZklXSFN3MUNNNjkxMDZ5cUxiblFuZVhVUXRrUEdCelZlUytuNjhVQVJqTk45cmt4aSsKYXpheU9lU3NKRGEzOE8rMkhCTlhrN2Jlc3ZqaWhiZHpvcmcxcWtYeTRKMDJvVzlVaXZGeVZtNHVpTVZSUWtRVmxPNmp4VGlXbTA1TwpXZ3RIOHdZMlNYY3d2SEUzNWFic0lRaDEvT1poRmo5MzFkbVJsNFFLYk5RQ1RYVEFGTzM5T2Z1RDhsNFVvUVN3QytuKzdvL2hiZ3V5CkNMTmhaZ2xxc1FZNlpaWlp3UEExL2NuYUtJMGFFWWR3Z1Fxb21uVWRuanFHQlFDZTI0RFdKZm5jQlo0bldVeDJPVnZxK2FXaDJJTVAKMGYvZk1CSDVoYzh6U1BYS2JXUVVMSHBZVDlOTENFbkZsV1FhWXc1NVBmV3pqTXBZclp4Q1JYbHVEb2NaWEZTeFpiYS9qSnZjRStrTgpiN2d1M0dkdXlZc1J0WVFVaWdBWmNJTjVrWmVSMUJvbnZ6Y2VNZ2ZZRkdNOEtFeXZBZ01CQUFHall6QmhNQTRHQTFVZER3RUIvd1FFCkF3SUJCakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlN1YkFXamt4UGlvdWZpMXh6V3gvQi95R2RUb0RBZkJnTlYKSFNNRUdEQVdnQlN1YkFXamt4UGlvdWZpMXh6V3gvQi95R2RUb0RBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQWd5WHQ2Tkg5bFZMTgpuc0FFb0pGcDVselFoTjdjcmFKUDZFZDQxbVdZcVZ1b1BJZDhBb3JSYnJjV2MrWmZ3RlNZMVhTK3djM2lFWkd0SXhnOTNlRnlSSmEwCmxWN0FlNDZaZUJaREUxWlhzNkt6TzdWMzNFQnlyS1BybXpVK3NRZ2hvZWZFUXpkNU1yNjE1NXdzVEx4REtabU9NTk9zSWVEakhmclkKQnpOMlZBQWlLcmxOSUM1d2FOcmxVL3lEWE5PZDh2OUVERVJtOHRManZVWUFHbTBDdWlWZGphRXhVZDFVUmh4TjI1bVc3eG9jQkZ5bQpGZTk0NEhuK1hkcytxa3hWL1pvVnFXL2hwdnZmY0REcHcrNUNSdTNDa3dXSituMWplei9RY1lGOEFPaVlyZzU0Tk1NbCs2OEtueUJyCjNUc1RqeEtNNGtFYVNIcHpvSGRweDdaY2Y0TElIdjVZR3lncnFHeXRYbTNBQmRKN3QrdUEvaVUzL2dLYmFLeENYY1B1OWN6YzhGQjEKMGpacG5PWjdCTjl1Qm1tMjNnb0pTRm1INjNzVVlIcGtxbWxENzVISFRPd1kzV3p2VXkyTW1lRmU4bkkrejFUSXZXZnNwQTlNUmYvVAp1VEFqQjB5UEVMK0dsdG1aV3JTWlZ4eWt6THNWaVZPNkxBVVA1TVNlR2JFWU5OVk1uYnJ0OXgrdkpKVUVlS2dEdSs2QjVkcGZmSXRLCm9aQjBKYWV6UGt2SUxGYTl4OGp2T09KY2t2QjU5NXlFdW5RdFlRRWdmbjdSOGs4SFdWK0xMVU5TNjBZTWxPSDFaa2Q1ZDlWVVd4K3QKSkRmTFJWcE9vRVJJeU5pd21jVVZoQW4yMWtsSndHVzQ1aHB4YnFDbzhZTG9SVDVzMWdMWENtZURCVnJKcEJBPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpPSVNURSBXSVNlS2V5IEdsb2JhbCBSb290IEdDIENBCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNhVENDQWUrZ0F3SUJBZ0lRSVNwV0RLN2FES3RBUmI4cm9pMDY2akFLQmdncWhrak9QUVFEQXpCdE1Rc3dDUVlEVlFRR0V3SkQKU0RFUU1BNEdBMVVFQ2hNSFYwbFRaVXRsZVRFaU1DQUdBMVVFQ3hNWlQwbFRWRVVnUm05MWJtUmhkR2x2YmlCRmJtUnZjbk5sWkRFbwpNQ1lHQTFVRUF4TWZUMGxUVkVVZ1YwbFRaVXRsZVNCSGJHOWlZV3dnVW05dmRDQkhReUJEUVRBZUZ3MHhOekExTURrd09UUTRNelJhCkZ3MDBNakExTURrd09UVTRNek5hTUcweEN6QUpCZ05WQkFZVEFrTklNUkF3RGdZRFZRUUtFd2RYU1ZObFMyVjVNU0l3SUFZRFZRUUwKRXhsUFNWTlVSU0JHYjNWdVpHRjBhVzl1SUVWdVpHOXljMlZrTVNnd0pnWURWUVFERXg5UFNWTlVSU0JYU1ZObFMyVjVJRWRzYjJKaApiQ0JTYjI5MElFZERJRU5CTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVUT2xRd01ZUGNoaTgyUEc2czRuaWVVcWpGcWRyClZDVGJVZi9xOUFra3d3c2luOHRxSjRLQkRkTEFyekhrZElKdXlpWFpqSFdkOGR2UW1xSkxJWDRXcDJPUTBqblVzWWQ0WHhpV0QxQWIKTlRjUGFzYmMyUk5OcEk2UU4rYTlXekdSbzFRd1VqQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZApCZ05WSFE0RUZnUVVTSWNVck9QRG5wQmdPdGZLaWU3VHJZeTBVR1l3RUFZSkt3WUJCQUdDTnhVQkJBTUNBUUF3Q2dZSUtvWkl6ajBFCkF3TURhQUF3WlFJd0pzZHBXOXpWNTdMbnlBeU1qTVBkZVl3Ylk5WEpVcFJPVFlKS2N4NnlnSVNwSmNCTVdtMUpLV0I0RStKK1NPdGsKQWpFQTJ6UWdNZ2ovbWtrQ3RvamVGSzlkYkpseGpSby9pOWZnb2phR0hBZUNPblpUL2NLaTdlOTdzSUJQV0E5TFV6bTkKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVUNBIEdsb2JhbCBHMiBSb290Cj09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJqQ0NBeTZnQXdJQkFnSVFYZCt4MmxxajdWMitXbVVnWlFPUTd6QU5CZ2txaGtpRzl3MEJBUXNGQURBOU1Rc3dDUVlEVlFRRwpFd0pEVGpFUk1BOEdBMVVFQ2d3SVZXNXBWSEoxYzNReEd6QVpCZ05WQkFNTUVsVkRRU0JIYkc5aVlXd2dSeklnVW05dmREQWVGdzB4Ck5qQXpNVEV3TURBd01EQmFGdzAwTURFeU16RXdNREF3TURCYU1EMHhDekFKQmdOVkJBWVRBa05PTVJFd0R3WURWUVFLREFoVmJtbFUKY25WemRERWJNQmtHQTFVRUF3d1NWVU5CSUVkc2IySmhiQ0JITWlCU2IyOTBNSUlDSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQWc4QQpNSUlDQ2dLQ0FnRUF4ZVlyYjN6dkpnVW5vNEVrMm0vTEFmbVptcWt5d2lLSFlVR1JPOHZEYUJzR3hVeXBLOEZuRnlJZEsrMzVLWW1UCm9uaTlrbXVnb3cyaWZzcVRzNmJSakRYVmRma1g5czlGeGVWNjdIZVRvSThqcmc0YUEzKysxTkR0TG51clJpTmIveXptVkhxVXdDb1YKOE1tTnNIbzdKT0hYYU9JeFBBWXpSclpVRWFhbEx5SlVLbGdOQVFMeCtoVlJaMnpBK3RlMkczL1JWb2d2R2pxTk83dUNFZUJIQU5CUwpoNnY3aG40UEpHdEFuVFJudkkzSExZWnZlVDZPcVR3WFMzK3dtZU93Y1dEY0MvVmt3ODVEdkcxeHVkTGVKMXVLNk5qR3J1RlpmYzhvCkxUVzRsVllhOGJKWVM3Y1NOOGg4cysxTGdPR04raklqdG0rM1NKVUlzVVJPaFl3NkFsUWdMOSsvVjA4N09wQWgxOEVtTlZRZzdNYy8KUit6dldyOUxlc0d0T3hkUVhHTFlEMHRLM0N2NmJyeHprczNzeDFEb1FaYlhxWDV0Mk9rZGo0cTF1VmlTdWtxU0t3eFcvWURyQ1BCZQpLVzRiSEF5dmo1T0pyZHU5bzU0aHlva1o3Tisxd3hyckZ2NTROa3pXYnRBK0Z4eVFGMnNtdXZ0Nkw3OFJIQmdPTFhNRGo2RGxOYUJhCjRreDFIWEhoT1RoVGVFRE1nNVBYQ3A2ZFc0K0s1T1hnU09SSXNrZk5UaXAxS252eUl2Ykp2Z21SbGxkNmlJaXM3bkNzK2R3cDR3d2MKT3hKT1JOYW5UckFteVBQWkdwZVJhT3J2alVZRzBsWkZXSm84REErRHVBVWx3em5QTzZRMGliZDVFaTlIeGVlcGwybjhwbmRudGQ5Nwo4WHBsRmVSaFZtVUNBd0VBQWFOQ01FQXdEZ1lEVlIwUEFRSC9CQVFEQWdFR01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPCkJCWUVGSUhFak16MTVERC9wUXdJWDR3Vlp5RjBBZC9mTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFBVFpTTDFqaXV0Uk9UTC83bG8KNXNPQVNEMEVlL29qTDNydE50cXl6bTMyNXA3bFgxaVB5emN5b2NobHRxNDRQVFViUHJ3N3RnVFF2UGxKOVp2M2hjVTJ0c3U4K01nNQoxZVJmQjcwVlZKZDB5c3J0VDdxNlpIYWZnYmlFUlVsTWpXK2k2N0hNMGNPVTJrVEM1dUxxR09paUh5Y0Z1dGZsMXFuTjNlOTJtSTBBCkRzMGIrZ08zam9CWURpYy9VdnVVb3NwZVpjbldoTnE1TlhIekpzQlBkK2FCSjlKM081b1ViM24wOXREaDA1UzYwRmRSdlNjRkRjSDkKeUJJdzdtK05FU3NJbmRUVXY0QkZGSnFJUk5vdzZyU240Kzd2VzRMVlB0YXRlSkxiWER6ejJLMzZ1R3QveERZb3RnSVZpbFFzbkxBWApjNDdRTjZNVVBKaVZBQXdwQlZ1ZVNVbXhYOGZqeTg4blpZNDFGN2RYeUREWlFWdTVGTGJvd2crVU1hZVVtTXhxNjdYaEovVVFxQUhvCmpoSmk2SWpNdFg5R2w4Q2JFR1k0R2paR1h5Sm9QZC9KeGhNbnExTUdyS0k4aGdabGI3RitzU2xFbXFPNlNXa29hWS9YNVYrdEJJWmsKYnhxZ0RNVUlZczZBbzlEejdHamV2alBIRjF0L2dNUk1UTEdtaElyRE83Z0p6UlNCdWhqalZGYzIvdHN2ZkVlaE9qUEkrVmc3UkUreAp5Z0tKQkpZb2FNVkx1Q2FKdTlZekwxRFYvcHFKdWhneWtsVEdXK0NkK1Y3bERTS2I5dHJpeUNHeVlpR3Foa0N5TG1UVFg4ampmaEZuClJSOEYvdU9pNzdPb3MvTjlqL2dNSHlJZkxYQzB1QUUwZGpBQTVTTjRwMWJYVUIrSyt3YjF3aG53MEE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpVQ0EgRXh0ZW5kZWQgVmFsaWRhdGlvbiBSb290Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZXakNDQTBLZ0F3SUJBZ0lRVDlJcmovVmt5RE9lVHpSWVppTndZREFOQmdrcWhraUc5dzBCQVFzRkFEQkhNUXN3Q1FZRFZRUUcKRXdKRFRqRVJNQThHQTFVRUNnd0lWVzVwVkhKMWMzUXhKVEFqQmdOVkJBTU1IRlZEUVNCRmVIUmxibVJsWkNCV1lXeHBaR0YwYVc5dQpJRkp2YjNRd0hoY05NVFV3TXpFek1EQXdNREF3V2hjTk16Z3hNak14TURBd01EQXdXakJITVFzd0NRWURWUVFHRXdKRFRqRVJNQThHCkExVUVDZ3dJVlc1cFZISjFjM1F4SlRBakJnTlZCQU1NSEZWRFFTQkZlSFJsYm1SbFpDQldZV3hwWkdGMGFXOXVJRkp2YjNRd2dnSWkKTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDcENRY29Fd0t3bWVCa3FoNURGbnB6c1pHZ2RUNm8rdU00QUhycwppV29nRDR2RnNKc3pBMXFHeGxpRzFjR0Z1MC9HbkVCTnlyN3VhWmE0cllFd21ueVNCZXNGSzVwSTBMaDJQcGJJSUx2U3NQR1AyS3hGClJ2K3FaMkMwZDM1cUh6d2FVbm9FUFFjOGhRMkUwQjkyQ3ZkcUZOOXk0elI4VjA1V0FUNTU4YW9wTzJ6NitJOXRUY2cxMzY3cjNDVHUKZVVXbmhiWUZpTjZJWFNWOGwyUm5DZG0vV2hVRmh2TUpIdXhZTWpNUjgzZGtzSFlmNUJBMUZ4dnlEckZzcENxamMvd0pIeDR5R1ZNUgo1OW16TEM1MkxxR2ozbjVxaUFubzhnZUsrTExORU9maWMwQ1R1d2pSUCtIOEM1U3pKZTk4cHRmUnI1Ly9scHIxa1h1WUMzZlVmdWdICjBtSzFsVG5qOC9GdER3NWxoSXBqVk1XQXR1Q2VTMzFISnFjQkNGM1JpSjdYd3pKRStvSktDbWhVZnpoVEE4eWtBRE5rVVZrTG80S1IKZWw3c0ZzTHpLdVppMmlyYldXSVFKVW9xZ1F0SEIwTUdjSWZTK3BNUktYcElUZXVVeDNCTnIyZlZVYkdBSUFFQnRIb0lwcEIvVHVEdgpCMEdIcjJxbFhvdjd6MUN5bWxTdnc0bTZXQzMxTUppeE5uSTVma2tFL1NtblRIbmtCVmZibExrV1U0MUdzeDJWWVZkV2Y2L3dGbHRoCldHODJVQkVMMkt3cmxSWWFEaDhJelRZMFpSQmladFdBWHhRZ1h5ME1vSGdLYU5ZczErbHZLOUpLQlpQOG5tOXJaLytJOFU2bGFVcFMKTndYcXhoYU4wc1NaMFlJck83bzFkZmRSVVZqenlBZmQ1TFFEZndJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVTJYUTY1REE5RGZjUwozSDVhQlo4ZU5KcjM0UlF3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FZWXdEUVlKS29aSWh2Y05BUUVMCkJRQURnZ0lCQURhTmw4eENGV1FwTjVzbUxOYjdyaFZwTEdzYUd2ZGZ0dmtIVEZucTg4bkl1YTdNdWk1NjNNRDFzQzNBTzYrZmNBVVIKYXA4bFR3RXBjT1BsRE9IcVduemNTYnZCSGlxQjlSWkxjcEhJb2pHNXF0cjhuUi96WFVBQ0UveE9IQWJLc3hTUVZCY1pFaHJ4SDljTQphVnIyY1hqMGxIMlJDNDdza0ZTT3ZHK2hUS3Y4ZEdUOWNacjRRUWVoelpIa1BKcmdtekk1YzZzcTFXbkllSkVtTVgzaXh6RHgvQlI0CmR4SU9FL1RkRnBTL1MyZDdjRk9GeXJDNzh6aE5MSkE1d0EzQ1hXdnA0dVhWaUkzV0xMK3JHNzYxS0ljU0YzUnUvSDM4ajlDSEpyQWIKKzdsc3ErS2VQUlhCT3k1bkFsaVJuKy80UWg4c3QyajFkYTNQdGZiL0VYM0M4Q1NscmRQNm9EeXArbDNjcGFEdlJLUysxdWpsNUJPVwpGM3NHUGpMdHg3ZEN2SGFqMkdVNEt6ZzFVU0VPRG04dU5CTkE0U3RuREcxS1FUQVlJMW95VlpuSkYrQTgzdmJzZWEwcldCbWlyU3dpCkdwV092cGFRWFVKWHhQa1VBelVySEMxUlZ3aW5PdDQvNU1pMEEzUEN3U2FBdXd0Q0g2ME5yeVp5MnN5K3M2T0RXQTJDeFI5R1VlT2MKR015Tm00M3NTZXQxVU5XTUtGbktkRFRhakFzaHF4N3FHK1hIL1JVK3dCZXEreU51SmtiTCt2bXhjbXRwenlLRUMySVByTmtaQUpTaQpkanpVTFpydEJKNHRCbUlRTjFJY2hYSWJKK1hNeGpIc04reGpXWnNMSFhiTWZqS2FpSlVJTmxLNzNuWmZka2xKclgrOVpTQ3l5Y0VyCmRoaDJuMWF4Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkNlcnRpZ25hIFJvb3QgQ0EKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR1d6Q0NCRU9nQXdJQkFnSVJBTXJwRzRueFZRTU5vK1pCYmNUanB1RXdEUVlKS29aSWh2Y05BUUVMQlFBd1dqRUxNQWtHQTFVRQpCaE1DUmxJeEVqQVFCZ05WQkFvTUNVUm9hVzE1YjNScGN6RWNNQm9HQTFVRUN3d1RNREF3TWlBME9ERTBOak13T0RFd01EQXpOakVaCk1CY0dBMVVFQXd3UVEyVnlkR2xuYm1FZ1VtOXZkQ0JEUVRBZUZ3MHhNekV3TURFd09ETXlNamRhRncwek16RXdNREV3T0RNeU1qZGEKTUZveEN6QUpCZ05WQkFZVEFrWlNNUkl3RUFZRFZRUUtEQWxFYUdsdGVXOTBhWE14SERBYUJnTlZCQXNNRXpBd01ESWdORGd4TkRZegpNRGd4TURBd016WXhHVEFYQmdOVkJBTU1FRU5sY25ScFoyNWhJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDCkR3QXdnZ0lLQW9JQ0FRRE5HRGxsR2xteDZtUVdEb3lVSkpWOGc5UEZPU2JjRE84V1Y0M1gyS3lqUW4rQ3l1M05XOXNPdHkzdFJRZ1gKc3Rtenk5WVhVbklvMjQ1T25vcTJDL21laEpwTmR0NGlLVnpTczlJR1BqQTVxWFNqa2xZY29XOU1DaUJ0bnlONnRNYmFMT1FkTE55egpLTkFUOGt4T0FrbWhWRUNlNXVVRm9DMkV5UCtZYk5EcmlocUVDQjYzYUNQdUk5Vnd6bTFSYVJEdW9YckMwU0l4d29LRjB2SlZkbEI4CkpYckpoRndMck4xQ1Rpdm5ncUlraWN1UXN0RHVJN3BtVEx0aXBQbFRXbVI3ZkpqNm8waWVENVd1cHhqMGF1d3VBMFd2OEhUNEtzMTYKWGRHK1JDWXlLZkh4OVd6TWZnSWhDNTl2cEQrK25WUGl6MzJwTEh4WUdwZmhQVGMzR0dZbzBrREZVWXFNd3kzT1U0Z2tXR1F3RnNXcQo0TllLcGtEZmVQYjFCSHhwRTRTODBkR25CczhCOTJqQXFGZTdPbUd0Qkl5VDQ2Mzg4TnRFYlZuY1NWbXVySnFaTmpCQmUzWXpJb2VqCndwS0didmx3N3E2SGg1VWJ4SHE5TWZQVTB1V1ovNzVJN0hYMWVCWWRwbkRCZnp3Ym9aTDd6OGc4MXNXVENvLzFWVHAybGM1Wm1Jb0oKbFhjeW1vTzZMQVE2bDczVUw3N1hiSnVpeW4xdEpzbFYxYy9EZVZJSUNaa0hKQzFrSld1bUlXbWJhdDEwVFd1WGVrRzlxeGY1a0JkSQpqemI1TGRYRjIrNnFoVVZCK3MwNlJiRm81alpNbTVCWDdDTzVod2pDeEFueGw0WXFLRTNpZE1EYXhJemIzK0toRjFuT0pGbDBNZHAvCi9UQnQyZHpoYXVIOFh3SURBUUFCbzRJQkdqQ0NBUll3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKSFFZRFZSME9CQllFRkJpSFZ1QnVkKzRrTlR4T2M1b2YxdUhpZVg0ck1COEdBMVVkSXdRWU1CYUFGQmlIVnVCdWQrNGtOVHhPYzVvZgoxdUhpZVg0ck1FUUdBMVVkSUFROU1Ec3dPUVlFVlIwZ0FEQXhNQzhHQ0NzR0FRVUZCd0lCRmlOb2RIUndjem92TDNkM2QzY3VZMlZ5CmRHbG5ibUV1Wm5JdllYVjBiM0pwZEdWekx6QnRCZ05WSFI4RVpqQmtNQytnTGFBcmhpbG9kSFJ3T2k4dlkzSnNMbU5sY25ScFoyNWgKTG1aeUwyTmxjblJwWjI1aGNtOXZkR05oTG1OeWJEQXhvQytnTFlZcmFIUjBjRG92TDJOeWJDNWthR2x0ZVc5MGFYTXVZMjl0TDJObApjblJwWjI1aGNtOXZkR05oTG1OeWJEQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFsTGllVC9EamxRZ2k1ODFvUWZjY1ZkVjhBT0l0Ck9vbGRhRGd2VVNJTFNvM0w2YnRkUHJ0Y1BiRW8vdVJUVlJQUG9aQWJBaDFmWmtZSk15amhEU1NYY05NUUgrcGtWNWE3WGRybnhJeFAKVEdSR0hWeUg0MW5lUXRHYnFINm1pZDJQSE1rd2d1MDduTTNBNlJuZ2F0Z0NkVGVyOXpRb0tKSHlCQXBQTmVOZ0pnSDYwQkdNK1JGcQo3cTg5dzFEVGoxOHplVHlHcUhORmtJd2d0bkp6RnlPK0IyWGxlSklOdWdIQTY0d2NacitzaG5jQmxBMmM1dWs1alIrbVVZeVpERGwzCjRiU2IraHhuVjI5cWFvNnBLMHhYZVhwWElzL05YMk5HalZ4Wk9vYjRNa2RpbzJjTkdKSGMrNlpyOVVoaGN5TlpqZ0tudkVUcTlFbWQKOFZSWStXQ3YyaGlrTHloRjNIcWdpSVpkOHp2bi95azFnUHhrUTVUbTR4eHZ2cTBPS21PWks4bCtoZlp4NkFZRGxmN2VqMGdjV3RTUwo2Q3Z1NXpIYnVnUnFoNWpueFYvdmZhY2k5d0hZVGZtSjBBNmFCVm1rbnBqWmJ5dktjTDVrd2xXajlPbXZ3NUlwM0lnV0pKazhqU2FZCnRsdTN6TTYzTndmOUp0bVloU1QvV1NNRG11MmRuYWprWGpqTzExSU5iOUkvYmJFRmEwbk9pcEZHYy9UMkwvQ29jM2NPWmF5aGpXWlMKYVg1TGFBekhIamNuZzZXTXh3TGtGTTFKQWJCenMvM0drRHB2MG16dE8rN3NrYjZpUTEyTEFFcG1KVVJ3M2tBUCtId1Y5NkxPUE5kZQpFNHlCRnhnWDBiM3hkeEE2MUdVNXdTZXNWeXdsVlAraTJrK0tZVGxlcmoxS2pMMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKZW1TaWduIFJvb3QgQ0EgLSBHMQo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlEbERDQ0FueWdBd0lCQWdJS01mWGtZZ3hzV08zVzJEQU5CZ2txaGtpRzl3MEJBUXNGQURCbk1Rc3dDUVlEVlFRR0V3SkpUakVUCk1CRUdBMVVFQ3hNS1pXMVRhV2R1SUZCTFNURWxNQ01HQTFVRUNoTWNaVTExWkdoeVlTQlVaV05vYm05c2IyZHBaWE1nVEdsdGFYUmwKWkRFY01Cb0dBMVVFQXhNVFpXMVRhV2R1SUZKdmIzUWdRMEVnTFNCSE1UQWVGdzB4T0RBeU1UZ3hPRE13TURCYUZ3MDBNekF5TVRneApPRE13TURCYU1HY3hDekFKQmdOVkJBWVRBa2xPTVJNd0VRWURWUVFMRXdwbGJWTnBaMjRnVUV0Sk1TVXdJd1lEVlFRS0V4eGxUWFZrCmFISmhJRlJsWTJodWIyeHZaMmxsY3lCTWFXMXBkR1ZrTVJ3d0dnWURWUVFERXhObGJWTnBaMjRnVW05dmRDQkRRU0F0SUVjeE1JSUIKSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQWswdTc2V2FLN3AxYjFUU1QwQnNldytlZXVHUXpmMk40YUxUTgpMbkYxMTVzZ3hrMHB2TFpvWUlyM0lacFdOVnJ6ZHIzWXpaci9rMVpMcFZrR29aTTBLZDBXTkhWTzhvRzB4NVpPclJrVlVrcitQSEIxCmNNMnZLNnNWbWpNOHFyT0xxczFEL2ZYcWNQL3R6eEU3bE01T01oYlRJMEFxZDdPdlBBRXNiTzJaTEl2WlRtbVlzdmVQUWJBeWVHSFcKRFYvRCtxSkFraDFjRitad1BqWG5vcmZDWXVLcnBEaE10VGsxYitvRGFmbzZWR2lGYmRieUwwTlZIcEVORHRqVmFxU1cwUk04TEhoUQo2RHFTMGhkVzVUVWFRQncralN6dE9kOUM0SU5CZE4ranpjS0dZRWhvNDJrTFZBQ0w1SFpwSVExNVRqUUlYaFRDekxHM3JkZDhjSXJICmhRSURBUUFCbzBJd1FEQWRCZ05WSFE0RUZnUVUrKzhOaHA2dzQ5MnB1ZkVoRjM4Ky9QQjNLeG93RGdZRFZSMFBBUUgvQkFRREFnRUcKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQUZuLzhvejFoMzF4UGFPZkcxdlIydmpUbkdzMgp2WnVwWWV2ZUZpeDBQWjdtZGRyWHVxZThRaGZuUFpIcjVYM2RQcHp4ejVLc2JFak13aUkvYVR2RnRoVXZvelhHYUNvY1Y2ODU3NDNRCk5jTVlESHNBVmh6Tml4bDAzcjRQRXVEUXFxRS9BalN4Y002ZEdOWUlBd2xHN21EZ2ZyYkVTUVJSZlhCZ3ZLcXkvM2x5ZXFZZFBWOHEKK01yaS9UbTNSN25yZnQ4RUk2LzZuQVlINmZ0ams0QkF0Y1pzQ2pFb3pneWZ6N01qTllCQmpXekVOM3VCTDRDaFFFS0Y2ZGs0amVpaApVODBCdjJub1dnYnlSUXVRK3E3aHY1M3lybGM4cGE2eVZ2U0xaVURwL1RHQkxQUTVDZGp1YTZlMHBoMFZwWmozQVlIWWhYM3pVVnh4CmlONjZ6QitBZmtvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplbVNpZ24gRUNDIFJvb3QgQ0EgLSBHMwo9PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1RqQ0NBZE9nQXdJQkFnSUtQUFlIcVdod0R0cUxoREFLQmdncWhrak9QUVFEQXpCck1Rc3dDUVlEVlFRR0V3SkpUakVUTUJFRwpBMVVFQ3hNS1pXMVRhV2R1SUZCTFNURWxNQ01HQTFVRUNoTWNaVTExWkdoeVlTQlVaV05vYm05c2IyZHBaWE1nVEdsdGFYUmxaREVnCk1CNEdBMVVFQXhNWFpXMVRhV2R1SUVWRFF5QlNiMjkwSUVOQklDMGdSek13SGhjTk1UZ3dNakU0TVRnek1EQXdXaGNOTkRNd01qRTQKTVRnek1EQXdXakJyTVFzd0NRWURWUVFHRXdKSlRqRVRNQkVHQTFVRUN4TUtaVzFUYVdkdUlGQkxTVEVsTUNNR0ExVUVDaE1jWlUxMQpaR2h5WVNCVVpXTm9ibTlzYjJkcFpYTWdUR2x0YVhSbFpERWdNQjRHQTFVRUF4TVhaVzFUYVdkdUlFVkRReUJTYjI5MElFTkJJQzBnClJ6TXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFRanBReTRMUkwxS1BPeHN0M2lBaEtBbmpsZlNVMmZ5U1UwV1hUc3V3WWMKNThCeXIraXVMK0ZCVkljVXFFcXk2SHlDNWx0cXRkeXpkYzZMQnRDR0k3OUcxWTRQUHdUMDF4eVNmdmFsWThMMVg0NHVUNkVZR1FJcgpNZ3FDWkgwV2s5R2pRakJBTUIwR0ExVWREZ1FXQkJSOFhRS0VFOVRNaXB1QnpoY2NMaWtlbkVoalFqQU9CZ05WSFE4QkFmOEVCQU1DCkFRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUF2dk5oendJUUhXU1ZCN2dZYm9pRkJTK0QKQ0JlUXloK0tUT2dORzNxeHJkV0JDVWZ2TzZ3SUJIeGNtYkh0UndmU0FqRUFuYnBWL0tsSzZPM3Q1bllCUW52SStHRFpqVkdMVlR2NwpqSHZyWlFuRCtKYk5SNmlDOGhaVmR5UitFaENWQkN5agotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgplbVNpZ24gUm9vdCBDQSAtIEMxCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjekNDQWx1Z0F3SUJBZ0lMQUs3UEFMckV6ekw0UTdJd0RRWUpLb1pJaHZjTkFRRUxCUUF3VmpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRXpBUkJnTlZCQXNUQ21WdFUybG5iaUJRUzBreEZEQVNCZ05WQkFvVEMyVk5kV1JvY21FZ1NXNWpNUnd3R2dZRFZRUURFeE5sYlZOcApaMjRnVW05dmRDQkRRU0F0SUVNeE1CNFhEVEU0TURJeE9ERTRNekF3TUZvWERUUXpNREl4T0RFNE16QXdNRm93VmpFTE1Ba0dBMVVFCkJoTUNWVk14RXpBUkJnTlZCQXNUQ21WdFUybG5iaUJRUzBreEZEQVNCZ05WQkFvVEMyVk5kV1JvY21FZ1NXNWpNUnd3R2dZRFZRUUQKRXhObGJWTnBaMjRnVW05dmRDQkRRU0F0SUVNeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeit1cAp1ZkdaQmN6WUtDRks4M00wVVlSV0VQV2dUeXdTNC9vVG1pZlF6L2w1R25SZkhYazUvRnY0Y0k3Z2tsTDM1Q1g1VklQWkhkUElXb1UvClhzZTJCKzQrd002YXI2eFdRaW81SlhEV3Y3VjdOcTJzOW5QY3pkY2Rpb09sK3l1UUZUZHJIQ1pIM0RzcFZwTnFzOEZxT3AwOTljR1gKT0ZnRml4d1I0K1MwdUYyRkhZUCtlRjhMUldnWVNLVkdjelE3L2cvSWRydkhHUE1GMFliemhlM251ZGt5clZXSXpxYTJrYkJQckg0VgpJNWIyUC9BZ05CYmVDc2JFQkVWNWY2Zjl2dEtwcGErY3hTTXE5endoYkwydmowN0ZPckx6TkJMODM0QWFTYVRVcVpYM25vbGVvb21zCmxNdW9hSnV2aW1VbnpZbnUzWXkxYXlsd1E2QnBDK1M1RHdJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVS9xSGdjQjRxQXpsU1drSysKWEpHRmVoaXFUYlV3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRApnZ0VCQU1KS1Z2b1ZJWHNvb3VubEhmdjRMY1E1bGtGTU95Y3N4R3dZRllER3JLOUhXUzhtQytNMnNPODcva09YU1RLWkVoVmIzeEVwCi82dFQrTHZCZUErc25GT3ZWNzFvakQxcE0vQ2pvQ05qTzJSbklrU3QxWEhMVmlwNGtxTlBFakUyTnVMZS9nREVvMkFQSjYyZ3NJcTEKTm5wU29iMG45Q0FuWXVoTmxDUVQ1QW9FNlR5ckxzaERDVXJHWVFUbFNUUiswOFRJOVEvQXF1bTZWRjd6WXl0UFQxRFUvcmw3bVl3OQp3QzY4QWl2VHhFRGtpZ2N4SHB2T0pwa1QreEhxbWlJTUVSbkhYaHVCVURESWxoSnU1OHRCZjVFN29rZTNWSUFiM0FETW1wRHF3OE5RCkJtSU1NTUFWU0tlb1dYemhyaUtpNGdwNkQvcGlxMUpNNGZIZnlyNkREVUk9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmVtU2lnbiBFQ0MgUm9vdCBDQSAtIEMzCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDS3pDQ0FiR2dBd0lCQWdJS2UzRzJnbGE0RW55Y3FEQUtCZ2dxaGtqT1BRUURBekJhTVFzd0NRWURWUVFHRXdKVlV6RVRNQkVHCkExVUVDeE1LWlcxVGFXZHVJRkJMU1RFVU1CSUdBMVVFQ2hNTFpVMTFaR2h5WVNCSmJtTXhJREFlQmdOVkJBTVRGMlZ0VTJsbmJpQkYKUTBNZ1VtOXZkQ0JEUVNBdElFTXpNQjRYRFRFNE1ESXhPREU0TXpBd01Gb1hEVFF6TURJeE9ERTRNekF3TUZvd1dqRUxNQWtHQTFVRQpCaE1DVlZNeEV6QVJCZ05WQkFzVENtVnRVMmxuYmlCUVMwa3hGREFTQmdOVkJBb1RDMlZOZFdSb2NtRWdTVzVqTVNBd0hnWURWUVFECkV4ZGxiVk5wWjI0Z1JVTkRJRkp2YjNRZ1EwRWdMU0JETXpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCUDJsWWE1N0poQWQKNmJjaU1LNEc5SUd6c1VKeGxUbTgwMUxqcjYvNThwYzFralpHRG9lVmpiazVXdW03MzlEK3lBZEJQTHRWYjRPamF2dGlzSUdKQW5COQpTTVZLNCtraVZDSk5rN3RDREs5M25DT21mZGRoRWM1bHgvaC8vdlh5cWFOQ01FQXdIUVlEVlIwT0JCWUVGUHRhU05DQUlFRHlxT2tBCkIya1pkNmZtdy9UUE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUFvR0NDcUdTTTQ5QkFNREEyZ0EKTUdVQ01RQzAyQzhDaWYyMlRHSzZRMDRUaEhLMXJ0MGMzdGExM0ZhUFdFQmFMZDRnVENLRHlwT29mdTRTUU1mV2gwLzQzNFVDTUJ3VQpaT1I4bG9NUm5MRFJXbUZMcGc5SjB3RDhvZnprcGY5L3JkY3cwTWQzZjc2QkIxVXdVQ0FVOVZjNENxZ3hVUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhvbmdrb25nIFBvc3QgUm9vdCBDQSAzCj09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGenpDQ0E3ZWdBd0lCQWdJVUNCWmZpa3lsN0FESmswRGZ4TWF1STdnY1dxUXdEUVlKS29aSWh2Y05BUUVMQlFBd2J6RUxNQWtHCkExVUVCaE1DU0VzeEVqQVFCZ05WQkFnVENVaHZibWNnUzI5dVp6RVNNQkFHQTFVRUJ4TUpTRzl1WnlCTGIyNW5NUll3RkFZRFZRUUsKRXcxSWIyNW5hMjl1WnlCUWIzTjBNU0F3SGdZRFZRUURFeGRJYjI1bmEyOXVaeUJRYjNOMElGSnZiM1FnUTBFZ016QWVGdzB4TnpBMgpNRE13TWpJNU5EWmFGdzAwTWpBMk1ETXdNakk1TkRaYU1HOHhDekFKQmdOVkJBWVRBa2hMTVJJd0VBWURWUVFJRXdsSWIyNW5JRXR2CmJtY3hFakFRQmdOVkJBY1RDVWh2Ym1jZ1MyOXVaekVXTUJRR0ExVUVDaE1OU0c5dVoydHZibWNnVUc5emRERWdNQjRHQTFVRUF4TVgKU0c5dVoydHZibWNnVUc5emRDQlNiMjkwSUVOQklETXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDegppTmZxemc4Z1RyN20xZ050N2xuOHdsZmZLV2loZ3c0K2FNZG9XSndjWUV1SlF3eTUxQld5N3NGT2RlbTFwKy9sNlRXWjVNd2M1MHRmCmpUTXdJRE5UMmFhNzFUNFRqdWtmaDBtdFVDMVF5aGkrQVZpaUUzQ1d1NG1JVm9CYytMMHNQT0ZNVjRpNzA3bVY3OHZIOXRveGRDaW0KNWxTSjlVRXh5dVVtR3MyQzRIRGFPeW03MVFQMW1icFY5V1RSWUE2emlVbTRpaThGMG9SRktIeVBhRkFTZVB3THRWUEx3cGdjaEtPZQpzTDRqcE5yY3lDc2UybTVGSG9tWTJ2a0FMZ2JwRER0dzFWQWxpSm5MelhOZzk5WC9OV2ZGb2J4ZXE4MUt1RVhyeUdnZURRMFVSaExqCjBtUmlpa0tZdkxUR0NBajQvYWhNWkp4MkFiMHZxV3d6RDlnL0tMZzhhUUZDaG41cHdja0d5dVY2Um1YcHd0WlFRUzQvdCtUdGJOZS8KSmdFUm9oWXBTbXMwQnBEc0U5SzIrMnAyMGp6dDhOWXQzZUVWN0tPYkx5ekpQaXZrYVR2L2NpV3hOb1pieDM5cmkxVWJTc1VnWVQydQp5MURoQ0RxK3NJOWpRVk13Q0ZrOG1CMTN1bU9SZXNvUVVHQy84TmU4bFllUGw4WCtsMm9CbEtOOFc0VWRLams2MEZTaDBUbHhuZjBoCitiVjc4T0xnQW85dWxpUWxMS0FlTEtqRWlhZnY3WmtHTDdZS1RFL2Jvc3czR3E5SGhTMktYOFEwTkV3QS9SaVRaeFBSTitaSXRJc0cKeFZkN0dZWUtlY3NBeVZLdlF2ODNqK0dqSG5vOVVLdGpCdWNWdFQrMlJUZVVON0YrOGtqRGY4VjEvcGVOUlk4YXB4cHlLQnBBRHdJRApBUUFCbzJNd1lUQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZkJnTlZIU01FR0RBV2dCUVhuYzBlCmk5WTVLM0RUWE5TZ3VCK3dBUHpGWVRBZEJnTlZIUTRFRmdRVUY1M05Ib3ZXT1N0dzAxelVvTGdmc0FEOHhXRXdEUVlKS29aSWh2Y04KQVFFTEJRQURnZ0lCQUZiVmUyN21JZ0hTUXBzWTFRN1haaU5jNC82Z3g1TFM2WlN0UzZMRzdCSjhkTlZJMGxrVW1jRHJ1ZEhyOUVndwpXNjJuVjNPWnFkUGx0OUV1V1NSWTNHZ3VMbUxZYXVSd0N5MGdVQ0NrTXBYUkFKaTcwLzMzTXZKSnJzWjY0RWUrYnM3TG8zSTZMV2xkCnk4am9SVG5VK2tMQkVVeDNYWkw3YXY5WVJPWHJnWjZ2b0ptdHZxa0Jac3M0SFR6ZlF4LzBUVzYwdWhkRy9IMzloNEY1YWcwekQvb3YKK0JTNWdMTmRUYXFYNGZua0dNWDQxVGlNSmp6OThpamk3bHBKaUN6ZmVUMk9ucEE4dlVGS090MWI5cHEwemo4bE1IOHlmYUlEbE5EYwplcUZTM202VGpSZ20vVldzdlkrYjBzK3Y1NFlzeXg4SmI2TnZxWVRVYzc5Tm9YUWJUaU5nOHN3T3FuK2tuRXdscUxKbU96ai8yWlF3CjluS0V2bWhWRUEvR2N5d1dhWk1IL3JGRjdidWlWV3F3MnJWS0FpVW5oZGUzdDRaRUZvbHNnQ3MrbDZtYzFYNVZUTWJlUlJBYzZ1azcKbndOVDd1NTZBUUlXZU5Ub3dyNUdkb2dUUHlLN1NCSWRVZ0MwQW40aEdoNmNKZlR6UFY0ZTBoejVzeTIyOXpkY3hzc2hUckQzbVVjWQpoY0VydWxXdUJ1clFCN0xjcTlDQ2xuWE8wbEQrbWVmUEw1L25kdEZoS3ZzaHV6SFFxcDlIcExJaXloWTZVRmZFVzBObnhXVmlBMGtCCjYwUFoyUGllcmMreFl3NUY5S0JhTEpzdHhhYkFyYWhIOUNkTU9BMHVHMGs3VXZUb2lJTXJWQ2pVOGpWU3RES0RZbWxrREpHY241ZnEKZEJiOUh4RUdtcHYwCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc29mdCBFQ0MgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxNwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNXVENDQWQrZ0F3SUJBZ0lRWnZJOXI0ZmVpN0ZLNmd4WE1RSEM3REFLQmdncWhrak9QUVFEQXpCbE1Rc3dDUVlEVlFRR0V3SlYKVXpFZU1Cd0dBMVVFQ2hNVlRXbGpjbTl6YjJaMElFTnZjbkJ2Y21GMGFXOXVNVFl3TkFZRFZRUURFeTFOYVdOeWIzTnZablFnUlVORApJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJREl3TVRjd0hoY05NVGt4TWpFNE1qTXdOalExV2hjTk5ESXdOekU0Ck1qTXhOakEwV2pCbE1Rc3dDUVlEVlFRR0V3SlZVekVlTUJ3R0ExVUVDaE1WVFdsamNtOXpiMlowSUVOdmNuQnZjbUYwYVc5dU1UWXcKTkFZRFZRUURFeTFOYVdOeWIzTnZablFnUlVORElGSnZiM1FnUTJWeWRHbG1hV05oZEdVZ1FYVjBhRzl5YVhSNUlESXdNVGN3ZGpBUQpCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVRVdkQwQ1FuVkJFeVBOZ0FTR0FsRXZhcWlCWWd0bHpQYktuUjV2U21aUm9nUFpuWkg2CnRoYXhqRzdlZk0zYmVhWXZ6cnZPY1MvbHBhc283R01FWnBuNCt2S1RFQVhoZ1NoQzQ4Wm85T1liaEdCS2lhL3RlUTg3enZIMlJQVUIKZU1DalZEQlNNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCVEl5NWx5Y0ZJTQorT2Erc2dSWEtTclBRaER0TlRBUUJna3JCZ0VFQVlJM0ZRRUVBd0lCQURBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpCWThrM3FEUGxmClh1NWdLY3M2OHR2V01vUVpQM3pWTDhLeHpKT3VVTHNKTXNiRzdYN0pOcFFTNUdpRkJxSWIwQzhDTVFDWjZSYTBEdnBXU05Ta01CYVIKZU50VWpHVUJpdWRRWnNJeHR6bTZ1Qm9pQjA3OGExUVdJUDhydGVkTURFMm1UM009Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCk1pY3Jvc29mdCBSU0EgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxNwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZxRENDQTVDZ0F3SUJBZ0lRSHRPWENWL1l0TE5IY0I2cXZuOUZzekFOQmdrcWhraUc5dzBCQVF3RkFEQmxNUXN3Q1FZRFZRUUcKRXdKVlV6RWVNQndHQTFVRUNoTVZUV2xqY205emIyWjBJRU52Y25CdmNtRjBhVzl1TVRZd05BWURWUVFERXkxTmFXTnliM052Wm5RZwpVbE5CSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR1VnUVhWMGFHOXlhWFI1SURJd01UY3dIaGNOTVRreE1qRTRNakkxTVRJeVdoY05OREl3Ck56RTRNak13TURJeldqQmxNUXN3Q1FZRFZRUUdFd0pWVXpFZU1Cd0dBMVVFQ2hNVlRXbGpjbTl6YjJaMElFTnZjbkJ2Y21GMGFXOXUKTVRZd05BWURWUVFERXkxTmFXTnliM052Wm5RZ1VsTkJJRkp2YjNRZ1EyVnlkR2xtYVdOaGRHVWdRWFYwYUc5eWFYUjVJREl3TVRjdwpnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFES1c3NlVNNHdwbFpFV0NwVzlSMkxCaWZPWk50OUdrTW1sCjdYaHFiMGVSYVBnbloxQXpIYUdtKytEbFE2T0VBbGNCWFp4SVFJSlRFTHkveHp0b2tMYUNMZVgwWmRETWJSbk1sZmw3ckVxVXJRN2UKUzBNZGh3ZVNFNUNBZzJRMU9RVDg1ZWxzczdZZlVKUTRaVkJjRjBhNXRvVzFITFVYNk5aRm5kaXlKckRLeEhCS3JtQ2szYlBaN1B3NwoxVmR5dkQvSXliTGVTMnY0STJ3RHdBVzlsY2ZOY3p0bWdHVGpHcXd1K1VjRjhnYTJtM1AxZUROYng2SDdKeXFodEpxUmpKSFRPb0krCmRrQzB6VkpoVVhBb1A4WEZXdkxKakVtN0ZGdE55UDluVFV3U2xxMzEvbmlvbDRmWC9WNGdnTnloU3lMNzFJbXR1czVIbDBkVmU0OUYKeUdjb2hKVWNhRER2NzBuZ05YdGs1NWl3bE5wTmhUcytWY1FvcjFmem5oUGJSaWVmSHFKZVJJT2twY3JWRTdOTFA4VGp3dWFHWWFSUwpNTGw2SUU5dkR6aFR5ek1NRXl1UDFwcTlLc2d0c1J4OVMxSEtSOUZJSjNKZGgrdlZSZVpJWloydlVwQzZXNklZWlZjU24yaTUxQlZyCmxNUnBJcGowTStEdCtWR09RVkRKTkU5MmtLejhPTUhZNFh1NTQrT1U0VVpweXc0S1VHc1R1cXdQTjFxM0VyV1FnUjVXcmxjaWh0bkoKMHRIWFVlT3JPOFpWL1I0TzAzUUswZHFxNm1tNGx5aVBTTVFIK0ZKRE92VEtWVFVzc0tacXdKejU4b0hoRW1yQVJkbG5zODcvSTZLSgpDbFRVRkxrcXFOZnMrYXZOSlZneWVZK1FXNWc1eEFnR3dheC9EajBBcFFJREFRQUJvMVF3VWpBT0JnTlZIUThCQWY4RUJBTUNBWVl3CkR3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUNjdFpmNGF5Y0k4YXd6bmp3Tm5wdjd0TnNpTXdFQVlKS3dZQkJBR0MKTnhVQkJBTUNBUUF3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUt5dlBsM0NFWmFKanFQbmt0YVhGYmdUb3FaQ0xnTE5GZ1ZaSjhvZwo2THE0NkJyc1RhaVhWcTVsUTdHUEFKdFN6VlhOVXpsdFlreUxEVnQ4TGtTL2d4Q1A4MU9DZ01OUE9zZHVFVC9tNHhhUmhQdHRoSDgwCmRLMkpwODY1MTllZmhHU1N2cFdoclFsVE05M3VDdXBLVVk1dlZhdTZ0WlJHcm94LzJLSlFKV1ZnZ0ViYk13U3ViTFdZZEZRbDNKUGsKK09OVkZUMjRiY01LcEJMQmFZVnUzMlR4VTVuaFNuVWduWlVQNU5iY0EvRlpHT2hIaWJKWFdwUzJxZGdYS3hkSjVYYkx3VmFaT2pleAovMmtza1pHVDRkOU1vemQyVGFHZitHMGVIZFA2N1B2MFJSMFRiYy8zV2VVaUozSXJodk5YdXpEdEpFM2NmVmE3bzdQNE5IbUp3ZUR5CkFtSDNwdndQdXh3WEM2NUIyWHk5SjZQOUxqclJrNVN4Y3gwa2k2OWJJSW10dDJkbWVmVTZ4cWFXTS81VGtzaEdzUkdSeHBsL2o4blcKWmpFZ1FSQ0hMUXpXd2E4MG1NcGtnL3NUVjlIQjhEeDZqS1hCL1pVaG9ISEJrMmR4RXVxUGlBcHBHV1NaSTFiN3JDb3VjTDVteEF5RQo3K1dMODVNQitHcVFrMmRMc21panRXS1A2VCtNZWp0ZUQrZU11TVo4N3pmOWRPTElUek55NFpRNWJiMFNyNzRNVG5COEcyK05zektUCmMwUVdiZWowOStDVmdJK1dYVGlrOUt2ZUNqQ0hrOWhOQUhGaVJTZExPa0tFVzM5bHQyYzBVaTJjRm11cXFOaDdvMEpNY2NjTXlqNkQKNUtidnR3RXdYbEdqZWZWd2FhWkJSQStHc0N5UnhqM3FyZytFCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCmUtU3ppZ25vIFJvb3QgQ0EgMjAxNwo9PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNRRENDQWVXZ0F3SUJBZ0lNQVZSSTd5SDlsMWtOOVFRS01Bb0dDQ3FHU000OUJBTUNNSEV4Q3pBSkJnTlZCQVlUQWtoVk1SRXcKRHdZRFZRUUhEQWhDZFdSaGNHVnpkREVXTUJRR0ExVUVDZ3dOVFdsamNtOXpaV01nVEhSa0xqRVhNQlVHQTFVRVlRd09Wa0ZVU0ZVdApNak0xT0RRME9UY3hIakFjQmdOVkJBTU1GV1V0VTNwcFoyNXZJRkp2YjNRZ1EwRWdNakF4TnpBZUZ3MHhOekE0TWpJeE1qQTNNRFphCkZ3MDBNakE0TWpJeE1qQTNNRFphTUhFeEN6QUpCZ05WQkFZVEFraFZNUkV3RHdZRFZRUUhEQWhDZFdSaGNHVnpkREVXTUJRR0ExVUUKQ2d3TlRXbGpjbTl6WldNZ1RIUmtMakVYTUJVR0ExVUVZUXdPVmtGVVNGVXRNak0xT0RRME9UY3hIakFjQmdOVkJBTU1GV1V0VTNwcApaMjV2SUZKdmIzUWdRMEVnTWpBeE56QlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJKYmNQWXJZc0h0dnhpZStSSkN4CnMxWVZlNDVESkgwYWhGbnVZMml5eGw2SDBCVklIcWlRcmIxVG90cmVPcENtWUY5b01yV0dRZCtIV3l4N3hmNThldHFqWXpCaE1BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFEQWdFR01CMEdBMVVkRGdRV0JCU0hFUlVJMGFyQmVBeXhyODdHeVpEdgp2ekFFd0RBZkJnTlZIU01FR0RBV2dCU0hFUlVJMGFyQmVBeXhyODdHeVpEdnZ6QUV3REFLQmdncWhrak9QUVFEQWdOSkFEQkdBaUVBCnRWZmQxNHBWQ3piaGhrVDYxTmxvamJqY0k0cUtEZFF2ZmVwejdMOU5iS2dDSVFETHBiUVMrdWUxNk05K2svenpOWTl2VGxwOHRMeE8Kc3Z4eXFsdForZWZjTVE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpjZXJ0U0lHTiBSb290IENBIEcyCj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZSekNDQXkrZ0F3SUJBZ0lKRVFBMHRrN0dOaTAyTUEwR0NTcUdTSWIzRFFFQkN3VUFNRUV4Q3pBSkJnTlZCQVlUQWxKUE1SUXcKRWdZRFZRUUtFd3REUlZKVVUwbEhUaUJUUVRFY01Cb0dBMVVFQ3hNVFkyVnlkRk5KUjA0Z1VrOVBWQ0JEUVNCSE1qQWVGdzB4TnpBeQpNRFl3T1RJM016VmFGdzAwTWpBeU1EWXdPVEkzTXpWYU1FRXhDekFKQmdOVkJBWVRBbEpQTVJRd0VnWURWUVFLRXd0RFJWSlVVMGxIClRpQlRRVEVjTUJvR0ExVUVDeE1UWTJWeWRGTkpSMDRnVWs5UFZDQkRRU0JITWpDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVAKQURDQ0Fnb0NnZ0lCQU1ERmRSbVJmVVIwZElmK0RqdVczTmdCRnN6dVk1SG5DMi9PT3dwcEduekM0NitDam9iWFhvOVg2OU1oV2YwNQpOMEl3dmxEcXRnK3BpTmd1TFdraDU5RTNHRTU5a2RVV1gydGJBTUk1UXcwMmhWSzVVMlVQSFVMbGo4OEYwKzdjREJyWnVJdDRJbWZrCmFiQm94VHprYkZwRzU4M0grdS9FN0V1OWFxU3MvY3dvVWUrU3RDbXJxeldhVE9URUNNWW16UGhwbitTYzhDblRYUG5HRmlXZUk4TWcKd1QwUFB6aEFzUDZDUkRpcVdocUthMk5ZT0xRVjA3WVJhWHNlVk82TUdpS3NjcGMvSTFtYnlTS0V3UWRQekgvaVY4b1NjTHVtWmZOcApkV085bGZzYmw4M2txSy8yMFU2bzJZcHhKTTAyUGJ5V3hQRnNxYTdsencxdUtBMndEclhLVVh0NEZNTWdMMy83RkZYaEVabjkxUXFoCm5nTGpZbC9yTlVzc3VITG9QajFQckN5N0xvYmlvM2FQNVpNcXo2V3J5RnlOU3diL0VrYXNlTXNVQnpYZ3FkK0w2YThWVHhhSlc3MzIKamNaWnJvaUZEc0dKNng5bnhVV08vMjAzTml0NFpvT1JVU3M5LzFGM2RtS2g3R2MrUG9HRDRGYXBVQjhmZXBtclk3K0VGM2Z4RFR2Zgo5NXhoc3pXWWlqcXk3RHdhTno5K2o1TFAyUklVWk5vUUFoVkIvMC9FNnh5anlmcVo5MGJwNFJqWnNiZ3lMY3NVREZEWWcyV0Q3cmxjCno4c0ZXa3o2R1pkcjFsMFQwOEpjVkx3eWM2QjQ5ZkZ0SHN1ZnBhYWZJdHpSVVo2Q2VXUmdLUk0rby8xUGNtcXI0dFRsdUNSVkxFUkwKaW9oRW5NcUUweW83QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQjBHQTFVZApEZ1FXQkJTQ0lTMW14dGVnNEJYcnprd0pkOFJnbmxSdUF6QU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFZTjRhdU9meVlJTFZBek9CCnl3YUs4U0pKNmVqcWtYL0dNMTVvR1FPR08wTUJ6d2R3NUFnZVpZV1I1aEVpdC9VQ0k0NnV1UjU5SDM1czVyMGwxWlVhOGdXbXI0VUMKYjY3NDFqSC9KY2xLeU1lS3FkbWZTMG1iRVZlWmtrTVIzcll6cE16WGpXUjkxTTA4S0N5MG1wYnFUZlhFUk1RbHFpQ0EyQ2xWOStCQgovQVltLzdrMjlVTVVBMlo0NFJHeDJpQmZSZ0I0QUNHbEhnQW9ZWGh2cUFFQmo1MDBtdi8wT0pEN3VOR3pjZ2JKY2VhQnhYbnRDNlo1CjhoTUxuUGRkRG5za2s3UkkyNFpmM2xDR2VPZEE1akdva0had1lhK2NOeXdSdFlLM3FxNGtORnR5REdrTnpWbWY5bkd2bkF2UkNqajUKQmlLRFV5VU0vRkhFNXI3aU9aVUxKSzJ2MFpYa2x0ZDBaR3R4VGdJOHFvWHpJS05ET1haYmJGRCttcHdVSG1VVWloVzlvNEpGV2tsVwphdEtjc1dNeTVXSGdVeUlPcHdwSjZzdCtINmppWW9EMkVFVlNtQVlZM3FYTkwzK3ExT2srQ0hMc0l3TUNQS2FxMkx4bmREMFVGL3RVClN4ZmowM2s5Yld0SnlTZ09MblJRdnd6WlJqb1Foc21uUCttZzdIL3JwWGRZYVhIbWd3bzM4b1pKYXI1NUNKRDJBaFprUHVYYVRINE0KTk1uNVg3YXpLRkducHl1cVNmcU5aU2xPNDJzVHA1U2pMVkZ0ZUF4RXk5L2VDRy9PbzJTcjA1V0UxTGxTVkhKN2xpWE12R25qU0c0TgowTWVkSjVxcStCT1MzUjdmWTU4MXFSWTI3SXk0Zy9ROWlZL050QmRlMTdNWFFSQmRKM05naFZkSklnYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3R3YXZlIEdsb2JhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGMmpDQ0E4S2dBd0lCQWdJTUJmY09odHBKODBZMUxycXlNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0lNUXN3Q1FZRFZRUUdFd0pWClV6RVJNQThHQTFVRUNBd0lTV3hzYVc1dmFYTXhFREFPQmdOVkJBY01CME5vYVdOaFoyOHhJVEFmQmdOVkJBb01HRlJ5ZFhOMGQyRjIKWlNCSWIyeGthVzVuY3l3Z1NXNWpMakV4TUM4R0ExVUVBd3dvVkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JEWlhKMGFXWnBZMkYwYVc5dQpJRUYxZEdodmNtbDBlVEFlRncweE56QTRNak14T1RNME1USmFGdzAwTWpBNE1qTXhPVE0wTVRKYU1JR0lNUXN3Q1FZRFZRUUdFd0pWClV6RVJNQThHQTFVRUNBd0lTV3hzYVc1dmFYTXhFREFPQmdOVkJBY01CME5vYVdOaFoyOHhJVEFmQmdOVkJBb01HRlJ5ZFhOMGQyRjIKWlNCSWIyeGthVzVuY3l3Z1NXNWpMakV4TUM4R0ExVUVBd3dvVkhKMWMzUjNZWFpsSUVkc2IySmhiQ0JEWlhKMGFXWnBZMkYwYVc5dQpJRUYxZEdodmNtbDBlVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMbGRVU2hMUERlUzBZTE92UjI5CnpkMjRxODhLUHVGZDVkeXFDYmxYQWo3bVkySGY4ZytDWTY2ajk2eHowWHpuc3d1dkNBQUpXWC9OS1NxSWs0Y1hHSUR0aUxLMHRoQWYKTGRaZlZhSVRYZEhHNndaV2lZaityREtkL1Z6REJjZHU3b2FKdW9nRG5YSWhocEN1andPbDNKK0lLTXVqa2trUDdOQVA0bTFFVDRCcQpzdFRub0FwVEFicU9sNUYyYnJ6ODFXczI1a0NJMW5zdlh3WG9MRzBSOCtleXZwSkVUTktYcFA3U2NvRkRCNXpwRVQ3MWl4cFpmUjlvCldOMEVBQ3lXODBPemZwZ1pkTm1jYzlrWXZrSEhOSG5aOUdMQ1E3bXpKN0FpeS9rOVVzY3dSN1BKUHJocTR1Zm9nWEJlUW90UEpxWCsKT3NJZ2JydjRGbzdOREttMEcyeDJFT0ZZZVVZK1ZNNkFxRmNKTnlrYm1ST1BETWpXTEJ6N0JlZ0lsVDFsUnR6dXpXbmlUWStIS0U0MApDejdQRk5tNzNiWlFtcTEzMUJuVzJocUl5RTRiSjNYWXNnanhyb013dVJFT3pZZndoSTBWY255aDc4enlpR0c2OUdtN0RJd0xkVmNFCnVFNHFGQzQ5RHh3ZU1xWmlOdTVtNGlLNEJVQmpFQ0x6TXgxMGNvb3M5VGtwb05Qbkc0Q0VMY1U5NDAyeC9ScHZ1bVVITzFqc1FrVW0KKzlqYUpYTEU5Z0N4SW5tOTQzeFpZa3FjQlc4OXp1YldSMk9aeGlSdmNoTElySCtRdEF1UmNPaTM1aFlRY1JmTzNnWlBTRUY5TlVxagppZkxKUzN0QkVXMW50d2lZVE9VUkdhNUNnTno3a0FYVStGREt2dVN0eDhLVTF4YWQ1aGVQcnpiN0FnTUJBQUdqUWpCQU1BOEdBMVVkCkV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGSm5nR1djTll0dDJzOW85dUZ2by9VTFNNUTZITUE0R0ExVWREd0VCL3dRRUF3SUIKQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQW1ITnc0ckRUN1Ruc1RHRFpxUktHRng2VzBPaFVLRHRrTFNHbStKMVdFMnBJUFUvSApQaW5iYlZpRFZEMkhmU01GMU9RYzNPZzRaWWJGZGFkYTJ6VUZ2WGZldXlrM1FBVUh3NVJTbjhwazNmRWJLOXhHQ2hBQ01mMUthQTBIClpKRG1IdlVxb2FpN1BGMzVvd2dMRVF6eFB5MFFsRy8rNGpTSGc5YlA1UnMxYmRJRDRiQU5xS0NxUmllQ05xY1Z0Z2ltUWxSWHRwbGEKNGd0NWtOZFhFbEUxR1loQmFDWFVOeGVFRmZzQmN0eVYzbEltSUpnbTRuYjFKMi82QUR0S1lka055MUdUS3YwV0JwYW5JNW9qU1A1Ugp2YmJFc0xGVXp0NXNRYTBXWjM3Yi9Uak51VGhPc3NGZ3k1MFgzMWllZW1LeUpvOTBsWnZrV3gzU0Q5MllISnRadVNQVE1hQ20vempkCnp5QlA2VmhXT21mRDBmYVptWjI2TnJhQUw0aEhUNGEvUkRxQTVEY2NwcnJxbDVnUjBJUmlSMlFlcXU1QXZ6U3huSTlPNGZLU1R4K08KODU2WDN2T21lV3FKY1U5TEp4ZEkvdXowVUE5UFNYM01SZU85ZWtERlFkeGhWaWNHYWVWeVFZSFR0Z0dKb0M4NmNubitPakMvUWV6SApZajZSUzhmWk1YWkMrZmM4WSt3bWpITU1mUm9kNnFoOGg2akNKM3poTTBFUHo4LzhBS0FpZ0o1S3AyOEFzRUZGdHlMS2FFakZRcUt1CjNSM3k0RzVPQlZpeHdKQVdLcVE5RUVDK2oySmpnNm1jZ24wdEF1bURNSHpMSjhuOUhtWUFzQzdUSVMrT014WnNtTzBRcUFmV3pKUFAKMjlGcEhPVEt5ZUMybk9uT2NYSGViRDhXcEhrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUcnVzdHdhdmUgR2xvYmFsIEVDQyBQMjU2IENlcnRpZmljYXRpb24gQXV0aG9yaXR5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNZRENDQWdlZ0F3SUJBZ0lNRFdwZkNEOG9YRDVSbGQ5ZE1Bb0dDQ3FHU000OUJBTUNNSUdSTVFzd0NRWURWUVFHRXdKVlV6RVIKTUE4R0ExVUVDQk1JU1d4c2FXNXZhWE14RURBT0JnTlZCQWNUQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9UR0ZSeWRYTjBkMkYyWlNCSQpiMnhrYVc1bmN5d2dTVzVqTGpFNk1EZ0dBMVVFQXhNeFZISjFjM1IzWVhabElFZHNiMkpoYkNCRlEwTWdVREkxTmlCRFpYSjBhV1pwClkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHhOekE0TWpNeE9UTTFNVEJhRncwME1qQTRNak14T1RNMU1UQmFNSUdSTVFzd0NRWUQKVlFRR0V3SlZVekVSTUE4R0ExVUVDQk1JU1d4c2FXNXZhWE14RURBT0JnTlZCQWNUQjBOb2FXTmhaMjh4SVRBZkJnTlZCQW9UR0ZSeQpkWE4wZDJGMlpTQkliMnhrYVc1bmN5d2dTVzVqTGpFNk1EZ0dBMVVFQXhNeFZISjFjM1IzWVhabElFZHNiMkpoYkNCRlEwTWdVREkxCk5pQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRCWk1CTUdCeXFHU000OUFnRUdDQ3FHU000OUF3RUhBMElBQkg3N2JPWWoKNDNNeUNNcGc1bE9jdW5TTkdMQjRrRktBM1RqQVNoM1JxTXlUcEpjR09Nb05GV0xHamdFcVpaMnEzelNSTG9IQjVET1NNY1Q5Q1RxbQpQNjJqUXpCQk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0R3WURWUjBQQVFIL0JBVURBd2NHQURBZEJnTlZIUTRFRmdRVW8wRUdySkJ0CjBVcnJkYVZLRUptenNhR0xTdmN3Q2dZSUtvWkl6ajBFQXdJRFJ3QXdSQUlnQitaVTJnNmdXckt1RVorSHhiYi9hZDRsdnZpZ3R3anoKUk00cTN3Z2hERGNDSUMwbUE2QUZ2V3ZSOWx6NFpjeUdiYk9jTkVoamhBbkZqWGNhNHN5YzRYUjcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDblRDQ0FpU2dBd0lCQWdJTUNMMkZsMnlaSjZTQWFFYzdNQW9HQ0NxR1NNNDlCQU1ETUlHUk1Rc3dDUVlEVlFRR0V3SlZVekVSCk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnlkWE4wZDJGMlpTQkkKYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURNNE5DQkRaWEowYVdacApZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQWVGdzB4TnpBNE1qTXhPVE0yTkROYUZ3MDBNakE0TWpNeE9UTTJORE5hTUlHUk1Rc3dDUVlEClZRUUdFd0pWVXpFUk1BOEdBMVVFQ0JNSVNXeHNhVzV2YVhNeEVEQU9CZ05WQkFjVEIwTm9hV05oWjI4eElUQWZCZ05WQkFvVEdGUnkKZFhOMGQyRjJaU0JJYjJ4a2FXNW5jeXdnU1c1akxqRTZNRGdHQTFVRUF4TXhWSEoxYzNSM1lYWmxJRWRzYjJKaGJDQkZRME1nVURNNApOQ0JEWlhKMGFXWnBZMkYwYVc5dUlFRjFkR2h2Y21sMGVUQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkd2YURYVTFDREZICkJhNUZtVlh4RVJNdVN2Z1FNU09qZm9QVGZ5Z0lPaVlhT3MrWGdoK0F0eWNKajlHT01NUUttdzZzV0FTcjl6WjlsQ09rbXdxS2k2dnIKL1RrbFp2RmUvb3l1alVGNW5RbGd6aWlwMDRwdDg5WkYxUEtZaERobG9LTkRNRUV3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFQQmdOVgpIUThCQWY4RUJRTURCd1lBTUIwR0ExVWREZ1FXQkJSVnFZU0owc0V5dlJqTGJLWUhUc2pubmI2Q2tEQUtCZ2dxaGtqT1BRUURBd05uCkFEQmtBakEzQVpLWFJSSitvUE0rclJrNmN0MzBVSk1ERXI1RTBrOUJwSXljblIrajlzS1M1MGdVL2s2YnBaRlhyc1kzY3JzQ01HY2wKQ3JFTVh1NnBZNUp2NVpBTC9tWWl5a2Y5aWpIM2cvNTZ2eEMrR0NzZWovWXBIcFJaNzQ0aE44dFJtS1Z1U3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpOQVZFUiBHbG9iYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRm9qQ0NBNHFnQXdJQkFnSVVBWlF3SHFJTDNmWEZNeXF4UTBSeCtOWlFUUTB3RFFZSktvWklodmNOQVFFTUJRQXdhVEVMTUFrRwpBMVVFQmhNQ1MxSXhKakFrQmdOVkJBb01IVTVCVmtWU0lFSlZVMGxPUlZOVElGQk1RVlJHVDFKTklFTnZjbkF1TVRJd01BWURWUVFECkRDbE9RVlpGVWlCSGJHOWlZV3dnVW05dmRDQkRaWEowYVdacFkyRjBhVzl1SUVGMWRHaHZjbWwwZVRBZUZ3MHhOekE0TVRnd09EVTQKTkRKYUZ3MHpOekE0TVRneU16VTVOVGxhTUdreEN6QUpCZ05WQkFZVEFrdFNNU1l3SkFZRFZRUUtEQjFPUVZaRlVpQkNWVk5KVGtWVApVeUJRVEVGVVJrOVNUU0JEYjNKd0xqRXlNREFHQTFVRUF3d3BUa0ZXUlZJZ1IyeHZZbUZzSUZKdmIzUWdRMlZ5ZEdsbWFXTmhkR2x2CmJpQkJkWFJvYjNKcGRIa3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDMjFQR1RYTFZBaVFxckRaQmIKVUdPdWtKUjBGMFZ5MW50bFdpbExwMWFnUzdndlFuWHAyWHNrV2pGbHF4Y1gwVE02MlJIY1FEYUgzOGRxNlNaZVdZcDM0K2hJbkRFVworajZSc2NySm8rS2Z6aUZUb3dJMk1NdFNBdVhhTWwzRHhlYjU3aEhIaThsRUhvU1RHRXEwbitVU1pHblFKb1ZpQWJiSkFoMitnMUc3ClhOcjRyUlZxbWZlU1ZQYzBXK20vNmltQkV0UlRrWmF6a1ZyZC9wQnpLUHN3UnJYS0NBZkhjWExKWnRNMGwvYU05QmhLNGRBOVdrVzIKYWFjcCt5UE9pTmdTbkFCSXFLWVBzenVTalhFT2RNV0x5RXo1OUp1T3VEeHA3Vzg3VUM5WTdjU3cwQndiYWd6aXZFU3EyTTBVWFpSNApZYjhPYnRvcXZDOE1DM0dtc3hZL25PYjV6SjlUTmVJRG9LQVl2N3Z4dnZUV2pJY05RdmNHdWZGdDdRU1VxUDYyMHdiR1FHSGZuWjN6ClZIYk9Vem9CcHBKQjdBU2pqdzJpMVFuSzFzdWE4ZTlEWGNDcnBVSFBYRk53Y01tSXBpM1VhMkZ6VUNhR1lRNWZHOElyNG96VnU1M0IKQTBLNmxOcGZxYkRLekUwSzcwZHBBeThpKy9Fb3pyOWRVR1dva0cyemRMQUl4NnlvMGVzK25QeGRHb011Szh1MTgwU2RPcWNYWVphaQpjZE53bGhWTnQweHo3aGxjeFZzK1FmNnNkV0E3RzJQT0FOM2FDSkJpdE9VdDdraW5heGVaVkw2SFN1T3BYZ1JNNnhCdFZOYnY4ZWp5ClloYkxnR3Z0UGUzMUh6Q2xya3ZKRSsyS0FRSEp1RkZZd0dZNnNXWkx4TlV4QW1McGRJUU0yMDFHTFFJREFRQUJvMEl3UURBZEJnTlYKSFE0RUZnUVUwcCtJMzZITkxMM3M5VHNCQVpNeko3THJZRXN3RGdZRFZSMFBBUUgvQkFRREFnRUdNQThHQTFVZEV3RUIvd1FGTUFNQgpBZjh3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQURMS2dMT2RQVlFHM2RMU0x2Q2tBU0VMWjBqS2JZN2d5S29OcW8waFY0L0dQbnJLCjIxSFVVclBVbG9TbFdHQi81UXVPSC9YY0NoV0I1VHUydHlJdkNad1RGckZzRERVSWJhdGpjdTNjdnV6SFYrWXdJSEhXMXhEQkUxVUIKakNwRDVFSHh6enA2VTVMT29nTUZEVGpmQXJzUUx0azcwcHQ2d0tHbStMVXg1dlIxeWJsVG1YVkhJbG9VRmNkNEc3YWQ2UXo0RzNieApoWVRlb2RvUzc2VGlFSmQ2ZU40TVVaZW9JVUNMaHIwTjhGNU9TemE3T3lBZmlrSlc0UXNhdjN2UUlrTXNSSXo3NVNxMGJCd2N1cFRnCkUzNGg1cHJDeThWQ1pMUWVsSHNJSmNoeHpJZEZWNFhUbnlsaUlvTlJsd0FZbDNkcW1KTEpmR0JzMzJ4OVN1UndUTUtldUIzMzBEVEgKRDh6N3AvOER2cTF3a05vTDNjaHRsMSthZndreVFmM05vc3hhYlV6eXFrbitadmpwMkRYckRpZ2U3a2d2T3RCNUNUaDhwaUtDazVYUQpBNzYrQXFBRjNTQWk0MjhkaURSZ3h1WUt1UWwxQy9BSDZHbVdOY2Y3STRHT09EbTRSU3REZUtMUkxCVC9EU2h5Y3BXYlhnbmJpVVNZCnFxRkp1M0ZTOHIvMi95ZWhOcSs0dG5lSTNUcWtiWnMwa053VVhUQy90K3NYNUllM2NkQ2gxM2NWMUVMWDh2TXhtVjJiM1JadFArb0cKSS9oR29pTHRrL2JkbXVZcWg3R1lWUEVpOTJ0RjQrS09kaDJhamNRR2pUYTNGUE9kVkdtM2pqelZwRzJUZ2JldDlyMWtlOExKYURtZwprcHpOTklhUmtQcGtVWjMrL3V1bDlYWGVpZmR5Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkFDIFJBSVogRk5NVC1SQ00gU0VSVklET1JFUyBTRUdVUk9TCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDYmpDQ0FmT2dBd0lCQWdJUVl2WXliT1hFNDJoY0cyTGRuQzZkbFRBS0JnZ3Foa2pPUFFRREF6QjRNUXN3Q1FZRFZRUUdFd0pGClV6RVJNQThHQTFVRUNnd0lSazVOVkMxU1EwMHhEakFNQmdOVkJBc01CVU5sY21Wek1SZ3dGZ1lEVlFSaERBOVdRVlJGVXkxUk1qZ3kKTmpBd05Fb3hMREFxQmdOVkJBTU1JMEZESUZKQlNWb2dSazVOVkMxU1EwMGdVMFZTVmtsRVQxSkZVeUJUUlVkVlVrOVRNQjRYRFRFNApNVEl5TURBNU16Y3pNMW9YRFRRek1USXlNREE1TXpjek0xb3dlREVMTUFrR0ExVUVCaE1DUlZNeEVUQVBCZ05WQkFvTUNFWk9UVlF0ClVrTk5NUTR3REFZRFZRUUxEQVZEWlhKbGN6RVlNQllHQTFVRVlRd1BWa0ZVUlZNdFVUSTRNall3TURSS01Td3dLZ1lEVlFRRERDTkIKUXlCU1FVbGFJRVpPVFZRdFVrTk5JRk5GVWxaSlJFOVNSVk1nVTBWSFZWSlBVekIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQQpCUGE2VjFQSXlxdmZOa3BTSWVTWDBvTm5udkJsVWRCZWg4ZEhzVm55VjBlYkFBS1RSQmRwMjBMSHNiSTZHQTYwWFl5elpsMmhOUGsyCkxFbmI4MGI4czBScFJCTm0vZGZGL2E4MlRjNERUUWR4ejY5cUJkS2lRMW9LVW04QkEwNk9pNk5DTUVBd0R3WURWUjBUQVFIL0JBVXcKQXdFQi96QU9CZ05WSFE4QkFmOEVCQU1DQVFZd0hRWURWUjBPQkJZRUZBRzVMKysvRVlaZzhrL1FRVzZyY3gvbjBtNUpNQW9HQ0NxRwpTTTQ5QkFNREEya0FNR1lDTVFDdVN1TXJRTU4wRWZLVnJSWWozazRNR3VaZHBTUmVhMFI3L0RqaVQ4dWNSUmNSVEJRbkpsVTVkVW9ECnpCT1FuNUlDTVFENlNteGdpSFB6N3JpWVlxbk9LOExaaXFad01SMnZzSlJNNjAvRzQ5SHpZcWM4LzVNdUIxeEpBV2RwRWdKeXYrYz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKR2xvYmFsU2lnbiBSb290IFI0Ngo9PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGV2pDQ0EwS2dBd0lCQWdJU0VkSzd1ZGNqR0o1QVh3cWRMZERmSldmUk1BMEdDU3FHU0liM0RRRUJEQVVBTUVZeEN6QUpCZ05WCkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWlZV3hUYVdkdUlHNTJMWE5oTVJ3d0dnWURWUVFERXhOSGJHOWlZV3hUYVdkdUlGSnYKYjNRZ1VqUTJNQjRYRFRFNU1ETXlNREF3TURBd01Gb1hEVFEyTURNeU1EQXdNREF3TUZvd1JqRUxNQWtHQTFVRUJoTUNRa1V4R1RBWApCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEhEQWFCZ05WQkFNVEUwZHNiMkpoYkZOcFoyNGdVbTl2ZENCU05EWXdnZ0lpCk1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3NySFF5NkxObDVicnRReVlkcG9rTlJib3BpTEtrSFdQZDA4RXMKQ1ZlSk9hRlY2V2MwZHd4dTVGVWRVaVhTRTJ0ZTRSMnB0MzJKTWw4Tm5wOHNlbU5nUUIrbXNMWjRqNWxVbGdoWXJ1UUd2R0lGQWhhLwpyNmdqQTdhVUQ3eHViTUxMMWFhN0RPbjJ3UUw3SWQ1bTNSZXJkRUx2OEhRdkpmVHFhMVZia051ZDMxNkhDa0Q3clJscisvZktZSWplCjJzR1AxcTdWZjlROGcrN1hGa3lEUlROcko5Q0cwQnd0YS9PcmZmR0ZxZlVvMHEzdjg0UkxISWY4RTZNNmNxSmFFU3ZXSjNFbjdZRXQKYldhQmtvZTBHMWg2ekQ4SytrWlBUWGhjK0N0STR3U0V5MTMydEdxelpmeENubEVtSXlETFBSVDVnZTFsRmdCUEdtU1haZ2pQakh2agpLOENkK1JUeUcvRldhaGEvTElXRnpYZzRtdXRDYWdJMEdJTVhUcFJXK0xhQ3RmT1czVDN6dm44Z2R6NTdHU05yTE5SeWMwTlhmZUQ0CjEybFBGellFK2NDUVlEZEYzdVlNMkhTTnJweWliWFJkUXI0RzlkbGtiZ0lRckltd1REc0hUVUIrSk1XS21JSjVqcVNuZ2lDTkkvb24KY2NuZnhrRjBvRTMya1JiY1JveGZLV014V1hFTTJHL0N0ako5KytaZFU2WitGZnk3ZFh4ZDdQajJGeHpzeDJzWnkvTjc4Q3NIcGRscwplVlIyYkowY3BtNE82WGtNcUNOcW85OGJNREdmc1ZSNy9tckxacXJjWmRDaW5rcWFCeUZyZ1kvYnhGbjYzaUxBQkp6anFsczJrK2c5CnZYcWhuUXQyc1F2SG5mM1BtS2dHd3ZncW82R0RvTGNsY3FVQzR3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVVBMXlyYzRHSHFNeXdwdFdVNGphV1NmOEZtU3d3RFFZSktvWklodmNOQVFFTQpCUUFEZ2dJQkFIeDQ3UFlDTEx0YmZwSXJYVG5jdnRnZG9rSXpUZm52cENvN1JHa2VyTmxGbzA0OHA5Z2tVYkpVSEpOT3hPOTdrNFZnCkp1b0pTT0QxdThmcGFOSzdhakZ4ekhtdUVhandtZjNsSDd3dnFNeFg2M2JFSWFaSFUxVk5hTDhGcE83WEpxdGkya00zUytMR3RlV3kKZ3hrNng5UGJUWjRJZXZQdXp6NWkrNnpvWU16Ung2RmNnMFhFUmN6ekYyc1V5UVFDUHRJa3BubnBIczZpNThGWkZaOGQ0a3VhUHA5MgpDQzFyMkxwWEZOcUQ2djZNVmVuUVRxbk1kekd4UkJGNlhMRSsweFJGRlJoaUpCUFN5MDNPWElQQk52SVF0UTZJYmJqaFZwK0ozcFptCk9VZGtMRzVOcm1KN3YyQjBHYmhXckpLc0ZqTHRyV2hWL3BpNjB6VGU5TWxod3c2RzlrdUVZTzROZTdVeVdIbVJWU3lCUTdOMEgzcXEKSlo0ZDE2R0x1YzFDTGdTa1pvTk5pVFcyYktnMlNua2hlQ0xRUXJ6UlFER1FvYjRFejhwbjdmWHdnTk5neVlNcUlnWFFCenRTdnd5ZQpxaXY1dStZZmp5VzZoWTBYSGdMK1hWQUVWOC8rTGJ6dlhNQWFxN2FmSk1iZmMyaElrQ3dVOUQ5U0d1VFN5eFREWVduUDR2a1l4Ym96Cm54U2pCRjI1Y2ZlMWxOajJNOEZhd1RTTGZKdmRrenJuRTZKd1laK3ZqK3ZZeFhYNE0yYlVkR2M2TjNlYzU5MmtEM1pEWm9wRDhwLzcKREVKNFk5SGlEMjk3MUtFOWRKZUZ0MGc1UWRZZy9OQTZzL3JvYjhTS3VuRTN2b3VYc1hneFQ3UG50Z01UemxTZHJpVlp6SDgxWHdqMwpRRVV4ZUNwNgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHbG9iYWxTaWduIFJvb3QgRTQ2Cj09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNDekNDQVpHZ0F3SUJBZ0lTRWRLN3VqTnUxTHptSkdqRkRZUWRtT2hETUFvR0NDcUdTTTQ5QkFNRE1FWXhDekFKQmdOVkJBWVQKQWtKRk1Sa3dGd1lEVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1Sd3dHZ1lEVlFRREV4TkhiRzlpWVd4VGFXZHVJRkp2YjNRZwpSVFEyTUI0WERURTVNRE15TURBd01EQXdNRm9YRFRRMk1ETXlNREF3TURBd01Gb3dSakVMTUFrR0ExVUVCaE1DUWtVeEdUQVhCZ05WCkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdGMyRXhIREFhQmdOVkJBTVRFMGRzYjJKaGJGTnBaMjRnVW05dmRDQkZORFl3ZGpBUUJnY3EKaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVNjRHJIUHQraWVVbmQxTlBxbFJxZXRNaGt5dEFlcEo4cVV1d3pTQ2hESDJvbXdsd3h3RXdrQgpqdGpxUitxK3NvQXJ6ZndvRGR1c3ZLU0dOKzF3Q0FCMTZwTUxleTVTbkNOb0l3WkQ3Skl2VTRUYiswY1VCK2hmbEdkZHlYcUJQQ0NqClFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUXhDcENQdHNhZDBrUkwKZ0xXaTVoK3hFazhibFRBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTMxU1E3WnZ2aTVRQ2t4ZUNtYjZ6bml6MkM1R01uMG9Vc2Zaawp2THRvVVJNTUEvY1ZpNFJndVl2L1VvN25qTHdjQWpBOCtSSFVqRTdBd1dIQ0ZVeXFxeDBMTVY4N0hPSUFsMFF4NXY1emxpL2FsdFArCkNBZXpOSW04QlovM0hvYnVpM0E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdMT0JBTFRSVVNUIDIwMjAKPT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmdqQ0NBMnFnQXdJQkFnSUxXa3U5V3Z0UGlsdjZaZVV3RFFZSktvWklodmNOQVFFTEJRQXdUVEVMTUFrR0ExVUVCaE1DUVZReApJekFoQmdOVkJBb1RHbVV0WTI5dGJXVnlZMlVnYlc5dWFYUnZjbWx1WnlCSGJXSklNUmt3RndZRFZRUURFeEJIVEU5Q1FVeFVVbFZUClZDQXlNREl3TUI0WERUSXdNREl4TURBd01EQXdNRm9YRFRRd01EWXhNREF3TURBd01Gb3dUVEVMTUFrR0ExVUVCaE1DUVZReEl6QWgKQmdOVkJBb1RHbVV0WTI5dGJXVnlZMlVnYlc5dWFYUnZjbWx1WnlCSGJXSklNUmt3RndZRFZRUURFeEJIVEU5Q1FVeFVVbFZUVkNBeQpNREl3TUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFyaTVXclJzYzcvYVZqNkIzR3l2VFk0K0VUVVdpCkQ1OWJSYXRaZTFFMCtleUxpbmpGM1d1dnZjVGZrMFVldjVFNEM2NE9GdWRCYy9qYnU5RzRVZURMZ3p0ek9HNTNpZzlaWXliTnB5ck8KVlB1NDRzQjhSODVnZkQreWMvTEFHYmFLa29jMURaQW9vdVFWQkdNK3VxL3VmRjdNcG90UXNqajNRV1BLenY5cGoyZ09sVGJsekxtTQpDY3BMM1RHUWxzak1ILzFXbGpUYmpoenFMTDZGTG1QZHFxbVYwLzBwbFJQd3lKaVQyUzBXUjVBUmc2STZJcUlvVjZMci9zQ01LS0NtCmZlY3FRanVDZ0dPbFl4OFp6SHl5WnFqQzAyMDNiK0orQmxIWlJZUWZFczRrVW1TRkMwaUFUb2V4SWlJd3F1dXV2dUFDNEVEb3NFS0EKQTFHcXRINnFSTmREWWZPaWF4YUpTYVNqcEN1S0FzUjQ5R2lLd2VSNk5yRnZHNVliZDBtTjFNa0djby9QVStQY0Y0VWdTdHlZSjlPUgpKaXRISG1rSHI5Nmk1T1RVYXd1elhuelVKSUJIS1drN2J1aXMvVURyMk8xeGNTdnk2RmdkNjBHWElzVWYxRG5RSjQrSDR4ajA0S2xHCkRmVjBPb0l1MEc0c2thTXhYRHRHNm5zRUVGWmVnQjMxcFdYb2d2emlCNHhpUmZVZzNrWndocUc4azlNZWRLWnNzQ3ozQXd5SURNdlUKY2xPR3ZHQkc4NWhxd3ZHL1EvbHdJSGZLTjBGNVZWSmpqVnNTbjhWb3hJaWRyUEl3cTdlak1aZG5yWThYRDJ6SGMrMGtsR3ZJZzVyUQptamRKQkt1eEZzaHNTVWt0cTZIUWpKTHlRVXA1SVNYYlk5ZTJuS2QrUW1uN09tTUNBd0VBQWFOak1HRXdEd1lEVlIwVEFRSC9CQVV3CkF3RUIvekFPQmdOVkhROEJBZjhFQkFNQ0FRWXdIUVlEVlIwT0JCWUVGTnd1SDlGaE4zbmtxOVhWc3hKeGFEMXFhSndpTUI4R0ExVWQKSXdRWU1CYUFGTnd1SDlGaE4zbmtxOVhWc3hKeGFEMXFhSndpTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElDQVFDUjhFSUNhRUR1dzJqQQpWQy9mN0dMRHc1NktvREVvcW9PT3BGYVdFaENHVnJxWGN0SlVNSHl0R2RVZGFHLzdGRUxZalE3enRkR2w0d0pDWHR6b1JsZ0hOUUl3CjRMeDBTc0ZES3YvYkd0Q3dyMnpEL2N1ejlYOXRBeTVaVnAwdExUV01zdFpERnl5U0NzdGQ2SXdQUzNCRDBJTC9xTXkvcEpUQXZvZTkKaXVPVGU4YVBteGFkSjJXOGVzVkNnbXhjQjlDcHdZaGdST21ZaFJaZitJL0tBUkRPSmNQNVlCdWd4WmZEMHl5SU1hSzlNT3pRME1BUwo4Y0U1NCtYMStOWkszVFROKzIvQlQrTUFpMWJpa3Zjb3NrSjNjaU5ueHo4UkZiTEVBd1crdXhGN0NyK29idWYvV0VQUG0yZWdnQWUyCkhjcXRiZXBCRVg0dGRKUDd3cnkrVVVURjcyZ2xKNERqeUtEVUV1elpwVGNkTjN5MGtjcmExTEdXZ2U5b1hIWVFTYTkrcFRlQXNSeFMKdlRPQlRJLzUzV1haRk0yS0pWajA0c1dEcFFtUTFHd1VZN1ZBMyt2QS9NUllmZzBVRm9kVUoyNVc1SENFdUd3eUVuNkNNVU8rMTkxOApvYTJ1MXFzZ0V1OEt3eENNU1pZMTNBdDFYckZQMVU4MERoRWdCM1ZEUmVtakVkcXNvNW5DdG5rbjRybnZ5T0wyTlNsNmRQckZmNElGCllxWUs2bWl5ZVVjR2J2SlhxQlV6eHZkNFNqMUNlMnQrL3ZkRzZ0SHJqdStJYUZ2b3dkbHhmdjFrNy85blI0aFlKUzgraGdlOSs2amwKZ3Fpc3BkTnBRODB4aUVtRVU1TEFzVGtiT1lNQk1NVHlxZnJRQTcxeU4yQldIelo4dlRtUjlXME52M3ZYa2c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpBTkYgU2VjdXJlIFNlcnZlciBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUY3ekNDQTllZ0F3SUJBZ0lJRGRQanZHejVhN0V3RFFZSktvWklodmNOQVFFTEJRQXdnWVF4RWpBUUJnTlZCQVVUQ1VjMk16STQKTnpVeE1ERUxNQWtHQTFVRUJoTUNSVk14SnpBbEJnTlZCQW9USGtGT1JpQkJkWFJ2Y21sa1lXUWdaR1VnUTJWeWRHbG1hV05oWTJsdgpiakVVTUJJR0ExVUVDeE1MUVU1R0lFTkJJRkpoYVhveElqQWdCZ05WQkFNVEdVRk9SaUJUWldOMWNtVWdVMlZ5ZG1WeUlGSnZiM1FnClEwRXdIaGNOTVRrd09UQTBNVEF3TURNNFdoY05Nemt3T0RNd01UQXdNRE00V2pDQmhERVNNQkFHQTFVRUJSTUpSell6TWpnM05URXcKTVFzd0NRWURWUVFHRXdKRlV6RW5NQ1VHQTFVRUNoTWVRVTVHSUVGMWRHOXlhV1JoWkNCa1pTQkRaWEowYVdacFkyRmphVzl1TVJRdwpFZ1lEVlFRTEV3dEJUa1lnUTBFZ1VtRnBlakVpTUNBR0ExVUVBeE1aUVU1R0lGTmxZM1Z5WlNCVFpYSjJaWElnVW05dmRDQkRRVENDCkFpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBTnZyYXl2bVpGU1ZncENqY3FRWkFaMmNDNEZmYzBtNnA2enoKQkU1N2xndnNFZUJicGh6T0c5SU5neHdydUo0ZGZrVXlZQThINlhkWWZwOXF5R0ZPdGliQlRJMy9UTzgwc2g5bDJMbDQ5YTJwY2JudgpUMWdkcGQ1MElKZWg3V2hNM3BJWFM3eXIvMldhbnZ0SDJWZHk4d21ocm5aRUUyNmNMVVE1dlBuSE82UllQVUc5dE1KSm84Z04wcGN2CkIyVlNBS2R1eUs5bzdQUVVsclpYSDFiRE9aOHJiZVR6UHZZMVpOb01IS0dFU3k5TFMrSXNKSjF0azBEcnRTT09Nc3B2UmRPb2lYc2UKeng3NlcwT0x6YzJvRDJyS0RGNjVua2VQOE5tMkNndFlaUmN6dVNQa2R4bDl5MG91a250UEx4QjNzWTB2YUp4aXpPQlErT3lScDFSTQpWd25WZG1QRjZHVWU3bTFxendtZCtueFByV0FJL1ZhWkR4VXNlNm1BcTR4aGowb0hka0xlUGZUZHNpUXpXN2kxbzBUSnJIOTNQQjBqCjdJS3BwdUxJQmt3Qy9xeGNtWmtMTHhDS3B2Ui8xWWQwRFZsSlJmYndjVnc1S2RhL1NpT0w5VjhCWTlLSGN5aTFTd3IxK0t1Q0xINXoKSlRJZEMyTUtGNEVBLzdaMlh1ZTBzVURLSWJ2VmdGSGxTRkpuTE5KaGlRY05EODVDZDhCRWM1eEVVS0RiRUFvdGxSeUJyK1FjNVJRZQo4VFpCQVFJdmZYT24za0xNVE9tSkRWYjNuNUhVQThac3lZL2IyQnpnUUpoZFpwbVlnRzR0L3dIRnpzdEdINndDeGtQbXJxS0VQTVZPCkhqMXR5UlJNNHk1QnU4bzV2elk4S2htcVFZZE9wYzVMTW5uZGtFbC9BZ01CQUFHall6QmhNQjhHQTFVZEl3UVlNQmFBRkp4ZjBHeGoKbzErVHlwT1lDSzJNaDZVc1hNRTNNQjBHQTFVZERnUVdCQlNjWDlCc1k2TmZrOHFUbUFpdGpJZWxMRnpCTnpBT0JnTlZIUThCQWY4RQpCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVRoNjVpc2FnbUQ5dXcybkFhbHhKClVxekxLMTE0T01IVlZJU2ZrL0NIR1Qwc1pvbnJEVUw4elBCMWhUK0w5SUJkZWVVWFo3MDFndUx5UEk1OVd6YkxXb0FBS2ZMT0t5engKajZwdEJaTnNjc2RXNjk5UUl5amxSUkE5NkdlanJ3NVZENUFKWXU5TFdhTDJVL0hBTmVRdndTUzllUzlPSUNJNy9Sb2dzS1FPTEhEdApkRCs0RTVVR1Vjam9oeWJLcEZ0cUZpR1MzWE5nbmhBWTNqeUI2dWdZdzN5SjhvdFFQcjBSNGhVRHFEWjlNd0ZzU0JYWGlKQ1pCTVhNCjVnZjB2UFNRN1JQaTZvdkRqNk16RDhFcFRCTk8yaFZXY1hOeWdsRDJtak44b3JHb0dqUjBaVnpPMGV1clUrQWFnTmpxT2tua0pqQ2IKNVJ5S3FLa1ZNb2Faa2dvUUkxWVM0UGJPVE9LN3Z0dU5rbk1CWmk5aVBySnlKMFUyN1UxVzQ1ZVovem8xUHFWVVNsSlpTMkRiN3Y1NApFWDlLM0JSNVlMWnJaQVBiRllQaG9yNzJJNWRROEFrek5xZHhsaVh6dVVKOTJ6Zy9MRmlzNkVMaER0alRPMHd1Z3VtRExtc3gyZDFICmhrOXRsNUV1VCtJb2NUVVcwZkp6L2lVckIwY2tZeWZJK1BiWmEvd1NNVllJd0ZOQ3I1elFNMzc4QnZBeFJBTVU4VmpxOG1vTnFSR3kKZzc3RkdyOEg2bG5jbzRnMTc1eDJNanhOQmlMT0ZlWGRudGlQMnQ3U3hEbmxGNEhQT0VmcmY0aHRXUnZmbjBJVXJuN1BxTEJtWmRvMwpyNStxUGVvb3R0N1ZNVmdXZ2x2cXV4bDFBbk1heWtnYUlaT1FDbzZUaEtkOU95TVlrb21namF3PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gRUMtMzg0IENBCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNaVENDQWV1Z0F3SUJBZ0lRZUk4blhJRVNVaUNsQk5BdDNicHo5REFLQmdncWhrak9QUVFEQXpCME1Rc3dDUVlEVlFRR0V3SlEKVERFaE1COEdBMVVFQ2hNWVFYTnpaV052SUVSaGRHRWdVM2x6ZEdWdGN5QlRMa0V1TVNjd0pRWURWUVFMRXg1RFpYSjBkVzBnUTJWeQpkR2xtYVdOaGRHbHZiaUJCZFhSb2IzSnBkSGt4R1RBWEJnTlZCQU1URUVObGNuUjFiU0JGUXkwek9EUWdRMEV3SGhjTk1UZ3dNekkyCk1EY3lORFUwV2hjTk5ETXdNekkyTURjeU5EVTBXakIwTVFzd0NRWURWUVFHRXdKUVRERWhNQjhHQTFVRUNoTVlRWE56WldOdklFUmgKZEdFZ1UzbHpkR1Z0Y3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEWlhKMGRXMGdRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreApHVEFYQmdOVkJBTVRFRU5sY25SMWJTQkZReTB6T0RRZ1EwRXdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFURUtJNnJHRnRxCnZtNWtOMlBremV5ck92Zk1vYmdPZ2tuWGhpbWZvWlR5NDJCNG1JRjRCazN5N0pvT1YyQ0RuN1RtRnk4YXMxMENXNGtqUE1JUkJTcW4KaUJNWTgxQ0UxNzAwTENlSlZmL09UT2ZmcGg4b3hQQlV3N2w4dDFPdDY4S2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRApWUjBPQkJZRUZJMEdablFrZGpyemlmZTgxcjFIZlMrOEVGOUxNQTRHQTFVZER3RUIvd1FFQXdJQkJqQUtCZ2dxaGtqT1BRUURBd05vCkFEQmxBakFEVlMybTVoakVmTy9KVUc3Qkp3K2NoNjl1MVJzSUdMMlNLY0h2bEpGNDBqb2NWWWxpNVJzSkhycGthL0YydE5RQ01RQzAKUW9TWi82dm5udnVSbHlkZDNMQmJNSEhPWGpnYWF0a2w1K3IzWVpKVytPcmFOc0tIWlpZdWNpVXZmOS9ERThrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0dW0gVHJ1c3RlZCBSb290IENBCj09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZ3RENDQTZpZ0F3SUJBZ0lRSHI5WlVMakpnRGRNQnZmclZVKzE3VEFOQmdrcWhraUc5dzBCQVEwRkFEQjZNUXN3Q1FZRFZRUUcKRXdKUVRERWhNQjhHQTFVRUNoTVlRWE56WldOdklFUmhkR0VnVTNsemRHVnRjeUJUTGtFdU1TY3dKUVlEVlFRTEV4NURaWEowZFcwZwpRMlZ5ZEdsbWFXTmhkR2x2YmlCQmRYUm9iM0pwZEhreEh6QWRCZ05WQkFNVEZrTmxjblIxYlNCVWNuVnpkR1ZrSUZKdmIzUWdRMEV3CkhoY05NVGd3TXpFMk1USXhNREV6V2hjTk5ETXdNekUyTVRJeE1ERXpXakI2TVFzd0NRWURWUVFHRXdKUVRERWhNQjhHQTFVRUNoTVkKUVhOelpXTnZJRVJoZEdFZ1UzbHpkR1Z0Y3lCVExrRXVNU2N3SlFZRFZRUUxFeDVEWlhKMGRXMGdRMlZ5ZEdsbWFXTmhkR2x2YmlCQgpkWFJvYjNKcGRIa3hIekFkQmdOVkJBTVRGa05sY25SMWJTQlVjblZ6ZEdWa0lGSnZiM1FnUTBFd2dnSWlNQTBHQ1NxR1NJYjNEUUVCCkFRVUFBNElDRHdBd2dnSUtBb0lDQVFEUkxZNjd0emJxYlRlUm4wNlRwd1hrS1FNbHpoeUM5M3labjBFR3plMmp1c0RiQ1N6QmZOOHAKZmt0bEw1T24xQUZyQXlnWW85aWRCY0VxMkVYeGtkN2ZPOUNBQW96UE9BL3FwMXg0RWFUQnlJVmNKZFBUc3VjbHp4RlVsNnMxd0I1MgpITzhBVTU4NTNCU2xMQ0lsczNKeS9JMno1VDRJSGhRcU53dUlQTXF3OU1qQ29hNjh3YjRwWjFYaS9LMVpYUDY5Vnl5d2tJM0M3VGUyCmZKbUl0ZFVEbWowVkRUMDZxS2hGOEpWT0pWa2R6WmhwdTlQTU1zbU43NEgrclgySnU3cGdFOHBsbFdlZzh4bjJBMWJVYXRNbjRxR3QKZy9CS0VpSjNIQVZ6NGhseFFzRHNkVWFha0ZqZ2FvNHJwVVl3Qkk0WnNoZmp2cW02ZjFieEpBUFhzaUVvZGc0Mk1FeDUxVUdhbXFpNApOYm9NT3ZKRUd5Q0k5OFVsMXozRzR6NUQzWWYreE9yMVV6NU1aZjg3U3N0NFdtc1hYdzNIdzA5T21pcWk3VmROSXVKR21qOFBrVFFrCmZWWGpqSlUzMHhyd0NTc3Mwc21OdEEwQXEyY3BLTmdCOVJrRXRoMitkdjV5WE1TRnl0S0FRZDhGcUtQVmhKQlBDL1BnUDVzWjBqZUoKUC9KN1VoeU05dUgzUEFlWGpBNmlXWUVNc3BBOTArTlpSdTBQcWFmZWdHdGFxZ2UyR2N1OFYvT1hJWG9Nc1N0MFB1dmFwMmN0VE1TWQpuallKZG1abS9Cby82a2hVSEw0d3ZZQlF2M3kxemdEMkRHSFo1eVFENE9NQmdRNjkySVUwaUwyeU5xaDdYQWpsUklDTWIvZ3YxU0hLCkhSelErOFMxaDlFNlRzZDJ0VFZJdFFJREFRQUJvMEl3UURBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJTTSt4eDEKdkFMVG4wNHVTTm41WUZTcXhMTlArakFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVOQlFBRGdnSUJBRWlpMVFBTApMdEEvdkJ6VnRWUkpIbHByOU9UeTRFQTM0TXdVZTduSitqVzFkUmVUYWdWcGhaek5UeGw0V3htQjgyTSt3ODViai9VdlhnRjJFejhzCkFMbk5sbEk1U1cwRVRzWHBENFlONGZxelg0SVM4VHJPWmdZa05Ddm96TXJuYWR5SG5jSTAxM25SMDNlNHFsbFkvcDBtK2ppR1BwMksKaDJSWDVSYzY0dm1OdWVNemVNR1EyTGpkdDROUjVNVE1JOVVHZk9aUjA4MDBNY0QyUnJzTHJmdzlFQVVxTzBxUkplNk0xSVNIZ0NxOApDWXlxT2hOZjZEUjVVTUVRR2ZuVEtCN1UwVkV3S2JPdWtHZldId3Bqc2NXcHhrSXhZeGVVNzJuTEwvcU1GSDNFUXhpSjJmQXlRT2FBCjRrWmY1ZVBCQUZtbytlZ2d2SWtzRGtjMEMrcFh3bE0yL0tmVXJ6SE4vZ0xsZGZxNUp3bjU4L1U3eW4yZnFTTExpTW1xMFVjOU5uZW8KV1dScko4L3ZKOEhqSkxXRzk2NStNazJ3ZVdqUk9laVFXTU9EdkE4czFwZnJ6Z3poSU1mYXR6N0RQNzh2M0RTayt5c2h6V2VQUy9Uago2dFEvNTArNnVhV1RSUnhtSHlINlpGNXY0SGFVTXN0MTlXN2w5by9IdUtUTXFKWjlaUHNrV2tvRGJHczR4dWdEUTVyM1Y3bXpLV21UCk9QUUQ4cnY3Z21zSElORlNINXBrQW51WVp0dGNUVm9QMElTVm9Ed1VRd2JLeXR1NFFUYmFha1JuaDYrdjQwVVJGV2tJc3I0V09aY2sKYnhKRjBXZGRDYWpKRmRyNjBxWmZFMkVmdjRXc3RLMnRCWlFJZ3g1MUY5TnhPNU5RSTFtZzdUeVJWSjEyQU1YRHVEamIKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHVuVHJ1c3QgUm9vdCBDQQo9PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGc3pDQ0E1dWdBd0lCQWdJVUV3TFY0a0JNa2thR0ZtZGR0THU3c21zKy9CTXdEUVlKS29aSWh2Y05BUUVMQlFBd1lURUxNQWtHCkExVUVCaE1DVkU0eE56QTFCZ05WQkFvTUxrRm5aVzVqWlNCT1lYUnBiMjVoYkdVZ1pHVWdRMlZ5ZEdsbWFXTmhkR2x2YmlCRmJHVmoKZEhKdmJtbHhkV1V4R1RBWEJnTlZCQU1NRUZSMWJsUnlkWE4wSUZKdmIzUWdRMEV3SGhjTk1Ua3dOREkyTURnMU56VTJXaGNOTkRRdwpOREkyTURnMU56VTJXakJoTVFzd0NRWURWUVFHRXdKVVRqRTNNRFVHQTFVRUNnd3VRV2RsYm1ObElFNWhkR2x2Ym1Gc1pTQmtaU0JEClpYSjBhV1pwWTJGMGFXOXVJRVZzWldOMGNtOXVhWEYxWlRFWk1CY0dBMVVFQXd3UVZIVnVWSEoxYzNRZ1VtOXZkQ0JEUVRDQ0FpSXcKRFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU1QTjAveTlCRlBkRENBNjFZZ3VCVXRCOVlPQ2Z2ZFpuNTZlWStoegoydllHcVU4ZnRQa0xIem1NbWlEUWZnYlU3RFRaaHJ4MVc0ZUk4TkxaMUtNS3Ntd2I2MGtzUHF4ZDJKUURvT3cwNVRERU5YMzdKazBiCmJqQlUyUFdBUlp3NXJaekpKUVJObXBBK1RrQnVpbXZOS1dmR3pDM2dkT2dGVndwSVVQcDZROXArN0Z1YURtSjIvdXFkSFlWeTdCRzcKTmVnZko3L0JvY2U3U0JiZFZ0Zk1UcURodWF6YjFZTVpHb1hSbEpmWHlxTmxDL000K1FLdTNmWm56OGsvOVlvc1J4cVpid1VOL2RBZApnakg4S2N3QVdKZVJUSUFBSERPRmxpL0xRY0tMRUlURENTU0pIN1VQMmRsM1J4aVNsR0JjeDVrRFBQNzNsYWQ5VUtHQXdxbURyVmlXClZTSGJobG5VcjhhODNZRnVCOXRnWXY3c0VHN2FhQUgwZ3h1cFBxSmJJOWRreHQvY29uM1lTN3FDMGxINFpyOEdSdVI1S2lZMmVZOGYKVHBrZHNvOE1EaHoveVYzQS9aQVFwckUzODgwNkpHNjBoWkMvZ0xrTWpOV2Ixc2p4Vmo4YWdJbDZxZUliTWxFc1B2TGZlL1pkZWlrWgpqdVhJdlRaeGkxMU13aDAvclZpaXp6MXdUYVpRbUNYY0kvbTRXRUVJY2I5UHVJU2dqd0JVRmZ5UmJWaW5sanZyUzVZbnpXdWlvWWFzCkRYeFU1bVpNWmwrUXZpR2FBa1l0NUlQQ2dMblBTejdvZnp3QjdJOWV6WC9TS0VJQmxZcmlsejBRSVgzMm5SekZOS0hzTEE0S1Vpd1MKVlhBa1BjdkNGRFZEWFNkT3ZzQzlxbnlXNS95ZVlhMUUwd0NYQWdNQkFBR2pZekJoTUIwR0ExVWREZ1FXQkJRR21wc2ZVMzN4OWFUSQowNFkrb1hOWnRQZEVJVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRkFhYW14OVRmZkgxcE1qVGhqNmhjMW0wCjkwUWhNQTRHQTFVZER3RUIvd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFxZ1Z1dHQwVnliK3p4aUQyQmtld2hwTWwKMDQyNXlBQS9sL1ZTSjRoeHlYVDk2OHBrMjF2dkhsMjZ2OUhyN2x4cHVoYkk4N21QMHpZdVFFa0hEVm5laXhDd1NRWGkvNUUvUzdmZApBbzc0Z1NoY3pOeHRyMThVbkgxWWVBMzJnQW01NlE2WEtSbTR0K3Y0RnN0VkV1VEdmYnZFN1BpMUhFNCtaNy9GWHh0dGJVY29xZ1JZCllkWjJ2eUovMEFkcXAyUlQ4SmVObllBL3U4RUgyMld2NXBzeW1zTlVrOFFjQ01ORSszdGpFVVBSYWhwaGFubHRrRThwamtjRndSSnAKYWRiR05qSGgvUHFBdWx4UHhPdTNNcXo0ZFdFWDF4QVp1ZkhTQ2U5NlFwMWJXZ3ZVeHBWT0tzNy9COWRQZmhnR2lQRVp0ZG1ZdTY1eAp4QnpuZEZsWTd3eUp6NHNmZFpNYUJCU1NTRkNwNjFjcEFCYmpOaHpJK0wvd005VkJEOFRNUE4zcE0wTUJrUkFySHRHNVhjMHlHWXVQCmpDQjMxeUxFUXR5RUZwc2xiZWkwVlhGL3NIeXowM0ZKdWM5U3BBUS8zRDJndTY4em5nb3dZSTdiblYyVXFMMWc1MktBZG9HRERJek0KTUVaSjRnelNxSy9yWVhIdjV5SmlxZmRjWkd5ZkZveG5OaWRGOVFsN3YvWVFDdkd3alZSRGpBUzZvei92NGpYSCtYVGdielJCMEw5egpaVmNnK1p0bmVtWm9KRTZBWmIwUW1RWlo4bVd2dU1aSHUvMlFlSXRCY3k2dlZSL2NPNUp5Ym9UVDBHRk1EY3gyVitJdGhTSVZOZzNyCkFaM3IyT3ZFaEpuN3dBek1NdWpqZDlxRFJJdWVWU2pBaTFqVGtENU9Hd0R4RmEyREs1bz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKSEFSSUNBIFRMUyBSU0EgUm9vdCBDQSAyMDIxCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnBEQ0NBNHlnQXdJQkFnSVFPY3FUSE85RDg4YU9rOGYwWklrNGZqQU5CZ2txaGtpRzl3MEJBUXNGQURCc01Rc3dDUVlEVlFRRwpFd0pIVWpFM01EVUdBMVVFQ2d3dVNHVnNiR1Z1YVdNZ1FXTmhaR1Z0YVdNZ1lXNWtJRkpsYzJWaGNtTm9JRWx1YzNScGRIVjBhVzl1CmN5QkRRVEVrTUNJR0ExVUVBd3diU0VGU1NVTkJJRlJNVXlCU1UwRWdVbTl2ZENCRFFTQXlNREl4TUI0WERUSXhNREl4T1RFd05UVXoKT0ZvWERUUTFNREl4TXpFd05UVXpOMW93YkRFTE1Ba0dBMVVFQmhNQ1IxSXhOekExQmdOVkJBb01Ma2hsYkd4bGJtbGpJRUZqWVdSbApiV2xqSUdGdVpDQlNaWE5sWVhKamFDQkpibk4wYVhSMWRHbHZibk1nUTBFeEpEQWlCZ05WQkFNTUcwaEJVa2xEUVNCVVRGTWdVbE5CCklGSnZiM1FnUTBFZ01qQXlNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFJdkM1NjlsbXdWbmxza04KSkxuUURtVDh6dUlrR0N5RWYzZFJ5d1FSTnJoZTdXbHhwNTdrSlFtWFo4Rkh3cytSRmpaaVBUZ0U0VkdDLzZ6U3RHbmRMdXdSbzBYdQphMnM3VEwrTWphUWVuUkc1NlRqNWVnNE1tT0lqSGRGT1k5VG51RUZFKzJ1dmE5b2YwOFdSaUZ1a2laTFJnZWFNT1ZpZzFtbERxYTJZClVsaHUyd3I3YTg5byt1T2tYanBGYzVnSDZsOENjdDRNcGJPZnJxa2R0eDJ6L0lwWjUyNXlaYTMxTUpRakIvT0NGa3MxbUp4VHV5L0sKNUZyWng0MGQvSmlaK3l5a2dtdndLaCtPQzE5eFhGeXVRbnNwaVlITEE2T1p5b2llQzBBSlFUUGI1bGg2L2E2WmNNQmFEOVlUaG5FdgpkbW44a04zYkxXN1I4cHYxR211ZWJ4V01ldkJMS0tBaU9JQWtiRGFrTy9Jd2tmTjRFOC9CUHpXcjhSMFJJN1ZESXA0QmtyY1lBdVVSCjBZTGJGUURNWVRmQktueWE0ZEM2czFCRzdvS3NuVEg0K3lQaUF3QkljS01KSm5rVlUyRHpPRnl0T09xQkFHTVV1VE5lM1F2Ym9FVUgKR2pNSitFMjBwd0ttYWZUQ1dRV0laWVZXcmt2TDRONDhmUzBheU9uN0g2TmhTdFlxRTYxM1RCb1ltNUVQV05nR1ZNV1grS28vSUlxbQpoYVozOXFiOEhPTHVicFF6S29OUWhBcmxUNGI0VUVWNEFJSHJXMmpqSm8zTWUxeFI5QlFzUUw0YVlCMTZjbUVkSDJNdGlLck9va1dRCkNQeHJ2ck5RS2xyOXFFZ1lSdGFRUUpLUUNvUmVhREg0NiswTjB4M0dmWmtZVlZZblpTNk5SY1VrN003akFnTUJBQUdqUWpCQU1BOEcKQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGQXBJSTZaZ3BKSUtNK3FUVzhWWDZpVk52Ukx1TUE0R0ExVWREd0VCL3dRRQpBd0lCaGpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVBwQklxbTVpRlNWbWV3elZqSXVKbmRmdFRnZnZuTkFVWDE1UXZXaVdrS1FVCkVhcG9iUWsxT1VBSjJ2UUpMRFNsZTFtRVNTbVhkTWdISGtkdDhzNGNVQ2JqbmoxQVV6LzNmNVoyRU1WR3BkQWdTMUQwTlRzWTlGVnEKUVJ0SEJtZzh1d2tJWXRsZlZVS3FyRk9GckpWV05sYXI1QVdNeGFqYUg2TnB2Vk1QeFAvY3l1Tis4a3lJaGtkR0d2TUE5WUNSb3R4RApRcFNiSVBEUnpiTHJMRlBDVTNoS1R3U1VRWnFQSnpMQjVVa1p2L0h5d291b0Nqa3hLTFI5WWpZc1Rld2ZNN1orZDIxK1VQQ2ZEdGNSCmo4OFl4ZU1uL2lidkJaM1B6emZGMEh2YU83QVdoQXc2azlhK0Y5c1BQZzRaZUFuSHFRSnlJa3YzTjNhNmRjU0ZBMXBqMWJGMUJjSzUKdlpTdGpCV1pwNU45OXNYenFuVFBCSVdVbUFEMDR2bktKR1cvNEdLdnlNWDZzc21lVmtqYWVmMldkaFcrbzQ1V3hMTTAvTDVIOU1HMApxUHpWTUlobzdzdXV5V1BFZHI2c09CamhYbHpQcmpvaVVldlJpN1B6S3pNSFZJZjZ0TElUZTdwVEJHSUJuZkhBVCs3aE90U0xJQkQ2CkFsZm03OEVMdDVCR25Ca3BqTnh2b0VwcGFaUzNKR1dnLzZ3L3pnSDdJUzc5YVBpYjhxWFBNVGhjRmFybWx3REIzMXFscHptcTZZUi8KUEZHb090bVVXNHkvVHdoeDVkdW9YTlRTcHY0QW84WVd4dy9vZ000Y0tHUjBHUWpUUXVQT0FGMS9zZHdUc09FRnk5RWdxb1owbmpubgprZjMvVzliM3JhWXZBd3R0NDFkVTYzWlRHSTBSbUxvPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpIQVJJQ0EgVExTIEVDQyBSb290IENBIDIwMjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDVkRDQ0FkdWdBd0lCQWdJUVozU2RqWGZZTzJyYkl2VC9XZUsvempBS0JnZ3Foa2pPUFFRREF6QnNNUXN3Q1FZRFZRUUdFd0pIClVqRTNNRFVHQTFVRUNnd3VTR1ZzYkdWdWFXTWdRV05oWkdWdGFXTWdZVzVrSUZKbGMyVmhjbU5vSUVsdWMzUnBkSFYwYVc5dWN5QkQKUVRFa01DSUdBMVVFQXd3YlNFRlNTVU5CSUZSTVV5QkZRME1nVW05dmRDQkRRU0F5TURJeE1CNFhEVEl4TURJeE9URXhNREV4TUZvWApEVFExTURJeE16RXhNREV3T1Zvd2JERUxNQWtHQTFVRUJoTUNSMUl4TnpBMUJnTlZCQW9NTGtobGJHeGxibWxqSUVGallXUmxiV2xqCklHRnVaQ0JTWlhObFlYSmphQ0JKYm5OMGFYUjFkR2x2Ym5NZ1EwRXhKREFpQmdOVkJBTU1HMGhCVWtsRFFTQlVURk1nUlVORElGSnYKYjNRZ1EwRWdNakF5TVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCRGdJL3JHZ2x0SjZySzlKT3REQTRNTTdLS3J4Y20xbApBRWVJaFB5YUptdXFTN3BzQkFxSVhoZnlWWWY4TUxBMDRqUllWeHFFVStrdzJhbnlsblREVVI5WVNUSE1tRTVnRVlkMTAzS1VrRStiCkVDVXFxSGd0dnBCQldKQVZjcWVodDZOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVV5UnRUZ1JMK0JOVVcKMGFxOG1tKzNvSlVaYnNvd0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUdTTTQ5QkFNREEyY0FNR1FDTUJIZXJ2amNUb2l3cWZBaQpyY0pSUU85Z2NTM3Vqd0xFWFFOd1NhU1M2c1VVaUhDbTB3Mndxc29zUUp6NzZZSnVtZ0l3SzBlYUI4YlJ3b0Y4eWd1V0dFRWJvL1F3CkNaNjFJeWdObnhTMlBGT2lUQVpwZmZwc2tjWXFTVVhtN0xjVDRUcHMKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQXV0b3JpZGFkIGRlIENlcnRpZmljYWNpb24gRmlybWFwcm9mZXNpb25hbCBDSUYgQTYyNjM0MDY4Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJR0ZEQ0NBL3lnQXdJQkFnSUlHM0RwMHYrdWJIRXdEUVlKS29aSWh2Y05BUUVMQlFBd1VURUxNQWtHQTFVRUJoTUNSVk14UWpCQQpCZ05WQkFNTU9VRjFkRzl5YVdSaFpDQmtaU0JEWlhKMGFXWnBZMkZqYVc5dUlFWnBjbTFoY0hKdlptVnphVzl1WVd3Z1EwbEdJRUUyCk1qWXpOREEyT0RBZUZ3MHhOREE1TWpNeE5USXlNRGRhRncwek5qQTFNRFV4TlRJeU1EZGFNRkV4Q3pBSkJnTlZCQVlUQWtWVE1VSXcKUUFZRFZRUURERGxCZFhSdmNtbGtZV1FnWkdVZ1EyVnlkR2xtYVdOaFkybHZiaUJHYVhKdFlYQnliMlpsYzJsdmJtRnNJRU5KUmlCQgpOakkyTXpRd05qZ3dnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFES2xtdU82dmo3OGFJMTRIOU0ydUREClV0ZDl0aERJQWw2elF5ckVUMnF5eWh4ZEtKcDRFUnBwV1ZldnRTQkM1SXNQNXQ5YnBnT1NML1VSNUdMWE1uRTQyUVFNY2FzOVVYNFAKQjk5akJWenB2NVJ2d1NtQ3dMVGFVYkRCUEx1dE4wcGN5dkZMTmc0a3E3L0RoSGY5cUZEMHNlZkdMOUl0V1kxNkNrNldhVklDcWphWQo3UHo2RklNTU54L0pramQvMTRFdDVjUzU0RDQwL21mMFBtYlIwL1JBejE1aU5BOXdCajRnR0ZyTzkzSWJKV3lUZEJTVG8zT3hEcXFICkVDTlpYeUFGR1VmdGFJNlNFc3BkL05ZcnNwSThJTS9oWDY4Z3ZxQjJmM2JsN0JxR1lUTSs1M3UwUDZBUGpxSzVhbSs1aHladlFXeUkKcGxEOWFtTUw5Wk1XR3htUHN1MmJtOG1ROVFFTTN4azlEejQ0SThrdmp3elJBdjRiVmRaTzBJMDhyMCtrOC82dkt0TUZuWGtJb2N0WApNYlNjeUpDeVovUVlGcE02L0VmWTBYaVdNUis2S3d4ZlhabXRZNGxhSkNCMjJOLzlxMDZtSXFxZFh1WW5pbjFvS2FQbmlyamFFYnNYCkxabWRFeVJHOThYaTJKK09mOGVQZEcxYXN1aHk5YXp1SkJDdEx4VGEveTJhUm5GSHZrTGZ1d0hiOUgvVEtJOHhXVnZUeVFLbXRGTEsKYnBmN1E4VUlKbStLOUx2OW55aXFEZFZGOHhNNkhkakFlSTlCWnp3ZWxHU3Vld3ZGNk5rQmlEa2FsNFprUWRVN2h3eHUrZy9HdlVnVQp2emxOMUo1QnRvK1dIV09XazltVkJuZ3hhSjQzQmp1QWlVVmhPU1BIRzBTakZlVWMrSkl3dXdJREFRQUJvNEh2TUlIc01CMEdBMVVkCkRnUVdCQlJsemV1ck5SNEFQbjdWZE1BY3RITkhEaHBrTHpBU0JnTlZIUk1CQWY4RUNEQUdBUUgvQWdFQk1JR21CZ05WSFNBRWdaNHcKZ1pzd2daZ0dCRlVkSUFBd2dZOHdMd1lJS3dZQkJRVUhBZ0VXSTJoMGRIQTZMeTkzZDNjdVptbHliV0Z3Y205bVpYTnBiMjVoYkM1agpiMjB2WTNCek1Gd0dDQ3NHQVFVRkJ3SUNNRkFlVGdCUUFHRUFjd0JsQUc4QUlBQmtBR1VBSUFCc0FHRUFJQUJDQUc4QWJnQmhBRzRBCmJ3QjJBR0VBSUFBMEFEY0FJQUJDQUdFQWNnQmpBR1VBYkFCdkFHNEFZUUFnQURBQU9BQXdBREVBTnpBT0JnTlZIUThCQWY4RUJBTUMKQVFZd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFIU0hLQUlyZHg5bWlXVHRqM1F1Umh5N3FQajRDeDJEdGpxbjZFV0tCN2ZnUGlETAo0UWpiRXdqNEtLRTFzb0N6QzFIQTAxYWFqVE5GU2E5SjhPQTlCM3BGRTFyL3lKZlkweGdzZlpiNDNhSmxRM0NUa0JXNmtOL29HYkRiCkxJcGdEN2R2bEFjZUhhYkpoZmE5TlBoQWVHSVFjRHErZlVzNWdha1ExSlpCdS9oZkhBc2RDUEt4c0lsNjh2ZWc0TVNQaTNpMU8xaWwKSTQ1UFZmNDJPK0FNdDhvcU1FRWd0SUROcnZ4MlpuT29ybTdoZk5vRDZKUWc1aUtqMEIrUVhTQlRGQ1pYMmxTWDN4WkVFQUVlaUdhUApjamlUM1NDM05MN1g4ZTVqamtkNUtBYjg4MWxGSldBaU14dWpYNmk2S3RvYVBjMUE2b3p1QlJXVjFhVXNJQytubUNqdVJmenh1SWdBCkxJOUMybEhWbk9VVGFIRkZRNHVlQ3lFOFMxd0YzQnFmbUk3YXZTS2VjczJ0Q3N2TW8yZWJLSFRFbTljYVBBUllwb0tkcmNkN2IvK0EKbHVuNGpXcTlHSkFkLzBrYWtGSTNreTg4QWwyQ2RndFI1eGJIVi9nNCthZk5teUpVNzJPd0ZXMVRaUU5LWGtxZ3NxZU9TUUJaT05YSAo5SUJrOVc2VlVMZ1JmaFZ3T0Vxd2Y5REVNbkRBR2YvSk9DMFVMR2IwUWtUbVZYWWJnQlZYLzhDbnA2bzVxdGpUY05BdXV1dVVhdnBmCk5JYm5Zclg5aXZBd2haVEpyeVFDTDIvVzNXZis0N0JWVHdTWVQ2UkJWdUtUMEdybzF2UDdaZURPZGNReFdRenVnc2dNWUROS0dicUUKWnljUHZFSmR2U1JVRGV3ZGNBWmZwTHo2SUh4VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgp2VHJ1cyBFQ0MgUm9vdCBDQQo9PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0R6Q0NBWldnQXdJQkFnSVVibXE4V2FwVHZwZzVaNkxTYTZRNzVtMGMxdG93Q2dZSUtvWkl6ajBFQXdNd1J6RUxNQWtHQTFVRQpCaE1DUTA0eEhEQWFCZ05WQkFvVEUybFVjblZ6UTJocGJtRWdRMjh1TEV4MFpDNHhHakFZQmdOVkJBTVRFWFpVY25WeklFVkRReUJTCmIyOTBJRU5CTUI0WERURTRNRGN6TVRBM01qWTBORm9YRFRRek1EY3pNVEEzTWpZME5Gb3dSekVMTUFrR0ExVUVCaE1DUTA0eEhEQWEKQmdOVkJBb1RFMmxVY25WelEyaHBibUVnUTI4dUxFeDBaQzR4R2pBWUJnTlZCQU1URVhaVWNuVnpJRVZEUXlCU2IyOTBJRU5CTUhZdwpFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFWlZCS3JveDVsa3FxSEFqRG82TE4vbGxXUVhmOUpwUkN1eDNOQ050enNsdDE4OCtjClRvTDB2L2hoSm9WczFvVmJjbkRTL2R0aXROOVRpNzJ4UkZoaVFnbkgrbjliRU9mK1FQM0EyTU1yTXVkd3ByZW1JRlVkZTRCZFM0OW4KVFBFUW8wSXdRREFkQmdOVkhRNEVGZ1FVbURuTnZ0aXlqUGV5cStHdEpLOTdmS0hiSDg4d0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0NnWUlLb1pJemowRUF3TURhQUF3WlFJd1Y1M2RWdkhINCttNFNWQnJtMm5EYit6RGZTWGtWNVVUClFKdFMwenZ6UUJtOEpzY3RCcDYxZXphZjlTWFVZMnNBQWpFQTZkUEdubGFhS3N5aDJqL0laaXZUV0p3Z2hmcXJrWXB3Y0JFNFlHUUwKWWdtUldBRDVUZnMwYU5vSnJTRUdHSlRPCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCnZUcnVzIFJvb3QgQ0EKPT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlZqQ0NBejZnQXdJQkFnSVVRK054RTlpeldSUmR0ODZNL1RYOWI3d0ZqVVV3RFFZSktvWklodmNOQVFFTEJRQXdRekVMTUFrRwpBMVVFQmhNQ1EwNHhIREFhQmdOVkJBb1RFMmxVY25WelEyaHBibUVnUTI4dUxFeDBaQzR4RmpBVUJnTlZCQU1URFhaVWNuVnpJRkp2CmIzUWdRMEV3SGhjTk1UZ3dOek14TURjeU5EQTFXaGNOTkRNd056TXhNRGN5TkRBMVdqQkRNUXN3Q1FZRFZRUUdFd0pEVGpFY01Cb0cKQTFVRUNoTVRhVlJ5ZFhORGFHbHVZU0JEYnk0c1RIUmtMakVXTUJRR0ExVUVBeE1OZGxSeWRYTWdVbTl2ZENCRFFUQ0NBaUl3RFFZSgpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMMVZmR0hUdUIwRVlnV2dybXkzY0xSQjZrc0RYaEEva0ZvY2l6dXdab3RzClNLWWNJcnJWUUpMdU03SWpXY21PdkZqYWk1N1FHZkl2V2NhTVkxcTZuNk1Mc0xPYVhMb1J1QkxwREx2UGJteUFoeWtVQXl5TkpKckkKWklPMWFxd1RMRFB4bjl3c1lUd2FQM0JWbTYwQVVuL1BCTG4rTnZxY3dCYXVZdjZXVEVOK1ZSUytHclBTYmNLdmRtYVZheXF3bEhlRgpYZ1FQWWgxamRmZHI1OHRibW5Ec1BtY0Y4UDRIQ0lEUEtOc0Z4aFFuTDRaOThDZmUvK1orTTBqbkN4NVkwU2NyVXc1WFNtWFgrNktBCllQeE12RFZUQVdxWGNvS3Y4UjF3Nkp6MTcxN0NiTWRIZmxxVWhTWk5PN3JyVE9pd0NjSmx3cDJkQ1p0T3RaY0ZyUFVHb1BjMkJYNzAKa0xKcnhMVDVaT3JwR2dySURhanRKOG5VNTdPNXE0SWlrQ2M5S3VoOGtPKzhULzNpQ2lTbjNtVWtwRjNxd0hZdzAzZFErQTBFbTVRMgpBWFBLQmxpbTB6dmMrZ1JHRTFXS3lVUkh1RkU1R2k3b05PSjV5MWxLQ24rOHB1OGZBMmRxV1NzbFlwUFpVeGxtUENkaUtZWk5wR3Z1Ci85Uk91dFcwNG81SVdnQVpDZkVGMmM2UnNmZnI2VGxQOW04RVE1cFY5VDRGRkwyL3MxbTAySTR6aEtPUVVxcXpBcFZnK1F4TWFQbnUKMVJjTitIRlh0U1hrS2U1bFhhL1I3andYQzFwRHhhV0c2aVNlNGdVSDNEUkNFcEhXT1hTdVRFR0MyL0ttU05Hem0vTXpxdk9td01WTwo5ZlNkZG1QbUFzWWlTOEdWUDFCa0xGVGx0dkE4S2M5WEFnTUJBQUdqUWpCQU1CMEdBMVVkRGdRV0JCUlVZbkJqOFhXRVExaU8wUllnCnNjYXNHcnoyaVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVFzRkFBT0MKQWdFQUticVNTYWV0OFBGd3crU1g4SitwSmRWcm5qVCs1aHBrOWpwclVySVFlQnFmVE5xSzJ1d2NOMUxnUWt2N2JIYktKQXM1RWhXZApueEV0L0hsazNPRGc5ZDNnVjhtbHNuWndVS1QrdHdwdzFhQTA4WFhYVFVtNkVkR3oyT3lDLytzT3hMOWtMWDFqYmhkNDdGMThpTWpyCmpsZDIyVmtFK3J4U0gwV3M4SHFBN094dmRxNlIyeENPQk55UzM2RDI1cTVKMDhGc0Vodk1LYXI1Q0tYaU54VEtzYmhtN3hxQzVQRDQKOGFjV2FiZmJxV0U4bi9VeHkrUUFSc0l2ZExHeDE0SHVxQ2FWdklpdlREVUhLZ0xLZUJSdFJ5dEFWdW5MS21DaFp3T2d6b3k4c0hKbgp4REhPMnpUbEpRTmdKWHR4bU9UQUd5dGZkRUxTUzhWWkNBZUh2c1hEZitlVzJlSGNLSmZXandYajladE95aDFRUndWVHNNbzU1NFdnCmljRUZPd0UzMHo5SjRuZnJJOGlJWmpzOU9YWWhSdkhzWHlPNDY2Sm1kWFRCUVBmWWFKcVQ0aTJwTHIwY294N0lkTWFrTFhvZ3F6dTQKc0ViOWI5MWZVbFYxWXZDWG9IelhPUDBsMzgyZ214RFBpN2c0WGw3RnRLWUNOcUVlWHh6UDRwYWRLYXI5bUs1UzRmTkJVdnVwTG5LVwpueWZqcW5OOStCb2pabnM3cTJXd01nRkxGVDQ5b2s4TUt6V2l4dGxuRWpVd3pYWXVGck9abmsxUFRpMDdORVBobWc0TnBHYVh1dEljClNrd3NLb3VMZ1U5eEdxbmRYSHQ3Q01VQURUZEE0M3g3VkY4dmhWOTI5dmVuc0J4WFZzRnk2SzJpcjQwelNib2ZpdHptZEh4Z2htK0gKbDNzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpJU1JHIFJvb3QgWDIKPT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDR3pDQ0FhR2dBd0lCQWdJUVFkS2QwWExxN3FlQXdTeHM2UytIVWpBS0JnZ3Foa2pPUFFRREF6QlBNUXN3Q1FZRFZRUUdFd0pWClV6RXBNQ2NHQTFVRUNoTWdTVzUwWlhKdVpYUWdVMlZqZFhKcGRIa2dVbVZ6WldGeVkyZ2dSM0p2ZFhBeEZUQVRCZ05WQkFNVERFbFQKVWtjZ1VtOXZkQ0JZTWpBZUZ3MHlNREE1TURRd01EQXdNREJhRncwME1EQTVNVGN4TmpBd01EQmFNRTh4Q3pBSkJnTlZCQVlUQWxWVApNU2t3SndZRFZRUUtFeUJKYm5SbGNtNWxkQ0JUWldOMWNtbDBlU0JTWlhObFlYSmphQ0JIY205MWNERVZNQk1HQTFVRUF4TU1TVk5TClJ5QlNiMjkwSUZneU1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFelp2Vm40Q0RDdXdKU3ZNV1NqNWN6M2VzM21jRkRSMEgKdHR3VysxcUxGTnZpY1dERXVrV1ZFWW1PNmdiZjl5b1dIS1M1eGNVeTRBUGdIb0lZT0l2WFJkZ0thbTdtQUhmN0FsRjlJdGdLYnBwYgpkOS93K2tIc09keDF5bWdIREIvcW8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WCkhRNEVGZ1FVZkVLV3J0NUxTRHY2a3ZpZWpNOXRpNmx5TjVVd0NnWUlLb1pJemowRUF3TURhQUF3WlFJd2UzbE9SbENFd2tTSFJodEYKY1A5WW1kNzAvYVRTVmFZZ0xYVFdOTHhCbzFCZkFTZFd0TDRuZFFhdkVpNTFtSTM4QWpFQWkvVjNiTlRJWmFyZ0N5enVGSjBuTjZUNQpVNlZSNUNtRDEvaVFNVnRDbndyMS9xNEFhT2VNU1ErMmIxdGJGZkxuCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkhpUEtJIFJvb3QgQ0EgLSBHMQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZhakNDQTFLZ0F3SUJBZ0lRTGQyc3ptS1hsS0ZENkxETmRtcGVZREFOQmdrcWhraUc5dzBCQVFzRkFEQlBNUXN3Q1FZRFZRUUcKRXdKVVZ6RWpNQ0VHQTFVRUNnd2FRMmgxYm1kb2QyRWdWR1ZzWldOdmJTQkRieTRzSUV4MFpDNHhHekFaQmdOVkJBTU1Fa2hwVUV0SgpJRkp2YjNRZ1EwRWdMU0JITVRBZUZ3MHhPVEF5TWpJd09UUTJNRFJhRncwek56RXlNekV4TlRVNU5UbGFNRTh4Q3pBSkJnTlZCQVlUCkFsUlhNU013SVFZRFZRUUtEQnBEYUhWdVoyaDNZU0JVWld4bFkyOXRJRU52TGl3Z1RIUmtMakViTUJrR0ExVUVBd3dTU0dsUVMwa2cKVW05dmRDQkRRU0F0SUVjeE1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBOUI1L1VuTXlESFBrdlJOMApvOVF3cU5DdVM5aTIzM1ZIWnZSODV6a0VIbXB3SU5KYVIzSm5WZlNsNkozVkhpR2g4R2U2ekNGb3ZrUlR2NDM1NHR3dlZjZzNQeCtrCndKeXo1SGRjb0ViK2Qvb2FvRGpxN1pweTNpdTlsRmM2dXV4NTUxOTlRbVE1ZWlZMjl5VHcxUys2bFpnUlpxMlhOZFoxQVlEZ3IvU0UKWVl3TkhsOThoNVplUWEvcmgrcjRYZkV1aUFVK1RDSzcyaDhxM1ZKR1pEbnpRczdabmd5enNIZVhaSnpBOUtNdUg1VUhzQmZmTU5zQQpHSlpNb1lGTDNRUnRVNk05L0FlczFNVTNndXZrbFFnWktJTFNRanFqMkZQc2VZbGdTR0RJY3BKUTNBT1Bneit5UWxkYTIycnBFWmZkCmhTaThNRXlyNDhLeFJVUkhIK0NLRmdlVzBpRVBVOER0cVg3VVR1eWJDZXl2UXF3dzFyL1JFRVhncGhheXBjWFRUM09VTTNFQ29XcWoKMWpPWFR5RmpIbHVQMmNGZVJYRjNENEZkWHlHYXJZUE0rbDdXalNOZkd6MUJyeUIxWmxwSzlwLzdxeGozY2NDMkhUSHNPeURyeStLNAo5YTZTc3ZmaGhFdnlvdktUbWlLZTB4UnZObFM5SDE1WkZibHpxTUY4YjN0aTZSWnNSMXBsOHc0Um0wYlovVzNjMXB6QXRIMmxzTjAvClZtK2grZmJrRWtqOUJuOFNWN2FwSTA5YkE4UGdjU29qdC9ld3NUdThtTDNXbUtnTWEvYU9FbWVtOHJKWTVBSUpFenlwdXhDMDBqQkYKOGV6M0FCSGZaZmpjSzBOVnZ4YVh4QS9WTEdHRXFuS0cvdVk2ZnNJL2ZlNzhMeFErNW9YZFVHKzNTZTBDQXdFQUFhTkNNRUF3RHdZRApWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVThuY1grbDZvL3ZZOWNkVm91c2xHRERqWXI3QXdEZ1lEVlIwUEFRSC9CQVFECkFnR0dNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUNBUUJRVWZCMTNIQUU0LytxZGRSeG9zdWVqNmlwMDY5MXgxVFBPaHdFbVNLc3hCSGkKN3pOS3BpTWREZzFIMkRmSGI2ODBmMCtCYXpWUDZYS2xNZUo0NS9kT2xCaGJRSDNQYXlGVWh1YVZldnZHeXVxY1NFNVhDVjB2clBTbAp0SmN6V05Xc2Vhbk1YL21GK2xMRmpmaVJGT3M2RFJmUVVzSjc0OEp6amtaNEJqZ3M2RnphWnNUMHBQQldHVE1wV21XU0JVZEdTcXVFCnd4NG5vUjhSa3BrbmRaTVB2RFk3bDFlUEpsc011NXdQMUc0d0I5VGNYelpvWmptRGxpY21pc2pFT2Y2YUlXL1Zjb2JwZjJMbGwwN1EKSk5CQXNOQjFDSTY5YU80STEyNThFSEJHRzN6Z2lMS2Vjb2FaQWVPL24wa1p0Q1crVm1XdUYyUGxIdC9vLzBlbHYrRW1CWVRrc01Ddgo1d2lacUF4ZUpvQkYxUGhvTDVhUHJ1SktISndXREJOdk9JZjJ1OGcwWDVJRFVYbHdwdC9MOVpsTmVjMU92RmVmUTA1ckxpc1krR3B6CmpMckZOZTg1YWtFZXozR29vcktHQjFzNnllSHZQMlVFZ0VjeVJIQ1ZUakZuYW5SYkVFVjE2ckNmME9ZMS9rNmZpOHdya2tWYmJpVmcKaFViTjBhcXdkbWFUZDVhK2c3NDR0aVJPSmd2TTdYcFdHdURwV3Naa3JVeDZBRWhFTDdsQXV4TSt2aFY0bllXQlNpcFgzdFVaUTlyYgp5bHRIaG9NTFA3WU5kbmh6ZVNKZXNZQWZ6NzdSUDFZUW1DdVZoNkVmbldRVVlEa3Nzd0JWTHVUMXN3NVh4SkZCQUp3LzZLWGY2dmIvCnlQQ3RiVktvRjZ1Yllmd1NVVFhrSmYydnFtcUdPUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkdsb2JhbFNpZ24gRUNDIFJvb3QgQ0EgLSBSNAo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUIzRENDQVlPZ0F3SUJBZ0lOQWdQbGZ2VS9rLzJsQ1NHeXBqQUtCZ2dxaGtqT1BRUURBakJRTVNRd0lnWURWUVFMRXh0SGJHOWkKWVd4VGFXZHVJRVZEUXlCU2IyOTBJRU5CSUMwZ1VqUXhFekFSQmdOVkJBb1RDa2RzYjJKaGJGTnBaMjR4RXpBUkJnTlZCQU1UQ2tkcwpiMkpoYkZOcFoyNHdIaGNOTVRJeE1URXpNREF3TURBd1doY05Nemd3TVRFNU1ETXhOREEzV2pCUU1TUXdJZ1lEVlFRTEV4dEhiRzlpCllXeFRhV2R1SUVWRFF5QlNiMjkwSUVOQklDMGdValF4RXpBUkJnTlZCQW9UQ2tkc2IySmhiRk5wWjI0eEV6QVJCZ05WQkFNVENrZHMKYjJKaGJGTnBaMjR3V1RBVEJnY3Foa2pPUFFJQkJnZ3Foa2pPUFFNQkJ3TkNBQVM0eG5uVGoyd2xEcDh1T1JrY0E2U3VtdVU1QndrVwp5bU94dVliNGlsZkJWODVDK25PaDkyVkMveDdCQUxKdWN3Ny94eUhsR0tTcTJYRS9xTlM1em93ZG8wSXdRREFPQmdOVkhROEJBZjhFCkJBTUNBWVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVVkxCN3JVVzQ0a0IvK3dwdSs3NHp5VHlqaE5Vd0NnWUkKS29aSXpqMEVBd0lEUndBd1JBSWdJazkwY3JsZ3IvSG1uS0FXQlZCZncxNDdibUYwNzc0QnhMNFlTRmxoZ2pJQ0lDYWRWR05BM2pkZwpVTS9JMk8yZGdxNDNtTHlqajB4TXFUUXJiTy83bFpzbQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHVFMgUm9vdCBSMQo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlZ6Q0NBeitnQXdJQkFnSU5BZ1BsazI4eHNCTkppR3VpRnpBTkJna3Foa2lHOXcwQkFRd0ZBREJITVFzd0NRWURWUVFHRXdKVgpVekVpTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnClVqRXdIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUUKQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqRXdnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQzJFUUtMSHVPaGQ1czczTCtVUHJlVnAwQThvZjJDK1gweUJvSng5dmFNCmYvdm8yN3hxTHBlWG80eEwrU3Yyc2ZuT2hCMngrY1dYM3UrNThxUHB2QktKWHFlcVVxdjRJeWZMcExHY1k5dlhtWDd3Q2w3cmFLYjAKeGxwSERVMFFNK05Pc1JPanlCaHNTK3o4Q1pEZm5XUXBKU01Ib2JUU1BTNWc0TS9TQ1llN3pVandUY0xDZW9pS3U3clBXUm5XcjQrdwpCN0NlTWZHQ3djRGZMcVp0YkJrT3RkaCtKaHBGQXoyd2VhU1VLSzBQZnlibHFBaitsdWc4YUpSVDdvTTZpQ3NWbGdteTRIcU1MblhXCm5PdW5WbVNQbGs5b3JqMlh3b1NQd0x4QXdBdGN2ZmFIc3pWc3JCaFFmNFRnVE0yUzB5RHBNN3hTbWE4eXRTbXpKU3EwU1BseTRjcGsKOSthQ0VJM29uY0tLaVBvNFpvcjhZL2tCK1hqOWUxeDMrbmFIK3V6ZnNRNTVsVmUwdlNidjFnSFI2eFlLdTQ0THRjWEZpbFdyMDZ6cQprVXNwekJta01pVk9LdkZsUk5BQ3pxck9TYlRxbjN5RHNFQjc1ME9ycDJ5amozMkpnZnBNcGYvVmpzUE9TK0MxMkxPT1JjOTJ3TzFBCksvMVREN0NuMVRzTnNZcWlBOTR4cmN4MzZtOTdQdGJma1NJUzVyNzYyREw4RUdNVVVYTGVYZFlXazcwcGFEUHZPbWJzQjRvbTN4UFgKVjJWNEo5NWVTUlFBb2dCL21xZ2h0cW14bGJDbHVRMFdFZHJIYkVnOFFPQitEVnJOVmp6Umx3VzV5MHZ0T1V1Y3hEL1NWUk51SkxEVwpjZnIwd2JyTTdSdjEvb0ZCMkFDWVBUcklybnFZTnhnRmxRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU1SzhySm5FYUswZ25oUzlTWml6djhJa1RjVDR3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFKK3FRaWJiQzV1Ky94NldraTQrb21WS2FwaTZJc3Q5d1RyWWdnb0d4dmFsM3NCT2gyWjVvZm1tV0p5cStiWG1ZT2ZnNkxFZQpRa0V6Q3pjOXpvbHdGY3ExSktqUGE3WFNRQ0dZenlJMHp6dkZJb1RneFE2S2ZGMkk1RFVrenBzK0dsUWVidHV5aDZmODgvcUJWUlJpCkNsbXBJZ1V4UG9MVzd0dFhOTHd6bGRNWEcrZ25vb3Q3VGlZYWVscGt0dEdzTi9IOW9QTTQ3SEx3RVhXZHl6UlNqZVoyYXhmRzM0YXIKSjQ1SkszVm1nUkFocHVvKzlLNGwvM3dWM3M2TUpUL0tZbkFLOXk4SlpnZklQeHo4OE50Rk1OOWlpTUcxRDUzRG4wcmVXVmxIeFljaQpOdWFDcCswS3VlSUhvSTE3ZWtvOGNkTGlBNkVmTWdmZEcrUkN6Z3dBUldHQXRRc2dXU2w0dmZsVnkyUEZQRXowdHYvYmFsOHhhNW1lCkxNRnJVS1RYNWhnVXZZVS9aNnRHbjZEL1FxYzZmMXpMWGJCd0hTczA5ZFIyQ1F6cmVFeFpCZk16UXNOaEZSQWJkMDNPSW96VWhmSkYKZmJkVDZ1OUFXcFFLWENCZlRrQmRZaUoyMy8vT1liMk1JM2pTTndMZ2p0N1JFVGVKOXIvdFNRZGlycExzUUJxdkZBblowRTZ5b3ZlKwo3dTdZLzl3YUxkNjRObkhpL0htM2xDWFJTSE5ib1RYbnM1bG5kY0VaT2l0SFR0TkNqdjB4eUJabTJ0SU1QTnV6anNtaERZQVBleFozCkZMLy8yd21Vc3BPOElGZ1Y2ZHR4US9QZUVNTUEzS2dxbGJiQzFqK1FhM2JiYlA2TXZQSndOUXpjbVJrMTNOZklSbVBWTm5HdVYvdTMKZ20zYwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHVFMgUm9vdCBSMgo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlZ6Q0NBeitnQXdJQkFnSU5BZ1BscnNXTkJDVWFxeEVscWpBTkJna3Foa2lHOXcwQkFRd0ZBREJITVFzd0NRWURWUVFHRXdKVgpVekVpTUNBR0ExVUVDaE1aUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnClVqSXdIaGNOTVRZd05qSXlNREF3TURBd1doY05Nell3TmpJeU1EQXdNREF3V2pCSE1Rc3dDUVlEVlFRR0V3SlZVekVpTUNBR0ExVUUKQ2hNWlIyOXZaMnhsSUZSeWRYTjBJRk5sY25acFkyVnpJRXhNUXpFVU1CSUdBMVVFQXhNTFIxUlRJRkp2YjNRZ1VqSXdnZ0lpTUEwRwpDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRE8zdjJtKyt6c0ZEUThCd1phYkZuM0dUWGQ5OEdkVmFyVHpUdWtrM0x2CkN2cHRuZmJ3aFlCYm9VaFNuem5GdCs0b3JPL0xkbWdVdWQrdEFXeVpIOFFpSFovK2NuZmdMRnV2NUFTL1QzS2dHalNZNkRsbzdKVWwKZTNhaDVtbTVoUm05aVl6K3JlMDI2bk84LzRQaXkzM0IwczVLczQwRm5vdEprOS9CVzlCdVh2QXVNQzZDL1BxOHRCY0tTT1dJbThXYgphOTZ3eXJRRDhOcjBrTGhsWlBkY1RLM29mbVplbWRlNHdqN0kwQk9kcmU3a1JYdUpWZmVLSDJKU2hCS3p3a0NYNDRvZlI1R21kRnJTCitMRmpLQkM0c3dtNFZuZEFvaWFZZWNiKzN5WHVQdVdnZjlSaEQxRkxQRCtNMnVGd2ROakNhS0g1d1F6cG9lSi91MVU4ZGdidWFrN00Ka29nd1RacTlUd3RJbW9TMW1LUFYrM1BCVjJIZEtGWjFFNjZIanVjTVVRa1FkWWhNdkkzNWV6elVJa2dmS3R6cmE3dEVzY3N6Y1RKRwpyNjFLOFl6b2REcXM1eG9pYzREU01QY2xRc2NpT3pzU3JaWXV4c04yQjZvZ3R6VkpWK21TU2VoMkZuSXhaeXVXZm9xang1UldJcjlxClMzNEJJYklqTXQva21rUnRXVnRkOVFDZ0hKdkdlSmVOa1ArYnlLcTByeEZST1Y3WisyZXQxVnNSblRLYUc3M1Z1bHVseWNzbGFWTlYKSjF6Z3lqYkxpR0g3SHJmUXkrNFcrOU9tVE42U3BkVGkzL1VHVk40dW5VdTBrekNxZ2M3ZEd0eFJjdzFQY09ubHRoWWhHWG15NW9rTApkV1RLMWF1OENjRVlvZi9VVktHRlBQMFVKQU95aDlPa3R3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUCkFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVV1Ly9LamlPZlQ1bksyK0pvcHFVVkp4Y2UyUTR3RFFZSktvWklodmNOQVFFTUJRQUQKZ2dJQkFCL0t6dDNIdnFHZjJTZE1DOXdYbUJGcWlONDk1bkZXY3JLZUdrNmMxU3VZSkYyYmEzdXdNNElKdmQ4bFJ1cVluclliL29NOAowbUpod1FUdHp1REZ5Y2dURTFYbnFHT3RqSHNCL25jdzRjNW9td1g0RXU1NU1hQkJSVFVvQ25Ha0pFK00zRHlDQjE5bTNIMFEvZ3hoCnN3V1Y3dUd1Z1ErbytNZVBUYWdqQWlackhZTlNWYzYxTHdES2dFRGc0WFNzWVBXSGdKMnVObVNSWGJCb0dPcUtZY2wzcUpmRXljZWwKL0ZWTDgvQi91V1U5SjJqUXpHdjZVNTNoa1JySlhScVdiVEtIN1FNZ3lBTE9XcjdaNnYyeVRjUXZHOTlmZXZYNGk4YnVNVG9sVVZWbgpqV1F5ZSttZXc0SzZLaTNwSHJUZ1NBYWkvR2V2SHlJQ2Mvc2dDcStkVkV1aHpmOWdSN0EvWGU4YlZyMlhJWll0Q3RGZW5UZ0NSMnk1CjlQWWpKYmlnYXBvcmR3ajZ4TEVva0NaWUNEemlmcXJYUFcrNk1ZZ0tCZXNudGFGSjdxQkZWSHZtSjJXWklDR29vN3o3R0phN1VtOE0KN1lOUlRPbFo0aUJneGNKbGtvS004eEFmRG9xWHZuZUNiVCtQSFYyOFNTZTl6RThQNGM1MmhnUWp4Y0NNRWx2OTI0U2dKUEZJLzJSOAowTDVjRnRIdm1hM0FIL3ZMcnJ3NElnWW1aTnJhbHc0L0tCVkVxRThBeXZDYXpNOTBhclErUE91VjdMWFRXdGlCbWVsREdEZnJzN3ZSCldHSkI4MmJTajZwNGxWUWd3MW91ZEN2VjBiNFlhY0NzMWFUUE9icFJoQU5sNldMQVl2N1lUVldXNHRBUitrZzBFZXllN1FVZDVNalcKSFliTAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHVFMgUm9vdCBSMwo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0NUQ0NBWTZnQXdJQkFnSU5BZ1BsdUlMcklQZ2xKMjA5WmpBS0JnZ3Foa2pPUFFRREF6QkhNUXN3Q1FZRFZRUUdFd0pWVXpFaQpNQ0FHQTFVRUNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdVak13CkhoY05NVFl3TmpJeU1EQXdNREF3V2hjTk16WXdOakl5TURBd01EQXdXakJITVFzd0NRWURWUVFHRXdKVlV6RWlNQ0FHQTFVRUNoTVoKUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpNd2RqQVFCZ2NxaGtqTwpQUUlCQmdVcmdRUUFJZ05pQUFRZlR6T0hNeW1Lb1lUZXk4Y2hXRUdKNmxhZEswdUZ4aDFNSjd4L0psRnliK0tmMXFQS3pFVVVSb3V0CjczNkdqT3l4ZmkvL3FYR2RHSVJGQkVGVmJpdnFKbis3a0FIalN4bTY1RlNXUlFteDFXeVJSSzJFRTQ2YWpBMkFEREwyNENlalFqQkEKTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlRCOFNhNm9DMnVoWUhQMC9FcQpFcjI0Q21mOXZEQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUE5dUVnbFJSN1ZLT1FGaEcvaE1qcWIyc1huaDVHbUNDYm45TU4yYXpUCkw4MTgrRnN1VmJ1LzNaTDNwQXpjTWVHaUFqRUEvSmRtWnVWREZoT0QzY2ZmTDc0VU9PMEJ6ckVYR2hGMTZiMERqeVoraE9YSllLYVYKMTFSWnQrY1JMSW5VdWU0WAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpHVFMgUm9vdCBSNAo9PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0NUQ0NBWTZnQXdJQkFnSU5BZ1Bsd0dqdll4cWNjcEJRVWpBS0JnZ3Foa2pPUFFRREF6QkhNUXN3Q1FZRFZRUUdFd0pWVXpFaQpNQ0FHQTFVRUNoTVpSMjl2WjJ4bElGUnlkWE4wSUZObGNuWnBZMlZ6SUV4TVF6RVVNQklHQTFVRUF4TUxSMVJUSUZKdmIzUWdValF3CkhoY05NVFl3TmpJeU1EQXdNREF3V2hjTk16WXdOakl5TURBd01EQXdXakJITVFzd0NRWURWUVFHRXdKVlV6RWlNQ0FHQTFVRUNoTVoKUjI5dloyeGxJRlJ5ZFhOMElGTmxjblpwWTJWeklFeE1RekVVTUJJR0ExVUVBeE1MUjFSVElGSnZiM1FnVWpRd2RqQVFCZ2NxaGtqTwpQUUlCQmdVcmdRUUFJZ05pQUFUemRIT25hSXRncmtPNE5jV0JNSHRMU1ozN3dXSE81dDVHdld2VllSZzFya0RkYy9lSmtUQmE2enp1CmhYeWlRSFk3cWNhNFI5Z3E1NUtSYW5QcHNYSTVueW1mb3BqVFgxNVlobVVQb1lSbEJ0SGNpOG5IYzhpTWFpL2x4S3ZSSFlxalFqQkEKTUE0R0ExVWREd0VCL3dRRUF3SUJoakFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjBHQTFVZERnUVdCQlNBVE5icmRQOUpOcVBWMlB5MQpQc1ZxOEpRZGpEQUtCZ2dxaGtqT1BRUURBd05wQURCbUFqRUE2RUQvZzk0RDlKK3VIWHFuTHJtdlQvYURIUTR0aFFFZDBkbHE3QS9DCnI4ZGVWbDVjMVJ4WUlpZ0w5ekMyTDdGOEFqRUE4R0U4cC9TZ2d1TWgxWVFkYzRhY0xhL0tOSnZ4bjdrak51SzhZQU9kZ0xPYVZzamgKNHJzVWVjck5JZFNVdFVsRAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUZWxpYSBSb290IENBIHYyCj09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZkRENDQTF5Z0F3SUJBZ0lQQVdkZko5YitldVBrckw0Sld3V2VNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1FUXhDekFKQmdOVkJBWVQKQWtaSk1Sb3dHQVlEVlFRS0RCRlVaV3hwWVNCR2FXNXNZVzVrSUU5NWFqRVpNQmNHQTFVRUF3d1FWR1ZzYVdFZ1VtOXZkQ0JEUVNCMgpNakFlRncweE9ERXhNamt4TVRVMU5UUmFGdzAwTXpFeE1qa3hNVFUxTlRSYU1FUXhDekFKQmdOVkJBWVRBa1pKTVJvd0dBWURWUVFLCkRCRlVaV3hwWVNCR2FXNXNZVzVrSUU5NWFqRVpNQmNHQTFVRUF3d1FWR1ZzYVdFZ1VtOXZkQ0JEUVNCMk1qQ0NBaUl3RFFZSktvWkkKaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFMTFFQd2U4NG52UWE1bjQ0bmRwNTg2ZHBBTzhnbTJoL29GbEgwd25ySTRBdWhaNwo2ekJxQU1DemRHaCtzcS9IMVdLemVqOVF5b3cyUkNSajBqYnBESVgyUTNiVlRLRmdjbWZpS0RPbHl6RzRPaUlqTkxoOXZWWWlRSjNxCjlIc0RyV2o4c29GUG1OQjA2bzNsZmMxanc2UDIzcExDV0JuZ2xydkZ4S2s5cFhTVy9xLzVpYXE5bFJkVTJIaEU4UXgzRlpMZ21FS24KcE5hcUlKTE53YUN6bHJJNmhFS05mZFdWNU5iYjZXTEVXTE41eFl6VE5UT0RuM1doVWlkaE9QRlpQWTVRNEwxNVBPZHNsdjVlMlFKbAp0STVjMEJFMDMxMi9VcWVCQU1OL21VV1pGZFVYeUFwVDdHUHptWDNNYVJLR3doZndBWjYvaEx6UlVzc2JrbWJPcEZQbG9iL0Uyd25XCjVvbFdLOGpqZk43ai80bmxOVzRvNkd3TEkxR3BKUVhyU1BqZHNjcjZiQWhSNzdjWWJFVEtKdUZ6eG9rR2dlV0tyTERpS2NhNUpMTnIKUkJIMHBVUENURVBsY0RhTXRqTlhlcFV1Z3FEMFhCQ3pZWVAyQWdXR0xud3RiTndEUm00MWs5VjZsUy9lSU5oYmZwU1FCR3E2V1QwRQpCWFdkTjZJT0xqM3J3YVJTZy83UWE5Um1qdHpHNlJKT0hTcFhxaEM4ZkY2Q2ZhYW15Zkl0dWZVWEo2M1JEb2xVSzVYNndLMGRtQlI0Ck0wS0dDcWx6dGZ0MERiY2JNQm5FV2c0Y0o3ZmFHTkQvaXNnRnV2R3FIS0kzdCtaSXBFWXNsT3FvZG1KSGl4QlRCMGhYYk9LU1RiYXUKQmN2Y3dVcGVqNnc5R1U3QzdXQjFLOXZCeWtMVkFnTUJBQUdqWXpCaE1COEdBMVVkSXdRWU1CYUFGSEtzNURONXFrV0g5djJzSFo3Vwp4eStHMkNRNU1CMEdBMVVkRGdRV0JCUnlyT1F6ZWFwRmgvYjlyQjJlMXNjdmh0Z2tPVEFPQmdOVkhROEJBZjhFQkFNQ0FRWXdEd1lEClZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBZ0VBb0R0WnB3bVVQamFFMG40dk9hV1dsL29ScmZ4bjgzRUoKOHJLSmhHZEVyN252N1pic25HVGJNakJ2WjVxc2ZsK3lxd0UyZm9INjVJUmUwcXcyNEd0aXhYMUxEb0p0MG5aaTBmNlgrSjh3ZkJqNQp0RkozZ2gxMjI5TWRxZkRCbWdDOWJYWFlmZWY2eHppam5IRG9SbmtEcnk1MDIzWDRibE1NQThpWkdvazFHVHpUeVZSOHFQQXM1bTRICmVXOXE0ZWJxa1lKcENoM0RmbG1pbm10R0ZaaGIwNjlHSFdMSXpvQlNTUkUveVFRU3d4TjhQenVLbHRzOG9CNEt0SXRVc2lSbkRlK0MKeTc0OGZkSGlmNjRXMWxaWXVkb2dzWU1Wb2UrS1RUSnZRUzhUVW9LVTF4ckJlS0pSM1N0d2JiY2ErZmV3NEdlWFZ0dDhZVk1KQXlnQwpRTWV6MlAyY2NHckdLTU9GNmVMdEdwT2cza3VZb29RK0JYY0JsajM3dENBUG5ISUNlaEl2MWFPNlVYaXZLaXRFWlU2MS9Rcm93YzE1CmgyRXIzb0JYUmI5bjhadVJYcVdrN0ZsSUVBMDR4N0Q2dzBSdEJQVjRVQnlTbGx2YTliZ3V1bHZQNWZCcW5Vc3ZXSE10VHkzRUhENzAKc3orckZRNDdHVUdLcE1GWEVtWnhUUHBUNDFmcllwVUpubFRkMGNJOFZ6eTlPSzJZWkxlNEE1cFRWbUJkczloQ0cxeExFb29jNit0OQp4bnBweHlkL3BQaUw4dVNVWm9kTDZaUUhDUko1aXJMcmRBVGN6dlJFV2VBV3lzVXNXTmM4ZTg5aWhtcFFmVFUyWnFmN04rY294OWpRCnJhVnBsSS9vd2Q4aytCc0hNWWVCMkYzMjZDallTbEtBckJQdVVCUWVtTWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgQlIgUm9vdCBDQSAxIDIwMjAKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQzJ6Q0NBbUNnQXdJQkFnSVFmTW1QSzRUWDMrb1B5V1dhMDB0TmxqQUtCZ2dxaGtqT1BRUURBekJJTVFzd0NRWURWUVFHRXdKRQpSVEVWTUJNR0ExVUVDaE1NUkMxVWNuVnpkQ0JIYldKSU1TSXdJQVlEVlFRREV4bEVMVlJTVlZOVUlFSlNJRkp2YjNRZ1EwRWdNU0F5Ck1ESXdNQjRYRFRJd01ESXhNVEE1TkRVd01Gb1hEVE0xTURJeE1UQTVORFExT1Zvd1NERUxNQWtHQTFVRUJoTUNSRVV4RlRBVEJnTlYKQkFvVERFUXRWSEoxYzNRZ1IyMWlTREVpTUNBR0ExVUVBeE1aUkMxVVVsVlRWQ0JDVWlCU2IyOTBJRU5CSURFZ01qQXlNREIyTUJBRwpCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTWJMeHlqUis0VDFtdTlDRkNEaFEydHVkYTM4S3dPRTFIYVRKZGRaTzBGbGF4N21OQ3E3CmRQWVN6dWh0NTZ2a1BFNC9SQWlMelJaeHk3K1NtZlNrMXp4UVZGS1FoWU40bEdkbm94d0pHVDExTklYZTdXQjl4d3kwUVZLNWJ1WHUKUXFPQ0FRMHdnZ0VKTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3SFFZRFZSME9CQllFRkhPUkVLdi9WYk5hZkFrbDFiSzZDS0JycXg5dApNQTRHQTFVZER3RUIvd1FFQXdJQkJqQ0J4Z1lEVlIwZkJJRytNSUc3TUQ2Z1BLQTZoamhvZEhSd09pOHZZM0pzTG1RdGRISjFjM1F1CmJtVjBMMk55YkM5a0xYUnlkWE4wWDJKeVgzSnZiM1JmWTJGZk1WOHlNREl3TG1OeWJEQjVvSGVnZFlaemJHUmhjRG92TDJScGNtVmoKZEc5eWVTNWtMWFJ5ZFhOMExtNWxkQzlEVGoxRUxWUlNWVk5VSlRJd1FsSWxNakJTYjI5MEpUSXdRMEVsTWpBeEpUSXdNakF5TUN4UApQVVF0VkhKMWMzUWxNakJIYldKSUxFTTlSRVUvWTJWeWRHbG1hV05oZEdWeVpYWnZZMkYwYVc5dWJHbHpkREFLQmdncWhrak9QUVFECkF3TnBBREJtQWpFQWxKQXRFL3JoWS9oaFkraXRoWGhVa1p5NGt6ZytHa0hhUUJaVFFnaktMNDd4UG9GV3dLclk3UmpFc0s3MFB2b20KQWpFQTh5aml4dHNybWZ1M1ViZ2tvNlNVZWhvLzVqYmlBMWN6aWpETGdzZldGQkhWZFdOYkZKV2NId0hQMk5WeXB3ODcKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKRC1UUlVTVCBFViBSb290IENBIDEgMjAyMAo9PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDMnpDQ0FtQ2dBd0lCQWdJUVh3SkIxM3FIZkV3RG82eVdqZnYvMERBS0JnZ3Foa2pPUFFRREF6QklNUXN3Q1FZRFZRUUdFd0pFClJURVZNQk1HQTFVRUNoTU1SQzFVY25WemRDQkhiV0pJTVNJd0lBWURWUVFERXhsRUxWUlNWVk5VSUVWV0lGSnZiM1FnUTBFZ01TQXkKTURJd01CNFhEVEl3TURJeE1URXdNREF3TUZvWERUTTFNREl4TVRBNU5UazFPVm93U0RFTE1Ba0dBMVVFQmhNQ1JFVXhGVEFUQmdOVgpCQW9UREVRdFZISjFjM1FnUjIxaVNERWlNQ0FHQTFVRUF4TVpSQzFVVWxWVFZDQkZWaUJTYjI5MElFTkJJREVnTWpBeU1EQjJNQkFHCkJ5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJQRUwzWVpESUJuZmw0WG9Ja3FiejUyWXY3UUZKc25MNDZiU2o4V2VlSHN4aWFtSnJTYzgKWlJDQy9OL0RuVTd3TXlQRTBqTDFITERmTXhkZHhmQ3hpdm52dWJjVXlpbEt3ZytwZjNWbFNTb3daL1JrOTlZYWQ5ckR3cGRoUW50SgpyYU9DQVEwd2dnRUpNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdIUVlEVlIwT0JCWUVGSDhRQVJZM09xUW81RkQ0cFBmc2F6SzIvdW1MCk1BNEdBMVVkRHdFQi93UUVBd0lCQmpDQnhnWURWUjBmQklHK01JRzdNRDZnUEtBNmhqaG9kSFJ3T2k4dlkzSnNMbVF0ZEhKMWMzUXUKYm1WMEwyTnliQzlrTFhSeWRYTjBYMlYyWDNKdmIzUmZZMkZmTVY4eU1ESXdMbU55YkRCNW9IZWdkWVp6YkdSaGNEb3ZMMlJwY21WagpkRzl5ZVM1a0xYUnlkWE4wTG01bGRDOURUajFFTFZSU1ZWTlVKVEl3UlZZbE1qQlNiMjkwSlRJd1EwRWxNakF4SlRJd01qQXlNQ3hQClBVUXRWSEoxYzNRbE1qQkhiV0pJTEVNOVJFVS9ZMlZ5ZEdsbWFXTmhkR1Z5WlhadlkyRjBhVzl1YkdsemREQUtCZ2dxaGtqT1BRUUQKQXdOcEFEQm1BakVBeWp6R0tuWENYblZpT1RZQVlGcUx3Wk9aek5uYlFUczdoNWtYTzlYTVQ4b2k5NkNBeS9tMHNSdFc5WExTL0JuUgpBakVBa2Zjd2t6OFFSaXR4cE5BN1JKdkFLUUlGc2tGM1VmTjVXcDZPRktCT1F0SmJnZk0wYWdQbklqaFFXKzBaVDBNVwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBUTFMgRUNDIFAzODQgUm9vdCBHNQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0dUQ0NBWitnQXdJQkFnSVFDZUNUWmF6MzJjaTVQaHdMQkNvdTh6QUtCZ2dxaGtqT1BRUURBekJPTVFzd0NRWURWUVFHRXdKVgpVekVYTUJVR0ExVUVDaE1PUkdsbmFVTmxjblFzSUVsdVl5NHhKakFrQmdOVkJBTVRIVVJwWjJsRFpYSjBJRlJNVXlCRlEwTWdVRE00Ck5DQlNiMjkwSUVjMU1CNFhEVEl4TURFeE5UQXdNREF3TUZvWERUUTJNREV4TkRJek5UazFPVm93VGpFTE1Ba0dBMVVFQmhNQ1ZWTXgKRnpBVkJnTlZCQW9URGtScFoybERaWEowTENCSmJtTXVNU1l3SkFZRFZRUURFeDFFYVdkcFEyVnlkQ0JVVEZNZ1JVTkRJRkF6T0RRZwpVbTl2ZENCSE5UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQk1GRW9jOFJsMUNhM2lPQ05RZk4wTXNZbmRMeGYzYzFUenZkCmxISlM3Y0k3K096NmUydFlJT3lacnNuOGFMTjF1ZHNKN01nVDlVN0dDaDFtTUV5N0gwY0tQR0VRUWlsOHBRZ080Q0xwMHpWb3pwdGoKbjRTMW1VMVlvSTcxVk9lVnlhTkNNRUF3SFFZRFZSME9CQllFRk1GUlJWQlpxejduTEZyNklDSVNCNENJZkJGcU1BNEdBMVVkRHdFQgovd1FFQXdJQmhqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01Bb0dDQ3FHU000OUJBTURBMmdBTUdVQ01RQ0phbzFINSt6OGJsVUQyV2RzCkprNkR4djNKK3lzVHZMZDZqTFJsMG1scFl4TmpPeVpRTGdHaGVRYVJuVWkvd3I0Q01FZkRGWHV4b0pHWlNaT29QSHpvUmdhTExQSXgKQUpTZFlzaUp2Um1FRk9tbCt3RzREWFpEakM1VHkzemZEQmVXVUE9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpEaWdpQ2VydCBUTFMgUlNBNDA5NiBSb290IEc1Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZaakNDQTA2Z0F3SUJBZ0lRQ1BtMGVLajZmdHBxTXplSjNuelBpakFOQmdrcWhraUc5dzBCQVF3RkFEQk5NUXN3Q1FZRFZRUUcKRXdKVlV6RVhNQlVHQTFVRUNoTU9SR2xuYVVObGNuUXNJRWx1WXk0eEpUQWpCZ05WQkFNVEhFUnBaMmxEWlhKMElGUk1VeUJTVTBFMApNRGsySUZKdmIzUWdSelV3SGhjTk1qRXdNVEUxTURBd01EQXdXaGNOTkRZd01URTBNak0xT1RVNVdqQk5NUXN3Q1FZRFZRUUdFd0pWClV6RVhNQlVHQTFVRUNoTU9SR2xuYVVObGNuUXNJRWx1WXk0eEpUQWpCZ05WQkFNVEhFUnBaMmxEWlhKMElGUk1VeUJTVTBFME1EazIKSUZKdmIzUWdSelV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRQ3owUFRKZVJHZC9meG1nZWZNMWVTOAo3SUUrYWpXT0xyZm4zcS81QjAzUE1KM3FDUXVadld4WDJoaEt1SGlzT2ptb3BraXNMbkxsdmV2eEdzM25wQU9wUHhHMDJDK0pGdnVVCkFUMjdML2dUQmFGNEhJNG80RVhnZy9SWkc1V3pybjREUmVXK3drTCs3dkk4dG9VVG1ES2RGcWdwd2dzY09OeWZNWGRjdnllai9DZXMKdHl1OWRKc1hMZktCMmwydzRTTVhQb2hLRWlQUTZzK2QzZ01Yc1VKS29CWk1wRzJUNlQ4NjdqcDhuVmlkOUU2UC9Ec2p5RzI0NGdYYQp6T3Zzd3pIMDE2Y3BWSURQUkZ0TWJ6Q2U4OHpkSDVSRG5VMS9jSEFOMURyUk4vQnNuWnZBRkpOWTc4MUJPSFc4RXdPVmZIL2pYT25WCkRkWGlmQkJpcW12d1BYYnpQNlBvc01IOTc2cFhUYXlHcHhpMEtjRXNEcjlrdmltTTJBSXR6Vnd2OG4vdkZmUU1GYXdLc1BIVERVOXEKVFhlWEFhRHhacmUzenUvTzdPeWxkY3FzNCtGajk3aWhCTWk4ZXo5ZExSWWlWdTFJU2Y2bkwza3dKWnU2YXkwL25UdkVGK2NkTHZ2eQp6NmI4NHhRc2xwZ2hqTFNSNlJsZ2cvSXdLd1p6VU5XWU93YnB4NG9NWUl3bytGS2JidUgyVGJzR0pKdlhLeVkvL1NvdmNmWFdKTDUvCk1aNFBiZWlQVDAyalAvODE2dDlKWGtHUGh2bnhkM2xMRzdTalhpLzdSZ0xRWmhOZVhvVlB6dGh3aUh2T0FiV1dsOWZOZmYyQytNSWsKd2NvQk9VK05vc0VVUUIrY1p0VU1DVWJXOHREUlNIWldPa1BMdGdvUk9icU1FMndHdFo3UDZ3SURBUUFCbzBJd1FEQWRCZ05WSFE0RQpGZ1FVVVRNYzdUWkFyeGZUSmMxcGFQS3ZUaU0rczBFd0RnWURWUjBQQVFIL0JBUURBZ0dHTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3CkRRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFHQ21yMXRmVjlxSjIwdFFxY1FqTlNILzBHRXdoSkczUHhEUEpZN0p2MFkwMmNFaEpoeHcKR1hJZW84bUgvcWxEWkpZNnlGTUVDclpCdThSSEFObWZHQmc3c2c3ek5Pb2s5OTJ2SUdDdWtpaGZOdWRkNU43SFBOdFFPYTI3UFNoTgpsbngyeGx2MHdkc1VwYXNaWWdjWVFGK1hrZHljeDZ1MVVRM21hVk5WekRsOTJzVVJWWExGTzR1SitEUXRwQmZsRithWmZUQ0lJVGZOCk1CYzl1UEs4cUhXZ1E5dytpVXVRcm0wRDRCeWpvSllKdTMyanR5b1FSRXRHQnpSajdURzVCTzZqbTVxdTVqRjQ5T29rWVR1cldHVC8KdTRjbllpV0IzOXloTC9idHAvOTZqMUV1TVBpa0FkS0ZPVjhCbVpadldsdHdHVWIraG1BK3JZQVFDZDA1SlM5WWY3dlNkUEQzUmg5RwpPVXJZVTlEekxqdHhwZFJ2L1BObjVBZVAzU1laNFkxYitxT1RFWnZweURyRFZXaWFrdUZTZGpqbzRicTkrMC9WNzdQblNJTXg4SUloCjQ3YStwNnR2NzUvZlRNOEJ1R0pxSXozbkNVMkFHM3N3cE1QZEIzODB2cVFtc3ZaQjZBa2Q0eUNZcWpkUC8vZng0aWx3TVVjL2ROQVUKRnZvaGlnTFZpZ21VZHk3eVdTaUxmRkNTQ21aNE9JTjF4TFZhcUJIRzVjR2RabFhQVThTdjEzV0ZxVUlUVnV3aGQ0R1RXZ3pxbHRsSgp5cUVJOHBjN2Jac0VHQ1JFam53Qjh0d2wyRjZHbXJFNTIvV1JNbXJScG5DS292ZmVwRVdGSnFnZWpGMHBXOGhMMkpwcUExNXc4b1ZQCmJFdG9MOHBVOW96YU12N0RhNE0vT01aKwotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0YWlubHkgUm9vdCBSMQo9PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRlJ6Q0NBeStnQXdJQkFnSVJBSTRQK1V1UWNXaGxNMVQwMUVRNXQrQXdEUVlKS29aSWh2Y05BUUVMQlFBd1BURUxNQWtHQTFVRQpCaE1DVlZNeEVqQVFCZ05WQkFvVENVTmxjblJoYVc1c2VURWFNQmdHQTFVRUF4TVJRMlZ5ZEdGcGJteDVJRkp2YjNRZ1VqRXdIaGNOCk1qRXdOREF4TURBd01EQXdXaGNOTkRZd05EQXhNREF3TURBd1dqQTlNUXN3Q1FZRFZRUUdFd0pWVXpFU01CQUdBMVVFQ2hNSlEyVnkKZEdGcGJteDVNUm93R0FZRFZRUURFeEZEWlhKMFlXbHViSGtnVW05dmRDQlNNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUApBRENDQWdvQ2dnSUJBTkEyMUIvcTNhdmswYmJtK3lMQTNSTU5hbnNpRXh5WFBHaGpaaktjQTdXTnBJR0Qybmd3RWMvY3NpdStrcitPCjVNUVR2cVJvVE5vQ2FCWjB2ckxkQk9Sckt0MDNIMkFzMi9YM29YeVZ0d3h3aGk3eE91OVM5OHpUbS9tTHZnN2ZNYmVkYUZ5U3B2WGwKOHdvMHRmOTdvdVNIb2NhdkZ3RHZBNUh0cVJ4T2NUM1NpMnlKOUhpRzVtcEpvTTYxMHJDcm0vYjAxQzdqY3ZrMnh1c1Z0eVdNT3Z3bApEYk1pY3lGMHlFcVdZWkwxTHdzWXBmU3Q0dTVCdlFGNStwYU1qUmNDTUxUNXIzZ2FqTFEyRUJBSEJYRFE5REdRaWxIRmhpWjVzaEdJClhzWHdDbFROU2FhL0FwelNSS2Z0NDNqdlJsNXRjZEY1Y0J4R1gxSHB5VGZjWDM1cGUwSGZORVhnTzRUMG9Zb0tOcDQzekdKUzRZa04KS1BsNkk3RU5QVDJhL1oyQjd5eVF3SHRFVHJ0SjRBNUtWcEs4eTdYZGVSZUprZDVoaVhTU3FPTXloYjVPaGFSTFdjc3J4WGlPY1ZUUQpBamVaak9WSjZ1QlVjcVFSQmk4TGpNRmJ2cldoc0ZOdW5MaGdrUjlaYS9rdDlKUUtsN1hzeFhZRFZCdGxVcnBNa2xaUk5hQkEyQ25iCnJsSjJPeTB3UUp1SzBFSld0TGVJQWFTSE8xT1d6YU1Xai9ObXFoZXh4MkRnd1VNRkRPNmJXMkJ2Qmx5SFd5ZjVRQkdlbkRQQnQrVTEKVndWL0o4NFhJSXdjL1BINzJqRXBTZTMxQzRTblQ4SDJUc0lvblBydTRLOEgrek1SZWlGUEN5RVF0a0E2cXlJNkJKeUxtNFNHY3ByUwpwNlhFdEhXUnFTc2pBZ01CQUFHalFqQkFNQTRHQTFVZER3RUIvd1FFQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkCkRnUVdCQlRncWo4bGpaOUVYTUU2NkM2dWQweUVQbWNNOURBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQXVWZXZ1QkxhVjRPUGFBc3oKSFFOVFZmU1ZjT1FyUGJBNTYvcUpZdjMzMWhnRUx5RTAzZkZvOE5XV1d0N0NnS1BCamNacTkxbDNyaFZrejF0NUJYZG02b3pUYXczZAo4Vmtzd1RPbE1JQVZSUWRGR2pFaXRwSUFxNWxOT285M3I2a2l5aTlqeWhYV3g4YndQV3o4SEEyWUVHR2VFYUlpMXdyeWtYcHJPUTR2Ck1NTTJTWi9nNlE4Q1JGQTNsRlY5NnAvMk83cVVwVXpwdkQ1UnRPaktralpVYlZ3bEtOcmRyUlQ5MCs3aUlnWHIwUEszYUJMWFdvcEIKR3NhU3BWbzdZMFZQditFNmR5SXZYTDlHK1ZvRGhSTkNYOHJlVTlkaXRhWTFCTUpILzVuOWhOOWN6dWxlZ0NoQjhuM25IcERZVDNZKwpnandOL0tVRCtuc2EyVVVlWU5yRWp2bjhLOGw3bGNVcS82cUozNEl4RDNML0RDZlhDaDVXQUZBZURKREJsclhZRklXN3B3MFd3ZmdICkpCdTZoYUVhQlFtQXVwVmp5VHJzSlo5L25icWtSeFdiUkhEeGFrdldPRjVEOHhoK1VHN3BXaWptWmVaM0d6cjlIYjRESnFQYjFPRzcKZnBZbkt4M3VwUHZhSlZRVEE5NDV4c01mVFpEc2p4dEswaHp0aFpVNFVIbEcxc0dRVURHcFhKcHVIZlV6Vm91bm1kTHl5Q3d6azVJdwp4MDZNWlRNUVpCZjlKQmVXMFkzQ09tb3I2eE9MUlBJaDgwb2F0M2RmMSsySXBITGxPUitWbmI1bndYQVJQYnYwK0VtMzR5YVhPcC9TClgzejd3Smw4T1NuZ2V4Mi9EYWVQMGlrMGJpUVZ5OTZRWHI4YXhHYnF3dWE2T1YrS21hbEJXUWV3TEs4PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpDZXJ0YWlubHkgUm9vdCBFMQo9PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQjl6Q0NBWDJnQXdJQkFnSVFCaVV6c1VjRE15ZGMrWTJhdWIvTStEQUtCZ2dxaGtqT1BRUURBekE5TVFzd0NRWURWUVFHRXdKVgpVekVTTUJBR0ExVUVDaE1KUTJWeWRHRnBibXg1TVJvd0dBWURWUVFERXhGRFpYSjBZV2x1YkhrZ1VtOXZkQ0JGTVRBZUZ3MHlNVEEwCk1ERXdNREF3TURCYUZ3MDBOakEwTURFd01EQXdNREJhTUQweEN6QUpCZ05WQkFZVEFsVlRNUkl3RUFZRFZRUUtFd2xEWlhKMFlXbHUKYkhreEdqQVlCZ05WQkFNVEVVTmxjblJoYVc1c2VTQlNiMjkwSUVVeE1IWXdFQVlIS29aSXpqMENBUVlGSzRFRUFDSURZZ0FFM20vNApmeHpmN2ZsSGg0YXhwTUNLK0lLWGdPcVB5RXBlS24ySWFLY0JZaFNSSkhwY25xTVhmWXFHSVRRWVVCc1EzdEEzU3liSEdXQ0E2VFM5CllCazJRTllwaHdrOGtYcjJ2Qk1qM1ZsT0JGN1B5QUljR0ZQQk1kamFJT2xFamVSMm8wSXdRREFPQmdOVkhROEJBZjhFQkFNQ0FRWXcKRHdZRFZSMFRBUUgvQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVOHlnWXkyUjE3aWtxNisydUkxZzRoZXZJSWdjd0NnWUlLb1pJemowRQpBd01EYUFBd1pRSXhBTEdPV2lERHNobGlUZDZ3VDk5dTBuQ0s4WjkrYW96bXV0NkRhY3BwczZrRnRaYVNGNGZDMHVyUWU4N1lRVnQ4CnJnSXdSdDdxeTEyYTdETENaUmF3VERCY01QUGFUbk9HQnRqT2lRUklOemY0M1ROUm5YQ3ZlMVhZQVM1OUJXUU9ocmlSCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyaXR5IENvbW11bmljYXRpb24gRUNDIFJvb3RDQTEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ09EQ0NBYjZnQXdJQkFnSUpBTlpkbTdONGdTN3JNQW9HQ0NxR1NNNDlCQU1ETUdFeEN6QUpCZ05WQkFZVEFrcFFNU1V3SXdZRApWUVFLRXh4VFJVTlBUU0JVY25WemRDQlRlWE4wWlcxeklFTlBMaXhNVkVRdU1Tc3dLUVlEVlFRREV5SlRaV04xY21sMGVTQkRiMjF0CmRXNXBZMkYwYVc5dUlFVkRReUJTYjI5MFEwRXhNQjRYRFRFMk1EWXhOakExTVRVeU9Gb1hEVE00TURFeE9EQTFNVFV5T0Zvd1lURUwKTUFrR0ExVUVCaE1DU2xBeEpUQWpCZ05WQkFvVEhGTkZRMDlOSUZSeWRYTjBJRk41YzNSbGJYTWdRMDh1TEV4VVJDNHhLekFwQmdOVgpCQU1USWxObFkzVnlhWFI1SUVOdmJXMTFibWxqWVhScGIyNGdSVU5ESUZKdmIzUkRRVEV3ZGpBUUJnY3Foa2pPUFFJQkJnVXJnUVFBCklnTmlBQVNrcFc5Z0F3UER2VEgwMHhlY0s0UjFyT1g5UFZkdTEyTy81Z1NKa282Qm5PUHBSMjdLa0JMSUUrQ25uZmRsZEI5c0VMTG8KNU9udmJZVXltVVN4WHYzTWRoRFlXNzJpeHZuV1F1UlhkdHlRd2pXcFM0ZzhFa2R0WFA5SlR4cEtVTEdqUWpCQU1CMEdBMVVkRGdRVwpCQlNHSE9mK0xhVktpd2orS0JINnZxTm0rR0JaTHpBT0JnTlZIUThCQWY4RUJBTUNBUVl3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFLCkJnZ3Foa2pPUFFRREF3Tm9BREJsQWpBVlhVSTkvTGJ1OXp1eE51aWU5c1JHS0VrejBGaERLbU1wekUyeHRIcWl1UTA0cFYxSUt2M0wKc25OZG80Z0l4d3dDTVFEQXF5ME9iZTBZb3R0VDZTWGJWUWpnVU16ZlJHRVdncXRKc0xLQjdIT0hlTFJNc21JYkV2b1dUU1ZMWTcwZQpOOWs9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkJKQ0EgR2xvYmFsIFJvb3QgQ0ExCj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGZERDQ0ExeWdBd0lCQWdJUVZXOWw0N1Raa0dvYkNkRnNQc0JzSURBTkJna3Foa2lHOXcwQkFRc0ZBREJVTVFzd0NRWURWUVFHCkV3SkRUakVtTUNRR0ExVUVDZ3dkUWtWSlNrbE9SeUJEUlZKVVNVWkpRMEZVUlNCQlZWUklUMUpKVkZreEhUQWJCZ05WQkFNTUZFSksKUTBFZ1IyeHZZbUZzSUZKdmIzUWdRMEV4TUI0WERURTVNVEl4T1RBek1UWXhOMW9YRFRRME1USXhNakF6TVRZeE4xb3dWREVMTUFrRwpBMVVFQmhNQ1EwNHhKakFrQmdOVkJBb01IVUpGU1VwSlRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaTVIwd0d3WURWUVFECkRCUkNTa05CSUVkc2IySmhiQ0JTYjI5MElFTkJNVENDQWlJd0RRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFQRm0KQ0wzWnhSVmh5NFFFUWFWcE4zY2R3YkI3K3NOM1NKQVRjbVRSdUh5UU5aMFllWWpqbHdFOFI0SHlEcUtZRFo0L04rQVpzcER5Umh5UwpzVHBoenZxM1JwNERodGN6YnUzM1JZeDJOOTV1bHBIMzEzNHJoeGZWaXpYdWhKRnlWOXhndzhPNTU4ZG5KQ05QWXdwajltWjlTMVduClAzaGtTV2tTbCtCTURkTUpvREl3T3ZxZndQS2N4UklxTGh5MUJEUGFwRGdSYXQ3R0dQWkhPaUpCaHlMOHhJa29WTmlNcFRBSytCY1cKeXF3My9YbW5rUmQ0T0ptdFdPMnkzc3lKZlFPY3M0bGw1K003c1NLR2p3WnRlQWY5a1JKL3NHc2NpUTM1dU10MFd3ZkN5UFExMFdSagpldWx1bWlqV01MM21HOTBWcjRUcW5NZks5UTdxOGwwcGg0OXBjem0rTGlSdlJTR3N4ZFJwSlFhRHJYcEloUk1zRFFhNGJIbFcvS05uCk1vSDFWNlhLVjBKcDZWd2tZZS9pTUJoT1JKaFZiM3JDazlnWnR0NThSNG9SVGtsSDJ5aVVBZ3VVU2l6NUV0QlA2REYrYkhxL3BqK2IKT1QwQ0ZxTVlzMmVzV3o4c2d5dG5PWUZjdVg2VTFXVGRubzl1cnVoOFc3VFhha2RJMTM2ejFDMk9WblpPejJueGJrUnMxQ1RxalNTaApHTCs5Vi82cG1UVzEyeEIzdUQxSXV0YkI1L0VqUHRmZmhaMG5QTlJBdlFvTXZmWG5qU1hXZ1hTSFJ0UXBkYUpDYlBkemllZDl2M3BLCkg5TWl5UlZWejk5dmZGWFFwSXNIRVRkZmc2WW1WNllCVzM3K1dHZ0hxZWw2MmJuby8xQWZxOEswd003bzZ2MFB2WTFOdUx4eEFnTUIKQUFHalFqQkFNQjBHQTFVZERnUVdCQlRGNyszTTJJMGh4a2prNDljVUxxY1drK1dZQVRBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUE0RwpBMVVkRHdFQi93UUVBd0lCQmpBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQVVvS3NJVFFmSS9LaTJQbTRyemMySUluUk53UFdhWis0CllSQzZvakdZV1VmbzBRMGxIaFZCRE9BcVZkVlhVc3Y0NU1kcG94MU5jUUplWHlGRllFaGNDWTVKRU1FRTNLbGlhd0x3UThoT25UaEoKZE1reWNGUnR3VWY4anJRMm50U2N2ZDBnMWxQSkdLbTFWcmwyaTVWblp1NjltUDZ1Nzc1dSsyRDIvVm5HS2hzL0kwcVVKREFueUltOAo2MFFrbXNzOXZrL1ZlczZPRjh0aXdkbmVIZzU2LzBPR05GSzhZVDg4WDd2WmRyUlR2SmV6L29wTUVpNHI4OWZPNGFMLzNYdHcrenVoClRhUmpBdjA0bDVVL0JYQ2dhOTlpZ1VPTHRGa05Tb3hVbk1XN2daL05mYVh2Q3lVZU9pRGJIUHdmbUdjQ0N0UnpSQlBiVVlRYVZRTlcKNEFCK2RBYi9PTVJ5SGRPb1AyZ3hYZE1KeHk2TVcyUGc2TndlMHV4aEh2TGU1ZS8ybVhaZ0xSNlVjbkhHQ3lveXg1Sk8xVWJYSGZtcApHUXJJK3BYT2JTT1lxZ3M0clpwV0RXK044VEVBaU1FWG5NMFpOalgrVlZPZzREd3pYNVplNGpMcDN6TzdCa3FwMklSenpuZlN4cXh4CjRWeWpIUXk3Q3Q5ZjRxTngyTm8zV3FCNEsvVFVmZXQyN2ZKaGNLVmxtdE9KTkJpciszSSsxN1E5ZVZ6WUg2RXplOW1DVUF5VEY2cHMKM01LQ3V3SlhOcStZSnlvNVVPR3dpZlVsbDM1SGFCQzA3SFBLczVmUkpOejJZcUFvMDdXanVHUzNpR0pDejUxVHpabStaR2lQVHg0UwpTUGZTS2NPWUtNcnlNZ3VUakNsUFBHQXl6UVdXWWV6eXIvNnpjQ3d1cHZJPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpCSkNBIEdsb2JhbCBSb290IENBMgo9PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0pUQ0NBYXVnQXdJQkFnSVFMQmNJZldRcXdQNkZHRmtHejdSSzZ6QUtCZ2dxaGtqT1BRUURBekJVTVFzd0NRWURWUVFHRXdKRApUakVtTUNRR0ExVUVDZ3dkUWtWSlNrbE9SeUJEUlZKVVNVWkpRMEZVUlNCQlZWUklUMUpKVkZreEhUQWJCZ05WQkFNTUZFSktRMEVnClIyeHZZbUZzSUZKdmIzUWdRMEV5TUI0WERURTVNVEl4T1RBek1UZ3lNVm9YRFRRME1USXhNakF6TVRneU1Wb3dWREVMTUFrR0ExVUUKQmhNQ1EwNHhKakFrQmdOVkJBb01IVUpGU1VwSlRrY2dRMFZTVkVsR1NVTkJWRVVnUVZWVVNFOVNTVlJaTVIwd0d3WURWUVFEREJSQwpTa05CSUVkc2IySmhiQ0JTYjI5MElFTkJNakIyTUJBR0J5cUdTTTQ5QWdFR0JTdUJCQUFpQTJJQUJKM0xnSkdOVTJlMXVWQ3hBL2psClNSOUJJZ213VVZKWTFpczBqOFVTUmhURml5OHNoUDhzYnFqVjhRbmpBeUVVeEVNOWZNRXN4RXRxU3MzcGgrQjk5aUsrK2twUnVEQ0sKL2VIZUdCSUs5a2UzNXhlL0o0clVRVXlXUEdDV3dmMFZIS05DTUVBd0hRWURWUjBPQkJZRUZOSktzVkYvQnZEUmdoOU9ibCtyZy94SQoxTENSTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRREFnRUdNQW9HQ0NxR1NNNDlCQU1EQTJnQU1HVUNNQnE4Clc5ZitxZEpVRGtwZDBtMnhRTnowUTlYU1Nwa1pFbGFBOTRNMDRUVk9TRzBFRDFjeE1EQXRzYXFkQXpqYkJnSXhBTXZNaDFQTGV0OGcKVVhPUXdLaGJZZERGVURuOWhmN0I0M2o0cHRaTHZadUhqdy9sMWxPV3F6eklRTnBoOTFPajl3PT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdGlnbyBQdWJsaWMgU2VydmVyIEF1dGhlbnRpY2F0aW9uIFJvb3QgRTQ2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ09qQ0NBY0dnQXdJQkFnSVFRdkxNMmh0cE4wUmZGZjUxS0JDNDlEQUtCZ2dxaGtqT1BRUURBekJmTVFzd0NRWURWUVFHRXdKSApRakVZTUJZR0ExVUVDaE1QVTJWamRHbG5ieUJNYVcxcGRHVmtNVFl3TkFZRFZRUURFeTFUWldOMGFXZHZJRkIxWW14cFl5QlRaWEoyClpYSWdRWFYwYUdWdWRHbGpZWFJwYjI0Z1VtOXZkQ0JGTkRZd0hoY05NakV3TXpJeU1EQXdNREF3V2hjTk5EWXdNekl4TWpNMU9UVTUKV2pCZk1Rc3dDUVlEVlFRR0V3SkhRakVZTUJZR0ExVUVDaE1QVTJWamRHbG5ieUJNYVcxcGRHVmtNVFl3TkFZRFZRUURFeTFUWldOMAphV2R2SUZCMVlteHBZeUJUWlhKMlpYSWdRWFYwYUdWdWRHbGpZWFJwYjI0Z1VtOXZkQ0JGTkRZd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyCmdRUUFJZ05pQUFSMitwbXBiaUR0K2RkMzR3YzdxTnM5WHpqb3ExV21Way9XU09yc2Z5MnF3N0xGZWV5WllYOFFlY2NDV3ZrRU4vVTAKTlN0M3puOGdqMUtqQUluczFhZWliVnZqUzVLVG9JRDFBWlRjOEdnSEhzM3UvaVZTdFNCREhCdis2eG5PUTZPalFqQkFNQjBHQTFVZApEZ1FXQkJUUkl0cE1XZkZMWHlZNHFwM1c3dXNOdy91cFlUQU9CZ05WSFE4QkFmOEVCQU1DQVlZd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QUtCZ2dxaGtqT1BRUURBd05uQURCa0FqQW43cVJhcUNHNzZVZVhsSW1sZENCdGVVL0l2Wk5lV0JqN0xSb0Fhc200UGRDa1QwUkgKbEFGV292Z3pKUXhDMzZvQ01CM3E0UzZJTHVINXB4MENNazd5bjJ4VmRPT3VydnVsR3U3dDB2ekNBeEhyUlZ4Z0VEMWNmNWtEVzIxVQpTQUdLY3c9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpTZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaWpDQ0EzS2dBd0lCQWdJUWRZMzlpNjU4QndENnFTV240Y2V0RkRBTkJna3Foa2lHOXcwQkFRd0ZBREJmTVFzd0NRWURWUVFHCkV3SkhRakVZTUJZR0ExVUVDaE1QVTJWamRHbG5ieUJNYVcxcGRHVmtNVFl3TkFZRFZRUURFeTFUWldOMGFXZHZJRkIxWW14cFl5QlQKWlhKMlpYSWdRWFYwYUdWdWRHbGpZWFJwYjI0Z1VtOXZkQ0JTTkRZd0hoY05NakV3TXpJeU1EQXdNREF3V2hjTk5EWXdNekl4TWpNMQpPVFU1V2pCZk1Rc3dDUVlEVlFRR0V3SkhRakVZTUJZR0ExVUVDaE1QVTJWamRHbG5ieUJNYVcxcGRHVmtNVFl3TkFZRFZRUURFeTFUClpXTjBhV2R2SUZCMVlteHBZeUJUWlhKMlpYSWdRWFYwYUdWdWRHbGpZWFJwYjI0Z1VtOXZkQ0JTTkRZd2dnSWlNQTBHQ1NxR1NJYjMKRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFDVHZ0VTJVblhZQVNPZ0hFZENTZTVqdHJjaC9jU1YxVWdySm53VVV4RGFlZjBydHkyawoxQ3o2NmpMZFNjSzV2UTlJUFh0YW1GU3ZubDB4ZEU4SC9GQWgzYVRQYUU4YkVtTnRKWmxNS3BuelNEQmgrb0Y4SHFjSVN0dytLeHdmCkdFeHhxaldNcmZodTZEdEsyZVdVQXRhSmhCT3FiY2hQTTh4UWxqZVNNOXhmaU9lZlZObEk4SmhEMW1iOW54YzRROFVCVVF2WDR5TVAKRkYxYkZPZEx2dDMweU5vRE45SFdPYUVoVVRDRHNHM1hNRTZXVzVId2NDU3J2MFdCWkVNTnZTRTZMenpwbmczTElMVkNKOHphYjV2dQpaRENRT2MyVFpZRWhNYlVqVURNM0l1TTQ3Zmd4TU14Ri9tTDUwVjB5ZVVLSDMyck1WaGxBVGM2cXUvbTFka21VOFNmNGthV0Q1UWF6Cll3NkEzT0FTVllDbU8yYTBPWWN0eVBEUTBSVHA1QTFORHZaZFYzTEZPeHhIVnAzaTFmdUJZWXpNVFlDUU5GdTMxeFIxM05nRVNKL0EKd1NpSXRPa2N5cWV4OFZhM2UwbE1XZVVnRmFpRUFpbjZPSlJwbWtrR2o4MGZlUlFYRWd5RGV0NGZzWmZ1K1pkNEtLVElSSkxwZlNZRgpwbGh5bTNrVDJCRmZyc1U0WWpSb3NvWXdqdmlRWVo0eWJQVUhOczJpVEc3c2lqYnQ4dWFaRlVSd3czeThuRG5BdE9Gcjk0TWxJMWZaCkVvRGxTZkIxRCsrTjZ4eWJWQ2kwSVR6OGZBci83M3RyZGYrTEhhQVpCYXY2K0N1QlF1ZzR1cnY3cXYwOTRQUEszMDZYbHludDh4aFcKNmFXV3JMM0RrSml5NFBtaTFLWkhRM3h0endJREFRQUJvMEl3UURBZEJnTlZIUTRFRmdRVVZuTllaSlg1a2hxd0Vpb0VZbm1oUUJXSQpJVWt3RGdZRFZSMFBBUUgvQkFRREFnR0dNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUJBQzljCm1UejhCbDZNbEM1dzZ0SXlNWTIwOEZIVnZBcnpaSjhIWHRYQmMyaGtlcUs1RHVqNVhZVXRxRGRGcWlqMGxnVlFZS2xKZnAvaW1UWXAKRTBSSGFwMVZJRHpZbS9FRE1ycmFRS0Z6Nm9PaHQwU21EcGtCbStTOGY3NFRsSDdLcGg1MmdEWTloQWFMTXlabGJjcCtudjRmakZnNApleHFEc1ErOEZ4Rzc1Z2JNWS9xQjhvRk0yZ3NRYTZINjFTaWx6d1pBRnY5N2ZSaGVPUktrVTU1K01rSVFwaUdScVJ4T0YzeUV2SitNCjBlamY1bEc1TmtjL2tMbkh2QUxjV3h4UERrakJKWU9jQ2orZXNRTXpFaG9uclBjaWJDVFJBVUg0V0FQK0pXZ2lINXBhUEh4c25uVkkKODRIeFptZHVUSUxBN3JwWERoanZMcHIzRXRpZ2Era0ZwYUhwYVBpOFREOFNIa1hvVXNDanZ4SW5lYm5NTVR6RDlqb2lGZ09neVk5bQpwRnVpVGRhQkpRYnBkcVFBQ2o3THpUV2I0T0U0eTJCVGhpaENRUnhFVitpb3JhdEY0eVVRdk5zK1pVSDdHNmFYRCt1NWRIbjVIcndkClZ3MUhyOE12bjRkR3Arc21XZzlXWTdWaVlHNEErK01uRVNMbi9wbVBOUFc1Nk1PUmNyM1l3eDY1THZLUlJGSFFWODBNTk5WSUliL2IKRS9GbUpVTlMwbkFpTnMyZnhCeDFJSzFqY21NR0R3NG56dEpxRGJ5MU9ScnAwWFo2MFZ6azUwbEpMVlUzYVBBYU9wZytWQmVIVk9tbQpKMUNKZXlBdlAvKy9vWXRLUjVqL0szdEpQc01wUm1BWVFxc3pLYnJBS2JrVGlkT0lpamxCTzhuOXB1MGY5R0JqMzlJdFZRR0wKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGaVRDQ0EzR2dBd0lCQWdJUWI3N2FyWE85Q0VEaWkwMisxUGRia1RBTkJna3Foa2lHOXcwQkFRc0ZBREJPTVFzd0NRWURWUVFHCkV3SlZVekVZTUJZR0ExVUVDZ3dQVTFOTUlFTnZjbkJ2Y21GMGFXOXVNU1V3SXdZRFZRUUREQnhUVTB3dVkyOXRJRlJNVXlCU1UwRWcKVW05dmRDQkRRU0F5TURJeU1CNFhEVEl5TURneU5URTJNelF5TWxvWERUUTJNRGd4T1RFMk16UXlNVm93VGpFTE1Ba0dBMVVFQmhNQwpWVk14R0RBV0JnTlZCQW9NRDFOVFRDQkRiM0p3YjNKaGRHbHZiakVsTUNNR0ExVUVBd3djVTFOTUxtTnZiU0JVVEZNZ1VsTkJJRkp2CmIzUWdRMEVnTWpBeU1qQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5Da0NYSlBRSWdTWVQ0MUk1N3UKOW5UUEwzdFlQYzQ4RFJBb2tDK1g5NHhJMktEWUpiRk1zQkZNRjNOUTBDSktZN3VCMHlsdTFiVUpQaVlZZjdJU2Y1T1l0Ni93TnIveQo3aGllbkR0U3hVY1pYWFR6WkdiVlhjZG90TDhiSEFhanZJOUFJN1lleG9TOVVjUWJPY0dWMGluc1M2NTdMYjg1L2JSaTNwWjdRY2FjCm9PQUdjdnZ3QjVjSk9ZRjByL2MwV1JGWENzSmJ3U1QwTVhNd2dzYWR1Z0wzUG54RVg0TU44L0hkSUdrV0NWRGkxRlcyNElCeWRtNU0KUjdkMVZWbTBVM1RabE1aQnJWaUtNV1lQSHFJYktVQk9MOTk3NWhZc0xmeS83UE8wK3I0WTlwdEoxTzRGYnRrMDg1eng3QUdMMFNERwpENkMxdkJkT1NIdFJ3dnpwWEdrM1IyYXphUGdWS1BDNTA2UVZ6RnBQdWxKd294SkYzY2E2VHZ2QzBQZW9VaWR0Ym5tMWpQeDdqTUVXClRPNkFmNzd3ZHI1QlV4SXpybG80UXF2WER6NUJqWFlITXRXcmlmWk9aOW14UW5VamJ2UE5Rckw4VmZWVGh4Yzd3RE5ZOFZMUytZQ2sKOE9qd080czR6S1RHa0g4UG5QMkwwYVBQMm9PbmFjbFFOdFZjQmRJS1FYVGJZeEUzd2FXZ2xrc2VqQllTZDY2VU5Ic2VmOEptQU9TcQpnK3FLa0szT05rUk4wVkhwdkIvemFnWDl3SFFmSlJsQVVXN3FnbEZBMzV1NUNDb0dBdFVqSEJQVzZkdmJ4ckI2eTNzbm0vdmcxVVlrCjdSQkxZMHVsQlkrNnVCMHJwdnFSNHBKU3ZlenJaNWR0bWkyZmdUSUZaekw3U0FnLzJTVzRCQ1V2QWdNQkFBR2pZekJoTUE4R0ExVWQKRXdFQi93UUZNQU1CQWY4d0h3WURWUjBqQkJnd0ZvQVUreTQzN3VPRWVpY3V6Umsxc1ROOC85UkVRcmt3SFFZRFZSME9CQllFRlBzdQpOKzdqaEhvbkxzMFpOYkV6ZlAvVVJFSzVNQTRHQTFVZER3RUIvd1FFQXdJQmhqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FnRUFqWWx0CmhFVVk4VSt6b085b3BNQWRyREM4WjJhd21zMjJxeUlaWnRNN1FiVVFuUkM2Y200cEpDQWNBWmxpMDViZzR2c01RdGZoV3NTV1RWVE4KajhwRFUvMHF1T3I0WmNvQndxMWdhQWFmT1JwUjJlQ05KdmtMVHFWVEpYb2pwQnpPQ0J2ZlI0aXlyVDdnSjRlTFNZd2ZxVWRZZTVieQppQjBZcnJQUnBncVUrdHZUNVRnS2Eza1NNL3RLV1RjV1FBNjczdldKRFBGczAvZFJhMTQxOWR2QUp1b1NjMDZwa1pDbUY4TnNMempVCm8zS1VReXhpNFU1Y01qMjlUSDBaUjZMRFNlZVdQNCthMHp2a0VkaUxBOXoydG1CVkdLYUJVZlBocUJWcTYrQUw4QlF4MXJtTVJUcW8KRU5qd3VTZnI5OHQ2N3dWeWxyWEVqNVp6eE9oV2M1eThhVkZqdk85bkhFTWFYM2NaSHhqNEhDVXArVW1aS2JhU1BhS0RON0Vna2FpYgpNT2xxYkxRamsyVUVxeEh6RGgxVEpFbFRIYUUvblVpU0VlSjlEVS8xMTcyaVdENTRuUjRmSy80aHV4b1R0ckVvWlAyd0FnREhiSUNpCnZSWlFJQTl5Z1YvTWxQKzdtZWE2a012cStjWU13cTdGR2M0em9XdGN1MzU4TkZjWHJmQS9yczNxcjVuc0xGUitqTTR1RWxaSTd4YzcKUDBwZVlOTGNkRGE4cFVOanl3OWJvd0pXQ1o0a0xPR0dnWXorcXhjcytzamlNaG82LzRVSXlZT2Y4a3BJRUZSM04rMml2RUMrNUJCMAo5K1JidTduemlmbVBRZGpINUZDUU5ZQStITGhOa05QVTk4T3dvWDZFeW5lU01TeTRrTEdDZW5ST214TW10TlZRWmxSNHJtQT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDT2pDQ0FjQ2dBd0lCQWdJUUZBUDFxL3MzaXhkQVcrSkRzcVhSeERBS0JnZ3Foa2pPUFFRREF6Qk9NUXN3Q1FZRFZRUUdFd0pWClV6RVlNQllHQTFVRUNnd1BVMU5NSUVOdmNuQnZjbUYwYVc5dU1TVXdJd1lEVlFRRERCeFRVMHd1WTI5dElGUk1VeUJGUTBNZ1VtOXYKZENCRFFTQXlNREl5TUI0WERUSXlNRGd5TlRFMk16TTBPRm9YRFRRMk1EZ3hPVEUyTXpNME4xb3dUakVMTUFrR0ExVUVCaE1DVlZNeApHREFXQmdOVkJBb01EMU5UVENCRGIzSndiM0poZEdsdmJqRWxNQ01HQTFVRUF3d2NVMU5NTG1OdmJTQlVURk1nUlVORElGSnZiM1FnClEwRWdNakF5TWpCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCRVVwTlhQNndyZ2p6aFI5cUxGTm9GczI3aW9zVThOZ0NUV3kKSkdZbWFjQ3psZFpka2tBWkRzYWxFM0QwN3hKUktGM256TDM1UElYQno1U1F5U3ZPa2tKWVdXZjlsQ2NRWkl4UEJMRk5TZVI3VDV2MQo1d2o0QTRqM3A4T1NTeGxVZ2FOak1HRXdEd1lEVlIwVEFRSC9CQVV3QXdFQi96QWZCZ05WSFNNRUdEQVdnQlNKankrajZDdWdGRlI3CjgxYTRKbDluT0F1YzBEQWRCZ05WSFE0RUZnUVVpWTh2bytncm9CUlVlL05XdUNaZlp6Z0xuTkF3RGdZRFZSMFBBUUgvQkFRREFnR0cKTUFvR0NDcUdTTTQ5QkFNREEyZ0FNR1VDTUZYaklsYnAxNUlrV0U4ZWxESVBEQUkyd3Yyc2RESk80ZnNjZ0lpanpQdlg2eXYvTjMzdwo3ZGVlZFdvMWRsSkY0QUl4QU1lTmIwSWdqNzYyVFZudGQwMHB4Q0FnUldTR09sREd4SzB0ay9VWWZYTHRxYy9FckZjMktBaGwzeng1ClpuNmc2Zz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBFQ0MgVExTIDIwMjEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ0ZUQ0NBWnVnQXdJQkFnSVFQWmc3cG1ZOWtHUDNmaVpYT0FUdkFEQUtCZ2dxaGtqT1BRUURBekJNTVM0d0xBWURWUVFERENWQgpkRzl6SUZSeWRYTjBaV1JTYjI5MElGSnZiM1FnUTBFZ1JVTkRJRlJNVXlBeU1ESXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3dDUVlEClZRUUdFd0pFUlRBZUZ3MHlNVEEwTWpJd09USTJNak5hRncwME1UQTBNVGN3T1RJMk1qSmFNRXd4TGpBc0JnTlZCQU1NSlVGMGIzTWcKVkhKMWMzUmxaRkp2YjNRZ1VtOXZkQ0JEUVNCRlEwTWdWRXhUSURJd01qRXhEVEFMQmdOVkJBb01CRUYwYjNNeEN6QUpCZ05WQkFZVApBa1JGTUhZd0VBWUhLb1pJemowQ0FRWUZLNEVFQUNJRFlnQUVsb1pZS0RjS1o5Q2czaVFaR2VIa0JRY2ZsKzNvWklLNTlzUnhVTTZLCkRQL1h0WGE3b1d5VGJJT2lhRzZsMmI0c2lKVkJ6VjNkc2NxRFk0UE13TDUwMmVDZHBPNUtUbGJnbUNsQmsxSVExU1E0QWpKbjhaUVMKYisvWHhkNHUvUm1BbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUjJLQ1hXZmVCbW1ub0pzbW83ampQWApOdE5Qb2pBT0JnTlZIUThCQWY4RUJBTUNBWVl3Q2dZSUtvWkl6ajBFQXdNRGFBQXdaUUl3VzVrcDg1d3h0b2xyYk5hOWQrRjg1MUYrCnVEck5velpmZlBjOGR6N2tVSzJvNTlKWkRDYU9NRHR1Q0NyQ3AxcklBakVBbWVNTTU2UERyOU5KTGthQ0kyWmR5UUFVRXYwNDlPR1kKYTNjcGV0c2t6MlZBdjlMY2pCSG85SDEvSUlTcFF1UW8KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKQXRvcyBUcnVzdGVkUm9vdCBSb290IENBIFJTQSBUTFMgMjAyMQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGWkRDQ0EweWdBd0lCQWdJUVU5WFA1aG1UQy9zckJSTFl3aXFpcERBTkJna3Foa2lHOXcwQkFRd0ZBREJNTVM0d0xBWURWUVFECkRDVkJkRzl6SUZSeWRYTjBaV1JTYjI5MElGSnZiM1FnUTBFZ1VsTkJJRlJNVXlBeU1ESXhNUTB3Q3dZRFZRUUtEQVJCZEc5ek1Rc3cKQ1FZRFZRUUdFd0pFUlRBZUZ3MHlNVEEwTWpJd09USXhNVEJhRncwME1UQTBNVGN3T1RJeE1EbGFNRXd4TGpBc0JnTlZCQU1NSlVGMApiM01nVkhKMWMzUmxaRkp2YjNRZ1VtOXZkQ0JEUVNCU1UwRWdWRXhUSURJd01qRXhEVEFMQmdOVkJBb01CRUYwYjNNeEN6QUpCZ05WCkJBWVRBa1JGTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUF0b0FPeEhtOUJZeDlzS09kVFNKTnkvQkIKbDAxWjROSCtWb3lYOHRlOWoyeTNJNDlmMWNUWVFjdnlBaDV4NWVuMlhzc0lLbDR3OGkxbXg0UWJaRmM0blhVdFZzWXZZZStXL0NCRwp2ZXZVZXo4L2ZFYzRCS2ticWxMZkV6ZlRGUlZPdlY5OHI2MWp4M25jQ0h2Vm9PWDNXM1dzZ0ZXWmttR2J6U29YZmR1UDlMVnE2aGRLClpDaG1GU2xzQXZGcjFicWpNOXhhWjZjRjRyOWx0aGF3RU8zTlVEUEpjRkRzR1k2d3gvSjBXMnRFeG4yV3VaZ0lXV2JlS1FHYjlDcHQKMHhVNmtHcG44YlJyWnRraDY4clpZbnhHRUZ6ZWRVbG5ua0w1L25XcG82My9kZ3BuUU9QRjk0M0hoWnBabm1LYWF1MUZoNWhuc3RWSwpQTmUwT3dBTndJOGY0VURFcm13aDNFbCtmc3F5alcyMnY1TXZvVncrajhydGdJNVk0ZHRYejRVMk9MSnhwQW1Na29rSWlFanhRR01ZCnNsdU1XdVBEMHhlcXF4bWpMQnZrMWNiaVpuclhnaG1tT3hZc0wzR0hYMFdlbFhPVHdrS0JJUk9XMTUyN2syZ1YrcDJrSFl6eWdlQlkKQnIzSnR1UDJpVjJKK2F4RW9jdHIraGJ4eDFBOUpOcjN3K1NIMVZieFQ1QXcra1VKV2RvMHp1QVRIQVI4QU5TYmhxUkF2Tm5jVEZkKwpycmN6dGw1MjRXV0xadCtOeXRlWXI4NDJtSXljZzVrRGNQT3ZkTzNHRGpibnZlekJjNmVVV3N1U1pJS21BTUZ3b1c0c0tlRllWK3hhCmZKbHJKYVNRT29EMElKMmF6c2N0K2JKTEtaV0Q2VFdOcDBsSXB3OU1HWkhROWI4UTRIRUNBd0VBQWFOQ01FQXdEd1lEVlIwVEFRSC8KQkFVd0F3RUIvekFkQmdOVkhRNEVGZ1FVZEVtWjBmKzBlbWhGZGNOK3ROek16amt6Mmdnd0RnWURWUjBQQVFIL0JBUURBZ0dHTUEwRwpDU3FHU0liM0RRRUJEQVVBQTRJQ0FRQWpRMU1rWWx4dC9UN0N6MVVBYk1WV2lMa08zVHJpSlEyVlNwZktnSW51S3MxbCtOc1c0QW1TCjRCakhlSmk3OCt4Q1V2dXBwSUxYVGRpSy9PUk8vYXVReERoMU1vU2YvN093S3dJek5zQVFrRzhkbksvaGFaUHNvMFV2RkovMVRDcGwKUTNJTTk4UDRsWXNVODRVZ1l0MVVVOTBzM0JpVmFVK0RSM0JBTTFoM0VneWk2MUl4SGt6SnFNN0Y3OFBScmVCckF3QTBKclJVSVRXWApBZHhmRy9GODUxWDZMV2gzZTlOcHpOTU9hN3BOZGtUV3doV2FKdXl3eGZXNzBYcDB3bXpOeGJWZTlrem1XeTJCMjdPM09wZWU3YzlHCnNsQTloR0NaY2JVenRWZEY1a0pIZFdvT3NBZ01ycjNlOTdzUFdEMlBBekhvUFlKUXlpOWVERjIwbDc0Z05BZjB4QkxoN3RldzJWa3QKYWZjeEJQVHkrYXY1RXpINEFYY09QVUlqSnN5YWNtZFJJWHJNUElXbzZpRnFPOXRhUEtVMG5wckFMTitBbkNuZzMzZVUwYUtBUXY5cQpURnNSMFBYTm9yNnV6RkZjdzlWVWV3eXUxcmtHZDREaTd3Y2FhTXhaVWExK1hHZHJ1ZHZpQjBKYnVBRUZXRGxONUx1WW83RXk3Tm1qCjFtK1VJLzg3dHlsbDVnZnA3N1laNnVmQ09CMHlpSkE4RXl0dXpPK3Jkd1kwZDRSUGN1U0JoUG01ZERUZWRrK1NLbE94SlRuYlBQL2wKUHFZTzVXdWUvOXZzTDNTRDM0NjBzNm5lRkUzL01hTkZjeVQ2bFNuTUVwY0VvamkyamJEd04veklJWDgvc3lRYlBZdHV6RTJ3RmcyVwpIWU1mUnNDYnZVT1o1OFNXTHM1ZnlRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKVHJ1c3RBc2lhIEdsb2JhbCBSb290IENBIEczCj09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnBUQ0NBNDJnQXdJQkFnSVVaUFlPWlhkaGFxczd0T3FGaEx1eGliaHhrdzh3RFFZSktvWklodmNOQVFFTUJRQXdXakVMTUFrRwpBMVVFQmhNQ1EwNHhKVEFqQmdOVkJBb01IRlJ5ZFhOMFFYTnBZU0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4SkRBaUJnTlZCQU1NCkcxUnlkWE4wUVhOcFlTQkhiRzlpWVd3Z1VtOXZkQ0JEUVNCSE16QWVGdzB5TVRBMU1qQXdNakV3TVRsYUZ3MDBOakExTVRrd01qRXcKTVRsYU1Gb3hDekFKQmdOVkJBWVRBa05PTVNVd0l3WURWUVFLREJ4VWNuVnpkRUZ6YVdFZ1ZHVmphRzV2Ykc5bmFXVnpMQ0JKYm1NdQpNU1F3SWdZRFZRUUREQnRVY25WemRFRnphV0VnUjJ4dlltRnNJRkp2YjNRZ1EwRWdSek13Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBCkE0SUNEd0F3Z2dJS0FvSUNBUURBTVlKaGt1U1VHd29xWmRDK0JxbUhPMUVTNm5CQnJ1TDdkT29LamJtelROeVB0eE5TVDFRWTRTeHoKbFpIRlpqdHF6NnhqYllkVDhQZnhPYmVnUTJPd3hBTmRWNm5uUk03RW9ZTmw5bEErc1g0V3VEcUtBdENXSHdETkJTSHZCbTNkSVp3WgpRMFdoeGVpQXlzS3RRR0lYQnNhcXZQUFc1dnhRZm1aQ0h6eUxwbmw1aGtBMW55RHZQK3VMUngrUGpzWFVqcllzeVVRRTQ5UkRkVC9WClA2OGN6SDVHWDZ6ZlpCQ0s3MGJ3a1BBUExmU0lDN0VwcXErRnFrbFlxTDlqb0RpUjVyUG1kMmpFK1NvWmhMc080Zld2aWV5bEwxQWcKZEI0U1FYTWVKTm5Leml5aFdUWEF5QjFHSjJGYWovbE4wM0o1Wmg2ZkZaQWhMZjN0aTFad0EwcEpQbjlwTVJKcHh4NWN5bm9UaStqbQo5V0FQekpNc2hIL3gvR3I4bTBlZDI2MklQZk4yZFRQWFM2VElpL24xUTFoUHk4Z0RWSStsaFhnRUd2Tno4dGVISFVHZjU5Z1h6aHFjCkQwcjgzRVJvVkdqaVFUeitMSVNHTnp6TlB5K2kyK2YzVkFOZldkUDNrWGpIaTNkcUZ1VkpoWkJGY25BdmtWMzRQbVZBQ3htWnlTWWcKV21qQk5iOVBwMUh4MkJFclcrQ2FuaWc3Q2pvS0g4R0I1Uzd3cHJscHBZaVU1bXNUZjlGa1B6MmNjRWJsb29WN1dJUW4zTVNBUG1lYQptc2VhTVE0dzdPWVhRSlhaUmUwQmxxcS9EUE5MMFdQM0UxakF1UFA2WjkyYmZXMUsvekpNdFNVNy94eG5ENFVpV1FXUmtVRjNnZENGClRJY1FjZitlUXh1dWxYVXRnUUlEQVFBQm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQjhHQTFVZEl3UVlNQmFBRkVEazVQSWoKN3pqS3NLNVhmL0loTUJZMDI3eVNNQjBHQTFVZERnUVdCQlJBNU9UeUkrODR5ckN1VjMveUlUQVdOTnU4a2pBT0JnTlZIUThCQWY4RQpCQU1DQVFZd0RRWUpLb1pJaHZjTkFRRU1CUUFEZ2dJQkFDWTdVZUZOT1BNeUdMUzBYdUZsWHNTVVQ5U25ZYVA0d004ekFRTHB3Nm8xCkQvR1VFM2QzTlo0dFZsRkVidUhHTGlnZS85cnNSODJYUkJmMzRFekM0WHg4TW5wbXlGcTJYRk5GVjFwRjFBV1pMeTRqVmU1amFOL1QKRzNpbkVwUUdBSFVOY29UcExyeGFhdFhlTDFuSG8relNoMmJidDFTMUpLdjBRM2piU3dURWI5M21QbVkrS2ZKTGFIRWloNkQ0c1ROagpkdU1OaFhKRUlsVS9ISHpwL0xnVjZGTDZxajZqSVRrMWRJbW1hc0k1K25qUHRxem41OVpXL3lPU0xsQUxxYlVITS9RNFg2Ukpwc3RsCmNIYm9Db1dBU3pZOU0vZVZWSFVsMnF6RWM0Smw2VkwxWFAwNGxRSnFhVERGSEFwWEI2NGlwQ3o1eFVHM3VPeWZUMGdBK1FFRVZjeXMKK1RJeHhIV1ZCcUIvMFkwbjNiT3BwSEtIL2xtTG1ucDBGdDBXcFdJcDZ6cVczSXVuYUZuVDYzZVJPZmpYeTltUFgxb25BWDFkYUJsaQoyTWpOOUxkeVI3NWJsODd5cmFLWms2MlV5NVAyRWdtVnRxdlhPOUEvRWNzd0ZpNTVnT1JuZ1MxZDdYQjR0bUJack9GZFJXT1B5Tjl5CmFGdnFIYmdCOFg3NzU0cXo0MVNnT0FuZ1BONUM4c0x0THB2ekh6VzJOdGpqZ0tHTHpabGtEOEtxcTdISzlXK2VRNDJFVkptemJzQVMKWnRod0VQRUdOVE5EcUp3dXVoUXh6aEIvSEliamo5TFYrSGZzbTZ2eEwyUFpRbC9nWjRGa2tmR1hML3h1SnZZeitOTzErTVJpcXpGUgpKUUo2K04xclpkVnRUVERJWmJwb0ZHV3NKd3QwaXZLSAotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpUcnVzdEFzaWEgR2xvYmFsIFJvb3QgQ0EgRzQKPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDVlRDQ0FkeWdBd0lCQWdJVVR5Tmt1STZYWTU3R1U0SEJkazdMS25RVjF0Y3dDZ1lJS29aSXpqMEVBd013V2pFTE1Ba0dBMVVFCkJoTUNRMDR4SlRBakJnTlZCQW9NSEZSeWRYTjBRWE5wWVNCVVpXTm9ibTlzYjJkcFpYTXNJRWx1WXk0eEpEQWlCZ05WQkFNTUcxUnkKZFhOMFFYTnBZU0JIYkc5aVlXd2dVbTl2ZENCRFFTQkhOREFlRncweU1UQTFNakF3TWpFd01qSmFGdzAwTmpBMU1Ua3dNakV3TWpKYQpNRm94Q3pBSkJnTlZCQVlUQWtOT01TVXdJd1lEVlFRS0RCeFVjblZ6ZEVGemFXRWdWR1ZqYUc1dmJHOW5hV1Z6TENCSmJtTXVNU1F3CklnWURWUVFEREJ0VWNuVnpkRUZ6YVdFZ1IyeHZZbUZzSUZKdmIzUWdRMEVnUnpRd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmkKQUFUeHM4MDQ1Q1ZENWQ0WkNidUJlYUlWWHhWakFkN0NxOTJ6cGh0blM0Q0RyNW5MckJmYks1YktmRkpWNGhyaFBWYndMeFlJK2hXOAptN3RINWovdXFPRk1qUFhUTnZrNFhhdHdta2NONG9GQkJ1dEorYkFwM1RQc1VLVi9lU200SUppall6QmhNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVXBidEtsODZ6SzMra01kNlhnMW1EcG05eHk5NHdIUVlEVlIwT0JCWUVGS1c3U3BmT3N5dC8KcERIZWw0TlpnNlp2Y2N2ZU1BNEdBMVVkRHdFQi93UUVBd0lCQmpBS0JnZ3Foa2pPUFFRREF3Tm5BREJrQWpCZTh1c0d6RWt4bjBBQQpiYmQrTnZCTkVVL3p5NGs2TEhpUlVLTmJ3TXAxSnZLL2tGMExnb3hnS0ovR2NKcG81UEVDTUZ4WURsWjJ6MWpEMXhDTXVvNnU0N3hrCmRVZkZWWkRqL2JwVjZ3ZkVVNnMzcWU0aHNpRmJZSTg5TXZIVkk1VFdXQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRlbGVrb20gU2VjdXJpdHkgVExTIEVDQyBSb290IDIwMjAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ1FqQ0NBY21nQXdJQkFnSVFOanFXak1sY3Nsak4wQUZkeGVWWEFEQUtCZ2dxaGtqT1BRUURBekJqTVFzd0NRWURWUVFHRXdKRQpSVEVuTUNVR0ExVUVDZ3dlUkdWMWRITmphR1VnVkdWc1pXdHZiU0JUWldOMWNtbDBlU0JIYldKSU1Tc3dLUVlEVlFRRERDSlVaV3hsCmEyOXRJRk5sWTNWeWFYUjVJRlJNVXlCRlEwTWdVbTl2ZENBeU1ESXdNQjRYRFRJd01EZ3lOVEEzTkRneU1Gb1hEVFExTURneU5USXoKTlRrMU9Wb3dZekVMTUFrR0ExVUVCaE1DUkVVeEp6QWxCZ05WQkFvTUhrUmxkWFJ6WTJobElGUmxiR1ZyYjIwZ1UyVmpkWEpwZEhrZwpSMjFpU0RFck1Da0dBMVVFQXd3aVZHVnNaV3R2YlNCVFpXTjFjbWwwZVNCVVRGTWdSVU5ESUZKdmIzUWdNakF5TURCMk1CQUdCeXFHClNNNDlBZ0VHQlN1QkJBQWlBMklBQk02Ly9sZW92OVdxOXhDYXpielJFYUs5WjBMTWtPc1ZHSkRab3MwTUtpWHJQay9PdGRLUEQvTTEKMmtPTEFvQytiMUVrSFE5cks4cWZ3bTlRTXVVM0lMWWcvNGdORDIxSnU5c0dwSWVRa3BUMENkRFBmOGlBQzhHWHM3czFKOG5DRzZOQwpNRUF3SFFZRFZSME9CQllFRk9OeXpHNlZtVWV4NXJOaFROSExxK082emQ2Zk1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RnWURWUjBQCkFRSC9CQVFEQWdFR01Bb0dDQ3FHU000OUJBTURBMmNBTUdRQ01IVlNpN2VrRUUrdVNoQ0xzb1JiUXVIbUtqWUMycUJ1R1Q4bHY5cFoKTW83ays1RGNrMlRPcmJSQlIyRGl6NmZMSGdJd04wR01adDlCYTlhREFFSDlMMXIzVUxSbjBTeW9jZGREeXB3bkpKR0RTQTNQemZkVQpnYS9zZitSbjI3aVE3dDBsCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRlbGVrb20gU2VjdXJpdHkgVExTIFJTQSBSb290IDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnN6Q0NBNXVnQXdJQkFnSVFJWnhVTGVqMjdIRjMrazdvdzNCWGx6QU5CZ2txaGtpRzl3MEJBUXdGQURCak1Rc3dDUVlEVlFRRwpFd0pFUlRFbk1DVUdBMVVFQ2d3ZVJHVjFkSE5qYUdVZ1ZHVnNaV3R2YlNCVFpXTjFjbWwwZVNCSGJXSklNU3N3S1FZRFZRUUREQ0pVClpXeGxhMjl0SUZObFkzVnlhWFI1SUZSTVV5QlNVMEVnVW05dmRDQXlNREl6TUI0WERUSXpNRE15T0RFeU1UWTBOVm9YRFRRNE1ETXkKTnpJek5UazFPVm93WXpFTE1Ba0dBMVVFQmhNQ1JFVXhKekFsQmdOVkJBb01Ia1JsZFhSelkyaGxJRlJsYkdWcmIyMGdVMlZqZFhKcApkSGtnUjIxaVNERXJNQ2tHQTFVRUF3d2lWR1ZzWld0dmJTQlRaV04xY21sMGVTQlVURk1nVWxOQklGSnZiM1FnTWpBeU16Q0NBaUl3CkRRWUpLb1pJaHZjTkFRRUJCUUFEZ2dJUEFEQ0NBZ29DZ2dJQkFPMDFvWUdBODh0S2FWdkMrMUdEcmliOTRXN3pnUko5Y1VEL2gzVkMKS1NIdGdWSXMzeExCR1lTSndiM0ZLTlhWUzJ4RTFremJCNVpLVlhyS05vSUVOcWlsL0NmMlNmSFZjcDZSK1NQV2NIdTc5WnZCN0pQUApHZXBsZm9od29IUDg5disxVm1MaGMybzBtRDZDdUt5VlUvUUJvQ2NIY3FNQVU2RGtzcXVET0ZjekpaU2Z2a2dkbU9HanVwNWN6UVJ4ClVYMTFlS3Z6V2FyRTRHQytqNE5TdUhVYVFUWHR2UE02WSttcEZFWFg1bExSYnRMZXZPUDFDenZtNE1TOVEyUVRwczcwbURkc2lwV28KbDhoSEQvQmVFSXZuSFJ6K3NUdWdCVE5vQlVHQ3dRTXJBY2puajAycjZMWDJ6V3RFdGVmZGkrenFKYlFBSWxkTnNMR3lNY0VXenYvOQpGSVMzUi9xeThYRGUyNHRzTmxpa2ZMTVIwY04zZjErMkplQU54ZEt6K2JpNGQ5czNjWEZINDJBWVR5UzJkVGQ0dWFOaXI3M0pjbzR2CnpMdXUyK1FWVWhrSE0vdHF0eTFMa0NpQ2MvNFlpeldOMjZjRWFyN3F3VTAyT3hZMmtUTHZ0a0NKa1VQZzhxS3JCQzdtOGt3T0ZqUWcKcklmQkxYN0paa2NYRkJHazgvZWhKSW1yMkJySW9WeXhvL2VNYmNnQnlVL0o3TVQ4ckZFejBjaUQwY21mSGRSSE5Dayt5N0FPK29NTApLRmpsS2R3L2ZLaWZ5YllLdTZib1JoWVBsdVY3NUdwNlNHMTJtQVdsM0cwZVFoNUMyaHJnVXZlMWc4QWFlM2cxTERqMUgvMUpveTdTCldXTy9nTENNazNQTE5hYVpsU0poWlFOZyt5K1RTL3FhbklBN0FnTUJBQUdqWXpCaE1BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlYKSFE0RUZnUVV0cWVYZ2oxMGhadjNQSitUbXBWNWRWS01iVWN3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JTMgpwNWVDUFhTRm0vYzhuNU9hbFhsMVVveHRSekFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBcU14aHByNTFuaFZRcEd2N3FIQkZmTHArCnNWcjhXeVA2Q25mNG1IR0NERzNnWGthcWsvUWVvTVBoazl0THJiS21YYXV3MUdMTFhydG05UzN1bDBBOFl1dGUxaFRXak9LV2kwRnAKa3pYbXVabHJZclNoRjJZMHBtdGp4cmxPOGlMcFdBMVdRZEg2REVyd004MDd1MjBoT3E2T2NyWERTdnZwZmVXeG00YnU0dUI5dFBjeQovU0tFOFlYSk4zbnB0VCsvWE9SMHNvOFJZZ0RkR0dhaDJYc2pYL0dPMVdmb1ZOcGJPbXMyYi9tQnNUTkhNM2RBK1ZLcTNkU0R6NFY0Cm1acVR1WE5uUWtZUkllcitDcWtiR21WcHM0K3VGcmIyUzFheUxmbWx5T3c3WXFQdGE5Qk8xVUFKcEIrWTF6cWxrbGtnNUxCOXpWdHoKYUwxdHhLSVREbWNadUkxQ2Ztd01tbTZnSkMzVlJSdmN4QUlVL29WYlpaZktUcEJRQ0hwQ05mbnF3bWJVK0FHdUhyUyt3Nmp2L25hYQpvcVlmUnZhRTdmemJ6c1FDem5kSUxJeXk3TU1Bbyt3c1ZSakJmaG51NFMveXJZT2JucXNaMzhhS0w0eDM1YmNGN0R2QjdMNkdzNGE4CndQZmM1K3BicnJMTXRUV0dTOURpUDdiWStBNEE3bDNqOTQxWS84K0xOK2xqWDI3M0NYRTJ3aEpkVi9MSXRNM3o3Z0xmRWR4cXVWZUUKSFZsTmpNN0lEaVBDdHlhYUVCUngvcE95aXJpQThBNFFudE9vVUF3M2dpL3E0SXFkNFN3NS83VzBjd0RrOTBpbWM2eS9zdDUzQkllMApvODJiTlNRMytwQ1RFNEZDeHBnbWRUZG1RUkNzdS9XVTQ4SXhLNjNuSTFiTU5TV1NzMUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkZJUk1BUFJPRkVTSU9OQUwgQ0EgUk9PVC1BIFdFQgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUNlakNDQWdDZ0F3SUJBZ0lRTVpjaDdhK0pRbjgxUVllaFoxWk1iVEFLQmdncWhrak9QUVFEQXpCdU1Rc3dDUVlEVlFRR0V3SkYKVXpFY01Cb0dBMVVFQ2d3VFJtbHliV0Z3Y205bVpYTnBiMjVoYkNCVFFURVlNQllHQTFVRVlRd1BWa0ZVUlZNdFFUWXlOak0wTURZNApNU2N3SlFZRFZRUUREQjVHU1ZKTlFWQlNUMFpGVTBsUFRrRk1JRU5CSUZKUFQxUXRRU0JYUlVJd0hoY05Nakl3TkRBMk1Ea3dNVE0yCldoY05ORGN3TXpNeE1Ea3dNVE0yV2pCdU1Rc3dDUVlEVlFRR0V3SkZVekVjTUJvR0ExVUVDZ3dUUm1seWJXRndjbTltWlhOcGIyNWgKYkNCVFFURVlNQllHQTFVRVlRd1BWa0ZVUlZNdFFUWXlOak0wTURZNE1TY3dKUVlEVlFRRERCNUdTVkpOUVZCU1QwWkZVMGxQVGtGTQpJRU5CSUZKUFQxUXRRU0JYUlVJd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVJIVStvc0VhUjN4eXJxODlaZmU5TUVrVno2CmlNWWl1WU1RWW5lRU15M3BBNGpVNERQMzdYY3NTbURxNUcrdGJiVDRUSXFrNUIvSzZrODRTaTZDY3l2SFpwc0tqRUNjZklyMjhqbGcKc3Q3TDdMamtiK3FiWGJkVGtCZ3lWY1VndDVTall6QmhNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdId1lEVlIwakJCZ3dGb0FVaytGRApZMXc4bmRZbjgxTHNGN0twcnl6M2R2Z3dIUVlEVlIwT0JCWUVGSlBoUTJOY1BKM1dKL05TN0JleXFhOHM5M2I0TUE0R0ExVWREd0VCCi93UUVBd0lCQmpBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpBZGZLUjd3NGwxTStFN3FVVy9SdW5wb2QzSkloYTNSeEVMMkpxNjhjZ0wKY0ZCVEFwRndoVm1wSHFUbTZpTXhvQUFDTVFEOTR2aXpyeGE1SG5QRWx1UEJNQm5ZZnViRGw5NGNUN2lKTHpQclNBOFo5NGRHWFNhUQpwWVhGdVhxVVBvZW92UUE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRXQ0EgQ1lCRVIgUm9vdCBDQQo9PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUZqVENDQTNXZ0F3SUJBZ0lRUUFFMGpNSUFBQUFBQUFBQUFUenl4akFOQmdrcWhraUc5dzBCQVF3RkFEQlFNUXN3Q1FZRFZRUUcKRXdKVVZ6RVNNQkFHQTFVRUNoTUpWRUZKVjBGT0xVTkJNUkF3RGdZRFZRUUxFd2RTYjI5MElFTkJNUnN3R1FZRFZRUURFeEpVVjBOQgpJRU5aUWtWU0lGSnZiM1FnUTBFd0hoY05Nakl4TVRJeU1EWTFOREk1V2hjTk5EY3hNVEl5TVRVMU9UVTVXakJRTVFzd0NRWURWUVFHCkV3SlVWekVTTUJBR0ExVUVDaE1KVkVGSlYwRk9MVU5CTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzd0dRWURWUVFERXhKVVYwTkIKSUVOWlFrVlNJRkp2YjNRZ1EwRXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFERytNb2UyUWtnZmgxcwpUczZQNDBjelJKekh5V21xT2x0NDduRFNrdmdFczFKU0hXZHlLS0hmaTEyVkN2N3F6ZTMzS2M3d2IzK3N6VDN2c3h4RmF2Y29rUEZoClY4VU14S05RWGQ3VXRjc1p5b0M1ZGM0cHp0S0ZJdXdDWTh4RU1DRGE2cEZiVnVZZEhOV2Rac2MvMzRiS1MxUEUyWTJ5SGVyNDNDZFQKbzBmaFljeDl0YkQ0N25PUnhjNXpiODd1RUI4YUJzL3BKMkRGVHhuazY4NGlKa1hYWUpuZHprODM0SC9uWTYyd3VGbTQwQVpvTldEVApOcTV4UXdUeGFXVjRmUE1mODhvb24xb2dsV2EwemJmdWozaWtSUmpwSmkrTm15a29zYVMzT20yNTFCdzRja1ZZc1Y3cjhDaWJ0NExLCi9jL1dNdytmKzVlZXNSeWNudXBmWHR1cTNWVHBNQ0VvYlk1NTgzV1NqQ2IrM01YMnc3RGZSRmxEbzdZREtQWUlNS29OTStIdm5La0gKSXVOWlcwQ1Ayb2kzYVFpb3R5TXVSQWxaTjF2SDR4ZnlJdXR1T1ZMRjNsU25tTWxMSUpYY1JvbGZ0Qkw1aFNtTzY4Z25GU0RBUzlUTQpmQXhzTkF3bW15WXhwanluOXRuUVM2SmsvenVaUVhMQjRIQ1g4U1M3SzhSMElyR3NheUl5Sk5ONEtzREFvUy94VWdYSlArOTJadUpGCjJBMDlyWlhJeDRrbXlBK3Vwd011KzhGZitpRGhjSzJ3WlNBM00yQ3cxYS9YREJ6Q2tIRFhTaGk4ZmdHd3NPc1ZIa1FHemFSUDZBelIKd3lBUTRWUmxuclpSMEJwMmEwSmFXSFkwNnJjM0dhNHVkZm1XNWNGWjk1UlhLU1dOT2t5clRacEIwRjhtQXdJREFRQUJvMk13WVRBTwpCZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZkJnTlZIU01FR0RBV2dCU2RoV0VVZk1GaWI1ZG81RTgzClFPR3Q0QTFXTnpBZEJnTlZIUTRFRmdRVW5ZVmhGSHpCWW0rWGFPUlBOMERocmVBTlZqY3dEUVlKS29aSWh2Y05BUUVNQlFBRGdnSUIKQUdTUGVzUmlEcldJekxqSGhnNmhTaGJOY0F1M3A0VUxzM2EyRDZmL0NJc0xKYytvMUlOMUtyaVdpTGI3M3kwdHRHbFRJVFZYMW9sTgpjNzlwajNDalljeWEyeDZhNENENGJMdWJJcDFkaERHYUxJcmRhcUhYS0duSy9uWlZla1puNjh4RGlCYWlBOWE1Ri9nWmJHMGpBbi94Clg5QUtLU003MGFvSzdha1hKbFFLVGNLbFRmakYvYmlCenlzc2VLTm5US2tIbXZQZlh2dDg5WW5OZEpkaEVHb0hLNEZhMG82MzV5RFIKSUc0a3FJUW5vVmVzcWxWWUw5elp5dnBvQko3dFJDVDVkRUE3SXpPcmcxb1lKa0syYlZTMUZtQXdiTEdnK0xoQm9GMUpTZEpsQlRycQovcDFodkliWnY5N1R1anF4ZjM2U05JN0pBRzdjbUwzYzdJQUZyUUk5MzJYdEN3UDM5eGFFQkRHNms1VFk4aEw0aXVPL1FxK24xTTBSCkZ4YklRaDBVcUVMMjBrQ0dvRThqeXBaRlZtQUd6YmRWQWFZQmxHWCtiZ1VKdXJTa3F1THZXTDY5SjFiWTczTnhXMFF6OHBweTZyQmUKUG02cFVsdnNjRzIxaDQ4M1hqeU1uTTdrOE00TVowSE16dmFBcTA3TVRGYjF3V0ZaazdRK3B0cTROeEtmS2pMamk3Z2g3TU1yWlF6dgpJdDZJS1R0TTEvcit0K0ZIdnB3K1BvUDdVVjMxYVBjdUlZWGN2L0ZhNG56WHhlU0R3V3JydW9CYTNsd3RjSGI0eU9XSGg4cWduYUhsCkloSW5EMFE5SFd6cTFNS0xMMjk1cTM5UXBzUVpwNkY2dDViNXdSOWlXcUpEQjBCZUpzYXM3YTV3RnNXcXluS0tUYkRQQVlzRFAyN1gKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKU2VjdXJlU2lnbiBSb290IENBMTIKPT09PT09PT09PT09PT09PT09PT0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURjakNDQWxxZ0F3SUJBZ0lVWnZuSHdhL3N3bEcwN1ZPWDV1YUN3eXNja0JZd0RRWUpLb1pJaHZjTkFRRUxCUUF3VVRFTE1Ba0cKQTFVRUJoTUNTbEF4SXpBaEJnTlZCQW9UR2tONVltVnlkSEoxYzNRZ1NtRndZVzRnUTI4dUxDQk1kR1F1TVIwd0d3WURWUVFERXhSVApaV04xY21WVGFXZHVJRkp2YjNRZ1EwRXhNakFlRncweU1EQTBNRGd3TlRNMk5EWmFGdzAwTURBME1EZ3dOVE0yTkRaYU1GRXhDekFKCkJnTlZCQVlUQWtwUU1TTXdJUVlEVlFRS0V4cERlV0psY25SeWRYTjBJRXBoY0dGdUlFTnZMaXdnVEhSa0xqRWRNQnNHQTFVRUF4TVUKVTJWamRYSmxVMmxuYmlCU2IyOTBJRU5CTVRJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUM2T2NFMwplbWhGS3hTMDYrUVQ2MWQxSTAyUEpDMFc2SzZPeVgya1Z6c3FkaVV6ZzJ6cU1vcVVtMDQ4bHVUOVViK1p5Wk4rdi9tdHA3SklLd2NjCkovVk12SEFTZDZTRlZMWDlrSHJrbytSUldBUE5FSGw1N211VEgyU09hMlNyb3hQamNmNTlxNXpkSjFNM3M2b1l3bGttN0ZzZjB1WmwKZk8rVHZkaFlYQXZBNDJWdlBNZktXZVArYmwrc2c3NzlYU1ZPS2lrNzFndXJGeko0cE9FK2xFYStZbTZiM2thb3NSYm5oVzcwQ0VCRgpFYUNlVkVTRTk5ZzJ6dlZRUjl3c01KdnV3UFdXMHY0SmhzY0dXYTVQcm80Um1IdnpDMUtxWWlhcUlkK09KVE41bHhaSmpmVSsxVWVmCk56RkpNM0lGVFF5MlZZenhWNCtLaDlHdHhSRVNPYUN0QWdNQkFBR2pRakJBTUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RGdZRFZSMFAKQVFIL0JBUURBZ0VHTUIwR0ExVWREZ1FXQkJSWE5QTjB6d1JMMVNYbThVQzJMRXpaTGVtZ3JUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQwpBUUVBUHJ2YkZ4YlM4aFFCSUN3NGcwdXR2c3FGZXBxMm0ydW00ZnlsT3F5dHRDZzZyOWNCZzBrclk2TGRtbVFPbUZ4djNZNjdpbFFpCkxVb1Q4NjVBUTl0UGtiZUdHdXdBdEVHQnBFLzZhb3VJczNZSWNpcEpRTVBUdzRXSm1CQ2xuVzhadDd2UGVtVlYyemZyUElweU1wY2UKbWlrK3JZM21veHR0OVhVYTVyQm91VnVpN21sSEp6V2hocG1BOHpOTDRXdWtKc1B2ZEZsc2VxSmt0aDVFdzFEZ0R6azlxVFB4cGZQUwp2V0tFckk0Y3FjMWF2VGM3YmdvaXRQUVY1NUZZeFRwRTA1VW8yY0JsNlhMSzBBKzlIN01WMmFuanBFY0pudURMTi92OXZaZlZ2aGdhCmFhSTVnZGthOWF0L3lPUGlad3VkOUF6cVZOL1NzcSt4SXZFZzM3eEVIQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVNpZ24gUm9vdCBDQTE0Cj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlGY2pDQ0ExcWdBd0lCQWdJVVpOdGFEQ0JPNk5jcGQ4aFFKNkphSjkwdDhzc3dEUVlKS29aSWh2Y05BUUVNQlFBd1VURUxNQWtHCkExVUVCaE1DU2xBeEl6QWhCZ05WQkFvVEdrTjVZbVZ5ZEhKMWMzUWdTbUZ3WVc0Z1EyOHVMQ0JNZEdRdU1SMHdHd1lEVlFRREV4UlQKWldOMWNtVlRhV2R1SUZKdmIzUWdRMEV4TkRBZUZ3MHlNREEwTURnd056QTJNVGxhRncwME5UQTBNRGd3TnpBMk1UbGFNRkV4Q3pBSgpCZ05WQkFZVEFrcFFNU013SVFZRFZRUUtFeHBEZVdKbGNuUnlkWE4wSUVwaGNHRnVJRU52TGl3Z1RIUmtMakVkTUJzR0ExVUVBeE1VClUyVmpkWEpsVTJsbmJpQlNiMjkwSUVOQk1UUXdnZ0lpTUEwR0NTcUdTSWIzRFFFQkFRVUFBNElDRHdBd2dnSUtBb0lDQVFERjBucWgKMW9xL0ZqSFFtTkU2bFB4YXVHNGl3V0wzcHdvbjcxRDJMckdlYUJMd2JDUmpPZkh3M3hERzNyZFNJTlZTVzBLWm52T2d2bElmWDh4bgpiYWN1VUtMQmw0MjIrSlgxc0xyY25lQyt5OS8zT1BKSDlhYWFrcFVxWWxsUUM2S3hOZWRsc21HeTZwSnhhZVFwOEUrQmdRUThzcVZiCjFNV29XV2Q3VlJ4SnEzcWR3dWR6VGUvTkNjTEVWeExiQVE0amVRa0hPNkxvL0lyUGo4QkdKSnc0SitDRG5SdWd2M2dWRU91R1RncGEKL2QvYUxJSis3c3IyS2VINmNhSDNpR2ljblBDTnZnOUprZGpxT3ZuOTBHaHgyK20xSzA2Q2ttOW1IK0R3M0V6c3l0SHF1blFHK2JPRQprSlRSWDQ1ekdSQmRBdVZ3cGNBUTBCQjhiOFZZU2JTd2JwcmFmWlgxek5vQ3I3Z3NmWG1QdmtQeCtTZ29qUWxEK0FqZGE4aUxMQ1N4CmpWSUh2WGlieThwb3NxVGRERXg1WU1hWjBaUHhNQm9IMDY0aXd1ck84WVFKek9BVWJuOC9mdEtDaGF6Y3FSWk9oYUJneS9hYzE4aXoKanUzR201aDFEVlhvWCtXVml3S2tya01wS0JHazVoSXdBVXQxYXg1bW5Ya3ZwWFl2SFVDMGJjbDllUWpzMFdxMlhTcXlwV2E5YTRYMApkRmJEOWVkMVVpZ3NwZjltUjZYVS92NmVWTDlsZmdIV01JK2xOcHlpVUJ6dU9JQUJTTWJIZFBUR3JNTkFTUlpoZEN5dmpHODE3WHNZCkFGczJQSnhRRGNxU014RHhKa2x0MzNVa040SWkxK2lXL1JWTEFwWStCM0tWZnFzOVRDN1h5dkRmNEZnL0xTOEVtamlqQVFJREFRQUIKbzBJd1FEQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01BNEdBMVVkRHdFQi93UUVBd0lCQmpBZEJnTlZIUTRFRmdRVUJwT2pDbDRvYVRlcQpZUjNyNi93dGJ5UGs4NkF3RFFZSktvWklodmNOQVFFTUJRQURnZ0lCQUphQWNna0dmcHpNa3dRV3U2QTZqWkpPdHhFYUNuRnhFTTBFCnJYK2xSVkFRWms1S1FhSUQyUkZQZWplNVMrTEdqekptZFNYNzY4NC9BeWttamJnV0hmWWZNMjVJNXVqNFY3SWJlZDg3aHdyaVpMb0EKeW16dmZ0QWo2M2lQLzJTYk5EZWZOV1dpcEFBOUVpT1dXRjNLWTRmR293ZUlUZWRwZG9wVHpmRlA3RUx5aytPWnBEYzhoN2hpMi9EcwpIemMvTjE5RHpGR2R0ZkNYd3JlRmFtZ0xSQjdsVWU2VHprdHVoc0hTRENSWk5ocWZMSkdQNHhqYmxKVUs3WkdxRHBuY2xsUGpZWVBHCkZyb2p1dHpkZmhyR2UwSzIyVm9GM0pwZjFkKzQya2Q5MmpqYnJEblZIbXRzS2hlTVljMnhiWElCdzhNZ0FHSm9GakhWZHFxR3V3NnEKbnNiNThObjREU0VDNU1Vb0Zsa1J1ZGxwY3lxU2VMaVNWNXNJOGpybEw1V3dXTGRySUJSdEZPOEt2SDdZVmRpSTJpLzZHYVg3aStCLwpPZlZ5SzRYRUxLenZHVVdTVExOaEI5eE5IMjdTZ1JOY212TVNaNFBQbXorTG41Mmt1YWlXQTNyRjdpRGVNOW92bmhwNmRCN2g3c3hhCk9nVGRzeG9FcUJSanJMZEhFb09hYlBYbTZSVVZrUnFFR1E2VVJPY1NqaVZiZ0djWjNHT1RFQXRsTG9yNkNacE8yb1lvZmFwaE5kZ08KcHlnYXUxTGdlUGhzdW15d2JybUhYdW1aTlRmeFBXUXJxYUEwazg5akw5V0IzNjVqSjZVZVRvM2NLWGhaK1BtaElJeW5Ka0J1Z25MTgplTExJanp3ZWMrZkJINy9QenFVcW05dEVaREtndTM5Y0pSTkl0WCtTCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClNlY3VyZVNpZ24gUm9vdCBDQTE1Cj09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDSXpDQ0FhbWdBd0lCQWdJVUZoWEh3OWhKcDc1cERJcUk3ZkJ3K2QyM1BvY3dDZ1lJS29aSXpqMEVBd013VVRFTE1Ba0dBMVVFCkJoTUNTbEF4SXpBaEJnTlZCQW9UR2tONVltVnlkSEoxYzNRZ1NtRndZVzRnUTI4dUxDQk1kR1F1TVIwd0d3WURWUVFERXhSVFpXTjEKY21WVGFXZHVJRkp2YjNRZ1EwRXhOVEFlRncweU1EQTBNRGd3T0RNeU5UWmFGdzAwTlRBME1EZ3dPRE15TlRaYU1GRXhDekFKQmdOVgpCQVlUQWtwUU1TTXdJUVlEVlFRS0V4cERlV0psY25SeWRYTjBJRXBoY0dGdUlFTnZMaXdnVEhSa0xqRWRNQnNHQTFVRUF4TVVVMlZqCmRYSmxVMmxuYmlCU2IyOTBJRU5CTVRVd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVFMVUhTTlpES1ptYlBTWUFpNElvNUcKZEN4NHdDdEVMVzFmSGNtdVMxSWdnejI0RkcxVGgyQ2VYMnlGMndZVWxlREhLUCtkWCtTcThiT0xiZTFQTDB2SlNwU1JaSFgrQWV6QgoyT3Q2bEhoV0dFTmZhNEhMOXJ6YXRBeTJLWk1JYVkralFqQkFNQThHQTFVZEV3RUIvd1FGTUFNQkFmOHdEZ1lEVlIwUEFRSC9CQVFECkFnRUdNQjBHQTFVZERnUVdCQlRyUWNpdS9OV2VVVWoxdll2MGh5Q1RRU3ZUOURBS0JnZ3Foa2pPUFFRREF3Tm9BREJsQWpFQTJTNkoKZmw1T3BCRUh2Vm5DQjk2ck1qaFRLa1pFQmhkNnpsSHA0UDltTFFsTzRFLzBCZEdGOWpWZzNQVnlzMFo5QWpCRW1FWWFnb1VlWVdtSgpTd2RMWnJXZXFycWdIa0haQVhRNmJrVTZpWUFaZXpLWVZXT3I2Mk51azIyckd3bGdNVTQ9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgQlIgUm9vdCBDQSAyIDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnFUQ0NBNUdnQXdJQkFnSVFjenN3QkVoYjJVMTRMbk5MeWFIY1pqQU5CZ2txaGtpRzl3MEJBUTBGQURCSU1Rc3dDUVlEVlFRRwpFd0pFUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRUpTSUZKdmIzUWdRMEVnCk1pQXlNREl6TUI0WERUSXpNRFV3T1RBNE5UWXpNVm9YRFRNNE1EVXdPVEE0TlRZek1Gb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVQKQmdOVkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCQ1VpQlNiMjkwSUVOQklESWdNakF5TXpDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQUs3L0NWbVJnQXBLYU9Za1A3aW41TWc2Q2pvV3pja2pZYUNUCmNmS3JpM09Qb0dkbFlOSlVhMk5SYjBrejRISUhFMzA0elFhU0J5bFNhMDUzYkFUVGxmcmRUSXpaWGNGaGZVdm5LTE5FZ1h0UnI5MHoKc1doODFrNU0vaXRvdWNwbWFjVHNYbGQvOXczSG5EWTI1UWRnck1CTTZnaHM3d1o4VDFzb2VnajhrMTJiOXB5MGk0YTZJYm4wOE9oWgpXaWloTklRYUpaRzJ0WS92c3ZtQSt2azlQQkZ5Mk9NdmhuYkZlU3pCcVpDVFJwaG55NE5xb0ZBanB6djJnVG5nN2ZDNXYyWHgyTXQ2CisrOXpBODRBOUgzWDRGMDdacmpjanJxRHk0ZDJBL3dsMmVjamJ3YjlaL1BnLzRTOFI3KzFGaGhHYVJUTUJmZmIwMG1zYTh5cjVMVUwKUXlSZVMydE5aOS9XdFQ1UGVCK1VjU1RxM25EODhaUCtucE5hNUpSYWwxUU1OWHRmYk80QUh5VHNBN29DOVhiMG45U2E3WVVzT0NJdgp4OWd2ZGhGUC9XeGM2UFdPSjRkL0dVb2hSNUFkZVkwY1cvalBTb1hrN2JOYmpiN0VaQ2hkUWNSdXJEaGFUeU4wZEtrU3cvYlN1UkVWCk13ZVIyRHMzT21Nd0J0SEZJallvWWlNUTRFYk1sNnpXSzExa0pOWHVIQTdlK3doYWRTcjJZMjNPQzBLKzBicHdISndoNVE4eGFSZlgKL0FxMDN1MkFuTXVTdEl2MTNsbWlXQW1sWTBjTDRVRXlORUhabXJIWnFMQWJXdDRORGZUaXNsMDFnTG1CMUlScGtRTExkZENOeGJVOQpDWkVKanhTaEZIUjVQdGJKRlIya1dWa2kzUGFLUlQwOEV0WStYVEl2QWdNQkFBR2pnWTR3Z1lzd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVaNUR3MXQ2MUdOVkdLWDVjcS9pZUNMeGtsUkF3RGdZRFZSMFBBUUgvQkFRREFnRUdNRWtHQTFVZEh3UkMKTUVBd1BxQThvRHFHT0doMGRIQTZMeTlqY213dVpDMTBjblZ6ZEM1dVpYUXZZM0pzTDJRdGRISjFjM1JmWW5KZmNtOXZkRjlqWVY4eQpYekl3TWpNdVkzSnNNQTBHQ1NxR1NJYjNEUUVCRFFVQUE0SUNBUUEwOTdOM1U5c3dGcmt0cFNIeFFDRjE2K3RJRm9FOWMrQ2VKeXJyCmQ2a1RwR29LV2xvVU16MW9INEd1YWYyTW4yVnNORUxaTGRCL2VCYXhPcXdqTWExZWY2N25yaXY2dXZ3OGw1VkFrMS9ETFFPajdhUnYKVTlmNlFBNHc5UUFnTEFCTWpEdTBveCsydjVFeXE2K1NtTk1XNXRUUlZGeERXeTZ1NzFjcXFMUnZwTzhOVmhUYUlhc2dkcDREL0NhNApuajgrQXlibVROdWRYMEtFUFVVREF4eFppTXJjTG1Fa1dxVHFKd3R6RXI1U3N3clBNaGZpSG9jYUZwVkliVnJnME04SmtpWm1rZGlqCllRNnFnWUYvNkZLQzBVTG40QjBZK3FTRk51ZUc0QTNydk5USjFqeEQ4VjFKYm42Qm0ybTFpV0tQaUZMWTEvNG53U1BGeXlzQ3U3RmYKL3Z0RGhRTkd2bDNHeWlFbS85Y0NublJLM1BnVEZiR0JWemJMWlZ6UkhURjM2U1hEdzdJeU45WHhtQW5rYldPQUNLc0drb0hVNlhDUApweit5N1lhTWdtbzF5RUphZ3RGU0drVVBGYVVBOEpSN1pTZFhPVVBQZkgvbXZUV3plL0VaVE40NmxzL3BkdTRENThKRFVqeHFnZWpCCldvQzlFVjJUYS92SDVtUS91MmtjNmQwbGk2OTB5VlJBeXN1VEV3cnQrMmFTRWNyMXdQcllnMVVEZk5QRklrWjFjR3Q1U0FZcWdwcS8KNXVzV0RpSkZBYnpkTnBRMHFUVW1pdGVYdWU0SWNyODBrbkNEZ0tzNHFsbG8zVUNrR0pDeTg5VUR5aWJLNzlYSDRJOVRqdkFBNDZqdApuL210ZCtBclkwK2V3KzQzdTNnSmhKNjVidnNwbVpEb2dOT2ZKQT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0QXNpYSBUTFMgRUNDIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJQ01UQ0NBYmVnQXdJQkFnSVVOblRoVFh4bEU4bXNnMVVsb0Q1U2ZpOVFhTWN3Q2dZSUtvWkl6ajBFQXdNd1dERUxNQWtHQTFVRQpCaE1DUTA0eEpUQWpCZ05WQkFvVEhGUnlkWE4wUVhOcFlTQlVaV05vYm05c2IyZHBaWE1zSUVsdVl5NHhJakFnQmdOVkJBTVRHVlJ5CmRYTjBRWE5wWVNCVVRGTWdSVU5ESUZKdmIzUWdRMEV3SGhjTk1qUXdOVEUxTURVME1UVTJXaGNOTkRRd05URTFNRFUwTVRVMVdqQlkKTVFzd0NRWURWUVFHRXdKRFRqRWxNQ01HQTFVRUNoTWNWSEoxYzNSQmMybGhJRlJsWTJodWIyeHZaMmxsY3l3Z1NXNWpMakVpTUNBRwpBMVVFQXhNWlZISjFjM1JCYzJsaElGUk1VeUJGUTBNZ1VtOXZkQ0JEUVRCMk1CQUdCeXFHU000OUFnRUdCU3VCQkFBaUEySUFCTGgvCnBWcy9BVDU5OElodHJpbVk0WnRjVTVuYjl3ai8xV3JnanN0RXB2REJqTDFQMU03VWlGUG9YbGZYVHI0c1AvTVNwd0RwZ3VNcVd6SjgKUzVzVUtaNzRMWU8xNjQ0eFNUMG1ZZWtkY291SnRncTduRE0xRDlyczNxbEtIOGt6c2FOQ01FQXdEd1lEVlIwVEFRSC9CQVV3QXdFQgovekFkQmdOVkhRNEVGZ1FVTElWVHU3RkR6VExxbnFPSC9xS1lxS2FUNlJBd0RnWURWUjBQQVFIL0JBUURBZ0VHTUFvR0NDcUdTTTQ5CkJBTURBMmdBTUdVQ01GUkgxOE10WVlaSTlIbGFWUTAxTDE4TjltZHNkMEFhUnVmNGFGdE9KeDI0bUgxL2s3OElUY1RhUlRDaEQxNUsKZUFJeEFLT1JoL0lSTTRQRHdZcVJPa3dyVUxHOUlwUmROWWx6ZzhXYkdmNjBvZW5Vb1dhMkFhVTIrZGhvWVNpM2RPR2lNUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClRydXN0QXNpYSBUTFMgUlNBIFJvb3QgQ0EKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmdEQ0NBMmlnQXdJQkFnSVVIQmpZeitWVFB5STFSbE5VSkR4c1I5RmNTcHd3RFFZSktvWklodmNOQVFFTUJRQXdXREVMTUFrRwpBMVVFQmhNQ1EwNHhKVEFqQmdOVkJBb1RIRlJ5ZFhOMFFYTnBZU0JVWldOb2JtOXNiMmRwWlhNc0lFbHVZeTR4SWpBZ0JnTlZCQU1UCkdWUnlkWE4wUVhOcFlTQlVURk1nVWxOQklGSnZiM1FnUTBFd0hoY05NalF3TlRFMU1EVTBNVFUzV2hjTk5EUXdOVEUxTURVME1UVTIKV2pCWU1Rc3dDUVlEVlFRR0V3SkRUakVsTUNNR0ExVUVDaE1jVkhKMWMzUkJjMmxoSUZSbFkyaHViMnh2WjJsbGN5d2dTVzVqTGpFaQpNQ0FHQTFVRUF4TVpWSEoxYzNSQmMybGhJRlJNVXlCU1UwRWdVbTl2ZENCRFFUQ0NBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQCkFEQ0NBZ29DZ2dJQkFNTVd1QnRxcEVSejVkWk85TG5QV3d2QjBacUI5V093ajBQQnV3aGFHbnJoQjNZbUg0OXBWcjcrTm1EUURJUE4KbE9ybnhTMWNMd1VXQXA0S3FDL2xZQ1pVbHZpWVFCMnNycDEwWnk5VSs1UmptT01tU29QR2xiWUpRMURORFgzZVJBNWdFazliTmIyLwptVGh0Zld6YTRtaHpIL2t4cFJrUWN3VXF3eklaaGVvMHF0MUNIakNOUDU2MUhtSFZiNzBBY25LdEVqK3Fwa2x6OG9ZVmxRd1FYMUZrCnp2OTN1TWx0ck9YVm1QR1pMbXpqeVVUNXRVTW5DRTMyZnQ1RWVidXlqQnphMDB0c0x0YkRlTGRNMWFUazJ0eUtqZzcvRDhPbVlDWW8KenphLytsY0s3RnMvNlRBV2U4VGJ4TlJrb0RENzVmMGRjWkxkS1k5QldONEFyVHI5UFh3YXFMRVg4RTQwZUZnbDFvVWg2M2tkME55cgp6Mkk4c01lWGk5YlFuOVArUE43RjQvdzZnM0NFSVIwSndxSDh1eWdoWlZOZ2VwQnRsamhiLy9IWGVsdHQwOGx3U1VxNkhUclFVTm95CklCbmtpei9yMVJZbU56ejdkWjZ3QjNDNEZHQjMzUFlQWEZJS3ZGMXRqVkVLMnNVWXlKdHQzTENEczMralRuaE1tQ1dyOG40dUlGNkMKRmFiVzJJK3M1YzB5aHNqNTVOcUo0anMrazhVVGF2L0g5eGo4WjdYdkdDeFVxMERUYkUzdHhjaTNPRTlreEpSTVQ2RE5ycVhHSnlWMQpKMjNHMnB5T3NBV1oxU2dSeFNIVXVQekhscXRLWkZsaGF4UDhTOHlTcGcra1ViOE9XSkRaZ29NNXBsK3orbTZTczgwekRvV284U25UCnExbXQxdHZlMUN1QkFnTUJBQUdqUWpCQU1BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZMZ0hrWGxjQnZSRy9YdFoKeWxvbWthZEZLL2hUTUE0R0ExVWREd0VCL3dRRUF3SUJCakFOQmdrcWhraUc5dzBCQVF3RkFBT0NBZ0VBSVp0cUJTQmRHQmFuRXFUMwpSei9OeWp1dWpzQ0N6dHhJSlhnWGJPRGdjTVRXbHRuWjlyOTZuQk83VTVXUy84K1M0UFBGSnpWWHFEdWlHZXY0aXFNRTNtbUw1RHc4CnZlV3YwQkliNVlscmM1dHZKUUpMa0lLdlFNS3R1cHBnSkZxQlRRVVlvK0l6ZVhvTEg1UHQ3RGxLOVJNRTdJMTBuWUVLcUcvb2R2NkwKVHl0cEVvWUtORGJkZ3B0dlQrQnozVWwvS0Q3Sk82TlhCTmlUMlR3cDJ4SVFhT0hFaWJnR0lPY2Jlcnl4azJHYUdVQVJ0V3FGVndIeAp0bG90Sm5Nbmx2bTVQMXZRaUoza29QMjZUcFVKZzM5MzNGRUZsSjBnY1hheDdQcUp0Wnd1aGZHNVd5UmFzUW1yMnNvYUI4MkczOXRwCjI3UklHQUF0dktMRWlVVWpwUTdoUkdVK2lzRnFNQjNpWVBnNnFvY0pRcm1Ca3R3bGlKaUo4WHcxOFdMSzdubjRHUy8rWC9qYmg4N3EKcUE4TXB1Z0xvRHpnYTVTWW5IK3RCdVljNmtJUVgrSW1GVHczT2ZmWHZPNjQ1ZThEN3IwaSt5aUdORmpFV245aG9uZ1BYdlBLbmJ3YgpQS2ZJTGZhbkloSEtBOWpuWndxS0RzczFqalE1Mk1qcWpaOWs0RGV3Yk5mRmo4R1FZU2JiSkl3ZVNzQ0kzeldRemo4QzlHUmgzc2ZJCkI1WGVNaGc2ajZKQ1FDVGwxak5kZks3dnNVMVAxRmVRTldyY3JnU1hTWWswbHk0d0JPZVk5OXNMQVpEQkh3by8rTUwrVHZyYm1uTnoKRnJ3RnVIbllXYThHNXo5bk9EbXhmS3VVNENrVXBpankzMjNpbXR0VVEvaEhXS05kZEJXY3dhdXd4elE9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCkQtVFJVU1QgRVYgUm9vdCBDQSAyIDIwMjMKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRnFUQ0NBNUdnQXdJQkFnSVFhU1lKZm9CTFRLQ25qSGhpVTE5YWJ6QU5CZ2txaGtpRzl3MEJBUTBGQURCSU1Rc3dDUVlEVlFRRwpFd0pFUlRFVk1CTUdBMVVFQ2hNTVJDMVVjblZ6ZENCSGJXSklNU0l3SUFZRFZRUURFeGxFTFZSU1ZWTlVJRVZXSUZKdmIzUWdRMEVnCk1pQXlNREl6TUI0WERUSXpNRFV3T1RBNU1UQXpNMW9YRFRNNE1EVXdPVEE1TVRBek1sb3dTREVMTUFrR0ExVUVCaE1DUkVVeEZUQVQKQmdOVkJBb1RERVF0VkhKMWMzUWdSMjFpU0RFaU1DQUdBMVVFQXhNWlJDMVVVbFZUVkNCRlZpQlNiMjkwSUVOQklESWdNakF5TXpDQwpBaUl3RFFZSktvWklodmNOQVFFQkJRQURnZ0lQQURDQ0Fnb0NnZ0lCQU5pT280bUFDN0pYVXR5cFUwdzN1WDlqRnhQdnAxc2pXMmwxCnNKa0tGOEdMeE51bzRNd3h1c0x5elYzcHQvZ2RyMnJFbFlmWFI4bVYySUlFVUQyQkNQL2tQYk94MXNXeS9ZZ0oyNXlFN0NVWEZJZC8KTUhpYmFsakp0bk1vUERUM21mZC8wNmI0SEVWOHJTeU1sRC9ZWnhCVGZpTE5UaVZSOENVa05SRmVFTWJzaDJhSmdXaTZ6Q3VkUjNNZgp2YzJScEhKcW5LSWJHS0J2N0ZEMGZVRENxRERQdlhQSUV5c1FFeDZMbXFnNmxIUFRHR2tLU3YvQkFRUC9lWCsxU0g5Nzd1Z3BielpNCmxXR0cyUG1pYzRydXJpK1c3bWpOUFUwb1F2bEZLekliUmxVV2FxWkxLZm03bFZhL1JoM3NIWk1kd0dXeUg2RkRybGFlb0xHUGF4SzMKWUcxNEM4cUtYTzBlbGc2RHBraVZqVHVqSWNTdVdNWUFzb1MwSTZTV2hqVzQySjdZckRSSm1HT1Z4Y3R0U0VmaThpNFlIdEF4cTkxMAo3UG5jakxnY2ptZ2p1dER6VU56UFpZOXpPakxIZlA3S2dpSlB2bzVpUjJibHpZZmk2TlVQR0ovbEJISkxSandROGtUQ1pGWnhUblhvCm5Na21kTVY5V2RFS1d3OXQvcDUxSEJqR0dqcDgyQTBFek0yM1JXVjZzWSs0cm9SSVByTjZUYWdENHVKK0FSWlphQmhETTdEUzNMQWEKUXpYdXBkcXBSbHl1aG9GQkFVcDBKdXlmQnIvQ0JUZGtkWGdwYVAzRjllditSL25raGJEaGV6R2Rwbjl5bzduRUxDN01tVmNPSVF4RgpBWlJsNjJVSnhtTWlDek5Ka2tnOC9NM09zRDZPbm92NC9rbkZOWEpIQWdNQkFBR2pnWTR3Z1lzd0R3WURWUjBUQVFIL0JBVXdBd0VCCi96QWRCZ05WSFE0RUZnUVVxdnlSRUJ1SGtWOFd1YjlQUzVGZUFCeXhNb0F3RGdZRFZSMFBBUUgvQkFRREFnRUdNRWtHQTFVZEh3UkMKTUVBd1BxQThvRHFHT0doMGRIQTZMeTlqY213dVpDMTBjblZ6ZEM1dVpYUXZZM0pzTDJRdGRISjFjM1JmWlhaZmNtOXZkRjlqWVY4eQpYekl3TWpNdVkzSnNNQTBHQ1NxR1NJYjNEUUVCRFFVQUE0SUNBUUNUeTZVZm1SSHNtZzFmTEJXVHhqKytFSTE0UXZCdWtFZEhqcU9TCk1vMXdqL1piamI2SnprY0JhaHNnSUlsYnlJSVFiT0RubWFwcnhpcWdZeldSYW9VbHJSYzRwWnQrVVBKMjZvVUZLaWRCSzdHQjBhTDIKUUhXcERzdnhWVWpZN05Ic3Mrak9GS0UxN01KZU5ScXJwaFlCQm83cTNDK2ppc29za2V0U2psOE1teGZQeTNNSEdjUnF3bk5VNzN4RApVbVBCRWNyQ1JiSDBPMVAxYWE0ODQ2WGVyT2hVdDdLUi9heXBIL0tINUJmR1NhaDgyQXBCOVBJKzUzYzBCRkxkNklIeVRTOVVSWjBWCjRVL001ZDQwVnhESkkzSVhjSTFRY0I5V2JNeTUvenBhVDJONncyNWxCeDJFb2YrcERHT0piYkpBaURuWEgzZG90ZnljMWRabmFWdW8KZE52OGlmWWJNdmVrSktaMnQwZFQ3NDFKajZtMmcxcWxscEJGWWZYZUEwOG1ENmlMOEFPV3NLd1YwSEZhYW51VTVuQ1QydkZwNExKaQpUWjZQLzRtZG0xM05SZW1VQWlLTjREVi82UEVFZVhGc1ZJUDRNN2tGTWh0WVZSRlAwT1VuUjNIczdkcG4xbUttUzAwUGFhTEp2T3dpClM1VEhhSlFYZnVLT0tENjJ4dXIxTkd5Zk40Z0hPTnVHY2ZyTmxVaERicU5QZ29mWE5KaHVTNU41WUhWcEQvQWExVlA2SVF6Q1Aray8KSHhpTWtsMTRwM1puR2J1eTZuL3BjQWxXVnFPd0RBc3RObDdGNmNUVmc4dUdGNWNzYkJOdmgxcXZTYVlkMjgwNEJDNWY0a28xRGkxTAorS0lrQkkzWTRXTmVBcEkwMnBoaFhCeHZXSFprcy93Q3VQV2RDZz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KClN3aXNzU2lnbiBSU0EgVExTIFJvb3QgQ0EgMjAyMiAtIDEKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmt6Q0NBM3VnQXdJQkFnSVVRL29NWDA0YmdCaEU3OUcwVHpVZlJQU0E3Y3N3RFFZSktvWklodmNOQVFFTEJRQXdVVEVMTUFrRwpBMVVFQmhNQ1EwZ3hGVEFUQmdOVkJBb1RERk4zYVhOelUybG5iaUJCUnpFck1Da0dBMVVFQXhNaVUzZHBjM05UYVdkdUlGSlRRU0JVClRGTWdVbTl2ZENCRFFTQXlNREl5SUMwZ01UQWVGdzB5TWpBMk1EZ3hNVEE0TWpKYUZ3MDBOekEyTURneE1UQTRNakphTUZFeEN6QUoKQmdOVkJBWVRBa05JTVJVd0V3WURWUVFLRXd4VGQybHpjMU5wWjI0Z1FVY3hLekFwQmdOVkJBTVRJbE4zYVhOelUybG5iaUJTVTBFZwpWRXhUSUZKdmIzUWdRMEVnTWpBeU1pQXRJREV3Z2dJaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQ0R3QXdnZ0lLQW9JQ0FRRExLbWppCkM4Tlh2RFZqdkhDbE8vT01QRTVYbG03RFRqYWs5Z0xLSHFxdXVONm9yeDEyMnJvMTBKRndCOSt6QnZLSzhpNVZVWHU3TENUTGY1SW0KZ0tPMGxQYUNvYVRvK25VZFdmTUhhbUZrNHNhTWxhK2p1NDV2VnM5eHpGNkJZUTF0OHFzQ0xxU1g1WEg4aXJDUklGdWNkRkp0cmhVbgpXWGp5Q2NwbERuL0w5T3ZuM0tsTWQvWXJGZ1NWcnB4eHBUOHEya0ZDNXp5RUVQVGhQWXhyNGl1UlIxVlB1RmErUmQ0aVVVMU9LTmxmCkdVRUdqdzVOQnVCd1FDTUJhdVRMRTV0enJFMFVTSkl0L20ybitJZHJlWFhodmhDeHFvaEFXVlRYejhUUW0wU3pPR2xraklIUkkzNnEKT1R3N0Q1OUtlNExLYTIvS0lqNHgwTERRS2h5U2lvL1lHWnhINUQ0TXVjTE52a0VNK0tSSEJkdkJGekE0T21uY3pjTnBJLzJhRHdMTwpFR3JPeXZpNUthTTJpWWF1QzhCUFk3a0dXVWxlRHNGcHN3cnpkMzR1bll5eko1alNtWTBscHgrR3M2WlVjRGo4ZlYzb1Q0TU0wWlBsCkV1UlUyajd5clRyZVBqeEY4Q2dQQnJuaDI1ZDdtVVdlM2Y2VldRUXZkVC9Ucm9tWmhxd1V0S2lFK3NoZE94dFlrOEVYbEZYSUMrT0MKZVlTZjh3Q0VOTzdjTWRXUDh2cFBsa3dHcW5qNzNtU2lJODBmUHNXTXZEZFVEcnRhY2xYdnlGdTFjdmg0M3pjZ1RGZVJjNUp6ckJoMwpRNElnYWV6cHJDbEc1UXRPK0RkemlaYUtIRzI5Nzc3WXR2VEt3UDFIOEs0TFdDREZ5QjAycnBlTlVJTW1KQ24zblRzUEJRSURBUUFCCm8yTXdZVEFQQmdOVkhSTUJBZjhFQlRBREFRSC9NQTRHQTFVZER3RUIvd1FFQXdJQkJqQWZCZ05WSFNNRUdEQVdnQlJ2am1LTGswT3cKNFVEMnA4UDk4USs0RHhVNHBUQWRCZ05WSFE0RUZnUVViNDVpaTVORHNPRkE5cWZEL2ZFUHVBOFZPS1V3RFFZSktvWklodmNOQVFFTApCUUFEZ2dJQkFLd3NLVUY5K2x6MUdwVVl2eXlwaXFra1ZIWDF1RUNyeTZna1VTc1lQMk9wcnBoV0t3VkRJcU8zMTBhZXdDb1NQWTZXCmxrRGZERE9MYXplUk9wVzdPU2x0d0FKc2lwUUxCd0pOR0Q3NyszdjFkajJiOWw0d0JsZ3pIcXA0MWVaVUJEcXlnZ21OemhZeldVVW8KOGFXamx3NURJLzBMSUlDUS8rTW16N2hra2VVRmp4T2dkZzNYTnd3UWlKYjBQcjZWdmZIRGZmQ2p3M2xIQzF5U0ZXUHRVbldLNTBacAp5MUZWQ3lwTTlmSmtUNmxjLzJjeWpsVXRNb0ljZ0M5cWtmakx2SDRZb2lhb0xxTlRLSWZ0VitWbGVrNEFTbHRPVThsaU5yM0NqbHZyCnpHNG5nUmhaaTBSam45VU1aZlFwWlgrUkxPVi9mdWlKejQ4Z3kyMEhRaEZSSmpLS0xqcEhFN2lOdlVjTkNmQVdwTzJXaGk0WjJMNk0KT3VoRkxoRzZybHJudWIreHpJL2dvUCs0czlHRmUzbG1vem0xTzJiWVFMN1B0MmVMU01rWkpWWDh2WTNQWHRwT3B2SnB6djEvVEhmUQp3VVkxbUZ3am13SkZRNVJhM2J4SHJTTCt1bDR2a1NrcGhuc2gzbTVrdDhzTmp6ZGJvd2hxNi9UZEFvOVFBd0t4dURkb2xsRHJ1Ri9VCktJcWxJZ3lLaFBCWkx0VTMwV0hsUW5OWUtvSDNkdHZpNGswTlgvYTN2Z1cwcms0TjNoWTlBNEd6Smw1THVFc0F6LytNRjdwc1lDMG4KaHpjazVucGdMN1hUZ3dTcVQwTjFvc0dEc2llWUs3RU9nTHJBaFY1Q3VkK3hZSkhUNnhoK2NIaXVkb08rY1ZyUWtPUEt3UllsWjBydwp0bnU2NFp6WgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCgpPSVNURSBTZXJ2ZXIgUm9vdCBFQ0MgRzEKPT09PT09PT09PT09PT09PT09PT09PT09Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDTlRDQ0FicWdBd0lCQWdJUUkvbkQxald2anloTEgvQlU2bjZYblRBS0JnZ3Foa2pPUFFRREF6QkxNUXN3Q1FZRFZRUUdFd0pEClNERVpNQmNHQTFVRUNnd1FUMGxUVkVVZ1JtOTFibVJoZEdsdmJqRWhNQjhHQTFVRUF3d1lUMGxUVkVVZ1UyVnlkbVZ5SUZKdmIzUWcKUlVORElFY3hNQjRYRFRJek1EVXpNVEUwTkRJeU9Gb1hEVFE0TURVeU5ERTBOREl5TjFvd1N6RUxNQWtHQTFVRUJoTUNRMGd4R1RBWApCZ05WQkFvTUVFOUpVMVJGSUVadmRXNWtZWFJwYjI0eElUQWZCZ05WQkFNTUdFOUpVMVJGSUZObGNuWmxjaUJTYjI5MElFVkRReUJICk1UQjJNQkFHQnlxR1NNNDlBZ0VHQlN1QkJBQWlBMklBQkJjditoSzhyQmp6Q3ZSRTFuWkNuclBvSDdkNXFWaTIrR1hST2lGUHFPdWoKdnFReWN2TzJBY2tyL1hlRmJsUGRyZXFxTGlXU3R1a2hFYWl2dFV3TDg1WmdtanZuNmhwNExyUTk1U2plSElDNlhHNE4yeG1sNHorYwpLcmhBUzkzbVQ2TmpNR0V3RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFmQmdOVkhTTUVHREFXZ0JRM1RZaGx6L3c5aXRXajhVbkFUZ3dRCmIwSzBuREFkQmdOVkhRNEVGZ1FVTjAySVpjLzhQWXJWby9GSndFNE1FRzlDdEp3d0RnWURWUjBQQVFIL0JBUURBZ0dHTUFvR0NDcUcKU000OUJBTURBMmtBTUdZQ01RQ3BLakFkME1LZmtGRlJRRDZWVkNITkZtYjNVMndJRmpuUUVueC9ZeHZmNHpnQU9ka3RVeUJGQ3h4ZwpaekZESmUwQ01RQ1NpYTdwWEdLRFltSDVMVmVyVnJrUjNTVythazVLR29KcjNNL1R2RXF6UE5jdW05djRLR204YXkzc01hRTY0MWM9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiBPSVNURSBTZXJ2ZXIgUm9vdCBSU0EgRzEKPT09PT09PT09PT09PT09PT09PT09PT09PQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRmd6Q0NBMnVnQXdJQkFnSVFWYVhaWjVRb3h1ME0raWZkV3dGTkdEQU5CZ2txaGtpRzl3MEJBUXdGQURCTE1Rc3dDUVlEVlFRRwpFd0pEU0RFWk1CY0dBMVVFQ2d3UVQwbFRWRVVnUm05MWJtUmhkR2x2YmpFaE1COEdBMVVFQXd3WVQwbFRWRVVnVTJWeWRtVnlJRkp2CmIzUWdVbE5CSUVjeE1CNFhEVEl6TURVek1URTBNemN4TmxvWERUUTRNRFV5TkRFME16Y3hOVm93U3pFTE1Ba0dBMVVFQmhNQ1EwZ3gKR1RBWEJnTlZCQW9NRUU5SlUxUkZJRVp2ZFc1a1lYUnBiMjR4SVRBZkJnTlZCQU1NR0U5SlUxUkZJRk5sY25abGNpQlNiMjkwSUZKVApRU0JITVRDQ0FpSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnSVBBRENDQWdvQ2dnSUJBS3F1OUt1Q3ovdmxOd3ZuMVphdGtPaExLZHhWCllPUE12TE84TFpLNTVLTjY4WUcwbm5KeVE5OC9xd3NtdE81N0dtbjdLTkJ5WEVwdGFabndZeDRNMHJILzFvdzAwTzdickVpNTZyQVUKanRnSHFTU1kzZWtKdnFnaUcxazUwU2VIM0J6TitQdXo2K21UZU8wUHpqZDhKbmR1b2Rnc0lVemtpay9IRXp4dXg5VVRsN0tvMnlScApnMWJUYWN1Q0VydWRHL0w0TlBLWUt5cU9CR2YyNDRlaEhhMXV6alowRGw0ek84dmJVWmVVYXBVOHpoaGFia3ZHL0FlUExocTVTdmRrCk5DbmNwbzFRNFkyTFMrVklHMjR1Z0JBLzVKOGJaVDhSdE9wWGFaKzBBT3VGSkprazlTR2RsNnI3Tkg4Q2F4V1FyYnVlV2hsL3BJelkKK20wby9Eakg0MHl0YXM3WlRwT1Nqc3dNWjc4TFM1Yk9abWRUYU1zWEVZNVo5NnljRzdtT2FFUzNHSy9tNVE5bDNKVUpzSk1TdFI4KwpsS1hIaUhVaHNkNEpKQ3BNNHJ6c1RHZEh3aW1JdVFxNitjRjB6b3dZSm1YYTkyL0dqSHRvWEF2dVk4QmVTL0ZPeko4dkQrSG9tbnFUCjhlREkyNzhuNW1VcGV6YmdNeFZ6OHAxcmhBaG9LellIS3lmTWVOaHFodzVIZFBTcW9CTmRaSDcwMnhTdSt6cmtMOEZsNDdsNlFHencKQnJkN0tKdlg0Vjg0YzVTczJYQ1RMZHlFcjBZY29ub3NQNEVtUXVmVTJNVnNoR1lSaTNkclZCeWp0ZGdROEs0cDkyY0lpQmRjdUpkNQp6K29yS3U1WU0rVnQ2U21xWlFFTmdoUHNKUXRkTEVCeUZTblRrQ3ozR2tQVmF2QnBBZ01CQUFHall6QmhNQThHQTFVZEV3RUIvd1FGCk1BTUJBZjh3SHdZRFZSMGpCQmd3Rm9BVThzbkJEdzFqQUx2c1JRNUtIN1d4c3piTkRvMHdIUVlEVlIwT0JCWUVGUExKd1E4Tll3QzcKN0VVT1NoKzFzYk0yelE2Tk1BNEdBMVVkRHdFQi93UUVBd0lCaGpBTkJna3Foa2lHOXcwQkFRd0ZBQU9DQWdFQU5HZDVzanJHNVQzMwpJM0s1Q2UrU3JTY2ZvRTRLc3ZYYUZ3eWloZEora2xIOUZXWFhYR3RrRnU2S1Jjb01RelpFTmRsLy9uazZIT2pHNUQxcmQ5UWhFT1AyCjh5Qk9xYjZKOHh5Y3FkKzhNRG9YMFRKRDBLcUtjaHhSS0V6ZE5zamtMV2Q5a1ljY25iejhxeWlXWG1GY3VDSXpHRWdXVU9yS0wrbWwKU2R4L1BLUVp2RGF0a3VLNTlFdlY2d2l0NTNqK0Y4QmRoM2ZvWjNkUEFHYXY5TEVET3I0U2ZFRTE1ZlNtRzBlTHkzbjMxcjhYYms1bAo4UGphVjhHVWdlVjZWZzI3Um45dmtmMTk1aGZrZ1NlN0JZaFczU0NsOTVndGtSbHBNVitiTVBLWnJYSkFsc3pZZDJhYnROVU9zaEQrCkZLckRnSEdkUFkzb2ZSUnNZV1NHUnFiWFZNVzIxNUFXUnFXRnlwNDY0K1lURnJZVkk4eXBLVkw5QU1iMmtJNVdqNGtJM1phcTV0TnEKcVlZMTl0VkZlRUpLUnZ3RHlGN1ladlpGWlNTMHZvZDdWU0NkOTUyMUt2eTVZaG5MYkR1djAyMDRiS3Q3cGg2Ti9PbWUvbXNWdWR1Qwptc3VZMzNPaGtLQ2d4ZURvQWFpakZKekl3WnFzRlZBemplMThLb3R6bFVCREp2eUJwQ3BmT1pDM0o4dFJkL2lXa3g3UDhuZDlIMGFUCm9sa2VsVVRGTFhWa3NOYjU0RHhwNmdTMUhBdmlSa1JOUXp1WFNYRVJ2U1Myd3ExeVZBYitheGo1ZDlzcExGS2ViWGQ3WXYwUFRZNlkKTWpBd2NSTFdKVFhqbi9odm5MWHJhaHV0NmhEVGxoWnlCaUVseGt5OGozQzdET1JlSW9NdDByNytoVnUwNUwwPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2FCdW5kbGU7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBocFByb2Nlc3M7CgoKCgoKY2xhc3MgQ2FCdW5kbGUKewoKcHJpdmF0ZSBzdGF0aWMgJGNhUGF0aDsKCnByaXZhdGUgc3RhdGljICRjYUZpbGVWYWxpZGl0eSA9IGFycmF5KCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRTeXN0ZW1DYVJvb3RCdW5kbGVQYXRoKD9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKaWYgKHNlbGY6OiRjYVBhdGggIT09IG51bGwpIHsKcmV0dXJuIHNlbGY6OiRjYVBhdGg7Cn0KJGNhQnVuZGxlUGF0aHMgPSBhcnJheSgpOwoKCgokY2FCdW5kbGVQYXRoc1tdID0gc2VsZjo6Z2V0RW52VmFyaWFibGUoJ1NTTF9DRVJUX0ZJTEUnKTsKCgoKJGNhQnVuZGxlUGF0aHNbXSA9IHNlbGY6OmdldEVudlZhcmlhYmxlKCdTU0xfQ0VSVF9ESVInKTsKCiRjYUJ1bmRsZVBhdGhzW10gPSBpbmlfZ2V0KCdvcGVuc3NsLmNhZmlsZScpOwokY2FCdW5kbGVQYXRoc1tdID0gaW5pX2dldCgnb3BlbnNzbC5jYXBhdGgnKTsKCiRvdGhlckxvY2F0aW9ucyA9IGFycmF5KAonL2V0Yy9wa2kvY2EtdHJ1c3QvZXh0cmFjdGVkL3BlbS90bHMtY2EtYnVuZGxlLnBlbScsIAonL2V0Yy9wa2kvdGxzL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9ldGMvc3NsL2NlcnRzL2NhLWNlcnRpZmljYXRlcy5jcnQnLCAKJy9ldGMvc3NsL2NhLWJ1bmRsZS5wZW0nLCAKJy91c3Ivc3NsL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9vcHQvbG9jYWwvc2hhcmUvY3VybC9jdXJsLWNhLWJ1bmRsZS5jcnQnLCAKJy91c3IvbG9jYWwvc2hhcmUvY3VybC9jdXJsLWNhLWJ1bmRsZS5jcnQnLCAKJy91c3Ivc2hhcmUvc3NsL2NlcnRzL2NhLWJ1bmRsZS5jcnQnLCAKJy9ldGMvc3NsL2NlcnQucGVtJywgCicvdXNyL2xvY2FsL2V0Yy9vcGVuc3NsL2NlcnQucGVtJywgCicvdXNyL2xvY2FsL2V0Yy9vcGVuc3NsQDEuMS9jZXJ0LnBlbScsIAonL29wdC9ob21lYnJldy9ldGMvb3BlbnNzbEAzL2NlcnQucGVtJywgCicvb3B0L2hvbWVicmV3L2V0Yy9vcGVuc3NsQDEuMS9jZXJ0LnBlbScsIAonL2V0Yy9wa2kvdGxzL2NlcnRzJywKJy9ldGMvc3NsL2NlcnRzJywgCik7CgokY2FCdW5kbGVQYXRocyA9IGFycmF5X21lcmdlKCRjYUJ1bmRsZVBhdGhzLCAkb3RoZXJMb2NhdGlvbnMpOwoKZm9yZWFjaCAoJGNhQnVuZGxlUGF0aHMgYXMgJGNhQnVuZGxlKSB7CmlmICgkY2FCdW5kbGUgJiYgc2VsZjo6Y2FGaWxlVXNhYmxlKCRjYUJ1bmRsZSwgJGxvZ2dlcikpIHsKcmV0dXJuIHNlbGY6OiRjYVBhdGggPSAkY2FCdW5kbGU7Cn0KCmlmICgkY2FCdW5kbGUgJiYgc2VsZjo6Y2FEaXJVc2FibGUoJGNhQnVuZGxlLCAkbG9nZ2VyKSkgewpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9ICRjYUJ1bmRsZTsKfQp9CgpyZXR1cm4gc2VsZjo6JGNhUGF0aCA9IHN0YXRpYzo6Z2V0QnVuZGxlZENhQnVuZGxlUGF0aCgpOyAKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QnVuZGxlZENhQnVuZGxlUGF0aCgpCnsKJGNhQnVuZGxlRmlsZSA9IF9fRElSX18uJy8uLi9yZXMvY2FjZXJ0LnBlbSc7CgoKCmlmICgwID09PSBzdHJwb3MoJGNhQnVuZGxlRmlsZSwgJ3BoYXI6Ly8nKSkgewokdGVtcENhQnVuZGxlRmlsZSA9IHRlbXBuYW0oc3lzX2dldF90ZW1wX2RpcigpLCAnb3BlbnNzbC1jYS1idW5kbGUtJyk7CmlmIChmYWxzZSA9PT0gJHRlbXBDYUJ1bmRsZUZpbGUpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgdG8gc3RvcmUgdGhlIGJ1bmRsZWQgQ0EgZmlsZScpOwp9CgpmaWxlX3B1dF9jb250ZW50cygKJHRlbXBDYUJ1bmRsZUZpbGUsCmZpbGVfZ2V0X2NvbnRlbnRzKCRjYUJ1bmRsZUZpbGUpCik7CgpyZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihmdW5jdGlvbigpIHVzZSAoJHRlbXBDYUJ1bmRsZUZpbGUpIHsKQHVubGluaygkdGVtcENhQnVuZGxlRmlsZSk7Cn0pOwoKJGNhQnVuZGxlRmlsZSA9ICR0ZW1wQ2FCdW5kbGVGaWxlOwp9CgpyZXR1cm4gJGNhQnVuZGxlRmlsZTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlQ2FGaWxlKCRmaWxlbmFtZSwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewpzdGF0aWMgJHdhcm5lZCA9IGZhbHNlOwoKaWYgKGlzc2V0KHNlbGY6OiRjYUZpbGVWYWxpZGl0eVskZmlsZW5hbWVdKSkgewpyZXR1cm4gc2VsZjo6JGNhRmlsZVZhbGlkaXR5WyRmaWxlbmFtZV07Cn0KCiRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSk7CgppZiAoaXNfc3RyaW5nKCRjb250ZW50cykgJiYgc3RybGVuKCRjb250ZW50cykgPiAwKSB7CiRjb250ZW50cyA9IHByZWdfcmVwbGFjZSgiL14oXFwtKyg/OkJFR0lOfEVORCkpXFxzK1RSVVNURURcXHMrKENFUlRJRklDQVRFXFwtKylcJC9tIiwgJyQxICQyJywgJGNvbnRlbnRzKTsKaWYgKG51bGwgPT09ICRjb250ZW50cykgewoKJGlzVmFsaWQgPSBmYWxzZTsKfSBlbHNlIHsKJGlzVmFsaWQgPSAoYm9vbCkgb3BlbnNzbF94NTA5X3BhcnNlKCRjb250ZW50cyk7Cn0KfSBlbHNlIHsKJGlzVmFsaWQgPSBmYWxzZTsKfQoKaWYgKCRsb2dnZXIpIHsKJGxvZ2dlci0+ZGVidWcoJ0NoZWNrZWQgQ0EgZmlsZSAnLnJlYWxwYXRoKCRmaWxlbmFtZSkuJzogJy4oJGlzVmFsaWQgPyAndmFsaWQnIDogJ2ludmFsaWQnKSk7Cn0KCnJldHVybiBzZWxmOjokY2FGaWxlVmFsaWRpdHlbJGZpbGVuYW1lXSA9ICRpc1ZhbGlkOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNPcGVuc3NsUGFyc2VTYWZlKCkKewpyZXR1cm4gdHJ1ZTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzZXQoKQp7CnNlbGY6OiRjYUZpbGVWYWxpZGl0eSA9IGFycmF5KCk7CnNlbGY6OiRjYVBhdGggPSBudWxsOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RW52VmFyaWFibGUoJG5hbWUpCnsKaWYgKGlzc2V0KCRfU0VSVkVSWyRuYW1lXSkpIHsKcmV0dXJuIChzdHJpbmcpICRfU0VSVkVSWyRuYW1lXTsKfQoKaWYgKFBIUF9TQVBJID09PSAnY2xpJyAmJiAoJHZhbHVlID0gZ2V0ZW52KCRuYW1lKSkgIT09IGZhbHNlICYmICR2YWx1ZSAhPT0gbnVsbCkgewpyZXR1cm4gKHN0cmluZykgJHZhbHVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2FGaWxlVXNhYmxlKCRjZXJ0RmlsZSwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewpyZXR1cm4gJGNlcnRGaWxlCiYmIHNlbGY6OmlzRmlsZSgkY2VydEZpbGUsICRsb2dnZXIpCiYmIHNlbGY6OmlzUmVhZGFibGUoJGNlcnRGaWxlLCAkbG9nZ2VyKQomJiBzZWxmOjp2YWxpZGF0ZUNhRmlsZSgkY2VydEZpbGUsICRsb2dnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNhRGlyVXNhYmxlKCRjZXJ0RGlyLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CnJldHVybiAkY2VydERpcgomJiBzZWxmOjppc0RpcigkY2VydERpciwgJGxvZ2dlcikKJiYgc2VsZjo6aXNSZWFkYWJsZSgkY2VydERpciwgJGxvZ2dlcikKJiYgc2VsZjo6Z2xvYigkY2VydERpciAuICcvKicsICRsb2dnZXIpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzRmlsZSgkY2VydEZpbGUsID9Mb2dnZXJJbnRlcmZhY2UgJGxvZ2dlciA9IG51bGwpCnsKJGlzRmlsZSA9IEBpc19maWxlKCRjZXJ0RmlsZSk7CmlmICghJGlzRmlsZSAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoJ0NoZWNrZWQgQ0EgZmlsZSAlcyBkb2VzIG5vdCBleGlzdCBvciBpdCBpcyBub3QgYSBmaWxlLicsICRjZXJ0RmlsZSkpOwp9CgpyZXR1cm4gJGlzRmlsZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc0RpcigkY2VydERpciwgP0xvZ2dlckludGVyZmFjZSAkbG9nZ2VyID0gbnVsbCkKewokaXNEaXIgPSBAaXNfZGlyKCRjZXJ0RGlyKTsKaWYgKCEkaXNEaXIgJiYgJGxvZ2dlcikgewokbG9nZ2VyLT5kZWJ1ZyhzcHJpbnRmKCdDaGVja2VkIGRpcmVjdG9yeSAlcyBkb2VzIG5vdCBleGlzdCBvciBpdCBpcyBub3QgYSBkaXJlY3RvcnkuJywgJGNlcnREaXIpKTsKfQoKcmV0dXJuICRpc0RpcjsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1JlYWRhYmxlKCRjZXJ0RmlsZU9yRGlyLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiRpc1JlYWRhYmxlID0gQGlzX3JlYWRhYmxlKCRjZXJ0RmlsZU9yRGlyKTsKaWYgKCEkaXNSZWFkYWJsZSAmJiAkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoJ0NoZWNrZWQgZmlsZSBvciBkaXJlY3RvcnkgJXMgaXMgbm90IHJlYWRhYmxlLicsICRjZXJ0RmlsZU9yRGlyKSk7Cn0KCnJldHVybiAkaXNSZWFkYWJsZTsKfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnbG9iKCRwYXR0ZXJuLCA/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiRjZXJ0cyA9IGdsb2IoJHBhdHRlcm4pOwppZiAoJGNlcnRzID09PSBmYWxzZSkgewppZiAoJGxvZ2dlcikgewokbG9nZ2VyLT5kZWJ1ZyhzcHJpbnRmKCJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZmluZCBjZXJ0aWZpY2F0ZXMgZm9yIHBhdHRlcm46ICVzIiwgJHBhdHRlcm4pKTsKfQpyZXR1cm4gZmFsc2U7Cn0KCmlmIChjb3VudCgkY2VydHMpID09PSAwKSB7CmlmICgkbG9nZ2VyKSB7CiRsb2dnZXItPmRlYnVnKHNwcmludGYoIk5vIENBIGZpbGVzIGZvdW5kIGZvciBwYXR0ZXJuOiAlcyIsICRwYXR0ZXJuKSk7Cn0KcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9CgpDb3B5cmlnaHQgKEMpIDIwMjIgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwoKCgoKY2xhc3MgQ2xhc3NNYXAgaW1wbGVtZW50cyBcQ291bnRhYmxlCnsKCgoKcHVibGljICRtYXAgPSBbXTsKCgoKCnByaXZhdGUgJGFtYmlndW91c0NsYXNzZXMgPSBbXTsKCgoKCnByaXZhdGUgJHBzclZpb2xhdGlvbnMgPSBbXTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE1hcCgpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+bWFwOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQc3JWaW9sYXRpb25zKCk6IGFycmF5CnsKaWYgKFxjb3VudCgkdGhpcy0+cHNyVmlvbGF0aW9ucykgPT09IDApIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoYXJyYXkgJHZpb2xhdGlvbik6IHN0cmluZyB7CnJldHVybiAkdmlvbGF0aW9uWyd3YXJuaW5nJ107Cn0sIGFycmF5X21lcmdlKC4uLmFycmF5X3ZhbHVlcygkdGhpcy0+cHNyVmlvbGF0aW9ucykpKTsKfQoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbWJpZ3VvdXNDbGFzc2VzKCRkdXBsaWNhdGVzRmlsdGVyID0gJ3svKHRlc3R8Zml4dHVyZXxleGFtcGxlfHN0dWIpcz8vfWknKTogYXJyYXkKewppZiAoZmFsc2UgPT09ICRkdXBsaWNhdGVzRmlsdGVyKSB7CnJldHVybiAkdGhpcy0+YW1iaWd1b3VzQ2xhc3NlczsKfQoKaWYgKHRydWUgPT09ICRkdXBsaWNhdGVzRmlsdGVyKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckZHVwbGljYXRlc0ZpbHRlciBzaG91bGQgYmUgZmFsc2Ugb3IgYSBzdHJpbmcgd2l0aCBhIHZhbGlkIHJlZ2V4LCBnb3QgdHJ1ZS4nKTsKfQoKJGFtYmlndW91c0NsYXNzZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmFtYmlndW91c0NsYXNzZXMgYXMgJGNsYXNzID0+ICRwYXRocykgewokcGF0aHMgPSBhcnJheV9maWx0ZXIoJHBhdGhzLCBmdW5jdGlvbiAoJHBhdGgpIHVzZSAoJGR1cGxpY2F0ZXNGaWx0ZXIpOiBib29sIHsKcmV0dXJuICFQcmVnOjppc01hdGNoKCRkdXBsaWNhdGVzRmlsdGVyLCBzdHJ0cigkcGF0aCwgJ1xcJywgJy8nKSk7Cn0pOwppZiAoXGNvdW50KCRwYXRocykgPiAwKSB7CiRhbWJpZ3VvdXNDbGFzc2VzWyRjbGFzc10gPSBhcnJheV92YWx1ZXMoJHBhdGhzKTsKfQp9CgpyZXR1cm4gJGFtYmlndW91c0NsYXNzZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0KCk6IHZvaWQKewprc29ydCgkdGhpcy0+bWFwKTsKfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CnVuc2V0KCR0aGlzLT5wc3JWaW9sYXRpb25zW3N0cnRyKCRwYXRoLCAnXFwnLCAnLycpXSk7CgokdGhpcy0+bWFwWyRjbGFzc05hbWVdID0gJHBhdGg7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2xhc3NQYXRoKHN0cmluZyAkY2xhc3NOYW1lKTogc3RyaW5nCnsKaWYgKCFpc3NldCgkdGhpcy0+bWFwWyRjbGFzc05hbWVdKSkgewp0aHJvdyBuZXcgXE91dE9mQm91bmRzRXhjZXB0aW9uKCdDbGFzcyAnLiRjbGFzc05hbWUuJyBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWFwJyk7Cn0KCnJldHVybiAkdGhpcy0+bWFwWyRjbGFzc05hbWVdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzQ2xhc3Moc3RyaW5nICRjbGFzc05hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5tYXBbJGNsYXNzTmFtZV0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkUHNyVmlvbGF0aW9uKHN0cmluZyAkd2FybmluZywgc3RyaW5nICRjbGFzc05hbWUsIHN0cmluZyAkcGF0aCk6IHZvaWQKewokcGF0aCA9IHJ0cmltKHN0cnRyKCRwYXRoLCAnXFwnLCAnLycpLCAnLycpOwoKJHRoaXMtPnBzclZpb2xhdGlvbnNbJHBhdGhdW10gPSBbJ3dhcm5pbmcnID0+ICR3YXJuaW5nLCAnY2xhc3NOYW1lJyA9PiAkY2xhc3NOYW1lXTsKfQoKcHVibGljIGZ1bmN0aW9uIGNsZWFyUHNyVmlvbGF0aW9uc0J5UGF0aChzdHJpbmcgJHBhdGhQcmVmaXgpOiB2b2lkCnsKJHBhdGhQcmVmaXggPSBydHJpbShzdHJ0cigkcGF0aFByZWZpeCwgJ1xcJywgJy8nKSwgJy8nKTsKCmZvcmVhY2ggKCR0aGlzLT5wc3JWaW9sYXRpb25zIGFzICRwYXRoID0+ICR2aW9sYXRpb25zKSB7CmlmICgkcGF0aCA9PT0gJHBhdGhQcmVmaXggfHwgMCA9PT0gXHN0cnBvcygkcGF0aCwgJHBhdGhQcmVmaXguJy8nKSkgewp1bnNldCgkdGhpcy0+cHNyVmlvbGF0aW9uc1skcGF0aF0pOwp9Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBbWJpZ3VvdXNDbGFzcyhzdHJpbmcgJGNsYXNzTmFtZSwgc3RyaW5nICRwYXRoKTogdm9pZAp7CiR0aGlzLT5hbWJpZ3VvdXNDbGFzc2VzWyRjbGFzc05hbWVdW10gPSAkcGF0aDsKfQoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiBcY291bnQoJHRoaXMtPm1hcCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UmF3UHNyVmlvbGF0aW9ucygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+cHNyVmlvbGF0aW9uczsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxDbGFzc01hcEdlbmVyYXRvcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRmluZGVyOwp1c2UgQ29tcG9zZXJcSU9cSU9JbnRlcmZhY2U7CgoKCgoKCgpjbGFzcyBDbGFzc01hcEdlbmVyYXRvcgp7CgoKCnByaXZhdGUgJGV4dGVuc2lvbnM7CgoKCgpwcml2YXRlICRzY2FubmVkRmlsZXMgPSBudWxsOwoKCgoKcHJpdmF0ZSAkY2xhc3NNYXA7CgoKCgpwcml2YXRlICRzdHJlYW1XcmFwcGVyc1JlZ2V4OwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRleHRlbnNpb25zID0gWydwaHAnLCAnaW5jJ10pCnsKJHRoaXMtPmV4dGVuc2lvbnMgPSAkZXh0ZW5zaW9uczsKJHRoaXMtPmNsYXNzTWFwID0gbmV3IENsYXNzTWFwOwokdGhpcy0+c3RyZWFtV3JhcHBlcnNSZWdleCA9IHNwcmludGYoJ3teKD86JXMpOi8vfScsIGltcGxvZGUoJ3wnLCBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBzdHJlYW1fZ2V0X3dyYXBwZXJzKCkpKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXZvaWREdXBsaWNhdGVTY2Fucyg/RmlsZUxpc3QgJHNjYW5uZWRGaWxlcyA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPnNjYW5uZWRGaWxlcyA9ICRzY2FubmVkRmlsZXMgPz8gbmV3IEZpbGVMaXN0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlTWFwKCRwYXRoKTogYXJyYXkKewokZ2VuZXJhdG9yID0gbmV3IHNlbGYoKTsKCiRnZW5lcmF0b3ItPnNjYW5QYXRocygkcGF0aCk7CgpyZXR1cm4gJGdlbmVyYXRvci0+Z2V0Q2xhc3NNYXAoKS0+Z2V0TWFwKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRDbGFzc01hcCgpOiBDbGFzc01hcAp7CnJldHVybiAkdGhpcy0+Y2xhc3NNYXA7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNjYW5QYXRocygkcGF0aCwgP3N0cmluZyAkZXhjbHVkZWQgPSBudWxsLCBzdHJpbmcgJGF1dG9sb2FkVHlwZSA9ICdjbGFzc21hcCcsID9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwsIGFycmF5ICRleGNsdWRlZERpcnMgPSBbXSk6IHZvaWQKewppZiAoIWluX2FycmF5KCRhdXRvbG9hZFR5cGUsIFsncHNyLTAnLCAncHNyLTQnLCAnY2xhc3NtYXAnXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRhdXRvbG9hZFR5cGUgbXVzdCBiZSBvbmUgb2Y6ICJwc3ItMCIsICJwc3ItNCIgb3IgImNsYXNzbWFwIicpOwp9CgppZiAoJ2NsYXNzbWFwJyAhPT0gJGF1dG9sb2FkVHlwZSkgewppZiAoIWlzX3N0cmluZygkcGF0aCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJyRwYXRoIG11c3QgYmUgYSBzdHJpbmcgd2hlbiBzcGVjaWZ5aW5nIGEgcHNyLTAgb3IgcHNyLTQgYXV0b2xvYWQgdHlwZScpOwp9CmlmICghaXNfc3RyaW5nKCRuYW1lc3BhY2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckbmFtZXNwYWNlIG11c3QgYmUgZ2l2ZW4gKGV2ZW4gaWYgaXQgaXMgYW4gZW1wdHkgc3RyaW5nIGlmIHlvdSBkbyBub3Qgd2FudCB0byBmaWx0ZXIpIHdoZW4gc3BlY2lmeWluZyBhIHBzci0wIG9yIHBzci00IGF1dG9sb2FkIHR5cGUnKTsKfQokYmFzZVBhdGggPSAkcGF0aDsKfQoKaWYgKGlzX3N0cmluZygkcGF0aCkpIHsKaWYgKGlzX2ZpbGUoJHBhdGgpKSB7CiRwYXRoID0gW25ldyBcU3BsRmlsZUluZm8oJHBhdGgpXTsKfSBlbHNlaWYgKGlzX2RpcigkcGF0aCkgfHwgc3RycG9zKCRwYXRoLCAnKicpICE9PSBmYWxzZSkgewokcGF0aCA9IEZpbmRlcjo6Y3JlYXRlKCkKLT5maWxlcygpCi0+Zm9sbG93TGlua3MoKQotPm5hbWUoJy9cLig/OicuaW1wbG9kZSgnfCcsIGFycmF5X21hcCgncHJlZ19xdW90ZScsICR0aGlzLT5leHRlbnNpb25zKSkuJykkLycpCi0+aW4oJHBhdGgpCi0+ZXhjbHVkZSgkZXhjbHVkZWREaXJzKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKAonQ291bGQgbm90IHNjYW4gZm9yIGNsYXNzZXMgaW5zaWRlICInLiRwYXRoLiciIHdoaWNoIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGZpbGUgbm9yIGEgZm9sZGVyJwopOwp9Cn0KCiRjd2QgPSByZWFscGF0aChzZWxmOjpnZXRDd2QoKSk7Cgpmb3JlYWNoICgkcGF0aCBhcyAkZmlsZSkgewokZmlsZVBhdGggPSAkZmlsZS0+Z2V0UGF0aG5hbWUoKTsKaWYgKCFpbl9hcnJheShwYXRoaW5mbygkZmlsZVBhdGgsIFBBVEhJTkZPX0VYVEVOU0lPTiksICR0aGlzLT5leHRlbnNpb25zLCB0cnVlKSkgewpjb250aW51ZTsKfQoKJGlzU3RyZWFtV3JhcHBlclBhdGggPSBQcmVnOjppc01hdGNoKCR0aGlzLT5zdHJlYW1XcmFwcGVyc1JlZ2V4LCAkZmlsZVBhdGgpOwppZiAoIXNlbGY6OmlzQWJzb2x1dGVQYXRoKCRmaWxlUGF0aCkgJiYgISRpc1N0cmVhbVdyYXBwZXJQYXRoKSB7CiRmaWxlUGF0aCA9ICRjd2QgLiAnLycgLiAkZmlsZVBhdGg7CiRmaWxlUGF0aCA9IHNlbGY6Om5vcm1hbGl6ZVBhdGgoJGZpbGVQYXRoKTsKfSBlbHNlIHsKJGZpbGVQYXRoID0gUHJlZzo6cmVwbGFjZSgneyg/PCE6KVtcXFxcL117Mix9fScsICcvJywgJGZpbGVQYXRoKTsKfQoKaWYgKCcnID09PSAkZmlsZVBhdGgpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignR290IGFuIGVtcHR5ICRmaWxlUGF0aCBmb3IgJy4kZmlsZS0+Z2V0UGF0aG5hbWUoKSk7Cn0KCiRyZWFsUGF0aCA9ICRpc1N0cmVhbVdyYXBwZXJQYXRoCj8gJGZpbGVQYXRoCjogcmVhbHBhdGgoJGZpbGVQYXRoKTsKCgppZiAoZmFsc2UgPT09ICRyZWFsUGF0aCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ3JlYWxwYXRoIG9mICcuJGZpbGVQYXRoLicgZmFpbGVkIHRvIHJlc29sdmUsIGdvdCBmYWxzZScpOwp9CgoKCmlmICgkdGhpcy0+c2Nhbm5lZEZpbGVzICE9PSBudWxsICYmICR0aGlzLT5zY2FubmVkRmlsZXMtPmNvbnRhaW5zKCRyZWFsUGF0aCkpIHsKY29udGludWU7Cn0KCgppZiAobnVsbCAhPT0gJGV4Y2x1ZGVkICYmIFByZWc6OmlzTWF0Y2goJGV4Y2x1ZGVkLCBzdHJ0cigkcmVhbFBhdGgsICdcXCcsICcvJykpKSB7CmNvbnRpbnVlOwp9CgppZiAobnVsbCAhPT0gJGV4Y2x1ZGVkICYmIFByZWc6OmlzTWF0Y2goJGV4Y2x1ZGVkLCBzdHJ0cigkZmlsZVBhdGgsICdcXCcsICcvJykpKSB7CmNvbnRpbnVlOwp9CgokY2xhc3NlcyA9IFBocEZpbGVQYXJzZXI6OmZpbmRDbGFzc2VzKCRmaWxlUGF0aCk7CmlmICgnY2xhc3NtYXAnICE9PSAkYXV0b2xvYWRUeXBlICYmIGlzc2V0KCRuYW1lc3BhY2UpKSB7CiRjbGFzc2VzID0gJHRoaXMtPmZpbHRlckJ5TmFtZXNwYWNlKCRjbGFzc2VzLCAkZmlsZVBhdGgsICRuYW1lc3BhY2UsICRhdXRvbG9hZFR5cGUsICRiYXNlUGF0aCk7CgoKaWYgKFxjb3VudCgkY2xhc3NlcykgPiAwICYmICR0aGlzLT5zY2FubmVkRmlsZXMgIT09IG51bGwpIHsKJHRoaXMtPnNjYW5uZWRGaWxlcy0+YWRkKCRyZWFsUGF0aCk7Cn0KfSBlbHNlaWYgKCR0aGlzLT5zY2FubmVkRmlsZXMgIT09IG51bGwpIHsKCiR0aGlzLT5zY2FubmVkRmlsZXMtPmFkZCgkcmVhbFBhdGgpOwp9Cgpmb3JlYWNoICgkY2xhc3NlcyBhcyAkY2xhc3MpIHsKaWYgKCEkdGhpcy0+Y2xhc3NNYXAtPmhhc0NsYXNzKCRjbGFzcykpIHsKJHRoaXMtPmNsYXNzTWFwLT5hZGRDbGFzcygkY2xhc3MsICRmaWxlUGF0aCk7Cn0gZWxzZWlmICgkZmlsZVBhdGggIT09ICR0aGlzLT5jbGFzc01hcC0+Z2V0Q2xhc3NQYXRoKCRjbGFzcykpIHsKJHRoaXMtPmNsYXNzTWFwLT5hZGRBbWJpZ3VvdXNDbGFzcygkY2xhc3MsICRmaWxlUGF0aCk7Cn0KfQp9Cn0KCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsdGVyQnlOYW1lc3BhY2UoYXJyYXkgJGNsYXNzZXMsIHN0cmluZyAkZmlsZVBhdGgsIHN0cmluZyAkYmFzZU5hbWVzcGFjZSwgc3RyaW5nICRuYW1lc3BhY2VUeXBlLCBzdHJpbmcgJGJhc2VQYXRoKTogYXJyYXkKewokdmFsaWRDbGFzc2VzID0gW107CiRyZWplY3RlZENsYXNzZXMgPSBbXTsKCiRyZWFsU3ViUGF0aCA9IHN1YnN0cigkZmlsZVBhdGgsIHN0cmxlbigkYmFzZVBhdGgpICsgMSk7CiRkb3RQb3NpdGlvbiA9IHN0cnJwb3MoJHJlYWxTdWJQYXRoLCAnLicpOwokcmVhbFN1YlBhdGggPSBzdWJzdHIoJHJlYWxTdWJQYXRoLCAwLCAkZG90UG9zaXRpb24gPT09IGZhbHNlID8gUEhQX0lOVF9NQVggOiAkZG90UG9zaXRpb24pOwoKZm9yZWFjaCAoJGNsYXNzZXMgYXMgJGNsYXNzKSB7CgppZiAoJ3Bzci0wJyA9PT0gJG5hbWVzcGFjZVR5cGUpIHsKJG5hbWVzcGFjZUxlbmd0aCA9IHN0cnJwb3MoJGNsYXNzLCAnXFwnKTsKaWYgKGZhbHNlICE9PSAkbmFtZXNwYWNlTGVuZ3RoKSB7CiRuYW1lc3BhY2UgPSBzdWJzdHIoJGNsYXNzLCAwLCAkbmFtZXNwYWNlTGVuZ3RoICsgMSk7CiRjbGFzc05hbWUgPSBzdWJzdHIoJGNsYXNzLCAkbmFtZXNwYWNlTGVuZ3RoICsgMSk7CiRzdWJQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJG5hbWVzcGFjZSkKLiBzdHJfcmVwbGFjZSgnXycsIERJUkVDVE9SWV9TRVBBUkFUT1IsICRjbGFzc05hbWUpOwp9IGVsc2Ugewokc3ViUGF0aCA9IHN0cl9yZXBsYWNlKCdfJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJGNsYXNzKTsKfQp9IGVsc2VpZiAoJ3Bzci00JyA9PT0gJG5hbWVzcGFjZVR5cGUpIHsKJHN1Yk5hbWVzcGFjZSA9ICgnJyAhPT0gJGJhc2VOYW1lc3BhY2UpID8gc3Vic3RyKCRjbGFzcywgc3RybGVuKCRiYXNlTmFtZXNwYWNlKSkgOiAkY2xhc3M7CiRzdWJQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgRElSRUNUT1JZX1NFUEFSQVRPUiwgJHN1Yk5hbWVzcGFjZSk7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCckbmFtZXNwYWNlVHlwZSBtdXN0IGJlICJwc3ItMCIgb3IgInBzci00IicpOwp9CmlmICgkc3ViUGF0aCA9PT0gJHJlYWxTdWJQYXRoKSB7CiR2YWxpZENsYXNzZXNbXSA9ICRjbGFzczsKfSBlbHNlIHsKJHJlamVjdGVkQ2xhc3Nlc1tdID0gJGNsYXNzOwp9Cn0KCmlmIChcY291bnQoJHZhbGlkQ2xhc3NlcykgPT09IDApIHsKJGN3ZCA9IHJlYWxwYXRoKHNlbGY6OmdldEN3ZCgpKTsKaWYgKCRjd2QgPT09IGZhbHNlKSB7CiRjd2QgPSBzZWxmOjpnZXRDd2QoKTsKfQokY3dkID0gc2VsZjo6bm9ybWFsaXplUGF0aCgkY3dkKTsKJHNob3J0UGF0aCA9IFByZWc6OnJlcGxhY2UoJ3teJy5wcmVnX3F1b3RlKCRjd2QpLid9JywgJy4nLCBzZWxmOjpub3JtYWxpemVQYXRoKCRmaWxlUGF0aCksIDEpOwokc2hvcnRCYXNlUGF0aCA9IFByZWc6OnJlcGxhY2UoJ3teJy5wcmVnX3F1b3RlKCRjd2QpLid9JywgJy4nLCBzZWxmOjpub3JtYWxpemVQYXRoKCRiYXNlUGF0aCksIDEpOwoKZm9yZWFjaCAoJHJlamVjdGVkQ2xhc3NlcyBhcyAkY2xhc3MpIHsKJHRoaXMtPmNsYXNzTWFwLT5hZGRQc3JWaW9sYXRpb24oIkNsYXNzICRjbGFzcyBsb2NhdGVkIGluICRzaG9ydFBhdGggZG9lcyBub3QgY29tcGx5IHdpdGggJG5hbWVzcGFjZVR5cGUgYXV0b2xvYWRpbmcgc3RhbmRhcmQgKHJ1bGU6ICRiYXNlTmFtZXNwYWNlID0+ICRzaG9ydEJhc2VQYXRoKS4gU2tpcHBpbmcuIiwgJGNsYXNzLCAkZmlsZVBhdGgpOwp9CgpyZXR1cm4gW107Cn0KCnJldHVybiAkdmFsaWRDbGFzc2VzOwp9CgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzQWJzb2x1dGVQYXRoKHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gc3RycG9zKCRwYXRoLCAnLycpID09PSAwIHx8IHN1YnN0cigkcGF0aCwgMSwgMSkgPT09ICc6JyB8fCBzdHJwb3MoJHBhdGgsICdcXFxcJykgPT09IDA7Cn0KCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKJHBhcnRzID0gW107CiRwYXRoID0gc3RydHIoJHBhdGgsICdcXCcsICcvJyk7CiRwcmVmaXggPSAnJzsKJGFic29sdXRlID0gJyc7CgoKaWYgKHN0cnBvcygkcGF0aCwgJy8vJykgPT09IDAgJiYgXHN0cmxlbigkcGF0aCkgPiAyKSB7CiRhYnNvbHV0ZSA9ICcvLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAyKTsKfQoKCmlmIChQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCd7XiggWzAtOWEtel17Mix9KzogKD86IC8vICg/OiBbYS16XTogKT8gKT8gfCBbYS16XTogKX1peCcsICRwYXRoLCAkbWF0Y2gpKSB7CiRwcmVmaXggPSAkbWF0Y2hbMV07CiRwYXRoID0gc3Vic3RyKCRwYXRoLCBcc3RybGVuKCRwcmVmaXgpKTsKfQoKaWYgKHN0cnBvcygkcGF0aCwgJy8nKSA9PT0gMCkgewokYWJzb2x1dGUgPSAnLyc7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAxKTsKfQoKJHVwID0gZmFsc2U7CmZvcmVhY2ggKGV4cGxvZGUoJy8nLCAkcGF0aCkgYXMgJGNodW5rKSB7CmlmICgnLi4nID09PSAkY2h1bmsgJiYgKFxzdHJsZW4oJGFic29sdXRlKSA+IDAgfHwgJHVwKSkgewphcnJheV9wb3AoJHBhcnRzKTsKJHVwID0gIShcY291bnQoJHBhcnRzKSA9PT0gMCB8fCAnLi4nID09PSBlbmQoJHBhcnRzKSk7Cn0gZWxzZWlmICgnLicgIT09ICRjaHVuayAmJiAnJyAhPT0gJGNodW5rKSB7CiRwYXJ0c1tdID0gJGNodW5rOwokdXAgPSAnLi4nICE9PSAkY2h1bms7Cn0KfQoKCiRwcmVmaXggPSBQcmVnOjpyZXBsYWNlQ2FsbGJhY2soJ3soPzpefDovLylbYS16XTokfWknLCBmdW5jdGlvbiAoYXJyYXkgJG0pIHsgcmV0dXJuIHN0cnRvdXBwZXIoKHN0cmluZykgJG1bMF0pOyB9LCAkcHJlZml4KTsKCnJldHVybiAkcHJlZml4LiRhYnNvbHV0ZS5pbXBsb2RlKCcvJywgJHBhcnRzKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0Q3dkKCk6IHN0cmluZwp7CiRjd2QgPSBnZXRjd2QoKTsKCmlmIChmYWxzZSA9PT0gJGN3ZCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnknKTsKfQoKcmV0dXJuICRjd2Q7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7CgoKCgoKCmNsYXNzIEZpbGVMaXN0CnsKCgoKcHVibGljICRmaWxlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZChzdHJpbmcgJHBhdGgpOiB2b2lkCnsKJHRoaXMtPmZpbGVzWyRwYXRoXSA9IHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucyhzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5maWxlc1skcGF0aF0pOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXENsYXNzTWFwR2VuZXJhdG9yOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCgpjbGFzcyBQaHBGaWxlQ2xlYW5lcgp7Cgpwcml2YXRlIHN0YXRpYyAkdHlwZUNvbmZpZzsKCgpwcml2YXRlIHN0YXRpYyAkcmVzdFBhdHRlcm47CgoKCgoKcHJpdmF0ZSAkY29udGVudHM7CgoKCgoKcHJpdmF0ZSAkbGVuOwoKCgoKCnByaXZhdGUgJG1heE1hdGNoZXM7CgoKcHJpdmF0ZSAkaW5kZXggPSAwOwoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRUeXBlQ29uZmlnKGFycmF5ICR0eXBlcyk6IHZvaWQKewpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKc2VsZjo6JHR5cGVDb25maWdbJHR5cGVbMF1dID0gWwonbmFtZScgPT4gJHR5cGUsCidsZW5ndGgnID0+IFxzdHJsZW4oJHR5cGUpLAoncGF0dGVybicgPT4gJ3suXGIoPzwhW1wkOj5dKScuJHR5cGUuJ1xzKytbYS16QS1aX1x4N2YtXHhmZjpdW2EtekEtWjAtOV9ceDdmLVx4ZmY6XC1dKit9QWlzJywKXTsKfQoKc2VsZjo6JHJlc3RQYXR0ZXJuID0gJ3tbXj8iXCc8LycuaW1wbG9kZSgnJywgYXJyYXlfa2V5cyhzZWxmOjokdHlwZUNvbmZpZykpLiddK31BJzsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkY29udGVudHMsIGludCAkbWF4TWF0Y2hlcykKewokdGhpcy0+Y29udGVudHMgPSAkY29udGVudHM7CiR0aGlzLT5sZW4gPSBcc3RybGVuKCR0aGlzLT5jb250ZW50cyk7CiR0aGlzLT5tYXhNYXRjaGVzID0gJG1heE1hdGNoZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjbGVhbigpOiBzdHJpbmcKewokY2xlYW4gPSAnJzsKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CiR0aGlzLT5za2lwVG9QaHAoKTsKJGNsZWFuIC49ICc8Pyc7Cgp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewokY2hhciA9ICR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdOwppZiAoJGNoYXIgPT09ICc/JyAmJiAkdGhpcy0+cGVlaygnPicpKSB7CiRjbGVhbiAuPSAnPz4nOwokdGhpcy0+aW5kZXggKz0gMjsKY29udGludWUgMjsKfQoKaWYgKCRjaGFyID09PSAnIicpIHsKJHRoaXMtPnNraXBTdHJpbmcoJyInKTsKJGNsZWFuIC49ICdudWxsJzsKY29udGludWU7Cn0KCmlmICgkY2hhciA9PT0gIiciKSB7CiR0aGlzLT5za2lwU3RyaW5nKCInIik7CiRjbGVhbiAuPSAnbnVsbCc7CmNvbnRpbnVlOwp9CgppZiAoJGNoYXIgPT09ICI8IiAmJiAkdGhpcy0+cGVlaygnPCcpICYmICR0aGlzLT5tYXRjaCgnezw8PFsgXHRdKisoW1wnIl0/KShbYS16QS1aX1x4ODAtXHhmZl1bYS16QS1aMC05X1x4ODAtXHhmZl0qKylcXDEoPzpcclxufFxufFxyKX1BJywgJG1hdGNoKSkgewokdGhpcy0+aW5kZXggKz0gXHN0cmxlbigkbWF0Y2hbMF0pOwokdGhpcy0+c2tpcEhlcmVkb2MoJG1hdGNoWzJdKTsKJGNsZWFuIC49ICdudWxsJzsKY29udGludWU7Cn0KCmlmICgkY2hhciA9PT0gJy8nKSB7CmlmICgkdGhpcy0+cGVlaygnLycpKSB7CiR0aGlzLT5za2lwVG9OZXdsaW5lKCk7CmNvbnRpbnVlOwp9CgppZiAoJHRoaXMtPnBlZWsoJyonKSkgewokdGhpcy0+c2tpcENvbW1lbnQoKTsKY29udGludWU7Cn0KfQoKaWYgKCR0aGlzLT5tYXhNYXRjaGVzID09PSAxICYmIGlzc2V0KHNlbGY6OiR0eXBlQ29uZmlnWyRjaGFyXSkpIHsKJHR5cGUgPSBzZWxmOjokdHlwZUNvbmZpZ1skY2hhcl07CmlmICgKXHN1YnN0cigkdGhpcy0+Y29udGVudHMsICR0aGlzLT5pbmRleCwgJHR5cGVbJ2xlbmd0aCddKSA9PT0gJHR5cGVbJ25hbWUnXQomJiBQcmVnOjppc01hdGNoKCR0eXBlWydwYXR0ZXJuJ10sICR0aGlzLT5jb250ZW50cywgJG1hdGNoLCAwLCAkdGhpcy0+aW5kZXggLSAxKQopIHsKcmV0dXJuICRjbGVhbiAuICRtYXRjaFswXTsKfQp9CgokdGhpcy0+aW5kZXggKz0gMTsKaWYgKCR0aGlzLT5tYXRjaChzZWxmOjokcmVzdFBhdHRlcm4sICRtYXRjaCkpIHsKJGNsZWFuIC49ICRjaGFyIC4gJG1hdGNoWzBdOwokdGhpcy0+aW5kZXggKz0gXHN0cmxlbigkbWF0Y2hbMF0pOwp9IGVsc2UgewokY2xlYW4gLj0gJGNoYXI7Cn0KfQp9CgpyZXR1cm4gJGNsZWFuOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBUb1BocCgpOiB2b2lkCnsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAnPCcgJiYgJHRoaXMtPnBlZWsoJz8nKSkgewokdGhpcy0+aW5kZXggKz0gMjsKYnJlYWs7Cn0KCiR0aGlzLT5pbmRleCArPSAxOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcFN0cmluZyhzdHJpbmcgJGRlbGltaXRlcik6IHZvaWQKewokdGhpcy0+aW5kZXggKz0gMTsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAnXFwnICYmICgkdGhpcy0+cGVlaygnXFwnKSB8fCAkdGhpcy0+cGVlaygkZGVsaW1pdGVyKSkpIHsKJHRoaXMtPmluZGV4ICs9IDI7CmNvbnRpbnVlOwp9CgppZiAoJHRoaXMtPmNvbnRlbnRzWyR0aGlzLT5pbmRleF0gPT09ICRkZWxpbWl0ZXIpIHsKJHRoaXMtPmluZGV4ICs9IDE7CmJyZWFrOwp9CgokdGhpcy0+aW5kZXggKz0gMTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNraXBDb21tZW50KCk6IHZvaWQKewokdGhpcy0+aW5kZXggKz0gMjsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAnKicgJiYgJHRoaXMtPnBlZWsoJy8nKSkgewokdGhpcy0+aW5kZXggKz0gMjsKYnJlYWs7Cn0KCiR0aGlzLT5pbmRleCArPSAxOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc2tpcFRvTmV3bGluZSgpOiB2b2lkCnsKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4pIHsKaWYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXHIiIHx8ICR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXG4iKSB7CnJldHVybjsKfQoKJHRoaXMtPmluZGV4ICs9IDE7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBza2lwSGVyZWRvYyhzdHJpbmcgJGRlbGltaXRlcik6IHZvaWQKewokZmlyc3REZWxpbWl0ZXJDaGFyID0gJGRlbGltaXRlclswXTsKJGRlbGltaXRlckxlbmd0aCA9IFxzdHJsZW4oJGRlbGltaXRlcik7CiRkZWxpbWl0ZXJQYXR0ZXJuID0gJ3snLnByZWdfcXVvdGUoJGRlbGltaXRlcikuJyg/IVthLXpBLVowLTlfXHg4MC1ceGZmXSl9QSc7Cgp3aGlsZSAoJHRoaXMtPmluZGV4IDwgJHRoaXMtPmxlbikgewoKc3dpdGNoICgkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4XSkgewpjYXNlICJcdCI6CmNhc2UgIiAiOgokdGhpcy0+aW5kZXggKz0gMTsKY29udGludWUgMjsKY2FzZSAkZmlyc3REZWxpbWl0ZXJDaGFyOgppZiAoClxzdWJzdHIoJHRoaXMtPmNvbnRlbnRzLCAkdGhpcy0+aW5kZXgsICRkZWxpbWl0ZXJMZW5ndGgpID09PSAkZGVsaW1pdGVyCiYmICR0aGlzLT5tYXRjaCgkZGVsaW1pdGVyUGF0dGVybikKKSB7CiR0aGlzLT5pbmRleCArPSAkZGVsaW1pdGVyTGVuZ3RoOwoKcmV0dXJuOwp9CgpicmVhazsKfQoKCndoaWxlICgkdGhpcy0+aW5kZXggPCAkdGhpcy0+bGVuKSB7CiR0aGlzLT5za2lwVG9OZXdsaW5lKCk7CgoKd2hpbGUgKCR0aGlzLT5pbmRleCA8ICR0aGlzLT5sZW4gJiYgKCR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXHIiIHx8ICR0aGlzLT5jb250ZW50c1skdGhpcy0+aW5kZXhdID09PSAiXG4iKSkgewokdGhpcy0+aW5kZXggKz0gMTsKfQoKYnJlYWs7Cn0KfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHBlZWsoc3RyaW5nICRjaGFyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aW5kZXggKyAxIDwgJHRoaXMtPmxlbiAmJiAkdGhpcy0+Y29udGVudHNbJHRoaXMtPmluZGV4ICsgMV0gPT09ICRjaGFyOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRyZWdleCwgP2FycmF5ICYkbWF0Y2ggPSBudWxsKTogYm9vbAp7CnJldHVybiBQcmVnOjppc01hdGNoU3RyaWN0R3JvdXBzKCRyZWdleCwgJHRoaXMtPmNvbnRlbnRzLCAkbWF0Y2gsIDAsICR0aGlzLT5pbmRleCk7Cn0KfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcQ2xhc3NNYXBHZW5lcmF0b3I7Cgp1c2UgUnVudGltZUV4Y2VwdGlvbjsKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKCgoKCmNsYXNzIFBocEZpbGVQYXJzZXIKewoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmaW5kQ2xhc3NlcyhzdHJpbmcgJHBhdGgpOiBhcnJheQp7CiRleHRyYVR5cGVzID0gc2VsZjo6Z2V0RXh0cmFUeXBlcygpOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3BocF9zdHJpcF93aGl0ZXNwYWNlJykpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ0NsYXNzbWFwIGdlbmVyYXRpb24gcmVsaWVzIG9uIHRoZSBwaHBfc3RyaXBfd2hpdGVzcGFjZSBmdW5jdGlvbiwgYnV0IGl0IGhhcyBiZWVuIGRpc2FibGVkIGJ5IHRoZSBkaXNhYmxlX2Z1bmN0aW9ucyBkaXJlY3RpdmUuJyk7Cn0KCgoKJGNvbnRlbnRzID0gQHBocF9zdHJpcF93aGl0ZXNwYWNlKCRwYXRoKTsKaWYgKCcnID09PSAkY29udGVudHMpIHsKaWYgKCFmaWxlX2V4aXN0cygkcGF0aCkpIHsKJG1lc3NhZ2UgPSAnRmlsZSBhdCAiJXMiIGRvZXMgbm90IGV4aXN0LCBjaGVjayB5b3VyIGNsYXNzbWFwIGRlZmluaXRpb25zJzsKfSBlbHNlaWYgKCFzZWxmOjppc1JlYWRhYmxlKCRwYXRoKSkgewokbWVzc2FnZSA9ICdGaWxlIGF0ICIlcyIgaXMgbm90IHJlYWRhYmxlLCBjaGVjayBpdHMgcGVybWlzc2lvbnMnOwp9IGVsc2VpZiAoJycgPT09IHRyaW0oKHN0cmluZykgZmlsZV9nZXRfY29udGVudHMoJHBhdGgpKSkgewoKcmV0dXJuIFtdOwp9IGVsc2UgewokbWVzc2FnZSA9ICdGaWxlIGF0ICIlcyIgY291bGQgbm90IGJlIHBhcnNlZCBhcyBQSFAsIGl0IG1heSBiZSBiaW5hcnkgb3IgY29ycnVwdGVkJzsKfQoKJGVycm9yID0gZXJyb3JfZ2V0X2xhc3QoKTsKaWYgKGlzc2V0KCRlcnJvclsnbWVzc2FnZSddKSkgewokbWVzc2FnZSAuPSBQSFBfRU9MIC4gJ1RoZSBmb2xsb3dpbmcgbWVzc2FnZSBtYXkgYmUgaGVscGZ1bDonIC4gUEhQX0VPTCAuICRlcnJvclsnbWVzc2FnZSddOwp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCRtZXNzYWdlLCAkcGF0aCkpOwp9CgoKUHJlZzo6bWF0Y2hBbGxTdHJpY3RHcm91cHMoJ3tcYig/OmNsYXNzfGludGVyZmFjZXx0cmFpdCcuJGV4dHJhVHlwZXMuJylcc31pJywgJGNvbnRlbnRzLCAkbWF0Y2hlcyk7CmlmIChbXSA9PT0gJG1hdGNoZXNbMF0pIHsKcmV0dXJuIFtdOwp9CgokcCA9IG5ldyBQaHBGaWxlQ2xlYW5lcigkY29udGVudHMsIGNvdW50KCRtYXRjaGVzWzBdKSk7CiRjb250ZW50cyA9ICRwLT5jbGVhbigpOwp1bnNldCgkcCk7CgpQcmVnOjptYXRjaEFsbCgnewogICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICBcYig/PCFbXFxcXCQ6Pl0pKD9QPHR5cGU+Y2xhc3N8aW50ZXJmYWNlfHRyYWl0Jy4kZXh0cmFUeXBlcy4nKSBccysrICg/UDxuYW1lPlthLXpBLVpfXHg3Zi1ceGZmOl1bYS16QS1aMC05X1x4N2YtXHhmZjpcLV0qKykKICAgICAgICAgICAgICAgfCBcYig/PCFbXFxcXCQ6Pl0pKD9QPG5zPm5hbWVzcGFjZSkgKD9QPG5zbmFtZT5ccysrW2EtekEtWl9ceDdmLVx4ZmZdW2EtekEtWjAtOV9ceDdmLVx4ZmZdKisoPzpccyorXFxcXFxzKitbYS16QS1aX1x4N2YtXHhmZl1bYS16QS1aMC05X1x4N2YtXHhmZl0qKykqKyk/IFxzKisgW1x7O10KICAgICAgICAgICAgKQogICAgICAgIH1peCcsICRjb250ZW50cywgJG1hdGNoZXMpOwoKJGNsYXNzZXMgPSBbXTsKJG5hbWVzcGFjZSA9ICcnOwoKZm9yICgkaSA9IDAsICRsZW4gPSBjb3VudCgkbWF0Y2hlc1sndHlwZSddKTsgJGkgPCAkbGVuOyArKyRpKSB7CmlmIChpc3NldCgkbWF0Y2hlc1snbnMnXVskaV0pICYmICRtYXRjaGVzWyducyddWyRpXSAhPT0gJycpIHsKJG5hbWVzcGFjZSA9IHN0cl9yZXBsYWNlKFsnICcsICJcdCIsICJcciIsICJcbiJdLCAnJywgKHN0cmluZykgJG1hdGNoZXNbJ25zbmFtZSddWyRpXSkgLiAnXFwnOwp9IGVsc2UgewokbmFtZSA9ICRtYXRjaGVzWyduYW1lJ11bJGldOwphc3NlcnQoaXNfc3RyaW5nKCRuYW1lKSk7CgppZiAoJG5hbWUgPT09ICdleHRlbmRzJykgewpjb250aW51ZTsKfQppZiAoJG5hbWUgPT09ICdpbXBsZW1lbnRzJykgewpjb250aW51ZTsKfQoKaWYgKCRuYW1lWzBdID09PSAnOicpIHsKCiRuYW1lID0gJ3hocCcuc3Vic3RyKHN0cl9yZXBsYWNlKFsnLScsICc6J10sIFsnXycsICdfXyddLCAkbmFtZSksIDEpOwp9IGVsc2VpZiAoc3RydG9sb3dlcigoc3RyaW5nKSAkbWF0Y2hlc1sndHlwZSddWyRpXSkgPT09ICdlbnVtJykgewoKCgoKCgoKCiRjb2xvblBvcyA9IHN0cnJwb3MoJG5hbWUsICc6Jyk7CmlmIChmYWxzZSAhPT0gJGNvbG9uUG9zKSB7CiRuYW1lID0gc3Vic3RyKCRuYW1lLCAwLCAkY29sb25Qb3MpOwp9Cn0KCgokY2xhc3NOYW1lID0gbHRyaW0oJG5hbWVzcGFjZSAuICRuYW1lLCAnXFwnKTsKJGNsYXNzZXNbXSA9ICRjbGFzc05hbWU7Cn0KfQoKcmV0dXJuICRjbGFzc2VzOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRFeHRyYVR5cGVzKCk6IHN0cmluZwp7CnN0YXRpYyAkZXh0cmFUeXBlcyA9IG51bGw7CgppZiAobnVsbCA9PT0gJGV4dHJhVHlwZXMpIHsKJGV4dHJhVHlwZXMgPSAnJzsKJGV4dHJhVHlwZXNBcnJheSA9IFtdOwppZiAoUEhQX1ZFUlNJT05fSUQgPj0gODAxMDAgfHwgKGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpICYmIHZlcnNpb25fY29tcGFyZShISFZNX1ZFUlNJT04sICczLjMnLCAnPj0nKSkpIHsKJGV4dHJhVHlwZXMgLj0gJ3xlbnVtJzsKJGV4dHJhVHlwZXNBcnJheSA9IFsnZW51bSddOwp9CgpQaHBGaWxlQ2xlYW5lcjo6c2V0VHlwZUNvbmZpZyhhcnJheV9tZXJnZShbJ2NsYXNzJywgJ2ludGVyZmFjZScsICd0cmFpdCddLCAkZXh0cmFUeXBlc0FycmF5KSk7Cn0KCnJldHVybiAkZXh0cmFUeXBlczsKfQoKCgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzUmVhZGFibGUoc3RyaW5nICRwYXRoKQp7CmlmIChpc19yZWFkYWJsZSgkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpc19maWxlKCRwYXRoKSkgewpyZXR1cm4gZmFsc2UgIT09IEBmaWxlX2dldF9jb250ZW50cygkcGF0aCwgZmFsc2UsIG51bGwsIDAsIDEpOwp9CgoKcmV0dXJuIGZhbHNlOwp9Cn0KewogICAgInBhY2thZ2VzIjogWwogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvY2EtYnVuZGxlIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS41LjEwIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjUuMTAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIvY2EtYnVuZGxlLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjk2MWE1ZTQwNTZkZDJlNGEyZWVkY2FjNzU3NjA3NTk0N2MyOGJmNjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci9jYS1idW5kbGUvemlwYmFsbC85NjFhNWU0MDU2ZGQyZTRhMmVlZGNhYzc1NzYwNzU5NDdjMjhiZjYzIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiOTYxYTVlNDA1NmRkMmU0YTJlZWRjYWM3NTc2MDc1OTQ3YzI4YmY2MyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LW9wZW5zc2wiOiAiKiIsCiAgICAgICAgICAgICAgICAiZXh0LXBjcmUiOiAiKiIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjIgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMCIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl44IHx8IF45IiwKICAgICAgICAgICAgICAgICJwc3IvbG9nIjogIl4xLjAgfHwgXjIuMCB8fCBeMy4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Byb2Nlc3MiOiAiXjQuMCB8fCBeNS4wIHx8IF42LjAgfHwgXjcuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0xMi0wOFQxNTowNjo1MSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIxLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJDb21wb3NlclxcQ2FCdW5kbGVcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiTGV0cyB5b3UgZmluZCBhIHBhdGggdG8gdGhlIHN5c3RlbSBDQSBidW5kbGUsIGFuZCBpbmNsdWRlcyBhIGZhbGxiYWNrIHRvIHRoZSBNb3ppbGxhIENBIGJ1bmRsZS4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY2FidW5kbGUiLAogICAgICAgICAgICAgICAgImNhY2VydCIsCiAgICAgICAgICAgICAgICAiY2VydGlmaWNhdGUiLAogICAgICAgICAgICAgICAgInNzbCIsCiAgICAgICAgICAgICAgICAidGxzIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpcmMiOiAiaXJjOi8vaXJjLmZyZWVub2RlLm9yZy9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jYS1idW5kbGUvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL2NhLWJ1bmRsZS90cmVlLzEuNS4xMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuL2NhLWJ1bmRsZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvY2xhc3MtbWFwLWdlbmVyYXRvciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuNy4xIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjcuMS4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjhmNWZhM2NjMjE0MjMwZTcxZjU0OTI0YmQwMTk3YTNiY2M3MDVlYjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3ppcGJhbGwvOGY1ZmEzY2MyMTQyMzBlNzFmNTQ5MjRiZDAxOTdhM2JjYzcwNWViMSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjhmNWZhM2NjMjE0MjMwZTcxZjU0OTI0YmQwMTk3YTNiY2M3MDVlYjEiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgImNvbXBvc2VyL3BjcmUiOiAiXjIuMSB8fCBeMy4xIiwKICAgICAgICAgICAgICAgICJwaHAiOiAiXjcuMiB8fCBeOC4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2ZpbmRlciI6ICJeNC40IHx8IF41LjMgfHwgXjYgfHwgXjcgfHwgXjgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTIgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1kZXByZWNhdGlvbi1ydWxlcyI6ICJeMSB8fCBeMiIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuLXBocHVuaXQiOiAiXjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1zdHJpY3QtcnVsZXMiOiAiXjEuMSB8fCBeMiIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl44IiwKICAgICAgICAgICAgICAgICJzeW1mb255L2ZpbGVzeXN0ZW0iOiAiXjUuNCB8fCBeNiB8fCBeNyB8fCBeOCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0xMi0yOVQxMzoxNToyNSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFpbiI6ICIxLngtZGV2IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJDb21wb3NlclxcQ2xhc3NNYXBHZW5lcmF0b3JcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlV0aWxpdGllcyB0byBzY2FuIFBIUCBjb2RlIGFuZCBnZW5lcmF0ZSBjbGFzcyBtYXBzLiIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjbGFzc21hcCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yL3RyZWUvMS43LjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3QuY29tIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9jbGFzcy1tYXAtZ2VuZXJhdG9yIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJjb21wb3Nlci9tZXRhZGF0YS1taW5pZmllciIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMC4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjAuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJjNTQ5ZDIzODI5NTM2ZjBkMGU5ODRhYWFiYmYwMmFmOTFmNDQzMjA3IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvbWV0YWRhdGEtbWluaWZpZXIvemlwYmFsbC9jNTQ5ZDIzODI5NTM2ZjBkMGU5ODRhYWFiYmYwMmFmOTFmNDQzMjA3IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYzU0OWQyMzgyOTUzNmYwZDBlOTg0YWFhYmJmMDJhZjkxZjQ0MzIwNyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIl41LjMuMiB8fCBeNy4wIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJjb21wb3Nlci9jb21wb3NlciI6ICJeMiIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4wLjEyLjU1IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BocHVuaXQtYnJpZGdlIjogIl40LjIgfHwgXjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjEtMDQtMDdUMTM6Mzc6MzMrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXE1ldGFkYXRhTWluaWZpZXJcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU21hbGwgdXRpbGl0eSBsaWJyYXJ5IHRoYXQgaGFuZGxlcyBtZXRhZGF0YSBtaW5pZmljYXRpb24gYW5kIGV4cGFuc2lvbi4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY29tcG9zZXIiLAogICAgICAgICAgICAgICAgImNvbXByZXNzaW9uIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9tZXRhZGF0YS1taW5pZmllci90cmVlLzEuMC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi9tZXRhZGF0YS1taW5pZmllciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvcGNyZSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjIuMy4yIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjMuMi4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9wY3JlLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImViYjgxZGY4ZjUyYjQwMTcyZDE0MDYyYWU5NmEwNjkzOWQ4MGEwNjkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci9wY3JlL3ppcGJhbGwvZWJiODFkZjhmNTJiNDAxNzJkMTQwNjJhZTk2YTA2OTM5ZDgwYTA2OSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImViYjgxZGY4ZjUyYjQwMTcyZDE0MDYyYWU5NmEwNjkzOWQ4MGEwNjkiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiPDEuMTEuMTAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTIgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1zdHJpY3QtcnVsZXMiOiAiXjEgfHwgXjIiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOCB8fCBeOSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMS0xMlQxNjoyNDo0NyswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAicGhwc3RhbiI6IHsKICAgICAgICAgICAgICAgICAgICAiaW5jbHVkZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb24ubmVvbiIKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMi54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXFBjcmVcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUENSRSB3cmFwcGluZyBsaWJyYXJ5IHRoYXQgb2ZmZXJzIHR5cGUtc2FmZSBwcmVnXyogcmVwbGFjZW1lbnRzLiIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJQQ1JFIiwKICAgICAgICAgICAgICAgICJwcmVnIiwKICAgICAgICAgICAgICAgICJyZWdleCIsCiAgICAgICAgICAgICAgICAicmVndWxhciBleHByZXNzaW9uIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3BjcmUvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3BjcmUvdHJlZS8yLjMuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3BhY2thZ2lzdC5jb20iLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3QvY29tcG9zZXIvY29tcG9zZXIiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4vcGNyZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAiY29tcG9zZXIvc2VtdmVyIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMy40LjQiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjMuNC40LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NlbXZlci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIxOTgxNjY2MTg5MDZjYjJkZTY5Yjk1ZDdkNDdlNWZhOGFhMWIyYjk1IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvY29tcG9zZXIvc2VtdmVyL3ppcGJhbGwvMTk4MTY2NjE4OTA2Y2IyZGU2OWI5NWQ3ZDQ3ZTVmYThhYTFiMmI5NSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjE5ODE2NjYxODkwNmNiMmRlNjliOTVkN2Q0N2U1ZmE4YWExYjJiOTUiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNS4zLjIgfHwgXjcuMCB8fCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuIjogIl4xLjExIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BocHVuaXQtYnJpZGdlIjogIl4zIHx8IF43IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI1LTA4LTIwVDE5OjE1OjMwKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjMueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIkNvbXBvc2VyXFxTZW12ZXJcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWxzIEFkZXJtYW5uIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAibmFkZXJtYW5AbmFkZXJtYW4uZGUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vd3d3Lm5hZGVybWFuLmRlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJSb2IgQmFzdCIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInJvYi5iYXN0QGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9yb2JiYXN0Lm5sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU2VtdmVyIGxpYnJhcnkgdGhhdCBvZmZlcnMgdXRpbGl0aWVzLCB2ZXJzaW9uIGNvbnN0cmFpbnQgcGFyc2luZyBhbmQgdmFsaWRhdGlvbi4iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAic2VtYW50aWMiLAogICAgICAgICAgICAgICAgInNlbXZlciIsCiAgICAgICAgICAgICAgICAidmFsaWRhdGlvbiIsCiAgICAgICAgICAgICAgICAidmVyc2lvbmluZyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXJjIjogImlyY3M6Ly9pcmMubGliZXJhLmNoYXQ6NjY5Ny9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zZW12ZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NlbXZlci90cmVlLzMuNC40IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4vc2VtdmVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJjb21wb3Nlci9zcGR4LWxpY2Vuc2VzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS41LjkiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuNS45LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZWRmMzY0Y2VmZThjNDM1MDFlMjFlODgxMTBhYWMxMGIyODRjM2M5ZiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL2NvbXBvc2VyL3NwZHgtbGljZW5zZXMvemlwYmFsbC9lZGYzNjRjZWZlOGM0MzUwMWUyMWU4ODExMGFhYzEwYjI4NGMzYzlmIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZWRmMzY0Y2VmZThjNDM1MDFlMjFlODgxMTBhYWMxMGIyODRjM2M5ZiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIl41LjMuMiB8fCBeNy4wIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcGhwdW5pdC1icmlkZ2UiOiAiXjMgfHwgXjciCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjUtMDUtMTJUMjE6MDc6MDcrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMS54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiQ29tcG9zZXJcXFNwZHhcXCI6ICJzcmMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWxzIEFkZXJtYW5uIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAibmFkZXJtYW5AbmFkZXJtYW4uZGUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwOi8vd3d3Lm5hZGVybWFuLmRlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9zZWxkLmJlIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJSb2IgQmFzdCIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInJvYi5iYXN0QGdtYWlsLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHA6Ly9yb2JiYXN0Lm5sIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU1BEWCBsaWNlbnNlcyBsaXN0IGFuZCB2YWxpZGF0aW9uIGxpYnJhcnkuIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImxpY2Vuc2UiLAogICAgICAgICAgICAgICAgInNwZHgiLAogICAgICAgICAgICAgICAgInZhbGlkYXRvciIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAiaXJjIjogImlyY3M6Ly9pcmMubGliZXJhLmNoYXQ6NjY5Ny9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAiaXNzdWVzIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci9zcGR4LWxpY2Vuc2VzL3RyZWUvMS41LjkiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3QuY29tIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L2NvbXBvc2VyL2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuL3NwZHgtbGljZW5zZXMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogImNvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMy4wLjUiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjMuMC41LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZjMTkyNTU2MTYzMmU4M2Q2MGE0NDQ5MmUwYjM0NGNmNDhhYjg1ZWYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9jb21wb3Nlci94ZGVidWctaGFuZGxlci96aXBiYWxsLzZjMTkyNTU2MTYzMmU4M2Q2MGE0NDQ5MmUwYjM0NGNmNDhhYjg1ZWYiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2YzE5MjU1NjE2MzJlODNkNjBhNDQ0OTJlMGIzNDRjZjQ4YWI4NWVmIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJjb21wb3Nlci9wY3JlIjogIl4xIHx8IF4yIHx8IF4zIiwKICAgICAgICAgICAgICAgICJwaHAiOiAiXjcuMi41IHx8IF44LjAiLAogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiXjEgfHwgXjIgfHwgXjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMCIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuLXN0cmljdC1ydWxlcyI6ICJeMS4xIiwKICAgICAgICAgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAiXjguNSB8fCBeOS42IHx8IF4xMC41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA1LTA2VDE2OjM3OjE2KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIkNvbXBvc2VyXFxYZGVidWdIYW5kbGVyXFwiOiAic3JjIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9obiBTdGV2ZW5zb24iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqb2huLXN0ZXZlbnNvbkBibHVleW9uZGVyLmNvLnVrIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUmVzdGFydHMgYSBwcm9jZXNzIHdpdGhvdXQgWGRlYnVnLiIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJYZGVidWciLAogICAgICAgICAgICAgICAgInBlcmZvcm1hbmNlIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpcmMiOiAiaXJjczovL2lyYy5saWJlcmEuY2hhdDo2Njk3L2NvbXBvc2VyIiwKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvc2VyL3hkZWJ1Zy1oYW5kbGVyL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3Nlci94ZGVidWctaGFuZGxlci90cmVlLzMuMC41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vcGFja2FnaXN0LmNvbSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9jb21wb3Nlci9jb21wb3NlciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi94ZGVidWctaGFuZGxlciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAianVzdGlucmFpbmJvdy9qc29uLXNjaGVtYSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjYuNi40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI2LjYuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9qc29ucmFpbmJvdy9qc29uLXNjaGVtYS5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIyZWViNzVkMjFjZjczMjExMzM1ODg4ZTdmNWU2ZmQ3NDQwNzIzZWM3IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvanNvbnJhaW5ib3cvanNvbi1zY2hlbWEvemlwYmFsbC8yZWViNzVkMjFjZjczMjExMzM1ODg4ZTdmNWU2ZmQ3NDQwNzIzZWM3IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMmVlYjc1ZDIxY2Y3MzIxMTMzNTg4OGU3ZjVlNmZkNzQ0MDcyM2VjNyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWpzb24iOiAiKiIsCiAgICAgICAgICAgICAgICAibWFyYy1tYWJlL3BocC1lbnVtIjogIl40LjQiLAogICAgICAgICAgICAgICAgInBocCI6ICJeNy4yIHx8IF44LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJmcmllbmRzb2ZwaHAvcGhwLWNzLWZpeGVyIjogIjMuMy4wIiwKICAgICAgICAgICAgICAgICJqc29uLXNjaGVtYS9qc29uLXNjaGVtYS10ZXN0LXN1aXRlIjogIl4yMy4yIiwKICAgICAgICAgICAgICAgICJtYXJjLW1hYmUvcGhwLWVudW0tcGhwc3RhbiI6ICJeMi4wIiwKICAgICAgICAgICAgICAgICJwaHBzcGVjL3Byb3BoZWN5IjogIl4xLjE5IiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMTIiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOC41IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI1LTEyLTE5VDE1OjAxOjMyKzAwOjAwIiwKICAgICAgICAgICAgImJpbiI6IFsKICAgICAgICAgICAgICAgICJiaW4vdmFsaWRhdGUtanNvbiIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYXN0ZXIiOiAiNi54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiSnNvblNjaGVtYVxcIjogInNyYy9Kc29uU2NoZW1hLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkJydW5vIFByaWV0byBSZWlzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiYnJ1bm8ucC5yZWlzQGdtYWlsLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSnVzdGluIFJhaW5ib3ciLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqdXN0aW4ucmFpbmJvd0BnbWFpbC5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIklnb3IgV2llZGxlciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImlnb3JAd2llZGxlci5jaCIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiUm9iZXJ0IFNjaMO2bnRoYWwiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJzZXJvc2Nob0Bnb29nbGVtYWlsLmNvbSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgbGlicmFyeSB0byB2YWxpZGF0ZSBhIGpzb24gc2NoZW1hLiIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vanNvbnJhaW5ib3cvanNvbi1zY2hlbWEiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAianNvbiIsCiAgICAgICAgICAgICAgICAic2NoZW1hIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL2pzb25yYWluYm93L2pzb24tc2NoZW1hL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9qc29ucmFpbmJvdy9qc29uLXNjaGVtYS90cmVlLzYuNi40IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogIm1hcmMtbWFiZS9waHAtZW51bSIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInY0LjcuMiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiNC43LjIuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbWFyYy1tYWJlL3BocC1lbnVtLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImJiNDI2ZmNkZDY1YzYwZmIzNjM4ZWY3NDFlODc4MjUwOGZkYTdlZWYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9tYXJjLW1hYmUvcGhwLWVudW0vemlwYmFsbC9iYjQyNmZjZGQ2NWM2MGZiMzYzOGVmNzQxZTg3ODI1MDhmZGE3ZWVmIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYmI0MjZmY2RkNjVjNjBmYjM2MzhlZjc0MWU4NzgyNTA4ZmRhN2VlZiIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAiZXh0LXJlZmxlY3Rpb24iOiAiKiIsCiAgICAgICAgICAgICAgICAicGhwIjogIl43LjEgfCBeOC4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAicGhwYmVuY2gvcGhwYmVuY2giOiAiXjAuMTYuMTAgfHwgXjEuMC40IiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiXjEuMy4xIiwKICAgICAgICAgICAgICAgICJwaHB1bml0L3BocHVuaXQiOiAiXjcuNS4yMCB8IF44LjUuMjIgfCBeOS41LjExIiwKICAgICAgICAgICAgICAgICJ2aW1lby9wc2FsbSI6ICJeNC4xNy4wIHwgXjUuMjYuMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wOS0xNFQxMToxODozOSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtMy54IjogIjMuMi1kZXYiLAogICAgICAgICAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjQuNy1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIk1hYmVFbnVtXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgInN0dWJzL1N0cmluZ2FibGUucGhwIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIkJTRC0zLUNsYXVzZSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTWFyYyBCZW5uZXdpdHoiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJkZXZAbWFiZS5iZXJsaW4iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL21hYmUuYmVybGluLyIsCiAgICAgICAgICAgICAgICAgICAgInJvbGUiOiAiTGVhZCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlNpbXBsZSBhbmQgZmFzdCBpbXBsZW1lbnRhdGlvbiBvZiBlbnVtZXJhdGlvbnMgd2l0aCBuYXRpdmUgUEhQIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjLW1hYmUvcGhwLWVudW0iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiZW51bSIsCiAgICAgICAgICAgICAgICAiZW51bS1tYXAiLAogICAgICAgICAgICAgICAgImVudW0tc2V0IiwKICAgICAgICAgICAgICAgICJlbnVtZXJhdGlvbiIsCiAgICAgICAgICAgICAgICAiZW51bWVyYXRvciIsCiAgICAgICAgICAgICAgICAiZW51bW1hcCIsCiAgICAgICAgICAgICAgICAiZW51bXNldCIsCiAgICAgICAgICAgICAgICAibWFwIiwKICAgICAgICAgICAgICAgICJzZXQiLAogICAgICAgICAgICAgICAgInR5cGUiLAogICAgICAgICAgICAgICAgInR5cGUtaGludCIsCiAgICAgICAgICAgICAgICAidHlwZWhpbnQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vbWFyYy1tYWJlL3BocC1lbnVtL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9tYXJjLW1hYmUvcGhwLWVudW0vdHJlZS92NC43LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vbWFyYy1tYWJlL3BocC1lbnVtIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJwc3IvY29udGFpbmVyIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS4xLjEiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMS4xLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvY29udGFpbmVyLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9waHAtZmlnL2NvbnRhaW5lci96aXBiYWxsLzg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI4NjIyNTY3NDA5MDEwMjgyYjdhZWViZTRiYjg0MWZlOThiNThkY2FmIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyMS0wMy0wNVQxNzozNjowNiswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJQc3JcXENvbnRhaW5lclxcIjogInNyYy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJQSFAtRklHIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tbW9uIENvbnRhaW5lciBJbnRlcmZhY2UgKFBIUCBGSUcgUFNSLTExKSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9jb250YWluZXIiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiUFNSLTExIiwKICAgICAgICAgICAgICAgICJjb250YWluZXIiLAogICAgICAgICAgICAgICAgImNvbnRhaW5lci1pbnRlcmZhY2UiLAogICAgICAgICAgICAgICAgImNvbnRhaW5lci1pbnRlcm9wIiwKICAgICAgICAgICAgICAgICJwc3IiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vcGhwLWZpZy9jb250YWluZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvY29udGFpbmVyL3RyZWUvMS4xLjEiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vcHNyL2NvbnRhaW5lciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAicHNyL2xvZyIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjEuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9waHAtZmlnL2xvZy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJkNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvcGhwLWZpZy9sb2cvemlwYmFsbC9kNDk2OTViOTA5YzNiNzYyOGI2Mjg5ZGI1NDc5YTFjMjA0NjAxZjExIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiZDQ5Njk1YjkwOWMzYjc2MjhiNjI4OWRiNTQ3OWExYzIwNDYwMWYxMSIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49NS4zLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjEtMDUtMDNUMTE6MjA6MjcrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1hc3RlciI6ICIxLjEueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlBzclxcTG9nXFwiOiAiUHNyL0xvZy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJQSFAtRklHIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly93d3cucGhwLWZpZy5vcmcvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQ29tbW9uIGludGVyZmFjZSBmb3IgbG9nZ2luZyBsaWJyYXJpZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3BocC1maWcvbG9nIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImxvZyIsCiAgICAgICAgICAgICAgICAicHNyIiwKICAgICAgICAgICAgICAgICJwc3ItMyIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9waHAtZmlnL2xvZy90cmVlLzEuMS40IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3Bzci9sb2ciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInJlYWN0L3Byb21pc2UiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2My4zLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjMuMy4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3JlYWN0cGhwL3Byb21pc2UuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMjM0NDRmNTNhODEzYTMyOTZjMTM2OGJiMTA0NzkzY2U4ZDg4ZjA0YSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3JlYWN0cGhwL3Byb21pc2UvemlwYmFsbC8yMzQ0NGY1M2E4MTNhMzI5NmMxMzY4YmIxMDQ3OTNjZThkODhmMDRhIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMjM0NDRmNTNhODEzYTMyOTZjMTM2OGJiMTA0NzkzY2U4ZDg4ZjA0YSIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4xLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlLWRldiI6IHsKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4iOiAiMS4xMi4yOCB8fCAxLjQuMTAiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeOS42IHx8IF43LjUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjUtMDgtMTlUMTg6NTc6MDMrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAic3JjL2Z1bmN0aW9uc19pbmNsdWRlLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlJlYWN0XFxQcm9taXNlXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkphbiBTb3JnYWxsYSIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImpzb3JnYWxsYUBnbWFpbC5jb20iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3NvcmdhbGxhLmNvbS8iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkNocmlzdGlhbiBMw7xjayIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImNocmlzdGlhbkBjbHVlLmVuZ2luZWVyaW5nIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9jbHVlLmVuZ2luZWVyaW5nLyIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiQ2Vlcy1KYW4gS2lld2lldCIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInJlYWN0cGhwQGNlZXNqYW5raWV3aWV0Lm5sIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly93eXJpaGF4aW11cy5uZXQvIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJDaHJpcyBCb2RlbiIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImNib2RlbkBnbWFpbC5jb20iLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL2Nib2Rlbi5kZXYvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiQSBsaWdodHdlaWdodCBpbXBsZW1lbnRhdGlvbiBvZiBDb21tb25KUyBQcm9taXNlcy9BIGZvciBQSFAiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAicHJvbWlzZSIsCiAgICAgICAgICAgICAgICAicHJvbWlzZXMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vcmVhY3RwaHAvcHJvbWlzZS9pc3N1ZXMiLAogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vcmVhY3RwaHAvcHJvbWlzZS90cmVlL3YzLjMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL29wZW5jb2xsZWN0aXZlLmNvbS9yZWFjdHBocCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAib3Blbl9jb2xsZWN0aXZlIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3JlYWN0L3Byb21pc2UiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInNlbGQvanNvbmxpbnQiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIxLjExLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMTEuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9TZWxkYWVrL2pzb25saW50LmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjE3NDhhYWY4NDdmYzczMWNmYWQ3NzI1YWVjNDEzZWU0NmYwY2MzYTIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9TZWxkYWVrL2pzb25saW50L3ppcGJhbGwvMTc0OGFhZjg0N2ZjNzMxY2ZhZDc3MjVhZWM0MTNlZTQ2ZjBjYzNhMiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjE3NDhhYWY4NDdmYzczMWNmYWQ3NzI1YWVjNDEzZWU0NmYwY2MzYTIiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICJeNS4zIHx8IF43LjAgfHwgXjguMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMS4xMSIsCiAgICAgICAgICAgICAgICAicGhwdW5pdC9waHB1bml0IjogIl40LjguMzUgfHwgXjUuNyB8fCBeNi4wIHx8IF44LjUuMTMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDctMTFUMTQ6NTU6NDUrMDA6MDAiLAogICAgICAgICAgICAiYmluIjogWwogICAgICAgICAgICAgICAgImJpbi9qc29ubGludCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlNlbGRcXEpzb25MaW50XFwiOiAic3JjL1NlbGQvSnNvbkxpbnQvIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiSm9yZGkgQm9nZ2lhbm8iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJqLmJvZ2dpYW5vQHNlbGQuYmUiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJKU09OIExpbnRlciIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJqc29uIiwKICAgICAgICAgICAgICAgICJsaW50ZXIiLAogICAgICAgICAgICAgICAgInBhcnNlciIsCiAgICAgICAgICAgICAgICAidmFsaWRhdG9yIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvanNvbmxpbnQvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvanNvbmxpbnQvdHJlZS8xLjExLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc2VsZC9qc29ubGludCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc2VsZC9qc29ubGludCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic2VsZC9waGFyLXV0aWxzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAiMS4yLjEiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMi4xLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvcGhhci11dGlscy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJlYTJmNDAxNGYxNjNjMWJlNGM2MDFiOWI3YmQ2YWY4MWJhOGQ3MDFjIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvU2VsZGFlay9waGFyLXV0aWxzL3ppcGJhbGwvZWEyZjQwMTRmMTYzYzFiZTRjNjAxYjliN2JkNmFmODFiYThkNzAxYyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImVhMmY0MDE0ZjE2M2MxYmU0YzYwMWI5YjdiZDZhZjgxYmE4ZDcwMWMiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTUuMyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyMi0wOC0zMVQxMDozMToxOCswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAiYnJhbmNoLWFsaWFzIjogewogICAgICAgICAgICAgICAgICAgICJkZXYtbWFzdGVyIjogIjEueC1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlNlbGRcXFBoYXJVdGlsc1xcIjogInNyYy8iCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJKb3JkaSBCb2dnaWFubyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImouYm9nZ2lhbm9Ac2VsZC5iZSIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlBIQVIgZmlsZSBmb3JtYXQgdXRpbGl0aWVzLCBmb3Igd2hlbiBQSFAgcGhhcnMgeW91IHVwIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgInBoYXIiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgImlzc3VlcyI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9waGFyLXV0aWxzL2lzc3VlcyIsCiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9TZWxkYWVrL3BoYXItdXRpbHMvdHJlZS8xLjIuMSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zZWxkL3BoYXItdXRpbHMiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInNlbGQvc2lnbmFsLWhhbmRsZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICIyLjAuMiIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMi4wLjIuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vU2VsZGFlay9zaWduYWwtaGFuZGxlci5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwNGE2MTEyZTg4M2FkNzZjMGFkYThlNGE5Zjc1MjBiYmZkYjZiYjk4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3MvU2VsZGFlay9zaWduYWwtaGFuZGxlci96aXBiYWxsLzA0YTYxMTJlODgzYWQ3NmMwYWRhOGU0YTlmNzUyMGJiZmRiNmJiOTgiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwNGE2MTEyZTg4M2FkNzZjMGFkYThlNGE5Zjc1MjBiYmZkYjZiYjk4IiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3RhbiI6ICJeMSIsCiAgICAgICAgICAgICAgICAicGhwc3Rhbi9waHBzdGFuLWRlcHJlY2F0aW9uLXJ1bGVzIjogIl4xLjAiLAogICAgICAgICAgICAgICAgInBocHN0YW4vcGhwc3Rhbi1waHB1bml0IjogIl4xIiwKICAgICAgICAgICAgICAgICJwaHBzdGFuL3BocHN0YW4tc3RyaWN0LXJ1bGVzIjogIl4xLjMiLAogICAgICAgICAgICAgICAgInBocHVuaXQvcGhwdW5pdCI6ICJeNy41LjIwIHx8IF44LjUuMjMiLAogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiXjEgfHwgXjIgfHwgXjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjMtMDktMDNUMDk6MjQ6MDArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgImJyYW5jaC1hbGlhcyI6IHsKICAgICAgICAgICAgICAgICAgICAiZGV2LW1haW4iOiAiMi54LWRldiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU2VsZFxcU2lnbmFsXFwiOiAic3JjLyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkpvcmRpIEJvZ2dpYW5vIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiai5ib2dnaWFub0BzZWxkLmJlIiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cDovL3NlbGQuYmUiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTaW1wbGUgdW5peCBzaWduYWwgaGFuZGxlciB0aGF0IHNpbGVudGx5IGZhaWxzIHdoZXJlIHNpZ25hbHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGVhc3kgY3Jvc3MtcGxhdGZvcm0gZGV2ZWxvcG1lbnQiLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAicG9zaXgiLAogICAgICAgICAgICAgICAgInNpZ2ludCIsCiAgICAgICAgICAgICAgICAic2lnbmFsIiwKICAgICAgICAgICAgICAgICJzaWd0ZXJtIiwKICAgICAgICAgICAgICAgICJ1bml4IgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJpc3N1ZXMiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvc2lnbmFsLWhhbmRsZXIvaXNzdWVzIiwKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL1NlbGRhZWsvc2lnbmFsLWhhbmRsZXIvdHJlZS8yLjAuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zZWxkL3NpZ25hbC1oYW5kbGVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L2NvbnNvbGUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ3IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDcuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb25zb2xlLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImM0YmE5ODBjYTYxYTllYjE4ZWU2YmNjNzNmMjhlNDc1ODUyYmIxZWQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L2NvbnNvbGUvemlwYmFsbC9jNGJhOTgwY2E2MWE5ZWIxOGVlNmJjYzczZjI4ZTQ3NTg1MmJiMWVkIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYzRiYTk4MGNhNjFhOWViMThlZTZiY2M3M2YyOGU0NzU4NTJiYjFlZCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yLjUiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIjogIl4yLjF8XjMiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmciOiAifjEuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wb2x5ZmlsbC1waHA3MyI6ICJeMS45IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3NlcnZpY2UtY29udHJhY3RzIjogIl4xLjF8XjJ8XjMiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvc3RyaW5nIjogIl41LjF8XjYuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImNvbmZsaWN0IjogewogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiPj0zIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2RlcGVuZGVuY3ktaW5qZWN0aW9uIjogIjw0LjQiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZG90ZW52IjogIjw1LjEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZXZlbnQtZGlzcGF0Y2hlciI6ICI8NC40IiwKICAgICAgICAgICAgICAgICJzeW1mb255L2xvY2siOiAiPDQuNCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIjw0LjQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgInBzci9sb2ctaW1wbGVtZW50YXRpb24iOiAiMS4wfDIuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiXjF8XjIiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvY29uZmlnIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2RlcGVuZGVuY3ktaW5qZWN0aW9uIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L2V2ZW50LWRpc3BhdGNoZXIiOiAiXjQuNHxeNS4wfF42LjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvbG9jayI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIl40LjR8XjUuMHxeNi4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3Zhci1kdW1wZXIiOiAiXjQuNHxeNS4wfF42LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJzdWdnZXN0IjogewogICAgICAgICAgICAgICAgInBzci9sb2ciOiAiRm9yIHVzaW5nIHRoZSBjb25zb2xlIGxvZ2dlciIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9ldmVudC1kaXNwYXRjaGVyIjogIiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9sb2NrIjogIiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMS0wNlQxMTozMDo1NSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXENvbnNvbGVcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiL1Rlc3RzLyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkZhYmllbiBQb3RlbmNpZXIiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJmYWJpZW5Ac3ltZm9ueS5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJFYXNlcyB0aGUgY3JlYXRpb24gb2YgYmVhdXRpZnVsIGFuZCB0ZXN0YWJsZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNsaSIsCiAgICAgICAgICAgICAgICAiY29tbWFuZC1saW5lIiwKICAgICAgICAgICAgICAgICJjb25zb2xlIiwKICAgICAgICAgICAgICAgICJ0ZXJtaW5hbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2NvbnNvbGUvdHJlZS92NS40LjQ3IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L2NvbnNvbGUiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjIuNS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjUuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI2MDUzODlmMmE3ZTU2MjVmMjczYjUzOTYwZGM0NmFlYWY5YzYyOTE4IgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvemlwYmFsbC82MDUzODlmMmE3ZTU2MjVmMjczYjUzOTYwZGM0NmFlYWY5YzYyOTE4IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNjA1Mzg5ZjJhN2U1NjI1ZjI3M2I1Mzk2MGRjNDZhZWFmOWM2MjkxOCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4xIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI1VDE0OjExOjEzKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb250cmFjdHMiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvY29udHJhY3RzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjIuNS1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImZ1bmN0aW9uLnBocCIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkEgZ2VuZXJpYyBmdW5jdGlvbiBhbmQgY29udmVudGlvbiB0byB0cmlnZ2VyIGRlcHJlY2F0aW9uIG5vdGljZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMvdHJlZS92Mi41LjQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L2ZpbGVzeXN0ZW0iLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ1IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDUuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9maWxlc3lzdGVtLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjU3YzgyOTRlZDM3ZDRhMDU1Yjc3MDU3ODI3YzY3Zjk1NThjOTVjNTQiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L2ZpbGVzeXN0ZW0vemlwYmFsbC81N2M4Mjk0ZWQzN2Q0YTA1NWI3NzA1NzgyN2M2N2Y5NTU4Yzk1YzU0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNTdjODI5NGVkMzdkNGEwNTViNzcwNTc4MjdjNjdmOTU1OGM5NWM1NCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yLjUiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtY3R5cGUiOiAifjEuOCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZyI6ICJ+MS44IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZS1kZXYiOiB7CiAgICAgICAgICAgICAgICAic3ltZm9ueS9wcm9jZXNzIjogIl41LjR8XjYuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNC0xMC0yMlQxMzowNTozNSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXEZpbGVzeXN0ZW1cXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImV4Y2x1ZGUtZnJvbS1jbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiL1Rlc3RzLyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkZhYmllbiBQb3RlbmNpZXIiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJmYWJpZW5Ac3ltZm9ueS5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJQcm92aWRlcyBiYXNpYyB1dGlsaXRpZXMgZm9yIHRoZSBmaWxlc3lzdGVtIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvZmlsZXN5c3RlbS90cmVlL3Y1LjQuNDUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvZmlsZXN5c3RlbSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9maW5kZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ1IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDUuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9maW5kZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvZmluZGVyL3ppcGJhbGwvNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYiIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjYzNzQxNzg0Y2Q3Yjk5Njc5NzVlZWM2MTBiMjU2ZWVkM2VkZTAyMmIiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L2RlcHJlY2F0aW9uLWNvbnRyYWN0cyI6ICJeMi4xfF4zIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI4VDEzOjMyOjA4KzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcRmluZGVyXFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJleGNsdWRlLWZyb20tY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgIi9UZXN0cy8iCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJGYWJpZW4gUG90ZW5jaWVyIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiZmFiaWVuQHN5bWZvbnkuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiRmluZHMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIHZpYSBhbiBpbnR1aXRpdmUgZmx1ZW50IGludGVyZmFjZSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L2ZpbmRlci90cmVlL3Y1LjQuNDUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvZmluZGVyIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLWN0eXBlIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMzMuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4zMy4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYTNjYzhiMDQ0YTZlYTUxMzMxMGNiZDQ4ZWY3MzMzYjM4NDk0NTYzOCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvemlwYmFsbC9hM2NjOGIwNDRhNmVhNTEzMzEwY2JkNDhlZjczMzNiMzg0OTQ1NjM4IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiYTNjYzhiMDQ0YTZlYTUxMzMxMGNiZDQ4ZWY3MzMzYjM4NDk0NTYzOCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicHJvdmlkZSI6IHsKICAgICAgICAgICAgICAgICJleHQtY3R5cGUiOiAiKiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWN0eXBlIjogIkZvciBiZXN0IHBlcmZvcm1hbmNlIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTA5VDExOjQ1OjEwKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiYm9vdHN0cmFwLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXFBvbHlmaWxsXFxDdHlwZVxcIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIkdlcnQgZGUgUGFndGVyIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAiQmFja0VuZFRlYUBnbWFpbC5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciBjdHlwZSBmdW5jdGlvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJjdHlwZSIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtY3R5cGUvdHJlZS92MS4zMy4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbmljb2xhcy1ncmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLWN0eXBlIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zMy4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjMzLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjM4MDg3MjEzMGQzYTVkZDNhY2UyZjQwMTBkOTUxMjVmZGU1ZDVjNzAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLWludGwtZ3JhcGhlbWUvemlwYmFsbC8zODA4NzIxMzBkM2E1ZGQzYWNlMmY0MDEwZDk1MTI1ZmRlNWQ1YzcwIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMzgwODcyMTMwZDNhNWRkM2FjZTJmNDAxMGQ5NTEyNWZkZTVkNWM3MCIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJleHQtaW50bCI6ICJGb3IgYmVzdCBwZXJmb3JtYW5jZSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wNi0yN1QwOTo1ODoxNyswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcSW50bFxcR3JhcGhlbWVcXCI6ICIiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciBpbnRsJ3MgZ3JhcGhlbWVfKiBmdW5jdGlvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJncmFwaGVtZSIsCiAgICAgICAgICAgICAgICAiaW50bCIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIiwKICAgICAgICAgICAgICAgICJzaGltIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZS90cmVlL3YxLjMzLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFzLWdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZSIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zMy4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjMzLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyL3ppcGJhbGwvMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjM4MzNkNzI1NWNjMzAzNTQ2NDM1Y2I2NTAzMTZiZmY3MDhhMWM3NWMiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInN1Z2dlc3QiOiB7CiAgICAgICAgICAgICAgICAiZXh0LWludGwiOiAiRm9yIGJlc3QgcGVyZm9ybWFuY2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMDlUMTE6NDU6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXEludGxcXE5vcm1hbGl6ZXJcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvc3R1YnMiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGZvciBpbnRsJ3MgTm9ybWFsaXplciBjbGFzcyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJpbnRsIiwKICAgICAgICAgICAgICAgICJub3JtYWxpemVyIiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLW5vcm1hbGl6ZXIvdHJlZS92MS4zMy4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbmljb2xhcy1ncmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplciIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZyIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjMzLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzMuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZkODU3ZjRkNzZiZDRiMzQzZWFjMjZkNmI1Mzk1ODVkMmJjNTY0OTMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nL3ppcGJhbGwvNmQ4NTdmNGQ3NmJkNGIzNDNlYWMyNmQ2YjUzOTU4NWQyYmM1NjQ5MyIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjZkODU3ZjRkNzZiZDRiMzQzZWFjMjZkNmI1Mzk1ODVkMmJjNTY0OTMiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgImV4dC1pY29udiI6ICIqIiwKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJwcm92aWRlIjogewogICAgICAgICAgICAgICAgImV4dC1tYnN0cmluZyI6ICIqIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJleHQtbWJzdHJpbmciOiAiRm9yIGJlc3QgcGVyZm9ybWFuY2UiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMTItMjNUMDg6NDg6NTkrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXE1ic3RyaW5nXFwiOiAiIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBmb3IgdGhlIE1ic3RyaW5nIGV4dGVuc2lvbiIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgIm1ic3RyaW5nIiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZy90cmVlL3YxLjMzLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFzLWdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtbWJzdHJpbmciCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtcGhwNzMiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zMy4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjMzLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA3My5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwZjY4YzAzNTY1ZGNhYWYyNWE4OTA2Njc1NDJlOGJkNzVmZTdlNWJiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1waHA3My96aXBiYWxsLzBmNjhjMDM1NjVkY2FhZjI1YTg5MDY2NzU0MmU4YmQ3NWZlN2U1YmIiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICIwZjY4YzAzNTY1ZGNhYWYyNWE4OTA2Njc1NDJlOGJkNzVmZTdlNWJiIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMDktMDlUMTE6NDU6MTArMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXFBocDczXFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL3N0dWJzIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBiYWNrcG9ydGluZyBzb21lIFBIUCA3LjMrIGZlYXR1cmVzIHRvIGxvd2VyIFBIUCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDczL3RyZWUvdjEuMzMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL25pY29sYXMtZ3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA3MyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbC1waHA4MCIsCiAgICAgICAgICAgICJ2ZXJzaW9uIjogInYxLjMzLjAiLAogICAgICAgICAgICAidmVyc2lvbl9ub3JtYWxpemVkIjogIjEuMzMuMC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDgwLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjBjYzlkZDBmMTdmNjFkODEzMWU3ZGY2Yjg0YmQzNDQ4OTlmZTI2MDgiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3BvbHlmaWxsLXBocDgwL3ppcGJhbGwvMGNjOWRkMGYxN2Y2MWQ4MTMxZTdkZjZiODRiZDM0NDg5OWZlMjYwOCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjBjYzlkZDBmMTdmNjFkODEzMWU3ZGY2Yjg0YmQzNDQ4OTlmZTI2MDgiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInRpbWUiOiAiMjAyNS0wMS0wMlQwODoxMDoxMSswMDowMCIsCiAgICAgICAgICAgICJ0eXBlIjogImxpYnJhcnkiLAogICAgICAgICAgICAiZXh0cmEiOiB7CiAgICAgICAgICAgICAgICAidGhhbmtzIjogewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAiZmlsZXMiOiBbCiAgICAgICAgICAgICAgICAgICAgImJvb3RzdHJhcC5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxQb2x5ZmlsbFxcUGhwODBcXCI6ICIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgImNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICJSZXNvdXJjZXMvc3R1YnMiCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJub3RpZmljYXRpb24tdXJsIjogImh0dHBzOi8vcGFja2FnaXN0Lm9yZy9kb3dubG9hZHMvIiwKICAgICAgICAgICAgImxpY2Vuc2UiOiBbCiAgICAgICAgICAgICAgICAiTUlUIgogICAgICAgICAgICBdLAogICAgICAgICAgICAiYXV0aG9ycyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJJb24gQmF6YW4iLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJpb24uYmF6YW5AZ21haWwuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJOaWNvbGFzIEdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogInBAdGNod29yay5jb20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIlN5bWZvbnkgQ29tbXVuaXR5IiwKICAgICAgICAgICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9jb250cmlidXRvcnMiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJkZXNjcmlwdGlvbiI6ICJTeW1mb255IHBvbHlmaWxsIGJhY2twb3J0aW5nIHNvbWUgUEhQIDguMCsgZmVhdHVyZXMgdG8gbG93ZXIgUEhQIHZlcnNpb25zIiwKICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20iLAogICAgICAgICAgICAia2V5d29yZHMiOiBbCiAgICAgICAgICAgICAgICAiY29tcGF0aWJpbGl0eSIsCiAgICAgICAgICAgICAgICAicG9seWZpbGwiLAogICAgICAgICAgICAgICAgInBvcnRhYmxlIiwKICAgICAgICAgICAgICAgICJzaGltIgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtcGhwODAvdHJlZS92MS4zMy4wIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZnVuZGluZyI6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vc3ltZm9ueS5jb20vc3BvbnNvciIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiY3VzdG9tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9mYWJwb3QiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbmljb2xhcy1ncmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdGh1YiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3RpZGVsaWZ0LmNvbS9mdW5kaW5nL2dpdGh1Yi9wYWNrYWdpc3Qvc3ltZm9ueS9zeW1mb255IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJ0aWRlbGlmdCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImluc3RhbGwtcGF0aCI6ICIuLi9zeW1mb255L3BvbHlmaWxsLXBocDgwIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsLXBocDgxIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjEuMzMuMCIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiMS4zMy4wLjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcG9seWZpbGwtcGhwODEuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNGE0Y2ZjMmQyNTNjMjFhNWFkMGU1MzA3MWRmMjQ4ZWQ0OGM2Y2U1YyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvcG9seWZpbGwtcGhwODEvemlwYmFsbC80YTRjZmMyZDI1M2MyMWE1YWQwZTUzMDcxZGYyNDhlZDQ4YzZjZTVjIiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiNGE0Y2ZjMmQyNTNjMjFhNWFkMGU1MzA3MWRmMjQ4ZWQ0OGM2Y2U1YyIsCiAgICAgICAgICAgICAgICAic2hhc3VtIjogIiIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUiOiB7CiAgICAgICAgICAgICAgICAicGhwIjogIj49Ny4yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTA5VDExOjQ1OjEwKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wb2x5ZmlsbCIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiYm9vdHN0cmFwLnBocCIKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXFBvbHlmaWxsXFxQaHA4MVxcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiY2xhc3NtYXAiOiBbCiAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlcy9zdHVicyIKICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIlN5bWZvbnkgcG9seWZpbGwgYmFja3BvcnRpbmcgc29tZSBQSFAgOC4xKyBmZWF0dXJlcyB0byBsb3dlciBQSFAgdmVyc2lvbnMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJrZXl3b3JkcyI6IFsKICAgICAgICAgICAgICAgICJjb21wYXRpYmlsaXR5IiwKICAgICAgICAgICAgICAgICJwb2x5ZmlsbCIsCiAgICAgICAgICAgICAgICAicG9ydGFibGUiLAogICAgICAgICAgICAgICAgInNoaW0iCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA4MS90cmVlL3YxLjMzLjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJmdW5kaW5nIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9zeW1mb255LmNvbS9zcG9uc29yIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJjdXN0b20iCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2ZhYnBvdCIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9uaWNvbGFzLWdyZWthcyIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0aHViIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vdGlkZWxpZnQuY29tL2Z1bmRpbmcvZ2l0aHViL3BhY2thZ2lzdC9zeW1mb255L3N5bWZvbnkiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogInRpZGVsaWZ0IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiaW5zdGFsbC1wYXRoIjogIi4uL3N5bWZvbnkvcG9seWZpbGwtcGhwODEiCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvcG9seWZpbGwtcGhwODQiLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2MS4zMy4wIiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIxLjMzLjAuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJkOGNlZDRkODc1MTQyYjZhNzQyNjAwMDQyNmI4YWJjNjMxZDZiMTkxIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wb2x5ZmlsbC1waHA4NC96aXBiYWxsL2Q4Y2VkNGQ4NzUxNDJiNmE3NDI2MDAwNDI2YjhhYmM2MzFkNmIxOTEiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICJkOGNlZDRkODc1MTQyYjZhNzQyNjAwMDQyNmI4YWJjNjMxZDZiMTkxIiwKICAgICAgICAgICAgICAgICJzaGFzdW0iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAicmVxdWlyZSI6IHsKICAgICAgICAgICAgICAgICJwaHAiOiAiPj03LjIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjUtMDYtMjRUMTM6MzA6MTErMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImV4dHJhIjogewogICAgICAgICAgICAgICAgInRoYW5rcyI6IHsKICAgICAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsIiwKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3BvbHlmaWxsIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAiaW5zdGFsbGF0aW9uLXNvdXJjZSI6ICJkaXN0IiwKICAgICAgICAgICAgImF1dG9sb2FkIjogewogICAgICAgICAgICAgICAgImZpbGVzIjogWwogICAgICAgICAgICAgICAgICAgICJib290c3RyYXAucGhwIgogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICJwc3ItNCI6IHsKICAgICAgICAgICAgICAgICAgICAiU3ltZm9ueVxcUG9seWZpbGxcXFBocDg0XFwiOiAiIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJjbGFzc21hcCI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL3N0dWJzIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiU3ltZm9ueSBwb2x5ZmlsbCBiYWNrcG9ydGluZyBzb21lIFBIUCA4LjQrIGZlYXR1cmVzIHRvIGxvd2VyIFBIUCB2ZXJzaW9ucyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImNvbXBhdGliaWxpdHkiLAogICAgICAgICAgICAgICAgInBvbHlmaWxsIiwKICAgICAgICAgICAgICAgICJwb3J0YWJsZSIsCiAgICAgICAgICAgICAgICAic2hpbSIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgInN1cHBvcnQiOiB7CiAgICAgICAgICAgICAgICAic291cmNlIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3BvbHlmaWxsLXBocDg0L3RyZWUvdjEuMzMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL25pY29sYXMtZ3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wb2x5ZmlsbC1waHA4NCIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9wcm9jZXNzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjUuNC40NyIsCiAgICAgICAgICAgICJ2ZXJzaW9uX25vcm1hbGl6ZWQiOiAiNS40LjQ3LjAiLAogICAgICAgICAgICAic291cmNlIjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiZ2l0IiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvcHJvY2Vzcy5naXQiLAogICAgICAgICAgICAgICAgInJlZmVyZW5jZSI6ICI1ZDE2NjJmYjMyZWJjOTRmMTdkZGI4ZDYzNTQ1NGE3NzYwNjY3MzNkIgogICAgICAgICAgICB9LAogICAgICAgICAgICAiZGlzdCI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogInppcCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vYXBpLmdpdGh1Yi5jb20vcmVwb3Mvc3ltZm9ueS9wcm9jZXNzL3ppcGJhbGwvNWQxNjYyZmIzMmViYzk0ZjE3ZGRiOGQ2MzU0NTRhNzc2MDY2NzMzZCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjVkMTY2MmZiMzJlYmM5NGYxN2RkYjhkNjM1NDU0YTc3NjA2NjczM2QiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLXBocDgwIjogIl4xLjE2IgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTExLTA2VDExOjM2OjQyKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbXBvbmVudFxcUHJvY2Vzc1xcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiRmFiaWVuIFBvdGVuY2llciIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogImZhYmllbkBzeW1mb255LmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkV4ZWN1dGVzIGNvbW1hbmRzIGluIHN1Yi1wcm9jZXNzZXMiLAogICAgICAgICAgICAiaG9tZXBhZ2UiOiAiaHR0cHM6Ly9zeW1mb255LmNvbSIsCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9wcm9jZXNzL3RyZWUvdjUuNC40NyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9wcm9jZXNzIgogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAibmFtZSI6ICJzeW1mb255L3NlcnZpY2UtY29udHJhY3RzIiwKICAgICAgICAgICAgInZlcnNpb24iOiAidjIuNS40IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICIyLjUuNC4wIiwKICAgICAgICAgICAgInNvdXJjZSI6IHsKICAgICAgICAgICAgICAgICJ0eXBlIjogImdpdCIsCiAgICAgICAgICAgICAgICAidXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzLmdpdCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImYzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJkaXN0IjogewogICAgICAgICAgICAgICAgInR5cGUiOiAiemlwIiwKICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly9hcGkuZ2l0aHViLmNvbS9yZXBvcy9zeW1mb255L3NlcnZpY2UtY29udHJhY3RzL3ppcGJhbGwvZjM3YjQxOWY3YWVhMmU5YWJmMTBhYmQyNjE4MzJjYWNlMTJlMzMwMCIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogImYzN2I0MTlmN2FlYTJlOWFiZjEwYWJkMjYxODMyY2FjZTEyZTMzMDAiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJwc3IvY29udGFpbmVyIjogIl4xLjEiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzIjogIl4yLjF8XjMiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJleHQtcHNyIjogIjwxLjF8Pj0yIgogICAgICAgICAgICB9LAogICAgICAgICAgICAic3VnZ2VzdCI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3NlcnZpY2UtaW1wbGVtZW50YXRpb24iOiAiIgogICAgICAgICAgICB9LAogICAgICAgICAgICAidGltZSI6ICIyMDI0LTA5LTI1VDE0OjExOjEzKzAwOjAwIiwKICAgICAgICAgICAgInR5cGUiOiAibGlicmFyeSIsCiAgICAgICAgICAgICJleHRyYSI6IHsKICAgICAgICAgICAgICAgICJ0aGFua3MiOiB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9jb250cmFjdHMiLAogICAgICAgICAgICAgICAgICAgICJuYW1lIjogInN5bWZvbnkvY29udHJhY3RzIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICJicmFuY2gtYWxpYXMiOiB7CiAgICAgICAgICAgICAgICAgICAgImRldi1tYWluIjogIjIuNS1kZXYiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJpbnN0YWxsYXRpb24tc291cmNlIjogImRpc3QiLAogICAgICAgICAgICAiYXV0b2xvYWQiOiB7CiAgICAgICAgICAgICAgICAicHNyLTQiOiB7CiAgICAgICAgICAgICAgICAgICAgIlN5bWZvbnlcXENvbnRyYWN0c1xcU2VydmljZVxcIjogIiIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgIm5vdGlmaWNhdGlvbi11cmwiOiAiaHR0cHM6Ly9wYWNrYWdpc3Qub3JnL2Rvd25sb2Fkcy8iLAogICAgICAgICAgICAibGljZW5zZSI6IFsKICAgICAgICAgICAgICAgICJNSVQiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJhdXRob3JzIjogWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJuYW1lIjogIk5pY29sYXMgR3Jla2FzIiwKICAgICAgICAgICAgICAgICAgICAiZW1haWwiOiAicEB0Y2h3b3JrLmNvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiU3ltZm9ueSBDb21tdW5pdHkiLAogICAgICAgICAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tL2NvbnRyaWJ1dG9ycyIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgImRlc2NyaXB0aW9uIjogIkdlbmVyaWMgYWJzdHJhY3Rpb25zIHJlbGF0ZWQgdG8gd3JpdGluZyBzZXJ2aWNlcyIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImFic3RyYWN0aW9ucyIsCiAgICAgICAgICAgICAgICAiY29udHJhY3RzIiwKICAgICAgICAgICAgICAgICJkZWNvdXBsaW5nIiwKICAgICAgICAgICAgICAgICJpbnRlcmZhY2VzIiwKICAgICAgICAgICAgICAgICJpbnRlcm9wZXJhYmlsaXR5IiwKICAgICAgICAgICAgICAgICJzdGFuZGFyZHMiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJzdXBwb3J0IjogewogICAgICAgICAgICAgICAgInNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cy90cmVlL3YyLjUuNCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9zZXJ2aWNlLWNvbnRyYWN0cyIKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgIm5hbWUiOiAic3ltZm9ueS9zdHJpbmciLAogICAgICAgICAgICAidmVyc2lvbiI6ICJ2NS40LjQ3IiwKICAgICAgICAgICAgInZlcnNpb25fbm9ybWFsaXplZCI6ICI1LjQuNDcuMCIsCiAgICAgICAgICAgICJzb3VyY2UiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vc3ltZm9ueS9zdHJpbmcuZ2l0IiwKICAgICAgICAgICAgICAgICJyZWZlcmVuY2UiOiAiMTM2Y2E3ZDcyZjcyYjU5OWYyNjMxYWNhNDc0YTRmOGUyNjcxOTc5OSIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRpc3QiOiB7CiAgICAgICAgICAgICAgICAidHlwZSI6ICJ6aXAiLAogICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2FwaS5naXRodWIuY29tL3JlcG9zL3N5bWZvbnkvc3RyaW5nL3ppcGJhbGwvMTM2Y2E3ZDcyZjcyYjU5OWYyNjMxYWNhNDc0YTRmOGUyNjcxOTc5OSIsCiAgICAgICAgICAgICAgICAicmVmZXJlbmNlIjogIjEzNmNhN2Q3MmY3MmI1OTlmMjYzMWFjYTQ3NGE0ZjhlMjY3MTk3OTkiLAogICAgICAgICAgICAgICAgInNoYXN1bSI6ICIiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXF1aXJlIjogewogICAgICAgICAgICAgICAgInBocCI6ICI+PTcuMi41IiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLWN0eXBlIjogIn4xLjgiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZSI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLWludGwtbm9ybWFsaXplciI6ICJ+MS4wIiwKICAgICAgICAgICAgICAgICJzeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nIjogIn4xLjAiLAogICAgICAgICAgICAgICAgInN5bWZvbnkvcG9seWZpbGwtcGhwODAiOiAifjEuMTUiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJjb25mbGljdCI6IHsKICAgICAgICAgICAgICAgICJzeW1mb255L3RyYW5zbGF0aW9uLWNvbnRyYWN0cyI6ICI+PTMuMCIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgInJlcXVpcmUtZGV2IjogewogICAgICAgICAgICAgICAgInN5bWZvbnkvZXJyb3ItaGFuZGxlciI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS9odHRwLWNsaWVudCI6ICJeNC40fF41LjB8XjYuMCIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS90cmFuc2xhdGlvbi1jb250cmFjdHMiOiAiXjEuMXxeMiIsCiAgICAgICAgICAgICAgICAic3ltZm9ueS92YXItZXhwb3J0ZXIiOiAiXjQuNHxeNS4wfF42LjAiCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJ0aW1lIjogIjIwMjQtMTEtMTBUMjA6MzM6NTgrMDA6MDAiLAogICAgICAgICAgICAidHlwZSI6ICJsaWJyYXJ5IiwKICAgICAgICAgICAgImluc3RhbGxhdGlvbi1zb3VyY2UiOiAiZGlzdCIsCiAgICAgICAgICAgICJhdXRvbG9hZCI6IHsKICAgICAgICAgICAgICAgICJmaWxlcyI6IFsKICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2VzL2Z1bmN0aW9ucy5waHAiCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgInBzci00IjogewogICAgICAgICAgICAgICAgICAgICJTeW1mb255XFxDb21wb25lbnRcXFN0cmluZ1xcIjogIiIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAiZXhjbHVkZS1mcm9tLWNsYXNzbWFwIjogWwogICAgICAgICAgICAgICAgICAgICIvVGVzdHMvIgogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9LAogICAgICAgICAgICAibm90aWZpY2F0aW9uLXVybCI6ICJodHRwczovL3BhY2thZ2lzdC5vcmcvZG93bmxvYWRzLyIsCiAgICAgICAgICAgICJsaWNlbnNlIjogWwogICAgICAgICAgICAgICAgIk1JVCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgImF1dGhvcnMiOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIm5hbWUiOiAiTmljb2xhcyBHcmVrYXMiLAogICAgICAgICAgICAgICAgICAgICJlbWFpbCI6ICJwQHRjaHdvcmsuY29tIgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAibmFtZSI6ICJTeW1mb255IENvbW11bml0eSIsCiAgICAgICAgICAgICAgICAgICAgImhvbWVwYWdlIjogImh0dHBzOi8vc3ltZm9ueS5jb20vY29udHJpYnV0b3JzIgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLAogICAgICAgICAgICAiZGVzY3JpcHRpb24iOiAiUHJvdmlkZXMgYW4gb2JqZWN0LW9yaWVudGVkIEFQSSB0byBzdHJpbmdzIGFuZCBkZWFscyB3aXRoIGJ5dGVzLCBVVEYtOCBjb2RlIHBvaW50cyBhbmQgZ3JhcGhlbWUgY2x1c3RlcnMgaW4gYSB1bmlmaWVkIHdheSIsCiAgICAgICAgICAgICJob21lcGFnZSI6ICJodHRwczovL3N5bWZvbnkuY29tIiwKICAgICAgICAgICAgImtleXdvcmRzIjogWwogICAgICAgICAgICAgICAgImdyYXBoZW1lIiwKICAgICAgICAgICAgICAgICJpMThuIiwKICAgICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICAgInVuaWNvZGUiLAogICAgICAgICAgICAgICAgInV0Zi04IiwKICAgICAgICAgICAgICAgICJ1dGY4IgogICAgICAgICAgICBdLAogICAgICAgICAgICAic3VwcG9ydCI6IHsKICAgICAgICAgICAgICAgICJzb3VyY2UiOiAiaHR0cHM6Ly9naXRodWIuY29tL3N5bWZvbnkvc3RyaW5nL3RyZWUvdjUuNC40NyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImZ1bmRpbmciOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL3N5bWZvbnkuY29tL3Nwb25zb3IiLAogICAgICAgICAgICAgICAgICAgICJ0eXBlIjogImN1c3RvbSIKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vZmFicG90IiwKICAgICAgICAgICAgICAgICAgICAidHlwZSI6ICJnaXRodWIiCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICJ1cmwiOiAiaHR0cHM6Ly90aWRlbGlmdC5jb20vZnVuZGluZy9naXRodWIvcGFja2FnaXN0L3N5bWZvbnkvc3ltZm9ueSIsCiAgICAgICAgICAgICAgICAgICAgInR5cGUiOiAidGlkZWxpZnQiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJpbnN0YWxsLXBhdGgiOiAiLi4vc3ltZm9ueS9zdHJpbmciCiAgICAgICAgfQogICAgXSwKICAgICJkZXYiOiBmYWxzZSwKICAgICJkZXYtcGFja2FnZS1uYW1lcyI6IFtdCn0KPD9waHAgcmV0dXJuIGFycmF5KAoncm9vdCcgPT4gYXJyYXkoCiduYW1lJyA9PiAnY29tcG9zZXIvY29tcG9zZXInLAoncHJldHR5X3ZlcnNpb24nID0+ICcyLjkuNCcsCid2ZXJzaW9uJyA9PiAnMi45LjQuMCcsCidyZWZlcmVuY2UnID0+ICdkNDIyNTE1Mzk0MGI3YzA2ZjBlODI1MTk1YmRiZGMzMTJjNjdkOTE3JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vLi4vJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXYnID0+IGZhbHNlLAopLAondmVyc2lvbnMnID0+IGFycmF5KAonY29tcG9zZXIvY2EtYnVuZGxlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS41LjEwJywKJ3ZlcnNpb24nID0+ICcxLjUuMTAuMCcsCidyZWZlcmVuY2UnID0+ICc5NjFhNWU0MDU2ZGQyZTRhMmVlZGNhYzc1NzYwNzU5NDdjMjhiZjYzJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi9jYS1idW5kbGUnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9jbGFzcy1tYXAtZ2VuZXJhdG9yJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS43LjEnLAondmVyc2lvbicgPT4gJzEuNy4xLjAnLAoncmVmZXJlbmNlJyA9PiAnOGY1ZmEzY2MyMTQyMzBlNzFmNTQ5MjRiZDAxOTdhM2JjYzcwNWViMScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vY2xhc3MtbWFwLWdlbmVyYXRvcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL2NvbXBvc2VyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMi45LjQnLAondmVyc2lvbicgPT4gJzIuOS40LjAnLAoncmVmZXJlbmNlJyA9PiAnZDQyMjUxNTM5NDBiN2MwNmYwZTgyNTE5NWJkYmRjMzEyYzY3ZDkxNycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uLy4uLycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL21ldGFkYXRhLW1pbmlmaWVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS4wLjAnLAondmVyc2lvbicgPT4gJzEuMC4wLjAnLAoncmVmZXJlbmNlJyA9PiAnYzU0OWQyMzgyOTUzNmYwZDBlOTg0YWFhYmJmMDJhZjkxZjQ0MzIwNycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vbWV0YWRhdGEtbWluaWZpZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidjb21wb3Nlci9wY3JlJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMi4zLjInLAondmVyc2lvbicgPT4gJzIuMy4yLjAnLAoncmVmZXJlbmNlJyA9PiAnZWJiODFkZjhmNTJiNDAxNzJkMTQwNjJhZTk2YTA2OTM5ZDgwYTA2OScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4vcGNyZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL3NlbXZlcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzMuNC40JywKJ3ZlcnNpb24nID0+ICczLjQuNC4wJywKJ3JlZmVyZW5jZScgPT4gJzE5ODE2NjYxODkwNmNiMmRlNjliOTVkN2Q0N2U1ZmE4YWExYjJiOTUnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uL3NlbXZlcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2NvbXBvc2VyL3NwZHgtbGljZW5zZXMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICcxLjUuOScsCid2ZXJzaW9uJyA9PiAnMS41LjkuMCcsCidyZWZlcmVuY2UnID0+ICdlZGYzNjRjZWZlOGM0MzUwMWUyMWU4ODExMGFhYzEwYjI4NGMzYzlmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi9zcGR4LWxpY2Vuc2VzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonY29tcG9zZXIveGRlYnVnLWhhbmRsZXInID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICczLjAuNScsCid2ZXJzaW9uJyA9PiAnMy4wLjUuMCcsCidyZWZlcmVuY2UnID0+ICc2YzE5MjU1NjE2MzJlODNkNjBhNDQ0OTJlMGIzNDRjZjQ4YWI4NWVmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi94ZGVidWctaGFuZGxlcicsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ2p1c3RpbnJhaW5ib3cvanNvbi1zY2hlbWEnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICc2LjYuNCcsCid2ZXJzaW9uJyA9PiAnNi42LjQuMCcsCidyZWZlcmVuY2UnID0+ICcyZWViNzVkMjFjZjczMjExMzM1ODg4ZTdmNWU2ZmQ3NDQwNzIzZWM3JywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vanVzdGlucmFpbmJvdy9qc29uLXNjaGVtYScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ21hcmMtbWFiZS9waHAtZW51bScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y0LjcuMicsCid2ZXJzaW9uJyA9PiAnNC43LjIuMCcsCidyZWZlcmVuY2UnID0+ICdiYjQyNmZjZGQ2NWM2MGZiMzYzOGVmNzQxZTg3ODI1MDhmZGE3ZWVmJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vbWFyYy1tYWJlL3BocC1lbnVtJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAoncHNyL2NvbnRhaW5lcicgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMS4xJywKJ3ZlcnNpb24nID0+ICcxLjEuMS4wJywKJ3JlZmVyZW5jZScgPT4gJzg2MjI1Njc0MDkwMTAyODJiN2FlZWJlNGJiODQxZmU5OGI1OGRjYWYnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9wc3IvY29udGFpbmVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAoncHNyL2xvZycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMS40JywKJ3ZlcnNpb24nID0+ICcxLjEuNC4wJywKJ3JlZmVyZW5jZScgPT4gJ2Q0OTY5NWI5MDljM2I3NjI4YjYyODlkYjU0NzlhMWMyMDQ2MDFmMTEnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9wc3IvbG9nJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAoncHNyL2xvZy1pbXBsZW1lbnRhdGlvbicgPT4gYXJyYXkoCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAoncHJvdmlkZWQnID0+IGFycmF5KAowID0+ICcxLjB8Mi4wJywKKSwKKSwKJ3JlYWN0L3Byb21pc2UnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2My4zLjAnLAondmVyc2lvbicgPT4gJzMuMy4wLjAnLAoncmVmZXJlbmNlJyA9PiAnMjM0NDRmNTNhODEzYTMyOTZjMTM2OGJiMTA0NzkzY2U4ZDg4ZjA0YScsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3JlYWN0L3Byb21pc2UnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzZWxkL2pzb25saW50JyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMS4xMS4wJywKJ3ZlcnNpb24nID0+ICcxLjExLjAuMCcsCidyZWZlcmVuY2UnID0+ICcxNzQ4YWFmODQ3ZmM3MzFjZmFkNzcyNWFlYzQxM2VlNDZmMGNjM2EyJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc2VsZC9qc29ubGludCcsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3NlbGQvcGhhci11dGlscycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJzEuMi4xJywKJ3ZlcnNpb24nID0+ICcxLjIuMS4wJywKJ3JlZmVyZW5jZScgPT4gJ2VhMmY0MDE0ZjE2M2MxYmU0YzYwMWI5YjdiZDZhZjgxYmE4ZDcwMWMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zZWxkL3BoYXItdXRpbHMnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzZWxkL3NpZ25hbC1oYW5kbGVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAnMi4wLjInLAondmVyc2lvbicgPT4gJzIuMC4yLjAnLAoncmVmZXJlbmNlJyA9PiAnMDRhNjExMmU4ODNhZDc2YzBhZGE4ZTRhOWY3NTIwYmJmZGI2YmI5OCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3NlbGQvc2lnbmFsLWhhbmRsZXInLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L2NvbnNvbGUnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2NS40LjQ3JywKJ3ZlcnNpb24nID0+ICc1LjQuNDcuMCcsCidyZWZlcmVuY2UnID0+ICdjNGJhOTgwY2E2MWE5ZWIxOGVlNmJjYzczZjI4ZTQ3NTg1MmJiMWVkJywKJ3R5cGUnID0+ICdsaWJyYXJ5JywKJ2luc3RhbGxfcGF0aCcgPT4gX19ESVJfXyAuICcvLi4vc3ltZm9ueS9jb25zb2xlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9kZXByZWNhdGlvbi1jb250cmFjdHMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2Mi41LjQnLAondmVyc2lvbicgPT4gJzIuNS40LjAnLAoncmVmZXJlbmNlJyA9PiAnNjA1Mzg5ZjJhN2U1NjI1ZjI3M2I1Mzk2MGRjNDZhZWFmOWM2MjkxOCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvZGVwcmVjYXRpb24tY29udHJhY3RzJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9maWxlc3lzdGVtJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC40NScsCid2ZXJzaW9uJyA9PiAnNS40LjQ1LjAnLAoncmVmZXJlbmNlJyA9PiAnNTdjODI5NGVkMzdkNGEwNTViNzcwNTc4MjdjNjdmOTU1OGM5NWM1NCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvZmlsZXN5c3RlbScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvZmluZGVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC40NScsCid2ZXJzaW9uJyA9PiAnNS40LjQ1LjAnLAoncmVmZXJlbmNlJyA9PiAnNjM3NDE3ODRjZDdiOTk2Nzk3NWVlYzYxMGIyNTZlZWQzZWRlMDIyYicsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvZmluZGVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1jdHlwZScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMzLjAnLAondmVyc2lvbicgPT4gJzEuMzMuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2EzY2M4YjA0NGE2ZWE1MTMzMTBjYmQ0OGVmNzMzM2IzODQ5NDU2MzgnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLWN0eXBlJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1pbnRsLWdyYXBoZW1lJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjEuMzMuMCcsCid2ZXJzaW9uJyA9PiAnMS4zMy4wLjAnLAoncmVmZXJlbmNlJyA9PiAnMzgwODcyMTMwZDNhNWRkM2FjZTJmNDAxMGQ5NTEyNWZkZTVkNWM3MCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ncmFwaGVtZScsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjEuMzMuMCcsCid2ZXJzaW9uJyA9PiAnMS4zMy4wLjAnLAoncmVmZXJlbmNlJyA9PiAnMzgzM2Q3MjU1Y2MzMDM1NDY0MzVjYjY1MDMxNmJmZjcwOGExYzc1YycsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvcG9seWZpbGwtaW50bC1ub3JtYWxpemVyJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1tYnN0cmluZycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMzLjAnLAondmVyc2lvbicgPT4gJzEuMzMuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzZkODU3ZjRkNzZiZDRiMzQzZWFjMjZkNmI1Mzk1ODVkMmJjNTY0OTMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLW1ic3RyaW5nJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA3MycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMzLjAnLAondmVyc2lvbicgPT4gJzEuMzMuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzBmNjhjMDM1NjVkY2FhZjI1YTg5MDY2NzU0MmU4YmQ3NWZlN2U1YmInLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDczJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA4MCcgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMzLjAnLAondmVyc2lvbicgPT4gJzEuMzMuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzBjYzlkZDBmMTdmNjFkODEzMWU3ZGY2Yjg0YmQzNDQ4OTlmZTI2MDgnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDgwJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA4MScgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMzLjAnLAondmVyc2lvbicgPT4gJzEuMzMuMC4wJywKJ3JlZmVyZW5jZScgPT4gJzRhNGNmYzJkMjUzYzIxYTVhZDBlNTMwNzFkZjI0OGVkNDhjNmNlNWMnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDgxJywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wb2x5ZmlsbC1waHA4NCcgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3YxLjMzLjAnLAondmVyc2lvbicgPT4gJzEuMzMuMC4wJywKJ3JlZmVyZW5jZScgPT4gJ2Q4Y2VkNGQ4NzUxNDJiNmE3NDI2MDAwNDI2YjhhYmM2MzFkNmIxOTEnLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3BvbHlmaWxsLXBocDg0JywKJ2FsaWFzZXMnID0+IGFycmF5KCksCidkZXZfcmVxdWlyZW1lbnQnID0+IGZhbHNlLAopLAonc3ltZm9ueS9wcm9jZXNzJyA9PiBhcnJheSgKJ3ByZXR0eV92ZXJzaW9uJyA9PiAndjUuNC40NycsCid2ZXJzaW9uJyA9PiAnNS40LjQ3LjAnLAoncmVmZXJlbmNlJyA9PiAnNWQxNjYyZmIzMmViYzk0ZjE3ZGRiOGQ2MzU0NTRhNzc2MDY2NzMzZCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvcHJvY2VzcycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKJ3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnID0+IGFycmF5KAoncHJldHR5X3ZlcnNpb24nID0+ICd2Mi41LjQnLAondmVyc2lvbicgPT4gJzIuNS40LjAnLAoncmVmZXJlbmNlJyA9PiAnZjM3YjQxOWY3YWVhMmU5YWJmMTBhYmQyNjE4MzJjYWNlMTJlMzMwMCcsCid0eXBlJyA9PiAnbGlicmFyeScsCidpbnN0YWxsX3BhdGgnID0+IF9fRElSX18gLiAnLy4uL3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLAonYWxpYXNlcycgPT4gYXJyYXkoKSwKJ2Rldl9yZXF1aXJlbWVudCcgPT4gZmFsc2UsCiksCidzeW1mb255L3N0cmluZycgPT4gYXJyYXkoCidwcmV0dHlfdmVyc2lvbicgPT4gJ3Y1LjQuNDcnLAondmVyc2lvbicgPT4gJzUuNC40Ny4wJywKJ3JlZmVyZW5jZScgPT4gJzEzNmNhN2Q3MmY3MmI1OTlmMjYzMWFjYTQ3NGE0ZjhlMjY3MTk3OTknLAondHlwZScgPT4gJ2xpYnJhcnknLAonaW5zdGFsbF9wYXRoJyA9PiBfX0RJUl9fIC4gJy8uLi9zeW1mb255L3N0cmluZycsCidhbGlhc2VzJyA9PiBhcnJheSgpLAonZGV2X3JlcXVpcmVtZW50JyA9PiBmYWxzZSwKKSwKKSwKKTsKCkNvcHlyaWdodCAoQykgMjAyMSBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcTWV0YWRhdGFNaW5pZmllcjsKCmNsYXNzIE1ldGFkYXRhTWluaWZpZXIKewoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGV4cGFuZChhcnJheSAkdmVyc2lvbnMpCnsKJGV4cGFuZGVkID0gYXJyYXkoKTsKJGV4cGFuZGVkVmVyc2lvbiA9IG51bGw7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbkRhdGEpIHsKaWYgKCEkZXhwYW5kZWRWZXJzaW9uKSB7CiRleHBhbmRlZFZlcnNpb24gPSAkdmVyc2lvbkRhdGE7CiRleHBhbmRlZFtdID0gJGV4cGFuZGVkVmVyc2lvbjsKY29udGludWU7Cn0KCgpmb3JlYWNoICgkdmVyc2lvbkRhdGEgYXMgJGtleSA9PiAkdmFsKSB7CmlmICgkdmFsID09PSAnX191bnNldCcpIHsKdW5zZXQoJGV4cGFuZGVkVmVyc2lvblska2V5XSk7Cn0gZWxzZSB7CiRleHBhbmRlZFZlcnNpb25bJGtleV0gPSAkdmFsOwp9Cn0KCiRleHBhbmRlZFtdID0gJGV4cGFuZGVkVmVyc2lvbjsKfQoKcmV0dXJuICRleHBhbmRlZDsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtaW5pZnkoYXJyYXkgJHZlcnNpb25zKQp7CiRtaW5pZmllZFZlcnNpb25zID0gYXJyYXkoKTsKCiRsYXN0S25vd25WZXJzaW9uRGF0YSA9IG51bGw7CmZvcmVhY2ggKCR2ZXJzaW9ucyBhcyAkdmVyc2lvbikgewppZiAoISRsYXN0S25vd25WZXJzaW9uRGF0YSkgewokbGFzdEtub3duVmVyc2lvbkRhdGEgPSAkdmVyc2lvbjsKJG1pbmlmaWVkVmVyc2lvbnNbXSA9ICR2ZXJzaW9uOwpjb250aW51ZTsKfQoKJG1pbmlmaWVkVmVyc2lvbiA9IGFycmF5KCk7CgoKZm9yZWFjaCAoJHZlcnNpb24gYXMgJGtleSA9PiAkdmFsKSB7CmlmICghaXNzZXQoJGxhc3RLbm93blZlcnNpb25EYXRhWyRrZXldKSB8fCAkbGFzdEtub3duVmVyc2lvbkRhdGFbJGtleV0gIT09ICR2YWwpIHsKJG1pbmlmaWVkVmVyc2lvblska2V5XSA9ICR2YWw7CiRsYXN0S25vd25WZXJzaW9uRGF0YVska2V5XSA9ICR2YWw7Cn0KfQoKCmZvcmVhY2ggKCRsYXN0S25vd25WZXJzaW9uRGF0YSBhcyAka2V5ID0+ICR2YWwpIHsKaWYgKCFpc3NldCgkdmVyc2lvblska2V5XSkpIHsKJG1pbmlmaWVkVmVyc2lvblska2V5XSA9ICJfX3Vuc2V0IjsKdW5zZXQoJGxhc3RLbm93blZlcnNpb25EYXRhWyRrZXldKTsKfQp9CgokbWluaWZpZWRWZXJzaW9uc1tdID0gJG1pbmlmaWVkVmVyc2lvbjsKfQoKcmV0dXJuICRtaW5pZmllZFZlcnNpb25zOwp9Cn0KCkNvcHlyaWdodCAoQykgMjAyMSBDb21wb3NlcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzCm9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbwpzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoQWxsUmVzdWx0CnsKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGNvdW50LCBhcnJheSAkbWF0Y2hlcykKewokdGhpcy0+bWF0Y2hlcyA9ICRtYXRjaGVzOwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7CiR0aGlzLT5jb3VudCA9ICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoQWxsU3RyaWN0R3JvdXBzUmVzdWx0CnsKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGNvdW50LCBhcnJheSAkbWF0Y2hlcykKewokdGhpcy0+bWF0Y2hlcyA9ICRtYXRjaGVzOwokdGhpcy0+bWF0Y2hlZCA9IChib29sKSAkY291bnQ7CiR0aGlzLT5jb3VudCA9ICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoQWxsV2l0aE9mZnNldHNSZXN1bHQKewoKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkY291bnQ7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50OwokdGhpcy0+Y291bnQgPSAkY291bnQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpmaW5hbCBjbGFzcyBNYXRjaFJlc3VsdAp7CgoKCgoKCnB1YmxpYyAkbWF0Y2hlczsKCgoKCgpwdWJsaWMgJG1hdGNoZWQ7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGludCAkY291bnQsIGFycmF5ICRtYXRjaGVzKQp7CiR0aGlzLT5tYXRjaGVzID0gJG1hdGNoZXM7CiR0aGlzLT5tYXRjaGVkID0gKGJvb2wpICRjb3VudDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmZpbmFsIGNsYXNzIE1hdGNoU3RyaWN0R3JvdXBzUmVzdWx0CnsKCgoKCgoKcHVibGljICRtYXRjaGVzOwoKCgoKCnB1YmxpYyAkbWF0Y2hlZDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKZmluYWwgY2xhc3MgTWF0Y2hXaXRoT2Zmc2V0c1Jlc3VsdAp7CgoKCgoKCgpwdWJsaWMgJG1hdGNoZXM7CgoKCgoKcHVibGljICRtYXRjaGVkOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRjb3VudCwgYXJyYXkgJG1hdGNoZXMpCnsKJHRoaXMtPm1hdGNoZXMgPSAkbWF0Y2hlczsKJHRoaXMtPm1hdGNoZWQgPSAoYm9vbCkgJGNvdW50Owp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXMgPSAxKTsKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgQ29tcG9zZXJcUGNyZVxSZWdleDsKdXNlIENvbXBvc2VyXFBjcmVcUGNyZUV4Y2VwdGlvbjsKdXNlIE5ldHRlXFV0aWxzXFJlZ2V4cEV4Y2VwdGlvbjsKdXNlIE5ldHRlXFV0aWxzXFN0cmluZ3M7CnVzZSBQaHBQYXJzZXJcTm9kZTsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcU3RhdGljQ2FsbDsKdXNlIFBocFBhcnNlclxOb2RlXE5hbWVcRnVsbHlRdWFsaWZpZWQ7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxSdWxlc1xSdWxlOwp1c2UgUEhQU3RhblxSdWxlc1xSdWxlRXJyb3JCdWlsZGVyOwp1c2UgZnVuY3Rpb24gaW5fYXJyYXk7CnVzZSBmdW5jdGlvbiBzcHJpbnRmOwoKCgoKCgpjbGFzcyBJbnZhbGlkUmVnZXhQYXR0ZXJuUnVsZSBpbXBsZW1lbnRzIFJ1bGUKewpwdWJsaWMgZnVuY3Rpb24gZ2V0Tm9kZVR5cGUoKTogc3RyaW5nCnsKcmV0dXJuIFN0YXRpY0NhbGw6OmNsYXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJvY2Vzc05vZGUoTm9kZSAkbm9kZSwgU2NvcGUgJHNjb3BlKTogYXJyYXkKewokcGF0dGVybnMgPSAkdGhpcy0+ZXh0cmFjdFBhdHRlcm5zKCRub2RlLCAkc2NvcGUpOwoKJGVycm9ycyA9IFtdOwpmb3JlYWNoICgkcGF0dGVybnMgYXMgJHBhdHRlcm4pIHsKJGVycm9yTWVzc2FnZSA9ICR0aGlzLT52YWxpZGF0ZVBhdHRlcm4oJHBhdHRlcm4pOwppZiAoJGVycm9yTWVzc2FnZSA9PT0gbnVsbCkgewpjb250aW51ZTsKfQoKJGVycm9yc1tdID0gUnVsZUVycm9yQnVpbGRlcjo6bWVzc2FnZShzcHJpbnRmKCdSZWdleCBwYXR0ZXJuIGlzIGludmFsaWQ6ICVzJywgJGVycm9yTWVzc2FnZSkpLT5pZGVudGlmaWVyKCdyZWdleHAucGF0dGVybicpLT5idWlsZCgpOwp9CgpyZXR1cm4gJGVycm9yczsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHRyYWN0UGF0dGVybnMoU3RhdGljQ2FsbCAkbm9kZSwgU2NvcGUgJHNjb3BlKTogYXJyYXkKewppZiAoISRub2RlLT5jbGFzcyBpbnN0YW5jZW9mIEZ1bGx5UXVhbGlmaWVkKSB7CnJldHVybiBbXTsKfQokaXNSZWdleCA9ICRub2RlLT5jbGFzcy0+dG9TdHJpbmcoKSA9PT0gUmVnZXg6OmNsYXNzOwokaXNQcmVnID0gJG5vZGUtPmNsYXNzLT50b1N0cmluZygpID09PSBQcmVnOjpjbGFzczsKaWYgKCEkaXNSZWdleCAmJiAhJGlzUHJlZykgewpyZXR1cm4gW107Cn0KaWYgKCEkbm9kZS0+bmFtZSBpbnN0YW5jZW9mIE5vZGVcSWRlbnRpZmllciB8fCAhUHJlZzo6aXNNYXRjaCgne14obWF0Y2h8aXNNYXRjaHxncmVwfHJlcGxhY2V8c3BsaXQpfScsICRub2RlLT5uYW1lLT5uYW1lKSkgewpyZXR1cm4gW107Cn0KCiRmdW5jdGlvbk5hbWUgPSAkbm9kZS0+bmFtZS0+bmFtZTsKaWYgKCFpc3NldCgkbm9kZS0+Z2V0QXJncygpWzBdKSkgewpyZXR1cm4gW107Cn0KCiRwYXR0ZXJuTm9kZSA9ICRub2RlLT5nZXRBcmdzKClbMF0tPnZhbHVlOwokcGF0dGVyblR5cGUgPSAkc2NvcGUtPmdldFR5cGUoJHBhdHRlcm5Ob2RlKTsKCiRwYXR0ZXJuU3RyaW5ncyA9IFtdOwoKZm9yZWFjaCAoJHBhdHRlcm5UeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKSBhcyAkY29uc3RhbnRTdHJpbmdUeXBlKSB7CmlmICgkZnVuY3Rpb25OYW1lID09PSAncmVwbGFjZUNhbGxiYWNrQXJyYXknKSB7CmNvbnRpbnVlOwp9CgokcGF0dGVyblN0cmluZ3NbXSA9ICRjb25zdGFudFN0cmluZ1R5cGUtPmdldFZhbHVlKCk7Cn0KCmZvcmVhY2ggKCRwYXR0ZXJuVHlwZS0+Z2V0Q29uc3RhbnRBcnJheXMoKSBhcyAkY29uc3RhbnRBcnJheVR5cGUpIHsKaWYgKAppbl9hcnJheSgkZnVuY3Rpb25OYW1lLCBbCidyZXBsYWNlJywKJ3JlcGxhY2VDYWxsYmFjaycsCl0sIHRydWUpCikgewpmb3JlYWNoICgkY29uc3RhbnRBcnJheVR5cGUtPmdldFZhbHVlVHlwZXMoKSBhcyAkYXJyYXlLZXlUeXBlKSB7CmZvcmVhY2ggKCRhcnJheUtleVR5cGUtPmdldENvbnN0YW50U3RyaW5ncygpIGFzICRjb25zdGFudFN0cmluZykgewokcGF0dGVyblN0cmluZ3NbXSA9ICRjb25zdGFudFN0cmluZy0+Z2V0VmFsdWUoKTsKfQp9Cn0KCmlmICgkZnVuY3Rpb25OYW1lICE9PSAncmVwbGFjZUNhbGxiYWNrQXJyYXknKSB7CmNvbnRpbnVlOwp9Cgpmb3JlYWNoICgkY29uc3RhbnRBcnJheVR5cGUtPmdldEtleVR5cGVzKCkgYXMgJGFycmF5S2V5VHlwZSkgewpmb3JlYWNoICgkYXJyYXlLZXlUeXBlLT5nZXRDb25zdGFudFN0cmluZ3MoKSBhcyAkY29uc3RhbnRTdHJpbmcpIHsKJHBhdHRlcm5TdHJpbmdzW10gPSAkY29uc3RhbnRTdHJpbmctPmdldFZhbHVlKCk7Cn0KfQp9CgpyZXR1cm4gJHBhdHRlcm5TdHJpbmdzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlUGF0dGVybihzdHJpbmcgJHBhdHRlcm4pOiA/c3RyaW5nCnsKdHJ5IHsKJG1zZyA9IG51bGw7CiRwcmV2ID0gc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKGludCAkc2V2ZXJpdHksIHN0cmluZyAkbWVzc2FnZSwgc3RyaW5nICRmaWxlKSB1c2UgKCYkbXNnKTogYm9vbCB7CiRtc2cgPSBwcmVnX3JlcGxhY2UoIiNecHJlZ19tYXRjaChfYWxsKT9cXCguKj9cXCk6ICMiLCAnJywgJG1lc3NhZ2UpOwoKcmV0dXJuIHRydWU7Cn0pOwoKaWYgKCRwYXR0ZXJuID09PSAnJykgewpyZXR1cm4gJ0VtcHR5IHN0cmluZyBpcyBub3QgYSB2YWxpZCByZWd1bGFyIGV4cHJlc3Npb24nOwp9CgpQcmVnOjptYXRjaCgkcGF0dGVybiwgJycpOwppZiAoJG1zZyAhPT0gbnVsbCkgewpyZXR1cm4gJG1zZzsKfQp9IGNhdGNoIChQY3JlRXhjZXB0aW9uICRlKSB7CmlmICgkZS0+Z2V0Q29kZSgpID09PSBQUkVHX0lOVEVSTkFMX0VSUk9SICYmICRtc2cgIT09IG51bGwpIHsKcmV0dXJuICRtc2c7Cn0KCnJldHVybiBwcmVnX3JlcGxhY2UoJ3suKj8gZmFpbGVkIGV4ZWN1dGluZyAiLioiOiB9JywgJycsICRlLT5nZXRNZXNzYWdlKCkpOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKcmV0dXJuIG51bGw7Cn0KCn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZVxQSFBTdGFuOwoKdXNlIFBIUFN0YW5cQW5hbHlzZXJcU2NvcGU7CnVzZSBQSFBTdGFuXFR5cGVcQXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50QXJyYXlUeXBlOwp1c2UgUEhQU3RhblxUeXBlXENvbnN0YW50XENvbnN0YW50SW50ZWdlclR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcSW50ZXJzZWN0aW9uVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlOwp1c2UgUGhwUGFyc2VyXE5vZGVcQXJnOwp1c2UgUEhQU3RhblxUeXBlXFBocFxSZWdleEFycmF5U2hhcGVNYXRjaGVyOwp1c2UgUEhQU3RhblxUeXBlXFR5cGVUcmF2ZXJzZXI7CnVzZSBQSFBTdGFuXFR5cGVcVW5pb25UeXBlOwoKZmluYWwgY2xhc3MgUHJlZ01hdGNoRmxhZ3MKewpzdGF0aWMgcHVibGljIGZ1bmN0aW9uIGdldFR5cGUoP0FyZyAkZmxhZ3NBcmcsIFNjb3BlICRzY29wZSk6ID9UeXBlCnsKaWYgKCRmbGFnc0FyZyA9PT0gbnVsbCkgewpyZXR1cm4gbmV3IENvbnN0YW50SW50ZWdlclR5cGUoUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI6OlBSRUdfVU5NQVRDSEVEX0FTX05VTExfT05fNzJfNzMpOwp9CgokZmxhZ3NUeXBlID0gJHNjb3BlLT5nZXRUeXBlKCRmbGFnc0FyZy0+dmFsdWUpOwoKJGNvbnN0YW50U2NhbGFycyA9ICRmbGFnc1R5cGUtPmdldENvbnN0YW50U2NhbGFyVmFsdWVzKCk7CmlmICgkY29uc3RhbnRTY2FsYXJzID09PSBbXSkgewpyZXR1cm4gbnVsbDsKfQoKJGludGVybmFsRmxhZ3NUeXBlcyA9IFtdOwpmb3JlYWNoICgkZmxhZ3NUeXBlLT5nZXRDb25zdGFudFNjYWxhclZhbHVlcygpIGFzICRjb25zdGFudFNjYWxhclZhbHVlKSB7CmlmICghaXNfaW50KCRjb25zdGFudFNjYWxhclZhbHVlKSkgewpyZXR1cm4gbnVsbDsKfQoKJGludGVybmFsRmxhZ3NUeXBlc1tdID0gbmV3IENvbnN0YW50SW50ZWdlclR5cGUoJGNvbnN0YW50U2NhbGFyVmFsdWUgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMIHwgUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjo6UFJFR19VTk1BVENIRURfQVNfTlVMTF9PTl83Ml83Myk7Cn0KcmV0dXJuIFR5cGVDb21iaW5hdG9yOjp1bmlvbiguLi4kaW50ZXJuYWxGbGFnc1R5cGVzKTsKfQoKc3RhdGljIHB1YmxpYyBmdW5jdGlvbiByZW1vdmVOdWxsRnJvbU1hdGNoZXMoVHlwZSAkbWF0Y2hlc1R5cGUpOiBUeXBlCnsKcmV0dXJuIFR5cGVUcmF2ZXJzZXI6Om1hcCgkbWF0Y2hlc1R5cGUsIHN0YXRpYyBmdW5jdGlvbiAoVHlwZSAkdHlwZSwgY2FsbGFibGUgJHRyYXZlcnNlKTogVHlwZSB7CmlmICgkdHlwZSBpbnN0YW5jZW9mIFVuaW9uVHlwZSB8fCAkdHlwZSBpbnN0YW5jZW9mIEludGVyc2VjdGlvblR5cGUpIHsKcmV0dXJuICR0cmF2ZXJzZSgkdHlwZSk7Cn0KCmlmICgkdHlwZSBpbnN0YW5jZW9mIENvbnN0YW50QXJyYXlUeXBlKSB7CnJldHVybiBuZXcgQ29uc3RhbnRBcnJheVR5cGUoCiR0eXBlLT5nZXRLZXlUeXBlcygpLAphcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uIChUeXBlICR2YWx1ZVR5cGUpIHVzZSAoJHRyYXZlcnNlKTogVHlwZSB7CnJldHVybiAkdHJhdmVyc2UoJHZhbHVlVHlwZSk7Cn0sICR0eXBlLT5nZXRWYWx1ZVR5cGVzKCkpLAokdHlwZS0+Z2V0TmV4dEF1dG9JbmRleGVzKCksCltdLAokdHlwZS0+aXNMaXN0KCkKKTsKfQoKaWYgKCR0eXBlIGluc3RhbmNlb2YgQXJyYXlUeXBlKSB7CnJldHVybiBuZXcgQXJyYXlUeXBlKCR0eXBlLT5nZXRLZXlUeXBlKCksICR0cmF2ZXJzZSgkdHlwZS0+Z2V0SXRlbVR5cGUoKSkpOwp9CgpyZXR1cm4gVHlwZUNvbWJpbmF0b3I6OnJlbW92ZU51bGwoJHR5cGUpOwp9KTsKfQoKfQo8P3BocCBkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlXFBIUFN0YW47Cgp1c2UgQ29tcG9zZXJcUGNyZVxQcmVnOwp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxTdGF0aWNDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXFBhcmFtZXRlclJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFRyaW5hcnlMb2dpYzsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIFBIUFN0YW5cVHlwZVxTdGF0aWNNZXRob2RQYXJhbWV0ZXJPdXRUeXBlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CgpmaW5hbCBjbGFzcyBQcmVnTWF0Y2hQYXJhbWV0ZXJPdXRUeXBlRXh0ZW5zaW9uIGltcGxlbWVudHMgU3RhdGljTWV0aG9kUGFyYW1ldGVyT3V0VHlwZUV4dGVuc2lvbgp7CgoKCnByaXZhdGUgJHJlZ2V4U2hhcGVNYXRjaGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KApSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcgopCnsKJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyID0gJHJlZ2V4U2hhcGVNYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNTdGF0aWNNZXRob2RTdXBwb3J0ZWQoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgUGFyYW1ldGVyUmVmbGVjdGlvbiAkcGFyYW1ldGVyKTogYm9vbAp7CnJldHVybgokbWV0aG9kUmVmbGVjdGlvbi0+Z2V0RGVjbGFyaW5nQ2xhc3MoKS0+Z2V0TmFtZSgpID09PSBQcmVnOjpjbGFzcwomJiBpbl9hcnJheSgkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCBbCidtYXRjaCcsICdpc01hdGNoJywgJ21hdGNoU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hTdHJpY3RHcm91cHMnLAonbWF0Y2hBbGwnLCAnaXNNYXRjaEFsbCcsICdtYXRjaEFsbFN0cmljdEdyb3VwcycsICdpc01hdGNoQWxsU3RyaWN0R3JvdXBzJwpdLCB0cnVlKQomJiAkcGFyYW1ldGVyLT5nZXROYW1lKCkgPT09ICdtYXRjaGVzJzsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFBhcmFtZXRlck91dFR5cGVGcm9tU3RhdGljTWV0aG9kQ2FsbChNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBTdGF0aWNDYWxsICRtZXRob2RDYWxsLCBQYXJhbWV0ZXJSZWZsZWN0aW9uICRwYXJhbWV0ZXIsIFNjb3BlICRzY29wZSk6ID9UeXBlCnsKJGFyZ3MgPSAkbWV0aG9kQ2FsbC0+Z2V0QXJncygpOwokcGF0dGVybkFyZyA9ICRhcmdzWzBdID8/IG51bGw7CiRtYXRjaGVzQXJnID0gJGFyZ3NbMl0gPz8gbnVsbDsKJGZsYWdzQXJnID0gJGFyZ3NbM10gPz8gbnVsbDsKCmlmICgKJHBhdHRlcm5BcmcgPT09IG51bGwgfHwgJG1hdGNoZXNBcmcgPT09IG51bGwKKSB7CnJldHVybiBudWxsOwp9CgokZmxhZ3NUeXBlID0gUHJlZ01hdGNoRmxhZ3M6OmdldFR5cGUoJGZsYWdzQXJnLCAkc2NvcGUpOwppZiAoJGZsYWdzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKHN0cmlwb3MoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgJ21hdGNoQWxsJykgIT09IGZhbHNlKSB7CnJldHVybiAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoQWxsRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlTWF5YmUoKSwgJHNjb3BlKTsKfQoKcmV0dXJuICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVNYXliZSgpLCAkc2NvcGUpOwp9Cgp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmVcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBQaHBQYXJzZXJcTm9kZVxFeHByXFN0YXRpY0NhbGw7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxBbmFseXNlclxTcGVjaWZpZWRUeXBlczsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcVHlwZVNwZWNpZmllcjsKdXNlIFBIUFN0YW5cQW5hbHlzZXJcVHlwZVNwZWNpZmllckF3YXJlRXh0ZW5zaW9uOwp1c2UgUEhQU3RhblxBbmFseXNlclxUeXBlU3BlY2lmaWVyQ29udGV4dDsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxUcmluYXJ5TG9naWM7CnVzZSBQSFBTdGFuXFR5cGVcQ29uc3RhbnRcQ29uc3RhbnRBcnJheVR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcUGhwXFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXI7CnVzZSBQSFBTdGFuXFR5cGVcU3RhdGljTWV0aG9kVHlwZVNwZWNpZnlpbmdFeHRlbnNpb247CnVzZSBQSFBTdGFuXFR5cGVcVHlwZUNvbWJpbmF0b3I7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKCmZpbmFsIGNsYXNzIFByZWdNYXRjaFR5cGVTcGVjaWZ5aW5nRXh0ZW5zaW9uIGltcGxlbWVudHMgU3RhdGljTWV0aG9kVHlwZVNwZWNpZnlpbmdFeHRlbnNpb24sIFR5cGVTcGVjaWZpZXJBd2FyZUV4dGVuc2lvbgp7CgoKCnByaXZhdGUgJHR5cGVTcGVjaWZpZXI7CgoKCgpwcml2YXRlICRyZWdleFNoYXBlTWF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcikKewokdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXIgPSAkcmVnZXhTaGFwZU1hdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRUeXBlU3BlY2lmaWVyKFR5cGVTcGVjaWZpZXIgJHR5cGVTcGVjaWZpZXIpOiB2b2lkCnsKJHRoaXMtPnR5cGVTcGVjaWZpZXIgPSAkdHlwZVNwZWNpZmllcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENsYXNzKCk6IHN0cmluZwp7CnJldHVybiBQcmVnOjpjbGFzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RhdGljTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIFN0YXRpY0NhbGwgJG5vZGUsIFR5cGVTcGVjaWZpZXJDb250ZXh0ICRjb250ZXh0KTogYm9vbAp7CnJldHVybiBpbl9hcnJheSgkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCBbCidtYXRjaCcsICdpc01hdGNoJywgJ21hdGNoU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hTdHJpY3RHcm91cHMnLAonbWF0Y2hBbGwnLCAnaXNNYXRjaEFsbCcsICdtYXRjaEFsbFN0cmljdEdyb3VwcycsICdpc01hdGNoQWxsU3RyaWN0R3JvdXBzJwpdLCB0cnVlKQomJiAhJGNvbnRleHQtPm51bGwoKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNwZWNpZnlUeXBlcyhNZXRob2RSZWZsZWN0aW9uICRtZXRob2RSZWZsZWN0aW9uLCBTdGF0aWNDYWxsICRub2RlLCBTY29wZSAkc2NvcGUsIFR5cGVTcGVjaWZpZXJDb250ZXh0ICRjb250ZXh0KTogU3BlY2lmaWVkVHlwZXMKewokYXJncyA9ICRub2RlLT5nZXRBcmdzKCk7CiRwYXR0ZXJuQXJnID0gJGFyZ3NbMF0gPz8gbnVsbDsKJG1hdGNoZXNBcmcgPSAkYXJnc1syXSA/PyBudWxsOwokZmxhZ3NBcmcgPSAkYXJnc1szXSA/PyBudWxsOwoKaWYgKAokcGF0dGVybkFyZyA9PT0gbnVsbCB8fCAkbWF0Y2hlc0FyZyA9PT0gbnVsbAopIHsKcmV0dXJuIG5ldyBTcGVjaWZpZWRUeXBlcygpOwp9CgokZmxhZ3NUeXBlID0gUHJlZ01hdGNoRmxhZ3M6OmdldFR5cGUoJGZsYWdzQXJnLCAkc2NvcGUpOwppZiAoJGZsYWdzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbmV3IFNwZWNpZmllZFR5cGVzKCk7Cn0KCmlmIChzdHJpcG9zKCRtZXRob2RSZWZsZWN0aW9uLT5nZXROYW1lKCksICdtYXRjaEFsbCcpICE9PSBmYWxzZSkgewokbWF0Y2hlZFR5cGUgPSAkdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXItPm1hdGNoQWxsRXhwcigkcGF0dGVybkFyZy0+dmFsdWUsICRmbGFnc1R5cGUsIFRyaW5hcnlMb2dpYzo6Y3JlYXRlRnJvbUJvb2xlYW4oJGNvbnRleHQtPnRydWUoKSksICRzY29wZSk7Cn0gZWxzZSB7CiRtYXRjaGVkVHlwZSA9ICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVGcm9tQm9vbGVhbigkY29udGV4dC0+dHJ1ZSgpKSwgJHNjb3BlKTsKfQoKaWYgKCRtYXRjaGVkVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbmV3IFNwZWNpZmllZFR5cGVzKCk7Cn0KCmlmICgKaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldE5hbWUoKSwgWydtYXRjaFN0cmljdEdyb3VwcycsICdpc01hdGNoU3RyaWN0R3JvdXBzJywgJ21hdGNoQWxsU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hBbGxTdHJpY3RHcm91cHMnXSwgdHJ1ZSkKKSB7CiRtYXRjaGVkVHlwZSA9IFByZWdNYXRjaEZsYWdzOjpyZW1vdmVOdWxsRnJvbU1hdGNoZXMoJG1hdGNoZWRUeXBlKTsKfQoKJG92ZXJ3cml0ZSA9IGZhbHNlOwppZiAoJGNvbnRleHQtPmZhbHNlKCkpIHsKJG92ZXJ3cml0ZSA9IHRydWU7CiRjb250ZXh0ID0gJGNvbnRleHQtPm5lZ2F0ZSgpOwp9CgoKaWYgKG1ldGhvZF9leGlzdHMoJ1BIUFN0YW5cQW5hbHlzZXJcU3BlY2lmaWVkVHlwZXMnLCAnc2V0Um9vdEV4cHInKSkgewoKJHR5cGVTcGVjaWZpZXIgPSAkdGhpcy0+dHlwZVNwZWNpZmllci0+Y3JlYXRlKAokbWF0Y2hlc0FyZy0+dmFsdWUsCiRtYXRjaGVkVHlwZSwKJGNvbnRleHQsCgokc2NvcGUKKS0+c2V0Um9vdEV4cHIoJG5vZGUpOwoKcmV0dXJuICRvdmVyd3JpdGUgPyAkdHlwZVNwZWNpZmllci0+c2V0QWx3YXlzT3ZlcndyaXRlVHlwZXMoKSA6ICR0eXBlU3BlY2lmaWVyOwp9CgoKcmV0dXJuICR0aGlzLT50eXBlU3BlY2lmaWVyLT5jcmVhdGUoCiRtYXRjaGVzQXJnLT52YWx1ZSwKJG1hdGNoZWRUeXBlLAokY29udGV4dCwKCiRvdmVyd3JpdGUsCiRzY29wZSwKJG5vZGUKKTsKfQp9Cjw/cGhwIGRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmVcUEhQU3RhbjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CnVzZSBDb21wb3NlclxQY3JlXFJlZ2V4Owp1c2UgUGhwUGFyc2VyXE5vZGVcRXhwclxTdGF0aWNDYWxsOwp1c2UgUEhQU3RhblxBbmFseXNlclxTY29wZTsKdXNlIFBIUFN0YW5cUmVmbGVjdGlvblxNZXRob2RSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXE5hdGl2ZVxOYXRpdmVQYXJhbWV0ZXJSZWZsZWN0aW9uOwp1c2UgUEhQU3RhblxSZWZsZWN0aW9uXFBhcmFtZXRlclJlZmxlY3Rpb247CnVzZSBQSFBTdGFuXFRyaW5hcnlMb2dpYzsKdXNlIFBIUFN0YW5cVHlwZVxDbG9zdXJlVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIFBIUFN0YW5cVHlwZVxTdGF0aWNNZXRob2RQYXJhbWV0ZXJDbG9zdXJlVHlwZUV4dGVuc2lvbjsKdXNlIFBIUFN0YW5cVHlwZVxTdHJpbmdUeXBlOwp1c2UgUEhQU3RhblxUeXBlXFR5cGU7CgpmaW5hbCBjbGFzcyBQcmVnUmVwbGFjZUNhbGxiYWNrQ2xvc3VyZVR5cGVFeHRlbnNpb24gaW1wbGVtZW50cyBTdGF0aWNNZXRob2RQYXJhbWV0ZXJDbG9zdXJlVHlwZUV4dGVuc2lvbgp7CgoKCnByaXZhdGUgJHJlZ2V4U2hhcGVNYXRjaGVyOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFJlZ2V4QXJyYXlTaGFwZU1hdGNoZXIgJHJlZ2V4U2hhcGVNYXRjaGVyKQp7CiR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlciA9ICRyZWdleFNoYXBlTWF0Y2hlcjsKfQoKcHVibGljIGZ1bmN0aW9uIGlzU3RhdGljTWV0aG9kU3VwcG9ydGVkKE1ldGhvZFJlZmxlY3Rpb24gJG1ldGhvZFJlZmxlY3Rpb24sIFBhcmFtZXRlclJlZmxlY3Rpb24gJHBhcmFtZXRlcik6IGJvb2wKewpyZXR1cm4gaW5fYXJyYXkoJG1ldGhvZFJlZmxlY3Rpb24tPmdldERlY2xhcmluZ0NsYXNzKCktPmdldE5hbWUoKSwgW1ByZWc6OmNsYXNzLCBSZWdleDo6Y2xhc3NdLCB0cnVlKQomJiBpbl9hcnJheSgkbWV0aG9kUmVmbGVjdGlvbi0+Z2V0TmFtZSgpLCBbJ3JlcGxhY2VDYWxsYmFjayddLCB0cnVlKQomJiAkcGFyYW1ldGVyLT5nZXROYW1lKCkgPT09ICdyZXBsYWNlbWVudCc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlRnJvbVN0YXRpY01ldGhvZENhbGwoTWV0aG9kUmVmbGVjdGlvbiAkbWV0aG9kUmVmbGVjdGlvbiwgU3RhdGljQ2FsbCAkbWV0aG9kQ2FsbCwgUGFyYW1ldGVyUmVmbGVjdGlvbiAkcGFyYW1ldGVyLCBTY29wZSAkc2NvcGUpOiA/VHlwZQp7CiRhcmdzID0gJG1ldGhvZENhbGwtPmdldEFyZ3MoKTsKJHBhdHRlcm5BcmcgPSAkYXJnc1swXSA/PyBudWxsOwokZmxhZ3NBcmcgPSAkYXJnc1s1XSA/PyBudWxsOwoKaWYgKAokcGF0dGVybkFyZyA9PT0gbnVsbAopIHsKcmV0dXJuIG51bGw7Cn0KCiRmbGFnc1R5cGUgPSBudWxsOwppZiAoJGZsYWdzQXJnICE9PSBudWxsKSB7CiRmbGFnc1R5cGUgPSAkc2NvcGUtPmdldFR5cGUoJGZsYWdzQXJnLT52YWx1ZSk7Cn0KCiRtYXRjaGVzVHlwZSA9ICR0aGlzLT5yZWdleFNoYXBlTWF0Y2hlci0+bWF0Y2hFeHByKCRwYXR0ZXJuQXJnLT52YWx1ZSwgJGZsYWdzVHlwZSwgVHJpbmFyeUxvZ2ljOjpjcmVhdGVZZXMoKSwgJHNjb3BlKTsKaWYgKCRtYXRjaGVzVHlwZSA9PT0gbnVsbCkgewpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIG5ldyBDbG9zdXJlVHlwZSgKWwpuZXcgTmF0aXZlUGFyYW1ldGVyUmVmbGVjdGlvbigkcGFyYW1ldGVyLT5nZXROYW1lKCksICRwYXJhbWV0ZXItPmlzT3B0aW9uYWwoKSwgJG1hdGNoZXNUeXBlLCAkcGFyYW1ldGVyLT5wYXNzZWRCeVJlZmVyZW5jZSgpLCAkcGFyYW1ldGVyLT5pc1ZhcmlhZGljKCksICRwYXJhbWV0ZXItPmdldERlZmF1bHRWYWx1ZSgpKSwKXSwKbmV3IFN0cmluZ1R5cGUoKQopOwp9Cn0KPD9waHAgZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZVxQSFBTdGFuOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIENvbXBvc2VyXFBjcmVcUmVnZXg7CnVzZSBQaHBQYXJzZXJcTm9kZTsKdXNlIFBocFBhcnNlclxOb2RlXEV4cHJcU3RhdGljQ2FsbDsKdXNlIFBocFBhcnNlclxOb2RlXE5hbWVcRnVsbHlRdWFsaWZpZWQ7CnVzZSBQSFBTdGFuXEFuYWx5c2VyXFNjb3BlOwp1c2UgUEhQU3RhblxBbmFseXNlclxTcGVjaWZpZWRUeXBlczsKdXNlIFBIUFN0YW5cUnVsZXNcUnVsZTsKdXNlIFBIUFN0YW5cUnVsZXNcUnVsZUVycm9yQnVpbGRlcjsKdXNlIFBIUFN0YW5cVHJpbmFyeUxvZ2ljOwp1c2UgUEhQU3RhblxUeXBlXE9iamVjdFR5cGU7CnVzZSBQSFBTdGFuXFR5cGVcVHlwZTsKdXNlIFBIUFN0YW5cVHlwZVxUeXBlQ29tYmluYXRvcjsKdXNlIFBIUFN0YW5cVHlwZVxQaHBcUmVnZXhBcnJheVNoYXBlTWF0Y2hlcjsKdXNlIGZ1bmN0aW9uIHNwcmludGY7CgoKCgpmaW5hbCBjbGFzcyBVbnNhZmVTdHJpY3RHcm91cHNDYWxsUnVsZSBpbXBsZW1lbnRzIFJ1bGUKewoKCgpwcml2YXRlICRyZWdleFNoYXBlTWF0Y2hlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChSZWdleEFycmF5U2hhcGVNYXRjaGVyICRyZWdleFNoYXBlTWF0Y2hlcikKewokdGhpcy0+cmVnZXhTaGFwZU1hdGNoZXIgPSAkcmVnZXhTaGFwZU1hdGNoZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXROb2RlVHlwZSgpOiBzdHJpbmcKewpyZXR1cm4gU3RhdGljQ2FsbDo6Y2xhc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwcm9jZXNzTm9kZShOb2RlICRub2RlLCBTY29wZSAkc2NvcGUpOiBhcnJheQp7CmlmICghJG5vZGUtPmNsYXNzIGluc3RhbmNlb2YgRnVsbHlRdWFsaWZpZWQpIHsKcmV0dXJuIFtdOwp9CiRpc1JlZ2V4ID0gJG5vZGUtPmNsYXNzLT50b1N0cmluZygpID09PSBSZWdleDo6Y2xhc3M7CiRpc1ByZWcgPSAkbm9kZS0+Y2xhc3MtPnRvU3RyaW5nKCkgPT09IFByZWc6OmNsYXNzOwppZiAoISRpc1JlZ2V4ICYmICEkaXNQcmVnKSB7CnJldHVybiBbXTsKfQppZiAoISRub2RlLT5uYW1lIGluc3RhbmNlb2YgTm9kZVxJZGVudGlmaWVyIHx8ICFpbl9hcnJheSgkbm9kZS0+bmFtZS0+bmFtZSwgWydtYXRjaFN0cmljdEdyb3VwcycsICdpc01hdGNoU3RyaWN0R3JvdXBzJywgJ21hdGNoQWxsU3RyaWN0R3JvdXBzJywgJ2lzTWF0Y2hBbGxTdHJpY3RHcm91cHMnXSwgdHJ1ZSkpIHsKcmV0dXJuIFtdOwp9CgokYXJncyA9ICRub2RlLT5nZXRBcmdzKCk7CmlmICghaXNzZXQoJGFyZ3NbMF0pKSB7CnJldHVybiBbXTsKfQoKJHBhdHRlcm5BcmcgPSAkYXJnc1swXSA/PyBudWxsOwppZiAoJGlzUHJlZykgewppZiAoIWlzc2V0KCRhcmdzWzJdKSkgeyAKcmV0dXJuIFtdOwp9CiRmbGFnc0FyZyA9ICRhcmdzWzNdID8/IG51bGw7Cn0gZWxzZSB7CiRmbGFnc0FyZyA9ICRhcmdzWzJdID8/IG51bGw7Cn0KCmlmICgkcGF0dGVybkFyZyA9PT0gbnVsbCkgewpyZXR1cm4gW107Cn0KCiRmbGFnc1R5cGUgPSBQcmVnTWF0Y2hGbGFnczo6Z2V0VHlwZSgkZmxhZ3NBcmcsICRzY29wZSk7CmlmICgkZmxhZ3NUeXBlID09PSBudWxsKSB7CnJldHVybiBbXTsKfQoKJG1hdGNoZWRUeXBlID0gJHRoaXMtPnJlZ2V4U2hhcGVNYXRjaGVyLT5tYXRjaEV4cHIoJHBhdHRlcm5BcmctPnZhbHVlLCAkZmxhZ3NUeXBlLCBUcmluYXJ5TG9naWM6OmNyZWF0ZVllcygpLCAkc2NvcGUpOwppZiAoJG1hdGNoZWRUeXBlID09PSBudWxsKSB7CnJldHVybiBbClJ1bGVFcnJvckJ1aWxkZXI6Om1lc3NhZ2Uoc3ByaW50ZignVGhlICVzIGNhbGwgaXMgcG90ZW50aWFsbHkgdW5zYWZlIGFzICRtYXRjaGVzXCcgdHlwZSBjb3VsZCBub3QgYmUgaW5mZXJyZWQuJywgJG5vZGUtPm5hbWUtPm5hbWUpKQotPmlkZW50aWZpZXIoJ2NvbXBvc2VyUGNyZS5tYXliZVVuc2FmZVN0cmljdEdyb3VwcycpCi0+YnVpbGQoKSwKXTsKfQoKaWYgKGNvdW50KCRtYXRjaGVkVHlwZS0+Z2V0Q29uc3RhbnRBcnJheXMoKSkgPT09IDEpIHsKJG1hdGNoZWRUeXBlID0gJG1hdGNoZWRUeXBlLT5nZXRDb25zdGFudEFycmF5cygpWzBdOwokbnVsbGFibGVHcm91cHMgPSBbXTsKZm9yZWFjaCAoJG1hdGNoZWRUeXBlLT5nZXRWYWx1ZVR5cGVzKCkgYXMgJGluZGV4ID0+ICR0eXBlKSB7CmlmIChUeXBlQ29tYmluYXRvcjo6Y29udGFpbnNOdWxsKCR0eXBlKSkgewokbnVsbGFibGVHcm91cHNbXSA9ICRtYXRjaGVkVHlwZS0+Z2V0S2V5VHlwZXMoKVskaW5kZXhdLT5nZXRWYWx1ZSgpOwp9Cn0KCmlmIChcY291bnQoJG51bGxhYmxlR3JvdXBzKSA+IDApIHsKcmV0dXJuIFsKUnVsZUVycm9yQnVpbGRlcjo6bWVzc2FnZShzcHJpbnRmKAonVGhlICVzIGNhbGwgaXMgdW5zYWZlIGFzIG1hdGNoIGdyb3VwJXMgIiVzIiAlcyBvcHRpb25hbCBhbmQgbWF5IGJlIG51bGwuJywKJG5vZGUtPm5hbWUtPm5hbWUsClxjb3VudCgkbnVsbGFibGVHcm91cHMpID4gMSA/ICdzJyA6ICcnLAppbXBsb2RlKCciLCAiJywgJG51bGxhYmxlR3JvdXBzKSwKXGNvdW50KCRudWxsYWJsZUdyb3VwcykgPiAxID8gJ2FyZScgOiAnaXMnCikpLT5pZGVudGlmaWVyKCdjb21wb3NlclBjcmUudW5zYWZlU3RyaWN0R3JvdXBzJyktPmJ1aWxkKCksCl07Cn0KfQoKcmV0dXJuIFtdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBDb21wb3NlclxQY3JlOwoKY2xhc3MgUGNyZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uCnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21GdW5jdGlvbigkZnVuY3Rpb24sICRwYXR0ZXJuKQp7CiRjb2RlID0gcHJlZ19sYXN0X2Vycm9yKCk7CgppZiAoaXNfYXJyYXkoJHBhdHRlcm4pKSB7CiRwYXR0ZXJuID0gaW1wbG9kZSgnLCAnLCAkcGF0dGVybik7Cn0KCnJldHVybiBuZXcgUGNyZUV4Y2VwdGlvbigkZnVuY3Rpb24uJygpOiBmYWlsZWQgZXhlY3V0aW5nICInLiRwYXR0ZXJuLiciOiAnLnNlbGY6OnBjcmVMYXN0RXJyb3JNZXNzYWdlKCRjb2RlKSwgJGNvZGUpOwp9CgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcGNyZUxhc3RFcnJvck1lc3NhZ2UoJGNvZGUpCnsKaWYgKGZ1bmN0aW9uX2V4aXN0cygncHJlZ19sYXN0X2Vycm9yX21zZycpKSB7CnJldHVybiBwcmVnX2xhc3RfZXJyb3JfbXNnKCk7Cn0KCgppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDIwMSAmJiAkY29kZSA9PT0gMCkgewpyZXR1cm4gJ1VOREVGSU5FRF9FUlJPUic7Cn0KCiRjb25zdGFudHMgPSBnZXRfZGVmaW5lZF9jb25zdGFudHModHJ1ZSk7CmlmICghaXNzZXQoJGNvbnN0YW50c1sncGNyZSddKSB8fCAhaXNfYXJyYXkoJGNvbnN0YW50c1sncGNyZSddKSkgewpyZXR1cm4gJ1VOREVGSU5FRF9FUlJPUic7Cn0KCmZvcmVhY2ggKCRjb25zdGFudHNbJ3BjcmUnXSBhcyAkY29uc3QgPT4gJHZhbCkgewppZiAoJHZhbCA9PT0gJGNvZGUgJiYgc3Vic3RyKCRjb25zdCwgLTYpID09PSAnX0VSUk9SJykgewpyZXR1cm4gJGNvbnN0Owp9Cn0KCnJldHVybiAnVU5ERUZJTkVEX0VSUk9SJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcUGNyZTsKCmNsYXNzIFByZWcKewoKcHVibGljIGNvbnN0IEFSUkFZX01TRyA9ICckc3ViamVjdCBhcyBhbiBhcnJheSBpcyBub3Qgc3VwcG9ydGVkLiBZb3UgY2FuIHVzZSBcJ2ZvcmVhY2hcJyBpbnN0ZWFkLic7CgpwdWJsaWMgY29uc3QgSU5WQUxJRF9UWVBFX01TRyA9ICckc3ViamVjdCBtdXN0IGJlIGEgc3RyaW5nLCAlcyBnaXZlbi4nOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaFdpdGhPZmZzZXRzJyk7CgokcmVzdWx0ID0gc2VsZjo6cHJlZ01hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncyB8IFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGludAp7CiRyZXN1bHQgPSBzZWxmOjptYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzSW50ZXJuYWwsICRmbGFncywgJG9mZnNldCk7CiRtYXRjaGVzID0gc2VsZjo6ZW5mb3JjZU5vbk51bGxNYXRjaGVzKCRwYXR0ZXJuLCAkbWF0Y2hlc0ludGVybmFsLCAnbWF0Y2gnKTsKCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKJHJlc3VsdCA9IHNlbGY6OnByZWdNYXRjaCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MgfCBQUkVHX1VOTUFUQ0hFRF9BU19OVUxMIHwgUFJFR19PRkZTRVRfQ0FQVFVSRSwgJG9mZnNldCk7CmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfbWF0Y2gnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGwoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogaW50CnsKc2VsZjo6Y2hlY2tPZmZzZXRDYXB0dXJlKCRmbGFncywgJ21hdGNoQWxsV2l0aE9mZnNldHMnKTsKc2VsZjo6Y2hlY2tTZXRPcmRlcigkZmxhZ3MpOwoKJHJlc3VsdCA9IHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncyB8IFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpOwppZiAoIWlzX2ludCgkcmVzdWx0KSkgeyAKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoX2FsbCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewokcmVzdWx0ID0gc2VsZjo6bWF0Y2hBbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlc0ludGVybmFsLCAkZmxhZ3MsICRvZmZzZXQpOwokbWF0Y2hlcyA9IHNlbGY6OmVuZm9yY2VOb25OdWxsTWF0Y2hBbGwoJHBhdHRlcm4sICRtYXRjaGVzSW50ZXJuYWwsICdtYXRjaEFsbCcpOwoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsV2l0aE9mZnNldHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBpbnQKewpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgokcmVzdWx0ID0gcHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzIHwgUFJFR19VTk1BVENIRURfQVNfTlVMTCB8IFBSRUdfT0ZGU0VUX0NBUFRVUkUsICRvZmZzZXQpOwppZiAoIWlzX2ludCgkcmVzdWx0KSkgeyAKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoX2FsbCcsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCBpbnQgJGxpbWl0ID0gLTEsID9pbnQgJiRjb3VudCA9IG51bGwpOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgokcmVzdWx0ID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7CmlmICgkcmVzdWx0ID09PSBudWxsKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19yZXBsYWNlJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sIGNhbGxhYmxlICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgP2ludCAmJGNvdW50ID0gbnVsbCwgaW50ICRmbGFncyA9IDApOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDApIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQsICRmbGFncyk7Cn0gZWxzZSB7CiRyZXN1bHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHBhdHRlcm4sICRyZXBsYWNlbWVudCwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50KTsKfQppZiAoJHJlc3VsdCA9PT0gbnVsbCkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfcmVwbGFjZV9jYWxsYmFjaycsICRwYXR0ZXJuKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2tBcnJheShhcnJheSAkcGF0dGVybiwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgP2ludCAmJGNvdW50ID0gbnVsbCwgaW50ICRmbGFncyA9IDApOiBzdHJpbmcKewppZiAoIWlzX3NjYWxhcigkc3ViamVjdCkpIHsKaWYgKGlzX2FycmF5KCRzdWJqZWN0KSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzdGF0aWM6OkFSUkFZX01TRyk7Cn0KCnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoc3RhdGljOjpJTlZBTElEX1RZUEVfTVNHLCBnZXR0eXBlKCRzdWJqZWN0KSkpOwp9CgppZiAoUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDApIHsKJHJlc3VsdCA9IHByZWdfcmVwbGFjZV9jYWxsYmFja19hcnJheSgkcGF0dGVybiwgJHN1YmplY3QsICRsaW1pdCwgJGNvdW50LCAkZmxhZ3MpOwp9IGVsc2UgewokcmVzdWx0ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrX2FycmF5KCRwYXR0ZXJuLCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQpOwp9CmlmICgkcmVzdWx0ID09PSBudWxsKSB7CiRwYXR0ZXJuID0gYXJyYXlfa2V5cygkcGF0dGVybik7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19yZXBsYWNlX2NhbGxiYWNrX2FycmF5JywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CmlmICgoJGZsYWdzICYgUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRSkgIT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgaXMgbm90IHN1cHBvcnRlZCBhcyBpdCBjaGFuZ2VzIHRoZSB0eXBlIG9mICRtYXRjaGVzLCB1c2Ugc3BsaXRXaXRoT2Zmc2V0cygpIGluc3RlYWQnKTsKfQoKJHJlc3VsdCA9IHByZWdfc3BsaXQoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRmbGFncyk7CmlmICgkcmVzdWx0ID09PSBmYWxzZSkgewp0aHJvdyBQY3JlRXhjZXB0aW9uOjpmcm9tRnVuY3Rpb24oJ3ByZWdfc3BsaXQnLCAkcGF0dGVybik7Cn0KCnJldHVybiAkcmVzdWx0Owp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3BsaXRXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJGZsYWdzID0gMCk6IGFycmF5CnsKJHJlc3VsdCA9IHByZWdfc3BsaXQoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRmbGFncyB8IFBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUpOwppZiAoJHJlc3VsdCA9PT0gZmFsc2UpIHsKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX3NwbGl0JywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JlcChzdHJpbmcgJHBhdHRlcm4sIGFycmF5ICRhcnJheSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRyZXN1bHQgPSBwcmVnX2dyZXAoJHBhdHRlcm4sICRhcnJheSwgJGZsYWdzKTsKaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7CnRocm93IFBjcmVFeGNlcHRpb246OmZyb21GdW5jdGlvbigncHJlZ19ncmVwJywgJHBhdHRlcm4pOwp9CgpyZXR1cm4gJHJlc3VsdDsKfQoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc01hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzID0gbnVsbCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaFN0cmljdEdyb3VwcyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBib29sCnsKcmV0dXJuIChib29sKSBzZWxmOjptYXRjaFN0cmljdEdyb3VwcygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hBbGwoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc3RhdGljOjptYXRjaEFsbCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hBbGxTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsID9hcnJheSAmJG1hdGNoZXMgPSBudWxsLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc2VsZjo6bWF0Y2hBbGxTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcywgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpIHN0YXRpYzo6bWF0Y2hXaXRoT2Zmc2V0cygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCA/YXJyYXkgJiRtYXRjaGVzLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgc3RhdGljOjptYXRjaEFsbFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNoZWNrT2Zmc2V0Q2FwdHVyZShpbnQgJGZsYWdzLCBzdHJpbmcgJHVzZUZ1bmN0aW9uTmFtZSk6IHZvaWQKewppZiAoKCRmbGFncyAmIFBSRUdfT0ZGU0VUX0NBUFRVUkUpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX09GRlNFVF9DQVBUVVJFIGlzIG5vdCBzdXBwb3J0ZWQgYXMgaXQgY2hhbmdlcyB0aGUgdHlwZSBvZiAkbWF0Y2hlcywgdXNlICcgLiAkdXNlRnVuY3Rpb25OYW1lIC4gJygpIGluc3RlYWQnKTsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja1NldE9yZGVyKGludCAkZmxhZ3MpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX1NFVF9PUkRFUikgIT09IDApIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1BSRUdfU0VUX09SREVSIGlzIG5vdCBzdXBwb3J0ZWQgYXMgaXQgY2hhbmdlcyB0aGUgdHlwZSBvZiAkbWF0Y2hlcycpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5mb3JjZU5vbk51bGxNYXRjaGVzKHN0cmluZyAkcGF0dGVybiwgYXJyYXkgJG1hdGNoZXMsIHN0cmluZyAkdmFyaWFudE1ldGhvZCkKewpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkZ3JvdXAgPT4gJG1hdGNoKSB7CmlmIChudWxsID09PSAkbWF0Y2gpIHsKdGhyb3cgbmV3IFVuZXhwZWN0ZWROdWxsTWF0Y2hFeGNlcHRpb24oJ1BhdHRlcm4gIicuJHBhdHRlcm4uJyIgaGFkIGFuIHVuZXhwZWN0ZWQgdW5tYXRjaGVkIGdyb3VwICInLiRncm91cC4nIiwgbWFrZSBzdXJlIHRoZSBwYXR0ZXJuIGFsd2F5cyBtYXRjaGVzIG9yIHVzZSAnLiR2YXJpYW50TWV0aG9kLicoKSBpbnN0ZWFkLicpOwp9Cn0KCgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZW5mb3JjZU5vbk51bGxNYXRjaEFsbChzdHJpbmcgJHBhdHRlcm4sIGFycmF5ICRtYXRjaGVzLCBzdHJpbmcgJHZhcmlhbnRNZXRob2QpCnsKZm9yZWFjaCAoJG1hdGNoZXMgYXMgJGdyb3VwID0+ICRncm91cE1hdGNoZXMpIHsKZm9yZWFjaCAoJGdyb3VwTWF0Y2hlcyBhcyAkbWF0Y2gpIHsKaWYgKG51bGwgPT09ICRtYXRjaCkgewp0aHJvdyBuZXcgVW5leHBlY3RlZE51bGxNYXRjaEV4Y2VwdGlvbignUGF0dGVybiAiJy4kcGF0dGVybi4nIiBoYWQgYW4gdW5leHBlY3RlZCB1bm1hdGNoZWQgZ3JvdXAgIicuJGdyb3VwLiciLCBtYWtlIHN1cmUgdGhlIHBhdHRlcm4gYWx3YXlzIG1hdGNoZXMgb3IgdXNlICcuJHZhcmlhbnRNZXRob2QuJygpIGluc3RlYWQuJyk7Cn0KfQp9CgoKcmV0dXJuICRtYXRjaGVzOwp9CgoKCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHByZWdNYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgP2FycmF5ICYkbWF0Y2hlcyA9IG51bGwsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApCnsKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwNDAwKSB7CnJldHVybiBwcmVnX21hdGNoKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7Cn0KCgoKCgoKCgokcmVzdWx0ID0gcHJlZ19tYXRjaF9hbGwoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlc0ludGVybmFsLCAkZmxhZ3MsICRvZmZzZXQpOwppZiAoIWlzX2ludCgkcmVzdWx0KSkgeyAKdGhyb3cgUGNyZUV4Y2VwdGlvbjo6ZnJvbUZ1bmN0aW9uKCdwcmVnX21hdGNoJywgJHBhdHRlcm4pOwp9CgppZiAoJHJlc3VsdCA9PT0gMCkgewokbWF0Y2hlcyA9IFtdOwp9IGVsc2UgewoKJG1hdGNoZXMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKGFycmF5ICRtKSB7CiRmaXJzdCA9IHJlc2V0KCRtKTsKYXNzZXJ0KCRmaXJzdCAhPT0gZmFsc2UpOwpyZXR1cm4gJGZpcnN0Owp9LCAkbWF0Y2hlc0ludGVybmFsKTsKJHJlc3VsdCA9IG1pbigkcmVzdWx0LCAxKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFBjcmU7CgpjbGFzcyBSZWdleAp7CgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNNYXRjaChzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRvZmZzZXQgPSAwKTogYm9vbAp7CnJldHVybiAoYm9vbCkgUHJlZzo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgMCwgJG9mZnNldCk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hSZXN1bHQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hXaXRoT2Zmc2V0cycpOwoKJGNvdW50ID0gUHJlZzo6bWF0Y2goJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoU3RyaWN0R3JvdXBzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hTdHJpY3RHcm91cHNSZXN1bHQKewoKJGNvdW50ID0gUHJlZzo6bWF0Y2hTdHJpY3RHcm91cHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hTdHJpY3RHcm91cHNSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hXaXRoT2Zmc2V0cyhzdHJpbmcgJHBhdHRlcm4sIHN0cmluZyAkc3ViamVjdCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IE1hdGNoV2l0aE9mZnNldHNSZXN1bHQKewokY291bnQgPSBQcmVnOjptYXRjaFdpdGhPZmZzZXRzKCRwYXR0ZXJuLCAkc3ViamVjdCwgJG1hdGNoZXMsICRmbGFncywgJG9mZnNldCk7CgpyZXR1cm4gbmV3IE1hdGNoV2l0aE9mZnNldHNSZXN1bHQoJGNvdW50LCAkbWF0Y2hlcyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1hdGNoQWxsKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxSZXN1bHQKewpzZWxmOjpjaGVja09mZnNldENhcHR1cmUoJGZsYWdzLCAnbWF0Y2hBbGxXaXRoT2Zmc2V0cycpOwpzZWxmOjpjaGVja1NldE9yZGVyKCRmbGFncyk7CgokY291bnQgPSBQcmVnOjptYXRjaEFsbCgkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaEFsbFJlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWF0Y2hBbGxTdHJpY3RHcm91cHMoc3RyaW5nICRwYXR0ZXJuLCBzdHJpbmcgJHN1YmplY3QsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdAp7CnNlbGY6OmNoZWNrT2Zmc2V0Q2FwdHVyZSgkZmxhZ3MsICdtYXRjaEFsbFdpdGhPZmZzZXRzJyk7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCgokY291bnQgPSBQcmVnOjptYXRjaEFsbFN0cmljdEdyb3VwcygkcGF0dGVybiwgJHN1YmplY3QsICRtYXRjaGVzLCAkZmxhZ3MsICRvZmZzZXQpOwoKcmV0dXJuIG5ldyBNYXRjaEFsbFN0cmljdEdyb3Vwc1Jlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYXRjaEFsbFdpdGhPZmZzZXRzKHN0cmluZyAkcGF0dGVybiwgc3RyaW5nICRzdWJqZWN0LCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdAp7CnNlbGY6OmNoZWNrU2V0T3JkZXIoJGZsYWdzKTsKCiRjb3VudCA9IFByZWc6Om1hdGNoQWxsV2l0aE9mZnNldHMoJHBhdHRlcm4sICRzdWJqZWN0LCAkbWF0Y2hlcywgJGZsYWdzLCAkb2Zmc2V0KTsKCnJldHVybiBuZXcgTWF0Y2hBbGxXaXRoT2Zmc2V0c1Jlc3VsdCgkY291bnQsICRtYXRjaGVzKTsKfQoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVwbGFjZSgkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xKTogUmVwbGFjZVJlc3VsdAp7CiRyZXN1bHQgPSBQcmVnOjpyZXBsYWNlKCRwYXR0ZXJuLCAkcmVwbGFjZW1lbnQsICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZXBsYWNlQ2FsbGJhY2soJHBhdHRlcm4sIGNhbGxhYmxlICRyZXBsYWNlbWVudCwgJHN1YmplY3QsIGludCAkbGltaXQgPSAtMSwgaW50ICRmbGFncyA9IDApOiBSZXBsYWNlUmVzdWx0CnsKJHJlc3VsdCA9IFByZWc6OnJlcGxhY2VDYWxsYmFjaygkcGF0dGVybiwgJHJlcGxhY2VtZW50LCAkc3ViamVjdCwgJGxpbWl0LCAkY291bnQsICRmbGFncyk7CgpyZXR1cm4gbmV3IFJlcGxhY2VSZXN1bHQoJGNvdW50LCAkcmVzdWx0KTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHJlcGxhY2VDYWxsYmFja0FycmF5KGFycmF5ICRwYXR0ZXJuLCAkc3ViamVjdCwgaW50ICRsaW1pdCA9IC0xLCBpbnQgJGZsYWdzID0gMCk6IFJlcGxhY2VSZXN1bHQKewokcmVzdWx0ID0gUHJlZzo6cmVwbGFjZUNhbGxiYWNrQXJyYXkoJHBhdHRlcm4sICRzdWJqZWN0LCAkbGltaXQsICRjb3VudCwgJGZsYWdzKTsKCnJldHVybiBuZXcgUmVwbGFjZVJlc3VsdCgkY291bnQsICRyZXN1bHQpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBjaGVja09mZnNldENhcHR1cmUoaW50ICRmbGFncywgc3RyaW5nICR1c2VGdW5jdGlvbk5hbWUpOiB2b2lkCnsKaWYgKCgkZmxhZ3MgJiBQUkVHX09GRlNFVF9DQVBUVVJFKSAhPT0gMCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUFJFR19PRkZTRVRfQ0FQVFVSRSBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlLCB1c2UgJy4kdXNlRnVuY3Rpb25OYW1lLicoKSBpbnN0ZWFkJyk7Cn0KfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gY2hlY2tTZXRPcmRlcihpbnQgJGZsYWdzKTogdm9pZAp7CmlmICgoJGZsYWdzICYgUFJFR19TRVRfT1JERVIpICE9PSAwKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdQUkVHX1NFVF9PUkRFUiBpcyBub3Qgc3VwcG9ydGVkIGFzIGl0IGNoYW5nZXMgdGhlIHJldHVybiB0eXBlJyk7Cn0KfQp9Cjw/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/JzsKCgpwcml2YXRlIHN0YXRpYyAkc3RhYmlsaXRpZXNSZWdleCA9ICdzdGFibGV8UkN8YmV0YXxhbHBoYXxkZXYnOwoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHBhcnNlU3RhYmlsaXR5KCR2ZXJzaW9uKQp7CiR2ZXJzaW9uID0gKHN0cmluZykgcHJlZ19yZXBsYWNlKCd7Iy4rJH0nLCAnJywgKHN0cmluZykgJHZlcnNpb24pOwoKaWYgKHN0cnBvcygkdmVyc2lvbiwgJ2Rldi0nKSA9PT0gMCB8fCAnLWRldicgPT09IHN1YnN0cigkdmVyc2lvbiwgLTQpKSB7CnJldHVybiAnZGV2JzsKfQoKcHJlZ19tYXRjaCgneycgLiBzZWxmOjokbW9kaWZpZXJSZWdleCAuICcoPzpcKy4qKT8kfWknLCBzdHJ0b2xvd2VyKCR2ZXJzaW9uKSwgJG1hdGNoKTsKCmlmICghZW1wdHkoJG1hdGNoWzNdKSkgewpyZXR1cm4gJ2Rldic7Cn0KCmlmICghZW1wdHkoJG1hdGNoWzFdKSkgewppZiAoJ2JldGEnID09PSAkbWF0Y2hbMV0gfHwgJ2InID09PSAkbWF0Y2hbMV0pIHsKcmV0dXJuICdiZXRhJzsKfQppZiAoJ2FscGhhJyA9PT0gJG1hdGNoWzFdIHx8ICdhJyA9PT0gJG1hdGNoWzFdKSB7CnJldHVybiAnYWxwaGEnOwp9CmlmICgncmMnID09PSAkbWF0Y2hbMV0pIHsKcmV0dXJuICdSQyc7Cn0KfQoKcmV0dXJuICdzdGFibGUnOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZVN0YWJpbGl0eSgkc3RhYmlsaXR5KQp7CiRzdGFiaWxpdHkgPSBzdHJ0b2xvd2VyKChzdHJpbmcpICRzdGFiaWxpdHkpOwoKaWYgKCFpbl9hcnJheSgkc3RhYmlsaXR5LCBhcnJheSgnc3RhYmxlJywgJ3JjJywgJ2JldGEnLCAnYWxwaGEnLCAnZGV2JyksIHRydWUpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIHN0YWJpbGl0eSBzdHJpbmcgIicuJHN0YWJpbGl0eS4nIiwgZXhwZWN0ZWQgb25lIG9mIHN0YWJsZSwgUkMsIGJldGEsIGFscGhhIG9yIGRldicpOwp9CgpyZXR1cm4gJHN0YWJpbGl0eSA9PT0gJ3JjJyA/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/OiAnPScsICR2ZXJzaW9uKSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKfQp9CgokbWVzc2FnZSA9ICdDb3VsZCBub3QgcGFyc2UgdmVyc2lvbiBjb25zdHJhaW50ICcgLiAkY29uc3RyYWludDsKaWYgKGlzc2V0KCRlKSkgewokbWVzc2FnZSAuPSAnOiAnIC4gJGUtPmdldE1lc3NhZ2UoKTsKfQoKdGhyb3cgbmV3IFxVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24oJG1lc3NhZ2UpOwp9CgoKCgoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbWFuaXB1bGF0ZVZlcnNpb25TdHJpbmcoYXJyYXkgJG1hdGNoZXMsICRwb3NpdGlvbiwgJGluY3JlbWVudCA9IDAsICRwYWQgPSAnMCcpCnsKZm9yICgkaSA9IDQ7ICRpID4gMDsgLS0kaSkgewppZiAoJGkgPiAkcG9zaXRpb24pIHsKJG1hdGNoZXNbJGldID0gJHBhZDsKfSBlbHNlaWYgKCRpID09PSAkcG9zaXRpb24gJiYgJGluY3JlbWVudCkgewokbWF0Y2hlc1skaV0gKz0gJGluY3JlbWVudDsKCmlmICgkbWF0Y2hlc1skaV0gPCAwKSB7CiRtYXRjaGVzWyRpXSA9ICRwYWQ7Ci0tJHBvc2l0aW9uOwoKCmlmICgkaSA9PT0gMSkgewpyZXR1cm4gbnVsbDsKfQp9Cn0KfQoKcmV0dXJuICRtYXRjaGVzWzFdIC4gJy4nIC4gJG1hdGNoZXNbMl0gLiAnLicgLiAkbWF0Y2hlc1szXSAuICcuJyAuICRtYXRjaGVzWzRdOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHBhbmRTdGFiaWxpdHkoJHN0YWJpbGl0eSkKewokc3RhYmlsaXR5ID0gc3RydG9sb3dlcigkc3RhYmlsaXR5KTsKCnN3aXRjaCAoJHN0YWJpbGl0eSkgewpjYXNlICdhJzoKcmV0dXJuICdhbHBoYSc7CmNhc2UgJ2InOgpyZXR1cm4gJ2JldGEnOwpjYXNlICdwJzoKY2FzZSAncGwnOgpyZXR1cm4gJ3BhdGNoJzsKY2FzZSAncmMnOgpyZXR1cm4gJ1JDJzsKZGVmYXVsdDoKcmV0dXJuICRzdGFiaWxpdHk7Cn0KfQp9CgpDb3B5cmlnaHQgKEMpIDIwMTUgQ29tcG9zZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcwpvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8Kc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKU09GVFdBUkUuCgp7CiAgICAiMzg5LWV4Y2VwdGlvbiI6IFsKICAgICAgICAiMzg5IERpcmVjdG9yeSBTZXJ2ZXIgRXhjZXB0aW9uIgogICAgXSwKICAgICJBc3Rlcmlzay1leGNlcHRpb24iOiBbCiAgICAgICAgIkFzdGVyaXNrIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQXN0ZXJpc2stbGlua2luZy1wcm90b2NvbHMtZXhjZXB0aW9uIjogWwogICAgICAgICJBc3RlcmlzayBsaW5raW5nIHByb3RvY29scyBleGNlcHRpb24iCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkF1dG9jb25mIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi0zLjAiOiBbCiAgICAgICAgIkF1dG9jb25mIGV4Y2VwdGlvbiAzLjAiCiAgICBdLAogICAgIkF1dG9jb25mLWV4Y2VwdGlvbi1nZW5lcmljIjogWwogICAgICAgICJBdXRvY29uZiBnZW5lcmljIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQXV0b2NvbmYtZXhjZXB0aW9uLWdlbmVyaWMtMy4wIjogWwogICAgICAgICJBdXRvY29uZiBnZW5lcmljIGV4Y2VwdGlvbiBmb3IgR1BMLTMuMCIKICAgIF0sCiAgICAiQXV0b2NvbmYtZXhjZXB0aW9uLW1hY3JvIjogWwogICAgICAgICJBdXRvY29uZiBtYWNybyBleGNlcHRpb24iCiAgICBdLAogICAgIkJpc29uLWV4Y2VwdGlvbi0xLjI0IjogWwogICAgICAgICJCaXNvbiBleGNlcHRpb24gMS4yNCIKICAgIF0sCiAgICAiQmlzb24tZXhjZXB0aW9uLTIuMiI6IFsKICAgICAgICAiQmlzb24gZXhjZXB0aW9uIDIuMiIKICAgIF0sCiAgICAiQm9vdGxvYWRlci1leGNlcHRpb24iOiBbCiAgICAgICAgIkJvb3Rsb2FkZXIgRGlzdHJpYnV0aW9uIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQ0dBTC1saW5raW5nLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiQ0dBTCBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAiOiBbCiAgICAgICAgIkNsYXNzcGF0aCBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJDTElTUC1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJDTElTUCBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJjcnlwdHNldHVwLU9wZW5TU0wtZXhjZXB0aW9uIjogWwogICAgICAgICJjcnlwdHNldHVwIE9wZW5TU0wgZXhjZXB0aW9uIgogICAgXSwKICAgICJEaWdpYS1RdC1MR1BMLWV4Y2VwdGlvbi0xLjEiOiBbCiAgICAgICAgIkRpZ2lhIFF0IExHUEwgRXhjZXB0aW9uIHZlcnNpb24gMS4xIgogICAgXSwKICAgICJEaWdpUnVsZS1GT1NTLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiRGlnaVJ1bGUgRk9TUyBMaWNlbnNlIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiZUNvcy1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJlQ29zIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgImVybGFuZy1vdHAtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkVybGFuZy9PVFAgTGlua2luZyBFeGNlcHRpb24iCiAgICBdLAogICAgIkZhd2tlcy1SdW50aW1lLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiRmF3a2VzIFJ1bnRpbWUgRXhjZXB0aW9uIgogICAgXSwKICAgICJGTFRLLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiRkxUSyBleGNlcHRpb24iCiAgICBdLAogICAgImZtdC1leGNlcHRpb24iOiBbCiAgICAgICAgImZtdCBleGNlcHRpb24iCiAgICBdLAogICAgIkZvbnQtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiRm9udCBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJmcmVlcnRvcy1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJGcmVlUlRPUyBFeGNlcHRpb24gMi4wIgogICAgXSwKICAgICJHQ0MtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiR0NDIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24gMi4wIgogICAgXSwKICAgICJHQ0MtZXhjZXB0aW9uLTIuMC1ub3RlIjogWwogICAgICAgICJHQ0MgICAgUnVudGltZSBMaWJyYXJ5IGV4Y2VwdGlvbiAyLjAgLSBub3RlIHZhcmlhbnQiCiAgICBdLAogICAgIkdDQy1leGNlcHRpb24tMy4xIjogWwogICAgICAgICJHQ0MgUnVudGltZSBMaWJyYXJ5IGV4Y2VwdGlvbiAzLjEiCiAgICBdLAogICAgIkdtc2gtZXhjZXB0aW9uIjogWwogICAgICAgICJHbXNoIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR05BVC1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOQVQgZXhjZXB0aW9uIgogICAgXSwKICAgICJHTk9NRS1leGFtcGxlcy1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOT01FIGV4YW1wbGVzIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR05VLWNvbXBpbGVyLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIENvbXBpbGVyIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiZ251LWphdmFtYWlsLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEphdmFNYWlsIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR1BMLTMuMC0zODktZHMtYmFzZS1leGNlcHRpb24iOiBbCiAgICAgICAgIkdQTC0zLjAgMzg5IERTIEJhc2UgRXhjZXB0aW9uIgogICAgXSwKICAgICJHUEwtMy4wLWludGVyZmFjZS1leGNlcHRpb24iOiBbCiAgICAgICAgIkdQTC0zLjAgSW50ZXJmYWNlIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR1BMLTMuMC1saW5raW5nLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR1BMLTMuMCBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiR1BMLTMuMC1saW5raW5nLXNvdXJjZS1leGNlcHRpb24iOiBbCiAgICAgICAgIkdQTC0zLjAgTGlua2luZyBFeGNlcHRpb24gKHdpdGggQ29ycmVzcG9uZGluZyBTb3VyY2UpIgogICAgXSwKICAgICJHUEwtQ0MtMS4wIjogWwogICAgICAgICJHUEwgQ29vcGVyYXRpb24gQ29tbWl0bWVudCAxLjAiCiAgICBdLAogICAgIkdTdHJlYW1lci1leGNlcHRpb24tMjAwNSI6IFsKICAgICAgICAiR1N0cmVhbWVyIEV4Y2VwdGlvbiAoMjAwNSkiCiAgICBdLAogICAgIkdTdHJlYW1lci1leGNlcHRpb24tMjAwOCI6IFsKICAgICAgICAiR1N0cmVhbWVyIEV4Y2VwdGlvbiAoMjAwOCkiCiAgICBdLAogICAgImhhcmJvdXItZXhjZXB0aW9uIjogWwogICAgICAgICJoYXJib3VyIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiaTJwLWdwbC1qYXZhLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiaTJwIEdQTCtKYXZhIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiSW5kZXBlbmRlbnQtbW9kdWxlcy1leGNlcHRpb24iOiBbCiAgICAgICAgIkluZGVwZW5kZW50IE1vZHVsZSBMaW5raW5nIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiS2lDYWQtbGlicmFyaWVzLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiS2lDYWQgTGlicmFyaWVzIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTEdQTC0zLjAtbGlua2luZy1leGNlcHRpb24iOiBbCiAgICAgICAgIkxHUEwtMy4wIExpbmtpbmcgRXhjZXB0aW9uIgogICAgXSwKICAgICJsaWJwcmktT3BlbkgzMjMtZXhjZXB0aW9uIjogWwogICAgICAgICJsaWJwcmkgT3BlbkgzMjMgZXhjZXB0aW9uIgogICAgXSwKICAgICJMaWJ0b29sLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiTGlidG9vbCBFeGNlcHRpb24iCiAgICBdLAogICAgIkxpbnV4LXN5c2NhbGwtbm90ZSI6IFsKICAgICAgICAiTGludXggU3lzY2FsbCBOb3RlIgogICAgXSwKICAgICJMTEdQTCI6IFsKICAgICAgICAiTExHUEwgUHJlYW1ibGUiCiAgICBdLAogICAgIkxMVk0tZXhjZXB0aW9uIjogWwogICAgICAgICJMTFZNIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiTFpNQS1leGNlcHRpb24iOiBbCiAgICAgICAgIkxaTUEgZXhjZXB0aW9uIgogICAgXSwKICAgICJtaWYtZXhjZXB0aW9uIjogWwogICAgICAgICJNYWNyb3MgYW5kIElubGluZSBGdW5jdGlvbnMgRXhjZXB0aW9uIgogICAgXSwKICAgICJteG1sLWV4Y2VwdGlvbiI6IFsKICAgICAgICAibXhtbCBFeGNlcHRpb24iCiAgICBdLAogICAgIk5va2lhLVF0LWV4Y2VwdGlvbi0xLjEiOiBbCiAgICAgICAgIk5va2lhIFF0IExHUEwgZXhjZXB0aW9uIDEuMSIKICAgIF0sCiAgICAiT0NhbWwtTEdQTC1saW5raW5nLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiT0NhbWwgTEdQTCBMaW5raW5nIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiT0NDVC1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJPcGVuIENBU0NBREUgRXhjZXB0aW9uIDEuMCIKICAgIF0sCiAgICAiT3BlbkpESy1hc3NlbWJseS1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJPcGVuSkRLIEFzc2VtYmx5IGV4Y2VwdGlvbiAxLjAiCiAgICBdLAogICAgIm9wZW52cG4tb3BlbnNzbC1leGNlcHRpb24iOiBbCiAgICAgICAgIk9wZW5WUE4gT3BlblNTTCBFeGNlcHRpb24iCiAgICBdLAogICAgIlBDUkUyLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiUENSRTIgZXhjZXB0aW9uIgogICAgXSwKICAgICJwb2x5cGFyc2UtZXhjZXB0aW9uIjogWwogICAgICAgICJQb2x5cGFyc2UgRXhjZXB0aW9uIgogICAgXSwKICAgICJQUy1vci1QREYtZm9udC1leGNlcHRpb24tMjAxNzA4MTciOiBbCiAgICAgICAgIlBTL1BERiBmb250IGV4Y2VwdGlvbiAoMjAxNy0wOC0xNykiCiAgICBdLAogICAgIlFQTC0xLjAtSU5SSUEtMjAwNC1leGNlcHRpb24iOiBbCiAgICAgICAgIklOUklBIFFQTCAxLjAgMjAwNCB2YXJpYW50IGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiUXQtR1BMLWV4Y2VwdGlvbi0xLjAiOiBbCiAgICAgICAgIlF0IEdQTCBleGNlcHRpb24gMS4wIgogICAgXSwKICAgICJRdC1MR1BMLWV4Y2VwdGlvbi0xLjEiOiBbCiAgICAgICAgIlF0IExHUEwgZXhjZXB0aW9uIDEuMSIKICAgIF0sCiAgICAiUXd0LWV4Y2VwdGlvbi0xLjAiOiBbCiAgICAgICAgIlF3dCBleGNlcHRpb24gMS4wIgogICAgXSwKICAgICJyb21pYy1leGNlcHRpb24iOiBbCiAgICAgICAgIlJvbWljIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiUlJEdG9vbC1GTE9TUy1leGNlcHRpb24tMi4wIjogWwogICAgICAgICJSUkR0b29sIEZMT1NTIGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIlNBTkUtZXhjZXB0aW9uIjogWwogICAgICAgICJTQU5FIEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiU0hMLTIuMCI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UgdjIuMCIKICAgIF0sCiAgICAiU0hMLTIuMSI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UgdjIuMSIKICAgIF0sCiAgICAic3R1bm5lbC1leGNlcHRpb24iOiBbCiAgICAgICAgInN0dW5uZWwgRXhjZXB0aW9uIgogICAgXSwKICAgICJTV0ktZXhjZXB0aW9uIjogWwogICAgICAgICJTV0kgZXhjZXB0aW9uIgogICAgXSwKICAgICJTd2lmdC1leGNlcHRpb24iOiBbCiAgICAgICAgIlN3aWZ0IEV4Y2VwdGlvbiIKICAgIF0sCiAgICAiVGV4aW5mby1leGNlcHRpb24iOiBbCiAgICAgICAgIlRleGluZm8gZXhjZXB0aW9uIgogICAgXSwKICAgICJ1LWJvb3QtZXhjZXB0aW9uLTIuMCI6IFsKICAgICAgICAiVS1Cb290IGV4Y2VwdGlvbiAyLjAiCiAgICBdLAogICAgIlVCREwtZXhjZXB0aW9uIjogWwogICAgICAgICJVbm1vZGlmaWVkIEJpbmFyeSBEaXN0cmlidXRpb24gZXhjZXB0aW9uIgogICAgXSwKICAgICJVbml2ZXJzYWwtRk9TUy1leGNlcHRpb24tMS4wIjogWwogICAgICAgICJVbml2ZXJzYWwgRk9TUyBFeGNlcHRpb24sIFZlcnNpb24gMS4wIgogICAgXSwKICAgICJ2c2Z0cGQtb3BlbnNzbC1leGNlcHRpb24iOiBbCiAgICAgICAgInZzZnRwZCBPcGVuU1NMIGV4Y2VwdGlvbiIKICAgIF0sCiAgICAiV3hXaW5kb3dzLWV4Y2VwdGlvbi0zLjEiOiBbCiAgICAgICAgIld4V2luZG93cyBMaWJyYXJ5IEV4Y2VwdGlvbiAzLjEiCiAgICBdLAogICAgIngxMXZuYy1vcGVuc3NsLWV4Y2VwdGlvbiI6IFsKICAgICAgICAieDExdm5jIE9wZW5TU0wgRXhjZXB0aW9uIgogICAgXQp9ewogICAgIjBCU0QiOiBbCiAgICAgICAgIkJTRCBaZXJvIENsYXVzZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIjNELVNsaWNlci0xLjAiOiBbCiAgICAgICAgIjNEIFNsaWNlciBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFBTCI6IFsKICAgICAgICAiQXR0cmlidXRpb24gQXNzdXJhbmNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWJzdHlsZXMiOiBbCiAgICAgICAgIkFic3R5bGVzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFkYUNvcmUtZG9jIjogWwogICAgICAgICJBZGFDb3JlIERvYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBZG9iZS0yMDA2IjogWwogICAgICAgICJBZG9iZSBTeXN0ZW1zIEluY29ycG9yYXRlZCBTb3VyY2UgQ29kZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWRvYmUtRGlzcGxheS1Qb3N0U2NyaXB0IjogWwogICAgICAgICJBZG9iZSBEaXNwbGF5IFBvc3RTY3JpcHQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWRvYmUtR2x5cGgiOiBbCiAgICAgICAgIkFkb2JlIEdseXBoIExpc3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWRvYmUtVXRvcGlhIjogWwogICAgICAgICJBZG9iZSBVdG9waWEgRm9udCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRFNMIjogWwogICAgICAgICJBbWF6b24gRGlnaXRhbCBTZXJ2aWNlcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMS4xIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMS4yIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMi4wIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMi4xIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBRkwtMy4wIjogWwogICAgICAgICJBY2FkZW1pYyBGcmVlIExpY2Vuc2UgdjMuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBZm1wYXJzZSI6IFsKICAgICAgICAiQWZtcGFyc2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUdQTC0xLjAiOiBbCiAgICAgICAgIkFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQUdQTC0xLjAtb25seSI6IFsKICAgICAgICAiQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBR1BMLTEuMC1vci1sYXRlciI6IFsKICAgICAgICAiQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQUdQTC0zLjAiOiBbCiAgICAgICAgIkdOVSBBZmZlcm8gR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQUdQTC0zLjAtb25seSI6IFsKICAgICAgICAiR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBR1BMLTMuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQWxhZGRpbiI6IFsKICAgICAgICAiQWxhZGRpbiBGcmVlIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTUQtbmV3bGliIjogWwogICAgICAgICJBTUQgbmV3bGliIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFNRFBMUEEiOiBbCiAgICAgICAgIkFNRCdzIHBscGFfbWFwLmMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1MIjogWwogICAgICAgICJBcHBsZSBNSVQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1MLWdsc2xhbmciOiBbCiAgICAgICAgIkFNTCBnbHNsYW5nIHZhcmlhbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU1QQVMiOiBbCiAgICAgICAgIkFjYWRlbXkgb2YgTW90aW9uIFBpY3R1cmUgQXJ0cyBhbmQgU2NpZW5jZXMgQlNEIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBTlRMUi1QRCI6IFsKICAgICAgICAiQU5UTFIgU29mdHdhcmUgUmlnaHRzIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQU5UTFItUEQtZmFsbGJhY2siOiBbCiAgICAgICAgIkFOVExSIFNvZnR3YXJlIFJpZ2h0cyBOb3RpY2Ugd2l0aCBsaWNlbnNlIGZhbGxiYWNrIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJhbnktT1NJIjogWwogICAgICAgICJBbnkgT1NJIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImFueS1PU0ktcGVybC1tb2R1bGVzIjogWwogICAgICAgICJBbnkgT1NJIExpY2Vuc2UgLSBQZXJsIE1vZHVsZXMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFwYWNoZS0xLjAiOiBbCiAgICAgICAgIkFwYWNoZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXBhY2hlLTEuMSI6IFsKICAgICAgICAiQXBhY2hlIExpY2Vuc2UgMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFwYWNoZS0yLjAiOiBbCiAgICAgICAgIkFwYWNoZSBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUEFGTUwiOiBbCiAgICAgICAgIkFkb2JlIFBvc3RzY3JpcHQgQUZNIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFQTC0xLjAiOiBbCiAgICAgICAgIkFkYXB0aXZlIFB1YmxpYyBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcHAtczJwIjogWwogICAgICAgICJBcHA6OnMycCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTEuMCI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTEuMSI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTEuMiI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDEuMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBUFNMLTIuMCI6IFsKICAgICAgICAiQXBwbGUgUHVibGljIFNvdXJjZSBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnBoaWMtMTk5OSI6IFsKICAgICAgICAiQXJwaGljIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy0xLjAiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFydGlzdGljLTEuMC1jbDgiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIHcvY2xhdXNlIDgiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQXJ0aXN0aWMtMS4wLVBlcmwiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIChQZXJsKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJBcnRpc3RpYy0yLjAiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkFydGlzdGljLWRpc3QiOiBbCiAgICAgICAgIkFydGlzdGljIExpY2Vuc2UgMS4wIChkaXN0KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVNXRi1EaWdpdGFsLUFzc2V0cy0xLjAiOiBbCiAgICAgICAgIkFTV0YgRGlnaXRhbCBBc3NldHMgTGljZW5zZSB2ZXJzaW9uIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQVNXRi1EaWdpdGFsLUFzc2V0cy0xLjEiOiBbCiAgICAgICAgIkFTV0YgRGlnaXRhbCBBc3NldHMgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJhZWttdWsiOiBbCiAgICAgICAgIkJhZWttdWsgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQmFoeXBoIjogWwogICAgICAgICJCYWh5cGggTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQmFyciI6IFsKICAgICAgICAiQmFyciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJiY3J5cHQtU29sYXItRGVzaWduZXIiOiBbCiAgICAgICAgImJjcnlwdCBTb2xhciBEZXNpZ25lciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCZWVyd2FyZSI6IFsKICAgICAgICAiQmVlcndhcmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQml0c3RyZWFtLUNoYXJ0ZXIiOiBbCiAgICAgICAgIkJpdHN0cmVhbSBDaGFydGVyIEZvbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQml0c3RyZWFtLVZlcmEiOiBbCiAgICAgICAgIkJpdHN0cmVhbSBWZXJhIEZvbnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQml0VG9ycmVudC0xLjAiOiBbCiAgICAgICAgIkJpdFRvcnJlbnQgT3BlbiBTb3VyY2UgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCaXRUb3JyZW50LTEuMSI6IFsKICAgICAgICAiQml0VG9ycmVudCBPcGVuIFNvdXJjZSBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImJsZXNzaW5nIjogWwogICAgICAgICJTUUxpdGUgQmxlc3NpbmciLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJsdWVPYWstMS4wLjAiOiBbCiAgICAgICAgIkJsdWUgT2FrIE1vZGVsIExpY2Vuc2UgMS4wLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQm9laG0tR0MiOiBbCiAgICAgICAgIkJvZWhtLURlbWVycy1XZWlzZXIgR0MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQm9laG0tR0Mtd2l0aG91dC1mZWUiOiBbCiAgICAgICAgIkJvZWhtLURlbWVycy1XZWlzZXIgR0MgTGljZW5zZSAod2l0aG91dCBmZWUpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCb3JjZXV4IjogWwogICAgICAgICJCb3JjZXV4IGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJyaWFuLUdsYWRtYW4tMi1DbGF1c2UiOiBbCiAgICAgICAgIkJyaWFuIEdsYWRtYW4gMi1DbGF1c2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQnJpYW4tR2xhZG1hbi0zLUNsYXVzZSI6IFsKICAgICAgICAiQnJpYW4gR2xhZG1hbiAzLUNsYXVzZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMS1DbGF1c2UiOiBbCiAgICAgICAgIkJTRCAxLUNsYXVzZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0yLUNsYXVzZSI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIFwiU2ltcGxpZmllZFwiIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLURhcndpbiI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIC0gSWFuIERhcndpbiB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtZmlyc3QtbGluZXMiOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSAtIGZpcnN0IGxpbmVzIHJlcXVpcmVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtRnJlZUJTRCI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIEZyZWVCU0QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtTmV0QlNEIjogWwogICAgICAgICJCU0QgMi1DbGF1c2UgTmV0QlNEIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLVBhdGVudCI6IFsKICAgICAgICAiQlNELTItQ2xhdXNlIFBsdXMgUGF0ZW50IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTItQ2xhdXNlLXBrZ2NvbmYtZGlzY2xhaW1lciI6IFsKICAgICAgICAiQlNEIDItQ2xhdXNlIHBrZ2NvbmYgZGlzY2xhaW1lciB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMi1DbGF1c2UtVmlld3MiOiBbCiAgICAgICAgIkJTRCAyLUNsYXVzZSB3aXRoIHZpZXdzIHNlbnRlbmNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBcIk5ld1wiIG9yIFwiUmV2aXNlZFwiIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLWFjcGljYSI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIGFjcGljYSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtQXR0cmlidXRpb24iOiBbCiAgICAgICAgIkJTRCB3aXRoIGF0dHJpYnV0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtQ2xlYXIiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBDbGVhciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtZmxleCI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIEZsZXggdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLUhQIjogWwogICAgICAgICJIZXdsZXR0LVBhY2thcmQgQlNEIHZhcmlhbnQgbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTMtQ2xhdXNlLUxCTkwiOiBbCiAgICAgICAgIkxhd3JlbmNlIEJlcmtlbGV5IE5hdGlvbmFsIExhYnMgQlNEIHZhcmlhbnQgbGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTW9kaWZpY2F0aW9uIjogWwogICAgICAgICJCU0QgMy1DbGF1c2UgTW9kaWZpY2F0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTm8tTWlsaXRhcnktTGljZW5zZSI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE5vIE1pbGl0YXJ5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1Oby1OdWNsZWFyLUxpY2Vuc2UiOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBObyBOdWNsZWFyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1Oby1OdWNsZWFyLUxpY2Vuc2UtMjAxNCI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE5vIE51Y2xlYXIgTGljZW5zZSAyMDE0IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtMy1DbGF1c2UtTm8tTnVjbGVhci1XYXJyYW50eSI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE5vIE51Y2xlYXIgV2FycmFudHkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1PcGVuLU1QSSI6IFsKICAgICAgICAiQlNEIDMtQ2xhdXNlIE9wZW4gTVBJIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC0zLUNsYXVzZS1TdW4iOiBbCiAgICAgICAgIkJTRCAzLUNsYXVzZSBTdW4gTWljcm9zeXN0ZW1zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UiOiBbCiAgICAgICAgIkJTRCA0LUNsYXVzZSBcIk9yaWdpbmFsXCIgb3IgXCJPbGRcIiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UtU2hvcnRlbmVkIjogWwogICAgICAgICJCU0QgNCBDbGF1c2UgU2hvcnRlbmVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC1DbGF1c2UtVUMiOiBbCiAgICAgICAgIkJTRC00LUNsYXVzZSAoVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLVNwZWNpZmljKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELTQuM1JFTk8iOiBbCiAgICAgICAgIkJTRCA0LjMgUkVOTyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtNC4zVEFIT0UiOiBbCiAgICAgICAgIkJTRCA0LjMgVEFIT0UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELUFkdmVydGlzaW5nLUFja25vd2xlZGdlbWVudCI6IFsKICAgICAgICAiQlNEIEFkdmVydGlzaW5nIEFja25vd2xlZGdlbWVudCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtQXR0cmlidXRpb24tSFBORC1kaXNjbGFpbWVyIjogWwogICAgICAgICJCU0Qgd2l0aCBBdHRyaWJ1dGlvbiBhbmQgSFBORCBkaXNjbGFpbWVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtSW5mZXJuby1OZXR0dmVyayI6IFsKICAgICAgICAiQlNELUluZmVybm8tTmV0dHZlcmsiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1Qcm90ZWN0aW9uIjogWwogICAgICAgICJCU0QgUHJvdGVjdGlvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtU291cmNlLWJlZ2lubmluZy1maWxlIjogWwogICAgICAgICJCU0QgU291cmNlIENvZGUgQXR0cmlidXRpb24gLSBiZWdpbm5pbmcgb2YgZmlsZSB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJCU0QtU291cmNlLUNvZGUiOiBbCiAgICAgICAgIkJTRCBTb3VyY2UgQ29kZSBBdHRyaWJ1dGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNELVN5c3RlbWljcyI6IFsKICAgICAgICAiU3lzdGVtaWNzIEJTRCB2YXJpYW50IGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkJTRC1TeXN0ZW1pY3MtVzNXb3JrcyI6IFsKICAgICAgICAiU3lzdGVtaWNzIFczV29ya3MgQlNEIHZhcmlhbnQgbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlNMLTEuMCI6IFsKICAgICAgICAiQm9vc3QgU29mdHdhcmUgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQlVTTC0xLjEiOiBbCiAgICAgICAgIkJ1c2luZXNzIFNvdXJjZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiYnppcDItMS4wLjUiOiBbCiAgICAgICAgImJ6aXAyIGFuZCBsaWJiemlwMiBMaWNlbnNlIHYxLjAuNSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJiemlwMi0xLjAuNiI6IFsKICAgICAgICAiYnppcDIgYW5kIGxpYmJ6aXAyIExpY2Vuc2UgdjEuMC42IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDLVVEQS0xLjAiOiBbCiAgICAgICAgIkNvbXB1dGF0aW9uYWwgVXNlIG9mIERhdGEgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNBTC0xLjAiOiBbCiAgICAgICAgIkNyeXB0b2dyYXBoaWMgQXV0b25vbXkgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0FMLTEuMC1Db21iaW5lZC1Xb3JrLUV4Y2VwdGlvbiI6IFsKICAgICAgICAiQ3J5cHRvZ3JhcGhpYyBBdXRvbm9teSBMaWNlbnNlIDEuMCAoQ29tYmluZWQgV29yayBFeGNlcHRpb24pIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNhbGRlcmEiOiBbCiAgICAgICAgIkNhbGRlcmEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ2FsZGVyYS1uby1wcmVhbWJsZSI6IFsKICAgICAgICAiQ2FsZGVyYSBMaWNlbnNlICh3aXRob3V0IHByZWFtYmxlKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ2F0aGFyb24iOiBbCiAgICAgICAgIkNhdGhhcm9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNBVE9TTC0xLjEiOiBbCiAgICAgICAgIkNvbXB1dGVyIEFzc29jaWF0ZXMgVHJ1c3RlZCBPcGVuIFNvdXJjZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTIuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAyLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0yLjUtQVUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMi41IEF1c3RyYWxpYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLUFUIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBBdXN0cmlhIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtQVUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gMy4wIEF1c3RyYWxpYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS0zLjAtSUdPIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDMuMCBJR08iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1OTCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgTmV0aGVybGFuZHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLTMuMC1VUyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiAzLjAgVW5pdGVkIFN0YXRlcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktNC4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIDQuMCBJbnRlcm5hdGlvbmFsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLTIuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCAyLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy0zLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgMy4wIFVucG9ydGVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy0zLjAtREUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgMy4wIEdlcm1hbnkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgTm8gRGVyaXZhdGl2ZXMgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTIuNSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyAyLjUgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMy4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDMuMCBVbnBvcnRlZCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtTkQtMy4wLURFIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDMuMCBHZXJtYW55IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1ORC0zLjAtSUdPIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIE5vIERlcml2YXRpdmVzIDMuMCBJR08iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLU5ELTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBObyBEZXJpdmF0aXZlcyA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMS4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vbiBDb21tZXJjaWFsIFNoYXJlIEFsaWtlIDEuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0yLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMi4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTIuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAyLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMi4wLUZSIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uLU5vbkNvbW1lcmNpYWwtU2hhcmVBbGlrZSAyLjAgRnJhbmNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0yLjAtVUsiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMi4wIEVuZ2xhbmQgYW5kIFdhbGVzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS0yLjUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgMi41IEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5DLVNBLTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkMtU0EtMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBOb24gQ29tbWVyY2lhbCBTaGFyZSBBbGlrZSAzLjAgSUdPIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1OQy1TQS00LjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm9uIENvbW1lcmNpYWwgU2hhcmUgQWxpa2UgNC4wIEludGVybmF0aW9uYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtMi4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDIuMCBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1ORC0yLjUiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gTm8gRGVyaXZhdGl2ZXMgMi41IEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTMuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyAzLjAgVW5wb3J0ZWQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLU5ELTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBObyBEZXJpdmF0aXZlcyAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktTkQtNC4wIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIE5vIERlcml2YXRpdmVzIDQuMCBJbnRlcm5hdGlvbmFsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMS4wIEdlbmVyaWMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTIuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAyLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMi4wLVVLIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDIuMCBFbmdsYW5kIGFuZCBXYWxlcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMi4xLUpQIjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDIuMSBKYXBhbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMi41IjogWwogICAgICAgICJDcmVhdGl2ZSBDb21tb25zIEF0dHJpYnV0aW9uIFNoYXJlIEFsaWtlIDIuNSBHZW5lcmljIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0zLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMy4wIFVucG9ydGVkIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDQy1CWS1TQS0zLjAtQVQiOiBbCiAgICAgICAgIkNyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24gU2hhcmUgQWxpa2UgMy4wIEF1c3RyaWEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTMuMC1ERSI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSAzLjAgR2VybWFueSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtQlktU0EtMy4wLUlHTyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDMuMCBJR08iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLUJZLVNBLTQuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbiBTaGFyZSBBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MtUEREQyI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBQdWJsaWMgRG9tYWluIERlZGljYXRpb24gYW5kIENlcnRpZmljYXRpb24iLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLVBETS0xLjAiOiBbCiAgICAgICAgIkNyZWF0aXZlICAgIENvbW1vbnMgUHVibGljIERvbWFpbiBNYXJrIDEuMCBVbml2ZXJzYWwiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNDLVNBLTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBTaGFyZSBBbGlrZSAxLjAgR2VuZXJpYyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0MwLTEuMCI6IFsKICAgICAgICAiQ3JlYXRpdmUgQ29tbW9ucyBaZXJvIHYxLjAgVW5pdmVyc2FsIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRERMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIERldmVsb3BtZW50IGFuZCBEaXN0cmlidXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RETC0xLjEiOiBbCiAgICAgICAgIkNvbW1vbiBEZXZlbG9wbWVudCBhbmQgRGlzdHJpYnV0aW9uIExpY2Vuc2UgMS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDREwtMS4wIjogWwogICAgICAgICJDb21tb24gRG9jdW1lbnRhdGlvbiBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0RMQS1QZXJtaXNzaXZlLTEuMCI6IFsKICAgICAgICAiQ29tbXVuaXR5IERhdGEgTGljZW5zZSBBZ3JlZW1lbnQgUGVybWlzc2l2ZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNETEEtUGVybWlzc2l2ZS0yLjAiOiBbCiAgICAgICAgIkNvbW11bml0eSBEYXRhIExpY2Vuc2UgQWdyZWVtZW50IFBlcm1pc3NpdmUgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRExBLVNoYXJpbmctMS4wIjogWwogICAgICAgICJDb21tdW5pdHkgRGF0YSBMaWNlbnNlIEFncmVlbWVudCBTaGFyaW5nIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLTEuMCI6IFsKICAgICAgICAiQ2VDSUxMIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLTEuMSI6IFsKICAgICAgICAiQ2VDSUxMIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLTIuMCI6IFsKICAgICAgICAiQ2VDSUxMIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgdjIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLTIuMSI6IFsKICAgICAgICAiQ2VDSUxMIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQgdjIuMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRUNJTEwtQiI6IFsKICAgICAgICAiQ2VDSUxMLUIgRnJlZSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VDSUxMLUMiOiBbCiAgICAgICAgIkNlQ0lMTC1DIEZyZWUgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNFUk4tT0hMLTEuMSI6IFsKICAgICAgICAiQ0VSTiBPcGVuIEhhcmR3YXJlIExpY2VuY2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0VSTi1PSEwtMS4yIjogWwogICAgICAgICJDRVJOIE9wZW4gSGFyZHdhcmUgTGljZW5jZSB2MS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRVJOLU9ITC1QLTIuMCI6IFsKICAgICAgICAiQ0VSTiBPcGVuIEhhcmR3YXJlIExpY2VuY2UgVmVyc2lvbiAyIC0gUGVybWlzc2l2ZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRVJOLU9ITC1TLTIuMCI6IFsKICAgICAgICAiQ0VSTiBPcGVuIEhhcmR3YXJlIExpY2VuY2UgVmVyc2lvbiAyIC0gU3Ryb25nbHkgUmVjaXByb2NhbCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDRVJOLU9ITC1XLTIuMCI6IFsKICAgICAgICAiQ0VSTiBPcGVuIEhhcmR3YXJlIExpY2VuY2UgVmVyc2lvbiAyIC0gV2Vha2x5IFJlY2lwcm9jYWwiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ0ZJVFNJTyI6IFsKICAgICAgICAiQ0ZJVFNJTyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjaGVjay1jdnMiOiBbCiAgICAgICAgImNoZWNrLWN2cyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjaGVja21rIjogWwogICAgICAgICJDaGVja21rIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNsQXJ0aXN0aWMiOiBbCiAgICAgICAgIkNsYXJpZmllZCBBcnRpc3RpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDbGlwcyI6IFsKICAgICAgICAiQ2xpcHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ01VLU1hY2giOiBbCiAgICAgICAgIkNNVSBNYWNoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNNVS1NYWNoLW5vZG9jIjogWwogICAgICAgICJDTVUgICAgTWFjaCAtIG5vIG5vdGljZXMtaW4tZG9jdW1lbnRhdGlvbiB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDTlJJLUp5dGhvbiI6IFsKICAgICAgICAiQ05SSSBKeXRob24gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ05SSS1QeXRob24iOiBbCiAgICAgICAgIkNOUkkgUHl0aG9uIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ05SSS1QeXRob24tR1BMLUNvbXBhdGlibGUiOiBbCiAgICAgICAgIkNOUkkgUHl0aG9uIE9wZW4gU291cmNlIEdQTCBDb21wYXRpYmxlIExpY2Vuc2UgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDT0lMLTEuMCI6IFsKICAgICAgICAiQ29weWZyZWUgT3BlbiBJbm5vdmF0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNvbW11bml0eS1TcGVjLTEuMCI6IFsKICAgICAgICAiQ29tbXVuaXR5IFNwZWNpZmljYXRpb24gTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNvbmRvci0xLjEiOiBbCiAgICAgICAgIkNvbmRvciBQdWJsaWMgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjb3B5bGVmdC1uZXh0LTAuMy4wIjogWwogICAgICAgICJjb3B5bGVmdC1uZXh0IDAuMy4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjb3B5bGVmdC1uZXh0LTAuMy4xIjogWwogICAgICAgICJjb3B5bGVmdC1uZXh0IDAuMy4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDb3JuZWxsLUxvc3NsZXNzLUpQRUciOiBbCiAgICAgICAgIkNvcm5lbGwgTG9zc2xlc3MgSlBFRyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDUEFMLTEuMCI6IFsKICAgICAgICAiQ29tbW9uIFB1YmxpYyBBdHRyaWJ1dGlvbiBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDUEwtMS4wIjogWwogICAgICAgICJDb21tb24gUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNQT0wtMS4wMiI6IFsKICAgICAgICAiQ29kZSBQcm9qZWN0IE9wZW4gTGljZW5zZSAxLjAyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDcm9ueXgiOiBbCiAgICAgICAgIkNyb255eCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDcm9zc3dvcmQiOiBbCiAgICAgICAgIkNyb3Nzd29yZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJDcnlwdG9Td2lmdCI6IFsKICAgICAgICAiQ3J5cHRvU3dpZnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3J5c3RhbFN0YWNrZXIiOiBbCiAgICAgICAgIkNyeXN0YWxTdGFja2VyIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkNVQS1PUEwtMS4wIjogWwogICAgICAgICJDVUEgT2ZmaWNlIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiQ3ViZSI6IFsKICAgICAgICAiQ3ViZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJjdXJsIjogWwogICAgICAgICJjdXJsIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImN2ZS10b3UiOiBbCiAgICAgICAgIkNvbW1vbiBWdWxuZXJhYmlsaXR5IEVudW1lcmF0aW9uIFRvVSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJELUZTTC0xLjAiOiBbCiAgICAgICAgIkRldXRzY2hlIEZyZWllIFNvZnR3YXJlIExpemVueiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiREVDLTMtQ2xhdXNlIjogWwogICAgICAgICJERUMgMy1DbGF1c2UgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZGlmZm1hcmsiOiBbCiAgICAgICAgImRpZmZtYXJrIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRMLURFLUJZLTIuMCI6IFsKICAgICAgICAiRGF0YSBsaWNlbmNlIEdlcm1hbnkgXHUyMDEzIGF0dHJpYnV0aW9uIFx1MjAxMyB2ZXJzaW9uIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiREwtREUtWkVSTy0yLjAiOiBbCiAgICAgICAgIkRhdGEgbGljZW5jZSBHZXJtYW55IFx1MjAxMyB6ZXJvIFx1MjAxMyB2ZXJzaW9uIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRE9DIjogWwogICAgICAgICJET0MgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRG9jQm9vay1EVEQiOiBbCiAgICAgICAgIkRvY0Jvb2sgRFREIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRvY0Jvb2stU2NoZW1hIjogWwogICAgICAgICJEb2NCb29rIFNjaGVtYSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEb2NCb29rLVN0eWxlc2hlZXQiOiBbCiAgICAgICAgIkRvY0Jvb2sgU3R5bGVzaGVldCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEb2NCb29rLVhNTCI6IFsKICAgICAgICAiRG9jQm9vayBYTUwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRG90c2VxbiI6IFsKICAgICAgICAiRG90c2VxbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJEUkwtMS4wIjogWwogICAgICAgICJEZXRlY3Rpb24gUnVsZSBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRFJMLTEuMSI6IFsKICAgICAgICAiRGV0ZWN0aW9uIFJ1bGUgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkRTRFAiOiBbCiAgICAgICAgIkRTRFAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZHRvYSI6IFsKICAgICAgICAiRGF2aWQgTS4gR2F5IGR0b2EgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZHZpcGRmbSI6IFsKICAgICAgICAiZHZpcGRmbSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFQ0wtMS4wIjogWwogICAgICAgICJFZHVjYXRpb25hbCBDb21tdW5pdHkgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVDTC0yLjAiOiBbCiAgICAgICAgIkVkdWNhdGlvbmFsIENvbW11bml0eSBMaWNlbnNlIHYyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZUNvcy0yLjAiOiBbCiAgICAgICAgImVDb3MgbGljZW5zZSB2ZXJzaW9uIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJFRkwtMS4wIjogWwogICAgICAgICJFaWZmZWwgRm9ydW0gTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVGTC0yLjAiOiBbCiAgICAgICAgIkVpZmZlbCBGb3J1bSBMaWNlbnNlIHYyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiZUdlbml4IjogWwogICAgICAgICJlR2VuaXguY29tIFB1YmxpYyBMaWNlbnNlIDEuMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFbGFzdGljLTIuMCI6IFsKICAgICAgICAiRWxhc3RpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRW50ZXNzYSI6IFsKICAgICAgICAiRW50ZXNzYSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVQSUNTIjogWwogICAgICAgICJFUElDUyBPcGVuIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVQTC0xLjAiOiBbCiAgICAgICAgIkVjbGlwc2UgUHVibGljIExpY2Vuc2UgMS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVQTC0yLjAiOiBbCiAgICAgICAgIkVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVybFBMLTEuMSI6IFsKICAgICAgICAiRXJsYW5nIFB1YmxpYyBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImV0YWxhYi0yLjAiOiBbCiAgICAgICAgIkV0YWxhYiBPcGVuIExpY2Vuc2UgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFVURhdGFncmlkIjogWwogICAgICAgICJFVSBEYXRhR3JpZCBTb2Z0d2FyZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVVUEwtMS4wIjogWwogICAgICAgICJFdXJvcGVhbiBVbmlvbiBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkVVUEwtMS4xIjogWwogICAgICAgICJFdXJvcGVhbiBVbmlvbiBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRVVQTC0xLjIiOiBbCiAgICAgICAgIkV1cm9wZWFuIFVuaW9uIFB1YmxpYyBMaWNlbnNlIDEuMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJFdXJvc3ltIjogWwogICAgICAgICJFdXJvc3ltIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZhaXIiOiBbCiAgICAgICAgIkZhaXIgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGQk0iOiBbCiAgICAgICAgIkZ1enp5IEJpdG1hcCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGREstQUFDIjogWwogICAgICAgICJGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRmVyZ3Vzb24tVHdvZmlzaCI6IFsKICAgICAgICAiRmVyZ3Vzb24gVHdvZmlzaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGcmFtZXdvcngtMS4wIjogWwogICAgICAgICJGcmFtZXdvcnggT3BlbiBMaWNlbnNlIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGcmVlQlNELURPQyI6IFsKICAgICAgICAiRnJlZUJTRCBEb2N1bWVudGF0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZyZWVJbWFnZSI6IFsKICAgICAgICAiRnJlZUltYWdlIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTRkFQIjogWwogICAgICAgICJGU0YgQWxsIFBlcm1pc3NpdmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRlNGQVAtbm8td2FycmFudHktZGlzY2xhaW1lciI6IFsKICAgICAgICAiRlNGIEFsbCBQZXJtaXNzaXZlIExpY2Vuc2UgKHdpdGhvdXQgV2FycmFudHkpIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZVTCI6IFsKICAgICAgICAiRlNGIFVubGltaXRlZCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZVTExSIjogWwogICAgICAgICJGU0YgVW5saW1pdGVkIExpY2Vuc2UgKHdpdGggTGljZW5zZSBSZXRlbnRpb24pIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGU0ZVTExSV0QiOiBbCiAgICAgICAgIkZTRiBVbmxpbWl0ZWQgTGljZW5zZSAoV2l0aCBMaWNlbnNlIFJldGVudGlvbiBhbmQgV2FycmFudHkgRGlzY2xhaW1lcikiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTTC0xLjEtQUx2MiI6IFsKICAgICAgICAiRnVuY3Rpb25hbCBTb3VyY2UgTGljZW5zZSwgVmVyc2lvbiAxLjEsIEFMdjIgRnV0dXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkZTTC0xLjEtTUlUIjogWwogICAgICAgICJGdW5jdGlvbmFsIFNvdXJjZSBMaWNlbnNlLCBWZXJzaW9uIDEuMSwgTUlUIEZ1dHVyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJGVEwiOiBbCiAgICAgICAgIkZyZWV0eXBlIFByb2plY3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiRnVydXNldGgiOiBbCiAgICAgICAgIkZ1cnVzZXRoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImZ3bHciOiBbCiAgICAgICAgImZ3bHcgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2FtZS1Qcm9ncmFtbWluZy1HZW1zIjogWwogICAgICAgICJHYW1lIFByb2dyYW1taW5nIEdlbXMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0NSLWRvY3MiOiBbCiAgICAgICAgIkdub21lIEdDUiBEb2N1bWVudGF0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdEIjogWwogICAgICAgICJHRCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJnZW5lcmljLXh0cyI6IFsKICAgICAgICAiR2VuZXJpYyBYVFMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdGREwtMS4xLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb25seSAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4xLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4xIG9yIGxhdGVyIC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtbm8taW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSBvbmx5IC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjEtbm8taW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb3IgbGF0ZXIgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMS1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMSBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMS1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjEgb3IgbGF0ZXIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHRkRMLTEuMi1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9ubHkgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMi1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMiBvciBsYXRlciAtIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW5vLWludmFyaWFudHMtb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIgb25seSAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4yLW5vLWludmFyaWFudHMtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9yIGxhdGVyIC0gbm8gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjItb25seSI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjIgb25seSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjItb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4yIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMyI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR0ZETC0xLjMtaW52YXJpYW50cy1vbmx5IjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvbmx5IC0gaW52YXJpYW50cyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR0ZETC0xLjMtaW52YXJpYW50cy1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEZyZWUgRG9jdW1lbnRhdGlvbiBMaWNlbnNlIHYxLjMgb3IgbGF0ZXIgLSBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1uby1pbnZhcmlhbnRzLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIG9ubHkgLSBubyBpbnZhcmlhbnRzIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHRkRMLTEuMy1uby1pbnZhcmlhbnRzLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvciBsYXRlciAtIG5vIGludmFyaWFudHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4zLW9ubHkiOiBbCiAgICAgICAgIkdOVSBGcmVlIERvY3VtZW50YXRpb24gTGljZW5zZSB2MS4zIG9ubHkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdGREwtMS4zLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgRnJlZSBEb2N1bWVudGF0aW9uIExpY2Vuc2UgdjEuMyBvciBsYXRlciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR2lmdHdhcmUiOiBbCiAgICAgICAgIkdpZnR3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdMMlBTIjogWwogICAgICAgICJHTDJQUyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHbGlkZSI6IFsKICAgICAgICAiM2RmeCBHbGlkZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHbHVseGUiOiBbCiAgICAgICAgIkdsdWx4ZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHTFdUUEwiOiBbCiAgICAgICAgIkdvb2QgTHVjayBXaXRoIFRoYXQgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImdudXBsb3QiOiBbCiAgICAgICAgImdudXBsb3QgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTEuMCI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0xLjArIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0xLjAtb25seSI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjEuMCBvbmx5IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMS4wLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MS4wIG9yIGxhdGVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMi4wIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wKyI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0yLjAtb25seSI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkdQTC0yLjAtb3ItbGF0ZXIiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTIuMC13aXRoLWF1dG9jb25mLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0F1dG9jb25mIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtYmlzb24tZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIHcvQmlzb24gZXhjZXB0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0yLjAtd2l0aC1jbGFzc3BhdGgtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4wIHcvQ2xhc3NwYXRoIGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtZm9udC1leGNlcHRpb24iOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjAgdy9Gb250IGV4Y2VwdGlvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHUEwtMi4wLXdpdGgtR0NDLWV4Y2VwdGlvbiI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMCB3L0dDQyBSdW50aW1lIExpYnJhcnkgZXhjZXB0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjAiOiBbCiAgICAgICAgIkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjArIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9yIGxhdGVyIiwKICAgICAgICB0cnVlLAogICAgICAgIHRydWUKICAgIF0sCiAgICAiR1BMLTMuMC1vbmx5IjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIG9ubHkiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiR1BMLTMuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJHUEwtMy4wLXdpdGgtYXV0b2NvbmYtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIHcvQXV0b2NvbmYgZXhjZXB0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkdQTC0zLjAtd2l0aC1HQ0MtZXhjZXB0aW9uIjogWwogICAgICAgICJHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2My4wIHcvR0NDIFJ1bnRpbWUgTGlicmFyeSBleGNlcHRpb24iLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJHcmFwaGljcy1HZW1zIjogWwogICAgICAgICJHcmFwaGljcyBHZW1zIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImdTT0FQLTEuM2IiOiBbCiAgICAgICAgImdTT0FQIFB1YmxpYyBMaWNlbnNlIHYxLjNiIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJndGtib29rIjogWwogICAgICAgICJndGtib29rIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkd1dG1hbm4iOiBbCiAgICAgICAgIkd1dG1hbm4gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSGFza2VsbFJlcG9ydCI6IFsKICAgICAgICAiSGFza2VsbCBMYW5ndWFnZSBSZXBvcnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiaGRwYXJtIjogWwogICAgICAgICJoZHBhcm0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSElEQVBJIjogWwogICAgICAgICJISURBUEkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSGlwcG9jcmF0aWMtMi4xIjogWwogICAgICAgICJIaXBwb2NyYXRpYyBMaWNlbnNlIDIuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFAtMTk4NiI6IFsKICAgICAgICAiSGV3bGV0dC1QYWNrYXJkIDE5ODYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFAtMTk4OSI6IFsKICAgICAgICAiSGV3bGV0dC1QYWNrYXJkIDE5ODkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORCI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELURFQyI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIERFQyB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELWRvYyI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIGRvY3VtZW50YXRpb24gdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1kb2Mtc2VsbCI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIGRvY3VtZW50YXRpb24gc2VsbCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELWV4cG9ydC1VUyI6IFsKICAgICAgICAiSFBORCB3aXRoIFVTIEdvdmVybm1lbnQgZXhwb3J0IGNvbnRyb2wgd2FybmluZyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1leHBvcnQtVVMtYWNrbm93bGVkZ2VtZW50IjogWwogICAgICAgICJIUE5EIHdpdGggVVMgR292ZXJubWVudCBleHBvcnQgY29udHJvbCB3YXJuaW5nIGFuZCBhY2tub3dsZWRnbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1leHBvcnQtVVMtbW9kaWZ5IjogWwogICAgICAgICJIUE5EIHdpdGggVVMgR292ZXJubWVudCBleHBvcnQgY29udHJvbCB3YXJuaW5nIGFuZCBtb2RpZmljYXRpb24gcnFtdCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1leHBvcnQyLVVTIjogWwogICAgICAgICJIUE5EIHdpdGggVVMgR292ZXJubWVudCBleHBvcnQgY29udHJvbCBhbmQgMiBkaXNjbGFpbWVycyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1GZW5uZWJlcmctTGl2aW5nc3RvbiI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIEZlbm5lYmVyZy1MaXZpbmdzdG9uIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtSU5SSUEtSU1BRyI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAgICAtIElOUklBLUlNQUcgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1JbnRlbCI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIEludGVsIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtS2V2bGluLUhlbm5leSI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIEtldmxpbiBIZW5uZXkgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1NYXJrdXMtS3VobiI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIE1hcmt1cyBLdWhuIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtbWVyY2hhbnRhYmlsaXR5LXZhcmlhbnQiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBtZXJjaGFudGFiaWxpdHkgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1NSVQtZGlzY2xhaW1lciI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciB3aXRoIE1JVCBkaXNjbGFpbWVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELU5ldHJlayI6IFsKICAgICAgICAiSGlzdG9yaWNhbCBQZXJtaXNzaW9uIE5vdGljZSBhbmQgRGlzY2xhaW1lciAtIE5ldHJlayB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELVBibXBsdXMiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBQYm1wbHVzIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtc2VsbC1NSVQtZGlzY2xhaW1lci14c2VydmVyIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gc2VsbCB4c2VydmVyIHZhcmlhbnQgd2l0aCBNSVQgZGlzY2xhaW1lciIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLXJlZ2V4cHIiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBzZWxsIHJlZ2V4cHIgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFBORC1zZWxsLXZhcmlhbnQiOiBbCiAgICAgICAgIkhpc3RvcmljYWwgUGVybWlzc2lvbiBOb3RpY2UgYW5kIERpc2NsYWltZXIgLSBzZWxsIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtc2VsbC12YXJpYW50LU1JVC1kaXNjbGFpbWVyIjogWwogICAgICAgICJIUE5EIHNlbGwgdmFyaWFudCB3aXRoIE1JVCBkaXNjbGFpbWVyIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELXNlbGwtdmFyaWFudC1NSVQtZGlzY2xhaW1lci1yZXYiOiBbCiAgICAgICAgIkhQTkQgc2VsbCB2YXJpYW50IHdpdGggTUlUIGRpc2NsYWltZXIgLSByZXZlcnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJIUE5ELVVDIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkhQTkQtVUMtZXhwb3J0LVVTIjogWwogICAgICAgICJIaXN0b3JpY2FsIFBlcm1pc3Npb24gTm90aWNlIGFuZCBEaXNjbGFpbWVyIC0gVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLCBVUyBleHBvcnQgd2FybmluZyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSFRNTFRJRFkiOiBbCiAgICAgICAgIkhUTUwgVGlkeSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJQk0tcGlicyI6IFsKICAgICAgICAiSUJNIFBvd2VyUEMgSW5pdGlhbGl6YXRpb24gYW5kIEJvb3QgU29mdHdhcmUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIklDVSI6IFsKICAgICAgICAiSUNVIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUVDLUNvZGUtQ29tcG9uZW50cy1FVUxBIjogWwogICAgICAgICJJRUMgICAgQ29kZSBDb21wb25lbnRzIEVuZC11c2VyIGxpY2VuY2UgYWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJSkciOiBbCiAgICAgICAgIkluZGVwZW5kZW50IEpQRUcgR3JvdXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSUpHLXNob3J0IjogWwogICAgICAgICJJbmRlcGVuZGVudCBKUEVHIEdyb3VwIExpY2Vuc2UgLSBzaG9ydCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW1hZ2VNYWdpY2siOiBbCiAgICAgICAgIkltYWdlTWFnaWNrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImlNYXRpeCI6IFsKICAgICAgICAiaU1hdGl4IFN0YW5kYXJkIEZ1bmN0aW9uIExpYnJhcnkgQWdyZWVtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbWxpYjIiOiBbCiAgICAgICAgIkltbGliMiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJbmZvLVpJUCI6IFsKICAgICAgICAiSW5mby1aSVAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW5uZXItTmV0LTIuMCI6IFsKICAgICAgICAiSW5uZXIgTmV0IExpY2Vuc2UgdjIuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSW5ub1NldHVwIjogWwogICAgICAgICJJbm5vIFNldHVwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkludGVsIjogWwogICAgICAgICJJbnRlbCBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkludGVsLUFDUEkiOiBbCiAgICAgICAgIkludGVsIEFDUEkgU29mdHdhcmUgTGljZW5zZSBBZ3JlZW1lbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkludGVyYmFzZS0xLjAiOiBbCiAgICAgICAgIkludGVyYmFzZSBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJUEEiOiBbCiAgICAgICAgIklQQSBGb250IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVBMLTEuMCI6IFsKICAgICAgICAiSUJNIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiSVNDIjogWwogICAgICAgICJJU0MgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJJU0MtVmVpbGxhcmQiOiBbCiAgICAgICAgIklTQyBWZWlsbGFyZCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKYW0iOiBbCiAgICAgICAgIkphbSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkphc1Blci0yLjAiOiBbCiAgICAgICAgIkphc1BlciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJqb3ZlIjogWwogICAgICAgICJKb3ZlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkpQTC1pbWFnZSI6IFsKICAgICAgICAiSlBMIEltYWdlIFVzZSBQb2xpY3kiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkpQTklDIjogWwogICAgICAgICJKYXBhbiBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJKU09OIjogWwogICAgICAgICJKU09OIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkthc3RydXAiOiBbCiAgICAgICAgIkthc3RydXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiS2F6bGliIjogWwogICAgICAgICJLYXpsaWIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiS251dGgtQ1RBTiI6IFsKICAgICAgICAiS251dGggQ1RBTiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMQUwtMS4yIjogWwogICAgICAgICJMaWNlbmNlIEFydCBMaWJyZSAxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxBTC0xLjMiOiBbCiAgICAgICAgIkxpY2VuY2UgQXJ0IExpYnJlIDEuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGF0ZXgyZSI6IFsKICAgICAgICAiTGF0ZXgyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMYXRleDJlLXRyYW5zbGF0ZWQtbm90aWNlIjogWwogICAgICAgICJMYXRleDJlIHdpdGggdHJhbnNsYXRlZCBub3RpY2UgcGVybWlzc2lvbiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGVwdG9uaWNhIjogWwogICAgICAgICJMZXB0b25pY2EgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTEdQTC0yLjAiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkxHUEwtMi4wKyI6IFsKICAgICAgICAiR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MiBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkxHUEwtMi4wLW9ubHkiOiBbCiAgICAgICAgIkdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTIuMC1vci1sYXRlciI6IFsKICAgICAgICAiR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2MiBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTIuMSI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjEgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkxHUEwtMi4xKyI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYyLjEgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTIuMS1vbmx5IjogWwogICAgICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMSBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUEwtMi4xLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIuMSBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMLTMuMCI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb25seSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIkxHUEwtMy4wKyI6IFsKICAgICAgICAiR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHYzLjAgb3IgbGF0ZXIiLAogICAgICAgIHRydWUsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJMR1BMLTMuMC1vbmx5IjogWwogICAgICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvbmx5IiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxHUEwtMy4wLW9yLWxhdGVyIjogWwogICAgICAgICJHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjMuMCBvciBsYXRlciIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMR1BMTFIiOiBbCiAgICAgICAgIkxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIEZvciBMaW5ndWlzdGljIFJlc291cmNlcyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGlicG5nIjogWwogICAgICAgICJsaWJwbmcgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibGlicG5nLTIuMCI6IFsKICAgICAgICAiUE5HIFJlZmVyZW5jZSBMaWJyYXJ5IHZlcnNpb24gMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibGlic2VsaW51eC0xLjAiOiBbCiAgICAgICAgImxpYnNlbGludXggcHVibGljIGRvbWFpbiBub3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxpYnRpZmYiOiBbCiAgICAgICAgImxpYnRpZmYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibGlidXRpbC1EYXZpZC1OdWdlbnQiOiBbCiAgICAgICAgImxpYnV0aWwgRGF2aWQgTnVnZW50IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpTGlRLVAtMS4xIjogWwogICAgICAgICJMaWNlbmNlIExpYnJlIGR1IFF1XHUwMGU5YmVjIFx1MjAxMyBQZXJtaXNzaXZlIHZlcnNpb24gMS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpTGlRLVItMS4xIjogWwogICAgICAgICJMaWNlbmNlIExpYnJlIGR1IFF1XHUwMGU5YmVjIFx1MjAxMyBSXHUwMGU5Y2lwcm9jaXRcdTAwZTkgdmVyc2lvbiAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGlMaVEtUnBsdXMtMS4xIjogWwogICAgICAgICJMaWNlbmNlIExpYnJlIGR1IFF1XHUwMGU5YmVjIFx1MjAxMyBSXHUwMGU5Y2lwcm9jaXRcdTAwZTkgZm9ydGUgdmVyc2lvbiAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTGludXgtbWFuLXBhZ2VzLTEtcGFyYSI6IFsKICAgICAgICAiTGludXggbWFuLXBhZ2VzIC0gMSBwYXJhZ3JhcGgiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpbnV4LW1hbi1wYWdlcy1jb3B5bGVmdCI6IFsKICAgICAgICAiTGludXggbWFuLXBhZ2VzIENvcHlsZWZ0IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1tYW4tcGFnZXMtY29weWxlZnQtMi1wYXJhIjogWwogICAgICAgICJMaW51eCBtYW4tcGFnZXMgQ29weWxlZnQgLSAyIHBhcmFncmFwaHMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxpbnV4LW1hbi1wYWdlcy1jb3B5bGVmdC12YXIiOiBbCiAgICAgICAgIkxpbnV4IG1hbi1wYWdlcyBDb3B5bGVmdCBWYXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMaW51eC1PcGVuSUIiOiBbCiAgICAgICAgIkxpbnV4IEtlcm5lbCBWYXJpYW50IG9mIE9wZW5JQi5vcmcgbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTE9PUCI6IFsKICAgICAgICAiQ29tbW9uIExpc3AgTE9PUCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUEQtZG9jdW1lbnQiOiBbCiAgICAgICAgIkxQRCBEb2N1bWVudGF0aW9uIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQTC0xLjAiOiBbCiAgICAgICAgIkx1Y2VudCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMUEwtMS4wMiI6IFsKICAgICAgICAiTHVjZW50IFB1YmxpYyBMaWNlbnNlIHYxLjAyIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQUEwtMS4wIjogWwogICAgICAgICJMYVRlWCBQcm9qZWN0IFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQUEwtMS4xIjogWwogICAgICAgICJMYVRlWCBQcm9qZWN0IFB1YmxpYyBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQUEwtMS4yIjogWwogICAgICAgICJMYVRlWCBQcm9qZWN0IFB1YmxpYyBMaWNlbnNlIHYxLjIiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxQUEwtMS4zYSI6IFsKICAgICAgICAiTGFUZVggUHJvamVjdCBQdWJsaWMgTGljZW5zZSB2MS4zYSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTFBQTC0xLjNjIjogWwogICAgICAgICJMYVRlWCBQcm9qZWN0IFB1YmxpYyBMaWNlbnNlIHYxLjNjIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgImxzb2YiOiBbCiAgICAgICAgImxzb2YgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTHVjaWRhLUJpdG1hcC1Gb250cyI6IFsKICAgICAgICAiTHVjaWRhIEJpdG1hcCBGb250cyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJMWk1BLVNESy05LjExLXRvLTkuMjAiOiBbCiAgICAgICAgIkxaTUEgU0RLIExpY2Vuc2UgKHZlcnNpb25zIDkuMTEgdG8gOS4yMCkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIkxaTUEtU0RLLTkuMjIiOiBbCiAgICAgICAgIkxaTUEgU0RLIExpY2Vuc2UgKHZlcnNpb25zIDkuMjIgYW5kIGJleW9uZCkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1hY2tlcnJhcy0zLUNsYXVzZSI6IFsKICAgICAgICAiTWFja2VycmFzIDMtQ2xhdXNlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1hY2tlcnJhcy0zLUNsYXVzZS1hY2tub3dsZWRnbWVudCI6IFsKICAgICAgICAiTWFja2VycmFzIDMtQ2xhdXNlIC0gYWNrbm93bGVkZ21lbnQgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibWFnYXoiOiBbCiAgICAgICAgIm1hZ2F6IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1haWxwcmlvIjogWwogICAgICAgICJtYWlscHJpbyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNYWtlSW5kZXgiOiBbCiAgICAgICAgIk1ha2VJbmRleCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtYW4yaHRtbCI6IFsKICAgICAgICAibWFuMmh0bWwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWFydGluLUJpcmdtZWllciI6IFsKICAgICAgICAiTWFydGluIEJpcmdtZWllciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNY1BoZWUtc2xpZGVzaG93IjogWwogICAgICAgICJNY1BoZWUgU2xpZGVzaG93IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1ldGFtYWlsIjogWwogICAgICAgICJtZXRhbWFpbCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNaW5wYWNrIjogWwogICAgICAgICJNaW5wYWNrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JUFMiOiBbCiAgICAgICAgIk1JUFMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTWlyT1MiOiBbCiAgICAgICAgIlRoZSBNaXJPUyBMaWNlbmNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVCI6IFsKICAgICAgICAiTUlUIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULTAiOiBbCiAgICAgICAgIk1JVCBObyBBdHRyaWJ1dGlvbiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtYWR2ZXJ0aXNpbmciOiBbCiAgICAgICAgIkVubGlnaHRlbm1lbnQgTGljZW5zZSAoZTE2KSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUNsaWNrIjogWwogICAgICAgICJNSVQgQ2xpY2sgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULUNNVSI6IFsKICAgICAgICAiQ01VIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1lbm5hIjogWwogICAgICAgICJlbm5hIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1mZWgiOiBbCiAgICAgICAgImZlaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtRmVzdGl2YWwiOiBbCiAgICAgICAgIk1JVCBGZXN0aXZhbCBWYXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNSVQtS2hyb25vcy1vbGQiOiBbCiAgICAgICAgIk1JVCBLaHJvbm9zIC0gb2xkIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC1Nb2Rlcm4tVmFyaWFudCI6IFsKICAgICAgICAiTUlUIExpY2Vuc2UgTW9kZXJuIFZhcmlhbnQiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULW9wZW4tZ3JvdXAiOiBbCiAgICAgICAgIk1JVCBPcGVuIEdyb3VwIHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVC10ZXN0cmVnZXgiOiBbCiAgICAgICAgIk1JVCB0ZXN0cmVnZXggVmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTUlULVd1IjogWwogICAgICAgICJNSVQgVG9tIFd1IFZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1JVE5GQSI6IFsKICAgICAgICAiTUlUICtuby1mYWxzZS1hdHRyaWJzIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1NSVh3YXJlIjogWwogICAgICAgICJNTUlYd2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNb3Rvc290byI6IFsKICAgICAgICAiTW90b3NvdG8gTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNUEVHLVNTRyI6IFsKICAgICAgICAiTVBFRyBTb2Z0d2FyZSBTaW11bGF0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJtcGktcGVybWlzc2l2ZSI6IFsKICAgICAgICAibXBpIFBlcm1pc3NpdmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAibXBpY2gyIjogWwogICAgICAgICJtcGljaDIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVBMLTEuMCI6IFsKICAgICAgICAiTW96aWxsYSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVBMLTEuMSI6IFsKICAgICAgICAiTW96aWxsYSBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVBMLTIuMCI6IFsKICAgICAgICAiTW96aWxsYSBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVBMLTIuMC1uby1jb3B5bGVmdC1leGNlcHRpb24iOiBbCiAgICAgICAgIk1vemlsbGEgUHVibGljIExpY2Vuc2UgMi4wIChubyBjb3B5bGVmdCBleGNlcHRpb24pIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIm1wbHVzIjogWwogICAgICAgICJtcGx1cyBGb250IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1TLUxQTCI6IFsKICAgICAgICAiTWljcm9zb2Z0IExpbWl0ZWQgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk1TLVBMIjogWwogICAgICAgICJNaWNyb3NvZnQgUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVMtUkwiOiBbCiAgICAgICAgIk1pY3Jvc29mdCBSZWNpcHJvY2FsIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTVRMTCI6IFsKICAgICAgICAiTWF0cml4IFRlbXBsYXRlIExpYnJhcnkgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTXVsYW5QU0wtMS4wIjogWwogICAgICAgICJNdWxhbiBQZXJtaXNzaXZlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTXVsYW5QU0wtMi4wIjogWwogICAgICAgICJNdWxhbiBQZXJtaXNzaXZlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMiIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJNdWx0aWNzIjogWwogICAgICAgICJNdWx0aWNzIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTXVwIjogWwogICAgICAgICJNdXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkFJU1QtMjAwMyI6IFsKICAgICAgICAiTmFyYSBJbnN0aXR1dGUgb2YgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBMaWNlbnNlICgyMDAzKSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkFTQS0xLjMiOiBbCiAgICAgICAgIk5BU0EgT3BlbiBTb3VyY2UgQWdyZWVtZW50IDEuMyIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOYXVtZW4iOiBbCiAgICAgICAgIk5hdW1lbiBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOQlBMLTEuMCI6IFsKICAgICAgICAiTmV0IEJvb2xlYW4gUHVibGljIExpY2Vuc2UgdjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5DQkktUEQiOiBbCiAgICAgICAgIk5DQkkgUHVibGljIERvbWFpbiBOb3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5DR0wtVUstMi4wIjogWwogICAgICAgICJOb24tQ29tbWVyY2lhbCBHb3Zlcm5tZW50IExpY2VuY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5DTCI6IFsKICAgICAgICAiTkNMIFNvdXJjZSBDb2RlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5DU0EiOiBbCiAgICAgICAgIlVuaXZlcnNpdHkgb2YgSWxsaW5vaXMvTkNTQSBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5ldC1TTk1QIjogWwogICAgICAgICJOZXQtU05NUCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIk5ldENERiI6IFsKICAgICAgICAiTmV0Q0RGIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5ld3NsZXRyIjogWwogICAgICAgICJOZXdzbGV0ciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOR1BMIjogWwogICAgICAgICJOZXRoYWNrIEdlbmVyYWwgUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTklDVEEtMS4wIjogWwogICAgICAgICJOSUNUQSBQdWJsaWMgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5JU1QtUEQiOiBbCiAgICAgICAgIk5JU1QgUHVibGljIERvbWFpbiBOb3RpY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5JU1QtUEQtZmFsbGJhY2siOiBbCiAgICAgICAgIk5JU1QgUHVibGljIERvbWFpbiBOb3RpY2Ugd2l0aCBsaWNlbnNlIGZhbGxiYWNrIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOSVNULVNvZnR3YXJlIjogWwogICAgICAgICJOSVNUIFNvZnR3YXJlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk5MT0QtMS4wIjogWwogICAgICAgICJOb3J3ZWdpYW4gTGljZW5jZSBmb3IgT3BlbiBHb3Zlcm5tZW50IERhdGEgKE5MT0QpIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTkxPRC0yLjAiOiBbCiAgICAgICAgIk5vcndlZ2lhbiBMaWNlbmNlIGZvciBPcGVuIEdvdmVybm1lbnQgRGF0YSAoTkxPRCkgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOTFBMIjogWwogICAgICAgICJObyBMaW1pdCBQdWJsaWMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTm9raWEiOiBbCiAgICAgICAgIk5va2lhIE9wZW4gU291cmNlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTk9TTCI6IFsKICAgICAgICAiTmV0aXplbiBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOb3dlYiI6IFsKICAgICAgICAiTm93ZWIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBMLTEuMCI6IFsKICAgICAgICAiTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBMLTEuMSI6IFsKICAgICAgICAiTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlBPU0wtMy4wIjogWwogICAgICAgICJOb24tUHJvZml0IE9wZW4gU29mdHdhcmUgTGljZW5zZSAzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlJMIjogWwogICAgICAgICJOUkwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlRJQS1QRCI6IFsKICAgICAgICAiTlRJQSBQdWJsaWMgRG9tYWluIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiTlRQIjogWwogICAgICAgICJOVFAgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOVFAtMCI6IFsKICAgICAgICAiTlRQIE5vIEF0dHJpYnV0aW9uIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJOdW5pdCI6IFsKICAgICAgICAiTnVuaXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgdHJ1ZQogICAgXSwKICAgICJPLVVEQS0xLjAiOiBbCiAgICAgICAgIk9wZW4gVXNlIG9mIERhdGEgQWdyZWVtZW50IHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9BUiI6IFsKICAgICAgICAiT0FSIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9DQ1QtUEwiOiBbCiAgICAgICAgIk9wZW4gQ0FTQ0FERSBUZWNobm9sb2d5IFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPQ0xDLTIuMCI6IFsKICAgICAgICAiT0NMQyBSZXNlYXJjaCBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0RiTC0xLjAiOiBbCiAgICAgICAgIk9wZW4gRGF0YSBDb21tb25zIE9wZW4gRGF0YWJhc2UgTGljZW5zZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPREMtQnktMS4wIjogWwogICAgICAgICJPcGVuIERhdGEgQ29tbW9ucyBBdHRyaWJ1dGlvbiBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GRklTIjogWwogICAgICAgICJPRkZJUyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4wIjogWwogICAgICAgICJTSUwgT3BlbiBGb250IExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPRkwtMS4wLW5vLVJGTiI6IFsKICAgICAgICAiU0lMIE9wZW4gRm9udCBMaWNlbnNlIDEuMCB3aXRoIG5vIFJlc2VydmVkIEZvbnQgTmFtZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMC1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjAgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9GTC0xLjEiOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMS1uby1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEgd2l0aCBubyBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0ZMLTEuMS1SRk4iOiBbCiAgICAgICAgIlNJTCBPcGVuIEZvbnQgTGljZW5zZSAxLjEgd2l0aCBSZXNlcnZlZCBGb250IE5hbWUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dDLTEuMCI6IFsKICAgICAgICAiT0dDIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0RMLVRhaXdhbi0xLjAiOiBbCiAgICAgICAgIlRhaXdhbiBPcGVuIEdvdmVybm1lbnQgRGF0YSBMaWNlbnNlLCB2ZXJzaW9uIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0dMLUNhbmFkYS0yLjAiOiBbCiAgICAgICAgIk9wZW4gR292ZXJubWVudCBMaWNlbmNlIC0gQ2FuYWRhIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtVUstMS4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSB2MS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtVUstMi4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSB2Mi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR0wtVUstMy4wIjogWwogICAgICAgICJPcGVuIEdvdmVybm1lbnQgTGljZW5jZSB2My4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPR1RTTCI6IFsKICAgICAgICAiT3BlbiBHcm91cCBUZXN0IFN1aXRlIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS4xIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS4yIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS4zIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMS40IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjEuNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4wIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMCAob3IgcG9zc2libHkgMi4wQSBhbmQgMi4wQikiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9MREFQLTIuMC4xIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMC4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjEiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjIiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSB2Mi4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTERBUC0yLjIuMSI6IFsKICAgICAgICAiT3BlbiBMREFQIFB1YmxpYyBMaWNlbnNlIHYyLjIuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4yLjIiOiBbCiAgICAgICAgIk9wZW4gTERBUCBQdWJsaWMgTGljZW5zZSAyLjIuMiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi4zIjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi40IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi41IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi42IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi43IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuNyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT0xEQVAtMi44IjogWwogICAgICAgICJPcGVuIExEQVAgUHVibGljIExpY2Vuc2UgdjIuOCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPTEZMLTEuMyI6IFsKICAgICAgICAiT3BlbiBMb2dpc3RpY3MgRm91bmRhdGlvbiBMaWNlbnNlIFZlcnNpb24gMS4zIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9NTCI6IFsKICAgICAgICAiT3BlbiBNYXJrZXQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3BlblBCUy0yLjMiOiBbCiAgICAgICAgIk9wZW5QQlMgdjIuMyBTb2Z0d2FyZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPcGVuU1NMIjogWwogICAgICAgICJPcGVuU1NMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9wZW5TU0wtc3RhbmRhbG9uZSI6IFsKICAgICAgICAiT3BlblNTTCBMaWNlbnNlIC0gc3RhbmRhbG9uZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT3BlblZpc2lvbiI6IFsKICAgICAgICAiT3BlblZpc2lvbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPUEwtMS4wIjogWwogICAgICAgICJPcGVuIFB1YmxpYyBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9QTC1VSy0zLjAiOiBbCiAgICAgICAgIlVuaXRlZCAgICBLaW5nZG9tIE9wZW4gUGFybGlhbWVudCBMaWNlbmNlIHYzLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9QVUJMLTEuMCI6IFsKICAgICAgICAiT3BlbiBQdWJsaWNhdGlvbiBMaWNlbnNlIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TRVQtUEwtMi4xIjogWwogICAgICAgICJPU0VUIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0xLjAiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1NMLTEuMSI6IFsKICAgICAgICAiT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiT1NMLTIuMCI6IFsKICAgICAgICAiT3BlbiBTb2Z0d2FyZSBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJPU0wtMi4xIjogWwogICAgICAgICJPcGVuIFNvZnR3YXJlIExpY2Vuc2UgMi4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIk9TTC0zLjAiOiBbCiAgICAgICAgIk9wZW4gU29mdHdhcmUgTGljZW5zZSAzLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUEFETCI6IFsKICAgICAgICAiUEFETCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQYXJpdHktNi4wLjAiOiBbCiAgICAgICAgIlRoZSBQYXJpdHkgUHVibGljIExpY2Vuc2UgNi4wLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBhcml0eS03LjAuMCI6IFsKICAgICAgICAiVGhlIFBhcml0eSBQdWJsaWMgTGljZW5zZSA3LjAuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUERETC0xLjAiOiBbCiAgICAgICAgIk9wZW4gRGF0YSBDb21tb25zIFB1YmxpYyBEb21haW4gRGVkaWNhdGlvbiAmIExpY2Vuc2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQSFAtMy4wIjogWwogICAgICAgICJQSFAgTGljZW5zZSB2My4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBIUC0zLjAxIjogWwogICAgICAgICJQSFAgTGljZW5zZSB2My4wMSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQaXhhciI6IFsKICAgICAgICAiUGl4YXIgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAicGtnY29uZiI6IFsKICAgICAgICAicGtnY29uZiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQbGV4dXMiOiBbCiAgICAgICAgIlBsZXh1cyBDbGFzc3dvcmxkcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJwbm1zdGl0Y2giOiBbCiAgICAgICAgInBubXN0aXRjaCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQb2x5Rm9ybS1Ob25jb21tZXJjaWFsLTEuMC4wIjogWwogICAgICAgICJQb2x5Rm9ybSBOb25jb21tZXJjaWFsIExpY2Vuc2UgMS4wLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlBvbHlGb3JtLVNtYWxsLUJ1c2luZXNzLTEuMC4wIjogWwogICAgICAgICJQb2x5Rm9ybSBTbWFsbCBCdXNpbmVzcyBMaWNlbnNlIDEuMC4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJQb3N0Z3JlU1FMIjogWwogICAgICAgICJQb3N0Z3JlU1FMIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUFBMIjogWwogICAgICAgICJQZWVyIFByb2R1Y3Rpb24gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUFNGLTIuMCI6IFsKICAgICAgICAiUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24gTGljZW5zZSAyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInBzZnJhZyI6IFsKICAgICAgICAicHNmcmFnIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInBzdXRpbHMiOiBbCiAgICAgICAgInBzdXRpbHMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUHl0aG9uLTIuMCI6IFsKICAgICAgICAiUHl0aG9uIExpY2Vuc2UgMi4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlB5dGhvbi0yLjAuMSI6IFsKICAgICAgICAiUHl0aG9uIExpY2Vuc2UgMi4wLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInB5dGhvbi1sZGFwIjogWwogICAgICAgICJQeXRob24gbGRhcCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJRaHVsbCI6IFsKICAgICAgICAiUWh1bGwgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUVBMLTEuMCI6IFsKICAgICAgICAiUSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUVBMLTEuMC1JTlJJQS0yMDA0IjogWwogICAgICAgICJRIFB1YmxpYyBMaWNlbnNlIDEuMCAtIElOUklBIDIwMDQgdmFyaWFudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAicmFkdmQiOiBbCiAgICAgICAgInJhZHZkIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlJkaXNjIjogWwogICAgICAgICJSZGlzYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSSGVDb3MtMS4xIjogWwogICAgICAgICJSZWQgSGF0IGVDb3MgUHVibGljIExpY2Vuc2UgdjEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlBMLTEuMSI6IFsKICAgICAgICAiUmVjaXByb2NhbCBQdWJsaWMgTGljZW5zZSAxLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlBMLTEuNSI6IFsKICAgICAgICAiUmVjaXByb2NhbCBQdWJsaWMgTGljZW5zZSAxLjUiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUlBTTC0xLjAiOiBbCiAgICAgICAgIlJlYWxOZXR3b3JrcyBQdWJsaWMgU291cmNlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSU0EtTUQiOiBbCiAgICAgICAgIlJTQSBNZXNzYWdlLURpZ2VzdCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSU0NQTCI6IFsKICAgICAgICAiUmljb2ggU291cmNlIENvZGUgUHVibGljIExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiUnVieSI6IFsKICAgICAgICAiUnVieSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJSdWJ5LXB0eSI6IFsKICAgICAgICAiUnVieSBwdHkgZXh0ZW5zaW9uIGxpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNBWC1QRCI6IFsKICAgICAgICAiU2F4IFB1YmxpYyBEb21haW4gTm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTQVgtUEQtMi4wIjogWwogICAgICAgICJTYXggUHVibGljIERvbWFpbiBOb3RpY2UgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTYXhwYXRoIjogWwogICAgICAgICJTYXhwYXRoIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNDRUEiOiBbCiAgICAgICAgIlNDRUEgU2hhcmVkIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTY2hlbWVSZXBvcnQiOiBbCiAgICAgICAgIlNjaGVtZSBMYW5ndWFnZSBSZXBvcnQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2VuZG1haWwiOiBbCiAgICAgICAgIlNlbmRtYWlsIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNlbmRtYWlsLTguMjMiOiBbCiAgICAgICAgIlNlbmRtYWlsIExpY2Vuc2UgOC4yMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2VuZG1haWwtT3Blbi1Tb3VyY2UtMS4xIjogWwogICAgICAgICJTZW5kbWFpbCBPcGVuIFNvdXJjZSBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1CLTEuMCI6IFsKICAgICAgICAiU0dJIEZyZWUgU29mdHdhcmUgTGljZW5zZSBCIHYxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1CLTEuMSI6IFsKICAgICAgICAiU0dJIEZyZWUgU29mdHdhcmUgTGljZW5zZSBCIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1CLTIuMCI6IFsKICAgICAgICAiU0dJIEZyZWUgU29mdHdhcmUgTGljZW5zZSBCIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNHSS1PcGVuR0wiOiBbCiAgICAgICAgIlNHSSBPcGVuR0wgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0dQNCI6IFsKICAgICAgICAiU0dQNCBQZXJtaXNzaW9uIE5vdGljZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0hMLTAuNSI6IFsKICAgICAgICAiU29sZGVycGFkIEhhcmR3YXJlIExpY2Vuc2UgdjAuNSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU0hMLTAuNTEiOiBbCiAgICAgICAgIlNvbGRlcnBhZCBIYXJkd2FyZSBMaWNlbnNlLCBWZXJzaW9uIDAuNTEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNpbVBMLTIuMCI6IFsKICAgICAgICAiU2ltcGxlIFB1YmxpYyBMaWNlbnNlIDIuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTSVNTTCI6IFsKICAgICAgICAiU3VuIEluZHVzdHJ5IFN0YW5kYXJkcyBTb3VyY2UgTGljZW5zZSB2MS4xIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNJU1NMLTEuMiI6IFsKICAgICAgICAiU3VuIEluZHVzdHJ5IFN0YW5kYXJkcyBTb3VyY2UgTGljZW5zZSB2MS4yIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTTCI6IFsKICAgICAgICAiU0wgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU2xlZXB5Y2F0IjogWwogICAgICAgICJTbGVlcHljYXQgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTTUFJTC1HUEwiOiBbCiAgICAgICAgIlNNQUlMIEdlbmVyYWwgUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNNTE5KIjogWwogICAgICAgICJTdGFuZGFyZCBNTCBvZiBOZXcgSmVyc2V5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNNUFBMIjogWwogICAgICAgICJTZWN1cmUgTWVzc2FnaW5nIFByb3RvY29sIFB1YmxpYyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTTklBIjogWwogICAgICAgICJTTklBIFB1YmxpYyBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAic25wcmludGYiOiBbCiAgICAgICAgInNucHJpbnRmIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNPRkEiOiBbCiAgICAgICAgIlNPRkEgU29mdHdhcmUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAic29mdFN1cmZlciI6IFsKICAgICAgICAic29mdFN1cmZlciBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTb3VuZGV4IjogWwogICAgICAgICJTb3VuZGV4IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNwZW5jZXItODYiOiBbCiAgICAgICAgIlNwZW5jZXIgTGljZW5zZSA4NiIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3BlbmNlci05NCI6IFsKICAgICAgICAiU3BlbmNlciBMaWNlbnNlIDk0IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTcGVuY2VyLTk5IjogWwogICAgICAgICJTcGVuY2VyIExpY2Vuc2UgOTkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlNQTC0xLjAiOiBbCiAgICAgICAgIlN1biBQdWJsaWMgTGljZW5zZSB2MS4wIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInNzaC1rZXlzY2FuIjogWwogICAgICAgICJzc2gta2V5c2NhbiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTU0gtT3BlblNTSCI6IFsKICAgICAgICAiU1NIIE9wZW5TU0ggbGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU1NILXNob3J0IjogWwogICAgICAgICJTU0ggc2hvcnQgbm90aWNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTU0xlYXktc3RhbmRhbG9uZSI6IFsKICAgICAgICAiU1NMZWF5IExpY2Vuc2UgLSBzdGFuZGFsb25lIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTU1BMLTEuMCI6IFsKICAgICAgICAiU2VydmVyIFNpZGUgUHVibGljIExpY2Vuc2UsIHYgMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3RhbmRhcmRNTC1OSiI6IFsKICAgICAgICAiU3RhbmRhcmQgTUwgb2YgTmV3IEplcnNleSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIlN1Z2FyQ1JNLTEuMS4zIjogWwogICAgICAgICJTdWdhckNSTSBQdWJsaWMgTGljZW5zZSB2MS4xLjMiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlN1bi1QUFAiOiBbCiAgICAgICAgIlN1biBQUFAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3VuLVBQUC0yMDAwIjogWwogICAgICAgICJTdW4gUFBQIExpY2Vuc2UgKDIwMDApIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTdW5Qcm8iOiBbCiAgICAgICAgIlN1blBybyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJTV0wiOiBbCiAgICAgICAgIlNjaGVtZSBXaWRnZXQgTGlicmFyeSAoU1dMKSBTb2Z0d2FyZSBMaWNlbnNlIEFncmVlbWVudCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAic3dydWxlIjogWwogICAgICAgICJzd3J1bGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiU3ltbGlua3MiOiBbCiAgICAgICAgIlN5bWxpbmtzIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRBUFItT0hMLTEuMCI6IFsKICAgICAgICAiVEFQUiBPcGVuIEhhcmR3YXJlIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVENMIjogWwogICAgICAgICJUQ0wvVEsgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVENQLXdyYXBwZXJzIjogWwogICAgICAgICJUQ1AgV3JhcHBlcnMgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVGVybVJlYWRLZXkiOiBbCiAgICAgICAgIlRlcm1SZWFkS2V5IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRHUFBMLTEuMCI6IFsKICAgICAgICAiVHJhbnNpdGl2ZSBHcmFjZSBQZXJpb2QgUHVibGljIExpY2VuY2UgMS4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUaGlyZEV5ZSI6IFsKICAgICAgICAiVGhpcmRFeWUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAidGhyZWVwYXJ0dGFibGUiOiBbCiAgICAgICAgInRocmVlcGFydHRhYmxlIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRNYXRlIjogWwogICAgICAgICJUTWF0ZSBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUT1JRVUUtMS4xIjogWwogICAgICAgICJUT1JRVUUgdjIuNSsgU29mdHdhcmUgTGljZW5zZSB2MS4xIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUT1NMIjogWwogICAgICAgICJUcnVzc3RlciBPcGVuIFNvdXJjZSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJUUERMIjogWwogICAgICAgICJUaW1lOjpQYXJzZURhdGUgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFBMLTEuMCI6IFsKICAgICAgICAiVEhPUiBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRydXN0ZWRRU0wiOiBbCiAgICAgICAgIlRydXN0ZWRRU0wgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFRXTCI6IFsKICAgICAgICAiVGV4dC1UYWJzK1dyYXAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFRZUDAiOiBbCiAgICAgICAgIlRUWVAwIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlRVLUJlcmxpbi0xLjAiOiBbCiAgICAgICAgIlRlY2huaXNjaGUgVW5pdmVyc2l0YWV0IEJlcmxpbiBMaWNlbnNlIDEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVFUtQmVybGluLTIuMCI6IFsKICAgICAgICAiVGVjaG5pc2NoZSBVbml2ZXJzaXRhZXQgQmVybGluIExpY2Vuc2UgMi4wIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVYnVudHUtZm9udC0xLjAiOiBbCiAgICAgICAgIlVidW50dSBGb250IExpY2VuY2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVUNBUiI6IFsKICAgICAgICAiVUNBUiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVQ0wtMS4wIjogWwogICAgICAgICJVcHN0cmVhbSBDb21wYXRpYmlsaXR5IExpY2Vuc2UgdjEuMCIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJ1bGVtIjogWwogICAgICAgICJ1bGVtIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVNaWNoLU1lcml0IjogWwogICAgICAgICJNaWNoaWdhbi9NZXJpdCBOZXR3b3JrcyBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmljb2RlLTMuMCI6IFsKICAgICAgICAiVW5pY29kZSBMaWNlbnNlIHYzIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaWNvZGUtREZTLTIwMTUiOiBbCiAgICAgICAgIlVuaWNvZGUgTGljZW5zZSBBZ3JlZW1lbnQgLSBEYXRhIEZpbGVzIGFuZCBTb2Z0d2FyZSAoMjAxNSkiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVuaWNvZGUtREZTLTIwMTYiOiBbCiAgICAgICAgIlVuaWNvZGUgTGljZW5zZSBBZ3JlZW1lbnQgLSBEYXRhIEZpbGVzIGFuZCBTb2Z0d2FyZSAoMjAxNikiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5pY29kZS1UT1UiOiBbCiAgICAgICAgIlVuaWNvZGUgVGVybXMgb2YgVXNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbml4Q3J5cHQiOiBbCiAgICAgICAgIlVuaXhDcnlwdCBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVbmxpY2Vuc2UiOiBbCiAgICAgICAgIlRoZSBVbmxpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVW5saWNlbnNlLWxpYnRlbG5ldCI6IFsKICAgICAgICAiVW5saWNlbnNlIC0gbGlidGVsbmV0IHZhcmlhbnQiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlVubGljZW5zZS1saWJ3aGlybHBvb2wiOiBbCiAgICAgICAgIlVubGljZW5zZSAtIGxpYndoaXJscG9vbCB2YXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJVUEwtMS4wIjogWwogICAgICAgICJVbml2ZXJzYWwgUGVybWlzc2l2ZSBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVVJULVJMRSI6IFsKICAgICAgICAiVXRhaCBSYXN0ZXIgVG9vbGtpdCBSdW4gTGVuZ3RoIEVuY29kZWQgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVmltIjogWwogICAgICAgICJWaW0gTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVk9TVFJPTSI6IFsKICAgICAgICAiVk9TVFJPTSBQdWJsaWMgTGljZW5zZSBmb3IgT3BlbiBTb3VyY2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlZTTC0xLjAiOiBbCiAgICAgICAgIlZvdmlkYSBTb2Z0d2FyZSBMaWNlbnNlIHYxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiVzNDIjogWwogICAgICAgICJXM0MgU29mdHdhcmUgTm90aWNlIGFuZCBMaWNlbnNlICgyMDAyLTEyLTMxKSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXM0MtMTk5ODA3MjAiOiBbCiAgICAgICAgIlczQyBTb2Z0d2FyZSBOb3RpY2UgYW5kIExpY2Vuc2UgKDE5OTgtMDctMjApIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJXM0MtMjAxNTA1MTMiOiBbCiAgICAgICAgIlczQyBTb2Z0d2FyZSBOb3RpY2UgYW5kIERvY3VtZW50IExpY2Vuc2UgKDIwMTUtMDUtMTMpIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInczbSI6IFsKICAgICAgICAidzNtIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIldhdGNvbS0xLjAiOiBbCiAgICAgICAgIlN5YmFzZSBPcGVuIFdhdGNvbSBQdWJsaWMgTGljZW5zZSAxLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV2lkZ2V0LVdvcmtzaG9wIjogWwogICAgICAgICJXaWRnZXQgV29ya3Nob3AgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV3N1aXBhIjogWwogICAgICAgICJXc3VpcGEgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiV1RGUEwiOiBbCiAgICAgICAgIkRvIFdoYXQgVGhlIEYqY2sgWW91IFdhbnQgVG8gUHVibGljIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInd3bCI6IFsKICAgICAgICAiV1dMIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInd4V2luZG93cyI6IFsKICAgICAgICAid3hXaW5kb3dzIExpYnJhcnkgTGljZW5zZSIsCiAgICAgICAgdHJ1ZSwKICAgICAgICB0cnVlCiAgICBdLAogICAgIlgxMSI6IFsKICAgICAgICAiWDExIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlgxMS1kaXN0cmlidXRlLW1vZGlmaWNhdGlvbnMtdmFyaWFudCI6IFsKICAgICAgICAiWDExIExpY2Vuc2UgRGlzdHJpYnV0aW9uIE1vZGlmaWNhdGlvbiBWYXJpYW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJYMTEtc3dhcHBlZCI6IFsKICAgICAgICAiWDExIHN3YXBwZWQgZmluYWwgcGFyYWdyYXBocyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWGRlYnVnLTEuMDMiOiBbCiAgICAgICAgIlhkZWJ1ZyBMaWNlbnNlIHYgMS4wMyIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWGVyb3giOiBbCiAgICAgICAgIlhlcm94IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhmaWciOiBbCiAgICAgICAgIlhmaWcgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWEZyZWU4Ni0xLjEiOiBbCiAgICAgICAgIlhGcmVlODYgTGljZW5zZSAxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInhpbmV0ZCI6IFsKICAgICAgICAieGluZXRkIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInhrZXlib2FyZC1jb25maWctWmlub3ZpZXYiOiBbCiAgICAgICAgInhrZXlib2FyZC1jb25maWcgWmlub3ZpZXYgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAieGxvY2siOiBbCiAgICAgICAgInhsb2NrIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlhuZXQiOiBbCiAgICAgICAgIlguTmV0IExpY2Vuc2UiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAieHBwIjogWwogICAgICAgICJYUFAgTGljZW5zZSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWFNrYXQiOiBbCiAgICAgICAgIlhTa2F0IExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInh6b29tIjogWwogICAgICAgICJ4em9vbSBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJZUEwtMS4wIjogWwogICAgICAgICJZYWhvbyEgUHVibGljIExpY2Vuc2UgdjEuMCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWVBMLTEuMSI6IFsKICAgICAgICAiWWFob28hIFB1YmxpYyBMaWNlbnNlIHYxLjEiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlplZCI6IFsKICAgICAgICAiWmVkIExpY2Vuc2UiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlplZWZmIjogWwogICAgICAgICJaZWVmZiBMaWNlbnNlIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaZW5kLTIuMCI6IFsKICAgICAgICAiWmVuZCBMaWNlbnNlIHYyLjAiLAogICAgICAgIGZhbHNlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgIlppbWJyYS0xLjMiOiBbCiAgICAgICAgIlppbWJyYSBQdWJsaWMgTGljZW5zZSB2MS4zIiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaaW1icmEtMS40IjogWwogICAgICAgICJaaW1icmEgUHVibGljIExpY2Vuc2UgdjEuNCIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWmxpYiI6IFsKICAgICAgICAiemxpYiBMaWNlbnNlIiwKICAgICAgICB0cnVlLAogICAgICAgIGZhbHNlCiAgICBdLAogICAgInpsaWItYWNrbm93bGVkZ2VtZW50IjogWwogICAgICAgICJ6bGliL2xpYnBuZyBMaWNlbnNlIHdpdGggQWNrbm93bGVkZ2VtZW50IiwKICAgICAgICBmYWxzZSwKICAgICAgICBmYWxzZQogICAgXSwKICAgICJaUEwtMS4xIjogWwogICAgICAgICJab3BlIFB1YmxpYyBMaWNlbnNlIDEuMSIsCiAgICAgICAgZmFsc2UsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWlBMLTIuMCI6IFsKICAgICAgICAiWm9wZSBQdWJsaWMgTGljZW5zZSAyLjAiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0sCiAgICAiWlBMLTIuMSI6IFsKICAgICAgICAiWm9wZSBQdWJsaWMgTGljZW5zZSAyLjEiLAogICAgICAgIHRydWUsCiAgICAgICAgZmFsc2UKICAgIF0KfTw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgQ29tcG9zZXJcU3BkeDsKCmNsYXNzIFNwZHhMaWNlbnNlcwp7Cgpjb25zdCBMSUNFTlNFU19GSUxFID0gJ3NwZHgtbGljZW5zZXMuanNvbic7CgoKY29uc3QgRVhDRVBUSU9OU19GSUxFID0gJ3NwZHgtZXhjZXB0aW9ucy5qc29uJzsKCgoKCgoKCgoKCgoKCgpwcml2YXRlICRsaWNlbnNlczsKCgoKCnByaXZhdGUgJGxpY2Vuc2VzRXhwcmVzc2lvbjsKCgoKCgoKCgoKCgoKCgpwcml2YXRlICRleGNlcHRpb25zOwoKCgoKcHJpdmF0ZSAkZXhjZXB0aW9uc0V4cHJlc3Npb247CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7CiR0aGlzLT5sb2FkTGljZW5zZXMoKTsKJHRoaXMtPmxvYWRFeGNlcHRpb25zKCk7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlQnlJZGVudGlmaWVyKCRpZGVudGlmaWVyKQp7CiRrZXkgPSBzdHJ0b2xvd2VyKCRpZGVudGlmaWVyKTsKCmlmICghaXNzZXQoJHRoaXMtPmxpY2Vuc2VzWyRrZXldKSkgewpyZXR1cm4gbnVsbDsKfQoKbGlzdCgkaWRlbnRpZmllciwgJG5hbWUsICRpc09zaUFwcHJvdmVkLCAkaXNEZXByZWNhdGVkTGljZW5zZUlkKSA9ICR0aGlzLT5saWNlbnNlc1ska2V5XTsKCnJldHVybiBhcnJheSgKJG5hbWUsCiRpc09zaUFwcHJvdmVkLAonaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8nIC4gJGlkZW50aWZpZXIgLiAnLmh0bWwjbGljZW5zZVRleHQnLAokaXNEZXByZWNhdGVkTGljZW5zZUlkLAopOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMaWNlbnNlcygpCnsKcmV0dXJuICR0aGlzLT5saWNlbnNlczsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEV4Y2VwdGlvbkJ5SWRlbnRpZmllcigkaWRlbnRpZmllcikKewoka2V5ID0gc3RydG9sb3dlcigkaWRlbnRpZmllcik7CgppZiAoIWlzc2V0KCR0aGlzLT5leGNlcHRpb25zWyRrZXldKSkgewpyZXR1cm4gbnVsbDsKfQoKbGlzdCgkaWRlbnRpZmllciwgJG5hbWUpID0gJHRoaXMtPmV4Y2VwdGlvbnNbJGtleV07CgpyZXR1cm4gYXJyYXkoCiRuYW1lLAonaHR0cHM6Ly9zcGR4Lm9yZy9saWNlbnNlcy8nIC4gJGlkZW50aWZpZXIgLiAnLmh0bWwjbGljZW5zZUV4Y2VwdGlvblRleHQnLAopOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElkZW50aWZpZXJCeU5hbWUoJG5hbWUpCnsKZm9yZWFjaCAoJHRoaXMtPmxpY2Vuc2VzIGFzICRsaWNlbnNlRGF0YSkgewppZiAoJGxpY2Vuc2VEYXRhWzFdID09PSAkbmFtZSkgewpyZXR1cm4gJGxpY2Vuc2VEYXRhWzBdOwp9Cn0KCmZvcmVhY2ggKCR0aGlzLT5leGNlcHRpb25zIGFzICRsaWNlbnNlRGF0YSkgewppZiAoJGxpY2Vuc2VEYXRhWzFdID09PSAkbmFtZSkgewpyZXR1cm4gJGxpY2Vuc2VEYXRhWzBdOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzT3NpQXBwcm92ZWRCeUlkZW50aWZpZXIoJGlkZW50aWZpZXIpCnsKcmV0dXJuICR0aGlzLT5saWNlbnNlc1tzdHJ0b2xvd2VyKCRpZGVudGlmaWVyKV1bMl07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZXByZWNhdGVkQnlJZGVudGlmaWVyKCRpZGVudGlmaWVyKQp7CnJldHVybiAkdGhpcy0+bGljZW5zZXNbc3RydG9sb3dlcigkaWRlbnRpZmllcildWzNdOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCRsaWNlbnNlKQp7CmlmIChpc19hcnJheSgkbGljZW5zZSkpIHsKJGNvdW50ID0gY291bnQoJGxpY2Vuc2UpOwppZiAoJGNvdW50ICE9PSBjb3VudChhcnJheV9maWx0ZXIoJGxpY2Vuc2UsICdpc19zdHJpbmcnKSkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0FycmF5IG9mIHN0cmluZ3MgZXhwZWN0ZWQuJyk7Cn0KJGxpY2Vuc2UgPSAkY291bnQgPiAxID8gJygnIC4gaW1wbG9kZSgnIE9SICcsICRsaWNlbnNlKSAuICcpJyA6IChzdHJpbmcpIHJlc2V0KCRsaWNlbnNlKTsKfQoKaWYgKCFpc19zdHJpbmcoJGxpY2Vuc2UpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidBcnJheSBvciBTdHJpbmcgZXhwZWN0ZWQsICVzIGdpdmVuLicsCmdldHR5cGUoJGxpY2Vuc2UpCikpOwp9CgpyZXR1cm4gJHRoaXMtPmlzVmFsaWRMaWNlbnNlU3RyaW5nKCRsaWNlbnNlKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRSZXNvdXJjZXNEaXIoKQp7CnJldHVybiBkaXJuYW1lKF9fRElSX18pIC4gJy9yZXMnOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRMaWNlbnNlcygpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5saWNlbnNlcykgewpyZXR1cm47Cn0KCiRqc29uID0gZmlsZV9nZXRfY29udGVudHMoc2VsZjo6Z2V0UmVzb3VyY2VzRGlyKCkgLiAnLycgLiBzZWxmOjpMSUNFTlNFU19GSUxFKTsKaWYgKGZhbHNlID09PSAkanNvbikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgbGljZW5zZSBmaWxlIGluICcgLiBzZWxmOjpnZXRSZXNvdXJjZXNEaXIoKSAuICcvJyAuIHNlbGY6OkxJQ0VOU0VTX0ZJTEUpOwp9CiR0aGlzLT5saWNlbnNlcyA9IGFycmF5KCk7Cgpmb3JlYWNoIChqc29uX2RlY29kZSgkanNvbiwgdHJ1ZSkgYXMgJGlkZW50aWZpZXIgPT4gJGxpY2Vuc2UpIHsKJHRoaXMtPmxpY2Vuc2VzW3N0cnRvbG93ZXIoJGlkZW50aWZpZXIpXSA9IGFycmF5KCRpZGVudGlmaWVyLCAkbGljZW5zZVswXSwgJGxpY2Vuc2VbMV0sICRsaWNlbnNlWzJdKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvYWRFeGNlcHRpb25zKCkKewppZiAobnVsbCAhPT0gJHRoaXMtPmV4Y2VwdGlvbnMpIHsKcmV0dXJuOwp9CgokanNvbiA9IGZpbGVfZ2V0X2NvbnRlbnRzKHNlbGY6OmdldFJlc291cmNlc0RpcigpIC4gJy8nIC4gc2VsZjo6RVhDRVBUSU9OU19GSUxFKTsKaWYgKGZhbHNlID09PSAkanNvbikgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ01pc3NpbmcgZXhjZXB0aW9ucyBmaWxlIGluICcgLiBzZWxmOjpnZXRSZXNvdXJjZXNEaXIoKSAuICcvJyAuIHNlbGY6OkVYQ0VQVElPTlNfRklMRSk7Cn0KJHRoaXMtPmV4Y2VwdGlvbnMgPSBhcnJheSgpOwoKZm9yZWFjaCAoanNvbl9kZWNvZGUoJGpzb24sIHRydWUpIGFzICRpZGVudGlmaWVyID0+ICRleGNlcHRpb24pIHsKJHRoaXMtPmV4Y2VwdGlvbnNbc3RydG9sb3dlcigkaWRlbnRpZmllcildID0gYXJyYXkoJGlkZW50aWZpZXIsICRleGNlcHRpb25bMF0pOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TGljZW5zZXNFeHByZXNzaW9uKCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmxpY2Vuc2VzRXhwcmVzc2lvbikgewokbGljZW5zZXMgPSBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBhcnJheV9rZXlzKCR0aGlzLT5saWNlbnNlcykpOwpyc29ydCgkbGljZW5zZXMpOwokbGljZW5zZXMgPSBpbXBsb2RlKCd8JywgJGxpY2Vuc2VzKTsKJHRoaXMtPmxpY2Vuc2VzRXhwcmVzc2lvbiA9ICRsaWNlbnNlczsKfQoKcmV0dXJuICR0aGlzLT5saWNlbnNlc0V4cHJlc3Npb247Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RXhjZXB0aW9uc0V4cHJlc3Npb24oKQp7CmlmIChudWxsID09PSAkdGhpcy0+ZXhjZXB0aW9uc0V4cHJlc3Npb24pIHsKJGV4Y2VwdGlvbnMgPSBhcnJheV9tYXAoJ3ByZWdfcXVvdGUnLCBhcnJheV9rZXlzKCR0aGlzLT5leGNlcHRpb25zKSk7CnJzb3J0KCRleGNlcHRpb25zKTsKJGV4Y2VwdGlvbnMgPSBpbXBsb2RlKCd8JywgJGV4Y2VwdGlvbnMpOwokdGhpcy0+ZXhjZXB0aW9uc0V4cHJlc3Npb24gPSAkZXhjZXB0aW9uczsKfQoKcmV0dXJuICR0aGlzLT5leGNlcHRpb25zRXhwcmVzc2lvbjsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNWYWxpZExpY2Vuc2VTdHJpbmcoJGxpY2Vuc2UpCnsKaWYgKGlzc2V0KCR0aGlzLT5saWNlbnNlc1tzdHJ0b2xvd2VyKCRsaWNlbnNlKV0pKSB7CnJldHVybiB0cnVlOwp9CgokbGljZW5zZXMgPSAkdGhpcy0+Z2V0TGljZW5zZXNFeHByZXNzaW9uKCk7CiRleGNlcHRpb25zID0gJHRoaXMtPmdldEV4Y2VwdGlvbnNFeHByZXNzaW9uKCk7CgokcmVnZXggPSA8PDxSRUdFWAp7Cig/KERFRklORSkKICAgICMgaWRzdHJpbmc6IDEqKCBBTFBIQSAvIERJR0lUIC8gLSAvIC4gKQogICAgKD88aWRzdHJpbmc+W1xwTFxwTi4tXXsxLH0pCgogICAgIyBsaWNlbnNlLWlkOiB0YWtlbiBmcm9tIGxpc3QKICAgICg/PGxpY2Vuc2VpZD57JGxpY2Vuc2VzfSkKCiAgICAjIGxpY2Vuc2UtZXhjZXB0aW9uLWlkOiB0YWtlbiBmcm9tIGxpc3QKICAgICg/PGxpY2Vuc2VleGNlcHRpb25pZD57JGV4Y2VwdGlvbnN9KQoKICAgICMgbGljZW5zZS1yZWY6IFtEb2N1bWVudFJlZi0xKihpZHN0cmluZyk6XUxpY2Vuc2VSZWYtMSooaWRzdHJpbmcpCiAgICAoPzxsaWNlbnNlcmVmPig/OkRvY3VtZW50UmVmLSg/Jmlkc3RyaW5nKTopP0xpY2Vuc2VSZWYtKD8maWRzdHJpbmcpKQoKICAgICMgc2ltcGxlLWV4cHJlc3NzaW9uOiBsaWNlbnNlLWlkIC8gbGljZW5zZS1pZCsgLyBsaWNlbnNlLXJlZgogICAgKD88c2ltcGxlX2V4cHJlc3Npb24+KD8mbGljZW5zZWlkKVwrPyB8ICg/JmxpY2Vuc2VpZCkgfCAoPyZsaWNlbnNlcmVmKSkKCiAgICAjIGNvbXBvdW5kLWV4cHJlc3Npb246IDEqKAogICAgIyAgIHNpbXBsZS1leHByZXNzaW9uIC8KICAgICMgICBzaW1wbGUtZXhwcmVzc2lvbiBXSVRIIGxpY2Vuc2UtZXhjZXB0aW9uLWlkIC8KICAgICMgICBjb21wb3VuZC1leHByZXNzaW9uIEFORCBjb21wb3VuZC1leHByZXNzaW9uIC8KICAgICMgICBjb21wb3VuZC1leHByZXNzaW9uIE9SIGNvbXBvdW5kLWV4cHJlc3Npb24KICAgICMgKSAvICggY29tcG91bmQtZXhwcmVzc2lvbiApICkKICAgICg/PGNvbXBvdW5kX2hlYWQ+CiAgICAgICAgKD8mc2ltcGxlX2V4cHJlc3Npb24pICggXHMrIFdJVEggXHMrICg/JmxpY2Vuc2VleGNlcHRpb25pZCkpPwogICAgICAgICAgICB8IFwoIFxzKiAoPyZjb21wb3VuZF9leHByZXNzaW9uKSBccyogXCkKICAgICkKICAgICg/PGNvbXBvdW5kX2V4cHJlc3Npb24+CiAgICAgICAgKD8mY29tcG91bmRfaGVhZCkgKD86IFxzKyAoPzpBTkR8T1IpIFxzKyAoPyZjb21wb3VuZF9leHByZXNzaW9uKSk/CiAgICApCgogICAgIyBsaWNlbnNlLWV4cHJlc3Npb246IDEqMShzaW1wbGUtZXhwcmVzc2lvbiAvIGNvbXBvdW5kLWV4cHJlc3Npb24pCiAgICAoPzxsaWNlbnNlX2V4cHJlc3Npb24+KD8mY29tcG91bmRfZXhwcmVzc2lvbikgfCAoPyZzaW1wbGVfZXhwcmVzc2lvbikpCikgIyBlbmQgb2YgZGVmaW5lCgpeKE5PTkUgfCBOT0FTU0VSVElPTiB8ICg/JmxpY2Vuc2VfZXhwcmVzc2lvbikpJAp9eGkKUkVHRVg7CgokbWF0Y2ggPSBwcmVnX21hdGNoKCRyZWdleCwgJGxpY2Vuc2UpOwoKaWYgKDAgPT09ICRtYXRjaCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChmYWxzZSA9PT0gJG1hdGNoKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignUmVnZXggZmFpbGVkIHRvIGNvbXBpbGUvcnVuLicpOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9CgpNSVQgTGljZW5zZQoKQ29weXJpZ2h0IChjKSAyMDE3IENvbXBvc2VyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCgoKbmFtZXNwYWNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXI7CgoKCgoKCmNsYXNzIFBocENvbmZpZwp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIHVzZU9yaWdpbmFsKCk6IGFycmF5CnsKJHRoaXMtPmdldERhdGFBbmRSZXNldCgpOwpyZXR1cm4gW107Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVzZVN0YW5kYXJkKCk6IGFycmF5CnsKJGRhdGEgPSAkdGhpcy0+Z2V0RGF0YUFuZFJlc2V0KCk7CmlmICgkZGF0YSAhPT0gbnVsbCkgewpyZXR1cm4gWyctbicsICctYycsICRkYXRhWyd0bXBJbmknXV07Cn0KCnJldHVybiBbXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdXNlUGVyc2lzdGVudCgpOiBhcnJheQp7CiRkYXRhID0gJHRoaXMtPmdldERhdGFBbmRSZXNldCgpOwppZiAoJGRhdGEgIT09IG51bGwpIHsKJHRoaXMtPnVwZGF0ZUVudignUEhQUkMnLCAkZGF0YVsndG1wSW5pJ10pOwokdGhpcy0+dXBkYXRlRW52KCdQSFBfSU5JX1NDQU5fRElSJywgJycpOwp9CgpyZXR1cm4gW107Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREYXRhQW5kUmVzZXQoKTogP2FycmF5CnsKJGRhdGEgPSBYZGVidWdIYW5kbGVyOjpnZXRSZXN0YXJ0U2V0dGluZ3MoKTsKaWYgKCRkYXRhICE9PSBudWxsKSB7CiR0aGlzLT51cGRhdGVFbnYoJ1BIUFJDJywgJGRhdGFbJ3BocHJjJ10pOwokdGhpcy0+dXBkYXRlRW52KCdQSFBfSU5JX1NDQU5fRElSJywgJGRhdGFbJ3NjYW5EaXInXSk7Cn0KCnJldHVybiAkZGF0YTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1cGRhdGVFbnYoc3RyaW5nICRuYW1lLCAkdmFsdWUpOiB2b2lkCnsKUHJvY2Vzczo6c2V0RW52KCRuYW1lLCBmYWxzZSAhPT0gJHZhbHVlID8gJHZhbHVlIDogbnVsbCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgQ29tcG9zZXJcWGRlYnVnSGFuZGxlcjsKCnVzZSBDb21wb3NlclxQY3JlXFByZWc7CgoKCgoKCmNsYXNzIFByb2Nlc3MKewoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGUoc3RyaW5nICRhcmcsIGJvb2wgJG1ldGEgPSB0cnVlLCBib29sICRtb2R1bGUgPSBmYWxzZSk6IHN0cmluZwp7CmlmICghZGVmaW5lZCgnUEhQX1dJTkRPV1NfVkVSU0lPTl9CVUlMRCcpKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJnKS4iJyI7Cn0KCiRxdW90ZSA9IHN0cnBicmsoJGFyZywgIiBcdCIpICE9PSBmYWxzZSB8fCAkYXJnID09PSAnJzsKCiRhcmcgPSBQcmVnOjpyZXBsYWNlKCcvKFxcXFwqKSIvJywgJyQxJDFcXCInLCAkYXJnLCAtMSwgJGRxdW90ZXMpOwokZHF1b3RlcyA9IChib29sKSAkZHF1b3RlczsKCmlmICgkbWV0YSkgewokbWV0YSA9ICRkcXVvdGVzIHx8IFByZWc6OmlzTWF0Y2goJy8lW14lXSslLycsICRhcmcpOwoKaWYgKCEkbWV0YSkgewokcXVvdGUgPSAkcXVvdGUgfHwgc3RycGJyaygkYXJnLCAnXiZ8PD4oKScpICE9PSBmYWxzZTsKfSBlbHNlaWYgKCRtb2R1bGUgJiYgISRkcXVvdGVzICYmICRxdW90ZSkgewokbWV0YSA9IGZhbHNlOwp9Cn0KCmlmICgkcXVvdGUpIHsKJGFyZyA9ICciJy4oUHJlZzo6cmVwbGFjZSgnLyhcXFxcKikkLycsICckMSQxJywgJGFyZykpLiciJzsKfQoKaWYgKCRtZXRhKSB7CiRhcmcgPSBQcmVnOjpyZXBsYWNlKCcvKFsiXiZ8PD4oKSVdKS8nLCAnXiQxJywgJGFyZyk7Cn0KCnJldHVybiAkYXJnOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlU2hlbGxDb21tYW5kKGFycmF5ICRhcmdzKTogc3RyaW5nCnsKJGNvbW1hbmQgPSAnJzsKJG1vZHVsZSA9IGFycmF5X3NoaWZ0KCRhcmdzKTsKCmlmICgkbW9kdWxlICE9PSBudWxsKSB7CiRjb21tYW5kID0gc2VsZjo6ZXNjYXBlKCRtb2R1bGUsIHRydWUsIHRydWUpOwoKZm9yZWFjaCAoJGFyZ3MgYXMgJGFyZykgewokY29tbWFuZCAuPSAnICcuc2VsZjo6ZXNjYXBlKCRhcmcpOwp9Cn0KCnJldHVybiAkY29tbWFuZDsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRFbnYoc3RyaW5nICRuYW1lLCA/c3RyaW5nICR2YWx1ZSA9IG51bGwpOiBib29sCnsKJHVuc2V0ID0gbnVsbCA9PT0gJHZhbHVlOwoKaWYgKCFwdXRlbnYoJHVuc2V0ID8gJG5hbWUgOiAkbmFtZS4nPScuJHZhbHVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdW5zZXQpIHsKdW5zZXQoJF9TRVJWRVJbJG5hbWVdKTsKfSBlbHNlIHsKJF9TRVJWRVJbJG5hbWVdID0gJHZhbHVlOwp9CgoKaWYgKGZhbHNlICE9PSBzdHJpcG9zKChzdHJpbmcpIGluaV9nZXQoJ3ZhcmlhYmxlc19vcmRlcicpLCAnRScpKSB7CmlmICgkdW5zZXQpIHsKdW5zZXQoJF9FTlZbJG5hbWVdKTsKfSBlbHNlIHsKJF9FTlZbJG5hbWVdID0gJHZhbHVlOwp9Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIENvbXBvc2VyXFhkZWJ1Z0hhbmRsZXI7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBQc3JcTG9nXExvZ0xldmVsOwoKCgoKCmNsYXNzIFN0YXR1cwp7CmNvbnN0IEVOVl9SRVNUQVJUID0gJ1hERUJVR19IQU5ETEVSX1JFU1RBUlQnOwpjb25zdCBDSEVDSyA9ICdDaGVjayc7CmNvbnN0IEVSUk9SID0gJ0Vycm9yJzsKY29uc3QgSU5GTyA9ICdJbmZvJzsKY29uc3QgTk9SRVNUQVJUID0gJ05vUmVzdGFydCc7CmNvbnN0IFJFU1RBUlQgPSAnUmVzdGFydCc7CmNvbnN0IFJFU1RBUlRJTkcgPSAnUmVzdGFydGluZyc7CmNvbnN0IFJFU1RBUlRFRCA9ICdSZXN0YXJ0ZWQnOwoKCnByaXZhdGUgJGRlYnVnOwoKCnByaXZhdGUgJGVudkFsbG93WGRlYnVnOwoKCnByaXZhdGUgJGxvYWRlZDsKCgpwcml2YXRlICRsb2dnZXI7CgoKcHJpdmF0ZSAkbW9kZU9mZjsKCgpwcml2YXRlICR0aW1lOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGVudkFsbG93WGRlYnVnLCBib29sICRkZWJ1ZykKewokc3RhcnQgPSBnZXRlbnYoc2VsZjo6RU5WX1JFU1RBUlQpOwpQcm9jZXNzOjpzZXRFbnYoc2VsZjo6RU5WX1JFU1RBUlQpOwokdGhpcy0+dGltZSA9IGlzX251bWVyaWMoJHN0YXJ0KSA/IHJvdW5kKChtaWNyb3RpbWUodHJ1ZSkgLSAkc3RhcnQpICogMTAwMCkgOiAwOwoKJHRoaXMtPmVudkFsbG93WGRlYnVnID0gJGVudkFsbG93WGRlYnVnOwokdGhpcy0+ZGVidWcgPSAkZGVidWcgJiYgZGVmaW5lZCgnU1RERVJSJyk7CiR0aGlzLT5tb2RlT2ZmID0gZmFsc2U7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvZ2dlcihMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcik6IHZvaWQKewokdGhpcy0+bG9nZ2VyID0gJGxvZ2dlcjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVwb3J0KHN0cmluZyAkb3AsID9zdHJpbmcgJGRhdGEpOiB2b2lkCnsKaWYgKCR0aGlzLT5sb2dnZXIgIT09IG51bGwgfHwgJHRoaXMtPmRlYnVnKSB7CiRwYXJhbSA9IChzdHJpbmcpICRkYXRhOwoKc3dpdGNoKCRvcCkgewpjYXNlIHNlbGY6OkNIRUNLOgokdGhpcy0+cmVwb3J0Q2hlY2soJHBhcmFtKTsKYnJlYWs7CmNhc2Ugc2VsZjo6RVJST1I6CiR0aGlzLT5yZXBvcnRFcnJvcigkcGFyYW0pOwpicmVhazsKY2FzZSBzZWxmOjpJTkZPOgokdGhpcy0+cmVwb3J0SW5mbygkcGFyYW0pOwpicmVhazsKY2FzZSBzZWxmOjpOT1JFU1RBUlQ6CiR0aGlzLT5yZXBvcnROb1Jlc3RhcnQoKTsKYnJlYWs7CmNhc2Ugc2VsZjo6UkVTVEFSVDoKJHRoaXMtPnJlcG9ydFJlc3RhcnQoKTsKYnJlYWs7CmNhc2Ugc2VsZjo6UkVTVEFSVEVEOgokdGhpcy0+cmVwb3J0UmVzdGFydGVkKCk7CmJyZWFrOwpjYXNlIHNlbGY6OlJFU1RBUlRJTkc6CiR0aGlzLT5yZXBvcnRSZXN0YXJ0aW5nKCRwYXJhbSk7CmJyZWFrOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBvcCBoYW5kbGVyOiAnLiRvcCk7Cn0KfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG91dHB1dChzdHJpbmcgJHRleHQsID9zdHJpbmcgJGxldmVsID0gbnVsbCk6IHZvaWQKewppZiAoJHRoaXMtPmxvZ2dlciAhPT0gbnVsbCkgewokdGhpcy0+bG9nZ2VyLT5sb2coJGxldmVsICE9PSBudWxsID8gJGxldmVsOiBMb2dMZXZlbDo6REVCVUcsICR0ZXh0KTsKfQoKaWYgKCR0aGlzLT5kZWJ1Zykgewpmd3JpdGUoU1RERVJSLCBzcHJpbnRmKCd4ZGVidWctaGFuZGxlclslZF0gJXMnLCBnZXRteXBpZCgpLCAkdGV4dC5QSFBfRU9MKSk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnRDaGVjayhzdHJpbmcgJGxvYWRlZCk6IHZvaWQKewpsaXN0KCR2ZXJzaW9uLCAkbW9kZSkgPSBleHBsb2RlKCd8JywgJGxvYWRlZCk7CgppZiAoJHZlcnNpb24gIT09ICcnKSB7CiR0aGlzLT5sb2FkZWQgPSAnKCcuJHZlcnNpb24uJyknLigkbW9kZSAhPT0gJycgPyAnIHhkZWJ1Zy5tb2RlPScuJG1vZGUgOiAnJyk7Cn0KJHRoaXMtPm1vZGVPZmYgPSAkbW9kZSA9PT0gJ29mZic7CiR0aGlzLT5vdXRwdXQoJ0NoZWNraW5nICcuJHRoaXMtPmVudkFsbG93WGRlYnVnKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnRFcnJvcihzdHJpbmcgJGVycm9yKTogdm9pZAp7CiR0aGlzLT5vdXRwdXQoc3ByaW50ZignTm8gcmVzdGFydCAoJXMpJywgJGVycm9yKSwgTG9nTGV2ZWw6OldBUk5JTkcpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydEluZm8oc3RyaW5nICRpbmZvKTogdm9pZAp7CiR0aGlzLT5vdXRwdXQoJGluZm8pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydE5vUmVzdGFydCgpOiB2b2lkCnsKJHRoaXMtPm91dHB1dCgkdGhpcy0+Z2V0TG9hZGVkTWVzc2FnZSgpKTsKCmlmICgkdGhpcy0+bG9hZGVkICE9PSBudWxsKSB7CiR0ZXh0ID0gc3ByaW50ZignTm8gcmVzdGFydCAoJXMpJywgJHRoaXMtPmdldEVudkFsbG93KCkpOwppZiAoISgoYm9vbCkgZ2V0ZW52KCR0aGlzLT5lbnZBbGxvd1hkZWJ1ZykpKSB7CiR0ZXh0IC49ICcgQWxsb3dlZCBieSAnLigkdGhpcy0+bW9kZU9mZiA/ICd4ZGVidWcubW9kZScgOiAnYXBwbGljYXRpb24nKTsKfQokdGhpcy0+b3V0cHV0KCR0ZXh0KTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcG9ydFJlc3RhcnQoKTogdm9pZAp7CiR0aGlzLT5vdXRwdXQoJHRoaXMtPmdldExvYWRlZE1lc3NhZ2UoKSk7ClByb2Nlc3M6OnNldEVudihzZWxmOjpFTlZfUkVTVEFSVCwgKHN0cmluZykgbWljcm90aW1lKHRydWUpKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnRSZXN0YXJ0ZWQoKTogdm9pZAp7CiRsb2FkZWQgPSAkdGhpcy0+Z2V0TG9hZGVkTWVzc2FnZSgpOwokdGV4dCA9IHNwcmludGYoJ1Jlc3RhcnRlZCAoJWQgbXMpLiAlcycsICR0aGlzLT50aW1lLCAkbG9hZGVkKTsKJGxldmVsID0gJHRoaXMtPmxvYWRlZCAhPT0gbnVsbCA/IExvZ0xldmVsOjpXQVJOSU5HIDogbnVsbDsKJHRoaXMtPm91dHB1dCgkdGV4dCwgJGxldmVsKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXBvcnRSZXN0YXJ0aW5nKHN0cmluZyAkY29tbWFuZCk6IHZvaWQKewokdGV4dCA9IHNwcmludGYoJ1Byb2Nlc3MgcmVzdGFydGluZyAoJXMpJywgJHRoaXMtPmdldEVudkFsbG93KCkpOwokdGhpcy0+b3V0cHV0KCR0ZXh0KTsKJHRleHQgPSAnUnVubmluZzogJy4kY29tbWFuZDsKJHRoaXMtPm91dHB1dCgkdGV4dCk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RW52QWxsb3coKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5lbnZBbGxvd1hkZWJ1Zy4nPScuZ2V0ZW52KCR0aGlzLT5lbnZBbGxvd1hkZWJ1Zyk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TG9hZGVkTWVzc2FnZSgpOiBzdHJpbmcKewokbG9hZGVkID0gJHRoaXMtPmxvYWRlZCAhPT0gbnVsbCA/IHNwcmludGYoJ2xvYWRlZCAlcycsICR0aGlzLT5sb2FkZWQpIDogJ25vdCBsb2FkZWQnOwpyZXR1cm4gJ1RoZSBYZGVidWcgZXh0ZW5zaW9uIGlzICcuJGxvYWRlZDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBDb21wb3NlclxYZGVidWdIYW5kbGVyOwoKdXNlIENvbXBvc2VyXFBjcmVcUHJlZzsKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBYZGVidWdIYW5kbGVyCnsKY29uc3QgU1VGRklYX0FMTE9XID0gJ19BTExPV19YREVCVUcnOwpjb25zdCBTVUZGSVhfSU5JUyA9ICdfT1JJR0lOQUxfSU5JUyc7CmNvbnN0IFJFU1RBUlRfSUQgPSAnaW50ZXJuYWwnOwpjb25zdCBSRVNUQVJUX1NFVFRJTkdTID0gJ1hERUJVR19IQU5ETEVSX1NFVFRJTkdTJzsKY29uc3QgREVCVUcgPSAnWERFQlVHX0hBTkRMRVJfREVCVUcnOwoKCnByb3RlY3RlZCAkdG1wSW5pOwoKCnByaXZhdGUgc3RhdGljICRpblJlc3RhcnQ7CgoKcHJpdmF0ZSBzdGF0aWMgJG5hbWU7CgoKcHJpdmF0ZSBzdGF0aWMgJHNraXBwZWQ7CgoKcHJpdmF0ZSBzdGF0aWMgJHhkZWJ1Z0FjdGl2ZTsKCgpwcml2YXRlIHN0YXRpYyAkeGRlYnVnTW9kZTsKCgpwcml2YXRlIHN0YXRpYyAkeGRlYnVnVmVyc2lvbjsKCgpwcml2YXRlICRjbGk7CgoKcHJpdmF0ZSAkZGVidWc7CgoKcHJpdmF0ZSAkZW52QWxsb3dYZGVidWc7CgoKcHJpdmF0ZSAkZW52T3JpZ2luYWxJbmlzOwoKCnByaXZhdGUgJHBlcnNpc3RlbnQ7CgoKcHJpdmF0ZSAkc2NyaXB0OwoKCnByaXZhdGUgJHN0YXR1c1dyaXRlcjsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRlbnZQcmVmaXgpCnsKaWYgKCRlbnZQcmVmaXggPT09ICcnKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignSW52YWxpZCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXInKTsKfQoKc2VsZjo6JG5hbWUgPSBzdHJ0b3VwcGVyKCRlbnZQcmVmaXgpOwokdGhpcy0+ZW52QWxsb3dYZGVidWcgPSBzZWxmOjokbmFtZS5zZWxmOjpTVUZGSVhfQUxMT1c7CiR0aGlzLT5lbnZPcmlnaW5hbEluaXMgPSBzZWxmOjokbmFtZS5zZWxmOjpTVUZGSVhfSU5JUzsKCnNlbGY6OnNldFhkZWJ1Z0RldGFpbHMoKTsKc2VsZjo6JGluUmVzdGFydCA9IGZhbHNlOwoKaWYgKCR0aGlzLT5jbGkgPSBQSFBfU0FQSSA9PT0gJ2NsaScpIHsKJHRoaXMtPmRlYnVnID0gKHN0cmluZykgZ2V0ZW52KHNlbGY6OkRFQlVHKTsKfQoKJHRoaXMtPnN0YXR1c1dyaXRlciA9IG5ldyBTdGF0dXMoJHRoaXMtPmVudkFsbG93WGRlYnVnLCAoYm9vbCkgJHRoaXMtPmRlYnVnKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvZ2dlcihMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcik6IHNlbGYKewokdGhpcy0+c3RhdHVzV3JpdGVyLT5zZXRMb2dnZXIoJGxvZ2dlcik7CnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1haW5TY3JpcHQoc3RyaW5nICRzY3JpcHQpOiBzZWxmCnsKJHRoaXMtPnNjcmlwdCA9ICRzY3JpcHQ7CnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFBlcnNpc3RlbnQoKTogc2VsZgp7CiR0aGlzLT5wZXJzaXN0ZW50ID0gdHJ1ZTsKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCk6IHZvaWQKewokdGhpcy0+bm90aWZ5KFN0YXR1czo6Q0hFQ0ssIHNlbGY6OiR4ZGVidWdWZXJzaW9uLid8Jy5zZWxmOjokeGRlYnVnTW9kZSk7CiRlbnZBcmdzID0gZXhwbG9kZSgnfCcsIChzdHJpbmcpIGdldGVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcpKTsKCmlmICghKChib29sKSAkZW52QXJnc1swXSkgJiYgJHRoaXMtPnJlcXVpcmVzUmVzdGFydChzZWxmOjokeGRlYnVnQWN0aXZlKSkgewoKJHRoaXMtPm5vdGlmeShTdGF0dXM6OlJFU1RBUlQpOwokY29tbWFuZCA9ICR0aGlzLT5wcmVwYXJlUmVzdGFydCgpOwoKaWYgKCRjb21tYW5kICE9PSBudWxsKSB7CiR0aGlzLT5yZXN0YXJ0KCRjb21tYW5kKTsKfQpyZXR1cm47Cn0KCmlmIChzZWxmOjpSRVNUQVJUX0lEID09PSAkZW52QXJnc1swXSAmJiBjb3VudCgkZW52QXJncykgPT09IDUpIHsKCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpSRVNUQVJURUQpOwoKUHJvY2Vzczo6c2V0RW52KCR0aGlzLT5lbnZBbGxvd1hkZWJ1Zyk7CnNlbGY6OiRpblJlc3RhcnQgPSB0cnVlOwoKaWYgKHNlbGY6OiR4ZGVidWdWZXJzaW9uID09PSBudWxsKSB7CgpzZWxmOjokc2tpcHBlZCA9ICRlbnZBcmdzWzFdOwp9CgokdGhpcy0+dHJ5RW5hYmxlU2lnbmFscygpOwoKCiR0aGlzLT5zZXRFbnZSZXN0YXJ0U2V0dGluZ3MoJGVudkFyZ3MpOwpyZXR1cm47Cn0KCiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpOT1JFU1RBUlQpOwokc2V0dGluZ3MgPSBzZWxmOjpnZXRSZXN0YXJ0U2V0dGluZ3MoKTsKCmlmICgkc2V0dGluZ3MgIT09IG51bGwpIHsKCiR0aGlzLT5zeW5jU2V0dGluZ3MoJHNldHRpbmdzKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0QWxsSW5pRmlsZXMoKTogYXJyYXkKewppZiAoc2VsZjo6JG5hbWUgIT09IG51bGwpIHsKJGVudiA9IGdldGVudihzZWxmOjokbmFtZS5zZWxmOjpTVUZGSVhfSU5JUyk7CgppZiAoZmFsc2UgIT09ICRlbnYpIHsKcmV0dXJuIGV4cGxvZGUoUEFUSF9TRVBBUkFUT1IsICRlbnYpOwp9Cn0KCiRwYXRocyA9IFsoc3RyaW5nKSBwaHBfaW5pX2xvYWRlZF9maWxlKCldOwokc2Nhbm5lZCA9IHBocF9pbmlfc2Nhbm5lZF9maWxlcygpOwoKaWYgKCRzY2FubmVkICE9PSBmYWxzZSkgewokcGF0aHMgPSBhcnJheV9tZXJnZSgkcGF0aHMsIGFycmF5X21hcCgndHJpbScsIGV4cGxvZGUoJywnLCAkc2Nhbm5lZCkpKTsKfQoKcmV0dXJuICRwYXRoczsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJlc3RhcnRTZXR0aW5ncygpOiA/YXJyYXkKewokZW52QXJncyA9IGV4cGxvZGUoJ3wnLCAoc3RyaW5nKSBnZXRlbnYoc2VsZjo6UkVTVEFSVF9TRVRUSU5HUykpOwoKaWYgKGNvdW50KCRlbnZBcmdzKSAhPT0gNgp8fCAoIXNlbGY6OiRpblJlc3RhcnQgJiYgcGhwX2luaV9sb2FkZWRfZmlsZSgpICE9PSAkZW52QXJnc1swXSkpIHsKcmV0dXJuIG51bGw7Cn0KCnJldHVybiBbCid0bXBJbmknID0+ICRlbnZBcmdzWzBdLAonc2Nhbm5lZEluaXMnID0+IChib29sKSAkZW52QXJnc1sxXSwKJ3NjYW5EaXInID0+ICcqJyA9PT0gJGVudkFyZ3NbMl0gPyBmYWxzZSA6ICRlbnZBcmdzWzJdLAoncGhwcmMnID0+ICcqJyA9PT0gJGVudkFyZ3NbM10gPyBmYWxzZSA6ICRlbnZBcmdzWzNdLAonaW5pcycgPT4gZXhwbG9kZShQQVRIX1NFUEFSQVRPUiwgJGVudkFyZ3NbNF0pLAonc2tpcHBlZCcgPT4gJGVudkFyZ3NbNV0sCl07Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U2tpcHBlZFZlcnNpb24oKTogc3RyaW5nCnsKcmV0dXJuIChzdHJpbmcpIHNlbGY6OiRza2lwcGVkOwp9CgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzWGRlYnVnQWN0aXZlKCk6IGJvb2wKewpzZWxmOjpzZXRYZGVidWdEZXRhaWxzKCk7CnJldHVybiBzZWxmOjokeGRlYnVnQWN0aXZlOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiByZXF1aXJlc1Jlc3RhcnQoYm9vbCAkZGVmYXVsdCk6IGJvb2wKewpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHJlc3RhcnQoYXJyYXkgJGNvbW1hbmQpOiB2b2lkCnsKJHRoaXMtPmRvUmVzdGFydCgkY29tbWFuZCk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9SZXN0YXJ0KGFycmF5ICRjb21tYW5kKTogdm9pZAp7CmlmIChQSFBfVkVSU0lPTl9JRCA+PSA3MDQwMCkgewokY21kID0gJGNvbW1hbmQ7CiRkaXNwbGF5Q21kID0gc3ByaW50ZignWyVzXScsIGltcGxvZGUoJywgJywgJGNtZCkpOwp9IGVsc2UgewokY21kID0gUHJvY2Vzczo6ZXNjYXBlU2hlbGxDb21tYW5kKCRjb21tYW5kKTsKaWYgKGRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKSkgewoKJGNtZCA9ICciJy4kY21kLiciJzsKfQokZGlzcGxheUNtZCA9ICRjbWQ7Cn0KCiR0aGlzLT50cnlFbmFibGVTaWduYWxzKCk7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpSRVNUQVJUSU5HLCAkZGlzcGxheUNtZCk7CgokcHJvY2VzcyA9IHByb2Nfb3BlbigkY21kLCBbXSwgJHBpcGVzKTsKaWYgKGlzX3Jlc291cmNlKCRwcm9jZXNzKSkgewokZXhpdENvZGUgPSBwcm9jX2Nsb3NlKCRwcm9jZXNzKTsKfQoKaWYgKCFpc3NldCgkZXhpdENvZGUpKSB7CgokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICdVbmFibGUgdG8gcmVzdGFydCBwcm9jZXNzJyk7CiRleGl0Q29kZSA9IC0xOwp9IGVsc2UgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6SU5GTywgJ1Jlc3RhcnRlZCBwcm9jZXNzIGV4aXRlZCAnLiRleGl0Q29kZSk7Cn0KCmlmICgkdGhpcy0+ZGVidWcgPT09ICcyJykgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6SU5GTywgJ1RlbXAgaW5pIHNhdmVkOiAnLiR0aGlzLT50bXBJbmkpOwp9IGVsc2UgewpAdW5saW5rKChzdHJpbmcpICR0aGlzLT50bXBJbmkpOwp9CgpleGl0KCRleGl0Q29kZSk7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHByZXBhcmVSZXN0YXJ0KCk6ID9hcnJheQp7CmlmICghJHRoaXMtPmNsaSkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICdVbnN1cHBvcnRlZCBTQVBJOiAnLlBIUF9TQVBJKTsKcmV0dXJuIG51bGw7Cn0KCmlmICgoJGFyZ3YgPSAkdGhpcy0+Y2hlY2tTZXJ2ZXJBcmd2KCkpID09PSBudWxsKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJyRfU0VSVkVSW2FyZ3ZdIGlzIG5vdCBhcyBleHBlY3RlZCcpOwpyZXR1cm4gbnVsbDsKfQoKaWYgKCEkdGhpcy0+Y2hlY2tDb25maWd1cmF0aW9uKCRpbmZvKSkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICRpbmZvKTsKcmV0dXJuIG51bGw7Cn0KCiRtYWluU2NyaXB0ID0gKHN0cmluZykgJHRoaXMtPnNjcmlwdDsKaWYgKCEkdGhpcy0+Y2hlY2tNYWluU2NyaXB0KCRtYWluU2NyaXB0LCAkYXJndikpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAnVW5hYmxlIHRvIGFjY2VzcyBtYWluIHNjcmlwdDogJy4kbWFpblNjcmlwdCk7CnJldHVybiBudWxsOwp9CgokdG1wRGlyID0gc3lzX2dldF90ZW1wX2RpcigpOwokaW5pRXJyb3IgPSAnVW5hYmxlIHRvIGNyZWF0ZSB0ZW1wIGluaSBmaWxlIGF0OiAnLiR0bXBEaXI7CgppZiAoKCR0bXBmaWxlID0gQHRlbXBuYW0oJHRtcERpciwgJycpKSA9PT0gZmFsc2UpIHsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OkVSUk9SLCAkaW5pRXJyb3IpOwpyZXR1cm4gbnVsbDsKfQoKJGVycm9yID0gbnVsbDsKJGluaUZpbGVzID0gc2VsZjo6Z2V0QWxsSW5pRmlsZXMoKTsKJHNjYW5uZWRJbmlzID0gY291bnQoJGluaUZpbGVzKSA+IDE7CgppZiAoISR0aGlzLT53cml0ZVRtcEluaSgkdG1wZmlsZSwgJGluaUZpbGVzLCAkZXJyb3IpKSB7CiR0aGlzLT5ub3RpZnkoU3RhdHVzOjpFUlJPUiwgJGVycm9yID8/ICRpbmlFcnJvcik7CkB1bmxpbmsoJHRtcGZpbGUpOwpyZXR1cm4gbnVsbDsKfQoKaWYgKCEkdGhpcy0+c2V0RW52aXJvbm1lbnQoJHNjYW5uZWRJbmlzLCAkaW5pRmlsZXMsICR0bXBmaWxlKSkgewokdGhpcy0+bm90aWZ5KFN0YXR1czo6RVJST1IsICdVbmFibGUgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcycpOwpAdW5saW5rKCR0bXBmaWxlKTsKcmV0dXJuIG51bGw7Cn0KCiR0aGlzLT50bXBJbmkgPSAkdG1wZmlsZTsKCnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgkYXJndiwgJHRtcGZpbGUsICRtYWluU2NyaXB0KTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlVG1wSW5pKHN0cmluZyAkdG1wRmlsZSwgYXJyYXkgJGluaUZpbGVzLCA/c3RyaW5nICYkZXJyb3IpOiBib29sCnsKCmlmICgkaW5pRmlsZXNbMF0gPT09ICcnKSB7CmFycmF5X3NoaWZ0KCRpbmlGaWxlcyk7Cn0KCiRjb250ZW50ID0gJyc7CiRzZWN0aW9uUmVnZXggPSAnL15ccypcWyg/OlBBVEh8SE9TVClccyo9L21pJzsKJHhkZWJ1Z1JlZ2V4ID0gJy9eXHMqKHplbmRfZXh0ZW5zaW9uXHMqPS4qeGRlYnVnLiopJC9taSc7Cgpmb3JlYWNoICgkaW5pRmlsZXMgYXMgJGZpbGUpIHsKCmlmICgoJGRhdGEgPSBAZmlsZV9nZXRfY29udGVudHMoJGZpbGUpKSA9PT0gZmFsc2UpIHsKJGVycm9yID0gJ1VuYWJsZSB0byByZWFkIGluaTogJy4kZmlsZTsKcmV0dXJuIGZhbHNlOwp9CgppZiAoUHJlZzo6aXNNYXRjaFdpdGhPZmZzZXRzKCRzZWN0aW9uUmVnZXgsICRkYXRhLCAkbWF0Y2hlcykpIHsKJGRhdGEgPSBzdWJzdHIoJGRhdGEsIDAsICRtYXRjaGVzWzBdWzFdKTsKfQokY29udGVudCAuPSBQcmVnOjpyZXBsYWNlKCR4ZGVidWdSZWdleCwgJzskMScsICRkYXRhKS5QSFBfRU9MOwp9CgoKJGNvbmZpZyA9IHBhcnNlX2luaV9zdHJpbmcoJGNvbnRlbnQpOwokbG9hZGVkID0gaW5pX2dldF9hbGwobnVsbCwgZmFsc2UpOwoKaWYgKGZhbHNlID09PSAkY29uZmlnIHx8IGZhbHNlID09PSAkbG9hZGVkKSB7CiRlcnJvciA9ICdVbmFibGUgdG8gcGFyc2UgaW5pIGRhdGEnOwpyZXR1cm4gZmFsc2U7Cn0KCiRjb250ZW50IC49ICR0aGlzLT5tZXJnZUxvYWRlZENvbmZpZygkbG9hZGVkLCAkY29uZmlnKTsKCgokY29udGVudCAuPSAnb3BjYWNoZS5lbmFibGVfY2xpPTAnLlBIUF9FT0w7CgpyZXR1cm4gKGJvb2wpIEBmaWxlX3B1dF9jb250ZW50cygkdG1wRmlsZSwgJGNvbnRlbnQpOwp9CgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbW1hbmQoYXJyYXkgJGFyZ3YsIHN0cmluZyAkdG1wSW5pLCBzdHJpbmcgJG1haW5TY3JpcHQpOiBhcnJheQp7CiRwaHAgPSBbUEhQX0JJTkFSWV07CiRhcmdzID0gYXJyYXlfc2xpY2UoJGFyZ3YsIDEpOwoKaWYgKCEkdGhpcy0+cGVyc2lzdGVudCkgewoKYXJyYXlfcHVzaCgkcGhwLCAnLW4nLCAnLWMnLCAkdG1wSW5pKTsKfQoKcmV0dXJuIGFycmF5X21lcmdlKCRwaHAsIFskbWFpblNjcmlwdF0sICRhcmdzKTsKfQoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0RW52aXJvbm1lbnQoYm9vbCAkc2Nhbm5lZEluaXMsIGFycmF5ICRpbmlGaWxlcywgc3RyaW5nICR0bXBJbmkpOiBib29sCnsKJHNjYW5EaXIgPSBnZXRlbnYoJ1BIUF9JTklfU0NBTl9ESVInKTsKJHBocHJjID0gZ2V0ZW52KCdQSFBSQycpOwoKCmlmICghcHV0ZW52KCR0aGlzLT5lbnZPcmlnaW5hbEluaXMuJz0nLmltcGxvZGUoUEFUSF9TRVBBUkFUT1IsICRpbmlGaWxlcykpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5wZXJzaXN0ZW50KSB7CgppZiAoIXB1dGVudignUEhQX0lOSV9TQ0FOX0RJUj0nKSB8fCAhcHV0ZW52KCdQSFBSQz0nLiR0bXBJbmkpKSB7CnJldHVybiBmYWxzZTsKfQp9CgoKJGVudkFyZ3MgPSBbCnNlbGY6OlJFU1RBUlRfSUQsCnNlbGY6OiR4ZGVidWdWZXJzaW9uLAooaW50KSAkc2Nhbm5lZEluaXMsCmZhbHNlID09PSAkc2NhbkRpciA/ICcqJyA6ICRzY2FuRGlyLApmYWxzZSA9PT0gJHBocHJjID8gJyonIDogJHBocHJjLApdOwoKcmV0dXJuIHB1dGVudigkdGhpcy0+ZW52QWxsb3dYZGVidWcuJz0nLmltcGxvZGUoJ3wnLCAkZW52QXJncykpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5vdGlmeShzdHJpbmcgJG9wLCA/c3RyaW5nICRkYXRhID0gbnVsbCk6IHZvaWQKewokdGhpcy0+c3RhdHVzV3JpdGVyLT5yZXBvcnQoJG9wLCAkZGF0YSk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIG1lcmdlTG9hZGVkQ29uZmlnKGFycmF5ICRsb2FkZWRDb25maWcsIGFycmF5ICRpbmlDb25maWcpOiBzdHJpbmcKewokY29udGVudCA9ICcnOwoKZm9yZWFjaCAoJGxvYWRlZENvbmZpZyBhcyAkbmFtZSA9PiAkdmFsdWUpIHsKCmlmICghaXNfc3RyaW5nKCR2YWx1ZSkKfHwgc3RycG9zKCRuYW1lLCAneGRlYnVnJykgPT09IDAKfHwgJG5hbWUgPT09ICdhcGMubW1hcF9maWxlX21hc2snKSB7CmNvbnRpbnVlOwp9CgppZiAoIWlzc2V0KCRpbmlDb25maWdbJG5hbWVdKSB8fCAkaW5pQ29uZmlnWyRuYW1lXSAhPT0gJHZhbHVlKSB7CgokY29udGVudCAuPSAkbmFtZS4nPSInLmFkZGNzbGFzaGVzKCR2YWx1ZSwgJ1xcIicpLiciJy5QSFBfRU9MOwp9Cn0KCnJldHVybiAkY29udGVudDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrTWFpblNjcmlwdChzdHJpbmcgJiRtYWluU2NyaXB0LCBhcnJheSAkYXJndik6IGJvb2wKewppZiAoJG1haW5TY3JpcHQgIT09ICcnKSB7CgpyZXR1cm4gZmlsZV9leGlzdHMoJG1haW5TY3JpcHQpIHx8ICctLScgPT09ICRtYWluU2NyaXB0Owp9CgppZiAoZmlsZV9leGlzdHMoJG1haW5TY3JpcHQgPSAkYXJndlswXSkpIHsKcmV0dXJuIHRydWU7Cn0KCgokdHJhY2UgPSBkZWJ1Z19iYWNrdHJhY2UoREVCVUdfQkFDS1RSQUNFX0lHTk9SRV9BUkdTKTsKJG1haW4gPSBlbmQoJHRyYWNlKTsKCmlmICgkbWFpbiAhPT0gZmFsc2UgJiYgaXNzZXQoJG1haW5bJ2ZpbGUnXSkpIHsKcmV0dXJuIGZpbGVfZXhpc3RzKCRtYWluU2NyaXB0ID0gJG1haW5bJ2ZpbGUnXSk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNldEVudlJlc3RhcnRTZXR0aW5ncyhhcnJheSAkZW52QXJncyk6IHZvaWQKewokc2V0dGluZ3MgPSBbCnBocF9pbmlfbG9hZGVkX2ZpbGUoKSwKJGVudkFyZ3NbMl0sCiRlbnZBcmdzWzNdLAokZW52QXJnc1s0XSwKZ2V0ZW52KCR0aGlzLT5lbnZPcmlnaW5hbEluaXMpLApzZWxmOjokc2tpcHBlZCwKXTsKClByb2Nlc3M6OnNldEVudihzZWxmOjpSRVNUQVJUX1NFVFRJTkdTLCBpbXBsb2RlKCd8JywgJHNldHRpbmdzKSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBzeW5jU2V0dGluZ3MoYXJyYXkgJHNldHRpbmdzKTogdm9pZAp7CmlmIChmYWxzZSA9PT0gZ2V0ZW52KCR0aGlzLT5lbnZPcmlnaW5hbEluaXMpKSB7CgpQcm9jZXNzOjpzZXRFbnYoJHRoaXMtPmVudk9yaWdpbmFsSW5pcywgaW1wbG9kZShQQVRIX1NFUEFSQVRPUiwgJHNldHRpbmdzWydpbmlzJ10pKTsKfQoKc2VsZjo6JHNraXBwZWQgPSAkc2V0dGluZ3NbJ3NraXBwZWQnXTsKJHRoaXMtPm5vdGlmeShTdGF0dXM6OklORk8sICdQcm9jZXNzIGNhbGxlZCB3aXRoIGV4aXN0aW5nIHJlc3RhcnQgc2V0dGluZ3MnKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBjaGVja0NvbmZpZ3VyYXRpb24oP3N0cmluZyAmJGluZm8pOiBib29sCnsKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CiRpbmZvID0gJ3Byb2Nfb3BlbiBmdW5jdGlvbiBpcyBkaXNhYmxlZCc7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFmaWxlX2V4aXN0cyhQSFBfQklOQVJZKSkgewokaW5mbyA9ICdQSFBfQklOQVJZIGlzIG5vdCBhdmFpbGFibGUnOwpyZXR1cm4gZmFsc2U7Cn0KCmlmIChleHRlbnNpb25fbG9hZGVkKCd1b3B6JykgJiYgISgoYm9vbCkgaW5pX2dldCgndW9wei5kaXNhYmxlJykpKSB7CgppZiAoZnVuY3Rpb25fZXhpc3RzKCd1b3B6X2FsbG93X2V4aXQnKSkgewpAdW9wel9hbGxvd19leGl0KHRydWUpOwp9IGVsc2UgewokaW5mbyA9ICd1b3B6IGV4dGVuc2lvbiBpcyBub3QgY29tcGF0aWJsZSc7CnJldHVybiBmYWxzZTsKfQp9CgoKaWYgKGRlZmluZWQoJ1BIUF9XSU5ET1dTX1ZFUlNJT05fQlVJTEQnKSAmJiBQSFBfVkVSU0lPTl9JRCA8IDcwNDAwKSB7CiR3b3JraW5nRGlyID0gZ2V0Y3dkKCk7CgppZiAoJHdvcmtpbmdEaXIgPT09IGZhbHNlKSB7CiRpbmZvID0gJ3VuYWJsZSB0byBkZXRlcm1pbmUgd29ya2luZyBkaXJlY3RvcnknOwpyZXR1cm4gZmFsc2U7Cn0KCmlmICgwID09PSBzdHJwb3MoJHdvcmtpbmdEaXIsICdcXFxcJykpIHsKJGluZm8gPSAnY21kLmV4ZSBkb2VzIG5vdCBzdXBwb3J0IFVOQyBwYXRoczogJy4kd29ya2luZ0RpcjsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gdHJ5RW5hYmxlU2lnbmFscygpOiB2b2lkCnsKaWYgKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfYXN5bmNfc2lnbmFscycpICYmIGZ1bmN0aW9uX2V4aXN0cygncGNudGxfc2lnbmFsJykpIHsKcGNudGxfYXN5bmNfc2lnbmFscyh0cnVlKTsKJG1lc3NhZ2UgPSAnQXN5bmMgc2lnbmFscyBlbmFibGVkJzsKCmlmICghc2VsZjo6JGluUmVzdGFydCkgewoKcGNudGxfc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7Cn0gZWxzZWlmIChpc19pbnQocGNudGxfc2lnbmFsX2dldF9oYW5kbGVyKFNJR0lOVCkpKSB7CgpwY250bF9zaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKfQp9CgppZiAoIXNlbGY6OiRpblJlc3RhcnQgJiYgZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcicpKSB7CgoKCnNhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyKGZ1bmN0aW9uICgkZXZ0KSB7fSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNoZWNrU2VydmVyQXJndigpOiA/YXJyYXkKewokcmVzdWx0ID0gW107CgppZiAoaXNzZXQoJF9TRVJWRVJbJ2FyZ3YnXSkgJiYgaXNfYXJyYXkoJF9TRVJWRVJbJ2FyZ3YnXSkpIHsKZm9yZWFjaCAoJF9TRVJWRVJbJ2FyZ3YnXSBhcyAkdmFsdWUpIHsKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewpyZXR1cm4gbnVsbDsKfQoKJHJlc3VsdFtdID0gJHZhbHVlOwp9Cn0KCnJldHVybiBjb3VudCgkcmVzdWx0KSA+IDAgPyAkcmVzdWx0IDogbnVsbDsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gc2V0WGRlYnVnRGV0YWlscygpOiB2b2lkCnsKaWYgKHNlbGY6OiR4ZGVidWdBY3RpdmUgIT09IG51bGwpIHsKcmV0dXJuOwp9CgpzZWxmOjokeGRlYnVnQWN0aXZlID0gZmFsc2U7CmlmICghZXh0ZW5zaW9uX2xvYWRlZCgneGRlYnVnJykpIHsKcmV0dXJuOwp9CgokdmVyc2lvbiA9IHBocHZlcnNpb24oJ3hkZWJ1ZycpOwpzZWxmOjokeGRlYnVnVmVyc2lvbiA9ICR2ZXJzaW9uICE9PSBmYWxzZSA/ICR2ZXJzaW9uIDogJ3Vua25vd24nOwoKaWYgKHZlcnNpb25fY29tcGFyZShzZWxmOjokeGRlYnVnVmVyc2lvbiwgJzMuMScsICc+PScpKSB7CiRtb2RlcyA9IHhkZWJ1Z19pbmZvKCdtb2RlJyk7CnNlbGY6OiR4ZGVidWdNb2RlID0gY291bnQoJG1vZGVzKSA9PT0gMCA/ICdvZmYnIDogaW1wbG9kZSgnLCcsICRtb2Rlcyk7CnNlbGY6OiR4ZGVidWdBY3RpdmUgPSBzZWxmOjokeGRlYnVnTW9kZSAhPT0gJ29mZic7CnJldHVybjsKfQoKCiRpbmlNb2RlID0gaW5pX2dldCgneGRlYnVnLm1vZGUnKTsKaWYgKCRpbmlNb2RlID09PSBmYWxzZSkgewpzZWxmOjokeGRlYnVnQWN0aXZlID0gdHJ1ZTsKcmV0dXJuOwp9CgoKJGVudk1vZGUgPSAoc3RyaW5nKSBnZXRlbnYoJ1hERUJVR19NT0RFJyk7CmlmICgkZW52TW9kZSAhPT0gJycpIHsKc2VsZjo6JHhkZWJ1Z01vZGUgPSAkZW52TW9kZTsKfSBlbHNlIHsKc2VsZjo6JHhkZWJ1Z01vZGUgPSAkaW5pTW9kZSAhPT0gJycgPyAkaW5pTW9kZSA6ICdvZmYnOwp9CgoKaWYgKFByZWc6OmlzTWF0Y2goJy9eLCskLycsIHN0cl9yZXBsYWNlKCcgJywgJycsIHNlbGY6OiR4ZGVidWdNb2RlKSkpIHsKc2VsZjo6JHhkZWJ1Z01vZGUgPSAnb2ZmJzsKfQoKc2VsZjo6JHhkZWJ1Z0FjdGl2ZSA9IHNlbGY6OiR4ZGVidWdNb2RlICE9PSAnb2ZmJzsKfQp9CgpNSVQgTGljZW5zZQoKQ29weXJpZ2h0IChjKSAyMDE2CgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFClNPRlRXQVJFLgoKPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKY2xhc3MgQ29uc3RyYWludEVycm9yIGV4dGVuZHMgRW51bQp7CnB1YmxpYyBjb25zdCBBRERJVElPTkFMX0lURU1TID0gJ2FkZGl0aW9uYWxJdGVtcyc7CnB1YmxpYyBjb25zdCBBRERJVElPTkFMX1BST1BFUlRJRVMgPSAnYWRkaXRpb25hbFByb3AnOwpwdWJsaWMgY29uc3QgQUxMX09GID0gJ2FsbE9mJzsKcHVibGljIGNvbnN0IEFOWV9PRiA9ICdhbnlPZic7CnB1YmxpYyBjb25zdCBERVBFTkRFTkNJRVMgPSAnZGVwZW5kZW5jaWVzJzsKcHVibGljIGNvbnN0IERJU0FMTE9XID0gJ2Rpc2FsbG93JzsKcHVibGljIGNvbnN0IERJVklTSUJMRV9CWSA9ICdkaXZpc2libGVCeSc7CnB1YmxpYyBjb25zdCBFTlVNID0gJ2VudW0nOwpwdWJsaWMgY29uc3QgQ09OU1RBTlQgPSAnY29uc3QnOwpwdWJsaWMgY29uc3QgQ09OVEFJTlMgPSAnY29udGFpbnMnOwpwdWJsaWMgY29uc3QgRVhDTFVTSVZFX01JTklNVU0gPSAnZXhjbHVzaXZlTWluaW11bSc7CnB1YmxpYyBjb25zdCBFWENMVVNJVkVfTUFYSU1VTSA9ICdleGNsdXNpdmVNYXhpbXVtJzsKcHVibGljIGNvbnN0IEZBTFNFID0gJ2ZhbHNlJzsKcHVibGljIGNvbnN0IEZPUk1BVF9DT0xPUiA9ICdjb2xvckZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfREFURSA9ICdkYXRlRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9EQVRFX1RJTUUgPSAnZGF0ZVRpbWVGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX0RBVEVfVVRDID0gJ2RhdGVVdGNGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX0VNQUlMID0gJ2VtYWlsRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9IT1NUTkFNRSA9ICdzdHlsZUhvc3ROYW1lJzsKcHVibGljIGNvbnN0IEZPUk1BVF9JUCA9ICdpcEZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfSlNPTl9QT0lOVEVSID0gJ2pzb25Qb2ludGVyRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9QSE9ORSA9ICdwaG9uZUZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfUkVHRVg9ICdyZWdleEZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfU1RZTEUgPSAnc3R5bGVGb3JtYXQnOwpwdWJsaWMgY29uc3QgRk9STUFUX1RJTUUgPSAndGltZUZvcm1hdCc7CnB1YmxpYyBjb25zdCBGT1JNQVRfVVJJX1RFTVBMQVRFID0gJ3VyaVRlbXBsYXRlRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9VUkwgPSAndXJsRm9ybWF0JzsKcHVibGljIGNvbnN0IEZPUk1BVF9VUkxfUkVGID0gJ3VybFJlZkZvcm1hdCc7CnB1YmxpYyBjb25zdCBJTlZBTElEX1NDSEVNQSA9ICdpbnZhbGlkU2NoZW1hJzsKcHVibGljIGNvbnN0IExFTkdUSF9NQVggPSAnbWF4TGVuZ3RoJzsKcHVibGljIGNvbnN0IExFTkdUSF9NSU4gPSAnbWluTGVuZ3RoJzsKcHVibGljIGNvbnN0IE1BWElNVU0gPSAnbWF4aW11bSc7CnB1YmxpYyBjb25zdCBNSU5fSVRFTVMgPSAnbWluSXRlbXMnOwpwdWJsaWMgY29uc3QgTUlOSU1VTSA9ICdtaW5pbXVtJzsKcHVibGljIGNvbnN0IE1JU1NJTkdfRVJST1IgPSAnbWlzc2luZ0Vycm9yJzsKcHVibGljIGNvbnN0IE1JU1NJTkdfTUFYSU1VTSA9ICdtaXNzaW5nTWF4aW11bSc7CnB1YmxpYyBjb25zdCBNSVNTSU5HX01JTklNVU0gPSAnbWlzc2luZ01pbmltdW0nOwpwdWJsaWMgY29uc3QgTUFYX0lURU1TID0gJ21heEl0ZW1zJzsKcHVibGljIGNvbnN0IE1VTFRJUExFX09GID0gJ211bHRpcGxlT2YnOwpwdWJsaWMgY29uc3QgTk9UID0gJ25vdCc7CnB1YmxpYyBjb25zdCBPTkVfT0YgPSAnb25lT2YnOwpwdWJsaWMgY29uc3QgUkVRVUlSRUQgPSAncmVxdWlyZWQnOwpwdWJsaWMgY29uc3QgUkVRVUlSRVMgPSAncmVxdWlyZXMnOwpwdWJsaWMgY29uc3QgUEFUVEVSTiA9ICdwYXR0ZXJuJzsKcHVibGljIGNvbnN0IFBSRUdFWF9JTlZBTElEID0gJ3ByZWdyZXgnOwpwdWJsaWMgY29uc3QgUFJPUEVSVElFU19NSU4gPSAnbWluUHJvcGVydGllcyc7CnB1YmxpYyBjb25zdCBQUk9QRVJUSUVTX01BWCA9ICdtYXhQcm9wZXJ0aWVzJzsKcHVibGljIGNvbnN0IFBST1BFUlRZX05BTUVTID0gJ3Byb3BlcnR5TmFtZXMnOwpwdWJsaWMgY29uc3QgVFlQRSA9ICd0eXBlJzsKcHVibGljIGNvbnN0IFVOSVFVRV9JVEVNUyA9ICd1bmlxdWVJdGVtcyc7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWVzc2FnZSgpCnsKJG5hbWUgPSAkdGhpcy0+Z2V0VmFsdWUoKTsKc3RhdGljICRtZXNzYWdlcyA9IFsKc2VsZjo6QURESVRJT05BTF9JVEVNUyA9PiAnVGhlIGl0ZW0gJXNbJXNdIGlzIG5vdCBkZWZpbmVkIGFuZCB0aGUgZGVmaW5pdGlvbiBkb2VzIG5vdCBhbGxvdyBhZGRpdGlvbmFsIGl0ZW1zJywKc2VsZjo6QURESVRJT05BTF9QUk9QRVJUSUVTID0+ICdUaGUgcHJvcGVydHkgJXMgaXMgbm90IGRlZmluZWQgYW5kIHRoZSBkZWZpbml0aW9uIGRvZXMgbm90IGFsbG93IGFkZGl0aW9uYWwgcHJvcGVydGllcycsCnNlbGY6OkFMTF9PRiA9PiAnRmFpbGVkIHRvIG1hdGNoIGFsbCBzY2hlbWFzJywKc2VsZjo6QU5ZX09GID0+ICdGYWlsZWQgdG8gbWF0Y2ggYXQgbGVhc3Qgb25lIHNjaGVtYScsCnNlbGY6OkRFUEVOREVOQ0lFUyA9PiAnJXMgZGVwZW5kcyBvbiAlcywgd2hpY2ggaXMgbWlzc2luZycsCnNlbGY6OkRJU0FMTE9XID0+ICdEaXNhbGxvd2VkIHZhbHVlIHdhcyBtYXRjaGVkJywKc2VsZjo6RElWSVNJQkxFX0JZID0+ICdJcyBub3QgZGl2aXNpYmxlIGJ5ICVkJywKc2VsZjo6RU5VTSA9PiAnRG9lcyBub3QgaGF2ZSBhIHZhbHVlIGluIHRoZSBlbnVtZXJhdGlvbiAlcycsCnNlbGY6OkNPTlNUQU5UID0+ICdEb2VzIG5vdCBoYXZlIGEgdmFsdWUgZXF1YWwgdG8gJXMnLApzZWxmOjpDT05UQUlOUyA9PiAnRG9lcyBub3QgaGF2ZSBhIHZhbHVlIHZhbGlkIHRvIGNvbnRhaW5zIHNjaGVtYScsCnNlbGY6OkVYQ0xVU0lWRV9NSU5JTVVNID0+ICdNdXN0IGhhdmUgYSBtaW5pbXVtIHZhbHVlIGdyZWF0ZXIgdGhhbiAlZCcsCnNlbGY6OkVYQ0xVU0lWRV9NQVhJTVVNID0+ICdNdXN0IGhhdmUgYSBtYXhpbXVtIHZhbHVlIGxlc3MgdGhhbiAlZCcsCnNlbGY6OkZBTFNFID0+ICdCb29sZWFuIHNjaGVtYSBmYWxzZScsCnNlbGY6OkZPUk1BVF9DT0xPUiA9PiAnSW52YWxpZCBjb2xvcicsCnNlbGY6OkZPUk1BVF9EQVRFID0+ICdJbnZhbGlkIGRhdGUgJXMsIGV4cGVjdGVkIGZvcm1hdCBZWVlZLU1NLUREJywKc2VsZjo6Rk9STUFUX0RBVEVfVElNRSA9PiAnSW52YWxpZCBkYXRlLXRpbWUgJXMsIGV4cGVjdGVkIGZvcm1hdCBZWVlZLU1NLUREVGhoOm1tOnNzWiBvciBZWVlZLU1NLUREVGhoOm1tOnNzK2hoOm1tJywKc2VsZjo6Rk9STUFUX0RBVEVfVVRDID0+ICdJbnZhbGlkIHRpbWUgJXMsIGV4cGVjdGVkIGludGVnZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIEVwb2NoJywKc2VsZjo6Rk9STUFUX0VNQUlMID0+ICdJbnZhbGlkIGVtYWlsJywKc2VsZjo6Rk9STUFUX0hPU1ROQU1FID0+ICdJbnZhbGlkIGhvc3RuYW1lJywKc2VsZjo6Rk9STUFUX0lQID0+ICdJbnZhbGlkIElQIGFkZHJlc3MnLApzZWxmOjpGT1JNQVRfSlNPTl9QT0lOVEVSID0+ICdJbnZhbGlkIEpTT04gcG9pbnRlcicsCnNlbGY6OkZPUk1BVF9QSE9ORSA9PiAnSW52YWxpZCBwaG9uZSBudW1iZXInLApzZWxmOjpGT1JNQVRfUkVHRVg9PiAnSW52YWxpZCByZWdleCBmb3JtYXQgJXMnLApzZWxmOjpGT1JNQVRfU1RZTEUgPT4gJ0ludmFsaWQgc3R5bGUnLApzZWxmOjpGT1JNQVRfVElNRSA9PiAnSW52YWxpZCB0aW1lICVzLCBleHBlY3RlZCBmb3JtYXQgaGg6bW06c3MnLApzZWxmOjpGT1JNQVRfVVJJX1RFTVBMQVRFID0+ICdJbnZhbGlkIFVSSSB0ZW1wbGF0ZSBmb3JtYXQnLApzZWxmOjpGT1JNQVRfVVJMID0+ICdJbnZhbGlkIFVSTCBmb3JtYXQnLApzZWxmOjpGT1JNQVRfVVJMX1JFRiA9PiAnSW52YWxpZCBVUkwgcmVmZXJlbmNlIGZvcm1hdCcsCnNlbGY6OkxFTkdUSF9NQVggPT4gJ011c3QgYmUgYXQgbW9zdCAlZCBjaGFyYWN0ZXJzIGxvbmcnLApzZWxmOjpJTlZBTElEX1NDSEVNQSA9PiAnU2NoZW1hIGlzIG5vdCB2YWxpZCcsCnNlbGY6OkxFTkdUSF9NSU4gPT4gJ011c3QgYmUgYXQgbGVhc3QgJWQgY2hhcmFjdGVycyBsb25nJywKc2VsZjo6TUFYX0lURU1TID0+ICdUaGVyZSBtdXN0IGJlIGEgbWF4aW11bSBvZiAlZCBpdGVtcyBpbiB0aGUgYXJyYXksICVkIGZvdW5kJywKc2VsZjo6TUFYSU1VTSA9PiAnTXVzdCBoYXZlIGEgbWF4aW11bSB2YWx1ZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJWQnLApzZWxmOjpNSU5fSVRFTVMgPT4gJ1RoZXJlIG11c3QgYmUgYSBtaW5pbXVtIG9mICVkIGl0ZW1zIGluIHRoZSBhcnJheSwgJWQgZm91bmQnLApzZWxmOjpNSU5JTVVNID0+ICdNdXN0IGhhdmUgYSBtaW5pbXVtIHZhbHVlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlZCcsCnNlbGY6Ok1JU1NJTkdfTUFYSU1VTSA9PiAnVXNlIG9mIGV4Y2x1c2l2ZU1heGltdW0gcmVxdWlyZXMgcHJlc2VuY2Ugb2YgbWF4aW11bScsCnNlbGY6Ok1JU1NJTkdfTUlOSU1VTSA9PiAnVXNlIG9mIGV4Y2x1c2l2ZU1pbmltdW0gcmVxdWlyZXMgcHJlc2VuY2Ugb2YgbWluaW11bScsCgpzZWxmOjpNVUxUSVBMRV9PRiA9PiAnTXVzdCBiZSBhIG11bHRpcGxlIG9mICVzJywKc2VsZjo6Tk9UID0+ICdNYXRjaGVkIGEgc2NoZW1hIHdoaWNoIGl0IHNob3VsZCBub3QnLApzZWxmOjpPTkVfT0YgPT4gJ0ZhaWxlZCB0byBtYXRjaCBleGFjdGx5IG9uZSBzY2hlbWEnLApzZWxmOjpSRVFVSVJFRCA9PiAnVGhlIHByb3BlcnR5ICVzIGlzIHJlcXVpcmVkJywKc2VsZjo6UkVRVUlSRVMgPT4gJ1RoZSBwcmVzZW5jZSBvZiB0aGUgcHJvcGVydHkgJXMgcmVxdWlyZXMgdGhhdCAlcyBhbHNvIGJlIHByZXNlbnQnLApzZWxmOjpQQVRURVJOID0+ICdEb2VzIG5vdCBtYXRjaCB0aGUgcmVnZXggcGF0dGVybiAlcycsCnNlbGY6OlBSRUdFWF9JTlZBTElEID0+ICdUaGUgcGF0dGVybiAlcyBpcyBpbnZhbGlkJywKc2VsZjo6UFJPUEVSVElFU19NSU4gPT4gJ011c3QgY29udGFpbiBhIG1pbmltdW0gb2YgJWQgcHJvcGVydGllcycsCnNlbGY6OlBST1BFUlRJRVNfTUFYID0+ICdNdXN0IGNvbnRhaW4gbm8gbW9yZSB0aGFuICVkIHByb3BlcnRpZXMnLApzZWxmOjpQUk9QRVJUWV9OQU1FUyA9PiAnUHJvcGVydHkgbmFtZSAlcyBpcyBpbnZhbGlkJywKc2VsZjo6VFlQRSA9PiAnJXMgdmFsdWUgZm91bmQsIGJ1dCAlcyBpcyByZXF1aXJlZCcsCnNlbGY6OlVOSVFVRV9JVEVNUyA9PiAnVGhlcmUgYXJlIG5vIGR1cGxpY2F0ZXMgYWxsb3dlZCBpbiB0aGUgYXJyYXknCl07CgppZiAoIWlzc2V0KCRtZXNzYWdlc1skbmFtZV0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ01pc3NpbmcgZXJyb3IgbWVzc2FnZSBmb3IgJyAuICRuYW1lKTsKfQoKcmV0dXJuICRtZXNzYWdlc1skbmFtZV07Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBjb25zdCBKU09OX0VSUk9SX05PTkU7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCmNsYXNzIEJhc2VDb25zdHJhaW50CnsKCgoKcHJvdGVjdGVkICRlcnJvcnMgPSBbXTsKCgoKCgpwcm90ZWN0ZWQgJGVycm9yTWFzayA9IFZhbGlkYXRvcjo6RVJST1JfTk9ORTsKCgoKCnByb3RlY3RlZCAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3IoQ29uc3RyYWludEVycm9yICRjb25zdHJhaW50LCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCBhcnJheSAkbW9yZSA9IFtdKTogdm9pZAp7CiRtZXNzYWdlID0gJGNvbnN0cmFpbnQtPmdldE1lc3NhZ2UoKTsKJG5hbWUgPSAkY29uc3RyYWludC0+Z2V0VmFsdWUoKTsKJGVycm9yID0gWwoncHJvcGVydHknID0+ICR0aGlzLT5jb252ZXJ0SnNvblBvaW50ZXJJbnRvUHJvcGVydHlQYXRoKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJykpLAoncG9pbnRlcicgPT4gbHRyaW0oKHN0cmluZykgKCRwYXRoID86IG5ldyBKc29uUG9pbnRlcignJykpLCAnIycpLAonbWVzc2FnZScgPT4gdWNmaXJzdCh2c3ByaW50ZigkbWVzc2FnZSwgYXJyYXlfbWFwKHN0YXRpYyBmdW5jdGlvbiAoJHZhbCkgewppZiAoaXNfc2NhbGFyKCR2YWwpKSB7CnJldHVybiBpc19ib29sKCR2YWwpID8gdmFyX2V4cG9ydCgkdmFsLCB0cnVlKSA6ICR2YWw7Cn0KCnJldHVybiBqc29uX2VuY29kZSgkdmFsKTsKfSwgYXJyYXlfdmFsdWVzKCRtb3JlKSkpKSwKJ2NvbnN0cmFpbnQnID0+IFsKJ25hbWUnID0+ICRuYW1lLAoncGFyYW1zJyA9PiAkbW9yZQpdLAonY29udGV4dCcgPT4gJHRoaXMtPmZhY3RvcnktPmdldEVycm9yQ29udGV4dCgpLApdOwoKaWYgKCR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9FWENFUFRJT05TKSkgewp0aHJvdyBuZXcgVmFsaWRhdGlvbkV4Y2VwdGlvbihzcHJpbnRmKCdFcnJvciB2YWxpZGF0aW5nICVzOiAlcycsICRlcnJvclsncG9pbnRlciddLCAkZXJyb3JbJ21lc3NhZ2UnXSkpOwp9CgokdGhpcy0+ZXJyb3JzW10gPSAkZXJyb3I7CiR0aGlzLT5lcnJvck1hc2sgfD0gJGVycm9yWydjb250ZXh0J107Cn0KCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcnMoYXJyYXkgJGVycm9ycyk6IHZvaWQKewppZiAoJGVycm9ycykgewokdGhpcy0+ZXJyb3JzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmVycm9ycywgJGVycm9ycyk7CiRlcnJvck1hc2sgPSAmJHRoaXMtPmVycm9yTWFzazsKYXJyYXlfd2FsaygkZXJyb3JzLCBzdGF0aWMgZnVuY3Rpb24gKCRlcnJvcikgdXNlICgmJGVycm9yTWFzaykgewppZiAoaXNzZXQoJGVycm9yWydjb250ZXh0J10pKSB7CiRlcnJvck1hc2sgfD0gJGVycm9yWydjb250ZXh0J107Cn0KfSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycyhpbnQgJGVycm9yQ29udGV4dCA9IFZhbGlkYXRvcjo6RVJST1JfQUxMKTogYXJyYXkKewppZiAoJGVycm9yQ29udGV4dCA9PT0gVmFsaWRhdG9yOjpFUlJPUl9BTEwpIHsKcmV0dXJuICR0aGlzLT5lcnJvcnM7Cn0KCnJldHVybiBhcnJheV9maWx0ZXIoJHRoaXMtPmVycm9ycywgc3RhdGljIGZ1bmN0aW9uICgkZXJyb3IpIHVzZSAoJGVycm9yQ29udGV4dCkgewpyZXR1cm4gKGJvb2wpICgkZXJyb3JDb250ZXh0ICYgJGVycm9yWydjb250ZXh0J10pOwp9KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG51bUVycm9ycyhpbnQgJGVycm9yQ29udGV4dCA9IFZhbGlkYXRvcjo6RVJST1JfQUxMKTogaW50CnsKaWYgKCRlcnJvckNvbnRleHQgPT09IFZhbGlkYXRvcjo6RVJST1JfQUxMKSB7CnJldHVybiBjb3VudCgkdGhpcy0+ZXJyb3JzKTsKfQoKcmV0dXJuIGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoJGVycm9yQ29udGV4dCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgpOiBib29sCnsKcmV0dXJuICEkdGhpcy0+Z2V0RXJyb3JzKCk7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzZXQoKTogdm9pZAp7CiR0aGlzLT5lcnJvcnMgPSBbXTsKJHRoaXMtPmVycm9yTWFzayA9IFZhbGlkYXRvcjo6RVJST1JfTk9ORTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3JNYXNrKCk6IGludAp7CnJldHVybiAkdGhpcy0+ZXJyb3JNYXNrOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5VG9PYmplY3RSZWN1cnNpdmUoYXJyYXkgJGFycmF5KTogb2JqZWN0CnsKJGpzb24gPSBqc29uX2VuY29kZSgkYXJyYXkpOwppZiAoanNvbl9sYXN0X2Vycm9yKCkgIT09IEpTT05fRVJST1JfTk9ORSkgewokbWVzc2FnZSA9ICdVbmFibGUgdG8gZW5jb2RlIHNjaGVtYSBhcnJheSBhcyBKU09OJzsKaWYgKGZ1bmN0aW9uX2V4aXN0cygnanNvbl9sYXN0X2Vycm9yX21zZycpKSB7CiRtZXNzYWdlIC49ICc6ICcgLiBqc29uX2xhc3RfZXJyb3JfbXNnKCk7Cn0KdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KCnJldHVybiAob2JqZWN0KSBqc29uX2RlY29kZSgkanNvbiwgZmFsc2UpOwp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGpzb25QYXR0ZXJuVG9QaHBSZWdleChzdHJpbmcgJHBhdHRlcm4pOiBzdHJpbmcKewpyZXR1cm4gJ34nIC4gc3RyX3JlcGxhY2UoJ34nLCAnXFx+JywgJHBhdHRlcm4pIC4gJ351JzsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbnZlcnRKc29uUG9pbnRlckludG9Qcm9wZXJ0eVBhdGgoSnNvblBvaW50ZXIgJHBvaW50ZXIpOiBzdHJpbmcKewokcmVzdWx0ID0gYXJyYXlfbWFwKApzdGF0aWMgZnVuY3Rpb24gKCRwYXRoKSB7CnJldHVybiBzcHJpbnRmKGlzX251bWVyaWMoJHBhdGgpID8gJ1slZF0nIDogJy4lcycsICRwYXRoKTsKfSwKJHBvaW50ZXItPmdldFByb3BlcnR5UGF0aHMoKQopOwoKcmV0dXJuIHRyaW0oaW1wbG9kZSgnJywgJHJlc3VsdCksICcuJyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxEZWVwQ29tcGFyZXI7CgoKCgoKCgpjbGFzcyBDb2xsZWN0aW9uQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKGlzc2V0KCRzY2hlbWEtPm1pbkl0ZW1zKSAmJiBjb3VudCgkdmFsdWUpIDwgJHNjaGVtYS0+bWluSXRlbXMpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlOX0lURU1TKCksICRwYXRoLCBbJ21pbkl0ZW1zJyA9PiAkc2NoZW1hLT5taW5JdGVtcywgJ2ZvdW5kJyA9PiBjb3VudCgkdmFsdWUpXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+bWF4SXRlbXMpICYmIGNvdW50KCR2YWx1ZSkgPiAkc2NoZW1hLT5tYXhJdGVtcykgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhfSVRFTVMoKSwgJHBhdGgsIFsnbWF4SXRlbXMnID0+ICRzY2hlbWEtPm1heEl0ZW1zLCAnZm91bmQnID0+IGNvdW50KCR2YWx1ZSldKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT51bmlxdWVJdGVtcykgJiYgJHNjaGVtYS0+dW5pcXVlSXRlbXMpIHsKJGNvdW50ID0gY291bnQoJHZhbHVlKTsKZm9yICgkeCA9IDA7ICR4IDwgJGNvdW50IC0gMTsgJHgrKykgewpmb3IgKCR5ID0gJHggKyAxOyAkeSA8ICRjb3VudDsgJHkrKykgewppZiAoRGVlcENvbXBhcmVyOjppc0VxdWFsKCR2YWx1ZVskeF0sICR2YWx1ZVskeV0pKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlVOSVFVRV9JVEVNUygpLCAkcGF0aCk7CmJyZWFrIDI7Cn0KfQp9Cn0KCiR0aGlzLT52YWxpZGF0ZUl0ZW1zKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZUl0ZW1zKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKFxpc19udWxsKCRzY2hlbWEpIHx8ICFpc3NldCgkc2NoZW1hLT5pdGVtcykpIHsKcmV0dXJuOwp9CgppZiAoJHNjaGVtYS0+aXRlbXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CgppZiAoaXNfb2JqZWN0KCRzY2hlbWEtPml0ZW1zKSkgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKCgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHYsICRzY2hlbWEtPml0ZW1zLCAkcGF0aCwgJGspOwoKCmlmIChjb3VudCgkaW5pdEVycm9ycykgPCBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpICYmIChpc3NldCgkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMpICYmICRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpKSB7CiRzZWNvbmRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zLCAkcGF0aCwgJGspOwp9CgoKaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpIDwgY291bnQoJHRoaXMtPmdldEVycm9ycygpKSkgewokdGhpcy0+ZXJyb3JzID0gJHNlY29uZEVycm9yczsKfSBlbHNlaWYgKGlzc2V0KCRzZWNvbmRFcnJvcnMpICYmIGNvdW50KCRzZWNvbmRFcnJvcnMpID09PSBjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpKSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CnVuc2V0KCR2KTsgCgp9IGVsc2UgewoKZm9yZWFjaCAoJHZhbHVlIGFzICRrID0+ICYkdikgewppZiAoYXJyYXlfa2V5X2V4aXN0cygkaywgJHNjaGVtYS0+aXRlbXMpKSB7CiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkdiwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9IGVsc2UgewoKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnYWRkaXRpb25hbEl0ZW1zJykpIHsKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyAhPT0gZmFsc2UpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMsICRwYXRoLCAkayk7Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcigKQ29uc3RyYWludEVycm9yOjpBRERJVElPTkFMX0lURU1TKCksCiRwYXRoLApbCidpdGVtJyA9PiAkaSwKJ3Byb3BlcnR5JyA9PiAkaywKJ2FkZGl0aW9uYWxJdGVtcycgPT4gJHNjaGVtYS0+YWRkaXRpb25hbEl0ZW1zCl0KKTsKfQp9IGVsc2UgewoKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2LCBuZXcgXHN0ZENsYXNzKCksICRwYXRoLCAkayk7Cn0KfQp9CnVuc2V0KCR2KTsgCgoKCmlmIChjb3VudCgkdmFsdWUpID4gMCkgewpmb3IgKCRrID0gY291bnQoJHZhbHVlKTsgJGsgPCBjb3VudCgkc2NoZW1hLT5pdGVtcyk7ICRrKyspIHsKJHVuZGVmaW5lZEluc3RhbmNlID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR1bmRlZmluZWRJbnN0YW5jZSwgJHNjaGVtYS0+aXRlbXNbJGtdLCAkcGF0aCwgJGspOwp9Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvbXBhcmVyOwoKCgoKCgpjbGFzcyBDb25zdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKCRlbGVtZW50IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCAmJiAoIWlzc2V0KCRzY2hlbWEtPnJlcXVpcmVkKSB8fCAhJHNjaGVtYS0+cmVxdWlyZWQpKSB7CnJldHVybjsKfQokY29uc3QgPSAkc2NoZW1hLT5jb25zdDsKCiR0eXBlID0gZ2V0dHlwZSgkZWxlbWVudCk7CiRjb25zdFR5cGUgPSBnZXR0eXBlKCRjb25zdCk7CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX1RZUEVfQ0FTVCkgJiYgJHR5cGUgPT09ICdhcnJheScgJiYgJGNvbnN0VHlwZSA9PT0gJ29iamVjdCcpIHsKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgob2JqZWN0KSAkZWxlbWVudCwgJGNvbnN0KSkgewpyZXR1cm47Cn0KfQoKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkZWxlbWVudCwgJGNvbnN0KSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkNPTlNUQU5UKCksICRwYXRoLCBbJ2NvbnN0JyA9PiAkc2NoZW1hLT5jb25zdF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgphYnN0cmFjdCBjbGFzcyBDb25zdHJhaW50IGV4dGVuZHMgQmFzZUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKCnByb3RlY3RlZCAkaW5saW5lU2NoZW1hUHJvcGVydHkgPSAnJHNjaGVtYSc7CgpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9OT05FID0gMHgwMDAwMDAwMDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfTk9STUFMID0gMHgwMDAwMDAwMTsKcHVibGljIGNvbnN0IENIRUNLX01PREVfVFlQRV9DQVNUID0gMHgwMDAwMDAwMjsKcHVibGljIGNvbnN0IENIRUNLX01PREVfQ09FUkNFX1RZUEVTID0gMHgwMDAwMDAwNDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfQVBQTFlfREVGQVVMVFMgPSAweDAwMDAwMDA4OwpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9FWENFUFRJT05TID0gMHgwMDAwMDAxMDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfRElTQUJMRV9GT1JNQVQgPSAweDAwMDAwMDIwOwpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9FQVJMWV9DT0VSQ0UgPSAweDAwMDAwMDQwOwpwdWJsaWMgY29uc3QgQ0hFQ0tfTU9ERV9PTkxZX1JFUVVJUkVEX0RFRkFVTFRTID0gMHgwMDAwMDA4MDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfVkFMSURBVEVfU0NIRU1BID0gMHgwMDAwMDEwMDsKcHVibGljIGNvbnN0IENIRUNLX01PREVfU1RSSUNUID0gMHgwMDAwMDIwMDsKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBpbmNyZW1lbnRQYXRoKD9Kc29uUG9pbnRlciAkcGF0aCwgJGkpOiBKc29uUG9pbnRlcgp7CiRwYXRoID0gJHBhdGggPz8gbmV3IEpzb25Qb2ludGVyKCcnKTsKCmlmICgkaSA9PT0gbnVsbCB8fCAkaSA9PT0gJycpIHsKcmV0dXJuICRwYXRoOwp9CgpyZXR1cm4gJHBhdGgtPndpdGhQcm9wZXJ0eVBhdGhzKAphcnJheV9tZXJnZSgKJHBhdGgtPmdldFByb3BlcnR5UGF0aHMoKSwKWyRpXQopCik7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tBcnJheSgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ2NvbGxlY3Rpb24nKTsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tPYmplY3QoCiYkdmFsdWUsCiRzY2hlbWEgPSBudWxsLAo/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLAokcHJvcGVydGllcyA9IG51bGwsCiRhZGRpdGlvbmFsUHJvcGVydGllcyA9IG51bGwsCiRwYXR0ZXJuUHJvcGVydGllcyA9IG51bGwsCmFycmF5ICRhcHBsaWVkRGVmYXVsdHMgPSBbXQopOiB2b2lkIHsKCiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ29iamVjdCcpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkcHJvcGVydGllcywgJGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAkcGF0dGVyblByb3BlcnRpZXMsICRhcHBsaWVkRGVmYXVsdHMpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tUeXBlKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcigndHlwZScpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja1VuZGVmaW5lZCgmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsLCBib29sICRmcm9tRGVmYXVsdCA9IGZhbHNlKTogdm9pZAp7CgokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKTsKCiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHRoaXMtPmZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKS0+cmVzb2x2ZVJlZlNjaGVtYSgkc2NoZW1hKSwgJHBhdGgsICRpLCAkZnJvbURlZmF1bHQpOwoKJHRoaXMtPmFkZEVycm9ycygkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gY2hlY2tTdHJpbmcoJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3N0cmluZycpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja051bWJlcigkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignbnVtYmVyJyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNoZWNrRW51bSgkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignZW51bScpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0NvbnN0KCR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdjb25zdCcpOwokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgokdGhpcy0+YWRkRXJyb3JzKCR2YWxpZGF0b3ItPmdldEVycm9ycygpKTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0Zvcm1hdCgkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignZm9ybWF0Jyk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0VHlwZUNoZWNrKCk6IFR5cGVDaGVja1xUeXBlQ2hlY2tJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPmZhY3RvcnktPmdldFR5cGVDaGVjaygpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgoKCgoKCmludGVyZmFjZSBDb25zdHJhaW50SW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpOiBhcnJheTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcnMoYXJyYXkgJGVycm9ycyk6IHZvaWQ7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3IoQ29uc3RyYWludEVycm9yICRjb25zdHJhaW50LCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCBhcnJheSAkbW9yZSA9IFtdKTogdm9pZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZhbGlkKCk6IGJvb2w7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZDsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEFkZGl0aW9uYWxJdGVtc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2FkZGl0aW9uYWxJdGVtcycpKSB7CnJldHVybjsKfQoKaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyA9PT0gdHJ1ZSkgewpyZXR1cm47Cn0KaWYgKCRzY2hlbWEtPmFkZGl0aW9uYWxJdGVtcyA9PT0gZmFsc2UgJiYgIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykpIHsKcmV0dXJuOwp9CmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2l0ZW1zJykgJiYgaXNfb2JqZWN0KCRzY2hlbWEtPml0ZW1zKSkgewpyZXR1cm47Cn0KCiRhZGRpdGlvbmFsSXRlbXMgPSBhcnJheV9kaWZmX2tleSgkdmFsdWUsIHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaXRlbXMnKSA/ICRzY2hlbWEtPml0ZW1zIDogW10pOwoKZm9yZWFjaCAoJGFkZGl0aW9uYWxJdGVtcyBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCRwcm9wZXJ0eVZhbHVlLCAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXMsICRwYXRoLCAkaSk7CgppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpjb250aW51ZTsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QURESVRJT05BTF9JVEVNUygpLCAkcGF0aCwgWydpdGVtJyA9PiAkaSwgJ3Byb3BlcnR5JyA9PiAkcHJvcGVydHlOYW1lLCAnYWRkaXRpb25hbEl0ZW1zJyA9PiAkc2NoZW1hLT5hZGRpdGlvbmFsSXRlbXNdKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBBZGRpdGlvbmFsUHJvcGVydGllc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJykpIHsKcmV0dXJuOwp9CgppZiAoJHNjaGVtYS0+YWRkaXRpb25hbFByb3BlcnRpZXMgPT09IHRydWUpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7CgppZiAoaXNzZXQoJHNjaGVtYS0+cHJvcGVydGllcykpIHsKJGFkZGl0aW9uYWxQcm9wZXJ0aWVzID0gYXJyYXlfZGlmZl9rZXkoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAoYXJyYXkpICRzY2hlbWEtPnByb3BlcnRpZXMpOwp9CgppZiAoaXNzZXQoJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMpKSB7CiRwYXR0ZXJucyA9IGFycmF5X2tleXMoZ2V0X29iamVjdF92YXJzKCRzY2hlbWEtPnBhdHRlcm5Qcm9wZXJ0aWVzKSk7Cgpmb3JlYWNoICgkYWRkaXRpb25hbFByb3BlcnRpZXMgYXMgJGtleSA9PiAkXykgewpmb3JlYWNoICgkcGF0dGVybnMgYXMgJHBhdHRlcm4pIHsKaWYgKHByZWdfbWF0Y2goJHRoaXMtPmNyZWF0ZVByZWdNYXRjaFBhdHRlcm4oJHBhdHRlcm4pLCAoc3RyaW5nKSAka2V5KSkgewp1bnNldCgkYWRkaXRpb25hbFByb3BlcnRpZXNbJGtleV0pOwpicmVhazsKfQp9Cn0KfQoKaWYgKGlzX29iamVjdCgkc2NoZW1hLT5hZGRpdGlvbmFsUHJvcGVydGllcykpIHsKZm9yZWFjaCAoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzIGFzICRrZXkgPT4gJGFkZGl0aW9uYWxQcm9wZXJ0aWVzVmFsdWUpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJGFkZGl0aW9uYWxQcm9wZXJ0aWVzVmFsdWUsICRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzLCAkcGF0aCwgJGkpOyAKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKdW5zZXQoJGFkZGl0aW9uYWxQcm9wZXJ0aWVzWyRrZXldKTsKfQp9Cn0KCmZvcmVhY2ggKCRhZGRpdGlvbmFsUHJvcGVydGllcyBhcyAka2V5ID0+ICRhZGRpdGlvbmFsUHJvcGVydGllc1ZhbHVlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFERElUSU9OQUxfUFJPUEVSVElFUygpLCAkcGF0aCwgWydmb3VuZCcgPT4gJGFkZGl0aW9uYWxQcm9wZXJ0aWVzVmFsdWVdKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZVByZWdNYXRjaFBhdHRlcm4oc3RyaW5nICRwYXR0ZXJuKTogc3RyaW5nCnsKJHJlcGxhY2VtZW50cyA9IFsKCgonXHB7ZGlnaXR9JyA9PiAnXHB7TmR9JywKCgoKJ1xwe0xldHRlcn0nID0+ICdccHtMfScsIApdOwoKJHBhdHRlcm4gPSBzdHJfcmVwbGFjZSgKYXJyYXlfa2V5cygkcmVwbGFjZW1lbnRzKSwKYXJyYXlfdmFsdWVzKCRyZXBsYWNlbWVudHMpLAokcGF0dGVybgopOwoKcmV0dXJuICcvJyAuIHN0cl9yZXBsYWNlKCcvJywgJ1wvJywgJHBhdHRlcm4pIC4gJy91JzsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgQWxsT2ZDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdhbGxPZicpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYS0+YWxsT2YgYXMgJGFsbE9mU2NoZW1hKSB7CiRzY2hlbWFDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJGFsbE9mU2NoZW1hLCAkcGF0aCwgJGkpOwoKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QUxMX09GKCksICRwYXRoKTsKJHRoaXMtPmFkZEVycm9ycygkc2NoZW1hQ29uc3RyYWludC0+Z2V0RXJyb3JzKCkpOwp9Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFZhbGlkYXRpb25FeGNlcHRpb247CgpjbGFzcyBBbnlPZkNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2FueU9mJykpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5hbnlPZiBhcyAkYW55T2ZTY2hlbWEpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwoKdHJ5IHsKJHNjaGVtYUNvbnN0cmFpbnQtPmNoZWNrKCR2YWx1ZSwgJGFueU9mU2NoZW1hLCAkcGF0aCwgJGkpOwoKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKJHRoaXMtPmVycm9yQmFnKCktPnJlc2V0KCk7CgpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewp9Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFOWV9PRigpLCAkcGF0aCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxEZWVwQ29tcGFyZXI7CgpjbGFzcyBDb25zdENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdjb25zdCcpKSB7CnJldHVybjsKfQoKaWYgKERlZXBDb21wYXJlcjo6aXNFcXVhbCgkdmFsdWUsICRzY2hlbWEtPmNvbnN0KSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkNPTlNUQU5UKCksICRwYXRoLCBbJ2NvbnN0JyA9PiAkc2NoZW1hLT5jb25zdF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBDb250YWluc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2NvbnRhaW5zJykpIHsKcmV0dXJuOwp9CgokcHJvcGVydGllcyA9IFtdOwppZiAoIWlzX2FycmF5KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdmFsdWUgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlWYWx1ZSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7Cgokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHByb3BlcnR5VmFsdWUsICRzY2hlbWEtPmNvbnRhaW5zLCAkcGF0aCwgJGkpOwppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Q09OVEFJTlMoKSwgJHBhdGgsIFsnY29udGFpbnMnID0+ICRzY2hlbWEtPmNvbnRhaW5zXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIERlcGVuZGVuY2llc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2RlcGVuZGVuY2llcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCRzY2hlbWEtPmRlcGVuZGVuY2llcyBhcyAkZGVwZW5kYW50ID0+ICRkZXBlbmRlbmNpZXMpIHsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHZhbHVlLCAkZGVwZW5kYW50KSkgewpjb250aW51ZTsKfQppZiAoJGRlcGVuZGVuY2llcyA9PT0gdHJ1ZSkgewpjb250aW51ZTsKfQppZiAoJGRlcGVuZGVuY2llcyA9PT0gZmFsc2UpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RkFMU0UoKSwgJHBhdGgsIFsnZGVwZW5kYW50JyA9PiAkZGVwZW5kYW50XSk7CmNvbnRpbnVlOwp9CgppZiAoaXNfYXJyYXkoJGRlcGVuZGVuY2llcykpIHsKZm9yZWFjaCAoJGRlcGVuZGVuY2llcyBhcyAkZGVwZW5kZW5jeSkgewppZiAocHJvcGVydHlfZXhpc3RzKCR2YWx1ZSwgJGRlcGVuZGFudCkgJiYgIXByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRkZXBlbmRlbmN5KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpERVBFTkRFTkNJRVMoKSwgJHBhdGgsIFsnZGVwZW5kYW50JyA9PiAkZGVwZW5kYW50LCAnZGVwZW5kZW5jeScgPT4gJGRlcGVuZGVuY3ldKTsKfQp9Cn0KCmlmIChpc19vYmplY3QoJGRlcGVuZGVuY2llcykpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLCAkZGVwZW5kZW5jaWVzLCAkcGF0aCwgJGkpOwppZiAoISRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKJHRoaXMtPmFkZEVycm9ycygkc2NoZW1hQ29uc3RyYWludC0+Z2V0RXJyb3JzKCkpOwp9Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnQ7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcU2NoZW1hU3RvcmFnZTsKdXNlIEpzb25TY2hlbWFcVXJpXFVyaVJldHJpZXZlcjsKCmNsYXNzIERyYWZ0MDZDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/XEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdChuZXcgRmFjdG9yeSgKJGZhY3RvcnkgPyAkZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpIDogbmV3IFNjaGVtYVN0b3JhZ2UoKSwKJGZhY3RvcnkgPyAkZmFjdG9yeS0+Z2V0VXJpUmV0cmlldmVyKCkgOiBuZXcgVXJpUmV0cmlldmVyKCksCiRmYWN0b3J5ID8gJGZhY3RvcnktPmdldENvbmZpZygpIDogQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9OT1JNQUwKKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmIChpc19ib29sKCRzY2hlbWEpKSB7CmlmICgkc2NoZW1hID09PSBmYWxzZSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGQUxTRSgpLCAkcGF0aCwgW10pOwp9CgpyZXR1cm47Cn0KCgokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdyZWYnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3JlcXVpcmVkJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdjb250YWlucycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncHJvcGVydGllcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncHJvcGVydHlOYW1lcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgncGF0dGVyblByb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3R5cGUnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ25vdCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZGVwZW5kZW5jaWVzJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdhbGxPZicsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnYW55T2YnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ29uZU9mJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwoKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnYWRkaXRpb25hbFByb3BlcnRpZXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ2l0ZW1zJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdhZGRpdGlvbmFsSXRlbXMnLCAkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CiR0aGlzLT5jaGVja0ZvcktleXdvcmQoJ3VuaXF1ZUl0ZW1zJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdtaW5JdGVtcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWluUHJvcGVydGllcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWF4UHJvcGVydGllcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWluaW11bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWF4aW11bScsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWluTGVuZ3RoJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdleGNsdXNpdmVNaW5pbXVtJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdtYXhJdGVtcycsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbWF4TGVuZ3RoJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdleGNsdXNpdmVNYXhpbXVtJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdlbnVtJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdjb25zdCcsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnbXVsdGlwbGVPZicsICR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKJHRoaXMtPmNoZWNrRm9yS2V5d29yZCgnZm9ybWF0JywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwokdGhpcy0+Y2hlY2tGb3JLZXl3b3JkKCdwYXR0ZXJuJywgJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjaGVja0ZvcktleXdvcmQoc3RyaW5nICRrZXl3b3JkLCAkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcigka2V5d29yZCk7CiR2YWxpZGF0b3ItPmNoZWNrKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKCiR0aGlzLT5hZGRFcnJvcnMoJHZhbGlkYXRvci0+Z2V0RXJyb3JzKCkpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXFRvb2xcRGVlcENvbXBhcmVyOwoKY2xhc3MgRW51bUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdlbnVtJykpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5lbnVtIGFzICRlbnVtQ2FzZSkgewppZiAoRGVlcENvbXBhcmVyOjppc0VxdWFsKCR2YWx1ZSwgJGVudW1DYXNlKSkgewpyZXR1cm47Cn0KCmlmIChpc19udW1lcmljKCR2YWx1ZSkgJiYgaXNfbnVtZXJpYygkZW51bUNhc2UpICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgoZmxvYXQpICR2YWx1ZSwgKGZsb2F0KSAkZW51bUNhc2UpKSB7CnJldHVybjsKfQp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpFTlVNKCksICRwYXRoLCBbJ2VudW0nID0+ICRzY2hlbWEtPmVudW1dKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgRXhjbHVzaXZlTWF4aW11bUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdleGNsdXNpdmVNYXhpbXVtJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX251bWVyaWMoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkdmFsdWUgPCAkc2NoZW1hLT5leGNsdXNpdmVNYXhpbXVtKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RVhDTFVTSVZFX01BWElNVU0oKSwgJHBhdGgsIFsnZXhjbHVzaXZlTWF4aW11bScgPT4gJHNjaGVtYS0+ZXhjbHVzaXZlTWF4aW11bSwgJ2ZvdW5kJyA9PiAkdmFsdWVdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgRXhjbHVzaXZlTWluaW11bUNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdleGNsdXNpdmVNaW5pbXVtJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX251bWVyaWMoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkdmFsdWUgPiAkc2NoZW1hLT5leGNsdXNpdmVNaW5pbXVtKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RVhDTFVTSVZFX01JTklNVU0oKSwgJHBhdGgsIFsnZXhjbHVzaXZlTWluaW11bScgPT4gJHNjaGVtYS0+ZXhjbHVzaXZlTWluaW11bSwgJ2ZvdW5kJyA9PiAkdmFsdWVdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKY2xhc3MgRmFjdG9yeSBleHRlbmRzIFxKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgJGNvbnN0cmFpbnRNYXAgPSBbCidzY2hlbWEnID0+IERyYWZ0MDZDb25zdHJhaW50OjpjbGFzcywKJ2FkZGl0aW9uYWxQcm9wZXJ0aWVzJyA9PiBBZGRpdGlvbmFsUHJvcGVydGllc0NvbnN0cmFpbnQ6OmNsYXNzLAonYWRkaXRpb25hbEl0ZW1zJyA9PiBBZGRpdGlvbmFsSXRlbXNDb25zdHJhaW50OjpjbGFzcywKJ2RlcGVuZGVuY2llcycgPT4gRGVwZW5kZW5jaWVzQ29uc3RyYWludDo6Y2xhc3MsCid0eXBlJyA9PiBUeXBlQ29uc3RyYWludDo6Y2xhc3MsCidjb25zdCcgPT4gQ29uc3RDb25zdHJhaW50OjpjbGFzcywKJ2VudW0nID0+IEVudW1Db25zdHJhaW50OjpjbGFzcywKJ3VuaXF1ZUl0ZW1zJyA9PiBVbmlxdWVJdGVtc0NvbnN0cmFpbnQ6OmNsYXNzLAonbWluSXRlbXMnID0+IE1pbkl0ZW1zQ29uc3RyYWludDo6Y2xhc3MsCidtaW5Qcm9wZXJ0aWVzJyA9PiBNaW5Qcm9wZXJ0aWVzQ29uc3RyYWludDo6Y2xhc3MsCidtYXhQcm9wZXJ0aWVzJyA9PiBNYXhQcm9wZXJ0aWVzQ29uc3RyYWludDo6Y2xhc3MsCidtaW5pbXVtJyA9PiBNaW5pbXVtQ29uc3RyYWludDo6Y2xhc3MsCidtYXhpbXVtJyA9PiBNYXhpbXVtQ29uc3RyYWludDo6Y2xhc3MsCidleGNsdXNpdmVNaW5pbXVtJyA9PiBFeGNsdXNpdmVNaW5pbXVtQ29uc3RyYWludDo6Y2xhc3MsCidtaW5MZW5ndGgnID0+IE1pbkxlbmd0aENvbnN0cmFpbnQ6OmNsYXNzLAonbWF4TGVuZ3RoJyA9PiBNYXhMZW5ndGhDb25zdHJhaW50OjpjbGFzcywKJ21heEl0ZW1zJyA9PiBNYXhJdGVtc0NvbnN0cmFpbnQ6OmNsYXNzLAonZXhjbHVzaXZlTWF4aW11bScgPT4gRXhjbHVzaXZlTWF4aW11bUNvbnN0cmFpbnQ6OmNsYXNzLAonbXVsdGlwbGVPZicgPT4gTXVsdGlwbGVPZkNvbnN0cmFpbnQ6OmNsYXNzLAoncmVxdWlyZWQnID0+IFJlcXVpcmVkQ29uc3RyYWludDo6Y2xhc3MsCidmb3JtYXQnID0+IEZvcm1hdENvbnN0cmFpbnQ6OmNsYXNzLAonYW55T2YnID0+IEFueU9mQ29uc3RyYWludDo6Y2xhc3MsCidhbGxPZicgPT4gQWxsT2ZDb25zdHJhaW50OjpjbGFzcywKJ29uZU9mJyA9PiBPbmVPZkNvbnN0cmFpbnQ6OmNsYXNzLAonbm90JyA9PiBOb3RDb25zdHJhaW50OjpjbGFzcywKJ2NvbnRhaW5zJyA9PiBDb250YWluc0NvbnN0cmFpbnQ6OmNsYXNzLAoncHJvcGVydHlOYW1lcycgPT4gUHJvcGVydGllc05hbWVzQ29uc3RyYWludDo6Y2xhc3MsCidwYXR0ZXJuUHJvcGVydGllcycgPT4gUGF0dGVyblByb3BlcnRpZXNDb25zdHJhaW50OjpjbGFzcywKJ3BhdHRlcm4nID0+IFBhdHRlcm5Db25zdHJhaW50OjpjbGFzcywKJ3Byb3BlcnRpZXMnID0+IFByb3BlcnRpZXNDb25zdHJhaW50OjpjbGFzcywKJ2l0ZW1zJyA9PiBJdGVtc0NvbnN0cmFpbnQ6OmNsYXNzLAoncmVmJyA9PiBSZWZDb25zdHJhaW50OjpjbGFzcywKXTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKdXNlIEpzb25TY2hlbWFcUmZjMzMzOTsKdXNlIEpzb25TY2hlbWFcVG9vbFxWYWxpZGF0b3JcUmVsYXRpdmVSZWZlcmVuY2VWYWxpZGF0b3I7CnVzZSBKc29uU2NoZW1hXFRvb2xcVmFsaWRhdG9yXFVyaVZhbGlkYXRvcjsKCmNsYXNzIEZvcm1hdENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdmb3JtYXQnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpzd2l0Y2ggKCRzY2hlbWEtPmZvcm1hdCkgewpjYXNlICdkYXRlJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkdmFsdWUsICdZLW0tZCcpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9EQVRFKCksICRwYXRoLCBbJ2RhdGUnID0+ICR2YWx1ZSwgJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3RpbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZURhdGVUaW1lKCR2YWx1ZSwgJ0g6aTpzJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1RJTUUoKSwgJHBhdGgsIFsndGltZScgPT4gJHZhbHVlLCAnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnZGF0ZS10aW1lJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVSZmMzMzM5RGF0ZVRpbWUoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9USU1FKCksICRwYXRoLCBbJ2RhdGVUaW1lJyA9PiAkdmFsdWUsICdmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICd1dGMtbWlsbGlzZWMnOgppZiAoISR0aGlzLT52YWxpZGF0ZURhdGVUaW1lKCR2YWx1ZSwgJ1UnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9VVEMoKSwgJHBhdGgsIFsndmFsdWUnID0+ICR2YWx1ZSwgJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3JlZ2V4JzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVSZWdleCgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9SRUdFWCgpLCAkcGF0aCwgWyd2YWx1ZScgPT4gJHZhbHVlLCAnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnaXAtYWRkcmVzcyc6CmNhc2UgJ2lwdjQnOgppZiAoZmlsdGVyX3ZhcigkdmFsdWUsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjQpID09PSBudWxsKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdpcHY2JzoKaWYgKGZpbHRlcl92YXIoJHZhbHVlLCBGSUxURVJfVkFMSURBVEVfSVAsIEZJTFRFUl9OVUxMX09OX0ZBSUxVUkUgfCBGSUxURVJfRkxBR19JUFY2KSA9PT0gbnVsbCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSVAoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnY29sb3InOgppZiAoISR0aGlzLT52YWxpZGF0ZUNvbG9yKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0NPTE9SKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CmNhc2UgJ3N0eWxlJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVTdHlsZSgkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9TVFlMRSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdwaG9uZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlUGhvbmUoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfUEhPTkUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAndXJpJzoKaWYgKCFVcmlWYWxpZGF0b3I6OmlzVmFsaWQoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfVVJMKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICd1cmlyZWYnOgpjYXNlICd1cmktcmVmZXJlbmNlJzoKaWYgKCEoVXJpVmFsaWRhdG9yOjppc1ZhbGlkKCR2YWx1ZSkgfHwgUmVsYXRpdmVSZWZlcmVuY2VWYWxpZGF0b3I6OmlzVmFsaWQoJHZhbHVlKSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1VSTCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICd1cmktdGVtcGxhdGUnOgppZiAoISR0aGlzLT52YWxpZGF0ZVVyaVRlbXBsYXRlKCR2YWx1ZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1VSSV9URU1QTEFURSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnZW1haWwnOgppZiAoZmlsdGVyX3ZhcigkdmFsdWUsIEZJTFRFUl9WQUxJREFURV9FTUFJTCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0VNQUlMX1VOSUNPREUpID09PSBudWxsKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9FTUFJTCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwpjYXNlICdob3N0LW5hbWUnOgpjYXNlICdob3N0bmFtZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlSG9zdG5hbWUoJHZhbHVlKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSE9TVE5BTUUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKY2FzZSAnanNvbi1wb2ludGVyJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVKc29uUG9pbnRlcigkdmFsdWUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9KU09OX1BPSU5URVIoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKZGVmYXVsdDoKYnJlYWs7Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZURhdGVUaW1lKHN0cmluZyAkZGF0ZXRpbWUsIHN0cmluZyAkZm9ybWF0KTogYm9vbAp7CiRkdCA9IFxEYXRlVGltZTo6Y3JlYXRlRnJvbUZvcm1hdCgkZm9ybWF0LCAkZGF0ZXRpbWUpOwoKaWYgKCEkZHQpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJGRhdGV0aW1lID09PSAkZHQtPmZvcm1hdCgkZm9ybWF0KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVJlZ2V4KHN0cmluZyAkcmVnZXgpOiBib29sCnsKcmV0dXJuIHByZWdfbWF0Y2goc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRyZWdleCksICcnKSAhPT0gZmFsc2U7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGpzb25QYXR0ZXJuVG9QaHBSZWdleChzdHJpbmcgJHBhdHRlcm4pOiBzdHJpbmcKewpyZXR1cm4gJ34nIC4gc3RyX3JlcGxhY2UoJ34nLCAnXFx+JywgJHBhdHRlcm4pIC4gJ351JzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZUNvbG9yKHN0cmluZyAkY29sb3IpOiBib29sCnsKaWYgKGluX2FycmF5KHN0cnRvbG93ZXIoJGNvbG9yKSwgWydhcXVhJywgJ2JsYWNrJywgJ2JsdWUnLCAnZnVjaHNpYScsCidncmF5JywgJ2dyZWVuJywgJ2xpbWUnLCAnbWFyb29uJywgJ25hdnknLCAnb2xpdmUnLCAnb3JhbmdlJywgJ3B1cnBsZScsCidyZWQnLCAnc2lsdmVyJywgJ3RlYWwnLCAnd2hpdGUnLCAneWVsbG93J10pKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gcHJlZ19tYXRjaCgnL14jKFthLWYwLTldezN9fFthLWYwLTldezZ9KSQvaScsICRjb2xvcikgIT09IGZhbHNlOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlU3R5bGUoc3RyaW5nICRzdHlsZSk6IGJvb2wKewokcHJvcGVydGllcyA9IGV4cGxvZGUoJzsnLCBydHJpbSgkc3R5bGUsICc7JykpOwokaW52YWxpZEVudHJpZXMgPSBwcmVnX2dyZXAoJy9eXHMqWy1hLXpdK1xzKjpccyouKyQvaScsICRwcm9wZXJ0aWVzLCBQUkVHX0dSRVBfSU5WRVJUKTsKCnJldHVybiBlbXB0eSgkaW52YWxpZEVudHJpZXMpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlUGhvbmUoc3RyaW5nICRwaG9uZSk6IGJvb2wKewpyZXR1cm4gcHJlZ19tYXRjaCgnL15cKz8oXChcZHszfVwpfFxkezN9KSBcZHszfSBcZHs0fSQvJywgJHBob25lKSAhPT0gZmFsc2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVIb3N0bmFtZShzdHJpbmcgJGhvc3QpOiBib29sCnsKJGhvc3RuYW1lUmVnZXggPSAnL14oPyEtKSg/IS4qP1teQS1aYS16MC05XC1cLl0pKD86KD8hLSlbQS1aYS16MC05XSg/OltBLVphLXowLTlcLV17MCw2MX1bQS1aYS16MC05XSk/XC4pKig/IS0pW0EtWmEtejAtOV0oPzpbQS1aYS16MC05XC1dezAsNjF9W0EtWmEtejAtOV0pPyQvJzsKCnJldHVybiBwcmVnX21hdGNoKCRob3N0bmFtZVJlZ2V4LCAkaG9zdCkgPT09IDE7Cn0KCnByaXZhdGUgZnVuY3Rpb24gdmFsaWRhdGVKc29uUG9pbnRlcihzdHJpbmcgJHZhbHVlKTogYm9vbAp7CgppZiAoJHZhbHVlICE9PSAnJyAmJiAkdmFsdWVbMF0gIT09ICcvJykgewpyZXR1cm4gZmFsc2U7Cn0KCgokdG9rZW5zID0gZXhwbG9kZSgnLycsICR2YWx1ZSk7CmFycmF5X3NoaWZ0KCR0b2tlbnMpOyAKCmZvcmVhY2ggKCR0b2tlbnMgYXMgJHRva2VuKSB7CgppZiAocHJlZ19tYXRjaCgnL34oPyFbMDFdKS8nLCAkdG9rZW4pKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVJmYzMzMzlEYXRlVGltZShzdHJpbmcgJHZhbHVlKTogYm9vbAp7CiRkYXRlVGltZSA9IFJmYzMzMzk6OmNyZWF0ZUZyb21TdHJpbmcoJHZhbHVlKTsKaWYgKGlzX251bGwoJGRhdGVUaW1lKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiB2YWxpZGF0ZVVyaVRlbXBsYXRlKHN0cmluZyAkdmFsdWUpOiBib29sCnsKcmV0dXJuIHByZWdfbWF0Y2goCicvXig/OlteXHtcfV0qfFx7W2EtekEtWjAtOV86JVwvXC5+XC1cK1wqXStcfSkqJC8nLAokdmFsdWUKKSA9PT0gMTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIEl0ZW1zQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCR2YWx1ZSBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CiRpdGVtU2NoZW1hID0gJHNjaGVtYS0+aXRlbXM7CmlmIChpc19hcnJheSgkaXRlbVNjaGVtYSkpIHsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCRwcm9wZXJ0eU5hbWUsICRpdGVtU2NoZW1hKSkgewpjb250aW51ZTsKfQoKJGl0ZW1TY2hlbWEgPSAkaXRlbVNjaGVtYVskcHJvcGVydHlOYW1lXTsKfQokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkcHJvcGVydHlWYWx1ZSwgJGl0ZW1TY2hlbWEsICRwYXRoLCAkaSk7CmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWF4SXRlbXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWF4SXRlbXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRjb3VudCA9IGNvdW50KCR2YWx1ZSk7CmlmICgkY291bnQgPD0gJHNjaGVtYS0+bWF4SXRlbXMpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhfSVRFTVMoKSwgJHBhdGgsIFsnbWF4SXRlbXMnID0+ICRzY2hlbWEtPm1heEl0ZW1zLCAnZm91bmQnID0+ICRjb3VudF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNYXhMZW5ndGhDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWF4TGVuZ3RoJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX3N0cmluZygkdmFsdWUpKSB7CnJldHVybjsKfQoKJGxlbmd0aCA9IG1iX3N0cmxlbigkdmFsdWUpOwppZiAoJGxlbmd0aCA8PSAkc2NoZW1hLT5tYXhMZW5ndGgpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpMRU5HVEhfTUFYKCksICRwYXRoLCBbJ21heExlbmd0aCcgPT4gJHNjaGVtYS0+bWF4TGVuZ3RoLCAnZm91bmQnID0+ICRsZW5ndGhdKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgTWF4UHJvcGVydGllc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtYXhQcm9wZXJ0aWVzJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGNvdW50ID0gY291bnQoZ2V0X29iamVjdF92YXJzKCR2YWx1ZSkpOwppZiAoJGNvdW50IDw9ICRzY2hlbWEtPm1heFByb3BlcnRpZXMpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUSUVTX01BWCgpLCAkcGF0aCwgWydtYXhQcm9wZXJ0aWVzJyA9PiAkc2NoZW1hLT5tYXhQcm9wZXJ0aWVzLCAnZm91bmQnID0+ICRjb3VudF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNYXhpbXVtQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21heGltdW0nKSkgewpyZXR1cm47Cn0KCmlmICghaXNfbnVtZXJpYygkdmFsdWUpKSB7CnJldHVybjsKfQoKaWYgKCR2YWx1ZSA8PSAkc2NoZW1hLT5tYXhpbXVtKSB7CnJldHVybjsKfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUFYSU1VTSgpLCAkcGF0aCwgWydtYXhpbXVtJyA9PiAkc2NoZW1hLT5tYXhpbXVtLCAnZm91bmQnID0+ICR2YWx1ZV0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNaW5JdGVtc0NvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtaW5JdGVtcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19hcnJheSgkdmFsdWUpKSB7CnJldHVybjsKfQoKJGNvdW50ID0gY291bnQoJHZhbHVlKTsKaWYgKCRjb3VudCA+PSAkc2NoZW1hLT5taW5JdGVtcykgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1JTl9JVEVNUygpLCAkcGF0aCwgWydtaW5JdGVtcycgPT4gJHNjaGVtYS0+bWluSXRlbXMsICdmb3VuZCcgPT4gJGNvdW50XSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE1pbkxlbmd0aENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdtaW5MZW5ndGgnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokbGVuZ3RoID0gbWJfc3RybGVuKCR2YWx1ZSk7CmlmICgkbGVuZ3RoID49ICRzY2hlbWEtPm1pbkxlbmd0aCkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkxFTkdUSF9NSU4oKSwgJHBhdGgsIFsnbWluTGVuZ3RoJyA9PiAkc2NoZW1hLT5taW5MZW5ndGgsICdmb3VuZCcgPT4gJGxlbmd0aF0pOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBNaW5Qcm9wZXJ0aWVzQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ21pblByb3BlcnRpZXMnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgokY291bnQgPSBjb3VudChnZXRfb2JqZWN0X3ZhcnMoJHZhbHVlKSk7CmlmICgkY291bnQgPj0gJHNjaGVtYS0+bWluUHJvcGVydGllcykgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRJRVNfTUlOKCksICRwYXRoLCBbJ21pblByb3BlcnRpZXMnID0+ICRzY2hlbWEtPm1pblByb3BlcnRpZXMsICdmb3VuZCcgPT4gJGNvdW50XSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE1pbmltdW1Db25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbWluaW11bScpKSB7CnJldHVybjsKfQoKaWYgKCFpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuOwp9CgppZiAoJHZhbHVlID49ICRzY2hlbWEtPm1pbmltdW0pIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW0sICdmb3VuZCcgPT4gJHZhbHVlXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE11bHRpcGxlT2ZDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnbXVsdGlwbGVPZicpKSB7CnJldHVybjsKfQoKaWYgKCFpc19pbnQoJHNjaGVtYS0+bXVsdGlwbGVPZikgJiYgIWlzX2Zsb2F0KCRzY2hlbWEtPm11bHRpcGxlT2YpICYmICRzY2hlbWEtPm11bHRpcGxlT2YgPD0gMC4wKSB7CnJldHVybjsKfQoKaWYgKCFpc19pbnQoJHZhbHVlKSAmJiAhaXNfZmxvYXQoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkdGhpcy0+aXNNdWx0aXBsZU9mKCR2YWx1ZSwgJHNjaGVtYS0+bXVsdGlwbGVPZikpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNVUxUSVBMRV9PRigpLCAkcGF0aCwgWydtdWx0aXBsZU9mJyA9PiAkc2NoZW1hLT5tdWx0aXBsZU9mLCAnZm91bmQnID0+ICR2YWx1ZV0pOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc011bHRpcGxlT2YoJG51bWJlcjEsICRudW1iZXIyKTogYm9vbAp7CiRtb2R1bHVzID0gKCRudW1iZXIxIC0gcm91bmQoJG51bWJlcjEgLyAkbnVtYmVyMikgKiAkbnVtYmVyMik7CiRwcmVjaXNpb24gPSAwLjAwMDAwMDAwMDE7CgpyZXR1cm4gLSRwcmVjaXNpb24gPCAkbW9kdWx1cyAmJiAkbW9kdWx1cyA8ICRwcmVjaXNpb247Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcQ29uc3RyYWludEludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEVycm9yQmFnUHJveHk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCmNsYXNzIE5vdENvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ25vdCcpKSB7CnJldHVybjsKfQoKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLCAkc2NoZW1hLT5ub3QsICRwYXRoLCAkaSk7CgppZiAoISRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKcmV0dXJuOwp9CgokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpOT1QoKSwgJHBhdGgpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBPbmVPZkNvbnN0cmFpbnQgaW1wbGVtZW50cyBDb25zdHJhaW50SW50ZXJmYWNlCnsKdXNlIEVycm9yQmFnUHJveHk7CgoKcHJpdmF0ZSAkZmFjdG9yeTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmZhY3RvcnkgPSAkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpOwokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCR0aGlzLT5mYWN0b3J5KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ29uZU9mJykpIHsKcmV0dXJuOwp9CgokbWF0Y2hlZFNjaGVtYSA9IDA7CmZvcmVhY2ggKCRzY2hlbWEtPm9uZU9mIGFzICRvbmVPZlNjaGVtYSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRvbmVPZlNjaGVtYSwgJHBhdGgsICRpKTsKCmlmICgkc2NoZW1hQ29uc3RyYWludC0+aXNWYWxpZCgpKSB7CiRtYXRjaGVkU2NoZW1hKys7CmNvbnRpbnVlOwp9CgokdGhpcy0+YWRkRXJyb3JzKCRzY2hlbWFDb25zdHJhaW50LT5nZXRFcnJvcnMoKSk7Cn0KCmlmICgkbWF0Y2hlZFNjaGVtYSAhPT0gMSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpPTkVfT0YoKSwgJHBhdGgpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JCYWcoKS0+cmVzZXQoKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBQYXR0ZXJuQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncGF0dGVybicpKSB7CnJldHVybjsKfQoKaWYgKCFpc19zdHJpbmcoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRtYXRjaFBhdHRlcm4gPSAkdGhpcy0+Y3JlYXRlUHJlZ01hdGNoUGF0dGVybigkc2NoZW1hLT5wYXR0ZXJuKTsKaWYgKHByZWdfbWF0Y2goJG1hdGNoUGF0dGVybiwgJHZhbHVlKSA9PT0gMSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBBVFRFUk4oKSwgJHBhdGgsIFsnZm91bmQnID0+ICR2YWx1ZSwgJ3BhdHRlcm4nID0+ICRzY2hlbWEtPnBhdHRlcm5dKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQcmVnTWF0Y2hQYXR0ZXJuKHN0cmluZyAkcGF0dGVybik6IHN0cmluZwp7CiRyZXBsYWNlbWVudHMgPSBbCidcRCcgPT4gJ1teMC05XScsCidcZCcgPT4gJ1swLTldJywKJ1xwe2RpZ2l0fScgPT4gJ1swLTldJywKJ1x3JyA9PiAnW0EtWmEtejAtOV9dJywKJ1xXJyA9PiAnW15BLVphLXowLTlfXScsCidccycgPT4gJ1tcc1x4ezIwMEJ9XScsIAonXHB7TGV0dGVyfScgPT4gJ1xwe0x9JywgCl07CgokcGF0dGVybiA9IHN0cl9yZXBsYWNlKAphcnJheV9rZXlzKCRyZXBsYWNlbWVudHMpLAphcnJheV92YWx1ZXMoJHJlcGxhY2VtZW50cyksCiRwYXR0ZXJuCik7CgpyZXR1cm4gJy8nIC4gc3RyX3JlcGxhY2UoJy8nLCAnXC8nLCAkcGF0dGVybikgLiAnL3UnOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUGF0dGVyblByb3BlcnRpZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdwYXR0ZXJuUHJvcGVydGllcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCiRwcm9wZXJ0aWVzID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7Cgpmb3JlYWNoICgkcHJvcGVydGllcyBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CmZvcmVhY2ggKCRzY2hlbWEtPnBhdHRlcm5Qcm9wZXJ0aWVzIGFzICRwYXR0ZXJuUHJvcGVydHlSZWdleCA9PiAkcGF0dGVyblByb3BlcnR5U2NoZW1hKSB7CiRtYXRjaFBhdHRlcm4gPSAkdGhpcy0+Y3JlYXRlUHJlZ01hdGNoUGF0dGVybigkcGF0dGVyblByb3BlcnR5UmVnZXgpOwppZiAocHJlZ19tYXRjaCgkbWF0Y2hQYXR0ZXJuLCAoc3RyaW5nKSAkcHJvcGVydHlOYW1lKSkgewokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkcHJvcGVydHlWYWx1ZSwgJHBhdHRlcm5Qcm9wZXJ0eVNjaGVtYSwgJHBhdGgsICRpKTsKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVQcmVnTWF0Y2hQYXR0ZXJuKHN0cmluZyAkcGF0dGVybik6IHN0cmluZwp7CiRyZXBsYWNlbWVudHMgPSBbCgonXGQnID0+ICdbMC05XScsCidccHtkaWdpdH0nID0+ICdbMC05XScsCgoKCidccHtMZXR0ZXJ9JyA9PiAnXHB7TH0nLCAKXTsKCiRwYXR0ZXJuID0gc3RyX3JlcGxhY2UoCmFycmF5X2tleXMoJHJlcGxhY2VtZW50cyksCmFycmF5X3ZhbHVlcygkcmVwbGFjZW1lbnRzKSwKJHBhdHRlcm4KKTsKCnJldHVybiAnLycgLiBzdHJfcmVwbGFjZSgnLycsICdcLycsICRwYXR0ZXJuKSAuICcvdSc7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xEcmFmdHNcRHJhZnQwNjsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBQcm9wZXJ0aWVzQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncHJvcGVydGllcycpKSB7CnJldHVybjsKfQoKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCRzY2hlbWEtPnByb3BlcnRpZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkcHJvcGVydHlTY2hlbWEpIHsKJHNjaGVtYUNvbnN0cmFpbnQgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3NjaGVtYScpOwppZiAoIXByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRwcm9wZXJ0eU5hbWUpKSB7CmNvbnRpbnVlOwp9Cgokc2NoZW1hQ29uc3RyYWludC0+Y2hlY2soJHZhbHVlLT57JHByb3BlcnR5TmFtZX0sICRwcm9wZXJ0eVNjaGVtYSwgJHBhdGgsICRpKTsKaWYgKCRzY2hlbWFDb25zdHJhaW50LT5pc1ZhbGlkKCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBQcm9wZXJ0aWVzTmFtZXNDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKCnByaXZhdGUgJGZhY3Rvcnk7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP0ZhY3RvcnkgJGZhY3RvcnkgPSBudWxsKQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3RvcnkgPzogbmV3IEZhY3RvcnkoKTsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkdGhpcy0+ZmFjdG9yeSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJHZhbHVlLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgJGkgPSBudWxsKTogdm9pZAp7CmlmICghcHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICdwcm9wZXJ0eU5hbWVzJykpIHsKcmV0dXJuOwp9CgppZiAoIWlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybjsKfQppZiAoJHNjaGVtYS0+cHJvcGVydHlOYW1lcyA9PT0gdHJ1ZSkgewpyZXR1cm47Cn0KCiRwcm9wZXJ0eU5hbWVzID0gZ2V0X29iamVjdF92YXJzKCR2YWx1ZSk7CgppZiAoJHNjaGVtYS0+cHJvcGVydHlOYW1lcyA9PT0gZmFsc2UpIHsKZm9yZWFjaCAoJHByb3BlcnR5TmFtZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkXykgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUWV9OQU1FUygpLCAkcGF0aCwgWydwcm9wZXJ0eU5hbWVzJyA9PiAkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLCAndmlvbGF0aW5nJyA9PiAnZmFsc2UnLCAnbmFtZScgPT4gJHByb3BlcnR5TmFtZV0pOwp9CgpyZXR1cm47Cn0KCmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ21heExlbmd0aCcpKSB7CmZvcmVhY2ggKCRwcm9wZXJ0eU5hbWVzIGFzICRwcm9wZXJ0eU5hbWUgPT4gJF8pIHsKJGxlbmd0aCA9IG1iX3N0cmxlbigkcHJvcGVydHlOYW1lKTsKaWYgKCRsZW5ndGggPiAkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLT5tYXhMZW5ndGgpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVFlfTkFNRVMoKSwgJHBhdGgsIFsncHJvcGVydHlOYW1lcycgPT4gJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ3Zpb2xhdGluZycgPT4gJ21heExlbmd0aCcsICdsZW5ndGgnID0+ICRsZW5ndGgsICduYW1lJyA9PiAkcHJvcGVydHlOYW1lXSk7Cn0KfQp9CgppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEtPnByb3BlcnR5TmFtZXMsICdwYXR0ZXJuJykpIHsKZm9yZWFjaCAoJHByb3BlcnR5TmFtZXMgYXMgJHByb3BlcnR5TmFtZSA9PiAkXykgewppZiAoIXByZWdfbWF0Y2goJy8nIC4gc3RyX3JlcGxhY2UoJy8nLCAnXC8nLCAkc2NoZW1hLT5wcm9wZXJ0eU5hbWVzLT5wYXR0ZXJuKSAuICcvJywgJHByb3BlcnR5TmFtZSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6UFJPUEVSVFlfTkFNRVMoKSwgJHBhdGgsIFsncHJvcGVydHlOYW1lcycgPT4gJHNjaGVtYS0+cHJvcGVydHlOYW1lcywgJ3Zpb2xhdGluZycgPT4gJ3BhdHRlcm4nLCAnbmFtZScgPT4gJHByb3BlcnR5TmFtZV0pOwp9Cn0KfQp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUmVmQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCgpwcml2YXRlICRmYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+ZmFjdG9yeSA9ICRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCk7CiR0aGlzLT5pbml0aWFsaXNlRXJyb3JCYWcoJHRoaXMtPmZhY3RvcnkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnJHJlZicpKSB7CnJldHVybjsKfQoKdHJ5IHsKJHJlZlNjaGVtYSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPnJlc29sdmVSZWZTY2hlbWEoJHNjaGVtYSk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKcmV0dXJuOwp9Cgokc2NoZW1hQ29uc3RyYWludCA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcignc2NoZW1hJyk7CiRzY2hlbWFDb25zdHJhaW50LT5jaGVjaygkdmFsdWUsICRyZWZTY2hlbWEsICRwYXRoLCAkaSk7CgppZiAoJHNjaGVtYUNvbnN0cmFpbnQtPmlzVmFsaWQoKSkgewpyZXR1cm47Cn0KCiR0aGlzLT5hZGRFcnJvcnMoJHNjaGVtYUNvbnN0cmFpbnQtPmdldEVycm9ycygpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwoKY2xhc3MgUmVxdWlyZWRDb25zdHJhaW50IGltcGxlbWVudHMgQ29uc3RyYWludEludGVyZmFjZQp7CnVzZSBFcnJvckJhZ1Byb3h5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9GYWN0b3J5ICRmYWN0b3J5ID0gbnVsbCkKewokdGhpcy0+aW5pdGlhbGlzZUVycm9yQmFnKCRmYWN0b3J5ID86IG5ldyBGYWN0b3J5KCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIXByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAncmVxdWlyZWQnKSkgewpyZXR1cm47Cn0KCmlmICghaXNfb2JqZWN0KCR2YWx1ZSkpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkc2NoZW1hLT5yZXF1aXJlZCBhcyAkcmVxdWlyZWQpIHsKaWYgKHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRyZXF1aXJlZCkpIHsKY29udGludWU7Cn0KCiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVEKCksICR0aGlzLT5pbmNyZW1lbnRQYXRoKCRwYXRoLCAkcmVxdWlyZWQpLCBbJ3Byb3BlcnR5JyA9PiAkcmVxdWlyZWRdKTsKfQp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGluY3JlbWVudFBhdGgoP0pzb25Qb2ludGVyICRwYXRoLCAkaSk6IEpzb25Qb2ludGVyCnsKJHBhdGggPSAkcGF0aCA/PyBuZXcgSnNvblBvaW50ZXIoJycpOwoKaWYgKCRpID09PSBudWxsIHx8ICRpID09PSAnJykgewpyZXR1cm4gJHBhdGg7Cn0KCnJldHVybiAkcGF0aC0+d2l0aFByb3BlcnR5UGF0aHMoYXJyYXlfbWVyZ2UoJHBhdGgtPmdldFByb3BlcnR5UGF0aHMoKSwgWyRpXSkpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRHJhZnRzXERyYWZ0MDY7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEZhY3Rvcnk7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxFcnJvckJhZ1Byb3h5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBUeXBlQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3R5cGUnKSkgewpyZXR1cm47Cn0KCiRzY2hlbWFUeXBlcyA9IChhcnJheSkgJHNjaGVtYS0+dHlwZTsKJHZhbHVlVHlwZSA9IHN0cnRvbG93ZXIoZ2V0dHlwZSgkdmFsdWUpKTsKCiR2YWx1ZUlzTnVtYmVyID0gJHZhbHVlVHlwZSA9PT0gJ2RvdWJsZScgfHwgJHZhbHVlVHlwZSA9PT0gJ2ludGVnZXInOwoKJGlzSW50ZWdlciA9ICR2YWx1ZUlzTnVtYmVyICYmIGZtb2QoJHZhbHVlLCAxLjApID09PSAwLjA7Cgpmb3JlYWNoICgkc2NoZW1hVHlwZXMgYXMgJHR5cGUpIHsKaWYgKCR2YWx1ZVR5cGUgPT09ICR0eXBlKSB7CnJldHVybjsKfQoKaWYgKCR0eXBlID09PSAnbnVtYmVyJyAmJiAkdmFsdWVJc051bWJlcikgewpyZXR1cm47Cn0KaWYgKCR0eXBlID09PSAnaW50ZWdlcicgJiYgJGlzSW50ZWdlcikgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6VFlQRSgpLCAkcGF0aCwgWydmb3VuZCcgPT4gJHZhbHVlVHlwZSwgJ2V4cGVjdGVkJyA9PiBpbXBsb2RlKCcsICcsICRzY2hlbWFUeXBlcyldKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXERyYWZ0c1xEcmFmdDA2OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50SW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFbnRpdHlcRXJyb3JCYWdQcm94eTsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCmNsYXNzIFVuaXF1ZUl0ZW1zQ29uc3RyYWludCBpbXBsZW1lbnRzIENvbnN0cmFpbnRJbnRlcmZhY2UKewp1c2UgRXJyb3JCYWdQcm94eTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/RmFjdG9yeSAkZmFjdG9yeSA9IG51bGwpCnsKJHRoaXMtPmluaXRpYWxpc2VFcnJvckJhZygkZmFjdG9yeSA/OiBuZXcgRmFjdG9yeSgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCFwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ3VuaXF1ZUl0ZW1zJykpIHsKcmV0dXJuOwp9CmlmICghaXNfYXJyYXkoJHZhbHVlKSkgewpyZXR1cm47Cn0KCmlmICgkc2NoZW1hLT51bmlxdWVJdGVtcyAhPT0gdHJ1ZSkgewoKcmV0dXJuOwp9CgokY291bnQgPSBjb3VudCgkdmFsdWUpOwpmb3IgKCR4ID0gMDsgJHggPCAkY291bnQgLSAxOyAkeCsrKSB7CmZvciAoJHkgPSAkeCArIDE7ICR5IDwgJGNvdW50OyAkeSsrKSB7CmlmIChEZWVwQ29tcGFyZXI6OmlzRXF1YWwoJHZhbHVlWyR4XSwgJHZhbHVlWyR5XSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6VU5JUVVFX0lURU1TKCksICRwYXRoKTsKCnJldHVybjsKfQp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb21wYXJlcjsKCgoKCgoKCmNsYXNzIEVudW1Db25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKCmlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFVuZGVmaW5lZENvbnN0cmFpbnQgJiYgKCFpc3NldCgkc2NoZW1hLT5yZXF1aXJlZCkgfHwgISRzY2hlbWEtPnJlcXVpcmVkKSkgewpyZXR1cm47Cn0KJHR5cGUgPSBnZXR0eXBlKCRlbGVtZW50KTsKCmZvcmVhY2ggKCRzY2hlbWEtPmVudW0gYXMgJGVudW0pIHsKJGVudW1UeXBlID0gZ2V0dHlwZSgkZW51bSk7CgppZiAoJGVudW1UeXBlID09PSAnb2JqZWN0JwomJiAkdHlwZSA9PT0gJ2FycmF5JwomJiAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfVFlQRV9DQVNUKQomJiBEZWVwQ29tcGFyZXI6OmlzRXF1YWwoKG9iamVjdCkgJGVsZW1lbnQsICRlbnVtKQopIHsKcmV0dXJuOwp9CgppZiAoKCR0eXBlID09PSAkZW51bVR5cGUpICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgkZWxlbWVudCwgJGVudW0pKSB7CnJldHVybjsKfQoKaWYgKGlzX251bWVyaWMoJGVsZW1lbnQpICYmIGlzX251bWVyaWMoJGVudW0pICYmIERlZXBDb21wYXJlcjo6aXNFcXVhbCgoZmxvYXQpICRlbGVtZW50LCAoZmxvYXQpICRlbnVtKSkgewpyZXR1cm47Cn0KfQoKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RU5VTSgpLCAkcGF0aCwgWydlbnVtJyA9PiAkc2NoZW1hLT5lbnVtXSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxEcmFmdElkZW50aWZpZXJzOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxTY2hlbWFTdG9yYWdlOwp1c2UgSnNvblNjaGVtYVxTY2hlbWFTdG9yYWdlSW50ZXJmYWNlOwp1c2UgSnNvblNjaGVtYVxVcmlcVXJpUmV0cmlldmVyOwp1c2UgSnNvblNjaGVtYVxVcmlSZXRyaWV2ZXJJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCmNsYXNzIEZhY3RvcnkKewoKCgpwcm90ZWN0ZWQgJHNjaGVtYVN0b3JhZ2U7CgoKCgpwcm90ZWN0ZWQgJHVyaVJldHJpZXZlcjsKCgoKCgpwcml2YXRlICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTDsKCgoKCgpwcml2YXRlICR0eXBlQ2hlY2sgPSBbXTsKCgoKCnByb3RlY3RlZCAkZXJyb3JDb250ZXh0ID0gVmFsaWRhdG9yOjpFUlJPUl9ET0NVTUVOVF9WQUxJREFUSU9OOwoKCgoKCgpwcml2YXRlICRkZWZhdWx0RGlhbGVjdCA9IERyYWZ0SWRlbnRpZmllcnM6OkRSQUZUXzY7CgoKCgpwcm90ZWN0ZWQgJGNvbnN0cmFpbnRNYXAgPSBbCidhcnJheScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcQ29sbGVjdGlvbkNvbnN0cmFpbnQnLAonY29sbGVjdGlvbicgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcQ29sbGVjdGlvbkNvbnN0cmFpbnQnLAonb2JqZWN0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xPYmplY3RDb25zdHJhaW50JywKJ3R5cGUnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXFR5cGVDb25zdHJhaW50JywKJ3VuZGVmaW5lZCcgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcVW5kZWZpbmVkQ29uc3RyYWludCcsCidzdHJpbmcnID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXFN0cmluZ0NvbnN0cmFpbnQnLAonbnVtYmVyJyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xOdW1iZXJDb25zdHJhaW50JywKJ2VudW0nID0+ICdKc29uU2NoZW1hXENvbnN0cmFpbnRzXEVudW1Db25zdHJhaW50JywKJ2NvbnN0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdENvbnN0cmFpbnQnLAonZm9ybWF0JyA9PiAnSnNvblNjaGVtYVxDb25zdHJhaW50c1xGb3JtYXRDb25zdHJhaW50JywKJ3NjaGVtYScgPT4gJ0pzb25TY2hlbWFcQ29uc3RyYWludHNcU2NoZW1hQ29uc3RyYWludCcsCid2YWxpZGF0b3InID0+ICdKc29uU2NoZW1hXFZhbGlkYXRvcicsCidkcmFmdDA2JyA9PiBEcmFmdHNcRHJhZnQwNlxEcmFmdDA2Q29uc3RyYWludDo6Y2xhc3MsCl07CgoKCgpwcml2YXRlICRpbnN0YW5jZUNhY2hlID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCj9TY2hlbWFTdG9yYWdlSW50ZXJmYWNlICRzY2hlbWFTdG9yYWdlID0gbnVsbCwKP1VyaVJldHJpZXZlckludGVyZmFjZSAkdXJpUmV0cmlldmVyID0gbnVsbCwKaW50ICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTAopIHsKCiR0aGlzLT5zZXRDb25maWcoJGNoZWNrTW9kZSk7CgokdGhpcy0+dXJpUmV0cmlldmVyID0gJHVyaVJldHJpZXZlciA/OiBuZXcgVXJpUmV0cmlldmVyKCk7CiR0aGlzLT5zY2hlbWFTdG9yYWdlID0gJHNjaGVtYVN0b3JhZ2UgPzogbmV3IFNjaGVtYVN0b3JhZ2UoJHRoaXMtPnVyaVJldHJpZXZlcik7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25maWcoaW50ICRjaGVja01vZGUgPSBDb25zdHJhaW50OjpDSEVDS19NT0RFX05PUk1BTCk6IHZvaWQKewokdGhpcy0+Y2hlY2tNb2RlID0gJGNoZWNrTW9kZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkQ29uZmlnKGludCAkb3B0aW9ucyk6IHZvaWQKewokdGhpcy0+Y2hlY2tNb2RlIHw9ICRvcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVDb25maWcoaW50ICRvcHRpb25zKTogdm9pZAp7CiR0aGlzLT5jaGVja01vZGUgJj0gfiRvcHRpb25zOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb25maWcoP2ludCAkb3B0aW9ucyA9IG51bGwpOiBpbnQKewppZiAoJG9wdGlvbnMgPT09IG51bGwpIHsKcmV0dXJuICR0aGlzLT5jaGVja01vZGU7Cn0KCnJldHVybiAkdGhpcy0+Y2hlY2tNb2RlICYgJG9wdGlvbnM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVcmlSZXRyaWV2ZXIoKTogVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT51cmlSZXRyaWV2ZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWFTdG9yYWdlKCk6IFNjaGVtYVN0b3JhZ2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXMtPnNjaGVtYVN0b3JhZ2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRUeXBlQ2hlY2soKTogVHlwZUNoZWNrXFR5cGVDaGVja0ludGVyZmFjZQp7CmlmICghaXNzZXQoJHRoaXMtPnR5cGVDaGVja1skdGhpcy0+Y2hlY2tNb2RlXSkpIHsKJHRoaXMtPnR5cGVDaGVja1skdGhpcy0+Y2hlY2tNb2RlXSA9ICgkdGhpcy0+Y2hlY2tNb2RlICYgQ29uc3RyYWludDo6Q0hFQ0tfTU9ERV9UWVBFX0NBU1QpCj8gbmV3IFR5cGVDaGVja1xMb29zZVR5cGVDaGVjaygpCjogbmV3IFR5cGVDaGVja1xTdHJpY3RUeXBlQ2hlY2soKTsKfQoKcmV0dXJuICR0aGlzLT50eXBlQ2hlY2tbJHRoaXMtPmNoZWNrTW9kZV07Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRDb25zdHJhaW50Q2xhc3Moc3RyaW5nICRuYW1lLCBzdHJpbmcgJGNsYXNzKTogRmFjdG9yeQp7CgppZiAoIWNsYXNzX2V4aXN0cygkY2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vua25vd24gY29uc3RyYWludCAnIC4gJG5hbWUpOwp9CgppZiAoIWluX2FycmF5KCdKc29uU2NoZW1hXENvbnN0cmFpbnRzXENvbnN0cmFpbnRJbnRlcmZhY2UnLCBjbGFzc19pbXBsZW1lbnRzKCRjbGFzcykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgY2xhc3MgJyAuICRuYW1lKTsKfQokdGhpcy0+Y29uc3RyYWludE1hcFskbmFtZV0gPSAkY2xhc3M7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlSW5zdGFuY2VGb3IoJGNvbnN0cmFpbnROYW1lKQp7CmlmICghaXNzZXQoJHRoaXMtPmNvbnN0cmFpbnRNYXBbJGNvbnN0cmFpbnROYW1lXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVW5rbm93biBjb25zdHJhaW50ICcgLiAkY29uc3RyYWludE5hbWUpOwp9CgppZiAoIWlzc2V0KCR0aGlzLT5pbnN0YW5jZUNhY2hlWyRjb25zdHJhaW50TmFtZV0pKSB7CiR0aGlzLT5pbnN0YW5jZUNhY2hlWyRjb25zdHJhaW50TmFtZV0gPSBuZXcgJHRoaXMtPmNvbnN0cmFpbnRNYXBbJGNvbnN0cmFpbnROYW1lXSgkdGhpcyk7Cn0KCnJldHVybiBjbG9uZSAkdGhpcy0+aW5zdGFuY2VDYWNoZVskY29uc3RyYWludE5hbWVdOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvckNvbnRleHQoKTogaW50CnsKcmV0dXJuICR0aGlzLT5lcnJvckNvbnRleHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yQ29udGV4dChpbnQgJGVycm9yQ29udGV4dCk6IHZvaWQKewokdGhpcy0+ZXJyb3JDb250ZXh0ID0gJGVycm9yQ29udGV4dDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlZmF1bHREaWFsZWN0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZGVmYXVsdERpYWxlY3Q7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0RGlhbGVjdChzdHJpbmcgJGRlZmF1bHREaWFsZWN0KTogdm9pZAp7CiR0aGlzLT5kZWZhdWx0RGlhbGVjdCA9ICRkZWZhdWx0RGlhbGVjdDsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxSZmMzMzM5Owp1c2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvclxSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjsKdXNlIEpzb25TY2hlbWFcVG9vbFxWYWxpZGF0b3JcVXJpVmFsaWRhdG9yOwoKCgoKCgoKCmNsYXNzIEZvcm1hdENvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewppZiAoIWlzc2V0KCRzY2hlbWEtPmZvcm1hdCkgfHwgJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0RJU0FCTEVfRk9STUFUKSkgewpyZXR1cm47Cn0KCnN3aXRjaCAoJHNjaGVtYS0+Zm9ybWF0KSB7CmNhc2UgJ2RhdGUnOgppZiAoaXNfc3RyaW5nKCRlbGVtZW50KSAmJiAhJGRhdGUgPSAkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1ktbS1kJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0RBVEUoKSwgJHBhdGgsIFsKJ2RhdGUnID0+ICRlbGVtZW50LAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAndGltZSc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmICEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ0g6aTpzJykpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1RJTUUoKSwgJHBhdGgsIFsKJ3RpbWUnID0+IGpzb25fZW5jb2RlKCRlbGVtZW50KSwKJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0LApdCik7Cn0KYnJlYWs7CgpjYXNlICdkYXRlLXRpbWUnOgppZiAoaXNfc3RyaW5nKCRlbGVtZW50KSAmJiBudWxsID09PSBSZmMzMzM5OjpjcmVhdGVGcm9tU3RyaW5nKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9USU1FKCksICRwYXRoLCBbCidkYXRlVGltZScgPT4ganNvbl9lbmNvZGUoJGVsZW1lbnQpLAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAndXRjLW1pbGxpc2VjJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVEYXRlVGltZSgkZWxlbWVudCwgJ1UnKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfREFURV9VVEMoKSwgJHBhdGgsIFsKJ3ZhbHVlJyA9PiAkZWxlbWVudCwKJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdyZWdleCc6CmlmICghJHRoaXMtPnZhbGlkYXRlUmVnZXgoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9SRUdFWCgpLCAkcGF0aCwgWwondmFsdWUnID0+ICRlbGVtZW50LAonZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXQKXQopOwp9CmJyZWFrOwoKY2FzZSAnY29sb3InOgppZiAoISR0aGlzLT52YWxpZGF0ZUNvbG9yKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfQ09MT1IoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ3N0eWxlJzoKaWYgKCEkdGhpcy0+dmFsaWRhdGVTdHlsZSgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1NUWUxFKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdwaG9uZSc6CmlmICghJHRoaXMtPnZhbGlkYXRlUGhvbmUoJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9QSE9ORSgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpJzoKaWYgKGlzX3N0cmluZygkZWxlbWVudCkgJiYgIVVyaVZhbGlkYXRvcjo6aXNWYWxpZCgkZWxlbWVudCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX1VSTCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAndXJpcmVmJzoKY2FzZSAndXJpLXJlZmVyZW5jZSc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmICEoVXJpVmFsaWRhdG9yOjppc1ZhbGlkKCRlbGVtZW50KSB8fCBSZWxhdGl2ZVJlZmVyZW5jZVZhbGlkYXRvcjo6aXNWYWxpZCgkZWxlbWVudCkpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9VUkwoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmNhc2UgJ2VtYWlsJzoKaWYgKGlzX3N0cmluZygkZWxlbWVudCkgJiYgbnVsbCA9PT0gZmlsdGVyX3ZhcigkZWxlbWVudCwgRklMVEVSX1ZBTElEQVRFX0VNQUlMLCBGSUxURVJfTlVMTF9PTl9GQUlMVVJFIHwgRklMVEVSX0ZMQUdfRU1BSUxfVU5JQ09ERSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6Rk9STUFUX0VNQUlMKCksICRwYXRoLCBbJ2Zvcm1hdCcgPT4gJHNjaGVtYS0+Zm9ybWF0XSk7Cn0KYnJlYWs7CgpjYXNlICdpcC1hZGRyZXNzJzoKY2FzZSAnaXB2NCc6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmIG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnaXB2Nic6CmlmIChpc19zdHJpbmcoJGVsZW1lbnQpICYmIG51bGwgPT09IGZpbHRlcl92YXIoJGVsZW1lbnQsIEZJTFRFUl9WQUxJREFURV9JUCwgRklMVEVSX05VTExfT05fRkFJTFVSRSB8IEZJTFRFUl9GTEFHX0lQVjYpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkZPUk1BVF9JUCgpLCAkcGF0aCwgWydmb3JtYXQnID0+ICRzY2hlbWEtPmZvcm1hdF0pOwp9CmJyZWFrOwoKY2FzZSAnaG9zdC1uYW1lJzoKY2FzZSAnaG9zdG5hbWUnOgppZiAoISR0aGlzLT52YWxpZGF0ZUhvc3RuYW1lKCRlbGVtZW50KSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpGT1JNQVRfSE9TVE5BTUUoKSwgJHBhdGgsIFsnZm9ybWF0JyA9PiAkc2NoZW1hLT5mb3JtYXRdKTsKfQpicmVhazsKCmRlZmF1bHQ6CgoKCgoKCmJyZWFrOwp9Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZURhdGVUaW1lKCRkYXRldGltZSwgJGZvcm1hdCkKewokZHQgPSBcRGF0ZVRpbWU6OmNyZWF0ZUZyb21Gb3JtYXQoJGZvcm1hdCwgKHN0cmluZykgJGRhdGV0aW1lKTsKCmlmICghJGR0KSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCRkYXRldGltZSA9PT0gJGR0LT5mb3JtYXQoJGZvcm1hdCkpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUmVnZXgoJHJlZ2V4KQp7CmlmICghaXNfc3RyaW5nKCRyZWdleCkpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZSAhPT0gQHByZWdfbWF0Y2goc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRyZWdleCksICcnKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlQ29sb3IoJGNvbG9yKQp7CmlmICghaXNfc3RyaW5nKCRjb2xvcikpIHsKcmV0dXJuIHRydWU7Cn0KCmlmIChpbl9hcnJheShzdHJ0b2xvd2VyKCRjb2xvciksIFsnYXF1YScsICdibGFjaycsICdibHVlJywgJ2Z1Y2hzaWEnLAonZ3JheScsICdncmVlbicsICdsaW1lJywgJ21hcm9vbicsICduYXZ5JywgJ29saXZlJywgJ29yYW5nZScsICdwdXJwbGUnLAoncmVkJywgJ3NpbHZlcicsICd0ZWFsJywgJ3doaXRlJywgJ3llbGxvdyddKSkgewpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIHByZWdfbWF0Y2goJy9eIyhbYS1mMC05XXszfXxbYS1mMC05XXs2fSkkL2knLCAkY29sb3IpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVTdHlsZSgkc3R5bGUpCnsKJHByb3BlcnRpZXMgPSBleHBsb2RlKCc7JywgcnRyaW0oJHN0eWxlLCAnOycpKTsKJGludmFsaWRFbnRyaWVzID0gcHJlZ19ncmVwKCcvXlxzKlstYS16XStccyo6XHMqLiskL2knLCAkcHJvcGVydGllcywgUFJFR19HUkVQX0lOVkVSVCk7CgpyZXR1cm4gZW1wdHkoJGludmFsaWRFbnRyaWVzKTsKfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlUGhvbmUoJHBob25lKQp7CnJldHVybiBwcmVnX21hdGNoKCcvXlwrPyhcKFxkezN9XCl8XGR7M30pIFxkezN9IFxkezR9JC8nLCAkcGhvbmUpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVIb3N0bmFtZSgkaG9zdCkKewppZiAoIWlzX3N0cmluZygkaG9zdCkpIHsKcmV0dXJuIHRydWU7Cn0KCiRob3N0bmFtZVJlZ2V4ID0gJy9eKChbYS16QS1aMC05XXxbYS16QS1aMC05XVthLXpBLVowLTlcLV0qW2EtekEtWjAtOV0pXC4pKihbQS1aYS16MC05XXxbQS1aYS16MC05XVtBLVphLXowLTlcLV0qW0EtWmEtejAtOV0pJC9pJzsKCnJldHVybiBwcmVnX21hdGNoKCRob3N0bmFtZVJlZ2V4LCAkaG9zdCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCgoKCgoKCmNsYXNzIE51bWJlckNvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKGlzc2V0KCRzY2hlbWEtPmV4Y2x1c2l2ZU1pbmltdW0pKSB7CmlmIChpc3NldCgkc2NoZW1hLT5taW5pbXVtKSkgewppZiAoJHNjaGVtYS0+ZXhjbHVzaXZlTWluaW11bSAmJiAkZWxlbWVudCA8PSAkc2NoZW1hLT5taW5pbXVtKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkVYQ0xVU0lWRV9NSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW1dKTsKfSBlbHNlaWYgKCRlbGVtZW50IDwgJHNjaGVtYS0+bWluaW11bSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSU5JTVVNKCksICRwYXRoLCBbJ21pbmltdW0nID0+ICRzY2hlbWEtPm1pbmltdW1dKTsKfQp9IGVsc2UgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNSVNTSU5HX01JTklNVU0oKSwgJHBhdGgpOwp9Cn0gZWxzZWlmIChpc3NldCgkc2NoZW1hLT5taW5pbXVtKSAmJiAkZWxlbWVudCA8ICRzY2hlbWEtPm1pbmltdW0pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TUlOSU1VTSgpLCAkcGF0aCwgWydtaW5pbXVtJyA9PiAkc2NoZW1hLT5taW5pbXVtXSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+ZXhjbHVzaXZlTWF4aW11bSkpIHsKaWYgKGlzc2V0KCRzY2hlbWEtPm1heGltdW0pKSB7CmlmICgkc2NoZW1hLT5leGNsdXNpdmVNYXhpbXVtICYmICRlbGVtZW50ID49ICRzY2hlbWEtPm1heGltdW0pIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RVhDTFVTSVZFX01BWElNVU0oKSwgJHBhdGgsIFsnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bV0pOwp9IGVsc2VpZiAoJGVsZW1lbnQgPiAkc2NoZW1hLT5tYXhpbXVtKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1BWElNVU0oKSwgJHBhdGgsIFsnbWF4aW11bScgPT4gJHNjaGVtYS0+bWF4aW11bV0pOwp9Cn0gZWxzZSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6Ok1JU1NJTkdfTUFYSU1VTSgpLCAkcGF0aCk7Cn0KfSBlbHNlaWYgKGlzc2V0KCRzY2hlbWEtPm1heGltdW0pICYmICRlbGVtZW50ID4gJHNjaGVtYS0+bWF4aW11bSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNQVhJTVVNKCksICRwYXRoLCBbJ21heGltdW0nID0+ICRzY2hlbWEtPm1heGltdW1dKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kaXZpc2libGVCeSkgJiYgJHRoaXMtPmZtb2QoJGVsZW1lbnQsICRzY2hlbWEtPmRpdmlzaWJsZUJ5KSAhPSAwKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkRJVklTSUJMRV9CWSgpLCAkcGF0aCwgWydkaXZpc2libGVCeScgPT4gJHNjaGVtYS0+ZGl2aXNpYmxlQnldKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5tdWx0aXBsZU9mKSAmJiAkdGhpcy0+Zm1vZCgkZWxlbWVudCwgJHNjaGVtYS0+bXVsdGlwbGVPZikgIT0gMCkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpNVUxUSVBMRV9PRigpLCAkcGF0aCwgWydtdWx0aXBsZU9mJyA9PiAkc2NoZW1hLT5tdWx0aXBsZU9mXSk7Cn0KCiR0aGlzLT5jaGVja0Zvcm1hdCgkZWxlbWVudCwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBmbW9kKCRudW1iZXIxLCAkbnVtYmVyMikKewokbW9kdWx1cyA9ICgkbnVtYmVyMSAtIHJvdW5kKCRudW1iZXIxIC8gJG51bWJlcjIpICogJG51bWJlcjIpOwokcHJlY2lzaW9uID0gMC4wMDAwMDAwMDAxOwoKaWYgKC0kcHJlY2lzaW9uIDwgJG1vZHVsdXMgJiYgJG1vZHVsdXMgPCAkcHJlY2lzaW9uKSB7CnJldHVybiAwLjA7Cn0KCnJldHVybiAkbW9kdWx1czsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CgpjbGFzcyBPYmplY3RDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnByb3RlY3RlZCAkYXBwbGllZERlZmF1bHRzID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygKJiRlbGVtZW50LAokc2NoZW1hID0gbnVsbCwKP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwKJHByb3BlcnRpZXMgPSBudWxsLAokYWRkaXRpb25hbFByb3AgPSBudWxsLAokcGF0dGVyblByb3BlcnRpZXMgPSBudWxsLAokYXBwbGllZERlZmF1bHRzID0gW10KKTogdm9pZCB7CmlmICgkZWxlbWVudCBpbnN0YW5jZW9mIFVuZGVmaW5lZENvbnN0cmFpbnQpIHsKcmV0dXJuOwp9CgokdGhpcy0+YXBwbGllZERlZmF1bHRzID0gJGFwcGxpZWREZWZhdWx0czsKCiRtYXRjaGVzID0gW107CmlmICgkcGF0dGVyblByb3BlcnRpZXMpIHsKCiRtYXRjaGVzID0gJHRoaXMtPnZhbGlkYXRlUGF0dGVyblByb3BlcnRpZXMoJGVsZW1lbnQsICRwYXRoLCAkcGF0dGVyblByb3BlcnRpZXMpOwp9CgppZiAoJHByb3BlcnRpZXMpIHsKCiR0aGlzLT52YWxpZGF0ZVByb3BlcnRpZXMoJGVsZW1lbnQsICRwcm9wZXJ0aWVzLCAkcGF0aCk7Cn0KCgokdGhpcy0+dmFsaWRhdGVFbGVtZW50KCRlbGVtZW50LCAkbWF0Y2hlcywgJHNjaGVtYSwgJHBhdGgsICRwcm9wZXJ0aWVzLCAkYWRkaXRpb25hbFByb3ApOwp9CgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuUHJvcGVydGllcygkZWxlbWVudCwgP0pzb25Qb2ludGVyICRwYXRoLCAkcGF0dGVyblByb3BlcnRpZXMpCnsKJG1hdGNoZXMgPSBbXTsKZm9yZWFjaCAoJHBhdHRlcm5Qcm9wZXJ0aWVzIGFzICRwcmVnZXggPT4gJHNjaGVtYSkgewokZnVsbFJlZ2V4ID0gc2VsZjo6anNvblBhdHRlcm5Ub1BocFJlZ2V4KCRwcmVnZXgpOwoKCmlmIChAcHJlZ19tYXRjaCgkZnVsbFJlZ2V4LCAnJykgPT09IGZhbHNlKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBSRUdFWF9JTlZBTElEKCksICRwYXRoLCBbJ3ByZWdleCcgPT4gJHByZWdleF0pOwpjb250aW51ZTsKfQpmb3JlYWNoICgkZWxlbWVudCBhcyAkaSA9PiAkdmFsdWUpIHsKaWYgKHByZWdfbWF0Y2goJGZ1bGxSZWdleCwgJGkpKSB7CiRtYXRjaGVzW10gPSAkaTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHNjaGVtYSA/OiBuZXcgXHN0ZENsYXNzKCksICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9Cn0KCnJldHVybiAkbWF0Y2hlczsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB2YWxpZGF0ZUVsZW1lbnQoJGVsZW1lbnQsICRtYXRjaGVzLCAkc2NoZW1hID0gbnVsbCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwKJHByb3BlcnRpZXMgPSBudWxsLCAkYWRkaXRpb25hbFByb3AgPSBudWxsKQp7CiR0aGlzLT52YWxpZGF0ZU1pbk1heENvbnN0cmFpbnQoJGVsZW1lbnQsICRzY2hlbWEsICRwYXRoKTsKCmZvcmVhY2ggKCRlbGVtZW50IGFzICRpID0+ICR2YWx1ZSkgewokZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXRQcm9wZXJ0eSgkcHJvcGVydGllcywgJGkpOwoKCmlmICghaW5fYXJyYXkoJGksICRtYXRjaGVzKSAmJiAkYWRkaXRpb25hbFByb3AgPT09IGZhbHNlICYmICR0aGlzLT5pbmxpbmVTY2hlbWFQcm9wZXJ0eSAhPT0gJGkgJiYgISRkZWZpbml0aW9uKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFERElUSU9OQUxfUFJPUEVSVElFUygpLCAkcGF0aCwgWydwcm9wZXJ0eScgPT4gJGldKTsKfQoKCmlmICghaW5fYXJyYXkoJGksICRtYXRjaGVzKSAmJiAkYWRkaXRpb25hbFByb3AgJiYgISRkZWZpbml0aW9uKSB7CmlmICgkYWRkaXRpb25hbFByb3AgPT09IHRydWUpIHsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgbnVsbCwgJHBhdGgsICRpLCBpbl9hcnJheSgkaSwgJHRoaXMtPmFwcGxpZWREZWZhdWx0cykpOwp9IGVsc2UgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkYWRkaXRpb25hbFByb3AsICRwYXRoLCAkaSwgaW5fYXJyYXkoJGksICR0aGlzLT5hcHBsaWVkRGVmYXVsdHMpKTsKfQp9CgoKJHJlcXVpcmUgPSAkdGhpcy0+Z2V0UHJvcGVydHkoJGRlZmluaXRpb24sICdyZXF1aXJlcycpOwppZiAoJHJlcXVpcmUgJiYgISR0aGlzLT5nZXRQcm9wZXJ0eSgkZWxlbWVudCwgJHJlcXVpcmUpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVTKCksICRwYXRoLCBbCidwcm9wZXJ0eScgPT4gJGksCidyZXF1aXJlZFByb3BlcnR5JyA9PiAkcmVxdWlyZQpdKTsKfQoKJHByb3BlcnR5ID0gJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkaSwgJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKSk7CmlmIChpc19vYmplY3QoJHByb3BlcnR5KSkgewokdGhpcy0+dmFsaWRhdGVNaW5NYXhDb25zdHJhaW50KCEoJHByb3BlcnR5IGluc3RhbmNlb2YgVW5kZWZpbmVkQ29uc3RyYWludCkgPyAkcHJvcGVydHkgOiAkZWxlbWVudCwgJGRlZmluaXRpb24sICRwYXRoKTsKfQp9Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0aWVzKCYkZWxlbWVudCwgJHByb3BlcnRpZXMgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsKQp7CiR1bmRlZmluZWRDb25zdHJhaW50ID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCd1bmRlZmluZWQnKTsKCmZvcmVhY2ggKCRwcm9wZXJ0aWVzIGFzICRpID0+ICR2YWx1ZSkgewokcHJvcGVydHkgPSAmJHRoaXMtPmdldFByb3BlcnR5KCRlbGVtZW50LCAkaSwgJHVuZGVmaW5lZENvbnN0cmFpbnQpOwokZGVmaW5pdGlvbiA9ICR0aGlzLT5nZXRQcm9wZXJ0eSgkcHJvcGVydGllcywgJGkpOwoKaWYgKGlzX29iamVjdCgkZGVmaW5pdGlvbikpIHsKCiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkcHJvcGVydHksICRkZWZpbml0aW9uLCAkcGF0aCwgJGksIGluX2FycmF5KCRpLCAkdGhpcy0+YXBwbGllZERlZmF1bHRzKSk7Cn0KfQp9CgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gJmdldFByb3BlcnR5KCYkZWxlbWVudCwgJHByb3BlcnR5LCAkZmFsbGJhY2sgPSBudWxsKQp7CmlmIChpc19hcnJheSgkZWxlbWVudCkgJiYgKGlzc2V0KCRlbGVtZW50WyRwcm9wZXJ0eV0pIHx8IGFycmF5X2tleV9leGlzdHMoJHByb3BlcnR5LCAkZWxlbWVudCkpICkgewpyZXR1cm4gJGVsZW1lbnRbJHByb3BlcnR5XTsKfSBlbHNlaWYgKGlzX29iamVjdCgkZWxlbWVudCkgJiYgcHJvcGVydHlfZXhpc3RzKCRlbGVtZW50LCAoc3RyaW5nKSAkcHJvcGVydHkpKSB7CnJldHVybiAkZWxlbWVudC0+JHByb3BlcnR5Owp9CgpyZXR1cm4gJGZhbGxiYWNrOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlTWluTWF4Q29uc3RyYWludCgkZWxlbWVudCwgJG9iamVjdERlZmluaXRpb24sID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwpCnsKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCk6OmlzT2JqZWN0KCRlbGVtZW50KSkgewpyZXR1cm47Cn0KCgppZiAoaXNzZXQoJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpICYmIGlzX2ludCgkb2JqZWN0RGVmaW5pdGlvbi0+bWluUHJvcGVydGllcykpIHsKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlDb3VudCgkZWxlbWVudCkgPCBtYXgoMCwgJG9iamVjdERlZmluaXRpb24tPm1pblByb3BlcnRpZXMpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBST1BFUlRJRVNfTUlOKCksICRwYXRoLCBbJ21pblByb3BlcnRpZXMnID0+ICRvYmplY3REZWZpbml0aW9uLT5taW5Qcm9wZXJ0aWVzXSk7Cn0KfQoKaWYgKGlzc2V0KCRvYmplY3REZWZpbml0aW9uLT5tYXhQcm9wZXJ0aWVzKSAmJiBpc19pbnQoJG9iamVjdERlZmluaXRpb24tPm1heFByb3BlcnRpZXMpKSB7CmlmICgkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPnByb3BlcnR5Q291bnQoJGVsZW1lbnQpID4gbWF4KDAsICRvYmplY3REZWZpbml0aW9uLT5tYXhQcm9wZXJ0aWVzKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpQUk9QRVJUSUVTX01BWCgpLCAkcGF0aCwgWydtYXhQcm9wZXJ0aWVzJyA9PiAkb2JqZWN0RGVmaW5pdGlvbi0+bWF4UHJvcGVydGllc10pOwp9Cn0KfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcRHJhZnRJZGVudGlmaWVyczsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZFNjaGVtYUV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgoKCmNsYXNzIFNjaGVtYUNvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKcHJpdmF0ZSBjb25zdCBERUZBVUxUX1NDSEVNQV9TUEVDID0gRHJhZnRJZGVudGlmaWVyczo6RFJBRlRfNDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaGVjaygmJGVsZW1lbnQsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKaWYgKCRzY2hlbWEgIT09IG51bGwpIHsKCiR2YWxpZGF0aW9uU2NoZW1hID0gJHNjaGVtYTsKfSBlbHNlaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJGVsZW1lbnQsICR0aGlzLT5pbmxpbmVTY2hlbWFQcm9wZXJ0eSkpIHsKCiR2YWxpZGF0aW9uU2NoZW1hID0gJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUdldCgkZWxlbWVudCwgJHRoaXMtPmlubGluZVNjaGVtYVByb3BlcnR5KTsKfSBlbHNlIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignbm8gc2NoZW1hIGZvdW5kIHRvIHZlcmlmeSBhZ2FpbnN0Jyk7Cn0KCgppZiAoaXNfYXJyYXkoJHZhbGlkYXRpb25TY2hlbWEpKSB7CiR2YWxpZGF0aW9uU2NoZW1hID0gQmFzZUNvbnN0cmFpbnQ6OmFycmF5VG9PYmplY3RSZWN1cnNpdmUoJHZhbGlkYXRpb25TY2hlbWEpOwp9CgoKCmlmICgkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfVkFMSURBVEVfU0NIRU1BKSkgewppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbGlkYXRpb25TY2hlbWEpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdDYW5ub3QgdmFsaWRhdGUgdGhlIHNjaGVtYSBvZiBhIG5vbi1vYmplY3QnKTsKfQppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkdmFsaWRhdGlvblNjaGVtYSwgJyRzY2hlbWEnKSkgewokc2NoZW1hU3BlYyA9ICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlHZXQoJHZhbGlkYXRpb25TY2hlbWEsICckc2NoZW1hJyk7Cn0gZWxzZSB7CiRzY2hlbWFTcGVjID0gc2VsZjo6REVGQVVMVF9TQ0hFTUFfU1BFQzsKfQoKCiRzY2hlbWFTdG9yYWdlID0gJHRoaXMtPmZhY3RvcnktPmdldFNjaGVtYVN0b3JhZ2UoKTsKaWYgKCEkdGhpcy0+Z2V0VHlwZUNoZWNrKCktPmlzT2JqZWN0KCRzY2hlbWFTcGVjKSkgewokc2NoZW1hU3BlYyA9ICRzY2hlbWFTdG9yYWdlLT5nZXRTY2hlbWEoJHNjaGVtYVNwZWMpOwp9CgoKJGluaXRpYWxFcnJvckNvdW50ID0gJHRoaXMtPm51bUVycm9ycygpOwokaW5pdGlhbENvbmZpZyA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoKTsKJGluaXRpYWxDb250ZXh0ID0gJHRoaXMtPmZhY3RvcnktPmdldEVycm9yQ29udGV4dCgpOwokdGhpcy0+ZmFjdG9yeS0+cmVtb3ZlQ29uZmlnKHNlbGY6OkNIRUNLX01PREVfVkFMSURBVEVfU0NIRU1BIHwgc2VsZjo6Q0hFQ0tfTU9ERV9BUFBMWV9ERUZBVUxUUyk7CiR0aGlzLT5mYWN0b3J5LT5hZGRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9UWVBFX0NBU1QpOwokdGhpcy0+ZmFjdG9yeS0+c2V0RXJyb3JDb250ZXh0KFZhbGlkYXRvcjo6RVJST1JfU0NIRU1BX1ZBTElEQVRJT04pOwoKCnRyeSB7CiR0aGlzLT5jaGVjaygkdmFsaWRhdGlvblNjaGVtYSwgJHNjaGVtYVNwZWMpOwp9IGNhdGNoIChcRXhjZXB0aW9uICRlKSB7CmlmICgkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfRVhDRVBUSU9OUykpIHsKdGhyb3cgbmV3IEludmFsaWRTY2hlbWFFeGNlcHRpb24oJ1NjaGVtYSBkaWQgbm90IHBhc3MgdmFsaWRhdGlvbicsIDAsICRlKTsKfQp9CmlmICgkdGhpcy0+bnVtRXJyb3JzKCkgPiAkaW5pdGlhbEVycm9yQ291bnQpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6SU5WQUxJRF9TQ0hFTUEoKSwgJHBhdGgpOwp9CgoKJHRoaXMtPmZhY3RvcnktPnNldENvbmZpZygkaW5pdGlhbENvbmZpZyk7CiR0aGlzLT5mYWN0b3J5LT5zZXRFcnJvckNvbnRleHQoJGluaXRpYWxDb250ZXh0KTsKfQoKCiR0aGlzLT5jaGVja1VuZGVmaW5lZCgkZWxlbWVudCwgJHZhbGlkYXRpb25TY2hlbWEsICRwYXRoLCAkaSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcQ29uc3RyYWludHM7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50RXJyb3I7CnVzZSBKc29uU2NoZW1hXEVudGl0eVxKc29uUG9pbnRlcjsKCgoKCgoKCmNsYXNzIFN0cmluZ0NvbnN0cmFpbnQgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrKCYkZWxlbWVudCwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCk6IHZvaWQKewoKaWYgKGlzc2V0KCRzY2hlbWEtPm1heExlbmd0aCkgJiYgJHRoaXMtPnN0cmxlbigkZWxlbWVudCkgPiAkc2NoZW1hLT5tYXhMZW5ndGgpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TEVOR1RIX01BWCgpLCAkcGF0aCwgWwonbWF4TGVuZ3RoJyA9PiAkc2NoZW1hLT5tYXhMZW5ndGgsCl0pOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPm1pbkxlbmd0aCkgJiYgJHRoaXMtPnN0cmxlbigkZWxlbWVudCkgPCAkc2NoZW1hLT5taW5MZW5ndGgpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6TEVOR1RIX01JTigpLCAkcGF0aCwgWwonbWluTGVuZ3RoJyA9PiAkc2NoZW1hLT5taW5MZW5ndGgsCl0pOwp9CgoKaWYgKGlzc2V0KCRzY2hlbWEtPnBhdHRlcm4pICYmICFwcmVnX21hdGNoKHNlbGY6Ompzb25QYXR0ZXJuVG9QaHBSZWdleCgkc2NoZW1hLT5wYXR0ZXJuKSwgJGVsZW1lbnQpKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlBBVFRFUk4oKSwgJHBhdGgsIFsKJ3BhdHRlcm4nID0+ICRzY2hlbWEtPnBhdHRlcm4sCl0pOwp9CgokdGhpcy0+Y2hlY2tGb3JtYXQoJGVsZW1lbnQsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gc3RybGVuKCRzdHJpbmcpCnsKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ21ic3RyaW5nJykpIHsKcmV0dXJuIG1iX3N0cmxlbigkc3RyaW5nLCBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZykpOwp9CgoKcmV0dXJuIHN0cmxlbigkc3RyaW5nKTsgCn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2s7CgpjbGFzcyBMb29zZVR5cGVDaGVjayBpbXBsZW1lbnRzIFR5cGVDaGVja0ludGVyZmFjZQp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNPYmplY3QoJHZhbHVlKQp7CnJldHVybgppc19vYmplY3QoJHZhbHVlKSB8fAooaXNfYXJyYXkoJHZhbHVlKSAmJiAoY291bnQoJHZhbHVlKSA9PSAwIHx8IHNlbGY6OmlzQXNzb2NpYXRpdmVBcnJheSgkdmFsdWUpKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBcnJheSgkdmFsdWUpCnsKcmV0dXJuCmlzX2FycmF5KCR2YWx1ZSkgJiYKKGNvdW50KCR2YWx1ZSkgPT0gMCB8fCAhc2VsZjo6aXNBc3NvY2lhdGl2ZUFycmF5KCR2YWx1ZSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5R2V0KCR2YWx1ZSwgJHByb3BlcnR5KQp7CmlmIChpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gJHZhbHVlLT57JHByb3BlcnR5fTsKfQoKcmV0dXJuICR2YWx1ZVskcHJvcGVydHldOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5U2V0KCYkdmFsdWUsICRwcm9wZXJ0eSwgJGRhdGEpCnsKaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CiR2YWx1ZS0+eyRwcm9wZXJ0eX0gPSAkZGF0YTsKfSBlbHNlIHsKJHZhbHVlWyRwcm9wZXJ0eV0gPSAkZGF0YTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByb3BlcnR5RXhpc3RzKCR2YWx1ZSwgJHByb3BlcnR5KQp7CmlmIChpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gcHJvcGVydHlfZXhpc3RzKCR2YWx1ZSwgJHByb3BlcnR5KTsKfQoKcmV0dXJuIGlzX2FycmF5KCR2YWx1ZSkgJiYgYXJyYXlfa2V5X2V4aXN0cygkcHJvcGVydHksICR2YWx1ZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlDb3VudCgkdmFsdWUpCnsKaWYgKGlzX29iamVjdCgkdmFsdWUpKSB7CnJldHVybiBjb3VudChnZXRfb2JqZWN0X3ZhcnMoJHZhbHVlKSk7Cn0KCnJldHVybiBjb3VudCgkdmFsdWUpOwp9CgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaXNBc3NvY2lhdGl2ZUFycmF5KCRhcnIpCnsKcmV0dXJuIGFycmF5X2tleXMoJGFycikgIT09IHJhbmdlKDAsIGNvdW50KCRhcnIpIC0gMSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2s7CgpjbGFzcyBTdHJpY3RUeXBlQ2hlY2sgaW1wbGVtZW50cyBUeXBlQ2hlY2tJbnRlcmZhY2UKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT2JqZWN0KCR2YWx1ZSkKewpyZXR1cm4gaXNfb2JqZWN0KCR2YWx1ZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBcnJheSgkdmFsdWUpCnsKcmV0dXJuIGlzX2FycmF5KCR2YWx1ZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlHZXQoJHZhbHVlLCAkcHJvcGVydHkpCnsKcmV0dXJuICR2YWx1ZS0+eyRwcm9wZXJ0eX07Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlTZXQoJiR2YWx1ZSwgJHByb3BlcnR5LCAkZGF0YSkKewokdmFsdWUtPnskcHJvcGVydHl9ID0gJGRhdGE7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkcHJvcGVydHkpCnsKcmV0dXJuIHByb3BlcnR5X2V4aXN0cygkdmFsdWUsICRwcm9wZXJ0eSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlDb3VudCgkdmFsdWUpCnsKaWYgKCFpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gMDsKfQoKcmV0dXJuIGNvdW50KGdldF9vYmplY3RfdmFycygkdmFsdWUpKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXFR5cGVDaGVjazsKCmludGVyZmFjZSBUeXBlQ2hlY2tJbnRlcmZhY2UKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzT2JqZWN0KCR2YWx1ZSk7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQXJyYXkoJHZhbHVlKTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlHZXQoJHZhbHVlLCAkcHJvcGVydHkpOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eVNldCgmJHZhbHVlLCAkcHJvcGVydHksICRkYXRhKTsKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkcHJvcGVydHkpOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBwcm9wZXJ0eUNvdW50KCR2YWx1ZSk7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzOwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb24gYXMgU3RhbmRhcmRVbmV4cGVjdGVkVmFsdWVFeGNlcHRpb247CgoKCgoKCgpjbGFzcyBUeXBlQ29uc3RyYWludCBleHRlbmRzIENvbnN0cmFpbnQKewoKCgpwdWJsaWMgc3RhdGljICR3b3JkaW5nID0gWwonaW50ZWdlcicgPT4gJ2FuIGludGVnZXInLAonbnVtYmVyJyA9PiAnYSBudW1iZXInLAonYm9vbGVhbicgPT4gJ2EgYm9vbGVhbicsCidvYmplY3QnID0+ICdhbiBvYmplY3QnLAonYXJyYXknID0+ICdhbiBhcnJheScsCidzdHJpbmcnID0+ICdhIHN0cmluZycsCidudWxsJyA9PiAnYSBudWxsJywKJ2FueScgPT4gbnVsbCwgCjAgPT4gbnVsbCwgCl07CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSA9IG51bGwsICRzY2hlbWEgPSBudWxsLCA/SnNvblBvaW50ZXIgJHBhdGggPSBudWxsLCAkaSA9IG51bGwpOiB2b2lkCnsKJHR5cGUgPSBpc3NldCgkc2NoZW1hLT50eXBlKSA/ICRzY2hlbWEtPnR5cGUgOiBudWxsOwokaXNWYWxpZCA9IGZhbHNlOwokY29lcmNlID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0NPRVJDRV9UWVBFUyk7CiRlYXJseUNvZXJjZSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRDb25maWcoc2VsZjo6Q0hFQ0tfTU9ERV9FQVJMWV9DT0VSQ0UpOwokd29yZGluZyA9IFtdOwoKaWYgKGlzX2FycmF5KCR0eXBlKSkgewokdGhpcy0+dmFsaWRhdGVUeXBlc0FycmF5KCR2YWx1ZSwgJHR5cGUsICR3b3JkaW5nLCAkaXNWYWxpZCwgJHBhdGgsICRjb2VyY2UgJiYgJGVhcmx5Q29lcmNlKTsKaWYgKCEkaXNWYWxpZCAmJiAkY29lcmNlICYmICEkZWFybHlDb2VyY2UpIHsKJHRoaXMtPnZhbGlkYXRlVHlwZXNBcnJheSgkdmFsdWUsICR0eXBlLCAkd29yZGluZywgJGlzVmFsaWQsICRwYXRoLCB0cnVlKTsKfQp9IGVsc2VpZiAoaXNfb2JqZWN0KCR0eXBlKSkgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkdHlwZSwgJHBhdGgpOwoKcmV0dXJuOwp9IGVsc2UgewokaXNWYWxpZCA9ICR0aGlzLT52YWxpZGF0ZVR5cGUoJHZhbHVlLCAkdHlwZSwgJGNvZXJjZSAmJiAkZWFybHlDb2VyY2UpOwppZiAoISRpc1ZhbGlkICYmICRjb2VyY2UgJiYgISRlYXJseUNvZXJjZSkgewokaXNWYWxpZCA9ICR0aGlzLT52YWxpZGF0ZVR5cGUoJHZhbHVlLCAkdHlwZSwgdHJ1ZSk7Cn0KfQoKaWYgKCRpc1ZhbGlkID09PSBmYWxzZSkgewppZiAoIWlzX2FycmF5KCR0eXBlKSkgewokdGhpcy0+dmFsaWRhdGVUeXBlTmFtZVdvcmRpbmcoJHR5cGUpOwokd29yZGluZ1tdID0gc2VsZjo6JHdvcmRpbmdbJHR5cGVdOwp9CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlRZUEUoKSwgJHBhdGgsIFsKJ2ZvdW5kJyA9PiBnZXR0eXBlKCR2YWx1ZSksCidleHBlY3RlZCcgPT4gJHRoaXMtPmltcGxvZGVXaXRoKCR3b3JkaW5nLCAnLCAnLCAnb3InKQpdKTsKfQp9CgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdmFsaWRhdGVUeXBlc0FycmF5KCYkdmFsdWUsIGFycmF5ICR0eXBlLCAmJHZhbGlkVHlwZXNXb3JkaW5nLCAmJGlzVmFsaWQsICRwYXRoLCAkY29lcmNlID0gZmFsc2UpCnsKZm9yZWFjaCAoJHR5cGUgYXMgJHRwKSB7CgppZiAoJGlzVmFsaWQpIHsKcmV0dXJuOwp9CgoKCmlmIChpc19vYmplY3QoJHRwKSkgewppZiAoISRpc1ZhbGlkKSB7CiR2YWxpZGF0b3IgPSAkdGhpcy0+ZmFjdG9yeS0+Y3JlYXRlSW5zdGFuY2VGb3IoJ3R5cGUnKTsKJHN1YlNjaGVtYSA9IG5ldyBcc3RkQ2xhc3MoKTsKJHN1YlNjaGVtYS0+dHlwZSA9ICR0cDsKJHZhbGlkYXRvci0+Y2hlY2soJHZhbHVlLCAkc3ViU2NoZW1hLCAkcGF0aCwgbnVsbCk7CiRlcnJvciA9ICR2YWxpZGF0b3ItPmdldEVycm9ycygpOwokaXNWYWxpZCA9ICEoYm9vbCkgJGVycm9yOwokdmFsaWRUeXBlc1dvcmRpbmdbXSA9IHNlbGY6OiR3b3JkaW5nWydvYmplY3QnXTsKfQp9IGVsc2UgewokdGhpcy0+dmFsaWRhdGVUeXBlTmFtZVdvcmRpbmcoJHRwKTsKJHZhbGlkVHlwZXNXb3JkaW5nW10gPSBzZWxmOjokd29yZGluZ1skdHBdOwppZiAoISRpc1ZhbGlkKSB7CiRpc1ZhbGlkID0gJHRoaXMtPnZhbGlkYXRlVHlwZSgkdmFsdWUsICR0cCwgJGNvZXJjZSk7Cn0KfQp9Cn0KCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGltcGxvZGVXaXRoKGFycmF5ICRlbGVtZW50cywgJGRlbGltaXRlciA9ICcsICcsICRsaXN0RW5kID0gZmFsc2UpCnsKaWYgKCRsaXN0RW5kID09PSBmYWxzZSB8fCAhaXNzZXQoJGVsZW1lbnRzWzFdKSkgewpyZXR1cm4gaW1wbG9kZSgkZGVsaW1pdGVyLCAkZWxlbWVudHMpOwp9CiRsYXN0RWxlbWVudCA9IGFycmF5X3NsaWNlKCRlbGVtZW50cywgLTEpOwokZmlyc0VsZW1lbnRzID0gam9pbigkZGVsaW1pdGVyLCBhcnJheV9zbGljZSgkZWxlbWVudHMsIDAsIC0xKSk7CiRpbXBsb2RlZEVsZW1lbnRzID0gYXJyYXlfbWVyZ2UoWyRmaXJzRWxlbWVudHNdLCAkbGFzdEVsZW1lbnQpOwoKcmV0dXJuIGpvaW4oIiAkbGlzdEVuZCAiLCAkaW1wbG9kZWRFbGVtZW50cyk7Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZU5hbWVXb3JkaW5nKCR0eXBlKQp7CmlmICghYXJyYXlfa2V5X2V4aXN0cygkdHlwZSwgc2VsZjo6JHdvcmRpbmcpKSB7CnRocm93IG5ldyBTdGFuZGFyZFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbigKc3ByaW50ZigKJ05vIHdvcmRpbmcgZm9yICVzIGF2YWlsYWJsZSwgZXhwZWN0ZWQgd29yZGluZ3MgYXJlOiBbJXNdJywKdmFyX2V4cG9ydCgkdHlwZSwgdHJ1ZSksCmltcGxvZGUoJywgJywgYXJyYXlfZmlsdGVyKHNlbGY6OiR3b3JkaW5nKSkpCik7Cn0KfQoKCgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZVR5cGUoJiR2YWx1ZSwgJHR5cGUsICRjb2VyY2UgPSBmYWxzZSkKewoKaWYgKCEkdHlwZSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCdhbnknID09PSAkdHlwZSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCdvYmplY3QnID09PSAkdHlwZSkgewpyZXR1cm4gJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkdmFsdWUpOwp9CgppZiAoJ2FycmF5JyA9PT0gJHR5cGUpIHsKaWYgKCRjb2VyY2UpIHsKJHZhbHVlID0gJHRoaXMtPnRvQXJyYXkoJHZhbHVlKTsKfQoKcmV0dXJuICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpOwp9CgppZiAoJ2ludGVnZXInID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9JbnRlZ2VyKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19pbnQoJHZhbHVlKTsKfQoKaWYgKCdudW1iZXInID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9OdW1iZXIoJHZhbHVlKTsKfQoKcmV0dXJuIGlzX251bWVyaWMoJHZhbHVlKSAmJiAhaXNfc3RyaW5nKCR2YWx1ZSk7Cn0KCmlmICgnYm9vbGVhbicgPT09ICR0eXBlKSB7CmlmICgkY29lcmNlKSB7CiR2YWx1ZSA9ICR0aGlzLT50b0Jvb2xlYW4oJHZhbHVlKTsKfQoKcmV0dXJuIGlzX2Jvb2woJHZhbHVlKTsKfQoKaWYgKCdzdHJpbmcnID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9TdHJpbmcoJHZhbHVlKTsKfQoKcmV0dXJuIGlzX3N0cmluZygkdmFsdWUpOwp9CgppZiAoJ251bGwnID09PSAkdHlwZSkgewppZiAoJGNvZXJjZSkgewokdmFsdWUgPSAkdGhpcy0+dG9OdWxsKCR2YWx1ZSk7Cn0KCnJldHVybiBpc19udWxsKCR2YWx1ZSk7Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oKGlzX29iamVjdCgkdmFsdWUpID8gJ29iamVjdCcgOiAkdmFsdWUpIC4gJyBpcyBhbiBpbnZhbGlkIHR5cGUgZm9yICcgLiAkdHlwZSk7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9Cb29sZWFuKCR2YWx1ZSkKewppZiAoJHZhbHVlID09PSAxIHx8ICR2YWx1ZSA9PT0gJ3RydWUnKSB7CnJldHVybiB0cnVlOwp9CmlmIChpc19udWxsKCR2YWx1ZSkgfHwgJHZhbHVlID09PSAwIHx8ICR2YWx1ZSA9PT0gJ2ZhbHNlJykgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpICYmIGNvdW50KCR2YWx1ZSkgPT09IDEpIHsKcmV0dXJuICR0aGlzLT50b0Jvb2xlYW4ocmVzZXQoJHZhbHVlKSk7Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9OdW1iZXIoJHZhbHVlKQp7CmlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuICR2YWx1ZSArIDA7IAp9CmlmIChpc19ib29sKCR2YWx1ZSkgfHwgaXNfbnVsbCgkdmFsdWUpKSB7CnJldHVybiAoaW50KSAkdmFsdWU7Cn0KaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpICYmIGNvdW50KCR2YWx1ZSkgPT09IDEpIHsKcmV0dXJuICR0aGlzLT50b051bWJlcihyZXNldCgkdmFsdWUpKTsKfQoKcmV0dXJuICR2YWx1ZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB0b0ludGVnZXIoJHZhbHVlKQp7CiRudW1iZXJWYWx1ZSA9ICR0aGlzLT50b051bWJlcigkdmFsdWUpOwppZiAoaXNfbnVtZXJpYygkbnVtYmVyVmFsdWUpICYmIChpbnQpICRudW1iZXJWYWx1ZSA9PSAkbnVtYmVyVmFsdWUpIHsKcmV0dXJuIChpbnQpICRudW1iZXJWYWx1ZTsgCn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9BcnJheSgkdmFsdWUpCnsKaWYgKGlzX3NjYWxhcigkdmFsdWUpIHx8IGlzX251bGwoJHZhbHVlKSkgewpyZXR1cm4gWyR2YWx1ZV07Cn0KCnJldHVybiAkdmFsdWU7Cn0KCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9TdHJpbmcoJHZhbHVlKQp7CmlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKcmV0dXJuICIkdmFsdWUiOwp9CmlmICgkdmFsdWUgPT09IHRydWUpIHsKcmV0dXJuICd0cnVlJzsKfQppZiAoJHZhbHVlID09PSBmYWxzZSkgewpyZXR1cm4gJ2ZhbHNlJzsKfQppZiAoaXNfbnVsbCgkdmFsdWUpKSB7CnJldHVybiAnJzsKfQppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc0FycmF5KCR2YWx1ZSkgJiYgY291bnQoJHZhbHVlKSA9PT0gMSkgewpyZXR1cm4gJHRoaXMtPnRvU3RyaW5nKHJlc2V0KCR2YWx1ZSkpOwp9CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvTnVsbCgkdmFsdWUpCnsKaWYgKCR2YWx1ZSA9PT0gMCB8fCAkdmFsdWUgPT09IGZhbHNlIHx8ICR2YWx1ZSA9PT0gJycpIHsKcmV0dXJuIG51bGw7Cn0KaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpICYmIGNvdW50KCR2YWx1ZSkgPT09IDEpIHsKcmV0dXJuICR0aGlzLT50b051bGwocmVzZXQoJHZhbHVlKSk7Cn0KCnJldHVybiAkdmFsdWU7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxDb25zdHJhaW50czsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcVHlwZUNoZWNrXExvb3NlVHlwZUNoZWNrOwp1c2UgSnNvblNjaGVtYVxFbnRpdHlcSnNvblBvaW50ZXI7CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxWYWxpZGF0aW9uRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxUb29sXERlZXBDb3B5Owp1c2UgSnNvblNjaGVtYVxVcmlcVXJpUmVzb2x2ZXI7CgojW1xBbGxvd0R5bmFtaWNQcm9wZXJ0aWVzXQpjbGFzcyBVbmRlZmluZWRDb25zdHJhaW50IGV4dGVuZHMgQ29uc3RyYWludAp7CgoKCnByb3RlY3RlZCAkYXBwbGllZERlZmF1bHRzID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJiR2YWx1ZSwgJHNjaGVtYSA9IG51bGwsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsICRpID0gbnVsbCwgYm9vbCAkZnJvbURlZmF1bHQgPSBmYWxzZSk6IHZvaWQKewppZiAoaXNfbnVsbCgkc2NoZW1hKSB8fCAhaXNfb2JqZWN0KCRzY2hlbWEpKSB7CnJldHVybjsKfQoKJHBhdGggPSAkdGhpcy0+aW5jcmVtZW50UGF0aCgkcGF0aCwgJGkpOwppZiAoJGZyb21EZWZhdWx0KSB7CiRwYXRoLT5zZXRGcm9tRGVmYXVsdCgpOwp9CgoKJHRoaXMtPnZhbGlkYXRlQ29tbW9uUHJvcGVydGllcygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7CgoKJHRoaXMtPnZhbGlkYXRlT2ZQcm9wZXJ0aWVzKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICcnKTsKCgokdGhpcy0+dmFsaWRhdGVUeXBlcygkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlVHlwZXMoJiR2YWx1ZSwgJHNjaGVtYSwgSnNvblBvaW50ZXIgJHBhdGgsICRpID0gbnVsbCkKewoKaWYgKCR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNBcnJheSgkdmFsdWUpKSB7CiR0aGlzLT5jaGVja0FycmF5KCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChMb29zZVR5cGVDaGVjazo6aXNPYmplY3QoJHZhbHVlKSkgewoKCgokdGhpcy0+Y2hlY2tPYmplY3QoCiR2YWx1ZSwKJHNjaGVtYSwKJHBhdGgsCmlzc2V0KCRzY2hlbWEtPnByb3BlcnRpZXMpID8gJHNjaGVtYS0+cHJvcGVydGllcyA6IG51bGwsCmlzc2V0KCRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzKSA/ICRzY2hlbWEtPmFkZGl0aW9uYWxQcm9wZXJ0aWVzIDogbnVsbCwKaXNzZXQoJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMpID8gJHNjaGVtYS0+cGF0dGVyblByb3BlcnRpZXMgOiBudWxsLAokdGhpcy0+YXBwbGllZERlZmF1bHRzCik7Cn0KCgppZiAoaXNfc3RyaW5nKCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrU3RyaW5nKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc19udW1lcmljKCR2YWx1ZSkpIHsKJHRoaXMtPmNoZWNrTnVtYmVyKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5lbnVtKSkgewokdGhpcy0+Y2hlY2tFbnVtKCR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgsICRpKTsKfQoKCmlmIChpc3NldCgkc2NoZW1hLT5jb25zdCkpIHsKJHRoaXMtPmNoZWNrQ29uc3QoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCwgJGkpOwp9Cn0KCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlQ29tbW9uUHJvcGVydGllcygmJHZhbHVlLCAkc2NoZW1hLCBKc29uUG9pbnRlciAkcGF0aCwgJGkgPSAnJykKewoKaWYgKGlzc2V0KCRzY2hlbWEtPmV4dGVuZHMpKSB7CmlmIChpc19zdHJpbmcoJHNjaGVtYS0+ZXh0ZW5kcykpIHsKJHNjaGVtYS0+ZXh0ZW5kcyA9ICR0aGlzLT52YWxpZGF0ZVVyaSgkc2NoZW1hLCAkc2NoZW1hLT5leHRlbmRzKTsKfQppZiAoaXNfYXJyYXkoJHNjaGVtYS0+ZXh0ZW5kcykpIHsKZm9yZWFjaCAoJHNjaGVtYS0+ZXh0ZW5kcyBhcyAkZXh0ZW5kcykgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkZXh0ZW5kcywgJHBhdGgsICRpKTsKfQp9IGVsc2UgewokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkc2NoZW1hLT5leHRlbmRzLCAkcGF0aCwgJGkpOwp9Cn0KCgppZiAoISRwYXRoLT5mcm9tRGVmYXVsdCgpKSB7CiR0aGlzLT5hcHBseURlZmF1bHRWYWx1ZXMoJHZhbHVlLCAkc2NoZW1hLCAkcGF0aCk7Cn0KCgppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5pc09iamVjdCgkdmFsdWUpKSB7CmlmICghKCR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYpICYmIGlzc2V0KCRzY2hlbWEtPnJlcXVpcmVkKSAmJiBpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkpIHsKCmZvcmVhY2ggKCRzY2hlbWEtPnJlcXVpcmVkIGFzICRyZXF1aXJlZCkgewppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkcmVxdWlyZWQpKSB7CiR0aGlzLT5hZGRFcnJvcigKQ29uc3RyYWludEVycm9yOjpSRVFVSVJFRCgpLAokdGhpcy0+aW5jcmVtZW50UGF0aCgkcGF0aCwgJHJlcXVpcmVkKSwgWwoncHJvcGVydHknID0+ICRyZXF1aXJlZApdCik7Cn0KfQp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmICFpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkpIHsKCmlmICgkc2NoZW1hLT5yZXF1aXJlZCAmJiAkdmFsdWUgaW5zdGFuY2VvZiBzZWxmKSB7CiRwcm9wZXJ0eVBhdGhzID0gJHBhdGgtPmdldFByb3BlcnR5UGF0aHMoKTsKJHByb3BlcnR5TmFtZSA9IGVuZCgkcHJvcGVydHlQYXRocyk7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OlJFUVVJUkVEKCksICRwYXRoLCBbJ3Byb3BlcnR5JyA9PiAkcHJvcGVydHlOYW1lXSk7Cn0KfSBlbHNlIHsKCgppZiAoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikgewpyZXR1cm47Cn0KfQp9CgoKaWYgKCEoJHZhbHVlIGluc3RhbmNlb2Ygc2VsZikpIHsKJHRoaXMtPmNoZWNrVHlwZSgkdmFsdWUsICRzY2hlbWEsICRwYXRoLCAkaSk7Cn0KCgppZiAoaXNzZXQoJHNjaGVtYS0+ZGlzYWxsb3cpKSB7CiRpbml0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwoKJHR5cGVTY2hlbWEgPSBuZXcgXHN0ZENsYXNzKCk7CiR0eXBlU2NoZW1hLT50eXBlID0gJHNjaGVtYS0+ZGlzYWxsb3c7CiR0aGlzLT5jaGVja1R5cGUoJHZhbHVlLCAkdHlwZVNjaGVtYSwgJHBhdGgpOwoKCmlmIChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09IGNvdW50KCRpbml0RXJyb3JzKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpESVNBTExPVygpLCAkcGF0aCk7Cn0gZWxzZSB7CiR0aGlzLT5lcnJvcnMgPSAkaW5pdEVycm9yczsKfQp9CgppZiAoaXNzZXQoJHNjaGVtYS0+bm90KSkgewokaW5pdEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCR2YWx1ZSwgJHNjaGVtYS0+bm90LCAkcGF0aCwgJGkpOwoKCmlmIChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09IGNvdW50KCRpbml0RXJyb3JzKSkgewokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpOT1QoKSwgJHBhdGgpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJGluaXRFcnJvcnM7Cn0KfQoKCmlmIChpc3NldCgkc2NoZW1hLT5kZXBlbmRlbmNpZXMpICYmICR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+aXNPYmplY3QoJHZhbHVlKSkgewokdGhpcy0+dmFsaWRhdGVEZXBlbmRlbmNpZXMoJHZhbHVlLCAkc2NoZW1hLT5kZXBlbmRlbmNpZXMsICRwYXRoKTsKfQp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHNob3VsZEFwcGx5RGVmYXVsdFZhbHVlKCRyZXF1aXJlZE9ubHksICRzY2hlbWEsICRuYW1lID0gbnVsbCwgJHBhcmVudFNjaGVtYSA9IG51bGwpCnsKCmlmICghJHJlcXVpcmVkT25seSkgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKAokbmFtZSAhPT0gbnVsbAomJiBpc3NldCgkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKJiYgaXNfYXJyYXkoJHBhcmVudFNjaGVtYS0+cmVxdWlyZWQpCiYmIGluX2FycmF5KCRuYW1lLCAkcGFyZW50U2NoZW1hLT5yZXF1aXJlZCkKKSB7CnJldHVybiB0cnVlOwp9CgppZiAoaXNzZXQoJHNjaGVtYS0+cmVxdWlyZWQpICYmICFpc19hcnJheSgkc2NoZW1hLT5yZXF1aXJlZCkgJiYgJHNjaGVtYS0+cmVxdWlyZWQpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBhcHBseURlZmF1bHRWYWx1ZXMoJiR2YWx1ZSwgJHNjaGVtYSwgJHBhdGgpOiB2b2lkCnsKCmlmICghJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0FQUExZX0RFRkFVTFRTKSkgewpyZXR1cm47Cn0KCmlmIChpc19ib29sKCRzY2hlbWEpKSB7CnJldHVybjsKfQoKCiRyZXF1aXJlZE9ubHkgPSAoYm9vbCkgJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX09OTFlfUkVRVUlSRURfREVGQVVMVFMpOwppZiAoaXNzZXQoJHNjaGVtYS0+cHJvcGVydGllcykgJiYgTG9vc2VUeXBlQ2hlY2s6OmlzT2JqZWN0KCR2YWx1ZSkpIHsKCmZvcmVhY2ggKCRzY2hlbWEtPnByb3BlcnRpZXMgYXMgJGN1cnJlbnRQcm9wZXJ0eSA9PiAkcHJvcGVydHlEZWZpbml0aW9uKSB7CiRwcm9wZXJ0eURlZmluaXRpb24gPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5yZXNvbHZlUmVmU2NoZW1hKCRwcm9wZXJ0eURlZmluaXRpb24pOwppZiAoaXNfYm9vbCgkcHJvcGVydHlEZWZpbml0aW9uKSkgewpjb250aW51ZTsKfQppZiAoCiFMb29zZVR5cGVDaGVjazo6cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkY3VycmVudFByb3BlcnR5KQomJiBwcm9wZXJ0eV9leGlzdHMoJHByb3BlcnR5RGVmaW5pdGlvbiwgJ2RlZmF1bHQnKQomJiAkdGhpcy0+c2hvdWxkQXBwbHlEZWZhdWx0VmFsdWUoJHJlcXVpcmVkT25seSwgJHByb3BlcnR5RGVmaW5pdGlvbiwgJGN1cnJlbnRQcm9wZXJ0eSwgJHNjaGVtYSkKKSB7CgppZiAoaXNfb2JqZWN0KCRwcm9wZXJ0eURlZmluaXRpb24tPmRlZmF1bHQpKSB7Ckxvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eVNldCgkdmFsdWUsICRjdXJyZW50UHJvcGVydHksIGNsb25lICRwcm9wZXJ0eURlZmluaXRpb24tPmRlZmF1bHQpOwp9IGVsc2UgewpMb29zZVR5cGVDaGVjazo6cHJvcGVydHlTZXQoJHZhbHVlLCAkY3VycmVudFByb3BlcnR5LCAkcHJvcGVydHlEZWZpbml0aW9uLT5kZWZhdWx0KTsKfQokdGhpcy0+YXBwbGllZERlZmF1bHRzW10gPSAkY3VycmVudFByb3BlcnR5Owp9Cn0KfSBlbHNlaWYgKGlzc2V0KCRzY2hlbWEtPml0ZW1zKSAmJiBMb29zZVR5cGVDaGVjazo6aXNBcnJheSgkdmFsdWUpKSB7CiRpdGVtcyA9IFtdOwppZiAoTG9vc2VUeXBlQ2hlY2s6OmlzQXJyYXkoJHNjaGVtYS0+aXRlbXMpKSB7CiRpdGVtcyA9ICRzY2hlbWEtPml0ZW1zOwp9IGVsc2VpZiAoaXNzZXQoJHNjaGVtYS0+bWluSXRlbXMpICYmIGNvdW50KCR2YWx1ZSkgPCAkc2NoZW1hLT5taW5JdGVtcykgewokaXRlbXMgPSBhcnJheV9maWxsKGNvdW50KCR2YWx1ZSksICRzY2hlbWEtPm1pbkl0ZW1zIC0gY291bnQoJHZhbHVlKSwgJHNjaGVtYS0+aXRlbXMpOwp9Cgpmb3JlYWNoICgkaXRlbXMgYXMgJGN1cnJlbnRJdGVtID0+ICRpdGVtRGVmaW5pdGlvbikgewokaXRlbURlZmluaXRpb24gPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5yZXNvbHZlUmVmU2NoZW1hKCRpdGVtRGVmaW5pdGlvbik7CmlmIChpc19ib29sKCRpdGVtRGVmaW5pdGlvbikpIHsKY29udGludWU7Cn0KCmlmICgKIWFycmF5X2tleV9leGlzdHMoJGN1cnJlbnRJdGVtLCAkdmFsdWUpCiYmIHByb3BlcnR5X2V4aXN0cygkaXRlbURlZmluaXRpb24sICdkZWZhdWx0JykKJiYgJHRoaXMtPnNob3VsZEFwcGx5RGVmYXVsdFZhbHVlKCRyZXF1aXJlZE9ubHksICRpdGVtRGVmaW5pdGlvbikpIHsKaWYgKGlzX29iamVjdCgkaXRlbURlZmluaXRpb24tPmRlZmF1bHQpKSB7CiR2YWx1ZVskY3VycmVudEl0ZW1dID0gY2xvbmUgJGl0ZW1EZWZpbml0aW9uLT5kZWZhdWx0Owp9IGVsc2UgewokdmFsdWVbJGN1cnJlbnRJdGVtXSA9ICRpdGVtRGVmaW5pdGlvbi0+ZGVmYXVsdDsKfQp9CiRwYXRoLT5zZXRGcm9tRGVmYXVsdCgpOwp9Cn0gZWxzZWlmICgKJHZhbHVlIGluc3RhbmNlb2Ygc2VsZgomJiBwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2RlZmF1bHQnKQomJiAkdGhpcy0+c2hvdWxkQXBwbHlEZWZhdWx0VmFsdWUoJHJlcXVpcmVkT25seSwgJHNjaGVtYSkpIHsKCiR2YWx1ZSA9IGlzX29iamVjdCgkc2NoZW1hLT5kZWZhdWx0KSA/IGNsb25lICRzY2hlbWEtPmRlZmF1bHQgOiAkc2NoZW1hLT5kZWZhdWx0OwokcGF0aC0+c2V0RnJvbURlZmF1bHQoKTsKfQp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZU9mUHJvcGVydGllcygmJHZhbHVlLCAkc2NoZW1hLCBKc29uUG9pbnRlciAkcGF0aCwgJGkgPSAnJykKewoKaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYpIHsKcmV0dXJuOwp9CgppZiAoaXNzZXQoJHNjaGVtYS0+YWxsT2YpKSB7CiRpc1ZhbGlkID0gdHJ1ZTsKZm9yZWFjaCAoJHNjaGVtYS0+YWxsT2YgYXMgJGFsbE9mKSB7CiRpbml0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkYWxsT2YsICRwYXRoLCAkaSk7CiRpc1ZhbGlkID0gJGlzVmFsaWQgJiYgKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT0gY291bnQoJGluaXRFcnJvcnMpKTsKfQppZiAoISRpc1ZhbGlkKSB7CiR0aGlzLT5hZGRFcnJvcihDb25zdHJhaW50RXJyb3I6OkFMTF9PRigpLCAkcGF0aCk7Cn0KfQoKaWYgKGlzc2V0KCRzY2hlbWEtPmFueU9mKSkgewokaXNWYWxpZCA9IGZhbHNlOwokc3RhcnRFcnJvcnMgPSAkdGhpcy0+Z2V0RXJyb3JzKCk7CiRjb2VyY2VPckRlZmF1bHRzID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhzZWxmOjpDSEVDS19NT0RFX0NPRVJDRV9UWVBFUyB8IHNlbGY6OkNIRUNLX01PREVfQVBQTFlfREVGQVVMVFMpOwoKZm9yZWFjaCAoJHNjaGVtYS0+YW55T2YgYXMgJGFueU9mKSB7CiRpbml0RXJyb3JzID0gJHRoaXMtPmdldEVycm9ycygpOwp0cnkgewokYW55T2ZWYWx1ZSA9ICRjb2VyY2VPckRlZmF1bHRzID8gRGVlcENvcHk6OmNvcHlPZigkdmFsdWUpIDogJHZhbHVlOwokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJGFueU9mVmFsdWUsICRhbnlPZiwgJHBhdGgsICRpKTsKaWYgKCRpc1ZhbGlkID0gKGNvdW50KCR0aGlzLT5nZXRFcnJvcnMoKSkgPT09IGNvdW50KCRpbml0RXJyb3JzKSkpIHsKJHZhbHVlID0gJGFueU9mVmFsdWU7CmJyZWFrOwp9Cn0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gJGUpIHsKJGlzVmFsaWQgPSBmYWxzZTsKfQp9CmlmICghJGlzVmFsaWQpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6QU5ZX09GKCksICRwYXRoKTsKfSBlbHNlIHsKJHRoaXMtPmVycm9ycyA9ICRzdGFydEVycm9yczsKfQp9CgppZiAoaXNzZXQoJHNjaGVtYS0+b25lT2YpKSB7CiRhbGxFcnJvcnMgPSBbXTsKJG1hdGNoZWRTY2hlbWFzID0gW107CiRzdGFydEVycm9ycyA9ICR0aGlzLT5nZXRFcnJvcnMoKTsKJGNvZXJjZU9yRGVmYXVsdHMgPSAkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKHNlbGY6OkNIRUNLX01PREVfQ09FUkNFX1RZUEVTIHwgc2VsZjo6Q0hFQ0tfTU9ERV9BUFBMWV9ERUZBVUxUUyk7Cgpmb3JlYWNoICgkc2NoZW1hLT5vbmVPZiBhcyAkb25lT2YpIHsKdHJ5IHsKJHRoaXMtPmVycm9ycyA9IFtdOwoKJG9uZU9mVmFsdWUgPSAkY29lcmNlT3JEZWZhdWx0cyA/IERlZXBDb3B5Ojpjb3B5T2YoJHZhbHVlKSA6ICR2YWx1ZTsKJHRoaXMtPmNoZWNrVW5kZWZpbmVkKCRvbmVPZlZhbHVlLCAkb25lT2YsICRwYXRoLCAkaSk7CmlmIChjb3VudCgkdGhpcy0+Z2V0RXJyb3JzKCkpID09PSAwKSB7CiRtYXRjaGVkU2NoZW1hc1tdID0gWydzY2hlbWEnID0+ICRvbmVPZiwgJ3ZhbHVlJyA9PiAkb25lT2ZWYWx1ZV07Cn0KJGFsbEVycm9ycyA9IGFycmF5X21lcmdlKCRhbGxFcnJvcnMsIGFycmF5X3ZhbHVlcygkdGhpcy0+Z2V0RXJyb3JzKCkpKTsKfSBjYXRjaCAoVmFsaWRhdGlvbkV4Y2VwdGlvbiAkZSkgewoKCn0KfQppZiAoY291bnQoJG1hdGNoZWRTY2hlbWFzKSAhPT0gMSkgewokdGhpcy0+YWRkRXJyb3JzKGFycmF5X21lcmdlKCRhbGxFcnJvcnMsICRzdGFydEVycm9ycykpOwokdGhpcy0+YWRkRXJyb3IoQ29uc3RyYWludEVycm9yOjpPTkVfT0YoKSwgJHBhdGgpOwp9IGVsc2UgewokdGhpcy0+ZXJyb3JzID0gJHN0YXJ0RXJyb3JzOwokdmFsdWUgPSAkbWF0Y2hlZFNjaGVtYXNbMF1bJ3ZhbHVlJ107Cn0KfQp9CgoKCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB2YWxpZGF0ZURlcGVuZGVuY2llcygkdmFsdWUsICRkZXBlbmRlbmNpZXMsIEpzb25Qb2ludGVyICRwYXRoLCAkaSA9ICcnKQp7CmZvcmVhY2ggKCRkZXBlbmRlbmNpZXMgYXMgJGtleSA9PiAkZGVwZW5kZW5jeSkgewppZiAoJHRoaXMtPmdldFR5cGVDaGVjaygpLT5wcm9wZXJ0eUV4aXN0cygkdmFsdWUsICRrZXkpKSB7CmlmIChpc19zdHJpbmcoJGRlcGVuZGVuY3kpKSB7CgppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkZGVwZW5kZW5jeSkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6REVQRU5ERU5DSUVTKCksICRwYXRoLCBbCidrZXknID0+ICRrZXksCidkZXBlbmRlbmN5JyA9PiAkZGVwZW5kZW5jeQpdKTsKfQp9IGVsc2VpZiAoaXNfYXJyYXkoJGRlcGVuZGVuY3kpKSB7Cgpmb3JlYWNoICgkZGVwZW5kZW5jeSBhcyAkZCkgewppZiAoISR0aGlzLT5nZXRUeXBlQ2hlY2soKS0+cHJvcGVydHlFeGlzdHMoJHZhbHVlLCAkZCkpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6REVQRU5ERU5DSUVTKCksICRwYXRoLCBbCidrZXknID0+ICRrZXksCidkZXBlbmRlbmN5JyA9PiAkZGVwZW5kZW5jeQpdKTsKfQp9Cn0gZWxzZWlmIChpc19vYmplY3QoJGRlcGVuZGVuY3kpKSB7CgokdGhpcy0+Y2hlY2tVbmRlZmluZWQoJHZhbHVlLCAkZGVwZW5kZW5jeSwgJHBhdGgsICRpKTsKfQp9Cn0KfQoKcHJvdGVjdGVkIGZ1bmN0aW9uIHZhbGlkYXRlVXJpKCRzY2hlbWEsICRzY2hlbWFVcmkgPSBudWxsKQp7CiRyZXNvbHZlciA9IG5ldyBVcmlSZXNvbHZlcigpOwokcmV0cmlldmVyID0gJHRoaXMtPmZhY3RvcnktPmdldFVyaVJldHJpZXZlcigpOwoKJGpzb25TY2hlbWEgPSBudWxsOwppZiAoJHJlc29sdmVyLT5pc1ZhbGlkKCRzY2hlbWFVcmkpKSB7CiRzY2hlbWFJZCA9IHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaWQnKSA/ICRzY2hlbWEtPmlkIDogbnVsbDsKJGpzb25TY2hlbWEgPSAkcmV0cmlldmVyLT5yZXRyaWV2ZSgkc2NoZW1hSWQsICRzY2hlbWFVcmkpOwp9CgpyZXR1cm4gJGpzb25TY2hlbWE7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCgoKCgoKCgoKY2xhc3MgRHJhZnRJZGVudGlmaWVycyBleHRlbmRzIEVudW0KewpwdWJsaWMgY29uc3QgRFJBRlRfMyA9ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTAzL3NjaGVtYSMnOwpwdWJsaWMgY29uc3QgRFJBRlRfNCA9ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA0L3NjaGVtYSMnOwpwdWJsaWMgY29uc3QgRFJBRlRfNiA9ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA2L3NjaGVtYSMnOwpwdWJsaWMgY29uc3QgRFJBRlRfNyA9ICdodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMnOwpwdWJsaWMgY29uc3QgRFJBRlRfMjAxOV8wOSA9ICdodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDE5LTA5L3NjaGVtYSc7CnB1YmxpYyBjb25zdCBEUkFGVF8yMDIwXzEyID0gJ2h0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hJzsKCnB1YmxpYyBmdW5jdGlvbiB0b0NvbnN0cmFpbnROYW1lKCk6IHN0cmluZwp7CnN3aXRjaCAoJHRoaXMtPmdldFZhbHVlKCkpIHsKY2FzZSBzZWxmOjpEUkFGVF8zOgpyZXR1cm4gJ2RyYWZ0MDMnOwpjYXNlIHNlbGY6OkRSQUZUXzQ6CnJldHVybiAnZHJhZnQwNCc7CmNhc2Ugc2VsZjo6RFJBRlRfNjoKcmV0dXJuICdkcmFmdDA2JzsKY2FzZSBzZWxmOjpEUkFGVF83OgpyZXR1cm4gJ2RyYWZ0MDcnOwpjYXNlIHNlbGY6OkRSQUZUXzIwMTlfMDk6CnJldHVybiAnZHJhZnQyMDE5LTA5JzsKY2FzZSBzZWxmOjpEUkFGVF8yMDIwXzEyOgpyZXR1cm4gJ2RyYWZ0MjAyMC0xMic7CmRlZmF1bHQ6CnRocm93IG5ldyBcRXhjZXB0aW9uKCdVbnN1cHBvcnRlZCBzY2hlbWEgVVJJOiAnIC4gJHRoaXMtPmdldFZhbHVlKCkpOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiB3aXRob3V0RnJhZ21lbnQoKTogc3RyaW5nCnsKcmV0dXJuIHJ0cmltKCR0aGlzLT5nZXRWYWx1ZSgpLCAnIycpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRW50aXR5OwoKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludEVycm9yOwp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xGYWN0b3J5Owp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVmFsaWRhdGlvbkV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCgoKCgoKCmNsYXNzIEVycm9yQmFnCnsKCnByaXZhdGUgJGZhY3Rvcnk7CgoKcHJpdmF0ZSAkZXJyb3JzID0gW107CgoKCgpwcm90ZWN0ZWQgJGVycm9yTWFzayA9IFZhbGlkYXRvcjo6RVJST1JfTk9ORTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChGYWN0b3J5ICRmYWN0b3J5KQp7CiR0aGlzLT5mYWN0b3J5ID0gJGZhY3Rvcnk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKJHRoaXMtPmVycm9ycyA9IFtdOwokdGhpcy0+ZXJyb3JNYXNrID0gVmFsaWRhdG9yOjpFUlJPUl9OT05FOwp9CgoKcHVibGljIGZ1bmN0aW9uIGdldEVycm9ycygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+ZXJyb3JzOwp9CgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9yKENvbnN0cmFpbnRFcnJvciAkY29uc3RyYWludCwgP0pzb25Qb2ludGVyICRwYXRoID0gbnVsbCwgYXJyYXkgJG1vcmUgPSBbXSk6IHZvaWQKewokbWVzc2FnZSA9ICRjb25zdHJhaW50LT5nZXRNZXNzYWdlKCk7CiRuYW1lID0gJGNvbnN0cmFpbnQtPmdldFZhbHVlKCk7CgokZXJyb3IgPSBbCidwcm9wZXJ0eScgPT4gJHRoaXMtPmNvbnZlcnRKc29uUG9pbnRlckludG9Qcm9wZXJ0eVBhdGgoJHBhdGggPzogbmV3IEpzb25Qb2ludGVyKCcnKSksCidwb2ludGVyJyA9PiBsdHJpbSgoc3RyaW5nKSAoJHBhdGggPzogbmV3IEpzb25Qb2ludGVyKCcnKSksICcjJyksCidtZXNzYWdlJyA9PiB1Y2ZpcnN0KHZzcHJpbnRmKCRtZXNzYWdlLCBhcnJheV9tYXAoc3RhdGljIGZ1bmN0aW9uICgkdmFsKSB7CmlmIChpc19zY2FsYXIoJHZhbCkpIHsKcmV0dXJuIGlzX2Jvb2woJHZhbCkgPyB2YXJfZXhwb3J0KCR2YWwsIHRydWUpIDogJHZhbDsKfQoKcmV0dXJuIGpzb25fZW5jb2RlKCR2YWwpOwp9LCBhcnJheV92YWx1ZXMoJG1vcmUpKSkpLAonY29uc3RyYWludCcgPT4gWwonbmFtZScgPT4gJG5hbWUsCidwYXJhbXMnID0+ICRtb3JlCl0sCidjb250ZXh0JyA9PiAkdGhpcy0+ZmFjdG9yeS0+Z2V0RXJyb3JDb250ZXh0KCksCl07CgppZiAoJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZyhDb25zdHJhaW50OjpDSEVDS19NT0RFX0VYQ0VQVElPTlMpKSB7CnRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKHNwcmludGYoJ0Vycm9yIHZhbGlkYXRpbmcgJXM6ICVzJywgJGVycm9yWydwb2ludGVyJ10sICRlcnJvclsnbWVzc2FnZSddKSk7Cn0KJHRoaXMtPmVycm9yc1tdID0gJGVycm9yOwoKJHRoaXMtPmVycm9yTWFzayB8PSAkZXJyb3JbJ2NvbnRleHQnXTsgCn0KCgpwdWJsaWMgZnVuY3Rpb24gYWRkRXJyb3JzKGFycmF5ICRlcnJvcnMpOiB2b2lkCnsKaWYgKCEkZXJyb3JzKSB7CnJldHVybjsKfQoKJHRoaXMtPmVycm9ycyA9IGFycmF5X21lcmdlKCR0aGlzLT5lcnJvcnMsICRlcnJvcnMpOwokZXJyb3JNYXNrID0gJiR0aGlzLT5lcnJvck1hc2s7CmFycmF5X3dhbGsoJGVycm9ycywgc3RhdGljIGZ1bmN0aW9uICgkZXJyb3IpIHVzZSAoJiRlcnJvck1hc2spIHsKJGVycm9yTWFzayB8PSAkZXJyb3JbJ2NvbnRleHQnXTsKfSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY29udmVydEpzb25Qb2ludGVySW50b1Byb3BlcnR5UGF0aChKc29uUG9pbnRlciAkcG9pbnRlcik6IHN0cmluZwp7CiRyZXN1bHQgPSBhcnJheV9tYXAoCnN0YXRpYyBmdW5jdGlvbiAoJHBhdGgpIHsKcmV0dXJuIHNwcmludGYoaXNfbnVtZXJpYygkcGF0aCkgPyAnWyVkXScgOiAnLiVzJywgJHBhdGgpOwp9LAokcG9pbnRlci0+Z2V0UHJvcGVydHlQYXRocygpCik7CgpyZXR1cm4gdHJpbShpbXBsb2RlKCcnLCAkcmVzdWx0KSwgJy4nKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEVudGl0eTsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRFcnJvcjsKdXNlIEpzb25TY2hlbWFcQ29uc3RyYWludHNcRmFjdG9yeTsKCgoKCgp0cmFpdCBFcnJvckJhZ1Byb3h5CnsKCnByb3RlY3RlZCAkZXJyb3JCYWcgPSBudWxsOwoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvcnMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmVycm9yQmFnKCktPmdldEVycm9ycygpOwp9CgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9ycyhhcnJheSAkZXJyb3JzKTogdm9pZAp7CiR0aGlzLT5lcnJvckJhZygpLT5hZGRFcnJvcnMoJGVycm9ycyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRFcnJvcihDb25zdHJhaW50RXJyb3IgJGNvbnN0cmFpbnQsID9Kc29uUG9pbnRlciAkcGF0aCA9IG51bGwsIGFycmF5ICRtb3JlID0gW10pOiB2b2lkCnsKJHRoaXMtPmVycm9yQmFnKCktPmFkZEVycm9yKCRjb25zdHJhaW50LCAkcGF0aCwgJG1vcmUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5lcnJvckJhZygpLT5nZXRFcnJvcnMoKSA9PT0gW107Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXNlRXJyb3JCYWcoRmFjdG9yeSAkZmFjdG9yeSk6IEVycm9yQmFnCnsKaWYgKGlzX251bGwoJHRoaXMtPmVycm9yQmFnKSkgewokdGhpcy0+ZXJyb3JCYWcgPSBuZXcgRXJyb3JCYWcoJGZhY3RvcnkpOwp9CgpyZXR1cm4gJHRoaXMtPmVycm9yQmFnOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXJyb3JCYWcoKTogRXJyb3JCYWcKewppZiAoaXNfbnVsbCgkdGhpcy0+ZXJyb3JCYWcpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignRXJyb3JCYWcgbm90IGluaXRpYWxpemVkJyk7Cn0KCnJldHVybiAkdGhpcy0+ZXJyb3JCYWc7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewokdGhpcy0+ZXJyb3JCYWcoKS0+cmVzZXQoKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFbnRpdHk7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBKc29uUG9pbnRlcgp7Cgpwcml2YXRlICRmaWxlbmFtZTsKCgpwcml2YXRlICRwcm9wZXJ0eVBhdGhzID0gW107CgoKCgpwcml2YXRlICRmcm9tRGVmYXVsdCA9IGZhbHNlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHZhbHVlKQp7CmlmICghaXNfc3RyaW5nKCR2YWx1ZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignUmVmIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcnKTsKfQoKJHNwbGl0UmVmID0gZXhwbG9kZSgnIycsICR2YWx1ZSwgMik7CiR0aGlzLT5maWxlbmFtZSA9ICRzcGxpdFJlZlswXTsKaWYgKGFycmF5X2tleV9leGlzdHMoMSwgJHNwbGl0UmVmKSkgewokdGhpcy0+cHJvcGVydHlQYXRocyA9ICR0aGlzLT5kZWNvZGVQcm9wZXJ0eVBhdGhzKCRzcGxpdFJlZlsxXSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRlY29kZVByb3BlcnR5UGF0aHMoJHByb3BlcnR5UGF0aFN0cmluZykKewokcGF0aHMgPSBbXTsKZm9yZWFjaCAoZXhwbG9kZSgnLycsIHRyaW0oJHByb3BlcnR5UGF0aFN0cmluZywgJy8nKSkgYXMgJHBhdGgpIHsKJHBhdGggPSAkdGhpcy0+ZGVjb2RlUGF0aCgkcGF0aCk7CmlmIChpc19zdHJpbmcoJHBhdGgpICYmICcnICE9PSAkcGF0aCkgewokcGF0aHNbXSA9ICRwYXRoOwp9Cn0KCnJldHVybiAkcGF0aHM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZW5jb2RlUHJvcGVydHlQYXRocygpCnsKcmV0dXJuIGFycmF5X21hcCgKWyR0aGlzLCAnZW5jb2RlUGF0aCddLAokdGhpcy0+Z2V0UHJvcGVydHlQYXRocygpCik7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkZWNvZGVQYXRoKCRwYXRoKQp7CnJldHVybiBzdHJ0cigkcGF0aCwgWyd+MScgPT4gJy8nLCAnfjAnID0+ICd+JywgJyUyNScgPT4gJyUnXSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBlbmNvZGVQYXRoKCRwYXRoKQp7CnJldHVybiBzdHJ0cigkcGF0aCwgWycvJyA9PiAnfjEnLCAnficgPT4gJ34wJywgJyUnID0+ICclMjUnXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGaWxlbmFtZSgpCnsKcmV0dXJuICR0aGlzLT5maWxlbmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb3BlcnR5UGF0aHMoKQp7CnJldHVybiAkdGhpcy0+cHJvcGVydHlQYXRoczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aFByb3BlcnR5UGF0aHMoYXJyYXkgJHByb3BlcnR5UGF0aHMpCnsKJG5ldyA9IGNsb25lICR0aGlzOwokbmV3LT5wcm9wZXJ0eVBhdGhzID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkcCk6IHN0cmluZyB7IHJldHVybiAoc3RyaW5nKSAkcDsgfSwgJHByb3BlcnR5UGF0aHMpOwoKcmV0dXJuICRuZXc7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9wZXJ0eVBhdGhBc1N0cmluZygpCnsKcmV0dXJuIHJ0cmltKCcjLycgLiBpbXBsb2RlKCcvJywgJHRoaXMtPmVuY29kZVByb3BlcnR5UGF0aHMoKSksICcvJyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJHRoaXMtPmdldEZpbGVuYW1lKCkgLiAkdGhpcy0+Z2V0UHJvcGVydHlQYXRoQXNTdHJpbmcoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZyb21EZWZhdWx0KCk6IHZvaWQKewokdGhpcy0+ZnJvbURlZmF1bHQgPSB0cnVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmcm9tRGVmYXVsdCgpCnsKcmV0dXJuICR0aGlzLT5mcm9tRGVmYXVsdDsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKYWJzdHJhY3QgY2xhc3MgRW51bSBleHRlbmRzIFxNYWJlRW51bVxFbnVtCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgppbnRlcmZhY2UgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRDb25maWdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgSW52YWxpZFNjaGVtYUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkU2NoZW1hTWVkaWFUeXBlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRTb3VyY2VVcmlFeGNlcHRpb24gZXh0ZW5kcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24Kewp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxFeGNlcHRpb247CgoKCgpjbGFzcyBKc29uRGVjb2RpbmdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRjb2RlID0gSlNPTl9FUlJPUl9OT05FLCA/XEV4Y2VwdGlvbiAkcHJldmlvdXMgPSBudWxsKQp7CnN3aXRjaCAoJGNvZGUpIHsKY2FzZSBKU09OX0VSUk9SX0RFUFRIOgokbWVzc2FnZSA9ICdUaGUgbWF4aW11bSBzdGFjayBkZXB0aCBoYXMgYmVlbiBleGNlZWRlZCc7CmJyZWFrOwpjYXNlIEpTT05fRVJST1JfU1RBVEVfTUlTTUFUQ0g6CiRtZXNzYWdlID0gJ0ludmFsaWQgb3IgbWFsZm9ybWVkIEpTT04nOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX0NUUkxfQ0hBUjoKJG1lc3NhZ2UgPSAnQ29udHJvbCBjaGFyYWN0ZXIgZXJyb3IsIHBvc3NpYmx5IGluY29ycmVjdGx5IGVuY29kZWQnOwpicmVhazsKY2FzZSBKU09OX0VSUk9SX1VURjg6CiRtZXNzYWdlID0gJ01hbGZvcm1lZCBVVEYtOCBjaGFyYWN0ZXJzLCBwb3NzaWJseSBpbmNvcnJlY3RseSBlbmNvZGVkJzsKYnJlYWs7CmNhc2UgSlNPTl9FUlJPUl9TWU5UQVg6CiRtZXNzYWdlID0gJ0pTT04gc3ludGF4IGlzIG1hbGZvcm1lZCc7CmJyZWFrOwpkZWZhdWx0OgokbWVzc2FnZSA9ICdTeW50YXggZXJyb3InOwp9CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKY2xhc3MgUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbiBleHRlbmRzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFVyaVJlc29sdmVyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbgp7Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXEV4Y2VwdGlvbjsKCmNsYXNzIFZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcSXRlcmF0b3I7CgoKCgoKCmNsYXNzIE9iamVjdEl0ZXJhdG9yIGltcGxlbWVudHMgXEl0ZXJhdG9yLCBcQ291bnRhYmxlCnsKCnByaXZhdGUgJG9iamVjdDsKCgpwcml2YXRlICRwb3NpdGlvbiA9IDA7CgoKcHJpdmF0ZSAkZGF0YSA9IFtdOwoKCnByaXZhdGUgJGluaXRpYWxpemVkID0gZmFsc2U7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG9iamVjdCkKewokdGhpcy0+b2JqZWN0ID0gJG9iamVjdDsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBjdXJyZW50KCkKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuICR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl07Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBuZXh0KCk6IHZvaWQKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwokdGhpcy0+cG9zaXRpb24rKzsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGtleSgpOiBpbnQKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuICR0aGlzLT5wb3NpdGlvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkKCk6IGJvb2wKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwoKcmV0dXJuIGlzc2V0KCR0aGlzLT5kYXRhWyR0aGlzLT5wb3NpdGlvbl0pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV3aW5kKCk6IHZvaWQKewokdGhpcy0+aW5pdGlhbGl6ZSgpOwokdGhpcy0+cG9zaXRpb24gPSAwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKJHRoaXMtPmluaXRpYWxpemUoKTsKCnJldHVybiBjb3VudCgkdGhpcy0+ZGF0YSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpCnsKaWYgKCEkdGhpcy0+aW5pdGlhbGl6ZWQpIHsKJHRoaXMtPmRhdGEgPSAkdGhpcy0+YnVpbGREYXRhRnJvbU9iamVjdCgkdGhpcy0+b2JqZWN0KTsKJHRoaXMtPmluaXRpYWxpemVkID0gdHJ1ZTsKfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYnVpbGREYXRhRnJvbU9iamVjdCgkb2JqZWN0KQp7CiRyZXN1bHQgPSBbXTsKCiRzdGFjayA9IG5ldyBcU3BsU3RhY2soKTsKJHN0YWNrLT5wdXNoKCRvYmplY3QpOwoKd2hpbGUgKCEkc3RhY2stPmlzRW1wdHkoKSkgewokY3VycmVudCA9ICRzdGFjay0+cG9wKCk7CmlmIChpc19vYmplY3QoJGN1cnJlbnQpKSB7CmFycmF5X3B1c2goJHJlc3VsdCwgJGN1cnJlbnQpOwp9Cgpmb3JlYWNoICgkdGhpcy0+Z2V0RGF0YUZyb21JdGVtKCRjdXJyZW50KSBhcyAkcHJvcGVydHlOYW1lID0+ICRwcm9wZXJ0eVZhbHVlKSB7CmlmIChpc19vYmplY3QoJHByb3BlcnR5VmFsdWUpIHx8IGlzX2FycmF5KCRwcm9wZXJ0eVZhbHVlKSkgewokc3RhY2stPnB1c2goJHByb3BlcnR5VmFsdWUpOwp9Cn0KfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREYXRhRnJvbUl0ZW0oJGl0ZW0pCnsKaWYgKCFpc19vYmplY3QoJGl0ZW0pICYmICFpc19hcnJheSgkaXRlbSkpIHsKcmV0dXJuIFtdOwp9CgpyZXR1cm4gaXNfb2JqZWN0KCRpdGVtKSA/IGdldF9vYmplY3RfdmFycygkaXRlbSkgOiAkaXRlbTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKY2xhc3MgUmZjMzMzOQp7CnByaXZhdGUgY29uc3QgUkVHRVggPSAnL14oXGR7NH0tXGR7Mn0tXGR7Mn1bVCBdKDBbMC05XXwxWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSk6KCg/OlswLTVdWzAtOV18NjApKSkoXC5cZCspPyhafChbKy1dKDBbMC05XXwxWzAtOV18MlswLTNdKSkoOik/KFswLTVdWzAtOV0pKSQvJzsKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZUZyb21TdHJpbmcoJGlucHV0KTogP1xEYXRlVGltZQp7CmlmICghcHJlZ19tYXRjaChzZWxmOjpSRUdFWCwgc3RydG91cHBlcigkaW5wdXQpLCAkbWF0Y2hlcykpIHsKcmV0dXJuIG51bGw7Cn0KCiRpbnB1dCA9IHN0cnRvdXBwZXIoJGlucHV0KTsgCiRpbnB1dEhhc1RTZXBhcmF0b3IgPSBzdHJwb3MoJGlucHV0LCAnVCcpOwoKJGRhdGVBbmRUaW1lID0gJG1hdGNoZXNbMV07CiRtaWNyb3NlY29uZHMgPSAkbWF0Y2hlc1s1XSA/OiAnLjAwMDAwMCc7CiR0aW1lWm9uZSA9ICdaJyAhPT0gJG1hdGNoZXNbNl0gPyAkbWF0Y2hlc1s2XSA6ICcrMDA6MDAnOwokZGF0ZUZvcm1hdCA9ICRpbnB1dEhhc1RTZXBhcmF0b3IgPT09IGZhbHNlID8gJ1ktbS1kIEg6aTpzLnVQJyA6ICdZLW0tZFxUSDppOnMudVAnOwokZGF0ZVRpbWUgPSBcRGF0ZVRpbWVJbW11dGFibGU6OmNyZWF0ZUZyb21Gb3JtYXQoJGRhdGVGb3JtYXQsICRkYXRlQW5kVGltZSAuICRtaWNyb3NlY29uZHMgLiAkdGltZVpvbmUsIG5ldyBcRGF0ZVRpbWVab25lKCdVVEMnKSk7CgppZiAoJGRhdGVUaW1lID09PSBmYWxzZSkgewpyZXR1cm4gbnVsbDsKfQoKJHV0Y0RhdGVUaW1lID0gJGRhdGVUaW1lLT5zZXRUaW1lem9uZShuZXcgXERhdGVUaW1lWm9uZSgnKzAwOjAwJykpOwokb25lU2Vjb25kID0gbmV3IFxEYXRlSW50ZXJ2YWwoJ1BUMVMnKTsKCgppZiAoJG1hdGNoZXNbNF0gPT09ICc2MCcgJiYgJHV0Y0RhdGVUaW1lLT5zdWIoJG9uZVNlY29uZCktPmZvcm1hdCgnSDppOnMnKSA9PT0gJzIzOjU5OjU5JykgewokZGF0ZVRpbWUgPSAkZGF0ZVRpbWUtPnN1Yigkb25lU2Vjb25kKTsKJG1hdGNoZXNbMV0gPSBzdHJfcmVwbGFjZSgnOjYwJywgJzo1OScsICRtYXRjaGVzWzFdKTsKfQoKCmlmICgkZGF0ZVRpbWUtPmZvcm1hdCgkaW5wdXRIYXNUU2VwYXJhdG9yID8gJ1ktbS1kXFRIOmk6cycgOiAnWS1tLWQgSDppOnMnKSAhPT0gJG1hdGNoZXNbMV0pIHsKcmV0dXJuIG51bGw7Cn0KCiRtdXRhYmxlID0gXERhdGVUaW1lOjpjcmVhdGVGcm9tRm9ybWF0KCdVLnUnLCAkZGF0ZVRpbWUtPmZvcm1hdCgnVS51JykpOwppZiAoJG11dGFibGUgPT09IGZhbHNlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVW5hYmxlIHRvIGNyZWF0ZSBEYXRlVGltZSBmcm9tIERhdGVUaW1lSW1tdXRhYmxlJyk7Cn0KCiRtdXRhYmxlLT5zZXRUaW1lem9uZSgkZGF0ZVRpbWUtPmdldFRpbWV6b25lKCkpOwoKcmV0dXJuICRtdXRhYmxlOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7Cgp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xCYXNlQ29uc3RyYWludDsKdXNlIEpzb25TY2hlbWFcRW50aXR5XEpzb25Qb2ludGVyOwp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXFVyaVxVcmlSZXNvbHZlcjsKdXNlIEpzb25TY2hlbWFcVXJpXFVyaVJldHJpZXZlcjsKCmNsYXNzIFNjaGVtYVN0b3JhZ2UgaW1wbGVtZW50cyBTY2hlbWFTdG9yYWdlSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IElOVEVSTkFMX1BST1ZJREVEX1NDSEVNQV9VUkkgPSAnaW50ZXJuYWw6Ly9wcm92aWRlZC1zY2hlbWEvJzsKCnByb3RlY3RlZCAkdXJpUmV0cmlldmVyOwpwcm90ZWN0ZWQgJHVyaVJlc29sdmVyOwpwcm90ZWN0ZWQgJHNjaGVtYXMgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKP1VyaVJldHJpZXZlckludGVyZmFjZSAkdXJpUmV0cmlldmVyID0gbnVsbCwKP1VyaVJlc29sdmVySW50ZXJmYWNlICR1cmlSZXNvbHZlciA9IG51bGwKKSB7CiR0aGlzLT51cmlSZXRyaWV2ZXIgPSAkdXJpUmV0cmlldmVyID86IG5ldyBVcmlSZXRyaWV2ZXIoKTsKJHRoaXMtPnVyaVJlc29sdmVyID0gJHVyaVJlc29sdmVyID86IG5ldyBVcmlSZXNvbHZlcigpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VXJpUmV0cmlldmVyKCkKewpyZXR1cm4gJHRoaXMtPnVyaVJldHJpZXZlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVyaVJlc29sdmVyKCkKewpyZXR1cm4gJHRoaXMtPnVyaVJlc29sdmVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkU2NoZW1hKHN0cmluZyAkaWQsICRzY2hlbWEgPSBudWxsKTogdm9pZAp7CmlmIChpc19udWxsKCRzY2hlbWEpICYmICRpZCAhPT0gc2VsZjo6SU5URVJOQUxfUFJPVklERURfU0NIRU1BX1VSSSkgewoKCgokc2NoZW1hID0gJHRoaXMtPnVyaVJldHJpZXZlci0+cmV0cmlldmUoJGlkKTsKfQoKCmlmIChpc19hcnJheSgkc2NoZW1hKSkgewokc2NoZW1hID0gQmFzZUNvbnN0cmFpbnQ6OmFycmF5VG9PYmplY3RSZWN1cnNpdmUoJHNjaGVtYSk7Cn0KCgoKaWYgKGlzX29iamVjdCgkc2NoZW1hKSAmJiBwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJ2lkJykpIHsKaWYgKCRzY2hlbWEtPmlkID09PSBEcmFmdElkZW50aWZpZXJzOjpEUkFGVF80KSB7CiRzY2hlbWEtPnByb3BlcnRpZXMtPmlkLT5mb3JtYXQgPSAndXJpLXJlZmVyZW5jZSc7Cn0gZWxzZWlmICgkc2NoZW1hLT5pZCA9PT0gRHJhZnRJZGVudGlmaWVyczo6RFJBRlRfMykgewokc2NoZW1hLT5wcm9wZXJ0aWVzLT5pZC0+Zm9ybWF0ID0gJ3VyaS1yZWZlcmVuY2UnOwokc2NoZW1hLT5wcm9wZXJ0aWVzLT57JyRyZWYnfS0+Zm9ybWF0ID0gJ3VyaS1yZWZlcmVuY2UnOwp9Cn0KCiR0aGlzLT5zY2FuRm9yU3Vic2NoZW1hcygkc2NoZW1hLCAkaWQpOwoKCiR0aGlzLT5leHBhbmRSZWZzKCRzY2hlbWEsICRpZCk7CgokdGhpcy0+c2NoZW1hc1skaWRdID0gJHNjaGVtYTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBleHBhbmRSZWZzKCYkc2NoZW1hLCA/c3RyaW5nICRwYXJlbnRJZCA9IG51bGwsIGFycmF5ICRwcm9wZXJ0eVN0YWNrID0gW10pOiB2b2lkCnsKaWYgKCFpc19vYmplY3QoJHNjaGVtYSkpIHsKaWYgKGlzX2FycmF5KCRzY2hlbWEpKSB7CmZvcmVhY2ggKCRzY2hlbWEgYXMgJiRtZW1iZXIpIHsKJHRoaXMtPmV4cGFuZFJlZnMoJG1lbWJlciwgJHBhcmVudElkKTsKfQp9CgpyZXR1cm47Cn0KCmlmIChwcm9wZXJ0eV9leGlzdHMoJHNjaGVtYSwgJyRyZWYnKSAmJiBpc19zdHJpbmcoJHNjaGVtYS0+eyckcmVmJ30pKSB7CiRyZWZQb2ludGVyID0gbmV3IEpzb25Qb2ludGVyKCR0aGlzLT51cmlSZXNvbHZlci0+cmVzb2x2ZSgkc2NoZW1hLT57JyRyZWYnfSwgJHBhcmVudElkKSk7CiRzY2hlbWEtPnsnJHJlZid9ID0gKHN0cmluZykgJHJlZlBvaW50ZXI7Cn0KCiRwYXJlbnRQcm9wZXJ0eSA9IGFycmF5X3NsaWNlKCRwcm9wZXJ0eVN0YWNrLCAtMSlbMF0gPz8gJyc7CmZvcmVhY2ggKCRzY2hlbWEgYXMgJHByb3BlcnR5TmFtZSA9PiAmJG1lbWJlcikgewppZiAoJHBhcmVudFByb3BlcnR5ICE9PSAncHJvcGVydGllcycgJiYgaW5fYXJyYXkoJHByb3BlcnR5TmFtZSwgWydlbnVtJywgJ2NvbnN0J10pKSB7Cgpjb250aW51ZTsKfQoKJHNjaGVtYUlkID0gJHRoaXMtPmZpbmRTY2hlbWFJZEluT2JqZWN0KCRzY2hlbWEpOwokY2hpbGRJZCA9ICRwYXJlbnRJZDsKaWYgKGlzX3N0cmluZygkc2NoZW1hSWQpICYmICRjaGlsZElkICE9PSAkc2NoZW1hSWQpIHsKJGNoaWxkSWQgPSAkdGhpcy0+dXJpUmVzb2x2ZXItPnJlc29sdmUoJHNjaGVtYUlkLCAkY2hpbGRJZCk7Cn0KCiRjbG9uZWRQcm9wZXJ0eVN0YWNrID0gJHByb3BlcnR5U3RhY2s7CiRjbG9uZWRQcm9wZXJ0eVN0YWNrW10gPSAkcHJvcGVydHlOYW1lOwokdGhpcy0+ZXhwYW5kUmVmcygkbWVtYmVyLCAkY2hpbGRJZCwgJGNsb25lZFByb3BlcnR5U3RhY2spOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWEoc3RyaW5nICRpZCkKewppZiAoIWFycmF5X2tleV9leGlzdHMoJGlkLCAkdGhpcy0+c2NoZW1hcykpIHsKJHRoaXMtPmFkZFNjaGVtYSgkaWQpOwp9CgpyZXR1cm4gJHRoaXMtPnNjaGVtYXNbJGlkXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmVSZWYoc3RyaW5nICRyZWYsICRyZXNvbHZlU3RhY2sgPSBbXSkKewokanNvblBvaW50ZXIgPSBuZXcgSnNvblBvaW50ZXIoJHJlZik7CgoKJGZpbGVOYW1lID0gJGpzb25Qb2ludGVyLT5nZXRGaWxlbmFtZSgpOwppZiAoIXN0cmxlbigkZmlsZU5hbWUpKSB7CnRocm93IG5ldyBVbnJlc29sdmFibGVKc29uUG9pbnRlckV4Y2VwdGlvbihzcHJpbnRmKAoiQ291bGQgbm90IHJlc29sdmUgZnJhZ21lbnQgJyVzJzogbm8gZmlsZSBpcyBkZWZpbmVkIiwKJGpzb25Qb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhBc1N0cmluZygpCikpOwp9CgoKJHJlZlNjaGVtYSA9ICR0aGlzLT5nZXRTY2hlbWEoJGZpbGVOYW1lKTsKZm9yZWFjaCAoJGpzb25Qb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhzKCkgYXMgJHBhdGgpIHsKJHBhdGggPSB1cmxkZWNvZGUoJHBhdGgpOwppZiAoaXNfb2JqZWN0KCRyZWZTY2hlbWEpICYmIHByb3BlcnR5X2V4aXN0cygkcmVmU2NoZW1hLCAkcGF0aCkpIHsKJHJlZlNjaGVtYSA9ICR0aGlzLT5yZXNvbHZlUmVmU2NoZW1hKCRyZWZTY2hlbWEtPnskcGF0aH0sICRyZXNvbHZlU3RhY2spOwp9IGVsc2VpZiAoaXNfYXJyYXkoJHJlZlNjaGVtYSkgJiYgYXJyYXlfa2V5X2V4aXN0cygkcGF0aCwgJHJlZlNjaGVtYSkpIHsKJHJlZlNjaGVtYSA9ICR0aGlzLT5yZXNvbHZlUmVmU2NoZW1hKCRyZWZTY2hlbWFbJHBhdGhdLCAkcmVzb2x2ZVN0YWNrKTsKfSBlbHNlIHsKdGhyb3cgbmV3IFVucmVzb2x2YWJsZUpzb25Qb2ludGVyRXhjZXB0aW9uKHNwcmludGYoCidGaWxlOiAlcyBpcyBmb3VuZCwgYnV0IGNvdWxkIG5vdCByZXNvbHZlIGZyYWdtZW50OiAlcycsCiRqc29uUG9pbnRlci0+Z2V0RmlsZW5hbWUoKSwKJGpzb25Qb2ludGVyLT5nZXRQcm9wZXJ0eVBhdGhBc1N0cmluZygpCikpOwp9Cn0KCnJldHVybiAkcmVmU2NoZW1hOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVJlZlNjaGVtYSgkcmVmU2NoZW1hLCAkcmVzb2x2ZVN0YWNrID0gW10pCnsKaWYgKGlzX29iamVjdCgkcmVmU2NoZW1hKSAmJiBwcm9wZXJ0eV9leGlzdHMoJHJlZlNjaGVtYSwgJyRyZWYnKSAmJiBpc19zdHJpbmcoJHJlZlNjaGVtYS0+eyckcmVmJ30pKSB7CmlmIChpbl9hcnJheSgkcmVmU2NoZW1hLCAkcmVzb2x2ZVN0YWNrLCB0cnVlKSkgewp0aHJvdyBuZXcgVW5yZXNvbHZhYmxlSnNvblBvaW50ZXJFeGNlcHRpb24oc3ByaW50ZigKJ0RlcmVmZXJlbmNpbmcgYSBwb2ludGVyIHRvICVzIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgbG9vcCcsCiRyZWZTY2hlbWEtPnsnJHJlZid9CikpOwp9CiRyZXNvbHZlU3RhY2tbXSA9ICRyZWZTY2hlbWE7CgpyZXR1cm4gJHRoaXMtPnJlc29sdmVSZWYoJHJlZlNjaGVtYS0+eyckcmVmJ30sICRyZXNvbHZlU3RhY2spOwp9CgppZiAoaXNfb2JqZWN0KCRyZWZTY2hlbWEpICYmIGFycmF5X2tleXMoZ2V0X29iamVjdF92YXJzKCRyZWZTY2hlbWEpKSA9PT0gWycnXSkgewokcmVmU2NoZW1hID0gZ2V0X29iamVjdF92YXJzKCRyZWZTY2hlbWEpWycnXTsKfQoKcmV0dXJuICRyZWZTY2hlbWE7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2NhbkZvclN1YnNjaGVtYXMoJHNjaGVtYSwgc3RyaW5nICRwYXJlbnRJZCk6IHZvaWQKewppZiAoISRzY2hlbWEgaW5zdGFuY2VvZiBcc3RkQ2xhc3MgJiYgIWlzX2FycmF5KCRzY2hlbWEpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJHNjaGVtYSBhcyAkcHJvcGVydHlOYW1lID0+ICRwb3RlbnRpYWxTdWJTY2hlbWEpIHsKaWYgKCFpc19vYmplY3QoJHBvdGVudGlhbFN1YlNjaGVtYSkpIHsKY29udGludWU7Cn0KCiRwb3RlbnRpYWxTdWJTY2hlbWFJZCA9ICR0aGlzLT5maW5kU2NoZW1hSWRJbk9iamVjdCgkcG90ZW50aWFsU3ViU2NoZW1hKTsKaWYgKGlzX3N0cmluZygkcG90ZW50aWFsU3ViU2NoZW1hSWQpICYmIHByb3BlcnR5X2V4aXN0cygkcG90ZW50aWFsU3ViU2NoZW1hLCAndHlwZScpKSB7CgppZiAoaW5fYXJyYXkoJHByb3BlcnR5TmFtZSwgWydlbnVtJywgJ2NvbnN0J10pKSB7CmNvbnRpbnVlOwp9CgoKaWYgKGluX2FycmF5KCRwcm9wZXJ0eU5hbWUsIFtdKSkgewpjb250aW51ZTsKfQoKCiR0aGlzLT5hZGRTY2hlbWEoJHRoaXMtPnVyaVJlc29sdmVyLT5yZXNvbHZlKCRwb3RlbnRpYWxTdWJTY2hlbWFJZCwgJHBhcmVudElkKSwgJHBvdGVudGlhbFN1YlNjaGVtYSk7Cn0KCiR0aGlzLT5zY2FuRm9yU3Vic2NoZW1hcygkcG90ZW50aWFsU3ViU2NoZW1hLCAkcGFyZW50SWQpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gZmluZFNjaGVtYUlkSW5PYmplY3Qob2JqZWN0ICRzY2hlbWEpOiA/c3RyaW5nCnsKaWYgKHByb3BlcnR5X2V4aXN0cygkc2NoZW1hLCAnaWQnKSAmJiBpc19zdHJpbmcoJHNjaGVtYS0+aWQpKSB7CnJldHVybiAkc2NoZW1hLT5pZDsKfQppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICckaWQnKSAmJiBpc19zdHJpbmcoJHNjaGVtYS0+eyckaWQnfSkpIHsKcmV0dXJuICRzY2hlbWEtPnsnJGlkJ307Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWE7CgppbnRlcmZhY2UgU2NoZW1hU3RvcmFnZUludGVyZmFjZQp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZFNjaGVtYShzdHJpbmcgJGlkLCAkc2NoZW1hID0gbnVsbCk6IHZvaWQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTY2hlbWEoc3RyaW5nICRpZCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlUmVmKHN0cmluZyAkcmVmKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVJlZlNjaGVtYSgkcmVmU2NoZW1hKTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxUb29sOwoKY2xhc3MgRGVlcENvbXBhcmVyCnsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNFcXVhbCgkbGVmdCwgJHJpZ2h0KTogYm9vbAp7CmlmICgkbGVmdCA9PT0gbnVsbCAmJiAkcmlnaHQgPT09IG51bGwpIHsKcmV0dXJuIHRydWU7Cn0KCiRpc0xlZnRTY2FsYXIgPSBpc19zY2FsYXIoJGxlZnQpOwokaXNMZWZ0TnVtYmVyID0gaXNfaW50KCRsZWZ0KSB8fCBpc19mbG9hdCgkbGVmdCk7CiRpc1JpZ2h0U2NhbGFyID0gaXNfc2NhbGFyKCRyaWdodCk7CiRpc1JpZ2h0TnVtYmVyID0gaXNfaW50KCRyaWdodCkgfHwgaXNfZmxvYXQoJHJpZ2h0KTsKCmlmICgkaXNMZWZ0U2NhbGFyICYmICRpc1JpZ2h0U2NhbGFyKSB7CgoKCmlmICgkaXNMZWZ0TnVtYmVyICYmICRpc1JpZ2h0TnVtYmVyICYmIChmbG9hdCkgJGxlZnQgPT09IChmbG9hdCkgJHJpZ2h0KSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gJGxlZnQgPT09ICRyaWdodDsKfQoKaWYgKCRpc0xlZnRTY2FsYXIgIT09ICRpc1JpZ2h0U2NhbGFyKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKGlzX2FycmF5KCRsZWZ0KSAmJiBpc19hcnJheSgkcmlnaHQpKSB7CnJldHVybiBzZWxmOjppc0FycmF5RXF1YWwoJGxlZnQsICRyaWdodCk7Cn0KCmlmICgkbGVmdCBpbnN0YW5jZW9mIFxzdGRDbGFzcyAmJiAkcmlnaHQgaW5zdGFuY2VvZiBcc3RkQ2xhc3MpIHsKcmV0dXJuIHNlbGY6OmlzQXJyYXlFcXVhbCgoYXJyYXkpICRsZWZ0LCAoYXJyYXkpICRyaWdodCk7Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzQXJyYXlFcXVhbChhcnJheSAkbGVmdCwgYXJyYXkgJHJpZ2h0KTogYm9vbAp7CmlmIChjb3VudCgkbGVmdCkgIT09IGNvdW50KCRyaWdodCkpIHsKcmV0dXJuIGZhbHNlOwp9CmZvcmVhY2ggKCRsZWZ0IGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICghYXJyYXlfa2V5X2V4aXN0cygka2V5LCAkcmlnaHQpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCFzZWxmOjppc0VxdWFsKCR2YWx1ZSwgJHJpZ2h0WyRrZXldKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxUb29sOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEpzb25EZWNvZGluZ0V4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgpjbGFzcyBEZWVwQ29weQp7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBjb3B5T2YoJGlucHV0KQp7CiRqc29uID0ganNvbl9lbmNvZGUoJGlucHV0KTsKaWYgKEpTT05fRVJST1JfTk9ORSA8ICRlcnJvciA9IGpzb25fbGFzdF9lcnJvcigpKSB7CnRocm93IG5ldyBKc29uRGVjb2RpbmdFeGNlcHRpb24oJGVycm9yKTsKfQoKaWYgKCRqc29uID09PSBmYWxzZSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignRmFpbGVkIHRvIGVuY29kZSBpbnB1dCB0byBKU09OOiAnIC4ganNvbl9sYXN0X2Vycm9yX21zZygpKTsKfQoKcmV0dXJuIGpzb25fZGVjb2RlKCRqc29uLCBzZWxmOjppc0Fzc29jaWF0aXZlQXJyYXkoJGlucHV0KSk7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGlzQXNzb2NpYXRpdmVBcnJheSgkaW5wdXQpOiBib29sCnsKcmV0dXJuIGlzX2FycmF5KCRpbnB1dCkgJiYgYXJyYXlfa2V5cygkaW5wdXQpICE9PSByYW5nZSgwLCBjb3VudCgkaW5wdXQpIC0gMSk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvcjsKCmNsYXNzIFJlbGF0aXZlUmVmZXJlbmNlVmFsaWRhdG9yCnsKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1ZhbGlkKHN0cmluZyAkcmVmKTogYm9vbAp7CgokcGF0dGVybiA9ICcvXigoW15cLz8jXSspOik/KFwvXC8oW15cLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/JC8nOwoKaWYgKHByZWdfbWF0Y2goJHBhdHRlcm4sICRyZWYpICE9PSAxKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmIChzdHJwb3MoJHJlZiwgJ1xcJykgIT09IGZhbHNlKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXihodHRwfGh0dHBzKTpcL1wvLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXjpcL1wvLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXjpcLy8nLCAkcmVmKSkgewpyZXR1cm4gZmFsc2U7IAp9CgppZiAocHJlZ19tYXRjaCgnL15cL1wvJC8nLCAkcmVmKSkgewpyZXR1cm4gZmFsc2U7IAp9CgppZiAocHJlZ19tYXRjaCgnL15cL1wvXC9bXlwvXS8nLCAkcmVmKSkgewpyZXR1cm4gZmFsc2U7IAp9CgppZiAocHJlZ19tYXRjaCgnL1xzLycsICRyZWYpKSB7CnJldHVybiBmYWxzZTsgCn0KCmlmIChwcmVnX21hdGNoKCcvXlw/I3xeIyQvJywgJHJlZikpIHsKcmV0dXJuIGZhbHNlOyAKfQoKaWYgKCRyZWYgPT09ICcjJyB8fCAkcmVmID09PSAnPycpIHsKcmV0dXJuIGZhbHNlOyAKfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgSnNvblNjaGVtYVxUb29sXFZhbGlkYXRvcjsKCmNsYXNzIFVyaVZhbGlkYXRvcgp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNWYWxpZChzdHJpbmcgJHVyaSk6IGJvb2wKewoKJGhpZXJhcmNoaWNhbFBhdHRlcm4gPSAnL14KICAgICAgICAgICAgKFthLXpdW2EtejAtOStcLS5dKik6XC9cLyAgICAgICAgICAgICAgICAjIFNjaGVtZSAoaHR0cCwgaHR0cHMsIGZ0cCwgZXRjLikKICAgICAgICAgICAgKD86KFteOkBcLz8jXSspKD86OihbXkBcLz8jXSopKT9AKT8gICAgICAjIE9wdGlvbmFsIHVzZXJpbmZvICh1c2VyOnBhc3NAKQogICAgICAgICAgICAoW2EtejAtOS5ffi1dK3xcW1thLWYwLTk6Ll0rXF0pICAgICAgICAgICMgSG9zdG5hbWUgb3IgSVB2NiBpbiBicmFja2V0cwogICAgICAgICAgICAoPzo6KFxkezEsNX0pKT8gICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgcG9ydAogICAgICAgICAgICAoXC9bYS16QS1aMC05Ll9+ISQmXCcoKSorLDs9OkBcLyUtXSopKiAgICMgUGF0aCAodmFsaWQgY2hhcmFjdGVycyBvbmx5KQogICAgICAgICAgICAoXD8oW14jXSopKT8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwgcXVlcnkKICAgICAgICAgICAgKFwjKC4qKSk/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE9wdGlvbmFsIGZyYWdtZW50CiAgICAgICAgJC9peCc7CgoKJG5vbkhpZXJhcmNoaWNhbFBhdHRlcm4gPSAnL14KICAgICAgICAgICAgICAgIChtYWlsdG98ZGF0YXx1cm58bmV3c3x0ZWx8ZmlsZSk6ICAgICAjIE9ubHkgYWxsb3cga25vd24gbm9uLWhpZXJhcmNoaWNhbCBzY2hlbWVzCiAgICAgICAgICAgICAgICAoLispICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBNdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlciBhZnRlciBzY2hlbWUKICAgICAgICAkL2l4JzsKCgokbmV3c0dyb3VwUGF0dGVybiA9ICcvXlthLXowLTldKyhcLlthLXowLTldKykqJC9pJzsKJHRlbFBhdHRlcm4gPSAnL15cKz9bMC05LlwtKCkgXSskLyc7IAoKCiRlbWFpbFBhdHRlcm4gPSAnL15bYS16QS1aMC05Ll8lKy1dK0BbYS16QS1aMC05Li1dK1wuW2EtekEtWl17Mix9JC8nOwoKCmlmIChwcmVnX21hdGNoKCRoaWVyYXJjaGljYWxQYXR0ZXJuLCAkdXJpLCAkbWF0Y2hlcykgPT09IDEpIHsKCmlmICghZW1wdHkoJG1hdGNoZXNbNF0pICYmIHByZWdfbWF0Y2goJy9cLlwuLycsICRtYXRjaGVzWzRdKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoIWVtcHR5KCRtYXRjaGVzWzVdKSAmJiAoJG1hdGNoZXNbNV0gPCAxIHx8ICRtYXRjaGVzWzVdID4gNjU1MzUpKSB7CnJldHVybiBmYWxzZTsKfQoKCmlmICghZW1wdHkoJG1hdGNoZXNbNl0pICYmIHByZWdfbWF0Y2goJy9bPD57fXxcXFxeYF0vJywgJG1hdGNoZXNbNl0pKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHRydWU7Cn0KCgppZiAocHJlZ19tYXRjaCgkbm9uSGllcmFyY2hpY2FsUGF0dGVybiwgJHVyaSwgJG1hdGNoZXMpID09PSAxKSB7CiRzY2hlbWUgPSBzdHJ0b2xvd2VyKCRtYXRjaGVzWzFdKTsgCgoKaWYgKCRzY2hlbWUgPT09ICdtYWlsdG8nKSB7CnJldHVybiBwcmVnX21hdGNoKCRlbWFpbFBhdHRlcm4sICRtYXRjaGVzWzJdKSA9PT0gMTsKfQoKaWYgKCRzY2hlbWUgPT09ICduZXdzJykgewpyZXR1cm4gcHJlZ19tYXRjaCgkbmV3c0dyb3VwUGF0dGVybiwgJG1hdGNoZXNbMl0pID09PSAxOwp9CgppZiAoJHNjaGVtZSA9PT0gJ3RlbCcpIHsKcmV0dXJuIHByZWdfbWF0Y2goJHRlbFBhdHRlcm4sICRtYXRjaGVzWzJdKSA9PT0gMTsKfQoKcmV0dXJuIHRydWU7IAp9CgpyZXR1cm4gZmFsc2U7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyczsKCgoKCgoKCmFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmV0cmlldmVyIGltcGxlbWVudHMgVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKCgpwcm90ZWN0ZWQgJGNvbnRlbnRUeXBlOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudFR5cGUoKQp7CnJldHVybiAkdGhpcy0+Y29udGVudFR5cGU7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7Cgp1c2UgSnNvblNjaGVtYVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIEpzb25TY2hlbWFcVmFsaWRhdG9yOwoKCgoKCgpjbGFzcyBDdXJsIGV4dGVuZHMgQWJzdHJhY3RSZXRyaWV2ZXIKewpwcm90ZWN0ZWQgJG1lc3NhZ2VCb2R5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewppZiAoIWZ1bmN0aW9uX2V4aXN0cygnY3VybF9pbml0JykpIHsKCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdjVVJMIG5vdCBpbnN0YWxsZWQnKTsgCn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV0cmlldmUoJHVyaSkKewokY2ggPSBjdXJsX2luaXQoKTsKCmN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VUkwsICR1cmkpOwpjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfSEVBREVSLCB0cnVlKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsKY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBIRUFERVIsIFsnQWNjZXB0OiAnIC4gVmFsaWRhdG9yOjpTQ0hFTUFfTUVESUFfVFlQRV0pOwoKJHJlc3BvbnNlID0gY3VybF9leGVjKCRjaCk7CmlmIChmYWxzZSA9PT0gJHJlc3BvbnNlKSB7CnRocm93IG5ldyBcSnNvblNjaGVtYVxFeGNlcHRpb25cUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbignSlNPTiBzY2hlbWEgbm90IGZvdW5kJyk7Cn0KCiR0aGlzLT5mZXRjaE1lc3NhZ2VCb2R5KCRyZXNwb25zZSk7CiR0aGlzLT5mZXRjaENvbnRlbnRUeXBlKCRyZXNwb25zZSk7CgppZiAoUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewpjdXJsX2Nsb3NlKCRjaCk7Cn0KCnJldHVybiAkdGhpcy0+bWVzc2FnZUJvZHk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZmV0Y2hNZXNzYWdlQm9keSgkcmVzcG9uc2UpCnsKcHJlZ19tYXRjaCgiLyg/OlxyXG4pezJ9KC4qKSQvbXMiLCAkcmVzcG9uc2UsICRtYXRjaCk7CiR0aGlzLT5tZXNzYWdlQm9keSA9ICRtYXRjaFsxXTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmV0Y2hDb250ZW50VHlwZSgkcmVzcG9uc2UpCnsKaWYgKDAgPCBwcmVnX21hdGNoKCIvQ29udGVudC1UeXBlOihcViopL2ltcyIsICRyZXNwb25zZSwgJG1hdGNoKSkgewokdGhpcy0+Y29udGVudFR5cGUgPSB0cmltKCRtYXRjaFsxXSk7CgpyZXR1cm4gdHJ1ZTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb247CgoKCgoKCmNsYXNzIEZpbGVHZXRDb250ZW50cyBleHRlbmRzIEFic3RyYWN0UmV0cmlldmVyCnsKcHJvdGVjdGVkICRtZXNzYWdlQm9keTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpCnsKaWYgKGZ1bmN0aW9uX2V4aXN0cygnaHR0cF9jbGVhcl9sYXN0X3Jlc3BvbnNlX2hlYWRlcnMnKSkgewpodHRwX2NsZWFyX2xhc3RfcmVzcG9uc2VfaGVhZGVycygpOwp9CgokZXJyb3JNZXNzYWdlID0gbnVsbDsKc2V0X2Vycm9yX2hhbmRsZXIoZnVuY3Rpb24gKCRlcnJubywgJGVycnN0cikgdXNlICgmJGVycm9yTWVzc2FnZSkgewokZXJyb3JNZXNzYWdlID0gJGVycnN0cjsKfSk7CiRyZXNwb25zZSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR1cmkpOwpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKCmlmICgkZXJyb3JNZXNzYWdlKSB7CnRocm93IG5ldyBSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uKCRlcnJvck1lc3NhZ2UpOwp9CgppZiAoZmFsc2UgPT09ICRyZXNwb25zZSkgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbignSlNPTiBzY2hlbWEgbm90IGZvdW5kIGF0ICcgLiAkdXJpKTsKfQoKaWYgKCRyZXNwb25zZSA9PSAnJwomJiBzdWJzdHIoJHVyaSwgMCwgNykgPT0gJ2ZpbGU6Ly8nICYmIHN1YnN0cigkdXJpLCAtMSkgPT0gJy8nCikgewp0aHJvdyBuZXcgUmVzb3VyY2VOb3RGb3VuZEV4Y2VwdGlvbignSlNPTiBzY2hlbWEgbm90IGZvdW5kIGF0ICcgLiAkdXJpKTsKfQoKJHRoaXMtPm1lc3NhZ2VCb2R5ID0gJHJlc3BvbnNlOwoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnaHR0cF9nZXRfbGFzdF9yZXNwb25zZV9oZWFkZXJzJykpIHsKCgokaHR0cFJlc3BvbnNlSGVhZGVycyA9IGh0dHBfZ2V0X2xhc3RfcmVzcG9uc2VfaGVhZGVycygpOwp9IGVsc2UgewoKJGh0dHBSZXNwb25zZUhlYWRlcnMgPSAkaHR0cF9yZXNwb25zZV9oZWFkZXIgPz8gW107Cn0KCmlmICghZW1wdHkoJGh0dHBSZXNwb25zZUhlYWRlcnMpKSB7CiR0aGlzLT5mZXRjaENvbnRlbnRUeXBlKCRodHRwUmVzcG9uc2VIZWFkZXJzKTsKfSBlbHNlIHsKJHRoaXMtPmNvbnRlbnRUeXBlID0gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5tZXNzYWdlQm9keTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZldGNoQ29udGVudFR5cGUoYXJyYXkgJGhlYWRlcnMpOiBib29sCnsKZm9yZWFjaCAoYXJyYXlfcmV2ZXJzZSgkaGVhZGVycykgYXMgJGhlYWRlcikgewppZiAoJHRoaXMtPmNvbnRlbnRUeXBlID0gc2VsZjo6Z2V0Q29udGVudFR5cGVNYXRjaEluSGVhZGVyKCRoZWFkZXIpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKCgpwcm90ZWN0ZWQgc3RhdGljIGZ1bmN0aW9uIGdldENvbnRlbnRUeXBlTWF0Y2hJbkhlYWRlcigkaGVhZGVyKQp7CmlmICgwIDwgcHJlZ19tYXRjaCgiL0NvbnRlbnQtVHlwZTooXFYqKS9pbXMiLCAkaGVhZGVyLCAkbWF0Y2gpKSB7CnJldHVybiB0cmltKCRtYXRjaFsxXSk7Cn0KCnJldHVybiBudWxsOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpXFJldHJpZXZlcnM7Cgp1c2UgSnNvblNjaGVtYVxWYWxpZGF0b3I7CgoKCgoKCgoKCgoKCgpjbGFzcyBQcmVkZWZpbmVkQXJyYXkgZXh0ZW5kcyBBYnN0cmFjdFJldHJpZXZlcgp7CgoKCgoKcHJpdmF0ZSAkc2NoZW1hczsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkc2NoZW1hcywgJGNvbnRlbnRUeXBlID0gVmFsaWRhdG9yOjpTQ0hFTUFfTUVESUFfVFlQRSkKewokdGhpcy0+c2NoZW1hcyA9ICRzY2hlbWFzOwokdGhpcy0+Y29udGVudFR5cGUgPSAkY29udGVudFR5cGU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpCnsKaWYgKCFhcnJheV9rZXlfZXhpc3RzKCR1cmksICR0aGlzLT5zY2hlbWFzKSkgewp0aHJvdyBuZXcgXEpzb25TY2hlbWFcRXhjZXB0aW9uXFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZigKJ1RoZSBKU09OIHNjaGVtYSAiJXMiIHdhcyBub3QgZm91bmQuJywKJHVyaQopKTsKfQoKcmV0dXJuICR0aGlzLT5zY2hlbWFzWyR1cmldOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzOwoKCgoKCgppbnRlcmZhY2UgVXJpUmV0cmlldmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJldHJpZXZlKCR1cmkpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29udGVudFR5cGUoKTsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXFVyaVJlc29sdmVyRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxVcmlSZXNvbHZlckludGVyZmFjZTsKCgoKCgoKY2xhc3MgVXJpUmVzb2x2ZXIgaW1wbGVtZW50cyBVcmlSZXNvbHZlckludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcGFyc2UoJHVyaSkKewpwcmVnX21hdGNoKCd8XigoW146Lz8jXSspOik/KC8vKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/fCcsIChzdHJpbmcpICR1cmksICRtYXRjaCk7CgokY29tcG9uZW50cyA9IFtdOwppZiAoNSA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHMgPSBbCidzY2hlbWUnID0+ICRtYXRjaFsyXSwKJ2F1dGhvcml0eScgPT4gJG1hdGNoWzRdLAoncGF0aCcgPT4gJG1hdGNoWzVdCl07Cn0KaWYgKDcgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzWydxdWVyeSddID0gJG1hdGNoWzddOwp9CmlmICg5IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50c1snZnJhZ21lbnQnXSA9ICRtYXRjaFs5XTsKfQoKcmV0dXJuICRjb21wb25lbnRzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlKGFycmF5ICRjb21wb25lbnRzKQp7CiR1cmkgPSAkY29tcG9uZW50c1snc2NoZW1lJ10gLiAnOi8vJwouICRjb21wb25lbnRzWydhdXRob3JpdHknXQouICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkY29tcG9uZW50cykgJiYgc3RybGVuKCRjb21wb25lbnRzWydxdWVyeSddKSkgewokdXJpIC49ICc/JyAuICRjb21wb25lbnRzWydxdWVyeSddOwp9CmlmIChhcnJheV9rZXlfZXhpc3RzKCdmcmFnbWVudCcsICRjb21wb25lbnRzKSkgewokdXJpIC49ICcjJyAuICRjb21wb25lbnRzWydmcmFnbWVudCddOwp9CgpyZXR1cm4gJHVyaTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHVyaSwgJGJhc2VVcmkgPSBudWxsKQp7CgppZiAoCiFpc19udWxsKCRiYXNlVXJpKSAmJgohZmlsdGVyX3ZhcigkYmFzZVVyaSwgXEZJTFRFUl9WQUxJREFURV9VUkwpICYmCiFwcmVnX21hdGNoKCd8XlteL10rOi8vfHUnLCAkYmFzZVVyaSkKKSB7CmlmIChpc19maWxlKCRiYXNlVXJpKSkgewokYmFzZVVyaSA9ICdmaWxlOi8vJyAuIHJlYWxwYXRoKCRiYXNlVXJpKTsKfSBlbHNlaWYgKGlzX2RpcigkYmFzZVVyaSkpIHsKJGJhc2VVcmkgPSAnZmlsZTovLycgLiByZWFscGF0aCgkYmFzZVVyaSkgLiAnLyc7Cn0gZWxzZSB7CiRiYXNlVXJpID0gJ2ZpbGU6Ly8nIC4gZ2V0Y3dkKCkgLiAnLycgLiAkYmFzZVVyaTsKfQp9CgppZiAoJHVyaSA9PSAnJykgewpyZXR1cm4gJGJhc2VVcmk7Cn0KCiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwokcGF0aCA9ICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoIWVtcHR5KCRjb21wb25lbnRzWydzY2hlbWUnXSkpIHsKcmV0dXJuICR1cmk7Cn0KJGJhc2VDb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCRiYXNlVXJpKTsKJGJhc2VQYXRoID0gJGJhc2VDb21wb25lbnRzWydwYXRoJ107CgokYmFzZUNvbXBvbmVudHNbJ3BhdGgnXSA9IHNlbGY6OmNvbWJpbmVSZWxhdGl2ZVBhdGhXaXRoQmFzZVBhdGgoJHBhdGgsICRiYXNlUGF0aCk7CmlmIChpc3NldCgkY29tcG9uZW50c1snZnJhZ21lbnQnXSkpIHsKJGJhc2VDb21wb25lbnRzWydmcmFnbWVudCddID0gJGNvbXBvbmVudHNbJ2ZyYWdtZW50J107Cn0KCnJldHVybiAkdGhpcy0+Z2VuZXJhdGUoJGJhc2VDb21wb25lbnRzKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY29tYmluZVJlbGF0aXZlUGF0aFdpdGhCYXNlUGF0aCgkcmVsYXRpdmVQYXRoLCAkYmFzZVBhdGgpCnsKJHJlbGF0aXZlUGF0aCA9IHNlbGY6Om5vcm1hbGl6ZVBhdGgoJHJlbGF0aXZlUGF0aCk7CmlmICghJHJlbGF0aXZlUGF0aCkgewpyZXR1cm4gJGJhc2VQYXRoOwp9CmlmICgkcmVsYXRpdmVQYXRoWzBdID09PSAnLycpIHsKcmV0dXJuICRyZWxhdGl2ZVBhdGg7Cn0KaWYgKCEkYmFzZVBhdGgpIHsKdGhyb3cgbmV3IFVyaVJlc29sdmVyRXhjZXB0aW9uKHNwcmludGYoIlVuYWJsZSB0byByZXNvbHZlIFVSSSAnJXMnIGZyb20gYmFzZSAnJXMnIiwgJHJlbGF0aXZlUGF0aCwgJGJhc2VQYXRoKSk7Cn0KCiRkaXJuYW1lID0gJGJhc2VQYXRoW3N0cmxlbigkYmFzZVBhdGgpIC0gMV0gPT09ICcvJyA/ICRiYXNlUGF0aCA6IGRpcm5hbWUoJGJhc2VQYXRoKTsKJGNvbWJpbmVkID0gcnRyaW0oJGRpcm5hbWUsICcvJykgLiAnLycgLiBsdHJpbSgkcmVsYXRpdmVQYXRoLCAnLycpOwokY29tYmluZWRTZWdtZW50cyA9IGV4cGxvZGUoJy8nLCAkY29tYmluZWQpOwokY29sbGFwc2VkU2VnbWVudHMgPSBbXTsKd2hpbGUgKCRjb21iaW5lZFNlZ21lbnRzKSB7CiRzZWdtZW50ID0gYXJyYXlfc2hpZnQoJGNvbWJpbmVkU2VnbWVudHMpOwppZiAoJHNlZ21lbnQgPT09ICcuLicpIHsKaWYgKGNvdW50KCRjb2xsYXBzZWRTZWdtZW50cykgPD0gMSkgewoKCgoKdGhyb3cgbmV3IFVyaVJlc29sdmVyRXhjZXB0aW9uKHNwcmludGYoIlVuYWJsZSB0byByZXNvbHZlIFVSSSAnJXMnIGZyb20gYmFzZSAnJXMnIiwgJHJlbGF0aXZlUGF0aCwgJGJhc2VQYXRoKSk7Cn0KYXJyYXlfcG9wKCRjb2xsYXBzZWRTZWdtZW50cyk7Cn0gZWxzZSB7CiRjb2xsYXBzZWRTZWdtZW50c1tdID0gJHNlZ21lbnQ7Cn0KfQoKcmV0dXJuIGltcGxvZGUoJy8nLCAkY29sbGFwc2VkU2VnbWVudHMpOwp9CgoKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplUGF0aCgkcGF0aCkKewokcGF0aCA9IHByZWdfcmVwbGFjZSgnfCgoPzwhXC4pXC4vKSp8JywgJycsICRwYXRoKTsKJHBhdGggPSBwcmVnX3JlcGxhY2UoJ3wvL3wnLCAnLycsICRwYXRoKTsKCnJldHVybiAkcGF0aDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgkdXJpKQp7CiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwoKcmV0dXJuICFlbXB0eSgkY29tcG9uZW50cyk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgoKCgoKCgoKbmFtZXNwYWNlIEpzb25TY2hlbWFcVXJpOwoKdXNlIEpzb25TY2hlbWFcRXhjZXB0aW9uXEludmFsaWRTY2hlbWFNZWRpYVR5cGVFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxKc29uRGVjb2RpbmdFeGNlcHRpb247CnVzZSBKc29uU2NoZW1hXEV4Y2VwdGlvblxSZXNvdXJjZU5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgSnNvblNjaGVtYVxVcmlcUmV0cmlldmVyc1xGaWxlR2V0Q29udGVudHM7CnVzZSBKc29uU2NoZW1hXFVyaVxSZXRyaWV2ZXJzXFVyaVJldHJpZXZlckludGVyZmFjZTsKdXNlIEpzb25TY2hlbWFcVXJpUmV0cmlldmVySW50ZXJmYWNlIGFzIEJhc2VVcmlSZXRyaWV2ZXJJbnRlcmZhY2U7CnVzZSBKc29uU2NoZW1hXFZhbGlkYXRvcjsKCgoKCgoKY2xhc3MgVXJpUmV0cmlldmVyIGltcGxlbWVudHMgQmFzZVVyaVJldHJpZXZlckludGVyZmFjZQp7CgoKCnByb3RlY3RlZCAkdHJhbnNsYXRpb25NYXAgPSBbCgonfF5odHRwcz86Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtKDBbMzQ2XSkvc2NoZW1hIz98JyA9PiAncGFja2FnZTovL2Rpc3Qvc2NoZW1hL2pzb24tc2NoZW1hLWRyYWZ0LSQxLmpzb24nCl07CgoKCgpwcm90ZWN0ZWQgJGFsbG93ZWRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludHMgPSBbCidodHRwOi8vanNvbi1zY2hlbWEub3JnLycsCidodHRwczovL2pzb24tc2NoZW1hLm9yZy8nCl07CgoKCgpwcm90ZWN0ZWQgJHVyaVJldHJpZXZlciA9IG51bGw7CgoKCgoKCnByaXZhdGUgJHNjaGVtYUNhY2hlID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludCgkZW5kcG9pbnQpCnsKJHRoaXMtPmFsbG93ZWRJbnZhbGlkQ29udGVudFR5cGVFbmRwb2ludHNbXSA9ICRlbmRwb2ludDsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29uZmlybU1lZGlhVHlwZSgkdXJpUmV0cmlldmVyLCAkdXJpKQp7CiRjb250ZW50VHlwZSA9ICR1cmlSZXRyaWV2ZXItPmdldENvbnRlbnRUeXBlKCk7CgppZiAoaXNfbnVsbCgkY29udGVudFR5cGUpKSB7CgpyZXR1cm47Cn0KCmlmIChpbl9hcnJheSgkY29udGVudFR5cGUsIFtWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFLCAnYXBwbGljYXRpb24vanNvbiddKSkgewpyZXR1cm47Cn0KCmZvcmVhY2ggKCR0aGlzLT5hbGxvd2VkSW52YWxpZENvbnRlbnRUeXBlRW5kcG9pbnRzIGFzICRlbmRwb2ludCkgewppZiAoIVxpc19udWxsKCR1cmkpICYmIHN0cnBvcygkdXJpLCAkZW5kcG9pbnQpID09PSAwKSB7CnJldHVybiB0cnVlOwp9Cn0KCnRocm93IG5ldyBJbnZhbGlkU2NoZW1hTWVkaWFUeXBlRXhjZXB0aW9uKHNwcmludGYoJ01lZGlhIHR5cGUgJXMgZXhwZWN0ZWQnLCBWYWxpZGF0b3I6OlNDSEVNQV9NRURJQV9UWVBFKSk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVyaVJldHJpZXZlcigpCnsKaWYgKGlzX251bGwoJHRoaXMtPnVyaVJldHJpZXZlcikpIHsKJHRoaXMtPnNldFVyaVJldHJpZXZlcihuZXcgRmlsZUdldENvbnRlbnRzKCkpOwp9CgpyZXR1cm4gJHRoaXMtPnVyaVJldHJpZXZlcjsKfQoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZVBvaW50ZXIoJGpzb25TY2hlbWEsICR1cmkpCnsKJHJlc29sdmVyID0gbmV3IFVyaVJlc29sdmVyKCk7CiRwYXJzZWQgPSAkcmVzb2x2ZXItPnBhcnNlKCR1cmkpOwppZiAoZW1wdHkoJHBhcnNlZFsnZnJhZ21lbnQnXSkpIHsKcmV0dXJuICRqc29uU2NoZW1hOwp9CgokcGF0aCA9IGV4cGxvZGUoJy8nLCAkcGFyc2VkWydmcmFnbWVudCddKTsKd2hpbGUgKCRwYXRoKSB7CiRwYXRoRWxlbWVudCA9IGFycmF5X3NoaWZ0KCRwYXRoKTsKaWYgKCFlbXB0eSgkcGF0aEVsZW1lbnQpKSB7CiRwYXRoRWxlbWVudCA9IHN0cl9yZXBsYWNlKCd+MScsICcvJywgJHBhdGhFbGVtZW50KTsKJHBhdGhFbGVtZW50ID0gc3RyX3JlcGxhY2UoJ34wJywgJ34nLCAkcGF0aEVsZW1lbnQpOwppZiAoIWVtcHR5KCRqc29uU2NoZW1hLT4kcGF0aEVsZW1lbnQpKSB7CiRqc29uU2NoZW1hID0gJGpzb25TY2hlbWEtPiRwYXRoRWxlbWVudDsKfSBlbHNlIHsKdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oCidGcmFnbWVudCAiJyAuICRwYXJzZWRbJ2ZyYWdtZW50J10gLiAnIiBub3QgZm91bmQnCi4gJyBpbiAnIC4gJHVyaQopOwp9CgppZiAoIWlzX29iamVjdCgkanNvblNjaGVtYSkpIHsKdGhyb3cgbmV3IFJlc291cmNlTm90Rm91bmRFeGNlcHRpb24oCidGcmFnbWVudCBwYXJ0ICInIC4gJHBhdGhFbGVtZW50IC4gJyIgaXMgbm8gb2JqZWN0ICcKLiAnIGluICcgLiAkdXJpCik7Cn0KfQp9CgpyZXR1cm4gJGpzb25TY2hlbWE7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZSgkdXJpLCAkYmFzZVVyaSA9IG51bGwsICR0cmFuc2xhdGUgPSB0cnVlKQp7CiRyZXNvbHZlciA9IG5ldyBVcmlSZXNvbHZlcigpOwokcmVzb2x2ZWRVcmkgPSAkZmV0Y2hVcmkgPSAkcmVzb2x2ZXItPnJlc29sdmUoJHVyaSwgJGJhc2VVcmkpOwoKCiRhclBhcnRzID0gJHJlc29sdmVyLT5wYXJzZSgkcmVzb2x2ZWRVcmkpOwppZiAoaXNzZXQoJGFyUGFydHNbJ2ZyYWdtZW50J10pKSB7CnVuc2V0KCRhclBhcnRzWydmcmFnbWVudCddKTsKJGZldGNoVXJpID0gJHJlc29sdmVyLT5nZW5lcmF0ZSgkYXJQYXJ0cyk7Cn0KCgppZiAoJHRyYW5zbGF0ZSkgewokZmV0Y2hVcmkgPSAkdGhpcy0+dHJhbnNsYXRlKCRmZXRjaFVyaSk7Cn0KCiRqc29uU2NoZW1hID0gJHRoaXMtPmxvYWRTY2hlbWEoJGZldGNoVXJpKTsKCgokanNvblNjaGVtYSA9ICR0aGlzLT5yZXNvbHZlUG9pbnRlcigkanNvblNjaGVtYSwgJHJlc29sdmVkVXJpKTsKCmlmICgkanNvblNjaGVtYSBpbnN0YW5jZW9mIFxzdGRDbGFzcykgewokanNvblNjaGVtYS0+aWQgPSAkcmVzb2x2ZWRVcmk7Cn0KCnJldHVybiAkanNvblNjaGVtYTsKfQoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gbG9hZFNjaGVtYSgkZmV0Y2hVcmkpCnsKaWYgKGlzc2V0KCR0aGlzLT5zY2hlbWFDYWNoZVskZmV0Y2hVcmldKSkgewpyZXR1cm4gJHRoaXMtPnNjaGVtYUNhY2hlWyRmZXRjaFVyaV07Cn0KCiR1cmlSZXRyaWV2ZXIgPSAkdGhpcy0+Z2V0VXJpUmV0cmlldmVyKCk7CiRjb250ZW50cyA9ICR0aGlzLT51cmlSZXRyaWV2ZXItPnJldHJpZXZlKCRmZXRjaFVyaSk7CiR0aGlzLT5jb25maXJtTWVkaWFUeXBlKCR1cmlSZXRyaWV2ZXIsICRmZXRjaFVyaSk7CiRqc29uU2NoZW1hID0ganNvbl9kZWNvZGUoJGNvbnRlbnRzKTsKCmlmIChKU09OX0VSUk9SX05PTkUgPCAkZXJyb3IgPSBqc29uX2xhc3RfZXJyb3IoKSkgewp0aHJvdyBuZXcgSnNvbkRlY29kaW5nRXhjZXB0aW9uKCRlcnJvcik7Cn0KCiR0aGlzLT5zY2hlbWFDYWNoZVskZmV0Y2hVcmldID0gJGpzb25TY2hlbWE7CgpyZXR1cm4gJGpzb25TY2hlbWE7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VXJpUmV0cmlldmVyKFVyaVJldHJpZXZlckludGVyZmFjZSAkdXJpUmV0cmlldmVyKQp7CiR0aGlzLT51cmlSZXRyaWV2ZXIgPSAkdXJpUmV0cmlldmVyOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlKCR1cmkpCnsKcHJlZ19tYXRjaCgnfF4oKFteOi8/I10rKTopPygvLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpP3wnLCAkdXJpLCAkbWF0Y2gpOwoKJGNvbXBvbmVudHMgPSBbXTsKaWYgKDUgPCBjb3VudCgkbWF0Y2gpKSB7CiRjb21wb25lbnRzID0gWwonc2NoZW1lJyA9PiAkbWF0Y2hbMl0sCidhdXRob3JpdHknID0+ICRtYXRjaFs0XSwKJ3BhdGgnID0+ICRtYXRjaFs1XQpdOwp9CgppZiAoNyA8IGNvdW50KCRtYXRjaCkpIHsKJGNvbXBvbmVudHNbJ3F1ZXJ5J10gPSAkbWF0Y2hbN107Cn0KCmlmICg5IDwgY291bnQoJG1hdGNoKSkgewokY29tcG9uZW50c1snZnJhZ21lbnQnXSA9ICRtYXRjaFs5XTsKfQoKcmV0dXJuICRjb21wb25lbnRzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdlbmVyYXRlKGFycmF5ICRjb21wb25lbnRzKQp7CiR1cmkgPSAkY29tcG9uZW50c1snc2NoZW1lJ10gLiAnOi8vJwouICRjb21wb25lbnRzWydhdXRob3JpdHknXQouICRjb21wb25lbnRzWydwYXRoJ107CgppZiAoYXJyYXlfa2V5X2V4aXN0cygncXVlcnknLCAkY29tcG9uZW50cykpIHsKJHVyaSAuPSAkY29tcG9uZW50c1sncXVlcnknXTsKfQoKaWYgKGFycmF5X2tleV9leGlzdHMoJ2ZyYWdtZW50JywgJGNvbXBvbmVudHMpKSB7CiR1cmkgLj0gJGNvbXBvbmVudHNbJ2ZyYWdtZW50J107Cn0KCnJldHVybiAkdXJpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKCR1cmksICRiYXNlVXJpID0gbnVsbCkKewokY29tcG9uZW50cyA9ICR0aGlzLT5wYXJzZSgkdXJpKTsKJHBhdGggPSAkY29tcG9uZW50c1sncGF0aCddOwoKaWYgKChhcnJheV9rZXlfZXhpc3RzKCdzY2hlbWUnLCAkY29tcG9uZW50cykpICYmICgnaHR0cCcgPT09ICRjb21wb25lbnRzWydzY2hlbWUnXSkpIHsKcmV0dXJuICR1cmk7Cn0KCiRiYXNlQ29tcG9uZW50cyA9ICR0aGlzLT5wYXJzZSgkYmFzZVVyaSk7CiRiYXNlUGF0aCA9ICRiYXNlQ29tcG9uZW50c1sncGF0aCddOwoKJGJhc2VDb21wb25lbnRzWydwYXRoJ10gPSBVcmlSZXNvbHZlcjo6Y29tYmluZVJlbGF0aXZlUGF0aFdpdGhCYXNlUGF0aCgkcGF0aCwgJGJhc2VQYXRoKTsKCnJldHVybiAkdGhpcy0+Z2VuZXJhdGUoJGJhc2VDb21wb25lbnRzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWYWxpZCgkdXJpKQp7CiRjb21wb25lbnRzID0gJHRoaXMtPnBhcnNlKCR1cmkpOwoKcmV0dXJuICFlbXB0eSgkY29tcG9uZW50cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUcmFuc2xhdGlvbigkZnJvbSwgJHRvKQp7CiR0aGlzLT50cmFuc2xhdGlvbk1hcFskZnJvbV0gPSAkdG87Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0cmFuc2xhdGUoJHVyaSkKewpmb3JlYWNoICgkdGhpcy0+dHJhbnNsYXRpb25NYXAgYXMgJGZyb20gPT4gJHRvKSB7CiR1cmkgPSBwcmVnX3JlcGxhY2UoJGZyb20sICR0bywgJHVyaSk7Cn0KCgokdXJpID0gcHJlZ19yZXBsYWNlKCd8XnBhY2thZ2U6Ly98Jywgc3ByaW50ZignZmlsZTovLyVzLycsIHJlYWxwYXRoKF9fRElSX18gLiAnLy4uLy4uLy4uJykpLCAkdXJpKTsKCnJldHVybiAkdXJpOwp9Cn0KPD9waHAKCmRlY2xhcmUoc3RyaWN0X3R5cGVzPTEpOwoKCgoKCgoKCm5hbWVzcGFjZSBKc29uU2NoZW1hOwoKCgoKaW50ZXJmYWNlIFVyaVJlc29sdmVySW50ZXJmYWNlCnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVzb2x2ZSgkdXJpLCAkYmFzZVVyaSA9IG51bGwpOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCgoKCmludGVyZmFjZSBVcmlSZXRyaWV2ZXJJbnRlcmZhY2UKewoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXRyaWV2ZSgkdXJpLCAkYmFzZVVyaSA9IG51bGwpOwp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCgoKCgoKCgpuYW1lc3BhY2UgSnNvblNjaGVtYTsKCnVzZSBKc29uU2NoZW1hXENvbnN0cmFpbnRzXEJhc2VDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xDb25zdHJhaW50Owp1c2UgSnNvblNjaGVtYVxDb25zdHJhaW50c1xUeXBlQ2hlY2tcTG9vc2VUeXBlQ2hlY2s7CgoKCgoKCgoKCmNsYXNzIFZhbGlkYXRvciBleHRlbmRzIEJhc2VDb25zdHJhaW50CnsKcHVibGljIGNvbnN0IFNDSEVNQV9NRURJQV9UWVBFID0gJ2FwcGxpY2F0aW9uL3NjaGVtYStqc29uJzsKCnB1YmxpYyBjb25zdCBFUlJPUl9OT05FID0gMDsKcHVibGljIGNvbnN0IEVSUk9SX0FMTCA9IC0xOwpwdWJsaWMgY29uc3QgRVJST1JfRE9DVU1FTlRfVkFMSURBVElPTiA9IDE7CnB1YmxpYyBjb25zdCBFUlJPUl9TQ0hFTUFfVkFMSURBVElPTiA9IDI7CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCYkdmFsdWUsICRzY2hlbWEgPSBudWxsLCA/aW50ICRjaGVja01vZGUgPSBudWxsKTogaW50CnsKCiR0aGlzLT5yZXNldCgpOwoKCiRpbml0aWFsQ2hlY2tNb2RlID0gJHRoaXMtPmZhY3RvcnktPmdldENvbmZpZygpOwppZiAoJGNoZWNrTW9kZSAhPT0gbnVsbCkgewokdGhpcy0+ZmFjdG9yeS0+c2V0Q29uZmlnKCRjaGVja01vZGUpOwp9CgoKJHNjaGVtYVVSSSA9IFNjaGVtYVN0b3JhZ2U6OklOVEVSTkFMX1BST1ZJREVEX1NDSEVNQV9VUkk7CmlmIChMb29zZVR5cGVDaGVjazo6cHJvcGVydHlFeGlzdHMoJHNjaGVtYSwgJ2lkJykpIHsKJHNjaGVtYVVSSSA9IExvb3NlVHlwZUNoZWNrOjpwcm9wZXJ0eUdldCgkc2NoZW1hLCAnaWQnKTsKfQppZiAoTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5RXhpc3RzKCRzY2hlbWEsICckaWQnKSkgewokc2NoZW1hVVJJID0gTG9vc2VUeXBlQ2hlY2s6OnByb3BlcnR5R2V0KCRzY2hlbWEsICckaWQnKTsKfQokdGhpcy0+ZmFjdG9yeS0+Z2V0U2NoZW1hU3RvcmFnZSgpLT5hZGRTY2hlbWEoJHNjaGVtYVVSSSwgJHNjaGVtYSk7CgokdmFsaWRhdG9yID0gJHRoaXMtPmZhY3RvcnktPmNyZWF0ZUluc3RhbmNlRm9yKCdzY2hlbWEnKTsKJHNjaGVtYSA9ICR0aGlzLT5mYWN0b3J5LT5nZXRTY2hlbWFTdG9yYWdlKCktPmdldFNjaGVtYSgkc2NoZW1hVVJJKTsKCgppZiAoaXNfYm9vbCgkc2NoZW1hKSkgewppZiAoJHNjaGVtYSA9PT0gZmFsc2UpIHsKJHRoaXMtPmFkZEVycm9yKENvbnN0cmFpbnRFcnJvcjo6RkFMU0UoKSk7Cn0KCnJldHVybiAkdGhpcy0+Z2V0RXJyb3JNYXNrKCk7Cn0KCmlmICgkdGhpcy0+ZmFjdG9yeS0+Z2V0Q29uZmlnKENvbnN0cmFpbnQ6OkNIRUNLX01PREVfU1RSSUNUKSkgewokZGlhbGVjdCA9ICR0aGlzLT5mYWN0b3J5LT5nZXREZWZhdWx0RGlhbGVjdCgpOwppZiAocHJvcGVydHlfZXhpc3RzKCRzY2hlbWEsICckc2NoZW1hJykpIHsKJGRpYWxlY3QgPSAkc2NoZW1hLT57JyRzY2hlbWEnfTsKfQoKJHZhbGlkYXRvciA9ICR0aGlzLT5mYWN0b3J5LT5jcmVhdGVJbnN0YW5jZUZvcigKRHJhZnRJZGVudGlmaWVyczo6YnlWYWx1ZSgkZGlhbGVjdCktPnRvQ29uc3RyYWludE5hbWUoKQopOwp9CgokdmFsaWRhdG9yLT5jaGVjaygkdmFsdWUsICRzY2hlbWEpOwoKJHRoaXMtPmZhY3RvcnktPnNldENvbmZpZygkaW5pdGlhbENoZWNrTW9kZSk7CgokdGhpcy0+YWRkRXJyb3JzKGFycmF5X3VuaXF1ZSgkdmFsaWRhdG9yLT5nZXRFcnJvcnMoKSwgU09SVF9SRUdVTEFSKSk7CgpyZXR1cm4gJHZhbGlkYXRvci0+Z2V0RXJyb3JNYXNrKCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hlY2soJHZhbHVlLCAkc2NoZW1hKTogaW50CnsKcmV0dXJuICR0aGlzLT52YWxpZGF0ZSgkdmFsdWUsICRzY2hlbWEpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvZXJjZSgmJHZhbHVlLCAkc2NoZW1hKTogaW50CnsKcmV0dXJuICR0aGlzLT52YWxpZGF0ZSgkdmFsdWUsICRzY2hlbWEsIENvbnN0cmFpbnQ6OkNIRUNLX01PREVfQ09FUkNFX1RZUEVTKTsKfQp9CkNvcHlyaWdodCAoYykgMjAyMCwgTWFyYyBCZW5uZXdpdHoKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCmFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgIAogICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KICAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAgICAKICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgb3JnYW5pc2F0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKICAgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECkFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECldBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQpGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTApEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUgpTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgpDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLApPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQpPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgTWFiZUVudW07Cgp1c2UgUmVmbGVjdGlvbkNsYXNzOwp1c2UgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgTG9naWNFeGNlcHRpb247CgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBFbnVtIGltcGxlbWVudHMgXFN0cmluZ2FibGUKewoKCgoKCnByaXZhdGUgJHZhbHVlOwoKCgoKCgpwcml2YXRlICRvcmRpbmFsOwoKCgoKCgpwcml2YXRlIHN0YXRpYyAkY29uc3RhbnRzID0gW107CgoKCgoKCnByaXZhdGUgc3RhdGljICRuYW1lcyA9IFtdOwoKCgoKCgpwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2VzID0gW107CgoKCgoKCgpmaW5hbCBwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2YWx1ZSwgJG9yZGluYWwgPSBudWxsKQp7CiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKJHRoaXMtPm9yZGluYWwgPSAkb3JkaW5hbDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXROYW1lKCk7Cn0KCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdFbnVtcyBhcmUgbm90IGNsb25lYWJsZScpOwp9CgoKCgoKCmZpbmFsIHB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCkKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1NlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIHRoaXMgcHNldWRvLWVudW0gaW1wbGVtZW50YXRpb24nKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19zZXJpYWxpemUoKTogYXJyYXkKewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1NlcmlhbGl6YXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSBkZWZhdWx0IGluIHRoaXMgcHNldWRvLWVudW0gaW1wbGVtZW50YXRpb24nKTsKfQoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignU2VyaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHQgaW4gdGhpcyBwc2V1ZG8tZW51bSBpbXBsZW1lbnRhdGlvbicpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3Vuc2VyaWFsaXplKGFycmF5ICRkYXRhKTogdm9pZAp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignU2VyaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IGRlZmF1bHQgaW4gdGhpcyBwc2V1ZG8tZW51bSBpbXBsZW1lbnRhdGlvbicpOwp9CgoKCgoKCmZpbmFsIHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpCnsKcmV0dXJuICR0aGlzLT52YWx1ZTsKfQoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuIHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXVskdGhpcy0+b3JkaW5hbCA/PyAkdGhpcy0+Z2V0T3JkaW5hbCgpXTsKfQoKCgoKCgpmaW5hbCBwdWJsaWMgZnVuY3Rpb24gZ2V0T3JkaW5hbCgpCnsKaWYgKCR0aGlzLT5vcmRpbmFsID09PSBudWxsKSB7CiRvcmRpbmFsID0gMDsKJHZhbHVlID0gJHRoaXMtPnZhbHVlOwokY29uc3RhbnRzID0gc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXSA/PyBzdGF0aWM6OmdldENvbnN0YW50cygpOwpmb3JlYWNoICgkY29uc3RhbnRzIGFzICRjb25zdFZhbHVlKSB7CmlmICgkdmFsdWUgPT09ICRjb25zdFZhbHVlKSB7CmJyZWFrOwp9CisrJG9yZGluYWw7Cn0KCiR0aGlzLT5vcmRpbmFsID0gJG9yZGluYWw7Cn0KCnJldHVybiAkdGhpcy0+b3JkaW5hbDsKfQoKCgoKCgoKZmluYWwgcHVibGljIGZ1bmN0aW9uIGlzKCRlbnVtZXJhdG9yKQp7CnJldHVybiAkdGhpcyA9PT0gJGVudW1lcmF0b3IgfHwgJHRoaXMtPnZhbHVlID09PSAkZW51bWVyYXRvcgoKCnx8ICgkZW51bWVyYXRvciBpbnN0YW5jZW9mIHN0YXRpYwomJiBcZ2V0X2NsYXNzKCRlbnVtZXJhdG9yKSA9PT0gc3RhdGljOjpjbGFzcwomJiAkZW51bWVyYXRvci0+dmFsdWUgPT09ICR0aGlzLT52YWx1ZQopOwp9CgoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXQoJGVudW1lcmF0b3IpCnsKaWYgKCRlbnVtZXJhdG9yIGluc3RhbmNlb2Ygc3RhdGljKSB7CmlmIChcZ2V0X2NsYXNzKCRlbnVtZXJhdG9yKSAhPT0gc3RhdGljOjpjbGFzcykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoCidJbnZhbGlkIHZhbHVlIG9mIHR5cGUgJXMgZm9yIGVudW1lcmF0aW9uICVzJywKXGdldF9jbGFzcygkZW51bWVyYXRvciksCnN0YXRpYzo6Y2xhc3MKKSk7Cn0KCnJldHVybiAkZW51bWVyYXRvcjsKfQoKcmV0dXJuIHN0YXRpYzo6YnlWYWx1ZSgkZW51bWVyYXRvcik7Cn0KCgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGJ5VmFsdWUoJHZhbHVlKQp7CgoKJGNvbnN0YW50cyA9IHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPz8gc3RhdGljOjpnZXRDb25zdGFudHMoKTsKCiRuYW1lID0gXGFycmF5X3NlYXJjaCgkdmFsdWUsICRjb25zdGFudHMsIHRydWUpOwppZiAoJG5hbWUgPT09IGZhbHNlKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigKJ1Vua25vd24gdmFsdWUgJXMgZm9yIGVudW1lcmF0aW9uICVzJywKXGlzX3NjYWxhcigkdmFsdWUpCj8gXHZhcl9leHBvcnQoJHZhbHVlLCB0cnVlKQo6ICdvZiB0eXBlICcgLiAoXGlzX29iamVjdCgkdmFsdWUpID8gXGdldF9jbGFzcygkdmFsdWUpIDogXGdldHR5cGUoJHZhbHVlKSksCnN0YXRpYzo6Y2xhc3MKKSk7Cn0KCgokaW5zdGFuY2UgPSBzZWxmOjokaW5zdGFuY2VzW3N0YXRpYzo6Y2xhc3NdWyRuYW1lXQo/PyBzZWxmOjokaW5zdGFuY2VzW3N0YXRpYzo6Y2xhc3NdWyRuYW1lXSA9IG5ldyBzdGF0aWMoJGNvbnN0YW50c1skbmFtZV0pOwoKcmV0dXJuICRpbnN0YW5jZTsKfQoKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYnlOYW1lKHN0cmluZyAkbmFtZSkKewppZiAoaXNzZXQoc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0pKSB7CgokaW5zdGFuY2UgPSBzZWxmOjokaW5zdGFuY2VzW3N0YXRpYzo6Y2xhc3NdWyRuYW1lXTsKcmV0dXJuICRpbnN0YW5jZTsKfQoKJGNvbnN0ID0gc3RhdGljOjpjbGFzcyAuICI6OnskbmFtZX0iOwppZiAoIVxkZWZpbmVkKCRjb25zdCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigieyRjb25zdH0gbm90IGRlZmluZWQiKTsKfQoKYXNzZXJ0KApzZWxmOjpub0FtYmlndW91c1ZhbHVlcyhzdGF0aWM6OmdldENvbnN0YW50cygpKSwKJ0FtYmlndW91cyBlbnVtZXJhdG9yIHZhbHVlcyBkZXRlY3RlZCBmb3IgJyAuIHN0YXRpYzo6Y2xhc3MKKTsKCgokdmFsdWUgPSBcY29uc3RhbnQoJGNvbnN0KTsKcmV0dXJuIHNlbGY6OiRpbnN0YW5jZXNbc3RhdGljOjpjbGFzc11bJG5hbWVdID0gbmV3IHN0YXRpYygkdmFsdWUpOwp9CgoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBieU9yZGluYWwoaW50ICRvcmRpbmFsKQp7CiRjb25zdGFudHMgPSBzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCk7CgppZiAoIWlzc2V0KHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXVskb3JkaW5hbF0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oXHNwcmludGYoCidJbnZhbGlkIG9yZGluYWwgbnVtYmVyICVzLCBtdXN0IGJldHdlZW4gMCBhbmQgJXMnLAokb3JkaW5hbCwKXGNvdW50KHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSkgLSAxCikpOwp9CgokbmFtZSA9IHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXVskb3JkaW5hbF07CgoKJGluc3RhbmNlID0gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0KPz8gc2VsZjo6JGluc3RhbmNlc1tzdGF0aWM6OmNsYXNzXVskbmFtZV0gPSBuZXcgc3RhdGljKCRjb25zdGFudHNbJG5hbWVdLCAkb3JkaW5hbCk7CgpyZXR1cm4gJGluc3RhbmNlOwp9CgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEVudW1lcmF0b3JzKCkKewppZiAoIWlzc2V0KHNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSkpIHsKc3RhdGljOjpnZXRDb25zdGFudHMoKTsKfQoKCiRieU5hbWVGbiA9IFtzdGF0aWM6OmNsYXNzLCAnYnlOYW1lJ107CnJldHVybiBcYXJyYXlfbWFwKCRieU5hbWVGbiwgc2VsZjo6JG5hbWVzW3N0YXRpYzo6Y2xhc3NdKTsKfQoKCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRWYWx1ZXMoKQp7CnJldHVybiBcYXJyYXlfdmFsdWVzKHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPz8gc3RhdGljOjpnZXRDb25zdGFudHMoKSk7Cn0KCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0TmFtZXMoKQp7CmlmICghaXNzZXQoc2VsZjo6JG5hbWVzW3N0YXRpYzo6Y2xhc3NdKSkgewpzdGF0aWM6OmdldENvbnN0YW50cygpOwp9CnJldHVybiBzZWxmOjokbmFtZXNbc3RhdGljOjpjbGFzc107Cn0KCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0T3JkaW5hbHMoKQp7CiRjb3VudCA9IFxjb3VudChzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdID8/IHN0YXRpYzo6Z2V0Q29uc3RhbnRzKCkpOwpyZXR1cm4gJGNvdW50ID8gXHJhbmdlKDAsICRjb3VudCAtIDEpIDogW107Cn0KCgoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldENvbnN0YW50cygpCnsKaWYgKGlzc2V0KHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10pKSB7CnJldHVybiBzZWxmOjokY29uc3RhbnRzW3N0YXRpYzo6Y2xhc3NdOwp9CgokcmVmbGVjdGlvbiA9IG5ldyBSZWZsZWN0aW9uQ2xhc3Moc3RhdGljOjpjbGFzcyk7CiRjb25zdGFudHMgPSBbXTsKCmRvIHsKJHNjb3BlQ29uc3RhbnRzID0gW107Cgpmb3JlYWNoICgkcmVmbGVjdGlvbi0+Z2V0UmVmbGVjdGlvbkNvbnN0YW50cygpIGFzICRyZWZsQ29uc3RhbnQpIHsKaWYgKCRyZWZsQ29uc3RhbnQtPmlzUHVibGljKCkpIHsKJHNjb3BlQ29uc3RhbnRzWyAkcmVmbENvbnN0YW50LT5nZXROYW1lKCkgXSA9ICRyZWZsQ29uc3RhbnQtPmdldFZhbHVlKCk7Cn0KfQoKJGNvbnN0YW50cyA9ICRzY29wZUNvbnN0YW50cyArICRjb25zdGFudHM7Cn0gd2hpbGUgKCgkcmVmbGVjdGlvbiA9ICRyZWZsZWN0aW9uLT5nZXRQYXJlbnRDbGFzcygpKSAmJiAkcmVmbGVjdGlvbi0+bmFtZSAhPT0gX19DTEFTU19fKTsKCgoKYXNzZXJ0KApzZWxmOjpub0FtYmlndW91c1ZhbHVlcygkY29uc3RhbnRzKSwKJ0FtYmlndW91cyBlbnVtZXJhdG9yIHZhbHVlcyBkZXRlY3RlZCBmb3IgJyAuIHN0YXRpYzo6Y2xhc3MKKTsKCnNlbGY6OiRuYW1lc1tzdGF0aWM6OmNsYXNzXSA9IFxhcnJheV9rZXlzKCRjb25zdGFudHMpOwpyZXR1cm4gc2VsZjo6JGNvbnN0YW50c1tzdGF0aWM6OmNsYXNzXSA9ICRjb25zdGFudHM7Cn0KCgoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gbm9BbWJpZ3VvdXNWYWx1ZXMoJGNvbnN0YW50cykKewpmb3JlYWNoICgkY29uc3RhbnRzIGFzICR2YWx1ZSkgewokbmFtZXMgPSBcYXJyYXlfa2V5cygkY29uc3RhbnRzLCAkdmFsdWUsIHRydWUpOwppZiAoXGNvdW50KCRuYW1lcykgPiAxKSB7CnJldHVybiBmYWxzZTsKfQp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKCgoKCgpmaW5hbCBwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhcygkZW51bWVyYXRvcikKewppZiAoJGVudW1lcmF0b3IgaW5zdGFuY2VvZiBzdGF0aWMpIHsKcmV0dXJuIFxnZXRfY2xhc3MoJGVudW1lcmF0b3IpID09PSBzdGF0aWM6OmNsYXNzOwp9CgpyZXR1cm4gc3RhdGljOjpoYXNWYWx1ZSgkZW51bWVyYXRvcik7Cn0KCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNWYWx1ZSgkdmFsdWUpCnsKcmV0dXJuIFxpbl9hcnJheSgkdmFsdWUsIHNlbGY6OiRjb25zdGFudHNbc3RhdGljOjpjbGFzc10gPz8gc3RhdGljOjpnZXRDb25zdGFudHMoKSwgdHJ1ZSk7Cn0KCgoKCgoKCgoKZmluYWwgcHVibGljIHN0YXRpYyBmdW5jdGlvbiBoYXNOYW1lKHN0cmluZyAkbmFtZSkKewpyZXR1cm4gXGRlZmluZWQoInN0YXRpYzo6eyRuYW1lfSIpOwp9CgoKCgoKCgoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gX19jYWxsU3RhdGljKHN0cmluZyAkbWV0aG9kLCBhcnJheSAkYXJncykKewpyZXR1cm4gc3RhdGljOjpieU5hbWUoJG1ldGhvZCk7Cn0KfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgTWFiZUVudW07Cgp1c2UgQXJyYXlBY2Nlc3M7CnVzZSBDb3VudGFibGU7CnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBJdGVyYXRvcjsKdXNlIEl0ZXJhdG9yQWdncmVnYXRlOwp1c2UgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgpjbGFzcyBFbnVtTWFwIGltcGxlbWVudHMgQXJyYXlBY2Nlc3MsIENvdW50YWJsZSwgSXRlcmF0b3JBZ2dyZWdhdGUKewoKCgoKcHJpdmF0ZSAkZW51bWVyYXRpb247CgoKCgoKcHJpdmF0ZSAkbWFwID0gW107CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRlbnVtZXJhdGlvbiwgP2l0ZXJhYmxlICRtYXAgPSBudWxsKQp7CmlmICghXGlzX3N1YmNsYXNzX29mKCRlbnVtZXJhdGlvbiwgRW51bTo6Y2xhc3MpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oXHNwcmludGYoCiclcyBjYW4gaGFuZGxlIHN1YmNsYXNzZXMgb2YgJXMgb25seScsCl9fQ0xBU1NfXywKRW51bTo6Y2xhc3MKKSk7Cn0KJHRoaXMtPmVudW1lcmF0aW9uID0gJGVudW1lcmF0aW9uOwoKaWYgKCRtYXApIHsKJHRoaXMtPmFkZEl0ZXJhYmxlKCRtYXApOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fZGVidWdJbmZvKCk6IGFycmF5IHsKJGRiZyA9IChhcnJheSkkdGhpczsKJGRiZ1siXDAiIC4gc2VsZjo6Y2xhc3MgLiAiXDBfX3BhaXJzIl0gPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRrLCAkdikgewpyZXR1cm4gWyRrLCAkdl07Cn0sICR0aGlzLT5nZXRLZXlzKCksICR0aGlzLT5nZXRWYWx1ZXMoKSk7CnJldHVybiAkZGJnOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKCRlbnVtZXJhdG9yLCAkdmFsdWUpOiB2b2lkCnsKJG9yZCA9ICgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCk7CiR0aGlzLT5tYXBbJG9yZF0gPSAkdmFsdWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEl0ZXJhYmxlKGl0ZXJhYmxlICRtYXApOiB2b2lkCnsKJGlubmVyTWFwID0gJHRoaXMtPm1hcDsKZm9yZWFjaCAoJG1hcCBhcyAkZW51bWVyYXRvciA9PiAkdmFsdWUpIHsKJG9yZCA9ICgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCk7CiRpbm5lck1hcFskb3JkXSA9ICR2YWx1ZTsKfQokdGhpcy0+bWFwID0gJGlubmVyTWFwOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCRlbnVtZXJhdG9yKTogdm9pZAp7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwp1bnNldCgkdGhpcy0+bWFwWyRvcmRdKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlSXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogdm9pZAp7CiRtYXAgPSAkdGhpcy0+bWFwOwpmb3JlYWNoICgkZW51bWVyYXRvcnMgYXMgJGVudW1lcmF0b3IpIHsKJG9yZCA9ICgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCk7CnVuc2V0KCRtYXBbJG9yZF0pOwp9CgokdGhpcy0+bWFwID0gJG1hcDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGgoJGVudW1lcmF0b3IsICR2YWx1ZSk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5hZGQoJGVudW1lcmF0b3IsICR2YWx1ZSk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoSXRlcmFibGUoaXRlcmFibGUgJG1hcCk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5hZGRJdGVyYWJsZSgkbWFwKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhvdXQoJGVudW1lcmF0b3IpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+cmVtb3ZlKCRlbnVtZXJhdG9yKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhvdXRJdGVyYWJsZShpdGVyYWJsZSAkZW51bWVyYXRvcnMpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+cmVtb3ZlSXRlcmFibGUoJGVudW1lcmF0b3JzKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVudW1lcmF0aW9uKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb247Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldCgkZW51bWVyYXRvcikKewokZW51bWVyYXRvciA9ICgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpOwokb3JkID0gJGVudW1lcmF0b3ItPmdldE9yZGluYWwoKTsKaWYgKCFcYXJyYXlfa2V5X2V4aXN0cygkb3JkLCAkdGhpcy0+bWFwKSkgewp0aHJvdyBuZXcgVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKHNwcmludGYoCidFbnVtZXJhdG9yICVzIGNvdWxkIG5vdCBiZSBmb3VuZCcsClx2YXJfZXhwb3J0KCRlbnVtZXJhdG9yLT5nZXRWYWx1ZSgpLCB0cnVlKQopKTsKfQoKcmV0dXJuICR0aGlzLT5tYXBbJG9yZF07Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0S2V5cygpOiBhcnJheQp7CgokYnlPcmRpbmFsRm4gPSBbJHRoaXMtPmVudW1lcmF0aW9uLCAnYnlPcmRpbmFsJ107CgpyZXR1cm4gXGFycmF5X21hcCgkYnlPcmRpbmFsRm4sIFxhcnJheV9rZXlzKCR0aGlzLT5tYXApKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZXMoKTogYXJyYXkKewpyZXR1cm4gXGFycmF5X3ZhbHVlcygkdGhpcy0+bWFwKTsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNlYXJjaCgkdmFsdWUsIGJvb2wgJHN0cmljdCA9IGZhbHNlKQp7Cgokb3JkID0gXGFycmF5X3NlYXJjaCgkdmFsdWUsICR0aGlzLT5tYXAsICRzdHJpY3QpOwppZiAoJG9yZCAhPT0gZmFsc2UpIHsKcmV0dXJuICgkdGhpcy0+ZW51bWVyYXRpb24pOjpieU9yZGluYWwoJG9yZCk7Cn0KCnJldHVybiBudWxsOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKCRlbnVtZXJhdG9yKTogYm9vbAp7CnRyeSB7CiRvcmQgPSAoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpOwpyZXR1cm4gXGFycmF5X2tleV9leGlzdHMoJG9yZCwgJHRoaXMtPm1hcCk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiAkZSkgewoKcmV0dXJuIGZhbHNlOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zKCRlbnVtZXJhdG9yKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aGFzKCRlbnVtZXJhdG9yKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0RXhpc3RzKCRlbnVtZXJhdG9yKTogYm9vbAp7CnRyeSB7CnJldHVybiBpc3NldCgkdGhpcy0+bWFwWygkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCldKTsKfSBjYXRjaCAoSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uICRlKSB7CgpyZXR1cm4gZmFsc2U7Cn0KfQoKCgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gb2Zmc2V0R2V0KCRlbnVtZXJhdG9yKQp7CnRyeSB7CnJldHVybiAkdGhpcy0+Z2V0KCRlbnVtZXJhdG9yKTsKfSBjYXRjaCAoVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uICRlKSB7CnJldHVybiBudWxsOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG9mZnNldFNldCgkZW51bWVyYXRvciwgJHZhbHVlID0gbnVsbCk6IHZvaWQKewokdGhpcy0+YWRkKCRlbnVtZXJhdG9yLCAkdmFsdWUpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG9mZnNldFVuc2V0KCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT5yZW1vdmUoJGVudW1lcmF0b3IpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IEl0ZXJhdG9yCnsKJG1hcCA9ICR0aGlzLT5tYXA7CmZvcmVhY2ggKCRtYXAgYXMgJG9yZGluYWwgPT4gJHZhbHVlKSB7CnlpZWxkICgkdGhpcy0+ZW51bWVyYXRpb24pOjpieU9yZGluYWwoJG9yZGluYWwpID0+ICR2YWx1ZTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvdW50KCk6IGludAp7CnJldHVybiBcY291bnQoJHRoaXMtPm1hcCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiBlbXB0eSgkdGhpcy0+bWFwKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBNYWJlRW51bTsKCnVzZSBSdW50aW1lRXhjZXB0aW9uOwp1c2UgTG9naWNFeGNlcHRpb247CgoKCgoKCgoKCgoKCgoKdHJhaXQgRW51bVNlcmlhbGl6YWJsZVRyYWl0CnsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fc2VyaWFsaXplKCk6IGFycmF5CnsKcmV0dXJuIFsndmFsdWUnID0+ICR0aGlzLT5nZXRWYWx1ZSgpXTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3Vuc2VyaWFsaXplKGFycmF5ICRkYXRhKTogdm9pZAp7CmlmICghXGFycmF5X2tleV9leGlzdHMoJ3ZhbHVlJywgJGRhdGEpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNaXNzaW5nIGFycmF5IGtleSAidmFsdWUiJyk7Cn0KCgokdmFsdWUgPSAkZGF0YVsndmFsdWUnXTsKJGNvbnN0YW50cyA9IHNlbGY6OmdldENvbnN0YW50cygpOwokbmFtZSA9IFxhcnJheV9zZWFyY2goJHZhbHVlLCAkY29uc3RhbnRzLCB0cnVlKTsKaWYgKCRuYW1lID09PSBmYWxzZSkgewokbWVzc2FnZSA9IFxpc19zY2FsYXIoJHZhbHVlKQo/ICdVbmtub3duIHZhbHVlICcgLiBcdmFyX2V4cG9ydCgkdmFsdWUsIHRydWUpCjogJ0ludmFsaWQgdmFsdWUgb2YgdHlwZSAnIC4gKFxpc19vYmplY3QoJHZhbHVlKSA/IFxnZXRfY2xhc3MoJHZhbHVlKSA6IFxnZXR0eXBlKCR2YWx1ZSkpOwp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigkbWVzc2FnZSk7Cn0KCiRjbGFzcyA9IHN0YXRpYzo6Y2xhc3M7CiRlbnVtZXJhdG9yID0gJHRoaXM7CiRjbG9zdXJlID0gZnVuY3Rpb24gKCkgdXNlICgkY2xhc3MsICRuYW1lLCAkdmFsdWUsICRlbnVtZXJhdG9yKSB7CmlmICgkdmFsdWUgIT09IG51bGwgJiYgJHRoaXMtPnZhbHVlICE9PSBudWxsKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseSAtIHBsZWFzZSB1c2UgdW5zZXJpYWxpemUoJGVudW0pIGluc3RlYWQnKTsKfQoKJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoKaWYgKCFpc3NldChzZWxmOjokaW5zdGFuY2VzWyRjbGFzc11bJG5hbWVdKSkgewpzZWxmOjokaW5zdGFuY2VzWyRjbGFzc11bJG5hbWVdID0gJGVudW1lcmF0b3I7Cn0KfTsKJGNsb3N1cmUtPmJpbmRUbygkdGhpcywgRW51bTo6Y2xhc3MpKCk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VyaWFsaXplKCk6IHN0cmluZwp7CnJldHVybiBcc2VyaWFsaXplKCR0aGlzLT5nZXRWYWx1ZSgpKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHVuc2VyaWFsaXplKCRzZXJpYWxpemVkKTogdm9pZAp7CiR0aGlzLT5fX3Vuc2VyaWFsaXplKFsndmFsdWUnID0+IFx1bnNlcmlhbGl6ZSgkc2VyaWFsaXplZCldKTsKfQp9Cjw/cGhwCgpkZWNsYXJlKHN0cmljdF90eXBlcz0xKTsKCm5hbWVzcGFjZSBNYWJlRW51bTsKCnVzZSBDb3VudGFibGU7CnVzZSBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBJdGVyYXRvcjsKdXNlIEl0ZXJhdG9yQWdncmVnYXRlOwoKCgoKCgoKCgoKCgpjbGFzcyBFbnVtU2V0IGltcGxlbWVudHMgSXRlcmF0b3JBZ2dyZWdhdGUsIENvdW50YWJsZQp7CgoKCgpwcml2YXRlICRlbnVtZXJhdGlvbjsKCgoKCgpwcml2YXRlICRlbnVtZXJhdGlvbkNvdW50OwoKCgoKCnByaXZhdGUgJGJpdHNldCA9IDA7CgoKCgoKCnByaXZhdGUgJGVtcHR5Qml0c2V0ID0gMDsKCgoKCgoKCgoKcHJpdmF0ZSAkZm5Eb0dldEl0ZXJhdG9yID0gJ2RvR2V0SXRlcmF0b3JJbnQnOwoKCnByaXZhdGUgJGZuRG9Db3VudCA9ICdkb0NvdW50SW50JzsKCgpwcml2YXRlICRmbkRvR2V0T3JkaW5hbHMgPSAnZG9HZXRPcmRpbmFsc0ludCc7CgoKcHJpdmF0ZSAkZm5Eb0dldEJpdCA9ICdkb0dldEJpdEludCc7CgoKcHJpdmF0ZSAkZm5Eb1NldEJpdCA9ICdkb1NldEJpdEludCc7CgoKcHJpdmF0ZSAkZm5Eb1Vuc2V0Qml0ID0gJ2RvVW5zZXRCaXRJbnQnOwoKCnByaXZhdGUgJGZuRG9HZXRCaW5hcnlCaXRzZXRMZSA9ICdkb0dldEJpbmFyeUJpdHNldExlSW50JzsKCgpwcml2YXRlICRmbkRvU2V0QmluYXJ5Qml0c2V0TGUgPSAnZG9TZXRCaW5hcnlCaXRzZXRMZUludCc7CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJGVudW1lcmF0aW9uLCA/aXRlcmFibGUgJGVudW1lcmF0b3JzID0gbnVsbCkKewppZiAoIVxpc19zdWJjbGFzc19vZigkZW51bWVyYXRpb24sIEVudW06OmNsYXNzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonJXMgY2FuIGhhbmRsZSBzdWJjbGFzc2VzIG9mICVzIG9ubHknLApfX01FVEhPRF9fLApFbnVtOjpjbGFzcwopKTsKfQoKJHRoaXMtPmVudW1lcmF0aW9uID0gJGVudW1lcmF0aW9uOwokdGhpcy0+ZW51bWVyYXRpb25Db3VudCA9IFxjb3VudCgkZW51bWVyYXRpb246OmdldENvbnN0YW50cygpKTsKCgoKCmlmICgkdGhpcy0+ZW51bWVyYXRpb25Db3VudCA+IFxQSFBfSU5UX1NJWkUgKiA4KSB7CgokdGhpcy0+Yml0c2V0ID0gJHRoaXMtPmVtcHR5Qml0c2V0ID0gXHN0cl9yZXBlYXQoIlwwIiwgKGludClcY2VpbCgkdGhpcy0+ZW51bWVyYXRpb25Db3VudCAvIDgpKTsKCgokdGhpcy0+Zm5Eb0dldEl0ZXJhdG9yID0gJ2RvR2V0SXRlcmF0b3JCaW4nOwokdGhpcy0+Zm5Eb0NvdW50ID0gJ2RvQ291bnRCaW4nOwokdGhpcy0+Zm5Eb0dldE9yZGluYWxzID0gJ2RvR2V0T3JkaW5hbHNCaW4nOwokdGhpcy0+Zm5Eb0dldEJpdCA9ICdkb0dldEJpdEJpbic7CiR0aGlzLT5mbkRvU2V0Qml0ID0gJ2RvU2V0Qml0QmluJzsKJHRoaXMtPmZuRG9VbnNldEJpdCA9ICdkb1Vuc2V0Qml0QmluJzsKJHRoaXMtPmZuRG9HZXRCaW5hcnlCaXRzZXRMZSA9ICdkb0dldEJpbmFyeUJpdHNldExlQmluJzsKJHRoaXMtPmZuRG9TZXRCaW5hcnlCaXRzZXRMZSA9ICdkb1NldEJpbmFyeUJpdHNldExlQmluJzsKfQoKaWYgKCRlbnVtZXJhdG9ycyAhPT0gbnVsbCkgewpmb3JlYWNoICgkZW51bWVyYXRvcnMgYXMgJGVudW1lcmF0b3IpIHsKJHRoaXMtPnskdGhpcy0+Zm5Eb1NldEJpdH0oJGVudW1lcmF0aW9uOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9Cn0KfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fZGVidWdJbmZvKCkgewokZGJnID0gKGFycmF5KSR0aGlzOwokZGJnWyJcMCIgLiBzZWxmOjpjbGFzcyAuICJcMF9fZW51bWVyYXRvcnMiXSA9ICR0aGlzLT5nZXRWYWx1ZXMoKTsKcmV0dXJuICRkYmc7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RW51bWVyYXRpb24oKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5lbnVtZXJhdGlvbjsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkKCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkSXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogdm9pZAp7CiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKdHJ5IHsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKCiR0aGlzLT5iaXRzZXQgPSAkYml0c2V0Owp0aHJvdyAkZTsKfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVtb3ZlKCRlbnVtZXJhdG9yKTogdm9pZAp7CiR0aGlzLT57JHRoaXMtPmZuRG9VbnNldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhdHRhY2goJGVudW1lcmF0b3IpOiB2b2lkCnsKJHRoaXMtPmFkZCgkZW51bWVyYXRvcik7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZXRhY2goJGVudW1lcmF0b3IpOiB2b2lkCnsKJHRoaXMtPnJlbW92ZSgkZW51bWVyYXRvcik7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZW1vdmVJdGVyYWJsZShpdGVyYWJsZSAkZW51bWVyYXRvcnMpOiB2b2lkCnsKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7Cgp0cnkgewpmb3JlYWNoICgkZW51bWVyYXRvcnMgYXMgJGVudW1lcmF0b3IpIHsKJHRoaXMtPnskdGhpcy0+Zm5Eb1Vuc2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7CgokdGhpcy0+Yml0c2V0ID0gJGJpdHNldDsKdGhyb3cgJGU7Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRVbmlvbihFbnVtU2V0ICRvdGhlcik6IHZvaWQKewppZiAoJHRoaXMtPmVudW1lcmF0aW9uICE9PSAkb3RoZXItPmVudW1lcmF0aW9uKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oXHNwcmludGYoCidPdGhlciBzaG91bGQgYmUgb2YgdGhlIHNhbWUgZW51bWVyYXRpb24gYXMgdGhpcyAlcycsCiR0aGlzLT5lbnVtZXJhdGlvbgopKTsKfQoKJHRoaXMtPmJpdHNldCA9ICR0aGlzLT5iaXRzZXQgfCAkb3RoZXItPmJpdHNldDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnRlcnNlY3QoRW51bVNldCAkb3RoZXIpOiB2b2lkCnsKaWYgKCR0aGlzLT5lbnVtZXJhdGlvbiAhPT0gJG90aGVyLT5lbnVtZXJhdGlvbikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKFxzcHJpbnRmKAonT3RoZXIgc2hvdWxkIGJlIG9mIHRoZSBzYW1lIGVudW1lcmF0aW9uIGFzIHRoaXMgJXMnLAokdGhpcy0+ZW51bWVyYXRpb24KKSk7Cn0KCiR0aGlzLT5iaXRzZXQgPSAkdGhpcy0+Yml0c2V0ICYgJG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGlmZihFbnVtU2V0ICRvdGhlcik6IHZvaWQKewppZiAoJHRoaXMtPmVudW1lcmF0aW9uICE9PSAkb3RoZXItPmVudW1lcmF0aW9uKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oXHNwcmludGYoCidPdGhlciBzaG91bGQgYmUgb2YgdGhlIHNhbWUgZW51bWVyYXRpb24gYXMgdGhpcyAlcycsCiR0aGlzLT5lbnVtZXJhdGlvbgopKTsKfQoKJHRoaXMtPmJpdHNldCA9ICR0aGlzLT5iaXRzZXQgJiB+JG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3ltRGlmZihFbnVtU2V0ICRvdGhlcik6IHZvaWQKewppZiAoJHRoaXMtPmVudW1lcmF0aW9uICE9PSAkb3RoZXItPmVudW1lcmF0aW9uKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oXHNwcmludGYoCidPdGhlciBzaG91bGQgYmUgb2YgdGhlIHNhbWUgZW51bWVyYXRpb24gYXMgdGhpcyAlcycsCiR0aGlzLT5lbnVtZXJhdGlvbgopKTsKfQoKJHRoaXMtPmJpdHNldCA9ICR0aGlzLT5iaXRzZXQgXiAkb3RoZXItPmJpdHNldDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJpbmFyeUJpdHNldExlKHN0cmluZyAkYml0c2V0KTogdm9pZAp7CiR0aGlzLT57JHRoaXMtPmZuRG9TZXRCaW5hcnlCaXRzZXRMZX0oJGJpdHNldCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRCaW5hcnlCaXRzZXRMZUJpbigkYml0c2V0KTogdm9pZAp7CgokdGhpc0JpdHNldCA9ICR0aGlzLT5iaXRzZXQ7Cgokc2l6ZSA9IFxzdHJsZW4oJHRoaXNCaXRzZXQpOwokc2l6ZUluID0gXHN0cmxlbigkYml0c2V0KTsKCmlmICgkc2l6ZUluIDwgJHNpemUpIHsKCiRiaXRzZXQgLj0gXHN0cl9yZXBlYXQoIlwwIiwgJHNpemUgLSAkc2l6ZUluKTsKfSBlbHNlaWYgKCRzaXplSW4gPiAkc2l6ZSkgewppZiAoXGx0cmltKFxzdWJzdHIoJGJpdHNldCwgJHNpemUpLCAiXDAiKSAhPT0gJycpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignb3V0LW9mLXJhbmdlIGJpdHMgZGV0ZWN0ZWQnKTsKfQokYml0c2V0ID0gXHN1YnN0cigkYml0c2V0LCAwLCAkc2l6ZSk7Cn0KCgokbGFzdEJ5dGVNYXhPcmQgPSAkdGhpcy0+ZW51bWVyYXRpb25Db3VudCAlIDg7CmlmICgkbGFzdEJ5dGVNYXhPcmQgIT09IDApIHsKJGxhc3RCeXRlID0gJGJpdHNldFstMV07CiRsYXN0Qnl0ZUV4cGVjdGVkID0gXGNocigoMSA8PCAkbGFzdEJ5dGVNYXhPcmQpIC0gMSkgJiAkbGFzdEJ5dGU7CmlmICgkbGFzdEJ5dGUgIT09ICRsYXN0Qnl0ZUV4cGVjdGVkKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ291dC1vZi1yYW5nZSBiaXRzIGRldGVjdGVkJyk7Cn0KCiR0aGlzLT5iaXRzZXQgPSBcc3Vic3RyKCRiaXRzZXQsIDAsIC0xKSAuICRsYXN0Qnl0ZUV4cGVjdGVkOwp9CgokdGhpcy0+Yml0c2V0ID0gJGJpdHNldDsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1NldEJpbmFyeUJpdHNldExlSW50KCRiaXRzZXQpOiB2b2lkCnsKJGxlbiA9IFxzdHJsZW4oJGJpdHNldCk7CiRpbnQgPSAwOwpmb3IgKCRpID0gMDsgJGkgPCAkbGVuOyArKyRpKSB7CiRvcmQgPSBcb3JkKCRiaXRzZXRbJGldKTsKCmlmICgkb3JkICYmICRpID4gXFBIUF9JTlRfU0laRSAtIDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignb3V0LW9mLXJhbmdlIGJpdHMgZGV0ZWN0ZWQnKTsKfQoKJGludCB8PSAkb3JkIDw8ICg4ICogJGkpOwp9CgppZiAoJGludCAmICh+MCA8PCAkdGhpcy0+ZW51bWVyYXRpb25Db3VudCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignb3V0LW9mLXJhbmdlIGJpdHMgZGV0ZWN0ZWQnKTsKfQoKJHRoaXMtPmJpdHNldCA9ICRpbnQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmluYXJ5Qml0c2V0QmUoc3RyaW5nICRiaXRzZXQpOiB2b2lkCnsKJHRoaXMtPnskdGhpcy0+Zm5Eb1NldEJpbmFyeUJpdHNldExlfShcc3RycmV2KCRiaXRzZXQpKTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJpdChpbnQgJG9yZGluYWwsIGJvb2wgJGJpdCk6IHZvaWQKewppZiAoJG9yZGluYWwgPCAwIHx8ICRvcmRpbmFsID4gJHRoaXMtPmVudW1lcmF0aW9uQ291bnQpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigiT3JkaW5hbCBudW1iZXIgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIHskdGhpcy0+ZW51bWVyYXRpb25Db3VudH0iKTsKfQoKaWYgKCRiaXQpIHsKJHRoaXMtPnskdGhpcy0+Zm5Eb1NldEJpdH0oJG9yZGluYWwpOwp9IGVsc2UgewokdGhpcy0+eyR0aGlzLT5mbkRvVW5zZXRCaXR9KCRvcmRpbmFsKTsKfQp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1NldEJpdEJpbigkb3JkaW5hbCk6IHZvaWQKewoKJHRoaXNCaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKJGJ5dGUgPSAoaW50KSAoJG9yZGluYWwgLyA4KTsKJHRoaXNCaXRzZXRbJGJ5dGVdID0gJHRoaXNCaXRzZXRbJGJ5dGVdIHwgXGNocigxIDw8ICgkb3JkaW5hbCAlIDgpKTsKCiR0aGlzLT5iaXRzZXQgPSAkdGhpc0JpdHNldDsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9TZXRCaXRJbnQoJG9yZGluYWwpOiB2b2lkCnsKCiR0aGlzQml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCiR0aGlzLT5iaXRzZXQgPSAkdGhpc0JpdHNldCB8ICgxIDw8ICRvcmRpbmFsKTsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9VbnNldEJpdEJpbigkb3JkaW5hbCk6IHZvaWQKewoKJHRoaXNCaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKJGJ5dGUgPSAoaW50KSAoJG9yZGluYWwgLyA4KTsKJHRoaXNCaXRzZXRbJGJ5dGVdID0gJHRoaXNCaXRzZXRbJGJ5dGVdICYgXGNocih+KDEgPDwgKCRvcmRpbmFsICUgOCkpKTsKCiR0aGlzLT5iaXRzZXQgPSAkdGhpc0JpdHNldDsKfQoKCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9VbnNldEJpdEludCgkb3JkaW5hbCk6IHZvaWQKewoKJHRoaXNCaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKJHRoaXMtPmJpdHNldCA9ICR0aGlzQml0c2V0ICYgfigxIDw8ICRvcmRpbmFsKTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aCgkZW51bWVyYXRvcik6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT57JHRoaXMtPmZuRG9TZXRCaXR9KCgkdGhpcy0+ZW51bWVyYXRpb24pOjpnZXQoJGVudW1lcmF0b3IpLT5nZXRPcmRpbmFsKCkpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aEl0ZXJhYmxlKGl0ZXJhYmxlICRlbnVtZXJhdG9ycyk6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKZm9yZWFjaCAoJGVudW1lcmF0b3JzIGFzICRlbnVtZXJhdG9yKSB7CiRjbG9uZS0+eyR0aGlzLT5mbkRvU2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2l0aG91dCgkZW51bWVyYXRvcik6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT57JHRoaXMtPmZuRG9VbnNldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRob3V0SXRlcmFibGUoaXRlcmFibGUgJGVudW1lcmF0b3JzKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwpmb3JlYWNoICgkZW51bWVyYXRvcnMgYXMgJGVudW1lcmF0b3IpIHsKJGNsb25lLT57JHRoaXMtPmZuRG9VbnNldEJpdH0oKCR0aGlzLT5lbnVtZXJhdGlvbik6OmdldCgkZW51bWVyYXRvciktPmdldE9yZGluYWwoKSk7Cn0KcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoVW5pb24oRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+c2V0VW5pb24oJG90aGVyKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bmlvbihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPndpdGhVbmlvbigkb3RoZXIpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhJbnRlcnNlY3QoRW51bVNldCAkb3RoZXIpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+c2V0SW50ZXJzZWN0KCRvdGhlcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW50ZXJzZWN0KEVudW1TZXQgJG90aGVyKTogc2VsZgp7CnJldHVybiAkdGhpcy0+d2l0aEludGVyc2VjdCgkb3RoZXIpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhEaWZmKEVudW1TZXQgJG90aGVyKTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnNldERpZmYoJG90aGVyKTsKcmV0dXJuICRjbG9uZTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaWZmKEVudW1TZXQgJG90aGVyKTogc2VsZgp7CnJldHVybiAkdGhpcy0+d2l0aERpZmYoJG90aGVyKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoU3ltRGlmZihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewokY2xvbmUgPSBjbG9uZSAkdGhpczsKJGNsb25lLT5zZXRTeW1EaWZmKCRvdGhlcik7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3ltRGlmZihFbnVtU2V0ICRvdGhlcik6IHNlbGYKewpyZXR1cm4gJHRoaXMtPndpdGhTeW1EaWZmKCRvdGhlcik7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoQmluYXJ5Qml0c2V0TGUoc3RyaW5nICRiaXRzZXQpOiBzZWxmCnsKJGNsb25lID0gY2xvbmUgJHRoaXM7CiRjbG9uZS0+eyR0aGlzLT5mbkRvU2V0QmluYXJ5Qml0c2V0TGV9KCRiaXRzZXQpOwpyZXR1cm4gJGNsb25lOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdpdGhCaW5hcnlCaXRzZXRCZShzdHJpbmcgJGJpdHNldCk6IHNlbGYKewokY2xvbmUgPSAkdGhpczsKJGNsb25lLT57JHRoaXMtPmZuRG9TZXRCaW5hcnlCaXRzZXRMZX0oXHN0cnJldigkYml0c2V0KSk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3aXRoQml0KGludCAkb3JkaW5hbCwgYm9vbCAkYml0KTogc2VsZgp7CiRjbG9uZSA9IGNsb25lICR0aGlzOwokY2xvbmUtPnNldEJpdCgkb3JkaW5hbCwgJGJpdCk7CnJldHVybiAkY2xvbmU7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzKCRlbnVtZXJhdG9yKTogYm9vbAp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvR2V0Qml0fSgoJHRoaXMtPmVudW1lcmF0aW9uKTo6Z2V0KCRlbnVtZXJhdG9yKS0+Z2V0T3JkaW5hbCgpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucygkZW51bWVyYXRvcik6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhcygkZW51bWVyYXRvcik7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCk6IEl0ZXJhdG9yCnsKcmV0dXJuICR0aGlzLT57JHRoaXMtPmZuRG9HZXRJdGVyYXRvcn0oKTsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldEl0ZXJhdG9yQmluKCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CiRieXRlTGVuID0gXHN0cmxlbigkYml0c2V0KTsKZm9yICgkYnl0ZVBvcyA9IDA7ICRieXRlUG9zIDwgJGJ5dGVMZW47ICsrJGJ5dGVQb3MpIHsKaWYgKCRiaXRzZXRbJGJ5dGVQb3NdID09PSAiXDAiKSB7Cgpjb250aW51ZTsKfQoKJG9yZCA9IFxvcmQoJGJpdHNldFskYnl0ZVBvc10pOwpmb3IgKCRiaXRQb3MgPSAwOyAkYml0UG9zIDwgODsgKyskYml0UG9zKSB7CmlmICgkb3JkICYgKDEgPDwgJGJpdFBvcykpIHsKJG9yZGluYWwgPSAkYnl0ZVBvcyAqIDggKyAkYml0UG9zOwp5aWVsZCAkb3JkaW5hbCA9PiAoJHRoaXMtPmVudW1lcmF0aW9uKTo6YnlPcmRpbmFsKCRvcmRpbmFsKTsKfQp9Cn0KfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldEl0ZXJhdG9ySW50KCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CiRjb3VudCA9ICR0aGlzLT5lbnVtZXJhdGlvbkNvdW50Owpmb3IgKCRvcmRpbmFsID0gMDsgJG9yZGluYWwgPCAkY291bnQ7ICsrJG9yZGluYWwpIHsKaWYgKCRiaXRzZXQgJiAoMSA8PCAkb3JkaW5hbCkpIHsKeWllbGQgJG9yZGluYWwgPT4gKCR0aGlzLT5lbnVtZXJhdGlvbik6OmJ5T3JkaW5hbCgkb3JkaW5hbCk7Cn0KfQp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY291bnQoKTogaW50CnsKcmV0dXJuICR0aGlzLT57JHRoaXMtPmZuRG9Db3VudH0oKTsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0NvdW50QmluKCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CiRjb3VudCA9IDA7CiRieXRlTGVuID0gXHN0cmxlbigkYml0c2V0KTsKZm9yICgkYnl0ZVBvcyA9IDA7ICRieXRlUG9zIDwgJGJ5dGVMZW47ICsrJGJ5dGVQb3MpIHsKaWYgKCRiaXRzZXRbJGJ5dGVQb3NdID09PSAiXDAiKSB7Cgpjb250aW51ZTsKfQoKJG9yZCA9IFxvcmQoJGJpdHNldFskYnl0ZVBvc10pOwppZiAoJG9yZCAmIDBiMDAwMDAwMDEpICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMDAwMDAwMTApICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMDAwMDAxMDApICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMDAwMDEwMDApICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMDAwMTAwMDApICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMDAxMDAwMDApICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMDEwMDAwMDApICsrJGNvdW50OwppZiAoJG9yZCAmIDBiMTAwMDAwMDApICsrJGNvdW50Owp9CnJldHVybiAkY291bnQ7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9Db3VudEludCgpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwokY291bnQgPSAwOwoKCmlmICgkYml0c2V0IDwgMCkgewokY291bnQgPSAxOwokYml0c2V0ID0gJGJpdHNldCAmIFxQSFBfSU5UX01BWDsKfQoKCiRwaHBJbnRCaXRTaXplID0gXFBIUF9JTlRfU0laRSAqIDg7CmZvciAoJGJpdFBvcyA9IDA7ICRiaXRQb3MgPCAkcGhwSW50Qml0U2l6ZTsgJGJpdFBvcyArPSA4KSB7CiRiaXRDaGsgPSAweGZmIDw8ICRiaXRQb3M7CiRieXRlID0gJGJpdHNldCAmICRiaXRDaGs7CmlmICgkYnl0ZSkgewokYnl0ZSA9ICRieXRlID4+ICRiaXRQb3M7CmlmICgkYnl0ZSAmIDBiMDAwMDAwMDEpICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjAwMDAwMDEwKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIwMDAwMDEwMCkgKyskY291bnQ7CmlmICgkYnl0ZSAmIDBiMDAwMDEwMDApICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjAwMDEwMDAwKSArKyRjb3VudDsKaWYgKCRieXRlICYgMGIwMDEwMDAwMCkgKyskY291bnQ7CmlmICgkYnl0ZSAmIDBiMDEwMDAwMDApICsrJGNvdW50OwppZiAoJGJ5dGUgJiAwYjEwMDAwMDAwKSArKyRjb3VudDsKfQoKaWYgKCRiaXRzZXQgPD0gJGJpdENoaykgewpicmVhazsKfQp9CgpyZXR1cm4gJGNvdW50Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0VxdWFsKEVudW1TZXQgJG90aGVyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb24gPT09ICRvdGhlci0+ZW51bWVyYXRpb24KJiYgJHRoaXMtPmJpdHNldCA9PT0gJG90aGVyLT5iaXRzZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3Vic2V0KEVudW1TZXQgJG90aGVyKTogYm9vbAp7CnJldHVybiAkdGhpcy0+ZW51bWVyYXRpb24gPT09ICRvdGhlci0+ZW51bWVyYXRpb24KJiYgKCR0aGlzLT5iaXRzZXQgJiAkb3RoZXItPmJpdHNldCkgPT09ICR0aGlzLT5iaXRzZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzU3VwZXJzZXQoRW51bVNldCAkb3RoZXIpOiBib29sCnsKcmV0dXJuICR0aGlzLT5lbnVtZXJhdGlvbiA9PT0gJG90aGVyLT5lbnVtZXJhdGlvbgomJiAoJHRoaXMtPmJpdHNldCB8ICRvdGhlci0+Yml0c2V0KSA9PT0gJHRoaXMtPmJpdHNldDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNFbXB0eSgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5iaXRzZXQgPT09ICR0aGlzLT5lbXB0eUJpdHNldDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9yZGluYWxzKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT57JHRoaXMtPmZuRG9HZXRPcmRpbmFsc30oKTsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldE9yZGluYWxzQmluKCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CiRvcmRpbmFscyA9IFtdOwokYnl0ZUxlbiA9IFxzdHJsZW4oJGJpdHNldCk7CmZvciAoJGJ5dGVQb3MgPSAwOyAkYnl0ZVBvcyA8ICRieXRlTGVuOyArKyRieXRlUG9zKSB7CmlmICgkYml0c2V0WyRieXRlUG9zXSA9PT0gIlwwIikgewoKY29udGludWU7Cn0KCiRvcmQgPSBcb3JkKCRiaXRzZXRbJGJ5dGVQb3NdKTsKZm9yICgkYml0UG9zID0gMDsgJGJpdFBvcyA8IDg7ICsrJGJpdFBvcykgewppZiAoJG9yZCAmICgxIDw8ICRiaXRQb3MpKSB7CiRvcmRpbmFsc1tdID0gJGJ5dGVQb3MgKiA4ICsgJGJpdFBvczsKfQp9Cn0KcmV0dXJuICRvcmRpbmFsczsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldE9yZGluYWxzSW50KCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CiRvcmRpbmFscyA9IFtdOwokY291bnQgPSAkdGhpcy0+ZW51bWVyYXRpb25Db3VudDsKZm9yICgkb3JkaW5hbCA9IDA7ICRvcmRpbmFsIDwgJGNvdW50OyArKyRvcmRpbmFsKSB7CmlmICgkYml0c2V0ICYgKDEgPDwgJG9yZGluYWwpKSB7CiRvcmRpbmFsc1tdID0gJG9yZGluYWw7Cn0KfQpyZXR1cm4gJG9yZGluYWxzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZhbHVlcygpOiBhcnJheQp7CiRlbnVtZXJhdGlvbiA9ICR0aGlzLT5lbnVtZXJhdGlvbjsKJHZhbHVlcyA9IFtdOwpmb3JlYWNoICgkdGhpcy0+Z2V0T3JkaW5hbHMoKSBhcyAkb3JkKSB7CiR2YWx1ZXNbXSA9ICRlbnVtZXJhdGlvbjo6YnlPcmRpbmFsKCRvcmQpLT5nZXRWYWx1ZSgpOwp9CnJldHVybiAkdmFsdWVzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzKCk6IGFycmF5CnsKJGVudW1lcmF0aW9uID0gJHRoaXMtPmVudW1lcmF0aW9uOwokbmFtZXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmdldE9yZGluYWxzKCkgYXMgJG9yZCkgewokbmFtZXNbXSA9ICRlbnVtZXJhdGlvbjo6YnlPcmRpbmFsKCRvcmQpLT5nZXROYW1lKCk7Cn0KcmV0dXJuICRuYW1lczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFbnVtZXJhdG9ycygpOiBhcnJheQp7CiRlbnVtZXJhdGlvbiA9ICR0aGlzLT5lbnVtZXJhdGlvbjsKJGVudW1lcmF0b3JzID0gW107CmZvcmVhY2ggKCR0aGlzLT5nZXRPcmRpbmFscygpIGFzICRvcmQpIHsKJGVudW1lcmF0b3JzW10gPSAkZW51bWVyYXRpb246OmJ5T3JkaW5hbCgkb3JkKTsKfQpyZXR1cm4gJGVudW1lcmF0b3JzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJpbmFyeUJpdHNldExlKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+eyR0aGlzLT5mbkRvR2V0QmluYXJ5Qml0c2V0TGV9KCk7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRCaW5hcnlCaXRzZXRMZUJpbigpCnsKCiRiaXRzZXQgPSAkdGhpcy0+Yml0c2V0OwoKcmV0dXJuICRiaXRzZXQ7Cn0KCgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZG9HZXRCaW5hcnlCaXRzZXRMZUludCgpCnsKJGJpbiA9IFxwYWNrKFxQSFBfSU5UX1NJWkUgPT09IDggPyAnUCcgOiAnVicsICR0aGlzLT5iaXRzZXQpOwpyZXR1cm4gXHN1YnN0cigkYmluLCAwLCAoaW50KVxjZWlsKCR0aGlzLT5lbnVtZXJhdGlvbkNvdW50IC8gOCkpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaW5hcnlCaXRzZXRCZSgpOiBzdHJpbmcKewpyZXR1cm4gXHN0cnJldigkdGhpcy0+Z2V0QmluYXJ5Qml0c2V0TGUoKSk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCaXQoaW50ICRvcmRpbmFsKTogYm9vbAp7CmlmICgkb3JkaW5hbCA8IDAgfHwgJG9yZGluYWwgPiAkdGhpcy0+ZW51bWVyYXRpb25Db3VudCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCJPcmRpbmFsIG51bWJlciBtdXN0IGJlIGJldHdlZW4gMCBhbmQgeyR0aGlzLT5lbnVtZXJhdGlvbkNvdW50fSIpOwp9CgpyZXR1cm4gJHRoaXMtPnskdGhpcy0+Zm5Eb0dldEJpdH0oJG9yZGluYWwpOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb0dldEJpdEJpbigkb3JkaW5hbCkKewoKJGJpdHNldCA9ICR0aGlzLT5iaXRzZXQ7CgpyZXR1cm4gKFxvcmQoJGJpdHNldFsoaW50KSAoJG9yZGluYWwgLyA4KV0pICYgMSA8PCAoJG9yZGluYWwgJSA4KSkgIT09IDA7Cn0KCgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvR2V0Qml0SW50KCRvcmRpbmFsKQp7CgokYml0c2V0ID0gJHRoaXMtPmJpdHNldDsKCnJldHVybiAoYm9vbCkoJGJpdHNldCAmICgxIDw8ICRvcmRpbmFsKSk7Cn0KfQo8P3BocAoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmludGVyZmFjZSBTdHJpbmdhYmxlCnsKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTsKfQp9CgpUaGUgTUlUIExpY2Vuc2UgKE1JVCkKCkNvcHlyaWdodCAoYykgMjAxMy0yMDE2IGNvbnRhaW5lci1pbnRlcm9wCkNvcHlyaWdodCAoYykgMjAxNiBQSFAgRnJhbWV3b3JrIEludGVyb3BlcmFiaWxpdHkgR3JvdXAKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2YKdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4KdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwp1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZgp0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCnN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUwpGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IKQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCklOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCkNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgo8P3BocAoKbmFtZXNwYWNlIFBzclxDb250YWluZXI7CgoKCgppbnRlcmZhY2UgQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKZGVjbGFyZShzdHJpY3RfdHlwZXM9MSk7CgpuYW1lc3BhY2UgUHNyXENvbnRhaW5lcjsKCgoKCmludGVyZmFjZSBDb250YWluZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJGlkKTsKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJGlkKTsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxDb250YWluZXI7CgoKCgppbnRlcmZhY2UgTm90Rm91bmRFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBDb250YWluZXJFeGNlcHRpb25JbnRlcmZhY2UKewp9CgpDb3B5cmlnaHQgKGMpIDIwMTIgUEhQIEZyYW1ld29yayBJbnRlcm9wZXJhYmlsaXR5IEdyb3VwCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IApvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIAp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiAKYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMb2dnZXIgaW1wbGVtZW50cyBMb2dnZXJJbnRlcmZhY2UKewoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbWVyZ2VuY3koJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpFTUVSR0VOQ1ksICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsZXJ0KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6QUxFUlQsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JpdGljYWwoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpDUklUSUNBTCwgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6RVJST1IsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpXQVJOSU5HLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RpY2UoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpOT1RJQ0UsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5mbygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OklORk8sICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYnVnKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6REVCVUcsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCnsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgpjbGFzcyBMb2dMZXZlbAp7CmNvbnN0IEVNRVJHRU5DWSA9ICdlbWVyZ2VuY3knOwpjb25zdCBBTEVSVCA9ICdhbGVydCc7CmNvbnN0IENSSVRJQ0FMID0gJ2NyaXRpY2FsJzsKY29uc3QgRVJST1IgPSAnZXJyb3InOwpjb25zdCBXQVJOSU5HID0gJ3dhcm5pbmcnOwpjb25zdCBOT1RJQ0UgPSAnbm90aWNlJzsKY29uc3QgSU5GTyA9ICdpbmZvJzsKY29uc3QgREVCVUcgPSAnZGVidWcnOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCmludGVyZmFjZSBMb2dnZXJBd2FyZUludGVyZmFjZQp7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9nZ2VyKExvZ2dlckludGVyZmFjZSAkbG9nZ2VyKTsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgp0cmFpdCBMb2dnZXJBd2FyZVRyYWl0CnsKCgoKCgpwcm90ZWN0ZWQgJGxvZ2dlcjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldExvZ2dlcihMb2dnZXJJbnRlcmZhY2UgJGxvZ2dlcikKewokdGhpcy0+bG9nZ2VyID0gJGxvZ2dlcjsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUHNyXExvZzsKCgoKCgoKCgoKCgoKCgoKCmludGVyZmFjZSBMb2dnZXJJbnRlcmZhY2UKewoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlbWVyZ2VuY3koJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGVydCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JpdGljYWwoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3IoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90aWNlKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpOwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSk7CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgoKCgoKCnRyYWl0IExvZ2dlclRyYWl0CnsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZW1lcmdlbmN5KCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6RU1FUkdFTkNZLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhbGVydCgkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkFMRVJULCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNyaXRpY2FsKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Q1JJVElDQUwsICRtZXNzYWdlLCAkY29udGV4dCk7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkVSUk9SLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YXJuaW5nKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6V0FSTklORywgJG1lc3NhZ2UsICRjb250ZXh0KTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90aWNlKCRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKJHRoaXMtPmxvZyhMb2dMZXZlbDo6Tk9USUNFLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGluZm8oJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gYXJyYXkoKSkKewokdGhpcy0+bG9nKExvZ0xldmVsOjpJTkZPLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWJ1ZygkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKQp7CiR0aGlzLT5sb2coTG9nTGV2ZWw6OkRFQlVHLCAkbWVzc2FnZSwgJGNvbnRleHQpOwp9CgoKCgoKCgoKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBsb2coJGxldmVsLCAkbWVzc2FnZSwgYXJyYXkgJGNvbnRleHQgPSBhcnJheSgpKTsKfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2c7CgoKCgoKCgoKCmNsYXNzIE51bGxMb2dnZXIgZXh0ZW5kcyBBYnN0cmFjdExvZ2dlcgp7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGxvZygkbGV2ZWwsICRtZXNzYWdlLCBhcnJheSAkY29udGV4dCA9IGFycmF5KCkpCnsKCn0KfQo8P3BocAoKbmFtZXNwYWNlIFBzclxMb2dcVGVzdDsKCgoKCgoKCgpjbGFzcyBEdW1teVRlc3QKewpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKcmV0dXJuICdEdW1teVRlc3QnOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nXFRlc3Q7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBQc3JcTG9nXExvZ0xldmVsOwp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7CgoKCgoKCgphYnN0cmFjdCBjbGFzcyBMb2dnZXJJbnRlcmZhY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UKewoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0TG9nZ2VyKCk7CgoKCgoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gZ2V0TG9ncygpOwoKcHVibGljIGZ1bmN0aW9uIHRlc3RJbXBsZW1lbnRzKCkKewokdGhpcy0+YXNzZXJ0SW5zdGFuY2VPZignUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2UnLCAkdGhpcy0+Z2V0TG9nZ2VyKCkpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGVzdExvZ3NBdEFsbExldmVscygkbGV2ZWwsICRtZXNzYWdlKQp7CiRsb2dnZXIgPSAkdGhpcy0+Z2V0TG9nZ2VyKCk7CiRsb2dnZXItPnskbGV2ZWx9KCRtZXNzYWdlLCBhcnJheSgndXNlcicgPT4gJ0JvYicpKTsKJGxvZ2dlci0+bG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5KCd1c2VyJyA9PiAnQm9iJykpOwoKJGV4cGVjdGVkID0gYXJyYXkoCiRsZXZlbC4nIG1lc3NhZ2Ugb2YgbGV2ZWwgJy4kbGV2ZWwuJyB3aXRoIGNvbnRleHQ6IEJvYicsCiRsZXZlbC4nIG1lc3NhZ2Ugb2YgbGV2ZWwgJy4kbGV2ZWwuJyB3aXRoIGNvbnRleHQ6IEJvYicsCik7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHByb3ZpZGVMZXZlbHNBbmRNZXNzYWdlcygpCnsKcmV0dXJuIGFycmF5KApMb2dMZXZlbDo6RU1FUkdFTkNZID0+IGFycmF5KExvZ0xldmVsOjpFTUVSR0VOQ1ksICdtZXNzYWdlIG9mIGxldmVsIGVtZXJnZW5jeSB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6QUxFUlQgPT4gYXJyYXkoTG9nTGV2ZWw6OkFMRVJULCAnbWVzc2FnZSBvZiBsZXZlbCBhbGVydCB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6Q1JJVElDQUwgPT4gYXJyYXkoTG9nTGV2ZWw6OkNSSVRJQ0FMLCAnbWVzc2FnZSBvZiBsZXZlbCBjcml0aWNhbCB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6RVJST1IgPT4gYXJyYXkoTG9nTGV2ZWw6OkVSUk9SLCAnbWVzc2FnZSBvZiBsZXZlbCBlcnJvciB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6V0FSTklORyA9PiBhcnJheShMb2dMZXZlbDo6V0FSTklORywgJ21lc3NhZ2Ugb2YgbGV2ZWwgd2FybmluZyB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6Tk9USUNFID0+IGFycmF5KExvZ0xldmVsOjpOT1RJQ0UsICdtZXNzYWdlIG9mIGxldmVsIG5vdGljZSB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6SU5GTyA9PiBhcnJheShMb2dMZXZlbDo6SU5GTywgJ21lc3NhZ2Ugb2YgbGV2ZWwgaW5mbyB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLApMb2dMZXZlbDo6REVCVUcgPT4gYXJyYXkoTG9nTGV2ZWw6OkRFQlVHLCAnbWVzc2FnZSBvZiBsZXZlbCBkZWJ1ZyB3aXRoIGNvbnRleHQ6IHt1c2VyfScpLAopOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdGVzdFRocm93c09uSW52YWxpZExldmVsKCkKewokbG9nZ2VyID0gJHRoaXMtPmdldExvZ2dlcigpOwokbG9nZ2VyLT5sb2coJ2ludmFsaWQgbGV2ZWwnLCAnRm9vJyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0Q29udGV4dFJlcGxhY2VtZW50KCkKewokbG9nZ2VyID0gJHRoaXMtPmdldExvZ2dlcigpOwokbG9nZ2VyLT5pbmZvKCd7TWVzc2FnZSB7bm90aGluZ30ge3VzZXJ9IHtmb28uYmFyfSBhfScsIGFycmF5KCd1c2VyJyA9PiAnQm9iJywgJ2Zvby5iYXInID0+ICdCYXInKSk7CgokZXhwZWN0ZWQgPSBhcnJheSgnaW5mbyB7TWVzc2FnZSB7bm90aGluZ30gQm9iIEJhciBhfScpOwokdGhpcy0+YXNzZXJ0RXF1YWxzKCRleHBlY3RlZCwgJHRoaXMtPmdldExvZ3MoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0T2JqZWN0Q2FzdFRvU3RyaW5nKCkKewppZiAobWV0aG9kX2V4aXN0cygkdGhpcywgJ2NyZWF0ZVBhcnRpYWxNb2NrJykpIHsKJGR1bW15ID0gJHRoaXMtPmNyZWF0ZVBhcnRpYWxNb2NrKCdQc3JcTG9nXFRlc3RcRHVtbXlUZXN0JywgYXJyYXkoJ19fdG9TdHJpbmcnKSk7Cn0gZWxzZSB7CiRkdW1teSA9ICR0aGlzLT5nZXRNb2NrKCdQc3JcTG9nXFRlc3RcRHVtbXlUZXN0JywgYXJyYXkoJ19fdG9TdHJpbmcnKSk7Cn0KJGR1bW15LT5leHBlY3RzKCR0aGlzLT5vbmNlKCkpCi0+bWV0aG9kKCdfX3RvU3RyaW5nJykKLT53aWxsKCR0aGlzLT5yZXR1cm5WYWx1ZSgnRFVNTVknKSk7CgokdGhpcy0+Z2V0TG9nZ2VyKCktPndhcm5pbmcoJGR1bW15KTsKCiRleHBlY3RlZCA9IGFycmF5KCd3YXJuaW5nIERVTU1ZJyk7CiR0aGlzLT5hc3NlcnRFcXVhbHMoJGV4cGVjdGVkLCAkdGhpcy0+Z2V0TG9ncygpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RDb250ZXh0Q2FuQ29udGFpbkFueXRoaW5nKCkKewokY2xvc2VkID0gZm9wZW4oJ3BocDovL21lbW9yeScsICdyJyk7CmZjbG9zZSgkY2xvc2VkKTsKCiRjb250ZXh0ID0gYXJyYXkoCidib29sJyA9PiB0cnVlLAonbnVsbCcgPT4gbnVsbCwKJ3N0cmluZycgPT4gJ0ZvbycsCidpbnQnID0+IDAsCidmbG9hdCcgPT4gMC41LAonbmVzdGVkJyA9PiBhcnJheSgnd2l0aCBvYmplY3QnID0+IG5ldyBEdW1teVRlc3QpLAonb2JqZWN0JyA9PiBuZXcgXERhdGVUaW1lLAoncmVzb3VyY2UnID0+IGZvcGVuKCdwaHA6Ly9tZW1vcnknLCAncicpLAonY2xvc2VkJyA9PiAkY2xvc2VkLAopOwoKJHRoaXMtPmdldExvZ2dlcigpLT53YXJuaW5nKCdDcmF6eSBjb250ZXh0IGRhdGEnLCAkY29udGV4dCk7CgokZXhwZWN0ZWQgPSBhcnJheSgnd2FybmluZyBDcmF6eSBjb250ZXh0IGRhdGEnKTsKJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICR0aGlzLT5nZXRMb2dzKCkpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdENvbnRleHRFeGNlcHRpb25LZXlDYW5CZUV4Y2VwdGlvbk9yT3RoZXJWYWx1ZXMoKQp7CiRsb2dnZXIgPSAkdGhpcy0+Z2V0TG9nZ2VyKCk7CiRsb2dnZXItPndhcm5pbmcoJ1JhbmRvbSBtZXNzYWdlJywgYXJyYXkoJ2V4Y2VwdGlvbicgPT4gJ29vcHMnKSk7CiRsb2dnZXItPmNyaXRpY2FsKCdVbmNhdWdodCBFeGNlcHRpb24hJywgYXJyYXkoJ2V4Y2VwdGlvbicgPT4gbmV3IFxMb2dpY0V4Y2VwdGlvbignRmFpbCcpKSk7CgokZXhwZWN0ZWQgPSBhcnJheSgKJ3dhcm5pbmcgUmFuZG9tIG1lc3NhZ2UnLAonY3JpdGljYWwgVW5jYXVnaHQgRXhjZXB0aW9uIScKKTsKJHRoaXMtPmFzc2VydEVxdWFscygkZXhwZWN0ZWQsICR0aGlzLT5nZXRMb2dzKCkpOwp9Cn0KPD9waHAKCm5hbWVzcGFjZSBQc3JcTG9nXFRlc3Q7Cgp1c2UgUHNyXExvZ1xBYnN0cmFjdExvZ2dlcjsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgVGVzdExvZ2dlciBleHRlbmRzIEFic3RyYWN0TG9nZ2VyCnsKCgoKcHVibGljICRyZWNvcmRzID0gW107CgpwdWJsaWMgJHJlY29yZHNCeUxldmVsID0gW107CgoKCgpwdWJsaWMgZnVuY3Rpb24gbG9nKCRsZXZlbCwgJG1lc3NhZ2UsIGFycmF5ICRjb250ZXh0ID0gW10pCnsKJHJlY29yZCA9IFsKJ2xldmVsJyA9PiAkbGV2ZWwsCidtZXNzYWdlJyA9PiAkbWVzc2FnZSwKJ2NvbnRleHQnID0+ICRjb250ZXh0LApdOwoKJHRoaXMtPnJlY29yZHNCeUxldmVsWyRyZWNvcmRbJ2xldmVsJ11dW10gPSAkcmVjb3JkOwokdGhpcy0+cmVjb3Jkc1tdID0gJHJlY29yZDsKfQoKcHVibGljIGZ1bmN0aW9uIGhhc1JlY29yZHMoJGxldmVsKQp7CnJldHVybiBpc3NldCgkdGhpcy0+cmVjb3Jkc0J5TGV2ZWxbJGxldmVsXSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNSZWNvcmQoJHJlY29yZCwgJGxldmVsKQp7CmlmIChpc19zdHJpbmcoJHJlY29yZCkpIHsKJHJlY29yZCA9IFsnbWVzc2FnZScgPT4gJHJlY29yZF07Cn0KcmV0dXJuICR0aGlzLT5oYXNSZWNvcmRUaGF0UGFzc2VzKGZ1bmN0aW9uICgkcmVjKSB1c2UgKCRyZWNvcmQpIHsKaWYgKCRyZWNbJ21lc3NhZ2UnXSAhPT0gJHJlY29yZFsnbWVzc2FnZSddKSB7CnJldHVybiBmYWxzZTsKfQppZiAoaXNzZXQoJHJlY29yZFsnY29udGV4dCddKSAmJiAkcmVjWydjb250ZXh0J10gIT09ICRyZWNvcmRbJ2NvbnRleHQnXSkgewpyZXR1cm4gZmFsc2U7Cn0KcmV0dXJuIHRydWU7Cn0sICRsZXZlbCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNSZWNvcmRUaGF0Q29udGFpbnMoJG1lc3NhZ2UsICRsZXZlbCkKewpyZXR1cm4gJHRoaXMtPmhhc1JlY29yZFRoYXRQYXNzZXMoZnVuY3Rpb24gKCRyZWMpIHVzZSAoJG1lc3NhZ2UpIHsKcmV0dXJuIHN0cnBvcygkcmVjWydtZXNzYWdlJ10sICRtZXNzYWdlKSAhPT0gZmFsc2U7Cn0sICRsZXZlbCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNSZWNvcmRUaGF0TWF0Y2hlcygkcmVnZXgsICRsZXZlbCkKewpyZXR1cm4gJHRoaXMtPmhhc1JlY29yZFRoYXRQYXNzZXMoZnVuY3Rpb24gKCRyZWMpIHVzZSAoJHJlZ2V4KSB7CnJldHVybiBwcmVnX21hdGNoKCRyZWdleCwgJHJlY1snbWVzc2FnZSddKSA+IDA7Cn0sICRsZXZlbCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBoYXNSZWNvcmRUaGF0UGFzc2VzKGNhbGxhYmxlICRwcmVkaWNhdGUsICRsZXZlbCkKewppZiAoIWlzc2V0KCR0aGlzLT5yZWNvcmRzQnlMZXZlbFskbGV2ZWxdKSkgewpyZXR1cm4gZmFsc2U7Cn0KZm9yZWFjaCAoJHRoaXMtPnJlY29yZHNCeUxldmVsWyRsZXZlbF0gYXMgJGkgPT4gJHJlYykgewppZiAoY2FsbF91c2VyX2Z1bmMoJHByZWRpY2F0ZSwgJHJlYywgJGkpKSB7CnJldHVybiB0cnVlOwp9Cn0KcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jYWxsKCRtZXRob2QsICRhcmdzKQp7CmlmIChwcmVnX21hdGNoKCcvKC4qKShEZWJ1Z3xJbmZvfE5vdGljZXxXYXJuaW5nfEVycm9yfENyaXRpY2FsfEFsZXJ0fEVtZXJnZW5jeSkoLiopLycsICRtZXRob2QsICRtYXRjaGVzKSA+IDApIHsKJGdlbmVyaWNNZXRob2QgPSAkbWF0Y2hlc1sxXSAuICgnUmVjb3JkcycgIT09ICRtYXRjaGVzWzNdID8gJ1JlY29yZCcgOiAnJykgLiAkbWF0Y2hlc1szXTsKJGxldmVsID0gc3RydG9sb3dlcigkbWF0Y2hlc1syXSk7CmlmIChtZXRob2RfZXhpc3RzKCR0aGlzLCAkZ2VuZXJpY01ldGhvZCkpIHsKJGFyZ3NbXSA9ICRsZXZlbDsKcmV0dXJuIGNhbGxfdXNlcl9mdW5jX2FycmF5KFskdGhpcywgJGdlbmVyaWNNZXRob2RdLCAkYXJncyk7Cn0KfQp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0NhbGwgdG8gdW5kZWZpbmVkIG1ldGhvZCAnIC4gZ2V0X2NsYXNzKCR0aGlzKSAuICc6OicgLiAkbWV0aG9kIC4gJygpJyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpCnsKJHRoaXMtPnJlY29yZHMgPSBbXTsKJHRoaXMtPnJlY29yZHNCeUxldmVsID0gW107Cn0KfQoKVGhlIE1JVCBMaWNlbnNlIChNSVQpCgpDb3B5cmlnaHQgKGMpIDIwMTIgSmFuIFNvcmdhbGxhLCBDaHJpc3RpYW4gTMO8Y2ssIENlZXMtSmFuIEtpZXdpZXQsIENocmlzIEJvZGVuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgpvYnRhaW5pbmcgYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbgpmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CnJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLApjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcKY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlCmluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUwpPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORApOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVApIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwKV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCkZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IKT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKPD9waHAKCm5hbWVzcGFjZSBSZWFjdFxQcm9taXNlOwoKCgoKZmluYWwgY2xhc3MgRGVmZXJyZWQKewoKCgpwcml2YXRlICRwcm9taXNlOwoKCnByaXZhdGUgJHJlc29sdmVDYWxsYmFjazsKCgpwcml2YXRlICRyZWplY3RDYWxsYmFjazsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/Y2FsbGFibGUgJGNhbmNlbGxlciA9IG51bGwpCnsKJHRoaXMtPnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAoJHJlc29sdmUsICRyZWplY3QpOiB2b2lkIHsKJHRoaXMtPnJlc29sdmVDYWxsYmFjayA9ICRyZXNvbHZlOwokdGhpcy0+cmVqZWN0Q2FsbGJhY2sgPSAkcmVqZWN0Owp9LCAkY2FuY2VsbGVyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByb21pc2UoKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+cHJvbWlzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoJHZhbHVlKTogdm9pZAp7CigkdGhpcy0+cmVzb2x2ZUNhbGxiYWNrKSgkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVqZWN0KFxUaHJvd2FibGUgJHJlYXNvbik6IHZvaWQKewooJHRoaXMtPnJlamVjdENhbGxiYWNrKSgkcmVhc29uKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZVxFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgQ29tcG9zaXRlRXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7Cgpwcml2YXRlICR0aHJvd2FibGVzOwoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkdGhyb3dhYmxlcywgc3RyaW5nICRtZXNzYWdlID0gJycsIGludCAkY29kZSA9IDAsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7CgokdGhpcy0+dGhyb3dhYmxlcyA9ICR0aHJvd2FibGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGhyb3dhYmxlcygpOiBhcnJheQp7CnJldHVybiAkdGhpcy0+dGhyb3dhYmxlczsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZVxFeGNlcHRpb247CgpjbGFzcyBMZW5ndGhFeGNlcHRpb24gZXh0ZW5kcyBcTGVuZ3RoRXhjZXB0aW9uCnsKfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcSW50ZXJuYWw7CgoKCgpmaW5hbCBjbGFzcyBDYW5jZWxsYXRpb25RdWV1ZQp7Cgpwcml2YXRlICRzdGFydGVkID0gZmFsc2U7CgoKcHJpdmF0ZSAkcXVldWUgPSBbXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2ludm9rZSgpOiB2b2lkCnsKaWYgKCR0aGlzLT5zdGFydGVkKSB7CnJldHVybjsKfQoKJHRoaXMtPnN0YXJ0ZWQgPSB0cnVlOwokdGhpcy0+ZHJhaW4oKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVucXVldWUoJGNhbmNlbGxhYmxlKTogdm9pZAp7CmlmICghXGlzX29iamVjdCgkY2FuY2VsbGFibGUpIHx8ICFcbWV0aG9kX2V4aXN0cygkY2FuY2VsbGFibGUsICd0aGVuJykgfHwgIVxtZXRob2RfZXhpc3RzKCRjYW5jZWxsYWJsZSwgJ2NhbmNlbCcpKSB7CnJldHVybjsKfQoKJGxlbmd0aCA9IFxhcnJheV9wdXNoKCR0aGlzLT5xdWV1ZSwgJGNhbmNlbGxhYmxlKTsKCmlmICgkdGhpcy0+c3RhcnRlZCAmJiAxID09PSAkbGVuZ3RoKSB7CiR0aGlzLT5kcmFpbigpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gZHJhaW4oKTogdm9pZAp7CmZvciAoJGkgPSBca2V5KCR0aGlzLT5xdWV1ZSk7IGlzc2V0KCR0aGlzLT5xdWV1ZVskaV0pOyAkaSsrKSB7CiRjYW5jZWxsYWJsZSA9ICR0aGlzLT5xdWV1ZVskaV07CmFzc2VydChcbWV0aG9kX2V4aXN0cygkY2FuY2VsbGFibGUsICdjYW5jZWwnKSk7CgokZXhjZXB0aW9uID0gbnVsbDsKCnRyeSB7CiRjYW5jZWxsYWJsZS0+Y2FuY2VsKCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGV4Y2VwdGlvbikgewp9Cgp1bnNldCgkdGhpcy0+cXVldWVbJGldKTsKCmlmICgkZXhjZXB0aW9uKSB7CnRocm93ICRleGNlcHRpb247Cn0KfQoKJHRoaXMtPnF1ZXVlID0gW107Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2VcSW50ZXJuYWw7Cgp1c2UgUmVhY3RcUHJvbWlzZVxQcm9taXNlSW50ZXJmYWNlOwp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxyZXNvbHZlOwoKCgoKCgoKZmluYWwgY2xhc3MgRnVsZmlsbGVkUHJvbWlzZSBpbXBsZW1lbnRzIFByb21pc2VJbnRlcmZhY2UKewoKcHJpdmF0ZSAkdmFsdWU7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCR2YWx1ZSA9IG51bGwpCnsKaWYgKCR2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2VJbnRlcmZhY2UpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1lvdSBjYW5ub3QgY3JlYXRlIFJlYWN0XFByb21pc2VcRnVsZmlsbGVkUHJvbWlzZSB3aXRoIGEgcHJvbWlzZS4gVXNlIFJlYWN0XFByb21pc2VccmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpIGluc3RlYWQuJyk7Cn0KCiR0aGlzLT52YWx1ZSA9ICR2YWx1ZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdGhlbig/Y2FsbGFibGUgJG9uRnVsZmlsbGVkID0gbnVsbCwgP2NhbGxhYmxlICRvblJlamVjdGVkID0gbnVsbCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAobnVsbCA9PT0gJG9uRnVsZmlsbGVkKSB7CnJldHVybiAkdGhpczsKfQoKdHJ5IHsKCgoKJHJlc3VsdCA9ICRvbkZ1bGZpbGxlZCgkdGhpcy0+dmFsdWUpOwpyZXR1cm4gcmVzb2x2ZSgkcmVzdWx0KTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZXhjZXB0aW9uKSB7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRleGNlcHRpb24pOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYXRjaChjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmaW5hbGx5KGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50aGVuKGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UgewoKcmV0dXJuIHJlc29sdmUoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCgpKS0+dGhlbihmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZSkgewpyZXR1cm4gJHZhbHVlOwp9KTsKfSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjYW5jZWwoKTogdm9pZAp7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3RoZXJ3aXNlKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y2F0Y2goJG9uUmVqZWN0ZWQpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsd2F5cyhjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZmluYWxseSgkb25GdWxmaWxsZWRPclJlamVjdGVkKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZVxJbnRlcm5hbDsKCnVzZSBSZWFjdFxQcm9taXNlXFByb21pc2VJbnRlcmZhY2U7CnVzZSBmdW5jdGlvbiBSZWFjdFxQcm9taXNlXF9jaGVja1R5cGVoaW50Owp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxyZXNvbHZlOwp1c2UgZnVuY3Rpb24gUmVhY3RcUHJvbWlzZVxzZXRfcmVqZWN0aW9uX2hhbmRsZXI7CgoKCgoKCmZpbmFsIGNsYXNzIFJlamVjdGVkUHJvbWlzZSBpbXBsZW1lbnRzIFByb21pc2VJbnRlcmZhY2UKewoKcHJpdmF0ZSAkcmVhc29uOwoKCnByaXZhdGUgJGhhbmRsZWQgPSBmYWxzZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcVGhyb3dhYmxlICRyZWFzb24pCnsKJHRoaXMtPnJlYXNvbiA9ICRyZWFzb247Cn0KCgpwdWJsaWMgZnVuY3Rpb24gX19kZXN0cnVjdCgpCnsKaWYgKCR0aGlzLT5oYW5kbGVkKSB7CnJldHVybjsKfQoKJGhhbmRsZXIgPSBzZXRfcmVqZWN0aW9uX2hhbmRsZXIobnVsbCk7CmlmICgkaGFuZGxlciA9PT0gbnVsbCkgewokbWVzc2FnZSA9ICdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gd2l0aCAnIC4gJHRoaXMtPnJlYXNvbjsKClxlcnJvcl9sb2coJG1lc3NhZ2UpOwpyZXR1cm47Cn0KCnRyeSB7CiRoYW5kbGVyKCR0aGlzLT5yZWFzb24pOwp9IGNhdGNoIChcVGhyb3dhYmxlICRlKSB7ClxwcmVnX21hdGNoKCcvXihbXjpcc10rKykoLiorKSQvc20nLCAoc3RyaW5nKSAkZSwgJG1hdGNoKTsKXGFzc2VydChpc3NldCgkbWF0Y2hbMV0sICRtYXRjaFsyXSkpOwokbWVzc2FnZSA9ICdGYXRhbCBlcnJvcjogVW5jYXVnaHQgJyAuICRtYXRjaFsxXSAuICcgZnJvbSB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gaGFuZGxlcicgLiAkbWF0Y2hbMl07CgpcZXJyb3JfbG9nKCRtZXNzYWdlKTsKZXhpdCgyNTUpOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0aGVuKD9jYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCA/Y2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZQp7CmlmIChudWxsID09PSAkb25SZWplY3RlZCkgewpyZXR1cm4gJHRoaXM7Cn0KCiR0aGlzLT5oYW5kbGVkID0gdHJ1ZTsKCnRyeSB7CnJldHVybiByZXNvbHZlKCRvblJlamVjdGVkKCR0aGlzLT5yZWFzb24pKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZXhjZXB0aW9uKSB7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRleGNlcHRpb24pOwp9Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXRjaChjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UKewppZiAoIV9jaGVja1R5cGVoaW50KCRvblJlamVjdGVkLCAkdGhpcy0+cmVhc29uKSkgewpyZXR1cm4gJHRoaXM7Cn0KCgoKCnJldHVybiAkdGhpcy0+dGhlbihudWxsLCAkb25SZWplY3RlZCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBmaW5hbGx5KGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50aGVuKG51bGwsIGZ1bmN0aW9uIChcVGhyb3dhYmxlICRyZWFzb24pIHVzZSAoJG9uRnVsZmlsbGVkT3JSZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gcmVzb2x2ZSgkb25GdWxmaWxsZWRPclJlamVjdGVkKCkpLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHJlYXNvbik6IFByb21pc2VJbnRlcmZhY2UgewpyZXR1cm4gbmV3IFJlamVjdGVkUHJvbWlzZSgkcmVhc29uKTsKfSk7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FuY2VsKCk6IHZvaWQKewokdGhpcy0+aGFuZGxlZCA9IHRydWU7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gb3RoZXJ3aXNlKGNhbGxhYmxlICRvblJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+Y2F0Y2goJG9uUmVqZWN0ZWQpOwp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIGFsd2F5cyhjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+ZmluYWxseSgkb25GdWxmaWxsZWRPclJlamVjdGVkKTsKfQp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCnVzZSBSZWFjdFxQcm9taXNlXEludGVybmFsXFJlamVjdGVkUHJvbWlzZTsKCgoKCgpmaW5hbCBjbGFzcyBQcm9taXNlIGltcGxlbWVudHMgUHJvbWlzZUludGVyZmFjZQp7Cgpwcml2YXRlICRjYW5jZWxsZXI7CgoKcHJpdmF0ZSAkcmVzdWx0OwoKCnByaXZhdGUgJGhhbmRsZXJzID0gW107CgoKcHJpdmF0ZSAkcmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA9IDA7CgoKcHJpdmF0ZSAkY2FuY2VsbGVkID0gZmFsc2U7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGNhbGxhYmxlICRyZXNvbHZlciwgP2NhbGxhYmxlICRjYW5jZWxsZXIgPSBudWxsKQp7CiR0aGlzLT5jYW5jZWxsZXIgPSAkY2FuY2VsbGVyOwoKCgoKJGNiID0gJHJlc29sdmVyOwokcmVzb2x2ZXIgPSAkY2FuY2VsbGVyID0gbnVsbDsKJHRoaXMtPmNhbGwoJGNiKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRoZW4oP2NhbGxhYmxlICRvbkZ1bGZpbGxlZCA9IG51bGwsID9jYWxsYWJsZSAkb25SZWplY3RlZCA9IG51bGwpOiBQcm9taXNlSW50ZXJmYWNlCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yZXN1bHQpIHsKcmV0dXJuICR0aGlzLT5yZXN1bHQtPnRoZW4oJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCk7Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Y2FuY2VsbGVyKSB7CnJldHVybiBuZXcgc3RhdGljKCR0aGlzLT5yZXNvbHZlcigkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKSk7Cn0KCgoKCgoKJHBhcmVudCA9ICR0aGlzOworKyRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHM7CgpyZXR1cm4gbmV3IHN0YXRpYygKJHRoaXMtPnJlc29sdmVyKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpLApzdGF0aWMgZnVuY3Rpb24gKCkgdXNlICgmJHBhcmVudCk6IHZvaWQgewphc3NlcnQoJHBhcmVudCBpbnN0YW5jZW9mIHNlbGYpOwotLSRwYXJlbnQtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHM7CgppZiAoJHBhcmVudC0+cmVxdWlyZWRDYW5jZWxSZXF1ZXN0cyA8PSAwKSB7CiRwYXJlbnQtPmNhbmNlbCgpOwp9CgokcGFyZW50ID0gbnVsbDsKfQopOwp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F0Y2goY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT50aGVuKG51bGwsIHN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCRvblJlamVjdGVkKSB7CmlmICghX2NoZWNrVHlwZWhpbnQoJG9uUmVqZWN0ZWQsICRyZWFzb24pKSB7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRyZWFzb24pOwp9CgoKCgpyZXR1cm4gJG9uUmVqZWN0ZWQoJHJlYXNvbik7Cn0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiAkdGhpcy0+dGhlbihzdGF0aWMgZnVuY3Rpb24gKCR2YWx1ZSkgdXNlICgkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZSB7CgpyZXR1cm4gcmVzb2x2ZSgkb25GdWxmaWxsZWRPclJlamVjdGVkKCkpLT50aGVuKGZ1bmN0aW9uICgpIHVzZSAoJHZhbHVlKSB7CnJldHVybiAkdmFsdWU7Cn0pOwp9LCBzdGF0aWMgZnVuY3Rpb24gKFxUaHJvd2FibGUgJHJlYXNvbikgdXNlICgkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZSB7CnJldHVybiByZXNvbHZlKCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQoKSktPnRoZW4oZnVuY3Rpb24gKCkgdXNlICgkcmVhc29uKTogUmVqZWN0ZWRQcm9taXNlIHsKcmV0dXJuIG5ldyBSZWplY3RlZFByb21pc2UoJHJlYXNvbik7Cn0pOwp9KTsKfQoKcHVibGljIGZ1bmN0aW9uIGNhbmNlbCgpOiB2b2lkCnsKJHRoaXMtPmNhbmNlbGxlZCA9IHRydWU7CiRjYW5jZWxsZXIgPSAkdGhpcy0+Y2FuY2VsbGVyOwokdGhpcy0+Y2FuY2VsbGVyID0gbnVsbDsKCiRwYXJlbnRDYW5jZWxsZXIgPSBudWxsOwoKaWYgKG51bGwgIT09ICR0aGlzLT5yZXN1bHQpIHsKCmlmICgkdGhpcy0+cmVzdWx0IGluc3RhbmNlb2YgUmVqZWN0ZWRQcm9taXNlKSB7CiR0aGlzLT5yZXN1bHQtPmNhbmNlbCgpOwp9CgoKCiRyb290ID0gJHRoaXMtPnVud3JhcCgkdGhpcy0+cmVzdWx0KTsKCgoKaWYgKCEkcm9vdCBpbnN0YW5jZW9mIHNlbGYgfHwgbnVsbCAhPT0gJHJvb3QtPnJlc3VsdCkgewpyZXR1cm47Cn0KCiRyb290LT5yZXF1aXJlZENhbmNlbFJlcXVlc3RzLS07CgppZiAoJHJvb3QtPnJlcXVpcmVkQ2FuY2VsUmVxdWVzdHMgPD0gMCkgewokcGFyZW50Q2FuY2VsbGVyID0gWyRyb290LCAnY2FuY2VsJ107Cn0KfQoKaWYgKG51bGwgIT09ICRjYW5jZWxsZXIpIHsKJHRoaXMtPmNhbGwoJGNhbmNlbGxlcik7Cn0KCgppZiAoJHBhcmVudENhbmNlbGxlcikgewokcGFyZW50Q2FuY2VsbGVyKCk7Cn0KfQoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdGhlcndpc2UoY2FsbGFibGUgJG9uUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5jYXRjaCgkb25SZWplY3RlZCk7Cn0KCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWx3YXlzKGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlCnsKcmV0dXJuICR0aGlzLT5maW5hbGx5KCRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlc29sdmVyKD9jYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCA/Y2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogY2FsbGFibGUKewpyZXR1cm4gZnVuY3Rpb24gKGNhbGxhYmxlICRyZXNvbHZlLCBjYWxsYWJsZSAkcmVqZWN0KSB1c2UgKCRvbkZ1bGZpbGxlZCwgJG9uUmVqZWN0ZWQpOiB2b2lkIHsKJHRoaXMtPmhhbmRsZXJzW10gPSBzdGF0aWMgZnVuY3Rpb24gKFByb21pc2VJbnRlcmZhY2UgJHByb21pc2UpIHVzZSAoJG9uRnVsZmlsbGVkLCAkb25SZWplY3RlZCwgJHJlc29sdmUsICRyZWplY3QpOiB2b2lkIHsKJHByb21pc2UgPSAkcHJvbWlzZS0+dGhlbigkb25GdWxmaWxsZWQsICRvblJlamVjdGVkKTsKCmlmICgkcHJvbWlzZSBpbnN0YW5jZW9mIHNlbGYgJiYgJHByb21pc2UtPnJlc3VsdCA9PT0gbnVsbCkgewokcHJvbWlzZS0+aGFuZGxlcnNbXSA9IHN0YXRpYyBmdW5jdGlvbiAoUHJvbWlzZUludGVyZmFjZSAkcHJvbWlzZSkgdXNlICgkcmVzb2x2ZSwgJHJlamVjdCk6IHZvaWQgewokcHJvbWlzZS0+dGhlbigkcmVzb2x2ZSwgJHJlamVjdCk7Cn07Cn0gZWxzZSB7CiRwcm9taXNlLT50aGVuKCRyZXNvbHZlLCAkcmVqZWN0KTsKfQp9Owp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIHJlamVjdChcVGhyb3dhYmxlICRyZWFzb24pOiB2b2lkCnsKaWYgKG51bGwgIT09ICR0aGlzLT5yZXN1bHQpIHsKcmV0dXJuOwp9CgokdGhpcy0+c2V0dGxlKHJlamVjdCgkcmVhc29uKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gc2V0dGxlKFByb21pc2VJbnRlcmZhY2UgJHJlc3VsdCk6IHZvaWQKewokcmVzdWx0ID0gJHRoaXMtPnVud3JhcCgkcmVzdWx0KTsKCmlmICgkcmVzdWx0ID09PSAkdGhpcykgewokcmVzdWx0ID0gbmV3IFJlamVjdGVkUHJvbWlzZSgKbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2Fubm90IHJlc29sdmUgYSBwcm9taXNlIHdpdGggaXRzZWxmLicpCik7Cn0KCmlmICgkcmVzdWx0IGluc3RhbmNlb2Ygc2VsZikgewokcmVzdWx0LT5yZXF1aXJlZENhbmNlbFJlcXVlc3RzKys7Cn0gZWxzZSB7CgokdGhpcy0+Y2FuY2VsbGVyID0gbnVsbDsKfQoKJGhhbmRsZXJzID0gJHRoaXMtPmhhbmRsZXJzOwoKJHRoaXMtPmhhbmRsZXJzID0gW107CiR0aGlzLT5yZXN1bHQgPSAkcmVzdWx0OwoKZm9yZWFjaCAoJGhhbmRsZXJzIGFzICRoYW5kbGVyKSB7CiRoYW5kbGVyKCRyZXN1bHQpOwp9CgoKaWYgKCR0aGlzLT5jYW5jZWxsZWQgJiYgJHJlc3VsdCBpbnN0YW5jZW9mIFJlamVjdGVkUHJvbWlzZSkgewokcmVzdWx0LT5jYW5jZWwoKTsKfQp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB1bndyYXAoUHJvbWlzZUludGVyZmFjZSAkcHJvbWlzZSk6IFByb21pc2VJbnRlcmZhY2UKewp3aGlsZSAoJHByb21pc2UgaW5zdGFuY2VvZiBzZWxmICYmIG51bGwgIT09ICRwcm9taXNlLT5yZXN1bHQpIHsKCiRwcm9taXNlID0gJHByb21pc2UtPnJlc3VsdDsKfQoKcmV0dXJuICRwcm9taXNlOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGwoY2FsbGFibGUgJGNiKTogdm9pZAp7CgoKJGNhbGxiYWNrID0gJGNiOwokY2IgPSBudWxsOwoKCgoKCgppZiAoXGlzX2FycmF5KCRjYWxsYmFjaykpIHsKJHJlZiA9IG5ldyBcUmVmbGVjdGlvbk1ldGhvZCgkY2FsbGJhY2tbMF0sICRjYWxsYmFja1sxXSk7Cn0gZWxzZWlmIChcaXNfb2JqZWN0KCRjYWxsYmFjaykgJiYgISRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlKSB7CiRyZWYgPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNhbGxiYWNrLCAnX19pbnZva2UnKTsKfSBlbHNlIHsKYXNzZXJ0KCRjYWxsYmFjayBpbnN0YW5jZW9mIFxDbG9zdXJlIHx8IFxpc19zdHJpbmcoJGNhbGxiYWNrKSk7CiRyZWYgPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkY2FsbGJhY2spOwp9CiRhcmdzID0gJHJlZi0+Z2V0TnVtYmVyT2ZQYXJhbWV0ZXJzKCk7Cgp0cnkgewppZiAoJGFyZ3MgPT09IDApIHsKJGNhbGxiYWNrKCk7Cn0gZWxzZSB7CgoKCgoKCgoKJHRhcmdldCA9JiAkdGhpczsKCiRjYWxsYmFjaygKc3RhdGljIGZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJiR0YXJnZXQpOiB2b2lkIHsKaWYgKCR0YXJnZXQgIT09IG51bGwpIHsKJHRhcmdldC0+c2V0dGxlKHJlc29sdmUoJHZhbHVlKSk7CiR0YXJnZXQgPSBudWxsOwp9Cn0sCnN0YXRpYyBmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCYkdGFyZ2V0KTogdm9pZCB7CmlmICgkdGFyZ2V0ICE9PSBudWxsKSB7CiR0YXJnZXQtPnJlamVjdCgkcmVhc29uKTsKJHRhcmdldCA9IG51bGw7Cn0KfQopOwp9Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJHRhcmdldCA9IG51bGw7CiR0aGlzLT5yZWplY3QoJGUpOwp9Cn0KfQo8P3BocAoKbmFtZXNwYWNlIFJlYWN0XFByb21pc2U7CgoKCgppbnRlcmZhY2UgUHJvbWlzZUludGVyZmFjZQp7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0aGVuKD9jYWxsYWJsZSAkb25GdWxmaWxsZWQgPSBudWxsLCA/Y2FsbGFibGUgJG9uUmVqZWN0ZWQgPSBudWxsKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXRjaChjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluYWxseShjYWxsYWJsZSAkb25GdWxmaWxsZWRPclJlamVjdGVkKTogUHJvbWlzZUludGVyZmFjZTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYW5jZWwoKTogdm9pZDsKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG90aGVyd2lzZShjYWxsYWJsZSAkb25SZWplY3RlZCk6IFByb21pc2VJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWx3YXlzKGNhbGxhYmxlICRvbkZ1bGZpbGxlZE9yUmVqZWN0ZWQpOiBQcm9taXNlSW50ZXJmYWNlOwp9Cjw/cGhwCgpuYW1lc3BhY2UgUmVhY3RcUHJvbWlzZTsKCnVzZSBSZWFjdFxQcm9taXNlXEV4Y2VwdGlvblxDb21wb3NpdGVFeGNlcHRpb247CnVzZSBSZWFjdFxQcm9taXNlXEludGVybmFsXEZ1bGZpbGxlZFByb21pc2U7CnVzZSBSZWFjdFxQcm9taXNlXEludGVybmFsXFJlamVjdGVkUHJvbWlzZTsKCgoKCgoKCgoKCgoKCgoKCmZ1bmN0aW9uIHJlc29sdmUoJHByb21pc2VPclZhbHVlKTogUHJvbWlzZUludGVyZmFjZQp7CmlmICgkcHJvbWlzZU9yVmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlSW50ZXJmYWNlKSB7CnJldHVybiAkcHJvbWlzZU9yVmFsdWU7Cn0KCmlmIChcaXNfb2JqZWN0KCRwcm9taXNlT3JWYWx1ZSkgJiYgXG1ldGhvZF9leGlzdHMoJHByb21pc2VPclZhbHVlLCAndGhlbicpKSB7CiRjYW5jZWxsZXIgPSBudWxsOwoKaWYgKFxtZXRob2RfZXhpc3RzKCRwcm9taXNlT3JWYWx1ZSwgJ2NhbmNlbCcpKSB7CiRjYW5jZWxsZXIgPSBbJHByb21pc2VPclZhbHVlLCAnY2FuY2VsJ107CmFzc2VydChcaXNfY2FsbGFibGUoJGNhbmNlbGxlcikpOwp9CgoKcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCkgdXNlICgkcHJvbWlzZU9yVmFsdWUpOiB2b2lkIHsKJHByb21pc2VPclZhbHVlLT50aGVuKCRyZXNvbHZlLCAkcmVqZWN0KTsKfSwgJGNhbmNlbGxlcik7Cn0KCnJldHVybiBuZXcgRnVsZmlsbGVkUHJvbWlzZSgkcHJvbWlzZU9yVmFsdWUpOwp9CgoKCgoKCgoKCgoKCgoKCgpmdW5jdGlvbiByZWplY3QoXFRocm93YWJsZSAkcmVhc29uKTogUHJvbWlzZUludGVyZmFjZQp7CnJldHVybiBuZXcgUmVqZWN0ZWRQcm9taXNlKCRyZWFzb24pOwp9CgoKCgoKCgoKCgoKZnVuY3Rpb24gYWxsKGl0ZXJhYmxlICRwcm9taXNlc09yVmFsdWVzKTogUHJvbWlzZUludGVyZmFjZQp7CiRjYW5jZWxsYXRpb25RdWV1ZSA9IG5ldyBJbnRlcm5hbFxDYW5jZWxsYXRpb25RdWV1ZSgpOwoKCnJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QpIHVzZSAoJHByb21pc2VzT3JWYWx1ZXMsICRjYW5jZWxsYXRpb25RdWV1ZSk6IHZvaWQgewokdG9SZXNvbHZlID0gMDsKCiRjb250aW51ZSA9IHRydWU7CiR2YWx1ZXMgPSBbXTsKCmZvcmVhY2ggKCRwcm9taXNlc09yVmFsdWVzIGFzICRpID0+ICRwcm9taXNlT3JWYWx1ZSkgewokY2FuY2VsbGF0aW9uUXVldWUtPmVucXVldWUoJHByb21pc2VPclZhbHVlKTsKJHZhbHVlc1skaV0gPSBudWxsOworKyR0b1Jlc29sdmU7CgpyZXNvbHZlKCRwcm9taXNlT3JWYWx1ZSktPnRoZW4oCmZ1bmN0aW9uICgkdmFsdWUpIHVzZSAoJGksICYkdmFsdWVzLCAmJHRvUmVzb2x2ZSwgJiRjb250aW51ZSwgJHJlc29sdmUpOiB2b2lkIHsKJHZhbHVlc1skaV0gPSAkdmFsdWU7CgppZiAoMCA9PT0gLS0kdG9SZXNvbHZlICYmICEkY29udGludWUpIHsKJHJlc29sdmUoJHZhbHVlcyk7Cn0KfSwKZnVuY3Rpb24gKFxUaHJvd2FibGUgJHJlYXNvbikgdXNlICgmJGNvbnRpbnVlLCAkcmVqZWN0KTogdm9pZCB7CiRjb250aW51ZSA9IGZhbHNlOwokcmVqZWN0KCRyZWFzb24pOwp9Cik7CgppZiAoISRjb250aW51ZSAmJiAhXGlzX2FycmF5KCRwcm9taXNlc09yVmFsdWVzKSkgewpicmVhazsKfQp9CgokY29udGludWUgPSBmYWxzZTsKaWYgKCR0b1Jlc29sdmUgPT09IDApIHsKJHJlc29sdmUoJHZhbHVlcyk7Cn0KfSwgJGNhbmNlbGxhdGlvblF1ZXVlKTsKfQoKCgoKCgoKCgoKCgpmdW5jdGlvbiByYWNlKGl0ZXJhYmxlICRwcm9taXNlc09yVmFsdWVzKTogUHJvbWlzZUludGVyZmFjZQp7CiRjYW5jZWxsYXRpb25RdWV1ZSA9IG5ldyBJbnRlcm5hbFxDYW5jZWxsYXRpb25RdWV1ZSgpOwoKCnJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoY2FsbGFibGUgJHJlc29sdmUsIGNhbGxhYmxlICRyZWplY3QpIHVzZSAoJHByb21pc2VzT3JWYWx1ZXMsICRjYW5jZWxsYXRpb25RdWV1ZSk6IHZvaWQgewokY29udGludWUgPSB0cnVlOwoKZm9yZWFjaCAoJHByb21pc2VzT3JWYWx1ZXMgYXMgJHByb21pc2VPclZhbHVlKSB7CiRjYW5jZWxsYXRpb25RdWV1ZS0+ZW5xdWV1ZSgkcHJvbWlzZU9yVmFsdWUpOwoKcmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpLT50aGVuKCRyZXNvbHZlLCAkcmVqZWN0KS0+ZmluYWxseShmdW5jdGlvbiAoKSB1c2UgKCYkY29udGludWUpOiB2b2lkIHsKJGNvbnRpbnVlID0gZmFsc2U7Cn0pOwoKaWYgKCEkY29udGludWUgJiYgIVxpc19hcnJheSgkcHJvbWlzZXNPclZhbHVlcykpIHsKYnJlYWs7Cn0KfQp9LCAkY2FuY2VsbGF0aW9uUXVldWUpOwp9CgoKCgoKCgoKCgoKCgoKCgpmdW5jdGlvbiBhbnkoaXRlcmFibGUgJHByb21pc2VzT3JWYWx1ZXMpOiBQcm9taXNlSW50ZXJmYWNlCnsKJGNhbmNlbGxhdGlvblF1ZXVlID0gbmV3IEludGVybmFsXENhbmNlbGxhdGlvblF1ZXVlKCk7CgoKcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChjYWxsYWJsZSAkcmVzb2x2ZSwgY2FsbGFibGUgJHJlamVjdCkgdXNlICgkcHJvbWlzZXNPclZhbHVlcywgJGNhbmNlbGxhdGlvblF1ZXVlKTogdm9pZCB7CiR0b1JlamVjdCA9IDA7CiRjb250aW51ZSA9IHRydWU7CiRyZWFzb25zID0gW107Cgpmb3JlYWNoICgkcHJvbWlzZXNPclZhbHVlcyBhcyAkaSA9PiAkcHJvbWlzZU9yVmFsdWUpIHsKJGNhbmNlbGxhdGlvblF1ZXVlLT5lbnF1ZXVlKCRwcm9taXNlT3JWYWx1ZSk7CisrJHRvUmVqZWN0OwoKcmVzb2x2ZSgkcHJvbWlzZU9yVmFsdWUpLT50aGVuKApmdW5jdGlvbiAoJHZhbHVlKSB1c2UgKCRyZXNvbHZlLCAmJGNvbnRpbnVlKTogdm9pZCB7CiRjb250aW51ZSA9IGZhbHNlOwokcmVzb2x2ZSgkdmFsdWUpOwp9LApmdW5jdGlvbiAoXFRocm93YWJsZSAkcmVhc29uKSB1c2UgKCRpLCAmJHJlYXNvbnMsICYkdG9SZWplY3QsICRyZWplY3QsICYkY29udGludWUpOiB2b2lkIHsKJHJlYXNvbnNbJGldID0gJHJlYXNvbjsKCmlmICgwID09PSAtLSR0b1JlamVjdCAmJiAhJGNvbnRpbnVlKSB7CiRyZWplY3QobmV3IENvbXBvc2l0ZUV4Y2VwdGlvbigKJHJlYXNvbnMsCidBbGwgcHJvbWlzZXMgcmVqZWN0ZWQuJwopKTsKfQp9Cik7CgppZiAoISRjb250aW51ZSAmJiAhXGlzX2FycmF5KCRwcm9taXNlc09yVmFsdWVzKSkgewpicmVhazsKfQp9CgokY29udGludWUgPSBmYWxzZTsKaWYgKCR0b1JlamVjdCA9PT0gMCAmJiAhJHJlYXNvbnMpIHsKJHJlamVjdChuZXcgRXhjZXB0aW9uXExlbmd0aEV4Y2VwdGlvbigKJ011c3QgY29udGFpbiBhdCBsZWFzdCAxIGl0ZW0gYnV0IGNvbnRhaW5zIG9ubHkgMCBpdGVtcy4nCikpOwp9IGVsc2VpZiAoJHRvUmVqZWN0ID09PSAwKSB7CiRyZWplY3QobmV3IENvbXBvc2l0ZUV4Y2VwdGlvbigKJHJlYXNvbnMsCidBbGwgcHJvbWlzZXMgcmVqZWN0ZWQuJwopKTsKfQp9LCAkY2FuY2VsbGF0aW9uUXVldWUpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmZ1bmN0aW9uIHNldF9yZWplY3Rpb25faGFuZGxlcig/Y2FsbGFibGUgJGNhbGxiYWNrKTogP2NhbGxhYmxlCnsKc3RhdGljICRjdXJyZW50ID0gbnVsbDsKJHByZXZpb3VzID0gJGN1cnJlbnQ7CiRjdXJyZW50ID0gJGNhbGxiYWNrOwoKcmV0dXJuICRwcmV2aW91czsKfQoKCgoKZnVuY3Rpb24gX2NoZWNrVHlwZWhpbnQoY2FsbGFibGUgJGNhbGxiYWNrLCBcVGhyb3dhYmxlICRyZWFzb24pOiBib29sCnsKaWYgKFxpc19hcnJheSgkY2FsbGJhY2spKSB7CiRjYWxsYmFja1JlZmxlY3Rpb24gPSBuZXcgXFJlZmxlY3Rpb25NZXRob2QoJGNhbGxiYWNrWzBdLCAkY2FsbGJhY2tbMV0pOwp9IGVsc2VpZiAoXGlzX29iamVjdCgkY2FsbGJhY2spICYmICEkY2FsbGJhY2sgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokY2FsbGJhY2tSZWZsZWN0aW9uID0gbmV3IFxSZWZsZWN0aW9uTWV0aG9kKCRjYWxsYmFjaywgJ19faW52b2tlJyk7Cn0gZWxzZSB7CmFzc2VydCgkY2FsbGJhY2sgaW5zdGFuY2VvZiBcQ2xvc3VyZSB8fCBcaXNfc3RyaW5nKCRjYWxsYmFjaykpOwokY2FsbGJhY2tSZWZsZWN0aW9uID0gbmV3IFxSZWZsZWN0aW9uRnVuY3Rpb24oJGNhbGxiYWNrKTsKfQoKJHBhcmFtZXRlcnMgPSAkY2FsbGJhY2tSZWZsZWN0aW9uLT5nZXRQYXJhbWV0ZXJzKCk7CgppZiAoIWlzc2V0KCRwYXJhbWV0ZXJzWzBdKSkgewpyZXR1cm4gdHJ1ZTsKfQoKJGV4cGVjdGVkRXhjZXB0aW9uID0gJHBhcmFtZXRlcnNbMF07CgoKJHR5cGUgPSAkZXhwZWN0ZWRFeGNlcHRpb24tPmdldFR5cGUoKTsKCiRpc1R5cGVVbmlvbiA9IHRydWU7CiR0eXBlcyA9IFtdOwoKc3dpdGNoICh0cnVlKSB7CmNhc2UgJHR5cGUgPT09IG51bGw6CmJyZWFrOwpjYXNlICR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGU6CiR0eXBlcyA9IFskdHlwZV07CmJyZWFrOwpjYXNlICR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25JbnRlcnNlY3Rpb25UeXBlOgokaXNUeXBlVW5pb24gPSBmYWxzZTsKY2FzZSAkdHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uVW5pb25UeXBlOgokdHlwZXMgPSAkdHlwZS0+Z2V0VHlwZXMoKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1VuZXhwZWN0ZWQgcmV0dXJuIHZhbHVlIG9mIFJlZmxlY3Rpb25QYXJhbWV0ZXI6OmdldFR5cGUnKTsKfQoKCmlmIChlbXB0eSgkdHlwZXMpKSB7CnJldHVybiB0cnVlOwp9Cgpmb3JlYWNoICgkdHlwZXMgYXMgJHR5cGUpIHsKCmlmICgkdHlwZSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uSW50ZXJzZWN0aW9uVHlwZSkgewpmb3JlYWNoICgkdHlwZS0+Z2V0VHlwZXMoKSBhcyAkdHlwZVRvTWF0Y2gpIHsKYXNzZXJ0KCR0eXBlVG9NYXRjaCBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlKTsKJG5hbWUgPSAkdHlwZVRvTWF0Y2gtPmdldE5hbWUoKTsKaWYgKCEoJG1hdGNoZXMgPSAoISR0eXBlVG9NYXRjaC0+aXNCdWlsdGluKCkgJiYgJHJlYXNvbiBpbnN0YW5jZW9mICRuYW1lKSkpIHsKYnJlYWs7Cn0KfQphc3NlcnQoaXNzZXQoJG1hdGNoZXMpKTsKfSBlbHNlIHsKYXNzZXJ0KCR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUpOwokbmFtZSA9ICR0eXBlLT5nZXROYW1lKCk7CiRtYXRjaGVzID0gISR0eXBlLT5pc0J1aWx0aW4oKSAmJiAkcmVhc29uIGluc3RhbmNlb2YgJG5hbWU7Cn0KCgoKaWYgKCRtYXRjaGVzKSB7CmlmICgkaXNUeXBlVW5pb24pIHsKcmV0dXJuIHRydWU7Cn0KfSBlbHNlIHsKaWYgKCEkaXNUeXBlVW5pb24pIHsKcmV0dXJuIGZhbHNlOwp9Cn0KfQoKCgpyZXR1cm4gJGlzVHlwZVVuaW9uID8gZmFsc2UgOiB0cnVlOwp9Cjw/cGhwCgppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ1JlYWN0XFByb21pc2VccmVzb2x2ZScpKSB7CnJlcXVpcmUgX19ESVJfXy4nL2Z1bmN0aW9ucy5waHAnOwp9CgpDb3B5cmlnaHQgKGMpIDIwMTEgSm9yZGkgQm9nZ2lhbm8KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcSnNvbkxpbnQ7CgpjbGFzcyBEdXBsaWNhdGVLZXlFeGNlcHRpb24gZXh0ZW5kcyBQYXJzaW5nRXhjZXB0aW9uCnsKCgoKcHJvdGVjdGVkICRkZXRhaWxzOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRrZXksIGFycmF5ICRkZXRhaWxzKQp7CiRkZXRhaWxzWydrZXknXSA9ICRrZXk7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRkZXRhaWxzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEtleSgpCnsKcmV0dXJuICR0aGlzLT5kZXRhaWxzWydrZXknXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldGFpbHMoKQp7CnJldHVybiAkdGhpcy0+ZGV0YWlsczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKdXNlIHN0ZENsYXNzOwoKCgoKCgoKCgoKCgoKCmNsYXNzIEpzb25QYXJzZXIKewpjb25zdCBERVRFQ1RfS0VZX0NPTkZMSUNUUyA9IDE7CmNvbnN0IEFMTE9XX0RVUExJQ0FURV9LRVlTID0gMjsKY29uc3QgUEFSU0VfVE9fQVNTT0MgPSA0Owpjb25zdCBBTExPV19DT01NRU5UUyA9IDg7CmNvbnN0IEFMTE9XX0RVUExJQ0FURV9LRVlTX1RPX0FSUkFZID0gMTY7CgoKcHJpdmF0ZSAkbGV4ZXI7CgoKCgoKcHJpdmF0ZSAkZmxhZ3M7Cgpwcml2YXRlICRzdGFjazsKCnByaXZhdGUgJHZzdGFjazsgCgpwcml2YXRlICRsc3RhY2s7IAoKCgoKcHJpdmF0ZSAkc3ltYm9scyA9IGFycmF5KAonZXJyb3InID0+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+IGFycmF5KDIsMjEpLCAyNCA9PiBhcnJheSgyLDIxKSksCik7CgoKCgoKcHJpdmF0ZSAkZGVmYXVsdEFjdGlvbnMgPSBhcnJheSgKMTYgPT4gYXJyYXkoMiwgNikKKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbGludCgkaW5wdXQsICRmbGFncyA9IDApCnsKdHJ5IHsKJHRoaXMtPnBhcnNlKCRpbnB1dCwgJGZsYWdzKTsKfSBjYXRjaCAoUGFyc2luZ0V4Y2VwdGlvbiAkZSkgewpyZXR1cm4gJGU7Cn0KcmV0dXJuIG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhcnNlKCRpbnB1dCwgJGZsYWdzID0gMCkKewppZiAoKCRmbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTX1RPX0FSUkFZKSAmJiAoJGZsYWdzICYgc2VsZjo6QUxMT1dfRFVQTElDQVRFX0tFWVMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdPbmx5IG9uZSBvZiBBTExPV19EVVBMSUNBVEVfS0VZUyBhbmQgQUxMT1dfRFVQTElDQVRFX0tFWVNfVE9fQVJSQVkgY2FuIGJlIHVzZWQsIHlvdSBwYXNzZWQgaW4gYm90aC4nKTsKfQoKJHRoaXMtPmZhaWxPbkJPTSgkaW5wdXQpOwoKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwoKJHRoaXMtPnN0YWNrID0gYXJyYXkoMCk7CiR0aGlzLT52c3RhY2sgPSBhcnJheShudWxsKTsKJHRoaXMtPmxzdGFjayA9IGFycmF5KCk7CgokeXl0ZXh0ID0gJyc7CiR5eWxpbmVubyA9IDA7CiR5eWxlbmcgPSAwOwoKJHJlY292ZXJpbmcgPSAwOwoKJHRoaXMtPmxleGVyID0gbmV3IExleGVyKCRmbGFncyk7CiR0aGlzLT5sZXhlci0+c2V0SW5wdXQoJGlucHV0KTsKCiR5eWxvYyA9ICR0aGlzLT5sZXhlci0+eXlsbG9jOwokdGhpcy0+bHN0YWNrW10gPSAkeXlsb2M7Cgokc3ltYm9sID0gbnVsbDsKJHByZUVycm9yU3ltYm9sID0gbnVsbDsKJGFjdGlvbiA9IG51bGw7CiRhID0gbnVsbDsKJHIgPSBudWxsOwokcCA9IG51bGw7CiRsZW4gPSBudWxsOwokbmV3U3RhdGUgPSBudWxsOwokZXhwZWN0ZWQgPSBudWxsOwoKJGVyclN0ciA9IG51bGw7Cgp3aGlsZSAodHJ1ZSkgewoKJHN0YXRlID0gJHRoaXMtPnN0YWNrW1xjb3VudCgkdGhpcy0+c3RhY2spLTFdOwoKCmlmIChpc3NldCgkdGhpcy0+ZGVmYXVsdEFjdGlvbnNbJHN0YXRlXSkpIHsKJGFjdGlvbiA9ICR0aGlzLT5kZWZhdWx0QWN0aW9uc1skc3RhdGVdOwp9IGVsc2UgewppZiAoJHN5bWJvbCA9PT0gbnVsbCkgewokc3ltYm9sID0gJHRoaXMtPmxleGVyLT5sZXgoKTsKfQoKCiRhY3Rpb24gPSBpc3NldCgkdGhpcy0+dGFibGVbJHN0YXRlXVskc3ltYm9sXSkgPyAkdGhpcy0+dGFibGVbJHN0YXRlXVskc3ltYm9sXSA6IGZhbHNlOwp9CgoKaWYgKCEkYWN0aW9uIHx8ICEkYWN0aW9uWzBdKSB7CmFzc2VydChpc3NldCgkc3ltYm9sKSk7CmlmICghJHJlY292ZXJpbmcpIHsKCiRleHBlY3RlZCA9IGFycmF5KCk7CmZvcmVhY2ggKCR0aGlzLT50YWJsZVskc3RhdGVdIGFzICRwID0+ICRpZ25vcmUpIHsKaWYgKGlzc2V0KCR0aGlzLT50ZXJtaW5hbHNfWyRwXSkgJiYgJHAgPiAyKSB7CiRleHBlY3RlZFtdID0gIiciIC4gJHRoaXMtPnRlcm1pbmFsc19bJHBdIC4gIiciOwp9Cn0KCiRtZXNzYWdlID0gbnVsbDsKaWYgKFxpbl9hcnJheSgiJ1NUUklORyciLCAkZXhwZWN0ZWQpICYmIFxpbl9hcnJheShzdWJzdHIoJHRoaXMtPmxleGVyLT5tYXRjaCwgMCwgMSksIGFycmF5KCciJywgIiciKSkpIHsKJG1lc3NhZ2UgPSAiSW52YWxpZCBzdHJpbmciOwppZiAoIiciID09PSBzdWJzdHIoJHRoaXMtPmxleGVyLT5tYXRjaCwgMCwgMSkpIHsKJG1lc3NhZ2UgLj0gIiwgaXQgYXBwZWFycyB5b3UgdXNlZCBzaW5nbGUgcXVvdGVzIGluc3RlYWQgb2YgZG91YmxlIHF1b3RlcyI7Cn0gZWxzZWlmIChwcmVnX21hdGNoKCd7Ii4rPyhcXFxcW14iYmZucnQvXFxcXHVdKC4uLik/KX0nLCAkdGhpcy0+bGV4ZXItPmdldEZ1bGxVcGNvbWluZ0lucHV0KCksICRtYXRjaCkpIHsKJG1lc3NhZ2UgLj0gIiwgaXQgYXBwZWFycyB5b3UgaGF2ZSBhbiB1bmVzY2FwZWQgYmFja3NsYXNoIGF0OiAiLiRtYXRjaFsxXTsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJ3siKD86W14iXSt8XFxcXCIpKiR9bScsICR0aGlzLT5sZXhlci0+Z2V0RnVsbFVwY29taW5nSW5wdXQoKSkpIHsKJG1lc3NhZ2UgLj0gIiwgaXQgYXBwZWFycyB5b3UgZm9yZ290IHRvIHRlcm1pbmF0ZSBhIHN0cmluZywgb3IgYXR0ZW1wdGVkIHRvIHdyaXRlIGEgbXVsdGlsaW5lIHN0cmluZyB3aGljaCBpcyBpbnZhbGlkIjsKfQp9CgokZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJyAuICgkeXlsaW5lbm8rMSkgLiAiOlxuIjsKJGVyclN0ciAuPSAkdGhpcy0+bGV4ZXItPnNob3dQb3NpdGlvbigpIC4gIlxuIjsKaWYgKCRtZXNzYWdlKSB7CiRlcnJTdHIgLj0gJG1lc3NhZ2U7Cn0gZWxzZSB7CiRlcnJTdHIgLj0gKFxjb3VudCgkZXhwZWN0ZWQpID4gMSkgPyAiRXhwZWN0ZWQgb25lIG9mOiAiIDogIkV4cGVjdGVkOiAiOwokZXJyU3RyIC49IGltcGxvZGUoJywgJywgJGV4cGVjdGVkKTsKfQoKaWYgKCcsJyA9PT0gc3Vic3RyKHRyaW0oJHRoaXMtPmxleGVyLT5nZXRQYXN0SW5wdXQoKSksIC0xKSkgewokZXJyU3RyIC49ICIgLSBJdCBhcHBlYXJzIHlvdSBoYXZlIGFuIGV4dHJhIHRyYWlsaW5nIGNvbW1hIjsKfQoKJHRoaXMtPnBhcnNlRXJyb3IoJGVyclN0ciwgYXJyYXkoCid0ZXh0JyA9PiAkdGhpcy0+bGV4ZXItPm1hdGNoLAondG9rZW4nID0+IGlzc2V0KCR0aGlzLT50ZXJtaW5hbHNfWyRzeW1ib2xdKSA/ICR0aGlzLT50ZXJtaW5hbHNfWyRzeW1ib2xdIDogJHN5bWJvbCwKJ2xpbmUnID0+ICR0aGlzLT5sZXhlci0+eXlsaW5lbm8sCidsb2MnID0+ICR5eWxvYywKJ2V4cGVjdGVkJyA9PiAkZXhwZWN0ZWQsCikpOwp9CgoKaWYgKCRyZWNvdmVyaW5nID09IDMpIHsKaWYgKCRzeW1ib2wgPT09IExleGVyOjpFT0YpIHsKdGhyb3cgbmV3IFBhcnNpbmdFeGNlcHRpb24oJGVyclN0ciA/OiAnUGFyc2luZyBoYWx0ZWQuJyk7Cn0KCgokeXlsZW5nID0gJHRoaXMtPmxleGVyLT55eWxlbmc7CiR5eXRleHQgPSAkdGhpcy0+bGV4ZXItPnl5dGV4dDsKJHl5bGluZW5vID0gJHRoaXMtPmxleGVyLT55eWxpbmVubzsKJHl5bG9jID0gJHRoaXMtPmxleGVyLT55eWxsb2M7CiRzeW1ib2wgPSAkdGhpcy0+bGV4ZXItPmxleCgpOwp9CgoKd2hpbGUgKHRydWUpIHsKCmlmIChcYXJyYXlfa2V5X2V4aXN0cyhMZXhlcjo6VF9FUlJPUiwgJHRoaXMtPnRhYmxlWyRzdGF0ZV0pKSB7CmJyZWFrOwp9CmlmICgkc3RhdGUgPT0gMCkgewp0aHJvdyBuZXcgUGFyc2luZ0V4Y2VwdGlvbigkZXJyU3RyID86ICdQYXJzaW5nIGhhbHRlZC4nKTsKfQokdGhpcy0+cG9wU3RhY2soMSk7CiRzdGF0ZSA9ICR0aGlzLT5zdGFja1tcY291bnQoJHRoaXMtPnN0YWNrKS0xXTsKfQoKJHByZUVycm9yU3ltYm9sID0gJHN5bWJvbDsgCiRzeW1ib2wgPSBMZXhlcjo6VF9FUlJPUjsgCiRzdGF0ZSA9ICR0aGlzLT5zdGFja1tcY291bnQoJHRoaXMtPnN0YWNrKS0xXTsKCiRhY3Rpb24gPSBpc3NldCgkdGhpcy0+dGFibGVbJHN0YXRlXVtMZXhlcjo6VF9FUlJPUl0pID8gJHRoaXMtPnRhYmxlWyRzdGF0ZV1bTGV4ZXI6OlRfRVJST1JdIDogZmFsc2U7CmlmICgkYWN0aW9uID09PSBmYWxzZSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdObyB0YWJsZSB2YWx1ZSBmb3VuZCBmb3IgJy4kc3RhdGUuJyA9PiAnLkxleGVyOjpUX0VSUk9SKTsKfQokcmVjb3ZlcmluZyA9IDM7IAp9CgoKaWYgKFxpc19hcnJheSgkYWN0aW9uWzBdKSAmJiBcY291bnQoJGFjdGlvbikgPiAxKSB7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCdQYXJzZSBFcnJvcjogbXVsdGlwbGUgYWN0aW9ucyBwb3NzaWJsZSBhdCBzdGF0ZTogJyAuICRzdGF0ZSAuICcsIHRva2VuOiAnIC4gJHN5bWJvbCk7Cn0KCnN3aXRjaCAoJGFjdGlvblswXSkgewpjYXNlIDE6IAphc3NlcnQoaXNzZXQoJHN5bWJvbCkpOwokdGhpcy0+c3RhY2tbXSA9ICRzeW1ib2w7CiR0aGlzLT52c3RhY2tbXSA9ICR0aGlzLT5sZXhlci0+eXl0ZXh0OwokdGhpcy0+bHN0YWNrW10gPSAkdGhpcy0+bGV4ZXItPnl5bGxvYzsKJHRoaXMtPnN0YWNrW10gPSAkYWN0aW9uWzFdOyAKJHN5bWJvbCA9IG51bGw7CmlmICghJHByZUVycm9yU3ltYm9sKSB7IAokeXlsZW5nID0gJHRoaXMtPmxleGVyLT55eWxlbmc7CiR5eXRleHQgPSAkdGhpcy0+bGV4ZXItPnl5dGV4dDsKJHl5bGluZW5vID0gJHRoaXMtPmxleGVyLT55eWxpbmVubzsKJHl5bG9jID0gJHRoaXMtPmxleGVyLT55eWxsb2M7CmlmICgkcmVjb3ZlcmluZyA+IDApIHsKJHJlY292ZXJpbmctLTsKfQp9IGVsc2UgeyAKJHN5bWJvbCA9ICRwcmVFcnJvclN5bWJvbDsKJHByZUVycm9yU3ltYm9sID0gbnVsbDsKfQpicmVhazsKCmNhc2UgMjogCiRsZW4gPSAkdGhpcy0+cHJvZHVjdGlvbnNfWyRhY3Rpb25bMV1dWzFdOwoKCiRjdXJyZW50VG9rZW4gPSAkdGhpcy0+dnN0YWNrW1xjb3VudCgkdGhpcy0+dnN0YWNrKSAtICRsZW5dOyAKCiRwb3NpdGlvbiA9IGFycmF5KCAKJ2ZpcnN0X2xpbmUnID0+ICR0aGlzLT5sc3RhY2tbXGNvdW50KCR0aGlzLT5sc3RhY2spIC0gKCRsZW4gPzogMSldWydmaXJzdF9saW5lJ10sCidsYXN0X2xpbmUnID0+ICR0aGlzLT5sc3RhY2tbXGNvdW50KCR0aGlzLT5sc3RhY2spIC0gMV1bJ2xhc3RfbGluZSddLAonZmlyc3RfY29sdW1uJyA9PiAkdGhpcy0+bHN0YWNrW1xjb3VudCgkdGhpcy0+bHN0YWNrKSAtICgkbGVuID86IDEpXVsnZmlyc3RfY29sdW1uJ10sCidsYXN0X2NvbHVtbicgPT4gJHRoaXMtPmxzdGFja1tcY291bnQoJHRoaXMtPmxzdGFjaykgLSAxXVsnbGFzdF9jb2x1bW4nXSwKKTsKbGlzdCgkbmV3VG9rZW4sICRhY3Rpb25SZXN1bHQpID0gJHRoaXMtPnBlcmZvcm1BY3Rpb24oJGN1cnJlbnRUb2tlbiwgJHl5dGV4dCwgJHl5bGVuZywgJHl5bGluZW5vLCAkYWN0aW9uWzFdKTsKCmlmICghJGFjdGlvblJlc3VsdCBpbnN0YW5jZW9mIFVuZGVmaW5lZCkgewpyZXR1cm4gJGFjdGlvblJlc3VsdDsKfQoKaWYgKCRsZW4pIHsKJHRoaXMtPnBvcFN0YWNrKCRsZW4pOwp9CgokdGhpcy0+c3RhY2tbXSA9ICR0aGlzLT5wcm9kdWN0aW9uc19bJGFjdGlvblsxXV1bMF07IAokdGhpcy0+dnN0YWNrW10gPSAkbmV3VG9rZW47CiR0aGlzLT5sc3RhY2tbXSA9ICRwb3NpdGlvbjsKCiRuZXdTdGF0ZSA9ICR0aGlzLT50YWJsZVskdGhpcy0+c3RhY2tbXGNvdW50KCR0aGlzLT5zdGFjayktMl1dWyR0aGlzLT5zdGFja1tcY291bnQoJHRoaXMtPnN0YWNrKS0xXV07CiR0aGlzLT5zdGFja1tdID0gJG5ld1N0YXRlOwpicmVhazsKCmNhc2UgMzogCgpyZXR1cm4gdHJ1ZTsKfQp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHBhcnNlRXJyb3IoJHN0ciwgJGhhc2ggPSBudWxsKQp7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCRzdHIsICRoYXNoID86IGFycmF5KCkpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcGVyZm9ybUFjdGlvbigkY3VycmVudFRva2VuLCAkeXl0ZXh0LCAkeXlsZW5nLCAkeXlsaW5lbm8sICR5eXN0YXRlKQp7CiR0b2tlbiA9ICRjdXJyZW50VG9rZW47CgokbGVuID0gXGNvdW50KCR0aGlzLT52c3RhY2spIC0gMTsKc3dpdGNoICgkeXlzdGF0ZSkgewpjYXNlIDE6CiR5eXRleHQgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJ3soPzpcXFxcWyJiZm5ydC9cXFxcXXxcXFxcdVthLWZBLUYwLTldezR9KX0nLCBhcnJheSgkdGhpcywgJ3N0cmluZ0ludGVycG9sYXRpb24nKSwgJHl5dGV4dCk7CiR0b2tlbiA9ICR5eXRleHQ7CmJyZWFrOwpjYXNlIDI6CmlmIChzdHJwb3MoJHl5dGV4dCwgJ2UnKSAhPT0gZmFsc2UgfHwgc3RycG9zKCR5eXRleHQsICdFJykgIT09IGZhbHNlKSB7CiR0b2tlbiA9IFxmbG9hdHZhbCgkeXl0ZXh0KTsKfSBlbHNlIHsKJHRva2VuID0gc3RycG9zKCR5eXRleHQsICcuJykgPT09IGZhbHNlID8gXGludHZhbCgkeXl0ZXh0KSA6IFxmbG9hdHZhbCgkeXl0ZXh0KTsKfQpicmVhazsKY2FzZSAzOgokdG9rZW4gPSBudWxsOwpicmVhazsKY2FzZSA0OgokdG9rZW4gPSB0cnVlOwpicmVhazsKY2FzZSA1OgokdG9rZW4gPSBmYWxzZTsKYnJlYWs7CmNhc2UgNjoKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTFdOwoKcmV0dXJuIGFycmF5KCR0b2tlbiwgJHRva2VuKTsKY2FzZSAxMzoKaWYgKCR0aGlzLT5mbGFncyAmIHNlbGY6OlBBUlNFX1RPX0FTU09DKSB7CiR0b2tlbiA9IGFycmF5KCk7Cn0gZWxzZSB7CiR0b2tlbiA9IG5ldyBzdGRDbGFzczsKfQpicmVhazsKY2FzZSAxNDoKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTFdOwpicmVhazsKY2FzZSAxNToKJHRva2VuID0gYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdLCAkdGhpcy0+dnN0YWNrWyRsZW5dKTsKYnJlYWs7CmNhc2UgMTY6CmFzc2VydChcaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuXSkpOwppZiAoUEhQX1ZFUlNJT05fSUQgPCA3MDEwMCkgewokcHJvcGVydHkgPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdID09PSAnJyA/ICdfZW1wdHlfJyA6ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0gZWxzZSB7CiRwcm9wZXJ0eSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0KaWYgKCR0aGlzLT5mbGFncyAmIHNlbGY6OlBBUlNFX1RPX0FTU09DKSB7CiR0b2tlbiA9IGFycmF5KCk7CiR0b2tlblskcHJvcGVydHldID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfSBlbHNlIHsKJHRva2VuID0gbmV3IHN0ZENsYXNzOwokdG9rZW4tPiRwcm9wZXJ0eSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0KYnJlYWs7CmNhc2UgMTc6CmFzc2VydChcaXNfYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuXSkpOwppZiAoJHRoaXMtPmZsYWdzICYgc2VsZjo6UEFSU0VfVE9fQVNTT0MpIHsKYXNzZXJ0KFxpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl0pKTsKJHRva2VuID0mICR0aGlzLT52c3RhY2tbJGxlbi0yXTsKJGtleSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07CmlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6REVURUNUX0tFWV9DT05GTElDVFMpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSkpIHsKJGVyclN0ciA9ICdQYXJzZSBlcnJvciBvbiBsaW5lICcgLiAoJHl5bGluZW5vKzEpIC4gIjpcbiI7CiRlcnJTdHIgLj0gJHRoaXMtPmxleGVyLT5zaG93UG9zaXRpb24oKSAuICJcbiI7CiRlcnJTdHIgLj0gIkR1cGxpY2F0ZSBrZXk6ICIuJHRoaXMtPnZzdGFja1skbGVuXVswXTsKdGhyb3cgbmV3IER1cGxpY2F0ZUtleUV4Y2VwdGlvbigkZXJyU3RyLCAkdGhpcy0+dnN0YWNrWyRsZW5dWzBdLCBhcnJheSgnbGluZScgPT4gJHl5bGluZW5vKzEpKTsKfQppZiAoKCR0aGlzLT5mbGFncyAmIHNlbGY6OkFMTE9XX0RVUExJQ0FURV9LRVlTKSAmJiBpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0pKSB7CiRkdXBsaWNhdGVDb3VudCA9IDE7CmRvIHsKJGR1cGxpY2F0ZUtleSA9ICRrZXkgLiAnLicgLiAkZHVwbGljYXRlQ291bnQrKzsKfSB3aGlsZSAoaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRkdXBsaWNhdGVLZXldKSk7CiR0aGlzLT52c3RhY2tbJGxlbi0yXVskZHVwbGljYXRlS2V5XSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMV07Cn0gZWxzZWlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6QUxMT1dfRFVQTElDQVRFX0tFWVNfVE9fQVJSQVkpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSkpIHsKaWYgKCFpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV1bJ19fZHVwbGljYXRlc19fJ10pIHx8ICFpc19hcnJheSgkdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV1bJ19fZHVwbGljYXRlc19fJ10pKSB7CiR0aGlzLT52c3RhY2tbJGxlbi0yXVska2V5XSA9IGFycmF5KCdfX2R1cGxpY2F0ZXNfXycgPT4gYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldKSk7Cn0KJHRoaXMtPnZzdGFja1skbGVuLTJdWyRrZXldWydfX2R1cGxpY2F0ZXNfXyddW10gPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9IGVsc2UgewokdGhpcy0+dnN0YWNrWyRsZW4tMl1bJGtleV0gPSAkdGhpcy0+dnN0YWNrWyRsZW5dWzFdOwp9Cn0gZWxzZSB7CmFzc2VydCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0gaW5zdGFuY2VvZiBzdGRDbGFzcyk7CiR0b2tlbiA9ICR0aGlzLT52c3RhY2tbJGxlbi0yXTsKaWYgKFBIUF9WRVJTSU9OX0lEIDwgNzAxMDApIHsKJGtleSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF0gPT09ICcnID8gJ19lbXB0eV8nIDogJHRoaXMtPnZzdGFja1skbGVuXVswXTsKfSBlbHNlIHsKJGtleSA9ICR0aGlzLT52c3RhY2tbJGxlbl1bMF07Cn0KaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpERVRFQ1RfS0VZX0NPTkZMSUNUUykgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5KSkgewokZXJyU3RyID0gJ1BhcnNlIGVycm9yIG9uIGxpbmUgJyAuICgkeXlsaW5lbm8rMSkgLiAiOlxuIjsKJGVyclN0ciAuPSAkdGhpcy0+bGV4ZXItPnNob3dQb3NpdGlvbigpIC4gIlxuIjsKJGVyclN0ciAuPSAiRHVwbGljYXRlIGtleTogIi4kdGhpcy0+dnN0YWNrWyRsZW5dWzBdOwp0aHJvdyBuZXcgRHVwbGljYXRlS2V5RXhjZXB0aW9uKCRlcnJTdHIsICR0aGlzLT52c3RhY2tbJGxlbl1bMF0sIGFycmF5KCdsaW5lJyA9PiAkeXlsaW5lbm8rMSkpOwp9CmlmICgoJHRoaXMtPmZsYWdzICYgc2VsZjo6QUxMT1dfRFVQTElDQVRFX0tFWVMpICYmIGlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleSkpIHsKJGR1cGxpY2F0ZUNvdW50ID0gMTsKZG8gewokZHVwbGljYXRlS2V5ID0gJGtleSAuICcuJyAuICRkdXBsaWNhdGVDb3VudCsrOwp9IHdoaWxlIChpc3NldCgkdGhpcy0+dnN0YWNrWyRsZW4tMl0tPiRkdXBsaWNhdGVLZXkpKTsKJHRoaXMtPnZzdGFja1skbGVuLTJdLT4kZHVwbGljYXRlS2V5ID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfSBlbHNlaWYgKCgkdGhpcy0+ZmxhZ3MgJiBzZWxmOjpBTExPV19EVVBMSUNBVEVfS0VZU19UT19BUlJBWSkgJiYgaXNzZXQoJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5KSkgewppZiAoIWlzc2V0KCR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleS0+X19kdXBsaWNhdGVzX18pKSB7CiR0aGlzLT52c3RhY2tbJGxlbi0yXS0+JGtleSA9IChvYmplY3QpIGFycmF5KCdfX2R1cGxpY2F0ZXNfXycgPT4gYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5KSk7Cn0KJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5LT5fX2R1cGxpY2F0ZXNfX1tdID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfSBlbHNlIHsKJHRoaXMtPnZzdGFja1skbGVuLTJdLT4ka2V5ID0gJHRoaXMtPnZzdGFja1skbGVuXVsxXTsKfQp9CmJyZWFrOwpjYXNlIDE4OgokdG9rZW4gPSBhcnJheSgpOwpicmVhazsKY2FzZSAxOToKJHRva2VuID0gJHRoaXMtPnZzdGFja1skbGVuLTFdOwpicmVhazsKY2FzZSAyMDoKJHRva2VuID0gYXJyYXkoJHRoaXMtPnZzdGFja1skbGVuXSk7CmJyZWFrOwpjYXNlIDIxOgphc3NlcnQoXGlzX2FycmF5KCR0aGlzLT52c3RhY2tbJGxlbi0yXSkpOwokdGhpcy0+dnN0YWNrWyRsZW4tMl1bXSA9ICR0aGlzLT52c3RhY2tbJGxlbl07CiR0b2tlbiA9ICR0aGlzLT52c3RhY2tbJGxlbi0yXTsKYnJlYWs7Cn0KCnJldHVybiBhcnJheSgkdG9rZW4sIG5ldyBVbmRlZmluZWQoKSk7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHN0cmluZ0ludGVycG9sYXRpb24oJG1hdGNoKQp7CnN3aXRjaCAoJG1hdGNoWzBdKSB7CmNhc2UgJ1xcXFwnOgpyZXR1cm4gJ1xcJzsKY2FzZSAnXCInOgpyZXR1cm4gJyInOwpjYXNlICdcYic6CnJldHVybiBcY2hyKDgpOwpjYXNlICdcZic6CnJldHVybiBcY2hyKDEyKTsKY2FzZSAnXG4nOgpyZXR1cm4gIlxuIjsKY2FzZSAnXHInOgpyZXR1cm4gIlxyIjsKY2FzZSAnXHQnOgpyZXR1cm4gIlx0IjsKY2FzZSAnXC8nOgpyZXR1cm4gIi8iOwpkZWZhdWx0OgpyZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKCcmI3gnLmx0cmltKHN1YnN0cigkbWF0Y2hbMF0sIDIpLCAnMCcpLic7JywgRU5UX1FVT1RFUywgJ1VURi04Jyk7Cn0KfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcG9wU3RhY2soJG4pCnsKJHRoaXMtPnN0YWNrID0gXGFycmF5X3NsaWNlKCR0aGlzLT5zdGFjaywgMCwgLSAoMiAqICRuKSk7CiR0aGlzLT52c3RhY2sgPSBcYXJyYXlfc2xpY2UoJHRoaXMtPnZzdGFjaywgMCwgLSAkbik7CiR0aGlzLT5sc3RhY2sgPSBcYXJyYXlfc2xpY2UoJHRoaXMtPmxzdGFjaywgMCwgLSAkbik7Cn0KCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZhaWxPbkJPTSgkaW5wdXQpCnsKCiRib20gPSAiXHhFRlx4QkJceEJGIjsKCmlmIChzdWJzdHIoJGlucHV0LCAwLCAzKSA9PT0gJGJvbSkgewokdGhpcy0+cGFyc2VFcnJvcigiQk9NIGRldGVjdGVkLCBtYWtlIHN1cmUgeW91ciBpbnB1dCBkb2VzIG5vdCBpbmNsdWRlIGEgVW5pY29kZSBCeXRlLU9yZGVyLU1hcmsiKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTZWxkXEpzb25MaW50OwoKCgoKCgpjbGFzcyBMZXhlcgp7Cgpjb25zdCBFT0YgPSAxOwoKY29uc3QgVF9JTlZBTElEID0gLTE7CmNvbnN0IFRfU0tJUF9XSElURVNQQUNFID0gMDsKY29uc3QgVF9FUlJPUiA9IDI7Cgpjb25zdCBUX0JSRUFLX0xJTkUgPSAzOwoKY29uc3QgVF9DT01NRU5UID0gMzA7Cgpjb25zdCBUX09QRU5fQ09NTUVOVCA9IDMxOwoKY29uc3QgVF9DTE9TRV9DT01NRU5UID0gMzI7CgoKCgoKcHJpdmF0ZSAkcnVsZXMgPSBhcnJheSgKMCA9PiAnL1xHXHMqXG5ccj8vJywKMSA9PiAnL1xHXHMrLycsCjIgPT4gJy9cRy0/KFswLTldfFsxLTldWzAtOV0rKShcLlswLTldKyk/KFtlRV1bKy1dP1swLTldKyk/XGIvJywKMyA9PiAne1xHIig/PlxcXFxbImJmbnJ0L1xcXFxdfFxcXFx1W2EtZkEtRjAtOV17NH18W15cMC1ceDFmXFxcXCJdKyspKisifScsCjQgPT4gJy9cR1x7LycsCjUgPT4gJy9cR1x9LycsCjYgPT4gJy9cR1xbLycsCjcgPT4gJy9cR1xdLycsCjggPT4gJy9cRywvJywKOSA9PiAnL1xHOi8nLAoxMCA9PiAnL1xHdHJ1ZVxiLycsCjExID0+ICcvXEdmYWxzZVxiLycsCjEyID0+ICcvXEdudWxsXGIvJywKMTMgPT4gJy9cRyQvJywKMTQgPT4gJy9cR1wvXC8vJywKMTUgPT4gJy9cR1wvXCovJywKMTYgPT4gJy9cR1wqXC8vJywKMTcgPT4gJy9cRy4vJywKKTsKCgpwcml2YXRlICRpbnB1dDsKCnByaXZhdGUgJG1vcmU7Cgpwcml2YXRlICRkb25lOwoKcHJpdmF0ZSAkb2Zmc2V0OwoKcHJpdmF0ZSAkZmxhZ3M7CgoKcHVibGljICRtYXRjaDsKCnB1YmxpYyAkeXlsaW5lbm87CgpwdWJsaWMgJHl5bGVuZzsKCnB1YmxpYyAkeXl0ZXh0OwoKcHVibGljICR5eWxsb2M7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZsYWdzID0gMCkKewokdGhpcy0+ZmxhZ3MgPSAkZmxhZ3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBsZXgoKQp7CndoaWxlICh0cnVlKSB7CiRzeW1ib2wgPSAkdGhpcy0+bmV4dCgpOwpzd2l0Y2ggKCRzeW1ib2wpIHsKY2FzZSBzZWxmOjpUX1NLSVBfV0hJVEVTUEFDRToKY2FzZSBzZWxmOjpUX0JSRUFLX0xJTkU6CmJyZWFrOwpjYXNlIHNlbGY6OlRfQ09NTUVOVDoKY2FzZSBzZWxmOjpUX09QRU5fQ09NTUVOVDoKaWYgKCEoJHRoaXMtPmZsYWdzICYgSnNvblBhcnNlcjo6QUxMT1dfQ09NTUVOVFMpKSB7CiR0aGlzLT5wYXJzZUVycm9yKCdMZXhpY2FsIGVycm9yIG9uIGxpbmUgJyAuICgkdGhpcy0+eXlsaW5lbm8rMSkgLiAiLiBDb21tZW50cyBhcmUgbm90IGFsbG93ZWQuXG4iIC4gJHRoaXMtPnNob3dQb3NpdGlvbigpKTsKfQokdGhpcy0+c2tpcFVudGlsKCRzeW1ib2wgPT09IHNlbGY6OlRfQ09NTUVOVCA/IHNlbGY6OlRfQlJFQUtfTElORSA6IHNlbGY6OlRfQ0xPU0VfQ09NTUVOVCk7CmlmICgkdGhpcy0+ZG9uZSkgewoKcmV0dXJuIDE0Owp9CmJyZWFrOwpjYXNlIHNlbGY6OlRfQ0xPU0VfQ09NTUVOVDoKJHRoaXMtPnBhcnNlRXJyb3IoJ0xleGljYWwgZXJyb3Igb24gbGluZSAnIC4gKCR0aGlzLT55eWxpbmVubysxKSAuICIuIFVuZXhwZWN0ZWQgdG9rZW4uXG4iIC4gJHRoaXMtPnNob3dQb3NpdGlvbigpKTsKZGVmYXVsdDoKcmV0dXJuICRzeW1ib2w7Cn0KfQp9CgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElucHV0KCRpbnB1dCkKewokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7CiR0aGlzLT5tb3JlID0gZmFsc2U7CiR0aGlzLT5kb25lID0gZmFsc2U7CiR0aGlzLT5vZmZzZXQgPSAwOwokdGhpcy0+eXlsaW5lbm8gPSAkdGhpcy0+eXlsZW5nID0gMDsKJHRoaXMtPnl5dGV4dCA9ICR0aGlzLT5tYXRjaCA9ICcnOwokdGhpcy0+eXlsbG9jID0gYXJyYXkoJ2ZpcnN0X2xpbmUnID0+IDEsICdmaXJzdF9jb2x1bW4nID0+IDAsICdsYXN0X2xpbmUnID0+IDEsICdsYXN0X2NvbHVtbicgPT4gMCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzaG93UG9zaXRpb24oKQp7CmlmICgkdGhpcy0+eXlsaW5lbm8gPT09IDAgJiYgJHRoaXMtPm9mZnNldCA9PT0gMSAmJiAkdGhpcy0+bWF0Y2ggIT09ICd7JykgewpyZXR1cm4gJHRoaXMtPm1hdGNoLicuLi4nIC4gIlxuXiI7Cn0KCiRwcmUgPSBzdHJfcmVwbGFjZSgiXG4iLCAnJywgJHRoaXMtPmdldFBhc3RJbnB1dCgpKTsKJGMgPSBzdHJfcmVwZWF0KCctJywgbWF4KDAsIFxzdHJsZW4oJHByZSkgLSAxKSk7IAoKcmV0dXJuICRwcmUgLiBzdHJfcmVwbGFjZSgiXG4iLCAnJywgJHRoaXMtPmdldFVwY29taW5nSW5wdXQoKSkgLiAiXG4iIC4gJGMgLiAiXiI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXN0SW5wdXQoKQp7CiRwYXN0TGVuZ3RoID0gJHRoaXMtPm9mZnNldCAtIFxzdHJsZW4oJHRoaXMtPm1hdGNoKTsKCnJldHVybiAoJHBhc3RMZW5ndGggPiAyMCA/ICcuLi4nIDogJycpIC4gc3Vic3RyKCR0aGlzLT5pbnB1dCwgbWF4KDAsICRwYXN0TGVuZ3RoIC0gMjApLCBtaW4oMjAsICRwYXN0TGVuZ3RoKSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRVcGNvbWluZ0lucHV0KCkKewokbmV4dCA9ICR0aGlzLT5tYXRjaDsKaWYgKFxzdHJsZW4oJG5leHQpIDwgMjApIHsKJG5leHQgLj0gc3Vic3RyKCR0aGlzLT5pbnB1dCwgJHRoaXMtPm9mZnNldCwgMjAgLSBcc3RybGVuKCRuZXh0KSk7Cn0KCnJldHVybiBzdWJzdHIoJG5leHQsIDAsIDIwKSAuIChcc3RybGVuKCRuZXh0KSA+IDIwID8gJy4uLicgOiAnJyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGdWxsVXBjb21pbmdJbnB1dCgpCnsKJG5leHQgPSAkdGhpcy0+bWF0Y2g7CmlmIChzdWJzdHIoJG5leHQsIDAsIDEpID09PSAnIicgJiYgc3Vic3RyX2NvdW50KCRuZXh0LCAnIicpID09PSAxKSB7CiRsZW4gPSBcc3RybGVuKCR0aGlzLT5pbnB1dCk7CmlmICgkbGVuID09PSAkdGhpcy0+b2Zmc2V0KSB7CiRzdHJFbmQgPSAkbGVuOwp9IGVsc2Ugewokc3RyRW5kID0gbWluKHN0cnBvcygkdGhpcy0+aW5wdXQsICciJywgJHRoaXMtPm9mZnNldCArIDEpID86ICRsZW4sIHN0cnBvcygkdGhpcy0+aW5wdXQsICJcbiIsICR0aGlzLT5vZmZzZXQgKyAxKSA/OiAkbGVuKTsKfQokbmV4dCAuPSBzdWJzdHIoJHRoaXMtPmlucHV0LCAkdGhpcy0+b2Zmc2V0LCAkc3RyRW5kIC0gJHRoaXMtPm9mZnNldCk7Cn0gZWxzZWlmIChcc3RybGVuKCRuZXh0KSA8IDIwKSB7CiRuZXh0IC49IHN1YnN0cigkdGhpcy0+aW5wdXQsICR0aGlzLT5vZmZzZXQsIDIwIC0gXHN0cmxlbigkbmV4dCkpOwp9CgpyZXR1cm4gJG5leHQ7Cn0KCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gcGFyc2VFcnJvcigkc3RyKQp7CnRocm93IG5ldyBQYXJzaW5nRXhjZXB0aW9uKCRzdHIpOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBza2lwVW50aWwoJHRva2VuKQp7CiRzeW1ib2wgPSAkdGhpcy0+bmV4dCgpOwp3aGlsZSAoJHN5bWJvbCAhPT0gJHRva2VuICYmIGZhbHNlID09PSAkdGhpcy0+ZG9uZSkgewokc3ltYm9sID0gJHRoaXMtPm5leHQoKTsKfQp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG5leHQoKQp7CmlmICgkdGhpcy0+ZG9uZSkgewpyZXR1cm4gc2VsZjo6RU9GOwp9CmlmICgkdGhpcy0+b2Zmc2V0ID09PSBcc3RybGVuKCR0aGlzLT5pbnB1dCkpIHsKJHRoaXMtPmRvbmUgPSB0cnVlOwp9CgokdG9rZW4gPSBudWxsOwokbWF0Y2ggPSBudWxsOwokY29sID0gbnVsbDsKJGxpbmVzID0gbnVsbDsKCmlmICghJHRoaXMtPm1vcmUpIHsKJHRoaXMtPnl5dGV4dCA9ICcnOwokdGhpcy0+bWF0Y2ggPSAnJzsKfQoKJHJ1bGVzTGVuID0gY291bnQoJHRoaXMtPnJ1bGVzKTsKCmZvciAoJGk9MDsgJGkgPCAkcnVsZXNMZW47ICRpKyspIHsKaWYgKHByZWdfbWF0Y2goJHRoaXMtPnJ1bGVzWyRpXSwgJHRoaXMtPmlucHV0LCAkbWF0Y2gsIDAsICR0aGlzLT5vZmZzZXQpKSB7CiRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJG1hdGNoWzBdKTsKYXJyYXlfc2hpZnQoJGxpbmVzKTsKJGxpbmVDb3VudCA9IFxjb3VudCgkbGluZXMpOwokdGhpcy0+eXlsaW5lbm8gKz0gJGxpbmVDb3VudDsKJHRoaXMtPnl5bGxvYyA9IGFycmF5KAonZmlyc3RfbGluZScgPT4gJHRoaXMtPnl5bGxvY1snbGFzdF9saW5lJ10sCidsYXN0X2xpbmUnID0+ICR0aGlzLT55eWxpbmVubysxLAonZmlyc3RfY29sdW1uJyA9PiAkdGhpcy0+eXlsbG9jWydsYXN0X2NvbHVtbiddLAonbGFzdF9jb2x1bW4nID0+ICRsaW5lQ291bnQgPiAwID8gXHN0cmxlbigkbGluZXNbJGxpbmVDb3VudCAtIDFdKSA6ICR0aGlzLT55eWxsb2NbJ2xhc3RfY29sdW1uJ10gKyBcc3RybGVuKCRtYXRjaFswXSksCik7CiR0aGlzLT55eXRleHQgLj0gJG1hdGNoWzBdOwokdGhpcy0+bWF0Y2ggLj0gJG1hdGNoWzBdOwokdGhpcy0+eXlsZW5nID0gXHN0cmxlbigkdGhpcy0+eXl0ZXh0KTsKJHRoaXMtPm1vcmUgPSBmYWxzZTsKJHRoaXMtPm9mZnNldCArPSBcc3RybGVuKCRtYXRjaFswXSk7CnJldHVybiAkdGhpcy0+cGVyZm9ybUFjdGlvbigkaSk7Cn0KfQoKaWYgKCR0aGlzLT5vZmZzZXQgPT09IFxzdHJsZW4oJHRoaXMtPmlucHV0KSkgewpyZXR1cm4gc2VsZjo6RU9GOwp9CgokdGhpcy0+cGFyc2VFcnJvcigKJ0xleGljYWwgZXJyb3Igb24gbGluZSAnIC4gKCR0aGlzLT55eWxpbmVubysxKSAuICIuIFVucmVjb2duaXplZCB0ZXh0LlxuIiAuICR0aGlzLT5zaG93UG9zaXRpb24oKQopOwp9CgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwZXJmb3JtQWN0aW9uKCRydWxlKQp7CnN3aXRjaCAoJHJ1bGUpIHsKY2FzZSAwOgpyZXR1cm4gc2VsZjo6VF9CUkVBS19MSU5FOwpjYXNlIDE6CnJldHVybiBzZWxmOjpUX1NLSVBfV0hJVEVTUEFDRTsKY2FzZSAyOgpyZXR1cm4gNjsKY2FzZSAzOgokdGhpcy0+eXl0ZXh0ID0gc3Vic3RyKCR0aGlzLT55eXRleHQsIDEsICR0aGlzLT55eWxlbmctMik7CnJldHVybiA0OwpjYXNlIDQ6CnJldHVybiAxNzsKY2FzZSA1OgpyZXR1cm4gMTg7CmNhc2UgNjoKcmV0dXJuIDIzOwpjYXNlIDc6CnJldHVybiAyNDsKY2FzZSA4OgpyZXR1cm4gMjI7CmNhc2UgOToKcmV0dXJuIDIxOwpjYXNlIDEwOgpyZXR1cm4gMTA7CmNhc2UgMTE6CnJldHVybiAxMTsKY2FzZSAxMjoKcmV0dXJuIDg7CmNhc2UgMTM6CnJldHVybiAxNDsKY2FzZSAxNDoKcmV0dXJuIHNlbGY6OlRfQ09NTUVOVDsKY2FzZSAxNToKcmV0dXJuIHNlbGY6OlRfT1BFTl9DT01NRU5UOwpjYXNlIDE2OgpyZXR1cm4gc2VsZjo6VF9DTE9TRV9DT01NRU5UOwpjYXNlIDE3OgpyZXR1cm4gc2VsZjo6VF9JTlZBTElEOwpkZWZhdWx0Ogp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdVbnN1cHBvcnRlZCBydWxlICcuJHJ1bGUpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcSnNvbkxpbnQ7CgpjbGFzcyBQYXJzaW5nRXhjZXB0aW9uIGV4dGVuZHMgXEV4Y2VwdGlvbgp7CgoKCnByb3RlY3RlZCAkZGV0YWlsczsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRkZXRhaWxzID0gYXJyYXkoKSkKewokdGhpcy0+ZGV0YWlscyA9ICRkZXRhaWxzOwpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldERldGFpbHMoKQp7CnJldHVybiAkdGhpcy0+ZGV0YWlsczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxKc29uTGludDsKCmNsYXNzIFVuZGVmaW5lZAp7Cn0KCkNvcHlyaWdodCAoYykgMjAxNSBKb3JkaSBCb2dnaWFubwoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU2VsZFxQaGFyVXRpbHM7CgpjbGFzcyBMaW50ZXIKewoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxpbnQoJHBhdGgsIGFycmF5ICRleGNsdWRlZFBhdGhzID0gYXJyYXkoKSkKewokcGhwID0gZGVmaW5lZCgnUEhQX0JJTkFSWScpID8gUEhQX0JJTkFSWSA6ICdwaHAnOwoKaWYgKCRpc1dpbmRvd3MgPSBkZWZpbmVkKCdQSFBfV0lORE9XU19WRVJTSU9OX0JVSUxEJykpIHsKJHRtcEZpbGUgPSBAdGVtcG5hbShzeXNfZ2V0X3RlbXBfZGlyKCksICcnKTsKCmlmICghJHRtcEZpbGUgfHwgIWlzX3dyaXRhYmxlKCR0bXBGaWxlKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBjcmVhdGUgdGVtcCBmaWxlJyk7Cn0KCiRwaHAgPSBzZWxmOjplc2NhcGVXaW5kb3dzUGF0aCgkcGhwKTsKJHRtcEZpbGUgPSBzZWxmOjplc2NhcGVXaW5kb3dzUGF0aCgkdG1wRmlsZSk7CgoKaWYgKFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CiRmb3JtYXQgPSAnJXMgLWwgJXMnOwp9IGVsc2UgewokZm9ybWF0ID0gJyIlcyAtbCAlcyInOwp9CgokY29tbWFuZCA9IHNwcmludGYoJGZvcm1hdCwgJHBocCwgJHRtcEZpbGUpOwp9IGVsc2UgewokY29tbWFuZCA9ICInIi4kcGhwLiInIC1sIjsKfQoKJGRlc2NyaXB0b3JzcGVjID0gYXJyYXkoCjAgPT4gYXJyYXkoJ3BpcGUnLCAncicpLAoxID0+IGFycmF5KCdwaXBlJywgJ3cnKSwKMiA9PiBhcnJheSgncGlwZScsICd3JykKKTsKCgokYmFzZUxlbiA9IHN0cmxlbihyZWFscGF0aCgkcGF0aCkpICsgNyArIDE7CmZvcmVhY2ggKG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcihuZXcgXFBoYXIoJHBhdGgpKSBhcyAkZmlsZSkgewppZiAoJGZpbGUtPmlzRGlyKCkpIHsKY29udGludWU7Cn0KaWYgKHN1YnN0cigkZmlsZSwgLTQpID09PSAnLnBocCcpIHsKJGZpbGVuYW1lID0gKHN0cmluZykgJGZpbGU7CmlmIChpbl9hcnJheShzdWJzdHIoJGZpbGVuYW1lLCAkYmFzZUxlbiksICRleGNsdWRlZFBhdGhzLCB0cnVlKSkgewpjb250aW51ZTsKfQppZiAoJGlzV2luZG93cykgewpmaWxlX3B1dF9jb250ZW50cygkdG1wRmlsZSwgZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKSk7Cn0KCiRwcm9jZXNzID0gcHJvY19vcGVuKCRjb21tYW5kLCAkZGVzY3JpcHRvcnNwZWMsICRwaXBlcyk7CmlmIChpc19yZXNvdXJjZSgkcHJvY2VzcykpIHsKaWYgKCEkaXNXaW5kb3dzKSB7CmZ3cml0ZSgkcGlwZXNbMF0sIGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlbmFtZSkpOwp9CmZjbG9zZSgkcGlwZXNbMF0pOwoKJHN0ZG91dCA9IHN0cmVhbV9nZXRfY29udGVudHMoJHBpcGVzWzFdKTsKZmNsb3NlKCRwaXBlc1sxXSk7CiRzdGRlcnIgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRwaXBlc1syXSk7CmZjbG9zZSgkcGlwZXNbMl0pOwoKJGV4aXRDb2RlID0gcHJvY19jbG9zZSgkcHJvY2Vzcyk7CgppZiAoJGV4aXRDb2RlICE9PSAwKSB7CmlmICgkaXNXaW5kb3dzKSB7CiRzdGRlcnIgPSBzdHJfcmVwbGFjZSgkdG1wRmlsZSwgJGZpbGVuYW1lLCAkc3RkZXJyKTsKfQp0aHJvdyBuZXcgXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbignRmFpbGVkIGxpbnRpbmcgJy4kZmlsZS4nOiAnLiRzdGRlcnIpOwp9Cn0gZWxzZSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignQ291bGQgbm90IHN0YXJ0IGxpbnRlciBwcm9jZXNzJyk7Cn0KfQp9CgppZiAoJGlzV2luZG93cykgewpAdW5saW5rKCR0bXBGaWxlKTsKfQp9CgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBlc2NhcGVXaW5kb3dzUGF0aCgkcGF0aCkKewoKaWYgKHN0cnBicmsoJHBhdGgsICIgKCkiKSAhPT0gZmFsc2UpIHsKJHBhdGggPSAnIicuJHBhdGguJyInOwp9CgpyZXR1cm4gJHBhdGg7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcUGhhclV0aWxzOwoKY2xhc3MgVGltZXN0YW1wcwp7CnByaXZhdGUgJGNvbnRlbnRzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRmaWxlKQp7CiR0aGlzLT5jb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCRmaWxlKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1cGRhdGVUaW1lc3RhbXBzKCR0aW1lc3RhbXAgPSBudWxsKQp7CmlmICgkdGltZXN0YW1wIGluc3RhbmNlb2YgXERhdGVUaW1lIHx8ICR0aW1lc3RhbXAgaW5zdGFuY2VvZiBcRGF0ZVRpbWVJbnRlcmZhY2UpIHsKJHRpbWVzdGFtcCA9ICR0aW1lc3RhbXAtPmdldFRpbWVzdGFtcCgpOwp9IGVsc2VpZiAoaXNfc3RyaW5nKCR0aW1lc3RhbXApKSB7CiR0aW1lc3RhbXAgPSBzdHJ0b3RpbWUoJHRpbWVzdGFtcCk7Cn0gZWxzZWlmICghaXNfaW50KCR0aW1lc3RhbXApKSB7CiR0aW1lc3RhbXAgPSBzdHJ0b3RpbWUoJzE5ODQtMTItMjRUMDA6MDA6MDBaJyk7Cn0KCgppZiAoIXByZWdfbWF0Y2goJ3tfX0hBTFRfQ09NUElMRVJcKFwpOyg/OiArXD8+KT9ccj9cbn0nLCAkdGhpcy0+Y29udGVudHMsICRtYXRjaCwgUFJFR19PRkZTRVRfQ0FQVFVSRSkpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKCdDb3VsZCBub3QgZGV0ZWN0IHRoZSBzdHViXCdzIGVuZCBpbiB0aGUgcGhhcicpOwp9CgoKJHBvcyA9ICRtYXRjaFswXVsxXSArIHN0cmxlbigkbWF0Y2hbMF1bMF0pOwokc3R1YkVuZCA9ICRwb3MgKyAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNDsKCiRudW1GaWxlcyA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0OwoKCiRwb3MgKz0gMjsKCgokcG9zICs9IDQ7CgokYWxpYXNMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRhbGlhc0xlbmd0aDsKCiRtZXRhZGF0YUxlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJG1ldGFkYXRhTGVuZ3RoOwoKd2hpbGUgKCRwb3MgPCAkc3R1YkVuZCkgewokZmlsZW5hbWVMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRmaWxlbmFtZUxlbmd0aDsKCgokcG9zICs9IDQ7CgoKJHRpbWVTdGFtcEJ5dGVzID0gcGFjaygnTCcsICR0aW1lc3RhbXApOwokdGhpcy0+Y29udGVudHNbJHBvcyArIDBdID0gJHRpbWVTdGFtcEJ5dGVzWzBdOwokdGhpcy0+Y29udGVudHNbJHBvcyArIDFdID0gJHRpbWVTdGFtcEJ5dGVzWzFdOwokdGhpcy0+Y29udGVudHNbJHBvcyArIDJdID0gJHRpbWVTdGFtcEJ5dGVzWzJdOwokdGhpcy0+Y29udGVudHNbJHBvcyArIDNdID0gJHRpbWVTdGFtcEJ5dGVzWzNdOwoKCiRwb3MgKz0gNCo0OwoKJG1ldGFkYXRhTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkbWV0YWRhdGFMZW5ndGg7CgokbnVtRmlsZXMtLTsKfQoKaWYgKCRudW1GaWxlcyAhPT0gMCkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdBbGwgZmlsZXMgd2VyZSBub3QgcHJvY2Vzc2VkLCBzb21ldGhpbmcgbXVzdCBoYXZlIGdvbmUgd3JvbmcnKTsKfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNhdmUoJHBhdGgsICRzaWduYXR1cmVBbGdvKQp7CiRwb3MgPSAkdGhpcy0+ZGV0ZXJtaW5lU2lnbmF0dXJlQmVnaW4oKTsKCiRhbGdvcyA9IGFycmF5KApcUGhhcjo6TUQ1ID0+ICdtZDUnLApcUGhhcjo6U0hBMSA9PiAnc2hhMScsClxQaGFyOjpTSEEyNTYgPT4gJ3NoYTI1NicsClxQaGFyOjpTSEE1MTIgPT4gJ3NoYTUxMicsCik7CgppZiAoIWlzc2V0KCRhbGdvc1skc2lnbmF0dXJlQWxnb10pKSB7CnRocm93IG5ldyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uKCdJbnZhbGlkIGhhc2ggYWxnb3JpdGhtIGdpdmVuOiAnLiRzaWduYXR1cmVBbGdvLicgZXhwZWN0ZWQgb25lIG9mIFBoYXI6Ok1ENSwgUGhhcjo6U0hBMSwgUGhhcjo6U0hBMjU2IG9yIFBoYXI6OlNIQTUxMicpOwp9CiRhbGdvID0gJGFsZ29zWyRzaWduYXR1cmVBbGdvXTsKCgoKJHNpZ25hdHVyZSA9IGhhc2goJGFsZ28sIHN1YnN0cigkdGhpcy0+Y29udGVudHMsIDAsICRwb3MpLCB0cnVlKQoKLiBwYWNrKCdMJywgJHNpZ25hdHVyZUFsZ28pCgouICdHQk1CJzsKCiR0aGlzLT5jb250ZW50cyA9IHN1YnN0cigkdGhpcy0+Y29udGVudHMsIDAsICRwb3MpIC4gJHNpZ25hdHVyZTsKCnJldHVybiBmaWxlX3B1dF9jb250ZW50cygkcGF0aCwgJHRoaXMtPmNvbnRlbnRzKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiByZWFkVWludCgkcG9zLCAkYnl0ZXMpCnsKJHJlcyA9IHVucGFjaygnVicsIHN1YnN0cigkdGhpcy0+Y29udGVudHMsICRwb3MsICRieXRlcykpOwoKcmV0dXJuICRyZXNbMV07Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkZXRlcm1pbmVTaWduYXR1cmVCZWdpbigpCnsKCmlmICghcHJlZ19tYXRjaCgne19fSEFMVF9DT01QSUxFUlwoXCk7KD86ICtcPz4pP1xyP1xufScsICR0aGlzLT5jb250ZW50cywgJG1hdGNoLCBQUkVHX09GRlNFVF9DQVBUVVJFKSkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ0NvdWxkIG5vdCBkZXRlY3QgdGhlIHN0dWJcJ3MgZW5kIGluIHRoZSBwaGFyJyk7Cn0KCgokcG9zID0gJG1hdGNoWzBdWzFdICsgc3RybGVuKCRtYXRjaFswXVswXSk7CiRtYW5pZmVzdEVuZCA9ICRwb3MgKyA0ICsgJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwoKJHBvcyArPSA0OwokbnVtRmlsZXMgPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CgokcG9zICs9IDQ7CgoKJHBvcyArPSAyOwoKCiRwb3MgKz0gNDsKCiRhbGlhc0xlbmd0aCA9ICR0aGlzLT5yZWFkVWludCgkcG9zLCA0KTsKJHBvcyArPSA0ICsgJGFsaWFzTGVuZ3RoOwoKJG1ldGFkYXRhTGVuZ3RoID0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwokcG9zICs9IDQgKyAkbWV0YWRhdGFMZW5ndGg7CgokY29tcHJlc3NlZFNpemVzID0gMDsKd2hpbGUgKCgkbnVtRmlsZXMgPiAwKSAmJiAoJHBvcyA8ICRtYW5pZmVzdEVuZCAtIDI0KSkgewokZmlsZW5hbWVMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRmaWxlbmFtZUxlbmd0aDsKCgokcG9zICs9IDIqNDsKCiRjb21wcmVzc2VkU2l6ZXMgKz0gJHRoaXMtPnJlYWRVaW50KCRwb3MsIDQpOwoKJHBvcyArPSAzKjQ7CgokbWV0YWRhdGFMZW5ndGggPSAkdGhpcy0+cmVhZFVpbnQoJHBvcywgNCk7CiRwb3MgKz0gNCArICRtZXRhZGF0YUxlbmd0aDsKCiRudW1GaWxlcy0tOwp9CgppZiAoJG51bUZpbGVzICE9PSAwKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ0FsbCBmaWxlcyB3ZXJlIG5vdCBwcm9jZXNzZWQsIHNvbWV0aGluZyBtdXN0IGhhdmUgZ29uZSB3cm9uZycpOwp9CgpyZXR1cm4gJG1hbmlmZXN0RW5kICsgJGNvbXByZXNzZWRTaXplczsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUgSm9yZGkgQm9nZ2lhbm8KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFNlbGRcU2lnbmFsOwoKdXNlIFBzclxMb2dcTG9nZ2VySW50ZXJmYWNlOwp1c2UgQ2xvc3VyZTsKdXNlIFdlYWtSZWZlcmVuY2U7CgoKCgpmaW5hbCBjbGFzcyBTaWduYWxIYW5kbGVyCnsKCgoKCgoKCnB1YmxpYyBjb25zdCBTSUdIVVAgPSAnU0lHSFVQJzsKCgoKCgoKCgpwdWJsaWMgY29uc3QgU0lHSU5UID0gJ1NJR0lOVCc7CgoKCgoKcHVibGljIGNvbnN0IFNJR1FVSVQgPSAnU0lHUVVJVCc7CgoKCgoKcHVibGljIGNvbnN0IFNJR0lMTCA9ICdTSUdJTEwnOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHVFJBUCA9ICdTSUdUUkFQJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR0FCUlQgPSAnU0lHQUJSVCc7CgpwdWJsaWMgY29uc3QgU0lHSU9UID0gJ1NJR0lPVCc7CgoKCgoKcHVibGljIGNvbnN0IFNJR0JVUyA9ICdTSUdCVVMnOwoKcHVibGljIGNvbnN0IFNJR0ZQRSA9ICdTSUdGUEUnOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHS0lMTCA9ICdTSUdLSUxMJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdVU1IxID0gJ1NJR1VTUjEnOwoKCgoKcHVibGljIGNvbnN0IFNJR1VTUjIgPSAnU0lHVVNSMic7CgoKCgoKcHVibGljIGNvbnN0IFNJR1NFR1YgPSAnU0lHU0VHVic7CgoKCgoKcHVibGljIGNvbnN0IFNJR1BJUEUgPSAnU0lHUElQRSc7CgoKCgoKCgpwdWJsaWMgY29uc3QgU0lHQUxSTSA9ICdTSUdBTFJNJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1RFUk0gPSAnU0lHVEVSTSc7CgpwdWJsaWMgY29uc3QgU0lHU1RLRkxUID0gJ1NJR1NUS0ZMVCc7CnB1YmxpYyBjb25zdCBTSUdDTEQgPSAnU0lHQ0xEJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR0NITEQgPSAnU0lHQ0hMRCc7CgoKCgoKcHVibGljIGNvbnN0IFNJR0NPTlQgPSAnU0lHQ09OVCc7CgoKCgpwdWJsaWMgY29uc3QgU0lHU1RPUCA9ICdTSUdTVE9QJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1RTVFAgPSAnU0lHVFNUUCc7CgoKCgoKcHVibGljIGNvbnN0IFNJR1RUSU4gPSAnU0lHVFRJTic7CgoKCgoKcHVibGljIGNvbnN0IFNJR1RUT1UgPSAnU0lHVFRPVSc7CgoKCgpwdWJsaWMgY29uc3QgU0lHVVJHID0gJ1NJR1VSRyc7CgoKCgoKCgpwdWJsaWMgY29uc3QgU0lHWENQVSA9ICdTSUdYQ1BVJzsKCgoKCnB1YmxpYyBjb25zdCBTSUdYRlNaID0gJ1NJR1hGU1onOwoKCgoKCnB1YmxpYyBjb25zdCBTSUdWVEFMUk0gPSAnU0lHVlRBTFJNJzsKCgoKCgoKcHVibGljIGNvbnN0IFNJR1BST0YgPSAnU0lHUFJPRic7CgoKCgpwdWJsaWMgY29uc3QgU0lHV0lOQ0ggPSAnU0lHV0lOQ0gnOwoKCgoKCgpwdWJsaWMgY29uc3QgU0lHUE9MTCA9ICdTSUdQT0xMJzsKCnB1YmxpYyBjb25zdCBTSUdJTyA9ICdTSUdJTyc7CgoKCgpwdWJsaWMgY29uc3QgU0lHUFdSID0gJ1NJR1BXUic7CgoKCgoKcHVibGljIGNvbnN0IFNJR1NZUyA9ICdTSUdTWVMnOwoKcHVibGljIGNvbnN0IFNJR0JBQlkgPSAnU0lHQkFCWSc7CgoKCgpwdWJsaWMgY29uc3QgU0lHQlJFQUsgPSAnU0lHQlJFQUsnOwoKcHJpdmF0ZSBjb25zdCBBTExfU0lHTkFMUyA9IFsKc2VsZjo6U0lHSFVQLCBzZWxmOjpTSUdJTlQsIHNlbGY6OlNJR1FVSVQsIHNlbGY6OlNJR0lMTCwgc2VsZjo6U0lHVFJBUCwgc2VsZjo6U0lHQUJSVCwgc2VsZjo6U0lHSU9ULCBzZWxmOjpTSUdCVVMsCnNlbGY6OlNJR0ZQRSwgc2VsZjo6U0lHS0lMTCwgc2VsZjo6U0lHVVNSMSwgc2VsZjo6U0lHVVNSMiwgc2VsZjo6U0lHU0VHViwgc2VsZjo6U0lHUElQRSwgc2VsZjo6U0lHQUxSTSwgc2VsZjo6U0lHVEVSTSwKc2VsZjo6U0lHU1RLRkxULCBzZWxmOjpTSUdDTEQsIHNlbGY6OlNJR0NITEQsIHNlbGY6OlNJR0NPTlQsIHNlbGY6OlNJR1NUT1AsIHNlbGY6OlNJR1RTVFAsIHNlbGY6OlNJR1RUSU4sIHNlbGY6OlNJR1RUT1UsCnNlbGY6OlNJR1VSRywgc2VsZjo6U0lHWENQVSwgc2VsZjo6U0lHWEZTWiwgc2VsZjo6U0lHVlRBTFJNLCBzZWxmOjpTSUdQUk9GLCBzZWxmOjpTSUdXSU5DSCwgc2VsZjo6U0lHUE9MTCwgc2VsZjo6U0lHSU8sCnNlbGY6OlNJR1BXUiwgc2VsZjo6U0lHU1lTLCBzZWxmOjpTSUdCQUJZLCBzZWxmOjpTSUdCUkVBSwpdOwoKCgoKcHJpdmF0ZSAkdHJpZ2dlcmVkID0gbnVsbDsKCgoKCgpwcml2YXRlICRzaWduYWxzOwoKCgoKCnByaXZhdGUgJGxvZ2dlck9yQ2FsbGJhY2s7CgoKCgpwcml2YXRlIHN0YXRpYyAkaGFuZGxlcnMgPSBbXTsKCgpwcml2YXRlIHN0YXRpYyAkd2luZG93c0hhbmRsZXIgPSBudWxsOwoKCgoKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHNpZ25hbHMsICRsb2dnZXJPckNhbGxiYWNrKQp7CmlmICghaXNfY2FsbGFibGUoJGxvZ2dlck9yQ2FsbGJhY2spICYmICEkbG9nZ2VyT3JDYWxsYmFjayBpbnN0YW5jZW9mIExvZ2dlckludGVyZmFjZSAmJiAkbG9nZ2VyT3JDYWxsYmFjayAhPT0gbnVsbCkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJGxvZ2dlck9yQ2FsbGJhY2sgbXVzdCBiZSBhICcuTG9nZ2VySW50ZXJmYWNlOjpjbGFzcy4nIGluc3RhbmNlLCBhIGNhbGxhYmxlLCBvciBudWxsLCAnLihpc19vYmplY3QoJGxvZ2dlck9yQ2FsbGJhY2spID8gZ2V0X2NsYXNzKCRsb2dnZXJPckNhbGxiYWNrKSA6IGdldHR5cGUoJGxvZ2dlck9yQ2FsbGJhY2spKS4nIHJlY2VpdmVkLicpOwp9CgokdGhpcy0+c2lnbmFscyA9ICRzaWduYWxzOwokdGhpcy0+bG9nZ2VyT3JDYWxsYmFjayA9ICRsb2dnZXJPckNhbGxiYWNrOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIHRyaWdnZXIoc3RyaW5nICRzaWduYWxOYW1lKTogdm9pZAp7CiR0aGlzLT50cmlnZ2VyZWQgPSAkc2lnbmFsTmFtZTsKCmlmICgkdGhpcy0+bG9nZ2VyT3JDYWxsYmFjayBpbnN0YW5jZW9mIExvZ2dlckludGVyZmFjZSkgewokdGhpcy0+bG9nZ2VyT3JDYWxsYmFjay0+aW5mbygnUmVjZWl2ZWQgJy4kc2lnbmFsTmFtZSk7Cn0gZWxzZWlmICgkdGhpcy0+bG9nZ2VyT3JDYWxsYmFjayAhPT0gbnVsbCkgewooJHRoaXMtPmxvZ2dlck9yQ2FsbGJhY2spKCRzaWduYWxOYW1lLCAkdGhpcyk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNUcmlnZ2VyZWQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+dHJpZ2dlcmVkICE9PSBudWxsOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXhpdFdpdGhMYXN0U2lnbmFsKCk6IHZvaWQKewokc2lnbmFsID0gJHRoaXMtPnRyaWdnZXJlZCA/PyAnU0lHSU5UJzsKJHNpZ25hbCA9IGRlZmluZWQoJHNpZ25hbCkgPyBjb25zdGFudCgkc2lnbmFsKSA6IDI7CgppZiAoZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9raWxsJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwb3NpeF9nZXRwaWQnKSkgewpwY250bF9zaWduYWwoJHNpZ25hbCwgU0lHX0RGTCk7CnBvc2l4X2tpbGwocG9zaXhfZ2V0cGlkKCksICRzaWduYWwpOwp9CgoKCmV4aXQoMTI4ICsgJHNpZ25hbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpOiB2b2lkCnsKJHRoaXMtPnRyaWdnZXJlZCA9IG51bGw7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX2Rlc3RydWN0KCkKewokdGhpcy0+dW5yZWdpc3RlcigpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKD9hcnJheSAkc2lnbmFscyA9IG51bGwsICRsb2dnZXJPckNhbGxiYWNrID0gbnVsbCk6IHNlbGYKewppZiAoJHNpZ25hbHMgPT09IG51bGwpIHsKJHNpZ25hbHMgPSBbc2VsZjo6U0lHSU5ULCBzZWxmOjpTSUdURVJNXTsKfQokc2lnbmFscyA9IGFycmF5X21hcChmdW5jdGlvbiAoJHNpZ25hbCkgewppZiAoaXNfaW50KCRzaWduYWwpKSB7CnJldHVybiBzZWxmOjpnZXRTaWduYWxOYW1lKCRzaWduYWwpOwp9IGVsc2VpZiAoIWluX2FycmF5KCRzaWduYWwsIHNlbGY6OkFMTF9TSUdOQUxTLCB0cnVlKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignJHNpZ25hbHMgbXVzdCBiZSBhbiBhcnJheSBvZiBTSUcqIGNvbnN0YW50cyBvciBzZWxmOjpTSUcqIGNvbnN0YW50cywgZ290ICcudmFyX2V4cG9ydCgkc2lnbmFsLCB0cnVlKSk7Cn0KcmV0dXJuICRzaWduYWw7Cn0sIChhcnJheSkgJHNpZ25hbHMpOwoKJGhhbmRsZXIgPSBuZXcgc2VsZigkc2lnbmFscywgJGxvZ2dlck9yQ2FsbGJhY2spOwoKaWYgKFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CmFycmF5X3Vuc2hpZnQoc2VsZjo6JGhhbmRsZXJzLCBXZWFrUmVmZXJlbmNlOjpjcmVhdGUoJGhhbmRsZXIpKTsKfSBlbHNlIHsKYXJyYXlfdW5zaGlmdChzZWxmOjokaGFuZGxlcnMsICRoYW5kbGVyKTsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXInKSAmJiBQSFBfU0FQSSA9PT0gJ2NsaScgJiYgKGluX2FycmF5KHNlbGY6OlNJR0lOVCwgJHNpZ25hbHMsIHRydWUpIHx8IGluX2FycmF5KHNlbGY6OlNJR0JSRUFLLCAkc2lnbmFscywgdHJ1ZSkpKSB7CmlmIChudWxsID09PSBzZWxmOjokd2luZG93c0hhbmRsZXIpIHsKc2VsZjo6JHdpbmRvd3NIYW5kbGVyID0gQ2xvc3VyZTo6ZnJvbUNhbGxhYmxlKFtzZWxmOjpjbGFzcywgJ2hhbmRsZVdpbmRvd3NTaWduYWwnXSk7CnNhcGlfd2luZG93c19zZXRfY3RybF9oYW5kbGVyKHNlbGY6OiR3aW5kb3dzSGFuZGxlcik7Cn0KfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfc2lnbmFsJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdwY250bF9hc3luY19zaWduYWxzJykpIHsKcGNudGxfYXN5bmNfc2lnbmFscyh0cnVlKTsKCnNlbGY6OnJlZ2lzdGVyUGNudGxIYW5kbGVyKCRzaWduYWxzKTsKfQoKcmV0dXJuICRoYW5kbGVyOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnJlZ2lzdGVyKCk6IHZvaWQKewokc2lnbmFscyA9ICR0aGlzLT5zaWduYWxzOwoKJGluZGV4ID0gZmFsc2U7CmZvcmVhY2ggKHNlbGY6OiRoYW5kbGVycyBhcyAka2V5ID0+ICRoYW5kbGVyKSB7CmlmICgoJGhhbmRsZXIgaW5zdGFuY2VvZiBXZWFrUmVmZXJlbmNlICYmICRoYW5kbGVyLT5nZXQoKSA9PT0gJHRoaXMpIHx8ICRoYW5kbGVyID09PSAkdGhpcykgewokaW5kZXggPSAka2V5OwpicmVhazsKfQp9CmlmICgkaW5kZXggPT09IGZhbHNlKSB7CgpyZXR1cm47Cn0KCnVuc2V0KHNlbGY6OiRoYW5kbGVyc1skaW5kZXhdKTsKCmlmIChzZWxmOjokd2luZG93c0hhbmRsZXIgIT09IG51bGwgJiYgKGluX2FycmF5KHNlbGY6OlNJR0lOVCwgJHNpZ25hbHMsIHRydWUpIHx8IGluX2FycmF5KHNlbGY6OlNJR0JSRUFLLCAkc2lnbmFscywgdHJ1ZSkpKSB7CmlmIChzZWxmOjpnZXRIYW5kbGVyRm9yKHNlbGY6OlNJR0lOVCkgPT09IG51bGwgJiYgc2VsZjo6Z2V0SGFuZGxlckZvcihzZWxmOjpTSUdCUkVBSykgPT09IG51bGwpIHsKc2FwaV93aW5kb3dzX3NldF9jdHJsX2hhbmRsZXIoc2VsZjo6JHdpbmRvd3NIYW5kbGVyLCBmYWxzZSk7CnNlbGY6OiR3aW5kb3dzSGFuZGxlciA9IG51bGw7Cn0KfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygncGNudGxfc2lnbmFsJykpIHsKZm9yZWFjaCAoJHNpZ25hbHMgYXMgJHNpZ25hbCkgewoKaWYgKCFkZWZpbmVkKCRzaWduYWwpKSB7CmNvbnRpbnVlOwp9CgoKaWYgKHNlbGY6OmdldEhhbmRsZXJGb3IoJHNpZ25hbCkgIT09IG51bGwpIHsKY29udGludWU7Cn0KCnBjbnRsX3NpZ25hbChjb25zdGFudCgkc2lnbmFsKSwgU0lHX0RGTCk7Cn0KfQp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gdW5yZWdpc3RlckFsbCgpOiB2b2lkCnsKaWYgKHNlbGY6OiR3aW5kb3dzSGFuZGxlciAhPT0gbnVsbCkgewpzYXBpX3dpbmRvd3Nfc2V0X2N0cmxfaGFuZGxlcihzZWxmOjokd2luZG93c0hhbmRsZXIsIGZhbHNlKTsKc2VsZjo6JHdpbmRvd3NIYW5kbGVyID0gbnVsbDsKfQoKZm9yZWFjaCAoc2VsZjo6JGhhbmRsZXJzIGFzICRrZXkgPT4gJGhhbmRsZXIpIHsKaWYgKCRoYW5kbGVyIGluc3RhbmNlb2YgV2Vha1JlZmVyZW5jZSkgewokaGFuZGxlciA9ICRoYW5kbGVyLT5nZXQoKTsKaWYgKCRoYW5kbGVyID09PSBudWxsKSB7CnVuc2V0KHNlbGY6OiRoYW5kbGVyc1ska2V5XSk7CmNvbnRpbnVlOwp9Cn0KJGhhbmRsZXItPnVucmVnaXN0ZXIoKTsKfQp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiByZWdpc3RlclBjbnRsSGFuZGxlcihhcnJheSAkc2lnbmFscyk6IHZvaWQKewpzdGF0aWMgJGNhbGxhYmxlOwppZiAoJGNhbGxhYmxlID09PSBudWxsKSB7CiRjYWxsYWJsZSA9IENsb3N1cmU6OmZyb21DYWxsYWJsZShbc2VsZjo6Y2xhc3MsICdoYW5kbGVQY250bFNpZ25hbCddKTsKfQpmb3JlYWNoICgkc2lnbmFscyBhcyAkc2lnbmFsKSB7CgppZiAoIWRlZmluZWQoJHNpZ25hbCkpIHsKY29udGludWU7Cn0KCnBjbnRsX3NpZ25hbChjb25zdGFudCgkc2lnbmFsKSwgJGNhbGxhYmxlKTsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYW5kbGVXaW5kb3dzU2lnbmFsKGludCAkZXZlbnQpOiB2b2lkCnsKaWYgKFBIUF9XSU5ET1dTX0VWRU5UX0NUUkxfQyA9PT0gJGV2ZW50KSB7CnNlbGY6OmNhbGxIYW5kbGVyRm9yKHNlbGY6OlNJR0lOVCk7Cn0gZWxzZWlmIChQSFBfV0lORE9XU19FVkVOVF9DVFJMX0JSRUFLID09PSAkZXZlbnQpIHsKc2VsZjo6Y2FsbEhhbmRsZXJGb3Ioc2VsZjo6U0lHQlJFQUspOwp9Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGhhbmRsZVBjbnRsU2lnbmFsKGludCAkc2lnbmFsKTogdm9pZAp7CnNlbGY6OmNhbGxIYW5kbGVyRm9yKHNlbGY6OmdldFNpZ25hbE5hbWUoJHNpZ25hbCkpOwp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNhbGxIYW5kbGVyRm9yKHN0cmluZyAkc2lnbmFsKTogdm9pZAp7CiRoYW5kbGVyID0gc2VsZjo6Z2V0SGFuZGxlckZvcigkc2lnbmFsKTsKaWYgKCRoYW5kbGVyICE9PSBudWxsKSB7CiRoYW5kbGVyLT50cmlnZ2VyKCRzaWduYWwpOwp9Cn0KCgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldEhhbmRsZXJGb3Ioc3RyaW5nICRzaWduYWwpOiA/c2VsZgp7CmZvcmVhY2ggKHNlbGY6OiRoYW5kbGVycyBhcyAka2V5ID0+ICRoYW5kbGVyKSB7CmlmICgkaGFuZGxlciBpbnN0YW5jZW9mIFdlYWtSZWZlcmVuY2UpIHsKJGhhbmRsZXIgPSAkaGFuZGxlci0+Z2V0KCk7CmlmICgkaGFuZGxlciA9PT0gbnVsbCkgewp1bnNldChzZWxmOjokaGFuZGxlcnNbJGtleV0pOwpjb250aW51ZTsKfQp9CmlmIChpbl9hcnJheSgkc2lnbmFsLCAkaGFuZGxlci0+c2lnbmFscywgdHJ1ZSkpIHsKcmV0dXJuICRoYW5kbGVyOwp9Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRTaWduYWxOYW1lKGludCAkc2lnbm8pOiBzdHJpbmcKewpzdGF0aWMgJHNpZ25hbHMgPSBudWxsOwppZiAoJHNpZ25hbHMgPT09IG51bGwpIHsKJHNpZ25hbHMgPSBbXTsKZm9yZWFjaCAoc2VsZjo6QUxMX1NJR05BTFMgYXMgJHZhbHVlKSB7CmlmIChkZWZpbmVkKCR2YWx1ZSkpIHsKJHNpZ25hbHNbY29uc3RhbnQoJHZhbHVlKV0gPSAkdmFsdWU7Cn0KfQp9CgppZiAoaXNzZXQoJHNpZ25hbHNbJHNpZ25vXSkpIHsKcmV0dXJuICRzaWduYWxzWyRzaWdub107Cn0KCnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbmtub3duIHNpZ25hbCAjJy4kc2lnbm8pOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbXBsZXRlQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxEdW1wQ29tcGxldGlvbkNvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcSGVscENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcTGF6eUNvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcTGlzdENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcU2lnbmFsYWJsZUNvbW1hbmRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRMb2FkZXJcQ29tbWFuZExvYWRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlQ29tbWFuZEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlRXJyb3JFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnRcQ29uc29sZVNpZ25hbEV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlVGVybWluYXRlRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxDb21tYW5kTm90Rm91bmRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXE5hbWVzcGFjZU5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXERlYnVnRm9ybWF0dGVySGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcRm9ybWF0dGVySGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyU2V0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcUHJvY2Vzc0hlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFF1ZXN0aW9uSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxBcmd2SW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XEFycmF5SW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXdhcmVJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFNpZ25hbFJlZ2lzdHJ5XFNpZ25hbFJlZ2lzdHJ5Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxTdHlsZVxTeW1mb255U3R5bGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxFcnJvckhhbmRsZXJcRXJyb3JIYW5kbGVyOwp1c2UgU3ltZm9ueVxDb250cmFjdHNcRXZlbnREaXNwYXRjaGVyXEV2ZW50RGlzcGF0Y2hlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcUmVzZXRJbnRlcmZhY2U7CgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIFJlc2V0SW50ZXJmYWNlCnsKcHJpdmF0ZSAkY29tbWFuZHMgPSBbXTsKcHJpdmF0ZSAkd2FudEhlbHBzID0gZmFsc2U7CnByaXZhdGUgJHJ1bm5pbmdDb21tYW5kOwpwcml2YXRlICRuYW1lOwpwcml2YXRlICR2ZXJzaW9uOwpwcml2YXRlICRjb21tYW5kTG9hZGVyOwpwcml2YXRlICRjYXRjaEV4Y2VwdGlvbnMgPSB0cnVlOwpwcml2YXRlICRhdXRvRXhpdCA9IHRydWU7CnByaXZhdGUgJGRlZmluaXRpb247CnByaXZhdGUgJGhlbHBlclNldDsKcHJpdmF0ZSAkZGlzcGF0Y2hlcjsKcHJpdmF0ZSAkdGVybWluYWw7CnByaXZhdGUgJGRlZmF1bHRDb21tYW5kOwpwcml2YXRlICRzaW5nbGVDb21tYW5kID0gZmFsc2U7CnByaXZhdGUgJGluaXRpYWxpemVkOwpwcml2YXRlICRzaWduYWxSZWdpc3RyeTsKcHJpdmF0ZSAkc2lnbmFsc1RvRGlzcGF0Y2hFdmVudCA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSA9ICdVTktOT1dOJywgc3RyaW5nICR2ZXJzaW9uID0gJ1VOS05PV04nKQp7CiR0aGlzLT5uYW1lID0gJG5hbWU7CiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247CiR0aGlzLT50ZXJtaW5hbCA9IG5ldyBUZXJtaW5hbCgpOwokdGhpcy0+ZGVmYXVsdENvbW1hbmQgPSAnbGlzdCc7CmlmIChcZGVmaW5lZCgnU0lHSU5UJykgJiYgU2lnbmFsUmVnaXN0cnk6OmlzU3VwcG9ydGVkKCkpIHsKJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5ID0gbmV3IFNpZ25hbFJlZ2lzdHJ5KCk7CiR0aGlzLT5zaWduYWxzVG9EaXNwYXRjaEV2ZW50ID0gW1xTSUdJTlQsIFxTSUdURVJNLCBcU0lHVVNSMSwgXFNJR1VTUjJdOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREaXNwYXRjaGVyKEV2ZW50RGlzcGF0Y2hlckludGVyZmFjZSAkZGlzcGF0Y2hlcikKewokdGhpcy0+ZGlzcGF0Y2hlciA9ICRkaXNwYXRjaGVyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29tbWFuZExvYWRlcihDb21tYW5kTG9hZGVySW50ZXJmYWNlICRjb21tYW5kTG9hZGVyKQp7CiR0aGlzLT5jb21tYW5kTG9hZGVyID0gJGNvbW1hbmRMb2FkZXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTaWduYWxSZWdpc3RyeSgpOiBTaWduYWxSZWdpc3RyeQp7CmlmICghJHRoaXMtPnNpZ25hbFJlZ2lzdHJ5KSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdTaWduYWxzIGFyZSBub3Qgc3VwcG9ydGVkLiBNYWtlIHN1cmUgdGhhdCB0aGUgYHBjbnRsYCBleHRlbnNpb24gaXMgaW5zdGFsbGVkIGFuZCB0aGF0ICJwY250bF8qIiBmdW5jdGlvbnMgYXJlIG5vdCBkaXNhYmxlZCBieSB5b3VyIHBocC5pbmlcJ3MgImRpc2FibGVfZnVuY3Rpb25zIiBkaXJlY3RpdmUuJyk7Cn0KCnJldHVybiAkdGhpcy0+c2lnbmFsUmVnaXN0cnk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRTaWduYWxzVG9EaXNwYXRjaEV2ZW50KGludCAuLi4kc2lnbmFsc1RvRGlzcGF0Y2hFdmVudCkKewokdGhpcy0+c2lnbmFsc1RvRGlzcGF0Y2hFdmVudCA9ICRzaWduYWxzVG9EaXNwYXRjaEV2ZW50Owp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1big/SW5wdXRJbnRlcmZhY2UgJGlucHV0ID0gbnVsbCwgP091dHB1dEludGVyZmFjZSAkb3V0cHV0ID0gbnVsbCkKewppZiAoXGZ1bmN0aW9uX2V4aXN0cygncHV0ZW52JykpIHsKQHB1dGVudignTElORVM9Jy4kdGhpcy0+dGVybWluYWwtPmdldEhlaWdodCgpKTsKQHB1dGVudignQ09MVU1OUz0nLiR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSk7Cn0KCmlmIChudWxsID09PSAkaW5wdXQpIHsKJGlucHV0ID0gbmV3IEFyZ3ZJbnB1dCgpOwp9CgppZiAobnVsbCA9PT0gJG91dHB1dCkgewokb3V0cHV0ID0gbmV3IENvbnNvbGVPdXRwdXQoKTsKfQoKJHJlbmRlckV4Y2VwdGlvbiA9IGZ1bmN0aW9uIChcVGhyb3dhYmxlICRlKSB1c2UgKCRvdXRwdXQpIHsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiR0aGlzLT5yZW5kZXJUaHJvd2FibGUoJGUsICRvdXRwdXQtPmdldEVycm9yT3V0cHV0KCkpOwp9IGVsc2UgewokdGhpcy0+cmVuZGVyVGhyb3dhYmxlKCRlLCAkb3V0cHV0KTsKfQp9OwppZiAoJHBocEhhbmRsZXIgPSBzZXRfZXhjZXB0aW9uX2hhbmRsZXIoJHJlbmRlckV4Y2VwdGlvbikpIHsKcmVzdG9yZV9leGNlcHRpb25faGFuZGxlcigpOwppZiAoIVxpc19hcnJheSgkcGhwSGFuZGxlcikgfHwgISRwaHBIYW5kbGVyWzBdIGluc3RhbmNlb2YgRXJyb3JIYW5kbGVyKSB7CiRlcnJvckhhbmRsZXIgPSB0cnVlOwp9IGVsc2VpZiAoJGVycm9ySGFuZGxlciA9ICRwaHBIYW5kbGVyWzBdLT5zZXRFeGNlcHRpb25IYW5kbGVyKCRyZW5kZXJFeGNlcHRpb24pKSB7CiRwaHBIYW5kbGVyWzBdLT5zZXRFeGNlcHRpb25IYW5kbGVyKCRlcnJvckhhbmRsZXIpOwp9Cn0KCnRyeSB7CiR0aGlzLT5jb25maWd1cmVJTygkaW5wdXQsICRvdXRwdXQpOwoKJGV4aXRDb2RlID0gJHRoaXMtPmRvUnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKaWYgKCEkdGhpcy0+Y2F0Y2hFeGNlcHRpb25zKSB7CnRocm93ICRlOwp9CgokcmVuZGVyRXhjZXB0aW9uKCRlKTsKCiRleGl0Q29kZSA9ICRlLT5nZXRDb2RlKCk7CmlmIChpc19udW1lcmljKCRleGl0Q29kZSkpIHsKJGV4aXRDb2RlID0gKGludCkgJGV4aXRDb2RlOwppZiAoJGV4aXRDb2RlIDw9IDApIHsKJGV4aXRDb2RlID0gMTsKfQp9IGVsc2UgewokZXhpdENvZGUgPSAxOwp9Cn0gZmluYWxseSB7CgoKaWYgKCEkcGhwSGFuZGxlcikgewppZiAoc2V0X2V4Y2VwdGlvbl9oYW5kbGVyKCRyZW5kZXJFeGNlcHRpb24pID09PSAkcmVuZGVyRXhjZXB0aW9uKSB7CnJlc3RvcmVfZXhjZXB0aW9uX2hhbmRsZXIoKTsKfQpyZXN0b3JlX2V4Y2VwdGlvbl9oYW5kbGVyKCk7Cn0gZWxzZWlmICghJGVycm9ySGFuZGxlcikgewokZmluYWxIYW5kbGVyID0gJHBocEhhbmRsZXJbMF0tPnNldEV4Y2VwdGlvbkhhbmRsZXIobnVsbCk7CmlmICgkZmluYWxIYW5kbGVyICE9PSAkcmVuZGVyRXhjZXB0aW9uKSB7CiRwaHBIYW5kbGVyWzBdLT5zZXRFeGNlcHRpb25IYW5kbGVyKCRmaW5hbEhhbmRsZXIpOwp9Cn0KfQoKaWYgKCR0aGlzLT5hdXRvRXhpdCkgewppZiAoJGV4aXRDb2RlID4gMjU1KSB7CiRleGl0Q29kZSA9IDI1NTsKfQoKZXhpdCgkZXhpdENvZGUpOwp9CgpyZXR1cm4gJGV4aXRDb2RlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkb1J1bihJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0tdmVyc2lvbicsICctViddLCB0cnVlKSkgewokb3V0cHV0LT53cml0ZWxuKCR0aGlzLT5nZXRMb25nVmVyc2lvbigpKTsKCnJldHVybiAwOwp9Cgp0cnkgewoKJGlucHV0LT5iaW5kKCR0aGlzLT5nZXREZWZpbml0aW9uKCkpOwp9IGNhdGNoIChFeGNlcHRpb25JbnRlcmZhY2UgJGUpIHsKCn0KCiRuYW1lID0gJHRoaXMtPmdldENvbW1hbmROYW1lKCRpbnB1dCk7CmlmICh0cnVlID09PSAkaW5wdXQtPmhhc1BhcmFtZXRlck9wdGlvbihbJy0taGVscCcsICctaCddLCB0cnVlKSkgewppZiAoISRuYW1lKSB7CiRuYW1lID0gJ2hlbHAnOwokaW5wdXQgPSBuZXcgQXJyYXlJbnB1dChbJ2NvbW1hbmRfbmFtZScgPT4gJHRoaXMtPmRlZmF1bHRDb21tYW5kXSk7Cn0gZWxzZSB7CiR0aGlzLT53YW50SGVscHMgPSB0cnVlOwp9Cn0KCmlmICghJG5hbWUpIHsKJG5hbWUgPSAkdGhpcy0+ZGVmYXVsdENvbW1hbmQ7CiRkZWZpbml0aW9uID0gJHRoaXMtPmdldERlZmluaXRpb24oKTsKJGRlZmluaXRpb24tPnNldEFyZ3VtZW50cyhhcnJheV9tZXJnZSgKJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpLApbCidjb21tYW5kJyA9PiBuZXcgSW5wdXRBcmd1bWVudCgnY29tbWFuZCcsIElucHV0QXJndW1lbnQ6Ok9QVElPTkFMLCAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnQoJ2NvbW1hbmQnKS0+Z2V0RGVzY3JpcHRpb24oKSwgJG5hbWUpLApdCikpOwp9Cgp0cnkgewokdGhpcy0+cnVubmluZ0NvbW1hbmQgPSBudWxsOwoKJGNvbW1hbmQgPSAkdGhpcy0+ZmluZCgkbmFtZSk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKaWYgKCEoJGUgaW5zdGFuY2VvZiBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gJiYgISRlIGluc3RhbmNlb2YgTmFtZXNwYWNlTm90Rm91bmRFeGNlcHRpb24pIHx8IDEgIT09IFxjb3VudCgkYWx0ZXJuYXRpdmVzID0gJGUtPmdldEFsdGVybmF0aXZlcygpKSB8fCAhJGlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKaWYgKG51bGwgIT09ICR0aGlzLT5kaXNwYXRjaGVyKSB7CiRldmVudCA9IG5ldyBDb25zb2xlRXJyb3JFdmVudCgkaW5wdXQsICRvdXRwdXQsICRlKTsKJHRoaXMtPmRpc3BhdGNoZXItPmRpc3BhdGNoKCRldmVudCwgQ29uc29sZUV2ZW50czo6RVJST1IpOwoKaWYgKDAgPT09ICRldmVudC0+Z2V0RXhpdENvZGUoKSkgewpyZXR1cm4gMDsKfQoKJGUgPSAkZXZlbnQtPmdldEVycm9yKCk7Cn0KCnRocm93ICRlOwp9CgokYWx0ZXJuYXRpdmUgPSAkYWx0ZXJuYXRpdmVzWzBdOwoKJHN0eWxlID0gbmV3IFN5bWZvbnlTdHlsZSgkaW5wdXQsICRvdXRwdXQpOwokb3V0cHV0LT53cml0ZWxuKCcnKTsKJGZvcm1hdHRlZEJsb2NrID0gKG5ldyBGb3JtYXR0ZXJIZWxwZXIoKSktPmZvcm1hdEJsb2NrKHNwcmludGYoJ0NvbW1hbmQgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSksICdlcnJvcicsIHRydWUpOwokb3V0cHV0LT53cml0ZWxuKCRmb3JtYXR0ZWRCbG9jayk7CmlmICghJHN0eWxlLT5jb25maXJtKHNwcmludGYoJ0RvIHlvdSB3YW50IHRvIHJ1biAiJXMiIGluc3RlYWQ/ICcsICRhbHRlcm5hdGl2ZSksIGZhbHNlKSkgewppZiAobnVsbCAhPT0gJHRoaXMtPmRpc3BhdGNoZXIpIHsKJGV2ZW50ID0gbmV3IENvbnNvbGVFcnJvckV2ZW50KCRpbnB1dCwgJG91dHB1dCwgJGUpOwokdGhpcy0+ZGlzcGF0Y2hlci0+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpFUlJPUik7CgpyZXR1cm4gJGV2ZW50LT5nZXRFeGl0Q29kZSgpOwp9CgpyZXR1cm4gMTsKfQoKJGNvbW1hbmQgPSAkdGhpcy0+ZmluZCgkYWx0ZXJuYXRpdmUpOwp9CgppZiAoJGNvbW1hbmQgaW5zdGFuY2VvZiBMYXp5Q29tbWFuZCkgewokY29tbWFuZCA9ICRjb21tYW5kLT5nZXRDb21tYW5kKCk7Cn0KCiR0aGlzLT5ydW5uaW5nQ29tbWFuZCA9ICRjb21tYW5kOwokZXhpdENvZGUgPSAkdGhpcy0+ZG9SdW5Db21tYW5kKCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQpOwokdGhpcy0+cnVubmluZ0NvbW1hbmQgPSBudWxsOwoKcmV0dXJuICRleGl0Q29kZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCkKewp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscGVyU2V0KEhlbHBlclNldCAkaGVscGVyU2V0KQp7CiR0aGlzLT5oZWxwZXJTZXQgPSAkaGVscGVyU2V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXJTZXQoKQp7CmlmICghJHRoaXMtPmhlbHBlclNldCkgewokdGhpcy0+aGVscGVyU2V0ID0gJHRoaXMtPmdldERlZmF1bHRIZWxwZXJTZXQoKTsKfQoKcmV0dXJuICR0aGlzLT5oZWxwZXJTZXQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbikKewokdGhpcy0+ZGVmaW5pdGlvbiA9ICRkZWZpbml0aW9uOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZWZpbml0aW9uKCkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uKSB7CiR0aGlzLT5kZWZpbml0aW9uID0gJHRoaXMtPmdldERlZmF1bHRJbnB1dERlZmluaXRpb24oKTsKfQoKaWYgKCR0aGlzLT5zaW5nbGVDb21tYW5kKSB7CiRpbnB1dERlZmluaXRpb24gPSAkdGhpcy0+ZGVmaW5pdGlvbjsKJGlucHV0RGVmaW5pdGlvbi0+c2V0QXJndW1lbnRzKCk7CgpyZXR1cm4gJGlucHV0RGVmaW5pdGlvbjsKfQoKcmV0dXJuICR0aGlzLT5kZWZpbml0aW9uOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewppZiAoCkNvbXBsZXRpb25JbnB1dDo6VFlQRV9BUkdVTUVOVF9WQUxVRSA9PT0gJGlucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpCiYmICdjb21tYW5kJyA9PT0gJGlucHV0LT5nZXRDb21wbGV0aW9uTmFtZSgpCikgewokY29tbWFuZE5hbWVzID0gW107CmZvcmVhY2ggKCR0aGlzLT5hbGwoKSBhcyAkbmFtZSA9PiAkY29tbWFuZCkgewoKaWYgKCRjb21tYW5kLT5pc0hpZGRlbigpIHx8ICRjb21tYW5kLT5nZXROYW1lKCkgIT09ICRuYW1lKSB7CmNvbnRpbnVlOwp9CiRjb21tYW5kTmFtZXNbXSA9ICRjb21tYW5kLT5nZXROYW1lKCk7CmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJG5hbWUpIHsKJGNvbW1hbmROYW1lc1tdID0gJG5hbWU7Cn0KfQokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoYXJyYXlfZmlsdGVyKCRjb21tYW5kTmFtZXMpKTsKCnJldHVybjsKfQoKaWYgKENvbXBsZXRpb25JbnB1dDo6VFlQRV9PUFRJT05fTkFNRSA9PT0gJGlucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpKSB7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdE9wdGlvbnMoJHRoaXMtPmdldERlZmluaXRpb24oKS0+Z2V0T3B0aW9ucygpKTsKCnJldHVybjsKfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCkKewpyZXR1cm4gJHRoaXMtPmdldExvbmdWZXJzaW9uKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFyZUV4Y2VwdGlvbnNDYXVnaHQoKQp7CnJldHVybiAkdGhpcy0+Y2F0Y2hFeGNlcHRpb25zOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2F0Y2hFeGNlcHRpb25zKGJvb2wgJGJvb2xlYW4pCnsKJHRoaXMtPmNhdGNoRXhjZXB0aW9ucyA9ICRib29sZWFuOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0F1dG9FeGl0RW5hYmxlZCgpCnsKcmV0dXJuICR0aGlzLT5hdXRvRXhpdDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEF1dG9FeGl0KGJvb2wgJGJvb2xlYW4pCnsKJHRoaXMtPmF1dG9FeGl0ID0gJGJvb2xlYW47Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQp7CnJldHVybiAkdGhpcy0+bmFtZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE5hbWUoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5uYW1lID0gJG5hbWU7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcnNpb24oKQp7CnJldHVybiAkdGhpcy0+dmVyc2lvbjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcnNpb24oc3RyaW5nICR2ZXJzaW9uKQp7CiR0aGlzLT52ZXJzaW9uID0gJHZlcnNpb247Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldExvbmdWZXJzaW9uKCkKewppZiAoJ1VOS05PV04nICE9PSAkdGhpcy0+Z2V0TmFtZSgpKSB7CmlmICgnVU5LTk9XTicgIT09ICR0aGlzLT5nZXRWZXJzaW9uKCkpIHsKcmV0dXJuIHNwcmludGYoJyVzIDxpbmZvPiVzPC9pbmZvPicsICR0aGlzLT5nZXROYW1lKCksICR0aGlzLT5nZXRWZXJzaW9uKCkpOwp9CgpyZXR1cm4gJHRoaXMtPmdldE5hbWUoKTsKfQoKcmV0dXJuICdDb25zb2xlIFRvb2wnOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiByZWdpc3RlcihzdHJpbmcgJG5hbWUpCnsKcmV0dXJuICR0aGlzLT5hZGQobmV3IENvbW1hbmQoJG5hbWUpKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRDb21tYW5kcyhhcnJheSAkY29tbWFuZHMpCnsKZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRjb21tYW5kKSB7CiR0aGlzLT5hZGQoJGNvbW1hbmQpOwp9Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZChDb21tYW5kICRjb21tYW5kKQp7CiR0aGlzLT5pbml0KCk7CgokY29tbWFuZC0+c2V0QXBwbGljYXRpb24oJHRoaXMpOwoKaWYgKCEkY29tbWFuZC0+aXNFbmFibGVkKCkpIHsKJGNvbW1hbmQtPnNldEFwcGxpY2F0aW9uKG51bGwpOwoKcmV0dXJuIG51bGw7Cn0KCmlmICghJGNvbW1hbmQgaW5zdGFuY2VvZiBMYXp5Q29tbWFuZCkgewoKJGNvbW1hbmQtPmdldERlZmluaXRpb24oKTsKfQoKaWYgKCEkY29tbWFuZC0+Z2V0TmFtZSgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdUaGUgY29tbWFuZCBkZWZpbmVkIGluICIlcyIgY2Fubm90IGhhdmUgYW4gZW1wdHkgbmFtZS4nLCBnZXRfZGVidWdfdHlwZSgkY29tbWFuZCkpKTsKfQoKJHRoaXMtPmNvbW1hbmRzWyRjb21tYW5kLT5nZXROYW1lKCldID0gJGNvbW1hbmQ7Cgpmb3JlYWNoICgkY29tbWFuZC0+Z2V0QWxpYXNlcygpIGFzICRhbGlhcykgewokdGhpcy0+Y29tbWFuZHNbJGFsaWFzXSA9ICRjb21tYW5kOwp9CgpyZXR1cm4gJGNvbW1hbmQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0KHN0cmluZyAkbmFtZSkKewokdGhpcy0+aW5pdCgpOwoKaWYgKCEkdGhpcy0+aGFzKCRuYW1lKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBjb21tYW5kICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKCmlmICghaXNzZXQoJHRoaXMtPmNvbW1hbmRzWyRuYW1lXSkpIHsKdGhyb3cgbmV3IENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBjb21tYW5kIGNhbm5vdCBiZSBmb3VuZCBiZWNhdXNlIGl0IGlzIHJlZ2lzdGVyZWQgdW5kZXIgbXVsdGlwbGUgbmFtZXMuIE1ha2Ugc3VyZSB5b3UgZG9uXCd0IHNldCBhIGRpZmZlcmVudCBuYW1lIHZpYSBjb25zdHJ1Y3RvciBvciAic2V0TmFtZSgpIi4nLCAkbmFtZSkpOwp9CgokY29tbWFuZCA9ICR0aGlzLT5jb21tYW5kc1skbmFtZV07CgppZiAoJHRoaXMtPndhbnRIZWxwcykgewokdGhpcy0+d2FudEhlbHBzID0gZmFsc2U7CgokaGVscENvbW1hbmQgPSAkdGhpcy0+Z2V0KCdoZWxwJyk7CiRoZWxwQ29tbWFuZC0+c2V0Q29tbWFuZCgkY29tbWFuZCk7CgpyZXR1cm4gJGhlbHBDb21tYW5kOwp9CgpyZXR1cm4gJGNvbW1hbmQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPmluaXQoKTsKCnJldHVybiBpc3NldCgkdGhpcy0+Y29tbWFuZHNbJG5hbWVdKSB8fCAoJHRoaXMtPmNvbW1hbmRMb2FkZXIgJiYgJHRoaXMtPmNvbW1hbmRMb2FkZXItPmhhcygkbmFtZSkgJiYgJHRoaXMtPmFkZCgkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0KCRuYW1lKSkpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZXMoKQp7CiRuYW1lc3BhY2VzID0gW107CmZvcmVhY2ggKCR0aGlzLT5hbGwoKSBhcyAkY29tbWFuZCkgewppZiAoJGNvbW1hbmQtPmlzSGlkZGVuKCkpIHsKY29udGludWU7Cn0KCiRuYW1lc3BhY2VzW10gPSAkdGhpcy0+ZXh0cmFjdEFsbE5hbWVzcGFjZXMoJGNvbW1hbmQtPmdldE5hbWUoKSk7Cgpmb3JlYWNoICgkY29tbWFuZC0+Z2V0QWxpYXNlcygpIGFzICRhbGlhcykgewokbmFtZXNwYWNlc1tdID0gJHRoaXMtPmV4dHJhY3RBbGxOYW1lc3BhY2VzKCRhbGlhcyk7Cn0KfQoKcmV0dXJuIGFycmF5X3ZhbHVlcyhhcnJheV91bmlxdWUoYXJyYXlfZmlsdGVyKGFycmF5X21lcmdlKFtdLCAuLi4kbmFtZXNwYWNlcykpKSk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZE5hbWVzcGFjZShzdHJpbmcgJG5hbWVzcGFjZSkKewokYWxsTmFtZXNwYWNlcyA9ICR0aGlzLT5nZXROYW1lc3BhY2VzKCk7CiRleHByID0gaW1wbG9kZSgnW146XSo6JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgZXhwbG9kZSgnOicsICRuYW1lc3BhY2UpKSkuJ1teOl0qJzsKJG5hbWVzcGFjZXMgPSBwcmVnX2dyZXAoJ3teJy4kZXhwci4nfScsICRhbGxOYW1lc3BhY2VzKTsKCmlmIChlbXB0eSgkbmFtZXNwYWNlcykpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdUaGVyZSBhcmUgbm8gY29tbWFuZHMgZGVmaW5lZCBpbiB0aGUgIiVzIiBuYW1lc3BhY2UuJywgJG5hbWVzcGFjZSk7CgppZiAoJGFsdGVybmF0aXZlcyA9ICR0aGlzLT5maW5kQWx0ZXJuYXRpdmVzKCRuYW1lc3BhY2UsICRhbGxOYW1lc3BhY2VzKSkgewppZiAoMSA9PSBcY291bnQoJGFsdGVybmF0aXZlcykpIHsKJG1lc3NhZ2UgLj0gIlxuXG5EaWQgeW91IG1lYW4gdGhpcz9cbiAgICAiOwp9IGVsc2UgewokbWVzc2FnZSAuPSAiXG5cbkRpZCB5b3UgbWVhbiBvbmUgb2YgdGhlc2U/XG4gICAgIjsKfQoKJG1lc3NhZ2UgLj0gaW1wbG9kZSgiXG4gICAgIiwgJGFsdGVybmF0aXZlcyk7Cn0KCnRocm93IG5ldyBOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbigkbWVzc2FnZSwgJGFsdGVybmF0aXZlcyk7Cn0KCiRleGFjdCA9IFxpbl9hcnJheSgkbmFtZXNwYWNlLCAkbmFtZXNwYWNlcywgdHJ1ZSk7CmlmIChcY291bnQoJG5hbWVzcGFjZXMpID4gMSAmJiAhJGV4YWN0KSB7CnRocm93IG5ldyBOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbihzcHJpbnRmKCJUaGUgbmFtZXNwYWNlIFwiJXNcIiBpcyBhbWJpZ3VvdXMuXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xuJXMuIiwgJG5hbWVzcGFjZSwgJHRoaXMtPmdldEFiYnJldmlhdGlvblN1Z2dlc3Rpb25zKGFycmF5X3ZhbHVlcygkbmFtZXNwYWNlcykpKSwgYXJyYXlfdmFsdWVzKCRuYW1lc3BhY2VzKSk7Cn0KCnJldHVybiAkZXhhY3QgPyAkbmFtZXNwYWNlIDogcmVzZXQoJG5hbWVzcGFjZXMpOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmQoc3RyaW5nICRuYW1lKQp7CiR0aGlzLT5pbml0KCk7CgokYWxpYXNlcyA9IFtdOwoKZm9yZWFjaCAoJHRoaXMtPmNvbW1hbmRzIGFzICRjb21tYW5kKSB7CmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJGFsaWFzKSB7CmlmICghJHRoaXMtPmhhcygkYWxpYXMpKSB7CiR0aGlzLT5jb21tYW5kc1skYWxpYXNdID0gJGNvbW1hbmQ7Cn0KfQp9CgppZiAoJHRoaXMtPmhhcygkbmFtZSkpIHsKcmV0dXJuICR0aGlzLT5nZXQoJG5hbWUpOwp9CgokYWxsQ29tbWFuZHMgPSAkdGhpcy0+Y29tbWFuZExvYWRlciA/IGFycmF5X21lcmdlKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXROYW1lcygpLCBhcnJheV9rZXlzKCR0aGlzLT5jb21tYW5kcykpIDogYXJyYXlfa2V5cygkdGhpcy0+Y29tbWFuZHMpOwokZXhwciA9IGltcGxvZGUoJ1teOl0qOicsIGFycmF5X21hcCgncHJlZ19xdW90ZScsIGV4cGxvZGUoJzonLCAkbmFtZSkpKS4nW146XSonOwokY29tbWFuZHMgPSBwcmVnX2dyZXAoJ3teJy4kZXhwci4nfScsICRhbGxDb21tYW5kcyk7CgppZiAoZW1wdHkoJGNvbW1hbmRzKSkgewokY29tbWFuZHMgPSBwcmVnX2dyZXAoJ3teJy4kZXhwci4nfWknLCAkYWxsQ29tbWFuZHMpOwp9CgoKaWYgKGVtcHR5KCRjb21tYW5kcykgfHwgXGNvdW50KHByZWdfZ3JlcCgne14nLiRleHByLickfWknLCAkY29tbWFuZHMpKSA8IDEpIHsKaWYgKGZhbHNlICE9PSAkcG9zID0gc3RycnBvcygkbmFtZSwgJzonKSkgewoKJHRoaXMtPmZpbmROYW1lc3BhY2Uoc3Vic3RyKCRuYW1lLCAwLCAkcG9zKSk7Cn0KCiRtZXNzYWdlID0gc3ByaW50ZignQ29tbWFuZCAiJXMiIGlzIG5vdCBkZWZpbmVkLicsICRuYW1lKTsKCmlmICgkYWx0ZXJuYXRpdmVzID0gJHRoaXMtPmZpbmRBbHRlcm5hdGl2ZXMoJG5hbWUsICRhbGxDb21tYW5kcykpIHsKCiRhbHRlcm5hdGl2ZXMgPSBhcnJheV9maWx0ZXIoJGFsdGVybmF0aXZlcywgZnVuY3Rpb24gKCRuYW1lKSB7CnJldHVybiAhJHRoaXMtPmdldCgkbmFtZSktPmlzSGlkZGVuKCk7Cn0pOwoKaWYgKDEgPT0gXGNvdW50KCRhbHRlcm5hdGl2ZXMpKSB7CiRtZXNzYWdlIC49ICJcblxuRGlkIHlvdSBtZWFuIHRoaXM/XG4gICAgIjsKfSBlbHNlIHsKJG1lc3NhZ2UgLj0gIlxuXG5EaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlP1xuICAgICI7Cn0KJG1lc3NhZ2UgLj0gaW1wbG9kZSgiXG4gICAgIiwgJGFsdGVybmF0aXZlcyk7Cn0KCnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oJG1lc3NhZ2UsIGFycmF5X3ZhbHVlcygkYWx0ZXJuYXRpdmVzKSk7Cn0KCgppZiAoXGNvdW50KCRjb21tYW5kcykgPiAxKSB7CiRjb21tYW5kTGlzdCA9ICR0aGlzLT5jb21tYW5kTG9hZGVyID8gYXJyYXlfbWVyZ2UoYXJyYXlfZmxpcCgkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0TmFtZXMoKSksICR0aGlzLT5jb21tYW5kcykgOiAkdGhpcy0+Y29tbWFuZHM7CiRjb21tYW5kcyA9IGFycmF5X3VuaXF1ZShhcnJheV9maWx0ZXIoJGNvbW1hbmRzLCBmdW5jdGlvbiAoJG5hbWVPckFsaWFzKSB1c2UgKCYkY29tbWFuZExpc3QsICRjb21tYW5kcywgJiRhbGlhc2VzKSB7CmlmICghJGNvbW1hbmRMaXN0WyRuYW1lT3JBbGlhc10gaW5zdGFuY2VvZiBDb21tYW5kKSB7CiRjb21tYW5kTGlzdFskbmFtZU9yQWxpYXNdID0gJHRoaXMtPmNvbW1hbmRMb2FkZXItPmdldCgkbmFtZU9yQWxpYXMpOwp9CgokY29tbWFuZE5hbWUgPSAkY29tbWFuZExpc3RbJG5hbWVPckFsaWFzXS0+Z2V0TmFtZSgpOwoKJGFsaWFzZXNbJG5hbWVPckFsaWFzXSA9ICRjb21tYW5kTmFtZTsKCnJldHVybiAkY29tbWFuZE5hbWUgPT09ICRuYW1lT3JBbGlhcyB8fCAhXGluX2FycmF5KCRjb21tYW5kTmFtZSwgJGNvbW1hbmRzKTsKfSkpOwp9CgppZiAoXGNvdW50KCRjb21tYW5kcykgPiAxKSB7CiR1c2FibGVXaWR0aCA9ICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSAtIDEwOwokYWJicmV2cyA9IGFycmF5X3ZhbHVlcygkY29tbWFuZHMpOwokbWF4TGVuID0gMDsKZm9yZWFjaCAoJGFiYnJldnMgYXMgJGFiYnJldikgewokbWF4TGVuID0gbWF4KEhlbHBlcjo6d2lkdGgoJGFiYnJldiksICRtYXhMZW4pOwp9CiRhYmJyZXZzID0gYXJyYXlfbWFwKGZ1bmN0aW9uICgkY21kKSB1c2UgKCRjb21tYW5kTGlzdCwgJHVzYWJsZVdpZHRoLCAkbWF4TGVuLCAmJGNvbW1hbmRzKSB7CmlmICgkY29tbWFuZExpc3RbJGNtZF0tPmlzSGlkZGVuKCkpIHsKdW5zZXQoJGNvbW1hbmRzW2FycmF5X3NlYXJjaCgkY21kLCAkY29tbWFuZHMpXSk7CgpyZXR1cm4gZmFsc2U7Cn0KCiRhYmJyZXYgPSBzdHJfcGFkKCRjbWQsICRtYXhMZW4sICcgJykuJyAnLiRjb21tYW5kTGlzdFskY21kXS0+Z2V0RGVzY3JpcHRpb24oKTsKCnJldHVybiBIZWxwZXI6OndpZHRoKCRhYmJyZXYpID4gJHVzYWJsZVdpZHRoID8gSGVscGVyOjpzdWJzdHIoJGFiYnJldiwgMCwgJHVzYWJsZVdpZHRoIC0gMykuJy4uLicgOiAkYWJicmV2Owp9LCBhcnJheV92YWx1ZXMoJGNvbW1hbmRzKSk7CgppZiAoXGNvdW50KCRjb21tYW5kcykgPiAxKSB7CiRzdWdnZXN0aW9ucyA9ICR0aGlzLT5nZXRBYmJyZXZpYXRpb25TdWdnZXN0aW9ucyhhcnJheV9maWx0ZXIoJGFiYnJldnMpKTsKCnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZigiQ29tbWFuZCBcIiVzXCIgaXMgYW1iaWd1b3VzLlxuRGlkIHlvdSBtZWFuIG9uZSBvZiB0aGVzZT9cbiVzLiIsICRuYW1lLCAkc3VnZ2VzdGlvbnMpLCBhcnJheV92YWx1ZXMoJGNvbW1hbmRzKSk7Cn0KfQoKJGNvbW1hbmQgPSAkdGhpcy0+Z2V0KHJlc2V0KCRjb21tYW5kcykpOwoKaWYgKCRjb21tYW5kLT5pc0hpZGRlbigpKSB7CnRocm93IG5ldyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24oc3ByaW50ZignVGhlIGNvbW1hbmQgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJGNvbW1hbmQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWxsKD9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwpCnsKJHRoaXMtPmluaXQoKTsKCmlmIChudWxsID09PSAkbmFtZXNwYWNlKSB7CmlmICghJHRoaXMtPmNvbW1hbmRMb2FkZXIpIHsKcmV0dXJuICR0aGlzLT5jb21tYW5kczsKfQoKJGNvbW1hbmRzID0gJHRoaXMtPmNvbW1hbmRzOwpmb3JlYWNoICgkdGhpcy0+Y29tbWFuZExvYWRlci0+Z2V0TmFtZXMoKSBhcyAkbmFtZSkgewppZiAoIWlzc2V0KCRjb21tYW5kc1skbmFtZV0pICYmICR0aGlzLT5oYXMoJG5hbWUpKSB7CiRjb21tYW5kc1skbmFtZV0gPSAkdGhpcy0+Z2V0KCRuYW1lKTsKfQp9CgpyZXR1cm4gJGNvbW1hbmRzOwp9CgokY29tbWFuZHMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPmNvbW1hbmRzIGFzICRuYW1lID0+ICRjb21tYW5kKSB7CmlmICgkbmFtZXNwYWNlID09PSAkdGhpcy0+ZXh0cmFjdE5hbWVzcGFjZSgkbmFtZSwgc3Vic3RyX2NvdW50KCRuYW1lc3BhY2UsICc6JykgKyAxKSkgewokY29tbWFuZHNbJG5hbWVdID0gJGNvbW1hbmQ7Cn0KfQoKaWYgKCR0aGlzLT5jb21tYW5kTG9hZGVyKSB7CmZvcmVhY2ggKCR0aGlzLT5jb21tYW5kTG9hZGVyLT5nZXROYW1lcygpIGFzICRuYW1lKSB7CmlmICghaXNzZXQoJGNvbW1hbmRzWyRuYW1lXSkgJiYgJG5hbWVzcGFjZSA9PT0gJHRoaXMtPmV4dHJhY3ROYW1lc3BhY2UoJG5hbWUsIHN1YnN0cl9jb3VudCgkbmFtZXNwYWNlLCAnOicpICsgMSkgJiYgJHRoaXMtPmhhcygkbmFtZSkpIHsKJGNvbW1hbmRzWyRuYW1lXSA9ICR0aGlzLT5nZXQoJG5hbWUpOwp9Cn0KfQoKcmV0dXJuICRjb21tYW5kczsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldEFiYnJldmlhdGlvbnMoYXJyYXkgJG5hbWVzKQp7CiRhYmJyZXZzID0gW107CmZvcmVhY2ggKCRuYW1lcyBhcyAkbmFtZSkgewpmb3IgKCRsZW4gPSBcc3RybGVuKCRuYW1lKTsgJGxlbiA+IDA7IC0tJGxlbikgewokYWJicmV2ID0gc3Vic3RyKCRuYW1lLCAwLCAkbGVuKTsKJGFiYnJldnNbJGFiYnJldl1bXSA9ICRuYW1lOwp9Cn0KCnJldHVybiAkYWJicmV2czsKfQoKcHVibGljIGZ1bmN0aW9uIHJlbmRlclRocm93YWJsZShcVGhyb3dhYmxlICRlLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokb3V0cHV0LT53cml0ZWxuKCcnLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7CgokdGhpcy0+ZG9SZW5kZXJUaHJvd2FibGUoJGUsICRvdXRwdXQpOwoKaWYgKG51bGwgIT09ICR0aGlzLT5ydW5uaW5nQ29tbWFuZCkgewokb3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzxpbmZvPiVzPC9pbmZvPicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKHNwcmludGYoJHRoaXMtPnJ1bm5pbmdDb21tYW5kLT5nZXRTeW5vcHNpcygpLCAkdGhpcy0+Z2V0TmFtZSgpKSkpLCBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9RVUlFVCk7CiRvdXRwdXQtPndyaXRlbG4oJycsIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9SZW5kZXJUaHJvd2FibGUoXFRocm93YWJsZSAkZSwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiB2b2lkCnsKZG8gewokbWVzc2FnZSA9IHRyaW0oJGUtPmdldE1lc3NhZ2UoKSk7CmlmICgnJyA9PT0gJG1lc3NhZ2UgfHwgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSQk9TRSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokY2xhc3MgPSBnZXRfZGVidWdfdHlwZSgkZSk7CiR0aXRsZSA9IHNwcmludGYoJyAgWyVzJXNdICAnLCAkY2xhc3MsIDAgIT09ICgkY29kZSA9ICRlLT5nZXRDb2RlKCkpID8gJyAoJy4kY29kZS4nKScgOiAnJyk7CiRsZW4gPSBIZWxwZXI6OndpZHRoKCR0aXRsZSk7Cn0gZWxzZSB7CiRsZW4gPSAwOwp9CgppZiAoc3RyX2NvbnRhaW5zKCRtZXNzYWdlLCAiQGFub255bW91c1wwIikpIHsKJG1lc3NhZ2UgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9bYS16QS1aX1x4N2YtXHhmZl1bXFxcXGEtekEtWjAtOV9ceDdmLVx4ZmZdKitAYW5vbnltb3VzXHgwMC4qP1wucGhwKD86MHg/fDpbMC05XSsrXCQpP1swLTlhLWZBLUZdKysvJywgZnVuY3Rpb24gKCRtKSB7CnJldHVybiBjbGFzc19leGlzdHMoJG1bMF0sIGZhbHNlKSA/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+ZGlzcGF0Y2goJGV2ZW50LCBDb25zb2xlRXZlbnRzOjpURVJNSU5BVEUpOwoKaWYgKG51bGwgIT09ICRlKSB7CnRocm93ICRlOwp9CgpyZXR1cm4gJGV2ZW50LT5nZXRFeGl0Q29kZSgpOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRDb21tYW5kTmFtZShJbnB1dEludGVyZmFjZSAkaW5wdXQpCnsKcmV0dXJuICR0aGlzLT5zaW5nbGVDb21tYW5kID8gJHRoaXMtPmRlZmF1bHRDb21tYW5kIDogJGlucHV0LT5nZXRGaXJzdEFyZ3VtZW50KCk7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRJbnB1dERlZmluaXRpb24oKQp7CnJldHVybiBuZXcgSW5wdXREZWZpbml0aW9uKFsKbmV3IElucHV0QXJndW1lbnQoJ2NvbW1hbmQnLCBJbnB1dEFyZ3VtZW50OjpSRVFVSVJFRCwgJ1RoZSBjb21tYW5kIHRvIGV4ZWN1dGUnKSwKbmV3IElucHV0T3B0aW9uKCctLWhlbHAnLCAnLWgnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0Rpc3BsYXkgaGVscCBmb3IgdGhlIGdpdmVuIGNvbW1hbmQuIFdoZW4gbm8gY29tbWFuZCBpcyBnaXZlbiBkaXNwbGF5IGhlbHAgZm9yIHRoZSA8aW5mbz4nLiR0aGlzLT5kZWZhdWx0Q29tbWFuZC4nPC9pbmZvPiBjb21tYW5kJyksCm5ldyBJbnB1dE9wdGlvbignLS1xdWlldCcsICctcScsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnRG8gbm90IG91dHB1dCBhbnkgbWVzc2FnZScpLApuZXcgSW5wdXRPcHRpb24oJy0tdmVyYm9zZScsICctdnx2dnx2dnYnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0luY3JlYXNlIHRoZSB2ZXJib3NpdHkgb2YgbWVzc2FnZXM6IDEgZm9yIG5vcm1hbCBvdXRwdXQsIDIgZm9yIG1vcmUgdmVyYm9zZSBvdXRwdXQgYW5kIDMgZm9yIGRlYnVnJyksCm5ldyBJbnB1dE9wdGlvbignLS12ZXJzaW9uJywgJy1WJywgSW5wdXRPcHRpb246OlZBTFVFX05PTkUsICdEaXNwbGF5IHRoaXMgYXBwbGljYXRpb24gdmVyc2lvbicpLApuZXcgSW5wdXRPcHRpb24oJy0tYW5zaScsICcnLCBJbnB1dE9wdGlvbjo6VkFMVUVfTkVHQVRBQkxFLCAnRm9yY2UgKG9yIGRpc2FibGUgLS1uby1hbnNpKSBBTlNJIG91dHB1dCcsIG51bGwpLApuZXcgSW5wdXRPcHRpb24oJy0tbm8taW50ZXJhY3Rpb24nLCAnLW4nLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ0RvIG5vdCBhc2sgYW55IGludGVyYWN0aXZlIHF1ZXN0aW9uJyksCl0pOwp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXREZWZhdWx0Q29tbWFuZHMoKQp7CnJldHVybiBbbmV3IEhlbHBDb21tYW5kKCksIG5ldyBMaXN0Q29tbWFuZCgpLCBuZXcgQ29tcGxldGVDb21tYW5kKCksIG5ldyBEdW1wQ29tcGxldGlvbkNvbW1hbmQoKV07Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGdldERlZmF1bHRIZWxwZXJTZXQoKQp7CnJldHVybiBuZXcgSGVscGVyU2V0KFsKbmV3IEZvcm1hdHRlckhlbHBlcigpLApuZXcgRGVidWdGb3JtYXR0ZXJIZWxwZXIoKSwKbmV3IFByb2Nlc3NIZWxwZXIoKSwKbmV3IFF1ZXN0aW9uSGVscGVyKCksCl0pOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEFiYnJldmlhdGlvblN1Z2dlc3Rpb25zKGFycmF5ICRhYmJyZXZzKTogc3RyaW5nCnsKcmV0dXJuICcgICAgJy5pbXBsb2RlKCJcbiAgICAiLCAkYWJicmV2cyk7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXh0cmFjdE5hbWVzcGFjZShzdHJpbmcgJG5hbWUsID9pbnQgJGxpbWl0ID0gbnVsbCkKewokcGFydHMgPSBleHBsb2RlKCc6JywgJG5hbWUsIC0xKTsKCnJldHVybiBpbXBsb2RlKCc6JywgbnVsbCA9PT0gJGxpbWl0ID8gJHBhcnRzIDogXGFycmF5X3NsaWNlKCRwYXJ0cywgMCwgJGxpbWl0KSk7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmluZEFsdGVybmF0aXZlcyhzdHJpbmcgJG5hbWUsIGl0ZXJhYmxlICRjb2xsZWN0aW9uKTogYXJyYXkKewokdGhyZXNob2xkID0gMWUzOwokYWx0ZXJuYXRpdmVzID0gW107CgokY29sbGVjdGlvblBhcnRzID0gW107CmZvcmVhY2ggKCRjb2xsZWN0aW9uIGFzICRpdGVtKSB7CiRjb2xsZWN0aW9uUGFydHNbJGl0ZW1dID0gZXhwbG9kZSgnOicsICRpdGVtKTsKfQoKZm9yZWFjaCAoZXhwbG9kZSgnOicsICRuYW1lKSBhcyAkaSA9PiAkc3VibmFtZSkgewpmb3JlYWNoICgkY29sbGVjdGlvblBhcnRzIGFzICRjb2xsZWN0aW9uTmFtZSA9PiAkcGFydHMpIHsKJGV4aXN0cyA9IGlzc2V0KCRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSk7CmlmICghaXNzZXQoJHBhcnRzWyRpXSkgJiYgJGV4aXN0cykgewokYWx0ZXJuYXRpdmVzWyRjb2xsZWN0aW9uTmFtZV0gKz0gJHRocmVzaG9sZDsKY29udGludWU7Cn0gZWxzZWlmICghaXNzZXQoJHBhcnRzWyRpXSkpIHsKY29udGludWU7Cn0KCiRsZXYgPSBsZXZlbnNodGVpbigkc3VibmFtZSwgJHBhcnRzWyRpXSk7CmlmICgkbGV2IDw9IFxzdHJsZW4oJHN1Ym5hbWUpIC8gMyB8fCAnJyAhPT0gJHN1Ym5hbWUgJiYgc3RyX2NvbnRhaW5zKCRwYXJ0c1skaV0sICRzdWJuYW1lKSkgewokYWx0ZXJuYXRpdmVzWyRjb2xsZWN0aW9uTmFtZV0gPSAkZXhpc3RzID8gJGFsdGVybmF0aXZlc1skY29sbGVjdGlvbk5hbWVdICsgJGxldiA6ICRsZXY7Cn0gZWxzZWlmICgkZXhpc3RzKSB7CiRhbHRlcm5hdGl2ZXNbJGNvbGxlY3Rpb25OYW1lXSArPSAkdGhyZXNob2xkOwp9Cn0KfQoKZm9yZWFjaCAoJGNvbGxlY3Rpb24gYXMgJGl0ZW0pIHsKJGxldiA9IGxldmVuc2h0ZWluKCRuYW1lLCAkaXRlbSk7CmlmICgkbGV2IDw9IFxzdHJsZW4oJG5hbWUpIC8gMyB8fCBzdHJfY29udGFpbnMoJGl0ZW0sICRuYW1lKSkgewokYWx0ZXJuYXRpdmVzWyRpdGVtXSA9IGlzc2V0KCRhbHRlcm5hdGl2ZXNbJGl0ZW1dKSA/ICRhbHRlcm5hdGl2ZXNbJGl0ZW1dIC0gJGxldiA6ICRsZXY7Cn0KfQoKJGFsdGVybmF0aXZlcyA9IGFycmF5X2ZpbHRlcigkYWx0ZXJuYXRpdmVzLCBmdW5jdGlvbiAoJGxldikgdXNlICgkdGhyZXNob2xkKSB7IHJldHVybiAkbGV2IDwgMiAqICR0aHJlc2hvbGQ7IH0pOwprc29ydCgkYWx0ZXJuYXRpdmVzLCBcU09SVF9OQVRVUkFMIHwgXFNPUlRfRkxBR19DQVNFKTsKCnJldHVybiBhcnJheV9rZXlzKCRhbHRlcm5hdGl2ZXMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWZhdWx0Q29tbWFuZChzdHJpbmcgJGNvbW1hbmROYW1lLCBib29sICRpc1NpbmdsZUNvbW1hbmQgPSBmYWxzZSkKewokdGhpcy0+ZGVmYXVsdENvbW1hbmQgPSBleHBsb2RlKCd8JywgbHRyaW0oJGNvbW1hbmROYW1lLCAnfCcpKVswXTsKCmlmICgkaXNTaW5nbGVDb21tYW5kKSB7CgokdGhpcy0+ZmluZCgkY29tbWFuZE5hbWUpOwoKJHRoaXMtPnNpbmdsZUNvbW1hbmQgPSB0cnVlOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1NpbmdsZUNvbW1hbmQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+c2luZ2xlQ29tbWFuZDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzcGxpdFN0cmluZ0J5V2lkdGgoc3RyaW5nICRzdHJpbmcsIGludCAkd2lkdGgpOiBhcnJheQp7CgoKCmlmIChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBzdHJfc3BsaXQoJHN0cmluZywgJHdpZHRoKTsKfQoKJHV0ZjhTdHJpbmcgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHJpbmcsICd1dGY4JywgJGVuY29kaW5nKTsKJGxpbmVzID0gW107CiRsaW5lID0gJyc7Cgokb2Zmc2V0ID0gMDsKd2hpbGUgKHByZWdfbWF0Y2goJy8uezEsMTAwMDB9L3UnLCAkdXRmOFN0cmluZywgJG0sIDAsICRvZmZzZXQpKSB7CiRvZmZzZXQgKz0gXHN0cmxlbigkbVswXSk7Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCcvL3UnLCAkbVswXSkgYXMgJGNoYXIpIHsKCmlmIChtYl9zdHJ3aWR0aCgkbGluZS4kY2hhciwgJ3V0ZjgnKSA8PSAkd2lkdGgpIHsKJGxpbmUgLj0gJGNoYXI7CmNvbnRpbnVlOwp9CgokbGluZXNbXSA9IHN0cl9wYWQoJGxpbmUsICR3aWR0aCk7CiRsaW5lID0gJGNoYXI7Cn0KfQoKJGxpbmVzW10gPSBcY291bnQoJGxpbmVzKSA/IHN0cl9wYWQoJGxpbmUsICR3aWR0aCkgOiAkbGluZTsKCm1iX2NvbnZlcnRfdmFyaWFibGVzKCRlbmNvZGluZywgJ3V0ZjgnLCAkbGluZXMpOwoKcmV0dXJuICRsaW5lczsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGV4dHJhY3RBbGxOYW1lc3BhY2VzKHN0cmluZyAkbmFtZSk6IGFycmF5CnsKCiRwYXJ0cyA9IGV4cGxvZGUoJzonLCAkbmFtZSwgLTEpOwokbmFtZXNwYWNlcyA9IFtdOwoKZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KSB7CmlmIChcY291bnQoJG5hbWVzcGFjZXMpKSB7CiRuYW1lc3BhY2VzW10gPSBlbmQoJG5hbWVzcGFjZXMpLic6Jy4kcGFydDsKfSBlbHNlIHsKJG5hbWVzcGFjZXNbXSA9ICRwYXJ0Owp9Cn0KCnJldHVybiAkbmFtZXNwYWNlczsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0KCkKewppZiAoJHRoaXMtPmluaXRpYWxpemVkKSB7CnJldHVybjsKfQokdGhpcy0+aW5pdGlhbGl6ZWQgPSB0cnVlOwoKZm9yZWFjaCAoJHRoaXMtPmdldERlZmF1bHRDb21tYW5kcygpIGFzICRjb21tYW5kKSB7CiR0aGlzLT5hZGQoJGNvbW1hbmQpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXR0cmlidXRlOwoKCgoKI1tcQXR0cmlidXRlKFxBdHRyaWJ1dGU6OlRBUkdFVF9DTEFTUyldCmNsYXNzIEFzQ29tbWFuZAp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgKcHVibGljIHN0cmluZyAkbmFtZSwKcHVibGljID9zdHJpbmcgJGRlc2NyaXB0aW9uID0gbnVsbCwKYXJyYXkgJGFsaWFzZXMgPSBbXSwKYm9vbCAkaGlkZGVuID0gZmFsc2UsCikgewppZiAoISRoaWRkZW4gJiYgISRhbGlhc2VzKSB7CnJldHVybjsKfQoKJG5hbWUgPSBleHBsb2RlKCd8JywgJG5hbWUpOwokbmFtZSA9IGFycmF5X21lcmdlKCRuYW1lLCAkYWxpYXNlcyk7CgppZiAoJGhpZGRlbiAmJiAnJyAhPT0gJG5hbWVbMF0pIHsKYXJyYXlfdW5zaGlmdCgkbmFtZSwgJycpOwp9CgokdGhpcy0+bmFtZSA9IGltcGxvZGUoJ3wnLCAkbmFtZSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ0k7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBHaXRodWJBY3Rpb25SZXBvcnRlcgp7CnByaXZhdGUgJG91dHB1dDsKCgoKCnByaXZhdGUgY29uc3QgRVNDQVBFRF9EQVRBID0gWwonJScgPT4gJyUyNScsCiJcciIgPT4gJyUwRCcsCiJcbiIgPT4gJyUwQScsCl07CgoKCgpwcml2YXRlIGNvbnN0IEVTQ0FQRURfUFJPUEVSVElFUyA9IFsKJyUnID0+ICclMjUnLAoiXHIiID0+ICclMEQnLAoiXG4iID0+ICclMEEnLAonOicgPT4gJyUzQScsCicsJyA9PiAnJTJDJywKXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0dpdGh1YkFjdGlvbkVudmlyb25tZW50KCk6IGJvb2wKewpyZXR1cm4gZmFsc2UgIT09IGdldGVudignR0lUSFVCX0FDVElPTlMnKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZXJyb3Ioc3RyaW5nICRtZXNzYWdlLCA/c3RyaW5nICRmaWxlID0gbnVsbCwgP2ludCAkbGluZSA9IG51bGwsID9pbnQgJGNvbCA9IG51bGwpOiB2b2lkCnsKJHRoaXMtPmxvZygnZXJyb3InLCAkbWVzc2FnZSwgJGZpbGUsICRsaW5lLCAkY29sKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZyhzdHJpbmcgJG1lc3NhZ2UsID9zdHJpbmcgJGZpbGUgPSBudWxsLCA/aW50ICRsaW5lID0gbnVsbCwgP2ludCAkY29sID0gbnVsbCk6IHZvaWQKewokdGhpcy0+bG9nKCd3YXJuaW5nJywgJG1lc3NhZ2UsICRmaWxlLCAkbGluZSwgJGNvbCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlYnVnKHN0cmluZyAkbWVzc2FnZSwgP3N0cmluZyAkZmlsZSA9IG51bGwsID9pbnQgJGxpbmUgPSBudWxsLCA/aW50ICRjb2wgPSBudWxsKTogdm9pZAp7CiR0aGlzLT5sb2coJ2RlYnVnJywgJG1lc3NhZ2UsICRmaWxlLCAkbGluZSwgJGNvbCk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbG9nKHN0cmluZyAkdHlwZSwgc3RyaW5nICRtZXNzYWdlLCA/c3RyaW5nICRmaWxlID0gbnVsbCwgP2ludCAkbGluZSA9IG51bGwsID9pbnQgJGNvbCA9IG51bGwpOiB2b2lkCnsKCiRtZXNzYWdlID0gc3RydHIoJG1lc3NhZ2UsIHNlbGY6OkVTQ0FQRURfREFUQSk7CgppZiAoISRmaWxlKSB7CgokdGhpcy0+b3V0cHV0LT53cml0ZWxuKHNwcmludGYoJzo6JXM6OiVzJywgJHR5cGUsICRtZXNzYWdlKSk7CgpyZXR1cm47Cn0KCiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oc3ByaW50ZignOjolcyBmaWxlPSVzLGxpbmU9JXMsY29sPSVzOjolcycsICR0eXBlLCBzdHJ0cigkZmlsZSwgc2VsZjo6RVNDQVBFRF9QUk9QRVJUSUVTKSwgc3RydHIoJGxpbmUgPz8gMSwgc2VsZjo6RVNDQVBFRF9QUk9QRVJUSUVTKSwgc3RydHIoJGNvbCA/PyAwLCBzZWxmOjpFU0NBUEVEX1BST1BFUlRJRVMpLCAkbWVzc2FnZSkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCmZpbmFsIGNsYXNzIENvbG9yCnsKcHJpdmF0ZSBjb25zdCBDT0xPUlMgPSBbCidibGFjaycgPT4gMCwKJ3JlZCcgPT4gMSwKJ2dyZWVuJyA9PiAyLAoneWVsbG93JyA9PiAzLAonYmx1ZScgPT4gNCwKJ21hZ2VudGEnID0+IDUsCidjeWFuJyA9PiA2LAond2hpdGUnID0+IDcsCidkZWZhdWx0JyA9PiA5LApdOwoKcHJpdmF0ZSBjb25zdCBCUklHSFRfQ09MT1JTID0gWwonZ3JheScgPT4gMCwKJ2JyaWdodC1yZWQnID0+IDEsCidicmlnaHQtZ3JlZW4nID0+IDIsCidicmlnaHQteWVsbG93JyA9PiAzLAonYnJpZ2h0LWJsdWUnID0+IDQsCidicmlnaHQtbWFnZW50YScgPT4gNSwKJ2JyaWdodC1jeWFuJyA9PiA2LAonYnJpZ2h0LXdoaXRlJyA9PiA3LApdOwoKcHJpdmF0ZSBjb25zdCBBVkFJTEFCTEVfT1BUSU9OUyA9IFsKJ2JvbGQnID0+IFsnc2V0JyA9PiAxLCAndW5zZXQnID0+IDIyXSwKJ3VuZGVyc2NvcmUnID0+IFsnc2V0JyA9PiA0LCAndW5zZXQnID0+IDI0XSwKJ2JsaW5rJyA9PiBbJ3NldCcgPT4gNSwgJ3Vuc2V0JyA9PiAyNV0sCidyZXZlcnNlJyA9PiBbJ3NldCcgPT4gNywgJ3Vuc2V0JyA9PiAyN10sCidjb25jZWFsJyA9PiBbJ3NldCcgPT4gOCwgJ3Vuc2V0JyA9PiAyOF0sCl07Cgpwcml2YXRlICRmb3JlZ3JvdW5kOwpwcml2YXRlICRiYWNrZ3JvdW5kOwpwcml2YXRlICRvcHRpb25zID0gW107CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRmb3JlZ3JvdW5kID0gJycsIHN0cmluZyAkYmFja2dyb3VuZCA9ICcnLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT5mb3JlZ3JvdW5kID0gJHRoaXMtPnBhcnNlQ29sb3IoJGZvcmVncm91bmQpOwokdGhpcy0+YmFja2dyb3VuZCA9ICR0aGlzLT5wYXJzZUNvbG9yKCRiYWNrZ3JvdW5kLCB0cnVlKTsKCmZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24pIHsKaWYgKCFpc3NldChzZWxmOjpBVkFJTEFCTEVfT1BUSU9OU1skb3B0aW9uXSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIG9wdGlvbiBzcGVjaWZpZWQ6ICIlcyIuIEV4cGVjdGVkIG9uZSBvZiAoJXMpLicsICRvcHRpb24sIGltcGxvZGUoJywgJywgYXJyYXlfa2V5cyhzZWxmOjpBVkFJTEFCTEVfT1BUSU9OUykpKSk7Cn0KCiR0aGlzLT5vcHRpb25zWyRvcHRpb25dID0gc2VsZjo6QVZBSUxBQkxFX09QVElPTlNbJG9wdGlvbl07Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGFwcGx5KHN0cmluZyAkdGV4dCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c2V0KCkuJHRleHQuJHRoaXMtPnVuc2V0KCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXQoKTogc3RyaW5nCnsKJHNldENvZGVzID0gW107CmlmICgnJyAhPT0gJHRoaXMtPmZvcmVncm91bmQpIHsKJHNldENvZGVzW10gPSAkdGhpcy0+Zm9yZWdyb3VuZDsKfQppZiAoJycgIT09ICR0aGlzLT5iYWNrZ3JvdW5kKSB7CiRzZXRDb2Rlc1tdID0gJHRoaXMtPmJhY2tncm91bmQ7Cn0KZm9yZWFjaCAoJHRoaXMtPm9wdGlvbnMgYXMgJG9wdGlvbikgewokc2V0Q29kZXNbXSA9ICRvcHRpb25bJ3NldCddOwp9CmlmICgwID09PSBcY291bnQoJHNldENvZGVzKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiBzcHJpbnRmKCJcMDMzWyVzbSIsIGltcGxvZGUoJzsnLCAkc2V0Q29kZXMpKTsKfQoKcHVibGljIGZ1bmN0aW9uIHVuc2V0KCk6IHN0cmluZwp7CiR1bnNldENvZGVzID0gW107CmlmICgnJyAhPT0gJHRoaXMtPmZvcmVncm91bmQpIHsKJHVuc2V0Q29kZXNbXSA9IDM5Owp9CmlmICgnJyAhPT0gJHRoaXMtPmJhY2tncm91bmQpIHsKJHVuc2V0Q29kZXNbXSA9IDQ5Owp9CmZvcmVhY2ggKCR0aGlzLT5vcHRpb25zIGFzICRvcHRpb24pIHsKJHVuc2V0Q29kZXNbXSA9ICRvcHRpb25bJ3Vuc2V0J107Cn0KaWYgKDAgPT09IFxjb3VudCgkdW5zZXRDb2RlcykpIHsKcmV0dXJuICcnOwp9CgpyZXR1cm4gc3ByaW50ZigiXDAzM1slc20iLCBpbXBsb2RlKCc7JywgJHVuc2V0Q29kZXMpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBwYXJzZUNvbG9yKHN0cmluZyAkY29sb3IsIGJvb2wgJGJhY2tncm91bmQgPSBmYWxzZSk6IHN0cmluZwp7CmlmICgnJyA9PT0gJGNvbG9yKSB7CnJldHVybiAnJzsKfQoKaWYgKCcjJyA9PT0gJGNvbG9yWzBdKSB7CiRjb2xvciA9IHN1YnN0cigkY29sb3IsIDEpOwoKaWYgKDMgPT09IFxzdHJsZW4oJGNvbG9yKSkgewokY29sb3IgPSAkY29sb3JbMF0uJGNvbG9yWzBdLiRjb2xvclsxXS4kY29sb3JbMV0uJGNvbG9yWzJdLiRjb2xvclsyXTsKfQoKaWYgKDYgIT09IFxzdHJsZW4oJGNvbG9yKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0ludmFsaWQgIiVzIiBjb2xvci4nLCAkY29sb3IpKTsKfQoKcmV0dXJuICgkYmFja2dyb3VuZCA/ICc0JyA6ICczJykuJHRoaXMtPmNvbnZlcnRIZXhDb2xvclRvQW5zaShoZXhkZWMoJGNvbG9yKSk7Cn0KCmlmIChpc3NldChzZWxmOjpDT0xPUlNbJGNvbG9yXSkpIHsKcmV0dXJuICgkYmFja2dyb3VuZCA/ICc0JyA6ICczJykuc2VsZjo6Q09MT1JTWyRjb2xvcl07Cn0KCmlmIChpc3NldChzZWxmOjpCUklHSFRfQ09MT1JTWyRjb2xvcl0pKSB7CnJldHVybiAoJGJhY2tncm91bmQgPyAnMTAnIDogJzknKS5zZWxmOjpCUklHSFRfQ09MT1JTWyRjb2xvcl07Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCAiJXMiIGNvbG9yOyBleHBlY3RlZCBvbmUgb2YgKCVzKS4nLCAkY29sb3IsIGltcGxvZGUoJywgJywgYXJyYXlfbWVyZ2UoYXJyYXlfa2V5cyhzZWxmOjpDT0xPUlMpLCBhcnJheV9rZXlzKHNlbGY6OkJSSUdIVF9DT0xPUlMpKSkpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjb252ZXJ0SGV4Q29sb3JUb0Fuc2koaW50ICRjb2xvcik6IHN0cmluZwp7CiRyID0gKCRjb2xvciA+PiAxNikgJiAyNTU7CiRnID0gKCRjb2xvciA+PiA4KSAmIDI1NTsKJGIgPSAkY29sb3IgJiAyNTU7CgoKaWYgKCd0cnVlY29sb3InICE9PSBnZXRlbnYoJ0NPTE9SVEVSTScpKSB7CnJldHVybiAoc3RyaW5nKSAkdGhpcy0+ZGVncmFkZUhleENvbG9yVG9BbnNpKCRyLCAkZywgJGIpOwp9CgpyZXR1cm4gc3ByaW50ZignODsyOyVkOyVkOyVkJywgJHIsICRnLCAkYik7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGVncmFkZUhleENvbG9yVG9BbnNpKGludCAkciwgaW50ICRnLCBpbnQgJGIpOiBpbnQKewppZiAoMCA9PT0gcm91bmQoJHRoaXMtPmdldFNhdHVyYXRpb24oJHIsICRnLCAkYikgLyA1MCkpIHsKcmV0dXJuIDA7Cn0KCnJldHVybiAocm91bmQoJGIgLyAyNTUpIDw8IDIpIHwgKHJvdW5kKCRnIC8gMjU1KSA8PCAxKSB8IHJvdW5kKCRyIC8gMjU1KTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRTYXR1cmF0aW9uKGludCAkciwgaW50ICRnLCBpbnQgJGIpOiBpbnQKewokciA9ICRyIC8gMjU1OwokZyA9ICRnIC8gMjU1OwokYiA9ICRiIC8gMjU1OwokdiA9IG1heCgkciwgJGcsICRiKTsKCmlmICgwID09PSAkZGlmZiA9ICR2IC0gbWluKCRyLCAkZywgJGIpKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gKGludCkgJGRpZmYgKiAxMDAgLyAkdjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEF0dHJpYnV0ZVxBc0NvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcSGVscGVyU2V0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKY2xhc3MgQ29tbWFuZAp7CgpwdWJsaWMgY29uc3QgU1VDQ0VTUyA9IDA7CnB1YmxpYyBjb25zdCBGQUlMVVJFID0gMTsKcHVibGljIGNvbnN0IElOVkFMSUQgPSAyOwoKCgoKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdE5hbWU7CgoKCgpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0RGVzY3JpcHRpb247Cgpwcml2YXRlICRhcHBsaWNhdGlvbjsKcHJpdmF0ZSAkbmFtZTsKcHJpdmF0ZSAkcHJvY2Vzc1RpdGxlOwpwcml2YXRlICRhbGlhc2VzID0gW107CnByaXZhdGUgJGRlZmluaXRpb247CnByaXZhdGUgJGhpZGRlbiA9IGZhbHNlOwpwcml2YXRlICRoZWxwID0gJyc7CnByaXZhdGUgJGRlc2NyaXB0aW9uID0gJyc7CnByaXZhdGUgJGZ1bGxEZWZpbml0aW9uOwpwcml2YXRlICRpZ25vcmVWYWxpZGF0aW9uRXJyb3JzID0gZmFsc2U7CnByaXZhdGUgJGNvZGU7CnByaXZhdGUgJHN5bm9wc2lzID0gW107CnByaXZhdGUgJHVzYWdlcyA9IFtdOwpwcml2YXRlICRoZWxwZXJTZXQ7CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldERlZmF1bHROYW1lKCkKewokY2xhc3MgPSBzdGF0aWM6OmNsYXNzOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCAmJiAkYXR0cmlidXRlID0gKG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcykpLT5nZXRBdHRyaWJ1dGVzKEFzQ29tbWFuZDo6Y2xhc3MpKSB7CnJldHVybiAkYXR0cmlidXRlWzBdLT5uZXdJbnN0YW5jZSgpLT5uYW1lOwp9CgokciA9IG5ldyBcUmVmbGVjdGlvblByb3BlcnR5KCRjbGFzcywgJ2RlZmF1bHROYW1lJyk7CgpyZXR1cm4gJGNsYXNzID09PSAkci0+Y2xhc3MgPyBzdGF0aWM6OiRkZWZhdWx0TmFtZSA6IG51bGw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0RGVmYXVsdERlc2NyaXB0aW9uKCk6ID9zdHJpbmcKewokY2xhc3MgPSBzdGF0aWM6OmNsYXNzOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCAmJiAkYXR0cmlidXRlID0gKG5ldyBcUmVmbGVjdGlvbkNsYXNzKCRjbGFzcykpLT5nZXRBdHRyaWJ1dGVzKEFzQ29tbWFuZDo6Y2xhc3MpKSB7CnJldHVybiAkYXR0cmlidXRlWzBdLT5uZXdJbnN0YW5jZSgpLT5kZXNjcmlwdGlvbjsKfQoKJHIgPSBuZXcgXFJlZmxlY3Rpb25Qcm9wZXJ0eSgkY2xhc3MsICdkZWZhdWx0RGVzY3JpcHRpb24nKTsKCnJldHVybiAkY2xhc3MgPT09ICRyLT5jbGFzcyA/IHN0YXRpYzo6JGRlZmF1bHREZXNjcmlwdGlvbiA6IG51bGw7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJG5hbWUgPSBudWxsKQp7CiR0aGlzLT5kZWZpbml0aW9uID0gbmV3IElucHV0RGVmaW5pdGlvbigpOwoKaWYgKG51bGwgPT09ICRuYW1lICYmIG51bGwgIT09ICRuYW1lID0gc3RhdGljOjpnZXREZWZhdWx0TmFtZSgpKSB7CiRhbGlhc2VzID0gZXhwbG9kZSgnfCcsICRuYW1lKTsKCmlmICgnJyA9PT0gJG5hbWUgPSBhcnJheV9zaGlmdCgkYWxpYXNlcykpIHsKJHRoaXMtPnNldEhpZGRlbih0cnVlKTsKJG5hbWUgPSBhcnJheV9zaGlmdCgkYWxpYXNlcyk7Cn0KCiR0aGlzLT5zZXRBbGlhc2VzKCRhbGlhc2VzKTsKfQoKaWYgKG51bGwgIT09ICRuYW1lKSB7CiR0aGlzLT5zZXROYW1lKCRuYW1lKTsKfQoKaWYgKCcnID09PSAkdGhpcy0+ZGVzY3JpcHRpb24pIHsKJHRoaXMtPnNldERlc2NyaXB0aW9uKHN0YXRpYzo6Z2V0RGVmYXVsdERlc2NyaXB0aW9uKCkgPz8gJycpOwp9CgokdGhpcy0+Y29uZmlndXJlKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKQp7CiR0aGlzLT5pZ25vcmVWYWxpZGF0aW9uRXJyb3JzID0gdHJ1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEFwcGxpY2F0aW9uKD9BcHBsaWNhdGlvbiAkYXBwbGljYXRpb24gPSBudWxsKQp7CiR0aGlzLT5hcHBsaWNhdGlvbiA9ICRhcHBsaWNhdGlvbjsKaWYgKCRhcHBsaWNhdGlvbikgewokdGhpcy0+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+ZGVmaW5pdGlvbjsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRBcmd1bWVudChzdHJpbmcgJG5hbWUsID9pbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCkKewokdGhpcy0+ZGVmaW5pdGlvbi0+YWRkQXJndW1lbnQobmV3IElucHV0QXJndW1lbnQoJG5hbWUsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KSk7CmlmIChudWxsICE9PSAkdGhpcy0+ZnVsbERlZmluaXRpb24pIHsKJHRoaXMtPmZ1bGxEZWZpbml0aW9uLT5hZGRBcmd1bWVudChuZXcgSW5wdXRBcmd1bWVudCgkbmFtZSwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRPcHRpb24oc3RyaW5nICRuYW1lLCAkc2hvcnRjdXQgPSBudWxsLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpCnsKJHRoaXMtPmRlZmluaXRpb24tPmFkZE9wdGlvbihuZXcgSW5wdXRPcHRpb24oJG5hbWUsICRzaG9ydGN1dCwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpKTsKaWYgKG51bGwgIT09ICR0aGlzLT5mdWxsRGVmaW5pdGlvbikgewokdGhpcy0+ZnVsbERlZmluaXRpb24tPmFkZE9wdGlvbihuZXcgSW5wdXRPcHRpb24oJG5hbWUsICRzaG9ydGN1dCwgJG1vZGUsICRkZXNjcmlwdGlvbiwgJGRlZmF1bHQpKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TmFtZShzdHJpbmcgJG5hbWUpCnsKJHRoaXMtPnZhbGlkYXRlTmFtZSgkbmFtZSk7CgokdGhpcy0+bmFtZSA9ICRuYW1lOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQcm9jZXNzVGl0bGUoc3RyaW5nICR0aXRsZSkKewokdGhpcy0+cHJvY2Vzc1RpdGxlID0gJHRpdGxlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhpZGRlbihib29sICRoaWRkZW4gKQp7CiR0aGlzLT5oaWRkZW4gPSAkaGlkZGVuOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNIaWRkZW4oKQp7CnJldHVybiAkdGhpcy0+aGlkZGVuOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZXNjcmlwdGlvbihzdHJpbmcgJGRlc2NyaXB0aW9uKQp7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRpb24oKQp7CnJldHVybiAkdGhpcy0+ZGVzY3JpcHRpb247Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHAoc3RyaW5nICRoZWxwKQp7CiR0aGlzLT5oZWxwID0gJGhlbHA7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHAoKQp7CnJldHVybiAkdGhpcy0+aGVscDsKfQoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3NlZEhlbHAoKQp7CiRuYW1lID0gJHRoaXMtPm5hbWU7CiRpc1NpbmdsZUNvbW1hbmQgPSAkdGhpcy0+YXBwbGljYXRpb24gJiYgJHRoaXMtPmFwcGxpY2F0aW9uLT5pc1NpbmdsZUNvbW1hbmQoKTsKCiRwbGFjZWhvbGRlcnMgPSBbCiclY29tbWFuZC5uYW1lJScsCiclY29tbWFuZC5mdWxsX25hbWUlJywKXTsKJHJlcGxhY2VtZW50cyA9IFsKJG5hbWUsCiRpc1NpbmdsZUNvbW1hbmQgPyAkX1NFUlZFUlsnUEhQX1NFTEYnXSA6ICRfU0VSVkVSWydQSFBfU0VMRiddLicgJy4kbmFtZSwKXTsKCnJldHVybiBzdHJfcmVwbGFjZSgkcGxhY2Vob2xkZXJzLCAkcmVwbGFjZW1lbnRzLCAkdGhpcy0+Z2V0SGVscCgpID86ICR0aGlzLT5nZXREZXNjcmlwdGlvbigpKTsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEFsaWFzZXMoaXRlcmFibGUgJGFsaWFzZXMpCnsKJGxpc3QgPSBbXTsKCmZvcmVhY2ggKCRhbGlhc2VzIGFzICRhbGlhcykgewokdGhpcy0+dmFsaWRhdGVOYW1lKCRhbGlhcyk7CiRsaXN0W10gPSAkYWxpYXM7Cn0KCiR0aGlzLT5hbGlhc2VzID0gXGlzX2FycmF5KCRhbGlhc2VzKSA/ICRhbGlhc2VzIDogJGxpc3Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFsaWFzZXMoKQp7CnJldHVybiAkdGhpcy0+YWxpYXNlczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTeW5vcHNpcyhib29sICRzaG9ydCA9IGZhbHNlKQp7CiRrZXkgPSAkc2hvcnQgPyAnc2hvcnQnIDogJ2xvbmcnOwoKaWYgKCFpc3NldCgkdGhpcy0+c3lub3BzaXNbJGtleV0pKSB7CiR0aGlzLT5zeW5vcHNpc1ska2V5XSA9IHRyaW0oc3ByaW50ZignJXMgJXMnLCAkdGhpcy0+bmFtZSwgJHRoaXMtPmRlZmluaXRpb24tPmdldFN5bm9wc2lzKCRzaG9ydCkpKTsKfQoKcmV0dXJuICR0aGlzLT5zeW5vcHNpc1ska2V5XTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYWRkVXNhZ2Uoc3RyaW5nICR1c2FnZSkKewppZiAoIXN0cl9zdGFydHNfd2l0aCgkdXNhZ2UsICR0aGlzLT5uYW1lKSkgewokdXNhZ2UgPSBzcHJpbnRmKCclcyAlcycsICR0aGlzLT5uYW1lLCAkdXNhZ2UpOwp9CgokdGhpcy0+dXNhZ2VzW10gPSAkdXNhZ2U7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFVzYWdlcygpCnsKcmV0dXJuICR0aGlzLT51c2FnZXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlcihzdHJpbmcgJG5hbWUpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5oZWxwZXJTZXQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCByZXRyaWV2ZSBoZWxwZXIgIiVzIiBiZWNhdXNlIHRoZXJlIGlzIG5vIEhlbHBlclNldCBkZWZpbmVkLiBEaWQgeW91IGZvcmdldCB0byBhZGQgeW91ciBjb21tYW5kIHRvIHRoZSBhcHBsaWNhdGlvbiBvciB0byBzZXQgdGhlIGFwcGxpY2F0aW9uIG9uIHRoZSBjb21tYW5kIHVzaW5nIHRoZSBzZXRBcHBsaWNhdGlvbigpIG1ldGhvZD8gWW91IGNhbiBhbHNvIHNldCB0aGUgSGVscGVyU2V0IGRpcmVjdGx5IHVzaW5nIHRoZSBzZXRIZWxwZXJTZXQoKSBtZXRob2QuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5oZWxwZXJTZXQtPmdldCgkbmFtZSk7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlTmFtZShzdHJpbmcgJG5hbWUpCnsKaWYgKCFwcmVnX21hdGNoKCcvXlteXDpdKysoXDpbXlw6XSsrKSokLycsICRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgbmFtZSAiJXMiIGlzIGludmFsaWQuJywgJG5hbWUpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cT3V0cHV0XEJhc2hDb21wbGV0aW9uT3V0cHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXE91dHB1dFxDb21wbGV0aW9uT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmZpbmFsIGNsYXNzIENvbXBsZXRlQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKewpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0TmFtZSA9ICd8X2NvbXBsZXRlJzsKcHJvdGVjdGVkIHN0YXRpYyAkZGVmYXVsdERlc2NyaXB0aW9uID0gJ0ludGVybmFsIGNvbW1hbmQgdG8gcHJvdmlkZSBzaGVsbCBjb21wbGV0aW9uIHN1Z2dlc3Rpb25zJzsKCnByaXZhdGUgJGNvbXBsZXRpb25PdXRwdXRzOwoKcHJpdmF0ZSAkaXNEZWJ1ZyA9IGZhbHNlOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRjb21wbGV0aW9uT3V0cHV0cyA9IFtdKQp7CgokdGhpcy0+Y29tcGxldGlvbk91dHB1dHMgPSAkY29tcGxldGlvbk91dHB1dHMgKyBbJ2Jhc2gnID0+IEJhc2hDb21wbGV0aW9uT3V0cHV0OjpjbGFzc107CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCk7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKTogdm9pZAp7CiR0aGlzCi0+YWRkT3B0aW9uKCdzaGVsbCcsICdzJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIHNoZWxsIHR5cGUgKCInLmltcGxvZGUoJyIsICInLCBhcnJheV9rZXlzKCR0aGlzLT5jb21wbGV0aW9uT3V0cHV0cykpLiciKScpCi0+YWRkT3B0aW9uKCdpbnB1dCcsICdpJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVEIHwgSW5wdXRPcHRpb246OlZBTFVFX0lTX0FSUkFZLCAnQW4gYXJyYXkgb2YgaW5wdXQgdG9rZW5zIChlLmcuIENPTVBfV09SRFMgb3IgYXJndiknKQotPmFkZE9wdGlvbignY3VycmVudCcsICdjJywgSW5wdXRPcHRpb246OlZBTFVFX1JFUVVJUkVELCAnVGhlIGluZGV4IG9mIHRoZSAiaW5wdXQiIGFycmF5IHRoYXQgdGhlIGN1cnNvciBpcyBpbiAoZS5nLiBDT01QX0NXT1JEKScpCi0+YWRkT3B0aW9uKCdzeW1mb255JywgJ1MnLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUaGUgdmVyc2lvbiBvZiB0aGUgY29tcGxldGlvbiBzY3JpcHQnKQo7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBpbml0aWFsaXplKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJHRoaXMtPmlzRGVidWcgPSBmaWx0ZXJfdmFyKGdldGVudignU1lNRk9OWV9DT01QTEVUSU9OX0RFQlVHJyksIFxGSUxURVJfVkFMSURBVEVfQk9PTEVBTik7Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewp0cnkgewoKCgoKCgoKCgoKCiRzaGVsbCA9ICRpbnB1dC0+Z2V0T3B0aW9uKCdzaGVsbCcpOwppZiAoISRzaGVsbCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ1RoZSAiLS1zaGVsbCIgb3B0aW9uIG11c3QgYmUgc2V0LicpOwp9CgppZiAoISRjb21wbGV0aW9uT3V0cHV0ID0gJHRoaXMtPmNvbXBsZXRpb25PdXRwdXRzWyRzaGVsbF0gPz8gZmFsc2UpIHsKdGhyb3cgbmV3IFxSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ1NoZWxsIGNvbXBsZXRpb24gaXMgbm90IHN1cHBvcnRlZCBmb3IgeW91ciBzaGVsbDogIiVzIiAoc3VwcG9ydGVkOiAiJXMiKS4nLCAkc2hlbGwsIGltcGxvZGUoJyIsICInLCBhcnJheV9rZXlzKCR0aGlzLT5jb21wbGV0aW9uT3V0cHV0cykpKSk7Cn0KCiRjb21wbGV0aW9uSW5wdXQgPSAkdGhpcy0+Y3JlYXRlQ29tcGxldGlvbklucHV0KCRpbnB1dCk7CiRzdWdnZXN0aW9ucyA9IG5ldyBDb21wbGV0aW9uU3VnZ2VzdGlvbnMoKTsKCiR0aGlzLT5sb2coWwonJywKJzxjb21tZW50PicuZGF0ZSgnWS1tLWQgSDppOnMnKS4nPC8+JywKJzxpbmZvPklucHV0OjwvPiA8Y29tbWVudD4oInwiIGluZGljYXRlcyB0aGUgY3Vyc29yIHBvc2l0aW9uKTwvPicsCicgICcuKHN0cmluZykgJGNvbXBsZXRpb25JbnB1dCwKJzxpbmZvPkNvbW1hbmQ6PC8+JywKJyAgJy4oc3RyaW5nKSBpbXBsb2RlKCcgJywgJF9TRVJWRVJbJ2FyZ3YnXSksCic8aW5mbz5NZXNzYWdlczo8Lz4nLApdKTsKCiRjb21tYW5kID0gJHRoaXMtPmZpbmRDb21tYW5kKCRjb21wbGV0aW9uSW5wdXQsICRvdXRwdXQpOwppZiAobnVsbCA9PT0gJGNvbW1hbmQpIHsKJHRoaXMtPmxvZygnICBObyBjb21tYW5kIGZvdW5kLCBjb21wbGV0aW5nIHVzaW5nIHRoZSBBcHBsaWNhdGlvbiBjbGFzcy4nKTsKCiR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5jb21wbGV0ZSgkY29tcGxldGlvbklucHV0LCAkc3VnZ2VzdGlvbnMpOwp9IGVsc2VpZiAoCiRjb21wbGV0aW9uSW5wdXQtPm11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3IoJ2NvbW1hbmQnKQomJiAkY29tbWFuZC0+Z2V0TmFtZSgpICE9PSAkY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVmFsdWUoKQomJiAhXGluX2FycmF5KCRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25WYWx1ZSgpLCAkY29tbWFuZC0+Z2V0QWxpYXNlcygpLCB0cnVlKQopIHsKJHRoaXMtPmxvZygnICBObyBjb21tYW5kIGZvdW5kLCBjb21wbGV0aW5nIHVzaW5nIHRoZSBBcHBsaWNhdGlvbiBjbGFzcy4nKTsKCgokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoYXJyYXlfZmlsdGVyKGFycmF5X21lcmdlKFskY29tbWFuZC0+Z2V0TmFtZSgpXSwgJGNvbW1hbmQtPmdldEFsaWFzZXMoKSkpKTsKfSBlbHNlIHsKJGNvbW1hbmQtPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKCk7CiRjb21wbGV0aW9uSW5wdXQtPmJpbmQoJGNvbW1hbmQtPmdldERlZmluaXRpb24oKSk7CgppZiAoQ29tcGxldGlvbklucHV0OjpUWVBFX09QVElPTl9OQU1FID09PSAkY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uVHlwZSgpKSB7CiR0aGlzLT5sb2coJyAgQ29tcGxldGluZyBvcHRpb24gbmFtZXMgZm9yIHRoZSA8Y29tbWVudD4nLlxnZXRfY2xhc3MoJGNvbW1hbmQgaW5zdGFuY2VvZiBMYXp5Q29tbWFuZCA/ICRjb21tYW5kLT5nZXRDb21tYW5kKCkgOiAkY29tbWFuZCkuJzwvPiBjb21tYW5kLicpOwoKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0T3B0aW9ucygkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpLT5nZXRPcHRpb25zKCkpOwp9IGVsc2UgewokdGhpcy0+bG9nKFsKJyAgQ29tcGxldGluZyB1c2luZyB0aGUgPGNvbW1lbnQ+Jy5cZ2V0X2NsYXNzKCRjb21tYW5kIGluc3RhbmNlb2YgTGF6eUNvbW1hbmQgPyAkY29tbWFuZC0+Z2V0Q29tbWFuZCgpIDogJGNvbW1hbmQpLic8Lz4gY2xhc3MuJywKJyAgQ29tcGxldGluZyA8Y29tbWVudD4nLiRjb21wbGV0aW9uSW5wdXQtPmdldENvbXBsZXRpb25UeXBlKCkuJzwvPiBmb3IgPGNvbW1lbnQ+Jy4kY29tcGxldGlvbklucHV0LT5nZXRDb21wbGV0aW9uTmFtZSgpLic8Lz4nLApdKTsKaWYgKG51bGwgIT09ICRjb21wdmFsID0gJGNvbXBsZXRpb25JbnB1dC0+Z2V0Q29tcGxldGlvblZhbHVlKCkpIHsKJHRoaXMtPmxvZygnICBDdXJyZW50IHZhbHVlOiA8Y29tbWVudD4nLiRjb21wdmFsLic8Lz4nKTsKfQoKJGNvbW1hbmQtPmNvbXBsZXRlKCRjb21wbGV0aW9uSW5wdXQsICRzdWdnZXN0aW9ucyk7Cn0KfQoKCiRjb21wbGV0aW9uT3V0cHV0ID0gbmV3ICRjb21wbGV0aW9uT3V0cHV0KCk7CgokdGhpcy0+bG9nKCc8aW5mbz5TdWdnZXN0aW9uczo8Lz4nKTsKaWYgKCRvcHRpb25zID0gJHN1Z2dlc3Rpb25zLT5nZXRPcHRpb25TdWdnZXN0aW9ucygpKSB7CiR0aGlzLT5sb2coJyAgLS0nLmltcGxvZGUoJyAtLScsIGFycmF5X21hcChmdW5jdGlvbiAoJG8pIHsgcmV0dXJuICRvLT5nZXROYW1lKCk7IH0sICRvcHRpb25zKSkpOwp9IGVsc2VpZiAoJHZhbHVlcyA9ICRzdWdnZXN0aW9ucy0+Z2V0VmFsdWVTdWdnZXN0aW9ucygpKSB7CiR0aGlzLT5sb2coJyAgJy5pbXBsb2RlKCcgJywgJHZhbHVlcykpOwp9IGVsc2UgewokdGhpcy0+bG9nKCcgIDxjb21tZW50Pk5vIHN1Z2dlc3Rpb25zIHdlcmUgcHJvdmlkZWQ8Lz4nKTsKfQoKJGNvbXBsZXRpb25PdXRwdXQtPndyaXRlKCRzdWdnZXN0aW9ucywgJG91dHB1dCk7Cn0gY2F0Y2ggKFxUaHJvd2FibGUgJGUpIHsKJHRoaXMtPmxvZyhbCic8ZXJyb3I+RXJyb3IhPC9lcnJvcj4nLAooc3RyaW5nKSAkZSwKXSk7CgppZiAoJG91dHB1dC0+aXNEZWJ1ZygpKSB7CnRocm93ICRlOwp9CgpyZXR1cm4gMjsKfQoKcmV0dXJuIDA7Cn0KCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlQ29tcGxldGlvbklucHV0KElucHV0SW50ZXJmYWNlICRpbnB1dCk6IENvbXBsZXRpb25JbnB1dAp7CiRjdXJyZW50SW5kZXggPSAkaW5wdXQtPmdldE9wdGlvbignY3VycmVudCcpOwppZiAoISRjdXJyZW50SW5kZXggfHwgIWN0eXBlX2RpZ2l0KCRjdXJyZW50SW5kZXgpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhlICItLWN1cnJlbnQiIG9wdGlvbiBtdXN0IGJlIHNldCBhbmQgaXQgbXVzdCBiZSBhbiBpbnRlZ2VyLicpOwp9CgokY29tcGxldGlvbklucHV0ID0gQ29tcGxldGlvbklucHV0Ojpmcm9tVG9rZW5zKCRpbnB1dC0+Z2V0T3B0aW9uKCdpbnB1dCcpLCAoaW50KSAkY3VycmVudEluZGV4KTsKCnRyeSB7CiRjb21wbGV0aW9uSW5wdXQtPmJpbmQoJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmdldERlZmluaXRpb24oKSk7Cn0gY2F0Y2ggKEV4Y2VwdGlvbkludGVyZmFjZSAkZSkgewp9CgpyZXR1cm4gJGNvbXBsZXRpb25JbnB1dDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBmaW5kQ29tbWFuZChDb21wbGV0aW9uSW5wdXQgJGNvbXBsZXRpb25JbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiA/Q29tbWFuZAp7CnRyeSB7CiRpbnB1dE5hbWUgPSAkY29tcGxldGlvbklucHV0LT5nZXRGaXJzdEFyZ3VtZW50KCk7CmlmIChudWxsID09PSAkaW5wdXROYW1lKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gJHRoaXMtPmdldEFwcGxpY2F0aW9uKCktPmZpbmQoJGlucHV0TmFtZSk7Cn0gY2F0Y2ggKENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbiAkZSkgewp9CgpyZXR1cm4gbnVsbDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBsb2coJG1lc3NhZ2VzKTogdm9pZAp7CmlmICghJHRoaXMtPmlzRGVidWcpIHsKcmV0dXJuOwp9CgokY29tbWFuZE5hbWUgPSBiYXNlbmFtZSgkX1NFUlZFUlsnYXJndiddWzBdKTsKZmlsZV9wdXRfY29udGVudHMoc3lzX2dldF90ZW1wX2RpcigpLicvc2ZfJy4kY29tbWFuZE5hbWUuJy5sb2cnLCBpbXBsb2RlKFxQSFBfRU9MLCAoYXJyYXkpICRtZXNzYWdlcykuXFBIUF9FT0wsIFxGSUxFX0FQUEVORCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKZmluYWwgY2xhc3MgRHVtcENvbXBsZXRpb25Db21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CnByb3RlY3RlZCBzdGF0aWMgJGRlZmF1bHROYW1lID0gJ2NvbXBsZXRpb24nOwpwcm90ZWN0ZWQgc3RhdGljICRkZWZhdWx0RGVzY3JpcHRpb24gPSAnRHVtcCB0aGUgc2hlbGwgY29tcGxldGlvbiBzY3JpcHQnOwoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKENvbXBsZXRpb25JbnB1dCAkaW5wdXQsIENvbXBsZXRpb25TdWdnZXN0aW9ucyAkc3VnZ2VzdGlvbnMpOiB2b2lkCnsKaWYgKCRpbnB1dC0+bXVzdFN1Z2dlc3RBcmd1bWVudFZhbHVlc0Zvcignc2hlbGwnKSkgewokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoJHRoaXMtPmdldFN1cHBvcnRlZFNoZWxscygpKTsKfQp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gY29uZmlndXJlKCkKewokZnVsbENvbW1hbmQgPSAkX1NFUlZFUlsnUEhQX1NFTEYnXTsKJGNvbW1hbmROYW1lID0gYmFzZW5hbWUoJGZ1bGxDb21tYW5kKTsKJGZ1bGxDb21tYW5kID0gQHJlYWxwYXRoKCRmdWxsQ29tbWFuZCkgPzogJGZ1bGxDb21tYW5kOwoKJHRoaXMKLT5zZXRIZWxwKDw8PEVPSApUaGUgPGluZm8+JWNvbW1hbmQubmFtZSU8Lz4gY29tbWFuZCBkdW1wcyB0aGUgc2hlbGwgY29tcGxldGlvbiBzY3JpcHQgcmVxdWlyZWQKdG8gdXNlIHNoZWxsIGF1dG9jb21wbGV0aW9uIChjdXJyZW50bHkgb25seSBiYXNoIGNvbXBsZXRpb24gaXMgc3VwcG9ydGVkKS4KCjxjb21tZW50PlN0YXRpYyBpbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLTwvPgoKRHVtcCB0aGUgc2NyaXB0IHRvIGEgZ2xvYmFsIGNvbXBsZXRpb24gZmlsZSBhbmQgcmVzdGFydCB5b3VyIHNoZWxsOgoKICAgIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgYmFzaCB8IHN1ZG8gdGVlIC9ldGMvYmFzaF9jb21wbGV0aW9uLmQveyRjb21tYW5kTmFtZX08Lz4KCk9yIGR1bXAgdGhlIHNjcmlwdCB0byBhIGxvY2FsIGZpbGUgYW5kIHNvdXJjZSBpdDoKCiAgICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIGJhc2ggPiBjb21wbGV0aW9uLnNoPC8+CgogICAgPGNvbW1lbnQ+IyBzb3VyY2UgdGhlIGZpbGUgd2hlbmV2ZXIgeW91IHVzZSB0aGUgcHJvamVjdDwvPgogICAgPGluZm8+c291cmNlIGNvbXBsZXRpb24uc2g8Lz4KCiAgICA8Y29tbWVudD4jIG9yIGFkZCB0aGlzIGxpbmUgYXQgdGhlIGVuZCBvZiB5b3VyICJ+Ly5iYXNocmMiIGZpbGU6PC8+CiAgICA8aW5mbz5zb3VyY2UgL3BhdGgvdG8vY29tcGxldGlvbi5zaDwvPgoKPGNvbW1lbnQ+RHluYW1pYyBpbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS08Lz4KCkFkZCB0aGlzIHRvIHRoZSBlbmQgb2YgeW91ciBzaGVsbCBjb25maWd1cmF0aW9uIGZpbGUgKGUuZy4gPGluZm8+In4vLmJhc2hyYyI8Lz4pOgoKICAgIDxpbmZvPmV2YWwgIiQoeyRmdWxsQ29tbWFuZH0gY29tcGxldGlvbiBiYXNoKSI8Lz4KRU9ICikKLT5hZGRBcmd1bWVudCgnc2hlbGwnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1RoZSBzaGVsbCB0eXBlIChlLmcuICJiYXNoIiksIHRoZSB2YWx1ZSBvZiB0aGUgIiRTSEVMTCIgZW52IHZhciB3aWxsIGJlIHVzZWQgaWYgdGhpcyBpcyBub3QgZ2l2ZW4nKQotPmFkZE9wdGlvbignZGVidWcnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfTk9ORSwgJ1RhaWwgdGhlIGNvbXBsZXRpb24gZGVidWcgbG9nJykKOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KTogaW50CnsKJGNvbW1hbmROYW1lID0gYmFzZW5hbWUoJF9TRVJWRVJbJ2FyZ3YnXVswXSk7CgppZiAoJGlucHV0LT5nZXRPcHRpb24oJ2RlYnVnJykpIHsKJHRoaXMtPnRhaWxEZWJ1Z0xvZygkY29tbWFuZE5hbWUsICRvdXRwdXQpOwoKcmV0dXJuIDA7Cn0KCiRzaGVsbCA9ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ3NoZWxsJykgPz8gc2VsZjo6Z3Vlc3NTaGVsbCgpOwokY29tcGxldGlvbkZpbGUgPSBfX0RJUl9fLicvLi4vUmVzb3VyY2VzL2NvbXBsZXRpb24uJy4kc2hlbGw7CmlmICghZmlsZV9leGlzdHMoJGNvbXBsZXRpb25GaWxlKSkgewokc3VwcG9ydGVkU2hlbGxzID0gJHRoaXMtPmdldFN1cHBvcnRlZFNoZWxscygpOwoKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CmlmICgkc2hlbGwpIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8ZXJyb3I+RGV0ZWN0ZWQgc2hlbGwgIiVzIiwgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBTeW1mb255IHNoZWxsIGNvbXBsZXRpb24gKHN1cHBvcnRlZCBzaGVsbHM6ICIlcyIpLjwvPicsICRzaGVsbCwgaW1wbG9kZSgnIiwgIicsICRzdXBwb3J0ZWRTaGVsbHMpKSk7Cn0gZWxzZSB7CiRvdXRwdXQtPndyaXRlbG4oc3ByaW50ZignPGVycm9yPlNoZWxsIG5vdCBkZXRlY3RlZCwgU3ltZm9ueSBzaGVsbCBjb21wbGV0aW9uIG9ubHkgc3VwcG9ydHMgIiVzIikuPC8+JywgaW1wbG9kZSgnIiwgIicsICRzdXBwb3J0ZWRTaGVsbHMpKSk7Cn0KCnJldHVybiAyOwp9Cgokb3V0cHV0LT53cml0ZShzdHJfcmVwbGFjZShbJ3t7IENPTU1BTkRfTkFNRSB9fScsICd7eyBWRVJTSU9OIH19J10sIFskY29tbWFuZE5hbWUsICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5nZXRWZXJzaW9uKCldLCBmaWxlX2dldF9jb250ZW50cygkY29tcGxldGlvbkZpbGUpKSk7CgpyZXR1cm4gMDsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ3Vlc3NTaGVsbCgpOiBzdHJpbmcKewpyZXR1cm4gYmFzZW5hbWUoJF9TRVJWRVJbJ1NIRUxMJ10gPz8gJycpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHRhaWxEZWJ1Z0xvZyhzdHJpbmcgJGNvbW1hbmROYW1lLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCk6IHZvaWQKewokZGVidWdGaWxlID0gc3lzX2dldF90ZW1wX2RpcigpLicvc2ZfJy4kY29tbWFuZE5hbWUuJy5sb2cnOwppZiAoIWZpbGVfZXhpc3RzKCRkZWJ1Z0ZpbGUpKSB7CnRvdWNoKCRkZWJ1Z0ZpbGUpOwp9CiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoWyd0YWlsJywgJy1mJywgJGRlYnVnRmlsZV0sIG51bGwsIG51bGwsIG51bGwsIDApOwokcHJvY2Vzcy0+cnVuKGZ1bmN0aW9uIChzdHJpbmcgJHR5cGUsIHN0cmluZyAkbGluZSkgdXNlICgkb3V0cHV0KTogdm9pZCB7CiRvdXRwdXQtPndyaXRlKCRsaW5lKTsKfSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U3VwcG9ydGVkU2hlbGxzKCk6IGFycmF5CnsKJHNoZWxscyA9IFtdOwoKZm9yZWFjaCAobmV3IFxEaXJlY3RvcnlJdGVyYXRvcihfX0RJUl9fLicvLi4vUmVzb3VyY2VzLycpIGFzICRmaWxlKSB7CmlmIChzdHJfc3RhcnRzX3dpdGgoJGZpbGUtPmdldEJhc2VuYW1lKCksICdjb21wbGV0aW9uLicpICYmICRmaWxlLT5pc0ZpbGUoKSkgewokc2hlbGxzW10gPSAkZmlsZS0+Z2V0RXh0ZW5zaW9uKCk7Cn0KfQoKcmV0dXJuICRzaGVsbHM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvclxBcHBsaWNhdGlvbkRlc2NyaXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcRGVzY3JpcHRvckhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBIZWxwQ29tbWFuZCBleHRlbmRzIENvbW1hbmQKewpwcml2YXRlICRjb21tYW5kOwoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGNvbmZpZ3VyZSgpCnsKJHRoaXMtPmlnbm9yZVZhbGlkYXRpb25FcnJvcnMoKTsKCiR0aGlzCi0+c2V0TmFtZSgnaGVscCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCdjb21tYW5kX25hbWUnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1RoZSBjb21tYW5kIG5hbWUnLCAnaGVscCcpLApuZXcgSW5wdXRPcHRpb24oJ2Zvcm1hdCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9SRVFVSVJFRCwgJ1RoZSBvdXRwdXQgZm9ybWF0ICh0eHQsIHhtbCwganNvbiwgb3IgbWQpJywgJ3R4dCcpLApuZXcgSW5wdXRPcHRpb24oJ3JhdycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVG8gb3V0cHV0IHJhdyBjb21tYW5kIGhlbHAnKSwKXSkKLT5zZXREZXNjcmlwdGlvbignRGlzcGxheSBoZWxwIGZvciBhIGNvbW1hbmQnKQotPnNldEhlbHAoPDw8J0VPRicKVGhlIDxpbmZvPiVjb21tYW5kLm5hbWUlPC9pbmZvPiBjb21tYW5kIGRpc3BsYXlzIGhlbHAgZm9yIGEgZ2l2ZW4gY29tbWFuZDoKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJSBsaXN0PC9pbmZvPgoKWW91IGNhbiBhbHNvIG91dHB1dCB0aGUgaGVscCBpbiBvdGhlciBmb3JtYXRzIGJ5IHVzaW5nIHRoZSA8Y29tbWVudD4tLWZvcm1hdDwvY29tbWVudD4gb3B0aW9uOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIC0tZm9ybWF0PXhtbCBsaXN0PC9pbmZvPgoKVG8gZGlzcGxheSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgY29tbWFuZHMsIHBsZWFzZSB1c2UgdGhlIDxpbmZvPmxpc3Q8L2luZm8+IGNvbW1hbmQuCkVPRgopCjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldENvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCkKewokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZXhlY3V0ZShJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CmlmIChudWxsID09PSAkdGhpcy0+Y29tbWFuZCkgewokdGhpcy0+Y29tbWFuZCA9ICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLT5maW5kKCRpbnB1dC0+Z2V0QXJndW1lbnQoJ2NvbW1hbmRfbmFtZScpKTsKfQoKJGhlbHBlciA9IG5ldyBEZXNjcmlwdG9ySGVscGVyKCk7CiRoZWxwZXItPmRlc2NyaWJlKCRvdXRwdXQsICR0aGlzLT5jb21tYW5kLCBbCidmb3JtYXQnID0+ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKSwKJ3Jhd190ZXh0JyA9PiAkaW5wdXQtPmdldE9wdGlvbigncmF3JyksCl0pOwoKJHRoaXMtPmNvbW1hbmQgPSBudWxsOwoKcmV0dXJuIDA7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CmlmICgkaW5wdXQtPm11c3RTdWdnZXN0QXJndW1lbnRWYWx1ZXNGb3IoJ2NvbW1hbmRfbmFtZScpKSB7CiRkZXNjcmlwdG9yID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJHRoaXMtPmdldEFwcGxpY2F0aW9uKCkpOwokc3VnZ2VzdGlvbnMtPnN1Z2dlc3RWYWx1ZXMoYXJyYXlfa2V5cygkZGVzY3JpcHRvci0+Z2V0Q29tbWFuZHMoKSkpOwoKcmV0dXJuOwp9CgppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdE9wdGlvblZhbHVlc0ZvcignZm9ybWF0JykpIHsKJGhlbHBlciA9IG5ldyBEZXNjcmlwdG9ySGVscGVyKCk7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcygkaGVscGVyLT5nZXRGb3JtYXRzKCkpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25JbnB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uU3VnZ2VzdGlvbnM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXJTZXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpmaW5hbCBjbGFzcyBMYXp5Q29tbWFuZCBleHRlbmRzIENvbW1hbmQKewpwcml2YXRlICRjb21tYW5kOwpwcml2YXRlICRpc0VuYWJsZWQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRuYW1lLCBhcnJheSAkYWxpYXNlcywgc3RyaW5nICRkZXNjcmlwdGlvbiwgYm9vbCAkaXNIaWRkZW4sIFxDbG9zdXJlICRjb21tYW5kRmFjdG9yeSwgP2Jvb2wgJGlzRW5hYmxlZCA9IHRydWUpCnsKJHRoaXMtPnNldE5hbWUoJG5hbWUpCi0+c2V0QWxpYXNlcygkYWxpYXNlcykKLT5zZXRIaWRkZW4oJGlzSGlkZGVuKQotPnNldERlc2NyaXB0aW9uKCRkZXNjcmlwdGlvbik7CgokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kRmFjdG9yeTsKJHRoaXMtPmlzRW5hYmxlZCA9ICRpc0VuYWJsZWQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVWYWxpZGF0aW9uRXJyb3JzKCk6IHZvaWQKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5pZ25vcmVWYWxpZGF0aW9uRXJyb3JzKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRBcHBsaWNhdGlvbig/QXBwbGljYXRpb24gJGFwcGxpY2F0aW9uID0gbnVsbCk6IHZvaWQKewppZiAoJHRoaXMtPmNvbW1hbmQgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHRoaXMtPmNvbW1hbmQtPnNldEFwcGxpY2F0aW9uKCRhcHBsaWNhdGlvbik7Cn0KCnBhcmVudDo6c2V0QXBwbGljYXRpb24oJGFwcGxpY2F0aW9uKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldChIZWxwZXJTZXQgJGhlbHBlclNldCk6IHZvaWQKewppZiAoJHRoaXMtPmNvbW1hbmQgaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHRoaXMtPmNvbW1hbmQtPnNldEhlbHBlclNldCgkaGVscGVyU2V0KTsKfQoKcGFyZW50OjpzZXRIZWxwZXJTZXQoJGhlbHBlclNldCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0VuYWJsZWQoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+aXNFbmFibGVkID8/ICR0aGlzLT5nZXRDb21tYW5kKCktPmlzRW5hYmxlZCgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+cnVuKCRpbnB1dCwgJG91dHB1dCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjb21wbGV0ZShDb21wbGV0aW9uSW5wdXQgJGlucHV0LCBDb21wbGV0aW9uU3VnZ2VzdGlvbnMgJHN1Z2dlc3Rpb25zKTogdm9pZAp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmNvbXBsZXRlKCRpbnB1dCwgJHN1Z2dlc3Rpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENvZGUoY2FsbGFibGUgJGNvZGUpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+c2V0Q29kZSgkY29kZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBtZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihib29sICRtZXJnZUFyZ3MgPSB0cnVlKTogdm9pZAp7CiR0aGlzLT5nZXRDb21tYW5kKCktPm1lcmdlQXBwbGljYXRpb25EZWZpbml0aW9uKCRtZXJnZUFyZ3MpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmaW5pdGlvbigkZGVmaW5pdGlvbik6IHNlbGYKewokdGhpcy0+Z2V0Q29tbWFuZCgpLT5zZXREZWZpbml0aW9uKCRkZWZpbml0aW9uKTsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldERlZmluaXRpb24oKTogSW5wdXREZWZpbml0aW9uCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldERlZmluaXRpb24oKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE5hdGl2ZURlZmluaXRpb24oKTogSW5wdXREZWZpbml0aW9uCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldE5hdGl2ZURlZmluaXRpb24oKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEFyZ3VtZW50KHN0cmluZyAkbmFtZSwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmFkZEFyZ3VtZW50KCRuYW1lLCAkbW9kZSwgJGRlc2NyaXB0aW9uLCAkZGVmYXVsdCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRPcHRpb24oc3RyaW5nICRuYW1lLCAkc2hvcnRjdXQgPSBudWxsLCA/aW50ICRtb2RlID0gbnVsbCwgc3RyaW5nICRkZXNjcmlwdGlvbiA9ICcnLCAkZGVmYXVsdCA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+YWRkT3B0aW9uKCRuYW1lLCAkc2hvcnRjdXQsICRtb2RlLCAkZGVzY3JpcHRpb24sICRkZWZhdWx0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb2Nlc3NUaXRsZShzdHJpbmcgJHRpdGxlKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPnNldFByb2Nlc3NUaXRsZSgkdGl0bGUpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscChzdHJpbmcgJGhlbHApOiBzZWxmCnsKJHRoaXMtPmdldENvbW1hbmQoKS0+c2V0SGVscCgkaGVscCk7CgpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXRIZWxwKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzZWRIZWxwKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXRQcm9jZXNzZWRIZWxwKCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTeW5vcHNpcyhib29sICRzaG9ydCA9IGZhbHNlKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5nZXRDb21tYW5kKCktPmdldFN5bm9wc2lzKCRzaG9ydCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRVc2FnZShzdHJpbmcgJHVzYWdlKTogc2VsZgp7CiR0aGlzLT5nZXRDb21tYW5kKCktPmFkZFVzYWdlKCR1c2FnZSk7CgpyZXR1cm4gJHRoaXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRVc2FnZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmdldENvbW1hbmQoKS0+Z2V0VXNhZ2VzKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXIoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+Z2V0Q29tbWFuZCgpLT5nZXRIZWxwZXIoJG5hbWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZCgpOiBwYXJlbnQKewppZiAoISR0aGlzLT5jb21tYW5kIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKcmV0dXJuICR0aGlzLT5jb21tYW5kOwp9CgokY29tbWFuZCA9ICR0aGlzLT5jb21tYW5kID0gKCR0aGlzLT5jb21tYW5kKSgpOwokY29tbWFuZC0+c2V0QXBwbGljYXRpb24oJHRoaXMtPmdldEFwcGxpY2F0aW9uKCkpOwoKaWYgKG51bGwgIT09ICR0aGlzLT5nZXRIZWxwZXJTZXQoKSkgewokY29tbWFuZC0+c2V0SGVscGVyU2V0KCR0aGlzLT5nZXRIZWxwZXJTZXQoKSk7Cn0KCiRjb21tYW5kLT5zZXROYW1lKCR0aGlzLT5nZXROYW1lKCkpCi0+c2V0QWxpYXNlcygkdGhpcy0+Z2V0QWxpYXNlcygpKQotPnNldEhpZGRlbigkdGhpcy0+aXNIaWRkZW4oKSkKLT5zZXREZXNjcmlwdGlvbigkdGhpcy0+Z2V0RGVzY3JpcHRpb24oKSk7CgoKJGNvbW1hbmQtPmdldERlZmluaXRpb24oKTsKCnJldHVybiAkY29tbWFuZDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tcGxldGlvblxDb21wbGV0aW9uSW5wdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvblN1Z2dlc3Rpb25zOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yXEFwcGxpY2F0aW9uRGVzY3JpcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxEZXNjcmlwdG9ySGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmNsYXNzIExpc3RDb21tYW5kIGV4dGVuZHMgQ29tbWFuZAp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBjb25maWd1cmUoKQp7CiR0aGlzCi0+c2V0TmFtZSgnbGlzdCcpCi0+c2V0RGVmaW5pdGlvbihbCm5ldyBJbnB1dEFyZ3VtZW50KCduYW1lc3BhY2UnLCBJbnB1dEFyZ3VtZW50OjpPUFRJT05BTCwgJ1RoZSBuYW1lc3BhY2UgbmFtZScpLApuZXcgSW5wdXRPcHRpb24oJ3JhdycsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVG8gb3V0cHV0IHJhdyBjb21tYW5kIGxpc3QnKSwKbmV3IElucHV0T3B0aW9uKCdmb3JtYXQnLCBudWxsLCBJbnB1dE9wdGlvbjo6VkFMVUVfUkVRVUlSRUQsICdUaGUgb3V0cHV0IGZvcm1hdCAodHh0LCB4bWwsIGpzb24sIG9yIG1kKScsICd0eHQnKSwKbmV3IElucHV0T3B0aW9uKCdzaG9ydCcsIG51bGwsIElucHV0T3B0aW9uOjpWQUxVRV9OT05FLCAnVG8gc2tpcCBkZXNjcmliaW5nIGNvbW1hbmRzXCcgYXJndW1lbnRzJyksCl0pCi0+c2V0RGVzY3JpcHRpb24oJ0xpc3QgY29tbWFuZHMnKQotPnNldEhlbHAoPDw8J0VPRicKVGhlIDxpbmZvPiVjb21tYW5kLm5hbWUlPC9pbmZvPiBjb21tYW5kIGxpc3RzIGFsbCBjb21tYW5kczoKCiAgPGluZm8+JWNvbW1hbmQuZnVsbF9uYW1lJTwvaW5mbz4KCllvdSBjYW4gYWxzbyBkaXNwbGF5IHRoZSBjb21tYW5kcyBmb3IgYSBzcGVjaWZpYyBuYW1lc3BhY2U6CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgdGVzdDwvaW5mbz4KCllvdSBjYW4gYWxzbyBvdXRwdXQgdGhlIGluZm9ybWF0aW9uIGluIG90aGVyIGZvcm1hdHMgYnkgdXNpbmcgdGhlIDxjb21tZW50Pi0tZm9ybWF0PC9jb21tZW50PiBvcHRpb246CgogIDxpbmZvPiVjb21tYW5kLmZ1bGxfbmFtZSUgLS1mb3JtYXQ9eG1sPC9pbmZvPgoKSXQncyBhbHNvIHBvc3NpYmxlIHRvIGdldCByYXcgbGlzdCBvZiBjb21tYW5kcyAodXNlZnVsIGZvciBlbWJlZGRpbmcgY29tbWFuZCBydW5uZXIpOgoKICA8aW5mbz4lY29tbWFuZC5mdWxsX25hbWUlIC0tcmF3PC9pbmZvPgpFT0YKKQo7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBleGVjdXRlKElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpCnsKJGhlbHBlciA9IG5ldyBEZXNjcmlwdG9ySGVscGVyKCk7CiRoZWxwZXItPmRlc2NyaWJlKCRvdXRwdXQsICR0aGlzLT5nZXRBcHBsaWNhdGlvbigpLCBbCidmb3JtYXQnID0+ICRpbnB1dC0+Z2V0T3B0aW9uKCdmb3JtYXQnKSwKJ3Jhd190ZXh0JyA9PiAkaW5wdXQtPmdldE9wdGlvbigncmF3JyksCiduYW1lc3BhY2UnID0+ICRpbnB1dC0+Z2V0QXJndW1lbnQoJ25hbWVzcGFjZScpLAonc2hvcnQnID0+ICRpbnB1dC0+Z2V0T3B0aW9uKCdzaG9ydCcpLApdKTsKCnJldHVybiAwOwp9CgpwdWJsaWMgZnVuY3Rpb24gY29tcGxldGUoQ29tcGxldGlvbklucHV0ICRpbnB1dCwgQ29tcGxldGlvblN1Z2dlc3Rpb25zICRzdWdnZXN0aW9ucyk6IHZvaWQKewppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdEFyZ3VtZW50VmFsdWVzRm9yKCduYW1lc3BhY2UnKSkgewokZGVzY3JpcHRvciA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCR0aGlzLT5nZXRBcHBsaWNhdGlvbigpKTsKJHN1Z2dlc3Rpb25zLT5zdWdnZXN0VmFsdWVzKGFycmF5X2tleXMoJGRlc2NyaXB0b3ItPmdldE5hbWVzcGFjZXMoKSkpOwoKcmV0dXJuOwp9CgppZiAoJGlucHV0LT5tdXN0U3VnZ2VzdE9wdGlvblZhbHVlc0ZvcignZm9ybWF0JykpIHsKJGhlbHBlciA9IG5ldyBEZXNjcmlwdG9ySGVscGVyKCk7CiRzdWdnZXN0aW9ucy0+c3VnZ2VzdFZhbHVlcygkaGVscGVyLT5nZXRGb3JtYXRzKCkpOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XExvY2tcTG9ja0ZhY3Rvcnk7CnVzZSBTeW1mb255XENvbXBvbmVudFxMb2NrXExvY2tJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxMb2NrXFN0b3JlXEZsb2NrU3RvcmU7CnVzZSBTeW1mb255XENvbXBvbmVudFxMb2NrXFN0b3JlXFNlbWFwaG9yZVN0b3JlOwoKCgoKCgp0cmFpdCBMb2NrYWJsZVRyYWl0CnsKCnByaXZhdGUgJGxvY2s7CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGxvY2soP3N0cmluZyAkbmFtZSA9IG51bGwsIGJvb2wgJGJsb2NraW5nID0gZmFsc2UpOiBib29sCnsKaWYgKCFjbGFzc19leGlzdHMoU2VtYXBob3JlU3RvcmU6OmNsYXNzKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1RvIGVuYWJsZSB0aGUgbG9ja2luZyBmZWF0dXJlIHlvdSBtdXN0IGluc3RhbGwgdGhlIHN5bWZvbnkvbG9jayBjb21wb25lbnQuJyk7Cn0KCmlmIChudWxsICE9PSAkdGhpcy0+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/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgQXBwbGljYXRpb25EZXNjcmlwdGlvbgp7CnB1YmxpYyBjb25zdCBHTE9CQUxfTkFNRVNQQUNFID0gJ19nbG9iYWwnOwoKcHJpdmF0ZSAkYXBwbGljYXRpb247CnByaXZhdGUgJG5hbWVzcGFjZTsKcHJpdmF0ZSAkc2hvd0hpZGRlbjsKCgoKCnByaXZhdGUgJG5hbWVzcGFjZXM7CgoKCgpwcml2YXRlICRjb21tYW5kczsKCgoKCnByaXZhdGUgJGFsaWFzZXM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCA/c3RyaW5nICRuYW1lc3BhY2UgPSBudWxsLCBib29sICRzaG93SGlkZGVuID0gZmFsc2UpCnsKJHRoaXMtPmFwcGxpY2F0aW9uID0gJGFwcGxpY2F0aW9uOwokdGhpcy0+bmFtZXNwYWNlID0gJG5hbWVzcGFjZTsKJHRoaXMtPnNob3dIaWRkZW4gPSAkc2hvd0hpZGRlbjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZXMoKTogYXJyYXkKewppZiAobnVsbCA9PT0gJHRoaXMtPm5hbWVzcGFjZXMpIHsKJHRoaXMtPmluc3BlY3RBcHBsaWNhdGlvbigpOwp9CgpyZXR1cm4gJHRoaXMtPm5hbWVzcGFjZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kcygpOiBhcnJheQp7CmlmIChudWxsID09PSAkdGhpcy0+Y29tbWFuZHMpIHsKJHRoaXMtPmluc3BlY3RBcHBsaWNhdGlvbigpOwp9CgpyZXR1cm4gJHRoaXMtPmNvbW1hbmRzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q29tbWFuZChzdHJpbmcgJG5hbWUpOiBDb21tYW5kCnsKaWYgKCFpc3NldCgkdGhpcy0+Y29tbWFuZHNbJG5hbWVdKSAmJiAhaXNzZXQoJHRoaXMtPmFsaWFzZXNbJG5hbWVdKSkgewp0aHJvdyBuZXcgQ29tbWFuZE5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ0NvbW1hbmQgIiVzIiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPmNvbW1hbmRzWyRuYW1lXSA/PyAkdGhpcy0+YWxpYXNlc1skbmFtZV07Cn0KCnByaXZhdGUgZnVuY3Rpb24gaW5zcGVjdEFwcGxpY2F0aW9uKCkKewokdGhpcy0+Y29tbWFuZHMgPSBbXTsKJHRoaXMtPm5hbWVzcGFjZXMgPSBbXTsKCiRhbGwgPSAkdGhpcy0+YXBwbGljYXRpb24tPmFsbCgkdGhpcy0+bmFtZXNwYWNlID8gJHRoaXMtPmFwcGxpY2F0aW9uLT5maW5kTmFtZXNwYWNlKCR0aGlzLT5uYW1lc3BhY2UpIDogbnVsbCk7CmZvcmVhY2ggKCR0aGlzLT5zb3J0Q29tbWFuZHMoJGFsbCkgYXMgJG5hbWVzcGFjZSA9PiAkY29tbWFuZHMpIHsKJG5hbWVzID0gW107CgoKZm9yZWFjaCAoJGNvbW1hbmRzIGFzICRuYW1lID0+ICRjb21tYW5kKSB7CmlmICghJGNvbW1hbmQtPmdldE5hbWUoKSB8fCAoISR0aGlzLT5zaG93SGlkZGVuICYmICRjb21tYW5kLT5pc0hpZGRlbigpKSkgewpjb250aW51ZTsKfQoKaWYgKCRjb21tYW5kLT5nZXROYW1lKCkgPT09ICRuYW1lKSB7CiR0aGlzLT5jb21tYW5kc1skbmFtZV0gPSAkY29tbWFuZDsKfSBlbHNlIHsKJHRoaXMtPmFsaWFzZXNbJG5hbWVdID0gJGNvbW1hbmQ7Cn0KCiRuYW1lc1tdID0gJG5hbWU7Cn0KCiR0aGlzLT5uYW1lc3BhY2VzWyRuYW1lc3BhY2VdID0gWydpZCcgPT4gJG5hbWVzcGFjZSwgJ2NvbW1hbmRzJyA9PiAkbmFtZXNdOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gc29ydENvbW1hbmRzKGFycmF5ICRjb21tYW5kcyk6IGFycmF5CnsKJG5hbWVzcGFjZWRDb21tYW5kcyA9IFtdOwokZ2xvYmFsQ29tbWFuZHMgPSBbXTsKJHNvcnRlZENvbW1hbmRzID0gW107CmZvcmVhY2ggKCRjb21tYW5kcyBhcyAkbmFtZSA9PiAkY29tbWFuZCkgewoka2V5ID0gJHRoaXMtPmFwcGxpY2F0aW9uLT5leHRyYWN0TmFtZXNwYWNlKCRuYW1lLCAxKTsKaWYgKFxpbl9hcnJheSgka2V5LCBbJycsIHNlbGY6OkdMT0JBTF9OQU1FU1BBQ0VdLCB0cnVlKSkgewokZ2xvYmFsQ29tbWFuZHNbJG5hbWVdID0gJGNvbW1hbmQ7Cn0gZWxzZSB7CiRuYW1lc3BhY2VkQ29tbWFuZHNbJGtleV1bJG5hbWVdID0gJGNvbW1hbmQ7Cn0KfQoKaWYgKCRnbG9iYWxDb21tYW5kcykgewprc29ydCgkZ2xvYmFsQ29tbWFuZHMpOwokc29ydGVkQ29tbWFuZHNbc2VsZjo6R0xPQkFMX05BTUVTUEFDRV0gPSAkZ2xvYmFsQ29tbWFuZHM7Cn0KCmlmICgkbmFtZXNwYWNlZENvbW1hbmRzKSB7Cmtzb3J0KCRuYW1lc3BhY2VkQ29tbWFuZHMsIFxTT1JUX1NUUklORyk7CmZvcmVhY2ggKCRuYW1lc3BhY2VkQ29tbWFuZHMgYXMgJGtleSA9PiAkY29tbWFuZHNTZXQpIHsKa3NvcnQoJGNvbW1hbmRzU2V0KTsKJHNvcnRlZENvbW1hbmRzWyRrZXldID0gJGNvbW1hbmRzU2V0Owp9Cn0KCnJldHVybiAkc29ydGVkQ29tbWFuZHM7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3IgaW1wbGVtZW50cyBEZXNjcmlwdG9ySW50ZXJmYWNlCnsKCgoKcHJvdGVjdGVkICRvdXRwdXQ7CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGVzY3JpYmUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIG9iamVjdCAkb2JqZWN0LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwoKc3dpdGNoICh0cnVlKSB7CmNhc2UgJG9iamVjdCBpbnN0YW5jZW9mIElucHV0QXJndW1lbnQ6CiR0aGlzLT5kZXNjcmliZUlucHV0QXJndW1lbnQoJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgSW5wdXRPcHRpb246CiR0aGlzLT5kZXNjcmliZUlucHV0T3B0aW9uKCRvYmplY3QsICRvcHRpb25zKTsKYnJlYWs7CmNhc2UgJG9iamVjdCBpbnN0YW5jZW9mIElucHV0RGVmaW5pdGlvbjoKJHRoaXMtPmRlc2NyaWJlSW5wdXREZWZpbml0aW9uKCRvYmplY3QsICRvcHRpb25zKTsKYnJlYWs7CmNhc2UgJG9iamVjdCBpbnN0YW5jZW9mIENvbW1hbmQ6CiR0aGlzLT5kZXNjcmliZUNvbW1hbmQoJG9iamVjdCwgJG9wdGlvbnMpOwpicmVhazsKY2FzZSAkb2JqZWN0IGluc3RhbmNlb2YgQXBwbGljYXRpb246CiR0aGlzLT5kZXNjcmliZUFwcGxpY2F0aW9uKCRvYmplY3QsICRvcHRpb25zKTsKYnJlYWs7CmRlZmF1bHQ6CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignT2JqZWN0IG9mIHR5cGUgIiVzIiBpcyBub3QgZGVzY3JpYmFibGUuJywgZ2V0X2RlYnVnX3R5cGUoJG9iamVjdCkpKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGUoc3RyaW5nICRjb250ZW50LCBib29sICRkZWNvcmF0ZWQgPSBmYWxzZSkKewokdGhpcy0+b3V0cHV0LT53cml0ZSgkY29udGVudCwgZmFsc2UsICRkZWNvcmF0ZWQgPyBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9OT1JNQUwgOiBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9SQVcpOwp9CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24sIGFycmF5ICRvcHRpb25zID0gW10pOwoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXREZWZpbml0aW9uKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pOwoKCgoKYWJzdHJhY3QgcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmludGVyZmFjZSBEZXNjcmlwdG9ySW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIGRlc2NyaWJlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBvYmplY3QgJG9iamVjdCwgYXJyYXkgJG9wdGlvbnMgPSBbXSk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXERlc2NyaXB0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEFyZ3VtZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dERlZmluaXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0T3B0aW9uOwoKCgoKCgoKCmNsYXNzIEpzb25EZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvcgp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0QXJndW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRGF0YSgkdGhpcy0+Z2V0SW5wdXRBcmd1bWVudERhdGEoJGFyZ3VtZW50KSwgJG9wdGlvbnMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dE9wdGlvbihJbnB1dE9wdGlvbiAkb3B0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldElucHV0T3B0aW9uRGF0YSgkb3B0aW9uKSwgJG9wdGlvbnMpOwppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5nZXRJbnB1dE9wdGlvbkRhdGEoJG9wdGlvbiwgdHJ1ZSksICRvcHRpb25zKTsKfQp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURhdGEoJHRoaXMtPmdldElucHV0RGVmaW5pdGlvbkRhdGEoJGRlZmluaXRpb24pLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUNvbW1hbmQoQ29tbWFuZCAkY29tbWFuZCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGVEYXRhKCR0aGlzLT5nZXRDb21tYW5kRGF0YSgkY29tbWFuZCwgJG9wdGlvbnNbJ3Nob3J0J10gPz8gZmFsc2UpLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUFwcGxpY2F0aW9uKEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbiwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokZGVzY3JpYmVkTmFtZXNwYWNlID0gJG9wdGlvbnNbJ25hbWVzcGFjZSddID8/IG51bGw7CiRkZXNjcmlwdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKCRhcHBsaWNhdGlvbiwgJGRlc2NyaWJlZE5hbWVzcGFjZSwgdHJ1ZSk7CiRjb21tYW5kcyA9IFtdOwoKZm9yZWFjaCAoJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpIGFzICRjb21tYW5kKSB7CiRjb21tYW5kc1tdID0gJHRoaXMtPmdldENvbW1hbmREYXRhKCRjb21tYW5kLCAkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSk7Cn0KCiRkYXRhID0gW107CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpKSB7CiRkYXRhWydhcHBsaWNhdGlvbiddWyduYW1lJ10gPSAkYXBwbGljYXRpb24tPmdldE5hbWUoKTsKaWYgKCdVTktOT1dOJyAhPT0gJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCkpIHsKJGRhdGFbJ2FwcGxpY2F0aW9uJ11bJ3ZlcnNpb24nXSA9ICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpOwp9Cn0KCiRkYXRhWydjb21tYW5kcyddID0gJGNvbW1hbmRzOwoKaWYgKCRkZXNjcmliZWROYW1lc3BhY2UpIHsKJGRhdGFbJ25hbWVzcGFjZSddID0gJGRlc2NyaWJlZE5hbWVzcGFjZTsKfSBlbHNlIHsKJGRhdGFbJ25hbWVzcGFjZXMnXSA9IGFycmF5X3ZhbHVlcygkZGVzY3JpcHRpb24tPmdldE5hbWVzcGFjZXMoKSk7Cn0KCiR0aGlzLT53cml0ZURhdGEoJGRhdGEsICRvcHRpb25zKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZURhdGEoYXJyYXkgJGRhdGEsIGFycmF5ICRvcHRpb25zKQp7CiRmbGFncyA9ICRvcHRpb25zWydqc29uX2VuY29kaW5nJ10gPz8gMDsKCiR0aGlzLT53cml0ZShqc29uX2VuY29kZSgkZGF0YSwgJGZsYWdzKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0SW5wdXRBcmd1bWVudERhdGEoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQpOiBhcnJheQp7CnJldHVybiBbCiduYW1lJyA9PiAkYXJndW1lbnQtPmdldE5hbWUoKSwKJ2lzX3JlcXVpcmVkJyA9PiAkYXJndW1lbnQtPmlzUmVxdWlyZWQoKSwKJ2lzX2FycmF5JyA9PiAkYXJndW1lbnQtPmlzQXJyYXkoKSwKJ2Rlc2NyaXB0aW9uJyA9PiBwcmVnX3JlcGxhY2UoJy9ccypbXHJcbl1ccyovJywgJyAnLCAkYXJndW1lbnQtPmdldERlc2NyaXB0aW9uKCkpLAonZGVmYXVsdCcgPT4gXElORiA9PT0gJGFyZ3VtZW50LT5nZXREZWZhdWx0KCkgPyAnSU5GJyA6ICRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpLApdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldElucHV0T3B0aW9uRGF0YShJbnB1dE9wdGlvbiAkb3B0aW9uLCBib29sICRuZWdhdGVkID0gZmFsc2UpOiBhcnJheQp7CnJldHVybiAkbmVnYXRlZCA/IFsKJ25hbWUnID0+ICctLW5vLScuJG9wdGlvbi0+Z2V0TmFtZSgpLAonc2hvcnRjdXQnID0+ICcnLAonYWNjZXB0X3ZhbHVlJyA9PiBmYWxzZSwKJ2lzX3ZhbHVlX3JlcXVpcmVkJyA9PiBmYWxzZSwKJ2lzX211bHRpcGxlJyA9PiBmYWxzZSwKJ2Rlc2NyaXB0aW9uJyA9PiAnTmVnYXRlIHRoZSAiLS0nLiRvcHRpb24tPmdldE5hbWUoKS4nIiBvcHRpb24nLAonZGVmYXVsdCcgPT4gZmFsc2UsCl0gOiBbCiduYW1lJyA9PiAnLS0nLiRvcHRpb24tPmdldE5hbWUoKSwKJ3Nob3J0Y3V0JyA9PiAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8gJy0nLnN0cl9yZXBsYWNlKCd8JywgJ3wtJywgJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSkgOiAnJywKJ2FjY2VwdF92YWx1ZScgPT4gJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSwKJ2lzX3ZhbHVlX3JlcXVpcmVkJyA9PiAkb3B0aW9uLT5pc1ZhbHVlUmVxdWlyZWQoKSwKJ2lzX211bHRpcGxlJyA9PiAkb3B0aW9uLT5pc0FycmF5KCksCidkZXNjcmlwdGlvbicgPT4gcHJlZ19yZXBsYWNlKCcvXHMqW1xyXG5dXHMqLycsICcgJywgJG9wdGlvbi0+Z2V0RGVzY3JpcHRpb24oKSksCidkZWZhdWx0JyA9PiBcSU5GID09PSAkb3B0aW9uLT5nZXREZWZhdWx0KCkgPyAnSU5GJyA6ICRvcHRpb24tPmdldERlZmF1bHQoKSwKXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dERlZmluaXRpb25EYXRhKElucHV0RGVmaW5pdGlvbiAkZGVmaW5pdGlvbik6IGFycmF5CnsKJGlucHV0QXJndW1lbnRzID0gW107CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkbmFtZSA9PiAkYXJndW1lbnQpIHsKJGlucHV0QXJndW1lbnRzWyRuYW1lXSA9ICR0aGlzLT5nZXRJbnB1dEFyZ3VtZW50RGF0YSgkYXJndW1lbnQpOwp9CgokaW5wdXRPcHRpb25zID0gW107CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgYXMgJG5hbWUgPT4gJG9wdGlvbikgewokaW5wdXRPcHRpb25zWyRuYW1lXSA9ICR0aGlzLT5nZXRJbnB1dE9wdGlvbkRhdGEoJG9wdGlvbik7CmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiRpbnB1dE9wdGlvbnNbJ25vLScuJG5hbWVdID0gJHRoaXMtPmdldElucHV0T3B0aW9uRGF0YSgkb3B0aW9uLCB0cnVlKTsKfQp9CgpyZXR1cm4gWydhcmd1bWVudHMnID0+ICRpbnB1dEFyZ3VtZW50cywgJ29wdGlvbnMnID0+ICRpbnB1dE9wdGlvbnNdOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbW1hbmREYXRhKENvbW1hbmQgJGNvbW1hbmQsIGJvb2wgJHNob3J0ID0gZmFsc2UpOiBhcnJheQp7CiRkYXRhID0gWwonbmFtZScgPT4gJGNvbW1hbmQtPmdldE5hbWUoKSwKJ2Rlc2NyaXB0aW9uJyA9PiAkY29tbWFuZC0+Z2V0RGVzY3JpcHRpb24oKSwKXTsKCmlmICgkc2hvcnQpIHsKJGRhdGEgKz0gWwondXNhZ2UnID0+ICRjb21tYW5kLT5nZXRBbGlhc2VzKCksCl07Cn0gZWxzZSB7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihmYWxzZSk7CgokZGF0YSArPSBbCid1c2FnZScgPT4gYXJyYXlfbWVyZ2UoWyRjb21tYW5kLT5nZXRTeW5vcHNpcygpXSwgJGNvbW1hbmQtPmdldFVzYWdlcygpLCAkY29tbWFuZC0+Z2V0QWxpYXNlcygpKSwKJ2hlbHAnID0+ICRjb21tYW5kLT5nZXRQcm9jZXNzZWRIZWxwKCksCidkZWZpbml0aW9uJyA9PiAkdGhpcy0+Z2V0SW5wdXREZWZpbml0aW9uRGF0YSgkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKSwKXTsKfQoKJGRhdGFbJ2hpZGRlbiddID0gJGNvbW1hbmQtPmlzSGlkZGVuKCk7CgpyZXR1cm4gJGRhdGE7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCgoKY2xhc3MgTWFya2Rvd25EZXNjcmlwdG9yIGV4dGVuZHMgRGVzY3JpcHRvcgp7CgoKCnB1YmxpYyBmdW5jdGlvbiBkZXNjcmliZShPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgb2JqZWN0ICRvYmplY3QsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJGRlY29yYXRlZCA9ICRvdXRwdXQtPmlzRGVjb3JhdGVkKCk7CiRvdXRwdXQtPnNldERlY29yYXRlZChmYWxzZSk7CgpwYXJlbnQ6OmRlc2NyaWJlKCRvdXRwdXQsICRvYmplY3QsICRvcHRpb25zKTsKCiRvdXRwdXQtPnNldERlY29yYXRlZCgkZGVjb3JhdGVkKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHdyaXRlKHN0cmluZyAkY29udGVudCwgYm9vbCAkZGVjb3JhdGVkID0gdHJ1ZSkKewpwYXJlbnQ6OndyaXRlKCRjb250ZW50LCAkZGVjb3JhdGVkKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlSW5wdXRBcmd1bWVudChJbnB1dEFyZ3VtZW50ICRhcmd1bWVudCwgYXJyYXkgJG9wdGlvbnMgPSBbXSkKewokdGhpcy0+d3JpdGUoCicjIyMjIGAnLigkYXJndW1lbnQtPmdldE5hbWUoKSA/OiAnPG5vbmU+JykuImBcblxuIgouKCRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSA/IHByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAiXG4iLCAkYXJndW1lbnQtPmdldERlc2NyaXB0aW9uKCkpLiJcblxuIiA6ICcnKQouJyogSXMgcmVxdWlyZWQ6ICcuKCRhcmd1bWVudC0+aXNSZXF1aXJlZCgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBJcyBhcnJheTogJy4oJGFyZ3VtZW50LT5pc0FycmF5KCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIERlZmF1bHQ6IGAnLnN0cl9yZXBsYWNlKCJcbiIsICcnLCB2YXJfZXhwb3J0KCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpLCB0cnVlKSkuJ2AnCik7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJG5hbWUgPSAnLS0nLiRvcHRpb24tPmdldE5hbWUoKTsKaWYgKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkpIHsKJG5hbWUgLj0gJ3wtLW5vLScuJG9wdGlvbi0+Z2V0TmFtZSgpOwp9CmlmICgkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSB7CiRuYW1lIC49ICd8LScuc3RyX3JlcGxhY2UoJ3wnLCAnfC0nLCAkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKS4nJzsKfQoKJHRoaXMtPndyaXRlKAonIyMjIyBgJy4kbmFtZS4nYCcuIlxuXG4iCi4oJG9wdGlvbi0+Z2V0RGVzY3JpcHRpb24oKSA/IHByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAiXG4iLCAkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpKS4iXG5cbiIgOiAnJykKLicqIEFjY2VwdCB2YWx1ZTogJy4oJG9wdGlvbi0+YWNjZXB0VmFsdWUoKSA/ICd5ZXMnIDogJ25vJykuIlxuIgouJyogSXMgdmFsdWUgcmVxdWlyZWQ6ICcuKCRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBJcyBtdWx0aXBsZTogJy4oJG9wdGlvbi0+aXNBcnJheSgpID8gJ3llcycgOiAnbm8nKS4iXG4iCi4nKiBJcyBuZWdhdGFibGU6ICcuKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkgPyAneWVzJyA6ICdubycpLiJcbiIKLicqIERlZmF1bHQ6IGAnLnN0cl9yZXBsYWNlKCJcbiIsICcnLCB2YXJfZXhwb3J0KCRvcHRpb24tPmdldERlZmF1bHQoKSwgdHJ1ZSkpLidgJwopOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgkc2hvd0FyZ3VtZW50cyA9IFxjb3VudCgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpID4gMCkgewokdGhpcy0+d3JpdGUoJyMjIyBBcmd1bWVudHMnKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudCkgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKaWYgKG51bGwgIT09ICRkZXNjcmliZUlucHV0QXJndW1lbnQgPSAkdGhpcy0+ZGVzY3JpYmVJbnB1dEFyZ3VtZW50KCRhcmd1bWVudCkpIHsKJHRoaXMtPndyaXRlKCRkZXNjcmliZUlucHV0QXJndW1lbnQpOwp9Cn0KfQoKaWYgKFxjb3VudCgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpKSA+IDApIHsKaWYgKCRzaG93QXJndW1lbnRzKSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwp9CgokdGhpcy0+d3JpdGUoJyMjIyBPcHRpb25zJyk7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgYXMgJG9wdGlvbikgewokdGhpcy0+d3JpdGUoIlxuXG4iKTsKaWYgKG51bGwgIT09ICRkZXNjcmliZUlucHV0T3B0aW9uID0gJHRoaXMtPmRlc2NyaWJlSW5wdXRPcHRpb24oJG9wdGlvbikpIHsKJHRoaXMtPndyaXRlKCRkZXNjcmliZUlucHV0T3B0aW9uKTsKfQp9Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmICgkb3B0aW9uc1snc2hvcnQnXSA/PyBmYWxzZSkgewokdGhpcy0+d3JpdGUoCidgJy4kY29tbWFuZC0+Z2V0TmFtZSgpLiJgXG4iCi5zdHJfcmVwZWF0KCctJywgSGVscGVyOjp3aWR0aCgkY29tbWFuZC0+Z2V0TmFtZSgpKSArIDIpLiJcblxuIgouKCRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpID8gJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkuIlxuXG4iIDogJycpCi4nIyMjIFVzYWdlJy4iXG5cbiIKLmFycmF5X3JlZHVjZSgkY29tbWFuZC0+Z2V0QWxpYXNlcygpLCBmdW5jdGlvbiAoJGNhcnJ5LCAkdXNhZ2UpIHsKcmV0dXJuICRjYXJyeS4nKiBgJy4kdXNhZ2UuJ2AnLiJcbiI7Cn0pCik7CgpyZXR1cm47Cn0KCiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihmYWxzZSk7CgokdGhpcy0+d3JpdGUoCidgJy4kY29tbWFuZC0+Z2V0TmFtZSgpLiJgXG4iCi5zdHJfcmVwZWF0KCctJywgSGVscGVyOjp3aWR0aCgkY29tbWFuZC0+Z2V0TmFtZSgpKSArIDIpLiJcblxuIgouKCRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpID8gJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkuIlxuXG4iIDogJycpCi4nIyMjIFVzYWdlJy4iXG5cbiIKLmFycmF5X3JlZHVjZShhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldFN5bm9wc2lzKCldLCAkY29tbWFuZC0+Z2V0QWxpYXNlcygpLCAkY29tbWFuZC0+Z2V0VXNhZ2VzKCkpLCBmdW5jdGlvbiAoJGNhcnJ5LCAkdXNhZ2UpIHsKcmV0dXJuICRjYXJyeS4nKiBgJy4kdXNhZ2UuJ2AnLiJcbiI7Cn0pCik7CgppZiAoJGhlbHAgPSAkY29tbWFuZC0+Z2V0UHJvY2Vzc2VkSGVscCgpKSB7CiR0aGlzLT53cml0ZSgiXG4iKTsKJHRoaXMtPndyaXRlKCRoZWxwKTsKfQoKJGRlZmluaXRpb24gPSAkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpOwppZiAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSB8fCAkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpIHsKJHRoaXMtPndyaXRlKCJcblxuIik7CiR0aGlzLT5kZXNjcmliZUlucHV0RGVmaW5pdGlvbigkZGVmaW5pdGlvbik7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRkZXNjcmliZWROYW1lc3BhY2UgPSAkb3B0aW9uc1snbmFtZXNwYWNlJ10gPz8gbnVsbDsKJGRlc2NyaXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJGFwcGxpY2F0aW9uLCAkZGVzY3JpYmVkTmFtZXNwYWNlKTsKJHRpdGxlID0gJHRoaXMtPmdldEFwcGxpY2F0aW9uVGl0bGUoJGFwcGxpY2F0aW9uKTsKCiR0aGlzLT53cml0ZSgkdGl0bGUuIlxuIi5zdHJfcmVwZWF0KCc9JywgSGVscGVyOjp3aWR0aCgkdGl0bGUpKSk7Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldE5hbWVzcGFjZXMoKSBhcyAkbmFtZXNwYWNlKSB7CmlmIChBcHBsaWNhdGlvbkRlc2NyaXB0aW9uOjpHTE9CQUxfTkFNRVNQQUNFICE9PSAkbmFtZXNwYWNlWydpZCddKSB7CiR0aGlzLT53cml0ZSgiXG5cbiIpOwokdGhpcy0+d3JpdGUoJyoqJy4kbmFtZXNwYWNlWydpZCddLic6KionKTsKfQoKJHRoaXMtPndyaXRlKCJcblxuIik7CiR0aGlzLT53cml0ZShpbXBsb2RlKCJcbiIsIGFycmF5X21hcChmdW5jdGlvbiAoJGNvbW1hbmROYW1lKSB1c2UgKCRkZXNjcmlwdGlvbikgewpyZXR1cm4gc3ByaW50ZignKiBbYCVzYF0oIyVzKScsICRjb21tYW5kTmFtZSwgc3RyX3JlcGxhY2UoJzonLCAnJywgJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kKCRjb21tYW5kTmFtZSktPmdldE5hbWUoKSkpOwp9LCAkbmFtZXNwYWNlWydjb21tYW5kcyddKSkpOwp9Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPndyaXRlKCJcblxuIik7CmlmIChudWxsICE9PSAkZGVzY3JpYmVDb21tYW5kID0gJHRoaXMtPmRlc2NyaWJlQ29tbWFuZCgkY29tbWFuZCwgJG9wdGlvbnMpKSB7CiR0aGlzLT53cml0ZSgkZGVzY3JpYmVDb21tYW5kKTsKfQp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25UaXRsZShBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24pOiBzdHJpbmcKewppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldE5hbWUoKSkgewppZiAoJ1VOS05PV04nICE9PSAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSkgewpyZXR1cm4gc3ByaW50ZignJXMgJXMnLCAkYXBwbGljYXRpb24tPmdldE5hbWUoKSwgJGFwcGxpY2F0aW9uLT5nZXRWZXJzaW9uKCkpOwp9CgpyZXR1cm4gJGFwcGxpY2F0aW9uLT5nZXROYW1lKCk7Cn0KCnJldHVybiAnQ29uc29sZSBUb29sJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxEZXNjcmlwdG9yOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRBcmd1bWVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXREZWZpbml0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dE9wdGlvbjsKCgoKCgoKCgpjbGFzcyBUZXh0RGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IKewoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CmlmIChudWxsICE9PSAkYXJndW1lbnQtPmdldERlZmF1bHQoKSAmJiAoIVxpc19hcnJheSgkYXJndW1lbnQtPmdldERlZmF1bHQoKSkgfHwgXGNvdW50KCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpKSkpIHsKJGRlZmF1bHQgPSBzcHJpbnRmKCc8Y29tbWVudD4gW2RlZmF1bHQ6ICVzXTwvY29tbWVudD4nLCAkdGhpcy0+Zm9ybWF0RGVmYXVsdFZhbHVlKCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpKSk7Cn0gZWxzZSB7CiRkZWZhdWx0ID0gJyc7Cn0KCiR0b3RhbFdpZHRoID0gJG9wdGlvbnNbJ3RvdGFsX3dpZHRoJ10gPz8gSGVscGVyOjp3aWR0aCgkYXJndW1lbnQtPmdldE5hbWUoKSk7CiRzcGFjaW5nV2lkdGggPSAkdG90YWxXaWR0aCAtIFxzdHJsZW4oJGFyZ3VtZW50LT5nZXROYW1lKCkpOwoKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCcgIDxpbmZvPiVzPC9pbmZvPiAgJXMlcyVzJywKJGFyZ3VtZW50LT5nZXROYW1lKCksCnN0cl9yZXBlYXQoJyAnLCAkc3BhY2luZ1dpZHRoKSwKCnByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAiXG4iLnN0cl9yZXBlYXQoJyAnLCAkdG90YWxXaWR0aCArIDQpLCAkYXJndW1lbnQtPmdldERlc2NyaXB0aW9uKCkpLAokZGVmYXVsdAopLCAkb3B0aW9ucyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkgJiYgbnVsbCAhPT0gJG9wdGlvbi0+Z2V0RGVmYXVsdCgpICYmICghXGlzX2FycmF5KCRvcHRpb24tPmdldERlZmF1bHQoKSkgfHwgXGNvdW50KCRvcHRpb24tPmdldERlZmF1bHQoKSkpKSB7CiRkZWZhdWx0ID0gc3ByaW50ZignPGNvbW1lbnQ+IFtkZWZhdWx0OiAlc108L2NvbW1lbnQ+JywgJHRoaXMtPmZvcm1hdERlZmF1bHRWYWx1ZSgkb3B0aW9uLT5nZXREZWZhdWx0KCkpKTsKfSBlbHNlIHsKJGRlZmF1bHQgPSAnJzsKfQoKJHZhbHVlID0gJyc7CmlmICgkb3B0aW9uLT5hY2NlcHRWYWx1ZSgpKSB7CiR2YWx1ZSA9ICc9Jy5zdHJ0b3VwcGVyKCRvcHRpb24tPmdldE5hbWUoKSk7CgppZiAoJG9wdGlvbi0+aXNWYWx1ZU9wdGlvbmFsKCkpIHsKJHZhbHVlID0gJ1snLiR2YWx1ZS4nXSc7Cn0KfQoKJHRvdGFsV2lkdGggPSAkb3B0aW9uc1sndG90YWxfd2lkdGgnXSA/PyAkdGhpcy0+Y2FsY3VsYXRlVG90YWxXaWR0aEZvck9wdGlvbnMoWyRvcHRpb25dKTsKJHN5bm9wc2lzID0gc3ByaW50ZignJXMlcycsCiRvcHRpb24tPmdldFNob3J0Y3V0KCkgPyBzcHJpbnRmKCctJXMsICcsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpIDogJyAgICAnLApzcHJpbnRmKCRvcHRpb24tPmlzTmVnYXRhYmxlKCkgPyAnLS0lMSRzfC0tbm8tJTEkcycgOiAnLS0lMSRzJTIkcycsICRvcHRpb24tPmdldE5hbWUoKSwgJHZhbHVlKQopOwoKJHNwYWNpbmdXaWR0aCA9ICR0b3RhbFdpZHRoIC0gSGVscGVyOjp3aWR0aCgkc3lub3BzaXMpOwoKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCcgIDxpbmZvPiVzPC9pbmZvPiAgJXMlcyVzJXMnLAokc3lub3BzaXMsCnN0cl9yZXBlYXQoJyAnLCAkc3BhY2luZ1dpZHRoKSwKCnByZWdfcmVwbGFjZSgnL1xzKltcclxuXVxzKi8nLCAiXG4iLnN0cl9yZXBlYXQoJyAnLCAkdG90YWxXaWR0aCArIDQpLCAkb3B0aW9uLT5nZXREZXNjcmlwdGlvbigpKSwKJGRlZmF1bHQsCiRvcHRpb24tPmlzQXJyYXkoKSA/ICc8Y29tbWVudD4gKG11bHRpcGxlIHZhbHVlcyBhbGxvd2VkKTwvY29tbWVudD4nIDogJycKKSwgJG9wdGlvbnMpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0b3RhbFdpZHRoID0gJHRoaXMtPmNhbGN1bGF0ZVRvdGFsV2lkdGhGb3JPcHRpb25zKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkgYXMgJGFyZ3VtZW50KSB7CiR0b3RhbFdpZHRoID0gbWF4KCR0b3RhbFdpZHRoLCBIZWxwZXI6OndpZHRoKCRhcmd1bWVudC0+Z2V0TmFtZSgpKSk7Cn0KCmlmICgkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+QXJndW1lbnRzOjwvY29tbWVudD4nLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CmZvcmVhY2ggKCRkZWZpbml0aW9uLT5nZXRBcmd1bWVudHMoKSBhcyAkYXJndW1lbnQpIHsKJHRoaXMtPmRlc2NyaWJlSW5wdXRBcmd1bWVudCgkYXJndW1lbnQsIGFycmF5X21lcmdlKCRvcHRpb25zLCBbJ3RvdGFsX3dpZHRoJyA9PiAkdG90YWxXaWR0aF0pKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQp9CgppZiAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpICYmICRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKfQoKaWYgKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkpIHsKJGxhdGVyT3B0aW9ucyA9IFtdOwoKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+T3B0aW9uczo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwpmb3JlYWNoICgkZGVmaW5pdGlvbi0+Z2V0T3B0aW9ucygpIGFzICRvcHRpb24pIHsKaWYgKFxzdHJsZW4oJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA/PyAnJykgPiAxKSB7CiRsYXRlck9wdGlvbnNbXSA9ICRvcHRpb247CmNvbnRpbnVlOwp9CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT5kZXNjcmliZUlucHV0T3B0aW9uKCRvcHRpb24sIGFycmF5X21lcmdlKCRvcHRpb25zLCBbJ3RvdGFsX3dpZHRoJyA9PiAkdG90YWxXaWR0aF0pKTsKfQpmb3JlYWNoICgkbGF0ZXJPcHRpb25zIGFzICRvcHRpb24pIHsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPmRlc2NyaWJlSW5wdXRPcHRpb24oJG9wdGlvbiwgYXJyYXlfbWVyZ2UoJG9wdGlvbnMsIFsndG90YWxfd2lkdGgnID0+ICR0b3RhbFdpZHRoXSkpOwp9Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQ29tbWFuZChDb21tYW5kICRjb21tYW5kLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihmYWxzZSk7CgppZiAoJGRlc2NyaXB0aW9uID0gJGNvbW1hbmQtPmdldERlc2NyaXB0aW9uKCkpIHsKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+RGVzY3JpcHRpb246PC9jb21tZW50PicsICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnICAnLiRkZXNjcmlwdGlvbik7CiR0aGlzLT53cml0ZVRleHQoIlxuXG4iKTsKfQoKJHRoaXMtPndyaXRlVGV4dCgnPGNvbW1lbnQ+VXNhZ2U6PC9jb21tZW50PicsICRvcHRpb25zKTsKZm9yZWFjaCAoYXJyYXlfbWVyZ2UoWyRjb21tYW5kLT5nZXRTeW5vcHNpcyh0cnVlKV0sICRjb21tYW5kLT5nZXRBbGlhc2VzKCksICRjb21tYW5kLT5nZXRVc2FnZXMoKSkgYXMgJHVzYWdlKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoJyAgJy5PdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkdXNhZ2UpLCAkb3B0aW9ucyk7Cn0KJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKCiRkZWZpbml0aW9uID0gJGNvbW1hbmQtPmdldERlZmluaXRpb24oKTsKaWYgKCRkZWZpbml0aW9uLT5nZXRPcHRpb25zKCkgfHwgJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT5kZXNjcmliZUlucHV0RGVmaW5pdGlvbigkZGVmaW5pdGlvbiwgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9CgokaGVscCA9ICRjb21tYW5kLT5nZXRQcm9jZXNzZWRIZWxwKCk7CmlmICgkaGVscCAmJiAkaGVscCAhPT0gJGRlc2NyaXB0aW9uKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiR0aGlzLT53cml0ZVRleHQoJzxjb21tZW50PkhlbHA6PC9jb21tZW50PicsICRvcHRpb25zKTsKJHRoaXMtPndyaXRlVGV4dCgiXG4iKTsKJHRoaXMtPndyaXRlVGV4dCgnICAnLnN0cl9yZXBsYWNlKCJcbiIsICJcbiAgIiwgJGhlbHApLCAkb3B0aW9ucyk7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRkZXNjcmliZWROYW1lc3BhY2UgPSAkb3B0aW9uc1snbmFtZXNwYWNlJ10gPz8gbnVsbDsKJGRlc2NyaXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJGFwcGxpY2F0aW9uLCAkZGVzY3JpYmVkTmFtZXNwYWNlKTsKCmlmIChpc3NldCgkb3B0aW9uc1sncmF3X3RleHQnXSkgJiYgJG9wdGlvbnNbJ3Jhd190ZXh0J10pIHsKJHdpZHRoID0gJHRoaXMtPmdldENvbHVtbldpZHRoKCRkZXNjcmlwdGlvbi0+Z2V0Q29tbWFuZHMoKSk7Cgpmb3JlYWNoICgkZGVzY3JpcHRpb24tPmdldENvbW1hbmRzKCkgYXMgJGNvbW1hbmQpIHsKJHRoaXMtPndyaXRlVGV4dChzcHJpbnRmKCIlLXskd2lkdGh9cyAlcyIsICRjb21tYW5kLT5nZXROYW1lKCksICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpKSwgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwp9Cn0gZWxzZSB7CmlmICgnJyAhPSAkaGVscCA9ICRhcHBsaWNhdGlvbi0+Z2V0SGVscCgpKSB7CiR0aGlzLT53cml0ZVRleHQoIiRoZWxwXG5cbiIsICRvcHRpb25zKTsKfQoKJHRoaXMtPndyaXRlVGV4dCgiPGNvbW1lbnQ+VXNhZ2U6PC9jb21tZW50PlxuIiwgJG9wdGlvbnMpOwokdGhpcy0+d3JpdGVUZXh0KCIgIGNvbW1hbmQgW29wdGlvbnNdIFthcmd1bWVudHNdXG5cbiIsICRvcHRpb25zKTsKCiR0aGlzLT5kZXNjcmliZUlucHV0RGVmaW5pdGlvbihuZXcgSW5wdXREZWZpbml0aW9uKCRhcHBsaWNhdGlvbi0+Z2V0RGVmaW5pdGlvbigpLT5nZXRPcHRpb25zKCkpLCAkb3B0aW9ucyk7CgokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwoKJGNvbW1hbmRzID0gJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpOwokbmFtZXNwYWNlcyA9ICRkZXNjcmlwdGlvbi0+Z2V0TmFtZXNwYWNlcygpOwppZiAoJGRlc2NyaWJlZE5hbWVzcGFjZSAmJiAkbmFtZXNwYWNlcykgewoKJGRlc2NyaWJlZE5hbWVzcGFjZUluZm8gPSByZXNldCgkbmFtZXNwYWNlcyk7CmZvcmVhY2ggKCRkZXNjcmliZWROYW1lc3BhY2VJbmZvWydjb21tYW5kcyddIGFzICRuYW1lKSB7CiRjb21tYW5kc1skbmFtZV0gPSAkZGVzY3JpcHRpb24tPmdldENvbW1hbmQoJG5hbWUpOwp9Cn0KCgokd2lkdGggPSAkdGhpcy0+Z2V0Q29sdW1uV2lkdGgoYXJyYXlfbWVyZ2UoLi4uYXJyYXlfdmFsdWVzKGFycmF5X21hcChmdW5jdGlvbiAoJG5hbWVzcGFjZSkgdXNlICgkY29tbWFuZHMpIHsKcmV0dXJuIGFycmF5X2ludGVyc2VjdCgkbmFtZXNwYWNlWydjb21tYW5kcyddLCBhcnJheV9rZXlzKCRjb21tYW5kcykpOwp9LCBhcnJheV92YWx1ZXMoJG5hbWVzcGFjZXMpKSkpKTsKCmlmICgkZGVzY3JpYmVkTmFtZXNwYWNlKSB7CiR0aGlzLT53cml0ZVRleHQoc3ByaW50ZignPGNvbW1lbnQ+QXZhaWxhYmxlIGNvbW1hbmRzIGZvciB0aGUgIiVzIiBuYW1lc3BhY2U6PC9jb21tZW50PicsICRkZXNjcmliZWROYW1lc3BhY2UpLCAkb3B0aW9ucyk7Cn0gZWxzZSB7CiR0aGlzLT53cml0ZVRleHQoJzxjb21tZW50PkF2YWlsYWJsZSBjb21tYW5kczo8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwp9Cgpmb3JlYWNoICgkbmFtZXNwYWNlcyBhcyAkbmFtZXNwYWNlKSB7CiRuYW1lc3BhY2VbJ2NvbW1hbmRzJ10gPSBhcnJheV9maWx0ZXIoJG5hbWVzcGFjZVsnY29tbWFuZHMnXSwgZnVuY3Rpb24gKCRuYW1lKSB1c2UgKCRjb21tYW5kcykgewpyZXR1cm4gaXNzZXQoJGNvbW1hbmRzWyRuYW1lXSk7Cn0pOwoKaWYgKCEkbmFtZXNwYWNlWydjb21tYW5kcyddKSB7CmNvbnRpbnVlOwp9CgppZiAoISRkZXNjcmliZWROYW1lc3BhY2UgJiYgQXBwbGljYXRpb25EZXNjcmlwdGlvbjo6R0xPQkFMX05BTUVTUEFDRSAhPT0gJG5hbWVzcGFjZVsnaWQnXSkgewokdGhpcy0+d3JpdGVUZXh0KCJcbiIpOwokdGhpcy0+d3JpdGVUZXh0KCcgPGNvbW1lbnQ+Jy4kbmFtZXNwYWNlWydpZCddLic8L2NvbW1lbnQ+JywgJG9wdGlvbnMpOwp9Cgpmb3JlYWNoICgkbmFtZXNwYWNlWydjb21tYW5kcyddIGFzICRuYW1lKSB7CiR0aGlzLT53cml0ZVRleHQoIlxuIik7CiRzcGFjaW5nV2lkdGggPSAkd2lkdGggLSBIZWxwZXI6OndpZHRoKCRuYW1lKTsKJGNvbW1hbmQgPSAkY29tbWFuZHNbJG5hbWVdOwokY29tbWFuZEFsaWFzZXMgPSAkbmFtZSA9PT0gJGNvbW1hbmQtPmdldE5hbWUoKSA/ICR0aGlzLT5nZXRDb21tYW5kQWxpYXNlc1RleHQoJGNvbW1hbmQpIDogJyc7CiR0aGlzLT53cml0ZVRleHQoc3ByaW50ZignICA8aW5mbz4lczwvaW5mbz4lcyVzJywgJG5hbWUsIHN0cl9yZXBlYXQoJyAnLCAkc3BhY2luZ1dpZHRoKSwgJGNvbW1hbmRBbGlhc2VzLiRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpKSwgJG9wdGlvbnMpOwp9Cn0KCiR0aGlzLT53cml0ZVRleHQoIlxuIik7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3cml0ZVRleHQoc3RyaW5nICRjb250ZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZSgKaXNzZXQoJG9wdGlvbnNbJ3Jhd190ZXh0J10pICYmICRvcHRpb25zWydyYXdfdGV4dCddID8gc3RyaXBfdGFncygkY29udGVudCkgOiAkY29udGVudCwKaXNzZXQoJG9wdGlvbnNbJ3Jhd19vdXRwdXQnXSkgPyAhJG9wdGlvbnNbJ3Jhd19vdXRwdXQnXSA6IHRydWUKKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDb21tYW5kQWxpYXNlc1RleHQoQ29tbWFuZCAkY29tbWFuZCk6IHN0cmluZwp7CiR0ZXh0ID0gJyc7CiRhbGlhc2VzID0gJGNvbW1hbmQtPmdldEFsaWFzZXMoKTsKCmlmICgkYWxpYXNlcykgewokdGV4dCA9ICdbJy5pbXBsb2RlKCd8JywgJGFsaWFzZXMpLiddICc7Cn0KCnJldHVybiAkdGV4dDsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGZvcm1hdERlZmF1bHRWYWx1ZSgkZGVmYXVsdCk6IHN0cmluZwp7CmlmIChcSU5GID09PSAkZGVmYXVsdCkgewpyZXR1cm4gJ0lORic7Cn0KCmlmIChcaXNfc3RyaW5nKCRkZWZhdWx0KSkgewokZGVmYXVsdCA9IE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCRkZWZhdWx0KTsKfSBlbHNlaWYgKFxpc19hcnJheSgkZGVmYXVsdCkpIHsKZm9yZWFjaCAoJGRlZmF1bHQgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKFxpc19zdHJpbmcoJHZhbHVlKSkgewokZGVmYXVsdFska2V5XSA9IE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlKCR2YWx1ZSk7Cn0KfQp9CgpyZXR1cm4gc3RyX3JlcGxhY2UoJ1xcXFwnLCAnXFwnLCBqc29uX2VuY29kZSgkZGVmYXVsdCwgXEpTT05fVU5FU0NBUEVEX1NMQVNIRVMgfCBcSlNPTl9VTkVTQ0FQRURfVU5JQ09ERSkpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldENvbHVtbldpZHRoKGFycmF5ICRjb21tYW5kcyk6IGludAp7CiR3aWR0aHMgPSBbXTsKCmZvcmVhY2ggKCRjb21tYW5kcyBhcyAkY29tbWFuZCkgewppZiAoJGNvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kKSB7CiR3aWR0aHNbXSA9IEhlbHBlcjo6d2lkdGgoJGNvbW1hbmQtPmdldE5hbWUoKSk7CmZvcmVhY2ggKCRjb21tYW5kLT5nZXRBbGlhc2VzKCkgYXMgJGFsaWFzKSB7CiR3aWR0aHNbXSA9IEhlbHBlcjo6d2lkdGgoJGFsaWFzKTsKfQp9IGVsc2Ugewokd2lkdGhzW10gPSBIZWxwZXI6OndpZHRoKCRjb21tYW5kKTsKfQp9CgpyZXR1cm4gJHdpZHRocyA/IG1heCgkd2lkdGhzKSArIDIgOiAwOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZVRvdGFsV2lkdGhGb3JPcHRpb25zKGFycmF5ICRvcHRpb25zKTogaW50CnsKJHRvdGFsV2lkdGggPSAwOwpmb3JlYWNoICgkb3B0aW9ucyBhcyAkb3B0aW9uKSB7CgokbmFtZUxlbmd0aCA9IDEgKyBtYXgoSGVscGVyOjp3aWR0aCgkb3B0aW9uLT5nZXRTaG9ydGN1dCgpKSwgMSkgKyA0ICsgSGVscGVyOjp3aWR0aCgkb3B0aW9uLT5nZXROYW1lKCkpOwppZiAoJG9wdGlvbi0+aXNOZWdhdGFibGUoKSkgewokbmFtZUxlbmd0aCArPSA2ICsgSGVscGVyOjp3aWR0aCgkb3B0aW9uLT5nZXROYW1lKCkpOyAKfSBlbHNlaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJHZhbHVlTGVuZ3RoID0gMSArIEhlbHBlcjo6d2lkdGgoJG9wdGlvbi0+Z2V0TmFtZSgpKTsgCiR2YWx1ZUxlbmd0aCArPSAkb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSA/IDIgOiAwOyAKCiRuYW1lTGVuZ3RoICs9ICR2YWx1ZUxlbmd0aDsKfQokdG90YWxXaWR0aCA9IG1heCgkdG90YWxXaWR0aCwgJG5hbWVMZW5ndGgpOwp9CgpyZXR1cm4gJHRvdGFsV2lkdGg7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRGVzY3JpcHRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEFwcGxpY2F0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0QXJndW1lbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0RGVmaW5pdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRPcHRpb247CgoKCgoKCgoKY2xhc3MgWG1sRGVzY3JpcHRvciBleHRlbmRzIERlc2NyaXB0b3IKewpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXREZWZpbml0aW9uRG9jdW1lbnQoSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uKTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwokZG9tLT5hcHBlbmRDaGlsZCgkZGVmaW5pdGlvblhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2RlZmluaXRpb24nKSk7CgokZGVmaW5pdGlvblhNTC0+YXBwZW5kQ2hpbGQoJGFyZ3VtZW50c1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2FyZ3VtZW50cycpKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldEFyZ3VtZW50cygpIGFzICRhcmd1bWVudCkgewokdGhpcy0+YXBwZW5kRG9jdW1lbnQoJGFyZ3VtZW50c1hNTCwgJHRoaXMtPmdldElucHV0QXJndW1lbnREb2N1bWVudCgkYXJndW1lbnQpKTsKfQoKJGRlZmluaXRpb25YTUwtPmFwcGVuZENoaWxkKCRvcHRpb25zWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnb3B0aW9ucycpKTsKZm9yZWFjaCAoJGRlZmluaXRpb24tPmdldE9wdGlvbnMoKSBhcyAkb3B0aW9uKSB7CiR0aGlzLT5hcHBlbmREb2N1bWVudCgkb3B0aW9uc1hNTCwgJHRoaXMtPmdldElucHV0T3B0aW9uRG9jdW1lbnQoJG9wdGlvbikpOwp9CgpyZXR1cm4gJGRvbTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmREb2N1bWVudChDb21tYW5kICRjb21tYW5kLCBib29sICRzaG9ydCA9IGZhbHNlKTogXERPTURvY3VtZW50CnsKJGRvbSA9IG5ldyBcRE9NRG9jdW1lbnQoJzEuMCcsICdVVEYtOCcpOwokZG9tLT5hcHBlbmRDaGlsZCgkY29tbWFuZFhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2NvbW1hbmQnKSk7CgokY29tbWFuZFhNTC0+c2V0QXR0cmlidXRlKCdpZCcsICRjb21tYW5kLT5nZXROYW1lKCkpOwokY29tbWFuZFhNTC0+c2V0QXR0cmlidXRlKCduYW1lJywgJGNvbW1hbmQtPmdldE5hbWUoKSk7CiRjb21tYW5kWE1MLT5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICRjb21tYW5kLT5pc0hpZGRlbigpID8gMSA6IDApOwoKJGNvbW1hbmRYTUwtPmFwcGVuZENoaWxkKCR1c2FnZXNYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCd1c2FnZXMnKSk7CgokY29tbWFuZFhNTC0+YXBwZW5kQ2hpbGQoJGRlc2NyaXB0aW9uWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVzY3JpcHRpb24nKSk7CiRkZXNjcmlwdGlvblhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoc3RyX3JlcGxhY2UoIlxuIiwgIlxuICIsICRjb21tYW5kLT5nZXREZXNjcmlwdGlvbigpKSkpOwoKaWYgKCRzaG9ydCkgewpmb3JlYWNoICgkY29tbWFuZC0+Z2V0QWxpYXNlcygpIGFzICR1c2FnZSkgewokdXNhZ2VzWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCd1c2FnZScsICR1c2FnZSkpOwp9Cn0gZWxzZSB7CiRjb21tYW5kLT5tZXJnZUFwcGxpY2F0aW9uRGVmaW5pdGlvbihmYWxzZSk7Cgpmb3JlYWNoIChhcnJheV9tZXJnZShbJGNvbW1hbmQtPmdldFN5bm9wc2lzKCldLCAkY29tbWFuZC0+Z2V0QWxpYXNlcygpLCAkY29tbWFuZC0+Z2V0VXNhZ2VzKCkpIGFzICR1c2FnZSkgewokdXNhZ2VzWE1MLT5hcHBlbmRDaGlsZCgkZG9tLT5jcmVhdGVFbGVtZW50KCd1c2FnZScsICR1c2FnZSkpOwp9CgokY29tbWFuZFhNTC0+YXBwZW5kQ2hpbGQoJGhlbHBYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdoZWxwJykpOwokaGVscFhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoc3RyX3JlcGxhY2UoIlxuIiwgIlxuICIsICRjb21tYW5kLT5nZXRQcm9jZXNzZWRIZWxwKCkpKSk7CgokZGVmaW5pdGlvblhNTCA9ICR0aGlzLT5nZXRJbnB1dERlZmluaXRpb25Eb2N1bWVudCgkY29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKTsKJHRoaXMtPmFwcGVuZERvY3VtZW50KCRjb21tYW5kWE1MLCAkZGVmaW5pdGlvblhNTC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ2RlZmluaXRpb24nKS0+aXRlbSgwKSk7Cn0KCnJldHVybiAkZG9tOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25Eb2N1bWVudChBcHBsaWNhdGlvbiAkYXBwbGljYXRpb24sID9zdHJpbmcgJG5hbWVzcGFjZSA9IG51bGwsIGJvb2wgJHNob3J0ID0gZmFsc2UpOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CiRkb20tPmFwcGVuZENoaWxkKCRyb290WG1sID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnc3ltZm9ueScpKTsKCmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0TmFtZSgpKSB7CiRyb290WG1sLT5zZXRBdHRyaWJ1dGUoJ25hbWUnLCAkYXBwbGljYXRpb24tPmdldE5hbWUoKSk7CmlmICgnVU5LTk9XTicgIT09ICRhcHBsaWNhdGlvbi0+Z2V0VmVyc2lvbigpKSB7CiRyb290WG1sLT5zZXRBdHRyaWJ1dGUoJ3ZlcnNpb24nLCAkYXBwbGljYXRpb24tPmdldFZlcnNpb24oKSk7Cn0KfQoKJHJvb3RYbWwtPmFwcGVuZENoaWxkKCRjb21tYW5kc1hNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2NvbW1hbmRzJykpOwoKJGRlc2NyaXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24oJGFwcGxpY2F0aW9uLCAkbmFtZXNwYWNlLCB0cnVlKTsKCmlmICgkbmFtZXNwYWNlKSB7CiRjb21tYW5kc1hNTC0+c2V0QXR0cmlidXRlKCduYW1lc3BhY2UnLCAkbmFtZXNwYWNlKTsKfQoKZm9yZWFjaCAoJGRlc2NyaXB0aW9uLT5nZXRDb21tYW5kcygpIGFzICRjb21tYW5kKSB7CiR0aGlzLT5hcHBlbmREb2N1bWVudCgkY29tbWFuZHNYTUwsICR0aGlzLT5nZXRDb21tYW5kRG9jdW1lbnQoJGNvbW1hbmQsICRzaG9ydCkpOwp9CgppZiAoISRuYW1lc3BhY2UpIHsKJHJvb3RYbWwtPmFwcGVuZENoaWxkKCRuYW1lc3BhY2VzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnbmFtZXNwYWNlcycpKTsKCmZvcmVhY2ggKCRkZXNjcmlwdGlvbi0+Z2V0TmFtZXNwYWNlcygpIGFzICRuYW1lc3BhY2VEZXNjcmlwdGlvbikgewokbmFtZXNwYWNlc1hNTC0+YXBwZW5kQ2hpbGQoJG5hbWVzcGFjZUFycmF5WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnbmFtZXNwYWNlJykpOwokbmFtZXNwYWNlQXJyYXlYTUwtPnNldEF0dHJpYnV0ZSgnaWQnLCAkbmFtZXNwYWNlRGVzY3JpcHRpb25bJ2lkJ10pOwoKZm9yZWFjaCAoJG5hbWVzcGFjZURlc2NyaXB0aW9uWydjb21tYW5kcyddIGFzICRuYW1lKSB7CiRuYW1lc3BhY2VBcnJheVhNTC0+YXBwZW5kQ2hpbGQoJGNvbW1hbmRYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdjb21tYW5kJykpOwokY29tbWFuZFhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoJG5hbWUpKTsKfQp9Cn0KCnJldHVybiAkZG9tOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dEFyZ3VtZW50KElucHV0QXJndW1lbnQgJGFyZ3VtZW50LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRJbnB1dEFyZ3VtZW50RG9jdW1lbnQoJGFyZ3VtZW50KSk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBkZXNjcmliZUlucHV0T3B0aW9uKElucHV0T3B0aW9uICRvcHRpb24sIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRG9jdW1lbnQoJHRoaXMtPmdldElucHV0T3B0aW9uRG9jdW1lbnQoJG9wdGlvbikpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVJbnB1dERlZmluaXRpb24oSW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRJbnB1dERlZmluaXRpb25Eb2N1bWVudCgkZGVmaW5pdGlvbikpOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZGVzY3JpYmVDb21tYW5kKENvbW1hbmQgJGNvbW1hbmQsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPndyaXRlRG9jdW1lbnQoJHRoaXMtPmdldENvbW1hbmREb2N1bWVudCgkY29tbWFuZCwgJG9wdGlvbnNbJ3Nob3J0J10gPz8gZmFsc2UpKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRlc2NyaWJlQXBwbGljYXRpb24oQXBwbGljYXRpb24gJGFwcGxpY2F0aW9uLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT53cml0ZURvY3VtZW50KCR0aGlzLT5nZXRBcHBsaWNhdGlvbkRvY3VtZW50KCRhcHBsaWNhdGlvbiwgJG9wdGlvbnNbJ25hbWVzcGFjZSddID8/IG51bGwsICRvcHRpb25zWydzaG9ydCddID8/IGZhbHNlKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gYXBwZW5kRG9jdW1lbnQoXERPTU5vZGUgJHBhcmVudE5vZGUsIFxET01Ob2RlICRpbXBvcnRlZFBhcmVudCkKewpmb3JlYWNoICgkaW1wb3J0ZWRQYXJlbnQtPmNoaWxkTm9kZXMgYXMgJGNoaWxkTm9kZSkgewokcGFyZW50Tm9kZS0+YXBwZW5kQ2hpbGQoJHBhcmVudE5vZGUtPm93bmVyRG9jdW1lbnQtPmltcG9ydE5vZGUoJGNoaWxkTm9kZSwgdHJ1ZSkpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gd3JpdGVEb2N1bWVudChcRE9NRG9jdW1lbnQgJGRvbSkKewokZG9tLT5mb3JtYXRPdXRwdXQgPSB0cnVlOwokdGhpcy0+d3JpdGUoJGRvbS0+c2F2ZVhNTCgpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRJbnB1dEFyZ3VtZW50RG9jdW1lbnQoSW5wdXRBcmd1bWVudCAkYXJndW1lbnQpOiBcRE9NRG9jdW1lbnQKewokZG9tID0gbmV3IFxET01Eb2N1bWVudCgnMS4wJywgJ1VURi04Jyk7CgokZG9tLT5hcHBlbmRDaGlsZCgkb2JqZWN0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnYXJndW1lbnQnKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnbmFtZScsICRhcmd1bWVudC0+Z2V0TmFtZSgpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc19yZXF1aXJlZCcsICRhcmd1bWVudC0+aXNSZXF1aXJlZCgpID8gMSA6IDApOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX2FycmF5JywgJGFyZ3VtZW50LT5pc0FycmF5KCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZXNjcmlwdGlvblhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2Rlc2NyaXB0aW9uJykpOwokZGVzY3JpcHRpb25YTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRhcmd1bWVudC0+Z2V0RGVzY3JpcHRpb24oKSkpOwoKJG9iamVjdFhNTC0+YXBwZW5kQ2hpbGQoJGRlZmF1bHRzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmYXVsdHMnKSk7CiRkZWZhdWx0cyA9IFxpc19hcnJheSgkYXJndW1lbnQtPmdldERlZmF1bHQoKSkgPyAkYXJndW1lbnQtPmdldERlZmF1bHQoKSA6IChcaXNfYm9vbCgkYXJndW1lbnQtPmdldERlZmF1bHQoKSkgPyBbdmFyX2V4cG9ydCgkYXJndW1lbnQtPmdldERlZmF1bHQoKSwgdHJ1ZSldIDogKCRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpID8gWyRhcmd1bWVudC0+Z2V0RGVmYXVsdCgpXSA6IFtdKSk7CmZvcmVhY2ggKCRkZWZhdWx0cyBhcyAkZGVmYXVsdCkgewokZGVmYXVsdHNYTUwtPmFwcGVuZENoaWxkKCRkZWZhdWx0WE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmYXVsdCcpKTsKJGRlZmF1bHRYTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCRkZWZhdWx0KSk7Cn0KCnJldHVybiAkZG9tOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldElucHV0T3B0aW9uRG9jdW1lbnQoSW5wdXRPcHRpb24gJG9wdGlvbik6IFxET01Eb2N1bWVudAp7CiRkb20gPSBuZXcgXERPTURvY3VtZW50KCcxLjAnLCAnVVRGLTgnKTsKCiRkb20tPmFwcGVuZENoaWxkKCRvYmplY3RYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdvcHRpb24nKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnbmFtZScsICctLScuJG9wdGlvbi0+Z2V0TmFtZSgpKTsKJHBvcyA9IHN0cnBvcygkb3B0aW9uLT5nZXRTaG9ydGN1dCgpID8/ICcnLCAnfCcpOwppZiAoZmFsc2UgIT09ICRwb3MpIHsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdzaG9ydGN1dCcsICctJy5zdWJzdHIoJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSwgMCwgJHBvcykpOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ3Nob3J0Y3V0cycsICctJy5zdHJfcmVwbGFjZSgnfCcsICd8LScsICRvcHRpb24tPmdldFNob3J0Y3V0KCkpKTsKfSBlbHNlIHsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdzaG9ydGN1dCcsICRvcHRpb24tPmdldFNob3J0Y3V0KCkgPyAnLScuJG9wdGlvbi0+Z2V0U2hvcnRjdXQoKSA6ICcnKTsKfQokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2FjY2VwdF92YWx1ZScsICRvcHRpb24tPmFjY2VwdFZhbHVlKCkgPyAxIDogMCk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnaXNfdmFsdWVfcmVxdWlyZWQnLCAkb3B0aW9uLT5pc1ZhbHVlUmVxdWlyZWQoKSA/IDEgOiAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc19tdWx0aXBsZScsICRvcHRpb24tPmlzQXJyYXkoKSA/IDEgOiAwKTsKJG9iamVjdFhNTC0+YXBwZW5kQ2hpbGQoJGRlc2NyaXB0aW9uWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVzY3JpcHRpb24nKSk7CiRkZXNjcmlwdGlvblhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoJG9wdGlvbi0+Z2V0RGVzY3JpcHRpb24oKSkpOwoKaWYgKCRvcHRpb24tPmFjY2VwdFZhbHVlKCkpIHsKJGRlZmF1bHRzID0gXGlzX2FycmF5KCRvcHRpb24tPmdldERlZmF1bHQoKSkgPyAkb3B0aW9uLT5nZXREZWZhdWx0KCkgOiAoXGlzX2Jvb2woJG9wdGlvbi0+Z2V0RGVmYXVsdCgpKSA/IFt2YXJfZXhwb3J0KCRvcHRpb24tPmdldERlZmF1bHQoKSwgdHJ1ZSldIDogKCRvcHRpb24tPmdldERlZmF1bHQoKSA/IFskb3B0aW9uLT5nZXREZWZhdWx0KCldIDogW10pKTsKJG9iamVjdFhNTC0+YXBwZW5kQ2hpbGQoJGRlZmF1bHRzWE1MID0gJGRvbS0+Y3JlYXRlRWxlbWVudCgnZGVmYXVsdHMnKSk7CgppZiAoIWVtcHR5KCRkZWZhdWx0cykpIHsKZm9yZWFjaCAoJGRlZmF1bHRzIGFzICRkZWZhdWx0KSB7CiRkZWZhdWx0c1hNTC0+YXBwZW5kQ2hpbGQoJGRlZmF1bHRYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdkZWZhdWx0JykpOwokZGVmYXVsdFhNTC0+YXBwZW5kQ2hpbGQoJGRvbS0+Y3JlYXRlVGV4dE5vZGUoJGRlZmF1bHQpKTsKfQp9Cn0KCmlmICgkb3B0aW9uLT5pc05lZ2F0YWJsZSgpKSB7CiRkb20tPmFwcGVuZENoaWxkKCRvYmplY3RYTUwgPSAkZG9tLT5jcmVhdGVFbGVtZW50KCdvcHRpb24nKSk7CiRvYmplY3RYTUwtPnNldEF0dHJpYnV0ZSgnbmFtZScsICctLW5vLScuJG9wdGlvbi0+Z2V0TmFtZSgpKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdzaG9ydGN1dCcsICcnKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdhY2NlcHRfdmFsdWUnLCAwKTsKJG9iamVjdFhNTC0+c2V0QXR0cmlidXRlKCdpc192YWx1ZV9yZXF1aXJlZCcsIDApOwokb2JqZWN0WE1MLT5zZXRBdHRyaWJ1dGUoJ2lzX211bHRpcGxlJywgMCk7CiRvYmplY3RYTUwtPmFwcGVuZENoaWxkKCRkZXNjcmlwdGlvblhNTCA9ICRkb20tPmNyZWF0ZUVsZW1lbnQoJ2Rlc2NyaXB0aW9uJykpOwokZGVzY3JpcHRpb25YTUwtPmFwcGVuZENoaWxkKCRkb20tPmNyZWF0ZVRleHROb2RlKCdOZWdhdGUgdGhlICItLScuJG9wdGlvbi0+Z2V0TmFtZSgpLiciIG9wdGlvbicpKTsKfQoKcmV0dXJuICRkb207Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXZlbnQ7CgoKCgoKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVDb21tYW5kRXZlbnQgZXh0ZW5kcyBDb25zb2xlRXZlbnQKewoKCgpwdWJsaWMgY29uc3QgUkVUVVJOX0NPREVfRElTQUJMRUQgPSAxMTM7CgoKCgpwcml2YXRlICRjb21tYW5kU2hvdWxkUnVuID0gdHJ1ZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXNhYmxlQ29tbWFuZCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kU2hvdWxkUnVuID0gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmFibGVDb21tYW5kKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmRTaG91bGRSdW4gPSB0cnVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tbWFuZFNob3VsZFJ1bigpOiBib29sCnsKcmV0dXJuICR0aGlzLT5jb21tYW5kU2hvdWxkUnVuOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKZmluYWwgY2xhc3MgQ29uc29sZUVycm9yRXZlbnQgZXh0ZW5kcyBDb25zb2xlRXZlbnQKewpwcml2YXRlICRlcnJvcjsKcHJpdmF0ZSAkZXhpdENvZGU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgXFRocm93YWJsZSAkZXJyb3IsID9Db21tYW5kICRjb21tYW5kID0gbnVsbCkKewpwYXJlbnQ6Ol9fY29uc3RydWN0KCRjb21tYW5kLCAkaW5wdXQsICRvdXRwdXQpOwoKJHRoaXMtPmVycm9yID0gJGVycm9yOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0RXJyb3IoKTogXFRocm93YWJsZQp7CnJldHVybiAkdGhpcy0+ZXJyb3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvcihcVGhyb3dhYmxlICRlcnJvcik6IHZvaWQKewokdGhpcy0+ZXJyb3IgPSAkZXJyb3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzZXRFeGl0Q29kZShpbnQgJGV4aXRDb2RlKTogdm9pZAp7CiR0aGlzLT5leGl0Q29kZSA9ICRleGl0Q29kZTsKCiRyID0gbmV3IFxSZWZsZWN0aW9uUHJvcGVydHkoJHRoaXMtPmVycm9yLCAnY29kZScpOwokci0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHItPnNldFZhbHVlKCR0aGlzLT5lcnJvciwgJHRoaXMtPmV4aXRDb2RlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4aXRDb2RlKCk6IGludAp7CnJldHVybiAkdGhpcy0+ZXhpdENvZGUgPz8gKFxpc19pbnQoJHRoaXMtPmVycm9yLT5nZXRDb2RlKCkpICYmIDAgIT09ICR0aGlzLT5lcnJvci0+Z2V0Q29kZSgpID8gJHRoaXMtPmVycm9yLT5nZXRDb2RlKCkgOiAxKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbnRyYWN0c1xFdmVudERpc3BhdGNoZXJcRXZlbnQ7CgoKCgoKCmNsYXNzIENvbnNvbGVFdmVudCBleHRlbmRzIEV2ZW50CnsKcHJvdGVjdGVkICRjb21tYW5kOwoKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJG91dHB1dDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/Q29tbWFuZCAkY29tbWFuZCwgSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kKCkKewpyZXR1cm4gJHRoaXMtPmNvbW1hbmQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCkKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPdXRwdXQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcQ29tbWFuZFxDb21tYW5kOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVTaWduYWxFdmVudCBleHRlbmRzIENvbnNvbGVFdmVudAp7CnByaXZhdGUgJGhhbmRsaW5nU2lnbmFsOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbW1hbmQgJGNvbW1hbmQsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGludCAkaGFuZGxpbmdTaWduYWwpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKJHRoaXMtPmhhbmRsaW5nU2lnbmFsID0gJGhhbmRsaW5nU2lnbmFsOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0SGFuZGxpbmdTaWduYWwoKTogaW50CnsKcmV0dXJuICR0aGlzLT5oYW5kbGluZ1NpZ25hbDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgoKCmZpbmFsIGNsYXNzIENvbnNvbGVUZXJtaW5hdGVFdmVudCBleHRlbmRzIENvbnNvbGVFdmVudAp7CnByaXZhdGUgJGV4aXRDb2RlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbW1hbmQgJGNvbW1hbmQsIElucHV0SW50ZXJmYWNlICRpbnB1dCwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIGludCAkZXhpdENvZGUpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkY29tbWFuZCwgJGlucHV0LCAkb3V0cHV0KTsKCiR0aGlzLT5zZXRFeGl0Q29kZSgkZXhpdENvZGUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2V0RXhpdENvZGUoaW50ICRleGl0Q29kZSk6IHZvaWQKewokdGhpcy0+ZXhpdENvZGUgPSAkZXhpdENvZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFeGl0Q29kZSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPmV4aXRDb2RlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50TGlzdGVuZXI7Cgp1c2UgUHNyXExvZ1xMb2dnZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbnNvbGVFdmVudHM7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVFcnJvckV2ZW50Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFdmVudFxDb25zb2xlRXZlbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV2ZW50XENvbnNvbGVUZXJtaW5hdGVFdmVudDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEV2ZW50RGlzcGF0Y2hlclxFdmVudFN1YnNjcmliZXJJbnRlcmZhY2U7CgoKCgoKY2xhc3MgRXJyb3JMaXN0ZW5lciBpbXBsZW1lbnRzIEV2ZW50U3Vic2NyaWJlckludGVyZmFjZQp7CnByaXZhdGUgJGxvZ2dlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/TG9nZ2VySW50ZXJmYWNlICRsb2dnZXIgPSBudWxsKQp7CiR0aGlzLT5sb2dnZXIgPSAkbG9nZ2VyOwp9CgpwdWJsaWMgZnVuY3Rpb24gb25Db25zb2xlRXJyb3IoQ29uc29sZUVycm9yRXZlbnQgJGV2ZW50KQp7CmlmIChudWxsID09PSAkdGhpcy0+bG9nZ2VyKSB7CnJldHVybjsKfQoKJGVycm9yID0gJGV2ZW50LT5nZXRFcnJvcigpOwoKaWYgKCEkaW5wdXRTdHJpbmcgPSAkdGhpcy0+Z2V0SW5wdXRTdHJpbmcoJGV2ZW50KSkgewokdGhpcy0+bG9nZ2VyLT5jcml0aWNhbCgnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdXNpbmcgdGhlIGNvbnNvbGUuIE1lc3NhZ2U6ICJ7bWVzc2FnZX0iJywgWydleGNlcHRpb24nID0+ICRlcnJvciwgJ21lc3NhZ2UnID0+ICRlcnJvci0+Z2V0TWVzc2FnZSgpXSk7CgpyZXR1cm47Cn0KCiR0aGlzLT5sb2dnZXItPmNyaXRpY2FsKCdFcnJvciB0aHJvd24gd2hpbGUgcnVubmluZyBjb21tYW5kICJ7Y29tbWFuZH0iLiBNZXNzYWdlOiAie21lc3NhZ2V9IicsIFsnZXhjZXB0aW9uJyA9PiAkZXJyb3IsICdjb21tYW5kJyA9PiAkaW5wdXRTdHJpbmcsICdtZXNzYWdlJyA9PiAkZXJyb3ItPmdldE1lc3NhZ2UoKV0pOwp9CgpwdWJsaWMgZnVuY3Rpb24gb25Db25zb2xlVGVybWluYXRlKENvbnNvbGVUZXJtaW5hdGVFdmVudCAkZXZlbnQpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5sb2dnZXIpIHsKcmV0dXJuOwp9CgokZXhpdENvZGUgPSAkZXZlbnQtPmdldEV4aXRDb2RlKCk7CgppZiAoMCA9PT0gJGV4aXRDb2RlKSB7CnJldHVybjsKfQoKaWYgKCEkaW5wdXRTdHJpbmcgPSAkdGhpcy0+Z2V0SW5wdXRTdHJpbmcoJGV2ZW50KSkgewokdGhpcy0+bG9nZ2VyLT5kZWJ1ZygnVGhlIGNvbnNvbGUgZXhpdGVkIHdpdGggY29kZSAie2NvZGV9IicsIFsnY29kZScgPT4gJGV4aXRDb2RlXSk7CgpyZXR1cm47Cn0KCiR0aGlzLT5sb2dnZXItPmRlYnVnKCdDb21tYW5kICJ7Y29tbWFuZH0iIGV4aXRlZCB3aXRoIGNvZGUgIntjb2RlfSInLCBbJ2NvbW1hbmQnID0+ICRpbnB1dFN0cmluZywgJ2NvZGUnID0+ICRleGl0Q29kZV0pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnNjcmliZWRFdmVudHMoKQp7CnJldHVybiBbCkNvbnNvbGVFdmVudHM6OkVSUk9SID0+IFsnb25Db25zb2xlRXJyb3InLCAtMTI4XSwKQ29uc29sZUV2ZW50czo6VEVSTUlOQVRFID0+IFsnb25Db25zb2xlVGVybWluYXRlJywgLTEyOF0sCl07Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldElucHV0U3RyaW5nKENvbnNvbGVFdmVudCAkZXZlbnQpOiA/c3RyaW5nCnsKJGNvbW1hbmROYW1lID0gJGV2ZW50LT5nZXRDb21tYW5kKCkgPyAkZXZlbnQtPmdldENvbW1hbmQoKS0+Z2V0TmFtZSgpIDogbnVsbDsKJGlucHV0ID0gJGV2ZW50LT5nZXRJbnB1dCgpOwoKaWYgKG1ldGhvZF9leGlzdHMoJGlucHV0LCAnX190b1N0cmluZycpKSB7CmlmICgkY29tbWFuZE5hbWUpIHsKcmV0dXJuIHN0cl9yZXBsYWNlKFsiJyRjb21tYW5kTmFtZSciLCAiXCIkY29tbWFuZE5hbWVcIiJdLCAkY29tbWFuZE5hbWUsIChzdHJpbmcpICRpbnB1dCk7Cn0KCnJldHVybiAoc3RyaW5nKSAkaW5wdXQ7Cn0KCnJldHVybiAkY29tbWFuZE5hbWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBDb21tYW5kTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKcHJpdmF0ZSAkYWx0ZXJuYXRpdmVzOwoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbWVzc2FnZSwgYXJyYXkgJGFsdGVybmF0aXZlcyA9IFtdLCBpbnQgJGNvZGUgPSAwLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJG1lc3NhZ2UsICRjb2RlLCAkcHJldmlvdXMpOwoKJHRoaXMtPmFsdGVybmF0aXZlcyA9ICRhbHRlcm5hdGl2ZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBbHRlcm5hdGl2ZXMoKQp7CnJldHVybiAkdGhpcy0+YWx0ZXJuYXRpdmVzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCgoKaW50ZXJmYWNlIEV4Y2VwdGlvbkludGVyZmFjZSBleHRlbmRzIFxUaHJvd2FibGUKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb247CgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBJbnZhbGlkT3B0aW9uRXhjZXB0aW9uIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIExvZ2ljRXhjZXB0aW9uIGV4dGVuZHMgXExvZ2ljRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBNaXNzaW5nSW5wdXRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBOYW1lc3BhY2VOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIENvbW1hbmROb3RGb3VuZEV4Y2VwdGlvbgp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlcjsKCgoKCmZpbmFsIGNsYXNzIE51bGxPdXRwdXRGb3JtYXR0ZXIgaW1wbGVtZW50cyBPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UKewpwcml2YXRlICRzdHlsZTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXQoP3N0cmluZyAkbWVzc2FnZSk6ID9zdHJpbmcKewpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlKHN0cmluZyAkbmFtZSk6IE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKCnJldHVybiAkdGhpcy0+c3R5bGUgPz8gJHRoaXMtPnN0eWxlID0gbmV3IE51bGxPdXRwdXRGb3JtYXR0ZXJTdHlsZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzU3R5bGUoc3RyaW5nICRuYW1lKTogYm9vbAp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCk6IGJvb2wKewpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKTogdm9pZAp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3R5bGUoc3RyaW5nICRuYW1lLCBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkc3R5bGUpOiB2b2lkCnsKCn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKCgoKZmluYWwgY2xhc3MgTnVsbE91dHB1dEZvcm1hdHRlclN0eWxlIGltcGxlbWVudHMgT3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gYXBwbHkoc3RyaW5nICR0ZXh0KTogc3RyaW5nCnsKcmV0dXJuICR0ZXh0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFja2dyb3VuZCg/c3RyaW5nICRjb2xvciA9IG51bGwpOiB2b2lkCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JlZ3JvdW5kKD9zdHJpbmcgJGNvbG9yID0gbnVsbCk6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG9wdGlvbik6IHZvaWQKewoKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOiB2b2lkCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnNldE9wdGlvbihzdHJpbmcgJG9wdGlvbik6IHZvaWQKewoKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKdXNlIGZ1bmN0aW9uIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xiOwoKCgoKCgoKY2xhc3MgT3V0cHV0Rm9ybWF0dGVyIGltcGxlbWVudHMgV3JhcHBhYmxlT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlCnsKcHJpdmF0ZSAkZGVjb3JhdGVkOwpwcml2YXRlICRzdHlsZXMgPSBbXTsKcHJpdmF0ZSAkc3R5bGVTdGFjazsKCnB1YmxpYyBmdW5jdGlvbiBfX2Nsb25lKCkKewokdGhpcy0+c3R5bGVTdGFjayA9IGNsb25lICR0aGlzLT5zdHlsZVN0YWNrOwpmb3JlYWNoICgkdGhpcy0+c3R5bGVzIGFzICRrZXkgPT4gJHZhbHVlKSB7CiR0aGlzLT5zdHlsZXNbJGtleV0gPSBjbG9uZSAkdmFsdWU7Cn0KfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGVzY2FwZShzdHJpbmcgJHRleHQpCnsKJHRleHQgPSBwcmVnX3JlcGxhY2UoJy8oW15cXFxcXXxeKShbPD5dKS8nLCAnJDFcXFxcJDInLCAkdGV4dCk7CgpyZXR1cm4gc2VsZjo6ZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2goJHRleHQpOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2goc3RyaW5nICR0ZXh0KTogc3RyaW5nCnsKaWYgKHN0cl9lbmRzX3dpdGgoJHRleHQsICdcXCcpKSB7CiRsZW4gPSBcc3RybGVuKCR0ZXh0KTsKJHRleHQgPSBydHJpbSgkdGV4dCwgJ1xcJyk7CiR0ZXh0ID0gc3RyX3JlcGxhY2UoIlwwIiwgJycsICR0ZXh0KTsKJHRleHQgLj0gc3RyX3JlcGVhdCgiXDAiLCAkbGVuIC0gXHN0cmxlbigkdGV4dCkpOwp9CgpyZXR1cm4gJHRleHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGJvb2wgJGRlY29yYXRlZCA9IGZhbHNlLCBhcnJheSAkc3R5bGVzID0gW10pCnsKJHRoaXMtPmRlY29yYXRlZCA9ICRkZWNvcmF0ZWQ7CgokdGhpcy0+c2V0U3R5bGUoJ2Vycm9yJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCd3aGl0ZScsICdyZWQnKSk7CiR0aGlzLT5zZXRTdHlsZSgnaW5mbycsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnZ3JlZW4nKSk7CiR0aGlzLT5zZXRTdHlsZSgnY29tbWVudCcsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgneWVsbG93JykpOwokdGhpcy0+c2V0U3R5bGUoJ3F1ZXN0aW9uJywgbmV3IE91dHB1dEZvcm1hdHRlclN0eWxlKCdibGFjaycsICdjeWFuJykpOwoKZm9yZWFjaCAoJHN0eWxlcyBhcyAkbmFtZSA9PiAkc3R5bGUpIHsKJHRoaXMtPnNldFN0eWxlKCRuYW1lLCAkc3R5bGUpOwp9CgokdGhpcy0+c3R5bGVTdGFjayA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZVN0YWNrKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7CiR0aGlzLT5kZWNvcmF0ZWQgPSAkZGVjb3JhdGVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiAkdGhpcy0+ZGVjb3JhdGVkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0U3R5bGUoc3RyaW5nICRuYW1lLCBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkc3R5bGUpCnsKJHRoaXMtPnN0eWxlc1tzdHJ0b2xvd2VyKCRuYW1lKV0gPSAkc3R5bGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNTdHlsZShzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT5zdHlsZXNbc3RydG9sb3dlcigkbmFtZSldKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0eWxlKHN0cmluZyAkbmFtZSkKewppZiAoISR0aGlzLT5oYXNTdHlsZSgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbmRlZmluZWQgc3R5bGU6ICIlcyIuJywgJG5hbWUpKTsKfQoKcmV0dXJuICR0aGlzLT5zdHlsZXNbc3RydG9sb3dlcigkbmFtZSldOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0KD9zdHJpbmcgJG1lc3NhZ2UpCnsKcmV0dXJuICR0aGlzLT5mb3JtYXRBbmRXcmFwKCRtZXNzYWdlLCAwKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdEFuZFdyYXAoP3N0cmluZyAkbWVzc2FnZSwgaW50ICR3aWR0aCkKewppZiAobnVsbCA9PT0gJG1lc3NhZ2UpIHsKcmV0dXJuICcnOwp9Cgokb2Zmc2V0ID0gMDsKJG91dHB1dCA9ICcnOwokb3BlblRhZ1JlZ2V4ID0gJ1thLXpdKD86W15cXFxcPD5dKisgfCBcXFxcLikqJzsKJGNsb3NlVGFnUmVnZXggPSAnW2Etel1bXjw+XSorJzsKJGN1cnJlbnRMaW5lTGVuZ3RoID0gMDsKcHJlZ19tYXRjaF9hbGwoIiM8KCgkb3BlblRhZ1JlZ2V4KSB8IC8oJGNsb3NlVGFnUmVnZXgpPyk+I2l4IiwgJG1lc3NhZ2UsICRtYXRjaGVzLCBcUFJFR19PRkZTRVRfQ0FQVFVSRSk7CmZvcmVhY2ggKCRtYXRjaGVzWzBdIGFzICRpID0+ICRtYXRjaCkgewokcG9zID0gJG1hdGNoWzFdOwokdGV4dCA9ICRtYXRjaFswXTsKCmlmICgwICE9ICRwb3MgJiYgJ1xcJyA9PSAkbWVzc2FnZVskcG9zIC0gMV0pIHsKY29udGludWU7Cn0KCgokb3V0cHV0IC49ICR0aGlzLT5hcHBseUN1cnJlbnRTdHlsZShzdWJzdHIoJG1lc3NhZ2UsICRvZmZzZXQsICRwb3MgLSAkb2Zmc2V0KSwgJG91dHB1dCwgJHdpZHRoLCAkY3VycmVudExpbmVMZW5ndGgpOwokb2Zmc2V0ID0gJHBvcyArIFxzdHJsZW4oJHRleHQpOwoKCmlmICgkb3BlbiA9ICcvJyAhPSAkdGV4dFsxXSkgewokdGFnID0gJG1hdGNoZXNbMV1bJGldWzBdOwp9IGVsc2UgewokdGFnID0gJG1hdGNoZXNbM11bJGldWzBdID8/ICcnOwp9CgppZiAoISRvcGVuICYmICEkdGFnKSB7CgokdGhpcy0+c3R5bGVTdGFjay0+cG9wKCk7Cn0gZWxzZWlmIChudWxsID09PSAkc3R5bGUgPSAkdGhpcy0+Y3JlYXRlU3R5bGVGcm9tU3RyaW5nKCR0YWcpKSB7CiRvdXRwdXQgLj0gJHRoaXMtPmFwcGx5Q3VycmVudFN0eWxlKCR0ZXh0LCAkb3V0cHV0LCAkd2lkdGgsICRjdXJyZW50TGluZUxlbmd0aCk7Cn0gZWxzZWlmICgkb3BlbikgewokdGhpcy0+c3R5bGVTdGFjay0+cHVzaCgkc3R5bGUpOwp9IGVsc2UgewokdGhpcy0+c3R5bGVTdGFjay0+cG9wKCRzdHlsZSk7Cn0KfQoKJG91dHB1dCAuPSAkdGhpcy0+YXBwbHlDdXJyZW50U3R5bGUoc3Vic3RyKCRtZXNzYWdlLCAkb2Zmc2V0KSwgJG91dHB1dCwgJHdpZHRoLCAkY3VycmVudExpbmVMZW5ndGgpOwoKcmV0dXJuIHN0cnRyKCRvdXRwdXQsIFsiXDAiID0+ICdcXCcsICdcXDwnID0+ICc8JywgJ1xcPicgPT4gJz4nXSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZVN0YWNrKCkKewpyZXR1cm4gJHRoaXMtPnN0eWxlU3RhY2s7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gY3JlYXRlU3R5bGVGcm9tU3RyaW5nKHN0cmluZyAkc3RyaW5nKTogP091dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlCnsKaWYgKGlzc2V0KCR0aGlzLT5zdHlsZXNbJHN0cmluZ10pKSB7CnJldHVybiAkdGhpcy0+c3R5bGVzWyRzdHJpbmddOwp9CgppZiAoIXByZWdfbWF0Y2hfYWxsKCcvKFtePV0rKT0oW147XSspKDt8JCkvJywgJHN0cmluZywgJG1hdGNoZXMsIFxQUkVHX1NFVF9PUkRFUikpIHsKcmV0dXJuIG51bGw7Cn0KCiRzdHlsZSA9IG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgpOwpmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsKYXJyYXlfc2hpZnQoJG1hdGNoKTsKJG1hdGNoWzBdID0gc3RydG9sb3dlcigkbWF0Y2hbMF0pOwoKaWYgKCdmZycgPT0gJG1hdGNoWzBdKSB7CiRzdHlsZS0+c2V0Rm9yZWdyb3VuZChzdHJ0b2xvd2VyKCRtYXRjaFsxXSkpOwp9IGVsc2VpZiAoJ2JnJyA9PSAkbWF0Y2hbMF0pIHsKJHN0eWxlLT5zZXRCYWNrZ3JvdW5kKHN0cnRvbG93ZXIoJG1hdGNoWzFdKSk7Cn0gZWxzZWlmICgnaHJlZicgPT09ICRtYXRjaFswXSkgewokdXJsID0gcHJlZ19yZXBsYWNlKCd7XFxcXChbPD5dKX0nLCAnJDEnLCAkbWF0Y2hbMV0pOwokc3R5bGUtPnNldEhyZWYoJHVybCk7Cn0gZWxzZWlmICgnb3B0aW9ucycgPT09ICRtYXRjaFswXSkgewpwcmVnX21hdGNoX2FsbCgnKFteLDtdKyknLCBzdHJ0b2xvd2VyKCRtYXRjaFsxXSksICRvcHRpb25zKTsKJG9wdGlvbnMgPSBhcnJheV9zaGlmdCgkb3B0aW9ucyk7CmZvcmVhY2ggKCRvcHRpb25zIGFzICRvcHRpb24pIHsKJHN0eWxlLT5zZXRPcHRpb24oJG9wdGlvbik7Cn0KfSBlbHNlIHsKcmV0dXJuIG51bGw7Cn0KfQoKcmV0dXJuICRzdHlsZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhcHBseUN1cnJlbnRTdHlsZShzdHJpbmcgJHRleHQsIHN0cmluZyAkY3VycmVudCwgaW50ICR3aWR0aCwgaW50ICYkY3VycmVudExpbmVMZW5ndGgpOiBzdHJpbmcKewppZiAoJycgPT09ICR0ZXh0KSB7CnJldHVybiAnJzsKfQoKaWYgKCEkd2lkdGgpIHsKcmV0dXJuICR0aGlzLT5pc0RlY29yYXRlZCgpID8gJHRoaXMtPnN0eWxlU3RhY2stPmdldEN1cnJlbnQoKS0+YXBwbHkoJHRleHQpIDogJHRleHQ7Cn0KCmlmICghJGN1cnJlbnRMaW5lTGVuZ3RoICYmICcnICE9PSAkY3VycmVudCkgewokdGV4dCA9IGx0cmltKCR0ZXh0KTsKfQoKaWYgKCRjdXJyZW50TGluZUxlbmd0aCkgewokcHJlZml4ID0gc3Vic3RyKCR0ZXh0LCAwLCAkaSA9ICR3aWR0aCAtICRjdXJyZW50TGluZUxlbmd0aCkuIlxuIjsKJHRleHQgPSBzdWJzdHIoJHRleHQsICRpKTsKfSBlbHNlIHsKJHByZWZpeCA9ICcnOwp9CgpwcmVnX21hdGNoKCd+KFxcbikkficsICR0ZXh0LCAkbWF0Y2hlcyk7CiR0ZXh0ID0gJHByZWZpeC4kdGhpcy0+YWRkTGluZUJyZWFrcygkdGV4dCwgJHdpZHRoKTsKJHRleHQgPSBydHJpbSgkdGV4dCwgIlxuIikuKCRtYXRjaGVzWzFdID8/ICcnKTsKCmlmICghJGN1cnJlbnRMaW5lTGVuZ3RoICYmICcnICE9PSAkY3VycmVudCAmJiAiXG4iICE9PSBzdWJzdHIoJGN1cnJlbnQsIC0xKSkgewokdGV4dCA9ICJcbiIuJHRleHQ7Cn0KCiRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJHRleHQpOwoKZm9yZWFjaCAoJGxpbmVzIGFzICRsaW5lKSB7CiRjdXJyZW50TGluZUxlbmd0aCArPSBcc3RybGVuKCRsaW5lKTsKaWYgKCR3aWR0aCA8PSAkY3VycmVudExpbmVMZW5ndGgpIHsKJGN1cnJlbnRMaW5lTGVuZ3RoID0gMDsKfQp9CgppZiAoJHRoaXMtPmlzRGVjb3JhdGVkKCkpIHsKZm9yZWFjaCAoJGxpbmVzIGFzICRpID0+ICRsaW5lKSB7CiRsaW5lc1skaV0gPSAkdGhpcy0+c3R5bGVTdGFjay0+Z2V0Q3VycmVudCgpLT5hcHBseSgkbGluZSk7Cn0KfQoKcmV0dXJuIGltcGxvZGUoIlxuIiwgJGxpbmVzKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRMaW5lQnJlYWtzKHN0cmluZyAkdGV4dCwgaW50ICR3aWR0aCk6IHN0cmluZwp7CiRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkdGV4dCwgbnVsbCwgdHJ1ZSkgPzogJ1VURi04JzsKCnJldHVybiBiKCR0ZXh0KS0+dG9Db2RlUG9pbnRTdHJpbmcoJGVuY29kaW5nKS0+d29yZHdyYXAoJHdpZHRoLCAiXG4iLCB0cnVlKS0+dG9CeXRlU3RyaW5nKCRlbmNvZGluZyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKCgoKCgppbnRlcmZhY2UgT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHlsZShzdHJpbmcgJG5hbWUsIE91dHB1dEZvcm1hdHRlclN0eWxlSW50ZXJmYWNlICRzdHlsZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNTdHlsZShzdHJpbmcgJG5hbWUpOwoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZShzdHJpbmcgJG5hbWUpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9ybWF0KD9zdHJpbmcgJG1lc3NhZ2UpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb2xvcjsKCgoKCgoKY2xhc3MgT3V0cHV0Rm9ybWF0dGVyU3R5bGUgaW1wbGVtZW50cyBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZQp7CnByaXZhdGUgJGNvbG9yOwpwcml2YXRlICRmb3JlZ3JvdW5kOwpwcml2YXRlICRiYWNrZ3JvdW5kOwpwcml2YXRlICRvcHRpb25zOwpwcml2YXRlICRocmVmOwpwcml2YXRlICRoYW5kbGVzSHJlZkdyYWNlZnVsbHk7CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP3N0cmluZyAkZm9yZWdyb3VuZCA9IG51bGwsID9zdHJpbmcgJGJhY2tncm91bmQgPSBudWxsLCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCA9ICRmb3JlZ3JvdW5kID86ICcnLCAkdGhpcy0+YmFja2dyb3VuZCA9ICRiYWNrZ3JvdW5kID86ICcnLCAkdGhpcy0+b3B0aW9ucyA9ICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcmVncm91bmQoP3N0cmluZyAkY29sb3IgPSBudWxsKQp7CiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCA9ICRjb2xvciA/OiAnJywgJHRoaXMtPmJhY2tncm91bmQsICR0aGlzLT5vcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEJhY2tncm91bmQoP3N0cmluZyAkY29sb3IgPSBudWxsKQp7CiR0aGlzLT5jb2xvciA9IG5ldyBDb2xvcigkdGhpcy0+Zm9yZWdyb3VuZCwgJHRoaXMtPmJhY2tncm91bmQgPSAkY29sb3IgPzogJycsICR0aGlzLT5vcHRpb25zKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEhyZWYoc3RyaW5nICR1cmwpOiB2b2lkCnsKJHRoaXMtPmhyZWYgPSAkdXJsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkb3B0aW9uKQp7CiR0aGlzLT5vcHRpb25zW10gPSAkb3B0aW9uOwokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQsICR0aGlzLT5iYWNrZ3JvdW5kLCAkdGhpcy0+b3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB1bnNldE9wdGlvbihzdHJpbmcgJG9wdGlvbikKewokcG9zID0gYXJyYXlfc2VhcmNoKCRvcHRpb24sICR0aGlzLT5vcHRpb25zKTsKaWYgKGZhbHNlICE9PSAkcG9zKSB7CnVuc2V0KCR0aGlzLT5vcHRpb25zWyRwb3NdKTsKfQoKJHRoaXMtPmNvbG9yID0gbmV3IENvbG9yKCR0aGlzLT5mb3JlZ3JvdW5kLCAkdGhpcy0+YmFja2dyb3VuZCwgJHRoaXMtPm9wdGlvbnMpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucykKewokdGhpcy0+Y29sb3IgPSBuZXcgQ29sb3IoJHRoaXMtPmZvcmVncm91bmQsICR0aGlzLT5iYWNrZ3JvdW5kLCAkdGhpcy0+b3B0aW9ucyA9ICRvcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFwcGx5KHN0cmluZyAkdGV4dCkKewppZiAobnVsbCA9PT0gJHRoaXMtPmhhbmRsZXNIcmVmR3JhY2VmdWxseSkgewokdGhpcy0+aGFuZGxlc0hyZWZHcmFjZWZ1bGx5ID0gJ0pldEJyYWlucy1KZWRpVGVybScgIT09IGdldGVudignVEVSTUlOQUxfRU1VTEFUT1InKQomJiAoIWdldGVudignS09OU09MRV9WRVJTSU9OJykgfHwgKGludCkgZ2V0ZW52KCdLT05TT0xFX1ZFUlNJT04nKSA+IDIwMTEwMCkKJiYgIWlzc2V0KCRfU0VSVkVSWydJREVBX0lOSVRJQUxfRElSRUNUT1JZJ10pOwp9CgppZiAobnVsbCAhPT0gJHRoaXMtPmhyZWYgJiYgJHRoaXMtPmhhbmRsZXNIcmVmR3JhY2VmdWxseSkgewokdGV4dCA9ICJcMDMzXTg7OyR0aGlzLT5ocmVmXDAzM1xcJHRleHRcMDMzXTg7O1wwMzNcXCI7Cn0KCnJldHVybiAkdGhpcy0+Y29sb3ItPmFwcGx5KCR0ZXh0KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXI7CgoKCgoKCmludGVyZmFjZSBPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JlZ3JvdW5kKD9zdHJpbmcgJGNvbG9yID0gbnVsbCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QmFja2dyb3VuZCg/c3RyaW5nICRjb2xvciA9IG51bGwpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbihzdHJpbmcgJG9wdGlvbik7CgoKCgpwdWJsaWMgZnVuY3Rpb24gdW5zZXRPcHRpb24oc3RyaW5nICRvcHRpb24pOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wdGlvbnMoYXJyYXkgJG9wdGlvbnMpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXBwbHkoc3RyaW5nICR0ZXh0KTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcUmVzZXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBPdXRwdXRGb3JtYXR0ZXJTdHlsZVN0YWNrIGltcGxlbWVudHMgUmVzZXRJbnRlcmZhY2UKewoKCgpwcml2YXRlICRzdHlsZXM7Cgpwcml2YXRlICRlbXB0eVN0eWxlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9PdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkZW1wdHlTdHlsZSA9IG51bGwpCnsKJHRoaXMtPmVtcHR5U3R5bGUgPSAkZW1wdHlTdHlsZSA/PyBuZXcgT3V0cHV0Rm9ybWF0dGVyU3R5bGUoKTsKJHRoaXMtPnJlc2V0KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiByZXNldCgpCnsKJHRoaXMtPnN0eWxlcyA9IFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHVzaChPdXRwdXRGb3JtYXR0ZXJTdHlsZUludGVyZmFjZSAkc3R5bGUpCnsKJHRoaXMtPnN0eWxlc1tdID0gJHN0eWxlOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBvcCg/T3V0cHV0Rm9ybWF0dGVyU3R5bGVJbnRlcmZhY2UgJHN0eWxlID0gbnVsbCkKewppZiAoZW1wdHkoJHRoaXMtPnN0eWxlcykpIHsKcmV0dXJuICR0aGlzLT5lbXB0eVN0eWxlOwp9CgppZiAobnVsbCA9PT0gJHN0eWxlKSB7CnJldHVybiBhcnJheV9wb3AoJHRoaXMtPnN0eWxlcyk7Cn0KCmZvcmVhY2ggKGFycmF5X3JldmVyc2UoJHRoaXMtPnN0eWxlcywgdHJ1ZSkgYXMgJGluZGV4ID0+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+ZGVzY3JpcHRvcnNbJG9wdGlvbnNbJ2Zvcm1hdCddXTsKJGRlc2NyaXB0b3ItPmRlc2NyaWJlKCRvdXRwdXQsICRvYmplY3QsICRvcHRpb25zKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXIoc3RyaW5nICRmb3JtYXQsIERlc2NyaXB0b3JJbnRlcmZhY2UgJGRlc2NyaXB0b3IpCnsKJHRoaXMtPmRlc2NyaXB0b3JzWyRmb3JtYXRdID0gJGRlc2NyaXB0b3I7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJ2Rlc2NyaXB0b3InOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0cygpOiBhcnJheQp7CnJldHVybiBhcnJheV9rZXlzKCR0aGlzLT5kZXNjcmlwdG9ycyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFZhckR1bXBlclxDbG9uZXJcQ2xvbmVySW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcVmFyRHVtcGVyXENsb25lclxWYXJDbG9uZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxWYXJEdW1wZXJcRHVtcGVyXENsaUR1bXBlcjsKCgoKCmZpbmFsIGNsYXNzIER1bXBlcgp7CnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkZHVtcGVyOwpwcml2YXRlICRjbG9uZXI7CnByaXZhdGUgJGhhbmRsZXI7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsID9DbGlEdW1wZXIgJGR1bXBlciA9IG51bGwsID9DbG9uZXJJbnRlcmZhY2UgJGNsb25lciA9IG51bGwpCnsKJHRoaXMtPm91dHB1dCA9ICRvdXRwdXQ7CiR0aGlzLT5kdW1wZXIgPSAkZHVtcGVyOwokdGhpcy0+Y2xvbmVyID0gJGNsb25lcjsKCmlmIChjbGFzc19leGlzdHMoQ2xpRHVtcGVyOjpjbGFzcykpIHsKJHRoaXMtPmhhbmRsZXIgPSBmdW5jdGlvbiAoJHZhcik6IHN0cmluZyB7CiRkdW1wZXIgPSAkdGhpcy0+ZHVtcGVyID8/ICR0aGlzLT5kdW1wZXIgPSBuZXcgQ2xpRHVtcGVyKG51bGwsIG51bGwsIENsaUR1bXBlcjo6RFVNUF9MSUdIVF9BUlJBWSB8IENsaUR1bXBlcjo6RFVNUF9DT01NQV9TRVBBUkFUT1IpOwokZHVtcGVyLT5zZXRDb2xvcnMoJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSk7CgpyZXR1cm4gcnRyaW0oJGR1bXBlci0+ZHVtcCgoJHRoaXMtPmNsb25lciA/PyAkdGhpcy0+Y2xvbmVyID0gbmV3IFZhckNsb25lcigpKS0+Y2xvbmVWYXIoJHZhciktPndpdGhSZWZIYW5kbGVzKGZhbHNlKSwgdHJ1ZSkpOwp9Owp9IGVsc2UgewokdGhpcy0+aGFuZGxlciA9IGZ1bmN0aW9uICgkdmFyKTogc3RyaW5nIHsKc3dpdGNoICh0cnVlKSB7CmNhc2UgbnVsbCA9PT0gJHZhcjoKcmV0dXJuICdudWxsJzsKY2FzZSB0cnVlID09PSAkdmFyOgpyZXR1cm4gJ3RydWUnOwpjYXNlIGZhbHNlID09PSAkdmFyOgpyZXR1cm4gJ2ZhbHNlJzsKY2FzZSBcaXNfc3RyaW5nKCR2YXIpOgpyZXR1cm4gJyInLiR2YXIuJyInOwpkZWZhdWx0OgpyZXR1cm4gcnRyaW0ocHJpbnRfcigkdmFyLCB0cnVlKSk7Cn0KfTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gX19pbnZva2UoJHZhcik6IHN0cmluZwp7CnJldHVybiAoJHRoaXMtPmhhbmRsZXIpKCR2YXIpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXI7CgoKCgoKCmNsYXNzIEZvcm1hdHRlckhlbHBlciBleHRlbmRzIEhlbHBlcgp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIGZvcm1hdFNlY3Rpb24oc3RyaW5nICRzZWN0aW9uLCBzdHJpbmcgJG1lc3NhZ2UsIHN0cmluZyAkc3R5bGUgPSAnaW5mbycpCnsKcmV0dXJuIHNwcmludGYoJzwlcz5bJXNdPC8lcz4gJXMnLCAkc3R5bGUsICRzZWN0aW9uLCAkc3R5bGUsICRtZXNzYWdlKTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmb3JtYXRCbG9jaygkbWVzc2FnZXMsIHN0cmluZyAkc3R5bGUsIGJvb2wgJGxhcmdlID0gZmFsc2UpCnsKaWYgKCFcaXNfYXJyYXkoJG1lc3NhZ2VzKSkgewokbWVzc2FnZXMgPSBbJG1lc3NhZ2VzXTsKfQoKJGxlbiA9IDA7CiRsaW5lcyA9IFtdOwpmb3JlYWNoICgkbWVzc2FnZXMgYXMgJG1lc3NhZ2UpIHsKJG1lc3NhZ2UgPSBPdXRwdXRGb3JtYXR0ZXI6OmVzY2FwZSgkbWVzc2FnZSk7CiRsaW5lc1tdID0gc3ByaW50ZigkbGFyZ2UgPyAnICAlcyAgJyA6ICcgJXMgJywgJG1lc3NhZ2UpOwokbGVuID0gbWF4KHNlbGY6OndpZHRoKCRtZXNzYWdlKSArICgkbGFyZ2UgPyA0IDogMiksICRsZW4pOwp9CgokbWVzc2FnZXMgPSAkbGFyZ2UgPyBbc3RyX3JlcGVhdCgnICcsICRsZW4pXSA6IFtdOwpmb3IgKCRpID0gMDsgaXNzZXQoJGxpbmVzWyRpXSk7ICsrJGkpIHsKJG1lc3NhZ2VzW10gPSAkbGluZXNbJGldLnN0cl9yZXBlYXQoJyAnLCAkbGVuIC0gc2VsZjo6d2lkdGgoJGxpbmVzWyRpXSkpOwp9CmlmICgkbGFyZ2UpIHsKJG1lc3NhZ2VzW10gPSBzdHJfcmVwZWF0KCcgJywgJGxlbik7Cn0KCmZvciAoJGkgPSAwOyBpc3NldCgkbWVzc2FnZXNbJGldKTsgKyskaSkgewokbWVzc2FnZXNbJGldID0gc3ByaW50ZignPCVzPiVzPC8lcz4nLCAkc3R5bGUsICRtZXNzYWdlc1skaV0sICRzdHlsZSk7Cn0KCnJldHVybiBpbXBsb2RlKCJcbiIsICRtZXNzYWdlcyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZyAkbWVzc2FnZSwgaW50ICRsZW5ndGgsIHN0cmluZyAkc3VmZml4ID0gJy4uLicpCnsKJGNvbXB1dGVkTGVuZ3RoID0gJGxlbmd0aCAtIHNlbGY6OndpZHRoKCRzdWZmaXgpOwoKaWYgKCRjb21wdXRlZExlbmd0aCA+IHNlbGY6OndpZHRoKCRtZXNzYWdlKSkgewpyZXR1cm4gJG1lc3NhZ2U7Cn0KCnJldHVybiBzZWxmOjpzdWJzdHIoJG1lc3NhZ2UsIDAsICRsZW5ndGgpLiRzdWZmaXg7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXROYW1lKCkKewpyZXR1cm4gJ2Zvcm1hdHRlcic7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xVbmljb2RlU3RyaW5nOwoKCgoKCgphYnN0cmFjdCBjbGFzcyBIZWxwZXIgaW1wbGVtZW50cyBIZWxwZXJJbnRlcmZhY2UKewpwcm90ZWN0ZWQgJGhlbHBlclNldCA9IG51bGw7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVscGVyU2V0KD9IZWxwZXJTZXQgJGhlbHBlclNldCA9IG51bGwpCnsKJHRoaXMtPmhlbHBlclNldCA9ICRoZWxwZXJTZXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWxwZXJTZXQoKQp7CnJldHVybiAkdGhpcy0+aGVscGVyU2V0Owp9CgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdHJsZW4oP3N0cmluZyAkc3RyaW5nKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjMnLCAnTWV0aG9kICIlcygpIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gU3ltZm9ueSA2LjAuIFVzZSBIZWxwZXI6OndpZHRoKCkgb3IgSGVscGVyOjpsZW5ndGgoKSBpbnN0ZWFkLicsIF9fTUVUSE9EX18pOwoKcmV0dXJuIHNlbGY6OndpZHRoKCRzdHJpbmcpOwp9CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB3aWR0aCg/c3RyaW5nICRzdHJpbmcpOiBpbnQKewokc3RyaW5nID8/ICRzdHJpbmcgPSAnJzsKCmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSkgewpyZXR1cm4gKG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcpKS0+d2lkdGgoZmFsc2UpOwp9CgppZiAoZmFsc2UgPT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCBudWxsLCB0cnVlKSkgewpyZXR1cm4gXHN0cmxlbigkc3RyaW5nKTsKfQoKcmV0dXJuIG1iX3N0cndpZHRoKCRzdHJpbmcsICRlbmNvZGluZyk7Cn0KCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGxlbmd0aCg/c3RyaW5nICRzdHJpbmcpOiBpbnQKewokc3RyaW5nID8/ICRzdHJpbmcgPSAnJzsKCmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyaW5nKSkgewpyZXR1cm4gKG5ldyBVbmljb2RlU3RyaW5nKCRzdHJpbmcpKS0+bGVuZ3RoKCk7Cn0KCmlmIChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsIG51bGwsIHRydWUpKSB7CnJldHVybiBcc3RybGVuKCRzdHJpbmcpOwp9CgpyZXR1cm4gbWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzdWJzdHIoP3N0cmluZyAkc3RyaW5nLCBpbnQgJGZyb20sID9pbnQgJGxlbmd0aCA9IG51bGwpCnsKJHN0cmluZyA/PyAkc3RyaW5nID0gJyc7CgppZiAoZmFsc2UgPT09ICRlbmNvZGluZyA9IG1iX2RldGVjdF9lbmNvZGluZygkc3RyaW5nLCBudWxsLCB0cnVlKSkgewpyZXR1cm4gc3Vic3RyKCRzdHJpbmcsICRmcm9tLCAkbGVuZ3RoKTsKfQoKcmV0dXJuIG1iX3N1YnN0cigkc3RyaW5nLCAkZnJvbSwgJGxlbmd0aCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRUaW1lKCRzZWNzKQp7CnN0YXRpYyAkdGltZUZvcm1hdHMgPSBbClswLCAnPCAxIHNlYyddLApbMSwgJzEgc2VjJ10sClsyLCAnc2VjcycsIDFdLApbNjAsICcxIG1pbiddLApbMTIwLCAnbWlucycsIDYwXSwKWzM2MDAsICcxIGhyJ10sCls3MjAwLCAnaHJzJywgMzYwMF0sCls4NjQwMCwgJzEgZGF5J10sClsxNzI4MDAsICdkYXlzJywgODY0MDBdLApdOwoKZm9yZWFjaCAoJHRpbWVGb3JtYXRzIGFzICRpbmRleCA9PiAkZm9ybWF0KSB7CmlmICgkc2VjcyA+PSAkZm9ybWF0WzBdKSB7CmlmICgoaXNzZXQoJHRpbWVGb3JtYXRzWyRpbmRleCArIDFdKSAmJiAkc2VjcyA8ICR0aW1lRm9ybWF0c1skaW5kZXggKyAxXVswXSkKfHwgJGluZGV4ID09IFxjb3VudCgkdGltZUZvcm1hdHMpIC0gMQopIHsKaWYgKDIgPT0gXGNvdW50KCRmb3JtYXQpKSB7CnJldHVybiAkZm9ybWF0WzFdOwp9CgpyZXR1cm4gZmxvb3IoJHNlY3MgLyAkZm9ybWF0WzJdKS4nICcuJGZvcm1hdFsxXTsKfQp9Cn0KfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmb3JtYXRNZW1vcnkoaW50ICRtZW1vcnkpCnsKaWYgKCRtZW1vcnkgPj0gMTAyNCAqIDEwMjQgKiAxMDI0KSB7CnJldHVybiBzcHJpbnRmKCclLjFmIEdpQicsICRtZW1vcnkgLyAxMDI0IC8gMTAyNCAvIDEwMjQpOwp9CgppZiAoJG1lbW9yeSA+PSAxMDI0ICogMTAyNCkgewpyZXR1cm4gc3ByaW50ZignJS4xZiBNaUInLCAkbWVtb3J5IC8gMTAyNCAvIDEwMjQpOwp9CgppZiAoJG1lbW9yeSA+PSAxMDI0KSB7CnJldHVybiBzcHJpbnRmKCclZCBLaUInLCAkbWVtb3J5IC8gMTAyNCk7Cn0KCnJldHVybiBzcHJpbnRmKCclZCBCJywgJG1lbW9yeSk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc3RybGVuV2l0aG91dERlY29yYXRpb24oT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIsID9zdHJpbmcgJHN0cmluZykKewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2NvbnNvbGUnLCAnNS4zJywgJ01ldGhvZCAiJXMoKSIgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIFN5bWZvbnkgNi4wLiBVc2UgSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCkgaW5zdGVhZC4nLCBfX01FVEhPRF9fKTsKCnJldHVybiBzZWxmOjp3aWR0aChzZWxmOjpyZW1vdmVEZWNvcmF0aW9uKCRmb3JtYXR0ZXIsICRzdHJpbmcpKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiByZW1vdmVEZWNvcmF0aW9uKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyLCA/c3RyaW5nICRzdHJpbmcpCnsKJGlzRGVjb3JhdGVkID0gJGZvcm1hdHRlci0+aXNEZWNvcmF0ZWQoKTsKJGZvcm1hdHRlci0+c2V0RGVjb3JhdGVkKGZhbHNlKTsKCiRzdHJpbmcgPSAkZm9ybWF0dGVyLT5mb3JtYXQoJHN0cmluZyA/PyAnJyk7Cgokc3RyaW5nID0gcHJlZ19yZXBsYWNlKCIvXDAzM1xbW15tXSptLyIsICcnLCAkc3RyaW5nID8/ICcnKTsKCiRzdHJpbmcgPSBwcmVnX3JlcGxhY2UoJy9cXDAzM104O1teO10qO1teXFwwMzNdKlxcMDMzXFxcXC8nLCAnJywgJHN0cmluZyA/PyAnJyk7CiRmb3JtYXR0ZXItPnNldERlY29yYXRlZCgkaXNEZWNvcmF0ZWQpOwoKcmV0dXJuICRzdHJpbmc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKCgoKCgppbnRlcmZhY2UgSGVscGVySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHNldEhlbHBlclNldCg/SGVscGVyU2V0ICRoZWxwZXJTZXQgPSBudWxsKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEhlbHBlclNldCgpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgSGVscGVyU2V0IGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlCnsKCnByaXZhdGUgJGhlbHBlcnMgPSBbXTsKcHJpdmF0ZSAkY29tbWFuZDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkaGVscGVycyA9IFtdKQp7CmZvcmVhY2ggKCRoZWxwZXJzIGFzICRhbGlhcyA9PiAkaGVscGVyKSB7CiR0aGlzLT5zZXQoJGhlbHBlciwgXGlzX2ludCgkYWxpYXMpID8gbnVsbCA6ICRhbGlhcyk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHNldChIZWxwZXJJbnRlcmZhY2UgJGhlbHBlciwgP3N0cmluZyAkYWxpYXMgPSBudWxsKQp7CiR0aGlzLT5oZWxwZXJzWyRoZWxwZXItPmdldE5hbWUoKV0gPSAkaGVscGVyOwppZiAobnVsbCAhPT0gJGFsaWFzKSB7CiR0aGlzLT5oZWxwZXJzWyRhbGlhc10gPSAkaGVscGVyOwp9CgokaGVscGVyLT5zZXRIZWxwZXJTZXQoJHRoaXMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXMoc3RyaW5nICRuYW1lKQp7CnJldHVybiBpc3NldCgkdGhpcy0+aGVscGVyc1skbmFtZV0pOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldChzdHJpbmcgJG5hbWUpCnsKaWYgKCEkdGhpcy0+aGFzKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBoZWxwZXIgIiVzIiBpcyBub3QgZGVmaW5lZC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPmhlbHBlcnNbJG5hbWVdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29tbWFuZCg/Q29tbWFuZCAkY29tbWFuZCA9IG51bGwpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9jb25zb2xlJywgJzUuNCcsICdNZXRob2QgIiVzKCkiIGlzIGRlcHJlY2F0ZWQuJywgX19NRVRIT0RfXyk7CgokdGhpcy0+Y29tbWFuZCA9ICRjb21tYW5kOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENvbW1hbmQoKQp7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvY29uc29sZScsICc1LjQnLCAnTWV0aG9kICIlcygpIiBpcyBkZXByZWNhdGVkLicsIF9fTUVUSE9EX18pOwoKcmV0dXJuICR0aGlzLT5jb21tYW5kOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGdldEl0ZXJhdG9yKCkKewpyZXR1cm4gbmV3IFxBcnJheUl0ZXJhdG9yKCR0aGlzLT5oZWxwZXJzKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEF3YXJlSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgSW5wdXRBd2FyZUhlbHBlciBleHRlbmRzIEhlbHBlciBpbXBsZW1lbnRzIElucHV0QXdhcmVJbnRlcmZhY2UKewpwcm90ZWN0ZWQgJGlucHV0OwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldElucHV0KElucHV0SW50ZXJmYWNlICRpbnB1dCkKewokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxQcm9jZXNzRmFpbGVkRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgoKCmNsYXNzIFByb2Nlc3NIZWxwZXIgZXh0ZW5kcyBIZWxwZXIKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1bihPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgJGNtZCwgP3N0cmluZyAkZXJyb3IgPSBudWxsLCA/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCwgaW50ICR2ZXJib3NpdHkgPSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UpOiBQcm9jZXNzCnsKaWYgKCFjbGFzc19leGlzdHMoUHJvY2Vzczo6Y2xhc3MpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1RoZSBQcm9jZXNzSGVscGVyIGNhbm5vdCBiZSBydW4gYXMgdGhlIFByb2Nlc3MgY29tcG9uZW50IGlzIG5vdCBpbnN0YWxsZWQuIFRyeSBydW5uaW5nICJjb21wb3NlIHJlcXVpcmUgc3ltZm9ueS9wcm9jZXNzIi4nKTsKfQoKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgokZm9ybWF0dGVyID0gJHRoaXMtPmdldEhlbHBlclNldCgpLT5nZXQoJ2RlYnVnX2Zvcm1hdHRlcicpOwoKaWYgKCRjbWQgaW5zdGFuY2VvZiBQcm9jZXNzKSB7CiRjbWQgPSBbJGNtZF07Cn0KCmlmICghXGlzX2FycmF5KCRjbWQpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ1RoZSAiY29tbWFuZCIgYXJndW1lbnQgb2YgIiVzKCkiIG11c3QgYmUgYW4gYXJyYXkgb3IgYSAiJXMiIGluc3RhbmNlLCAiJXMiIGdpdmVuLicsIF9fTUVUSE9EX18sIFByb2Nlc3M6OmNsYXNzLCBnZXRfZGVidWdfdHlwZSgkY21kKSkpOwp9CgppZiAoXGlzX3N0cmluZygkY21kWzBdID8/IG51bGwpKSB7CiRwcm9jZXNzID0gbmV3IFByb2Nlc3MoJGNtZCk7CiRjbWQgPSBbXTsKfSBlbHNlaWYgKCgkY21kWzBdID8/IG51bGwpIGluc3RhbmNlb2YgUHJvY2VzcykgewokcHJvY2VzcyA9ICRjbWRbMF07CnVuc2V0KCRjbWRbMF0pOwp9IGVsc2Ugewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIGNvbW1hbmQgcHJvdmlkZWQgdG8gIiVzKCkiOiB0aGUgY29tbWFuZCBzaG91bGQgYmUgYW4gYXJyYXkgd2hvc2UgZmlyc3QgZWxlbWVudCBpcyBlaXRoZXIgdGhlIHBhdGggdG8gdGhlIGJpbmFyeSB0byBydW4gb3IgYSAiUHJvY2VzcyIgb2JqZWN0LicsIF9fTUVUSE9EX18pKTsKfQoKaWYgKCR2ZXJib3NpdHkgPD0gJG91dHB1dC0+Z2V0VmVyYm9zaXR5KCkpIHsKJG91dHB1dC0+d3JpdGUoJGZvcm1hdHRlci0+c3RhcnQoc3BsX29iamVjdF9oYXNoKCRwcm9jZXNzKSwgJHRoaXMtPmVzY2FwZVN0cmluZygkcHJvY2Vzcy0+Z2V0Q29tbWFuZExpbmUoKSkpKTsKfQoKaWYgKCRvdXRwdXQtPmlzRGVidWcoKSkgewokY2FsbGJhY2sgPSAkdGhpcy0+d3JhcENhbGxiYWNrKCRvdXRwdXQsICRwcm9jZXNzLCAkY2FsbGJhY2spOwp9CgokcHJvY2Vzcy0+cnVuKCRjYWxsYmFjaywgJGNtZCk7CgppZiAoJHZlcmJvc2l0eSA8PSAkb3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewokbWVzc2FnZSA9ICRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSA/ICdDb21tYW5kIHJhbiBzdWNjZXNzZnVsbHknIDogc3ByaW50ZignJXMgQ29tbWFuZCBkaWQgbm90IHJ1biBzdWNjZXNzZnVsbHknLCAkcHJvY2Vzcy0+Z2V0RXhpdENvZGUoKSk7CiRvdXRwdXQtPndyaXRlKCRmb3JtYXR0ZXItPnN0b3Aoc3BsX29iamVjdF9oYXNoKCRwcm9jZXNzKSwgJG1lc3NhZ2UsICRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSkpOwp9CgppZiAoISRwcm9jZXNzLT5pc1N1Y2Nlc3NmdWwoKSAmJiBudWxsICE9PSAkZXJyb3IpIHsKJG91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCc8ZXJyb3I+JXM8L2Vycm9yPicsICR0aGlzLT5lc2NhcGVTdHJpbmcoJGVycm9yKSkpOwp9CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG11c3RSdW4oT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsICRjbWQsID9zdHJpbmcgJGVycm9yID0gbnVsbCwgP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwpOiBQcm9jZXNzCnsKJHByb2Nlc3MgPSAkdGhpcy0+cnVuKCRvdXRwdXQsICRjbWQsICRlcnJvciwgJGNhbGxiYWNrKTsKCmlmICghJHByb2Nlc3MtPmlzU3VjY2Vzc2Z1bCgpKSB7CnRocm93IG5ldyBQcm9jZXNzRmFpbGVkRXhjZXB0aW9uKCRwcm9jZXNzKTsKfQoKcmV0dXJuICRwcm9jZXNzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JhcENhbGxiYWNrKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBQcm9jZXNzICRwcm9jZXNzLCA/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCk6IGNhbGxhYmxlCnsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgokZm9ybWF0dGVyID0gJHRoaXMtPmdldEhlbHBlclNldCgpLT5nZXQoJ2RlYnVnX2Zvcm1hdHRlcicpOwoKcmV0dXJuIGZ1bmN0aW9uICgkdHlwZSwgJGJ1ZmZlcikgdXNlICgkb3V0cHV0LCAkcHJvY2VzcywgJGNhbGxiYWNrLCAkZm9ybWF0dGVyKSB7CiRvdXRwdXQtPndyaXRlKCRmb3JtYXR0ZXItPnByb2dyZXNzKHNwbF9vYmplY3RfaGFzaCgkcHJvY2VzcyksICR0aGlzLT5lc2NhcGVTdHJpbmcoJGJ1ZmZlciksIFByb2Nlc3M6OkVSUiA9PT0gJHR5cGUpKTsKCmlmIChudWxsICE9PSAkY2FsbGJhY2spIHsKJGNhbGxiYWNrKCR0eXBlLCAkYnVmZmVyKTsKfQp9Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGVzY2FwZVN0cmluZyhzdHJpbmcgJHN0cik6IHN0cmluZwp7CnJldHVybiBzdHJfcmVwbGFjZSgnPCcsICdcXDwnLCAkc3RyKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKTogc3RyaW5nCnsKcmV0dXJuICdwcm9jZXNzJzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDdXJzb3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlU2VjdGlvbk91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVybWluYWw7CgoKCgoKCgpmaW5hbCBjbGFzcyBQcm9ncmVzc0Jhcgp7CnB1YmxpYyBjb25zdCBGT1JNQVRfVkVSQk9TRSA9ICd2ZXJib3NlJzsKcHVibGljIGNvbnN0IEZPUk1BVF9WRVJZX1ZFUkJPU0UgPSAndmVyeV92ZXJib3NlJzsKcHVibGljIGNvbnN0IEZPUk1BVF9ERUJVRyA9ICdkZWJ1Zyc7CnB1YmxpYyBjb25zdCBGT1JNQVRfTk9STUFMID0gJ25vcm1hbCc7Cgpwcml2YXRlIGNvbnN0IEZPUk1BVF9WRVJCT1NFX05PTUFYID0gJ3ZlcmJvc2Vfbm9tYXgnOwpwcml2YXRlIGNvbnN0IEZPUk1BVF9WRVJZX1ZFUkJPU0VfTk9NQVggPSAndmVyeV92ZXJib3NlX25vbWF4JzsKcHJpdmF0ZSBjb25zdCBGT1JNQVRfREVCVUdfTk9NQVggPSAnZGVidWdfbm9tYXgnOwpwcml2YXRlIGNvbnN0IEZPUk1BVF9OT1JNQUxfTk9NQVggPSAnbm9ybWFsX25vbWF4JzsKCnByaXZhdGUgJGJhcldpZHRoID0gMjg7CnByaXZhdGUgJGJhckNoYXI7CnByaXZhdGUgJGVtcHR5QmFyQ2hhciA9ICctJzsKcHJpdmF0ZSAkcHJvZ3Jlc3NDaGFyID0gJz4nOwpwcml2YXRlICRmb3JtYXQ7CnByaXZhdGUgJGludGVybmFsRm9ybWF0Owpwcml2YXRlICRyZWRyYXdGcmVxID0gMTsKcHJpdmF0ZSAkd3JpdGVDb3VudDsKcHJpdmF0ZSAkbGFzdFdyaXRlVGltZTsKcHJpdmF0ZSAkbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzID0gMDsKcHJpdmF0ZSAkbWF4U2Vjb25kc0JldHdlZW5SZWRyYXdzID0gMTsKcHJpdmF0ZSAkb3V0cHV0Owpwcml2YXRlICRzdGVwID0gMDsKcHJpdmF0ZSAkbWF4Owpwcml2YXRlICRzdGFydFRpbWU7CnByaXZhdGUgJHN0ZXBXaWR0aDsKcHJpdmF0ZSAkcGVyY2VudCA9IDAuMDsKcHJpdmF0ZSAkbWVzc2FnZXMgPSBbXTsKcHJpdmF0ZSAkb3ZlcndyaXRlID0gdHJ1ZTsKcHJpdmF0ZSAkdGVybWluYWw7CnByaXZhdGUgJHByZXZpb3VzTWVzc2FnZTsKcHJpdmF0ZSAkY3Vyc29yOwoKcHJpdmF0ZSBzdGF0aWMgJGZvcm1hdHRlcnM7CnByaXZhdGUgc3RhdGljICRmb3JtYXRzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBpbnQgJG1heCA9IDAsIGZsb2F0ICRtaW5TZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAxIC8gMjUpCnsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgokdGhpcy0+b3V0cHV0ID0gJG91dHB1dDsKJHRoaXMtPnNldE1heFN0ZXBzKCRtYXgpOwokdGhpcy0+dGVybWluYWwgPSBuZXcgVGVybWluYWwoKTsKCmlmICgwIDwgJG1pblNlY29uZHNCZXR3ZWVuUmVkcmF3cykgewokdGhpcy0+cmVkcmF3RnJlcSA9IG51bGw7CiR0aGlzLT5taW5TZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAkbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzOwp9CgppZiAoISR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpIHsKCiR0aGlzLT5vdmVyd3JpdGUgPSBmYWxzZTsKCgokdGhpcy0+cmVkcmF3RnJlcSA9IG51bGw7Cn0KCiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7CiR0aGlzLT5jdXJzb3IgPSBuZXcgQ3Vyc29yKCRvdXRwdXQpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKHN0cmluZyAkbmFtZSwgY2FsbGFibGUgJGNhbGxhYmxlKTogdm9pZAp7CmlmICghc2VsZjo6JGZvcm1hdHRlcnMpIHsKc2VsZjo6JGZvcm1hdHRlcnMgPSBzZWxmOjppbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk7Cn0KCnNlbGY6OiRmb3JtYXR0ZXJzWyRuYW1lXSA9ICRjYWxsYWJsZTsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFBsYWNlaG9sZGVyRm9ybWF0dGVyRGVmaW5pdGlvbihzdHJpbmcgJG5hbWUpOiA/Y2FsbGFibGUKewppZiAoIXNlbGY6OiRmb3JtYXR0ZXJzKSB7CnNlbGY6OiRmb3JtYXR0ZXJzID0gc2VsZjo6aW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOwp9CgpyZXR1cm4gc2VsZjo6JGZvcm1hdHRlcnNbJG5hbWVdID8/IG51bGw7Cn0KCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRGb3JtYXREZWZpbml0aW9uKHN0cmluZyAkbmFtZSwgc3RyaW5nICRmb3JtYXQpOiB2b2lkCnsKaWYgKCFzZWxmOjokZm9ybWF0cykgewpzZWxmOjokZm9ybWF0cyA9IHNlbGY6OmluaXRGb3JtYXRzKCk7Cn0KCnNlbGY6OiRmb3JtYXRzWyRuYW1lXSA9ICRmb3JtYXQ7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGb3JtYXREZWZpbml0aW9uKHN0cmluZyAkbmFtZSk6ID9zdHJpbmcKewppZiAoIXNlbGY6OiRmb3JtYXRzKSB7CnNlbGY6OiRmb3JtYXRzID0gc2VsZjo6aW5pdEZvcm1hdHMoKTsKfQoKcmV0dXJuIHNlbGY6OiRmb3JtYXRzWyRuYW1lXSA/PyBudWxsOwp9CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE1lc3NhZ2Uoc3RyaW5nICRtZXNzYWdlLCBzdHJpbmcgJG5hbWUgPSAnbWVzc2FnZScpCnsKJHRoaXMtPm1lc3NhZ2VzWyRuYW1lXSA9ICRtZXNzYWdlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TWVzc2FnZShzdHJpbmcgJG5hbWUgPSAnbWVzc2FnZScpCnsKcmV0dXJuICR0aGlzLT5tZXNzYWdlc1skbmFtZV0gPz8gbnVsbDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0VGltZSgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPnN0YXJ0VGltZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE1heFN0ZXBzKCk6IGludAp7CnJldHVybiAkdGhpcy0+bWF4Owp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvZ3Jlc3MoKTogaW50CnsKcmV0dXJuICR0aGlzLT5zdGVwOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldFN0ZXBXaWR0aCgpOiBpbnQKewpyZXR1cm4gJHRoaXMtPnN0ZXBXaWR0aDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2dyZXNzUGVyY2VudCgpOiBmbG9hdAp7CnJldHVybiAkdGhpcy0+cGVyY2VudDsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJhck9mZnNldCgpOiBmbG9hdAp7CnJldHVybiBmbG9vcigkdGhpcy0+bWF4ID8gJHRoaXMtPnBlcmNlbnQgKiAkdGhpcy0+YmFyV2lkdGggOiAobnVsbCA9PT0gJHRoaXMtPnJlZHJhd0ZyZXEgPyAoaW50KSAobWluKDUsICR0aGlzLT5iYXJXaWR0aCAvIDE1KSAqICR0aGlzLT53cml0ZUNvdW50KSA6ICR0aGlzLT5zdGVwKSAlICR0aGlzLT5iYXJXaWR0aCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFc3RpbWF0ZWQoKTogZmxvYXQKewppZiAoISR0aGlzLT5zdGVwKSB7CnJldHVybiAwOwp9CgpyZXR1cm4gcm91bmQoKHRpbWUoKSAtICR0aGlzLT5zdGFydFRpbWUpIC8gJHRoaXMtPnN0ZXAgKiAkdGhpcy0+bWF4KTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFJlbWFpbmluZygpOiBmbG9hdAp7CmlmICghJHRoaXMtPnN0ZXApIHsKcmV0dXJuIDA7Cn0KCnJldHVybiByb3VuZCgodGltZSgpIC0gJHRoaXMtPnN0YXJ0VGltZSkgLyAkdGhpcy0+c3RlcCAqICgkdGhpcy0+bWF4IC0gJHRoaXMtPnN0ZXApKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEJhcldpZHRoKGludCAkc2l6ZSkKewokdGhpcy0+YmFyV2lkdGggPSBtYXgoMSwgJHNpemUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0QmFyV2lkdGgoKTogaW50CnsKcmV0dXJuICR0aGlzLT5iYXJXaWR0aDsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEJhckNoYXJhY3RlcihzdHJpbmcgJGNoYXIpCnsKJHRoaXMtPmJhckNoYXIgPSAkY2hhcjsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEJhckNoYXJhY3RlcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmJhckNoYXIgPz8gKCR0aGlzLT5tYXggPyAnPScgOiAkdGhpcy0+ZW1wdHlCYXJDaGFyKTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEVtcHR5QmFyQ2hhcmFjdGVyKHN0cmluZyAkY2hhcikKewokdGhpcy0+ZW1wdHlCYXJDaGFyID0gJGNoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRFbXB0eUJhckNoYXJhY3RlcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmVtcHR5QmFyQ2hhcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFByb2dyZXNzQ2hhcmFjdGVyKHN0cmluZyAkY2hhcikKewokdGhpcy0+cHJvZ3Jlc3NDaGFyID0gJGNoYXI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9ncmVzc0NoYXJhY3RlcigpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnByb2dyZXNzQ2hhcjsKfQoKcHVibGljIGZ1bmN0aW9uIHNldEZvcm1hdChzdHJpbmcgJGZvcm1hdCkKewokdGhpcy0+Zm9ybWF0ID0gbnVsbDsKJHRoaXMtPmludGVybmFsRm9ybWF0ID0gJGZvcm1hdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0UmVkcmF3RnJlcXVlbmN5KD9pbnQgJGZyZXEpCnsKJHRoaXMtPnJlZHJhd0ZyZXEgPSBudWxsICE9PSAkZnJlcSA/IG1heCgxLCAkZnJlcSkgOiBudWxsOwp9CgpwdWJsaWMgZnVuY3Rpb24gbWluU2Vjb25kc0JldHdlZW5SZWRyYXdzKGZsb2F0ICRzZWNvbmRzKTogdm9pZAp7CiR0aGlzLT5taW5TZWNvbmRzQmV0d2VlblJlZHJhd3MgPSAkc2Vjb25kczsKfQoKcHVibGljIGZ1bmN0aW9uIG1heFNlY29uZHNCZXR3ZWVuUmVkcmF3cyhmbG9hdCAkc2Vjb25kcyk6IHZvaWQKewokdGhpcy0+bWF4U2Vjb25kc0JldHdlZW5SZWRyYXdzID0gJHNlY29uZHM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGl0ZXJhdGUoaXRlcmFibGUgJGl0ZXJhYmxlLCA/aW50ICRtYXggPSBudWxsKTogaXRlcmFibGUKewokdGhpcy0+c3RhcnQoJG1heCA/PyAoaXNfY291bnRhYmxlKCRpdGVyYWJsZSkgPyBcY291bnQoJGl0ZXJhYmxlKSA6IDApKTsKCmZvcmVhY2ggKCRpdGVyYWJsZSBhcyAka2V5ID0+ICR2YWx1ZSkgewp5aWVsZCAka2V5ID0+ICR2YWx1ZTsKCiR0aGlzLT5hZHZhbmNlKCk7Cn0KCiR0aGlzLT5maW5pc2goKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnQoP2ludCAkbWF4ID0gbnVsbCkKewokdGhpcy0+c3RhcnRUaW1lID0gdGltZSgpOwokdGhpcy0+c3RlcCA9IDA7CiR0aGlzLT5wZXJjZW50ID0gMC4wOwoKaWYgKG51bGwgIT09ICRtYXgpIHsKJHRoaXMtPnNldE1heFN0ZXBzKCRtYXgpOwp9CgokdGhpcy0+ZGlzcGxheSgpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZHZhbmNlKGludCAkc3RlcCA9IDEpCnsKJHRoaXMtPnNldFByb2dyZXNzKCR0aGlzLT5zdGVwICsgJHN0ZXApOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3ZlcndyaXRlKGJvb2wgJG92ZXJ3cml0ZSkKewokdGhpcy0+b3ZlcndyaXRlID0gJG92ZXJ3cml0ZTsKfQoKcHVibGljIGZ1bmN0aW9uIHNldFByb2dyZXNzKGludCAkc3RlcCkKewppZiAoJHRoaXMtPm1heCAmJiAkc3RlcCA+ICR0aGlzLT5tYXgpIHsKJHRoaXMtPm1heCA9ICRzdGVwOwp9IGVsc2VpZiAoJHN0ZXAgPCAwKSB7CiRzdGVwID0gMDsKfQoKJHJlZHJhd0ZyZXEgPSAkdGhpcy0+cmVkcmF3RnJlcSA/PyAoKCR0aGlzLT5tYXggPzogMTApIC8gMTApOwokcHJldlBlcmlvZCA9IChpbnQpICgkdGhpcy0+c3RlcCAvICRyZWRyYXdGcmVxKTsKJGN1cnJQZXJpb2QgPSAoaW50KSAoJHN0ZXAgLyAkcmVkcmF3RnJlcSk7CiR0aGlzLT5zdGVwID0gJHN0ZXA7CiR0aGlzLT5wZXJjZW50ID0gJHRoaXMtPm1heCA/IChmbG9hdCkgJHRoaXMtPnN0ZXAgLyAkdGhpcy0+bWF4IDogMDsKJHRpbWVJbnRlcnZhbCA9IG1pY3JvdGltZSh0cnVlKSAtICR0aGlzLT5sYXN0V3JpdGVUaW1lOwoKCmlmICgkdGhpcy0+bWF4ID09PSAkc3RlcCkgewokdGhpcy0+ZGlzcGxheSgpOwoKcmV0dXJuOwp9CgoKaWYgKCR0aW1lSW50ZXJ2YWwgPCAkdGhpcy0+bWluU2Vjb25kc0JldHdlZW5SZWRyYXdzKSB7CnJldHVybjsKfQoKCmlmICgkcHJldlBlcmlvZCAhPT0gJGN1cnJQZXJpb2QgfHwgJHRpbWVJbnRlcnZhbCA+PSAkdGhpcy0+bWF4U2Vjb25kc0JldHdlZW5SZWRyYXdzKSB7CiR0aGlzLT5kaXNwbGF5KCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHNldE1heFN0ZXBzKGludCAkbWF4KQp7CiR0aGlzLT5mb3JtYXQgPSBudWxsOwokdGhpcy0+bWF4ID0gbWF4KDAsICRtYXgpOwokdGhpcy0+c3RlcFdpZHRoID0gJHRoaXMtPm1heCA/IEhlbHBlcjo6d2lkdGgoKHN0cmluZykgJHRoaXMtPm1heCkgOiA0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluaXNoKCk6IHZvaWQKewppZiAoISR0aGlzLT5tYXgpIHsKJHRoaXMtPm1heCA9ICR0aGlzLT5zdGVwOwp9CgppZiAoJHRoaXMtPnN0ZXAgPT09ICR0aGlzLT5tYXggJiYgISR0aGlzLT5vdmVyd3JpdGUpIHsKCnJldHVybjsKfQoKJHRoaXMtPnNldFByb2dyZXNzKCR0aGlzLT5tYXgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZGlzcGxheSgpOiB2b2lkCnsKaWYgKE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUID09PSAkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewpyZXR1cm47Cn0KCmlmIChudWxsID09PSAkdGhpcy0+Zm9ybWF0KSB7CiR0aGlzLT5zZXRSZWFsRm9ybWF0KCR0aGlzLT5pbnRlcm5hbEZvcm1hdCA/OiAkdGhpcy0+ZGV0ZXJtaW5lQmVzdEZvcm1hdCgpKTsKfQoKJHRoaXMtPm92ZXJ3cml0ZSgkdGhpcy0+YnVpbGRMaW5lKCkpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyKCk6IHZvaWQKewppZiAoISR0aGlzLT5vdmVyd3JpdGUpIHsKcmV0dXJuOwp9CgppZiAobnVsbCA9PT0gJHRoaXMtPmZvcm1hdCkgewokdGhpcy0+c2V0UmVhbEZvcm1hdCgkdGhpcy0+aW50ZXJuYWxGb3JtYXQgPzogJHRoaXMtPmRldGVybWluZUJlc3RGb3JtYXQoKSk7Cn0KCiR0aGlzLT5vdmVyd3JpdGUoJycpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIHNldFJlYWxGb3JtYXQoc3RyaW5nICRmb3JtYXQpCnsKCmlmICghJHRoaXMtPm1heCAmJiBudWxsICE9PSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQuJ19ub21heCcpKSB7CiR0aGlzLT5mb3JtYXQgPSBzZWxmOjpnZXRGb3JtYXREZWZpbml0aW9uKCRmb3JtYXQuJ19ub21heCcpOwp9IGVsc2VpZiAobnVsbCAhPT0gc2VsZjo6Z2V0Rm9ybWF0RGVmaW5pdGlvbigkZm9ybWF0KSkgewokdGhpcy0+Zm9ybWF0ID0gc2VsZjo6Z2V0Rm9ybWF0RGVmaW5pdGlvbigkZm9ybWF0KTsKfSBlbHNlIHsKJHRoaXMtPmZvcm1hdCA9ICRmb3JtYXQ7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdmVyd3JpdGUoc3RyaW5nICRtZXNzYWdlKTogdm9pZAp7CmlmICgkdGhpcy0+cHJldmlvdXNNZXNzYWdlID09PSAkbWVzc2FnZSkgewpyZXR1cm47Cn0KCiRvcmlnaW5hbE1lc3NhZ2UgPSAkbWVzc2FnZTsKCmlmICgkdGhpcy0+b3ZlcndyaXRlKSB7CmlmIChudWxsICE9PSAkdGhpcy0+cHJldmlvdXNNZXNzYWdlKSB7CmlmICgkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZVNlY3Rpb25PdXRwdXQpIHsKJG1lc3NhZ2VMaW5lcyA9IGV4cGxvZGUoIlxuIiwgJHRoaXMtPnByZXZpb3VzTWVzc2FnZSk7CiRsaW5lQ291bnQgPSBcY291bnQoJG1lc3NhZ2VMaW5lcyk7CmZvcmVhY2ggKCRtZXNzYWdlTGluZXMgYXMgJG1lc3NhZ2VMaW5lKSB7CiRtZXNzYWdlTGluZUxlbmd0aCA9IEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpLCAkbWVzc2FnZUxpbmUpKTsKaWYgKCRtZXNzYWdlTGluZUxlbmd0aCA+ICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSkgewokbGluZUNvdW50ICs9IGZsb29yKCRtZXNzYWdlTGluZUxlbmd0aCAvICR0aGlzLT50ZXJtaW5hbC0+Z2V0V2lkdGgoKSk7Cn0KfQokdGhpcy0+b3V0cHV0LT5jbGVhcigkbGluZUNvdW50KTsKfSBlbHNlIHsKJGxpbmVDb3VudCA9IHN1YnN0cl9jb3VudCgkdGhpcy0+cHJldmlvdXNNZXNzYWdlLCAiXG4iKTsKZm9yICgkaSA9IDA7ICRpIDwgJGxpbmVDb3VudDsgKyskaSkgewokdGhpcy0+Y3Vyc29yLT5tb3ZlVG9Db2x1bW4oMSk7CiR0aGlzLT5jdXJzb3ItPmNsZWFyTGluZSgpOwokdGhpcy0+Y3Vyc29yLT5tb3ZlVXAoKTsKfQoKJHRoaXMtPmN1cnNvci0+bW92ZVRvQ29sdW1uKDEpOwokdGhpcy0+Y3Vyc29yLT5jbGVhckxpbmUoKTsKfQp9Cn0gZWxzZWlmICgkdGhpcy0+c3RlcCA+IDApIHsKJG1lc3NhZ2UgPSBcUEhQX0VPTC4kbWVzc2FnZTsKfQoKJHRoaXMtPnByZXZpb3VzTWVzc2FnZSA9ICRvcmlnaW5hbE1lc3NhZ2U7CiR0aGlzLT5sYXN0V3JpdGVUaW1lID0gbWljcm90aW1lKHRydWUpOwoKJHRoaXMtPm91dHB1dC0+d3JpdGUoJG1lc3NhZ2UpOworKyR0aGlzLT53cml0ZUNvdW50Owp9Cgpwcml2YXRlIGZ1bmN0aW9uIGRldGVybWluZUJlc3RGb3JtYXQoKTogc3RyaW5nCnsKc3dpdGNoICgkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewoKY2FzZSBPdXRwdXRJbnRlcmZhY2U6OlZFUkJPU0lUWV9WRVJCT1NFOgpyZXR1cm4gJHRoaXMtPm1heCA/IHNlbGY6OkZPUk1BVF9WRVJCT1NFIDogc2VsZjo6Rk9STUFUX1ZFUkJPU0VfTk9NQVg7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFOgpyZXR1cm4gJHRoaXMtPm1heCA/IHNlbGY6OkZPUk1BVF9WRVJZX1ZFUkJPU0UgOiBzZWxmOjpGT1JNQVRfVkVSWV9WRVJCT1NFX05PTUFYOwpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX0RFQlVHOgpyZXR1cm4gJHRoaXMtPm1heCA/IHNlbGY6OkZPUk1BVF9ERUJVRyA6IHNlbGY6OkZPUk1BVF9ERUJVR19OT01BWDsKZGVmYXVsdDoKcmV0dXJuICR0aGlzLT5tYXggPyBzZWxmOjpGT1JNQVRfTk9STUFMIDogc2VsZjo6Rk9STUFUX05PUk1BTF9OT01BWDsKfQp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpbml0UGxhY2Vob2xkZXJGb3JtYXR0ZXJzKCk6IGFycmF5CnsKcmV0dXJuIFsKJ2JhcicgPT4gZnVuY3Rpb24gKHNlbGYgJGJhciwgT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQpIHsKJGNvbXBsZXRlQmFycyA9ICRiYXItPmdldEJhck9mZnNldCgpOwokZGlzcGxheSA9IHN0cl9yZXBlYXQoJGJhci0+Z2V0QmFyQ2hhcmFjdGVyKCksICRjb21wbGV0ZUJhcnMpOwppZiAoJGNvbXBsZXRlQmFycyA8ICRiYXItPmdldEJhcldpZHRoKCkpIHsKJGVtcHR5QmFycyA9ICRiYXItPmdldEJhcldpZHRoKCkgLSAkY29tcGxldGVCYXJzIC0gSGVscGVyOjpsZW5ndGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCRvdXRwdXQtPmdldEZvcm1hdHRlcigpLCAkYmFyLT5nZXRQcm9ncmVzc0NoYXJhY3RlcigpKSk7CiRkaXNwbGF5IC49ICRiYXItPmdldFByb2dyZXNzQ2hhcmFjdGVyKCkuc3RyX3JlcGVhdCgkYmFyLT5nZXRFbXB0eUJhckNoYXJhY3RlcigpLCAkZW1wdHlCYXJzKTsKfQoKcmV0dXJuICRkaXNwbGF5Owp9LAonZWxhcHNlZCcgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gSGVscGVyOjpmb3JtYXRUaW1lKHRpbWUoKSAtICRiYXItPmdldFN0YXJ0VGltZSgpKTsKfSwKJ3JlbWFpbmluZycgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewppZiAoISRiYXItPmdldE1heFN0ZXBzKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdVbmFibGUgdG8gZGlzcGxheSB0aGUgcmVtYWluaW5nIHRpbWUgaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0ZXBzIGlzIG5vdCBzZXQuJyk7Cn0KCnJldHVybiBIZWxwZXI6OmZvcm1hdFRpbWUoJGJhci0+Z2V0UmVtYWluaW5nKCkpOwp9LAonZXN0aW1hdGVkJyA9PiBmdW5jdGlvbiAoc2VsZiAkYmFyKSB7CmlmICghJGJhci0+Z2V0TWF4U3RlcHMoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1VuYWJsZSB0byBkaXNwbGF5IHRoZSBlc3RpbWF0ZWQgdGltZSBpZiB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RlcHMgaXMgbm90IHNldC4nKTsKfQoKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0VGltZSgkYmFyLT5nZXRFc3RpbWF0ZWQoKSk7Cn0sCidtZW1vcnknID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0TWVtb3J5KG1lbW9yeV9nZXRfdXNhZ2UodHJ1ZSkpOwp9LAonY3VycmVudCcgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gc3RyX3BhZCgkYmFyLT5nZXRQcm9ncmVzcygpLCAkYmFyLT5nZXRTdGVwV2lkdGgoKSwgJyAnLCBcU1RSX1BBRF9MRUZUKTsKfSwKJ21heCcgPT4gZnVuY3Rpb24gKHNlbGYgJGJhcikgewpyZXR1cm4gJGJhci0+Z2V0TWF4U3RlcHMoKTsKfSwKJ3BlcmNlbnQnID0+IGZ1bmN0aW9uIChzZWxmICRiYXIpIHsKcmV0dXJuIGZsb29yKCRiYXItPmdldFByb2dyZXNzUGVyY2VudCgpICogMTAwKTsKfSwKXTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdEZvcm1hdHMoKTogYXJyYXkKewpyZXR1cm4gWwpzZWxmOjpGT1JNQVRfTk9STUFMID0+ICcgJWN1cnJlbnQlLyVtYXglIFslYmFyJV0gJXBlcmNlbnQ6M3MlJScsCnNlbGY6OkZPUk1BVF9OT1JNQUxfTk9NQVggPT4gJyAlY3VycmVudCUgWyViYXIlXScsCgpzZWxmOjpGT1JNQVRfVkVSQk9TRSA9PiAnICVjdXJyZW50JS8lbWF4JSBbJWJhciVdICVwZXJjZW50OjNzJSUgJWVsYXBzZWQ6NnMlJywKc2VsZjo6Rk9STUFUX1ZFUkJPU0VfTk9NQVggPT4gJyAlY3VycmVudCUgWyViYXIlXSAlZWxhcHNlZDo2cyUnLAoKc2VsZjo6Rk9STUFUX1ZFUllfVkVSQk9TRSA9PiAnICVjdXJyZW50JS8lbWF4JSBbJWJhciVdICVwZXJjZW50OjNzJSUgJWVsYXBzZWQ6NnMlLyVlc3RpbWF0ZWQ6LTZzJScsCnNlbGY6OkZPUk1BVF9WRVJZX1ZFUkJPU0VfTk9NQVggPT4gJyAlY3VycmVudCUgWyViYXIlXSAlZWxhcHNlZDo2cyUnLAoKc2VsZjo6Rk9STUFUX0RFQlVHID0+ICcgJWN1cnJlbnQlLyVtYXglIFslYmFyJV0gJXBlcmNlbnQ6M3MlJSAlZWxhcHNlZDo2cyUvJWVzdGltYXRlZDotNnMlICVtZW1vcnk6NnMlJywKc2VsZjo6Rk9STUFUX0RFQlVHX05PTUFYID0+ICcgJWN1cnJlbnQlIFslYmFyJV0gJWVsYXBzZWQ6NnMlICVtZW1vcnk6NnMlJywKXTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBidWlsZExpbmUoKTogc3RyaW5nCnsKJHJlZ2V4ID0gInslKFthLXpcLV9dKykoPzpcOihbXiVdKykpPyV9aSI7CiRjYWxsYmFjayA9IGZ1bmN0aW9uICgkbWF0Y2hlcykgewppZiAoJGZvcm1hdHRlciA9ICR0aGlzOjpnZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oJG1hdGNoZXNbMV0pKSB7CiR0ZXh0ID0gJGZvcm1hdHRlcigkdGhpcywgJHRoaXMtPm91dHB1dCk7Cn0gZWxzZWlmIChpc3NldCgkdGhpcy0+bWVzc2FnZXNbJG1hdGNoZXNbMV1dKSkgewokdGV4dCA9ICR0aGlzLT5tZXNzYWdlc1skbWF0Y2hlc1sxXV07Cn0gZWxzZSB7CnJldHVybiAkbWF0Y2hlc1swXTsKfQoKaWYgKGlzc2V0KCRtYXRjaGVzWzJdKSkgewokdGV4dCA9IHNwcmludGYoJyUnLiRtYXRjaGVzWzJdLCAkdGV4dCk7Cn0KCnJldHVybiAkdGV4dDsKfTsKJGxpbmUgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHJlZ2V4LCAkY2FsbGJhY2ssICR0aGlzLT5mb3JtYXQpOwoKCiRsaW5lc0xlbmd0aCA9IGFycmF5X21hcChmdW5jdGlvbiAoJHN1YkxpbmUpIHsKcmV0dXJuIEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpLCBydHJpbSgkc3ViTGluZSwgIlxyIikpKTsKfSwgZXhwbG9kZSgiXG4iLCAkbGluZSkpOwoKJGxpbmVzV2lkdGggPSBtYXgoJGxpbmVzTGVuZ3RoKTsKCiR0ZXJtaW5hbFdpZHRoID0gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpOwppZiAoJGxpbmVzV2lkdGggPD0gJHRlcm1pbmFsV2lkdGgpIHsKcmV0dXJuICRsaW5lOwp9CgokdGhpcy0+c2V0QmFyV2lkdGgoJHRoaXMtPmJhcldpZHRoIC0gJGxpbmVzV2lkdGggKyAkdGVybWluYWxXaWR0aCk7CgpyZXR1cm4gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCRyZWdleCwgJGNhbGxiYWNrLCAkdGhpcy0+Zm9ybWF0KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBQcm9ncmVzc0luZGljYXRvcgp7CnByaXZhdGUgY29uc3QgRk9STUFUUyA9IFsKJ25vcm1hbCcgPT4gJyAlaW5kaWNhdG9yJSAlbWVzc2FnZSUnLAonbm9ybWFsX25vX2Fuc2knID0+ICcgJW1lc3NhZ2UlJywKCid2ZXJib3NlJyA9PiAnICVpbmRpY2F0b3IlICVtZXNzYWdlJSAoJWVsYXBzZWQ6NnMlKScsCid2ZXJib3NlX25vX2Fuc2knID0+ICcgJW1lc3NhZ2UlICglZWxhcHNlZDo2cyUpJywKCid2ZXJ5X3ZlcmJvc2UnID0+ICcgJWluZGljYXRvciUgJW1lc3NhZ2UlICglZWxhcHNlZDo2cyUsICVtZW1vcnk6NnMlKScsCid2ZXJ5X3ZlcmJvc2Vfbm9fYW5zaScgPT4gJyAlbWVzc2FnZSUgKCVlbGFwc2VkOjZzJSwgJW1lbW9yeTo2cyUpJywKXTsKCnByaXZhdGUgJG91dHB1dDsKcHJpdmF0ZSAkc3RhcnRUaW1lOwpwcml2YXRlICRmb3JtYXQ7CnByaXZhdGUgJG1lc3NhZ2U7CnByaXZhdGUgJGluZGljYXRvclZhbHVlczsKcHJpdmF0ZSAkaW5kaWNhdG9yQ3VycmVudDsKcHJpdmF0ZSAkaW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWw7CnByaXZhdGUgJGluZGljYXRvclVwZGF0ZVRpbWU7CnByaXZhdGUgJHN0YXJ0ZWQgPSBmYWxzZTsKCgoKCnByaXZhdGUgc3RhdGljICRmb3JtYXR0ZXJzOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgP3N0cmluZyAkZm9ybWF0ID0gbnVsbCwgaW50ICRpbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbCA9IDEwMCwgP2FycmF5ICRpbmRpY2F0b3JWYWx1ZXMgPSBudWxsKQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0OwoKaWYgKG51bGwgPT09ICRmb3JtYXQpIHsKJGZvcm1hdCA9ICR0aGlzLT5kZXRlcm1pbmVCZXN0Rm9ybWF0KCk7Cn0KCmlmIChudWxsID09PSAkaW5kaWNhdG9yVmFsdWVzKSB7CiRpbmRpY2F0b3JWYWx1ZXMgPSBbJy0nLCAnXFwnLCAnfCcsICcvJ107Cn0KCiRpbmRpY2F0b3JWYWx1ZXMgPSBhcnJheV92YWx1ZXMoJGluZGljYXRvclZhbHVlcyk7CgppZiAoMiA+IFxjb3VudCgkaW5kaWNhdG9yVmFsdWVzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdNdXN0IGhhdmUgYXQgbGVhc3QgMiBpbmRpY2F0b3IgdmFsdWUgY2hhcmFjdGVycy4nKTsKfQoKJHRoaXMtPmZvcm1hdCA9IHNlbGY6OmdldEZvcm1hdERlZmluaXRpb24oJGZvcm1hdCk7CiR0aGlzLT5pbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbCA9ICRpbmRpY2F0b3JDaGFuZ2VJbnRlcnZhbDsKJHRoaXMtPmluZGljYXRvclZhbHVlcyA9ICRpbmRpY2F0b3JWYWx1ZXM7CiR0aGlzLT5zdGFydFRpbWUgPSB0aW1lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNZXNzYWdlKD9zdHJpbmcgJG1lc3NhZ2UpCnsKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzdGFydChzdHJpbmcgJG1lc3NhZ2UpCnsKaWYgKCR0aGlzLT5zdGFydGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUHJvZ3Jlc3MgaW5kaWNhdG9yIGFscmVhZHkgc3RhcnRlZC4nKTsKfQoKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKJHRoaXMtPnN0YXJ0ZWQgPSB0cnVlOwokdGhpcy0+c3RhcnRUaW1lID0gdGltZSgpOwokdGhpcy0+aW5kaWNhdG9yVXBkYXRlVGltZSA9ICR0aGlzLT5nZXRDdXJyZW50VGltZUluTWlsbGlzZWNvbmRzKCkgKyAkdGhpcy0+aW5kaWNhdG9yQ2hhbmdlSW50ZXJ2YWw7CiR0aGlzLT5pbmRpY2F0b3JDdXJyZW50ID0gMDsKCiR0aGlzLT5kaXNwbGF5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZHZhbmNlKCkKewppZiAoISR0aGlzLT5zdGFydGVkKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignUHJvZ3Jlc3MgaW5kaWNhdG9yIGhhcyBub3QgeWV0IGJlZW4gc3RhcnRlZC4nKTsKfQoKaWYgKCEkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKSB7CnJldHVybjsKfQoKJGN1cnJlbnRUaW1lID0gJHRoaXMtPmdldEN1cnJlbnRUaW1lSW5NaWxsaXNlY29uZHMoKTsKCmlmICgkY3VycmVudFRpbWUgPCAkdGhpcy0+aW5kaWNhdG9yVXBkYXRlVGltZSkgewpyZXR1cm47Cn0KCiR0aGlzLT5pbmRpY2F0b3JVcGRhdGVUaW1lID0gJGN1cnJlbnRUaW1lICsgJHRoaXMtPmluZGljYXRvckNoYW5nZUludGVydmFsOworKyR0aGlzLT5pbmRpY2F0b3JDdXJyZW50OwoKJHRoaXMtPmRpc3BsYXkoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGZpbmlzaChzdHJpbmcgJG1lc3NhZ2UpCnsKaWYgKCEkdGhpcy0+c3RhcnRlZCkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ1Byb2dyZXNzIGluZGljYXRvciBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQuJyk7Cn0KCiR0aGlzLT5tZXNzYWdlID0gJG1lc3NhZ2U7CiR0aGlzLT5kaXNwbGF5KCk7CiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oJycpOwokdGhpcy0+c3RhcnRlZCA9IGZhbHNlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0Rm9ybWF0RGVmaW5pdGlvbihzdHJpbmcgJG5hbWUpCnsKcmV0dXJuIHNlbGY6OkZPUk1BVFNbJG5hbWVdID8/IG51bGw7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBzZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oc3RyaW5nICRuYW1lLCBjYWxsYWJsZSAkY2FsbGFibGUpCnsKaWYgKCFzZWxmOjokZm9ybWF0dGVycykgewpzZWxmOjokZm9ybWF0dGVycyA9IHNlbGY6OmluaXRQbGFjZWhvbGRlckZvcm1hdHRlcnMoKTsKfQoKc2VsZjo6JGZvcm1hdHRlcnNbJG5hbWVdID0gJGNhbGxhYmxlOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0UGxhY2Vob2xkZXJGb3JtYXR0ZXJEZWZpbml0aW9uKHN0cmluZyAkbmFtZSkKewppZiAoIXNlbGY6OiRmb3JtYXR0ZXJzKSB7CnNlbGY6OiRmb3JtYXR0ZXJzID0gc2VsZjo6aW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOwp9CgpyZXR1cm4gc2VsZjo6JGZvcm1hdHRlcnNbJG5hbWVdID8/IG51bGw7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGlzcGxheSgpCnsKaWYgKE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1FVSUVUID09PSAkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKSkgewpyZXR1cm47Cn0KCiR0aGlzLT5vdmVyd3JpdGUocHJlZ19yZXBsYWNlX2NhbGxiYWNrKCJ7JShbYS16XC1fXSspKD86XDooW14lXSspKT8lfWkiLCBmdW5jdGlvbiAoJG1hdGNoZXMpIHsKaWYgKCRmb3JtYXR0ZXIgPSBzZWxmOjpnZXRQbGFjZWhvbGRlckZvcm1hdHRlckRlZmluaXRpb24oJG1hdGNoZXNbMV0pKSB7CnJldHVybiAkZm9ybWF0dGVyKCR0aGlzKTsKfQoKcmV0dXJuICRtYXRjaGVzWzBdOwp9LCAkdGhpcy0+Zm9ybWF0ID8/ICcnKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZGV0ZXJtaW5lQmVzdEZvcm1hdCgpOiBzdHJpbmcKewpzd2l0Y2ggKCR0aGlzLT5vdXRwdXQtPmdldFZlcmJvc2l0eSgpKSB7CgpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX1ZFUkJPU0U6CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpID8gJ3ZlcmJvc2UnIDogJ3ZlcmJvc2Vfbm9fYW5zaSc7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFOgpjYXNlIE91dHB1dEludGVyZmFjZTo6VkVSQk9TSVRZX0RFQlVHOgpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKSA/ICd2ZXJ5X3ZlcmJvc2UnIDogJ3ZlcnlfdmVyYm9zZV9ub19hbnNpJzsKZGVmYXVsdDoKcmV0dXJuICR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkgPyAnbm9ybWFsJyA6ICdub3JtYWxfbm9fYW5zaSc7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBvdmVyd3JpdGUoc3RyaW5nICRtZXNzYWdlKQp7CmlmICgkdGhpcy0+b3V0cHV0LT5pc0RlY29yYXRlZCgpKSB7CiR0aGlzLT5vdXRwdXQtPndyaXRlKCJceDBEXHgxQlsySyIpOwokdGhpcy0+b3V0cHV0LT53cml0ZSgkbWVzc2FnZSk7Cn0gZWxzZSB7CiR0aGlzLT5vdXRwdXQtPndyaXRlbG4oJG1lc3NhZ2UpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q3VycmVudFRpbWVJbk1pbGxpc2Vjb25kcygpOiBmbG9hdAp7CnJldHVybiByb3VuZChtaWNyb3RpbWUodHJ1ZSkgKiAxMDAwKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdFBsYWNlaG9sZGVyRm9ybWF0dGVycygpOiBhcnJheQp7CnJldHVybiBbCidpbmRpY2F0b3InID0+IGZ1bmN0aW9uIChzZWxmICRpbmRpY2F0b3IpIHsKcmV0dXJuICRpbmRpY2F0b3ItPmluZGljYXRvclZhbHVlc1skaW5kaWNhdG9yLT5pbmRpY2F0b3JDdXJyZW50ICUgXGNvdW50KCRpbmRpY2F0b3ItPmluZGljYXRvclZhbHVlcyldOwp9LAonbWVzc2FnZScgPT4gZnVuY3Rpb24gKHNlbGYgJGluZGljYXRvcikgewpyZXR1cm4gJGluZGljYXRvci0+bWVzc2FnZTsKfSwKJ2VsYXBzZWQnID0+IGZ1bmN0aW9uIChzZWxmICRpbmRpY2F0b3IpIHsKcmV0dXJuIEhlbHBlcjo6Zm9ybWF0VGltZSh0aW1lKCkgLSAkaW5kaWNhdG9yLT5zdGFydFRpbWUpOwp9LAonbWVtb3J5JyA9PiBmdW5jdGlvbiAoKSB7CnJldHVybiBIZWxwZXI6OmZvcm1hdE1lbW9yeShtZW1vcnlfZ2V0X3VzYWdlKHRydWUpKTsKfSwKXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDdXJzb3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxNaXNzaW5nSW5wdXRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVyU3R5bGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0XElucHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxTdHJlYW1hYmxlSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZVNlY3Rpb25PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENob2ljZVF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVybWluYWw7Cgp1c2UgZnVuY3Rpb24gU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXHM7CgoKCgoKCmNsYXNzIFF1ZXN0aW9uSGVscGVyIGV4dGVuZHMgSGVscGVyCnsKCgoKcHJpdmF0ZSAkaW5wdXRTdHJlYW07Cgpwcml2YXRlIHN0YXRpYyAkc3R0eSA9IHRydWU7CnByaXZhdGUgc3RhdGljICRzdGRpbklzSW50ZXJhY3RpdmU7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzayhJbnB1dEludGVyZmFjZSAkaW5wdXQsIE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKaWYgKCRvdXRwdXQgaW5zdGFuY2VvZiBDb25zb2xlT3V0cHV0SW50ZXJmYWNlKSB7CiRvdXRwdXQgPSAkb3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9CgppZiAoISRpbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CnJldHVybiAkdGhpcy0+Z2V0RGVmYXVsdEFuc3dlcigkcXVlc3Rpb24pOwp9CgppZiAoJGlucHV0IGluc3RhbmNlb2YgU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlICYmICRzdHJlYW0gPSAkaW5wdXQtPmdldFN0cmVhbSgpKSB7CiR0aGlzLT5pbnB1dFN0cmVhbSA9ICRzdHJlYW07Cn0KCnRyeSB7CmlmICghJHF1ZXN0aW9uLT5nZXRWYWxpZGF0b3IoKSkgewpyZXR1cm4gJHRoaXMtPmRvQXNrKCRvdXRwdXQsICRxdWVzdGlvbik7Cn0KCiRpbnRlcnZpZXdlciA9IGZ1bmN0aW9uICgpIHVzZSAoJG91dHB1dCwgJHF1ZXN0aW9uKSB7CnJldHVybiAkdGhpcy0+ZG9Bc2soJG91dHB1dCwgJHF1ZXN0aW9uKTsKfTsKCnJldHVybiAkdGhpcy0+dmFsaWRhdGVBdHRlbXB0cygkaW50ZXJ2aWV3ZXIsICRvdXRwdXQsICRxdWVzdGlvbik7Cn0gY2F0Y2ggKE1pc3NpbmdJbnB1dEV4Y2VwdGlvbiAkZXhjZXB0aW9uKSB7CiRpbnB1dC0+c2V0SW50ZXJhY3RpdmUoZmFsc2UpOwoKaWYgKG51bGwgPT09ICRmYWxsYmFja091dHB1dCA9ICR0aGlzLT5nZXREZWZhdWx0QW5zd2VyKCRxdWVzdGlvbikpIHsKdGhyb3cgJGV4Y2VwdGlvbjsKfQoKcmV0dXJuICRmYWxsYmFja091dHB1dDsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICdxdWVzdGlvbic7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZGlzYWJsZVN0dHkoKQp7CnNlbGY6OiRzdHR5ID0gZmFsc2U7Cn0KCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGRvQXNrKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCBRdWVzdGlvbiAkcXVlc3Rpb24pCnsKJHRoaXMtPndyaXRlUHJvbXB0KCRvdXRwdXQsICRxdWVzdGlvbik7CgokaW5wdXRTdHJlYW0gPSAkdGhpcy0+aW5wdXRTdHJlYW0gPzogXFNURElOOwokYXV0b2NvbXBsZXRlID0gJHF1ZXN0aW9uLT5nZXRBdXRvY29tcGxldGVyQ2FsbGJhY2soKTsKCmlmIChudWxsID09PSAkYXV0b2NvbXBsZXRlIHx8ICFzZWxmOjokc3R0eSB8fCAhVGVybWluYWw6Omhhc1N0dHlBdmFpbGFibGUoKSkgewokcmV0ID0gZmFsc2U7CmlmICgkcXVlc3Rpb24tPmlzSGlkZGVuKCkpIHsKdHJ5IHsKJGhpZGRlblJlc3BvbnNlID0gJHRoaXMtPmdldEhpZGRlblJlc3BvbnNlKCRvdXRwdXQsICRpbnB1dFN0cmVhbSwgJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpKTsKJHJldCA9ICRxdWVzdGlvbi0+aXNUcmltbWFibGUoKSA/IHRyaW0oJGhpZGRlblJlc3BvbnNlKSA6ICRoaWRkZW5SZXNwb25zZTsKfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiAkZSkgewppZiAoISRxdWVzdGlvbi0+aXNIaWRkZW5GYWxsYmFjaygpKSB7CnRocm93ICRlOwp9Cn0KfQoKaWYgKGZhbHNlID09PSAkcmV0KSB7CiRpc0Jsb2NrZWQgPSBzdHJlYW1fZ2V0X21ldGFfZGF0YSgkaW5wdXRTdHJlYW0pWydibG9ja2VkJ10gPz8gdHJ1ZTsKCmlmICghJGlzQmxvY2tlZCkgewpzdHJlYW1fc2V0X2Jsb2NraW5nKCRpbnB1dFN0cmVhbSwgdHJ1ZSk7Cn0KCiRyZXQgPSAkdGhpcy0+cmVhZElucHV0KCRpbnB1dFN0cmVhbSwgJHF1ZXN0aW9uKTsKCmlmICghJGlzQmxvY2tlZCkgewpzdHJlYW1fc2V0X2Jsb2NraW5nKCRpbnB1dFN0cmVhbSwgZmFsc2UpOwp9CgppZiAoZmFsc2UgPT09ICRyZXQpIHsKdGhyb3cgbmV3IE1pc3NpbmdJbnB1dEV4Y2VwdGlvbignQWJvcnRlZC4nKTsKfQppZiAoJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpKSB7CiRyZXQgPSB0cmltKCRyZXQpOwp9Cn0KfSBlbHNlIHsKJGF1dG9jb21wbGV0ZSA9ICR0aGlzLT5hdXRvY29tcGxldGUoJG91dHB1dCwgJHF1ZXN0aW9uLCAkaW5wdXRTdHJlYW0sICRhdXRvY29tcGxldGUpOwokcmV0ID0gJHF1ZXN0aW9uLT5pc1RyaW1tYWJsZSgpID8gdHJpbSgkYXV0b2NvbXBsZXRlKSA6ICRhdXRvY29tcGxldGU7Cn0KCmlmICgkb3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZVNlY3Rpb25PdXRwdXQpIHsKJG91dHB1dC0+YWRkQ29udGVudCgkcmV0KTsKfQoKJHJldCA9IFxzdHJsZW4oJHJldCkgPiAwID8gJHJldCA6ICRxdWVzdGlvbi0+Z2V0RGVmYXVsdCgpOwoKaWYgKCRub3JtYWxpemVyID0gJHF1ZXN0aW9uLT5nZXROb3JtYWxpemVyKCkpIHsKcmV0dXJuICRub3JtYWxpemVyKCRyZXQpOwp9CgpyZXR1cm4gJHJldDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBnZXREZWZhdWx0QW5zd2VyKFF1ZXN0aW9uICRxdWVzdGlvbikKewokZGVmYXVsdCA9ICRxdWVzdGlvbi0+Z2V0RGVmYXVsdCgpOwoKaWYgKG51bGwgPT09ICRkZWZhdWx0KSB7CnJldHVybiAkZGVmYXVsdDsKfQoKaWYgKCR2YWxpZGF0b3IgPSAkcXVlc3Rpb24tPmdldFZhbGlkYXRvcigpKSB7CnJldHVybiBcY2FsbF91c2VyX2Z1bmMoJHF1ZXN0aW9uLT5nZXRWYWxpZGF0b3IoKSwgJGRlZmF1bHQpOwp9IGVsc2VpZiAoJHF1ZXN0aW9uIGluc3RhbmNlb2YgQ2hvaWNlUXVlc3Rpb24pIHsKJGNob2ljZXMgPSAkcXVlc3Rpb24tPmdldENob2ljZXMoKTsKCmlmICghJHF1ZXN0aW9uLT5pc011bHRpc2VsZWN0KCkpIHsKcmV0dXJuICRjaG9pY2VzWyRkZWZhdWx0XSA/PyAkZGVmYXVsdDsKfQoKJGRlZmF1bHQgPSBleHBsb2RlKCcsJywgJGRlZmF1bHQpOwpmb3JlYWNoICgkZGVmYXVsdCBhcyAkayA9PiAkdikgewokdiA9ICRxdWVzdGlvbi0+aXNUcmltbWFibGUoKSA/IHRyaW0oJHYpIDogJHY7CiRkZWZhdWx0WyRrXSA9ICRjaG9pY2VzWyR2XSA/PyAkdjsKfQp9CgpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB3cml0ZVByb21wdChPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CiRtZXNzYWdlID0gJHF1ZXN0aW9uLT5nZXRRdWVzdGlvbigpOwoKaWYgKCRxdWVzdGlvbiBpbnN0YW5jZW9mIENob2ljZVF1ZXN0aW9uKSB7CiRvdXRwdXQtPndyaXRlbG4oYXJyYXlfbWVyZ2UoWwokcXVlc3Rpb24tPmdldFF1ZXN0aW9uKCksCl0sICR0aGlzLT5mb3JtYXRDaG9pY2VRdWVzdGlvbkNob2ljZXMoJHF1ZXN0aW9uLCAnaW5mbycpKSk7CgokbWVzc2FnZSA9ICRxdWVzdGlvbi0+Z2V0UHJvbXB0KCk7Cn0KCiRvdXRwdXQtPndyaXRlKCRtZXNzYWdlKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGZvcm1hdENob2ljZVF1ZXN0aW9uQ2hvaWNlcyhDaG9pY2VRdWVzdGlvbiAkcXVlc3Rpb24sIHN0cmluZyAkdGFnKQp7CiRtZXNzYWdlcyA9IFtdOwoKJG1heFdpZHRoID0gbWF4KGFycmF5X21hcChbX19DTEFTU19fLCAnd2lkdGgnXSwgYXJyYXlfa2V5cygkY2hvaWNlcyA9ICRxdWVzdGlvbi0+Z2V0Q2hvaWNlcygpKSkpOwoKZm9yZWFjaCAoJGNob2ljZXMgYXMgJGtleSA9PiAkdmFsdWUpIHsKJHBhZGRpbmcgPSBzdHJfcmVwZWF0KCcgJywgJG1heFdpZHRoIC0gc2VsZjo6d2lkdGgoJGtleSkpOwoKJG1lc3NhZ2VzW10gPSBzcHJpbnRmKCIgIFs8JHRhZz4lcyRwYWRkaW5nPC8kdGFnPl0gJXMiLCAka2V5LCAkdmFsdWUpOwp9CgpyZXR1cm4gJG1lc3NhZ2VzOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGVFcnJvcihPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgXEV4Y2VwdGlvbiAkZXJyb3IpCnsKaWYgKG51bGwgIT09ICR0aGlzLT5nZXRIZWxwZXJTZXQoKSAmJiAkdGhpcy0+Z2V0SGVscGVyU2V0KCktPmhhcygnZm9ybWF0dGVyJykpIHsKJG1lc3NhZ2UgPSAkdGhpcy0+Z2V0SGVscGVyU2V0KCktPmdldCgnZm9ybWF0dGVyJyktPmZvcm1hdEJsb2NrKCRlcnJvci0+Z2V0TWVzc2FnZSgpLCAnZXJyb3InKTsKfSBlbHNlIHsKJG1lc3NhZ2UgPSAnPGVycm9yPicuJGVycm9yLT5nZXRNZXNzYWdlKCkuJzwvZXJyb3I+JzsKfQoKJG91dHB1dC0+d3JpdGVsbigkbWVzc2FnZSk7Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhdXRvY29tcGxldGUoT3V0cHV0SW50ZXJmYWNlICRvdXRwdXQsIFF1ZXN0aW9uICRxdWVzdGlvbiwgJGlucHV0U3RyZWFtLCBjYWxsYWJsZSAkYXV0b2NvbXBsZXRlKTogc3RyaW5nCnsKJGN1cnNvciA9IG5ldyBDdXJzb3IoJG91dHB1dCwgJGlucHV0U3RyZWFtKTsKCiRmdWxsQ2hvaWNlID0gJyc7CiRyZXQgPSAnJzsKCiRpID0gMDsKJG9mcyA9IC0xOwokbWF0Y2hlcyA9ICRhdXRvY29tcGxldGUoJHJldCk7CiRudW1NYXRjaGVzID0gXGNvdW50KCRtYXRjaGVzKTsKCiRzdHR5TW9kZSA9IHNoZWxsX2V4ZWMoJ3N0dHkgLWcnKTsKJGlzU3RkaW4gPSAncGhwOi8vc3RkaW4nID09PSAoc3RyZWFtX2dldF9tZXRhX2RhdGEoJGlucHV0U3RyZWFtKVsndXJpJ10gPz8gbnVsbCk7CiRyID0gWyRpbnB1dFN0cmVhbV07CiR3ID0gW107CgoKc2hlbGxfZXhlYygnc3R0eSAtaWNhbm9uIC1lY2hvJyk7CgoKJG91dHB1dC0+Z2V0Rm9ybWF0dGVyKCktPnNldFN0eWxlKCdobCcsIG5ldyBPdXRwdXRGb3JtYXR0ZXJTdHlsZSgnYmxhY2snLCAnd2hpdGUnKSk7CgoKd2hpbGUgKCFmZW9mKCRpbnB1dFN0cmVhbSkpIHsKd2hpbGUgKCRpc1N0ZGluICYmIDAgPT09IEBzdHJlYW1fc2VsZWN0KCRyLCAkdywgJHcsIDAsIDEwMCkpIHsKCiRyID0gWyRpbnB1dFN0cmVhbV07Cn0KJGMgPSBmcmVhZCgkaW5wdXRTdHJlYW0sIDEpOwoKCmlmIChmYWxzZSA9PT0gJGMgfHwgKCcnID09PSAkcmV0ICYmICcnID09PSAkYyAmJiBudWxsID09PSAkcXVlc3Rpb24tPmdldERlZmF1bHQoKSkpIHsKc2hlbGxfZXhlYygnc3R0eSAnLiRzdHR5TW9kZSk7CnRocm93IG5ldyBNaXNzaW5nSW5wdXRFeGNlcHRpb24oJ0Fib3J0ZWQuJyk7Cn0gZWxzZWlmICgiXDE3NyIgPT09ICRjKSB7IAppZiAoMCA9PT0gJG51bU1hdGNoZXMgJiYgMCAhPT0gJGkpIHsKLS0kaTsKJGN1cnNvci0+bW92ZUxlZnQocygkZnVsbENob2ljZSktPnNsaWNlKC0xKS0+d2lkdGgoZmFsc2UpKTsKCiRmdWxsQ2hvaWNlID0gc2VsZjo6c3Vic3RyKCRmdWxsQ2hvaWNlLCAwLCAkaSk7Cn0KCmlmICgwID09PSAkaSkgewokb2ZzID0gLTE7CiRtYXRjaGVzID0gJGF1dG9jb21wbGV0ZSgkcmV0KTsKJG51bU1hdGNoZXMgPSBcY291bnQoJG1hdGNoZXMpOwp9IGVsc2UgewokbnVtTWF0Y2hlcyA9IDA7Cn0KCgokcmV0ID0gc2VsZjo6c3Vic3RyKCRyZXQsIDAsICRpKTsKfSBlbHNlaWYgKCJcMDMzIiA9PT0gJGMpIHsKCiRjIC49IGZyZWFkKCRpbnB1dFN0cmVhbSwgMik7CgoKaWYgKGlzc2V0KCRjWzJdKSAmJiAoJ0EnID09PSAkY1syXSB8fCAnQicgPT09ICRjWzJdKSkgewppZiAoJ0EnID09PSAkY1syXSAmJiAtMSA9PT0gJG9mcykgewokb2ZzID0gMDsKfQoKaWYgKDAgPT09ICRudW1NYXRjaGVzKSB7CmNvbnRpbnVlOwp9Cgokb2ZzICs9ICgnQScgPT09ICRjWzJdKSA/IC0xIDogMTsKJG9mcyA9ICgkbnVtTWF0Y2hlcyArICRvZnMpICUgJG51bU1hdGNoZXM7Cn0KfSBlbHNlaWYgKFxvcmQoJGMpIDwgMzIpIHsKaWYgKCJcdCIgPT09ICRjIHx8ICJcbiIgPT09ICRjKSB7CmlmICgkbnVtTWF0Y2hlcyA+IDAgJiYgLTEgIT09ICRvZnMpIHsKJHJldCA9IChzdHJpbmcpICRtYXRjaGVzWyRvZnNdOwoKJHJlbWFpbmluZ0NoYXJhY3RlcnMgPSBzdWJzdHIoJHJldCwgXHN0cmxlbih0cmltKCR0aGlzLT5tb3N0UmVjZW50bHlFbnRlcmVkVmFsdWUoJGZ1bGxDaG9pY2UpKSkpOwokb3V0cHV0LT53cml0ZSgkcmVtYWluaW5nQ2hhcmFjdGVycyk7CiRmdWxsQ2hvaWNlIC49ICRyZW1haW5pbmdDaGFyYWN0ZXJzOwokaSA9IChmYWxzZSA9PT0gJGVuY29kaW5nID0gbWJfZGV0ZWN0X2VuY29kaW5nKCRmdWxsQ2hvaWNlLCBudWxsLCB0cnVlKSkgPyBcc3RybGVuKCRmdWxsQ2hvaWNlKSA6IG1iX3N0cmxlbigkZnVsbENob2ljZSwgJGVuY29kaW5nKTsKCiRtYXRjaGVzID0gYXJyYXlfZmlsdGVyKAokYXV0b2NvbXBsZXRlKCRyZXQpLApmdW5jdGlvbiAoJG1hdGNoKSB1c2UgKCRyZXQpIHsKcmV0dXJuICcnID09PSAkcmV0IHx8IHN0cl9zdGFydHNfd2l0aCgkbWF0Y2gsICRyZXQpOwp9Cik7CiRudW1NYXRjaGVzID0gXGNvdW50KCRtYXRjaGVzKTsKJG9mcyA9IC0xOwp9CgppZiAoIlxuIiA9PT0gJGMpIHsKJG91dHB1dC0+d3JpdGUoJGMpOwpicmVhazsKfQoKJG51bU1hdGNoZXMgPSAwOwp9Cgpjb250aW51ZTsKfSBlbHNlIHsKaWYgKCJceDgwIiA8PSAkYykgewokYyAuPSBmcmVhZCgkaW5wdXRTdHJlYW0sIFsiXHhDMCIgPT4gMSwgIlx4RDAiID0+IDEsICJceEUwIiA9PiAyLCAiXHhGMCIgPT4gM11bJGMgJiAiXHhGMCJdKTsKfQoKJG91dHB1dC0+d3JpdGUoJGMpOwokcmV0IC49ICRjOwokZnVsbENob2ljZSAuPSAkYzsKKyskaTsKCiR0ZW1wUmV0ID0gJHJldDsKCmlmICgkcXVlc3Rpb24gaW5zdGFuY2VvZiBDaG9pY2VRdWVzdGlvbiAmJiAkcXVlc3Rpb24tPmlzTXVsdGlzZWxlY3QoKSkgewokdGVtcFJldCA9ICR0aGlzLT5tb3N0UmVjZW50bHlFbnRlcmVkVmFsdWUoJGZ1bGxDaG9pY2UpOwp9CgokbnVtTWF0Y2hlcyA9IDA7CiRvZnMgPSAwOwoKZm9yZWFjaCAoJGF1dG9jb21wbGV0ZSgkcmV0KSBhcyAkdmFsdWUpIHsKCmlmIChzdHJfc3RhcnRzX3dpdGgoJHZhbHVlLCAkdGVtcFJldCkpIHsKJG1hdGNoZXNbJG51bU1hdGNoZXMrK10gPSAkdmFsdWU7Cn0KfQp9CgokY3Vyc29yLT5jbGVhckxpbmVBZnRlcigpOwoKaWYgKCRudW1NYXRjaGVzID4gMCAmJiAtMSAhPT0gJG9mcykgewokY3Vyc29yLT5zYXZlUG9zaXRpb24oKTsKCiRjaGFyYWN0ZXJzRW50ZXJlZCA9IFxzdHJsZW4odHJpbSgkdGhpcy0+bW9zdFJlY2VudGx5RW50ZXJlZFZhbHVlKCRmdWxsQ2hvaWNlKSkpOwokb3V0cHV0LT53cml0ZSgnPGhsPicuT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGVUcmFpbGluZ0JhY2tzbGFzaChzdWJzdHIoJG1hdGNoZXNbJG9mc10sICRjaGFyYWN0ZXJzRW50ZXJlZCkpLic8L2hsPicpOwokY3Vyc29yLT5yZXN0b3JlUG9zaXRpb24oKTsKfQp9CgoKc2hlbGxfZXhlYygnc3R0eSAnLiRzdHR5TW9kZSk7CgpyZXR1cm4gJGZ1bGxDaG9pY2U7Cn0KCnByaXZhdGUgZnVuY3Rpb24gbW9zdFJlY2VudGx5RW50ZXJlZFZhbHVlKHN0cmluZyAkZW50ZXJlZCk6IHN0cmluZwp7CgppZiAoIXN0cl9jb250YWlucygkZW50ZXJlZCwgJywnKSkgewpyZXR1cm4gJGVudGVyZWQ7Cn0KCiRjaG9pY2VzID0gZXhwbG9kZSgnLCcsICRlbnRlcmVkKTsKaWYgKCcnICE9PSAkbGFzdENob2ljZSA9IHRyaW0oJGNob2ljZXNbXGNvdW50KCRjaG9pY2VzKSAtIDFdKSkgewpyZXR1cm4gJGxhc3RDaG9pY2U7Cn0KCnJldHVybiAkZW50ZXJlZDsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldEhpZGRlblJlc3BvbnNlKE91dHB1dEludGVyZmFjZSAkb3V0cHV0LCAkaW5wdXRTdHJlYW0sIGJvb2wgJHRyaW1tYWJsZSA9IHRydWUpOiBzdHJpbmcKewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGV4ZSA9IF9fRElSX18uJy8uLi9SZXNvdXJjZXMvYmluL2hpZGRlbmlucHV0LmV4ZSc7CgoKaWYgKCdwaGFyOicgPT09IHN1YnN0cihfX0ZJTEVfXywgMCwgNSkpIHsKJHRtcEV4ZSA9IHN5c19nZXRfdGVtcF9kaXIoKS4nL2hpZGRlbmlucHV0LmV4ZSc7CmNvcHkoJGV4ZSwgJHRtcEV4ZSk7CiRleGUgPSAkdG1wRXhlOwp9Cgokc0V4ZWMgPSBzaGVsbF9leGVjKCciJy4kZXhlLiciJyk7CiR2YWx1ZSA9ICR0cmltbWFibGUgPyBydHJpbSgkc0V4ZWMpIDogJHNFeGVjOwokb3V0cHV0LT53cml0ZWxuKCcnKTsKCmlmIChpc3NldCgkdG1wRXhlKSkgewp1bmxpbmsoJHRtcEV4ZSk7Cn0KCnJldHVybiAkdmFsdWU7Cn0KCmlmIChzZWxmOjokc3R0eSAmJiBUZXJtaW5hbDo6aGFzU3R0eUF2YWlsYWJsZSgpKSB7CiRzdHR5TW9kZSA9IHNoZWxsX2V4ZWMoJ3N0dHkgLWcnKTsKc2hlbGxfZXhlYygnc3R0eSAtZWNobycpOwp9IGVsc2VpZiAoJHRoaXMtPmlzSW50ZXJhY3RpdmVJbnB1dCgkaW5wdXRTdHJlYW0pKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdVbmFibGUgdG8gaGlkZSB0aGUgcmVzcG9uc2UuJyk7Cn0KCiR2YWx1ZSA9IGZnZXRzKCRpbnB1dFN0cmVhbSwgNDA5Nik7CgppZiAoc2VsZjo6JHN0dHkgJiYgVGVybWluYWw6Omhhc1N0dHlBdmFpbGFibGUoKSkgewpzaGVsbF9leGVjKCdzdHR5ICcuJHN0dHlNb2RlKTsKfQoKaWYgKGZhbHNlID09PSAkdmFsdWUpIHsKdGhyb3cgbmV3IE1pc3NpbmdJbnB1dEV4Y2VwdGlvbignQWJvcnRlZC4nKTsKfQppZiAoJHRyaW1tYWJsZSkgewokdmFsdWUgPSB0cmltKCR2YWx1ZSk7Cn0KJG91dHB1dC0+d3JpdGVsbignJyk7CgpyZXR1cm4gJHZhbHVlOwp9CgoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlQXR0ZW1wdHMoY2FsbGFibGUgJGludGVydmlld2VyLCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CiRlcnJvciA9IG51bGw7CiRhdHRlbXB0cyA9ICRxdWVzdGlvbi0+Z2V0TWF4QXR0ZW1wdHMoKTsKCndoaWxlIChudWxsID09PSAkYXR0ZW1wdHMgfHwgJGF0dGVtcHRzLS0pIHsKaWYgKG51bGwgIT09ICRlcnJvcikgewokdGhpcy0+d3JpdGVFcnJvcigkb3V0cHV0LCAkZXJyb3IpOwp9Cgp0cnkgewpyZXR1cm4gJHF1ZXN0aW9uLT5nZXRWYWxpZGF0b3IoKSgkaW50ZXJ2aWV3ZXIoKSk7Cn0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gJGUpIHsKdGhyb3cgJGU7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGVycm9yKSB7Cn0KfQoKdGhyb3cgJGVycm9yOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGlzSW50ZXJhY3RpdmVJbnB1dCgkaW5wdXRTdHJlYW0pOiBib29sCnsKaWYgKCdwaHA6Ly9zdGRpbicgIT09IChzdHJlYW1fZ2V0X21ldGFfZGF0YSgkaW5wdXRTdHJlYW0pWyd1cmknXSA/PyBudWxsKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChudWxsICE9PSBzZWxmOjokc3RkaW5Jc0ludGVyYWN0aXZlKSB7CnJldHVybiBzZWxmOjokc3RkaW5Jc0ludGVyYWN0aXZlOwp9CgpyZXR1cm4gc2VsZjo6JHN0ZGluSXNJbnRlcmFjdGl2ZSA9IEBzdHJlYW1faXNhdHR5KGZvcGVuKCdwaHA6Ly9zdGRpbicsICdyJykpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZElucHV0KCRpbnB1dFN0cmVhbSwgUXVlc3Rpb24gJHF1ZXN0aW9uKQp7CmlmICghJHF1ZXN0aW9uLT5pc011bHRpbGluZSgpKSB7CiRjcCA9ICR0aGlzLT5zZXRJT0NvZGVwYWdlKCk7CiRyZXQgPSBmZ2V0cygkaW5wdXRTdHJlYW0sIDQwOTYpOwoKcmV0dXJuICR0aGlzLT5yZXNldElPQ29kZXBhZ2UoJGNwLCAkcmV0KTsKfQoKJG11bHRpTGluZVN0cmVhbVJlYWRlciA9ICR0aGlzLT5jbG9uZUlucHV0U3RyZWFtKCRpbnB1dFN0cmVhbSk7CmlmIChudWxsID09PSAkbXVsdGlMaW5lU3RyZWFtUmVhZGVyKSB7CnJldHVybiBmYWxzZTsKfQoKJHJldCA9ICcnOwokY3AgPSAkdGhpcy0+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+cmVuZGVyZWQgPSB0cnVlOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW5kZXJSb3dTZXBhcmF0b3IoaW50ICR0eXBlID0gc2VsZjo6U0VQQVJBVE9SX01JRCwgP3N0cmluZyAkdGl0bGUgPSBudWxsLCA/c3RyaW5nICR0aXRsZUZvcm1hdCA9IG51bGwpCnsKaWYgKDAgPT09ICRjb3VudCA9ICR0aGlzLT5udW1iZXJPZkNvbHVtbnMpIHsKcmV0dXJuOwp9CgokYm9yZGVycyA9ICR0aGlzLT5zdHlsZS0+Z2V0Qm9yZGVyQ2hhcnMoKTsKaWYgKCEkYm9yZGVyc1swXSAmJiAhJGJvcmRlcnNbMl0gJiYgISR0aGlzLT5zdHlsZS0+Z2V0Q3Jvc3NpbmdDaGFyKCkpIHsKcmV0dXJuOwp9CgokY3Jvc3NpbmdzID0gJHRoaXMtPnN0eWxlLT5nZXRDcm9zc2luZ0NoYXJzKCk7CmlmIChzZWxmOjpTRVBBUkFUT1JfTUlEID09PSAkdHlwZSkgewpbJGhvcml6b250YWwsICRsZWZ0Q2hhciwgJG1pZENoYXIsICRyaWdodENoYXJdID0gWyRib3JkZXJzWzJdLCAkY3Jvc3NpbmdzWzhdLCAkY3Jvc3NpbmdzWzBdLCAkY3Jvc3NpbmdzWzRdXTsKfSBlbHNlaWYgKHNlbGY6OlNFUEFSQVRPUl9UT1AgPT09ICR0eXBlKSB7ClskaG9yaXpvbnRhbCwgJGxlZnRDaGFyLCAkbWlkQ2hhciwgJHJpZ2h0Q2hhcl0gPSBbJGJvcmRlcnNbMF0sICRjcm9zc2luZ3NbMV0sICRjcm9zc2luZ3NbMl0sICRjcm9zc2luZ3NbM11dOwp9IGVsc2VpZiAoc2VsZjo6U0VQQVJBVE9SX1RPUF9CT1RUT00gPT09ICR0eXBlKSB7ClskaG9yaXpvbnRhbCwgJGxlZnRDaGFyLCAkbWlkQ2hhciwgJHJpZ2h0Q2hhcl0gPSBbJGJvcmRlcnNbMF0sICRjcm9zc2luZ3NbOV0sICRjcm9zc2luZ3NbMTBdLCAkY3Jvc3NpbmdzWzExXV07Cn0gZWxzZSB7ClskaG9yaXpvbnRhbCwgJGxlZnRDaGFyLCAkbWlkQ2hhciwgJHJpZ2h0Q2hhcl0gPSBbJGJvcmRlcnNbMF0sICRjcm9zc2luZ3NbN10sICRjcm9zc2luZ3NbNl0sICRjcm9zc2luZ3NbNV1dOwp9CgokbWFya3VwID0gJGxlZnRDaGFyOwpmb3IgKCRjb2x1bW4gPSAwOyAkY29sdW1uIDwgJGNvdW50OyArKyRjb2x1bW4pIHsKJG1hcmt1cCAuPSBzdHJfcmVwZWF0KCRob3Jpem9udGFsLCAkdGhpcy0+ZWZmZWN0aXZlQ29sdW1uV2lkdGhzWyRjb2x1bW5dKTsKJG1hcmt1cCAuPSAkY29sdW1uID09PSAkY291bnQgLSAxID8gJHJpZ2h0Q2hhciA6ICRtaWRDaGFyOwp9CgppZiAobnVsbCAhPT0gJHRpdGxlKSB7CiR0aXRsZUxlbmd0aCA9IEhlbHBlcjo6d2lkdGgoSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCRmb3JtYXR0ZXIgPSAkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJGZvcm1hdHRlZFRpdGxlID0gc3ByaW50ZigkdGl0bGVGb3JtYXQsICR0aXRsZSkpKTsKJG1hcmt1cExlbmd0aCA9IEhlbHBlcjo6d2lkdGgoJG1hcmt1cCk7CmlmICgkdGl0bGVMZW5ndGggPiAkbGltaXQgPSAkbWFya3VwTGVuZ3RoIC0gNCkgewokdGl0bGVMZW5ndGggPSAkbGltaXQ7CiRmb3JtYXRMZW5ndGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkZm9ybWF0dGVyLCBzcHJpbnRmKCR0aXRsZUZvcm1hdCwgJycpKSk7CiRmb3JtYXR0ZWRUaXRsZSA9IHNwcmludGYoJHRpdGxlRm9ybWF0LCBIZWxwZXI6OnN1YnN0cigkdGl0bGUsIDAsICRsaW1pdCAtICRmb3JtYXRMZW5ndGggLSAzKS4nLi4uJyk7Cn0KCiR0aXRsZVN0YXJ0ID0gaW50ZGl2KCRtYXJrdXBMZW5ndGggLSAkdGl0bGVMZW5ndGgsIDIpOwppZiAoZmFsc2UgPT09IG1iX2RldGVjdF9lbmNvZGluZygkbWFya3VwLCBudWxsLCB0cnVlKSkgewokbWFya3VwID0gc3Vic3RyX3JlcGxhY2UoJG1hcmt1cCwgJGZvcm1hdHRlZFRpdGxlLCAkdGl0bGVTdGFydCwgJHRpdGxlTGVuZ3RoKTsKfSBlbHNlIHsKJG1hcmt1cCA9IG1iX3N1YnN0cigkbWFya3VwLCAwLCAkdGl0bGVTdGFydCkuJGZvcm1hdHRlZFRpdGxlLm1iX3N1YnN0cigkbWFya3VwLCAkdGl0bGVTdGFydCArICR0aXRsZUxlbmd0aCk7Cn0KfQoKJHRoaXMtPm91dHB1dC0+d3JpdGVsbihzcHJpbnRmKCR0aGlzLT5zdHlsZS0+Z2V0Qm9yZGVyRm9ybWF0KCksICRtYXJrdXApKTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW5kZXJDb2x1bW5TZXBhcmF0b3IoaW50ICR0eXBlID0gc2VsZjo6Qk9SREVSX09VVFNJREUpOiBzdHJpbmcKewokYm9yZGVycyA9ICR0aGlzLT5zdHlsZS0+Z2V0Qm9yZGVyQ2hhcnMoKTsKCnJldHVybiBzcHJpbnRmKCR0aGlzLT5zdHlsZS0+Z2V0Qm9yZGVyRm9ybWF0KCksIHNlbGY6OkJPUkRFUl9PVVRTSURFID09PSAkdHlwZSA/ICRib3JkZXJzWzFdIDogJGJvcmRlcnNbM10pOwp9CgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZW5kZXJSb3coYXJyYXkgJHJvdywgc3RyaW5nICRjZWxsRm9ybWF0LCA/c3RyaW5nICRmaXJzdENlbGxGb3JtYXQgPSBudWxsKQp7CiRyb3dDb250ZW50ID0gJHRoaXMtPnJlbmRlckNvbHVtblNlcGFyYXRvcihzZWxmOjpCT1JERVJfT1VUU0lERSk7CiRjb2x1bW5zID0gJHRoaXMtPmdldFJvd0NvbHVtbnMoJHJvdyk7CiRsYXN0ID0gXGNvdW50KCRjb2x1bW5zKSAtIDE7CmZvcmVhY2ggKCRjb2x1bW5zIGFzICRpID0+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/PyAnJywgIlxuIikpIHsKY29udGludWU7Cn0KJGVvbCA9IHN0cl9jb250YWlucygkY2VsbCA/PyAnJywgIlxyXG4iKSA/ICJcclxuIiA6ICJcbiI7CiRlc2NhcGVkID0gaW1wbG9kZSgkZW9sLCBhcnJheV9tYXAoW091dHB1dEZvcm1hdHRlcjo6Y2xhc3MsICdlc2NhcGVUcmFpbGluZ0JhY2tzbGFzaCddLCBleHBsb2RlKCRlb2wsICRjZWxsKSkpOwokY2VsbCA9ICRjZWxsIGluc3RhbmNlb2YgVGFibGVDZWxsID8gbmV3IFRhYmxlQ2VsbCgkZXNjYXBlZCwgWydjb2xzcGFuJyA9PiAkY2VsbC0+Z2V0Q29sc3BhbigpXSkgOiAkZXNjYXBlZDsKJGxpbmVzID0gZXhwbG9kZSgkZW9sLCBzdHJfcmVwbGFjZSgkZW9sLCAnPGZnPWRlZmF1bHQ7Ymc9ZGVmYXVsdD48Lz4nLiRlb2wsICRjZWxsKSk7CmZvcmVhY2ggKCRsaW5lcyBhcyAkbGluZUtleSA9PiAkbGluZSkgewppZiAoJGNvbHNwYW4gPiAxKSB7CiRsaW5lID0gbmV3IFRhYmxlQ2VsbCgkbGluZSwgWydjb2xzcGFuJyA9PiAkY29sc3Bhbl0pOwp9CmlmICgwID09PSAkbGluZUtleSkgewokcm93c1skcm93S2V5XVskY29sdW1uXSA9ICRsaW5lOwp9IGVsc2UgewppZiAoIVxhcnJheV9rZXlfZXhpc3RzKCRyb3dLZXksICR1bm1lcmdlZFJvd3MpIHx8ICFcYXJyYXlfa2V5X2V4aXN0cygkbGluZUtleSwgJHVubWVyZ2VkUm93c1skcm93S2V5XSkpIHsKJHVubWVyZ2VkUm93c1skcm93S2V5XVskbGluZUtleV0gPSAkdGhpcy0+Y29weVJvdygkcm93cywgJHJvd0tleSk7Cn0KJHVubWVyZ2VkUm93c1skcm93S2V5XVskbGluZUtleV1bJGNvbHVtbl0gPSAkbGluZTsKfQp9Cn0KfQoKcmV0dXJuIG5ldyBUYWJsZVJvd3MoZnVuY3Rpb24gKCkgdXNlICgkcm93cywgJHVubWVyZ2VkUm93cyk6IFxUcmF2ZXJzYWJsZSB7CmZvcmVhY2ggKCRyb3dzIGFzICRyb3dLZXkgPT4gJHJvdykgewokcm93R3JvdXAgPSBbJHJvdyBpbnN0YW5jZW9mIFRhYmxlU2VwYXJhdG9yID8gJHJvdyA6ICR0aGlzLT5maWxsQ2VsbHMoJHJvdyldOwoKaWYgKGlzc2V0KCR1bm1lcmdlZFJvd3NbJHJvd0tleV0pKSB7CmZvcmVhY2ggKCR1bm1lcmdlZFJvd3NbJHJvd0tleV0gYXMgJHJvdykgewokcm93R3JvdXBbXSA9ICRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvciA/ICRyb3cgOiAkdGhpcy0+ZmlsbENlbGxzKCRyb3cpOwp9Cn0KeWllbGQgJHJvd0dyb3VwOwp9Cn0pOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZVJvd0NvdW50KCk6IGludAp7CiRudW1iZXJPZlJvd3MgPSBcY291bnQoaXRlcmF0b3JfdG9fYXJyYXkoJHRoaXMtPmJ1aWxkVGFibGVSb3dzKGFycmF5X21lcmdlKCR0aGlzLT5oZWFkZXJzLCBbbmV3IFRhYmxlU2VwYXJhdG9yKCldLCAkdGhpcy0+cm93cykpKSk7CgppZiAoJHRoaXMtPmhlYWRlcnMpIHsKKyskbnVtYmVyT2ZSb3dzOyAKfQoKaWYgKFxjb3VudCgkdGhpcy0+cm93cykgPiAwKSB7CisrJG51bWJlck9mUm93czsgCn0KCnJldHVybiAkbnVtYmVyT2ZSb3dzOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gZmlsbE5leHRSb3dzKGFycmF5ICRyb3dzLCBpbnQgJGxpbmUpOiBhcnJheQp7CiR1bm1lcmdlZFJvd3MgPSBbXTsKZm9yZWFjaCAoJHJvd3NbJGxpbmVdIGFzICRjb2x1bW4gPT4gJGNlbGwpIHsKaWYgKG51bGwgIT09ICRjZWxsICYmICEkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAhXGlzX3NjYWxhcigkY2VsbCkgJiYgIShcaXNfb2JqZWN0KCRjZWxsKSAmJiBtZXRob2RfZXhpc3RzKCRjZWxsLCAnX190b1N0cmluZycpKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0EgY2VsbCBtdXN0IGJlIGEgVGFibGVDZWxsLCBhIHNjYWxhciBvciBhbiBvYmplY3QgaW1wbGVtZW50aW5nICJfX3RvU3RyaW5nKCkiLCAiJXMiIGdpdmVuLicsIGdldF9kZWJ1Z190eXBlKCRjZWxsKSkpOwp9CmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAkY2VsbC0+Z2V0Um93c3BhbigpID4gMSkgewokbmJMaW5lcyA9ICRjZWxsLT5nZXRSb3dzcGFuKCkgLSAxOwokbGluZXMgPSBbJGNlbGxdOwppZiAoc3Ryc3RyKCRjZWxsLCAiXG4iKSkgewokZW9sID0gc3RyX2NvbnRhaW5zKCRjZWxsLCAiXHJcbiIpID8gIlxyXG4iIDogIlxuIjsKJGxpbmVzID0gZXhwbG9kZSgkZW9sLCBzdHJfcmVwbGFjZSgkZW9sLCAnPGZnPWRlZmF1bHQ7Ymc9ZGVmYXVsdD4nLiRlb2wuJzwvPicsICRjZWxsKSk7CiRuYkxpbmVzID0gXGNvdW50KCRsaW5lcykgPiAkbmJMaW5lcyA/IHN1YnN0cl9jb3VudCgkY2VsbCwgJGVvbCkgOiAkbmJMaW5lczsKCiRyb3dzWyRsaW5lXVskY29sdW1uXSA9IG5ldyBUYWJsZUNlbGwoJGxpbmVzWzBdLCBbJ2NvbHNwYW4nID0+ICRjZWxsLT5nZXRDb2xzcGFuKCksICdzdHlsZScgPT4gJGNlbGwtPmdldFN0eWxlKCldKTsKdW5zZXQoJGxpbmVzWzBdKTsKfQoKCiR1bm1lcmdlZFJvd3MgPSBhcnJheV9yZXBsYWNlX3JlY3Vyc2l2ZShhcnJheV9maWxsKCRsaW5lICsgMSwgJG5iTGluZXMsIFtdKSwgJHVubWVyZ2VkUm93cyk7CmZvcmVhY2ggKCR1bm1lcmdlZFJvd3MgYXMgJHVubWVyZ2VkUm93S2V5ID0+ICR1bm1lcmdlZFJvdykgewokdmFsdWUgPSAkbGluZXNbJHVubWVyZ2VkUm93S2V5IC0gJGxpbmVdID8/ICcnOwokdW5tZXJnZWRSb3dzWyR1bm1lcmdlZFJvd0tleV1bJGNvbHVtbl0gPSBuZXcgVGFibGVDZWxsKCR2YWx1ZSwgWydjb2xzcGFuJyA9PiAkY2VsbC0+Z2V0Q29sc3BhbigpLCAnc3R5bGUnID0+ICRjZWxsLT5nZXRTdHlsZSgpXSk7CmlmICgkbmJMaW5lcyA9PT0gJHVubWVyZ2VkUm93S2V5IC0gJGxpbmUpIHsKYnJlYWs7Cn0KfQp9Cn0KCmZvcmVhY2ggKCR1bm1lcmdlZFJvd3MgYXMgJHVubWVyZ2VkUm93S2V5ID0+ICR1bm1lcmdlZFJvdykgewoKaWYgKGlzc2V0KCRyb3dzWyR1bm1lcmdlZFJvd0tleV0pICYmIFxpc19hcnJheSgkcm93c1skdW5tZXJnZWRSb3dLZXldKSAmJiAoJHRoaXMtPmdldE51bWJlck9mQ29sdW1ucygkcm93c1skdW5tZXJnZWRSb3dLZXldKSArICR0aGlzLT5nZXROdW1iZXJPZkNvbHVtbnMoJHVubWVyZ2VkUm93c1skdW5tZXJnZWRSb3dLZXldKSA8PSAkdGhpcy0+bnVtYmVyT2ZDb2x1bW5zKSkgewpmb3JlYWNoICgkdW5tZXJnZWRSb3cgYXMgJGNlbGxLZXkgPT4gJGNlbGwpIHsKCmFycmF5X3NwbGljZSgkcm93c1skdW5tZXJnZWRSb3dLZXldLCAkY2VsbEtleSwgMCwgWyRjZWxsXSk7Cn0KfSBlbHNlIHsKJHJvdyA9ICR0aGlzLT5jb3B5Um93KCRyb3dzLCAkdW5tZXJnZWRSb3dLZXkgLSAxKTsKZm9yZWFjaCAoJHVubWVyZ2VkUm93IGFzICRjb2x1bW4gPT4gJGNlbGwpIHsKaWYgKCFlbXB0eSgkY2VsbCkpIHsKJHJvd1skY29sdW1uXSA9ICR1bm1lcmdlZFJvd1skY29sdW1uXTsKfQp9CmFycmF5X3NwbGljZSgkcm93cywgJHVubWVyZ2VkUm93S2V5LCAwLCBbJHJvd10pOwp9Cn0KCnJldHVybiAkcm93czsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBmaWxsQ2VsbHMoaXRlcmFibGUgJHJvdykKewokbmV3Um93ID0gW107Cgpmb3JlYWNoICgkcm93IGFzICRjb2x1bW4gPT4gJGNlbGwpIHsKJG5ld1Jvd1tdID0gJGNlbGw7CmlmICgkY2VsbCBpbnN0YW5jZW9mIFRhYmxlQ2VsbCAmJiAkY2VsbC0+Z2V0Q29sc3BhbigpID4gMSkgewpmb3JlYWNoIChyYW5nZSgkY29sdW1uICsgMSwgJGNvbHVtbiArICRjZWxsLT5nZXRDb2xzcGFuKCkgLSAxKSBhcyAkcG9zaXRpb24pIHsKCiRuZXdSb3dbXSA9ICcnOwp9Cn0KfQoKcmV0dXJuICRuZXdSb3cgPzogJHJvdzsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjb3B5Um93KGFycmF5ICRyb3dzLCBpbnQgJGxpbmUpOiBhcnJheQp7CiRyb3cgPSAkcm93c1skbGluZV07CmZvcmVhY2ggKCRyb3cgYXMgJGNlbGxLZXkgPT4gJGNlbGxWYWx1ZSkgewokcm93WyRjZWxsS2V5XSA9ICcnOwppZiAoJGNlbGxWYWx1ZSBpbnN0YW5jZW9mIFRhYmxlQ2VsbCkgewokcm93WyRjZWxsS2V5XSA9IG5ldyBUYWJsZUNlbGwoJycsIFsnY29sc3BhbicgPT4gJGNlbGxWYWx1ZS0+Z2V0Q29sc3BhbigpXSk7Cn0KfQoKcmV0dXJuICRyb3c7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0TnVtYmVyT2ZDb2x1bW5zKGFycmF5ICRyb3cpOiBpbnQKewokY29sdW1ucyA9IFxjb3VudCgkcm93KTsKZm9yZWFjaCAoJHJvdyBhcyAkY29sdW1uKSB7CiRjb2x1bW5zICs9ICRjb2x1bW4gaW5zdGFuY2VvZiBUYWJsZUNlbGwgPyAoJGNvbHVtbi0+Z2V0Q29sc3BhbigpIC0gMSkgOiAwOwp9CgpyZXR1cm4gJGNvbHVtbnM7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0Um93Q29sdW1ucyhhcnJheSAkcm93KTogYXJyYXkKewokY29sdW1ucyA9IHJhbmdlKDAsICR0aGlzLT5udW1iZXJPZkNvbHVtbnMgLSAxKTsKZm9yZWFjaCAoJHJvdyBhcyAkY2VsbEtleSA9PiAkY2VsbCkgewppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwgJiYgJGNlbGwtPmdldENvbHNwYW4oKSA+IDEpIHsKCiRjb2x1bW5zID0gYXJyYXlfZGlmZigkY29sdW1ucywgcmFuZ2UoJGNlbGxLZXkgKyAxLCAkY2VsbEtleSArICRjZWxsLT5nZXRDb2xzcGFuKCkgLSAxKSk7Cn0KfQoKcmV0dXJuICRjb2x1bW5zOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNhbGN1bGF0ZUNvbHVtbnNXaWR0aChpdGVyYWJsZSAkZ3JvdXBzKQp7CmZvciAoJGNvbHVtbiA9IDA7ICRjb2x1bW4gPCAkdGhpcy0+bnVtYmVyT2ZDb2x1bW5zOyArKyRjb2x1bW4pIHsKJGxlbmd0aHMgPSBbXTsKZm9yZWFjaCAoJGdyb3VwcyBhcyAkZ3JvdXApIHsKZm9yZWFjaCAoJGdyb3VwIGFzICRyb3cpIHsKaWYgKCRyb3cgaW5zdGFuY2VvZiBUYWJsZVNlcGFyYXRvcikgewpjb250aW51ZTsKfQoKZm9yZWFjaCAoJHJvdyBhcyAkaSA9PiAkY2VsbCkgewppZiAoJGNlbGwgaW5zdGFuY2VvZiBUYWJsZUNlbGwpIHsKJHRleHRDb250ZW50ID0gSGVscGVyOjpyZW1vdmVEZWNvcmF0aW9uKCR0aGlzLT5vdXRwdXQtPmdldEZvcm1hdHRlcigpLCAkY2VsbCk7CiR0ZXh0TGVuZ3RoID0gSGVscGVyOjp3aWR0aCgkdGV4dENvbnRlbnQpOwppZiAoJHRleHRMZW5ndGggPiAwKSB7CiRjb250ZW50Q29sdW1ucyA9IG1iX3N0cl9zcGxpdCgkdGV4dENvbnRlbnQsIGNlaWwoJHRleHRMZW5ndGggLyAkY2VsbC0+Z2V0Q29sc3BhbigpKSk7CmZvcmVhY2ggKCRjb250ZW50Q29sdW1ucyBhcyAkcG9zaXRpb24gPT4gJGNvbnRlbnQpIHsKJHJvd1skaSArICRwb3NpdGlvbl0gPSAkY29udGVudDsKfQp9Cn0KfQoKJGxlbmd0aHNbXSA9ICR0aGlzLT5nZXRDZWxsV2lkdGgoJHJvdywgJGNvbHVtbik7Cn0KfQoKJHRoaXMtPmVmZmVjdGl2ZUNvbHVtbldpZHRoc1skY29sdW1uXSA9IG1heCgkbGVuZ3RocykgKyBIZWxwZXI6OndpZHRoKCR0aGlzLT5zdHlsZS0+Z2V0Q2VsbFJvd0NvbnRlbnRGb3JtYXQoKSkgLSAyOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0Q29sdW1uU2VwYXJhdG9yV2lkdGgoKTogaW50CnsKcmV0dXJuIEhlbHBlcjo6d2lkdGgoc3ByaW50ZigkdGhpcy0+c3R5bGUtPmdldEJvcmRlckZvcm1hdCgpLCAkdGhpcy0+c3R5bGUtPmdldEJvcmRlckNoYXJzKClbM10pKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRDZWxsV2lkdGgoYXJyYXkgJHJvdywgaW50ICRjb2x1bW4pOiBpbnQKewokY2VsbFdpZHRoID0gMDsKCmlmIChpc3NldCgkcm93WyRjb2x1bW5dKSkgewokY2VsbCA9ICRyb3dbJGNvbHVtbl07CiRjZWxsV2lkdGggPSBIZWxwZXI6OndpZHRoKEhlbHBlcjo6cmVtb3ZlRGVjb3JhdGlvbigkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKSwgJGNlbGwpKTsKfQoKJGNvbHVtbldpZHRoID0gJHRoaXMtPmNvbHVtbldpZHRoc1skY29sdW1uXSA/PyAwOwokY2VsbFdpZHRoID0gbWF4KCRjZWxsV2lkdGgsICRjb2x1bW5XaWR0aCk7CgpyZXR1cm4gaXNzZXQoJHRoaXMtPmNvbHVtbk1heFdpZHRoc1skY29sdW1uXSkgPyBtaW4oJHRoaXMtPmNvbHVtbk1heFdpZHRoc1skY29sdW1uXSwgJGNlbGxXaWR0aCkgOiAkY2VsbFdpZHRoOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNsZWFudXAoKQp7CiR0aGlzLT5lZmZlY3RpdmVDb2x1bW5XaWR0aHMgPSBbXTsKJHRoaXMtPm51bWJlck9mQ29sdW1ucyA9IG51bGw7Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXRTdHlsZXMoKTogYXJyYXkKewokYm9yZGVybGVzcyA9IG5ldyBUYWJsZVN0eWxlKCk7CiRib3JkZXJsZXNzCi0+c2V0SG9yaXpvbnRhbEJvcmRlckNoYXJzKCc9JykKLT5zZXRWZXJ0aWNhbEJvcmRlckNoYXJzKCcgJykKLT5zZXREZWZhdWx0Q3Jvc3NpbmdDaGFyKCcgJykKOwoKJGNvbXBhY3QgPSBuZXcgVGFibGVTdHlsZSgpOwokY29tcGFjdAotPnNldEhvcml6b250YWxCb3JkZXJDaGFycygnJykKLT5zZXRWZXJ0aWNhbEJvcmRlckNoYXJzKCcnKQotPnNldERlZmF1bHRDcm9zc2luZ0NoYXIoJycpCi0+c2V0Q2VsbFJvd0NvbnRlbnRGb3JtYXQoJyVzICcpCjsKCiRzdHlsZUd1aWRlID0gbmV3IFRhYmxlU3R5bGUoKTsKJHN0eWxlR3VpZGUKLT5zZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoJy0nKQotPnNldFZlcnRpY2FsQm9yZGVyQ2hhcnMoJyAnKQotPnNldERlZmF1bHRDcm9zc2luZ0NoYXIoJyAnKQotPnNldENlbGxIZWFkZXJGb3JtYXQoJyVzJykKOwoKJGJveCA9IChuZXcgVGFibGVTdHlsZSgpKQotPnNldEhvcml6b250YWxCb3JkZXJDaGFycygn4pSAJykKLT5zZXRWZXJ0aWNhbEJvcmRlckNoYXJzKCfilIInKQotPnNldENyb3NzaW5nQ2hhcnMoJ+KUvCcsICfilIwnLCAn4pSsJywgJ+KUkCcsICfilKQnLCAn4pSYJywgJ+KUtCcsICfilJQnLCAn4pScJykKOwoKJGJveERvdWJsZSA9IChuZXcgVGFibGVTdHlsZSgpKQotPnNldEhvcml6b250YWxCb3JkZXJDaGFycygn4pWQJywgJ+KUgCcpCi0+c2V0VmVydGljYWxCb3JkZXJDaGFycygn4pWRJywgJ+KUgicpCi0+c2V0Q3Jvc3NpbmdDaGFycygn4pS8JywgJ+KVlCcsICfilaQnLCAn4pWXJywgJ+KVoicsICfilZ0nLCAn4pWnJywgJ+KVmicsICfilZ8nLCAn4pWgJywgJ+KVqicsICfilaMnKQo7CgpyZXR1cm4gWwonZGVmYXVsdCcgPT4gbmV3IFRhYmxlU3R5bGUoKSwKJ2JvcmRlcmxlc3MnID0+ICRib3JkZXJsZXNzLAonY29tcGFjdCcgPT4gJGNvbXBhY3QsCidzeW1mb255LXN0eWxlLWd1aWRlJyA9PiAkc3R5bGVHdWlkZSwKJ2JveCcgPT4gJGJveCwKJ2JveC1kb3VibGUnID0+ICRib3hEb3VibGUsCl07Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVzb2x2ZVN0eWxlKCRuYW1lKTogVGFibGVTdHlsZQp7CmlmICgkbmFtZSBpbnN0YW5jZW9mIFRhYmxlU3R5bGUpIHsKcmV0dXJuICRuYW1lOwp9CgppZiAoaXNzZXQoc2VsZjo6JHN0eWxlc1skbmFtZV0pKSB7CnJldHVybiBzZWxmOjokc3R5bGVzWyRuYW1lXTsKfQoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdTdHlsZSAiJXMiIGlzIG5vdCBkZWZpbmVkLicsICRuYW1lKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFRhYmxlQ2VsbAp7CnByaXZhdGUgJHZhbHVlOwpwcml2YXRlICRvcHRpb25zID0gWwoncm93c3BhbicgPT4gMSwKJ2NvbHNwYW4nID0+IDEsCidzdHlsZScgPT4gbnVsbCwKXTsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHZhbHVlID0gJycsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRoaXMtPnZhbHVlID0gJHZhbHVlOwoKCmlmICgkZGlmZiA9IGFycmF5X2RpZmYoYXJyYXlfa2V5cygkb3B0aW9ucyksIGFycmF5X2tleXMoJHRoaXMtPm9wdGlvbnMpKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBUYWJsZUNlbGwgZG9lcyBub3Qgc3VwcG9ydCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFwnJXNcJy4nLCBpbXBsb2RlKCdcJywgXCcnLCAkZGlmZikpKTsKfQoKaWYgKGlzc2V0KCRvcHRpb25zWydzdHlsZSddKSAmJiAhJG9wdGlvbnNbJ3N0eWxlJ10gaW5zdGFuY2VvZiBUYWJsZUNlbGxTdHlsZSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdUaGUgc3R5bGUgb3B0aW9uIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgIlRhYmxlQ2VsbFN0eWxlIi4nKTsKfQoKJHRoaXMtPm9wdGlvbnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+b3B0aW9ucywgJG9wdGlvbnMpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCkKewpyZXR1cm4gJHRoaXMtPnZhbHVlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb2xzcGFuKCkKewpyZXR1cm4gKGludCkgJHRoaXMtPm9wdGlvbnNbJ2NvbHNwYW4nXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Um93c3BhbigpCnsKcmV0dXJuIChpbnQpICR0aGlzLT5vcHRpb25zWydyb3dzcGFuJ107Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTdHlsZSgpOiA/VGFibGVDZWxsU3R5bGUKewpyZXR1cm4gJHRoaXMtPm9wdGlvbnNbJ3N0eWxlJ107Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCmNsYXNzIFRhYmxlQ2VsbFN0eWxlCnsKcHVibGljIGNvbnN0IERFRkFVTFRfQUxJR04gPSAnbGVmdCc7Cgpwcml2YXRlIGNvbnN0IFRBR19PUFRJT05TID0gWwonZmcnLAonYmcnLAonb3B0aW9ucycsCl07Cgpwcml2YXRlIGNvbnN0IEFMSUdOX01BUCA9IFsKJ2xlZnQnID0+IFxTVFJfUEFEX1JJR0hULAonY2VudGVyJyA9PiBcU1RSX1BBRF9CT1RILAoncmlnaHQnID0+IFxTVFJfUEFEX0xFRlQsCl07Cgpwcml2YXRlICRvcHRpb25zID0gWwonZmcnID0+ICdkZWZhdWx0JywKJ2JnJyA9PiAnZGVmYXVsdCcsCidvcHRpb25zJyA9PiBudWxsLAonYWxpZ24nID0+IHNlbGY6OkRFRkFVTFRfQUxJR04sCidjZWxsRm9ybWF0JyA9PiBudWxsLApdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRvcHRpb25zID0gW10pCnsKaWYgKCRkaWZmID0gYXJyYXlfZGlmZihhcnJheV9rZXlzKCRvcHRpb25zKSwgYXJyYXlfa2V5cygkdGhpcy0+b3B0aW9ucykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIFRhYmxlQ2VsbFN0eWxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBvcHRpb25zOiBcJyVzXCcuJywgaW1wbG9kZSgnXCcsIFwnJywgJGRpZmYpKSk7Cn0KCmlmIChpc3NldCgkb3B0aW9uc1snYWxpZ24nXSkgJiYgIVxhcnJheV9rZXlfZXhpc3RzKCRvcHRpb25zWydhbGlnbiddLCBzZWxmOjpBTElHTl9NQVApKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignV3JvbmcgYWxpZ24gdmFsdWUuIFZhbHVlIG11c3QgYmUgZm9sbG93aW5nOiBcJyVzXCcuJywgaW1wbG9kZSgnXCcsIFwnJywgYXJyYXlfa2V5cyhzZWxmOjpBTElHTl9NQVApKSkpOwp9CgokdGhpcy0+b3B0aW9ucyA9IGFycmF5X21lcmdlKCR0aGlzLT5vcHRpb25zLCAkb3B0aW9ucyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25zKCk6IGFycmF5CnsKcmV0dXJuICR0aGlzLT5vcHRpb25zOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRUYWdPcHRpb25zKCkKewpyZXR1cm4gYXJyYXlfZmlsdGVyKAokdGhpcy0+Z2V0T3B0aW9ucygpLApmdW5jdGlvbiAoJGtleSkgewpyZXR1cm4gXGluX2FycmF5KCRrZXksIHNlbGY6OlRBR19PUFRJT05TKSAmJiBpc3NldCgkdGhpcy0+b3B0aW9uc1ska2V5XSk7Cn0sClxBUlJBWV9GSUxURVJfVVNFX0tFWQopOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UGFkQnlBbGlnbigpCnsKcmV0dXJuIHNlbGY6OkFMSUdOX01BUFskdGhpcy0+Z2V0T3B0aW9ucygpWydhbGlnbiddXTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENlbGxGb3JtYXQoKTogP3N0cmluZwp7CnJldHVybiAkdGhpcy0+Z2V0T3B0aW9ucygpWydjZWxsRm9ybWF0J107Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKCgoKY2xhc3MgVGFibGVSb3dzIGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlCnsKcHJpdmF0ZSAkZ2VuZXJhdG9yOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxDbG9zdXJlICRnZW5lcmF0b3IpCnsKJHRoaXMtPmdlbmVyYXRvciA9ICRnZW5lcmF0b3I7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBcVHJhdmVyc2FibGUKewpyZXR1cm4gKCR0aGlzLT5nZW5lcmF0b3IpKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyOwoKCgoKCgpjbGFzcyBUYWJsZVNlcGFyYXRvciBleHRlbmRzIFRhYmxlQ2VsbAp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkb3B0aW9ucyA9IFtdKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJycsICRvcHRpb25zKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CgoKCgoKCgoKY2xhc3MgVGFibGVTdHlsZQp7CnByaXZhdGUgJHBhZGRpbmdDaGFyID0gJyAnOwpwcml2YXRlICRob3Jpem9udGFsT3V0c2lkZUJvcmRlckNoYXIgPSAnLSc7CnByaXZhdGUgJGhvcml6b250YWxJbnNpZGVCb3JkZXJDaGFyID0gJy0nOwpwcml2YXRlICR2ZXJ0aWNhbE91dHNpZGVCb3JkZXJDaGFyID0gJ3wnOwpwcml2YXRlICR2ZXJ0aWNhbEluc2lkZUJvcmRlckNoYXIgPSAnfCc7CnByaXZhdGUgJGNyb3NzaW5nQ2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdUb3BSaWdodENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wTWlkQ2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdUb3BMZWZ0Q2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdNaWRSaWdodENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nQm90dG9tUmlnaHRDaGFyID0gJysnOwpwcml2YXRlICRjcm9zc2luZ0JvdHRvbU1pZENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nQm90dG9tTGVmdENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nTWlkTGVmdENoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wTGVmdEJvdHRvbUNoYXIgPSAnKyc7CnByaXZhdGUgJGNyb3NzaW5nVG9wTWlkQm90dG9tQ2hhciA9ICcrJzsKcHJpdmF0ZSAkY3Jvc3NpbmdUb3BSaWdodEJvdHRvbUNoYXIgPSAnKyc7CnByaXZhdGUgJGhlYWRlclRpdGxlRm9ybWF0ID0gJzxmZz1ibGFjaztiZz13aGl0ZTtvcHRpb25zPWJvbGQ+ICVzIDwvPic7CnByaXZhdGUgJGZvb3RlclRpdGxlRm9ybWF0ID0gJzxmZz1ibGFjaztiZz13aGl0ZTtvcHRpb25zPWJvbGQ+ICVzIDwvPic7CnByaXZhdGUgJGNlbGxIZWFkZXJGb3JtYXQgPSAnPGluZm8+JXM8L2luZm8+JzsKcHJpdmF0ZSAkY2VsbFJvd0Zvcm1hdCA9ICclcyc7CnByaXZhdGUgJGNlbGxSb3dDb250ZW50Rm9ybWF0ID0gJyAlcyAnOwpwcml2YXRlICRib3JkZXJGb3JtYXQgPSAnJXMnOwpwcml2YXRlICRwYWRUeXBlID0gXFNUUl9QQURfUklHSFQ7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQYWRkaW5nQ2hhcihzdHJpbmcgJHBhZGRpbmdDaGFyKQp7CmlmICghJHBhZGRpbmdDaGFyKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVGhlIHBhZGRpbmcgY2hhciBtdXN0IG5vdCBiZSBlbXB0eS4nKTsKfQoKJHRoaXMtPnBhZGRpbmdDaGFyID0gJHBhZGRpbmdDaGFyOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWRkaW5nQ2hhcigpCnsKcmV0dXJuICR0aGlzLT5wYWRkaW5nQ2hhcjsKfQoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIb3Jpem9udGFsQm9yZGVyQ2hhcnMoc3RyaW5nICRvdXRzaWRlLCA/c3RyaW5nICRpbnNpZGUgPSBudWxsKTogc2VsZgp7CiR0aGlzLT5ob3Jpem9udGFsT3V0c2lkZUJvcmRlckNoYXIgPSAkb3V0c2lkZTsKJHRoaXMtPmhvcml6b250YWxJbnNpZGVCb3JkZXJDaGFyID0gJGluc2lkZSA/PyAkb3V0c2lkZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVydGljYWxCb3JkZXJDaGFycyhzdHJpbmcgJG91dHNpZGUsID9zdHJpbmcgJGluc2lkZSA9IG51bGwpOiBzZWxmCnsKJHRoaXMtPnZlcnRpY2FsT3V0c2lkZUJvcmRlckNoYXIgPSAkb3V0c2lkZTsKJHRoaXMtPnZlcnRpY2FsSW5zaWRlQm9yZGVyQ2hhciA9ICRpbnNpZGUgPz8gJG91dHNpZGU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEJvcmRlckNoYXJzKCk6IGFycmF5CnsKcmV0dXJuIFsKJHRoaXMtPmhvcml6b250YWxPdXRzaWRlQm9yZGVyQ2hhciwKJHRoaXMtPnZlcnRpY2FsT3V0c2lkZUJvcmRlckNoYXIsCiR0aGlzLT5ob3Jpem9udGFsSW5zaWRlQm9yZGVyQ2hhciwKJHRoaXMtPnZlcnRpY2FsSW5zaWRlQm9yZGVyQ2hhciwKXTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDcm9zc2luZ0NoYXJzKHN0cmluZyAkY3Jvc3MsIHN0cmluZyAkdG9wTGVmdCwgc3RyaW5nICR0b3BNaWQsIHN0cmluZyAkdG9wUmlnaHQsIHN0cmluZyAkbWlkUmlnaHQsIHN0cmluZyAkYm90dG9tUmlnaHQsIHN0cmluZyAkYm90dG9tTWlkLCBzdHJpbmcgJGJvdHRvbUxlZnQsIHN0cmluZyAkbWlkTGVmdCwgP3N0cmluZyAkdG9wTGVmdEJvdHRvbSA9IG51bGwsID9zdHJpbmcgJHRvcE1pZEJvdHRvbSA9IG51bGwsID9zdHJpbmcgJHRvcFJpZ2h0Qm90dG9tID0gbnVsbCk6IHNlbGYKewokdGhpcy0+Y3Jvc3NpbmdDaGFyID0gJGNyb3NzOwokdGhpcy0+Y3Jvc3NpbmdUb3BMZWZ0Q2hhciA9ICR0b3BMZWZ0OwokdGhpcy0+Y3Jvc3NpbmdUb3BNaWRDaGFyID0gJHRvcE1pZDsKJHRoaXMtPmNyb3NzaW5nVG9wUmlnaHRDaGFyID0gJHRvcFJpZ2h0OwokdGhpcy0+Y3Jvc3NpbmdNaWRSaWdodENoYXIgPSAkbWlkUmlnaHQ7CiR0aGlzLT5jcm9zc2luZ0JvdHRvbVJpZ2h0Q2hhciA9ICRib3R0b21SaWdodDsKJHRoaXMtPmNyb3NzaW5nQm90dG9tTWlkQ2hhciA9ICRib3R0b21NaWQ7CiR0aGlzLT5jcm9zc2luZ0JvdHRvbUxlZnRDaGFyID0gJGJvdHRvbUxlZnQ7CiR0aGlzLT5jcm9zc2luZ01pZExlZnRDaGFyID0gJG1pZExlZnQ7CiR0aGlzLT5jcm9zc2luZ1RvcExlZnRCb3R0b21DaGFyID0gJHRvcExlZnRCb3R0b20gPz8gJG1pZExlZnQ7CiR0aGlzLT5jcm9zc2luZ1RvcE1pZEJvdHRvbUNoYXIgPSAkdG9wTWlkQm90dG9tID8/ICRjcm9zczsKJHRoaXMtPmNyb3NzaW5nVG9wUmlnaHRCb3R0b21DaGFyID0gJHRvcFJpZ2h0Qm90dG9tID8/ICRtaWRSaWdodDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RGVmYXVsdENyb3NzaW5nQ2hhcihzdHJpbmcgJGNoYXIpOiBzZWxmCnsKcmV0dXJuICR0aGlzLT5zZXRDcm9zc2luZ0NoYXJzKCRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIsICRjaGFyLCAkY2hhciwgJGNoYXIpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDcm9zc2luZ0NoYXIoKQp7CnJldHVybiAkdGhpcy0+Y3Jvc3NpbmdDaGFyOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDcm9zc2luZ0NoYXJzKCk6IGFycmF5CnsKcmV0dXJuIFsKJHRoaXMtPmNyb3NzaW5nQ2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wTGVmdENoYXIsCiR0aGlzLT5jcm9zc2luZ1RvcE1pZENoYXIsCiR0aGlzLT5jcm9zc2luZ1RvcFJpZ2h0Q2hhciwKJHRoaXMtPmNyb3NzaW5nTWlkUmlnaHRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdCb3R0b21SaWdodENoYXIsCiR0aGlzLT5jcm9zc2luZ0JvdHRvbU1pZENoYXIsCiR0aGlzLT5jcm9zc2luZ0JvdHRvbUxlZnRDaGFyLAokdGhpcy0+Y3Jvc3NpbmdNaWRMZWZ0Q2hhciwKJHRoaXMtPmNyb3NzaW5nVG9wTGVmdEJvdHRvbUNoYXIsCiR0aGlzLT5jcm9zc2luZ1RvcE1pZEJvdHRvbUNoYXIsCiR0aGlzLT5jcm9zc2luZ1RvcFJpZ2h0Qm90dG9tQ2hhciwKXTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q2VsbEhlYWRlckZvcm1hdChzdHJpbmcgJGNlbGxIZWFkZXJGb3JtYXQpCnsKJHRoaXMtPmNlbGxIZWFkZXJGb3JtYXQgPSAkY2VsbEhlYWRlckZvcm1hdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Q2VsbEhlYWRlckZvcm1hdCgpCnsKcmV0dXJuICR0aGlzLT5jZWxsSGVhZGVyRm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRDZWxsUm93Rm9ybWF0KHN0cmluZyAkY2VsbFJvd0Zvcm1hdCkKewokdGhpcy0+Y2VsbFJvd0Zvcm1hdCA9ICRjZWxsUm93Rm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsUm93Rm9ybWF0KCkKewpyZXR1cm4gJHRoaXMtPmNlbGxSb3dGb3JtYXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldENlbGxSb3dDb250ZW50Rm9ybWF0KHN0cmluZyAkY2VsbFJvd0NvbnRlbnRGb3JtYXQpCnsKJHRoaXMtPmNlbGxSb3dDb250ZW50Rm9ybWF0ID0gJGNlbGxSb3dDb250ZW50Rm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDZWxsUm93Q29udGVudEZvcm1hdCgpCnsKcmV0dXJuICR0aGlzLT5jZWxsUm93Q29udGVudEZvcm1hdDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Qm9yZGVyRm9ybWF0KHN0cmluZyAkYm9yZGVyRm9ybWF0KQp7CiR0aGlzLT5ib3JkZXJGb3JtYXQgPSAkYm9yZGVyRm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRCb3JkZXJGb3JtYXQoKQp7CnJldHVybiAkdGhpcy0+Ym9yZGVyRm9ybWF0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQYWRUeXBlKGludCAkcGFkVHlwZSkKewppZiAoIVxpbl9hcnJheSgkcGFkVHlwZSwgW1xTVFJfUEFEX0xFRlQsIFxTVFJfUEFEX1JJR0hULCBcU1RSX1BBRF9CT1RIXSwgdHJ1ZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBwYWRkaW5nIHR5cGUuIEV4cGVjdGVkIG9uZSBvZiAoU1RSX1BBRF9MRUZULCBTVFJfUEFEX1JJR0hULCBTVFJfUEFEX0JPVEgpLicpOwp9CgokdGhpcy0+cGFkVHlwZSA9ICRwYWRUeXBlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYWRUeXBlKCkKewpyZXR1cm4gJHRoaXMtPnBhZFR5cGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWFkZXJUaXRsZUZvcm1hdCgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPmhlYWRlclRpdGxlRm9ybWF0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGVhZGVyVGl0bGVGb3JtYXQoc3RyaW5nICRmb3JtYXQpOiBzZWxmCnsKJHRoaXMtPmhlYWRlclRpdGxlRm9ybWF0ID0gJGZvcm1hdDsKCnJldHVybiAkdGhpczsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEZvb3RlclRpdGxlRm9ybWF0KCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+Zm9vdGVyVGl0bGVGb3JtYXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb290ZXJUaXRsZUZvcm1hdChzdHJpbmcgJGZvcm1hdCk6IHNlbGYKewokdGhpcy0+Zm9vdGVyVGl0bGVGb3JtYXQgPSAkZm9ybWF0OwoKcmV0dXJuICR0aGlzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXElucHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgQXJndklucHV0IGV4dGVuZHMgSW5wdXQKewpwcml2YXRlICR0b2tlbnM7CnByaXZhdGUgJHBhcnNlZDsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/YXJyYXkgJGFyZ3YgPSBudWxsLCA/SW5wdXREZWZpbml0aW9uICRkZWZpbml0aW9uID0gbnVsbCkKewokYXJndiA9ICRhcmd2ID8/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+dG9rZW5zKTsKCnJldHVybiBpbXBsb2RlKCcgJywgJHRva2Vucyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZE9wdGlvbkV4Y2VwdGlvbjsKCgoKCgoKCgoKCmNsYXNzIEFycmF5SW5wdXQgZXh0ZW5kcyBJbnB1dAp7CnByaXZhdGUgJHBhcmFtZXRlcnM7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoYXJyYXkgJHBhcmFtZXRlcnMsID9JbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24gPSBudWxsKQp7CiR0aGlzLT5wYXJhbWV0ZXJzID0gJHBhcmFtZXRlcnM7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRkZWZpbml0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpcnN0QXJndW1lbnQoKQp7CmZvcmVhY2ggKCR0aGlzLT5wYXJhbWV0ZXJzIGFzICRwYXJhbSA9PiAkdmFsdWUpIHsKaWYgKCRwYXJhbSAmJiBcaXNfc3RyaW5nKCRwYXJhbSkgJiYgJy0nID09PSAkcGFyYW1bMF0pIHsKY29udGludWU7Cn0KCnJldHVybiAkdmFsdWU7Cn0KCnJldHVybiBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGFzUGFyYW1ldGVyT3B0aW9uKCR2YWx1ZXMsIGJvb2wgJG9ubHlQYXJhbXMgPSBmYWxzZSkKewokdmFsdWVzID0gKGFycmF5KSAkdmFsdWVzOwoKZm9yZWFjaCAoJHRoaXMtPnBhcmFtZXRlcnMgYXMgJGsgPT4gJHYpIHsKaWYgKCFcaXNfaW50KCRrKSkgewokdiA9ICRrOwp9CgppZiAoJG9ubHlQYXJhbXMgJiYgJy0tJyA9PT0gJHYpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoXGluX2FycmF5KCR2LCAkdmFsdWVzKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXJhbWV0ZXJPcHRpb24oJHZhbHVlcywgJGRlZmF1bHQgPSBmYWxzZSwgYm9vbCAkb25seVBhcmFtcyA9IGZhbHNlKQp7CiR2YWx1ZXMgPSAoYXJyYXkpICR2YWx1ZXM7Cgpmb3JlYWNoICgkdGhpcy0+cGFyYW1ldGVycyBhcyAkayA9PiAkdikgewppZiAoJG9ubHlQYXJhbXMgJiYgKCctLScgPT09ICRrIHx8IChcaXNfaW50KCRrKSAmJiAnLS0nID09PSAkdikpKSB7CnJldHVybiAkZGVmYXVsdDsKfQoKaWYgKFxpc19pbnQoJGspKSB7CmlmIChcaW5fYXJyYXkoJHYsICR2YWx1ZXMpKSB7CnJldHVybiB0cnVlOwp9Cn0gZWxzZWlmIChcaW5fYXJyYXkoJGssICR2YWx1ZXMpKSB7CnJldHVybiAkdjsKfQp9CgpyZXR1cm4gJGRlZmF1bHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKQp7CiRwYXJhbXMgPSBbXTsKZm9yZWFjaCAoJHRoaXMtPnBhcmFtZXRlcnMgYXMgJHBhcmFtID0+ICR2YWwpIHsKaWYgKCRwYXJhbSAmJiBcaXNfc3RyaW5nKCRwYXJhbSkgJiYgJy0nID09PSAkcGFyYW1bMF0pIHsKJGdsdWUgPSAoJy0nID09PSAkcGFyYW1bMV0pID8gJz0nIDogJyAnOwppZiAoXGlzX2FycmF5KCR2YWwpKSB7CmZvcmVhY2ggKCR2YWwgYXMgJHYpIHsKJHBhcmFtc1tdID0gJHBhcmFtLignJyAhPSAkdiA/ICRnbHVlLiR0aGlzLT5lc2NhcGVUb2tlbigkdikgOiAnJyk7Cn0KfSBlbHNlIHsKJHBhcmFtc1tdID0gJHBhcmFtLignJyAhPSAkdmFsID8gJGdsdWUuJHRoaXMtPmVzY2FwZVRva2VuKCR2YWwpIDogJycpOwp9Cn0gZWxzZSB7CiRwYXJhbXNbXSA9IFxpc19hcnJheSgkdmFsKSA/IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWyR0aGlzLCAnZXNjYXBlVG9rZW4nXSwgJHZhbCkpIDogJHRoaXMtPmVzY2FwZVRva2VuKCR2YWwpOwp9Cn0KCnJldHVybiBpbXBsb2RlKCcgJywgJHBhcmFtcyk7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZSgpCnsKZm9yZWFjaCAoJHRoaXMtPnBhcmFtZXRlcnMgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCctLScgPT09ICRrZXkpIHsKcmV0dXJuOwp9CmlmIChzdHJfc3RhcnRzX3dpdGgoJGtleSwgJy0tJykpIHsKJHRoaXMtPmFkZExvbmdPcHRpb24oc3Vic3RyKCRrZXksIDIpLCAkdmFsdWUpOwp9IGVsc2VpZiAoc3RyX3N0YXJ0c193aXRoKCRrZXksICctJykpIHsKJHRoaXMtPmFkZFNob3J0T3B0aW9uKHN1YnN0cigka2V5LCAxKSwgJHZhbHVlKTsKfSBlbHNlIHsKJHRoaXMtPmFkZEFyZ3VtZW50KCRrZXksICR2YWx1ZSk7Cn0KfQp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gYWRkU2hvcnRPcHRpb24oc3RyaW5nICRzaG9ydGN1dCwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc1Nob3J0Y3V0KCRzaG9ydGN1dCkpIHsKdGhyb3cgbmV3IEludmFsaWRPcHRpb25FeGNlcHRpb24oc3ByaW50ZignVGhlICItJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkc2hvcnRjdXQpKTsKfQoKJHRoaXMtPmFkZExvbmdPcHRpb24oJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbkZvclNob3J0Y3V0KCRzaG9ydGN1dCktPmdldE5hbWUoKSwgJHZhbHVlKTsKfQoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBhZGRMb25nT3B0aW9uKHN0cmluZyAkbmFtZSwgJHZhbHVlKQp7CmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkpIHsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzTmVnYXRpb24oJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkT3B0aW9uRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIGRvZXMgbm90IGV4aXN0LicsICRuYW1lKSk7Cn0KCiRvcHRpb25OYW1lID0gJHRoaXMtPmRlZmluaXRpb24tPm5lZ2F0aW9uVG9OYW1lKCRuYW1lKTsKJHRoaXMtPm9wdGlvbnNbJG9wdGlvbk5hbWVdID0gZmFsc2U7CgpyZXR1cm47Cn0KCiRvcHRpb24gPSAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uKCRuYW1lKTsKCmlmIChudWxsID09PSAkdmFsdWUpIHsKaWYgKCRvcHRpb24tPmlzVmFsdWVSZXF1aXJlZCgpKSB7CnRocm93IG5ldyBJbnZhbGlkT3B0aW9uRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiLS0lcyIgb3B0aW9uIHJlcXVpcmVzIGEgdmFsdWUuJywgJG5hbWUpKTsKfQoKaWYgKCEkb3B0aW9uLT5pc1ZhbHVlT3B0aW9uYWwoKSkgewokdmFsdWUgPSB0cnVlOwp9Cn0KCiR0aGlzLT5vcHRpb25zWyRuYW1lXSA9ICR2YWx1ZTsKfQoKCgoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGFkZEFyZ3VtZW50KCRuYW1lLCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJHRoaXMtPmFyZ3VtZW50c1skbmFtZV0gPSAkdmFsdWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgSW5wdXQgaW1wbGVtZW50cyBJbnB1dEludGVyZmFjZSwgU3RyZWFtYWJsZUlucHV0SW50ZXJmYWNlCnsKcHJvdGVjdGVkICRkZWZpbml0aW9uOwpwcm90ZWN0ZWQgJHN0cmVhbTsKcHJvdGVjdGVkICRvcHRpb25zID0gW107CnByb3RlY3RlZCAkYXJndW1lbnRzID0gW107CnByb3RlY3RlZCAkaW50ZXJhY3RpdmUgPSB0cnVlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9JbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24gPSBudWxsKQp7CmlmIChudWxsID09PSAkZGVmaW5pdGlvbikgewokdGhpcy0+ZGVmaW5pdGlvbiA9IG5ldyBJbnB1dERlZmluaXRpb24oKTsKfSBlbHNlIHsKJHRoaXMtPmJpbmQoJGRlZmluaXRpb24pOwokdGhpcy0+dmFsaWRhdGUoKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYmluZChJbnB1dERlZmluaXRpb24gJGRlZmluaXRpb24pCnsKJHRoaXMtPmFyZ3VtZW50cyA9IFtdOwokdGhpcy0+b3B0aW9ucyA9IFtdOwokdGhpcy0+ZGVmaW5pdGlvbiA9ICRkZWZpbml0aW9uOwoKJHRoaXMtPnBhcnNlKCk7Cn0KCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiBwYXJzZSgpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHZhbGlkYXRlKCkKewokZGVmaW5pdGlvbiA9ICR0aGlzLT5kZWZpbml0aW9uOwokZ2l2ZW5Bcmd1bWVudHMgPSAkdGhpcy0+YXJndW1lbnRzOwoKJG1pc3NpbmdBcmd1bWVudHMgPSBhcnJheV9maWx0ZXIoYXJyYXlfa2V5cygkZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnRzKCkpLCBmdW5jdGlvbiAoJGFyZ3VtZW50KSB1c2UgKCRkZWZpbml0aW9uLCAkZ2l2ZW5Bcmd1bWVudHMpIHsKcmV0dXJuICFcYXJyYXlfa2V5X2V4aXN0cygkYXJndW1lbnQsICRnaXZlbkFyZ3VtZW50cykgJiYgJGRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRhcmd1bWVudCktPmlzUmVxdWlyZWQoKTsKfSk7CgppZiAoXGNvdW50KCRtaXNzaW5nQXJndW1lbnRzKSA+IDApIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignTm90IGVub3VnaCBhcmd1bWVudHMgKG1pc3Npbmc6ICIlcyIpLicsIGltcGxvZGUoJywgJywgJG1pc3NpbmdBcmd1bWVudHMpKSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzSW50ZXJhY3RpdmUoKQp7CnJldHVybiAkdGhpcy0+aW50ZXJhY3RpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnRlcmFjdGl2ZShib29sICRpbnRlcmFjdGl2ZSkKewokdGhpcy0+aW50ZXJhY3RpdmUgPSAkaW50ZXJhY3RpdmU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRBcmd1bWVudHMoKQp7CnJldHVybiBhcnJheV9tZXJnZSgkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0QXJndW1lbnREZWZhdWx0cygpLCAkdGhpcy0+YXJndW1lbnRzKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEFyZ3VtZW50KHN0cmluZyAkbmFtZSkKewppZiAoISR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBhcmd1bWVudCBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgpyZXR1cm4gJHRoaXMtPmFyZ3VtZW50c1skbmFtZV0gPz8gJHRoaXMtPmRlZmluaXRpb24tPmdldEFyZ3VtZW50KCRuYW1lKS0+Z2V0RGVmYXVsdCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXJndW1lbnQoc3RyaW5nICRuYW1lLCAkdmFsdWUpCnsKaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzQXJndW1lbnQoJG5hbWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlICIlcyIgYXJndW1lbnQgZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKJHRoaXMtPmFyZ3VtZW50c1skbmFtZV0gPSAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNBcmd1bWVudChzdHJpbmcgJG5hbWUpCnsKcmV0dXJuICR0aGlzLT5kZWZpbml0aW9uLT5oYXNBcmd1bWVudCgkbmFtZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRPcHRpb25zKCkKewpyZXR1cm4gYXJyYXlfbWVyZ2UoJHRoaXMtPmRlZmluaXRpb24tPmdldE9wdGlvbkRlZmF1bHRzKCksICR0aGlzLT5vcHRpb25zKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wdGlvbihzdHJpbmcgJG5hbWUpCnsKaWYgKCR0aGlzLT5kZWZpbml0aW9uLT5oYXNOZWdhdGlvbigkbmFtZSkpIHsKaWYgKG51bGwgPT09ICR2YWx1ZSA9ICR0aGlzLT5nZXRPcHRpb24oJHRoaXMtPmRlZmluaXRpb24tPm5lZ2F0aW9uVG9OYW1lKCRuYW1lKSkpIHsKcmV0dXJuICR2YWx1ZTsKfQoKcmV0dXJuICEkdmFsdWU7Cn0KCmlmICghJHRoaXMtPmRlZmluaXRpb24tPmhhc09wdGlvbigkbmFtZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzIiBvcHRpb24gZG9lcyBub3QgZXhpc3QuJywgJG5hbWUpKTsKfQoKcmV0dXJuIFxhcnJheV9rZXlfZXhpc3RzKCRuYW1lLCAkdGhpcy0+b3B0aW9ucykgPyAkdGhpcy0+b3B0aW9uc1skbmFtZV0gOiAkdGhpcy0+ZGVmaW5pdGlvbi0+Z2V0T3B0aW9uKCRuYW1lKS0+Z2V0RGVmYXVsdCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9uKHN0cmluZyAkbmFtZSwgJHZhbHVlKQp7CmlmICgkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzTmVnYXRpb24oJG5hbWUpKSB7CiR0aGlzLT5vcHRpb25zWyR0aGlzLT5kZWZpbml0aW9uLT5uZWdhdGlvblRvTmFtZSgkbmFtZSldID0gISR2YWx1ZTsKCnJldHVybjsKfSBlbHNlaWYgKCEkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIG9wdGlvbiBkb2VzIG5vdCBleGlzdC4nLCAkbmFtZSkpOwp9CgokdGhpcy0+b3B0aW9uc1skbmFtZV0gPSAkdmFsdWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXNPcHRpb24oc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzT3B0aW9uKCRuYW1lKSB8fCAkdGhpcy0+ZGVmaW5pdGlvbi0+aGFzTmVnYXRpb24oJG5hbWUpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBlc2NhcGVUb2tlbihzdHJpbmcgJHRva2VuKQp7CnJldHVybiBwcmVnX21hdGNoKCd7Xltcdy1dKyR9JywgJHRva2VuKSA/ICR0b2tlbiA6IGVzY2FwZXNoZWxsYXJnKCR0b2tlbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRTdHJlYW0oJHN0cmVhbSkKewokdGhpcy0+c3RyZWFtID0gJHN0cmVhbTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbSgpCnsKcmV0dXJuICR0aGlzLT5zdHJlYW07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cTG9naWNFeGNlcHRpb247CgoKCgoKCmNsYXNzIElucHV0QXJndW1lbnQKewpwdWJsaWMgY29uc3QgUkVRVUlSRUQgPSAxOwpwdWJsaWMgY29uc3QgT1BUSU9OQUwgPSAyOwpwdWJsaWMgY29uc3QgSVNfQVJSQVkgPSA0OwoKcHJpdmF0ZSAkbmFtZTsKcHJpdmF0ZSAkbW9kZTsKcHJpdmF0ZSAkZGVmYXVsdDsKcHJpdmF0ZSAkZGVzY3JpcHRpb247CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJG5hbWUsID9pbnQgJG1vZGUgPSBudWxsLCBzdHJpbmcgJGRlc2NyaXB0aW9uID0gJycsICRkZWZhdWx0ID0gbnVsbCkKewppZiAobnVsbCA9PT0gJG1vZGUpIHsKJG1vZGUgPSBzZWxmOjpPUFRJT05BTDsKfSBlbHNlaWYgKCRtb2RlID4gNyB8fCAkbW9kZSA8IDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdBcmd1bWVudCBtb2RlICIlcyIgaXMgbm90IHZhbGlkLicsICRtb2RlKSk7Cn0KCiR0aGlzLT5uYW1lID0gJG5hbWU7CiR0aGlzLT5tb2RlID0gJG1vZGU7CiR0aGlzLT5kZXNjcmlwdGlvbiA9ICRkZXNjcmlwdGlvbjsKCiR0aGlzLT5zZXREZWZhdWx0KCRkZWZhdWx0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpCnsKcmV0dXJuICR0aGlzLT5uYW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1JlcXVpcmVkKCkKewpyZXR1cm4gc2VsZjo6UkVRVUlSRUQgPT09IChzZWxmOjpSRVFVSVJFRCAmICR0aGlzLT5tb2RlKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNBcnJheSgpCnsKcmV0dXJuIHNlbGY6OklTX0FSUkFZID09PSAoc2VsZjo6SVNfQVJSQVkgJiAkdGhpcy0+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/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxMb2dpY0V4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgSW5wdXRPcHRpb24KewoKCgpwdWJsaWMgY29uc3QgVkFMVUVfTk9ORSA9IDE7CgoKCgpwdWJsaWMgY29uc3QgVkFMVUVfUkVRVUlSRUQgPSAyOwoKCgoKcHVibGljIGNvbnN0IFZBTFVFX09QVElPTkFMID0gNDsKCgoKCnB1YmxpYyBjb25zdCBWQUxVRV9JU19BUlJBWSA9IDg7CgoKCgpwdWJsaWMgY29uc3QgVkFMVUVfTkVHQVRBQkxFID0gMTY7Cgpwcml2YXRlICRuYW1lOwpwcml2YXRlICRzaG9ydGN1dDsKcHJpdmF0ZSAkbW9kZTsKcHJpdmF0ZSAkZGVmYXVsdDsKcHJpdmF0ZSAkZGVzY3JpcHRpb247CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSwgJHNob3J0Y3V0ID0gbnVsbCwgP2ludCAkbW9kZSA9IG51bGwsIHN0cmluZyAkZGVzY3JpcHRpb24gPSAnJywgJGRlZmF1bHQgPSBudWxsKQp7CmlmIChzdHJfc3RhcnRzX3dpdGgoJG5hbWUsICctLScpKSB7CiRuYW1lID0gc3Vic3RyKCRuYW1lLCAyKTsKfQoKaWYgKGVtcHR5KCRuYW1lKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdBbiBvcHRpb24gbmFtZSBjYW5ub3QgYmUgZW1wdHkuJyk7Cn0KCmlmICgnJyA9PT0gJHNob3J0Y3V0IHx8IFtdID09PSAkc2hvcnRjdXQgfHwgZmFsc2UgPT09ICRzaG9ydGN1dCkgewokc2hvcnRjdXQgPSBudWxsOwp9CgppZiAobnVsbCAhPT0gJHNob3J0Y3V0KSB7CmlmIChcaXNfYXJyYXkoJHNob3J0Y3V0KSkgewokc2hvcnRjdXQgPSBpbXBsb2RlKCd8JywgJHNob3J0Y3V0KTsKfQokc2hvcnRjdXRzID0gcHJlZ19zcGxpdCgneyhcfCktP30nLCBsdHJpbSgkc2hvcnRjdXQsICctJykpOwokc2hvcnRjdXRzID0gYXJyYXlfZmlsdGVyKCRzaG9ydGN1dHMsICdzdHJsZW4nKTsKJHNob3J0Y3V0ID0gaW1wbG9kZSgnfCcsICRzaG9ydGN1dHMpOwoKaWYgKCcnID09PSAkc2hvcnRjdXQpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignQW4gb3B0aW9uIHNob3J0Y3V0IGNhbm5vdCBiZSBlbXB0eS4nKTsKfQp9CgppZiAobnVsbCA9PT0gJG1vZGUpIHsKJG1vZGUgPSBzZWxmOjpWQUxVRV9OT05FOwp9IGVsc2VpZiAoJG1vZGUgPj0gKHNlbGY6OlZBTFVFX05FR0FUQUJMRSA8PCAxKSB8fCAkbW9kZSA8IDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdPcHRpb24gbW9kZSAiJXMiIGlzIG5vdCB2YWxpZC4nLCAkbW9kZSkpOwp9CgokdGhpcy0+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/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCgpjbGFzcyBDb25zb2xlT3V0cHV0IGV4dGVuZHMgU3RyZWFtT3V0cHV0IGltcGxlbWVudHMgQ29uc29sZU91dHB1dEludGVyZmFjZQp7CnByaXZhdGUgJHN0ZGVycjsKcHJpdmF0ZSAkY29uc29sZVNlY3Rpb25PdXRwdXRzID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJHZlcmJvc2l0eSA9IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwsID9ib29sICRkZWNvcmF0ZWQgPSBudWxsLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CnBhcmVudDo6X19jb25zdHJ1Y3QoJHRoaXMtPm9wZW5PdXRwdXRTdHJlYW0oKSwgJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7CgppZiAobnVsbCA9PT0gJGZvcm1hdHRlcikgewoKJHRoaXMtPnN0ZGVyciA9IG5ldyBTdHJlYW1PdXRwdXQoJHRoaXMtPm9wZW5FcnJvclN0cmVhbSgpLCAkdmVyYm9zaXR5LCAkZGVjb3JhdGVkKTsKCnJldHVybjsKfQoKJGFjdHVhbERlY29yYXRlZCA9ICR0aGlzLT5pc0RlY29yYXRlZCgpOwokdGhpcy0+c3RkZXJyID0gbmV3IFN0cmVhbU91dHB1dCgkdGhpcy0+b3BlbkVycm9yU3RyZWFtKCksICR2ZXJib3NpdHksICRkZWNvcmF0ZWQsICR0aGlzLT5nZXRGb3JtYXR0ZXIoKSk7CgppZiAobnVsbCA9PT0gJGRlY29yYXRlZCkgewokdGhpcy0+c2V0RGVjb3JhdGVkKCRhY3R1YWxEZWNvcmF0ZWQgJiYgJHRoaXMtPnN0ZGVyci0+aXNEZWNvcmF0ZWQoKSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNlY3Rpb24oKTogQ29uc29sZVNlY3Rpb25PdXRwdXQKewpyZXR1cm4gbmV3IENvbnNvbGVTZWN0aW9uT3V0cHV0KCR0aGlzLT5nZXRTdHJlYW0oKSwgJHRoaXMtPmNvbnNvbGVTZWN0aW9uT3V0cHV0cywgJHRoaXMtPmdldFZlcmJvc2l0eSgpLCAkdGhpcy0+aXNEZWNvcmF0ZWQoKSwgJHRoaXMtPmdldEZvcm1hdHRlcigpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpCnsKcGFyZW50OjpzZXREZWNvcmF0ZWQoJGRlY29yYXRlZCk7CiR0aGlzLT5zdGRlcnItPnNldERlY29yYXRlZCgkZGVjb3JhdGVkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcm1hdHRlcihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlcikKewpwYXJlbnQ6OnNldEZvcm1hdHRlcigkZm9ybWF0dGVyKTsKJHRoaXMtPnN0ZGVyci0+c2V0Rm9ybWF0dGVyKCRmb3JtYXR0ZXIpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyYm9zaXR5KGludCAkbGV2ZWwpCnsKcGFyZW50OjpzZXRWZXJib3NpdHkoJGxldmVsKTsKJHRoaXMtPnN0ZGVyci0+c2V0VmVyYm9zaXR5KCRsZXZlbCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpCnsKcmV0dXJuICR0aGlzLT5zdGRlcnI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvck91dHB1dChPdXRwdXRJbnRlcmZhY2UgJGVycm9yKQp7CiR0aGlzLT5zdGRlcnIgPSAkZXJyb3I7Cn0KCgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBoYXNTdGRvdXRTdXBwb3J0KCkKewpyZXR1cm4gZmFsc2UgPT09ICR0aGlzLT5pc1J1bm5pbmdPUzQwMCgpOwp9CgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gaGFzU3RkZXJyU3VwcG9ydCgpCnsKcmV0dXJuIGZhbHNlID09PSAkdGhpcy0+aXNSdW5uaW5nT1M0MDAoKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gaXNSdW5uaW5nT1M0MDAoKTogYm9vbAp7CiRjaGVja3MgPSBbClxmdW5jdGlvbl9leGlzdHMoJ3BocF91bmFtZScpID8gcGhwX3VuYW1lKCdzJykgOiAnJywKZ2V0ZW52KCdPU1RZUEUnKSwKXFBIUF9PUywKXTsKCnJldHVybiBmYWxzZSAhPT0gc3RyaXBvcyhpbXBsb2RlKCc7JywgJGNoZWNrcyksICdPUzQwMCcpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG9wZW5PdXRwdXRTdHJlYW0oKQp7CmlmICghJHRoaXMtPmhhc1N0ZG91dFN1cHBvcnQoKSkgewpyZXR1cm4gZm9wZW4oJ3BocDovL291dHB1dCcsICd3Jyk7Cn0KCgpyZXR1cm4gXGRlZmluZWQoJ1NURE9VVCcpID8gXFNURE9VVCA6IChAZm9wZW4oJ3BocDovL3N0ZG91dCcsICd3JykgPzogZm9wZW4oJ3BocDovL291dHB1dCcsICd3JykpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIG9wZW5FcnJvclN0cmVhbSgpCnsKaWYgKCEkdGhpcy0+aGFzU3RkZXJyU3VwcG9ydCgpKSB7CnJldHVybiBmb3BlbigncGhwOi8vb3V0cHV0JywgJ3cnKTsKfQoKCnJldHVybiBcZGVmaW5lZCgnU1RERVJSJykgPyBcU1RERVJSIDogKEBmb3BlbigncGhwOi8vc3RkZXJyJywgJ3cnKSA/OiBmb3BlbigncGhwOi8vb3V0cHV0JywgJ3cnKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKCgoKCgoKaW50ZXJmYWNlIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UgZXh0ZW5kcyBPdXRwdXRJbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck91dHB1dCgpOwoKcHVibGljIGZ1bmN0aW9uIHNldEVycm9yT3V0cHV0KE91dHB1dEludGVyZmFjZSAkZXJyb3IpOwoKcHVibGljIGZ1bmN0aW9uIHNlY3Rpb24oKTogQ29uc29sZVNlY3Rpb25PdXRwdXQ7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dDsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEZvcm1hdHRlclxPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxIZWxwZXI7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlcm1pbmFsOwoKCgoKCmNsYXNzIENvbnNvbGVTZWN0aW9uT3V0cHV0IGV4dGVuZHMgU3RyZWFtT3V0cHV0CnsKcHJpdmF0ZSAkY29udGVudCA9IFtdOwpwcml2YXRlICRsaW5lcyA9IDA7CnByaXZhdGUgJHNlY3Rpb25zOwpwcml2YXRlICR0ZXJtaW5hbDsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJHN0cmVhbSwgYXJyYXkgJiRzZWN0aW9ucywgaW50ICR2ZXJib3NpdHksIGJvb2wgJGRlY29yYXRlZCwgT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkc3RyZWFtLCAkdmVyYm9zaXR5LCAkZGVjb3JhdGVkLCAkZm9ybWF0dGVyKTsKYXJyYXlfdW5zaGlmdCgkc2VjdGlvbnMsICR0aGlzKTsKJHRoaXMtPnNlY3Rpb25zID0gJiRzZWN0aW9uczsKJHRoaXMtPnRlcm1pbmFsID0gbmV3IFRlcm1pbmFsKCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNsZWFyKD9pbnQgJGxpbmVzID0gbnVsbCkKewppZiAoZW1wdHkoJHRoaXMtPmNvbnRlbnQpIHx8ICEkdGhpcy0+aXNEZWNvcmF0ZWQoKSkgewpyZXR1cm47Cn0KCmlmICgkbGluZXMpIHsKYXJyYXlfc3BsaWNlKCR0aGlzLT5jb250ZW50LCAtKCRsaW5lcyAqIDIpKTsgCn0gZWxzZSB7CiRsaW5lcyA9ICR0aGlzLT5saW5lczsKJHRoaXMtPmNvbnRlbnQgPSBbXTsKfQoKJHRoaXMtPmxpbmVzIC09ICRsaW5lczsKCnBhcmVudDo6ZG9Xcml0ZSgkdGhpcy0+cG9wU3RyZWFtQ29udGVudFVudGlsQ3VycmVudFNlY3Rpb24oJGxpbmVzKSwgZmFsc2UpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBvdmVyd3JpdGUoJG1lc3NhZ2UpCnsKJHRoaXMtPmNsZWFyKCk7CiR0aGlzLT53cml0ZWxuKCRtZXNzYWdlKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldENvbnRlbnQoKTogc3RyaW5nCnsKcmV0dXJuIGltcGxvZGUoJycsICR0aGlzLT5jb250ZW50KTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZENvbnRlbnQoc3RyaW5nICRpbnB1dCkKewpmb3JlYWNoIChleHBsb2RlKFxQSFBfRU9MLCAkaW5wdXQpIGFzICRsaW5lQ29udGVudCkgewokdGhpcy0+bGluZXMgKz0gY2VpbCgkdGhpcy0+Z2V0RGlzcGxheUxlbmd0aCgkbGluZUNvbnRlbnQpIC8gJHRoaXMtPnRlcm1pbmFsLT5nZXRXaWR0aCgpKSA/OiAxOwokdGhpcy0+Y29udGVudFtdID0gJGxpbmVDb250ZW50OwokdGhpcy0+Y29udGVudFtdID0gXFBIUF9FT0w7Cn0KfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGRvV3JpdGUoc3RyaW5nICRtZXNzYWdlLCBib29sICRuZXdsaW5lKQp7CmlmICghJHRoaXMtPmlzRGVjb3JhdGVkKCkpIHsKcGFyZW50Ojpkb1dyaXRlKCRtZXNzYWdlLCAkbmV3bGluZSk7CgpyZXR1cm47Cn0KCiRlcmFzZWRDb250ZW50ID0gJHRoaXMtPnBvcFN0cmVhbUNvbnRlbnRVbnRpbEN1cnJlbnRTZWN0aW9uKCk7CgokdGhpcy0+YWRkQ29udGVudCgkbWVzc2FnZSk7CgpwYXJlbnQ6OmRvV3JpdGUoJG1lc3NhZ2UsIHRydWUpOwpwYXJlbnQ6OmRvV3JpdGUoJGVyYXNlZENvbnRlbnQsIGZhbHNlKTsKfQoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcG9wU3RyZWFtQ29udGVudFVudGlsQ3VycmVudFNlY3Rpb24oaW50ICRudW1iZXJPZkxpbmVzVG9DbGVhckZyb21DdXJyZW50U2VjdGlvbiA9IDApOiBzdHJpbmcKewokbnVtYmVyT2ZMaW5lc1RvQ2xlYXIgPSAkbnVtYmVyT2ZMaW5lc1RvQ2xlYXJGcm9tQ3VycmVudFNlY3Rpb247CiRlcmFzZWRDb250ZW50ID0gW107Cgpmb3JlYWNoICgkdGhpcy0+c2VjdGlvbnMgYXMgJHNlY3Rpb24pIHsKaWYgKCRzZWN0aW9uID09PSAkdGhpcykgewpicmVhazsKfQoKJG51bWJlck9mTGluZXNUb0NsZWFyICs9ICRzZWN0aW9uLT5saW5lczsKJGVyYXNlZENvbnRlbnRbXSA9ICRzZWN0aW9uLT5nZXRDb250ZW50KCk7Cn0KCmlmICgkbnVtYmVyT2ZMaW5lc1RvQ2xlYXIgPiAwKSB7CgpwYXJlbnQ6OmRvV3JpdGUoc3ByaW50ZigiXHgxYlslZEEiLCAkbnVtYmVyT2ZMaW5lc1RvQ2xlYXIpLCBmYWxzZSk7CgpwYXJlbnQ6OmRvV3JpdGUoIlx4MWJbMEoiLCBmYWxzZSk7Cn0KCnJldHVybiBpbXBsb2RlKCcnLCBhcnJheV9yZXZlcnNlKCRlcmFzZWRDb250ZW50KSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGlzcGxheUxlbmd0aChzdHJpbmcgJHRleHQpOiBpbnQKewpyZXR1cm4gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCBzdHJfcmVwbGFjZSgiXHQiLCAnICAgICAgICAnLCAkdGV4dCkpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcTnVsbE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKCgoKY2xhc3MgTnVsbE91dHB1dCBpbXBsZW1lbnRzIE91dHB1dEludGVyZmFjZQp7CnByaXZhdGUgJGZvcm1hdHRlcjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRGb3JtYXR0ZXIoT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIpCnsKCn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoKQp7CmlmICgkdGhpcy0+Zm9ybWF0dGVyKSB7CnJldHVybiAkdGhpcy0+Zm9ybWF0dGVyOwp9CgpyZXR1cm4gJHRoaXMtPmZvcm1hdHRlciA9IG5ldyBOdWxsT3V0cHV0Rm9ybWF0dGVyKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyYm9zaXR5KCkKewpyZXR1cm4gc2VsZjo6VkVSQk9TSVRZX1FVSUVUOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNRdWlldCgpCnsKcmV0dXJuIHRydWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKQp7CnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlbG4oJG1lc3NhZ2VzLCBpbnQgJG9wdGlvbnMgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7Cgp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkb3B0aW9ucyA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKCn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0OwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKCgoKCgoKCgoKCgoKCgphYnN0cmFjdCBjbGFzcyBPdXRwdXQgaW1wbGVtZW50cyBPdXRwdXRJbnRlcmZhY2UKewpwcml2YXRlICR2ZXJib3NpdHk7CnByaXZhdGUgJGZvcm1hdHRlcjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9pbnQgJHZlcmJvc2l0eSA9IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUwsIGJvb2wgJGRlY29yYXRlZCA9IGZhbHNlLCA/T3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlICRmb3JtYXR0ZXIgPSBudWxsKQp7CiR0aGlzLT52ZXJib3NpdHkgPSAkdmVyYm9zaXR5ID8/IHNlbGY6OlZFUkJPU0lUWV9OT1JNQUw7CiR0aGlzLT5mb3JtYXR0ZXIgPSAkZm9ybWF0dGVyID8/IG5ldyBPdXRwdXRGb3JtYXR0ZXIoKTsKJHRoaXMtPmZvcm1hdHRlci0+c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0dGVyKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKQp7CiR0aGlzLT5mb3JtYXR0ZXIgPSAkZm9ybWF0dGVyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0Rm9ybWF0dGVyKCkKewpyZXR1cm4gJHRoaXMtPmZvcm1hdHRlcjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldERlY29yYXRlZChib29sICRkZWNvcmF0ZWQpCnsKJHRoaXMtPmZvcm1hdHRlci0+c2V0RGVjb3JhdGVkKCRkZWNvcmF0ZWQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNEZWNvcmF0ZWQoKQp7CnJldHVybiAkdGhpcy0+Zm9ybWF0dGVyLT5pc0RlY29yYXRlZCgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyYm9zaXR5KGludCAkbGV2ZWwpCnsKJHRoaXMtPnZlcmJvc2l0eSA9ICRsZXZlbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFZlcmJvc2l0eSgpCnsKcmV0dXJuICR0aGlzLT52ZXJib3NpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1F1aWV0KCkKewpyZXR1cm4gc2VsZjo6VkVSQk9TSVRZX1FVSUVUID09PSAkdGhpcy0+dmVyYm9zaXR5Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNWZXJib3NlKCkKewpyZXR1cm4gc2VsZjo6VkVSQk9TSVRZX1ZFUkJPU0UgPD0gJHRoaXMtPnZlcmJvc2l0eTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKQp7CnJldHVybiBzZWxmOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFIDw9ICR0aGlzLT52ZXJib3NpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCkKewpyZXR1cm4gc2VsZjo6VkVSQk9TSVRZX0RFQlVHIDw9ICR0aGlzLT52ZXJib3NpdHk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZWxuKCRtZXNzYWdlcywgaW50ICRvcHRpb25zID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewokdGhpcy0+d3JpdGUoJG1lc3NhZ2VzLCB0cnVlLCAkb3B0aW9ucyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkbWVzc2FnZXMsIGJvb2wgJG5ld2xpbmUgPSBmYWxzZSwgaW50ICRvcHRpb25zID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewppZiAoIWlzX2l0ZXJhYmxlKCRtZXNzYWdlcykpIHsKJG1lc3NhZ2VzID0gWyRtZXNzYWdlc107Cn0KCiR0eXBlcyA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwgfCBzZWxmOjpPVVRQVVRfUkFXIHwgc2VsZjo6T1VUUFVUX1BMQUlOOwokdHlwZSA9ICR0eXBlcyAmICRvcHRpb25zID86IHNlbGY6Ok9VVFBVVF9OT1JNQUw7CgokdmVyYm9zaXRpZXMgPSBzZWxmOjpWRVJCT1NJVFlfUVVJRVQgfCBzZWxmOjpWRVJCT1NJVFlfTk9STUFMIHwgc2VsZjo6VkVSQk9TSVRZX1ZFUkJPU0UgfCBzZWxmOjpWRVJCT1NJVFlfVkVSWV9WRVJCT1NFIHwgc2VsZjo6VkVSQk9TSVRZX0RFQlVHOwokdmVyYm9zaXR5ID0gJHZlcmJvc2l0aWVzICYgJG9wdGlvbnMgPzogc2VsZjo6VkVSQk9TSVRZX05PUk1BTDsKCmlmICgkdmVyYm9zaXR5ID4gJHRoaXMtPmdldFZlcmJvc2l0eSgpKSB7CnJldHVybjsKfQoKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRtZXNzYWdlKSB7CnN3aXRjaCAoJHR5cGUpIHsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9OT1JNQUw6CiRtZXNzYWdlID0gJHRoaXMtPmZvcm1hdHRlci0+Zm9ybWF0KCRtZXNzYWdlKTsKYnJlYWs7CmNhc2UgT3V0cHV0SW50ZXJmYWNlOjpPVVRQVVRfUkFXOgpicmVhazsKY2FzZSBPdXRwdXRJbnRlcmZhY2U6Ok9VVFBVVF9QTEFJTjoKJG1lc3NhZ2UgPSBzdHJpcF90YWdzKCR0aGlzLT5mb3JtYXR0ZXItPmZvcm1hdCgkbWVzc2FnZSkpOwpicmVhazsKfQoKJHRoaXMtPmRvV3JpdGUoJG1lc3NhZ2UgPz8gJycsICRuZXdsaW5lKTsKfQp9CgoKCgphYnN0cmFjdCBwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Xcml0ZShzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld2xpbmUpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgppbnRlcmZhY2UgT3V0cHV0SW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IFZFUkJPU0lUWV9RVUlFVCA9IDE2OwpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX05PUk1BTCA9IDMyOwpwdWJsaWMgY29uc3QgVkVSQk9TSVRZX1ZFUkJPU0UgPSA2NDsKcHVibGljIGNvbnN0IFZFUkJPU0lUWV9WRVJZX1ZFUkJPU0UgPSAxMjg7CnB1YmxpYyBjb25zdCBWRVJCT1NJVFlfREVCVUcgPSAyNTY7CgpwdWJsaWMgY29uc3QgT1VUUFVUX05PUk1BTCA9IDE7CnB1YmxpYyBjb25zdCBPVVRQVVRfUkFXID0gMjsKcHVibGljIGNvbnN0IE9VVFBVVF9QTEFJTiA9IDQ7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJG9wdGlvbnMgPSAwKTsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZWxuKCRtZXNzYWdlcywgaW50ICRvcHRpb25zID0gMCk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyYm9zaXR5KGludCAkbGV2ZWwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyYm9zaXR5KCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1F1aWV0KCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVidWcoKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCk7CgpwdWJsaWMgZnVuY3Rpb24gc2V0Rm9ybWF0dGVyKE91dHB1dEZvcm1hdHRlckludGVyZmFjZSAkZm9ybWF0dGVyKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZvcm1hdHRlcigpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgoKCgoKCgoKCmNsYXNzIFN0cmVhbU91dHB1dCBleHRlbmRzIE91dHB1dAp7CnByaXZhdGUgJHN0cmVhbTsKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRzdHJlYW0sIGludCAkdmVyYm9zaXR5ID0gc2VsZjo6VkVSQk9TSVRZX05PUk1BTCwgP2Jvb2wgJGRlY29yYXRlZCA9IG51bGwsID9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKaWYgKCFcaXNfcmVzb3VyY2UoJHN0cmVhbSkgfHwgJ3N0cmVhbScgIT09IGdldF9yZXNvdXJjZV90eXBlKCRzdHJlYW0pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBTdHJlYW1PdXRwdXQgY2xhc3MgbmVlZHMgYSBzdHJlYW0gYXMgaXRzIGZpcnN0IGFyZ3VtZW50LicpOwp9CgokdGhpcy0+c3RyZWFtID0gJHN0cmVhbTsKCmlmIChudWxsID09PSAkZGVjb3JhdGVkKSB7CiRkZWNvcmF0ZWQgPSAkdGhpcy0+aGFzQ29sb3JTdXBwb3J0KCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHZlcmJvc2l0eSwgJGRlY29yYXRlZCwgJGZvcm1hdHRlcik7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0cmVhbSgpCnsKcmV0dXJuICR0aGlzLT5zdHJlYW07Cn0KCnByb3RlY3RlZCBmdW5jdGlvbiBkb1dyaXRlKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3bGluZSkKewppZiAoJG5ld2xpbmUpIHsKJG1lc3NhZ2UgLj0gXFBIUF9FT0w7Cn0KCkBmd3JpdGUoJHRoaXMtPnN0cmVhbSwgJG1lc3NhZ2UpOwoKZmZsdXNoKCR0aGlzLT5zdHJlYW0pOwp9CgoKCgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc0NvbG9yU3VwcG9ydCgpCnsKCmlmICgnJyAhPT0gKCgkX1NFUlZFUlsnTk9fQ09MT1InXSA/PyBnZXRlbnYoJ05PX0NPTE9SJykpWzBdID8/ICcnKSkgewpyZXR1cm4gZmFsc2U7Cn0KCgoKaWYgKCFAc3RyZWFtX2lzYXR0eSgkdGhpcy0+c3RyZWFtKSAmJiAhXGluX2FycmF5KHN0cnRvdXBwZXIoKHN0cmluZykgZ2V0ZW52KCdNU1lTVEVNJykpLCBbJ01JTkdXMzInLCAnTUlOR1c2NCddLCB0cnVlKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBAc2FwaV93aW5kb3dzX3Z0MTAwX3N1cHBvcnQoJHRoaXMtPnN0cmVhbSkpIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnSHlwZXInID09PSBnZXRlbnYoJ1RFUk1fUFJPR1JBTScpCnx8IGZhbHNlICE9PSBnZXRlbnYoJ0NPTE9SVEVSTScpCnx8IGZhbHNlICE9PSBnZXRlbnYoJ0FOU0lDT04nKQp8fCAnT04nID09PSBnZXRlbnYoJ0NvbkVtdUFOU0knKQopIHsKcmV0dXJuIHRydWU7Cn0KCmlmICgnZHVtYicgPT09ICR0ZXJtID0gKHN0cmluZykgZ2V0ZW52KCdURVJNJykpIHsKcmV0dXJuIGZhbHNlOwp9CgoKcmV0dXJuIHByZWdfbWF0Y2goJy9eKChzY3JlZW58eHRlcm18dnQxMDB8dnQyMjB8cHV0dHl8cnh2dHxhbnNpfGN5Z3dpbnxsaW51eCkuKil8KC4qLTI1Nihjb2xvcik/KC1iY2UpPykkLycsICR0ZXJtKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXQ7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxGb3JtYXR0ZXJcT3V0cHV0Rm9ybWF0dGVySW50ZXJmYWNlOwoKCgoKCgpjbGFzcyBUcmltbWVkQnVmZmVyT3V0cHV0IGV4dGVuZHMgT3V0cHV0CnsKcHJpdmF0ZSAkbWF4TGVuZ3RoOwpwcml2YXRlICRidWZmZXIgPSAnJzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJG1heExlbmd0aCwgP2ludCAkdmVyYm9zaXR5ID0gc2VsZjo6VkVSQk9TSVRZX05PUk1BTCwgYm9vbCAkZGVjb3JhdGVkID0gZmFsc2UsID9PdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlciA9IG51bGwpCnsKaWYgKCRtYXhMZW5ndGggPD0gMCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJyIlcygpIiBleHBlY3RzIGEgc3RyaWN0bHkgcG9zaXRpdmUgbWF4TGVuZ3RoLiBHb3QgJWQuJywgX19NRVRIT0RfXywgJG1heExlbmd0aCkpOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR2ZXJib3NpdHksICRkZWNvcmF0ZWQsICRmb3JtYXR0ZXIpOwokdGhpcy0+bWF4TGVuZ3RoID0gJG1heExlbmd0aDsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmV0Y2goKQp7CiRjb250ZW50ID0gJHRoaXMtPmJ1ZmZlcjsKJHRoaXMtPmJ1ZmZlciA9ICcnOwoKcmV0dXJuICRjb250ZW50Owp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZG9Xcml0ZShzdHJpbmcgJG1lc3NhZ2UsIGJvb2wgJG5ld2xpbmUpCnsKJHRoaXMtPmJ1ZmZlciAuPSAkbWVzc2FnZTsKCmlmICgkbmV3bGluZSkgewokdGhpcy0+YnVmZmVyIC49IFxQSFBfRU9MOwp9CgokdGhpcy0+YnVmZmVyID0gc3Vic3RyKCR0aGlzLT5idWZmZXIsIDAgLSAkdGhpcy0+bWF4TGVuZ3RoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCmNsYXNzIENob2ljZVF1ZXN0aW9uIGV4dGVuZHMgUXVlc3Rpb24Kewpwcml2YXRlICRjaG9pY2VzOwpwcml2YXRlICRtdWx0aXNlbGVjdCA9IGZhbHNlOwpwcml2YXRlICRwcm9tcHQgPSAnID4gJzsKcHJpdmF0ZSAkZXJyb3JNZXNzYWdlID0gJ1ZhbHVlICIlcyIgaXMgaW52YWxpZCc7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHF1ZXN0aW9uLCBhcnJheSAkY2hvaWNlcywgJGRlZmF1bHQgPSBudWxsKQp7CmlmICghJGNob2ljZXMpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignQ2hvaWNlIHF1ZXN0aW9uIG11c3QgaGF2ZSBhdCBsZWFzdCAxIGNob2ljZSBhdmFpbGFibGUuJyk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHF1ZXN0aW9uLCAkZGVmYXVsdCk7CgokdGhpcy0+Y2hvaWNlcyA9ICRjaG9pY2VzOwokdGhpcy0+c2V0VmFsaWRhdG9yKCR0aGlzLT5nZXREZWZhdWx0VmFsaWRhdG9yKCkpOwokdGhpcy0+c2V0QXV0b2NvbXBsZXRlclZhbHVlcygkY2hvaWNlcyk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldENob2ljZXMoKQp7CnJldHVybiAkdGhpcy0+Y2hvaWNlczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNdWx0aXNlbGVjdChib29sICRtdWx0aXNlbGVjdCkKewokdGhpcy0+bXVsdGlzZWxlY3QgPSAkbXVsdGlzZWxlY3Q7CiR0aGlzLT5zZXRWYWxpZGF0b3IoJHRoaXMtPmdldERlZmF1bHRWYWxpZGF0b3IoKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzTXVsdGlzZWxlY3QoKQp7CnJldHVybiAkdGhpcy0+bXVsdGlzZWxlY3Q7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFByb21wdCgpCnsKcmV0dXJuICR0aGlzLT5wcm9tcHQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFByb21wdChzdHJpbmcgJHByb21wdCkKewokdGhpcy0+cHJvbXB0ID0gJHByb21wdDsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRFcnJvck1lc3NhZ2Uoc3RyaW5nICRlcnJvck1lc3NhZ2UpCnsKJHRoaXMtPmVycm9yTWVzc2FnZSA9ICRlcnJvck1lc3NhZ2U7CiR0aGlzLT5zZXRWYWxpZGF0b3IoJHRoaXMtPmdldERlZmF1bHRWYWxpZGF0b3IoKSk7CgpyZXR1cm4gJHRoaXM7Cn0KCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdFZhbGlkYXRvcigpOiBjYWxsYWJsZQp7CiRjaG9pY2VzID0gJHRoaXMtPmNob2ljZXM7CiRlcnJvck1lc3NhZ2UgPSAkdGhpcy0+ZXJyb3JNZXNzYWdlOwokbXVsdGlzZWxlY3QgPSAkdGhpcy0+bXVsdGlzZWxlY3Q7CiRpc0Fzc29jID0gJHRoaXMtPmlzQXNzb2MoJGNob2ljZXMpOwoKcmV0dXJuIGZ1bmN0aW9uICgkc2VsZWN0ZWQpIHVzZSAoJGNob2ljZXMsICRlcnJvck1lc3NhZ2UsICRtdWx0aXNlbGVjdCwgJGlzQXNzb2MpIHsKaWYgKCRtdWx0aXNlbGVjdCkgewoKaWYgKCFwcmVnX21hdGNoKCcvXlteLF0rKD86LFteLF0rKSokLycsIChzdHJpbmcpICRzZWxlY3RlZCwgJG1hdGNoZXMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZigkZXJyb3JNZXNzYWdlLCAkc2VsZWN0ZWQpKTsKfQoKJHNlbGVjdGVkQ2hvaWNlcyA9IGV4cGxvZGUoJywnLCAoc3RyaW5nKSAkc2VsZWN0ZWQpOwp9IGVsc2Ugewokc2VsZWN0ZWRDaG9pY2VzID0gWyRzZWxlY3RlZF07Cn0KCmlmICgkdGhpcy0+aXNUcmltbWFibGUoKSkgewpmb3JlYWNoICgkc2VsZWN0ZWRDaG9pY2VzIGFzICRrID0+ICR2KSB7CiRzZWxlY3RlZENob2ljZXNbJGtdID0gdHJpbSgoc3RyaW5nKSAkdik7Cn0KfQoKJG11bHRpc2VsZWN0Q2hvaWNlcyA9IFtdOwpmb3JlYWNoICgkc2VsZWN0ZWRDaG9pY2VzIGFzICR2YWx1ZSkgewokcmVzdWx0cyA9IFtdOwpmb3JlYWNoICgkY2hvaWNlcyBhcyAka2V5ID0+ICRjaG9pY2UpIHsKaWYgKCRjaG9pY2UgPT09ICR2YWx1ZSkgewokcmVzdWx0c1tdID0gJGtleTsKfQp9CgppZiAoXGNvdW50KCRyZXN1bHRzKSA+IDEpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcHJvdmlkZWQgYW5zd2VyIGlzIGFtYmlndW91cy4gVmFsdWUgc2hvdWxkIGJlIG9uZSBvZiAiJXMiLicsIGltcGxvZGUoJyIgb3IgIicsICRyZXN1bHRzKSkpOwp9CgokcmVzdWx0ID0gYXJyYXlfc2VhcmNoKCR2YWx1ZSwgJGNob2ljZXMpOwoKaWYgKCEkaXNBc3NvYykgewppZiAoZmFsc2UgIT09ICRyZXN1bHQpIHsKJHJlc3VsdCA9ICRjaG9pY2VzWyRyZXN1bHRdOwp9IGVsc2VpZiAoaXNzZXQoJGNob2ljZXNbJHZhbHVlXSkpIHsKJHJlc3VsdCA9ICRjaG9pY2VzWyR2YWx1ZV07Cn0KfSBlbHNlaWYgKGZhbHNlID09PSAkcmVzdWx0ICYmIGlzc2V0KCRjaG9pY2VzWyR2YWx1ZV0pKSB7CiRyZXN1bHQgPSAkdmFsdWU7Cn0KCmlmIChmYWxzZSA9PT0gJHJlc3VsdCkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJGVycm9yTWVzc2FnZSwgJHZhbHVlKSk7Cn0KCgokbXVsdGlzZWxlY3RDaG9pY2VzW10gPSAkaXNBc3NvYyA/IChzdHJpbmcpICRyZXN1bHQgOiAkcmVzdWx0Owp9CgppZiAoJG11bHRpc2VsZWN0KSB7CnJldHVybiAkbXVsdGlzZWxlY3RDaG9pY2VzOwp9CgpyZXR1cm4gY3VycmVudCgkbXVsdGlzZWxlY3RDaG9pY2VzKTsKfTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvbjsKCgoKCgoKY2xhc3MgQ29uZmlybWF0aW9uUXVlc3Rpb24gZXh0ZW5kcyBRdWVzdGlvbgp7CnByaXZhdGUgJHRydWVBbnN3ZXJSZWdleDsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcXVlc3Rpb24sIGJvb2wgJGRlZmF1bHQgPSB0cnVlLCBzdHJpbmcgJHRydWVBbnN3ZXJSZWdleCA9ICcvXnkvaScpCnsKcGFyZW50OjpfX2NvbnN0cnVjdCgkcXVlc3Rpb24sICRkZWZhdWx0KTsKCiR0aGlzLT50cnVlQW5zd2VyUmVnZXggPSAkdHJ1ZUFuc3dlclJlZ2V4OwokdGhpcy0+c2V0Tm9ybWFsaXplcigkdGhpcy0+Z2V0RGVmYXVsdE5vcm1hbGl6ZXIoKSk7Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0RGVmYXVsdE5vcm1hbGl6ZXIoKTogY2FsbGFibGUKewokZGVmYXVsdCA9ICR0aGlzLT5nZXREZWZhdWx0KCk7CiRyZWdleCA9ICR0aGlzLT50cnVlQW5zd2VyUmVnZXg7CgpyZXR1cm4gZnVuY3Rpb24gKCRhbnN3ZXIpIHVzZSAoJGRlZmF1bHQsICRyZWdleCkgewppZiAoXGlzX2Jvb2woJGFuc3dlcikpIHsKcmV0dXJuICRhbnN3ZXI7Cn0KCiRhbnN3ZXJJc1RydWUgPSAoYm9vbCkgcHJlZ19tYXRjaCgkcmVnZXgsICRhbnN3ZXIpOwppZiAoZmFsc2UgPT09ICRkZWZhdWx0KSB7CnJldHVybiAkYW5zd2VyICYmICRhbnN3ZXJJc1RydWU7Cn0KCnJldHVybiAnJyA9PT0gJGFuc3dlciB8fCAkYW5zd2VySXNUcnVlOwp9Owp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBRdWVzdGlvbgp7CnByaXZhdGUgJHF1ZXN0aW9uOwpwcml2YXRlICRhdHRlbXB0czsKcHJpdmF0ZSAkaGlkZGVuID0gZmFsc2U7CnByaXZhdGUgJGhpZGRlbkZhbGxiYWNrID0gdHJ1ZTsKcHJpdmF0ZSAkYXV0b2NvbXBsZXRlckNhbGxiYWNrOwpwcml2YXRlICR2YWxpZGF0b3I7CnByaXZhdGUgJGRlZmF1bHQ7CnByaXZhdGUgJG5vcm1hbGl6ZXI7CnByaXZhdGUgJHRyaW1tYWJsZSA9IHRydWU7CnByaXZhdGUgJG11bHRpbGluZSA9IGZhbHNlOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHF1ZXN0aW9uLCAkZGVmYXVsdCA9IG51bGwpCnsKJHRoaXMtPnF1ZXN0aW9uID0gJHF1ZXN0aW9uOwokdGhpcy0+ZGVmYXVsdCA9ICRkZWZhdWx0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRRdWVzdGlvbigpCnsKcmV0dXJuICR0aGlzLT5xdWVzdGlvbjsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVmYXVsdCgpCnsKcmV0dXJuICR0aGlzLT5kZWZhdWx0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNNdWx0aWxpbmUoKTogYm9vbAp7CnJldHVybiAkdGhpcy0+bXVsdGlsaW5lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRNdWx0aWxpbmUoYm9vbCAkbXVsdGlsaW5lKTogc2VsZgp7CiR0aGlzLT5tdWx0aWxpbmUgPSAkbXVsdGlsaW5lOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0hpZGRlbigpCnsKcmV0dXJuICR0aGlzLT5oaWRkZW47Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SGlkZGVuKGJvb2wgJGhpZGRlbikKewppZiAoJHRoaXMtPmF1dG9jb21wbGV0ZXJDYWxsYmFjaykgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0EgaGlkZGVuIHF1ZXN0aW9uIGNhbm5vdCB1c2UgdGhlIGF1dG9jb21wbGV0ZXIuJyk7Cn0KCiR0aGlzLT5oaWRkZW4gPSAkaGlkZGVuOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0hpZGRlbkZhbGxiYWNrKCkKewpyZXR1cm4gJHRoaXMtPmhpZGRlbkZhbGxiYWNrOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRIaWRkZW5GYWxsYmFjayhib29sICRmYWxsYmFjaykKewokdGhpcy0+aGlkZGVuRmFsbGJhY2sgPSAkZmFsbGJhY2s7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dG9jb21wbGV0ZXJWYWx1ZXMoKQp7CiRjYWxsYmFjayA9ICR0aGlzLT5nZXRBdXRvY29tcGxldGVyQ2FsbGJhY2soKTsKCnJldHVybiAkY2FsbGJhY2sgPyAkY2FsbGJhY2soJycpIDogbnVsbDsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvY29tcGxldGVyVmFsdWVzKD9pdGVyYWJsZSAkdmFsdWVzKQp7CmlmIChcaXNfYXJyYXkoJHZhbHVlcykpIHsKJHZhbHVlcyA9ICR0aGlzLT5pc0Fzc29jKCR2YWx1ZXMpID8gYXJyYXlfbWVyZ2UoYXJyYXlfa2V5cygkdmFsdWVzKSwgYXJyYXlfdmFsdWVzKCR2YWx1ZXMpKSA6IGFycmF5X3ZhbHVlcygkdmFsdWVzKTsKCiRjYWxsYmFjayA9IHN0YXRpYyBmdW5jdGlvbiAoKSB1c2UgKCR2YWx1ZXMpIHsKcmV0dXJuICR2YWx1ZXM7Cn07Cn0gZWxzZWlmICgkdmFsdWVzIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CiR2YWx1ZUNhY2hlID0gbnVsbDsKJGNhbGxiYWNrID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJHZhbHVlcywgJiR2YWx1ZUNhY2hlKSB7CnJldHVybiAkdmFsdWVDYWNoZSA/PyAkdmFsdWVDYWNoZSA9IGl0ZXJhdG9yX3RvX2FycmF5KCR2YWx1ZXMsIGZhbHNlKTsKfTsKfSBlbHNlIHsKJGNhbGxiYWNrID0gbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5zZXRBdXRvY29tcGxldGVyQ2FsbGJhY2soJGNhbGxiYWNrKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEF1dG9jb21wbGV0ZXJDYWxsYmFjaygpOiA/Y2FsbGFibGUKewpyZXR1cm4gJHRoaXMtPmF1dG9jb21wbGV0ZXJDYWxsYmFjazsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRBdXRvY29tcGxldGVyQ2FsbGJhY2soP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwpOiBzZWxmCnsKaWYgKCR0aGlzLT5oaWRkZW4gJiYgbnVsbCAhPT0gJGNhbGxiYWNrKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignQSBoaWRkZW4gcXVlc3Rpb24gY2Fubm90IHVzZSB0aGUgYXV0b2NvbXBsZXRlci4nKTsKfQoKJHRoaXMtPmF1dG9jb21wbGV0ZXJDYWxsYmFjayA9ICRjYWxsYmFjazsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmFsaWRhdG9yKD9jYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCkKewokdGhpcy0+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/TcFOA04GTg9OEU4UDhWOFw4YjhoOG44dDh6OIA4nDjiOAI5AAAAIAAAJAAAANww6DDsMBwxIDF0MXgxHDIgMkAyXDJgMmgydDIAMAAADAAAABgwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBTeW1mb255IHBhY2thZ2UuCiMKIyAoYykgRmFiaWVuIFBvdGVuY2llciA8ZmFiaWVuQHN5bWZvbnkuY29tPgojCiMgRm9yIHRoZSBmdWxsIGNvcHlyaWdodCBhbmQgbGljZW5zZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHZpZXcKIyBodHRwczovL3N5bWZvbnkuY29tL2RvYy9jdXJyZW50L2NvbnRyaWJ1dGluZy9jb2RlL2xpY2Vuc2UuaHRtbAoKX3NmX3t7IENPTU1BTkRfTkFNRSB9fSgpIHsKICAgICMgVXNlIG5ld2xpbmUgYXMgb25seSBzZXBhcmF0b3IgdG8gYWxsb3cgc3BhY2UgaW4gY29tcGxldGlvbiB2YWx1ZXMKICAgIGxvY2FsIElGUz0kJ1xuJwogICAgbG9jYWwgc2ZfY21kPSIke0NPTVBfV09SRFNbMF19IgoKICAgICMgZm9yIGFuIGFsaWFzLCBnZXQgdGhlIHJlYWwgc2NyaXB0IGJlaGluZCBpdAogICAgc2ZfY21kX3R5cGU9JCh0eXBlIC10ICRzZl9jbWQpCiAgICBpZiBbWyAkc2ZfY21kX3R5cGUgPT0gImFsaWFzIiBdXTsgdGhlbgogICAgICAgIHNmX2NtZD0kKGFsaWFzICRzZl9jbWQgfCBzZWQgLUUgInMvYWxpYXMgJHNmX2NtZD0nKC4qKScvXDEvIikKICAgIGVsaWYgW1sgJHNmX2NtZF90eXBlID09ICJmaWxlIiBdXTsgdGhlbgogICAgICAgIHNmX2NtZD0kKHR5cGUgLXAgJHNmX2NtZCkKICAgIGZpCgogICAgaWYgW1sgJHNmX2NtZF90eXBlICE9ICJmdW5jdGlvbiIgJiYgISAteCAkc2ZfY21kIF1dOyB0aGVuCiAgICAgICAgcmV0dXJuIDEKICAgIGZpCgogICAgbG9jYWwgY3VyIHByZXYgd29yZHMgY3dvcmQKICAgIF9nZXRfY29tcF93b3Jkc19ieV9yZWYgLW4gOj0gY3VyIHByZXYgd29yZHMgY3dvcmQKCiAgICBsb2NhbCBjb21wbGV0ZWNtZD0oIiRzZl9jbWQiICJfY29tcGxldGUiICItLW5vLWludGVyYWN0aW9uIiAiLXNiYXNoIiAiLWMkY3dvcmQiICItU3t7IFZFUlNJT04gfX0iKQogICAgZm9yIHcgaW4gJHt3b3Jkc1tAXX07IGRvCiAgICAgICAgdz0kKHByaW50ZiAtLSAnJWInICIkdyIpCiAgICAgICAgIyByZW1vdmUgcXVvdGVzIGZyb20gdHlwZWQgdmFsdWVzCiAgICAgICAgcXVvdGU9IiR7dzowOjF9IgogICAgICAgIGlmIFsgIiRxdW90ZSIgPT0gXCcgXTsgdGhlbgogICAgICAgICAgICB3PSIke3clXCd9IgogICAgICAgICAgICB3PSIke3cjXCd9IgogICAgICAgIGVsaWYgWyAiJHF1b3RlIiA9PSBcIiBdOyB0aGVuCiAgICAgICAgICAgIHc9IiR7dyVcIn0iCiAgICAgICAgICAgIHc9IiR7dyNcIn0iCiAgICAgICAgZmkKICAgICAgICAjIGVtcHR5IHZhbHVlcyBhcmUgaWdub3JlZAogICAgICAgIGlmIFsgISAteiAiJHciIF07IHRoZW4KICAgICAgICAgICAgY29tcGxldGVjbWQrPSgiLWkkdyIpCiAgICAgICAgZmkKICAgIGRvbmUKCiAgICBsb2NhbCBzZmNvbXBsZXRlCiAgICBpZiBzZmNvbXBsZXRlPSQoJHtjb21wbGV0ZWNtZFtAXX0gMj4mMSk7IHRoZW4KICAgICAgICBsb2NhbCBxdW90ZSBzdWdnZXN0aW9ucwogICAgICAgIHF1b3RlPSR7Y3VyOjA6MX0KCiAgICAgICAgIyBVc2Ugc2luZ2xlIHF1b3RlcyBieSBkZWZhdWx0IGlmIHN1Z2dlc3Rpb25zIGNvbnRhaW5zIGJhY2tzbGFzaCAoRlFDTikKICAgICAgICBpZiBbICIkcXVvdGUiID09ICcnIF0gJiYgW1sgIiRzZmNvbXBsZXRlIiA9fiBcXCBdXTsgdGhlbgogICAgICAgICAgICBxdW90ZT1cJwogICAgICAgIGZpCgogICAgICAgIGlmIFsgIiRxdW90ZSIgPT0gXCcgXTsgdGhlbgogICAgICAgICAgICAjIHNpbmdsZSBxdW90ZXM6IG5vIGFkZGl0aW9uYWwgZXNjYXBpbmcgKGRvZXMgbm90IGFjY2VwdCAnIGluIHZhbHVlcykKICAgICAgICAgICAgc3VnZ2VzdGlvbnM9JChmb3IgcyBpbiAkc2Zjb21wbGV0ZTsgZG8gcHJpbnRmICQnJXElcSVxXG4nICIkcXVvdGUiICIkcyIgIiRxdW90ZSI7IGRvbmUpCiAgICAgICAgZWxpZiBbICIkcXVvdGUiID09IFwiIF07IHRoZW4KICAgICAgICAgICAgIyBkb3VibGUgcXVvdGVzOiBkb3VibGUgZXNjYXBpbmcgZm9yIFwgJCBgICIKICAgICAgICAgICAgc3VnZ2VzdGlvbnM9JChmb3IgcyBpbiAkc2Zjb21wbGV0ZTsgZG8KICAgICAgICAgICAgICAgIHM9JHtzLy9cXC9cXFxcfQogICAgICAgICAgICAgICAgcz0ke3MvL1wkL1xcXCR9CiAgICAgICAgICAgICAgICBzPSR7cy8vXGAvXFxcYH0KICAgICAgICAgICAgICAgIHM9JHtzLy9cIi9cXFwifQogICAgICAgICAgICAgICAgcHJpbnRmICQnJXElcSVxXG4nICIkcXVvdGUiICIkcyIgIiRxdW90ZSI7CiAgICAgICAgICAgIGRvbmUpCiAgICAgICAgZWxzZQogICAgICAgICAgICAjIG5vIHF1b3RlczogZG91YmxlIGVzY2FwaW5nCiAgICAgICAgICAgIHN1Z2dlc3Rpb25zPSQoZm9yIHMgaW4gJHNmY29tcGxldGU7IGRvIHByaW50ZiAkJyVxXG4nICQocHJpbnRmICclcScgIiRzIik7IGRvbmUpCiAgICAgICAgZmkKICAgICAgICBDT01QUkVQTFk9KCQoSUZTPSQnXG4nIGNvbXBnZW4gLVcgIiRzdWdnZXN0aW9ucyIgLS0gJChwcmludGYgLS0gIiVxIiAiJGN1ciIpKSkKICAgICAgICBfX2x0cmltX2NvbG9uX2NvbXBsZXRpb25zICIkY3VyIgogICAgZWxzZQogICAgICAgIGlmIFtbICIkc2Zjb21wbGV0ZSIgIT0gKiJDb21tYW5kIFwiX2NvbXBsZXRlXCIgaXMgbm90IGRlZmluZWQuIiogXV07IHRoZW4KICAgICAgICAgICAgPiYyIGVjaG8KICAgICAgICAgICAgPiYyIGVjaG8gJHNmY29tcGxldGUKICAgICAgICBmaQoKICAgICAgICByZXR1cm4gMQogICAgZmkKfQoKY29tcGxldGUgLUYgX3NmX3t7IENPTU1BTkRfTkFNRSB9fSB7eyBDT01NQU5EX05BTUUgfX0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFNpZ25hbFJlZ2lzdHJ5OwoKZmluYWwgY2xhc3MgU2lnbmFsUmVnaXN0cnkKewpwcml2YXRlICRzaWduYWxIYW5kbGVycyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewppZiAoXGZ1bmN0aW9uX2V4aXN0cygncGNudGxfYXN5bmNfc2lnbmFscycpKSB7CnBjbnRsX2FzeW5jX3NpZ25hbHModHJ1ZSk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyKGludCAkc2lnbmFsLCBjYWxsYWJsZSAkc2lnbmFsSGFuZGxlcik6IHZvaWQKewppZiAoIWlzc2V0KCR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXSkpIHsKJHByZXZpb3VzQ2FsbGJhY2sgPSBwY250bF9zaWduYWxfZ2V0X2hhbmRsZXIoJHNpZ25hbCk7CgppZiAoXGlzX2NhbGxhYmxlKCRwcmV2aW91c0NhbGxiYWNrKSkgewokdGhpcy0+c2lnbmFsSGFuZGxlcnNbJHNpZ25hbF1bXSA9ICRwcmV2aW91c0NhbGxiYWNrOwp9Cn0KCiR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXVtdID0gJHNpZ25hbEhhbmRsZXI7CgpwY250bF9zaWduYWwoJHNpZ25hbCwgWyR0aGlzLCAnaGFuZGxlJ10pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzU3VwcG9ydGVkKCk6IGJvb2wKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3BjbnRsX3NpZ25hbCcpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKFxpbl9hcnJheSgncGNudGxfc2lnbmFsJywgZXhwbG9kZSgnLCcsIFxpbmlfZ2V0KCdkaXNhYmxlX2Z1bmN0aW9ucycpKSkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhbmRsZShpbnQgJHNpZ25hbCk6IHZvaWQKewokY291bnQgPSBcY291bnQoJHRoaXMtPnNpZ25hbEhhbmRsZXJzWyRzaWduYWxdKTsKCmZvcmVhY2ggKCR0aGlzLT5zaWduYWxIYW5kbGVyc1skc2lnbmFsXSBhcyAkaSA9PiAkc2lnbmFsSGFuZGxlcikgewokaGFzTmV4dCA9ICRpICE9PSAkY291bnQgLSAxOwokc2lnbmFsSGFuZGxlcigkc2lnbmFsLCAkaGFzTmV4dCk7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CgoKCgpjbGFzcyBTaW5nbGVDb21tYW5kQXBwbGljYXRpb24gZXh0ZW5kcyBDb21tYW5kCnsKcHJpdmF0ZSAkdmVyc2lvbiA9ICdVTktOT1dOJzsKcHJpdmF0ZSAkYXV0b0V4aXQgPSB0cnVlOwpwcml2YXRlICRydW5uaW5nID0gZmFsc2U7CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0VmVyc2lvbihzdHJpbmcgJHZlcnNpb24pOiBzZWxmCnsKJHRoaXMtPnZlcnNpb24gPSAkdmVyc2lvbjsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0QXV0b0V4aXQoYm9vbCAkYXV0b0V4aXQpOiBzZWxmCnsKJHRoaXMtPmF1dG9FeGl0ID0gJGF1dG9FeGl0OwoKcmV0dXJuICR0aGlzOwp9CgpwdWJsaWMgZnVuY3Rpb24gcnVuKD9JbnB1dEludGVyZmFjZSAkaW5wdXQgPSBudWxsLCA/T3V0cHV0SW50ZXJmYWNlICRvdXRwdXQgPSBudWxsKTogaW50CnsKaWYgKCR0aGlzLT5ydW5uaW5nKSB7CnJldHVybiBwYXJlbnQ6OnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9CgoKJGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKCR0aGlzLT5nZXROYW1lKCkgPzogJ1VOS05PV04nLCAkdGhpcy0+dmVyc2lvbik7CiRhcHBsaWNhdGlvbi0+c2V0QXV0b0V4aXQoJHRoaXMtPmF1dG9FeGl0KTsKCiR0aGlzLT5zZXROYW1lKCRfU0VSVkVSWydhcmd2J11bMF0pOwokYXBwbGljYXRpb24tPmFkZCgkdGhpcyk7CiRhcHBsaWNhdGlvbi0+c2V0RGVmYXVsdENvbW1hbmQoJHRoaXMtPmdldE5hbWUoKSwgdHJ1ZSk7CgokdGhpcy0+cnVubmluZyA9IHRydWU7CnRyeSB7CiRyZXQgPSAkYXBwbGljYXRpb24tPnJ1bigkaW5wdXQsICRvdXRwdXQpOwp9IGZpbmFsbHkgewokdGhpcy0+cnVubmluZyA9IGZhbHNlOwp9CgpyZXR1cm4gJHJldCA/PyAxOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2dyZXNzQmFyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcQ29uc29sZU91dHB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XE91dHB1dEludGVyZmFjZTsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgT3V0cHV0U3R5bGUgaW1wbGVtZW50cyBPdXRwdXRJbnRlcmZhY2UsIFN0eWxlSW50ZXJmYWNlCnsKcHJpdmF0ZSAkb3V0cHV0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KE91dHB1dEludGVyZmFjZSAkb3V0cHV0KQp7CiR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0Owp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbmV3TGluZShpbnQgJGNvdW50ID0gMSkKewokdGhpcy0+b3V0cHV0LT53cml0ZShzdHJfcmVwZWF0KFxQSFBfRU9MLCAkY291bnQpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNyZWF0ZVByb2dyZXNzQmFyKGludCAkbWF4ID0gMCkKewpyZXR1cm4gbmV3IFByb2dyZXNzQmFyKCR0aGlzLT5vdXRwdXQsICRtYXgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGUoJG1lc3NhZ2VzLCBib29sICRuZXdsaW5lID0gZmFsc2UsIGludCAkdHlwZSA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKJHRoaXMtPm91dHB1dC0+d3JpdGUoJG1lc3NhZ2VzLCAkbmV3bGluZSwgJHR5cGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd3JpdGVsbigkbWVzc2FnZXMsIGludCAkdHlwZSA9IHNlbGY6Ok9VVFBVVF9OT1JNQUwpCnsKJHRoaXMtPm91dHB1dC0+d3JpdGVsbigkbWVzc2FnZXMsICR0eXBlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFZlcmJvc2l0eShpbnQgJGxldmVsKQp7CiR0aGlzLT5vdXRwdXQtPnNldFZlcmJvc2l0eSgkbGV2ZWwpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VmVyYm9zaXR5KCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+Z2V0VmVyYm9zaXR5KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXREZWNvcmF0ZWQoYm9vbCAkZGVjb3JhdGVkKQp7CiR0aGlzLT5vdXRwdXQtPnNldERlY29yYXRlZCgkZGVjb3JhdGVkKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzRGVjb3JhdGVkKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWNvcmF0ZWQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHNldEZvcm1hdHRlcihPdXRwdXRGb3JtYXR0ZXJJbnRlcmZhY2UgJGZvcm1hdHRlcikKewokdGhpcy0+b3V0cHV0LT5zZXRGb3JtYXR0ZXIoJGZvcm1hdHRlcik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRGb3JtYXR0ZXIoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5nZXRGb3JtYXR0ZXIoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUXVpZXQoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc1F1aWV0KCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc1ZlcmJvc2UoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc1ZlcmJvc2UoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGlzVmVyeVZlcmJvc2UoKQp7CnJldHVybiAkdGhpcy0+b3V0cHV0LT5pc1ZlcnlWZXJib3NlKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0RlYnVnKCkKewpyZXR1cm4gJHRoaXMtPm91dHB1dC0+aXNEZWJ1ZygpOwp9Cgpwcm90ZWN0ZWQgZnVuY3Rpb24gZ2V0RXJyb3JPdXRwdXQoKQp7CmlmICghJHRoaXMtPm91dHB1dCBpbnN0YW5jZW9mIENvbnNvbGVPdXRwdXRJbnRlcmZhY2UpIHsKcmV0dXJuICR0aGlzLT5vdXRwdXQ7Cn0KCnJldHVybiAkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFN0eWxlOwoKCgoKCgppbnRlcmZhY2UgU3R5bGVJbnRlcmZhY2UKewoKCgpwdWJsaWMgZnVuY3Rpb24gdGl0bGUoc3RyaW5nICRtZXNzYWdlKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZWN0aW9uKHN0cmluZyAkbWVzc2FnZSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gbGlzdGluZyhhcnJheSAkZWxlbWVudHMpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdGV4dCgkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzdWNjZXNzKCRtZXNzYWdlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtZXNzYWdlKTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHdhcm5pbmcoJG1lc3NhZ2UpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90ZSgkbWVzc2FnZSk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjYXV0aW9uKCRtZXNzYWdlKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiB0YWJsZShhcnJheSAkaGVhZGVycywgYXJyYXkgJHJvd3MpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKHN0cmluZyAkcXVlc3Rpb24sID9zdHJpbmcgJGRlZmF1bHQgPSBudWxsLCA/Y2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrSGlkZGVuKHN0cmluZyAkcXVlc3Rpb24sID9jYWxsYWJsZSAkdmFsaWRhdG9yID0gbnVsbCk7CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb25maXJtKHN0cmluZyAkcXVlc3Rpb24sIGJvb2wgJGRlZmF1bHQgPSB0cnVlKTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hvaWNlKHN0cmluZyAkcXVlc3Rpb24sIGFycmF5ICRjaG9pY2VzLCAkZGVmYXVsdCA9IG51bGwpOwoKCgoKcHVibGljIGZ1bmN0aW9uIG5ld0xpbmUoaW50ICRjb3VudCA9IDEpOwoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzU3RhcnQoaW50ICRtYXggPSAwKTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc0FkdmFuY2UoaW50ICRzdGVwID0gMSk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NGaW5pc2goKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcU3R5bGU7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcRm9ybWF0dGVyXE91dHB1dEZvcm1hdHRlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXEhlbHBlcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSGVscGVyXFByb2dyZXNzQmFyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcU3ltZm9ueVF1ZXN0aW9uSGVscGVyOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxIZWxwZXJcVGFibGU7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZUNlbGw7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXEhlbHBlclxUYWJsZVNlcGFyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcSW5wdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxDb25zb2xlT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcT3V0cHV0SW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxPdXRwdXRcVHJpbW1lZEJ1ZmZlck91dHB1dDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcUXVlc3Rpb25cQ2hvaWNlUXVlc3Rpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFF1ZXN0aW9uXENvbmZpcm1hdGlvblF1ZXN0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxRdWVzdGlvblxRdWVzdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcVGVybWluYWw7CgoKCgoKCmNsYXNzIFN5bWZvbnlTdHlsZSBleHRlbmRzIE91dHB1dFN0eWxlCnsKcHVibGljIGNvbnN0IE1BWF9MSU5FX0xFTkdUSCA9IDEyMDsKCnByaXZhdGUgJGlucHV0Owpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJHF1ZXN0aW9uSGVscGVyOwpwcml2YXRlICRwcm9ncmVzc0JhcjsKcHJpdmF0ZSAkbGluZUxlbmd0aDsKcHJpdmF0ZSAkYnVmZmVyZWRPdXRwdXQ7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoSW5wdXRJbnRlcmZhY2UgJGlucHV0LCBPdXRwdXRJbnRlcmZhY2UgJG91dHB1dCkKewokdGhpcy0+aW5wdXQgPSAkaW5wdXQ7CiR0aGlzLT5idWZmZXJlZE91dHB1dCA9IG5ldyBUcmltbWVkQnVmZmVyT3V0cHV0KFxESVJFQ1RPUllfU0VQQVJBVE9SID09PSAnXFwnID8gNCA6IDIsICRvdXRwdXQtPmdldFZlcmJvc2l0eSgpLCBmYWxzZSwgY2xvbmUgJG91dHB1dC0+Z2V0Rm9ybWF0dGVyKCkpOwoKJHdpZHRoID0gKG5ldyBUZXJtaW5hbCgpKS0+Z2V0V2lkdGgoKSA/OiBzZWxmOjpNQVhfTElORV9MRU5HVEg7CiR0aGlzLT5saW5lTGVuZ3RoID0gbWluKCR3aWR0aCAtIChpbnQpIChcRElSRUNUT1JZX1NFUEFSQVRPUiA9PT0gJ1xcJyksIHNlbGY6Ok1BWF9MSU5FX0xFTkdUSCk7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCR0aGlzLT5vdXRwdXQgPSAkb3V0cHV0KTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYmxvY2soJG1lc3NhZ2VzLCA/c3RyaW5nICR0eXBlID0gbnVsbCwgP3N0cmluZyAkc3R5bGUgPSBudWxsLCBzdHJpbmcgJHByZWZpeCA9ICcgJywgYm9vbCAkcGFkZGluZyA9IGZhbHNlLCBib29sICRlc2NhcGUgPSB0cnVlKQp7CiRtZXNzYWdlcyA9IFxpc19hcnJheSgkbWVzc2FnZXMpID8gYXJyYXlfdmFsdWVzKCRtZXNzYWdlcykgOiBbJG1lc3NhZ2VzXTsKCiR0aGlzLT5hdXRvUHJlcGVuZEJsb2NrKCk7CiR0aGlzLT53cml0ZWxuKCR0aGlzLT5jcmVhdGVCbG9jaygkbWVzc2FnZXMsICR0eXBlLCAkc3R5bGUsICRwcmVmaXgsICRwYWRkaW5nLCAkZXNjYXBlKSk7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0aXRsZShzdHJpbmcgJG1lc3NhZ2UpCnsKJHRoaXMtPmF1dG9QcmVwZW5kQmxvY2soKTsKJHRoaXMtPndyaXRlbG4oWwpzcHJpbnRmKCc8Y29tbWVudD4lczwvPicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2goJG1lc3NhZ2UpKSwKc3ByaW50ZignPGNvbW1lbnQ+JXM8Lz4nLCBzdHJfcmVwZWF0KCc9JywgSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCAkbWVzc2FnZSkpKSksCl0pOwokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2VjdGlvbihzdHJpbmcgJG1lc3NhZ2UpCnsKJHRoaXMtPmF1dG9QcmVwZW5kQmxvY2soKTsKJHRoaXMtPndyaXRlbG4oWwpzcHJpbnRmKCc8Y29tbWVudD4lczwvPicsIE91dHB1dEZvcm1hdHRlcjo6ZXNjYXBlVHJhaWxpbmdCYWNrc2xhc2goJG1lc3NhZ2UpKSwKc3ByaW50ZignPGNvbW1lbnQ+JXM8Lz4nLCBzdHJfcmVwZWF0KCctJywgSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCAkbWVzc2FnZSkpKSksCl0pOwokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbGlzdGluZyhhcnJheSAkZWxlbWVudHMpCnsKJHRoaXMtPmF1dG9QcmVwZW5kVGV4dCgpOwokZWxlbWVudHMgPSBhcnJheV9tYXAoZnVuY3Rpb24gKCRlbGVtZW50KSB7CnJldHVybiBzcHJpbnRmKCcgKiAlcycsICRlbGVtZW50KTsKfSwgJGVsZW1lbnRzKTsKCiR0aGlzLT53cml0ZWxuKCRlbGVtZW50cyk7CiR0aGlzLT5uZXdMaW5lKCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB0ZXh0KCRtZXNzYWdlKQp7CiR0aGlzLT5hdXRvUHJlcGVuZFRleHQoKTsKCiRtZXNzYWdlcyA9IFxpc19hcnJheSgkbWVzc2FnZSkgPyBhcnJheV92YWx1ZXMoJG1lc3NhZ2UpIDogWyRtZXNzYWdlXTsKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRtZXNzYWdlKSB7CiR0aGlzLT53cml0ZWxuKHNwcmludGYoJyAlcycsICRtZXNzYWdlKSk7Cn0KfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY29tbWVudCgkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsIG51bGwsIG51bGwsICc8Zmc9ZGVmYXVsdDtiZz1kZWZhdWx0PiAvLyA8Lz4nLCBmYWxzZSwgZmFsc2UpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3VjY2VzcygkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsICdPSycsICdmZz1ibGFjaztiZz1ncmVlbicsICcgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlcnJvcigkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsICdFUlJPUicsICdmZz13aGl0ZTtiZz1yZWQnLCAnICcsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gd2FybmluZygkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsICdXQVJOSU5HJywgJ2ZnPWJsYWNrO2JnPXllbGxvdycsICcgJywgdHJ1ZSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RlKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ05PVEUnLCAnZmc9eWVsbG93JywgJyAhICcpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtZXNzYWdlKQp7CiR0aGlzLT5ibG9jaygkbWVzc2FnZSwgJ0lORk8nLCAnZmc9Z3JlZW4nLCAnICcsIHRydWUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2F1dGlvbigkbWVzc2FnZSkKewokdGhpcy0+YmxvY2soJG1lc3NhZ2UsICdDQVVUSU9OJywgJ2ZnPXdoaXRlO2JnPXJlZCcsICcgISAnLCB0cnVlKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHRhYmxlKGFycmF5ICRoZWFkZXJzLCBhcnJheSAkcm93cykKewokdGhpcy0+Y3JlYXRlVGFibGUoKQotPnNldEhlYWRlcnMoJGhlYWRlcnMpCi0+c2V0Um93cygkcm93cykKLT5yZW5kZXIoKQo7CgokdGhpcy0+bmV3TGluZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaG9yaXpvbnRhbFRhYmxlKGFycmF5ICRoZWFkZXJzLCBhcnJheSAkcm93cykKewokdGhpcy0+Y3JlYXRlVGFibGUoKQotPnNldEhvcml6b250YWwodHJ1ZSkKLT5zZXRIZWFkZXJzKCRoZWFkZXJzKQotPnNldFJvd3MoJHJvd3MpCi0+cmVuZGVyKCkKOwoKJHRoaXMtPm5ld0xpbmUoKTsKfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkZWZpbml0aW9uTGlzdCguLi4kbGlzdCkKewokaGVhZGVycyA9IFtdOwokcm93ID0gW107CmZvcmVhY2ggKCRsaXN0IGFzICR2YWx1ZSkgewppZiAoJHZhbHVlIGluc3RhbmNlb2YgVGFibGVTZXBhcmF0b3IpIHsKJGhlYWRlcnNbXSA9ICR2YWx1ZTsKJHJvd1tdID0gJHZhbHVlOwpjb250aW51ZTsKfQppZiAoXGlzX3N0cmluZygkdmFsdWUpKSB7CiRoZWFkZXJzW10gPSBuZXcgVGFibGVDZWxsKCR2YWx1ZSwgWydjb2xzcGFuJyA9PiAyXSk7CiRyb3dbXSA9IG51bGw7CmNvbnRpbnVlOwp9CmlmICghXGlzX2FycmF5KCR2YWx1ZSkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVmFsdWUgc2hvdWxkIGJlIGFuIGFycmF5LCBzdHJpbmcsIG9yIGFuIGluc3RhbmNlIG9mIFRhYmxlU2VwYXJhdG9yLicpOwp9CiRoZWFkZXJzW10gPSBrZXkoJHZhbHVlKTsKJHJvd1tdID0gY3VycmVudCgkdmFsdWUpOwp9CgokdGhpcy0+aG9yaXpvbnRhbFRhYmxlKCRoZWFkZXJzLCBbJHJvd10pOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXNrKHN0cmluZyAkcXVlc3Rpb24sID9zdHJpbmcgJGRlZmF1bHQgPSBudWxsLCA/Y2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpCnsKJHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKCRxdWVzdGlvbiwgJGRlZmF1bHQpOwokcXVlc3Rpb24tPnNldFZhbGlkYXRvcigkdmFsaWRhdG9yKTsKCnJldHVybiAkdGhpcy0+YXNrUXVlc3Rpb24oJHF1ZXN0aW9uKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFza0hpZGRlbihzdHJpbmcgJHF1ZXN0aW9uLCA/Y2FsbGFibGUgJHZhbGlkYXRvciA9IG51bGwpCnsKJHF1ZXN0aW9uID0gbmV3IFF1ZXN0aW9uKCRxdWVzdGlvbik7CgokcXVlc3Rpb24tPnNldEhpZGRlbih0cnVlKTsKJHF1ZXN0aW9uLT5zZXRWYWxpZGF0b3IoJHZhbGlkYXRvcik7CgpyZXR1cm4gJHRoaXMtPmFza1F1ZXN0aW9uKCRxdWVzdGlvbik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjb25maXJtKHN0cmluZyAkcXVlc3Rpb24sIGJvb2wgJGRlZmF1bHQgPSB0cnVlKQp7CnJldHVybiAkdGhpcy0+YXNrUXVlc3Rpb24obmV3IENvbmZpcm1hdGlvblF1ZXN0aW9uKCRxdWVzdGlvbiwgJGRlZmF1bHQpKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNob2ljZShzdHJpbmcgJHF1ZXN0aW9uLCBhcnJheSAkY2hvaWNlcywgJGRlZmF1bHQgPSBudWxsKQp7CmlmIChudWxsICE9PSAkZGVmYXVsdCkgewokdmFsdWVzID0gYXJyYXlfZmxpcCgkY2hvaWNlcyk7CiRkZWZhdWx0ID0gJHZhbHVlc1skZGVmYXVsdF0gPz8gJGRlZmF1bHQ7Cn0KCnJldHVybiAkdGhpcy0+YXNrUXVlc3Rpb24obmV3IENob2ljZVF1ZXN0aW9uKCRxdWVzdGlvbiwgJGNob2ljZXMsICRkZWZhdWx0KSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBwcm9ncmVzc1N0YXJ0KGludCAkbWF4ID0gMCkKewokdGhpcy0+cHJvZ3Jlc3NCYXIgPSAkdGhpcy0+Y3JlYXRlUHJvZ3Jlc3NCYXIoJG1heCk7CiR0aGlzLT5wcm9ncmVzc0Jhci0+c3RhcnQoKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzQWR2YW5jZShpbnQgJHN0ZXAgPSAxKQp7CiR0aGlzLT5nZXRQcm9ncmVzc0JhcigpLT5hZHZhbmNlKCRzdGVwKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHByb2dyZXNzRmluaXNoKCkKewokdGhpcy0+Z2V0UHJvZ3Jlc3NCYXIoKS0+ZmluaXNoKCk7CiR0aGlzLT5uZXdMaW5lKDIpOwokdGhpcy0+cHJvZ3Jlc3NCYXIgPSBudWxsOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY3JlYXRlUHJvZ3Jlc3NCYXIoaW50ICRtYXggPSAwKQp7CiRwcm9ncmVzc0JhciA9IHBhcmVudDo6Y3JlYXRlUHJvZ3Jlc3NCYXIoJG1heCk7CgppZiAoJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgJ0h5cGVyJyA9PT0gZ2V0ZW52KCdURVJNX1BST0dSQU0nKSkgewokcHJvZ3Jlc3NCYXItPnNldEVtcHR5QmFyQ2hhcmFjdGVyKCfilpEnKTsgCiRwcm9ncmVzc0Jhci0+c2V0UHJvZ3Jlc3NDaGFyYWN0ZXIoJycpOwokcHJvZ3Jlc3NCYXItPnNldEJhckNoYXJhY3Rlcign4paTJyk7IAp9CgpyZXR1cm4gJHByb2dyZXNzQmFyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcHJvZ3Jlc3NJdGVyYXRlKGl0ZXJhYmxlICRpdGVyYWJsZSwgP2ludCAkbWF4ID0gbnVsbCk6IGl0ZXJhYmxlCnsKeWllbGQgZnJvbSAkdGhpcy0+Y3JlYXRlUHJvZ3Jlc3NCYXIoKS0+aXRlcmF0ZSgkaXRlcmFibGUsICRtYXgpOwoKJHRoaXMtPm5ld0xpbmUoMik7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhc2tRdWVzdGlvbihRdWVzdGlvbiAkcXVlc3Rpb24pCnsKaWYgKCR0aGlzLT5pbnB1dC0+aXNJbnRlcmFjdGl2ZSgpKSB7CiR0aGlzLT5hdXRvUHJlcGVuZEJsb2NrKCk7Cn0KCmlmICghJHRoaXMtPnF1ZXN0aW9uSGVscGVyKSB7CiR0aGlzLT5xdWVzdGlvbkhlbHBlciA9IG5ldyBTeW1mb255UXVlc3Rpb25IZWxwZXIoKTsKfQoKJGFuc3dlciA9ICR0aGlzLT5xdWVzdGlvbkhlbHBlci0+YXNrKCR0aGlzLT5pbnB1dCwgJHRoaXMsICRxdWVzdGlvbik7CgppZiAoJHRoaXMtPmlucHV0LT5pc0ludGVyYWN0aXZlKCkpIHsKJHRoaXMtPm5ld0xpbmUoKTsKJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT53cml0ZSgiXG4iKTsKfQoKcmV0dXJuICRhbnN3ZXI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZWxuKCRtZXNzYWdlcywgaW50ICR0eXBlID0gc2VsZjo6T1VUUFVUX05PUk1BTCkKewppZiAoIWlzX2l0ZXJhYmxlKCRtZXNzYWdlcykpIHsKJG1lc3NhZ2VzID0gWyRtZXNzYWdlc107Cn0KCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAkbWVzc2FnZSkgewpwYXJlbnQ6OndyaXRlbG4oJG1lc3NhZ2UsICR0eXBlKTsKJHRoaXMtPndyaXRlQnVmZmVyKCRtZXNzYWdlLCB0cnVlLCAkdHlwZSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIHdyaXRlKCRtZXNzYWdlcywgYm9vbCAkbmV3bGluZSA9IGZhbHNlLCBpbnQgJHR5cGUgPSBzZWxmOjpPVVRQVVRfTk9STUFMKQp7CmlmICghaXNfaXRlcmFibGUoJG1lc3NhZ2VzKSkgewokbWVzc2FnZXMgPSBbJG1lc3NhZ2VzXTsKfQoKZm9yZWFjaCAoJG1lc3NhZ2VzIGFzICRtZXNzYWdlKSB7CnBhcmVudDo6d3JpdGUoJG1lc3NhZ2UsICRuZXdsaW5lLCAkdHlwZSk7CiR0aGlzLT53cml0ZUJ1ZmZlcigkbWVzc2FnZSwgJG5ld2xpbmUsICR0eXBlKTsKfQp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gbmV3TGluZShpbnQgJGNvdW50ID0gMSkKewpwYXJlbnQ6Om5ld0xpbmUoJGNvdW50KTsKJHRoaXMtPmJ1ZmZlcmVkT3V0cHV0LT53cml0ZShzdHJfcmVwZWF0KCJcbiIsICRjb3VudCkpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvclN0eWxlKCkKewpyZXR1cm4gbmV3IHNlbGYoJHRoaXMtPmlucHV0LCAkdGhpcy0+Z2V0RXJyb3JPdXRwdXQoKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBjcmVhdGVUYWJsZSgpOiBUYWJsZQp7CiRvdXRwdXQgPSAkdGhpcy0+b3V0cHV0IGluc3RhbmNlb2YgQ29uc29sZU91dHB1dEludGVyZmFjZSA/ICR0aGlzLT5vdXRwdXQtPnNlY3Rpb24oKSA6ICR0aGlzLT5vdXRwdXQ7CiRzdHlsZSA9IGNsb25lIFRhYmxlOjpnZXRTdHlsZURlZmluaXRpb24oJ3N5bWZvbnktc3R5bGUtZ3VpZGUnKTsKJHN0eWxlLT5zZXRDZWxsSGVhZGVyRm9ybWF0KCc8aW5mbz4lczwvaW5mbz4nKTsKCnJldHVybiAobmV3IFRhYmxlKCRvdXRwdXQpKS0+c2V0U3R5bGUoJHN0eWxlKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBnZXRQcm9ncmVzc0JhcigpOiBQcm9ncmVzc0Jhcgp7CmlmICghJHRoaXMtPnByb2dyZXNzQmFyKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdUaGUgUHJvZ3Jlc3NCYXIgaXMgbm90IHN0YXJ0ZWQuJyk7Cn0KCnJldHVybiAkdGhpcy0+cHJvZ3Jlc3NCYXI7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYXV0b1ByZXBlbmRCbG9jaygpOiB2b2lkCnsKJGNoYXJzID0gc3Vic3RyKHN0cl9yZXBsYWNlKFxQSFBfRU9MLCAiXG4iLCAkdGhpcy0+YnVmZmVyZWRPdXRwdXQtPmZldGNoKCkpLCAtMik7CgppZiAoIWlzc2V0KCRjaGFyc1swXSkpIHsKJHRoaXMtPm5ld0xpbmUoKTsgCgpyZXR1cm47Cn0KCiR0aGlzLT5uZXdMaW5lKDIgLSBzdWJzdHJfY291bnQoJGNoYXJzLCAiXG4iKSk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gYXV0b1ByZXBlbmRUZXh0KCk6IHZvaWQKewokZmV0Y2hlZCA9ICR0aGlzLT5idWZmZXJlZE91dHB1dC0+ZmV0Y2goKTsKCmlmICghc3RyX2VuZHNfd2l0aCgkZmV0Y2hlZCwgIlxuIikpIHsKJHRoaXMtPm5ld0xpbmUoKTsKfQp9Cgpwcml2YXRlIGZ1bmN0aW9uIHdyaXRlQnVmZmVyKHN0cmluZyAkbWVzc2FnZSwgYm9vbCAkbmV3TGluZSwgaW50ICR0eXBlKTogdm9pZAp7CgokdGhpcy0+YnVmZmVyZWRPdXRwdXQtPndyaXRlKCRtZXNzYWdlLCAkbmV3TGluZSwgJHR5cGUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZUJsb2NrKGl0ZXJhYmxlICRtZXNzYWdlcywgP3N0cmluZyAkdHlwZSA9IG51bGwsID9zdHJpbmcgJHN0eWxlID0gbnVsbCwgc3RyaW5nICRwcmVmaXggPSAnICcsIGJvb2wgJHBhZGRpbmcgPSBmYWxzZSwgYm9vbCAkZXNjYXBlID0gZmFsc2UpOiBhcnJheQp7CiRpbmRlbnRMZW5ndGggPSAwOwokcHJlZml4TGVuZ3RoID0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCAkcHJlZml4KSk7CiRsaW5lcyA9IFtdOwoKaWYgKG51bGwgIT09ICR0eXBlKSB7CiR0eXBlID0gc3ByaW50ZignWyVzXSAnLCAkdHlwZSk7CiRpbmRlbnRMZW5ndGggPSBcc3RybGVuKCR0eXBlKTsKJGxpbmVJbmRlbnRhdGlvbiA9IHN0cl9yZXBlYXQoJyAnLCAkaW5kZW50TGVuZ3RoKTsKfQoKCmZvcmVhY2ggKCRtZXNzYWdlcyBhcyAka2V5ID0+ICRtZXNzYWdlKSB7CmlmICgkZXNjYXBlKSB7CiRtZXNzYWdlID0gT3V0cHV0Rm9ybWF0dGVyOjplc2NhcGUoJG1lc3NhZ2UpOwp9CgokZGVjb3JhdGlvbkxlbmd0aCA9IEhlbHBlcjo6d2lkdGgoJG1lc3NhZ2UpIC0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCAkbWVzc2FnZSkpOwokbWVzc2FnZUxpbmVMZW5ndGggPSBtaW4oJHRoaXMtPmxpbmVMZW5ndGggLSAkcHJlZml4TGVuZ3RoIC0gJGluZGVudExlbmd0aCArICRkZWNvcmF0aW9uTGVuZ3RoLCAkdGhpcy0+bGluZUxlbmd0aCk7CiRtZXNzYWdlTGluZXMgPSBleHBsb2RlKFxQSFBfRU9MLCB3b3Jkd3JhcCgkbWVzc2FnZSwgJG1lc3NhZ2VMaW5lTGVuZ3RoLCBcUEhQX0VPTCwgdHJ1ZSkpOwpmb3JlYWNoICgkbWVzc2FnZUxpbmVzIGFzICRtZXNzYWdlTGluZSkgewokbGluZXNbXSA9ICRtZXNzYWdlTGluZTsKfQoKaWYgKFxjb3VudCgkbWVzc2FnZXMpID4gMSAmJiAka2V5IDwgXGNvdW50KCRtZXNzYWdlcykgLSAxKSB7CiRsaW5lc1tdID0gJyc7Cn0KfQoKJGZpcnN0TGluZUluZGV4ID0gMDsKaWYgKCRwYWRkaW5nICYmICR0aGlzLT5pc0RlY29yYXRlZCgpKSB7CiRmaXJzdExpbmVJbmRleCA9IDE7CmFycmF5X3Vuc2hpZnQoJGxpbmVzLCAnJyk7CiRsaW5lc1tdID0gJyc7Cn0KCmZvcmVhY2ggKCRsaW5lcyBhcyAkaSA9PiAmJGxpbmUpIHsKaWYgKG51bGwgIT09ICR0eXBlKSB7CiRsaW5lID0gJGZpcnN0TGluZUluZGV4ID09PSAkaSA/ICR0eXBlLiRsaW5lIDogJGxpbmVJbmRlbnRhdGlvbi4kbGluZTsKfQoKJGxpbmUgPSAkcHJlZml4LiRsaW5lOwokbGluZSAuPSBzdHJfcmVwZWF0KCcgJywgbWF4KCR0aGlzLT5saW5lTGVuZ3RoIC0gSGVscGVyOjp3aWR0aChIZWxwZXI6OnJlbW92ZURlY29yYXRpb24oJHRoaXMtPmdldEZvcm1hdHRlcigpLCAkbGluZSkpLCAwKSk7CgppZiAoJHN0eWxlKSB7CiRsaW5lID0gc3ByaW50ZignPCVzPiVzPC8+JywgJHN0eWxlLCAkbGluZSk7Cn0KfQoKcmV0dXJuICRsaW5lczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZTsKCmNsYXNzIFRlcm1pbmFsCnsKcHJpdmF0ZSBzdGF0aWMgJHdpZHRoOwpwcml2YXRlIHN0YXRpYyAkaGVpZ2h0Owpwcml2YXRlIHN0YXRpYyAkc3R0eTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFdpZHRoKCkKewokd2lkdGggPSBnZXRlbnYoJ0NPTFVNTlMnKTsKaWYgKGZhbHNlICE9PSAkd2lkdGgpIHsKcmV0dXJuIChpbnQpIHRyaW0oJHdpZHRoKTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiR3aWR0aCkgewpzZWxmOjppbml0RGltZW5zaW9ucygpOwp9CgpyZXR1cm4gc2VsZjo6JHdpZHRoID86IDgwOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRIZWlnaHQoKQp7CiRoZWlnaHQgPSBnZXRlbnYoJ0xJTkVTJyk7CmlmIChmYWxzZSAhPT0gJGhlaWdodCkgewpyZXR1cm4gKGludCkgdHJpbSgkaGVpZ2h0KTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiRoZWlnaHQpIHsKc2VsZjo6aW5pdERpbWVuc2lvbnMoKTsKfQoKcmV0dXJuIHNlbGY6OiRoZWlnaHQgPzogNTA7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFzU3R0eUF2YWlsYWJsZSgpOiBib29sCnsKaWYgKG51bGwgIT09IHNlbGY6OiRzdHR5KSB7CnJldHVybiBzZWxmOjokc3R0eTsKfQoKCmlmICghXGZ1bmN0aW9uX2V4aXN0cygnc2hlbGxfZXhlYycpKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIHNlbGY6OiRzdHR5ID0gKGJvb2wpIHNoZWxsX2V4ZWMoJ3N0dHkgMj4gJy4oJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyAnTlVMJyA6ICcvZGV2L251bGwnKSk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGluaXREaW1lbnNpb25zKCkKewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGFuc2ljb24gPSBnZXRlbnYoJ0FOU0lDT04nKTsKaWYgKGZhbHNlICE9PSAkYW5zaWNvbiAmJiBwcmVnX21hdGNoKCcvXihcZCspeChcZCspKD86IFwoKFxkKyl4KFxkKylcKSk/JC8nLCB0cmltKCRhbnNpY29uKSwgJG1hdGNoZXMpKSB7CgoKc2VsZjo6JHdpZHRoID0gKGludCkgJG1hdGNoZXNbMV07CnNlbGY6OiRoZWlnaHQgPSBpc3NldCgkbWF0Y2hlc1s0XSkgPyAoaW50KSAkbWF0Y2hlc1s0XSA6IChpbnQpICRtYXRjaGVzWzJdOwp9IGVsc2VpZiAoIXNlbGY6Omhhc1Z0MTAwU3VwcG9ydCgpICYmIHNlbGY6Omhhc1N0dHlBdmFpbGFibGUoKSkgewoKCnNlbGY6OmluaXREaW1lbnNpb25zVXNpbmdTdHR5KCk7Cn0gZWxzZWlmIChudWxsICE9PSAkZGltZW5zaW9ucyA9IHNlbGY6OmdldENvbnNvbGVNb2RlKCkpIHsKCnNlbGY6OiR3aWR0aCA9IChpbnQpICRkaW1lbnNpb25zWzBdOwpzZWxmOjokaGVpZ2h0ID0gKGludCkgJGRpbWVuc2lvbnNbMV07Cn0KfSBlbHNlIHsKc2VsZjo6aW5pdERpbWVuc2lvbnNVc2luZ1N0dHkoKTsKfQp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBoYXNWdDEwMFN1cHBvcnQoKTogYm9vbAp7CnJldHVybiBcZnVuY3Rpb25fZXhpc3RzKCdzYXBpX3dpbmRvd3NfdnQxMDBfc3VwcG9ydCcpICYmIHNhcGlfd2luZG93c192dDEwMF9zdXBwb3J0KGZvcGVuKCdwaHA6Ly9zdGRvdXQnLCAndycpKTsKfQoKCgoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gaW5pdERpbWVuc2lvbnNVc2luZ1N0dHkoKQp7CmlmICgkc3R0eVN0cmluZyA9IHNlbGY6OmdldFN0dHlDb2x1bW5zKCkpIHsKaWYgKHByZWdfbWF0Y2goJy9yb3dzLihcZCspOy5jb2x1bW5zLihcZCspOy9pJywgJHN0dHlTdHJpbmcsICRtYXRjaGVzKSkgewoKc2VsZjo6JHdpZHRoID0gKGludCkgJG1hdGNoZXNbMl07CnNlbGY6OiRoZWlnaHQgPSAoaW50KSAkbWF0Y2hlc1sxXTsKfSBlbHNlaWYgKHByZWdfbWF0Y2goJy87LihcZCspLnJvd3M7LihcZCspLmNvbHVtbnMvaScsICRzdHR5U3RyaW5nLCAkbWF0Y2hlcykpIHsKCnNlbGY6OiR3aWR0aCA9IChpbnQpICRtYXRjaGVzWzJdOwpzZWxmOjokaGVpZ2h0ID0gKGludCkgJG1hdGNoZXNbMV07Cn0KfQp9CgoKCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldENvbnNvbGVNb2RlKCk6ID9hcnJheQp7CiRpbmZvID0gc2VsZjo6cmVhZEZyb21Qcm9jZXNzKCdtb2RlIENPTicpOwoKaWYgKG51bGwgPT09ICRpbmZvIHx8ICFwcmVnX21hdGNoKCcvLS0tLS0tLS0rXHI/XG4uKz8oXGQrKVxyP1xuLis/KFxkKylccj9cbi8nLCAkaW5mbywgJG1hdGNoZXMpKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gWyhpbnQpICRtYXRjaGVzWzJdLCAoaW50KSAkbWF0Y2hlc1sxXV07Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGdldFN0dHlDb2x1bW5zKCk6ID9zdHJpbmcKewpyZXR1cm4gc2VsZjo6cmVhZEZyb21Qcm9jZXNzKCdzdHR5IC1hIHwgZ3JlcCBjb2x1bW5zJyk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHJlYWRGcm9tUHJvY2VzcyhzdHJpbmcgJGNvbW1hbmQpOiA/c3RyaW5nCnsKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdwcm9jX29wZW4nKSkgewpyZXR1cm4gbnVsbDsKfQoKJGRlc2NyaXB0b3JzcGVjID0gWwoxID0+IFsncGlwZScsICd3J10sCjIgPT4gWydwaXBlJywgJ3cnXSwKXTsKCiRjcCA9IFxmdW5jdGlvbl9leGlzdHMoJ3NhcGlfd2luZG93c19jcF9zZXQnKSA/IHNhcGlfd2luZG93c19jcF9nZXQoKSA6IDA7CgppZiAoISRwcm9jZXNzID0gQHByb2Nfb3BlbigkY29tbWFuZCwgJGRlc2NyaXB0b3JzcGVjLCAkcGlwZXMsIG51bGwsIG51bGwsIFsnc3VwcHJlc3NfZXJyb3JzJyA9PiB0cnVlXSkpIHsKcmV0dXJuIG51bGw7Cn0KCiRpbmZvID0gc3RyZWFtX2dldF9jb250ZW50cygkcGlwZXNbMV0pOwpmY2xvc2UoJHBpcGVzWzFdKTsKZmNsb3NlKCRwaXBlc1syXSk7CnByb2NfY2xvc2UoJHByb2Nlc3MpOwoKaWYgKCRjcCkgewpzYXBpX3dpbmRvd3NfY3Bfc2V0KCRjcCk7Cn0KCnJldHVybiAkaW5mbzsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxBcHBsaWNhdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJyYXlJbnB1dDsKCgoKCgoKCgoKCgpjbGFzcyBBcHBsaWNhdGlvblRlc3Rlcgp7CnVzZSBUZXN0ZXJUcmFpdDsKCnByaXZhdGUgJGFwcGxpY2F0aW9uOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KEFwcGxpY2F0aW9uICRhcHBsaWNhdGlvbikKewokdGhpcy0+YXBwbGljYXRpb24gPSAkYXBwbGljYXRpb247Cn0KCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBydW4oYXJyYXkgJGlucHV0LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CiRwcmV2U2hlbGxWZXJib3NpdHkgPSBnZXRlbnYoJ1NIRUxMX1ZFUkJPU0lUWScpOwoKdHJ5IHsKJHRoaXMtPmlucHV0ID0gbmV3IEFycmF5SW5wdXQoJGlucHV0KTsKaWYgKGlzc2V0KCRvcHRpb25zWydpbnRlcmFjdGl2ZSddKSkgewokdGhpcy0+aW5wdXQtPnNldEludGVyYWN0aXZlKCRvcHRpb25zWydpbnRlcmFjdGl2ZSddKTsKfQoKaWYgKCR0aGlzLT5pbnB1dHMpIHsKJHRoaXMtPmlucHV0LT5zZXRTdHJlYW0oc2VsZjo6Y3JlYXRlU3RyZWFtKCR0aGlzLT5pbnB1dHMpKTsKfQoKJHRoaXMtPmluaXRPdXRwdXQoJG9wdGlvbnMpOwoKcmV0dXJuICR0aGlzLT5zdGF0dXNDb2RlID0gJHRoaXMtPmFwcGxpY2F0aW9uLT5ydW4oJHRoaXMtPmlucHV0LCAkdGhpcy0+b3V0cHV0KTsKfSBmaW5hbGx5IHsKCgppZiAoZmFsc2UgPT09ICRwcmV2U2hlbGxWZXJib3NpdHkpIHsKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3B1dGVudicpKSB7CkBwdXRlbnYoJ1NIRUxMX1ZFUkJPU0lUWScpOwp9CnVuc2V0KCRfRU5WWydTSEVMTF9WRVJCT1NJVFknXSk7CnVuc2V0KCRfU0VSVkVSWydTSEVMTF9WRVJCT1NJVFknXSk7Cn0gZWxzZSB7CmlmIChcZnVuY3Rpb25fZXhpc3RzKCdwdXRlbnYnKSkgewpAcHV0ZW52KCdTSEVMTF9WRVJCT1NJVFk9Jy4kcHJldlNoZWxsVmVyYm9zaXR5KTsKfQokX0VOVlsnU0hFTExfVkVSQk9TSVRZJ10gPSAkcHJldlNoZWxsVmVyYm9zaXR5OwokX1NFUlZFUlsnU0hFTExfVkVSQk9TSVRZJ10gPSAkcHJldlNoZWxsVmVyYm9zaXR5Owp9Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXI7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21tYW5kXENvbW1hbmQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbXBsZXRpb25cQ29tcGxldGlvbklucHV0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxDb21wbGV0aW9uXENvbXBsZXRpb25TdWdnZXN0aW9uczsKCgoKCgoKY2xhc3MgQ29tbWFuZENvbXBsZXRpb25UZXN0ZXIKewpwcml2YXRlICRjb21tYW5kOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbW1hbmQgJGNvbW1hbmQpCnsKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbXBsZXRlKGFycmF5ICRpbnB1dCk6IGFycmF5CnsKJGN1cnJlbnRJbmRleCA9IFxjb3VudCgkaW5wdXQpOwppZiAoJycgPT09IGVuZCgkaW5wdXQpKSB7CmFycmF5X3BvcCgkaW5wdXQpOwp9CmFycmF5X3Vuc2hpZnQoJGlucHV0LCAkdGhpcy0+Y29tbWFuZC0+Z2V0TmFtZSgpKTsKCiRjb21wbGV0aW9uSW5wdXQgPSBDb21wbGV0aW9uSW5wdXQ6OmZyb21Ub2tlbnMoJGlucHV0LCAkY3VycmVudEluZGV4KTsKJGNvbXBsZXRpb25JbnB1dC0+YmluZCgkdGhpcy0+Y29tbWFuZC0+Z2V0RGVmaW5pdGlvbigpKTsKJHN1Z2dlc3Rpb25zID0gbmV3IENvbXBsZXRpb25TdWdnZXN0aW9ucygpOwoKJHRoaXMtPmNvbW1hbmQtPmNvbXBsZXRlKCRjb21wbGV0aW9uSW5wdXQsICRzdWdnZXN0aW9ucyk7Cgokb3B0aW9ucyA9IFtdOwpmb3JlYWNoICgkc3VnZ2VzdGlvbnMtPmdldE9wdGlvblN1Z2dlc3Rpb25zKCkgYXMgJG9wdGlvbikgewokb3B0aW9uc1tdID0gJy0tJy4kb3B0aW9uLT5nZXROYW1lKCk7Cn0KCnJldHVybiBhcnJheV9tYXAoJ3N0cnZhbCcsIGFycmF5X21lcmdlKCRvcHRpb25zLCAkc3VnZ2VzdGlvbnMtPmdldFZhbHVlU3VnZ2VzdGlvbnMoKSkpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlc3RlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcSW5wdXRcQXJyYXlJbnB1dDsKCgoKCgoKCmNsYXNzIENvbW1hbmRUZXN0ZXIKewp1c2UgVGVzdGVyVHJhaXQ7Cgpwcml2YXRlICRjb21tYW5kOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KENvbW1hbmQgJGNvbW1hbmQpCnsKJHRoaXMtPmNvbW1hbmQgPSAkY29tbWFuZDsKfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGV4ZWN1dGUoYXJyYXkgJGlucHV0LCBhcnJheSAkb3B0aW9ucyA9IFtdKQp7CgoKaWYgKCFpc3NldCgkaW5wdXRbJ2NvbW1hbmQnXSkKJiYgKG51bGwgIT09ICRhcHBsaWNhdGlvbiA9ICR0aGlzLT5jb21tYW5kLT5nZXRBcHBsaWNhdGlvbigpKQomJiAkYXBwbGljYXRpb24tPmdldERlZmluaXRpb24oKS0+aGFzQXJndW1lbnQoJ2NvbW1hbmQnKQopIHsKJGlucHV0ID0gYXJyYXlfbWVyZ2UoWydjb21tYW5kJyA9PiAkdGhpcy0+Y29tbWFuZC0+Z2V0TmFtZSgpXSwgJGlucHV0KTsKfQoKJHRoaXMtPmlucHV0ID0gbmV3IEFycmF5SW5wdXQoJGlucHV0KTsKCiR0aGlzLT5pbnB1dC0+c2V0U3RyZWFtKHNlbGY6OmNyZWF0ZVN0cmVhbSgkdGhpcy0+aW5wdXRzKSk7CgppZiAoaXNzZXQoJG9wdGlvbnNbJ2ludGVyYWN0aXZlJ10pKSB7CiR0aGlzLT5pbnB1dC0+c2V0SW50ZXJhY3RpdmUoJG9wdGlvbnNbJ2ludGVyYWN0aXZlJ10pOwp9CgppZiAoIWlzc2V0KCRvcHRpb25zWydkZWNvcmF0ZWQnXSkpIHsKJG9wdGlvbnNbJ2RlY29yYXRlZCddID0gZmFsc2U7Cn0KCiR0aGlzLT5pbml0T3V0cHV0KCRvcHRpb25zKTsKCnJldHVybiAkdGhpcy0+c3RhdHVzQ29kZSA9ICR0aGlzLT5jb21tYW5kLT5ydW4oJHRoaXMtPmlucHV0LCAkdGhpcy0+b3V0cHV0KTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXJcQ29uc3RyYWludDsKCnVzZSBQSFBVbml0XEZyYW1ld29ya1xDb25zdHJhaW50XENvbnN0cmFpbnQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXENvbW1hbmRcQ29tbWFuZDsKCmZpbmFsIGNsYXNzIENvbW1hbmRJc1N1Y2Nlc3NmdWwgZXh0ZW5kcyBDb25zdHJhaW50CnsKCgoKcHVibGljIGZ1bmN0aW9uIHRvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAnaXMgc3VjY2Vzc2Z1bCc7Cn0KCgoKCnByb3RlY3RlZCBmdW5jdGlvbiBtYXRjaGVzKCRvdGhlcik6IGJvb2wKewpyZXR1cm4gQ29tbWFuZDo6U1VDQ0VTUyA9PT0gJG90aGVyOwp9CgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gZmFpbHVyZURlc2NyaXB0aW9uKCRvdGhlcik6IHN0cmluZwp7CnJldHVybiAndGhlIGNvbW1hbmQgJy4kdGhpcy0+dG9TdHJpbmcoKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGFkZGl0aW9uYWxGYWlsdXJlRGVzY3JpcHRpb24oJG90aGVyKTogc3RyaW5nCnsKJG1hcHBpbmcgPSBbCkNvbW1hbmQ6OkZBSUxVUkUgPT4gJ0NvbW1hbmQgZmFpbGVkLicsCkNvbW1hbmQ6OklOVkFMSUQgPT4gJ0NvbW1hbmQgd2FzIGludmFsaWQuJywKXTsKCnJldHVybiAkbWFwcGluZ1skb3RoZXJdID8/IHNwcmludGYoJ0NvbW1hbmQgcmV0dXJuZWQgZXhpdCBzdGF0dXMgJWQuJywgJG90aGVyKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxUZXN0ZXI7Cgp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcQXNzZXJ0Owp1c2UgU3ltZm9ueVxDb21wb25lbnRcQ29uc29sZVxJbnB1dFxJbnB1dEludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XENvbnNvbGVcT3V0cHV0XENvbnNvbGVPdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxPdXRwdXRJbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXE91dHB1dFxTdHJlYW1PdXRwdXQ7CnVzZSBTeW1mb255XENvbXBvbmVudFxDb25zb2xlXFRlc3RlclxDb25zdHJhaW50XENvbW1hbmRJc1N1Y2Nlc3NmdWw7CgoKCgp0cmFpdCBUZXN0ZXJUcmFpdAp7Cgpwcml2YXRlICRvdXRwdXQ7CnByaXZhdGUgJGlucHV0cyA9IFtdOwpwcml2YXRlICRjYXB0dXJlU3RyZWFtc0luZGVwZW5kZW50bHkgPSBmYWxzZTsKCnByaXZhdGUgJGlucHV0OwoKcHJpdmF0ZSAkc3RhdHVzQ29kZTsKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGlzcGxheShib29sICRub3JtYWxpemUgPSBmYWxzZSkKewppZiAobnVsbCA9PT0gJHRoaXMtPm91dHB1dCkgewp0aHJvdyBuZXcgXFJ1bnRpbWVFeGNlcHRpb24oJ091dHB1dCBub3QgaW5pdGlhbGl6ZWQsIGRpZCB5b3UgZXhlY3V0ZSB0aGUgY29tbWFuZCBiZWZvcmUgcmVxdWVzdGluZyB0aGUgZGlzcGxheT8nKTsKfQoKcmV3aW5kKCR0aGlzLT5vdXRwdXQtPmdldFN0cmVhbSgpKTsKCiRkaXNwbGF5ID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+b3V0cHV0LT5nZXRTdHJlYW0oKSk7CgppZiAoJG5vcm1hbGl6ZSkgewokZGlzcGxheSA9IHN0cl9yZXBsYWNlKFxQSFBfRU9MLCAiXG4iLCAkZGlzcGxheSk7Cn0KCnJldHVybiAkZGlzcGxheTsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRFcnJvck91dHB1dChib29sICRub3JtYWxpemUgPSBmYWxzZSkKewppZiAoISR0aGlzLT5jYXB0dXJlU3RyZWFtc0luZGVwZW5kZW50bHkpIHsKdGhyb3cgbmV3IFxMb2dpY0V4Y2VwdGlvbignVGhlIGVycm9yIG91dHB1dCBpcyBub3QgYXZhaWxhYmxlIHdoZW4gdGhlIHRlc3RlciBpcyBydW4gd2l0aG91dCAiY2FwdHVyZV9zdGRlcnJfc2VwYXJhdGVseSIgb3B0aW9uIHNldC4nKTsKfQoKcmV3aW5kKCR0aGlzLT5vdXRwdXQtPmdldEVycm9yT3V0cHV0KCktPmdldFN0cmVhbSgpKTsKCiRkaXNwbGF5ID0gc3RyZWFtX2dldF9jb250ZW50cygkdGhpcy0+b3V0cHV0LT5nZXRFcnJvck91dHB1dCgpLT5nZXRTdHJlYW0oKSk7CgppZiAoJG5vcm1hbGl6ZSkgewokZGlzcGxheSA9IHN0cl9yZXBsYWNlKFxQSFBfRU9MLCAiXG4iLCAkZGlzcGxheSk7Cn0KCnJldHVybiAkZGlzcGxheTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0SW5wdXQoKQp7CnJldHVybiAkdGhpcy0+aW5wdXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE91dHB1dCgpCnsKcmV0dXJuICR0aGlzLT5vdXRwdXQ7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0U3RhdHVzQ29kZSgpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5zdGF0dXNDb2RlKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignU3RhdHVzIGNvZGUgbm90IGluaXRpYWxpemVkLCBkaWQgeW91IGV4ZWN1dGUgdGhlIGNvbW1hbmQgYmVmb3JlIHJlcXVlc3RpbmcgdGhlIHN0YXR1cyBjb2RlPycpOwp9CgpyZXR1cm4gJHRoaXMtPnN0YXR1c0NvZGU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBhc3NlcnRDb21tYW5kSXNTdWNjZXNzZnVsKHN0cmluZyAkbWVzc2FnZSA9ICcnKTogdm9pZAp7CkFzc2VydDo6YXNzZXJ0VGhhdCgkdGhpcy0+c3RhdHVzQ29kZSwgbmV3IENvbW1hbmRJc1N1Y2Nlc3NmdWwoKSwgJG1lc3NhZ2UpOwp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dHMoYXJyYXkgJGlucHV0cykKewokdGhpcy0+aW5wdXRzID0gJGlucHV0czsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpbml0T3V0cHV0KGFycmF5ICRvcHRpb25zKQp7CiR0aGlzLT5jYXB0dXJlU3RyZWFtc0luZGVwZW5kZW50bHkgPSBcYXJyYXlfa2V5X2V4aXN0cygnY2FwdHVyZV9zdGRlcnJfc2VwYXJhdGVseScsICRvcHRpb25zKSAmJiAkb3B0aW9uc1snY2FwdHVyZV9zdGRlcnJfc2VwYXJhdGVseSddOwppZiAoISR0aGlzLT5jYXB0dXJlU3RyZWFtc0luZGVwZW5kZW50bHkpIHsKJHRoaXMtPm91dHB1dCA9IG5ldyBTdHJlYW1PdXRwdXQoZm9wZW4oJ3BocDovL21lbW9yeScsICd3JywgZmFsc2UpKTsKaWYgKGlzc2V0KCRvcHRpb25zWydkZWNvcmF0ZWQnXSkpIHsKJHRoaXMtPm91dHB1dC0+c2V0RGVjb3JhdGVkKCRvcHRpb25zWydkZWNvcmF0ZWQnXSk7Cn0KaWYgKGlzc2V0KCRvcHRpb25zWyd2ZXJib3NpdHknXSkpIHsKJHRoaXMtPm91dHB1dC0+c2V0VmVyYm9zaXR5KCRvcHRpb25zWyd2ZXJib3NpdHknXSk7Cn0KfSBlbHNlIHsKJHRoaXMtPm91dHB1dCA9IG5ldyBDb25zb2xlT3V0cHV0KAokb3B0aW9uc1sndmVyYm9zaXR5J10gPz8gQ29uc29sZU91dHB1dDo6VkVSQk9TSVRZX05PUk1BTCwKJG9wdGlvbnNbJ2RlY29yYXRlZCddID8/IG51bGwKKTsKCiRlcnJvck91dHB1dCA9IG5ldyBTdHJlYW1PdXRwdXQoZm9wZW4oJ3BocDovL21lbW9yeScsICd3JywgZmFsc2UpKTsKJGVycm9yT3V0cHV0LT5zZXRGb3JtYXR0ZXIoJHRoaXMtPm91dHB1dC0+Z2V0Rm9ybWF0dGVyKCkpOwokZXJyb3JPdXRwdXQtPnNldFZlcmJvc2l0eSgkdGhpcy0+b3V0cHV0LT5nZXRWZXJib3NpdHkoKSk7CiRlcnJvck91dHB1dC0+c2V0RGVjb3JhdGVkKCR0aGlzLT5vdXRwdXQtPmlzRGVjb3JhdGVkKCkpOwoKJHJlZmxlY3RlZE91dHB1dCA9IG5ldyBcUmVmbGVjdGlvbk9iamVjdCgkdGhpcy0+b3V0cHV0KTsKJHN0ckVyclByb3BlcnR5ID0gJHJlZmxlY3RlZE91dHB1dC0+Z2V0UHJvcGVydHkoJ3N0ZGVycicpOwokc3RyRXJyUHJvcGVydHktPnNldEFjY2Vzc2libGUodHJ1ZSk7CiRzdHJFcnJQcm9wZXJ0eS0+c2V0VmFsdWUoJHRoaXMtPm91dHB1dCwgJGVycm9yT3V0cHV0KTsKCiRyZWZsZWN0ZWRQYXJlbnQgPSAkcmVmbGVjdGVkT3V0cHV0LT5nZXRQYXJlbnRDbGFzcygpOwokc3RyZWFtUHJvcGVydHkgPSAkcmVmbGVjdGVkUGFyZW50LT5nZXRQcm9wZXJ0eSgnc3RyZWFtJyk7CiRzdHJlYW1Qcm9wZXJ0eS0+c2V0QWNjZXNzaWJsZSh0cnVlKTsKJHN0cmVhbVByb3BlcnR5LT5zZXRWYWx1ZSgkdGhpcy0+b3V0cHV0LCBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3cnLCBmYWxzZSkpOwp9Cn0KCgoKCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGNyZWF0ZVN0cmVhbShhcnJheSAkaW5wdXRzKQp7CiRzdHJlYW0gPSBmb3BlbigncGhwOi8vbWVtb3J5JywgJ3IrJywgZmFsc2UpOwoKZm9yZWFjaCAoJGlucHV0cyBhcyAkaW5wdXQpIHsKZndyaXRlKCRzdHJlYW0sICRpbnB1dC5cUEhQX0VPTCk7Cn0KCnJld2luZCgkc3RyZWFtKTsKCnJldHVybiAkc3RyZWFtOwp9Cn0KCkNvcHlyaWdodCAoYykgMjAyMC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3RyaWdnZXJfZGVwcmVjYXRpb24nKSkgewoKCgoKCgoKCgoKZnVuY3Rpb24gdHJpZ2dlcl9kZXByZWNhdGlvbihzdHJpbmcgJHBhY2thZ2UsIHN0cmluZyAkdmVyc2lvbiwgc3RyaW5nICRtZXNzYWdlLCAuLi4kYXJncyk6IHZvaWQKewpAdHJpZ2dlcl9lcnJvcigoJHBhY2thZ2UgfHwgJHZlcnNpb24gPyAiU2luY2UgJHBhY2thZ2UgJHZlcnNpb246ICIgOiAnJykuKCRhcmdzID8gdnNwcmludGYoJG1lc3NhZ2UsICRhcmdzKSA6ICRtZXNzYWdlKSwgXEVfVVNFUl9ERVBSRUNBVEVEKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKCgoKY2xhc3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24KewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP3N0cmluZyAkbWVzc2FnZSA9IG51bGwsIGludCAkY29kZSA9IDAsID9cVGhyb3dhYmxlICRwcmV2aW91cyA9IG51bGwsID9zdHJpbmcgJHBhdGggPSBudWxsKQp7CmlmIChudWxsID09PSAkbWVzc2FnZSkgewppZiAobnVsbCA9PT0gJHBhdGgpIHsKJG1lc3NhZ2UgPSAnRmlsZSBjb3VsZCBub3QgYmUgZm91bmQuJzsKfSBlbHNlIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdGaWxlICIlcyIgY291bGQgbm90IGJlIGZvdW5kLicsICRwYXRoKTsKfQp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRtZXNzYWdlLCAkY29kZSwgJHByZXZpb3VzLCAkcGF0aCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIElPRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBJT0V4Y2VwdGlvbkludGVyZmFjZQp7CnByaXZhdGUgJHBhdGg7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3Qoc3RyaW5nICRtZXNzYWdlLCBpbnQgJGNvZGUgPSAwLCA/XFRocm93YWJsZSAkcHJldmlvdXMgPSBudWxsLCA/c3RyaW5nICRwYXRoID0gbnVsbCkKewokdGhpcy0+cGF0aCA9ICRwYXRoOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkbWVzc2FnZSwgJGNvZGUsICRwcmV2aW91cyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCkKewpyZXR1cm4gJHRoaXMtPnBhdGg7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uOwoKCgoKCgppbnRlcmZhY2UgSU9FeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBFeGNlcHRpb25JbnRlcmZhY2UKewoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQYXRoKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvbjsKCgoKCmNsYXNzIEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbVxFeGNlcHRpb247CgoKCgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmlsZXN5c3RlbTsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxGaWxlTm90Rm91bmRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtXEV4Y2VwdGlvblxJT0V4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgRmlsZXN5c3RlbQp7CnByaXZhdGUgc3RhdGljICRsYXN0RXJyb3I7CgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNvcHkoc3RyaW5nICRvcmlnaW5GaWxlLCBzdHJpbmcgJHRhcmdldEZpbGUsIGJvb2wgJG92ZXJ3cml0ZU5ld2VyRmlsZXMgPSBmYWxzZSkKewokb3JpZ2luSXNMb2NhbCA9IHN0cmVhbV9pc19sb2NhbCgkb3JpZ2luRmlsZSkgfHwgMCA9PT0gc3RyaXBvcygkb3JpZ2luRmlsZSwgJ2ZpbGU6Ly8nKTsKaWYgKCRvcmlnaW5Jc0xvY2FsICYmICFpc19maWxlKCRvcmlnaW5GaWxlKSkgewp0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjb3B5ICIlcyIgYmVjYXVzZSBmaWxlIGRvZXMgbm90IGV4aXN0LicsICRvcmlnaW5GaWxlKSwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgokdGhpcy0+bWtkaXIoXGRpcm5hbWUoJHRhcmdldEZpbGUpKTsKCiRkb0NvcHkgPSB0cnVlOwppZiAoISRvdmVyd3JpdGVOZXdlckZpbGVzICYmICFwYXJzZV91cmwoJG9yaWdpbkZpbGUsIFxQSFBfVVJMX0hPU1QpICYmIGlzX2ZpbGUoJHRhcmdldEZpbGUpKSB7CiRkb0NvcHkgPSBmaWxlbXRpbWUoJG9yaWdpbkZpbGUpID4gZmlsZW10aW1lKCR0YXJnZXRGaWxlKTsKfQoKaWYgKCRkb0NvcHkpIHsKCmlmICghJHNvdXJjZSA9IHNlbGY6OmJveCgnZm9wZW4nLCAkb3JpZ2luRmlsZSwgJ3InKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNvcHkgIiVzIiB0byAiJXMiIGJlY2F1c2Ugc291cmNlIGZpbGUgY291bGQgbm90IGJlIG9wZW5lZCBmb3IgcmVhZGluZzogJywgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkb3JpZ2luRmlsZSk7Cn0KCgppZiAoISR0YXJnZXQgPSBzZWxmOjpib3goJ2ZvcGVuJywgJHRhcmdldEZpbGUsICd3JywgZmFsc2UsIHN0cmVhbV9jb250ZXh0X2NyZWF0ZShbJ2Z0cCcgPT4gWydvdmVyd3JpdGUnID0+IHRydWVdXSkpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY29weSAiJXMiIHRvICIlcyIgYmVjYXVzZSB0YXJnZXQgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciB3cml0aW5nOiAnLCAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQoKJGJ5dGVzQ29waWVkID0gc3RyZWFtX2NvcHlfdG9fc3RyZWFtKCRzb3VyY2UsICR0YXJnZXQpOwpmY2xvc2UoJHNvdXJjZSk7CmZjbG9zZSgkdGFyZ2V0KTsKdW5zZXQoJHNvdXJjZSwgJHRhcmdldCk7CgppZiAoIWlzX2ZpbGUoJHRhcmdldEZpbGUpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY29weSAiJXMiIHRvICIlcyIuJywgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlKSwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9CgppZiAoJG9yaWdpbklzTG9jYWwpIHsKCnNlbGY6OmJveCgnY2htb2QnLCAkdGFyZ2V0RmlsZSwgZmlsZXBlcm1zKCR0YXJnZXRGaWxlKSB8IChmaWxlcGVybXMoJG9yaWdpbkZpbGUpICYgMDExMSkpOwoKCnNlbGY6OmJveCgndG91Y2gnLCAkdGFyZ2V0RmlsZSwgZmlsZW10aW1lKCRvcmlnaW5GaWxlKSk7CgppZiAoJGJ5dGVzQ29waWVkICE9PSAkYnl0ZXNPcmlnaW4gPSBmaWxlc2l6ZSgkb3JpZ2luRmlsZSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjb3B5IHRoZSB3aG9sZSBjb250ZW50IG9mICIlcyIgdG8gIiVzIiAoJWcgb2YgJWcgYnl0ZXMgY29waWVkKS4nLCAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGUsICRieXRlc0NvcGllZCwgJGJ5dGVzT3JpZ2luKSwgMCwgbnVsbCwgJG9yaWdpbkZpbGUpOwp9Cn0KfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG1rZGlyKCRkaXJzLCBpbnQgJG1vZGUgPSAwNzc3KQp7CmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCRkaXJzKSBhcyAkZGlyKSB7CmlmIChpc19kaXIoJGRpcikpIHsKY29udGludWU7Cn0KCmlmICghc2VsZjo6Ym94KCdta2RpcicsICRkaXIsICRtb2RlLCB0cnVlKSAmJiAhaXNfZGlyKCRkaXIpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY3JlYXRlICIlcyI6ICcsICRkaXIpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRkaXIpOwp9Cn0KfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGlzdHMoJGZpbGVzKQp7CiRtYXhQYXRoTGVuZ3RoID0gXFBIUF9NQVhQQVRITEVOIC0gMjsKCmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCRmaWxlcykgYXMgJGZpbGUpIHsKaWYgKFxzdHJsZW4oJGZpbGUpID4gJG1heFBhdGhMZW5ndGgpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0NvdWxkIG5vdCBjaGVjayBpZiBmaWxlIGV4aXN0IGJlY2F1c2UgcGF0aCBsZW5ndGggZXhjZWVkcyAlZCBjaGFyYWN0ZXJzLicsICRtYXhQYXRoTGVuZ3RoKSwgMCwgbnVsbCwgJGZpbGUpOwp9CgppZiAoIWZpbGVfZXhpc3RzKCRmaWxlKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB0b3VjaCgkZmlsZXMsID9pbnQgJHRpbWUgPSBudWxsLCA/aW50ICRhdGltZSA9IG51bGwpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoISgkdGltZSA/IHNlbGY6OmJveCgndG91Y2gnLCAkZmlsZSwgJHRpbWUsICRhdGltZSkgOiBzZWxmOjpib3goJ3RvdWNoJywgJGZpbGUpKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHRvdWNoICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlbW92ZSgkZmlsZXMpCnsKaWYgKCRmaWxlcyBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewokZmlsZXMgPSBpdGVyYXRvcl90b19hcnJheSgkZmlsZXMsIGZhbHNlKTsKfSBlbHNlaWYgKCFcaXNfYXJyYXkoJGZpbGVzKSkgewokZmlsZXMgPSBbJGZpbGVzXTsKfQoKc2VsZjo6ZG9SZW1vdmUoJGZpbGVzLCBmYWxzZSk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGRvUmVtb3ZlKGFycmF5ICRmaWxlcywgYm9vbCAkaXNSZWN1cnNpdmUpOiB2b2lkCnsKJGZpbGVzID0gYXJyYXlfcmV2ZXJzZSgkZmlsZXMpOwpmb3JlYWNoICgkZmlsZXMgYXMgJGZpbGUpIHsKaWYgKGlzX2xpbmsoJGZpbGUpKSB7CgppZiAoIShzZWxmOjpib3goJ3VubGluaycsICRmaWxlKSB8fCAnXFwnICE9PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCBzZWxmOjpib3goJ3JtZGlyJywgJGZpbGUpKSAmJiBmaWxlX2V4aXN0cygkZmlsZSkpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byByZW1vdmUgc3ltbGluayAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvcik7Cn0KfSBlbHNlaWYgKGlzX2RpcigkZmlsZSkpIHsKaWYgKCEkaXNSZWN1cnNpdmUpIHsKJHRtcE5hbWUgPSBcZGlybmFtZShyZWFscGF0aCgkZmlsZSkpLicvLiEnLnN0cnJldihzdHJ0cihiYXNlNjRfZW5jb2RlKHJhbmRvbV9ieXRlcygyKSksICcvPScsICctIScpKTsKCmlmIChmaWxlX2V4aXN0cygkdG1wTmFtZSkpIHsKdHJ5IHsKc2VsZjo6ZG9SZW1vdmUoWyR0bXBOYW1lXSwgdHJ1ZSk7Cn0gY2F0Y2ggKElPRXhjZXB0aW9uICRlKSB7Cn0KfQoKaWYgKCFmaWxlX2V4aXN0cygkdG1wTmFtZSkgJiYgc2VsZjo6Ym94KCdyZW5hbWUnLCAkZmlsZSwgJHRtcE5hbWUpKSB7CiRvcmlnRmlsZSA9ICRmaWxlOwokZmlsZSA9ICR0bXBOYW1lOwp9IGVsc2Ugewokb3JpZ0ZpbGUgPSBudWxsOwp9Cn0KCiRmaWxlcyA9IG5ldyBcRmlsZXN5c3RlbUl0ZXJhdG9yKCRmaWxlLCBcRmlsZXN5c3RlbUl0ZXJhdG9yOjpDVVJSRU5UX0FTX1BBVEhOQU1FIHwgXEZpbGVzeXN0ZW1JdGVyYXRvcjo6U0tJUF9ET1RTKTsKc2VsZjo6ZG9SZW1vdmUoaXRlcmF0b3JfdG9fYXJyYXkoJGZpbGVzLCB0cnVlKSwgdHJ1ZSk7CgppZiAoIXNlbGY6OmJveCgncm1kaXInLCAkZmlsZSkgJiYgZmlsZV9leGlzdHMoJGZpbGUpICYmICEkaXNSZWN1cnNpdmUpIHsKJGxhc3RFcnJvciA9IHNlbGY6OiRsYXN0RXJyb3I7CgppZiAobnVsbCAhPT0gJG9yaWdGaWxlICYmIHNlbGY6OmJveCgncmVuYW1lJywgJGZpbGUsICRvcmlnRmlsZSkpIHsKJGZpbGUgPSAkb3JpZ0ZpbGU7Cn0KCnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gcmVtb3ZlIGRpcmVjdG9yeSAiJXMiOiAnLCAkZmlsZSkuJGxhc3RFcnJvcik7Cn0KfSBlbHNlaWYgKCFzZWxmOjpib3goJ3VubGluaycsICRmaWxlKSAmJiAoKHNlbGY6OiRsYXN0RXJyb3IgJiYgc3RyX2NvbnRhaW5zKHNlbGY6OiRsYXN0RXJyb3IsICdQZXJtaXNzaW9uIGRlbmllZCcpKSB8fCBmaWxlX2V4aXN0cygkZmlsZSkpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gcmVtb3ZlIGZpbGUgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IpOwp9Cn0KfQoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjaG1vZCgkZmlsZXMsIGludCAkbW9kZSwgaW50ICR1bWFzayA9IDAwMDAsIGJvb2wgJHJlY3Vyc2l2ZSA9IGZhbHNlKQp7CmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCRmaWxlcykgYXMgJGZpbGUpIHsKaWYgKChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCB8fCBcaXNfaW50KCRtb2RlKSkgJiYgIXNlbGY6OmJveCgnY2htb2QnLCAkZmlsZSwgJG1vZGUgJiB+JHVtYXNrKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIGNobW9kIGZpbGUgIiVzIjogJywgJGZpbGUpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICRmaWxlKTsKfQppZiAoJHJlY3Vyc2l2ZSAmJiBpc19kaXIoJGZpbGUpICYmICFpc19saW5rKCRmaWxlKSkgewokdGhpcy0+Y2htb2QobmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUpLCAkbW9kZSwgJHVtYXNrLCB0cnVlKTsKfQp9Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hvd24oJGZpbGVzLCAkdXNlciwgYm9vbCAkcmVjdXJzaXZlID0gZmFsc2UpCnsKZm9yZWFjaCAoJHRoaXMtPnRvSXRlcmFibGUoJGZpbGVzKSBhcyAkZmlsZSkgewppZiAoJHJlY3Vyc2l2ZSAmJiBpc19kaXIoJGZpbGUpICYmICFpc19saW5rKCRmaWxlKSkgewokdGhpcy0+Y2hvd24obmV3IFxGaWxlc3lzdGVtSXRlcmF0b3IoJGZpbGUpLCAkdXNlciwgdHJ1ZSk7Cn0KaWYgKGlzX2xpbmsoJGZpbGUpICYmIFxmdW5jdGlvbl9leGlzdHMoJ2xjaG93bicpKSB7CmlmICghc2VsZjo6Ym94KCdsY2hvd24nLCAkZmlsZSwgJHVzZXIpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY2hvd24gZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0gZWxzZSB7CmlmICghc2VsZjo6Ym94KCdjaG93bicsICRmaWxlLCAkdXNlcikpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjaG93biBmaWxlICIlcyI6ICcsICRmaWxlKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gY2hncnAoJGZpbGVzLCAkZ3JvdXAsIGJvb2wgJHJlY3Vyc2l2ZSA9IGZhbHNlKQp7CmZvcmVhY2ggKCR0aGlzLT50b0l0ZXJhYmxlKCRmaWxlcykgYXMgJGZpbGUpIHsKaWYgKCRyZWN1cnNpdmUgJiYgaXNfZGlyKCRmaWxlKSAmJiAhaXNfbGluaygkZmlsZSkpIHsKJHRoaXMtPmNoZ3JwKG5ldyBcRmlsZXN5c3RlbUl0ZXJhdG9yKCRmaWxlKSwgJGdyb3VwLCB0cnVlKTsKfQppZiAoaXNfbGluaygkZmlsZSkgJiYgXGZ1bmN0aW9uX2V4aXN0cygnbGNoZ3JwJykpIHsKaWYgKCFzZWxmOjpib3goJ2xjaGdycCcsICRmaWxlLCAkZ3JvdXApKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY2hncnAgZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0gZWxzZSB7CmlmICghc2VsZjo6Ym94KCdjaGdycCcsICRmaWxlLCAkZ3JvdXApKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdGYWlsZWQgdG8gY2hncnAgZmlsZSAiJXMiOiAnLCAkZmlsZSkuc2VsZjo6JGxhc3RFcnJvciwgMCwgbnVsbCwgJGZpbGUpOwp9Cn0KfQp9CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVuYW1lKHN0cmluZyAkb3JpZ2luLCBzdHJpbmcgJHRhcmdldCwgYm9vbCAkb3ZlcndyaXRlID0gZmFsc2UpCnsKCmlmICghJG92ZXJ3cml0ZSAmJiAkdGhpcy0+aXNSZWFkYWJsZSgkdGFyZ2V0KSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHJlbmFtZSBiZWNhdXNlIHRoZSB0YXJnZXQgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkdGFyZ2V0KSwgMCwgbnVsbCwgJHRhcmdldCk7Cn0KCmlmICghc2VsZjo6Ym94KCdyZW5hbWUnLCAkb3JpZ2luLCAkdGFyZ2V0KSkgewppZiAoaXNfZGlyKCRvcmlnaW4pKSB7CgokdGhpcy0+bWlycm9yKCRvcmlnaW4sICR0YXJnZXQsIG51bGwsIFsnb3ZlcnJpZGUnID0+ICRvdmVyd3JpdGUsICdkZWxldGUnID0+ICRvdmVyd3JpdGVdKTsKJHRoaXMtPnJlbW92ZSgkb3JpZ2luKTsKCnJldHVybjsKfQp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignQ2Fubm90IHJlbmFtZSAiJXMiIHRvICIlcyI6ICcsICRvcmlnaW4sICR0YXJnZXQpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICR0YXJnZXQpOwp9Cn0KCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBpc1JlYWRhYmxlKHN0cmluZyAkZmlsZW5hbWUpOiBib29sCnsKJG1heFBhdGhMZW5ndGggPSBcUEhQX01BWFBBVEhMRU4gLSAyOwoKaWYgKFxzdHJsZW4oJGZpbGVuYW1lKSA+ICRtYXhQYXRoTGVuZ3RoKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdDb3VsZCBub3QgY2hlY2sgaWYgZmlsZSBpcyByZWFkYWJsZSBiZWNhdXNlIHBhdGggbGVuZ3RoIGV4Y2VlZHMgJWQgY2hhcmFjdGVycy4nLCAkbWF4UGF0aExlbmd0aCksIDAsIG51bGwsICRmaWxlbmFtZSk7Cn0KCnJldHVybiBpc19yZWFkYWJsZSgkZmlsZW5hbWUpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzeW1saW5rKHN0cmluZyAkb3JpZ2luRGlyLCBzdHJpbmcgJHRhcmdldERpciwgYm9vbCAkY29weU9uV2luZG93cyA9IGZhbHNlKQp7CnNlbGY6OmFzc2VydEZ1bmN0aW9uRXhpc3RzKCdzeW1saW5rJyk7CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJG9yaWdpbkRpciA9IHN0cnRyKCRvcmlnaW5EaXIsICcvJywgJ1xcJyk7CiR0YXJnZXREaXIgPSBzdHJ0cigkdGFyZ2V0RGlyLCAnLycsICdcXCcpOwoKaWYgKCRjb3B5T25XaW5kb3dzKSB7CiR0aGlzLT5taXJyb3IoJG9yaWdpbkRpciwgJHRhcmdldERpcik7CgpyZXR1cm47Cn0KfQoKJHRoaXMtPm1rZGlyKFxkaXJuYW1lKCR0YXJnZXREaXIpKTsKCmlmIChpc19saW5rKCR0YXJnZXREaXIpKSB7CmlmIChyZWFkbGluaygkdGFyZ2V0RGlyKSA9PT0gJG9yaWdpbkRpcikgewpyZXR1cm47Cn0KJHRoaXMtPnJlbW92ZSgkdGFyZ2V0RGlyKTsKfQoKaWYgKCFzZWxmOjpib3goJ3N5bWxpbmsnLCAkb3JpZ2luRGlyLCAkdGFyZ2V0RGlyKSkgewokdGhpcy0+bGlua0V4Y2VwdGlvbigkb3JpZ2luRGlyLCAkdGFyZ2V0RGlyLCAnc3ltYm9saWMnKTsKfQp9CgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBoYXJkbGluayhzdHJpbmcgJG9yaWdpbkZpbGUsICR0YXJnZXRGaWxlcykKewpzZWxmOjphc3NlcnRGdW5jdGlvbkV4aXN0cygnbGluaycpOwoKaWYgKCEkdGhpcy0+ZXhpc3RzKCRvcmlnaW5GaWxlKSkgewp0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKG51bGwsIDAsIG51bGwsICRvcmlnaW5GaWxlKTsKfQoKaWYgKCFpc19maWxlKCRvcmlnaW5GaWxlKSkgewp0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ09yaWdpbiBmaWxlICIlcyIgaXMgbm90IGEgZmlsZS4nLCAkb3JpZ2luRmlsZSkpOwp9Cgpmb3JlYWNoICgkdGhpcy0+dG9JdGVyYWJsZSgkdGFyZ2V0RmlsZXMpIGFzICR0YXJnZXRGaWxlKSB7CmlmIChpc19maWxlKCR0YXJnZXRGaWxlKSkgewppZiAoZmlsZWlub2RlKCRvcmlnaW5GaWxlKSA9PT0gZmlsZWlub2RlKCR0YXJnZXRGaWxlKSkgewpjb250aW51ZTsKfQokdGhpcy0+cmVtb3ZlKCR0YXJnZXRGaWxlKTsKfQoKaWYgKCFzZWxmOjpib3goJ2xpbmsnLCAkb3JpZ2luRmlsZSwgJHRhcmdldEZpbGUpKSB7CiR0aGlzLT5saW5rRXhjZXB0aW9uKCRvcmlnaW5GaWxlLCAkdGFyZ2V0RmlsZSwgJ2hhcmQnKTsKfQp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gbGlua0V4Y2VwdGlvbihzdHJpbmcgJG9yaWdpbiwgc3RyaW5nICR0YXJnZXQsIHN0cmluZyAkbGlua1R5cGUpCnsKaWYgKHNlbGY6OiRsYXN0RXJyb3IpIHsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmIHN0cl9jb250YWlucyhzZWxmOjokbGFzdEVycm9yLCAnZXJyb3IgY29kZSgxMzE0KScpKSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdVbmFibGUgdG8gY3JlYXRlICIlcyIgbGluayBkdWUgdG8gZXJyb3IgY29kZSAxMzE0OiBcJ0EgcmVxdWlyZWQgcHJpdmlsZWdlIGlzIG5vdCBoZWxkIGJ5IHRoZSBjbGllbnRcJy4gRG8geW91IGhhdmUgdGhlIHJlcXVpcmVkIEFkbWluaXN0cmF0b3ItcmlnaHRzPycsICRsaW5rVHlwZSksIDAsIG51bGwsICR0YXJnZXQpOwp9Cn0KdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ0ZhaWxlZCB0byBjcmVhdGUgIiVzIiBsaW5rIGZyb20gIiVzIiB0byAiJXMiOiAnLCAkbGlua1R5cGUsICRvcmlnaW4sICR0YXJnZXQpLnNlbGY6OiRsYXN0RXJyb3IsIDAsIG51bGwsICR0YXJnZXQpOwp9CgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlYWRsaW5rKHN0cmluZyAkcGF0aCwgYm9vbCAkY2Fub25pY2FsaXplID0gZmFsc2UpCnsKaWYgKCEkY2Fub25pY2FsaXplICYmICFpc19saW5rKCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKCRjYW5vbmljYWxpemUpIHsKaWYgKCEkdGhpcy0+ZXhpc3RzKCRwYXRoKSkgewpyZXR1cm4gbnVsbDsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmIFxQSFBfVkVSU0lPTl9JRCA8IDcwNDEwKSB7CiRwYXRoID0gcmVhZGxpbmsoJHBhdGgpOwp9CgpyZXR1cm4gcmVhbHBhdGgoJHBhdGgpOwp9CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgXFBIUF9WRVJTSU9OX0lEIDwgNzA0MDApIHsKcmV0dXJuIHJlYWxwYXRoKCRwYXRoKTsKfQoKcmV0dXJuIHJlYWRsaW5rKCRwYXRoKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbWFrZVBhdGhSZWxhdGl2ZShzdHJpbmcgJGVuZFBhdGgsIHN0cmluZyAkc3RhcnRQYXRoKQp7CmlmICghJHRoaXMtPmlzQWJzb2x1dGVQYXRoKCRzdGFydFBhdGgpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIHN0YXJ0IHBhdGggIiVzIiBpcyBub3QgYWJzb2x1dGUuJywgJHN0YXJ0UGF0aCkpOwp9CgppZiAoISR0aGlzLT5pc0Fic29sdXRlUGF0aCgkZW5kUGF0aCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgZW5kIHBhdGggIiVzIiBpcyBub3QgYWJzb2x1dGUuJywgJGVuZFBhdGgpKTsKfQoKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokZW5kUGF0aCA9IHN0cl9yZXBsYWNlKCdcXCcsICcvJywgJGVuZFBhdGgpOwokc3RhcnRQYXRoID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkc3RhcnRQYXRoKTsKfQoKJHNwbGl0RHJpdmVMZXR0ZXIgPSBmdW5jdGlvbiAoJHBhdGgpIHsKcmV0dXJuIChcc3RybGVuKCRwYXRoKSA+IDIgJiYgJzonID09PSAkcGF0aFsxXSAmJiAnLycgPT09ICRwYXRoWzJdICYmIGN0eXBlX2FscGhhKCRwYXRoWzBdKSkKPyBbc3Vic3RyKCRwYXRoLCAyKSwgc3RydG91cHBlcigkcGF0aFswXSldCjogWyRwYXRoLCBudWxsXTsKfTsKCiRzcGxpdFBhdGggPSBmdW5jdGlvbiAoJHBhdGgpIHsKJHJlc3VsdCA9IFtdOwoKZm9yZWFjaCAoZXhwbG9kZSgnLycsIHRyaW0oJHBhdGgsICcvJykpIGFzICRzZWdtZW50KSB7CmlmICgnLi4nID09PSAkc2VnbWVudCkgewphcnJheV9wb3AoJHJlc3VsdCk7Cn0gZWxzZWlmICgnLicgIT09ICRzZWdtZW50ICYmICcnICE9PSAkc2VnbWVudCkgewokcmVzdWx0W10gPSAkc2VnbWVudDsKfQp9CgpyZXR1cm4gJHJlc3VsdDsKfTsKClskZW5kUGF0aCwgJGVuZERyaXZlTGV0dGVyXSA9ICRzcGxpdERyaXZlTGV0dGVyKCRlbmRQYXRoKTsKWyRzdGFydFBhdGgsICRzdGFydERyaXZlTGV0dGVyXSA9ICRzcGxpdERyaXZlTGV0dGVyKCRzdGFydFBhdGgpOwoKJHN0YXJ0UGF0aEFyciA9ICRzcGxpdFBhdGgoJHN0YXJ0UGF0aCk7CiRlbmRQYXRoQXJyID0gJHNwbGl0UGF0aCgkZW5kUGF0aCk7CgppZiAoJGVuZERyaXZlTGV0dGVyICYmICRzdGFydERyaXZlTGV0dGVyICYmICRlbmREcml2ZUxldHRlciAhPSAkc3RhcnREcml2ZUxldHRlcikgewoKcmV0dXJuICRlbmREcml2ZUxldHRlci4nOi8nLigkZW5kUGF0aEFyciA/IGltcGxvZGUoJy8nLCAkZW5kUGF0aEFycikuJy8nIDogJycpOwp9CgoKJGluZGV4ID0gMDsKd2hpbGUgKGlzc2V0KCRzdGFydFBhdGhBcnJbJGluZGV4XSkgJiYgaXNzZXQoJGVuZFBhdGhBcnJbJGluZGV4XSkgJiYgJHN0YXJ0UGF0aEFyclskaW5kZXhdID09PSAkZW5kUGF0aEFyclskaW5kZXhdKSB7CisrJGluZGV4Owp9CgoKaWYgKDEgPT09IFxjb3VudCgkc3RhcnRQYXRoQXJyKSAmJiAnJyA9PT0gJHN0YXJ0UGF0aEFyclswXSkgewokZGVwdGggPSAwOwp9IGVsc2UgewokZGVwdGggPSBcY291bnQoJHN0YXJ0UGF0aEFycikgLSAkaW5kZXg7Cn0KCgokdHJhdmVyc2VyID0gc3RyX3JlcGVhdCgnLi4vJywgJGRlcHRoKTsKCiRlbmRQYXRoUmVtYWluZGVyID0gaW1wbG9kZSgnLycsIFxhcnJheV9zbGljZSgkZW5kUGF0aEFyciwgJGluZGV4KSk7CgoKJHJlbGF0aXZlUGF0aCA9ICR0cmF2ZXJzZXIuKCcnICE9PSAkZW5kUGF0aFJlbWFpbmRlciA/ICRlbmRQYXRoUmVtYWluZGVyLicvJyA6ICcnKTsKCnJldHVybiAnJyA9PT0gJHJlbGF0aXZlUGF0aCA/ICcuLycgOiAkcmVsYXRpdmVQYXRoOwp9CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBtaXJyb3Ioc3RyaW5nICRvcmlnaW5EaXIsIHN0cmluZyAkdGFyZ2V0RGlyLCA/XFRyYXZlcnNhYmxlICRpdGVyYXRvciA9IG51bGwsIGFycmF5ICRvcHRpb25zID0gW10pCnsKJHRhcmdldERpciA9IHJ0cmltKCR0YXJnZXREaXIsICcvXFwnKTsKJG9yaWdpbkRpciA9IHJ0cmltKCRvcmlnaW5EaXIsICcvXFwnKTsKJG9yaWdpbkRpckxlbiA9IFxzdHJsZW4oJG9yaWdpbkRpcik7CgppZiAoISR0aGlzLT5leGlzdHMoJG9yaWdpbkRpcikpIHsKdGhyb3cgbmV3IElPRXhjZXB0aW9uKHNwcmludGYoJ1RoZSBvcmlnaW4gZGlyZWN0b3J5IHNwZWNpZmllZCAiJXMiIHdhcyBub3QgZm91bmQuJywgJG9yaWdpbkRpciksIDAsIG51bGwsICRvcmlnaW5EaXIpOwp9CgoKaWYgKCR0aGlzLT5leGlzdHMoJHRhcmdldERpcikgJiYgaXNzZXQoJG9wdGlvbnNbJ2RlbGV0ZSddKSAmJiAkb3B0aW9uc1snZGVsZXRlJ10pIHsKJGRlbGV0ZUl0ZXJhdG9yID0gJGl0ZXJhdG9yOwppZiAobnVsbCA9PT0gJGRlbGV0ZUl0ZXJhdG9yKSB7CiRmbGFncyA9IFxGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUzsKJGRlbGV0ZUl0ZXJhdG9yID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJHRhcmdldERpciwgJGZsYWdzKSwgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OkNISUxEX0ZJUlNUKTsKfQokdGFyZ2V0RGlyTGVuID0gXHN0cmxlbigkdGFyZ2V0RGlyKTsKZm9yZWFjaCAoJGRlbGV0ZUl0ZXJhdG9yIGFzICRmaWxlKSB7CiRvcmlnaW4gPSAkb3JpZ2luRGlyLnN1YnN0cigkZmlsZS0+Z2V0UGF0aG5hbWUoKSwgJHRhcmdldERpckxlbik7CmlmICghJHRoaXMtPmV4aXN0cygkb3JpZ2luKSkgewokdGhpcy0+cmVtb3ZlKCRmaWxlKTsKfQp9Cn0KCiRjb3B5T25XaW5kb3dzID0gJG9wdGlvbnNbJ2NvcHlfb25fd2luZG93cyddID8/IGZhbHNlOwoKaWYgKG51bGwgPT09ICRpdGVyYXRvcikgewokZmxhZ3MgPSAkY29weU9uV2luZG93cyA/IFxGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUyB8IFxGaWxlc3lzdGVtSXRlcmF0b3I6OkZPTExPV19TWU1MSU5LUyA6IFxGaWxlc3lzdGVtSXRlcmF0b3I6OlNLSVBfRE9UUzsKJGl0ZXJhdG9yID0gbmV3IFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yKG5ldyBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJG9yaWdpbkRpciwgJGZsYWdzKSwgXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3I6OlNFTEZfRklSU1QpOwp9CgokdGhpcy0+bWtkaXIoJHRhcmdldERpcik7CiRmaWxlc0NyZWF0ZWRXaGlsZU1pcnJvcmluZyA9IFtdOwoKZm9yZWFjaCAoJGl0ZXJhdG9yIGFzICRmaWxlKSB7CmlmICgkZmlsZS0+Z2V0UGF0aG5hbWUoKSA9PT0gJHRhcmdldERpciB8fCAkZmlsZS0+Z2V0UmVhbFBhdGgoKSA9PT0gJHRhcmdldERpciB8fCBpc3NldCgkZmlsZXNDcmVhdGVkV2hpbGVNaXJyb3JpbmdbJGZpbGUtPmdldFJlYWxQYXRoKCldKSkgewpjb250aW51ZTsKfQoKJHRhcmdldCA9ICR0YXJnZXREaXIuc3Vic3RyKCRmaWxlLT5nZXRQYXRobmFtZSgpLCAkb3JpZ2luRGlyTGVuKTsKJGZpbGVzQ3JlYXRlZFdoaWxlTWlycm9yaW5nWyR0YXJnZXRdID0gdHJ1ZTsKCmlmICghJGNvcHlPbldpbmRvd3MgJiYgaXNfbGluaygkZmlsZSkpIHsKJHRoaXMtPnN5bWxpbmsoJGZpbGUtPmdldExpbmtUYXJnZXQoKSwgJHRhcmdldCk7Cn0gZWxzZWlmIChpc19kaXIoJGZpbGUpKSB7CiR0aGlzLT5ta2RpcigkdGFyZ2V0KTsKfSBlbHNlaWYgKGlzX2ZpbGUoJGZpbGUpKSB7CiR0aGlzLT5jb3B5KCRmaWxlLCAkdGFyZ2V0LCAkb3B0aW9uc1snb3ZlcnJpZGUnXSA/PyBmYWxzZSk7Cn0gZWxzZSB7CnRocm93IG5ldyBJT0V4Y2VwdGlvbihzcHJpbnRmKCdVbmFibGUgdG8gZ3Vlc3MgIiVzIiBmaWxlIHR5cGUuJywgJGZpbGUpLCAwLCBudWxsLCAkZmlsZSk7Cn0KfQp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Fic29sdXRlUGF0aChzdHJpbmcgJGZpbGUpCnsKcmV0dXJuICcnICE9PSAkZmlsZSAmJiAoc3Ryc3BuKCRmaWxlLCAnL1xcJywgMCwgMSkKfHwgKFxzdHJsZW4oJGZpbGUpID4gMyAmJiBjdHlwZV9hbHBoYSgkZmlsZVswXSkKJiYgJzonID09PSAkZmlsZVsxXQomJiBzdHJzcG4oJGZpbGUsICcvXFwnLCAyLCAxKQopCnx8IG51bGwgIT09IHBhcnNlX3VybCgkZmlsZSwgXFBIUF9VUkxfU0NIRU1FKQopOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdGVtcG5hbShzdHJpbmcgJGRpciwgc3RyaW5nICRwcmVmaXgpCnsKJHN1ZmZpeCA9IFxmdW5jX251bV9hcmdzKCkgPiAyID8gZnVuY19nZXRfYXJnKDIpIDogJyc7Clskc2NoZW1lLCAkaGllcmFyY2h5XSA9ICR0aGlzLT5nZXRTY2hlbWVBbmRIaWVyYXJjaHkoJGRpcik7CgoKaWYgKChudWxsID09PSAkc2NoZW1lIHx8ICdmaWxlJyA9PT0gJHNjaGVtZSB8fCAnZ3MnID09PSAkc2NoZW1lKSAmJiAnJyA9PT0gJHN1ZmZpeCkgewoKaWYgKCR0bXBGaWxlID0gc2VsZjo6Ym94KCd0ZW1wbmFtJywgJGhpZXJhcmNoeSwgJHByZWZpeCkpIHsKaWYgKG51bGwgIT09ICRzY2hlbWUgJiYgJ2dzJyAhPT0gJHNjaGVtZSkgewpyZXR1cm4gJHNjaGVtZS4nOi8vJy4kdG1wRmlsZTsKfQoKcmV0dXJuICR0bXBGaWxlOwp9Cgp0aHJvdyBuZXcgSU9FeGNlcHRpb24oJ0EgdGVtcG9yYXJ5IGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQ6ICcuc2VsZjo6JGxhc3RFcnJvcik7Cn0KCgpmb3IgKCRpID0gMDsgJGkgPCAxMDsgKyskaSkgewoKJHRtcEZpbGUgPSAkZGlyLicvJy4kcHJlZml4LnVuaXFpZChtdF9yYW5kKCksIHRydWUpLiRzdWZmaXg7CgoKCmlmICghJGhhbmRsZSA9IHNlbGY6OmJveCgnZm9wZW4nLCAkdG1wRmlsZSwgJ3grJykpIHsKY29udGludWU7Cn0KCgpzZWxmOjpib3goJ2ZjbG9zZScsICRoYW5kbGUpOwoKcmV0dXJuICR0bXBGaWxlOwp9Cgp0aHJvdyBuZXcgSU9FeGNlcHRpb24oJ0EgdGVtcG9yYXJ5IGZpbGUgY291bGQgbm90IGJlIGNyZWF0ZWQ6ICcuc2VsZjo6JGxhc3RFcnJvcik7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZHVtcEZpbGUoc3RyaW5nICRmaWxlbmFtZSwgJGNvbnRlbnQpCnsKaWYgKFxpc19hcnJheSgkY29udGVudCkpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgMiBwYXNzZWQgdG8gIiVzKCkiIG11c3QgYmUgc3RyaW5nIG9yIHJlc291cmNlLCBhcnJheSBnaXZlbi4nLCBfX01FVEhPRF9fKSk7Cn0KCiRkaXIgPSBcZGlybmFtZSgkZmlsZW5hbWUpOwoKaWYgKGlzX2xpbmsoJGZpbGVuYW1lKSAmJiAkbGlua1RhcmdldCA9ICR0aGlzLT5yZWFkbGluaygkZmlsZW5hbWUpKSB7CiR0aGlzLT5kdW1wRmlsZShQYXRoOjptYWtlQWJzb2x1dGUoJGxpbmtUYXJnZXQsICRkaXIpLCAkY29udGVudCk7CgpyZXR1cm47Cn0KCmlmICghaXNfZGlyKCRkaXIpKSB7CiR0aGlzLT5ta2RpcigkZGlyKTsKfQoKCgokdG1wRmlsZSA9ICR0aGlzLT50ZW1wbmFtKCRkaXIsIGJhc2VuYW1lKCRmaWxlbmFtZSkpOwoKdHJ5IHsKaWYgKGZhbHNlID09PSBzZWxmOjpib3goJ2ZpbGVfcHV0X2NvbnRlbnRzJywgJHRtcEZpbGUsICRjb250ZW50KSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHdyaXRlIGZpbGUgIiVzIjogJywgJGZpbGVuYW1lKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZW5hbWUpOwp9CgpzZWxmOjpib3goJ2NobW9kJywgJHRtcEZpbGUsIHNlbGY6OmJveCgnZmlsZXBlcm1zJywgJGZpbGVuYW1lKSA/OiAwNjY2ICYgfnVtYXNrKCkpOwoKJHRoaXMtPnJlbmFtZSgkdG1wRmlsZSwgJGZpbGVuYW1lLCB0cnVlKTsKfSBmaW5hbGx5IHsKaWYgKGZpbGVfZXhpc3RzKCR0bXBGaWxlKSkgewppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgJiYgIWlzX3dyaXRhYmxlKCR0bXBGaWxlKSkgewpzZWxmOjpib3goJ2NobW9kJywgJHRtcEZpbGUsIHNlbGY6OmJveCgnZmlsZXBlcm1zJywgJHRtcEZpbGUpIHwgMDIwMCk7Cn0KCnNlbGY6OmJveCgndW5saW5rJywgJHRtcEZpbGUpOwp9Cn0KfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXBwZW5kVG9GaWxlKHN0cmluZyAkZmlsZW5hbWUsICRjb250ZW50KQp7CmlmIChcaXNfYXJyYXkoJGNvbnRlbnQpKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50IDIgcGFzc2VkIHRvICIlcygpIiBtdXN0IGJlIHN0cmluZyBvciByZXNvdXJjZSwgYXJyYXkgZ2l2ZW4uJywgX19NRVRIT0RfXykpOwp9CgokZGlyID0gXGRpcm5hbWUoJGZpbGVuYW1lKTsKCmlmICghaXNfZGlyKCRkaXIpKSB7CiR0aGlzLT5ta2RpcigkZGlyKTsKfQoKJGxvY2sgPSBcZnVuY19udW1fYXJncygpID4gMiAmJiBmdW5jX2dldF9hcmcoMik7CgppZiAoZmFsc2UgPT09IHNlbGY6OmJveCgnZmlsZV9wdXRfY29udGVudHMnLCAkZmlsZW5hbWUsICRjb250ZW50LCBcRklMRV9BUFBFTkQgfCAoJGxvY2sgPyBcTE9DS19FWCA6IDApKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignRmFpbGVkIHRvIHdyaXRlIGZpbGUgIiVzIjogJywgJGZpbGVuYW1lKS5zZWxmOjokbGFzdEVycm9yLCAwLCBudWxsLCAkZmlsZW5hbWUpOwp9Cn0KCnByaXZhdGUgZnVuY3Rpb24gdG9JdGVyYWJsZSgkZmlsZXMpOiBpdGVyYWJsZQp7CnJldHVybiBpc19pdGVyYWJsZSgkZmlsZXMpID8gJGZpbGVzIDogWyRmaWxlc107Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZ2V0U2NoZW1lQW5kSGllcmFyY2h5KHN0cmluZyAkZmlsZW5hbWUpOiBhcnJheQp7CiRjb21wb25lbnRzID0gZXhwbG9kZSgnOi8vJywgJGZpbGVuYW1lLCAyKTsKCnJldHVybiAyID09PSBcY291bnQoJGNvbXBvbmVudHMpID8gWyRjb21wb25lbnRzWzBdLCAkY29tcG9uZW50c1sxXV0gOiBbbnVsbCwgJGNvbXBvbmVudHNbMF1dOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBhc3NlcnRGdW5jdGlvbkV4aXN0cyhzdHJpbmcgJGZ1bmMpOiB2b2lkCnsKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCRmdW5jKSkgewp0aHJvdyBuZXcgSU9FeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIHBlcmZvcm0gZmlsZXN5c3RlbSBvcGVyYXRpb24gYmVjYXVzZSB0aGUgIiVzKCkiIGZ1bmN0aW9uIGhhcyBiZWVuIGRpc2FibGVkLicsICRmdW5jKSk7Cn0KfQoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBib3goc3RyaW5nICRmdW5jLCAuLi4kYXJncykKewpzZWxmOjphc3NlcnRGdW5jdGlvbkV4aXN0cygkZnVuYyk7CgpzZWxmOjokbGFzdEVycm9yID0gbnVsbDsKc2V0X2Vycm9yX2hhbmRsZXIoX19DTEFTU19fLic6OmhhbmRsZUVycm9yJyk7CnRyeSB7CnJldHVybiAkZnVuYyguLi4kYXJncyk7Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaGFuZGxlRXJyb3IoaW50ICR0eXBlLCBzdHJpbmcgJG1zZykKewpzZWxmOjokbGFzdEVycm9yID0gJG1zZzsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMDQtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaWxlc3lzdGVtOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbGVzeXN0ZW1cRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CgoKCgoKCgoKCgoKCmZpbmFsIGNsYXNzIFBhdGgKewoKCgpwcml2YXRlIGNvbnN0IENMRUFOVVBfVEhSRVNIT0xEID0gMTI1MDsKCgoKCnByaXZhdGUgY29uc3QgQ0xFQU5VUF9TSVpFID0gMTAwMDsKCgoKCgoKcHJpdmF0ZSBzdGF0aWMgJGJ1ZmZlciA9IFtdOwoKCgoKcHJpdmF0ZSBzdGF0aWMgJGJ1ZmZlclNpemUgPSAwOwoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKCgoKaWYgKGlzc2V0KHNlbGY6OiRidWZmZXJbJHBhdGhdKSkgewpyZXR1cm4gc2VsZjo6JGJ1ZmZlclskcGF0aF07Cn0KCgppZiAoJ34nID09PSAkcGF0aFswXSkgewokcGF0aCA9IHNlbGY6OmdldEhvbWVEaXJlY3RvcnkoKS5zdWJzdHIoJHBhdGgsIDEpOwp9CgokcGF0aCA9IHNlbGY6Om5vcm1hbGl6ZSgkcGF0aCk7CgpbJHJvb3QsICRwYXRoV2l0aG91dFJvb3RdID0gc2VsZjo6c3BsaXQoJHBhdGgpOwoKJGNhbm9uaWNhbFBhcnRzID0gc2VsZjo6ZmluZENhbm9uaWNhbFBhcnRzKCRyb290LCAkcGF0aFdpdGhvdXRSb290KTsKCgpzZWxmOjokYnVmZmVyWyRwYXRoXSA9ICRjYW5vbmljYWxQYXRoID0gJHJvb3QuaW1wbG9kZSgnLycsICRjYW5vbmljYWxQYXJ0cyk7Cisrc2VsZjo6JGJ1ZmZlclNpemU7CgoKaWYgKHNlbGY6OiRidWZmZXJTaXplID4gc2VsZjo6Q0xFQU5VUF9USFJFU0hPTEQpIHsKc2VsZjo6JGJ1ZmZlciA9IFxhcnJheV9zbGljZShzZWxmOjokYnVmZmVyLCAtc2VsZjo6Q0xFQU5VUF9TSVpFLCBudWxsLCB0cnVlKTsKc2VsZjo6JGJ1ZmZlclNpemUgPSBzZWxmOjpDTEVBTlVQX1NJWkU7Cn0KCnJldHVybiAkY2Fub25pY2FsUGF0aDsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG5vcm1hbGl6ZShzdHJpbmcgJHBhdGgpOiBzdHJpbmcKewpyZXR1cm4gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkcGF0aCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXREaXJlY3Rvcnkoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCiRwYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRwYXRoKTsKCgppZiAoZmFsc2UgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJzovLycpKSB7CiRzY2hlbWUgPSBzdWJzdHIoJHBhdGgsIDAsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwokcGF0aCA9IHN1YnN0cigkcGF0aCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7Cn0gZWxzZSB7CiRzY2hlbWUgPSAnJzsKfQoKaWYgKGZhbHNlID09PSAkZGlyU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJycG9zKCRwYXRoLCAnLycpKSB7CnJldHVybiAnJzsKfQoKCmlmICgwID09PSAkZGlyU2VwYXJhdG9yUG9zaXRpb24pIHsKcmV0dXJuICRzY2hlbWUuJy8nOwp9CgoKaWYgKDIgPT09ICRkaXJTZXBhcmF0b3JQb3NpdGlvbiAmJiBjdHlwZV9hbHBoYSgkcGF0aFswXSkgJiYgJzonID09PSAkcGF0aFsxXSkgewpyZXR1cm4gJHNjaGVtZS5zdWJzdHIoJHBhdGgsIDAsIDMpOwp9CgpyZXR1cm4gJHNjaGVtZS5zdWJzdHIoJHBhdGgsIDAsICRkaXJTZXBhcmF0b3JQb3NpdGlvbik7Cn0KCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRIb21lRGlyZWN0b3J5KCk6IHN0cmluZwp7CgppZiAoZ2V0ZW52KCdIT01FJykpIHsKcmV0dXJuIHNlbGY6OmNhbm9uaWNhbGl6ZShnZXRlbnYoJ0hPTUUnKSk7Cn0KCgppZiAoZ2V0ZW52KCdIT01FRFJJVkUnKSAmJiBnZXRlbnYoJ0hPTUVQQVRIJykpIHsKcmV0dXJuIHNlbGY6OmNhbm9uaWNhbGl6ZShnZXRlbnYoJ0hPTUVEUklWRScpLmdldGVudignSE9NRVBBVEgnKSk7Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgZmluZCB0aGUgaG9tZSBkaXJlY3RvcnkgcGF0aDogWW91ciBlbnZpcm9ubWVudCBvciBvcGVyYXRpbmcgc3lzdGVtIGlzbid0IHN1cHBvcnRlZC4iKTsKfQoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFJvb3Qoc3RyaW5nICRwYXRoKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCgppZiAoZmFsc2UgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkcGF0aCwgJzovLycpKSB7CiRzY2hlbWUgPSBzdWJzdHIoJHBhdGgsIDAsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwokcGF0aCA9IHN1YnN0cigkcGF0aCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7Cn0gZWxzZSB7CiRzY2hlbWUgPSAnJzsKfQoKJGZpcnN0Q2hhcmFjdGVyID0gJHBhdGhbMF07CgoKaWYgKCcvJyA9PT0gJGZpcnN0Q2hhcmFjdGVyIHx8ICdcXCcgPT09ICRmaXJzdENoYXJhY3RlcikgewpyZXR1cm4gJHNjaGVtZS4nLyc7Cn0KCiRsZW5ndGggPSBcc3RybGVuKCRwYXRoKTsKCgppZiAoJGxlbmd0aCA+IDEgJiYgJzonID09PSAkcGF0aFsxXSAmJiBjdHlwZV9hbHBoYSgkZmlyc3RDaGFyYWN0ZXIpKSB7CgppZiAoMiA9PT0gJGxlbmd0aCkgewpyZXR1cm4gJHNjaGVtZS4kcGF0aC4nLyc7Cn0KCgppZiAoJy8nID09PSAkcGF0aFsyXSB8fCAnXFwnID09PSAkcGF0aFsyXSkgewpyZXR1cm4gJHNjaGVtZS4kZmlyc3RDaGFyYWN0ZXIuJHBhdGhbMV0uJy8nOwp9Cn0KCnJldHVybiAnJzsKfQoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRGaWxlbmFtZVdpdGhvdXRFeHRlbnNpb24oc3RyaW5nICRwYXRoLCA/c3RyaW5nICRleHRlbnNpb24gPSBudWxsKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCmlmIChudWxsICE9PSAkZXh0ZW5zaW9uKSB7CgpyZXR1cm4gcnRyaW0oYmFzZW5hbWUoJHBhdGgsICRleHRlbnNpb24pLCAnLicpOwp9CgpyZXR1cm4gcGF0aGluZm8oJHBhdGgsIFxQQVRISU5GT19GSUxFTkFNRSk7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRFeHRlbnNpb24oc3RyaW5nICRwYXRoLCBib29sICRmb3JjZUxvd2VyQ2FzZSA9IGZhbHNlKTogc3RyaW5nCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gJyc7Cn0KCiRleHRlbnNpb24gPSBwYXRoaW5mbygkcGF0aCwgXFBBVEhJTkZPX0VYVEVOU0lPTik7CgppZiAoJGZvcmNlTG93ZXJDYXNlKSB7CiRleHRlbnNpb24gPSBzZWxmOjp0b0xvd2VyKCRleHRlbnNpb24pOwp9CgpyZXR1cm4gJGV4dGVuc2lvbjsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGhhc0V4dGVuc2lvbihzdHJpbmcgJHBhdGgsICRleHRlbnNpb25zID0gbnVsbCwgYm9vbCAkaWdub3JlQ2FzZSA9IGZhbHNlKTogYm9vbAp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuIGZhbHNlOwp9CgokYWN0dWFsRXh0ZW5zaW9uID0gc2VsZjo6Z2V0RXh0ZW5zaW9uKCRwYXRoLCAkaWdub3JlQ2FzZSk7CgoKaWYgKFtdID09PSAkZXh0ZW5zaW9ucyB8fCBudWxsID09PSAkZXh0ZW5zaW9ucykgewpyZXR1cm4gJycgIT09ICRhY3R1YWxFeHRlbnNpb247Cn0KCmlmIChcaXNfc3RyaW5nKCRleHRlbnNpb25zKSkgewokZXh0ZW5zaW9ucyA9IFskZXh0ZW5zaW9uc107Cn0KCmZvcmVhY2ggKCRleHRlbnNpb25zIGFzICRrZXkgPT4gJGV4dGVuc2lvbikgewppZiAoJGlnbm9yZUNhc2UpIHsKJGV4dGVuc2lvbiA9IHNlbGY6OnRvTG93ZXIoJGV4dGVuc2lvbik7Cn0KCgokZXh0ZW5zaW9uc1ska2V5XSA9IGx0cmltKCRleHRlbnNpb24sICcuJyk7Cn0KCnJldHVybiBcaW5fYXJyYXkoJGFjdHVhbEV4dGVuc2lvbiwgJGV4dGVuc2lvbnMsIHRydWUpOwp9CgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY2hhbmdlRXh0ZW5zaW9uKHN0cmluZyAkcGF0aCwgc3RyaW5nICRleHRlbnNpb24pOiBzdHJpbmcKewppZiAoJycgPT09ICRwYXRoKSB7CnJldHVybiAnJzsKfQoKJGFjdHVhbEV4dGVuc2lvbiA9IHNlbGY6OmdldEV4dGVuc2lvbigkcGF0aCk7CiRleHRlbnNpb24gPSBsdHJpbSgkZXh0ZW5zaW9uLCAnLicpOwoKCmlmICgnLycgPT09IHN1YnN0cigkcGF0aCwgLTEpKSB7CnJldHVybiAkcGF0aDsKfQoKCmlmIChlbXB0eSgkYWN0dWFsRXh0ZW5zaW9uKSkgewpyZXR1cm4gJHBhdGguKCcuJyA9PT0gc3Vic3RyKCRwYXRoLCAtMSkgPyAnJyA6ICcuJykuJGV4dGVuc2lvbjsKfQoKcmV0dXJuIHN1YnN0cigkcGF0aCwgMCwgLVxzdHJsZW4oJGFjdHVhbEV4dGVuc2lvbikpLiRleHRlbnNpb247Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNBYnNvbHV0ZShzdHJpbmcgJHBhdGgpOiBib29sCnsKaWYgKCcnID09PSAkcGF0aCkgewpyZXR1cm4gZmFsc2U7Cn0KCgppZiAoZmFsc2UgIT09ICgkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgJiYgMSAhPT0gJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uKSB7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfQoKJGZpcnN0Q2hhcmFjdGVyID0gJHBhdGhbMF07CgoKaWYgKCcvJyA9PT0gJGZpcnN0Q2hhcmFjdGVyIHx8ICdcXCcgPT09ICRmaXJzdENoYXJhY3RlcikgewpyZXR1cm4gdHJ1ZTsKfQoKCmlmIChcc3RybGVuKCRwYXRoKSA+IDEgJiYgY3R5cGVfYWxwaGEoJGZpcnN0Q2hhcmFjdGVyKSAmJiAnOicgPT09ICRwYXRoWzFdKSB7CgppZiAoMiA9PT0gXHN0cmxlbigkcGF0aCkpIHsKcmV0dXJuIHRydWU7Cn0KCgppZiAoJy8nID09PSAkcGF0aFsyXSB8fCAnXFwnID09PSAkcGF0aFsyXSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNSZWxhdGl2ZShzdHJpbmcgJHBhdGgpOiBib29sCnsKcmV0dXJuICFzZWxmOjppc0Fic29sdXRlKCRwYXRoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFrZUFic29sdXRlKHN0cmluZyAkcGF0aCwgc3RyaW5nICRiYXNlUGF0aCk6IHN0cmluZwp7CmlmICgnJyA9PT0gJGJhc2VQYXRoKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignVGhlIGJhc2UgcGF0aCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4gR290OiAiJXMiLicsICRiYXNlUGF0aCkpOwp9CgppZiAoIXNlbGY6OmlzQWJzb2x1dGUoJGJhc2VQYXRoKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ1RoZSBiYXNlIHBhdGggIiVzIiBpcyBub3QgYW4gYWJzb2x1dGUgcGF0aC4nLCAkYmFzZVBhdGgpKTsKfQoKaWYgKHNlbGY6OmlzQWJzb2x1dGUoJHBhdGgpKSB7CnJldHVybiBzZWxmOjpjYW5vbmljYWxpemUoJHBhdGgpOwp9CgppZiAoZmFsc2UgIT09ICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiA9IHN0cnBvcygkYmFzZVBhdGgsICc6Ly8nKSkgewokc2NoZW1lID0gc3Vic3RyKCRiYXNlUGF0aCwgMCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7CiRiYXNlUGF0aCA9IHN1YnN0cigkYmFzZVBhdGgsICRzY2hlbWVTZXBhcmF0b3JQb3NpdGlvbiArIDMpOwp9IGVsc2Ugewokc2NoZW1lID0gJyc7Cn0KCnJldHVybiAkc2NoZW1lLnNlbGY6OmNhbm9uaWNhbGl6ZShydHJpbSgkYmFzZVBhdGgsICcvXFwnKS4nLycuJHBhdGgpOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWFrZVJlbGF0aXZlKHN0cmluZyAkcGF0aCwgc3RyaW5nICRiYXNlUGF0aCk6IHN0cmluZwp7CiRwYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRwYXRoKTsKJGJhc2VQYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRiYXNlUGF0aCk7CgpbJHJvb3QsICRyZWxhdGl2ZVBhdGhdID0gc2VsZjo6c3BsaXQoJHBhdGgpOwpbJGJhc2VSb290LCAkcmVsYXRpdmVCYXNlUGF0aF0gPSBzZWxmOjpzcGxpdCgkYmFzZVBhdGgpOwoKCgoKaWYgKCcnID09PSAkcm9vdCAmJiAnJyAhPT0gJGJhc2VSb290KSB7CgppZiAoJycgPT09ICRyZWxhdGl2ZUJhc2VQYXRoKSB7CiRyZWxhdGl2ZVBhdGggPSBsdHJpbSgkcmVsYXRpdmVQYXRoLCAnLi9cXCcpOwp9CgpyZXR1cm4gJHJlbGF0aXZlUGF0aDsKfQoKCgppZiAoJycgIT09ICRyb290ICYmICcnID09PSAkYmFzZVJvb3QpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgYWJzb2x1dGUgcGF0aCAiJXMiIGNhbm5vdCBiZSBtYWRlIHJlbGF0aXZlIHRvIHRoZSByZWxhdGl2ZSBwYXRoICIlcyIuIFlvdSBzaG91bGQgcHJvdmlkZSBhbiBhYnNvbHV0ZSBiYXNlIHBhdGggaW5zdGVhZC4nLCAkcGF0aCwgJGJhc2VQYXRoKSk7Cn0KCgppZiAoJGJhc2VSb290ICYmICRyb290ICE9PSAkYmFzZVJvb3QpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcGF0aCAiJXMiIGNhbm5vdCBiZSBtYWRlIHJlbGF0aXZlIHRvICIlcyIsIGJlY2F1c2UgdGhleSBoYXZlIGRpZmZlcmVudCByb290cyAoIiVzIiBhbmQgIiVzIikuJywgJHBhdGgsICRiYXNlUGF0aCwgJHJvb3QsICRiYXNlUm9vdCkpOwp9CgppZiAoJycgPT09ICRyZWxhdGl2ZUJhc2VQYXRoKSB7CnJldHVybiAkcmVsYXRpdmVQYXRoOwp9CgoKJHBhcnRzID0gZXhwbG9kZSgnLycsICRyZWxhdGl2ZVBhdGgpOwokYmFzZVBhcnRzID0gZXhwbG9kZSgnLycsICRyZWxhdGl2ZUJhc2VQYXRoKTsKJGRvdERvdFByZWZpeCA9ICcnOwoKCgokbWF0Y2ggPSB0cnVlOwoKZm9yZWFjaCAoJGJhc2VQYXJ0cyBhcyAkaW5kZXggPT4gJGJhc2VQYXJ0KSB7CmlmICgkbWF0Y2ggJiYgaXNzZXQoJHBhcnRzWyRpbmRleF0pICYmICRiYXNlUGFydCA9PT0gJHBhcnRzWyRpbmRleF0pIHsKdW5zZXQoJHBhcnRzWyRpbmRleF0pOwoKY29udGludWU7Cn0KCiRtYXRjaCA9IGZhbHNlOwokZG90RG90UHJlZml4IC49ICcuLi8nOwp9CgpyZXR1cm4gcnRyaW0oJGRvdERvdFByZWZpeC5pbXBsb2RlKCcvJywgJHBhcnRzKSwgJy8nKTsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0xvY2FsKHN0cmluZyAkcGF0aCk6IGJvb2wKewpyZXR1cm4gJycgIT09ICRwYXRoICYmIGZhbHNlID09PSBzdHJwb3MoJHBhdGgsICc6Ly8nKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRMb25nZXN0Q29tbW9uQmFzZVBhdGgoc3RyaW5nIC4uLiRwYXRocyk6ID9zdHJpbmcKewpbJGJwUm9vdCwgJGJhc2VQYXRoXSA9IHNlbGY6OnNwbGl0KHNlbGY6OmNhbm9uaWNhbGl6ZShyZXNldCgkcGF0aHMpKSk7Cgpmb3IgKG5leHQoJHBhdGhzKTsgbnVsbCAhPT0ga2V5KCRwYXRocykgJiYgJycgIT09ICRiYXNlUGF0aDsgbmV4dCgkcGF0aHMpKSB7Clskcm9vdCwgJHBhdGhdID0gc2VsZjo6c3BsaXQoc2VsZjo6Y2Fub25pY2FsaXplKGN1cnJlbnQoJHBhdGhzKSkpOwoKCgppZiAoJHJvb3QgIT09ICRicFJvb3QpIHsKcmV0dXJuIG51bGw7Cn0KCgp3aGlsZSAodHJ1ZSkgewppZiAoJy4nID09PSAkYmFzZVBhdGgpIHsKCiRiYXNlUGF0aCA9ICcnOwoKCmNvbnRpbnVlIDI7Cn0KCgoKaWYgKDAgPT09IHN0cnBvcygkcGF0aC4nLycsICRiYXNlUGF0aC4nLycpKSB7Cgpjb250aW51ZSAyOwp9CgokYmFzZVBhdGggPSBcZGlybmFtZSgkYmFzZVBhdGgpOwp9Cn0KCnJldHVybiAkYnBSb290LiRiYXNlUGF0aDsKfQoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBqb2luKHN0cmluZyAuLi4kcGF0aHMpOiBzdHJpbmcKewokZmluYWxQYXRoID0gbnVsbDsKJHdhc1NjaGVtZSA9IGZhbHNlOwoKZm9yZWFjaCAoJHBhdGhzIGFzICRwYXRoKSB7CmlmICgnJyA9PT0gJHBhdGgpIHsKY29udGludWU7Cn0KCmlmIChudWxsID09PSAkZmluYWxQYXRoKSB7CgokZmluYWxQYXRoID0gJHBhdGg7CiR3YXNTY2hlbWUgPSAoZmFsc2UgIT09IHN0cnBvcygkcGF0aCwgJzovLycpKTsKY29udGludWU7Cn0KCgppZiAoIVxpbl9hcnJheShzdWJzdHIoJGZpbmFsUGF0aCwgLTEpLCBbJy8nLCAnXFwnXSkpIHsKJGZpbmFsUGF0aCAuPSAnLyc7Cn0KCgokZmluYWxQYXRoIC49ICR3YXNTY2hlbWUgPyAkcGF0aCA6IGx0cmltKCRwYXRoLCAnLycpOwokd2FzU2NoZW1lID0gZmFsc2U7Cn0KCmlmIChudWxsID09PSAkZmluYWxQYXRoKSB7CnJldHVybiAnJzsKfQoKcmV0dXJuIHNlbGY6OmNhbm9uaWNhbGl6ZSgkZmluYWxQYXRoKTsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzQmFzZVBhdGgoc3RyaW5nICRiYXNlUGF0aCwgc3RyaW5nICRvZlBhdGgpOiBib29sCnsKJGJhc2VQYXRoID0gc2VsZjo6Y2Fub25pY2FsaXplKCRiYXNlUGF0aCk7CiRvZlBhdGggPSBzZWxmOjpjYW5vbmljYWxpemUoJG9mUGF0aCk7CgoKCgoKCnJldHVybiAwID09PSBzdHJwb3MoJG9mUGF0aC4nLycsIHJ0cmltKCRiYXNlUGF0aCwgJy8nKS4nLycpOwp9CgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBmaW5kQ2Fub25pY2FsUGFydHMoc3RyaW5nICRyb290LCBzdHJpbmcgJHBhdGhXaXRob3V0Um9vdCk6IGFycmF5CnsKJHBhcnRzID0gZXhwbG9kZSgnLycsICRwYXRoV2l0aG91dFJvb3QpOwoKJGNhbm9uaWNhbFBhcnRzID0gW107CgoKZm9yZWFjaCAoJHBhcnRzIGFzICRwYXJ0KSB7CmlmICgnLicgPT09ICRwYXJ0IHx8ICcnID09PSAkcGFydCkgewpjb250aW51ZTsKfQoKCgppZiAoJy4uJyA9PT0gJHBhcnQgJiYgXGNvdW50KCRjYW5vbmljYWxQYXJ0cykgPiAwICYmICcuLicgIT09ICRjYW5vbmljYWxQYXJ0c1tcY291bnQoJGNhbm9uaWNhbFBhcnRzKSAtIDFdKSB7CmFycmF5X3BvcCgkY2Fub25pY2FsUGFydHMpOwoKY29udGludWU7Cn0KCgppZiAoJy4uJyAhPT0gJHBhcnQgfHwgJycgPT09ICRyb290KSB7CiRjYW5vbmljYWxQYXJ0c1tdID0gJHBhcnQ7Cn0KfQoKcmV0dXJuICRjYW5vbmljYWxQYXJ0czsKfQoKCgoKCgoKCgoKCgoKCgoKCgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBzcGxpdChzdHJpbmcgJHBhdGgpOiBhcnJheQp7CmlmICgnJyA9PT0gJHBhdGgpIHsKcmV0dXJuIFsnJywgJyddOwp9CgoKaWYgKGZhbHNlICE9PSAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gPSBzdHJwb3MoJHBhdGgsICc6Ly8nKSkgewokcm9vdCA9IHN1YnN0cigkcGF0aCwgMCwgJHNjaGVtZVNlcGFyYXRvclBvc2l0aW9uICsgMyk7CiRwYXRoID0gc3Vic3RyKCRwYXRoLCAkc2NoZW1lU2VwYXJhdG9yUG9zaXRpb24gKyAzKTsKfSBlbHNlIHsKJHJvb3QgPSAnJzsKfQoKJGxlbmd0aCA9IFxzdHJsZW4oJHBhdGgpOwoKCmlmICgwID09PSBzdHJwb3MoJHBhdGgsICcvJykpIHsKJHJvb3QgLj0gJy8nOwokcGF0aCA9ICRsZW5ndGggPiAxID8gc3Vic3RyKCRwYXRoLCAxKSA6ICcnOwp9IGVsc2VpZiAoJGxlbmd0aCA+IDEgJiYgY3R5cGVfYWxwaGEoJHBhdGhbMF0pICYmICc6JyA9PT0gJHBhdGhbMV0pIHsKaWYgKDIgPT09ICRsZW5ndGgpIHsKCiRyb290IC49ICRwYXRoLicvJzsKJHBhdGggPSAnJzsKfSBlbHNlaWYgKCcvJyA9PT0gJHBhdGhbMl0pIHsKCiRyb290IC49IHN1YnN0cigkcGF0aCwgMCwgMyk7CiRwYXRoID0gJGxlbmd0aCA+IDMgPyBzdWJzdHIoJHBhdGgsIDMpIDogJyc7Cn0KfQoKcmV0dXJuIFskcm9vdCwgJHBhdGhdOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiB0b0xvd2VyKHN0cmluZyAkc3RyaW5nKTogc3RyaW5nCnsKaWYgKGZhbHNlICE9PSAkZW5jb2RpbmcgPSBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgbnVsbCwgdHJ1ZSkpIHsKcmV0dXJuIG1iX3N0cnRvbG93ZXIoJHN0cmluZywgJGVuY29kaW5nKTsKfQoKcmV0dXJuIHN0cnRvbG93ZXIoJHN0cmluZyk7Cn0KCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yOwoKCgoKY2xhc3MgQ29tcGFyYXRvcgp7CnByaXZhdGUgJHRhcmdldDsKcHJpdmF0ZSAkb3BlcmF0b3IgPSAnPT0nOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJHRhcmdldCA9IG51bGwsIHN0cmluZyAkb3BlcmF0b3IgPSAnPT0nKQp7CmlmIChudWxsID09PSAkdGFyZ2V0KSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvZmluZGVyJywgJzUuNCcsICdDb25zdHJ1Y3RpbmcgYSAiJXMiIHdpdGhvdXQgc2V0dGluZyAiJHRhcmdldCIgaXMgZGVwcmVjYXRlZC4nLCBfX0NMQVNTX18pOwp9CgokdGhpcy0+dGFyZ2V0ID0gJHRhcmdldDsKJHRoaXMtPmRvU2V0T3BlcmF0b3IoJG9wZXJhdG9yKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGFyZ2V0KCkKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhcmdldCkgewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnQ2FsbGluZyAiJXMiIHdpdGhvdXQgaW5pdGlhbGl6aW5nIHRoZSB0YXJnZXQgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKTsKfQoKcmV0dXJuICR0aGlzLT50YXJnZXQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUYXJnZXQoc3RyaW5nICR0YXJnZXQpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9maW5kZXInLCAnNS40JywgJyIlcyIgaXMgZGVwcmVjYXRlZC4gU2V0IHRoZSB0YXJnZXQgdmlhIHRoZSBjb25zdHJ1Y3RvciBpbnN0ZWFkLicsIF9fTUVUSE9EX18pOwoKJHRoaXMtPnRhcmdldCA9ICR0YXJnZXQ7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldE9wZXJhdG9yKCkKewpyZXR1cm4gJHRoaXMtPm9wZXJhdG9yOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldE9wZXJhdG9yKHN0cmluZyAkb3BlcmF0b3IpCnsKdHJpZ2dlcl9kZXByZWNhdGlvbignc3ltZm9ueS9maW5kZXInLCAnNS40JywgJyIlcyIgaXMgZGVwcmVjYXRlZC4gU2V0IHRoZSBvcGVyYXRvciB2aWEgdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJywgX19NRVRIT0RfXyk7CgokdGhpcy0+ZG9TZXRPcGVyYXRvcignJyA9PT0gJG9wZXJhdG9yID8gJz09JyA6ICRvcGVyYXRvcik7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gdGVzdCgkdGVzdCkKewppZiAobnVsbCA9PT0gJHRoaXMtPnRhcmdldCkgewp0cmlnZ2VyX2RlcHJlY2F0aW9uKCdzeW1mb255L2ZpbmRlcicsICc1LjQnLCAnQ2FsbGluZyAiJXMiIHdpdGhvdXQgaW5pdGlhbGl6aW5nIHRoZSB0YXJnZXQgaXMgZGVwcmVjYXRlZC4nLCBfX01FVEhPRF9fKTsKfQoKc3dpdGNoICgkdGhpcy0+b3BlcmF0b3IpIHsKY2FzZSAnPic6CnJldHVybiAkdGVzdCA+ICR0aGlzLT50YXJnZXQ7CmNhc2UgJz49JzoKcmV0dXJuICR0ZXN0ID49ICR0aGlzLT50YXJnZXQ7CmNhc2UgJzwnOgpyZXR1cm4gJHRlc3QgPCAkdGhpcy0+dGFyZ2V0OwpjYXNlICc8PSc6CnJldHVybiAkdGVzdCA8PSAkdGhpcy0+dGFyZ2V0OwpjYXNlICchPSc6CnJldHVybiAkdGVzdCAhPSAkdGhpcy0+dGFyZ2V0Owp9CgpyZXR1cm4gJHRlc3QgPT0gJHRoaXMtPnRhcmdldDsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBkb1NldE9wZXJhdG9yKHN0cmluZyAkb3BlcmF0b3IpOiB2b2lkCnsKaWYgKCFcaW5fYXJyYXkoJG9wZXJhdG9yLCBbJz4nLCAnPCcsICc+PScsICc8PScsICc9PScsICchPSddKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdJbnZhbGlkIG9wZXJhdG9yICIlcyIuJywgJG9wZXJhdG9yKSk7Cn0KCiR0aGlzLT5vcGVyYXRvciA9ICRvcGVyYXRvcjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3I7CgoKCgoKCmNsYXNzIERhdGVDb21wYXJhdG9yIGV4dGVuZHMgQ29tcGFyYXRvcgp7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkdGVzdCkKewppZiAoIXByZWdfbWF0Y2goJyNeXHMqKD09fCE9fFs8Pl09P3xhZnRlcnxzaW5jZXxiZWZvcmV8dW50aWwpP1xzKiguKz8pXHMqJCNpJywgJHRlc3QsICRtYXRjaGVzKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdEb25cJ3QgdW5kZXJzdGFuZCAiJXMiIGFzIGEgZGF0ZSB0ZXN0LicsICR0ZXN0KSk7Cn0KCnRyeSB7CiRkYXRlID0gbmV3IFxEYXRlVGltZSgkbWF0Y2hlc1syXSk7CiR0YXJnZXQgPSAkZGF0ZS0+Zm9ybWF0KCdVJyk7Cn0gY2F0Y2ggKFxFeGNlcHRpb24gJGUpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzIiBpcyBub3QgYSB2YWxpZCBkYXRlLicsICRtYXRjaGVzWzJdKSk7Cn0KCiRvcGVyYXRvciA9ICRtYXRjaGVzWzFdID8/ICc9PSc7CmlmICgnc2luY2UnID09PSAkb3BlcmF0b3IgfHwgJ2FmdGVyJyA9PT0gJG9wZXJhdG9yKSB7CiRvcGVyYXRvciA9ICc+JzsKfQoKaWYgKCd1bnRpbCcgPT09ICRvcGVyYXRvciB8fCAnYmVmb3JlJyA9PT0gJG9wZXJhdG9yKSB7CiRvcGVyYXRvciA9ICc8JzsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkdGFyZ2V0LCAkb3BlcmF0b3IpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvcjsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCmNsYXNzIE51bWJlckNvbXBhcmF0b3IgZXh0ZW5kcyBDb21wYXJhdG9yCnsKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoP3N0cmluZyAkdGVzdCkKewppZiAobnVsbCA9PT0gJHRlc3QgfHwgIXByZWdfbWF0Y2goJyNeXHMqKD09fCE9fFs8Pl09Pyk/XHMqKFswLTlcLl0rKVxzKihba21nXWk/KT9ccyokI2knLCAkdGVzdCwgJG1hdGNoZXMpKSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKHNwcmludGYoJ0RvblwndCB1bmRlcnN0YW5kICIlcyIgYXMgYSBudW1iZXIgdGVzdC4nLCAkdGVzdCA/PyAnbnVsbCcpKTsKfQoKJHRhcmdldCA9ICRtYXRjaGVzWzJdOwppZiAoIWlzX251bWVyaWMoJHRhcmdldCkpIHsKdGhyb3cgbmV3IFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBudW1iZXIgIiVzIi4nLCAkdGFyZ2V0KSk7Cn0KaWYgKGlzc2V0KCRtYXRjaGVzWzNdKSkgewoKc3dpdGNoIChzdHJ0b2xvd2VyKCRtYXRjaGVzWzNdKSkgewpjYXNlICdrJzoKJHRhcmdldCAqPSAxMDAwOwpicmVhazsKY2FzZSAna2knOgokdGFyZ2V0ICo9IDEwMjQ7CmJyZWFrOwpjYXNlICdtJzoKJHRhcmdldCAqPSAxMDAwMDAwOwpicmVhazsKY2FzZSAnbWknOgokdGFyZ2V0ICo9IDEwMjQgKiAxMDI0OwpicmVhazsKY2FzZSAnZyc6CiR0YXJnZXQgKj0gMTAwMDAwMDAwMDsKYnJlYWs7CmNhc2UgJ2dpJzoKJHRhcmdldCAqPSAxMDI0ICogMTAyNCAqIDEwMjQ7CmJyZWFrOwp9Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHRhcmdldCwgJG1hdGNoZXNbMV0gPzogJz09Jyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxFeGNlcHRpb247CgoKCgpjbGFzcyBBY2Nlc3NEZW5pZWRFeGNlcHRpb24gZXh0ZW5kcyBcVW5leHBlY3RlZFZhbHVlRXhjZXB0aW9uCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxFeGNlcHRpb247CgoKCgpjbGFzcyBEaXJlY3RvcnlOb3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIFxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24Kewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxDb21wYXJhdG9yXERhdGVDb21wYXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXENvbXBhcmF0b3JcTnVtYmVyQ29tcGFyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxFeGNlcHRpb25cRGlyZWN0b3J5Tm90Rm91bmRFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcQ3VzdG9tRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRGF0ZVJhbmdlRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcRGVwdGhSYW5nZUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXEV4Y2x1ZGVEaXJlY3RvcnlGaWx0ZXJJdGVyYXRvcjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvclxGaWxlY29udGVudEZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXEZpbGVuYW1lRmlsdGVySXRlcmF0b3I7CnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3JcTGF6eUl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXFNpemVSYW5nZUZpbHRlckl0ZXJhdG9yOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I7CgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBGaW5kZXIgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUsIFxDb3VudGFibGUKewpwdWJsaWMgY29uc3QgSUdOT1JFX1ZDU19GSUxFUyA9IDE7CnB1YmxpYyBjb25zdCBJR05PUkVfRE9UX0ZJTEVTID0gMjsKcHVibGljIGNvbnN0IElHTk9SRV9WQ1NfSUdOT1JFRF9GSUxFUyA9IDQ7Cgpwcml2YXRlICRtb2RlID0gMDsKcHJpdmF0ZSAkbmFtZXMgPSBbXTsKcHJpdmF0ZSAkbm90TmFtZXMgPSBbXTsKcHJpdmF0ZSAkZXhjbHVkZSA9IFtdOwpwcml2YXRlICRmaWx0ZXJzID0gW107CnByaXZhdGUgJGRlcHRocyA9IFtdOwpwcml2YXRlICRzaXplcyA9IFtdOwpwcml2YXRlICRmb2xsb3dMaW5rcyA9IGZhbHNlOwpwcml2YXRlICRyZXZlcnNlU29ydGluZyA9IGZhbHNlOwpwcml2YXRlICRzb3J0ID0gZmFsc2U7CnByaXZhdGUgJGlnbm9yZSA9IDA7CnByaXZhdGUgJGRpcnMgPSBbXTsKcHJpdmF0ZSAkZGF0ZXMgPSBbXTsKcHJpdmF0ZSAkaXRlcmF0b3JzID0gW107CnByaXZhdGUgJGNvbnRhaW5zID0gW107CnByaXZhdGUgJG5vdENvbnRhaW5zID0gW107CnByaXZhdGUgJHBhdGhzID0gW107CnByaXZhdGUgJG5vdFBhdGhzID0gW107CnByaXZhdGUgJGlnbm9yZVVucmVhZGFibGVEaXJzID0gZmFsc2U7Cgpwcml2YXRlIHN0YXRpYyAkdmNzUGF0dGVybnMgPSBbJy5zdm4nLCAnX3N2bicsICdDVlMnLCAnX2RhcmNzJywgJy5hcmNoLXBhcmFtcycsICcubW9ub3RvbmUnLCAnLmJ6cicsICcuZ2l0JywgJy5oZyddOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewokdGhpcy0+aWdub3JlID0gc3RhdGljOjpJR05PUkVfVkNTX0ZJTEVTIHwgc3RhdGljOjpJR05PUkVfRE9UX0ZJTEVTOwp9CgoKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gY3JlYXRlKCkKewpyZXR1cm4gbmV3IHN0YXRpYygpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkaXJlY3RvcmllcygpCnsKJHRoaXMtPm1vZGUgPSBJdGVyYXRvclxGaWxlVHlwZUZpbHRlckl0ZXJhdG9yOjpPTkxZX0RJUkVDVE9SSUVTOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaWxlcygpCnsKJHRoaXMtPm1vZGUgPSBJdGVyYXRvclxGaWxlVHlwZUZpbHRlckl0ZXJhdG9yOjpPTkxZX0ZJTEVTOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGRlcHRoKCRsZXZlbHMpCnsKZm9yZWFjaCAoKGFycmF5KSAkbGV2ZWxzIGFzICRsZXZlbCkgewokdGhpcy0+ZGVwdGhzW10gPSBuZXcgQ29tcGFyYXRvclxOdW1iZXJDb21wYXJhdG9yKCRsZXZlbCk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBkYXRlKCRkYXRlcykKewpmb3JlYWNoICgoYXJyYXkpICRkYXRlcyBhcyAkZGF0ZSkgewokdGhpcy0+ZGF0ZXNbXSA9IG5ldyBDb21wYXJhdG9yXERhdGVDb21wYXJhdG9yKCRkYXRlKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG5hbWUoJHBhdHRlcm5zKQp7CiR0aGlzLT5uYW1lcyA9IGFycmF5X21lcmdlKCR0aGlzLT5uYW1lcywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gbm90TmFtZSgkcGF0dGVybnMpCnsKJHRoaXMtPm5vdE5hbWVzID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5vdE5hbWVzLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBjb250YWlucygkcGF0dGVybnMpCnsKJHRoaXMtPmNvbnRhaW5zID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmNvbnRhaW5zLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RDb250YWlucygkcGF0dGVybnMpCnsKJHRoaXMtPm5vdENvbnRhaW5zID0gYXJyYXlfbWVyZ2UoJHRoaXMtPm5vdENvbnRhaW5zLCAoYXJyYXkpICRwYXR0ZXJucyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBhdGgoJHBhdHRlcm5zKQp7CiR0aGlzLT5wYXRocyA9IGFycmF5X21lcmdlKCR0aGlzLT5wYXRocywgKGFycmF5KSAkcGF0dGVybnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBub3RQYXRoKCRwYXR0ZXJucykKewokdGhpcy0+bm90UGF0aHMgPSBhcnJheV9tZXJnZSgkdGhpcy0+bm90UGF0aHMsIChhcnJheSkgJHBhdHRlcm5zKTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNpemUoJHNpemVzKQp7CmZvcmVhY2ggKChhcnJheSkgJHNpemVzIGFzICRzaXplKSB7CiR0aGlzLT5zaXplc1tdID0gbmV3IENvbXBhcmF0b3JcTnVtYmVyQ29tcGFyYXRvcigkc2l6ZSk7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBleGNsdWRlKCRkaXJzKQp7CiR0aGlzLT5leGNsdWRlID0gYXJyYXlfbWVyZ2UoJHRoaXMtPmV4Y2x1ZGUsIChhcnJheSkgJGRpcnMpOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlRG90RmlsZXMoYm9vbCAkaWdub3JlRG90RmlsZXMpCnsKaWYgKCRpZ25vcmVEb3RGaWxlcykgewokdGhpcy0+aWdub3JlIHw9IHN0YXRpYzo6SUdOT1JFX0RPVF9GSUxFUzsKfSBlbHNlIHsKJHRoaXMtPmlnbm9yZSAmPSB+c3RhdGljOjpJR05PUkVfRE9UX0ZJTEVTOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVWQ1MoYm9vbCAkaWdub3JlVkNTKQp7CmlmICgkaWdub3JlVkNTKSB7CiR0aGlzLT5pZ25vcmUgfD0gc3RhdGljOjpJR05PUkVfVkNTX0ZJTEVTOwp9IGVsc2UgewokdGhpcy0+aWdub3JlICY9IH5zdGF0aWM6OklHTk9SRV9WQ1NfRklMRVM7Cn0KCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVWQ1NJZ25vcmVkKGJvb2wgJGlnbm9yZVZDU0lnbm9yZWQpCnsKaWYgKCRpZ25vcmVWQ1NJZ25vcmVkKSB7CiR0aGlzLT5pZ25vcmUgfD0gc3RhdGljOjpJR05PUkVfVkNTX0lHTk9SRURfRklMRVM7Cn0gZWxzZSB7CiR0aGlzLT5pZ25vcmUgJj0gfnN0YXRpYzo6SUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFkZFZDU1BhdHRlcm4oJHBhdHRlcm4pCnsKZm9yZWFjaCAoKGFycmF5KSAkcGF0dGVybiBhcyAkcCkgewpzZWxmOjokdmNzUGF0dGVybnNbXSA9ICRwOwp9CgpzZWxmOjokdmNzUGF0dGVybnMgPSBhcnJheV91bmlxdWUoc2VsZjo6JHZjc1BhdHRlcm5zKTsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydChcQ2xvc3VyZSAkY2xvc3VyZSkKewokdGhpcy0+c29ydCA9ICRjbG9zdXJlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydEJ5TmFtZShib29sICR1c2VOYXR1cmFsU29ydCA9IGZhbHNlKQp7CiR0aGlzLT5zb3J0ID0gJHVzZU5hdHVyYWxTb3J0ID8gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9OQU1FX05BVFVSQUwgOiBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX05BTUU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzb3J0QnlUeXBlKCkKewokdGhpcy0+c29ydCA9IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfVFlQRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydEJ5QWNjZXNzZWRUaW1lKCkKewokdGhpcy0+c29ydCA9IEl0ZXJhdG9yXFNvcnRhYmxlSXRlcmF0b3I6OlNPUlRfQllfQUNDRVNTRURfVElNRTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmV2ZXJzZVNvcnRpbmcoKQp7CiR0aGlzLT5yZXZlcnNlU29ydGluZyA9IHRydWU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc29ydEJ5Q2hhbmdlZFRpbWUoKQp7CiR0aGlzLT5zb3J0ID0gSXRlcmF0b3JcU29ydGFibGVJdGVyYXRvcjo6U09SVF9CWV9DSEFOR0VEX1RJTUU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNvcnRCeU1vZGlmaWVkVGltZSgpCnsKJHRoaXMtPnNvcnQgPSBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yOjpTT1JUX0JZX01PRElGSUVEX1RJTUU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmlsdGVyKFxDbG9zdXJlICRjbG9zdXJlKQp7CiR0aGlzLT5maWx0ZXJzW10gPSAkY2xvc3VyZTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZm9sbG93TGlua3MoKQp7CiR0aGlzLT5mb2xsb3dMaW5rcyA9IHRydWU7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaWdub3JlVW5yZWFkYWJsZURpcnMoYm9vbCAkaWdub3JlID0gdHJ1ZSkKewokdGhpcy0+aWdub3JlVW5yZWFkYWJsZURpcnMgPSAkaWdub3JlOwoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaW4oJGRpcnMpCnsKJHJlc29sdmVkRGlycyA9IFtdOwoKZm9yZWFjaCAoKGFycmF5KSAkZGlycyBhcyAkZGlyKSB7CmlmIChpc19kaXIoJGRpcikpIHsKJHJlc29sdmVkRGlyc1tdID0gWyR0aGlzLT5ub3JtYWxpemVEaXIoJGRpcildOwp9IGVsc2VpZiAoJGdsb2IgPSBnbG9iKCRkaXIsIChcZGVmaW5lZCgnR0xPQl9CUkFDRScpID8gXEdMT0JfQlJBQ0UgOiAwKSB8IFxHTE9CX09OTFlESVIgfCBcR0xPQl9OT1NPUlQpKSB7CnNvcnQoJGdsb2IpOwokcmVzb2x2ZWREaXJzW10gPSBhcnJheV9tYXAoWyR0aGlzLCAnbm9ybWFsaXplRGlyJ10sICRnbG9iKTsKfSBlbHNlIHsKdGhyb3cgbmV3IERpcmVjdG9yeU5vdEZvdW5kRXhjZXB0aW9uKHNwcmludGYoJ1RoZSAiJXMiIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4nLCAkZGlyKSk7Cn0KfQoKJHRoaXMtPmRpcnMgPSBhcnJheV9tZXJnZSgkdGhpcy0+ZGlycywgLi4uJHJlc29sdmVkRGlycyk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gZ2V0SXRlcmF0b3IoKQp7CmlmICgwID09PSBcY291bnQoJHRoaXMtPmRpcnMpICYmIDAgPT09IFxjb3VudCgkdGhpcy0+aXRlcmF0b3JzKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKCdZb3UgbXVzdCBjYWxsIG9uZSBvZiBpbigpIG9yIGFwcGVuZCgpIG1ldGhvZHMgYmVmb3JlIGl0ZXJhdGluZyBvdmVyIGEgRmluZGVyLicpOwp9CgppZiAoMSA9PT0gXGNvdW50KCR0aGlzLT5kaXJzKSAmJiAwID09PSBcY291bnQoJHRoaXMtPml0ZXJhdG9ycykpIHsKJGl0ZXJhdG9yID0gJHRoaXMtPnNlYXJjaEluRGlyZWN0b3J5KCR0aGlzLT5kaXJzWzBdKTsKCmlmICgkdGhpcy0+c29ydCB8fCAkdGhpcy0+cmV2ZXJzZVNvcnRpbmcpIHsKJGl0ZXJhdG9yID0gKG5ldyBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPnNvcnQsICR0aGlzLT5yZXZlcnNlU29ydGluZykpLT5nZXRJdGVyYXRvcigpOwp9CgpyZXR1cm4gJGl0ZXJhdG9yOwp9CgokaXRlcmF0b3IgPSBuZXcgXEFwcGVuZEl0ZXJhdG9yKCk7CmZvcmVhY2ggKCR0aGlzLT5kaXJzIGFzICRkaXIpIHsKJGl0ZXJhdG9yLT5hcHBlbmQobmV3IFxJdGVyYXRvckl0ZXJhdG9yKG5ldyBMYXp5SXRlcmF0b3IoZnVuY3Rpb24gKCkgdXNlICgkZGlyKSB7CnJldHVybiAkdGhpcy0+c2VhcmNoSW5EaXJlY3RvcnkoJGRpcik7Cn0pKSk7Cn0KCmZvcmVhY2ggKCR0aGlzLT5pdGVyYXRvcnMgYXMgJGl0KSB7CiRpdGVyYXRvci0+YXBwZW5kKCRpdCk7Cn0KCmlmICgkdGhpcy0+c29ydCB8fCAkdGhpcy0+cmV2ZXJzZVNvcnRpbmcpIHsKJGl0ZXJhdG9yID0gKG5ldyBJdGVyYXRvclxTb3J0YWJsZUl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPnNvcnQsICR0aGlzLT5yZXZlcnNlU29ydGluZykpLT5nZXRJdGVyYXRvcigpOwp9CgpyZXR1cm4gJGl0ZXJhdG9yOwp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gYXBwZW5kKGl0ZXJhYmxlICRpdGVyYXRvcikKewppZiAoJGl0ZXJhdG9yIGluc3RhbmNlb2YgXEl0ZXJhdG9yQWdncmVnYXRlKSB7CiR0aGlzLT5pdGVyYXRvcnNbXSA9ICRpdGVyYXRvci0+Z2V0SXRlcmF0b3IoKTsKfSBlbHNlaWYgKCRpdGVyYXRvciBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewokdGhpcy0+aXRlcmF0b3JzW10gPSAkaXRlcmF0b3I7Cn0gZWxzZWlmIChpc19pdGVyYWJsZSgkaXRlcmF0b3IpKSB7CiRpdCA9IG5ldyBcQXJyYXlJdGVyYXRvcigpOwpmb3JlYWNoICgkaXRlcmF0b3IgYXMgJGZpbGUpIHsKJGZpbGUgPSAkZmlsZSBpbnN0YW5jZW9mIFxTcGxGaWxlSW5mbyA/ICRmaWxlIDogbmV3IFxTcGxGaWxlSW5mbygkZmlsZSk7CiRpdFskZmlsZS0+Z2V0UGF0aG5hbWUoKV0gPSAkZmlsZTsKfQokdGhpcy0+aXRlcmF0b3JzW10gPSAkaXQ7Cn0gZWxzZSB7CnRocm93IG5ldyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdGaW5kZXI6OmFwcGVuZCgpIG1ldGhvZCB3cm9uZyBhcmd1bWVudCB0eXBlLicpOwp9CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhc1Jlc3VsdHMoKQp7CmZvcmVhY2ggKCR0aGlzLT5nZXRJdGVyYXRvcigpIGFzICRfKSB7CnJldHVybiB0cnVlOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBjb3VudCgpCnsKcmV0dXJuIGl0ZXJhdG9yX2NvdW50KCR0aGlzLT5nZXRJdGVyYXRvcigpKTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBzZWFyY2hJbkRpcmVjdG9yeShzdHJpbmcgJGRpcik6IFxJdGVyYXRvcgp7CiRleGNsdWRlID0gJHRoaXMtPmV4Y2x1ZGU7CiRub3RQYXRocyA9ICR0aGlzLT5ub3RQYXRoczsKCmlmIChzdGF0aWM6OklHTk9SRV9WQ1NfRklMRVMgPT09IChzdGF0aWM6OklHTk9SRV9WQ1NfRklMRVMgJiAkdGhpcy0+aWdub3JlKSkgewokZXhjbHVkZSA9IGFycmF5X21lcmdlKCRleGNsdWRlLCBzZWxmOjokdmNzUGF0dGVybnMpOwp9CgppZiAoc3RhdGljOjpJR05PUkVfRE9UX0ZJTEVTID09PSAoc3RhdGljOjpJR05PUkVfRE9UX0ZJTEVTICYgJHRoaXMtPmlnbm9yZSkpIHsKJG5vdFBhdGhzW10gPSAnIyhefC8pXC4uKygvfCQpIyc7Cn0KCiRtaW5EZXB0aCA9IDA7CiRtYXhEZXB0aCA9IFxQSFBfSU5UX01BWDsKCmZvcmVhY2ggKCR0aGlzLT5kZXB0aHMgYXMgJGNvbXBhcmF0b3IpIHsKc3dpdGNoICgkY29tcGFyYXRvci0+Z2V0T3BlcmF0b3IoKSkgewpjYXNlICc+JzoKJG1pbkRlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpICsgMTsKYnJlYWs7CmNhc2UgJz49JzoKJG1pbkRlcHRoID0gJGNvbXBhcmF0b3ItPmdldFRhcmdldCgpOwpicmVhazsKY2FzZSAnPCc6CiRtYXhEZXB0aCA9ICRjb21wYXJhdG9yLT5nZXRUYXJnZXQoKSAtIDE7CmJyZWFrOwpjYXNlICc8PSc6CiRtYXhEZXB0aCA9ICRjb21wYXJhdG9yLT5nZXRUYXJnZXQoKTsKYnJlYWs7CmRlZmF1bHQ6CiRtaW5EZXB0aCA9ICRtYXhEZXB0aCA9ICRjb21wYXJhdG9yLT5nZXRUYXJnZXQoKTsKfQp9CgokZmxhZ3MgPSBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3I6OlNLSVBfRE9UUzsKCmlmICgkdGhpcy0+Zm9sbG93TGlua3MpIHsKJGZsYWdzIHw9IFxSZWN1cnNpdmVEaXJlY3RvcnlJdGVyYXRvcjo6Rk9MTE9XX1NZTUxJTktTOwp9CgokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IoJGRpciwgJGZsYWdzLCAkdGhpcy0+aWdub3JlVW5yZWFkYWJsZURpcnMpOwoKaWYgKCRleGNsdWRlKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxFeGNsdWRlRGlyZWN0b3J5RmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkZXhjbHVkZSk7Cn0KCiRpdGVyYXRvciA9IG5ldyBcUmVjdXJzaXZlSXRlcmF0b3JJdGVyYXRvcigkaXRlcmF0b3IsIFxSZWN1cnNpdmVJdGVyYXRvckl0ZXJhdG9yOjpTRUxGX0ZJUlNUKTsKCmlmICgkbWluRGVwdGggPiAwIHx8ICRtYXhEZXB0aCA8IFxQSFBfSU5UX01BWCkgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRGVwdGhSYW5nZUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJG1pbkRlcHRoLCAkbWF4RGVwdGgpOwp9CgppZiAoJHRoaXMtPm1vZGUpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXEZpbGVUeXBlRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+bW9kZSk7Cn0KCmlmICgkdGhpcy0+bmFtZXMgfHwgJHRoaXMtPm5vdE5hbWVzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxGaWxlbmFtZUZpbHRlckl0ZXJhdG9yKCRpdGVyYXRvciwgJHRoaXMtPm5hbWVzLCAkdGhpcy0+bm90TmFtZXMpOwp9CgppZiAoJHRoaXMtPmNvbnRhaW5zIHx8ICR0aGlzLT5ub3RDb250YWlucykgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcRmlsZWNvbnRlbnRGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5jb250YWlucywgJHRoaXMtPm5vdENvbnRhaW5zKTsKfQoKaWYgKCR0aGlzLT5zaXplcykgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcU2l6ZVJhbmdlRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+c2l6ZXMpOwp9CgppZiAoJHRoaXMtPmRhdGVzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxEYXRlUmFuZ2VGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICR0aGlzLT5kYXRlcyk7Cn0KCmlmICgkdGhpcy0+ZmlsdGVycykgewokaXRlcmF0b3IgPSBuZXcgSXRlcmF0b3JcQ3VzdG9tRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+ZmlsdGVycyk7Cn0KCmlmICgkdGhpcy0+cGF0aHMgfHwgJG5vdFBhdGhzKSB7CiRpdGVyYXRvciA9IG5ldyBJdGVyYXRvclxQYXRoRmlsdGVySXRlcmF0b3IoJGl0ZXJhdG9yLCAkdGhpcy0+cGF0aHMsICRub3RQYXRocyk7Cn0KCmlmIChzdGF0aWM6OklHTk9SRV9WQ1NfSUdOT1JFRF9GSUxFUyA9PT0gKHN0YXRpYzo6SUdOT1JFX1ZDU19JR05PUkVEX0ZJTEVTICYgJHRoaXMtPmlnbm9yZSkpIHsKJGl0ZXJhdG9yID0gbmV3IEl0ZXJhdG9yXFZjc0lnbm9yZWRGaWx0ZXJJdGVyYXRvcigkaXRlcmF0b3IsICRkaXIpOwp9CgpyZXR1cm4gJGl0ZXJhdG9yOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gbm9ybWFsaXplRGlyKHN0cmluZyAkZGlyKTogc3RyaW5nCnsKaWYgKCcvJyA9PT0gJGRpcikgewpyZXR1cm4gJGRpcjsKfQoKJGRpciA9IHJ0cmltKCRkaXIsICcvJy5cRElSRUNUT1JZX1NFUEFSQVRPUik7CgppZiAocHJlZ19tYXRjaCgnI14oc3NoMlwuKT9zP2Z0cDovLyMnLCAkZGlyKSkgewokZGlyIC49ICcvJzsKfQoKcmV0dXJuICRkaXI7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlcjsKCgoKCgoKCmNsYXNzIEdpdGlnbm9yZQp7CgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkZ2l0aWdub3JlRmlsZUNvbnRlbnQpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6YnVpbGRSZWdleCgkZ2l0aWdub3JlRmlsZUNvbnRlbnQsIGZhbHNlKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiB0b1JlZ2V4TWF0Y2hpbmdOZWdhdGVkUGF0dGVybnMoc3RyaW5nICRnaXRpZ25vcmVGaWxlQ29udGVudCk6IHN0cmluZwp7CnJldHVybiBzZWxmOjpidWlsZFJlZ2V4KCRnaXRpZ25vcmVGaWxlQ29udGVudCwgdHJ1ZSk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGJ1aWxkUmVnZXgoc3RyaW5nICRnaXRpZ25vcmVGaWxlQ29udGVudCwgYm9vbCAkaW52ZXJ0ZWQpOiBzdHJpbmcKewokZ2l0aWdub3JlRmlsZUNvbnRlbnQgPSBwcmVnX3JlcGxhY2UoJ34oPzwhXFxcXCkjW15cblxyXSp+JywgJycsICRnaXRpZ25vcmVGaWxlQ29udGVudCk7CiRnaXRpZ25vcmVMaW5lcyA9IHByZWdfc3BsaXQoJ35cclxuP3xcbn4nLCAkZ2l0aWdub3JlRmlsZUNvbnRlbnQpOwoKJHJlcyA9IHNlbGY6OmxpbmVUb1JlZ2V4KCcnKTsKZm9yZWFjaCAoJGdpdGlnbm9yZUxpbmVzIGFzICRsaW5lKSB7CiRsaW5lID0gcHJlZ19yZXBsYWNlKCd+KD88IVxcXFwpWyBcdF0rJH4nLCAnJywgJGxpbmUpOwoKaWYgKCchJyA9PT0gc3Vic3RyKCRsaW5lLCAwLCAxKSkgewokbGluZSA9IHN1YnN0cigkbGluZSwgMSk7CiRpc05lZ2F0aXZlID0gdHJ1ZTsKfSBlbHNlIHsKJGlzTmVnYXRpdmUgPSBmYWxzZTsKfQoKaWYgKCcnICE9PSAkbGluZSkgewppZiAoJGlzTmVnYXRpdmUgeG9yICRpbnZlcnRlZCkgewokcmVzID0gJyg/IScuc2VsZjo6bGluZVRvUmVnZXgoJGxpbmUpLickKScuJHJlczsKfSBlbHNlIHsKJHJlcyA9ICcoPzonLiRyZXMuJ3wnLnNlbGY6OmxpbmVUb1JlZ2V4KCRsaW5lKS4nKSc7Cn0KfQp9CgpyZXR1cm4gJ35eKD86Jy4kcmVzLicpfnMnOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBsaW5lVG9SZWdleChzdHJpbmcgJGdpdGlnbm9yZUxpbmUpOiBzdHJpbmcKewppZiAoJycgPT09ICRnaXRpZ25vcmVMaW5lKSB7CnJldHVybiAnJGYnOyAKfQoKJHNsYXNoUG9zID0gc3RycG9zKCRnaXRpZ25vcmVMaW5lLCAnLycpOwppZiAoZmFsc2UgIT09ICRzbGFzaFBvcyAmJiBcc3RybGVuKCRnaXRpZ25vcmVMaW5lKSAtIDEgIT09ICRzbGFzaFBvcykgewppZiAoMCA9PT0gJHNsYXNoUG9zKSB7CiRnaXRpZ25vcmVMaW5lID0gc3Vic3RyKCRnaXRpZ25vcmVMaW5lLCAxKTsKfQokaXNBYnNvbHV0ZSA9IHRydWU7Cn0gZWxzZSB7CiRpc0Fic29sdXRlID0gZmFsc2U7Cn0KCiRyZWdleCA9IHByZWdfcXVvdGUoc3RyX3JlcGxhY2UoJ1xcJywgJycsICRnaXRpZ25vcmVMaW5lKSwgJ34nKTsKJHJlZ2V4ID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCd+XFxcXFxbKCg/OlxcXFwhKT8pKFteXFtcXV0qKVxcXFxcXX4nLCBmdW5jdGlvbiAoYXJyYXkgJG1hdGNoZXMpOiBzdHJpbmcgewpyZXR1cm4gJ1snLignJyAhPT0gJG1hdGNoZXNbMV0gPyAnXicgOiAnJykuc3RyX3JlcGxhY2UoJ1xcLScsICctJywgJG1hdGNoZXNbMl0pLiddJzsKfSwgJHJlZ2V4KTsKJHJlZ2V4ID0gcHJlZ19yZXBsYWNlKCd+KD86KD86XFxcXFwqKXsyLH0oLz8pKSt+JywgJyg/Oig/Oig/IS8vKS4oPzwhLy8pKSskMSk/JywgJHJlZ2V4KTsKJHJlZ2V4ID0gcHJlZ19yZXBsYWNlKCd+XFxcXFwqficsICdbXi9dKicsICRyZWdleCk7CiRyZWdleCA9IHByZWdfcmVwbGFjZSgnflxcXFxcP34nLCAnW14vXScsICRyZWdleCk7CgpyZXR1cm4gKCRpc0Fic29sdXRlID8gJycgOiAnKD86W14vXSsvKSonKQouJHJlZ2V4Ci4oIXN0cl9lbmRzX3dpdGgoJGdpdGlnbm9yZUxpbmUsICcvJykgPyAnKD86JHwvKScgOiAnJyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlcjsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgpjbGFzcyBHbG9iCnsKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRnbG9iLCBib29sICRzdHJpY3RMZWFkaW5nRG90ID0gdHJ1ZSwgYm9vbCAkc3RyaWN0V2lsZGNhcmRTbGFzaCA9IHRydWUsIHN0cmluZyAkZGVsaW1pdGVyID0gJyMnKQp7CiRmaXJzdEJ5dGUgPSB0cnVlOwokZXNjYXBpbmcgPSBmYWxzZTsKJGluQ3VybGllcyA9IDA7CiRyZWdleCA9ICcnOwokc2l6ZUdsb2IgPSBcc3RybGVuKCRnbG9iKTsKZm9yICgkaSA9IDA7ICRpIDwgJHNpemVHbG9iOyArKyRpKSB7CiRjYXIgPSAkZ2xvYlskaV07CmlmICgkZmlyc3RCeXRlICYmICRzdHJpY3RMZWFkaW5nRG90ICYmICcuJyAhPT0gJGNhcikgewokcmVnZXggLj0gJyg/PVteXC5dKSc7Cn0KCiRmaXJzdEJ5dGUgPSAnLycgPT09ICRjYXI7CgppZiAoJGZpcnN0Qnl0ZSAmJiAkc3RyaWN0V2lsZGNhcmRTbGFzaCAmJiBpc3NldCgkZ2xvYlskaSArIDJdKSAmJiAnKionID09PSAkZ2xvYlskaSArIDFdLiRnbG9iWyRpICsgMl0gJiYgKCFpc3NldCgkZ2xvYlskaSArIDNdKSB8fCAnLycgPT09ICRnbG9iWyRpICsgM10pKSB7CiRjYXIgPSAnW14vXSsrLyc7CmlmICghaXNzZXQoJGdsb2JbJGkgKyAzXSkpIHsKJGNhciAuPSAnPyc7Cn0KCmlmICgkc3RyaWN0TGVhZGluZ0RvdCkgewokY2FyID0gJyg/PVteXC5dKScuJGNhcjsKfQoKJGNhciA9ICcvKD86Jy4kY2FyLicpKic7CiRpICs9IDIgKyBpc3NldCgkZ2xvYlskaSArIDNdKTsKCmlmICgnLycgPT09ICRkZWxpbWl0ZXIpIHsKJGNhciA9IHN0cl9yZXBsYWNlKCcvJywgJ1xcLycsICRjYXIpOwp9Cn0KCmlmICgkZGVsaW1pdGVyID09PSAkY2FyIHx8ICcuJyA9PT0gJGNhciB8fCAnKCcgPT09ICRjYXIgfHwgJyknID09PSAkY2FyIHx8ICd8JyA9PT0gJGNhciB8fCAnKycgPT09ICRjYXIgfHwgJ14nID09PSAkY2FyIHx8ICckJyA9PT0gJGNhcikgewokcmVnZXggLj0gIlxcJGNhciI7Cn0gZWxzZWlmICgnKicgPT09ICRjYXIpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICdcXConIDogKCRzdHJpY3RXaWxkY2FyZFNsYXNoID8gJ1teL10qJyA6ICcuKicpOwp9IGVsc2VpZiAoJz8nID09PSAkY2FyKSB7CiRyZWdleCAuPSAkZXNjYXBpbmcgPyAnXFw/JyA6ICgkc3RyaWN0V2lsZGNhcmRTbGFzaCA/ICdbXi9dJyA6ICcuJyk7Cn0gZWxzZWlmICgneycgPT09ICRjYXIpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICdcXHsnIDogJygnOwppZiAoISRlc2NhcGluZykgeworKyRpbkN1cmxpZXM7Cn0KfSBlbHNlaWYgKCd9JyA9PT0gJGNhciAmJiAkaW5DdXJsaWVzKSB7CiRyZWdleCAuPSAkZXNjYXBpbmcgPyAnfScgOiAnKSc7CmlmICghJGVzY2FwaW5nKSB7Ci0tJGluQ3VybGllczsKfQp9IGVsc2VpZiAoJywnID09PSAkY2FyICYmICRpbkN1cmxpZXMpIHsKJHJlZ2V4IC49ICRlc2NhcGluZyA/ICcsJyA6ICd8JzsKfSBlbHNlaWYgKCdcXCcgPT09ICRjYXIpIHsKaWYgKCRlc2NhcGluZykgewokcmVnZXggLj0gJ1xcXFwnOwokZXNjYXBpbmcgPSBmYWxzZTsKfSBlbHNlIHsKJGVzY2FwaW5nID0gdHJ1ZTsKfQoKY29udGludWU7Cn0gZWxzZSB7CiRyZWdleCAuPSAkY2FyOwp9CiRlc2NhcGluZyA9IGZhbHNlOwp9CgpyZXR1cm4gJGRlbGltaXRlci4nXicuJHJlZ2V4LickJy4kZGVsaW1pdGVyOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCgoKY2xhc3MgQ3VzdG9tRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwcml2YXRlICRmaWx0ZXJzID0gW107CgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXEl0ZXJhdG9yICRpdGVyYXRvciwgYXJyYXkgJGZpbHRlcnMpCnsKZm9yZWFjaCAoJGZpbHRlcnMgYXMgJGZpbHRlcikgewppZiAoIVxpc19jYWxsYWJsZSgkZmlsdGVyKSkgewp0aHJvdyBuZXcgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBQSFAgY2FsbGJhY2suJyk7Cn0KfQokdGhpcy0+ZmlsdGVycyA9ICRmaWx0ZXJzOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewokZmlsZWluZm8gPSAkdGhpcy0+Y3VycmVudCgpOwoKZm9yZWFjaCAoJHRoaXMtPmZpbHRlcnMgYXMgJGZpbHRlcikgewppZiAoZmFsc2UgPT09ICRmaWx0ZXIoJGZpbGVpbmZvKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcQ29tcGFyYXRvclxEYXRlQ29tcGFyYXRvcjsKCgoKCgoKCgpjbGFzcyBEYXRlUmFuZ2VGaWx0ZXJJdGVyYXRvciBleHRlbmRzIFxGaWx0ZXJJdGVyYXRvcgp7CnByaXZhdGUgJGNvbXBhcmF0b3JzID0gW107CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGFycmF5ICRjb21wYXJhdG9ycykKewokdGhpcy0+Y29tcGFyYXRvcnMgPSAkY29tcGFyYXRvcnM7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CiRmaWxlaW5mbyA9ICR0aGlzLT5jdXJyZW50KCk7CgppZiAoIWZpbGVfZXhpc3RzKCRmaWxlaW5mby0+Z2V0UGF0aG5hbWUoKSkpIHsKcmV0dXJuIGZhbHNlOwp9CgokZmlsZWRhdGUgPSAkZmlsZWluZm8tPmdldE1UaW1lKCk7CmZvcmVhY2ggKCR0aGlzLT5jb21wYXJhdG9ycyBhcyAkY29tcGFyZSkgewppZiAoISRjb21wYXJlLT50ZXN0KCRmaWxlZGF0ZSkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCgoKY2xhc3MgRGVwdGhSYW5nZUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yCnsKcHJpdmF0ZSAkbWluRGVwdGggPSAwOwoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoXFJlY3Vyc2l2ZUl0ZXJhdG9ySXRlcmF0b3IgJGl0ZXJhdG9yLCBpbnQgJG1pbkRlcHRoID0gMCwgaW50ICRtYXhEZXB0aCA9IFxQSFBfSU5UX01BWCkKewokdGhpcy0+bWluRGVwdGggPSAkbWluRGVwdGg7CiRpdGVyYXRvci0+c2V0TWF4RGVwdGgoXFBIUF9JTlRfTUFYID09PSAkbWF4RGVwdGggPyAtMSA6ICRtYXhEZXB0aCk7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRpdGVyYXRvcik7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBhY2NlcHQoKQp7CnJldHVybiAkdGhpcy0+Z2V0SW5uZXJJdGVyYXRvcigpLT5nZXREZXB0aCgpID49ICR0aGlzLT5taW5EZXB0aDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgoKY2xhc3MgRXhjbHVkZURpcmVjdG9yeUZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgXEZpbHRlckl0ZXJhdG9yIGltcGxlbWVudHMgXFJlY3Vyc2l2ZUl0ZXJhdG9yCnsKcHJpdmF0ZSAkaXRlcmF0b3I7CnByaXZhdGUgJGlzUmVjdXJzaXZlOwpwcml2YXRlICRleGNsdWRlZERpcnMgPSBbXTsKcHJpdmF0ZSAkZXhjbHVkZWRQYXR0ZXJuOwoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBhcnJheSAkZGlyZWN0b3JpZXMpCnsKJHRoaXMtPml0ZXJhdG9yID0gJGl0ZXJhdG9yOwokdGhpcy0+aXNSZWN1cnNpdmUgPSAkaXRlcmF0b3IgaW5zdGFuY2VvZiBcUmVjdXJzaXZlSXRlcmF0b3I7CiRwYXR0ZXJucyA9IFtdOwpmb3JlYWNoICgkZGlyZWN0b3JpZXMgYXMgJGRpcmVjdG9yeSkgewokZGlyZWN0b3J5ID0gcnRyaW0oJGRpcmVjdG9yeSwgJy8nKTsKaWYgKCEkdGhpcy0+aXNSZWN1cnNpdmUgfHwgc3RyX2NvbnRhaW5zKCRkaXJlY3RvcnksICcvJykpIHsKJHBhdHRlcm5zW10gPSBwcmVnX3F1b3RlKCRkaXJlY3RvcnksICcjJyk7Cn0gZWxzZSB7CiR0aGlzLT5leGNsdWRlZERpcnNbJGRpcmVjdG9yeV0gPSB0cnVlOwp9Cn0KaWYgKCRwYXR0ZXJucykgewokdGhpcy0+ZXhjbHVkZWRQYXR0ZXJuID0gJyMoPzpefC8pKD86Jy5pbXBsb2RlKCd8JywgJHBhdHRlcm5zKS4nKSg/Oi98JCkjJzsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewppZiAoJHRoaXMtPmlzUmVjdXJzaXZlICYmIGlzc2V0KCR0aGlzLT5leGNsdWRlZERpcnNbJHRoaXMtPmdldEZpbGVuYW1lKCldKSAmJiAkdGhpcy0+aXNEaXIoKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+ZXhjbHVkZWRQYXR0ZXJuKSB7CiRwYXRoID0gJHRoaXMtPmlzRGlyKCkgPyAkdGhpcy0+Y3VycmVudCgpLT5nZXRSZWxhdGl2ZVBhdGhuYW1lKCkgOiAkdGhpcy0+Y3VycmVudCgpLT5nZXRSZWxhdGl2ZVBhdGgoKTsKJHBhdGggPSBzdHJfcmVwbGFjZSgnXFwnLCAnLycsICRwYXRoKTsKCnJldHVybiAhcHJlZ19tYXRjaCgkdGhpcy0+ZXhjbHVkZWRQYXR0ZXJuLCAkcGF0aCk7Cn0KCnJldHVybiB0cnVlOwp9CgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGhhc0NoaWxkcmVuKCkKewpyZXR1cm4gJHRoaXMtPmlzUmVjdXJzaXZlICYmICR0aGlzLT5pdGVyYXRvci0+aGFzQ2hpbGRyZW4oKTsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZHJlbigpCnsKJGNoaWxkcmVuID0gbmV3IHNlbGYoJHRoaXMtPml0ZXJhdG9yLT5nZXRDaGlsZHJlbigpLCBbXSk7CiRjaGlsZHJlbi0+ZXhjbHVkZWREaXJzID0gJHRoaXMtPmV4Y2x1ZGVkRGlyczsKJGNoaWxkcmVuLT5leGNsdWRlZFBhdHRlcm4gPSAkdGhpcy0+ZXhjbHVkZWRQYXR0ZXJuOwoKcmV0dXJuICRjaGlsZHJlbjsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCmNsYXNzIEZpbGVUeXBlRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwdWJsaWMgY29uc3QgT05MWV9GSUxFUyA9IDE7CnB1YmxpYyBjb25zdCBPTkxZX0RJUkVDVE9SSUVTID0gMjsKCnByaXZhdGUgJG1vZGU7CgoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFxJdGVyYXRvciAkaXRlcmF0b3IsIGludCAkbW9kZSkKewokdGhpcy0+bW9kZSA9ICRtb2RlOwoKcGFyZW50OjpfX2NvbnN0cnVjdCgkaXRlcmF0b3IpOwp9CgoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewokZmlsZWluZm8gPSAkdGhpcy0+Y3VycmVudCgpOwppZiAoc2VsZjo6T05MWV9ESVJFQ1RPUklFUyA9PT0gKHNlbGY6Ok9OTFlfRElSRUNUT1JJRVMgJiAkdGhpcy0+bW9kZSkgJiYgJGZpbGVpbmZvLT5pc0ZpbGUoKSkgewpyZXR1cm4gZmFsc2U7Cn0gZWxzZWlmIChzZWxmOjpPTkxZX0ZJTEVTID09PSAoc2VsZjo6T05MWV9GSUxFUyAmICR0aGlzLT5tb2RlKSAmJiAkZmlsZWluZm8tPmlzRGlyKCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gdHJ1ZTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEl0ZXJhdG9yOwoKCgoKCgoKCgpjbGFzcyBGaWxlY29udGVudEZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgTXVsdGlwbGVQY3JlRmlsdGVySXRlcmF0b3IKewoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewppZiAoISR0aGlzLT5tYXRjaFJlZ2V4cHMgJiYgISR0aGlzLT5ub01hdGNoUmVnZXhwcykgewpyZXR1cm4gdHJ1ZTsKfQoKJGZpbGVpbmZvID0gJHRoaXMtPmN1cnJlbnQoKTsKCmlmICgkZmlsZWluZm8tPmlzRGlyKCkgfHwgISRmaWxlaW5mby0+aXNSZWFkYWJsZSgpKSB7CnJldHVybiBmYWxzZTsKfQoKJGNvbnRlbnQgPSAkZmlsZWluZm8tPmdldENvbnRlbnRzKCk7CmlmICghJGNvbnRlbnQpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHRoaXMtPmlzQWNjZXB0ZWQoJGNvbnRlbnQpOwp9CgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRzdHIpCnsKcmV0dXJuICR0aGlzLT5pc1JlZ2V4KCRzdHIpID8gJHN0ciA6ICcvJy5wcmVnX3F1b3RlKCRzdHIsICcvJykuJy8nOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcRmluZGVyXEdsb2I7CgoKCgoKCgoKY2xhc3MgRmlsZW5hbWVGaWx0ZXJJdGVyYXRvciBleHRlbmRzIE11bHRpcGxlUGNyZUZpbHRlckl0ZXJhdG9yCnsKCgoKCgojW1xSZXR1cm5UeXBlV2lsbENoYW5nZV0KcHVibGljIGZ1bmN0aW9uIGFjY2VwdCgpCnsKcmV0dXJuICR0aGlzLT5pc0FjY2VwdGVkKCR0aGlzLT5jdXJyZW50KCktPmdldEZpbGVuYW1lKCkpOwp9CgoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHRvUmVnZXgoc3RyaW5nICRzdHIpCnsKcmV0dXJuICR0aGlzLT5pc1JlZ2V4KCRzdHIpID8gJHN0ciA6IEdsb2I6OnRvUmVnZXgoJHN0cik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKY2xhc3MgTGF6eUl0ZXJhdG9yIGltcGxlbWVudHMgXEl0ZXJhdG9yQWdncmVnYXRlCnsKcHJpdmF0ZSAkaXRlcmF0b3JGYWN0b3J5OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGNhbGxhYmxlICRpdGVyYXRvckZhY3RvcnkpCnsKJHRoaXMtPml0ZXJhdG9yRmFjdG9yeSA9ICRpdGVyYXRvckZhY3Rvcnk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpOiBcVHJhdmVyc2FibGUKewp5aWVsZCBmcm9tICgkdGhpcy0+aXRlcmF0b3JGYWN0b3J5KSgpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcSXRlcmF0b3I7CgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgTXVsdGlwbGVQY3JlRmlsdGVySXRlcmF0b3IgZXh0ZW5kcyBcRmlsdGVySXRlcmF0b3IKewpwcm90ZWN0ZWQgJG1hdGNoUmVnZXhwcyA9IFtdOwpwcm90ZWN0ZWQgJG5vTWF0Y2hSZWdleHBzID0gW107CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChcSXRlcmF0b3IgJGl0ZXJhdG9yLCBhcnJheSAkbWF0Y2hQYXR0ZXJucywgYXJyYXkgJG5vTWF0Y2hQYXR0ZXJucykKewpmb3JlYWNoICgkbWF0Y2hQYXR0ZXJucyBhcyAkcGF0dGVybikgewokdGhpcy0+bWF0Y2hSZWdleHBzW10gPSAkdGhpcy0+dG9SZWdleCgkcGF0dGVybik7Cn0KCmZvcmVhY2ggKCRub01hdGNoUGF0dGVybnMgYXMgJHBhdHRlcm4pIHsKJHRoaXMtPm5vTWF0Y2hSZWdleHBzW10gPSAkdGhpcy0+dG9SZWdleCgkcGF0dGVybik7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJGl0ZXJhdG9yKTsKfQoKCgoKCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzQWNjZXB0ZWQoc3RyaW5nICRzdHJpbmcpCnsKCmZvcmVhY2ggKCR0aGlzLT5ub01hdGNoUmVnZXhwcyBhcyAkcmVnZXgpIHsKaWYgKHByZWdfbWF0Y2goJHJlZ2V4LCAkc3RyaW5nKSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKCmlmICgkdGhpcy0+bWF0Y2hSZWdleHBzKSB7CmZvcmVhY2ggKCR0aGlzLT5tYXRjaFJlZ2V4cHMgYXMgJHJlZ2V4KSB7CmlmIChwcmVnX21hdGNoKCRyZWdleCwgJHN0cmluZykpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKcmV0dXJuIHRydWU7Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzUmVnZXgoc3RyaW5nICRzdHIpCnsKJGF2YWlsYWJsZU1vZGlmaWVycyA9ICdpbXN4dUFEVSc7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMjAwKSB7CiRhdmFpbGFibGVNb2RpZmllcnMgLj0gJ24nOwp9CgppZiAocHJlZ19tYXRjaCgnL14oLnszLH0/KVsnLiRhdmFpbGFibGVNb2RpZmllcnMuJ10qJC8nLCAkc3RyLCAkbSkpIHsKJHN0YXJ0ID0gc3Vic3RyKCRtWzFdLCAwLCAxKTsKJGVuZCA9IHN1YnN0cigkbVsxXSwgLTEpOwoKaWYgKCRzdGFydCA9PT0gJGVuZCkgewpyZXR1cm4gIXByZWdfbWF0Y2goJy9bKj9bOmFsbnVtOl0gXFxcXF0vJywgJHN0YXJ0KTsKfQoKZm9yZWFjaCAoW1sneycsICd9J10sIFsnKCcsICcpJ10sIFsnWycsICddJ10sIFsnPCcsICc+J11dIGFzICRkZWxpbWl0ZXJzKSB7CmlmICgkc3RhcnQgPT09ICRkZWxpbWl0ZXJzWzBdICYmICRlbmQgPT09ICRkZWxpbWl0ZXJzWzFdKSB7CnJldHVybiB0cnVlOwp9Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgoKCmFic3RyYWN0IHByb3RlY3RlZCBmdW5jdGlvbiB0b1JlZ2V4KHN0cmluZyAkc3RyKTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCgoKCgoKCgoKY2xhc3MgUGF0aEZpbHRlckl0ZXJhdG9yIGV4dGVuZHMgTXVsdGlwbGVQY3JlRmlsdGVySXRlcmF0b3IKewoKCgoKCiNbXFJldHVyblR5cGVXaWxsQ2hhbmdlXQpwdWJsaWMgZnVuY3Rpb24gYWNjZXB0KCkKewokZmlsZW5hbWUgPSAkdGhpcy0+Y3VycmVudCgpLT5nZXRSZWxhdGl2ZVBhdGhuYW1lKCk7CgppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGZpbGVuYW1lID0gc3RyX3JlcGxhY2UoJ1xcJywgJy8nLCAkZmlsZW5hbWUpOwp9CgpyZXR1cm4gJHRoaXMtPmlzQWNjZXB0ZWQoJGZpbGVuYW1lKTsKfQoKCgoKCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gdG9SZWdleChzdHJpbmcgJHN0cikKewpyZXR1cm4gJHRoaXMtPmlzUmVnZXgoJHN0cikgPyAkc3RyIDogJy8nLnByZWdfcXVvdGUoJHN0ciwgJy8nKS4nLyc7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxJdGVyYXRvcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxGaW5kZXJcRXhjZXB0aW9uXEFjY2Vzc0RlbmllZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XEZpbmRlclxTcGxGaWxlSW5mbzsKCgoKCgoKY2xhc3MgUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IgZXh0ZW5kcyBcUmVjdXJzaXZlRGlyZWN0b3J5SXRlcmF0b3IKewoKCgpwcml2YXRlICRpZ25vcmVVbnJlYWRhYmxlRGlyczsKCgoKCnByaXZhdGUgJGlnbm9yZUZpcnN0UmV3aW5kID0gdHJ1ZTsKCgpwcml2YXRlICRyb290UGF0aDsKcHJpdmF0ZSAkc3ViUGF0aDsKcHJpdmF0ZSAkZGlyZWN0b3J5U2VwYXJhdG9yID0gJy8nOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkcGF0aCwgaW50ICRmbGFncywgYm9vbCAkaWdub3JlVW5yZWFkYWJsZURpcnMgPSBmYWxzZSkKewppZiAoJGZsYWdzICYgKHNlbGY6OkNVUlJFTlRfQVNfUEFUSE5BTUUgfCBzZWxmOjpDVVJSRU5UX0FTX1NFTEYpKSB7CnRocm93IG5ldyBcUnVudGltZUV4Y2VwdGlvbignVGhpcyBpdGVyYXRvciBvbmx5IHN1cHBvcnQgcmV0dXJuaW5nIGN1cnJlbnQgYXMgZmlsZWluZm8uJyk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJHBhdGgsICRmbGFncyk7CiR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycyA9ICRpZ25vcmVVbnJlYWRhYmxlRGlyczsKJHRoaXMtPnJvb3RQYXRoID0gJHBhdGg7CmlmICgnLycgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SICYmICEoJGZsYWdzICYgc2VsZjo6VU5JWF9QQVRIUykpIHsKJHRoaXMtPmRpcmVjdG9yeVNlcGFyYXRvciA9IFxESVJFQ1RPUllfU0VQQVJBVE9SOwp9Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBjdXJyZW50KCkKewoKCmlmIChudWxsID09PSAkc3ViUGF0aG5hbWUgPSAkdGhpcy0+c3ViUGF0aCkgewokc3ViUGF0aG5hbWUgPSAkdGhpcy0+c3ViUGF0aCA9ICR0aGlzLT5nZXRTdWJQYXRoKCk7Cn0KaWYgKCcnICE9PSAkc3ViUGF0aG5hbWUpIHsKJHN1YlBhdGhuYW1lIC49ICR0aGlzLT5kaXJlY3RvcnlTZXBhcmF0b3I7Cn0KJHN1YlBhdGhuYW1lIC49ICR0aGlzLT5nZXRGaWxlbmFtZSgpOwokYmFzZVBhdGggPSAkdGhpcy0+cm9vdFBhdGg7CgppZiAoJy8nICE9PSAkYmFzZVBhdGggJiYgIXN0cl9lbmRzX3dpdGgoJGJhc2VQYXRoLCAkdGhpcy0+ZGlyZWN0b3J5U2VwYXJhdG9yKSAmJiAhc3RyX2VuZHNfd2l0aCgkYmFzZVBhdGgsICcvJykpIHsKJGJhc2VQYXRoIC49ICR0aGlzLT5kaXJlY3RvcnlTZXBhcmF0b3I7Cn0KCnJldHVybiBuZXcgU3BsRmlsZUluZm8oJGJhc2VQYXRoLiRzdWJQYXRobmFtZSwgJHRoaXMtPnN1YlBhdGgsICRzdWJQYXRobmFtZSk7Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBoYXNDaGlsZHJlbigkYWxsb3dMaW5rcyA9IGZhbHNlKQp7CiRoYXNDaGlsZHJlbiA9IHBhcmVudDo6aGFzQ2hpbGRyZW4oJGFsbG93TGlua3MpOwoKaWYgKCEkaGFzQ2hpbGRyZW4gfHwgISR0aGlzLT5pZ25vcmVVbnJlYWRhYmxlRGlycykgewpyZXR1cm4gJGhhc0NoaWxkcmVuOwp9Cgp0cnkgewpwYXJlbnQ6OmdldENoaWxkcmVuKCk7CgpyZXR1cm4gdHJ1ZTsKfSBjYXRjaCAoXFVuZXhwZWN0ZWRWYWx1ZUV4Y2VwdGlvbiAkZSkgewoKcmV0dXJuIGZhbHNlOwp9Cn0KCgoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRDaGlsZHJlbigpCnsKdHJ5IHsKJGNoaWxkcmVuID0gcGFyZW50OjpnZXRDaGlsZHJlbigpOwoKaWYgKCRjaGlsZHJlbiBpbnN0YW5jZW9mIHNlbGYpIHsKCiRjaGlsZHJlbi0+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/ICdcWCcgOiBHcmFwaGVtZTo6R1JBUEhFTUVfQ0xVU1RFUl9SWCk7CgoKCgoKCgoKCgoKCgoKCgoKCgoKZmluYWwgY2xhc3MgR3JhcGhlbWUKewoKCnB1YmxpYyBjb25zdCBHUkFQSEVNRV9DTFVTVEVSX1JYID0gJyg/OlxyXG58KD86WyAtflx4ezIwMEN9XHh7MjAwRH1dfFvhhqgt4Ye5XSt8W+GEgC3hhZ9dKig/OlvqsIDqsJzqsLjqsZTqsbDqsozqsqjqs4Tqs6Dqs7zqtJjqtLTqtZDqtazqtojqtqTqt4Dqt5zqt7jquJTquLDquYzquajquoTquqDqurzqu5jqu7TqvJDqvKzqvYjqvaTqvoDqvpzqvrjqv5Tqv7DrgIzrgKjrgYTrgaDrgbzrgpjrgrTrg5Drg6zrhIjrhKTrhYDrhZzrhbjrhpTrhrDrh4zrh6jriITriKDriLzriZjribTripDriqzri4jri6TrjIDrjJzrjLjrjZTrjbDrjozrjqjrj4Trj6Drj7zrkJjrkLTrkZDrkazrkojrkqTrk4Drk5zrk7jrlJTrlLDrlYzrlajrloTrlqDrlrzrl5jrl7TrmJDrmKzrmYjrmaTrmoDrmpzrmrjrm5Trm7DrnIzrnKjrnYTrnaDrnbzrnpjrnrTrn5Drn6zroIjroKTroYDroZzrobjropTrorDro4zro6jrpITrpKDrpLzrpZjrpbTrppDrpqzrp4jrp6TrqIDrqJzrqLjrqZTrqbDrqozrqqjrq4Trq6Drq7zrrJjrrLTrrZDrrazrrojrrqTrr4Drr5zrr7jrsJTrsLDrsYzrsajrsoTrsqDrsrzrs5jrs7TrtJDrtKzrtYjrtaTrtoDrtpzrtrjrt5Trt7DruIzruKjruYTruaDrubzrupjrurTru5Dru6zrvIjrvKTrvYDrvZzrvbjrvpTrvrDrv4zrv6jsgITsgKDsgLzsgZjsgbTsgpDsgqzsg4jsg6TshIDshJzshLjshZTshbDshozshqjsh4Tsh6Dsh7zsiJjsiLTsiZDsiazsiojsiqTsi4Dsi5zsi7jsjJTsjLDsjYzsjajsjoTsjqDsjrzsj5jsj7TskJDskKzskYjskaTskoDskpzskrjsk5Tsk7DslIzslKjslYTslaDslbzslpjslrTsl5Dsl6zsmIjsmKTsmYDsmZzsmbjsmpTsmrDsm4zsm6jsnITsnKDsnLzsnZjsnbTsnpDsnqzsn4jsn6TsoIDsoJzsoLjsoZTsobDsoozsoqjso4Tso6Dso7zspJjspLTspZDspazspojspqTsp4Dsp5zsp7jsqJTsqLDsqYzsqajsqoTsqqDsqrzsq5jsq7TsrJDsrKzsrYjsraTsroDsrpzsrrjsr5Tsr7DssIzssKjssYTssaDssbzsspjssrTss5Dss6zstIjstKTstYDstZzstbjstpTstrDst4zst6jsuITsuKDsuLzsuZjsubTsupDsuqzsu4jsu6TsvIDsvJzsvLjsvZTsvbDsvozsvqjsv4Tsv6Dsv7ztgJjtgLTtgZDtgaztgojtgqTtg4Dtg5ztg7jthJTthLDthYzthajthoTthqDthrzth5jth7TtiJDtiKztiYjtiaTtioDtipztirjti5Tti7DtjIztjKjtjYTtjaDtjbztjpjtjrTtj5Dtj6ztkIjtkKTtkYDtkZztkbjtkpTtkrDtk4ztk6jtlITtlKDtlLztlZjtlbTtlpDtlqztl4jtl6TtmIDtmJztmLjtmZTtmbDtmoztmqjtm4Ttm6Dtm7ztnJjtnLTtnZDtnaztnohdP1vhhaAt4YaiXSt8W+qwgC3tnqNdKVvhhqgt4Ye5XSp8W+GEgC3hhZ9dK3xbXlxwe0NjfVxwe0NmfVxwe1psfVxwe1pwfV0pW1xwe01ufVxwe01lfVx4ezA5QkV9XHh7MDlEN31ceHswQjNFfVx4ezBCNTd9XHh7MEJCRX1ceHswQkQ3fVx4ezBDQzJ9XHh7MENENX1ceHswQ0Q2fVx4ezBEM0V9XHh7MEQ1N31ceHswRENGfVx4ezBEREZ9XHh7MjAwQ31ceHsyMDBEfVx4ezFEMTY1fVx4ezFEMTZFfS1ceHsxRDE3Mn1dKnxbXHB7Q2N9XHB7Q2Z9XHB7Wmx9XHB7WnB9XSknOwoKcHJpdmF0ZSBjb25zdCBDQVNFX0ZPTEQgPSBbClsnwrUnLCAnxb8nLCAiXHhDRFx4ODUiLCAnz4InLCAiXHhDRlx4OTAiLCAiXHhDRlx4OTEiLCAiXHhDRlx4OTUiLCAiXHhDRlx4OTYiLCAiXHhDRlx4QjAiLCAiXHhDRlx4QjEiLCAiXHhDRlx4QjUiLCAiXHhFMVx4QkFceDlCIiwgIlx4RTFceEJFXHhCRSJdLApbJ868JywgJ3MnLCAnzrknLCAnz4MnLCAnzrInLCAnzrgnLCAnz4YnLCAnz4AnLCAnzronLCAnz4EnLCAnzrUnLCAiXHhFMVx4QjlceEExIiwgJ865J10sCl07CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX2V4dHJhY3QoJHMsICRzaXplLCAkdHlwZSA9IFxHUkFQSEVNRV9FWFRSX0NPVU5ULCAkc3RhcnQgPSAwLCAmJG5leHQgPSAwKQp7CmlmICgwID4gJHN0YXJ0KSB7CiRzdGFydCA9IFxzdHJsZW4oJHMpICsgJHN0YXJ0Owp9CgppZiAoIVxpc19zY2FsYXIoJHMpKSB7CiRoYXNFcnJvciA9IGZhbHNlOwpzZXRfZXJyb3JfaGFuZGxlcihmdW5jdGlvbiAoKSB1c2UgKCYkaGFzRXJyb3IpIHsgJGhhc0Vycm9yID0gdHJ1ZTsgfSk7CiRuZXh0ID0gc3Vic3RyKCRzLCAkc3RhcnQpOwpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKaWYgKCRoYXNFcnJvcikgewpzdWJzdHIoJHMsICRzdGFydCk7CiRzID0gJyc7Cn0gZWxzZSB7CiRzID0gJG5leHQ7Cn0KfSBlbHNlIHsKJHMgPSBzdWJzdHIoJHMsICRzdGFydCk7Cn0KJHNpemUgPSAoaW50KSAkc2l6ZTsKJHR5cGUgPSAoaW50KSAkdHlwZTsKJHN0YXJ0ID0gKGludCkgJHN0YXJ0OwoKaWYgKFxHUkFQSEVNRV9FWFRSX0NPVU5UICE9PSAkdHlwZSAmJiBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUyAhPT0gJHR5cGUgJiYgXEdSQVBIRU1FX0VYVFJfTUFYQ0hBUlMgIT09ICR0eXBlKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignZ3JhcGhlbWVfZXh0cmFjdCgpOiBBcmd1bWVudCAjMyAoJHR5cGUpIG11c3QgYmUgb25lIG9mIEdSQVBIRU1FX0VYVFJfQ09VTlQsIEdSQVBIRU1FX0VYVFJfTUFYQllURVMsIG9yIEdSQVBIRU1FX0VYVFJfTUFYQ0hBUlMnKTsKfQoKaWYgKCFpc3NldCgkc1swXSkgfHwgMCA+ICRzaXplIHx8IDAgPiAkc3RhcnQpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgwID09PSAkc2l6ZSkgewpyZXR1cm4gJyc7Cn0KCiRuZXh0ID0gJHN0YXJ0OwoKJHMgPSBwcmVnX3NwbGl0KCcvKCcuU1lNRk9OWV9HUkFQSEVNRV9DTFVTVEVSX1JYLicpL3UnLCAiXHJcbiIuJHMsICRzaXplICsgMSwgXFBSRUdfU1BMSVRfTk9fRU1QVFkgfCBcUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFKTsKCmlmICghaXNzZXQoJHNbMV0pKSB7CnJldHVybiBmYWxzZTsKfQoKJGkgPSAxOwokcmV0ID0gJyc7CgpkbyB7CmlmIChcR1JBUEhFTUVfRVhUUl9DT1VOVCA9PT0gJHR5cGUpIHsKLS0kc2l6ZTsKfSBlbHNlaWYgKFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTID09PSAkdHlwZSkgewokc2l6ZSAtPSBcc3RybGVuKCRzWyRpXSk7Cn0gZWxzZSB7CiRzaXplIC09IGljb252X3N0cmxlbigkc1skaV0sICdVVEYtOC8vSUdOT1JFJyk7Cn0KCmlmICgkc2l6ZSA+PSAwKSB7CiRyZXQgLj0gJHNbJGldOwp9Cn0gd2hpbGUgKGlzc2V0KCRzWysrJGldKSAmJiAkc2l6ZSA+IDApOwoKJG5leHQgKz0gXHN0cmxlbigkcmV0KTsKCnJldHVybiAkcmV0Owp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cmxlbigkcykKewpwcmVnX3JlcGxhY2UoJy8nLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nL3UnLCAnJywgJHMsIC0xLCAkbGVuKTsKCnJldHVybiAwID09PSAkbGVuICYmICcnICE9PSAkcyA/IG51bGwgOiAkbGVuOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N1YnN0cigkcywgJHN0YXJ0LCAkbGVuID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGxlbikgewokbGVuID0gMjE0NzQ4MzY0NzsKfQoKcHJlZ19tYXRjaF9hbGwoJy8nLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nL3UnLCAkcywgJHMpOwoKJHNsZW4gPSBcY291bnQoJHNbMF0pOwokc3RhcnQgPSAoaW50KSAkc3RhcnQ7CgppZiAoMCA+ICRzdGFydCkgewokc3RhcnQgKz0gJHNsZW47Cn0KaWYgKDAgPiAkc3RhcnQpIHsKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CnJldHVybiBmYWxzZTsKfQoKJHN0YXJ0ID0gMDsKfQppZiAoJHN0YXJ0ID49ICRzbGVuKSB7CnJldHVybiBcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDAgPyAnJyA6IGZhbHNlOwp9CgokcmVtID0gJHNsZW4gLSAkc3RhcnQ7CgppZiAoMCA+ICRsZW4pIHsKJGxlbiArPSAkcmVtOwp9CmlmICgwID09PSAkbGVuKSB7CnJldHVybiAnJzsKfQppZiAoMCA+ICRsZW4pIHsKcmV0dXJuIFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCA/ICcnIDogZmFsc2U7Cn0KaWYgKCRsZW4gPiAkcmVtKSB7CiRsZW4gPSAkcmVtOwp9CgpyZXR1cm4gaW1wbG9kZSgnJywgXGFycmF5X3NsaWNlKCRzWzBdLCAkc3RhcnQsICRsZW4pKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJwb3MoJHMsICRuZWVkbGUsICRvZmZzZXQgPSAwKQp7CnJldHVybiBzZWxmOjpncmFwaGVtZV9wb3NpdGlvbigkcywgJG5lZWRsZSwgJG9mZnNldCwgMCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXBvcygkcywgJG5lZWRsZSwgJG9mZnNldCA9IDApCnsKcmV0dXJuIHNlbGY6OmdyYXBoZW1lX3Bvc2l0aW9uKCRzLCAkbmVlZGxlLCAkb2Zmc2V0LCAxKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBncmFwaGVtZV9zdHJycG9zKCRzLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKewpyZXR1cm4gc2VsZjo6Z3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsIDIpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cnJpcG9zKCRzLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkKewpyZXR1cm4gc2VsZjo6Z3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsIDMpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlzdHIoJHMsICRuZWVkbGUsICRiZWZvcmVOZWVkbGUgPSBmYWxzZSkKewpyZXR1cm4gbWJfc3RyaXN0cigkcywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSwgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3Ryc3RyKCRzLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpCnsKcmV0dXJuIG1iX3N0cnN0cigkcywgJG5lZWRsZSwgJGJlZm9yZU5lZWRsZSwgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyX3NwbGl0KCRzLCAkbGVuID0gMSkKewppZiAoMCA+ICRsZW4gfHwgMTA3Mzc0MTgyMyA8ICRsZW4pIHsKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdncmFwaGVtZV9zdHJfc3BsaXQoKTogQXJndW1lbnQgIzIgKCRsZW5ndGgpIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDczNzQxODIzLicpOwp9CgppZiAoJycgPT09ICRzKSB7CnJldHVybiBbXTsKfQoKaWYgKCFwcmVnX21hdGNoX2FsbCgnLygnLlNZTUZPTllfR1JBUEhFTUVfQ0xVU1RFUl9SWC4nKS91JywgJHMsICRtYXRjaGVzKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgxID09PSAkbGVuKSB7CnJldHVybiAkbWF0Y2hlc1swXTsKfQoKJGNodW5rcyA9IGFycmF5X2NodW5rKCRtYXRjaGVzWzBdLCAkbGVuKTsKCmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokY2h1bmsgPSBpbXBsb2RlKCcnLCAkY2h1bmspOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfcG9zaXRpb24oJHMsICRuZWVkbGUsICRvZmZzZXQsICRtb2RlKQp7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQgJiYgIXByZWdfbWF0Y2goJy8uL3VzJywgJG5lZWRsZSkpIHsKcmV0dXJuIGZhbHNlOwp9CiRzID0gKHN0cmluZykgJHM7CmlmICghcHJlZ19tYXRjaCgnLy4vdXMnLCAkcykpIHsKcmV0dXJuIGZhbHNlOwp9CmlmICgkb2Zmc2V0ID4gMCkgewokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgJG9mZnNldCk7Cn0gZWxzZWlmICgkb2Zmc2V0IDwgMCkgewppZiAoMiA+ICRtb2RlKSB7CiRvZmZzZXQgKz0gc2VsZjo6Z3JhcGhlbWVfc3RybGVuKCRzKTsKJHMgPSBzZWxmOjpncmFwaGVtZV9zdWJzdHIoJHMsICRvZmZzZXQpOwppZiAoMCA+ICRvZmZzZXQpIHsKJG9mZnNldCA9IDA7Cn0KfSBlbHNlaWYgKDAgPiAkb2Zmc2V0ICs9IHNlbGY6OmdyYXBoZW1lX3N0cmxlbigkbmVlZGxlKSkgewokcyA9IHNlbGY6OmdyYXBoZW1lX3N1YnN0cigkcywgMCwgJG9mZnNldCk7CiRvZmZzZXQgPSAwOwp9IGVsc2Ugewokb2Zmc2V0ID0gMDsKfQp9CgoKCgokY2FzZUluc2Vuc2l0aXZlID0gJG1vZGUgJiAxOwokcmV2ZXJzZSA9ICRtb2RlICYgMjsKaWYgKCRjYXNlSW5zZW5zaXRpdmUpIHsKCgoKJG1vZGUgPSBcZGVmaW5lZCgnTUJfQ0FTRV9GT0xEX1NJTVBMRScpID8gXE1CX0NBU0VfRk9MRF9TSU1QTEUgOiBcTUJfQ0FTRV9MT1dFUjsKJHMgPSBtYl9jb252ZXJ0X2Nhc2UoJHMsICRtb2RlLCAnVVRGLTgnKTsKJG5lZWRsZSA9IG1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCAkbW9kZSwgJ1VURi04Jyk7CgppZiAoIVxkZWZpbmVkKCdNQl9DQVNFX0ZPTERfU0lNUExFJykpIHsKJHMgPSBzdHJfcmVwbGFjZShzZWxmOjpDQVNFX0ZPTERbMF0sIHNlbGY6OkNBU0VfRk9MRFsxXSwgJHMpOwokbmVlZGxlID0gc3RyX3JlcGxhY2Uoc2VsZjo6Q0FTRV9GT0xEWzBdLCBzZWxmOjpDQVNFX0ZPTERbMV0sICRuZWVkbGUpOwp9Cn0KaWYgKCRyZXZlcnNlKSB7CiRuZWVkbGVQb3MgPSBzdHJycG9zKCRzLCAkbmVlZGxlKTsKfSBlbHNlIHsKJG5lZWRsZVBvcyA9IHN0cnBvcygkcywgJG5lZWRsZSk7Cn0KCnJldHVybiBmYWxzZSAhPT0gJG5lZWRsZVBvcyA/IHNlbGY6OmdyYXBoZW1lX3N0cmxlbihzdWJzdHIoJHMsIDAsICRuZWVkbGVQb3MpKSArICRvZmZzZXQgOiBmYWxzZTsKfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWUgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9DT1VOVCcpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9DT1VOVCcsIDApOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhCWVRFUycsIDEpOwp9CmlmICghZGVmaW5lZCgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycpKSB7CmRlZmluZSgnR1JBUEhFTUVfRVhUUl9NQVhDSEFSUycsIDIpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfZXh0cmFjdCcpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX2V4dHJhY3QoJGhheXN0YWNrLCAkc2l6ZSwgJHR5cGUgPSAwLCAkc3RhcnQgPSAwLCAmJG5leHQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9leHRyYWN0KCRoYXlzdGFjaywgJHNpemUsICR0eXBlLCAkc3RhcnQsICRuZXh0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJpcG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJsZW4nKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJsZW4oJGlucHV0KSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJsZW4oJGlucHV0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwKSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cnJwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDApIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlTmVlZGxlID0gZmFsc2UpIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnN0cigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVOZWVkbGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N1YnN0cicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N1YnN0cigkc3RyaW5nLCAkb2Zmc2V0LCAkbGVuZ3RoID0gbnVsbCkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3Vic3RyKCRzdHJpbmcsICRvZmZzZXQsICRsZW5ndGgpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cl9zcGxpdCcpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoID0gMSkgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RyX3NwbGl0KCRzdHJpbmcsICRsZW5ndGgpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcR3JhcGhlbWUgYXMgcDsKCmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJfc3BsaXQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoID0gMSk6IGFycmF5fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoKTsgfQp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnaW50bCcpKSB7CnJldHVybjsKfQoKaWYgKCFkZWZpbmVkKCdHUkFQSEVNRV9FWFRSX0NPVU5UJykpIHsKZGVmaW5lKCdHUkFQSEVNRV9FWFRSX0NPVU5UJywgMCk7Cn0KaWYgKCFkZWZpbmVkKCdHUkFQSEVNRV9FWFRSX01BWEJZVEVTJykpIHsKZGVmaW5lKCdHUkFQSEVNRV9FWFRSX01BWEJZVEVTJywgMSk7Cn0KaWYgKCFkZWZpbmVkKCdHUkFQSEVNRV9FWFRSX01BWENIQVJTJykpIHsKZGVmaW5lKCdHUkFQSEVNRV9FWFRSX01BWENIQVJTJywgMik7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9leHRyYWN0JykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfZXh0cmFjdCg/c3RyaW5nICRoYXlzdGFjaywgP2ludCAkc2l6ZSwgP2ludCAkdHlwZSA9IEdSQVBIRU1FX0VYVFJfQ09VTlQsID9pbnQgJG9mZnNldCA9IDAsICYkbmV4dCA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfZXh0cmFjdCgoc3RyaW5nKSAkaGF5c3RhY2ssIChpbnQpICRzaXplLCAoaW50KSAkdHlwZSwgKGludCkgJG9mZnNldCwgJG5leHQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDApOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RyaXBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmlzdHInKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJpc3RyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVOZWVkbGUgPSBmYWxzZSk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJpc3RyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVOZWVkbGUpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dyYXBoZW1lX3N0cmxlbicpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cmxlbig/c3RyaW5nICRzdHJpbmcpOiBpbnR8ZmFsc2V8bnVsbCB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJsZW4oKHN0cmluZykgJHN0cmluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RycG9zJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3RycG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDApOiBpbnR8ZmFsc2UgeyByZXR1cm4gcFxHcmFwaGVtZTo6Z3JhcGhlbWVfc3RycG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJyaXBvcyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/aW50ICRvZmZzZXQgPSAwKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N0cnJpcG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3RycnBvcycpKSB7CmZ1bmN0aW9uIGdyYXBoZW1lX3N0cnJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCk6IGludHxmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJycG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Ryc3RyJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Ryc3RyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVOZWVkbGUgPSBmYWxzZSk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXEdyYXBoZW1lOjpncmFwaGVtZV9zdHJzdHIoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoYm9vbCkgJGJlZm9yZU5lZWRsZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ3JhcGhlbWVfc3Vic3RyJykpIHsKZnVuY3Rpb24gZ3JhcGhlbWVfc3Vic3RyKD9zdHJpbmcgJHN0cmluZywgP2ludCAkb2Zmc2V0LCA/aW50ICRsZW5ndGggPSBudWxsKTogc3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcR3JhcGhlbWU6OmdyYXBoZW1lX3N1YnN0cigoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkb2Zmc2V0LCAkbGVuZ3RoKTsgfQp9CgpDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXEludGxcTm9ybWFsaXplcjsKCgoKCgoKCgoKCgpjbGFzcyBOb3JtYWxpemVyCnsKcHVibGljIGNvbnN0IEZPUk1fRCA9IFxOb3JtYWxpemVyOjpGT1JNX0Q7CnB1YmxpYyBjb25zdCBGT1JNX0tEID0gXE5vcm1hbGl6ZXI6OkZPUk1fS0Q7CnB1YmxpYyBjb25zdCBGT1JNX0MgPSBcTm9ybWFsaXplcjo6Rk9STV9DOwpwdWJsaWMgY29uc3QgRk9STV9LQyA9IFxOb3JtYWxpemVyOjpGT1JNX0tDOwpwdWJsaWMgY29uc3QgTkZEID0gXE5vcm1hbGl6ZXI6Ok5GRDsKcHVibGljIGNvbnN0IE5GS0QgPSBcTm9ybWFsaXplcjo6TkZLRDsKcHVibGljIGNvbnN0IE5GQyA9IFxOb3JtYWxpemVyOjpORkM7CnB1YmxpYyBjb25zdCBORktDID0gXE5vcm1hbGl6ZXI6Ok5GS0M7Cgpwcml2YXRlIHN0YXRpYyAkQzsKcHJpdmF0ZSBzdGF0aWMgJEQ7CnByaXZhdGUgc3RhdGljICRLRDsKcHJpdmF0ZSBzdGF0aWMgJGNDOwpwcml2YXRlIHN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwpwcml2YXRlIHN0YXRpYyAkQVNDSUkgPSAiXHgyMFx4NjVceDY5XHg2MVx4NzNceDZFXHg3NFx4NzJceDZGXHg2Q1x4NzVceDY0XHg1RFx4NUJceDYzXHg2RFx4NzBceDI3XHgwQVx4NjdceDdDXHg2OFx4NzZceDJFXHg2Nlx4NjJceDJDXHgzQVx4M0RceDJEXHg3MVx4MzFceDMwXHg0M1x4MzJceDJBXHg3OVx4NzhceDI5XHgyOFx4NENceDM5XHg0MVx4NTNceDJGXHg1MFx4MjJceDQ1XHg2QVx4NERceDQ5XHg2Qlx4MzNceDNFXHgzNVx4NTRceDNDXHg0NFx4MzRceDdEXHg0Mlx4N0JceDM4XHg0Nlx4NzdceDUyXHgzNlx4MzdceDU1XHg0N1x4NEVceDNCXHg0QVx4N0FceDU2XHgyM1x4NDhceDRGXHg1N1x4NUZceDI2XHgyMVx4NEJceDNGXHg1OFx4NTFceDI1XHg1OVx4NUNceDA5XHg1QVx4MkJceDdFXHg1RVx4MjRceDQwXHg2MFx4N0ZceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhceDBCXHgwQ1x4MERceDBFXHgwRlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFBXHgxQlx4MUNceDFEXHgxRVx4MUYiOwoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc05vcm1hbGl6ZWQoc3RyaW5nICRzLCBpbnQgJGZvcm0gPSBzZWxmOjpGT1JNX0MpCnsKaWYgKCFcaW5fYXJyYXkoJGZvcm0sIFtzZWxmOjpORkQsIHNlbGY6Ok5GS0QsIHNlbGY6Ok5GQywgc2VsZjo6TkZLQ10pKSB7CnJldHVybiBmYWxzZTsKfQppZiAoIWlzc2V0KCRzW3N0cnNwbigkcywgc2VsZjo6JEFTQ0lJKV0pKSB7CnJldHVybiB0cnVlOwp9CmlmIChzZWxmOjpORkMgPT0gJGZvcm0gJiYgcHJlZ19tYXRjaCgnLy91JywgJHMpICYmICFwcmVnX21hdGNoKCcvW15ceDAwLVx4ezJGRn1dL3UnLCAkcykpIHsKcmV0dXJuIHRydWU7Cn0KCnJldHVybiBzZWxmOjpub3JtYWxpemUoJHMsICRmb3JtKSA9PT0gJHM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbm9ybWFsaXplKHN0cmluZyAkcywgaW50ICRmb3JtID0gc2VsZjo6Rk9STV9DKQp7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHMpKSB7CnJldHVybiBmYWxzZTsKfQoKc3dpdGNoICgkZm9ybSkgewpjYXNlIHNlbGY6Ok5GQzogJEMgPSB0cnVlOyAkSyA9IGZhbHNlOyBicmVhazsKY2FzZSBzZWxmOjpORkQ6ICRDID0gZmFsc2U7ICRLID0gZmFsc2U7IGJyZWFrOwpjYXNlIHNlbGY6Ok5GS0M6ICRDID0gdHJ1ZTsgJEsgPSB0cnVlOyBicmVhazsKY2FzZSBzZWxmOjpORktEOiAkQyA9IGZhbHNlOyAkSyA9IHRydWU7IGJyZWFrOwpkZWZhdWx0OgppZiAoXGRlZmluZWQoJ05vcm1hbGl6ZXI6Ok5PTkUnKSAmJiBcTm9ybWFsaXplcjo6Tk9ORSA9PSAkZm9ybSkgewpyZXR1cm4gJHM7Cn0KCmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignbm9ybWFsaXplcl9ub3JtYWxpemUoKTogQXJndW1lbnQgIzIgKCRmb3JtKSBtdXN0IGJlIGEgYSB2YWxpZCBub3JtYWxpemF0aW9uIGZvcm0nKTsKfQoKaWYgKCcnID09PSAkcykgewpyZXR1cm4gJyc7Cn0KCmlmICgkSyAmJiBudWxsID09PSBzZWxmOjokS0QpIHsKc2VsZjo6JEtEID0gc2VsZjo6Z2V0RGF0YSgnY29tcGF0aWJpbGl0eURlY29tcG9zaXRpb24nKTsKfQoKaWYgKG51bGwgPT09IHNlbGY6OiREKSB7CnNlbGY6OiREID0gc2VsZjo6Z2V0RGF0YSgnY2Fub25pY2FsRGVjb21wb3NpdGlvbicpOwpzZWxmOjokY0MgPSBzZWxmOjpnZXREYXRhKCdjb21iaW5pbmdDbGFzcycpOwp9CgppZiAobnVsbCAhPT0gJG1iRW5jb2RpbmcgPSAoMiAgJiAoaW50KSBcaW5pX2dldCgnbWJzdHJpbmcuZnVuY19vdmVybG9hZCcpKSA/IG1iX2ludGVybmFsX2VuY29kaW5nKCkgOiBudWxsKSB7Cm1iX2ludGVybmFsX2VuY29kaW5nKCc4Yml0Jyk7Cn0KCiRyID0gc2VsZjo6ZGVjb21wb3NlKCRzLCAkSyk7CgppZiAoJEMpIHsKaWYgKG51bGwgPT09IHNlbGY6OiRDKSB7CnNlbGY6OiRDID0gc2VsZjo6Z2V0RGF0YSgnY2Fub25pY2FsQ29tcG9zaXRpb24nKTsKfQoKJHIgPSBzZWxmOjpyZWNvbXBvc2UoJHIpOwp9CmlmIChudWxsICE9PSAkbWJFbmNvZGluZykgewptYl9pbnRlcm5hbF9lbmNvZGluZygkbWJFbmNvZGluZyk7Cn0KCnJldHVybiAkcjsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gcmVjb21wb3NlKCRzKQp7CiRBU0NJSSA9IHNlbGY6OiRBU0NJSTsKJGNvbXBNYXAgPSBzZWxmOjokQzsKJGNvbWJDbGFzcyA9IHNlbGY6OiRjQzsKJHVsZW5NYXNrID0gc2VsZjo6JHVsZW5NYXNrOwoKJHJlc3VsdCA9ICR0YWlsID0gJyc7CgokaSA9ICRzWzBdIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1swXSAmICJceEYwIl07CiRsZW4gPSBcc3RybGVuKCRzKTsKCiRsYXN0VWNociA9IHN1YnN0cigkcywgMCwgJGkpOwokbGFzdFVjbHMgPSBpc3NldCgkY29tYkNsYXNzWyRsYXN0VWNocl0pID8gMjU2IDogMDsKCndoaWxlICgkaSA8ICRsZW4pIHsKaWYgKCRzWyRpXSA8ICJceDgwIikgewoKCmlmICgkdGFpbCkgewokbGFzdFVjaHIgLj0gJHRhaWw7CiR0YWlsID0gJyc7Cn0KCmlmICgkaiA9IHN0cnNwbigkcywgJEFTQ0lJLCAkaSArIDEpKSB7CiRsYXN0VWNociAuPSBzdWJzdHIoJHMsICRpLCAkaik7CiRpICs9ICRqOwp9CgokcmVzdWx0IC49ICRsYXN0VWNocjsKJGxhc3RVY2hyID0gJHNbJGldOwokbGFzdFVjbHMgPSAwOworKyRpOwpjb250aW51ZTsKfQoKJHVsZW4gPSAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CgppZiAoJGxhc3RVY2hyIDwgIlx4RTFceDg0XHg4MCIgfHwgIlx4RTFceDg0XHg5MiIgPCAkbGFzdFVjaHIKfHwgJHVjaHIgPCAiXHhFMVx4ODVceEExIiB8fCAiXHhFMVx4ODVceEI1IiA8ICR1Y2hyCnx8ICRsYXN0VWNscykgewoKCiR1Y2xzID0gJGNvbWJDbGFzc1skdWNocl0gPz8gMDsKCmlmIChpc3NldCgkY29tcE1hcFskbGFzdFVjaHIuJHVjaHJdKSAmJiAoISRsYXN0VWNscyB8fCAkbGFzdFVjbHMgPCAkdWNscykpIHsKJGxhc3RVY2hyID0gJGNvbXBNYXBbJGxhc3RVY2hyLiR1Y2hyXTsKfSBlbHNlaWYgKCRsYXN0VWNscyA9ICR1Y2xzKSB7CiR0YWlsIC49ICR1Y2hyOwp9IGVsc2UgewppZiAoJHRhaWwpIHsKJGxhc3RVY2hyIC49ICR0YWlsOwokdGFpbCA9ICcnOwp9CgokcmVzdWx0IC49ICRsYXN0VWNocjsKJGxhc3RVY2hyID0gJHVjaHI7Cn0KfSBlbHNlIHsKCgokTCA9IFxvcmQoJGxhc3RVY2hyWzJdKSAtIDB4ODA7CiRWID0gXG9yZCgkdWNoclsyXSkgLSAweEExOwokVCA9IDA7CgokdWNociA9IHN1YnN0cigkcywgJGkgKyAkdWxlbiwgMyk7CgppZiAoIlx4RTFceDg2XHhBNyIgPD0gJHVjaHIgJiYgJHVjaHIgPD0gIlx4RTFceDg3XHg4MiIpIHsKJFQgPSBcb3JkKCR1Y2hyWzJdKSAtIDB4QTc7CjAgPiAkVCAmJiAkVCArPSAweDQwOwokdWxlbiArPSAzOwp9CgokTCA9IDB4QUMwMCArICgkTCAqIDIxICsgJFYpICogMjggKyAkVDsKJGxhc3RVY2hyID0gXGNocigweEUwIHwgJEwgPj4gMTIpLlxjaHIoMHg4MCB8ICRMID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkTCAmIDB4M0YpOwp9CgokaSArPSAkdWxlbjsKfQoKcmV0dXJuICRyZXN1bHQuJGxhc3RVY2hyLiR0YWlsOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBkZWNvbXBvc2UoJHMsICRjKQp7CiRyZXN1bHQgPSAnJzsKCiRBU0NJSSA9IHNlbGY6OiRBU0NJSTsKJGRlY29tcE1hcCA9IHNlbGY6OiREOwokY29tYkNsYXNzID0gc2VsZjo6JGNDOwokdWxlbk1hc2sgPSBzZWxmOjokdWxlbk1hc2s7CmlmICgkYykgewokY29tcGF0TWFwID0gc2VsZjo6JEtEOwp9CgokYyA9IFtdOwokaSA9IDA7CiRsZW4gPSBcc3RybGVuKCRzKTsKCndoaWxlICgkaSA8ICRsZW4pIHsKaWYgKCRzWyRpXSA8ICJceDgwIikgewoKCmlmICgkYykgewprc29ydCgkYyk7CiRyZXN1bHQgLj0gaW1wbG9kZSgnJywgJGMpOwokYyA9IFtdOwp9CgokaiA9IDEgKyBzdHJzcG4oJHMsICRBU0NJSSwgJGkgKyAxKTsKJHJlc3VsdCAuPSBzdWJzdHIoJHMsICRpLCAkaik7CiRpICs9ICRqOwpjb250aW51ZTsKfQoKJHVsZW4gPSAkdWxlbk1hc2tbJHNbJGldICYgIlx4RjAiXTsKJHVjaHIgPSBzdWJzdHIoJHMsICRpLCAkdWxlbik7CiRpICs9ICR1bGVuOwoKaWYgKCR1Y2hyIDwgIlx4RUFceEIwXHg4MCIgfHwgIlx4RURceDlFXHhBMyIgPCAkdWNocikgewoKCmlmICgkdWNociAhPT0gJGogPSAkY29tcGF0TWFwWyR1Y2hyXSA/PyAoJGRlY29tcE1hcFskdWNocl0gPz8gJHVjaHIpKSB7CiR1Y2hyID0gJGo7CgokaiA9IFxzdHJsZW4oJHVjaHIpOwokdWxlbiA9ICR1Y2hyWzBdIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skdWNoclswXSAmICJceEYwIl07CgppZiAoJHVsZW4gIT0gJGopIHsKCgokaiAtPSAkdWxlbjsKJGkgLT0gJGo7CgppZiAoMCA+ICRpKSB7CiRzID0gc3RyX3JlcGVhdCgnICcsIC0kaSkuJHM7CiRsZW4gLT0gJGk7CiRpID0gMDsKfQoKd2hpbGUgKCRqLS0pIHsKJHNbJGkgKyAkal0gPSAkdWNoclskdWxlbiArICRqXTsKfQoKJHVjaHIgPSBzdWJzdHIoJHVjaHIsIDAsICR1bGVuKTsKfQp9CmlmIChpc3NldCgkY29tYkNsYXNzWyR1Y2hyXSkpIHsKCgppZiAoIWlzc2V0KCRjWyRjb21iQ2xhc3NbJHVjaHJdXSkpIHsKJGNbJGNvbWJDbGFzc1skdWNocl1dID0gJyc7Cn0KJGNbJGNvbWJDbGFzc1skdWNocl1dIC49ICR1Y2hyOwpjb250aW51ZTsKfQp9IGVsc2UgewoKCiR1Y2hyID0gdW5wYWNrKCdDKicsICR1Y2hyKTsKJGogPSAoKCR1Y2hyWzFdIC0gMjI0KSA8PCAxMikgKyAoKCR1Y2hyWzJdIC0gMTI4KSA8PCA2KSArICR1Y2hyWzNdIC0gMHhBQzgwOwoKJHVjaHIgPSAiXHhFMVx4ODQiLlxjaHIoMHg4MCArIChpbnQpICgkaiAvIDU4OCkpCi4iXHhFMVx4ODUiLlxjaHIoMHhBMSArIChpbnQpICgoJGogJSA1ODgpIC8gMjgpKTsKCmlmICgkaiAlPSAyOCkgewokdWNociAuPSAkaiA8IDI1Cj8gKCJceEUxXHg4NiIuXGNocigweEE3ICsgJGopKQo6ICgiXHhFMVx4ODciLlxjaHIoMHg2NyArICRqKSk7Cn0KfQppZiAoJGMpIHsKa3NvcnQoJGMpOwokcmVzdWx0IC49IGltcGxvZGUoJycsICRjKTsKJGMgPSBbXTsKfQoKJHJlc3VsdCAuPSAkdWNocjsKfQoKaWYgKCRjKSB7Cmtzb3J0KCRjKTsKJHJlc3VsdCAuPSBpbXBsb2RlKCcnLCAkYyk7Cn0KCnJldHVybiAkcmVzdWx0Owp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXREYXRhKCRmaWxlKQp7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9IF9fRElSX18uJy9SZXNvdXJjZXMvdW5pZGF0YS8nLiRmaWxlLicucGhwJykpIHsKcmV0dXJuIHJlcXVpcmUgJGZpbGU7Cn0KCnJldHVybiBmYWxzZTsKfQp9Cjw/cGhwCgpjbGFzcyBOb3JtYWxpemVyIGV4dGVuZHMgU3ltZm9ueVxQb2x5ZmlsbFxJbnRsXE5vcm1hbGl6ZXJcTm9ybWFsaXplcgp7CgoKCnB1YmxpYyBjb25zdCBOT05FID0gMjsKcHVibGljIGNvbnN0IEZPUk1fRCA9IDQ7CnB1YmxpYyBjb25zdCBGT1JNX0tEID0gODsKcHVibGljIGNvbnN0IEZPUk1fQyA9IDE2OwpwdWJsaWMgY29uc3QgRk9STV9LQyA9IDMyOwpwdWJsaWMgY29uc3QgTkZEID0gNDsKcHVibGljIGNvbnN0IE5GS0QgPSA4OwpwdWJsaWMgY29uc3QgTkZDID0gMTY7CnB1YmxpYyBjb25zdCBORktDID0gMzI7Cn0KPD9waHAKCnJldHVybiBhcnJheSAoCidBzIAnID0+ICfDgCcsCidBzIEnID0+ICfDgScsCidBzIInID0+ICfDgicsCidBzIMnID0+ICfDgycsCidBzIgnID0+ICfDhCcsCidBzIonID0+ICfDhScsCidDzKcnID0+ICfDhycsCidFzIAnID0+ICfDiCcsCidFzIEnID0+ICfDiScsCidFzIInID0+ICfDiicsCidFzIgnID0+ICfDiycsCidJzIAnID0+ICfDjCcsCidJzIEnID0+ICfDjScsCidJzIInID0+ICfDjicsCidJzIgnID0+ICfDjycsCidOzIMnID0+ICfDkScsCidPzIAnID0+ICfDkicsCidPzIEnID0+ICfDkycsCidPzIInID0+ICfDlCcsCidPzIMnID0+ICfDlScsCidPzIgnID0+ICfDlicsCidVzIAnID0+ICfDmScsCidVzIEnID0+ICfDmicsCidVzIInID0+ICfDmycsCidVzIgnID0+ICfDnCcsCidZzIEnID0+ICfDnScsCidhzIAnID0+ICfDoCcsCidhzIEnID0+ICfDoScsCidhzIInID0+ICfDoicsCidhzIMnID0+ICfDoycsCidhzIgnID0+ICfDpCcsCidhzIonID0+ICfDpScsCidjzKcnID0+ICfDpycsCidlzIAnID0+ICfDqCcsCidlzIEnID0+ICfDqScsCidlzIInID0+ICfDqicsCidlzIgnID0+ICfDqycsCidpzIAnID0+ICfDrCcsCidpzIEnID0+ICfDrScsCidpzIInID0+ICfDricsCidpzIgnID0+ICfDrycsCiduzIMnID0+ICfDsScsCidvzIAnID0+ICfDsicsCidvzIEnID0+ICfDsycsCidvzIInID0+ICfDtCcsCidvzIMnID0+ICfDtScsCidvzIgnID0+ICfDticsCid1zIAnID0+ICfDuScsCid1zIEnID0+ICfDuicsCid1zIInID0+ICfDuycsCid1zIgnID0+ICfDvCcsCid5zIEnID0+ICfDvScsCid5zIgnID0+ICfDvycsCidBzIQnID0+ICfEgCcsCidhzIQnID0+ICfEgScsCidBzIYnID0+ICfEgicsCidhzIYnID0+ICfEgycsCidBzKgnID0+ICfEhCcsCidhzKgnID0+ICfEhScsCidDzIEnID0+ICfEhicsCidjzIEnID0+ICfEhycsCidDzIInID0+ICfEiCcsCidjzIInID0+ICfEiScsCidDzIcnID0+ICfEiicsCidjzIcnID0+ICfEiycsCidDzIwnID0+ICfEjCcsCidjzIwnID0+ICfEjScsCidEzIwnID0+ICfEjicsCidkzIwnID0+ICfEjycsCidFzIQnID0+ICfEkicsCidlzIQnID0+ICfEkycsCidFzIYnID0+ICfElCcsCidlzIYnID0+ICfElScsCidFzIcnID0+ICfElicsCidlzIcnID0+ICfElycsCidFzKgnID0+ICfEmCcsCidlzKgnID0+ICfEmScsCidFzIwnID0+ICfEmicsCidlzIwnID0+ICfEmycsCidHzIInID0+ICfEnCcsCidnzIInID0+ICfEnScsCidHzIYnID0+ICfEnicsCidnzIYnID0+ICfEnycsCidHzIcnID0+ICfEoCcsCidnzIcnID0+ICfEoScsCidHzKcnID0+ICfEoicsCidnzKcnID0+ICfEoycsCidIzIInID0+ICfEpCcsCidozIInID0+ICfEpScsCidJzIMnID0+ICfEqCcsCidpzIMnID0+ICfEqScsCidJzIQnID0+ICfEqicsCidpzIQnID0+ICfEqycsCidJzIYnID0+ICfErCcsCidpzIYnID0+ICfErScsCidJzKgnID0+ICfEricsCidpzKgnID0+ICfErycsCidJzIcnID0+ICfEsCcsCidKzIInID0+ICfEtCcsCidqzIInID0+ICfEtScsCidLzKcnID0+ICfEticsCidrzKcnID0+ICfEtycsCidMzIEnID0+ICfEuScsCidszIEnID0+ICfEuicsCidMzKcnID0+ICfEuycsCidszKcnID0+ICfEvCcsCidMzIwnID0+ICfEvScsCidszIwnID0+ICfEvicsCidOzIEnID0+ICfFgycsCiduzIEnID0+ICfFhCcsCidOzKcnID0+ICfFhScsCiduzKcnID0+ICfFhicsCidOzIwnID0+ICfFhycsCiduzIwnID0+ICfFiCcsCidPzIQnID0+ICfFjCcsCidvzIQnID0+ICfFjScsCidPzIYnID0+ICfFjicsCidvzIYnID0+ICfFjycsCidPzIsnID0+ICfFkCcsCidvzIsnID0+ICfFkScsCidSzIEnID0+ICfFlCcsCidyzIEnID0+ICfFlScsCidSzKcnID0+ICfFlicsCidyzKcnID0+ICfFlycsCidSzIwnID0+ICfFmCcsCidyzIwnID0+ICfFmScsCidTzIEnID0+ICfFmicsCidzzIEnID0+ICfFmycsCidTzIInID0+ICfFnCcsCidzzIInID0+ICfFnScsCidTzKcnID0+ICfFnicsCidzzKcnID0+ICfFnycsCidTzIwnID0+ICfFoCcsCidzzIwnID0+ICfFoScsCidUzKcnID0+ICfFoicsCid0zKcnID0+ICfFoycsCidUzIwnID0+ICfFpCcsCid0zIwnID0+ICfFpScsCidVzIMnID0+ICfFqCcsCid1zIMnID0+ICfFqScsCidVzIQnID0+ICfFqicsCid1zIQnID0+ICfFqycsCidVzIYnID0+ICfFrCcsCid1zIYnID0+ICfFrScsCidVzIonID0+ICfFricsCid1zIonID0+ICfFrycsCidVzIsnID0+ICfFsCcsCid1zIsnID0+ICfFsScsCidVzKgnID0+ICfFsicsCid1zKgnID0+ICfFsycsCidXzIInID0+ICfFtCcsCid3zIInID0+ICfFtScsCidZzIInID0+ICfFticsCid5zIInID0+ICfFtycsCidZzIgnID0+ICfFuCcsCidazIEnID0+ICfFuScsCid6zIEnID0+ICfFuicsCidazIcnID0+ICfFuycsCid6zIcnID0+ICfFvCcsCidazIwnID0+ICfFvScsCid6zIwnID0+ICfFvicsCidPzJsnID0+ICfGoCcsCidvzJsnID0+ICfGoScsCidVzJsnID0+ICfGrycsCid1zJsnID0+ICfGsCcsCidBzIwnID0+ICfHjScsCidhzIwnID0+ICfHjicsCidJzIwnID0+ICfHjycsCidpzIwnID0+ICfHkCcsCidPzIwnID0+ICfHkScsCidvzIwnID0+ICfHkicsCidVzIwnID0+ICfHkycsCid1zIwnID0+ICfHlCcsCifDnMyEJyA9PiAnx5UnLAonw7zMhCcgPT4gJ8eWJywKJ8OczIEnID0+ICfHlycsCifDvMyBJyA9PiAnx5gnLAonw5zMjCcgPT4gJ8eZJywKJ8O8zIwnID0+ICfHmicsCifDnMyAJyA9PiAnx5snLAonw7zMgCcgPT4gJ8ecJywKJ8OEzIQnID0+ICfHnicsCifDpMyEJyA9PiAnx58nLAonyKbMhCcgPT4gJ8egJywKJ8inzIQnID0+ICfHoScsCifDhsyEJyA9PiAnx6InLAonw6bMhCcgPT4gJ8ejJywKJ0fMjCcgPT4gJ8emJywKJ2fMjCcgPT4gJ8enJywKJ0vMjCcgPT4gJ8eoJywKJ2vMjCcgPT4gJ8epJywKJ0/MqCcgPT4gJ8eqJywKJ2/MqCcgPT4gJ8erJywKJ8eqzIQnID0+ICfHrCcsCifHq8yEJyA9PiAnx60nLAonxrfMjCcgPT4gJ8euJywKJ8qSzIwnID0+ICfHrycsCidqzIwnID0+ICfHsCcsCidHzIEnID0+ICfHtCcsCidnzIEnID0+ICfHtScsCidOzIAnID0+ICfHuCcsCiduzIAnID0+ICfHuScsCifDhcyBJyA9PiAnx7onLAonw6XMgScgPT4gJ8e7JywKJ8OGzIEnID0+ICfHvCcsCifDpsyBJyA9PiAnx70nLAonw5jMgScgPT4gJ8e+JywKJ8O4zIEnID0+ICfHvycsCidBzI8nID0+ICfIgCcsCidhzI8nID0+ICfIgScsCidBzJEnID0+ICfIgicsCidhzJEnID0+ICfIgycsCidFzI8nID0+ICfIhCcsCidlzI8nID0+ICfIhScsCidFzJEnID0+ICfIhicsCidlzJEnID0+ICfIhycsCidJzI8nID0+ICfIiCcsCidpzI8nID0+ICfIiScsCidJzJEnID0+ICfIiicsCidpzJEnID0+ICfIiycsCidPzI8nID0+ICfIjCcsCidvzI8nID0+ICfIjScsCidPzJEnID0+ICfIjicsCidvzJEnID0+ICfIjycsCidSzI8nID0+ICfIkCcsCidyzI8nID0+ICfIkScsCidSzJEnID0+ICfIkicsCidyzJEnID0+ICfIkycsCidVzI8nID0+ICfIlCcsCid1zI8nID0+ICfIlScsCidVzJEnID0+ICfIlicsCid1zJEnID0+ICfIlycsCidTzKYnID0+ICfImCcsCidzzKYnID0+ICfImScsCidUzKYnID0+ICfImicsCid0zKYnID0+ICfImycsCidIzIwnID0+ICfInicsCidozIwnID0+ICfInycsCidBzIcnID0+ICfIpicsCidhzIcnID0+ICfIpycsCidFzKcnID0+ICfIqCcsCidlzKcnID0+ICfIqScsCifDlsyEJyA9PiAnyKonLAonw7bMhCcgPT4gJ8irJywKJ8OVzIQnID0+ICfIrCcsCifDtcyEJyA9PiAnyK0nLAonT8yHJyA9PiAnyK4nLAonb8yHJyA9PiAnyK8nLAonyK7MhCcgPT4gJ8iwJywKJ8ivzIQnID0+ICfIsScsCidZzIQnID0+ICfIsicsCid5zIQnID0+ICfIsycsCifCqMyBJyA9PiAnzoUnLAonzpHMgScgPT4gJ86GJywKJ86VzIEnID0+ICfOiCcsCifOl8yBJyA9PiAnzoknLAonzpnMgScgPT4gJ86KJywKJ86fzIEnID0+ICfOjCcsCifOpcyBJyA9PiAnzo4nLAonzqnMgScgPT4gJ86PJywKJ8+KzIEnID0+ICfOkCcsCifOmcyIJyA9PiAnzqonLAonzqXMiCcgPT4gJ86rJywKJ86xzIEnID0+ICfOrCcsCifOtcyBJyA9PiAnzq0nLAonzrfMgScgPT4gJ86uJywKJ865zIEnID0+ICfOrycsCifPi8yBJyA9PiAnzrAnLAonzrnMiCcgPT4gJ8+KJywKJ8+FzIgnID0+ICfPiycsCifOv8yBJyA9PiAnz4wnLAonz4XMgScgPT4gJ8+NJywKJ8+JzIEnID0+ICfPjicsCifPksyBJyA9PiAnz5MnLAonz5LMiCcgPT4gJ8+UJywKJ9CVzIAnID0+ICfQgCcsCifQlcyIJyA9PiAn0IEnLAon0JPMgScgPT4gJ9CDJywKJ9CGzIgnID0+ICfQhycsCifQmsyBJyA9PiAn0IwnLAon0JjMgCcgPT4gJ9CNJywKJ9CjzIYnID0+ICfQjicsCifQmMyGJyA9PiAn0JknLAon0LjMhicgPT4gJ9C5JywKJ9C1zIAnID0+ICfRkCcsCifQtcyIJyA9PiAn0ZEnLAon0LPMgScgPT4gJ9GTJywKJ9GWzIgnID0+ICfRlycsCifQusyBJyA9PiAn0ZwnLAon0LjMgCcgPT4gJ9GdJywKJ9GDzIYnID0+ICfRnicsCifRtMyPJyA9PiAn0bYnLAon0bXMjycgPT4gJ9G3JywKJ9CWzIYnID0+ICfTgScsCifQtsyGJyA9PiAn04InLAon0JDMhicgPT4gJ9OQJywKJ9CwzIYnID0+ICfTkScsCifQkMyIJyA9PiAn05InLAon0LDMiCcgPT4gJ9OTJywKJ9CVzIYnID0+ICfTlicsCifQtcyGJyA9PiAn05cnLAon05jMiCcgPT4gJ9OaJywKJ9OZzIgnID0+ICfTmycsCifQlsyIJyA9PiAn05wnLAon0LbMiCcgPT4gJ9OdJywKJ9CXzIgnID0+ICfTnicsCifQt8yIJyA9PiAn058nLAon0JjMhCcgPT4gJ9OiJywKJ9C4zIQnID0+ICfToycsCifQmMyIJyA9PiAn06QnLAon0LjMiCcgPT4gJ9OlJywKJ9CezIgnID0+ICfTpicsCifQvsyIJyA9PiAn06cnLAon06jMiCcgPT4gJ9OqJywKJ9OpzIgnID0+ICfTqycsCifQrcyIJyA9PiAn06wnLAon0Y3MiCcgPT4gJ9OtJywKJ9CjzIQnID0+ICfTricsCifRg8yEJyA9PiAn068nLAon0KPMiCcgPT4gJ9OwJywKJ9GDzIgnID0+ICfTsScsCifQo8yLJyA9PiAn07InLAon0YPMiycgPT4gJ9OzJywKJ9CnzIgnID0+ICfTtCcsCifRh8yIJyA9PiAn07UnLAon0KvMiCcgPT4gJ9O4JywKJ9GLzIgnID0+ICfTuScsCifYp9mTJyA9PiAn2KInLAon2KfZlCcgPT4gJ9ijJywKJ9mI2ZQnID0+ICfYpCcsCifYp9mVJyA9PiAn2KUnLAon2YrZlCcgPT4gJ9imJywKJ9uV2ZQnID0+ICfbgCcsCifbgdmUJyA9PiAn24InLAon25LZlCcgPT4gJ9uTJywKJ+CkqOCkvCcgPT4gJ+CkqScsCifgpLDgpLwnID0+ICfgpLEnLAon4KSz4KS8JyA9PiAn4KS0JywKJ+Cnh+CmvicgPT4gJ+CniycsCifgp4fgp5cnID0+ICfgp4wnLAon4K2H4K2WJyA9PiAn4K2IJywKJ+Cth+CsvicgPT4gJ+CtiycsCifgrYfgrZcnID0+ICfgrYwnLAon4K6S4K+XJyA9PiAn4K6UJywKJ+CvhuCuvicgPT4gJ+CviicsCifgr4fgrr4nID0+ICfgr4snLAon4K+G4K+XJyA9PiAn4K+MJywKJ+CxhuCxlicgPT4gJ+CxiCcsCifgsr/gs5UnID0+ICfgs4AnLAon4LOG4LOVJyA9PiAn4LOHJywKJ+CzhuCzlicgPT4gJ+CziCcsCifgs4bgs4InID0+ICfgs4onLAon4LOK4LOVJyA9PiAn4LOLJywKJ+C1huC0vicgPT4gJ+C1iicsCifgtYfgtL4nID0+ICfgtYsnLAon4LWG4LWXJyA9PiAn4LWMJywKJ+C3meC3iicgPT4gJ+C3micsCifgt5ngt48nID0+ICfgt5wnLAon4Lec4LeKJyA9PiAn4LedJywKJ+C3meC3nycgPT4gJ+C3nicsCifhgKXhgK4nID0+ICfhgKYnLAon4ayF4ay1JyA9PiAn4ayGJywKJ+Gsh+GstScgPT4gJ+GsiCcsCifhrInhrLUnID0+ICfhrIonLAon4ayL4ay1JyA9PiAn4ayMJywKJ+GsjeGstScgPT4gJ+GsjicsCifhrJHhrLUnID0+ICfhrJInLAon4ay64ay1JyA9PiAn4ay7JywKJ+GsvOGstScgPT4gJ+GsvScsCifhrL7hrLUnID0+ICfhrYAnLAon4ay/4ay1JyA9PiAn4a2BJywKJ+GtguGstScgPT4gJ+GtgycsCidBzKUnID0+ICfhuIAnLAonYcylJyA9PiAn4biBJywKJ0LMhycgPT4gJ+G4gicsCidizIcnID0+ICfhuIMnLAonQsyjJyA9PiAn4biEJywKJ2LMoycgPT4gJ+G4hScsCidCzLEnID0+ICfhuIYnLAonYsyxJyA9PiAn4biHJywKJ8OHzIEnID0+ICfhuIgnLAonw6fMgScgPT4gJ+G4iScsCidEzIcnID0+ICfhuIonLAonZMyHJyA9PiAn4biLJywKJ0TMoycgPT4gJ+G4jCcsCidkzKMnID0+ICfhuI0nLAonRMyxJyA9PiAn4biOJywKJ2TMsScgPT4gJ+G4jycsCidEzKcnID0+ICfhuJAnLAonZMynJyA9PiAn4biRJywKJ0TMrScgPT4gJ+G4kicsCidkzK0nID0+ICfhuJMnLAonxJLMgCcgPT4gJ+G4lCcsCifEk8yAJyA9PiAn4biVJywKJ8SSzIEnID0+ICfhuJYnLAonxJPMgScgPT4gJ+G4lycsCidFzK0nID0+ICfhuJgnLAonZcytJyA9PiAn4biZJywKJ0XMsCcgPT4gJ+G4micsCidlzLAnID0+ICfhuJsnLAonyKjMhicgPT4gJ+G4nCcsCifIqcyGJyA9PiAn4bidJywKJ0bMhycgPT4gJ+G4nicsCidmzIcnID0+ICfhuJ8nLAonR8yEJyA9PiAn4bigJywKJ2fMhCcgPT4gJ+G4oScsCidIzIcnID0+ICfhuKInLAonaMyHJyA9PiAn4bijJywKJ0jMoycgPT4gJ+G4pCcsCidozKMnID0+ICfhuKUnLAonSMyIJyA9PiAn4bimJywKJ2jMiCcgPT4gJ+G4pycsCidIzKcnID0+ICfhuKgnLAonaMynJyA9PiAn4bipJywKJ0jMricgPT4gJ+G4qicsCidozK4nID0+ICfhuKsnLAonScywJyA9PiAn4bisJywKJ2nMsCcgPT4gJ+G4rScsCifDj8yBJyA9PiAn4biuJywKJ8OvzIEnID0+ICfhuK8nLAonS8yBJyA9PiAn4biwJywKJ2vMgScgPT4gJ+G4sScsCidLzKMnID0+ICfhuLInLAona8yjJyA9PiAn4bizJywKJ0vMsScgPT4gJ+G4tCcsCidrzLEnID0+ICfhuLUnLAonTMyjJyA9PiAn4bi2JywKJ2zMoycgPT4gJ+G4tycsCifhuLbMhCcgPT4gJ+G4uCcsCifhuLfMhCcgPT4gJ+G4uScsCidMzLEnID0+ICfhuLonLAonbMyxJyA9PiAn4bi7JywKJ0zMrScgPT4gJ+G4vCcsCidszK0nID0+ICfhuL0nLAonTcyBJyA9PiAn4bi+JywKJ23MgScgPT4gJ+G4vycsCidNzIcnID0+ICfhuYAnLAonbcyHJyA9PiAn4bmBJywKJ03MoycgPT4gJ+G5gicsCidtzKMnID0+ICfhuYMnLAonTsyHJyA9PiAn4bmEJywKJ27MhycgPT4gJ+G5hScsCidOzKMnID0+ICfhuYYnLAonbsyjJyA9PiAn4bmHJywKJ07MsScgPT4gJ+G5iCcsCiduzLEnID0+ICfhuYknLAonTsytJyA9PiAn4bmKJywKJ27MrScgPT4gJ+G5iycsCifDlcyBJyA9PiAn4bmMJywKJ8O1zIEnID0+ICfhuY0nLAonw5XMiCcgPT4gJ+G5jicsCifDtcyIJyA9PiAn4bmPJywKJ8WMzIAnID0+ICfhuZAnLAonxY3MgCcgPT4gJ+G5kScsCifFjMyBJyA9PiAn4bmSJywKJ8WNzIEnID0+ICfhuZMnLAonUMyBJyA9PiAn4bmUJywKJ3DMgScgPT4gJ+G5lScsCidQzIcnID0+ICfhuZYnLAoncMyHJyA9PiAn4bmXJywKJ1LMhycgPT4gJ+G5mCcsCidyzIcnID0+ICfhuZknLAonUsyjJyA9PiAn4bmaJywKJ3LMoycgPT4gJ+G5mycsCifhuZrMhCcgPT4gJ+G5nCcsCifhuZvMhCcgPT4gJ+G5nScsCidSzLEnID0+ICfhuZ4nLAoncsyxJyA9PiAn4bmfJywKJ1PMhycgPT4gJ+G5oCcsCidzzIcnID0+ICfhuaEnLAonU8yjJyA9PiAn4bmiJywKJ3PMoycgPT4gJ+G5oycsCifFmsyHJyA9PiAn4bmkJywKJ8WbzIcnID0+ICfhuaUnLAonxaDMhycgPT4gJ+G5picsCifFocyHJyA9PiAn4bmnJywKJ+G5osyHJyA9PiAn4bmoJywKJ+G5o8yHJyA9PiAn4bmpJywKJ1TMhycgPT4gJ+G5qicsCid0zIcnID0+ICfhuasnLAonVMyjJyA9PiAn4bmsJywKJ3TMoycgPT4gJ+G5rScsCidUzLEnID0+ICfhua4nLAondMyxJyA9PiAn4bmvJywKJ1TMrScgPT4gJ+G5sCcsCid0zK0nID0+ICfhubEnLAonVcykJyA9PiAn4bmyJywKJ3XMpCcgPT4gJ+G5sycsCidVzLAnID0+ICfhubQnLAondcywJyA9PiAn4bm1JywKJ1XMrScgPT4gJ+G5ticsCid1zK0nID0+ICfhubcnLAonxajMgScgPT4gJ+G5uCcsCifFqcyBJyA9PiAn4bm5JywKJ8WqzIgnID0+ICfhubonLAonxavMiCcgPT4gJ+G5uycsCidWzIMnID0+ICfhubwnLAondsyDJyA9PiAn4bm9JywKJ1bMoycgPT4gJ+G5vicsCid2zKMnID0+ICfhub8nLAonV8yAJyA9PiAn4bqAJywKJ3fMgCcgPT4gJ+G6gScsCidXzIEnID0+ICfhuoInLAond8yBJyA9PiAn4bqDJywKJ1fMiCcgPT4gJ+G6hCcsCid3zIgnID0+ICfhuoUnLAonV8yHJyA9PiAn4bqGJywKJ3fMhycgPT4gJ+G6hycsCidXzKMnID0+ICfhuognLAond8yjJyA9PiAn4bqJJywKJ1jMhycgPT4gJ+G6iicsCid4zIcnID0+ICfhuosnLAonWMyIJyA9PiAn4bqMJywKJ3jMiCcgPT4gJ+G6jScsCidZzIcnID0+ICfhuo4nLAonecyHJyA9PiAn4bqPJywKJ1rMgicgPT4gJ+G6kCcsCid6zIInID0+ICfhupEnLAonWsyjJyA9PiAn4bqSJywKJ3rMoycgPT4gJ+G6kycsCidazLEnID0+ICfhupQnLAonesyxJyA9PiAn4bqVJywKJ2jMsScgPT4gJ+G6licsCid0zIgnID0+ICfhupcnLAond8yKJyA9PiAn4bqYJywKJ3nMiicgPT4gJ+G6mScsCifFv8yHJyA9PiAn4bqbJywKJ0HMoycgPT4gJ+G6oCcsCidhzKMnID0+ICfhuqEnLAonQcyJJyA9PiAn4bqiJywKJ2HMiScgPT4gJ+G6oycsCifDgsyBJyA9PiAn4bqkJywKJ8OizIEnID0+ICfhuqUnLAonw4LMgCcgPT4gJ+G6picsCifDosyAJyA9PiAn4bqnJywKJ8OCzIknID0+ICfhuqgnLAonw6LMiScgPT4gJ+G6qScsCifDgsyDJyA9PiAn4bqqJywKJ8OizIMnID0+ICfhuqsnLAon4bqgzIInID0+ICfhuqwnLAon4bqhzIInID0+ICfhuq0nLAonxILMgScgPT4gJ+G6ricsCifEg8yBJyA9PiAn4bqvJywKJ8SCzIAnID0+ICfhurAnLAonxIPMgCcgPT4gJ+G6sScsCifEgsyJJyA9PiAn4bqyJywKJ8SDzIknID0+ICfhurMnLAonxILMgycgPT4gJ+G6tCcsCifEg8yDJyA9PiAn4bq1JywKJ+G6oMyGJyA9PiAn4bq2JywKJ+G6ocyGJyA9PiAn4bq3JywKJ0XMoycgPT4gJ+G6uCcsCidlzKMnID0+ICfhurknLAonRcyJJyA9PiAn4bq6JywKJ2XMiScgPT4gJ+G6uycsCidFzIMnID0+ICfhurwnLAonZcyDJyA9PiAn4bq9JywKJ8OKzIEnID0+ICfhur4nLAonw6rMgScgPT4gJ+G6vycsCifDisyAJyA9PiAn4buAJywKJ8OqzIAnID0+ICfhu4EnLAonw4rMiScgPT4gJ+G7gicsCifDqsyJJyA9PiAn4buDJywKJ8OKzIMnID0+ICfhu4QnLAonw6rMgycgPT4gJ+G7hScsCifhurjMgicgPT4gJ+G7hicsCifhurnMgicgPT4gJ+G7hycsCidJzIknID0+ICfhu4gnLAonacyJJyA9PiAn4buJJywKJ0nMoycgPT4gJ+G7iicsCidpzKMnID0+ICfhu4snLAonT8yjJyA9PiAn4buMJywKJ2/MoycgPT4gJ+G7jScsCidPzIknID0+ICfhu44nLAonb8yJJyA9PiAn4buPJywKJ8OUzIEnID0+ICfhu5AnLAonw7TMgScgPT4gJ+G7kScsCifDlMyAJyA9PiAn4buSJywKJ8O0zIAnID0+ICfhu5MnLAonw5TMiScgPT4gJ+G7lCcsCifDtMyJJyA9PiAn4buVJywKJ8OUzIMnID0+ICfhu5YnLAonw7TMgycgPT4gJ+G7lycsCifhu4zMgicgPT4gJ+G7mCcsCifhu43MgicgPT4gJ+G7mScsCifGoMyBJyA9PiAn4buaJywKJ8ahzIEnID0+ICfhu5snLAonxqDMgCcgPT4gJ+G7nCcsCifGocyAJyA9PiAn4budJywKJ8agzIknID0+ICfhu54nLAonxqHMiScgPT4gJ+G7nycsCifGoMyDJyA9PiAn4bugJywKJ8ahzIMnID0+ICfhu6EnLAonxqDMoycgPT4gJ+G7oicsCifGocyjJyA9PiAn4bujJywKJ1XMoycgPT4gJ+G7pCcsCid1zKMnID0+ICfhu6UnLAonVcyJJyA9PiAn4bumJywKJ3XMiScgPT4gJ+G7pycsCifGr8yBJyA9PiAn4buoJywKJ8awzIEnID0+ICfhu6knLAonxq/MgCcgPT4gJ+G7qicsCifGsMyAJyA9PiAn4burJywKJ8avzIknID0+ICfhu6wnLAonxrDMiScgPT4gJ+G7rScsCifGr8yDJyA9PiAn4buuJywKJ8awzIMnID0+ICfhu68nLAonxq/MoycgPT4gJ+G7sCcsCifGsMyjJyA9PiAn4buxJywKJ1nMgCcgPT4gJ+G7sicsCid5zIAnID0+ICfhu7MnLAonWcyjJyA9PiAn4bu0JywKJ3nMoycgPT4gJ+G7tScsCidZzIknID0+ICfhu7YnLAonecyJJyA9PiAn4bu3JywKJ1nMgycgPT4gJ+G7uCcsCid5zIMnID0+ICfhu7knLAonzrHMkycgPT4gJ+G8gCcsCifOscyUJyA9PiAn4byBJywKJ+G8gMyAJyA9PiAn4byCJywKJ+G8gcyAJyA9PiAn4byDJywKJ+G8gMyBJyA9PiAn4byEJywKJ+G8gcyBJyA9PiAn4byFJywKJ+G8gM2CJyA9PiAn4byGJywKJ+G8gc2CJyA9PiAn4byHJywKJ86RzJMnID0+ICfhvIgnLAonzpHMlCcgPT4gJ+G8iScsCifhvIjMgCcgPT4gJ+G8iicsCifhvInMgCcgPT4gJ+G8iycsCifhvIjMgScgPT4gJ+G8jCcsCifhvInMgScgPT4gJ+G8jScsCifhvIjNgicgPT4gJ+G8jicsCifhvInNgicgPT4gJ+G8jycsCifOtcyTJyA9PiAn4byQJywKJ861zJQnID0+ICfhvJEnLAon4byQzIAnID0+ICfhvJInLAon4byRzIAnID0+ICfhvJMnLAon4byQzIEnID0+ICfhvJQnLAon4byRzIEnID0+ICfhvJUnLAonzpXMkycgPT4gJ+G8mCcsCifOlcyUJyA9PiAn4byZJywKJ+G8mMyAJyA9PiAn4byaJywKJ+G8mcyAJyA9PiAn4bybJywKJ+G8mMyBJyA9PiAn4bycJywKJ+G8mcyBJyA9PiAn4bydJywKJ863zJMnID0+ICfhvKAnLAonzrfMlCcgPT4gJ+G8oScsCifhvKDMgCcgPT4gJ+G8oicsCifhvKHMgCcgPT4gJ+G8oycsCifhvKDMgScgPT4gJ+G8pCcsCifhvKHMgScgPT4gJ+G8pScsCifhvKDNgicgPT4gJ+G8picsCifhvKHNgicgPT4gJ+G8pycsCifOl8yTJyA9PiAn4byoJywKJ86XzJQnID0+ICfhvKknLAon4byozIAnID0+ICfhvKonLAon4bypzIAnID0+ICfhvKsnLAon4byozIEnID0+ICfhvKwnLAon4bypzIEnID0+ICfhvK0nLAon4byozYInID0+ICfhvK4nLAon4bypzYInID0+ICfhvK8nLAonzrnMkycgPT4gJ+G8sCcsCifOucyUJyA9PiAn4byxJywKJ+G8sMyAJyA9PiAn4byyJywKJ+G8scyAJyA9PiAn4byzJywKJ+G8sMyBJyA9PiAn4by0JywKJ+G8scyBJyA9PiAn4by1JywKJ+G8sM2CJyA9PiAn4by2JywKJ+G8sc2CJyA9PiAn4by3JywKJ86ZzJMnID0+ICfhvLgnLAonzpnMlCcgPT4gJ+G8uScsCifhvLjMgCcgPT4gJ+G8uicsCifhvLnMgCcgPT4gJ+G8uycsCifhvLjMgScgPT4gJ+G8vCcsCifhvLnMgScgPT4gJ+G8vScsCifhvLjNgicgPT4gJ+G8vicsCifhvLnNgicgPT4gJ+G8vycsCifOv8yTJyA9PiAn4b2AJywKJ86/zJQnID0+ICfhvYEnLAon4b2AzIAnID0+ICfhvYInLAon4b2BzIAnID0+ICfhvYMnLAon4b2AzIEnID0+ICfhvYQnLAon4b2BzIEnID0+ICfhvYUnLAonzp/MkycgPT4gJ+G9iCcsCifOn8yUJyA9PiAn4b2JJywKJ+G9iMyAJyA9PiAn4b2KJywKJ+G9icyAJyA9PiAn4b2LJywKJ+G9iMyBJyA9PiAn4b2MJywKJ+G9icyBJyA9PiAn4b2NJywKJ8+FzJMnID0+ICfhvZAnLAonz4XMlCcgPT4gJ+G9kScsCifhvZDMgCcgPT4gJ+G9kicsCifhvZHMgCcgPT4gJ+G9kycsCifhvZDMgScgPT4gJ+G9lCcsCifhvZHMgScgPT4gJ+G9lScsCifhvZDNgicgPT4gJ+G9licsCifhvZHNgicgPT4gJ+G9lycsCifOpcyUJyA9PiAn4b2ZJywKJ+G9mcyAJyA9PiAn4b2bJywKJ+G9mcyBJyA9PiAn4b2dJywKJ+G9mc2CJyA9PiAn4b2fJywKJ8+JzJMnID0+ICfhvaAnLAonz4nMlCcgPT4gJ+G9oScsCifhvaDMgCcgPT4gJ+G9oicsCifhvaHMgCcgPT4gJ+G9oycsCifhvaDMgScgPT4gJ+G9pCcsCifhvaHMgScgPT4gJ+G9pScsCifhvaDNgicgPT4gJ+G9picsCifhvaHNgicgPT4gJ+G9pycsCifOqcyTJyA9PiAn4b2oJywKJ86pzJQnID0+ICfhvaknLAon4b2ozIAnID0+ICfhvaonLAon4b2pzIAnID0+ICfhvasnLAon4b2ozIEnID0+ICfhvawnLAon4b2pzIEnID0+ICfhva0nLAon4b2ozYInID0+ICfhva4nLAon4b2pzYInID0+ICfhva8nLAonzrHMgCcgPT4gJ+G9sCcsCifOtcyAJyA9PiAn4b2yJywKJ863zIAnID0+ICfhvbQnLAonzrnMgCcgPT4gJ+G9ticsCifOv8yAJyA9PiAn4b24JywKJ8+FzIAnID0+ICfhvbonLAonz4nMgCcgPT4gJ+G9vCcsCifhvIDNhScgPT4gJ+G+gCcsCifhvIHNhScgPT4gJ+G+gScsCifhvILNhScgPT4gJ+G+gicsCifhvIPNhScgPT4gJ+G+gycsCifhvITNhScgPT4gJ+G+hCcsCifhvIXNhScgPT4gJ+G+hScsCifhvIbNhScgPT4gJ+G+hicsCifhvIfNhScgPT4gJ+G+hycsCifhvIjNhScgPT4gJ+G+iCcsCifhvInNhScgPT4gJ+G+iScsCifhvIrNhScgPT4gJ+G+iicsCifhvIvNhScgPT4gJ+G+iycsCifhvIzNhScgPT4gJ+G+jCcsCifhvI3NhScgPT4gJ+G+jScsCifhvI7NhScgPT4gJ+G+jicsCifhvI/NhScgPT4gJ+G+jycsCifhvKDNhScgPT4gJ+G+kCcsCifhvKHNhScgPT4gJ+G+kScsCifhvKLNhScgPT4gJ+G+kicsCifhvKPNhScgPT4gJ+G+kycsCifhvKTNhScgPT4gJ+G+lCcsCifhvKXNhScgPT4gJ+G+lScsCifhvKbNhScgPT4gJ+G+licsCifhvKfNhScgPT4gJ+G+lycsCifhvKjNhScgPT4gJ+G+mCcsCifhvKnNhScgPT4gJ+G+mScsCifhvKrNhScgPT4gJ+G+micsCifhvKvNhScgPT4gJ+G+mycsCifhvKzNhScgPT4gJ+G+nCcsCifhvK3NhScgPT4gJ+G+nScsCifhvK7NhScgPT4gJ+G+nicsCifhvK/NhScgPT4gJ+G+nycsCifhvaDNhScgPT4gJ+G+oCcsCifhvaHNhScgPT4gJ+G+oScsCifhvaLNhScgPT4gJ+G+oicsCifhvaPNhScgPT4gJ+G+oycsCifhvaTNhScgPT4gJ+G+pCcsCifhvaXNhScgPT4gJ+G+pScsCifhvabNhScgPT4gJ+G+picsCifhvafNhScgPT4gJ+G+pycsCifhvajNhScgPT4gJ+G+qCcsCifhvanNhScgPT4gJ+G+qScsCifhvarNhScgPT4gJ+G+qicsCifhvavNhScgPT4gJ+G+qycsCifhvazNhScgPT4gJ+G+rCcsCifhva3NhScgPT4gJ+G+rScsCifhva7NhScgPT4gJ+G+ricsCifhva/NhScgPT4gJ+G+rycsCifOscyGJyA9PiAn4b6wJywKJ86xzIQnID0+ICfhvrEnLAon4b2wzYUnID0+ICfhvrInLAonzrHNhScgPT4gJ+G+sycsCifOrM2FJyA9PiAn4b60JywKJ86xzYInID0+ICfhvrYnLAon4b62zYUnID0+ICfhvrcnLAonzpHMhicgPT4gJ+G+uCcsCifOkcyEJyA9PiAn4b65JywKJ86RzIAnID0+ICfhvronLAonzpHNhScgPT4gJ+G+vCcsCifCqM2CJyA9PiAn4b+BJywKJ+G9tM2FJyA9PiAn4b+CJywKJ863zYUnID0+ICfhv4MnLAonzq7NhScgPT4gJ+G/hCcsCifOt82CJyA9PiAn4b+GJywKJ+G/hs2FJyA9PiAn4b+HJywKJ86VzIAnID0+ICfhv4gnLAonzpfMgCcgPT4gJ+G/iicsCifOl82FJyA9PiAn4b+MJywKJ+G+v8yAJyA9PiAn4b+NJywKJ+G+v8yBJyA9PiAn4b+OJywKJ+G+v82CJyA9PiAn4b+PJywKJ865zIYnID0+ICfhv5AnLAonzrnMhCcgPT4gJ+G/kScsCifPisyAJyA9PiAn4b+SJywKJ865zYInID0+ICfhv5YnLAonz4rNgicgPT4gJ+G/lycsCifOmcyGJyA9PiAn4b+YJywKJ86ZzIQnID0+ICfhv5knLAonzpnMgCcgPT4gJ+G/micsCifhv77MgCcgPT4gJ+G/nScsCifhv77MgScgPT4gJ+G/nicsCifhv77NgicgPT4gJ+G/nycsCifPhcyGJyA9PiAn4b+gJywKJ8+FzIQnID0+ICfhv6EnLAonz4vMgCcgPT4gJ+G/oicsCifPgcyTJyA9PiAn4b+kJywKJ8+BzJQnID0+ICfhv6UnLAonz4XNgicgPT4gJ+G/picsCifPi82CJyA9PiAn4b+nJywKJ86lzIYnID0+ICfhv6gnLAonzqXMhCcgPT4gJ+G/qScsCifOpcyAJyA9PiAn4b+qJywKJ86hzJQnID0+ICfhv6wnLAonwqjMgCcgPT4gJ+G/rScsCifhvbzNhScgPT4gJ+G/sicsCifPic2FJyA9PiAn4b+zJywKJ8+OzYUnID0+ICfhv7QnLAonz4nNgicgPT4gJ+G/ticsCifhv7bNhScgPT4gJ+G/tycsCifOn8yAJyA9PiAn4b+4JywKJ86pzIAnID0+ICfhv7onLAonzqnNhScgPT4gJ+G/vCcsCifihpDMuCcgPT4gJ+KGmicsCifihpLMuCcgPT4gJ+KGmycsCifihpTMuCcgPT4gJ+KGricsCifih5DMuCcgPT4gJ+KHjScsCifih5TMuCcgPT4gJ+KHjicsCifih5LMuCcgPT4gJ+KHjycsCifiiIPMuCcgPT4gJ+KIhCcsCifiiIjMuCcgPT4gJ+KIiScsCifiiIvMuCcgPT4gJ+KIjCcsCifiiKPMuCcgPT4gJ+KIpCcsCifiiKXMuCcgPT4gJ+KIpicsCifiiLzMuCcgPT4gJ+KJgScsCifiiYPMuCcgPT4gJ+KJhCcsCifiiYXMuCcgPT4gJ+KJhycsCifiiYjMuCcgPT4gJ+KJiScsCic9zLgnID0+ICfiiaAnLAon4omhzLgnID0+ICfiiaInLAon4omNzLgnID0+ICfiia0nLAonPMy4JyA9PiAn4omuJywKJz7MuCcgPT4gJ+KJrycsCifiiaTMuCcgPT4gJ+KJsCcsCifiiaXMuCcgPT4gJ+KJsScsCifiibLMuCcgPT4gJ+KJtCcsCifiibPMuCcgPT4gJ+KJtScsCifiibbMuCcgPT4gJ+KJuCcsCifiibfMuCcgPT4gJ+KJuScsCifiibrMuCcgPT4gJ+KKgCcsCifiibvMuCcgPT4gJ+KKgScsCifiioLMuCcgPT4gJ+KKhCcsCifiioPMuCcgPT4gJ+KKhScsCifiiobMuCcgPT4gJ+KKiCcsCifiiofMuCcgPT4gJ+KKiScsCifiiqLMuCcgPT4gJ+KKrCcsCifiiqjMuCcgPT4gJ+KKrScsCifiiqnMuCcgPT4gJ+KKricsCifiiqvMuCcgPT4gJ+KKrycsCifiibzMuCcgPT4gJ+KLoCcsCifiib3MuCcgPT4gJ+KLoScsCifiipHMuCcgPT4gJ+KLoicsCifiipLMuCcgPT4gJ+KLoycsCifiirLMuCcgPT4gJ+KLqicsCifiirPMuCcgPT4gJ+KLqycsCifiirTMuCcgPT4gJ+KLrCcsCifiirXMuCcgPT4gJ+KLrScsCifjgYvjgpknID0+ICfjgYwnLAon44GN44KZJyA9PiAn44GOJywKJ+OBj+OCmScgPT4gJ+OBkCcsCifjgZHjgpknID0+ICfjgZInLAon44GT44KZJyA9PiAn44GUJywKJ+OBleOCmScgPT4gJ+OBlicsCifjgZfjgpknID0+ICfjgZgnLAon44GZ44KZJyA9PiAn44GaJywKJ+OBm+OCmScgPT4gJ+OBnCcsCifjgZ3jgpknID0+ICfjgZ4nLAon44Gf44KZJyA9PiAn44GgJywKJ+OBoeOCmScgPT4gJ+OBoicsCifjgaTjgpknID0+ICfjgaUnLAon44Gm44KZJyA9PiAn44GnJywKJ+OBqOOCmScgPT4gJ+OBqScsCifjga/jgpknID0+ICfjgbAnLAon44Gv44KaJyA9PiAn44GxJywKJ+OBsuOCmScgPT4gJ+OBsycsCifjgbLjgponID0+ICfjgbQnLAon44G144KZJyA9PiAn44G2JywKJ+OBteOCmicgPT4gJ+OBtycsCifjgbjjgpknID0+ICfjgbknLAon44G444KaJyA9PiAn44G6JywKJ+OBu+OCmScgPT4gJ+OBvCcsCifjgbvjgponID0+ICfjgb0nLAon44GG44KZJyA9PiAn44KUJywKJ+OCneOCmScgPT4gJ+OCnicsCifjgqvjgpknID0+ICfjgqwnLAon44Kt44KZJyA9PiAn44KuJywKJ+OCr+OCmScgPT4gJ+OCsCcsCifjgrHjgpknID0+ICfjgrInLAon44Kz44KZJyA9PiAn44K0JywKJ+OCteOCmScgPT4gJ+OCticsCifjgrfjgpknID0+ICfjgrgnLAon44K544KZJyA9PiAn44K6JywKJ+OCu+OCmScgPT4gJ+OCvCcsCifjgr3jgpknID0+ICfjgr4nLAon44K/44KZJyA9PiAn44OAJywKJ+ODgeOCmScgPT4gJ+ODgicsCifjg4TjgpknID0+ICfjg4UnLAon44OG44KZJyA9PiAn44OHJywKJ+ODiOOCmScgPT4gJ+ODiScsCifjg4/jgpknID0+ICfjg5AnLAon44OP44KaJyA9PiAn44ORJywKJ+ODkuOCmScgPT4gJ+ODkycsCifjg5LjgponID0+ICfjg5QnLAon44OV44KZJyA9PiAn44OWJywKJ+ODleOCmicgPT4gJ+ODlycsCifjg5jjgpknID0+ICfjg5knLAon44OY44KaJyA9PiAn44OaJywKJ+ODm+OCmScgPT4gJ+ODnCcsCifjg5vjgponID0+ICfjg50nLAon44Km44KZJyA9PiAn44O0JywKJ+ODr+OCmScgPT4gJ+ODtycsCifjg7DjgpknID0+ICfjg7gnLAon44Ox44KZJyA9PiAn44O5JywKJ+ODsuOCmScgPT4gJ+ODuicsCifjg73jgpknID0+ICfjg74nLAon8JGCmfCRgronID0+ICfwkYKaJywKJ/CRgpvwkYK6JyA9PiAn8JGCnCcsCifwkYKl8JGCuicgPT4gJ/CRgqsnLAon8JGEsfCRhKcnID0+ICfwkYSuJywKJ/CRhLLwkYSnJyA9PiAn8JGErycsCifwkY2H8JGMvicgPT4gJ/CRjYsnLAon8JGNh/CRjZcnID0+ICfwkY2MJywKJ/CRkrnwkZK6JyA9PiAn8JGSuycsCifwkZK58JGSsCcgPT4gJ/CRkrwnLAon8JGSufCRkr0nID0+ICfwkZK+JywKJ/CRlrjwkZavJyA9PiAn8JGWuicsCifwkZa58JGWrycgPT4gJ/CRlrsnLAon8JGktfCRpLAnID0+ICfwkaS4JywKKTsKPD9waHAKCnJldHVybiBhcnJheSAoCifDgCcgPT4gJ0HMgCcsCifDgScgPT4gJ0HMgScsCifDgicgPT4gJ0HMgicsCifDgycgPT4gJ0HMgycsCifDhCcgPT4gJ0HMiCcsCifDhScgPT4gJ0HMiicsCifDhycgPT4gJ0PMpycsCifDiCcgPT4gJ0XMgCcsCifDiScgPT4gJ0XMgScsCifDiicgPT4gJ0XMgicsCifDiycgPT4gJ0XMiCcsCifDjCcgPT4gJ0nMgCcsCifDjScgPT4gJ0nMgScsCifDjicgPT4gJ0nMgicsCifDjycgPT4gJ0nMiCcsCifDkScgPT4gJ07MgycsCifDkicgPT4gJ0/MgCcsCifDkycgPT4gJ0/MgScsCifDlCcgPT4gJ0/MgicsCifDlScgPT4gJ0/MgycsCifDlicgPT4gJ0/MiCcsCifDmScgPT4gJ1XMgCcsCifDmicgPT4gJ1XMgScsCifDmycgPT4gJ1XMgicsCifDnCcgPT4gJ1XMiCcsCifDnScgPT4gJ1nMgScsCifDoCcgPT4gJ2HMgCcsCifDoScgPT4gJ2HMgScsCifDoicgPT4gJ2HMgicsCifDoycgPT4gJ2HMgycsCifDpCcgPT4gJ2HMiCcsCifDpScgPT4gJ2HMiicsCifDpycgPT4gJ2PMpycsCifDqCcgPT4gJ2XMgCcsCifDqScgPT4gJ2XMgScsCifDqicgPT4gJ2XMgicsCifDqycgPT4gJ2XMiCcsCifDrCcgPT4gJ2nMgCcsCifDrScgPT4gJ2nMgScsCifDricgPT4gJ2nMgicsCifDrycgPT4gJ2nMiCcsCifDsScgPT4gJ27MgycsCifDsicgPT4gJ2/MgCcsCifDsycgPT4gJ2/MgScsCifDtCcgPT4gJ2/MgicsCifDtScgPT4gJ2/MgycsCifDticgPT4gJ2/MiCcsCifDuScgPT4gJ3XMgCcsCifDuicgPT4gJ3XMgScsCifDuycgPT4gJ3XMgicsCifDvCcgPT4gJ3XMiCcsCifDvScgPT4gJ3nMgScsCifDvycgPT4gJ3nMiCcsCifEgCcgPT4gJ0HMhCcsCifEgScgPT4gJ2HMhCcsCifEgicgPT4gJ0HMhicsCifEgycgPT4gJ2HMhicsCifEhCcgPT4gJ0HMqCcsCifEhScgPT4gJ2HMqCcsCifEhicgPT4gJ0PMgScsCifEhycgPT4gJ2PMgScsCifEiCcgPT4gJ0PMgicsCifEiScgPT4gJ2PMgicsCifEiicgPT4gJ0PMhycsCifEiycgPT4gJ2PMhycsCifEjCcgPT4gJ0PMjCcsCifEjScgPT4gJ2PMjCcsCifEjicgPT4gJ0TMjCcsCifEjycgPT4gJ2TMjCcsCifEkicgPT4gJ0XMhCcsCifEkycgPT4gJ2XMhCcsCifElCcgPT4gJ0XMhicsCifElScgPT4gJ2XMhicsCifElicgPT4gJ0XMhycsCifElycgPT4gJ2XMhycsCifEmCcgPT4gJ0XMqCcsCifEmScgPT4gJ2XMqCcsCifEmicgPT4gJ0XMjCcsCifEmycgPT4gJ2XMjCcsCifEnCcgPT4gJ0fMgicsCifEnScgPT4gJ2fMgicsCifEnicgPT4gJ0fMhicsCifEnycgPT4gJ2fMhicsCifEoCcgPT4gJ0fMhycsCifEoScgPT4gJ2fMhycsCifEoicgPT4gJ0fMpycsCifEoycgPT4gJ2fMpycsCifEpCcgPT4gJ0jMgicsCifEpScgPT4gJ2jMgicsCifEqCcgPT4gJ0nMgycsCifEqScgPT4gJ2nMgycsCifEqicgPT4gJ0nMhCcsCifEqycgPT4gJ2nMhCcsCifErCcgPT4gJ0nMhicsCifErScgPT4gJ2nMhicsCifEricgPT4gJ0nMqCcsCifErycgPT4gJ2nMqCcsCifEsCcgPT4gJ0nMhycsCifEtCcgPT4gJ0rMgicsCifEtScgPT4gJ2rMgicsCifEticgPT4gJ0vMpycsCifEtycgPT4gJ2vMpycsCifEuScgPT4gJ0zMgScsCifEuicgPT4gJ2zMgScsCifEuycgPT4gJ0zMpycsCifEvCcgPT4gJ2zMpycsCifEvScgPT4gJ0zMjCcsCifEvicgPT4gJ2zMjCcsCifFgycgPT4gJ07MgScsCifFhCcgPT4gJ27MgScsCifFhScgPT4gJ07MpycsCifFhicgPT4gJ27MpycsCifFhycgPT4gJ07MjCcsCifFiCcgPT4gJ27MjCcsCifFjCcgPT4gJ0/MhCcsCifFjScgPT4gJ2/MhCcsCifFjicgPT4gJ0/MhicsCifFjycgPT4gJ2/MhicsCifFkCcgPT4gJ0/MiycsCifFkScgPT4gJ2/MiycsCifFlCcgPT4gJ1LMgScsCifFlScgPT4gJ3LMgScsCifFlicgPT4gJ1LMpycsCifFlycgPT4gJ3LMpycsCifFmCcgPT4gJ1LMjCcsCifFmScgPT4gJ3LMjCcsCifFmicgPT4gJ1PMgScsCifFmycgPT4gJ3PMgScsCifFnCcgPT4gJ1PMgicsCifFnScgPT4gJ3PMgicsCifFnicgPT4gJ1PMpycsCifFnycgPT4gJ3PMpycsCifFoCcgPT4gJ1PMjCcsCifFoScgPT4gJ3PMjCcsCifFoicgPT4gJ1TMpycsCifFoycgPT4gJ3TMpycsCifFpCcgPT4gJ1TMjCcsCifFpScgPT4gJ3TMjCcsCifFqCcgPT4gJ1XMgycsCifFqScgPT4gJ3XMgycsCifFqicgPT4gJ1XMhCcsCifFqycgPT4gJ3XMhCcsCifFrCcgPT4gJ1XMhicsCifFrScgPT4gJ3XMhicsCifFricgPT4gJ1XMiicsCifFrycgPT4gJ3XMiicsCifFsCcgPT4gJ1XMiycsCifFsScgPT4gJ3XMiycsCifFsicgPT4gJ1XMqCcsCifFsycgPT4gJ3XMqCcsCifFtCcgPT4gJ1fMgicsCifFtScgPT4gJ3fMgicsCifFticgPT4gJ1nMgicsCifFtycgPT4gJ3nMgicsCifFuCcgPT4gJ1nMiCcsCifFuScgPT4gJ1rMgScsCifFuicgPT4gJ3rMgScsCifFuycgPT4gJ1rMhycsCifFvCcgPT4gJ3rMhycsCifFvScgPT4gJ1rMjCcsCifFvicgPT4gJ3rMjCcsCifGoCcgPT4gJ0/MmycsCifGoScgPT4gJ2/MmycsCifGrycgPT4gJ1XMmycsCifGsCcgPT4gJ3XMmycsCifHjScgPT4gJ0HMjCcsCifHjicgPT4gJ2HMjCcsCifHjycgPT4gJ0nMjCcsCifHkCcgPT4gJ2nMjCcsCifHkScgPT4gJ0/MjCcsCifHkicgPT4gJ2/MjCcsCifHkycgPT4gJ1XMjCcsCifHlCcgPT4gJ3XMjCcsCifHlScgPT4gJ1XMiMyEJywKJ8eWJyA9PiAndcyIzIQnLAonx5cnID0+ICdVzIjMgScsCifHmCcgPT4gJ3XMiMyBJywKJ8eZJyA9PiAnVcyIzIwnLAonx5onID0+ICd1zIjMjCcsCifHmycgPT4gJ1XMiMyAJywKJ8ecJyA9PiAndcyIzIAnLAonx54nID0+ICdBzIjMhCcsCifHnycgPT4gJ2HMiMyEJywKJ8egJyA9PiAnQcyHzIQnLAonx6EnID0+ICdhzIfMhCcsCifHoicgPT4gJ8OGzIQnLAonx6MnID0+ICfDpsyEJywKJ8emJyA9PiAnR8yMJywKJ8enJyA9PiAnZ8yMJywKJ8eoJyA9PiAnS8yMJywKJ8epJyA9PiAna8yMJywKJ8eqJyA9PiAnT8yoJywKJ8erJyA9PiAnb8yoJywKJ8esJyA9PiAnT8yozIQnLAonx60nID0+ICdvzKjMhCcsCifHricgPT4gJ8a3zIwnLAonx68nID0+ICfKksyMJywKJ8ewJyA9PiAnasyMJywKJ8e0JyA9PiAnR8yBJywKJ8e1JyA9PiAnZ8yBJywKJ8e4JyA9PiAnTsyAJywKJ8e5JyA9PiAnbsyAJywKJ8e6JyA9PiAnQcyKzIEnLAonx7snID0+ICdhzIrMgScsCifHvCcgPT4gJ8OGzIEnLAonx70nID0+ICfDpsyBJywKJ8e+JyA9PiAnw5jMgScsCifHvycgPT4gJ8O4zIEnLAonyIAnID0+ICdBzI8nLAonyIEnID0+ICdhzI8nLAonyIInID0+ICdBzJEnLAonyIMnID0+ICdhzJEnLAonyIQnID0+ICdFzI8nLAonyIUnID0+ICdlzI8nLAonyIYnID0+ICdFzJEnLAonyIcnID0+ICdlzJEnLAonyIgnID0+ICdJzI8nLAonyIknID0+ICdpzI8nLAonyIonID0+ICdJzJEnLAonyIsnID0+ICdpzJEnLAonyIwnID0+ICdPzI8nLAonyI0nID0+ICdvzI8nLAonyI4nID0+ICdPzJEnLAonyI8nID0+ICdvzJEnLAonyJAnID0+ICdSzI8nLAonyJEnID0+ICdyzI8nLAonyJInID0+ICdSzJEnLAonyJMnID0+ICdyzJEnLAonyJQnID0+ICdVzI8nLAonyJUnID0+ICd1zI8nLAonyJYnID0+ICdVzJEnLAonyJcnID0+ICd1zJEnLAonyJgnID0+ICdTzKYnLAonyJknID0+ICdzzKYnLAonyJonID0+ICdUzKYnLAonyJsnID0+ICd0zKYnLAonyJ4nID0+ICdIzIwnLAonyJ8nID0+ICdozIwnLAonyKYnID0+ICdBzIcnLAonyKcnID0+ICdhzIcnLAonyKgnID0+ICdFzKcnLAonyKknID0+ICdlzKcnLAonyKonID0+ICdPzIjMhCcsCifIqycgPT4gJ2/MiMyEJywKJ8isJyA9PiAnT8yDzIQnLAonyK0nID0+ICdvzIPMhCcsCifIricgPT4gJ0/MhycsCifIrycgPT4gJ2/MhycsCifIsCcgPT4gJ0/Mh8yEJywKJ8ixJyA9PiAnb8yHzIQnLAonyLInID0+ICdZzIQnLAonyLMnID0+ICd5zIQnLAonzYAnID0+ICfMgCcsCifNgScgPT4gJ8yBJywKJ82DJyA9PiAnzJMnLAonzYQnID0+ICfMiMyBJywKJ820JyA9PiAnyrknLAonzb4nID0+ICc7JywKJ86FJyA9PiAnwqjMgScsCifOhicgPT4gJ86RzIEnLAonzocnID0+ICfCtycsCifOiCcgPT4gJ86VzIEnLAonzoknID0+ICfOl8yBJywKJ86KJyA9PiAnzpnMgScsCifOjCcgPT4gJ86fzIEnLAonzo4nID0+ICfOpcyBJywKJ86PJyA9PiAnzqnMgScsCifOkCcgPT4gJ865zIjMgScsCifOqicgPT4gJ86ZzIgnLAonzqsnID0+ICfOpcyIJywKJ86sJyA9PiAnzrHMgScsCifOrScgPT4gJ861zIEnLAonzq4nID0+ICfOt8yBJywKJ86vJyA9PiAnzrnMgScsCifOsCcgPT4gJ8+FzIjMgScsCifPiicgPT4gJ865zIgnLAonz4snID0+ICfPhcyIJywKJ8+MJyA9PiAnzr/MgScsCifPjScgPT4gJ8+FzIEnLAonz44nID0+ICfPicyBJywKJ8+TJyA9PiAnz5LMgScsCifPlCcgPT4gJ8+SzIgnLAon0IAnID0+ICfQlcyAJywKJ9CBJyA9PiAn0JXMiCcsCifQgycgPT4gJ9CTzIEnLAon0IcnID0+ICfQhsyIJywKJ9CMJyA9PiAn0JrMgScsCifQjScgPT4gJ9CYzIAnLAon0I4nID0+ICfQo8yGJywKJ9CZJyA9PiAn0JjMhicsCifQuScgPT4gJ9C4zIYnLAon0ZAnID0+ICfQtcyAJywKJ9GRJyA9PiAn0LXMiCcsCifRkycgPT4gJ9CzzIEnLAon0ZcnID0+ICfRlsyIJywKJ9GcJyA9PiAn0LrMgScsCifRnScgPT4gJ9C4zIAnLAon0Z4nID0+ICfRg8yGJywKJ9G2JyA9PiAn0bTMjycsCifRtycgPT4gJ9G1zI8nLAon04EnID0+ICfQlsyGJywKJ9OCJyA9PiAn0LbMhicsCifTkCcgPT4gJ9CQzIYnLAon05EnID0+ICfQsMyGJywKJ9OSJyA9PiAn0JDMiCcsCifTkycgPT4gJ9CwzIgnLAon05YnID0+ICfQlcyGJywKJ9OXJyA9PiAn0LXMhicsCifTmicgPT4gJ9OYzIgnLAon05snID0+ICfTmcyIJywKJ9OcJyA9PiAn0JbMiCcsCifTnScgPT4gJ9C2zIgnLAon054nID0+ICfQl8yIJywKJ9OfJyA9PiAn0LfMiCcsCifToicgPT4gJ9CYzIQnLAon06MnID0+ICfQuMyEJywKJ9OkJyA9PiAn0JjMiCcsCifTpScgPT4gJ9C4zIgnLAon06YnID0+ICfQnsyIJywKJ9OnJyA9PiAn0L7MiCcsCifTqicgPT4gJ9OozIgnLAon06snID0+ICfTqcyIJywKJ9OsJyA9PiAn0K3MiCcsCifTrScgPT4gJ9GNzIgnLAon064nID0+ICfQo8yEJywKJ9OvJyA9PiAn0YPMhCcsCifTsCcgPT4gJ9CjzIgnLAon07EnID0+ICfRg8yIJywKJ9OyJyA9PiAn0KPMiycsCifTsycgPT4gJ9GDzIsnLAon07QnID0+ICfQp8yIJywKJ9O1JyA9PiAn0YfMiCcsCifTuCcgPT4gJ9CrzIgnLAon07knID0+ICfRi8yIJywKJ9iiJyA9PiAn2KfZkycsCifYoycgPT4gJ9in2ZQnLAon2KQnID0+ICfZiNmUJywKJ9ilJyA9PiAn2KfZlScsCifYpicgPT4gJ9mK2ZQnLAon24AnID0+ICfbldmUJywKJ9uCJyA9PiAn24HZlCcsCifbkycgPT4gJ9uS2ZQnLAon4KSpJyA9PiAn4KSo4KS8JywKJ+CksScgPT4gJ+CksOCkvCcsCifgpLQnID0+ICfgpLPgpLwnLAon4KWYJyA9PiAn4KSV4KS8JywKJ+ClmScgPT4gJ+CkluCkvCcsCifgpZonID0+ICfgpJfgpLwnLAon4KWbJyA9PiAn4KSc4KS8JywKJ+ClnCcgPT4gJ+CkoeCkvCcsCifgpZ0nID0+ICfgpKLgpLwnLAon4KWeJyA9PiAn4KSr4KS8JywKJ+ClnycgPT4gJ+Ckr+CkvCcsCifgp4snID0+ICfgp4fgpr4nLAon4KeMJyA9PiAn4KeH4KeXJywKJ+CnnCcgPT4gJ+CmoeCmvCcsCifgp50nID0+ICfgpqLgprwnLAon4KefJyA9PiAn4Kav4Ka8JywKJ+CosycgPT4gJ+CosuCovCcsCifgqLYnID0+ICfgqLjgqLwnLAon4KmZJyA9PiAn4KiW4Ki8JywKJ+CpmicgPT4gJ+Col+CovCcsCifgqZsnID0+ICfgqJzgqLwnLAon4KmeJyA9PiAn4Kir4Ki8JywKJ+CtiCcgPT4gJ+Cth+CtlicsCifgrYsnID0+ICfgrYfgrL4nLAon4K2MJyA9PiAn4K2H4K2XJywKJ+CtnCcgPT4gJ+CsoeCsvCcsCifgrZ0nID0+ICfgrKLgrLwnLAon4K6UJyA9PiAn4K6S4K+XJywKJ+CviicgPT4gJ+CvhuCuvicsCifgr4snID0+ICfgr4fgrr4nLAon4K+MJyA9PiAn4K+G4K+XJywKJ+CxiCcgPT4gJ+CxhuCxlicsCifgs4AnID0+ICfgsr/gs5UnLAon4LOHJyA9PiAn4LOG4LOVJywKJ+CziCcgPT4gJ+CzhuCzlicsCifgs4onID0+ICfgs4bgs4InLAon4LOLJyA9PiAn4LOG4LOC4LOVJywKJ+C1iicgPT4gJ+C1huC0vicsCifgtYsnID0+ICfgtYfgtL4nLAon4LWMJyA9PiAn4LWG4LWXJywKJ+C3micgPT4gJ+C3meC3iicsCifgt5wnID0+ICfgt5ngt48nLAon4LedJyA9PiAn4LeZ4LeP4LeKJywKJ+C3nicgPT4gJ+C3meC3nycsCifgvYMnID0+ICfgvYLgvrcnLAon4L2NJyA9PiAn4L2M4L63JywKJ+C9kicgPT4gJ+C9keC+tycsCifgvZcnID0+ICfgvZbgvrcnLAon4L2cJyA9PiAn4L2b4L63JywKJ+C9qScgPT4gJ+C9gOC+tScsCifgvbMnID0+ICfgvbHgvbInLAon4L21JyA9PiAn4L2x4L20JywKJ+C9ticgPT4gJ+C+suC+gCcsCifgvbgnID0+ICfgvrPgvoAnLAon4L6BJyA9PiAn4L2x4L6AJywKJ+C+kycgPT4gJ+C+kuC+tycsCifgvp0nID0+ICfgvpzgvrcnLAon4L6iJyA9PiAn4L6h4L63JywKJ+C+pycgPT4gJ+C+puC+tycsCifgvqwnID0+ICfgvqvgvrcnLAon4L65JyA9PiAn4L6Q4L61JywKJ+GApicgPT4gJ+GApeGAricsCifhrIYnID0+ICfhrIXhrLUnLAon4ayIJyA9PiAn4ayH4ay1JywKJ+GsiicgPT4gJ+GsieGstScsCifhrIwnID0+ICfhrIvhrLUnLAon4ayOJyA9PiAn4ayN4ay1JywKJ+GskicgPT4gJ+GskeGstScsCifhrLsnID0+ICfhrLrhrLUnLAon4ay9JyA9PiAn4ay84ay1JywKJ+GtgCcgPT4gJ+GsvuGstScsCifhrYEnID0+ICfhrL/hrLUnLAon4a2DJyA9PiAn4a2C4ay1JywKJ+G4gCcgPT4gJ0HMpScsCifhuIEnID0+ICdhzKUnLAon4biCJyA9PiAnQsyHJywKJ+G4gycgPT4gJ2LMhycsCifhuIQnID0+ICdCzKMnLAon4biFJyA9PiAnYsyjJywKJ+G4hicgPT4gJ0LMsScsCifhuIcnID0+ICdizLEnLAon4biIJyA9PiAnQ8ynzIEnLAon4biJJyA9PiAnY8ynzIEnLAon4biKJyA9PiAnRMyHJywKJ+G4iycgPT4gJ2TMhycsCifhuIwnID0+ICdEzKMnLAon4biNJyA9PiAnZMyjJywKJ+G4jicgPT4gJ0TMsScsCifhuI8nID0+ICdkzLEnLAon4biQJyA9PiAnRMynJywKJ+G4kScgPT4gJ2TMpycsCifhuJInID0+ICdEzK0nLAon4biTJyA9PiAnZMytJywKJ+G4lCcgPT4gJ0XMhMyAJywKJ+G4lScgPT4gJ2XMhMyAJywKJ+G4licgPT4gJ0XMhMyBJywKJ+G4lycgPT4gJ2XMhMyBJywKJ+G4mCcgPT4gJ0XMrScsCifhuJknID0+ICdlzK0nLAon4biaJyA9PiAnRcywJywKJ+G4mycgPT4gJ2XMsCcsCifhuJwnID0+ICdFzKfMhicsCifhuJ0nID0+ICdlzKfMhicsCifhuJ4nID0+ICdGzIcnLAon4bifJyA9PiAnZsyHJywKJ+G4oCcgPT4gJ0fMhCcsCifhuKEnID0+ICdnzIQnLAon4biiJyA9PiAnSMyHJywKJ+G4oycgPT4gJ2jMhycsCifhuKQnID0+ICdIzKMnLAon4bilJyA9PiAnaMyjJywKJ+G4picgPT4gJ0jMiCcsCifhuKcnID0+ICdozIgnLAon4bioJyA9PiAnSMynJywKJ+G4qScgPT4gJ2jMpycsCifhuKonID0+ICdIzK4nLAon4birJyA9PiAnaMyuJywKJ+G4rCcgPT4gJ0nMsCcsCifhuK0nID0+ICdpzLAnLAon4biuJyA9PiAnScyIzIEnLAon4bivJyA9PiAnacyIzIEnLAon4biwJyA9PiAnS8yBJywKJ+G4sScgPT4gJ2vMgScsCifhuLInID0+ICdLzKMnLAon4bizJyA9PiAna8yjJywKJ+G4tCcgPT4gJ0vMsScsCifhuLUnID0+ICdrzLEnLAon4bi2JyA9PiAnTMyjJywKJ+G4tycgPT4gJ2zMoycsCifhuLgnID0+ICdMzKPMhCcsCifhuLknID0+ICdszKPMhCcsCifhuLonID0+ICdMzLEnLAon4bi7JyA9PiAnbMyxJywKJ+G4vCcgPT4gJ0zMrScsCifhuL0nID0+ICdszK0nLAon4bi+JyA9PiAnTcyBJywKJ+G4vycgPT4gJ23MgScsCifhuYAnID0+ICdNzIcnLAon4bmBJyA9PiAnbcyHJywKJ+G5gicgPT4gJ03MoycsCifhuYMnID0+ICdtzKMnLAon4bmEJyA9PiAnTsyHJywKJ+G5hScgPT4gJ27MhycsCifhuYYnID0+ICdOzKMnLAon4bmHJyA9PiAnbsyjJywKJ+G5iCcgPT4gJ07MsScsCifhuYknID0+ICduzLEnLAon4bmKJyA9PiAnTsytJywKJ+G5iycgPT4gJ27MrScsCifhuYwnID0+ICdPzIPMgScsCifhuY0nID0+ICdvzIPMgScsCifhuY4nID0+ICdPzIPMiCcsCifhuY8nID0+ICdvzIPMiCcsCifhuZAnID0+ICdPzITMgCcsCifhuZEnID0+ICdvzITMgCcsCifhuZInID0+ICdPzITMgScsCifhuZMnID0+ICdvzITMgScsCifhuZQnID0+ICdQzIEnLAon4bmVJyA9PiAncMyBJywKJ+G5licgPT4gJ1DMhycsCifhuZcnID0+ICdwzIcnLAon4bmYJyA9PiAnUsyHJywKJ+G5mScgPT4gJ3LMhycsCifhuZonID0+ICdSzKMnLAon4bmbJyA9PiAncsyjJywKJ+G5nCcgPT4gJ1LMo8yEJywKJ+G5nScgPT4gJ3LMo8yEJywKJ+G5nicgPT4gJ1LMsScsCifhuZ8nID0+ICdyzLEnLAon4bmgJyA9PiAnU8yHJywKJ+G5oScgPT4gJ3PMhycsCifhuaInID0+ICdTzKMnLAon4bmjJyA9PiAnc8yjJywKJ+G5pCcgPT4gJ1PMgcyHJywKJ+G5pScgPT4gJ3PMgcyHJywKJ+G5picgPT4gJ1PMjMyHJywKJ+G5pycgPT4gJ3PMjMyHJywKJ+G5qCcgPT4gJ1PMo8yHJywKJ+G5qScgPT4gJ3PMo8yHJywKJ+G5qicgPT4gJ1TMhycsCifhuasnID0+ICd0zIcnLAon4bmsJyA9PiAnVMyjJywKJ+G5rScgPT4gJ3TMoycsCifhua4nID0+ICdUzLEnLAon4bmvJyA9PiAndMyxJywKJ+G5sCcgPT4gJ1TMrScsCifhubEnID0+ICd0zK0nLAon4bmyJyA9PiAnVcykJywKJ+G5sycgPT4gJ3XMpCcsCifhubQnID0+ICdVzLAnLAon4bm1JyA9PiAndcywJywKJ+G5ticgPT4gJ1XMrScsCifhubcnID0+ICd1zK0nLAon4bm4JyA9PiAnVcyDzIEnLAon4bm5JyA9PiAndcyDzIEnLAon4bm6JyA9PiAnVcyEzIgnLAon4bm7JyA9PiAndcyEzIgnLAon4bm8JyA9PiAnVsyDJywKJ+G5vScgPT4gJ3bMgycsCifhub4nID0+ICdWzKMnLAon4bm/JyA9PiAndsyjJywKJ+G6gCcgPT4gJ1fMgCcsCifhuoEnID0+ICd3zIAnLAon4bqCJyA9PiAnV8yBJywKJ+G6gycgPT4gJ3fMgScsCifhuoQnID0+ICdXzIgnLAon4bqFJyA9PiAnd8yIJywKJ+G6hicgPT4gJ1fMhycsCifhuocnID0+ICd3zIcnLAon4bqIJyA9PiAnV8yjJywKJ+G6iScgPT4gJ3fMoycsCifhuoonID0+ICdYzIcnLAon4bqLJyA9PiAneMyHJywKJ+G6jCcgPT4gJ1jMiCcsCifhuo0nID0+ICd4zIgnLAon4bqOJyA9PiAnWcyHJywKJ+G6jycgPT4gJ3nMhycsCifhupAnID0+ICdazIInLAon4bqRJyA9PiAnesyCJywKJ+G6kicgPT4gJ1rMoycsCifhupMnID0+ICd6zKMnLAon4bqUJyA9PiAnWsyxJywKJ+G6lScgPT4gJ3rMsScsCifhupYnID0+ICdozLEnLAon4bqXJyA9PiAndMyIJywKJ+G6mCcgPT4gJ3fMiicsCifhupknID0+ICd5zIonLAon4bqbJyA9PiAnxb/MhycsCifhuqAnID0+ICdBzKMnLAon4bqhJyA9PiAnYcyjJywKJ+G6oicgPT4gJ0HMiScsCifhuqMnID0+ICdhzIknLAon4bqkJyA9PiAnQcyCzIEnLAon4bqlJyA9PiAnYcyCzIEnLAon4bqmJyA9PiAnQcyCzIAnLAon4bqnJyA9PiAnYcyCzIAnLAon4bqoJyA9PiAnQcyCzIknLAon4bqpJyA9PiAnYcyCzIknLAon4bqqJyA9PiAnQcyCzIMnLAon4bqrJyA9PiAnYcyCzIMnLAon4bqsJyA9PiAnQcyjzIInLAon4bqtJyA9PiAnYcyjzIInLAon4bquJyA9PiAnQcyGzIEnLAon4bqvJyA9PiAnYcyGzIEnLAon4bqwJyA9PiAnQcyGzIAnLAon4bqxJyA9PiAnYcyGzIAnLAon4bqyJyA9PiAnQcyGzIknLAon4bqzJyA9PiAnYcyGzIknLAon4bq0JyA9PiAnQcyGzIMnLAon4bq1JyA9PiAnYcyGzIMnLAon4bq2JyA9PiAnQcyjzIYnLAon4bq3JyA9PiAnYcyjzIYnLAon4bq4JyA9PiAnRcyjJywKJ+G6uScgPT4gJ2XMoycsCifhuronID0+ICdFzIknLAon4bq7JyA9PiAnZcyJJywKJ+G6vCcgPT4gJ0XMgycsCifhur0nID0+ICdlzIMnLAon4bq+JyA9PiAnRcyCzIEnLAon4bq/JyA9PiAnZcyCzIEnLAon4buAJyA9PiAnRcyCzIAnLAon4buBJyA9PiAnZcyCzIAnLAon4buCJyA9PiAnRcyCzIknLAon4buDJyA9PiAnZcyCzIknLAon4buEJyA9PiAnRcyCzIMnLAon4buFJyA9PiAnZcyCzIMnLAon4buGJyA9PiAnRcyjzIInLAon4buHJyA9PiAnZcyjzIInLAon4buIJyA9PiAnScyJJywKJ+G7iScgPT4gJ2nMiScsCifhu4onID0+ICdJzKMnLAon4buLJyA9PiAnacyjJywKJ+G7jCcgPT4gJ0/MoycsCifhu40nID0+ICdvzKMnLAon4buOJyA9PiAnT8yJJywKJ+G7jycgPT4gJ2/MiScsCifhu5AnID0+ICdPzILMgScsCifhu5EnID0+ICdvzILMgScsCifhu5InID0+ICdPzILMgCcsCifhu5MnID0+ICdvzILMgCcsCifhu5QnID0+ICdPzILMiScsCifhu5UnID0+ICdvzILMiScsCifhu5YnID0+ICdPzILMgycsCifhu5cnID0+ICdvzILMgycsCifhu5gnID0+ICdPzKPMgicsCifhu5knID0+ICdvzKPMgicsCifhu5onID0+ICdPzJvMgScsCifhu5snID0+ICdvzJvMgScsCifhu5wnID0+ICdPzJvMgCcsCifhu50nID0+ICdvzJvMgCcsCifhu54nID0+ICdPzJvMiScsCifhu58nID0+ICdvzJvMiScsCifhu6AnID0+ICdPzJvMgycsCifhu6EnID0+ICdvzJvMgycsCifhu6InID0+ICdPzJvMoycsCifhu6MnID0+ICdvzJvMoycsCifhu6QnID0+ICdVzKMnLAon4bulJyA9PiAndcyjJywKJ+G7picgPT4gJ1XMiScsCifhu6cnID0+ICd1zIknLAon4buoJyA9PiAnVcybzIEnLAon4bupJyA9PiAndcybzIEnLAon4buqJyA9PiAnVcybzIAnLAon4burJyA9PiAndcybzIAnLAon4busJyA9PiAnVcybzIknLAon4butJyA9PiAndcybzIknLAon4buuJyA9PiAnVcybzIMnLAon4buvJyA9PiAndcybzIMnLAon4buwJyA9PiAnVcybzKMnLAon4buxJyA9PiAndcybzKMnLAon4buyJyA9PiAnWcyAJywKJ+G7sycgPT4gJ3nMgCcsCifhu7QnID0+ICdZzKMnLAon4bu1JyA9PiAnecyjJywKJ+G7ticgPT4gJ1nMiScsCifhu7cnID0+ICd5zIknLAon4bu4JyA9PiAnWcyDJywKJ+G7uScgPT4gJ3nMgycsCifhvIAnID0+ICfOscyTJywKJ+G8gScgPT4gJ86xzJQnLAon4byCJyA9PiAnzrHMk8yAJywKJ+G8gycgPT4gJ86xzJTMgCcsCifhvIQnID0+ICfOscyTzIEnLAon4byFJyA9PiAnzrHMlMyBJywKJ+G8hicgPT4gJ86xzJPNgicsCifhvIcnID0+ICfOscyUzYInLAon4byIJyA9PiAnzpHMkycsCifhvIknID0+ICfOkcyUJywKJ+G8iicgPT4gJ86RzJPMgCcsCifhvIsnID0+ICfOkcyUzIAnLAon4byMJyA9PiAnzpHMk8yBJywKJ+G8jScgPT4gJ86RzJTMgScsCifhvI4nID0+ICfOkcyTzYInLAon4byPJyA9PiAnzpHMlM2CJywKJ+G8kCcgPT4gJ861zJMnLAon4byRJyA9PiAnzrXMlCcsCifhvJInID0+ICfOtcyTzIAnLAon4byTJyA9PiAnzrXMlMyAJywKJ+G8lCcgPT4gJ861zJPMgScsCifhvJUnID0+ICfOtcyUzIEnLAon4byYJyA9PiAnzpXMkycsCifhvJknID0+ICfOlcyUJywKJ+G8micgPT4gJ86VzJPMgCcsCifhvJsnID0+ICfOlcyUzIAnLAon4bycJyA9PiAnzpXMk8yBJywKJ+G8nScgPT4gJ86VzJTMgScsCifhvKAnID0+ICfOt8yTJywKJ+G8oScgPT4gJ863zJQnLAon4byiJyA9PiAnzrfMk8yAJywKJ+G8oycgPT4gJ863zJTMgCcsCifhvKQnID0+ICfOt8yTzIEnLAon4bylJyA9PiAnzrfMlMyBJywKJ+G8picgPT4gJ863zJPNgicsCifhvKcnID0+ICfOt8yUzYInLAon4byoJyA9PiAnzpfMkycsCifhvKknID0+ICfOl8yUJywKJ+G8qicgPT4gJ86XzJPMgCcsCifhvKsnID0+ICfOl8yUzIAnLAon4bysJyA9PiAnzpfMk8yBJywKJ+G8rScgPT4gJ86XzJTMgScsCifhvK4nID0+ICfOl8yTzYInLAon4byvJyA9PiAnzpfMlM2CJywKJ+G8sCcgPT4gJ865zJMnLAon4byxJyA9PiAnzrnMlCcsCifhvLInID0+ICfOucyTzIAnLAon4byzJyA9PiAnzrnMlMyAJywKJ+G8tCcgPT4gJ865zJPMgScsCifhvLUnID0+ICfOucyUzIEnLAon4by2JyA9PiAnzrnMk82CJywKJ+G8tycgPT4gJ865zJTNgicsCifhvLgnID0+ICfOmcyTJywKJ+G8uScgPT4gJ86ZzJQnLAon4by6JyA9PiAnzpnMk8yAJywKJ+G8uycgPT4gJ86ZzJTMgCcsCifhvLwnID0+ICfOmcyTzIEnLAon4by9JyA9PiAnzpnMlMyBJywKJ+G8vicgPT4gJ86ZzJPNgicsCifhvL8nID0+ICfOmcyUzYInLAon4b2AJyA9PiAnzr/MkycsCifhvYEnID0+ICfOv8yUJywKJ+G9gicgPT4gJ86/zJPMgCcsCifhvYMnID0+ICfOv8yUzIAnLAon4b2EJyA9PiAnzr/Mk8yBJywKJ+G9hScgPT4gJ86/zJTMgScsCifhvYgnID0+ICfOn8yTJywKJ+G9iScgPT4gJ86fzJQnLAon4b2KJyA9PiAnzp/Mk8yAJywKJ+G9iycgPT4gJ86fzJTMgCcsCifhvYwnID0+ICfOn8yTzIEnLAon4b2NJyA9PiAnzp/MlMyBJywKJ+G9kCcgPT4gJ8+FzJMnLAon4b2RJyA9PiAnz4XMlCcsCifhvZInID0+ICfPhcyTzIAnLAon4b2TJyA9PiAnz4XMlMyAJywKJ+G9lCcgPT4gJ8+FzJPMgScsCifhvZUnID0+ICfPhcyUzIEnLAon4b2WJyA9PiAnz4XMk82CJywKJ+G9lycgPT4gJ8+FzJTNgicsCifhvZknID0+ICfOpcyUJywKJ+G9mycgPT4gJ86lzJTMgCcsCifhvZ0nID0+ICfOpcyUzIEnLAon4b2fJyA9PiAnzqXMlM2CJywKJ+G9oCcgPT4gJ8+JzJMnLAon4b2hJyA9PiAnz4nMlCcsCifhvaInID0+ICfPicyTzIAnLAon4b2jJyA9PiAnz4nMlMyAJywKJ+G9pCcgPT4gJ8+JzJPMgScsCifhvaUnID0+ICfPicyUzIEnLAon4b2mJyA9PiAnz4nMk82CJywKJ+G9pycgPT4gJ8+JzJTNgicsCifhvagnID0+ICfOqcyTJywKJ+G9qScgPT4gJ86pzJQnLAon4b2qJyA9PiAnzqnMk8yAJywKJ+G9qycgPT4gJ86pzJTMgCcsCifhvawnID0+ICfOqcyTzIEnLAon4b2tJyA9PiAnzqnMlMyBJywKJ+G9ricgPT4gJ86pzJPNgicsCifhva8nID0+ICfOqcyUzYInLAon4b2wJyA9PiAnzrHMgCcsCifhvbEnID0+ICfOscyBJywKJ+G9sicgPT4gJ861zIAnLAon4b2zJyA9PiAnzrXMgScsCifhvbQnID0+ICfOt8yAJywKJ+G9tScgPT4gJ863zIEnLAon4b22JyA9PiAnzrnMgCcsCifhvbcnID0+ICfOucyBJywKJ+G9uCcgPT4gJ86/zIAnLAon4b25JyA9PiAnzr/MgScsCifhvbonID0+ICfPhcyAJywKJ+G9uycgPT4gJ8+FzIEnLAon4b28JyA9PiAnz4nMgCcsCifhvb0nID0+ICfPicyBJywKJ+G+gCcgPT4gJ86xzJPNhScsCifhvoEnID0+ICfOscyUzYUnLAon4b6CJyA9PiAnzrHMk8yAzYUnLAon4b6DJyA9PiAnzrHMlMyAzYUnLAon4b6EJyA9PiAnzrHMk8yBzYUnLAon4b6FJyA9PiAnzrHMlMyBzYUnLAon4b6GJyA9PiAnzrHMk82CzYUnLAon4b6HJyA9PiAnzrHMlM2CzYUnLAon4b6IJyA9PiAnzpHMk82FJywKJ+G+iScgPT4gJ86RzJTNhScsCifhvoonID0+ICfOkcyTzIDNhScsCifhvosnID0+ICfOkcyUzIDNhScsCifhvownID0+ICfOkcyTzIHNhScsCifhvo0nID0+ICfOkcyUzIHNhScsCifhvo4nID0+ICfOkcyTzYLNhScsCifhvo8nID0+ICfOkcyUzYLNhScsCifhvpAnID0+ICfOt8yTzYUnLAon4b6RJyA9PiAnzrfMlM2FJywKJ+G+kicgPT4gJ863zJPMgM2FJywKJ+G+kycgPT4gJ863zJTMgM2FJywKJ+G+lCcgPT4gJ863zJPMgc2FJywKJ+G+lScgPT4gJ863zJTMgc2FJywKJ+G+licgPT4gJ863zJPNgs2FJywKJ+G+lycgPT4gJ863zJTNgs2FJywKJ+G+mCcgPT4gJ86XzJPNhScsCifhvpknID0+ICfOl8yUzYUnLAon4b6aJyA9PiAnzpfMk8yAzYUnLAon4b6bJyA9PiAnzpfMlMyAzYUnLAon4b6cJyA9PiAnzpfMk8yBzYUnLAon4b6dJyA9PiAnzpfMlMyBzYUnLAon4b6eJyA9PiAnzpfMk82CzYUnLAon4b6fJyA9PiAnzpfMlM2CzYUnLAon4b6gJyA9PiAnz4nMk82FJywKJ+G+oScgPT4gJ8+JzJTNhScsCifhvqInID0+ICfPicyTzIDNhScsCifhvqMnID0+ICfPicyUzIDNhScsCifhvqQnID0+ICfPicyTzIHNhScsCifhvqUnID0+ICfPicyUzIHNhScsCifhvqYnID0+ICfPicyTzYLNhScsCifhvqcnID0+ICfPicyUzYLNhScsCifhvqgnID0+ICfOqcyTzYUnLAon4b6pJyA9PiAnzqnMlM2FJywKJ+G+qicgPT4gJ86pzJPMgM2FJywKJ+G+qycgPT4gJ86pzJTMgM2FJywKJ+G+rCcgPT4gJ86pzJPMgc2FJywKJ+G+rScgPT4gJ86pzJTMgc2FJywKJ+G+ricgPT4gJ86pzJPNgs2FJywKJ+G+rycgPT4gJ86pzJTNgs2FJywKJ+G+sCcgPT4gJ86xzIYnLAon4b6xJyA9PiAnzrHMhCcsCifhvrInID0+ICfOscyAzYUnLAon4b6zJyA9PiAnzrHNhScsCifhvrQnID0+ICfOscyBzYUnLAon4b62JyA9PiAnzrHNgicsCifhvrcnID0+ICfOsc2CzYUnLAon4b64JyA9PiAnzpHMhicsCifhvrknID0+ICfOkcyEJywKJ+G+uicgPT4gJ86RzIAnLAon4b67JyA9PiAnzpHMgScsCifhvrwnID0+ICfOkc2FJywKJ+G+vicgPT4gJ865JywKJ+G/gScgPT4gJ8KozYInLAon4b+CJyA9PiAnzrfMgM2FJywKJ+G/gycgPT4gJ863zYUnLAon4b+EJyA9PiAnzrfMgc2FJywKJ+G/hicgPT4gJ863zYInLAon4b+HJyA9PiAnzrfNgs2FJywKJ+G/iCcgPT4gJ86VzIAnLAon4b+JJyA9PiAnzpXMgScsCifhv4onID0+ICfOl8yAJywKJ+G/iycgPT4gJ86XzIEnLAon4b+MJyA9PiAnzpfNhScsCifhv40nID0+ICfhvr/MgCcsCifhv44nID0+ICfhvr/MgScsCifhv48nID0+ICfhvr/NgicsCifhv5AnID0+ICfOucyGJywKJ+G/kScgPT4gJ865zIQnLAon4b+SJyA9PiAnzrnMiMyAJywKJ+G/kycgPT4gJ865zIjMgScsCifhv5YnID0+ICfOuc2CJywKJ+G/lycgPT4gJ865zIjNgicsCifhv5gnID0+ICfOmcyGJywKJ+G/mScgPT4gJ86ZzIQnLAon4b+aJyA9PiAnzpnMgCcsCifhv5snID0+ICfOmcyBJywKJ+G/nScgPT4gJ+G/vsyAJywKJ+G/nicgPT4gJ+G/vsyBJywKJ+G/nycgPT4gJ+G/vs2CJywKJ+G/oCcgPT4gJ8+FzIYnLAon4b+hJyA9PiAnz4XMhCcsCifhv6InID0+ICfPhcyIzIAnLAon4b+jJyA9PiAnz4XMiMyBJywKJ+G/pCcgPT4gJ8+BzJMnLAon4b+lJyA9PiAnz4HMlCcsCifhv6YnID0+ICfPhc2CJywKJ+G/pycgPT4gJ8+FzIjNgicsCifhv6gnID0+ICfOpcyGJywKJ+G/qScgPT4gJ86lzIQnLAon4b+qJyA9PiAnzqXMgCcsCifhv6snID0+ICfOpcyBJywKJ+G/rCcgPT4gJ86hzJQnLAon4b+tJyA9PiAnwqjMgCcsCifhv64nID0+ICfCqMyBJywKJ+G/rycgPT4gJ2AnLAon4b+yJyA9PiAnz4nMgM2FJywKJ+G/sycgPT4gJ8+JzYUnLAon4b+0JyA9PiAnz4nMgc2FJywKJ+G/ticgPT4gJ8+JzYInLAon4b+3JyA9PiAnz4nNgs2FJywKJ+G/uCcgPT4gJ86fzIAnLAon4b+5JyA9PiAnzp/MgScsCifhv7onID0+ICfOqcyAJywKJ+G/uycgPT4gJ86pzIEnLAon4b+8JyA9PiAnzqnNhScsCifhv70nID0+ICfCtCcsCifigIAnID0+ICfigIInLAon4oCBJyA9PiAn4oCDJywKJ+KEpicgPT4gJ86pJywKJ+KEqicgPT4gJ0snLAon4oSrJyA9PiAnQcyKJywKJ+KGmicgPT4gJ+KGkMy4JywKJ+KGmycgPT4gJ+KGksy4JywKJ+KGricgPT4gJ+KGlMy4JywKJ+KHjScgPT4gJ+KHkMy4JywKJ+KHjicgPT4gJ+KHlMy4JywKJ+KHjycgPT4gJ+KHksy4JywKJ+KIhCcgPT4gJ+KIg8y4JywKJ+KIiScgPT4gJ+KIiMy4JywKJ+KIjCcgPT4gJ+KIi8y4JywKJ+KIpCcgPT4gJ+KIo8y4JywKJ+KIpicgPT4gJ+KIpcy4JywKJ+KJgScgPT4gJ+KIvMy4JywKJ+KJhCcgPT4gJ+KJg8y4JywKJ+KJhycgPT4gJ+KJhcy4JywKJ+KJiScgPT4gJ+KJiMy4JywKJ+KJoCcgPT4gJz3MuCcsCifiiaInID0+ICfiiaHMuCcsCifiia0nID0+ICfiiY3MuCcsCifiia4nID0+ICc8zLgnLAon4omvJyA9PiAnPsy4JywKJ+KJsCcgPT4gJ+KJpMy4JywKJ+KJsScgPT4gJ+KJpcy4JywKJ+KJtCcgPT4gJ+KJssy4JywKJ+KJtScgPT4gJ+KJs8y4JywKJ+KJuCcgPT4gJ+KJtsy4JywKJ+KJuScgPT4gJ+KJt8y4JywKJ+KKgCcgPT4gJ+KJusy4JywKJ+KKgScgPT4gJ+KJu8y4JywKJ+KKhCcgPT4gJ+KKgsy4JywKJ+KKhScgPT4gJ+KKg8y4JywKJ+KKiCcgPT4gJ+KKhsy4JywKJ+KKiScgPT4gJ+KKh8y4JywKJ+KKrCcgPT4gJ+KKosy4JywKJ+KKrScgPT4gJ+KKqMy4JywKJ+KKricgPT4gJ+KKqcy4JywKJ+KKrycgPT4gJ+KKq8y4JywKJ+KLoCcgPT4gJ+KJvMy4JywKJ+KLoScgPT4gJ+KJvcy4JywKJ+KLoicgPT4gJ+KKkcy4JywKJ+KLoycgPT4gJ+KKksy4JywKJ+KLqicgPT4gJ+KKssy4JywKJ+KLqycgPT4gJ+KKs8y4JywKJ+KLrCcgPT4gJ+KKtMy4JywKJ+KLrScgPT4gJ+KKtcy4JywKJ+KMqScgPT4gJ+OAiCcsCifijKonID0+ICfjgIknLAon4qucJyA9PiAn4qudzLgnLAon44GMJyA9PiAn44GL44KZJywKJ+OBjicgPT4gJ+OBjeOCmScsCifjgZAnID0+ICfjgY/jgpknLAon44GSJyA9PiAn44GR44KZJywKJ+OBlCcgPT4gJ+OBk+OCmScsCifjgZYnID0+ICfjgZXjgpknLAon44GYJyA9PiAn44GX44KZJywKJ+OBmicgPT4gJ+OBmeOCmScsCifjgZwnID0+ICfjgZvjgpknLAon44GeJyA9PiAn44Gd44KZJywKJ+OBoCcgPT4gJ+OBn+OCmScsCifjgaInID0+ICfjgaHjgpknLAon44GlJyA9PiAn44Gk44KZJywKJ+OBpycgPT4gJ+OBpuOCmScsCifjgaknID0+ICfjgajjgpknLAon44GwJyA9PiAn44Gv44KZJywKJ+OBsScgPT4gJ+OBr+OCmicsCifjgbMnID0+ICfjgbLjgpknLAon44G0JyA9PiAn44Gy44KaJywKJ+OBticgPT4gJ+OBteOCmScsCifjgbcnID0+ICfjgbXjgponLAon44G5JyA9PiAn44G444KZJywKJ+OBuicgPT4gJ+OBuOOCmicsCifjgbwnID0+ICfjgbvjgpknLAon44G9JyA9PiAn44G744KaJywKJ+OClCcgPT4gJ+OBhuOCmScsCifjgp4nID0+ICfjgp3jgpknLAon44KsJyA9PiAn44Kr44KZJywKJ+OCricgPT4gJ+OCreOCmScsCifjgrAnID0+ICfjgq/jgpknLAon44KyJyA9PiAn44Kx44KZJywKJ+OCtCcgPT4gJ+OCs+OCmScsCifjgrYnID0+ICfjgrXjgpknLAon44K4JyA9PiAn44K344KZJywKJ+OCuicgPT4gJ+OCueOCmScsCifjgrwnID0+ICfjgrvjgpknLAon44K+JyA9PiAn44K944KZJywKJ+ODgCcgPT4gJ+OCv+OCmScsCifjg4InID0+ICfjg4HjgpknLAon44OFJyA9PiAn44OE44KZJywKJ+ODhycgPT4gJ+ODhuOCmScsCifjg4knID0+ICfjg4jjgpknLAon44OQJyA9PiAn44OP44KZJywKJ+ODkScgPT4gJ+ODj+OCmicsCifjg5MnID0+ICfjg5LjgpknLAon44OUJyA9PiAn44OS44KaJywKJ+ODlicgPT4gJ+ODleOCmScsCifjg5cnID0+ICfjg5XjgponLAon44OZJyA9PiAn44OY44KZJywKJ+ODmicgPT4gJ+ODmOOCmicsCifjg5wnID0+ICfjg5vjgpknLAon44OdJyA9PiAn44Ob44KaJywKJ+ODtCcgPT4gJ+OCpuOCmScsCifjg7cnID0+ICfjg6/jgpknLAon44O4JyA9PiAn44Ow44KZJywKJ+ODuScgPT4gJ+ODseOCmScsCifjg7onID0+ICfjg7LjgpknLAon44O+JyA9PiAn44O944KZJywKJ++kgCcgPT4gJ+ixiCcsCifvpIEnID0+ICfmm7QnLAon76SCJyA9PiAn6LuKJywKJ++kgycgPT4gJ+iziCcsCifvpIQnID0+ICfmu5EnLAon76SFJyA9PiAn5LiyJywKJ++khicgPT4gJ+WPpScsCifvpIcnID0+ICfpvpwnLAon76SIJyA9PiAn6b6cJywKJ++kiScgPT4gJ+WlkScsCifvpIonID0+ICfph5EnLAon76SLJyA9PiAn5ZaHJywKJ++kjCcgPT4gJ+WliCcsCifvpI0nID0+ICfmh7YnLAon76SOJyA9PiAn55mpJywKJ++kjycgPT4gJ+e+hScsCifvpJAnID0+ICfomL8nLAon76SRJyA9PiAn6J66JywKJ++kkicgPT4gJ+ijuCcsCifvpJMnID0+ICfpgo8nLAon76SUJyA9PiAn5qiCJywKJ++klScgPT4gJ+a0mycsCifvpJYnID0+ICfng5knLAon76SXJyA9PiAn54+eJywKJ++kmCcgPT4gJ+iQvScsCifvpJknID0+ICfphaonLAon76SaJyA9PiAn6aexJywKJ++kmycgPT4gJ+S6gicsCifvpJwnID0+ICfljbUnLAon76SdJyA9PiAn5qyEJywKJ++knicgPT4gJ+eImycsCifvpJ8nID0+ICfomK0nLAon76SgJyA9PiAn6bieJywKJ++koScgPT4gJ+W1kCcsCifvpKInID0+ICfmv6snLAon76SjJyA9PiAn6JeNJywKJ++kpCcgPT4gJ+ilpCcsCifvpKUnID0+ICfmi4knLAon76SmJyA9PiAn6IeYJywKJ++kpycgPT4gJ+ignycsCifvpKgnID0+ICflu4onLAon76SpJyA9PiAn5pyXJywKJ++kqicgPT4gJ+a1qicsCifvpKsnID0+ICfni7wnLAon76SsJyA9PiAn6YOOJywKJ++krScgPT4gJ+S+hicsCifvpK4nID0+ICflhrcnLAon76SvJyA9PiAn5YueJywKJ++ksCcgPT4gJ+aThCcsCifvpLEnID0+ICfmq5MnLAon76SyJyA9PiAn54iQJywKJ++ksycgPT4gJ+ebpycsCifvpLQnID0+ICfogIEnLAon76S1JyA9PiAn6JiGJywKJ++kticgPT4gJ+iZnCcsCifvpLcnID0+ICfot68nLAon76S4JyA9PiAn6ZyyJywKJ++kuScgPT4gJ+mtrycsCifvpLonID0+ICfpt7onLAon76S7JyA9PiAn56KMJywKJ++kvCcgPT4gJ+elvycsCifvpL0nID0+ICfntqAnLAon76S+JyA9PiAn6I+JJywKJ++kvycgPT4gJ+mMhCcsCifvpYAnID0+ICfpub8nLAon76WBJyA9PiAn6KuWJywKJ++lgicgPT4gJ+WjnycsCifvpYMnID0+ICflvIQnLAon76WEJyA9PiAn57GgJywKJ++lhScgPT4gJ+iBvicsCifvpYYnID0+ICfniaInLAon76WHJyA9PiAn56OKJywKJ++liCcgPT4gJ+izgicsCifvpYknID0+ICfpm7cnLAon76WKJyA9PiAn5aOYJywKJ++liycgPT4gJ+WxoicsCifvpYwnID0+ICfmqJMnLAon76WNJyA9PiAn5reaJywKJ++ljicgPT4gJ+a8jycsCifvpY8nID0+ICfntK8nLAon76WQJyA9PiAn57i3JywKJ++lkScgPT4gJ+mZiycsCifvpZInID0+ICfli5InLAon76WTJyA9PiAn6IKLJywKJ++llCcgPT4gJ+WHnCcsCifvpZUnID0+ICflh4wnLAon76WWJyA9PiAn56icJywKJ++llycgPT4gJ+e2vicsCifvpZgnID0+ICfoj7EnLAon76WZJyA9PiAn6Zm1JywKJ++lmicgPT4gJ+iugCcsCifvpZsnID0+ICfmi48nLAon76WcJyA9PiAn5qiCJywKJ++lnScgPT4gJ+irvicsCifvpZ4nID0+ICfkuLknLAon76WfJyA9PiAn5a+nJywKJ++loCcgPT4gJ+aAkicsCifvpaEnID0+ICfnjocnLAon76WiJyA9PiAn55WwJywKJ++loycgPT4gJ+WMlycsCifvpaQnID0+ICfno7snLAon76WlJyA9PiAn5L6/JywKJ++lpicgPT4gJ+W+qScsCifvpacnID0+ICfkuI0nLAon76WoJyA9PiAn5rOMJywKJ++lqScgPT4gJ+aVuCcsCifvpaonID0+ICfntKInLAon76WrJyA9PiAn5Y+DJywKJ++lrCcgPT4gJ+WhnicsCifvpa0nID0+ICfnnIEnLAon76WuJyA9PiAn6JGJJywKJ++lrycgPT4gJ+iqqicsCifvpbAnID0+ICfmrronLAon76WxJyA9PiAn6L6wJywKJ++lsicgPT4gJ+ayiCcsCifvpbMnID0+ICfmi74nLAon76W0JyA9PiAn6IulJywKJ++ltScgPT4gJ+aOoCcsCifvpbYnID0+ICfnlaUnLAon76W3JyA9PiAn5LquJywKJ++luCcgPT4gJ+WFqScsCifvpbknID0+ICflh4knLAon76W6JyA9PiAn5qKBJywKJ++luycgPT4gJ+ezpycsCifvpbwnID0+ICfoia8nLAon76W9JyA9PiAn6KuSJywKJ++lvicgPT4gJ+mHjycsCifvpb8nID0+ICfli7UnLAon76aAJyA9PiAn5ZGCJywKJ++mgScgPT4gJ+WlsycsCifvpoInID0+ICflu6wnLAon76aDJyA9PiAn5peFJywKJ++mhCcgPT4gJ+a/vicsCifvpoUnID0+ICfnpKonLAon76aGJyA9PiAn6ZatJywKJ++mhycgPT4gJ+mpqicsCifvpognID0+ICfpupcnLAon76aJJyA9PiAn6buOJywKJ++miicgPT4gJ+WKmycsCifvposnID0+ICfmm4YnLAon76aMJyA9PiAn5q23JywKJ++mjScgPT4gJ+i9oicsCifvpo4nID0+ICflubQnLAon76aPJyA9PiAn5oaQJywKJ++mkCcgPT4gJ+aIgCcsCifvppEnID0+ICfmkponLAon76aSJyA9PiAn5ryjJywKJ++mkycgPT4gJ+eFiScsCifvppQnID0+ICfnkoknLAon76aVJyA9PiAn56eKJywKJ++mlicgPT4gJ+e3tCcsCifvppcnID0+ICfoga8nLAon76aYJyA9PiAn6LymJywKJ++mmScgPT4gJ+iTricsCifvpponID0+ICfpgKMnLAon76abJyA9PiAn6Y2KJywKJ++mnCcgPT4gJ+WIlycsCifvpp0nID0+ICfliqMnLAon76aeJyA9PiAn5ZK9JywKJ++mnycgPT4gJ+eDiCcsCifvpqAnID0+ICfoo4InLAon76ahJyA9PiAn6KqqJywKJ++moicgPT4gJ+W7iScsCifvpqMnID0+ICflv7UnLAon76akJyA9PiAn5o27JywKJ++mpScgPT4gJ+auricsCifvpqYnID0+ICfnsL4nLAon76anJyA9PiAn5421JywKJ++mqCcgPT4gJ+S7pCcsCifvpqknID0+ICflm7knLAon76aqJyA9PiAn5a+nJywKJ++mqycgPT4gJ+W2uicsCifvpqwnID0+ICfmgJwnLAon76atJyA9PiAn546yJywKJ++mricgPT4gJ+eRqScsCifvpq8nID0+ICfnvponLAon76awJyA9PiAn6IGGJywKJ++msScgPT4gJ+mItCcsCifvprInID0+ICfpm7YnLAon76azJyA9PiAn6Z2IJywKJ++mtCcgPT4gJ+mgmCcsCifvprUnID0+ICfkvosnLAon76a2JyA9PiAn56auJywKJ++mtycgPT4gJ+mGtCcsCifvprgnID0+ICfpmrgnLAon76a5JyA9PiAn5oOhJywKJ++muicgPT4gJ+S6hicsCifvprsnID0+ICflg5onLAon76a8JyA9PiAn5a+uJywKJ++mvScgPT4gJ+WwvycsCifvpr4nID0+ICfmlpknLAon76a/JyA9PiAn5qiCJywKJ++ngCcgPT4gJ+eHjicsCifvp4EnID0+ICfnmYInLAon76eCJyA9PiAn6JO8JywKJ++ngycgPT4gJ+mBvCcsCifvp4QnID0+ICfpvo0nLAon76eFJyA9PiAn5pqIJywKJ++nhicgPT4gJ+mYricsCifvp4cnID0+ICflioknLAon76eIJyA9PiAn5p27JywKJ++niScgPT4gJ+afsycsCifvp4onID0+ICfmtYEnLAon76eLJyA9PiAn5rqcJywKJ++njCcgPT4gJ+eQiScsCifvp40nID0+ICfnlZknLAon76eOJyA9PiAn56GrJywKJ++njycgPT4gJ+e0kCcsCifvp5AnID0+ICfpoZ4nLAon76eRJyA9PiAn5YWtJywKJ++nkicgPT4gJ+aIricsCifvp5MnID0+ICfpmbgnLAon76eUJyA9PiAn5YCrJywKJ++nlScgPT4gJ+W0mScsCifvp5YnID0+ICfmt6onLAon76eXJyA9PiAn6LyqJywKJ++nmCcgPT4gJ+W+iycsCifvp5knID0+ICfmhYQnLAon76eaJyA9PiAn5qCXJywKJ++nmycgPT4gJ+eOhycsCifvp5wnID0+ICfpmoYnLAon76edJyA9PiAn5YipJywKJ++nnicgPT4gJ+WQjycsCifvp58nID0+ICflsaUnLAon76egJyA9PiAn5piTJywKJ++noScgPT4gJ+adjicsCifvp6InID0+ICfmoqgnLAon76ejJyA9PiAn5rOlJywKJ++npCcgPT4gJ+eQhicsCifvp6UnID0+ICfnl6InLAon76emJyA9PiAn5725JywKJ++npycgPT4gJ+ijjycsCifvp6gnID0+ICfoo6EnLAon76epJyA9PiAn6YeMJywKJ++nqicgPT4gJ+mboicsCifvp6snID0+ICfljL8nLAon76esJyA9PiAn5rq6JywKJ++nrScgPT4gJ+WQnScsCifvp64nID0+ICfnh5AnLAon76evJyA9PiAn55KYJywKJ++nsCcgPT4gJ+iXuicsCifvp7EnID0+ICfpmqMnLAon76eyJyA9PiAn6bGXJywKJ++nsycgPT4gJ+m6nycsCifvp7QnID0+ICfmnpcnLAon76e1JyA9PiAn5reLJywKJ++nticgPT4gJ+iHqCcsCifvp7cnID0+ICfnq4snLAon76e4JyA9PiAn56ygJywKJ++nuScgPT4gJ+eykicsCifvp7onID0+ICfni4AnLAon76e7JyA9PiAn54KZJywKJ++nvCcgPT4gJ+itmCcsCifvp70nID0+ICfku4AnLAon76e+JyA9PiAn6Iy2JywKJ++nvycgPT4gJ+WIuicsCifvqIAnID0+ICfliIcnLAon76iBJyA9PiAn5bqmJywKJ++ogicgPT4gJ+aLkycsCifvqIMnID0+ICfns5YnLAon76iEJyA9PiAn5a6FJywKJ++ohScgPT4gJ+a0nicsCifvqIYnID0+ICfmmrQnLAon76iHJyA9PiAn6Ly7JywKJ++oiCcgPT4gJ+ihjCcsCifvqIknID0+ICfpmY0nLAon76iKJyA9PiAn6KaLJywKJ++oiycgPT4gJ+W7kycsCifvqIwnID0+ICflhYAnLAon76iNJyA9PiAn5ZeAJywKJ++okCcgPT4gJ+WhmicsCifvqJInID0+ICfmmbQnLAon76iVJyA9PiAn5YeeJywKJ++olicgPT4gJ+eMqicsCifvqJcnID0+ICfnm4onLAon76iYJyA9PiAn56S8JywKJ++omScgPT4gJ+elnicsCifvqJonID0+ICfnpaUnLAon76ibJyA9PiAn56aPJywKJ++onCcgPT4gJ+mdlicsCifvqJ0nID0+ICfnsr4nLAon76ieJyA9PiAn5769JywKJ++ooCcgPT4gJ+iYkicsCifvqKInID0+ICfoq7gnLAon76ilJyA9PiAn6YC4JywKJ++opicgPT4gJ+mDvScsCifvqKonID0+ICfpo68nLAon76irJyA9PiAn6aO8JywKJ++orCcgPT4gJ+mkqCcsCifvqK0nID0+ICfptrQnLAon76iuJyA9PiAn6YOeJywKJ++orycgPT4gJ+matycsCifvqLAnID0+ICfkvq4nLAon76ixJyA9PiAn5YOnJywKJ++osicgPT4gJ+WFjScsCifvqLMnID0+ICfli4knLAon76i0JyA9PiAn5YukJywKJ++otScgPT4gJ+WNkScsCifvqLYnID0+ICfllp0nLAon76i3JyA9PiAn5ZiGJywKJ++ouCcgPT4gJ+WZqCcsCifvqLknID0+ICfloYAnLAon76i6JyA9PiAn5aKoJywKJ++ouycgPT4gJ+WxpCcsCifvqLwnID0+ICflsa4nLAon76i9JyA9PiAn5oKUJywKJ++ovicgPT4gJ+aFqCcsCifvqL8nID0+ICfmho4nLAon76mAJyA9PiAn5oeyJywKJ++pgScgPT4gJ+aVjycsCifvqYInID0+ICfml6InLAon76mDJyA9PiAn5pqRJywKJ++phCcgPT4gJ+aihScsCifvqYUnID0+ICfmtbcnLAon76mGJyA9PiAn5riaJywKJ++phycgPT4gJ+a8oicsCifvqYgnID0+ICfnha4nLAon76mJJyA9PiAn54irJywKJ++piicgPT4gJ+eQoicsCifvqYsnID0+ICfnopEnLAon76mMJyA9PiAn56S+JywKJ++pjScgPT4gJ+eliScsCifvqY4nID0+ICfnpYgnLAon76mPJyA9PiAn56WQJywKJ++pkCcgPT4gJ+ellicsCifvqZEnID0+ICfnpZ0nLAon76mSJyA9PiAn56aNJywKJ++pkycgPT4gJ+emjicsCifvqZQnID0+ICfnqYAnLAon76mVJyA9PiAn56qBJywKJ++plicgPT4gJ+evgCcsCifvqZcnID0+ICfnt7QnLAon76mYJyA9PiAn57iJJywKJ++pmScgPT4gJ+e5gScsCifvqZonID0+ICfnvbInLAon76mbJyA9PiAn6ICFJywKJ++pnCcgPT4gJ+iHrScsCifvqZ0nID0+ICfoibknLAon76meJyA9PiAn6Im5JywKJ++pnycgPT4gJ+iRlycsCifvqaAnID0+ICfopJAnLAon76mhJyA9PiAn6KaWJywKJ++poicgPT4gJ+isgScsCifvqaMnID0+ICforLknLAon76mkJyA9PiAn6LOTJywKJ++ppScgPT4gJ+i0iCcsCifvqaYnID0+ICfovrYnLAon76mnJyA9PiAn6YC4JywKJ++pqCcgPT4gJ+mboycsCifvqaknID0+ICfpn78nLAon76mqJyA9PiAn6aC7JywKJ++pqycgPT4gJ+aBtScsCifvqawnID0+ICfwpIuuJywKJ++prScgPT4gJ+iImCcsCifvqbAnID0+ICfkuKYnLAon76mxJyA9PiAn5Ya1JywKJ++psicgPT4gJ+WFqCcsCifvqbMnID0+ICfkvoAnLAon76m0JyA9PiAn5YWFJywKJ++ptScgPT4gJ+WGgCcsCifvqbYnID0+ICfli4cnLAon76m3JyA9PiAn5Yu6JywKJ++puCcgPT4gJ+WWnScsCifvqbknID0+ICfllZUnLAon76m6JyA9PiAn5ZaZJywKJ++puycgPT4gJ+WXoicsCifvqbwnID0+ICfloZonLAon76m9JyA9PiAn5aKzJywKJ++pvicgPT4gJ+WlhCcsCifvqb8nID0+ICflpZQnLAon76qAJyA9PiAn5amiJywKJ++qgScgPT4gJ+WsqCcsCifvqoInID0+ICflu5InLAon76qDJyA9PiAn5buZJywKJ++qhCcgPT4gJ+W9qScsCifvqoUnID0+ICflvq0nLAon76qGJyA9PiAn5oOYJywKJ++qhycgPT4gJ+aFjicsCifvqognID0+ICfmhIgnLAon76qJJyA9PiAn5oaOJywKJ++qiicgPT4gJ+aFoCcsCifvqosnID0+ICfmh7InLAon76qMJyA9PiAn5oi0JywKJ++qjScgPT4gJ+aPhCcsCifvqo4nID0+ICfmkJwnLAon76qPJyA9PiAn5pGSJywKJ++qkCcgPT4gJ+aVlicsCifvqpEnID0+ICfmmbQnLAon76qSJyA9PiAn5pyXJywKJ++qkycgPT4gJ+acmycsCifvqpQnID0+ICfmnZYnLAon76qVJyA9PiAn5q25JywKJ++qlicgPT4gJ+auuicsCifvqpcnID0+ICfmtYEnLAon76qYJyA9PiAn5rubJywKJ++qmScgPT4gJ+a7iycsCifvqponID0+ICfmvKInLAon76qbJyA9PiAn54CeJywKJ++qnCcgPT4gJ+eFricsCifvqp0nID0+ICfnnqcnLAon76qeJyA9PiAn54i1JywKJ++qnycgPT4gJ+eKrycsCifvqqAnID0+ICfnjKonLAon76qhJyA9PiAn55GxJywKJ++qoicgPT4gJ+eUhicsCifvqqMnID0+ICfnlLsnLAon76qkJyA9PiAn55idJywKJ++qpScgPT4gJ+eYnycsCifvqqYnID0+ICfnm4onLAon76qnJyA9PiAn55ubJywKJ++qqCcgPT4gJ+ebtCcsCifvqqknID0+ICfnnYonLAon76qqJyA9PiAn552AJywKJ++qqycgPT4gJ+ejjCcsCifvqqwnID0+ICfnqrEnLAon76qtJyA9PiAn56+AJywKJ++qricgPT4gJ+exuycsCifvqq8nID0+ICfntZsnLAon76qwJyA9PiAn57e0JywKJ++qsScgPT4gJ+e8vicsCifvqrInID0+ICfogIUnLAon76qzJyA9PiAn6I2SJywKJ++qtCcgPT4gJ+iPrycsCifvqrUnID0+ICfonbknLAon76q2JyA9PiAn6KWBJywKJ++qtycgPT4gJ+imhicsCifvqrgnID0+ICfoppYnLAon76q5JyA9PiAn6Kq/JywKJ++quicgPT4gJ+iruCcsCifvqrsnID0+ICfoq4snLAon76q8JyA9PiAn6KyBJywKJ++qvScgPT4gJ+irvicsCifvqr4nID0+ICfoq60nLAon76q/JyA9PiAn6Ky5JywKJ++rgCcgPT4gJ+iuiicsCifvq4EnID0+ICfotIgnLAon76uCJyA9PiAn6Ly4JywKJ++rgycgPT4gJ+mBsicsCifvq4QnID0+ICfphpknLAon76uFJyA9PiAn6Ym2JywKJ++rhicgPT4gJ+mZvCcsCifvq4cnID0+ICfpm6MnLAon76uIJyA9PiAn6Z2WJywKJ++riScgPT4gJ+mfmycsCifvq4onID0+ICfpn78nLAon76uLJyA9PiAn6aCLJywKJ++rjCcgPT4gJ+mguycsCifvq40nID0+ICfprJInLAon76uOJyA9PiAn6b6cJywKJ++rjycgPT4gJ/CioYonLAon76uQJyA9PiAn8KKhhCcsCifvq5EnID0+ICfwo4+VJywKJ++rkicgPT4gJ+OunScsCifvq5MnID0+ICfkgJgnLAon76uUJyA9PiAn5IC5JywKJ++rlScgPT4gJ/CliYknLAon76uWJyA9PiAn8KWzkCcsCifvq5cnID0+ICfwp7uTJywKJ++rmCcgPT4gJ+m9gycsCifvq5knID0+ICfpvo4nLAon76ydJyA9PiAn15nWtCcsCifvrJ8nID0+ICfXsta3JywKJ++sqicgPT4gJ9ep14EnLAon76yrJyA9PiAn16nXgicsCifvrKwnID0+ICfXqda814EnLAon76ytJyA9PiAn16nWvNeCJywKJ++sricgPT4gJ9eQ1rcnLAon76yvJyA9PiAn15DWuCcsCifvrLAnID0+ICfXkNa8JywKJ++ssScgPT4gJ9eR1rwnLAon76yyJyA9PiAn15LWvCcsCifvrLMnID0+ICfXk9a8JywKJ++stCcgPT4gJ9eU1rwnLAon76y1JyA9PiAn15XWvCcsCifvrLYnID0+ICfXlta8JywKJ++suCcgPT4gJ9eY1rwnLAon76y5JyA9PiAn15nWvCcsCifvrLonID0+ICfXmta8JywKJ++suycgPT4gJ9eb1rwnLAon76y8JyA9PiAn15zWvCcsCifvrL4nID0+ICfXnta8JywKJ++tgCcgPT4gJ9eg1rwnLAon762BJyA9PiAn16HWvCcsCifvrYMnID0+ICfXo9a8JywKJ++thCcgPT4gJ9ek1rwnLAon762GJyA9PiAn16bWvCcsCifvrYcnID0+ICfXp9a8JywKJ++tiCcgPT4gJ9eo1rwnLAon762JJyA9PiAn16nWvCcsCifvrYonID0+ICfXqta8JywKJ++tiycgPT4gJ9eV1rknLAon762MJyA9PiAn15HWvycsCifvrY0nID0+ICfXm9a/JywKJ++tjicgPT4gJ9ek1r8nLAon8JGCmicgPT4gJ/CRgpnwkYK6JywKJ/CRgpwnID0+ICfwkYKb8JGCuicsCifwkYKrJyA9PiAn8JGCpfCRgronLAon8JGEricgPT4gJ/CRhLHwkYSnJywKJ/CRhK8nID0+ICfwkYSy8JGEpycsCifwkY2LJyA9PiAn8JGNh/CRjL4nLAon8JGNjCcgPT4gJ/CRjYfwkY2XJywKJ/CRkrsnID0+ICfwkZK58JGSuicsCifwkZK8JyA9PiAn8JGSufCRkrAnLAon8JGSvicgPT4gJ/CRkrnwkZK9JywKJ/CRlronID0+ICfwkZa48JGWrycsCifwkZa7JyA9PiAn8JGWufCRlq8nLAon8JGkuCcgPT4gJ/CRpLXwkaSwJywKJ/CdhZ4nID0+ICfwnYWX8J2FpScsCifwnYWfJyA9PiAn8J2FmPCdhaUnLAon8J2FoCcgPT4gJ/CdhZjwnYWl8J2FricsCifwnYWhJyA9PiAn8J2FmPCdhaXwnYWvJywKJ/CdhaInID0+ICfwnYWY8J2FpfCdhbAnLAon8J2FoycgPT4gJ/CdhZjwnYWl8J2FsScsCifwnYWkJyA9PiAn8J2FmPCdhaXwnYWyJywKJ/CdhrsnID0+ICfwnYa58J2FpScsCifwnYa8JyA9PiAn8J2GuvCdhaUnLAon8J2GvScgPT4gJ/CdhrnwnYWl8J2FricsCifwnYa+JyA9PiAn8J2GuvCdhaXwnYWuJywKJ/Cdhr8nID0+ICfwnYa58J2FpfCdha8nLAon8J2HgCcgPT4gJ/CdhrrwnYWl8J2FrycsCifwr6CAJyA9PiAn5Li9JywKJ/CvoIEnID0+ICfkuLgnLAon8K+ggicgPT4gJ+S5gScsCifwr6CDJyA9PiAn8KCEoicsCifwr6CEJyA9PiAn5L2gJywKJ/CvoIUnID0+ICfkvq4nLAon8K+ghicgPT4gJ+S+uycsCifwr6CHJyA9PiAn5YCCJywKJ/CvoIgnID0+ICflgbonLAon8K+giScgPT4gJ+WCmScsCifwr6CKJyA9PiAn5YOnJywKJ/CvoIsnID0+ICflg48nLAon8K+gjCcgPT4gJ+OSnicsCifwr6CNJyA9PiAn8KCYuicsCifwr6COJyA9PiAn5YWNJywKJ/CvoI8nID0+ICflhZQnLAon8K+gkCcgPT4gJ+WFpCcsCifwr6CRJyA9PiAn5YW3JywKJ/CvoJInID0+ICfwoJScJywKJ/CvoJMnID0+ICfjkrknLAon8K+glCcgPT4gJ+WFpycsCifwr6CVJyA9PiAn5YaNJywKJ/CvoJYnID0+ICfwoJWLJywKJ/CvoJcnID0+ICflhpcnLAon8K+gmCcgPT4gJ+WGpCcsCifwr6CZJyA9PiAn5LuMJywKJ/CvoJonID0+ICflhqwnLAon8K+gmycgPT4gJ+WGtScsCifwr6CcJyA9PiAn8KmHnycsCifwr6CdJyA9PiAn5Ye1JywKJ/CvoJ4nID0+ICfliIMnLAon8K+gnycgPT4gJ+OTnycsCifwr6CgJyA9PiAn5Yi7JywKJ/CvoKEnID0+ICfliYYnLAon8K+goicgPT4gJ+WJsicsCifwr6CjJyA9PiAn5Ym3JywKJ/CvoKQnID0+ICfjlJUnLAon8K+gpScgPT4gJ+WLhycsCifwr6CmJyA9PiAn5YuJJywKJ/CvoKcnID0+ICfli6QnLAon8K+gqCcgPT4gJ+WLuicsCifwr6CpJyA9PiAn5YyFJywKJ/CvoKonID0+ICfljIYnLAon8K+gqycgPT4gJ+WMlycsCifwr6CsJyA9PiAn5Y2JJywKJ/CvoK0nID0+ICfljZEnLAon8K+gricgPT4gJ+WNmicsCifwr6CvJyA9PiAn5Y2zJywKJ/CvoLAnID0+ICfljb0nLAon8K+gsScgPT4gJ+WNvycsCifwr6CyJyA9PiAn5Y2/JywKJ/CvoLMnID0+ICfljb8nLAon8K+gtCcgPT4gJ/CgqKwnLAon8K+gtScgPT4gJ+eBsCcsCifwr6C2JyA9PiAn5Y+KJywKJ/CvoLcnID0+ICflj58nLAon8K+guCcgPT4gJ/CgraMnLAon8K+guScgPT4gJ+WPqycsCifwr6C6JyA9PiAn5Y+xJywKJ/CvoLsnID0+ICflkIYnLAon8K+gvCcgPT4gJ+WSnicsCifwr6C9JyA9PiAn5ZC4JywKJ/CvoL4nID0+ICflkYgnLAon8K+gvycgPT4gJ+WRqCcsCifwr6GAJyA9PiAn5ZKiJywKJ/CvoYEnID0+ICflk7YnLAon8K+hgicgPT4gJ+WUkCcsCifwr6GDJyA9PiAn5ZWTJywKJ/CvoYQnID0+ICfllaMnLAon8K+hhScgPT4gJ+WWhCcsCifwr6GGJyA9PiAn5ZaEJywKJ/CvoYcnID0+ICfllpknLAon8K+hiCcgPT4gJ+WWqycsCifwr6GJJyA9PiAn5ZazJywKJ/CvoYonID0+ICfll4InLAon8K+hiycgPT4gJ+WclicsCifwr6GMJyA9PiAn5ZiGJywKJ/CvoY0nID0+ICflnJcnLAon8K+hjicgPT4gJ+WZkScsCifwr6GPJyA9PiAn5Zm0JywKJ/CvoZAnID0+ICfliIcnLAon8K+hkScgPT4gJ+WjricsCifwr6GSJyA9PiAn5Z+OJywKJ/CvoZMnID0+ICfln7QnLAon8K+hlCcgPT4gJ+WgjScsCifwr6GVJyA9PiAn5Z6LJywKJ/CvoZYnID0+ICfloLInLAon8K+hlycgPT4gJ+WgsScsCifwr6GYJyA9PiAn5aKsJywKJ/CvoZknID0+ICfwoZOkJywKJ/CvoZonID0+ICflo7InLAon8K+hmycgPT4gJ+WjtycsCifwr6GcJyA9PiAn5aSGJywKJ/CvoZ0nID0+ICflpJonLAon8K+hnicgPT4gJ+WkoicsCifwr6GfJyA9PiAn5aWiJywKJ/CvoaAnID0+ICfwoZqoJywKJ/CvoaEnID0+ICfwoZuqJywKJ/CvoaInID0+ICflp6wnLAon8K+hoycgPT4gJ+WomycsCifwr6GkJyA9PiAn5ainJywKJ/CvoaUnID0+ICflp5gnLAon8K+hpicgPT4gJ+WppicsCifwr6GnJyA9PiAn45uuJywKJ/CvoagnID0+ICfjm7wnLAon8K+hqScgPT4gJ+WsiCcsCifwr6GqJyA9PiAn5ay+JywKJ/CvoasnID0+ICflrL4nLAon8K+hrCcgPT4gJ/Chp4gnLAon8K+hrScgPT4gJ+WvgycsCifwr6GuJyA9PiAn5a+YJywKJ/Cvoa8nID0+ICflr6cnLAon8K+hsCcgPT4gJ+WvsycsCifwr6GxJyA9PiAn8KGsmCcsCifwr6GyJyA9PiAn5a+/JywKJ/CvobMnID0+ICflsIYnLAon8K+htCcgPT4gJ+W9kycsCifwr6G1JyA9PiAn5bCiJywKJ/CvobYnID0+ICfjnoEnLAon8K+htycgPT4gJ+WxoCcsCifwr6G4JyA9PiAn5bGuJywKJ/CvobknID0+ICfls4AnLAon8K+huicgPT4gJ+WyjScsCifwr6G7JyA9PiAn8KG3pCcsCifwr6G8JyA9PiAn5bWDJywKJ/Cvob0nID0+ICfwobemJywKJ/Cvob4nID0+ICflta4nLAon8K+hvycgPT4gJ+W1qycsCifwr6KAJyA9PiAn5bW8JywKJ/CvooEnID0+ICflt6EnLAon8K+igicgPT4gJ+W3oicsCifwr6KDJyA9PiAn46CvJywKJ/CvooQnID0+ICflt70nLAon8K+ihScgPT4gJ+W4qCcsCifwr6KGJyA9PiAn5bi9JywKJ/CvoocnID0+ICfluaknLAon8K+iiCcgPT4gJ+OhoicsCifwr6KJJyA9PiAn8KKGgycsCifwr6KKJyA9PiAn46G8JywKJ/CvoosnID0+ICflurAnLAon8K+ijCcgPT4gJ+W6sycsCifwr6KNJyA9PiAn5bq2JywKJ/Cvoo4nID0+ICflu4onLAon8K+ijycgPT4gJ/CqjpInLAon8K+ikCcgPT4gJ+W7vicsCifwr6KRJyA9PiAn8KKMsScsCifwr6KSJyA9PiAn8KKMsScsCifwr6KTJyA9PiAn6IiBJywKJ/CvopQnID0+ICflvKInLAon8K+ilScgPT4gJ+W8oicsCifwr6KWJyA9PiAn46OHJywKJ/CvopcnID0+ICfwo4q4JywKJ/CvopgnID0+ICfwpoeaJywKJ/CvopknID0+ICflvaInLAon8K+imicgPT4gJ+W9qycsCifwr6KbJyA9PiAn46OjJywKJ/CvopwnID0+ICflvponLAon8K+inScgPT4gJ+W/jScsCifwr6KeJyA9PiAn5b+XJywKJ/Cvop8nID0+ICflv7knLAon8K+ioCcgPT4gJ+aCgScsCifwr6KhJyA9PiAn46S6JywKJ/CvoqInID0+ICfjpJwnLAon8K+ioycgPT4gJ+aClCcsCifwr6KkJyA9PiAn8KKblCcsCifwr6KlJyA9PiAn5oOHJywKJ/CvoqYnID0+ICfmhYgnLAon8K+ipycgPT4gJ+aFjCcsCifwr6KoJyA9PiAn5oWOJywKJ/CvoqknID0+ICfmhYwnLAon8K+iqicgPT4gJ+aFuicsCifwr6KrJyA9PiAn5oaOJywKJ/CvoqwnID0+ICfmhrInLAon8K+irScgPT4gJ+aGpCcsCifwr6KuJyA9PiAn5oavJywKJ/Cvoq8nID0+ICfmh54nLAon8K+isCcgPT4gJ+aHsicsCifwr6KxJyA9PiAn5oe2JywKJ/CvorInID0+ICfmiJAnLAon8K+isycgPT4gJ+aImycsCifwr6K0JyA9PiAn5omdJywKJ/CvorUnID0+ICfmirEnLAon8K+iticgPT4gJ+aLlCcsCifwr6K3JyA9PiAn5o2QJywKJ/CvorgnID0+ICfwoqyMJywKJ/CvorknID0+ICfmjL0nLAon8K+iuicgPT4gJ+aLvCcsCifwr6K7JyA9PiAn5o2oJywKJ/CvorwnID0+ICfmjoMnLAon8K+ivScgPT4gJ+aPpCcsCifwr6K+JyA9PiAn8KKvsScsCifwr6K/JyA9PiAn5pCiJywKJ/Cvo4AnID0+ICfmj4UnLAon8K+jgScgPT4gJ+aOqScsCifwr6OCJyA9PiAn46iuJywKJ/Cvo4MnID0+ICfmkaknLAon8K+jhCcgPT4gJ+aRvicsCifwr6OFJyA9PiAn5pKdJywKJ/Cvo4YnID0+ICfmkbcnLAon8K+jhycgPT4gJ+OprCcsCifwr6OIJyA9PiAn5pWPJywKJ/Cvo4knID0+ICfmlawnLAon8K+jiicgPT4gJ/CjgIonLAon8K+jiycgPT4gJ+aXoycsCifwr6OMJyA9PiAn5pu4JywKJ/Cvo40nID0+ICfmmYknLAon8K+jjicgPT4gJ+OsmScsCifwr6OPJyA9PiAn5pqRJywKJ/Cvo5AnID0+ICfjrIgnLAon8K+jkScgPT4gJ+OrpCcsCifwr6OSJyA9PiAn5YaSJywKJ/Cvo5MnID0+ICflhpUnLAon8K+jlCcgPT4gJ+acgCcsCifwr6OVJyA9PiAn5pqcJywKJ/Cvo5YnID0+ICfogq0nLAon8K+jlycgPT4gJ+SPmScsCifwr6OYJyA9PiAn5pyXJywKJ/Cvo5knID0+ICfmnJsnLAon8K+jmicgPT4gJ+acoScsCifwr6ObJyA9PiAn5p2eJywKJ/Cvo5wnID0+ICfmnZMnLAon8K+jnScgPT4gJ/Cjj4MnLAon8K+jnicgPT4gJ+OtiScsCifwr6OfJyA9PiAn5p+6JywKJ/Cvo6AnID0+ICfmnoUnLAon8K+joScgPT4gJ+ahkicsCifwr6OiJyA9PiAn5qKFJywKJ/Cvo6MnID0+ICfwo5GtJywKJ/Cvo6QnID0+ICfmoo4nLAon8K+jpScgPT4gJ+agnycsCifwr6OmJyA9PiAn5qSUJywKJ/Cvo6cnID0+ICfjrp0nLAon8K+jqCcgPT4gJ+algicsCifwr6OpJyA9PiAn5qajJywKJ/Cvo6onID0+ICfmp6onLAon8K+jqycgPT4gJ+aqqCcsCifwr6OsJyA9PiAn8KOaoycsCifwr6OtJyA9PiAn5qubJywKJ/Cvo64nID0+ICfjsJgnLAon8K+jrycgPT4gJ+asoScsCifwr6OwJyA9PiAn8KOipycsCifwr6OxJyA9PiAn5q2UJywKJ/Cvo7InID0+ICfjsY4nLAon8K+jsycgPT4gJ+atsicsCifwr6O0JyA9PiAn5q6fJywKJ/Cvo7UnID0+ICfmrronLAon8K+jticgPT4gJ+auuycsCifwr6O3JyA9PiAn8KOqjScsCifwr6O4JyA9PiAn8KG0iycsCifwr6O5JyA9PiAn8KOruicsCifwr6O6JyA9PiAn5rGOJywKJ/Cvo7snID0+ICfwo7K8JywKJ/Cvo7wnID0+ICfmsr8nLAon8K+jvScgPT4gJ+azjScsCifwr6O+JyA9PiAn5rGnJywKJ/Cvo78nID0+ICfmtJYnLAon8K+kgCcgPT4gJ+a0vicsCifwr6SBJyA9PiAn5rW3JywKJ/CvpIInID0+ICfmtYEnLAon8K+kgycgPT4gJ+a1qScsCifwr6SEJyA9PiAn5rW4JywKJ/CvpIUnID0+ICfmtoUnLAon8K+khicgPT4gJ/CjtJ4nLAon8K+khycgPT4gJ+a0tCcsCifwr6SIJyA9PiAn5rivJywKJ/CvpIknID0+ICfmua4nLAon8K+kiicgPT4gJ+O0sycsCifwr6SLJyA9PiAn5ruLJywKJ/CvpIwnID0+ICfmu4cnLAon8K+kjScgPT4gJ/Cju5EnLAon8K+kjicgPT4gJ+a3uScsCifwr6SPJyA9PiAn5r2uJywKJ/CvpJAnID0+ICfwo72eJywKJ/CvpJEnID0+ICfwo76OJywKJ/CvpJInID0+ICfmv4YnLAon8K+kkycgPT4gJ+eAuScsCifwr6SUJyA9PiAn54CeJywKJ/CvpJUnID0+ICfngJsnLAon8K+klicgPT4gJ+O2licsCifwr6SXJyA9PiAn54GKJywKJ/CvpJgnID0+ICfngb0nLAon8K+kmScgPT4gJ+eBtycsCifwr6SaJyA9PiAn54KtJywKJ/CvpJsnID0+ICfwoJSlJywKJ/CvpJwnID0+ICfnhYUnLAon8K+knScgPT4gJ/CkiaMnLAon8K+knicgPT4gJ+eGnCcsCifwr6SfJyA9PiAn8KSOqycsCifwr6SgJyA9PiAn54ioJywKJ/CvpKEnID0+ICfniLUnLAon8K+koicgPT4gJ+eJkCcsCifwr6SjJyA9PiAn8KSYiCcsCifwr6SkJyA9PiAn54qAJywKJ/CvpKUnID0+ICfnipUnLAon8K+kpicgPT4gJ/CknLUnLAon8K+kpycgPT4gJ/CkoJQnLAon8K+kqCcgPT4gJ+eNuicsCifwr6SpJyA9PiAn546LJywKJ/CvpKonID0+ICfjuqwnLAon8K+kqycgPT4gJ+eOpScsCifwr6SsJyA9PiAn47q4JywKJ/CvpK0nID0+ICfjurgnLAon8K+kricgPT4gJ+eRhycsCifwr6SvJyA9PiAn55GcJywKJ/CvpLAnID0+ICfnkbEnLAon8K+ksScgPT4gJ+eShScsCifwr6SyJyA9PiAn55OKJywKJ/CvpLMnID0+ICfjvJsnLAon8K+ktCcgPT4gJ+eUpCcsCifwr6S1JyA9PiAn8KSwticsCifwr6S2JyA9PiAn55S+JywKJ/CvpLcnID0+ICfwpLKSJywKJ/CvpLgnID0+ICfnlbAnLAon8K+kuScgPT4gJ/Cihp8nLAon8K+kuicgPT4gJ+eYkCcsCifwr6S7JyA9PiAn8KS+oScsCifwr6S8JyA9PiAn8KS+uCcsCifwr6S9JyA9PiAn8KWBhCcsCifwr6S+JyA9PiAn47+8JywKJ/CvpL8nID0+ICfkgIgnLAon8K+lgCcgPT4gJ+ebtCcsCifwr6WBJyA9PiAn8KWDsycsCifwr6WCJyA9PiAn8KWDsicsCifwr6WDJyA9PiAn8KWEmScsCifwr6WEJyA9PiAn8KWEsycsCifwr6WFJyA9PiAn55yeJywKJ/CvpYYnID0+ICfnnJ8nLAon8K+lhycgPT4gJ+ecnycsCifwr6WIJyA9PiAn552KJywKJ/CvpYknID0+ICfkgLknLAon8K+liicgPT4gJ+eeiycsCifwr6WLJyA9PiAn5IGGJywKJ/CvpYwnID0+ICfkgpYnLAon8K+ljScgPT4gJ/ClkJ0nLAon8K+ljicgPT4gJ+ehjicsCifwr6WPJyA9PiAn56KMJywKJ/CvpZAnID0+ICfno4wnLAon8K+lkScgPT4gJ+SDoycsCifwr6WSJyA9PiAn8KWYpicsCifwr6WTJyA9PiAn56WWJywKJ/CvpZQnID0+ICfwpZqaJywKJ/CvpZUnID0+ICfwpZuFJywKJ/CvpZYnID0+ICfnpo8nLAon8K+llycgPT4gJ+enqycsCifwr6WYJyA9PiAn5ISvJywKJ/CvpZknID0+ICfnqYAnLAon8K+lmicgPT4gJ+epiicsCifwr6WbJyA9PiAn56mPJywKJ/CvpZwnID0+ICfwpaW8JywKJ/CvpZ0nID0+ICfwpaqnJywKJ/CvpZ4nID0+ICfwpaqnJywKJ/CvpZ8nID0+ICfnq64nLAon8K+loCcgPT4gJ+SIgicsCifwr6WhJyA9PiAn8KWuqycsCifwr6WiJyA9PiAn56+GJywKJ/CvpaMnID0+ICfnr4knLAon8K+lpCcgPT4gJ+SIpycsCifwr6WlJyA9PiAn8KWygCcsCifwr6WmJyA9PiAn57OSJywKJ/CvpacnID0+ICfkiqAnLAon8K+lqCcgPT4gJ+ezqCcsCifwr6WpJyA9PiAn57OjJywKJ/CvpaonID0+ICfntIAnLAon8K+lqycgPT4gJ/ClvoYnLAon8K+lrCcgPT4gJ+e1oycsCifwr6WtJyA9PiAn5IyBJywKJ/Cvpa4nID0+ICfnt4cnLAon8K+lrycgPT4gJ+e4gicsCifwr6WwJyA9PiAn57mFJywKJ/CvpbEnID0+ICfkjLQnLAon8K+lsicgPT4gJ/CmiKgnLAon8K+lsycgPT4gJ/CmiYcnLAon8K+ltCcgPT4gJ+SNmScsCifwr6W1JyA9PiAn8KaLmScsCifwr6W2JyA9PiAn5726JywKJ/CvpbcnID0+ICfwpoy+JywKJ/CvpbgnID0+ICfnvpUnLAon8K+luScgPT4gJ+e/uicsCifwr6W6JyA9PiAn6ICFJywKJ/CvpbsnID0+ICfwppOaJywKJ/CvpbwnID0+ICfwppSjJywKJ/Cvpb0nID0+ICfogaAnLAon8K+lvicgPT4gJ/CmlqgnLAon8K+lvycgPT4gJ+iBsCcsCifwr6aAJyA9PiAn8KONnycsCifwr6aBJyA9PiAn5I+VJywKJ/CvpoInID0+ICfogrInLAon8K+mgycgPT4gJ+iEgycsCifwr6aEJyA9PiAn5JCLJywKJ/CvpoUnID0+ICfohL4nLAon8K+mhicgPT4gJ+WqtScsCifwr6aHJyA9PiAn8KaepycsCifwr6aIJyA9PiAn8KaetScsCifwr6aJJyA9PiAn8KOOkycsCifwr6aKJyA9PiAn8KOOnCcsCifwr6aLJyA9PiAn6IiBJywKJ/CvpownID0+ICfoiIQnLAon8K+mjScgPT4gJ+i+nicsCifwr6aOJyA9PiAn5JGrJywKJ/Cvpo8nID0+ICfoipEnLAon8K+mkCcgPT4gJ+iKiycsCifwr6aRJyA9PiAn6IqdJywKJ/CvppInID0+ICflirMnLAon8K+mkycgPT4gJ+iKsScsCifwr6aUJyA9PiAn6IqzJywKJ/CvppUnID0+ICfoir0nLAon8K+mlicgPT4gJ+iLpicsCifwr6aXJyA9PiAn8KasvCcsCifwr6aYJyA9PiAn6IulJywKJ/CvppknID0+ICfojJ0nLAon8K+mmicgPT4gJ+iNoycsCifwr6abJyA9PiAn6I6tJywKJ/CvppwnID0+ICfojKMnLAon8K+mnScgPT4gJ+iOvScsCifwr6aeJyA9PiAn6I+nJywKJ/Cvpp8nID0+ICfokZcnLAon8K+moCcgPT4gJ+iNkycsCifwr6ahJyA9PiAn6I+KJywKJ/CvpqInID0+ICfoj4wnLAon8K+moycgPT4gJ+iPnCcsCifwr6akJyA9PiAn8KawticsCifwr6alJyA9PiAn8Ka1qycsCifwr6amJyA9PiAn8KazlScsCifwr6anJyA9PiAn5JSrJywKJ/CvpqgnID0+ICfok7EnLAon8K+mqScgPT4gJ+iTsycsCifwr6aqJyA9PiAn6JSWJywKJ/CvpqsnID0+ICfwp4+KJywKJ/CvpqwnID0+ICfolaQnLAon8K+mrScgPT4gJ/CmvKwnLAon8K+mricgPT4gJ+SVnScsCifwr6avJyA9PiAn5JWhJywKJ/CvprAnID0+ICfwpr6xJywKJ/CvprEnID0+ICfwp4OSJywKJ/CvprInID0+ICfklasnLAon8K+msycgPT4gJ+iZkCcsCifwr6a0JyA9PiAn6JmcJywKJ/CvprUnID0+ICfomacnLAon8K+mticgPT4gJ+iZqScsCifwr6a3JyA9PiAn6JqpJywKJ/CvprgnID0+ICfomognLAon8K+muScgPT4gJ+icjicsCifwr6a6JyA9PiAn6JuiJywKJ/CvprsnID0+ICfonbknLAon8K+mvCcgPT4gJ+icqCcsCifwr6a9JyA9PiAn6J2rJywKJ/Cvpr4nID0+ICfonoYnLAon8K+mvycgPT4gJ+SXlycsCifwr6eAJyA9PiAn6J+hJywKJ/Cvp4EnID0+ICfooIEnLAon8K+ngicgPT4gJ+SXuScsCifwr6eDJyA9PiAn6KGgJywKJ/Cvp4QnID0+ICfooaMnLAon8K+nhScgPT4gJ/CnmacnLAon8K+nhicgPT4gJ+ijlycsCifwr6eHJyA9PiAn6KOeJywKJ/Cvp4gnID0+ICfkmLUnLAon8K+niScgPT4gJ+ijuicsCifwr6eKJyA9PiAn45K7JywKJ/Cvp4snID0+ICfwp6KuJywKJ/Cvp4wnID0+ICfwp6WmJywKJ/Cvp40nID0+ICfkmr4nLAon8K+njicgPT4gJ+SbhycsCifwr6ePJyA9PiAn6KqgJywKJ/Cvp5AnID0+ICfoq60nLAon8K+nkScgPT4gJ+iuiicsCifwr6eSJyA9PiAn6LGVJywKJ/Cvp5MnID0+ICfwp7KoJywKJ/Cvp5QnID0+ICfosqsnLAon8K+nlScgPT4gJ+izgScsCifwr6eWJyA9PiAn6LSbJywKJ/Cvp5cnID0+ICfotbcnLAon8K+nmCcgPT4gJ/CnvK8nLAon8K+nmScgPT4gJ/CgoIQnLAon8K+nmicgPT4gJ+i3iycsCifwr6ebJyA9PiAn6La8JywKJ/Cvp5wnID0+ICfot7AnLAon8K+nnScgPT4gJ/Cgo54nLAon8K+nnicgPT4gJ+i7lCcsCifwr6efJyA9PiAn6Ly4JywKJ/Cvp6AnID0+ICfwqJeSJywKJ/Cvp6EnID0+ICfwqJetJywKJ/Cvp6InID0+ICfpgpQnLAon8K+noycgPT4gJ+mDsScsCifwr6ekJyA9PiAn6YSRJywKJ/Cvp6UnID0+ICfwqJyuJywKJ/Cvp6YnID0+ICfphJsnLAon8K+npycgPT4gJ+mIuCcsCifwr6eoJyA9PiAn6YuXJywKJ/Cvp6knID0+ICfpi5gnLAon8K+nqicgPT4gJ+mJvCcsCifwr6erJyA9PiAn6Y+5JywKJ/Cvp6wnID0+ICfpkJUnLAon8K+nrScgPT4gJ/Cor7onLAon8K+nricgPT4gJ+mWiycsCifwr6evJyA9PiAn5KaVJywKJ/Cvp7AnID0+ICfplrcnLAon8K+nsScgPT4gJ/CotbcnLAon8K+nsicgPT4gJ+SnpicsCifwr6ezJyA9PiAn6ZuDJywKJ/Cvp7QnID0+ICfltrInLAon8K+ntScgPT4gJ+mcoycsCifwr6e2JyA9PiAn8KmFhScsCifwr6e3JyA9PiAn8KmImicsCifwr6e4JyA9PiAn5KmuJywKJ/Cvp7knID0+ICfkqbYnLAon8K+nuicgPT4gJ+mfoCcsCifwr6e7JyA9PiAn8KmQiicsCifwr6e8JyA9PiAn5KqyJywKJ/Cvp70nID0+ICfwqZKWJywKJ/Cvp74nID0+ICfpoIsnLAon8K+nvycgPT4gJ+mgiycsCifwr6iAJyA9PiAn6aCpJywKJ/CvqIEnID0+ICfwqZa2JywKJ/CvqIInID0+ICfpo6InLAon8K+ogycgPT4gJ+SssycsCifwr6iEJyA9PiAn6aSpJywKJ/CvqIUnID0+ICfppqcnLAon8K+ohicgPT4gJ+mngicsCifwr6iHJyA9PiAn6ae+JywKJ/CvqIgnID0+ICfkr44nLAon8K+oiScgPT4gJ/CprLAnLAon8K+oiicgPT4gJ+mskicsCifwr6iLJyA9PiAn6bGAJywKJ/CvqIwnID0+ICfps70nLAon8K+ojScgPT4gJ+SzjicsCifwr6iOJyA9PiAn5LOtJywKJ/CvqI8nID0+ICfptacnLAon8K+okCcgPT4gJ/Cqg44nLAon8K+okScgPT4gJ+SzuCcsCifwr6iSJyA9PiAn8KqEhScsCifwr6iTJyA9PiAn8KqIjicsCifwr6iUJyA9PiAn8KqKkScsCifwr6iVJyA9PiAn6bq7JywKJ/CvqJYnID0+ICfktZYnLAon8K+olycgPT4gJ+m7uScsCifwr6iYJyA9PiAn6bu+JywKJ/CvqJknID0+ICfpvIUnLAon8K+omicgPT4gJ+m8jycsCifwr6ibJyA9PiAn6byWJywKJ/CvqJwnID0+ICfpvLsnLAon8K+onScgPT4gJ/CqmIAnLAopOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ8yAJyA9PiAyMzAsCifMgScgPT4gMjMwLAonzIInID0+IDIzMCwKJ8yDJyA9PiAyMzAsCifMhCcgPT4gMjMwLAonzIUnID0+IDIzMCwKJ8yGJyA9PiAyMzAsCifMhycgPT4gMjMwLAonzIgnID0+IDIzMCwKJ8yJJyA9PiAyMzAsCifMiicgPT4gMjMwLAonzIsnID0+IDIzMCwKJ8yMJyA9PiAyMzAsCifMjScgPT4gMjMwLAonzI4nID0+IDIzMCwKJ8yPJyA9PiAyMzAsCifMkCcgPT4gMjMwLAonzJEnID0+IDIzMCwKJ8ySJyA9PiAyMzAsCifMkycgPT4gMjMwLAonzJQnID0+IDIzMCwKJ8yVJyA9PiAyMzIsCifMlicgPT4gMjIwLAonzJcnID0+IDIyMCwKJ8yYJyA9PiAyMjAsCifMmScgPT4gMjIwLAonzJonID0+IDIzMiwKJ8ybJyA9PiAyMTYsCifMnCcgPT4gMjIwLAonzJ0nID0+IDIyMCwKJ8yeJyA9PiAyMjAsCifMnycgPT4gMjIwLAonzKAnID0+IDIyMCwKJ8yhJyA9PiAyMDIsCifMoicgPT4gMjAyLAonzKMnID0+IDIyMCwKJ8ykJyA9PiAyMjAsCifMpScgPT4gMjIwLAonzKYnID0+IDIyMCwKJ8ynJyA9PiAyMDIsCifMqCcgPT4gMjAyLAonzKknID0+IDIyMCwKJ8yqJyA9PiAyMjAsCifMqycgPT4gMjIwLAonzKwnID0+IDIyMCwKJ8ytJyA9PiAyMjAsCifMricgPT4gMjIwLAonzK8nID0+IDIyMCwKJ8ywJyA9PiAyMjAsCifMsScgPT4gMjIwLAonzLInID0+IDIyMCwKJ8yzJyA9PiAyMjAsCifMtCcgPT4gMSwKJ8y1JyA9PiAxLAonzLYnID0+IDEsCifMtycgPT4gMSwKJ8y4JyA9PiAxLAonzLknID0+IDIyMCwKJ8y6JyA9PiAyMjAsCifMuycgPT4gMjIwLAonzLwnID0+IDIyMCwKJ8y9JyA9PiAyMzAsCifMvicgPT4gMjMwLAonzL8nID0+IDIzMCwKJ82AJyA9PiAyMzAsCifNgScgPT4gMjMwLAonzYInID0+IDIzMCwKJ82DJyA9PiAyMzAsCifNhCcgPT4gMjMwLAonzYUnID0+IDI0MCwKJ82GJyA9PiAyMzAsCifNhycgPT4gMjIwLAonzYgnID0+IDIyMCwKJ82JJyA9PiAyMjAsCifNiicgPT4gMjMwLAonzYsnID0+IDIzMCwKJ82MJyA9PiAyMzAsCifNjScgPT4gMjIwLAonzY4nID0+IDIyMCwKJ82QJyA9PiAyMzAsCifNkScgPT4gMjMwLAonzZInID0+IDIzMCwKJ82TJyA9PiAyMjAsCifNlCcgPT4gMjIwLAonzZUnID0+IDIyMCwKJ82WJyA9PiAyMjAsCifNlycgPT4gMjMwLAonzZgnID0+IDIzMiwKJ82ZJyA9PiAyMjAsCifNmicgPT4gMjIwLAonzZsnID0+IDIzMCwKJ82cJyA9PiAyMzMsCifNnScgPT4gMjM0LAonzZ4nID0+IDIzNCwKJ82fJyA9PiAyMzMsCifNoCcgPT4gMjM0LAonzaEnID0+IDIzNCwKJ82iJyA9PiAyMzMsCifNoycgPT4gMjMwLAonzaQnID0+IDIzMCwKJ82lJyA9PiAyMzAsCifNpicgPT4gMjMwLAonzacnID0+IDIzMCwKJ82oJyA9PiAyMzAsCifNqScgPT4gMjMwLAonzaonID0+IDIzMCwKJ82rJyA9PiAyMzAsCifNrCcgPT4gMjMwLAonza0nID0+IDIzMCwKJ82uJyA9PiAyMzAsCifNrycgPT4gMjMwLAon0oMnID0+IDIzMCwKJ9KEJyA9PiAyMzAsCifShScgPT4gMjMwLAon0oYnID0+IDIzMCwKJ9KHJyA9PiAyMzAsCifWkScgPT4gMjIwLAon1pInID0+IDIzMCwKJ9aTJyA9PiAyMzAsCifWlCcgPT4gMjMwLAon1pUnID0+IDIzMCwKJ9aWJyA9PiAyMjAsCifWlycgPT4gMjMwLAon1pgnID0+IDIzMCwKJ9aZJyA9PiAyMzAsCifWmicgPT4gMjIyLAon1psnID0+IDIyMCwKJ9acJyA9PiAyMzAsCifWnScgPT4gMjMwLAon1p4nID0+IDIzMCwKJ9afJyA9PiAyMzAsCifWoCcgPT4gMjMwLAon1qEnID0+IDIzMCwKJ9aiJyA9PiAyMjAsCifWoycgPT4gMjIwLAon1qQnID0+IDIyMCwKJ9alJyA9PiAyMjAsCifWpicgPT4gMjIwLAon1qcnID0+IDIyMCwKJ9aoJyA9PiAyMzAsCifWqScgPT4gMjMwLAon1qonID0+IDIyMCwKJ9arJyA9PiAyMzAsCifWrCcgPT4gMjMwLAon1q0nID0+IDIyMiwKJ9auJyA9PiAyMjgsCifWrycgPT4gMjMwLAon1rAnID0+IDEwLAon1rEnID0+IDExLAon1rInID0+IDEyLAon1rMnID0+IDEzLAon1rQnID0+IDE0LAon1rUnID0+IDE1LAon1rYnID0+IDE2LAon1rcnID0+IDE3LAon1rgnID0+IDE4LAon1rknID0+IDE5LAon1ronID0+IDE5LAon1rsnID0+IDIwLAon1rwnID0+IDIxLAon1r0nID0+IDIyLAon1r8nID0+IDIzLAon14EnID0+IDI0LAon14InID0+IDI1LAon14QnID0+IDIzMCwKJ9eFJyA9PiAyMjAsCifXhycgPT4gMTgsCifYkCcgPT4gMjMwLAon2JEnID0+IDIzMCwKJ9iSJyA9PiAyMzAsCifYkycgPT4gMjMwLAon2JQnID0+IDIzMCwKJ9iVJyA9PiAyMzAsCifYlicgPT4gMjMwLAon2JcnID0+IDIzMCwKJ9iYJyA9PiAzMCwKJ9iZJyA9PiAzMSwKJ9iaJyA9PiAzMiwKJ9mLJyA9PiAyNywKJ9mMJyA9PiAyOCwKJ9mNJyA9PiAyOSwKJ9mOJyA9PiAzMCwKJ9mPJyA9PiAzMSwKJ9mQJyA9PiAzMiwKJ9mRJyA9PiAzMywKJ9mSJyA9PiAzNCwKJ9mTJyA9PiAyMzAsCifZlCcgPT4gMjMwLAon2ZUnID0+IDIyMCwKJ9mWJyA9PiAyMjAsCifZlycgPT4gMjMwLAon2ZgnID0+IDIzMCwKJ9mZJyA9PiAyMzAsCifZmicgPT4gMjMwLAon2ZsnID0+IDIzMCwKJ9mcJyA9PiAyMjAsCifZnScgPT4gMjMwLAon2Z4nID0+IDIzMCwKJ9mfJyA9PiAyMjAsCifZsCcgPT4gMzUsCifblicgPT4gMjMwLAon25cnID0+IDIzMCwKJ9uYJyA9PiAyMzAsCifbmScgPT4gMjMwLAon25onID0+IDIzMCwKJ9ubJyA9PiAyMzAsCifbnCcgPT4gMjMwLAon258nID0+IDIzMCwKJ9ugJyA9PiAyMzAsCifboScgPT4gMjMwLAon26InID0+IDIzMCwKJ9ujJyA9PiAyMjAsCifbpCcgPT4gMjMwLAon26cnID0+IDIzMCwKJ9uoJyA9PiAyMzAsCifbqicgPT4gMjIwLAon26snID0+IDIzMCwKJ9usJyA9PiAyMzAsCifbrScgPT4gMjIwLAon3JEnID0+IDM2LAon3LAnID0+IDIzMCwKJ9yxJyA9PiAyMjAsCifcsicgPT4gMjMwLAon3LMnID0+IDIzMCwKJ9y0JyA9PiAyMjAsCifctScgPT4gMjMwLAon3LYnID0+IDIzMCwKJ9y3JyA9PiAyMjAsCifcuCcgPT4gMjIwLAon3LknID0+IDIyMCwKJ9y6JyA9PiAyMzAsCifcuycgPT4gMjIwLAon3LwnID0+IDIyMCwKJ9y9JyA9PiAyMzAsCifcvicgPT4gMjIwLAon3L8nID0+IDIzMCwKJ92AJyA9PiAyMzAsCifdgScgPT4gMjMwLAon3YInID0+IDIyMCwKJ92DJyA9PiAyMzAsCifdhCcgPT4gMjIwLAon3YUnID0+IDIzMCwKJ92GJyA9PiAyMjAsCifdhycgPT4gMjMwLAon3YgnID0+IDIyMCwKJ92JJyA9PiAyMzAsCifdiicgPT4gMjMwLAon36snID0+IDIzMCwKJ9+sJyA9PiAyMzAsCiffrScgPT4gMjMwLAon364nID0+IDIzMCwKJ9+vJyA9PiAyMzAsCiffsCcgPT4gMjMwLAon37EnID0+IDIzMCwKJ9+yJyA9PiAyMjAsCiffsycgPT4gMjMwLAon370nID0+IDIyMCwKJ+CglicgPT4gMjMwLAon4KCXJyA9PiAyMzAsCifgoJgnID0+IDIzMCwKJ+CgmScgPT4gMjMwLAon4KCbJyA9PiAyMzAsCifgoJwnID0+IDIzMCwKJ+CgnScgPT4gMjMwLAon4KCeJyA9PiAyMzAsCifgoJ8nID0+IDIzMCwKJ+CgoCcgPT4gMjMwLAon4KChJyA9PiAyMzAsCifgoKInID0+IDIzMCwKJ+CgoycgPT4gMjMwLAon4KClJyA9PiAyMzAsCifgoKYnID0+IDIzMCwKJ+CgpycgPT4gMjMwLAon4KCpJyA9PiAyMzAsCifgoKonID0+IDIzMCwKJ+CgqycgPT4gMjMwLAon4KCsJyA9PiAyMzAsCifgoK0nID0+IDIzMCwKJ+ChmScgPT4gMjIwLAon4KGaJyA9PiAyMjAsCifgoZsnID0+IDIyMCwKJ+CjkycgPT4gMjIwLAon4KOUJyA9PiAyMzAsCifgo5UnID0+IDIzMCwKJ+CjlicgPT4gMjMwLAon4KOXJyA9PiAyMzAsCifgo5gnID0+IDIzMCwKJ+CjmScgPT4gMjMwLAon4KOaJyA9PiAyMzAsCifgo5snID0+IDIzMCwKJ+CjnCcgPT4gMjMwLAon4KOdJyA9PiAyMzAsCifgo54nID0+IDIzMCwKJ+CjnycgPT4gMjMwLAon4KOgJyA9PiAyMzAsCifgo6EnID0+IDIzMCwKJ+CjoycgPT4gMjIwLAon4KOkJyA9PiAyMzAsCifgo6UnID0+IDIzMCwKJ+CjpicgPT4gMjIwLAon4KOnJyA9PiAyMzAsCifgo6gnID0+IDIzMCwKJ+CjqScgPT4gMjIwLAon4KOqJyA9PiAyMzAsCifgo6snID0+IDIzMCwKJ+CjrCcgPT4gMjMwLAon4KOtJyA9PiAyMjAsCifgo64nID0+IDIyMCwKJ+CjrycgPT4gMjIwLAon4KOwJyA9PiAyNywKJ+CjsScgPT4gMjgsCifgo7InID0+IDI5LAon4KOzJyA9PiAyMzAsCifgo7QnID0+IDIzMCwKJ+CjtScgPT4gMjMwLAon4KO2JyA9PiAyMjAsCifgo7cnID0+IDIzMCwKJ+CjuCcgPT4gMjMwLAon4KO5JyA9PiAyMjAsCifgo7onID0+IDIyMCwKJ+CjuycgPT4gMjMwLAon4KO8JyA9PiAyMzAsCifgo70nID0+IDIzMCwKJ+CjvicgPT4gMjMwLAon4KO/JyA9PiAyMzAsCifgpLwnID0+IDcsCifgpY0nID0+IDksCifgpZEnID0+IDIzMCwKJ+ClkicgPT4gMjIwLAon4KWTJyA9PiAyMzAsCifgpZQnID0+IDIzMCwKJ+CmvCcgPT4gNywKJ+CnjScgPT4gOSwKJ+CnvicgPT4gMjMwLAon4Ki8JyA9PiA3LAon4KmNJyA9PiA5LAon4Kq8JyA9PiA3LAon4KuNJyA9PiA5LAon4Ky8JyA9PiA3LAon4K2NJyA9PiA5LAon4K+NJyA9PiA5LAon4LGNJyA9PiA5LAon4LGVJyA9PiA4NCwKJ+CxlicgPT4gOTEsCifgsrwnID0+IDcsCifgs40nID0+IDksCifgtLsnID0+IDksCifgtLwnID0+IDksCifgtY0nID0+IDksCifgt4onID0+IDksCifguLgnID0+IDEwMywKJ+C4uScgPT4gMTAzLAon4Li6JyA9PiA5LAon4LmIJyA9PiAxMDcsCifguYknID0+IDEwNywKJ+C5iicgPT4gMTA3LAon4LmLJyA9PiAxMDcsCifgurgnID0+IDExOCwKJ+C6uScgPT4gMTE4LAon4Lq6JyA9PiA5LAon4LuIJyA9PiAxMjIsCifgu4knID0+IDEyMiwKJ+C7iicgPT4gMTIyLAon4LuLJyA9PiAxMjIsCifgvJgnID0+IDIyMCwKJ+C8mScgPT4gMjIwLAon4Ly1JyA9PiAyMjAsCifgvLcnID0+IDIyMCwKJ+C8uScgPT4gMjE2LAon4L2xJyA9PiAxMjksCifgvbInID0+IDEzMCwKJ+C9tCcgPT4gMTMyLAon4L26JyA9PiAxMzAsCifgvbsnID0+IDEzMCwKJ+C9vCcgPT4gMTMwLAon4L29JyA9PiAxMzAsCifgvoAnID0+IDEzMCwKJ+C+gicgPT4gMjMwLAon4L6DJyA9PiAyMzAsCifgvoQnID0+IDksCifgvoYnID0+IDIzMCwKJ+C+hycgPT4gMjMwLAon4L+GJyA9PiAyMjAsCifhgLcnID0+IDcsCifhgLknID0+IDksCifhgLonID0+IDksCifhgo0nID0+IDIyMCwKJ+GNnScgPT4gMjMwLAon4Y2eJyA9PiAyMzAsCifhjZ8nID0+IDIzMCwKJ+GclCcgPT4gOSwKJ+GctCcgPT4gOSwKJ+GfkicgPT4gOSwKJ+GfnScgPT4gMjMwLAon4aKpJyA9PiAyMjgsCifhpLknID0+IDIyMiwKJ+GkuicgPT4gMjMwLAon4aS7JyA9PiAyMjAsCifhqJcnID0+IDIzMCwKJ+GomCcgPT4gMjIwLAon4amgJyA9PiA5LAon4am1JyA9PiAyMzAsCifhqbYnID0+IDIzMCwKJ+GptycgPT4gMjMwLAon4am4JyA9PiAyMzAsCifhqbknID0+IDIzMCwKJ+GpuicgPT4gMjMwLAon4am7JyA9PiAyMzAsCifhqbwnID0+IDIzMCwKJ+GpvycgPT4gMjIwLAon4aqwJyA9PiAyMzAsCifhqrEnID0+IDIzMCwKJ+GqsicgPT4gMjMwLAon4aqzJyA9PiAyMzAsCifhqrQnID0+IDIzMCwKJ+GqtScgPT4gMjIwLAon4aq2JyA9PiAyMjAsCifhqrcnID0+IDIyMCwKJ+GquCcgPT4gMjIwLAon4aq5JyA9PiAyMjAsCifhqronID0+IDIyMCwKJ+GquycgPT4gMjMwLAon4aq8JyA9PiAyMzAsCifhqr0nID0+IDIyMCwKJ+GqvycgPT4gMjIwLAon4auAJyA9PiAyMjAsCifhrLQnID0+IDcsCifhrYQnID0+IDksCifhrasnID0+IDIzMCwKJ+GtrCcgPT4gMjIwLAon4a2tJyA9PiAyMzAsCifhra4nID0+IDIzMCwKJ+GtrycgPT4gMjMwLAon4a2wJyA9PiAyMzAsCifhrbEnID0+IDIzMCwKJ+GtsicgPT4gMjMwLAon4a2zJyA9PiAyMzAsCifhrqonID0+IDksCifhrqsnID0+IDksCifhr6YnID0+IDcsCifhr7InID0+IDksCifhr7MnID0+IDksCifhsLcnID0+IDcsCifhs5AnID0+IDIzMCwKJ+GzkScgPT4gMjMwLAon4bOSJyA9PiAyMzAsCifhs5QnID0+IDEsCifhs5UnID0+IDIyMCwKJ+GzlicgPT4gMjIwLAon4bOXJyA9PiAyMjAsCifhs5gnID0+IDIyMCwKJ+GzmScgPT4gMjIwLAon4bOaJyA9PiAyMzAsCifhs5snID0+IDIzMCwKJ+GznCcgPT4gMjIwLAon4bOdJyA9PiAyMjAsCifhs54nID0+IDIyMCwKJ+GznycgPT4gMjIwLAon4bOgJyA9PiAyMzAsCifhs6InID0+IDEsCifhs6MnID0+IDEsCifhs6QnID0+IDEsCifhs6UnID0+IDEsCifhs6YnID0+IDEsCifhs6cnID0+IDEsCifhs6gnID0+IDEsCifhs60nID0+IDIyMCwKJ+GztCcgPT4gMjMwLAon4bO4JyA9PiAyMzAsCifhs7knID0+IDIzMCwKJ+G3gCcgPT4gMjMwLAon4beBJyA9PiAyMzAsCifht4InID0+IDIyMCwKJ+G3gycgPT4gMjMwLAon4beEJyA9PiAyMzAsCifht4UnID0+IDIzMCwKJ+G3hicgPT4gMjMwLAon4beHJyA9PiAyMzAsCifht4gnID0+IDIzMCwKJ+G3iScgPT4gMjMwLAon4beKJyA9PiAyMjAsCifht4snID0+IDIzMCwKJ+G3jCcgPT4gMjMwLAon4beNJyA9PiAyMzQsCifht44nID0+IDIxNCwKJ+G3jycgPT4gMjIwLAon4beQJyA9PiAyMDIsCifht5EnID0+IDIzMCwKJ+G3kicgPT4gMjMwLAon4beTJyA9PiAyMzAsCifht5QnID0+IDIzMCwKJ+G3lScgPT4gMjMwLAon4beWJyA9PiAyMzAsCifht5cnID0+IDIzMCwKJ+G3mCcgPT4gMjMwLAon4beZJyA9PiAyMzAsCifht5onID0+IDIzMCwKJ+G3mycgPT4gMjMwLAon4becJyA9PiAyMzAsCifht50nID0+IDIzMCwKJ+G3nicgPT4gMjMwLAon4befJyA9PiAyMzAsCifht6AnID0+IDIzMCwKJ+G3oScgPT4gMjMwLAon4beiJyA9PiAyMzAsCifht6MnID0+IDIzMCwKJ+G3pCcgPT4gMjMwLAon4belJyA9PiAyMzAsCifht6YnID0+IDIzMCwKJ+G3pycgPT4gMjMwLAon4beoJyA9PiAyMzAsCifht6knID0+IDIzMCwKJ+G3qicgPT4gMjMwLAon4berJyA9PiAyMzAsCifht6wnID0+IDIzMCwKJ+G3rScgPT4gMjMwLAon4beuJyA9PiAyMzAsCifht68nID0+IDIzMCwKJ+G3sCcgPT4gMjMwLAon4bexJyA9PiAyMzAsCifht7InID0+IDIzMCwKJ+G3sycgPT4gMjMwLAon4be0JyA9PiAyMzAsCifht7UnID0+IDIzMCwKJ+G3ticgPT4gMjMyLAon4be3JyA9PiAyMjgsCifht7gnID0+IDIyOCwKJ+G3uScgPT4gMjIwLAon4be7JyA9PiAyMzAsCifht7wnID0+IDIzMywKJ+G3vScgPT4gMjIwLAon4be+JyA9PiAyMzAsCifht78nID0+IDIyMCwKJ+KDkCcgPT4gMjMwLAon4oORJyA9PiAyMzAsCifig5InID0+IDEsCifig5MnID0+IDEsCifig5QnID0+IDIzMCwKJ+KDlScgPT4gMjMwLAon4oOWJyA9PiAyMzAsCifig5cnID0+IDIzMCwKJ+KDmCcgPT4gMSwKJ+KDmScgPT4gMSwKJ+KDmicgPT4gMSwKJ+KDmycgPT4gMjMwLAon4oOcJyA9PiAyMzAsCifig6EnID0+IDIzMCwKJ+KDpScgPT4gMSwKJ+KDpicgPT4gMSwKJ+KDpycgPT4gMjMwLAon4oOoJyA9PiAyMjAsCifig6knID0+IDIzMCwKJ+KDqicgPT4gMSwKJ+KDqycgPT4gMSwKJ+KDrCcgPT4gMjIwLAon4oOtJyA9PiAyMjAsCifig64nID0+IDIyMCwKJ+KDrycgPT4gMjIwLAon4oOwJyA9PiAyMzAsCifis68nID0+IDIzMCwKJ+KzsCcgPT4gMjMwLAon4rOxJyA9PiAyMzAsCifitb8nID0+IDksCifit6AnID0+IDIzMCwKJ+K3oScgPT4gMjMwLAon4reiJyA9PiAyMzAsCifit6MnID0+IDIzMCwKJ+K3pCcgPT4gMjMwLAon4relJyA9PiAyMzAsCifit6YnID0+IDIzMCwKJ+K3pycgPT4gMjMwLAon4reoJyA9PiAyMzAsCifit6knID0+IDIzMCwKJ+K3qicgPT4gMjMwLAon4rerJyA9PiAyMzAsCifit6wnID0+IDIzMCwKJ+K3rScgPT4gMjMwLAon4reuJyA9PiAyMzAsCifit68nID0+IDIzMCwKJ+K3sCcgPT4gMjMwLAon4rexJyA9PiAyMzAsCifit7InID0+IDIzMCwKJ+K3sycgPT4gMjMwLAon4re0JyA9PiAyMzAsCifit7UnID0+IDIzMCwKJ+K3ticgPT4gMjMwLAon4re3JyA9PiAyMzAsCifit7gnID0+IDIzMCwKJ+K3uScgPT4gMjMwLAon4re6JyA9PiAyMzAsCifit7snID0+IDIzMCwKJ+K3vCcgPT4gMjMwLAon4re9JyA9PiAyMzAsCifit74nID0+IDIzMCwKJ+K3vycgPT4gMjMwLAon44CqJyA9PiAyMTgsCifjgKsnID0+IDIyOCwKJ+OArCcgPT4gMjMyLAon44CtJyA9PiAyMjIsCifjgK4nID0+IDIyNCwKJ+OArycgPT4gMjI0LAon44KZJyA9PiA4LAon44KaJyA9PiA4LAon6pmvJyA9PiAyMzAsCifqmbQnID0+IDIzMCwKJ+qZtScgPT4gMjMwLAon6pm2JyA9PiAyMzAsCifqmbcnID0+IDIzMCwKJ+qZuCcgPT4gMjMwLAon6pm5JyA9PiAyMzAsCifqmbonID0+IDIzMCwKJ+qZuycgPT4gMjMwLAon6pm8JyA9PiAyMzAsCifqmb0nID0+IDIzMCwKJ+qanicgPT4gMjMwLAon6pqfJyA9PiAyMzAsCifqm7AnID0+IDIzMCwKJ+qbsScgPT4gMjMwLAon6qCGJyA9PiA5LAon6qCsJyA9PiA5LAon6qOEJyA9PiA5LAon6qOgJyA9PiAyMzAsCifqo6EnID0+IDIzMCwKJ+qjoicgPT4gMjMwLAon6qOjJyA9PiAyMzAsCifqo6QnID0+IDIzMCwKJ+qjpScgPT4gMjMwLAon6qOmJyA9PiAyMzAsCifqo6cnID0+IDIzMCwKJ+qjqCcgPT4gMjMwLAon6qOpJyA9PiAyMzAsCifqo6onID0+IDIzMCwKJ+qjqycgPT4gMjMwLAon6qOsJyA9PiAyMzAsCifqo60nID0+IDIzMCwKJ+qjricgPT4gMjMwLAon6qOvJyA9PiAyMzAsCifqo7AnID0+IDIzMCwKJ+qjsScgPT4gMjMwLAon6qSrJyA9PiAyMjAsCifqpKwnID0+IDIyMCwKJ+qkrScgPT4gMjIwLAon6qWTJyA9PiA5LAon6qazJyA9PiA3LAon6qeAJyA9PiA5LAon6qqwJyA9PiAyMzAsCifqqrInID0+IDIzMCwKJ+qqsycgPT4gMjMwLAon6qq0JyA9PiAyMjAsCifqqrcnID0+IDIzMCwKJ+qquCcgPT4gMjMwLAon6qq+JyA9PiAyMzAsCifqqr8nID0+IDIzMCwKJ+qrgScgPT4gMjMwLAon6qu2JyA9PiA5LAon6q+tJyA9PiA5LAon76yeJyA9PiAyNiwKJ++4oCcgPT4gMjMwLAon77ihJyA9PiAyMzAsCifvuKInID0+IDIzMCwKJ++4oycgPT4gMjMwLAon77ikJyA9PiAyMzAsCifvuKUnID0+IDIzMCwKJ++4picgPT4gMjMwLAon77inJyA9PiAyMjAsCifvuKgnID0+IDIyMCwKJ++4qScgPT4gMjIwLAon77iqJyA9PiAyMjAsCifvuKsnID0+IDIyMCwKJ++4rCcgPT4gMjIwLAon77itJyA9PiAyMjAsCifvuK4nID0+IDIzMCwKJ++4rycgPT4gMjMwLAon8JCHvScgPT4gMjIwLAon8JCLoCcgPT4gMjIwLAon8JCNticgPT4gMjMwLAon8JCNtycgPT4gMjMwLAon8JCNuCcgPT4gMjMwLAon8JCNuScgPT4gMjMwLAon8JCNuicgPT4gMjMwLAon8JCojScgPT4gMjIwLAon8JCojycgPT4gMjMwLAon8JCouCcgPT4gMjMwLAon8JCouScgPT4gMSwKJ/CQqLonID0+IDIyMCwKJ/CQqL8nID0+IDksCifwkKulJyA9PiAyMzAsCifwkKumJyA9PiAyMjAsCifwkLSkJyA9PiAyMzAsCifwkLSlJyA9PiAyMzAsCifwkLSmJyA9PiAyMzAsCifwkLSnJyA9PiAyMzAsCifwkLqrJyA9PiAyMzAsCifwkLqsJyA9PiAyMzAsCifwkL2GJyA9PiAyMjAsCifwkL2HJyA9PiAyMjAsCifwkL2IJyA9PiAyMzAsCifwkL2JJyA9PiAyMzAsCifwkL2KJyA9PiAyMzAsCifwkL2LJyA9PiAyMjAsCifwkL2MJyA9PiAyMzAsCifwkL2NJyA9PiAyMjAsCifwkL2OJyA9PiAyMjAsCifwkL2PJyA9PiAyMjAsCifwkL2QJyA9PiAyMjAsCifwkYGGJyA9PiA5LAon8JGBvycgPT4gOSwKJ/CRgrknID0+IDksCifwkYK6JyA9PiA3LAon8JGEgCcgPT4gMjMwLAon8JGEgScgPT4gMjMwLAon8JGEgicgPT4gMjMwLAon8JGEsycgPT4gOSwKJ/CRhLQnID0+IDksCifwkYWzJyA9PiA3LAon8JGHgCcgPT4gOSwKJ/CRh4onID0+IDcsCifwkYi1JyA9PiA5LAon8JGIticgPT4gNywKJ/CRi6knID0+IDcsCifwkYuqJyA9PiA5LAon8JGMuycgPT4gNywKJ/CRjLwnID0+IDcsCifwkY2NJyA9PiA5LAon8JGNpicgPT4gMjMwLAon8JGNpycgPT4gMjMwLAon8JGNqCcgPT4gMjMwLAon8JGNqScgPT4gMjMwLAon8JGNqicgPT4gMjMwLAon8JGNqycgPT4gMjMwLAon8JGNrCcgPT4gMjMwLAon8JGNsCcgPT4gMjMwLAon8JGNsScgPT4gMjMwLAon8JGNsicgPT4gMjMwLAon8JGNsycgPT4gMjMwLAon8JGNtCcgPT4gMjMwLAon8JGRgicgPT4gOSwKJ/CRkYYnID0+IDcsCifwkZGeJyA9PiAyMzAsCifwkZOCJyA9PiA5LAon8JGTgycgPT4gNywKJ/CRlr8nID0+IDksCifwkZeAJyA9PiA3LAon8JGYvycgPT4gOSwKJ/CRmrYnID0+IDksCifwkZq3JyA9PiA3LAon8JGcqycgPT4gOSwKJ/CRoLknID0+IDksCifwkaC6JyA9PiA3LAon8JGkvScgPT4gOSwKJ/CRpL4nID0+IDksCifwkaWDJyA9PiA3LAon8JGnoCcgPT4gOSwKJ/CRqLQnID0+IDksCifwkamHJyA9PiA5LAon8JGqmScgPT4gOSwKJ/CRsL8nID0+IDksCifwkbWCJyA9PiA3LAon8JG1hCcgPT4gOSwKJ/CRtYUnID0+IDksCifwkbaXJyA9PiA5LAon8JarsCcgPT4gMSwKJ/CWq7EnID0+IDEsCifwlquyJyA9PiAxLAon8JarsycgPT4gMSwKJ/CWq7QnID0+IDEsCifwlqywJyA9PiAyMzAsCifwlqyxJyA9PiAyMzAsCifwlqyyJyA9PiAyMzAsCifwlqyzJyA9PiAyMzAsCifwlqy0JyA9PiAyMzAsCifwlqy1JyA9PiAyMzAsCifwlqy2JyA9PiAyMzAsCifwlr+wJyA9PiA2LAon8Ja/sScgPT4gNiwKJ/Cbsp4nID0+IDEsCifwnYWlJyA9PiAyMTYsCifwnYWmJyA9PiAyMTYsCifwnYWnJyA9PiAxLAon8J2FqCcgPT4gMSwKJ/CdhaknID0+IDEsCifwnYWtJyA9PiAyMjYsCifwnYWuJyA9PiAyMTYsCifwnYWvJyA9PiAyMTYsCifwnYWwJyA9PiAyMTYsCifwnYWxJyA9PiAyMTYsCifwnYWyJyA9PiAyMTYsCifwnYW7JyA9PiAyMjAsCifwnYW8JyA9PiAyMjAsCifwnYW9JyA9PiAyMjAsCifwnYW+JyA9PiAyMjAsCifwnYW/JyA9PiAyMjAsCifwnYaAJyA9PiAyMjAsCifwnYaBJyA9PiAyMjAsCifwnYaCJyA9PiAyMjAsCifwnYaFJyA9PiAyMzAsCifwnYaGJyA9PiAyMzAsCifwnYaHJyA9PiAyMzAsCifwnYaIJyA9PiAyMzAsCifwnYaJJyA9PiAyMzAsCifwnYaKJyA9PiAyMjAsCifwnYaLJyA9PiAyMjAsCifwnYaqJyA9PiAyMzAsCifwnYarJyA9PiAyMzAsCifwnYasJyA9PiAyMzAsCifwnYatJyA9PiAyMzAsCifwnYmCJyA9PiAyMzAsCifwnYmDJyA9PiAyMzAsCifwnYmEJyA9PiAyMzAsCifwnoCAJyA9PiAyMzAsCifwnoCBJyA9PiAyMzAsCifwnoCCJyA9PiAyMzAsCifwnoCDJyA9PiAyMzAsCifwnoCEJyA9PiAyMzAsCifwnoCFJyA9PiAyMzAsCifwnoCGJyA9PiAyMzAsCifwnoCIJyA9PiAyMzAsCifwnoCJJyA9PiAyMzAsCifwnoCKJyA9PiAyMzAsCifwnoCLJyA9PiAyMzAsCifwnoCMJyA9PiAyMzAsCifwnoCNJyA9PiAyMzAsCifwnoCOJyA9PiAyMzAsCifwnoCPJyA9PiAyMzAsCifwnoCQJyA9PiAyMzAsCifwnoCRJyA9PiAyMzAsCifwnoCSJyA9PiAyMzAsCifwnoCTJyA9PiAyMzAsCifwnoCUJyA9PiAyMzAsCifwnoCVJyA9PiAyMzAsCifwnoCWJyA9PiAyMzAsCifwnoCXJyA9PiAyMzAsCifwnoCYJyA9PiAyMzAsCifwnoCbJyA9PiAyMzAsCifwnoCcJyA9PiAyMzAsCifwnoCdJyA9PiAyMzAsCifwnoCeJyA9PiAyMzAsCifwnoCfJyA9PiAyMzAsCifwnoCgJyA9PiAyMzAsCifwnoChJyA9PiAyMzAsCifwnoCjJyA9PiAyMzAsCifwnoCkJyA9PiAyMzAsCifwnoCmJyA9PiAyMzAsCifwnoCnJyA9PiAyMzAsCifwnoCoJyA9PiAyMzAsCifwnoCpJyA9PiAyMzAsCifwnoCqJyA9PiAyMzAsCifwnoSwJyA9PiAyMzAsCifwnoSxJyA9PiAyMzAsCifwnoSyJyA9PiAyMzAsCifwnoSzJyA9PiAyMzAsCifwnoS0JyA9PiAyMzAsCifwnoS1JyA9PiAyMzAsCifwnoS2JyA9PiAyMzAsCifwnousJyA9PiAyMzAsCifwnoutJyA9PiAyMzAsCifwnouuJyA9PiAyMzAsCifwnouvJyA9PiAyMzAsCifwnqOQJyA9PiAyMjAsCifwnqORJyA9PiAyMjAsCifwnqOSJyA9PiAyMjAsCifwnqOTJyA9PiAyMjAsCifwnqOUJyA9PiAyMjAsCifwnqOVJyA9PiAyMjAsCifwnqOWJyA9PiAyMjAsCifwnqWEJyA9PiAyMzAsCifwnqWFJyA9PiAyMzAsCifwnqWGJyA9PiAyMzAsCifwnqWHJyA9PiAyMzAsCifwnqWIJyA9PiAyMzAsCifwnqWJJyA9PiAyMzAsCifwnqWKJyA9PiA3LAopOwo8P3BocAoKcmV0dXJuIGFycmF5ICgKJ8KgJyA9PiAnICcsCifCqCcgPT4gJyDMiCcsCifCqicgPT4gJ2EnLAonwq8nID0+ICcgzIQnLAonwrInID0+ICcyJywKJ8KzJyA9PiAnMycsCifCtCcgPT4gJyDMgScsCifCtScgPT4gJ868JywKJ8K4JyA9PiAnIMynJywKJ8K5JyA9PiAnMScsCifCuicgPT4gJ28nLAonwrwnID0+ICcx4oGENCcsCifCvScgPT4gJzHigYQyJywKJ8K+JyA9PiAnM+KBhDQnLAonxLInID0+ICdJSicsCifEsycgPT4gJ2lqJywKJ8S/JyA9PiAnTMK3JywKJ8WAJyA9PiAnbMK3JywKJ8WJJyA9PiAnyrxuJywKJ8W/JyA9PiAncycsCifHhCcgPT4gJ0RazIwnLAonx4UnID0+ICdEesyMJywKJ8eGJyA9PiAnZHrMjCcsCifHhycgPT4gJ0xKJywKJ8eIJyA9PiAnTGonLAonx4knID0+ICdsaicsCifHiicgPT4gJ05KJywKJ8eLJyA9PiAnTmonLAonx4wnID0+ICduaicsCifHsScgPT4gJ0RaJywKJ8eyJyA9PiAnRHonLAonx7MnID0+ICdkeicsCifKsCcgPT4gJ2gnLAonyrEnID0+ICfJpicsCifKsicgPT4gJ2onLAonyrMnID0+ICdyJywKJ8q0JyA9PiAnybknLAonyrUnID0+ICfJuycsCifKticgPT4gJ8qBJywKJ8q3JyA9PiAndycsCifKuCcgPT4gJ3knLAony5gnID0+ICcgzIYnLAony5knID0+ICcgzIcnLAony5onID0+ICcgzIonLAony5snID0+ICcgzKgnLAony5wnID0+ICcgzIMnLAony50nID0+ICcgzIsnLAony6AnID0+ICfJoycsCifLoScgPT4gJ2wnLAony6InID0+ICdzJywKJ8ujJyA9PiAneCcsCifLpCcgPT4gJ8qVJywKJ826JyA9PiAnIM2FJywKJ86EJyA9PiAnIMyBJywKJ86FJyA9PiAnIMyIzIEnLAonz5AnID0+ICfOsicsCifPkScgPT4gJ864JywKJ8+SJyA9PiAnzqUnLAonz5MnID0+ICfOpcyBJywKJ8+UJyA9PiAnzqXMiCcsCifPlScgPT4gJ8+GJywKJ8+WJyA9PiAnz4AnLAonz7AnID0+ICfOuicsCifPsScgPT4gJ8+BJywKJ8+yJyA9PiAnz4InLAonz7QnID0+ICfOmCcsCifPtScgPT4gJ861JywKJ8+5JyA9PiAnzqMnLAon1ocnID0+ICfVpdaCJywKJ9m1JyA9PiAn2KfZtCcsCifZticgPT4gJ9mI2bQnLAon2bcnID0+ICfbh9m0JywKJ9m4JyA9PiAn2YrZtCcsCifguLMnID0+ICfguY3guLInLAon4LqzJyA9PiAn4LuN4LqyJywKJ+C7nCcgPT4gJ+C6q+C6mScsCifgu50nID0+ICfguqvguqEnLAon4LyMJyA9PiAn4LyLJywKJ+C9tycgPT4gJ+C+suC9seC+gCcsCifgvbknID0+ICfgvrPgvbHgvoAnLAon4YO8JyA9PiAn4YOcJywKJ+G0rCcgPT4gJ0EnLAon4bStJyA9PiAnw4YnLAon4bSuJyA9PiAnQicsCifhtLAnID0+ICdEJywKJ+G0sScgPT4gJ0UnLAon4bSyJyA9PiAnxo4nLAon4bSzJyA9PiAnRycsCifhtLQnID0+ICdIJywKJ+G0tScgPT4gJ0knLAon4bS2JyA9PiAnSicsCifhtLcnID0+ICdLJywKJ+G0uCcgPT4gJ0wnLAon4bS5JyA9PiAnTScsCifhtLonID0+ICdOJywKJ+G0vCcgPT4gJ08nLAon4bS9JyA9PiAnyKInLAon4bS+JyA9PiAnUCcsCifhtL8nID0+ICdSJywKJ+G1gCcgPT4gJ1QnLAon4bWBJyA9PiAnVScsCifhtYInID0+ICdXJywKJ+G1gycgPT4gJ2EnLAon4bWEJyA9PiAnyZAnLAon4bWFJyA9PiAnyZEnLAon4bWGJyA9PiAn4bSCJywKJ+G1hycgPT4gJ2InLAon4bWIJyA9PiAnZCcsCifhtYknID0+ICdlJywKJ+G1iicgPT4gJ8mZJywKJ+G1iycgPT4gJ8mbJywKJ+G1jCcgPT4gJ8mcJywKJ+G1jScgPT4gJ2cnLAon4bWPJyA9PiAnaycsCifhtZAnID0+ICdtJywKJ+G1kScgPT4gJ8WLJywKJ+G1kicgPT4gJ28nLAon4bWTJyA9PiAnyZQnLAon4bWUJyA9PiAn4bSWJywKJ+G1lScgPT4gJ+G0lycsCifhtZYnID0+ICdwJywKJ+G1lycgPT4gJ3QnLAon4bWYJyA9PiAndScsCifhtZknID0+ICfhtJ0nLAon4bWaJyA9PiAnya8nLAon4bWbJyA9PiAndicsCifhtZwnID0+ICfhtKUnLAon4bWdJyA9PiAnzrInLAon4bWeJyA9PiAnzrMnLAon4bWfJyA9PiAnzrQnLAon4bWgJyA9PiAnz4YnLAon4bWhJyA9PiAnz4cnLAon4bWiJyA9PiAnaScsCifhtaMnID0+ICdyJywKJ+G1pCcgPT4gJ3UnLAon4bWlJyA9PiAndicsCifhtaYnID0+ICfOsicsCifhtacnID0+ICfOsycsCifhtagnID0+ICfPgScsCifhtaknID0+ICfPhicsCifhtaonID0+ICfPhycsCifhtbgnID0+ICfQvScsCifhtpsnID0+ICfJkicsCifhtpwnID0+ICdjJywKJ+G2nScgPT4gJ8mVJywKJ+G2nicgPT4gJ8OwJywKJ+G2nycgPT4gJ8mcJywKJ+G2oCcgPT4gJ2YnLAon4bahJyA9PiAnyZ8nLAon4baiJyA9PiAnyaEnLAon4bajJyA9PiAnyaUnLAon4bakJyA9PiAnyagnLAon4balJyA9PiAnyaknLAon4bamJyA9PiAnyaonLAon4banJyA9PiAn4bW7JywKJ+G2qCcgPT4gJ8qdJywKJ+G2qScgPT4gJ8mtJywKJ+G2qicgPT4gJ+G2hScsCifhtqsnID0+ICfKnycsCifhtqwnID0+ICfJsScsCifhtq0nID0+ICfJsCcsCifhtq4nID0+ICfJsicsCifhtq8nID0+ICfJsycsCifhtrAnID0+ICfJtCcsCifhtrEnID0+ICfJtScsCifhtrInID0+ICfJuCcsCifhtrMnID0+ICfKgicsCifhtrQnID0+ICfKgycsCifhtrUnID0+ICfGqycsCifhtrYnID0+ICfKiScsCifhtrcnID0+ICfKiicsCifhtrgnID0+ICfhtJwnLAon4ba5JyA9PiAnyosnLAon4ba6JyA9PiAnyownLAon4ba7JyA9PiAneicsCifhtrwnID0+ICfKkCcsCifhtr0nID0+ICfKkScsCifhtr4nID0+ICfKkicsCifhtr8nID0+ICfOuCcsCifhuponID0+ICdhyr4nLAon4bqbJyA9PiAnc8yHJywKJ+G+vScgPT4gJyDMkycsCifhvr8nID0+ICcgzJMnLAon4b+AJyA9PiAnIM2CJywKJ+G/gScgPT4gJyDMiM2CJywKJ+G/jScgPT4gJyDMk8yAJywKJ+G/jicgPT4gJyDMk8yBJywKJ+G/jycgPT4gJyDMk82CJywKJ+G/nScgPT4gJyDMlMyAJywKJ+G/nicgPT4gJyDMlMyBJywKJ+G/nycgPT4gJyDMlM2CJywKJ+G/rScgPT4gJyDMiMyAJywKJ+G/ricgPT4gJyDMiMyBJywKJ+G/vScgPT4gJyDMgScsCifhv74nID0+ICcgzJQnLAon4oCAJyA9PiAnICcsCifigIEnID0+ICcgJywKJ+KAgicgPT4gJyAnLAon4oCDJyA9PiAnICcsCifigIQnID0+ICcgJywKJ+KAhScgPT4gJyAnLAon4oCGJyA9PiAnICcsCifigIcnID0+ICcgJywKJ+KAiCcgPT4gJyAnLAon4oCJJyA9PiAnICcsCifigIonID0+ICcgJywKJ+KAkScgPT4gJ+KAkCcsCifigJcnID0+ICcgzLMnLAon4oCkJyA9PiAnLicsCifigKUnID0+ICcuLicsCifigKYnID0+ICcuLi4nLAon4oCvJyA9PiAnICcsCifigLMnID0+ICfigLLigLInLAon4oC0JyA9PiAn4oCy4oCy4oCyJywKJ+KAticgPT4gJ+KAteKAtScsCifigLcnID0+ICfigLXigLXigLUnLAon4oC8JyA9PiAnISEnLAon4oC+JyA9PiAnIMyFJywKJ+KBhycgPT4gJz8/JywKJ+KBiCcgPT4gJz8hJywKJ+KBiScgPT4gJyE/JywKJ+KBlycgPT4gJ+KAsuKAsuKAsuKAsicsCifigZ8nID0+ICcgJywKJ+KBsCcgPT4gJzAnLAon4oGxJyA9PiAnaScsCifigbQnID0+ICc0JywKJ+KBtScgPT4gJzUnLAon4oG2JyA9PiAnNicsCifigbcnID0+ICc3JywKJ+KBuCcgPT4gJzgnLAon4oG5JyA9PiAnOScsCifigbonID0+ICcrJywKJ+KBuycgPT4gJ+KIkicsCifigbwnID0+ICc9JywKJ+KBvScgPT4gJygnLAon4oG+JyA9PiAnKScsCifigb8nID0+ICduJywKJ+KCgCcgPT4gJzAnLAon4oKBJyA9PiAnMScsCifigoInID0+ICcyJywKJ+KCgycgPT4gJzMnLAon4oKEJyA9PiAnNCcsCifigoUnID0+ICc1JywKJ+KChicgPT4gJzYnLAon4oKHJyA9PiAnNycsCifigognID0+ICc4JywKJ+KCiScgPT4gJzknLAon4oKKJyA9PiAnKycsCifigosnID0+ICfiiJInLAon4oKMJyA9PiAnPScsCifigo0nID0+ICcoJywKJ+KCjicgPT4gJyknLAon4oKQJyA9PiAnYScsCifigpEnID0+ICdlJywKJ+KCkicgPT4gJ28nLAon4oKTJyA9PiAneCcsCifigpQnID0+ICfJmScsCifigpUnID0+ICdoJywKJ+KClicgPT4gJ2snLAon4oKXJyA9PiAnbCcsCifigpgnID0+ICdtJywKJ+KCmScgPT4gJ24nLAon4oKaJyA9PiAncCcsCifigpsnID0+ICdzJywKJ+KCnCcgPT4gJ3QnLAon4oKoJyA9PiAnUnMnLAon4oSAJyA9PiAnYS9jJywKJ+KEgScgPT4gJ2EvcycsCifihIInID0+ICdDJywKJ+KEgycgPT4gJ8KwQycsCifihIUnID0+ICdjL28nLAon4oSGJyA9PiAnYy91JywKJ+KEhycgPT4gJ8aQJywKJ+KEiScgPT4gJ8KwRicsCifihIonID0+ICdnJywKJ+KEiycgPT4gJ0gnLAon4oSMJyA9PiAnSCcsCifihI0nID0+ICdIJywKJ+KEjicgPT4gJ2gnLAon4oSPJyA9PiAnxKcnLAon4oSQJyA9PiAnSScsCifihJEnID0+ICdJJywKJ+KEkicgPT4gJ0wnLAon4oSTJyA9PiAnbCcsCifihJUnID0+ICdOJywKJ+KElicgPT4gJ05vJywKJ+KEmScgPT4gJ1AnLAon4oSaJyA9PiAnUScsCifihJsnID0+ICdSJywKJ+KEnCcgPT4gJ1InLAon4oSdJyA9PiAnUicsCifihKAnID0+ICdTTScsCifihKEnID0+ICdURUwnLAon4oSiJyA9PiAnVE0nLAon4oSkJyA9PiAnWicsCifihKgnID0+ICdaJywKJ+KErCcgPT4gJ0InLAon4oStJyA9PiAnQycsCifihK8nID0+ICdlJywKJ+KEsCcgPT4gJ0UnLAon4oSxJyA9PiAnRicsCifihLMnID0+ICdNJywKJ+KEtCcgPT4gJ28nLAon4oS1JyA9PiAn15AnLAon4oS2JyA9PiAn15EnLAon4oS3JyA9PiAn15InLAon4oS4JyA9PiAn15MnLAon4oS5JyA9PiAnaScsCifihLsnID0+ICdGQVgnLAon4oS8JyA9PiAnz4AnLAon4oS9JyA9PiAnzrMnLAon4oS+JyA9PiAnzpMnLAon4oS/JyA9PiAnzqAnLAon4oWAJyA9PiAn4oiRJywKJ+KFhScgPT4gJ0QnLAon4oWGJyA9PiAnZCcsCifihYcnID0+ICdlJywKJ+KFiCcgPT4gJ2knLAon4oWJJyA9PiAnaicsCifihZAnID0+ICcx4oGENycsCifihZEnID0+ICcx4oGEOScsCifihZInID0+ICcx4oGEMTAnLAon4oWTJyA9PiAnMeKBhDMnLAon4oWUJyA9PiAnMuKBhDMnLAon4oWVJyA9PiAnMeKBhDUnLAon4oWWJyA9PiAnMuKBhDUnLAon4oWXJyA9PiAnM+KBhDUnLAon4oWYJyA9PiAnNOKBhDUnLAon4oWZJyA9PiAnMeKBhDYnLAon4oWaJyA9PiAnNeKBhDYnLAon4oWbJyA9PiAnMeKBhDgnLAon4oWcJyA9PiAnM+KBhDgnLAon4oWdJyA9PiAnNeKBhDgnLAon4oWeJyA9PiAnN+KBhDgnLAon4oWfJyA9PiAnMeKBhCcsCifihaAnID0+ICdJJywKJ+KFoScgPT4gJ0lJJywKJ+KFoicgPT4gJ0lJSScsCifihaMnID0+ICdJVicsCifihaQnID0+ICdWJywKJ+KFpScgPT4gJ1ZJJywKJ+KFpicgPT4gJ1ZJSScsCifihacnID0+ICdWSUlJJywKJ+KFqCcgPT4gJ0lYJywKJ+KFqScgPT4gJ1gnLAon4oWqJyA9PiAnWEknLAon4oWrJyA9PiAnWElJJywKJ+KFrCcgPT4gJ0wnLAon4oWtJyA9PiAnQycsCifiha4nID0+ICdEJywKJ+KFrycgPT4gJ00nLAon4oWwJyA9PiAnaScsCifihbEnID0+ICdpaScsCifihbInID0+ICdpaWknLAon4oWzJyA9PiAnaXYnLAon4oW0JyA9PiAndicsCifihbUnID0+ICd2aScsCifihbYnID0+ICd2aWknLAon4oW3JyA9PiAndmlpaScsCifihbgnID0+ICdpeCcsCifihbknID0+ICd4JywKJ+KFuicgPT4gJ3hpJywKJ+KFuycgPT4gJ3hpaScsCifihbwnID0+ICdsJywKJ+KFvScgPT4gJ2MnLAon4oW+JyA9PiAnZCcsCifihb8nID0+ICdtJywKJ+KGiScgPT4gJzDigYQzJywKJ+KIrCcgPT4gJ+KIq+KIqycsCifiiK0nID0+ICfiiKviiKviiKsnLAon4oivJyA9PiAn4oiu4oiuJywKJ+KIsCcgPT4gJ+KIruKIruKIricsCifikaAnID0+ICcxJywKJ+KRoScgPT4gJzInLAon4pGiJyA9PiAnMycsCifikaMnID0+ICc0JywKJ+KRpCcgPT4gJzUnLAon4pGlJyA9PiAnNicsCifikaYnID0+ICc3JywKJ+KRpycgPT4gJzgnLAon4pGoJyA9PiAnOScsCifikaknID0+ICcxMCcsCifikaonID0+ICcxMScsCifikasnID0+ICcxMicsCifikawnID0+ICcxMycsCifika0nID0+ICcxNCcsCifika4nID0+ICcxNScsCifika8nID0+ICcxNicsCifikbAnID0+ICcxNycsCifikbEnID0+ICcxOCcsCifikbInID0+ICcxOScsCifikbMnID0+ICcyMCcsCifikbQnID0+ICcoMSknLAon4pG1JyA9PiAnKDIpJywKJ+KRticgPT4gJygzKScsCifikbcnID0+ICcoNCknLAon4pG4JyA9PiAnKDUpJywKJ+KRuScgPT4gJyg2KScsCifikbonID0+ICcoNyknLAon4pG7JyA9PiAnKDgpJywKJ+KRvCcgPT4gJyg5KScsCifikb0nID0+ICcoMTApJywKJ+KRvicgPT4gJygxMSknLAon4pG/JyA9PiAnKDEyKScsCifikoAnID0+ICcoMTMpJywKJ+KSgScgPT4gJygxNCknLAon4pKCJyA9PiAnKDE1KScsCifikoMnID0+ICcoMTYpJywKJ+KShCcgPT4gJygxNyknLAon4pKFJyA9PiAnKDE4KScsCifikoYnID0+ICcoMTkpJywKJ+KShycgPT4gJygyMCknLAon4pKIJyA9PiAnMS4nLAon4pKJJyA9PiAnMi4nLAon4pKKJyA9PiAnMy4nLAon4pKLJyA9PiAnNC4nLAon4pKMJyA9PiAnNS4nLAon4pKNJyA9PiAnNi4nLAon4pKOJyA9PiAnNy4nLAon4pKPJyA9PiAnOC4nLAon4pKQJyA9PiAnOS4nLAon4pKRJyA9PiAnMTAuJywKJ+KSkicgPT4gJzExLicsCifikpMnID0+ICcxMi4nLAon4pKUJyA9PiAnMTMuJywKJ+KSlScgPT4gJzE0LicsCifikpYnID0+ICcxNS4nLAon4pKXJyA9PiAnMTYuJywKJ+KSmCcgPT4gJzE3LicsCifikpknID0+ICcxOC4nLAon4pKaJyA9PiAnMTkuJywKJ+KSmycgPT4gJzIwLicsCifikpwnID0+ICcoYSknLAon4pKdJyA9PiAnKGIpJywKJ+KSnicgPT4gJyhjKScsCifikp8nID0+ICcoZCknLAon4pKgJyA9PiAnKGUpJywKJ+KSoScgPT4gJyhmKScsCifikqInID0+ICcoZyknLAon4pKjJyA9PiAnKGgpJywKJ+KSpCcgPT4gJyhpKScsCifikqUnID0+ICcoaiknLAon4pKmJyA9PiAnKGspJywKJ+KSpycgPT4gJyhsKScsCifikqgnID0+ICcobSknLAon4pKpJyA9PiAnKG4pJywKJ+KSqicgPT4gJyhvKScsCifikqsnID0+ICcocCknLAon4pKsJyA9PiAnKHEpJywKJ+KSrScgPT4gJyhyKScsCifikq4nID0+ICcocyknLAon4pKvJyA9PiAnKHQpJywKJ+KSsCcgPT4gJyh1KScsCifikrEnID0+ICcodiknLAon4pKyJyA9PiAnKHcpJywKJ+KSsycgPT4gJyh4KScsCifikrQnID0+ICcoeSknLAon4pK1JyA9PiAnKHopJywKJ+KSticgPT4gJ0EnLAon4pK3JyA9PiAnQicsCifikrgnID0+ICdDJywKJ+KSuScgPT4gJ0QnLAon4pK6JyA9PiAnRScsCifikrsnID0+ICdGJywKJ+KSvCcgPT4gJ0cnLAon4pK9JyA9PiAnSCcsCifikr4nID0+ICdJJywKJ+KSvycgPT4gJ0onLAon4pOAJyA9PiAnSycsCifik4EnID0+ICdMJywKJ+KTgicgPT4gJ00nLAon4pODJyA9PiAnTicsCifik4QnID0+ICdPJywKJ+KThScgPT4gJ1AnLAon4pOGJyA9PiAnUScsCifik4cnID0+ICdSJywKJ+KTiCcgPT4gJ1MnLAon4pOJJyA9PiAnVCcsCifik4onID0+ICdVJywKJ+KTiycgPT4gJ1YnLAon4pOMJyA9PiAnVycsCifik40nID0+ICdYJywKJ+KTjicgPT4gJ1knLAon4pOPJyA9PiAnWicsCifik5AnID0+ICdhJywKJ+KTkScgPT4gJ2InLAon4pOSJyA9PiAnYycsCifik5MnID0+ICdkJywKJ+KTlCcgPT4gJ2UnLAon4pOVJyA9PiAnZicsCifik5YnID0+ICdnJywKJ+KTlycgPT4gJ2gnLAon4pOYJyA9PiAnaScsCifik5knID0+ICdqJywKJ+KTmicgPT4gJ2snLAon4pObJyA9PiAnbCcsCifik5wnID0+ICdtJywKJ+KTnScgPT4gJ24nLAon4pOeJyA9PiAnbycsCifik58nID0+ICdwJywKJ+KToCcgPT4gJ3EnLAon4pOhJyA9PiAncicsCifik6InID0+ICdzJywKJ+KToycgPT4gJ3QnLAon4pOkJyA9PiAndScsCifik6UnID0+ICd2JywKJ+KTpicgPT4gJ3cnLAon4pOnJyA9PiAneCcsCifik6gnID0+ICd5JywKJ+KTqScgPT4gJ3onLAon4pOqJyA9PiAnMCcsCifiqIwnID0+ICfiiKviiKviiKviiKsnLAon4qm0JyA9PiAnOjo9JywKJ+KptScgPT4gJz09JywKJ+KpticgPT4gJz09PScsCifisbwnID0+ICdqJywKJ+KxvScgPT4gJ1YnLAon4rWvJyA9PiAn4rWhJywKJ+K6nycgPT4gJ+avjScsCifiu7MnID0+ICfpvp8nLAon4ryAJyA9PiAn5LiAJywKJ+K8gScgPT4gJ+S4qCcsCifivIInID0+ICfkuLYnLAon4ryDJyA9PiAn5Li/JywKJ+K8hCcgPT4gJ+S5mScsCifivIUnID0+ICfkuoUnLAon4ryGJyA9PiAn5LqMJywKJ+K8hycgPT4gJ+S6oCcsCifivIgnID0+ICfkuronLAon4ryJJyA9PiAn5YS/JywKJ+K8iicgPT4gJ+WFpScsCifivIsnID0+ICflhasnLAon4ryMJyA9PiAn5YaCJywKJ+K8jScgPT4gJ+WGlicsCifivI4nID0+ICflhqsnLAon4ryPJyA9PiAn5YegJywKJ+K8kCcgPT4gJ+WHtScsCifivJEnID0+ICfliIAnLAon4rySJyA9PiAn5YqbJywKJ+K8kycgPT4gJ+WLuScsCifivJQnID0+ICfljJUnLAon4ryVJyA9PiAn5YyaJywKJ+K8licgPT4gJ+WMuCcsCifivJcnID0+ICfljYEnLAon4ryYJyA9PiAn5Y2cJywKJ+K8mScgPT4gJ+WNqScsCifivJonID0+ICfljoInLAon4rybJyA9PiAn5Y62JywKJ+K8nCcgPT4gJ+WPiCcsCifivJ0nID0+ICflj6MnLAon4ryeJyA9PiAn5ZuXJywKJ+K8nycgPT4gJ+WcnycsCifivKAnID0+ICflo6snLAon4ryhJyA9PiAn5aSCJywKJ+K8oicgPT4gJ+WkiicsCifivKMnID0+ICflpJUnLAon4rykJyA9PiAn5aSnJywKJ+K8pScgPT4gJ+WlsycsCifivKYnID0+ICflrZAnLAon4rynJyA9PiAn5a6AJywKJ+K8qCcgPT4gJ+WvuCcsCifivKknID0+ICflsI8nLAon4ryqJyA9PiAn5bCiJywKJ+K8qycgPT4gJ+WwuCcsCifivKwnID0+ICflsa4nLAon4rytJyA9PiAn5bGxJywKJ+K8ricgPT4gJ+W3mycsCifivK8nID0+ICflt6UnLAon4rywJyA9PiAn5bexJywKJ+K8sScgPT4gJ+W3vicsCifivLInID0+ICflubInLAon4ryzJyA9PiAn5bm6JywKJ+K8tCcgPT4gJ+W5vycsCifivLUnID0+ICflu7QnLAon4ry2JyA9PiAn5bu+JywKJ+K8tycgPT4gJ+W8iycsCifivLgnID0+ICflvJMnLAon4ry5JyA9PiAn5b2QJywKJ+K8uicgPT4gJ+W9oScsCifivLsnID0+ICflvbMnLAon4ry8JyA9PiAn5b+DJywKJ+K8vScgPT4gJ+aIiCcsCifivL4nID0+ICfmiLYnLAon4ry/JyA9PiAn5omLJywKJ+K9gCcgPT4gJ+aUrycsCifivYEnID0+ICfmlLQnLAon4r2CJyA9PiAn5paHJywKJ+K9gycgPT4gJ+aWlycsCifivYQnID0+ICfmlqQnLAon4r2FJyA9PiAn5pa5JywKJ+K9hicgPT4gJ+aXoCcsCifivYcnID0+ICfml6UnLAon4r2IJyA9PiAn5puwJywKJ+K9iScgPT4gJ+aciCcsCifivYonID0+ICfmnKgnLAon4r2LJyA9PiAn5qygJywKJ+K9jCcgPT4gJ+atoicsCifivY0nID0+ICfmrbknLAon4r2OJyA9PiAn5q6zJywKJ+K9jycgPT4gJ+aviycsCifivZAnID0+ICfmr5QnLAon4r2RJyA9PiAn5q+bJywKJ+K9kicgPT4gJ+awjycsCifivZMnID0+ICfmsJQnLAon4r2UJyA9PiAn5rC0JywKJ+K9lScgPT4gJ+eBqycsCifivZYnID0+ICfniKonLAon4r2XJyA9PiAn54i2JywKJ+K9mCcgPT4gJ+eIuycsCifivZknID0+ICfniL8nLAon4r2aJyA9PiAn54mHJywKJ+K9mycgPT4gJ+eJmScsCifivZwnID0+ICfniZsnLAon4r2dJyA9PiAn54qsJywKJ+K9nicgPT4gJ+eOhCcsCifivZ8nID0+ICfnjoknLAon4r2gJyA9PiAn55OcJywKJ+K9oScgPT4gJ+eTpicsCifivaInID0+ICfnlJgnLAon4r2jJyA9PiAn55SfJywKJ+K9pCcgPT4gJ+eUqCcsCifivaUnID0+ICfnlLAnLAon4r2mJyA9PiAn55aLJywKJ+K9pycgPT4gJ+eWkicsCifivagnID0+ICfnmbYnLAon4r2pJyA9PiAn55m9JywKJ+K9qicgPT4gJ+earicsCifivasnID0+ICfnmr8nLAon4r2sJyA9PiAn55uuJywKJ+K9rScgPT4gJ+efmycsCifiva4nID0+ICfnn6InLAon4r2vJyA9PiAn55+zJywKJ+K9sCcgPT4gJ+ekuicsCifivbEnID0+ICfnprgnLAon4r2yJyA9PiAn56a+JywKJ+K9sycgPT4gJ+eptCcsCifivbQnID0+ICfnq4snLAon4r21JyA9PiAn56u5JywKJ+K9ticgPT4gJ+exsycsCifivbcnID0+ICfns7gnLAon4r24JyA9PiAn57y2JywKJ+K9uScgPT4gJ+e9kScsCifivbonID0+ICfnvoonLAon4r27JyA9PiAn5769JywKJ+K9vCcgPT4gJ+iAgScsCifivb0nID0+ICfogIwnLAon4r2+JyA9PiAn6ICSJywKJ+K9vycgPT4gJ+iAsycsCifivoAnID0+ICfogb8nLAon4r6BJyA9PiAn6IKJJywKJ+K+gicgPT4gJ+iHoycsCifivoMnID0+ICfoh6onLAon4r6EJyA9PiAn6IezJywKJ+K+hScgPT4gJ+iHvCcsCifivoYnID0+ICfoiIwnLAon4r6HJyA9PiAn6IibJywKJ+K+iCcgPT4gJ+iInycsCifivoknID0+ICfoia4nLAon4r6KJyA9PiAn6ImyJywKJ+K+iycgPT4gJ+iJuCcsCifivownID0+ICfomY0nLAon4r6NJyA9PiAn6JmrJywKJ+K+jicgPT4gJ+ihgCcsCifivo8nID0+ICfooYwnLAon4r6QJyA9PiAn6KGjJywKJ+K+kScgPT4gJ+ilvicsCifivpInID0+ICfoposnLAon4r6TJyA9PiAn6KeSJywKJ+K+lCcgPT4gJ+iogCcsCifivpUnID0+ICfosLcnLAon4r6WJyA9PiAn6LGGJywKJ+K+lycgPT4gJ+ixlScsCifivpgnID0+ICfosbgnLAon4r6ZJyA9PiAn6LKdJywKJ+K+micgPT4gJ+i1pCcsCifivpsnID0+ICfotbAnLAon4r6cJyA9PiAn6LazJywKJ+K+nScgPT4gJ+i6qycsCifivp4nID0+ICfou4onLAon4r6fJyA9PiAn6L6bJywKJ+K+oCcgPT4gJ+i+sCcsCifivqEnID0+ICfovrUnLAon4r6iJyA9PiAn6YKRJywKJ+K+oycgPT4gJ+mFiScsCifivqQnID0+ICfph4YnLAon4r6lJyA9PiAn6YeMJywKJ+K+picgPT4gJ+mHkScsCifivqcnID0+ICfplbcnLAon4r6oJyA9PiAn6ZaAJywKJ+K+qScgPT4gJ+mYnCcsCifivqonID0+ICfpmrYnLAon4r6rJyA9PiAn6Zq5JywKJ+K+rCcgPT4gJ+mbqCcsCifivq0nID0+ICfpnZEnLAon4r6uJyA9PiAn6Z2eJywKJ+K+rycgPT4gJ+mdoicsCifivrAnID0+ICfpnaknLAon4r6xJyA9PiAn6Z+LJywKJ+K+sicgPT4gJ+mfrScsCifivrMnID0+ICfpn7MnLAon4r60JyA9PiAn6aCBJywKJ+K+tScgPT4gJ+miqCcsCifivrYnID0+ICfpo5snLAon4r63JyA9PiAn6aOfJywKJ+K+uCcgPT4gJ+mmlicsCifivrknID0+ICfpppknLAon4r66JyA9PiAn6aasJywKJ+K+uycgPT4gJ+mqqCcsCifivrwnID0+ICfpq5gnLAon4r69JyA9PiAn6aufJywKJ+K+vicgPT4gJ+mspScsCifivr8nID0+ICfprK8nLAon4r+AJyA9PiAn6ayyJywKJ+K/gScgPT4gJ+msvCcsCifiv4InID0+ICfprZonLAon4r+DJyA9PiAn6bOlJywKJ+K/hCcgPT4gJ+m5tScsCifiv4UnID0+ICfpub8nLAon4r+GJyA9PiAn6bqlJywKJ+K/hycgPT4gJ+m6uycsCifiv4gnID0+ICfpu4MnLAon4r+JJyA9PiAn6buNJywKJ+K/iicgPT4gJ+m7kScsCifiv4snID0+ICfpu7knLAon4r+MJyA9PiAn6bu9JywKJ+K/jScgPT4gJ+m8jicsCifiv44nID0+ICfpvJMnLAon4r+PJyA9PiAn6bygJywKJ+K/kCcgPT4gJ+m8uycsCifiv5EnID0+ICfpvYonLAon4r+SJyA9PiAn6b2SJywKJ+K/kycgPT4gJ+m+jScsCifiv5QnID0+ICfpvpwnLAon4r+VJyA9PiAn6b6gJywKJ+OAgCcgPT4gJyAnLAon44C2JyA9PiAn44CSJywKJ+OAuCcgPT4gJ+WNgScsCifjgLknID0+ICfljYQnLAon44C6JyA9PiAn5Y2FJywKJ+OCmycgPT4gJyDjgpknLAon44KcJyA9PiAnIOOCmicsCifjgp8nID0+ICfjgojjgoonLAon44O/JyA9PiAn44Kz44OIJywKJ+OEsScgPT4gJ+GEgCcsCifjhLInID0+ICfhhIEnLAon44SzJyA9PiAn4YaqJywKJ+OEtCcgPT4gJ+GEgicsCifjhLUnID0+ICfhhqwnLAon44S2JyA9PiAn4YatJywKJ+OEtycgPT4gJ+GEgycsCifjhLgnID0+ICfhhIQnLAon44S5JyA9PiAn4YSFJywKJ+OEuicgPT4gJ+GGsCcsCifjhLsnID0+ICfhhrEnLAon44S8JyA9PiAn4YayJywKJ+OEvScgPT4gJ+GGsycsCifjhL4nID0+ICfhhrQnLAon44S/JyA9PiAn4Ya1JywKJ+OFgCcgPT4gJ+GEmicsCifjhYEnID0+ICfhhIYnLAon44WCJyA9PiAn4YSHJywKJ+OFgycgPT4gJ+GEiCcsCifjhYQnID0+ICfhhKEnLAon44WFJyA9PiAn4YSJJywKJ+OFhicgPT4gJ+GEiicsCifjhYcnID0+ICfhhIsnLAon44WIJyA9PiAn4YSMJywKJ+OFiScgPT4gJ+GEjScsCifjhYonID0+ICfhhI4nLAon44WLJyA9PiAn4YSPJywKJ+OFjCcgPT4gJ+GEkCcsCifjhY0nID0+ICfhhJEnLAon44WOJyA9PiAn4YSSJywKJ+OFjycgPT4gJ+GFoScsCifjhZAnID0+ICfhhaInLAon44WRJyA9PiAn4YWjJywKJ+OFkicgPT4gJ+GFpCcsCifjhZMnID0+ICfhhaUnLAon44WUJyA9PiAn4YWmJywKJ+OFlScgPT4gJ+GFpycsCifjhZYnID0+ICfhhagnLAon44WXJyA9PiAn4YWpJywKJ+OFmCcgPT4gJ+GFqicsCifjhZknID0+ICfhhasnLAon44WaJyA9PiAn4YWsJywKJ+OFmycgPT4gJ+GFrScsCifjhZwnID0+ICfhha4nLAon44WdJyA9PiAn4YWvJywKJ+OFnicgPT4gJ+GFsCcsCifjhZ8nID0+ICfhhbEnLAon44WgJyA9PiAn4YWyJywKJ+OFoScgPT4gJ+GFsycsCifjhaInID0+ICfhhbQnLAon44WjJyA9PiAn4YW1JywKJ+OFpCcgPT4gJ+GFoCcsCifjhaUnID0+ICfhhJQnLAon44WmJyA9PiAn4YSVJywKJ+OFpycgPT4gJ+GHhycsCifjhagnID0+ICfhh4gnLAon44WpJyA9PiAn4YeMJywKJ+OFqicgPT4gJ+GHjicsCifjhasnID0+ICfhh5MnLAon44WsJyA9PiAn4YeXJywKJ+OFrScgPT4gJ+GHmScsCifjha4nID0+ICfhhJwnLAon44WvJyA9PiAn4YedJywKJ+OFsCcgPT4gJ+GHnycsCifjhbEnID0+ICfhhJ0nLAon44WyJyA9PiAn4YSeJywKJ+OFsycgPT4gJ+GEoCcsCifjhbQnID0+ICfhhKInLAon44W1JyA9PiAn4YSjJywKJ+OFticgPT4gJ+GEpycsCifjhbcnID0+ICfhhKknLAon44W4JyA9PiAn4YSrJywKJ+OFuScgPT4gJ+GErCcsCifjhbonID0+ICfhhK0nLAon44W7JyA9PiAn4YSuJywKJ+OFvCcgPT4gJ+GErycsCifjhb0nID0+ICfhhLInLAon44W+JyA9PiAn4YS2JywKJ+OFvycgPT4gJ+GFgCcsCifjhoAnID0+ICfhhYcnLAon44aBJyA9PiAn4YWMJywKJ+OGgicgPT4gJ+GHsScsCifjhoMnID0+ICfhh7InLAon44aEJyA9PiAn4YWXJywKJ+OGhScgPT4gJ+GFmCcsCifjhoYnID0+ICfhhZknLAon44aHJyA9PiAn4YaEJywKJ+OGiCcgPT4gJ+GGhScsCifjhoknID0+ICfhhognLAon44aKJyA9PiAn4YaRJywKJ+OGiycgPT4gJ+GGkicsCifjhownID0+ICfhhpQnLAon44aNJyA9PiAn4YaeJywKJ+OGjicgPT4gJ+GGoScsCifjhpInID0+ICfkuIAnLAon44aTJyA9PiAn5LqMJywKJ+OGlCcgPT4gJ+S4iScsCifjhpUnID0+ICflm5snLAon44aWJyA9PiAn5LiKJywKJ+OGlycgPT4gJ+S4rScsCifjhpgnID0+ICfkuIsnLAon44aZJyA9PiAn55SyJywKJ+OGmicgPT4gJ+S5mScsCifjhpsnID0+ICfkuJknLAon44acJyA9PiAn5LiBJywKJ+OGnScgPT4gJ+WkqScsCifjhp4nID0+ICflnLAnLAon44afJyA9PiAn5Lq6JywKJ+OIgCcgPT4gJyjhhIApJywKJ+OIgScgPT4gJyjhhIIpJywKJ+OIgicgPT4gJyjhhIMpJywKJ+OIgycgPT4gJyjhhIUpJywKJ+OIhCcgPT4gJyjhhIYpJywKJ+OIhScgPT4gJyjhhIcpJywKJ+OIhicgPT4gJyjhhIkpJywKJ+OIhycgPT4gJyjhhIspJywKJ+OIiCcgPT4gJyjhhIwpJywKJ+OIiScgPT4gJyjhhI4pJywKJ+OIiicgPT4gJyjhhI8pJywKJ+OIiycgPT4gJyjhhJApJywKJ+OIjCcgPT4gJyjhhJEpJywKJ+OIjScgPT4gJyjhhJIpJywKJ+OIjicgPT4gJyjhhIDhhaEpJywKJ+OIjycgPT4gJyjhhILhhaEpJywKJ+OIkCcgPT4gJyjhhIPhhaEpJywKJ+OIkScgPT4gJyjhhIXhhaEpJywKJ+OIkicgPT4gJyjhhIbhhaEpJywKJ+OIkycgPT4gJyjhhIfhhaEpJywKJ+OIlCcgPT4gJyjhhInhhaEpJywKJ+OIlScgPT4gJyjhhIvhhaEpJywKJ+OIlicgPT4gJyjhhIzhhaEpJywKJ+OIlycgPT4gJyjhhI7hhaEpJywKJ+OImCcgPT4gJyjhhI/hhaEpJywKJ+OImScgPT4gJyjhhJDhhaEpJywKJ+OImicgPT4gJyjhhJHhhaEpJywKJ+OImycgPT4gJyjhhJLhhaEpJywKJ+OInCcgPT4gJyjhhIzhha4pJywKJ+OInScgPT4gJyjhhIvhhanhhIzhhaXhhqspJywKJ+OInicgPT4gJyjhhIvhhanhhJLhha4pJywKJ+OIoCcgPT4gJyjkuIApJywKJ+OIoScgPT4gJyjkuowpJywKJ+OIoicgPT4gJyjkuIkpJywKJ+OIoycgPT4gJyjlm5spJywKJ+OIpCcgPT4gJyjkupQpJywKJ+OIpScgPT4gJyjlha0pJywKJ+OIpicgPT4gJyjkuIMpJywKJ+OIpycgPT4gJyjlhaspJywKJ+OIqCcgPT4gJyjkuZ0pJywKJ+OIqScgPT4gJyjljYEpJywKJ+OIqicgPT4gJyjmnIgpJywKJ+OIqycgPT4gJyjngaspJywKJ+OIrCcgPT4gJyjmsLQpJywKJ+OIrScgPT4gJyjmnKgpJywKJ+OIricgPT4gJyjph5EpJywKJ+OIrycgPT4gJyjlnJ8pJywKJ+OIsCcgPT4gJyjml6UpJywKJ+OIsScgPT4gJyjmoKopJywKJ+OIsicgPT4gJyjmnIkpJywKJ+OIsycgPT4gJyjnpL4pJywKJ+OItCcgPT4gJyjlkI0pJywKJ+OItScgPT4gJyjnibkpJywKJ+OIticgPT4gJyjosqEpJywKJ+OItycgPT4gJyjnpZ0pJywKJ+OIuCcgPT4gJyjlirQpJywKJ+OIuScgPT4gJyjku6MpJywKJ+OIuicgPT4gJyjlkbwpJywKJ+OIuycgPT4gJyjlraYpJywKJ+OIvCcgPT4gJyjnm6MpJywKJ+OIvScgPT4gJyjkvIEpJywKJ+OIvicgPT4gJyjos4cpJywKJ+OIvycgPT4gJyjljZQpJywKJ+OJgCcgPT4gJyjnpa0pJywKJ+OJgScgPT4gJyjkvJEpJywKJ+OJgicgPT4gJyjoh6opJywKJ+OJgycgPT4gJyjoh7MpJywKJ+OJhCcgPT4gJ+WVjycsCifjiYUnID0+ICflubwnLAon44mGJyA9PiAn5paHJywKJ+OJhycgPT4gJ+eujycsCifjiZAnID0+ICdQVEUnLAon44mRJyA9PiAnMjEnLAon44mSJyA9PiAnMjInLAon44mTJyA9PiAnMjMnLAon44mUJyA9PiAnMjQnLAon44mVJyA9PiAnMjUnLAon44mWJyA9PiAnMjYnLAon44mXJyA9PiAnMjcnLAon44mYJyA9PiAnMjgnLAon44mZJyA9PiAnMjknLAon44maJyA9PiAnMzAnLAon44mbJyA9PiAnMzEnLAon44mcJyA9PiAnMzInLAon44mdJyA9PiAnMzMnLAon44meJyA9PiAnMzQnLAon44mfJyA9PiAnMzUnLAon44mgJyA9PiAn4YSAJywKJ+OJoScgPT4gJ+GEgicsCifjiaInID0+ICfhhIMnLAon44mjJyA9PiAn4YSFJywKJ+OJpCcgPT4gJ+GEhicsCifjiaUnID0+ICfhhIcnLAon44mmJyA9PiAn4YSJJywKJ+OJpycgPT4gJ+GEiycsCifjiagnID0+ICfhhIwnLAon44mpJyA9PiAn4YSOJywKJ+OJqicgPT4gJ+GEjycsCifjiasnID0+ICfhhJAnLAon44msJyA9PiAn4YSRJywKJ+OJrScgPT4gJ+GEkicsCifjia4nID0+ICfhhIDhhaEnLAon44mvJyA9PiAn4YSC4YWhJywKJ+OJsCcgPT4gJ+GEg+GFoScsCifjibEnID0+ICfhhIXhhaEnLAon44myJyA9PiAn4YSG4YWhJywKJ+OJsycgPT4gJ+GEh+GFoScsCifjibQnID0+ICfhhInhhaEnLAon44m1JyA9PiAn4YSL4YWhJywKJ+OJticgPT4gJ+GEjOGFoScsCifjibcnID0+ICfhhI7hhaEnLAon44m4JyA9PiAn4YSP4YWhJywKJ+OJuScgPT4gJ+GEkOGFoScsCifjibonID0+ICfhhJHhhaEnLAon44m7JyA9PiAn4YSS4YWhJywKJ+OJvCcgPT4gJ+GEjuGFoeGGt+GEgOGFqScsCifjib0nID0+ICfhhIzhha7hhIvhhbQnLAon44m+JyA9PiAn4YSL4YWuJywKJ+OKgCcgPT4gJ+S4gCcsCifjioEnID0+ICfkuownLAon44qCJyA9PiAn5LiJJywKJ+OKgycgPT4gJ+WbmycsCifjioQnID0+ICfkupQnLAon44qFJyA9PiAn5YWtJywKJ+OKhicgPT4gJ+S4gycsCifjiocnID0+ICflhasnLAon44qIJyA9PiAn5LmdJywKJ+OKiScgPT4gJ+WNgScsCifjioonID0+ICfmnIgnLAon44qLJyA9PiAn54GrJywKJ+OKjCcgPT4gJ+awtCcsCifjio0nID0+ICfmnKgnLAon44qOJyA9PiAn6YeRJywKJ+OKjycgPT4gJ+WcnycsCifjipAnID0+ICfml6UnLAon44qRJyA9PiAn5qCqJywKJ+OKkicgPT4gJ+aciScsCifjipMnID0+ICfnpL4nLAon44qUJyA9PiAn5ZCNJywKJ+OKlScgPT4gJ+eJuScsCifjipYnID0+ICfosqEnLAon44qXJyA9PiAn56WdJywKJ+OKmCcgPT4gJ+WKtCcsCifjipknID0+ICfnp5gnLAon44qaJyA9PiAn55S3JywKJ+OKmycgPT4gJ+WlsycsCifjipwnID0+ICfpgaknLAon44qdJyA9PiAn5YSqJywKJ+OKnicgPT4gJ+WNsCcsCifjip8nID0+ICfms6gnLAon44qgJyA9PiAn6aCFJywKJ+OKoScgPT4gJ+S8kScsCifjiqInID0+ICflhpknLAon44qjJyA9PiAn5q2jJywKJ+OKpCcgPT4gJ+S4iicsCifjiqUnID0+ICfkuK0nLAon44qmJyA9PiAn5LiLJywKJ+OKpycgPT4gJ+W3picsCifjiqgnID0+ICflj7MnLAon44qpJyA9PiAn5Yy7JywKJ+OKqicgPT4gJ+WulycsCifjiqsnID0+ICflraYnLAon44qsJyA9PiAn55ujJywKJ+OKrScgPT4gJ+S8gScsCifjiq4nID0+ICfos4cnLAon44qvJyA9PiAn5Y2UJywKJ+OKsCcgPT4gJ+WknCcsCifjirEnID0+ICczNicsCifjirInID0+ICczNycsCifjirMnID0+ICczOCcsCifjirQnID0+ICczOScsCifjirUnID0+ICc0MCcsCifjirYnID0+ICc0MScsCifjircnID0+ICc0MicsCifjirgnID0+ICc0MycsCifjirknID0+ICc0NCcsCifjironID0+ICc0NScsCifjirsnID0+ICc0NicsCifjirwnID0+ICc0NycsCifjir0nID0+ICc0OCcsCifjir4nID0+ICc0OScsCifjir8nID0+ICc1MCcsCifji4AnID0+ICcx5pyIJywKJ+OLgScgPT4gJzLmnIgnLAon44uCJyA9PiAnM+aciCcsCifji4MnID0+ICc05pyIJywKJ+OLhCcgPT4gJzXmnIgnLAon44uFJyA9PiAnNuaciCcsCifji4YnID0+ICc35pyIJywKJ+OLhycgPT4gJzjmnIgnLAon44uIJyA9PiAnOeaciCcsCifji4knID0+ICcxMOaciCcsCifji4onID0+ICcxMeaciCcsCifji4snID0+ICcxMuaciCcsCifji4wnID0+ICdIZycsCifji40nID0+ICdlcmcnLAon44uOJyA9PiAnZVYnLAon44uPJyA9PiAnTFREJywKJ+OLkCcgPT4gJ+OCoicsCifji5EnID0+ICfjgqQnLAon44uSJyA9PiAn44KmJywKJ+OLkycgPT4gJ+OCqCcsCifji5QnID0+ICfjgqonLAon44uVJyA9PiAn44KrJywKJ+OLlicgPT4gJ+OCrScsCifji5cnID0+ICfjgq8nLAon44uYJyA9PiAn44KxJywKJ+OLmScgPT4gJ+OCsycsCifji5onID0+ICfjgrUnLAon44ubJyA9PiAn44K3JywKJ+OLnCcgPT4gJ+OCuScsCifji50nID0+ICfjgrsnLAon44ueJyA9PiAn44K9JywKJ+OLnycgPT4gJ+OCvycsCifji6AnID0+ICfjg4EnLAon44uhJyA9PiAn44OEJywKJ+OLoicgPT4gJ+ODhicsCifji6MnID0+ICfjg4gnLAon44ukJyA9PiAn44OKJywKJ+OLpScgPT4gJ+ODiycsCifji6YnID0+ICfjg4wnLAon44unJyA9PiAn44ONJywKJ+OLqCcgPT4gJ+ODjicsCifji6knID0+ICfjg48nLAon44uqJyA9PiAn44OSJywKJ+OLqycgPT4gJ+ODlScsCifji6wnID0+ICfjg5gnLAon44utJyA9PiAn44ObJywKJ+OLricgPT4gJ+ODnicsCifji68nID0+ICfjg58nLAon44uwJyA9PiAn44OgJywKJ+OLsScgPT4gJ+ODoScsCifji7InID0+ICfjg6InLAon44uzJyA9PiAn44OkJywKJ+OLtCcgPT4gJ+ODpicsCifji7UnID0+ICfjg6gnLAon44u2JyA9PiAn44OpJywKJ+OLtycgPT4gJ+ODqicsCifji7gnID0+ICfjg6snLAon44u5JyA9PiAn44OsJywKJ+OLuicgPT4gJ+ODrScsCifji7snID0+ICfjg68nLAon44u8JyA9PiAn44OwJywKJ+OLvScgPT4gJ+ODsScsCifji74nID0+ICfjg7InLAon44u/JyA9PiAn5Luk5ZKMJywKJ+OMgCcgPT4gJ+OCouODj+OCmuODvOODiCcsCifjjIEnID0+ICfjgqLjg6vjg5XjgqEnLAon44yCJyA9PiAn44Ki44Oz44OY44Ka44KiJywKJ+OMgycgPT4gJ+OCouODvOODqycsCifjjIQnID0+ICfjgqTjg4vjg7Pjgq/jgpknLAon44yFJyA9PiAn44Kk44Oz44OBJywKJ+OMhicgPT4gJ+OCpuOCqeODsycsCifjjIcnID0+ICfjgqjjgrnjgq/jg7zjg4jjgpknLAon44yIJyA9PiAn44Ko44O844Kr44O8JywKJ+OMiScgPT4gJ+OCquODs+OCuScsCifjjIonID0+ICfjgqrjg7zjg6AnLAon44yLJyA9PiAn44Kr44Kk44OqJywKJ+OMjCcgPT4gJ+OCq+ODqeODg+ODiCcsCifjjI0nID0+ICfjgqvjg63jg6rjg7wnLAon44yOJyA9PiAn44Kr44KZ44Ot44OzJywKJ+OMjycgPT4gJ+OCq+OCmeODs+ODnicsCifjjJAnID0+ICfjgq3jgpnjgqvjgpknLAon44yRJyA9PiAn44Kt44KZ44OL44O8JywKJ+OMkicgPT4gJ+OCreODpeODquODvCcsCifjjJMnID0+ICfjgq3jgpnjg6vjgr/jgpnjg7wnLAon44yUJyA9PiAn44Kt44OtJywKJ+OMlScgPT4gJ+OCreODreOCr+OCmeODqeODoCcsCifjjJYnID0+ICfjgq3jg63jg6Hjg7zjg4jjg6snLAon44yXJyA9PiAn44Kt44Ot44Ov44OD44OIJywKJ+OMmCcgPT4gJ+OCr+OCmeODqeODoCcsCifjjJknID0+ICfjgq/jgpnjg6njg6Djg4jjg7MnLAon44yaJyA9PiAn44Kv44Or44K744KZ44Kk44OtJywKJ+OMmycgPT4gJ+OCr+ODreODvOODjScsCifjjJwnID0+ICfjgrHjg7zjgrknLAon44ydJyA9PiAn44Kz44Or44OKJywKJ+OMnicgPT4gJ+OCs+ODvOODm+OCmicsCifjjJ8nID0+ICfjgrXjgqTjgq/jg6snLAon44ygJyA9PiAn44K144Oz44OB44O844OgJywKJ+OMoScgPT4gJ+OCt+ODquODs+OCr+OCmScsCifjjKInID0+ICfjgrvjg7Pjg4EnLAon44yjJyA9PiAn44K744Oz44OIJywKJ+OMpCcgPT4gJ+OCv+OCmeODvOOCuScsCifjjKUnID0+ICfjg4bjgpnjgrcnLAon44ymJyA9PiAn44OI44KZ44OrJywKJ+OMpycgPT4gJ+ODiOODsycsCifjjKgnID0+ICfjg4rjg44nLAon44ypJyA9PiAn44OO44OD44OIJywKJ+OMqicgPT4gJ+ODj+OCpOODhCcsCifjjKsnID0+ICfjg4/jgprjg7zjgrvjg7Pjg4gnLAon44ysJyA9PiAn44OP44Ka44O844OEJywKJ+OMrScgPT4gJ+ODj+OCmeODvOODrOODqycsCifjjK4nID0+ICfjg5LjgprjgqLjgrnjg4jjg6snLAon44yvJyA9PiAn44OS44Ka44Kv44OrJywKJ+OMsCcgPT4gJ+ODkuOCmuOCsycsCifjjLEnID0+ICfjg5Ljgpnjg6snLAon44yyJyA9PiAn44OV44Kh44Op44OD44OI44KZJywKJ+OMsycgPT4gJ+ODleOCo+ODvOODiCcsCifjjLQnID0+ICfjg5Xjgpnjg4Pjgrfjgqfjg6snLAon44y1JyA9PiAn44OV44Op44OzJywKJ+OMticgPT4gJ+ODmOOCr+OCv+ODvOODqycsCifjjLcnID0+ICfjg5jjgprjgr0nLAon44y4JyA9PiAn44OY44Ka44OL44OSJywKJ+OMuScgPT4gJ+ODmOODq+ODhCcsCifjjLonID0+ICfjg5jjgprjg7PjgrknLAon44y7JyA9PiAn44OY44Ka44O844K344KZJywKJ+OMvCcgPT4gJ+ODmOOCmeODvOOCvycsCifjjL0nID0+ICfjg5vjgprjgqTjg7Pjg4gnLAon44y+JyA9PiAn44Ob44KZ44Or44OIJywKJ+OMvycgPT4gJ+ODm+ODsycsCifjjYAnID0+ICfjg5vjgprjg7Pjg4jjgpknLAon442BJyA9PiAn44Ob44O844OrJywKJ+ONgicgPT4gJ+ODm+ODvOODsycsCifjjYMnID0+ICfjg57jgqTjgq/jg60nLAon442EJyA9PiAn44Oe44Kk44OrJywKJ+ONhScgPT4gJ+ODnuODg+ODjycsCifjjYYnID0+ICfjg57jg6vjgq8nLAon442HJyA9PiAn44Oe44Oz44K344On44OzJywKJ+ONiCcgPT4gJ+ODn+OCr+ODreODsycsCifjjYknID0+ICfjg5/jg6onLAon442KJyA9PiAn44Of44Oq44OP44KZ44O844OrJywKJ+ONiycgPT4gJ+ODoeOCq+OCmScsCifjjYwnID0+ICfjg6Hjgqvjgpnjg4jjg7MnLAon442NJyA9PiAn44Oh44O844OI44OrJywKJ+ONjicgPT4gJ+ODpOODvOODiOOCmScsCifjjY8nID0+ICfjg6Tjg7zjg6snLAon442QJyA9PiAn44Om44Ki44OzJywKJ+ONkScgPT4gJ+ODquODg+ODiOODqycsCifjjZInID0+ICfjg6rjg6knLAon442TJyA9PiAn44Or44OS44Ka44O8JywKJ+ONlCcgPT4gJ+ODq+ODvOODleOCmeODqycsCifjjZUnID0+ICfjg6zjg6AnLAon442WJyA9PiAn44Os44Oz44OI44Kx44KZ44OzJywKJ+ONlycgPT4gJ+ODr+ODg+ODiCcsCifjjZgnID0+ICcw54K5JywKJ+ONmScgPT4gJzHngrknLAon442aJyA9PiAnMueCuScsCifjjZsnID0+ICcz54K5JywKJ+ONnCcgPT4gJzTngrknLAon442dJyA9PiAnNeeCuScsCifjjZ4nID0+ICc254K5JywKJ+ONnycgPT4gJzfngrknLAon442gJyA9PiAnOOeCuScsCifjjaEnID0+ICc554K5JywKJ+ONoicgPT4gJzEw54K5JywKJ+ONoycgPT4gJzEx54K5JywKJ+ONpCcgPT4gJzEy54K5JywKJ+ONpScgPT4gJzEz54K5JywKJ+ONpicgPT4gJzE054K5JywKJ+ONpycgPT4gJzE154K5JywKJ+ONqCcgPT4gJzE254K5JywKJ+ONqScgPT4gJzE354K5JywKJ+ONqicgPT4gJzE454K5JywKJ+ONqycgPT4gJzE554K5JywKJ+ONrCcgPT4gJzIw54K5JywKJ+ONrScgPT4gJzIx54K5JywKJ+ONricgPT4gJzIy54K5JywKJ+ONrycgPT4gJzIz54K5JywKJ+ONsCcgPT4gJzI054K5JywKJ+ONsScgPT4gJ2hQYScsCifjjbInID0+ICdkYScsCifjjbMnID0+ICdBVScsCifjjbQnID0+ICdiYXInLAon4421JyA9PiAnb1YnLAon4422JyA9PiAncGMnLAon4423JyA9PiAnZG0nLAon4424JyA9PiAnZG0yJywKJ+ONuScgPT4gJ2RtMycsCifjjbonID0+ICdJVScsCifjjbsnID0+ICflubPmiJAnLAon4428JyA9PiAn5pit5ZKMJywKJ+ONvScgPT4gJ+Wkp+atoycsCifjjb4nID0+ICfmmI7msrsnLAon442/JyA9PiAn5qCq5byP5Lya56S+JywKJ+OOgCcgPT4gJ3BBJywKJ+OOgScgPT4gJ25BJywKJ+OOgicgPT4gJ868QScsCifjjoMnID0+ICdtQScsCifjjoQnID0+ICdrQScsCifjjoUnID0+ICdLQicsCifjjoYnID0+ICdNQicsCifjjocnID0+ICdHQicsCifjjognID0+ICdjYWwnLAon446JJyA9PiAna2NhbCcsCifjjoonID0+ICdwRicsCifjjosnID0+ICduRicsCifjjownID0+ICfOvEYnLAon446NJyA9PiAnzrxnJywKJ+OOjicgPT4gJ21nJywKJ+OOjycgPT4gJ2tnJywKJ+OOkCcgPT4gJ0h6JywKJ+OOkScgPT4gJ2tIeicsCifjjpInID0+ICdNSHonLAon446TJyA9PiAnR0h6JywKJ+OOlCcgPT4gJ1RIeicsCifjjpUnID0+ICfOvGwnLAon446WJyA9PiAnbWwnLAon446XJyA9PiAnZGwnLAon446YJyA9PiAna2wnLAon446ZJyA9PiAnZm0nLAon446aJyA9PiAnbm0nLAon446bJyA9PiAnzrxtJywKJ+OOnCcgPT4gJ21tJywKJ+OOnScgPT4gJ2NtJywKJ+OOnicgPT4gJ2ttJywKJ+OOnycgPT4gJ21tMicsCifjjqAnID0+ICdjbTInLAon446hJyA9PiAnbTInLAon446iJyA9PiAna20yJywKJ+OOoycgPT4gJ21tMycsCifjjqQnID0+ICdjbTMnLAon446lJyA9PiAnbTMnLAon446mJyA9PiAna20zJywKJ+OOpycgPT4gJ23iiJVzJywKJ+OOqCcgPT4gJ23iiJVzMicsCifjjqknID0+ICdQYScsCifjjqonID0+ICdrUGEnLAon446rJyA9PiAnTVBhJywKJ+OOrCcgPT4gJ0dQYScsCifjjq0nID0+ICdyYWQnLAon446uJyA9PiAncmFk4oiVcycsCifjjq8nID0+ICdyYWTiiJVzMicsCifjjrAnID0+ICdwcycsCifjjrEnID0+ICducycsCifjjrInID0+ICfOvHMnLAon446zJyA9PiAnbXMnLAon4460JyA9PiAncFYnLAon4461JyA9PiAnblYnLAon4462JyA9PiAnzrxWJywKJ+OOtycgPT4gJ21WJywKJ+OOuCcgPT4gJ2tWJywKJ+OOuScgPT4gJ01WJywKJ+OOuicgPT4gJ3BXJywKJ+OOuycgPT4gJ25XJywKJ+OOvCcgPT4gJ868VycsCifjjr0nID0+ICdtVycsCifjjr4nID0+ICdrVycsCifjjr8nID0+ICdNVycsCifjj4AnID0+ICdrzqknLAon44+BJyA9PiAnTc6pJywKJ+OPgicgPT4gJ2EubS4nLAon44+DJyA9PiAnQnEnLAon44+EJyA9PiAnY2MnLAon44+FJyA9PiAnY2QnLAon44+GJyA9PiAnQ+KIlWtnJywKJ+OPhycgPT4gJ0NvLicsCifjj4gnID0+ICdkQicsCifjj4knID0+ICdHeScsCifjj4onID0+ICdoYScsCifjj4snID0+ICdIUCcsCifjj4wnID0+ICdpbicsCifjj40nID0+ICdLSycsCifjj44nID0+ICdLTScsCifjj48nID0+ICdrdCcsCifjj5AnID0+ICdsbScsCifjj5EnID0+ICdsbicsCifjj5InID0+ICdsb2cnLAon44+TJyA9PiAnbHgnLAon44+UJyA9PiAnbWInLAon44+VJyA9PiAnbWlsJywKJ+OPlicgPT4gJ21vbCcsCifjj5cnID0+ICdQSCcsCifjj5gnID0+ICdwLm0uJywKJ+OPmScgPT4gJ1BQTScsCifjj5onID0+ICdQUicsCifjj5snID0+ICdzcicsCifjj5wnID0+ICdTdicsCifjj50nID0+ICdXYicsCifjj54nID0+ICdW4oiVbScsCifjj58nID0+ICdB4oiVbScsCifjj6AnID0+ICcx5pelJywKJ+OPoScgPT4gJzLml6UnLAon44+iJyA9PiAnM+aXpScsCifjj6MnID0+ICc05pelJywKJ+OPpCcgPT4gJzXml6UnLAon44+lJyA9PiAnNuaXpScsCifjj6YnID0+ICc35pelJywKJ+OPpycgPT4gJzjml6UnLAon44+oJyA9PiAnOeaXpScsCifjj6knID0+ICcxMOaXpScsCifjj6onID0+ICcxMeaXpScsCifjj6snID0+ICcxMuaXpScsCifjj6wnID0+ICcxM+aXpScsCifjj60nID0+ICcxNOaXpScsCifjj64nID0+ICcxNeaXpScsCifjj68nID0+ICcxNuaXpScsCifjj7AnID0+ICcxN+aXpScsCifjj7EnID0+ICcxOOaXpScsCifjj7InID0+ICcxOeaXpScsCifjj7MnID0+ICcyMOaXpScsCifjj7QnID0+ICcyMeaXpScsCifjj7UnID0+ICcyMuaXpScsCifjj7YnID0+ICcyM+aXpScsCifjj7cnID0+ICcyNOaXpScsCifjj7gnID0+ICcyNeaXpScsCifjj7knID0+ICcyNuaXpScsCifjj7onID0+ICcyN+aXpScsCifjj7snID0+ICcyOOaXpScsCifjj7wnID0+ICcyOeaXpScsCifjj70nID0+ICczMOaXpScsCifjj74nID0+ICczMeaXpScsCifjj78nID0+ICdnYWwnLAon6pqcJyA9PiAn0YonLAon6pqdJyA9PiAn0YwnLAon6p2wJyA9PiAn6p2vJywKJ+qfuCcgPT4gJ8SmJywKJ+qfuScgPT4gJ8WTJywKJ+qtnCcgPT4gJ+qcpycsCifqrZ0nID0+ICfqrLcnLAon6q2eJyA9PiAnyasnLAon6q2fJyA9PiAn6q2SJywKJ+qtqScgPT4gJ8qNJywKJ++sgCcgPT4gJ2ZmJywKJ++sgScgPT4gJ2ZpJywKJ++sgicgPT4gJ2ZsJywKJ++sgycgPT4gJ2ZmaScsCifvrIQnID0+ICdmZmwnLAon76yFJyA9PiAnc3QnLAon76yGJyA9PiAnc3QnLAon76yTJyA9PiAn1bTVticsCifvrJQnID0+ICfVtNWlJywKJ++slScgPT4gJ9W01asnLAon76yWJyA9PiAn1b7VticsCifvrJcnID0+ICfVtNWtJywKJ++soCcgPT4gJ9eiJywKJ++soScgPT4gJ9eQJywKJ++soicgPT4gJ9eTJywKJ++soycgPT4gJ9eUJywKJ++spCcgPT4gJ9ebJywKJ++spScgPT4gJ9ecJywKJ++spicgPT4gJ9edJywKJ++spycgPT4gJ9eoJywKJ++sqCcgPT4gJ9eqJywKJ++sqScgPT4gJysnLAon762PJyA9PiAn15DXnCcsCifvrZAnID0+ICfZsScsCifvrZEnID0+ICfZsScsCifvrZInID0+ICfZuycsCifvrZMnID0+ICfZuycsCifvrZQnID0+ICfZuycsCifvrZUnID0+ICfZuycsCifvrZYnID0+ICfZvicsCifvrZcnID0+ICfZvicsCifvrZgnID0+ICfZvicsCifvrZknID0+ICfZvicsCifvrZonID0+ICfagCcsCifvrZsnID0+ICfagCcsCifvrZwnID0+ICfagCcsCifvrZ0nID0+ICfagCcsCifvrZ4nID0+ICfZuicsCifvrZ8nID0+ICfZuicsCifvraAnID0+ICfZuicsCifvraEnID0+ICfZuicsCifvraInID0+ICfZvycsCifvraMnID0+ICfZvycsCifvraQnID0+ICfZvycsCifvraUnID0+ICfZvycsCifvraYnID0+ICfZuScsCifvracnID0+ICfZuScsCifvragnID0+ICfZuScsCifvraknID0+ICfZuScsCifvraonID0+ICfapCcsCifvrasnID0+ICfapCcsCifvrawnID0+ICfapCcsCifvra0nID0+ICfapCcsCifvra4nID0+ICfapicsCifvra8nID0+ICfapicsCifvrbAnID0+ICfapicsCifvrbEnID0+ICfapicsCifvrbInID0+ICfahCcsCifvrbMnID0+ICfahCcsCifvrbQnID0+ICfahCcsCifvrbUnID0+ICfahCcsCifvrbYnID0+ICfagycsCifvrbcnID0+ICfagycsCifvrbgnID0+ICfagycsCifvrbknID0+ICfagycsCifvrbonID0+ICfahicsCifvrbsnID0+ICfahicsCifvrbwnID0+ICfahicsCifvrb0nID0+ICfahicsCifvrb4nID0+ICfahycsCifvrb8nID0+ICfahycsCifvroAnID0+ICfahycsCifvroEnID0+ICfahycsCifvroInID0+ICfajScsCifvroMnID0+ICfajScsCifvroQnID0+ICfajCcsCifvroUnID0+ICfajCcsCifvroYnID0+ICfajicsCifvrocnID0+ICfajicsCifvrognID0+ICfaiCcsCifvroknID0+ICfaiCcsCifvroonID0+ICfamCcsCifvrosnID0+ICfamCcsCifvrownID0+ICfakScsCifvro0nID0+ICfakScsCifvro4nID0+ICfaqScsCifvro8nID0+ICfaqScsCifvrpAnID0+ICfaqScsCifvrpEnID0+ICfaqScsCifvrpInID0+ICfarycsCifvrpMnID0+ICfarycsCifvrpQnID0+ICfarycsCifvrpUnID0+ICfarycsCifvrpYnID0+ICfasycsCifvrpcnID0+ICfasycsCifvrpgnID0+ICfasycsCifvrpknID0+ICfasycsCifvrponID0+ICfasScsCifvrpsnID0+ICfasScsCifvrpwnID0+ICfasScsCifvrp0nID0+ICfasScsCifvrp4nID0+ICfauicsCifvrp8nID0+ICfauicsCifvrqAnID0+ICfauycsCifvrqEnID0+ICfauycsCifvrqInID0+ICfauycsCifvrqMnID0+ICfauycsCifvrqQnID0+ICfbldmUJywKJ++upScgPT4gJ9uV2ZQnLAon766mJyA9PiAn24EnLAon766nJyA9PiAn24EnLAon766oJyA9PiAn24EnLAon766pJyA9PiAn24EnLAon766qJyA9PiAn2r4nLAon766rJyA9PiAn2r4nLAon766sJyA9PiAn2r4nLAon766tJyA9PiAn2r4nLAon766uJyA9PiAn25InLAon766vJyA9PiAn25InLAon766wJyA9PiAn25LZlCcsCifvrrEnID0+ICfbktmUJywKJ++vkycgPT4gJ9qtJywKJ++vlCcgPT4gJ9qtJywKJ++vlScgPT4gJ9qtJywKJ++vlicgPT4gJ9qtJywKJ++vlycgPT4gJ9uHJywKJ++vmCcgPT4gJ9uHJywKJ++vmScgPT4gJ9uGJywKJ++vmicgPT4gJ9uGJywKJ++vmycgPT4gJ9uIJywKJ++vnCcgPT4gJ9uIJywKJ++vnScgPT4gJ9uH2bQnLAon76+eJyA9PiAn24snLAon76+fJyA9PiAn24snLAon76+gJyA9PiAn24UnLAon76+hJyA9PiAn24UnLAon76+iJyA9PiAn24knLAon76+jJyA9PiAn24knLAon76+kJyA9PiAn25AnLAon76+lJyA9PiAn25AnLAon76+mJyA9PiAn25AnLAon76+nJyA9PiAn25AnLAon76+oJyA9PiAn2YknLAon76+pJyA9PiAn2YknLAon76+qJyA9PiAn2YrZlNinJywKJ++vqycgPT4gJ9mK2ZTYpycsCifvr6wnID0+ICfZitmU25UnLAon76+tJyA9PiAn2YrZlNuVJywKJ++vricgPT4gJ9mK2ZTZiCcsCifvr68nID0+ICfZitmU2YgnLAon76+wJyA9PiAn2YrZlNuHJywKJ++vsScgPT4gJ9mK2ZTbhycsCifvr7InID0+ICfZitmU24YnLAon76+zJyA9PiAn2YrZlNuGJywKJ++vtCcgPT4gJ9mK2ZTbiCcsCifvr7UnID0+ICfZitmU24gnLAon76+2JyA9PiAn2YrZlNuQJywKJ++vtycgPT4gJ9mK2ZTbkCcsCifvr7gnID0+ICfZitmU25AnLAon76+5JyA9PiAn2YrZlNmJJywKJ++vuicgPT4gJ9mK2ZTZiScsCifvr7snID0+ICfZitmU2YknLAon76+8JyA9PiAn24wnLAon76+9JyA9PiAn24wnLAon76++JyA9PiAn24wnLAon76+/JyA9PiAn24wnLAon77CAJyA9PiAn2YrZlNisJywKJ++wgScgPT4gJ9mK2ZTYrScsCifvsIInID0+ICfZitmU2YUnLAon77CDJyA9PiAn2YrZlNmJJywKJ++whCcgPT4gJ9mK2ZTZiicsCifvsIUnID0+ICfYqNisJywKJ++whicgPT4gJ9io2K0nLAon77CHJyA9PiAn2KjYricsCifvsIgnID0+ICfYqNmFJywKJ++wiScgPT4gJ9io2YknLAon77CKJyA9PiAn2KjZiicsCifvsIsnID0+ICfYqtisJywKJ++wjCcgPT4gJ9iq2K0nLAon77CNJyA9PiAn2KrYricsCifvsI4nID0+ICfYqtmFJywKJ++wjycgPT4gJ9iq2YknLAon77CQJyA9PiAn2KrZiicsCifvsJEnID0+ICfYq9isJywKJ++wkicgPT4gJ9ir2YUnLAon77CTJyA9PiAn2KvZiScsCifvsJQnID0+ICfYq9mKJywKJ++wlScgPT4gJ9is2K0nLAon77CWJyA9PiAn2KzZhScsCifvsJcnID0+ICfYrdisJywKJ++wmCcgPT4gJ9it2YUnLAon77CZJyA9PiAn2K7YrCcsCifvsJonID0+ICfYrtitJywKJ++wmycgPT4gJ9iu2YUnLAon77CcJyA9PiAn2LPYrCcsCifvsJ0nID0+ICfYs9itJywKJ++wnicgPT4gJ9iz2K4nLAon77CfJyA9PiAn2LPZhScsCifvsKAnID0+ICfYtditJywKJ++woScgPT4gJ9i12YUnLAon77CiJyA9PiAn2LbYrCcsCifvsKMnID0+ICfYttitJywKJ++wpCcgPT4gJ9i22K4nLAon77ClJyA9PiAn2LbZhScsCifvsKYnID0+ICfYt9itJywKJ++wpycgPT4gJ9i32YUnLAon77CoJyA9PiAn2LjZhScsCifvsKknID0+ICfYudisJywKJ++wqicgPT4gJ9i52YUnLAon77CrJyA9PiAn2LrYrCcsCifvsKwnID0+ICfYutmFJywKJ++wrScgPT4gJ9mB2KwnLAon77CuJyA9PiAn2YHYrScsCifvsK8nID0+ICfZgdiuJywKJ++wsCcgPT4gJ9mB2YUnLAon77CxJyA9PiAn2YHZiScsCifvsLInID0+ICfZgdmKJywKJ++wsycgPT4gJ9mC2K0nLAon77C0JyA9PiAn2YLZhScsCifvsLUnID0+ICfZgtmJJywKJ++wticgPT4gJ9mC2YonLAon77C3JyA9PiAn2YPYpycsCifvsLgnID0+ICfZg9isJywKJ++wuScgPT4gJ9mD2K0nLAon77C6JyA9PiAn2YPYricsCifvsLsnID0+ICfZg9mEJywKJ++wvCcgPT4gJ9mD2YUnLAon77C9JyA9PiAn2YPZiScsCifvsL4nID0+ICfZg9mKJywKJ++wvycgPT4gJ9mE2KwnLAon77GAJyA9PiAn2YTYrScsCifvsYEnID0+ICfZhNiuJywKJ++xgicgPT4gJ9mE2YUnLAon77GDJyA9PiAn2YTZiScsCifvsYQnID0+ICfZhNmKJywKJ++xhScgPT4gJ9mF2KwnLAon77GGJyA9PiAn2YXYrScsCifvsYcnID0+ICfZhdiuJywKJ++xiCcgPT4gJ9mF2YUnLAon77GJJyA9PiAn2YXZiScsCifvsYonID0+ICfZhdmKJywKJ++xiycgPT4gJ9mG2KwnLAon77GMJyA9PiAn2YbYrScsCifvsY0nID0+ICfZhtiuJywKJ++xjicgPT4gJ9mG2YUnLAon77GPJyA9PiAn2YbZiScsCifvsZAnID0+ICfZhtmKJywKJ++xkScgPT4gJ9mH2KwnLAon77GSJyA9PiAn2YfZhScsCifvsZMnID0+ICfZh9mJJywKJ++xlCcgPT4gJ9mH2YonLAon77GVJyA9PiAn2YrYrCcsCifvsZYnID0+ICfZititJywKJ++xlycgPT4gJ9mK2K4nLAon77GYJyA9PiAn2YrZhScsCifvsZknID0+ICfZitmJJywKJ++xmicgPT4gJ9mK2YonLAon77GbJyA9PiAn2LDZsCcsCifvsZwnID0+ICfYsdmwJywKJ++xnScgPT4gJ9mJ2bAnLAon77GeJyA9PiAnINmM2ZEnLAon77GfJyA9PiAnINmN2ZEnLAon77GgJyA9PiAnINmO2ZEnLAon77GhJyA9PiAnINmP2ZEnLAon77GiJyA9PiAnINmQ2ZEnLAon77GjJyA9PiAnINmR2bAnLAon77GkJyA9PiAn2YrZlNixJywKJ++xpScgPT4gJ9mK2ZTYsicsCifvsaYnID0+ICfZitmU2YUnLAon77GnJyA9PiAn2YrZlNmGJywKJ++xqCcgPT4gJ9mK2ZTZiScsCifvsaknID0+ICfZitmU2YonLAon77GqJyA9PiAn2KjYsScsCifvsasnID0+ICfYqNiyJywKJ++xrCcgPT4gJ9io2YUnLAon77GtJyA9PiAn2KjZhicsCifvsa4nID0+ICfYqNmJJywKJ++xrycgPT4gJ9io2YonLAon77GwJyA9PiAn2KrYsScsCifvsbEnID0+ICfYqtiyJywKJ++xsicgPT4gJ9iq2YUnLAon77GzJyA9PiAn2KrZhicsCifvsbQnID0+ICfYqtmJJywKJ++xtScgPT4gJ9iq2YonLAon77G2JyA9PiAn2KvYsScsCifvsbcnID0+ICfYq9iyJywKJ++xuCcgPT4gJ9ir2YUnLAon77G5JyA9PiAn2KvZhicsCifvsbonID0+ICfYq9mJJywKJ++xuycgPT4gJ9ir2YonLAon77G8JyA9PiAn2YHZiScsCifvsb0nID0+ICfZgdmKJywKJ++xvicgPT4gJ9mC2YknLAon77G/JyA9PiAn2YLZiicsCifvsoAnID0+ICfZg9inJywKJ++ygScgPT4gJ9mD2YQnLAon77KCJyA9PiAn2YPZhScsCifvsoMnID0+ICfZg9mJJywKJ++yhCcgPT4gJ9mD2YonLAon77KFJyA9PiAn2YTZhScsCifvsoYnID0+ICfZhNmJJywKJ++yhycgPT4gJ9mE2YonLAon77KIJyA9PiAn2YXYpycsCifvsoknID0+ICfZhdmFJywKJ++yiicgPT4gJ9mG2LEnLAon77KLJyA9PiAn2YbYsicsCifvsownID0+ICfZhtmFJywKJ++yjScgPT4gJ9mG2YYnLAon77KOJyA9PiAn2YbZiScsCifvso8nID0+ICfZhtmKJywKJ++ykCcgPT4gJ9mJ2bAnLAon77KRJyA9PiAn2YrYsScsCifvspInID0+ICfZitiyJywKJ++ykycgPT4gJ9mK2YUnLAon77KUJyA9PiAn2YrZhicsCifvspUnID0+ICfZitmJJywKJ++ylicgPT4gJ9mK2YonLAon77KXJyA9PiAn2YrZlNisJywKJ++ymCcgPT4gJ9mK2ZTYrScsCifvspknID0+ICfZitmU2K4nLAon77KaJyA9PiAn2YrZlNmFJywKJ++ymycgPT4gJ9mK2ZTZhycsCifvspwnID0+ICfYqNisJywKJ++ynScgPT4gJ9io2K0nLAon77KeJyA9PiAn2KjYricsCifvsp8nID0+ICfYqNmFJywKJ++yoCcgPT4gJ9io2YcnLAon77KhJyA9PiAn2KrYrCcsCifvsqInID0+ICfYqtitJywKJ++yoycgPT4gJ9iq2K4nLAon77KkJyA9PiAn2KrZhScsCifvsqUnID0+ICfYqtmHJywKJ++ypicgPT4gJ9ir2YUnLAon77KnJyA9PiAn2KzYrScsCifvsqgnID0+ICfYrNmFJywKJ++yqScgPT4gJ9it2KwnLAon77KqJyA9PiAn2K3ZhScsCifvsqsnID0+ICfYrtisJywKJ++yrCcgPT4gJ9iu2YUnLAon77KtJyA9PiAn2LPYrCcsCifvsq4nID0+ICfYs9itJywKJ++yrycgPT4gJ9iz2K4nLAon77KwJyA9PiAn2LPZhScsCifvsrEnID0+ICfYtditJywKJ++ysicgPT4gJ9i12K4nLAon77KzJyA9PiAn2LXZhScsCifvsrQnID0+ICfYttisJywKJ++ytScgPT4gJ9i22K0nLAon77K2JyA9PiAn2LbYricsCifvsrcnID0+ICfYttmFJywKJ++yuCcgPT4gJ9i32K0nLAon77K5JyA9PiAn2LjZhScsCifvsronID0+ICfYudisJywKJ++yuycgPT4gJ9i52YUnLAon77K8JyA9PiAn2LrYrCcsCifvsr0nID0+ICfYutmFJywKJ++yvicgPT4gJ9mB2KwnLAon77K/JyA9PiAn2YHYrScsCifvs4AnID0+ICfZgdiuJywKJ++zgScgPT4gJ9mB2YUnLAon77OCJyA9PiAn2YLYrScsCifvs4MnID0+ICfZgtmFJywKJ++zhCcgPT4gJ9mD2KwnLAon77OFJyA9PiAn2YPYrScsCifvs4YnID0+ICfZg9iuJywKJ++zhycgPT4gJ9mD2YQnLAon77OIJyA9PiAn2YPZhScsCifvs4knID0+ICfZhNisJywKJ++ziicgPT4gJ9mE2K0nLAon77OLJyA9PiAn2YTYricsCifvs4wnID0+ICfZhNmFJywKJ++zjScgPT4gJ9mE2YcnLAon77OOJyA9PiAn2YXYrCcsCifvs48nID0+ICfZhditJywKJ++zkCcgPT4gJ9mF2K4nLAon77ORJyA9PiAn2YXZhScsCifvs5InID0+ICfZhtisJywKJ++zkycgPT4gJ9mG2K0nLAon77OUJyA9PiAn2YbYricsCifvs5UnID0+ICfZhtmFJywKJ++zlicgPT4gJ9mG2YcnLAon77OXJyA9PiAn2YfYrCcsCifvs5gnID0+ICfZh9mFJywKJ++zmScgPT4gJ9mH2bAnLAon77OaJyA9PiAn2YrYrCcsCifvs5snID0+ICfZititJywKJ++znCcgPT4gJ9mK2K4nLAon77OdJyA9PiAn2YrZhScsCifvs54nID0+ICfZitmHJywKJ++znycgPT4gJ9mK2ZTZhScsCifvs6AnID0+ICfZitmU2YcnLAon77OhJyA9PiAn2KjZhScsCifvs6InID0+ICfYqNmHJywKJ++zoycgPT4gJ9iq2YUnLAon77OkJyA9PiAn2KrZhycsCifvs6UnID0+ICfYq9mFJywKJ++zpicgPT4gJ9ir2YcnLAon77OnJyA9PiAn2LPZhScsCifvs6gnID0+ICfYs9mHJywKJ++zqScgPT4gJ9i02YUnLAon77OqJyA9PiAn2LTZhycsCifvs6snID0+ICfZg9mEJywKJ++zrCcgPT4gJ9mD2YUnLAon77OtJyA9PiAn2YTZhScsCifvs64nID0+ICfZhtmFJywKJ++zrycgPT4gJ9mG2YcnLAon77OwJyA9PiAn2YrZhScsCifvs7EnID0+ICfZitmHJywKJ++zsicgPT4gJ9mA2Y7ZkScsCifvs7MnID0+ICfZgNmP2ZEnLAon77O0JyA9PiAn2YDZkNmRJywKJ++ztScgPT4gJ9i32YknLAon77O2JyA9PiAn2LfZiicsCifvs7cnID0+ICfYudmJJywKJ++zuCcgPT4gJ9i52YonLAon77O5JyA9PiAn2LrZiScsCifvs7onID0+ICfYutmKJywKJ++zuycgPT4gJ9iz2YknLAon77O8JyA9PiAn2LPZiicsCifvs70nID0+ICfYtNmJJywKJ++zvicgPT4gJ9i02YonLAon77O/JyA9PiAn2K3ZiScsCifvtIAnID0+ICfYrdmKJywKJ++0gScgPT4gJ9is2YknLAon77SCJyA9PiAn2KzZiicsCifvtIMnID0+ICfYrtmJJywKJ++0hCcgPT4gJ9iu2YonLAon77SFJyA9PiAn2LXZiScsCifvtIYnID0+ICfYtdmKJywKJ++0hycgPT4gJ9i22YknLAon77SIJyA9PiAn2LbZiicsCifvtIknID0+ICfYtNisJywKJ++0iicgPT4gJ9i02K0nLAon77SLJyA9PiAn2LTYricsCifvtIwnID0+ICfYtNmFJywKJ++0jScgPT4gJ9i02LEnLAon77SOJyA9PiAn2LPYsScsCifvtI8nID0+ICfYtdixJywKJ++0kCcgPT4gJ9i22LEnLAon77SRJyA9PiAn2LfZiScsCifvtJInID0+ICfYt9mKJywKJ++0kycgPT4gJ9i52YknLAon77SUJyA9PiAn2LnZiicsCifvtJUnID0+ICfYutmJJywKJ++0licgPT4gJ9i62YonLAon77SXJyA9PiAn2LPZiScsCifvtJgnID0+ICfYs9mKJywKJ++0mScgPT4gJ9i02YknLAon77SaJyA9PiAn2LTZiicsCifvtJsnID0+ICfYrdmJJywKJ++0nCcgPT4gJ9it2YonLAon77SdJyA9PiAn2KzZiScsCifvtJ4nID0+ICfYrNmKJywKJ++0nycgPT4gJ9iu2YknLAon77SgJyA9PiAn2K7ZiicsCifvtKEnID0+ICfYtdmJJywKJ++0oicgPT4gJ9i12YonLAon77SjJyA9PiAn2LbZiScsCifvtKQnID0+ICfYttmKJywKJ++0pScgPT4gJ9i02KwnLAon77SmJyA9PiAn2LTYrScsCifvtKcnID0+ICfYtNiuJywKJ++0qCcgPT4gJ9i02YUnLAon77SpJyA9PiAn2LTYsScsCifvtKonID0+ICfYs9ixJywKJ++0qycgPT4gJ9i12LEnLAon77SsJyA9PiAn2LbYsScsCifvtK0nID0+ICfYtNisJywKJ++0ricgPT4gJ9i02K0nLAon77SvJyA9PiAn2LTYricsCifvtLAnID0+ICfYtNmFJywKJ++0sScgPT4gJ9iz2YcnLAon77SyJyA9PiAn2LTZhycsCifvtLMnID0+ICfYt9mFJywKJ++0tCcgPT4gJ9iz2KwnLAon77S1JyA9PiAn2LPYrScsCifvtLYnID0+ICfYs9iuJywKJ++0tycgPT4gJ9i02KwnLAon77S4JyA9PiAn2LTYrScsCifvtLknID0+ICfYtNiuJywKJ++0uicgPT4gJ9i32YUnLAon77S7JyA9PiAn2LjZhScsCifvtLwnID0+ICfYp9mLJywKJ++0vScgPT4gJ9in2YsnLAon77WQJyA9PiAn2KrYrNmFJywKJ++1kScgPT4gJ9iq2K3YrCcsCifvtZInID0+ICfYqtit2KwnLAon77WTJyA9PiAn2KrYrdmFJywKJ++1lCcgPT4gJ9iq2K7ZhScsCifvtZUnID0+ICfYqtmF2KwnLAon77WWJyA9PiAn2KrZhditJywKJ++1lycgPT4gJ9iq2YXYricsCifvtZgnID0+ICfYrNmF2K0nLAon77WZJyA9PiAn2KzZhditJywKJ++1micgPT4gJ9it2YXZiicsCifvtZsnID0+ICfYrdmF2YknLAon77WcJyA9PiAn2LPYrdisJywKJ++1nScgPT4gJ9iz2KzYrScsCifvtZ4nID0+ICfYs9is2YknLAon77WfJyA9PiAn2LPZhditJywKJ++1oCcgPT4gJ9iz2YXYrScsCifvtaEnID0+ICfYs9mF2KwnLAon77WiJyA9PiAn2LPZhdmFJywKJ++1oycgPT4gJ9iz2YXZhScsCifvtaQnID0+ICfYtdit2K0nLAon77WlJyA9PiAn2LXYrditJywKJ++1picgPT4gJ9i12YXZhScsCifvtacnID0+ICfYtNit2YUnLAon77WoJyA9PiAn2LTYrdmFJywKJ++1qScgPT4gJ9i02KzZiicsCifvtaonID0+ICfYtNmF2K4nLAon77WrJyA9PiAn2LTZhdiuJywKJ++1rCcgPT4gJ9i02YXZhScsCifvta0nID0+ICfYtNmF2YUnLAon77WuJyA9PiAn2LbYrdmJJywKJ++1rycgPT4gJ9i22K7ZhScsCifvtbAnID0+ICfYttiu2YUnLAon77WxJyA9PiAn2LfZhditJywKJ++1sicgPT4gJ9i32YXYrScsCifvtbMnID0+ICfYt9mF2YUnLAon77W0JyA9PiAn2LfZhdmKJywKJ++1tScgPT4gJ9i52KzZhScsCifvtbYnID0+ICfYudmF2YUnLAon77W3JyA9PiAn2LnZhdmFJywKJ++1uCcgPT4gJ9i52YXZiScsCifvtbknID0+ICfYutmF2YUnLAon77W6JyA9PiAn2LrZhdmKJywKJ++1uycgPT4gJ9i62YXZiScsCifvtbwnID0+ICfZgdiu2YUnLAon77W9JyA9PiAn2YHYrtmFJywKJ++1vicgPT4gJ9mC2YXYrScsCifvtb8nID0+ICfZgtmF2YUnLAon77aAJyA9PiAn2YTYrdmFJywKJ++2gScgPT4gJ9mE2K3ZiicsCifvtoInID0+ICfZhNit2YknLAon77aDJyA9PiAn2YTYrNisJywKJ++2hCcgPT4gJ9mE2KzYrCcsCifvtoUnID0+ICfZhNiu2YUnLAon77aGJyA9PiAn2YTYrtmFJywKJ++2hycgPT4gJ9mE2YXYrScsCifvtognID0+ICfZhNmF2K0nLAon77aJJyA9PiAn2YXYrdisJywKJ++2iicgPT4gJ9mF2K3ZhScsCifvtosnID0+ICfZhdit2YonLAon77aMJyA9PiAn2YXYrNitJywKJ++2jScgPT4gJ9mF2KzZhScsCifvto4nID0+ICfZhdiu2KwnLAon77aPJyA9PiAn2YXYrtmFJywKJ++2kicgPT4gJ9mF2KzYricsCifvtpMnID0+ICfZh9mF2KwnLAon77aUJyA9PiAn2YfZhdmFJywKJ++2lScgPT4gJ9mG2K3ZhScsCifvtpYnID0+ICfZhtit2YknLAon77aXJyA9PiAn2YbYrNmFJywKJ++2mCcgPT4gJ9mG2KzZhScsCifvtpknID0+ICfZhtis2YknLAon77aaJyA9PiAn2YbZhdmKJywKJ++2mycgPT4gJ9mG2YXZiScsCifvtpwnID0+ICfZitmF2YUnLAon77adJyA9PiAn2YrZhdmFJywKJ++2nicgPT4gJ9io2K7ZiicsCifvtp8nID0+ICfYqtis2YonLAon77agJyA9PiAn2KrYrNmJJywKJ++2oScgPT4gJ9iq2K7ZiicsCifvtqInID0+ICfYqtiu2YknLAon77ajJyA9PiAn2KrZhdmKJywKJ++2pCcgPT4gJ9iq2YXZiScsCifvtqUnID0+ICfYrNmF2YonLAon77amJyA9PiAn2KzYrdmJJywKJ++2pycgPT4gJ9is2YXZiScsCifvtqgnID0+ICfYs9iu2YknLAon77apJyA9PiAn2LXYrdmKJywKJ++2qicgPT4gJ9i02K3ZiicsCifvtqsnID0+ICfYttit2YonLAon77asJyA9PiAn2YTYrNmKJywKJ++2rScgPT4gJ9mE2YXZiicsCifvtq4nID0+ICfZitit2YonLAon77avJyA9PiAn2YrYrNmKJywKJ++2sCcgPT4gJ9mK2YXZiicsCifvtrEnID0+ICfZhdmF2YonLAon77ayJyA9PiAn2YLZhdmKJywKJ++2sycgPT4gJ9mG2K3ZiicsCifvtrQnID0+ICfZgtmF2K0nLAon77a1JyA9PiAn2YTYrdmFJywKJ++2ticgPT4gJ9i52YXZiicsCifvtrcnID0+ICfZg9mF2YonLAon77a4JyA9PiAn2YbYrNitJywKJ++2uScgPT4gJ9mF2K7ZiicsCifvtronID0+ICfZhNis2YUnLAon77a7JyA9PiAn2YPZhdmFJywKJ++2vCcgPT4gJ9mE2KzZhScsCifvtr0nID0+ICfZhtis2K0nLAon77a+JyA9PiAn2KzYrdmKJywKJ++2vycgPT4gJ9it2KzZiicsCifvt4AnID0+ICfZhdis2YonLAon77eBJyA9PiAn2YHZhdmKJywKJ++3gicgPT4gJ9io2K3ZiicsCifvt4MnID0+ICfZg9mF2YUnLAon77eEJyA9PiAn2LnYrNmFJywKJ++3hScgPT4gJ9i12YXZhScsCifvt4YnID0+ICfYs9iu2YonLAon77eHJyA9PiAn2YbYrNmKJywKJ++3sCcgPT4gJ9i12YTbkicsCifvt7EnID0+ICfZgtmE25InLAon77eyJyA9PiAn2KfZhNmE2YcnLAon77ezJyA9PiAn2KfZg9io2LEnLAon77e0JyA9PiAn2YXYrdmF2K8nLAon77e1JyA9PiAn2LXZhNi52YUnLAon77e2JyA9PiAn2LHYs9mI2YQnLAon77e3JyA9PiAn2LnZhNmK2YcnLAon77e4JyA9PiAn2YjYs9mE2YUnLAon77e5JyA9PiAn2LXZhNmJJywKJ++3uicgPT4gJ9i12YTZiSDYp9mE2YTZhyDYudmE2YrZhyDZiNiz2YTZhScsCifvt7snID0+ICfYrNmEINis2YTYp9mE2YcnLAon77e8JyA9PiAn2LHbjNin2YQnLAon77iQJyA9PiAnLCcsCifvuJEnID0+ICfjgIEnLAon77iSJyA9PiAn44CCJywKJ++4kycgPT4gJzonLAon77iUJyA9PiAnOycsCifvuJUnID0+ICchJywKJ++4licgPT4gJz8nLAon77iXJyA9PiAn44CWJywKJ++4mCcgPT4gJ+OAlycsCifvuJknID0+ICcuLi4nLAon77iwJyA9PiAnLi4nLAon77ixJyA9PiAn4oCUJywKJ++4sicgPT4gJ+KAkycsCifvuLMnID0+ICdfJywKJ++4tCcgPT4gJ18nLAon77i1JyA9PiAnKCcsCifvuLYnID0+ICcpJywKJ++4tycgPT4gJ3snLAon77i4JyA9PiAnfScsCifvuLknID0+ICfjgJQnLAon77i6JyA9PiAn44CVJywKJ++4uycgPT4gJ+OAkCcsCifvuLwnID0+ICfjgJEnLAon77i9JyA9PiAn44CKJywKJ++4vicgPT4gJ+OAiycsCifvuL8nID0+ICfjgIgnLAon77mAJyA9PiAn44CJJywKJ++5gScgPT4gJ+OAjCcsCifvuYInID0+ICfjgI0nLAon77mDJyA9PiAn44COJywKJ++5hCcgPT4gJ+OAjycsCifvuYcnID0+ICdbJywKJ++5iCcgPT4gJ10nLAon77mJJyA9PiAnIMyFJywKJ++5iicgPT4gJyDMhScsCifvuYsnID0+ICcgzIUnLAon77mMJyA9PiAnIMyFJywKJ++5jScgPT4gJ18nLAon77mOJyA9PiAnXycsCifvuY8nID0+ICdfJywKJ++5kCcgPT4gJywnLAon77mRJyA9PiAn44CBJywKJ++5kicgPT4gJy4nLAon77mUJyA9PiAnOycsCifvuZUnID0+ICc6JywKJ++5licgPT4gJz8nLAon77mXJyA9PiAnIScsCifvuZgnID0+ICfigJQnLAon77mZJyA9PiAnKCcsCifvuZonID0+ICcpJywKJ++5mycgPT4gJ3snLAon77mcJyA9PiAnfScsCifvuZ0nID0+ICfjgJQnLAon77meJyA9PiAn44CVJywKJ++5nycgPT4gJyMnLAon77mgJyA9PiAnJicsCifvuaEnID0+ICcqJywKJ++5oicgPT4gJysnLAon77mjJyA9PiAnLScsCifvuaQnID0+ICc8JywKJ++5pScgPT4gJz4nLAon77mmJyA9PiAnPScsCifvuagnID0+ICdcXCcsCifvuaknID0+ICckJywKJ++5qicgPT4gJyUnLAon77mrJyA9PiAnQCcsCifvubAnID0+ICcg2YsnLAon77mxJyA9PiAn2YDZiycsCifvubInID0+ICcg2YwnLAon77m0JyA9PiAnINmNJywKJ++5ticgPT4gJyDZjicsCifvubcnID0+ICfZgNmOJywKJ++5uCcgPT4gJyDZjycsCifvubknID0+ICfZgNmPJywKJ++5uicgPT4gJyDZkCcsCifvubsnID0+ICfZgNmQJywKJ++5vCcgPT4gJyDZkScsCifvub0nID0+ICfZgNmRJywKJ++5vicgPT4gJyDZkicsCifvub8nID0+ICfZgNmSJywKJ++6gCcgPT4gJ9ihJywKJ++6gScgPT4gJ9in2ZMnLAon77qCJyA9PiAn2KfZkycsCifvuoMnID0+ICfYp9mUJywKJ++6hCcgPT4gJ9in2ZQnLAon77qFJyA9PiAn2YjZlCcsCifvuoYnID0+ICfZiNmUJywKJ++6hycgPT4gJ9in2ZUnLAon77qIJyA9PiAn2KfZlScsCifvuoknID0+ICfZitmUJywKJ++6iicgPT4gJ9mK2ZQnLAon77qLJyA9PiAn2YrZlCcsCifvuownID0+ICfZitmUJywKJ++6jScgPT4gJ9inJywKJ++6jicgPT4gJ9inJywKJ++6jycgPT4gJ9ioJywKJ++6kCcgPT4gJ9ioJywKJ++6kScgPT4gJ9ioJywKJ++6kicgPT4gJ9ioJywKJ++6kycgPT4gJ9ipJywKJ++6lCcgPT4gJ9ipJywKJ++6lScgPT4gJ9iqJywKJ++6licgPT4gJ9iqJywKJ++6lycgPT4gJ9iqJywKJ++6mCcgPT4gJ9iqJywKJ++6mScgPT4gJ9irJywKJ++6micgPT4gJ9irJywKJ++6mycgPT4gJ9irJywKJ++6nCcgPT4gJ9irJywKJ++6nScgPT4gJ9isJywKJ++6nicgPT4gJ9isJywKJ++6nycgPT4gJ9isJywKJ++6oCcgPT4gJ9isJywKJ++6oScgPT4gJ9itJywKJ++6oicgPT4gJ9itJywKJ++6oycgPT4gJ9itJywKJ++6pCcgPT4gJ9itJywKJ++6pScgPT4gJ9iuJywKJ++6picgPT4gJ9iuJywKJ++6pycgPT4gJ9iuJywKJ++6qCcgPT4gJ9iuJywKJ++6qScgPT4gJ9ivJywKJ++6qicgPT4gJ9ivJywKJ++6qycgPT4gJ9iwJywKJ++6rCcgPT4gJ9iwJywKJ++6rScgPT4gJ9ixJywKJ++6ricgPT4gJ9ixJywKJ++6rycgPT4gJ9iyJywKJ++6sCcgPT4gJ9iyJywKJ++6sScgPT4gJ9izJywKJ++6sicgPT4gJ9izJywKJ++6sycgPT4gJ9izJywKJ++6tCcgPT4gJ9izJywKJ++6tScgPT4gJ9i0JywKJ++6ticgPT4gJ9i0JywKJ++6tycgPT4gJ9i0JywKJ++6uCcgPT4gJ9i0JywKJ++6uScgPT4gJ9i1JywKJ++6uicgPT4gJ9i1JywKJ++6uycgPT4gJ9i1JywKJ++6vCcgPT4gJ9i1JywKJ++6vScgPT4gJ9i2JywKJ++6vicgPT4gJ9i2JywKJ++6vycgPT4gJ9i2JywKJ++7gCcgPT4gJ9i2JywKJ++7gScgPT4gJ9i3JywKJ++7gicgPT4gJ9i3JywKJ++7gycgPT4gJ9i3JywKJ++7hCcgPT4gJ9i3JywKJ++7hScgPT4gJ9i4JywKJ++7hicgPT4gJ9i4JywKJ++7hycgPT4gJ9i4JywKJ++7iCcgPT4gJ9i4JywKJ++7iScgPT4gJ9i5JywKJ++7iicgPT4gJ9i5JywKJ++7iycgPT4gJ9i5JywKJ++7jCcgPT4gJ9i5JywKJ++7jScgPT4gJ9i6JywKJ++7jicgPT4gJ9i6JywKJ++7jycgPT4gJ9i6JywKJ++7kCcgPT4gJ9i6JywKJ++7kScgPT4gJ9mBJywKJ++7kicgPT4gJ9mBJywKJ++7kycgPT4gJ9mBJywKJ++7lCcgPT4gJ9mBJywKJ++7lScgPT4gJ9mCJywKJ++7licgPT4gJ9mCJywKJ++7lycgPT4gJ9mCJywKJ++7mCcgPT4gJ9mCJywKJ++7mScgPT4gJ9mDJywKJ++7micgPT4gJ9mDJywKJ++7mycgPT4gJ9mDJywKJ++7nCcgPT4gJ9mDJywKJ++7nScgPT4gJ9mEJywKJ++7nicgPT4gJ9mEJywKJ++7nycgPT4gJ9mEJywKJ++7oCcgPT4gJ9mEJywKJ++7oScgPT4gJ9mFJywKJ++7oicgPT4gJ9mFJywKJ++7oycgPT4gJ9mFJywKJ++7pCcgPT4gJ9mFJywKJ++7pScgPT4gJ9mGJywKJ++7picgPT4gJ9mGJywKJ++7pycgPT4gJ9mGJywKJ++7qCcgPT4gJ9mGJywKJ++7qScgPT4gJ9mHJywKJ++7qicgPT4gJ9mHJywKJ++7qycgPT4gJ9mHJywKJ++7rCcgPT4gJ9mHJywKJ++7rScgPT4gJ9mIJywKJ++7ricgPT4gJ9mIJywKJ++7rycgPT4gJ9mJJywKJ++7sCcgPT4gJ9mJJywKJ++7sScgPT4gJ9mKJywKJ++7sicgPT4gJ9mKJywKJ++7sycgPT4gJ9mKJywKJ++7tCcgPT4gJ9mKJywKJ++7tScgPT4gJ9mE2KfZkycsCifvu7YnID0+ICfZhNin2ZMnLAon77u3JyA9PiAn2YTYp9mUJywKJ++7uCcgPT4gJ9mE2KfZlCcsCifvu7knID0+ICfZhNin2ZUnLAon77u6JyA9PiAn2YTYp9mVJywKJ++7uycgPT4gJ9mE2KcnLAon77u8JyA9PiAn2YTYpycsCifvvIEnID0+ICchJywKJ++8gicgPT4gJyInLAon77yDJyA9PiAnIycsCifvvIQnID0+ICckJywKJ++8hScgPT4gJyUnLAon77yGJyA9PiAnJicsCifvvIcnID0+ICdcJycsCifvvIgnID0+ICcoJywKJ++8iScgPT4gJyknLAon77yKJyA9PiAnKicsCifvvIsnID0+ICcrJywKJ++8jCcgPT4gJywnLAon77yNJyA9PiAnLScsCifvvI4nID0+ICcuJywKJ++8jycgPT4gJy8nLAon77yQJyA9PiAnMCcsCifvvJEnID0+ICcxJywKJ++8kicgPT4gJzInLAon77yTJyA9PiAnMycsCifvvJQnID0+ICc0JywKJ++8lScgPT4gJzUnLAon77yWJyA9PiAnNicsCifvvJcnID0+ICc3JywKJ++8mCcgPT4gJzgnLAon77yZJyA9PiAnOScsCifvvJonID0+ICc6JywKJ++8mycgPT4gJzsnLAon77ycJyA9PiAnPCcsCifvvJ0nID0+ICc9JywKJ++8nicgPT4gJz4nLAon77yfJyA9PiAnPycsCifvvKAnID0+ICdAJywKJ++8oScgPT4gJ0EnLAon77yiJyA9PiAnQicsCifvvKMnID0+ICdDJywKJ++8pCcgPT4gJ0QnLAon77ylJyA9PiAnRScsCifvvKYnID0+ICdGJywKJ++8pycgPT4gJ0cnLAon77yoJyA9PiAnSCcsCifvvKknID0+ICdJJywKJ++8qicgPT4gJ0onLAon77yrJyA9PiAnSycsCifvvKwnID0+ICdMJywKJ++8rScgPT4gJ00nLAon77yuJyA9PiAnTicsCifvvK8nID0+ICdPJywKJ++8sCcgPT4gJ1AnLAon77yxJyA9PiAnUScsCifvvLInID0+ICdSJywKJ++8sycgPT4gJ1MnLAon77y0JyA9PiAnVCcsCifvvLUnID0+ICdVJywKJ++8ticgPT4gJ1YnLAon77y3JyA9PiAnVycsCifvvLgnID0+ICdYJywKJ++8uScgPT4gJ1knLAon77y6JyA9PiAnWicsCifvvLsnID0+ICdbJywKJ++8vCcgPT4gJ1xcJywKJ++8vScgPT4gJ10nLAon77y+JyA9PiAnXicsCifvvL8nID0+ICdfJywKJ++9gCcgPT4gJ2AnLAon772BJyA9PiAnYScsCifvvYInID0+ICdiJywKJ++9gycgPT4gJ2MnLAon772EJyA9PiAnZCcsCifvvYUnID0+ICdlJywKJ++9hicgPT4gJ2YnLAon772HJyA9PiAnZycsCifvvYgnID0+ICdoJywKJ++9iScgPT4gJ2knLAon772KJyA9PiAnaicsCifvvYsnID0+ICdrJywKJ++9jCcgPT4gJ2wnLAon772NJyA9PiAnbScsCifvvY4nID0+ICduJywKJ++9jycgPT4gJ28nLAon772QJyA9PiAncCcsCifvvZEnID0+ICdxJywKJ++9kicgPT4gJ3InLAon772TJyA9PiAncycsCifvvZQnID0+ICd0JywKJ++9lScgPT4gJ3UnLAon772WJyA9PiAndicsCifvvZcnID0+ICd3JywKJ++9mCcgPT4gJ3gnLAon772ZJyA9PiAneScsCifvvZonID0+ICd6JywKJ++9mycgPT4gJ3snLAon772cJyA9PiAnfCcsCifvvZ0nID0+ICd9JywKJ++9nicgPT4gJ34nLAon772fJyA9PiAn4qaFJywKJ++9oCcgPT4gJ+KmhicsCifvvaEnID0+ICfjgIInLAon772iJyA9PiAn44CMJywKJ++9oycgPT4gJ+OAjScsCifvvaQnID0+ICfjgIEnLAon772lJyA9PiAn44O7JywKJ++9picgPT4gJ+ODsicsCifvvacnID0+ICfjgqEnLAon772oJyA9PiAn44KjJywKJ++9qScgPT4gJ+OCpScsCifvvaonID0+ICfjgqcnLAon772rJyA9PiAn44KpJywKJ++9rCcgPT4gJ+ODoycsCifvva0nID0+ICfjg6UnLAon772uJyA9PiAn44OnJywKJ++9rycgPT4gJ+ODgycsCifvvbAnID0+ICfjg7wnLAon772xJyA9PiAn44KiJywKJ++9sicgPT4gJ+OCpCcsCifvvbMnID0+ICfjgqYnLAon7720JyA9PiAn44KoJywKJ++9tScgPT4gJ+OCqicsCifvvbYnID0+ICfjgqsnLAon7723JyA9PiAn44KtJywKJ++9uCcgPT4gJ+OCrycsCifvvbknID0+ICfjgrEnLAon7726JyA9PiAn44KzJywKJ++9uycgPT4gJ+OCtScsCifvvbwnID0+ICfjgrcnLAon7729JyA9PiAn44K5JywKJ++9vicgPT4gJ+OCuycsCifvvb8nID0+ICfjgr0nLAon776AJyA9PiAn44K/JywKJ+++gScgPT4gJ+ODgScsCifvvoInID0+ICfjg4QnLAon776DJyA9PiAn44OGJywKJ+++hCcgPT4gJ+ODiCcsCifvvoUnID0+ICfjg4onLAon776GJyA9PiAn44OLJywKJ+++hycgPT4gJ+ODjCcsCifvvognID0+ICfjg40nLAon776JJyA9PiAn44OOJywKJ+++iicgPT4gJ+ODjycsCifvvosnID0+ICfjg5InLAon776MJyA9PiAn44OVJywKJ+++jScgPT4gJ+ODmCcsCifvvo4nID0+ICfjg5snLAon776PJyA9PiAn44OeJywKJ+++kCcgPT4gJ+ODnycsCifvvpEnID0+ICfjg6AnLAon776SJyA9PiAn44OhJywKJ+++kycgPT4gJ+ODoicsCifvvpQnID0+ICfjg6QnLAon776VJyA9PiAn44OmJywKJ+++licgPT4gJ+ODqCcsCifvvpcnID0+ICfjg6knLAon776YJyA9PiAn44OqJywKJ+++mScgPT4gJ+ODqycsCifvvponID0+ICfjg6wnLAon776bJyA9PiAn44OtJywKJ+++nCcgPT4gJ+ODrycsCifvvp0nID0+ICfjg7MnLAon776eJyA9PiAn44KZJywKJ+++nycgPT4gJ+OCmicsCifvvqAnID0+ICfhhaAnLAon776hJyA9PiAn4YSAJywKJ+++oicgPT4gJ+GEgScsCifvvqMnID0+ICfhhqonLAon776kJyA9PiAn4YSCJywKJ+++pScgPT4gJ+GGrCcsCifvvqYnID0+ICfhhq0nLAon776nJyA9PiAn4YSDJywKJ+++qCcgPT4gJ+GEhCcsCifvvqknID0+ICfhhIUnLAon776qJyA9PiAn4YawJywKJ+++qycgPT4gJ+GGsScsCifvvqwnID0+ICfhhrInLAon776tJyA9PiAn4YazJywKJ+++ricgPT4gJ+GGtCcsCifvvq8nID0+ICfhhrUnLAon776wJyA9PiAn4YSaJywKJ+++sScgPT4gJ+GEhicsCifvvrInID0+ICfhhIcnLAon776zJyA9PiAn4YSIJywKJ+++tCcgPT4gJ+GEoScsCifvvrUnID0+ICfhhIknLAon7762JyA9PiAn4YSKJywKJ+++tycgPT4gJ+GEiycsCifvvrgnID0+ICfhhIwnLAon7765JyA9PiAn4YSNJywKJ+++uicgPT4gJ+GEjicsCifvvrsnID0+ICfhhI8nLAon7768JyA9PiAn4YSQJywKJ+++vScgPT4gJ+GEkScsCifvvr4nID0+ICfhhJInLAon77+CJyA9PiAn4YWhJywKJ++/gycgPT4gJ+GFoicsCifvv4QnID0+ICfhhaMnLAon77+FJyA9PiAn4YWkJywKJ++/hicgPT4gJ+GFpScsCifvv4cnID0+ICfhhaYnLAon77+KJyA9PiAn4YWnJywKJ++/iycgPT4gJ+GFqCcsCifvv4wnID0+ICfhhaknLAon77+NJyA9PiAn4YWqJywKJ++/jicgPT4gJ+GFqycsCifvv48nID0+ICfhhawnLAon77+SJyA9PiAn4YWtJywKJ++/kycgPT4gJ+GFricsCifvv5QnID0+ICfhha8nLAon77+VJyA9PiAn4YWwJywKJ++/licgPT4gJ+GFsScsCifvv5cnID0+ICfhhbInLAon77+aJyA9PiAn4YWzJywKJ++/mycgPT4gJ+GFtCcsCifvv5wnID0+ICfhhbUnLAon77+gJyA9PiAnwqInLAon77+hJyA9PiAnwqMnLAon77+iJyA9PiAnwqwnLAon77+jJyA9PiAnIMyEJywKJ++/pCcgPT4gJ8KmJywKJ++/pScgPT4gJ8KlJywKJ++/picgPT4gJ+KCqScsCifvv6gnID0+ICfilIInLAon77+pJyA9PiAn4oaQJywKJ++/qicgPT4gJ+KGkScsCifvv6snID0+ICfihpInLAon77+sJyA9PiAn4oaTJywKJ++/rScgPT4gJ+KWoCcsCifvv64nID0+ICfil4snLAon8J2QgCcgPT4gJ0EnLAon8J2QgScgPT4gJ0InLAon8J2QgicgPT4gJ0MnLAon8J2QgycgPT4gJ0QnLAon8J2QhCcgPT4gJ0UnLAon8J2QhScgPT4gJ0YnLAon8J2QhicgPT4gJ0cnLAon8J2QhycgPT4gJ0gnLAon8J2QiCcgPT4gJ0knLAon8J2QiScgPT4gJ0onLAon8J2QiicgPT4gJ0snLAon8J2QiycgPT4gJ0wnLAon8J2QjCcgPT4gJ00nLAon8J2QjScgPT4gJ04nLAon8J2QjicgPT4gJ08nLAon8J2QjycgPT4gJ1AnLAon8J2QkCcgPT4gJ1EnLAon8J2QkScgPT4gJ1InLAon8J2QkicgPT4gJ1MnLAon8J2QkycgPT4gJ1QnLAon8J2QlCcgPT4gJ1UnLAon8J2QlScgPT4gJ1YnLAon8J2QlicgPT4gJ1cnLAon8J2QlycgPT4gJ1gnLAon8J2QmCcgPT4gJ1knLAon8J2QmScgPT4gJ1onLAon8J2QmicgPT4gJ2EnLAon8J2QmycgPT4gJ2InLAon8J2QnCcgPT4gJ2MnLAon8J2QnScgPT4gJ2QnLAon8J2QnicgPT4gJ2UnLAon8J2QnycgPT4gJ2YnLAon8J2QoCcgPT4gJ2cnLAon8J2QoScgPT4gJ2gnLAon8J2QoicgPT4gJ2knLAon8J2QoycgPT4gJ2onLAon8J2QpCcgPT4gJ2snLAon8J2QpScgPT4gJ2wnLAon8J2QpicgPT4gJ20nLAon8J2QpycgPT4gJ24nLAon8J2QqCcgPT4gJ28nLAon8J2QqScgPT4gJ3AnLAon8J2QqicgPT4gJ3EnLAon8J2QqycgPT4gJ3InLAon8J2QrCcgPT4gJ3MnLAon8J2QrScgPT4gJ3QnLAon8J2QricgPT4gJ3UnLAon8J2QrycgPT4gJ3YnLAon8J2QsCcgPT4gJ3cnLAon8J2QsScgPT4gJ3gnLAon8J2QsicgPT4gJ3knLAon8J2QsycgPT4gJ3onLAon8J2QtCcgPT4gJ0EnLAon8J2QtScgPT4gJ0InLAon8J2QticgPT4gJ0MnLAon8J2QtycgPT4gJ0QnLAon8J2QuCcgPT4gJ0UnLAon8J2QuScgPT4gJ0YnLAon8J2QuicgPT4gJ0cnLAon8J2QuycgPT4gJ0gnLAon8J2QvCcgPT4gJ0knLAon8J2QvScgPT4gJ0onLAon8J2QvicgPT4gJ0snLAon8J2QvycgPT4gJ0wnLAon8J2RgCcgPT4gJ00nLAon8J2RgScgPT4gJ04nLAon8J2RgicgPT4gJ08nLAon8J2RgycgPT4gJ1AnLAon8J2RhCcgPT4gJ1EnLAon8J2RhScgPT4gJ1InLAon8J2RhicgPT4gJ1MnLAon8J2RhycgPT4gJ1QnLAon8J2RiCcgPT4gJ1UnLAon8J2RiScgPT4gJ1YnLAon8J2RiicgPT4gJ1cnLAon8J2RiycgPT4gJ1gnLAon8J2RjCcgPT4gJ1knLAon8J2RjScgPT4gJ1onLAon8J2RjicgPT4gJ2EnLAon8J2RjycgPT4gJ2InLAon8J2RkCcgPT4gJ2MnLAon8J2RkScgPT4gJ2QnLAon8J2RkicgPT4gJ2UnLAon8J2RkycgPT4gJ2YnLAon8J2RlCcgPT4gJ2cnLAon8J2RlicgPT4gJ2knLAon8J2RlycgPT4gJ2onLAon8J2RmCcgPT4gJ2snLAon8J2RmScgPT4gJ2wnLAon8J2RmicgPT4gJ20nLAon8J2RmycgPT4gJ24nLAon8J2RnCcgPT4gJ28nLAon8J2RnScgPT4gJ3AnLAon8J2RnicgPT4gJ3EnLAon8J2RnycgPT4gJ3InLAon8J2RoCcgPT4gJ3MnLAon8J2RoScgPT4gJ3QnLAon8J2RoicgPT4gJ3UnLAon8J2RoycgPT4gJ3YnLAon8J2RpCcgPT4gJ3cnLAon8J2RpScgPT4gJ3gnLAon8J2RpicgPT4gJ3knLAon8J2RpycgPT4gJ3onLAon8J2RqCcgPT4gJ0EnLAon8J2RqScgPT4gJ0InLAon8J2RqicgPT4gJ0MnLAon8J2RqycgPT4gJ0QnLAon8J2RrCcgPT4gJ0UnLAon8J2RrScgPT4gJ0YnLAon8J2RricgPT4gJ0cnLAon8J2RrycgPT4gJ0gnLAon8J2RsCcgPT4gJ0knLAon8J2RsScgPT4gJ0onLAon8J2RsicgPT4gJ0snLAon8J2RsycgPT4gJ0wnLAon8J2RtCcgPT4gJ00nLAon8J2RtScgPT4gJ04nLAon8J2RticgPT4gJ08nLAon8J2RtycgPT4gJ1AnLAon8J2RuCcgPT4gJ1EnLAon8J2RuScgPT4gJ1InLAon8J2RuicgPT4gJ1MnLAon8J2RuycgPT4gJ1QnLAon8J2RvCcgPT4gJ1UnLAon8J2RvScgPT4gJ1YnLAon8J2RvicgPT4gJ1cnLAon8J2RvycgPT4gJ1gnLAon8J2SgCcgPT4gJ1knLAon8J2SgScgPT4gJ1onLAon8J2SgicgPT4gJ2EnLAon8J2SgycgPT4gJ2InLAon8J2ShCcgPT4gJ2MnLAon8J2ShScgPT4gJ2QnLAon8J2ShicgPT4gJ2UnLAon8J2ShycgPT4gJ2YnLAon8J2SiCcgPT4gJ2cnLAon8J2SiScgPT4gJ2gnLAon8J2SiicgPT4gJ2knLAon8J2SiycgPT4gJ2onLAon8J2SjCcgPT4gJ2snLAon8J2SjScgPT4gJ2wnLAon8J2SjicgPT4gJ20nLAon8J2SjycgPT4gJ24nLAon8J2SkCcgPT4gJ28nLAon8J2SkScgPT4gJ3AnLAon8J2SkicgPT4gJ3EnLAon8J2SkycgPT4gJ3InLAon8J2SlCcgPT4gJ3MnLAon8J2SlScgPT4gJ3QnLAon8J2SlicgPT4gJ3UnLAon8J2SlycgPT4gJ3YnLAon8J2SmCcgPT4gJ3cnLAon8J2SmScgPT4gJ3gnLAon8J2SmicgPT4gJ3knLAon8J2SmycgPT4gJ3onLAon8J2SnCcgPT4gJ0EnLAon8J2SnicgPT4gJ0MnLAon8J2SnycgPT4gJ0QnLAon8J2SoicgPT4gJ0cnLAon8J2SpScgPT4gJ0onLAon8J2SpicgPT4gJ0snLAon8J2SqScgPT4gJ04nLAon8J2SqicgPT4gJ08nLAon8J2SqycgPT4gJ1AnLAon8J2SrCcgPT4gJ1EnLAon8J2SricgPT4gJ1MnLAon8J2SrycgPT4gJ1QnLAon8J2SsCcgPT4gJ1UnLAon8J2SsScgPT4gJ1YnLAon8J2SsicgPT4gJ1cnLAon8J2SsycgPT4gJ1gnLAon8J2StCcgPT4gJ1knLAon8J2StScgPT4gJ1onLAon8J2SticgPT4gJ2EnLAon8J2StycgPT4gJ2InLAon8J2SuCcgPT4gJ2MnLAon8J2SuScgPT4gJ2QnLAon8J2SuycgPT4gJ2YnLAon8J2SvScgPT4gJ2gnLAon8J2SvicgPT4gJ2knLAon8J2SvycgPT4gJ2onLAon8J2TgCcgPT4gJ2snLAon8J2TgScgPT4gJ2wnLAon8J2TgicgPT4gJ20nLAon8J2TgycgPT4gJ24nLAon8J2ThScgPT4gJ3AnLAon8J2ThicgPT4gJ3EnLAon8J2ThycgPT4gJ3InLAon8J2TiCcgPT4gJ3MnLAon8J2TiScgPT4gJ3QnLAon8J2TiicgPT4gJ3UnLAon8J2TiycgPT4gJ3YnLAon8J2TjCcgPT4gJ3cnLAon8J2TjScgPT4gJ3gnLAon8J2TjicgPT4gJ3knLAon8J2TjycgPT4gJ3onLAon8J2TkCcgPT4gJ0EnLAon8J2TkScgPT4gJ0InLAon8J2TkicgPT4gJ0MnLAon8J2TkycgPT4gJ0QnLAon8J2TlCcgPT4gJ0UnLAon8J2TlScgPT4gJ0YnLAon8J2TlicgPT4gJ0cnLAon8J2TlycgPT4gJ0gnLAon8J2TmCcgPT4gJ0knLAon8J2TmScgPT4gJ0onLAon8J2TmicgPT4gJ0snLAon8J2TmycgPT4gJ0wnLAon8J2TnCcgPT4gJ00nLAon8J2TnScgPT4gJ04nLAon8J2TnicgPT4gJ08nLAon8J2TnycgPT4gJ1AnLAon8J2ToCcgPT4gJ1EnLAon8J2ToScgPT4gJ1InLAon8J2ToicgPT4gJ1MnLAon8J2ToycgPT4gJ1QnLAon8J2TpCcgPT4gJ1UnLAon8J2TpScgPT4gJ1YnLAon8J2TpicgPT4gJ1cnLAon8J2TpycgPT4gJ1gnLAon8J2TqCcgPT4gJ1knLAon8J2TqScgPT4gJ1onLAon8J2TqicgPT4gJ2EnLAon8J2TqycgPT4gJ2InLAon8J2TrCcgPT4gJ2MnLAon8J2TrScgPT4gJ2QnLAon8J2TricgPT4gJ2UnLAon8J2TrycgPT4gJ2YnLAon8J2TsCcgPT4gJ2cnLAon8J2TsScgPT4gJ2gnLAon8J2TsicgPT4gJ2knLAon8J2TsycgPT4gJ2onLAon8J2TtCcgPT4gJ2snLAon8J2TtScgPT4gJ2wnLAon8J2TticgPT4gJ20nLAon8J2TtycgPT4gJ24nLAon8J2TuCcgPT4gJ28nLAon8J2TuScgPT4gJ3AnLAon8J2TuicgPT4gJ3EnLAon8J2TuycgPT4gJ3InLAon8J2TvCcgPT4gJ3MnLAon8J2TvScgPT4gJ3QnLAon8J2TvicgPT4gJ3UnLAon8J2TvycgPT4gJ3YnLAon8J2UgCcgPT4gJ3cnLAon8J2UgScgPT4gJ3gnLAon8J2UgicgPT4gJ3knLAon8J2UgycgPT4gJ3onLAon8J2UhCcgPT4gJ0EnLAon8J2UhScgPT4gJ0InLAon8J2UhycgPT4gJ0QnLAon8J2UiCcgPT4gJ0UnLAon8J2UiScgPT4gJ0YnLAon8J2UiicgPT4gJ0cnLAon8J2UjScgPT4gJ0onLAon8J2UjicgPT4gJ0snLAon8J2UjycgPT4gJ0wnLAon8J2UkCcgPT4gJ00nLAon8J2UkScgPT4gJ04nLAon8J2UkicgPT4gJ08nLAon8J2UkycgPT4gJ1AnLAon8J2UlCcgPT4gJ1EnLAon8J2UlicgPT4gJ1MnLAon8J2UlycgPT4gJ1QnLAon8J2UmCcgPT4gJ1UnLAon8J2UmScgPT4gJ1YnLAon8J2UmicgPT4gJ1cnLAon8J2UmycgPT4gJ1gnLAon8J2UnCcgPT4gJ1knLAon8J2UnicgPT4gJ2EnLAon8J2UnycgPT4gJ2InLAon8J2UoCcgPT4gJ2MnLAon8J2UoScgPT4gJ2QnLAon8J2UoicgPT4gJ2UnLAon8J2UoycgPT4gJ2YnLAon8J2UpCcgPT4gJ2cnLAon8J2UpScgPT4gJ2gnLAon8J2UpicgPT4gJ2knLAon8J2UpycgPT4gJ2onLAon8J2UqCcgPT4gJ2snLAon8J2UqScgPT4gJ2wnLAon8J2UqicgPT4gJ20nLAon8J2UqycgPT4gJ24nLAon8J2UrCcgPT4gJ28nLAon8J2UrScgPT4gJ3AnLAon8J2UricgPT4gJ3EnLAon8J2UrycgPT4gJ3InLAon8J2UsCcgPT4gJ3MnLAon8J2UsScgPT4gJ3QnLAon8J2UsicgPT4gJ3UnLAon8J2UsycgPT4gJ3YnLAon8J2UtCcgPT4gJ3cnLAon8J2UtScgPT4gJ3gnLAon8J2UticgPT4gJ3knLAon8J2UtycgPT4gJ3onLAon8J2UuCcgPT4gJ0EnLAon8J2UuScgPT4gJ0InLAon8J2UuycgPT4gJ0QnLAon8J2UvCcgPT4gJ0UnLAon8J2UvScgPT4gJ0YnLAon8J2UvicgPT4gJ0cnLAon8J2VgCcgPT4gJ0knLAon8J2VgScgPT4gJ0onLAon8J2VgicgPT4gJ0snLAon8J2VgycgPT4gJ0wnLAon8J2VhCcgPT4gJ00nLAon8J2VhicgPT4gJ08nLAon8J2ViicgPT4gJ1MnLAon8J2ViycgPT4gJ1QnLAon8J2VjCcgPT4gJ1UnLAon8J2VjScgPT4gJ1YnLAon8J2VjicgPT4gJ1cnLAon8J2VjycgPT4gJ1gnLAon8J2VkCcgPT4gJ1knLAon8J2VkicgPT4gJ2EnLAon8J2VkycgPT4gJ2InLAon8J2VlCcgPT4gJ2MnLAon8J2VlScgPT4gJ2QnLAon8J2VlicgPT4gJ2UnLAon8J2VlycgPT4gJ2YnLAon8J2VmCcgPT4gJ2cnLAon8J2VmScgPT4gJ2gnLAon8J2VmicgPT4gJ2knLAon8J2VmycgPT4gJ2onLAon8J2VnCcgPT4gJ2snLAon8J2VnScgPT4gJ2wnLAon8J2VnicgPT4gJ20nLAon8J2VnycgPT4gJ24nLAon8J2VoCcgPT4gJ28nLAon8J2VoScgPT4gJ3AnLAon8J2VoicgPT4gJ3EnLAon8J2VoycgPT4gJ3InLAon8J2VpCcgPT4gJ3MnLAon8J2VpScgPT4gJ3QnLAon8J2VpicgPT4gJ3UnLAon8J2VpycgPT4gJ3YnLAon8J2VqCcgPT4gJ3cnLAon8J2VqScgPT4gJ3gnLAon8J2VqicgPT4gJ3knLAon8J2VqycgPT4gJ3onLAon8J2VrCcgPT4gJ0EnLAon8J2VrScgPT4gJ0InLAon8J2VricgPT4gJ0MnLAon8J2VrycgPT4gJ0QnLAon8J2VsCcgPT4gJ0UnLAon8J2VsScgPT4gJ0YnLAon8J2VsicgPT4gJ0cnLAon8J2VsycgPT4gJ0gnLAon8J2VtCcgPT4gJ0knLAon8J2VtScgPT4gJ0onLAon8J2VticgPT4gJ0snLAon8J2VtycgPT4gJ0wnLAon8J2VuCcgPT4gJ00nLAon8J2VuScgPT4gJ04nLAon8J2VuicgPT4gJ08nLAon8J2VuycgPT4gJ1AnLAon8J2VvCcgPT4gJ1EnLAon8J2VvScgPT4gJ1InLAon8J2VvicgPT4gJ1MnLAon8J2VvycgPT4gJ1QnLAon8J2WgCcgPT4gJ1UnLAon8J2WgScgPT4gJ1YnLAon8J2WgicgPT4gJ1cnLAon8J2WgycgPT4gJ1gnLAon8J2WhCcgPT4gJ1knLAon8J2WhScgPT4gJ1onLAon8J2WhicgPT4gJ2EnLAon8J2WhycgPT4gJ2InLAon8J2WiCcgPT4gJ2MnLAon8J2WiScgPT4gJ2QnLAon8J2WiicgPT4gJ2UnLAon8J2WiycgPT4gJ2YnLAon8J2WjCcgPT4gJ2cnLAon8J2WjScgPT4gJ2gnLAon8J2WjicgPT4gJ2knLAon8J2WjycgPT4gJ2onLAon8J2WkCcgPT4gJ2snLAon8J2WkScgPT4gJ2wnLAon8J2WkicgPT4gJ20nLAon8J2WkycgPT4gJ24nLAon8J2WlCcgPT4gJ28nLAon8J2WlScgPT4gJ3AnLAon8J2WlicgPT4gJ3EnLAon8J2WlycgPT4gJ3InLAon8J2WmCcgPT4gJ3MnLAon8J2WmScgPT4gJ3QnLAon8J2WmicgPT4gJ3UnLAon8J2WmycgPT4gJ3YnLAon8J2WnCcgPT4gJ3cnLAon8J2WnScgPT4gJ3gnLAon8J2WnicgPT4gJ3knLAon8J2WnycgPT4gJ3onLAon8J2WoCcgPT4gJ0EnLAon8J2WoScgPT4gJ0InLAon8J2WoicgPT4gJ0MnLAon8J2WoycgPT4gJ0QnLAon8J2WpCcgPT4gJ0UnLAon8J2WpScgPT4gJ0YnLAon8J2WpicgPT4gJ0cnLAon8J2WpycgPT4gJ0gnLAon8J2WqCcgPT4gJ0knLAon8J2WqScgPT4gJ0onLAon8J2WqicgPT4gJ0snLAon8J2WqycgPT4gJ0wnLAon8J2WrCcgPT4gJ00nLAon8J2WrScgPT4gJ04nLAon8J2WricgPT4gJ08nLAon8J2WrycgPT4gJ1AnLAon8J2WsCcgPT4gJ1EnLAon8J2WsScgPT4gJ1InLAon8J2WsicgPT4gJ1MnLAon8J2WsycgPT4gJ1QnLAon8J2WtCcgPT4gJ1UnLAon8J2WtScgPT4gJ1YnLAon8J2WticgPT4gJ1cnLAon8J2WtycgPT4gJ1gnLAon8J2WuCcgPT4gJ1knLAon8J2WuScgPT4gJ1onLAon8J2WuicgPT4gJ2EnLAon8J2WuycgPT4gJ2InLAon8J2WvCcgPT4gJ2MnLAon8J2WvScgPT4gJ2QnLAon8J2WvicgPT4gJ2UnLAon8J2WvycgPT4gJ2YnLAon8J2XgCcgPT4gJ2cnLAon8J2XgScgPT4gJ2gnLAon8J2XgicgPT4gJ2knLAon8J2XgycgPT4gJ2onLAon8J2XhCcgPT4gJ2snLAon8J2XhScgPT4gJ2wnLAon8J2XhicgPT4gJ20nLAon8J2XhycgPT4gJ24nLAon8J2XiCcgPT4gJ28nLAon8J2XiScgPT4gJ3AnLAon8J2XiicgPT4gJ3EnLAon8J2XiycgPT4gJ3InLAon8J2XjCcgPT4gJ3MnLAon8J2XjScgPT4gJ3QnLAon8J2XjicgPT4gJ3UnLAon8J2XjycgPT4gJ3YnLAon8J2XkCcgPT4gJ3cnLAon8J2XkScgPT4gJ3gnLAon8J2XkicgPT4gJ3knLAon8J2XkycgPT4gJ3onLAon8J2XlCcgPT4gJ0EnLAon8J2XlScgPT4gJ0InLAon8J2XlicgPT4gJ0MnLAon8J2XlycgPT4gJ0QnLAon8J2XmCcgPT4gJ0UnLAon8J2XmScgPT4gJ0YnLAon8J2XmicgPT4gJ0cnLAon8J2XmycgPT4gJ0gnLAon8J2XnCcgPT4gJ0knLAon8J2XnScgPT4gJ0onLAon8J2XnicgPT4gJ0snLAon8J2XnycgPT4gJ0wnLAon8J2XoCcgPT4gJ00nLAon8J2XoScgPT4gJ04nLAon8J2XoicgPT4gJ08nLAon8J2XoycgPT4gJ1AnLAon8J2XpCcgPT4gJ1EnLAon8J2XpScgPT4gJ1InLAon8J2XpicgPT4gJ1MnLAon8J2XpycgPT4gJ1QnLAon8J2XqCcgPT4gJ1UnLAon8J2XqScgPT4gJ1YnLAon8J2XqicgPT4gJ1cnLAon8J2XqycgPT4gJ1gnLAon8J2XrCcgPT4gJ1knLAon8J2XrScgPT4gJ1onLAon8J2XricgPT4gJ2EnLAon8J2XrycgPT4gJ2InLAon8J2XsCcgPT4gJ2MnLAon8J2XsScgPT4gJ2QnLAon8J2XsicgPT4gJ2UnLAon8J2XsycgPT4gJ2YnLAon8J2XtCcgPT4gJ2cnLAon8J2XtScgPT4gJ2gnLAon8J2XticgPT4gJ2knLAon8J2XtycgPT4gJ2onLAon8J2XuCcgPT4gJ2snLAon8J2XuScgPT4gJ2wnLAon8J2XuicgPT4gJ20nLAon8J2XuycgPT4gJ24nLAon8J2XvCcgPT4gJ28nLAon8J2XvScgPT4gJ3AnLAon8J2XvicgPT4gJ3EnLAon8J2XvycgPT4gJ3InLAon8J2YgCcgPT4gJ3MnLAon8J2YgScgPT4gJ3QnLAon8J2YgicgPT4gJ3UnLAon8J2YgycgPT4gJ3YnLAon8J2YhCcgPT4gJ3cnLAon8J2YhScgPT4gJ3gnLAon8J2YhicgPT4gJ3knLAon8J2YhycgPT4gJ3onLAon8J2YiCcgPT4gJ0EnLAon8J2YiScgPT4gJ0InLAon8J2YiicgPT4gJ0MnLAon8J2YiycgPT4gJ0QnLAon8J2YjCcgPT4gJ0UnLAon8J2YjScgPT4gJ0YnLAon8J2YjicgPT4gJ0cnLAon8J2YjycgPT4gJ0gnLAon8J2YkCcgPT4gJ0knLAon8J2YkScgPT4gJ0onLAon8J2YkicgPT4gJ0snLAon8J2YkycgPT4gJ0wnLAon8J2YlCcgPT4gJ00nLAon8J2YlScgPT4gJ04nLAon8J2YlicgPT4gJ08nLAon8J2YlycgPT4gJ1AnLAon8J2YmCcgPT4gJ1EnLAon8J2YmScgPT4gJ1InLAon8J2YmicgPT4gJ1MnLAon8J2YmycgPT4gJ1QnLAon8J2YnCcgPT4gJ1UnLAon8J2YnScgPT4gJ1YnLAon8J2YnicgPT4gJ1cnLAon8J2YnycgPT4gJ1gnLAon8J2YoCcgPT4gJ1knLAon8J2YoScgPT4gJ1onLAon8J2YoicgPT4gJ2EnLAon8J2YoycgPT4gJ2InLAon8J2YpCcgPT4gJ2MnLAon8J2YpScgPT4gJ2QnLAon8J2YpicgPT4gJ2UnLAon8J2YpycgPT4gJ2YnLAon8J2YqCcgPT4gJ2cnLAon8J2YqScgPT4gJ2gnLAon8J2YqicgPT4gJ2knLAon8J2YqycgPT4gJ2onLAon8J2YrCcgPT4gJ2snLAon8J2YrScgPT4gJ2wnLAon8J2YricgPT4gJ20nLAon8J2YrycgPT4gJ24nLAon8J2YsCcgPT4gJ28nLAon8J2YsScgPT4gJ3AnLAon8J2YsicgPT4gJ3EnLAon8J2YsycgPT4gJ3InLAon8J2YtCcgPT4gJ3MnLAon8J2YtScgPT4gJ3QnLAon8J2YticgPT4gJ3UnLAon8J2YtycgPT4gJ3YnLAon8J2YuCcgPT4gJ3cnLAon8J2YuScgPT4gJ3gnLAon8J2YuicgPT4gJ3knLAon8J2YuycgPT4gJ3onLAon8J2YvCcgPT4gJ0EnLAon8J2YvScgPT4gJ0InLAon8J2YvicgPT4gJ0MnLAon8J2YvycgPT4gJ0QnLAon8J2ZgCcgPT4gJ0UnLAon8J2ZgScgPT4gJ0YnLAon8J2ZgicgPT4gJ0cnLAon8J2ZgycgPT4gJ0gnLAon8J2ZhCcgPT4gJ0knLAon8J2ZhScgPT4gJ0onLAon8J2ZhicgPT4gJ0snLAon8J2ZhycgPT4gJ0wnLAon8J2ZiCcgPT4gJ00nLAon8J2ZiScgPT4gJ04nLAon8J2ZiicgPT4gJ08nLAon8J2ZiycgPT4gJ1AnLAon8J2ZjCcgPT4gJ1EnLAon8J2ZjScgPT4gJ1InLAon8J2ZjicgPT4gJ1MnLAon8J2ZjycgPT4gJ1QnLAon8J2ZkCcgPT4gJ1UnLAon8J2ZkScgPT4gJ1YnLAon8J2ZkicgPT4gJ1cnLAon8J2ZkycgPT4gJ1gnLAon8J2ZlCcgPT4gJ1knLAon8J2ZlScgPT4gJ1onLAon8J2ZlicgPT4gJ2EnLAon8J2ZlycgPT4gJ2InLAon8J2ZmCcgPT4gJ2MnLAon8J2ZmScgPT4gJ2QnLAon8J2ZmicgPT4gJ2UnLAon8J2ZmycgPT4gJ2YnLAon8J2ZnCcgPT4gJ2cnLAon8J2ZnScgPT4gJ2gnLAon8J2ZnicgPT4gJ2knLAon8J2ZnycgPT4gJ2onLAon8J2ZoCcgPT4gJ2snLAon8J2ZoScgPT4gJ2wnLAon8J2ZoicgPT4gJ20nLAon8J2ZoycgPT4gJ24nLAon8J2ZpCcgPT4gJ28nLAon8J2ZpScgPT4gJ3AnLAon8J2ZpicgPT4gJ3EnLAon8J2ZpycgPT4gJ3InLAon8J2ZqCcgPT4gJ3MnLAon8J2ZqScgPT4gJ3QnLAon8J2ZqicgPT4gJ3UnLAon8J2ZqycgPT4gJ3YnLAon8J2ZrCcgPT4gJ3cnLAon8J2ZrScgPT4gJ3gnLAon8J2ZricgPT4gJ3knLAon8J2ZrycgPT4gJ3onLAon8J2ZsCcgPT4gJ0EnLAon8J2ZsScgPT4gJ0InLAon8J2ZsicgPT4gJ0MnLAon8J2ZsycgPT4gJ0QnLAon8J2ZtCcgPT4gJ0UnLAon8J2ZtScgPT4gJ0YnLAon8J2ZticgPT4gJ0cnLAon8J2ZtycgPT4gJ0gnLAon8J2ZuCcgPT4gJ0knLAon8J2ZuScgPT4gJ0onLAon8J2ZuicgPT4gJ0snLAon8J2ZuycgPT4gJ0wnLAon8J2ZvCcgPT4gJ00nLAon8J2ZvScgPT4gJ04nLAon8J2ZvicgPT4gJ08nLAon8J2ZvycgPT4gJ1AnLAon8J2agCcgPT4gJ1EnLAon8J2agScgPT4gJ1InLAon8J2agicgPT4gJ1MnLAon8J2agycgPT4gJ1QnLAon8J2ahCcgPT4gJ1UnLAon8J2ahScgPT4gJ1YnLAon8J2ahicgPT4gJ1cnLAon8J2ahycgPT4gJ1gnLAon8J2aiCcgPT4gJ1knLAon8J2aiScgPT4gJ1onLAon8J2aiicgPT4gJ2EnLAon8J2aiycgPT4gJ2InLAon8J2ajCcgPT4gJ2MnLAon8J2ajScgPT4gJ2QnLAon8J2ajicgPT4gJ2UnLAon8J2ajycgPT4gJ2YnLAon8J2akCcgPT4gJ2cnLAon8J2akScgPT4gJ2gnLAon8J2akicgPT4gJ2knLAon8J2akycgPT4gJ2onLAon8J2alCcgPT4gJ2snLAon8J2alScgPT4gJ2wnLAon8J2alicgPT4gJ20nLAon8J2alycgPT4gJ24nLAon8J2amCcgPT4gJ28nLAon8J2amScgPT4gJ3AnLAon8J2amicgPT4gJ3EnLAon8J2amycgPT4gJ3InLAon8J2anCcgPT4gJ3MnLAon8J2anScgPT4gJ3QnLAon8J2anicgPT4gJ3UnLAon8J2anycgPT4gJ3YnLAon8J2aoCcgPT4gJ3cnLAon8J2aoScgPT4gJ3gnLAon8J2aoicgPT4gJ3knLAon8J2aoycgPT4gJ3onLAon8J2apCcgPT4gJ8SxJywKJ/CdmqUnID0+ICfItycsCifwnZqoJyA9PiAnzpEnLAon8J2aqScgPT4gJ86SJywKJ/CdmqonID0+ICfOkycsCifwnZqrJyA9PiAnzpQnLAon8J2arCcgPT4gJ86VJywKJ/Cdmq0nID0+ICfOlicsCifwnZquJyA9PiAnzpcnLAon8J2arycgPT4gJ86YJywKJ/CdmrAnID0+ICfOmScsCifwnZqxJyA9PiAnzponLAon8J2asicgPT4gJ86bJywKJ/CdmrMnID0+ICfOnCcsCifwnZq0JyA9PiAnzp0nLAon8J2atScgPT4gJ86eJywKJ/CdmrYnID0+ICfOnycsCifwnZq3JyA9PiAnzqAnLAon8J2auCcgPT4gJ86hJywKJ/CdmrknID0+ICfOmCcsCifwnZq6JyA9PiAnzqMnLAon8J2auycgPT4gJ86kJywKJ/CdmrwnID0+ICfOpScsCifwnZq9JyA9PiAnzqYnLAon8J2avicgPT4gJ86nJywKJ/Cdmr8nID0+ICfOqCcsCifwnZuAJyA9PiAnzqknLAon8J2bgScgPT4gJ+KIhycsCifwnZuCJyA9PiAnzrEnLAon8J2bgycgPT4gJ86yJywKJ/Cdm4QnID0+ICfOsycsCifwnZuFJyA9PiAnzrQnLAon8J2bhicgPT4gJ861JywKJ/Cdm4cnID0+ICfOticsCifwnZuIJyA9PiAnzrcnLAon8J2biScgPT4gJ864JywKJ/Cdm4onID0+ICfOuScsCifwnZuLJyA9PiAnzronLAon8J2bjCcgPT4gJ867JywKJ/Cdm40nID0+ICfOvCcsCifwnZuOJyA9PiAnzr0nLAon8J2bjycgPT4gJ86+JywKJ/Cdm5AnID0+ICfOvycsCifwnZuRJyA9PiAnz4AnLAon8J2bkicgPT4gJ8+BJywKJ/Cdm5MnID0+ICfPgicsCifwnZuUJyA9PiAnz4MnLAon8J2blScgPT4gJ8+EJywKJ/Cdm5YnID0+ICfPhScsCifwnZuXJyA9PiAnz4YnLAon8J2bmCcgPT4gJ8+HJywKJ/Cdm5knID0+ICfPiCcsCifwnZuaJyA9PiAnz4knLAon8J2bmycgPT4gJ+KIgicsCifwnZucJyA9PiAnzrUnLAon8J2bnScgPT4gJ864JywKJ/Cdm54nID0+ICfOuicsCifwnZufJyA9PiAnz4YnLAon8J2boCcgPT4gJ8+BJywKJ/Cdm6EnID0+ICfPgCcsCifwnZuiJyA9PiAnzpEnLAon8J2boycgPT4gJ86SJywKJ/Cdm6QnID0+ICfOkycsCifwnZulJyA9PiAnzpQnLAon8J2bpicgPT4gJ86VJywKJ/Cdm6cnID0+ICfOlicsCifwnZuoJyA9PiAnzpcnLAon8J2bqScgPT4gJ86YJywKJ/Cdm6onID0+ICfOmScsCifwnZurJyA9PiAnzponLAon8J2brCcgPT4gJ86bJywKJ/Cdm60nID0+ICfOnCcsCifwnZuuJyA9PiAnzp0nLAon8J2brycgPT4gJ86eJywKJ/Cdm7AnID0+ICfOnycsCifwnZuxJyA9PiAnzqAnLAon8J2bsicgPT4gJ86hJywKJ/Cdm7MnID0+ICfOmCcsCifwnZu0JyA9PiAnzqMnLAon8J2btScgPT4gJ86kJywKJ/Cdm7YnID0+ICfOpScsCifwnZu3JyA9PiAnzqYnLAon8J2buCcgPT4gJ86nJywKJ/Cdm7knID0+ICfOqCcsCifwnZu6JyA9PiAnzqknLAon8J2buycgPT4gJ+KIhycsCifwnZu8JyA9PiAnzrEnLAon8J2bvScgPT4gJ86yJywKJ/Cdm74nID0+ICfOsycsCifwnZu/JyA9PiAnzrQnLAon8J2cgCcgPT4gJ861JywKJ/CdnIEnID0+ICfOticsCifwnZyCJyA9PiAnzrcnLAon8J2cgycgPT4gJ864JywKJ/CdnIQnID0+ICfOuScsCifwnZyFJyA9PiAnzronLAon8J2chicgPT4gJ867JywKJ/CdnIcnID0+ICfOvCcsCifwnZyIJyA9PiAnzr0nLAon8J2ciScgPT4gJ86+JywKJ/CdnIonID0+ICfOvycsCifwnZyLJyA9PiAnz4AnLAon8J2cjCcgPT4gJ8+BJywKJ/CdnI0nID0+ICfPgicsCifwnZyOJyA9PiAnz4MnLAon8J2cjycgPT4gJ8+EJywKJ/CdnJAnID0+ICfPhScsCifwnZyRJyA9PiAnz4YnLAon8J2ckicgPT4gJ8+HJywKJ/CdnJMnID0+ICfPiCcsCifwnZyUJyA9PiAnz4knLAon8J2clScgPT4gJ+KIgicsCifwnZyWJyA9PiAnzrUnLAon8J2clycgPT4gJ864JywKJ/CdnJgnID0+ICfOuicsCifwnZyZJyA9PiAnz4YnLAon8J2cmicgPT4gJ8+BJywKJ/CdnJsnID0+ICfPgCcsCifwnZycJyA9PiAnzpEnLAon8J2cnScgPT4gJ86SJywKJ/CdnJ4nID0+ICfOkycsCifwnZyfJyA9PiAnzpQnLAon8J2coCcgPT4gJ86VJywKJ/CdnKEnID0+ICfOlicsCifwnZyiJyA9PiAnzpcnLAon8J2coycgPT4gJ86YJywKJ/CdnKQnID0+ICfOmScsCifwnZylJyA9PiAnzponLAon8J2cpicgPT4gJ86bJywKJ/CdnKcnID0+ICfOnCcsCifwnZyoJyA9PiAnzp0nLAon8J2cqScgPT4gJ86eJywKJ/CdnKonID0+ICfOnycsCifwnZyrJyA9PiAnzqAnLAon8J2crCcgPT4gJ86hJywKJ/CdnK0nID0+ICfOmCcsCifwnZyuJyA9PiAnzqMnLAon8J2crycgPT4gJ86kJywKJ/CdnLAnID0+ICfOpScsCifwnZyxJyA9PiAnzqYnLAon8J2csicgPT4gJ86nJywKJ/CdnLMnID0+ICfOqCcsCifwnZy0JyA9PiAnzqknLAon8J2ctScgPT4gJ+KIhycsCifwnZy2JyA9PiAnzrEnLAon8J2ctycgPT4gJ86yJywKJ/CdnLgnID0+ICfOsycsCifwnZy5JyA9PiAnzrQnLAon8J2cuicgPT4gJ861JywKJ/CdnLsnID0+ICfOticsCifwnZy8JyA9PiAnzrcnLAon8J2cvScgPT4gJ864JywKJ/CdnL4nID0+ICfOuScsCifwnZy/JyA9PiAnzronLAon8J2dgCcgPT4gJ867JywKJ/CdnYEnID0+ICfOvCcsCifwnZ2CJyA9PiAnzr0nLAon8J2dgycgPT4gJ86+JywKJ/CdnYQnID0+ICfOvycsCifwnZ2FJyA9PiAnz4AnLAon8J2dhicgPT4gJ8+BJywKJ/CdnYcnID0+ICfPgicsCifwnZ2IJyA9PiAnz4MnLAon8J2diScgPT4gJ8+EJywKJ/CdnYonID0+ICfPhScsCifwnZ2LJyA9PiAnz4YnLAon8J2djCcgPT4gJ8+HJywKJ/CdnY0nID0+ICfPiCcsCifwnZ2OJyA9PiAnz4knLAon8J2djycgPT4gJ+KIgicsCifwnZ2QJyA9PiAnzrUnLAon8J2dkScgPT4gJ864JywKJ/CdnZInID0+ICfOuicsCifwnZ2TJyA9PiAnz4YnLAon8J2dlCcgPT4gJ8+BJywKJ/CdnZUnID0+ICfPgCcsCifwnZ2WJyA9PiAnzpEnLAon8J2dlycgPT4gJ86SJywKJ/CdnZgnID0+ICfOkycsCifwnZ2ZJyA9PiAnzpQnLAon8J2dmicgPT4gJ86VJywKJ/CdnZsnID0+ICfOlicsCifwnZ2cJyA9PiAnzpcnLAon8J2dnScgPT4gJ86YJywKJ/CdnZ4nID0+ICfOmScsCifwnZ2fJyA9PiAnzponLAon8J2doCcgPT4gJ86bJywKJ/CdnaEnID0+ICfOnCcsCifwnZ2iJyA9PiAnzp0nLAon8J2doycgPT4gJ86eJywKJ/CdnaQnID0+ICfOnycsCifwnZ2lJyA9PiAnzqAnLAon8J2dpicgPT4gJ86hJywKJ/CdnacnID0+ICfOmCcsCifwnZ2oJyA9PiAnzqMnLAon8J2dqScgPT4gJ86kJywKJ/CdnaonID0+ICfOpScsCifwnZ2rJyA9PiAnzqYnLAon8J2drCcgPT4gJ86nJywKJ/Cdna0nID0+ICfOqCcsCifwnZ2uJyA9PiAnzqknLAon8J2drycgPT4gJ+KIhycsCifwnZ2wJyA9PiAnzrEnLAon8J2dsScgPT4gJ86yJywKJ/CdnbInID0+ICfOsycsCifwnZ2zJyA9PiAnzrQnLAon8J2dtCcgPT4gJ861JywKJ/CdnbUnID0+ICfOticsCifwnZ22JyA9PiAnzrcnLAon8J2dtycgPT4gJ864JywKJ/CdnbgnID0+ICfOuScsCifwnZ25JyA9PiAnzronLAon8J2duicgPT4gJ867JywKJ/CdnbsnID0+ICfOvCcsCifwnZ28JyA9PiAnzr0nLAon8J2dvScgPT4gJ86+JywKJ/Cdnb4nID0+ICfOvycsCifwnZ2/JyA9PiAnz4AnLAon8J2egCcgPT4gJ8+BJywKJ/CdnoEnID0+ICfPgicsCifwnZ6CJyA9PiAnz4MnLAon8J2egycgPT4gJ8+EJywKJ/CdnoQnID0+ICfPhScsCifwnZ6FJyA9PiAnz4YnLAon8J2ehicgPT4gJ8+HJywKJ/CdnocnID0+ICfPiCcsCifwnZ6IJyA9PiAnz4knLAon8J2eiScgPT4gJ+KIgicsCifwnZ6KJyA9PiAnzrUnLAon8J2eiycgPT4gJ864JywKJ/CdnownID0+ICfOuicsCifwnZ6NJyA9PiAnz4YnLAon8J2ejicgPT4gJ8+BJywKJ/Cdno8nID0+ICfPgCcsCifwnZ6QJyA9PiAnzpEnLAon8J2ekScgPT4gJ86SJywKJ/CdnpInID0+ICfOkycsCifwnZ6TJyA9PiAnzpQnLAon8J2elCcgPT4gJ86VJywKJ/CdnpUnID0+ICfOlicsCifwnZ6WJyA9PiAnzpcnLAon8J2elycgPT4gJ86YJywKJ/CdnpgnID0+ICfOmScsCifwnZ6ZJyA9PiAnzponLAon8J2emicgPT4gJ86bJywKJ/CdnpsnID0+ICfOnCcsCifwnZ6cJyA9PiAnzp0nLAon8J2enScgPT4gJ86eJywKJ/Cdnp4nID0+ICfOnycsCifwnZ6fJyA9PiAnzqAnLAon8J2eoCcgPT4gJ86hJywKJ/CdnqEnID0+ICfOmCcsCifwnZ6iJyA9PiAnzqMnLAon8J2eoycgPT4gJ86kJywKJ/CdnqQnID0+ICfOpScsCifwnZ6lJyA9PiAnzqYnLAon8J2epicgPT4gJ86nJywKJ/CdnqcnID0+ICfOqCcsCifwnZ6oJyA9PiAnzqknLAon8J2eqScgPT4gJ+KIhycsCifwnZ6qJyA9PiAnzrEnLAon8J2eqycgPT4gJ86yJywKJ/CdnqwnID0+ICfOsycsCifwnZ6tJyA9PiAnzrQnLAon8J2ericgPT4gJ861JywKJ/Cdnq8nID0+ICfOticsCifwnZ6wJyA9PiAnzrcnLAon8J2esScgPT4gJ864JywKJ/CdnrInID0+ICfOuScsCifwnZ6zJyA9PiAnzronLAon8J2etCcgPT4gJ867JywKJ/CdnrUnID0+ICfOvCcsCifwnZ62JyA9PiAnzr0nLAon8J2etycgPT4gJ86+JywKJ/CdnrgnID0+ICfOvycsCifwnZ65JyA9PiAnz4AnLAon8J2euicgPT4gJ8+BJywKJ/CdnrsnID0+ICfPgicsCifwnZ68JyA9PiAnz4MnLAon8J2evScgPT4gJ8+EJywKJ/Cdnr4nID0+ICfPhScsCifwnZ6/JyA9PiAnz4YnLAon8J2fgCcgPT4gJ8+HJywKJ/Cdn4EnID0+ICfPiCcsCifwnZ+CJyA9PiAnz4knLAon8J2fgycgPT4gJ+KIgicsCifwnZ+EJyA9PiAnzrUnLAon8J2fhScgPT4gJ864JywKJ/Cdn4YnID0+ICfOuicsCifwnZ+HJyA9PiAnz4YnLAon8J2fiCcgPT4gJ8+BJywKJ/Cdn4knID0+ICfPgCcsCifwnZ+KJyA9PiAnz5wnLAon8J2fiycgPT4gJ8+dJywKJ/Cdn44nID0+ICcwJywKJ/Cdn48nID0+ICcxJywKJ/Cdn5AnID0+ICcyJywKJ/Cdn5EnID0+ICczJywKJ/Cdn5InID0+ICc0JywKJ/Cdn5MnID0+ICc1JywKJ/Cdn5QnID0+ICc2JywKJ/Cdn5UnID0+ICc3JywKJ/Cdn5YnID0+ICc4JywKJ/Cdn5cnID0+ICc5JywKJ/Cdn5gnID0+ICcwJywKJ/Cdn5knID0+ICcxJywKJ/Cdn5onID0+ICcyJywKJ/Cdn5snID0+ICczJywKJ/Cdn5wnID0+ICc0JywKJ/Cdn50nID0+ICc1JywKJ/Cdn54nID0+ICc2JywKJ/Cdn58nID0+ICc3JywKJ/Cdn6AnID0+ICc4JywKJ/Cdn6EnID0+ICc5JywKJ/Cdn6InID0+ICcwJywKJ/Cdn6MnID0+ICcxJywKJ/Cdn6QnID0+ICcyJywKJ/Cdn6UnID0+ICczJywKJ/Cdn6YnID0+ICc0JywKJ/Cdn6cnID0+ICc1JywKJ/Cdn6gnID0+ICc2JywKJ/Cdn6knID0+ICc3JywKJ/Cdn6onID0+ICc4JywKJ/Cdn6snID0+ICc5JywKJ/Cdn6wnID0+ICcwJywKJ/Cdn60nID0+ICcxJywKJ/Cdn64nID0+ICcyJywKJ/Cdn68nID0+ICczJywKJ/Cdn7AnID0+ICc0JywKJ/Cdn7EnID0+ICc1JywKJ/Cdn7InID0+ICc2JywKJ/Cdn7MnID0+ICc3JywKJ/Cdn7QnID0+ICc4JywKJ/Cdn7UnID0+ICc5JywKJ/Cdn7YnID0+ICcwJywKJ/Cdn7cnID0+ICcxJywKJ/Cdn7gnID0+ICcyJywKJ/Cdn7knID0+ICczJywKJ/Cdn7onID0+ICc0JywKJ/Cdn7snID0+ICc1JywKJ/Cdn7wnID0+ICc2JywKJ/Cdn70nID0+ICc3JywKJ/Cdn74nID0+ICc4JywKJ/Cdn78nID0+ICc5JywKJ/CeuIAnID0+ICfYpycsCifwnriBJyA9PiAn2KgnLAon8J64gicgPT4gJ9isJywKJ/CeuIMnID0+ICfYrycsCifwnriFJyA9PiAn2YgnLAon8J64hicgPT4gJ9iyJywKJ/CeuIcnID0+ICfYrScsCifwnriIJyA9PiAn2LcnLAon8J64iScgPT4gJ9mKJywKJ/CeuIonID0+ICfZgycsCifwnriLJyA9PiAn2YQnLAon8J64jCcgPT4gJ9mFJywKJ/CeuI0nID0+ICfZhicsCifwnriOJyA9PiAn2LMnLAon8J64jycgPT4gJ9i5JywKJ/CeuJAnID0+ICfZgScsCifwnriRJyA9PiAn2LUnLAon8J64kicgPT4gJ9mCJywKJ/CeuJMnID0+ICfYsScsCifwnriUJyA9PiAn2LQnLAon8J64lScgPT4gJ9iqJywKJ/CeuJYnID0+ICfYqycsCifwnriXJyA9PiAn2K4nLAon8J64mCcgPT4gJ9iwJywKJ/CeuJknID0+ICfYticsCifwnriaJyA9PiAn2LgnLAon8J64mycgPT4gJ9i6JywKJ/CeuJwnID0+ICfZricsCifwnridJyA9PiAn2ronLAon8J64nicgPT4gJ9qhJywKJ/CeuJ8nID0+ICfZrycsCifwnrihJyA9PiAn2KgnLAon8J64oicgPT4gJ9isJywKJ/CeuKQnID0+ICfZhycsCifwnrinJyA9PiAn2K0nLAon8J64qScgPT4gJ9mKJywKJ/CeuKonID0+ICfZgycsCifwnrirJyA9PiAn2YQnLAon8J64rCcgPT4gJ9mFJywKJ/CeuK0nID0+ICfZhicsCifwnriuJyA9PiAn2LMnLAon8J64rycgPT4gJ9i5JywKJ/CeuLAnID0+ICfZgScsCifwnrixJyA9PiAn2LUnLAon8J64sicgPT4gJ9mCJywKJ/CeuLQnID0+ICfYtCcsCifwnri1JyA9PiAn2KonLAon8J64ticgPT4gJ9irJywKJ/CeuLcnID0+ICfYricsCifwnri5JyA9PiAn2LYnLAon8J64uycgPT4gJ9i6JywKJ/CeuYInID0+ICfYrCcsCifwnrmHJyA9PiAn2K0nLAon8J65iScgPT4gJ9mKJywKJ/CeuYsnID0+ICfZhCcsCifwnrmNJyA9PiAn2YYnLAon8J65jicgPT4gJ9izJywKJ/CeuY8nID0+ICfYuScsCifwnrmRJyA9PiAn2LUnLAon8J65kicgPT4gJ9mCJywKJ/CeuZQnID0+ICfYtCcsCifwnrmXJyA9PiAn2K4nLAon8J65mScgPT4gJ9i2JywKJ/CeuZsnID0+ICfYuicsCifwnrmdJyA9PiAn2ronLAon8J65nycgPT4gJ9mvJywKJ/CeuaEnID0+ICfYqCcsCifwnrmiJyA9PiAn2KwnLAon8J65pCcgPT4gJ9mHJywKJ/CeuacnID0+ICfYrScsCifwnrmoJyA9PiAn2LcnLAon8J65qScgPT4gJ9mKJywKJ/CeuaonID0+ICfZgycsCifwnrmsJyA9PiAn2YUnLAon8J65rScgPT4gJ9mGJywKJ/Ceua4nID0+ICfYsycsCifwnrmvJyA9PiAn2LknLAon8J65sCcgPT4gJ9mBJywKJ/CeubEnID0+ICfYtScsCifwnrmyJyA9PiAn2YInLAon8J65tCcgPT4gJ9i0JywKJ/CeubUnID0+ICfYqicsCifwnrm2JyA9PiAn2KsnLAon8J65tycgPT4gJ9iuJywKJ/CeubknID0+ICfYticsCifwnrm6JyA9PiAn2LgnLAon8J65uycgPT4gJ9i6JywKJ/CeubwnID0+ICfZricsCifwnrm+JyA9PiAn2qEnLAon8J66gCcgPT4gJ9inJywKJ/CeuoEnID0+ICfYqCcsCifwnrqCJyA9PiAn2KwnLAon8J66gycgPT4gJ9ivJywKJ/CeuoQnID0+ICfZhycsCifwnrqFJyA9PiAn2YgnLAon8J66hicgPT4gJ9iyJywKJ/CeuocnID0+ICfYrScsCifwnrqIJyA9PiAn2LcnLAon8J66iScgPT4gJ9mKJywKJ/CeuosnID0+ICfZhCcsCifwnrqMJyA9PiAn2YUnLAon8J66jScgPT4gJ9mGJywKJ/Ceuo4nID0+ICfYsycsCifwnrqPJyA9PiAn2LknLAon8J66kCcgPT4gJ9mBJywKJ/CeupEnID0+ICfYtScsCifwnrqSJyA9PiAn2YInLAon8J66kycgPT4gJ9ixJywKJ/CeupQnID0+ICfYtCcsCifwnrqVJyA9PiAn2KonLAon8J66licgPT4gJ9irJywKJ/CeupcnID0+ICfYricsCifwnrqYJyA9PiAn2LAnLAon8J66mScgPT4gJ9i2JywKJ/CeuponID0+ICfYuCcsCifwnrqbJyA9PiAn2LonLAon8J66oScgPT4gJ9ioJywKJ/CeuqInID0+ICfYrCcsCifwnrqjJyA9PiAn2K8nLAon8J66pScgPT4gJ9mIJywKJ/CeuqYnID0+ICfYsicsCifwnrqnJyA9PiAn2K0nLAon8J66qCcgPT4gJ9i3JywKJ/CeuqknID0+ICfZiicsCifwnrqrJyA9PiAn2YQnLAon8J66rCcgPT4gJ9mFJywKJ/Ceuq0nID0+ICfZhicsCifwnrquJyA9PiAn2LMnLAon8J66rycgPT4gJ9i5JywKJ/CeurAnID0+ICfZgScsCifwnrqxJyA9PiAn2LUnLAon8J66sicgPT4gJ9mCJywKJ/CeurMnID0+ICfYsScsCifwnrq0JyA9PiAn2LQnLAon8J66tScgPT4gJ9iqJywKJ/CeurYnID0+ICfYqycsCifwnrq3JyA9PiAn2K4nLAon8J66uCcgPT4gJ9iwJywKJ/CeurknID0+ICfYticsCifwnrq6JyA9PiAn2LgnLAon8J66uycgPT4gJ9i6JywKJ/CfhIAnID0+ICcwLicsCifwn4SBJyA9PiAnMCwnLAon8J+EgicgPT4gJzEsJywKJ/CfhIMnID0+ICcyLCcsCifwn4SEJyA9PiAnMywnLAon8J+EhScgPT4gJzQsJywKJ/CfhIYnID0+ICc1LCcsCifwn4SHJyA9PiAnNiwnLAon8J+EiCcgPT4gJzcsJywKJ/CfhIknID0+ICc4LCcsCifwn4SKJyA9PiAnOSwnLAon8J+EkCcgPT4gJyhBKScsCifwn4SRJyA9PiAnKEIpJywKJ/CfhJInID0+ICcoQyknLAon8J+EkycgPT4gJyhEKScsCifwn4SUJyA9PiAnKEUpJywKJ/CfhJUnID0+ICcoRiknLAon8J+ElicgPT4gJyhHKScsCifwn4SXJyA9PiAnKEgpJywKJ/CfhJgnID0+ICcoSSknLAon8J+EmScgPT4gJyhKKScsCifwn4SaJyA9PiAnKEspJywKJ/CfhJsnID0+ICcoTCknLAon8J+EnCcgPT4gJyhNKScsCifwn4SdJyA9PiAnKE4pJywKJ/CfhJ4nID0+ICcoTyknLAon8J+EnycgPT4gJyhQKScsCifwn4SgJyA9PiAnKFEpJywKJ/CfhKEnID0+ICcoUiknLAon8J+EoicgPT4gJyhTKScsCifwn4SjJyA9PiAnKFQpJywKJ/CfhKQnID0+ICcoVSknLAon8J+EpScgPT4gJyhWKScsCifwn4SmJyA9PiAnKFcpJywKJ/CfhKcnID0+ICcoWCknLAon8J+EqCcgPT4gJyhZKScsCifwn4SpJyA9PiAnKFopJywKJ/CfhKonID0+ICfjgJRT44CVJywKJ/CfhKsnID0+ICdDJywKJ/CfhKwnID0+ICdSJywKJ/CfhK0nID0+ICdDRCcsCifwn4SuJyA9PiAnV1onLAon8J+EsCcgPT4gJ0EnLAon8J+EsScgPT4gJ0InLAon8J+EsicgPT4gJ0MnLAon8J+EsycgPT4gJ0QnLAon8J+EtCcgPT4gJ0UnLAon8J+EtScgPT4gJ0YnLAon8J+EticgPT4gJ0cnLAon8J+EtycgPT4gJ0gnLAon8J+EuCcgPT4gJ0knLAon8J+EuScgPT4gJ0onLAon8J+EuicgPT4gJ0snLAon8J+EuycgPT4gJ0wnLAon8J+EvCcgPT4gJ00nLAon8J+EvScgPT4gJ04nLAon8J+EvicgPT4gJ08nLAon8J+EvycgPT4gJ1AnLAon8J+FgCcgPT4gJ1EnLAon8J+FgScgPT4gJ1InLAon8J+FgicgPT4gJ1MnLAon8J+FgycgPT4gJ1QnLAon8J+FhCcgPT4gJ1UnLAon8J+FhScgPT4gJ1YnLAon8J+FhicgPT4gJ1cnLAon8J+FhycgPT4gJ1gnLAon8J+FiCcgPT4gJ1knLAon8J+FiScgPT4gJ1onLAon8J+FiicgPT4gJ0hWJywKJ/CfhYsnID0+ICdNVicsCifwn4WMJyA9PiAnU0QnLAon8J+FjScgPT4gJ1NTJywKJ/CfhY4nID0+ICdQUFYnLAon8J+FjycgPT4gJ1dDJywKJ/CfhaonID0+ICdNQycsCifwn4WrJyA9PiAnTUQnLAon8J+FrCcgPT4gJ01SJywKJ/CfhpAnID0+ICdESicsCifwn4iAJyA9PiAn44G744GLJywKJ/CfiIEnID0+ICfjgrPjgrMnLAon8J+IgicgPT4gJ+OCtScsCifwn4iQJyA9PiAn5omLJywKJ/CfiJEnID0+ICflrZcnLAon8J+IkicgPT4gJ+WPjCcsCifwn4iTJyA9PiAn44OG44KZJywKJ/CfiJQnID0+ICfkuownLAon8J+IlScgPT4gJ+WkmicsCifwn4iWJyA9PiAn6KejJywKJ/CfiJcnID0+ICflpKknLAon8J+ImCcgPT4gJ+S6pCcsCifwn4iZJyA9PiAn5pigJywKJ/CfiJonID0+ICfnhKEnLAon8J+ImycgPT4gJ+aWmScsCifwn4icJyA9PiAn5YmNJywKJ/CfiJ0nID0+ICflvownLAon8J+InicgPT4gJ+WGjScsCifwn4ifJyA9PiAn5pawJywKJ/CfiKAnID0+ICfliJ0nLAon8J+IoScgPT4gJ+e1gicsCifwn4iiJyA9PiAn55SfJywKJ/CfiKMnID0+ICfosqknLAon8J+IpCcgPT4gJ+WjsCcsCifwn4ilJyA9PiAn5ZC5JywKJ/CfiKYnID0+ICfmvJQnLAon8J+IpycgPT4gJ+aKlScsCifwn4ioJyA9PiAn5o2VJywKJ/CfiKknID0+ICfkuIAnLAon8J+IqicgPT4gJ+S4iScsCifwn4irJyA9PiAn6YGKJywKJ/CfiKwnID0+ICflt6YnLAon8J+IrScgPT4gJ+S4rScsCifwn4iuJyA9PiAn5Y+zJywKJ/CfiK8nID0+ICfmjIcnLAon8J+IsCcgPT4gJ+i1sCcsCifwn4ixJyA9PiAn5omTJywKJ/CfiLInID0+ICfnpoEnLAon8J+IsycgPT4gJ+epuicsCifwn4i0JyA9PiAn5ZCIJywKJ/CfiLUnID0+ICfmuoAnLAon8J+IticgPT4gJ+aciScsCifwn4i3JyA9PiAn5pyIJywKJ/CfiLgnID0+ICfnlLMnLAon8J+IuScgPT4gJ+WJsicsCifwn4i6JyA9PiAn5Za2JywKJ/CfiLsnID0+ICfphY0nLAon8J+JgCcgPT4gJ+OAlOacrOOAlScsCifwn4mBJyA9PiAn44CU5LiJ44CVJywKJ/CfiYInID0+ICfjgJTkuozjgJUnLAon8J+JgycgPT4gJ+OAlOWuieOAlScsCifwn4mEJyA9PiAn44CU54K544CVJywKJ/CfiYUnID0+ICfjgJTmiZPjgJUnLAon8J+JhicgPT4gJ+OAlOebl+OAlScsCifwn4mHJyA9PiAn44CU5Yud44CVJywKJ/CfiYgnID0+ICfjgJTmlZfjgJUnLAon8J+JkCcgPT4gJ+W+lycsCifwn4mRJyA9PiAn5Y+vJywKJ/Cfr7AnID0+ICcwJywKJ/Cfr7EnID0+ICcxJywKJ/Cfr7InID0+ICcyJywKJ/Cfr7MnID0+ICczJywKJ/Cfr7QnID0+ICc0JywKJ/Cfr7UnID0+ICc1JywKJ/Cfr7YnID0+ICc2JywKJ/Cfr7cnID0+ICc3JywKJ/Cfr7gnID0+ICc4JywKJ/Cfr7knID0+ICc5JywKKTsKPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXEludGxcTm9ybWFsaXplciBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCkgewpyZXR1cm4gcmVxdWlyZSBfX0RJUl9fLicvYm9vdHN0cmFwODAucGhwJzsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ25vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCcpKSB7CmZ1bmN0aW9uIG5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKSB7IHJldHVybiBwXE5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9ub3JtYWxpemUnKSkgewpmdW5jdGlvbiBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyaW5nLCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKSB7IHJldHVybiBwXE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSgkc3RyaW5nLCAkZm9ybSk7IH0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcSW50bFxOb3JtYWxpemVyIGFzIHA7CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9pc19ub3JtYWxpemVkJykpIHsKZnVuY3Rpb24gbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKD9zdHJpbmcgJHN0cmluZywgP2ludCAkZm9ybSA9IHBcTm9ybWFsaXplcjo6Rk9STV9DKTogYm9vbCB7IHJldHVybiBwXE5vcm1hbGl6ZXI6OmlzTm9ybWFsaXplZCgoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkZm9ybSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbm9ybWFsaXplcl9ub3JtYWxpemUnKSkgewpmdW5jdGlvbiBub3JtYWxpemVyX25vcm1hbGl6ZSg/c3RyaW5nICRzdHJpbmcsID9pbnQgJGZvcm0gPSBwXE5vcm1hbGl6ZXI6OkZPUk1fQyk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE5vcm1hbGl6ZXI6Om5vcm1hbGl6ZSgoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkZm9ybSk7IH0KfQoKQ29weXJpZ2h0IChjKSAyMDE1LXByZXNlbnQgRmFiaWVuIFBvdGVuY2llcgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZAp0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KCjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxNYnN0cmluZzsKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKZmluYWwgY2xhc3MgTWJzdHJpbmcKewpwdWJsaWMgY29uc3QgTUJfQ0FTRV9GT0xEID0gXFBIUF9JTlRfTUFYOwoKcHJpdmF0ZSBjb25zdCBTSU1QTEVfQ0FTRV9GT0xEID0gWwpbJ8K1JywgJ8W/JywgIlx4Q0RceDg1IiwgJ8+CJywgIlx4Q0ZceDkwIiwgIlx4Q0ZceDkxIiwgIlx4Q0ZceDk1IiwgIlx4Q0ZceDk2IiwgIlx4Q0ZceEIwIiwgIlx4Q0ZceEIxIiwgIlx4Q0ZceEI1IiwgIlx4RTFceEJBXHg5QiIsICJceEUxXHhCRVx4QkUiXSwKWyfOvCcsICdzJywgJ865JywgJ8+DJywgJ86yJywgJ864JywgJ8+GJywgJ8+AJywgJ866JywgJ8+BJywgJ861JywgIlx4RTFceEI5XHhBMSIsICfOuSddLApdOwoKcHJpdmF0ZSBzdGF0aWMgJGVuY29kaW5nTGlzdCA9IFsnQVNDSUknLCAnVVRGLTgnXTsKcHJpdmF0ZSBzdGF0aWMgJGxhbmd1YWdlID0gJ25ldXRyYWwnOwpwcml2YXRlIHN0YXRpYyAkaW50ZXJuYWxFbmNvZGluZyA9ICdVVEYtOCc7CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHMsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nID0gbnVsbCkKewppZiAoXGlzX2FycmF5KCRzKSkgewokciA9IFtdOwpmb3JlYWNoICgkcyBhcyAkc3RyKSB7CiRyW10gPSBzZWxmOjptYl9jb252ZXJ0X2VuY29kaW5nKCRzdHIsICR0b0VuY29kaW5nLCAkZnJvbUVuY29kaW5nKTsKfQoKcmV0dXJuICRyOwp9CgppZiAoXGlzX2FycmF5KCRmcm9tRW5jb2RpbmcpIHx8IChudWxsICE9PSAkZnJvbUVuY29kaW5nICYmIGZhbHNlICE9PSBzdHJwb3MoJGZyb21FbmNvZGluZywgJywnKSkpIHsKJGZyb21FbmNvZGluZyA9IHNlbGY6Om1iX2RldGVjdF9lbmNvZGluZygkcywgJGZyb21FbmNvZGluZyk7Cn0gZWxzZSB7CiRmcm9tRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZnJvbUVuY29kaW5nKTsKfQoKJHRvRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkdG9FbmNvZGluZyk7CgppZiAoJ0JBU0U2NCcgPT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBiYXNlNjRfZGVjb2RlKCRzKTsKJGZyb21FbmNvZGluZyA9ICR0b0VuY29kaW5nOwp9CgppZiAoJ0JBU0U2NCcgPT09ICR0b0VuY29kaW5nKSB7CnJldHVybiBiYXNlNjRfZW5jb2RlKCRzKTsKfQoKaWYgKCdIVE1MLUVOVElUSUVTJyA9PT0gJHRvRW5jb2RpbmcgfHwgJ0hUTUwnID09PSAkdG9FbmNvZGluZykgewppZiAoJ0hUTUwtRU5USVRJRVMnID09PSAkZnJvbUVuY29kaW5nIHx8ICdIVE1MJyA9PT0gJGZyb21FbmNvZGluZykgewokZnJvbUVuY29kaW5nID0gJ1dpbmRvd3MtMTI1Mic7Cn0KaWYgKCdVVEYtOCcgIT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBpY29udigkZnJvbUVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKcmV0dXJuIHByZWdfcmVwbGFjZV9jYWxsYmFjaygnL1tceDgwLVx4RkZdKy8nLCBbX19DTEFTU19fLCAnaHRtbF9lbmNvZGluZ19jYWxsYmFjayddLCAkcyk7Cn0KCmlmICgnSFRNTC1FTlRJVElFUycgPT09ICRmcm9tRW5jb2RpbmcpIHsKJHMgPSBodG1sX2VudGl0eV9kZWNvZGUoJHMsIFxFTlRfQ09NUEFULCAnVVRGLTgnKTsKJGZyb21FbmNvZGluZyA9ICdVVEYtOCc7Cn0KCnJldHVybiBpY29udigkZnJvbUVuY29kaW5nLCAkdG9FbmNvZGluZy4nLy9JR05PUkUnLCAkcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY29udmVydF92YXJpYWJsZXMoJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcsICYuLi4kdmFycykKewokb2sgPSB0cnVlOwphcnJheV93YWxrX3JlY3Vyc2l2ZSgkdmFycywgZnVuY3Rpb24gKCYkdikgdXNlICgmJG9rLCAkdG9FbmNvZGluZywgJGZyb21FbmNvZGluZykgewppZiAoZmFsc2UgPT09ICR2ID0gc2VsZjo6bWJfY29udmVydF9lbmNvZGluZygkdiwgJHRvRW5jb2RpbmcsICRmcm9tRW5jb2RpbmcpKSB7CiRvayA9IGZhbHNlOwp9Cn0pOwoKcmV0dXJuICRvayA/ICRmcm9tRW5jb2RpbmcgOiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9kZWNvZGVfbWltZWhlYWRlcigkcykKewpyZXR1cm4gaWNvbnZfbWltZV9kZWNvZGUoJHMsIDIsIHNlbGY6OiRpbnRlcm5hbEVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9lbmNvZGVfbWltZWhlYWRlcigkcywgJGNoYXJzZXQgPSBudWxsLCAkdHJhbnNmZXJFbmNvZGluZyA9IG51bGwsICRsaW5lZmVlZCA9IG51bGwsICRpbmRlbnQgPSBudWxsKQp7CnRyaWdnZXJfZXJyb3IoJ21iX2VuY29kZV9taW1laGVhZGVyKCkgaXMgYnVnZ2VkLiBQbGVhc2UgdXNlIGljb252X21pbWVfZW5jb2RlKCkgaW5zdGVhZCcsIFxFX1VTRVJfV0FSTklORyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoJHMsICRjb252bWFwLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmIChudWxsICE9PSAkcyAmJiAhXGlzX3NjYWxhcigkcykgJiYgIShcaXNfb2JqZWN0KCRzKSAmJiBtZXRob2RfZXhpc3RzKCRzLCAnX190b1N0cmluZycpKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSgpIGV4cGVjdHMgcGFyYW1ldGVyIDEgdG8gYmUgc3RyaW5nLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAoIVxpc19hcnJheSgkY29udm1hcCkgfHwgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEICYmICEkY29udm1hcCkpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAobnVsbCAhPT0gJGVuY29kaW5nICYmICFcaXNfc2NhbGFyKCRlbmNvZGluZykpIHsKdHJpZ2dlcl9lcnJvcignbWJfZGVjb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciAzIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkcykuJyBnaXZlbicsIFxFX1VTRVJfV0FSTklORyk7CgpyZXR1cm4gJyc7IAp9CgokcyA9IChzdHJpbmcpICRzOwppZiAoJycgPT09ICRzKSB7CnJldHVybiAnJzsKfQoKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbnVsbDsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcykpIHsKJHMgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KfSBlbHNlIHsKJHMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9CgokY250ID0gZmxvb3IoXGNvdW50KCRjb252bWFwKSAvIDQpICogNDsKCmZvciAoJGkgPSAwOyAkaSA8ICRjbnQ7ICRpICs9IDQpIHsKCiRjb252bWFwWyRpXSArPSAkY29udm1hcFskaSArIDJdOwokY29udm1hcFskaSArIDFdICs9ICRjb252bWFwWyRpICsgMl07Cn0KCiRzID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvJiMoPzowKihbMC05XSspfHgwKihbMC05YS1mQS1GXSspKSg/ISYpOz8vJywgZnVuY3Rpb24gKGFycmF5ICRtKSB1c2UgKCRjbnQsICRjb252bWFwKSB7CiRjID0gaXNzZXQoJG1bMl0pID8gKGludCkgaGV4ZGVjKCRtWzJdKSA6ICRtWzFdOwpmb3IgKCRpID0gMDsgJGkgPCAkY250OyAkaSArPSA0KSB7CmlmICgkYyA+PSAkY29udm1hcFskaV0gJiYgJGMgPD0gJGNvbnZtYXBbJGkgKyAxXSkgewpyZXR1cm4gc2VsZjo6bWJfY2hyKCRjIC0gJGNvbnZtYXBbJGkgKyAyXSk7Cn0KfQoKcmV0dXJuICRtWzBdOwp9LCAkcyk7CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAkczsKfQoKcmV0dXJuIGljb252KCdVVEYtOCcsICRlbmNvZGluZy4nLy9JR05PUkUnLCAkcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoJHMsICRjb252bWFwLCAkZW5jb2RpbmcgPSBudWxsLCAkaXNfaGV4ID0gZmFsc2UpCnsKaWYgKG51bGwgIT09ICRzICYmICFcaXNfc2NhbGFyKCRzKSAmJiAhKFxpc19vYmplY3QoJHMpICYmIG1ldGhvZF9leGlzdHMoJHMsICdfX3RvU3RyaW5nJykpKSB7CnRyaWdnZXJfZXJyb3IoJ21iX2VuY29kZV9udW1lcmljZW50aXR5KCkgZXhwZWN0cyBwYXJhbWV0ZXIgMSB0byBiZSBzdHJpbmcsICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIG51bGw7Cn0KCmlmICghXGlzX2FycmF5KCRjb252bWFwKSB8fCAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQgJiYgISRjb252bWFwKSkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmIChudWxsICE9PSAkZW5jb2RpbmcgJiYgIVxpc19zY2FsYXIoJGVuY29kaW5nKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgpIGV4cGVjdHMgcGFyYW1ldGVyIDMgdG8gYmUgc3RyaW5nLCAnLlxnZXR0eXBlKCRzKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOyAKfQoKaWYgKG51bGwgIT09ICRpc19oZXggJiYgIVxpc19zY2FsYXIoJGlzX2hleCkpIHsKdHJpZ2dlcl9lcnJvcignbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoKSBleHBlY3RzIHBhcmFtZXRlciA0IHRvIGJlIGJvb2xlYW4sICcuXGdldHR5cGUoJHMpLicgZ2l2ZW4nLCBcRV9VU0VSX1dBUk5JTkcpOwoKcmV0dXJuIG51bGw7Cn0KCiRzID0gKHN0cmluZykgJHM7CmlmICgnJyA9PT0gJHMpIHsKcmV0dXJuICcnOwp9CgokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBudWxsOwppZiAoIXByZWdfbWF0Y2goJy8vdScsICRzKSkgewokcyA9IEBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQp9IGVsc2UgewokcyA9IGljb252KCRlbmNvZGluZywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KCnN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwoKJGNudCA9IGZsb29yKFxjb3VudCgkY29udm1hcCkgLyA0KSAqIDQ7CiRpID0gMDsKJGxlbiA9IFxzdHJsZW4oJHMpOwokcmVzdWx0ID0gJyc7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CiR1bGVuID0gJHNbJGldIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKJGkgKz0gJHVsZW47CiRjID0gc2VsZjo6bWJfb3JkKCR1Y2hyKTsKCmZvciAoJGogPSAwOyAkaiA8ICRjbnQ7ICRqICs9IDQpIHsKaWYgKCRjID49ICRjb252bWFwWyRqXSAmJiAkYyA8PSAkY29udm1hcFskaiArIDFdKSB7CiRjT2Zmc2V0ID0gKCRjICsgJGNvbnZtYXBbJGogKyAyXSkgJiAkY29udm1hcFskaiArIDNdOwokcmVzdWx0IC49ICRpc19oZXggPyBzcHJpbnRmKCcmI3glWDsnLCAkY09mZnNldCkgOiAnJiMnLiRjT2Zmc2V0Lic7JzsKY29udGludWUgMjsKfQp9CiRyZXN1bHQgLj0gJHVjaHI7Cn0KCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRyZXN1bHQ7Cn0KCnJldHVybiBpY29udignVVRGLTgnLCAkZW5jb2RpbmcuJy8vSUdOT1JFJywgJHJlc3VsdCk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY29udmVydF9jYXNlKCRzLCAkbW9kZSwgJGVuY29kaW5nID0gbnVsbCkKewokcyA9IChzdHJpbmcpICRzOwppZiAoJycgPT09ICRzKSB7CnJldHVybiAnJzsKfQoKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbnVsbDsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcykpIHsKJHMgPSBAaWNvbnYoJ1VURi04JywgJ1VURi04Ly9JR05PUkUnLCAkcyk7Cn0KfSBlbHNlIHsKJHMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHMpOwp9CgppZiAoXE1CX0NBU0VfVElUTEUgPT0gJG1vZGUpIHsKc3RhdGljICR0aXRsZVJlZ2V4cCA9IG51bGw7CmlmIChudWxsID09PSAkdGl0bGVSZWdleHApIHsKJHRpdGxlUmVnZXhwID0gc2VsZjo6Z2V0RGF0YSgndGl0bGVDYXNlUmVnZXhwJyk7Cn0KJHMgPSBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJHRpdGxlUmVnZXhwLCBbX19DTEFTU19fLCAndGl0bGVfY2FzZSddLCAkcyk7Cn0gZWxzZSB7CmlmIChcTUJfQ0FTRV9VUFBFUiA9PSAkbW9kZSkgewpzdGF0aWMgJHVwcGVyID0gbnVsbDsKaWYgKG51bGwgPT09ICR1cHBlcikgewokdXBwZXIgPSBzZWxmOjpnZXREYXRhKCd1cHBlckNhc2UnKTsKfQokbWFwID0gJHVwcGVyOwp9IGVsc2UgewppZiAoc2VsZjo6TUJfQ0FTRV9GT0xEID09PSAkbW9kZSkgewpzdGF0aWMgJGNhc2VGb2xkaW5nID0gbnVsbDsKaWYgKG51bGwgPT09ICRjYXNlRm9sZGluZykgewokY2FzZUZvbGRpbmcgPSBzZWxmOjpnZXREYXRhKCdjYXNlRm9sZGluZycpOwp9CiRzID0gc3RydHIoJHMsICRjYXNlRm9sZGluZyk7Cn0KCnN0YXRpYyAkbG93ZXIgPSBudWxsOwppZiAobnVsbCA9PT0gJGxvd2VyKSB7CiRsb3dlciA9IHNlbGY6OmdldERhdGEoJ2xvd2VyQ2FzZScpOwp9CiRtYXAgPSAkbG93ZXI7Cn0KCnN0YXRpYyAkdWxlbk1hc2sgPSBbIlx4QzAiID0+IDIsICJceEQwIiA9PiAyLCAiXHhFMCIgPT4gMywgIlx4RjAiID0+IDRdOwoKJGkgPSAwOwokbGVuID0gXHN0cmxlbigkcyk7Cgp3aGlsZSAoJGkgPCAkbGVuKSB7CiR1bGVuID0gJHNbJGldIDwgIlx4ODAiID8gMSA6ICR1bGVuTWFza1skc1skaV0gJiAiXHhGMCJdOwokdWNociA9IHN1YnN0cigkcywgJGksICR1bGVuKTsKJGkgKz0gJHVsZW47CgppZiAoaXNzZXQoJG1hcFskdWNocl0pKSB7CiR1Y2hyID0gJG1hcFskdWNocl07CiRubGVuID0gXHN0cmxlbigkdWNocik7CgppZiAoJG5sZW4gPT0gJHVsZW4pIHsKJG5sZW4gPSAkaTsKZG8gewokc1stLSRubGVuXSA9ICR1Y2hyWy0tJHVsZW5dOwp9IHdoaWxlICgkdWxlbik7Cn0gZWxzZSB7CiRzID0gc3Vic3RyX3JlcGxhY2UoJHMsICR1Y2hyLCAkaSAtICR1bGVuLCAkdWxlbik7CiRsZW4gKz0gJG5sZW4gLSAkdWxlbjsKJGkgKz0gJG5sZW4gLSAkdWxlbjsKfQp9Cn0KfQoKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJHM7Cn0KCnJldHVybiBpY29udignVVRGLTgnLCAkZW5jb2RpbmcuJy8vSUdOT1JFJywgJHMpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2ludGVybmFsX2VuY29kaW5nKCRlbmNvZGluZyA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewpyZXR1cm4gc2VsZjo6JGludGVybmFsRW5jb2Rpbmc7Cn0KCiRub3JtYWxpemVkRW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwoKaWYgKCdVVEYtOCcgPT09ICRub3JtYWxpemVkRW5jb2RpbmcgfHwgZmFsc2UgIT09IEBpY29udigkbm9ybWFsaXplZEVuY29kaW5nLCAkbm9ybWFsaXplZEVuY29kaW5nLCAnICcpKSB7CnNlbGY6OiRpbnRlcm5hbEVuY29kaW5nID0gJG5vcm1hbGl6ZWRFbmNvZGluZzsKCnJldHVybiB0cnVlOwp9CgppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9Cgp0aHJvdyBuZXcgXFZhbHVlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgIzEgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGFuZ3VhZ2UoJGxhbmcgPSBudWxsKQp7CmlmIChudWxsID09PSAkbGFuZykgewpyZXR1cm4gc2VsZjo6JGxhbmd1YWdlOwp9Cgpzd2l0Y2ggKCRub3JtYWxpemVkTGFuZyA9IHN0cnRvbG93ZXIoJGxhbmcpKSB7CmNhc2UgJ3VuaSc6CmNhc2UgJ25ldXRyYWwnOgpzZWxmOjokbGFuZ3VhZ2UgPSAkbm9ybWFsaXplZExhbmc7CgpyZXR1cm4gdHJ1ZTsKfQoKaWYgKDgwMDAwID4gXFBIUF9WRVJTSU9OX0lEKSB7CnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKHNwcmludGYoJ0FyZ3VtZW50ICMxICgkbGFuZ3VhZ2UpIG11c3QgYmUgYSB2YWxpZCBsYW5ndWFnZSwgIiVzIiBnaXZlbicsICRsYW5nKSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGlzdF9lbmNvZGluZ3MoKQp7CnJldHVybiBbJ1VURi04J107Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcygkZW5jb2RpbmcpCnsKc3dpdGNoIChzdHJ0b3VwcGVyKCRlbmNvZGluZykpIHsKY2FzZSAnVVRGOCc6CmNhc2UgJ1VURi04JzoKcmV0dXJuIFsndXRmOCddOwp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY2hlY2tfZW5jb2RpbmcoJHZhciA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewppZiAobnVsbCA9PT0gJHZhcikgewpyZXR1cm4gZmFsc2U7Cn0KJGVuY29kaW5nID0gc2VsZjo6JGludGVybmFsRW5jb2Rpbmc7Cn0KCmlmICghXGlzX2FycmF5KCR2YXIpKSB7CnJldHVybiBzZWxmOjptYl9kZXRlY3RfZW5jb2RpbmcoJHZhciwgWyRlbmNvZGluZ10pIHx8IGZhbHNlICE9PSBAaWNvbnYoJGVuY29kaW5nLCAkZW5jb2RpbmcsICR2YXIpOwp9Cgpmb3JlYWNoICgkdmFyIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICghc2VsZjo6bWJfY2hlY2tfZW5jb2RpbmcoJGtleSwgJGVuY29kaW5nKSkgewpyZXR1cm4gZmFsc2U7Cn0KaWYgKCFzZWxmOjptYl9jaGVja19lbmNvZGluZygkdmFsdWUsICRlbmNvZGluZykpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2RldGVjdF9lbmNvZGluZygkc3RyLCAkZW5jb2RpbmdMaXN0ID0gbnVsbCwgJHN0cmljdCA9IGZhbHNlKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmdMaXN0KSB7CiRlbmNvZGluZ0xpc3QgPSBzZWxmOjokZW5jb2RpbmdMaXN0Owp9IGVsc2UgewppZiAoIVxpc19hcnJheSgkZW5jb2RpbmdMaXN0KSkgewokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCd0cmltJywgZXhwbG9kZSgnLCcsICRlbmNvZGluZ0xpc3QpKTsKfQokZW5jb2RpbmdMaXN0ID0gYXJyYXlfbWFwKCdzdHJ0b3VwcGVyJywgJGVuY29kaW5nTGlzdCk7Cn0KCmZvcmVhY2ggKCRlbmNvZGluZ0xpc3QgYXMgJGVuYykgewpzd2l0Y2ggKCRlbmMpIHsKY2FzZSAnQVNDSUknOgppZiAoIXByZWdfbWF0Y2goJy9bXHg4MC1ceEZGXS8nLCAkc3RyKSkgewpyZXR1cm4gJGVuYzsKfQpicmVhazsKCmNhc2UgJ1VURjgnOgpjYXNlICdVVEYtOCc6CmlmIChwcmVnX21hdGNoKCcvL3UnLCAkc3RyKSkgewpyZXR1cm4gJ1VURi04JzsKfQpicmVhazsKCmRlZmF1bHQ6CmlmICgwID09PSBzdHJuY21wKCRlbmMsICdJU08tODg1OS0nLCA5KSkgewpyZXR1cm4gJGVuYzsKfQp9Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nTGlzdCA9IG51bGwpCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZ0xpc3QpIHsKcmV0dXJuIHNlbGY6OiRlbmNvZGluZ0xpc3Q7Cn0KCmlmICghXGlzX2FycmF5KCRlbmNvZGluZ0xpc3QpKSB7CiRlbmNvZGluZ0xpc3QgPSBhcnJheV9tYXAoJ3RyaW0nLCBleHBsb2RlKCcsJywgJGVuY29kaW5nTGlzdCkpOwp9CiRlbmNvZGluZ0xpc3QgPSBhcnJheV9tYXAoJ3N0cnRvdXBwZXInLCAkZW5jb2RpbmdMaXN0KTsKCmZvcmVhY2ggKCRlbmNvZGluZ0xpc3QgYXMgJGVuYykgewpzd2l0Y2ggKCRlbmMpIHsKZGVmYXVsdDoKaWYgKHN0cm5jbXAoJGVuYywgJ0lTTy04ODU5LScsIDkpKSB7CnJldHVybiBmYWxzZTsKfQoKY2FzZSAnQVNDSUknOgpjYXNlICdVVEY4JzoKY2FzZSAnVVRGLTgnOgp9Cn0KCnNlbGY6OiRlbmNvZGluZ0xpc3QgPSAkZW5jb2RpbmdMaXN0OwoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RybGVuKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CmlmICgnQ1A4NTAnID09PSAkZW5jb2RpbmcgfHwgJ0FTQ0lJJyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiBcc3RybGVuKCRzKTsKfQoKcmV0dXJuIEBpY29udl9zdHJsZW4oJHMsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOwp9CgokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKaWYgKCcnID09PSAkbmVlZGxlKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewp0cmlnZ2VyX2Vycm9yKF9fTUVUSE9EX18uJzogRW1wdHkgZGVsaW1pdGVyJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKcmV0dXJuIDA7Cn0KCnJldHVybiBpY29udl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewokZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpOwppZiAoJ0NQODUwJyA9PT0gJGVuY29kaW5nIHx8ICdBU0NJSScgPT09ICRlbmNvZGluZykgewpyZXR1cm4gc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQpOwp9CgppZiAoJG9mZnNldCAhPSAoaW50KSAkb2Zmc2V0KSB7CiRvZmZzZXQgPSAwOwp9IGVsc2VpZiAoJG9mZnNldCA9IChpbnQpICRvZmZzZXQpIHsKaWYgKCRvZmZzZXQgPCAwKSB7CmlmICgwID4gJG9mZnNldCArPSBzZWxmOjptYl9zdHJsZW4oJG5lZWRsZSkpIHsKJGhheXN0YWNrID0gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgMCwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQokb2Zmc2V0ID0gMDsKfSBlbHNlIHsKJGhheXN0YWNrID0gc2VsZjo6bWJfc3Vic3RyKCRoYXlzdGFjaywgJG9mZnNldCwgMjE0NzQ4MzY0NywgJGVuY29kaW5nKTsKfQp9CgokcG9zID0gJycgIT09ICRuZWVkbGUgfHwgODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQKPyBpY29udl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKQo6IHNlbGY6Om1iX3N0cmxlbigkaGF5c3RhY2ssICRlbmNvZGluZyk7CgpyZXR1cm4gZmFsc2UgIT09ICRwb3MgPyAkb2Zmc2V0ICsgJHBvcyA6IGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkc3BsaXRfbGVuZ3RoID0gMSwgJGVuY29kaW5nID0gbnVsbCkKewppZiAobnVsbCAhPT0gJHN0cmluZyAmJiAhXGlzX3NjYWxhcigkc3RyaW5nKSAmJiAhKFxpc19vYmplY3QoJHN0cmluZykgJiYgbWV0aG9kX2V4aXN0cygkc3RyaW5nLCAnX190b1N0cmluZycpKSkgewp0cmlnZ2VyX2Vycm9yKCdtYl9zdHJfc3BsaXQoKSBleHBlY3RzIHBhcmFtZXRlciAxIHRvIGJlIHN0cmluZywgJy5cZ2V0dHlwZSgkc3RyaW5nKS4nIGdpdmVuJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBudWxsOwp9CgppZiAoMSA+ICRzcGxpdF9sZW5ndGggPSAoaW50KSAkc3BsaXRfbGVuZ3RoKSB7CmlmICg4MDAwMCA+IFxQSFBfVkVSU0lPTl9JRCkgewp0cmlnZ2VyX2Vycm9yKCdUaGUgbGVuZ3RoIG9mIGVhY2ggc2VnbWVudCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvJywgXEVfVVNFUl9XQVJOSU5HKTsKCnJldHVybiBmYWxzZTsKfQoKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdBcmd1bWVudCAjMiAoJGxlbmd0aCkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpOwp9CgppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0KCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcgPSBzZWxmOjpnZXRFbmNvZGluZygkZW5jb2RpbmcpKSB7CiRyeCA9ICcvKCc7CndoaWxlICg2NTUzNSA8ICRzcGxpdF9sZW5ndGgpIHsKJHJ4IC49ICcuezY1NTM1fSc7CiRzcGxpdF9sZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICcueycuJHNwbGl0X2xlbmd0aC4nfSkvdXMnOwoKcmV0dXJuIHByZWdfc3BsaXQoJHJ4LCAkc3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSB8IFxQUkVHX1NQTElUX05PX0VNUFRZKTsKfQoKJHJlc3VsdCA9IFtdOwokbGVuZ3RoID0gbWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7Cgpmb3IgKCRpID0gMDsgJGkgPCAkbGVuZ3RoOyAkaSArPSAkc3BsaXRfbGVuZ3RoKSB7CiRyZXN1bHRbXSA9IG1iX3N1YnN0cigkc3RyaW5nLCAkaSwgJHNwbGl0X2xlbmd0aCwgJGVuY29kaW5nKTsKfQoKcmV0dXJuICRyZXN1bHQ7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RydG9sb3dlcigkcywgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc2VsZjo6bWJfY29udmVydF9jYXNlKCRzLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CnJldHVybiBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJHMsIFxNQl9DQVNFX1VQUEVSLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRjID0gbnVsbCkKewppZiAobnVsbCA9PT0gJGMpIHsKcmV0dXJuICdub25lJzsKfQppZiAoMCA9PT0gc3RyY2FzZWNtcCgkYywgJ25vbmUnKSkgewpyZXR1cm4gdHJ1ZTsKfQppZiAoODAwMDAgPiBcUEhQX1ZFUlNJT05fSUQpIHsKcmV0dXJuIGZhbHNlOwp9CmlmIChcaXNfaW50KCRjKSB8fCAnbG9uZycgPT09ICRjIHx8ICdlbnRpdHknID09PSAkYykgewpyZXR1cm4gZmFsc2U7Cn0KCnRocm93IG5ldyBcVmFsdWVFcnJvcignQXJndW1lbnQgIzEgKCRzdWJzdGl0dXRlX2NoYXJhY3RlcikgbXVzdCBiZSAibm9uZSIsICJsb25nIiwgImVudGl0eSIgb3IgYSB2YWxpZCBjb2RlcG9pbnQnKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdWJzdHIoJHMsICRzdGFydCwgJGxlbmd0aCA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIChzdHJpbmcpIHN1YnN0cigkcywgJHN0YXJ0LCBudWxsID09PSAkbGVuZ3RoID8gMjE0NzQ4MzY0NyA6ICRsZW5ndGgpOwp9CgppZiAoJHN0YXJ0IDwgMCkgewokc3RhcnQgPSBpY29udl9zdHJsZW4oJHMsICRlbmNvZGluZykgKyAkc3RhcnQ7CmlmICgkc3RhcnQgPCAwKSB7CiRzdGFydCA9IDA7Cn0KfQoKaWYgKG51bGwgPT09ICRsZW5ndGgpIHsKJGxlbmd0aCA9IDIxNDc0ODM2NDc7Cn0gZWxzZWlmICgkbGVuZ3RoIDwgMCkgewokbGVuZ3RoID0gaWNvbnZfc3RybGVuKCRzLCAkZW5jb2RpbmcpICsgJGxlbmd0aCAtICRzdGFydDsKaWYgKCRsZW5ndGggPCAwKSB7CnJldHVybiAnJzsKfQp9CgpyZXR1cm4gKHN0cmluZykgaWNvbnZfc3Vic3RyKCRzLCAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKQp7ClskaGF5c3RhY2ssICRuZWVkbGVdID0gc3RyX3JlcGxhY2Uoc2VsZjo6U0lNUExFX0NBU0VfRk9MRFswXSwgc2VsZjo6U0lNUExFX0NBU0VfRk9MRFsxXSwgWwpzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJGhheXN0YWNrLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKSwKc2VsZjo6bWJfY29udmVydF9jYXNlKCRuZWVkbGUsIFxNQl9DQVNFX0xPV0VSLCAkZW5jb2RpbmcpLApdKTsKCnJldHVybiBzZWxmOjptYl9zdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0LCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRwb3MgPSBzZWxmOjptYl9zdHJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgMCwgJGVuY29kaW5nKTsKCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycmNocigkaGF5c3RhY2ssICRuZWVkbGUsICRwYXJ0ID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpCnsKJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKTsKaWYgKCdDUDg1MCcgPT09ICRlbmNvZGluZyB8fCAnQVNDSUknID09PSAkZW5jb2RpbmcpIHsKJHBvcyA9IHN0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKfSBlbHNlIHsKJG5lZWRsZSA9IHNlbGY6Om1iX3N1YnN0cigkbmVlZGxlLCAwLCAxLCAkZW5jb2RpbmcpOwokcG9zID0gaWNvbnZfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRlbmNvZGluZyk7Cn0KCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RycmljaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRuZWVkbGUgPSBzZWxmOjptYl9zdWJzdHIoJG5lZWRsZSwgMCwgMSwgJGVuY29kaW5nKTsKJHBvcyA9IHNlbGY6Om1iX3N0cnJpcG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nKTsKCnJldHVybiBzZWxmOjpnZXRTdWJwYXJ0KCRwb3MsICRwYXJ0LCAkaGF5c3RhY2ssICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Rycmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkKewokaGF5c3RhY2sgPSBzZWxmOjptYl9jb252ZXJ0X2Nhc2UoJGhheXN0YWNrLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKJG5lZWRsZSA9IHNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkbmVlZGxlLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKCiRoYXlzdGFjayA9IHN0cl9yZXBsYWNlKHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMF0sIHNlbGY6OlNJTVBMRV9DQVNFX0ZPTERbMV0sICRoYXlzdGFjayk7CiRuZWVkbGUgPSBzdHJfcmVwbGFjZShzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzBdLCBzZWxmOjpTSU1QTEVfQ0FTRV9GT0xEWzFdLCAkbmVlZGxlKTsKCnJldHVybiBzZWxmOjptYl9zdHJycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9zdHJzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkcGFydCA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRwb3MgPSBzdHJwb3MoJGhheXN0YWNrLCAkbmVlZGxlKTsKaWYgKGZhbHNlID09PSAkcG9zKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHBhcnQpIHsKcmV0dXJuIHN1YnN0cigkaGF5c3RhY2ssIDAsICRwb3MpOwp9CgpyZXR1cm4gc3Vic3RyKCRoYXlzdGFjaywgJHBvcyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfZ2V0X2luZm8oJHR5cGUgPSAnYWxsJykKewokaW5mbyA9IFsKJ2ludGVybmFsX2VuY29kaW5nJyA9PiBzZWxmOjokaW50ZXJuYWxFbmNvZGluZywKJ2h0dHBfb3V0cHV0JyA9PiAncGFzcycsCidodHRwX291dHB1dF9jb252X21pbWV0eXBlcycgPT4gJ14odGV4dC98YXBwbGljYXRpb24veGh0bWxcK3htbCknLAonZnVuY19vdmVybG9hZCcgPT4gMCwKJ2Z1bmNfb3ZlcmxvYWRfbGlzdCcgPT4gJ25vIG92ZXJsb2FkJywKJ21haWxfY2hhcnNldCcgPT4gJ1VURi04JywKJ21haWxfaGVhZGVyX2VuY29kaW5nJyA9PiAnQkFTRTY0JywKJ21haWxfYm9keV9lbmNvZGluZycgPT4gJ0JBU0U2NCcsCidpbGxlZ2FsX2NoYXJzJyA9PiAwLAonZW5jb2RpbmdfdHJhbnNsYXRpb24nID0+ICdPZmYnLAonbGFuZ3VhZ2UnID0+IHNlbGY6OiRsYW5ndWFnZSwKJ2RldGVjdF9vcmRlcicgPT4gc2VsZjo6JGVuY29kaW5nTGlzdCwKJ3N1YnN0aXR1dGVfY2hhcmFjdGVyJyA9PiAnbm9uZScsCidzdHJpY3RfZGV0ZWN0aW9uJyA9PiAnT2ZmJywKXTsKCmlmICgnYWxsJyA9PT0gJHR5cGUpIHsKcmV0dXJuICRpbmZvOwp9CmlmIChpc3NldCgkaW5mb1skdHlwZV0pKSB7CnJldHVybiAkaW5mb1skdHlwZV07Cn0KCnJldHVybiBmYWxzZTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9odHRwX2lucHV0KCR0eXBlID0gJycpCnsKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2h0dHBfb3V0cHV0KCRlbmNvZGluZyA9IG51bGwpCnsKcmV0dXJuIG51bGwgIT09ICRlbmNvZGluZyA/ICdwYXNzJyA9PT0gJGVuY29kaW5nIDogJ3Bhc3MnOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3N0cndpZHRoKCRzLCAkZW5jb2RpbmcgPSBudWxsKQp7CiRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZyk7CgppZiAoJ1VURi04JyAhPT0gJGVuY29kaW5nKSB7CiRzID0gaWNvbnYoJGVuY29kaW5nLCAnVVRGLTgvL0lHTk9SRScsICRzKTsKfQoKJHMgPSBwcmVnX3JlcGxhY2UoJy9bXHh7MTEwMH0tXHh7MTE1Rn1ceHsyMzI5fVx4ezIzMkF9XHh7MkU4MH0tXHh7MzAzRX1ceHszMDQwfS1ceHtBNENGfVx4e0FDMDB9LVx4e0Q3QTN9XHh7RjkwMH0tXHh7RkFGRn1ceHtGRTEwfS1ceHtGRTE5fVx4e0ZFMzB9LVx4e0ZFNkZ9XHh7RkYwMH0tXHh7RkY2MH1ceHtGRkUwfS1ceHtGRkU2fVx4ezIwMDAwfS1ceHsyRkZGRH1ceHszMDAwMH0tXHh7M0ZGRkR9XS91JywgJycsICRzLCAtMSwgJHdpZGUpOwoKcmV0dXJuICgkd2lkZSA8PCAxKSArIGljb252X3N0cmxlbigkcywgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSwgJGVuY29kaW5nID0gbnVsbCkKewpyZXR1cm4gc3Vic3RyX2NvdW50KCRoYXlzdGFjaywgJG5lZWRsZSk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoJGNvbnRlbnRzLCAkc3RhdHVzKQp7CnJldHVybiAkY29udGVudHM7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfY2hyKCRjb2RlLCAkZW5jb2RpbmcgPSBudWxsKQp7CmlmICgweDgwID4gJGNvZGUgJT0gMHgyMDAwMDApIHsKJHMgPSBcY2hyKCRjb2RlKTsKfSBlbHNlaWYgKDB4ODAwID4gJGNvZGUpIHsKJHMgPSBcY2hyKDB4QzAgfCAkY29kZSA+PiA2KS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2VpZiAoMHgxMDAwMCA+ICRjb2RlKSB7CiRzID0gXGNocigweEUwIHwgJGNvZGUgPj4gMTIpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2UgewokcyA9IFxjaHIoMHhGMCB8ICRjb2RlID4+IDE4KS5cY2hyKDB4ODAgfCAkY29kZSA+PiAxMiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9CgppZiAoJ1VURi04JyAhPT0gJGVuY29kaW5nID0gc2VsZjo6Z2V0RW5jb2RpbmcoJGVuY29kaW5nKSkgewokcyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHMsICRlbmNvZGluZywgJ1VURi04Jyk7Cn0KCnJldHVybiAkczsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9vcmQoJHMsICRlbmNvZGluZyA9IG51bGwpCnsKaWYgKCdVVEYtOCcgIT09ICRlbmNvZGluZyA9IHNlbGY6OmdldEVuY29kaW5nKCRlbmNvZGluZykpIHsKJHMgPSBtYl9jb252ZXJ0X2VuY29kaW5nKCRzLCAnVVRGLTgnLCAkZW5jb2RpbmcpOwp9CgppZiAoMSA9PT0gXHN0cmxlbigkcykpIHsKcmV0dXJuIFxvcmQoJHMpOwp9CgokY29kZSA9ICgkcyA9IHVucGFjaygnQyonLCBzdWJzdHIoJHMsIDAsIDQpKSkgPyAkc1sxXSA6IDA7CmlmICgweEYwIDw9ICRjb2RlKSB7CnJldHVybiAoKCRjb2RlIC0gMHhGMCkgPDwgMTgpICsgKCgkc1syXSAtIDB4ODApIDw8IDEyKSArICgoJHNbM10gLSAweDgwKSA8PCA2KSArICRzWzRdIC0gMHg4MDsKfQppZiAoMHhFMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4RTApIDw8IDEyKSArICgoJHNbMl0gLSAweDgwKSA8PCA2KSArICRzWzNdIC0gMHg4MDsKfQppZiAoMHhDMCA8PSAkY29kZSkgewpyZXR1cm4gKCgkY29kZSAtIDB4QzApIDw8IDYpICsgJHNbMl0gLSAweDgwOwp9CgpyZXR1cm4gJGNvZGU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfc3RyX3BhZChzdHJpbmcgJHN0cmluZywgaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkX3N0cmluZyA9ICcgJywgaW50ICRwYWRfdHlwZSA9IFxTVFJfUEFEX1JJR0hULCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcKewppZiAoIVxpbl9hcnJheSgkcGFkX3R5cGUsIFtcU1RSX1BBRF9SSUdIVCwgXFNUUl9QQURfTEVGVCwgXFNUUl9QQURfQk9USF0sIHRydWUpKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcignbWJfc3RyX3BhZCgpOiBBcmd1bWVudCAjNCAoJHBhZF90eXBlKSBtdXN0IGJlIFNUUl9QQURfTEVGVCwgU1RSX1BBRF9SSUdIVCwgb3IgU1RSX1BBRF9CT1RIJyk7Cn0KCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gc2VsZjo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfSBlbHNlIHsKc2VsZjo6YXNzZXJ0RW5jb2RpbmcoJGVuY29kaW5nLCAnbWJfc3RyX3BhZCgpOiBBcmd1bWVudCAjNSAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nKTsKfQoKaWYgKHNlbGY6Om1iX3N0cmxlbigkcGFkX3N0cmluZywgJGVuY29kaW5nKSA8PSAwKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcignbWJfc3RyX3BhZCgpOiBBcmd1bWVudCAjMyAoJHBhZF9zdHJpbmcpIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7Cn0KCiRwYWRkaW5nUmVxdWlyZWQgPSAkbGVuZ3RoIC0gc2VsZjo6bWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7CgppZiAoJHBhZGRpbmdSZXF1aXJlZCA8IDEpIHsKcmV0dXJuICRzdHJpbmc7Cn0KCnN3aXRjaCAoJHBhZF90eXBlKSB7CmNhc2UgXFNUUl9QQURfTEVGVDoKcmV0dXJuIHNlbGY6Om1iX3N1YnN0cihzdHJfcmVwZWF0KCRwYWRfc3RyaW5nLCAkcGFkZGluZ1JlcXVpcmVkKSwgMCwgJHBhZGRpbmdSZXF1aXJlZCwgJGVuY29kaW5nKS4kc3RyaW5nOwpjYXNlIFxTVFJfUEFEX1JJR0hUOgpyZXR1cm4gJHN0cmluZy5zZWxmOjptYl9zdWJzdHIoc3RyX3JlcGVhdCgkcGFkX3N0cmluZywgJHBhZGRpbmdSZXF1aXJlZCksIDAsICRwYWRkaW5nUmVxdWlyZWQsICRlbmNvZGluZyk7CmRlZmF1bHQ6CiRsZWZ0UGFkZGluZ0xlbmd0aCA9IGZsb29yKCRwYWRkaW5nUmVxdWlyZWQgLyAyKTsKJHJpZ2h0UGFkZGluZ0xlbmd0aCA9ICRwYWRkaW5nUmVxdWlyZWQgLSAkbGVmdFBhZGRpbmdMZW5ndGg7CgpyZXR1cm4gc2VsZjo6bWJfc3Vic3RyKHN0cl9yZXBlYXQoJHBhZF9zdHJpbmcsICRsZWZ0UGFkZGluZ0xlbmd0aCksIDAsICRsZWZ0UGFkZGluZ0xlbmd0aCwgJGVuY29kaW5nKS4kc3RyaW5nLnNlbGY6Om1iX3N1YnN0cihzdHJfcmVwZWF0KCRwYWRfc3RyaW5nLCAkcmlnaHRQYWRkaW5nTGVuZ3RoKSwgMCwgJHJpZ2h0UGFkZGluZ0xlbmd0aCwgJGVuY29kaW5nKTsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZwp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gc2VsZjo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfSBlbHNlIHsKc2VsZjo6YXNzZXJ0RW5jb2RpbmcoJGVuY29kaW5nLCAnbWJfdWNmaXJzdCgpOiBBcmd1bWVudCAjMiAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nKTsKfQoKJGZpcnN0Q2hhciA9IG1iX3N1YnN0cigkc3RyaW5nLCAwLCAxLCAkZW5jb2RpbmcpOwokZmlyc3RDaGFyID0gbWJfY29udmVydF9jYXNlKCRmaXJzdENoYXIsIFxNQl9DQVNFX1RJVExFLCAkZW5jb2RpbmcpOwoKcmV0dXJuICRmaXJzdENoYXIubWJfc3Vic3RyKCRzdHJpbmcsIDEsIG51bGwsICRlbmNvZGluZyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbGNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBzZWxmOjptYl9pbnRlcm5hbF9lbmNvZGluZygpOwp9IGVsc2UgewpzZWxmOjphc3NlcnRFbmNvZGluZygkZW5jb2RpbmcsICdtYl9sY2ZpcnN0KCk6IEFyZ3VtZW50ICMyICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicpOwp9CgokZmlyc3RDaGFyID0gbWJfc3Vic3RyKCRzdHJpbmcsIDAsIDEsICRlbmNvZGluZyk7CiRmaXJzdENoYXIgPSBtYl9jb252ZXJ0X2Nhc2UoJGZpcnN0Q2hhciwgXE1CX0NBU0VfTE9XRVIsICRlbmNvZGluZyk7CgpyZXR1cm4gJGZpcnN0Q2hhci5tYl9zdWJzdHIoJHN0cmluZywgMSwgbnVsbCwgJGVuY29kaW5nKTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0U3VicGFydCgkcG9zLCAkcGFydCwgJGhheXN0YWNrLCAkZW5jb2RpbmcpCnsKaWYgKGZhbHNlID09PSAkcG9zKSB7CnJldHVybiBmYWxzZTsKfQppZiAoJHBhcnQpIHsKcmV0dXJuIHNlbGY6Om1iX3N1YnN0cigkaGF5c3RhY2ssIDAsICRwb3MsICRlbmNvZGluZyk7Cn0KCnJldHVybiBzZWxmOjptYl9zdWJzdHIoJGhheXN0YWNrLCAkcG9zLCBudWxsLCAkZW5jb2RpbmcpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBodG1sX2VuY29kaW5nX2NhbGxiYWNrKGFycmF5ICRtKQp7CiRpID0gMTsKJGVudGl0aWVzID0gJyc7CiRtID0gdW5wYWNrKCdDKicsIGh0bWxlbnRpdGllcygkbVswXSwgXEVOVF9DT01QQVQsICdVVEYtOCcpKTsKCndoaWxlIChpc3NldCgkbVskaV0pKSB7CmlmICgweDgwID4gJG1bJGldKSB7CiRlbnRpdGllcyAuPSBcY2hyKCRtWyRpKytdKTsKY29udGludWU7Cn0KaWYgKDB4RjAgPD0gJG1bJGldKSB7CiRjID0gKCgkbVskaSsrXSAtIDB4RjApIDw8IDE4KSArICgoJG1bJGkrK10gLSAweDgwKSA8PCAxMikgKyAoKCRtWyRpKytdIC0gMHg4MCkgPDwgNikgKyAkbVskaSsrXSAtIDB4ODA7Cn0gZWxzZWlmICgweEUwIDw9ICRtWyRpXSkgewokYyA9ICgoJG1bJGkrK10gLSAweEUwKSA8PCAxMikgKyAoKCRtWyRpKytdIC0gMHg4MCkgPDwgNikgKyAkbVskaSsrXSAtIDB4ODA7Cn0gZWxzZSB7CiRjID0gKCgkbVskaSsrXSAtIDB4QzApIDw8IDYpICsgJG1bJGkrK10gLSAweDgwOwp9CgokZW50aXRpZXMgLj0gJyYjJy4kYy4nOyc7Cn0KCnJldHVybiAkZW50aXRpZXM7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIHRpdGxlX2Nhc2UoYXJyYXkgJHMpCnsKcmV0dXJuIHNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkc1sxXSwgXE1CX0NBU0VfVVBQRVIsICdVVEYtOCcpLnNlbGY6Om1iX2NvbnZlcnRfY2FzZSgkc1syXSwgXE1CX0NBU0VfTE9XRVIsICdVVEYtOCcpOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXREYXRhKCRmaWxlKQp7CmlmIChmaWxlX2V4aXN0cygkZmlsZSA9IF9fRElSX18uJy9SZXNvdXJjZXMvdW5pZGF0YS8nLiRmaWxlLicucGhwJykpIHsKcmV0dXJuIHJlcXVpcmUgJGZpbGU7Cn0KCnJldHVybiBmYWxzZTsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0RW5jb2RpbmcoJGVuY29kaW5nKQp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuIHNlbGY6OiRpbnRlcm5hbEVuY29kaW5nOwp9CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAnVVRGLTgnOwp9CgokZW5jb2RpbmcgPSBzdHJ0b3VwcGVyKCRlbmNvZGluZyk7CgppZiAoJzhCSVQnID09PSAkZW5jb2RpbmcgfHwgJ0JJTkFSWScgPT09ICRlbmNvZGluZykgewpyZXR1cm4gJ0NQODUwJzsKfQoKaWYgKCdVVEY4JyA9PT0gJGVuY29kaW5nKSB7CnJldHVybiAnVVRGLTgnOwp9CgpyZXR1cm4gJGVuY29kaW5nOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3RyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6bWJfaW50ZXJuYWxfdHJpbSgne15bJXNdK3xbJTEkc10rJH1EdScsICRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcsIF9fRlVOQ1RJT05fXyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfbHRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6bWJfaW50ZXJuYWxfdHJpbSgne15bJXNdK31EdScsICRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcsIF9fRlVOQ1RJT05fXyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfcnRyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcKewpyZXR1cm4gc2VsZjo6bWJfaW50ZXJuYWxfdHJpbSgne1slc10rJH1EdScsICRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcsIF9fRlVOQ1RJT05fXyk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIG1iX2ludGVybmFsX3RyaW0oc3RyaW5nICRyZWdleCwgc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMsID9zdHJpbmcgJGVuY29kaW5nLCBzdHJpbmcgJGZ1bmN0aW9uKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBzZWxmOjptYl9pbnRlcm5hbF9lbmNvZGluZygpOwp9IGVsc2UgewpzZWxmOjphc3NlcnRFbmNvZGluZygkZW5jb2RpbmcsICRmdW5jdGlvbi4nKCk6IEFyZ3VtZW50ICMzICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicpOwp9CgppZiAoJycgPT09ICRjaGFyYWN0ZXJzKSB7CnJldHVybiBudWxsID09PSAkZW5jb2RpbmcgPyAkc3RyaW5nIDogc2VsZjo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkZW5jb2RpbmcpOwp9CgppZiAoJ1VURi04JyA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG51bGw7CmlmICghcHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykpIHsKJHN0cmluZyA9IEBpY29udignVVRGLTgnLCAnVVRGLTgvL0lHTk9SRScsICRzdHJpbmcpOwp9CmlmIChudWxsICE9PSAkY2hhcmFjdGVycyAmJiAhcHJlZ19tYXRjaCgnLy91JywgJGNoYXJhY3RlcnMpKSB7CiRjaGFyYWN0ZXJzID0gQGljb252KCdVVEYtOCcsICdVVEYtOC8vSUdOT1JFJywgJGNoYXJhY3RlcnMpOwp9Cn0gZWxzZSB7CiRzdHJpbmcgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJHN0cmluZyk7CgppZiAobnVsbCAhPT0gJGNoYXJhY3RlcnMpIHsKJGNoYXJhY3RlcnMgPSBpY29udigkZW5jb2RpbmcsICdVVEYtOC8vSUdOT1JFJywgJGNoYXJhY3RlcnMpOwp9Cn0KCmlmIChudWxsID09PSAkY2hhcmFjdGVycykgewokY2hhcmFjdGVycyA9ICJcXDAgXGZcblxyXHRcdlx1ezAwQTB9XHV7MTY4MH1cdXsyMDAwfVx1ezIwMDF9XHV7MjAwMn1cdXsyMDAzfVx1ezIwMDR9XHV7MjAwNX1cdXsyMDA2fVx1ezIwMDd9XHV7MjAwOH1cdXsyMDA5fVx1ezIwMEF9XHV7MjAyOH1cdXsyMDI5fVx1ezIwMkZ9XHV7MjA1Rn1cdXszMDAwfVx1ezAwODV9XHV7MTgwRX0iOwp9IGVsc2UgewokY2hhcmFjdGVycyA9IHByZWdfcXVvdGUoJGNoYXJhY3RlcnMpOwp9Cgokc3RyaW5nID0gcHJlZ19yZXBsYWNlKHNwcmludGYoJHJlZ2V4LCAkY2hhcmFjdGVycyksICcnLCAkc3RyaW5nKTsKCmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRzdHJpbmc7Cn0KCnJldHVybiBpY29udignVVRGLTgnLCAkZW5jb2RpbmcuJy8vSUdOT1JFJywgJHN0cmluZyk7Cn0KCnByaXZhdGUgc3RhdGljIGZ1bmN0aW9uIGFzc2VydEVuY29kaW5nKHN0cmluZyAkZW5jb2RpbmcsIHN0cmluZyAkZXJyb3JGb3JtYXQpOiB2b2lkCnsKdHJ5IHsKJHZhbGlkRW5jb2RpbmcgPSBAc2VsZjo6bWJfY2hlY2tfZW5jb2RpbmcoJycsICRlbmNvZGluZyk7Cn0gY2F0Y2ggKFxWYWx1ZUVycm9yICRlKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihzcHJpbnRmKCRlcnJvckZvcm1hdCwgJGVuY29kaW5nKSk7Cn0KCgppZiAoISR2YWxpZEVuY29kaW5nKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihzcHJpbnRmKCRlcnJvckZvcm1hdCwgJGVuY29kaW5nKSk7Cn0KfQp9Cjw/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+ICfOqc2CzpknLAopOwo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcTWJzdHJpbmcgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuIHJlcXVpcmUgX19ESVJfXy4nL2Jvb3RzdHJhcDgwLnBocCc7Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nLCAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9taW1laGVhZGVyKCRzdHJpbmcpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9taW1laGVhZGVyKCRzdHJpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9taW1laGVhZGVyJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX21pbWVoZWFkZXIoJHN0cmluZywgJGNoYXJzZXQgPSBudWxsLCAkdHJhbnNmZXJfZW5jb2RpbmcgPSBudWxsLCAkbmV3bGluZSA9ICJcclxuIiwgJGluZGVudCA9IDApIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9taW1laGVhZGVyKCRzdHJpbmcsICRjaGFyc2V0LCAkdHJhbnNmZXJfZW5jb2RpbmcsICRuZXdsaW5lLCAkaW5kZW50KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbnVtZXJpY2VudGl0eScpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2RlY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZW5jb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcgPSBudWxsLCAkaGV4ID0gZmFsc2UpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kZV9udW1lcmljZW50aXR5KCRzdHJpbmcsICRtYXAsICRlbmNvZGluZywgJGhleCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF9jYXNlJykpIHsKZnVuY3Rpb24gbWJfY29udmVydF9jYXNlKCRzdHJpbmcsICRtb2RlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X2Nhc2UoJHN0cmluZywgJG1vZGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaW50ZXJuYWxfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9pbnRlcm5hbF9lbmNvZGluZygkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xhbmd1YWdlJykpIHsKZnVuY3Rpb24gbWJfbGFuZ3VhZ2UoJGxhbmd1YWdlID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGFuZ3VhZ2UoJGxhbmd1YWdlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9saXN0X2VuY29kaW5ncycpKSB7CmZ1bmN0aW9uIG1iX2xpc3RfZW5jb2RpbmdzKCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGlzdF9lbmNvZGluZ3MoKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGluZ19hbGlhc2VzJykpIHsKZnVuY3Rpb24gbWJfZW5jb2RpbmdfYWxpYXNlcygkZW5jb2RpbmcpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2VuY29kaW5nX2FsaWFzZXMoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jaGVja19lbmNvZGluZycpKSB7CmZ1bmN0aW9uIG1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSA9IG51bGwsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NoZWNrX2VuY29kaW5nKCR2YWx1ZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZXRlY3RfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9kZXRlY3RfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5ncyA9IG51bGwsICRzdHJpY3QgPSBmYWxzZSkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZGV0ZWN0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZ3MsICRzdHJpY3QpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RldGVjdF9vcmRlcicpKSB7CmZ1bmN0aW9uIG1iX2RldGVjdF9vcmRlcigkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9wYXJzZV9zdHInKSkgewpmdW5jdGlvbiBtYl9wYXJzZV9zdHIoJHN0cmluZywgJiRyZXN1bHQgPSBbXSkgeyBwYXJzZV9zdHIoJHN0cmluZywgJHJlc3VsdCk7IHJldHVybiAoYm9vbCkgJHJlc3VsdDsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJsZW4nKSkgewpmdW5jdGlvbiBtYl9zdHJsZW4oJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RybGVuKCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycG9zJykpIHsKZnVuY3Rpb24gbWJfc3RycG9zKCRoYXlzdGFjaywgJG5lZWRsZSwgJG9mZnNldCA9IDAsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dlcicpKSB7CmZ1bmN0aW9uIG1iX3N0cnRvbG93ZXIoJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RydG9sb3dlcigkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvdXBwZXIoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3RlciA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3Rlcik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyKCRzdHJpbmcsICRzdGFydCwgJGxlbmd0aCA9IDIxNDc0ODM2NDcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0cigkc3RyaW5nLCAkc3RhcnQsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cmlwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RyaXN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cmlzdHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJpc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmNocicpKSB7CmZ1bmN0aW9uIG1iX3N0cnJjaHIoJGhheXN0YWNrLCAkbmVlZGxlLCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycmljaHInKSkgewpmdW5jdGlvbiBtYl9zdHJyaWNocigkaGF5c3RhY2ssICRuZWVkbGUsICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJpY2hyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Rycmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQgPSAwLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaXBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJwb3MoJGhheXN0YWNrLCAkbmVlZGxlLCAkb2Zmc2V0ID0gMCwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycnBvcygkaGF5c3RhY2ssICRuZWVkbGUsICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Ryc3RyJykpIHsKZnVuY3Rpb24gbWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUgPSBmYWxzZSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryc3RyKCRoYXlzdGFjaywgJG5lZWRsZSwgJGJlZm9yZV9uZWVkbGUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZ2V0X2luZm8nKSkgewpmdW5jdGlvbiBtYl9nZXRfaW5mbygkdHlwZSA9ICdhbGwnKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9nZXRfaW5mbygkdHlwZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9vdXRwdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX291dHB1dCgkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX291dHB1dCgkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cndpZHRoJykpIHsKZnVuY3Rpb24gbWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryd2lkdGgoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdHJfY291bnQnKSkgewpmdW5jdGlvbiBtYl9zdWJzdHJfY291bnQoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHJfY291bnQoJGhheXN0YWNrLCAkbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX291dHB1dF9oYW5kbGVyJykpIHsKZnVuY3Rpb24gbWJfb3V0cHV0X2hhbmRsZXIoJHN0cmluZywgJHN0YXR1cykgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfb3V0cHV0X2hhbmRsZXIoJHN0cmluZywgJHN0YXR1cyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfaHR0cF9pbnB1dCcpKSB7CmZ1bmN0aW9uIG1iX2h0dHBfaW5wdXQoJHR5cGUgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9odHRwX2lucHV0KCR0eXBlKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfY29udmVydF92YXJpYWJsZXMnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X3ZhcmlhYmxlcygkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nLCAmLi4uJHZhcnMpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2NvbnZlcnRfdmFyaWFibGVzKCR0b19lbmNvZGluZywgJGZyb21fZW5jb2RpbmcsIC4uLiR2YXJzKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfb3JkJykpIHsKZnVuY3Rpb24gbWJfb3JkKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX29yZCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NocicpKSB7CmZ1bmN0aW9uIG1iX2NocigkY29kZXBvaW50LCAkZW5jb2RpbmcgPSBudWxsKSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaHIoJGNvZGVwb2ludCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zY3J1YicpKSB7CmZ1bmN0aW9uIG1iX3NjcnViKCRzdHJpbmcsICRlbmNvZGluZyA9IG51bGwpIHsgJGVuY29kaW5nID0gbnVsbCA9PT0gJGVuY29kaW5nID8gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKSA6ICRlbmNvZGluZzsgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9zcGxpdCcpKSB7CmZ1bmN0aW9uIG1iX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoID0gMSwgJGVuY29kaW5nID0gbnVsbCkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyX3NwbGl0KCRzdHJpbmcsICRsZW5ndGgsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9wYWQnKSkgewpmdW5jdGlvbiBtYl9zdHJfcGFkKHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCwgc3RyaW5nICRwYWRfc3RyaW5nID0gJyAnLCBpbnQgJHBhZF90eXBlID0gU1RSX1BBRF9SSUdIVCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cl9wYWQoJHN0cmluZywgJGxlbmd0aCwgJHBhZF9zdHJpbmcsICRwYWRfdHlwZSwgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdWNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl91Y2ZpcnN0KCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl9sY2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfbGNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl90cmltJykpIHsKZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl90cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sdHJpbScpKSB7CmZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2x0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9ydHJpbScpKSB7CmZ1bmN0aW9uIG1iX3J0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3J0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewpyZXR1cm47Cn0KCmlmICghZGVmaW5lZCgnTUJfQ0FTRV9VUFBFUicpKSB7CmRlZmluZSgnTUJfQ0FTRV9VUFBFUicsIDApOwp9CmlmICghZGVmaW5lZCgnTUJfQ0FTRV9MT1dFUicpKSB7CmRlZmluZSgnTUJfQ0FTRV9MT1dFUicsIDEpOwp9CmlmICghZGVmaW5lZCgnTUJfQ0FTRV9USVRMRScpKSB7CmRlZmluZSgnTUJfQ0FTRV9USVRMRScsIDIpOwp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxNYnN0cmluZyBhcyBwOwoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NvbnZlcnRfZW5jb2RpbmcnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X2VuY29kaW5nKGFycmF5fHN0cmluZ3xudWxsICRzdHJpbmcsID9zdHJpbmcgJHRvX2VuY29kaW5nLCBhcnJheXxzdHJpbmd8bnVsbCAkZnJvbV9lbmNvZGluZyA9IG51bGwpOiBhcnJheXxzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9lbmNvZGluZygkc3RyaW5nID8/ICcnLCAoc3RyaW5nKSAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9kZWNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2RlY29kZV9taW1laGVhZGVyKD9zdHJpbmcgJHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZWNvZGVfbWltZWhlYWRlcigoc3RyaW5nKSAkc3RyaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9lbmNvZGVfbWltZWhlYWRlcicpKSB7CmZ1bmN0aW9uIG1iX2VuY29kZV9taW1laGVhZGVyKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcnNldCA9IG51bGwsID9zdHJpbmcgJHRyYW5zZmVyX2VuY29kaW5nID0gbnVsbCwgP3N0cmluZyAkbmV3bGluZSA9ICJcclxuIiwgP2ludCAkaW5kZW50ID0gMCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGVfbWltZWhlYWRlcigoc3RyaW5nKSAkc3RyaW5nLCAkY2hhcnNldCwgJHRyYW5zZmVyX2VuY29kaW5nLCAoc3RyaW5nKSAkbmV3bGluZSwgKGludCkgJGluZGVudCk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGVjb2RlX251bWVyaWNlbnRpdHknKSkgewpmdW5jdGlvbiBtYl9kZWNvZGVfbnVtZXJpY2VudGl0eSg/c3RyaW5nICRzdHJpbmcsIGFycmF5ICRtYXAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZWNvZGVfbnVtZXJpY2VudGl0eSgoc3RyaW5nKSAkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kZV9udW1lcmljZW50aXR5JykpIHsKZnVuY3Rpb24gbWJfZW5jb2RlX251bWVyaWNlbnRpdHkoP3N0cmluZyAkc3RyaW5nLCBhcnJheSAkbWFwLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwsID9ib29sICRoZXggPSBmYWxzZSk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9lbmNvZGVfbnVtZXJpY2VudGl0eSgoc3RyaW5nKSAkc3RyaW5nLCAkbWFwLCAkZW5jb2RpbmcsIChib29sKSAkaGV4KTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X2Nhc2UnKSkgewpmdW5jdGlvbiBtYl9jb252ZXJ0X2Nhc2UoP3N0cmluZyAkc3RyaW5nLCA/aW50ICRtb2RlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY29udmVydF9jYXNlKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRtb2RlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2ludGVybmFsX2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfaW50ZXJuYWxfZW5jb2RpbmcoP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nfGJvb2wgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfaW50ZXJuYWxfZW5jb2RpbmcoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sYW5ndWFnZScpKSB7CmZ1bmN0aW9uIG1iX2xhbmd1YWdlKD9zdHJpbmcgJGxhbmd1YWdlID0gbnVsbCk6IHN0cmluZ3xib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xhbmd1YWdlKCRsYW5ndWFnZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbGlzdF9lbmNvZGluZ3MnKSkgewpmdW5jdGlvbiBtYl9saXN0X2VuY29kaW5ncygpOiBhcnJheSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9saXN0X2VuY29kaW5ncygpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2VuY29kaW5nX2FsaWFzZXMnKSkgewpmdW5jdGlvbiBtYl9lbmNvZGluZ19hbGlhc2VzKD9zdHJpbmcgJGVuY29kaW5nKTogYXJyYXkgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfZW5jb2RpbmdfYWxpYXNlcygoc3RyaW5nKSAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2NoZWNrX2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfY2hlY2tfZW5jb2RpbmcoYXJyYXl8c3RyaW5nfG51bGwgJHZhbHVlID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogYm9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jaGVja19lbmNvZGluZygkdmFsdWUsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfZGV0ZWN0X2VuY29kaW5nJykpIHsKZnVuY3Rpb24gbWJfZGV0ZWN0X2VuY29kaW5nKD9zdHJpbmcgJHN0cmluZywgYXJyYXl8c3RyaW5nfG51bGwgJGVuY29kaW5ncyA9IG51bGwsID9ib29sICRzdHJpY3QgPSBmYWxzZSk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3RfZW5jb2RpbmcoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5ncywgKGJvb2wpICRzdHJpY3QpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2RldGVjdF9vcmRlcicpKSB7CmZ1bmN0aW9uIG1iX2RldGVjdF9vcmRlcihhcnJheXxzdHJpbmd8bnVsbCAkZW5jb2RpbmcgPSBudWxsKTogYXJyYXl8Ym9vbCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9kZXRlY3Rfb3JkZXIoJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9wYXJzZV9zdHInKSkgewpmdW5jdGlvbiBtYl9wYXJzZV9zdHIoP3N0cmluZyAkc3RyaW5nLCAmJHJlc3VsdCA9IFtdKTogYm9vbCB7IHBhcnNlX3N0cigoc3RyaW5nKSAkc3RyaW5nLCAkcmVzdWx0KTsgcmV0dXJuIChib29sKSAkcmVzdWx0OyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmxlbicpKSB7CmZ1bmN0aW9uIG1iX3N0cmxlbig/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJsZW4oKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RydG9sb3dlcicpKSB7CmZ1bmN0aW9uIG1iX3N0cnRvbG93ZXIoP3N0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RydG9sb3dlcigoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnRvdXBwZXInKSkgewpmdW5jdGlvbiBtYl9zdHJ0b3VwcGVyKD9zdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnRvdXBwZXIoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdWJzdGl0dXRlX2NoYXJhY3RlcicpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKHN0cmluZ3xpbnR8bnVsbCAkc3Vic3RpdHV0ZV9jaGFyYWN0ZXIgPSBudWxsKTogc3RyaW5nfGludHxib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N1YnN0aXR1dGVfY2hhcmFjdGVyKCRzdWJzdGl0dXRlX2NoYXJhY3Rlcik7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Vic3RyJykpIHsKZnVuY3Rpb24gbWJfc3Vic3RyKD9zdHJpbmcgJHN0cmluZywgP2ludCAkc3RhcnQsID9pbnQgJGxlbmd0aCA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdWJzdHIoKHN0cmluZykgJHN0cmluZywgKGludCkgJHN0YXJ0LCAkbGVuZ3RoLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cmlwb3MnKSkgewpmdW5jdGlvbiBtYl9zdHJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJpcG9zKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGludCkgJG9mZnNldCwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJpc3RyJykpIHsKZnVuY3Rpb24gbWJfc3RyaXN0cig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RyaXN0cigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJyY2hyJykpIHsKZnVuY3Rpb24gbWJfc3RycmNocig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3RycmNocigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJyaWNocicpKSB7CmZ1bmN0aW9uIG1iX3N0cnJpY2hyKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9ib29sICRiZWZvcmVfbmVlZGxlID0gZmFsc2UsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaWNocigoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChib29sKSAkYmVmb3JlX25lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJyaXBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJpcG9zKD9zdHJpbmcgJGhheXN0YWNrLCA/c3RyaW5nICRuZWVkbGUsID9pbnQgJG9mZnNldCA9IDAsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJyaXBvcygoc3RyaW5nKSAkaGF5c3RhY2ssIChzdHJpbmcpICRuZWVkbGUsIChpbnQpICRvZmZzZXQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3RycnBvcycpKSB7CmZ1bmN0aW9uIG1iX3N0cnJwb3MoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSwgP2ludCAkb2Zmc2V0ID0gMCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogaW50fGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cnJwb3MoKHN0cmluZykgJGhheXN0YWNrLCAoc3RyaW5nKSAkbmVlZGxlLCAoaW50KSAkb2Zmc2V0LCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cnN0cicpKSB7CmZ1bmN0aW9uIG1iX3N0cnN0cig/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/Ym9vbCAkYmVmb3JlX25lZWRsZSA9IGZhbHNlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Ryc3RyKChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgKGJvb2wpICRiZWZvcmVfbmVlZGxlLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2dldF9pbmZvJykpIHsKZnVuY3Rpb24gbWJfZ2V0X2luZm8oP3N0cmluZyAkdHlwZSA9ICdhbGwnKTogYXJyYXl8c3RyaW5nfGludHxmYWxzZXxudWxsIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2dldF9pbmZvKChzdHJpbmcpICR0eXBlKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9odHRwX291dHB1dCcpKSB7CmZ1bmN0aW9uIG1iX2h0dHBfb3V0cHV0KD9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZ3xib29sIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2h0dHBfb3V0cHV0KCRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc3Ryd2lkdGgnKSkgewpmdW5jdGlvbiBtYl9zdHJ3aWR0aCg/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludCB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJ3aWR0aCgoc3RyaW5nKSAkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N1YnN0cl9jb3VudCcpKSB7CmZ1bmN0aW9uIG1iX3N1YnN0cl9jb3VudCg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBpbnQgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfc3Vic3RyX2NvdW50KChzdHJpbmcpICRoYXlzdGFjaywgKHN0cmluZykgJG5lZWRsZSwgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9vdXRwdXRfaGFuZGxlcicpKSB7CmZ1bmN0aW9uIG1iX291dHB1dF9oYW5kbGVyKD9zdHJpbmcgJHN0cmluZywgP2ludCAkc3RhdHVzKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX291dHB1dF9oYW5kbGVyKChzdHJpbmcpICRzdHJpbmcsIChpbnQpICRzdGF0dXMpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2h0dHBfaW5wdXQnKSkgewpmdW5jdGlvbiBtYl9odHRwX2lucHV0KD9zdHJpbmcgJHR5cGUgPSBudWxsKTogYXJyYXl8c3RyaW5nfGZhbHNlIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2h0dHBfaW5wdXQoJHR5cGUpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jb252ZXJ0X3ZhcmlhYmxlcycpKSB7CmZ1bmN0aW9uIG1iX2NvbnZlcnRfdmFyaWFibGVzKD9zdHJpbmcgJHRvX2VuY29kaW5nLCBhcnJheXxzdHJpbmd8bnVsbCAkZnJvbV9lbmNvZGluZywgbWl4ZWQgJiR2YXIsIG1peGVkICYuLi4kdmFycyk6IHN0cmluZ3xmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9jb252ZXJ0X3ZhcmlhYmxlcygoc3RyaW5nKSAkdG9fZW5jb2RpbmcsICRmcm9tX2VuY29kaW5nID8/ICcnLCAkdmFyLCAuLi4kdmFycyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX29yZCcpKSB7CmZ1bmN0aW9uIG1iX29yZCg/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGludHxmYWxzZSB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9vcmQoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9jaHInKSkgewpmdW5jdGlvbiBtYl9jaHIoP2ludCAkY29kZXBvaW50LCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmd8ZmFsc2UgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfY2hyKChpbnQpICRjb2RlcG9pbnQsICRlbmNvZGluZyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfc2NydWInKSkgewpmdW5jdGlvbiBtYl9zY3J1Yig/c3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7ICRlbmNvZGluZyA/Pz0gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsgcmV0dXJuIG1iX2NvbnZlcnRfZW5jb2RpbmcoKHN0cmluZykgJHN0cmluZywgJGVuY29kaW5nLCAkZW5jb2RpbmcpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3N0cl9zcGxpdCcpKSB7CmZ1bmN0aW9uIG1iX3N0cl9zcGxpdCg/c3RyaW5nICRzdHJpbmcsID9pbnQgJGxlbmd0aCA9IDEsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IGFycmF5IHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX3N0cl9zcGxpdCgoc3RyaW5nKSAkc3RyaW5nLCAoaW50KSAkbGVuZ3RoLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9zdHJfcGFkJykpIHsKZnVuY3Rpb24gbWJfc3RyX3BhZChzdHJpbmcgJHN0cmluZywgaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkX3N0cmluZyA9ICcgJywgaW50ICRwYWRfdHlwZSA9IFNUUl9QQURfUklHSFQsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9zdHJfcGFkKCRzdHJpbmcsICRsZW5ndGgsICRwYWRfc3RyaW5nLCAkcGFkX3R5cGUsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX3VjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl91Y2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfdWNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sY2ZpcnN0JykpIHsKZnVuY3Rpb24gbWJfbGNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcTWJzdHJpbmc6Om1iX2xjZmlyc3QoJHN0cmluZywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdHJpbScpKSB7CmZ1bmN0aW9uIG1iX3RyaW0oc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGNoYXJhY3RlcnMgPSBudWxsLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxNYnN0cmluZzo6bWJfdHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfbHRyaW0nKSkgewpmdW5jdGlvbiBtYl9sdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9sdHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfcnRyaW0nKSkgewpmdW5jdGlvbiBtYl9ydHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXE1ic3RyaW5nOjptYl9ydHJpbSgkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nKTsgfQp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewpyZXR1cm47Cn0KCmlmICghZGVmaW5lZCgnTUJfQ0FTRV9VUFBFUicpKSB7CmRlZmluZSgnTUJfQ0FTRV9VUFBFUicsIDApOwp9CmlmICghZGVmaW5lZCgnTUJfQ0FTRV9MT1dFUicpKSB7CmRlZmluZSgnTUJfQ0FTRV9MT1dFUicsIDEpOwp9CmlmICghZGVmaW5lZCgnTUJfQ0FTRV9USVRMRScpKSB7CmRlZmluZSgnTUJfQ0FTRV9USVRMRScsIDIpOwp9CgpDb3B5cmlnaHQgKGMpIDIwMTgtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXFBocDczOwoKCgoKCgoKZmluYWwgY2xhc3MgUGhwNzMKewpwdWJsaWMgc3RhdGljICRzdGFydEF0ID0gMTUzMzQ2MjYwMzsKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBocnRpbWUoJGFzTnVtID0gZmFsc2UpCnsKJG5zID0gbWljcm90aW1lKGZhbHNlKTsKJHMgPSBzdWJzdHIoJG5zLCAxMSkgLSBzZWxmOjokc3RhcnRBdDsKJG5zID0gMUU5ICogKGZsb2F0KSAkbnM7CgppZiAoJGFzTnVtKSB7CiRucyArPSAkcyAqIDFFOTsKCnJldHVybiBcUEhQX0lOVF9TSVpFID09PSA0ID8gJG5zIDogKGludCkgJG5zOwp9CgpyZXR1cm4gWyRzLCAoaW50KSAkbnNdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA3MDMwMCkgewpjbGFzcyBKc29uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uCnsKfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA3MyBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA3MDMwMCkgewpyZXR1cm47Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdpc19jb3VudGFibGUnKSkgewpmdW5jdGlvbiBpc19jb3VudGFibGUoJHZhbHVlKSB7IHJldHVybiBpc19hcnJheSgkdmFsdWUpIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIENvdW50YWJsZSB8fCAkdmFsdWUgaW5zdGFuY2VvZiBSZXNvdXJjZUJ1bmRsZSB8fCAkdmFsdWUgaW5zdGFuY2VvZiBTaW1wbGVYbWxFbGVtZW50OyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2hydGltZScpKSB7CnJlcXVpcmVfb25jZSBfX0RJUl9fLicvUGhwNzMucGhwJzsKcFxQaHA3Mzo6JHN0YXJ0QXQgPSAoaW50KSBtaWNyb3RpbWUodHJ1ZSk7CmZ1bmN0aW9uIGhydGltZSgkYXNfbnVtYmVyID0gZmFsc2UpIHsgcmV0dXJuIHBcUGhwNzM6OmhydGltZSgkYXNfbnVtYmVyKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9rZXlfZmlyc3QnKSkgewpmdW5jdGlvbiBhcnJheV9rZXlfZmlyc3QoYXJyYXkgJGFycmF5KSB7IGZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgeyByZXR1cm4gJGtleTsgfSB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FycmF5X2tleV9sYXN0JykpIHsKZnVuY3Rpb24gYXJyYXlfa2V5X2xhc3QoYXJyYXkgJGFycmF5KSB7IHJldHVybiBrZXkoYXJyYXlfc2xpY2UoJGFycmF5LCAtMSwgMSwgdHJ1ZSkpOyB9Cn0KCkNvcHlyaWdodCAoYykgMjAyMC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODA7CgoKCgoKCgoKZmluYWwgY2xhc3MgUGhwODAKewpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZkaXYoZmxvYXQgJGRpdmlkZW5kLCBmbG9hdCAkZGl2aXNvcik6IGZsb2F0CnsKcmV0dXJuIEAoJGRpdmlkZW5kIC8gJGRpdmlzb3IpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldF9kZWJ1Z190eXBlKCR2YWx1ZSk6IHN0cmluZwp7CnN3aXRjaCAodHJ1ZSkgewpjYXNlIG51bGwgPT09ICR2YWx1ZTogcmV0dXJuICdudWxsJzsKY2FzZSBcaXNfYm9vbCgkdmFsdWUpOiByZXR1cm4gJ2Jvb2wnOwpjYXNlIFxpc19zdHJpbmcoJHZhbHVlKTogcmV0dXJuICdzdHJpbmcnOwpjYXNlIFxpc19hcnJheSgkdmFsdWUpOiByZXR1cm4gJ2FycmF5JzsKY2FzZSBcaXNfaW50KCR2YWx1ZSk6IHJldHVybiAnaW50JzsKY2FzZSBcaXNfZmxvYXQoJHZhbHVlKTogcmV0dXJuICdmbG9hdCc7CmNhc2UgXGlzX29iamVjdCgkdmFsdWUpOiBicmVhazsKY2FzZSAkdmFsdWUgaW5zdGFuY2VvZiBcX19QSFBfSW5jb21wbGV0ZV9DbGFzczogcmV0dXJuICdfX1BIUF9JbmNvbXBsZXRlX0NsYXNzJzsKZGVmYXVsdDoKaWYgKG51bGwgPT09ICR0eXBlID0gQGdldF9yZXNvdXJjZV90eXBlKCR2YWx1ZSkpIHsKcmV0dXJuICd1bmtub3duJzsKfQoKaWYgKCdVbmtub3duJyA9PT0gJHR5cGUpIHsKJHR5cGUgPSAnY2xvc2VkJzsKfQoKcmV0dXJuICJyZXNvdXJjZSAoJHR5cGUpIjsKfQoKJGNsYXNzID0gXGdldF9jbGFzcygkdmFsdWUpOwoKaWYgKGZhbHNlID09PSBzdHJwb3MoJGNsYXNzLCAnQCcpKSB7CnJldHVybiAkY2xhc3M7Cn0KCnJldHVybiAoZ2V0X3BhcmVudF9jbGFzcygkY2xhc3MpID86IGtleShjbGFzc19pbXBsZW1lbnRzKCRjbGFzcykpID86ICdjbGFzcycpLidAYW5vbnltb3VzJzsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBnZXRfcmVzb3VyY2VfaWQoJHJlcyk6IGludAp7CmlmICghXGlzX3Jlc291cmNlKCRyZXMpICYmIG51bGwgPT09IEBnZXRfcmVzb3VyY2VfdHlwZSgkcmVzKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAxIHBhc3NlZCB0byBnZXRfcmVzb3VyY2VfaWQoKSBtdXN0IGJlIG9mIHRoZSB0eXBlIHJlc291cmNlLCAlcyBnaXZlbicsIGdldF9kZWJ1Z190eXBlKCRyZXMpKSk7Cn0KCnJldHVybiAoaW50KSAkcmVzOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHByZWdfbGFzdF9lcnJvcl9tc2coKTogc3RyaW5nCnsKc3dpdGNoIChwcmVnX2xhc3RfZXJyb3IoKSkgewpjYXNlIFxQUkVHX0lOVEVSTkFMX0VSUk9SOgpyZXR1cm4gJ0ludGVybmFsIGVycm9yJzsKY2FzZSBcUFJFR19CQURfVVRGOF9FUlJPUjoKcmV0dXJuICdNYWxmb3JtZWQgVVRGLTggY2hhcmFjdGVycywgcG9zc2libHkgaW5jb3JyZWN0bHkgZW5jb2RlZCc7CmNhc2UgXFBSRUdfQkFEX1VURjhfT0ZGU0VUX0VSUk9SOgpyZXR1cm4gJ1RoZSBvZmZzZXQgZGlkIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSB2YWxpZCBVVEYtOCBjb2RlIHBvaW50JzsKY2FzZSBcUFJFR19CQUNLVFJBQ0tfTElNSVRfRVJST1I6CnJldHVybiAnQmFja3RyYWNrIGxpbWl0IGV4aGF1c3RlZCc7CmNhc2UgXFBSRUdfUkVDVVJTSU9OX0xJTUlUX0VSUk9SOgpyZXR1cm4gJ1JlY3Vyc2lvbiBsaW1pdCBleGhhdXN0ZWQnOwpjYXNlIFxQUkVHX0pJVF9TVEFDS0xJTUlUX0VSUk9SOgpyZXR1cm4gJ0pJVCBzdGFjayBsaW1pdCBleGhhdXN0ZWQnOwpjYXNlIFxQUkVHX05PX0VSUk9SOgpyZXR1cm4gJ05vIGVycm9yJzsKZGVmYXVsdDoKcmV0dXJuICdVbmtub3duIGVycm9yJzsKfQp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cl9jb250YWlucyhzdHJpbmcgJGhheXN0YWNrLCBzdHJpbmcgJG5lZWRsZSk6IGJvb2wKewpyZXR1cm4gJycgPT09ICRuZWVkbGUgfHwgZmFsc2UgIT09IHN0cnBvcygkaGF5c3RhY2ssICRuZWVkbGUpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cl9zdGFydHNfd2l0aChzdHJpbmcgJGhheXN0YWNrLCBzdHJpbmcgJG5lZWRsZSk6IGJvb2wKewpyZXR1cm4gMCA9PT0gc3RybmNtcCgkaGF5c3RhY2ssICRuZWVkbGUsIFxzdHJsZW4oJG5lZWRsZSkpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHN0cl9lbmRzX3dpdGgoc3RyaW5nICRoYXlzdGFjaywgc3RyaW5nICRuZWVkbGUpOiBib29sCnsKaWYgKCcnID09PSAkbmVlZGxlIHx8ICRuZWVkbGUgPT09ICRoYXlzdGFjaykgewpyZXR1cm4gdHJ1ZTsKfQoKaWYgKCcnID09PSAkaGF5c3RhY2spIHsKcmV0dXJuIGZhbHNlOwp9CgokbmVlZGxlTGVuZ3RoID0gXHN0cmxlbigkbmVlZGxlKTsKCnJldHVybiAkbmVlZGxlTGVuZ3RoIDw9IFxzdHJsZW4oJGhheXN0YWNrKSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkaGF5c3RhY2ssICRuZWVkbGUsIC0kbmVlZGxlTGVuZ3RoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MDsKCgoKCgoKY2xhc3MgUGhwVG9rZW4gaW1wbGVtZW50cyBcU3RyaW5nYWJsZQp7CgoKCnB1YmxpYyAkaWQ7CgoKCgpwdWJsaWMgJHRleHQ7CgoKCgpwdWJsaWMgJGxpbmU7CgoKCgpwdWJsaWMgJHBvczsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJGlkLCBzdHJpbmcgJHRleHQsIGludCAkbGluZSA9IC0xLCBpbnQgJHBvc2l0aW9uID0gLTEpCnsKJHRoaXMtPmlkID0gJGlkOwokdGhpcy0+dGV4dCA9ICR0ZXh0OwokdGhpcy0+bGluZSA9ICRsaW5lOwokdGhpcy0+cG9zID0gJHBvc2l0aW9uOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0VG9rZW5OYW1lKCk6ID9zdHJpbmcKewppZiAoJ1VOS05PV04nID09PSAkbmFtZSA9IHRva2VuX25hbWUoJHRoaXMtPmlkKSkgewokbmFtZSA9IFxzdHJsZW4oJHRoaXMtPnRleHQpID4gMSB8fCBcb3JkKCR0aGlzLT50ZXh0KSA8IDMyID8gbnVsbCA6ICR0aGlzLT50ZXh0Owp9CgpyZXR1cm4gJG5hbWU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpcygka2luZCk6IGJvb2wKewpmb3JlYWNoICgoYXJyYXkpICRraW5kIGFzICR2YWx1ZSkgewppZiAoXGluX2FycmF5KCR2YWx1ZSwgWyR0aGlzLT5pZCwgJHRoaXMtPnRleHRdLCB0cnVlKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc0lnbm9yYWJsZSgpOiBib29sCnsKcmV0dXJuIFxpbl9hcnJheSgkdGhpcy0+aWQsIFtcVF9XSElURVNQQUNFLCBcVF9DT01NRU5ULCBcVF9ET0NfQ09NTUVOVCwgXFRfT1BFTl9UQUddLCB0cnVlKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuIChzdHJpbmcpICR0aGlzLT50ZXh0Owp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHRva2VuaXplKHN0cmluZyAkY29kZSwgaW50ICRmbGFncyA9IDApOiBhcnJheQp7CiRsaW5lID0gMTsKJHBvc2l0aW9uID0gMDsKJHRva2VucyA9IHRva2VuX2dldF9hbGwoJGNvZGUsICRmbGFncyk7CmZvcmVhY2ggKCR0b2tlbnMgYXMgJGluZGV4ID0+ICR0b2tlbikgewppZiAoXGlzX3N0cmluZygkdG9rZW4pKSB7CiRpZCA9IFxvcmQoJHRva2VuKTsKJHRleHQgPSAkdG9rZW47Cn0gZWxzZSB7ClskaWQsICR0ZXh0LCAkbGluZV0gPSAkdG9rZW47Cn0KJHRva2Vuc1skaW5kZXhdID0gbmV3IHN0YXRpYygkaWQsICR0ZXh0LCAkbGluZSwgJHBvc2l0aW9uKTsKJHBvc2l0aW9uICs9IFxzdHJsZW4oJHRleHQpOwp9CgpyZXR1cm4gJHRva2VuczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgojW0F0dHJpYnV0ZShBdHRyaWJ1dGU6OlRBUkdFVF9DTEFTUyldCmZpbmFsIGNsYXNzIEF0dHJpYnV0ZQp7CnB1YmxpYyBjb25zdCBUQVJHRVRfQ0xBU1MgPSAxOwpwdWJsaWMgY29uc3QgVEFSR0VUX0ZVTkNUSU9OID0gMjsKcHVibGljIGNvbnN0IFRBUkdFVF9NRVRIT0QgPSA0OwpwdWJsaWMgY29uc3QgVEFSR0VUX1BST1BFUlRZID0gODsKcHVibGljIGNvbnN0IFRBUkdFVF9DTEFTU19DT05TVEFOVCA9IDE2OwpwdWJsaWMgY29uc3QgVEFSR0VUX1BBUkFNRVRFUiA9IDMyOwpwdWJsaWMgY29uc3QgVEFSR0VUX0FMTCA9IDYzOwpwdWJsaWMgY29uc3QgSVNfUkVQRUFUQUJMRSA9IDY0OwoKCnB1YmxpYyAkZmxhZ3M7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoaW50ICRmbGFncyA9IHNlbGY6OlRBUkdFVF9BTEwpCnsKJHRoaXMtPmZsYWdzID0gJGZsYWdzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiBleHRlbnNpb25fbG9hZGVkKCd0b2tlbml6ZXInKSkgewpjbGFzcyBQaHBUb2tlbiBleHRlbmRzIFN5bWZvbnlcUG9seWZpbGxcUGhwODBcUGhwVG9rZW4Kewp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCkgewppbnRlcmZhY2UgU3RyaW5nYWJsZQp7CgoKCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmNsYXNzIFVuaGFuZGxlZE1hdGNoRXJyb3IgZXh0ZW5kcyBFcnJvcgp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMDAwKSB7CmNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvcgp7Cn0KfQo8P3BocAoKCgoKCgoKCgoKdXNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODAgYXMgcDsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gODAwMDApIHsKcmV0dXJuOwp9CgppZiAoIWRlZmluZWQoJ0ZJTFRFUl9WQUxJREFURV9CT09MJykgJiYgZGVmaW5lZCgnRklMVEVSX1ZBTElEQVRFX0JPT0xFQU4nKSkgewpkZWZpbmUoJ0ZJTFRFUl9WQUxJREFURV9CT09MJywgXEZJTFRFUl9WQUxJREFURV9CT09MRUFOKTsKfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2ZkaXYnKSkgewpmdW5jdGlvbiBmZGl2KGZsb2F0ICRudW0xLCBmbG9hdCAkbnVtMik6IGZsb2F0IHsgcmV0dXJuIHBcUGhwODA6OmZkaXYoJG51bTEsICRudW0yKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdwcmVnX2xhc3RfZXJyb3JfbXNnJykpIHsKZnVuY3Rpb24gcHJlZ19sYXN0X2Vycm9yX21zZygpOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4MDo6cHJlZ19sYXN0X2Vycm9yX21zZygpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ3N0cl9jb250YWlucycpKSB7CmZ1bmN0aW9uIHN0cl9jb250YWlucyg/c3RyaW5nICRoYXlzdGFjaywgP3N0cmluZyAkbmVlZGxlKTogYm9vbCB7IHJldHVybiBwXFBocDgwOjpzdHJfY29udGFpbnMoJGhheXN0YWNrID8/ICcnLCAkbmVlZGxlID8/ICcnKTsgfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCdzdHJfc3RhcnRzX3dpdGgnKSkgewpmdW5jdGlvbiBzdHJfc3RhcnRzX3dpdGgoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSk6IGJvb2wgeyByZXR1cm4gcFxQaHA4MDo6c3RyX3N0YXJ0c193aXRoKCRoYXlzdGFjayA/PyAnJywgJG5lZWRsZSA/PyAnJyk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnc3RyX2VuZHNfd2l0aCcpKSB7CmZ1bmN0aW9uIHN0cl9lbmRzX3dpdGgoP3N0cmluZyAkaGF5c3RhY2ssID9zdHJpbmcgJG5lZWRsZSk6IGJvb2wgeyByZXR1cm4gcFxQaHA4MDo6c3RyX2VuZHNfd2l0aCgkaGF5c3RhY2sgPz8gJycsICRuZWVkbGUgPz8gJycpOyB9Cn0KaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2dldF9kZWJ1Z190eXBlJykpIHsKZnVuY3Rpb24gZ2V0X2RlYnVnX3R5cGUoJHZhbHVlKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODA6OmdldF9kZWJ1Z190eXBlKCR2YWx1ZSk7IH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygnZ2V0X3Jlc291cmNlX2lkJykpIHsKZnVuY3Rpb24gZ2V0X3Jlc291cmNlX2lkKCRyZXNvdXJjZSk6IGludCB7IHJldHVybiBwXFBocDgwOjpnZXRfcmVzb3VyY2VfaWQoJHJlc291cmNlKTsgfQp9CgpDb3B5cmlnaHQgKGMpIDIwMjEtcHJlc2VudCBGYWJpZW4gUG90ZW5jaWVyCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XFBvbHlmaWxsXFBocDgxOwoKCgoKCgpmaW5hbCBjbGFzcyBQaHA4MQp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfaXNfbGlzdChhcnJheSAkYXJyYXkpOiBib29sCnsKaWYgKFtdID09PSAkYXJyYXkgfHwgJGFycmF5ID09PSBhcnJheV92YWx1ZXMoJGFycmF5KSkgewpyZXR1cm4gdHJ1ZTsKfQoKJG5leHRLZXkgPSAtMTsKCmZvcmVhY2ggKCRhcnJheSBhcyAkayA9PiAkdikgewppZiAoJGsgIT09ICsrJG5leHRLZXkpIHsKcmV0dXJuIGZhbHNlOwp9Cn0KCnJldHVybiB0cnVlOwp9Cn0KPD9waHAKCgoKCgoKCgoKCmlmIChcUEhQX1ZFUlNJT05fSUQgPj0gNzA0MDAgJiYgZXh0ZW5zaW9uX2xvYWRlZCgnY3VybCcpKSB7CgoKCmNsYXNzIENVUkxTdHJpbmdGaWxlIGV4dGVuZHMgQ1VSTEZpbGUKewpwcml2YXRlICRkYXRhOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkZGF0YSwgc3RyaW5nICRwb3N0bmFtZSwgc3RyaW5nICRtaW1lID0gJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScpCnsKJHRoaXMtPmRhdGEgPSAkZGF0YTsKcGFyZW50OjpfX2NvbnN0cnVjdCgnZGF0YTovL2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbTtiYXNlNjQsJy5iYXNlNjRfZW5jb2RlKCRkYXRhKSwgJG1pbWUsICRwb3N0bmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NldChzdHJpbmcgJG5hbWUsICR2YWx1ZSk6IHZvaWQKewppZiAoJ2RhdGEnICE9PSAkbmFtZSkgewokdGhpcy0+JG5hbWUgPSAkdmFsdWU7CgpyZXR1cm47Cn0KCmlmIChpc19vYmplY3QoJHZhbHVlKSA/ICFtZXRob2RfZXhpc3RzKCR2YWx1ZSwgJ19fdG9TdHJpbmcnKSA6ICFpc19zY2FsYXIoJHZhbHVlKSkgewp0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgYXNzaWduICcuZ2V0dHlwZSgkdmFsdWUpLicgdG8gcHJvcGVydHkgQ1VSTFN0cmluZ0ZpbGU6OiRkYXRhIG9mIHR5cGUgc3RyaW5nJyk7Cn0KCiR0aGlzLT5uYW1lID0gJ2RhdGE6Ly9hcHBsaWNhdGlvbi9vY3RldC1zdHJlYW07YmFzZTY0LCcuYmFzZTY0X2VuY29kZSgkdmFsdWUpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19pc3NldChzdHJpbmcgJG5hbWUpOiBib29sCnsKcmV0dXJuIGlzc2V0KCR0aGlzLT4kbmFtZSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiAmX19nZXQoc3RyaW5nICRuYW1lKQp7CnJldHVybiAkdGhpcy0+JG5hbWU7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODAxMDApIHsKI1tBdHRyaWJ1dGUoQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EKV0KZmluYWwgY2xhc3MgUmV0dXJuVHlwZVdpbGxDaGFuZ2UKewpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4MSBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCkgewpyZXR1cm47Cn0KCmlmIChkZWZpbmVkKCdNWVNRTElfUkVGUkVTSF9TTEFWRScpICYmICFkZWZpbmVkKCdNWVNRTElfUkVGUkVTSF9SRVBMSUNBJykpIHsKZGVmaW5lKCdNWVNRTElfUkVGUkVTSF9SRVBMSUNBJywgNjQpOwp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfaXNfbGlzdCcpKSB7CmZ1bmN0aW9uIGFycmF5X2lzX2xpc3QoYXJyYXkgJGFycmF5KTogYm9vbCB7IHJldHVybiBwXFBocDgxOjphcnJheV9pc19saXN0KCRhcnJheSk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2VudW1fZXhpc3RzJykpIHsKZnVuY3Rpb24gZW51bV9leGlzdHMoc3RyaW5nICRlbnVtLCBib29sICRhdXRvbG9hZCA9IHRydWUpOiBib29sIHsgcmV0dXJuICRhdXRvbG9hZCAmJiBjbGFzc19leGlzdHMoJGVudW0pICYmIGZhbHNlOyB9Cn0KCkNvcHlyaWdodCAoYykgMjAyNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcUG9seWZpbGxcUGhwODQ7CgoKCgoKCgpmaW5hbCBjbGFzcyBQaHA4NAp7CnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gbWJfdWNmaXJzdChzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKaWYgKG51bGwgPT09ICRlbmNvZGluZykgewokZW5jb2RpbmcgPSBtYl9pbnRlcm5hbF9lbmNvZGluZygpOwp9Cgp0cnkgewokdmFsaWRFbmNvZGluZyA9IEBtYl9jaGVja19lbmNvZGluZygnJywgJGVuY29kaW5nKTsKfSBjYXRjaCAoXFZhbHVlRXJyb3IgJGUpIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKHNwcmludGYoJ21iX3VjZmlyc3QoKTogQXJndW1lbnQgIzIgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCgppZiAoISR2YWxpZEVuY29kaW5nKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihzcHJpbnRmKCdtYl91Y2ZpcnN0KCk6IEFyZ3VtZW50ICMyICgkZW5jb2RpbmcpIG11c3QgYmUgYSB2YWxpZCBlbmNvZGluZywgIiVzIiBnaXZlbicsICRlbmNvZGluZykpOwp9CgokZmlyc3RDaGFyID0gbWJfc3Vic3RyKCRzdHJpbmcsIDAsIDEsICRlbmNvZGluZyk7CiRmaXJzdENoYXIgPSBtYl9jb252ZXJ0X2Nhc2UoJGZpcnN0Q2hhciwgXE1CX0NBU0VfVElUTEUsICRlbmNvZGluZyk7CgpyZXR1cm4gJGZpcnN0Q2hhci5tYl9zdWJzdHIoJHN0cmluZywgMSwgbnVsbCwgJGVuY29kaW5nKTsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl9sY2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcKewppZiAobnVsbCA9PT0gJGVuY29kaW5nKSB7CiRlbmNvZGluZyA9IG1iX2ludGVybmFsX2VuY29kaW5nKCk7Cn0KCnRyeSB7CiR2YWxpZEVuY29kaW5nID0gQG1iX2NoZWNrX2VuY29kaW5nKCcnLCAkZW5jb2RpbmcpOwp9IGNhdGNoIChcVmFsdWVFcnJvciAkZSkgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3Ioc3ByaW50ZignbWJfbGNmaXJzdCgpOiBBcmd1bWVudCAjMiAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nLCAkZW5jb2RpbmcpKTsKfQoKCmlmICghJHZhbGlkRW5jb2RpbmcpIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKHNwcmludGYoJ21iX2xjZmlyc3QoKTogQXJndW1lbnQgIzIgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGVuY29kaW5nKSk7Cn0KCiRmaXJzdENoYXIgPSBtYl9zdWJzdHIoJHN0cmluZywgMCwgMSwgJGVuY29kaW5nKTsKJGZpcnN0Q2hhciA9IG1iX2NvbnZlcnRfY2FzZSgkZmlyc3RDaGFyLCBcTUJfQ0FTRV9MT1dFUiwgJGVuY29kaW5nKTsKCnJldHVybiAkZmlyc3RDaGFyLm1iX3N1YnN0cigkc3RyaW5nLCAxLCBudWxsLCAkZW5jb2RpbmcpOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2ZpbmQoYXJyYXkgJGFycmF5LCBjYWxsYWJsZSAkY2FsbGJhY2spCnsKZm9yZWFjaCAoJGFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICgkY2FsbGJhY2soJHZhbHVlLCAka2V5KSkgewpyZXR1cm4gJHZhbHVlOwp9Cn0KCnJldHVybiBudWxsOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2ZpbmRfa2V5KGFycmF5ICRhcnJheSwgY2FsbGFibGUgJGNhbGxiYWNrKQp7CmZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJGNhbGxiYWNrKCR2YWx1ZSwgJGtleSkpIHsKcmV0dXJuICRrZXk7Cn0KfQoKcmV0dXJuIG51bGw7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYXJyYXlfYW55KGFycmF5ICRhcnJheSwgY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbAp7CmZvcmVhY2ggKCRhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewppZiAoJGNhbGxiYWNrKCR2YWx1ZSwgJGtleSkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGFycmF5X2FsbChhcnJheSAkYXJyYXksIGNhbGxhYmxlICRjYWxsYmFjayk6IGJvb2wKewpmb3JlYWNoICgkYXJyYXkgYXMgJGtleSA9PiAkdmFsdWUpIHsKaWYgKCEkY2FsbGJhY2soJHZhbHVlLCAka2V5KSkgewpyZXR1cm4gZmFsc2U7Cn0KfQoKcmV0dXJuIHRydWU7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnBvdyhmbG9hdCAkbnVtLCBmbG9hdCAkZXhwb25lbnQpOiBmbG9hdAp7CnJldHVybiAkbnVtICoqICRleHBvbmVudDsKfQoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBtYl90cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3teWyVzXSt8WyUxJHNdKyR9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3teWyVzXSt9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9CgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIG1iX3J0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nCnsKcmV0dXJuIHNlbGY6Om1iX2ludGVybmFsX3RyaW0oJ3tbJXNdKyR9RHUnLCAkc3RyaW5nLCAkY2hhcmFjdGVycywgJGVuY29kaW5nLCBfX0ZVTkNUSU9OX18pOwp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBtYl9pbnRlcm5hbF90cmltKHN0cmluZyAkcmVnZXgsIHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzLCA/c3RyaW5nICRlbmNvZGluZywgc3RyaW5nICRmdW5jdGlvbik6IHN0cmluZwp7CmlmIChudWxsID09PSAkZW5jb2RpbmcpIHsKJGVuY29kaW5nID0gbWJfaW50ZXJuYWxfZW5jb2RpbmcoKTsKfQoKdHJ5IHsKJHZhbGlkRW5jb2RpbmcgPSBAbWJfY2hlY2tfZW5jb2RpbmcoJycsICRlbmNvZGluZyk7Cn0gY2F0Y2ggKFxWYWx1ZUVycm9yICRlKSB7CnRocm93IG5ldyBcVmFsdWVFcnJvcihzcHJpbnRmKCclcygpOiBBcmd1bWVudCAjMyAoJGVuY29kaW5nKSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcsICIlcyIgZ2l2ZW4nLCAkZnVuY3Rpb24sICRlbmNvZGluZykpOwp9CgoKaWYgKCEkdmFsaWRFbmNvZGluZykgewp0aHJvdyBuZXcgXFZhbHVlRXJyb3Ioc3ByaW50ZignJXMoKTogQXJndW1lbnQgIzMgKCRlbmNvZGluZykgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nLCAiJXMiIGdpdmVuJywgJGZ1bmN0aW9uLCAkZW5jb2RpbmcpKTsKfQoKaWYgKCcnID09PSAkY2hhcmFjdGVycykgewpyZXR1cm4gbnVsbCA9PT0gJGVuY29kaW5nID8gJHN0cmluZyA6IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJGVuY29kaW5nKTsKfQoKaWYgKCdVVEYtOCcgPT09ICRlbmNvZGluZyB8fCBcaW5fYXJyYXkoc3RydG9sb3dlcigkZW5jb2RpbmcpLCBbJ3V0Zi04JywgJ3V0ZjgnXSwgdHJ1ZSkpIHsKJGVuY29kaW5nID0gJ1VURi04JzsKfQoKJHN0cmluZyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJHN0cmluZywgJ1VURi04JywgJGVuY29kaW5nKTsKCmlmIChudWxsICE9PSAkY2hhcmFjdGVycykgewokY2hhcmFjdGVycyA9IG1iX2NvbnZlcnRfZW5jb2RpbmcoJGNoYXJhY3RlcnMsICdVVEYtOCcsICRlbmNvZGluZyk7Cn0KCmlmIChudWxsID09PSAkY2hhcmFjdGVycykgewokY2hhcmFjdGVycyA9ICJcXDAgXGZcblxyXHRcdlx1ezAwQTB9XHV7MTY4MH1cdXsyMDAwfVx1ezIwMDF9XHV7MjAwMn1cdXsyMDAzfVx1ezIwMDR9XHV7MjAwNX1cdXsyMDA2fVx1ezIwMDd9XHV7MjAwOH1cdXsyMDA5fVx1ezIwMEF9XHV7MjAyOH1cdXsyMDI5fVx1ezIwMkZ9XHV7MjA1Rn1cdXszMDAwfVx1ezAwODV9XHV7MTgwRX0iOwp9IGVsc2UgewokY2hhcmFjdGVycyA9IHByZWdfcXVvdGUoJGNoYXJhY3RlcnMpOwp9Cgokc3RyaW5nID0gcHJlZ19yZXBsYWNlKHNwcmludGYoJHJlZ2V4LCAkY2hhcmFjdGVycyksICcnLCAkc3RyaW5nKTsKCmlmICgnVVRGLTgnID09PSAkZW5jb2RpbmcpIHsKcmV0dXJuICRzdHJpbmc7Cn0KCnJldHVybiBtYl9jb252ZXJ0X2VuY29kaW5nKCRzdHJpbmcsICRlbmNvZGluZywgJ1VURi04Jyk7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ3JhcGhlbWVfc3RyX3NwbGl0KHN0cmluZyAkc3RyaW5nLCBpbnQgJGxlbmd0aCkKewppZiAoMCA+ICRsZW5ndGggfHwgMTA3Mzc0MTgyMyA8ICRsZW5ndGgpIHsKdGhyb3cgbmV3IFxWYWx1ZUVycm9yKCdncmFwaGVtZV9zdHJfc3BsaXQoKTogQXJndW1lbnQgIzIgKCRsZW5ndGgpIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMDczNzQxODIzLicpOwp9CgppZiAoJycgPT09ICRzdHJpbmcpIHsKcmV0dXJuIFtdOwp9CgokcmVnZXggPSAoKGZsb2F0KSBcUENSRV9WRVJTSU9OIDwgMTAgPyAoZmxvYXQpIFxQQ1JFX1ZFUlNJT04gPj0gOC4zMiA6IChmbG9hdCkgXFBDUkVfVkVSU0lPTiA+PSAxMC4zOSkKPyAnXFgnCjogJyg/OlxyXG58KD86WyAtflx4ezIwMEN9XHh7MjAwRH1dfFvhhqgt4Ye5XSt8W+GEgC3hhZ9dKig/OlvqsIDqsJzqsLjqsZTqsbDqsozqsqjqs4Tqs6Dqs7zqtJjqtLTqtZDqtazqtojqtqTqt4Dqt5zqt7jquJTquLDquYzquajquoTquqDqurzqu5jqu7TqvJDqvKzqvYjqvaTqvoDqvpzqvrjqv5Tqv7DrgIzrgKjrgYTrgaDrgbzrgpjrgrTrg5Drg6zrhIjrhKTrhYDrhZzrhbjrhpTrhrDrh4zrh6jriITriKDriLzriZjribTripDriqzri4jri6TrjIDrjJzrjLjrjZTrjbDrjozrjqjrj4Trj6Drj7zrkJjrkLTrkZDrkazrkojrkqTrk4Drk5zrk7jrlJTrlLDrlYzrlajrloTrlqDrlrzrl5jrl7TrmJDrmKzrmYjrmaTrmoDrmpzrmrjrm5Trm7DrnIzrnKjrnYTrnaDrnbzrnpjrnrTrn5Drn6zroIjroKTroYDroZzrobjropTrorDro4zro6jrpITrpKDrpLzrpZjrpbTrppDrpqzrp4jrp6TrqIDrqJzrqLjrqZTrqbDrqozrqqjrq4Trq6Drq7zrrJjrrLTrrZDrrazrrojrrqTrr4Drr5zrr7jrsJTrsLDrsYzrsajrsoTrsqDrsrzrs5jrs7TrtJDrtKzrtYjrtaTrtoDrtpzrtrjrt5Trt7DruIzruKjruYTruaDrubzrupjrurTru5Dru6zrvIjrvKTrvYDrvZzrvbjrvpTrvrDrv4zrv6jsgITsgKDsgLzsgZjsgbTsgpDsgqzsg4jsg6TshIDshJzshLjshZTshbDshozshqjsh4Tsh6Dsh7zsiJjsiLTsiZDsiazsiojsiqTsi4Dsi5zsi7jsjJTsjLDsjYzsjajsjoTsjqDsjrzsj5jsj7TskJDskKzskYjskaTskoDskpzskrjsk5Tsk7DslIzslKjslYTslaDslbzslpjslrTsl5Dsl6zsmIjsmKTsmYDsmZzsmbjsmpTsmrDsm4zsm6jsnITsnKDsnLzsnZjsnbTsnpDsnqzsn4jsn6TsoIDsoJzsoLjsoZTsobDsoozsoqjso4Tso6Dso7zspJjspLTspZDspazspojspqTsp4Dsp5zsp7jsqJTsqLDsqYzsqajsqoTsqqDsqrzsq5jsq7TsrJDsrKzsrYjsraTsroDsrpzsrrjsr5Tsr7DssIzssKjssYTssaDssbzsspjssrTss5Dss6zstIjstKTstYDstZzstbjstpTstrDst4zst6jsuITsuKDsuLzsuZjsubTsupDsuqzsu4jsu6TsvIDsvJzsvLjsvZTsvbDsvozsvqjsv4Tsv6Dsv7ztgJjtgLTtgZDtgaztgojtgqTtg4Dtg5ztg7jthJTthLDthYzthajthoTthqDthrzth5jth7TtiJDtiKztiYjtiaTtioDtipztirjti5Tti7DtjIztjKjtjYTtjaDtjbztjpjtjrTtj5Dtj6ztkIjtkKTtkYDtkZztkbjtkpTtkrDtk4ztk6jtlITtlKDtlLztlZjtlbTtlpDtlqztl4jtl6TtmIDtmJztmLjtmZTtmbDtmoztmqjtm4Ttm6Dtm7ztnJjtnLTtnZDtnaztnohdP1vhhaAt4YaiXSt8W+qwgC3tnqNdKVvhhqgt4Ye5XSp8W+GEgC3hhZ9dK3xbXlxwe0NjfVxwe0NmfVxwe1psfVxwe1pwfV0pW1xwe01ufVxwe01lfVx4ezA5QkV9XHh7MDlEN31ceHswQjNFfVx4ezBCNTd9XHh7MEJCRX1ceHswQkQ3fVx4ezBDQzJ9XHh7MENENX1ceHswQ0Q2fVx4ezBEM0V9XHh7MEQ1N31ceHswRENGfVx4ezBEREZ9XHh7MjAwQ31ceHsyMDBEfVx4ezFEMTY1fVx4ezFEMTZFfS1ceHsxRDE3Mn1dKnxbXHB7Q2N9XHB7Q2Z9XHB7Wmx9XHB7WnB9XSknOwoKaWYgKCFwcmVnX21hdGNoX2FsbCgnLycuICRyZWdleCAuJy91JywgJHN0cmluZywgJG1hdGNoZXMpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKDEgPT09ICRsZW5ndGgpIHsKcmV0dXJuICRtYXRjaGVzWzBdOwp9CgokY2h1bmtzID0gYXJyYXlfY2h1bmsoJG1hdGNoZXNbMF0sICRsZW5ndGgpOwpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJGNodW5rID0gaW1wbG9kZSgnJywgJGNodW5rKTsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gYmNkaXZtb2Qoc3RyaW5nICRudW0xLCBzdHJpbmcgJG51bTIsID9pbnQgJHNjYWxlID0gbnVsbCk6ID9hcnJheQp7CmlmIChudWxsID09PSAkcXVvdCA9IFxiY2RpdigkbnVtMSwgJG51bTIsIDApKSB7CnJldHVybiBudWxsOwp9CiRzY2FsZSA9ICRzY2FsZSA/PyAoXFBIUF9WRVJTSU9OX0lEID49IDcwMzAwID8gXGJjc2NhbGUoKSA6IChpbmlfZ2V0KCdiY21hdGguc2NhbGUnKSA/OiAwKSk7CgpyZXR1cm4gWyRxdW90LCBcYmNtb2QoJG51bTEsICRudW0yLCAkc2NhbGUpXTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgppZiAoXFBIUF9WRVJTSU9OX0lEIDwgODA0MDApIHsKI1tBdHRyaWJ1dGUoQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EIHwgQXR0cmlidXRlOjpUQVJHRVRfRlVOQ1RJT04gfCBBdHRyaWJ1dGU6OlRBUkdFVF9DTEFTU19DT05TVEFOVCldCmZpbmFsIGNsYXNzIERlcHJlY2F0ZWQKewpwdWJsaWMgcmVhZG9ubHkgP3N0cmluZyAkbWVzc2FnZTsKcHVibGljIHJlYWRvbmx5ID9zdHJpbmcgJHNpbmNlOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9zdHJpbmcgJG1lc3NhZ2UgPSBudWxsLCA/c3RyaW5nICRzaW5jZSA9IG51bGwpCnsKJHRoaXMtPm1lc3NhZ2UgPSAkbWVzc2FnZTsKJHRoaXMtPnNpbmNlID0gJHNpbmNlOwp9Cn0KfQo8P3BocAoKCgoKCgoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwNDAwKSB7CgoKCmZpbmFsIGNsYXNzIFJlZmxlY3Rpb25Db25zdGFudAp7CgoKCgoKcHVibGljICRuYW1lOwoKcHJpdmF0ZSAkdmFsdWU7CnByaXZhdGUgJGRlcHJlY2F0ZWQ7Cgpwcml2YXRlIHN0YXRpYyAkcGVyc2lzdGVudENvbnN0YW50cyA9IFtdOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkbmFtZSkKewppZiAoIWRlZmluZWQoJG5hbWUpIHx8IGZhbHNlICE9PSBzdHJwb3MoJG5hbWUsICc6OicpKSB7CnRocm93IG5ldyBSZWZsZWN0aW9uRXhjZXB0aW9uKCJDb25zdGFudCBcIiRuYW1lXCIgZG9lcyBub3QgZXhpc3QiKTsKfQoKJHRoaXMtPm5hbWUgPSBsdHJpbSgkbmFtZSwgJ1xcJyk7CiRkZXByZWNhdGVkID0gZmFsc2U7CiRlaCA9IHNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHR5cGUsICRtc2csICRmaWxlLCAkbGluZSkgdXNlICgkbmFtZSwgJiRkZXByZWNhdGVkLCAmJGVoKSB7CmlmIChcRV9ERVBSRUNBVEVEID09PSAkdHlwZSAmJiAiQ29uc3RhbnQgJG5hbWUgaXMgZGVwcmVjYXRlZCIgPT09ICRtc2cpIHsKcmV0dXJuICRkZXByZWNhdGVkID0gdHJ1ZTsKfQoKcmV0dXJuICRlaCAmJiAkZWgoJHR5cGUsICRtc2csICRmaWxlLCAkbGluZSk7Cn0pOwoKdHJ5IHsKJHRoaXMtPnZhbHVlID0gY29uc3RhbnQoJG5hbWUpOwokdGhpcy0+ZGVwcmVjYXRlZCA9ICRkZXByZWNhdGVkOwp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0TmFtZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRWYWx1ZSgpCnsKcmV0dXJuICR0aGlzLT52YWx1ZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldE5hbWVzcGFjZU5hbWUoKTogc3RyaW5nCnsKaWYgKGZhbHNlID09PSAkc2xhc2hQb3MgPSBzdHJycG9zKCR0aGlzLT5uYW1lLCAnXFwnKSkgewpyZXR1cm4gJyc7Cn0KCnJldHVybiBzdWJzdHIoJHRoaXMtPm5hbWUsIDAsICRzbGFzaFBvcyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTaG9ydE5hbWUoKTogc3RyaW5nCnsKaWYgKGZhbHNlID09PSAkc2xhc2hQb3MgPSBzdHJycG9zKCR0aGlzLT5uYW1lLCAnXFwnKSkgewpyZXR1cm4gJHRoaXMtPm5hbWU7Cn0KCnJldHVybiBzdWJzdHIoJHRoaXMtPm5hbWUsICRzbGFzaFBvcyArIDEpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaXNEZXByZWNhdGVkKCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmRlcHJlY2F0ZWQ7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CgoKCgppZiAoIXNlbGY6OiRwZXJzaXN0ZW50Q29uc3RhbnRzKSB7CiRwZXJzaXN0ZW50Q29uc3RhbnRzID0gZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpOwp1bnNldCgkcGVyc2lzdGVudENvbnN0YW50c1sndXNlciddKTsKZm9yZWFjaCAoJHBlcnNpc3RlbnRDb25zdGFudHMgYXMgJGNvbnN0YW50cykgewpzZWxmOjokcGVyc2lzdGVudENvbnN0YW50cyArPSAkY29uc3RhbnRzOwp9Cn0KJHBlcnNpc3RlbnQgPSBhcnJheV9rZXlfZXhpc3RzKCR0aGlzLT5uYW1lLCBzZWxmOjokcGVyc2lzdGVudENvbnN0YW50cyk7CgoKCiRyZXN1bHQgPSAnQ29uc3RhbnQgWyAnOwppZiAoJHBlcnNpc3RlbnQgfHwgJHRoaXMtPmRlcHJlY2F0ZWQpIHsKJHJlc3VsdCAuPSAnPCc7CmlmICgkcGVyc2lzdGVudCkgewokcmVzdWx0IC49ICdwZXJzaXN0ZW50JzsKaWYgKCR0aGlzLT5kZXByZWNhdGVkKSB7CiRyZXN1bHQgLj0gJywgJzsKfQp9CmlmICgkdGhpcy0+ZGVwcmVjYXRlZCkgewokcmVzdWx0IC49ICdkZXByZWNhdGVkJzsKfQokcmVzdWx0IC49ICc+ICc7Cn0KCmlmIChpc19vYmplY3QoJHRoaXMtPnZhbHVlKSkgewokcmVzdWx0IC49IFxQSFBfVkVSU0lPTl9JRCA+PSA4MDAwMCA/IGdldF9kZWJ1Z190eXBlKCR0aGlzLT52YWx1ZSkgOiBnZXR0eXBlKCR0aGlzLT52YWx1ZSk7Cn0gZWxzZWlmIChpc19ib29sKCR0aGlzLT52YWx1ZSkpIHsKJHJlc3VsdCAuPSAnYm9vbCc7Cn0gZWxzZWlmIChpc19pbnQoJHRoaXMtPnZhbHVlKSkgewokcmVzdWx0IC49ICdpbnQnOwp9IGVsc2VpZiAoaXNfZmxvYXQoJHRoaXMtPnZhbHVlKSkgewokcmVzdWx0IC49ICdmbG9hdCc7Cn0gZWxzZWlmIChudWxsID09PSAkdGhpcy0+dmFsdWUpIHsKJHJlc3VsdCAuPSAnbnVsbCc7Cn0gZWxzZSB7CiRyZXN1bHQgLj0gZ2V0dHlwZSgkdGhpcy0+dmFsdWUpOwp9CiRyZXN1bHQgLj0gJyAnOwokcmVzdWx0IC49ICR0aGlzLT5uYW1lOwokcmVzdWx0IC49ICcgXSB7ICc7CmlmIChpc19hcnJheSgkdGhpcy0+dmFsdWUpKSB7CiRyZXN1bHQgLj0gJ0FycmF5JzsKfSBlbHNlIHsKCgoKJHJlc3VsdCAuPSAoc3RyaW5nKSAkdGhpcy0+dmFsdWU7Cn0KJHJlc3VsdCAuPSAiIH1cbiI7CgpyZXR1cm4gJHJlc3VsdDsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewp0aHJvdyBuZXcgRXhjZXB0aW9uKCJTZXJpYWxpemF0aW9uIG9mICdSZWZsZWN0aW9uQ29uc3RhbnQnIGlzIG5vdCBhbGxvd2VkIik7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3dha2V1cCgpOiB2b2lkCnsKdGhyb3cgbmV3IEV4Y2VwdGlvbigiVW5zZXJpYWxpemF0aW9uIG9mICdSZWZsZWN0aW9uQ29uc3RhbnQnIGlzIG5vdCBhbGxvd2VkIik7Cn0KfQp9Cjw/cGhwCgoKCgoKCgoKCgp1c2UgU3ltZm9ueVxQb2x5ZmlsbFxQaHA4NCBhcyBwOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDQwMCkgewpyZXR1cm47Cn0KCmlmIChkZWZpbmVkKCdDVVJMX1ZFUlNJT05fSFRUUDMnKSB8fCBQSFBfVkVSU0lPTl9JRCA8IDgwMjAwICYmIGZ1bmN0aW9uX2V4aXN0cygnY3VybF92ZXJzaW9uJykgJiYgY3VybF92ZXJzaW9uKClbJ3ZlcnNpb24nXSA+PSAweDA3NDIwMCkgeyAKaWYgKCFkZWZpbmVkKCdDVVJMX0hUVFBfVkVSU0lPTl8zJykpIHsKZGVmaW5lKCdDVVJMX0hUVFBfVkVSU0lPTl8zJywgMzApOwp9CgppZiAoIWRlZmluZWQoJ0NVUkxfSFRUUF9WRVJTSU9OXzNPTkxZJykgJiYgZGVmaW5lZCgnQ1VSTE9QVF9TU0hfSE9TVF9QVUJMSUNfS0VZX1NIQTI1NicpKSB7IApkZWZpbmUoJ0NVUkxfSFRUUF9WRVJTSU9OXzNPTkxZJywgMzEpOwp9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9maW5kJykpIHsKZnVuY3Rpb24gYXJyYXlfZmluZChhcnJheSAkYXJyYXksIGNhbGxhYmxlICRjYWxsYmFjaykgeyByZXR1cm4gcFxQaHA4NDo6YXJyYXlfZmluZCgkYXJyYXksICRjYWxsYmFjayk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2FycmF5X2ZpbmRfa2V5JykpIHsKZnVuY3Rpb24gYXJyYXlfZmluZF9rZXkoYXJyYXkgJGFycmF5LCBjYWxsYWJsZSAkY2FsbGJhY2spIHsgcmV0dXJuIHBcUGhwODQ6OmFycmF5X2ZpbmRfa2V5KCRhcnJheSwgJGNhbGxiYWNrKTsgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygnYXJyYXlfYW55JykpIHsKZnVuY3Rpb24gYXJyYXlfYW55KGFycmF5ICRhcnJheSwgY2FsbGFibGUgJGNhbGxiYWNrKTogYm9vbCB7IHJldHVybiBwXFBocDg0OjphcnJheV9hbnkoJGFycmF5LCAkY2FsbGJhY2spOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdhcnJheV9hbGwnKSkgewpmdW5jdGlvbiBhcnJheV9hbGwoYXJyYXkgJGFycmF5LCBjYWxsYWJsZSAkY2FsbGJhY2spOiBib29sIHsgcmV0dXJuIHBcUGhwODQ6OmFycmF5X2FsbCgkYXJyYXksICRjYWxsYmFjayk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Zwb3cnKSkgewpmdW5jdGlvbiBmcG93KGZsb2F0ICRudW0sIGZsb2F0ICRleHBvbmVudCk6IGZsb2F0IHsgcmV0dXJuIHBcUGhwODQ6OmZwb3coJG51bSwgJGV4cG9uZW50KTsgfQp9CgppZiAoZXh0ZW5zaW9uX2xvYWRlZCgnbWJzdHJpbmcnKSkgewppZiAoIWZ1bmN0aW9uX2V4aXN0cygnbWJfdWNmaXJzdCcpKSB7CmZ1bmN0aW9uIG1iX3VjZmlyc3Qoc3RyaW5nICRzdHJpbmcsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjptYl91Y2ZpcnN0KCRzdHJpbmcsICRlbmNvZGluZyk7IH0KfQoKaWYgKCFmdW5jdGlvbl9leGlzdHMoJ21iX2xjZmlyc3QnKSkgewpmdW5jdGlvbiBtYl9sY2ZpcnN0KHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRlbmNvZGluZyA9IG51bGwpOiBzdHJpbmcgeyByZXR1cm4gcFxQaHA4NDo6bWJfbGNmaXJzdCgkc3RyaW5nLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl90cmltJykpIHsKZnVuY3Rpb24gbWJfdHJpbShzdHJpbmcgJHN0cmluZywgP3N0cmluZyAkY2hhcmFjdGVycyA9IG51bGwsID9zdHJpbmcgJGVuY29kaW5nID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBwXFBocDg0OjptYl90cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9sdHJpbScpKSB7CmZ1bmN0aW9uIG1iX2x0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODQ6Om1iX2x0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCdtYl9ydHJpbScpKSB7CmZ1bmN0aW9uIG1iX3J0cmltKHN0cmluZyAkc3RyaW5nLCA/c3RyaW5nICRjaGFyYWN0ZXJzID0gbnVsbCwgP3N0cmluZyAkZW5jb2RpbmcgPSBudWxsKTogc3RyaW5nIHsgcmV0dXJuIHBcUGhwODQ6Om1iX3J0cmltKCRzdHJpbmcsICRjaGFyYWN0ZXJzLCAkZW5jb2RpbmcpOyB9Cn0KfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2JjbWF0aCcpKSB7CmlmICghZnVuY3Rpb25fZXhpc3RzKCdiY2Rpdm1vZCcpKSB7CmZ1bmN0aW9uIGJjZGl2bW9kKHN0cmluZyAkbnVtMSwgc3RyaW5nICRudW0yLCA/aW50ICRzY2FsZSA9IG51bGwpOiA/YXJyYXkgeyByZXR1cm4gcFxQaHA4NDo6YmNkaXZtb2QoJG51bTEsICRudW0yLCAkc2NhbGUpOyB9Cn0KfQoKaWYgKFxQSFBfVkVSU0lPTl9JRCA+PSA4MDIwMCkgewpyZXR1cm4gcmVxdWlyZSBfX0RJUl9fLicvYm9vdHN0cmFwODIucGhwJzsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2ludGwnKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJfc3BsaXQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoID0gMSkgeyByZXR1cm4gcFxQaHA4NDo6Z3JhcGhlbWVfc3RyX3NwbGl0KCRzdHJpbmcsICRsZW5ndGgpOyB9Cn0KPD9waHAKCgoKCgoKCgoKCnVzZSBTeW1mb255XFBvbHlmaWxsXFBocDg0IGFzIHA7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwNDAwKSB7CnJldHVybjsKfQoKaWYgKGV4dGVuc2lvbl9sb2FkZWQoJ2ludGwnKSAmJiAhZnVuY3Rpb25fZXhpc3RzKCdncmFwaGVtZV9zdHJfc3BsaXQnKSkgewpmdW5jdGlvbiBncmFwaGVtZV9zdHJfc3BsaXQoc3RyaW5nICRzdHJpbmcsIGludCAkbGVuZ3RoID0gMSk6IGFycmF5fGZhbHNlIHsgcmV0dXJuIHBcUGhwODQ6OmdyYXBoZW1lX3N0cl9zcGxpdCgkc3RyaW5nLCAkbGVuZ3RoKTsgfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247CgoKCgoKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uOwoKCgoKCgpjbGFzcyBMb2dpY0V4Y2VwdGlvbiBleHRlbmRzIFxMb2dpY0V4Y2VwdGlvbiBpbXBsZW1lbnRzIEV4Y2VwdGlvbkludGVyZmFjZQp7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmNsYXNzIFByb2Nlc3NGYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKcHJpdmF0ZSAkcHJvY2VzczsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChQcm9jZXNzICRwcm9jZXNzKQp7CmlmICgkcHJvY2Vzcy0+aXNTdWNjZXNzZnVsKCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignRXhwZWN0ZWQgYSBmYWlsZWQgcHJvY2VzcywgYnV0IHRoZSBnaXZlbiBwcm9jZXNzIHdhcyBzdWNjZXNzZnVsLicpOwp9CgokZXJyb3IgPSBzcHJpbnRmKCdUaGUgY29tbWFuZCAiJXMiIGZhaWxlZC4nLiJcblxuRXhpdCBDb2RlOiAlcyglcylcblxuV29ya2luZyBkaXJlY3Rvcnk6ICVzIiwKJHByb2Nlc3MtPmdldENvbW1hbmRMaW5lKCksCiRwcm9jZXNzLT5nZXRFeGl0Q29kZSgpLAokcHJvY2Vzcy0+Z2V0RXhpdENvZGVUZXh0KCksCiRwcm9jZXNzLT5nZXRXb3JraW5nRGlyZWN0b3J5KCkKKTsKCmlmICghJHByb2Nlc3MtPmlzT3V0cHV0RGlzYWJsZWQoKSkgewokZXJyb3IgLj0gc3ByaW50ZigiXG5cbk91dHB1dDpcbj09PT09PT09PT09PT09PT1cbiVzXG5cbkVycm9yIE91dHB1dDpcbj09PT09PT09PT09PT09PT1cbiVzIiwKJHByb2Nlc3MtPmdldE91dHB1dCgpLAokcHJvY2Vzcy0+Z2V0RXJyb3JPdXRwdXQoKQopOwp9CgpwYXJlbnQ6Ol9fY29uc3RydWN0KCRlcnJvcik7CgokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvY2VzcygpCnsKcmV0dXJuICR0aGlzLT5wcm9jZXNzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFByb2Nlc3M7CgoKCgoKCmZpbmFsIGNsYXNzIFByb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24Kewpwcml2YXRlICRwcm9jZXNzOwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KFByb2Nlc3MgJHByb2Nlc3MpCnsKJHRoaXMtPnByb2Nlc3MgPSAkcHJvY2VzczsKCnBhcmVudDo6X19jb25zdHJ1Y3Qoc3ByaW50ZignVGhlIHByb2Nlc3MgaGFzIGJlZW4gc2lnbmFsZWQgd2l0aCBzaWduYWwgIiVzIi4nLCAkcHJvY2Vzcy0+Z2V0VGVybVNpZ25hbCgpKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm9jZXNzKCk6IFByb2Nlc3MKewpyZXR1cm4gJHRoaXMtPnByb2Nlc3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBnZXRTaWduYWwoKTogaW50CnsKcmV0dXJuICR0aGlzLT5nZXRQcm9jZXNzKCktPmdldFRlcm1TaWduYWwoKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb247Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgpjbGFzcyBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCnsKcHVibGljIGNvbnN0IFRZUEVfR0VORVJBTCA9IDE7CnB1YmxpYyBjb25zdCBUWVBFX0lETEUgPSAyOwoKcHJpdmF0ZSAkcHJvY2VzczsKcHJpdmF0ZSAkdGltZW91dFR5cGU7CgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoUHJvY2VzcyAkcHJvY2VzcywgaW50ICR0aW1lb3V0VHlwZSkKewokdGhpcy0+cHJvY2VzcyA9ICRwcm9jZXNzOwokdGhpcy0+dGltZW91dFR5cGUgPSAkdGltZW91dFR5cGU7CgpwYXJlbnQ6Ol9fY29uc3RydWN0KHNwcmludGYoCidUaGUgcHJvY2VzcyAiJXMiIGV4Y2VlZGVkIHRoZSB0aW1lb3V0IG9mICVzIHNlY29uZHMuJywKJHByb2Nlc3MtPmdldENvbW1hbmRMaW5lKCksCiR0aGlzLT5nZXRFeGNlZWRlZFRpbWVvdXQoKQopKTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldFByb2Nlc3MoKQp7CnJldHVybiAkdGhpcy0+cHJvY2VzczsKfQoKcHVibGljIGZ1bmN0aW9uIGlzR2VuZXJhbFRpbWVvdXQoKQp7CnJldHVybiBzZWxmOjpUWVBFX0dFTkVSQUwgPT09ICR0aGlzLT50aW1lb3V0VHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzSWRsZVRpbWVvdXQoKQp7CnJldHVybiBzZWxmOjpUWVBFX0lETEUgPT09ICR0aGlzLT50aW1lb3V0VHlwZTsKfQoKcHVibGljIGZ1bmN0aW9uIGdldEV4Y2VlZGVkVGltZW91dCgpCnsKc3dpdGNoICgkdGhpcy0+dGltZW91dFR5cGUpIHsKY2FzZSBzZWxmOjpUWVBFX0dFTkVSQUw6CnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+Z2V0VGltZW91dCgpOwoKY2FzZSBzZWxmOjpUWVBFX0lETEU6CnJldHVybiAkdGhpcy0+cHJvY2Vzcy0+Z2V0SWRsZVRpbWVvdXQoKTsKCmRlZmF1bHQ6CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oc3ByaW50ZignVW5rbm93biB0aW1lb3V0IHR5cGUgIiVkIi4nLCAkdGhpcy0+dGltZW91dFR5cGUpKTsKfQp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvbjsKCgoKCgoKY2xhc3MgUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFxSdW50aW1lRXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7CgoKCgoKCgpjbGFzcyBFeGVjdXRhYmxlRmluZGVyCnsKcHJpdmF0ZSBjb25zdCBDTURfQlVJTFRJTlMgPSBbCidhc3NvYycsICdicmVhaycsICdjYWxsJywgJ2NkJywgJ2NoZGlyJywgJ2NscycsICdjb2xvcicsICdjb3B5JywgJ2RhdGUnLAonZGVsJywgJ2RpcicsICdlY2hvJywgJ2VuZGxvY2FsJywgJ2VyYXNlJywgJ2V4aXQnLCAnZm9yJywgJ2Z0eXBlJywgJ2dvdG8nLAonaGVscCcsICdpZicsICdsYWJlbCcsICdtZCcsICdta2RpcicsICdta2xpbmsnLCAnbW92ZScsICdwYXRoJywgJ3BhdXNlJywKJ3BvcGQnLCAncHJvbXB0JywgJ3B1c2hkJywgJ3JkJywgJ3JlbScsICdyZW4nLCAncmVuYW1lJywgJ3JtZGlyJywgJ3NldCcsCidzZXRsb2NhbCcsICdzaGlmdCcsICdzdGFydCcsICd0aW1lJywgJ3RpdGxlJywgJ3R5cGUnLCAndmVyJywgJ3ZvbCcsCl07Cgpwcml2YXRlICRzdWZmaXhlcyA9IFtdOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFN1ZmZpeGVzKGFycmF5ICRzdWZmaXhlcykKewokdGhpcy0+c3VmZml4ZXMgPSAkc3VmZml4ZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRTdWZmaXgoc3RyaW5nICRzdWZmaXgpCnsKJHRoaXMtPnN1ZmZpeGVzW10gPSAkc3VmZml4Owp9CgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZChzdHJpbmcgJG5hbWUsID9zdHJpbmcgJGRlZmF1bHQgPSBudWxsLCBhcnJheSAkZXh0cmFEaXJzID0gW10pCnsKCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiBcaW5fYXJyYXkoc3RydG9sb3dlcigkbmFtZSksIHNlbGY6OkNNRF9CVUlMVElOUywgdHJ1ZSkpIHsKcmV0dXJuICRuYW1lOwp9CgokZGlycyA9IGFycmF5X21lcmdlKApleHBsb2RlKFxQQVRIX1NFUEFSQVRPUiwgZ2V0ZW52KCdQQVRIJykgPzogZ2V0ZW52KCdQYXRoJykpLAokZXh0cmFEaXJzCik7Cgokc3VmZml4ZXMgPSBbXTsKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CiRwYXRoRXh0ID0gZ2V0ZW52KCdQQVRIRVhUJyk7CiRzdWZmaXhlcyA9ICR0aGlzLT5zdWZmaXhlczsKJHN1ZmZpeGVzID0gYXJyYXlfbWVyZ2UoJHN1ZmZpeGVzLCAkcGF0aEV4dCA/IGV4cGxvZGUoXFBBVEhfU0VQQVJBVE9SLCAkcGF0aEV4dCkgOiBbJy5leGUnLCAnLmJhdCcsICcuY21kJywgJy5jb20nXSk7Cn0KJHN1ZmZpeGVzID0gJycgIT09IHBhdGhpbmZvKCRuYW1lLCBQQVRISU5GT19FWFRFTlNJT04pID8gYXJyYXlfbWVyZ2UoWycnXSwgJHN1ZmZpeGVzKSA6IGFycmF5X21lcmdlKCRzdWZmaXhlcywgWycnXSk7CmZvcmVhY2ggKCRzdWZmaXhlcyBhcyAkc3VmZml4KSB7CmZvcmVhY2ggKCRkaXJzIGFzICRkaXIpIHsKaWYgKCcnID09PSAkZGlyKSB7CiRkaXIgPSAnLic7Cn0KaWYgKEBpc19maWxlKCRmaWxlID0gJGRpci5cRElSRUNUT1JZX1NFUEFSQVRPUi4kbmFtZS4kc3VmZml4KSAmJiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgfHwgQGlzX2V4ZWN1dGFibGUoJGZpbGUpKSkgewpyZXR1cm4gJGZpbGU7Cn0KCmlmICghQGlzX2RpcigkZGlyKSAmJiBiYXNlbmFtZSgkZGlyKSA9PT0gJG5hbWUuJHN1ZmZpeCAmJiBAaXNfZXhlY3V0YWJsZSgkZGlyKSkgewpyZXR1cm4gJGRpcjsKfQp9Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiB8fCAhXGZ1bmN0aW9uX2V4aXN0cygnZXhlYycpIHx8IFxzdHJsZW4oJG5hbWUpICE9PSBzdHJjc3BuKCRuYW1lLCAnLycuXERJUkVDVE9SWV9TRVBBUkFUT1IpKSB7CnJldHVybiAkZGVmYXVsdDsKfQoKJGV4ZWNSZXN1bHQgPSBleGVjKCdjb21tYW5kIC12IC0tICcuZXNjYXBlc2hlbGxhcmcoJG5hbWUpKTsKCmlmICgoJGV4ZWN1dGFibGVQYXRoID0gc3Vic3RyKCRleGVjUmVzdWx0LCAwLCBzdHJwb3MoJGV4ZWNSZXN1bHQsIFxQSFBfRU9MKSA/OiBudWxsKSkgJiYgQGlzX2V4ZWN1dGFibGUoJGV4ZWN1dGFibGVQYXRoKSkgewpyZXR1cm4gJGV4ZWN1dGFibGVQYXRoOwp9CgpyZXR1cm4gJGRlZmF1bHQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgpjbGFzcyBJbnB1dFN0cmVhbSBpbXBsZW1lbnRzIFxJdGVyYXRvckFnZ3JlZ2F0ZQp7Cgpwcml2YXRlICRvbkVtcHR5ID0gbnVsbDsKcHJpdmF0ZSAkaW5wdXQgPSBbXTsKcHJpdmF0ZSAkb3BlbiA9IHRydWU7CgoKCgpwdWJsaWMgZnVuY3Rpb24gb25FbXB0eSg/Y2FsbGFibGUgJG9uRW1wdHkgPSBudWxsKQp7CiR0aGlzLT5vbkVtcHR5ID0gJG9uRW1wdHk7Cn0KCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3cml0ZSgkaW5wdXQpCnsKaWYgKG51bGwgPT09ICRpbnB1dCkgewpyZXR1cm47Cn0KaWYgKCR0aGlzLT5pc0Nsb3NlZCgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJyIlcyIgaXMgY2xvc2VkLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQokdGhpcy0+aW5wdXRbXSA9IFByb2Nlc3NVdGlsczo6dmFsaWRhdGVJbnB1dChfX01FVEhPRF9fLCAkaW5wdXQpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQp7CiR0aGlzLT5vcGVuID0gZmFsc2U7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpc0Nsb3NlZCgpCnsKcmV0dXJuICEkdGhpcy0+b3BlbjsKfQoKCgoKI1tcUmV0dXJuVHlwZVdpbGxDaGFuZ2VdCnB1YmxpYyBmdW5jdGlvbiBnZXRJdGVyYXRvcigpCnsKJHRoaXMtPm9wZW4gPSB0cnVlOwoKd2hpbGUgKCR0aGlzLT5vcGVuIHx8ICR0aGlzLT5pbnB1dCkgewppZiAoISR0aGlzLT5pbnB1dCkgewp5aWVsZCAnJzsKY29udGludWU7Cn0KJGN1cnJlbnQgPSBhcnJheV9zaGlmdCgkdGhpcy0+aW5wdXQpOwoKaWYgKCRjdXJyZW50IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CnlpZWxkIGZyb20gJGN1cnJlbnQ7Cn0gZWxzZSB7CnlpZWxkICRjdXJyZW50Owp9CmlmICghJHRoaXMtPmlucHV0ICYmICR0aGlzLT5vcGVuICYmIG51bGwgIT09ICRvbkVtcHR5ID0gJHRoaXMtPm9uRW1wdHkpIHsKJHRoaXMtPndyaXRlKCRvbkVtcHR5KCR0aGlzKSk7Cn0KfQp9Cn0KCkNvcHlyaWdodCAoYykgMjAwNC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7CgoKCgoKCgpjbGFzcyBQaHBFeGVjdXRhYmxlRmluZGVyCnsKcHJpdmF0ZSAkZXhlY3V0YWJsZUZpbmRlcjsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpCnsKJHRoaXMtPmV4ZWN1dGFibGVGaW5kZXIgPSBuZXcgRXhlY3V0YWJsZUZpbmRlcigpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBmaW5kKGJvb2wgJGluY2x1ZGVBcmdzID0gdHJ1ZSkKewppZiAoJHBocCA9IGdldGVudignUEhQX0JJTkFSWScpKSB7CmlmICghaXNfZXhlY3V0YWJsZSgkcGhwKSAmJiAhJHBocCA9ICR0aGlzLT5leGVjdXRhYmxlRmluZGVyLT5maW5kKCRwaHApKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKEBpc19kaXIoJHBocCkpIHsKcmV0dXJuIGZhbHNlOwp9CgpyZXR1cm4gJHBocDsKfQoKJGFyZ3MgPSAkdGhpcy0+ZmluZEFyZ3VtZW50cygpOwokYXJncyA9ICRpbmNsdWRlQXJncyAmJiAkYXJncyA/ICcgJy5pbXBsb2RlKCcgJywgJGFyZ3MpIDogJyc7CgoKaWYgKFxQSFBfQklOQVJZICYmIFxpbl9hcnJheShcUEhQX1NBUEksIFsnY2xpJywgJ2NsaS1zZXJ2ZXInLCAncGhwZGJnJ10sIHRydWUpKSB7CnJldHVybiBcUEhQX0JJTkFSWS4kYXJnczsKfQoKaWYgKCRwaHAgPSBnZXRlbnYoJ1BIUF9QQVRIJykpIHsKaWYgKCFAaXNfZXhlY3V0YWJsZSgkcGhwKSB8fCBAaXNfZGlyKCRwaHApKSB7CnJldHVybiBmYWxzZTsKfQoKcmV0dXJuICRwaHA7Cn0KCmlmICgkcGhwID0gZ2V0ZW52KCdQSFBfUEVBUl9QSFBfQklOJykpIHsKaWYgKEBpc19leGVjdXRhYmxlKCRwaHApICYmICFAaXNfZGlyKCRwaHApKSB7CnJldHVybiAkcGhwOwp9Cn0KCmlmIChAaXNfZXhlY3V0YWJsZSgkcGhwID0gXFBIUF9CSU5ESVIuKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gJ1xccGhwLmV4ZScgOiAnL3BocCcpKSAmJiAhQGlzX2RpcigkcGhwKSkgewpyZXR1cm4gJHBocDsKfQoKJGRpcnMgPSBbXFBIUF9CSU5ESVJdOwppZiAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKJGRpcnNbXSA9ICdDOlx4YW1wcFxwaHBcXCc7Cn0KCnJldHVybiAkdGhpcy0+ZXhlY3V0YWJsZUZpbmRlci0+ZmluZCgncGhwJywgZmFsc2UsICRkaXJzKTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZmluZEFyZ3VtZW50cygpCnsKJGFyZ3VtZW50cyA9IFtdOwppZiAoJ3BocGRiZycgPT09IFxQSFBfU0FQSSkgewokYXJndW1lbnRzW10gPSAnLXFycic7Cn0KCnJldHVybiAkYXJndW1lbnRzOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCmNsYXNzIFBocFByb2Nlc3MgZXh0ZW5kcyBQcm9jZXNzCnsKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHNjcmlwdCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP2FycmF5ICRlbnYgPSBudWxsLCBpbnQgJHRpbWVvdXQgPSA2MCwgP2FycmF5ICRwaHAgPSBudWxsKQp7CmlmIChudWxsID09PSAkcGhwKSB7CiRleGVjdXRhYmxlRmluZGVyID0gbmV3IFBocEV4ZWN1dGFibGVGaW5kZXIoKTsKJHBocCA9ICRleGVjdXRhYmxlRmluZGVyLT5maW5kKGZhbHNlKTsKJHBocCA9IGZhbHNlID09PSAkcGhwID8gbnVsbCA6IGFycmF5X21lcmdlKFskcGhwXSwgJGV4ZWN1dGFibGVGaW5kZXItPmZpbmRBcmd1bWVudHMoKSk7Cn0KaWYgKCdwaHBkYmcnID09PSBcUEhQX1NBUEkpIHsKJGZpbGUgPSB0ZW1wbmFtKHN5c19nZXRfdGVtcF9kaXIoKSwgJ2RiZycpOwpmaWxlX3B1dF9jb250ZW50cygkZmlsZSwgJHNjcmlwdCk7CnJlZ2lzdGVyX3NodXRkb3duX2Z1bmN0aW9uKCd1bmxpbmsnLCAkZmlsZSk7CiRwaHBbXSA9ICRmaWxlOwokc2NyaXB0ID0gbnVsbDsKfQoKcGFyZW50OjpfX2NvbnN0cnVjdCgkcGhwLCAkY3dkLCAkZW52LCAkc2NyaXB0LCAkdGltZW91dCk7Cn0KCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZnJvbVNoZWxsQ29tbWFuZGxpbmUoc3RyaW5nICRjb21tYW5kLCA/c3RyaW5nICRjd2QgPSBudWxsLCA/YXJyYXkgJGVudiA9IG51bGwsICRpbnB1dCA9IG51bGwsID9mbG9hdCAkdGltZW91dCA9IDYwKQp7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdUaGUgIiVzKCkiIG1ldGhvZCBjYW5ub3QgYmUgY2FsbGVkIHdoZW4gdXNpbmcgIiVzIi4nLCBfX01FVEhPRF9fLCBzZWxmOjpjbGFzcykpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnQoP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSkKewppZiAobnVsbCA9PT0gJHRoaXMtPmdldENvbW1hbmRMaW5lKCkpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBmaW5kIHRoZSBQSFAgZXhlY3V0YWJsZS4nKTsKfQoKcGFyZW50OjpzdGFydCgkY2FsbGJhY2ssICRlbnYpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQaXBlcyBpbXBsZW1lbnRzIFBpcGVzSW50ZXJmYWNlCnsKcHVibGljICRwaXBlcyA9IFtdOwoKcHJpdmF0ZSAkaW5wdXRCdWZmZXIgPSAnJzsKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJGJsb2NrZWQgPSB0cnVlOwpwcml2YXRlICRsYXN0RXJyb3I7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGlucHV0KQp7CmlmIChcaXNfcmVzb3VyY2UoJGlucHV0KSB8fCAkaW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKJHRoaXMtPmlucHV0ID0gJGlucHV0Owp9IGVsc2VpZiAoXGlzX3N0cmluZygkaW5wdXQpKSB7CiR0aGlzLT5pbnB1dEJ1ZmZlciA9ICRpbnB1dDsKfSBlbHNlIHsKJHRoaXMtPmlucHV0QnVmZmVyID0gKHN0cmluZykgJGlucHV0Owp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBjbG9zZSgpCnsKZm9yZWFjaCAoJHRoaXMtPnBpcGVzIGFzICRwaXBlKSB7CmlmIChcaXNfcmVzb3VyY2UoJHBpcGUpKSB7CmZjbG9zZSgkcGlwZSk7Cn0KfQokdGhpcy0+cGlwZXMgPSBbXTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGhhc1N5c3RlbUNhbGxCZWVuSW50ZXJydXB0ZWQoKTogYm9vbAp7CiRsYXN0RXJyb3IgPSAkdGhpcy0+bGFzdEVycm9yOwokdGhpcy0+bGFzdEVycm9yID0gbnVsbDsKCgpyZXR1cm4gbnVsbCAhPT0gJGxhc3RFcnJvciAmJiBmYWxzZSAhPT0gc3RyaXBvcygkbGFzdEVycm9yLCAnaW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwnKTsKfQoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIHVuYmxvY2soKQp7CmlmICghJHRoaXMtPmJsb2NrZWQpIHsKcmV0dXJuOwp9Cgpmb3JlYWNoICgkdGhpcy0+cGlwZXMgYXMgJHBpcGUpIHsKc3RyZWFtX3NldF9ibG9ja2luZygkcGlwZSwgMCk7Cn0KaWYgKFxpc19yZXNvdXJjZSgkdGhpcy0+aW5wdXQpKSB7CnN0cmVhbV9zZXRfYmxvY2tpbmcoJHRoaXMtPmlucHV0LCAwKTsKfQoKJHRoaXMtPmJsb2NrZWQgPSBmYWxzZTsKfQoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gd3JpdGUoKTogP2FycmF5CnsKaWYgKCFpc3NldCgkdGhpcy0+cGlwZXNbMF0pKSB7CnJldHVybiBudWxsOwp9CiRpbnB1dCA9ICR0aGlzLT5pbnB1dDsKCmlmICgkaW5wdXQgaW5zdGFuY2VvZiBcSXRlcmF0b3IpIHsKaWYgKCEkaW5wdXQtPnZhbGlkKCkpIHsKJGlucHV0ID0gbnVsbDsKfSBlbHNlaWYgKFxpc19yZXNvdXJjZSgkaW5wdXQgPSAkaW5wdXQtPmN1cnJlbnQoKSkpIHsKc3RyZWFtX3NldF9ibG9ja2luZygkaW5wdXQsIDApOwp9IGVsc2VpZiAoIWlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkpIHsKaWYgKCFcaXNfc3RyaW5nKCRpbnB1dCkpIHsKaWYgKCFcaXNfc2NhbGFyKCRpbnB1dCkpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCciJXMiIHlpZWxkZWQgYSB2YWx1ZSBvZiB0eXBlICIlcyIsIGJ1dCBvbmx5IHNjYWxhcnMgYW5kIHN0cmVhbSByZXNvdXJjZXMgYXJlIHN1cHBvcnRlZC4nLCBnZXRfZGVidWdfdHlwZSgkdGhpcy0+aW5wdXQpLCBnZXRfZGVidWdfdHlwZSgkaW5wdXQpKSk7Cn0KJGlucHV0ID0gKHN0cmluZykgJGlucHV0Owp9CiR0aGlzLT5pbnB1dEJ1ZmZlciA9ICRpbnB1dDsKJHRoaXMtPmlucHV0LT5uZXh0KCk7CiRpbnB1dCA9IG51bGw7Cn0gZWxzZSB7CiRpbnB1dCA9IG51bGw7Cn0KfQoKJHIgPSAkZSA9IFtdOwokdyA9IFskdGhpcy0+cGlwZXNbMF1dOwoKCmlmIChmYWxzZSA9PT0gQHN0cmVhbV9zZWxlY3QoJHIsICR3LCAkZSwgMCwgMCkpIHsKcmV0dXJuIG51bGw7Cn0KCmZvcmVhY2ggKCR3IGFzICRzdGRpbikgewppZiAoaXNzZXQoJHRoaXMtPmlucHV0QnVmZmVyWzBdKSkgewokd3JpdHRlbiA9IGZ3cml0ZSgkc3RkaW4sICR0aGlzLT5pbnB1dEJ1ZmZlcik7CiR0aGlzLT5pbnB1dEJ1ZmZlciA9IHN1YnN0cigkdGhpcy0+aW5wdXRCdWZmZXIsICR3cml0dGVuKTsKaWYgKGlzc2V0KCR0aGlzLT5pbnB1dEJ1ZmZlclswXSkpIHsKcmV0dXJuIFskdGhpcy0+cGlwZXNbMF1dOwp9Cn0KCmlmICgkaW5wdXQpIHsKd2hpbGUgKHRydWUpIHsKJGRhdGEgPSBmcmVhZCgkaW5wdXQsIHNlbGY6OkNIVU5LX1NJWkUpOwppZiAoIWlzc2V0KCRkYXRhWzBdKSkgewpicmVhazsKfQokd3JpdHRlbiA9IGZ3cml0ZSgkc3RkaW4sICRkYXRhKTsKJGRhdGEgPSBzdWJzdHIoJGRhdGEsICR3cml0dGVuKTsKaWYgKGlzc2V0KCRkYXRhWzBdKSkgewokdGhpcy0+aW5wdXRCdWZmZXIgPSAkZGF0YTsKCnJldHVybiBbJHRoaXMtPnBpcGVzWzBdXTsKfQp9CmlmIChmZW9mKCRpbnB1dCkpIHsKaWYgKCR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewokdGhpcy0+aW5wdXQtPm5leHQoKTsKfSBlbHNlIHsKJHRoaXMtPmlucHV0ID0gbnVsbDsKfQp9Cn0KfQoKCmlmICghaXNzZXQoJHRoaXMtPmlucHV0QnVmZmVyWzBdKSAmJiAhKCR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFxJdGVyYXRvciA/ICR0aGlzLT5pbnB1dC0+dmFsaWQoKSA6ICR0aGlzLT5pbnB1dCkpIHsKJHRoaXMtPmlucHV0ID0gbnVsbDsKZmNsb3NlKCR0aGlzLT5waXBlc1swXSk7CnVuc2V0KCR0aGlzLT5waXBlc1swXSk7Cn0gZWxzZWlmICghJHcpIHsKcmV0dXJuIFskdGhpcy0+cGlwZXNbMF1dOwp9CgpyZXR1cm4gbnVsbDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhbmRsZUVycm9yKGludCAkdHlwZSwgc3RyaW5nICRtc2cpCnsKJHRoaXMtPmxhc3RFcnJvciA9ICRtc2c7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUGlwZXM7CgoKCgoKCgoKaW50ZXJmYWNlIFBpcGVzSW50ZXJmYWNlCnsKcHVibGljIGNvbnN0IENIVU5LX1NJWkUgPSAxNjM4NDsKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXREZXNjcmlwdG9ycygpOiBhcnJheTsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzKCk6IGFycmF5OwoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZEFuZFdyaXRlKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSA9IGZhbHNlKTogYXJyYXk7CgoKCgpwdWJsaWMgZnVuY3Rpb24gYXJlT3BlbigpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGhhdmVSZWFkU3VwcG9ydCgpOiBib29sOwoKCgoKcHVibGljIGZ1bmN0aW9uIGNsb3NlKCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcUHJvY2VzczsKCgoKCgoKCgpjbGFzcyBVbml4UGlwZXMgZXh0ZW5kcyBBYnN0cmFjdFBpcGVzCnsKcHJpdmF0ZSAkdHR5TW9kZTsKcHJpdmF0ZSAkcHR5TW9kZTsKcHJpdmF0ZSAkaGF2ZVJlYWRTdXBwb3J0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KD9ib29sICR0dHlNb2RlLCBib29sICRwdHlNb2RlLCAkaW5wdXQsIGJvb2wgJGhhdmVSZWFkU3VwcG9ydCkKewokdGhpcy0+dHR5TW9kZSA9ICR0dHlNb2RlOwokdGhpcy0+cHR5TW9kZSA9ICRwdHlNb2RlOwokdGhpcy0+aGF2ZVJlYWRTdXBwb3J0ID0gJGhhdmVSZWFkU3VwcG9ydDsKCnBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CiR0aGlzLT5jbG9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXkKewppZiAoISR0aGlzLT5oYXZlUmVhZFN1cHBvcnQpIHsKJG51bGxzdHJlYW0gPSBmb3BlbignL2Rldi9udWxsJywgJ2MnKTsKCnJldHVybiBbClsncGlwZScsICdyJ10sCiRudWxsc3RyZWFtLAokbnVsbHN0cmVhbSwKXTsKfQoKaWYgKCR0aGlzLT50dHlNb2RlKSB7CnJldHVybiBbClsnZmlsZScsICcvZGV2L3R0eScsICdyJ10sClsnZmlsZScsICcvZGV2L3R0eScsICd3J10sClsnZmlsZScsICcvZGV2L3R0eScsICd3J10sCl07Cn0KCmlmICgkdGhpcy0+cHR5TW9kZSAmJiBQcm9jZXNzOjppc1B0eVN1cHBvcnRlZCgpKSB7CnJldHVybiBbClsncHR5J10sClsncHR5J10sClsncHR5J10sCl07Cn0KCnJldHVybiBbClsncGlwZScsICdyJ10sClsncGlwZScsICd3J10sIApbJ3BpcGUnLCAndyddLCAKXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEZpbGVzKCk6IGFycmF5CnsKcmV0dXJuIFtdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZEFuZFdyaXRlKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSA9IGZhbHNlKTogYXJyYXkKewokdGhpcy0+dW5ibG9jaygpOwokdyA9ICR0aGlzLT53cml0ZSgpOwoKJHJlYWQgPSAkZSA9IFtdOwokciA9ICR0aGlzLT5waXBlczsKdW5zZXQoJHJbMF0pOwoKCnNldF9lcnJvcl9oYW5kbGVyKFskdGhpcywgJ2hhbmRsZUVycm9yJ10pOwppZiAoKCRyIHx8ICR3KSAmJiBmYWxzZSA9PT0gc3RyZWFtX3NlbGVjdCgkciwgJHcsICRlLCAwLCAkYmxvY2tpbmcgPyBQcm9jZXNzOjpUSU1FT1VUX1BSRUNJU0lPTiAqIDFFNiA6IDApKSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwoKCmlmICghJHRoaXMtPmhhc1N5c3RlbUNhbGxCZWVuSW50ZXJydXB0ZWQoKSkgewokdGhpcy0+cGlwZXMgPSBbXTsKfQoKcmV0dXJuICRyZWFkOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwoKZm9yZWFjaCAoJHIgYXMgJHBpcGUpIHsKCgokcmVhZFskdHlwZSA9IGFycmF5X3NlYXJjaCgkcGlwZSwgJHRoaXMtPnBpcGVzLCB0cnVlKV0gPSAnJzsKCmRvIHsKJGRhdGEgPSBAZnJlYWQoJHBpcGUsIHNlbGY6OkNIVU5LX1NJWkUpOwokcmVhZFskdHlwZV0gLj0gJGRhdGE7Cn0gd2hpbGUgKGlzc2V0KCRkYXRhWzBdKSAmJiAoJGNsb3NlIHx8IGlzc2V0KCRkYXRhW3NlbGY6OkNIVU5LX1NJWkUgLSAxXSkpKTsKCmlmICghaXNzZXQoJHJlYWRbJHR5cGVdWzBdKSkgewp1bnNldCgkcmVhZFskdHlwZV0pOwp9CgppZiAoJGNsb3NlICYmIGZlb2YoJHBpcGUpKSB7CmZjbG9zZSgkcGlwZSk7CnVuc2V0KCR0aGlzLT5waXBlc1skdHlwZV0pOwp9Cn0KCnJldHVybiAkcmVhZDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGhhdmVSZWFkU3VwcG9ydCgpOiBib29sCnsKcmV0dXJuICR0aGlzLT5oYXZlUmVhZFN1cHBvcnQ7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBhcmVPcGVuKCk6IGJvb2wKewpyZXR1cm4gKGJvb2wpICR0aGlzLT5waXBlczsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlczsKCnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQcm9jZXNzOwoKCgoKCgoKCgoKCmNsYXNzIFdpbmRvd3NQaXBlcyBleHRlbmRzIEFic3RyYWN0UGlwZXMKewpwcml2YXRlICRmaWxlcyA9IFtdOwpwcml2YXRlICRmaWxlSGFuZGxlcyA9IFtdOwpwcml2YXRlICRsb2NrSGFuZGxlcyA9IFtdOwpwcml2YXRlICRyZWFkQnl0ZXMgPSBbClByb2Nlc3M6OlNURE9VVCA9PiAwLApQcm9jZXNzOjpTVERFUlIgPT4gMCwKXTsKcHJpdmF0ZSAkaGF2ZVJlYWRTdXBwb3J0OwoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRpbnB1dCwgYm9vbCAkaGF2ZVJlYWRTdXBwb3J0KQp7CiR0aGlzLT5oYXZlUmVhZFN1cHBvcnQgPSAkaGF2ZVJlYWRTdXBwb3J0OwoKaWYgKCR0aGlzLT5oYXZlUmVhZFN1cHBvcnQpIHsKCgoKCiRwaXBlcyA9IFsKUHJvY2Vzczo6U1RET1VUID0+IFByb2Nlc3M6Ok9VVCwKUHJvY2Vzczo6U1RERVJSID0+IFByb2Nlc3M6OkVSUiwKXTsKJHRtcERpciA9IHN5c19nZXRfdGVtcF9kaXIoKTsKJGxhc3RFcnJvciA9ICd1bmtub3duIHJlYXNvbic7CnNldF9lcnJvcl9oYW5kbGVyKGZ1bmN0aW9uICgkdHlwZSwgJG1zZykgdXNlICgmJGxhc3RFcnJvcikgeyAkbGFzdEVycm9yID0gJG1zZzsgfSk7CmZvciAoJGkgPSAwOzsgKyskaSkgewpmb3JlYWNoICgkcGlwZXMgYXMgJHBpcGUgPT4gJG5hbWUpIHsKJGZpbGUgPSBzcHJpbnRmKCclc1xcc2ZfcHJvY18lMDJYLiVzJywgJHRtcERpciwgJGksICRuYW1lKTsKCmlmICghJGggPSBmb3BlbigkZmlsZS4nLmxvY2snLCAndycpKSB7CmlmIChmaWxlX2V4aXN0cygkZmlsZS4nLmxvY2snKSkgewpjb250aW51ZSAyOwp9CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignQSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkIHRvIHdyaXRlIHRoZSBwcm9jZXNzIG91dHB1dDogJy4kbGFzdEVycm9yKTsKfQppZiAoIWZsb2NrKCRoLCBcTE9DS19FWCB8IFxMT0NLX05CKSkgewpjb250aW51ZSAyOwp9CmlmIChpc3NldCgkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdKSkgewpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdKTsKfQokdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdID0gJGg7CgppZiAoISgkaCA9IGZvcGVuKCRmaWxlLCAndycpKSB8fCAhZmNsb3NlKCRoKSB8fCAhJGggPSBmb3BlbigkZmlsZSwgJ3InKSkgewpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHBpcGVdKTsKdW5zZXQoJHRoaXMtPmxvY2tIYW5kbGVzWyRwaXBlXSk7CmNvbnRpbnVlIDI7Cn0KJHRoaXMtPmZpbGVIYW5kbGVzWyRwaXBlXSA9ICRoOwokdGhpcy0+ZmlsZXNbJHBpcGVdID0gJGZpbGU7Cn0KYnJlYWs7Cn0KcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnBhcmVudDo6X19jb25zdHJ1Y3QoJGlucHV0KTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CiR0aGlzLT5jbG9zZSgpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RGVzY3JpcHRvcnMoKTogYXJyYXkKewppZiAoISR0aGlzLT5oYXZlUmVhZFN1cHBvcnQpIHsKJG51bGxzdHJlYW0gPSBmb3BlbignTlVMJywgJ2MnKTsKCnJldHVybiBbClsncGlwZScsICdyJ10sCiRudWxsc3RyZWFtLAokbnVsbHN0cmVhbSwKXTsKfQoKCgoKcmV0dXJuIFsKWydwaXBlJywgJ3InXSwKWydmaWxlJywgJ05VTCcsICd3J10sClsnZmlsZScsICdOVUwnLCAndyddLApdOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0RmlsZXMoKTogYXJyYXkKewpyZXR1cm4gJHRoaXMtPmZpbGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gcmVhZEFuZFdyaXRlKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSA9IGZhbHNlKTogYXJyYXkKewokdGhpcy0+dW5ibG9jaygpOwokdyA9ICR0aGlzLT53cml0ZSgpOwokcmVhZCA9ICRyID0gJGUgPSBbXTsKCmlmICgkYmxvY2tpbmcpIHsKaWYgKCR3KSB7CkBzdHJlYW1fc2VsZWN0KCRyLCAkdywgJGUsIDAsIFByb2Nlc3M6OlRJTUVPVVRfUFJFQ0lTSU9OICogMUU2KTsKfSBlbHNlaWYgKCR0aGlzLT5maWxlSGFuZGxlcykgewp1c2xlZXAoKGludCkgKFByb2Nlc3M6OlRJTUVPVVRfUFJFQ0lTSU9OICogMUU2KSk7Cn0KfQpmb3JlYWNoICgkdGhpcy0+ZmlsZUhhbmRsZXMgYXMgJHR5cGUgPT4gJGZpbGVIYW5kbGUpIHsKJGRhdGEgPSBzdHJlYW1fZ2V0X2NvbnRlbnRzKCRmaWxlSGFuZGxlLCAtMSwgJHRoaXMtPnJlYWRCeXRlc1skdHlwZV0pOwoKaWYgKGlzc2V0KCRkYXRhWzBdKSkgewokdGhpcy0+cmVhZEJ5dGVzWyR0eXBlXSArPSBcc3RybGVuKCRkYXRhKTsKJHJlYWRbJHR5cGVdID0gJGRhdGE7Cn0KaWYgKCRjbG9zZSkgewpmdHJ1bmNhdGUoJGZpbGVIYW5kbGUsIDApOwpmY2xvc2UoJGZpbGVIYW5kbGUpOwpmbG9jaygkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdLCBcTE9DS19VTik7CmZjbG9zZSgkdGhpcy0+bG9ja0hhbmRsZXNbJHR5cGVdKTsKdW5zZXQoJHRoaXMtPmZpbGVIYW5kbGVzWyR0eXBlXSwgJHRoaXMtPmxvY2tIYW5kbGVzWyR0eXBlXSk7Cn0KfQoKcmV0dXJuICRyZWFkOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaGF2ZVJlYWRTdXBwb3J0KCk6IGJvb2wKewpyZXR1cm4gJHRoaXMtPmhhdmVSZWFkU3VwcG9ydDsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGFyZU9wZW4oKTogYm9vbAp7CnJldHVybiAkdGhpcy0+cGlwZXMgJiYgJHRoaXMtPmZpbGVIYW5kbGVzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gY2xvc2UoKQp7CnBhcmVudDo6Y2xvc2UoKTsKZm9yZWFjaCAoJHRoaXMtPmZpbGVIYW5kbGVzIGFzICR0eXBlID0+ICRoYW5kbGUpIHsKZnRydW5jYXRlKCRoYW5kbGUsIDApOwpmY2xvc2UoJGhhbmRsZSk7CmZsb2NrKCR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0sIFxMT0NLX1VOKTsKZmNsb3NlKCR0aGlzLT5sb2NrSGFuZGxlc1skdHlwZV0pOwp9CiR0aGlzLT5maWxlSGFuZGxlcyA9ICR0aGlzLT5sb2NrSGFuZGxlcyA9IFtdOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXExvZ2ljRXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cUHJvY2Vzc0ZhaWxlZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NTaWduYWxlZEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3NcRXhjZXB0aW9uXFJ1bnRpbWVFeGNlcHRpb247CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzXFBpcGVzSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xQaXBlc1xVbml4UGlwZXM7CnVzZSBTeW1mb255XENvbXBvbmVudFxQcm9jZXNzXFBpcGVzXFdpbmRvd3NQaXBlczsKCgoKCgoKCgoKCmNsYXNzIFByb2Nlc3MgaW1wbGVtZW50cyBcSXRlcmF0b3JBZ2dyZWdhdGUKewpwdWJsaWMgY29uc3QgRVJSID0gJ2Vycic7CnB1YmxpYyBjb25zdCBPVVQgPSAnb3V0JzsKCnB1YmxpYyBjb25zdCBTVEFUVVNfUkVBRFkgPSAncmVhZHknOwpwdWJsaWMgY29uc3QgU1RBVFVTX1NUQVJURUQgPSAnc3RhcnRlZCc7CnB1YmxpYyBjb25zdCBTVEFUVVNfVEVSTUlOQVRFRCA9ICd0ZXJtaW5hdGVkJzsKCnB1YmxpYyBjb25zdCBTVERJTiA9IDA7CnB1YmxpYyBjb25zdCBTVERPVVQgPSAxOwpwdWJsaWMgY29uc3QgU1RERVJSID0gMjsKCgpwdWJsaWMgY29uc3QgVElNRU9VVF9QUkVDSVNJT04gPSAwLjI7CgpwdWJsaWMgY29uc3QgSVRFUl9OT05fQkxPQ0tJTkcgPSAxOyAKcHVibGljIGNvbnN0IElURVJfS0VFUF9PVVRQVVQgPSAyOyAKcHVibGljIGNvbnN0IElURVJfU0tJUF9PVVQgPSA0OyAKcHVibGljIGNvbnN0IElURVJfU0tJUF9FUlIgPSA4OyAKCnByaXZhdGUgJGNhbGxiYWNrOwpwcml2YXRlICRoYXNDYWxsYmFjayA9IGZhbHNlOwpwcml2YXRlICRjb21tYW5kbGluZTsKcHJpdmF0ZSAkY3dkOwpwcml2YXRlICRlbnYgPSBbXTsKcHJpdmF0ZSAkaW5wdXQ7CnByaXZhdGUgJHN0YXJ0dGltZTsKcHJpdmF0ZSAkbGFzdE91dHB1dFRpbWU7CnByaXZhdGUgJHRpbWVvdXQ7CnByaXZhdGUgJGlkbGVUaW1lb3V0Owpwcml2YXRlICRleGl0Y29kZTsKcHJpdmF0ZSAkZmFsbGJhY2tTdGF0dXMgPSBbXTsKcHJpdmF0ZSAkcHJvY2Vzc0luZm9ybWF0aW9uOwpwcml2YXRlICRvdXRwdXREaXNhYmxlZCA9IGZhbHNlOwpwcml2YXRlICRzdGRvdXQ7CnByaXZhdGUgJHN0ZGVycjsKcHJpdmF0ZSAkcHJvY2VzczsKcHJpdmF0ZSAkc3RhdHVzID0gc2VsZjo6U1RBVFVTX1JFQURZOwpwcml2YXRlICRpbmNyZW1lbnRhbE91dHB1dE9mZnNldCA9IDA7CnByaXZhdGUgJGluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSAwOwpwcml2YXRlICR0dHkgPSBmYWxzZTsKcHJpdmF0ZSAkcHR5Owpwcml2YXRlICRvcHRpb25zID0gWydzdXBwcmVzc19lcnJvcnMnID0+IHRydWUsICdieXBhc3Nfc2hlbGwnID0+IHRydWVdOwoKcHJpdmF0ZSAkdXNlRmlsZUhhbmRsZXMgPSBmYWxzZTsKCnByaXZhdGUgJHByb2Nlc3NQaXBlczsKCnByaXZhdGUgJGxhdGVzdFNpZ25hbDsKcHJpdmF0ZSAkY2FjaGVkRXhpdENvZGU7Cgpwcml2YXRlIHN0YXRpYyAkc2lnY2hpbGQ7CgoKCgoKCnB1YmxpYyBzdGF0aWMgJGV4aXRDb2RlcyA9IFsKMCA9PiAnT0snLAoxID0+ICdHZW5lcmFsIGVycm9yJywKMiA9PiAnTWlzdXNlIG9mIHNoZWxsIGJ1aWx0aW5zJywKCjEyNiA9PiAnSW52b2tlZCBjb21tYW5kIGNhbm5vdCBleGVjdXRlJywKMTI3ID0+ICdDb21tYW5kIG5vdCBmb3VuZCcsCjEyOCA9PiAnSW52YWxpZCBleGl0IGFyZ3VtZW50JywKCgoxMjkgPT4gJ0hhbmd1cCcsCjEzMCA9PiAnSW50ZXJydXB0JywKMTMxID0+ICdRdWl0IGFuZCBkdW1wIGNvcmUnLAoxMzIgPT4gJ0lsbGVnYWwgaW5zdHJ1Y3Rpb24nLAoxMzMgPT4gJ1RyYWNlL2JyZWFrcG9pbnQgdHJhcCcsCjEzNCA9PiAnUHJvY2VzcyBhYm9ydGVkJywKMTM1ID0+ICdCdXMgZXJyb3I6ICJhY2Nlc3MgdG8gdW5kZWZpbmVkIHBvcnRpb24gb2YgbWVtb3J5IG9iamVjdCInLAoxMzYgPT4gJ0Zsb2F0aW5nIHBvaW50IGV4Y2VwdGlvbjogImVycm9uZW91cyBhcml0aG1ldGljIG9wZXJhdGlvbiInLAoxMzcgPT4gJ0tpbGwgKHRlcm1pbmF0ZSBpbW1lZGlhdGVseSknLAoxMzggPT4gJ1VzZXItZGVmaW5lZCAxJywKMTM5ID0+ICdTZWdtZW50YXRpb24gdmlvbGF0aW9uJywKMTQwID0+ICdVc2VyLWRlZmluZWQgMicsCjE0MSA9PiAnV3JpdGUgdG8gcGlwZSB3aXRoIG5vIG9uZSByZWFkaW5nJywKMTQyID0+ICdTaWduYWwgcmFpc2VkIGJ5IGFsYXJtJywKMTQzID0+ICdUZXJtaW5hdGlvbiAocmVxdWVzdCB0byB0ZXJtaW5hdGUpJywKCjE0NSA9PiAnQ2hpbGQgcHJvY2VzcyB0ZXJtaW5hdGVkLCBzdG9wcGVkIChvciBjb250aW51ZWQqKScsCjE0NiA9PiAnQ29udGludWUgaWYgc3RvcHBlZCcsCjE0NyA9PiAnU3RvcCBleGVjdXRpbmcgdGVtcG9yYXJpbHknLAoxNDggPT4gJ1Rlcm1pbmFsIHN0b3Agc2lnbmFsJywKMTQ5ID0+ICdCYWNrZ3JvdW5kIHByb2Nlc3MgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gdHR5ICgiaW4iKScsCjE1MCA9PiAnQmFja2dyb3VuZCBwcm9jZXNzIGF0dGVtcHRpbmcgdG8gd3JpdGUgdG8gdHR5ICgib3V0IiknLAoxNTEgPT4gJ1VyZ2VudCBkYXRhIGF2YWlsYWJsZSBvbiBzb2NrZXQnLAoxNTIgPT4gJ0NQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkJywKMTUzID0+ICdGaWxlIHNpemUgbGltaXQgZXhjZWVkZWQnLAoxNTQgPT4gJ1NpZ25hbCByYWlzZWQgYnkgdGltZXIgY291bnRpbmcgdmlydHVhbCB0aW1lOiAidmlydHVhbCB0aW1lciBleHBpcmVkIicsCjE1NSA9PiAnUHJvZmlsaW5nIHRpbWVyIGV4cGlyZWQnLAoKMTU3ID0+ICdQb2xsYWJsZSBldmVudCcsCgoxNTkgPT4gJ0JhZCBzeXNjYWxsJywKXTsKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChhcnJheSAkY29tbWFuZCwgP3N0cmluZyAkY3dkID0gbnVsbCwgP2FycmF5ICRlbnYgPSBudWxsLCAkaW5wdXQgPSBudWxsLCA/ZmxvYXQgJHRpbWVvdXQgPSA2MCkKewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ3Byb2Nfb3BlbicpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignVGhlIFByb2Nlc3MgY2xhc3MgcmVsaWVzIG9uIHByb2Nfb3Blbiwgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBvbiB5b3VyIFBIUCBpbnN0YWxsYXRpb24uJyk7Cn0KCiR0aGlzLT5jb21tYW5kbGluZSA9ICRjb21tYW5kOwokdGhpcy0+Y3dkID0gJGN3ZDsKCgoKCgppZiAobnVsbCA9PT0gJHRoaXMtPmN3ZCAmJiAoXGRlZmluZWQoJ1pFTkRfVEhSRUFEX1NBRkUnKSB8fCAnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikpIHsKJHRoaXMtPmN3ZCA9IGdldGN3ZCgpOwp9CmlmIChudWxsICE9PSAkZW52KSB7CiR0aGlzLT5zZXRFbnYoJGVudik7Cn0KCiR0aGlzLT5zZXRJbnB1dCgkaW5wdXQpOwokdGhpcy0+c2V0VGltZW91dCgkdGltZW91dCk7CiR0aGlzLT51c2VGaWxlSGFuZGxlcyA9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SOwokdGhpcy0+cHR5ID0gZmFsc2U7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU2hlbGxDb21tYW5kbGluZShzdHJpbmcgJGNvbW1hbmQsID9zdHJpbmcgJGN3ZCA9IG51bGwsID9hcnJheSAkZW52ID0gbnVsbCwgJGlucHV0ID0gbnVsbCwgP2Zsb2F0ICR0aW1lb3V0ID0gNjApCnsKJHByb2Nlc3MgPSBuZXcgc3RhdGljKFtdLCAkY3dkLCAkZW52LCAkaW5wdXQsICR0aW1lb3V0KTsKJHByb2Nlc3MtPmNvbW1hbmRsaW5lID0gJGNvbW1hbmQ7CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCkKewp0aHJvdyBuZXcgXEJhZE1ldGhvZENhbGxFeGNlcHRpb24oJ0Nhbm5vdCBzZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9CgpwdWJsaWMgZnVuY3Rpb24gX193YWtldXAoKQp7CnRocm93IG5ldyBcQmFkTWV0aG9kQ2FsbEV4Y2VwdGlvbignQ2Fubm90IHVuc2VyaWFsaXplICcuX19DTEFTU19fKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fZGVzdHJ1Y3QoKQp7CmlmICgkdGhpcy0+b3B0aW9uc1snY3JlYXRlX25ld19jb25zb2xlJ10gPz8gZmFsc2UpIHsKJHRoaXMtPnByb2Nlc3NQaXBlcy0+Y2xvc2UoKTsKfSBlbHNlIHsKJHRoaXMtPnN0b3AoMCk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5yZXNldFByb2Nlc3NEYXRhKCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJ1big/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCwgYXJyYXkgJGVudiA9IFtdKTogaW50CnsKJHRoaXMtPnN0YXJ0KCRjYWxsYmFjaywgJGVudik7CgpyZXR1cm4gJHRoaXMtPndhaXQoKTsKfQoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIG11c3RSdW4oP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSk6IHNlbGYKewppZiAoMCAhPT0gJHRoaXMtPnJ1bigkY2FsbGJhY2ssICRlbnYpKSB7CnRocm93IG5ldyBQcm9jZXNzRmFpbGVkRXhjZXB0aW9uKCR0aGlzKTsKfQoKcmV0dXJuICR0aGlzOwp9CgoKCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0KD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsLCBhcnJheSAkZW52ID0gW10pCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignUHJvY2VzcyBpcyBhbHJlYWR5IHJ1bm5pbmcuJyk7Cn0KCiR0aGlzLT5yZXNldFByb2Nlc3NEYXRhKCk7CiR0aGlzLT5zdGFydHRpbWUgPSAkdGhpcy0+bGFzdE91dHB1dFRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7CiR0aGlzLT5jYWxsYmFjayA9ICR0aGlzLT5idWlsZENhbGxiYWNrKCRjYWxsYmFjayk7CiR0aGlzLT5oYXNDYWxsYmFjayA9IG51bGwgIT09ICRjYWxsYmFjazsKJGRlc2NyaXB0b3JzID0gJHRoaXMtPmdldERlc2NyaXB0b3JzKCk7CgppZiAoJHRoaXMtPmVudikgewokZW52ICs9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCR0aGlzLT5lbnYsICRlbnYsICdzdHJjYXNlY21wJykgOiAkdGhpcy0+ZW52Owp9CgokZW52ICs9ICdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCR0aGlzLT5nZXREZWZhdWx0RW52KCksICRlbnYsICdzdHJjYXNlY21wJykgOiAkdGhpcy0+Z2V0RGVmYXVsdEVudigpOwoKaWYgKFxpc19hcnJheSgkY29tbWFuZGxpbmUgPSAkdGhpcy0+Y29tbWFuZGxpbmUpKSB7CiRjb21tYW5kbGluZSA9IGltcGxvZGUoJyAnLCBhcnJheV9tYXAoWyR0aGlzLCAnZXNjYXBlQXJndW1lbnQnXSwgJGNvbW1hbmRsaW5lKSk7CgppZiAoJ1xcJyAhPT0gXERJUkVDVE9SWV9TRVBBUkFUT1IpIHsKCiRjb21tYW5kbGluZSA9ICdleGVjICcuJGNvbW1hbmRsaW5lOwp9Cn0gZWxzZSB7CiRjb21tYW5kbGluZSA9ICR0aGlzLT5yZXBsYWNlUGxhY2Vob2xkZXJzKCRjb21tYW5kbGluZSwgJGVudik7Cn0KCmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokY29tbWFuZGxpbmUgPSAkdGhpcy0+cHJlcGFyZVdpbmRvd3NDb21tYW5kTGluZSgkY29tbWFuZGxpbmUsICRlbnYpOwp9IGVsc2VpZiAoISR0aGlzLT51c2VGaWxlSGFuZGxlcyAmJiAkdGhpcy0+aXNTaWdjaGlsZEVuYWJsZWQoKSkgewoKJGRlc2NyaXB0b3JzWzNdID0gWydwaXBlJywgJ3cnXTsKCgokY29tbWFuZGxpbmUgPSAneyAoJy4kY29tbWFuZGxpbmUuJykgPCYzIDM8Ji0gMz4vZGV2L251bGwgJiB9IDM8JjA7JzsKJGNvbW1hbmRsaW5lIC49ICdwaWQ9JCE7IGVjaG8gJHBpZCA+JjM7IHdhaXQgJHBpZCAyPi9kZXYvbnVsbDsgY29kZT0kPzsgZWNobyAkY29kZSA+JjM7IGV4aXQgJGNvZGUnOwoKCgokcHRzV29ya2Fyb3VuZCA9IGZvcGVuKF9fRklMRV9fLCAncicpOwp9CgokZW52UGFpcnMgPSBbXTsKZm9yZWFjaCAoJGVudiBhcyAkayA9PiAkdikgewppZiAoZmFsc2UgIT09ICR2ICYmIGZhbHNlID09PSBcaW5fYXJyYXkoJGssIFsnYXJnYycsICdhcmd2JywgJ0FSR0MnLCAnQVJHViddLCB0cnVlKSkgewokZW52UGFpcnNbXSA9ICRrLic9Jy4kdjsKfQp9CgppZiAoIWlzX2RpcigkdGhpcy0+Y3dkKSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihzcHJpbnRmKCdUaGUgcHJvdmlkZWQgY3dkICIlcyIgZG9lcyBub3QgZXhpc3QuJywgJHRoaXMtPmN3ZCkpOwp9CgokdGhpcy0+cHJvY2VzcyA9IEBwcm9jX29wZW4oJGNvbW1hbmRsaW5lLCAkZGVzY3JpcHRvcnMsICR0aGlzLT5wcm9jZXNzUGlwZXMtPnBpcGVzLCAkdGhpcy0+Y3dkLCAkZW52UGFpcnMsICR0aGlzLT5vcHRpb25zKTsKCmlmICghJHRoaXMtPnByb2Nlc3MpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ1VuYWJsZSB0byBsYXVuY2ggYSBuZXcgcHJvY2Vzcy4nKTsKfQokdGhpcy0+c3RhdHVzID0gc2VsZjo6U1RBVFVTX1NUQVJURUQ7CgppZiAoaXNzZXQoJGRlc2NyaXB0b3JzWzNdKSkgewokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3BpZCddID0gKGludCkgZmdldHMoJHRoaXMtPnByb2Nlc3NQaXBlcy0+cGlwZXNbM10pOwp9CgppZiAoJHRoaXMtPnR0eSkgewpyZXR1cm47Cn0KCiR0aGlzLT51cGRhdGVTdGF0dXMoZmFsc2UpOwokdGhpcy0+Y2hlY2tUaW1lb3V0KCk7Cn0KCgoKCgoKCgoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHJlc3RhcnQoP2NhbGxhYmxlICRjYWxsYmFjayA9IG51bGwsIGFycmF5ICRlbnYgPSBbXSk6IHNlbGYKewppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdQcm9jZXNzIGlzIGFscmVhZHkgcnVubmluZy4nKTsKfQoKJHByb2Nlc3MgPSBjbG9uZSAkdGhpczsKJHByb2Nlc3MtPnN0YXJ0KCRjYWxsYmFjaywgJGVudik7CgpyZXR1cm4gJHByb2Nlc3M7Cn0KCgoKCgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiB3YWl0KD9jYWxsYWJsZSAkY2FsbGJhY2sgPSBudWxsKQp7CiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZChfX0ZVTkNUSU9OX18pOwoKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgppZiAobnVsbCAhPT0gJGNhbGxiYWNrKSB7CmlmICghJHRoaXMtPnByb2Nlc3NQaXBlcy0+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+c3RhdHVzOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXR1cygpCnsKJHRoaXMtPnVwZGF0ZVN0YXR1cyhmYWxzZSk7CgpyZXR1cm4gJHRoaXMtPnN0YXR1czsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RvcChmbG9hdCAkdGltZW91dCA9IDEwLCA/aW50ICRzaWduYWwgPSBudWxsKQp7CiR0aW1lb3V0TWljcm8gPSBtaWNyb3RpbWUodHJ1ZSkgKyAkdGltZW91dDsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewoKJHRoaXMtPmRvU2lnbmFsKDE1LCBmYWxzZSk7CmRvIHsKdXNsZWVwKDEwMDApOwp9IHdoaWxlICgkdGhpcy0+aXNSdW5uaW5nKCkgJiYgbWljcm90aW1lKHRydWUpIDwgJHRpbWVvdXRNaWNybyk7CgppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CgoKJHRoaXMtPmRvU2lnbmFsKCRzaWduYWwgPzogOSwgZmFsc2UpOwp9Cn0KCmlmICgkdGhpcy0+aXNSdW5uaW5nKCkpIHsKaWYgKGlzc2V0KCR0aGlzLT5mYWxsYmFja1N0YXR1c1sncGlkJ10pKSB7CnVuc2V0KCR0aGlzLT5mYWxsYmFja1N0YXR1c1sncGlkJ10pOwoKcmV0dXJuICR0aGlzLT5zdG9wKDAsICRzaWduYWwpOwp9CiR0aGlzLT5jbG9zZSgpOwp9CgpyZXR1cm4gJHRoaXMtPmV4aXRjb2RlOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZGRPdXRwdXQoc3RyaW5nICRsaW5lKQp7CiR0aGlzLT5sYXN0T3V0cHV0VGltZSA9IG1pY3JvdGltZSh0cnVlKTsKCmZzZWVrKCR0aGlzLT5zdGRvdXQsIDAsIFxTRUVLX0VORCk7CmZ3cml0ZSgkdGhpcy0+c3Rkb3V0LCAkbGluZSk7CmZzZWVrKCR0aGlzLT5zdGRvdXQsICR0aGlzLT5pbmNyZW1lbnRhbE91dHB1dE9mZnNldCk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFkZEVycm9yT3V0cHV0KHN0cmluZyAkbGluZSkKewokdGhpcy0+bGFzdE91dHB1dFRpbWUgPSBtaWNyb3RpbWUodHJ1ZSk7Cgpmc2VlaygkdGhpcy0+c3RkZXJyLCAwLCBcU0VFS19FTkQpOwpmd3JpdGUoJHRoaXMtPnN0ZGVyciwgJGxpbmUpOwpmc2VlaygkdGhpcy0+c3RkZXJyLCAkdGhpcy0+aW5jcmVtZW50YWxFcnJvck91dHB1dE9mZnNldCk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRMYXN0T3V0cHV0VGltZSgpOiA/ZmxvYXQKewpyZXR1cm4gJHRoaXMtPmxhc3RPdXRwdXRUaW1lOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRDb21tYW5kTGluZSgpCnsKcmV0dXJuIFxpc19hcnJheSgkdGhpcy0+Y29tbWFuZGxpbmUpID8gaW1wbG9kZSgnICcsIGFycmF5X21hcChbJHRoaXMsICdlc2NhcGVBcmd1bWVudCddLCAkdGhpcy0+Y29tbWFuZGxpbmUpKSA6ICR0aGlzLT5jb21tYW5kbGluZTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0VGltZW91dCgpCnsKcmV0dXJuICR0aGlzLT50aW1lb3V0Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRJZGxlVGltZW91dCgpCnsKcmV0dXJuICR0aGlzLT5pZGxlVGltZW91dDsKfQoKCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFRpbWVvdXQoP2Zsb2F0ICR0aW1lb3V0KQp7CiR0aGlzLT50aW1lb3V0ID0gJHRoaXMtPnZhbGlkYXRlVGltZW91dCgkdGltZW91dCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0SWRsZVRpbWVvdXQoP2Zsb2F0ICR0aW1lb3V0KQp7CmlmIChudWxsICE9PSAkdGltZW91dCAmJiAkdGhpcy0+b3V0cHV0RGlzYWJsZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdJZGxlIHRpbWVvdXQgY2Fubm90IGJlIHNldCB3aGlsZSB0aGUgb3V0cHV0IGlzIGRpc2FibGVkLicpOwp9CgokdGhpcy0+aWRsZVRpbWVvdXQgPSAkdGhpcy0+dmFsaWRhdGVUaW1lb3V0KCR0aW1lb3V0KTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRUdHkoYm9vbCAkdHR5KQp7CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUiAmJiAkdHR5KSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdUVFkgbW9kZSBpcyBub3Qgc3VwcG9ydGVkIG9uIFdpbmRvd3MgcGxhdGZvcm0uJyk7Cn0KCmlmICgkdHR5ICYmICFzZWxmOjppc1R0eVN1cHBvcnRlZCgpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdUVFkgbW9kZSByZXF1aXJlcyAvZGV2L3R0eSB0byBiZSByZWFkL3dyaXRhYmxlLicpOwp9CgokdGhpcy0+dHR5ID0gJHR0eTsKCnJldHVybiAkdGhpczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gaXNUdHkoKQp7CnJldHVybiAkdGhpcy0+dHR5Owp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRQdHkoYm9vbCAkYm9vbCkKewokdGhpcy0+cHR5ID0gJGJvb2w7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGlzUHR5KCkKewpyZXR1cm4gJHRoaXMtPnB0eTsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0V29ya2luZ0RpcmVjdG9yeSgpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5jd2QpIHsKCgpyZXR1cm4gZ2V0Y3dkKCkgPzogbnVsbDsKfQoKcmV0dXJuICR0aGlzLT5jd2Q7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNldFdvcmtpbmdEaXJlY3Rvcnkoc3RyaW5nICRjd2QpCnsKJHRoaXMtPmN3ZCA9ICRjd2Q7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldEVudigpCnsKcmV0dXJuICR0aGlzLT5lbnY7Cn0KCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0RW52KGFycmF5ICRlbnYpCnsKJHRoaXMtPmVudiA9ICRlbnY7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGdldElucHV0KCkKewpyZXR1cm4gJHRoaXMtPmlucHV0Owp9CgoKCgoKCgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBzZXRJbnB1dCgkaW5wdXQpCnsKaWYgKCR0aGlzLT5pc1J1bm5pbmcoKSkgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0lucHV0IGNhbm5vdCBiZSBzZXQgd2hpbGUgdGhlIHByb2Nlc3MgaXMgcnVubmluZy4nKTsKfQoKJHRoaXMtPmlucHV0ID0gUHJvY2Vzc1V0aWxzOjp2YWxpZGF0ZUlucHV0KF9fTUVUSE9EX18sICRpbnB1dCk7CgpyZXR1cm4gJHRoaXM7Cn0KCgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGNoZWNrVGltZW91dCgpCnsKaWYgKHNlbGY6OlNUQVRVU19TVEFSVEVEICE9PSAkdGhpcy0+c3RhdHVzKSB7CnJldHVybjsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT50aW1lb3V0ICYmICR0aGlzLT50aW1lb3V0IDwgbWljcm90aW1lKHRydWUpIC0gJHRoaXMtPnN0YXJ0dGltZSkgewokdGhpcy0+c3RvcCgwKTsKCnRocm93IG5ldyBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb24oJHRoaXMsIFByb2Nlc3NUaW1lZE91dEV4Y2VwdGlvbjo6VFlQRV9HRU5FUkFMKTsKfQoKaWYgKG51bGwgIT09ICR0aGlzLT5pZGxlVGltZW91dCAmJiAkdGhpcy0+aWRsZVRpbWVvdXQgPCBtaWNyb3RpbWUodHJ1ZSkgLSAkdGhpcy0+bGFzdE91dHB1dFRpbWUpIHsKJHRoaXMtPnN0b3AoMCk7Cgp0aHJvdyBuZXcgUHJvY2Vzc1RpbWVkT3V0RXhjZXB0aW9uKCR0aGlzLCBQcm9jZXNzVGltZWRPdXRFeGNlcHRpb246OlRZUEVfSURMRSk7Cn0KfQoKCgoKcHVibGljIGZ1bmN0aW9uIGdldFN0YXJ0VGltZSgpOiBmbG9hdAp7CmlmICghJHRoaXMtPmlzU3RhcnRlZCgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbignU3RhcnQgdGltZSBpcyBvbmx5IGF2YWlsYWJsZSBhZnRlciBwcm9jZXNzIHN0YXJ0LicpOwp9CgpyZXR1cm4gJHRoaXMtPnN0YXJ0dGltZTsKfQoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0T3B0aW9ucyhhcnJheSAkb3B0aW9ucykKewppZiAoJHRoaXMtPmlzUnVubmluZygpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdTZXR0aW5nIG9wdGlvbnMgd2hpbGUgdGhlIHByb2Nlc3MgaXMgcnVubmluZyBpcyBub3QgcG9zc2libGUuJyk7Cn0KCiRkZWZhdWx0T3B0aW9ucyA9ICR0aGlzLT5vcHRpb25zOwokZXhpc3RpbmdPcHRpb25zID0gWydibG9ja2luZ19waXBlcycsICdjcmVhdGVfcHJvY2Vzc19ncm91cCcsICdjcmVhdGVfbmV3X2NvbnNvbGUnXTsKCmZvcmVhY2ggKCRvcHRpb25zIGFzICRrZXkgPT4gJHZhbHVlKSB7CmlmICghXGluX2FycmF5KCRrZXksICRleGlzdGluZ09wdGlvbnMpKSB7CiR0aGlzLT5vcHRpb25zID0gJGRlZmF1bHRPcHRpb25zOwp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oc3ByaW50ZignSW52YWxpZCBvcHRpb24gIiVzIiBwYXNzZWQgdG8gIiVzKCkiLiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmUgIiVzIi4nLCAka2V5LCBfX01FVEhPRF9fLCBpbXBsb2RlKCciLCAiJywgJGV4aXN0aW5nT3B0aW9ucykpKTsKfQokdGhpcy0+b3B0aW9uc1ska2V5XSA9ICR2YWx1ZTsKfQp9CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGlzVHR5U3VwcG9ydGVkKCk6IGJvb2wKewpzdGF0aWMgJGlzVHR5U3VwcG9ydGVkOwoKaWYgKG51bGwgPT09ICRpc1R0eVN1cHBvcnRlZCkgewokaXNUdHlTdXBwb3J0ZWQgPSAoYm9vbCkgQHByb2Nfb3BlbignZWNobyAxID4vZGV2L251bGwnLCBbWydmaWxlJywgJy9kZXYvdHR5JywgJ3InXSwgWydmaWxlJywgJy9kZXYvdHR5JywgJ3cnXSwgWydmaWxlJywgJy9kZXYvdHR5JywgJ3cnXV0sICRwaXBlcyk7Cn0KCnJldHVybiAkaXNUdHlTdXBwb3J0ZWQ7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc1B0eVN1cHBvcnRlZCgpCnsKc3RhdGljICRyZXN1bHQ7CgppZiAobnVsbCAhPT0gJHJlc3VsdCkgewpyZXR1cm4gJHJlc3VsdDsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CnJldHVybiAkcmVzdWx0ID0gZmFsc2U7Cn0KCnJldHVybiAkcmVzdWx0ID0gKGJvb2wpIEBwcm9jX29wZW4oJ2VjaG8gMSA+L2Rldi9udWxsJywgW1sncHR5J10sIFsncHR5J10sIFsncHR5J11dLCAkcGlwZXMpOwp9CgoKCgpwcml2YXRlIGZ1bmN0aW9uIGdldERlc2NyaXB0b3JzKCk6IGFycmF5CnsKaWYgKCR0aGlzLT5pbnB1dCBpbnN0YW5jZW9mIFxJdGVyYXRvcikgewokdGhpcy0+aW5wdXQtPnJld2luZCgpOwp9CmlmICgnXFwnID09PSBcRElSRUNUT1JZX1NFUEFSQVRPUikgewokdGhpcy0+cHJvY2Vzc1BpcGVzID0gbmV3IFdpbmRvd3NQaXBlcygkdGhpcy0+aW5wdXQsICEkdGhpcy0+b3V0cHV0RGlzYWJsZWQgfHwgJHRoaXMtPmhhc0NhbGxiYWNrKTsKfSBlbHNlIHsKJHRoaXMtPnByb2Nlc3NQaXBlcyA9IG5ldyBVbml4UGlwZXMoJHRoaXMtPmlzVHR5KCksICR0aGlzLT5pc1B0eSgpLCAkdGhpcy0+aW5wdXQsICEkdGhpcy0+b3V0cHV0RGlzYWJsZWQgfHwgJHRoaXMtPmhhc0NhbGxiYWNrKTsKfQoKcmV0dXJuICR0aGlzLT5wcm9jZXNzUGlwZXMtPmdldERlc2NyaXB0b3JzKCk7Cn0KCgoKCgoKCgoKCgpwcm90ZWN0ZWQgZnVuY3Rpb24gYnVpbGRDYWxsYmFjayg/Y2FsbGFibGUgJGNhbGxiYWNrID0gbnVsbCkKewppZiAoJHRoaXMtPm91dHB1dERpc2FibGVkKSB7CnJldHVybiBmdW5jdGlvbiAoJHR5cGUsICRkYXRhKSB1c2UgKCRjYWxsYmFjayk6IGJvb2wgewpyZXR1cm4gbnVsbCAhPT0gJGNhbGxiYWNrICYmICRjYWxsYmFjaygkdHlwZSwgJGRhdGEpOwp9Owp9Cgokb3V0ID0gc2VsZjo6T1VUOwoKcmV0dXJuIGZ1bmN0aW9uICgkdHlwZSwgJGRhdGEpIHVzZSAoJGNhbGxiYWNrLCAkb3V0KTogYm9vbCB7CmlmICgkb3V0ID09ICR0eXBlKSB7CiR0aGlzLT5hZGRPdXRwdXQoJGRhdGEpOwp9IGVsc2UgewokdGhpcy0+YWRkRXJyb3JPdXRwdXQoJGRhdGEpOwp9CgpyZXR1cm4gbnVsbCAhPT0gJGNhbGxiYWNrICYmICRjYWxsYmFjaygkdHlwZSwgJGRhdGEpOwp9Owp9CgoKCgoKCnByb3RlY3RlZCBmdW5jdGlvbiB1cGRhdGVTdGF0dXMoYm9vbCAkYmxvY2tpbmcpCnsKaWYgKHNlbGY6OlNUQVRVU19TVEFSVEVEICE9PSAkdGhpcy0+c3RhdHVzKSB7CnJldHVybjsKfQoKJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvbiA9IHByb2NfZ2V0X3N0YXR1cygkdGhpcy0+cHJvY2Vzcyk7CiRydW5uaW5nID0gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsncnVubmluZyddOwoKCgoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDgwMzAwKSB7CmlmICghaXNzZXQoJHRoaXMtPmNhY2hlZEV4aXRDb2RlKSAmJiAhJHJ1bm5pbmcgJiYgLTEgIT09ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ10pIHsKJHRoaXMtPmNhY2hlZEV4aXRDb2RlID0gJHRoaXMtPnByb2Nlc3NJbmZvcm1hdGlvblsnZXhpdGNvZGUnXTsKfQoKaWYgKGlzc2V0KCR0aGlzLT5jYWNoZWRFeGl0Q29kZSkgJiYgISRydW5uaW5nICYmIC0xID09PSAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydleGl0Y29kZSddKSB7CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ10gPSAkdGhpcy0+Y2FjaGVkRXhpdENvZGU7Cn0KfQoKJHRoaXMtPnJlYWRQaXBlcygkcnVubmluZyAmJiAkYmxvY2tpbmcsICdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SIHx8ICEkcnVubmluZyk7CgppZiAoJHRoaXMtPmZhbGxiYWNrU3RhdHVzICYmICR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpKSB7CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb24gPSAkdGhpcy0+ZmFsbGJhY2tTdGF0dXMgKyAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uOwp9CgppZiAoISRydW5uaW5nKSB7CiR0aGlzLT5jbG9zZSgpOwp9Cn0KCgoKCgoKcHJvdGVjdGVkIGZ1bmN0aW9uIGlzU2lnY2hpbGRFbmFibGVkKCkKewppZiAobnVsbCAhPT0gc2VsZjo6JHNpZ2NoaWxkKSB7CnJldHVybiBzZWxmOjokc2lnY2hpbGQ7Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cygncGhwaW5mbycpKSB7CnJldHVybiBzZWxmOjokc2lnY2hpbGQgPSBmYWxzZTsKfQoKb2Jfc3RhcnQoKTsKcGhwaW5mbyhcSU5GT19HRU5FUkFMKTsKCnJldHVybiBzZWxmOjokc2lnY2hpbGQgPSBzdHJfY29udGFpbnMob2JfZ2V0X2NsZWFuKCksICctLWVuYWJsZS1zaWdjaGlsZCcpOwp9CgoKCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZFBpcGVzRm9yT3V0cHV0KHN0cmluZyAkY2FsbGVyLCBib29sICRibG9ja2luZyA9IGZhbHNlKQp7CmlmICgkdGhpcy0+b3V0cHV0RGlzYWJsZWQpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKCdPdXRwdXQgaGFzIGJlZW4gZGlzYWJsZWQuJyk7Cn0KCiR0aGlzLT5yZXF1aXJlUHJvY2Vzc0lzU3RhcnRlZCgkY2FsbGVyKTsKCiR0aGlzLT51cGRhdGVTdGF0dXMoJGJsb2NraW5nKTsKfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHZhbGlkYXRlVGltZW91dCg/ZmxvYXQgJHRpbWVvdXQpOiA/ZmxvYXQKewokdGltZW91dCA9IChmbG9hdCkgJHRpbWVvdXQ7CgppZiAoMC4wID09PSAkdGltZW91dCkgewokdGltZW91dCA9IG51bGw7Cn0gZWxzZWlmICgkdGltZW91dCA8IDApIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIHRpbWVvdXQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aXZlIGludGVnZXIgb3IgZmxvYXQgbnVtYmVyLicpOwp9CgpyZXR1cm4gJHRpbWVvdXQ7Cn0KCgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVhZFBpcGVzKGJvb2wgJGJsb2NraW5nLCBib29sICRjbG9zZSkKewokcmVzdWx0ID0gJHRoaXMtPnByb2Nlc3NQaXBlcy0+cmVhZEFuZFdyaXRlKCRibG9ja2luZywgJGNsb3NlKTsKCiRjYWxsYmFjayA9ICR0aGlzLT5jYWxsYmFjazsKZm9yZWFjaCAoJHJlc3VsdCBhcyAkdHlwZSA9PiAkZGF0YSkgewppZiAoMyAhPT0gJHR5cGUpIHsKJGNhbGxiYWNrKHNlbGY6OlNURE9VVCA9PT0gJHR5cGUgPyBzZWxmOjpPVVQgOiBzZWxmOjpFUlIsICRkYXRhKTsKfSBlbHNlaWYgKCFpc3NldCgkdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3NpZ25hbGVkJ10pKSB7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snZXhpdGNvZGUnXSA9IChpbnQpICRkYXRhOwp9Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIGNsb3NlKCk6IGludAp7CiR0aGlzLT5wcm9jZXNzUGlwZXMtPmNsb3NlKCk7CmlmICgkdGhpcy0+cHJvY2Vzcykgewpwcm9jX2Nsb3NlKCR0aGlzLT5wcm9jZXNzKTsKJHRoaXMtPnByb2Nlc3MgPSBudWxsOwp9CiR0aGlzLT5leGl0Y29kZSA9ICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ2V4aXRjb2RlJ107CiR0aGlzLT5zdGF0dXMgPSBzZWxmOjpTVEFUVVNfVEVSTUlOQVRFRDsKCmlmICgtMSA9PT0gJHRoaXMtPmV4aXRjb2RlKSB7CmlmICgkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWydzaWduYWxlZCddICYmIDAgPCAkdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ10pIHsKCiR0aGlzLT5leGl0Y29kZSA9IDEyOCArICR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3Rlcm1zaWcnXTsKfSBlbHNlaWYgKCR0aGlzLT5pc1NpZ2NoaWxkRW5hYmxlZCgpKSB7CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb25bJ3NpZ25hbGVkJ10gPSB0cnVlOwokdGhpcy0+cHJvY2Vzc0luZm9ybWF0aW9uWyd0ZXJtc2lnJ10gPSAtMTsKfQp9CgoKCgokdGhpcy0+Y2FsbGJhY2sgPSBudWxsOwoKcmV0dXJuICR0aGlzLT5leGl0Y29kZTsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiByZXNldFByb2Nlc3NEYXRhKCkKewokdGhpcy0+c3RhcnR0aW1lID0gbnVsbDsKJHRoaXMtPmNhbGxiYWNrID0gbnVsbDsKJHRoaXMtPmV4aXRjb2RlID0gbnVsbDsKJHRoaXMtPmZhbGxiYWNrU3RhdHVzID0gW107CiR0aGlzLT5wcm9jZXNzSW5mb3JtYXRpb24gPSBudWxsOwokdGhpcy0+c3Rkb3V0ID0gZm9wZW4oJ3BocDovL3RlbXAvbWF4bWVtb3J5OicuKDEwMjQgKiAxMDI0KSwgJ3crJyk7CiR0aGlzLT5zdGRlcnIgPSBmb3BlbigncGhwOi8vdGVtcC9tYXhtZW1vcnk6Jy4oMTAyNCAqIDEwMjQpLCAndysnKTsKJHRoaXMtPnByb2Nlc3MgPSBudWxsOwokdGhpcy0+bGF0ZXN0U2lnbmFsID0gbnVsbDsKJHRoaXMtPnN0YXR1cyA9IHNlbGY6OlNUQVRVU19SRUFEWTsKJHRoaXMtPmluY3JlbWVudGFsT3V0cHV0T2Zmc2V0ID0gMDsKJHRoaXMtPmluY3JlbWVudGFsRXJyb3JPdXRwdXRPZmZzZXQgPSAwOwp9CgoKCgoKCgoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBkb1NpZ25hbChpbnQgJHNpZ25hbCwgYm9vbCAkdGhyb3dFeGNlcHRpb24pOiBib29sCnsKaWYgKG51bGwgPT09ICRwaWQgPSAkdGhpcy0+Z2V0UGlkKCkpIHsKaWYgKCR0aHJvd0V4Y2VwdGlvbikgewp0aHJvdyBuZXcgTG9naWNFeGNlcHRpb24oJ0Nhbm5vdCBzZW5kIHNpZ25hbCBvbiBhIG5vbiBydW5uaW5nIHByb2Nlc3MuJyk7Cn0KCnJldHVybiBmYWxzZTsKfQoKaWYgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CmV4ZWMoc3ByaW50ZigndGFza2tpbGwgL0YgL1QgL1BJRCAlZCAyPiYxJywgJHBpZCksICRvdXRwdXQsICRleGl0Q29kZSk7CmlmICgkZXhpdENvZGUgJiYgJHRoaXMtPmlzUnVubmluZygpKSB7CmlmICgkdGhyb3dFeGNlcHRpb24pIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oc3ByaW50ZignVW5hYmxlIHRvIGtpbGwgdGhlIHByb2Nlc3MgKCVzKS4nLCBpbXBsb2RlKCcgJywgJG91dHB1dCkpKTsKfQoKcmV0dXJuIGZhbHNlOwp9Cn0gZWxzZSB7CmlmICghJHRoaXMtPmlzU2lnY2hpbGRFbmFibGVkKCkpIHsKJG9rID0gQHByb2NfdGVybWluYXRlKCR0aGlzLT5wcm9jZXNzLCAkc2lnbmFsKTsKfSBlbHNlaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3Bvc2l4X2tpbGwnKSkgewokb2sgPSBAcG9zaXhfa2lsbCgkcGlkLCAkc2lnbmFsKTsKfSBlbHNlaWYgKCRvayA9IHByb2Nfb3BlbihzcHJpbnRmKCdraWxsIC0lZCAlZCcsICRzaWduYWwsICRwaWQpLCBbMiA9PiBbJ3BpcGUnLCAndyddXSwgJHBpcGVzKSkgewokb2sgPSBmYWxzZSA9PT0gZmdldHMoJHBpcGVzWzJdKTsKfQppZiAoISRvaykgewppZiAoJHRocm93RXhjZXB0aW9uKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKHNwcmludGYoJ0Vycm9yIHdoaWxlIHNlbmRpbmcgc2lnbmFsICIlcyIuJywgJHNpZ25hbCkpOwp9CgpyZXR1cm4gZmFsc2U7Cn0KfQoKJHRoaXMtPmxhdGVzdFNpZ25hbCA9ICRzaWduYWw7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snc2lnbmFsZWQnXSA9IHRydWU7CiR0aGlzLT5mYWxsYmFja1N0YXR1c1snZXhpdGNvZGUnXSA9IC0xOwokdGhpcy0+ZmFsbGJhY2tTdGF0dXNbJ3Rlcm1zaWcnXSA9ICR0aGlzLT5sYXRlc3RTaWduYWw7CgpyZXR1cm4gdHJ1ZTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBwcmVwYXJlV2luZG93c0NvbW1hbmRMaW5lKHN0cmluZyAkY21kLCBhcnJheSAmJGVudik6IHN0cmluZwp7CiR1aWQgPSB1bmlxaWQoJycsIHRydWUpOwokdmFyQ291bnQgPSAwOwokdmFyQ2FjaGUgPSBbXTsKJGNtZCA9IHByZWdfcmVwbGFjZV9jYWxsYmFjaygKJy8iKD86KAogICAgICAgICAgICAgICAgW14iJSFeXSorCiAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAoPzogIUxGISB8ICIoPzpcXlslIV5dKT8rIiApCiAgICAgICAgICAgICAgICAgICAgW14iJSFeXSorCiAgICAgICAgICAgICAgICApKysKICAgICAgICAgICAgKSB8IFteIl0qKyApIi94JywKZnVuY3Rpb24gKCRtKSB1c2UgKCYkZW52LCAmJHZhckNhY2hlLCAmJHZhckNvdW50LCAkdWlkKSB7CmlmICghaXNzZXQoJG1bMV0pKSB7CnJldHVybiAkbVswXTsKfQppZiAoaXNzZXQoJHZhckNhY2hlWyRtWzBdXSkpIHsKcmV0dXJuICR2YXJDYWNoZVskbVswXV07Cn0KaWYgKHN0cl9jb250YWlucygkdmFsdWUgPSAkbVsxXSwgIlwwIikpIHsKJHZhbHVlID0gc3RyX3JlcGxhY2UoIlwwIiwgJz8nLCAkdmFsdWUpOwp9CmlmIChmYWxzZSA9PT0gc3RycGJyaygkdmFsdWUsICJcIiUhXG4iKSkgewpyZXR1cm4gJyInLiR2YWx1ZS4nIic7Cn0KCiR2YWx1ZSA9IHN0cl9yZXBsYWNlKFsnIUxGIScsICciXiEiJywgJyJeJSInLCAnIl5eIicsICciIiddLCBbIlxuIiwgJyEnLCAnJScsICdeJywgJyInXSwgJHZhbHVlKTsKJHZhbHVlID0gJyInLnByZWdfcmVwbGFjZSgnLyhcXFxcKikiLycsICckMSQxXFwiJywgJHZhbHVlKS4nIic7CiR2YXIgPSAkdWlkLisrJHZhckNvdW50OwoKJGVudlskdmFyXSA9ICR2YWx1ZTsKCnJldHVybiAkdmFyQ2FjaGVbJG1bMF1dID0gJyEnLiR2YXIuJyEnOwp9LAokY21kCik7CgpzdGF0aWMgJGNvbVNwZWM7CgppZiAoISRjb21TcGVjICYmICRjb21TcGVjID0gKG5ldyBFeGVjdXRhYmxlRmluZGVyKCkpLT5maW5kKCdjbWQuZXhlJykpIHsKCiRjb21TcGVjID0gJyInLnByZWdfcmVwbGFjZSgneyhcXFxcKispIn0nLCAnJDEkMVwiJywgJGNvbVNwZWMpIC4nIic7Cn0KCiRjbWQgPSAoJGNvbVNwZWMgPz8gJ2NtZCcpLicgL1Y6T04gL0U6T04gL0QgL0MgKCcuc3RyX3JlcGxhY2UoIlxuIiwgJyAnLCAkY21kKS4nKSc7CmZvcmVhY2ggKCR0aGlzLT5wcm9jZXNzUGlwZXMtPmdldEZpbGVzKCkgYXMgJG9mZnNldCA9PiAkZmlsZW5hbWUpIHsKJGNtZCAuPSAnICcuJG9mZnNldC4nPiInLiRmaWxlbmFtZS4nIic7Cn0KCnJldHVybiAkY21kOwp9CgoKCgoKCnByaXZhdGUgZnVuY3Rpb24gcmVxdWlyZVByb2Nlc3NJc1N0YXJ0ZWQoc3RyaW5nICRmdW5jdGlvbk5hbWUpCnsKaWYgKCEkdGhpcy0+aXNTdGFydGVkKCkpIHsKdGhyb3cgbmV3IExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ1Byb2Nlc3MgbXVzdCBiZSBzdGFydGVkIGJlZm9yZSBjYWxsaW5nICIlcygpIi4nLCAkZnVuY3Rpb25OYW1lKSk7Cn0KfQoKCgoKCgpwcml2YXRlIGZ1bmN0aW9uIHJlcXVpcmVQcm9jZXNzSXNUZXJtaW5hdGVkKHN0cmluZyAkZnVuY3Rpb25OYW1lKQp7CmlmICghJHRoaXMtPmlzVGVybWluYXRlZCgpKSB7CnRocm93IG5ldyBMb2dpY0V4Y2VwdGlvbihzcHJpbnRmKCdQcm9jZXNzIG11c3QgYmUgdGVybWluYXRlZCBiZWZvcmUgY2FsbGluZyAiJXMoKSIuJywgJGZ1bmN0aW9uTmFtZSkpOwp9Cn0KCgoKCnByaXZhdGUgZnVuY3Rpb24gZXNjYXBlQXJndW1lbnQoP3N0cmluZyAkYXJndW1lbnQpOiBzdHJpbmcKewppZiAoJycgPT09ICRhcmd1bWVudCB8fCBudWxsID09PSAkYXJndW1lbnQpIHsKcmV0dXJuICciIic7Cn0KaWYgKCdcXCcgIT09IFxESVJFQ1RPUllfU0VQQVJBVE9SKSB7CnJldHVybiAiJyIuc3RyX3JlcGxhY2UoIiciLCAiJ1xcJyciLCAkYXJndW1lbnQpLiInIjsKfQppZiAoc3RyX2NvbnRhaW5zKCRhcmd1bWVudCwgIlwwIikpIHsKJGFyZ3VtZW50ID0gc3RyX3JlcGxhY2UoIlwwIiwgJz8nLCAkYXJndW1lbnQpOwp9CmlmICghcHJlZ19tYXRjaCgnL1soKSUhXiI8PiZ8XHNdLycsICRhcmd1bWVudCkpIHsKcmV0dXJuICRhcmd1bWVudDsKfQokYXJndW1lbnQgPSBwcmVnX3JlcGxhY2UoJy8oXFxcXCspJC8nLCAnJDEkMScsICRhcmd1bWVudCk7CgpyZXR1cm4gJyInLnN0cl9yZXBsYWNlKFsnIicsICdeJywgJyUnLCAnIScsICJcbiJdLCBbJyIiJywgJyJeXiInLCAnIl4lIicsICciXiEiJywgJyFMRiEnXSwgJGFyZ3VtZW50KS4nIic7Cn0KCnByaXZhdGUgZnVuY3Rpb24gcmVwbGFjZVBsYWNlaG9sZGVycyhzdHJpbmcgJGNvbW1hbmRsaW5lLCBhcnJheSAkZW52KQp7CnJldHVybiBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy8iXCRcezooW19hLXpBLVpdKytbX2EtekEtWjAtOV0qKylcfSIvJywgZnVuY3Rpb24gKCRtYXRjaGVzKSB1c2UgKCRjb21tYW5kbGluZSwgJGVudikgewppZiAoIWlzc2V0KCRlbnZbJG1hdGNoZXNbMV1dKSB8fCBmYWxzZSA9PT0gJGVudlskbWF0Y2hlc1sxXV0pIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdDb21tYW5kIGxpbmUgaXMgbWlzc2luZyBhIHZhbHVlIGZvciBwYXJhbWV0ZXIgIiVzIjogJywgJG1hdGNoZXNbMV0pLiRjb21tYW5kbGluZSk7Cn0KCnJldHVybiAkdGhpcy0+ZXNjYXBlQXJndW1lbnQoJGVudlskbWF0Y2hlc1sxXV0pOwp9LCAkY29tbWFuZGxpbmUpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGdldERlZmF1bHRFbnYoKTogYXJyYXkKewokZW52ID0gZ2V0ZW52KCk7CiRlbnYgPSAoJ1xcJyA9PT0gXERJUkVDVE9SWV9TRVBBUkFUT1IgPyBhcnJheV9pbnRlcnNlY3RfdWtleSgkZW52LCAkX1NFUlZFUiwgJ3N0cmNhc2VjbXAnKSA6IGFycmF5X2ludGVyc2VjdF9rZXkoJGVudiwgJF9TRVJWRVIpKSA/OiAkZW52OwoKcmV0dXJuICRfRU5WICsgKCdcXCcgPT09IFxESVJFQ1RPUllfU0VQQVJBVE9SID8gYXJyYXlfZGlmZl91a2V5KCRlbnYsICRfRU5WLCAnc3RyY2FzZWNtcCcpIDogJGVudik7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFByb2Nlc3M7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcUHJvY2Vzc1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwoKCgoKCgoKCmNsYXNzIFByb2Nlc3NVdGlscwp7CgoKCnByaXZhdGUgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQp7Cn0KCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHZhbGlkYXRlSW5wdXQoc3RyaW5nICRjYWxsZXIsICRpbnB1dCkKewppZiAobnVsbCAhPT0gJGlucHV0KSB7CmlmIChcaXNfcmVzb3VyY2UoJGlucHV0KSkgewpyZXR1cm4gJGlucHV0Owp9CmlmIChcaXNfc3RyaW5nKCRpbnB1dCkpIHsKcmV0dXJuICRpbnB1dDsKfQppZiAoXGlzX3NjYWxhcigkaW5wdXQpKSB7CnJldHVybiAoc3RyaW5nKSAkaW5wdXQ7Cn0KaWYgKCRpbnB1dCBpbnN0YW5jZW9mIFByb2Nlc3MpIHsKcmV0dXJuICRpbnB1dC0+Z2V0SXRlcmF0b3IoJGlucHV0OjpJVEVSX1NLSVBfRVJSKTsKfQppZiAoJGlucHV0IGluc3RhbmNlb2YgXEl0ZXJhdG9yKSB7CnJldHVybiAkaW5wdXQ7Cn0KaWYgKCRpbnB1dCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gbmV3IFxJdGVyYXRvckl0ZXJhdG9yKCRpbnB1dCk7Cn0KCnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignIiVzIiBvbmx5IGFjY2VwdHMgc3RyaW5ncywgVHJhdmVyc2FibGUgb2JqZWN0cyBvciBzdHJlYW0gcmVzb3VyY2VzLicsICRjYWxsZXIpKTsKfQoKcmV0dXJuICRpbnB1dDsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxBdHRyaWJ1dGU7CgoKCgoKCgoKCiNbXEF0dHJpYnV0ZShcQXR0cmlidXRlOjpUQVJHRVRfTUVUSE9EIHwgXEF0dHJpYnV0ZTo6VEFSR0VUX1BST1BFUlRZKV0KZmluYWwgY2xhc3MgUmVxdWlyZWQKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxBdHRyaWJ1dGU7Cgp1c2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZVxTZXJ2aWNlU3Vic2NyaWJlclRyYWl0OwoKCgoKCgoKI1tcQXR0cmlidXRlKFxBdHRyaWJ1dGU6OlRBUkdFVF9NRVRIT0QpXQpmaW5hbCBjbGFzcyBTdWJzY3JpYmVkU2VydmljZQp7CgoKCgpwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCnB1YmxpYyA/c3RyaW5nICRrZXkgPSBudWxsCikgewp9Cn0KCkNvcHlyaWdodCAoYykgMjAxOC1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7CgoKCgoKCgoKCgoKCgoKaW50ZXJmYWNlIFJlc2V0SW50ZXJmYWNlCnsKcHVibGljIGZ1bmN0aW9uIHJlc2V0KCk7Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlOwoKdXNlIFBzclxDb250YWluZXJcQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgUHNyXENvbnRhaW5lclxOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZTsKCgpjbGFzc19leGlzdHMoQ29udGFpbmVyRXhjZXB0aW9uSW50ZXJmYWNlOjpjbGFzcyk7CmNsYXNzX2V4aXN0cyhOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZTo6Y2xhc3MpOwoKCgoKCgoKdHJhaXQgU2VydmljZUxvY2F0b3JUcmFpdAp7CnByaXZhdGUgJGZhY3RvcmllczsKcHJpdmF0ZSAkbG9hZGluZyA9IFtdOwpwcml2YXRlICRwcm92aWRlZFR5cGVzOwoKCgoKcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KGFycmF5ICRmYWN0b3JpZXMpCnsKJHRoaXMtPmZhY3RvcmllcyA9ICRmYWN0b3JpZXM7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGhhcyhzdHJpbmcgJGlkKQp7CnJldHVybiBpc3NldCgkdGhpcy0+ZmFjdG9yaWVzWyRpZF0pOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXQoc3RyaW5nICRpZCkKewppZiAoIWlzc2V0KCR0aGlzLT5mYWN0b3JpZXNbJGlkXSkpIHsKdGhyb3cgJHRoaXMtPmNyZWF0ZU5vdEZvdW5kRXhjZXB0aW9uKCRpZCk7Cn0KCmlmIChpc3NldCgkdGhpcy0+bG9hZGluZ1skaWRdKSkgewokaWRzID0gYXJyYXlfdmFsdWVzKCR0aGlzLT5sb2FkaW5nKTsKJGlkcyA9IFxhcnJheV9zbGljZSgkdGhpcy0+bG9hZGluZywgYXJyYXlfc2VhcmNoKCRpZCwgJGlkcykpOwokaWRzW10gPSAkaWQ7Cgp0aHJvdyAkdGhpcy0+Y3JlYXRlQ2lyY3VsYXJSZWZlcmVuY2VFeGNlcHRpb24oJGlkLCAkaWRzKTsKfQoKJHRoaXMtPmxvYWRpbmdbJGlkXSA9ICRpZDsKdHJ5IHsKcmV0dXJuICR0aGlzLT5mYWN0b3JpZXNbJGlkXSgkdGhpcyk7Cn0gZmluYWxseSB7CnVuc2V0KCR0aGlzLT5sb2FkaW5nWyRpZF0pOwp9Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBnZXRQcm92aWRlZFNlcnZpY2VzKCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICR0aGlzLT5wcm92aWRlZFR5cGVzKSB7CiR0aGlzLT5wcm92aWRlZFR5cGVzID0gW107Cgpmb3JlYWNoICgkdGhpcy0+ZmFjdG9yaWVzIGFzICRuYW1lID0+ICRmYWN0b3J5KSB7CmlmICghXGlzX2NhbGxhYmxlKCRmYWN0b3J5KSkgewokdGhpcy0+cHJvdmlkZWRUeXBlc1skbmFtZV0gPSAnPyc7Cn0gZWxzZSB7CiR0eXBlID0gKG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRmYWN0b3J5KSktPmdldFJldHVyblR5cGUoKTsKCiR0aGlzLT5wcm92aWRlZFR5cGVzWyRuYW1lXSA9ICR0eXBlID8gKCR0eXBlLT5hbGxvd3NOdWxsKCkgPyAnPycgOiAnJykuKCR0eXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUgPyAkdHlwZS0+Z2V0TmFtZSgpIDogJHR5cGUpIDogJz8nOwp9Cn0KfQoKcmV0dXJuICR0aGlzLT5wcm92aWRlZFR5cGVzOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGNyZWF0ZU5vdEZvdW5kRXhjZXB0aW9uKHN0cmluZyAkaWQpOiBOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZQp7CmlmICghJGFsdGVybmF0aXZlcyA9IGFycmF5X2tleXMoJHRoaXMtPmZhY3RvcmllcykpIHsKJG1lc3NhZ2UgPSAnaXMgZW1wdHkuLi4nOwp9IGVsc2UgewokbGFzdCA9IGFycmF5X3BvcCgkYWx0ZXJuYXRpdmVzKTsKaWYgKCRhbHRlcm5hdGl2ZXMpIHsKJG1lc3NhZ2UgPSBzcHJpbnRmKCdvbmx5IGtub3dzIGFib3V0IHRoZSAiJXMiIGFuZCAiJXMiIHNlcnZpY2VzLicsIGltcGxvZGUoJyIsICInLCAkYWx0ZXJuYXRpdmVzKSwgJGxhc3QpOwp9IGVsc2UgewokbWVzc2FnZSA9IHNwcmludGYoJ29ubHkga25vd3MgYWJvdXQgdGhlICIlcyIgc2VydmljZS4nLCAkbGFzdCk7Cn0KfQoKaWYgKCR0aGlzLT5sb2FkaW5nKSB7CiRtZXNzYWdlID0gc3ByaW50ZignVGhlIHNlcnZpY2UgIiVzIiBoYXMgYSBkZXBlbmRlbmN5IG9uIGEgbm9uLWV4aXN0ZW50IHNlcnZpY2UgIiVzIi4gVGhpcyBsb2NhdG9yICVzJywgZW5kKCR0aGlzLT5sb2FkaW5nKSwgJGlkLCAkbWVzc2FnZSk7Cn0gZWxzZSB7CiRtZXNzYWdlID0gc3ByaW50ZignU2VydmljZSAiJXMiIG5vdCBmb3VuZDogdGhlIGN1cnJlbnQgc2VydmljZSBsb2NhdG9yICVzJywgJGlkLCAkbWVzc2FnZSk7Cn0KCnJldHVybiBuZXcgY2xhc3MoJG1lc3NhZ2UpIGV4dGVuZHMgXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbiBpbXBsZW1lbnRzIE5vdEZvdW5kRXhjZXB0aW9uSW50ZXJmYWNlIHsKfTsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVDaXJjdWxhclJlZmVyZW5jZUV4Y2VwdGlvbihzdHJpbmcgJGlkLCBhcnJheSAkcGF0aCk6IENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZQp7CnJldHVybiBuZXcgY2xhc3Moc3ByaW50ZignQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzZXJ2aWNlICIlcyIsIHBhdGg6ICIlcyIuJywgJGlkLCBpbXBsb2RlKCcgLT4gJywgJHBhdGgpKSkgZXh0ZW5kcyBcUnVudGltZUV4Y2VwdGlvbiBpbXBsZW1lbnRzIENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZSB7Cn07Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7Cgp1c2UgUHNyXENvbnRhaW5lclxDb250YWluZXJJbnRlcmZhY2U7CgoKCgoKCgppbnRlcmZhY2UgU2VydmljZVByb3ZpZGVySW50ZXJmYWNlIGV4dGVuZHMgQ29udGFpbmVySW50ZXJmYWNlCnsKCgoKCgoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0UHJvdmlkZWRTZXJ2aWNlcygpOiBhcnJheTsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2U7CgoKCgoKCgoKCgoKCgoKCgppbnRlcmZhY2UgU2VydmljZVN1YnNjcmliZXJJbnRlcmZhY2UKewoKCgoKCgoKCgoKCgoKCgoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGdldFN1YnNjcmliZWRTZXJ2aWNlcygpOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb250cmFjdHNcU2VydmljZTsKCnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcQXR0cmlidXRlXFN1YnNjcmliZWRTZXJ2aWNlOwoKCgoKCgoKdHJhaXQgU2VydmljZVN1YnNjcmliZXJUcmFpdAp7Cgpwcm90ZWN0ZWQgJGNvbnRhaW5lcjsKCgoKCnB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gZ2V0U3Vic2NyaWJlZFNlcnZpY2VzKCk6IGFycmF5CnsKJHNlcnZpY2VzID0gbWV0aG9kX2V4aXN0cyhnZXRfcGFyZW50X2NsYXNzKHNlbGY6OmNsYXNzKSA/OiAnJywgX19GVU5DVElPTl9fKSA/IHBhcmVudDo6Z2V0U3Vic2NyaWJlZFNlcnZpY2VzKCkgOiBbXTsKJGF0dHJpYnV0ZU9wdEluID0gZmFsc2U7CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CmZvcmVhY2ggKChuZXcgXFJlZmxlY3Rpb25DbGFzcyhzZWxmOjpjbGFzcykpLT5nZXRNZXRob2RzKCkgYXMgJG1ldGhvZCkgewppZiAoc2VsZjo6Y2xhc3MgIT09ICRtZXRob2QtPmdldERlY2xhcmluZ0NsYXNzKCktPm5hbWUpIHsKY29udGludWU7Cn0KCmlmICghJGF0dHJpYnV0ZSA9ICRtZXRob2QtPmdldEF0dHJpYnV0ZXMoU3Vic2NyaWJlZFNlcnZpY2U6OmNsYXNzKVswXSA/PyBudWxsKSB7CmNvbnRpbnVlOwp9CgppZiAoJG1ldGhvZC0+aXNTdGF0aWMoKSB8fCAkbWV0aG9kLT5pc0Fic3RyYWN0KCkgfHwgJG1ldGhvZC0+aXNHZW5lcmF0b3IoKSB8fCAkbWV0aG9kLT5pc0ludGVybmFsKCkgfHwgJG1ldGhvZC0+Z2V0TnVtYmVyT2ZSZXF1aXJlZFBhcmFtZXRlcnMoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCB1c2UgIiVzIiBvbiBtZXRob2QgIiVzOjolcygpIiAoY2FuIG9ubHkgYmUgdXNlZCBvbiBub24tc3RhdGljLCBub24tYWJzdHJhY3QgbWV0aG9kcyB3aXRoIG5vIHBhcmFtZXRlcnMpLicsIFN1YnNjcmliZWRTZXJ2aWNlOjpjbGFzcywgc2VsZjo6Y2xhc3MsICRtZXRob2QtPm5hbWUpKTsKfQoKaWYgKCEkcmV0dXJuVHlwZSA9ICRtZXRob2QtPmdldFJldHVyblR5cGUoKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJ0Nhbm5vdCB1c2UgIiVzIiBvbiBtZXRob2RzIHdpdGhvdXQgYSByZXR1cm4gdHlwZSBpbiAiJXM6OiVzKCkiLicsIFN1YnNjcmliZWRTZXJ2aWNlOjpjbGFzcywgJG1ldGhvZC0+bmFtZSwgc2VsZjo6Y2xhc3MpKTsKfQoKJHNlcnZpY2VJZCA9ICRyZXR1cm5UeXBlIGluc3RhbmNlb2YgXFJlZmxlY3Rpb25OYW1lZFR5cGUgPyAkcmV0dXJuVHlwZS0+Z2V0TmFtZSgpIDogKHN0cmluZykgJHJldHVyblR5cGU7CgppZiAoJHJldHVyblR5cGUtPmFsbG93c051bGwoKSkgewokc2VydmljZUlkID0gJz8nLiRzZXJ2aWNlSWQ7Cn0KCiRzZXJ2aWNlc1skYXR0cmlidXRlLT5uZXdJbnN0YW5jZSgpLT5rZXkgPz8gc2VsZjo6Y2xhc3MuJzo6Jy4kbWV0aG9kLT5uYW1lXSA9ICRzZXJ2aWNlSWQ7CiRhdHRyaWJ1dGVPcHRJbiA9IHRydWU7Cn0KfQoKaWYgKCEkYXR0cmlidXRlT3B0SW4pIHsKZm9yZWFjaCAoKG5ldyBcUmVmbGVjdGlvbkNsYXNzKHNlbGY6OmNsYXNzKSktPmdldE1ldGhvZHMoKSBhcyAkbWV0aG9kKSB7CmlmICgkbWV0aG9kLT5pc1N0YXRpYygpIHx8ICRtZXRob2QtPmlzQWJzdHJhY3QoKSB8fCAkbWV0aG9kLT5pc0dlbmVyYXRvcigpIHx8ICRtZXRob2QtPmlzSW50ZXJuYWwoKSB8fCAkbWV0aG9kLT5nZXROdW1iZXJPZlJlcXVpcmVkUGFyYW1ldGVycygpKSB7CmNvbnRpbnVlOwp9CgppZiAoc2VsZjo6Y2xhc3MgIT09ICRtZXRob2QtPmdldERlY2xhcmluZ0NsYXNzKCktPm5hbWUpIHsKY29udGludWU7Cn0KCmlmICghKCRyZXR1cm5UeXBlID0gJG1ldGhvZC0+Z2V0UmV0dXJuVHlwZSgpKSBpbnN0YW5jZW9mIFxSZWZsZWN0aW9uTmFtZWRUeXBlKSB7CmNvbnRpbnVlOwp9CgppZiAoJHJldHVyblR5cGUtPmlzQnVpbHRpbigpKSB7CmNvbnRpbnVlOwp9CgppZiAoXFBIUF9WRVJTSU9OX0lEID49IDgwMDAwKSB7CnRyaWdnZXJfZGVwcmVjYXRpb24oJ3N5bWZvbnkvc2VydmljZS1jb250cmFjdHMnLCAnMi41JywgJ1VzaW5nICIlcyIgaW4gIiVzIiB3aXRob3V0IHVzaW5nIHRoZSAiJXMiIGF0dHJpYnV0ZSBvbiBhbnkgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuJywgU2VydmljZVN1YnNjcmliZXJUcmFpdDo6Y2xhc3MsIHNlbGY6OmNsYXNzLCBTdWJzY3JpYmVkU2VydmljZTo6Y2xhc3MpOwp9Cgokc2VydmljZXNbc2VsZjo6Y2xhc3MuJzo6Jy4kbWV0aG9kLT5uYW1lXSA9ICc/Jy4oJHJldHVyblR5cGUgaW5zdGFuY2VvZiBcUmVmbGVjdGlvbk5hbWVkVHlwZSA/ICRyZXR1cm5UeXBlLT5nZXROYW1lKCkgOiAkcmV0dXJuVHlwZSk7Cn0KfQoKcmV0dXJuICRzZXJ2aWNlczsKfQoKCgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0Q29udGFpbmVyKENvbnRhaW5lckludGVyZmFjZSAkY29udGFpbmVyKQp7CiRyZXQgPSBudWxsOwppZiAobWV0aG9kX2V4aXN0cyhnZXRfcGFyZW50X2NsYXNzKHNlbGY6OmNsYXNzKSA/OiAnJywgX19GVU5DVElPTl9fKSkgewokcmV0ID0gcGFyZW50OjpzZXRDb250YWluZXIoJGNvbnRhaW5lcik7Cn0KCiR0aGlzLT5jb250YWluZXIgPSAkY29udGFpbmVyOwoKcmV0dXJuICRyZXQ7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcVGVzdDsKCmNsYXNzX2FsaWFzKFNlcnZpY2VMb2NhdG9yVGVzdENhc2U6OmNsYXNzLCBTZXJ2aWNlTG9jYXRvclRlc3Q6OmNsYXNzKTsKCmlmIChmYWxzZSkgewoKCgpjbGFzcyBTZXJ2aWNlTG9jYXRvclRlc3QKewp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbnRyYWN0c1xTZXJ2aWNlXFRlc3Q7Cgp1c2UgUEhQVW5pdFxGcmFtZXdvcmtcVGVzdENhc2U7CnVzZSBQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29udHJhY3RzXFNlcnZpY2VcU2VydmljZUxvY2F0b3JUcmFpdDsKCmFic3RyYWN0IGNsYXNzIFNlcnZpY2VMb2NhdG9yVGVzdENhc2UgZXh0ZW5kcyBUZXN0Q2FzZQp7CgoKCnByb3RlY3RlZCBmdW5jdGlvbiBnZXRTZXJ2aWNlTG9jYXRvcihhcnJheSAkZmFjdG9yaWVzKQp7CnJldHVybiBuZXcgY2xhc3MoJGZhY3RvcmllcykgaW1wbGVtZW50cyBDb250YWluZXJJbnRlcmZhY2Ugewp1c2UgU2VydmljZUxvY2F0b3JUcmFpdDsKfTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RIYXMoKQp7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgeyByZXR1cm4gJ2Jhcic7IH0sCidiYXInID0+IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdiYXonOyB9LApmdW5jdGlvbiAoKSB7IHJldHVybiAnZHVtbXknOyB9LApdKTsKCiR0aGlzLT5hc3NlcnRUcnVlKCRsb2NhdG9yLT5oYXMoJ2ZvbycpKTsKJHRoaXMtPmFzc2VydFRydWUoJGxvY2F0b3ItPmhhcygnYmFyJykpOwokdGhpcy0+YXNzZXJ0RmFsc2UoJGxvY2F0b3ItPmhhcygnZHVtbXknKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0R2V0KCkKewokbG9jYXRvciA9ICR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcihbCidmb28nID0+IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdiYXInOyB9LAonYmFyJyA9PiBmdW5jdGlvbiAoKSB7IHJldHVybiAnYmF6JzsgfSwKXSk7CgokdGhpcy0+YXNzZXJ0U2FtZSgnYmFyJywgJGxvY2F0b3ItPmdldCgnZm9vJykpOwokdGhpcy0+YXNzZXJ0U2FtZSgnYmF6JywgJGxvY2F0b3ItPmdldCgnYmFyJykpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdGVzdEdldERvZXNOb3RNZW1vaXplKCkKewokaSA9IDA7CiRsb2NhdG9yID0gJHRoaXMtPmdldFNlcnZpY2VMb2NhdG9yKFsKJ2ZvbycgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGkpIHsKKyskaTsKCnJldHVybiAnYmFyJzsKfSwKXSk7CgokdGhpcy0+YXNzZXJ0U2FtZSgnYmFyJywgJGxvY2F0b3ItPmdldCgnZm9vJykpOwokdGhpcy0+YXNzZXJ0U2FtZSgnYmFyJywgJGxvY2F0b3ItPmdldCgnZm9vJykpOwokdGhpcy0+YXNzZXJ0U2FtZSgyLCAkaSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0ZXN0VGhyb3dzT25VbmRlZmluZWRJbnRlcm5hbFNlcnZpY2UoKQp7CmlmICghJHRoaXMtPmdldEV4cGVjdGVkRXhjZXB0aW9uKCkpIHsKJHRoaXMtPmV4cGVjdEV4Y2VwdGlvbihcUHNyXENvbnRhaW5lclxOb3RGb3VuZEV4Y2VwdGlvbkludGVyZmFjZTo6Y2xhc3MpOwokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uTWVzc2FnZSgnVGhlIHNlcnZpY2UgImZvbyIgaGFzIGEgZGVwZW5kZW5jeSBvbiBhIG5vbi1leGlzdGVudCBzZXJ2aWNlICJiYXIiLiBUaGlzIGxvY2F0b3Igb25seSBrbm93cyBhYm91dCB0aGUgImZvbyIgc2VydmljZS4nKTsKfQokbG9jYXRvciA9ICR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcihbCidmb28nID0+IGZ1bmN0aW9uICgpIHVzZSAoJiRsb2NhdG9yKSB7IHJldHVybiAkbG9jYXRvci0+Z2V0KCdiYXInKTsgfSwKXSk7CgokbG9jYXRvci0+Z2V0KCdmb28nKTsKfQoKcHVibGljIGZ1bmN0aW9uIHRlc3RUaHJvd3NPbkNpcmN1bGFyUmVmZXJlbmNlKCkKewokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uKFxQc3JcQ29udGFpbmVyXENvbnRhaW5lckV4Y2VwdGlvbkludGVyZmFjZTo6Y2xhc3MpOwokdGhpcy0+ZXhwZWN0RXhjZXB0aW9uTWVzc2FnZSgnQ2lyY3VsYXIgcmVmZXJlbmNlIGRldGVjdGVkIGZvciBzZXJ2aWNlICJiYXIiLCBwYXRoOiAiYmFyIC0+IGJheiAtPiBiYXIiLicpOwokbG9jYXRvciA9ICR0aGlzLT5nZXRTZXJ2aWNlTG9jYXRvcihbCidmb28nID0+IGZ1bmN0aW9uICgpIHVzZSAoJiRsb2NhdG9yKSB7IHJldHVybiAkbG9jYXRvci0+Z2V0KCdiYXInKTsgfSwKJ2JhcicgPT4gZnVuY3Rpb24gKCkgdXNlICgmJGxvY2F0b3IpIHsgcmV0dXJuICRsb2NhdG9yLT5nZXQoJ2JheicpOyB9LAonYmF6JyA9PiBmdW5jdGlvbiAoKSB1c2UgKCYkbG9jYXRvcikgeyByZXR1cm4gJGxvY2F0b3ItPmdldCgnYmFyJyk7IH0sCl0pOwoKJGxvY2F0b3ItPmdldCgnZm9vJyk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHJpbmcgaW1wbGVtZW50cyBcU3RyaW5nYWJsZSwgXEpzb25TZXJpYWxpemFibGUKewpwdWJsaWMgY29uc3QgUFJFR19QQVRURVJOX09SREVSID0gXFBSRUdfUEFUVEVSTl9PUkRFUjsKcHVibGljIGNvbnN0IFBSRUdfU0VUX09SREVSID0gXFBSRUdfU0VUX09SREVSOwpwdWJsaWMgY29uc3QgUFJFR19PRkZTRVRfQ0FQVFVSRSA9IFxQUkVHX09GRlNFVF9DQVBUVVJFOwpwdWJsaWMgY29uc3QgUFJFR19VTk1BVENIRURfQVNfTlVMTCA9IFxQUkVHX1VOTUFUQ0hFRF9BU19OVUxMOwoKcHVibGljIGNvbnN0IFBSRUdfU1BMSVQgPSAwOwpwdWJsaWMgY29uc3QgUFJFR19TUExJVF9OT19FTVBUWSA9IFxQUkVHX1NQTElUX05PX0VNUFRZOwpwdWJsaWMgY29uc3QgUFJFR19TUExJVF9ERUxJTV9DQVBUVVJFID0gXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRTsKcHVibGljIGNvbnN0IFBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgPSBcUFJFR19TUExJVF9PRkZTRVRfQ0FQVFVSRTsKCnByb3RlY3RlZCAkc3RyaW5nID0gJyc7CnByb3RlY3RlZCAkaWdub3JlQ2FzZSA9IGZhbHNlOwoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KHN0cmluZyAkc3RyaW5nID0gJycpOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHVud3JhcChhcnJheSAkdmFsdWVzKTogYXJyYXkKewpmb3JlYWNoICgkdmFsdWVzIGFzICRrID0+ICR2KSB7CmlmICgkdiBpbnN0YW5jZW9mIHNlbGYpIHsKJHZhbHVlc1ska10gPSAkdi0+X190b1N0cmluZygpOwp9IGVsc2VpZiAoXGlzX2FycmF5KCR2KSAmJiAkdmFsdWVzWyRrXSAhPT0gJHYgPSBzdGF0aWM6OnVud3JhcCgkdikpIHsKJHZhbHVlc1ska10gPSAkdjsKfQp9CgpyZXR1cm4gJHZhbHVlczsKfQoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIHdyYXAoYXJyYXkgJHZhbHVlcyk6IGFycmF5CnsKJGkgPSAwOwoka2V5cyA9IG51bGw7Cgpmb3JlYWNoICgkdmFsdWVzIGFzICRrID0+ICR2KSB7CmlmIChcaXNfc3RyaW5nKCRrKSAmJiAnJyAhPT0gJGsgJiYgJGsgIT09ICRqID0gKHN0cmluZykgbmV3IHN0YXRpYygkaykpIHsKJGtleXMgPSAka2V5cyA/PyBhcnJheV9rZXlzKCR2YWx1ZXMpOwoka2V5c1skaV0gPSAkajsKfQoKaWYgKFxpc19zdHJpbmcoJHYpKSB7CiR2YWx1ZXNbJGtdID0gbmV3IHN0YXRpYygkdik7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJHYpICYmICR2YWx1ZXNbJGtdICE9PSAkdiA9IHN0YXRpYzo6d3JhcCgkdikpIHsKJHZhbHVlc1ska10gPSAkdjsKfQoKKyskaTsKfQoKcmV0dXJuIG51bGwgIT09ICRrZXlzID8gYXJyYXlfY29tYmluZSgka2V5cywgJHZhbHVlcykgOiAkdmFsdWVzOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZnRlcigkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoKGFycmF5KSAkbmVlZGxlIGFzICRuKSB7CiRuID0gKHN0cmluZykgJG47CiRqID0gJHRoaXMtPmluZGV4T2YoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqIDwgJGkpIHsKJGkgPSAkajsKJHN0ci0+c3RyaW5nID0gJG47Cn0KfQoKaWYgKFxQSFBfSU5UX01BWCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICghJGluY2x1ZGVOZWVkbGUpIHsKJGkgKz0gJHN0ci0+bGVuZ3RoKCk7Cn0KCnJldHVybiAkdGhpcy0+c2xpY2UoJGkpOwp9CgoKCgoKCnB1YmxpYyBmdW5jdGlvbiBhZnRlckxhc3QoJG5lZWRsZSwgYm9vbCAkaW5jbHVkZU5lZWRsZSA9IGZhbHNlLCBpbnQgJG9mZnNldCA9IDApOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokaSA9IG51bGw7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZkxhc3QoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqID49ICRpKSB7CiRpID0gJG9mZnNldCA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAobnVsbCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICghJGluY2x1ZGVOZWVkbGUpIHsKJGkgKz0gJHN0ci0+bGVuZ3RoKCk7Cn0KCnJldHVybiAkdGhpcy0+c2xpY2UoJGkpOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gYXBwZW5kKHN0cmluZyAuLi4kc3VmZml4KTogc2VsZjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJlZm9yZSgkbmVlZGxlLCBib29sICRpbmNsdWRlTmVlZGxlID0gZmFsc2UsIGludCAkb2Zmc2V0ID0gMCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gXFBIUF9JTlRfTUFYOwoKZm9yZWFjaCAoKGFycmF5KSAkbmVlZGxlIGFzICRuKSB7CiRuID0gKHN0cmluZykgJG47CiRqID0gJHRoaXMtPmluZGV4T2YoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqIDwgJGkpIHsKJGkgPSAkajsKJHN0ci0+c3RyaW5nID0gJG47Cn0KfQoKaWYgKFxQSFBfSU5UX01BWCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICgkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgwLCAkaSk7Cn0KCgoKCgoKcHVibGljIGZ1bmN0aW9uIGJlZm9yZUxhc3QoJG5lZWRsZSwgYm9vbCAkaW5jbHVkZU5lZWRsZSA9IGZhbHNlLCBpbnQgJG9mZnNldCA9IDApOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokaSA9IG51bGw7Cgpmb3JlYWNoICgoYXJyYXkpICRuZWVkbGUgYXMgJG4pIHsKJG4gPSAoc3RyaW5nKSAkbjsKJGogPSAkdGhpcy0+aW5kZXhPZkxhc3QoJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqID49ICRpKSB7CiRpID0gJG9mZnNldCA9ICRqOwokc3RyLT5zdHJpbmcgPSAkbjsKfQp9CgppZiAobnVsbCA9PT0gJGkpIHsKcmV0dXJuICRzdHI7Cn0KCmlmICgkaW5jbHVkZU5lZWRsZSkgewokaSArPSAkc3RyLT5sZW5ndGgoKTsKfQoKcmV0dXJuICR0aGlzLT5zbGljZSgwLCAkaSk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBieXRlc0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJHRoaXMtPnNsaWNlKCRvZmZzZXQsIDEpOwoKcmV0dXJuICcnID09PSAkc3RyLT5zdHJpbmcgPyBbXSA6IGFycmF5X3ZhbHVlcyh1bnBhY2soJ0MqJywgJHN0ci0+c3RyaW5nKSk7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBjYW1lbCgpOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGNodW5rKGludCAkbGVuZ3RoID0gMSk6IGFycmF5OwoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbGxhcHNlV2hpdGVzcGFjZSgpOiBzZWxmCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSB0cmltKHByZWdfcmVwbGFjZSgiLyg/OlsgXG5cclx0XHgwQ117Mix9K3xbXG5cclx0XHgwQ10pLyIsICcgJywgJHN0ci0+c3RyaW5nKSwgIiBcblxyXHRceDBDIik7CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvbnRhaW5zQW55KCRuZWVkbGUpOiBib29sCnsKcmV0dXJuIG51bGwgIT09ICR0aGlzLT5pbmRleE9mKCRuZWVkbGUpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZW5kc1dpdGgoJHN1ZmZpeCk6IGJvb2wKewppZiAoIVxpc19hcnJheSgkc3VmZml4KSAmJiAhJHN1ZmZpeCBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdNZXRob2QgIiVzKCkiIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBjbGFzcyAiJXMiIHRvIGRlYWwgd2l0aCBub24taXRlcmFibGUgdmFsdWVzLicsIF9fRlVOQ1RJT05fXywgc3RhdGljOjpjbGFzcykpOwp9Cgpmb3JlYWNoICgkc3VmZml4IGFzICRzKSB7CmlmICgkdGhpcy0+ZW5kc1dpdGgoKHN0cmluZykgJHMpKSB7CnJldHVybiB0cnVlOwp9Cn0KCnJldHVybiBmYWxzZTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVuc3VyZUVuZChzdHJpbmcgJHN1ZmZpeCk6IHNlbGYKewppZiAoISR0aGlzLT5lbmRzV2l0aCgkc3VmZml4KSkgewpyZXR1cm4gJHRoaXMtPmFwcGVuZCgkc3VmZml4KTsKfQoKJHN1ZmZpeCA9IHByZWdfcXVvdGUoJHN1ZmZpeCk7CiRyZWdleCA9ICd7KCcuJHN1ZmZpeC4nKSg/OicuJHN1ZmZpeC4nKSsrJH1EJzsKCnJldHVybiAkdGhpcy0+cmVwbGFjZU1hdGNoZXMoJHJlZ2V4LigkdGhpcy0+aWdub3JlQ2FzZSA/ICdpJyA6ICcnKSwgJyQxJyk7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBlbnN1cmVTdGFydChzdHJpbmcgJHByZWZpeCk6IHNlbGYKewokcHJlZml4ID0gbmV3IHN0YXRpYygkcHJlZml4KTsKCmlmICghJHRoaXMtPnN0YXJ0c1dpdGgoJHByZWZpeCkpIHsKcmV0dXJuICR0aGlzLT5wcmVwZW5kKCRwcmVmaXgpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRpID0gJHByZWZpeExlbiA9ICRwcmVmaXgtPmxlbmd0aCgpOwoKd2hpbGUgKCR0aGlzLT5pbmRleE9mKCRwcmVmaXgsICRpKSA9PT0gJGkpIHsKJHN0ciA9ICRzdHItPnNsaWNlKCRwcmVmaXhMZW4pOwokaSArPSAkcHJlZml4TGVuOwp9CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCFcaXNfYXJyYXkoJHN0cmluZykgJiYgISRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignTWV0aG9kICIlcygpIiBtdXN0IGJlIG92ZXJyaWRkZW4gYnkgY2xhc3MgIiVzIiB0byBkZWFsIHdpdGggbm9uLWl0ZXJhYmxlIHZhbHVlcy4nLCBfX0ZVTkNUSU9OX18sIHN0YXRpYzo6Y2xhc3MpKTsKfQoKZm9yZWFjaCAoJHN0cmluZyBhcyAkcykgewppZiAoJHRoaXMtPmVxdWFsc1RvKChzdHJpbmcpICRzKSkgewpyZXR1cm4gdHJ1ZTsKfQp9CgpyZXR1cm4gZmFsc2U7Cn0KCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBmb2xkZWQoKTogc2VsZjsKCgoKCnB1YmxpYyBmdW5jdGlvbiBpZ25vcmVDYXNlKCk6IHNlbGYKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPmlnbm9yZUNhc2UgPSB0cnVlOwoKcmV0dXJuICRzdHI7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mKCRuZWVkbGUsIGludCAkb2Zmc2V0ID0gMCk6ID9pbnQKewppZiAoIVxpc19hcnJheSgkbmVlZGxlKSAmJiAhJG5lZWRsZSBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdNZXRob2QgIiVzKCkiIG11c3QgYmUgb3ZlcnJpZGRlbiBieSBjbGFzcyAiJXMiIHRvIGRlYWwgd2l0aCBub24taXRlcmFibGUgdmFsdWVzLicsIF9fRlVOQ1RJT05fXywgc3RhdGljOjpjbGFzcykpOwp9CgokaSA9IFxQSFBfSU5UX01BWDsKCmZvcmVhY2ggKCRuZWVkbGUgYXMgJG4pIHsKJGogPSAkdGhpcy0+aW5kZXhPZigoc3RyaW5nKSAkbiwgJG9mZnNldCk7CgppZiAobnVsbCAhPT0gJGogJiYgJGogPCAkaSkgewokaSA9ICRqOwp9Cn0KCnJldHVybiBcUEhQX0lOVF9NQVggPT09ICRpID8gbnVsbCA6ICRpOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICghXGlzX2FycmF5KCRuZWVkbGUpICYmICEkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCiRpID0gbnVsbDsKCmZvcmVhY2ggKCRuZWVkbGUgYXMgJG4pIHsKJGogPSAkdGhpcy0+aW5kZXhPZkxhc3QoKHN0cmluZykgJG4sICRvZmZzZXQpOwoKaWYgKG51bGwgIT09ICRqICYmICRqID49ICRpKSB7CiRpID0gJG9mZnNldCA9ICRqOwp9Cn0KCnJldHVybiAkaTsKfQoKcHVibGljIGZ1bmN0aW9uIGlzRW1wdHkoKTogYm9vbAp7CnJldHVybiAnJyA9PT0gJHRoaXMtPnN0cmluZzsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGpvaW4oYXJyYXkgJHN0cmluZ3MsID9zdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHNlbGY7CgpwdWJsaWMgZnVuY3Rpb24ganNvblNlcmlhbGl6ZSgpOiBzdHJpbmcKewpyZXR1cm4gJHRoaXMtPnN0cmluZzsKfQoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQ7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbG93ZXIoKTogc2VsZjsKCgoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gbWF0Y2goc3RyaW5nICRyZWdleHAsIGludCAkZmxhZ3MgPSAwLCBpbnQgJG9mZnNldCA9IDApOiBhcnJheTsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcGFkU3RhcnQoaW50ICRsZW5ndGgsIHN0cmluZyAkcGFkU3RyID0gJyAnKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBwcmVwZW5kKHN0cmluZyAuLi4kcHJlZml4KTogc2VsZjsKCgoKCnB1YmxpYyBmdW5jdGlvbiByZXBlYXQoaW50ICRtdWx0aXBsaWVyKTogc2VsZgp7CmlmICgwID4gJG11bHRpcGxpZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdNdWx0aXBsaWVyIG11c3QgYmUgcG9zaXRpdmUsICVkIGdpdmVuLicsICRtdWx0aXBsaWVyKSk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3JlcGVhdCgkc3RyLT5zdHJpbmcsICRtdWx0aXBsaWVyKTsKCnJldHVybiAkc3RyOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZShzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8pOiBzZWxmOwoKCgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBzZWxmOwoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHJldmVyc2UoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gc25ha2UoKTogc2VsZjsKCgoKCmFic3RyYWN0IHB1YmxpYyBmdW5jdGlvbiBzcGxpY2Uoc3RyaW5nICRyZXBsYWNlbWVudCwgaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBzZWxmOwoKCgoKcHVibGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkZGVsaW1pdGVyLCA/aW50ICRsaW1pdCA9IG51bGwsID9pbnQgJGZsYWdzID0gbnVsbCk6IGFycmF5CnsKaWYgKG51bGwgPT09ICRmbGFncykgewp0aHJvdyBuZXcgXFR5cGVFcnJvcignU3BsaXQgYmVoYXZpb3Igd2hlbiAkZmxhZ3MgaXMgbnVsbCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGNoaWxkIGNsYXNzZXMuJyk7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewokZGVsaW1pdGVyIC49ICdpJzsKfQoKc2V0X2Vycm9yX2hhbmRsZXIoc3RhdGljIGZ1bmN0aW9uICgkdCwgJG0pIHsgdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkbSk7IH0pOwoKdHJ5IHsKaWYgKGZhbHNlID09PSAkY2h1bmtzID0gcHJlZ19zcGxpdCgkZGVsaW1pdGVyLCAkdGhpcy0+c3RyaW5nLCAkbGltaXQsICRmbGFncykpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU3BsaXR0aW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignU3BsaXR0aW5nIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3IgY29kZS4nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwoKaWYgKHNlbGY6OlBSRUdfU1BMSVRfT0ZGU0VUX0NBUFRVUkUgJiAkZmxhZ3MpIHsKZm9yZWFjaCAoJGNodW5rcyBhcyAmJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVua1swXTsKJGNodW5rWzBdID0gY2xvbmUgJHN0cjsKfQp9IGVsc2Ugewpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmsgPSBjbG9uZSAkc3RyOwp9Cn0KCnJldHVybiAkY2h1bmtzOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICghXGlzX2FycmF5KCRwcmVmaXgpICYmICEkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnRocm93IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ01ldGhvZCAiJXMoKSIgbXVzdCBiZSBvdmVycmlkZGVuIGJ5IGNsYXNzICIlcyIgdG8gZGVhbCB3aXRoIG5vbi1pdGVyYWJsZSB2YWx1ZXMuJywgX19GVU5DVElPTl9fLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCmZvcmVhY2ggKCRwcmVmaXggYXMgJHByZWZpeCkgewppZiAoJHRoaXMtPnN0YXJ0c1dpdGgoKHN0cmluZykgJHByZWZpeCkpIHsKcmV0dXJuIHRydWU7Cn0KfQoKcmV0dXJuIGZhbHNlOwp9CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdGl0bGUoYm9vbCAkYWxsV29yZHMgPSBmYWxzZSk6IHNlbGY7CgpwdWJsaWMgZnVuY3Rpb24gdG9CeXRlU3RyaW5nKD9zdHJpbmcgJHRvRW5jb2RpbmcgPSBudWxsKTogQnl0ZVN0cmluZwp7CiRiID0gbmV3IEJ5dGVTdHJpbmcoKTsKCiR0b0VuY29kaW5nID0gXGluX2FycmF5KCR0b0VuY29kaW5nLCBbJ3V0ZjgnLCAndXRmLTgnLCAnVVRGOCddLCB0cnVlKSA/ICdVVEYtOCcgOiAkdG9FbmNvZGluZzsKCmlmIChudWxsID09PSAkdG9FbmNvZGluZyB8fCAkdG9FbmNvZGluZyA9PT0gJGZyb21FbmNvZGluZyA9ICR0aGlzIGluc3RhbmNlb2YgQWJzdHJhY3RVbmljb2RlU3RyaW5nIHx8IHByZWdfbWF0Y2goJy8vdScsICRiLT5zdHJpbmcpID8gJ1VURi04JyA6ICdXaW5kb3dzLTEyNTInKSB7CiRiLT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKcmV0dXJuICRiOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewp0cnkgewokYi0+c3RyaW5nID0gbWJfY29udmVydF9lbmNvZGluZygkdGhpcy0+c3RyaW5nLCAkdG9FbmNvZGluZywgJ1VURi04Jyk7Cn0gY2F0Y2ggKEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbnxcVmFsdWVFcnJvciAkZSkgewppZiAoIVxmdW5jdGlvbl9leGlzdHMoJ2ljb252JykpIHsKaWYgKCRlIGluc3RhbmNlb2YgXFZhbHVlRXJyb3IpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbigkZS0+Z2V0TWVzc2FnZSgpLCAkZS0+Z2V0Q29kZSgpLCAkZSk7Cn0KdGhyb3cgJGU7Cn0KCiRiLT5zdHJpbmcgPSBpY29udignVVRGLTgnLCAkdG9FbmNvZGluZywgJHRoaXMtPnN0cmluZyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCnJldHVybiAkYjsKfQoKcHVibGljIGZ1bmN0aW9uIHRvQ29kZVBvaW50U3RyaW5nKCk6IENvZGVQb2ludFN0cmluZwp7CnJldHVybiBuZXcgQ29kZVBvaW50U3RyaW5nKCR0aGlzLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gdG9TdHJpbmcoKTogc3RyaW5nCnsKcmV0dXJuICR0aGlzLT5zdHJpbmc7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b1VuaWNvZGVTdHJpbmcoKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkdGhpcy0+c3RyaW5nKTsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHRyaW0oc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9Iik6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogc2VsZjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRyaW1QcmVmaXgoJHByZWZpeCk6IHNlbGYKewppZiAoXGlzX2FycmF5KCRwcmVmaXgpIHx8ICRwcmVmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKZm9yZWFjaCAoJHByZWZpeCBhcyAkcykgewokdCA9ICR0aGlzLT50cmltUHJlZml4KCRzKTsKCmlmICgkdC0+c3RyaW5nICE9PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiAkdDsKfQp9CgpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkcHJlZml4IGluc3RhbmNlb2Ygc2VsZikgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2UgewokcHJlZml4ID0gKHN0cmluZykgJHByZWZpeDsKfQoKaWYgKCcnICE9PSAkcHJlZml4ICYmIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkcHJlZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkcHJlZml4LCAwLCBcc3RybGVuKCRwcmVmaXgpLCAkdGhpcy0+aWdub3JlQ2FzZSkpIHsKJHN0ci0+c3RyaW5nID0gc3Vic3RyKCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHByZWZpeCkpOwp9CgpyZXR1cm4gJHN0cjsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogc2VsZjsKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdWZmaXgoJHN1ZmZpeCk6IHNlbGYKewppZiAoXGlzX2FycmF5KCRzdWZmaXgpIHx8ICRzdWZmaXggaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKZm9yZWFjaCAoJHN1ZmZpeCBhcyAkcykgewokdCA9ICR0aGlzLT50cmltU3VmZml4KCRzKTsKCmlmICgkdC0+c3RyaW5nICE9PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiAkdDsKfQp9CgpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkc3VmZml4IGluc3RhbmNlb2Ygc2VsZikgewokc3VmZml4ID0gJHN1ZmZpeC0+c3RyaW5nOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKaWYgKCcnICE9PSAkc3VmZml4ICYmIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkc3VmZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkc3VmZml4LCAtXHN0cmxlbigkc3VmZml4KSwgbnVsbCwgJHRoaXMtPmlnbm9yZUNhc2UpKSB7CiRzdHItPnN0cmluZyA9IHN1YnN0cigkdGhpcy0+c3RyaW5nLCAwLCAtXHN0cmxlbigkc3VmZml4KSk7Cn0KCnJldHVybiAkc3RyOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gdHJ1bmNhdGUoaW50ICRsZW5ndGgsIHN0cmluZyAkZWxsaXBzaXMgPSAnJywgYm9vbCAkY3V0ID0gdHJ1ZSk6IHNlbGYKewokc3RyaW5nTGVuZ3RoID0gJHRoaXMtPmxlbmd0aCgpOwoKaWYgKCRzdHJpbmdMZW5ndGggPD0gJGxlbmd0aCkgewpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRlbGxpcHNpc0xlbmd0aCA9ICcnICE9PSAkZWxsaXBzaXMgPyAobmV3IHN0YXRpYygkZWxsaXBzaXMpKS0+bGVuZ3RoKCkgOiAwOwoKaWYgKCRsZW5ndGggPCAkZWxsaXBzaXNMZW5ndGgpIHsKJGVsbGlwc2lzTGVuZ3RoID0gMDsKfQoKaWYgKCEkY3V0KSB7CmlmIChudWxsID09PSAkbGVuZ3RoID0gJHRoaXMtPmluZGV4T2YoWycgJywgIlxyIiwgIlxuIiwgIlx0Il0sICgkbGVuZ3RoID86IDEpIC0gMSkpIHsKcmV0dXJuIGNsb25lICR0aGlzOwp9CgokbGVuZ3RoICs9ICRlbGxpcHNpc0xlbmd0aDsKfQoKJHN0ciA9ICR0aGlzLT5zbGljZSgwLCAkbGVuZ3RoIC0gJGVsbGlwc2lzTGVuZ3RoKTsKCnJldHVybiAkZWxsaXBzaXNMZW5ndGggPyAkc3RyLT50cmltRW5kKCktPmFwcGVuZCgkZWxsaXBzaXMpIDogJHN0cjsKfQoKCgoKYWJzdHJhY3QgcHVibGljIGZ1bmN0aW9uIHVwcGVyKCk6IHNlbGY7CgoKCgphYnN0cmFjdCBwdWJsaWMgZnVuY3Rpb24gd2lkdGgoYm9vbCAkaWdub3JlQW5zaURlY29yYXRpb24gPSB0cnVlKTogaW50OwoKCgoKcHVibGljIGZ1bmN0aW9uIHdvcmR3cmFwKGludCAkd2lkdGggPSA3NSwgc3RyaW5nICRicmVhayA9ICJcbiIsIGJvb2wgJGN1dCA9IGZhbHNlKTogc2VsZgp7CiRsaW5lcyA9ICcnICE9PSAkYnJlYWsgPyAkdGhpcy0+c3BsaXQoJGJyZWFrKSA6IFtjbG9uZSAkdGhpc107CiRjaGFycyA9IFtdOwokbWFzayA9ICcnOwoKaWYgKDEgPT09IFxjb3VudCgkbGluZXMpICYmICcnID09PSAkbGluZXNbMF0tPnN0cmluZykgewpyZXR1cm4gJGxpbmVzWzBdOwp9Cgpmb3JlYWNoICgkbGluZXMgYXMgJGkgPT4gJGxpbmUpIHsKaWYgKCRpKSB7CiRjaGFyc1tdID0gJGJyZWFrOwokbWFzayAuPSAnIyc7Cn0KCmZvcmVhY2ggKCRsaW5lLT5jaHVuaygpIGFzICRjaGFyKSB7CiRjaGFyc1tdID0gJGNoYXItPnN0cmluZzsKJG1hc2sgLj0gJyAnID09PSAkY2hhci0+c3RyaW5nID8gJyAnIDogJz8nOwp9Cn0KCiRzdHJpbmcgPSAnJzsKJGogPSAwOwokYiA9ICRpID0gLTE7CiRtYXNrID0gd29yZHdyYXAoJG1hc2ssICR3aWR0aCwgJyMnLCAkY3V0KTsKCndoaWxlIChmYWxzZSAhPT0gJGIgPSBzdHJwb3MoJG1hc2ssICcjJywgJGIgKyAxKSkgewpmb3IgKCsrJGk7ICRpIDwgJGI7ICsrJGkpIHsKJHN0cmluZyAuPSAkY2hhcnNbJGpdOwp1bnNldCgkY2hhcnNbJGorK10pOwp9CgppZiAoJGJyZWFrID09PSAkY2hhcnNbJGpdIHx8ICcgJyA9PT0gJGNoYXJzWyRqXSkgewp1bnNldCgkY2hhcnNbJGorK10pOwp9Cgokc3RyaW5nIC49ICRicmVhazsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkc3RyaW5nLmltcGxvZGUoJycsICRjaGFycyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIF9fc2xlZXAoKTogYXJyYXkKewpyZXR1cm4gWydzdHJpbmcnXTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fY2xvbmUoKQp7CiR0aGlzLT5pZ25vcmVDYXNlID0gZmFsc2U7Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3RvU3RyaW5nKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+c3RyaW5nOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmc7Cgp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxFeGNlcHRpb25JbnRlcmZhY2U7CnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbjsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cUnVudGltZUV4Y2VwdGlvbjsKCgoKCgoKCgoKCgoKYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RVbmljb2RlU3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmcKewpwdWJsaWMgY29uc3QgTkZDID0gXE5vcm1hbGl6ZXI6Ok5GQzsKcHVibGljIGNvbnN0IE5GRCA9IFxOb3JtYWxpemVyOjpORkQ7CnB1YmxpYyBjb25zdCBORktDID0gXE5vcm1hbGl6ZXI6Ok5GS0M7CnB1YmxpYyBjb25zdCBORktEID0gXE5vcm1hbGl6ZXI6Ok5GS0Q7CgoKcHJpdmF0ZSBjb25zdCBBU0NJSSA9ICJceDIwXHg2NVx4NjlceDYxXHg3M1x4NkVceDc0XHg3Mlx4NkZceDZDXHg3NVx4NjRceDVEXHg1Qlx4NjNceDZEXHg3MFx4MjdceDBBXHg2N1x4N0NceDY4XHg3Nlx4MkVceDY2XHg2Mlx4MkNceDNBXHgzRFx4MkRceDcxXHgzMVx4MzBceDQzXHgzMlx4MkFceDc5XHg3OFx4MjlceDI4XHg0Q1x4MzlceDQxXHg1M1x4MkZceDUwXHgyMlx4NDVceDZBXHg0RFx4NDlceDZCXHgzM1x4M0VceDM1XHg1NFx4M0NceDQ0XHgzNFx4N0RceDQyXHg3Qlx4MzhceDQ2XHg3N1x4NTJceDM2XHgzN1x4NTVceDQ3XHg0RVx4M0JceDRBXHg3QVx4NTZceDIzXHg0OFx4NEZceDU3XHg1Rlx4MjZceDIxXHg0Qlx4M0ZceDU4XHg1MVx4MjVceDU5XHg1Q1x4MDlceDVBXHgyQlx4N0VceDVFXHgyNFx4NDBceDYwXHg3Rlx4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx4MEJceDBDXHgwRFx4MEVceDBGXHgxMFx4MTFceDEyXHgxM1x4MTRceDE1XHgxNlx4MTdceDE4XHgxOVx4MUFceDFCXHgxQ1x4MURceDFFXHgxRiI7CgoKcHJpdmF0ZSBjb25zdCBGT0xEX0ZST00gPSBbJ8SwJywgJ8K1JywgJ8W/JywgIlx4Q0RceDg1IiwgJ8+CJywgJ8+QJywgJ8+RJywgJ8+VJywgJ8+WJywgJ8+wJywgJ8+xJywgJ8+1JywgJ+G6mycsICJceEUxXHhCRVx4QkUiLCAnw58nLCAnxYknLCAnx7AnLCAnzpAnLCAnzrAnLCAn1ocnLCAn4bqWJywgJ+G6lycsICfhupgnLCAn4bqZJywgJ+G6micsICfhup4nLCAn4b2QJywgJ+G9kicsICfhvZQnLCAn4b2WJywgJ+G+gCcsICfhvoEnLCAn4b6CJywgJ+G+gycsICfhvoQnLCAn4b6FJywgJ+G+hicsICfhvocnLCAn4b6IJywgJ+G+iScsICfhvoonLCAn4b6LJywgJ+G+jCcsICfhvo0nLCAn4b6OJywgJ+G+jycsICfhvpAnLCAn4b6RJywgJ+G+kicsICfhvpMnLCAn4b6UJywgJ+G+lScsICfhvpYnLCAn4b6XJywgJ+G+mCcsICfhvpknLCAn4b6aJywgJ+G+mycsICfhvpwnLCAn4b6dJywgJ+G+nicsICfhvp8nLCAn4b6gJywgJ+G+oScsICfhvqInLCAn4b6jJywgJ+G+pCcsICfhvqUnLCAn4b6mJywgJ+G+pycsICfhvqgnLCAn4b6pJywgJ+G+qicsICfhvqsnLCAn4b6sJywgJ+G+rScsICfhvq4nLCAn4b6vJywgJ+G+sicsICfhvrMnLCAn4b60JywgJ+G+ticsICfhvrcnLCAn4b68JywgJ+G/gicsICfhv4MnLCAn4b+EJywgJ+G/hicsICfhv4cnLCAn4b+MJywgJ+G/kicsICfhv5YnLCAn4b+XJywgJ+G/oicsICfhv6QnLCAn4b+mJywgJ+G/pycsICfhv7InLCAn4b+zJywgJ+G/tCcsICfhv7YnLCAn4b+3JywgJ+G/vCcsICfvrIAnLCAn76yBJywgJ++sgicsICfvrIMnLCAn76yEJywgJ++shScsICfvrIYnLCAn76yTJywgJ++slCcsICfvrJUnLCAn76yWJywgJ++slyddOwpwcml2YXRlIGNvbnN0IEZPTERfVE8gPSBbJ2nMhycsICfOvCcsICdzJywgJ865JywgJ8+DJywgJ86yJywgJ864JywgJ8+GJywgJ8+AJywgJ866JywgJ8+BJywgJ861JywgJ+G5oScsICfOuScsICdzcycsICfKvG4nLCAnx7AnLCAnzpAnLCAnzrAnLCAn1aXWgicsICfhupYnLCAn4bqXJywgJ+G6mCcsICfhupknLCAnYcq+JywgJ3NzJywgJ+G9kCcsICfhvZInLCAn4b2UJywgJ+G9licsICfhvIDOuScsICfhvIHOuScsICfhvILOuScsICfhvIPOuScsICfhvITOuScsICfhvIXOuScsICfhvIbOuScsICfhvIfOuScsICfhvIDOuScsICfhvIHOuScsICfhvILOuScsICfhvIPOuScsICfhvITOuScsICfhvIXOuScsICfhvIbOuScsICfhvIfOuScsICfhvKDOuScsICfhvKHOuScsICfhvKLOuScsICfhvKPOuScsICfhvKTOuScsICfhvKXOuScsICfhvKbOuScsICfhvKfOuScsICfhvKDOuScsICfhvKHOuScsICfhvKLOuScsICfhvKPOuScsICfhvKTOuScsICfhvKXOuScsICfhvKbOuScsICfhvKfOuScsICfhvaDOuScsICfhvaHOuScsICfhvaLOuScsICfhvaPOuScsICfhvaTOuScsICfhvaXOuScsICfhvabOuScsICfhvafOuScsICfhvaDOuScsICfhvaHOuScsICfhvaLOuScsICfhvaPOuScsICfhvaTOuScsICfhvaXOuScsICfhvabOuScsICfhvafOuScsICfhvbDOuScsICfOsc65JywgJ86szrknLCAn4b62JywgJ+G+ts65JywgJ86xzrknLCAn4b20zrknLCAnzrfOuScsICfOrs65JywgJ+G/hicsICfhv4bOuScsICfOt865JywgJ+G/kicsICfhv5YnLCAn4b+XJywgJ+G/oicsICfhv6QnLCAn4b+mJywgJ+G/pycsICfhvbzOuScsICfPic65JywgJ8+OzrknLCAn4b+2JywgJ+G/ts65JywgJ8+JzrknLCAnZmYnLCAnZmknLCAnZmwnLCAnZmZpJywgJ2ZmbCcsICdzdCcsICdzdCcsICfVtNW2JywgJ9W01aUnLCAn1bTVqycsICfVvtW2JywgJ9W01a0nXTsKCgpwcml2YXRlIGNvbnN0IFVQUEVSX0ZST00gPSBbJ8OfJywgJ++sgCcsICfvrIEnLCAn76yCJywgJ++sgycsICfvrIQnLCAn76yFJywgJ++shicsICfWhycsICfvrJMnLCAn76yUJywgJ++slScsICfvrJYnLCAn76yXJywgJ8WJJywgJ86QJywgJ86wJywgJ8ewJywgJ+G6licsICfhupcnLCAn4bqYJywgJ+G6mScsICfhuponLCAn4b2QJywgJ+G9kicsICfhvZQnLCAn4b2WJywgJ+G+ticsICfhv4YnLCAn4b+SJywgJ+G/kycsICfhv5YnLCAn4b+XJywgJ+G/oicsICfhv6MnLCAn4b+kJywgJ+G/picsICfhv6cnLCAn4b+2J107CnByaXZhdGUgY29uc3QgVVBQRVJfVE8gPSBbJ1NTJywgJ0ZGJywgJ0ZJJywgJ0ZMJywgJ0ZGSScsICdGRkwnLCAnU1QnLCAnU1QnLCAn1LXVkicsICfVhNWGJywgJ9WE1LUnLCAn1YTUuycsICfVjtWGJywgJ9WE1L0nLCAnyrxOJywgJ86ZzIjMgScsICfOpcyIzIEnLCAnSsyMJywgJ0jMsScsICdUzIgnLCAnV8yKJywgJ1nMiicsICdByr4nLCAnzqXMkycsICfOpcyTzIAnLCAnzqXMk8yBJywgJ86lzJPNgicsICfOkc2CJywgJ86XzYInLCAnzpnMiMyAJywgJ86ZzIjMgScsICfOmc2CJywgJ86ZzIjNgicsICfOpcyIzIAnLCAnzqXMiMyBJywgJ86hzJMnLCAnzqXNgicsICfOpcyIzYInLCAnzqnNgiddOwoKCnByaXZhdGUgY29uc3QgVFJBTlNMSVRfRlJPTSA9IFsnw4YnLCAnw5AnLCAnw5gnLCAnw54nLCAnw58nLCAnw6YnLCAnw7AnLCAnw7gnLCAnw74nLCAnxJAnLCAnxJEnLCAnxKYnLCAnxKcnLCAnxLEnLCAnxLgnLCAnxL8nLCAnxYAnLCAnxYEnLCAnxYInLCAnxYknLCAnxYonLCAnxYsnLCAnxZInLCAnxZMnLCAnxaYnLCAnxacnLCAnxoAnLCAnxoEnLCAnxoInLCAnxoMnLCAnxocnLCAnxognLCAnxoknLCAnxoonLCAnxosnLCAnxownLCAnxpAnLCAnxpEnLCAnxpInLCAnxpMnLCAnxpUnLCAnxpYnLCAnxpcnLCAnxpgnLCAnxpknLCAnxponLCAnxp0nLCAnxp4nLCAnxqInLCAnxqMnLCAnxqQnLCAnxqUnLCAnxqsnLCAnxqwnLCAnxq0nLCAnxq4nLCAnxrInLCAnxrMnLCAnxrQnLCAnxrUnLCAnxrYnLCAnx4QnLCAnx4UnLCAnx4YnLCAnx6QnLCAnx6UnLCAnyKEnLCAnyKQnLCAnyKUnLCAnyLQnLCAnyLUnLCAnyLYnLCAnyLcnLCAnyLgnLCAnyLknLCAnyLonLCAnyLsnLCAnyLwnLCAnyL0nLCAnyL4nLCAnyL8nLCAnyYAnLCAnyYMnLCAnyYQnLCAnyYYnLCAnyYcnLCAnyYgnLCAnyYknLCAnyYwnLCAnyY0nLCAnyY4nLCAnyY8nLCAnyZMnLCAnyZUnLCAnyZYnLCAnyZcnLCAnyZsnLCAnyZ8nLCAnyaAnLCAnyaEnLCAnyaInLCAnyaYnLCAnyacnLCAnyagnLCAnyaonLCAnyasnLCAnyawnLCAnya0nLCAnybEnLCAnybInLCAnybMnLCAnybQnLCAnybYnLCAnybwnLCAnyb0nLCAnyb4nLCAnyoAnLCAnyoInLCAnyognLCAnyoknLCAnyosnLCAnyo8nLCAnypAnLCAnypEnLCAnypknLCAnypsnLCAnypwnLCAnyp0nLCAnyp8nLCAnyqAnLCAnyqMnLCAnyqUnLCAnyqYnLCAnyqonLCAnyqsnLCAn4bSAJywgJ+G0gScsICfhtIMnLCAn4bSEJywgJ+G0hScsICfhtIYnLCAn4bSHJywgJ+G0iicsICfhtIsnLCAn4bSMJywgJ+G0jScsICfhtI8nLCAn4bSYJywgJ+G0mycsICfhtJwnLCAn4bSgJywgJ+G0oScsICfhtKInLCAn4bWrJywgJ+G1rCcsICfhta0nLCAn4bWuJywgJ+G1rycsICfhtbAnLCAn4bWxJywgJ+G1sicsICfhtbMnLCAn4bW0JywgJ+G1tScsICfhtbYnLCAn4bW6JywgJ+G1uycsICfhtb0nLCAn4bW+JywgJ+G2gCcsICfhtoEnLCAn4baCJywgJ+G2gycsICfhtoQnLCAn4baFJywgJ+G2hicsICfhtocnLCAn4baIJywgJ+G2iScsICfhtoonLCAn4baMJywgJ+G2jScsICfhto4nLCAn4baPJywgJ+G2kScsICfhtpInLCAn4baTJywgJ+G2licsICfhtpknLCAn4bqaJywgJ+G6nCcsICfhup0nLCAn4bqeJywgJ+G7uicsICfhu7snLCAn4bu8JywgJ+G7vScsICfhu74nLCAn4bu/JywgJ8KpJywgJ8KuJywgJ+KCoCcsICfigqInLCAn4oKjJywgJ+KCpCcsICfigqcnLCAn4oK6JywgJ+KCuScsICfihIwnLCAn4oSeJywgJ+OOpycsICfjjq4nLCAn44+GJywgJ+OPlycsICfjj54nLCAn44+fJywgJ8K8JywgJ8K9JywgJ8K+JywgJ+KFkycsICfihZQnLCAn4oWVJywgJ+KFlicsICfihZcnLCAn4oWYJywgJ+KFmScsICfihZonLCAn4oWbJywgJ+KFnCcsICfihZ0nLCAn4oWeJywgJ+KFnycsICfjgIcnLCAn4oCYJywgJ+KAmScsICfigJonLCAn4oCbJywgJ+KAnCcsICfigJ0nLCAn4oCeJywgJ+KAnycsICfigLInLCAn4oCzJywgJ+OAnScsICfjgJ4nLCAnwqsnLCAnwrsnLCAn4oC5JywgJ+KAuicsICfigJAnLCAn4oCRJywgJ+KAkicsICfigJMnLCAn4oCUJywgJ+KAlScsICfvuLEnLCAn77iyJywgJ++5mCcsICfigJYnLCAn4oGEJywgJ+KBhScsICfigYYnLCAn4oGOJywgJ+OAgScsICfjgIInLCAn44CIJywgJ+OAiScsICfjgIonLCAn44CLJywgJ+OAlCcsICfjgJUnLCAn44CYJywgJ+OAmScsICfjgJonLCAn44CbJywgJ++4kScsICfvuJInLCAn77i5JywgJ++4uicsICfvuL0nLCAn77i+JywgJ++4vycsICfvuYAnLCAn77mRJywgJ++5nScsICfvuZ4nLCAn772fJywgJ++9oCcsICfvvaEnLCAn772kJywgJ8OXJywgJ8O3JywgJ+KIkicsICfiiJUnLCAn4oiWJywgJ+KIoycsICfiiKUnLCAn4omqJywgJ+KJqycsICfipoUnLCAn4qaGJ107CnByaXZhdGUgY29uc3QgVFJBTlNMSVRfVE8gPSBbJ0FFJywgJ0QnLCAnTycsICdUSCcsICdzcycsICdhZScsICdkJywgJ28nLCAndGgnLCAnRCcsICdkJywgJ0gnLCAnaCcsICdpJywgJ3EnLCAnTCcsICdsJywgJ0wnLCAnbCcsICdcJ24nLCAnTicsICduJywgJ09FJywgJ29lJywgJ1QnLCAndCcsICdiJywgJ0InLCAnQicsICdiJywgJ0MnLCAnYycsICdEJywgJ0QnLCAnRCcsICdkJywgJ0UnLCAnRicsICdmJywgJ0cnLCAnaHYnLCAnSScsICdJJywgJ0snLCAnaycsICdsJywgJ04nLCAnbicsICdPSScsICdvaScsICdQJywgJ3AnLCAndCcsICdUJywgJ3QnLCAnVCcsICdWJywgJ1knLCAneScsICdaJywgJ3onLCAnRFonLCAnRHonLCAnZHonLCAnRycsICdnJywgJ2QnLCAnWicsICd6JywgJ2wnLCAnbicsICd0JywgJ2onLCAnZGInLCAncXAnLCAnQScsICdDJywgJ2MnLCAnTCcsICdUJywgJ3MnLCAneicsICdCJywgJ1UnLCAnRScsICdlJywgJ0onLCAnaicsICdSJywgJ3InLCAnWScsICd5JywgJ2InLCAnYycsICdkJywgJ2QnLCAnZScsICdqJywgJ2cnLCAnZycsICdHJywgJ2gnLCAnaCcsICdpJywgJ0knLCAnbCcsICdsJywgJ2wnLCAnbScsICduJywgJ24nLCAnTicsICdPRScsICdyJywgJ3InLCAncicsICdSJywgJ3MnLCAndCcsICd1JywgJ3YnLCAnWScsICd6JywgJ3onLCAnQicsICdHJywgJ0gnLCAnaicsICdMJywgJ3EnLCAnZHonLCAnZHonLCAndHMnLCAnbHMnLCAnbHonLCAnQScsICdBRScsICdCJywgJ0MnLCAnRCcsICdEJywgJ0UnLCAnSicsICdLJywgJ0wnLCAnTScsICdPJywgJ1AnLCAnVCcsICdVJywgJ1YnLCAnVycsICdaJywgJ3VlJywgJ2InLCAnZCcsICdmJywgJ20nLCAnbicsICdwJywgJ3InLCAncicsICdzJywgJ3QnLCAneicsICd0aCcsICdJJywgJ3AnLCAnVScsICdiJywgJ2QnLCAnZicsICdnJywgJ2snLCAnbCcsICdtJywgJ24nLCAncCcsICdyJywgJ3MnLCAndicsICd4JywgJ3onLCAnYScsICdkJywgJ2UnLCAnZScsICdpJywgJ3UnLCAnYScsICdzJywgJ3MnLCAnU1MnLCAnTEwnLCAnbGwnLCAnVicsICd2JywgJ1knLCAneScsICcoQyknLCAnKFIpJywgJ0NFJywgJ0NyJywgJ0ZyLicsICdMLicsICdQdHMnLCAnVEwnLCAnUnMnLCAneCcsICdSeCcsICdtL3MnLCAncmFkL3MnLCAnQy9rZycsICdwSCcsICdWL20nLCAnQS9tJywgJyAxLzQnLCAnIDEvMicsICcgMy80JywgJyAxLzMnLCAnIDIvMycsICcgMS81JywgJyAyLzUnLCAnIDMvNScsICcgNC81JywgJyAxLzYnLCAnIDUvNicsICcgMS84JywgJyAzLzgnLCAnIDUvOCcsICcgNy84JywgJyAxLycsICcwJywgJ1wnJywgJ1wnJywgJywnLCAnXCcnLCAnIicsICciJywgJywsJywgJyInLCAnXCcnLCAnIicsICciJywgJyInLCAnPDwnLCAnPj4nLCAnPCcsICc+JywgJy0nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJy0nLCAnLScsICctJywgJ3x8JywgJy8nLCAnWycsICddJywgJyonLCAnLCcsICcuJywgJzwnLCAnPicsICc8PCcsICc+PicsICdbJywgJ10nLCAnWycsICddJywgJ1snLCAnXScsICcsJywgJy4nLCAnWycsICddJywgJzw8JywgJz4+JywgJzwnLCAnPicsICcsJywgJ1snLCAnXScsICcoKCcsICcpKScsICcuJywgJywnLCAnKicsICcvJywgJy0nLCAnLycsICdcXCcsICd8JywgJ3x8JywgJzw8JywgJz4+JywgJygoJywgJykpJ107Cgpwcml2YXRlIHN0YXRpYyAkdHJhbnNsaXRlcmF0b3JzID0gW107CnByaXZhdGUgc3RhdGljICR0YWJsZVplcm87CnByaXZhdGUgc3RhdGljICR0YWJsZVdpZGU7CgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21Db2RlUG9pbnRzKGludCAuLi4kY29kZXMpOiBzZWxmCnsKJHN0cmluZyA9ICcnOwoKZm9yZWFjaCAoJGNvZGVzIGFzICRjb2RlKSB7CmlmICgweDgwID4gJGNvZGUgJT0gMHgyMDAwMDApIHsKJHN0cmluZyAuPSBcY2hyKCRjb2RlKTsKfSBlbHNlaWYgKDB4ODAwID4gJGNvZGUpIHsKJHN0cmluZyAuPSBcY2hyKDB4QzAgfCAkY29kZSA+PiA2KS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2VpZiAoMHgxMDAwMCA+ICRjb2RlKSB7CiRzdHJpbmcgLj0gXGNocigweEUwIHwgJGNvZGUgPj4gMTIpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9IGVsc2Ugewokc3RyaW5nIC49IFxjaHIoMHhGMCB8ICRjb2RlID4+IDE4KS5cY2hyKDB4ODAgfCAkY29kZSA+PiAxMiAmIDB4M0YpLlxjaHIoMHg4MCB8ICRjb2RlID4+IDYgJiAweDNGKS5cY2hyKDB4ODAgfCAkY29kZSAmIDB4M0YpOwp9Cn0KCnJldHVybiBuZXcgc3RhdGljKCRzdHJpbmcpOwp9CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIGFzY2lpKGFycmF5ICRydWxlcyA9IFtdKTogc2VsZgp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHMgPSAkc3RyLT5zdHJpbmc7CiRzdHItPnN0cmluZyA9ICcnOwoKYXJyYXlfdW5zaGlmdCgkcnVsZXMsICduZmQnKTsKJHJ1bGVzW10gPSAnbGF0aW4tYXNjaWknOwoKaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3RyYW5zbGl0ZXJhdG9yX3RyYW5zbGl0ZXJhdGUnKSkgewokcnVsZXNbXSA9ICdhbnktbGF0aW4vYmduJzsKfQoKJHJ1bGVzW10gPSAnbmZrZCc7CiRydWxlc1tdID0gJ1s6bm9uc3BhY2luZyBtYXJrOl0gcmVtb3ZlJzsKCndoaWxlIChcc3RybGVuKCRzKSAtIDEgPiAkaSA9IHN0cnNwbigkcywgc2VsZjo6QVNDSUkpKSB7CmlmICgwIDwgLS0kaSkgewokc3RyLT5zdHJpbmcgLj0gc3Vic3RyKCRzLCAwLCAkaSk7CiRzID0gc3Vic3RyKCRzLCAkaSk7Cn0KCmlmICghJHJ1bGUgPSBhcnJheV9zaGlmdCgkcnVsZXMpKSB7CiRydWxlcyA9IFtdOyAKfQoKaWYgKCRydWxlIGluc3RhbmNlb2YgXFRyYW5zbGl0ZXJhdG9yKSB7CiRzID0gJHJ1bGUtPnRyYW5zbGl0ZXJhdGUoJHMpOwp9IGVsc2VpZiAoJHJ1bGUgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokcyA9ICRydWxlKCRzKTsKfSBlbHNlaWYgKCRydWxlKSB7CmlmICgnbmZkJyA9PT0gJHJ1bGUgPSBzdHJ0b2xvd2VyKCRydWxlKSkgewpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHMsIHNlbGY6Ok5GRCkgPzogJHMgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkcywgc2VsZjo6TkZEKTsKfSBlbHNlaWYgKCduZmtkJyA9PT0gJHJ1bGUpIHsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzLCBzZWxmOjpORktEKSA/OiAkcyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzLCBzZWxmOjpORktEKTsKfSBlbHNlaWYgKCdbOm5vbnNwYWNpbmcgbWFyazpdIHJlbW92ZScgPT09ICRydWxlKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvXHB7TW59KysvdScsICcnLCAkcyk7Cn0gZWxzZWlmICgnbGF0aW4tYXNjaWknID09PSAkcnVsZSkgewokcyA9IHN0cl9yZXBsYWNlKHNlbGY6OlRSQU5TTElUX0ZST00sIHNlbGY6OlRSQU5TTElUX1RPLCAkcyk7Cn0gZWxzZWlmICgnZGUtYXNjaWknID09PSAkcnVsZSkgewokcyA9IHByZWdfcmVwbGFjZSgiLyhbQVVPXSlcdXswMzA4fSg/PVxwe0xsfSkvdSIsICckMWUnLCAkcyk7CiRzID0gc3RyX3JlcGxhY2UoWyJhXHV7MDMwOH0iLCAib1x1ezAzMDh9IiwgInVcdXswMzA4fSIsICJBXHV7MDMwOH0iLCAiT1x1ezAzMDh9IiwgIlVcdXswMzA4fSJdLCBbJ2FlJywgJ29lJywgJ3VlJywgJ0FFJywgJ09FJywgJ1VFJ10sICRzKTsKfSBlbHNlaWYgKFxmdW5jdGlvbl9leGlzdHMoJ3RyYW5zbGl0ZXJhdG9yX3RyYW5zbGl0ZXJhdGUnKSkgewppZiAobnVsbCA9PT0gJHRyYW5zbGl0ZXJhdG9yID0gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPz8gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkcnVsZSkpIHsKaWYgKCdhbnktbGF0aW4vYmduJyA9PT0gJHJ1bGUpIHsKJHJ1bGUgPSAnYW55LWxhdGluJzsKJHRyYW5zbGl0ZXJhdG9yID0gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPz8gc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1skcnVsZV0gPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkcnVsZSk7Cn0KCmlmIChudWxsID09PSAkdHJhbnNsaXRlcmF0b3IpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbihzcHJpbnRmKCdVbmtub3duIHRyYW5zbGl0ZXJhdGlvbiBydWxlICIlcyIuJywgJHJ1bGUpKTsKfQoKc2VsZjo6JHRyYW5zbGl0ZXJhdG9yc1snYW55LWxhdGluL2JnbiddID0gJHRyYW5zbGl0ZXJhdG9yOwp9CgokcyA9ICR0cmFuc2xpdGVyYXRvci0+dHJhbnNsaXRlcmF0ZSgkcyk7Cn0KfSBlbHNlaWYgKCFcZnVuY3Rpb25fZXhpc3RzKCdpY29udicpKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvW15ceDAwLVx4N0ZdL3UnLCAnPycsICRzKTsKfSBlbHNlIHsKJHMgPSBAcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvW15ceDAwLVx4N0ZdL3UnLCBzdGF0aWMgZnVuY3Rpb24gKCRjKSB7CiRjID0gKHN0cmluZykgaWNvbnYoJ1VURi04JywgJ0FTQ0lJLy9UUkFOU0xJVCcsICRjWzBdKTsKCmlmICgnJyA9PT0gJGMgJiYgJycgPT09IGljb252KCdVVEYtOCcsICdBU0NJSS8vVFJBTlNMSVQnLCAnwrInKSkgewp0aHJvdyBuZXcgXExvZ2ljRXhjZXB0aW9uKHNwcmludGYoJyIlcyIgcmVxdWlyZXMgYSB0cmFuc2xpdC1hYmxlIGljb252IGltcGxlbWVudGF0aW9uLCB0cnkgaW5zdGFsbGluZyAiZ251LWxpYmljb252IiBpZiB5b3VcJ3JlIHVzaW5nIEFscGluZSBMaW51eC4nLCBzdGF0aWM6OmNsYXNzKSk7Cn0KCnJldHVybiAxIDwgXHN0cmxlbigkYykgPyBsdHJpbSgkYywgJ1wnYCJeficpIDogKCcnICE9PSAkYyA/ICRjIDogJz8nKTsKfSwgJHMpOwp9Cn0KCiRzdHItPnN0cmluZyAuPSAkczsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FtZWwoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBzdHJfcmVwbGFjZSgnICcsICcnLCBwcmVnX3JlcGxhY2VfY2FsbGJhY2soJy9cYi4oPyFccHtMdX0pL3UnLCBzdGF0aWMgZnVuY3Rpb24gKCRtKSB1c2UgKCYkaSkgewpyZXR1cm4gMSA9PT0gKyskaSA/ICgnxLAnID09PSAkbVswXSA/ICdpzIcnIDogbWJfc3RydG9sb3dlcigkbVswXSwgJ1VURi04JykpIDogbWJfY29udmVydF9jYXNlKCRtWzBdLCBcTUJfQ0FTRV9USVRMRSwgJ1VURi04Jyk7Cn0sIHByZWdfcmVwbGFjZSgnL1teXHBMMC05XSsrL3UnLCAnICcsICR0aGlzLT5zdHJpbmcpKSk7CgpyZXR1cm4gJHN0cjsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIGNvZGVQb2ludHNBdChpbnQgJG9mZnNldCk6IGFycmF5CnsKJHN0ciA9ICR0aGlzLT5zbGljZSgkb2Zmc2V0LCAxKTsKCmlmICgnJyA9PT0gJHN0ci0+c3RyaW5nKSB7CnJldHVybiBbXTsKfQoKJGNvZGVQb2ludHMgPSBbXTsKCmZvcmVhY2ggKHByZWdfc3BsaXQoJy8vdScsICRzdHItPnN0cmluZywgLTEsIFxQUkVHX1NQTElUX05PX0VNUFRZKSBhcyAkYykgewokY29kZVBvaW50c1tdID0gbWJfb3JkKCRjLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRjb2RlUG9pbnRzOwp9CgpwdWJsaWMgZnVuY3Rpb24gZm9sZGVkKGJvb2wgJGNvbXBhdCA9IHRydWUpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoISRjb21wYXQgfHwgXFBIUF9WRVJTSU9OX0lEIDwgNzAzMDAgfHwgIVxkZWZpbmVkKCdOb3JtYWxpemVyOjpORktDX0NGJykpIHsKJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkY29tcGF0ID8gXE5vcm1hbGl6ZXI6Ok5GS0MgOiBcTm9ybWFsaXplcjo6TkZDKTsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG9sb3dlcihzdHJfcmVwbGFjZShzZWxmOjpGT0xEX0ZST00sIHNlbGY6OkZPTERfVE8sICRzdHItPnN0cmluZyksICdVVEYtOCcpOwp9IGVsc2Ugewokc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcsIFxOb3JtYWxpemVyOjpORktDX0NGKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBqb2luKGFycmF5ICRzdHJpbmdzLCA/c3RyaW5nICRsYXN0R2x1ZSA9IG51bGwpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgokdGFpbCA9IG51bGwgIT09ICRsYXN0R2x1ZSAmJiAxIDwgXGNvdW50KCRzdHJpbmdzKSA/ICRsYXN0R2x1ZS5hcnJheV9wb3AoJHN0cmluZ3MpIDogJyc7CiRzdHItPnN0cmluZyA9IGltcGxvZGUoJHRoaXMtPnN0cmluZywgJHN0cmluZ3MpLiR0YWlsOwoKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkc3RyLT5zdHJpbmcpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxvd2VyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG9sb3dlcihzdHJfcmVwbGFjZSgnxLAnLCAnacyHJywgJHN0ci0+c3RyaW5nKSwgJ1VURi04Jyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIG1hdGNoKHN0cmluZyAkcmVnZXhwLCBpbnQgJGZsYWdzID0gMCwgaW50ICRvZmZzZXQgPSAwKTogYXJyYXkKewokbWF0Y2ggPSAoKFxQUkVHX1BBVFRFUk5fT1JERVIgfCBcUFJFR19TRVRfT1JERVIpICYgJGZsYWdzKSA/ICdwcmVnX21hdGNoX2FsbCcgOiAncHJlZ19tYXRjaCc7CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJHJlZ2V4cCAuPSAnaSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChmYWxzZSA9PT0gJG1hdGNoKCRyZWdleHAuJ3UnLCAkdGhpcy0+c3RyaW5nLCAkbWF0Y2hlcywgJGZsYWdzIHwgXFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBub3JtYWxpemUoaW50ICRmb3JtID0gc2VsZjo6TkZDKTogc2VsZgp7CmlmICghXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZDLCBzZWxmOjpORkQsIHNlbGY6Ok5GS0MsIHNlbGY6Ok5GS0RdKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdVbnN1cHBvcnRlZCBub3JtYWxpemF0aW9uIGZvcm0uJyk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZywgJGZvcm0pID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZywgJGZvcm0pOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CmlmICgnJyA9PT0gJHBhZFN0ciB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHBhZFN0cikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRwYWQgPSBjbG9uZSAkdGhpczsKJHBhZC0+c3RyaW5nID0gJHBhZFN0cjsKCnJldHVybiAkdGhpcy0+cGFkKCRsZW5ndGgsICRwYWQsIFxTVFJfUEFEX0JPVEgpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CmlmICgnJyA9PT0gJHBhZFN0ciB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHBhZFN0cikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRwYWQgPSBjbG9uZSAkdGhpczsKJHBhZC0+c3RyaW5nID0gJHBhZFN0cjsKCnJldHVybiAkdGhpcy0+cGFkKCRsZW5ndGgsICRwYWQsIFxTVFJfUEFEX1JJR0hUKTsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZFN0YXJ0KGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CmlmICgnJyA9PT0gJHBhZFN0ciB8fCAhcHJlZ19tYXRjaCgnLy91JywgJHBhZFN0cikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCiRwYWQgPSBjbG9uZSAkdGhpczsKJHBhZC0+c3RyaW5nID0gJHBhZFN0cjsKCnJldHVybiAkdGhpcy0+cGFkKCRsZW5ndGgsICRwYWQsIFxTVFJfUEFEX0xFRlQpOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBwYXJlbnQKewppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJGZyb21SZWdleHAgLj0gJ2knOwp9CgppZiAoXGlzX2FycmF5KCR0bykgfHwgJHRvIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKaWYgKCFcaXNfY2FsbGFibGUoJHRvKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXM6OnJlcGxhY2VNYXRjaGVzKCkiIG11c3QgYmUgY2FsbGFibGUsIGFycmF5IGdpdmVuLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJHJlcGxhY2UgPSAncHJlZ19yZXBsYWNlX2NhbGxiYWNrJzsKJHRvID0gc3RhdGljIGZ1bmN0aW9uIChhcnJheSAkbSkgdXNlICgkdG8pOiBzdHJpbmcgewokdG8gPSAkdG8oJG0pOwoKaWYgKCcnICE9PSAkdG8gJiYgKCFcaXNfc3RyaW5nKCR0bykgfHwgIXByZWdfbWF0Y2goJy8vdScsICR0bykpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1JlcGxhY2UgY2FsbGJhY2sgbXVzdCByZXR1cm4gYSB2YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkdG87Cn07Cn0gZWxzZWlmICgnJyAhPT0gJHRvICYmICFwcmVnX21hdGNoKCcvL3UnLCAkdG8pKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9IGVsc2UgewokcmVwbGFjZSA9ICdwcmVnX3JlcGxhY2UnOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewppZiAobnVsbCA9PT0gJHN0cmluZyA9ICRyZXBsYWNlKCRmcm9tUmVnZXhwLid1JywgJHRvLCAkdGhpcy0+c3RyaW5nKSkgewokbGFzdEVycm9yID0gcHJlZ19sYXN0X2Vycm9yKCk7Cgpmb3JlYWNoIChnZXRfZGVmaW5lZF9jb25zdGFudHModHJ1ZSlbJ3BjcmUnXSBhcyAkayA9PiAkdikgewppZiAoJGxhc3RFcnJvciA9PT0gJHYgJiYgJ19FUlJPUicgPT09IHN1YnN0cigkaywgLTYpKSB7CnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCAnLiRrLicuJyk7Cn0KfQoKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoIHVua25vd24gZXJyb3IgY29kZS4nKTsKfQp9IGZpbmFsbHkgewpyZXN0b3JlX2Vycm9yX2hhbmRsZXIoKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkc3RyaW5nOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXZlcnNlKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgnJywgYXJyYXlfcmV2ZXJzZShwcmVnX3NwbGl0KCcvKFxYKS91JywgJHN0ci0+c3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfREVMSU1fQ0FQVFVSRSB8IFxQUkVHX1NQTElUX05PX0VNUFRZKSkpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbmFrZSgpOiBwYXJlbnQKewokc3RyID0gJHRoaXMtPmNhbWVsKCk7CiRzdHItPnN0cmluZyA9IG1iX3N0cnRvbG93ZXIocHJlZ19yZXBsYWNlKFsnLyhccHtMdX0rKShccHtMdX1ccHtMbH0pL3UnLCAnLyhbXHB7TGx9MC05XSkoXHB7THV9KS91J10sICdcMV9cMicsICRzdHItPnN0cmluZyksICdVVEYtOCcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aXRsZShib29sICRhbGxXb3JkcyA9IGZhbHNlKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwoKJGxpbWl0ID0gJGFsbFdvcmRzID8gLTEgOiAxOwoKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlX2NhbGxiYWNrKCcvXGIuL3UnLCBzdGF0aWMgZnVuY3Rpb24gKGFycmF5ICRtKTogc3RyaW5nIHsKcmV0dXJuIG1iX2NvbnZlcnRfY2FzZSgkbVswXSwgXE1CX0NBU0VfVElUTEUsICdVVEYtOCcpOwp9LCAkc3RyLT5zdHJpbmcsICRsaW1pdCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW0oc3RyaW5nICRjaGFycyA9ICIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9Iik6IHBhcmVudAp7CmlmICgiIFx0XG5cclwwXHgwQlx4MENcdXtBMH1cdXtGRUZGfSIgIT09ICRjaGFycyAmJiAhcHJlZ19tYXRjaCgnLy91JywgJGNoYXJzKSkgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IGNoYXJzLicpOwp9CiRjaGFycyA9IHByZWdfcXVvdGUoJGNoYXJzKTsKCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gcHJlZ19yZXBsYWNlKCJ7XlskY2hhcnNdKyt8WyRjaGFyc10rKyR9dUQiLCAnJywgJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gdHJpbUVuZChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogcGFyZW50CnsKaWYgKCIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9IiAhPT0gJGNoYXJzICYmICFwcmVnX21hdGNoKCcvL3UnLCAkY2hhcnMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcnMuJyk7Cn0KJGNoYXJzID0gcHJlZ19xdW90ZSgkY2hhcnMpOwoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2UoIntbJGNoYXJzXSsrJH11RCIsICcnLCAkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltUHJlZml4KCRwcmVmaXgpOiBwYXJlbnQKewppZiAoISR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBwYXJlbnQ6OnRyaW1QcmVmaXgoJHByZWZpeCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CiRwcmVmaXggPSBpdGVyYXRvcl90b19hcnJheSgkcHJlZml4LCBmYWxzZSk7Cn0gZWxzZWlmICgkcHJlZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRwcmVmaXggPSAkcHJlZml4LT5zdHJpbmc7Cn0KCiRwcmVmaXggPSBpbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgKGFycmF5KSAkcHJlZml4KSk7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgie14oPzokcHJlZml4KX1pdUQiLCAnJywgJHRoaXMtPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRyaW1TdGFydChzdHJpbmcgJGNoYXJzID0gIiBcdFxuXHJcMFx4MEJceDBDXHV7QTB9XHV7RkVGRn0iKTogcGFyZW50CnsKaWYgKCIgXHRcblxyXDBceDBCXHgwQ1x1e0EwfVx1e0ZFRkZ9IiAhPT0gJGNoYXJzICYmICFwcmVnX21hdGNoKCcvL3UnLCAkY2hhcnMpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggY2hhcnMuJyk7Cn0KJGNoYXJzID0gcHJlZ19xdW90ZSgkY2hhcnMpOwoKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSBwcmVnX3JlcGxhY2UoInteWyRjaGFyc10rK311RCIsICcnLCAkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0cmltU3VmZml4KCRzdWZmaXgpOiBwYXJlbnQKewppZiAoISR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiBwYXJlbnQ6OnRyaW1TdWZmaXgoJHN1ZmZpeCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmICgkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CiRzdWZmaXggPSBpdGVyYXRvcl90b19hcnJheSgkc3VmZml4LCBmYWxzZSk7Cn0gZWxzZWlmICgkc3VmZml4IGluc3RhbmNlb2YgcGFyZW50KSB7CiRzdWZmaXggPSAkc3VmZml4LT5zdHJpbmc7Cn0KCiRzdWZmaXggPSBpbXBsb2RlKCd8JywgYXJyYXlfbWFwKCdwcmVnX3F1b3RlJywgKGFycmF5KSAkc3VmZml4KSk7CiRzdHItPnN0cmluZyA9IHByZWdfcmVwbGFjZSgieyg/OiRzdWZmaXgpJH1pdUQiLCAnJywgJHRoaXMtPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHVwcGVyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbWJfc3RydG91cHBlcigkc3RyLT5zdHJpbmcsICdVVEYtOCcpOwoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwMzAwKSB7CiRzdHItPnN0cmluZyA9IHN0cl9yZXBsYWNlKHNlbGY6OlVQUEVSX0ZST00sIHNlbGY6OlVQUEVSX1RPLCAkc3RyLT5zdHJpbmcpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHdpZHRoKGJvb2wgJGlnbm9yZUFuc2lEZWNvcmF0aW9uID0gdHJ1ZSk6IGludAp7CiR3aWR0aCA9IDA7CiRzID0gc3RyX3JlcGxhY2UoWyJceDAwIiwgIlx4MDUiLCAiXHgwNyJdLCAnJywgJHRoaXMtPnN0cmluZyk7CgppZiAoZmFsc2UgIT09IHN0cnBvcygkcywgIlxyIikpIHsKJHMgPSBzdHJfcmVwbGFjZShbIlxyXG4iLCAiXHIiXSwgIlxuIiwgJHMpOwp9CgppZiAoISRpZ25vcmVBbnNpRGVjb3JhdGlvbikgewokcyA9IHByZWdfcmVwbGFjZSgnL1tccHtDY31ceDdGXSsrL3UnLCAnJywgJHMpOwp9Cgpmb3JlYWNoIChleHBsb2RlKCJcbiIsICRzKSBhcyAkcykgewppZiAoJGlnbm9yZUFuc2lEZWNvcmF0aW9uKSB7CiRzID0gcHJlZ19yZXBsYWNlKCcvKD86XHgxQig/OgogICAgICAgICAgICAgICAgICAgIFxbIFtceDMwLVx4M0ZdKisgW1x4MjAtXHgyRl0qKyBbXHg0MC1ceDdFXQogICAgICAgICAgICAgICAgICAgIHwgW1BcXVheX10gLio/IFx4MUJcXFxcCiAgICAgICAgICAgICAgICAgICAgfCBbXHg0MS1ceDdFXQogICAgICAgICAgICAgICAgKXxbXHB7Q2N9XHg3Rl0rKykveHUnLCAnJywgJHMpOwp9CgokbGluZVdpZHRoID0gJHRoaXMtPndjc3dpZHRoKCRzKTsKCmlmICgkbGluZVdpZHRoID4gJHdpZHRoKSB7CiR3aWR0aCA9ICRsaW5lV2lkdGg7Cn0KfQoKcmV0dXJuICR3aWR0aDsKfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiBwYWQoaW50ICRsZW4sIHNlbGYgJHBhZCwgaW50ICR0eXBlKTogcGFyZW50CnsKJHNMZW4gPSAkdGhpcy0+bGVuZ3RoKCk7CgppZiAoJGxlbiA8PSAkc0xlbikgewpyZXR1cm4gY2xvbmUgJHRoaXM7Cn0KCiRwYWRMZW4gPSAkcGFkLT5sZW5ndGgoKTsKJGZyZWVMZW4gPSAkbGVuIC0gJHNMZW47CiRsZW4gPSAkZnJlZUxlbiAlICRwYWRMZW47Cgpzd2l0Y2ggKCR0eXBlKSB7CmNhc2UgXFNUUl9QQURfUklHSFQ6CnJldHVybiAkdGhpcy0+YXBwZW5kKHN0cl9yZXBlYXQoJHBhZC0+c3RyaW5nLCBpbnRkaXYoJGZyZWVMZW4sICRwYWRMZW4pKS4oJGxlbiA/ICRwYWQtPnNsaWNlKDAsICRsZW4pIDogJycpKTsKCmNhc2UgXFNUUl9QQURfTEVGVDoKcmV0dXJuICR0aGlzLT5wcmVwZW5kKHN0cl9yZXBlYXQoJHBhZC0+c3RyaW5nLCBpbnRkaXYoJGZyZWVMZW4sICRwYWRMZW4pKS4oJGxlbiA/ICRwYWQtPnNsaWNlKDAsICRsZW4pIDogJycpKTsKCmNhc2UgXFNUUl9QQURfQk9USDoKJGZyZWVMZW4gLz0gMjsKCiRyaWdodExlbiA9IGNlaWwoJGZyZWVMZW4pOwokbGVuID0gJHJpZ2h0TGVuICUgJHBhZExlbjsKJHN0ciA9ICR0aGlzLT5hcHBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkcmlnaHRMZW4sICRwYWRMZW4pKS4oJGxlbiA/ICRwYWQtPnNsaWNlKDAsICRsZW4pIDogJycpKTsKCiRsZWZ0TGVuID0gZmxvb3IoJGZyZWVMZW4pOwokbGVuID0gJGxlZnRMZW4gJSAkcGFkTGVuOwoKcmV0dXJuICRzdHItPnByZXBlbmQoc3RyX3JlcGVhdCgkcGFkLT5zdHJpbmcsIGludGRpdigkbGVmdExlbiwgJHBhZExlbikpLigkbGVuID8gJHBhZC0+c2xpY2UoMCwgJGxlbikgOiAnJykpOwoKZGVmYXVsdDoKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBwYWRkaW5nIHR5cGUuJyk7Cn0KfQoKCgoKcHJpdmF0ZSBmdW5jdGlvbiB3Y3N3aWR0aChzdHJpbmcgJHN0cmluZyk6IGludAp7CiR3aWR0aCA9IDA7Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCcvL3UnLCAkc3RyaW5nLCAtMSwgXFBSRUdfU1BMSVRfTk9fRU1QVFkpIGFzICRjKSB7CiRjb2RlUG9pbnQgPSBtYl9vcmQoJGMsICdVVEYtOCcpOwoKaWYgKDAgPT09ICRjb2RlUG9pbnQgCnx8IDB4MDM0RiA9PT0gJGNvZGVQb2ludCAKfHwgKDB4MjAwQiA8PSAkY29kZVBvaW50ICYmIDB4MjAwRiA+PSAkY29kZVBvaW50KSAKfHwgMHgyMDI4ID09PSAkY29kZVBvaW50IAp8fCAweDIwMjkgPT09ICRjb2RlUG9pbnQgCnx8ICgweDIwMkEgPD0gJGNvZGVQb2ludCAmJiAweDIwMkUgPj0gJGNvZGVQb2ludCkgCnx8ICgweDIwNjAgPD0gJGNvZGVQb2ludCAmJiAweDIwNjMgPj0gJGNvZGVQb2ludCkgCikgewpjb250aW51ZTsKfQoKCmlmICgzMiA+ICRjb2RlUG9pbnQgCnx8ICgweDA3RiA8PSAkY29kZVBvaW50ICYmIDB4MEEwID4gJGNvZGVQb2ludCkgCikgewpyZXR1cm4gLTE7Cn0KCmlmIChudWxsID09PSBzZWxmOjokdGFibGVaZXJvKSB7CnNlbGY6OiR0YWJsZVplcm8gPSByZXF1aXJlIF9fRElSX18uJy9SZXNvdXJjZXMvZGF0YS93Y3N3aWR0aF90YWJsZV96ZXJvLnBocCc7Cn0KCmlmICgkY29kZVBvaW50ID49IHNlbGY6OiR0YWJsZVplcm9bMF1bMF0gJiYgJGNvZGVQb2ludCA8PSBzZWxmOjokdGFibGVaZXJvWyR1Ym91bmQgPSBcY291bnQoc2VsZjo6JHRhYmxlWmVybykgLSAxXVsxXSkgewokbGJvdW5kID0gMDsKd2hpbGUgKCR1Ym91bmQgPj0gJGxib3VuZCkgewokbWlkID0gZmxvb3IoKCRsYm91bmQgKyAkdWJvdW5kKSAvIDIpOwoKaWYgKCRjb2RlUG9pbnQgPiBzZWxmOjokdGFibGVaZXJvWyRtaWRdWzFdKSB7CiRsYm91bmQgPSAkbWlkICsgMTsKfSBlbHNlaWYgKCRjb2RlUG9pbnQgPCBzZWxmOjokdGFibGVaZXJvWyRtaWRdWzBdKSB7CiR1Ym91bmQgPSAkbWlkIC0gMTsKfSBlbHNlIHsKY29udGludWUgMjsKfQp9Cn0KCmlmIChudWxsID09PSBzZWxmOjokdGFibGVXaWRlKSB7CnNlbGY6OiR0YWJsZVdpZGUgPSByZXF1aXJlIF9fRElSX18uJy9SZXNvdXJjZXMvZGF0YS93Y3N3aWR0aF90YWJsZV93aWRlLnBocCc7Cn0KCmlmICgkY29kZVBvaW50ID49IHNlbGY6OiR0YWJsZVdpZGVbMF1bMF0gJiYgJGNvZGVQb2ludCA8PSBzZWxmOjokdGFibGVXaWRlWyR1Ym91bmQgPSBcY291bnQoc2VsZjo6JHRhYmxlV2lkZSkgLSAxXVsxXSkgewokbGJvdW5kID0gMDsKd2hpbGUgKCR1Ym91bmQgPj0gJGxib3VuZCkgewokbWlkID0gZmxvb3IoKCRsYm91bmQgKyAkdWJvdW5kKSAvIDIpOwoKaWYgKCRjb2RlUG9pbnQgPiBzZWxmOjokdGFibGVXaWRlWyRtaWRdWzFdKSB7CiRsYm91bmQgPSAkbWlkICsgMTsKfSBlbHNlaWYgKCRjb2RlUG9pbnQgPCBzZWxmOjokdGFibGVXaWRlWyRtaWRdWzBdKSB7CiR1Ym91bmQgPSAkbWlkIC0gMTsKfSBlbHNlIHsKJHdpZHRoICs9IDI7Cgpjb250aW51ZSAyOwp9Cn0KfQoKKyskd2lkdGg7Cn0KCnJldHVybiAkd2lkdGg7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcRXhjZXB0aW9uXEV4Y2VwdGlvbkludGVyZmFjZTsKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxSdW50aW1lRXhjZXB0aW9uOwoKCgoKCgoKCgpjbGFzcyBCeXRlU3RyaW5nIGV4dGVuZHMgQWJzdHJhY3RTdHJpbmcKewpwcml2YXRlIGNvbnN0IEFMUEhBQkVUX0FMUEhBTlVNRVJJQyA9ICcxMjM0NTY3ODlBQkNERUZHSEpLTE1OUFFSU1RVVldYWVphYmNkZWZnaGlqa21ub3BxcnN0dXZ3eHl6JzsKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHN0cmluZyA9ICcnKQp7CiR0aGlzLT5zdHJpbmcgPSAkc3RyaW5nOwp9CgoKCgoKCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tUmFuZG9tKGludCAkbGVuZ3RoID0gMTYsID9zdHJpbmcgJGFscGhhYmV0ID0gbnVsbCk6IHNlbGYKewppZiAoJGxlbmd0aCA8PSAwKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oc3ByaW50ZignQSBzdHJpY3RseSBwb3NpdGl2ZSBsZW5ndGggaXMgZXhwZWN0ZWQsICIlZCIgZ2l2ZW4uJywgJGxlbmd0aCkpOwp9CgokYWxwaGFiZXQgPSAkYWxwaGFiZXQgPz8gc2VsZjo6QUxQSEFCRVRfQUxQSEFOVU1FUklDOwokYWxwaGFiZXRTaXplID0gXHN0cmxlbigkYWxwaGFiZXQpOwokYml0cyA9IChpbnQpIGNlaWwobG9nKCRhbHBoYWJldFNpemUsIDIuMCkpOwppZiAoJGJpdHMgPD0gMCB8fCAkYml0cyA+IDU2KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBsZW5ndGggb2YgdGhlIGFscGhhYmV0IG11c3QgaW4gdGhlIFsyXjEsIDJeNTZdIHJhbmdlLicpOwp9CgokcmV0ID0gJyc7CndoaWxlICgkbGVuZ3RoID4gMCkgewokdXJhbmRvbUxlbmd0aCA9IChpbnQpIGNlaWwoMiAqICRsZW5ndGggKiAkYml0cyAvIDguMCk7CiRkYXRhID0gcmFuZG9tX2J5dGVzKCR1cmFuZG9tTGVuZ3RoKTsKJHVucGFja2VkRGF0YSA9IDA7CiR1bnBhY2tlZEJpdHMgPSAwOwpmb3IgKCRpID0gMDsgJGkgPCAkdXJhbmRvbUxlbmd0aCAmJiAkbGVuZ3RoID4gMDsgKyskaSkgewoKJHVucGFja2VkRGF0YSA9ICgkdW5wYWNrZWREYXRhIDw8IDgpIHwgXG9yZCgkZGF0YVskaV0pOwokdW5wYWNrZWRCaXRzICs9IDg7CgoKCmZvciAoOyAkdW5wYWNrZWRCaXRzID49ICRiaXRzICYmICRsZW5ndGggPiAwOyAkdW5wYWNrZWRCaXRzIC09ICRiaXRzKSB7CiRpbmRleCA9ICgkdW5wYWNrZWREYXRhICYgKCgxIDw8ICRiaXRzKSAtIDEpKTsKJHVucGFja2VkRGF0YSA+Pj0gJGJpdHM7CgoKCmlmICgkaW5kZXggPCAkYWxwaGFiZXRTaXplKSB7CiRyZXQgLj0gJGFscGhhYmV0WyRpbmRleF07Ci0tJGxlbmd0aDsKfQp9Cn0KfQoKcmV0dXJuIG5ldyBzdGF0aWMoJHJldCk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBieXRlc0F0KGludCAkb2Zmc2V0KTogYXJyYXkKewokc3RyID0gJHRoaXMtPnN0cmluZ1skb2Zmc2V0XSA/PyAnJzsKCnJldHVybiAnJyA9PT0gJHN0ciA/IFtdIDogW1xvcmQoJHN0cildOwp9CgpwdWJsaWMgZnVuY3Rpb24gYXBwZW5kKHN0cmluZyAuLi4kc3VmZml4KTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgLj0gMSA+PSBcY291bnQoJHN1ZmZpeCkgPyAoJHN1ZmZpeFswXSA/PyAnJykgOiBpbXBsb2RlKCcnLCAkc3VmZml4KTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2FtZWwoKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwoKJHBhcnRzID0gZXhwbG9kZSgnICcsIHRyaW0odWN3b3JkcyhwcmVnX3JlcGxhY2UoJy9bXmEtekEtWjAtOVx4N2YtXHhmZl0rKy8nLCAnICcsICR0aGlzLT5zdHJpbmcpKSkpOwokcGFydHNbMF0gPSAxICE9PSBcc3RybGVuKCRwYXJ0c1swXSkgJiYgY3R5cGVfdXBwZXIoJHBhcnRzWzBdKSA/ICRwYXJ0c1swXSA6IGxjZmlyc3QoJHBhcnRzWzBdKTsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgnJywgJHBhcnRzKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gY2h1bmsoaW50ICRsZW5ndGggPSAxKTogYXJyYXkKewppZiAoMSA+ICRsZW5ndGgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignVGhlIGNodW5rIGxlbmd0aCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOwp9CgppZiAoJycgPT09ICR0aGlzLT5zdHJpbmcpIHsKcmV0dXJuIFtdOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSBbXTsKCmZvcmVhY2ggKHN0cl9zcGxpdCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoKSBhcyAkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmtzW10gPSBjbG9uZSAkc3RyOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIGVuZHNXaXRoKCRzdWZmaXgpOiBib29sCnsKaWYgKCRzdWZmaXggaW5zdGFuY2VvZiBwYXJlbnQpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKcmV0dXJuICcnICE9PSAkc3VmZml4ICYmIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgPj0gXHN0cmxlbigkc3VmZml4KSAmJiAwID09PSBzdWJzdHJfY29tcGFyZSgkdGhpcy0+c3RyaW5nLCAkc3VmZml4LCAtXHN0cmxlbigkc3VmZml4KSwgbnVsbCwgJHRoaXMtPmlnbm9yZUNhc2UpOwp9CgpwdWJsaWMgZnVuY3Rpb24gZXF1YWxzVG8oJHN0cmluZyk6IGJvb2wKewppZiAoJHN0cmluZyBpbnN0YW5jZW9mIHBhcmVudCkgewokc3RyaW5nID0gJHN0cmluZy0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdHJpbmcpIHx8ICRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZXF1YWxzVG8oJHN0cmluZyk7Cn0gZWxzZSB7CiRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwp9CgppZiAoJycgIT09ICRzdHJpbmcgJiYgJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IHN0cmNhc2VjbXAoJHN0cmluZywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyaW5nID09PSAkdGhpcy0+c3RyaW5nOwp9CgpwdWJsaWMgZnVuY3Rpb24gZm9sZGVkKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpbmRleE9mKCRuZWVkbGUsIGludCAkb2Zmc2V0ID0gMCk6ID9pbnQKewppZiAoJG5lZWRsZSBpbnN0YW5jZW9mIHBhcmVudCkgewokbmVlZGxlID0gJG5lZWRsZS0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRuZWVkbGUpIHx8ICRuZWVkbGUgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6aW5kZXhPZigkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCmlmICgnJyA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IHN0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCkgOiBzdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgcGFyZW50KSB7CiRuZWVkbGUgPSAkbmVlZGxlLT5zdHJpbmc7Cn0gZWxzZWlmIChcaXNfYXJyYXkoJG5lZWRsZSkgfHwgJG5lZWRsZSBpbnN0YW5jZW9mIFxUcmF2ZXJzYWJsZSkgewpyZXR1cm4gcGFyZW50OjppbmRleE9mTGFzdCgkbmVlZGxlLCAkb2Zmc2V0KTsKfSBlbHNlIHsKJG5lZWRsZSA9IChzdHJpbmcpICRuZWVkbGU7Cn0KCmlmICgnJyA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IHN0cnJpcG9zKCR0aGlzLT5zdHJpbmcsICRuZWVkbGUsICRvZmZzZXQpIDogc3RycnBvcygkdGhpcy0+c3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KTsKCnJldHVybiBmYWxzZSA9PT0gJGkgPyBudWxsIDogJGk7Cn0KCnB1YmxpYyBmdW5jdGlvbiBpc1V0ZjgoKTogYm9vbAp7CnJldHVybiAnJyA9PT0gJHRoaXMtPnN0cmluZyB8fCBwcmVnX21hdGNoKCcvL3UnLCAkdGhpcy0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGpvaW4oYXJyYXkgJHN0cmluZ3MsID9zdHJpbmcgJGxhc3RHbHVlID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCiR0YWlsID0gbnVsbCAhPT0gJGxhc3RHbHVlICYmIDEgPCBcY291bnQoJHN0cmluZ3MpID8gJGxhc3RHbHVlLmFycmF5X3BvcCgkc3RyaW5ncykgOiAnJzsKJHN0ci0+c3RyaW5nID0gaW1wbG9kZSgkdGhpcy0+c3RyaW5nLCAkc3RyaW5ncykuJHRhaWw7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGxlbmd0aCgpOiBpbnQKewpyZXR1cm4gXHN0cmxlbigkdGhpcy0+c3RyaW5nKTsKfQoKcHVibGljIGZ1bmN0aW9uIGxvd2VyKCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RydG9sb3dlcigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBtYXRjaChzdHJpbmcgJHJlZ2V4cCwgaW50ICRmbGFncyA9IDAsIGludCAkb2Zmc2V0ID0gMCk6IGFycmF5CnsKJG1hdGNoID0gKChcUFJFR19QQVRURVJOX09SREVSIHwgXFBSRUdfU0VUX09SREVSKSAmICRmbGFncykgPyAncHJlZ19tYXRjaF9hbGwnIDogJ3ByZWdfbWF0Y2gnOwoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CiRyZWdleHAgLj0gJ2knOwp9CgpzZXRfZXJyb3JfaGFuZGxlcihzdGF0aWMgZnVuY3Rpb24gKCR0LCAkbSkgeyB0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCRtKTsgfSk7Cgp0cnkgewppZiAoZmFsc2UgPT09ICRtYXRjaCgkcmVnZXhwLCAkdGhpcy0+c3RyaW5nLCAkbWF0Y2hlcywgJGZsYWdzIHwgXFBSRUdfVU5NQVRDSEVEX0FTX05VTEwsICRvZmZzZXQpKSB7CiRsYXN0RXJyb3IgPSBwcmVnX2xhc3RfZXJyb3IoKTsKCmZvcmVhY2ggKGdldF9kZWZpbmVkX2NvbnN0YW50cyh0cnVlKVsncGNyZSddIGFzICRrID0+ICR2KSB7CmlmICgkbGFzdEVycm9yID09PSAkdiAmJiAnX0VSUk9SJyA9PT0gc3Vic3RyKCRrLCAtNikpIHsKdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oJ01hdGNoaW5nIGZhaWxlZCB3aXRoICcuJGsuJy4nKTsKfQp9Cgp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggdW5rbm93biBlcnJvciBjb2RlLicpOwp9Cn0gZmluYWxseSB7CnJlc3RvcmVfZXJyb3JfaGFuZGxlcigpOwp9CgpyZXR1cm4gJG1hdGNoZXM7Cn0KCnB1YmxpYyBmdW5jdGlvbiBwYWRCb3RoKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9CT1RIKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcGFkRW5kKGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9SSUdIVCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHBhZFN0YXJ0KGludCAkbGVuZ3RoLCBzdHJpbmcgJHBhZFN0ciA9ICcgJyk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3RyX3BhZCgkdGhpcy0+c3RyaW5nLCAkbGVuZ3RoLCAkcGFkU3RyLCBcU1RSX1BBRF9MRUZUKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcHJlcGVuZChzdHJpbmcgLi4uJHByZWZpeCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKDEgPj0gXGNvdW50KCRwcmVmaXgpID8gKCRwcmVmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHByZWZpeCkpLiRzdHItPnN0cmluZzsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZShzdHJpbmcgJGZyb20sIHN0cmluZyAkdG8pOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoJycgIT09ICRmcm9tKSB7CiRzdHItPnN0cmluZyA9ICR0aGlzLT5pZ25vcmVDYXNlID8gc3RyX2lyZXBsYWNlKCRmcm9tLCAkdG8sICR0aGlzLT5zdHJpbmcpIDogc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmVwbGFjZU1hdGNoZXMoc3RyaW5nICRmcm9tUmVnZXhwLCAkdG8pOiBwYXJlbnQKewppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKJGZyb21SZWdleHAgLj0gJ2knOwp9CgppZiAoXGlzX2FycmF5KCR0bykpIHsKaWYgKCFcaXNfY2FsbGFibGUoJHRvKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXM6OnJlcGxhY2VNYXRjaGVzKCkiIG11c3QgYmUgY2FsbGFibGUsIGFycmF5IGdpdmVuLicsIHN0YXRpYzo6Y2xhc3MpKTsKfQoKJHJlcGxhY2UgPSAncHJlZ19yZXBsYWNlX2NhbGxiYWNrJzsKfSBlbHNlIHsKJHJlcGxhY2UgPSAkdG8gaW5zdGFuY2VvZiBcQ2xvc3VyZSA/ICdwcmVnX3JlcGxhY2VfY2FsbGJhY2snIDogJ3ByZWdfcmVwbGFjZSc7Cn0KCnNldF9lcnJvcl9oYW5kbGVyKHN0YXRpYyBmdW5jdGlvbiAoJHQsICRtKSB7IHRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJG0pOyB9KTsKCnRyeSB7CmlmIChudWxsID09PSAkc3RyaW5nID0gJHJlcGxhY2UoJGZyb21SZWdleHAsICR0bywgJHRoaXMtPnN0cmluZykpIHsKJGxhc3RFcnJvciA9IHByZWdfbGFzdF9lcnJvcigpOwoKZm9yZWFjaCAoZ2V0X2RlZmluZWRfY29uc3RhbnRzKHRydWUpWydwY3JlJ10gYXMgJGsgPT4gJHYpIHsKaWYgKCRsYXN0RXJyb3IgPT09ICR2ICYmICdfRVJST1InID09PSBzdWJzdHIoJGssIC02KSkgewp0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbignTWF0Y2hpbmcgZmFpbGVkIHdpdGggJy4kay4nLicpOwp9Cn0KCnRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCdNYXRjaGluZyBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIGNvZGUuJyk7Cn0KfSBmaW5hbGx5IHsKcmVzdG9yZV9lcnJvcl9oYW5kbGVyKCk7Cn0KCiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gJHN0cmluZzsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gcmV2ZXJzZSgpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CiRzdHItPnN0cmluZyA9IHN0cnJldigkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbGljZShpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKHN0cmluZykgc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGxlbmd0aCA/PyBcUEhQX0lOVF9NQVgpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzbmFrZSgpOiBwYXJlbnQKewokc3RyID0gJHRoaXMtPmNhbWVsKCk7CiRzdHItPnN0cmluZyA9IHN0cnRvbG93ZXIocHJlZ19yZXBsYWNlKFsnLyhbQS1aXSspKFtBLVpdW2Etel0pLycsICcvKFthLXpcZF0pKFtBLVpdKS8nXSwgJ1wxX1wyJywgJHN0ci0+c3RyaW5nKSk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGljZShzdHJpbmcgJHJlcGxhY2VtZW50LCBpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IHBhcmVudAp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gc3Vic3RyX3JlcGxhY2UoJHRoaXMtPnN0cmluZywgJHJlcGxhY2VtZW50LCAkc3RhcnQsICRsZW5ndGggPz8gXFBIUF9JTlRfTUFYKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsID9pbnQgJGxpbWl0ID0gbnVsbCwgP2ludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAoMSA+ICRsaW1pdCA9ICRsaW1pdCA/PyBcUEhQX0lOVF9NQVgpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7Cn0KCmlmICgnJyA9PT0gJGRlbGltaXRlcikgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdTcGxpdCBkZWxpbWl0ZXIgaXMgZW1wdHkuJyk7Cn0KCmlmIChudWxsICE9PSAkZmxhZ3MpIHsKcmV0dXJuIHBhcmVudDo6c3BsaXQoJGRlbGltaXRlciwgJGxpbWl0LCAkZmxhZ3MpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRjaHVua3MgPSAkdGhpcy0+aWdub3JlQ2FzZQo/IHByZWdfc3BsaXQoJ3snLnByZWdfcXVvdGUoJGRlbGltaXRlcikuJ31pRCcsICR0aGlzLT5zdHJpbmcsICRsaW1pdCkKOiBleHBsb2RlKCRkZWxpbWl0ZXIsICR0aGlzLT5zdHJpbmcsICRsaW1pdCk7Cgpmb3JlYWNoICgkY2h1bmtzIGFzICYkY2h1bmspIHsKJHN0ci0+c3RyaW5nID0gJGNodW5rOwokY2h1bmsgPSBjbG9uZSAkc3RyOwp9CgpyZXR1cm4gJGNodW5rczsKfQoKcHVibGljIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoJHByZWZpeCk6IGJvb2wKewppZiAoJHByZWZpeCBpbnN0YW5jZW9mIHBhcmVudCkgewokcHJlZml4ID0gJHByZWZpeC0+c3RyaW5nOwp9IGVsc2VpZiAoIVxpc19zdHJpbmcoJHByZWZpeCkpIHsKcmV0dXJuIHBhcmVudDo6c3RhcnRzV2l0aCgkcHJlZml4KTsKfQoKcmV0dXJuICcnICE9PSAkcHJlZml4ICYmIDAgPT09ICgkdGhpcy0+aWdub3JlQ2FzZSA/IHN0cm5jYXNlY21wKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIFxzdHJsZW4oJHByZWZpeCkpIDogc3RybmNtcCgkdGhpcy0+c3RyaW5nLCAkcHJlZml4LCBcc3RybGVuKCRwcmVmaXgpKSk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0aXRsZShib29sICRhbGxXb3JkcyA9IGZhbHNlKTogcGFyZW50CnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkYWxsV29yZHMgPyB1Y3dvcmRzKCRzdHItPnN0cmluZykgOiB1Y2ZpcnN0KCRzdHItPnN0cmluZyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHRvVW5pY29kZVN0cmluZyg/c3RyaW5nICRmcm9tRW5jb2RpbmcgPSBudWxsKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkdGhpcy0+dG9Db2RlUG9pbnRTdHJpbmcoJGZyb21FbmNvZGluZyktPnN0cmluZyk7Cn0KCnB1YmxpYyBmdW5jdGlvbiB0b0NvZGVQb2ludFN0cmluZyg/c3RyaW5nICRmcm9tRW5jb2RpbmcgPSBudWxsKTogQ29kZVBvaW50U3RyaW5nCnsKJHUgPSBuZXcgQ29kZVBvaW50U3RyaW5nKCk7CgppZiAoXGluX2FycmF5KCRmcm9tRW5jb2RpbmcsIFtudWxsLCAndXRmOCcsICd1dGYtOCcsICdVVEY4JywgJ1VURi04J10sIHRydWUpICYmIHByZWdfbWF0Y2goJy8vdScsICR0aGlzLT5zdHJpbmcpKSB7CiR1LT5zdHJpbmcgPSAkdGhpcy0+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+c3RyaW5nID0gc3RyX3JlcGxhY2UoJGZyb20sICR0bywgJHRoaXMtPnN0cmluZyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2xpY2UoaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gbWJfc3Vic3RyKCR0aGlzLT5zdHJpbmcsICRzdGFydCwgJGxlbmd0aCwgJ1VURi04Jyk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGljZShzdHJpbmcgJHJlcGxhY2VtZW50LCBpbnQgJHN0YXJ0ID0gMCwgP2ludCAkbGVuZ3RoID0gbnVsbCk6IEFic3RyYWN0U3RyaW5nCnsKaWYgKCFwcmVnX21hdGNoKCcvL3UnLCAkcmVwbGFjZW1lbnQpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9Cgokc3RyID0gY2xvbmUgJHRoaXM7CiRzdGFydCA9ICRzdGFydCA/IFxzdHJsZW4obWJfc3Vic3RyKCR0aGlzLT5zdHJpbmcsIDAsICRzdGFydCwgJ1VURi04JykpIDogMDsKJGxlbmd0aCA9ICRsZW5ndGggPyBcc3RybGVuKG1iX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAkc3RhcnQsICRsZW5ndGgsICdVVEYtOCcpKSA6ICRsZW5ndGg7CiRzdHItPnN0cmluZyA9IHN1YnN0cl9yZXBsYWNlKCR0aGlzLT5zdHJpbmcsICRyZXBsYWNlbWVudCwgJHN0YXJ0LCAkbGVuZ3RoID8/IFxQSFBfSU5UX01BWCk7CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHNwbGl0KHN0cmluZyAkZGVsaW1pdGVyLCA/aW50ICRsaW1pdCA9IG51bGwsID9pbnQgJGZsYWdzID0gbnVsbCk6IGFycmF5CnsKaWYgKDEgPiAkbGltaXQgPSAkbGltaXQgPz8gXFBIUF9JTlRfTUFYKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpOwp9CgppZiAoJycgPT09ICRkZWxpbWl0ZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIGVtcHR5LicpOwp9CgppZiAobnVsbCAhPT0gJGZsYWdzKSB7CnJldHVybiBwYXJlbnQ6OnNwbGl0KCRkZWxpbWl0ZXIuJ3UnLCAkbGltaXQsICRmbGFncyk7Cn0KCmlmICghcHJlZ19tYXRjaCgnLy91JywgJGRlbGltaXRlcikpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIG5vdCBhIHZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gJHRoaXMtPmlnbm9yZUNhc2UKPyBwcmVnX3NwbGl0KCd7Jy5wcmVnX3F1b3RlKCRkZWxpbWl0ZXIpLid9aXVEJywgJHRoaXMtPnN0cmluZywgJGxpbWl0KQo6IGV4cGxvZGUoJGRlbGltaXRlciwgJHRoaXMtPnN0cmluZywgJGxpbWl0KTsKCmZvcmVhY2ggKCRjaHVua3MgYXMgJiRjaHVuaykgewokc3RyLT5zdHJpbmcgPSAkY2h1bms7CiRjaHVuayA9IGNsb25lICRzdHI7Cn0KCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICgkcHJlZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHByZWZpeCA9ICRwcmVmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkcHJlZml4KSB8fCAkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OnN0YXJ0c1dpdGgoJHByZWZpeCk7Cn0gZWxzZSB7CiRwcmVmaXggPSAoc3RyaW5nKSAkcHJlZml4Owp9CgppZiAoJycgPT09ICRwcmVmaXggfHwgIXByZWdfbWF0Y2goJy8vdScsICRwcmVmaXgpKSB7CnJldHVybiBmYWxzZTsKfQoKaWYgKCR0aGlzLT5pZ25vcmVDYXNlKSB7CnJldHVybiAwID09PSBtYl9zdHJpcG9zKCR0aGlzLT5zdHJpbmcsICRwcmVmaXgsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gMCA9PT0gc3RybmNtcCgkdGhpcy0+c3RyaW5nLCAkcHJlZml4LCBcc3RybGVuKCRwcmVmaXgpKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvbjsKCmludGVyZmFjZSBFeGNlcHRpb25JbnRlcmZhY2UgZXh0ZW5kcyBcVGhyb3dhYmxlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb247CgpjbGFzcyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24gZXh0ZW5kcyBcSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uIGltcGxlbWVudHMgRXhjZXB0aW9uSW50ZXJmYWNlCnsKfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb247CgpjbGFzcyBSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgXFJ1bnRpbWVFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25JbnRlcmZhY2UKewp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEluZmxlY3RvcjsKCmZpbmFsIGNsYXNzIEVuZ2xpc2hJbmZsZWN0b3IgaW1wbGVtZW50cyBJbmZsZWN0b3JJbnRlcmZhY2UKewoKCgoKCnByaXZhdGUgY29uc3QgUExVUkFMX01BUCA9IFsKCgoKCgoKClsnYWlyZXRjYWInLCA4LCB0cnVlLCB0cnVlLCAnYmFjdGVyaXVtJ10sCgoKWydhcm9wcm9jJywgNywgdHJ1ZSwgdHJ1ZSwgJ2NvcnB1cyddLAoKClsnYWlyZXRpcmMnLCA4LCB0cnVlLCB0cnVlLCAnY3JpdGVyaW9uJ10sCgoKWydhbHVjaXJydWMnLCA5LCB0cnVlLCB0cnVlLCAnY3VycmljdWx1bSddLAoKClsnYXJlbmVnJywgNiwgdHJ1ZSwgdHJ1ZSwgJ2dlbnVzJ10sCgoKWydhaWRlbScsIDUsIHRydWUsIHRydWUsICdtZWRpdW0nXSwKCgpbJ2FkbmFyb21lbScsIDksIHRydWUsIHRydWUsICdtZW1vcmFuZHVtJ10sCgoKWydhbmVtb25laHAnLCA5LCB0cnVlLCB0cnVlLCAncGhlbm9tZW5vbiddLAoKClsnYXRhcnRzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3N0cmF0dW0nXSwKCgpbJ2VhJywgMiwgdHJ1ZSwgdHJ1ZSwgJ2EnXSwKCgpbJ3NlY2l2cmVzJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3NlcnZpY2UnXSwKCgpbJ2VjaScsIDMsIGZhbHNlLCB0cnVlLCAnb3VzZSddLAoKClsnZXNlZScsIDQsIGZhbHNlLCB0cnVlLCAnb29zZSddLAoKClsnaScsIDEsIHRydWUsIHRydWUsICd1cyddLAoKClsnbmVtJywgMywgdHJ1ZSwgdHJ1ZSwgJ21hbiddLAoKClsnbmVyZGxpaGMnLCA4LCB0cnVlLCB0cnVlLCAnY2hpbGQnXSwKCgpbJ25leG8nLCA0LCBmYWxzZSwgZmFsc2UsICdveCddLAoKClsnc2VjaScsIDQsIGZhbHNlLCB0cnVlLCBbJ2V4JywgJ2l4JywgJ2ljZSddXSwKCgpbJ3NlZG9jJywgNSwgZmFsc2UsIHRydWUsICdjb2RlJ10sCgoKWydzZWlmbGVzJywgNywgdHJ1ZSwgdHJ1ZSwgJ3NlbGZpZSddLAoKClsnc2VpYm1veicsIDcsIHRydWUsIHRydWUsICd6b21iaWUnXSwKCgpbJ3NlaXZvbScsIDYsIHRydWUsIHRydWUsICdtb3ZpZSddLAoKClsnc2VtYW4nLCA1LCB0cnVlLCBmYWxzZSwgJ25hbWUnXSwKCgpbJ3Nlc3V0Y2VwJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3BlY3R1cyddLAoKClsndGVlZicsIDQsIHRydWUsIHRydWUsICdmb290J10sCgoKWydlc2VlZycsIDUsIHRydWUsIHRydWUsICdnb29zZSddLAoKClsnaHRlZXQnLCA1LCB0cnVlLCB0cnVlLCAndG9vdGgnXSwKCgpbJ3N3ZW4nLCA0LCB0cnVlLCB0cnVlLCAnbmV3cyddLAoKClsnc2VpcmVzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3NlcmllcyddLAoKClsnc2VpJywgMywgZmFsc2UsIHRydWUsICd5J10sCgoKWydzZXNzJywgNCwgdHJ1ZSwgZmFsc2UsICdzcyddLAoKClsnc2VzdXRhdHMnLCA4LCB0cnVlLCB0cnVlLCAnc3RhdHVzJ10sCgoKWydzZWwnLCAzLCB0cnVlLCB0cnVlLCAnbGUnXSwKCgoKCgpbJ3NlcycsIDMsIHRydWUsIHRydWUsIFsncycsICdzZScsICdzaXMnXV0sCgoKWydzZXZpdCcsIDUsIHRydWUsIHRydWUsICd0aXZlJ10sCgoKWydzZXZpcmQnLCA2LCBmYWxzZSwgdHJ1ZSwgJ2RyaXZlJ10sCgoKWydzZXZpJywgNCwgZmFsc2UsIHRydWUsICdpZmUnXSwKCgpbJ3Nldm9tJywgNSwgdHJ1ZSwgdHJ1ZSwgJ21vdmUnXSwKCgpbJ3NldicsIDMsIHRydWUsIHRydWUsIFsnZicsICd2ZScsICdmZiddXSwKCgpbJ3NleGEnLCA0LCBmYWxzZSwgZmFsc2UsIFsnYXgnLCAnYXhlJywgJ2F4aXMnXV0sCgoKWydzZXgnLCAzLCB0cnVlLCBmYWxzZSwgJ3gnXSwKCgpbJ3NlenonLCA0LCB0cnVlLCBmYWxzZSwgJ3onXSwKCgpbJ3N1YWUnLCA0LCBmYWxzZSwgdHJ1ZSwgJ2VhdSddLAoKClsnc2VlJywgMywgdHJ1ZSwgdHJ1ZSwgJ2VlJ10sCgoKWydzZWdkJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2RnZSddLAoKCgoKWydzZScsIDIsIHRydWUsIHRydWUsIFsnJywgJ2UnXV0sCgoKWydzdXRhdHMnLCA2LCB0cnVlLCB0cnVlLCAnc3RhdHVzJ10sCgoKWydzJywgMSwgdHJ1ZSwgdHJ1ZSwgJyddLAoKClsneHVhZScsIDQsIGZhbHNlLCB0cnVlLCAnZWF1J10sCgoKWydlbHBvZXAnLCA2LCB0cnVlLCB0cnVlLCAncGVyc29uJ10sCl07CgoKCgoKCnByaXZhdGUgY29uc3QgU0lOR1VMQVJfTUFQID0gWwoKCgoKCgoKWydzaXhhJywgNCwgZmFsc2UsIGZhbHNlLCAnYXhlcyddLAoKClsnYWlyZXRpcmMnLCA4LCBmYWxzZSwgZmFsc2UsICdjcml0ZXJpb24nXSwKCgpbJ2FsdWJlbicsIDYsIGZhbHNlLCBmYWxzZSwgJ25lYnVsYWUnXSwKCgpbJ2RsaWhjJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2NoaWxkcmVuJ10sCgoKWydlY2knLCAzLCBmYWxzZSwgdHJ1ZSwgJ2ljZXMnXSwKCgpbJ2VjaXZyZXMnLCA3LCB0cnVlLCB0cnVlLCAnc2VydmljZXMnXSwKCgpbJ2VmaScsIDMsIGZhbHNlLCB0cnVlLCAnaXZlcyddLAoKClsnZWlmbGVzJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3NlbGZpZXMnXSwKCgpbJ2Vpdm9tJywgNSwgdHJ1ZSwgdHJ1ZSwgJ21vdmllcyddLAoKClsnZXN1b2wnLCA1LCBmYWxzZSwgdHJ1ZSwgJ2xpY2UnXSwKCgpbJ2VzdW9tJywgNSwgZmFsc2UsIHRydWUsICdtaWNlJ10sCgoKWydlc29vJywgNCwgZmFsc2UsIHRydWUsICdlZXNlJ10sCgoKWydlcycsIDIsIHRydWUsIHRydWUsICdzZXMnXSwKCgpbJ2Vzb29nJywgNSwgdHJ1ZSwgdHJ1ZSwgJ2dlZXNlJ10sCgoKWydldicsIDIsIHRydWUsIHRydWUsICd2ZXMnXSwKCgpbJ2V2aXJkJywgNSwgZmFsc2UsIHRydWUsICdkcml2ZXMnXSwKCgpbJ2V2aXQnLCA0LCB0cnVlLCB0cnVlLCAndGl2ZXMnXSwKCgpbJ2V2b20nLCA0LCB0cnVlLCB0cnVlLCAnbW92ZXMnXSwKCgpbJ2ZmYXRzJywgNSwgdHJ1ZSwgdHJ1ZSwgJ3N0YXZlcyddLAoKClsnZmYnLCAyLCB0cnVlLCB0cnVlLCAnZmZzJ10sCgoKWydmJywgMSwgdHJ1ZSwgdHJ1ZSwgWydmcycsICd2ZXMnXV0sCgoKWydoYycsIDIsIHRydWUsIHRydWUsICdjaGVzJ10sCgoKWydocycsIDIsIHRydWUsIHRydWUsICdzaGVzJ10sCgoKWydodG9vdCcsIDUsIHRydWUsIHRydWUsICd0ZWV0aCddLAoKClsnbXVibGEnLCA1LCB0cnVlLCB0cnVlLCAnYWxidW1zJ10sCgoKWydtdScsIDIsIHRydWUsIHRydWUsICdhJ10sCgoKWyduYW0nLCAzLCB0cnVlLCB0cnVlLCAnbWVuJ10sCgoKWydub3NyZXAnLCA2LCB0cnVlLCB0cnVlLCBbJ3BlcnNvbnMnLCAncGVvcGxlJ11dLAoKClsnbm9pcmV0aXJjJywgOSwgdHJ1ZSwgdHJ1ZSwgJ2NyaXRlcmlhJ10sCgoKWydub25lbW9uZWhwJywgMTAsIHRydWUsIHRydWUsICdwaGVub21lbmEnXSwKCgpbJ29oY2UnLCA0LCB0cnVlLCB0cnVlLCAnZWNob2VzJ10sCgoKWydvcmVoJywgNCwgdHJ1ZSwgdHJ1ZSwgJ2hlcm9lcyddLAoKClsnc2FsdGEnLCA1LCB0cnVlLCB0cnVlLCAnYXRsYXNlcyddLAoKClsnc2FpbGEnLCA1LCB0cnVlLCB0cnVlLCAnYWxpYXNlcyddLAoKClsnc2lyaScsIDQsIHRydWUsIHRydWUsICdpcmlzZXMnXSwKCgoKClsnc2lzJywgMywgdHJ1ZSwgdHJ1ZSwgJ3NlcyddLAoKClsnc3MnLCAyLCB0cnVlLCBmYWxzZSwgJ3NzZXMnXSwKCgpbJ3N1YmFsbHlzJywgOCwgdHJ1ZSwgdHJ1ZSwgJ3N5bGxhYmknXSwKCgpbJ3N1YicsIDMsIHRydWUsIHRydWUsICdidXNlcyddLAoKClsnc3VjJywgMywgdHJ1ZSwgdHJ1ZSwgJ2N1c2VzJ10sCgoKWydzdXBtYWNvcHBpaCcsIDExLCBmYWxzZSwgZmFsc2UsICdoaXBwb2NhbXBpJ10sCgoKWydzdXAnLCAzLCB0cnVlLCB0cnVlLCAncHVzZXMnXSwKCgpbJ3N1dGF0cycsIDYsIHRydWUsIHRydWUsIFsnc3RhdHVzJywgJ3N0YXR1c2VzJ11dLAoKClsnc3V0Y2VwJywgNiwgdHJ1ZSwgdHJ1ZSwgJ3BlY3R1c2VzJ10sCgoKWydzdScsIDIsIHRydWUsIHRydWUsICdpJ10sCgoKWydzd2VuJywgNCwgdHJ1ZSwgdHJ1ZSwgJ25ld3MnXSwKCgpbJ3Rvb2YnLCA0LCB0cnVlLCB0cnVlLCAnZmVldCddLAoKClsndWFlJywgMywgZmFsc2UsIHRydWUsIFsnZWF1cycsICdlYXV4J11dLAoKClsneG8nLCAyLCBmYWxzZSwgZmFsc2UsICdveGVuJ10sCgoKWyd4YW9oJywgNCwgdHJ1ZSwgZmFsc2UsICdob2F4ZXMnXSwKCgpbJ3hlZG5pJywgNSwgZmFsc2UsIHRydWUsIFsnaW5kaWNpZXMnLCAnaW5kZXhlcyddXSwKCgpbJ3hhZicsIDMsIHRydWUsIHRydWUsIFsnZmF4ZXMnLCAnZmF4eGVzJ11dLAoKClsneG8nLCAyLCBmYWxzZSwgdHJ1ZSwgJ294ZXMnXSwKCgpbJ3gnLCAxLCB0cnVlLCBmYWxzZSwgWydjZXMnLCAneGVzJ11dLAoKClsneScsIDEsIGZhbHNlLCB0cnVlLCAnaWVzJ10sCgoKWyd6aXVxJywgNCwgdHJ1ZSwgZmFsc2UsICdxdWl6emVzJ10sCgoKWyd6JywgMSwgdHJ1ZSwgdHJ1ZSwgJ3plcyddLApdOwoKCgoKcHJpdmF0ZSBjb25zdCBVTklORkxFQ1RFRCA9IFsKJycsCgoKJ2F0YWQnLAoKCidyZWVkJywKCgondG5lbXBpdXFlJywKCgona2NhYmRlZWYnLAoKCidoc2lmJywKCgonaHRsYWVoJywKCgoneXJvdHNpaCcsCgoKJ29mbmknLAoKCidub2l0YW1yb2ZuaScsCgoKJ3llbm9tJywKCgonZXNvb20nLAoKCidzZWlyZXMnLAoKCidwZWVocycsCgoKJ3NlaWNlcHMnLAoKCidjaWZmYXJ0JywKCgondGZhcmNyaWEnLAoKCidlcmF3ZHJhaCcsCl07CgpwdWJsaWMgZnVuY3Rpb24gc2luZ3VsYXJpemUoc3RyaW5nICRwbHVyYWwpOiBhcnJheQp7CiRwbHVyYWxSZXYgPSBzdHJyZXYoJHBsdXJhbCk7CiRsb3dlclBsdXJhbFJldiA9IHN0cnRvbG93ZXIoJHBsdXJhbFJldik7CiRwbHVyYWxMZW5ndGggPSBcc3RybGVuKCRsb3dlclBsdXJhbFJldik7CgoKaWYgKFxpbl9hcnJheSgkbG93ZXJQbHVyYWxSZXYsIHNlbGY6OlVOSU5GTEVDVEVELCB0cnVlKSkgewpyZXR1cm4gWyRwbHVyYWxdOwp9CgoKCgoKZm9yZWFjaCAoc2VsZjo6UExVUkFMX01BUCBhcyAkbWFwKSB7CiRzdWZmaXggPSAkbWFwWzBdOwokc3VmZml4TGVuZ3RoID0gJG1hcFsxXTsKJGogPSAwOwoKCgp3aGlsZSAoJHN1ZmZpeFskal0gPT09ICRsb3dlclBsdXJhbFJldlskal0pIHsKCisrJGo7CgoKCmlmICgkaiA9PT0gJHN1ZmZpeExlbmd0aCkgewoKaWYgKCRqIDwgJHBsdXJhbExlbmd0aCkgewokbmV4dElzVm93ZWwgPSBzdHJfY29udGFpbnMoJ2FlaW91JywgJGxvd2VyUGx1cmFsUmV2WyRqXSk7CgppZiAoISRtYXBbMl0gJiYgJG5leHRJc1Zvd2VsKSB7CgpicmVhazsKfQoKaWYgKCEkbWFwWzNdICYmICEkbmV4dElzVm93ZWwpIHsKCmJyZWFrOwp9Cn0KCiRuZXdCYXNlID0gc3Vic3RyKCRwbHVyYWwsIDAsICRwbHVyYWxMZW5ndGggLSAkc3VmZml4TGVuZ3RoKTsKJG5ld1N1ZmZpeCA9ICRtYXBbNF07CgoKCgokZmlyc3RVcHBlciA9IGN0eXBlX3VwcGVyKCRwbHVyYWxSZXZbJGogLSAxXSk7CgppZiAoXGlzX2FycmF5KCRuZXdTdWZmaXgpKSB7CiRzaW5ndWxhcnMgPSBbXTsKCmZvcmVhY2ggKCRuZXdTdWZmaXggYXMgJG5ld1N1ZmZpeEVudHJ5KSB7CiRzaW5ndWxhcnNbXSA9ICRuZXdCYXNlLigkZmlyc3RVcHBlciA/IHVjZmlyc3QoJG5ld1N1ZmZpeEVudHJ5KSA6ICRuZXdTdWZmaXhFbnRyeSk7Cn0KCnJldHVybiAkc2luZ3VsYXJzOwp9CgpyZXR1cm4gWyRuZXdCYXNlLigkZmlyc3RVcHBlciA/IHVjZmlyc3QoJG5ld1N1ZmZpeCkgOiAkbmV3U3VmZml4KV07Cn0KCgppZiAoJGogPT09ICRwbHVyYWxMZW5ndGgpIHsKYnJlYWs7Cn0KfQp9CgoKcmV0dXJuIFskcGx1cmFsXTsKfQoKcHVibGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJHNpbmd1bGFyKTogYXJyYXkKewokc2luZ3VsYXJSZXYgPSBzdHJyZXYoJHNpbmd1bGFyKTsKJGxvd2VyU2luZ3VsYXJSZXYgPSBzdHJ0b2xvd2VyKCRzaW5ndWxhclJldik7CiRzaW5ndWxhckxlbmd0aCA9IFxzdHJsZW4oJGxvd2VyU2luZ3VsYXJSZXYpOwoKCmlmIChcaW5fYXJyYXkoJGxvd2VyU2luZ3VsYXJSZXYsIHNlbGY6OlVOSU5GTEVDVEVELCB0cnVlKSkgewpyZXR1cm4gWyRzaW5ndWxhcl07Cn0KCgoKCgpmb3JlYWNoIChzZWxmOjpTSU5HVUxBUl9NQVAgYXMgJG1hcCkgewokc3VmZml4ID0gJG1hcFswXTsKJHN1ZmZpeExlbmd0aCA9ICRtYXBbMV07CiRqID0gMDsKCgoKCndoaWxlICgkc3VmZml4WyRqXSA9PT0gJGxvd2VyU2luZ3VsYXJSZXZbJGpdKSB7CgorKyRqOwoKCgppZiAoJGogPT09ICRzdWZmaXhMZW5ndGgpIHsKCmlmICgkaiA8ICRzaW5ndWxhckxlbmd0aCkgewokbmV4dElzVm93ZWwgPSBzdHJfY29udGFpbnMoJ2FlaW91JywgJGxvd2VyU2luZ3VsYXJSZXZbJGpdKTsKCmlmICghJG1hcFsyXSAmJiAkbmV4dElzVm93ZWwpIHsKCmJyZWFrOwp9CgppZiAoISRtYXBbM10gJiYgISRuZXh0SXNWb3dlbCkgewoKYnJlYWs7Cn0KfQoKJG5ld0Jhc2UgPSBzdWJzdHIoJHNpbmd1bGFyLCAwLCAkc2luZ3VsYXJMZW5ndGggLSAkc3VmZml4TGVuZ3RoKTsKJG5ld1N1ZmZpeCA9ICRtYXBbNF07CgoKCgokZmlyc3RVcHBlciA9IGN0eXBlX3VwcGVyKCRzaW5ndWxhclJldlskaiAtIDFdKTsKCmlmIChcaXNfYXJyYXkoJG5ld1N1ZmZpeCkpIHsKJHBsdXJhbHMgPSBbXTsKCmZvcmVhY2ggKCRuZXdTdWZmaXggYXMgJG5ld1N1ZmZpeEVudHJ5KSB7CiRwbHVyYWxzW10gPSAkbmV3QmFzZS4oJGZpcnN0VXBwZXIgPyB1Y2ZpcnN0KCRuZXdTdWZmaXhFbnRyeSkgOiAkbmV3U3VmZml4RW50cnkpOwp9CgpyZXR1cm4gJHBsdXJhbHM7Cn0KCnJldHVybiBbJG5ld0Jhc2UuKCRmaXJzdFVwcGVyID8gdWNmaXJzdCgkbmV3U3VmZml4KSA6ICRuZXdTdWZmaXgpXTsKfQoKCmlmICgkaiA9PT0gJHNpbmd1bGFyTGVuZ3RoKSB7CmJyZWFrOwp9Cn0KfQoKCnJldHVybiBbJHNpbmd1bGFyLidzJ107Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xJbmZsZWN0b3I7CgoKCgoKCmZpbmFsIGNsYXNzIEZyZW5jaEluZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvckludGVyZmFjZQp7CgoKCgoKcHJpdmF0ZSBjb25zdCBQTFVSQUxJWkVfUkVHRVhQID0gWwoKCgoKClsnLyhzfHh8eikkL2knLCAnXDEnXSwKCgoKWycvKGVhdSkkL2knLCAnXDF4J10sCgoKClsnL14obGFuZGF1KSQvaScsICdcMXMnXSwKWycvKGF1KSQvaScsICdcMXgnXSwKCgoKWycvXihwbmV1fGJsZXV8w6ltZXUpJC9pJywgJ1wxcyddLApbJy8oZXUpJC9pJywgJ1wxeCddLAoKCgpbJy9eKGJhbHxjYXJuYXZhbHxjYXJhY2FsfGNoYWNhbHxjaG9yYWx8Y29ycmFsfMOpdGFsfGZlc3RpdmFsfHLDqWNpdGFsfHZhbCkkL2knLCAnXDFzJ10sClsnL2FsJC9pJywgJ1wxYXV4J10sCgoKWycvXihhc3BpcnxifGNvcnzDqW18ZmVybXxzb3VwaXJ8dHJhdnx2YW50fHZpdHIpYWlsJC9pJywgJ1wxYXV4J10sCgoKWycvXihiaWp8Y2FpbGx8Y2h8Z2VufGhpYnxqb3VqfHApb3UkL2knLCAnXDFvdXgnXSwKCgpbJy9eKGNpbnF1YW50ZXxzb2l4YW50ZXxtaWxsZSkkL2knLCAnXDEnXSwKCgpbJy9eKG1vbnxtYSkoc2lldXJ8ZGFtZXxkZW1vaXNlbGxlfHNlaWduZXVyKSQvJywgJ21lc1wycyddLApbJy9eKE1vbnxNYSkoc2lldXJ8ZGFtZXxkZW1vaXNlbGxlfHNlaWduZXVyKSQvJywgJ01lc1wycyddLApdOwoKCgoKcHJpdmF0ZSBjb25zdCBTSU5HVUxBUklaRV9SRUdFWFAgPSBbCgoKCgpbJy8oKGFzcGlyfGJ8Y29yfMOpbXxmZXJtfHNvdXBpcnx0cmF2fHZhbnR8dml0cikpYXV4JC9pJywgJ1wxYWlsJ10sCgoKClsnLyhlYXUpeCQvaScsICdcMSddLAoKCgpbJy8oYW1pcnxhbmltfGFyc2VufGJvY3xjYW58Y2FwaXR8Y2Fwb3J8Y2hldnxjcmlzdHxnw6luw6lyfGhvcGl0fGjDtHBpdHxpZMOpfGpvdXJufGxpdHRvcnxsb2N8bXxtw6l0fG1pbsOpcnxwcmluY2lwfHJhZGljfHRlcm1pbilhdXgkL2knLCAnXDFhbCddLAoKCgpbJy8oYXUpeCQvaScsICdcMSddLAoKCgpbJy8oZXUpeCQvaScsICdcMSddLAoKCgpbJy8oYmlqfGNhaWxsfGNofGdlbnxoaWJ8am91anxwKW91eCQvaScsICdcMW91J10sCgoKWycvXm1lcyhkYW1lfGRlbW9pc2VsbGUpcyQvJywgJ21hXDEnXSwKWycvXk1lcyhkYW1lfGRlbW9pc2VsbGUpcyQvJywgJ01hXDEnXSwKWycvXm1lcyhzaWV1cnxzZWlnbmV1cilzJC8nLCAnbW9uXDEnXSwKWycvXk1lcyhzaWV1cnxzZWlnbmV1cilzJC8nLCAnTW9uXDEnXSwKCgpbJy9zJC9pJywgJyddLApdOwoKCgoKCnByaXZhdGUgY29uc3QgVU5JTkZMRUNURUQgPSAnL14oYWJjw6hzfGFjY8Ooc3xhYnVzfGFsYmF0cm9zfGFuY2hvaXN8YW5nbGFpc3xhdXRvYnVzfGJvaXN8YnJlYmlzfGNhcnF1b2lzfGNhc3xjaGFzfGNvbGlzfGNvbmNvdXJzfGNvcnBzfGNvdXJzfGN5cHLDqHN8ZMOpY8Ooc3xkZXZpc3xkaXNjb3Vyc3xkb3N8ZW1iYXJyYXN8ZW5ncmFpc3xlbnRyZWxhY3N8ZXhjw6hzfGZpbHN8Zm9pc3xnw6JjaGlzfGdhcnN8Z2xhc3xow6lyb3N8aW50cnVzfGphcnN8anVzfGtlcm3DqHN8bGFjaXN8bGVnc3xsaWxhc3xtYXJhaXN8bWFyc3xtYXRlbGFzfG3DqXByaXN8bWV0c3xtb2lzfG1vcnN8b2J1c3xvc3xwYWxhaXN8cGFyYWRpc3xwYXJjb3Vyc3xwYXJkZXNzdXN8cGF5c3xwbHVzaWV1cnN8cG9pZHN8cG9pc3xwb3Vsc3xwcmludGVtcHN8cHJvY2Vzc3VzfHByb2dyw6hzfHB1aXRzfHB1c3xyYWJhaXN8cmFkaXN8cmVjb3JzfHJlY291cnN8cmVmdXN8cmVsYWlzfHJlbW9yZHN8cmVtb3VzfHJpY3R1c3xyaGlub2PDqXJvc3xyZXBhc3xydWJpc3xzYW5zfHNhc3xzZWNvdXJzfHNlbnN8c291cmlzfHN1Y2PDqHN8dGFsdXN8dGFwaXN8dGFzfHRhdWRpc3x0ZW1wc3x0aWVyc3x1bml2ZXJzfHZlbG91cnN8dmVyZ2xhc3x2ZXJuaXN8dmlydXMpJC9pJzsKCgoKCnB1YmxpYyBmdW5jdGlvbiBzaW5ndWxhcml6ZShzdHJpbmcgJHBsdXJhbCk6IGFycmF5CnsKaWYgKCR0aGlzLT5pc0luZmxlY3RlZFdvcmQoJHBsdXJhbCkpIHsKcmV0dXJuIFskcGx1cmFsXTsKfQoKZm9yZWFjaCAoc2VsZjo6U0lOR1VMQVJJWkVfUkVHRVhQIGFzICRydWxlKSB7ClskcmVnZXhwLCAkcmVwbGFjZV0gPSAkcnVsZTsKCmlmICgxID09PSBwcmVnX21hdGNoKCRyZWdleHAsICRwbHVyYWwpKSB7CnJldHVybiBbcHJlZ19yZXBsYWNlKCRyZWdleHAsICRyZXBsYWNlLCAkcGx1cmFsKV07Cn0KfQoKcmV0dXJuIFskcGx1cmFsXTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJHNpbmd1bGFyKTogYXJyYXkKewppZiAoJHRoaXMtPmlzSW5mbGVjdGVkV29yZCgkc2luZ3VsYXIpKSB7CnJldHVybiBbJHNpbmd1bGFyXTsKfQoKZm9yZWFjaCAoc2VsZjo6UExVUkFMSVpFX1JFR0VYUCBhcyAkcnVsZSkgewpbJHJlZ2V4cCwgJHJlcGxhY2VdID0gJHJ1bGU7CgppZiAoMSA9PT0gcHJlZ19tYXRjaCgkcmVnZXhwLCAkc2luZ3VsYXIpKSB7CnJldHVybiBbcHJlZ19yZXBsYWNlKCRyZWdleHAsICRyZXBsYWNlLCAkc2luZ3VsYXIpXTsKfQp9CgpyZXR1cm4gWyRzaW5ndWxhci4ncyddOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIGlzSW5mbGVjdGVkV29yZChzdHJpbmcgJHdvcmQpOiBib29sCnsKcmV0dXJuIDEgPT09IHByZWdfbWF0Y2goc2VsZjo6VU5JTkZMRUNURUQsICR3b3JkKTsKfQp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEluZmxlY3RvcjsKCmludGVyZmFjZSBJbmZsZWN0b3JJbnRlcmZhY2UKewoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHNpbmd1bGFyaXplKHN0cmluZyAkcGx1cmFsKTogYXJyYXk7CgoKCgoKCgoKcHVibGljIGZ1bmN0aW9uIHBsdXJhbGl6ZShzdHJpbmcgJHNpbmd1bGFyKTogYXJyYXk7Cn0KCkNvcHlyaWdodCAoYykgMjAxOS1wcmVzZW50IEZhYmllbiBQb3RlbmNpZXIKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwKaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQKdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTgpUSEUgU09GVFdBUkUuCgo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZzsKCgoKCgoKY2xhc3MgTGF6eVN0cmluZyBpbXBsZW1lbnRzIFxTdHJpbmdhYmxlLCBcSnNvblNlcmlhbGl6YWJsZQp7CnByaXZhdGUgJHZhbHVlOwoKCgoKCgpwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGZyb21DYWxsYWJsZSgkY2FsbGJhY2ssIC4uLiRhcmd1bWVudHMpOiBzZWxmCnsKaWYgKCFcaXNfY2FsbGFibGUoJGNhbGxiYWNrKSAmJiAhKFxpc19hcnJheSgkY2FsbGJhY2spICYmIGlzc2V0KCRjYWxsYmFja1swXSkgJiYgJGNhbGxiYWNrWzBdIGluc3RhbmNlb2YgXENsb3N1cmUgJiYgMiA+PSBcY291bnQoJGNhbGxiYWNrKSkpIHsKdGhyb3cgbmV3IFxUeXBlRXJyb3Ioc3ByaW50ZignQXJndW1lbnQgMSBwYXNzZWQgdG8gIiVzKCkiIG11c3QgYmUgYSBjYWxsYWJsZSBvciBhIFtDbG9zdXJlLCBtZXRob2RdIGxhenktY2FsbGFibGUsICIlcyIgZ2l2ZW4uJywgX19NRVRIT0RfXywgZ2V0X2RlYnVnX3R5cGUoJGNhbGxiYWNrKSkpOwp9CgokbGF6eVN0cmluZyA9IG5ldyBzdGF0aWMoKTsKJGxhenlTdHJpbmctPnZhbHVlID0gc3RhdGljIGZ1bmN0aW9uICgpIHVzZSAoJiRjYWxsYmFjaywgJiRhcmd1bWVudHMsICYkdmFsdWUpOiBzdHJpbmcgewppZiAobnVsbCAhPT0gJGFyZ3VtZW50cykgewppZiAoIVxpc19jYWxsYWJsZSgkY2FsbGJhY2spKSB7CiRjYWxsYmFja1swXSA9ICRjYWxsYmFja1swXSgpOwokY2FsbGJhY2tbMV0gPSAkY2FsbGJhY2tbMV0gPz8gJ19faW52b2tlJzsKfQokdmFsdWUgPSAkY2FsbGJhY2soLi4uJGFyZ3VtZW50cyk7CiRjYWxsYmFjayA9IHNlbGY6OmdldFByZXR0eU5hbWUoJGNhbGxiYWNrKTsKJGFyZ3VtZW50cyA9IG51bGw7Cn0KCnJldHVybiAkdmFsdWUgPz8gJyc7Cn07CgpyZXR1cm4gJGxhenlTdHJpbmc7Cn0KCgoKCgoKcHVibGljIHN0YXRpYyBmdW5jdGlvbiBmcm9tU3RyaW5nYWJsZSgkdmFsdWUpOiBzZWxmCnsKaWYgKCFzZWxmOjppc1N0cmluZ2FibGUoJHZhbHVlKSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAxIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBhIHNjYWxhciBvciBhIHN0cmluZ2FibGUgb2JqZWN0LCAiJXMiIGdpdmVuLicsIF9fTUVUSE9EX18sIGdldF9kZWJ1Z190eXBlKCR2YWx1ZSkpKTsKfQoKaWYgKFxpc19vYmplY3QoJHZhbHVlKSkgewpyZXR1cm4gc3RhdGljOjpmcm9tQ2FsbGFibGUoWyR2YWx1ZSwgJ19fdG9TdHJpbmcnXSk7Cn0KCiRsYXp5U3RyaW5nID0gbmV3IHN0YXRpYygpOwokbGF6eVN0cmluZy0+dmFsdWUgPSAoc3RyaW5nKSAkdmFsdWU7CgpyZXR1cm4gJGxhenlTdHJpbmc7Cn0KCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNTdHJpbmdhYmxlKCR2YWx1ZSk6IGJvb2wKewpyZXR1cm4gXGlzX3N0cmluZygkdmFsdWUpIHx8ICR2YWx1ZSBpbnN0YW5jZW9mIHNlbGYgfHwgKFxpc19vYmplY3QoJHZhbHVlKSA/IG1ldGhvZF9leGlzdHMoJHZhbHVlLCAnX190b1N0cmluZycpIDogXGlzX3NjYWxhcigkdmFsdWUpKTsKfQoKCgoKCgoKCmZpbmFsIHB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gcmVzb2x2ZSgkdmFsdWUpOiBzdHJpbmcKewpyZXR1cm4gJHZhbHVlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gX190b1N0cmluZygpCnsKaWYgKFxpc19zdHJpbmcoJHRoaXMtPnZhbHVlKSkgewpyZXR1cm4gJHRoaXMtPnZhbHVlOwp9Cgp0cnkgewpyZXR1cm4gJHRoaXMtPnZhbHVlID0gKCR0aGlzLT52YWx1ZSkoKTsKfSBjYXRjaCAoXFRocm93YWJsZSAkZSkgewppZiAoXFR5cGVFcnJvcjo6Y2xhc3MgPT09IFxnZXRfY2xhc3MoJGUpICYmIF9fRklMRV9fID09PSAkZS0+Z2V0RmlsZSgpKSB7CiR0eXBlID0gZXhwbG9kZSgnLCAnLCAkZS0+Z2V0TWVzc2FnZSgpKTsKJHR5cGUgPSBzdWJzdHIoYXJyYXlfcG9wKCR0eXBlKSwgMCwgLVxzdHJsZW4oJyByZXR1cm5lZCcpKTsKJHIgPSBuZXcgXFJlZmxlY3Rpb25GdW5jdGlvbigkdGhpcy0+dmFsdWUpOwokY2FsbGJhY2sgPSAkci0+Z2V0U3RhdGljVmFyaWFibGVzKClbJ2NhbGxiYWNrJ107CgokZSA9IG5ldyBcVHlwZUVycm9yKHNwcmludGYoJ1JldHVybiB2YWx1ZSBvZiAlcygpIHBhc3NlZCB0byAlczo6ZnJvbUNhbGxhYmxlKCkgbXVzdCBiZSBvZiB0aGUgdHlwZSBzdHJpbmcsICVzIHJldHVybmVkLicsICRjYWxsYmFjaywgc3RhdGljOjpjbGFzcywgJHR5cGUpKTsKfQoKaWYgKFxQSFBfVkVSU0lPTl9JRCA8IDcwNDAwKSB7CgpyZXR1cm4gdHJpZ2dlcl9lcnJvcigkZSwgXEVfVVNFUl9FUlJPUik7Cn0KCnRocm93ICRlOwp9Cn0KCnB1YmxpYyBmdW5jdGlvbiBfX3NsZWVwKCk6IGFycmF5CnsKJHRoaXMtPl9fdG9TdHJpbmcoKTsKCnJldHVybiBbJ3ZhbHVlJ107Cn0KCnB1YmxpYyBmdW5jdGlvbiBqc29uU2VyaWFsaXplKCk6IHN0cmluZwp7CnJldHVybiAkdGhpcy0+X190b1N0cmluZygpOwp9Cgpwcml2YXRlIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkKewp9Cgpwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBnZXRQcmV0dHlOYW1lKGNhbGxhYmxlICRjYWxsYmFjayk6IHN0cmluZwp7CmlmIChcaXNfc3RyaW5nKCRjYWxsYmFjaykpIHsKcmV0dXJuICRjYWxsYmFjazsKfQoKaWYgKFxpc19hcnJheSgkY2FsbGJhY2spKSB7CiRjbGFzcyA9IFxpc19vYmplY3QoJGNhbGxiYWNrWzBdKSA/IGdldF9kZWJ1Z190eXBlKCRjYWxsYmFja1swXSkgOiAkY2FsbGJhY2tbMF07CiRtZXRob2QgPSAkY2FsbGJhY2tbMV07Cn0gZWxzZWlmICgkY2FsbGJhY2sgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewokciA9IG5ldyBcUmVmbGVjdGlvbkZ1bmN0aW9uKCRjYWxsYmFjayk7CgppZiAoc3RyX2NvbnRhaW5zKCRyLT5uYW1lLCAne2Nsb3N1cmUnKSB8fCAhJGNsYXNzID0gXFBIUF9WRVJTSU9OX0lEID49IDgwMTExID8gJHItPmdldENsb3N1cmVDYWxsZWRDbGFzcygpIDogJHItPmdldENsb3N1cmVTY29wZUNsYXNzKCkpIHsKcmV0dXJuICRyLT5uYW1lOwp9CgokY2xhc3MgPSAkY2xhc3MtPm5hbWU7CiRtZXRob2QgPSAkci0+bmFtZTsKfSBlbHNlIHsKJGNsYXNzID0gZ2V0X2RlYnVnX3R5cGUoJGNhbGxiYWNrKTsKJG1ldGhvZCA9ICdfX2ludm9rZSc7Cn0KCnJldHVybiAkY2xhc3MuJzo6Jy4kbWV0aG9kOwp9Cn0KPD9waHAKCgoKCgoKCgpyZXR1cm4gWwpbCjQzNTIsCjQ0NDcsCl0sClsKODk4NiwKODk4NywKXSwKWwo5MDAxLAo5MDAxLApdLApbCjkwMDIsCjkwMDIsCl0sClsKOTE5MywKOTE5NiwKXSwKWwo5MjAwLAo5MjAwLApdLApbCjkyMDMsCjkyMDMsCl0sClsKOTcyNSwKOTcyNiwKXSwKWwo5NzQ4LAo5NzQ5LApdLApbCjk3NzYsCjk3ODMsCl0sClsKOTgwMCwKOTgxMSwKXSwKWwo5ODU1LAo5ODU1LApdLApbCjk4NjYsCjk4NzEsCl0sClsKOTg3NSwKOTg3NSwKXSwKWwo5ODg5LAo5ODg5LApdLApbCjk4OTgsCjk4OTksCl0sClsKOTkxNywKOTkxOCwKXSwKWwo5OTI0LAo5OTI1LApdLApbCjk5MzQsCjk5MzQsCl0sClsKOTk0MCwKOTk0MCwKXSwKWwo5OTYyLAo5OTYyLApdLApbCjk5NzAsCjk5NzEsCl0sClsKOTk3MywKOTk3MywKXSwKWwo5OTc4LAo5OTc4LApdLApbCjk5ODEsCjk5ODEsCl0sClsKOTk4OSwKOTk4OSwKXSwKWwo5OTk0LAo5OTk1LApdLApbCjEwMDI0LAoxMDAyNCwKXSwKWwoxMDA2MCwKMTAwNjAsCl0sClsKMTAwNjIsCjEwMDYyLApdLApbCjEwMDY3LAoxMDA2OSwKXSwKWwoxMDA3MSwKMTAwNzEsCl0sClsKMTAxMzMsCjEwMTM1LApdLApbCjEwMTYwLAoxMDE2MCwKXSwKWwoxMDE3NSwKMTAxNzUsCl0sClsKMTEwMzUsCjExMDM2LApdLApbCjExMDg4LAoxMTA4OCwKXSwKWwoxMTA5MywKMTEwOTMsCl0sClsKMTE5MDQsCjExOTI5LApdLApbCjExOTMxLAoxMjAxOSwKXSwKWwoxMjAzMiwKMTIyNDUsCl0sClsKMTIyNzIsCjEyMjg3LApdLApbCjEyMjg4LAoxMjI4OCwKXSwKWwoxMjI4OSwKMTIyOTEsCl0sClsKMTIyOTIsCjEyMjkyLApdLApbCjEyMjkzLAoxMjI5MywKXSwKWwoxMjI5NCwKMTIyOTQsCl0sClsKMTIyOTUsCjEyMjk1LApdLApbCjEyMjk2LAoxMjI5NiwKXSwKWwoxMjI5NywKMTIyOTcsCl0sClsKMTIyOTgsCjEyMjk4LApdLApbCjEyMjk5LAoxMjI5OSwKXSwKWwoxMjMwMCwKMTIzMDAsCl0sClsKMTIzMDEsCjEyMzAxLApdLApbCjEyMzAyLAoxMjMwMiwKXSwKWwoxMjMwMywKMTIzMDMsCl0sClsKMTIzMDQsCjEyMzA0LApdLApbCjEyMzA1LAoxMjMwNSwKXSwKWwoxMjMwNiwKMTIzMDcsCl0sClsKMTIzMDgsCjEyMzA4LApdLApbCjEyMzA5LAoxMjMwOSwKXSwKWwoxMjMxMCwKMTIzMTAsCl0sClsKMTIzMTEsCjEyMzExLApdLApbCjEyMzEyLAoxMjMxMiwKXSwKWwoxMjMxMywKMTIzMTMsCl0sClsKMTIzMTQsCjEyMzE0LApdLApbCjEyMzE1LAoxMjMxNSwKXSwKWwoxMjMxNiwKMTIzMTYsCl0sClsKMTIzMTcsCjEyMzE3LApdLApbCjEyMzE4LAoxMjMxOSwKXSwKWwoxMjMyMCwKMTIzMjAsCl0sClsKMTIzMjEsCjEyMzI5LApdLApbCjEyMzMwLAoxMjMzMywKXSwKWwoxMjMzNCwKMTIzMzUsCl0sClsKMTIzMzYsCjEyMzM2LApdLApbCjEyMzM3LAoxMjM0MSwKXSwKWwoxMjM0MiwKMTIzNDMsCl0sClsKMTIzNDQsCjEyMzQ2LApdLApbCjEyMzQ3LAoxMjM0NywKXSwKWwoxMjM0OCwKMTIzNDgsCl0sClsKMTIzNDksCjEyMzQ5LApdLApbCjEyMzUwLAoxMjM1MCwKXSwKWwoxMjM1MywKMTI0MzgsCl0sClsKMTI0NDEsCjEyNDQyLApdLApbCjEyNDQzLAoxMjQ0NCwKXSwKWwoxMjQ0NSwKMTI0NDYsCl0sClsKMTI0NDcsCjEyNDQ3LApdLApbCjEyNDQ4LAoxMjQ0OCwKXSwKWwoxMjQ0OSwKMTI1MzgsCl0sClsKMTI1MzksCjEyNTM5LApdLApbCjEyNTQwLAoxMjU0MiwKXSwKWwoxMjU0MywKMTI1NDMsCl0sClsKMTI1NDksCjEyNTkxLApdLApbCjEyNTkzLAoxMjY4NiwKXSwKWwoxMjY4OCwKMTI2ODksCl0sClsKMTI2OTAsCjEyNjkzLApdLApbCjEyNjk0LAoxMjcwMywKXSwKWwoxMjcwNCwKMTI3MzUsCl0sClsKMTI3MzYsCjEyNzczLApdLApbCjEyNzgzLAoxMjc4MywKXSwKWwoxMjc4NCwKMTI3OTksCl0sClsKMTI4MDAsCjEyODMwLApdLApbCjEyODMyLAoxMjg0MSwKXSwKWwoxMjg0MiwKMTI4NzEsCl0sClsKMTI4ODAsCjEyODgwLApdLApbCjEyODgxLAoxMjg5NSwKXSwKWwoxMjg5NiwKMTI5MjcsCl0sClsKMTI5MjgsCjEyOTM3LApdLApbCjEyOTM4LAoxMjk3NiwKXSwKWwoxMjk3NywKMTI5OTEsCl0sClsKMTI5OTIsCjEzMDU1LApdLApbCjEzMDU2LAoxMzMxMSwKXSwKWwoxMzMxMiwKMTk5MDMsCl0sClsKMTk5MDQsCjE5OTY3LApdLApbCjE5OTY4LAo0MDk1OSwKXSwKWwo0MDk2MCwKNDA5ODAsCl0sClsKNDA5ODEsCjQwOTgxLApdLApbCjQwOTgyLAo0MjEyNCwKXSwKWwo0MjEyOCwKNDIxODIsCl0sClsKNDMzNjAsCjQzMzg4LApdLApbCjQ0MDMyLAo1NTIwMywKXSwKWwo2Mzc0NCwKNjQxMDksCl0sClsKNjQxMTAsCjY0MTExLApdLApbCjY0MTEyLAo2NDIxNywKXSwKWwo2NDIxOCwKNjQyNTUsCl0sClsKNjUwNDAsCjY1MDQ2LApdLApbCjY1MDQ3LAo2NTA0NywKXSwKWwo2NTA0OCwKNjUwNDgsCl0sClsKNjUwNDksCjY1MDQ5LApdLApbCjY1MDcyLAo2NTA3MiwKXSwKWwo2NTA3MywKNjUwNzQsCl0sClsKNjUwNzUsCjY1MDc2LApdLApbCjY1MDc3LAo2NTA3NywKXSwKWwo2NTA3OCwKNjUwNzgsCl0sClsKNjUwNzksCjY1MDc5LApdLApbCjY1MDgwLAo2NTA4MCwKXSwKWwo2NTA4MSwKNjUwODEsCl0sClsKNjUwODIsCjY1MDgyLApdLApbCjY1MDgzLAo2NTA4MywKXSwKWwo2NTA4NCwKNjUwODQsCl0sClsKNjUwODUsCjY1MDg1LApdLApbCjY1MDg2LAo2NTA4NiwKXSwKWwo2NTA4NywKNjUwODcsCl0sClsKNjUwODgsCjY1MDg4LApdLApbCjY1MDg5LAo2NTA4OSwKXSwKWwo2NTA5MCwKNjUwOTAsCl0sClsKNjUwOTEsCjY1MDkxLApdLApbCjY1MDkyLAo2NTA5MiwKXSwKWwo2NTA5MywKNjUwOTQsCl0sClsKNjUwOTUsCjY1MDk1LApdLApbCjY1MDk2LAo2NTA5NiwKXSwKWwo2NTA5NywKNjUxMDAsCl0sClsKNjUxMDEsCjY1MTAzLApdLApbCjY1MTA0LAo2NTEwNiwKXSwKWwo2NTEwOCwKNjUxMTEsCl0sClsKNjUxMTIsCjY1MTEyLApdLApbCjY1MTEzLAo2NTExMywKXSwKWwo2NTExNCwKNjUxMTQsCl0sClsKNjUxMTUsCjY1MTE1LApdLApbCjY1MTE2LAo2NTExNiwKXSwKWwo2NTExNywKNjUxMTcsCl0sClsKNjUxMTgsCjY1MTE4LApdLApbCjY1MTE5LAo2NTEyMSwKXSwKWwo2NTEyMiwKNjUxMjIsCl0sClsKNjUxMjMsCjY1MTIzLApdLApbCjY1MTI0LAo2NTEyNiwKXSwKWwo2NTEyOCwKNjUxMjgsCl0sClsKNjUxMjksCjY1MTI5LApdLApbCjY1MTMwLAo2NTEzMSwKXSwKWwo2NTI4MSwKNjUyODMsCl0sClsKNjUyODQsCjY1Mjg0LApdLApbCjY1Mjg1LAo2NTI4NywKXSwKWwo2NTI4OCwKNjUyODgsCl0sClsKNjUyODksCjY1Mjg5LApdLApbCjY1MjkwLAo2NTI5MCwKXSwKWwo2NTI5MSwKNjUyOTEsCl0sClsKNjUyOTIsCjY1MjkyLApdLApbCjY1MjkzLAo2NTI5MywKXSwKWwo2NTI5NCwKNjUyOTUsCl0sClsKNjUyOTYsCjY1MzA1LApdLApbCjY1MzA2LAo2NTMwNywKXSwKWwo2NTMwOCwKNjUzMTAsCl0sClsKNjUzMTEsCjY1MzEyLApdLApbCjY1MzEzLAo2NTMzOCwKXSwKWwo2NTMzOSwKNjUzMzksCl0sClsKNjUzNDAsCjY1MzQwLApdLApbCjY1MzQxLAo2NTM0MSwKXSwKWwo2NTM0MiwKNjUzNDIsCl0sClsKNjUzNDMsCjY1MzQzLApdLApbCjY1MzQ0LAo2NTM0NCwKXSwKWwo2NTM0NSwKNjUzNzAsCl0sClsKNjUzNzEsCjY1MzcxLApdLApbCjY1MzcyLAo2NTM3MiwKXSwKWwo2NTM3MywKNjUzNzMsCl0sClsKNjUzNzQsCjY1Mzc0LApdLApbCjY1Mzc1LAo2NTM3NSwKXSwKWwo2NTM3NiwKNjUzNzYsCl0sClsKNjU1MDQsCjY1NTA1LApdLApbCjY1NTA2LAo2NTUwNiwKXSwKWwo2NTUwNywKNjU1MDcsCl0sClsKNjU1MDgsCjY1NTA4LApdLApbCjY1NTA5LAo2NTUxMCwKXSwKWwo5NDE3NiwKOTQxNzcsCl0sClsKOTQxNzgsCjk0MTc4LApdLApbCjk0MTc5LAo5NDE3OSwKXSwKWwo5NDE4MCwKOTQxODAsCl0sClsKOTQxOTIsCjk0MTkzLApdLApbCjk0MjA4LAoxMDAzNDMsCl0sClsKMTAwMzUyLAoxMDExMTksCl0sClsKMTAxMTIwLAoxMDE1ODksCl0sClsKMTAxNjMxLAoxMDE2MzEsCl0sClsKMTAxNjMyLAoxMDE2NDAsCl0sClsKMTEwNTc2LAoxMTA1NzksCl0sClsKMTEwNTgxLAoxMTA1ODcsCl0sClsKMTEwNTg5LAoxMTA1OTAsCl0sClsKMTEwNTkyLAoxMTA4NDcsCl0sClsKMTEwODQ4LAoxMTA4ODIsCl0sClsKMTEwODk4LAoxMTA4OTgsCl0sClsKMTEwOTI4LAoxMTA5MzAsCl0sClsKMTEwOTMzLAoxMTA5MzMsCl0sClsKMTEwOTQ4LAoxMTA5NTEsCl0sClsKMTEwOTYwLAoxMTEzNTUsCl0sClsKMTE5NTUyLAoxMTk2MzgsCl0sClsKMTE5NjQ4LAoxMTk2NzAsCl0sClsKMTI2OTgwLAoxMjY5ODAsCl0sClsKMTI3MTgzLAoxMjcxODMsCl0sClsKMTI3Mzc0LAoxMjczNzQsCl0sClsKMTI3Mzc3LAoxMjczODYsCl0sClsKMTI3NDg4LAoxMjc0OTAsCl0sClsKMTI3NTA0LAoxMjc1NDcsCl0sClsKMTI3NTUyLAoxMjc1NjAsCl0sClsKMTI3NTY4LAoxMjc1NjksCl0sClsKMTI3NTg0LAoxMjc1ODksCl0sClsKMTI3NzQ0LAoxMjc3NzYsCl0sClsKMTI3Nzg5LAoxMjc3OTcsCl0sClsKMTI3Nzk5LAoxMjc4NjgsCl0sClsKMTI3ODcwLAoxMjc4OTEsCl0sClsKMTI3OTA0LAoxMjc5NDYsCl0sClsKMTI3OTUxLAoxMjc5NTUsCl0sClsKMTI3OTY4LAoxMjc5ODQsCl0sClsKMTI3OTg4LAoxMjc5ODgsCl0sClsKMTI3OTkyLAoxMjc5OTQsCl0sClsKMTI3OTk1LAoxMjc5OTksCl0sClsKMTI4MDAwLAoxMjgwNjIsCl0sClsKMTI4MDY0LAoxMjgwNjQsCl0sClsKMTI4MDY2LAoxMjgyNTIsCl0sClsKMTI4MjU1LAoxMjgzMTcsCl0sClsKMTI4MzMxLAoxMjgzMzQsCl0sClsKMTI4MzM2LAoxMjgzNTksCl0sClsKMTI4Mzc4LAoxMjgzNzgsCl0sClsKMTI4NDA1LAoxMjg0MDYsCl0sClsKMTI4NDIwLAoxMjg0MjAsCl0sClsKMTI4NTA3LAoxMjg1MTEsCl0sClsKMTI4NTEyLAoxMjg1OTEsCl0sClsKMTI4NjQwLAoxMjg3MDksCl0sClsKMTI4NzE2LAoxMjg3MTYsCl0sClsKMTI4NzIwLAoxMjg3MjIsCl0sClsKMTI4NzI1LAoxMjg3MjcsCl0sClsKMTI4NzMyLAoxMjg3MzUsCl0sClsKMTI4NzQ3LAoxMjg3NDgsCl0sClsKMTI4NzU2LAoxMjg3NjQsCl0sClsKMTI4OTkyLAoxMjkwMDMsCl0sClsKMTI5MDA4LAoxMjkwMDgsCl0sClsKMTI5MjkyLAoxMjkzMzgsCl0sClsKMTI5MzQwLAoxMjkzNDksCl0sClsKMTI5MzUxLAoxMjk1MzUsCl0sClsKMTI5NjQ4LAoxMjk2NjAsCl0sClsKMTI5NjY0LAoxMjk2NzMsCl0sClsKMTI5Njc5LAoxMjk3MzQsCl0sClsKMTI5NzQyLAoxMjk3NTYsCl0sClsKMTI5NzU5LAoxMjk3NjksCl0sClsKMTI5Nzc2LAoxMjk3ODQsCl0sClsKMTMxMDcyLAoxNzM3OTEsCl0sClsKMTczNzkyLAoxNzM4MjMsCl0sClsKMTczODI0LAoxNzc5NzcsCl0sClsKMTc3OTc4LAoxNzc5ODMsCl0sClsKMTc3OTg0LAoxNzgyMDUsCl0sClsKMTc4MjA2LAoxNzgyMDcsCl0sClsKMTc4MjA4LAoxODM5NjksCl0sClsKMTgzOTcwLAoxODM5ODMsCl0sClsKMTgzOTg0LAoxOTE0NTYsCl0sClsKMTkxNDU3LAoxOTE0NzEsCl0sClsKMTkxNDcyLAoxOTIwOTMsCl0sClsKMTkyMDk0LAoxOTQ1NTksCl0sClsKMTk0NTYwLAoxOTUxMDEsCl0sClsKMTk1MTAyLAoxOTUxMDMsCl0sClsKMTk1MTA0LAoxOTY2MDUsCl0sClsKMTk2NjA4LAoyMDE1NDYsCl0sClsKMjAxNTQ3LAoyMDE1NTEsCl0sClsKMjAxNTUyLAoyMDU3NDMsCl0sClsKMjA1NzQ0LAoyNjIxNDEsCl0sCl07Cjw/cGhwCgoKCgoKCgoKcmV0dXJuIFsKWwo3NjgsCjg3OSwKXSwKWwoxMTU1LAoxMTU5LApdLApbCjExNjAsCjExNjEsCl0sClsKMTQyNSwKMTQ2OSwKXSwKWwoxNDcxLAoxNDcxLApdLApbCjE0NzMsCjE0NzQsCl0sClsKMTQ3NiwKMTQ3NywKXSwKWwoxNDc5LAoxNDc5LApdLApbCjE1NTIsCjE1NjIsCl0sClsKMTYxMSwKMTYzMSwKXSwKWwoxNjQ4LAoxNjQ4LApdLApbCjE3NTAsCjE3NTYsCl0sClsKMTc1OSwKMTc2NCwKXSwKWwoxNzY3LAoxNzY4LApdLApbCjE3NzAsCjE3NzMsCl0sClsKMTgwOSwKMTgwOSwKXSwKWwoxODQwLAoxODY2LApdLApbCjE5NTgsCjE5NjgsCl0sClsKMjAyNywKMjAzNSwKXSwKWwoyMDQ1LAoyMDQ1LApdLApbCjIwNzAsCjIwNzMsCl0sClsKMjA3NSwKMjA4MywKXSwKWwoyMDg1LAoyMDg3LApdLApbCjIwODksCjIwOTMsCl0sClsKMjEzNywKMjEzOSwKXSwKWwoyMTk5LAoyMjA3LApdLApbCjIyNTAsCjIyNzMsCl0sClsKMjI3NSwKMjMwNiwKXSwKWwoyMzYyLAoyMzYyLApdLApbCjIzNjQsCjIzNjQsCl0sClsKMjM2OSwKMjM3NiwKXSwKWwoyMzgxLAoyMzgxLApdLApbCjIzODUsCjIzOTEsCl0sClsKMjQwMiwKMjQwMywKXSwKWwoyNDMzLAoyNDMzLApdLApbCjI0OTIsCjI0OTIsCl0sClsKMjQ5NywKMjUwMCwKXSwKWwoyNTA5LAoyNTA5LApdLApbCjI1MzAsCjI1MzEsCl0sClsKMjU1OCwKMjU1OCwKXSwKWwoyNTYxLAoyNTYyLApdLApbCjI2MjAsCjI2MjAsCl0sClsKMjYyNSwKMjYyNiwKXSwKWwoyNjMxLAoyNjMyLApdLApbCjI2MzUsCjI2MzcsCl0sClsKMjY0MSwKMjY0MSwKXSwKWwoyNjcyLAoyNjczLApdLApbCjI2NzcsCjI2NzcsCl0sClsKMjY4OSwKMjY5MCwKXSwKWwoyNzQ4LAoyNzQ4LApdLApbCjI3NTMsCjI3NTcsCl0sClsKMjc1OSwKMjc2MCwKXSwKWwoyNzY1LAoyNzY1LApdLApbCjI3ODYsCjI3ODcsCl0sClsKMjgxMCwKMjgxNSwKXSwKWwoyODE3LAoyODE3LApdLApbCjI4NzYsCjI4NzYsCl0sClsKMjg3OSwKMjg3OSwKXSwKWwoyODgxLAoyODg0LApdLApbCjI4OTMsCjI4OTMsCl0sClsKMjkwMSwKMjkwMiwKXSwKWwoyOTE0LAoyOTE1LApdLApbCjI5NDYsCjI5NDYsCl0sClsKMzAwOCwKMzAwOCwKXSwKWwozMDIxLAozMDIxLApdLApbCjMwNzIsCjMwNzIsCl0sClsKMzA3NiwKMzA3NiwKXSwKWwozMTMyLAozMTMyLApdLApbCjMxMzQsCjMxMzYsCl0sClsKMzE0MiwKMzE0NCwKXSwKWwozMTQ2LAozMTQ5LApdLApbCjMxNTcsCjMxNTgsCl0sClsKMzE3MCwKMzE3MSwKXSwKWwozMjAxLAozMjAxLApdLApbCjMyNjAsCjMyNjAsCl0sClsKMzI2MywKMzI2MywKXSwKWwozMjcwLAozMjcwLApdLApbCjMyNzYsCjMyNzcsCl0sClsKMzI5OCwKMzI5OSwKXSwKWwozMzI4LAozMzI5LApdLApbCjMzODcsCjMzODgsCl0sClsKMzM5MywKMzM5NiwKXSwKWwozNDA1LAozNDA1LApdLApbCjM0MjYsCjM0MjcsCl0sClsKMzQ1NywKMzQ1NywKXSwKWwozNTMwLAozNTMwLApdLApbCjM1MzgsCjM1NDAsCl0sClsKMzU0MiwKMzU0MiwKXSwKWwozNjMzLAozNjMzLApdLApbCjM2MzYsCjM2NDIsCl0sClsKMzY1NSwKMzY2MiwKXSwKWwozNzYxLAozNzYxLApdLApbCjM3NjQsCjM3NzIsCl0sClsKMzc4NCwKMzc5MCwKXSwKWwozODY0LAozODY1LApdLApbCjM4OTMsCjM4OTMsCl0sClsKMzg5NSwKMzg5NSwKXSwKWwozODk3LAozODk3LApdLApbCjM5NTMsCjM5NjYsCl0sClsKMzk2OCwKMzk3MiwKXSwKWwozOTc0LAozOTc1LApdLApbCjM5ODEsCjM5OTEsCl0sClsKMzk5MywKNDAyOCwKXSwKWwo0MDM4LAo0MDM4LApdLApbCjQxNDEsCjQxNDQsCl0sClsKNDE0NiwKNDE1MSwKXSwKWwo0MTUzLAo0MTU0LApdLApbCjQxNTcsCjQxNTgsCl0sClsKNDE4NCwKNDE4NSwKXSwKWwo0MTkwLAo0MTkyLApdLApbCjQyMDksCjQyMTIsCl0sClsKNDIyNiwKNDIyNiwKXSwKWwo0MjI5LAo0MjMwLApdLApbCjQyMzcsCjQyMzcsCl0sClsKNDI1MywKNDI1MywKXSwKWwo0OTU3LAo0OTU5LApdLApbCjU5MDYsCjU5MDgsCl0sClsKNTkzOCwKNTkzOSwKXSwKWwo1OTcwLAo1OTcxLApdLApbCjYwMDIsCjYwMDMsCl0sClsKNjA2OCwKNjA2OSwKXSwKWwo2MDcxLAo2MDc3LApdLApbCjYwODYsCjYwODYsCl0sClsKNjA4OSwKNjA5OSwKXSwKWwo2MTA5LAo2MTA5LApdLApbCjYxNTUsCjYxNTcsCl0sClsKNjE1OSwKNjE1OSwKXSwKWwo2Mjc3LAo2Mjc4LApdLApbCjYzMTMsCjYzMTMsCl0sClsKNjQzMiwKNjQzNCwKXSwKWwo2NDM5LAo2NDQwLApdLApbCjY0NTAsCjY0NTAsCl0sClsKNjQ1NywKNjQ1OSwKXSwKWwo2Njc5LAo2NjgwLApdLApbCjY2ODMsCjY2ODMsCl0sClsKNjc0MiwKNjc0MiwKXSwKWwo2NzQ0LAo2NzUwLApdLApbCjY3NTIsCjY3NTIsCl0sClsKNjc1NCwKNjc1NCwKXSwKWwo2NzU3LAo2NzY0LApdLApbCjY3NzEsCjY3ODAsCl0sClsKNjc4MywKNjc4MywKXSwKWwo2ODMyLAo2ODQ1LApdLApbCjY4NDYsCjY4NDYsCl0sClsKNjg0NywKNjg2MiwKXSwKWwo2OTEyLAo2OTE1LApdLApbCjY5NjQsCjY5NjQsCl0sClsKNjk2NiwKNjk3MCwKXSwKWwo2OTcyLAo2OTcyLApdLApbCjY5NzgsCjY5NzgsCl0sClsKNzAxOSwKNzAyNywKXSwKWwo3MDQwLAo3MDQxLApdLApbCjcwNzQsCjcwNzcsCl0sClsKNzA4MCwKNzA4MSwKXSwKWwo3MDgzLAo3MDg1LApdLApbCjcxNDIsCjcxNDIsCl0sClsKNzE0NCwKNzE0NSwKXSwKWwo3MTQ5LAo3MTQ5LApdLApbCjcxNTEsCjcxNTMsCl0sClsKNzIxMiwKNzIxOSwKXSwKWwo3MjIyLAo3MjIzLApdLApbCjczNzYsCjczNzgsCl0sClsKNzM4MCwKNzM5MiwKXSwKWwo3Mzk0LAo3NDAwLApdLApbCjc0MDUsCjc0MDUsCl0sClsKNzQxMiwKNzQxMiwKXSwKWwo3NDE2LAo3NDE3LApdLApbCjc2MTYsCjc2NzksCl0sClsKODQwMCwKODQxMiwKXSwKWwo4NDEzLAo4NDE2LApdLApbCjg0MTcsCjg0MTcsCl0sClsKODQxOCwKODQyMCwKXSwKWwo4NDIxLAo4NDMyLApdLApbCjExNTAzLAoxMTUwNSwKXSwKWwoxMTY0NywKMTE2NDcsCl0sClsKMTE3NDQsCjExNzc1LApdLApbCjEyMzMwLAoxMjMzMywKXSwKWwoxMjQ0MSwKMTI0NDIsCl0sClsKNDI2MDcsCjQyNjA3LApdLApbCjQyNjA4LAo0MjYxMCwKXSwKWwo0MjYxMiwKNDI2MjEsCl0sClsKNDI2NTQsCjQyNjU1LApdLApbCjQyNzM2LAo0MjczNywKXSwKWwo0MzAxMCwKNDMwMTAsCl0sClsKNDMwMTQsCjQzMDE0LApdLApbCjQzMDE5LAo0MzAxOSwKXSwKWwo0MzA0NSwKNDMwNDYsCl0sClsKNDMwNTIsCjQzMDUyLApdLApbCjQzMjA0LAo0MzIwNSwKXSwKWwo0MzIzMiwKNDMyNDksCl0sClsKNDMyNjMsCjQzMjYzLApdLApbCjQzMzAyLAo0MzMwOSwKXSwKWwo0MzMzNSwKNDMzNDUsCl0sClsKNDMzOTIsCjQzMzk0LApdLApbCjQzNDQzLAo0MzQ0MywKXSwKWwo0MzQ0NiwKNDM0NDksCl0sClsKNDM0NTIsCjQzNDUzLApdLApbCjQzNDkzLAo0MzQ5MywKXSwKWwo0MzU2MSwKNDM1NjYsCl0sClsKNDM1NjksCjQzNTcwLApdLApbCjQzNTczLAo0MzU3NCwKXSwKWwo0MzU4NywKNDM1ODcsCl0sClsKNDM1OTYsCjQzNTk2LApdLApbCjQzNjQ0LAo0MzY0NCwKXSwKWwo0MzY5NiwKNDM2OTYsCl0sClsKNDM2OTgsCjQzNzAwLApdLApbCjQzNzAzLAo0MzcwNCwKXSwKWwo0MzcxMCwKNDM3MTEsCl0sClsKNDM3MTMsCjQzNzEzLApdLApbCjQzNzU2LAo0Mzc1NywKXSwKWwo0Mzc2NiwKNDM3NjYsCl0sClsKNDQwMDUsCjQ0MDA1LApdLApbCjQ0MDA4LAo0NDAwOCwKXSwKWwo0NDAxMywKNDQwMTMsCl0sClsKNjQyODYsCjY0Mjg2LApdLApbCjY1MDI0LAo2NTAzOSwKXSwKWwo2NTA1NiwKNjUwNzEsCl0sClsKNjYwNDUsCjY2MDQ1LApdLApbCjY2MjcyLAo2NjI3MiwKXSwKWwo2NjQyMiwKNjY0MjYsCl0sClsKNjgwOTcsCjY4MDk5LApdLApbCjY4MTAxLAo2ODEwMiwKXSwKWwo2ODEwOCwKNjgxMTEsCl0sClsKNjgxNTIsCjY4MTU0LApdLApbCjY4MTU5LAo2ODE1OSwKXSwKWwo2ODMyNSwKNjgzMjYsCl0sClsKNjg5MDAsCjY4OTAzLApdLApbCjY4OTY5LAo2ODk3MywKXSwKWwo2OTI5MSwKNjkyOTIsCl0sClsKNjkzNzIsCjY5Mzc1LApdLApbCjY5NDQ2LAo2OTQ1NiwKXSwKWwo2OTUwNiwKNjk1MDksCl0sClsKNjk2MzMsCjY5NjMzLApdLApbCjY5Njg4LAo2OTcwMiwKXSwKWwo2OTc0NCwKNjk3NDQsCl0sClsKNjk3NDcsCjY5NzQ4LApdLApbCjY5NzU5LAo2OTc2MSwKXSwKWwo2OTgxMSwKNjk4MTQsCl0sClsKNjk4MTcsCjY5ODE4LApdLApbCjY5ODI2LAo2OTgyNiwKXSwKWwo2OTg4OCwKNjk4OTAsCl0sClsKNjk5MjcsCjY5OTMxLApdLApbCjY5OTMzLAo2OTk0MCwKXSwKWwo3MDAwMywKNzAwMDMsCl0sClsKNzAwMTYsCjcwMDE3LApdLApbCjcwMDcwLAo3MDA3OCwKXSwKWwo3MDA4OSwKNzAwOTIsCl0sClsKNzAwOTUsCjcwMDk1LApdLApbCjcwMTkxLAo3MDE5MywKXSwKWwo3MDE5NiwKNzAxOTYsCl0sClsKNzAxOTgsCjcwMTk5LApdLApbCjcwMjA2LAo3MDIwNiwKXSwKWwo3MDIwOSwKNzAyMDksCl0sClsKNzAzNjcsCjcwMzY3LApdLApbCjcwMzcxLAo3MDM3OCwKXSwKWwo3MDQwMCwKNzA0MDEsCl0sClsKNzA0NTksCjcwNDYwLApdLApbCjcwNDY0LAo3MDQ2NCwKXSwKWwo3MDUwMiwKNzA1MDgsCl0sClsKNzA1MTIsCjcwNTE2LApdLApbCjcwNTg3LAo3MDU5MiwKXSwKWwo3MDYwNiwKNzA2MDYsCl0sClsKNzA2MDgsCjcwNjA4LApdLApbCjcwNjEwLAo3MDYxMCwKXSwKWwo3MDYyNSwKNzA2MjYsCl0sClsKNzA3MTIsCjcwNzE5LApdLApbCjcwNzIyLAo3MDcyNCwKXSwKWwo3MDcyNiwKNzA3MjYsCl0sClsKNzA3NTAsCjcwNzUwLApdLApbCjcwODM1LAo3MDg0MCwKXSwKWwo3MDg0MiwKNzA4NDIsCl0sClsKNzA4NDcsCjcwODQ4LApdLApbCjcwODUwLAo3MDg1MSwKXSwKWwo3MTA5MCwKNzEwOTMsCl0sClsKNzExMDAsCjcxMTAxLApdLApbCjcxMTAzLAo3MTEwNCwKXSwKWwo3MTEzMiwKNzExMzMsCl0sClsKNzEyMTksCjcxMjI2LApdLApbCjcxMjI5LAo3MTIyOSwKXSwKWwo3MTIzMSwKNzEyMzIsCl0sClsKNzEzMzksCjcxMzM5LApdLApbCjcxMzQxLAo3MTM0MSwKXSwKWwo3MTM0NCwKNzEzNDksCl0sClsKNzEzNTEsCjcxMzUxLApdLApbCjcxNDUzLAo3MTQ1MywKXSwKWwo3MTQ1NSwKNzE0NTUsCl0sClsKNzE0NTgsCjcxNDYxLApdLApbCjcxNDYzLAo3MTQ2NywKXSwKWwo3MTcyNywKNzE3MzUsCl0sClsKNzE3MzcsCjcxNzM4LApdLApbCjcxOTk1LAo3MTk5NiwKXSwKWwo3MTk5OCwKNzE5OTgsCl0sClsKNzIwMDMsCjcyMDAzLApdLApbCjcyMTQ4LAo3MjE1MSwKXSwKWwo3MjE1NCwKNzIxNTUsCl0sClsKNzIxNjAsCjcyMTYwLApdLApbCjcyMTkzLAo3MjIwMiwKXSwKWwo3MjI0MywKNzIyNDgsCl0sClsKNzIyNTEsCjcyMjU0LApdLApbCjcyMjYzLAo3MjI2MywKXSwKWwo3MjI3MywKNzIyNzgsCl0sClsKNzIyODEsCjcyMjgzLApdLApbCjcyMzMwLAo3MjM0MiwKXSwKWwo3MjM0NCwKNzIzNDUsCl0sClsKNzI3NTIsCjcyNzU4LApdLApbCjcyNzYwLAo3Mjc2NSwKXSwKWwo3Mjc2NywKNzI3NjcsCl0sClsKNzI4NTAsCjcyODcxLApdLApbCjcyODc0LAo3Mjg4MCwKXSwKWwo3Mjg4MiwKNzI4ODMsCl0sClsKNzI4ODUsCjcyODg2LApdLApbCjczMDA5LAo3MzAxNCwKXSwKWwo3MzAxOCwKNzMwMTgsCl0sClsKNzMwMjAsCjczMDIxLApdLApbCjczMDIzLAo3MzAyOSwKXSwKWwo3MzAzMSwKNzMwMzEsCl0sClsKNzMxMDQsCjczMTA1LApdLApbCjczMTA5LAo3MzEwOSwKXSwKWwo3MzExMSwKNzMxMTEsCl0sClsKNzM0NTksCjczNDYwLApdLApbCjczNDcyLAo3MzQ3MywKXSwKWwo3MzUyNiwKNzM1MzAsCl0sClsKNzM1MzYsCjczNTM2LApdLApbCjczNTM4LAo3MzUzOCwKXSwKWwo3MzU2MiwKNzM1NjIsCl0sClsKNzg5MTIsCjc4OTEyLApdLApbCjc4OTE5LAo3ODkzMywKXSwKWwo5MDM5OCwKOTA0MDksCl0sClsKOTA0MTMsCjkwNDE1LApdLApbCjkyOTEyLAo5MjkxNiwKXSwKWwo5Mjk3NiwKOTI5ODIsCl0sClsKOTQwMzEsCjk0MDMxLApdLApbCjk0MDk1LAo5NDA5OCwKXSwKWwo5NDE4MCwKOTQxODAsCl0sClsKMTEzODIxLAoxMTM4MjIsCl0sClsKMTE4NTI4LAoxMTg1NzMsCl0sClsKMTE4NTc2LAoxMTg1OTgsCl0sClsKMTE5MTQzLAoxMTkxNDUsCl0sClsKMTE5MTYzLAoxMTkxNzAsCl0sClsKMTE5MTczLAoxMTkxNzksCl0sClsKMTE5MjEwLAoxMTkyMTMsCl0sClsKMTE5MzYyLAoxMTkzNjQsCl0sClsKMTIxMzQ0LAoxMjEzOTgsCl0sClsKMTIxNDAzLAoxMjE0NTIsCl0sClsKMTIxNDYxLAoxMjE0NjEsCl0sClsKMTIxNDc2LAoxMjE0NzYsCl0sClsKMTIxNDk5LAoxMjE1MDMsCl0sClsKMTIxNTA1LAoxMjE1MTksCl0sClsKMTIyODgwLAoxMjI4ODYsCl0sClsKMTIyODg4LAoxMjI5MDQsCl0sClsKMTIyOTA3LAoxMjI5MTMsCl0sClsKMTIyOTE1LAoxMjI5MTYsCl0sClsKMTIyOTE4LAoxMjI5MjIsCl0sClsKMTIzMDIzLAoxMjMwMjMsCl0sClsKMTIzMTg0LAoxMjMxOTAsCl0sClsKMTIzNTY2LAoxMjM1NjYsCl0sClsKMTIzNjI4LAoxMjM2MzEsCl0sClsKMTI0MTQwLAoxMjQxNDMsCl0sClsKMTI0Mzk4LAoxMjQzOTksCl0sClsKMTI1MTM2LAoxMjUxNDIsCl0sClsKMTI1MjUyLAoxMjUyNTgsCl0sClsKOTE3NzYwLAo5MTc5OTksCl0sCl07Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKaWYgKCFcZnVuY3Rpb25fZXhpc3RzKHU6OmNsYXNzKSkgewpmdW5jdGlvbiB1KD9zdHJpbmcgJHN0cmluZyA9ICcnKTogVW5pY29kZVN0cmluZwp7CnJldHVybiBuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nID8/ICcnKTsKfQp9CgppZiAoIVxmdW5jdGlvbl9leGlzdHMoYjo6Y2xhc3MpKSB7CmZ1bmN0aW9uIGIoP3N0cmluZyAkc3RyaW5nID0gJycpOiBCeXRlU3RyaW5nCnsKcmV0dXJuIG5ldyBCeXRlU3RyaW5nKCRzdHJpbmcgPz8gJycpOwp9Cn0KCmlmICghXGZ1bmN0aW9uX2V4aXN0cyhzOjpjbGFzcykpIHsKCgoKZnVuY3Rpb24gcyg/c3RyaW5nICRzdHJpbmcgPSAnJyk6IEFic3RyYWN0U3RyaW5nCnsKJHN0cmluZyA9ICRzdHJpbmcgPz8gJyc7CgpyZXR1cm4gcHJlZ19tYXRjaCgnLy91JywgJHN0cmluZykgPyBuZXcgVW5pY29kZVN0cmluZygkc3RyaW5nKSA6IG5ldyBCeXRlU3RyaW5nKCRzdHJpbmcpOwp9Cn0KPD9waHAKCgoKCgoKCgoKCm5hbWVzcGFjZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcU2x1Z2dlcjsKCnVzZSBTeW1mb255XENvbXBvbmVudFxTdHJpbmdcQWJzdHJhY3RVbmljb2RlU3RyaW5nOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFVuaWNvZGVTdHJpbmc7CnVzZSBTeW1mb255XENvbnRyYWN0c1xUcmFuc2xhdGlvblxMb2NhbGVBd2FyZUludGVyZmFjZTsKCmlmICghaW50ZXJmYWNlX2V4aXN0cyhMb2NhbGVBd2FyZUludGVyZmFjZTo6Y2xhc3MpKSB7CnRocm93IG5ldyBcTG9naWNFeGNlcHRpb24oJ1lvdSBjYW5ub3QgdXNlIHRoZSAiU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXFNsdWdnZXJcQXNjaWlTbHVnZ2VyIiBhcyB0aGUgInN5bWZvbnkvdHJhbnNsYXRpb24tY29udHJhY3RzIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQuIFRyeSBydW5uaW5nICJjb21wb3NlciByZXF1aXJlIHN5bWZvbnkvdHJhbnNsYXRpb24tY29udHJhY3RzIi4nKTsKfQoKCgoKY2xhc3MgQXNjaWlTbHVnZ2VyIGltcGxlbWVudHMgU2x1Z2dlckludGVyZmFjZSwgTG9jYWxlQXdhcmVJbnRlcmZhY2UKewpwcml2YXRlIGNvbnN0IExPQ0FMRV9UT19UUkFOU0xJVEVSQVRPUl9JRCA9IFsKJ2FtJyA9PiAnQW1oYXJpYy1MYXRpbicsCidhcicgPT4gJ0FyYWJpYy1MYXRpbicsCidheicgPT4gJ0F6ZXJiYWlqYW5pLUxhdGluJywKJ2JlJyA9PiAnQmVsYXJ1c2lhbi1MYXRpbicsCidiZycgPT4gJ0J1bGdhcmlhbi1MYXRpbicsCidibicgPT4gJ0JlbmdhbGktTGF0aW4nLAonZGUnID0+ICdkZS1BU0NJSScsCidlbCcgPT4gJ0dyZWVrLUxhdGluJywKJ2ZhJyA9PiAnUGVyc2lhbi1MYXRpbicsCidoZScgPT4gJ0hlYnJldy1MYXRpbicsCidoeScgPT4gJ0FybWVuaWFuLUxhdGluJywKJ2thJyA9PiAnR2VvcmdpYW4tTGF0aW4nLAona2snID0+ICdLYXpha2gtTGF0aW4nLAona3knID0+ICdLaXJnaGl6LUxhdGluJywKJ2tvJyA9PiAnS29yZWFuLUxhdGluJywKJ21rJyA9PiAnTWFjZWRvbmlhbi1MYXRpbicsCidtbicgPT4gJ01vbmdvbGlhbi1MYXRpbicsCidvcicgPT4gJ09yaXlhLUxhdGluJywKJ3BzJyA9PiAnUGFzaHRvLUxhdGluJywKJ3J1JyA9PiAnUnVzc2lhbi1MYXRpbicsCidzcicgPT4gJ1NlcmJpYW4tTGF0aW4nLAonc3JfQ3lybCcgPT4gJ1NlcmJpYW4tTGF0aW4nLAondGgnID0+ICdUaGFpLUxhdGluJywKJ3RrJyA9PiAnVHVya21lbi1MYXRpbicsCid1aycgPT4gJ1VrcmFpbmlhbi1MYXRpbicsCid1eicgPT4gJ1V6YmVrLUxhdGluJywKJ3poJyA9PiAnSGFuLUxhdGluJywKXTsKCnByaXZhdGUgJGRlZmF1bHRMb2NhbGU7CnByaXZhdGUgJHN5bWJvbHNNYXAgPSBbCidlbicgPT4gWydAJyA9PiAnYXQnLCAnJicgPT4gJ2FuZCddLApdOwoKCgoKCgpwcml2YXRlICR0cmFuc2xpdGVyYXRvcnMgPSBbXTsKCgoKCnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCg/c3RyaW5nICRkZWZhdWx0TG9jYWxlID0gbnVsbCwgJHN5bWJvbHNNYXAgPSBudWxsKQp7CmlmIChudWxsICE9PSAkc3ltYm9sc01hcCAmJiAhXGlzX2FycmF5KCRzeW1ib2xzTWFwKSAmJiAhJHN5bWJvbHNNYXAgaW5zdGFuY2VvZiBcQ2xvc3VyZSkgewp0aHJvdyBuZXcgXFR5cGVFcnJvcihzcHJpbnRmKCdBcmd1bWVudCAyIHBhc3NlZCB0byAiJXMoKSIgbXVzdCBiZSBhcnJheSwgQ2xvc3VyZSBvciBudWxsLCAiJXMiIGdpdmVuLicsIF9fTUVUSE9EX18sIFxnZXR0eXBlKCRzeW1ib2xzTWFwKSkpOwp9CgokdGhpcy0+ZGVmYXVsdExvY2FsZSA9ICRkZWZhdWx0TG9jYWxlOwokdGhpcy0+c3ltYm9sc01hcCA9ICRzeW1ib2xzTWFwID8/ICR0aGlzLT5zeW1ib2xzTWFwOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gc2V0TG9jYWxlKCRsb2NhbGUpCnsKJHRoaXMtPmRlZmF1bHRMb2NhbGUgPSAkbG9jYWxlOwp9CgoKCgpwdWJsaWMgZnVuY3Rpb24gZ2V0TG9jYWxlKCkKewpyZXR1cm4gJHRoaXMtPmRlZmF1bHRMb2NhbGU7Cn0KCgoKCnB1YmxpYyBmdW5jdGlvbiBzbHVnKHN0cmluZyAkc3RyaW5nLCBzdHJpbmcgJHNlcGFyYXRvciA9ICctJywgP3N0cmluZyAkbG9jYWxlID0gbnVsbCk6IEFic3RyYWN0VW5pY29kZVN0cmluZwp7CiRsb2NhbGUgPSAkbG9jYWxlID8/ICR0aGlzLT5kZWZhdWx0TG9jYWxlOwoKJHRyYW5zbGl0ZXJhdG9yID0gW107CmlmICgkbG9jYWxlICYmICgnZGUnID09PSAkbG9jYWxlIHx8IDAgPT09IHN0cnBvcygkbG9jYWxlLCAnZGVfJykpKSB7CgokdHJhbnNsaXRlcmF0b3IgPSBbJ2RlLUFTQ0lJJ107Cn0gZWxzZWlmIChcZnVuY3Rpb25fZXhpc3RzKCd0cmFuc2xpdGVyYXRvcl90cmFuc2xpdGVyYXRlJykgJiYgJGxvY2FsZSkgewokdHJhbnNsaXRlcmF0b3IgPSAoYXJyYXkpICR0aGlzLT5jcmVhdGVUcmFuc2xpdGVyYXRvcigkbG9jYWxlKTsKfQoKaWYgKCR0aGlzLT5zeW1ib2xzTWFwIGluc3RhbmNlb2YgXENsb3N1cmUpIHsKCgokc3ltYm9sc01hcCA9ICR0aGlzLT5zeW1ib2xzTWFwOwphcnJheV91bnNoaWZ0KCR0cmFuc2xpdGVyYXRvciwgc3RhdGljIGZ1bmN0aW9uICgkcykgdXNlICgkc3ltYm9sc01hcCwgJGxvY2FsZSkgewpyZXR1cm4gJHN5bWJvbHNNYXAoJHMsICRsb2NhbGUpOwp9KTsKfQoKJHVuaWNvZGVTdHJpbmcgPSAobmV3IFVuaWNvZGVTdHJpbmcoJHN0cmluZykpLT5hc2NpaSgkdHJhbnNsaXRlcmF0b3IpOwoKaWYgKFxpc19hcnJheSgkdGhpcy0+c3ltYm9sc01hcCkpIHsKJG1hcCA9IG51bGw7CmlmIChpc3NldCgkdGhpcy0+c3ltYm9sc01hcFskbG9jYWxlXSkpIHsKJG1hcCA9ICR0aGlzLT5zeW1ib2xzTWFwWyRsb2NhbGVdOwp9IGVsc2UgewokcGFyZW50ID0gc2VsZjo6Z2V0UGFyZW50TG9jYWxlKCRsb2NhbGUpOwppZiAoJHBhcmVudCAmJiBpc3NldCgkdGhpcy0+c3ltYm9sc01hcFskcGFyZW50XSkpIHsKJG1hcCA9ICR0aGlzLT5zeW1ib2xzTWFwWyRwYXJlbnRdOwp9Cn0KaWYgKCRtYXApIHsKZm9yZWFjaCAoJG1hcCBhcyAkY2hhciA9PiAkcmVwbGFjZSkgewokdW5pY29kZVN0cmluZyA9ICR1bmljb2RlU3RyaW5nLT5yZXBsYWNlKCRjaGFyLCAnICcuJHJlcGxhY2UuJyAnKTsKfQp9Cn0KCnJldHVybiAkdW5pY29kZVN0cmluZwotPnJlcGxhY2VNYXRjaGVzKCcvW15BLVphLXowLTldKysvJywgJHNlcGFyYXRvcikKLT50cmltKCRzZXBhcmF0b3IpCjsKfQoKcHJpdmF0ZSBmdW5jdGlvbiBjcmVhdGVUcmFuc2xpdGVyYXRvcihzdHJpbmcgJGxvY2FsZSk6ID9cVHJhbnNsaXRlcmF0b3IKewppZiAoXGFycmF5X2tleV9leGlzdHMoJGxvY2FsZSwgJHRoaXMtPnRyYW5zbGl0ZXJhdG9ycykpIHsKcmV0dXJuICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJGxvY2FsZV07Cn0KCgppZiAoJGlkID0gc2VsZjo6TE9DQUxFX1RPX1RSQU5TTElURVJBVE9SX0lEWyRsb2NhbGVdID8/IG51bGwpIHsKcmV0dXJuICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJGxvY2FsZV0gPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQuJy9CR04nKSA/PyBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQpOwp9CgoKaWYgKCEkcGFyZW50ID0gc2VsZjo6Z2V0UGFyZW50TG9jYWxlKCRsb2NhbGUpKSB7CnJldHVybiAkdGhpcy0+dHJhbnNsaXRlcmF0b3JzWyRsb2NhbGVdID0gbnVsbDsKfQoKCmlmICgkaWQgPSBzZWxmOjpMT0NBTEVfVE9fVFJBTlNMSVRFUkFUT1JfSURbJHBhcmVudF0gPz8gbnVsbCkgewokdHJhbnNsaXRlcmF0b3IgPSBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQuJy9CR04nKSA/PyBcVHJhbnNsaXRlcmF0b3I6OmNyZWF0ZSgkaWQpOwp9CgpyZXR1cm4gJHRoaXMtPnRyYW5zbGl0ZXJhdG9yc1skbG9jYWxlXSA9ICR0aGlzLT50cmFuc2xpdGVyYXRvcnNbJHBhcmVudF0gPSAkdHJhbnNsaXRlcmF0b3IgPz8gbnVsbDsKfQoKcHJpdmF0ZSBzdGF0aWMgZnVuY3Rpb24gZ2V0UGFyZW50TG9jYWxlKD9zdHJpbmcgJGxvY2FsZSk6ID9zdHJpbmcKewppZiAoISRsb2NhbGUpIHsKcmV0dXJuIG51bGw7Cn0KaWYgKGZhbHNlID09PSAkc3RyID0gc3RycmNocigkbG9jYWxlLCAnXycpKSB7CgpyZXR1cm4gbnVsbDsKfQoKcmV0dXJuIHN1YnN0cigkbG9jYWxlLCAwLCAtXHN0cmxlbigkc3RyKSk7Cn0KfQo8P3BocAoKCgoKCgoKCgoKbmFtZXNwYWNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xTbHVnZ2VyOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xBYnN0cmFjdFVuaWNvZGVTdHJpbmc7CgoKCgoKCmludGVyZmFjZSBTbHVnZ2VySW50ZXJmYWNlCnsKCgoKcHVibGljIGZ1bmN0aW9uIHNsdWcoc3RyaW5nICRzdHJpbmcsIHN0cmluZyAkc2VwYXJhdG9yID0gJy0nLCA/c3RyaW5nICRsb2NhbGUgPSBudWxsKTogQWJzdHJhY3RVbmljb2RlU3RyaW5nOwp9Cjw/cGhwCgoKCgoKCgoKCgpuYW1lc3BhY2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nOwoKdXNlIFN5bWZvbnlcQ29tcG9uZW50XFN0cmluZ1xFeGNlcHRpb25cRXhjZXB0aW9uSW50ZXJmYWNlOwp1c2UgU3ltZm9ueVxDb21wb25lbnRcU3RyaW5nXEV4Y2VwdGlvblxJbnZhbGlkQXJndW1lbnRFeGNlcHRpb247CgoKCgoKCgoKCgoKCgoKCgoKY2xhc3MgVW5pY29kZVN0cmluZyBleHRlbmRzIEFic3RyYWN0VW5pY29kZVN0cmluZwp7CnB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChzdHJpbmcgJHN0cmluZyA9ICcnKQp7CiR0aGlzLT5zdHJpbmcgPSBub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0cmluZykgPyAkc3RyaW5nIDogbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0cmluZyk7CgppZiAoZmFsc2UgPT09ICR0aGlzLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KfQoKcHVibGljIGZ1bmN0aW9uIGFwcGVuZChzdHJpbmcgLi4uJHN1ZmZpeCk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwokc3RyLT5zdHJpbmcgPSAkdGhpcy0+c3RyaW5nLigxID49IFxjb3VudCgkc3VmZml4KSA/ICgkc3VmZml4WzBdID8/ICcnKSA6IGltcGxvZGUoJycsICRzdWZmaXgpKTsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCmlmIChmYWxzZSA9PT0gJHN0ci0+c3RyaW5nKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ0ludmFsaWQgVVRGLTggc3RyaW5nLicpOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIGNodW5rKGludCAkbGVuZ3RoID0gMSk6IGFycmF5CnsKaWYgKDEgPiAkbGVuZ3RoKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1RoZSBjaHVuayBsZW5ndGggbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsKfQoKaWYgKCcnID09PSAkdGhpcy0+c3RyaW5nKSB7CnJldHVybiBbXTsKfQoKJHJ4ID0gJy8oJzsKd2hpbGUgKDY1NTM1IDwgJGxlbmd0aCkgewokcnggLj0gJ1xYezY1NTM1fSc7CiRsZW5ndGggLT0gNjU1MzU7Cn0KJHJ4IC49ICdcWHsnLiRsZW5ndGguJ30pL3UnOwoKJHN0ciA9IGNsb25lICR0aGlzOwokY2h1bmtzID0gW107Cgpmb3JlYWNoIChwcmVnX3NwbGl0KCRyeCwgJHRoaXMtPnN0cmluZywgLTEsIFxQUkVHX1NQTElUX0RFTElNX0NBUFRVUkUgfCBcUFJFR19TUExJVF9OT19FTVBUWSkgYXMgJGNodW5rKSB7CiRzdHItPnN0cmluZyA9ICRjaHVuazsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKfQoKcmV0dXJuICRjaHVua3M7Cn0KCnB1YmxpYyBmdW5jdGlvbiBlbmRzV2l0aCgkc3VmZml4KTogYm9vbAp7CmlmICgkc3VmZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHN1ZmZpeCA9ICRzdWZmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkc3VmZml4KSB8fCAkc3VmZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmVuZHNXaXRoKCRzdWZmaXgpOwp9IGVsc2Ugewokc3VmZml4ID0gKHN0cmluZykgJHN1ZmZpeDsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN1ZmZpeCwgJGZvcm0pID86ICRzdWZmaXggPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3VmZml4LCAkZm9ybSk7CgppZiAoJycgPT09ICRzdWZmaXggfHwgZmFsc2UgPT09ICRzdWZmaXgpIHsKcmV0dXJuIGZhbHNlOwp9CgppZiAoJHRoaXMtPmlnbm9yZUNhc2UpIHsKcmV0dXJuIDAgPT09IG1iX3N0cmlwb3MoZ3JhcGhlbWVfZXh0cmFjdCgkdGhpcy0+c3RyaW5nLCBcc3RybGVuKCRzdWZmaXgpLCBcR1JBUEhFTUVfRVhUUl9NQVhCWVRFUywgXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAtIFxzdHJsZW4oJHN1ZmZpeCkpLCAkc3VmZml4LCAwLCAnVVRGLTgnKTsKfQoKcmV0dXJuICRzdWZmaXggPT09IGdyYXBoZW1lX2V4dHJhY3QoJHRoaXMtPnN0cmluZywgXHN0cmxlbigkc3VmZml4KSwgXEdSQVBIRU1FX0VYVFJfTUFYQllURVMsIFxzdHJsZW4oJHRoaXMtPnN0cmluZykgLSBcc3RybGVuKCRzdWZmaXgpKTsKfQoKcHVibGljIGZ1bmN0aW9uIGVxdWFsc1RvKCRzdHJpbmcpOiBib29sCnsKaWYgKCRzdHJpbmcgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cmluZykgewokc3RyaW5nID0gJHN0cmluZy0+c3RyaW5nOwp9IGVsc2VpZiAoXGlzX2FycmF5KCRzdHJpbmcpIHx8ICRzdHJpbmcgaW5zdGFuY2VvZiBcVHJhdmVyc2FibGUpIHsKcmV0dXJuIHBhcmVudDo6ZXF1YWxzVG8oJHN0cmluZyk7Cn0gZWxzZSB7CiRzdHJpbmcgPSAoc3RyaW5nKSAkc3RyaW5nOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyaW5nLCAkZm9ybSkgPzogJHN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHJpbmcsICRmb3JtKTsKCmlmICgnJyAhPT0gJHN0cmluZyAmJiBmYWxzZSAhPT0gJHN0cmluZyAmJiAkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gXHN0cmxlbigkc3RyaW5nKSA9PT0gXHN0cmxlbigkdGhpcy0+c3RyaW5nKSAmJiAwID09PSBtYl9zdHJpcG9zKCR0aGlzLT5zdHJpbmcsICRzdHJpbmcsIDAsICdVVEYtOCcpOwp9CgpyZXR1cm4gJHN0cmluZyA9PT0gJHRoaXMtPnN0cmluZzsKfQoKcHVibGljIGZ1bmN0aW9uIGluZGV4T2YoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2YoJG5lZWRsZSwgJG9mZnNldCk7Cn0gZWxzZSB7CiRuZWVkbGUgPSAoc3RyaW5nKSAkbmVlZGxlOwp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkbmVlZGxlLCAkZm9ybSkgPzogJG5lZWRsZSA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRuZWVkbGUsICRmb3JtKTsKCmlmICgnJyA9PT0gJG5lZWRsZSB8fCBmYWxzZSA9PT0gJG5lZWRsZSkgewpyZXR1cm4gbnVsbDsKfQoKdHJ5IHsKJGkgPSAkdGhpcy0+aWdub3JlQ2FzZSA/IGdyYXBoZW1lX3N0cmlwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCkgOiBncmFwaGVtZV9zdHJwb3MoJHRoaXMtPnN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7Cn0gY2F0Y2ggKFxWYWx1ZUVycm9yICRlKSB7CnJldHVybiBudWxsOwp9CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gaW5kZXhPZkxhc3QoJG5lZWRsZSwgaW50ICRvZmZzZXQgPSAwKTogP2ludAp7CmlmICgkbmVlZGxlIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJG5lZWRsZSA9ICRuZWVkbGUtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkbmVlZGxlKSB8fCAkbmVlZGxlIGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OmluZGV4T2ZMYXN0KCRuZWVkbGUsICRvZmZzZXQpOwp9IGVsc2UgewokbmVlZGxlID0gKHN0cmluZykgJG5lZWRsZTsKfQoKJGZvcm0gPSBudWxsID09PSAkdGhpcy0+aWdub3JlQ2FzZSA/IFxOb3JtYWxpemVyOjpORkQgOiBcTm9ybWFsaXplcjo6TkZDOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJG5lZWRsZSwgJGZvcm0pID86ICRuZWVkbGUgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkbmVlZGxlLCAkZm9ybSk7CgppZiAoJycgPT09ICRuZWVkbGUgfHwgZmFsc2UgPT09ICRuZWVkbGUpIHsKcmV0dXJuIG51bGw7Cn0KCiRzdHJpbmcgPSAkdGhpcy0+c3RyaW5nOwoKaWYgKDAgPiAkb2Zmc2V0KSB7CgppZiAoMCA+ICRvZmZzZXQgKz0gZ3JhcGhlbWVfc3RybGVuKCRuZWVkbGUpKSB7CiRzdHJpbmcgPSBncmFwaGVtZV9zdWJzdHIoJHN0cmluZywgMCwgJG9mZnNldCk7Cn0KJG9mZnNldCA9IDA7Cn0KCiRpID0gJHRoaXMtPmlnbm9yZUNhc2UgPyBncmFwaGVtZV9zdHJyaXBvcygkc3RyaW5nLCAkbmVlZGxlLCAkb2Zmc2V0KSA6IGdyYXBoZW1lX3N0cnJwb3MoJHN0cmluZywgJG5lZWRsZSwgJG9mZnNldCk7CgpyZXR1cm4gZmFsc2UgPT09ICRpID8gbnVsbCA6ICRpOwp9CgpwdWJsaWMgZnVuY3Rpb24gam9pbihhcnJheSAkc3RyaW5ncywgP3N0cmluZyAkbGFzdEdsdWUgPSBudWxsKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gcGFyZW50Ojpqb2luKCRzdHJpbmdzLCAkbGFzdEdsdWUpOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBsZW5ndGgoKTogaW50CnsKcmV0dXJuIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKTsKfQoKCgoKcHVibGljIGZ1bmN0aW9uIG5vcm1hbGl6ZShpbnQgJGZvcm0gPSBzZWxmOjpORkMpOiBwYXJlbnQKewokc3RyID0gY2xvbmUgJHRoaXM7CgppZiAoXGluX2FycmF5KCRmb3JtLCBbc2VsZjo6TkZDLCBzZWxmOjpORktDXSwgdHJ1ZSkpIHsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZywgJGZvcm0pID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZywgJGZvcm0pOwp9IGVsc2VpZiAoIVxpbl9hcnJheSgkZm9ybSwgW3NlbGY6Ok5GRCwgc2VsZjo6TkZLRF0sIHRydWUpKSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIG5vcm1hbGl6YXRpb24gZm9ybS4nKTsKfSBlbHNlaWYgKCFub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nLCAkZm9ybSkpIHsKJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nLCAkZm9ybSk7CiRzdHItPmlnbm9yZUNhc2UgPSBudWxsOwp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHByZXBlbmQoc3RyaW5nIC4uLiRwcmVmaXgpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKJHN0ci0+c3RyaW5nID0gKDEgPj0gXGNvdW50KCRwcmVmaXgpID8gKCRwcmVmaXhbMF0gPz8gJycpIDogaW1wbG9kZSgnJywgJHByZWZpeCkpLiR0aGlzLT5zdHJpbmc7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgppZiAoZmFsc2UgPT09ICRzdHItPnN0cmluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiByZXBsYWNlKHN0cmluZyAkZnJvbSwgc3RyaW5nICR0byk6IEFic3RyYWN0U3RyaW5nCnsKJHN0ciA9IGNsb25lICR0aGlzOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJGZyb20pID86ICRmcm9tID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJGZyb20pOwoKaWYgKCcnICE9PSAkZnJvbSAmJiBmYWxzZSAhPT0gJGZyb20pIHsKJHRhaWwgPSAkc3RyLT5zdHJpbmc7CiRyZXN1bHQgPSAnJzsKJGluZGV4T2YgPSAkdGhpcy0+aWdub3JlQ2FzZSA/ICdncmFwaGVtZV9zdHJpcG9zJyA6ICdncmFwaGVtZV9zdHJwb3MnOwoKd2hpbGUgKCcnICE9PSAkdGFpbCAmJiBmYWxzZSAhPT0gJGkgPSAkaW5kZXhPZigkdGFpbCwgJGZyb20pKSB7CiRzbGljZSA9IGdyYXBoZW1lX3N1YnN0cigkdGFpbCwgMCwgJGkpOwokcmVzdWx0IC49ICRzbGljZS4kdG87CiR0YWlsID0gc3Vic3RyKCR0YWlsLCBcc3RybGVuKCRzbGljZSkgKyBcc3RybGVuKCRmcm9tKSk7Cn0KCiRzdHItPnN0cmluZyA9ICRyZXN1bHQuJHRhaWw7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkc3RyLT5zdHJpbmcpID86ICRzdHItPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRzdHItPnN0cmluZyk7CgppZiAoZmFsc2UgPT09ICRzdHItPnN0cmluZykgewp0aHJvdyBuZXcgSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKCdJbnZhbGlkIFVURi04IHN0cmluZy4nKTsKfQp9CgpyZXR1cm4gJHN0cjsKfQoKcHVibGljIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaGVzKHN0cmluZyAkZnJvbVJlZ2V4cCwgJHRvKTogQWJzdHJhY3RTdHJpbmcKewokc3RyID0gcGFyZW50OjpyZXBsYWNlTWF0Y2hlcygkZnJvbVJlZ2V4cCwgJHRvKTsKbm9ybWFsaXplcl9pc19ub3JtYWxpemVkKCRzdHItPnN0cmluZykgPzogJHN0ci0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHN0ci0+c3RyaW5nKTsKCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc2xpY2UoaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiAwID4gJHN0YXJ0ICYmIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKSA8IC0kc3RhcnQpIHsKJHN0YXJ0ID0gMDsKfQokc3RyLT5zdHJpbmcgPSAoc3RyaW5nKSBncmFwaGVtZV9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpOwoKcmV0dXJuICRzdHI7Cn0KCnB1YmxpYyBmdW5jdGlvbiBzcGxpY2Uoc3RyaW5nICRyZXBsYWNlbWVudCwgaW50ICRzdGFydCA9IDAsID9pbnQgJGxlbmd0aCA9IG51bGwpOiBBYnN0cmFjdFN0cmluZwp7CiRzdHIgPSBjbG9uZSAkdGhpczsKCmlmIChcUEhQX1ZFUlNJT05fSUQgPCA4MDAwMCAmJiAwID4gJHN0YXJ0ICYmIGdyYXBoZW1lX3N0cmxlbigkdGhpcy0+c3RyaW5nKSA8IC0kc3RhcnQpIHsKJHN0YXJ0ID0gMDsKfQokc3RhcnQgPSAkc3RhcnQgPyBcc3RybGVuKGdyYXBoZW1lX3N1YnN0cigkdGhpcy0+c3RyaW5nLCAwLCAkc3RhcnQpKSA6IDA7CiRsZW5ndGggPSAkbGVuZ3RoID8gXHN0cmxlbihncmFwaGVtZV9zdWJzdHIoJHRoaXMtPnN0cmluZywgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpKSA6ICRsZW5ndGg7CiRzdHItPnN0cmluZyA9IHN1YnN0cl9yZXBsYWNlKCR0aGlzLT5zdHJpbmcsICRyZXBsYWNlbWVudCwgJHN0YXJ0LCAkbGVuZ3RoID8/IDIxNDc0ODM2NDcpOwpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHN0ci0+c3RyaW5nKSA/OiAkc3RyLT5zdHJpbmcgPSBub3JtYWxpemVyX25vcm1hbGl6ZSgkc3RyLT5zdHJpbmcpOwoKaWYgKGZhbHNlID09PSAkc3RyLT5zdHJpbmcpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignSW52YWxpZCBVVEYtOCBzdHJpbmcuJyk7Cn0KCnJldHVybiAkc3RyOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3BsaXQoc3RyaW5nICRkZWxpbWl0ZXIsID9pbnQgJGxpbWl0ID0gbnVsbCwgP2ludCAkZmxhZ3MgPSBudWxsKTogYXJyYXkKewppZiAoMSA+ICRsaW1pdCA9ICRsaW1pdCA/PyAyMTQ3NDgzNjQ3KSB7CnRocm93IG5ldyBJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24oJ1NwbGl0IGxpbWl0IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLicpOwp9CgppZiAoJycgPT09ICRkZWxpbWl0ZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIGVtcHR5LicpOwp9CgppZiAobnVsbCAhPT0gJGZsYWdzKSB7CnJldHVybiBwYXJlbnQ6OnNwbGl0KCRkZWxpbWl0ZXIuJ3UnLCAkbGltaXQsICRmbGFncyk7Cn0KCm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkZGVsaW1pdGVyKSA/OiAkZGVsaW1pdGVyID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJGRlbGltaXRlcik7CgppZiAoZmFsc2UgPT09ICRkZWxpbWl0ZXIpIHsKdGhyb3cgbmV3IEludmFsaWRBcmd1bWVudEV4Y2VwdGlvbignU3BsaXQgZGVsaW1pdGVyIGlzIG5vdCBhIHZhbGlkIFVURi04IHN0cmluZy4nKTsKfQoKJHN0ciA9IGNsb25lICR0aGlzOwokdGFpbCA9ICR0aGlzLT5zdHJpbmc7CiRjaHVua3MgPSBbXTsKJGluZGV4T2YgPSAkdGhpcy0+aWdub3JlQ2FzZSA/ICdncmFwaGVtZV9zdHJpcG9zJyA6ICdncmFwaGVtZV9zdHJwb3MnOwoKd2hpbGUgKDEgPCAkbGltaXQgJiYgZmFsc2UgIT09ICRpID0gJGluZGV4T2YoJHRhaWwsICRkZWxpbWl0ZXIpKSB7CiRzdHItPnN0cmluZyA9IGdyYXBoZW1lX3N1YnN0cigkdGFpbCwgMCwgJGkpOwokY2h1bmtzW10gPSBjbG9uZSAkc3RyOwokdGFpbCA9IHN1YnN0cigkdGFpbCwgXHN0cmxlbigkc3RyLT5zdHJpbmcpICsgXHN0cmxlbigkZGVsaW1pdGVyKSk7Ci0tJGxpbWl0Owp9Cgokc3RyLT5zdHJpbmcgPSAkdGFpbDsKJGNodW5rc1tdID0gY2xvbmUgJHN0cjsKCnJldHVybiAkY2h1bmtzOwp9CgpwdWJsaWMgZnVuY3Rpb24gc3RhcnRzV2l0aCgkcHJlZml4KTogYm9vbAp7CmlmICgkcHJlZml4IGluc3RhbmNlb2YgQWJzdHJhY3RTdHJpbmcpIHsKJHByZWZpeCA9ICRwcmVmaXgtPnN0cmluZzsKfSBlbHNlaWYgKFxpc19hcnJheSgkcHJlZml4KSB8fCAkcHJlZml4IGluc3RhbmNlb2YgXFRyYXZlcnNhYmxlKSB7CnJldHVybiBwYXJlbnQ6OnN0YXJ0c1dpdGgoJHByZWZpeCk7Cn0gZWxzZSB7CiRwcmVmaXggPSAoc3RyaW5nKSAkcHJlZml4Owp9CgokZm9ybSA9IG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlID8gXE5vcm1hbGl6ZXI6Ok5GRCA6IFxOb3JtYWxpemVyOjpORkM7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkcHJlZml4LCAkZm9ybSkgPzogJHByZWZpeCA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCRwcmVmaXgsICRmb3JtKTsKCmlmICgnJyA9PT0gJHByZWZpeCB8fCBmYWxzZSA9PT0gJHByZWZpeCkgewpyZXR1cm4gZmFsc2U7Cn0KCmlmICgkdGhpcy0+aWdub3JlQ2FzZSkgewpyZXR1cm4gMCA9PT0gbWJfc3RyaXBvcyhncmFwaGVtZV9leHRyYWN0KCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHByZWZpeCksIFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTKSwgJHByZWZpeCwgMCwgJ1VURi04Jyk7Cn0KCnJldHVybiAkcHJlZml4ID09PSBncmFwaGVtZV9leHRyYWN0KCR0aGlzLT5zdHJpbmcsIFxzdHJsZW4oJHByZWZpeCksIFxHUkFQSEVNRV9FWFRSX01BWEJZVEVTKTsKfQoKcHVibGljIGZ1bmN0aW9uIF9fd2FrZXVwKCkKewppZiAoIVxpc19zdHJpbmcoJHRoaXMtPnN0cmluZykpIHsKdGhyb3cgbmV3IFxCYWRNZXRob2RDYWxsRXhjZXB0aW9uKCdDYW5ub3QgdW5zZXJpYWxpemUgJy5fX0NMQVNTX18pOwp9Cgpub3JtYWxpemVyX2lzX25vcm1hbGl6ZWQoJHRoaXMtPnN0cmluZykgPzogJHRoaXMtPnN0cmluZyA9IG5vcm1hbGl6ZXJfbm9ybWFsaXplKCR0aGlzLT5zdHJpbmcpOwp9CgpwdWJsaWMgZnVuY3Rpb24gX19jbG9uZSgpCnsKaWYgKG51bGwgPT09ICR0aGlzLT5pZ25vcmVDYXNlKSB7Cm5vcm1hbGl6ZXJfaXNfbm9ybWFsaXplZCgkdGhpcy0+c3RyaW5nKSA/OiAkdGhpcy0+c3RyaW5nID0gbm9ybWFsaXplcl9ub3JtYWxpemUoJHRoaXMtPnN0cmluZyk7Cn0KCiR0aGlzLT5pZ25vcmVDYXNlID0gZmFsc2U7Cn0KfQo8P3BocAoKaWYgKFBIUF9TQVBJICE9PSAnY2xpJyAmJiBQSFBfU0FQSSAhPT0gJ3BocGRiZycpIHsKICAgIGlmICgwID09PSBzdHJwb3MoX19GSUxFX18sICdwaGFyOicpICYmIGluaV9nZXQoJ3JlZ2lzdGVyX2FyZ2NfYXJndicpKSB7CiAgICAgICAgZWNobyAnQ29tcG9zZXIgY2Fubm90IGJlIHJ1biBzYWZlbHkgb24gbm9uLUNMSSBTQVBJcyB3aXRoIHJlZ2lzdGVyX2FyZ2NfYXJndj1Pbi4gQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgICAgIGV4aXQoMSk7CiAgICB9CgogICAgZWNobyAnV2FybmluZzogQ29tcG9zZXIgc2hvdWxkIGJlIGludm9rZWQgdmlhIHRoZSBDTEkgdmVyc2lvbiBvZiBQSFAsIG5vdCB0aGUgJy5QSFBfU0FQSS4nIFNBUEknLlBIUF9FT0w7Cn0KCmlmIChQSFBfVkVSU0lPTl9JRCA8IDcwMjA1KSB7CiAgICBlY2hvICdDb21wb3NlciAyLjMuMCBkcm9wcGVkIHN1cHBvcnQgZm9yIFBIUCA8Ny4yLjUgYW5kIHlvdSBhcmUgcnVubmluZyAnLlBIUF9WRVJTSU9OLicsIHBsZWFzZSB1cGdyYWRlIFBIUCBvciB1c2UgQ29tcG9zZXIgMi4yIExUUyB2aWEgImNvbXBvc2VyIHNlbGYtdXBkYXRlIC0tMi4yIi4gQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKaWYgKGluaV9nZXQoJ29wY2FjaGUuZW5hYmxlX2NsaScpICYmIGluaV9nZXQoJ29wY2FjaGUucHJlbG9hZCcpKSB7CiAgICByZWdpc3Rlcl9zaHV0ZG93bl9mdW5jdGlvbihzdGF0aWMgZnVuY3Rpb24gKCkgewogICAgICAgICRlID0gZXJyb3JfZ2V0X2xhc3QoKTsKICAgICAgICBpZiAoJGUgIT09IG51bGwKICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgc3RycG9zKCRlWydtZXNzYWdlJ10sICdDYW5ub3QgcmVkZWNsYXJlIGNsYXNzJykgIT09IGZhbHNlCiAgICAgICAgICAgICAgICB8fCAoc3RycG9zKCRlWydtZXNzYWdlJ10sICdEZWNsYXJhdGlvbiBvZicpICE9PSBmYWxzZSAmJiBzdHJwb3MoJGVbJ21lc3NhZ2UnXSwgJ211c3QgYmUgY29tcGF0aWJsZSB3aXRoJykgIT09IGZhbHNlKQogICAgICAgICAgICApCiAgICAgICAgKSB7CiAgICAgICAgICAgIGVjaG8gJ1dhcm5pbmc6IFRoZSBlcnJvciBhYm92ZSBtaWdodCBiZSBjYXVzZWQgYnkgdGhlIGZhY3Qgb3BjYWNoZS5lbmFibGVfY2xpIGlzIGVuYWJsZWQgYW5kIG9wY2FjaGUucHJlbG9hZCBpcyBzZXQgaW4gcGhwLmluaS4gV2UgcmVjb21tZW5kIGRpc2FibGluZyBvcGNhY2hlLmVuYWJsZV9jbGkgaWYgeW91IHJlYWxseSBuZWVkIHByZWxvYWRpbmcgb24gdGhpcyBtYWNoaW5lLicuUEhQX0VPTDsKICAgICAgICB9CiAgICB9KTsKfQoKc2V0bG9jYWxlKExDX0FMTCwgJ0MnKTsKcmVxdWlyZSBfX0RJUl9fLicvLi4vc3JjL2Jvb3RzdHJhcC5waHAnOwoKdXNlIENvbXBvc2VyXENvbnNvbGVcQXBwbGljYXRpb247CnVzZSBDb21wb3NlclxYZGVidWdIYW5kbGVyXFhkZWJ1Z0hhbmRsZXI7CnVzZSBDb21wb3NlclxVdGlsXFBsYXRmb3JtOwp1c2UgQ29tcG9zZXJcVXRpbFxFcnJvckhhbmRsZXI7CgplcnJvcl9yZXBvcnRpbmcoLTEpOwoKLy8gUmVzdGFydCB3aXRob3V0IFhkZWJ1ZwokeGRlYnVnID0gbmV3IFhkZWJ1Z0hhbmRsZXIoJ0NvbXBvc2VyJyk7CiR4ZGVidWctPmNoZWNrKCk7CnVuc2V0KCR4ZGVidWcpOwoKaWYgKGRlZmluZWQoJ0hIVk1fVkVSU0lPTicpICYmIHZlcnNpb25fY29tcGFyZShISFZNX1ZFUlNJT04sICc0LjAnLCAnPj0nKSkgewogICAgZWNobyAnSEhWTSA0LjAgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IgQ29tcG9zZXIsIHBsZWFzZSB1c2UgUEhQIGluc3RlYWQuIEFib3J0aW5nLicuUEhQX0VPTDsKICAgIGV4aXQoMSk7Cn0KaWYgKCFleHRlbnNpb25fbG9hZGVkKCdpY29udicpICYmICFleHRlbnNpb25fbG9hZGVkKCdtYnN0cmluZycpKSB7CiAgICBlY2hvICdUaGUgaWNvbnYgT1IgbWJzdHJpbmcgZXh0ZW5zaW9uIGlzIHJlcXVpcmVkIGFuZCBib3RoIGFyZSBtaXNzaW5nLicKICAgICAgICAuUEhQX0VPTC4nSW5zdGFsbCBlaXRoZXIgb2YgdGhlbSBvciByZWNvbXBpbGUgcGhwIHdpdGhvdXQgLS1kaXNhYmxlLWljb252LicKICAgICAgICAuUEhQX0VPTC4nQWJvcnRpbmcuJy5QSFBfRU9MOwogICAgZXhpdCgxKTsKfQoKaWYgKGZ1bmN0aW9uX2V4aXN0cygnaW5pX3NldCcpKSB7CiAgICAvLyBjaGVjayBpZiBlcnJvciBsb2dnaW5nIGlzIG9uLCBidXQgdG8gYW4gZW1wdHkgZGVzdGluYXRpb24gLSBmb3IgdGhlIENMSSBTQVBJLCB0aGF0IG1lYW5zIHN0ZGVycgogICAgJGxvZ3NUb1NhcGlEZWZhdWx0ID0gKCcnID09PSBpbmlfZ2V0KCdlcnJvcl9sb2cnKSAmJiAoYm9vbCkgaW5pX2dldCgnbG9nX2Vycm9ycycpKTsKICAgIC8vIG9uIHRoZSBDTEkgU0FQSSwgZW5zdXJlIGVycm9ycyBhcmUgZGlzcGxheWVkIG9uIHN0ZGVyciwgZWl0aGVyIHZpYSBkaXNwbGF5X2Vycm9ycyBvciB2aWEgZXJyb3JfbG9nCiAgICBpZiAoUEhQX1NBUEkgPT09ICdjbGknKSB7CiAgICAgICAgQGluaV9zZXQoJ2Rpc3BsYXlfZXJyb3JzJywgJGxvZ3NUb1NhcGlEZWZhdWx0ID8gJzAnIDogJ3N0ZGVycicpOwogICAgfQoKICAgIC8vIFNldCB1c2VyIGRlZmluZWQgbWVtb3J5IGxpbWl0CiAgICBpZiAoJG1lbW9yeUxpbWl0ID0gZ2V0ZW52KCdDT01QT1NFUl9NRU1PUllfTElNSVQnKSkgewogICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAkbWVtb3J5TGltaXQpOwogICAgfSBlbHNlIHsKICAgICAgICAkbWVtb3J5SW5CeXRlcyA9IGZ1bmN0aW9uICgkdmFsdWUpIHsKICAgICAgICAgICAgJHVuaXQgPSBzdHJ0b2xvd2VyKHN1YnN0cigkdmFsdWUsIC0xLCAxKSk7CiAgICAgICAgICAgICR2YWx1ZSA9IChpbnQpICR2YWx1ZTsKICAgICAgICAgICAgc3dpdGNoKCR1bml0KSB7CiAgICAgICAgICAgICAgICBjYXNlICdnJzoKICAgICAgICAgICAgICAgICAgICAkdmFsdWUgKj0gMTAyNDsKICAgICAgICAgICAgICAgICAgICAvLyBubyBicmVhayAoY3VtdWxhdGl2ZSBtdWx0aXBsaWVyKQogICAgICAgICAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgICAgICAgICAgJHZhbHVlICo9IDEwMjQ7CiAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsgKGN1bXVsYXRpdmUgbXVsdGlwbGllcikKICAgICAgICAgICAgICAgIGNhc2UgJ2snOgogICAgICAgICAgICAgICAgICAgICR2YWx1ZSAqPSAxMDI0OwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gJHZhbHVlOwogICAgICAgIH07CgogICAgICAgICRtZW1vcnlMaW1pdCA9IHRyaW0oaW5pX2dldCgnbWVtb3J5X2xpbWl0JykpOwogICAgICAgIC8vIEluY3JlYXNlIG1lbW9yeV9saW1pdCBpZiBpdCBpcyBsb3dlciB0aGFuIDEuNUdCCiAgICAgICAgaWYgKCRtZW1vcnlMaW1pdCAhPSAtMSAmJiAkbWVtb3J5SW5CeXRlcygkbWVtb3J5TGltaXQpIDwgMTAyNCAqIDEwMjQgKiAxNTM2KSB7CiAgICAgICAgICAgIEBpbmlfc2V0KCdtZW1vcnlfbGltaXQnLCAnMTUzNk0nKTsKICAgICAgICB9CiAgICAgICAgdW5zZXQoJG1lbW9yeUluQnl0ZXMpOwogICAgfQogICAgdW5zZXQoJG1lbW9yeUxpbWl0KTsKfQoKLy8gV29ya2Fyb3VuZCBQSFAgYnVnIG9uIFdpbmRvd3Mgd2hlcmUgZW52IHZhcnMgY29udGFpbmluZyBVbmljb2RlIGNoYXJzIGFyZSBtYW5nbGVkIGluICRfU0VSVkVSCi8vIHNlZSBodHRwczovL2dpdGh1Yi5jb20vcGhwL3BocC1zcmMvaXNzdWVzLzc4OTYKaWYgKFBIUF9WRVJTSU9OX0lEID49IDcwMTEzICYmIChQSFBfVkVSU0lPTl9JRCA8IDgwMDE2IHx8IChQSFBfVkVSU0lPTl9JRCA+PSA4MDEwMCAmJiBQSFBfVkVSU0lPTl9JRCA8IDgwMTAzKSkgJiYgUGxhdGZvcm06OmlzV2luZG93cygpKSB7CiAgICBmb3JlYWNoICgkX1NFUlZFUiBhcyAkc2VydmVyVmFyID0+ICRzZXJ2ZXJWYWwpIHsKICAgICAgICBpZiAoKCRzZXJ2ZXJWYWwgPSBnZXRlbnYoJHNlcnZlclZhcikpICE9PSBmYWxzZSkgewogICAgICAgICAgICAkX1NFUlZFUlskc2VydmVyVmFyXSA9ICRzZXJ2ZXJWYWw7CiAgICAgICAgfQogICAgfQp9CgpQbGF0Zm9ybTo6cHV0RW52KCdDT01QT1NFUl9CSU5BUlknLCByZWFscGF0aCgkX1NFUlZFUlsnYXJndiddWzBdKSk7CgpFcnJvckhhbmRsZXI6OnJlZ2lzdGVyKCk7CgovLyBydW4gdGhlIGNvbW1hbmQgYXBwbGljYXRpb24KJGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKCk7CiRhcHBsaWNhdGlvbi0+cnVuKCk7CgpDb3B5cmlnaHQgKGMpIE5pbHMgQWRlcm1hbm4sIEpvcmRpIEJvZ2dpYW5vCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkCnRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgoKCOsIBX77J4igU1RTi3TriTeLAnRNia/fr0JfWug/iUkGs+S7LYBUAtoZcb97c1IpD+JWzoyL/njBfdnuUGGlqQQAAABHQk1C
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
3.13 MB
lrwxr-xr-x
2026-01-23 09:08:04
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).