REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 53.04 KB
Close
//proc/thread-self/root/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/__pycache__/events.cpython-37.pyc
Text
Base64
Qg0NCgAAAADDzDRd1ckAAOMAAAAAAAAAAAAAAAAEAAAAQAAAAHOwAAAAZABaAGQBZAJsAW0CWgIBAGQBZANsAW0DWgMBAGQBZARsAW0EWgQBAGQBZAVsBW0GWgYBAGQBZAZsBW0HWgcBAGQBZAdsBW0IWggBAGQBZAhsCW0KWgoBAGQBZAlsC20MWgwBAEcAZApkC4QAZAtlAmoNgwNaDkcAZAxkDYQAZA1lAmoNgwNaD0cAZA5kD4QAZA9lAmoNgwNaEEcAZBBkEYQAZBFlAmoNgwNaEWQSUwApE3oWQ29yZSBldmVudCBpbnRlcmZhY2VzLukBAAAAKQHaBWV2ZW50KQHaA2V4YykB2gR1dGlsKQHaC0Nvbm5lY3RhYmxlKQHaB0RpYWxlY3QpAdoGRW5naW5lKQHaBFBvb2wpAdoRU2NoZW1hRXZlbnRUYXJnZXRjAAAAAAAAAAAAAAAAAgAAAEAAAABzUAAAAGUAWgFkAFoCZAFaA2QCWgRlBVoGZANkBIQAWgdkBWQGhABaCGQHZAiEAFoJZAlkCoQAWgpkC2QMhABaC2QNZA6EAFoMZA9kEIQAWg1kEVMAKRLaCURETEV2ZW50c2FsCQAACiAgICBEZWZpbmUgZXZlbnQgbGlzdGVuZXJzIGZvciBzY2hlbWEgb2JqZWN0cywKICAgIHRoYXQgaXMsIDpjbGFzczpgLlNjaGVtYUl0ZW1gIGFuZCBvdGhlciA6Y2xhc3M6YC5TY2hlbWFFdmVudFRhcmdldGAKICAgIHN1YmNsYXNzZXMsIGluY2x1ZGluZyA6Y2xhc3M6YC5NZXRhRGF0YWAsIDpjbGFzczpgLlRhYmxlYCwKICAgIDpjbGFzczpgLkNvbHVtbmAuCgogICAgOmNsYXNzOmAuTWV0YURhdGFgIGFuZCA6Y2xhc3M6YC5UYWJsZWAgc3VwcG9ydCBldmVudHMKICAgIHNwZWNpZmljYWxseSByZWdhcmRpbmcgd2hlbiBDUkVBVEUgYW5kIERST1AKICAgIERETCBpcyBlbWl0dGVkIHRvIHRoZSBkYXRhYmFzZS4KCiAgICBBdHRhY2htZW50IGV2ZW50cyBhcmUgYWxzbyBwcm92aWRlZCB0byBjdXN0b21pemUKICAgIGJlaGF2aW9yIHdoZW5ldmVyIGEgY2hpbGQgc2NoZW1hIGVsZW1lbnQgaXMgYXNzb2NpYXRlZAogICAgd2l0aCBhIHBhcmVudCwgc3VjaCBhcywgd2hlbiBhIDpjbGFzczpgLkNvbHVtbmAgaXMgYXNzb2NpYXRlZAogICAgd2l0aCBpdHMgOmNsYXNzOmAuVGFibGVgLCB3aGVuIGEgOmNsYXNzOmAuRm9yZWlnbktleUNvbnN0cmFpbnRgCiAgICBpcyBhc3NvY2lhdGVkIHdpdGggYSA6Y2xhc3M6YC5UYWJsZWAsIGV0Yy4KCiAgICBFeGFtcGxlIHVzaW5nIHRoZSBgYGFmdGVyX2NyZWF0ZWBgIGV2ZW50OjoKCiAgICAgICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBldmVudAogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgVGFibGUsIENvbHVtbiwgTWV0YWRhdGEsIEludGVnZXIKCiAgICAgICAgbSA9IE1ldGFEYXRhKCkKICAgICAgICBzb21lX3RhYmxlID0gVGFibGUoJ3NvbWVfdGFibGUnLCBtLCBDb2x1bW4oJ2RhdGEnLCBJbnRlZ2VyKSkKCiAgICAgICAgZGVmIGFmdGVyX2NyZWF0ZSh0YXJnZXQsIGNvbm5lY3Rpb24sICoqa3cpOgogICAgICAgICAgICBjb25uZWN0aW9uLmV4ZWN1dGUoIkFMVEVSIFRBQkxFICVzIFNFVCBuYW1lPWZvb18lcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFyZ2V0Lm5hbWUsIHRhcmdldC5uYW1lKSkKCiAgICAgICAgZXZlbnQubGlzdGVuKHNvbWVfdGFibGUsICJhZnRlcl9jcmVhdGUiLCBhZnRlcl9jcmVhdGUpCgogICAgRERMIGV2ZW50cyBpbnRlZ3JhdGUgY2xvc2VseSB3aXRoIHRoZQogICAgOmNsYXNzOmAuRERMYCBjbGFzcyBhbmQgdGhlIDpjbGFzczpgLkRETEVsZW1lbnRgIGhpZXJhcmNoeQogICAgb2YgRERMIGNsYXVzZSBjb25zdHJ1Y3RzLCB3aGljaCBhcmUgdGhlbXNlbHZlcyBhcHByb3ByaWF0ZQogICAgYXMgbGlzdGVuZXIgY2FsbGFibGVzOjoKCiAgICAgICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBEREwKICAgICAgICBldmVudC5saXN0ZW4oCiAgICAgICAgICAgIHNvbWVfdGFibGUsCiAgICAgICAgICAgICJhZnRlcl9jcmVhdGUiLAogICAgICAgICAgICBEREwoIkFMVEVSIFRBQkxFICUodGFibGUpcyBTRVQgbmFtZT1mb29fJSh0YWJsZSlzIikKICAgICAgICApCgogICAgVGhlIG1ldGhvZHMgaGVyZSBkZWZpbmUgdGhlIG5hbWUgb2YgYW4gZXZlbnQgYXMgd2VsbAogICAgYXMgdGhlIG5hbWVzIG9mIG1lbWJlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGxpc3RlbmVyCiAgICBmdW5jdGlvbnMuCgogICAgRm9yIGFsbCA6Y2xhc3M6YC5ERExFdmVudGAgZXZlbnRzLCB0aGUgYGBwcm9wYWdhdGU9VHJ1ZWBgIGtleXdvcmQgYXJndW1lbnQKICAgIHdpbGwgZW5zdXJlIHRoYXQgYSBnaXZlbiBldmVudCBoYW5kbGVyIGlzIHByb3BhZ2F0ZWQgdG8gY29waWVzIG9mIHRoZQogICAgb2JqZWN0LCB3aGljaCBhcmUgbWFkZSB3aGVuIHVzaW5nIHRoZSA6bWV0aDpgLlRhYmxlLnRvbWV0YWRhdGFgIG1ldGhvZDo6CgogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgRERMCiAgICAgICAgZXZlbnQubGlzdGVuKAogICAgICAgICAgICBzb21lX3RhYmxlLAogICAgICAgICAgICAiYWZ0ZXJfY3JlYXRlIiwKICAgICAgICAgICAgRERMKCJBTFRFUiBUQUJMRSAlKHRhYmxlKXMgU0VUIG5hbWU9Zm9vXyUodGFibGUpcyIpLAogICAgICAgICAgICBwcm9wYWdhdGU9VHJ1ZQogICAgICAgICkKCiAgICAgICAgbmV3X3RhYmxlID0gc29tZV90YWJsZS50b21ldGFkYXRhKG5ld19tZXRhZGF0YSkKCiAgICBUaGUgYWJvdmUgOmNsYXNzOmAuRERMYCBvYmplY3Qgd2lsbCBhbHNvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUKICAgIDpjbGFzczpgLlRhYmxlYCBvYmplY3QgcmVwcmVzZW50ZWQgYnkgYGBuZXdfdGFibGVgYC4KCiAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgOnJlZjpgZXZlbnRfdG9wbGV2ZWxgCgogICAgICAgIDpjbGFzczpgLkRETEVsZW1lbnRgCgogICAgICAgIDpjbGFzczpgLkRETGAKCiAgICAgICAgOnJlZjpgc2NoZW1hX2RkbF9zZXF1ZW5jZXNgCgogICAgWhdTb21lU2NoZW1hQ2xhc3NPck9iamVjdGMDAAAAAAAAAAQAAAABAAAASwAAAHMEAAAAZAFTACkCYYcDAABDYWxsZWQgYmVmb3JlIENSRUFURSBzdGF0ZW1lbnRzIGFyZSBlbWl0dGVkLgoKICAgICAgICA6cGFyYW0gdGFyZ2V0OiB0aGUgOmNsYXNzOmAuTWV0YURhdGFgIG9yIDpjbGFzczpgLlRhYmxlYAogICAgICAgICBvYmplY3Qgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQuCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb246IHRoZSA6Y2xhc3M6YC5Db25uZWN0aW9uYCB3aGVyZSB0aGUKICAgICAgICAgQ1JFQVRFIHN0YXRlbWVudCBvciBzdGF0ZW1lbnRzIHdpbGwgYmUgZW1pdHRlZC4KICAgICAgICA6cGFyYW0gXCoqa3c6IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgcmVsZXZhbnQKICAgICAgICAgdG8gdGhlIGV2ZW50LiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZGljdGlvbmFyeQogICAgICAgICBtYXkgdmFyeSBhY3Jvc3MgcmVsZWFzZXMsIGFuZCBpbmNsdWRlIHRoZQogICAgICAgICBsaXN0IG9mIHRhYmxlcyBiZWluZyBnZW5lcmF0ZWQgZm9yIGEgbWV0YWRhdGEtbGV2ZWwKICAgICAgICAgZXZlbnQsIHRoZSBjaGVja2ZpcnN0IGZsYWcsIGFuZCBvdGhlcgogICAgICAgICBlbGVtZW50cyB1c2VkIGJ5IGludGVybmFsIGV2ZW50cy4KCiAgICAgICAgOmZ1bmM6YC5ldmVudC5saXN0ZW5gIGFsc28gYWNjZXB0cyB0aGUgYGBwcm9wYWdhdGU9VHJ1ZWBgCiAgICAgICAgbW9kaWZpZXIgZm9yIHRoaXMgZXZlbnQ7IHdoZW4gVHJ1ZSwgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHdpbGwKICAgICAgICBiZSBlc3RhYmxpc2hlZCBmb3IgYW55IGNvcGllcyBtYWRlIG9mIHRoZSB0YXJnZXQgb2JqZWN0LAogICAgICAgIGkuZS4gdGhvc2UgY29waWVzIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgOm1ldGg6YC5UYWJsZS50b21ldGFkYXRhYCBpcyB1c2VkLgoKICAgICAgICBOqQApBNoEc2VsZtoGdGFyZ2V02gpjb25uZWN0aW9u2gJrd3ILAAAAcgsAAAD6RC9vcHQvYWx0L3B5dGhvbjM3L2xpYjY0L3B5dGhvbjMuNy9zaXRlLXBhY2thZ2VzL3NxbGFsY2hlbXkvZXZlbnRzLnB52g1iZWZvcmVfY3JlYXRlYwAAAHMCAAAAABR6F0RETEV2ZW50cy5iZWZvcmVfY3JlYXRlYwMAAAAAAAAABAAAAAEAAABLAAAAcwQAAABkAVMAKQJhiAMAAENhbGxlZCBhZnRlciBDUkVBVEUgc3RhdGVtZW50cyBhcmUgZW1pdHRlZC4KCiAgICAgICAgOnBhcmFtIHRhcmdldDogdGhlIDpjbGFzczpgLk1ldGFEYXRhYCBvciA6Y2xhc3M6YC5UYWJsZWAKICAgICAgICAgb2JqZWN0IHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50LgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uOiB0aGUgOmNsYXNzOmAuQ29ubmVjdGlvbmAgd2hlcmUgdGhlCiAgICAgICAgIENSRUFURSBzdGF0ZW1lbnQgb3Igc3RhdGVtZW50cyBoYXZlIGJlZW4gZW1pdHRlZC4KICAgICAgICA6cGFyYW0gXCoqa3c6IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgcmVsZXZhbnQKICAgICAgICAgdG8gdGhlIGV2ZW50LiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZGljdGlvbmFyeQogICAgICAgICBtYXkgdmFyeSBhY3Jvc3MgcmVsZWFzZXMsIGFuZCBpbmNsdWRlIHRoZQogICAgICAgICBsaXN0IG9mIHRhYmxlcyBiZWluZyBnZW5lcmF0ZWQgZm9yIGEgbWV0YWRhdGEtbGV2ZWwKICAgICAgICAgZXZlbnQsIHRoZSBjaGVja2ZpcnN0IGZsYWcsIGFuZCBvdGhlcgogICAgICAgICBlbGVtZW50cyB1c2VkIGJ5IGludGVybmFsIGV2ZW50cy4KCiAgICAgICAgOmZ1bmM6YC5ldmVudC5saXN0ZW5gIGFsc28gYWNjZXB0cyB0aGUgYGBwcm9wYWdhdGU9VHJ1ZWBgCiAgICAgICAgbW9kaWZpZXIgZm9yIHRoaXMgZXZlbnQ7IHdoZW4gVHJ1ZSwgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHdpbGwKICAgICAgICBiZSBlc3RhYmxpc2hlZCBmb3IgYW55IGNvcGllcyBtYWRlIG9mIHRoZSB0YXJnZXQgb2JqZWN0LAogICAgICAgIGkuZS4gdGhvc2UgY29waWVzIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgOm1ldGg6YC5UYWJsZS50b21ldGFkYXRhYCBpcyB1c2VkLgoKICAgICAgICBOcgsAAAApBHIMAAAAcg0AAAByDgAAAHIPAAAAcgsAAAByCwAAAHIQAAAA2gxhZnRlcl9jcmVhdGV5AAAAcwIAAAAAFHoWRERMRXZlbnRzLmFmdGVyX2NyZWF0ZWMDAAAAAAAAAAQAAAABAAAASwAAAHMEAAAAZAFTACkCYYMDAABDYWxsZWQgYmVmb3JlIERST1Agc3RhdGVtZW50cyBhcmUgZW1pdHRlZC4KCiAgICAgICAgOnBhcmFtIHRhcmdldDogdGhlIDpjbGFzczpgLk1ldGFEYXRhYCBvciA6Y2xhc3M6YC5UYWJsZWAKICAgICAgICAgb2JqZWN0IHdoaWNoIGlzIHRoZSB0YXJnZXQgb2YgdGhlIGV2ZW50LgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uOiB0aGUgOmNsYXNzOmAuQ29ubmVjdGlvbmAgd2hlcmUgdGhlCiAgICAgICAgIERST1Agc3RhdGVtZW50IG9yIHN0YXRlbWVudHMgd2lsbCBiZSBlbWl0dGVkLgogICAgICAgIDpwYXJhbSBcKiprdzogYWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyByZWxldmFudAogICAgICAgICB0byB0aGUgZXZlbnQuICBUaGUgY29udGVudHMgb2YgdGhpcyBkaWN0aW9uYXJ5CiAgICAgICAgIG1heSB2YXJ5IGFjcm9zcyByZWxlYXNlcywgYW5kIGluY2x1ZGUgdGhlCiAgICAgICAgIGxpc3Qgb2YgdGFibGVzIGJlaW5nIGdlbmVyYXRlZCBmb3IgYSBtZXRhZGF0YS1sZXZlbAogICAgICAgICBldmVudCwgdGhlIGNoZWNrZmlyc3QgZmxhZywgYW5kIG90aGVyCiAgICAgICAgIGVsZW1lbnRzIHVzZWQgYnkgaW50ZXJuYWwgZXZlbnRzLgoKICAgICAgICA6ZnVuYzpgLmV2ZW50Lmxpc3RlbmAgYWxzbyBhY2NlcHRzIHRoZSBgYHByb3BhZ2F0ZT1UcnVlYGAKICAgICAgICBtb2RpZmllciBmb3IgdGhpcyBldmVudDsgd2hlbiBUcnVlLCB0aGUgbGlzdGVuZXIgZnVuY3Rpb24gd2lsbAogICAgICAgIGJlIGVzdGFibGlzaGVkIGZvciBhbnkgY29waWVzIG1hZGUgb2YgdGhlIHRhcmdldCBvYmplY3QsCiAgICAgICAgaS5lLiB0aG9zZSBjb3BpZXMgdGhhdCBhcmUgZ2VuZXJhdGVkIHdoZW4KICAgICAgICA6bWV0aDpgLlRhYmxlLnRvbWV0YWRhdGFgIGlzIHVzZWQuCgogICAgICAgIE5yCwAAACkEcgwAAAByDQAAAHIOAAAAcg8AAAByCwAAAHILAAAAchAAAADaC2JlZm9yZV9kcm9wjwAAAHMCAAAAABR6FURETEV2ZW50cy5iZWZvcmVfZHJvcGMDAAAAAAAAAAQAAAABAAAASwAAAHMEAAAAZAFTACkCYYQDAABDYWxsZWQgYWZ0ZXIgRFJPUCBzdGF0ZW1lbnRzIGFyZSBlbWl0dGVkLgoKICAgICAgICA6cGFyYW0gdGFyZ2V0OiB0aGUgOmNsYXNzOmAuTWV0YURhdGFgIG9yIDpjbGFzczpgLlRhYmxlYAogICAgICAgICBvYmplY3Qgd2hpY2ggaXMgdGhlIHRhcmdldCBvZiB0aGUgZXZlbnQuCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb246IHRoZSA6Y2xhc3M6YC5Db25uZWN0aW9uYCB3aGVyZSB0aGUKICAgICAgICAgRFJPUCBzdGF0ZW1lbnQgb3Igc3RhdGVtZW50cyBoYXZlIGJlZW4gZW1pdHRlZC4KICAgICAgICA6cGFyYW0gXCoqa3c6IGFkZGl0aW9uYWwga2V5d29yZCBhcmd1bWVudHMgcmVsZXZhbnQKICAgICAgICAgdG8gdGhlIGV2ZW50LiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZGljdGlvbmFyeQogICAgICAgICBtYXkgdmFyeSBhY3Jvc3MgcmVsZWFzZXMsIGFuZCBpbmNsdWRlIHRoZQogICAgICAgICBsaXN0IG9mIHRhYmxlcyBiZWluZyBnZW5lcmF0ZWQgZm9yIGEgbWV0YWRhdGEtbGV2ZWwKICAgICAgICAgZXZlbnQsIHRoZSBjaGVja2ZpcnN0IGZsYWcsIGFuZCBvdGhlcgogICAgICAgICBlbGVtZW50cyB1c2VkIGJ5IGludGVybmFsIGV2ZW50cy4KCiAgICAgICAgOmZ1bmM6YC5ldmVudC5saXN0ZW5gIGFsc28gYWNjZXB0cyB0aGUgYGBwcm9wYWdhdGU9VHJ1ZWBgCiAgICAgICAgbW9kaWZpZXIgZm9yIHRoaXMgZXZlbnQ7IHdoZW4gVHJ1ZSwgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHdpbGwKICAgICAgICBiZSBlc3RhYmxpc2hlZCBmb3IgYW55IGNvcGllcyBtYWRlIG9mIHRoZSB0YXJnZXQgb2JqZWN0LAogICAgICAgIGkuZS4gdGhvc2UgY29waWVzIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgOm1ldGg6YC5UYWJsZS50b21ldGFkYXRhYCBpcyB1c2VkLgoKICAgICAgICBOcgsAAAApBHIMAAAAcg0AAAByDgAAAHIPAAAAcgsAAAByCwAAAHIQAAAA2gphZnRlcl9kcm9wpQAAAHMCAAAAABR6FERETEV2ZW50cy5hZnRlcl9kcm9wYwMAAAAAAAAAAwAAAAEAAABDAAAAcwQAAABkAVMAKQJhAwIAAENhbGxlZCBiZWZvcmUgYSA6Y2xhc3M6YC5TY2hlbWFJdGVtYCBpcyBhc3NvY2lhdGVkIHdpdGgKICAgICAgICBhIHBhcmVudCA6Y2xhc3M6YC5TY2hlbWFJdGVtYC4KCiAgICAgICAgOnBhcmFtIHRhcmdldDogdGhlIHRhcmdldCBvYmplY3QKICAgICAgICA6cGFyYW0gcGFyZW50OiB0aGUgcGFyZW50IHRvIHdoaWNoIHRoZSB0YXJnZXQgaXMgYmVpbmcgYXR0YWNoZWQuCgogICAgICAgIDpmdW5jOmAuZXZlbnQubGlzdGVuYCBhbHNvIGFjY2VwdHMgdGhlIGBgcHJvcGFnYXRlPVRydWVgYAogICAgICAgIG1vZGlmaWVyIGZvciB0aGlzIGV2ZW50OyB3aGVuIFRydWUsIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiB3aWxsCiAgICAgICAgYmUgZXN0YWJsaXNoZWQgZm9yIGFueSBjb3BpZXMgbWFkZSBvZiB0aGUgdGFyZ2V0IG9iamVjdCwKICAgICAgICBpLmUuIHRob3NlIGNvcGllcyB0aGF0IGFyZSBnZW5lcmF0ZWQgd2hlbgogICAgICAgIDptZXRoOmAuVGFibGUudG9tZXRhZGF0YWAgaXMgdXNlZC4KCiAgICAgICAgTnILAAAAKQNyDAAAAHINAAAA2gZwYXJlbnRyCwAAAHILAAAAchAAAADaFGJlZm9yZV9wYXJlbnRfYXR0YWNouwAAAHMCAAAAAA16HkRETEV2ZW50cy5iZWZvcmVfcGFyZW50X2F0dGFjaGMDAAAAAAAAAAMAAAABAAAAQwAAAHMEAAAAZAFTACkCYQICAABDYWxsZWQgYWZ0ZXIgYSA6Y2xhc3M6YC5TY2hlbWFJdGVtYCBpcyBhc3NvY2lhdGVkIHdpdGgKICAgICAgICBhIHBhcmVudCA6Y2xhc3M6YC5TY2hlbWFJdGVtYC4KCiAgICAgICAgOnBhcmFtIHRhcmdldDogdGhlIHRhcmdldCBvYmplY3QKICAgICAgICA6cGFyYW0gcGFyZW50OiB0aGUgcGFyZW50IHRvIHdoaWNoIHRoZSB0YXJnZXQgaXMgYmVpbmcgYXR0YWNoZWQuCgogICAgICAgIDpmdW5jOmAuZXZlbnQubGlzdGVuYCBhbHNvIGFjY2VwdHMgdGhlIGBgcHJvcGFnYXRlPVRydWVgYAogICAgICAgIG1vZGlmaWVyIGZvciB0aGlzIGV2ZW50OyB3aGVuIFRydWUsIHRoZSBsaXN0ZW5lciBmdW5jdGlvbiB3aWxsCiAgICAgICAgYmUgZXN0YWJsaXNoZWQgZm9yIGFueSBjb3BpZXMgbWFkZSBvZiB0aGUgdGFyZ2V0IG9iamVjdCwKICAgICAgICBpLmUuIHRob3NlIGNvcGllcyB0aGF0IGFyZSBnZW5lcmF0ZWQgd2hlbgogICAgICAgIDptZXRoOmAuVGFibGUudG9tZXRhZGF0YWAgaXMgdXNlZC4KCiAgICAgICAgTnILAAAAKQNyDAAAAHINAAAAchUAAAByCwAAAHILAAAAchAAAADaE2FmdGVyX3BhcmVudF9hdHRhY2jKAAAAcwIAAAAADXodRERMRXZlbnRzLmFmdGVyX3BhcmVudF9hdHRhY2hjBAAAAAAAAAAEAAAAAQAAAEMAAABzBAAAAGQBUwApAmHGCwAAQ2FsbGVkIGZvciBlYWNoIHVuaXQgb2YgJ2NvbHVtbiBpbmZvJyByZXRyaWV2ZWQgd2hlbgogICAgICAgIGEgOmNsYXNzOmAuVGFibGVgIGlzIGJlaW5nIHJlZmxlY3RlZC4KCiAgICAgICAgVGhlIGRpY3Rpb25hcnkgb2YgY29sdW1uIGluZm9ybWF0aW9uIGFzIHJldHVybmVkIGJ5IHRoZQogICAgICAgIGRpYWxlY3QgaXMgcGFzc2VkLCBhbmQgY2FuIGJlIG1vZGlmaWVkLiAgVGhlIGRpY3Rpb25hcnkKICAgICAgICBpcyB0aGF0IHJldHVybmVkIGluIGVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdCByZXR1cm5lZAogICAgICAgIGJ5IDptZXRoOmAucmVmbGVjdGlvbi5JbnNwZWN0b3IuZ2V0X2NvbHVtbnNgOgoKICAgICAgICAgICAgKiBgYG5hbWVgYCAtIHRoZSBjb2x1bW4ncyBuYW1lCgogICAgICAgICAgICAqIGBgdHlwZWBgIC0gdGhlIHR5cGUgb2YgdGhpcyBjb2x1bW4sIHdoaWNoIHNob3VsZCBiZSBhbiBpbnN0YW5jZQogICAgICAgICAgICAgIG9mIDpjbGFzczpgfnNxbGFsY2hlbXkudHlwZXMuVHlwZUVuZ2luZWAKCiAgICAgICAgICAgICogYGBudWxsYWJsZWBgIC0gYm9vbGVhbiBmbGFnIGlmIHRoZSBjb2x1bW4gaXMgTlVMTCBvciBOT1QgTlVMTAoKICAgICAgICAgICAgKiBgYGRlZmF1bHRgYCAtIHRoZSBjb2x1bW4ncyBzZXJ2ZXIgZGVmYXVsdCB2YWx1ZS4gIFRoaXMgaXMKICAgICAgICAgICAgICBub3JtYWxseSBzcGVjaWZpZWQgYXMgYSBwbGFpbiBzdHJpbmcgU1FMIGV4cHJlc3Npb24sIGhvd2V2ZXIgdGhlCiAgICAgICAgICAgICAgZXZlbnQgY2FuIHBhc3MgYSA6Y2xhc3M6YC5GZXRjaGVkVmFsdWVgLCA6Y2xhc3M6YC5EZWZhdWx0Q2xhdXNlYCwKICAgICAgICAgICAgICBvciA6ZnVuYzpgLnNxbC5leHByZXNzaW9uLnRleHRgIG9iamVjdCBhcyB3ZWxsLgoKICAgICAgICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDEuMS42CgogICAgICAgICAgICAgICAgICAgIFRoZSA6bWV0aDpgLkRETEV2ZW50cy5jb2x1bW5fcmVmbGVjdGAgZXZlbnQgYWxsb3dzIGEgbm9uCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIDpjbGFzczpgLkZldGNoZWRWYWx1ZWAsCiAgICAgICAgICAgICAgICAgICAgOmZ1bmM6YC5zcWwuZXhwcmVzc2lvbi50ZXh0YCwgb3IgZGVyaXZlZCBvYmplY3QgdG8gYmUKICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYXMgdGhlIHZhbHVlIG9mIGBgZGVmYXVsdGBgIGluIHRoZSBjb2x1bW4KICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5LgoKICAgICAgICAgICAgKiBgYGF0dHJzYGAgIC0gZGljdCBjb250YWluaW5nIG9wdGlvbmFsIGNvbHVtbiBhdHRyaWJ1dGVzCgogICAgICAgIFRoZSBldmVudCBpcyBjYWxsZWQgYmVmb3JlIGFueSBhY3Rpb24gaXMgdGFrZW4gYWdhaW5zdAogICAgICAgIHRoaXMgZGljdGlvbmFyeSwgYW5kIHRoZSBjb250ZW50cyBjYW4gYmUgbW9kaWZpZWQuCiAgICAgICAgVGhlIDpjbGFzczpgLkNvbHVtbmAgc3BlY2lmaWMgYXJndW1lbnRzIGBgaW5mb2BgLCBgYGtleWBgLAogICAgICAgIGFuZCBgYHF1b3RlYGAgY2FuIGFsc28gYmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgYW5kCiAgICAgICAgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGNvbnN0cnVjdG9yIG9mIDpjbGFzczpgLkNvbHVtbmAuCgogICAgICAgIE5vdGUgdGhhdCB0aGlzIGV2ZW50IGlzIG9ubHkgbWVhbmluZ2Z1bCBpZiBlaXRoZXIKICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIDpjbGFzczpgLlRhYmxlYCBjbGFzcyBhY3Jvc3MgdGhlCiAgICAgICAgYm9hcmQsIGUuZy46OgoKICAgICAgICAgICAgZnJvbSBzcWxhbGNoZW15LnNjaGVtYSBpbXBvcnQgVGFibGUKICAgICAgICAgICAgZnJvbSBzcWxhbGNoZW15IGltcG9ydCBldmVudAoKICAgICAgICAgICAgZGVmIGxpc3Rlbl9mb3JfcmVmbGVjdChpbnNwZWN0b3IsIHRhYmxlLCBjb2x1bW5faW5mbyk6CiAgICAgICAgICAgICAgICAicmVjZWl2ZSBhIGNvbHVtbl9yZWZsZWN0IGV2ZW50IgogICAgICAgICAgICAgICAgIyAuLi4KCiAgICAgICAgICAgIGV2ZW50Lmxpc3RlbigKICAgICAgICAgICAgICAgICAgICBUYWJsZSwKICAgICAgICAgICAgICAgICAgICAnY29sdW1uX3JlZmxlY3QnLAogICAgICAgICAgICAgICAgICAgIGxpc3Rlbl9mb3JfcmVmbGVjdCkKCiAgICAgICAgLi4ub3Igd2l0aCBhIHNwZWNpZmljIDpjbGFzczpgLlRhYmxlYCBpbnN0YW5jZSB1c2luZwogICAgICAgIHRoZSBgYGxpc3RlbmVyc2BgIGFyZ3VtZW50OjoKCiAgICAgICAgICAgIGRlZiBsaXN0ZW5fZm9yX3JlZmxlY3QoaW5zcGVjdG9yLCB0YWJsZSwgY29sdW1uX2luZm8pOgogICAgICAgICAgICAgICAgInJlY2VpdmUgYSBjb2x1bW5fcmVmbGVjdCBldmVudCIKICAgICAgICAgICAgICAgICMgLi4uCgogICAgICAgICAgICB0ID0gVGFibGUoCiAgICAgICAgICAgICAgICAnc29tZXRhYmxlJywKICAgICAgICAgICAgICAgIGF1dG9sb2FkPVRydWUsCiAgICAgICAgICAgICAgICBsaXN0ZW5lcnM9WwogICAgICAgICAgICAgICAgICAgICgnY29sdW1uX3JlZmxlY3QnLCBsaXN0ZW5fZm9yX3JlZmxlY3QpCiAgICAgICAgICAgICAgICBdKQoKICAgICAgICBUaGlzIGJlY2F1c2UgdGhlIHJlZmxlY3Rpb24gcHJvY2VzcyBpbml0aWF0ZWQgYnkgYGBhdXRvbG9hZD1UcnVlYGAKICAgICAgICBjb21wbGV0ZXMgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgY29uc3RydWN0b3IgZm9yIDpjbGFzczpgLlRhYmxlYC4KCiAgICAgICAgOmZ1bmM6YC5ldmVudC5saXN0ZW5gIGFsc28gYWNjZXB0cyB0aGUgYGBwcm9wYWdhdGU9VHJ1ZWBgCiAgICAgICAgbW9kaWZpZXIgZm9yIHRoaXMgZXZlbnQ7IHdoZW4gVHJ1ZSwgdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHdpbGwKICAgICAgICBiZSBlc3RhYmxpc2hlZCBmb3IgYW55IGNvcGllcyBtYWRlIG9mIHRoZSB0YXJnZXQgb2JqZWN0LAogICAgICAgIGkuZS4gdGhvc2UgY29waWVzIHRoYXQgYXJlIGdlbmVyYXRlZCB3aGVuCiAgICAgICAgOm1ldGg6YC5UYWJsZS50b21ldGFkYXRhYCBpcyB1c2VkLgoKICAgICAgICBOcgsAAAApBHIMAAAAWglpbnNwZWN0b3LaBXRhYmxlWgtjb2x1bW5faW5mb3ILAAAAcgsAAAByEAAAANoOY29sdW1uX3JlZmxlY3TZAAAAcwIAAAAATHoYRERMRXZlbnRzLmNvbHVtbl9yZWZsZWN0TikO2ghfX25hbWVfX9oKX19tb2R1bGVfX9oMX19xdWFsbmFtZV9f2gdfX2RvY19f2hFfdGFyZ2V0X2NsYXNzX2RvY3IJAAAA2hBfZGlzcGF0Y2hfdGFyZ2V0chEAAAByEgAAAHITAAAAchQAAAByFgAAAHIXAAAAchkAAAByCwAAAHILAAAAcgsAAAByEAAAAHIKAAAAFAAAAHMUAAAACEoEAgQBBAIIFggWCBYIFggPCA9yCgAAAGMAAAAAAAAAAAAAAAADAAAAQAAAAHN0AAAAZQBaAWQAWgJkAVoDZAJaBGUFWgZlB2QDZASEAIMBWghkBWQGhABaCWQHZAiEAFoKZAlkCoQAWgtkC2QMhABaDGQNZA6EAFoNZA9kEIQAWg5kEWQShABaD2QTZBSEAFoQZBVkFoQAWhFkF2QYhABaEmQZUwApGtoKUG9vbEV2ZW50c2FoAwAAQXZhaWxhYmxlIGV2ZW50cyBmb3IgOmNsYXNzOmAuUG9vbGAuCgogICAgVGhlIG1ldGhvZHMgaGVyZSBkZWZpbmUgdGhlIG5hbWUgb2YgYW4gZXZlbnQgYXMgd2VsbAogICAgYXMgdGhlIG5hbWVzIG9mIG1lbWJlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGxpc3RlbmVyCiAgICBmdW5jdGlvbnMuCgogICAgZS5nLjo6CgogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgZXZlbnQKCiAgICAgICAgZGVmIG15X29uX2NoZWNrb3V0KGRiYXBpX2Nvbm4sIGNvbm5lY3Rpb25fcmVjLCBjb25uZWN0aW9uX3Byb3h5KToKICAgICAgICAgICAgImhhbmRsZSBhbiBvbiBjaGVja291dCBldmVudCIKCiAgICAgICAgZXZlbnQubGlzdGVuKFBvb2wsICdjaGVja291dCcsIG15X29uX2NoZWNrb3V0KQoKICAgIEluIGFkZGl0aW9uIHRvIGFjY2VwdGluZyB0aGUgOmNsYXNzOmAuUG9vbGAgY2xhc3MgYW5kCiAgICA6Y2xhc3M6YC5Qb29sYCBpbnN0YW5jZXMsIDpjbGFzczpgLlBvb2xFdmVudHNgIGFsc28gYWNjZXB0cwogICAgOmNsYXNzOmAuRW5naW5lYCBvYmplY3RzIGFuZCB0aGUgOmNsYXNzOmAuRW5naW5lYCBjbGFzcyBhcwogICAgdGFyZ2V0cywgd2hpY2ggd2lsbCBiZSByZXNvbHZlZCB0byB0aGUgYGAucG9vbGBgIGF0dHJpYnV0ZSBvZiB0aGUKICAgIGdpdmVuIGVuZ2luZSBvciB0aGUgOmNsYXNzOmAuUG9vbGAgY2xhc3M6OgoKICAgICAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKCJwb3N0Z3Jlc3FsOi8vc2NvdHQ6dGlnZXJAbG9jYWxob3N0L3Rlc3QiKQoKICAgICAgICAjIHdpbGwgYXNzb2NpYXRlIHdpdGggZW5naW5lLnBvb2wKICAgICAgICBldmVudC5saXN0ZW4oZW5naW5lLCAnY2hlY2tvdXQnLCBteV9vbl9jaGVja291dCkKCiAgICBaEFNvbWVFbmdpbmVPclBvb2xjAgAAAAAAAAACAAAAAwAAAEMAAABzQAAAAHQAfAF0AYMCcih0AnwBdAODAnIYdARTAHQCfAF0BIMCcjx8AVMAbhR0AHwBdAODAnI4fAFqBVMAfAFTAGQAUwApAU4pBtoKaXNpbnN0YW5jZdoEdHlwZdoKaXNzdWJjbGFzc3IHAAAAcggAAADaBHBvb2wpAtoDY2xzcg0AAAByCwAAAHILAAAAchAAAADaDF9hY2NlcHRfd2l0aEgBAABzEAAAAAACCgEKAQQBCgEGAQoBBgJ6F1Bvb2xFdmVudHMuX2FjY2VwdF93aXRoYwMAAAAAAAAAAwAAAAEAAABDAAAAcwQAAABkAVMAKQJh0gEAAENhbGxlZCBhdCB0aGUgbW9tZW50IGEgcGFydGljdWxhciBEQkFQSSBjb25uZWN0aW9uIGlzIGZpcnN0CiAgICAgICAgY3JlYXRlZCBmb3IgYSBnaXZlbiA6Y2xhc3M6YC5Qb29sYC4KCiAgICAgICAgVGhpcyBldmVudCBhbGxvd3Mgb25lIHRvIGNhcHR1cmUgdGhlIHBvaW50IGRpcmVjdGx5IGFmdGVyIHdoaWNoCiAgICAgICAgdGhlIERCQVBJIG1vZHVsZS1sZXZlbCBgYC5jb25uZWN0KClgYCBtZXRob2QgaGFzIGJlZW4gdXNlZCBpbiBvcmRlcgogICAgICAgIHRvIHByb2R1Y2UgYSBuZXcgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgOnBhcmFtIGRiYXBpX2Nvbm5lY3Rpb246IGEgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb25fcmVjb3JkOiB0aGUgOmNsYXNzOmAuX0Nvbm5lY3Rpb25SZWNvcmRgIG1hbmFnaW5nIHRoZQogICAgICAgICBEQkFQSSBjb25uZWN0aW9uLgoKICAgICAgICBOcgsAAAApA3IMAAAA2hBkYmFwaV9jb25uZWN0aW9u2hFjb25uZWN0aW9uX3JlY29yZHILAAAAcgsAAAByEAAAANoHY29ubmVjdFQBAABzAgAAAAANehJQb29sRXZlbnRzLmNvbm5lY3RjAwAAAAAAAAADAAAAAQAAAEMAAABzBAAAAGQBUwApAmGxAwAAQ2FsbGVkIGV4YWN0bHkgb25jZSBmb3IgdGhlIGZpcnN0IHRpbWUgYSBEQkFQSSBjb25uZWN0aW9uIGlzCiAgICAgICAgY2hlY2tlZCBvdXQgZnJvbSBhIHBhcnRpY3VsYXIgOmNsYXNzOmAuUG9vbGAuCgogICAgICAgIFRoZSByYXRpb25hbGUgZm9yIDptZXRoOmAuUG9vbEV2ZW50cy5maXJzdF9jb25uZWN0YCBpcyB0byBkZXRlcm1pbmUKICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIgc2VyaWVzIG9mIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGJhc2VkCiAgICAgICAgb24gdGhlIHNldHRpbmdzIHVzZWQgZm9yIGFsbCBjb25uZWN0aW9ucy4gIFNpbmNlIGEgcGFydGljdWxhcgogICAgICAgIDpjbGFzczpgLlBvb2xgIHJlZmVycyB0byBhIHNpbmdsZSAiY3JlYXRvciIgZnVuY3Rpb24gKHdoaWNoIGluIHRlcm1zCiAgICAgICAgb2YgYSA6Y2xhc3M6YC5FbmdpbmVgIHJlZmVycyB0byB0aGUgVVJMIGFuZCBjb25uZWN0aW9uIG9wdGlvbnMgdXNlZCksCiAgICAgICAgaXQgaXMgdHlwaWNhbGx5IHZhbGlkIHRvIG1ha2Ugb2JzZXJ2YXRpb25zIGFib3V0IGEgc2luZ2xlIGNvbm5lY3Rpb24KICAgICAgICB0aGF0IGNhbiBiZSBzYWZlbHkgYXNzdW1lZCB0byBiZSB2YWxpZCBhYm91dCBhbGwgc3Vic2VxdWVudAogICAgICAgIGNvbm5lY3Rpb25zLCBzdWNoIGFzIHRoZSBkYXRhYmFzZSB2ZXJzaW9uLCB0aGUgc2VydmVyIGFuZCBjbGllbnQKICAgICAgICBlbmNvZGluZyBzZXR0aW5ncywgY29sbGF0aW9uIHNldHRpbmdzLCBhbmQgbWFueSBvdGhlcnMuCgogICAgICAgIDpwYXJhbSBkYmFwaV9jb25uZWN0aW9uOiBhIERCQVBJIGNvbm5lY3Rpb24uCgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uX3JlY29yZDogdGhlIDpjbGFzczpgLl9Db25uZWN0aW9uUmVjb3JkYCBtYW5hZ2luZyB0aGUKICAgICAgICAgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgTnILAAAAKQNyDAAAAHInAAAAcigAAAByCwAAAHILAAAAchAAAADaDWZpcnN0X2Nvbm5lY3RjAQAAcwIAAAAAE3oYUG9vbEV2ZW50cy5maXJzdF9jb25uZWN0YwQAAAAAAAAABAAAAAEAAABDAAAAcwQAAABkAVMAKQJhLgMAAENhbGxlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgUG9vbC4KCiAgICAgICAgOnBhcmFtIGRiYXBpX2Nvbm5lY3Rpb246IGEgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb25fcmVjb3JkOiB0aGUgOmNsYXNzOmAuX0Nvbm5lY3Rpb25SZWNvcmRgIG1hbmFnaW5nIHRoZQogICAgICAgICBEQkFQSSBjb25uZWN0aW9uLgoKICAgICAgICA6cGFyYW0gY29ubmVjdGlvbl9wcm94eTogdGhlIDpjbGFzczpgLl9Db25uZWN0aW9uRmFpcnlgIG9iamVjdCB3aGljaAogICAgICAgICAgd2lsbCBwcm94eSB0aGUgcHVibGljIGludGVyZmFjZSBvZiB0aGUgREJBUEkgY29ubmVjdGlvbiBmb3IgdGhlCiAgICAgICAgICBsaWZlc3BhbiBvZiB0aGUgY2hlY2tvdXQuCgogICAgICAgIElmIHlvdSByYWlzZSBhIDpjbGFzczpgfnNxbGFsY2hlbXkuZXhjLkRpc2Nvbm5lY3Rpb25FcnJvcmAsIHRoZSBjdXJyZW50CiAgICAgICAgY29ubmVjdGlvbiB3aWxsIGJlIGRpc3Bvc2VkIGFuZCBhIGZyZXNoIGNvbm5lY3Rpb24gcmV0cmlldmVkLgogICAgICAgIFByb2Nlc3Npbmcgb2YgYWxsIGNoZWNrb3V0IGxpc3RlbmVycyB3aWxsIGFib3J0IGFuZCByZXN0YXJ0CiAgICAgICAgdXNpbmcgdGhlIG5ldyBjb25uZWN0aW9uLgoKICAgICAgICAuLiBzZWVhbHNvOjogOm1ldGg6YC5Db25uZWN0aW9uRXZlbnRzLmVuZ2luZV9jb25uZWN0YCAtIGEgc2ltaWxhciBldmVudAogICAgICAgICAgIHdoaWNoIG9jY3VycyB1cG9uIGNyZWF0aW9uIG9mIGEgbmV3IDpjbGFzczpgLkNvbm5lY3Rpb25gLgoKICAgICAgICBOcgsAAAApBHIMAAAAcicAAAByKAAAAFoQY29ubmVjdGlvbl9wcm94eXILAAAAcgsAAAByEAAAANoIY2hlY2tvdXR4AQAAcwIAAAAAFHoTUG9vbEV2ZW50cy5jaGVja291dGMDAAAAAAAAAAMAAAABAAAAQwAAAHMEAAAAZAFTACkCYa4BAABDYWxsZWQgd2hlbiBhIGNvbm5lY3Rpb24gcmV0dXJucyB0byB0aGUgcG9vbC4KCiAgICAgICAgTm90ZSB0aGF0IHRoZSBjb25uZWN0aW9uIG1heSBiZSBjbG9zZWQsIGFuZCBtYXkgYmUgTm9uZSBpZiB0aGUKICAgICAgICBjb25uZWN0aW9uIGhhcyBiZWVuIGludmFsaWRhdGVkLiAgYGBjaGVja2luYGAgd2lsbCBub3QgYmUgY2FsbGVkCiAgICAgICAgZm9yIGRldGFjaGVkIGNvbm5lY3Rpb25zLiAgKFRoZXkgZG8gbm90IHJldHVybiB0byB0aGUgcG9vbC4pCgogICAgICAgIDpwYXJhbSBkYmFwaV9jb25uZWN0aW9uOiBhIERCQVBJIGNvbm5lY3Rpb24uCgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uX3JlY29yZDogdGhlIDpjbGFzczpgLl9Db25uZWN0aW9uUmVjb3JkYCBtYW5hZ2luZyB0aGUKICAgICAgICAgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgTnILAAAAKQNyDAAAAHInAAAAcigAAAByCwAAAHILAAAAchAAAADaB2NoZWNraW6OAQAAcwIAAAAADHoSUG9vbEV2ZW50cy5jaGVja2luYwMAAAAAAAAAAwAAAAEAAABDAAAAcwQAAABkAVMAKQJhRgMAAENhbGxlZCBiZWZvcmUgdGhlICJyZXNldCIgYWN0aW9uIG9jY3VycyBmb3IgYSBwb29sZWQgY29ubmVjdGlvbi4KCiAgICAgICAgVGhpcyBldmVudCByZXByZXNlbnRzCiAgICAgICAgd2hlbiB0aGUgYGByb2xsYmFjaygpYGAgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgREJBUEkgY29ubmVjdGlvbgogICAgICAgIGJlZm9yZSBpdCBpcyByZXR1cm5lZCB0byB0aGUgcG9vbC4gIFRoZSBiZWhhdmlvciBvZiAicmVzZXQiIGNhbgogICAgICAgIGJlIGNvbnRyb2xsZWQsIGluY2x1ZGluZyBkaXNhYmxlZCwgdXNpbmcgdGhlIGBgcmVzZXRfb25fcmV0dXJuYGAKICAgICAgICBwb29sIGFyZ3VtZW50LgoKCiAgICAgICAgVGhlIDptZXRoOmAuUG9vbEV2ZW50cy5yZXNldGAgZXZlbnQgaXMgdXN1YWxseSBmb2xsb3dlZCBieSB0aGUKICAgICAgICA6bWV0aDpgLlBvb2xFdmVudHMuY2hlY2tpbmAgZXZlbnQgaXMgY2FsbGVkLCBleGNlcHQgaW4gdGhvc2UKICAgICAgICBjYXNlcyB3aGVyZSB0aGUgY29ubmVjdGlvbiBpcyBkaXNjYXJkZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgcmVzZXQuCgogICAgICAgIDpwYXJhbSBkYmFwaV9jb25uZWN0aW9uOiBhIERCQVBJIGNvbm5lY3Rpb24uCgogICAgICAgIDpwYXJhbSBjb25uZWN0aW9uX3JlY29yZDogdGhlIDpjbGFzczpgLl9Db25uZWN0aW9uUmVjb3JkYCBtYW5hZ2luZyB0aGUKICAgICAgICAgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6bWV0aDpgLkNvbm5lY3Rpb25FdmVudHMucm9sbGJhY2tgCgogICAgICAgICAgICA6bWV0aDpgLkNvbm5lY3Rpb25FdmVudHMuY29tbWl0YAoKICAgICAgICBOcgsAAAApA3IMAAAAcicAAAByKAAAAHILAAAAcgsAAAByEAAAANoFcmVzZXScAQAAcwIAAAAAGXoQUG9vbEV2ZW50cy5yZXNldGMEAAAAAAAAAAQAAAABAAAAQwAAAHMEAAAAZAFTACkCYTgDAABDYWxsZWQgd2hlbiBhIERCQVBJIGNvbm5lY3Rpb24gaXMgdG8gYmUgImludmFsaWRhdGVkIi4KCiAgICAgICAgVGhpcyBldmVudCBpcyBjYWxsZWQgYW55IHRpbWUgdGhlIDptZXRoOmAuX0Nvbm5lY3Rpb25SZWNvcmQuaW52YWxpZGF0ZWAKICAgICAgICBtZXRob2QgaXMgaW52b2tlZCwgZWl0aGVyIGZyb20gQVBJIHVzYWdlIG9yIHZpYSAiYXV0by1pbnZhbGlkYXRpb24iLAogICAgICAgIHdpdGhvdXQgdGhlIGBgc29mdGBgIGZsYWcuCgogICAgICAgIFRoZSBldmVudCBvY2N1cnMgYmVmb3JlIGEgZmluYWwgYXR0ZW1wdCB0byBjYWxsIGBgLmNsb3NlKClgYCBvbiB0aGUKICAgICAgICBjb25uZWN0aW9uIG9jY3Vycy4KCiAgICAgICAgOnBhcmFtIGRiYXBpX2Nvbm5lY3Rpb246IGEgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgOnBhcmFtIGNvbm5lY3Rpb25fcmVjb3JkOiB0aGUgOmNsYXNzOmAuX0Nvbm5lY3Rpb25SZWNvcmRgIG1hbmFnaW5nIHRoZQogICAgICAgICBEQkFQSSBjb25uZWN0aW9uLgoKICAgICAgICA6cGFyYW0gZXhjZXB0aW9uOiB0aGUgZXhjZXB0aW9uIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSByZWFzb24KICAgICAgICAgZm9yIHRoaXMgaW52YWxpZGF0aW9uLCBpZiBhbnkuICBNYXkgYmUgYGBOb25lYGAuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuOS4yIEFkZGVkIHN1cHBvcnQgZm9yIGNvbm5lY3Rpb24gaW52YWxpZGF0aW9uCiAgICAgICAgICAgbGlzdGVuaW5nLgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YHBvb2xfY29ubmVjdGlvbl9pbnZhbGlkYXRp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RW5naW5lYC4KCiAgICBUaGUgbWV0aG9kcyBoZXJlIGRlZmluZSB0aGUgbmFtZSBvZiBhbiBldmVudCBhcyB3ZWxsIGFzIHRoZSBuYW1lcyBvZgogICAgbWVtYmVycyB0aGF0IGFyZSBwYXNzZWQgdG8gbGlzdGVuZXIgZnVuY3Rpb25zLgoKICAgIEFuIGV2ZW50IGxpc3RlbmVyIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW55IDpjbGFzczpgLkNvbm5lY3RhYmxlYAogICAgY2xhc3Mgb3IgaW5zdGFuY2UsIHN1Y2ggYXMgYW4gOmNsYXNzOmAuRW5naW5lYCwgZS5nLjo6CgogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgZXZlbnQsIGNyZWF0ZV9lbmdpbmUKCiAgICAgICAgZGVmIGJlZm9yZV9jdXJzb3JfZXhlY3V0ZShjb25uLCBjdXJzb3IsIHN0YXRlbWVudCwgcGFyYW1ldGVycywgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlbWFueSk6CiAgICAgICAgICAgIGxvZy5pbmZvKCJSZWNlaXZlZCBzdGF0ZW1lbnQ6ICVzIiwgc3RhdGVtZW50KQoKICAgICAgICBlbmdpbmUgPSBjcmVhdGVfZW5naW5lKCdwb3N0Z3Jlc3FsOi8vc2NvdHQ6dGlnZXJAbG9jYWxob3N0L3Rlc3QnKQogICAgICAgIGV2ZW50Lmxpc3RlbihlbmdpbmUsICJiZWZvcmVfY3Vyc29yX2V4ZWN1dGUiLCBiZWZvcmVfY3Vyc29yX2V4ZWN1dGUpCgogICAgb3Igd2l0aCBhIHNwZWNpZmljIDpjbGFzczpgLkNvbm5lY3Rpb25gOjoKCiAgICAgICAgd2l0aCBlbmdpbmUuYmVnaW4oKSBhcyBjb25uOgogICAgICAgICAgICBAZXZlbnQubGlzdGVuc19mb3IoY29ubiwgJ2JlZm9yZV9jdXJzb3JfZXhlY3V0ZScpCiAgICAgICAgICAgIGRlZiBiZWZvcmVfY3Vyc29yX2V4ZWN1dGUoY29ubiwgY3Vyc29yLCBzdGF0ZW1lbnQsIHBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZXhlY3V0ZW1hbnkpOgogICAgICAgICAgICAgICAgbG9nLmluZm8oIlJlY2VpdmVkIHN0YXRlbWVudDogJXMiLCBzdGF0ZW1lbnQpCgogICAgV2hlbiB0aGUgbWV0aG9kcyBhcmUgY2FsbGVkIHdpdGggYSBgc3RhdGVtZW50YCBwYXJhbWV0ZXIsIHN1Y2ggYXMgaW4KICAgIDptZXRoOmAuYWZ0ZXJfY3Vyc29yX2V4ZWN1dGVgLCA6bWV0aDpgLmJlZm9yZV9jdXJzb3JfZXhlY3V0ZWAgYW5kCiAgICA6bWV0aDpgLmRiYXBpX2Vycm9yYCwgdGhlIHN0YXRlbWVudCBpcyB0aGUgZXhhY3QgU1FMIHN0cmluZyB0aGF0IHdhcwogICAgcHJlcGFyZWQgZm9yIHRyYW5zbWlzc2lvbiB0byB0aGUgREJBUEkgYGBjdXJzb3JgYCBpbiB0aGUgY29ubmVjdGlvbidzCiAgICA6Y2xhc3M6YC5EaWFsZWN0YC4KCiAgICBUaGUgOm1ldGg6YC5iZWZvcmVfZXhlY3V0ZWAgYW5kIDptZXRoOmAuYmVmb3JlX2N1cnNvcl9leGVjdXRlYAogICAgZXZlbnRzIGNhbiBhbHNvIGJlIGVzdGFibGlzaGVkIHdpdGggdGhlIGBgcmV0dmFsPVRydWVgYCBmbGFnLCB3aGljaAogICAgYWxsb3dzIG1vZGlmaWNhdGlvbiBvZiB0aGUgc3RhdGVtZW50IGFuZCBwYXJhbWV0ZXJzIHRvIGJlIHNlbnQKICAgIHRvIHRoZSBkYXRhYmFzZS4gIFRoZSA6bWV0aDpgLmJlZm9yZV9jdXJzb3JfZXhlY3V0ZWAgZXZlbnQgaXMKICAgIHBhcnRpY3VsYXJseSB1c2VmdWwgaGVyZSB0byBhZGQgYWQtaG9jIHN0cmluZyB0cmFuc2Zvcm1hdGlvbnMsIHN1Y2gKICAgIGFzIGNvbW1lbnRzLCB0byBhbGwgZXhlY3V0aW9uczo6CgogICAgICAgIGZyb20gc3FsYWxjaGVteS5lbmdpbmUgaW1wb3J0IEVuZ2luZQogICAgICAgIGZyb20gc3FsYWxjaGVteSBpbXBvcnQgZXZlbnQKCiAgICAgICAgQGV2ZW50Lmxpc3RlbnNfZm9yKEVuZ2luZSwgImJlZm9yZV9jdXJzb3JfZXhlY3V0ZSIsIHJldHZhbD1UcnVlKQogICAgICAgIGRlZiBjb21tZW50X3NxbF9jYWxscyhjb25uLCBjdXJzb3IsIHN0YXRlbWVudCwgcGFyYW1ldGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBleGVjdXRlbWFueSk6CiAgICAgICAgICAgIHN0YXRlbWVudCA9IHN0YXRlbWVudCArICIgLS0gc29tZSBjb21tZW50IgogICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LCBwYXJhbWV0ZXJzCgogICAgLi4gbm90ZTo6IDpjbGFzczpgLkNvbm5lY3Rpb25FdmVudHNgIGNhbiBiZSBlc3RhYmxpc2hlZCBvbiBhbnkKICAgICAgIGNvbWJpbmF0aW9uIG9mIDpjbGFzczpgLkVuZ2luZWAsIDpjbGFzczpgLkNvbm5lY3Rpb25gLCBhcyB3ZWxsCiAgICAgICBhcyBpbnN0YW5jZXMgb2YgZWFjaCBvZiB0aG9zZSBjbGFzc2VzLiAgRXZlbnRzIGFjcm9zcyBhbGwKICAgICAgIGZvdXIgc2NvcGVzIHdpbGwgZmlyZSBvZmYgZm9yIGEgZ2l2ZW4gaW5zdGFuY2Ugb2YKICAgICAgIDpjbGFzczpgLkNvbm5lY3Rpb25gLiAgSG93ZXZlciwgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZQogICAgICAgOmNsYXNzOmAuQ29ubmVjdGlvbmAgb2JqZWN0IGRldGVybWluZXMgYXQgaW5zdGFudGlhdGlvbiB0aW1lCiAgICAgICB3aGV0aGVyIG9yIG5vdCBpdHMgcGFyZW50IDpjbGFzczpgLkVuZ2luZWAgaGFzIGV2ZW50IGxpc3RlbmVycwogICAgICAgZXN0YWJsaXNoZWQuICAgRXZlbnQgbGlzdGVuZXJzIGFkZGVkIHRvIHRoZSA6Y2xhc3M6YC5FbmdpbmVgCiAgICAgICBjbGFzcyBvciB0byBhbiBpbnN0YW5jZSBvZiA6Y2xhc3M6YC5FbmdpbmVgICphZnRlciogdGhlIGluc3RhbnRpYXRpb24KICAgICAgIG9mIGEgZGVwZW5kZW50IDpjbGFzczpgLkNvbm5lY3Rpb25gIGluc3RhbmNlIHdpbGwgdXN1YWxseQogICAgICAgKm5vdCogYmUgYXZhaWxhYmxlIG9uIHRoYXQgOmNsYXNzOmAuQ29ubmVjdGlvbmAgaW5zdGFuY2UuICBUaGUgbmV3bHkKICAgICAgIGFkZGVkIGxpc3RlbmVycyB3aWxsIGluc3RlYWQgdGFrZSBlZmZlY3QgZm9yIDpjbGFzczpgLkNvbm5lY3Rpb25gCiAgICAgICBpbnN0YW5jZXMgY3JlYXRlZCBzdWJzZXF1ZW50IHRvIHRob3NlIGV2ZW50IGxpc3RlbmVycyBiZWluZwogICAgICAgZXN0YWJsaXNoZWQgb24gdGhlIHBhcmVudCA6Y2xhc3M6YC5FbmdpbmVgIGNsYXNzIG9yIGluc3RhbmNlLgoKICAgIDpwYXJhbSByZXR2YWw9RmFsc2U6IEFwcGxpZXMgdG8gdGhlIDptZXRoOmAuYmVmb3JlX2V4ZWN1dGVgIGFuZAogICAgICA6bWV0aDpgLmJlZm9yZV9jdXJzb3JfZXhlY3V0ZWAgZXZlbnRzIG9ubHkuICBXaGVuIFRydWUsIHRoZQogICAgICB1c2VyLWRlZmluZWQgZXZlbnQgZnVuY3Rpb24gbXVzdCBoYXZlIGEgcmV0dXJuIHZhbHVlLCB3aGljaAogICAgICBpcyBhIHR1cGxlIG9mIHBhcmFtZXRlcnMgdGhhdCByZXBsYWNlIHRoZSBnaXZlbiBzdGF0ZW1lbnQKICAgICAgYW5kIHBhcmFtZXRlcnMuICBTZWUgdGhvc2UgbWV0aG9kcyBmb3IgYSBkZXNjcmlwdGlvbiBvZgogICAgICBzcGVjaWZpYyByZXR1cm4gYXJndW1lbnRzLgoKICAgINoKU29tZUVuZ2luZUZjAwAAAAAAAAAIAAAAAwAAAAMAAABzhAAAAHwBagB8AWoBfAFqAgMAAgB9A30EfQVkAXwDXwN8AnNcfARkAmsCcj58BYkAhwBmAWQDZASECH0GfAZ9BXFyfARkBWsCcnJ8BYkAhwBmAWQGZAeECH0HfAd9BW4WfAJycnwEZAhrB3JydASgBWQJoQGCAXwBoAZ8BaEBoAehAAEAZABTACkKTlTaDmJlZm9yZV9leGVjdXRlYwQAAAAAAAAABAAAAAUAAAATAAAAcxgAAACIAHwAfAF8AnwDgwQBAHwBfAJ8A2YDUwApAU5yCwAAACkE2gRjb25u2g1jbGF1c2VlbGVtZW502gttdWx0aXBhcmFtc9oGcGFyYW1zKQHaB29yaWdfZm5yCwAAAHIQAAAA2hN3cmFwX2JlZm9yZV9leGVjdXRlZAIAAHMEAAAAAAMOAXo1Q29ubmVjdGlvbkV2ZW50cy5fbGlzdGVuLjxsb2NhbHM+LndyYXBfYmVmb3JlX2V4ZWN1dGXaFWJlZm9yZV9jdXJzb3JfZXhlY3V0ZWMGAAAAAAAAAAYAAAAHAAAAEwAAAHMaAAAAiAB8AHwBfAJ8A3wEfAWDBgEAfAJ8A2YCUwApAU5yCwAAACkGcjgAAADaBmN1cnNvctoJc3RhdGVtZW502gpwYXJhbWV0ZXJz2gdjb250ZXh02gtleGVjdXRlbWFueSkBcjwAAAByCwAAAHIQAAAA2hp3cmFwX2JlZm9yZV9jdXJzb3JfZXhlY3V0ZW4CAABzEAAAAAADAgECAQIBAgECAQIBBgJ6PENvbm5lY3Rpb25FdmVudHMuX2xpc3Rlbi48bG9jYWxzPi53cmFwX2JlZm9yZV9jdXJzb3JfZXhlY3V0ZSkDcjcAAAByPgAAANoMaGFuZGxlX2Vycm9yen9Pbmx5IHRoZSAnYmVmb3JlX2V4ZWN1dGUnLCAnYmVmb3JlX2N1cnNvcl9leGVjdXRlJyBhbmQgJ2hhbmRsZV9lcnJvcicgZW5naW5lIGV2ZW50IGxpc3RlbmVycyBhY2NlcHQgdGhlICdyZXR2YWw9VHJ1ZScgYXJndW1lbnQuKQjaD2Rpc3BhdGNoX3RhcmdldNoKaWRlbnRpZmllcloKX2xpc3Rlbl9mbtoLX2hhc19ldmVudHNyAwAAANoNQXJndW1lbnRFcnJvcloMd2l0aF93cmFwcGVy2gtiYXNlX2xpc3RlbikIciUAAADaCWV2ZW50X2tledoGcmV0dmFscg0AAAByRwAAANoCZm5yPQAAAHJEAAAAcgsAAAApAXI8AAAAchAAAADaB19saXN0ZW5WAgAAcyQAAAAAAwQBBAEOAwYCBAEIAQQCDAYGAQgBBAIMDQYBBgEGBAQBBgV6GENvbm5lY3Rpb25FdmVudHMuX2xpc3RlbmMFAAAAAAAAAAUAAAABAAAAQwAAAHMEAAAAZAFTACkCYegEAABJbnRlcmNlcHQgaGlnaCBsZXZlbCBleGVjdXRlKCkgZXZlbnRzLCByZWNlaXZpbmcgdW5jb21waWxlZAogICAgICAgIFNRTCBjb25zdHJ1Y3RzIGFuZCBvdGhlciBvYmplY3RzIHByaW9yIHRvIHJlbmRlcmluZyBpbnRvIFNRTC4KCiAgICAgICAgVGhpcyBldmVudCBpcyBnb29kIGZvciBkZWJ1Z2dpbmcgU1FMIGNvbXBpbGF0aW9uIGlzc3VlcyBhcyB3ZWxsCiAgICAgICAgYXMgZWFybHkgbWFuaXB1bGF0aW9uIG9mIHRoZSBwYXJhbWV0ZXJzIGJlaW5nIHNlbnQgdG8gdGhlIGRhdGFiYXNlLAogICAgICAgIGFzIHRoZSBwYXJhbWV0ZXIgbGlzdHMgd2lsbCBiZSBpbiBhIGNvbnNpc3RlbnQgZm9ybWF0IGhlcmUuCgogICAgICAgIFRoaXMgZXZlbnQgY2FuIGJlIG9wdGlvbmFsbHkgZXN0YWJsaXNoZWQgd2l0aCB0aGUgYGByZXR2YWw9VHJ1ZWBgCiAgICAgICAgZmxhZy4gIFRoZSBgYGNsYXVzZWVsZW1lbnRgYCwgYGBtdWx0aXBhcmFtc2BgLCBhbmQgYGBwYXJhbXNgYAogICAgICAgIGFyZ3VtZW50cyBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYSB0aHJlZS10dXBsZSBpbiB0aGlzIGNhc2U6OgoKICAgICAgICAgICAgQGV2ZW50Lmxpc3RlbnNfZm9yKEVuZ2luZSwgImJlZm9yZV9leGVjdXRlIiwgcmV0dmFsPVRydWUpCiAgICAgICAgICAgIGRlZiBiZWZvcmVfZXhlY3V0ZShjb25uLCBjbGF1c2VlbGVtZW50LCBtdWx0aXBhcmFtcywgcGFyYW1zKToKICAgICAgICAgICAgICAgICMgZG8gc29tZXRoaW5nIHdpdGggY2xhdXNlZWxlbWVudCwgbXVsdGlwYXJhbXMsIHBhcmFtcwogICAgICAgICAgICAgICAgcmV0dXJuIGNsYXVzZWVsZW1lbnQsIG11bHRpcGFyYW1zLCBwYXJhbXMKCiAgICAgICAgOnBhcmFtIGNvbm46IDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdAogICAgICAgIDpwYXJhbSBjbGF1c2VlbGVtZW50OiBTUUwgZXhwcmVzc2lvbiBjb25zdHJ1Y3QsIDpjbGFzczpgLkNvbXBpbGVkYAogICAgICAgICBpbnN0YW5jZSwgb3Igc3RyaW5nIHN0YXRlbWVudCBwYXNzZWQgdG8gOm1ldGg6YC5Db25uZWN0aW9uLmV4ZWN1dGVgLgogICAgICAgIDpwYXJhbSBtdWx0aXBhcmFtczogTXVsdGlwbGUgcGFyYW1ldGVyIHNldHMsIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMuCiAgICAgICAgOnBhcmFtIHBhcmFtczogU2luZ2xlIHBhcmFtZXRlciBzZXQsIGEgc2luZ2xlIGRpY3Rpb25hcnkuCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5iZWZvcmVfY3Vyc29yX2V4ZWN1dGVgCgogICAgICAgIE5yCwAAACkFcgwAAAByOAAAAHI5AAAAcjoAAAByOwAAAHILAAAAcgsAAAByEAAAAHI3AAAAiQIAAHMCAAAAABt6H0Nvbm5lY3Rpb25FdmVudHMuYmVmb3JlX2V4ZWN1dGVjBgAAAAAAAAAGAAAAAQAAAEMAAABzBAAAAGQBUwApAmHiAQAASW50ZXJjZXB0IGhpZ2ggbGV2ZWwgZXhlY3V0ZSgpIGV2ZW50cyBhZnRlciBleGVjdXRlLgoKCiAgICAgICAgOnBhcmFtIGNvbm46IDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdAogICAgICAgIDpwYXJhbSBjbGF1c2VlbGVtZW50OiBTUUwgZXhwcmVzc2lvbiBjb25zdHJ1Y3QsIDpjbGFzczpgLkNvbXBpbGVkYAogICAgICAgICBpbnN0YW5jZSwgb3Igc3RyaW5nIHN0YXRlbWVudCBwYXNzZWQgdG8gOm1ldGg6YC5Db25uZWN0aW9uLmV4ZWN1dGVgLgogICAgICAgIDpwYXJhbSBtdWx0aXBhcmFtczogTXVsdGlwbGUgcGFyYW1ldGVyIHNldHMsIGEgbGlzdCBvZiBkaWN0aW9uYXJpZXMuCiAgICAgICAgOnBhcmFtIHBhcmFtczogU2luZ2xlIHBhcmFtZXRlciBzZXQsIGEgc2luZ2xlIGRpY3Rpb25hcnkuCiAgICAgICAgOnBhcmFtIHJlc3VsdDogOmNsYXNzOmAuUmVzdWx0UHJveHlgIGdlbmVyYXRlZCBieSB0aGUgZXhlY3V0aW9uLgoKICAgICAgICBOcgsAAAApBnIMAAAAcjgAAAByOQAAAHI6AAAAcjsAAADaBnJlc3VsdHILAAAAcgsAAAByEAAAANoNYWZ0ZXJfZXhlY3V0ZaYCAABzAgAAAAALeh5Db25uZWN0aW9uRXZlbnRzLmFmdGVyX2V4ZWN1dGVjBwAAAAAAAAAHAAAAAQAAAEMAAABzBAAAAGQBUwApAmGGBgAASW50ZXJjZXB0IGxvdy1sZXZlbCBjdXJzb3IgZXhlY3V0ZSgpIGV2ZW50cyBiZWZvcmUgZXhlY3V0aW9uLAogICAgICAgIHJlY2VpdmluZyB0aGUgc3RyaW5nIFNRTCBzdGF0ZW1lbnQgYW5kIERCQVBJLXNwZWNpZmljIHBhcmFtZXRlciBsaXN0IHRvCiAgICAgICAgYmUgaW52b2tlZCBhZ2FpbnN0IGEgY3Vyc29yLgoKICAgICAgICBUaGlzIGV2ZW50IGlzIGEgZ29vZCBjaG9pY2UgZm9yIGxvZ2dpbmcgYXMgd2VsbCBhcyBsYXRlIG1vZGlmaWNhdGlvbnMKICAgICAgICB0byB0aGUgU1FMIHN0cmluZy4gIEl0J3MgbGVzcyBpZGVhbCBmb3IgcGFyYW1ldGVyIG1vZGlmaWNhdGlvbnMgZXhjZXB0CiAgICAgICAgZm9yIHRob3NlIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBhIHRhcmdldCBiYWNrZW5kLgoKICAgICAgICBUaGlzIGV2ZW50IGNhbiBiZSBvcHRpb25hbGx5IGVzdGFibGlzaGVkIHdpdGggdGhlIGBgcmV0dmFsPVRydWVgYAogICAgICAgIGZsYWcuICBUaGUgYGBzdGF0ZW1lbnRgYCBhbmQgYGBwYXJhbWV0ZXJzYGAgYXJndW1lbnRzIHNob3VsZCBiZQogICAgICAgIHJldHVybmVkIGFzIGEgdHdvLXR1cGxlIGluIHRoaXMgY2FzZTo6CgogICAgICAgICAgICBAZXZlbnQubGlzdGVuc19mb3IoRW5naW5lLCAiYmVmb3JlX2N1cnNvcl9leGVjdXRlIiwgcmV0dmFsPVRydWUpCiAgICAgICAgICAgIGRlZiBiZWZvcmVfY3Vyc29yX2V4ZWN1dGUoY29ubiwgY3Vyc29yLCBzdGF0ZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLCBjb250ZXh0LCBleGVjdXRlbWFueSk6CiAgICAgICAgICAgICAgICAjIGRvIHNvbWV0aGluZyB3aXRoIHN0YXRlbWVudCwgcGFyYW1ldGVycwogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudCwgcGFyYW1ldGVycwoKICAgICAgICBTZWUgdGhlIGV4YW1wbGUgYXQgOmNsYXNzOmAuQ29ubmVjdGlvbkV2ZW50c2AuCgogICAgICAgIDpwYXJhbSBjb25uOiA6Y2xhc3M6YC5Db25uZWN0aW9uYCBvYmplY3QKICAgICAgICA6cGFyYW0gY3Vyc29yOiBEQkFQSSBjdXJzb3Igb2JqZWN0CiAgICAgICAgOnBhcmFtIHN0YXRlbWVudDogc3RyaW5nIFNRTCBzdGF0ZW1lbnQsIGFzIHRvIGJlIHBhc3NlZCB0byB0aGUgREJBUEkKICAgICAgICA6cGFyYW0gcGFyYW1ldGVyczogRGljdGlvbmFyeSwgdHVwbGUsIG9yIGxpc3Qgb2YgcGFyYW1ldGVycyBiZWluZwogICAgICAgICBwYXNzZWQgdG8gdGhlIGBgZXhlY3V0ZSgpYGAgb3IgYGBleGVjdXRlbWFueSgpYGAgbWV0aG9kIG9mIHRoZQogICAgICAgICBEQkFQSSBgYGN1cnNvcmBgLiAgSW4gc29tZSBjYXNlcyBtYXkgYmUgYGBOb25lYGAuCiAgICAgICAgOnBhcmFtIGNvbnRleHQ6IDpjbGFzczpgLkV4ZWN1dGlvbkNvbnRleHRgIG9iamVjdCBpbiB1c2UuICBNYXkKICAgICAgICAgYmUgYGBOb25lYGAuCiAgICAgICAgOnBhcmFtIGV4ZWN1dGVtYW55OiBib29sZWFuLCBpZiBgYFRydWVgYCwgdGhpcyBpcyBhbiBgYGV4ZWN1dGVtYW55KClgYAogICAgICAgICBjYWxsLCBpZiBgYEZhbHNlYGAsIHRoaXMgaXMgYW4gYGBleGVjdXRlKClgYCBjYWxsLgoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDptZXRoOmAuYmVmb3JlX2V4ZWN1dGVgCgogICAgICAgICAgICA6bWV0aDpgLmFmdGVyX2N1cnNvcl9leGVjdXRlYAoKICAgICAgICBOcgsAAAApB3IMAAAAcjgAAAByPwAAAHJAAAAAckEAAAByQgAAAHJDAAAAcgsAAAByCwAAAHIQAAAAcj4AAACzAgAAcwIAAAAAKHomQ29ubmVjdGlvbkV2ZW50cy5iZWZvcmVfY3Vyc29yX2V4ZWN1dGVjBwAAAAAAAAAHAAAAAQAAAEMAAABzBAAAAGQBUwApAmFCAwAASW50ZXJjZXB0IGxvdy1sZXZlbCBjdXJzb3IgZXhlY3V0ZSgpIGV2ZW50cyBhZnRlciBleGVjdXRpb24uCgogICAgICAgIDpwYXJhbSBjb25uOiA6Y2xhc3M6YC5Db25uZWN0aW9uYCBvYmplY3QKICAgICAgICA6cGFyYW0gY3Vyc29yOiBEQkFQSSBjdXJzb3Igb2JqZWN0LiAgV2lsbCBoYXZlIHJlc3VsdHMgcGVuZGluZwogICAgICAgICBpZiB0aGUgc3RhdGVtZW50IHdhcyBhIFNFTEVDVCwgYnV0IHRoZXNlIHNob3VsZCBub3QgYmUgY29uc3VtZWQKICAgICAgICAgYXMgdGhleSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgOmNsYXNzOmAuUmVzdWx0UHJveHlgLgogICAgICAgIDpwYXJhbSBzdGF0ZW1lbnQ6IHN0cmluZyBTUUwgc3RhdGVtZW50LCBhcyBwYXNzZWQgdG8gdGhlIERCQVBJCiAgICAgICAgOnBhcmFtIHBhcmFtZXRlcnM6IERpY3Rpb25hcnksIHR1cGxlLCBvciBsaXN0IG9mIHBhcmFtZXRlcnMgYmVpbmcKICAgICAgICAgcGFzc2VkIHRvIHRoZSBgYGV4ZWN1dGUoKWBgIG9yIGBgZXhlY3V0ZW1hbnkoKWBgIG1ldGhvZCBvZiB0aGUKICAgICAgICAgREJBUEkgYGBjdXJzb3JgYC4gIEluIHNvbWUgY2FzZXMgbWF5IGJlIGBgTm9uZWBgLgogICAgICAgIDpwYXJhbSBjb250ZXh0OiA6Y2xhc3M6YC5FeGVjdXRpb25Db250ZXh0YCBvYmplY3QgaW4gdXNlLiAgTWF5CiAgICAgICAgIGJlIGBgTm9uZWBgLgogICAgICAgIDpwYXJhbSBleGVjdXRlbWFueTogYm9vbGVhbiwgaWYgYGBUcnVlYGAsIHRoaXMgaXMgYW4gYGBleGVjdXRlbWFueSgpYGAKICAgICAgICAgY2FsbCwgaWYgYGBGYWxzZWBgLCB0aGlzIGlzIGFuIGBgZXhlY3V0ZSgpYGAgY2FsbC4KCiAgICAgICAgTnILAAAAKQdyDAAAAHI4AAAAcj8AAAByQAAAAHJBAAAAckIAAAByQwAAAHILAAAAcgsAAAByEAAAANoUYWZ0ZXJfY3Vyc29yX2V4ZWN1dGXdAgAAcwIAAAAAEnolQ29ubmVjdGlvbkV2ZW50cy5hZnRlcl9jdXJzb3JfZXhlY3V0ZXoDMC45eqhUaGUgOm1ldGg6YC5Db25uZWN0aW9uRXZlbnRzLmRiYXBpX2Vycm9yYCBldmVudCBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIHRoZSA6bWV0aDpgLkNvbm5lY3Rpb25FdmVudHMuaGFuZGxlX2Vycm9yYCBldmVudC5jBwAAAAAAAAAHAAAAAQAAAEMAAABzBAAAAGQBUwApAmF5BwAASW50ZXJjZXB0IGEgcmF3IERCQVBJIGVycm9yLgoKICAgICAgICBUaGlzIGV2ZW50IGlzIGNhbGxlZCB3aXRoIHRoZSBEQkFQSSBleGNlcHRpb24gaW5zdGFuY2UKICAgICAgICByZWNlaXZlZCBmcm9tIHRoZSBEQkFQSSBpdHNlbGYsICpiZWZvcmUqIFNRTEFsY2hlbXkgd3JhcHMgdGhlCiAgICAgICAgZXhjZXB0aW9uIHdpdGggaXQncyBvd24gZXhjZXB0aW9uIHdyYXBwZXJzLCBhbmQgYmVmb3JlIGFueQogICAgICAgIG90aGVyIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgREJBUEkgY3Vyc29yOyB0aGUKICAgICAgICBleGlzdGluZyB0cmFuc2FjdGlvbiByZW1haW5zIGluIGVmZmVjdCBhcyB3ZWxsIGFzIGFueSBzdGF0ZQogICAgICAgIG9uIHRoZSBjdXJzb3IuCgogICAgICAgIFRoZSB1c2UgY2FzZSBoZXJlIGlzIHRvIGluamVjdCBsb3ctbGV2ZWwgZXhjZXB0aW9uIGhhbmRsaW5nCiAgICAgICAgaW50byBhbiA6Y2xhc3M6YC5FbmdpbmVgLCB0eXBpY2FsbHkgZm9yIGxvZ2dpbmcgYW5kCiAgICAgICAgZGVidWdnaW5nIHB1cnBvc2VzLgoKICAgICAgICAuLiB3YXJuaW5nOjoKCiAgICAgICAgICAgIENvZGUgc2hvdWxkICoqbm90KiogbW9kaWZ5CiAgICAgICAgICAgIGFueSBzdGF0ZSBvciB0aHJvdyBhbnkgZXhjZXB0aW9ucyBoZXJlIGFzIHRoaXMgd2lsbAogICAgICAgICAgICBpbnRlcmZlcmUgd2l0aCBTUUxBbGNoZW15J3MgY2xlYW51cCBhbmQgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgICAgcm91dGluZXMuICBGb3IgZXhjZXB0aW9uIG1vZGlmaWNhdGlvbiwgcGxlYXNlIHJlZmVyIHRvIHRoZQogICAgICAgICAgICBuZXcgOm1ldGg6YC5Db25uZWN0aW9uRXZlbnRzLmhhbmRsZV9lcnJvcmAgZXZlbnQuCgogICAgICAgIFN1YnNlcXVlbnQgdG8gdGhpcyBob29rLCBTUUxBbGNoZW15IG1heSBhdHRlbXB0IGFueQogICAgICAgIG51bWJlciBvZiBvcGVyYXRpb25zIG9uIHRoZSBjb25uZWN0aW9uL2N1cnNvciwgaW5jbHVkaW5nCiAgICAgICAgY2xvc2luZyB0aGUgY3Vyc29yLCByb2xsaW5nIGJhY2sgb2YgdGhlIHRyYW5zYWN0aW9uIGluIHRoZQogICAgICAgIGNhc2Ugb2YgY29ubmVjdGlvbmxlc3MgZXhlY3V0aW9uLCBhbmQgZGlzcG9zaW5nIG9mIHRoZSBlbnRpcmUKICAgICAgICBjb25uZWN0aW9uIHBvb2wgaWYgYSAiZGlzY29ubmVjdCIgd2FzIGRldGVjdGVkLiAgIFRoZQogICAgICAgIGV4Y2VwdGlvbiBpcyB0aGVuIHdyYXBwZWQgaW4gYSBTUUxBbGNoZW15IERCQVBJIGV4Y2VwdGlvbgogICAgICAgIHdyYXBwZXIgYW5kIHJlLXRocm93bi4KCiAgICAgICAgOnBhcmFtIGNvbm46IDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdAogICAgICAgIDpwYXJhbSBjdXJzb3I6IERCQVBJIGN1cnNvciBvYmplY3QKICAgICAgICA6cGFyYW0gc3RhdGVtZW50OiBzdHJpbmcgU1FMIHN0YXRlbWVudCwgYXMgcGFzc2VkIHRvIHRoZSBEQkFQSQogICAgICAgIDpwYXJhbSBwYXJhbWV0ZXJzOiBEaWN0aW9uYXJ5LCB0dXBsZSwgb3IgbGlzdCBvZiBwYXJhbWV0ZXJzIGJlaW5nCiAgICAgICAgIHBhc3NlZCB0byB0aGUgYGBleGVjdXRlKClgYCBvciBgYGV4ZWN1dGVtYW55KClgYCBtZXRob2Qgb2YgdGhlCiAgICAgICAgIERCQVBJIGBgY3Vyc29yYGAuICBJbiBzb21lIGNhc2VzIG1heSBiZSBgYE5vbmVgYC4KICAgICAgICA6cGFyYW0gY29udGV4dDogOmNsYXNzOmAuRXhlY3V0aW9uQ29udGV4dGAgb2JqZWN0IGluIHVzZS4gIE1heQogICAgICAgICBiZSBgYE5vbmVgYC4KICAgICAgICA6cGFyYW0gZXhjZXB0aW9uOiBUaGUgKip1bndyYXBwZWQqKiBleGNlcHRpb24gZW1pdHRlZCBkaXJlY3RseSBmcm9tIHRoZQogICAgICAgICBEQkFQSS4gIFRoZSBjbGFzcyBoZXJlIGlzIHNwZWNpZmljIHRvIHRoZSBEQkFQSSBtb2R1bGUgaW4gdXNlLgoKICAgICAgICBOcgsAAAApB3IMAAAAcjgAAAByPwAAAHJAAAAAckEAAAByQgAAAHIuAAAAcgsAAAByCwAAAHIQAAAA2gtkYmFwaV9lcnJvcvECAABzAgAAAAAyehxDb25uZWN0aW9uRXZlbnRzLmRiYXBpX2Vycm9yYwIAAAAAAAAAAgAAAAEAAABDAAAAcwQAAABkAVMAKQJhEBsAAEludGVyY2VwdCBhbGwgZXhjZXB0aW9ucyBwcm9jZXNzZWQgYnkgdGhlIDpjbGFzczpgLkNvbm5lY3Rpb25gLgoKICAgICAgICBUaGlzIGluY2x1ZGVzIGFsbCBleGNlcHRpb25zIGVtaXR0ZWQgYnkgdGhlIERCQVBJIGFzIHdlbGwgYXMKICAgICAgICB3aXRoaW4gU1FMQWxjaGVteSdzIHN0YXRlbWVudCBpbnZvY2F0aW9uIHByb2Nlc3MsIGluY2x1ZGluZwogICAgICAgIGVuY29kaW5nIGVycm9ycyBhbmQgb3RoZXIgc3RhdGVtZW50IHZhbGlkYXRpb24gZXJyb3JzLiAgT3RoZXIgYXJlYXMKICAgICAgICBpbiB3aGljaCB0aGUgZXZlbnQgaXMgaW52b2tlZCBpbmNsdWRlIHRyYW5zYWN0aW9uIGJlZ2luIGFuZCBlbmQsCiAgICAgICAgcmVzdWx0IHJvdyBmZXRjaGluZywgY3Vyc29yIGNyZWF0aW9uLgoKICAgICAgICBOb3RlIHRoYXQgOm1ldGg6YC5oYW5kbGVfZXJyb3JgIG1heSBzdXBwb3J0IG5ldyBraW5kcyBvZiBleGNlcHRpb25zCiAgICAgICAgYW5kIG5ldyBjYWxsaW5nIHNjZW5hcmlvcyBhdCAqYW55IHRpbWUqLiAgQ29kZSB3aGljaCB1c2VzIHRoaXMKICAgICAgICBldmVudCBtdXN0IGV4cGVjdCBuZXcgY2FsbGluZyBwYXR0ZXJucyB0byBiZSBwcmVzZW50IGluIG1pbm9yCiAgICAgICAgcmVsZWFzZXMuCgogICAgICAgIFRvIHN1cHBvcnQgdGhlIHdpZGUgdmFyaWV0eSBvZiBtZW1iZXJzIHRoYXQgY29ycmVzcG9uZCB0byBhbiBleGNlcHRpb24sCiAgICAgICAgYXMgd2VsbCBhcyB0byBhbGxvdyBleHRlbnNpYmlsaXR5IG9mIHRoZSBldmVudCB3aXRob3V0IGJhY2t3YXJkcwogICAgICAgIGluY29tcGF0aWJpbGl0eSwgdGhlIHNvbGUgYXJndW1lbnQgcmVjZWl2ZWQgaXMgYW4gaW5zdGFuY2Ugb2YKICAgICAgICA6Y2xhc3M6YC5FeGNlcHRpb25Db250ZXh0YC4gICBUaGlzIG9iamVjdCBjb250YWlucyBkYXRhIG1lbWJlcnMKICAgICAgICByZXByZXNlbnRpbmcgZGV0YWlsIGFib3V0IHRoZSBleGNlcHRpb24uCgogICAgICAgIFVzZSBjYXNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBob29rIGluY2x1ZGU6CgogICAgICAgICogcmVhZC1vbmx5LCBsb3ctbGV2ZWwgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciBsb2dnaW5nIGFuZAogICAgICAgICAgZGVidWdnaW5nIHB1cnBvc2VzCiAgICAgICAgKiBleGNlcHRpb24gcmUtd3JpdGluZwogICAgICAgICogRXN0YWJsaXNoaW5nIG9yIGRpc2FibGluZyB3aGV0aGVyIGEgY29ubmVjdGlvbiBvciB0aGUgb3duaW5nCiAgICAgICAgICBjb25uZWN0aW9uIHBvb2wgaXMgaW52YWxpZGF0ZWQgb3IgZXhwaXJlZCBpbiByZXNwb25zZSB0byBhCiAgICAgICAgICBzcGVjaWZpYyBleGNlcHRpb24uCgogICAgICAgIFRoZSBob29rIGlzIGNhbGxlZCB3aGlsZSB0aGUgY3Vyc29yIGZyb20gdGhlIGZhaWxlZCBvcGVyYXRpb24KICAgICAgICAoaWYgYW55KSBpcyBzdGlsbCBvcGVuIGFuZCBhY2Nlc3NpYmxlLiAgIFNwZWNpYWwgY2xlYW51cCBvcGVyYXRpb25zCiAgICAgICAgY2FuIGJlIGNhbGxlZCBvbiB0aGlzIGN1cnNvcjsgU1FMQWxjaGVteSB3aWxsIGF0dGVtcHQgdG8gY2xvc2UKICAgICAgICB0aGlzIGN1cnNvciBzdWJzZXF1ZW50IHRvIHRoaXMgaG9vayBiZWluZyBpbnZva2VkLiAgSWYgdGhlIGNvbm5lY3Rpb24KICAgICAgICBpcyBpbiAiYXV0b2NvbW1pdCIgbW9kZSwgdGhlIHRyYW5zYWN0aW9uIGFsc28gcmVtYWlucyBvcGVuIHdpdGhpbgogICAgICAgIHRoZSBzY29wZSBvZiB0aGlzIGhvb2s7IHRoZSByb2xsYmFjayBvZiB0aGUgcGVyLXN0YXRlbWVudCB0cmFuc2FjdGlvbgogICAgICAgIGFsc28gb2NjdXJzIGFmdGVyIHRoZSBob29rIGlzIGNhbGxlZC4KCiAgICAgICAgRm9yIHRoZSBjb21tb24gY2FzZSBvZiBkZXRlY3RpbmcgYSAiZGlzY29ubmVjdCIgc2l0dWF0aW9uIHdoaWNoCiAgICAgICAgaXMgbm90IGN1cnJlbnRseSBoYW5kbGVkIGJ5IHRoZSBTUUxBbGNoZW15IGRpYWxlY3QsIHRoZQogICAgICAgIDphdHRyOmAuRXhjZXB0aW9uQ29udGV4dC5pc19kaXNjb25uZWN0YCBmbGFnIGNhbiBiZSBzZXQgdG8gVHJ1ZSB3aGljaAogICAgICAgIHdpbGwgY2F1c2UgdGhlIGV4Y2VwdGlvbiB0byBiZSBjb25zaWRlcmVkIGFzIGEgZGlzY29ubmVjdCBzaXR1YXRpb24sCiAgICAgICAgd2hpY2ggdHlwaWNhbGx5IHJlc3VsdHMgaW4gdGhlIGNvbm5lY3Rpb24gcG9vbCBiZWluZyBpbnZhbGlkYXRlZDo6CgogICAgICAgICAgICBAZXZlbnQubGlzdGVuc19mb3IoRW5naW5lLCAiaGFuZGxlX2Vycm9yIikKICAgICAgICAgICAgZGVmIGhhbmRsZV9leGNlcHRpb24oY29udGV4dCk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGNvbnRleHQub3JpZ2luYWxfZXhjZXB0aW9uLCBweW9kYmMuRXJyb3IpOgogICAgICAgICAgICAgICAgICAgIGZvciBjb2RlIGluICgKICAgICAgICAgICAgICAgICAgICAgICAgJzA4UzAxJywgJzAxMDAyJywgJzA4MDAzJywKICAgICAgICAgICAgICAgICAgICAgICAgJzA4MDA3JywgJzA4UzAyJywgJzA4MDAxJywgJ0hZVDAwJywgJ0hZMDEwJyk6CgogICAgICAgICAgICAgICAgICAgICAgICBpZiBjb2RlIGluIHN0cihjb250ZXh0Lm9yaWdpbmFsX2V4Y2VwdGlvbik6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmlzX2Rpc2Nvbm5lY3QgPSBUcnVlCgogICAgICAgIEEgaGFuZGxlciBmdW5jdGlvbiBoYXMgdHdvIG9wdGlvbnMgZm9yIHJlcGxhY2luZwogICAgICAgIHRoZSBTUUxBbGNoZW15LWNvbnN0cnVjdGVkIGV4Y2VwdGlvbiBpbnRvIG9uZSB0aGF0IGlzIHVzZXIKICAgICAgICBkZWZpbmVkLiAgIEl0IGNhbiBlaXRoZXIgcmFpc2UgdGhpcyBuZXcgZXhjZXB0aW9uIGRpcmVjdGx5LCBpbgogICAgICAgIHdoaWNoIGNhc2UgYWxsIGZ1cnRoZXIgZXZlbnQgbGlzdGVuZXJzIGFyZSBieXBhc3NlZCBhbmQgdGhlCiAgICAgICAgZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLCBhZnRlciBhcHByb3ByaWF0ZSBjbGVhbnVwIGFzIHRha2VuCiAgICAgICAgcGxhY2U6OgoKICAgICAgICAgICAgQGV2ZW50Lmxpc3RlbnNfZm9yKEVuZ2luZSwgImhhbmRsZV9lcnJvciIpCiAgICAgICAgICAgIGRlZiBoYW5kbGVfZXhjZXB0aW9uKGNvbnRleHQpOgogICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShjb250ZXh0Lm9yaWdpbmFsX2V4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICBwc3ljb3BnMi5PcGVyYXRpb25hbEVycm9yKSBhbmQgXAogICAgICAgICAgICAgICAgICAgICJmYWlsZWQiIGluIHN0cihjb250ZXh0Lm9yaWdpbmFsX2V4Y2VwdGlvbik6CiAgICAgICAgICAgICAgICAgICAgcmFpc2UgTXlTcGVjaWFsRXhjZXB0aW9uKCJmYWlsZWQgb3BlcmF0aW9uIikKCiAgICAgICAgLi4gd2FybmluZzo6ICBCZWNhdXNlIHRoZSA6bWV0aDpgLkNvbm5lY3Rpb25FdmVudHMuaGFuZGxlX2Vycm9yYAogICAgICAgICAgIGV2ZW50IHNwZWNpZmljYWxseSBwcm92aWRlcyBmb3IgZXhjZXB0aW9ucyB0byBiZSByZS10aHJvd24gYXMKICAgICAgICAgICB0aGUgdWx0aW1hdGUgZXhjZXB0aW9uIHJhaXNlZCBieSB0aGUgZmFpbGVkIHN0YXRlbWVudCwKICAgICAgICAgICAqKnN0YWNrIHRyYWNlcyB3aWxsIGJlIG1pc2xlYWRpbmcqKiBpZiB0aGUgdXNlci1kZWZpbmVkIGV2ZW50CiAgICAgICAgICAgaGFuZGxlciBpdHNlbGYgZmFpbHMgYW5kIHRocm93cyBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbjsKICAgICAgICAgICB0aGUgc3RhY2sgdHJhY2UgbWF5IG5vdCBpbGx1c3RyYXRlIHRoZSBhY3R1YWwgY29kZSBsaW5lIHRoYXQKICAgICAgICAgICBmYWlsZWQhICBJdCBpcyBhZHZpc2VkIHRvIGNvZGUgY2FyZWZ1bGx5IGhlcmUgYW5kIHVzZQogICAgICAgICAgIGxvZ2dpbmcgYW5kL29yIGlubGluZSBkZWJ1Z2dpbmcgaWYgdW5leHBlY3RlZCBleGNlcHRpb25zIGFyZQogICAgICAgICAgIG9jY3VycmluZy4KCiAgICAgICAgQWx0ZXJuYXRpdmVseSwgYSAiY2hhaW5lZCIgc3R5bGUgb2YgZXZlbnQgaGFuZGxpbmcgY2FuIGJlCiAgICAgICAgdXNlZCwgYnkgY29uZmlndXJpbmcgdGhlIGhhbmRsZXIgd2l0aCB0aGUgYGByZXR2YWw9VHJ1ZWBgCiAgICAgICAgbW9kaWZpZXIgYW5kIHJldHVybmluZyB0aGUgbmV3IGV4Y2VwdGlvbiBpbnN0YW5jZSBmcm9tIHRoZQogICAgICAgIGZ1bmN0aW9uLiAgSW4gdGhpcyBjYXNlLCBldmVudCBoYW5kbGluZyB3aWxsIGNvbnRpbnVlIG9udG8gdGhlCiAgICAgICAgbmV4dCBoYW5kbGVyLiAgIFRoZSAiY2hhaW5lZCIgZXhjZXB0aW9uIGlzIGF2YWlsYWJsZSB1c2luZwogICAgICAgIDphdHRyOmAuRXhjZXB0aW9uQ29udGV4dC5jaGFpbmVkX2V4Y2VwdGlvbmA6OgoKICAgICAgICAgICAgQGV2ZW50Lmxpc3RlbnNfZm9yKEVuZ2luZSwgImhhbmRsZV9lcnJvciIsIHJldHZhbD1UcnVlKQogICAgICAgICAgICBkZWYgaGFuZGxlX2V4Y2VwdGlvbihjb250ZXh0KToKICAgICAgICAgICAgICAgIGlmIGNvbnRleHQuY2hhaW5lZF9leGNlcHRpb24gaXMgbm90IE5vbmUgYW5kIFwKICAgICAgICAgICAgICAgICAgICAic3BlY2lhbCIgaW4gY29udGV4dC5jaGFpbmVkX2V4Y2VwdGlvbi5tZXNzYWdlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNeVNwZWNpYWxFeGNlcHRpb24oImZhaWxlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlPWNvbnRleHQuY2hhaW5lZF9leGNlcHRpb24pCgogICAgICAgIEhhbmRsZXJzIHRoYXQgcmV0dXJuIGBgTm9uZWBgIG1heSBiZSB1c2VkIHdpdGhpbiB0aGUgY2hhaW47IHdoZW4KICAgICAgICBhIGhhbmRsZXIgcmV0dXJucyBgYE5vbmVgYCwgdGhlIHByZXZpb3VzIGV4Y2VwdGlvbiBpbnN0YW5jZSwKICAgICAgICBpZiBhbnksIGlzIG1haW50YWluZWQgYXMgdGhlIGN1cnJlbnQgZXhjZXB0aW9uIHRoYXQgaXMgcGFzc2VkIG9udG8gdGhlCiAgICAgICAgbmV4dCBoYW5kbGVyLgoKICAgICAgICBXaGVuIGEgY3VzdG9tIGV4Y2VwdGlvbiBpcyByYWlzZWQgb3IgcmV0dXJuZWQsIFNRTEFsY2hlbXkgcmFpc2VzCiAgICAgICAgdGhpcyBuZXcgZXhjZXB0aW9uIGFzLWlzLCBpdCBpcyBub3Qgd3JhcHBlZCBieSBhbnkgU1FMQWxjaGVteQogICAgICAgIG9iamVjdC4gIElmIHRoZSBleGNlcHRpb24gaXMgbm90IGEgc3ViY2xhc3Mgb2YKICAgICAgICA6Y2xhc3M6YHNxbGFsY2hlbXkuZXhjLlN0YXRlbWVudEVycm9yYCwKICAgICAgICBjZXJ0YWluIGZlYXR1cmVzIG1heSBub3QgYmUgYXZhaWxhYmxlOyBjdXJyZW50bHkgdGhpcyBpbmNsdWRlcwogICAgICAgIHRoZSBPUk0ncyBmZWF0dXJlIG9mIGFkZGluZyBhIGRldGFpbCBoaW50IGFib3V0ICJhdXRvZmx1c2giIHRvCiAgICAgICAgZXhjZXB0aW9ucyByYWlzZWQgd2l0aGluIHRoZSBhdXRvZmx1c2ggcHJvY2Vzcy4KCiAgICAgICAgOnBhcmFtIGNvbnRleHQ6IGFuIDpjbGFzczpgLkV4Y2VwdGlvbkNvbnRleHRgIG9iamVjdC4gIFNlZSB0aGlzCiAgICAgICAgIGNsYXNzIGZvciBkZXRhaWxzIG9uIGFsbCBhdmFpbGFibGUgbWVtYmVycy4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMC45LjcgQWRkZWQgdGhlCiAgICAgICAgICAgIDptZXRoOmAuQ29ubmVjdGlvbkV2ZW50cy5oYW5kbGVfZXJyb3JgIGhvb2suCgogICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMS4xIFRoZSA6bWV0aDpgLmhhbmRsZV9lcnJvcmAgZXZlbnQgd2lsbCBub3cKICAgICAgICAgICByZWNlaXZlIGFsbCBleGNlcHRpb25zIHRoYXQgaW5oZXJpdCBmcm9tIGBgQmFzZUV4Y2VwdGlvbmBgLAogICAgICAgICAgIGluY2x1ZGluZyBgYFN5c3RlbUV4aXRgYCBhbmQgYGBLZXlib2FyZEludGVycnVwdGBgLiAgVGhlIHNldHRpbmcgZm9yCiAgICAgICAgICAgOmF0dHI6YC5FeGNlcHRpb25Db250ZXh0LmlzX2Rpc2Nvbm5lY3RgIGlzIGBgVHJ1ZWBgIGluIHRoaXMgY2FzZSBhbmQKICAgICAgICAgICB0aGUgZGVmYXVsdCBmb3IKICAgICAgICAgICA6YXR0cjpgLkV4Y2VwdGlvbkNvbnRleHQuaW52YWxpZGF0ZV9wb29sX29uX2Rpc2Nvbm5lY3RgIGlzCiAgICAgICAgICAgYGBGYWxzZWBgLgoKICAgICAgICAuLiB2ZXJzaW9uY2hhbmdlZDo6IDEuMC4wIFRoZSA6bWV0aDpgLmhhbmRsZV9lcnJvcmAgZXZlbnQgaXMgbm93CiAgICAgICAgICAgaW52b2tlZCB3aGVuIGFuIDpjbGFzczpgLkVuZ2luZWAgZmFpbHMgZHVyaW5nIHRoZSBpbml0aWFsCiAgICAgICAgICAgY2FsbCB0byA6bWV0aDpgLkVuZ2luZS5jb25uZWN0YCwgYXMgd2VsbCBhcyB3aGVuIGEKICAgICAgICAgICA6Y2xhc3M6YC5Db25uZWN0aW9uYCBvYmplY3QgZW5jb3VudGVycyBhbiBlcnJvciBkdXJpbmcgYQogICAgICAgICAgIHJlY29ubmVjdCBvcGVyYXRpb24uCgogICAgICAgIC4uIHZlcnNpb25jaGFuZ2VkOjogMS4wLjAgVGhlIDptZXRoOmAuaGFuZGxlX2Vycm9yYCBldmVudCBpcwogICAgICAgICAgIG5vdCBmaXJlZCBvZmYgd2hlbiBhIGRpYWxlY3QgbWFrZXMgdXNlIG9mIHRoZQogICAgICAgICAgIGBgc2tpcF91c2VyX2Vycm9yX2V2ZW50c2BgIGV4ZWN1dGlvbiBvcHRpb24uICAgVGhpcyBpcyB1c2VkCiAgICAgICAgICAgYnkgZGlhbGVjdHMgd2hpY2ggaW50ZW5kIHRvIGNhdGNoIFNRTEFsY2hlbXktc3BlY2lmaWMgZXhjZXB0aW9ucwogICAgICAgICAgIHdpdGhpbiBzcGVjaWZpYyBvcGVyYXRpb25zLCBzdWNoIGFzIHdoZW4gdGhlIE15U1FMIGRpYWxlY3QgZGV0ZWN0cwogICAgICAgICAgIGEgdGFibGUgbm90IHByZXNlbnQgd2l0aGluIHRoZSBgYGhhc190YWJsZSgpYGAgZGlhbGVjdCBtZXRob2QuCiAgICAgICAgICAgUHJpb3IgdG8gMS4wLjAsIGNvZGUgd2hpY2ggaW1wbGVtZW50cyA6bWV0aDpgLmhhbmRsZV9lcnJvcmAgbmVlZHMKICAgICAgICAgICB0byBlbnN1cmUgdGhhdCBleGNlcHRpb25zIHRocm93biBpbiB0aGVzZSBzY2VuYXJpb3MgYXJlIHJlLXJhaXNlZAogICAgICAgICAgIHdpdGhvdXQgbW9kaWZpY2F0aW9uLgoKICAgICAgICBOcgsAAAApAnIMAAAAWhFleGNlcHRpb25fY29udGV4dHILAAAAcgsAAAByEAAAAHJFAAAAJQMAAHMEAAAAAH8AB3odQ29ubmVjdGlvbkV2ZW50cy5oYW5kbGVfZXJyb3JjAwAAAAAAAAADAAAAAQAAAEMAAABzBAAAAGQBUwApAmH7CAAASW50ZXJjZXB0IHRoZSBjcmVhdGlvbiBvZiBhIG5ldyA6Y2xhc3M6YC5Db25uZWN0aW9uYC4KCiAgICAgICAgVGhpcyBldmVudCBpcyBjYWxsZWQgdHlwaWNhbGx5IGFzIHRoZSBkaXJlY3QgcmVzdWx0IG9mIGNhbGxpbmcKICAgICAgICB0aGUgOm1ldGg6YC5FbmdpbmUuY29ubmVjdGAgbWV0aG9kLgoKICAgICAgICBJdCBkaWZmZXJzIGZyb20gdGhlIDptZXRoOmAuUG9vbEV2ZW50cy5jb25uZWN0YCBtZXRob2QsIHdoaWNoCiAgICAgICAgcmVmZXJzIHRvIHRoZSBhY3R1YWwgY29ubmVjdGlvbiB0byBhIGRhdGFiYXNlIGF0IHRoZSBEQkFQSSBsZXZlbDsKICAgICAgICBhIERCQVBJIGNvbm5lY3Rpb24gbWF5IGJlIHBvb2xlZCBhbmQgcmV1c2VkIGZvciBtYW55IG9wZXJhdGlvbnMuCiAgICAgICAgSW4gY29udHJhc3QsIHRoaXMgZXZlbnQgcmVmZXJzIG9ubHkgdG8gdGhlIHByb2R1Y3Rpb24gb2YgYSBoaWdoZXIgbGV2ZWwKICAgICAgICA6Y2xhc3M6YC5Db25uZWN0aW9uYCB3cmFwcGVyIGFyb3VuZCBzdWNoIGEgREJBUEkgY29ubmVjdGlvbi4KCiAgICAgICAgSXQgYWxzbyBkaWZmZXJzIGZyb20gdGhlIDptZXRoOmAuUG9vbEV2ZW50cy5jaGVja291dGAgZXZlbnQKICAgICAgICBpbiB0aGF0IGl0IGlzIHNwZWNpZmljIHRvIHRoZSA6Y2xhc3M6YC5Db25uZWN0aW9uYCBvYmplY3QsIG5vdCB0aGUKICAgICAgICBEQkFQSSBjb25uZWN0aW9uIHRoYXQgOm1ldGg6YC5Qb29sRXZlbnRzLmNoZWNrb3V0YCBkZWFscyB3aXRoLCBhbHRob3VnaAogICAgICAgIHRoaXMgREJBUEkgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUgaGVyZSB2aWEgdGhlCiAgICAgICAgOmF0dHI6YC5Db25uZWN0aW9uLmNvbm5lY3Rpb25gIGF0dHJpYnV0ZS4gIEJ1dCBub3RlIHRoZXJlIGNhbiBpbiBmYWN0CiAgICAgICAgYmUgbXVsdGlwbGUgOm1ldGg6YC5Qb29sRXZlbnRzLmNoZWNrb3V0YCBldmVudHMgd2l0aGluIHRoZSBsaWZlc3BhbgogICAgICAgIG9mIGEgc2luZ2xlIDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdCwgaWYgdGhhdCA6Y2xhc3M6YC5Db25uZWN0aW9uYAogICAgICAgIGlzIGludmFsaWRhdGVkIGFuZCByZS1lc3RhYmxpc2hlZC4gIFRoZXJlIGNhbiBhbHNvIGJlIG11bHRpcGxlCiAgICAgICAgOmNsYXNzOmAuQ29ubmVjdGlvbmAgb2JqZWN0cyBnZW5lcmF0ZWQgZm9yIHRoZSBzYW1lIGFscmVhZHktY2hlY2tlZC1vdXQKICAgICAgICBEQkFQSSBjb25uZWN0aW9uLCBpbiB0aGUgY2FzZSB0aGF0IGEgImJyYW5jaCIgb2YgYSA6Y2xhc3M6YC5Db25uZWN0aW9uYAogICAgICAgIGlzIHByb2R1Y2VkLgoKICAgICAgICA6cGFyYW0gY29ubjogOmNsYXNzOmAuQ29ubmVjdGlvbmAgb2JqZWN0LgogICAgICAgIDpwYXJhbSBicmFuY2g6IGlmIFRydWUsIHRoaXMgaXMgYSAiYnJhbmNoIiBvZiBhbiBleGlzdGluZwogICAgICAgICA6Y2xhc3M6YC5Db25uZWN0aW9uYC4gIEEgYnJhbmNoIGlzIGdlbmVyYXRlZCB3aXRoaW4gdGhlIGNvdXJzZQogICAgICAgICBvZiBhIHN0YXRlbWVudCBleGVjdXRpb24gdG8gaW52b2tlIHN1cHBsZW1lbnRhbCBzdGF0ZW1lbnRzLCBtb3N0CiAgICAgICAgIHR5cGljYWxseSB0byBwcmUtZXhlY3V0ZSBhIFNFTEVDVCBvZiBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBwdXJwb3NlcwogICAgICAgICBvZiBhbiBJTlNFUlQgc3RhdGVtZW50LgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjkuMAoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDpyZWY6YHBvb2xfZGlzY29ubmVjdHNfcGVzc2ltaXN0aWNgIC0gaWxsdXN0cmF0ZXMgaG93IHRvIHVzZQogICAgICAgICAgICA6bWV0aDpgLkNvbm5lY3Rpb25FdmVudHMuZW5naW5lX2Nvbm5lY3RgCiAgICAgICAgICAgIHRvIHRyYW5zcGFyZW50bHkgZW5zdXJlIHBvb2xlZCBjb25uZWN0aW9ucyBhcmUgY29ubmVjdGVkIHRvIHRoZQogICAgICAgICAgICBkYXRhYmFzZS4KCiAgICAgICAgICAgIDptZXRoOmAuUG9vbEV2ZW50cy5jaGVja291dGAgdGhlIGxvd2VyLWxldmVsIHBvb2wgY2hlY2tvdXQgZXZlbnQKICAgICAgICAgICAgZm9yIGFuIGluZGl2aWR1YWwgREJBUEkgY29ubmVjdGlvbgoKICAgICAgICAgICAgOm1ldGg6YC5Db25uZWN0aW9uRXZlbnRzLnNldF9jb25uZWN0aW9uX2V4ZWN1dGlvbl9vcHRpb25zYCAtIGEgY29weQogICAgICAgICAgICBvZiBhIDpjbGFzczpgLkNvbm5lY3Rpb25gIGlzIGFsc28gbWFkZSB3aGVuIHRoZQogICAgICAgICAgICA6bWV0aDpgLkNvbm5lY3Rpb24uZXhlY3V0aW9uX29wdGlvbnNgIG1ldGhvZCBpcyBjYWxsZWQuCgogICAgICAgIE5yCwAAACkDcgwAAAByOAAAANoGYnJhbmNocgsAAAByCwAAAHIQAAAA2g5lbmdpbmVfY29ubmVjdK0DAABzAgAAAAAveh9Db25uZWN0aW9uRXZlbnRzLmVuZ2luZV9jb25uZWN0YwMAAAAAAAAAAwAAAAEAAABDAAAAcwQAAABkAVMAKQJh3gMAAEludGVyY2VwdCB3aGVuIHRoZSA6bWV0aDpgLkNvbm5lY3Rpb24uZXhlY3V0aW9uX29wdGlvbnNgCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZC4KCiAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBuZXcgOmNsYXNzOmAuQ29ubmVjdGlvbmAgaGFzIGJlZW4KICAgICAgICBwcm9kdWNlZCwgd2l0aCB0aGUgbmV3bHkgdXBkYXRlZCBleGVjdXRpb24gb3B0aW9ucyBjb2xsZWN0aW9uLCBidXQKICAgICAgICBiZWZvcmUgdGhlIDpjbGFzczpgLkRpYWxlY3RgIGhhcyBhY3RlZCB1cG9uIGFueSBvZiB0aG9zZSBuZXcgb3B0aW9ucy4KCiAgICAgICAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgd2hlbiBhIG5ldyA6Y2xhc3M6YC5Db25uZWN0aW9uYAogICAgICAgIGlzIHByb2R1Y2VkIHdoaWNoIGlzIGluaGVyaXRpbmcgZXhlY3V0aW9uIG9wdGlvbnMgZnJvbSBpdHMgcGFyZW50CiAgICAgICAgOmNsYXNzOmAuRW5naW5lYDsgdG8gaW50ZXJjZXB0IHRoaXMgY29uZGl0aW9uLCB1c2UgdGhlCiAgICAgICAgOm1ldGg6YC5Db25uZWN0aW9uRXZlbnRzLmVuZ2luZV9jb25uZWN0YCBldmVudC4KCiAgICAgICAgOnBhcmFtIGNvbm46IFRoZSBuZXdseSBjb3BpZWQgOmNsYXNzOmAuQ29ubmVjdGlvbmAgb2JqZWN0CgogICAgICAgIDpwYXJhbSBvcHRzOiBkaWN0aW9uYXJ5IG9mIG9wdGlvbnMgdGhhdCB3ZXJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgOm1ldGg6YC5Db25uZWN0aW9uLmV4ZWN1dGlvbl9vcHRpb25zYCBtZXRob2QuCgogICAgICAgIC4uIHZlcnNpb25hZGRlZDo6IDAuOS4wCgogICAgICAgIC4uIHNlZWFsc286OgoKICAgICAgICAgICAgOm1ldGg6YC5Db25uZWN0aW9uRXZlbnRzLnNldF9lbmdpbmVfZXhlY3V0aW9uX29wdGlvbnNgIC0gZXZlbnQKICAgICAgICAgICAgd2hpY2ggaXMgY2FsbGVkIHdoZW4gOm1ldGg6YC5FbmdpbmUuZXhlY3V0aW9uX29wdGlvbnNgIGlzIGNhbGxlZC4KCgogICAgICAgIE5yCwAAACkDcgwAAAByOAAAANoEb3B0c3ILAAAAcgsAAAByEAAAANogc2V0X2Nvbm5lY3Rpb25fZXhlY3V0aW9uX29wdGlvbnPeAwAAcwIAAAAAGnoxQ29ubmVjdGlvbkV2ZW50cy5zZXRfY29ubmVjdGlvbl9leGVjdXRpb25fb3B0aW9uc2MDAAAAAAAAAAMAAAABAAAAQwAAAHMEAAAAZAFTACkCYbUDAABJbnRlcmNlcHQgd2hlbiB0aGUgOm1ldGg6YC5FbmdpbmUuZXhlY3V0aW9uX29wdGlvbnNgCiAgICAgICAgbWV0aG9kIGlzIGNhbGxlZC4KCiAgICAgICAgVGhlIDptZXRoOmAuRW5naW5lLmV4ZWN1dGlvbl9vcHRpb25zYCBtZXRob2QgcHJvZHVjZXMgYSBzaGFsbG93CiAgICAgICAgY29weSBvZiB0aGUgOmNsYXNzOmAuRW5naW5lYCB3aGljaCBzdG9yZXMgdGhlIG5ldyBvcHRpb25zLiAgVGhhdCBuZXcKICAgICAgICA6Y2xhc3M6YC5FbmdpbmVgIGlzIHBhc3NlZCBoZXJlLiAgIEEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvZiB0aGlzCiAgICAgICAgbWV0aG9kIGlzIHRvIGFkZCBhIDptZXRoOmAuQ29ubmVjdGlvbkV2ZW50cy5lbmdpbmVfY29ubmVjdGAgZXZlbnQKICAgICAgICBoYW5kbGVyIHRvIHRoZSBnaXZlbiA6Y2xhc3M6YC5FbmdpbmVgIHdoaWNoIHdpbGwgcGVyZm9ybSBzb21lIHBlci0KICAgICAgICA6Y2xhc3M6YC5Db25uZWN0aW9uYCB0YXNrIHNwZWNpZmljIHRvIHRoZXNlIGV4ZWN1dGlvbiBvcHRpb25zLgoKICAgICAgICA6cGFyYW0gY29ubjogVGhlIG5ld2x5IGNvcGllZCA6Y2xhc3M6YC5FbmdpbmVgIG9iamVjdAoKICAgICAgICA6cGFyYW0gb3B0czogZGljdGlvbmFyeSBvZiBvcHRpb25zIHRoYXQgd2VyZSBwYXNzZWQgdG8gdGhlCiAgICAgICAgIDptZXRoOmAuQ29ubmVjdGlvbi5leGVjdXRpb25fb3B0aW9uc2AgbWV0aG9kLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAwLjkuMAoKICAgICAgICAuLiBzZWVhbHNvOjoKCiAgICAgICAgICAgIDptZXRoOmAuQ29ubmVjdGlvbkV2ZW50cy5zZXRfY29ubmVjdGlvbl9leGVjdXRpb25fb3B0aW9uc2AgLSBldmVudAogICAgICAgICAgICB3aGljaCBpcyBjYWxsZWQgd2hlbiA6bWV0aDpgLkNvbm5lY3Rpb24uZXhlY3V0aW9uX29wdGlvbnNgIGlzCiAgICAgICAgICAgIGNhbGxlZC4KCiAgICAgICAgTnILAAAAKQNyDAAAANoGZW5naW5lclUAAAByCwAAAHILAAAAchAAAADaHHNldF9lbmdpbmVfZXhlY3V0aW9uX29wdGlvbnP6AwAAcwIAAAAAGHotQ29ubmVjdGlvbkV2ZW50cy5zZXRfZW5naW5lX2V4ZWN1dGlvbl9vcHRpb25zYwIAAAAAAAAAAgAAAAEAAABDAAAAcwQAAABkAVMAKQJh2gIAAEludGVyY2VwdCB3aGVuIHRoZSA6bWV0aDpgLkVuZ2luZS5kaXNwb3NlYCBtZXRob2QgaXMgY2FsbGVkLgoKICAgICAgICBUaGUgOm1ldGg6YC5FbmdpbmUuZGlzcG9zZWAgbWV0aG9kIGluc3RydWN0cyB0aGUgZW5naW5lIHRvCiAgICAgICAgImRpc3Bvc2UiIG9mIGl0J3MgY29ubmVjdGlvbiBwb29sIChlLmcuIDpjbGFzczpgLlBvb2xgKSwgYW5kCiAgICAgICAgcmVwbGFjZXMgaXQgd2l0aCBhIG5ldyBvbmUuICBEaXNwb3Npbmcgb2YgdGhlIG9sZCBwb29sIGhhcyB0aGUKICAgICAgICBlZmZlY3QgdGhhdCBleGlzdGluZyBjaGVja2VkLWluIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQuICBUaGUgbmV3CiAgICAgICAgcG9vbCBkb2VzIG5vdCBlc3RhYmxpc2ggYW55IG5ldyBjb25uZWN0aW9ucyB1bnRpbCBpdCBpcyBmaXJzdCB1c2VkLgoKICAgICAgICBUaGlzIGV2ZW50IGNhbiBiZSB1c2VkIHRvIGluZGljYXRlIHRoYXQgcmVzb3VyY2VzIHJlbGF0ZWQgdG8gdGhlCiAgICAgICAgOmNsYXNzOmAuRW5naW5lYCBzaG91bGQgYWxzbyBiZSBjbGVhbmVkIHVwLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUKICAgICAgICA6Y2xhc3M6YC5FbmdpbmVgIGNhbiBzdGlsbCBiZSB1c2VkIGZvciBuZXcgcmVxdWVzdHMgaW4gd2hpY2ggY2FzZQogICAgICAgIGl0IHJlLWFjcXVpcmVzIGNvbm5lY3Rpb24gcmVzb3VyY2VzLgoKICAgICAgICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjAuNQoKICAgICAgICBOcgsAAAApAnIMAAAAclcAAAByCwAAAHILAAAAchAAAADaD2VuZ2luZV9kaXNwb3NlZBQEAABzAgAAAAAQeiBDb25uZWN0aW9uRXZlbnRzLmVuZ2luZV9kaXNwb3NlZGMCAAAAAAAAAAIAAAABAAAAQwAAAHMEAAAAZAFTACkCelVJbnRlcmNlcHQgYmVnaW4oKSBldmVudHMu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AAByEAAAANoScm9sbGJhY2tfc2F2ZXBvaW50UwQAAHMCAAAAAAd6I0Nvbm5lY3Rpb25FdmVudHMucm9sbGJhY2tfc2F2ZXBvaW50YwQAAAAAAAAABAAAAAEAAABDAAAAcwQAAABkAVMAKQJ66kludGVyY2VwdCByZWxlYXNlX3NhdmVwb2ludCgpIGV2ZW50cy4KCiAgICAgICAgOnBhcmFtIGNvbm46IDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdAogICAgICAgIDpwYXJhbSBuYW1lOiBzcGVjaWZpZWQgbmFtZSB1c2VkIGZvciB0aGUgc2F2ZXBvaW50LgogICAgICAgIDpwYXJhbSBjb250ZXh0OiA6Y2xhc3M6YC5FeGVjdXRpb25Db250ZXh0YCBpbiB1c2UuICBNYXkgYmUgYGBOb25lYGAuCgogICAgICAgIE5yCwAAACkEcgwAAAByOAAAAHJdAAAAckIAAAByCwAAAHILAAAAchAAAADaEXJlbGVhc2Vfc2F2ZXBvaW50XAQAAHMCAAAAAAd6IkNvbm5lY3Rpb25FdmVudHMucmVsZWFzZV9zYXZlcG9pbnRjAwAAAAAAAAADAAAAAQAAAEMAAABzBAAAAGQBUwApAnqLSW50ZXJjZXB0IGJlZ2luX3R3b3BoYXNlKCkgZXZlbnRzLgoKICAgICAgICA6cGFyYW0gY29ubjogOmNsYXNzOmAuQ29ubmVjdGlvbmAgb2JqZWN0CiAgICAgICAgOnBhcmFtIHhpZDogdHdvLXBoYXNlIFhJRCBpZGVudGlmaWVyCgogICAgICAgIE5yCwAAACkDcgwAAAByOAAAANoDeGlkcgsAAAByCwAAAHIQAAAA2g5iZWdpbl90d29waGFzZWUEAABzAgAAAAAGeh9Db25uZWN0aW9uRXZlbnRzLmJlZ2luX3R3b3BoYXNlYwMAAAAAAAAAAwAAAAEAAABDAAAAcwQAAABkAVMAKQJ6jEludGVyY2VwdCBwcmVwYXJlX3R3b3BoYXNlKCkgZXZlbnRzLgoKICAgICAgICA6cGFyYW0gY29ubjogOmNsYXNzOmAuQ29ubmVjdGlvbmAgb2JqZWN0CiAgICAgICAgOnBhcmFtIHhpZDogdHdvLXBoYXNlIFhJRCBpZGVudGlmaWVyCiAgICAgICAgTnILAAAAKQNyDAAAAHI4AAAAcmEAAAByCwAAAHILAAAAchAAAADaEHByZXBhcmVfdHdvcGhhc2VtBAAAcwIAAAAABXohQ29ubmVjdGlvbkV2ZW50cy5wcmVwYXJlX3R3b3BoYXNlYwQAAAAAAAAABAAAAAEAAABDAAAAcwQAAABkAVMAKQJ6+kludGVyY2VwdCByb2xsYmFja190d29waGFzZSgpIGV2ZW50cy4KCiAgICAgICAgOnBhcmFtIGNvbm46IDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdAogICAgICAgIDpwYXJhbSB4aWQ6IHR3by1waGFzZSBYSUQgaWRlbnRpZmllcgogICAgICAgIDpwYXJhbSBpc19wcmVwYXJlZDogYm9vbGVhbiwgaW5kaWNhdGVzIGlmCiAgICAgICAgIDptZXRoOmAuVHdvUGhhc2VUcmFuc2FjdGlvbi5wcmVwYXJlYCB3YXMgY2FsbGVkLgoKICAgICAgICBOcgsAAAApBHIMAAAAcjgAAAByYQAAANoLaXNfcHJlcGFyZWRyCwAAAHILAAAAchAAAADaEXJvbGxiYWNrX3R3b3BoYXNldAQAAHMCAAAAAAh6IkNvbm5lY3Rpb25FdmVudHMucm9sbGJhY2tfdHdvcGhhc2VjBAAAAAAAAAAEAAAAAQAAAEMAAABzBAAAAGQBUwApAnr4SW50ZXJjZXB0IGNvbW1pdF90d29waGFzZSgpIGV2ZW50cy4KCiAgICAgICAgOnBhcmFtIGNvbm46IDpjbGFzczpgLkNvbm5lY3Rpb25gIG9iamVjdAogICAgICAgIDpwYXJhbSB4aWQ6IHR3by1waGFzZSBYSUQgaWRlbnRpZmllcgogICAgICAgIDpwYXJhbSBpc19wcmVwYXJlZDogYm9vbGVhbiwgaW5kaWNhdGVzIGlmCiAgICAgICAgIDptZXRoOmAuVHdvUGhhc2VUcmFuc2FjdGlvbi5wcmVwYXJlYCB3YXMgY2FsbGVkLgoKICAgICAgICBOcgsAAAApBHIMAAAAcjgAAAByYQAAAHJkAAAAcgsAAAByCwAAAHIQAAAA2g9jb21taXRfdHdvcGhhc2V+BAAAcwIAAAAACHogQ29ubmVjdGlvbkV2ZW50cy5jb21taXRfdHdvcGhhc2VOKQFGKR9yGgAAAHIb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Y29ubmVjdGlvbiB3aWxsIGJlIHVzZWQuCgogICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSBldmVudCBjYW4gbWFuaXB1bGF0ZSB0aGUgY2FyZ3MgYW5kL29yIGNwYXJhbXMKICAgICAgICBjb2xsZWN0aW9uczsgY2FyZ3Mgd2lsbCBhbHdheXMgYmUgYSBQeXRob24gbGlzdCB0aGF0IGNhbiBiZSBtdXRhdGVkCiAgICAgICAgaW4tcGxhY2UgYW5kIGNwYXJhbXMgYSBQeXRob24gZGljdGlvbmFyeS4gIFJldHVybiBOb25lIHRvCiAgICAgICAgYWxsb3cgY29udHJvbCB0byBwYXNzIHRvIHRoZSBuZXh0IGV2ZW50IGhhbmRsZXIgYW5kIHVsdGltYXRlbHkKICAgICAgICB0byBhbGxvdyB0aGUgZGlhbGVjdCB0byBjb25uZWN0IG5vcm1hbGx5LCBnaXZlbiB0aGUgdXBkYXRlZAogICAgICAgIGFyZ3VtZW50cy4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4wLjMKCiAgICAgICAgTnILAAAAKQVyDAAAAHJoAAAAWghjb25uX3JlY1oFY2FyZ3NaB2NwYXJhbXNyCwAAAHILAAAAchAAAADaCmRvX2Nvbm5lY3S9BAAAcwIAAAAAD3oYRGlhbGVjdEV2ZW50cy5kb19jb25uZWN0YwUAAAAAAAAABQAAAAEAAABDAAAAcwQAAABkAVMAKQJ66VJlY2VpdmUgYSBjdXJzb3IgdG8gaGF2ZSBleGVjdXRlbWFueSgpIGNhbGxlZC4KCiAgICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBUcnVlIHRvIGhhbHQgZnVydGhlciBldmVudHMgZnJvbSBpbnZva2luZywKICAgICAgICBhbmQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3Vyc29yIGV4ZWN1dGlvbiBoYXMgYWxyZWFkeSB0YWtlbgogICAgICAgIHBsYWNlIHdpdGhpbiB0aGUgZXZlbnQgaGFuZGxlci4KCiAgICAgICAgTnILAAAAKQVyDAAAAHI/AAAAckAAAAByQQAAAHJCAAAAcgsAAAByCwAAAHIQAAAA2g5kb19leGVjdXRlbWFuec4EAABzAgAAAAAHehxEaWFsZWN0RXZlbnRzLmRvX2V4ZWN1dGVtYW55YwQAAAAAAAAABAAAAAEAAABDAAAAcwQAAABkAVMAKQJ6+FJlY2VpdmUgYSBjdXJzb3IgdG8gaGF2ZSBleGVjdXRlKCkgd2l0aCBubyBwYXJhbWV0ZXJzIGNhbGxlZC4KCiAgICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBUcnVlIHRvIGhhbHQgZnVydGhlciBldmVudHMgZnJvbSBpbnZva2luZywKICAgICAgICBhbmQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3Vyc29yIGV4ZWN1dGlvbiBoYXMgYWxyZWFkeSB0YWtlbgogICAgICAgIHBsYWNlIHdpdGhpbiB0aGUgZXZlbnQgaGFuZGxlci4KCiAgICAgICAgTnILAAAAKQRyDAAAAHI/AAAAckAAAAByQgAAAHILAAAAcgsAAAByEAAAANoUZG9fZXhlY3V0ZV9ub19wYXJhbXPXBAAAcwIAAAAAB3oiRGlhbGVjdEV2ZW50cy5kb19leGVjdXRlX25vX3BhcmFtc2MFAAAAAAAAAAUAAAABAAAAQwAAAHMEAAAAZAFTACkCeuVSZWNlaXZlIGEgY3Vyc29yIHRvIGhhdmUgZXhlY3V0ZSgpIGNhbGxlZC4KCiAgICAgICAgUmV0dXJuIHRoZSB2YWx1ZSBUcnVlIHRvIGhhbHQgZnVydGhlciBldmVudHMgZnJvbSBpbnZva2luZywKICAgICAgICBhbmQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY3Vyc29yIGV4ZWN1dGlvbiBoYXMgYWxyZWFkeSB0YWtlbgogICAgICAgIHBsYWNlIHdpdGhpbiB0aGUgZXZlbnQgaGFuZGxlci4KCiAgICAgICAgTnILAAAAKQVyDAAAAHI/AAAAckAAAAByQQAAAHJCAAAAcgsAAAByCwAAAHIQAAAA2gpkb19leGVjdXRl4AQAAHMCAAAAAAd6GERpYWxlY3RFdmVudHMuZG9fZXhlY3V0ZWMGAAAAAAAAAAYAAAABAAAAQwAAAHMEAAAAZAFTACkCYeIGAABSZWNlaXZlIHRoZSBzZXRpbnB1dHNpemVzIGRpY3Rpb25hcnkgZm9yIHBvc3NpYmxlIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgVGhpcyBldmVudCBpcyBlbWl0dGVkIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBkaWFsZWN0IG1ha2VzIHVzZSBvZiB0aGUKICAgICAgICBEQkFQSSBgYGN1cnNvci5zZXRpbnB1dHNpemVzKClgYCBtZXRob2Qgd2hpY2ggcGFzc2VzIGluZm9ybWF0aW9uIGFib3V0CiAgICAgICAgcGFyYW1ldGVyIGJpbmRpbmcgZm9yIGEgcGFydGljdWxhciBzdGF0ZW1lbnQuICAgVGhlIGdpdmVuCiAgICAgICAgYGBpbnB1dHNpemVzYGAgZGljdGlvbmFyeSB3aWxsIGNvbnRhaW4gOmNsYXNzOmAuQmluZFBhcmFtZXRlcmAgb2JqZWN0cwogICAgICAgIGFzIGtleXMsIGxpbmtlZCB0byBEQkFQSS1zcGVjaWZpYyB0eXBlIG9iamVjdHMgYXMgdmFsdWVzOyBmb3IKICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIG5vdCBib3VuZCwgdGhleSBhcmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgd2l0aAogICAgICAgIGBgTm9uZWBgIGFzIHRoZSB2YWx1ZSwgd2hpY2ggbWVhbnMgdGhlIHBhcmFtZXRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZAogICAgICAgIGluIHRoZSB1bHRpbWF0ZSBzZXRpbnB1dHNpemVzIGNhbGwuICAgVGhlIGV2ZW50IG1heSBiZSB1c2VkIHRvIGluc3BlY3QKICAgICAgICBhbmQvb3IgbG9nIHRoZSBkYXRhdHlwZXMgdGhhdCBhcmUgYmVpbmcgYm91bmQsIGFzIHdlbGwgYXMgdG8gbW9kaWZ5IHRoZQogICAgICAgIGRpY3Rpb25hcnkgaW4gcGxhY2UuICBQYXJhbWV0ZXJzIGNhbiBiZSBhZGRlZCwgbW9kaWZpZWQsIG9yIHJlbW92ZWQKICAgICAgICBmcm9tIHRoaXMgZGljdGlvbmFyeS4gICBDYWxsZXJzIHdpbGwgdHlwaWNhbGx5IHdhbnQgdG8gaW5zcGVjdCB0aGUKICAgICAgICA6YXR0cjpgLkJpbmRQYXJhbWV0ZXIudHlwZWAgYXR0cmlidXRlIG9mIHRoZSBnaXZlbiBiaW5kIG9iamVjdHMgaW4KICAgICAgICBvcmRlciB0byBtYWtlIGRlY2lzaW9ucyBhYm91dCB0aGUgREJBUEkgb2JqZWN0LgoKICAgICAgICBBZnRlciB0aGUgZXZlbnQsIHRoZSBgYGlucHV0c2l6ZXNgYCBkaWN0aW9uYXJ5IGlzIGNvbnZlcnRlZCBpbnRvCiAgICAgICAgYW4gYXBwcm9wcmlhdGUgZGF0YXN0cnVjdHVyZSB0byBiZSBwYXNzZWQgdG8gYGBjdXJzb3Iuc2V0aW5wdXRzaXplc2BgOwogICAgICAgIGVpdGhlciBhIGxpc3QgZm9yIGEgcG9zaXRpb25hbCBib3VuZCBwYXJhbWV0ZXIgZXhlY3V0aW9uIHN0eWxlLAogICAgICAgIG9yIGEgZGljdGlvbmFyeSBvZiBzdHJpbmcgcGFyYW1ldGVyIGtleXMgdG8gREJBUEkgdHlwZSBvYmplY3RzIGZvcgogICAgICAgIGEgbmFtZWQgYm91bmQgcGFyYW1ldGVyIGV4ZWN1dGlvbiBzdHlsZS4KCiAgICAgICAgTW9zdCBkaWFsZWN0cyAqKmRvIG5vdCB1c2UqKiB0aGlzIG1ldGhvZCBhdCBhbGw7IHRoZSBvbmx5IGJ1aWx0LWluCiAgICAgICAgZGlhbGVjdCB3aGljaCB1c2VzIHRoaXMgaG9vayBpcyB0aGUgY3hfT3JhY2xlIGRpYWxlY3QuICAgVGhlIGhvb2sgaGVyZQogICAgICAgIGlzIG1hZGUgYXZhaWxhYmxlIHNvIGFzIHRvIGFsbG93IGN1c3RvbWl6YXRpb24gb2YgaG93IGRhdGF0eXBlcyBhcmUgc2V0CiAgICAgICAgdXAgd2l0aCB0aGUgIGN4X09yYWNsZSBEQkFQSS4KCiAgICAgICAgLi4gdmVyc2lvbmFkZGVkOjogMS4yLjkKCiAgICAgICAgLi4gc2VlYWxzbzo6CgogICAgICAgICAgICA6cmVmOmBjeF9vcmFjbGVfc2V0aW5wdXRzaXplc2AKCiAgICAgICAgTnILAAAAKQZyDAAAAFoKaW5wdXRzaXplc3I/AAAAckAAAAByQQAAAHJCAAAAcgsAAAByCwAAAHIQAAAA2hBkb19zZXRpbnB1dHNpemVz6QQAAHMCAAAAACV6HkRpYWxlY3RFdmVudHMuZG9fc2V0aW5wdXRzaXplc04pAUYpD3IaAAAAchsAAAByHAAAAHIdAAAAch4AAAByBgAAAHIfAAAAcjQAAAByTgAAAHImAAAAcmkAAAByagAAAHJrAAAAcmwAAABybQAAAHILAAAAcgsAAAByCwAAAHIQAAAAcmcAAACJBAAAcxYAAAAIHAQCBAEEAgIBDAYMDAgRCAkICQgJcmcAAABOKRJyHQAAANoAcgIAAAByAwAAAHIEAAAAclcAAAByBQAAAHIGAAAAcgcAAAByJAAAAHIIAAAAWghzcWwuYmFzZXIJAAAAWgZFdmVudHNyCgAAAHIgAAAAcjUAAAByZwAAAHILAAAAcgsAAAByCwAAAHIQAAAA2gg8bW9kdWxlPggAAABzKAAAAAQCDAEMAQwBDAEMAQwBDAEMAxJ/AH8AFhJ/AGMSfwB/AH8AfwB/AAQ=
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 9
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
events.cpython-37.pyc
53.04 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
exc.cpython-37.pyc
17.25 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
inspection.cpython-37.pyc
2.78 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
interfaces.cpython-37.pyc
12.01 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
log.cpython-37.pyc
6.40 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
processors.cpython-37.pyc
4.10 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
schema.cpython-37.pyc
1.91 KB
lrw-r--r--
2023-11-14 14:32:35
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
types.cpython-37.pyc
2.33 KB
lrw-r--r--
2023-11-14 14:32:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
4.13 KB
lrw-r--r--
2023-11-14 14:32:36
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).