REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 58.41 KB
Close
//opt/hc_python/lib/python3.12/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-312.pyc
Text
Base64
yw0NCgAAAAD5ke9nM80AAOMAAAAAAAAAAAAAAAAIAAAAAAAAAfPSAwAAlwBkAFoAZAFkAmwBbQJaAgEAZAFkA2wDbQRaBAEAZAFkBGwDbQVaBQEAZAFkBWwDbQZaBgEAZAFkBmwDbQdaBwEAZAFkB2wDbQhaCAEAZAFkCGwDbQlaCQEAZAFkCWwDbQpaCgEAZAFkCmwDbQtaCwEAZAFkC2wDbQxaDAEAZAFkDGwDbQ1aDQEAZAFkDWwDbQ5aDgEAZAFkDmwDbQ9aDwEAZAFkD2wDbRBaEAEAZBBkEWwRbRJaEgEAZBBkEmwTbRRaFAEAZBBkE2wTbRVaFQEAZBBkFGwTbRZaFgEAZBBkFWwTbRdaFwEAZBBkFmwYbRlaGQEAZBBkF2wabRtaGwEAZBBkGGwcbR1aHQEAZBBkGWwebR9aHwEAZBBkGmwebSBaIAEAZBBkG2whbSJaIgEAZBBkHGwhbSNaIwEAZBBkHWwhbSRaJAEAZBBkHmwhbSVaJQEAZBBkH2whbSZaJgEAZQ5yMGQQZCBsJ20oWigBAGQQZCFsKW0qWioBAGQQZCJsGm0rWisBAGQQZCNsHG0sWiwBAGQQZCRsHG0tWi0BAGQQZCVsHG0uWi4BAGQQZCZsHG0vWi8BAGQQZCdsMG0xWjEBAAIAZSRkKKsBAAAAAAAAWjICAGUPZCmrAQAAAAAAAFozAgBlD2QqZQSsK6sCAAAAAAAAWjQCAGUPZCxlBKwrqwIAAAAAAABaNQIAZQ9kLWUEZC6sL6sDAAAAAAAAWjYCAGUPZDBlBGQurDGrAwAAAAAAAFo3AgBHAGQyhABkM2UVqwMAAAAAAABaOAIARwBkNIQAZDVlJWU2GQAAAKsDAAAAAAAAWjkCAEcAZDaEAGQ3ZSVlNxkAAACrAwAAAAAAAFo6AgBHAGQ4hABkOWUlZTcZAAAAqwMAAAAAAABaOwIARwBkOoQAZDtlJWU2GQAAAKsDAAAAAAAAWjwCAEcAZDyEAGQ9ZSVlNhkAAACrAwAAAAAAAFo9AgBHAGQ+hABkP2UlZTQZAAAAqwMAAAAAAABaPgIARwBkQIQAZEFlGWU0GQAAAKsDAAAAAAAAWj8CAEcAZEKEAGRDZRZqgAAAAAAAAAAAAAAAAAAAAAAAAGUHZTJlM2YCGQAAAKsEAAAAAAAAWkFkTGREhARaQgIARwBkRYQAZEZlFmqAAAAAAAAAAAAAAAAAAAAAAAAAZRdlNBkAAACrBAAAAAAAAFpDAgBHAGRHhABkSGUWaogAAAAAAAAAAAAAAAAAAAAAAABlNBkAAACrAwAAAAAAAFpFAgBHAGRJhABkSmVFZTQZAAAAqwMAAAAAAABaRnlLKU1h9XUAAERlZmluZSBhdHRyaWJ1dGVzIG9uIE9STS1tYXBwZWQgY2xhc3NlcyB0aGF0IGhhdmUgImh5YnJpZCIgYmVoYXZpb3IuCgoiaHlicmlkIiBtZWFucyB0aGUgYXR0cmlidXRlIGhhcyBkaXN0aW5jdCBiZWhhdmlvcnMgZGVmaW5lZCBhdCB0aGUKY2xhc3MgbGV2ZWwgYW5kIGF0IHRoZSBpbnN0YW5jZSBsZXZlbC4KClRoZSA6bW9kOmB+c3FsYWxjaGVteS5leHQuaHlicmlkYCBleHRlbnNpb24gcHJvdmlkZXMgYSBzcGVjaWFsIGZvcm0gb2YKbWV0aG9kIGRlY29yYXRvciBhbmQgaGFzIG1pbmltYWwgZGVwZW5kZW5jaWVzIG9uIHRoZSByZXN0IG9mIFNRTEFsY2hlbXkuCkl0cyBiYXNpYyB0aGVvcnkgb2Ygb3BlcmF0aW9uIGNhbiB3b3JrIHdpdGggYW55IGRlc2NyaXB0b3ItYmFzZWQgZXhwcmVzc2lvbgpzeXN0ZW0uCgpDb25zaWRlciBhIG1hcHBpbmcgYGBJbnRlcnZhbGBgLCByZXByZXNlbnRpbmcgaW50ZWdlciBgYHN0YXJ0YGAgYW5kIGBgZW5kYGAKdmFsdWVzLiBXZSBjYW4gZGVmaW5lIGhpZ2hlciBsZXZlbCBmdW5jdGlvbnMgb24gbWFwcGVkIGNsYXNzZXMgdGhhdCBwcm9kdWNlIFNRTApleHByZXNzaW9ucyBhdCB0aGUgY2xhc3MgbGV2ZWwsIGFuZCBQeXRob24gZXhwcmVzc2lvbiBldmFsdWF0aW9uIGF0IHRoZQppbnN0YW5jZSBsZXZlbC4gIEJlbG93LCBlYWNoIGZ1bmN0aW9uIGRlY29yYXRlZCB3aXRoIDpjbGFzczpgLmh5YnJpZF9tZXRob2RgIG9yCjpjbGFzczpgLmh5YnJpZF9wcm9wZXJ0eWAgbWF5IHJlY2VpdmUgYGBzZWxmYGAgYXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGNsYXNzLCBvcgptYXkgcmVjZWl2ZSB0aGUgY2xhc3MgZGlyZWN0bHksIGRlcGVuZGluZyBvbiBjb250ZXh0OjoKCiAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5oeWJyaWQgaW1wb3J0IGh5YnJpZF9tZXRob2QKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBoeWJyaWRfcHJvcGVydHkKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IERlY2xhcmF0aXZlQmFzZQogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgTWFwcGVkCiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBtYXBwZWRfY29sdW1uCgoKICAgIGNsYXNzIEJhc2UoRGVjbGFyYXRpdmVCYXNlKToKICAgICAgICBwYXNzCgoKICAgIGNsYXNzIEludGVydmFsKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAiaW50ZXJ2YWwiCgogICAgICAgIGlkOiBNYXBwZWRbaW50XSA9IG1hcHBlZF9jb2x1bW4ocHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBzdGFydDogTWFwcGVkW2ludF0KICAgICAgICBlbmQ6IE1hcHBlZFtpbnRdCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdGFydDogaW50LCBlbmQ6IGludCk6CiAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAogICAgICAgICAgICBzZWxmLmVuZCA9IGVuZAoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIGxlbmd0aChzZWxmKSAtPiBpbnQ6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVuZCAtIHNlbGYuc3RhcnQKCiAgICAgICAgQGh5YnJpZF9tZXRob2QKICAgICAgICBkZWYgY29udGFpbnMoc2VsZiwgcG9pbnQ6IGludCkgLT4gYm9vbDoKICAgICAgICAgICAgcmV0dXJuIChzZWxmLnN0YXJ0IDw9IHBvaW50KSAmIChwb2ludCA8PSBzZWxmLmVuZCkKCiAgICAgICAgQGh5YnJpZF9tZXRob2QKICAgICAgICBkZWYgaW50ZXJzZWN0cyhzZWxmLCBvdGhlcjogSW50ZXJ2YWwpIC0+IGJvb2w6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmNvbnRhaW5zKG90aGVyLnN0YXJ0KSB8IHNlbGYuY29udGFpbnMob3RoZXIuZW5kKQoKQWJvdmUsIHRoZSBgYGxlbmd0aGBgIHByb3BlcnR5IHJldHVybnMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUKYGBlbmRgYCBhbmQgYGBzdGFydGBgIGF0dHJpYnV0ZXMuICBXaXRoIGFuIGluc3RhbmNlIG9mIGBgSW50ZXJ2YWxgYCwKdGhpcyBzdWJ0cmFjdGlvbiBvY2N1cnMgaW4gUHl0aG9uLCB1c2luZyBub3JtYWwgUHl0aG9uIGRlc2NyaXB0b3IKbWVjaGFuaWNzOjoKCiAgICA+Pj4gaTEgPSBJbnRlcnZhbCg1LCAxMCkKICAgID4+PiBpMS5sZW5ndGgKICAgIDUKCldoZW4gZGVhbGluZyB3aXRoIHRoZSBgYEludGVydmFsYGAgY2xhc3MgaXRzZWxmLCB0aGUgOmNsYXNzOmAuaHlicmlkX3Byb3BlcnR5YApkZXNjcmlwdG9yIGV2YWx1YXRlcyB0aGUgZnVuY3Rpb24gYm9keSBnaXZlbiB0aGUgYGBJbnRlcnZhbGBgIGNsYXNzIGFzCnRoZSBhcmd1bWVudCwgd2hpY2ggd2hlbiBldmFsdWF0ZWQgd2l0aCBTUUxBbGNoZW15IGV4cHJlc3Npb24gbWVjaGFuaWNzCnJldHVybnMgYSBuZXcgU1FMIGV4cHJlc3Npb246CgouLiBzb3VyY2Vjb2RlOjogcHljb24rc3FsCgogICAgPj4+IGZyb20gc3FsYWxjaGVteSBpbXBvcnQgc2VsZWN0CiAgICA+Pj4gcHJpbnQoc2VsZWN0KEludGVydmFsLmxlbmd0aCkpCiAgICB7cHJpbnRzcWx9U0VMRUNUIGludGVydmFsLiJlbmQiIC0gaW50ZXJ2YWwuc3RhcnQgQVMgbGVuZ3RoCiAgICBGUk9NIGludGVydmFse3N0b3B9CgoKICAgID4+PiBwcmludChzZWxlY3QoSW50ZXJ2YWwpLmZpbHRlcihJbnRlcnZhbC5sZW5ndGggPiAxMCkpCiAgICB7cHJpbnRzcWx9U0VMRUNUIGludGVydmFsLmlkLCBpbnRlcnZhbC5zdGFydCwgaW50ZXJ2YWwuImVuZCIKICAgIEZST00gaW50ZXJ2YWwKICAgIFdIRVJFIGludGVydmFsLiJlbmQiIC0gaW50ZXJ2YWwuc3RhcnQgPiA6cGFyYW1fMQoKRmlsdGVyaW5nIG1ldGhvZHMgc3VjaCBhcyA6bWV0aDpgLlNlbGVjdC5maWx0ZXJfYnlgIGFyZSBzdXBwb3J0ZWQKd2l0aCBoeWJyaWQgYXR0cmlidXRlcyBhcyB3ZWxsOgoKLi4gc291cmNlY29kZTo6IHB5Y29uK3NxbAoKICAgID4+PiBwcmludChzZWxlY3QoSW50ZXJ2YWwpLmZpbHRlcl9ieShsZW5ndGg9NSkpCiAgICB7cHJpbnRzcWx9U0VMRUNUIGludGVydmFsLmlkLCBpbnRlcnZhbC5zdGFydCwgaW50ZXJ2YWwuImVuZCIKICAgIEZST00gaW50ZXJ2YWwKICAgIFdIRVJFIGludGVydmFsLiJlbmQiIC0gaW50ZXJ2YWwuc3RhcnQgPSA6cGFyYW1fMQoKVGhlIGBgSW50ZXJ2YWxgYCBjbGFzcyBleGFtcGxlIGFsc28gaWxsdXN0cmF0ZXMgdHdvIG1ldGhvZHMsCmBgY29udGFpbnMoKWBgIGFuZCBgYGludGVyc2VjdHMoKWBgLCBkZWNvcmF0ZWQgd2l0aAo6Y2xhc3M6YC5oeWJyaWRfbWV0aG9kYC4gVGhpcyBkZWNvcmF0b3IgYXBwbGllcyB0aGUgc2FtZSBpZGVhIHRvCm1ldGhvZHMgdGhhdCA6Y2xhc3M6YC5oeWJyaWRfcHJvcGVydHlgIGFwcGxpZXMgdG8gYXR0cmlidXRlcy4gICBUaGUKbWV0aG9kcyByZXR1cm4gYm9vbGVhbiB2YWx1ZXMsIGFuZCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgUHl0aG9uIGBgfGBgCmFuZCBgYCZgYCBiaXR3aXNlIG9wZXJhdG9ycyB0byBwcm9kdWNlIGVxdWl2YWxlbnQgaW5zdGFuY2UtbGV2ZWwgYW5kClNRTCBleHByZXNzaW9uLWxldmVsIGJvb2xlYW4gYmVoYXZpb3I6CgouLiBzb3VyY2Vjb2RlOjogcHljb24rc3FsCgogICAgPj4+IGkxLmNvbnRhaW5zKDYpCiAgICBUcnVlCiAgICA+Pj4gaTEuY29udGFpbnMoMTUpCiAgICBGYWxzZQogICAgPj4+IGkxLmludGVyc2VjdHMoSW50ZXJ2YWwoNywgMTgpKQogICAgVHJ1ZQogICAgPj4+IGkxLmludGVyc2VjdHMoSW50ZXJ2YWwoMjUsIDI5KSkKICAgIEZhbHNlCgogICAgPj4+IHByaW50KHNlbGVjdChJbnRlcnZhbCkuZmlsdGVyKEludGVydmFsLmNvbnRhaW5zKDE1KSkpCiAgICB7cHJpbnRzcWx9U0VMRUNUIGludGVydmFsLmlkLCBpbnRlcnZhbC5zdGFydCwgaW50ZXJ2YWwuImVuZCIKICAgIEZST00gaW50ZXJ2YWwKICAgIFdIRVJFIGludGVydmFsLnN0YXJ0IDw9IDpzdGFydF8xIEFORCBpbnRlcnZhbC4iZW5kIiA+IDplbmRfMXtzdG9wfQoKICAgID4+PiBpYSA9IGFsaWFzZWQoSW50ZXJ2YWwpCiAgICA+Pj4gcHJpbnQoc2VsZWN0KEludGVydmFsLCBpYSkuZmlsdGVyKEludGVydmFsLmludGVyc2VjdHMoaWEpKSkKICAgIHtwcmludHNxbH1TRUxFQ1QgaW50ZXJ2YWwuaWQsIGludGVydmFsLnN0YXJ0LAogICAgaW50ZXJ2YWwuImVuZCIsIGludGVydmFsXzEuaWQgQVMgaW50ZXJ2YWxfMV9pZCwKICAgIGludGVydmFsXzEuc3RhcnQgQVMgaW50ZXJ2YWxfMV9zdGFydCwgaW50ZXJ2YWxfMS4iZW5kIiBBUyBpbnRlcnZhbF8xX2VuZAogICAgRlJPTSBpbnRlcnZhbCwgaW50ZXJ2YWwgQVMgaW50ZXJ2YWxfMQogICAgV0hFUkUgaW50ZXJ2YWwuc3RhcnQgPD0gaW50ZXJ2YWxfMS5zdGFydAogICAgICAgIEFORCBpbnRlcnZhbC4iZW5kIiA+IGludGVydmFsXzEuc3RhcnQKICAgICAgICBPUiBpbnRlcnZhbC5zdGFydCA8PSBpbnRlcnZhbF8xLiJlbmQiCiAgICAgICAgQU5EIGludGVydmFsLiJlbmQiID4gaW50ZXJ2YWxfMS4iZW5kIntzdG9wfQoKLi4gX2h5YnJpZF9kaXN0aW5jdF9leHByZXNzaW9uOgoKRGVmaW5pbmcgRXhwcmVzc2lvbiBCZWhhdmlvciBEaXN0aW5jdCBmcm9tIEF0dHJpYnV0ZSBCZWhhdmlvcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKSW4gdGhlIHByZXZpb3VzIHNlY3Rpb24sIG91ciB1c2FnZSBvZiB0aGUgYGAmYGAgYW5kIGBgfGBgIGJpdHdpc2Ugb3BlcmF0b3JzCndpdGhpbiB0aGUgYGBJbnRlcnZhbC5jb250YWluc2BgIGFuZCBgYEludGVydmFsLmludGVyc2VjdHNgYCBtZXRob2RzIHdhcwpmb3J0dW5hdGUsIGNvbnNpZGVyaW5nIG91ciBmdW5jdGlvbnMgb3BlcmF0ZWQgb24gdHdvIGJvb2xlYW4gdmFsdWVzIHRvIHJldHVybiBhCm5ldyBvbmUuIEluIG1hbnkgY2FzZXMsIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYW4gaW4tUHl0aG9uIGZ1bmN0aW9uIGFuZCBhClNRTEFsY2hlbXkgU1FMIGV4cHJlc3Npb24gaGF2ZSBlbm91Z2ggZGlmZmVyZW5jZXMgdGhhdCB0d28gc2VwYXJhdGUgUHl0aG9uCmV4cHJlc3Npb25zIHNob3VsZCBiZSBkZWZpbmVkLiBUaGUgOm1vZDpgfnNxbGFsY2hlbXkuZXh0Lmh5YnJpZGAgZGVjb3JhdG9yCmRlZmluZXMgYSAqKm1vZGlmaWVyKiogOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuZXhwcmVzc2lvbmAgZm9yIHRoaXMgcHVycG9zZS4gQXMgYW4KZXhhbXBsZSB3ZSdsbCBkZWZpbmUgdGhlIHJhZGl1cyBvZiB0aGUgaW50ZXJ2YWwsIHdoaWNoIHJlcXVpcmVzIHRoZSB1c2FnZSBvZgp0aGUgYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb246OgoKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgQ29sdW1uRWxlbWVudAogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBGbG9hdAogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBmdW5jCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IHR5cGVfY29lcmNlCgoKICAgIGNsYXNzIEludGVydmFsKEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgcmFkaXVzKHNlbGYpIC0+IGZsb2F0OgogICAgICAgICAgICByZXR1cm4gYWJzKHNlbGYubGVuZ3RoKSAvIDIKCiAgICAgICAgQHJhZGl1cy5pbnBsYWNlLmV4cHJlc3Npb24KICAgICAgICBAY2xhc3NtZXRob2QKICAgICAgICBkZWYgX3JhZGl1c19leHByZXNzaW9uKGNscykgLT4gQ29sdW1uRWxlbWVudFtmbG9hdF06CiAgICAgICAgICAgIHJldHVybiB0eXBlX2NvZXJjZShmdW5jLmFicyhjbHMubGVuZ3RoKSAvIDIsIEZsb2F0KQoKSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSA6Y2xhc3M6YC5oeWJyaWRfcHJvcGVydHlgIGZpcnN0IGFzc2lnbmVkIHRvIHRoZQpuYW1lIGBgSW50ZXJ2YWwucmFkaXVzYGAgaXMgYW1lbmRlZCBieSBhIHN1YnNlcXVlbnQgbWV0aG9kIGNhbGxlZApgYEludGVydmFsLl9yYWRpdXNfZXhwcmVzc2lvbmBgLCB1c2luZyB0aGUgZGVjb3JhdG9yCmBgQHJhZGl1cy5pbnBsYWNlLmV4cHJlc3Npb25gYCwgd2hpY2ggY2hhaW5zIHRvZ2V0aGVyIHR3byBtb2RpZmllcnMKOmF0dHI6YC5oeWJyaWRfcHJvcGVydHkuaW5wbGFjZWAgYW5kIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gLgpUaGUgdXNlIG9mIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5LmlucGxhY2VgIGluZGljYXRlcyB0aGF0IHRoZQo6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5leHByZXNzaW9uYCBtb2RpZmllciBzaG91bGQgbXV0YXRlIHRoZQpleGlzdGluZyBoeWJyaWQgb2JqZWN0IGF0IGBgSW50ZXJ2YWwucmFkaXVzYGAgaW4gcGxhY2UsIHdpdGhvdXQgY3JlYXRpbmcgYQpuZXcgb2JqZWN0LiAgIE5vdGVzIG9uIHRoaXMgbW9kaWZpZXIgYW5kIGl0cwpyYXRpb25hbGUgYXJlIGRpc2N1c3NlZCBpbiB0aGUgbmV4dCBzZWN0aW9uIDpyZWY6YGh5YnJpZF9wZXA0ODRfbmFtaW5nYC4KVGhlIHVzZSBvZiBgYEBjbGFzc21ldGhvZGBgIGlzIG9wdGlvbmFsLCBhbmQgaXMgc3RyaWN0bHkgdG8gZ2l2ZSB0eXBpbmcKdG9vbHMgYSBoaW50IHRoYXQgYGBjbHNgYCBpbiB0aGlzIGNhc2UgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIGBgSW50ZXJ2YWxgYApjbGFzcywgYW5kIG5vdCBhbiBpbnN0YW5jZSBvZiBgYEludGVydmFsYGAuCgouLiBub3RlOjogOmF0dHI6YC5oeWJyaWRfcHJvcGVydHkuaW5wbGFjZWAgYXMgd2VsbCBhcyB0aGUgdXNlIG9mIGBgQGNsYXNzbWV0aG9kYGAKICAgZm9yIHByb3BlciB0eXBpbmcgc3VwcG9ydCBhcmUgYXZhaWxhYmxlIGFzIG9mIFNRTEFsY2hlbXkgMi4wLjQsIGFuZCB3aWxsCiAgIG5vdCB3b3JrIGluIGVhcmxpZXIgdmVyc2lvbnMuCgpXaXRoIGBgSW50ZXJ2YWwucmFkaXVzYGAgbm93IGluY2x1ZGluZyBhbiBleHByZXNzaW9uIGVsZW1lbnQsIHRoZSBTUUwKZnVuY3Rpb24gYGBBQlMoKWBgIGlzIHJldHVybmVkIHdoZW4gYWNjZXNzaW5nIGBgSW50ZXJ2YWwucmFkaXVzYGAKYXQgdGhlIGNsYXNzIGxldmVsOgoKLi4gc291cmNlY29kZTo6IHB5Y29uK3NxbAoKICAgID4+PiBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IHNlbGVjdAogICAgPj4+IHByaW50KHNlbGVjdChJbnRlcnZhbCkuZmlsdGVyKEludGVydmFsLnJhZGl1cyA+IDUpKQogICAge3ByaW50c3FsfVNFTEVDVCBpbnRlcnZhbC5pZCwgaW50ZXJ2YWwuc3RhcnQsIGludGVydmFsLiJlbmQiCiAgICBGUk9NIGludGVydmFsCiAgICBXSEVSRSBhYnMoaW50ZXJ2YWwuImVuZCIgLSBpbnRlcnZhbC5zdGFydCkgLyA6YWJzXzEgPiA6cGFyYW1fMQoKCi4uIF9oeWJyaWRfcGVwNDg0X25hbWluZzoKClVzaW5nIGBgaW5wbGFjZWBgIHRvIGNyZWF0ZSBwZXAtNDg0IGNvbXBsaWFudCBoeWJyaWQgcHJvcGVydGllcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBhIDpjbGFzczpgLmh5YnJpZF9wcm9wZXJ0eWAgZGVjb3JhdG9yIGlzIGlsbHVzdHJhdGVkCndoaWNoIGluY2x1ZGVzIHR3byBzZXBhcmF0ZSBtZXRob2QtbGV2ZWwgZnVuY3Rpb25zIGJlaW5nIGRlY29yYXRlZCwgYm90aAp0byBwcm9kdWNlIGEgc2luZ2xlIG9iamVjdCBhdHRyaWJ1dGUgcmVmZXJlbmNlZCBhcyBgYEludGVydmFsLnJhZGl1c2BgLgpUaGVyZSBhcmUgYWN0dWFsbHkgc2V2ZXJhbCBkaWZmZXJlbnQgbW9kaWZpZXJzIHdlIGNhbiB1c2UgZm9yCjpjbGFzczpgLmh5YnJpZF9wcm9wZXJ0eWAgaW5jbHVkaW5nIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gLAo6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5zZXR0ZXJgIGFuZCA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvbmAuCgpTUUxBbGNoZW15J3MgOmNsYXNzOmAuaHlicmlkX3Byb3BlcnR5YCBkZWNvcmF0b3IgaW50ZW5kcyB0aGF0IGFkZGluZyBvbiB0aGVzZQptZXRob2RzIG1heSBiZSBkb25lIGluIHRoZSBpZGVudGljYWwgbWFubmVyIGFzIFB5dGhvbidzIGJ1aWx0LWluCmBgQHByb3BlcnR5YGAgZGVjb3JhdG9yLCB3aGVyZSBpZGlvbWF0aWMgdXNlIGlzIHRvIGNvbnRpbnVlIHRvIHJlZGVmaW5lIHRoZQphdHRyaWJ1dGUgcmVwZWF0ZWRseSwgdXNpbmcgdGhlICoqc2FtZSBhdHRyaWJ1dGUgbmFtZSoqIGVhY2ggdGltZSwgYXMgaW4gdGhlCmV4YW1wbGUgYmVsb3cgdGhhdCBpbGx1c3RyYXRlcyB0aGUgdXNlIG9mIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LnNldHRlcmAgYW5kCjptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIGZvciB0aGUgYGBJbnRlcnZhbC5yYWRpdXNgYCBkZXNjcmlwdG9yOjoKCiAgICAjIGNvcnJlY3QgdXNlLCBob3dldmVyIGlzIG5vdCBhY2NlcHRlZCBieSBwZXAtNDg0IHRvb2xpbmcKCgogICAgY2xhc3MgSW50ZXJ2YWwoQmFzZSk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiByYWRpdXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBhYnMoc2VsZi5sZW5ndGgpIC8gMgoKICAgICAgICBAcmFkaXVzLnNldHRlcgogICAgICAgIGRlZiByYWRpdXMoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLmxlbmd0aCA9IHZhbHVlICogMgoKICAgICAgICBAcmFkaXVzLmV4cHJlc3Npb24KICAgICAgICBkZWYgcmFkaXVzKGNscyk6CiAgICAgICAgICAgIHJldHVybiB0eXBlX2NvZXJjZShmdW5jLmFicyhjbHMubGVuZ3RoKSAvIDIsIEZsb2F0KQoKQWJvdmUsIHRoZXJlIGFyZSB0aHJlZSBgYEludGVydmFsLnJhZGl1c2BgIG1ldGhvZHMsIGJ1dCBhcyBlYWNoIGFyZSBkZWNvcmF0ZWQsCmZpcnN0IGJ5IHRoZSA6Y2xhc3M6YC5oeWJyaWRfcHJvcGVydHlgIGRlY29yYXRvciBhbmQgdGhlbiBieSB0aGUKYGBAcmFkaXVzYGAgbmFtZSBpdHNlbGYsIHRoZSBlbmQgZWZmZWN0IGlzIHRoYXQgYGBJbnRlcnZhbC5yYWRpdXNgYCBpcwphIHNpbmdsZSBhdHRyaWJ1dGUgd2l0aCB0aHJlZSBkaWZmZXJlbnQgZnVuY3Rpb25zIGNvbnRhaW5lZCB3aXRoaW4gaXQuClRoaXMgc3R5bGUgb2YgdXNlIGlzIHRha2VuIGZyb20gYFB5dGhvbidzIGRvY3VtZW50ZWQgdXNlIG9mIEBwcm9wZXJ0eQo8aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L2Z1bmN0aW9ucy5odG1sI3Byb3BlcnR5PmBfLgpJdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSB3YXkgYm90aCBgYEBwcm9wZXJ0eWBgIGFzIHdlbGwgYXMKOmNsYXNzOmAuaHlicmlkX3Byb3BlcnR5YCB3b3JrLCBhICoqY29weSBvZiB0aGUgZGVzY3JpcHRvciBpcyBtYWRlIGVhY2ggdGltZSoqLgpUaGF0IGlzLCBlYWNoIGNhbGwgdG8gYGBAcmFkaXVzLmV4cHJlc3Npb25gYCwgYGBAcmFkaXVzLnNldHRlcmBgIGV0Yy4KbWFrZSBhIG5ldyBvYmplY3QgZW50aXJlbHkuICBUaGlzIGFsbG93cyB0aGUgYXR0cmlidXRlIHRvIGJlIHJlLWRlZmluZWQgaW4Kc3ViY2xhc3NlcyB3aXRob3V0IGlzc3VlIChzZWUgOnJlZjpgaHlicmlkX3JldXNlX3N1YmNsYXNzYCBsYXRlciBpbiB0aGlzCnNlY3Rpb24gZm9yIGhvdyB0aGlzIGlzIHVzZWQpLgoKSG93ZXZlciwgdGhlIGFib3ZlIGFwcHJvYWNoIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdHlwaW5nIHRvb2xzIHN1Y2ggYXMKbXlweSBhbmQgcHlyaWdodC4gIFB5dGhvbidzIG93biBgYEBwcm9wZXJ0eWBgIGRlY29yYXRvciBkb2VzIG5vdCBoYXZlIHRoaXMKbGltaXRhdGlvbiBvbmx5IGJlY2F1c2UKYHRoZXNlIHRvb2xzIGhhcmRjb2RlIHRoZSBiZWhhdmlvciBvZiBAcHJvcGVydHkKPGh0dHBzOi8vZ2l0aHViLmNvbS9weXRob24vdHlwaW5nL2Rpc2N1c3Npb25zLzExMDI+YF8sIG1lYW5pbmcgdGhpcyBzeW50YXgKaXMgbm90IGF2YWlsYWJsZSB0byBTUUxBbGNoZW15IHVuZGVyIDpwZXA6YDQ4NGAgY29tcGxpYW5jZS4KCkluIG9yZGVyIHRvIHByb2R1Y2UgYSByZWFzb25hYmxlIHN5bnRheCB3aGlsZSByZW1haW5pbmcgdHlwaW5nIGNvbXBsaWFudCwKdGhlIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5LmlucGxhY2VgIGRlY29yYXRvciBhbGxvd3MgdGhlIHNhbWUKZGVjb3JhdG9yIHRvIGJlIHJlLXVzZWQgd2l0aCBkaWZmZXJlbnQgbWV0aG9kIG5hbWVzLCB3aGlsZSBzdGlsbCBwcm9kdWNpbmcKYSBzaW5nbGUgZGVjb3JhdG9yIHVuZGVyIG9uZSBuYW1lOjoKCiAgICAjIGNvcnJlY3QgdXNlIHdoaWNoIGlzIGFsc28gYWNjZXB0ZWQgYnkgcGVwLTQ4NCB0b29saW5nCgoKICAgIGNsYXNzIEludGVydmFsKEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgcmFkaXVzKHNlbGYpIC0+IGZsb2F0OgogICAgICAgICAgICByZXR1cm4gYWJzKHNlbGYubGVuZ3RoKSAvIDIKCiAgICAgICAgQHJhZGl1cy5pbnBsYWNlLnNldHRlcgogICAgICAgIGRlZiBfcmFkaXVzX3NldHRlcihzZWxmLCB2YWx1ZTogZmxvYXQpIC0+IE5vbmU6CiAgICAgICAgICAgICMgZm9yIGV4YW1wbGUgb25seQogICAgICAgICAgICBzZWxmLmxlbmd0aCA9IHZhbHVlICogMgoKICAgICAgICBAcmFkaXVzLmlucGxhY2UuZXhwcmVzc2lvbgogICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgIGRlZiBfcmFkaXVzX2V4cHJlc3Npb24oY2xzKSAtPiBDb2x1bW5FbGVtZW50W2Zsb2F0XToKICAgICAgICAgICAgcmV0dXJuIHR5cGVfY29lcmNlKGZ1bmMuYWJzKGNscy5sZW5ndGgpIC8gMiwgRmxvYXQpCgpVc2luZyA6YXR0cjpgLmh5YnJpZF9wcm9wZXJ0eS5pbnBsYWNlYCBmdXJ0aGVyIHF1YWxpZmllcyB0aGUgdXNlIG9mIHRoZQpkZWNvcmF0b3IgdGhhdCBhIG5ldyBjb3B5IHNob3VsZCBub3QgYmUgbWFkZSwgdGhlcmVieSBtYWludGFpbmluZyB0aGUKYGBJbnRlcnZhbC5yYWRpdXNgYCBuYW1lIHdoaWxlIGFsbG93aW5nIGFkZGl0aW9uYWwgbWV0aG9kcwpgYEludGVydmFsLl9yYWRpdXNfc2V0dGVyYGAgYW5kIGBgSW50ZXJ2YWwuX3JhZGl1c19leHByZXNzaW9uYGAgdG8gYmUKZGlmZmVyZW50bHkgbmFtZWQuCgoKLi4gdmVyc2lvbmFkZGVkOjogMi4wLjQgQWRkZWQgOmF0dHI6YC5oeWJyaWRfcHJvcGVydHkuaW5wbGFjZWAgdG8gYWxsb3cKICAgbGVzcyB2ZXJib3NlIGNvbnN0cnVjdGlvbiBvZiBjb21wb3NpdGUgOmNsYXNzOmAuaHlicmlkX3Byb3BlcnR5YCBvYmplY3RzCiAgIHdoaWxlIG5vdCBoYXZpbmcgdG8gdXNlIHJlcGVhdGVkIG1ldGhvZCBuYW1lcy4gICBBZGRpdGlvbmFsbHkgYWxsb3dlZCB0aGUKICAgdXNlIG9mIGBgQGNsYXNzbWV0aG9kYGAgd2l0aGluIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gLAogICA6YXR0cjpgLmh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvbmAsIGFuZAogICA6YXR0cjpgLmh5YnJpZF9wcm9wZXJ0eS5jb21wYXJhdG9yYCB0byBhbGxvdyB0eXBpbmcgdG9vbHMgdG8gaWRlbnRpZnkKICAgYGBjbHNgYCBhcyBhIGNsYXNzIGFuZCBub3QgYW4gaW5zdGFuY2UgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUuCgoKRGVmaW5pbmcgU2V0dGVycwotLS0tLS0tLS0tLS0tLS0tCgpUaGUgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuc2V0dGVyYCBtb2RpZmllciBhbGxvd3MgdGhlIGNvbnN0cnVjdGlvbiBvZiBhCmN1c3RvbSBzZXR0ZXIgbWV0aG9kLCB0aGF0IGNhbiBtb2RpZnkgdmFsdWVzIG9uIHRoZSBvYmplY3Q6OgoKICAgIGNsYXNzIEludGVydmFsKEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgbGVuZ3RoKHNlbGYpIC0+IGludDoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5kIC0gc2VsZi5zdGFydAoKICAgICAgICBAbGVuZ3RoLmlucGxhY2Uuc2V0dGVyCiAgICAgICAgZGVmIF9sZW5ndGhfc2V0dGVyKHNlbGYsIHZhbHVlOiBpbnQpIC0+IE5vbmU6CiAgICAgICAgICAgIHNlbGYuZW5kID0gc2VsZi5zdGFydCArIHZhbHVlCgpUaGUgYGBsZW5ndGgoc2VsZiwgdmFsdWUpYGAgbWV0aG9kIGlzIG5vdyBjYWxsZWQgdXBvbiBzZXQ6OgoKICAgID4+PiBpMSA9IEludGVydmFsKDUsIDEwKQogICAgPj4+IGkxLmxlbmd0aAogICAgNQogICAgPj4+IGkxLmxlbmd0aCA9IDEyCiAgICA+Pj4gaTEuZW5kCiAgICAxNwoKLi4gX2h5YnJpZF9idWxrX3VwZGF0ZToKCkFsbG93aW5nIEJ1bGsgT1JNIFVwZGF0ZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgaHlicmlkIGNhbiBkZWZpbmUgYSBjdXN0b20gIlVQREFURSIgaGFuZGxlciBmb3Igd2hlbiB1c2luZwpPUk0tZW5hYmxlZCB1cGRhdGVzLCBhbGxvd2luZyB0aGUgaHlicmlkIHRvIGJlIHVzZWQgaW4gdGhlClNFVCBjbGF1c2Ugb2YgdGhlIHVwZGF0ZS4KCk5vcm1hbGx5LCB3aGVuIHVzaW5nIGEgaHlicmlkIHdpdGggOmZ1bmM6YF9zcWwudXBkYXRlYCwgdGhlIFNRTApleHByZXNzaW9uIGlzIHVzZWQgYXMgdGhlIGNvbHVtbiB0aGF0J3MgdGhlIHRhcmdldCBvZiB0aGUgU0VULiAgSWYgb3VyCmBgSW50ZXJ2YWxgYCBjbGFzcyBoYWQgYSBoeWJyaWQgYGBzdGFydF9wb2ludGBgIHRoYXQgbGlua2VkIHRvCmBgSW50ZXJ2YWwuc3RhcnRgYCwgdGhpcyBjb3VsZCBiZSBzdWJzdGl0dXRlZCBkaXJlY3RseTo6CgogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCB1cGRhdGUKCiAgICBzdG10ID0gdXBkYXRlKEludGVydmFsKS52YWx1ZXMoe0ludGVydmFsLnN0YXJ0X3BvaW50OiAxMH0pCgpIb3dldmVyLCB3aGVuIHVzaW5nIGEgY29tcG9zaXRlIGh5YnJpZCBsaWtlIGBgSW50ZXJ2YWwubGVuZ3RoYGAsIHRoaXMKaHlicmlkIHJlcHJlc2VudHMgbW9yZSB0aGFuIG9uZSBjb2x1bW4uICAgV2UgY2FuIHNldCB1cCBhIGhhbmRsZXIgdGhhdCB3aWxsCmFjY29tbW9kYXRlIGEgdmFsdWUgcGFzc2VkIGluIHRoZSBWQUxVRVMgZXhwcmVzc2lvbiB3aGljaCBjYW4gYWZmZWN0CnRoaXMsIHVzaW5nIHRoZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvbmAgZGVjb3JhdG9yLgpBIGhhbmRsZXIgdGhhdCB3b3JrcyBzaW1pbGFybHkgdG8gb3VyIHNldHRlciB3b3VsZCBiZTo6CgogICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIFR1cGxlLCBBbnkKCgogICAgY2xhc3MgSW50ZXJ2YWwoQmFzZSk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBsZW5ndGgoc2VsZikgLT4gaW50OgogICAgICAgICAgICByZXR1cm4gc2VsZi5lbmQgLSBzZWxmLnN0YXJ0CgogICAgICAgIEBsZW5ndGguaW5wbGFjZS5zZXR0ZXIKICAgICAgICBkZWYgX2xlbmd0aF9zZXR0ZXIoc2VsZiwgdmFsdWU6IGludCkgLT4gTm9uZToKICAgICAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnN0YXJ0ICsgdmFsdWUKCiAgICAgICAgQGxlbmd0aC5pbnBsYWNlLnVwZGF0ZV9leHByZXNzaW9uCiAgICAgICAgZGVmIF9sZW5ndGhfdXBkYXRlX2V4cHJlc3Npb24oCiAgICAgICAgICAgIGNscywgdmFsdWU6IEFueQogICAgICAgICkgLT4gTGlzdFtUdXBsZVtBbnksIEFueV1dOgogICAgICAgICAgICByZXR1cm4gWyhjbHMuZW5kLCBjbHMuc3RhcnQgKyB2YWx1ZSldCgpBYm92ZSwgaWYgd2UgdXNlIGBgSW50ZXJ2YWwubGVuZ3RoYGAgaW4gYW4gVVBEQVRFIGV4cHJlc3Npb24sIHdlIGdldAphIGh5YnJpZCBTRVQgZXhwcmVzc2lvbjoKCi4uIHNvdXJjZWNvZGU6OiBweWNvbitzcWwKCgogICAgPj4+IGZyb20gc3FsYWxjaGVteSBpbXBvcnQgdXBkYXRlCiAgICA+Pj4gcHJpbnQodXBkYXRlKEludGVydmFsKS52YWx1ZXMoe0ludGVydmFsLmxlbmd0aDogMjV9KSkKICAgIHtwcmludHNxbH1VUERBVEUgaW50ZXJ2YWwgU0VUICJlbmQiPShpbnRlcnZhbC5zdGFydCArIDpzdGFydF8xKQoKVGhpcyBTRVQgZXhwcmVzc2lvbiBpcyBhY2NvbW1vZGF0ZWQgYnkgdGhlIE9STSBhdXRvbWF0aWNhbGx5LgoKLi4gc2VlYWxzbzo6CgogICAgOnJlZjpgb3JtX2V4cHJlc3Npb25fdXBkYXRlX2RlbGV0ZWAgLSBpbmNsdWRlcyBiYWNrZ3JvdW5kIG9uIE9STS1lbmFibGVkCiAgICBVUERBVEUgc3RhdGVtZW50cwoKCldvcmtpbmcgd2l0aCBSZWxhdGlvbnNoaXBzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVyZSdzIG5vIGVzc2VudGlhbCBkaWZmZXJlbmNlIHdoZW4gY3JlYXRpbmcgaHlicmlkcyB0aGF0IHdvcmsgd2l0aApyZWxhdGVkIG9iamVjdHMgYXMgb3Bwb3NlZCB0byBjb2x1bW4tYmFzZWQgZGF0YS4gVGhlIG5lZWQgZm9yIGRpc3RpbmN0CmV4cHJlc3Npb25zIHRlbmRzIHRvIGJlIGdyZWF0ZXIuICBUaGUgdHdvIHZhcmlhbnRzIHdlJ2xsIGlsbHVzdHJhdGUKYXJlIHRoZSAiam9pbi1kZXBlbmRlbnQiIGh5YnJpZCwgYW5kIHRoZSAiY29ycmVsYXRlZCBzdWJxdWVyeSIgaHlicmlkLgoKSm9pbi1EZXBlbmRlbnQgUmVsYXRpb25zaGlwIEh5YnJpZApeXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCgpDb25zaWRlciB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aXZlCm1hcHBpbmcgd2hpY2ggcmVsYXRlcyBhIGBgVXNlcmBgIHRvIGEgYGBTYXZpbmdzQWNjb3VudGBgOjoKCiAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgogICAgZnJvbSBkZWNpbWFsIGltcG9ydCBEZWNpbWFsCiAgICBmcm9tIHR5cGluZyBpbXBvcnQgY2FzdAogICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKICAgIGZyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAoKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgRm9yZWlnbktleQogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBOdW1lcmljCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IFN0cmluZwogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBTUUxDb2x1bW5FeHByZXNzaW9uCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0Lmh5YnJpZCBpbXBvcnQgaHlicmlkX3Byb3BlcnR5CiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBEZWNsYXJhdGl2ZUJhc2UKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IE1hcHBlZAogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgbWFwcGVkX2NvbHVtbgogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgcmVsYXRpb25zaGlwCgoKICAgIGNsYXNzIEJhc2UoRGVjbGFyYXRpdmVCYXNlKToKICAgICAgICBwYXNzCgoKICAgIGNsYXNzIFNhdmluZ3NBY2NvdW50KEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAiYWNjb3VudCIKICAgICAgICBpZDogTWFwcGVkW2ludF0gPSBtYXBwZWRfY29sdW1uKHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgdXNlcl9pZDogTWFwcGVkW2ludF0gPSBtYXBwZWRfY29sdW1uKEZvcmVpZ25LZXkoInVzZXIuaWQiKSkKICAgICAgICBiYWxhbmNlOiBNYXBwZWRbRGVjaW1hbF0gPSBtYXBwZWRfY29sdW1uKE51bWVyaWMoMTUsIDUpKQoKICAgICAgICBvd25lcjogTWFwcGVkW1VzZXJdID0gcmVsYXRpb25zaGlwKGJhY2tfcG9wdWxhdGVzPSJhY2NvdW50cyIpCgoKICAgIGNsYXNzIFVzZXIoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICJ1c2VyIgogICAgICAgIGlkOiBNYXBwZWRbaW50XSA9IG1hcHBlZF9jb2x1bW4ocHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBuYW1lOiBNYXBwZWRbc3RyXSA9IG1hcHBlZF9jb2x1bW4oU3RyaW5nKDEwMCkpCgogICAgICAgIGFjY291bnRzOiBNYXBwZWRbTGlzdFtTYXZpbmdzQWNjb3VudF1dID0gcmVsYXRpb25zaGlwKAogICAgICAgICAgICBiYWNrX3BvcHVsYXRlcz0ib3duZXIiLCBsYXp5PSJzZWxlY3RpbiIKICAgICAgICApCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgYmFsYW5jZShzZWxmKSAtPiBPcHRpb25hbFtEZWNpbWFsXToKICAgICAgICAgICAgaWYgc2VsZi5hY2NvdW50czoKICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmFjY291bnRzWzBdLmJhbGFuY2UKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHJldHVybiBOb25lCgogICAgICAgIEBiYWxhbmNlLmlucGxhY2Uuc2V0dGVyCiAgICAgICAgZGVmIF9iYWxhbmNlX3NldHRlcihzZWxmLCB2YWx1ZTogT3B0aW9uYWxbRGVjaW1hbF0pIC0+IE5vbmU6CiAgICAgICAgICAgIGFzc2VydCB2YWx1ZSBpcyBub3QgTm9uZQoKICAgICAgICAgICAgaWYgbm90IHNlbGYuYWNjb3VudHM6CiAgICAgICAgICAgICAgICBhY2NvdW50ID0gU2F2aW5nc0FjY291bnQob3duZXI9c2VsZikKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIGFjY291bnQgPSBzZWxmLmFjY291bnRzWzBdCiAgICAgICAgICAgIGFjY291bnQuYmFsYW5jZSA9IHZhbHVlCgogICAgICAgIEBiYWxhbmNlLmlucGxhY2UuZXhwcmVzc2lvbgogICAgICAgIEBjbGFzc21ldGhvZAogICAgICAgIGRlZiBfYmFsYW5jZV9leHByZXNzaW9uKGNscykgLT4gU1FMQ29sdW1uRXhwcmVzc2lvbltPcHRpb25hbFtEZWNpbWFsXV06CiAgICAgICAgICAgIHJldHVybiBjYXN0KAogICAgICAgICAgICAgICAgIlNRTENvbHVtbkV4cHJlc3Npb25bT3B0aW9uYWxbRGVjaW1hbF1dIiwKICAgICAgICAgICAgICAgIFNhdmluZ3NBY2NvdW50LmJhbGFuY2UsCiAgICAgICAgICAgICkKClRoZSBhYm92ZSBoeWJyaWQgcHJvcGVydHkgYGBiYWxhbmNlYGAgd29ya3Mgd2l0aCB0aGUgZmlyc3QKYGBTYXZpbmdzQWNjb3VudGBgIGVudHJ5IGluIHRoZSBsaXN0IG9mIGFjY291bnRzIGZvciB0aGlzIHVzZXIuICAgVGhlCmluLVB5dGhvbiBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgY2FuIHRyZWF0IGBgYWNjb3VudHNgYCBhcyBhIFB5dGhvbgpsaXN0IGF2YWlsYWJsZSBvbiBgYHNlbGZgYC4KCi4uIHRpcDo6IFRoZSBgYFVzZXIuYmFsYW5jZWBgIGdldHRlciBpbiB0aGUgYWJvdmUgZXhhbXBsZSBhY2Nlc3NlcyB0aGUKICAgYGBzZWxmLmFjY2NvdW50c2BgIGNvbGxlY3Rpb24sIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgbG9hZGVkIHZpYSB0aGUKICAgOmZ1bmM6YC5zZWxlY3RpbmxvYWRgIGxvYWRlciBzdHJhdGVneSBjb25maWd1cmVkIG9uIHRoZSBgYFVzZXIuYmFsYW5jZWBgCiAgIDpmdW5jOmBfb3JtLnJlbGF0aW9uc2hpcGAuIFRoZSBkZWZhdWx0IGxvYWRlciBzdHJhdGVneSB3aGVuIG5vdCBvdGhlcndpc2UKICAgc3RhdGVkIG9uIDpmdW5jOmBfb3JtLnJlbGF0aW9uc2hpcGAgaXMgOmZ1bmM6YC5sYXp5bG9hZGAsIHdoaWNoIGVtaXRzIFNRTCBvbgogICBkZW1hbmQuIFdoZW4gdXNpbmcgYXN5bmNpbywgb24tZGVtYW5kIGxvYWRlcnMgc3VjaCBhcyA6ZnVuYzpgLmxhenlsb2FkYCBhcmUKICAgbm90IHN1cHBvcnRlZCwgc28gY2FyZSBzaG91bGQgYmUgdGFrZW4gdG8gZW5zdXJlIHRoZSBgYHNlbGYuYWNjb3VudHNgYAogICBjb2xsZWN0aW9uIGlzIGFjY2Vzc2libGUgdG8gdGhpcyBoeWJyaWQgYWNjZXNzb3Igd2hlbiB1c2luZyBhc3luY2lvLgoKQXQgdGhlIGV4cHJlc3Npb24gbGV2ZWwsIGl0J3MgZXhwZWN0ZWQgdGhhdCB0aGUgYGBVc2VyYGAgY2xhc3Mgd2lsbApiZSB1c2VkIGluIGFuIGFwcHJvcHJpYXRlIGNvbnRleHQgc3VjaCB0aGF0IGFuIGFwcHJvcHJpYXRlIGpvaW4gdG8KYGBTYXZpbmdzQWNjb3VudGBgIHdpbGwgYmUgcHJlc2VudDoKCi4uIHNvdXJjZWNvZGU6OiBweWNvbitzcWwKCiAgICA+Pj4gZnJvbSBzcWxhbGNoZW15IGltcG9ydCBzZWxlY3QKICAgID4+PiBwcmludCgKICAgIC4uLiAgICAgc2VsZWN0KFVzZXIsIFVzZXIuYmFsYW5jZSkKICAgIC4uLiAgICAgLmpvaW4oVXNlci5hY2NvdW50cykKICAgIC4uLiAgICAgLmZpbHRlcihVc2VyLmJhbGFuY2UgPiA1MDAwKQogICAgLi4uICkKICAgIHtwcmludHNxbH1TRUxFQ1QgInVzZXIiLmlkIEFTIHVzZXJfaWQsICJ1c2VyIi5uYW1lIEFTIHVzZXJfbmFtZSwKICAgIGFjY291bnQuYmFsYW5jZSBBUyBhY2NvdW50X2JhbGFuY2UKICAgIEZST00gInVzZXIiIEpPSU4gYWNjb3VudCBPTiAidXNlciIuaWQgPSBhY2NvdW50LnVzZXJfaWQKICAgIFdIRVJFIGFjY291bnQuYmFsYW5jZSA+IDpiYWxhbmNlXzEKCk5vdGUgaG93ZXZlciwgdGhhdCB3aGlsZSB0aGUgaW5zdGFuY2UgbGV2ZWwgYWNjZXNzb3JzIG5lZWQgdG8gd29ycnkKYWJvdXQgd2hldGhlciBgYHNlbGYuYWNjb3VudHNgYCBpcyBldmVuIHByZXNlbnQsIHRoaXMgaXNzdWUgZXhwcmVzc2VzCml0c2VsZiBkaWZmZXJlbnRseSBhdCB0aGUgU1FMIGV4cHJlc3Npb24gbGV2ZWwsIHdoZXJlIHdlIGJhc2ljYWxseQp3b3VsZCB1c2UgYW4gb3V0ZXIgam9pbjoKCi4uIHNvdXJjZWNvZGU6OiBweWNvbitzcWwKCiAgICA+Pj4gZnJvbSBzcWxhbGNoZW15IGltcG9ydCBzZWxlY3QKICAgID4+PiBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IG9yXwogICAgPj4+IHByaW50KAogICAgLi4uICAgICBzZWxlY3QoVXNlciwgVXNlci5iYWxhbmNlKQogICAgLi4uICAgICAub3V0ZXJqb2luKFVzZXIuYWNjb3VudHMpCiAgICAuLi4gICAgIC5maWx0ZXIob3JfKFVzZXIuYmFsYW5jZSA8IDUwMDAsIFVzZXIuYmFsYW5jZSA9PSBOb25lKSkKICAgIC4uLiApCiAgICB7cHJpbnRzcWx9U0VMRUNUICJ1c2VyIi5pZCBBUyB1c2VyX2lkLCAidXNlciIubmFtZSBBUyB1c2VyX25hbWUsCiAgICBhY2NvdW50LmJhbGFuY2UgQVMgYWNjb3VudF9iYWxhbmNlCiAgICBGUk9NICJ1c2VyIiBMRUZUIE9VVEVSIEpPSU4gYWNjb3VudCBPTiAidXNlciIuaWQgPSBhY2NvdW50LnVzZXJfaWQKICAgIFdIRVJFIGFjY291bnQuYmFsYW5jZSA8ICA6YmFsYW5jZV8xIE9SIGFjY291bnQuYmFsYW5jZSBJUyBOVUxMCgpDb3JyZWxhdGVkIFN1YnF1ZXJ5IFJlbGF0aW9uc2hpcCBIeWJyaWQKXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgoKV2UgY2FuLCBvZiBjb3Vyc2UsIGZvcmVnbyBiZWluZyBkZXBlbmRlbnQgb24gdGhlIGVuY2xvc2luZyBxdWVyeSdzIHVzYWdlCm9mIGpvaW5zIGluIGZhdm9yIG9mIHRoZSBjb3JyZWxhdGVkIHN1YnF1ZXJ5LCB3aGljaCBjYW4gcG9ydGFibHkgYmUgcGFja2VkCmludG8gYSBzaW5nbGUgY29sdW1uIGV4cHJlc3Npb24uIEEgY29ycmVsYXRlZCBzdWJxdWVyeSBpcyBtb3JlIHBvcnRhYmxlLCBidXQKb2Z0ZW4gcGVyZm9ybXMgbW9yZSBwb29ybHkgYXQgdGhlIFNRTCBsZXZlbC4gVXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlCmlsbHVzdHJhdGVkIGF0IDpyZWY6YG1hcHBlcl9jb2x1bW5fcHJvcGVydHlfc3FsX2V4cHJlc3Npb25zYCwKd2UgY2FuIGFkanVzdCBvdXIgYGBTYXZpbmdzQWNjb3VudGBgIGV4YW1wbGUgdG8gYWdncmVnYXRlIHRoZSBiYWxhbmNlcyBmb3IKKmFsbCogYWNjb3VudHMsIGFuZCB1c2UgYSBjb3JyZWxhdGVkIHN1YnF1ZXJ5IGZvciB0aGUgY29sdW1uIGV4cHJlc3Npb246OgoKICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCiAgICBmcm9tIGRlY2ltYWwgaW1wb3J0IERlY2ltYWwKICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CgogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBGb3JlaWduS2V5CiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IGZ1bmMKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgTnVtZXJpYwogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBzZWxlY3QKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgU1FMQ29sdW1uRXhwcmVzc2lvbgogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBTdHJpbmcKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBoeWJyaWRfcHJvcGVydHkKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IERlY2xhcmF0aXZlQmFzZQogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgTWFwcGVkCiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBtYXBwZWRfY29sdW1uCiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCByZWxhdGlvbnNoaXAKCgogICAgY2xhc3MgQmFzZShEZWNsYXJhdGl2ZUJhc2UpOgogICAgICAgIHBhc3MKCgogICAgY2xhc3MgU2F2aW5nc0FjY291bnQoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICJhY2NvdW50IgogICAgICAgIGlkOiBNYXBwZWRbaW50XSA9IG1hcHBlZF9jb2x1bW4ocHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICB1c2VyX2lkOiBNYXBwZWRbaW50XSA9IG1hcHBlZF9jb2x1bW4oRm9yZWlnbktleSgidXNlci5pZCIpKQogICAgICAgIGJhbGFuY2U6IE1hcHBlZFtEZWNpbWFsXSA9IG1hcHBlZF9jb2x1bW4oTnVtZXJpYygxNSwgNSkpCgogICAgICAgIG93bmVyOiBNYXBwZWRbVXNlcl0gPSByZWxhdGlvbnNoaXAoYmFja19wb3B1bGF0ZXM9ImFjY291bnRzIikKCgogICAgY2xhc3MgVXNlcihCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gInVzZXIiCiAgICAgICAgaWQ6IE1hcHBlZFtpbnRdID0gbWFwcGVkX2NvbHVtbihwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIG5hbWU6IE1hcHBlZFtzdHJdID0gbWFwcGVkX2NvbHVtbihTdHJpbmcoMTAwKSkKCiAgICAgICAgYWNjb3VudHM6IE1hcHBlZFtMaXN0W1NhdmluZ3NBY2NvdW50XV0gPSByZWxhdGlvbnNoaXAoCiAgICAgICAgICAgIGJhY2tfcG9wdWxhdGVzPSJvd25lciIsIGxhenk9InNlbGVjdGluIgogICAgICAgICkKCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBiYWxhbmNlKHNlbGYpIC0+IERlY2ltYWw6CiAgICAgICAgICAgIHJldHVybiBzdW0oCiAgICAgICAgICAgICAgICAoYWNjLmJhbGFuY2UgZm9yIGFjYyBpbiBzZWxmLmFjY291bnRzKSwgc3RhcnQ9RGVjaW1hbCgiMCIpCiAgICAgICAgICAgICkKCiAgICAgICAgQGJhbGFuY2UuaW5wbGFjZS5leHByZXNzaW9uCiAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgZGVmIF9iYWxhbmNlX2V4cHJlc3Npb24oY2xzKSAtPiBTUUxDb2x1bW5FeHByZXNzaW9uW0RlY2ltYWxdOgogICAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICAgICAgc2VsZWN0KGZ1bmMuc3VtKFNhdmluZ3NBY2NvdW50LmJhbGFuY2UpKQogICAgICAgICAgICAgICAgLndoZXJlKFNhdmluZ3NBY2NvdW50LnVzZXJfaWQgPT0gY2xzLmlkKQogICAgICAgICAgICAgICAgLmxhYmVsKCJ0b3RhbF9iYWxhbmNlIikKICAgICAgICAgICAgKQoKVGhlIGFib3ZlIHJlY2lwZSB3aWxsIGdpdmUgdXMgdGhlIGBgYmFsYW5jZWBgIGNvbHVtbiB3aGljaCByZW5kZXJzCmEgY29ycmVsYXRlZCBTRUxFQ1Q6CgouLiBzb3VyY2Vjb2RlOjogcHljb24rc3FsCgogICAgPj4+IGZyb20gc3FsYWxjaGVteSBpbXBvcnQgc2VsZWN0CiAgICA+Pj4gcHJpbnQoc2VsZWN0KFVzZXIpLmZpbHRlcihVc2VyLmJhbGFuY2UgPiA0MDApKQogICAge3ByaW50c3FsfVNFTEVDVCAidXNlciIuaWQsICJ1c2VyIi5uYW1lCiAgICBGUk9NICJ1c2VyIgogICAgV0hFUkUgKAogICAgICAgIFNFTEVDVCBzdW0oYWNjb3VudC5iYWxhbmNlKSBBUyBzdW1fMSBGUk9NIGFjY291bnQKICAgICAgICBXSEVSRSBhY2NvdW50LnVzZXJfaWQgPSAidXNlciIuaWQKICAgICkgPiA6cGFyYW1fMQoKCi4uIF9oeWJyaWRfY3VzdG9tX2NvbXBhcmF0b3JzOgoKQnVpbGRpbmcgQ3VzdG9tIENvbXBhcmF0b3JzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIGh5YnJpZCBwcm9wZXJ0eSBhbHNvIGluY2x1ZGVzIGEgaGVscGVyIHRoYXQgYWxsb3dzIGNvbnN0cnVjdGlvbiBvZgpjdXN0b20gY29tcGFyYXRvcnMuIEEgY29tcGFyYXRvciBvYmplY3QgYWxsb3dzIG9uZSB0byBjdXN0b21pemUgdGhlCmJlaGF2aW9yIG9mIGVhY2ggU1FMQWxjaGVteSBleHByZXNzaW9uIG9wZXJhdG9yIGluZGl2aWR1YWxseS4gIFRoZXkKYXJlIHVzZWZ1bCB3aGVuIGNyZWF0aW5nIGN1c3RvbSB0eXBlcyB0aGF0IGhhdmUgc29tZSBoaWdobHkKaWRpb3N5bmNyYXRpYyBiZWhhdmlvciBvbiB0aGUgU1FMIHNpZGUuCgouLiBub3RlOjogIFRoZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5jb21wYXJhdG9yYCBkZWNvcmF0b3IgaW50cm9kdWNlZAogICBpbiB0aGlzIHNlY3Rpb24gKipyZXBsYWNlcyoqIHRoZSB1c2Ugb2YgdGhlCiAgIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIGRlY29yYXRvci4KICAgVGhleSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KClRoZSBleGFtcGxlIGNsYXNzIGJlbG93IGFsbG93cyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb25zIG9uIHRoZSBhdHRyaWJ1dGUKbmFtZWQgYGB3b3JkX2luc2Vuc2l0aXZlYGA6OgoKICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKCiAgICBmcm9tIHR5cGluZyBpbXBvcnQgQW55CgogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBDb2x1bW5FbGVtZW50CiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IGZ1bmMKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBDb21wYXJhdG9yCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0Lmh5YnJpZCBpbXBvcnQgaHlicmlkX3Byb3BlcnR5CiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBEZWNsYXJhdGl2ZUJhc2UKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IE1hcHBlZAogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgbWFwcGVkX2NvbHVtbgoKCiAgICBjbGFzcyBCYXNlKERlY2xhcmF0aXZlQmFzZSk6CiAgICAgICAgcGFzcwoKCiAgICBjbGFzcyBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKENvbXBhcmF0b3Jbc3RyXSk6CiAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcjogQW55KSAtPiBDb2x1bW5FbGVtZW50W2Jvb2xdOiAgIyB0eXBlOiBpZ25vcmVbb3ZlcnJpZGVdICAjIG5vcWE6IEU1MDEKICAgICAgICAgICAgcmV0dXJuIGZ1bmMubG93ZXIoc2VsZi5fX2NsYXVzZV9lbGVtZW50X18oKSkgPT0gZnVuYy5sb3dlcihvdGhlcikKCgogICAgY2xhc3MgU2VhcmNoV29yZChCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gInNlYXJjaHdvcmQiCgogICAgICAgIGlkOiBNYXBwZWRbaW50XSA9IG1hcHBlZF9jb2x1bW4ocHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICB3b3JkOiBNYXBwZWRbc3RyXQoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIHdvcmRfaW5zZW5zaXRpdmUoc2VsZikgLT4gc3RyOgogICAgICAgICAgICByZXR1cm4gc2VsZi53b3JkLmxvd2VyKCkKCiAgICAgICAgQHdvcmRfaW5zZW5zaXRpdmUuaW5wbGFjZS5jb21wYXJhdG9yCiAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgZGVmIF93b3JkX2luc2Vuc2l0aXZlX2NvbXBhcmF0b3IoY2xzKSAtPiBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yOgogICAgICAgICAgICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcihjbHMud29yZCkKCkFib3ZlLCBTUUwgZXhwcmVzc2lvbnMgYWdhaW5zdCBgYHdvcmRfaW5zZW5zaXRpdmVgYCB3aWxsIGFwcGx5IHRoZSBgYExPV0VSKClgYApTUUwgZnVuY3Rpb24gdG8gYm90aCBzaWRlczoKCi4uIHNvdXJjZWNvZGU6OiBweWNvbitzcWwKCiAgICA+Pj4gZnJvbSBzcWxhbGNoZW15IGltcG9ydCBzZWxlY3QKICAgID4+PiBwcmludChzZWxlY3QoU2VhcmNoV29yZCkuZmlsdGVyX2J5KHdvcmRfaW5zZW5zaXRpdmU9IlRydWNrcyIpKQogICAge3ByaW50c3FsfVNFTEVDVCBzZWFyY2h3b3JkLmlkLCBzZWFyY2h3b3JkLndvcmQKICAgIEZST00gc2VhcmNod29yZAogICAgV0hFUkUgbG93ZXIoc2VhcmNod29yZC53b3JkKSA9IGxvd2VyKDpsb3dlcl8xKQoKClRoZSBgYENhc2VJbnNlbnNpdGl2ZUNvbXBhcmF0b3JgYCBhYm92ZSBpbXBsZW1lbnRzIHBhcnQgb2YgdGhlCjpjbGFzczpgLkNvbHVtbk9wZXJhdG9yc2AgaW50ZXJmYWNlLiAgIEEgImNvZXJjaW9uIiBvcGVyYXRpb24gbGlrZQpsb3dlcmNhc2luZyBjYW4gYmUgYXBwbGllZCB0byBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIChpLmUuIGBgZXFgYCwKYGBsdGBgLCBgYGd0YGAsIGV0Yy4pIHVzaW5nIDptZXRoOmAuT3BlcmF0b3JzLm9wZXJhdGVgOjoKCiAgICBjbGFzcyBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKENvbXBhcmF0b3IpOgogICAgICAgIGRlZiBvcGVyYXRlKHNlbGYsIG9wLCBvdGhlciwgKiprd2FyZ3MpOgogICAgICAgICAgICByZXR1cm4gb3AoCiAgICAgICAgICAgICAgICBmdW5jLmxvd2VyKHNlbGYuX19jbGF1c2VfZWxlbWVudF9fKCkpLAogICAgICAgICAgICAgICAgZnVuYy5sb3dlcihvdGhlciksCiAgICAgICAgICAgICAgICAqKmt3YXJncywKICAgICAgICAgICAgKQoKLi4gX2h5YnJpZF9yZXVzZV9zdWJjbGFzczoKClJldXNpbmcgSHlicmlkIFByb3BlcnRpZXMgYWNyb3NzIFN1YmNsYXNzZXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBoeWJyaWQgY2FuIGJlIHJlZmVycmVkIHRvIGZyb20gYSBzdXBlcmNsYXNzLCB0byBhbGxvdyBtb2RpZnlpbmcKbWV0aG9kcyBsaWtlIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmdldHRlcmAsIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LnNldHRlcmAKdG8gYmUgdXNlZCB0byByZWRlZmluZSB0aG9zZSBtZXRob2RzIG9uIGEgc3ViY2xhc3MuICBUaGlzIGlzIHNpbWlsYXIgdG8KaG93IHRoZSBzdGFuZGFyZCBQeXRob24gYGBAcHJvcGVydHlgYCBvYmplY3Qgd29ya3M6OgoKICAgIGNsYXNzIEZpcnN0TmFtZU9ubHkoQmFzZSk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgZmlyc3RfbmFtZTogTWFwcGVkW3N0cl0KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBuYW1lKHNlbGYpIC0+IHN0cjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlyc3RfbmFtZQoKICAgICAgICBAbmFtZS5pbnBsYWNlLnNldHRlcgogICAgICAgIGRlZiBfbmFtZV9zZXR0ZXIoc2VsZiwgdmFsdWU6IHN0cikgLT4gTm9uZToKICAgICAgICAgICAgc2VsZi5maXJzdF9uYW1lID0gdmFsdWUKCgogICAgY2xhc3MgRmlyc3ROYW1lTGFzdE5hbWUoRmlyc3ROYW1lT25seSk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgbGFzdF9uYW1lOiBNYXBwZWRbc3RyXQoKICAgICAgICAjICdpbnBsYWNlJyBpcyBub3QgdXNlZCBoZXJlOyBjYWxsaW5nIGdldHRlciBjcmVhdGVzIGEgY29weQogICAgICAgICMgb2YgRmlyc3ROYW1lT25seS5uYW1lIHRoYXQgaXMgbG9jYWwgdG8gRmlyc3ROYW1lTGFzdE5hbWUKICAgICAgICBARmlyc3ROYW1lT25seS5uYW1lLmdldHRlcgogICAgICAgIGRlZiBuYW1lKHNlbGYpIC0+IHN0cjoKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmlyc3RfbmFtZSArICIgIiArIHNlbGYubGFzdF9uYW1lCgogICAgICAgIEBuYW1lLmlucGxhY2Uuc2V0dGVyCiAgICAgICAgZGVmIF9uYW1lX3NldHRlcihzZWxmLCB2YWx1ZTogc3RyKSAtPiBOb25lOgogICAgICAgICAgICBzZWxmLmZpcnN0X25hbWUsIHNlbGYubGFzdF9uYW1lID0gdmFsdWUuc3BsaXQoIiAiLCAxKQoKQWJvdmUsIHRoZSBgYEZpcnN0TmFtZUxhc3ROYW1lYGAgY2xhc3MgcmVmZXJzIHRvIHRoZSBoeWJyaWQgZnJvbQpgYEZpcnN0TmFtZU9ubHkubmFtZWBgIHRvIHJlcHVycG9zZSBpdHMgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoZSBzdWJjbGFzcy4KCldoZW4gb3ZlcnJpZGluZyA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5leHByZXNzaW9uYCBhbmQKOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuY29tcGFyYXRvcmAgYWxvbmUgYXMgdGhlIGZpcnN0IHJlZmVyZW5jZSB0byB0aGUKc3VwZXJjbGFzcywgdGhlc2UgbmFtZXMgY29uZmxpY3Qgd2l0aCB0aGUgc2FtZS1uYW1lZCBhY2Nlc3NvcnMgb24gdGhlIGNsYXNzLQpsZXZlbCA6Y2xhc3M6YC5RdWVyeWFibGVBdHRyaWJ1dGVgIG9iamVjdCByZXR1cm5lZCBhdCB0aGUgY2xhc3MgbGV2ZWwuICBUbwpvdmVycmlkZSB0aGVzZSBtZXRob2RzIHdoZW4gcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBwYXJlbnQgY2xhc3MgZGVzY3JpcHRvciwKYWRkIHRoZSBzcGVjaWFsIHF1YWxpZmllciA6YXR0cjpgLmh5YnJpZF9wcm9wZXJ0eS5vdmVycmlkZXNgLCB3aGljaCB3aWxsIGRlLQpyZWZlcmVuY2UgdGhlIGluc3RydW1lbnRlZCBhdHRyaWJ1dGUgYmFjayB0byB0aGUgaHlicmlkIG9iamVjdDo6CgogICAgY2xhc3MgRmlyc3ROYW1lTGFzdE5hbWUoRmlyc3ROYW1lT25seSk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgbGFzdF9uYW1lOiBNYXBwZWRbc3RyXQoKICAgICAgICBARmlyc3ROYW1lT25seS5uYW1lLm92ZXJyaWRlcy5leHByZXNzaW9uCiAgICAgICAgQGNsYXNzbWV0aG9kCiAgICAgICAgZGVmIG5hbWUoY2xzKToKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY29uY2F0KGNscy5maXJzdF9uYW1lLCAiICIsIGNscy5sYXN0X25hbWUpCgpIeWJyaWQgVmFsdWUgT2JqZWN0cwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKTm90ZSBpbiBvdXIgcHJldmlvdXMgZXhhbXBsZSwgaWYgd2Ugd2VyZSB0byBjb21wYXJlIHRoZSBgYHdvcmRfaW5zZW5zaXRpdmVgYAphdHRyaWJ1dGUgb2YgYSBgYFNlYXJjaFdvcmRgYCBpbnN0YW5jZSB0byBhIHBsYWluIFB5dGhvbiBzdHJpbmcsIHRoZSBwbGFpbgpQeXRob24gc3RyaW5nIHdvdWxkIG5vdCBiZSBjb2VyY2VkIHRvIGxvd2VyIGNhc2UgLSB0aGUKYGBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yYGAgd2UgYnVpbHQsIGJlaW5nIHJldHVybmVkIGJ5CmBgQHdvcmRfaW5zZW5zaXRpdmUuY29tcGFyYXRvcmBgLCBvbmx5IGFwcGxpZXMgdG8gdGhlIFNRTCBzaWRlLgoKQSBtb3JlIGNvbXByZWhlbnNpdmUgZm9ybSBvZiB0aGUgY3VzdG9tIGNvbXBhcmF0b3IgaXMgdG8gY29uc3RydWN0IGEgKkh5YnJpZApWYWx1ZSBPYmplY3QqLiBUaGlzIHRlY2huaXF1ZSBhcHBsaWVzIHRoZSB0YXJnZXQgdmFsdWUgb3IgZXhwcmVzc2lvbiB0byBhIHZhbHVlCm9iamVjdCB3aGljaCBpcyB0aGVuIHJldHVybmVkIGJ5IHRoZSBhY2Nlc3NvciBpbiBhbGwgY2FzZXMuICAgVGhlIHZhbHVlIG9iamVjdAphbGxvd3MgY29udHJvbCBvZiBhbGwgb3BlcmF0aW9ucyB1cG9uIHRoZSB2YWx1ZSBhcyB3ZWxsIGFzIGhvdyBjb21wYXJlZCB2YWx1ZXMKYXJlIHRyZWF0ZWQsIGJvdGggb24gdGhlIFNRTCBleHByZXNzaW9uIHNpZGUgYXMgd2VsbCBhcyB0aGUgUHl0aG9uIHZhbHVlIHNpZGUuClJlcGxhY2luZyB0aGUgcHJldmlvdXMgYGBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yYGAgY2xhc3Mgd2l0aCBhIG5ldwpgYENhc2VJbnNlbnNpdGl2ZVdvcmRgYCBjbGFzczo6CgogICAgY2xhc3MgQ2FzZUluc2Vuc2l0aXZlV29yZChDb21wYXJhdG9yKToKICAgICAgICAiSHlicmlkIHZhbHVlIHJlcHJlc2VudGluZyBhIGxvd2VyIGNhc2UgcmVwcmVzZW50YXRpb24gb2YgYSB3b3JkLiIKCiAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdvcmQpOgogICAgICAgICAgICBpZiBpc2luc3RhbmNlKHdvcmQsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgICAgc2VsZi53b3JkID0gd29yZC5sb3dlcigpCiAgICAgICAgICAgIGVsaWYgaXNpbnN0YW5jZSh3b3JkLCBDYXNlSW5zZW5zaXRpdmVXb3JkKToKICAgICAgICAgICAgICAgIHNlbGYud29yZCA9IHdvcmQud29yZAogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgc2VsZi53b3JkID0gZnVuYy5sb3dlcih3b3JkKQoKICAgICAgICBkZWYgb3BlcmF0ZShzZWxmLCBvcCwgb3RoZXIsICoqa3dhcmdzKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIENhc2VJbnNlbnNpdGl2ZVdvcmQpOgogICAgICAgICAgICAgICAgb3RoZXIgPSBDYXNlSW5zZW5zaXRpdmVXb3JkKG90aGVyKQogICAgICAgICAgICByZXR1cm4gb3Aoc2VsZi53b3JkLCBvdGhlci53b3JkLCAqKmt3YXJncykKCiAgICAgICAgZGVmIF9fY2xhdXNlX2VsZW1lbnRfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYud29yZAoKICAgICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYud29yZAoKICAgICAgICBrZXkgPSAid29yZCIKICAgICAgICAiTGFiZWwgdG8gYXBwbHkgdG8gUXVlcnkgdHVwbGUgcmVzdWx0cyIKCkFib3ZlLCB0aGUgYGBDYXNlSW5zZW5zaXRpdmVXb3JkYGAgb2JqZWN0IHJlcHJlc2VudHMgYGBzZWxmLndvcmRgYCwgd2hpY2ggbWF5CmJlIGEgU1FMIGZ1bmN0aW9uLCBvciBtYXkgYmUgYSBQeXRob24gbmF0aXZlLiAgIEJ5IG92ZXJyaWRpbmcgYGBvcGVyYXRlKClgYCBhbmQKYGBfX2NsYXVzZV9lbGVtZW50X18oKWBgIHRvIHdvcmsgaW4gdGVybXMgb2YgYGBzZWxmLndvcmRgYCwgYWxsIGNvbXBhcmlzb24Kb3BlcmF0aW9ucyB3aWxsIHdvcmsgYWdhaW5zdCB0aGUgImNvbnZlcnRlZCIgZm9ybSBvZiBgYHdvcmRgYCwgd2hldGhlciBpdCBiZQpTUUwgc2lkZSBvciBQeXRob24gc2lkZS4gT3VyIGBgU2VhcmNoV29yZGBgIGNsYXNzIGNhbiBub3cgZGVsaXZlciB0aGUKYGBDYXNlSW5zZW5zaXRpdmVXb3JkYGAgb2JqZWN0IHVuY29uZGl0aW9uYWxseSBmcm9tIGEgc2luZ2xlIGh5YnJpZCBjYWxsOjoKCiAgICBjbGFzcyBTZWFyY2hXb3JkKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAic2VhcmNod29yZCIKICAgICAgICBpZDogTWFwcGVkW2ludF0gPSBtYXBwZWRfY29sdW1uKHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgd29yZDogTWFwcGVkW3N0cl0KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiB3b3JkX2luc2Vuc2l0aXZlKHNlbGYpIC0+IENhc2VJbnNlbnNpdGl2ZVdvcmQ6CiAgICAgICAgICAgIHJldHVybiBDYXNlSW5zZW5zaXRpdmVXb3JkKHNlbGYud29yZCkKClRoZSBgYHdvcmRfaW5zZW5zaXRpdmVgYCBhdHRyaWJ1dGUgbm93IGhhcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gYmVoYXZpb3IKdW5pdmVyc2FsbHksIGluY2x1ZGluZyBTUUwgZXhwcmVzc2lvbiB2cy4gUHl0aG9uIGV4cHJlc3Npb24gKG5vdGUgdGhlIFB5dGhvbgp2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZSBvbiB0aGUgUHl0aG9uIHNpZGUgaGVyZSk6CgouLiBzb3VyY2Vjb2RlOjogcHljb24rc3FsCgogICAgPj4+IHByaW50KHNlbGVjdChTZWFyY2hXb3JkKS5maWx0ZXJfYnkod29yZF9pbnNlbnNpdGl2ZT0iVHJ1Y2tzIikpCiAgICB7cHJpbnRzcWx9U0VMRUNUIHNlYXJjaHdvcmQuaWQgQVMgc2VhcmNod29yZF9pZCwgc2VhcmNod29yZC53b3JkIEFTIHNlYXJjaHdvcmRfd29yZAogICAgRlJPTSBzZWFyY2h3b3JkCiAgICBXSEVSRSBsb3dlcihzZWFyY2h3b3JkLndvcmQpID0gOmxvd2VyXzEKClNRTCBleHByZXNzaW9uIHZlcnN1cyBTUUwgZXhwcmVzc2lvbjoKCi4uIHNvdXJjZWNvZGU6OiBweWNvbitzcWwKCiAgICA+Pj4gZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgYWxpYXNlZAogICAgPj4+IHN3MSA9IGFsaWFzZWQoU2VhcmNoV29yZCkKICAgID4+PiBzdzIgPSBhbGlhc2VkKFNlYXJjaFdvcmQpCiAgICA+Pj4gcHJpbnQoCiAgICAuLi4gICAgIHNlbGVjdChzdzEud29yZF9pbnNlbnNpdGl2ZSwgc3cyLndvcmRfaW5zZW5zaXRpdmUpLmZpbHRlcigKICAgIC4uLiAgICAgICAgIHN3MS53b3JkX2luc2Vuc2l0aXZlID4gc3cyLndvcmRfaW5zZW5zaXRpdmUKICAgIC4uLiAgICAgKQogICAgLi4uICkKICAgIHtwcmludHNxbH1TRUxFQ1QgbG93ZXIoc2VhcmNod29yZF8xLndvcmQpIEFTIGxvd2VyXzEsCiAgICBsb3dlcihzZWFyY2h3b3JkXzIud29yZCkgQVMgbG93ZXJfMgogICAgRlJPTSBzZWFyY2h3b3JkIEFTIHNlYXJjaHdvcmRfMSwgc2VhcmNod29yZCBBUyBzZWFyY2h3b3JkXzIKICAgIFdIRVJFIGxvd2VyKHNlYXJjaHdvcmRfMS53b3JkKSA+IGxvd2VyKHNlYXJjaHdvcmRfMi53b3JkKQoKUHl0aG9uIG9ubHkgZXhwcmVzc2lvbjo6CgogICAgPj4+IHdzMSA9IFNlYXJjaFdvcmQod29yZD0iU29tZVdvcmQiKQogICAgPj4+IHdzMS53b3JkX2luc2Vuc2l0aXZlID09ICJzT21Fd09yRCIKICAgIFRydWUKICAgID4+PiB3czEud29yZF9pbnNlbnNpdGl2ZSA9PSAiWE9tRXdPclgiCiAgICBGYWxzZQogICAgPj4+IHByaW50KHdzMS53b3JkX2luc2Vuc2l0aXZlKQogICAgc29tZXdvcmQKClRoZSBIeWJyaWQgVmFsdWUgcGF0dGVybiBpcyB2ZXJ5IHVzZWZ1bCBmb3IgYW55IGtpbmQgb2YgdmFsdWUgdGhhdCBtYXkgaGF2ZQptdWx0aXBsZSByZXByZXNlbnRhdGlvbnMsIHN1Y2ggYXMgdGltZXN0YW1wcywgdGltZSBkZWx0YXMsIHVuaXRzIG9mCm1lYXN1cmVtZW50LCBjdXJyZW5jaWVzIGFuZCBlbmNyeXB0ZWQgcGFzc3dvcmRzLgoKLi4gc2VlYWxzbzo6CgogICAgYEh5YnJpZHMgYW5kIFZhbHVlIEFnbm9zdGljIFR5cGVzCiAgICA8aHR0cHM6Ly90ZWNoc3BvdC56enplZWsub3JnLzIwMTEvMTAvMjEvaHlicmlkcy1hbmQtdmFsdWUtYWdub3N0aWMtdHlwZXMvPmBfCiAgICAtIG9uIHRoZSB0ZWNoc3BvdC56enplZWsub3JnIGJsb2cKCiAgICBgVmFsdWUgQWdub3N0aWMgVHlwZXMsIFBhcnQgSUkKICAgIDxodHRwczovL3RlY2hzcG90Lnp6emVlay5vcmcvMjAxMS8xMC8yOS92YWx1ZS1hZ25vc3RpYy10eXBlcy1wYXJ0LWlpLz5gXyAtCiAgICBvbiB0aGUgdGVjaHNwb3Quenp6ZWVrLm9yZyBibG9nCgoK6QAAAAApAdoLYW5ub3RhdGlvbnMpAdoDQW55KQHaCENhbGxhYmxlKQHaBGNhc3QpAdoHR2VuZXJpYykB2gRMaXN0KQHaCE9wdGlvbmFsKQHaCG92ZXJsb2FkKQHaCFNlcXVlbmNlKQHaBVR1cGxlKQHaBFR5cGUpAdoNVFlQRV9DSEVDS0lORykB2gdUeXBlVmFyKQHaBVVuaW9u6QIAAAApAdoEdXRpbCkB2gphdHRyaWJ1dGVzKQHaG0luc3BlY3Rpb25BdHRyRXh0ZW5zaW9uVHlwZSkB2gppbnRlcmZhY2VzKQHaDU9STURlc2NyaXB0b3IpAdoSUXVlcnlhYmxlQXR0cmlidXRlKQHaBXJvbGVzKQHaFWlzX2hhc19jbGF1c2VfZWxlbWVudCkB2g1Db2x1bW5FbGVtZW50KQHaEVNRTENvcmVPcGVyYXRpb25zKQHaC0NvbmNhdGVuYXRlKQHaB0xpdGVyYWwpAdoJUGFyYW1TcGVjKQHaCFByb3RvY29sKQHaBFNlbGYpAdoOTWFwcGVyUHJvcGVydHkpAdoLQWxpYXNlZEluc3ApAdoTU1FMQ29sdW1uRXhwcmVzc2lvbikB2hlfQ29sdW1uRXhwcmVzc2lvbkFyZ3VtZW50KQHaEl9ETUxDb2x1bW5Bcmd1bWVudCkB2hFfSGFzQ2xhdXNlRWxlbWVudCkB2glfSW5mb1R5cGUpAdoMT3BlcmF0b3JUeXBl2gJfUNoCX1LaAl9UKQHaBWJvdW5k2gNfVEXaBV9UX2NvVCkCciwAAADaCWNvdmFyaWFudNoGX1RfY29uKQJyLAAAANoNY29udHJhdmFyaWFudGMAAAAAAAAAAAAAAAABAAAAAAAAAfMWAAAAlwBlAFoBZABaAmQBWgMJAGQCWgR5AykE2hNIeWJyaWRFeHRlbnNpb25UeXBl2g1IWUJSSURfTUVUSE9E2g9IWUJSSURfUFJPUEVSVFlOKQXaCF9fbmFtZV9f2gpfX21vZHVsZV9f2gxfX3F1YWxuYW1lX19yNAAAAHI1AAAAqQDzAAAAAPpGL29wdC9oY19weXRob24vbGliNjQvcHl0aG9uMy4xMi9zaXRlLXBhY2thZ2VzL3NxbGFsY2hlbXkvZXh0L2h5YnJpZC5weXIzAAAAcjMAAACBAwAAcxgAAACEANgUI4BN8AIKBQjwGAAXKIBP8AIKBQhyOgAAAHIzAAAAYwAAAAAAAAAAAAAAAAIAAAAAAAAB8xQAAACXAGUAWgFkAFoCZANkAYQEWgN5AikE2hFfSHlicmlkR2V0dGVyVHlwZWMCAAAAAAAAAAAAAAAAAAAAAwAAAfMEAAAAlwB5AKkBTnI5AAAAqQLaAXPaBHNlbGZzAgAAACAgcjsAAADaCF9fY2FsbF9fehpfSHlicmlkR2V0dGVyVHlwZS5fX2NhbGxfX54DAABzBAAAAIAAqBNyOgAAAE4pBHJCAAAAcgQAAADaBnJldHVybnIuAAAAqQRyNgAAAHI3AAAAcjgAAAByQwAAAHI5AAAAcjoAAAByOwAAAHI9AAAAcj0A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J3MgcmV0dXJuZWQsIHdpdGhvdXQgYW55CiAgICAgICAgbW9kaWZpY2F0aW9ucyB0byB0aGUgb3JpZ2luYWwgU1FMIGV4cHJlc3Npb24gcGFzc2VkIGluLgoKICAgICAgICAuLiBub3RlOjoKCiAgICAgICAgICAgV2hlbiByZWZlcnJpbmcgdG8gYSBoeWJyaWQgcHJvcGVydHkgIGZyb20gYW4gb3duaW5nIGNsYXNzIChlLmcuCiAgICAgICAgICAgYGBTb21lQ2xhc3Muc29tZV9oeWJyaWRgYCksIGFuIGluc3RhbmNlIG9mCiAgICAgICAgICAgOmNsYXNzOmAuUXVlcnlhYmxlQXR0cmlidXRlYCBpcyByZXR1cm5lZCwgcmVwcmVzZW50aW5nIHRoZQogICAgICAgICAgIGV4cHJlc3Npb24gb3IgY29tcGFyYXRvciBvYmplY3QgYXMgd2VsbCBhcyB0aGlzICBoeWJyaWQgb2JqZWN0LgogICAgICAgICAgIEhvd2V2ZXIsIHRoYXQgb2JqZWN0IGl0c2VsZiBoYXMgYWNjZXNzb3JzIGNhbGxlZCBgYGV4cHJlc3Npb25gYCBhbmQKICAgICAgICAgICBgYGNvbXBhcmF0b3JgYDsgc28gd2hlbiBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIHRoZXNlIGRlY29yYXRvcnMgb24gYQogICAgICAgICAgIHN1YmNsYXNzLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHF1YWxpZnkgaXQgdXNpbmcgdGhlCiAgICAgICAgICAgOmF0dHI6YC5oeWJyaWRfcHJvcGVydHkub3ZlcnJpZGVzYCBtb2RpZmllciBmaXJzdC4gIFNlZSB0aGF0CiAgICAgICAgICAgbW9kaWZpZXIgZm9yIGRldGFpbHMuCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOnJlZjpgaHlicmlkX2Rpc3RpbmN0X2V4cHJlc3Npb25gCgogICAgICAgIHLHAAAActMAAAByiAAAAHMCAAAAICByOwAAAHJ7AAAAehpoeWJyaWRfcHJvcGVydHkuZXhwcmVzc2lvbg0FAABzFgAAAIAA8EABABAUj3qJeph0iHrTDyTQCCRyOgAAAGMCAAAAAAAAAAAAAAADAAAAAwAAAfMmAAAAlwB8AGoBAAAAAAAAAAAAAAAAAAAAAAAAfAGsAasBAAAAAAAAUwApAmEvBgAAUHJvdmlkZSBhIG1vZGlmeWluZyBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIGEgY3VzdG9tCiAgICAgICAgY29tcGFyYXRvciBwcm9kdWNpbmcgbWV0aG9kLgoKICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBkZWNvcmF0ZWQgbWV0aG9kIHNob3VsZCBiZSBhbiBpbnN0YW5jZSBvZgogICAgICAgIDpjbGFzczpgfi5oeWJyaWQuQ29tcGFyYXRvcmAuCgogICAgICAgIC4uIG5vdGU6OiAgVGhlIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmNvbXBhcmF0b3JgIGRlY29yYXRvcgogICAgICAgICAgICoqcmVwbGFjZXMqKiB0aGUgdXNlIG9mIHRoZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5leHByZXNzaW9uYAogICAgICAgICAgIGRlY29yYXRvci4gIFRoZXkgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuCgogICAgICAgIFdoZW4gYSBoeWJyaWQgaXMgaW52b2tlZCBhdCB0aGUgY2xhc3MgbGV2ZWwsIHRoZQogICAgICAgIDpjbGFzczpgfi5oeWJyaWQuQ29tcGFyYXRvcmAgb2JqZWN0IGdpdmVuIGhlcmUgaXMgd3JhcHBlZCBpbnNpZGUgb2YgYQogICAgICAgIHNwZWNpYWxpemVkIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAsIHdoaWNoIGlzIHRoZSBzYW1lIGtpbmQgb2YKICAgICAgICBvYmplY3QgdXNlZCBieSB0aGUgT1JNIHRvIHJlcHJlc2VudCBvdGhlciBtYXBwZWQgYXR0cmlidXRlcy4gICBUaGUKICAgICAgICByZWFzb24gZm9yIHRoaXMgaXMgc28gdGhhdCBvdGhlciBjbGFzcy1sZXZlbCBhdHRyaWJ1dGVzIHN1Y2ggYXMKICAgICAgICBkb2NzdHJpbmdzIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgaHlicmlkIGl0c2VsZiBtYXkgYmUgbWFpbnRhaW5lZAogICAgICAgIHdpdGhpbiB0aGUgc3RydWN0dXJlIHRoYXQncyByZXR1cm5lZCwgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUKICAgICAgICBvcmlnaW5hbCBjb21wYXJhdG9yIG9iamVjdCBwYXNzZWQgaW4uCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICBXaGVuIHJlZmVycmluZyB0byBhIGh5YnJpZCBwcm9wZXJ0eSAgZnJvbSBhbiBvd25pbmcgY2xhc3MgKGUuZy4KICAgICAgICAgICBgYFNvbWVDbGFzcy5zb21lX2h5YnJpZGBgKSwgYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICA6Y2xhc3M6YC5RdWVyeWFibGVBdHRyaWJ1dGVgIGlzIHJldHVybmVkLCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgZXhwcmVzc2lvbiBvciBjb21wYXJhdG9yIG9iamVjdCBhcyB0aGlzICBoeWJyaWQgb2JqZWN0LiAgSG93ZXZlciwKICAgICAgICAgICB0aGF0IG9iamVjdCBpdHNlbGYgaGFzIGFjY2Vzc29ycyBjYWxsZWQgYGBleHByZXNzaW9uYGAgYW5kCiAgICAgICAgICAgYGBjb21wYXJhdG9yYGA7IHNvIHdoZW4gYXR0ZW1wdGluZyB0byBvdmVycmlkZSB0aGVzZSBkZWNvcmF0b3JzIG9uIGEKICAgICAgICAgICBzdWJjbGFzcywgaXQgbWF5IGJlIG5lY2Vzc2FyeSB0byBxdWFsaWZ5IGl0IHVzaW5nIHRoZQogICAgICAgICAgIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5Lm92ZXJyaWRlc2AgbW9kaWZpZXIgZmlyc3QuICBTZWUgdGhhdAogICAgICAgICAgIG1vZGlmaWVyIGZvciBkZXRhaWxzLgoKICAgICAgICByyQAAAHLTAAAAcsoAAABzAgAAACAgcjsAAAByywAAAHoaaHlicmlkX3Byb3BlcnR5LmNvbXBhcmF0b3IvBQAAcxYAAACAAPBGAQAQFI96iXqoSoh60w830Ag3cjoAAABjAgAAAAAAAAAAAAAAAwAAAAMAAAHzJgAAAJcAfABqAQAAAAAAAAAAAAAAAAAAAAAAAHwBrAGrAQAAAAAAAFMAKQJhBwQAAFByb3ZpZGUgYSBtb2RpZnlpbmcgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBhbiBVUERBVEUgdHVwbGUKICAgICAgICBwcm9kdWNpbmcgbWV0aG9kLgoKICAgICAgICBUaGUgbWV0aG9kIGFjY2VwdHMgYSBzaW5nbGUgdmFsdWUsIHdoaWNoIGlzIHRoZSB2YWx1ZSB0byBiZQogICAgICAgIHJlbmRlcmVkIGludG8gdGhlIFNFVCBjbGF1c2Ugb2YgYW4gVVBEQVRFIHN0YXRlbWVudC4gIFRoZSBtZXRob2QKICAgICAgICBzaG91bGQgdGhlbiBwcm9jZXNzIHRoaXMgdmFsdWUgaW50byBpbmRpdmlkdWFsIGNvbHVtbiBleHByZXNzaW9ucwogICAgICAgIHRoYXQgZml0IGludG8gdGhlIHVsdGltYXRlIFNFVCBjbGF1c2UsIGFuZCByZXR1cm4gdGhlbSBhcyBhCiAgICAgICAgc2VxdWVuY2Ugb2YgMi10dXBsZXMuICBFYWNoIHR1cGxlCiAgICAgICAgY29udGFpbnMgYSBjb2x1bW4gZXhwcmVzc2lvbiBhcyB0aGUga2V5IGFuZCBhIHZhbHVlIHRvIGJlIHJlbmRlcmVkLgoKICAgICAgICBFLmcuOjoKCiAgICAgICAgICAgIGNsYXNzIFBlcnNvbihCYXNlKToKICAgICAgICAgICAgICAgICMgLi4uCgogICAgICAgICAgICAgICAgZmlyc3RfbmFtZSA9IENvbHVtbihTdHJpbmcpCiAgICAgICAgICAgICAgICBsYXN0X25hbWUgPSBDb2x1bW4oU3RyaW5nKQoKICAgICAgICAgICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICAgICAgICAgIGRlZiBmdWxsbmFtZShzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlyc3RfbmFtZSArICIgIiArIGxhc3RfbmFtZQoKICAgICAgICAgICAgICAgIEBmdWxsbmFtZS51cGRhdGVfZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgZGVmIGZ1bGxuYW1lKGNscywgdmFsdWUpOgogICAgICAgICAgICAgICAgICAgIGZuYW1lLCBsbmFtZSA9IHZhbHVlLnNwbGl0KCIgIiwgMSkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gWyhjbHMuZmlyc3RfbmFtZSwgZm5hbWUpLCAoY2xzLmxhc3RfbmFtZSwgbG5hbWUpXQoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjIKCiAgICAgICAgcs0AAABy0wAAAHJsAAAAcwIAAAAgIHI7AAAAcm4AAAB6IWh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvblQFAABzFgAAAIAA8EIBABAUj3qJeqBkiHrTDyvQCCtyOgAAAGMBAAAAAAAAAAAAAAAGAAAAAwAAAfP+AAAAlwB8AGoAAAAAAAAAAAAAAAAAAAAAAAAAgRt8AGoDAAAAAAAAAAAAAAAAAAAAAAAAfABqAAAAAAAAAAAAAAAAAAAAAAAAAKsBAAAAAAAAUwB8AGoEAAAAAAAAAAAAAAAAAAAAAAAAgRt8AGoHAAAAAAAAAAAAAAAAAAAAAAAAfABqBAAAAAAAAAAAAAAAAAAAAAAAAKsBAAAAAAAAUwB8AGoHAAAAAAAAAAAAAAAAAAAAAAAAdAkAAAAAAAAAAHQKAAAAAAAAAAB0DAAAAAAAAAAAGQAAAHwAag4AAAAAAAAAAAAAAAAAAAAAAACrAgAAAAAAAKsBAAAAAAAAUwByPwAAACkIcpkAAADaD19nZXRfY29tcGFyYXRvcnJ8AAAA2glfZ2V0X2V4cHJyBgAAAHJTAAAAcisAAAByXQAAAHJpAAAAcwEAAAAgcjsAAAByoQAAAHogaHlicmlkX3Byb3BlcnR5Ll9leHByX2NvbXBhcmF0b3J3BQAAc2QAAACAAPAIAAwQ1wsh0Qsh0Ast2BMX1xMn0RMnqATXKD7RKD7TEz/QDD/YDRGPWYlZ0A0i2BMXlz6RPqAkpymhKdMTLNAMLOATF5c+kT6kJNQnPrxy0SdCwETHScFJ0yJO0xNP0AxPcjoAAABjAgAAAAAAAAAAAAAABAAAAAMAAAHzYgAAAIcAhwGXAGQCiAGIAGYCZAGEDH0CdAEAAAAAAAAAAGoCAAAAAAAAAAAAAAAAAAAAAAAAfAKJAasCAAAAAAAAAQCJAGoFAAAAAAAAAAAAAAAAAAAAAAAAfAKrAQAAAAAAAFMAKQNOYwEAAAAAAAAAAAAAAAYAAAATAAAB8yoAAACVApcAdAEAAAAAAAAAAHwAAgCJAXwAqwEAAAAAAACJAqsDAAAAAAAAUwByPwAAACkB2g5FeHByQ29tcGFyYXRvcikDck4AAAByfAAAAHJCAAAAcwMAAAAggIByOwAAANoFX2V4cHJ6KGh5YnJpZF9wcm9wZXJ0eS5fZ2V0X2V4cHIuPGxvY2Fscz4uX2V4cHKFBQAAcxYAAAD4gADcEyGgI6F0qEOjebAk0xM30Aw3cjoAAAApBHJOAAAAcgQAAAByRAAAAHoSRXhwckNvbXBhcmF0b3JbX1RdKQNyEgAAAHKbAAAActsAAAApA3JCAAAAcnwAAABy4AAAAHMDAAAAYGAgcjsAAABy3AAAAHoZaHlicmlkX3Byb3BlcnR5Ll9nZXRfZXhwcoIFAABzKwAAAPmAAPYGAQk49AYACQ3XCBvRCBuYRaA01Ago4A8T1w8j0Q8joEXTDyrQCCpyOgAAAGMCAAAAAAAAAAAAAAAEAAAAAwAAAfNOAAAAhwCHAYcDlwB0AQAAAAAAAAAAagIAAAAAAAAAAAAAAAAAAAAAAACJAKsBAAAAAAAAigMJAAkACQAJAGQCiAGIA4gAZgNkAYQMfQJ8AlMAKQNOYwEAAAAAAAAAAAAAAAsAAAATAAAB8zQBAACVA5cAfABqAAAAAAAAAAAAAAAAAAAAAAAAAEQAXUQAAH0BiQVqAgAAAAAAAAAAAAAAAAAAAAAAAHwBagQAAAAAAAAAAAAAAAAAAAAAAAB2AHMBjBx8AWoEAAAAAAAAAAAAAAAAAAAAAAAAiQVqAgAAAAAAAAAAAAAAAAAAAAAAABkAAACJBXUAcwGMOIkFagIAAAAAAAAAAAAAAAAAAAAAAAB9AgEAbhEEAHQGAAAAAAAAAABqCAAAAAAAAAAAAAAAAAAAAAAAAH0CdAsAAAAAAAAAAGQBAgCJBHwAfAKJBQIAiQN8AKsBAAAAAAAAiQNqDAAAAAAAAAAAAAAAAAAAAAAAAHgBcwwBAIkFagwAAAAAAAAAAAAAAAAAAAAAAACsAqsFAAAAAAAAqwIAAAAAAABTACkDTvodX0h5YnJpZENsYXNzTGV2ZWxBY2Nlc3NvcltfVF0pAdoDZG9jKQfaB19fbXJvX19yNgAAAHKpAAAAchMAAADaEV9VTktOT1dOX0FUVFJfS0VZcgYAAABydQAAACkGcoMAAADaBmxvb2t1cNoEbmFtZXLLAAAA2gpwcm94eV9hdHRyckIAAABzBgAAACAgIICAgHI7AAAA2g9leHByX2NvbXBhcmF0b3J6OGh5YnJpZF9wcm9wZXJ0eS5fZ2V0X2NvbXBhcmF0b3IuPGxvY2Fscz4uZXhwcl9jb21wYXJhdG9ykQUAAHOMAAAA+IAA8AwAGyCfLZwtkAbYExeXPZE9oEanT6FP0hMz2Bcdl3+Rf6B0p32hfdEXNbgU0hc92B8jn32ZfZgE2Rgd8AkAGyj0DAAYItcXM9EXM5AE5BMX2BAv2RAa2BQZ2BQY2BQY2RQemHXTFCXYGCLXGCrRGCrSGDqoZK9sqWz0CwYREvMFCRQO8AAJDQ5yOgAAACkEcoMAAAByiwAAAHJEAAAAcuMAAAApAnITAAAA2hhjcmVhdGVfcHJveGllZF9hdHRyaWJ1dGUpBHJCAAAAcssAAABy6gAAAHLpAAAAcwQAAABgYCBAcjsAAABy2wAAAHofaHlicmlkX3Byb3BlcnR5Ll9nZXRfY29tcGFyYXRvcowFAABzMgAAAPqAAPQGABYg1xU40RU4uBTTFT6ICvAEFwkO2BMf8AMXCQ7gDSr3BRcJDvAyABAf0AgecjoAAAApBU5OTk5OKQxyXQAAAHJwAAAAcmIAAAB6H09wdGlvbmFsW19IeWJyaWRTZXR0ZXJUeXBlW19UXV1yZgAAAHogT3B0aW9uYWxbX0h5YnJpZERlbGV0ZXJUeXBlW19UXV1yfAAAAHolT3B0aW9uYWxbX0h5YnJpZEV4cHJDYWxsYWJsZVR5cGVbX1RdXXKZAAAAehhPcHRpb25hbFtDb21wYXJhdG9yW19UXV1ymgAAAHogT3B0aW9uYWxbX0h5YnJpZFVwZGF0ZXJUeXBlW19UXV0pBnKCAAAAcgQAAABygwAAAHKKAAAAckQAAAByIAAAACkGcoIAAAByigAAAHKDAAAAcosAAAByRAAAAHLjAAAAKQZyggAAAHKMAAAAcoMAAAByiwAAAHJEAAAAcisAAAApBnKCAAAAco0AAABygwAAAHoWT3B0aW9uYWxbVHlwZVtvYmplY3RdXXJEAAAAej1VbmlvbltoeWJyaWRfcHJvcGVydHlbX1RdLCBfSHlicmlkQ2xhc3NMZXZlbEFjY2Vzc29yW19UXSwgX1RdKQZyggAAAHKMAAAAckkAAAByBAAAAHJEAAAAckoAAAApBHKCAAAAcowAAAByRAAAAHJKAAAAKQRyrgAAAHIEAAAAckQAAABycQAAAHKJAAAAKQJyRAAAAHoMX0luUGxhY2VbX1Rdcm8AAABycgAAAHJzAAAAKQRyfAAAAPobX0h5YnJpZEV4cHJDYWxsYWJsZVR5cGVbX1RdckQAAABycQAAACkEcssAAAB6IV9IeWJyaWRDb21wYXJhdG9yQ2FsbGFibGVUeXBlW19UXXJEAAAAcnEAAABydAAAACkCckQAAAD6LkNhbGxhYmxlW1tBbnldLCBfSHlicmlkQ2xhc3NMZXZlbEFjY2Vzc29yW19UXV0pBHJ8AAAAcuwAAAByRAAAAHLtAAAAKQRyywAAAHIEAAAAckQAAABy7QAAACkgcjYAAAByNwAAAHI4AAAAcnUAAAByjgAAAHIzAAAAcjUAAAByjwAAANoPX19hbm5vdGF0aW9uc19fcn0AAAByCgAAAHKEAAAAcqQAAABypgAAAHKxAAAAcnYAAAByagAAAHIHAAAAci0AAABy0AAAAHJ/AAAAcl4AAAByYwAAAHJnAAAAcnsAAAByywAAAHJuAAAAchIAAADaEW1lbW9pemVkX3Byb3BlcnR5cqEAAABy3AAAAHLbAAAAcjkAAAByOgAAAHI7AAAAcpYAAABylgAAADUEAABzvwEAAIUA8QIDBQjwCgAUGIBM2BUo1xU40RU4gE7gDhGDTfAKADE12DE12DY62DY62Dg88A8gBSjgDiPwBSAFKPAGAA8u8AcgBSjwCAAPL/AJIAUo8AoADzTwCyAFKPAMABw08A0gBSjwDgAWNvMPIAUo8EQBAAYO2gRH8wMABg7YBEfgBQ3wAgIFLNgYJfADAgUs2C468AMCBSzgCSbyBQIFLPMDAAYO8AICBSzwCAAGDtoER/MDAAYO2ARH8AQIBSfYGCjwAwgFJ9gxR/ADCAUn4AlG8wUIBSfzFAMFI/MKAwUc8woHBSbwEgAGDvICIgUU8wMABg7wAiIFFPRIASkFL5A3mDORPPQAKQUv8FYBAAYO8gIdBS7zAwAGDvACHQUu8z4HBSXzEgMFJfMKAwUl8AogBSXYFC/wAyAFJeAJHPMFIAUl8EQBIwU42Bo78AMjBTjgCRzzBSMFOPBKASEFLNgUKvADIQUs4Akc8wUhBSzwRgEABgrXBRvRBRvwAggFUAHgCTfyBQgFUAHzAwAGHPACCAVQAfAUCAUr2BQv8AMIBSvgCTfzBQgFK/AUHgUf2Bod8AMeBR/gCTf0BR4FH3I6AAAAcpYAAABjAAAAAAAAAAAAAAAAAwAAAAAAAAHzWgAAAJcAZQBaAWQAWgJkAVoDCQAJAGQHZAKEBFoEZAhkA4QEWgVlBmoOAAAAAAAAAAAAAAAAAAAAAAAAZAlkBIQEqwAAAAAAAABaCAkACQAJAAkAZApkBYQEWgl5BikL2gpDb21wYXJhdG9yeodBIGhlbHBlciBjbGFzcyB0aGF0IGFsbG93cyBlYXN5IGNvbnN0cnVjdGlvbiBvZiBjdXN0b20KICAgIDpjbGFzczpgfi5vcm0uaW50ZXJmYWNlcy5Qcm9wQ29tcGFyYXRvcmAKICAgIGNsYXNzZXMgZm9yIHVzYWdlIHdpdGggaHlicmlkcy5jAgAAAAAAAAAAAAAAAgAAAAMAAAHzEgAAAJcAfAF8AF8AAAAAAAAAAAB5AHI/AAAAqQFyewAAACkCckIAAAByewAAAHMCAAAAICByOwAAAHJ9AAAAehNDb21wYXJhdG9yLl9faW5pdF9fsgUAAHMLAAAAgADwBgAbJYgEjQ9yOgAAAGMBAAAAAAAAAAAAAAAEAAAAAwAAAfO6AAAAlwB8AGoAAAAAAAAAAAAAAAAAAAAAAAAAfQF0AwAAAAAAAAAAfAGrAQAAAAAAAHIRfAFqBQAAAAAAAAAAAAAAAAAAAAAAAKsAAAAAAAAAfQJuGnQGAAAAAAAAAAByEnQJAAAAAAAAAAB8AXQKAAAAAAAAAACrAgAAAAAAAHMCSgCCAXwBfQJ0BgAAAAAAAAAAchJ0CQAAAAAAAAAAfAJ0CgAAAAAAAAAAqwIAAAAAAABzAkoAggF8AlMAcj8AAAApBnJ7AAAAchkAAADaEl9fY2xhdXNlX2VsZW1lbnRfX3IOAAAAcpEAAAByGgAAACkDckIAAAByfAAAANoIcmV0X2V4cHJzAwAAACAgIHI7AAAAcvUAAAB6HUNvbXBhcmF0b3IuX19jbGF1c2VfZWxlbWVudF9ftwUAAHNTAAAAgADYDxOPf4l/iATcCyCgFNQLJtgXG9cXLtEXLtMXMIlI5Q8c3BchoCSsDdQXNtAQNtAXNtgXG4hI5QsY9AgAFB6YaKwN1BM20Aw20BM22A8XiA9yOgAAAGMBAAAAAAAAAAAAAAACAAAAAwAAAfMWAAAAlwB0AQAAAAAAAAAAqwAAAAAAAACCAXI/AAAAKQHaE05vdEltcGxlbWVudGVkRXJyb3JyaQAAAHMBAAAAIHI7AAAAcnYAAAB6E0NvbXBhcmF0b3IucHJvcGVydHnHBQAAcwsAAACAAOQOIdMOI9AII3I6AAAAYwIAAAAAAAAAAAAAAAEAAAADAAAB8wYAAACXAHwAUwByPwAAAHI5AAAAKQJyQgAAANoPYWRhcHRfdG9fZW50aXR5cwIAAAAgIHI7AAAAcvoAAAB6GkNvbXBhcmF0b3IuYWRhcHRfdG9fZW50aXR5ywUAAHMJAAAAgADwCAAQFIgLcjoAAABOKQJyewAAAPo1VW5pb25bX0hhc0NsYXVzZUVsZW1lbnRbX1RdLCBTUUxDb2x1bW5FeHByZXNzaW9uW19UXV0pAnJEAAAAehdyb2xlcy5Db2x1bW5zQ2xhdXNlUm9sZSkCckQAAAB6HWludGVyZmFjZXMuTWFwcGVyUHJvcGVydHlbX1RdKQRy+gAAAHoQQWxpYXNlZEluc3BbQW55XXJEAAAAclgAAAApCnI2AAAAcjcAAAByOAAAAHJ1AAAAcn0AAABy9QAAAHISAAAA2hVub25fbWVtb2l6ZWRfcHJvcGVydHlydgAAAHL6AAAAcjkAAAByOgAAAHI7AAAAcvEAAABy8QAAAK0FAABzSAAAAIQA8QICBSfwCAMFJdgaT/MDAwUl8woOBRjwIAAGCtcFH9EFH/ICAQUk8wMABiDwAgEFJPAGBAUU2B8v8AMEBRTgCRf0BQQFFHI6AAAAcvEAAABjAAAAAAAAAAAAAAAAAwAAAAAAAAHztAAAAJcAZQBaAWQAWgIJAAkACQAJAAkACQBkCWQBhARaA2QKZAKEBFoEZQVqDAAAAAAAAAAAAAAAAAAAAAAAAGQLZAOEBKsAAAAAAAAAWgcJAAkACQAJAGQMZASEBFoIZQVqEgAAAAAAAAAAAAAAAAAAAAAAAGQNZAWEBKsAAAAAAAAAWgoJAAkACQAJAAkACQAJAAkAZA5kBoQEWgsJAAkACQAJAAkACQAJAAkAZA5kB4QEWgx5CCkPct8AAABjBAAAAAAAAAAAAAAAAgAAAAMAAAHzLgAAAJcAfAF8AF8AAAAAAAAAAAB8AnwAXwEAAAAAAAAAAHwDfABfAgAAAAAAAAAAeQByPwAAACkDck4AAAByewAAANoGaHlicmlkKQRyQgAAAHJOAAAAcnsAAABy/wAAAHMEAAAAICAgIHI7AAAAcn0AAAB6F0V4cHJDb21wYXJhdG9yLl9faW5pdF9f0wUAAHMZAAAAgADwDAAUF4gEjAjYGiSIBIwP2BYciASNC3I6AAAAYwIAAAAAAAAAAAAAAAQAAAADAAAB8y4AAACXAHQBAAAAAAAAAAB8AGoCAAAAAAAAAAAAAAAAAAAAAAAAfAGrAgAAAAAAAFMAcj8AAAApAtoHZ2V0YXR0cnJ7AAAAKQJyQgAAAHKvAAAAcwIAAAAgIHI7AAAA2gtfX2dldGF0dHJfX3oaRXhwckNvbXBhcmF0b3IuX19nZXRhdHRyX1/dBQAAcxMAAACAANwPFpB0l3+Rf6gD0w8s0AgscjoAAABjAQAAAAAAAAAAAAAAAQAAAAMAAAHzLgAAAJcAfABqAAAAAAAAAAAAAAAAAAAAAAAAAGoCAAAAAAAAAAAAAAAAAAAAAAAAUwByPwAAACkCcv8AAADaBGluZm9yaQAAAHMBAAAAIHI7AAAAcgQBAAB6E0V4cHJDb21wYXJhdG9yLmluZm/gBQAAcxIAAACAAOAPE497iXvXDx/RDx/QCB9yOgAAAGMCAAAAAAAAAAAAAAAEAAAAAwAAAfMWAQAAlwB0AQAAAAAAAAAAfABqAgAAAAAAAAAAAAAAAAAAAAAAAHQEAAAAAAAAAABqBgAAAAAAAAAAAAAAAAAAAAAAAKsCAAAAAAAAcht8AGoCAAAAAAAAAAAAAAAAAAAAAAAAagkAAAAAAAAAAAAAAAAAAAAAAAB8AasBAAAAAAAAUwB8AGoKAAAAAAAAAAAAAAAAAAAAAAAAagwAAAAAAAAAAAAAAAAAAAAAAACBJnwAagoAAAAAAAAAAAAAAAAAAAAAAABqDQAAAAAAAAAAAAAAAAAAAAAAAHwAag4AAAAAAAAAAAAAAAAAAAAAAAB8AasCAAAAAAAAUwB8AGoCAAAAAAAAAAAAAAAAAAAAAAAAfAFmAmcBUwByPwAAACkIcpEAAAByewAAAHITAAAAchcAAADaE19idWxrX3VwZGF0ZV90dXBsZXNy/wAAAHKaAAAAck4AAAApAnJCAAAAckkAAABzAgAAACAgcjsAAAByBgEAAHoiRXhwckNvbXBhcmF0b3IuX2J1bGtfdXBkYXRlX3R1cGxlc+QFAABzagAAAIAA9AYADBaQZJdvkW+ketcnRNEnRNQLRdgTF5c/kT/XEzbREzawddMTPdAMPdgNEY9biVvXDSTRDSTQDTDYExeXO5E71xMq0RMqqDSvOKk4sFXTEzvQDDvgFRmXX5FfoGXQFCzQEy3QDC1yOgAAAGMBAAAAAAAAAAAAAAABAAAAAwAAAfMuAAAAlwB8AGoAAAAAAAAAAAAAAAAAAAAAAAAAagIAAAAAAAAAAAAAAAAAAAAAAABTAHI/AAAAKQJyewAAAHJ2AAAAcmkAAABzAQAAACByOwAAAHJ2AAAAehdFeHByQ29tcGFyYXRvci5wcm9wZXJ0ee4FAABzFAAAAIAA8AoAEBSPf4l/1w8n0Q8n0AgncjoAAABjAgAAAAAAAAAAAAAABQAAAA8AAAHzLgAAAJcAAgB8AXwAagAAAAAAAAAAAAAAAAAAAAAAAABnAXwCogGtBmkAfAOkAY4BUwByPwAAAHLzAAAAqQRyQgAAANoCb3DaBW90aGVy2gZrd2FyZ3NzBAAAACAgICByOwAAANoHb3BlcmF0ZXoWRXhwckNvbXBhcmF0b3Iub3BlcmF0ZfUFAABzHQAAAIAA8QYAEBKQJJcvkS/QDzSgRdIPNKhW0Q800Ag0cjoAAABjAwAAAAAAAAAAAAAABQAAAAsAAAHzKgAAAJcAAgB8AXwCfABqAAAAAAAAAAAAAAAAAAAAAAAAAGYCaQB8A6QBjgFTAHI/AAAAcvMAAAByCQEAAHMEAAAAICAgIHI7AAAA2g9yZXZlcnNlX29wZXJhdGV6HkV4cHJDb21wYXJhdG9yLnJldmVyc2Vfb3BlcmF0ZfoFAABzGgAAAIAA8QYAEBKQJZgUnx+ZH9EPM6hG0Q8z0AgzcjoAAABOKQZyTgAAAHoJVHlwZVtBbnldcnsAAABy+wAAAHL/AAAAcnEAAAApBHKvAAAAcpcAAAByRAAAAHIEAAAAKQJyRAAAAHInAAAAKQRySQAAAHIEAAAAckQAAAB6KFNlcXVlbmNlW1R1cGxlW19ETUxDb2x1bW5Bcmd1bWVudCwgQW55XV0pAnJEAAAAehJNYXBwZXJQcm9wZXJ0eVtfVF0pCHIKAQAAcigAAAByCwEAAHIEAAAAcgwBAAByBAAAAHJEAAAAehJDb2x1bW5FbGVtZW50W0FueV0pDXI2AAAAcjcAAAByOAAAAHJ9AAAAcgIBAAByEgAAANoYcm9fbm9uX21lbW9pemVkX3Byb3BlcnR5cgQBAAByBgEAAHL8AAAAcnYAAAByDQEAAHIPAQAAcjkAAAByOgAAAHI7AAAAct8AAABy3wAAANIFAABzvAAAAIQA8AIIBR3gDRbwBQgFHfAGABVKAfAHCAUd8AgAESTzCQgFHfMUAQUt8AYABgrXBSLRBSLyAgEFIPMDAAYj8AIBBSDwBggFLtgVGPADCAUu4Akx8wUIBS7wFAAGCtcFH9EFH/ICBAUo8wMABiDwAgQFKPAMAwU12BIe8AMDBTXYKCvwAwMFNdg3OvADAwU14Akb8wUDBTXwCgMFNNgSHvADAwU02Ccq8AMDBTTYNjnwAwMFNOAJG/QFAwU0cjoAAABy3wAAAE4pBHJtAAAAcisAAAByRAAAAHIrAAAAKUdydQAAANoKX19mdXR1cmVfX3IDAAAA2gZ0eXBpbmdyBAAAAHIFAAAAcgYAAAByBwAAAHIIAAAAcgkAAAByCgAAAHILAAAAcgwAAAByDQAAAHIOAAAAcg8AAAByEAAAANoAchIAAADaA29ybXITAAAAchQAAAByFQAAAHIWAAAA2g5vcm0uYXR0cmlidXRlc3IXAAAA2gNzcWxyGAAAANoLc3FsLl90eXBpbmdyGQAAANoMc3FsLmVsZW1lbnRzchoAAAByGwAAANoLdXRpbC50eXBpbmdyHAAAAHIdAAAAch4AAAByHwAAAHIgAAAA2g5vcm0uaW50ZXJmYWNlc3IhAAAA2ghvcm0udXRpbHIiAAAAciMAAAByJAAAAHIlAAAAciYAAAByJwAAANoNc3FsLm9wZXJhdG9yc3IoAAAAcikAAAByKgAAAHIrAAAAci0AAAByLgAAAHIwAAAAcjMAAAByPQAAAHJHAAAAckwAAAByUAAAAHJTAAAAclYAAAByWgAAANoSSW5zcGVjdGlvbkF0dHJJbmZvcngAAABylAAAAHKWAAAA2g5Qcm9wQ29tcGFyYXRvcnLxAAAAct8AAAByOQAAAHI6AAAAcjsAAADaCDxtb2R1bGU+ch8BAAABAAAAc7EBAADwAwEBAfEQRQ0BBPVOGgABI+UAFt0AG90AF90AGt0AF90AG90AG90AG90AGN0AF90AIN0AGt0AGOUAE90AHN0ALd0AHN0AH90AL90AF90AL90AKN0ALN0AJd0AId0AI90AIt0AHuEDEN0EL90EJt0EKd0EN90EMN0EL90EJ90ELOEFDoh0g1+AAtkFDIhUg12AAtkFDIhUmBPUBR2AAtkGDYhlmDPUBh+AA9kID5AHmHOoZNQIM4AF2QkQkBigE7BE1Ak5gAb0BhkBCNAaNfQAGQEI9DgBAS2YCKAVmQ/0AAEBLfQIAQE7mAigFtEYKPQAAQE79AgFATOYGKAm0Rkp9AAFATP0EAEBLJgYoCWZH/QAAQEs9AgDAUoBmGigdZlv9AADAUoB9AwBATigSKhSoUz0AAEBOPQIGQEm0CAysDLRIDb0ABkBJvQ4VAEBFJBK1xQx0RQxsDe4MrhyuDaxP/QAVAEBFPNuAgQBFPQOdQUBH5Bq1xYz0RYzsF3AMtE1RvQAdQUBH/RwCyIBFJAa1xEq0REqqDLRES70ACIBFPRKASsBNJBaoAKRXvUAKwE0cjoAAAA=
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 12
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
associationproxy.cpython-312.pyc
84.81 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
automap.cpython-312.pyc
56.04 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
baked.cpython-312.pyc
22.82 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
compiler.cpython-312.pyc
20.72 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
horizontal_shard.cpython-312.pyc
17.21 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hybrid.cpython-312.pyc
58.41 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
indexable.cpython-312.pyc
11.89 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
instrumentation.cpython-312.pyc
19.38 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mutable.cpython-312.pyc
45.22 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
orderinglist.cpython-312.pyc
16.89 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
serializer.cpython-312.pyc
7.84 KB
lrw-r--r--
2025-04-04 08:02:02
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-312.pyc
332 B
lrw-r--r--
2025-04-04 08:02:02
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).