REDROOM
PHP 8.2.30
Path:
Logout
Edit File
Size: 43.92 KB
Close
/opt/cloudlinux/venv/lib/python3.11/site-packages/sqlalchemy/ext/__pycache__/hybrid.cpython-311.pyc
Text
Base64
pw0NCgAAAACjfG9pz50AAOMAAAAAAAAAAAAAAAAFAAAAAAAAAPMAAQAAlwBkAFoAZAFkAmwBbQJaAgEAZAFkA2wDbQRaBAEAZAFkBGwDbQVaBQEAAgBlAmoGAAAAAAAAAABkBaYBAACrAQAAAAAAAAAAWgcJAAIAZQJqBgAAAAAAAAAAZAamAQAAqwEAAAAAAAAAAFoICQACAEcAZAeEAGQIZQVqCQAAAAAAAAAApgMAAKsDAAAAAAAAAABaCgIARwBkCYQAZAplBWoJAAAAAAAAAACmAwAAqwMAAAAAAAAAAFoLAgBHAGQLhABkDGUFagwAAAAAAAAAAKYDAACrAwAAAAAAAAAAWg0CAEcAZA2EAGQOZQ2mAwAAqwMAAAAAAAAAAFoOZA9TACkQYeRtAABEZWZpbmUgYXR0cmlidXRlcyBvbiBPUk0tbWFwcGVkIGNsYXNzZXMgdGhhdCBoYXZlICJoeWJyaWQiIGJlaGF2aW9yLgoKImh5YnJpZCIgbWVhbnMgdGhlIGF0dHJpYnV0ZSBoYXMgZGlzdGluY3QgYmVoYXZpb3JzIGRlZmluZWQgYXQgdGhlCmNsYXNzIGxldmVsIGFuZCBhdCB0aGUgaW5zdGFuY2UgbGV2ZWwuCgpUaGUgOm1vZDpgfnNxbGFsY2hlbXkuZXh0Lmh5YnJpZGAgZXh0ZW5zaW9uIHByb3ZpZGVzIGEgc3BlY2lhbCBmb3JtIG9mCm1ldGhvZCBkZWNvcmF0b3IsIGlzIGFyb3VuZCA1MCBsaW5lcyBvZiBjb2RlIGFuZCBoYXMgYWxtb3N0IG5vCmRlcGVuZGVuY2llcyBvbiB0aGUgcmVzdCBvZiBTUUxBbGNoZW15LiAgSXQgY2FuLCBpbiB0aGVvcnksIHdvcmsgd2l0aAphbnkgZGVzY3JpcHRvci1iYXNlZCBleHByZXNzaW9uIHN5c3RlbS4KCkNvbnNpZGVyIGEgbWFwcGluZyBgYEludGVydmFsYGAsIHJlcHJlc2VudGluZyBpbnRlZ2VyIGBgc3RhcnRgYCBhbmQgYGBlbmRgYAp2YWx1ZXMuIFdlIGNhbiBkZWZpbmUgaGlnaGVyIGxldmVsIGZ1bmN0aW9ucyBvbiBtYXBwZWQgY2xhc3NlcyB0aGF0IHByb2R1Y2UgU1FMCmV4cHJlc3Npb25zIGF0IHRoZSBjbGFzcyBsZXZlbCwgYW5kIFB5dGhvbiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXQgdGhlCmluc3RhbmNlIGxldmVsLiAgQmVsb3csIGVhY2ggZnVuY3Rpb24gZGVjb3JhdGVkIHdpdGggOmNsYXNzOmAuaHlicmlkX21ldGhvZGAgb3IKOmNsYXNzOmAuaHlicmlkX3Byb3BlcnR5YCBtYXkgcmVjZWl2ZSBgYHNlbGZgYCBhcyBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MsIG9yCmFzIHRoZSBjbGFzcyBpdHNlbGY6OgoKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgQ29sdW1uLCBJbnRlZ2VyCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmRlY2xhcmF0aXZlIGltcG9ydCBkZWNsYXJhdGl2ZV9iYXNlCiAgICBmcm9tIHNxbGFsY2hlbXkub3JtIGltcG9ydCBTZXNzaW9uLCBhbGlhc2VkCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0Lmh5YnJpZCBpbXBvcnQgaHlicmlkX3Byb3BlcnR5LCBoeWJyaWRfbWV0aG9kCgogICAgQmFzZSA9IGRlY2xhcmF0aXZlX2Jhc2UoKQoKICAgIGNsYXNzIEludGVydmFsKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnaW50ZXJ2YWwnCgogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgc3RhcnQgPSBDb2x1bW4oSW50ZWdlciwgbnVsbGFibGU9RmFsc2UpCiAgICAgICAgZW5kID0gQ29sdW1uKEludGVnZXIsIG51bGxhYmxlPUZhbHNlKQoKICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhcnQsIGVuZCk6CiAgICAgICAgICAgIHNlbGYuc3RhcnQgPSBzdGFydAogICAgICAgICAgICBzZWxmLmVuZCA9IGVuZAoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIGxlbmd0aChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5kIC0gc2VsZi5zdGFydAoKICAgICAgICBAaHlicmlkX21ldGhvZAogICAgICAgIGRlZiBjb250YWlucyhzZWxmLCBwb2ludCk6CiAgICAgICAgICAgIHJldHVybiAoc2VsZi5zdGFydCA8PSBwb2ludCkgJiAocG9pbnQgPD0gc2VsZi5lbmQpCgogICAgICAgIEBoeWJyaWRfbWV0aG9kCiAgICAgICAgZGVmIGludGVyc2VjdHMoc2VsZiwgb3RoZXIpOgogICAgICAgICAgICByZXR1cm4gc2VsZi5jb250YWlucyhvdGhlci5zdGFydCkgfCBzZWxmLmNvbnRhaW5zKG90aGVyLmVuZCkKCkFib3ZlLCB0aGUgYGBsZW5ndGhgYCBwcm9wZXJ0eSByZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlCmBgZW5kYGAgYW5kIGBgc3RhcnRgYCBhdHRyaWJ1dGVzLiAgV2l0aCBhbiBpbnN0YW5jZSBvZiBgYEludGVydmFsYGAsCnRoaXMgc3VidHJhY3Rpb24gb2NjdXJzIGluIFB5dGhvbiwgdXNpbmcgbm9ybWFsIFB5dGhvbiBkZXNjcmlwdG9yCm1lY2hhbmljczo6CgogICAgPj4+IGkxID0gSW50ZXJ2YWwoNSwgMTApCiAgICA+Pj4gaTEubGVuZ3RoCiAgICA1CgpXaGVuIGRlYWxpbmcgd2l0aCB0aGUgYGBJbnRlcnZhbGBgIGNsYXNzIGl0c2VsZiwgdGhlIDpjbGFzczpgLmh5YnJpZF9wcm9wZXJ0eWAKZGVzY3JpcHRvciBldmFsdWF0ZXMgdGhlIGZ1bmN0aW9uIGJvZHkgZ2l2ZW4gdGhlIGBgSW50ZXJ2YWxgYCBjbGFzcyBhcwp0aGUgYXJndW1lbnQsIHdoaWNoIHdoZW4gZXZhbHVhdGVkIHdpdGggU1FMQWxjaGVteSBleHByZXNzaW9uIG1lY2hhbmljcwooaGVyZSB1c2luZyB0aGUgOmF0dHI6YC5RdWVyeWFibGVBdHRyaWJ1dGUuZXhwcmVzc2lvbmAgYWNjZXNzb3IpCnJldHVybnMgYSBuZXcgU1FMIGV4cHJlc3Npb246OgoKICAgID4+PiBwcmludChJbnRlcnZhbC5sZW5ndGguZXhwcmVzc2lvbikKICAgIGludGVydmFsLiJlbmQiIC0gaW50ZXJ2YWwuc3RhcnQKCiAgICA+Pj4gcHJpbnQoU2Vzc2lvbigpLnF1ZXJ5KEludGVydmFsKS5maWx0ZXIoSW50ZXJ2YWwubGVuZ3RoID4gMTApKQogICAgU0VMRUNUIGludGVydmFsLmlkIEFTIGludGVydmFsX2lkLCBpbnRlcnZhbC5zdGFydCBBUyBpbnRlcnZhbF9zdGFydCwKICAgIGludGVydmFsLiJlbmQiIEFTIGludGVydmFsX2VuZAogICAgRlJPTSBpbnRlcnZhbAogICAgV0hFUkUgaW50ZXJ2YWwuImVuZCIgLSBpbnRlcnZhbC5zdGFydCA+IDpwYXJhbV8xCgpPUk0gbWV0aG9kcyBzdWNoIGFzIDptZXRoOmBfcXVlcnkuUXVlcnkuZmlsdGVyX2J5YApnZW5lcmFsbHkgdXNlIGBgZ2V0YXR0cigpYGAgdG8KbG9jYXRlIGF0dHJpYnV0ZXMsIHNvIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBoeWJyaWQgYXR0cmlidXRlczo6CgogICAgPj4+IHByaW50KFNlc3Npb24oKS5xdWVyeShJbnRlcnZhbCkuZmlsdGVyX2J5KGxlbmd0aD01KSkKICAgIFNFTEVDVCBpbnRlcnZhbC5pZCBBUyBpbnRlcnZhbF9pZCwgaW50ZXJ2YWwuc3RhcnQgQVMgaW50ZXJ2YWxfc3RhcnQsCiAgICBpbnRlcnZhbC4iZW5kIiBBUyBpbnRlcnZhbF9lbmQKICAgIEZST00gaW50ZXJ2YWwKICAgIFdIRVJFIGludGVydmFsLiJlbmQiIC0gaW50ZXJ2YWwuc3RhcnQgPSA6cGFyYW1fMQoKVGhlIGBgSW50ZXJ2YWxgYCBjbGFzcyBleGFtcGxlIGFsc28gaWxsdXN0cmF0ZXMgdHdvIG1ldGhvZHMsCmBgY29udGFpbnMoKWBgIGFuZCBgYGludGVyc2VjdHMoKWBgLCBkZWNvcmF0ZWQgd2l0aAo6Y2xhc3M6YC5oeWJyaWRfbWV0aG9kYC4gVGhpcyBkZWNvcmF0b3IgYXBwbGllcyB0aGUgc2FtZSBpZGVhIHRvCm1ldGhvZHMgdGhhdCA6Y2xhc3M6YC5oeWJyaWRfcHJvcGVydHlgIGFwcGxpZXMgdG8gYXR0cmlidXRlcy4gICBUaGUKbWV0aG9kcyByZXR1cm4gYm9vbGVhbiB2YWx1ZXMsIGFuZCB0YWtlIGFkdmFudGFnZSBvZiB0aGUgUHl0aG9uIGBgfGBgCmFuZCBgYCZgYCBiaXR3aXNlIG9wZXJhdG9ycyB0byBwcm9kdWNlIGVxdWl2YWxlbnQgaW5zdGFuY2UtbGV2ZWwgYW5kClNRTCBleHByZXNzaW9uLWxldmVsIGJvb2xlYW4gYmVoYXZpb3I6OgoKICAgID4+PiBpMS5jb250YWlucyg2KQogICAgVHJ1ZQogICAgPj4+IGkxLmNvbnRhaW5zKDE1KQogICAgRmFsc2UKICAgID4+PiBpMS5pbnRlcnNlY3RzKEludGVydmFsKDcsIDE4KSkKICAgIFRydWUKICAgID4+PiBpMS5pbnRlcnNlY3RzKEludGVydmFsKDI1LCAyOSkpCiAgICBGYWxzZQoKICAgID4+PiBwcmludChTZXNzaW9uKCkucXVlcnkoSW50ZXJ2YWwpLmZpbHRlcihJbnRlcnZhbC5jb250YWlucygxNSkpKQogICAgU0VMRUNUIGludGVydmFsLmlkIEFTIGludGVydmFsX2lkLCBpbnRlcnZhbC5zdGFydCBBUyBpbnRlcnZhbF9zdGFydCwKICAgIGludGVydmFsLiJlbmQiIEFTIGludGVydmFsX2VuZAogICAgRlJPTSBpbnRlcnZhbAogICAgV0hFUkUgaW50ZXJ2YWwuc3RhcnQgPD0gOnN0YXJ0XzEgQU5EIGludGVydmFsLiJlbmQiID4gOmVuZF8xCgogICAgPj4+IGlhID0gYWxpYXNlZChJbnRlcnZhbCkKICAgID4+PiBwcmludChTZXNzaW9uKCkucXVlcnkoSW50ZXJ2YWwsIGlhKS5maWx0ZXIoSW50ZXJ2YWwuaW50ZXJzZWN0cyhpYSkpKQogICAgU0VMRUNUIGludGVydmFsLmlkIEFTIGludGVydmFsX2lkLCBpbnRlcnZhbC5zdGFydCBBUyBpbnRlcnZhbF9zdGFydCwKICAgIGludGVydmFsLiJlbmQiIEFTIGludGVydmFsX2VuZCwgaW50ZXJ2YWxfMS5pZCBBUyBpbnRlcnZhbF8xX2lkLAogICAgaW50ZXJ2YWxfMS5zdGFydCBBUyBpbnRlcnZhbF8xX3N0YXJ0LCBpbnRlcnZhbF8xLiJlbmQiIEFTIGludGVydmFsXzFfZW5kCiAgICBGUk9NIGludGVydmFsLCBpbnRlcnZhbCBBUyBpbnRlcnZhbF8xCiAgICBXSEVSRSBpbnRlcnZhbC5zdGFydCA8PSBpbnRlcnZhbF8xLnN0YXJ0CiAgICAgICAgQU5EIGludGVydmFsLiJlbmQiID4gaW50ZXJ2YWxfMS5zdGFydAogICAgICAgIE9SIGludGVydmFsLnN0YXJ0IDw9IGludGVydmFsXzEuImVuZCIKICAgICAgICBBTkQgaW50ZXJ2YWwuImVuZCIgPiBpbnRlcnZhbF8xLiJlbmQiCgouLiBfaHlicmlkX2Rpc3RpbmN0X2V4cHJlc3Npb246CgpEZWZpbmluZyBFeHByZXNzaW9uIEJlaGF2aW9yIERpc3RpbmN0IGZyb20gQXR0cmlidXRlIEJlaGF2aW9yCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpPdXIgdXNhZ2Ugb2YgdGhlIGBgJmBgIGFuZCBgYHxgYCBiaXR3aXNlIG9wZXJhdG9ycyBhYm92ZSB3YXMKZm9ydHVuYXRlLCBjb25zaWRlcmluZyBvdXIgZnVuY3Rpb25zIG9wZXJhdGVkIG9uIHR3byBib29sZWFuIHZhbHVlcyB0bwpyZXR1cm4gYSBuZXcgb25lLiAgIEluIG1hbnkgY2FzZXMsIHRoZSBjb25zdHJ1Y3Rpb24gb2YgYW4gaW4tUHl0aG9uCmZ1bmN0aW9uIGFuZCBhIFNRTEFsY2hlbXkgU1FMIGV4cHJlc3Npb24gaGF2ZSBlbm91Z2ggZGlmZmVyZW5jZXMgdGhhdAp0d28gc2VwYXJhdGUgUHl0aG9uIGV4cHJlc3Npb25zIHNob3VsZCBiZSBkZWZpbmVkLiAgVGhlCjptb2Q6YH5zcWxhbGNoZW15LmV4dC5oeWJyaWRgIGRlY29yYXRvcnMgZGVmaW5lIHRoZQo6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5leHByZXNzaW9uYCBtb2RpZmllciBmb3IgdGhpcyBwdXJwb3NlLiAgIEFzIGFuCmV4YW1wbGUgd2UnbGwgZGVmaW5lIHRoZSByYWRpdXMgb2YgdGhlIGludGVydmFsLCB3aGljaCByZXF1aXJlcyB0aGUKdXNhZ2Ugb2YgdGhlIGFic29sdXRlIHZhbHVlIGZ1bmN0aW9uOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IGZ1bmMKCiAgICBjbGFzcyBJbnRlcnZhbChvYmplY3QpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgcmFkaXVzKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gYWJzKHNlbGYubGVuZ3RoKSAvIDIKCiAgICAgICAgQHJhZGl1cy5leHByZXNzaW9uCiAgICAgICAgZGVmIHJhZGl1cyhjbHMpOgogICAgICAgICAgICByZXR1cm4gZnVuYy5hYnMoY2xzLmxlbmd0aCkgLyAyCgpBYm92ZSB0aGUgUHl0aG9uIGZ1bmN0aW9uIGBgYWJzKClgYCBpcyB1c2VkIGZvciBpbnN0YW5jZS1sZXZlbApvcGVyYXRpb25zLCB0aGUgU1FMIGZ1bmN0aW9uIGBgQUJTKClgYCBpcyB1c2VkIHZpYSB0aGUgOmRhdGE6YC5mdW5jYApvYmplY3QgZm9yIGNsYXNzLWxldmVsIGV4cHJlc3Npb25zOjoKCiAgICA+Pj4gaTEucmFkaXVzCiAgICAyCgogICAgPj4+IHByaW50KFNlc3Npb24oKS5xdWVyeShJbnRlcnZhbCkuZmlsdGVyKEludGVydmFsLnJhZGl1cyA+IDUpKQogICAgU0VMRUNUIGludGVydmFsLmlkIEFTIGludGVydmFsX2lkLCBpbnRlcnZhbC5zdGFydCBBUyBpbnRlcnZhbF9zdGFydCwKICAgICAgICBpbnRlcnZhbC4iZW5kIiBBUyBpbnRlcnZhbF9lbmQKICAgIEZST00gaW50ZXJ2YWwKICAgIFdIRVJFIGFicyhpbnRlcnZhbC4iZW5kIiAtIGludGVydmFsLnN0YXJ0KSAvIDphYnNfMSA+IDpwYXJhbV8xCgouLiBub3RlOjogV2hlbiBkZWZpbmluZyBhbiBleHByZXNzaW9uIGZvciBhIGh5YnJpZCBwcm9wZXJ0eSBvciBtZXRob2QsIHRoZQogICBleHByZXNzaW9uIG1ldGhvZCAqKm11c3QqKiByZXRhaW4gdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGh5YnJpZCwgZWxzZQogICB0aGUgbmV3IGh5YnJpZCB3aXRoIHRoZSBhZGRpdGlvbmFsIHN0YXRlIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGNsYXNzCiAgIHdpdGggdGhlIG5vbi1tYXRjaGluZyBuYW1lLiBUbyB1c2UgdGhlIGV4YW1wbGUgYWJvdmU6OgoKICAgIGNsYXNzIEludGVydmFsKG9iamVjdCk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiByYWRpdXMoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBhYnMoc2VsZi5sZW5ndGgpIC8gMgoKICAgICAgICAjIFdST05HIC0gdGhlIG5vbi1tYXRjaGluZyBuYW1lIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbiB0byBiZQogICAgICAgICMgaWdub3JlZAogICAgICAgIEByYWRpdXMuZXhwcmVzc2lvbgogICAgICAgIGRlZiByYWRpdXNfZXhwcmVzc2lvbihjbHMpOgogICAgICAgICAgICByZXR1cm4gZnVuYy5hYnMoY2xzLmxlbmd0aCkgLyAyCgogICBUaGlzIGlzIGFsc28gdHJ1ZSBmb3Igb3RoZXIgbXV0YXRvciBtZXRob2RzLCBzdWNoIGFzCiAgIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LnVwZGF0ZV9leHByZXNzaW9uYC4gVGhpcyBpcyB0aGUgc2FtZSBiZWhhdmlvcgogICBhcyB0aGF0IG9mIHRoZSBgYEBwcm9wZXJ0eWBgIGNvbnN0cnVjdCB0aGF0IGlzIHBhcnQgb2Ygc3RhbmRhcmQgUHl0aG9uLgoKRGVmaW5pbmcgU2V0dGVycwotLS0tLS0tLS0tLS0tLS0tCgpIeWJyaWQgcHJvcGVydGllcyBjYW4gYWxzbyBkZWZpbmUgc2V0dGVyIG1ldGhvZHMuICBJZiB3ZSB3YW50ZWQKYGBsZW5ndGhgYCBhYm92ZSwgd2hlbiBzZXQsIHRvIG1vZGlmeSB0aGUgZW5kcG9pbnQgdmFsdWU6OgoKICAgIGNsYXNzIEludGVydmFsKG9iamVjdCk6CiAgICAgICAgIyAuLi4KCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBsZW5ndGgoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmVuZCAtIHNlbGYuc3RhcnQKCiAgICAgICAgQGxlbmd0aC5zZXR0ZXIKICAgICAgICBkZWYgbGVuZ3RoKHNlbGYsIHZhbHVlKToKICAgICAgICAgICAgc2VsZi5lbmQgPSBzZWxmLnN0YXJ0ICsgdmFsdWUKClRoZSBgYGxlbmd0aChzZWxmLCB2YWx1ZSlgYCBtZXRob2QgaXMgbm93IGNhbGxlZCB1cG9uIHNldDo6CgogICAgPj4+IGkxID0gSW50ZXJ2YWwoNSwgMTApCiAgICA+Pj4gaTEubGVuZ3RoCiAgICA1CiAgICA+Pj4gaTEubGVuZ3RoID0gMTIKICAgID4+PiBpMS5lbmQKICAgIDE3CgouLiBfaHlicmlkX2J1bGtfdXBkYXRlOgoKQWxsb3dpbmcgQnVsayBPUk0gVXBkYXRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSBoeWJyaWQgY2FuIGRlZmluZSBhIGN1c3RvbSAiVVBEQVRFIiBoYW5kbGVyIGZvciB3aGVuIHVzaW5nIHRoZQo6bWV0aDpgX3F1ZXJ5LlF1ZXJ5LnVwZGF0ZWAgbWV0aG9kLCBhbGxvd2luZyB0aGUgaHlicmlkIHRvIGJlIHVzZWQgaW4gdGhlClNFVCBjbGF1c2Ugb2YgdGhlIHVwZGF0ZS4KCk5vcm1hbGx5LCB3aGVuIHVzaW5nIGEgaHlicmlkIHdpdGggOm1ldGg6YF9xdWVyeS5RdWVyeS51cGRhdGVgLCB0aGUgU1FMCmV4cHJlc3Npb24gaXMgdXNlZCBhcyB0aGUgY29sdW1uIHRoYXQncyB0aGUgdGFyZ2V0IG9mIHRoZSBTRVQuICBJZiBvdXIKYGBJbnRlcnZhbGBgIGNsYXNzIGhhZCBhIGh5YnJpZCBgYHN0YXJ0X3BvaW50YGAgdGhhdCBsaW5rZWQgdG8KYGBJbnRlcnZhbC5zdGFydGBgLCB0aGlzIGNvdWxkIGJlIHN1YnN0aXR1dGVkIGRpcmVjdGx5OjoKCiAgICBzZXNzaW9uLnF1ZXJ5KEludGVydmFsKS51cGRhdGUoe0ludGVydmFsLnN0YXJ0X3BvaW50OiAxMH0pCgpIb3dldmVyLCB3aGVuIHVzaW5nIGEgY29tcG9zaXRlIGh5YnJpZCBsaWtlIGBgSW50ZXJ2YWwubGVuZ3RoYGAsIHRoaXMKaHlicmlkIHJlcHJlc2VudHMgbW9yZSB0aGFuIG9uZSBjb2x1bW4uICAgV2UgY2FuIHNldCB1cCBhIGhhbmRsZXIgdGhhdCB3aWxsCmFjY29tbW9kYXRlIGEgdmFsdWUgcGFzc2VkIHRvIDptZXRoOmBfcXVlcnkuUXVlcnkudXBkYXRlYCB3aGljaCBjYW4gYWZmZWN0CnRoaXMsIHVzaW5nIHRoZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvbmAgZGVjb3JhdG9yLgpBIGhhbmRsZXIgdGhhdCB3b3JrcyBzaW1pbGFybHkgdG8gb3VyIHNldHRlciB3b3VsZCBiZTo6CgogICAgY2xhc3MgSW50ZXJ2YWwob2JqZWN0KToKICAgICAgICAjIC4uLgoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIGxlbmd0aChzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYuZW5kIC0gc2VsZi5zdGFydAoKICAgICAgICBAbGVuZ3RoLnNldHRlcgogICAgICAgIGRlZiBsZW5ndGgoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLmVuZCA9IHNlbGYuc3RhcnQgKyB2YWx1ZQoKICAgICAgICBAbGVuZ3RoLnVwZGF0ZV9leHByZXNzaW9uCiAgICAgICAgZGVmIGxlbmd0aChjbHMsIHZhbHVlKToKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIChjbHMuZW5kLCBjbHMuc3RhcnQgKyB2YWx1ZSkKICAgICAgICAgICAgXQoKQWJvdmUsIGlmIHdlIHVzZSBgYEludGVydmFsLmxlbmd0aGBgIGluIGFuIFVQREFURSBleHByZXNzaW9uIGFzOjoKCiAgICBzZXNzaW9uLnF1ZXJ5KEludGVydmFsKS51cGRhdGUoCiAgICAgICAge0ludGVydmFsLmxlbmd0aDogMjV9LCBzeW5jaHJvbml6ZV9zZXNzaW9uPSdmZXRjaCcpCgpXZSdsbCBnZXQgYW4gVVBEQVRFIHN0YXRlbWVudCBhbG9uZyB0aGUgbGluZXMgb2Y6OgoKICAgIFVQREFURSBpbnRlcnZhbCBTRVQgZW5kPXN0YXJ0ICsgOnZhbHVlCgpJbiBzb21lIGNhc2VzLCB0aGUgZGVmYXVsdCAiZXZhbHVhdGUiIHN0cmF0ZWd5IGNhbid0IHBlcmZvcm0gdGhlIFNFVApleHByZXNzaW9uIGluIFB5dGhvbjsgd2hpbGUgdGhlIGFkZGl0aW9uIG9wZXJhdG9yIHdlJ3JlIHVzaW5nIGFib3ZlCmlzIHN1cHBvcnRlZCwgZm9yIG1vcmUgY29tcGxleCBTRVQgZXhwcmVzc2lvbnMgaXQgd2lsbCB1c3VhbGx5IGJlIG5lY2Vzc2FyeQp0byB1c2UgZWl0aGVyIHRoZSAiZmV0Y2giIG9yIEZhbHNlIHN5bmNocm9uaXphdGlvbiBzdHJhdGVneSBhcyBpbGx1c3RyYXRlZAphYm92ZS4KCi4uIHZlcnNpb25hZGRlZDo6IDEuMiBhZGRlZCBzdXBwb3J0IGZvciBidWxrIHVwZGF0ZXMgdG8gaHlicmlkIHByb3BlcnRpZXMuCgpXb3JraW5nIHdpdGggUmVsYXRpb25zaGlwcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlcmUncyBubyBlc3NlbnRpYWwgZGlmZmVyZW5jZSB3aGVuIGNyZWF0aW5nIGh5YnJpZHMgdGhhdCB3b3JrIHdpdGgKcmVsYXRlZCBvYmplY3RzIGFzIG9wcG9zZWQgdG8gY29sdW1uLWJhc2VkIGRhdGEuIFRoZSBuZWVkIGZvciBkaXN0aW5jdApleHByZXNzaW9ucyB0ZW5kcyB0byBiZSBncmVhdGVyLiAgVGhlIHR3byB2YXJpYW50cyB3ZSdsbCBpbGx1c3RyYXRlCmFyZSB0aGUgImpvaW4tZGVwZW5kZW50IiBoeWJyaWQsIGFuZCB0aGUgImNvcnJlbGF0ZWQgc3VicXVlcnkiIGh5YnJpZC4KCkpvaW4tRGVwZW5kZW50IFJlbGF0aW9uc2hpcCBIeWJyaWQKXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgoKQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBkZWNsYXJhdGl2ZQptYXBwaW5nIHdoaWNoIHJlbGF0ZXMgYSBgYFVzZXJgYCB0byBhIGBgU2F2aW5nc0FjY291bnRgYDo6CgogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBDb2x1bW4sIEludGVnZXIsIEZvcmVpZ25LZXksIE51bWVyaWMsIFN0cmluZwogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgcmVsYXRpb25zaGlwCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmRlY2xhcmF0aXZlIGltcG9ydCBkZWNsYXJhdGl2ZV9iYXNlCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0Lmh5YnJpZCBpbXBvcnQgaHlicmlkX3Byb3BlcnR5CgogICAgQmFzZSA9IGRlY2xhcmF0aXZlX2Jhc2UoKQoKICAgIGNsYXNzIFNhdmluZ3NBY2NvdW50KEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnYWNjb3VudCcKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHVzZXJfaWQgPSBDb2x1bW4oSW50ZWdlciwgRm9yZWlnbktleSgndXNlci5pZCcpLCBudWxsYWJsZT1GYWxzZSkKICAgICAgICBiYWxhbmNlID0gQ29sdW1uKE51bWVyaWMoMTUsIDUpKQoKICAgIGNsYXNzIFVzZXIoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICd1c2VyJwogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgbmFtZSA9IENvbHVtbihTdHJpbmcoMTAwKSwgbnVsbGFibGU9RmFsc2UpCgogICAgICAgIGFjY291bnRzID0gcmVsYXRpb25zaGlwKCJTYXZpbmdzQWNjb3VudCIsIGJhY2tyZWY9Im93bmVyIikKCiAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgIGRlZiBiYWxhbmNlKHNlbGYpOgogICAgICAgICAgICBpZiBzZWxmLmFjY291bnRzOgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuYWNjb3VudHNbMF0uYmFsYW5jZQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKCiAgICAgICAgQGJhbGFuY2Uuc2V0dGVyCiAgICAgICAgZGVmIGJhbGFuY2Uoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBpZiBub3Qgc2VsZi5hY2NvdW50czoKICAgICAgICAgICAgICAgIGFjY291bnQgPSBBY2NvdW50KG93bmVyPXNlbGYpCiAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICBhY2NvdW50ID0gc2VsZi5hY2NvdW50c1swXQogICAgICAgICAgICBhY2NvdW50LmJhbGFuY2UgPSB2YWx1ZQoKICAgICAgICBAYmFsYW5jZS5leHByZXNzaW9uCiAgICAgICAgZGVmIGJhbGFuY2UoY2xzKToKICAgICAgICAgICAgcmV0dXJuIFNhdmluZ3NBY2NvdW50LmJhbGFuY2UKClRoZSBhYm92ZSBoeWJyaWQgcHJvcGVydHkgYGBiYWxhbmNlYGAgd29ya3Mgd2l0aCB0aGUgZmlyc3QKYGBTYXZpbmdzQWNjb3VudGBgIGVudHJ5IGluIHRoZSBsaXN0IG9mIGFjY291bnRzIGZvciB0aGlzIHVzZXIuICAgVGhlCmluLVB5dGhvbiBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgY2FuIHRyZWF0IGBgYWNjb3VudHNgYCBhcyBhIFB5dGhvbgpsaXN0IGF2YWlsYWJsZSBvbiBgYHNlbGZgYC4KCkhvd2V2ZXIsIGF0IHRoZSBleHByZXNzaW9uIGxldmVsLCBpdCdzIGV4cGVjdGVkIHRoYXQgdGhlIGBgVXNlcmBgIGNsYXNzIHdpbGwKYmUgdXNlZCBpbiBhbiBhcHByb3ByaWF0ZSBjb250ZXh0IHN1Y2ggdGhhdCBhbiBhcHByb3ByaWF0ZSBqb2luIHRvCmBgU2F2aW5nc0FjY291bnRgYCB3aWxsIGJlIHByZXNlbnQ6OgoKICAgID4+PiBwcmludChTZXNzaW9uKCkucXVlcnkoVXNlciwgVXNlci5iYWxhbmNlKS4KICAgIC4uLiAgICAgICBqb2luKFVzZXIuYWNjb3VudHMpLmZpbHRlcihVc2VyLmJhbGFuY2UgPiA1MDAwKSkKICAgIFNFTEVDVCAidXNlciIuaWQgQVMgdXNlcl9pZCwgInVzZXIiLm5hbWUgQVMgdXNlcl9uYW1lLAogICAgYWNjb3VudC5iYWxhbmNlIEFTIGFjY291bnRfYmFsYW5jZQogICAgRlJPTSAidXNlciIgSk9JTiBhY2NvdW50IE9OICJ1c2VyIi5pZCA9IGFjY291bnQudXNlcl9pZAogICAgV0hFUkUgYWNjb3VudC5iYWxhbmNlID4gOmJhbGFuY2VfMQoKTm90ZSBob3dldmVyLCB0aGF0IHdoaWxlIHRoZSBpbnN0YW5jZSBsZXZlbCBhY2Nlc3NvcnMgbmVlZCB0byB3b3JyeQphYm91dCB3aGV0aGVyIGBgc2VsZi5hY2NvdW50c2BgIGlzIGV2ZW4gcHJlc2VudCwgdGhpcyBpc3N1ZSBleHByZXNzZXMKaXRzZWxmIGRpZmZlcmVudGx5IGF0IHRoZSBTUUwgZXhwcmVzc2lvbiBsZXZlbCwgd2hlcmUgd2UgYmFzaWNhbGx5CndvdWxkIHVzZSBhbiBvdXRlciBqb2luOjoKCiAgICA+Pj4gZnJvbSBzcWxhbGNoZW15IGltcG9ydCBvcl8KICAgID4+PiBwcmludCAoU2Vzc2lvbigpLnF1ZXJ5KFVzZXIsIFVzZXIuYmFsYW5jZSkub3V0ZXJqb2luKFVzZXIuYWNjb3VudHMpLgogICAgLi4uICAgICAgICAgZmlsdGVyKG9yXyhVc2VyLmJhbGFuY2UgPCA1MDAwLCBVc2VyLmJhbGFuY2UgPT0gTm9uZSkpKQogICAgU0VMRUNUICJ1c2VyIi5pZCBBUyB1c2VyX2lkLCAidXNlciIubmFtZSBBUyB1c2VyX25hbWUsCiAgICBhY2NvdW50LmJhbGFuY2UgQVMgYWNjb3VudF9iYWxhbmNlCiAgICBGUk9NICJ1c2VyIiBMRUZUIE9VVEVSIEpPSU4gYWNjb3VudCBPTiAidXNlciIuaWQgPSBhY2NvdW50LnVzZXJfaWQKICAgIFdIRVJFIGFjY291bnQuYmFsYW5jZSA8ICA6YmFsYW5jZV8xIE9SIGFjY291bnQuYmFsYW5jZSBJUyBOVUxMCgpDb3JyZWxhdGVkIFN1YnF1ZXJ5IFJlbGF0aW9uc2hpcCBIeWJyaWQKXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgoKV2UgY2FuLCBvZiBjb3Vyc2UsIGZvcmVnbyBiZWluZyBkZXBlbmRlbnQgb24gdGhlIGVuY2xvc2luZyBxdWVyeSdzIHVzYWdlCm9mIGpvaW5zIGluIGZhdm9yIG9mIHRoZSBjb3JyZWxhdGVkIHN1YnF1ZXJ5LCB3aGljaCBjYW4gcG9ydGFibHkgYmUgcGFja2VkCmludG8gYSBzaW5nbGUgY29sdW1uIGV4cHJlc3Npb24uIEEgY29ycmVsYXRlZCBzdWJxdWVyeSBpcyBtb3JlIHBvcnRhYmxlLCBidXQKb2Z0ZW4gcGVyZm9ybXMgbW9yZSBwb29ybHkgYXQgdGhlIFNRTCBsZXZlbC4gVXNpbmcgdGhlIHNhbWUgdGVjaG5pcXVlCmlsbHVzdHJhdGVkIGF0IDpyZWY6YG1hcHBlcl9jb2x1bW5fcHJvcGVydHlfc3FsX2V4cHJlc3Npb25zYCwKd2UgY2FuIGFkanVzdCBvdXIgYGBTYXZpbmdzQWNjb3VudGBgIGV4YW1wbGUgdG8gYWdncmVnYXRlIHRoZSBiYWxhbmNlcyBmb3IKKmFsbCogYWNjb3VudHMsIGFuZCB1c2UgYSBjb3JyZWxhdGVkIHN1YnF1ZXJ5IGZvciB0aGUgY29sdW1uIGV4cHJlc3Npb246OgoKICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgQ29sdW1uLCBJbnRlZ2VyLCBGb3JlaWduS2V5LCBOdW1lcmljLCBTdHJpbmcKICAgIGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IHJlbGF0aW9uc2hpcAogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5kZWNsYXJhdGl2ZSBpbXBvcnQgZGVjbGFyYXRpdmVfYmFzZQogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5oeWJyaWQgaW1wb3J0IGh5YnJpZF9wcm9wZXJ0eQogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBzZWxlY3QsIGZ1bmMKCiAgICBCYXNlID0gZGVjbGFyYXRpdmVfYmFzZSgpCgogICAgY2xhc3MgU2F2aW5nc0FjY291bnQoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICdhY2NvdW50JwogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgdXNlcl9pZCA9IENvbHVtbihJbnRlZ2VyLCBGb3JlaWduS2V5KCd1c2VyLmlkJyksIG51bGxhYmxlPUZhbHNlKQogICAgICAgIGJhbGFuY2UgPSBDb2x1bW4oTnVtZXJpYygxNSwgNSkpCgogICAgY2xhc3MgVXNlcihCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ3VzZXInCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBuYW1lID0gQ29sdW1uKFN0cmluZygxMDApLCBudWxsYWJsZT1GYWxzZSkKCiAgICAgICAgYWNjb3VudHMgPSByZWxhdGlvbnNoaXAoIlNhdmluZ3NBY2NvdW50IiwgYmFja3JlZj0ib3duZXIiKQoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIGJhbGFuY2Uoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzdW0oYWNjLmJhbGFuY2UgZm9yIGFjYyBpbiBzZWxmLmFjY291bnRzKQoKICAgICAgICBAYmFsYW5jZS5leHByZXNzaW9uCiAgICAgICAgZGVmIGJhbGFuY2UoY2xzKToKICAgICAgICAgICAgcmV0dXJuIHNlbGVjdChbZnVuYy5zdW0oU2F2aW5nc0FjY291bnQuYmFsYW5jZSldKS5cCiAgICAgICAgICAgICAgICAgICAgd2hlcmUoU2F2aW5nc0FjY291bnQudXNlcl9pZD09Y2xzLmlkKS5cCiAgICAgICAgICAgICAgICAgICAgbGFiZWwoJ3RvdGFsX2JhbGFuY2UnKQoKVGhlIGFib3ZlIHJlY2lwZSB3aWxsIGdpdmUgdXMgdGhlIGBgYmFsYW5jZWBgIGNvbHVtbiB3aGljaCByZW5kZXJzCmEgY29ycmVsYXRlZCBTRUxFQ1Q6OgoKICAgID4+PiBwcmludChzLnF1ZXJ5KFVzZXIpLmZpbHRlcihVc2VyLmJhbGFuY2UgPiA0MDApKQogICAgU0VMRUNUICJ1c2VyIi5pZCBBUyB1c2VyX2lkLCAidXNlciIubmFtZSBBUyB1c2VyX25hbWUKICAgIEZST00gInVzZXIiCiAgICBXSEVSRSAoU0VMRUNUIHN1bShhY2NvdW50LmJhbGFuY2UpIEFTIHN1bV8xCiAgICBGUk9NIGFjY291bnQKICAgIFdIRVJFIGFjY291bnQudXNlcl9pZCA9ICJ1c2VyIi5pZCkgPiA6cGFyYW1fMQoKLi4gX2h5YnJpZF9jdXN0b21fY29tcGFyYXRvcnM6CgpCdWlsZGluZyBDdXN0b20gQ29tcGFyYXRvcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGUgaHlicmlkIHByb3BlcnR5IGFsc28gaW5jbHVkZXMgYSBoZWxwZXIgdGhhdCBhbGxvd3MgY29uc3RydWN0aW9uIG9mCmN1c3RvbSBjb21wYXJhdG9ycy4gQSBjb21wYXJhdG9yIG9iamVjdCBhbGxvd3Mgb25lIHRvIGN1c3RvbWl6ZSB0aGUKYmVoYXZpb3Igb2YgZWFjaCBTUUxBbGNoZW15IGV4cHJlc3Npb24gb3BlcmF0b3IgaW5kaXZpZHVhbGx5LiAgVGhleQphcmUgdXNlZnVsIHdoZW4gY3JlYXRpbmcgY3VzdG9tIHR5cGVzIHRoYXQgaGF2ZSBzb21lIGhpZ2hseQppZGlvc3luY3JhdGljIGJlaGF2aW9yIG9uIHRoZSBTUUwgc2lkZS4KCi4uIG5vdGU6OiAgVGhlIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmNvbXBhcmF0b3JgIGRlY29yYXRvciBpbnRyb2R1Y2VkCiAgIGluIHRoaXMgc2VjdGlvbiAqKnJlcGxhY2VzKiogdGhlIHVzZSBvZiB0aGUKICAgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuZXhwcmVzc2lvbmAgZGVjb3JhdG9yLgogICBUaGV5IGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyLgoKVGhlIGV4YW1wbGUgY2xhc3MgYmVsb3cgYWxsb3dzIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbnMgb24gdGhlIGF0dHJpYnV0ZQpuYW1lZCBgYHdvcmRfaW5zZW5zaXRpdmVgYDo6CgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5oeWJyaWQgaW1wb3J0IENvbXBhcmF0b3IsIGh5YnJpZF9wcm9wZXJ0eQogICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBmdW5jLCBDb2x1bW4sIEludGVnZXIsIFN0cmluZwogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgU2Vzc2lvbgogICAgZnJvbSBzcWxhbGNoZW15LmV4dC5kZWNsYXJhdGl2ZSBpbXBvcnQgZGVjbGFyYXRpdmVfYmFzZQoKICAgIEJhc2UgPSBkZWNsYXJhdGl2ZV9iYXNlKCkKCiAgICBjbGFzcyBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKENvbXBhcmF0b3IpOgogICAgICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgogICAgICAgICAgICByZXR1cm4gZnVuYy5sb3dlcihzZWxmLl9fY2xhdXNlX2VsZW1lbnRfXygpKSA9PSBmdW5jLmxvd2VyKG90aGVyKQoKICAgIGNsYXNzIFNlYXJjaFdvcmQoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICdzZWFyY2h3b3JkJwogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgd29yZCA9IENvbHVtbihTdHJpbmcoMjU1KSwgbnVsbGFibGU9RmFsc2UpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgd29yZF9pbnNlbnNpdGl2ZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIHNlbGYud29yZC5sb3dlcigpCgogICAgICAgIEB3b3JkX2luc2Vuc2l0aXZlLmNvbXBhcmF0b3IKICAgICAgICBkZWYgd29yZF9pbnNlbnNpdGl2ZShjbHMpOgogICAgICAgICAgICByZXR1cm4gQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcihjbHMud29yZCkKCkFib3ZlLCBTUUwgZXhwcmVzc2lvbnMgYWdhaW5zdCBgYHdvcmRfaW5zZW5zaXRpdmVgYCB3aWxsIGFwcGx5IHRoZSBgYExPV0VSKClgYApTUUwgZnVuY3Rpb24gdG8gYm90aCBzaWRlczo6CgogICAgPj4+IHByaW50KFNlc3Npb24oKS5xdWVyeShTZWFyY2hXb3JkKS5maWx0ZXJfYnkod29yZF9pbnNlbnNpdGl2ZT0iVHJ1Y2tzIikpCiAgICBTRUxFQ1Qgc2VhcmNod29yZC5pZCBBUyBzZWFyY2h3b3JkX2lkLCBzZWFyY2h3b3JkLndvcmQgQVMgc2VhcmNod29yZF93b3JkCiAgICBGUk9NIHNlYXJjaHdvcmQKICAgIFdIRVJFIGxvd2VyKHNlYXJjaHdvcmQud29yZCkgPSBsb3dlcig6bG93ZXJfMSkKClRoZSBgYENhc2VJbnNlbnNpdGl2ZUNvbXBhcmF0b3JgYCBhYm92ZSBpbXBsZW1lbnRzIHBhcnQgb2YgdGhlCjpjbGFzczpgLkNvbHVtbk9wZXJhdG9yc2AgaW50ZXJmYWNlLiAgIEEgImNvZXJjaW9uIiBvcGVyYXRpb24gbGlrZQpsb3dlcmNhc2luZyBjYW4gYmUgYXBwbGllZCB0byBhbGwgY29tcGFyaXNvbiBvcGVyYXRpb25zIChpLmUuIGBgZXFgYCwKYGBsdGBgLCBgYGd0YGAsIGV0Yy4pIHVzaW5nIDptZXRoOmAuT3BlcmF0b3JzLm9wZXJhdGVgOjoKCiAgICBjbGFzcyBDYXNlSW5zZW5zaXRpdmVDb21wYXJhdG9yKENvbXBhcmF0b3IpOgogICAgICAgIGRlZiBvcGVyYXRlKHNlbGYsIG9wLCBvdGhlcik6CiAgICAgICAgICAgIHJldHVybiBvcChmdW5jLmxvd2VyKHNlbGYuX19jbGF1c2VfZWxlbWVudF9fKCkpLCBmdW5jLmxvd2VyKG90aGVyKSkKCi4uIF9oeWJyaWRfcmV1c2Vfc3ViY2xhc3M6CgpSZXVzaW5nIEh5YnJpZCBQcm9wZXJ0aWVzIGFjcm9zcyBTdWJjbGFzc2VzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkEgaHlicmlkIGNhbiBiZSByZWZlcnJlZCB0byBmcm9tIGEgc3VwZXJjbGFzcywgdG8gYWxsb3cgbW9kaWZ5aW5nCm1ldGhvZHMgbGlrZSA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5nZXR0ZXJgLCA6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5zZXR0ZXJgCnRvIGJlIHVzZWQgdG8gcmVkZWZpbmUgdGhvc2UgbWV0aG9kcyBvbiBhIHN1YmNsYXNzLiAgVGhpcyBpcyBzaW1pbGFyIHRvCmhvdyB0aGUgc3RhbmRhcmQgUHl0aG9uIGBgQHByb3BlcnR5YGAgb2JqZWN0IHdvcmtzOjoKCiAgICBjbGFzcyBGaXJzdE5hbWVPbmx5KEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIGZpcnN0X25hbWUgPSBDb2x1bW4oU3RyaW5nKQoKICAgICAgICBAaHlicmlkX3Byb3BlcnR5CiAgICAgICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpcnN0X25hbWUKCiAgICAgICAgQG5hbWUuc2V0dGVyCiAgICAgICAgZGVmIG5hbWUoc2VsZiwgdmFsdWUpOgogICAgICAgICAgICBzZWxmLmZpcnN0X25hbWUgPSB2YWx1ZQoKICAgIGNsYXNzIEZpcnN0TmFtZUxhc3ROYW1lKEZpcnN0TmFtZU9ubHkpOgogICAgICAgICMgLi4uCgogICAgICAgIGxhc3RfbmFtZSA9IENvbHVtbihTdHJpbmcpCgogICAgICAgIEBGaXJzdE5hbWVPbmx5Lm5hbWUuZ2V0dGVyCiAgICAgICAgZGVmIG5hbWUoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLmZpcnN0X25hbWUgKyAnICcgKyBzZWxmLmxhc3RfbmFtZQoKICAgICAgICBAbmFtZS5zZXR0ZXIKICAgICAgICBkZWYgbmFtZShzZWxmLCB2YWx1ZSk6CiAgICAgICAgICAgIHNlbGYuZmlyc3RfbmFtZSwgc2VsZi5sYXN0X25hbWUgPSB2YWx1ZS5zcGxpdCgnICcsIDEpCgpBYm92ZSwgdGhlIGBgRmlyc3ROYW1lTGFzdE5hbWVgYCBjbGFzcyByZWZlcnMgdG8gdGhlIGh5YnJpZCBmcm9tCmBgRmlyc3ROYW1lT25seS5uYW1lYGAgdG8gcmVwdXJwb3NlIGl0cyBnZXR0ZXIgYW5kIHNldHRlciBmb3IgdGhlIHN1YmNsYXNzLgoKV2hlbiBvdmVycmlkaW5nIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gIGFuZAo6bWV0aDpgLmh5YnJpZF9wcm9wZXJ0eS5jb21wYXJhdG9yYCBhbG9uZSBhcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZQpzdXBlcmNsYXNzLCB0aGVzZSBuYW1lcyBjb25mbGljdCB3aXRoIHRoZSBzYW1lLW5hbWVkIGFjY2Vzc29ycyBvbiB0aGUgY2xhc3MtCmxldmVsIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAgb2JqZWN0IHJldHVybmVkIGF0IHRoZSBjbGFzcyBsZXZlbC4gIFRvCm92ZXJyaWRlIHRoZXNlIG1ldGhvZHMgd2hlbiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIHBhcmVudCBjbGFzcyBkZXNjcmlwdG9yLAphZGQgdGhlIHNwZWNpYWwgcXVhbGlmaWVyIDphdHRyOmAuaHlicmlkX3Byb3BlcnR5Lm92ZXJyaWRlc2AsIHdoaWNoIHdpbGwgZGUtCnJlZmVyZW5jZSB0aGUgaW5zdHJ1bWVudGVkIGF0dHJpYnV0ZSBiYWNrIHRvIHRoZSBoeWJyaWQgb2JqZWN0OjoKCiAgICBjbGFzcyBGaXJzdE5hbWVMYXN0TmFtZShGaXJzdE5hbWVPbmx5KToKICAgICAgICAjIC4uLgoKICAgICAgICBsYXN0X25hbWUgPSBDb2x1bW4oU3RyaW5nKQoKICAgICAgICBARmlyc3ROYW1lT25seS5uYW1lLm92ZXJyaWRlcy5leHByZXNzaW9uCiAgICAgICAgZGVmIG5hbWUoY2xzKToKICAgICAgICAgICAgcmV0dXJuIGZ1bmMuY29uY2F0KGNscy5maXJzdF9uYW1lLCAnICcsIGNscy5sYXN0X25hbWUpCgouLiB2ZXJzaW9uYWRkZWQ6OiAxLjIgQWRkZWQgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuZ2V0dGVyYCBhcyB3ZWxsIGFzIHRoZQogICBhYmlsaXR5IHRvIHJlZGVmaW5lIGFjY2Vzc29ycyBwZXItc3ViY2xhc3MuCgoKSHlicmlkIFZhbHVlIE9iamVjdHMKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5vdGUgaW4gb3VyIHByZXZpb3VzIGV4YW1wbGUsIGlmIHdlIHdlcmUgdG8gY29tcGFyZSB0aGUgYGB3b3JkX2luc2Vuc2l0aXZlYGAKYXR0cmlidXRlIG9mIGEgYGBTZWFyY2hXb3JkYGAgaW5zdGFuY2UgdG8gYSBwbGFpbiBQeXRob24gc3RyaW5nLCB0aGUgcGxhaW4KUHl0aG9uIHN0cmluZyB3b3VsZCBub3QgYmUgY29lcmNlZCB0byBsb3dlciBjYXNlIC0gdGhlCmBgQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcmBgIHdlIGJ1aWx0LCBiZWluZyByZXR1cm5lZCBieQpgYEB3b3JkX2luc2Vuc2l0aXZlLmNvbXBhcmF0b3JgYCwgb25seSBhcHBsaWVzIHRvIHRoZSBTUUwgc2lkZS4KCkEgbW9yZSBjb21wcmVoZW5zaXZlIGZvcm0gb2YgdGhlIGN1c3RvbSBjb21wYXJhdG9yIGlzIHRvIGNvbnN0cnVjdCBhICpIeWJyaWQKVmFsdWUgT2JqZWN0Ki4gVGhpcyB0ZWNobmlxdWUgYXBwbGllcyB0aGUgdGFyZ2V0IHZhbHVlIG9yIGV4cHJlc3Npb24gdG8gYSB2YWx1ZQpvYmplY3Qgd2hpY2ggaXMgdGhlbiByZXR1cm5lZCBieSB0aGUgYWNjZXNzb3IgaW4gYWxsIGNhc2VzLiAgIFRoZSB2YWx1ZSBvYmplY3QKYWxsb3dzIGNvbnRyb2wgb2YgYWxsIG9wZXJhdGlvbnMgdXBvbiB0aGUgdmFsdWUgYXMgd2VsbCBhcyBob3cgY29tcGFyZWQgdmFsdWVzCmFyZSB0cmVhdGVkLCBib3RoIG9uIHRoZSBTUUwgZXhwcmVzc2lvbiBzaWRlIGFzIHdlbGwgYXMgdGhlIFB5dGhvbiB2YWx1ZSBzaWRlLgpSZXBsYWNpbmcgdGhlIHByZXZpb3VzIGBgQ2FzZUluc2Vuc2l0aXZlQ29tcGFyYXRvcmBgIGNsYXNzIHdpdGggYSBuZXcKYGBDYXNlSW5zZW5zaXRpdmVXb3JkYGAgY2xhc3M6OgoKICAgIGNsYXNzIENhc2VJbnNlbnNpdGl2ZVdvcmQoQ29tcGFyYXRvcik6CiAgICAgICAgIkh5YnJpZCB2YWx1ZSByZXByZXNlbnRpbmcgYSBsb3dlciBjYXNlIHJlcHJlc2VudGF0aW9uIG9mIGEgd29yZC4iCgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3b3JkKToKICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh3b3JkLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgICAgIHNlbGYud29yZCA9IHdvcmQubG93ZXIoKQogICAgICAgICAgICBlbGlmIGlzaW5zdGFuY2Uod29yZCwgQ2FzZUluc2Vuc2l0aXZlV29yZCk6CiAgICAgICAgICAgICAgICBzZWxmLndvcmQgPSB3b3JkLndvcmQKICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgIHNlbGYud29yZCA9IGZ1bmMubG93ZXIod29yZCkKCiAgICAgICAgZGVmIG9wZXJhdGUoc2VsZiwgb3AsIG90aGVyKToKICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIENhc2VJbnNlbnNpdGl2ZVdvcmQpOgogICAgICAgICAgICAgICAgb3RoZXIgPSBDYXNlSW5zZW5zaXRpdmVXb3JkKG90aGVyKQogICAgICAgICAgICByZXR1cm4gb3Aoc2VsZi53b3JkLCBvdGhlci53b3JkKQoKICAgICAgICBkZWYgX19jbGF1c2VfZWxlbWVudF9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi53b3JkCgogICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgogICAgICAgICAgICByZXR1cm4gc2VsZi53b3JkCgogICAgICAgIGtleSA9ICd3b3JkJwogICAgICAgICJMYWJlbCB0byBhcHBseSB0byBRdWVyeSB0dXBsZSByZXN1bHRzIgoKQWJvdmUsIHRoZSBgYENhc2VJbnNlbnNpdGl2ZVdvcmRgYCBvYmplY3QgcmVwcmVzZW50cyBgYHNlbGYud29yZGBgLCB3aGljaCBtYXkKYmUgYSBTUUwgZnVuY3Rpb24sIG9yIG1heSBiZSBhIFB5dGhvbiBuYXRpdmUuICAgQnkgb3ZlcnJpZGluZyBgYG9wZXJhdGUoKWBgIGFuZApgYF9fY2xhdXNlX2VsZW1lbnRfXygpYGAgdG8gd29yayBpbiB0ZXJtcyBvZiBgYHNlbGYud29yZGBgLCBhbGwgY29tcGFyaXNvbgpvcGVyYXRpb25zIHdpbGwgd29yayBhZ2FpbnN0IHRoZSAiY29udmVydGVkIiBmb3JtIG9mIGBgd29yZGBgLCB3aGV0aGVyIGl0IGJlClNRTCBzaWRlIG9yIFB5dGhvbiBzaWRlLiBPdXIgYGBTZWFyY2hXb3JkYGAgY2xhc3MgY2FuIG5vdyBkZWxpdmVyIHRoZQpgYENhc2VJbnNlbnNpdGl2ZVdvcmRgYCBvYmplY3QgdW5jb25kaXRpb25hbGx5IGZyb20gYSBzaW5nbGUgaHlicmlkIGNhbGw6OgoKICAgIGNsYXNzIFNlYXJjaFdvcmQoQmFzZSk6CiAgICAgICAgX190YWJsZW5hbWVfXyA9ICdzZWFyY2h3b3JkJwogICAgICAgIGlkID0gQ29sdW1uKEludGVnZXIsIHByaW1hcnlfa2V5PVRydWUpCiAgICAgICAgd29yZCA9IENvbHVtbihTdHJpbmcoMjU1KSwgbnVsbGFibGU9RmFsc2UpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgd29yZF9pbnNlbnNpdGl2ZShzZWxmKToKICAgICAgICAgICAgcmV0dXJuIENhc2VJbnNlbnNpdGl2ZVdvcmQoc2VsZi53b3JkKQoKVGhlIGBgd29yZF9pbnNlbnNpdGl2ZWBgIGF0dHJpYnV0ZSBub3cgaGFzIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbiBiZWhhdmlvcgp1bml2ZXJzYWxseSwgaW5jbHVkaW5nIFNRTCBleHByZXNzaW9uIHZzLiBQeXRob24gZXhwcmVzc2lvbiAobm90ZSB0aGUgUHl0aG9uCnZhbHVlIGlzIGNvbnZlcnRlZCB0byBsb3dlciBjYXNlIG9uIHRoZSBQeXRob24gc2lkZSBoZXJlKTo6CgogICAgPj4+IHByaW50KFNlc3Npb24oKS5xdWVyeShTZWFyY2hXb3JkKS5maWx0ZXJfYnkod29yZF9pbnNlbnNpdGl2ZT0iVHJ1Y2tzIikpCiAgICBTRUxFQ1Qgc2VhcmNod29yZC5pZCBBUyBzZWFyY2h3b3JkX2lkLCBzZWFyY2h3b3JkLndvcmQgQVMgc2VhcmNod29yZF93b3JkCiAgICBGUk9NIHNlYXJjaHdvcmQKICAgIFdIRVJFIGxvd2VyKHNlYXJjaHdvcmQud29yZCkgPSA6bG93ZXJfMQoKU1FMIGV4cHJlc3Npb24gdmVyc3VzIFNRTCBleHByZXNzaW9uOjoKCiAgICA+Pj4gc3cxID0gYWxpYXNlZChTZWFyY2hXb3JkKQogICAgPj4+IHN3MiA9IGFsaWFzZWQoU2VhcmNoV29yZCkKICAgID4+PiBwcmludChTZXNzaW9uKCkucXVlcnkoCiAgICAuLi4gICAgICAgICAgICAgICAgICAgIHN3MS53b3JkX2luc2Vuc2l0aXZlLAogICAgLi4uICAgICAgICAgICAgICAgICAgICBzdzIud29yZF9pbnNlbnNpdGl2ZSkuXAogICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKAogICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3MS53b3JkX2luc2Vuc2l0aXZlID4gc3cyLndvcmRfaW5zZW5zaXRpdmUKICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICBTRUxFQ1QgbG93ZXIoc2VhcmNod29yZF8xLndvcmQpIEFTIGxvd2VyXzEsCiAgICBsb3dlcihzZWFyY2h3b3JkXzIud29yZCkgQVMgbG93ZXJfMgogICAgRlJPTSBzZWFyY2h3b3JkIEFTIHNlYXJjaHdvcmRfMSwgc2VhcmNod29yZCBBUyBzZWFyY2h3b3JkXzIKICAgIFdIRVJFIGxvd2VyKHNlYXJjaHdvcmRfMS53b3JkKSA+IGxvd2VyKHNlYXJjaHdvcmRfMi53b3JkKQoKUHl0aG9uIG9ubHkgZXhwcmVzc2lvbjo6CgogICAgPj4+IHdzMSA9IFNlYXJjaFdvcmQod29yZD0iU29tZVdvcmQiKQogICAgPj4+IHdzMS53b3JkX2luc2Vuc2l0aXZlID09ICJzT21Fd09yRCIKICAgIFRydWUKICAgID4+PiB3czEud29yZF9pbnNlbnNpdGl2ZSA9PSAiWE9tRXdPclgiCiAgICBGYWxzZQogICAgPj4+IHByaW50KHdzMS53b3JkX2luc2Vuc2l0aXZlKQogICAgc29tZXdvcmQKClRoZSBIeWJyaWQgVmFsdWUgcGF0dGVybiBpcyB2ZXJ5IHVzZWZ1bCBmb3IgYW55IGtpbmQgb2YgdmFsdWUgdGhhdCBtYXkgaGF2ZQptdWx0aXBsZSByZXByZXNlbnRhdGlvbnMsIHN1Y2ggYXMgdGltZXN0YW1wcywgdGltZSBkZWx0YXMsIHVuaXRzIG9mCm1lYXN1cmVtZW50LCBjdXJyZW5jaWVzIGFuZCBlbmNyeXB0ZWQgcGFzc3dvcmRzLgoKLi4gc2VlYWxzbzo6CgogICAgYEh5YnJpZHMgYW5kIFZhbHVlIEFnbm9zdGljIFR5cGVzCiAgICA8aHR0cDovL3RlY2hzcG90Lnp6emVlay5vcmcvMjAxMS8xMC8yMS9oeWJyaWRzLWFuZC12YWx1ZS1hZ25vc3RpYy10eXBlcy8+YF8KICAgIC0gb24gdGhlIHRlY2hzcG90Lnp6emVlay5vcmcgYmxvZwoKICAgIGBWYWx1ZSBBZ25vc3RpYyBUeXBlcywgUGFydCBJSQogICAgPGh0dHA6Ly90ZWNoc3BvdC56enplZWsub3JnLzIwMTEvMTAvMjkvdmFsdWUtYWdub3N0aWMtdHlwZXMtcGFydC1paS8+YF8gLQogICAgb24gdGhlIHRlY2hzcG90Lnp6emVlay5vcmcgYmxvZwoKLi4gX2h5YnJpZF90cmFuc2Zvcm1lcnM6CgpCdWlsZGluZyBUcmFuc2Zvcm1lcnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKQSAqdHJhbnNmb3JtZXIqIGlzIGFuIG9iamVjdCB3aGljaCBjYW4gcmVjZWl2ZSBhIDpjbGFzczpgX3F1ZXJ5LlF1ZXJ5YApvYmplY3QgYW5kCnJldHVybiBhIG5ldyBvbmUuICAgVGhlIDpjbGFzczpgX3F1ZXJ5LlF1ZXJ5YCBvYmplY3QgaW5jbHVkZXMgYSBtZXRob2QKOm1ldGg6YC53aXRoX3RyYW5zZm9ybWF0aW9uYCB0aGF0IHJldHVybnMgYSBuZXcgOmNsYXNzOmBfcXVlcnkuUXVlcnlgCnRyYW5zZm9ybWVkIGJ5CnRoZSBnaXZlbiBmdW5jdGlvbi4KCldlIGNhbiBjb21iaW5lIHRoaXMgd2l0aCB0aGUgOmNsYXNzOmAuQ29tcGFyYXRvcmAgY2xhc3MgdG8gcHJvZHVjZSBvbmUgdHlwZQpvZiByZWNpcGUgd2hpY2ggY2FuIGJvdGggc2V0IHVwIHRoZSBGUk9NIGNsYXVzZSBvZiBhIHF1ZXJ5IGFzIHdlbGwgYXMgYXNzaWduCmZpbHRlcmluZyBjcml0ZXJpb24uCgpDb25zaWRlciBhIG1hcHBlZCBjbGFzcyBgYE5vZGVgYCwgd2hpY2ggYXNzZW1ibGVzIHVzaW5nIGFkamFjZW5jeSBsaXN0IGludG8gYQpoaWVyYXJjaGljYWwgdHJlZSBwYXR0ZXJuOjoKCiAgICBmcm9tIHNxbGFsY2hlbXkgaW1wb3J0IENvbHVtbiwgSW50ZWdlciwgRm9yZWlnbktleQogICAgZnJvbSBzcWxhbGNoZW15Lm9ybSBpbXBvcnQgcmVsYXRpb25zaGlwCiAgICBmcm9tIHNxbGFsY2hlbXkuZXh0LmRlY2xhcmF0aXZlIGltcG9ydCBkZWNsYXJhdGl2ZV9iYXNlCiAgICBCYXNlID0gZGVjbGFyYXRpdmVfYmFzZSgpCgogICAgY2xhc3MgTm9kZShCYXNlKToKICAgICAgICBfX3RhYmxlbmFtZV9fID0gJ25vZGUnCiAgICAgICAgaWQgPSBDb2x1bW4oSW50ZWdlciwgcHJpbWFyeV9rZXk9VHJ1ZSkKICAgICAgICBwYXJlbnRfaWQgPSBDb2x1bW4oSW50ZWdlciwgRm9yZWlnbktleSgnbm9kZS5pZCcpKQogICAgICAgIHBhcmVudCA9IHJlbGF0aW9uc2hpcCgiTm9kZSIsIHJlbW90ZV9zaWRlPWlkKQoKU3VwcG9zZSB3ZSB3YW50ZWQgdG8gYWRkIGFuIGFjY2Vzc29yIGBgZ3JhbmRwYXJlbnRgYC4gIFRoaXMgd291bGQgcmV0dXJuIHRoZQpgYHBhcmVudGBgIG9mIGBgTm9kZS5wYXJlbnRgYC4gIFdoZW4gd2UgaGF2ZSBhbiBpbnN0YW5jZSBvZiBgYE5vZGVgYCwgdGhpcyBpcwpzaW1wbGU6OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBoeWJyaWRfcHJvcGVydHkKCiAgICBjbGFzcyBOb2RlKEJhc2UpOgogICAgICAgICMgLi4uCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5wYXJlbnQKCkZvciB0aGUgZXhwcmVzc2lvbiwgdGhpbmdzIGFyZSBub3Qgc28gY2xlYXIuICAgV2UnZCBuZWVkIHRvIGNvbnN0cnVjdCBhCjpjbGFzczpgX3F1ZXJ5LlF1ZXJ5YCB3aGVyZSB3ZSA6bWV0aDpgX3F1ZXJ5LlF1ZXJ5LmpvaW5gIHR3aWNlIGFsb25nCmBgTm9kZS5wYXJlbnRgYCB0byBnZXQgdG8gdGhlIGBgZ3JhbmRwYXJlbnRgYC4gICBXZSBjYW4gaW5zdGVhZCByZXR1cm4gYQp0cmFuc2Zvcm1pbmcgY2FsbGFibGUgdGhhdCB3ZSdsbCBjb21iaW5lIHdpdGggdGhlIDpjbGFzczpgLkNvbXBhcmF0b3JgIGNsYXNzIHRvCnJlY2VpdmUgYW55IDpjbGFzczpgX3F1ZXJ5LlF1ZXJ5YCBvYmplY3QsIGFuZCByZXR1cm4gYSBuZXcgb25lIHRoYXQncyBqb2luZWQgdG8KdGhlIGBgTm9kZS5wYXJlbnRgYCBhdHRyaWJ1dGUgYW5kIGZpbHRlcmVkIGJhc2VkIG9uIHRoZSBnaXZlbiBjcml0ZXJpb246OgoKICAgIGZyb20gc3FsYWxjaGVteS5leHQuaHlicmlkIGltcG9ydCBDb21wYXJhdG9yCgogICAgY2xhc3MgR3JhbmRwYXJlbnRUcmFuc2Zvcm1lcihDb21wYXJhdG9yKToKICAgICAgICBkZWYgb3BlcmF0ZShzZWxmLCBvcCwgb3RoZXIpOgogICAgICAgICAgICBkZWYgdHJhbnNmb3JtKHEpOgogICAgICAgICAgICAgICAgY2xzID0gc2VsZi5fX2NsYXVzZV9lbGVtZW50X18oKQogICAgICAgICAgICAgICAgcGFyZW50X2FsaWFzID0gYWxpYXNlZChjbHMpCiAgICAgICAgICAgICAgICByZXR1cm4gcS5qb2luKHBhcmVudF9hbGlhcywgY2xzLnBhcmVudCkuXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKG9wKHBhcmVudF9hbGlhcy5wYXJlbnQsIG90aGVyKSkKICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybQoKICAgIEJhc2UgPSBkZWNsYXJhdGl2ZV9iYXNlKCkKCiAgICBjbGFzcyBOb2RlKEJhc2UpOgogICAgICAgIF9fdGFibGVuYW1lX18gPSAnbm9kZScKICAgICAgICBpZCA9IENvbHVtbihJbnRlZ2VyLCBwcmltYXJ5X2tleT1UcnVlKQogICAgICAgIHBhcmVudF9pZCA9IENvbHVtbihJbnRlZ2VyLCBGb3JlaWduS2V5KCdub2RlLmlkJykpCiAgICAgICAgcGFyZW50ID0gcmVsYXRpb25zaGlwKCJOb2RlIiwgcmVtb3RlX3NpZGU9aWQpCgogICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoc2VsZik6CiAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5wYXJlbnQKCiAgICAgICAgQGdyYW5kcGFyZW50LmNvbXBhcmF0b3IKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoY2xzKToKICAgICAgICAgICAgcmV0dXJuIEdyYW5kcGFyZW50VHJhbnNmb3JtZXIoY2xzKQoKVGhlIGBgR3JhbmRwYXJlbnRUcmFuc2Zvcm1lcmBgIG92ZXJyaWRlcyB0aGUgY29yZSA6bWV0aDpgLk9wZXJhdG9ycy5vcGVyYXRlYAptZXRob2QgYXQgdGhlIGJhc2Ugb2YgdGhlIDpjbGFzczpgLkNvbXBhcmF0b3JgIGhpZXJhcmNoeSB0byByZXR1cm4gYSBxdWVyeS0KdHJhbnNmb3JtaW5nIGNhbGxhYmxlLCB3aGljaCB0aGVuIHJ1bnMgdGhlIGdpdmVuIGNvbXBhcmlzb24gb3BlcmF0aW9uIGluIGEKcGFydGljdWxhciBjb250ZXh0LiBTdWNoIGFzLCBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGBgb3BlcmF0ZWBgIG1ldGhvZCBpcwpjYWxsZWQsIGdpdmVuIHRoZSA6YXR0cjpgLk9wZXJhdG9ycy5lcWAgY2FsbGFibGUgYXMgd2VsbCBhcyB0aGUgcmlnaHQgc2lkZSBvZgp0aGUgY29tcGFyaXNvbiBgYE5vZGUoaWQ9NSlgYC4gIEEgZnVuY3Rpb24gYGB0cmFuc2Zvcm1gYCBpcyB0aGVuIHJldHVybmVkIHdoaWNoCndpbGwgdHJhbnNmb3JtIGEgOmNsYXNzOmBfcXVlcnkuUXVlcnlgIGZpcnN0IHRvIGpvaW4gdG8gYGBOb2RlLnBhcmVudGBgLAp0aGVuIHRvCmNvbXBhcmUgYGBwYXJlbnRfYWxpYXNgYCB1c2luZyA6YXR0cjpgLk9wZXJhdG9ycy5lcWAgYWdhaW5zdCB0aGUgbGVmdCBhbmQgcmlnaHQKc2lkZXMsIHBhc3NpbmcgaW50byA6bWV0aDpgX3F1ZXJ5LlF1ZXJ5LmZpbHRlcmA6CgouLiBzb3VyY2Vjb2RlOjogcHljb24rc3FsCgogICAgPj4+IGZyb20gc3FsYWxjaGVteS5vcm0gaW1wb3J0IFNlc3Npb24KICAgID4+PiBzZXNzaW9uID0gU2Vzc2lvbigpCiAgICB7c3FsfT4+PiBzZXNzaW9uLnF1ZXJ5KE5vZGUpLlwKICAgIC4uLiAgICAgICAgd2l0aF90cmFuc2Zvcm1hdGlvbihOb2RlLmdyYW5kcGFyZW50PT1Ob2RlKGlkPTUpKS5cCiAgICAuLi4gICAgICAgIGFsbCgpCiAgICBTRUxFQ1Qgbm9kZS5pZCBBUyBub2RlX2lkLCBub2RlLnBhcmVudF9pZCBBUyBub2RlX3BhcmVudF9pZAogICAgRlJPTSBub2RlIEpPSU4gbm9kZSBBUyBub2RlXzEgT04gbm9kZV8xLmlkID0gbm9kZS5wYXJlbnRfaWQKICAgIFdIRVJFIDpwYXJhbV8xID0gbm9kZV8xLnBhcmVudF9pZAogICAge3N0b3B9CgpXZSBjYW4gbW9kaWZ5IHRoZSBwYXR0ZXJuIHRvIGJlIG1vcmUgdmVyYm9zZSBidXQgZmxleGlibGUgYnkgc2VwYXJhdGluZyB0aGUKImpvaW4iIHN0ZXAgZnJvbSB0aGUgImZpbHRlciIgc3RlcC4gIFRoZSB0cmlja3kgcGFydCBoZXJlIGlzIGVuc3VyaW5nIHRoYXQKc3VjY2Vzc2l2ZSBpbnN0YW5jZXMgb2YgYGBHcmFuZHBhcmVudFRyYW5zZm9ybWVyYGAgdXNlIHRoZSBzYW1lCjpjbGFzczpgLkFsaWFzZWRDbGFzc2Agb2JqZWN0IGFnYWluc3QgYGBOb2RlYGAuICBCZWxvdyB3ZSB1c2UgYSBzaW1wbGUKbWVtb2l6aW5nIGFwcHJvYWNoIHRoYXQgYXNzb2NpYXRlcyBhIGBgR3JhbmRwYXJlbnRUcmFuc2Zvcm1lcmBgIHdpdGggZWFjaApjbGFzczo6CgogICAgY2xhc3MgTm9kZShCYXNlKToKCiAgICAgICAgIyAuLi4KCiAgICAgICAgQGdyYW5kcGFyZW50LmNvbXBhcmF0b3IKICAgICAgICBkZWYgZ3JhbmRwYXJlbnQoY2xzKToKICAgICAgICAgICAgIyBtZW1vaXplIGEgR3JhbmRwYXJlbnRUcmFuc2Zvcm1lcgogICAgICAgICAgICAjIHBlciBjbGFzcwogICAgICAgICAgICBpZiAnX2dwJyBub3QgaW4gY2xzLl9fZGljdF9fOgogICAgICAgICAgICAgICAgY2xzLl9ncCA9IEdyYW5kcGFyZW50VHJhbnNmb3JtZXIoY2xzKQogICAgICAgICAgICByZXR1cm4gY2xzLl9ncAoKICAgIGNsYXNzIEdyYW5kcGFyZW50VHJhbnNmb3JtZXIoQ29tcGFyYXRvcik6CgogICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjbHMpOgogICAgICAgICAgICBzZWxmLnBhcmVudF9hbGlhcyA9IGFsaWFzZWQoY2xzKQoKICAgICAgICBAcHJvcGVydHkKICAgICAgICBkZWYgam9pbihzZWxmKToKICAgICAgICAgICAgZGVmIGdvKHEpOgogICAgICAgICAgICAgICAgcmV0dXJuIHEuam9pbihzZWxmLnBhcmVudF9hbGlhcywgTm9kZS5wYXJlbnQpCiAgICAgICAgICAgIHJldHVybiBnbwoKICAgICAgICBkZWYgb3BlcmF0ZShzZWxmLCBvcCwgb3RoZXIpOgogICAgICAgICAgICByZXR1cm4gb3Aoc2VsZi5wYXJlbnRfYWxpYXMucGFyZW50LCBvdGhlcikKCi4uIHNvdXJjZWNvZGU6OiBweWNvbitzcWwKCiAgICB7c3FsfT4+PiBzZXNzaW9uLnF1ZXJ5KE5vZGUpLlwKICAgIC4uLiAgICAgICAgICAgIHdpdGhfdHJhbnNmb3JtYXRpb24oTm9kZS5ncmFuZHBhcmVudC5qb2luKS5cCiAgICAuLi4gICAgICAgICAgICBmaWx0ZXIoTm9kZS5ncmFuZHBhcmVudD09Tm9kZShpZD01KSkKICAgIFNFTEVDVCBub2RlLmlkIEFTIG5vZGVfaWQsIG5vZGUucGFyZW50X2lkIEFTIG5vZGVfcGFyZW50X2lkCiAgICBGUk9NIG5vZGUgSk9JTiBub2RlIEFTIG5vZGVfMSBPTiBub2RlXzEuaWQgPSBub2RlLnBhcmVudF9pZAogICAgV0hFUkUgOnBhcmFtXzEgPSBub2RlXzEucGFyZW50X2lkCiAgICB7c3RvcH0KClRoZSAidHJhbnNmb3JtZXIiIHBhdHRlcm4gaXMgYW4gZXhwZXJpbWVudGFsIHBhdHRlcm4gdGhhdCBzdGFydHMgdG8gbWFrZSB1c2FnZQpvZiBzb21lIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgcGFyYWRpZ21zLiBXaGlsZSBpdCdzIG9ubHkgcmVjb21tZW5kZWQgZm9yCmFkdmFuY2VkIGFuZC9vciBwYXRpZW50IGRldmVsb3BlcnMsIHRoZXJlJ3MgcHJvYmFibHkgYSB3aG9sZSBsb3Qgb2YgYW1hemluZwp0aGluZ3MgaXQgY2FuIGJlIHVzZWQgZm9yLgoK6QIAAAApAdoEdXRpbCkB2gphdHRyaWJ1dGVzKQHaCmludGVyZmFjZXPaDUhZQlJJRF9NRVRIT0TaD0hZQlJJRF9QUk9QRVJUWWMAAAAAAAAAAAAAAAACAAAAAAAAAPMuAAAAlwBlAFoBZABaAmQBWgNkAloEZQVaBmQHZASEAVoHZAWEAFoIZAaEAFoJZANTACkI2g1oeWJyaWRfbWV0aG9kenpBIGRlY29yYXRvciB3aGljaCBhbGxvd3MgZGVmaW5pdGlvbiBvZiBhIFB5dGhvbiBvYmplY3QgbWV0aG9kIHdpdGggYm90aAogICAgaW5zdGFuY2UtbGV2ZWwgYW5kIGNsYXNzLWxldmVsIGJlaGF2aW9yLgoKICAgIFROYwMAAAAAAAAAAAAAAAMAAAADAAAA80IAAACXAHwBfABfAAAAAAAAAAAAfACgAQAAAAAAAAAAAAAAAAAAAAAAAAAAfAJwAXwBpgEA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b20KICAgICAgICBhIHBhcmVudCBjbGFzcywgd2lsbCBkZS1yZWZlcmVuY2UgdGhlICJpbnN0cnVtZW50ZWQgYXR0cmlidXRlIgogICAgICAgIG5vcm1hbGx5IHJldHVybmVkIGF0IHRoaXMgbGV2ZWwsIGFuZCBhbGxvdyBtb2RpZnlpbmcgZGVjb3JhdG9ycwogICAgICAgIGxpa2UgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuZXhwcmVzc2lvbmAgYW5kCiAgICAgICAgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuY29tcGFyYXRvcmAKICAgICAgICB0byBiZSB1c2VkIHdpdGhvdXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgc2FtZS1uYW1lZCBhdHRyaWJ1dGVzCiAgICAgICAgbm9ybWFsbHkgcHJlc2VudCBvbiB0aGUgOmNsYXNzOmAuUXVlcnlhYmxlQXR0cmlidXRlYDo6CgogICAgICAgICAgICBjbGFzcyBTdXBlckNsYXNzKG9iamVjdCk6CiAgICAgICAgICAgICAgICAjIC4uLgoKICAgICAgICAgICAgICAgIEBoeWJyaWRfcHJvcGVydHkKICAgICAgICAgICAgICAgIGRlZiBmb29iYXIoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2Zvb2JhcgoKICAgICAgICAgICAgY2xhc3MgU3ViQ2xhc3MoU3VwZXJDbGFzcyk6CiAgICAgICAgICAgICAgICAjIC4uLgoKICAgICAgICAgICAgICAgIEBTdXBlckNsYXNzLmZvb2Jhci5vdmVycmlkZXMuZXhwcmVzc2lvbgogICAgICAgICAgICAgICAgZGVmIGZvb2JhcihjbHMpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jLnN1YmZvb2JhcihzZWxmLl9mb29iYXIpCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDEuMgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YGh5YnJpZF9yZXVzZV9zdWJjbGFzc2AKCiAgICAgICAgciEAAACpAXINAAAAcwEAAAAgcg8AAADaCW92ZXJyaWRlc3oZaHlicmlkX3Byb3BlcnR5Lm92ZXJyaWRlc5kDAABzCgAAAIAA8EQBABAUiAtyEQAAAGMCAAAAAAAAAAAAAAADAAAAAwAAAPMuAAAAlwB8AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AawBpgEAAKsBAAAAAAAAAABTACkCemRQcm92aWRlIGEgbW9kaWZ5aW5nIGRlY29yYXRvciB0aGF0IGRlZmluZXMgYSBnZXR0ZXIgbWV0aG9kLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjIKCiAgICAgICAgKQFyJQAAAKkBckAAAAApAnINAAAAciUAAABzAgAAACAgcg8AAADaBmdldHRlcnoWaHlicmlkX3Byb3BlcnR5LmdldHRlcr0DAABzGAAAAIAA8A4AEBSPeop6mHSIetEPJNQPJNAIJHIRAAAAYwIAAAAAAAAAAAAAAAMAAAADAAAA8y4AAACXAHwAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwBrAGmAQAAqwEAAAAAAAAAAFMAKQJ6O1Byb3ZpZGUgYSBtb2RpZnlpbmcgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBhIHNldHRlciBtZXRob2QuKQFyJgAAAHJFAAAAKQJyDQAAAHImAAAAcwIAAAAgIHIPAAAA2gZzZXR0ZXJ6Fmh5YnJpZF9wcm9wZXJ0eS5zZXR0ZXLGAwAA8xgAAACAAPAGABAUj3qKeph0iHrRDyTUDyTQCCRyEQAAAGMCAAAAAAAAAAAAAAADAAAAAwAAAPMuAAAAlwB8AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AawBpgEAAKsBAAAAAAAAAABTACkCej1Qcm92aWRlIGEgbW9kaWZ5aW5nIGRlY29yYXRvciB0aGF0IGRlZmluZXMgYSBkZWxldGlvbiBtZXRob2QuKQFyJwAAAHJFAAAAKQJyDQAAAHInAAAAcwIAAAAgIHIPAAAA2gdkZWxldGVyehdoeWJyaWRfcHJvcGVydHkuZGVsZXRlcssDAABySQAAAHIRAAAAYwIAAAAAAAAAAAAAAAMAAAADAAAA8y4AAACXAHwAoAAAAAAAAAAAAAAAAAAAAAAAAAAAAHwBrAGmAQAAqwEAAAAAAAAAAFMAKQJhIQUAAFByb3ZpZGUgYSBtb2RpZnlpbmcgZGVjb3JhdG9yIHRoYXQgZGVmaW5lcyBhIFNRTC1leHByZXNzaW9uCiAgICAgICAgcHJvZHVjaW5nIG1ldGhvZC4KCiAgICAgICAgV2hlbiBhIGh5YnJpZCBpcyBpbnZva2VkIGF0IHRoZSBjbGFzcyBsZXZlbCwgdGhlIFNRTCBleHByZXNzaW9uIGdpdmVuCiAgICAgICAgaGVyZSBpcyB3cmFwcGVkIGluc2lkZSBvZiBhIHNwZWNpYWxpemVkIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAsCiAgICAgICAgd2hpY2ggaXMgdGhlIHNhbWUga2luZCBvZiBvYmplY3QgdXNlZCBieSB0aGUgT1JNIHRvIHJlcHJlc2VudCBvdGhlcgogICAgICAgIG1hcHBlZCBhdHRyaWJ1dGVzLiAgIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgc28gdGhhdCBvdGhlciBjbGFzcy1sZXZlbAogICAgICAgIGF0dHJpYnV0ZXMgc3VjaCBhcyBkb2NzdHJpbmdzIGFuZCBhIHJlZmVyZW5jZSB0byB0aGUgaHlicmlkIGl0c2VsZiBtYXkKICAgICAgICBiZSBtYWludGFpbmVkIHdpdGhpbiB0aGUgc3RydWN0dXJlIHRoYXQncyByZXR1cm5lZCwgd2l0aG91dCBhbnkKICAgICAgICBtb2RpZmljYXRpb25zIHRvIHRoZSBvcmlnaW5hbCBTUUwgZXhwcmVzc2lvbiBwYXNzZWQgaW4uCgogICAgICAgIC4uIG5vdGU6OgoKICAgICAgICAgICBXaGVuIHJlZmVycmluZyB0byBhIGh5YnJpZCBwcm9wZXJ0eSAgZnJvbSBhbiBvd25pbmcgY2xhc3MgKGUuZy4KICAgICAgICAgICBgYFNvbWVDbGFzcy5zb21lX2h5YnJpZGBgKSwgYW4gaW5zdGFuY2Ugb2YKICAgICAgICAgICA6Y2xhc3M6YC5RdWVyeWFibGVBdHRyaWJ1dGVgIGlzIHJldHVybmVkLCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgZXhwcmVzc2lvbiBvciBjb21wYXJhdG9yIG9iamVjdCBhcyB3ZWxsIGFzIHRoaXMgIGh5YnJpZCBvYmplY3QuCiAgICAgICAgICAgSG93ZXZlciwgdGhhdCBvYmplY3QgaXRzZWxmIGhhcyBhY2Nlc3NvcnMgY2FsbGVkIGBgZXhwcmVzc2lvbmBgIGFuZAogICAgICAgICAgIGBgY29tcGFyYXRvcmBgOyBzbyB3aGVuIGF0dGVtcHRpbmcgdG8gb3ZlcnJpZGUgdGhlc2UgZGVjb3JhdG9ycyBvbiBhCiAgICAgICAgICAgc3ViY2xhc3MsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gcXVhbGlmeSBpdCB1c2luZyB0aGUKICAgICAgICAgICA6YXR0cjpgLmh5YnJpZF9wcm9wZXJ0eS5vdmVycmlkZXNgIG1vZGlmaWVyIGZpcnN0LiAgU2VlIHRoYXQKICAgICAgICAgICBtb2RpZmllciBmb3IgZGV0YWlscy4KCiAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBoeWJyaWRfZGlzdGluY3RfZXhwcmVzc2lvbmAKCiAgICAgICAgKQFyDgAAAHJFAAAAchsAAABzAgAAACAgcg8AAAByDAAAAHoaaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb27QAwAAcxgAAACAAPA8ABAUj3qKeph0iHrRDyTUDyTQCCRyEQAAAGMCAAAAAAAAAAAAAAADAAAAAwAAAPMuAAAAlwB8AKAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8AawBpgEAAKsBAAAAAAAAAABTACkCYS8GAABQcm92aWRlIGEgbW9kaWZ5aW5nIGRlY29yYXRvciB0aGF0IGRlZmluZXMgYSBjdXN0b20KICAgICAgICBjb21wYXJhdG9yIHByb2R1Y2luZyBtZXRob2QuCgogICAgICAgIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGRlY29yYXRlZCBtZXRob2Qgc2hvdWxkIGJlIGFuIGluc3RhbmNlIG9mCiAgICAgICAgOmNsYXNzOmB+Lmh5YnJpZC5Db21wYXJhdG9yYC4KCiAgICAgICAgLi4gbm90ZTo6ICBUaGUgOm1ldGg6YC5oeWJyaWRfcHJvcGVydHkuY29tcGFyYXRvcmAgZGVjb3JhdG9yCiAgICAgICAgICAgKipyZXBsYWNlcyoqIHRoZSB1c2Ugb2YgdGhlIDptZXRoOmAuaHlicmlkX3Byb3BlcnR5LmV4cHJlc3Npb25gCiAgICAgICAgICAgZGVjb3JhdG9yLiAgVGhleSBjYW5ub3QgYmUgdXNlZCB0b2dldGhlci4KCiAgICAgICAgV2hlbiBhIGh5YnJpZCBpcyBpbnZva2VkIGF0IHRoZSBjbGFzcyBsZXZlbCwgdGhlCiAgICAgICAgOmNsYXNzOmB+Lmh5YnJpZC5Db21wYXJhdG9yYCBvYmplY3QgZ2l2ZW4gaGVyZSBpcyB3cmFwcGVkIGluc2lkZSBvZiBhCiAgICAgICAgc3BlY2lhbGl6ZWQgOmNsYXNzOmAuUXVlcnlhYmxlQXR0cmlidXRlYCwgd2hpY2ggaXMgdGhlIHNhbWUga2luZCBvZgogICAgICAgIG9iamVjdCB1c2VkIGJ5IHRoZSBPUk0gdG8gcmVwcmVzZW50IG90aGVyIG1hcHBlZCBhdHRyaWJ1dGVzLiAgIFRoZQogICAgICAgIHJlYXNvbiBmb3IgdGhpcyBpcyBzbyB0aGF0IG90aGVyIGNsYXNzLWxldmVsIGF0dHJpYnV0ZXMgc3VjaCBhcwogICAgICAgIGRvY3N0cmluZ3MgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBoeWJyaWQgaXRzZWxmIG1heSBiZSBtYWludGFpbmVkCiAgICAgICAgd2l0aGluIHRoZSBzdHJ1Y3R1cmUgdGhhdCdzIHJldHVybmVkLCB3aXRob3V0IGFueSBtb2RpZmljYXRpb25zIHRvIHRoZQogICAgICAgIG9yaWdpbmFsIGNvbXBhcmF0b3Igb2JqZWN0IHBhc3NlZCBpbi4KCiAgICAgICAgLi4gbm90ZTo6CgogICAgICAgICAgIFdoZW4gcmVmZXJyaW5nIHRvIGEgaHlicmlkIHByb3BlcnR5ICBmcm9tIGFuIG93bmluZyBjbGFzcyAoZS5nLgogICAgICAgICAgIGBgU29tZUNsYXNzLnNvbWVfaHlicmlkYGApLCBhbiBpbnN0YW5jZSBvZgogICAgICAgICAgIDpjbGFzczpgLlF1ZXJ5YWJsZUF0dHJpYnV0ZWAgaXMgcmV0dXJuZWQsIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICBleHByZXNzaW9uIG9yIGNvbXBhcmF0b3Igb2JqZWN0IGFzIHRoaXMgIGh5YnJpZCBvYmplY3QuICBIb3dldmVyLAogICAgICAgICAgIHRoYXQgb2JqZWN0IGl0c2VsZiBoYXMgYWNjZXNzb3JzIGNhbGxlZCBgYGV4cHJlc3Npb25gYCBhbmQKICAgICAgICAgICBgYGNvbXBhcmF0b3JgYDsgc28gd2hlbiBhdHRlbXB0aW5nIHRvIG92ZXJyaWRlIHRoZXNlIGRlY29yYXRvcnMgb24gYQogICAgICAgICAgIHN1YmNsYXNzLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHF1YWxpZnkgaXQgdXNpbmcgdGhlCiAgICAgICAgICAgOmF0dHI6YC5oeWJyaWRfcHJvcGVydHkub3ZlcnJpZGVzYCBtb2RpZmllciBmaXJzdC4gIFNlZSB0aGF0CiAgICAgICAgICAgbW9kaWZpZXIgZm9yIGRldGFpbHMuCgogICAgICAgICkBcigAAAByRQAAACkCcg0AAADaCmNvbXBhcmF0b3JzAgAAACAgcg8AAAByTgAAAHoaaHlicmlkX3Byb3BlcnR5LmNvbXBhcmF0b3LwAwAAcxkAAACAAPBCAQAQFI96inqoSoh60Q831A830Ag3chEAAABjAgAAAAAAAAAAAAAAAwAAAAMAAADzLgAAAJcAfACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAfAGsAaYBAACrAQAAAAAAAAAAUwApAmFNBAAAUHJvdmlkZSBhIG1vZGlmeWluZyBkZWNvcmF0b3IgdGhhdCBkZWZpbmVzIGFuIFVQREFURSB0dXBsZQogICAgICAgIHByb2R1Y2luZyBtZXRob2QuCgogICAgICAgIFRoZSBtZXRob2QgYWNjZXB0cyBhIHNpbmdsZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIHZhbHVlIHRvIGJlCiAgICAgICAgcmVuZGVyZWQgaW50byB0aGUgU0VUIGNsYXVzZSBvZiBhbiBVUERBVEUgc3RhdGVtZW50LiAgVGhlIG1ldGhvZAogICAgICAgIHNob3VsZCB0aGVuIHByb2Nlc3MgdGhpcyB2YWx1ZSBpbnRvIGluZGl2aWR1YWwgY29sdW1uIGV4cHJlc3Npb25zCiAgICAgICAgdGhhdCBmaXQgaW50byB0aGUgdWx0aW1hdGUgU0VUIGNsYXVzZSwgYW5kIHJldHVybiB0aGVtIGFzIGEKICAgICAgICBzZXF1ZW5jZSBvZiAyLXR1cGxlcy4gIEVhY2ggdHVwbGUKICAgICAgICBjb250YWlucyBhIGNvbHVtbiBleHByZXNzaW9uIGFzIHRoZSBrZXkgYW5kIGEgdmFsdWUgdG8gYmUgcmVuZGVyZWQuCgogICAgICAgIEUuZy46OgoKICAgICAgICAgICAgY2xhc3MgUGVyc29uKEJhc2UpOgogICAgICAgICAgICAgICAgIyAuLi4KCiAgICAgICAgICAgICAgICBmaXJzdF9uYW1lID0gQ29sdW1uKFN0cmluZykKICAgICAgICAgICAgICAgIGxhc3RfbmFtZSA9IENvbHVtbihTdHJpbmcpCgogICAgICAgICAgICAgICAgQGh5YnJpZF9wcm9wZXJ0eQogICAgICAgICAgICAgICAgZGVmIGZ1bGxuYW1lKHNlbGYpOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmaXJzdF9uYW1lICsgIiAiICsgbGFzdF9uYW1lCgogICAgICAgICAgICAgICAgQGZ1bGxuYW1lLnVwZGF0ZV9leHByZXNzaW9uCiAgICAgICAgICAgICAgICBkZWYgZnVsbG5hbWUoY2xzLCB2YWx1ZSk6CiAgICAgICAgICAgICAgICAgICAgZm5hbWUsIGxuYW1lID0gdmFsdWUuc3BsaXQoIiAiLCAxKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICAgICAgICAgIChjbHMuZmlyc3RfbmFtZSwgZm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAoY2xzLmxhc3RfbmFtZSwgbG5hbWUpCiAgICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjIKCiAgICAgICAgKQFyKQAAAHJFAAAAKQJyDQAAANoEbWV0aHMCAAAAICByDwAAANoRdXBkYXRlX2V4cHJlc3Npb256IWh5YnJpZF9wcm9wZXJ0eS51cGRhdGVfZXhwcmVzc2lvbhMEAABzGQAAAIAA8EQBABAUj3qKeqBkiHrRDyvUDyvQCCtyEQAAAGMBAAAAAAAAAAAAAAADAAAAAwAAAPO6AAAAlwB8AGoA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
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-311.pyc
73.70 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
automap.cpython-311.pyc
40.42 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
baked.cpython-311.pyc
30.16 KB
lrw-r--r--
2026-02-06 08:01:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
compiler.cpython-311.pyc
17.69 KB
lrw-r--r--
2026-02-06 08:01:46
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
horizontal_shard.cpython-311.pyc
10.96 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
hybrid.cpython-311.pyc
43.92 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
indexable.cpython-311.pyc
12.78 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
instrumentation.cpython-311.pyc
20.14 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
mutable.cpython-311.pyc
42.24 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
orderinglist.cpython-311.pyc
17.78 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
serializer.cpython-311.pyc
7.73 KB
lrw-r--r--
2026-01-20 13:01:47
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-311.pyc
363 B
lrw-r--r--
2026-02-06 08:01:46
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).