<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerTemplates</Name>
    <Version>11.1.1</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-06-26 16:00:25" Version="11.1.1">Initial release for OTOBO 11.1.</ChangeLog>
    <Description Lang="en">Provides the Customer interface with the standard templates feature.</Description>
    <Framework>11.1.x</Framework>
    <BuildCommitID>d5c3dde29a84e72050489d849f1ea63c5366eb34</BuildCommitID>
    <BuildDate>2026-06-26 16:00:28</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Kernel/Config/Files/XML/CustomerTemplate.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCiAgICA8U2V0dGluZyBOYW1lPSJTdGFuZGFyZFRlbXBsYXRlOjpDdXN0b21lclR5cGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpc3Qgb2YgY3VzdG9tZXIgdHlwZXMgZm9yIHRlbXBsYXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlRpY2tldDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lckFuc3dlciIgVHJhbnNsYXRhYmxlPSIxIj5DdXN0b21lciBBbnN3ZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVyQ3JlYXRlIiBUcmFuc2xhdGFibGU9IjEiPkN1c3RvbWVyIENyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iTG9hZGVyOjpNb2R1bGU6OkN1c3RvbWVyVGlja2V0TWVzc2FnZSMjIzAwMy1TdGFuZGFyZFRlbXBsYXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGN1c3RvbWVyIGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpDdXN0b21lcjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ1NTIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuRmllbGRFeHBsYW5hdGlvblJvdy5jc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkN1c3RvbWVyLlRpY2tldEFjdGlvbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6Q3VzdG9tZXJUaWNrZXRab29tIyMjMDAzLVN0YW5kYXJkVGVtcGxhdGVzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxvYWRlciBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgY3VzdG9tZXIgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkN1c3RvbWVyOjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDU1MiPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblNlcnZpY2VUZW1wbGF0ZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJGcm9udGVuZFJlZ2lzdHJhdGlvbiI+CiAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikdyb3VwUm8iPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iR3JvdXAiPgogICAgICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5UaGlzIG1vZHVsZSBpcyBwYXJ0IG9mIHRoZSBhZG1pbiBhcmVhIG9mIE9UT0JPLjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRpdGxlIiBUcmFuc2xhdGFibGU9IjEiPlRlbXBsYXRlcyDihpQgU2VydmljZXM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYXZCYXJOYW1lIj5BZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6Ok1vZHVsZTo6QWRtaW5TZXJ2aWNlVGVtcGxhdGVzIyMjMDAyLVRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkFkbWluLlNlcnZpY2VUZW1wbGF0ZXMuanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbiMjI0FkbWluU2VydmljZVRlbXBsYXRlcyMjIzAwMi1UaWNrZXQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFpbiBtZW51IGl0ZW0gcmVnaXN0cmF0aW9uLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb246Ok1haW5NZW51PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iRnJvbnRlbmROYXZpZ2F0aW9uIj4KICAgICAgICAgICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgICAgICAgICA8L0RlZmF1bHRJdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJGcm9udGVuZDo6TmF2aWdhdGlvbk1vZHVsZSMjI0FkbWluU2VydmljZVRlbXBsYXRlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BZG1pbiBhcmVhIG5hdmlnYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjo6QWRtaW5PdmVydmlldzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5hZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cFJvIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6TmF2QmFyOjpNb2R1bGVBZG1pbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5UZW1wbGF0ZXMg4oaUIFNlcnZpY2VzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGlja2V0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5MaW5rIHRlbXBsYXRlcyB0byBzZXJ2aWNlcy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikljb25CaWciPmZhLWZpbGUtdGV4dC1vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJY29uU21hbGwiPmZhLWZvbGRlcjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lclRlbXBsYXRlOjpSZWZlcmVuY2VBdHRyaWJ1dGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc3RhbmRhcmQgdGVtcGxhdGVzIGRlcGVuZHMgb24gdGhlIHF1ZXVlIG9yIG9uIHRoZSBzZXJ2aWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6VGlja2V0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9IlF1ZXVlIj4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iUXVldWUiIFRyYW5zbGF0YWJsZT0iMSI+UXVldWU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlNlcnZpY2UiIFRyYW5zbGF0YWJsZT0iMSI+U2VydmljZTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSBzdGFuZGFyZCB0ZW1wbGF0ZSBzaG91bGQgYmUgYXV0b21hdGljYWxseSBzZWxlY3RlZCB3aGVuIGl0IGlzIHRoZSBvbmx5IG9uZSBhdmFpbGFibGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpUaWNrZXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Modules/AdminServiceTemplates.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TZXJ2aWNlVGVtcGxhdGVzOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICBpZiAoICEkUGFyYW17QWNjZXNzUnd9ICYmICRQYXJhbXtBY2Nlc3NSb30gKSB7CiAgICAgICAgJFNlbGYtPntMaWdodEFkbWlufSA9IDE7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRTZXJ2aWNlT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHRlbXBsYXRlIDwtPiBzZXJ2aWNlcyAxOm4KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZW1wbGF0ZScgKSB7CgogICAgICAgICMgZ2V0IHRlbXBsYXRlIGRhdGEKICAgICAgICBteSAkSUQgICAgICAgICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICk7CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVEYXRhID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVHZXQoIElEID0+ICRJRCApOwoKICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXNzaWduZWQgc2VydmljZXMKICAgICAgICBteSAlTWVtYmVyID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRJRCwKICAgICAgICApOwoKICAgICAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRTdGFuZGFyZFRlbXBsYXRlRGF0YXtUZW1wbGF0ZVR5cGV9LAogICAgICAgICk7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKCiAgICAgICAgICAgICMgRmlsdGVyIG91dCBzZXJ2aWNlcyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgICAgIG15ICVSd1NlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPkdldEFsbFNlcnZpY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlRGF0YSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkU2VydmljZURhdGF7JFNlcnZpY2VJRH0gaWYgISRSd1NlcnZpY2VzeyRTZXJ2aWNlSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIHRoZSBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlZmF1bHQgICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgIHVuZGVmICVTdGFuZGFyZFRlbXBsYXRlRGF0YTsKICAgICAgICAgICAgICAgIHVuZGVmICVNZW1iZXI7CiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgPSAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9DaGFuZ2UoCiAgICAgICAgICAgIFNlbGVjdGVkID0+IFwlTWVtYmVyLAogICAgICAgICAgICBEYXRhICAgICA9PiBcJVNlcnZpY2VEYXRhLAogICAgICAgICAgICBJRCAgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZURhdGF7SUR9LAogICAgICAgICAgICBOYW1lICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZVR5cGUgLiAnIC0gJyAuICRTdGFuZGFyZFRlbXBsYXRlRGF0YXtOYW1lfSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ1RlbXBsYXRlJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB0ZW1wbGF0ZXMgPC0+IFNlcnZpY2UgbjoxCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgZGF0YQogICAgICAgIG15ICRJRCAgICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCB0ZW1wbGF0ZXMKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+X0N1c3RvbWVyU3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgIFR5cGUgID0+IFsgIkN1c3RvbWVyQ3JlYXRlIiwgIkN1c3RvbWVyQW5zd2VyIiBdLAogICAgICAgICk7CgogICAgICAgIGlmICglU3RhbmRhcmRUZW1wbGF0ZURhdGEpIHsKICAgICAgICAgICAgZm9yIG15ICRTdGFuZGFyZFRlbXBsYXRlSUQgKCBzb3J0IGtleXMgJVN0YW5kYXJkVGVtcGxhdGVEYXRhICkgewogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlECiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRTdGFuZGFyZFRlbXBsYXRlSUR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRGF0YXtUZW1wbGF0ZVR5cGV9ICkKICAgICAgICAgICAgICAgICAgICAuICcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkRGF0YXtOYW1lfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXNzaWduZWQgdGVtcGxhdGVzCiAgICAgICAgbXkgJU1lbWJlciA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewoKICAgICAgICAgICAgIyBGaWx0ZXIgb3V0IHRlbXBsYXRlcyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICgga2V5cyAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgKSB7CiAgICAgICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEICk7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRTdGFuZGFyZFRlbXBsYXRlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIHRoZSBwZXJtaXNzaW9uLgogICAgICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSd1NlcnZpY2VzeyRJRH0gKSB7CiAgICAgICAgICAgICAgICB1bmRlZiAlU2VydmljZURhdGE7CiAgICAgICAgICAgICAgICB1bmRlZiAlTWVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0NoYW5nZSgKICAgICAgICAgICAgU2VsZWN0ZWQgPT4gXCVNZW1iZXIsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlU3RhbmRhcmRUZW1wbGF0ZURhdGEsCiAgICAgICAgICAgIElEICAgICAgID0+ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBOYW1lICAgICA9PiAkU2VydmljZURhdGF7TmFtZX0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgdGVtcGxhdGVzIHRvIHNlcnZpY2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2VTZXJ2aWNlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgIyBnZXQgbmV3IHRlbXBsYXRlcwogICAgICAgIG15IEBUZW1wbGF0ZXNTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc1NlbGVjdGVkJyApOwogICAgICAgIG15IEBUZW1wbGF0ZXNBbGwgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc0FsbCcgKTsKCiAgICAgICAgbXkgJFNlcnZpY2VJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHRlbXBsYXRlcwogICAgICAgIG15ICVUZW1wbGF0ZXNTZWxlY3RlZCA9IG1hcCB7ICRfID0+IDEgfSBAVGVtcGxhdGVzU2VsZWN0ZWQ7CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICgga2V5cyAlVGVtcGxhdGVzU2VsZWN0ZWQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkU3RhbmRhcmRUZW1wbGF0ZUlEOyAgICAjIENhbiBjb250YWluIGVtcHR5IHN0cmluZy4KCiAgICAgICAgICAgICAgICBteSAlU2VydmljZXMgICA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkU3RhbmRhcmRUZW1wbGF0ZUlEICk7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEcyA9PiBbIGtleXMgJVNlcnZpY2VzIF0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgICA9PiAncncnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgYWxsIHVzZWQgdGVtcGxhdGVzCiAgICAgICAgZm9yIG15ICRUZW1wbGF0ZUlEIChAVGVtcGxhdGVzQWxsKSB7CiAgICAgICAgICAgIG15ICRBY3RpdmUgPSAkVGVtcGxhdGVzU2VsZWN0ZWR7JFRlbXBsYXRlSUR9ID8gMSA6IDA7CgogICAgICAgICAgICAjIHNldCBjdXN0b21lciB1c2VyIHNlcnZpY2UgbWVtYmVyCiAgICAgICAgICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckFkZCgKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAkU2VydmljZUlELAogICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgID0+ICRBY3RpdmUsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHRlbXBsYXRlcyAtIHNlcnZpY2UgcmVsYXRpb24ganVzdCByZWRpcmVjdCB0byB0aGUgZWRpdCBzY3JlZW4KICAgICAgICAjIG90aGVyd2lzZSByZXR1cm4gdG8gcmVsYXRpb25zIG92ZXJ2aWV3CiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKQogICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249U2VydmljZTtJRD0kU2VydmljZUlEIgogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn0iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIHNlcnZpY2VzIHRvIHRlbXBsYXRlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlVGVtcGxhdGUnICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCBuZXcgc2VydmljZXMKICAgICAgICBteSBAU2VydmljZXNTZWxlY3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJdGVtc1NlbGVjdGVkJyApOwogICAgICAgIG15IEBTZXJ2aWNlc0FsbCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0l0ZW1zQWxsJyApOwoKICAgICAgICBteSAkVGVtcGxhdGVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgIyBjcmVhdGUgaGFzaCB3aXRoIHNlbGVjdGVkIHNlcnZpY2VzCiAgICAgICAgbXkgJVNlcnZpY2VzU2VsZWN0ZWQgPSBtYXAgeyAkXyA9PiAxIH0gQFNlcnZpY2VzU2VsZWN0ZWQ7CgogICAgICAgICMgYmFja2VuZCBjaGVjayB0byBwcmV2ZW50IHNhdmluZyB3aXRob3V0IHBlcm1pc3Npb24uCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgSUQ6CiAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgga2V5cyAlU2VydmljZXNTZWxlY3RlZCApIHsKICAgICAgICAgICAgICAgIG5leHQgSUQgaWYgISRTZXJ2aWNlSUQ7ICAgICMgQ2FuIGNvbnRhaW4gZW1wdHkgc3RyaW5nLgogICAgICAgICAgICAgICAgaWYgKCAhJFJ3U2VydmljZXN7JFNlcnZpY2VJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGFsbCB1c2VkIHNlcnZpY2VzCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKEBTZXJ2aWNlc0FsbCkgewogICAgICAgICAgICBteSAkQWN0aXZlID0gJFNlcnZpY2VzU2VsZWN0ZWR7JFNlcnZpY2VJRH0gPyAxIDogMDsKCiAgICAgICAgICAgICMgc2V0IGN1c3RvbWVyIHVzZXIgc2VydmljZSBtZW1iZXIKICAgICAgICAgICAgJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gJEFjdGl2ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgc2VydmljZSAtIHRlbXBsYXRlcyByZWxhdGlvbiBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICMgb3RoZXJ3aXNlIHJldHVybiB0byByZWxhdGlvbnMgb3ZlcnZpZXcKICAgICAgICBpZiAoCiAgICAgICAgICAgIGRlZmluZWQgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApCiAgICAgICAgICAgICYmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NvbnRpbnVlQWZ0ZXJTYXZlJyApIGVxICcxJyApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1UZW1wbGF0ZTtJRD0kVGVtcGxhdGVJRCIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IgogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPl9PdmVydmlldygpOwogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgX0NoYW5nZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVEYXRhICAgPSAleyAkUGFyYW17RGF0YX0gfTsKICAgIG15ICRUeXBlICAgPSAkUGFyYW17VHlwZX0gfHwgJ1RlbXBsYXRlJzsKICAgIG15ICROZVR5cGUgPSAkVHlwZSBlcSAnU2VydmljZScgPyAnVGVtcGxhdGUnIDogJ1NlcnZpY2UnOwoKICAgIG15ICVWaXNpYmxlVHlwZSA9ICgKICAgICAgICBUZW1wbGF0ZSA9PiAnVGVtcGxhdGUnLAogICAgICAgIFNlcnZpY2UgID0+ICdTZXJ2aWNlJywKICAgICk7CgogICAgbXkgJE15VHlwZSAgICAgICA9ICRWaXNpYmxlVHlwZXskVHlwZX07CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIG15ICRCcmVhZGNydW1iVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBTZXJ2aWNlIFJlbGF0aW9ucyBmb3IgVGVtcGxhdGUnKTsKCiAgICBpZiAoICRWaXNpYmxlVHlwZXskVHlwZX0gZXEgJ1NlcnZpY2UnICkgewogICAgICAgICRCcmVhZGNydW1iVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NoYW5nZSBUZW1wbGF0ZSBSZWxhdGlvbnMgZm9yIFNlcnZpY2UnKTsKICAgIH0KCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIEJyZWFkY3J1bWJUaXRsZSA9PiAkQnJlYWRjcnVtYlRpdGxlLAogICAgICAgIH0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwoKICAgICNmaXhlZCBsaW5rCiAgICBteSAkU2VydmljZVRhZzsKCiAgICAkU2VydmljZVRhZyA9ICRUeXBlIGVxICdTZXJ2aWNlJyA/ICdTZXJ2aWNlJyA6ICcnOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uSG9tZSAgICAgID0+ICdBZG1pbicgLiAkVHlwZSwKICAgICAgICAgICAgTmVUeXBlICAgICAgICAgID0+ICROZVR5cGUsCiAgICAgICAgICAgIFZpc2libGVUeXBlICAgICA9PiAkVmlzaWJsZVR5cGV7JFR5cGV9LAogICAgICAgICAgICBWaXNpYmxlTmVUeXBlICAgPT4gJFZpc2libGVUeXBleyROZVR5cGV9LAogICAgICAgICAgICBTZXJ2aWNlICAgICAgICAgPT4gJFNlcnZpY2VUYWcsCiAgICAgICAgICAgIEJyZWFkY3J1bWJUaXRsZSA9PiAkQnJlYWRjcnVtYlRpdGxlLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHNlcnZpY2UvdGVtcGxhdGUKICAgIGlmICggISVEYXRhICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb0RhdGFGb3VuZE1zZ0xpc3QnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENvbFNwYW4gPT4gMiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0NoYW5nZUhlYWRlcicsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAkVHlwZSwKICAgICAgICAgICAgTmVUeXBlICAgICAgICA9PiAkTmVUeXBlLAogICAgICAgICAgICBWaXNpYmxlVHlwZSAgID0+ICRWaXNpYmxlVHlwZXskVHlwZX0sCiAgICAgICAgICAgIFZpc2libGVOZVR5cGUgPT4gJFZpc2libGVUeXBleyROZVR5cGV9LAogICAgICAgIH0sCiAgICApOwoKICAgIGZvciBteSAkSUQgKCBzb3J0IHsgdWMoICREYXRheyRhfSApIGNtcCB1YyggJERhdGF7JGJ9ICkgfSBrZXlzICVEYXRhICkgewoKICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICBteSAkU2VsZWN0ZWQgPSAkUGFyYW17U2VsZWN0ZWR9LT57JElEfSA/ICcgY2hlY2tlZCAnIDogJyc7CgogICAgICAgICRTZXJ2aWNlVGFnID0gJFR5cGUgbmUgJ1NlcnZpY2UnID8gJ1NlcnZpY2UnIDogJyc7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDaGFuZ2VSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57JElEfSwKICAgICAgICAgICAgICAgIE5lVHlwZSAgICAgICAgPT4gJE5lVHlwZSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkICAgICAgPT4gJFNlbGVjdGVkLAogICAgICAgICAgICAgICAgVmlzaWJsZVR5cGUgICA9PiAkVmlzaWJsZVR5cGV7JFR5cGV9LAogICAgICAgICAgICAgICAgVmlzaWJsZU5lVHlwZSA9PiAkVmlzaWJsZVR5cGV7JE5lVHlwZX0sCiAgICAgICAgICAgICAgICBTZXJ2aWNlICAgICAgID0+ICRTZXJ2aWNlVGFnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VydmljZVRlbXBsYXRlcycsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgVmlzaWJsZVR5cGUgID0+ICRNeVR5cGUsCiAgICApOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4ge30sCiAgICApOwoKICAgICMgbm8gYWN0aW9ucyBpbiBhY3Rpb24gbGlzdAogICAgIyAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayhOYW1lPT4nQWN0aW9uTGlzdCcpOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ZpbHRlclRlbXBsYXRlJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ZpbHRlclNlcnZpY2UnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnICk7CgogICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpOwoKICAgICMgZ2V0IHN0ZCB0ZW1wbGF0ZSBsaXN0CiAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZURhdGEgPSAkU2VsZi0+X0N1c3RvbWVyU3RhbmRhcmRUZW1wbGF0ZUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICBUeXBlICA9PiBbICJDdXN0b21lckNyZWF0ZSIsICJDdXN0b21lckFuc3dlciIgXSwKCiAgICApOwoKICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgaWYgKCVTdGFuZGFyZFRlbXBsYXRlRGF0YSkgewogICAgICAgIGZvciBteSAkU3RhbmRhcmRUZW1wbGF0ZUlEICggc29ydCBrZXlzICVTdGFuZGFyZFRlbXBsYXRlRGF0YSApIHsKICAgICAgICAgICAgbXkgJURhdGEgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+U3RhbmRhcmRUZW1wbGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTdGFuZGFyZFRlbXBsYXRlRGF0YXskU3RhbmRhcmRUZW1wbGF0ZUlEfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJERhdGF7VGVtcGxhdGVUeXBlfSApCiAgICAgICAgICAgICAgICAuICcgLSAnCiAgICAgICAgICAgICAgICAuICREYXRhe05hbWV9OwogICAgICAgIH0KICAgICAgICBJRDoKICAgICAgICBmb3IgbXkgJFN0YW5kYXJkVGVtcGxhdGVJRCAoCiAgICAgICAgICAgIHNvcnQgeyB1YyggJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRhfSApIGNtcCB1YyggJFN0YW5kYXJkVGVtcGxhdGVEYXRheyRifSApIH0KICAgICAgICAgICAga2V5cyAlU3RhbmRhcmRUZW1wbGF0ZURhdGEKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICAgICAgbXkgJVNlcnZpY2VzICAgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJFN0YW5kYXJkVGVtcGxhdGVJRCApOwogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRHMgPT4gWyBrZXlzICVTZXJ2aWNlcyBdLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgICAgPT4gJ3J3JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIG5lICdydycgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBJRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTGlzdDFuJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU3RhbmRhcmRUZW1wbGF0ZURhdGF7JFN0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vVGVtcGxhdGVzRm91bmRNc2cnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBkYXRhCiAgICBteSAlU2VydmljZURhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpLT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMSwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKCiAgICAgICAgIyBGaWx0ZXIgb3V0IHNlcnZpY2VzIHdpdGhvdXQgcGVybWlzc2lvbi4KICAgICAgICBteSAlUndTZXJ2aWNlcyA9ICRTZXJ2aWNlT2JqZWN0LT5HZXRBbGxTZXJ2aWNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdydycsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBrZXlzICVTZXJ2aWNlRGF0YSApIHsKICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXskU2VydmljZUlEfSBpZiAhJFJ3U2VydmljZXN7JFNlcnZpY2VJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgaWYgKCVTZXJ2aWNlRGF0YSkgewogICAgICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCB7IHVjKCAkU2VydmljZURhdGF7JGF9ICkgY21wIHVjKCAkU2VydmljZURhdGF7JGJ9ICkgfSBrZXlzICVTZXJ2aWNlRGF0YSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpc3RuMScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlcnZpY2VEYXRheyRTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VydmljZXNGb3VuZE1zZycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblNlcnZpY2VUZW1wbGF0ZXMnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKc3ViIF9DdXN0b21lclN0YW5kYXJkVGVtcGxhdGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFRlbXBsYXRlVHlwZXMgPSAiJyIgLiAoIGpvaW4gJywnLCBAeyAkUGFyYW17VHlwZX0gfSApIC4gIiciOwogICAgJFRlbXBsYXRlVHlwZXMgPX4gcy8sLycsJy9nOwoKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbGlkfSAmJiAkUGFyYW17VmFsaWR9IGVxICcwJyApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBuYW1lCiAgICAgICAgRlJPTSBzdGFuZGFyZF90ZW1wbGF0ZSc7CgogICAgaWYgKCRWYWxpZCkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB2YWxpZF9pZCBJTiAoJyAuIGpvaW4gJywgJywKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkgLiAnKSc7CiAgICB9CgogICAgbXkgQEJpbmQ7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBuZSAnJyApIHsKICAgICAgICBpZiAoJFZhbGlkKSB7CiAgICAgICAgICAgICRTUUwgLj0gJyBBTkQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNRTCAuPSAnIFdIRVJFJzsKICAgICAgICB9CiAgICAgICAgJFNRTCAuPSAiIHRlbXBsYXRlX3R5cGUgSU4gKCRUZW1wbGF0ZVR5cGVzKSI7CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICVEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuICVEYXRhOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/CustomerTicketMessage.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA1ODFlMzZmYjNhZmZjMmEzODdkZDcwODI0ZTMwOWY0NTE2MzU0NWZlIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRNZXNzYWdlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldE1lc3NhZ2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0gfHwge30sCiAgICApOwoKICAgIG15ICREZWZpbml0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6TWFzaycpLT5EZWZpbml0aW9uR2V0KAogICAgICAgIE1hc2sgPT4gJFNlbGYtPntBY3Rpb259LAogICAgKSB8fCB7fTsKCiAgICAkU2VsZi0+e01hc2tEZWZpbml0aW9ufSA9ICREZWZpbml0aW9uLT57TWFza307CiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gICA9IHt9OwoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIEkKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHsgJER5bmFtaWNGaWVsZExpc3QgLy8gW10gfSApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgIG15ICRJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUnLAogICAgICAgICk7CgogICAgICAgICMgcmVkdWNlIHRoZSBkeW5hbWljIGZpZWxkcyB0byBvbmx5IHRoZSBvbmVzIHRoYXQgYXJlIGRlc2lnbmVkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlOwoKICAgICAgICBpZiAoIGV4aXN0cyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSBkZWxldGUgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gLy8ge307CgogICAgICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIGtleXMgJFBhcmFtZXRlcnMtPiUqICkgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZC0+eyRBdHRyaWJ1dGV9ID0gJFBhcmFtZXRlcnMtPnskQXR0cmlidXRlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHVzaCAkU2VsZi0+e01hc2tEZWZpbml0aW9ufS0+QCosIHsKICAgICAgICAgICAgICAgIERGICAgICAgICA9PiAkRHluYW1pY0ZpZWxkLT57TmFtZX0sCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgPyAxIDogMCwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIGlmICggJENvbmZpZy0+e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgICMgYWxpZ24gc3lzY29uZmlnIGFuZCB0aWNrZXQgbWFzayBkYXRhIElJCiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBrZXlzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc30tPiUqICkgewogICAgICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfXskRHluYW1pY0ZpZWxkTmFtZX0gPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFBhcmFtZXRlcnMgPSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyREeW5hbWljRmllbGROYW1lfSAvLyB7fTsKCiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBrZXlzICRQYXJhbWV0ZXJzLT4lKiApIHsKICAgICAgICAgICAgJFNlbGYtPntEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ0Rlc3QnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFRvcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRQcmlvcml0aWVzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U2VydmljZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU0xBSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNMQXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnVHlwZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRUeXBlcwogICAgICAgIH0sCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0U3RhbmRhcmRUZW1wbGF0ZXMKICAgICAgICB9LAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcwogICAgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9ID0gewogICAgICAgIFNlcnZpY2VJRCA9PiB7CiAgICAgICAgICAgIFNMQUlEID0+IDEsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEsCiAgICAgICAgfSwKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQojICAgIGZvciBteSAkS2V5IChxdyggU3ViamVjdCBCb2R5IFByaW9yaXR5SUQgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRCBEZXN0IEZyb21DaGF0SUQpKSB7CgogICAgZm9yIG15ICRLZXkgKHF3KCBTdWJqZWN0IEJvZHkgUHJpb3JpdHlJRCBUeXBlSUQgU2VydmljZUlEIFNMQUlEIERlc3QgRnJvbUNoYXRJRCBTdGFuZGFyZFRlbXBsYXRlSUQpKSB7CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CgogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBQYXJhbU9iamVjdAogICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKCiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQmFja2VuZE9iamVjdCAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpGaWVsZFJlc3RyaWN0aW9ucycpOwoKICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPQogICAgICAgICAgICAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwoKICAgICAgICAkRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZCB9ID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKICAgIH0KICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gXCVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkUXVldWVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoJ0NoYXRFbmdpbmU6OkFjdGl2ZScpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDaGF0IGlzIG5vdCBhY3RpdmUuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGNoYXQgcGFydGljaXBhbnQKICAgICAgICBteSAlQ2hhdFBhcnRpY2lwYW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdFBhcnRpY2lwYW50Q2hlY2soCiAgICAgICAgICAgIENoYXRJRCAgICAgID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgQ2hhdHRlclR5cGUgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgQ2hhdHRlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISVDaGF0UGFydGljaXBhbnQgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgIyBHZXQgZGVmYXVsdCBRdWV1ZSBJRCBpZiBub25lIGlzIHNldAogICAgICAgIG15ICRRdWV1ZURlZmF1bHRJRDsKICAgICAgICBpZiAoICEkR2V0UGFyYW17RGVzdH0gKSB7CiAgICAgICAgICAgIG15ICRRdWV1ZURlZmF1bHQgPSAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9IHx8ICcnOwogICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdCkgewogICAgICAgICAgICAgICAgJFF1ZXVlRGVmYXVsdElEID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxvb2t1cCggUXVldWUgPT4gJFF1ZXVlRGVmYXVsdCApOwogICAgICAgICAgICAgICAgaWYgKCRRdWV1ZURlZmF1bHRJRCkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZURlZmF1bHRJRCAuICd8fCcgLiAkUXVldWVEZWZhdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlRGVmYXVsdElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdhcm4gaWYgdGhlcmUgaXMgbm8gKHZhbGlkKSBkZWZhdWx0IHF1ZXVlIGFuZCB0aGUgY3VzdG9tZXIgY2FuJ3Qgc2VsZWN0IG9uZQogICAgICAgICAgICBlbHNpZiAoICEkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDaGVjayBTeXNDb25maWcgc2V0dGluZyBmb3IgJXM6OlF1ZXVlRGVmYXVsdC4nLCAkU2VsZi0+e0FjdGlvbn0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEdldFBhcmFte0Rlc3R9ICkgewogICAgICAgICAgICBteSAoICRRdWV1ZUlEUGFyYW0sICRRdWV1ZVBhcmFtICkgPSBzcGxpdCggL1x8XHwvLCAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgbXkgJFF1ZXVlSURMb29rdXAgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVQYXJhbSApOwogICAgICAgICAgICBpZiAoICRRdWV1ZUlETG9va3VwICYmICRRdWV1ZUlETG9va3VwIGVxICRRdWV1ZUlEUGFyYW0gKSB7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbicpOwogICAgICAgICAgICAgICAgaWYgKCAleyAkQ3VzdG9tZXJQYW5lbE93blNlbGVjdGlvbiAvLyB7fSB9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZXN0fSA9ICRRdWV1ZUlEUGFyYW0gLiAnfHwnIC4gJEN1c3RvbWVyUGFuZWxPd25TZWxlY3Rpb24tPnskUXVldWVQYXJhbX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVJRExvb2t1cDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIGdhdGhlciBmaWVsZHMgd2hpY2ggYXJlIHN1cHBvc2VkIHRvIGJlIGhpZGRlbiB3aGVuIGF1dG9zZWxlY3RlZAogICAgICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgICAgICBpZiAoJEF1dG9zZWxlY3QpIHsKICAgICAgICAgICAgbXkgQEhpZGVBdXRvc2VsZWN0ZWQgPSBncmVwIHsgIXJlZiggJEF1dG9zZWxlY3QtPnskX30gKSAmJiAkQXV0b3NlbGVjdC0+eyRffSA9PSAyIH0ga2V5cyAleyRBdXRvc2VsZWN0fTsKICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIaWRlQXV0b3NlbGVjdGVkLAogICAgICAgICAgICAgICAgICAgIG1hcCB7ICJEeW5hbWljRmllbGRfIiAuICRfIH0KICAgICAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChASGlkZUF1dG9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAgICAgJEhpZGVBdXRvc2VsZWN0ZWRKU09OID0gJEpTT05PYmplY3QtPkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxASGlkZUF1dG9zZWxlY3RlZCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0QUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICAgICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgICAgICBLZXkgID0+ICdQcmVzZWxlY3Rpb24nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+U2V0QUNMUHJlc2VsZWN0aW9uQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUNvbnZlcmdlbmNlID0gKAogICAgICAgICAgICBTdGRGaWVsZHMgPT4gMCwKICAgICAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Vzc2FyeSBmb3IgRGVzdCkKICAgICAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgICAgICBEZXN0ICAgICAgID0+ICdRdWV1ZUlEJywKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBUeXBlSUQgICAgID0+ICdUeXBlSUQnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICdTdGFuZGFyZFRlbXBsYXRlSUQnLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBQ0xQcmVzZWxlY3Rpb24gJiYgISRJbml0aWFsUnVuICkgewogICAgICAgICAgICAgICAgICAgIEZJRUxEOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRGaWVsZElEIG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyRGaWVsZElEfSAmJiAkQ2hhbmdlZEVsZW1lbnRzeyRGaWVsZElEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRFbGVtZW50ICggc29ydCBrZXlzICVDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbi0+e1J1bGVzfXtUaWNrZXR9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEVsZW1lbnR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEVsZW1lbnQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJENoZWNreyRGaWVsZElEfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgICAgICAgICAgTUVUSE9EOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgTUVUSE9EIGlmICEkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH07CgogICAgICAgICAgICAgICAgICAgICMgdXNlICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSBmb3IgRGVzdD0+UXVldWVJRAogICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLAogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU3RkRmllbGRWYWx1ZXN7U2VydmljZUlEfSB8fCB1bmRlZiwgICAgIyBuZWVkZWQgZm9yIFNMQUlECiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRmllbGQtPntGaWVsZElEfSBlcSAnRGVzdCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRPczoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBUT3MgaWYgKCAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9IGVxICctJyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyIkUXVldWVJRHx8JFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyAkUXVldWVJRCB9In0gPSAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17JFF1ZXVlSUR9OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGN1cnJlbnQgc2VsZWN0aW9uIG9mIFF1ZXVlSUQgKERlc3Qgd2lsbCBiZSBkb25lIHRvZ2V0aGVyIHdpdGggdGhlIG90aGVyIGZpZWxkcykKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UXVldWVJRH0gJiYgISRTdGRGaWVsZFZhbHVlc3tEZXN0fXsgJEdldFBhcmFte0Rlc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICAgICAgICAgICA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5BdXRvc2VsZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9LAogICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAhJU5ld0NoYW5nZWRFbGVtZW50cyApIHsKICAgICAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gJU5ld0NoYW5nZWRFbGVtZW50czsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgKICAgICAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCwKICAgICAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRMb29wUHJvdGVjdGlvbi0tIDwgMSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJhbiBpbnRvIHVucmVzb2x2YWJsZSBsb29wISIsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBpcyByZXR1cm5pbmcgYW4gZW1wdHkgbGlzdCByZWFzb25hYmxlPwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICAgICAgaWYgKCAlQ2hhbmdlZEVsZW1lbnRzIHx8ICRJbml0aWFsUnVuICkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIGR5bmFtaWMgZmllbGRzIGNoYW5nZWQsIGNoZWNrIHN0YW5kYXJkIGZpZWxkcyBhZ2FpbgogICAgICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMDsKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSBtYXAgeyAkXyA9PiAxIH0ga2V5cyAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle0ZpZWxkc30gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkSW5pdGlhbFJ1biA9IDA7CiAgICAgICAgfQoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgewogICAgICAgICAgICAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiBkZWZpbmVkICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRffQogICAgICAgICAgICAgICAgPyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX317UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICA6IHVuZGVmCiAgICAgICAgfSAoIGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApOwoKICAgICAgICBteSAkQUNMUmVzdWx0U3RkID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnRm9ybVN0ZCcsCiAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgQXJ0aWNsZSA9PiAnQXJ0aWNsZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVZpc2liaWxpdHlTdGQ7CgogICAgICAgIGlmICgkQUNMUmVzdWx0U3RkKSB7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7JEZpZWxkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHByaW50IGZvcm0gLi4uCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tOZXcoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgVG9TZWxlY3RlZCAgICAgICA9PiAkR2V0UGFyYW17RGVzdH0sCiAgICAgICAgICAgIEZyb21DaGF0SUQgICAgICAgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9IHx8ICcnLAogICAgICAgICAgICBIaWRlQXV0b3NlbGVjdGVkID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIFZpc2liaWxpdHlTdGQgICAgPT4gXCVWaXNpYmlsaXR5U3RkLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICRBcnRpY2xlT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdJbnRlcm5hbCcgKTsKCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkQ29uZmlnLT57TmV4dFNjcmVlbkFmdGVyTmV3VGlja2V0fTsKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGRlc3RpbmF0aW9uIHF1ZXVlCiAgICAgICAgbXkgJERlc3QgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJFRvICkgewogICAgICAgICAgICAkTmV3UXVldWVJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXdRdWV1ZUlEJyApIHx8ICcnOwogICAgICAgICAgICAkVG8gICAgICAgICA9ICdTeXN0ZW0nOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjaywgaWYgbm8gZGVzdGluYXRpb24gaXMgZ2l2ZW4KICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgbXkgJFF1ZXVlID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXVlJyApCiAgICAgICAgICAgICAgICB8fCAkQ29uZmlnLT57J1F1ZXVlRGVmYXVsdCd9CiAgICAgICAgICAgICAgICB8fCAnJzsKICAgICAgICAgICAgaWYgKCRRdWV1ZSkgewogICAgICAgICAgICAgICAgbXkgJFF1ZXVlSUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWUgKTsKICAgICAgICAgICAgICAgICROZXdRdWV1ZUlEID0gJFF1ZXVlSUQ7CiAgICAgICAgICAgICAgICAkVG8gICAgICAgICA9ICRRdWV1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEdldFBhcmFte05ld1F1ZXVlSUR9ID0gJE5ld1F1ZXVlSUQ7CgogICAgICAgICMgdXNlIGRlZmF1bHQgaWYgdGlja2V0IHR5cGUgaXMgbm90IGF2YWlsYWJsZSBpbiBzY3JlZW4gYnV0IGFjdGl2YXRlZCBvbiBzeXN0ZW0KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpUeXBlJykgJiYgISRDb25maWctPnsnVGlja2V0VHlwZSd9ICkgewogICAgICAgICAgICBteSAlVHlwZUxpc3QgPSByZXZlcnNlICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17VHlwZUlEfSA9ICRUeXBlTGlzdHsgJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9IH07CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ2hlY2sgU3lzQ29uZmlnIHNldHRpbmcgZm9yICVzOjpUaWNrZXRUeXBlRGVmYXVsdC4nLCAkU2VsZi0+e0FjdGlvbn0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIHZhbGlkYXRpb24gb2YgaGlkZGVuIGZpZWxkcwogICAgICAgIG15ICVWaXNpYmlsaXR5OwoKICAgICAgICAjIHRyYW5zZm9ybSBkeW5hbWljIGZpZWxkIGRhdGEgaW50byBERk5hbWUgPT4gREZOYW1lIHBhaXIKICAgICAgICBteSAlRHluYW1pY0ZpZWxkQWNsID0gbWFwIHsgJF8gPT4gJF8gfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CgogICAgICAgICMgY2FsbCB0aWNrZXQgQUNMcyBmb3IgRHluYW1pY0ZpZWxkcyB0byBjaGVjayBmaWVsZCB2aXNpYmlsaXR5CiAgICAgICAgbXkgJEFDTFJlc3VsdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICApOwogICAgICAgIGlmICgkQUNMUmVzdWx0KSB7CiAgICAgICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMCB9IGtleXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBzb3J0IGtleXMgJUFjbERhdGEgKSB7CiAgICAgICAgICAgICAgICAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJEZpZWxkIH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfID0+IDEgfSBrZXlzICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+JSo7CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHRzIGlmIGVycm9uZW91cwogICAgICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbGVyIGtleSA9PiBrZXkgYmFjayB0byBrZXkgPT4gdmFsdWUgdXNpbmcgbWFwCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBvc3NpYmxlVmFsdWVzRmlsdGVyfSA9IG1hcCB7ICRfID0+ICRQb3NzaWJsZVZhbHVlcy0+eyRffSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBkbyBub3QgdmFsaWRhdGUgb24gaW5zaXNpYmxlIGZpZWxkcwogICAgICAgICAgICBpZiAoICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgICAgIGlmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSAgICAgICAgICAgICAgICAgICAgICAgID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgaXMgRnJvbUNoYXRJRCwgZ2V0IHJlbGF0ZWQgbWVzc2FnZXMgYW5kIHByZXBlbmQgdGhlbSB0byBib2R5CiAgICAgICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5DaGF0TWVzc2FnZUxpc3QoCiAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VzKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcXVldWUKICAgICAgICBpZiAoICEkTmV3UXVldWVJRCApIHsKICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBwcmV2ZW50IHRhbXBlciB3aXRoIChRdWV1ZS9EZXN0KSwgc2VlIGJ1ZyM5NDA4CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgb3JpZ2luYWwgbGlzdCBvZiBxdWV1ZXMgdG8gZGlzcGxheQogICAgICAgICAgICBteSAkVG9zID0gJFNlbGYtPl9HZXRUb3MoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBjdXJyZW50IHNlbGVjdGVkIFF1ZXVlSUQgZXhpc3RzIGluIHRoZSBsaXN0IG9mIHF1ZXVlcyxcCiAgICAgICAgICAgICMgb3RoZXJ3aXNlIHJpc2UgYW4gZXJyb3IKICAgICAgICAgICAgaWYgKCAhJFRvcy0+eyROZXdRdWV1ZUlEfSApIHsKCiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIHF1ZXVlIGlzIGFjY2Vzc2libGUgYnkgY3VzdG9tZXIgdXNlciAoc2VlIGJ1ZyMxNDg4NikuCiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRNZXNzYWdlJyktPntRdWV1ZX0gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7UXVldWVEaXNhYmxlZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9ye1F1ZXVlSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB0aGUgY29ycmVjdCBxdWV1ZSBuYW1lIGluICRUbyBpZiBpdCB3YXMgYWx0ZXJlZAogICAgICAgICAgICBpZiAoICRUbyBuZSAkVG9zLT57JE5ld1F1ZXVlSUR9ICkgewogICAgICAgICAgICAgICAgJFRvID0gJFRvcy0+eyROZXdRdWV1ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJEFDTFJlc3VsdFN0ZCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0Zvcm1TdGQnLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgIEFydGljbGUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICVWaXNpYmlsaXR5U3RkOwoKICAgICAgICBpZiAoJEFDTFJlc3VsdFN0ZCkgewogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICRWaXNpYmlsaXR5U3RkeyRGaWVsZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7QXJ0aWNsZX0gPSAxOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7U3ViamVjdEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcntCb2R5SW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIG1hbmRhdG9yeSBzZXJ2aWNlCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntTZXJ2aWNlfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0KICAgICAgICAgICAgJiYgISRHZXRQYXJhbXtTZXJ2aWNlSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnsnU2VydmljZUlESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbWFuZGF0b3J5IHNsYQogICAgICAgIGlmICgKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBfQogICAgICAgICAgICAmJiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fQogICAgICAgICAgICAmJiAhJEdldFBhcmFte1NMQUlEfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3J7J1NMQUlESW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdHlwZQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAhJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICRFcnJvcntUeXBlSURJbnZhbGlkfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigpOwoKICAgICAgICAgICAgaWYgKCAkRXJyb3J7UXVldWVEaXNhYmxlZH0gKSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIEluZm8gICAgID0+IFRyYW5zbGF0YWJsZSgiWW91IGRvbid0IGhhdmUgc3VmZmljaWVudCBwZXJtaXNzaW9ucyBmb3IgdGlja2V0IGNyZWF0aW9uIGluIGRlZmF1bHQgcXVldWUuIiksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT5fTWFza05ldygKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzID0+IFxAQXR0YWNobWVudHMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUb1NlbGVjdGVkICAgICAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIFZpc2liaWxpdHkgICAgICAgPT4gXCVWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eVN0ZCAgICA9PiBcJVZpc2liaWxpdHlTdGQsCiAgICAgICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzID0+IFwlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBERkVycm9ycyAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjayggVHlwZSA9PiAnQ3VzdG9tZXInICk7CgogICAgICAgICMgaWYgY3VzdG9tZXIgaXMgbm90IGFsbG93ZWQgdG8gc2V0IHByaW9yaXR5LCBzZXQgaXQgdG8gZGVmYXVsdAogICAgICAgIGlmICggISRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICcnOwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHl9ICAgPSAkQ29uZmlnLT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldENyZWF0ZSgKICAgICAgICAgICAgUXVldWVJRCAgICAgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgIFByaW9yaXR5ICAgICA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICBMb2NrICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnVGlja2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISRWaXNpYmlsaXR5eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In07CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVTZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIG5vIGFydGljbGUgaGFzIHRvIGJlIGNyZWF0ZWQgY2xlYW4gdXAgYW5kIHJldHVybgogICAgICAgIGlmICggISRWaXNpYmlsaXR5U3Rke0FydGljbGV9ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIGRlbGV0ZSBoaWRkZW4gZmllbGRzIGNhY2hlCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdIaWRkZW5GaWVsZHMnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkTWltZVR5cGUgPSAndGV4dC9odG1sJzsKCiAgICAgICAgICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQbGFpbkJvZHkgPSAkR2V0UGFyYW17Qm9keX07CgogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRQbGFpbkJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgYXJ0aWNsZQogICAgICAgIG15ICRGdWxsTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJOYW1lKAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICk7CiAgICAgICAgbXkgJEZyb20gICAgICA9ICJcIiRGdWxsTmFtZVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRUbywKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICRNaW1lVHlwZSwKICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgICAgID8gJ2F1dG8gcmVwbHknCiAgICAgICAgICAgIDogJycsCiAgICAgICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgICAgICBCb2R5ICAgID0+ICRQbGFpbkJvZHksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFF1ZXVlID0+ICRRdWV1ZU9iamVjdC0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IGFydGljbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntPYmplY3RUeXBlfSBuZSAnQXJ0aWNsZSc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkVmlzaWJpbGl0eXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57UmVhZG9ubHl9OwoKICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUGVybWlzc2lvbnMgY2hlY2sgd2VyZSBkb25lIGVhcmxpZXIKICAgICAgICBpZiAoICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Jyk7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZUxpc3QgPSAkQ2hhdE9iamVjdC0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENoYXRBcnRpY2xlSUQ7CgogICAgICAgICAgICBpZiAoQENoYXRNZXNzYWdlTGlzdCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICA9PiAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlQ2hhdEJhY2tlbmQgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdDaGF0JyApOwoKICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZUlEID0gJEFydGljbGVDaGF0QmFja2VuZC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgPT4gJENvbmZpZy0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICAgICAgICAgIENoYXRNZXNzYWdlTGlzdCAgICAgID0+IFxAQ2hhdE1lc3NhZ2VMaXN0LAogICAgICAgICAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICAgICAgICAgSGlzdG9yeVR5cGUgICAgICAgICAgPT4gJENvbmZpZy0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeUNvbW1lbnR9IHx8ICclJScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQ2hhdEFydGljbGVJRCkgewogICAgICAgICAgICAgICAgJENoYXRPYmplY3QtPkNoYXREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIG15IEBBdHRhY2htZW50RGF0YSA9ICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdHRlZCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFBhcmFtT2JqZWN0LT5HZXRVcGxvYWRBbGwoCiAgICAgICAgICAgIFBhcmFtID0+ICdmaWxlX3VwbG9hZCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnREYXRhLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSBhdHRhY2htZW50cwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKCiAgICAgICAgICAgICMgc2tpcCwgZGVsZXRlZCBub3QgdXNlZCBpbmxpbmUgaW1hZ2VzCiAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb250ZW50SUQKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURMaW5rRW5jb2RlID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSgkQ29udGVudElEKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICMgaWdub3JlIGF0dGFjaG1lbnQgaWYgbm90IGxpbmtlZCBpbiBib2R5CiAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBkZWxldGUgaGlkZGVuIGZpZWxkcyBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ0hpZGRlbkZpZWxkcycsCiAgICAgICAgICAgIEtleSAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQoKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57J1F1ZXVlJ30gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtEZXN0fSA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgdXNlIFF1ZXVlRGVmYXVsdCBhcyBmYWxsYmFjayBpZiBRdWV1ZSBzZWxlY3Rpb24gaXMgZGlzYWJsZWQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJFF1ZXVlRGVmYXVsdCA9ICRDb25maWctPnsnUXVldWVEZWZhdWx0J30gfHwgJyc7CiAgICAgICAgICAgIGlmICgkUXVldWVEZWZhdWx0KSB7CiAgICAgICAgICAgICAgICBteSAkUXVldWVEZWZhdWx0SUQgPSAkUXVldWVPYmplY3QtPlF1ZXVlTG9va3VwKCBRdWV1ZSA9PiAkUXVldWVEZWZhdWx0ICk7CiAgICAgICAgICAgICAgICBpZiAoJFF1ZXVlRGVmYXVsdElEKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Rlc3R9ID0gJFF1ZXVlRGVmYXVsdElEIC4gJ3x8JyAuICRRdWV1ZURlZmF1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkUXVldWVEZWZhdWx0SUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRTZWxmLT57VXNlcklEfTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICMgaWYgdGVtcGxhdGVzIHNob3VsZCBiZSBhdXRvc2VsZWN0ZWQsIGF1dG9tYXRpY2FsbHkgaGlkZSB0aGVtCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVGVtcGxhdGU6OkF1dG9zZWxlY3QnKSApIHsKICAgICAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIHRyYWNrIGNoYW5naW5nIHN0YW5kYXJkIGZpZWxkcwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyA9ICRFbGVtZW50Q2hhbmdlZCA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIGlmICggJENoYW5nZWRFbGVtZW50c3tTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVyVXNlcklEfSA9IDE7CiAgICAgICAgICAgICRDaGFuZ2VkRWxlbWVudHN7Q3VzdG9tZXJJRH0gICAgID0gMTsKCiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lcklEfSAgICAgPSAkU2VsZi0+e1VzZXJDdXN0b21lcklEfTsKICAgICAgICB9CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAlQ2hhbmdlZEVsZW1lbnRzOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gJUNoYW5nZWRFbGVtZW50cyA6ICgpOwoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICAgICAgbXkgJVN0ZEZpZWxkVmFsdWVzOwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICgKICAgICAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICAgICAgRmllbGRzICAgICA9PiB7fSwKICAgICAgICAgICAgU2V0cyAgICAgICA9PiB7fSwKICAgICAgICApOwoKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtGaWVsZHN9ICkgewoKICAgICAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSApIHsKCiAgICAgICAgICAgICAgICBteSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwoKICAgICAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICA9PiAnUXVldWVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZUlEICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBTTEFJRCAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICA9PiAnVHlwZUlEJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgTG9vcFByb3RlY3Rpb24gID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgRHluRmllbGRTdGF0ZXMgICAgICA9PiBcJUR5bkZpZWxkU3RhdGVzLAogICAgICAgICk7CgogICAgICAgIG15ICRBQ0xSZXN1bHRTdGQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdGb3JtU3RkJywKICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBBcnRpY2xlID0+ICdBcnRpY2xlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAlVmlzaWJpbGl0eVN0ZCA9ICgKICAgICAgICAgICAgQXJ0aWNsZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgkQUNMUmVzdWx0U3RkKSB7CiAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVBY2xEYXRhICkgewogICAgICAgICAgICAgICAgJFZpc2liaWxpdHlTdGR7JEZpZWxkfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVmlzaWJpbGl0eVN0ZHtBcnRpY2xlfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3RyaWN0aW9uc19WaXNpYmlsaXR5X1N0ZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVWaXNpYmlsaXR5U3RkLAogICAgICAgIH07CgogICAgICAgICMgYnVpbGQgQUpBWCByZXR1cm4gZm9yIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSBAU3RkRmllbGRBSkFYOwogICAgICAgIG15ICVBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBEZXN0ID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICB9LAogICAgICAgICAgICBQcmlvcml0eUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU0xBSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFR5cGVJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICk7CiAgICAgICAgZGVsZXRlICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVzeyRGaWVsZH0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXskRmllbGR9LAogICAgICAgICAgICAgICAgJXsgJEF0dHJpYnV0ZXN7JEZpZWxkfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICBteSBAVGVtcGxhdGVBSkFYOwogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgICMgdXBkYXRlIHRpY2tldCBib2R5IGFuZCBhdHRhY2hlbWVudHMgaWYgbmVlZGVkLgoKICAgICAgICBpZiAoICRDaGFuZ2VkU3RkRmllbGRze1N0YW5kYXJkVGVtcGxhdGVJRH0gKSB7CgogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRMYXlvdXRPYmplY3QtPkh1bWFuUmVhZGFibGVEYXRhU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBAU3RkRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICBAVGVtcGxhdGVBSkFYLAojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgXSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb24nLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIFN1YmFjdGlvbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlUHJpb3JpdGllczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlVHlwZTsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CgogICAgIyBjaGVjayBuZWVkZWQKICAgIHJldHVybiBcJVNlcnZpY2UgaWYgISRQYXJhbXtRdWV1ZUlEfSAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBvcHRpb25zIGZvciBkZWZhdWx0IHNlcnZpY2VzIGZvciB1bmtub3duIGN1c3RvbWVycwogICAgbXkgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2U6OkRlZmF1bHQ6OlVua25vd25DdXN0b21lcicpOwoKICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9IHx8ICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAlU2VydmljZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U2VydmljZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgc2VydmljZXMgaWYgdGhleSB3ZXJlIG5vdCBkZXRlcm1pbmVkIGluIGFuIEFKQVggY2FsbAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17U2VydmljZXN9ICkgewogICAgICAgICRQYXJhbXtTZXJ2aWNlc30gPSAkU2VsZi0+X0dldFNlcnZpY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zID0gKCAnJywgJy0nICk7CiAgICBteSAkTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdDdXN0b21lclBhbmVsOjpOZXdUaWNrZXRRdWV1ZVNlbGVjdGlvbk1vZHVsZScpCiAgICAgICAgfHwgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpDdXN0b21lck5ld1RpY2tldDo6UXVldWVTZWxlY3Rpb25HZW5lcmljJzsKICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgU3lzdGVtQWRkcmVzcyA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLAogICAgICAgICAgICBEZWJ1ZyAgICAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CgogICAgICAgICMgbG9nIGxvYWRlZCBtb2R1bGUKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ICYmICRTZWxmLT57RGVidWd9ID4gMSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1vZHVsZTogJE1vZHVsZSBsb2FkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJU5ld1RvcyA9ICgKICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgRW52ICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgQUNMUGFyYW1zID0+IFwlUGFyYW0KICAgICAgICAgICAgKSwKICAgICAgICAgICAgKCAnJywgPT4gJy0nICkKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKS0+RmF0YWxEaWUoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNvdWxkIG5vdCBsb2FkICRNb2R1bGUhIiwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQpzdWIgX0dldFN0YW5kYXJkVGVtcGxhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkUXVldWVJRCAgICAgICA9ICRQYXJhbXtRdWV1ZUlEfSAgIHx8ICcnOwogICAgbXkgJFNlcnZpY2VJRCAgICAgPSAkUGFyYW17U2VydmljZUlEfSB8fCAnJzsKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CiAgICBteSAkU2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyk7CgogICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgbXkgJFJlZmVyZW5jZUF0dHJpYnV0ZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJUZW1wbGF0ZTo6UmVmZXJlbmNlQXR0cmlidXRlJykgfHwgJ1F1ZXVlJzsKICAgIGlmICggJFJlZmVyZW5jZUF0dHJpYnV0ZSBlcSAnUXVldWUnICkgewoKICAgICAgICAjIGNoZWNrIG5lZWRlZAogICAgICAgIHJldHVybiB7fSBpZiAhJFF1ZXVlSUQ7CgogICAgICAgICMgZmV0Y2ggYWxsIHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgJVN0YW5kYXJkVGVtcGxhdGVzID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBRdWV1ZUlEICAgICAgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFJlZmVyZW5jZUF0dHJpYnV0ZSBlcSAnU2VydmljZScgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkCiAgICAgICAgcmV0dXJuIHt9IGlmICEkU2VydmljZUlEOwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZldGNoIHN0YW5kYXJkIHRlbXBsYXRlcyBsaXN0ISBJbnZhbGlkIHJlZmVyZW5jZSBhdHRyaWJ1dGUgJyRSZWZlcmVuY2VBdHRyaWJ1dGUnIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldHVybiBlbXB0eSBoYXNoIGlmIHRoZXJlIGFyZSBubyB0ZW1wbGF0ZXMgZm9yIHRoaXMgc2NyZWVuCiAgICByZXR1cm4ge30gaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkU3RhbmRhcmRUZW1wbGF0ZXN7Q3VzdG9tZXJDcmVhdGV9ICk7CgogICAgIyByZXR1cm4ganVzdCB0aGUgdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuICRTdGFuZGFyZFRlbXBsYXRlc3tDdXN0b21lckNyZWF0ZX07Cn0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgpzdWIgX01hc2tOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKICAgICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSA9ICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSB8fCAnJzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJENvbmZpZyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgaWYgKCAkQ29uZmlnLT57UXVldWV9ICkgewoKICAgICAgICAjIGNoZWNrIG93biBzZWxlY3Rpb24KICAgICAgICBteSAlTmV3VG9zID0gKCAnJywgJy0nICk7CiAgICAgICAgbXkgJE1vZHVsZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbDo6TmV3VGlja2V0UXVldWVTZWxlY3Rpb25Nb2R1bGUnKQogICAgICAgICAgICB8fCAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkN1c3RvbWVyTmV3VGlja2V0OjpRdWV1ZVNlbGVjdGlvbkdlbmVyaWMnOwogICAgICAgIGlmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgU3lzdGVtQWRkcmVzcyA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycpLAogICAgICAgICAgICAgICAgRGVidWcgICAgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbG9nIGxvYWRlZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0RlYnVnfSAmJiAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJNb2R1bGU6ICRNb2R1bGUgbG9hZGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICVOZXdUb3MgPSAoCiAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgRW52ICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICAgICAgICAgIEFDTFBhcmFtcyA9PiBcJVBhcmFtCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKCAnJywgPT4gJy0nICkKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHRvIHN0cmluZwogICAgICAgIGlmICglTmV3VG9zKSB7CiAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlTmV3VG9zICkgewogICAgICAgICAgICAgICAgJE5ld1Rvc3siJF98fCROZXdUb3N7JF99In0gPSAkTmV3VG9zeyRffTsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTmV3VG9zeyRffTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1RvU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU5ld1RvcywKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAwLAogICAgICAgICAgICBTaXplICAgICAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICJWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgRm9ybVVwZGF0ZSAiIC4gJFBhcmFte0Vycm9yc30tPntRdWV1ZUludmFsaWR9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtUb1NlbGVjdGVkfSB8fCAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgIFRyZWVWaWV3ICAgPT4gJFRyZWVWaWV3LAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgUXVldWVJbnZhbGlkID0+ICRQYXJhbXtFcnJvcnN9LT57UXVldWVJbnZhbGlkfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgIH0KCiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gKSB7CiAgICAgICAgbXkgJVByaW9yaXRpZXMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBwcmlvcml0eSBzdHJpbmcKICAgICAgICBteSAlUHJpb3JpdHlTZWxlY3RlZDsKICAgICAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgJFByaW9yaXR5U2VsZWN0ZWR7U2VsZWN0ZWRJRH0gPSAkUGFyYW17UHJpb3JpdHlJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZFZhbHVlfSA9ICRDb25maWctPntQcmlvcml0eURlZmF1bHR9IHx8ICczIG5vcm1hbCc7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgID0+IFwlUHJpb3JpdGllcywKICAgICAgICAgICAgTmFtZSAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBDbGFzcyA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgICAgICAlUHJpb3JpdHlTZWxlY3RlZCwKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHlwZXMKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57J1RpY2tldFR5cGUnfSApIHsKICAgICAgICBteSAlVHlwZSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZy0+eydUaWNrZXRUeXBlRGVmYXVsdCd9ICYmICEkUGFyYW17VHlwZUlEfSApIHsKICAgICAgICAgICAgbXkgJVJldmVyc2VUeXBlID0gcmV2ZXJzZSAlVHlwZTsKICAgICAgICAgICAgJFBhcmFte1R5cGVJRH0gPSAkUmV2ZXJzZVR5cGV7ICRDb25maWctPnsnVGlja2V0VHlwZURlZmF1bHQnfSB9OwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICJWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUgRm9ybVVwZGF0ZSAiIC4gKCAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9IHx8ICcnICksCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0VHlwZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVHlwZUlESW52YWxpZCA9PiAkUGFyYW17RXJyb3JzfS0+e1R5cGVJREludmFsaWR9LAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJENvbmZpZy0+e1NlcnZpY2V9ICkgewoKICAgICAgICAjIHVzZSBlaXRoZXIgdGhlIHJlYWwgUXVldWVJRCwgb3IgdGhlIFRpY2tldElELCBvciAxIGFzIFF1ZXVlSUQKICAgICAgICBteSAkVG1wUXVldWVJRCA9ICRQYXJhbXtRdWV1ZUlEfSA/ICRQYXJhbXtRdWV1ZUlEfSA6CiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRJRH0gPyB1bmRlZiA6IDE7CgogICAgICAgIG15ICVTZXJ2aWNlcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRUbXBRdWV1ZUlELAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTZXJ2aWNlcywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUgJwogICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSA/ICdWYWxpZGF0ZV9SZXF1aXJlZCAnIDogJycgKQogICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U2VydmljZUlESW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2VNYW5kYXRvcnkgPT4gJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgIGlmICggISRTZXJ2aWNlc3sgJFBhcmFte1NlcnZpY2VJRH0gfHwgJycgfSApIHsKICAgICAgICAgICAgJFBhcmFte1NlcnZpY2VJRH0gPSAnJzsKICAgICAgICB9CiAgICAgICAgbXkgJVNMQTsKICAgICAgICBpZiAoICRDb25maWctPntTTEF9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAgICAgJVNMQSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAxLCAgICAjIHVzZSBkZWZhdWx0IFF1ZXVlSUQgaWYgbm9uZSBpcyBwcm92aWRlZCBpbiAlUGFyYW0KICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBGb3JtVXBkYXRlICcKICAgICAgICAgICAgICAgICAgICAuICggJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTTEFJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JF99ID0gJFBhcmFte0Vycm9yc30tPnskX307CiAgICAgICAgfQogICAgfQoKICAgICMgcmVuZGVyIGR5bmFtaWMgZmllbGRzCiAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgIENvbnRlbnQgICAgICAgICAgICAgID0+ICRTZWxmLT57TWFza0RlZmluaXRpb259LAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+ICRTZWxmLT57RHluYW1pY0ZpZWxkfSwKICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKSwKICAgICAgICBEeW5hbWljRmllbGRWYWx1ZXMgICA9PiAkUGFyYW17RHluYW1pY0ZpZWxkfSwKICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUGFyYW17REZQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgRXJyb3JzICAgICAgICAgICAgICAgPT4gJFBhcmFte0RGRXJyb3JzfSwKICAgICAgICBWaXNpYmlsaXR5ICAgICAgICAgICA9PiAkUGFyYW17VmlzaWJpbGl0eX0sCiAgICAgICAgQ3VzdG9tZXJJbnRlcmZhY2UgICAgPT4gMSwKICAgICAgICBPYmplY3QgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRTZWxmLT57VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICRQYXJhbXtEeW5hbWljRmllbGR9LT4lKiwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkUGFyYW17VmlzaWJpbGl0eVN0ZH17QXJ0aWNsZX0gKSB7CiAgICAgICAgJFBhcmFte1N1YmplY3RWYWxpZGF0ZX0gICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkX0lmVmlzaWJsZSc7CiAgICAgICAgJFBhcmFte0JvZHlWYWxpZGF0ZX0gICAgICAgICAgID0gJ1ZhbGlkYXRlX1JlcXVpcmVkX0lmVmlzaWJsZSc7CiAgICAgICAgJFBhcmFte1N1YmplY3RIaWRkZW5DbGFzc30gICAgID0gJyBvb29BQ0xIaWRkZW4nOwogICAgICAgICRQYXJhbXtCb2R5SGlkZGVuQ2xhc3N9ICAgICAgICA9ICcgb29vQUNMSGlkZGVuJzsKICAgICAgICAkUGFyYW17QXR0YWNobWVudHNIaWRkZW5DbGFzc30gPSAnIG9vb0FDTEhpZGRlbic7CiAgICB9CgogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1N1YmplY3RWYWxpZGF0ZX0gPSAnVmFsaWRhdGVfUmVxdWlyZWRfSWZWaXNpYmxlJzsKICAgICAgICAkUGFyYW17Qm9keVZhbGlkYXRlfSAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZF9JZlZpc2libGUnOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyBjaGVjayBpZiBleGlzdHMgY3VzdG9tZXIgY3JlYXRlIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZSBhbmQgdGhlIHNlcnZpY2UKICAgIG15ICVTdGFuZGFyZFRlbXBsYXRlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyktPlN0YW5kYXJkVGVtcGxhdGVMaXN0KAogICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgVHlwZSAgPT4gJ0N1c3RvbWVyQ3JlYXRlJywKICAgICk7CgogICAgIyBidWlsZCB0ZXh0IHRlbXBsYXRlIHN0cmluZwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewoKICAgICAgICAjIGZldGNoIGFsbCBhdmFpbGFibGUgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICBteSAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VsZi0+X0dldFN0YW5kYXJkVGVtcGxhdGVzKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXMgfHwge30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IHx8ICcnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhbmRhcmRUZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICBBVFRBQ0hNRU5UOgogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9CiAgICAgICAgICAgICYmICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57RGlzcG9zaXRpb259IGVxICdpbmxpbmUnICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgfQoKICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICRQYXJhbXtSaWNoVGV4dEhlaWdodH0gPSAkQ29uZmlnLT57UmljaFRleHRIZWlnaHR9IHx8IDA7CiAgICAgICAgJFBhcmFte1JpY2hUZXh0V2lkdGh9ICA9ICRDb25maWctPntSaWNoVGV4dFdpZHRofSAgfHwgMDsKCiAgICAgICAgIyBzZXQgdXAgY3VzdG9tZXIgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyU2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFBlcm1pc3Npb25zIGhhdmUgYmVlbiBjaGVja2VkIGJlZm9yZSBpbiBSdW4oKQogICAgaWYgKCAkUGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgbXkgQENoYXRNZXNzYWdlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRNZXNzYWdlTGlzdCgKICAgICAgICAgICAgQ2hhdElEID0+ICRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJE1lc3NhZ2UgKEBDaGF0TWVzc2FnZXMpIHsKICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NoYXRBcnRpY2xlUHJldmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VzID0+IFxAQ2hhdE1lc3NhZ2VzLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17SGlkZUF1dG9zZWxlY3RlZH0gKSB7CgogICAgICAgICMgYWRkIEF1dG9zZWxlY3QgSlMKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU09uRG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgQ29kZSA9PiAiQ29yZS5Gb3JtLkluaXRIaWRlQXV0b3NlbGVjdGVkKHsgRmllbGRJRHM6ICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSB9KTsiLAogICAgICAgICk7CiAgICB9CgogICAgIyBleHBsYW5hdG9yeSBtZXNzYWdlIGFib3V0IGFzdGVyaXNrCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXN0ZXJpc2tFeHBsYW5hdGlvbicpICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBc3Rlcmlza0V4cGxhbmF0aW9uJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG91dHB1dCBiYWNrCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJUaWNrZXRNZXNzYWdlJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/CustomerTicketZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA1ODFlMzZmYjNhZmZjMmEzODdkZDcwODI0ZTMwOWY0NTE2MzU0NWZlIC0gS2VybmVsL01vZHVsZXMvQ3VzdG9tZXJUaWNrZXRab29tLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFpvb207Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKdXNlIExpc3Q6OlV0aWwgIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgbXkgJERlZmluaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpNYXNrJyktPkRlZmluaXRpb25HZXQoCiAgICAgICAgTWFzayA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICApIHx8IHt9OwoKICAgICRTZWxmLT57TWFza0RlZmluaXRpb259ICAgICAgID0gJERlZmluaXRpb24tPntNYXNrfTsKICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9ID0ge307CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSQogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKCiAgICAgICAgbXkgJElzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0N1c3RvbWVySW50ZXJmYWNlQ2FwYWJsZScsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWR1Y2UgdGhlIGR5bmFtaWMgZmllbGRzIHRvIG9ubHkgdGhlIG9uZXMgdGhhdCBhcmUgZGVzaWduZWQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIGlmICggZXhpc3RzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkc317ICREeW5hbWljRmllbGQtPntOYW1lfSB9ICkgewogICAgICAgICAgICBteSAkUGFyYW1ldGVycyA9IGRlbGV0ZSAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZHN9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSAvLyB7fTsKCiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57JEF0dHJpYnV0ZX0gPSAkUGFyYW1ldGVycy0+eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwdXNoICRTZWxmLT57TWFza0RlZmluaXRpb259LT5AKiwgewogICAgICAgICAgICAgICAgREYgICAgICAgID0+ICREeW5hbWljRmllbGQtPntOYW1lfSwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkQ29uZmlnLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9PSAyID8gMSA6IDAsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAoICRDb25maWctPntGb2xsb3dVcER5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGQtPntOYW1lfSB9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkLT57TWFuZGF0b3J5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgIyBhbGlnbiBzeXNjb25maWcgYW5kIHRpY2tldCBtYXNrIGRhdGEgSUkKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIGtleXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfS0+JSogKSB7CiAgICAgICAgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH17JER5bmFtaWNGaWVsZE5hbWV9ID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICk7CgogICAgICAgIG15ICRQYXJhbWV0ZXJzID0gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRzfXskRHluYW1pY0ZpZWxkTmFtZX0gLy8ge307CgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAkUGFyYW1ldGVycy0+JSogKSB7CiAgICAgICAgICAgICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9eyREeW5hbWljRmllbGROYW1lfXskQXR0cmlidXRlfSA9ICRQYXJhbWV0ZXJzLT57JEF0dHJpYnV0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gaWQKICAgICRTZWxmLT57Rm9ybUlEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5QcmVwYXJlRm9ybUlEKAogICAgICAgIFBhcmFtT2JqZWN0ICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JyksCiAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKSwKICAgICk7CgogICAgIyBtZXRob2RzIHdoaWNoIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIHRoZSBzdGFuZGFyZCBmaWVsZHMKICAgICRTZWxmLT57RmllbGRNZXRob2RzfSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFByaW9yaXRpZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldE5leHRTdGF0ZXMKICAgICAgICB9LAoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTdGFuZGFyZFRlbXBsYXRlcwogICAgICAgIH0sCgojIEVPIEN1c3RvbWVyVGVtcGxhdGUKICAgIF07CgogICAgIyBkZXBlbmRlbmNpZXMgb2Ygc3RhbmRhcmQgZmllbGRzIHdoaWNoIGFyZSBub3QgZGVmaW5lZCB2aWEgQUNMcyAtIGhlcmUgZm9yIGNvbnNpc3RlbmN5CiAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX0gPSB7fTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkVGlja2V0TnVtYmVyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldE51bWJlcicgKTsKCiAgICAjIHRpY2tldCBpZCBsb29rdXAKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICYmICRUaWNrZXROdW1iZXIgKSB7CiAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXROdW1iZXInICksCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY3VzdG9tZXJzIHNob3VsZCBub3QgZ2V0IHRvIGtub3cgdGhhdCB3aGV0aGVyIGFuIHRpY2tldCBleGlzdHMgb3Igbm90CiAgICAjIGlmIGEgdGlja2V0IGRvZXMgbm90IGV4aXN0LCBzaG93IGEgIm5vIHBlcm1pc3Npb24iIHNjcmVlbgogICAgaWYgKCAkVGlja2V0TnVtYmVyICYmICEkU2VsZi0+e1RpY2tldElEfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdOZWVkIFRpY2tldElEIScpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICBteSAkQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBwcm9jZXNzIG1hbmFnZW1lbnQKICAgIG15ICVBY3Rpdml0eUVycm9ySFRNTDsKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZUFjdGl2aXR5RGlhbG9nJyApIHsKICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCJLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzcyIpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdDb3VsZCBub3QgbG9hZCBwcm9jZXNzIG1vZHVsZS4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRQcm9jZXNzTW9kdWxlID0gKCdLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzcycpLT5uZXcoCiAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0N1c3RvbWVyVGlja2V0UHJvY2VzcycsCiAgICAgICAgICAgIFN1YmFjdGlvbiA9PiAkU2VsZi0+e1N1YmFjdGlvbn0sCiAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57J0N1c3RvbWVyVGlja2V0UHJvY2Vzcyd9LAogICAgICAgICk7CgogICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQnICk7CiAgICAgICAgJEFjdGl2aXR5RXJyb3JIVE1MeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSA9ICRQcm9jZXNzTW9kdWxlLT5SdW4oJVBhcmFtKTsKCiAgICAgICAgIyByZXR1cm4gZGlyZWN0bHkgaW4gY2FzZSBvZiBhbiBlcnJvciBkaWFsb2cKICAgICAgICByZXR1cm4gJEFjdGl2aXR5RXJyb3JIVE1MeyRBY3Rpdml0eURpYWxvZ0VudGl0eUlEfSBpZiAkQWN0aXZpdHlFcnJvckhUTUx7JEFjdGl2aXR5RGlhbG9nRW50aXR5SUR9ID1+IC9ePCFET0NUWVBFIGh0bWw+LzsKICAgIH0KCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgJiYgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0FjdGl2aXR5RGlhbG9nRW50aXR5SUQnICkgKSB7CiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MiKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBsb2FkIHByb2Nlc3MgbW9kdWxlLiIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFByb2Nlc3NNb2R1bGUgPSAoJ0tlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcm9jZXNzJyktPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIEFjdGlvbiAgICA9PiAnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJywKICAgICAgICAgICAgU3ViYWN0aW9uID0+ICRTZWxmLT57U3ViYWN0aW9ufSwKICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsnQ3VzdG9tZXJUaWNrZXRQcm9jZXNzJ30sCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRQcm9jZXNzTW9kdWxlLT5SdW4oJVBhcmFtKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBnZXQgQUNMIHJlc3RyaWN0aW9ucwogICAgbXkgJVBvc3NpYmxlQWN0aW9uczsKICAgIG15ICRDb3VudGVyID0gMDsKCiAgICAjIGdldCBhbGwgcmVnaXN0ZXJlZCBBY3Rpb25zCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpIGVxICdIQVNIJyApIHsKCiAgICAgICAgbXkgJUFjdGlvbnMgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpIH07CgogICAgICAgICMgb25seSB1c2UgdGhvc2UgQWN0aW9ucyB0aGF0IHN0YXJ0cyB3aXRoIEN1c3RvbWVyCiAgICAgICAgJVBvc3NpYmxlQWN0aW9ucyA9IG1hcCB7ICsrJENvdW50ZXIgPT4gJF8gfQogICAgICAgICAgICBncmVwIHsgc3Vic3RyKCAkXywgMCwgbGVuZ3RoICdDdXN0b21lcicgKSBlcSAnQ3VzdG9tZXInIH0KICAgICAgICAgICAgc29ydCBrZXlzICVBY3Rpb25zOwogICAgfQogICAgJFBvc3NpYmxlQWN0aW9uc3sgKyskQ291bnRlciB9ID0gJ0N1c3RvbWVyVGlja2V0Wm9vbVJlcGx5JzsKCiAgICBteSAkQUNMID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgID0+IFwlUG9zc2libGVBY3Rpb25zLAogICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAlQWNsQWN0aW9uID0gJVBvc3NpYmxlQWN0aW9uczsKICAgIGlmICgkQUNMKSB7CiAgICAgICAgJUFjbEFjdGlvbiA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbEFjdGlvbkRhdGEoKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIEFDTCByZXN0cmljdGlvbnMgZXhpc3QKICAgIG15ICVBY2xBY3Rpb25Mb29rdXAgPSByZXZlcnNlICVBY2xBY3Rpb247CgogICAgIyBzaG93IGVycm9yIHNjcmVlbiBpZiBBQ0wgcHJvaGliaXRzIHRoaXMgYWN0aW9uCiAgICBpZiAoICEkQWNsQWN0aW9uTG9va3VweyAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Tm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgIyBnZXQgYWxsIGFydGljbGVzIG9mIHRoaXMgdGlja2V0LCB0aGF0IGFyZSB2aXNpYmxlIGZvciB0aGUgY3VzdG9tZXIKICAgIG15IEBBcnRpY2xlTGlzdCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgID0+IDAsCiAgICApOwoKICAgIG15IEBBcnRpY2xlQm94OwogICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0OwoKICAgIEFSVElDTEVNRVRBREFUQToKICAgIGZvciBteSAkQXJ0aWNsZU1ldGFEYXRhIChAQXJ0aWNsZUxpc3QpIHsKCiAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgISRBcnRpY2xlTWV0YURhdGE7CiAgICAgICAgbmV4dCBBUlRJQ0xFTUVUQURBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcnRpY2xlTWV0YURhdGEpOwoKICAgICAgICAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGVNZXRhRGF0YX0gKTsKCiAgICAgICAgbXkgJUFydGljbGVEYXRhID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5BcnRpY2xlR2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZU1ldGFEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgUmVhbE5hbWVzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgY2hhbm5lbCBzcGVjaWZpYyBmaWVsZHMKICAgICAgICBteSAlQXJ0aWNsZUZpZWxkcyA9ICRMYXlvdXRPYmplY3QtPkFydGljbGVGaWVsZHMoCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlTWV0YURhdGEtPntBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICRBcnRpY2xlRGF0YXtTdWJqZWN0fSAgICAgID0gJEFydGljbGVGaWVsZHN7U3ViamVjdH07CiAgICAgICAgJEFydGljbGVEYXRhe0Zyb21SZWFsbmFtZX0gPSAkQXJ0aWNsZUZpZWxkc3tTZW5kZXJ9OwoKICAgICAgICAjIEdldCBhdHRhY2htZW50IGluZGV4LgogICAgICAgIG15ICVBdG1JbmRleCA9ICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZUF0dGFjaG1lbnRJbmRleCgKICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgICA9PiAkQXJ0aWNsZU1ldGFEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgRXhjbHVkZVBsYWluVGV4dCA9PiAxLAogICAgICAgICAgICBFeGNsdWRlSFRNTEJvZHkgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1ZGVJbmxpbmUgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUF0bUluZGV4ICkgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRGF0YXtBdHRhY2htZW50fSA9IFwlQXRtSW5kZXg7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBBcnRpY2xlQm94LCBcJUFydGljbGVEYXRhOwogICAgfQoKICAgIG15ICVHZXRQYXJhbTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKIyAgICBmb3IgbXkgJEtleSAocXcoU3ViamVjdCBCb2R5IFN0YXRlSUQgUHJpb3JpdHlJRCBGcm9tQ2hhdElEIEZyb21DaGF0KSkgewoKICAgIGZvciBteSAkS2V5IChxdyhTdWJqZWN0IEJvZHkgU3RhdGVJRCBQcmlvcml0eUlEIEZyb21DaGF0SUQgRnJvbUNoYXQgU3RhbmRhcmRUZW1wbGF0ZUlEKSkgewojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgfQoKICAgICMgZ2V0IER5bmFtaWMgZmllbGRzIGZyb20gUGFyYW1PYmplY3QKICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXM7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2hhdCBpcyBub3QgYWN0aXZlLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBjaGF0IHBhcnRpY2lwYW50CiAgICAgICAgbXkgJUNoYXRQYXJ0aWNpcGFudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0JyktPkNoYXRQYXJ0aWNpcGFudENoZWNrKAogICAgICAgICAgICBDaGF0SUQgICAgICA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgIENoYXR0ZXJUeXBlID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIENoYXR0ZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICElQ2hhdFBhcnRpY2lwYW50ICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0CiAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICApOwogICAgfQoKICAgICMgY29udmVydCBkeW5hbWljIGZpZWxkIHZhbHVlcyBpbnRvIGEgc3RydWN0dXJlIGZvciBBQ0xzCiAgICBteSAlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggc29ydCBrZXlzICVEeW5hbWljRmllbGRWYWx1ZXMgKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGQ7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAjIGdldCBUaWNrZXRJRAogICAgICAgIGlmICggISRHZXRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRJRH0gPQogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gfHwKICAgICAgICAgICAgICAgICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKICAgICAgICB9CgogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1VzZXJJRH07CgogICAgICAgIG15ICRFbGVtZW50Q2hhbmdlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKTsKCiAgICAgICAgIyB1c2UgdGhlIEZpZWxkSURzLCB3aGljaCBhcmUgZm91bmQgaW4gQWdlbnRUaWNrZXRQaG9uZS9FbWFpbCwgYW5kIEN1c3RvbWVyVGlja2V0TWVzc2FnZQogICAgICAgIG15ICVVbmlmb3JtaXR5ID0gKAogICAgICAgICAgICBTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRFbGVtZW50Q2hhbmdlZCAmJiAkVW5pZm9ybWl0eXskRWxlbWVudENoYW5nZWR9ICkgewogICAgICAgICAgICAkRWxlbWVudENoYW5nZWQgPSAkVW5pZm9ybWl0eXskRWxlbWVudENoYW5nZWR9OwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJERpdmVyc0lEICgga2V5cyAlVW5pZm9ybWl0eSApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkVW5pZm9ybWl0eXskRGl2ZXJzSUR9IH0gPSAkR2V0UGFyYW17JERpdmVyc0lEfTsKICAgICAgICB9CgogICAgICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkZpZWxkUmVzdHJpY3Rpb25zJyk7CiAgICAgICAgbXkgJEF1dG9zZWxlY3QgICAgICAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkF1dG9zZWxlY3QnKSB8fCB1bmRlZjsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAjIGlmIHRlbXBsYXRlcyBzaG91bGQgYmUgYXV0b3NlbGVjdGVkLCBhdXRvbWF0aWNhbGx5IGhpZGUgdGhlbQogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0JykgKSB7CiAgICAgICAgICAgICRBdXRvc2VsZWN0LT57U3RhbmRhcmRUZW1wbGF0ZUlEfSA9IDI7CiAgICAgICAgfQojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgIyB0cmFjayBjaGFuZ2luZyBzdGFuZGFyZCBmaWVsZHMKICAgICAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXRBQ0w6OkFDTFByZXNlbGVjdGlvbicpICkgewoKICAgICAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAgICAgJEFDTFByZXNlbGVjdGlvbiA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGlja2V0QUNMJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24gKSB7CiAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgICAgIFN0ZEZpZWxkcyA9PiAwLAogICAgICAgICAgICBGaWVsZHMgICAgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHMgPSAkRWxlbWVudENoYW5nZWQgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBpZiAoICRDaGFuZ2VkRWxlbWVudHN7U2VydmljZUlEfSApIHsKICAgICAgICAgICAgJENoYW5nZWRFbGVtZW50c3tDdXN0b21lclVzZXJJRH0gPSAxOwogICAgICAgICAgICAkQ2hhbmdlZEVsZW1lbnRze0N1c3RvbWVySUR9ICAgICA9IDE7CgogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gICAgID0gJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH07CiAgICAgICAgfQogICAgICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gJUNoYW5nZWRFbGVtZW50czsKICAgICAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkcyAgICAgICA9ICRFbGVtZW50Q2hhbmdlZCAmJiAkRWxlbWVudENoYW5nZWQgIX4gL15EeW5hbWljRmllbGRfLyA/ICVDaGFuZ2VkRWxlbWVudHMgOiAoKTsKCiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uID0gMTAwOwogICAgICAgIG15ICVTdGRGaWVsZFZhbHVlczsKICAgICAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgICAgIFZpc2liaWxpdHkgPT4ge30sCiAgICAgICAgICAgIEZpZWxkcyAgICAgPT4ge30sCiAgICAgICAgICAgIFNldHMgICAgICAgPT4ge30sCiAgICAgICAgKTsKCiAgICAgICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgICAgICMgZGV0ZXJtaW5lIHN0YW5kYXJkIGZpZWxkIGlucHV0CiAgICAgICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gKSB7CgogICAgICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICAgICAjIHdoaWNoIHN0YW5kYXJkIGZpZWxkcyB0byBjaGVjayAtIEZpZWxkSUQgPT4gR2V0UGFyYW1WYWx1ZSAobmVjZXNzYXJ5IGZvciBEZXN0KQogICAgICAgICAgICAgICAgbXkgJUNoZWNrID0gKAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgPT4gJ1ByaW9yaXR5SUQnLAoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZUlEICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17IiRRdWV1ZUlEfHwkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH17ICRRdWV1ZUlEIH0ifSA9ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAhJFN0ZEZpZWxkVmFsdWVze0Rlc3R9eyAkR2V0UGFyYW17RGVzdH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAjIGF1dG9zZWxlY3QKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1F1ZXVlSUR9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57RGVzdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgPT4gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayB3aGV0aGVyIGN1cnJlbnQgc2VsZWN0ZWQgdmFsdWUgaXMgc3RpbGwgdmFsaWQgZm9yIHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICEkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH17ICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgaWYgbm90IGVtcHR5IHRoZSBmaWVsZAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdDaGFuZ2VkRWxlbWVudHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+eyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlZFN0ZEZpZWxkc3sgJEZpZWxkLT57RmllbGRJRH0gfSAgID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHMgPSAlTmV3Q2hhbmdlZEVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0LAogICAgICAgICAgICAgICAgICAgICVOZXdDaGFuZ2VkRWxlbWVudHMsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJExvb3BQcm90ZWN0aW9uLS0gPCAxICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmFuIGludG8gdW5yZXNvbHZhYmxlIGxvb3AhIiwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzICAgICAgICA9ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0OwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICgpOwoKICAgICAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICBteSAlQ3VyRmllbGRTdGF0ZXM7CiAgICAgICAgICAgIGlmICglQ2hhbmdlZEVsZW1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAlQ3VyRmllbGRTdGF0ZXMgPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkdldEZpZWxkU3RhdGVzKAogICAgICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7JUdldFBhcmFtfSwKICAgICAgICAgICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgICAgICAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICAgICAgICAgIEFDTFByZXNlbGVjdGlvbiAgICAgICAgICAgPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY29tYmluZSBGaWVsZFN0YXRlcwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7U2V0c30gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze1NldHN9IH0sCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYID0gJEJhY2tlbmRPYmplY3QtPkJ1aWxkQUpBWFJldHVybigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlncyA9PiAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICBEeW5GaWVsZFN0YXRlcyAgICAgID0+IFwlRHluRmllbGRTdGF0ZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBBSkFYIHJldHVybiBmb3IgdGhlIHN0YW5kYXJkIGZpZWxkcwogICAgICAgIG15IEBTdGRGaWVsZEFKQVg7CiAgICAgICAgbXkgJUF0dHJpYnV0ZXMgPSAoCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmV4dFN0YXRlSUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgKTsKICAgICAgICBteSAlRGl2ZXJzaXR5ID0gcmV2ZXJzZSAlVW5pZm9ybWl0eTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICREaXZlcnNpdHl7JEZpZWxkfSB8fCAkRmllbGQsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3skRmllbGR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17JEZpZWxkfSwKICAgICAgICAgICAgICAgICV7ICRBdHRyaWJ1dGVzeyRGaWVsZH0gfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgbXkgQFRlbXBsYXRlQUpBWDsKICAgICAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICAgICAjIHVwZGF0ZSB0aWNrZXQgYm9keSBhbmQgYXR0YWNoZW1lbnRzIGlmIG5lZWRlZC4KCiAgICAgICAgaWYgKCAkQ2hhbmdlZFN0ZEZpZWxkc3tTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICAgICBteSBAVGlja2V0QXR0YWNobWVudHM7CiAgICAgICAgICAgIG15ICRUZW1wbGF0ZVRleHQ7CgogICAgICAgICAgICAjIHJlbW92ZSBhbGwgYXR0YWNobWVudHMgZnJvbSB0aGUgVXBsb2FkIGNhY2hlCiAgICAgICAgICAgIG15ICRSZW1vdmVTdWNjZXNzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURSZW1vdmUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVtb3ZlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZvcm0gYXR0YWNobWVudHMgY291bGQgbm90IGJlIGRlbGV0ZWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSB0ZW1wbGF0ZSB0ZXh0IGFuZCBzZXQgbmV3IGF0dGFjaG1lbnRzIGlmIGEgdGVtcGxhdGUgaXMgc2VsZWN0ZWQKICAgICAgICAgICAgaWYgKCBJc1Bvc2l0aXZlSW50ZWdlciggJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gKSApIHsKCiAgICAgICAgICAgICAgICBteSAkVGVtcGxhdGVHZW5lcmF0b3IgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGVtcGxhdGVHZW5lcmF0b3InKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0ZW1wbGF0ZSB0ZXh0LCByZXBsYWNlIHNtYXJ0IHRhZ3MgKGxpbWl0ZWQgYXMgdGlja2V0IGlzIG5vdCBjcmVhdGVkKQogICAgICAgICAgICAgICAgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvci0+VGVtcGxhdGUoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCAgICAgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIFN0ZEF0dGFjaG1lbnRPYmplY3QKICAgICAgICAgICAgICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBzdGQuIGF0dGFjaG1lbnRzIHRvIHRpY2tldAogICAgICAgICAgICAgICAgbXkgJUFsbFN0ZEF0dGFjaG1lbnRzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgZm9yICggc29ydCBrZXlzICVBbGxTdGRBdHRhY2htZW50cyApIHsKICAgICAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNEYXRhID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRHZXQoIElEID0+ICRfICk7CiAgICAgICAgICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERpc3Bvc2l0aW9uID0+ICdhdHRhY2htZW50JywKICAgICAgICAgICAgICAgICAgICAgICAgJUF0dGFjaG1lbnRzRGF0YSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VuZCBhIGxpc3Qgb2YgYXR0YWNobWVudHMgaW4gdGhlIHVwbG9hZCBjYWNoZSBiYWNrIHRvIHRoZSBjbGllbnRzaWRlIEphdmFTY3JpcHQKICAgICAgICAgICAgICAgICMgd2hpY2ggcmVuZGVycyB0aGVuIHRoZSBsaXN0IG9mIGN1cnJlbnRseSB1cGxvYWRlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgQFRpY2tldEF0dGFjaG1lbnRzID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAVGlja2V0QXR0YWNobWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSA9ICRMYXlvdXRPYmplY3QtPkh1bWFuUmVhZGFibGVEYXRhU2l6ZSgKICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQXR0YWNobWVudC0+e0ZpbGVzaXplfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBAVGVtcGxhdGVBSkFYID0gKAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1VzZVRlbXBsYXRlQ3JlYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICcwJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJFRlbXBsYXRlVGV4dCB8fCAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1RpY2tldEF0dGFjaG1lbnRzJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcQFRpY2tldEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgICAgIEtlZXBEYXRhID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgICAgIG15ICRKU09OID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICBAU3RkRmllbGRBSkFYLAogICAgICAgICAgICAgICAgQER5bmFtaWNGaWVsZEFKQVgsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgIEBUZW1wbGF0ZUFKQVgsCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgICBlbmQgQUpBWCBVcGRhdGUKCiAgICAjIHNhdmUsIGlmIGJyb3dzZXIgbGluayBtZXNzYWdlIHdhcyBjbG9zZWQKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdCcm93c2VyTGlua01lc3NhZ2UnICkgewoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJDdXN0b21lckRvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZScsCiAgICAgICAgICAgIFZhbHVlICA9PiAxLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gMSwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGZvbGxvdyB1cAogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgaWYgKCAhJEFjbEFjdGlvbkxvb2t1cHtDdXN0b21lclRpY2tldFpvb21SZXBseX0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwoKICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRTZWxmLT57TmV4dFNjcmVlbn0gfHwgJENvbmZpZy0+e05leHRTY3JlZW5BZnRlckZvbGxvd1VwfTsKICAgICAgICBteSAlRXJyb3I7CgogICAgICAgICMgZ2V0IGZvbGxvdyB1cCBvcHRpb24gKHBvc3NpYmxlIG9yIG5vdCkKICAgICAgICBteSAkUXVldWVPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpOwogICAgICAgIG15ICRGb2xsb3dVcFBvc3NpYmxlID0gJFF1ZXVlT2JqZWN0LT5HZXRGb2xsb3dVcE9wdGlvbigKICAgICAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGxvY2sgb3B0aW9uIChzaG91bGQgYmUgdGhlIHRpY2tldCBsb2NrZWQgLSBpZiBjbG9zZWQgLSBhZnRlciB0aGUgZm9sbG93IHVwKQogICAgICAgIG15ICRMb2NrID0gJFF1ZXVlT2JqZWN0LT5HZXRGb2xsb3dVcExvY2tPcHRpb24oCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICBteSAkU3RhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKTsKCiAgICAgICAgIyBnZXQgdGlja2V0IHN0YXRlIGRldGFpbHMKICAgICAgICBteSAlU3RhdGUgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkVGlja2V0e1N0YXRlSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkRm9sbG93VXBQb3NzaWJsZSA9fiAvKG5ldyB0aWNrZXR8cmVqZWN0KS9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJXYXJuaW5nKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCByZW9wZW4gdGlja2V0LCBub3QgcG9zc2libGUgaW4gdGhpcyBxdWV1ZSEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdDcmVhdGUgYSBuZXcgdGlja2V0IScpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgICAgICBpZiAoICRHZXRQYXJhbXtCb2R5fSAmJiAhJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPldyYXBQbGFpblRleHQoCiAgICAgICAgICAgICAgICBNYXhDaGFyYWN0ZXJzID0+ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyksCiAgICAgICAgICAgICAgICBQbGFpblRleHQgICAgID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgICAgIGlmICggJEdldFBhcmFte0Zyb21DaGF0fSApIHsKICAgICAgICAgICAgJEVycm9ye0Zyb21DaGF0fSAgICAgICAgICAgPSAxOwogICAgICAgICAgICAkR2V0UGFyYW17Rm9sbG93VXBWaXNpYmxlfSA9ICdWaXNpYmxlJzsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RnJvbUNoYXRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSBAQ2hhdE1lc3NhZ2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXQnKS0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICAgICAgICAgIENoYXRJRCA9PiAkR2V0UGFyYW17RnJvbUNoYXRJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKEBDaGF0TWVzc2FnZXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1lc3NhZ2UgKEBDaGF0TWVzc2FnZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCAgICAgICAgPT4gJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rRmVhdHVyZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q2hhdE1lc3NhZ2VzfSA9IFxAQ2hhdE1lc3NhZ2VzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkR2V0UGFyYW17RnJvbUNoYXR9ICkgewogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gfHwgJEdldFBhcmFte0JvZHl9IGVxICc8YnIgLz4nICkgewogICAgICAgICAgICAgICAgJEVycm9ye1JpY2hUZXh0SW52YWxpZH0gICAgPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0ZvbGxvd1VwVmlzaWJsZX0gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2tpcCB2YWxpZGF0aW9uIG9mIGhpZGRlbiBmaWVsZHMKICAgICAgICBteSAlVmlzaWJpbGl0eTsKCiAgICAgICAgIyB0cmFuc2Zvcm0gZHluYW1pYyBmaWVsZCBkYXRhIGludG8gREZOYW1lID0+IERGTmFtZSBwYWlyCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFjbCA9IG1hcCB7ICRfID0+ICRfIH0ga2V5cyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSo7CgogICAgICAgICMgY2FsbCB0aWNrZXQgQUNMcyBmb3IgRHluYW1pY0ZpZWxkcyB0byBjaGVjayBmaWVsZCB2aXNpYmlsaXR5CiAgICAgICAgbXkgJEFDTFJlc3VsdCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgUmV0dXJuVHlwZSAgICAgPT4gJ0Zvcm0nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlICA9PiAnLScsCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlRHluYW1pY0ZpZWxkQWNsLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICApOwogICAgICAgIGlmICgkQUNMUmVzdWx0KSB7CiAgICAgICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMCB9IGtleXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgICAgICBteSAlQWNsRGF0YSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRmllbGQgfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8gPT4gMSB9IGtleXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBkeW5hbWljIGZpZWxkIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVycm9uZW91cwogICAgICAgIG15ICVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0OwogICAgICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IFBvc3NpYmxlVmFsdWVzCiAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZmllbGQgaGFzIFBvc3NpYmxlVmFsdWVzIHByb3BlcnR5IGluIGl0cyBjb25maWd1cmF0aW9uCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRQb3NzaWJsZVZhbHVlcykgKSB7CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyRQb3NzaWJsZVZhbHVlc307CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkQUNMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVGaWx0ZXIgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJFBvc3NpYmxlVmFsdWVzLT57JF99IH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXMgJUZpbHRlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgICAgICMgZG8gbm90IHZhbGlkYXRlIGludmlzaWJsZSBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkVmlzaWJpbGl0eXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsaWRhdGlvblJlc3VsdCA9ICRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gJFBvc3NpYmxlVmFsdWVzRmlsdGVyLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAgICAgIyBNYW5kYXRvcnkgaXMgYWRkZWQgdG8gdGhlIGNvbmZpZ3MgYnkgJFNlbGYtPm5ldwogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TWFuZGF0b3J5fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFZhbGlkYXRpb25SZXN1bHQpICkgewogICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJXMhJywgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcHJvcGFnYXRlIHZhbGlkYXRpb24gZXJyb3IgdG8gdGhlIEVycm9yIHZhcmlhYmxlIHRvIGJlIGRldGVjdGVkIGJ5IHRoZSBmcm9udGVuZAogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICAgICAgICAgICAgICAgICAgICAgICAgPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKCiAgICAgICAgICAgICAgICAgICAgIyBtYWtlIEZvbGxvd1VwIHZpc2libGUgdG8gY29ycmVjdGx5IHNob3cgdGhlIGVycm9yCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0ZvbGxvd1VwVmlzaWJsZX0gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAjIHNob3cgZWRpdCBhZ2FpbgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrKAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICA9PiBcJUVycm9yLAogICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgIFRpY2tldFN0YXRlICAgPT4gJFRpY2tldHtTdGF0ZX0sCiAgICAgICAgICAgICAgICBUaWNrZXRTdGF0ZUlEID0+ICRUaWNrZXR7U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBWaXNpYmlsaXR5ICAgICAgID0+IFwlVmlzaWJpbGl0eSwKICAgICAgICAgICAgICAgIERGUG9zc2libGVWYWx1ZXMgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgIERGRXJyb3JzICAgICAgICAgPT4gXCVEeW5hbWljRmllbGRWYWxpZGF0aW9uUmVzdWx0LAogICAgICAgICAgICAgICAgUmVwbHkgICAgICAgICAgICA9PiAkQWNsQWN0aW9uTG9va3Vwe0N1c3RvbWVyVGlja2V0Wm9vbVJlcGx5fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHVubG9jayB0aWNrZXQgaWYgYWdlbnQgaXMgb24gdmFjYXRpb24gb3IgaW52YWxpZAogICAgICAgIG15ICRMb2NrQWN0aW9uOwogICAgICAgIGlmICggJFRpY2tldHtPd25lcklEfSApIHsKICAgICAgICAgICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICVVc2VyICYmICggJFVzZXJ7T3V0T2ZPZmZpY2VNZXNzYWdlfSB8fCAkVXNlcntWYWxpZElEfSBuZSAnMScgKSApIHsKICAgICAgICAgICAgICAgICRMb2NrQWN0aW9uID0gJ3VubG9jayc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IGxvY2sgaWYgdGlja2V0IHdhcyBjbG9zZWQKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkTG9ja0FjdGlvbgogICAgICAgICAgICAmJiAkTG9jawogICAgICAgICAgICAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSAmJiAkVGlja2V0e093bmVySUR9IG5lICcxJwogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgJExvY2tBY3Rpb24gPSAnbG9jayc7CiAgICAgICAgfQoKICAgICAgICBpZiAoJExvY2tBY3Rpb24pIHsKICAgICAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgTG9jayAgICAgPT4gJExvY2tBY3Rpb24sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRGcm9tICAgICA9ICJcIiRTZWxmLT57VXNlckZ1bGxuYW1lfVwiIDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICBteSAkTWltZVR5cGUgPSAndGV4dC9wbGFpbic7CiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIG15ICROZXh0U3RhdGUgPSAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSB8fCAnb3Blbic7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17U3RhdGVJRH0gJiYgJENvbmZpZy0+e1N0YXRlfSApIHsKICAgICAgICAgICAgbXkgJU5leHRTdGF0ZURhdGEgPSAkU3RhdGVPYmplY3QtPlN0YXRlR2V0KCBJRCA9PiAkR2V0UGFyYW17U3RhdGVJRH0gKTsKICAgICAgICAgICAgJE5leHRTdGF0ZSA9ICROZXh0U3RhdGVEYXRhe05hbWV9OwogICAgICAgIH0KCiAgICAgICAgIyBjaGFuZ2Ugc3RhdGUgaWYKICAgICAgICAjIGN1c3RvbWVyIHNldCBhbm90aGVyIHN0YXRlCiAgICAgICAgIyBvciB0aGUgdGlja2V0IGlzIG5vdCBuZXcKICAgICAgICBpZiAoICRUaWNrZXR7U3RhdGVUeXBlfSAhfiAvXm5ldy8gfHwgJEdldFBhcmFte1N0YXRlSUR9ICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5TdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGUgICAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgdW5sb2NrIG9uIGNsb3NlIHN0YXRlCiAgICAgICAgICAgIGlmICggJE5leHRTdGF0ZSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRDb25maWctPntQcmlvcml0eX0gJiYgJEdldFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkVGlja2V0T2JqZWN0LT5UaWNrZXRQcmlvcml0eVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZTo6QmFja2VuZDo6SW50ZXJuYWwnKS0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICRDb25maWctPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgIFN1YmplY3QgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICBNaW1lVHlwZSAgICAgICAgICAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICBPcmlnSGVhZGVyICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBGcm9tICAgID0+ICRGcm9tLAogICAgICAgICAgICAgICAgVG8gICAgICA9PiAnU3lzdGVtJywKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgID0+ICRDb25maWctPntIaXN0b3J5VHlwZX0sCiAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgPT4gJENvbmZpZy0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAogICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICggJENvbmZpZ09iamVjdC0+R2V0KCdBdXRvUmVzcG9uc2VGb3JXZWJUaWNrZXRzJykgKSA/ICdhdXRvIGZvbGxvdyB1cCcgOiAnJywKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgbXkgQEF0dGFjaG1lbnREYXRhID0gJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0KICAgICAgICApOwoKICAgICAgICAjIGdldCBzdWJtaXQgYXR0YWNobWVudAogICAgICAgIG15ICVVcGxvYWRTdHVmZiA9ICRQYXJhbU9iamVjdC0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSA9PiAnZmlsZV91cGxvYWQnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnREYXRhKSB7CgogICAgICAgICAgICBteSAkQ29udGVudElEID0gJEF0dGFjaG1lbnQtPntDb250ZW50SUR9OwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAmJiAoICRBdHRhY2htZW50LT57Q29udGVudFR5cGV9ID1+IC9pbWFnZS9pICkKICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntEaXNwb3NpdGlvbn0gZXEgJ2lubGluZScgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudElESFRNTFF1b3RlID0gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgd29ya2Fyb3VuZCBmb3IgbGluayBlbmNvZGUgb2YgcmljaCB0ZXh0IGVkaXRvciwgc2VlIGJ1ZyM1MDUzCiAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPX4gcy8oQ29udGVudElEPSkkQ29udGVudElETGlua0VuY29kZS8kMSRDb250ZW50SUQvZzsKCiAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEFUVEFDSE1FTlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgd3JpdGUgZXhpc3RpbmcgZmlsZSB0byBiYWNrZW5kCiAgICAgICAgICAgICRBcnRpY2xlQmFja2VuZE9iamVjdC0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZpc2liaWxpdHl7IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e1JlYWRvbmx5fTsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gbmUgJ0FydGljbGUnOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJFZpc2liaWxpdHl7IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e1JlYWRvbmx5fTsKCiAgICAgICAgICAgICMgc2V0IHRoZSB2YWx1ZQogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHVzZXIgY2xpY2tlZCBzdWJtaXQgb24gdGhlIG1haW4gc2NyZWVuCiAgICAgICAgIyBzdG9yZSBhbHNvIGNoYXQgcHJvdG9jb2wKICAgICAgICBpZiAoICEkR2V0UGFyYW17RnJvbUNoYXR9ICYmICRHZXRQYXJhbXtGcm9tQ2hhdElEfSApIHsKICAgICAgICAgICAgbXkgJENoYXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGF0Jyk7CiAgICAgICAgICAgIG15IEBDaGF0TWVzc2FnZUxpc3QgPSAkQ2hhdE9iamVjdC0+Q2hhdE1lc3NhZ2VMaXN0KAogICAgICAgICAgICAgICAgQ2hhdElEID0+ICRHZXRQYXJhbXtGcm9tQ2hhdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENoYXRBcnRpY2xlSUQ7CgogICAgICAgICAgICBpZiAoQENoYXRNZXNzYWdlTGlzdCkgewogICAgICAgICAgICAgICAgZm9yIG15ICRNZXNzYWdlIChAQ2hhdE1lc3NhZ2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgJE1lc3NhZ2UtPntNZXNzYWdlVGV4dH0gPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ICAgICAgICA9PiAkTWVzc2FnZS0+e01lc3NhZ2VUZXh0fSwKICAgICAgICAgICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRBcnRpY2xlQ2hhdEJhY2tlbmQgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckNoYW5uZWwoIENoYW5uZWxOYW1lID0+ICdDaGF0JyApOwoKICAgICAgICAgICAgICAgICRDaGF0QXJ0aWNsZUlEID0gJEFydGljbGVDaGF0QmFja2VuZC0+QXJ0aWNsZUNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBTZW5kZXJUeXBlICAgICAgICAgICA9PiAkQ29uZmlnLT57U2VuZGVyVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgQ2hhdE1lc3NhZ2VMaXN0ICAgICAgPT4gXEBDaGF0TWVzc2FnZUxpc3QsCiAgICAgICAgICAgICAgICAgICAgSXNWaXNpYmxlRm9yQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAkQ29uZmlnLT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgICAgIEhpc3RvcnlDb21tZW50ICAgICAgID0+ICRDb25maWctPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRDaGF0QXJ0aWNsZUlEKSB7CiAgICAgICAgICAgICAgICAkQ2hhdE9iamVjdC0+Q2hhdERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBDaGF0SUQgPT4gJEdldFBhcmFte0Zyb21DaGF0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZW1vdmUgYWxsIGZvcm0gZGF0YQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OkZvcm1DYWNoZScpLT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyBkZWxldGUgaGlkZGVuIGZpZWxkcyBjYWNoZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgICAgIFR5cGUgPT4gJ0hpZGRlbkZpZWxkcycsCiAgICAgICAgICAgIEtleSAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgcmVkaXJlY3QgdG8gem9vbSB2aWV3CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSROZXh0U2NyZWVuO1RpY2tldElEPSRTZWxmLT57VGlja2V0SUR9IiwKICAgICAgICApOwogICAgfQoKICAgICRUaWNrZXR7VG1wQ291bnRlcn0gICAgICA9IDA7CiAgICAkVGlja2V0e1RpY2tldFRpbWVVbml0c30gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNldCBwcmlvcml0eSBmcm9tIHRpY2tldCBhcyBmYWxsYmFjawogICAgJEdldFBhcmFte1ByaW9yaXR5SUR9IHx8PSAkVGlja2V0e1ByaW9yaXR5SUR9OwoKICAgICMgc2V0IGluaXRpYWwgc3RhdGUKICAgIGlmICggJENvbmZpZy0+e1N0YXRlfSAmJiAkQ29uZmlnLT57U3RhdGVQcmVzZXR9ICkgewogICAgICAgIG15ICVOZXh0U3RhdGVzID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+IHVuZGVmLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5leHRTdGF0ZXN7ICRDb25maWctPntTdGF0ZVByZXNldH0gfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte05leHRTdGF0ZUlEfSA9ICROZXh0U3RhdGVzeyAkQ29uZmlnLT57U3RhdGVQcmVzZXR9IH07CiAgICAgICAgfQogICAgfQogICAgJEdldFBhcmFte05leHRTdGF0ZUlEfSB8fD0gJEdldFBhcmFte1N0YXRlSUR9IHx8ICRUaWNrZXR7U3RhdGVJRH07CgogICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57VXNlcklEfTsKCiAgICAjIEdldCB2YWx1ZXMgZm9yIFRpY2tldCBmaWVsZHMgYW5kIHVzZSBkZWZhdWx0IHZhbHVlIGZvciBBcnRpY2xlIGZpZWxkcywgaWYgZ2l2ZW4gKHRoaXMKICAgICMgc2NyZWVuIGdlbmVyYXRlcyBhIG5ldyBhcnRpY2xlLCB0aGVuIGFydGljbGUgZmllbGRzIHdpbGwgYmUgYWx3YXlzIGRlZmF1bHQgdmFsdWUgb3IKICAgICMgZW1wdHkgYXQgdGhlIGJlZ2lubmluZykuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgIGlmICggJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnICkgewoKICAgICAgICAgICAgIyBWYWx1ZSBpcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlIGZyb20gVGlja2V0LgogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e0RlZmF1bHRWYWx1ZX0gfHwgJyc7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkZpZWxkUmVzdHJpY3Rpb25zJyk7CiAgICBteSAkQXV0b3NlbGVjdCAgICAgICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyBpZiB0ZW1wbGF0ZXMgc2hvdWxkIGJlIGF1dG9zZWxlY3RlZCwgYXV0b21hdGljYWxseSBoaWRlIHRoZW0KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclRlbXBsYXRlOjpBdXRvc2VsZWN0JykgKSB7CiAgICAgICAgJEF1dG9zZWxlY3QtPntTdGFuZGFyZFRlbXBsYXRlSUR9ID0gMjsKICAgIH0KIyBFTyBDdXN0b21lclRlbXBsYXRlCgogICAgIyBnYXRoZXIgZmllbGRzIHdoaWNoIGFyZSBzdXBwb3NlZCB0byBiZSBoaWRkZW4gd2hlbiBhdXRvc2VsZWN0ZWQKICAgIG15ICRIaWRlQXV0b3NlbGVjdGVkSlNPTjsKICAgIGlmICgkQXV0b3NlbGVjdCkgewogICAgICAgIG15IEBIaWRlQXV0b3NlbGVjdGVkID0gZ3JlcCB7ICFyZWYoICRBdXRvc2VsZWN0LT57JF99ICkgJiYgJEF1dG9zZWxlY3QtPnskX30gPT0gMiB9IGtleXMgJXskQXV0b3NlbGVjdH07CiAgICAgICAgaWYgKCAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBtYXAgeyAiRHluYW1pY0ZpZWxkXyIgLiAkXyB9CiAgICAgICAgICAgICAgICAoIGdyZXAgeyAkQXV0b3NlbGVjdC0+e0R5bmFtaWNGaWVsZH17JF99ID09IDIgfSBrZXlzICV7ICRBdXRvc2VsZWN0LT57RHluYW1pY0ZpZWxkfSB9ICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQEhpZGVBdXRvc2VsZWN0ZWQpIHsKICAgICAgICAgICAgbXkgJEpTT05PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SlNPTicpOwogICAgICAgICAgICAkSGlkZUF1dG9zZWxlY3RlZEpTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcQEhpZGVBdXRvc2VsZWN0ZWQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdHJhY2sgY2hhbmdpbmcgc3RhbmRhcmQgZmllbGRzCiAgICBteSAkQUNMUHJlc2VsZWN0aW9uOwogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICMgZ2V0IGNhY2hlZCBwcmVzZWxlY3Rpb24gcnVsZXMKICAgICAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJ1RpY2tldEFDTCcsCiAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ29udmVyZ2VuY2UgPSAoCiAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgRmllbGRzICAgID0+IDAsCiAgICApOwogICAgbXkgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAoKTsKICAgIG15ICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKCk7CiAgICBteSAlQ2hhbmdlZFN0ZEZpZWxkczsKCiAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CiAgICBteSAlU3RkRmllbGRWYWx1ZXM7CiAgICBteSAlRHluRmllbGRTdGF0ZXMgPSAoCiAgICAgICAgVmlzaWJpbGl0eSA9PiB7fSwKICAgICAgICBGaWVsZHMgICAgID0+IHt9LAogICAgKTsKCiAgICBteSAkSW5pdGlhbFJ1biA9IDE7CgogICAgdW50aWwgKCAkQ29udmVyZ2VuY2V7RmllbGRzfSApIHsKCiAgICAgICAgIyBkZXRlcm1pbmUgc3RhbmRhcmQgZmllbGQgaW5wdXQKICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgbXkgJU5ld0NoYW5nZWRFbGVtZW50czsKCiAgICAgICAgICAgICMgd2hpY2ggc3RhbmRhcmQgZmllbGRzIHRvIGNoZWNrIC0gRmllbGRJRCA9PiBHZXRQYXJhbVZhbHVlIChuZWNlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgIG15ICVDaGVjayA9ICgKICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICA9PiAnUHJpb3JpdHlJRCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKICAgICAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAnU3RhbmRhcmRUZW1wbGF0ZUlEJywKIyBFTyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEFDTFByZXNlbGVjdGlvbiAmJiAhJEluaXRpYWxSdW4gKSB7CiAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGRJRCAoIHNvcnQga2V5cyAlQ2hlY2sgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbi0+e0ZpZWxkc317JEZpZWxkSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpZWxkSUQgbm90IGRlZmluZWQgaW4gVGlja2V0QUNMIHByZXNlbGVjdGlvbiBydWxlcyEiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRklFTEQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uLT57UnVsZXN9e1RpY2tldH17JEVsZW1lbnR9eyRGaWVsZElEfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRWxlbWVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRWxlbWVudCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB1bmFmZmVjdGVkIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkQ2hlY2t7JEZpZWxkSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZvciBlYWNoIHN0YW5kYXJkIGZpZWxkIHdoaWNoIGhhcyB0byBiZSBjaGVja2VkLCBydW4gdGhlIGRlZmluZWQgbWV0aG9kCiAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7ICRTZWxmLT57RmllbGRNZXRob2RzfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBNRVRIT0QgaWYgISRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfTsKCiAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3sgJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9IH0gPSAkRmllbGQtPntNZXRob2R9LT4oCiAgICAgICAgICAgICAgICAgICAgJFNlbGYsCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzcGVjaWFsIHN0dWZmIGZvciBRdWV1ZUlEL0Rlc3Q6IERlc3QgaXMgIlF1ZXVlSUR8fFF1ZXVlTmFtZSIgPT4gIlF1ZXVlTmFtZSI7CiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICBUT3M6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRRdWV1ZUlEICggc29ydCBrZXlzICV7ICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRTdGRGaWVsZFZhbHVlc3tEZXN0fXsiJFF1ZXVlSUR8fCRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXsgJFF1ZXVlSUQgfSJ9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgY3VycmVudCBzZWxlY3Rpb24gb2YgUXVldWVJRCAoRGVzdCB3aWxsIGJlIGRvbmUgdG9nZXRoZXIgd2l0aCB0aGUgb3RoZXIgZmllbGRzKQogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtRdWV1ZUlEfSAmJiAkQXV0b3NlbGVjdCAmJiAkQXV0b3NlbGVjdC0+e0Rlc3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hldGhlciBjdXJyZW50IHNlbGVjdGVkIHZhbHVlIGlzIHN0aWxsIHZhbGlkIGZvciB0aGUgZmllbGQKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAmJiAhJFN0ZEZpZWxkVmFsdWVzeyAkRmllbGQtPntGaWVsZElEfSB9eyAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAjIGlmIG5vdCBlbXB0eSB0aGUgZmllbGQKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnsgJEZpZWxkLT57RmllbGRJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPkF1dG9zZWxlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgJENoYW5nZWRTdGRGaWVsZHN7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gICA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICElTmV3Q2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVDaGFuZ2VkRWxlbWVudHNERlN0YXJ0ID0gKAogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAlTmV3Q2hhbmdlZEVsZW1lbnRzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFRPRE86IGlzIHJldHVybmluZyBhbiBlbXB0eSBsaXN0IHJlYXNvbmFibGU/CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICVDaGFuZ2VkRWxlbWVudHMgICAgICAgID0gJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQ7CiAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgIyBjaGVjayBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVDdXJGaWVsZFN0YXRlczsKICAgICAgICBpZiAoICVDaGFuZ2VkRWxlbWVudHMgfHwgJEluaXRpYWxSdW4gKSB7CgogICAgICAgICAgICAjIGdldCB2YWx1ZXMgYW5kIHZpc2liaWxpdHkgb2YgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgIFRpY2tldE9iamVjdCAgICAgICAgICAgICAgPT4gJFRpY2tldE9iamVjdCwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICAgICAgQ2hhbmdlZEVsZW1lbnRzICAgICAgICAgICA9PiBcJUNoYW5nZWRFbGVtZW50cywgICAgICAgICAgICAgICAjIG9wdGlvbmFsIHRvIHJlZHVjZSBBQ0wgZXZhbHVhdGlvbgogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEdldFBhcmFtICAgICAgICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICAgICAgICAgICAgPT4gJEF1dG9zZWxlY3QsCiAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNvbWJpbmUgRmllbGRTdGF0ZXMKICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gPSB7CiAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze0ZpZWxkc30gfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9IH0sCiAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gfSwKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICMgc3RvcmUgbmV3IHZhbHVlcwogICAgICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAleyAkQ3VyRmllbGRTdGF0ZXN7TmV3VmFsdWVzfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICBpZiAoICVDdXJGaWVsZFN0YXRlcyAmJiBJc0hhc2hSZWZXaXRoRGF0YSggJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gKSApIHsKICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAwOwogICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICB9CgogICAgICAgICRJbml0aWFsUnVuID0gMDsKICAgIH0KCiAgICAjIHJlbWVtYmVyIGR5bmFtaWMgZmllbGQgdmFsaWRhdGlvbiByZXN1bHQgaWYgZXJyb25lb3VzCiAgICBteSAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgewogICAgICAgICdEeW5hbWljRmllbGRfJyAuICRfID0+IGRlZmluZWQgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99CiAgICAgICAgICAgID8gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JF99e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICA6IHVuZGVmCiAgICB9ICgga2V5cyAkU2VsZi0+e0ZvbGxvd1VwRHluYW1pY0ZpZWxkfS0+JSogKTsKCiAgICAjIHJldHVybiBvdXRwdXQKICAgIHJldHVybiBqb2luICcnLAogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKSwKICAgICAgICAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIEFydGljbGVCb3ggPT4gXEBBcnRpY2xlQm94LAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICBUaWNrZXRTdGF0ZSAgID0+ICRUaWNrZXR7U3RhdGV9LAogICAgICAgICAgICBUaWNrZXRTdGF0ZUlEID0+ICRUaWNrZXR7U3RhdGVJRH0sCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgVGlja2V0U3RhdGVJRCAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwgICAgICAgICAgICAgICAgICAgICAgIyBUT0RPOiBjaGVjayB3aGV0aGVyIHRoaXMgcmlnaHQKICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgIEhpZGVBdXRvc2VsZWN0ZWQgID0+ICRIaWRlQXV0b3NlbGVjdGVkSlNPTiwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICBBY3Rpdml0eUVycm9ySFRNTCA9PiBcJUFjdGl2aXR5RXJyb3JIVE1MLAogICAgICAgICAgICBERlBvc3NpYmxlVmFsdWVzICA9PiBcJUR5bmFtaWNGaWVsZFBvc3NpYmxlVmFsdWVzLAogICAgICAgICAgICBSZXBseSAgICAgICAgICAgICA9PiAkQWNsQWN0aW9uTG9va3Vwe0N1c3RvbWVyVGlja2V0Wm9vbVJlcGx5fSwKICAgICAgICApLAogICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTmF2aWdhdGlvbkJhciwKICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcjsKfQoKc3ViIF9HZXROZXh0U3RhdGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKCiAgICAgICAgICAgICMgJVBhcmFtIGNvdWxkIGNvbnRhaW4gVGlja2V0IFR5cGUgYXMgb25seSBUeXBlLCBpdCBzaG91bGQgbm90IGJlIHNlbnQKICAgICAgICAgICAgVHlwZSA9PiB1bmRlZiwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVQcmlvcml0aWVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRQcmlvcml0eUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfTWFzayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRVcGxvYWRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlJyk7CgogICAgbXkgJUFjbEFjdGlvbkxvb2t1cDsKICAgIGlmICggJFBhcmFte0FjbEFjdGlvbn0gKSB7CiAgICAgICAgJUFjbEFjdGlvbkxvb2t1cCA9IHJldmVyc2UgJXsgJFBhcmFte0FjbEFjdGlvbn0gfTsKICAgIH0KCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgc2hvdyBiYWNrIGxpbmsKICAgIGlmICggJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCYWNrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApIHx8ICcnOwogICAgbXkgQEFydGljbGVCb3ggICAgICAgID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CgogICAgIyBwcmVwYXJlIGVycm9ycyEKICAgIGlmICggJFBhcmFte0Vycm9yc30gKSB7CiAgICAgICAgZm9yIG15ICRLZXlFcnJvciAoIHNvcnQga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEtleUVycm9yfSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBcnRpY2xlSUQgICAgICAgICAgID0gJyc7CiAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZSA9ICcnOwogICAgaWYgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgICAgIG15ICRDb3VudGVyQXJyYXkgPSAwOwogICAgICAgIG15ICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQ7CiAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgPSAkI0FydGljbGVCb3g7CgogICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgICAgICMgaWYgaXQgaXMgYSBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgICAgIGlmICggJEFydGljbGV7U2VuZGVyVHlwZX0gZXEgJ2N1c3RvbWVyJyApIHsKICAgICAgICAgICAgICAgICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQgPSAkQXJ0aWNsZXtBcnRpY2xlSUR9OwogICAgICAgICAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgICA9ICRDb3VudGVyQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50ZXJBcnJheSsrOwogICAgICAgICAgICBpZiAoICgkU2VsZWN0ZWRBcnRpY2xlSUQpICYmICggJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZXtBcnRpY2xlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBub24gaW50ZXJuYWwgYWdlbnQgYXJ0aWNsZQogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgICAgICAgICA9ICRBcnRpY2xlQm94Wy0xXS0+e0FydGljbGVJRH07CiAgICAgICAgICAgICRTZWxlY3RlZEFydGljbGVJRCA9ICRBcnRpY2xlSUQ7CiAgICAgICAgfQoKICAgICAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgaWYgKCAhJEFydGljbGVJRCAmJiAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEICkgewogICAgICAgICAgICAkQXJ0aWNsZUlEICAgICAgICAgPSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgICAgICAgICAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkQXJ0aWNsZUlEOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHNldCBkaXNwbGF5IG9wdGlvbnMKICAgICRQYXJhbXtIb29rfSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpIb29rJykgfHwgJ1RpY2tldCMnOwoKICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgdGlja2V0IGFjY291bnRlZCB0aW1lCiAgICBpZiAoICRDb25maWctPntab29tVGltZURpc3BsYXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBwcmlvcml0eSBmbGFnCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntQcmlvcml0eX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW9yaXR5RmxhZycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVuZGVyIHRpY2tldCBpbmZvIGhlYWQgZGVwZW5kaW5nIG9uIHN5c2NvbmZpZyBzZXR0aW5nCiAgICBpZiAoICRDb25maWctPntUaWNrZXRJbmZvRGlzcGxheVR5cGV9IGVxICdIZWFkZXInICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJJbmZvJywKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHR5cGUKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57VHlwZX0gKSB7CgogICAgICAgIG15ICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlR5cGUnKS0+VHlwZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFZhbGlkID0+ICRUeXBle1ZhbGlkSUR9LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1NlcnZpY2V9CiAgICAgICAgJiYKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgJiYgJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1NlcnZpY2V9CiAgICAgICAgKQogICAgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17U0xBfQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICYmICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntTTEF9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgc3RhdGUKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e1N0YXRlfSApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhdGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBwcmlvcml0eQogICAgaWYgKCAkQ29uZmlnLT57QXR0cmlidXRlc1ZpZXd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHF1ZXVlCiAgICBpZiAoICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntRdWV1ZX0gKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFnZW50VXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyB0aWNrZXQgb3duZXIKICAgIGlmICggJENvbmZpZy0+e0F0dHJpYnV0ZXNWaWV3fS0+e093bmVyfSApIHsKICAgICAgICBteSAkT3duZXJOYW1lID0gJEFnZW50VXNlck9iamVjdC0+VXNlck5hbWUoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17T3duZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXInLAogICAgICAgICAgICBEYXRhID0+IHsgT3duZXJOYW1lID0+ICRPd25lck5hbWUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHJlc3BvbnNpYmxlCiAgICBpZiAoCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJgogICAgICAgICRDb25maWctPntBdHRyaWJ1dGVzVmlld30tPntSZXNwb25zaWJsZX0KICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlTmFtZSA9ICRBZ2VudFVzZXJPYmplY3QtPlVzZXJOYW1lKAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZU5hbWUgPT4gJFJlc3BvbnNpYmxlTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBjaGVjayBpZiB0aWNrZXQgaXMgbm9ybWFsIG9yIHByb2Nlc3MgdGlja2V0CiAgICBteSAkSXNQcm9jZXNzVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0Q2hlY2tGb3JQcm9jZXNzVHlwZSgKICAgICAgICAnVGlja2V0SUQnID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNob3cgcHJvY2VzcyB3aWRnZXQgIGFuZCBhY3Rpdml0eSBkaWFsb2dzIG9uIHByb2Nlc3MgdGlja2V0cwogICAgaWYgKCRJc1Byb2Nlc3NUaWNrZXQpIHsKCiAgICAgICAgIyBnZXQgdGhlIERGIHdoZXJlIHRoZSBQcm9jZXNzRW50aXR5SUQgaXMgc3RvcmVkCiAgICAgICAgbXkgJFByb2Nlc3NFbnRpdHlJREZpZWxkID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudFByb2Nlc3NJRCIpOwoKICAgICAgICAjIGdldCB0aGUgREYgd2hlcmUgdGhlIEF0aXZpdHlFbnRpdHlJRCBpcyBzdG9yZWQKICAgICAgICBteSAkQWN0aXZpdHlFbnRpdHlJREZpZWxkID0gJ0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgIC4gJENvbmZpZ09iamVjdC0+R2V0KCJQcm9jZXNzOjpEeW5hbWljRmllbGRQcm9jZXNzTWFuYWdlbWVudEFjdGl2aXR5SUQiKTsKCiAgICAgICAgIyBjcmVhdGUgYWRkaXRpb25hbCBvYmplY3RzIGZvciBwcm9jZXNzIG1hbmFnZW1lbnQKICAgICAgICBteSAkQWN0aXZpdHlPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UHJvY2Vzc01hbmFnZW1lbnQ6OkFjdGl2aXR5Jyk7CiAgICAgICAgbXkgJEFjdGl2aXR5RGlhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlByb2Nlc3NNYW5hZ2VtZW50OjpBY3Rpdml0eURpYWxvZycpOwogICAgICAgIG15ICRBY3Rpdml0eURhdGEgICAgICAgICA9ICRBY3Rpdml0eU9iamVjdC0+QWN0aXZpdHlHZXQoCiAgICAgICAgICAgIEludGVyZmFjZSAgICAgICAgPT4gJ0N1c3RvbWVySW50ZXJmYWNlJywKICAgICAgICAgICAgQWN0aXZpdHlFbnRpdHlJRCA9PiAkUGFyYW17JEFjdGl2aXR5RW50aXR5SURGaWVsZH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGhlIHByb2Nlc3Mgd2lkZ2V0IG9uIHRoZSBtYWluIHNjcmVlbgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcm9jZXNzV2lkZ2V0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBXaWRnZXRUaXRsZSA9PiAkUGFyYW17V2lkZ2V0VGl0bGV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IG5leHQgYWN0aXZpdHkgZGlhbG9ncwogICAgICAgIG15ICROZXh0QWN0aXZpdHlEaWFsb2dzOwogICAgICAgIGlmICgKICAgICAgICAgICAgJFBhcmFteyRBY3Rpdml0eUVudGl0eUlERmllbGR9CiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCRBY3Rpdml0eURhdGEpCiAgICAgICAgICAgICYmIElzSGFzaFJlZldpdGhEYXRhKCAkQWN0aXZpdHlEYXRhLT57QWN0aXZpdHlEaWFsb2d9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJE5leHRBY3Rpdml0eURpYWxvZ3MgPSAkQWN0aXZpdHlEYXRhLT57QWN0aXZpdHlEaWFsb2d9IHx8IHt9OwogICAgICAgIH0KCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkTmV4dEFjdGl2aXR5RGlhbG9ncykgKSB7CgogICAgICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCJLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0UHJvY2VzcyIpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0NvdWxkIG5vdCBsb2FkIHByb2Nlc3MgbW9kdWxlLicpLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkUHJvY2Vzc01vZHVsZSA9ICgnS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lclRpY2tldFByb2Nlc3MnKS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgPT4gJ0N1c3RvbWVyVGlja2V0UHJvY2VzcycsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0Rpc3BsYXlBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICBNb2R1bGVSZWcgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eydDdXN0b21lclRpY2tldFByb2Nlc3MnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgY3VycmVudCB1c2VyIGhhcyB0aGUgbmVlZGVkIHBlcm1pc3Npb25zIHRvIHZpZXcgdGhlCiAgICAgICAgICAgICMgZGlmZmVyZW50IGFjdGl2aXR5IGRpYWxvZ3MsIHNvIHdlIGxvb3Agb3ZlciBldmVyeSBhY3Rpdml0eSBkaWFsb2cgYW5kIGNoZWNrIGlmIHRoZXJlCiAgICAgICAgICAgICMgaXMgYSBwZXJtaXNzaW9uIGNvbmZpZ3VyZWQuIElmIHRoZXJlIGlzIGEgcGVybWlzc2lvbiBjb25maWd1cmVkIHdlIGNoZWNrIHRoaXMKICAgICAgICAgICAgIyBhbmQgZGlzcGxheS9oaWRlIHRoZSBhY3Rpdml0eSBkaWFsb2cgbGluawogICAgICAgICAgICBteSAlUGVybWlzc2lvblJpZ2h0czsKICAgICAgICAgICAgbXkgJVBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3Q7CiAgICAgICAgICAgIEFDVElWSVRZRElBTE9HUEVSTUlTU0lPTjoKICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICV7JE5leHRBY3Rpdml0eURpYWxvZ3N9ICkgewogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskSW5kZXh9OwogICAgICAgICAgICAgICAgbXkgJEN1cnJlbnRBY3Rpdml0eURpYWxvZyAgICAgICAgID0gJEFjdGl2aXR5RGlhbG9nT2JqZWN0LT5BY3Rpdml0eURpYWxvZ0dldCgKICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRCwKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGFuIGludGVyZmFjZSBsb29rdXAtbGlzdAogICAgICAgICAgICAgICAgbXkgJUludGVyZmFjZUxvb2t1cCA9IG1hcCB7ICRfID0+IDEgfSBAeyAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57SW50ZXJmYWNlfSB9OwoKICAgICAgICAgICAgICAgIG5leHQgQUNUSVZJVFlESUFMT0dQRVJNSVNTSU9OIGlmICEkSW50ZXJmYWNlTG9va3Vwe0N1c3RvbWVySW50ZXJmYWNlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBwZXJmb3JtYW5jZS1ib29zdC9jYWNoZQogICAgICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFBlcm1pc3Npb25SaWdodHN7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGVybWlzc2lvblJpZ2h0c3sgJEN1cnJlbnRBY3Rpdml0eURpYWxvZy0+e1Blcm1pc3Npb259IH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ3VycmVudEFjdGl2aXR5RGlhbG9nLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFBlcm1pc3Npb25SaWdodHN7ICRDdXJyZW50QWN0aXZpdHlEaWFsb2ctPntQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEFDVElWSVRZRElBTE9HUEVSTUlTU0lPTjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBlcm1pc3Npb25BY3Rpdml0eURpYWxvZ0xpc3R7JEluZGV4fSA9ICRDdXJyZW50QWN0aXZpdHlEaWFsb2dFbnRpdHlJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWR1Y2UgbmV4dCBhY3Rpdml0eSBkaWFsb2dzIHRvIHRoZSBvbmVzIHRoYXQgaGF2ZSBwZXJtaXNzaW9ucwogICAgICAgICAgICAkTmV4dEFjdGl2aXR5RGlhbG9ncyA9IFwlUGVybWlzc2lvbkFjdGl2aXR5RGlhbG9nTGlzdDsKCiAgICAgICAgICAgICMgZ2V0IEFDTCByZXN0cmljdGlvbnMKICAgICAgICAgICAgbXkgJEFDTCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEFjbCgKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlUGVybWlzc2lvbkFjdGl2aXR5RGlhbG9nTGlzdCwKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgICA9PiAnQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgUmV0dXJuU3ViVHlwZSAgPT4gJy0nLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICV7JE5leHRBY3Rpdml0eURpYWxvZ3N9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0QWNsRGF0YSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05leHRBY3Rpdml0aWVzJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtBY3Rpdml0eUVycm9ySFRNTH0gLy89IHt9OwoKICAgICAgICAgICAgZm9yIG15ICROZXh0QWN0aXZpdHlEaWFsb2dLZXkgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAleyROZXh0QWN0aXZpdHlEaWFsb2dzfSApIHsKICAgICAgICAgICAgICAgIG15ICRBY3Rpdml0eURpYWxvZ0RhdGEgPSAkQWN0aXZpdHlEaWFsb2dPYmplY3QtPkFjdGl2aXR5RGlhbG9nR2V0KAogICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5RGlhbG9nRW50aXR5SUQgPT4gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskTmV4dEFjdGl2aXR5RGlhbG9nS2V5fSwKICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgICAgICAgICAgICAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZGVjaWRlIHdoZXRoZXIgdG8gb3V0cHV0IGRpcmVjdCBzdWJtaXQgb3IgbGluayB0byBuZXcgd2luZG93CiAgICAgICAgICAgICAgICBteSAkRGlyZWN0U3VibWl0ID0gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0RpcmVjdFN1Ym1pdH07CiAgICAgICAgICAgICAgICBpZiAoIGFueSB7ICRBY3Rpdml0eURpYWxvZ0RhdGEtPntGaWVsZHN9eyRffXtEaXNwbGF5fSB9IGtleXMgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e0ZpZWxkc30tPiUqICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3RTdWJtaXQgPSAwOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkRGlyZWN0U3VibWl0KSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGl2aXR5RGlhbG9nRGlyZWN0U3VibWl0JywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskTmV4dEFjdGl2aXR5RGlhbG9nS2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkQWN0aXZpdHlEaWFsb2dEYXRhLT57U3VibWl0QnV0dG9uVGV4dH0gfHwgJEFjdGl2aXR5RGlhbG9nRGF0YS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBY3Rpdml0eURpYWxvZycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgPT4gJEFjdGl2aXR5RGlhbG9nRGF0YS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0VudGl0eUlEID0+ICRQYXJhbXskUHJvY2Vzc0VudGl0eUlERmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkQWN0aXZpdHlIVE1MID0gJFBhcmFte0FjdGl2aXR5RXJyb3JIVE1MfXsgJE5leHRBY3Rpdml0eURpYWxvZ3MtPnskTmV4dEFjdGl2aXR5RGlhbG9nS2V5fSB9IC8vICRQcm9jZXNzTW9kdWxlLT5SdW4oCiAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlEaWFsb2dFbnRpdHlJRCA9PiAkTmV4dEFjdGl2aXR5RGlhbG9ncy0+eyROZXh0QWN0aXZpdHlEaWFsb2dLZXl9LAogICAgICAgICAgICAgICAgICAgIFByb2Nlc3NFbnRpdHlJRCAgICAgICAgPT4gJFBhcmFteyRQcm9jZXNzRW50aXR5SURGaWVsZH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvY2Vzc0FjdGl2aXR5JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlIVE1MICAgICAgICAgICA9PiAkQWN0aXZpdHlIVE1MLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpdml0eURpYWxvZ0VudGl0eUlEID0+ICROZXh0QWN0aXZpdHlEaWFsb2dzLT57JE5leHRBY3Rpdml0eURpYWxvZ0tleX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCROZXh0QWN0aXZpdHlEaWFsb2dzKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vQWN0aXZpdHlEaWFsb2cnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgY29uZmlnIGZvciBmcm9udGVuZCBtb2R1bGUKICAgIG15ICREeW5hbWljRmllbGRGaWx0ZXIgPSAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfTsKCiAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwoKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgZ2F0aGVyIGNhdGVnb3JpZXMgdG8gYmUgc2hvd24KICAgIG15ICVDYXRlZ29yaWVzOwogICAgbXkgJENhdGVnb3J5Q29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldENhdGVnb3JpZXMiKTsKCiAgICAjIHN0YW5kYXJkIHRpY2tldCBjYXRlZ29yaWVzCiAgICBDQVQ6CiAgICBmb3IgbXkgJENhdE5hbWUgKHF3L1ByaW9yaXR5IFR5cGUgUXVldWUgU2VydmljZSBTdGF0ZSBPd25lci8pIHsKICAgICAgICBuZXh0IENBVCBpZiAhJFBhcmFteyRDYXROYW1lfTsKICAgICAgICBpZiAoICRDYXRlZ29yeUNvbmZpZy0+eyRDYXROYW1lfSApIHsKICAgICAgICAgICAgbXkgJENvbmYgPSAkQ2F0ZWdvcnlDb25maWctPnskQ2F0TmFtZX07CiAgICAgICAgICAgIG15ICRUZXh0ID0gJENvbmYtPntUZXh0fSAvLyAkUGFyYW17JENhdE5hbWV9OwoKICAgICAgICAgICAgJENvbmYtPntDb2xvclNlbGVjdGlvbn0gLy89IHt9OwogICAgICAgICAgICBteSAkQ29sb3IgPSAkQ29uZi0+e0NvbG9yU2VsZWN0aW9ufXsgJFBhcmFteyRDYXROYW1lfSB9IC8vICRDb25mLT57Q29sb3JEZWZhdWx0fTsKCiAgICAgICAgICAgIHB1c2ggQHsgJENhdGVnb3JpZXN7ICRDb25mLT57T3JkZXJ9IH0gfSwgewogICAgICAgICAgICAgICAgVGV4dCAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgQ29sb3IgID0+ICRDb2xvciwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkUGFyYW17JENhdE5hbWV9LAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRDb25mLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRHluYW1pY0ZpZWxkQ2F0ZWdvcmllcyA9ICRDYXRlZ29yeUNvbmZpZy0+e0R5bmFtaWNGaWVsZH0KICAgICAgICA/CiAgICAgICAgbWFwIHsgJENhdGVnb3J5Q29uZmlnLT57RHluYW1pY0ZpZWxkfXskX317RHluYW1pY0ZpZWxkfSA9PiAkXyB9IGtleXMgJXsgJENhdGVnb3J5Q29uZmlnLT57RHluYW1pY0ZpZWxkfSB9CiAgICAgICAgOiAoKTsKCiAgICAjIGdldCB0aGUgZHluYW1pYyBmaWVsZHMgZm9yIHRpY2tldCBvYmplY3QKICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgT2JqZWN0VHlwZSAgPT4gWydUaWNrZXQnXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkRHluYW1pY0ZpZWxkRmlsdGVyIHx8IHt9LAogICAgKTsKCiAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAjIHNraXAgdGhlIGR5bmFtaWMgZmllbGQgaWYgaXMgbm90IGRlc2lnbmVkIGZvciBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBteSAkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGUgPSAkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQ3VzdG9tZXJJbnRlcmZhY2VDYXBhYmxlJywKICAgICAgICApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkSXNDdXN0b21lckludGVyZmFjZUNhcGFibGU7CgogICAgICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICRWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkVmFsdWUgZXEgIiI7CgogICAgICAgICMgZ2V0IHByaW50IHN0cmluZyBmb3IgdGhpcyBkeW5hbWljIGZpZWxkCiAgICAgICAgbXkgJFZhbHVlU3RyZyA9ICRCYWNrZW5kT2JqZWN0LT5EaXNwbGF5VmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBWYWx1ZU1heENoYXJzICAgICAgPT4gMjUsCiAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICk7CgogICAgICAgIG15ICRMYWJlbCA9ICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH07CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExhYmVsID0+ICRMYWJlbCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57TGlua30gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkTGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFZhbHVlU3RyZy0+e1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBMaW5rICAgICAgICAgICAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntMaW5rfSwKICAgICAgICAgICAgICAgICAgICBMaW5rUHJldmlldyAgICAgICAgICAgICAgICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntMaW5rUHJldmlld30sCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9ID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXREeW5hbWljRmllbGRQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkVmFsdWVTdHJnLT57VmFsdWV9LAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBleGFtcGxlIG9mIGR5bmFtaWMgZmllbGRzIG9yZGVyIGN1c3RvbWl6YXRpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGFiZWwgPT4gJExhYmVsLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlU3RyZy0+e1ZhbHVlfSwKICAgICAgICAgICAgICAgIFRpdGxlID0+ICRWYWx1ZVN0cmctPntUaXRsZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCAlQ2F0ZWdvcmllcyBhcyAkQ2F0ZWdvcmllc3s8T3JkZXI+fSA9IFsge1RleHQgPT4gJycsIENvbG9yID0+ICcnfSwgLi4uIF0KICAgICAgICBpZiAoICREeW5hbWljRmllbGRDYXRlZ29yaWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgbXkgJENvbmYgPSAkQ2F0ZWdvcnlDb25maWctPntEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ2F0ZWdvcmllc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gfTsKICAgICAgICAgICAgbXkgJFRleHQgPSAkQ29uZi0+e1RleHR9IC8vICRWYWx1ZVN0cmctPntWYWx1ZX07CgogICAgICAgICAgICAkQ29uZi0+e0NvbG9yU2VsZWN0aW9ufSAvLz0ge307CiAgICAgICAgICAgIG15ICRDb2xvciA9ICRDb25mLT57Q29sb3JTZWxlY3Rpb259eyAkVmFsdWVTdHJnLT57VmFsdWV9IH0gLy8gJENvbmYtPntDb2xvckRlZmF1bHR9OwoKICAgICAgICAgICAgcHVzaCBAeyAkQ2F0ZWdvcmllc3sgJENvbmYtPntPcmRlcn0gfSB9LCB7CiAgICAgICAgICAgICAgICBUZXh0ICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBDb2xvciAgPT4gJENvbG9yLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRWYWx1ZVN0cmctPntWYWx1ZX0sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJENvbmYsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBjYXRlZ29yaWVzIGZvciBoZWFkZXIgYW5kIGluZm8gYmxvY2sKICAgIGlmICglQ2F0ZWdvcmllcykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdJbmZvQ2F0ZWdvcmllcycgKTsKICAgICAgICBmb3IgbXkgJE9yZGVyICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJUNhdGVnb3JpZXMgKSB7CiAgICAgICAgICAgIGZvciBteSAkQ2F0ZWdvcnkgKCBAeyAkQ2F0ZWdvcmllc3skT3JkZXJ9IH0gKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yaWVzJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRDYXRlZ29yeSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDYXRlZ29yaWVzSScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkQ2F0ZWdvcnksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaXMgY2hhdCBhdmFpbGFibGUgYW5kIGlzIHN0YXJ0aW5nIGEgY2hhdCBmcm9tIHRpY2tldCB6b29tIGF2YWlsYWJsZQogICAgbXkgJENoYXRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6Q3VzdG9tZXI6OlN0YXJ0Q2hhdEZyb21UaWNrZXQnKTsKICAgIGlmICgKICAgICAgICAkQ2hhdENvbmZpZy0+e0FsbG93ZWR9CiAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdDaGF0RW5naW5lOjpBY3RpdmUnKQogICAgICAgICkKICAgIHsKICAgICAgICAjIGdldCBhbGwgcXVldWVzIHRvIHRpY2tldHMgcmVsYXRpb25zCiAgICAgICAgbXkgJVF1ZXVlQ2hhdENoYW5uZWxSZWxhdGlvbnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdENoYW5uZWwnKS0+Q2hhdENoYW5uZWxRdWV1ZXNHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySW50ZXJmYWNlID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBpZiBhIHN1cHBvcnQgY2hhdCBjaGFubmVsIGlzIHNldCBmb3IgdGhpcyBxdWV1ZQogICAgICAgIGlmICggJFF1ZXVlQ2hhdENoYW5uZWxSZWxhdGlvbnN7ICRQYXJhbXtRdWV1ZUlEfSB9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpcyBzdGFydGluZyBhIGNoYXQgZnJvbSB0aWNrZXQgem9vbSBhbGxvd2VkIHRvIGFsbCB1c2VyIG9yIG9ubHkgdG8gdGlja2V0IGN1c3RvbWVyIHVzZXJfYWdlbnQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgISRDaGF0Q29uZmlnLT57UGVybWlzc2lvbnN9CiAgICAgICAgICAgICAgICB8fCAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gZXEgJFNlbGYtPntVc2VySUR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIyBhZGQgY2hhdCBjaGFubmVsSUQgdG8gUGFyYW0KICAgICAgICAgICAgICAgICRQYXJhbXtDaGF0Q2hhbm5lbElEfSA9ICRRdWV1ZUNoYXRDaGFubmVsUmVsYXRpb25zeyAkUGFyYW17UXVldWVJRH0gfTsKCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtDaGF0Q2hhbm5lbElEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBzaG91bGQgY2hhdCBiZSBhdmFpbGFibGUgb25seSBpZiB0aGVyZSBhcmUgYXZhaWxhYmxlIGFnZW50cyBpbiB0aGlzIGNoYXQgY2hhbm5lbElECiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoYXRDb25maWctPntBbGxvd0NoYXRPbmx5SWZBZ2VudHNBdmFpbGFibGV9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBzaG93IHN0YXJ0IGEgY2hhdCBpY29uCiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ2hhdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBHZXQgY2hhbm5lbHMgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICBteSAlQ2hhdENoYW5uZWxEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoYXRDaGFubmVsJyktPkNoYXRDaGFubmVsR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhdENoYW5uZWxJRCA9PiAkUGFyYW17Q2hhdENoYW5uZWxJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIEdldCBhbGwgb25saW5lIHVzZXJzCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRBdmFpbGFiaWxpdHlDaGVjayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiQ2hhdEVuZ2luZTo6Q3VzdG9tZXJGcm9udGVuZDo6QXZhaWxhYmlsaXR5Q2hlY2siKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgMDsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUF2YWlsYWJsZVVzZXJzOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJEF2YWlsYWJpbGl0eUNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQXZhaWxhYmxlVXNlcnMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hhdCcpLT5BdmFpbGFibGVVc2Vyc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgPT4gJ0V4dGVybmFsQ2hhbm5lbHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBSZW5hbWUgaGFzaCBrZXk6IENoYXRDaGFubmVsSUQgPT4gS2V5CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGF0Q2hhbm5lbERhdGF7S2V5fSA9IGRlbGV0ZSAkQ2hhdENoYW5uZWxEYXRhe0NoYXRDaGFubmVsSUR9OwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRBdmFpbGFiaWxpdHlDaGVjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFVzZXJBdmFpbGFibGUgPSAwOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFWQUlMQUJMRV9VU0VSOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBdmFpbGFibGVVc2VyICggc29ydCBrZXlzICVBdmFpbGFibGVVc2VycyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGFueSB7L14kQ2hhdENoYW5uZWxEYXRhe0tleX0kL30gQHsgJEF2YWlsYWJsZVVzZXJzeyRBdmFpbGFibGVVc2VyfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlckF2YWlsYWJsZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQVZBSUxBQkxFX1VTRVI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVXNlckF2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdDaGF0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHByaW50IG9wdGlvbgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPntDdXN0b21lclRpY2tldFByaW50fQogICAgICAgICYmICRBY2xBY3Rpb25Mb29rdXB7Q3VzdG9tZXJUaWNrZXRQcmludH0KICAgICAgICApCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1ByaW50JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkWm9vbUV4cGFuZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tRXhwYW5kJyApOwogICAgaWYgKCAhZGVmaW5lZCAkWm9vbUV4cGFuZCApIHsKICAgICAgICAkWm9vbUV4cGFuZCA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJUaWNrZXRab29tJyktPntDdXN0b21lclpvb21FeHBhbmR9IHx8ICcnOwogICAgfQoKICAgICMgRXhwYW5kIG9wdGlvbgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRXhwYW5kJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgWm9vbUV4cGFuZCAgID0+ICEkWm9vbUV4cGFuZCwKICAgICAgICAgICAgRXhwYW5kT3B0aW9uID0+ICggJFpvb21FeHBhbmQgPyAnT25lJyAgICAgICAgICAgICAgOiAnQWxsJyApLAogICAgICAgICAgICBFeHBhbmRUZXh0ICAgPT4gKCAkWm9vbUV4cGFuZCA/ICdTaG93IG9uZSBhcnRpY2xlJyA6ICdTaG93IGFsbCBhcnRpY2xlcycgKSwKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICBteSAkU2hvd25BcnRpY2xlczsKICAgIG15ICRMYXN0U2VuZGVyVHlwZSA9ICcnOwogICAgbXkgJEFydGljbGVIVE1MICAgID0gJyc7CgogICAgZm9yIG15ICRBcnRpY2xlVG1wICggcmV2ZXJzZSBAQXJ0aWNsZUJveCApIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICRBcnRpY2xlVG1wLT4lKjsKCiAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIHNob3VsZCBiZSBleHBhbmRlZCAodmlzaWJsZSkKICAgICAgICBpZiAoICRTZWxlY3RlZEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9IHx8ICRab29tRXhwYW5kICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDbGFzc30gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgICRTaG93bkFydGljbGVzKys7CiAgICAgICAgfQoKICAgICAgICAjIENhbGN1bGF0ZSBkaWZmZXJlbmNlIGJldHdlZW4gYXJ0aWNsZSBjcmVhdGUgdGltZSBhbmQgbm93IGluIHNlY29uZHMuCiAgICAgICAgbXkgJEFydGljbGVDcmVhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFydGljbGV7Q3JlYXRlVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkRGVsdGEgPSAkQXJ0aWNsZUNyZWF0ZVRpbWVPYmplY3QtPkRlbHRhKAogICAgICAgICAgICBEYXRlVGltZU9iamVjdCA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKSwKICAgICAgICApOwoKICAgICAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAgICAgJEFydGljbGV7QWdlfSA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkRGVsdGEtPntBYnNvbHV0ZVNlY29uZHN9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgICAgIERhdGUgID0+ICRBcnRpY2xle0NyZWF0ZVRpbWV9LAogICAgICAgICk7CgogICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxNTAsCiAgICAgICAgKTsKCiAgICAgICAgJExhc3RTZW5kZXJUeXBlID0gJEFydGljbGV7U2VuZGVyVHlwZX07CgogICAgICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntTaG93QnJvd3NlckxpbmtNZXNzYWdlfSApIHsKICAgICAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2Vze1VzZXJDdXN0b21lckRvTm90U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1Nob3dCcm93c2VyTGlua01lc3NhZ2V9ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2hvd0Jyb3dzZXJMaW5rTWVzc2FnZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyktPkJhY2tlbmRGb3JBcnRpY2xlKAogICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJENoYW5uZWxOYW1lID0gJEFydGljbGVCYWNrZW5kT2JqZWN0LT5DaGFubmVsTmFtZUdldCgpOwoKICAgICAgICAkQXJ0aWNsZUhUTUwgLj0gJEtlcm5lbDo6T00tPkdldCgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldFpvb206OkN1c3RvbWVyOjokQ2hhbm5lbE5hbWUiKS0+QXJ0aWNsZVJlbmRlcigKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgICAgID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICAgPT4gJEFydGljbGV7Q2xhc3N9LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgU2hvd0Jyb3dzZXJMaW5rTWVzc2FnZSA9PiAkU2VsZi0+e1Nob3dCcm93c2VyTGlua01lc3NhZ2V9LAogICAgICAgICAgICBBcnRpY2xlRXhwYW5kZWQgICAgICAgID0+ICRTZWxlY3RlZEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9IHx8ICRab29tRXhwYW5kLAogICAgICAgICAgICBBcnRpY2xlQWdlICAgICAgICAgICAgID0+ICRBcnRpY2xle0FnZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFRPRE86IFJlZmFjdG9yCiAgICAjIGlmIHRoZXJlIGFyZSBubyB2aWV3YWJsZSBhcnRpY2xlcyBzaG93IE5vQXJ0aWNsZXMgbWVzc2FnZQogICAgaWYgKCAhQEFydGljbGVCb3ggKSB7CiAgICAgICAgJFBhcmFte05vQXJ0aWNsZXN9ID0gMTsKICAgIH0KCiAgICBteSAlQXJ0aWNsZTsKICAgIGlmIChAQXJ0aWNsZUJveCkgewoKICAgICAgICBteSAkQXJ0aWNsZU9CID0ge307CiAgICAgICAgaWYgKCRMYXN0Q3VzdG9tZXJBcnRpY2xlKSB7CiAgICAgICAgICAgICRBcnRpY2xlT0IgPSAkQXJ0aWNsZUJveFskTGFzdEN1c3RvbWVyQXJ0aWNsZV07CiAgICAgICAgfQoKICAgICAgICAlQXJ0aWNsZSA9ICRBcnRpY2xlT0ItPiUqOwoKICAgICAgICAjIGlmIG5vIGN1c3RvbWVyIGFydGljbGVzIGZvdW5kIHVzZSB0aWNrZXQgdmFsdWVzCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQXJ0aWNsZSApICkgewogICAgICAgICAgICAlQXJ0aWNsZSA9ICVQYXJhbTsKICAgICAgICAgICAgaWYgKCAhJEFydGljbGV7U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZXtTdGF0ZUlEfSA9ICRQYXJhbXtUaWNrZXRTdGF0ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBteSAlQXJ0aWNsZVRtcDEgPSAkQXJ0aWNsZVRtcC0+JSo7CiAgICAgICAgICAgIGlmICggJEFydGljbGVJRCBlcSAkQXJ0aWNsZVRtcDF7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgICAgICVBcnRpY2xlID0gJUFydGljbGVUbXAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZmFsbGJhY2sgdG8gdGlja2V0IGluZm8gaWYgdGhlcmUgaXMgbm8gYXJ0aWNsZQogICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlQXJ0aWNsZSApICkgewogICAgICAgICVBcnRpY2xlID0gJVBhcmFtOwogICAgICAgIGlmICggISRBcnRpY2xle1N0YXRlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTdGF0ZUlEfSA9ICRQYXJhbXtUaWNrZXRTdGF0ZUlEfTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb2xsb3cgdXAgcGVybWlzc2lvbnMKICAgIG15ICRGb2xsb3dVcFBvc3NpYmxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldEZvbGxvd1VwT3B0aW9uKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICk7CiAgICBteSAlU3RhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhdGUnKS0+U3RhdGVHZXQoCiAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJFRpY2tldE9iamVjdC0+VGlja2V0Q3VzdG9tZXJQZXJtaXNzaW9uKAogICAgICAgICAgICBUeXBlICAgICA9PiAndXBkYXRlJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApCiAgICAgICAgJiYgKAogICAgICAgICAgICAoICRGb2xsb3dVcFBvc3NpYmxlICF+IC8obmV3IHRpY2tldHxyZWplY3QpL2kgJiYgJFN0YXRle1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKQogICAgICAgICAgICB8fCAkU3RhdGV7VHlwZU5hbWV9ICF+IC9eY2xvc2V8bWVyZ2VkL2kKICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICBpZiAoICRQYXJhbXtIaWRlQXV0b3NlbGVjdGVkfSApIHsKCiAgICAgICAgICAgICMgYWRkIEF1dG9zZWxlY3QgSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNPbkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBDb2RlID0+ICJDb3JlLkZvcm0uSW5pdEhpZGVBdXRvc2VsZWN0ZWQoeyBGaWVsZElEczogJFBhcmFte0hpZGVBdXRvc2VsZWN0ZWR9IH0pOyIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbmZvcm1hdGlvbiB3aGV0aGVyIGFjdGl2YXRlZCBhY3Rpdml0eSBkaWFsb2cgYnV0dG9uIHNob3VsZCBiZSBoaWRkZW4KICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdIaWRlQWN0aXZhdGVkQWN0aXZpdHlEaWFsb2dCdXR0b24nLAogICAgICAgICAgICBWYWx1ZSA9PiAkQ29uZmlnLT57J0hpZGVBY3RpdmF0ZWRBY3Rpdml0eURpYWxvZ0J1dHRvbid9IC8vIDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBzdWJqZWN0CiAgICAgICAgaWYgKCAhJFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAkUGFyYW17U3ViamVjdH0gPSAiUmU6ICIgLiAoICRQYXJhbXtUaXRsZX0gLy8gJycgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17UmVwbHl9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcGx5QnV0dG9uJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCiAgICAgICAgIyBjaGVjayBpZiBleGlzdHMgY3VzdG9tZXIgYW5zd2VyIHRlbXBsYXRlcyByZWdhcmRsZXNzIHRoZSBxdWV1ZSBhbmQgdGhlIHNlcnZpY2UKICAgICAgICBteSAlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpLT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgVHlwZSAgPT4gJ0N1c3RvbWVyQW5zd2VyJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHRleHQgdGVtcGxhdGUgc3RyaW5nCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggXCVTdGFuZGFyZFRlbXBsYXRlcyApICkgewoKICAgICAgICAgICAgIyBmZXRjaCBhbGwgYXZhaWxhYmxlIHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgICAgIG15ICRBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlcyA9ICRTZWxmLT5fR2V0U3RhbmRhcmRUZW1wbGF0ZXMoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXMgfHwge30sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1N0YW5kYXJkVGVtcGxhdGVJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0gfHwgJycsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YW5kYXJkVGVtcGxhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgICAgICMgdXNlIGhlaWdodC93aWR0aCBkZWZpbmVkIGZvciB0aGlzIHNjcmVlbgogICAgICAgICAgICAkUGFyYW17UmljaFRleHRIZWlnaHR9ID0gJENvbmZpZy0+e1JpY2hUZXh0SGVpZ2h0fSB8fCAwOwogICAgICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJENvbmZpZy0+e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAgICAgIyBzZXQgdXAgY3VzdG9tZXIgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lclNldFJpY2hUZXh0UGFyYW1ldGVycygKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgbmV4dCBzdGF0ZXMgc3RyaW5nCiAgICAgICAgaWYgKCAkQ29uZmlnLT57U3RhdGV9ICkgewogICAgICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlU3RhdGVTZWxlY3RlZDsKICAgICAgICAgICAgaWYgKCAkUGFyYW17U3RhdGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdGVTZWxlY3RlZHtTZWxlY3RlZElEfSA9ICRQYXJhbXtTdGF0ZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTdGF0ZVNlbGVjdGVke1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1N0YXRlRGVmYXVsdH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte05leHRTdGF0ZXNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSA9PiAkTmV4dFN0YXRlcywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlSUQnLAogICAgICAgICAgICAgICAgJVN0YXRlU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnTW9kZXJuaXplIEZvcm1VcGRhdGUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdGb2xsb3dVcFN0YXRlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlUHJpb3JpdHlTZWxlY3RlZDsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZElEfSA9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkVmFsdWV9ID0gJENvbmZpZy0+e1ByaW9yaXR5RGVmYXVsdH0KICAgICAgICAgICAgICAgICAgICB8fCAnMyBub3JtYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhID0+ICRQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAlUHJpb3JpdHlTZWxlY3RlZCwKICAgICAgICAgICAgICAgIENsYXNzID0+ICdNb2Rlcm5pemUgRm9ybVVwZGF0ZScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRm9sbG93VXBQcmlvcml0eScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkU2VwYXJhdGVEeW5hbWljRmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkN1c3RvbWVyRnJvbnRlbmQ6OlNlcGFyYXRlRHluYW1pY0ZpZWxkcycpOwoKICAgICAgICAjIHJlbmRlciBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJFNlbGYtPntGb2xsb3dVcER5bmFtaWNGaWVsZH0tPiUqICkgewoKICAgICAgICAgICAgIyBncmVwIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgIG15ICVEeW5hbWljRmllbGRWYWx1ZXMgPSBtYXAgeyAkXyA9PiAkUGFyYW17JF99IH0gZ3JlcCB7L15EeW5hbWljRmllbGRfL30ga2V5cyAlUGFyYW07CgogICAgICAgICAgICAjIFRPRE8gcmVuZGVyaW5nIHRocm93cyBlcnJvciAnTmVlZCBJRCBpbiBEeW5hbWljRmllbGRDb25maWchJyBpbiBwcm9jZXNzIGNhc2UgYmVjYXVzZSBpZHMgaW4gJUR5bmFtaWNGaWVsZENvbmZpZyBhcmUgY29uY2F0ZW5hdGVkIHdpdGggYWN0aXZpdHlkaWFsb2dpZAogICAgICAgICAgICAkUGFyYW17RHluYW1pY0ZpZWxkSFRNTH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6RHluYW1pY0ZpZWxkOjpNYXNrJyktPkVkaXRTZWN0aW9uUmVuZGVyKAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgID0+ICRTZWxmLT57TWFza0RlZmluaXRpb259LAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgID0+ICRTZWxmLT57Rm9sbG93VXBEeW5hbWljRmllbGR9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgID0+IFwlRHluYW1pY0ZpZWxkVmFsdWVzLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgID0+ICRQYXJhbXtERlBvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgIEVycm9ycyAgICAgICAgICAgICAgICA9PiAkUGFyYW17REZFcnJvcnN9LAogICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgID0+ICRQYXJhbXtWaXNpYmlsaXR5fSwKICAgICAgICAgICAgICAgIFNlcGFyYXRlRHluYW1pY0ZpZWxkcyA9PiAkU2VwYXJhdGVEeW5hbWljRmllbGRzLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJbnRlcmZhY2UgICAgID0+IDEsCiAgICAgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICVEeW5hbWljRmllbGRWYWx1ZXMsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICAgICAgRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICApOwoKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgJiYgJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0KICAgICAgICAgICAgICAgICYmICggJEF0dGFjaG1lbnQtPntDb250ZW50VHlwZX0gPX4gL2ltYWdlL2kgKQogICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17QXR0YWNobWVudExpc3R9IH0sICRBdHRhY2htZW50OwogICAgICAgIH0KICAgIH0KCiAgICAjIG5hbWUgYW5kIGF2YXRhcgogICAgbXkgJUN1c3RvbWVyVXNlciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSB8fCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICk7CiAgICBteSAoICRBdmF0YXIsICRVc2VySW5pdGlhbHMgKTsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6QXZhdGFyRW5naW5lJykgZXEgJ0dyYXZhdGFyJyAmJiAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH0gKSB7CiAgICAgICAgbXkgJERlZmF1bHRJY29uID0gJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6R3JhdmF0YXI6OkRlZmF1bHRJbWFnZScpIHx8ICdtbSc7CiAgICAgICAgJEF2YXRhciA9ICcvL3d3dy5ncmF2YXRhci5jb20vYXZhdGFyLycgLiBtZDVfaGV4KCBsYyAkQ3VzdG9tZXJVc2Vye1VzZXJFbWFpbH0gKSAuICc/cz0xMDAmZD0nIC4gJERlZmF1bHRJY29uOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFVzZXJJbml0aWFscyA9IHN1YnN0ciggJEN1c3RvbWVyVXNlcntVc2VyRmlyc3ROYW1lfSwgMCwgMSApIC4gc3Vic3RyKCAkQ3VzdG9tZXJVc2Vye1VzZXJMYXN0TmFtZX0sIDAsIDEgKTsKICAgIH0KCiAgICAjIGV4cGxhbmF0b3J5IG1lc3NhZ2UgYWJvdXQgYXN0ZXJpc2sKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBc3Rlcmlza0V4cGxhbmF0aW9uJykgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FzdGVyaXNrRXhwbGFuYXRpb24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZWxlY3QgdGhlIG91dHB1dCB0ZW1wbGF0ZQogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0Wm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0SW5mb0Rpc3BsYXlUeXBlID0+ICRDb25maWctPntUaWNrZXRJbmZvRGlzcGxheVR5cGV9IHx8ICdIZWFkZXInLAogICAgICAgICAgICBBcnRpY2xlcyAgICAgICAgICAgICAgPT4gJEFydGljbGVIVE1MLAogICAgICAgICAgICBBdmF0YXIgICAgICAgICAgICAgICAgPT4gJEF2YXRhciwKICAgICAgICAgICAgVXNlckluaXRpYWxzICAgICAgICAgID0+ICRVc2VySW5pdGlhbHMsCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgICAgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgICAgICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgIH0sCiAgICApOwp9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCnN1YiBfR2V0U3RhbmRhcmRUZW1wbGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRRdWV1ZUlEICAgICAgID0gJFBhcmFte1F1ZXVlSUR9ICAgfHwgJyc7CiAgICBteSAkU2VydmljZUlEICAgICA9ICRQYXJhbXtTZXJ2aWNlSUR9IHx8ICcnOwogICAgbXkgJENvbmZpZ09iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFF1ZXVlT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKICAgIG15ICRTZXJ2aWNlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnKTsKCiAgICBteSAlQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXM7CiAgICBteSAkUmVmZXJlbmNlQXR0cmlidXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclRlbXBsYXRlOjpSZWZlcmVuY2VBdHRyaWJ1dGUnKSB8fCAnUXVldWUnOwogICAgaWYgKCAkUmVmZXJlbmNlQXR0cmlidXRlIGVxICdRdWV1ZScgKSB7CgogICAgICAgICMgY2hlY2sgbmVlZGVkCiAgICAgICAgcmV0dXJuIHt9IGlmICEkUXVldWVJRCAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAgICAgaWYgKCAhJFF1ZXVlSUQgJiYgJFBhcmFte1RpY2tldElEfSApIHsKCiAgICAgICAgICAgICMgZ2V0IFF1ZXVlSUQgZnJvbSB0aGUgdGlja2V0CiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUXVldWVJRCA9ICRUaWNrZXR7UXVldWVJRH0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4ge30gaWYgISRRdWV1ZUlEOwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHRlbXBsYXRlcwogICAgICAgICVBdmFpbGFibGVTdGFuZGFyZFRlbXBsYXRlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgVGVtcGxhdGVUeXBlcyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRSZWZlcmVuY2VBdHRyaWJ1dGUgZXEgJ1NlcnZpY2UnICkgewoKICAgICAgICAjIGNoZWNrIG5lZWRlZAogICAgICAgIHJldHVybiB7fSBpZiAhJFNlcnZpY2VJRCAmJiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAgICAgaWYgKCAhJFNlcnZpY2VJRCAmJiAkUGFyYW17VGlja2V0SUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgU2VydmljZUlEIGZyb20gdGhlIHRpY2tldAogICAgICAgICAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlcnZpY2VJRCA9ICRUaWNrZXR7U2VydmljZUlEfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiB7fSBpZiAhJFNlcnZpY2VJRDsKCiAgICAgICAgIyBmZXRjaCBhbGwgc3RkLiB0ZW1wbGF0ZXMKICAgICAgICAlQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXMgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIFRlbXBsYXRlVHlwZXMgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBmZXRjaCBzdGFuZGFyZCB0ZW1wbGF0ZXMgbGlzdCEgSW52YWxpZCByZWZlcmVuY2UgYXR0cmlidXRlICckUmVmZXJlbmNlQXR0cmlidXRlJyIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXR1cm4gZW1wdHkgaGFzaCBpZiB0aGVyZSBhcmUgbm8gdGVtcGxhdGVzIGZvciB0aGlzIHNjcmVlbgogICAgcmV0dXJuIHt9IGlmICFJc0hhc2hSZWZXaXRoRGF0YSggJEF2YWlsYWJsZVN0YW5kYXJkVGVtcGxhdGVze0N1c3RvbWVyQW5zd2VyfSApOwoKICAgICMgcmV0dXJuIGp1c3QgdGhlIHRlbXBsYXRlcyBmb3IgdGhpcyBzY3JlZW4KICAgIHJldHVybiAkQXZhaWxhYmxlU3RhbmRhcmRUZW1wbGF0ZXN7Q3VzdG9tZXJBbnN3ZXJ9Owp9CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AdminTemplate.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA3MGFjNjJjOWZjNzIyODQyMWUyNzQyOTZjOGNkNzgyZDNiODI4MjA4IC0gS2VybmVsL01vZHVsZXMvQWRtaW5UZW1wbGF0ZS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5UZW1wbGF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGlmICggISRQYXJhbXtBY2Nlc3NSd30gJiYgJFBhcmFte0FjY2Vzc1JvfSApIHsKICAgICAgICAkU2VsZi0+e0xpZ2h0QWRtaW59ID0gMTsKICAgIH0KCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YW5kYXJkVGVtcGxhdGUnKTsKICAgIG15ICRTdGRBdHRhY2htZW50T2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0ZEF0dGFjaG1lbnQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyk7CgogICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CgogICAgJFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkUGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKICAgICAgICBteSAkSUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSB8fCAnJzsKICAgICAgICBteSAlRGF0YSA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlR2V0KAogICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQFNlbGVjdGVkQXR0YWNobWVudDsKICAgICAgICBteSAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgcHVzaCBAU2VsZWN0ZWRBdHRhY2htZW50LCAkS2V5OwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgICAgIG15ICVRdWV1ZXMgPSAkUXVldWVPYmplY3QtPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkSUQgKTsKICAgICAgICAgICAgJERhdGF7UGVybWlzc2lvbn0gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBRdWV1ZUlEcyA9PiBbIGtleXMgJVF1ZXVlcyBdLAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgTm8gcGVybWlzc2lvbiBmb3IgdGhlIHRlbXBsYXRlLgogICAgICAgICAgICBpZiAoICEkRGF0YXtQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICVEYXRhID0gKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRGF0YXtQZXJtaXNzaW9ufSBlcSAncm8nICkgewogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBwZXJtaXNzaW9uIHRvIGVkaXQgdGhpcyB0ZW1wbGF0ZS4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgU2VsZWN0ZWRBdHRhY2htZW50cyA9PiBcQFNlbGVjdGVkQXR0YWNobWVudCwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluVGVtcGxhdGUnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgQE5ld0lEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdJRHMnICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSBAQ2hlY2tlZElEczsKICAgICAgICAgICAgZm9yIG15ICRJRCAoQE5ld0lEcykgewogICAgICAgICAgICAgICAgbXkgJFBlcm1pc3Npb24gPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIElEICAgICA9PiAkSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uIGVxICdydycgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQ2hlY2tlZElEcywgJElEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIEBOZXdJRHMgPSBAQ2hlY2tlZElEczsKICAgICAgICB9CgogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIFRlbXBsYXRlVHlwZSBQcmVTZWxlY3RlZFRpY2tldFN0YXRlSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXsnVGVtcGxhdGUnfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICApIHx8ICcnOwoKICAgICAgICAjIGdldCBjb21wb3NlZCBjb250ZW50IHR5cGUKICAgICAgICAkR2V0UGFyYW17Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBWYWxpZElEIFRlbXBsYXRlVHlwZSkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3sgJE5lZWRlZCAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBhIHN0YW5kYXJkIHRlbXBsYXRlIGV4aXN0IHdpdGggdGhpcyBuYW1lCiAgICAgICAgbXkgJE5hbWVFeGlzdHMgPSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdC0+TmFtZUV4aXN0c0NoZWNrKAogICAgICAgICAgICBOYW1lID0+ICRHZXRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgSUQgICA9PiAkR2V0UGFyYW17SUR9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCROYW1lRXhpc3RzKSB7CiAgICAgICAgICAgICRFcnJvcnN7TmFtZUV4aXN0c30gICAgPSAxOwogICAgICAgICAgICAkRXJyb3JzeydOYW1lSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlcyAgICAgPSAkUXVldWVPYmplY3QtPlF1ZXVlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoIFN0YW5kYXJkVGVtcGxhdGVJRCA9PiAkR2V0UGFyYW17SUR9ICk7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJFF1ZXVlT2JqZWN0LT5RdWV1ZUxpc3RQZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gWyBrZXlzICVRdWV1ZXMgXSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlZmF1bHQgID0+ICdydycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIE5vIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBuZSAncncnICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tOb1Blcm1pc3Npb259ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c0FsbCA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50TGlzdCgpOwoKICAgICAgICAgICAgICAgICMgY3JlYXRlIGhhc2ggd2l0aCBzZWxlY3RlZCBxdWV1ZXMKICAgICAgICAgICAgICAgIG15ICVBdHRhY2htZW50c1NlbGVjdGVkID0gbWFwIHsgJF8gPT4gMSB9IEBOZXdJRHM7CgogICAgICAgICAgICAgICAgIyBjaGVjayBhbGwgdXNlZCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgZm9yIG15ICRBdHRhY2htZW50SUQgKCBzb3J0IGtleXMgJUF0dGFjaG1lbnRzQWxsICkgewogICAgICAgICAgICAgICAgICAgIG15ICRBY3RpdmUgPSAkQXR0YWNobWVudHNTZWxlY3RlZHskQXR0YWNobWVudElEfSA/IDEgOiAwOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBhdHRhY2htZW50IHRvIHN0YW5kYXJkIHRlbXBsYXRlIHJlbGF0aW9uCiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudFN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRJRCAgICAgICA9PiAkQXR0YWNobWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJEdldFBhcmFte0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZlICAgICAgICAgICAgID0+ICRBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGlmIHRoZSB1c2VyIHdvdWxkIGxpa2UgdG8gY29udGludWUgZWRpdGluZyB0aGUgdGVtcGxhdGUsIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkKICAgICAgICAgICAgICAgICAgICAmJiAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSBlcSAnMScgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249Q2hhbmdlO0lEPSRJRDtOb3RpZmljYXRpb249VXBkYXRlIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyBoYXMgZ29uZSB3cm9uZwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggUHJpb3JpdHkgPT4gJ0Vycm9yJyApOwogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgRXJyb3JzICAgICAgICAgICAgICA9PiBcJUVycm9ycywKICAgICAgICAgICAgU2VsZWN0ZWRBdHRhY2htZW50cyA9PiBcQE5ld0lEcywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtOYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOYW1lJyApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWRkJywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5UZW1wbGF0ZScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZCBhY3Rpb24KICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBZGRBY3Rpb24nICkgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICBteSBATmV3SURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ0lEcycgKTsKICAgICAgICBpZiAoICRTZWxmLT57TGlnaHRBZG1pbn0gKSB7CiAgICAgICAgICAgIG15IEBDaGVja2VkSURzOwogICAgICAgICAgICBmb3IgbXkgJElEIChATmV3SURzKSB7CiAgICAgICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgSUQgICAgID0+ICRJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gZXEgJ3J3JyApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBDaGVja2VkSURzLCAkSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgQE5ld0lEcyA9IEBDaGVja2VkSURzOwogICAgICAgIH0KCiAgICAgICAgbXkgKCAlR2V0UGFyYW0sICVFcnJvcnMgKTsKCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KElEIE5hbWUgQ29tbWVudCBWYWxpZElEIFRlbXBsYXRlVHlwZSBQcmVTZWxlY3RlZFRpY2tldFN0YXRlSUQpKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXsnVGVtcGxhdGUnfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdUZW1wbGF0ZScsCiAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICApIHx8ICcnOwoKICAgICAgICAjIGdldCBjb21wb3NlZCBjb250ZW50IHR5cGUKICAgICAgICAkR2V0UGFyYW17Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJExheW91dE9iamVjdC0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgICAgICBmb3IgbXkgJE5lZWRlZCAocXcoTmFtZSBWYWxpZElEIFRlbXBsYXRlVHlwZSkpIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3sgJE5lZWRlZCAuICdJbnZhbGlkJyB9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBhIHN0YW5kYXJkIHRlbXBsYXRlIGV4aXN0cyB3aXRoIHRoaXMgbmFtZQogICAgICAgIG15ICROYW1lRXhpc3RzID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPk5hbWVFeGlzdHNDaGVjayggTmFtZSA9PiAkR2V0UGFyYW17TmFtZX0gKTsKICAgICAgICBpZiAoJE5hbWVFeGlzdHMpIHsKICAgICAgICAgICAgJEVycm9yc3tOYW1lRXhpc3RzfSAgICA9IDE7CiAgICAgICAgICAgICRFcnJvcnN7J05hbWVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgdGVtcGxhdGUKICAgICAgICAgICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVJRCA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlQWRkKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRTdGFuZGFyZFRlbXBsYXRlSUQpIHsKCiAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNBbGwgPSAkU3RkQXR0YWNobWVudE9iamVjdC0+U3RkQXR0YWNobWVudExpc3QoKTsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSBoYXNoIHdpdGggc2VsZWN0ZWQgcXVldWVzCiAgICAgICAgICAgICAgICBteSAlQXR0YWNobWVudHNTZWxlY3RlZCA9IG1hcCB7ICRfID0+IDEgfSBATmV3SURzOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgYWxsIHVzZWQgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudElEICggc29ydCBrZXlzICVBdHRhY2htZW50c0FsbCApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQWN0aXZlID0gJEF0dGFjaG1lbnRzU2VsZWN0ZWR7JEF0dGFjaG1lbnRJRH0gPyAxIDogMDsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgYXR0YWNobWVudCB0byBzdGFuZGFyZCB0ZW1wbGF0ZSByZWxhdGlvbgogICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgICAgICAgICAgICAgICAgICBBdHRhY2htZW50SUQgICAgICAgPT4gJEF0dGFjaG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRTdGFuZGFyZFRlbXBsYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2ZSAgICAgICAgICAgICA9PiAkQWN0aXZlLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBJbmZvID0+IFRyYW5zbGF0YWJsZSgnVGVtcGxhdGUgYWRkZWQhJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc29tZXRoaW5nIGhhcyBnb25lIHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBQcmlvcml0eSA9PiAnRXJyb3InICk7CiAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgID0+ICdBZGQnLAogICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgID0+IFwlRXJyb3JzLAogICAgICAgICAgICBTZWxlY3RlZEF0dGFjaG1lbnRzID0+IFxATmV3SURzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZScgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICBteSAlUXVldWVzICAgICA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCggU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICRJRCApOwogICAgICAgICAgICBteSAkUGVybWlzc2lvbiA9ICRRdWV1ZU9iamVjdC0+UXVldWVMaXN0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFF1ZXVlSURzID0+IFsga2V5cyAlUXVldWVzIF0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEZWZhdWx0ICA9PiAncncnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBObyBwZXJtaXNzaW9uIHRvIGRlbGV0ZSB0aGUgdGVtcGxhdGUuCiAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb24gbmUgJ3J3JyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkRGVsZXRlID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIElEID0+ICRJRCwKICAgICAgICApOwogICAgICAgIGlmICggISREZWxldGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkRGVsZXRlLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9PdmVydmlldygpOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ1RlbXBsYXRlIHVwZGF0ZWQhJykgKQogICAgICAgICAgICBpZiAoICROb3RpZmljYXRpb24gJiYgJE5vdGlmaWNhdGlvbiBlcSAnVXBkYXRlJyApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblRlbXBsYXRlJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX0VkaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbk92ZXJ2aWV3JyApOwoKICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgIG15ICVWYWxpZExpc3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgbXkgJVZhbGlkTGlzdFJldmVyc2UgPSByZXZlcnNlICVWYWxpZExpc3Q7CgogICAgJFBhcmFte1ZhbGlkT3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gXCVWYWxpZExpc3QsCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17VmFsaWRJRH0gfHwgJFZhbGlkTGlzdFJldmVyc2V7dmFsaWR9LAogICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCAnIC4gKCAkUGFyYW17RXJyb3JzfS0+eydWYWxpZElESW52YWxpZCd9IHx8ICcnICksCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZVR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGFuZGFyZFRlbXBsYXRlOjpUeXBlcycpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJUZW1wbGF0ZQogICAgIyByZXRyaWV2ZSBhbmQgYWRkIGN1c3RvbWVyIHNwZWNpZmljIHR5cGVzCiAgICBteSAkVGVtcGxhdGVDdXN0b21lclR5cGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdTdGFuZGFyZFRlbXBsYXRlOjpDdXN0b21lclR5cGVzJyk7CiAgICAkVGVtcGxhdGVUeXBlTGlzdCA9IHsKICAgICAgICAleyAkVGVtcGxhdGVUeXBlTGlzdCAvLyB7fSB9LAogICAgICAgICV7ICRUZW1wbGF0ZUN1c3RvbWVyVHlwZUxpc3QgLy8ge30gfSwKICAgIH07CiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICRQYXJhbXtUZW1wbGF0ZVR5cGVTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkVGVtcGxhdGVUeXBlTGlzdCwKICAgICAgICBOYW1lICAgICAgID0+ICdUZW1wbGF0ZVR5cGUnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1RlbXBsYXRlVHlwZX0sCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplIFZhbGlkYXRlX1JlcXVpcmVkICcgLiAoICRQYXJhbXtFcnJvcnN9LT57J1RlbXBsYXRlVHlwZUludmFsaWQnfSB8fCAnJyApLAogICAgKTsKCiAgICBteSAkU3RkQXR0YWNobWVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGRBdHRhY2htZW50Jyk7CiAgICBteSAlQXR0YWNobWVudERhdGEgICAgICA9ICRTdGRBdHRhY2htZW50T2JqZWN0LT5TdGRBdHRhY2htZW50TGlzdCggVmFsaWQgPT4gMSApOwoKICAgIGlmICggJFNlbGYtPntMaWdodEFkbWlufSApIHsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlQXR0YWNobWVudERhdGEgKSB7CiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uID0gJFN0ZEF0dGFjaG1lbnRPYmplY3QtPlN0ZEF0dGFjaG1lbnRTdGFuZGFyZFRlbXBsYXRlUGVybWlzc2lvbigKICAgICAgICAgICAgICAgIElEICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbiBuZSAncncnICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBdHRhY2htZW50RGF0YXskS2V5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17QXR0YWNobWVudE9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVBdHRhY2htZW50RGF0YSwKICAgICAgICBOYW1lICAgICAgICAgPT4gJ0lEcycsCiAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgU2l6ZSAgICAgICAgID0+IDYsCiAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtTZWxlY3RlZEF0dGFjaG1lbnRzfSwKICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICApOwoKICAgIG15ICRIVE1MVXRpbHNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyk7CgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyByZWZvcm1hdCBmcm9tIHBsYWluIHRvIGh0bWwKICAgICAgICBpZiAoICRQYXJhbXtDb250ZW50VHlwZX0gJiYgJFBhcmFte0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAgICAgJFBhcmFte1RlbXBsYXRlfSA9ICRIVE1MVXRpbHNPYmplY3QtPlRvSFRNTCgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17VGVtcGxhdGV9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHJlZm9ybWF0IGZyb20gaHRtbCB0byBwbGFpbgogICAgICAgIGlmICggJFBhcmFte0NvbnRlbnRUeXBlfSAmJiAkUGFyYW17Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgICAgICRQYXJhbXtUZW1wbGF0ZX0gPSAkSFRNTFV0aWxzT2JqZWN0LT5Ub0FzY2lpKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtUZW1wbGF0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGlzcGxheSB0ZW1wbGF0ZSBzdGF0ZSBwcmVzZWxlY3Rpb24KICAgICMgICBOT1RFOiB2aXNpYmlsaXR5IG9ubHkgZm9yIGZvcndhcmQgYW5kIHJlc3BvbnNlIGhhbmRsZWQgdmlhIEpTCiAgICBteSAlU3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKICAgICRQYXJhbXtTdGF0ZXN9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU3RhdGVzLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnUHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1ByZVNlbGVjdGVkVGlja2V0U3RhdGVJRH0sCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1VwZGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJXsgJFBhcmFte0Vycm9yc30gfSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgYXBwcm9wcmlhdGUgbWVzc2FnZXMgZm9yIFNlcnZlckVycm9yCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Vycm9yc30tPntOYW1lRXhpc3RzfSAmJiAkUGFyYW17RXJyb3JzfS0+e05hbWVFeGlzdHN9ID09IDEgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0V4aXN0TmFtZVNlcnZlckVycm9yJyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ05hbWVTZXJ2ZXJFcnJvcicgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRMYXlvdXRPYmplY3QtPntCcm93c2VyUmljaFRleHR9ICkgewoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRRdWV1ZU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25BZGQnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRmlsdGVyJyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0ltcG9ydEV4cG9ydFdpZGdldCcgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkU3RhbmRhcmRUZW1wbGF0ZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJyk7CiAgICBteSAlTGlzdCAgICAgICAgICAgICAgICAgICA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlTGlzdCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICBWYWxpZCAgPT4gJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPyAwIDogMSwKICAgICk7CgogICAgIyBpZiB0aGVyZSBhcmUgYW55IHJlc3VsdHMsIHRoZXkgYXJlIHNob3duCiAgICBpZiAoJUxpc3QpIHsKCiAgICAgICAgbXkgJUxpc3RHZXQ7CiAgICAgICAgZm9yIG15ICRJRCAoIHNvcnQga2V5cyAlTGlzdCApIHsKICAgICAgICAgICAgJXsgJExpc3RHZXR7JElEfSB9ID0gJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QtPlN0YW5kYXJkVGVtcGxhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkSUQsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRMaXN0R2V0eyRJRH0tPntTb3J0TmFtZX0gPSAkTGlzdEdldHskSUR9LT57VGVtcGxhdGVUeXBlfSAuICRMaXN0R2V0eyRJRH0tPntOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHZhbGlkIGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgICAgIElEOgogICAgICAgIGZvciBteSAkSUQgKCBzb3J0IHsgJExpc3RHZXR7JGF9LT57U29ydE5hbWV9IGNtcCAkTGlzdEdldHskYn0tPntTb3J0TmFtZX0gfSBrZXlzICVMaXN0R2V0ICkKICAgICAgICB7CgogICAgICAgICAgICBteSAlRGF0YSA9ICV7ICRMaXN0R2V0eyRJRH0gfTsKCiAgICAgICAgICAgICMgY2hlY2sgcXVldWUgcGVybWlzc2lvbnMgb2YgbGlua2VkIHRlbXBsYXRlcy4KICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xpZ2h0QWRtaW59ICkgewogICAgICAgICAgICAgICAgbXkgJVF1ZXVlcyA9ICRRdWV1ZU9iamVjdC0+UXVldWVTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCggU3RhbmRhcmRUZW1wbGF0ZUlEID0+ICREYXRhe0lEfSApOwogICAgICAgICAgICAgICAgJERhdGF7UGVybWlzc2lvbn0gPSAkUXVldWVPYmplY3QtPlF1ZXVlTGlzdFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRHMgPT4gWyBrZXlzICVRdWV1ZXMgXSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAgPT4gJ3J3JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IElEIGlmICEkRGF0YXtQZXJtaXNzaW9ufTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQFNlbGVjdGVkQXR0YWNobWVudDsKICAgICAgICAgICAgbXkgJVNlbGVjdGVkQXR0YWNobWVudERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RkQXR0YWNobWVudCcpLT5TdGRBdHRhY2htZW50U3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBTdGFuZGFyZFRlbXBsYXRlSUQgPT4gJElELAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0ZWRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNlbGVjdGVkQXR0YWNobWVudCwgJEtleTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IFByZVNlbGVjdGVkVGlja2V0U3RhdGVJRCB0byBzdHJpbmcKICAgICAgICAgICAgbXkgJFByZVNlbGVjdGVkVGlja2V0U3RhdGUgPSAnLSc7CiAgICAgICAgICAgIGlmICggJERhdGF7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVTZWxlY3RlZFRpY2tldFN0YXRlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN0YXRlJyktPlN0YXRlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFN0YXRlSUQgPT4gJERhdGF7UHJlU2VsZWN0ZWRUaWNrZXRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVmFsaWQgICAgICAgICAgICAgICAgICA9PiAkVmFsaWRMaXN0eyAkRGF0YXtWYWxpZElEfSB9LAogICAgICAgICAgICAgICAgICAgIFByZVNlbGVjdGVkVGlja2V0U3RhdGUgPT4gJFByZVNlbGVjdGVkVGlja2V0U3RhdGUsCiAgICAgICAgICAgICAgICAgICAgJURhdGEsCiAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudHMgPT4gc2NhbGFyIEBTZWxlY3RlZEF0dGFjaG1lbnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgZWxzZSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Kernel/Output/HTML/Templates/Standard/AdminServiceTemplates.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJPdmVydmlldyIpICVdCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIExheW91dEZpeGVkU2lkZWJhciBTaWRlYmFyRmlyc3QiPgogICAgPGgxIGNsYXNzPSJJbnZpc2libGVUZXh0Ij5bJSBUcmFuc2xhdGUoIk1hbmFnZSBUZW1wbGF0ZS1TZXJ2aWNlIFJlbGF0aW9ucyIpIHwgaHRtbCAlXTwvaDE+CgogICAgWyUgQnJlYWRjcnVtYlBhdGggPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRlKCdNYW5hZ2UgVGVtcGxhdGUtU2VydmljZSBSZWxhdGlvbnMnKSwKICAgICAgICAgICAgICAgIExpbmsgPT4gRW52KCJBY3Rpb24iKSwKICAgICAgICAgICAgfSwKICAgICAgICBdCiAgICAlXQoKICAgIFslIElGIERhdGEuQnJlYWRjcnVtYlRpdGxlICVdCiAgICAgICAgICAgIFslIFVTRSBFZGl0VGl0bGUgPSBTdHJpbmcoRGF0YS5CcmVhZGNydW1iVGl0bGUpICVdCiAgICAgICAgICAgIFslIEJyZWFkY3J1bWJQYXRoLnB1c2goeyBOYW1lID0+IEVkaXRUaXRsZS5hcHBlbmQoICIgJyIsIERhdGEuTmFtZSwgIiciICkgfSkgJV0KICAgIFslIEVORCAlXQoKICAgIFslIElOQ0xVREUgIkJyZWFkY3J1bWIudHQiIFBhdGggPSBCcmVhZGNydW1iUGF0aCAlXQoKICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDxkaXYgY2xhc3M9IlNpZGViYXJDb2x1bW4iPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQWN0aW9uTGlzdCIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWw+WyUgVHJhbnNsYXRlKCJBY3Rpb25zIikgfCBodG1sICVdPC9sYWJlbD48L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbkxpc3QiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gRnVsbHNpemUgQ2VudGVyIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtbGVmdCI+PC9pPlslIFRyYW5zbGF0ZSgiR28gdG8gb3ZlcnZpZXciKSB8IGh0bWwgJV08L3NwYW4+PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJBY3Rpb25PdmVydmlldyIpICVdCiAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGlvbkxpc3QiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRmlsdGVyIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlciI+WyUgVHJhbnNsYXRlKCJGaWx0ZXIiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlciIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIikgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZpbHRlciIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXJUZW1wbGF0ZSIpICVdCiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj48bGFiZWwgZm9yPSJGaWx0ZXJUZW1wbGF0ZXMiPlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciBUZW1wbGF0ZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyVGVtcGxhdGVzIiBjbGFzcz0iRmlsdGVyQm94IiBwbGFjZWhvbGRlcj0iWyUgVHJhbnNsYXRlKCJKdXN0IHN0YXJ0IHR5cGluZyB0byBmaWx0ZXIuLi4iKSB8IGh0bWwgJV0iIG5hbWU9IkZpbHRlclRlbXBsYXRlcyIgdmFsdWU9IiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiRmlsdGVyIGZvciB0ZW1wbGF0ZXMiKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVyVGVtcGxhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGaWx0ZXJTZXJ2aWNlIikgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPjxsYWJlbCBmb3I9IkZpbHRlclNlcnZpY2VzIj5bJSBUcmFuc2xhdGUoIkZpbHRlciBmb3IgU2VydmljZXMiKSB8IGh0bWwgJV08L2xhYmVsPjwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iRmlsdGVyU2VydmljZXMiIGNsYXNzPSJGaWx0ZXJCb3giIHBsYWNlaG9sZGVyPSJbJSBUcmFuc2xhdGUoIkp1c3Qgc3RhcnQgdHlwaW5nIHRvIGZpbHRlci4uLiIpIHwgaHRtbCAlXSIgbmFtZT0iRmlsdGVyU2VydmljZXMiIHZhbHVlPSIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZpbHRlciBmb3Igc2VydmljZXMiKSB8IGh0bWwgJV0iIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRmlsdGVyU2VydmljZSIpICVdCgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KClslIFJlbmRlckJsb2NrU3RhcnQoIk92ZXJ2aWV3UmVzdWx0IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj5bJSBUcmFuc2xhdGUoIk92ZXJ2aWV3IikgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQgTGF5b3V0R3JpZCBDb2x1bW5zV2l0aFNwYWNpbmciPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2l6ZTFvZjIiPgogICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0iVGFibGVsaWtlIiBpZD0iVGVtcGxhdGVzIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJIZWFkZXIiPlslIFRyYW5zbGF0ZSgiVGVtcGxhdGVzIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vVGVtcGxhdGVzRm91bmRNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGk+WyUgVHJhbnNsYXRlKCJObyBkYXRhIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJOb1RlbXBsYXRlc0ZvdW5kTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTGlzdDFuIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1bJSBEYXRhLlN1YmFjdGlvbiB8IHVyaSAlXTtJRD1bJSBEYXRhLklEIHwgdXJpICVdIiBjbGFzcz0iQXNCbG9jayI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlzdDFuIikgJV0KICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTaXplMW9mMiI+CiAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJUYWJsZWxpa2UiIGlkPSJTZXJ2aWNlcyI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iSGVhZGVyIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2VzIikgfCBodG1sICVdPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPSJGaWx0ZXJNZXNzYWdlIEhpZGRlbiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvbGk+ClslIFJlbmRlckJsb2NrU3RhcnQoIk5vU2VydmljZXNGb3VuZE1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5bJSBUcmFuc2xhdGUoIk5vIGRhdGEgZm91bmQuIikgfCBodG1sICVdPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vU2VydmljZXNGb3VuZE1zZyIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpc3RuMSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT48YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtTdWJhY3Rpb249WyUgRGF0YS5TdWJhY3Rpb24gfCB1cmkgJV07SUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSIgY2xhc3M9IkFzQmxvY2siPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+PC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIkxpc3RuMSIpICVdCiAgICAgICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrRW5kKCJPdmVydmlld1Jlc3VsdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5CcmVhZGNydW1iVGl0bGUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIERhdGEuQWN0aW9uSG9tZSB8IHVyaSAlXTtTdWJhY3Rpb249Q2hhbmdlO1slIERhdGEuU2VydmljZSB8IHVyaSAlXUlEPVslIERhdGEuSUQgfCB1cmkgJV0iPlslIERhdGEuTmFtZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICA8L2gyPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCAiPgogICAgICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSJbJSBFbnYoIkNHSUhhbmRsZSIpICVdIiBtZXRob2Q9InBvc3QiIG5hbWU9Im1hdHJpeCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkNoYW5nZVslIERhdGEuVHlwZSB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJRCIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29udGludWVBZnRlclNhdmUiIGlkPSJDb250aW51ZUFmdGVyU2F2ZSIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iRGF0YVRhYmxlIFZhcmlhYmxlV2lkdGgiIGlkPSJJdGVtc1RhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD5bJSBUcmFuc2xhdGUoRGF0YS5WaXNpYmxlTmVUeXBlKSB8IGh0bWwgJV08L3RoPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDaGFuZ2VIZWFkZXIiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iWyUgRGF0YS5NYXJrIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9IlNlbGVjdEFsbEl0ZW1zU2VsZWN0ZWQiIG5hbWU9Ikl0ZW1zU2VsZWN0ZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlRvZ2dsZSBhY3RpdmUgc3RhdGUgZm9yIGFsbCIpIHwgaHRtbCAlXSIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJBY3RpdmUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ2hhbmdlSGVhZGVyIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTm9EYXRhRm91bmRNc2dMaXN0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iWyUgRGF0YS5Db2xTcGFuIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm8gZGF0YSBmb3VuZC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIk5vRGF0YUZvdW5kTXNnTGlzdCIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkNoYW5nZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZG1pblslIERhdGEuTmVUeXBlIHwgdXJpICVdO1N1YmFjdGlvbj1DaGFuZ2U7WyUgRGF0YS5TZXJ2aWNlIHwgdXJpICVdSUQ9WyUgRGF0YS5JRCB8IHVyaSAlXSI+WyUgRGF0YS5OYW1lIHwgaHRtbCAlXTwvYT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iWyUgRGF0YS5NYXJrIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0iSXRlbXNTZWxlY3RlZCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVG9nZ2xlIGFjdGl2ZSBzdGF0ZSBmb3IgJXMiLCBEYXRhLk5hbWUpIHwgaHRtbCAlXSIgdmFsdWU9IlslIERhdGEuSUQgfCBodG1sICVdIiBbJSBEYXRhLlNlbGVjdGVkICVdLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbXNBbGwiIHZhbHVlPSJbJSBEYXRhLklEIHwgaHRtbCAlXSIvPgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgUmVuZGVyQmxvY2tFbmQoIkNoYW5nZVJvdyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9IkZpbHRlck1lc3NhZ2UgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iMiI+WyUgVHJhbnNsYXRlKCJObyBtYXRjaGVzIGZvdW5kLiIpIHwgaHRtbCAlXTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdEFuZENvbnRpbnVlIiB0eXBlPSJidXR0b24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXTwvc3Bhbj48L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJvciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJDYWxsRm9yQWN0aW9uIFByaW1hcnkiIGlkPSJTdWJtaXQiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU2F2ZSIpIHwgaHRtbCAlXSI+PHNwYW4+WyUgVHJhbnNsYXRlKCJTYXZlIGFuZCBmaW5pc2giKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdQWN0aW9uPVslIEVudigiQWN0aW9uIikgJV0iPlslIFRyYW5zbGF0ZSgiQ2FuY2VsIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJDaGFuZ2UiKSAlXQogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIk92ZXJ2aWV3IikgJV0K</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerTicketMessage.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNDhiYzU5MWMwYjllNjM0NzFmM2Q1YzQ1NTRiM2ZmNDkwNzViNWJhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldE1lc3NhZ2UudHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQo8ZGl2IGlkPSJvb29Db250ZW50IiBjbGFzcz0iQVJJQVJvbGVNYWluIFRpY2tldENvbXBvc2UiPgogICAgPGRpdiBpZD0ib29vSGVhZGVyIj4KICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJDcmVhdGUgYSBuZXcgVGlja2V0IikgfCBodG1sICVdPC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ib29vTWFpbkJveCIgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxmb3JtIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSAlXSIgbWV0aG9kPSJwb3N0IiBuYW1lPSJjb21wb3NlIiBpZD0iTmV3Q3VzdG9tZXJUaWNrZXQiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZCIgaWQ9IkV4cGFuZCIgdmFsdWU9IiIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGcm9tQ2hhdElEIiB2YWx1ZT0iWyUgRGF0YS5Gcm9tQ2hhdElEIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJNb2R1bGFyRm9ybSI+CgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBc3Rlcmlza0V4cGxhbmF0aW9uIikgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3cgUm93X0R5bmFtaWNGaWVsZF9bJSBEYXRhLk5hbWUgfCBodG1sICVdWyUgRGF0YS5IaWRkZW5DbGFzcyB8IGh0bWwgJV0iIFslIERhdGEuSGlkZGVuU3R5bGUgfCBodG1sICVdPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmllbGQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9vbHRpcCBvb29Ub29sdGlwIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBEYXRhLlRvb2x0aXAgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlQ2F0ZWdvcnkiKSAlXQoKWyUgUmVuZGVyQmxvY2tTdGFydCgiVGlja2V0VHlwZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlR5cGVJRCIgY2xhc3M9Ik1hbmRhdG9yeSI+WyUgVHJhbnNsYXRlKCJUeXBlIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlR5cGVJREludmFsaWQgfCBodG1sICVdIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0VHlwZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJRdWV1ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVG9TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXN0IiBjbGFzcz0iTWFuZGF0b3J5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiVG8iKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUXVldWVJbnZhbGlkIHwgaHRtbCAlXSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlF1ZXVlIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIlRpY2tldFNlcnZpY2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNlcnZpY2VTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJRCIgY2xhc3M9Ik1hbmRhdG9yeSI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+PC9sYWJlbD4KICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj5bJSBUcmFuc2xhdGUoIlNlcnZpY2UiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgIFslIEVORCAlXQogICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U2VydmljZSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJUaWNrZXRTTEEiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlNMQVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICBbJSBJRiBEYXRhLlNMQU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2VydmljZSBsZXZlbCBhZ3JlZW1lbnQiKSB8IGh0bWwgJV0iIGNsYXNzPSJNYW5kYXRvcnkiPlslIFRyYW5zbGF0ZSgiU0xBIikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IDwvbGFiZWw+CiAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNMQUlEIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIGxldmVsIGFncmVlbWVudCIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJTTEEiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgIFslIEVORCAlXQogICAgWyUgSUYgRGF0YS5TTEFNYW5kYXRvcnkgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU0xBSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiVGlja2V0U0xBIikgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZUR5bmFtaWNGaWVsZHMiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgSUYgRGF0YS5Ub29sdGlwICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRvb2x0aXAgb29vVG9vbHRpcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ib29vZm8gb29vZm8taGVscCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuVG9vbHRpcCkgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlRHluYW1pY0ZpZWxkcyIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgSUYgRGF0YS5Ub29sdGlwICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRvb2x0aXAgb29vVG9vbHRpcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0ib29vZm8gb29vZm8taGVscCI+PC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuVG9vbHRpcCkgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgWyUgRU5EICVdCiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGFiZWwgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRHluYW1pY0ZpZWxkX1RpdGxlTWVzc2FnZSIpICVdCgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFslIERhdGEuU3ViamVjdEhpZGRlbkNsYXNzIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1YmplY3QiKSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGlkPSJTdWJqZWN0IiBuYW1lPSJTdWJqZWN0IiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgY2xhc3M9IlslIERhdGEuU3ViamVjdFZhbGlkYXRlIHwgaHRtbCAlXSBbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiIGNsYXNzPSJNYW5kYXRvcnkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2VbJSBEYXRhLlN1YmplY3RJbnZhbGlkIHwgaHRtbCAlXSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyVGVtcGxhdGUKWyUgUmVuZGVyQmxvY2tTdGFydCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuU3RhbmRhcmRUZW1wbGF0ZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YW5kYXJkVGVtcGxhdGVJRCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTmV3IHRpY2tldCB0ZW1wbGF0ZSIpIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKCJUZXh0IFRlbXBsYXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIlNldHRpbmcgYSB0ZW1wbGF0ZSB3aWxsIG92ZXJ3cml0ZSBhbnkgdGV4dCBvciBhdHRhY2htZW50LiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhbmRhcmRUZW1wbGF0ZSIpICVdCiMgRU8gQ3VzdG9tZXJUZW1wbGF0ZQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBbJSBEYXRhLkJvZHlIaWRkZW5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRIb2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iUmljaFRleHQiIGNsYXNzPSJSaWNoVGV4dCBbJSBEYXRhLkJvZHlWYWxpZGF0ZSB8IGh0bWwgJV0gWyUgRGF0YS5Cb2R5SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSJbJSBDb25maWcoIlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSIpICVdIj5bJSBEYXRhLkJvZHkgfCBodG1sICVdPC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuQm9keUludmFsaWQgfCBodG1sICVdIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0IiBjbGFzcz0iTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFslIERhdGEuQXR0YWNobWVudHNIaWRkZW5DbGFzcyB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Im9vb0F0dGFjaG1lbnRzIiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRG5EVXBsb2FkQm94Ij4KWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0N1c3RvbWVyQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIlByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJQcmlvcml0eSIpICVdCgogICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICA8ZGl2IGlkPSJCb3R0b21BY3Rpb25Sb3ciIGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0ic3VibWl0UmljaFRleHQiIGNsYXNzPSJvb29MIiBhY2Nlc3NrZXk9ImciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIj5bJSBUcmFuc2xhdGUoIlN1Ym1pdCIpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Zvcm0+CiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/CustomerTicketZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNDhiYzU5MWMwYjllNjM0NzFmM2Q1YzQ1NTRiM2ZmNDkwNzViNWJhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9DdXN0b21lclRpY2tldFpvb20udHQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKPGRpdiBpZD0nb29vQ29udGVudCcgY2xhc3M9IlRpY2tldFpvb20gQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgaWQ9J29vb0hlYWRlcidbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vV2l0aFN1Yic+CiAgICAgICAgICAgIDxoMiB0aXRsZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9oMj4KICAgICAgICAgICAgPHAgY2xhc3M9Im9vbzEyZyIgdGl0bGU9IlslIENvbmZpZygnVGlja2V0OjpIb29rJykgJV1bJSBDb25maWcoJ1RpY2tldDo6SG9va0RpdmlkZXInKSAlXVslIERhdGEuVGlja2V0TnVtYmVyIHwgaHRtbCAlXSI+WyUgRGF0YS5Ib29rICVdWyUgQ29uZmlnKCdUaWNrZXQ6Okhvb2tEaXZpZGVyJykgJV1bJSBEYXRhLlRpY2tldE51bWJlciB8IGh0bWwgJV08L3A+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0nb29vQXZhdGFyJz4KICAgICAgICAgICAgWyUgSUYgRGF0YS5BdmF0YXIgJV0KICAgICAgICAgICAgICAgIDxpbWcgc3JjPSJbJSBEYXRhLkF2YXRhciAlXSIgLz4KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkluaXRpYWxzIj5bJSBEYXRhLlVzZXJJbml0aWFscyB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwIGNsYXNzPSdvb28xMic+WyUgRGF0YS5Vc2VyRmlyc3RuYW1lIHwgaHRtbCAlXSBbJSBEYXRhLlVzZXJMYXN0bmFtZSB8IGh0bWwgJV08L3A+ClslIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdIZWFkZXInICVdCiAgICAgICAgPGRpdiBjbGFzcz0nb29vSW5mb0Jsb2NrJz4KICAgICAgICAgICAgPHAgY2xhc3M9J29vb0luZm8gb29vMTInPjxpIGNsYXNzPSJvb29mbyBvb29mby1pbmZvIj48L2k+IDxzcGFuPlslIFRyYW5zbGF0ZSgnSW5mb3JtYXRpb24nKSB8IGh0bWwgJV08L3NwYW4+PC9wPgogICAgICAgICAgICBbJSBJTkNMVURFICJDdXN0b21lclRpY2tldFpvb20vVGlja2V0SW5mby50dCIgJV0KICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgPGRpdj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDxidXR0b24gaWQ9IlJlcGx5QnV0dG9uIiBjbGFzcz0iRG9udFByaW50IG9vb00iPjxzcGFuPlslIFRyYW5zbGF0ZSgiUmVwbHkiKSB8IGh0bWwgJV0gPC9zcGFuPjxpIGNsYXNzPSJvb29mbyBvb29mby1hcnJvd19yMiI+PC9pPjwvYnV0dG9uPgpbJSBSZW5kZXJCbG9ja0VuZCgiUmVwbHlCdXR0b24iKSAlXQogICAgICAgIDwvZGl2PgogICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1tb3JlX3YiPjwvaT4KICAgICAgICA8ZGl2IGlkPSdvb29DYXRlZ29yaWVzJz4KWyUgUmVuZGVyQmxvY2tTdGFydCgiQ2F0ZWdvcmllcyIpICVdCiAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLkxpbmsgJV0KICAgICAgICAgICAgICAgIFslIElGIERhdGEuQ29uZmlnLlRyYW5zbGF0ZSAlXQogICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJvb29DYXRlZ29yeSBvb28xMCIgc3R5bGU9ImJhY2tncm91bmQtY29sb3I6WyUgRGF0YS5Db2xvciB8IGh0bWwgJV0iIGhyZWY9IlslIERhdGEuQ29uZmlnLkxpbmsgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iIHRpdGxlPSJbJSBJRiBEYXRhLkNvbmZpZy5QcmVmaXggJV1bJSBEYXRhLkNvbmZpZy5QcmVmaXggfCBodG1sICVdWyUgRU5EICVdWyUgRGF0YS5UZXh0IHwgSW50ZXJwb2xhdGUgfCBUcmFuc2xhdGUgfCBodG1sICVdIiB0YXJnZXQ9Il9ibGFuayI+WyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgVHJhbnNsYXRlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgIFslIEVMU0UgJV0KICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0ib29vQ2F0ZWdvcnkgb29vMTAiIHN0eWxlPSJiYWNrZ3JvdW5kLWNvbG9yOlslIERhdGEuQ29sb3IgfCBodG1sICVdIiBocmVmPSJbJSBEYXRhLkNvbmZpZy5MaW5rIHwgSW50ZXJwb2xhdGUgfCBodG1sICVdIiB0aXRsZT0iWyUgSUYgRGF0YS5Db25maWcuUHJlZml4ICVdWyUgRGF0YS5Db25maWcuUHJlZml4IHwgaHRtbCAlXVslIEVORCAlXVslIERhdGEuVGV4dCB8IEludGVycG9sYXRlIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L2E+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Db25maWcuVHJhbnNsYXRlICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSIgdGl0bGU9IlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IFRyYW5zbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9Im9vb0NhdGVnb3J5IG9vbzEwIiBzdHlsZT0iYmFja2dyb3VuZC1jb2xvcjpbJSBEYXRhLkNvbG9yIHwgaHRtbCAlXSIgdGl0bGU9IlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV0iPlslIElGIERhdGEuQ29uZmlnLlByZWZpeCAlXVslIERhdGEuQ29uZmlnLlByZWZpeCB8IGh0bWwgJV1bJSBFTkQgJV1bJSBEYXRhLlRleHQgfCBJbnRlcnBvbGF0ZSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgWyUgRU5EICVdClslIFJlbmRlckJsb2NrRW5kKCJDYXRlZ29yaWVzIikgJV0KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0nb29vTWFpbkJveCcgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9IlByb2Nlc3NBY3Rpdml0aWVzIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTmV4dEFjdGl2aXRpZXMiKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJOZXh0QWN0aXZpdGllcyI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkFjdGl2aXR5RGlhbG9nRGlyZWN0U3VibWl0IikgJV0KICAgICAgICAgICAgICAgIDxmb3JtIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGFjdGlvbj0iWyUgRW52KCJDR0lIYW5kbGUiKSB8IGh0bWwgJV0iIG1ldGhvZD0icG9zdCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQ3VzdG9tZXJUaWNrZXRab29tIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVBY3Rpdml0eURpYWxvZyIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcm9jZXNzRW50aXR5SUQiIHZhbHVlPSJbJSBEYXRhLlByb2Nlc3NFbnRpdHlJRCB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpdml0eURpYWxvZ0VudGl0eUlEIiB2YWx1ZT0iWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxidXR0b24gaWQ9IkJ1dHRvbl9bJSBEYXRhLkFjdGl2aXR5RGlhbG9nRW50aXR5SUQgfCB1cmkgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV0iIGNsYXNzPSJvb29NIEFjdGl2aXR5U3VibWl0QnV0dG9uIiB0eXBlPSJzdWJtaXQiPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvYnV0dG9uPgogICAgICAgICAgICAgICAgPC9mb3JtPgpbJSBSZW5kZXJCbG9ja0VuZCgiQWN0aXZpdHlEaWFsb2dEaXJlY3RTdWJtaXQiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBY3Rpdml0eURpYWxvZyIpICVdCiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPSJCdXR0b25fWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdIiBjbGFzcz0ib29vTSBBY3Rpdml0eVN0YXJ0QnV0dG9uIj5bJSBUcmFuc2xhdGUoRGF0YS5OYW1lKSB8IGh0bWwgJV08L2J1dHRvbj4KWyUgUmVuZGVyQmxvY2tFbmQoIkFjdGl2aXR5RGlhbG9nIikgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJOZXh0QWN0aXZpdGllcyIpICVdCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHVsIGlkPSdvb29BcnRpY2xlTGlzdCdbJSBJRiBEYXRhLlRpY2tldEluZm9EaXNwbGF5VHlwZSA9PSAnUGVybWFuZW50JyAlXSBjbGFzcz0ib29vVGlja2V0SW5mb1Blcm1hbmVudCJbJSBFTkQgJV0+CiAgICAgICAgPC91bD4KICAgICAgICA8dWwgaWQ9J29vb0FydGljbGVMaXN0RXhwYW5kZWQnWyUgSUYgRGF0YS5UaWNrZXRJbmZvRGlzcGxheVR5cGUgPT0gJ1Blcm1hbmVudCcgJV0gY2xhc3M9Im9vb1RpY2tldEluZm9QZXJtYW5lbnQiWyUgRU5EICVdPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJQcm9jZXNzQWN0aXZpdHkiKSAlXQogICAgICAgICAgICA8bGkgaWQ9IlByb2Nlc3NfWyUgRGF0YS5BY3Rpdml0eURpYWxvZ0VudGl0eUlEIHwgdXJpICVdIiBjbGFzcz0iQWN0aXZpdHkiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5BY3Rpdml0eUhUTUwgJV0KICAgICAgICAgICAgPC9saT4KWyUgUmVuZGVyQmxvY2tFbmQoIlByb2Nlc3NBY3Rpdml0eSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkZvbGxvd1VwIikgJV0KPGxpIGlkPSJGb2xsb3dVcCIgY2xhc3M9IlslIERhdGEuRm9sbG93VXBWaXNpYmxlIHwgaHRtbCAlXSBBY3Rpdml0eSI+CiAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0jRm9sbG93VXAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9IlJlcGx5Q3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJWYWxpZGF0ZSBQcmV2ZW50TXVsdGlwbGVTdWJtaXRzIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmUiIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSJbJSBEYXRhLlRpY2tldElEIHwgaHRtbCAlXSIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBcnRpY2xlSUQiIHZhbHVlPSJbJSBEYXRhLkFydGljbGVJRCB8IGh0bWwgJV0iIC8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iWyUgRGF0YS5Gb3JtSUQgfCBodG1sICVdIiAvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZyb21DaGF0SUQiIHZhbHVlPSJbJSBEYXRhLkZyb21DaGF0SUQgfCBodG1sICVdIiAvPgoKICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzZW5nZXIiPgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCiAgICAgICAgICAgIDxwIGNsYXNzPSJBc3Rlcmlza0V4cGxhbmF0aW9uIj5bJSBUcmFuc2xhdGUoIkFsbCBmaWVsZHMgbWFya2VkIHdpdGggYW4gYXN0ZXJpc2sgKCopIGFyZSBtYW5kYXRvcnkuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQXN0ZXJpc2tFeHBsYW5hdGlvbiIpICVdCgogICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9Ik1vZHVsYXJGb3JtIERvbnRQcmludCI+ClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93IFJvd19EeW5hbWljRmllbGRfWyUgRGF0YS5OYW1lIHwgaHRtbCAlXVslIERhdGEuSGlkZGVuQ2xhc3MgfCBodG1sICVdIiBbJSBEYXRhLkhpZGRlblN0eWxlIHwgaHRtbCAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkZpZWxkICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlRvb2x0aXAgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlRvb2x0aXAgb29vVG9vbHRpcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9Im9vb2ZvIG9vb2ZvLWhlbHAiPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKERhdGEuVG9vbHRpcCkgfCBodG1sIHwgaHRtbF9saW5lX2JyZWFrICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkxhYmVsICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkR5bmFtaWNGaWVsZF9UaXRsZU1lc3NhZ2UiKSAlXQoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJEb250UHJpbnQiIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdIiB2YWx1ZT0iWyUgRGF0YS5TdWJqZWN0IHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN1YmplY3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTdWJqZWN0IikgfCBodG1sICVdOgogICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YW5kYXJkVGVtcGxhdGVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTdGFuZGFyZFRlbXBsYXRlSUQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5ldyB0aWNrZXQgdGVtcGxhdGUiKSB8IGh0bWwgJV0iPlslIFRyYW5zbGF0ZSgiVGV4dCBUZW1wbGF0ZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+WyUgVHJhbnNsYXRlKCJTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YW5kYXJkVGVtcGxhdGUiKSAlXQojIEVPIEN1c3RvbWVyVGVtcGxhdGUKCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJSb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkQ2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRIb2xkZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0aXRsZT0iWyUgVHJhbnNsYXRlKCJSZXBseSIpIHwgaHRtbCAlXSIgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgRG9udFByaW50IFZhbGlkYXRlX1JlcXVpcmVkUmljaFRleHQgWyUgRGF0YS5SaWNoVGV4dEludmFsaWQgfCBodG1sICVdIiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iWyUgQ29uZmlnKCJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUiKSB8IGh0bWwgJV0iPlslIERhdGEuQm9keSB8IGh0bWwgJV08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UgTm9KYXZhU2NyaXB0TWVzc2FnZVslIERhdGEuUmljaFRleHRJbnZhbGlkIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJpY2hUZXh0IiBjbGFzcz0iTWFuZGF0b3J5Ij5bJSBUcmFuc2xhdGUoIlRleHQiKSB8IGh0bWwgJV0gPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj48L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUm93Ij4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZENlbGwiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJvb29BdHRhY2htZW50cyIgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkRuRFVwbG9hZEJveCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0N1c3RvbWVyQXR0YWNobWVudExpc3QudHQiICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KClslIFJlbmRlckJsb2NrU3RhcnQoIkR5bmFtaWNGaWVsZF9UaXRsZUNhdGVnb3J5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfRHluYW1pY0ZpZWxkX1slIERhdGEuTmFtZSB8IGh0bWwgJV1bJSBEYXRhLkhpZGRlbkNsYXNzIHwgaHRtbCAlXSIgWyUgRGF0YS5IaWRkZW5TdHlsZSB8IGh0bWwgJV0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5GaWVsZCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5Ub29sdGlwICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJUb29sdGlwIG9vb1Rvb2x0aXAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJvb29mbyBvb29mby1oZWxwIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZShEYXRhLlRvb2x0aXApIHwgaHRtbCB8IGh0bWxfbGluZV9icmVhayAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5MYWJlbCAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJEeW5hbWljRmllbGRfVGl0bGVDYXRlZ29yeSIpICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFN0YXRlIikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5OZXh0U3RhdGVzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU3RhdGVJRCI+WyUgVHJhbnNsYXRlKCJOZXh0IHN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkZvbGxvd1VwU3RhdGUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGb2xsb3dVcFByaW9yaXR5IikgJV0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRDZWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Qcmlvcml0eVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPlslIFRyYW5zbGF0ZSgiUHJpb3JpdHkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXBQcmlvcml0eSIpICVdCgpbJSBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KCiAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IkNsb3NlQnV0dG9uIG9vb1hTIj5bJSBUcmFuc2xhdGUoIkRpc2NhcmQiKSB8IGh0bWwgJV08L2J1dHRvbj48YnV0dG9uIHR5cGU9InN1Ym1pdCIgdmFsdWU9IlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdIiBjbGFzcz0ib29vWFMiPlslIFRyYW5zbGF0ZSgiU3VibWl0IikgfCBodG1sICVdPC9idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgPC9mb3JtPgo8L2xpPgpbJSBSZW5kZXJCbG9ja0VuZCgiRm9sbG93VXAiKSAlXQpbJSBJRiBEYXRhLk5vQXJ0aWNsZXMgJV0KICAgICAgICAgICAgPGxpIGNsYXNzPSdFbXB0eU1lc3NhZ2UnPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGl0ZW0gaGFzIG5vIGFydGljbGVzIHlldC4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9saT4KWyUgRUxTRSAlXQogICAgICAgICAgICBbJSBEYXRhLkFydGljbGVzICVdClslIEVORCAlXQogICAgICAgIDwvdWw+ClslIElGIERhdGEuVGlja2V0SW5mb0Rpc3BsYXlUeXBlID09ICdQZXJtYW5lbnQnICVdCiAgICAgICAgICAgIFslIElOQ0xVREUgIkN1c3RvbWVyVGlja2V0Wm9vbS9UaWNrZXRJbmZvLnR0IiAlXQpbJSBFTkQgJV0KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Location="Custom/Kernel/System/Service.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA1YWE0ODUyNzEzZWU0YjM4NDU4OTE2ODJmNDM4NTkzOWZkMDg2NTQ2IC0gS2VybmVsL1N5c3RlbS9TZXJ2aWNlLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgKHF3KDphbGwpKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUcmFuc2xhdGlvbnMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UgLSBzZXJ2aWNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgc2VydmljZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgbXkgJFNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2VydmljZScpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnU2VydmljZSc7CiAgICAkU2VsZi0+e0NhY2hlVFRMfSAgPSA2MCAqIDYwICogMjQgKiAyMDsKCiAgICAjIGxvYWQgZ2VuZXJhdG9yIHByZWZlcmVuY2VzIG1vZHVsZQogICAgbXkgJEdlbmVyYXRvck1vZHVsZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnU2VydmljZTo6UHJlZmVyZW5jZXNNb2R1bGUnKQogICAgICAgIHx8ICdLZXJuZWw6OlN5c3RlbTo6U2VydmljZTo6UHJlZmVyZW5jZXNEQic7CiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBTZXJ2aWNlTGlzdCgpCgpyZXR1cm4gYSBoYXNoIGxpc3Qgb2Ygc2VydmljZXMKCiAgICBteSAlU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3QoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgcmVhZCBjYWNoZQogICAgbXkgJENhY2hlS2V5ID0gJ1NlcnZpY2VMaXN0OjpWYWxpZDo6JyAuICRQYXJhbXtWYWxpZH07CgogICAgaWYgKCAkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQgJFBhcmFte0tlZXBDaGlsZHJlbn0gJiYgJFBhcmFte0tlZXBDaGlsZHJlbn0gZXEgJzEnICkgewogICAgICAgICRDYWNoZUtleSAuPSAnOjpLZWVwQ2hpbGRyZW46OicgLiAkUGFyYW17S2VlcENoaWxkcmVufTsKICAgIH0KCiAgICBteSAkQ2FjaGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCB2YWxpZF9pZCBGUk9NIHNlcnZpY2UnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTZXJ2aWNlTGlzdDsKICAgIG15ICVTZXJ2aWNlVmFsaWRMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFNlcnZpY2VMaXN0eyAkUm93WzBdIH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VWYWxpZExpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMl07CiAgICB9CgogICAgaWYgKCAhJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlU2VydmljZUxpc3QsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJVNlcnZpY2VMaXN0IGlmICEkUGFyYW17VmFsaWR9OwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGlkcwogICAgbXkgQFZhbGlkSURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBkdXBsaWNhdGUgc2VydmljZSBsaXN0CiAgICBteSAlU2VydmljZUxpc3RUbXAgPSAlU2VydmljZUxpc3Q7CgogICAgIyBhZGQgc3VmZml4IGZvciBjb3JyZWN0IHNvcnRpbmcKICAgIGZvciBteSAkU2VydmljZUlEICggc29ydCBrZXlzICVTZXJ2aWNlTGlzdFRtcCApIHsKICAgICAgICAkU2VydmljZUxpc3RUbXB7JFNlcnZpY2VJRH0gLj0gJzo6JzsKICAgIH0KCiAgICBteSAlU2VydmljZUludmFsaWRMaXN0OwogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IHsgJFNlcnZpY2VMaXN0VG1weyRhfSBjbXAgJFNlcnZpY2VMaXN0VG1weyRifSB9IGtleXMgJVNlcnZpY2VMaXN0VG1wICkKICAgIHsKCiAgICAgICAgbXkgJFZhbGlkID0gc2NhbGFyIGdyZXAgeyAkXyBlcSAkU2VydmljZVZhbGlkTGlzdHskU2VydmljZUlEfSB9IEBWYWxpZElEczsKCiAgICAgICAgbmV4dCBTRVJWSUNFSUQgaWYgJFZhbGlkOwoKICAgICAgICAkU2VydmljZUludmFsaWRMaXN0eyAkU2VydmljZUxpc3R7JFNlcnZpY2VJRH0gfSA9IDE7CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgIH0KCiAgICAjIGRlbGV0ZSBpbnZhbGlkIHNlcnZpY2VzIGFuZCBjaGlsZHJlbgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17S2VlcENoaWxkcmVufSB8fCAhJFBhcmFte0tlZXBDaGlsZHJlbn0gKSB7CiAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJVNlcnZpY2VMaXN0ICkgewoKICAgICAgICAgICAgSU5WQUxJRE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkSW52YWxpZE5hbWUgKCBzb3J0IGtleXMgJVNlcnZpY2VJbnZhbGlkTGlzdCApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfSA9fiBteyBcQSBcUSRJbnZhbGlkTmFtZVxFIDo6IH14bXMgKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlTGlzdHskU2VydmljZUlEfTsKICAgICAgICAgICAgICAgICAgICBsYXN0IElOVkFMSUROQU1FOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICk7CgogICAgcmV0dXJuICVTZXJ2aWNlTGlzdDsKfQoKPWhlYWQyIFNlcnZpY2VMaXN0R2V0KCkKCnJldHVybiBhIGxpc3Qgb2Ygc2VydmljZXMgd2l0aCB0aGUgY29tcGxldGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciBlYWNoIHNlcnZpY2UKCiAgICBteSAkU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUxpc3RHZXQoCiAgICAgICAgVmFsaWQgID0+IDAsICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICByZXR1cm5zCgogICAgJFNlcnZpY2VMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgU2VydmljZUlEICA9PiAxLAogICAgICAgICAgICBQYXJlbnRJRCAgID0+IDAsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ015U2VydmljZScsCiAgICAgICAgICAgIE5hbWVTaG9ydCAgPT4gJ015U2VydmljZScsCiAgICAgICAgICAgIFZhbGlkSUQgICAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgICA9PiAnU29tZSBDb21tZW50JwogICAgICAgICAgICBDcmVhdGVUaW1lID0+ICcyMDExLTAyLTA4IDE1OjA4OjAwJywKICAgICAgICAgICAgQ2hhbmdlVGltZSA9PiAnMjAxMS0wNi0xMSAxNzoyMjowMCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ICAgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBTZXJ2aWNlSUQgID0+IDIsCiAgICAgICAgICAgIFBhcmVudElEICAgPT4gMSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTXlTZXJ2aWNlOjpNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBOYW1lU2hvcnQgID0+ICdNeVN1YlNlcnZpY2UnLAogICAgICAgICAgICBWYWxpZElEICAgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgICAgPT4gJ1NvbWUgQ29tbWVudCcKICAgICAgICAgICAgQ3JlYXRlVGltZSA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICAgICAgICAgIENoYW5nZVRpbWUgPT4gJzIwMTEtMDYtMTEgMTc6MjI6MDAnLAogICAgICAgICAgICBDcmVhdGVCeSAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ICAgPT4gMSwKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICBdOwoKPWN1dAoKc3ViIFNlcnZpY2VMaXN0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIHBhcmFtCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZWQgcmVzdWx0cwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTGlzdEdldDo6VmFsaWQ6OicgLiAkUGFyYW17VmFsaWR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICMgY3JlYXRlIFNRTCBxdWVyeQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgLiAnRlJPTSBzZXJ2aWNlJzsKCiAgICBpZiAoICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFNRTCAuPSAnIFdIRVJFIHZhbGlkX2lkIElOICgnIC4gam9pbiAnLCAnLAogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSAuICcpJzsKICAgIH0KCiAgICAkU1FMIC49ICcgT1JERVIgQlkgbmFtZSc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAkU1FMLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBTZXJ2aWNlTGlzdDsKICAgIG15ICVTZXJ2aWNlTmFtZTJJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIG15ICVTZXJ2aWNlRGF0YTsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CgogICAgICAgICMgYWRkIHNlcnZpY2UgZGF0YSB0byBzZXJ2aWNlIGxpc3QKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgXCVTZXJ2aWNlRGF0YTsKCiAgICAgICAgIyBidWlsZCBzZXJ2aWNlIGlkIGxvb2t1cCBoYXNoCiAgICAgICAgJFNlcnZpY2VOYW1lMklEeyAkU2VydmljZURhdGF7TmFtZX0gfSA9ICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9OwogICAgfQoKICAgIGZvciBteSAkU2VydmljZURhdGEgKEBTZXJ2aWNlTGlzdCkgewoKICAgICAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnQgaWQKICAgICAgICAkU2VydmljZURhdGEtPntOYW1lU2hvcnR9ID0gJFNlcnZpY2VEYXRhLT57TmFtZX07CiAgICAgICAgaWYgKCAkU2VydmljZURhdGEtPntOYW1lfSA9fiBteyBcQSAoLiopIDo6ICguKz8pIFx6IH14bXMgKSB7CiAgICAgICAgICAgIG15ICRQYXJlbnROYW1lID0gJDE7CiAgICAgICAgICAgICRTZXJ2aWNlRGF0YS0+e05hbWVTaG9ydH0gPSAkMjsKICAgICAgICAgICAgJFNlcnZpY2VEYXRhLT57UGFyZW50SUR9ICA9ICRTZXJ2aWNlTmFtZTJJRHskUGFyZW50TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPlNlcnZpY2VQcmVmZXJlbmNlc0dldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlRGF0YS0+e1NlcnZpY2VJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBtZXJnZSBoYXNoCiAgICAgICAgaWYgKCVQcmVmZXJlbmNlcykgewogICAgICAgICAgICAleyRTZXJ2aWNlRGF0YX0gPSAoICV7JFNlcnZpY2VEYXRhfSwgJVByZWZlcmVuY2VzICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmIChAU2VydmljZUxpc3QpIHsKCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAU2VydmljZUxpc3QsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gXEBTZXJ2aWNlTGlzdDsKfQoKPWhlYWQyIFNlcnZpY2VHZXQoKQoKcmV0dXJuIGEgc2VydmljZSBhcyBoYXNoCgpSZXR1cm4KICAgICRTZXJ2aWNlRGF0YXtTZXJ2aWNlSUR9CiAgICAkU2VydmljZURhdGF7UGFyZW50SUR9CiAgICAkU2VydmljZURhdGF7TmFtZX0KICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9CiAgICAkU2VydmljZURhdGF7VmFsaWRJRH0KICAgICRTZXJ2aWNlRGF0YXtDb21tZW50fQogICAgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9CiAgICAkU2VydmljZURhdGF7Q3JlYXRlQnl9CiAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0KICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0KCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUdldCgKICAgICAgICBOYW1lICAgID0+ICdTZXJ2aWNlOjpTdWJTZXJ2aWNlJywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZWl0aGVyIFNlcnZpY2VJRCBvciBOYW1lIG11c3QgYmUgcGFzc2VkCiAgICBpZiAoICEkUGFyYW17U2VydmljZUlEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZXJ2aWNlSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgdGhhdCBub3QgYm90aCBTZXJ2aWNlSUQgYW5kIE5hbWUgYXJlIGdpdmVuCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICYmICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgZWl0aGVyIFNlcnZpY2VJRCBPUiBOYW1lIC0gbm90IGJvdGghJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB0aGUgU2VydmljZUlECiAgICBpZiAoICRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkUGFyYW17U2VydmljZUlEfSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGVkIHJlc3VsdHMKICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U2VydmljZUdldDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJXskQ2FjaGV9IGlmIHJlZiAkQ2FjaGUgZXEgJ0hBU0gnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgc2VydmljZSBmcm9tIGRiCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+CiAgICAgICAgICAgICdTRUxFQ1QgaWQsIG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSAnCiAgICAgICAgICAgIC4gJ0ZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAlU2VydmljZURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VydmljZURhdGF7U2VydmljZUlEfSAgPSAkUm93WzBdOwogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFNlcnZpY2VEYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1syXTsKICAgICAgICAkU2VydmljZURhdGF7Q29tbWVudH0gICAgPSAkUm93WzNdIHx8ICcnOwogICAgICAgICRTZXJ2aWNlRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s1XTsKICAgICAgICAkU2VydmljZURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzZdOwogICAgICAgICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbN107CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlCiAgICBpZiAoICEkU2VydmljZURhdGF7U2VydmljZUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggU2VydmljZUlEICgkUGFyYW17U2VydmljZUlEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzaG9ydCBuYW1lIGFuZCBwYXJlbnQgaWQKICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9ID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgaWYgKCAkU2VydmljZURhdGF7TmFtZX0gPX4gbXsgXEEgKC4qKSA6OiAoLis/KSBceiB9eG1zICkgewogICAgICAgICRTZXJ2aWNlRGF0YXtOYW1lU2hvcnR9ID0gJDI7CgogICAgICAgICMgbG9va3VwIHBhcmVudAogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkMSwKICAgICAgICApOwogICAgICAgICRTZXJ2aWNlRGF0YXtQYXJlbnRJRH0gPSAkU2VydmljZUlEOwogICAgfQoKICAgICMgZ2V0IHNlcnZpY2UgcHJlZmVyZW5jZXMKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRTZWxmLT5TZXJ2aWNlUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgKTsKCiAgICAjIG1lcmdlIGhhc2gKICAgIGlmICglUHJlZmVyZW5jZXMpIHsKICAgICAgICAlU2VydmljZURhdGEgPSAoICVTZXJ2aWNlRGF0YSwgJVByZWZlcmVuY2VzICk7CiAgICB9CgogICAgIyBzZXQgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcJVNlcnZpY2VEYXRhLAogICAgKTsKCiAgICByZXR1cm4gJVNlcnZpY2VEYXRhOwp9Cgo9aGVhZDIgU2VydmljZUxvb2t1cCgpCgpyZXR1cm4gYSBzZXJ2aWNlIG5hbWUgYW5kIGlkCgogICAgbXkgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICk7CgogICAgb3IKCiAgICBteSAkU2VydmljZUlEID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgTmFtZSA9PiAnU2VydmljZTo6U3ViU2VydmljZScsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU2VydmljZUlEIG9yIE5hbWUhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpTZXJ2aWNlTG9va3VwOjpJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgICAgIG15ICRDYWNoZSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgZGVmaW5lZCAkQ2FjaGU7CgogICAgICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICAgICAjIGxvb2t1cAogICAgICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBuYW1lIEZST00gc2VydmljZSBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17U2VydmljZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICRSZXN1bHQgPSAnJzsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJFJlc3VsdCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICRSZXN1bHQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICRSZXN1bHQ7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdDYWNoZTo6U2VydmljZUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmIGRlZmluZWQgJENhY2hlOwoKICAgICAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgICAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAgICAgIyBsb29rdXAKICAgICAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlc3VsdCA9ICcnOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkUmVzdWx0ID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gJFJlc3VsdCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFJlc3VsdDsKICAgIH0KfQoKPWhlYWQyIFNlcnZpY2VBZGQoKQoKYWRkIGEgc2VydmljZQoKICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZU9iamVjdC0+U2VydmljZUFkZCgKICAgICAgICBOYW1lICAgICA9PiAnU2VydmljZSBOYW1lJywKICAgICAgICBQYXJlbnRJRCA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICBDb21tZW50ICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBWYWxpZElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgY29tbWVudAogICAgJFBhcmFte0NvbW1lbnR9IHx8PSAnJzsKCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpLT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBzZXJ2aWNlIG5hbWUKICAgIGlmICggJFBhcmFte05hbWV9ID1+IG17IDo6IH14bXMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBhZGQgc2VydmljZSEgSW52YWxpZCBTZXJ2aWNlIG5hbWUgJyRQYXJhbXtOYW1lfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBmdWxsIG5hbWUKICAgICRQYXJhbXtGdWxsTmFtZX0gPSAkUGFyYW17TmFtZX07CgogICAgIyBnZXQgcGFyZW50IG5hbWUKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICApOwogICAgICAgIGlmICgkUGFyZW50TmFtZSkgewogICAgICAgICAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmVudE5hbWUgLiAnOjonIC4gJFBhcmFte05hbWV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBleGlzdGluZyBzZXJ2aWNlCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkRXhpc3RzID0gMTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIHRvIGRhdGFiYXNlCiAgICBpZiAoJEV4aXN0cykgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQSBzZXJ2aWNlIHdpdGggdGhlIG5hbWUgYW5kIHBhcmVudCAnJFBhcmFte0Z1bGxOYW1lfScgYWxyZWFkeSBleGlzdHMuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBzZXJ2aWNlICcKICAgICAgICAgICAgLiAnKG5hbWUsIHZhbGlkX2lkLCBjb21tZW50cywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0Z1bGxOYW1lfSwgXCRQYXJhbXtWYWxpZElEfSwgXCRQYXJhbXtDb21tZW50fSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCAgIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBzZXJ2aWNlIGlkCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNlcnZpY2UgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtGdWxsTmFtZX0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKICAgIG15ICRTZXJ2aWNlSUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkU2VydmljZUlEID0gJFJvd1swXTsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICk7CgogICAgbXkgJVNlcnZpY2VzID0gJFNlbGYtPlNlcnZpY2VMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBnZW5lcmF0ZSBjaGFpbmVkIHRyYW5zbGF0aW9ucyBhdXRvbWF0aWNhbGx5CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VHJhbnNsYXRpb25zJyktPlRyYW5zbGF0ZVBhcmVudENoaWxkRWxlbWVudHMoCiAgICAgICAgU3RyaW5ncyA9PiBbIHZhbHVlcyAlU2VydmljZXMgXSwKICAgICk7CgogICAgcmV0dXJuICRTZXJ2aWNlSUQ7Cn0KCj1oZWFkMiBTZXJ2aWNlVXBkYXRlKCkKCnVwZGF0ZSBhbiBleGlzdGluZyBzZXJ2aWNlCgogICAgbXkgJFRydWUgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVVwZGF0ZSgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFBhcmVudElEICA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgTmFtZSAgICAgID0+ICdTZXJ2aWNlIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICA9PiAxLAogICAgICAgIENvbW1lbnQgICA9PiAnQ29tbWVudCcsICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNlcnZpY2VJRCBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGNvbW1lbnQKICAgICRQYXJhbXtDb21tZW50fSB8fD0gJyc7CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoTmFtZSBDb21tZW50KSkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgIFN0cmluZ1JlZiAgICAgICAgID0+IFwkUGFyYW17JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgc2VydmljZSBuYW1lCiAgICBpZiAoICRQYXJhbXtOYW1lfSA9fiBteyA6OiB9eG1zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIHNlcnZpY2UhIEludmFsaWQgU2VydmljZSBuYW1lICckUGFyYW17TmFtZX0nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2xkIG5hbWUgb2Ygc2VydmljZQogICAgbXkgJE9sZFNlcnZpY2VOYW1lID0gJFNlbGYtPlNlcnZpY2VMb29rdXAoCiAgICAgICAgU2VydmljZUlEID0+ICRQYXJhbXtTZXJ2aWNlSUR9LAogICAgKTsKCiAgICBpZiAoICEkT2xkU2VydmljZU5hbWUgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB1cGRhdGUgc2VydmljZSEgU2VydmljZSAnJFBhcmFte1NlcnZpY2VJRH0nIGRvZXMgbm90IGV4aXN0LiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgZnVsbCBuYW1lCiAgICAkUGFyYW17RnVsbE5hbWV9ID0gJFBhcmFte05hbWV9OwoKICAgICMgZ2V0IHBhcmVudCBuYW1lCiAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CgogICAgICAgICMgbG9va3VwIHNlcnZpY2UKICAgICAgICBteSAkUGFyZW50TmFtZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoJFBhcmVudE5hbWUpIHsKICAgICAgICAgICAgJFBhcmFte0Z1bGxOYW1lfSA9ICRQYXJlbnROYW1lIC4gJzo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2ssIGlmIHNlbGVjdGVkIHBhcmVudCB3YXMgYSBjaGlsZCBvZiB0aGlzIHNlcnZpY2UKICAgICAgICBpZiAoICRQYXJhbXtGdWxsTmFtZX0gPX4gbXsgXEEgKCBcUSRPbGRTZXJ2aWNlTmFtZVxFICkgOjogfXhtcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCB1cGRhdGUgc2VydmljZSEgSW52YWxpZCBwYXJlbnQgd2FzIHNlbGVjdGVkLicKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZmluZCBleGlzdHMgc2VydmljZQogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17RnVsbE5hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CiAgICBteSAkRXhpc3RzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkRXhpc3RzID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyB1cGRhdGUgc2VydmljZQogICAgaWYgKCRFeGlzdHMpIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkEgc2VydmljZSB3aXRoIHRoZSBuYW1lIGFuZCBwYXJlbnQgJyRQYXJhbXtGdWxsTmFtZX0nIGFscmVhZHkgZXhpc3RzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CgogICAgfQoKICAgICMgdXBkYXRlIHNlcnZpY2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPywgdmFsaWRfaWQgPSA/LCBjb21tZW50cyA9ID8sICcKICAgICAgICAgICAgLiAnIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtGdWxsTmFtZX0sIFwkUGFyYW17VmFsaWRJRH0sIFwkUGFyYW17Q29tbWVudH0sCiAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgICBcJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgbXkgJExpa2VTZXJ2aWNlID0gJERCT2JqZWN0LT5RdW90ZSggJE9sZFNlcnZpY2VOYW1lLCAnTGlrZScgKSAuICc6OiUnOwoKICAgICMgZmluZCBhbGwgY2hpbGRyZW4KICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICJTRUxFQ1QgaWQsIG5hbWUgRlJPTSBzZXJ2aWNlIFdIRVJFIG5hbWUgTElLRSA/IiwKICAgICAgICBCaW5kID0+IFsgXCRMaWtlU2VydmljZSBdLAogICAgKTsKCiAgICBteSBAQ2hpbGRzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbXkgJUNoaWxkOwogICAgICAgICRDaGlsZHtTZXJ2aWNlSUR9ID0gJFJvd1swXTsKICAgICAgICAkQ2hpbGR7TmFtZX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgcHVzaCBAQ2hpbGRzLCBcJUNoaWxkOwogICAgfQoKICAgICMgdXBkYXRlIGNoaWxkcmVuCiAgICBmb3IgbXkgJENoaWxkIChAQ2hpbGRzKSB7CiAgICAgICAgJENoaWxkLT57TmFtZX0gPX4gc3sgXEEgKCBcUSRPbGRTZXJ2aWNlTmFtZVxFICkgOjogfXskUGFyYW17RnVsbE5hbWV9Ojp9eG1zOwogICAgICAgICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ1VQREFURSBzZXJ2aWNlIFNFVCBuYW1lID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDaGlsZC0+e05hbWV9LCBcJENoaWxkLT57U2VydmljZUlEfSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIG15ICVTZXJ2aWNlcyA9ICRTZWxmLT5TZXJ2aWNlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2VuZXJhdGUgY2hhaW5lZCB0cmFuc2xhdGlvbnMgYXV0b21hdGljYWxseQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRyYW5zbGF0aW9ucycpLT5UcmFuc2xhdGVQYXJlbnRDaGlsZEVsZW1lbnRzKAogICAgICAgIFN0cmluZ3MgPT4gWyB2YWx1ZXMgJVNlcnZpY2VzIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VydmljZVNlYXJjaCgpCgpyZXR1cm4gc2VydmljZSBpZHMgYXMgYW4gYXJyYXkKCiAgICBteSBAU2VydmljZUxpc3QgPSAkU2VydmljZU9iamVjdC0+U2VydmljZVNlYXJjaCgKICAgICAgICBOYW1lICAgPT4gJ1NlcnZpY2UgTmFtZScsICMgKG9wdGlvbmFsKQogICAgICAgIExpbWl0ICA9PiAxMjIsICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMTAwMAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IGxpbWl0CiAgICAkUGFyYW17TGltaXR9IHx8PSAxMDAwOwoKICAgICMgY3JlYXRlIHNxbCBxdWVyeQogICAgbXkgJFNRTCA9ICJTRUxFQ1QgaWQgRlJPTSBzZXJ2aWNlIFdIRVJFIHZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkpfSApIjsKICAgIG15IEBCaW5kOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgaWYgKCAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgcXVvdGUKICAgICAgICAkUGFyYW17TmFtZX0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17TmFtZX0sICdMaWtlJyApOwoKICAgICAgICAjIHJlcGxhY2UgKiB3aXRoICUgYW5kIGNsZWFuIHRoZSBzdHJpbmcKICAgICAgICAkUGFyYW17TmFtZX0gPX4gc3sgXCorIH17JX14bXNnOwogICAgICAgICRQYXJhbXtOYW1lfSA9fiBzeyAlKyB9eyV9eG1zZzsKICAgICAgICBteSAkTGlrZVN0cmluZyA9ICclJyAuICRQYXJhbXtOYW1lfSAuICclJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJExpa2VTdHJpbmc7CgogICAgICAgICRTUUwgLj0gIiBBTkQgbmFtZSBMSUtFID8iOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBuYW1lJzsKCiAgICAjIHNlYXJjaCBzZXJ2aWNlIGluIGRiCiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAU2VydmljZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBTZXJ2aWNlTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gQFNlcnZpY2VMaXN0Owp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckxpc3QoKQoKcmV0dXJucyBhIGxpc3Qgb2YgY3VzdG9tZXJ1c2VyL3NlcnZpY2UgbWVtYmVycwoKICAgIFNlcnZpY2VJRDogc2VydmljZSBpZAogICAgQ3VzdG9tZXJVc2VyTG9naW46IGN1c3RvbWVyIHVzZXIgbG9naW4KICAgIERlZmF1bHRTZXJ2aWNlczogYWN0aXZhdGUgb3IgZGVhY3RpdmF0ZSBkZWZhdWx0IHNlcnZpY2VzCgogICAgUmVzdWx0OiBIQVNIIC0+IHJldHVybnMgYSBoYXNoIG9mIGtleSA9PiBzZXJ2aWNlIGlkLCB2YWx1ZSA9PiBzZXJ2aWNlIG5hbWUKICAgICAgICAgICAgTmFtZSAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgbmFtZXMKICAgICAgICAgICAgSUQgICAtPiByZXR1cm5zIGFuIGFycmF5IG9mIHVzZXIgaWRzCgogICAgRXhhbXBsZSAoZ2V0IHNlcnZpY2VzIG9mIGN1c3RvbWVyIHVzZXIpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdCcsCiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgIERlZmF1bHRTZXJ2aWNlcyAgID0+IDAsCiAgICApOwoKICAgIEV4YW1wbGUgKGdldCBjdXN0b21lciB1c2VyIG9mIHNlcnZpY2UpOgoKICAgICRTZXJ2aWNlT2JqZWN0LT5DdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJElELAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtSZXN1bHR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBSZXN1bHQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IChvbmx5IDEgb3IgMCBpcyBhbGxvd2VkIHRvIGNvcnJlY3RseSBzZXQgdGhlIGNhY2hlIGtleSkKICAgIGlmICggIWRlZmluZWQgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gfHwgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gKSB7CiAgICAgICAgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gPSAxOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gPSAwOwogICAgfQoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CiAgICBpZiAoCiAgICAgICAgJERlZmF1bHRTZXJ2aWNlVW5rbm93bkN1c3RvbWVyCiAgICAgICAgJiYgJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30KICAgICAgICAmJiAhJFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAmJiAhJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBjaGVjayBtb3JlIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlcnZpY2VJRCBvciBDdXN0b21lclVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIGNhY2hlIGtleQogICAgbXkgJENhY2hlS2V5ID0gJ0N1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0OjonIC4gJFBhcmFte1Jlc3VsdH0gLiAnOjonCiAgICAgICAgLiAnRGVmYXVsdFNlcnZpY2VzOjonIC4gJFBhcmFte0RlZmF1bHRTZXJ2aWNlc30gLiAnOjonOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAkQ2FjaGVLZXkgLj0gJ1NlcnZpY2VJRDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJVc2VyTG9naW46OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59OwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICApOwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JENhY2hlfSBpZiByZWYgJENhY2hlIGVxICdIQVNIJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnQVJSQVknOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdW90ZQogICAgZm9yICggc29ydCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkUGFyYW17JF99ID0gJERCT2JqZWN0LT5RdW90ZSggJFBhcmFteyRffSApOwogICAgfQogICAgZm9yIChxdyhTZXJ2aWNlSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICMgc3FsCiAgICBteSAlRGF0YTsKICAgIG15IEBEYXRhOwogICAgbXkgJFNRTCA9ICdTRUxFQ1Qgc2N1LnNlcnZpY2VfaWQsIHNjdS5jdXN0b21lcl91c2VyX2xvZ2luLCBzLm5hbWUgJwogICAgICAgIC4gJyBGUk9NICcKICAgICAgICAuICcgc2VydmljZV9jdXN0b21lcl91c2VyIHNjdSwgc2VydmljZSBzJwogICAgICAgIC4gJyBXSEVSRSAnCiAgICAgICAgLiAiIHMudmFsaWRfaWQgSU4gKCAke1woam9pbiAnLCAnLCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKSl9ICkgQU5EICIKICAgICAgICAuICcgcy5pZCA9IHNjdS5zZXJ2aWNlX2lkIEFORCAnOwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAiIHNjdS5zZXJ2aWNlX2lkID0gJFBhcmFte1NlcnZpY2VJRH0iOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59ICkgewogICAgICAgICRTUUwgLj0gIiBzY3UuY3VzdG9tZXJfdXNlcl9sb2dpbiA9ICckUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59JyI7CiAgICB9CgogICAgJERCT2JqZWN0LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkVmFsdWUgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAkRGF0YXsgJFJvd1sxXSB9ID0gJFJvd1swXTsKICAgICAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzJdOwogICAgICAgIH0KICAgIH0KICAgIGlmICgKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTG9naW59CiAgICAgICAgJiYgJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSBuZSAnPERFRkFVTFQ+JwogICAgICAgICYmICRQYXJhbXtEZWZhdWx0U2VydmljZXN9CiAgICAgICAgJiYgIWtleXMoJURhdGEpCiAgICAgICAgKQogICAgewogICAgICAgICVEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJMaXN0KAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnPERFRkFVTFQ+JywKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICAgPT4gJ0hBU0gnLAogICAgICAgICAgICBEZWZhdWx0U2VydmljZXMgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyByZXR1cm4gcmVzdWx0CiAgICBpZiAoICRQYXJhbXtSZXN1bHR9IGVxICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICApOwogICAgICAgIHJldHVybiAlRGF0YTsKICAgIH0KICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ05hbWUnICkgewogICAgICAgIEBEYXRhID0gdmFsdWVzICVEYXRhOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQERhdGEgPSBrZXlzICVEYXRhOwogICAgfQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxARGF0YSwKICAgICk7CiAgICByZXR1cm4gQERhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJTZXJ2aWNlTWVtYmVyQWRkKCkKCnRvIGFkZCBhIG1lbWJlciB0byBhIHNlcnZpY2UKCmlmICdBY3RpdmUnIGlzIDAsIHRoZSBjdXN0b21lciBpcyByZW1vdmVkIGZyb20gdGhlIHNlcnZpY2UKCiAgICAkU2VydmljZU9iamVjdC0+Q3VzdG9tZXJVc2VyU2VydmljZU1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAnVGVzdDEnLAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgID0+IDYsCiAgICAgICAgQWN0aXZlICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlclNlcnZpY2VNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ3VzdG9tZXJVc2VyTG9naW4gU2VydmljZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2VfY3VzdG9tZXJfdXNlciBXSEVSRSBjdXN0b21lcl91c2VyX2xvZ2luID0gPyBBTkQgc2VydmljZV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlckxvZ2lufSwgXCRQYXJhbXtTZXJ2aWNlSUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIGlmICggISRQYXJhbXtBY3RpdmV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGluc2VydCBuZXcgcmVsYXRpb24KICAgIG15ICRTdWNjZXNzID0gJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIHNlcnZpY2VfY3VzdG9tZXJfdXNlciAnCiAgICAgICAgICAgIC4gJyhjdXN0b21lcl91c2VyX2xvZ2luLCBzZXJ2aWNlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5KSAnCiAgICAgICAgICAgIC4gJ1ZBTFVFUyAoPywgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJMb2dpbn0sIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtVc2VySUR9IF0KICAgICk7CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICApOwoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWhlYWQyIFNlcnZpY2VQcmVmZXJlbmNlc1NldCgpCgpzZXQgc2VydmljZSBwcmVmZXJlbmNlcwoKICAgICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUHJlZmVyZW5jZXNTZXQoCiAgICAgICAgU2VydmljZUlEID0+IDEyMywKICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJDb21tZW50JywKICAgICAgICBWYWx1ZSAgICAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVXNlcklEICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlcnZpY2VQcmVmZXJlbmNlc1NldCglUGFyYW0pOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgU2VydmljZVByZWZlcmVuY2VzR2V0KCkKCmdldCBzZXJ2aWNlIHByZWZlcmVuY2VzCgogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VQcmVmZXJlbmNlc0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFNlcnZpY2VQcmVmZXJlbmNlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VydmljZVByZWZlcmVuY2VzR2V0KCVQYXJhbSk7Cn0KCj1oZWFkMiBTZXJ2aWNlUGFyZW50c0dldCgpCgpyZXR1cm4gYW4gb3JkZXJlZCBsaXN0IGFsbCBwYXJlbnQgc2VydmljZSBJRHMgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJvb3QgcGFyZW50IHRvIHRoZQpjdXJyZW50IHNlcnZpY2UgcGFyZW50CgogICAgbXkgJFNlcnZpY2VQYXJlbnRzTGlzdCA9ICRTZXJ2aWNlT2JqZWN0LT5TZXJ2aWNlUGFyZW50c0dldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm5zCgogICAgJFNlcnZpY2VQYXJlbnRzTGlzdCA9IFsgMSwgMiwgLi4uXTsKCj1jdXQKCnN1YiBTZXJ2aWNlUGFyZW50c0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVXNlcklEIFNlcnZpY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkICROZWVkZWQhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlYWQgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdTZXJ2aWNlUGFyZW50c0dldDo6JyAuICRQYXJhbXtTZXJ2aWNlSUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CiAgICByZXR1cm4gJENhY2hlIGlmIHJlZiAkQ2FjaGU7CgogICAgIyBnZXQgdGhlIGxpc3Qgb2Ygc2VydmljZXMKICAgIG15ICRTZXJ2aWNlTGlzdCA9ICRTZWxmLT5TZXJ2aWNlTGlzdEdldCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgYSBzZXJ2aWNlIGxvb2t1cCB0YWJsZQogICAgbXkgJVNlcnZpY2VMb29rdXA7CiAgICBTRVJWSUNFOgogICAgZm9yIG15ICRTZXJ2aWNlRGF0YSAoIEB7JFNlcnZpY2VMaXN0fSApIHsKICAgICAgICBuZXh0IFNFUlZJQ0UgaWYgISRTZXJ2aWNlRGF0YTsKICAgICAgICBuZXh0IFNFUlZJQ0UgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRTZXJ2aWNlRGF0YSk7CiAgICAgICAgbmV4dCBTRVJWSUNFIGlmICEkU2VydmljZURhdGEtPntTZXJ2aWNlSUR9OwoKICAgICAgICAkU2VydmljZUxvb2t1cHsgJFNlcnZpY2VEYXRhLT57U2VydmljZUlEfSB9ID0gJFNlcnZpY2VEYXRhOwogICAgfQoKICAgICMgZXhpdCBpZiBTZXJ2aWNlSUQgaXMgaW52YWxpZAogICAgcmV0dXJuIGlmICEkU2VydmljZUxvb2t1cHsgJFBhcmFte1NlcnZpY2VJRH0gfTsKCiAgICAjIHRvIHN0b3JlIHRoZSByZXR1cm4gc3RydWN0dXJlCiAgICBteSBAU2VydmljZVBhcmVudHM7CgogICAgIyBnZXQgdGhlIFNlcnZpY2VQYXJlbnRJRCBmcm9tIHRoZSByZXF1ZXN0ZWQgc2VydmljZQogICAgbXkgJFNlcnZpY2VQYXJlbnRJRCA9ICRTZXJ2aWNlTG9va3VweyAkUGFyYW17U2VydmljZUlEfSB9LT57UGFyZW50SUR9OwoKICAgICMgZ2V0IGFsbCBwYXJlbnRzIGZvciB0aGUgcmVxdWVzdGVkIHNlcnZpY2UKICAgIHdoaWxlICgkU2VydmljZVBhcmVudElEKSB7CgogICAgICAgICMgYWRkIHNlcnZpY2UgcGFyZW50IElEIHRvIHRoZSByZXR1cm4gc3RydWN0dXJlCiAgICAgICAgcHVzaCBAU2VydmljZVBhcmVudHMsICRTZXJ2aWNlUGFyZW50SUQ7CgogICAgICAgICMgc2V0IG5leHQgU2VydmljZVBhcmVudElEICh0aGUgcGFyZW50IG9mIHRoZSBjdXJyZW50IHBhcmVudCkKICAgICAgICAkU2VydmljZVBhcmVudElEID0gJFNlcnZpY2VMb29rdXB7JFNlcnZpY2VQYXJlbnRJRH0tPntQYXJlbnRJRH0gfHwgMDsKCiAgICB9CgogICAgIyByZXZlcnNlIHRoZSByZXR1cm4gYXJyYXkgdG8gZ2V0IHRoZSBsaXN0IG9yZGVyZWQgZnJvbSBvbGQgdG8geW91bmcgKGluIHBhcmVudCBjb250ZXh0KQogICAgbXkgQERhdGEgPSByZXZlcnNlIEBTZXJ2aWNlUGFyZW50czsKCiAgICAjIHNldCBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxARGF0YSwKICAgICk7CgogICAgcmV0dXJuIFxARGF0YTsKfQoKPWhlYWQyIEdldEFsbEN1c3RvbVNlcnZpY2VzKCkKCmdldCBhbGwgY3VzdG9tIHNlcnZpY2VzIG9mIG9uZSB1c2VyCgogICAgbXkgQFNlcnZpY2VzID0gJFNlcnZpY2VPYmplY3QtPkdldEFsbEN1c3RvbVNlcnZpY2VzKCBVc2VySUQgPT4gMTIzICk7Cgo9Y3V0CgpzdWIgR2V0QWxsQ3VzdG9tU2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICRDYWNoZUtleSA9ICdHZXRBbGxDdXN0b21TZXJ2aWNlczo6JyAuICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENhY2hlICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgcmV0dXJuIEB7JENhY2hlfSBpZiAkQ2FjaGU7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHNlYXJjaCBhbGwgY3VzdG9tIHNlcnZpY2VzCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1Qgc2VydmljZV9pZAogICAgICAgICAgICBGUk9NIHBlcnNvbmFsX3NlcnZpY2VzCiAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQFNlcnZpY2VJRHM7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBTZXJ2aWNlSURzLCAkUm93WzBdOwogICAgfQoKICAgICMgc2V0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgVmFsdWUgPT4gXEBTZXJ2aWNlSURzLAogICAgKTsKCiAgICByZXR1cm4gQFNlcnZpY2VJRHM7Cn0KCnN1YiBFeHBvcnRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRVc2VySUQgPSAkU2VsZi0+e1VzZXJJRH0gfHwgJFBhcmFte1VzZXJJRH07CgogICAgbXkgJVNlcnZpY2VGaWx0ZXI7CiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte1NlcnZpY2VzfSApICkgewogICAgICAgICVTZXJ2aWNlRmlsdGVyID0gbWFwIHsgJF8gPT4gMSB9ICRQYXJhbXtTZXJ2aWNlc30tPkAqOwogICAgfQoKICAgIG15ICVTZXJ2aWNlTGlzdCA9ICRTZWxmLT5TZXJ2aWNlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICk7CgogICAgbXkgJUV4cG9ydERhdGE7CiAgICBTRVJWSUNFSUQ6CiAgICBmb3IgbXkgJFNlcnZpY2VJRCAoIHNvcnQga2V5cyAlU2VydmljZUxpc3QgKSB7CgogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT5TZXJ2aWNlR2V0KAogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gJFNlcnZpY2VJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRVc2VySUQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCVTZXJ2aWNlRmlsdGVyKSB7CiAgICAgICAgICAgIG5leHQgU0VSVklDRUlEIHVubGVzcyAkU2VydmljZUZpbHRlcnsgJFNlcnZpY2VEYXRhe05hbWV9IH07CiAgICAgICAgfQoKICAgICAgICAjIHRyYW5zbGF0ZSBJRHMgaW50byBuYW1lcyBvciBuYW1lLWxpa2UgaWRlbnRpZmllcnMKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgQVRUUklCVVRFOgogICAgICAgIGZvciBteSAkQXR0cmlidXRlICgga2V5cyAlU2VydmljZURhdGEgKSB7CgogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSB1bmxlc3MgJEF0dHJpYnV0ZSA9fiAvSUQvOwoKICAgICAgICAgICAgaWYgKCAkQXR0cmlidXRlIGVxICdQYXJlbnRJRCcgKSB7CiAgICAgICAgICAgICAgICBteSAkUGFyZW50U2VydmljZSA9ICRTZWxmLT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkU2VydmljZURhdGF7UGFyZW50SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YXtQYXJlbnR9ID0gJFBhcmVudFNlcnZpY2U7CiAgICAgICAgICAgICAgICBkZWxldGUgJFNlcnZpY2VEYXRhe1BhcmVudElEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgZXEgJ1ZhbGlkSUQnICkgewogICAgICAgICAgICAgICAgbXkgJFZhbGlkID0gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgICAgICAgICBWYWxpZElEID0+ICRTZXJ2aWNlRGF0YXtWYWxpZElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VydmljZURhdGF7VmFsaWR9ID0gJFZhbGlkOwogICAgICAgICAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXtWYWxpZElEfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXtDaGFuZ2VCeX07CiAgICAgICAgZGVsZXRlICRTZXJ2aWNlRGF0YXtDaGFuZ2VUaW1lfTsKICAgICAgICBkZWxldGUgJFNlcnZpY2VEYXRhe0NyZWF0ZUJ5fTsKICAgICAgICBkZWxldGUgJFNlcnZpY2VEYXRhe0NyZWF0ZVRpbWV9OwogICAgICAgIGRlbGV0ZSAkU2VydmljZURhdGF7U2VydmljZUlEfTsKCiAgICAgICAgJEV4cG9ydERhdGF7ICRTZXJ2aWNlRGF0YXtOYW1lfSB9ID0gXCVTZXJ2aWNlRGF0YTsKICAgIH0KCiAgICByZXR1cm4gXCVFeHBvcnREYXRhOwp9CgpzdWIgSW1wb3J0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVXNlcklEID0gJFNlbGYtPntVc2VySUR9IHx8ICRQYXJhbXtVc2VySUR9OwoKICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwogICAgbXkgJVNlcnZpY2VMaXN0ID0gJFNlbGYtPlNlcnZpY2VMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgKTsKICAgIG15ICVTZXJ2aWNlTG9va3VwID0gcmV2ZXJzZSAlU2VydmljZUxpc3Q7CgogICAgIyBzb3J0IHNlcnZpY2VzIGJ5IHBhcmVudCBhdHRyaWJ1dGUKICAgIG15IEBGaXJzdExldmVsU2VydmljZXM7CiAgICBteSBAQ2hpbGRTZXJ2aWNlczsKICAgIGZvciBteSAkU2VydmljZU5hbWUgKCBrZXlzICRQYXJhbXtTZXJ2aWNlc30tPiUqICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VzfXskU2VydmljZU5hbWV9e1BhcmVudH0gKSB7CiAgICAgICAgICAgIHB1c2ggQENoaWxkU2VydmljZXMsICRTZXJ2aWNlTmFtZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQEZpcnN0TGV2ZWxTZXJ2aWNlcywgJFNlcnZpY2VOYW1lOwogICAgICAgIH0KICAgIH0KICAgIG15IEBDaGlsZFNlcnZpY2VzU29ydGVkID0gc29ydCB7CiAgICAgICAgaWYgKCAoICRQYXJhbXtTZXJ2aWNlc317JGF9e1BhcmVudH0gLy8gJycgKSBlcSAkUGFyYW17U2VydmljZXN9eyRifXtOYW1lfSApIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggKCAkUGFyYW17U2VydmljZXN9eyRifXtQYXJlbnR9IC8vICcnICkgZXEgJFBhcmFte1NlcnZpY2VzfXskYX17TmFtZX0gKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0gQENoaWxkU2VydmljZXM7CgogICAgU0VSVklDRU5BTUU6CiAgICBmb3IgbXkgJFNlcnZpY2VOYW1lICggQEZpcnN0TGV2ZWxTZXJ2aWNlcywgQENoaWxkU2VydmljZXNTb3J0ZWQgKSB7CiAgICAgICAgbXkgJFNlcnZpY2VEYXRhID0gJFBhcmFte1NlcnZpY2VzfXskU2VydmljZU5hbWV9OwoKICAgICAgICAjIHNraXAgaWYgcGFyZW50IGF0dHJpYnV0ZSBwcmVzZW50IGJ1dCBubyBjb3JyZXNwb25kaW5nIHNlcnZpY2UKICAgICAgICBpZiAoICRTZXJ2aWNlRGF0YS0+e1BhcmVudH0gKSB7CiAgICAgICAgICAgIG15ICRQYXJlbnRTZXJ2aWNlSUQgPSAkU2VsZi0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlcnZpY2VEYXRhLT57UGFyZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgU0VSVklDRU5BTUUgdW5sZXNzICRQYXJlbnRTZXJ2aWNlSUQ7CgogICAgICAgICAgICAkU2VydmljZURhdGEtPntQYXJlbnRJRH0gPSAkUGFyZW50U2VydmljZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIG9mIGNoaWxkIHNlcnZpY2UsIGNoZWNrIGlmIGFsbCBwYXJlbnQgc2VydmljZXMgYXJlIHByZXNlbnQKICAgICAgICAjICAgZWl0aGVyIGluIHRoZSBzeXN0ZW0gb3IgaW4gdGhlIGltcG9ydCBkYXRhCiAgICAgICAgbXkgQE5hbWVFbGVtZW50cyA9IHNwbGl0KCAvOjovLCAkU2VydmljZURhdGEtPntOYW1lfSApOwogICAgICAgIGlmICggc2NhbGFyIEBOYW1lRWxlbWVudHMgPiAxICkgewogICAgICAgICAgICBteSAkTmFtZVN0cmcgPSAnJzsKICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCNOYW1lRWxlbWVudHMgLSAxICkgewogICAgICAgICAgICAgICAgaWYgKCROYW1lU3RyZykgewogICAgICAgICAgICAgICAgICAgICROYW1lU3RyZyAuPSAnOjonIC4gJE5hbWVFbGVtZW50c1skSW5kZXhdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE5hbWVTdHJnIC49ICROYW1lRWxlbWVudHNbJEluZGV4XTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICEkU2VydmljZUxvb2t1cHskTmFtZVN0cmd9ICYmICEkUGFyYW17U2VydmljZXN9eyROYW1lU3RyZ30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgcGFyZW50IGVsZW1lbnQgbm90IGZvdW5kLCBza2lwcGluZwogICAgICAgICAgICAgICAgICAgIG5leHQgU0VSVklDRU5BTUU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VydmljZUxvb2t1cHsgJFNlcnZpY2VEYXRhLT57TmFtZX0gfTsKCiAgICAgICAgIyBza2lwIGlmIHNlcnZpY2Ugd2l0aCBzYW1lIG5hbWUgZXhpc3RzIGFuZCBvdmVyd3JpdGUgaXMgbm90IHNldAogICAgICAgIG5leHQgU0VSVklDRU5BTUUgaWYgKCAhJFBhcmFte092ZXJ3cml0ZUV4aXN0aW5nRW50aXRpZXN9ICYmICRTZXJ2aWNlSUQgKTsKCiAgICAgICAgIyB0cmFuc2xhdGUgbmFtZWQgZGF0YSBiYWNrIHRvIElEcwogICAgICAgICRTZXJ2aWNlRGF0YS0+e1ZhbGlkSUR9ID0gJFZhbGlkT2JqZWN0LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJFNlcnZpY2VEYXRhLT57VmFsaWR9LAogICAgICAgICk7CgogICAgICAgIGlmICgkU2VydmljZUlEKSB7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5TZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAgICAgJFNlcnZpY2VEYXRhLT4lKiwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VydmljZURhdGEtPntOYW1lU2hvcnR9LAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuIHVubGVzcyAkU3VjY2VzczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRTZXJ2aWNlSUQgPSAkU2VsZi0+U2VydmljZUFkZCgKICAgICAgICAgICAgICAgICRTZXJ2aWNlRGF0YS0+JSosCiAgICAgICAgICAgICAgICBOYW1lICAgPT4gJFNlcnZpY2VEYXRhLT57TmFtZVNob3J0fSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gdW5sZXNzICRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lclRlbXBsYXRlCgo9aGVhZDIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJMaXN0KCkKCmdldCBzdGFuZGFyZCB0ZW1wbGF0ZXMgYXNzb2NpYXRlZCB0byBhIHNlcnZpY2UKCiAgICBteSAlVGVtcGxhdGVzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgPT4gMTIzCiAgICApOwoKICAgIFJldHVybnM6CiAgICAgICAgJVRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgMSA9PiAnU29tZSBOYW1lJywKICAgICAgICAgICAgMiA9PiAnU29tZSBOYW1lJywKICAgICAgICApOwoKCiAgICBteSAlVGVtcGxhdGVzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyTGlzdCgKICAgICAgICBTZXJ2aWNlSUQgICAgID0+IDEyMywKICAgICAgICBUZW1wbGF0ZVR5cGVzID0+IDEsCiAgICApOwoKICAgIFJldHVybnM6CiAgICAgICAgJVJlc3BvbnNlcyA9ICgKICAgICAgICAgICAgQ3JlYXRlID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgICAgICAgICAyID0+ICdTb21lIE5hbWUnLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBbnN3ZXIgPT4gewogICAgICAgICAgICAgICAgMyA9PiAnU29tZSBOYW1lJywKICAgICAgICAgICAgICAgIDQgPT4gJ1NvbWUgTmFtZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICMgLi4uCiAgICAgICAgKTsKCj1jdXQKCnN1YiBTZXJ2aWNlU3RhbmRhcmRUZW1wbGF0ZU1lbWJlckxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1NlcnZpY2VJRH0gJiYgISRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnR290IG5vIFN0YW5kYXJkVGVtcGxhdGVJRCBvciBTZXJ2aWNlSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CiAgICBteSAkREJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkVGVtcGxhdGVUeXBlcyA9ICRQYXJhbXtUZW1wbGF0ZVR5cGVzfSB8fCAnMCc7CgogICAgbXkgJENhY2hlS2V5OwoKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcHJlc2VudCAoaW4gY2FjaGUpCiAgICAgICAgJENhY2hlS2V5ID0gIlN0YW5kYXJkVGVtcGxhdGVzOjokUGFyYW17U2VydmljZUlEfTo6JFRlbXBsYXRlVHlwZXMiOwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgICAgICMgZ2V0IHN0ZC4gdGVtcGxhdGVzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1Qgc3QuaWQsIHN0Lm5hbWUsIHN0LnRlbXBsYXRlX3R5cGUgIgogICAgICAgICAgICAuICIgRlJPTSBzdGFuZGFyZF90ZW1wbGF0ZSBzdCwgc2VydmljZV9zdGFuZGFyZF90ZW1wbGF0ZSBxc3QgV0hFUkUgIgogICAgICAgICAgICAuICIgcXN0LnNlcnZpY2VfaWQgSU4gKCIKICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17U2VydmljZUlEfSwgJ0ludGVnZXInICkKICAgICAgICAgICAgLiAiKSBBTkQgIgogICAgICAgICAgICAuICIgcXN0LnN0YW5kYXJkX3RlbXBsYXRlX2lkID0gc3QuaWQgQU5EICIKICAgICAgICAgICAgLiAiIHN0LnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSIKICAgICAgICAgICAgLiAiIE9SREVSIEJZIHN0Lm5hbWUiOwoKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSggU1FMID0+ICRTUUwgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGVUeXBlc30gKSB7CiAgICAgICAgICAgICAgICAkU3RhbmRhcmRUZW1wbGF0ZXN7ICRSb3dbMl0gfS0+eyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFN0YW5kYXJkVGVtcGxhdGVzeyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIHN0ZCB0ZW1wbGF0ZXMgKGluIGNhY2hlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVTdGFuZGFyZFRlbXBsYXRlcywKCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJVN0YW5kYXJkVGVtcGxhdGVzOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSA9ICJTZXJ2aWNlczo6JFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0iOwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiAleyRDYWNoZX0gaWYgcmVmICRDYWNoZSBlcSAnSEFTSCc7CgogICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgbXkgJFNRTCA9ICJTRUxFQ1QgcS5pZCwgcS5uYW1lICIKICAgICAgICAgICAgLiAiIEZST00gc2VydmljZSBxLCBzZXJ2aWNlX3N0YW5kYXJkX3RlbXBsYXRlIHFzdCBXSEVSRSAiCiAgICAgICAgICAgIC4gIiBxc3Quc3RhbmRhcmRfdGVtcGxhdGVfaWQgSU4gKCIKICAgICAgICAgICAgLiAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17U3RhbmRhcmRUZW1wbGF0ZUlEfSwgJ0ludGVnZXInICkKICAgICAgICAgICAgLiAiKSBBTkQgIgogICAgICAgICAgICAuICIgcXN0LnNlcnZpY2VfaWQgPSBxLmlkIEFORCAiCiAgICAgICAgICAgIC4gIiBxLnZhbGlkX2lkIElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSIKICAgICAgICAgICAgLiAiIE9SREVSIEJZIHEubmFtZSI7CgogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAlU2VydmljZXM7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRTZXJ2aWNlc3sgJFJvd1swXSB9ID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgc2VydmljZXMgKGluIGNhY2hlKQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVTZXJ2aWNlcywKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJVNlcnZpY2VzOwogICAgfQp9Cgo9aGVhZDIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQoKQoKdG8gYXNzb2NpYXRlIGEgbmV3IHRlbXBsYXRlIHRvIGEgc2VydmljZQoKICAgIG15ICRTdWNjZXNzID0gJFNlcnZpY2VPYmplY3QtPlNlcnZpY2VTdGFuZGFyZFRlbXBsYXRlTWVtYmVyQWRkKAogICAgICAgIFNlcnZpY2VJRCAgICAgICAgICA9PiAxMjMsCiAgICAgICAgU3RhbmRhcmRUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBBY3RpdmUgICAgICAgICAgICAgPT4gMSwgICAgICAgICMgdG8gc2V0L2NvbmZpcm0gKDEpIG9yIHJlbW92ZSAoMCkgdGhlIHJlbGF0aW9uCiAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgU2VydmljZVN0YW5kYXJkVGVtcGxhdGVNZW1iZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU2VydmljZUlEIFN0YW5kYXJkVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVsYXRpb24KICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIHNlcnZpY2Vfc3RhbmRhcmRfdGVtcGxhdGUKICAgICAgICAgICAgV0hFUkUgc2VydmljZV9pZCA9ID8KICAgICAgICAgICAgQU5EIHN0YW5kYXJkX3RlbXBsYXRlX2lkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17U2VydmljZUlEfSwgXCRQYXJhbXtTdGFuZGFyZFRlbXBsYXRlSUR9IF0sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIHJlbGF0aW9uIGlzIG5vdCBhY3RpdmUKICAgIGlmICggISRQYXJhbXtBY3RpdmV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICApOwogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgbXkgJFN1Y2Nlc3MgPSAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIHNlcnZpY2Vfc3RhbmRhcmRfdGVtcGxhdGUgKHNlcnZpY2VfaWQsIHN0YW5kYXJkX3RlbXBsYXRlX2lkLCBjcmVhdGVfdGltZSwKICAgICAgICAgICAgICAgIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkKICAgICAgICAgICAgVkFMVUVTICg/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtTZXJ2aWNlSUR9LCBcJFBhcmFte1N0YW5kYXJkVGVtcGxhdGVJRH0sIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9IF0sCiAgICApOwoKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgKTsKICAgIHJldHVybiAkU3VjY2VzczsKfQoKIyBFTyBDdXN0b21lclRlbXBsYXRlCgoxOwo=</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.Admin.ServiceTemplates.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkFkbWluID0gQ29yZS5BZ2VudC5BZG1pbiB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQWRtaW4uU2VydmljZVRlbXBsYXRlcwogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BZG1pbgogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbiBmb3IgU2VydmljZVRlbXBsYXRlcyBzZWxlY3Rpb24uCiAqLwogQ29yZS5BZ2VudC5BZG1pbi5TZXJ2aWNlVGVtcGxhdGVzID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qCiAgICAqIEBuYW1lIEluaXQKICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQWRtaW4uU2VydmljZVRlbXBsYXRlcwogICAgKiBAZnVuY3Rpb24KICAgICogQGRlc2NyaXB0aW9uCiAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyBmaWx0ZXIgYW5kICJTZWxlY3RBbGwiIGFjdGlvbnMuCiAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSAiU2VsZWN0QWxsIiBjaGVja2JveCBhbmQgYmluZCBjbGljayBldmVudCBvbiAiU2VsZWN0QWxsIiBmb3IgZWFjaCByZWxhdGlvbiBpdGVtCiAgICAgICAgQ29yZS5Gb3JtLkluaXRTZWxlY3RBbGxDaGVja2JveGVzKCQoJ3RhYmxlIHRkIGlucHV0W3R5cGU9ImNoZWNrYm94Il1bbmFtZT1JdGVtc1NlbGVjdGVkXScpLCAkKCcjU2VsZWN0QWxsSXRlbXNTZWxlY3RlZCcpKTsKCiAgICAgICAgJCgnaW5wdXRbdHlwZT0iY2hlY2tib3giXVtuYW1lPUl0ZW1zU2VsZWN0ZWRdJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkZvcm0uU2VsZWN0QWxsQ2hlY2tib3hlcygkKHRoaXMpLCAkKCcjU2VsZWN0QWxsSXRlbXNTZWxlY3RlZCcpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gaW5pdGlhbGl6ZSB0YWJsZSBmaWx0ZXJzCiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgiI0ZpbHRlciIpLCAkKCIjSXRlbXNUYWJsZSIpKTsKICAgICAgICBDb3JlLlVJLlRhYmxlLkluaXRUYWJsZUZpbHRlcigkKCIjRmlsdGVyVGVtcGxhdGVzIiksICQoIiNUZW1wbGF0ZXMiKSk7CiAgICAgICAgQ29yZS5VSS5UYWJsZS5Jbml0VGFibGVGaWx0ZXIoJCgiI0ZpbHRlclNlcnZpY2VzIiksICQoIiNTZXJ2aWNlcyIpKTsKICAgIH07CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFkbWluLlNlcnZpY2VUZW1wbGF0ZXMgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.Customer.TicketAction.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQ3VzdG9tZXIgPSBDb3JlLkN1c3RvbWVyIHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5DdXN0b21lci5UaWNrZXRBY3Rpb24KICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBmdW5jdGlvbnMgZm9yIGFsbCB0aWNrZXQgYWN0aW9uIHBvcHVwcy4KICovCkNvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHNldHMgY3VzdG9tZXIgdGVtcGxhdGUgcmVsYXRlZCBldmVudHMuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gY2hhbmdlIHN0YW5kYXJkIHRlbXBsYXRlCiAgICAgICAgJCgnI1N0YW5kYXJkVGVtcGxhdGVJRCcpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUoJ1JpY2hUZXh0JywgJCh0aGlzKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnZm9ybVtuYW1lPSJjb21wb3NlIicpLmZpcnN0KCksICdBSkFYVXBkYXRlJywgJ1N0YW5kYXJkVGVtcGxhdGVJRCcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoICQoJyNTdGFuZGFyZFRlbXBsYXRlSUQnKS5jaGlsZHJlbigpLmxlbmd0aCA9PSAyICkgewogICAgICAgICAgICAkKCIjU3RhbmRhcmRUZW1wbGF0ZUlEIikudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIENvbmZpcm1UZW1wbGF0ZU92ZXJ3cml0ZQogICAgICogQG1lbWJlcm9mIENvcmUuQ3VzdG9tZXIuVGlja2V0QWN0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZE5hbWUgLSBUaGUgSUQgb2YgdGhlIGNvbnRlbnQgZmllbGQgKHRleHRhcmVhIG9yIFJURSkuIElEIHdpdGhvdXQgc2VsZWN0b3IgKCMpLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZW1wbGF0ZVNlbGVjdCAtIFNlbGVjdG9yIG9mIHRoZSBkcm9wZG93biBlbGVtZW50IGZvciB0aGUgdGVtcGxhdGUgc2VsZWN0aW9uLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbiB0byBleGVjdXRlIGlmIG92ZXJ3cml0aW5nIGlzIGNvbmZpcm1lZC4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBBZnRlciBhIHRlbXBsYXRlIHdhcyBzZWxlY3RlZCwgdGhpcyBmdW5jdGlvbiBsZXRzIHRoZSB1c2VyIGNvbmZpcm0gdGhhdCBhbGwgYWxyZWFkeSBleGlzdGluZyBjb250ZW50CiAgICAgKiAgICAgIGluIHRoZSB0ZXh0YXJlYSBvciBSVEUgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSB0ZW1wbGF0ZSBjb250ZW50LgogICAgICovCiAgICBUYXJnZXROUy5Db25maXJtVGVtcGxhdGVPdmVyd3JpdGUgPSBmdW5jdGlvbiAoRmllbGROYW1lLCAkVGVtcGxhdGVTZWxlY3QsIENhbGxiYWNrKSB7CiAgICAgICAgdmFyIENvbnRlbnQgPSAnJywKICAgICAgICAgICAgTGFzdFZhbHVlID0gJFRlbXBsYXRlU2VsZWN0LmRhdGEoJ0xhc3RWYWx1ZScpIHx8ICcnOwogICAgICAgIC8vIEZhbGxiYWNrIGZvciBub24tcmljaHRleHQgY29udGVudAogICAgICAgIENvbnRlbnQgPSAkKCcjJyArIEZpZWxkTmFtZSkudmFsKCk7CgogICAgICAgIC8vIGdldCBSVEUgY29udGVudAogICAgICAgIGlmICh0eXBlb2YgQ0tFZGl0b3JJbnN0YW5jZXMgIT09ICd1bmRlZmluZWQnICYmIENLRWRpdG9ySW5zdGFuY2VzW0ZpZWxkTmFtZV0pIHsKICAgICAgICAgICAgQ29udGVudCA9IENLRWRpdG9ySW5zdGFuY2VzW0ZpZWxkTmFtZV0uZ2V0RGF0YSgpOwogICAgICAgIH0KCiAgICAgICAgLy8gaWYgY29udGVudCBhbHJlYWR5IGV4aXN0cyBsZXQgdXNlciBjb25maXJtIHRvIHJlYWxseSBvdmVyd3JpdGUgdGhhdCBjb250ZW50IHdpdGggYSB0ZW1wbGF0ZQogICAgICAgIGlmICgKICAgICAgICAgICAgQ29udGVudC5sZW5ndGggJiYKICAgICAgICAgICAgIXdpbmRvdy5jb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXR0aW5nIGEgdGVtcGxhdGUgd2lsbCBvdmVyd3JpdGUgYW55IHRleHQgb3IgYXR0YWNobWVudC4nKSArICcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEbyB5b3UgcmVhbGx5IHdhbnQgdG8gY29udGludWU/JykpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvLyBpZiB1c2VyIGNhbmNlbHMgY29uZmlybWF0aW9uLCByZXNldCB0ZW1wbGF0ZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICRUZW1wbGF0ZVNlbGVjdC52YWwoTGFzdFZhbHVlKS50cmlnZ2VyKCdyZWRyYXcnKTsKCiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCQuaXNGdW5jdGlvbihDYWxsYmFjaykpIHsKICAgICAgICAgICAgQ2FsbGJhY2soKTsKICAgICAgICAgICAgJFRlbXBsYXRlU2VsZWN0LmRhdGEoJ0xhc3RWYWx1ZScsICRUZW1wbGF0ZVNlbGVjdC52YWwoKSk7CiAgICAgICAgfQogICAgfQoKICAgIENvcmUuSW5pdC5SZWdpc3Rlck5hbWVzcGFjZShUYXJnZXROUywgJ0FQUF9NT0RVTEUnKTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5DdXN0b21lci5UaWNrZXRBY3Rpb24gfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/skins/Customer/default/css/Core.FieldExplanationRow.css" Permission="660" Encode="Base64">LyogT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgoKQ29weXJpZ2h0IChDKSAyMDAxLTIwMjAgT1RSUyBBRywgaHR0cHM6Ly9vdHJzLmNvbS8KQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwoKVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCkFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQphbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKi8KCi5GaWVsZEV4cGxhbmF0aW9uIHsKICAgIHBhZGRpbmctbGVmdDogMjRweDsKICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICBoZWlnaHQ6IDE4cHg7CiAgICBtYXJnaW4tYm90dG9tOiAtMjJweDsKfQoKQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjhweCkgewogICAgLkZpZWxkRXhwbGFuYXRpb24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAxNyU7CiAgICB9Cn0K</File>
        <File Location="doc/en/CustomerTemplates.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableCreate Type="post" Name="service_standard_template">
            <Column Name="service_id" Required="true" Type="INTEGER"></Column>
            <Column Name="standard_template_id" Required="true" Type="INTEGER"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
            <Column Name="create_by" Required="true" Type="INTEGER"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Column Name="change_by" Required="true" Type="INTEGER"></Column>
            <Unique>
                                <UniqueColumn Name="service_id"></UniqueColumn>
                <UniqueColumn Name="standard_template_id"></UniqueColumn>
</Unique>
            <Index Name="service_standard_template_service_id">
                <IndexColumn Name="service_id">
                </IndexColumn>
            </Index>
            <Index Name="service_standard_template_standard_template_id">
                <IndexColumn Name="standard_template_id">
                </IndexColumn>
            </Index>
            <ForeignKey ForeignTable="service">
                <Reference Foreign="id" Local="service_id">
                </Reference>
            </ForeignKey>
            <ForeignKey ForeignTable="standard_template">
                <Reference Foreign="id" Local="standard_template_id">
                </Reference>
            </ForeignKey>
            <ForeignKey ForeignTable="users">
                <Reference Foreign="id" Local="create_by">
                </Reference>
                <Reference Foreign="id" Local="change_by">
                </Reference>
            </ForeignKey>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="service_standard_template">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>