<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.0">
    <Name>Collaboration</Name>
    <Version>7.3.0</Version>
    <Framework>7.3.x</Framework>
    <Vendor>wolkig.it - Stephan Lang</Vendor>
    <URL>https://wolkig.it</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <Description Lang="en">Microsoft 365 collaboration integration for Znuny - Avatar, Presence, Teams Chat/Call/Meeting</Description>
    <Description Lang="de">Microsoft 365 Kollaborations-Integration fuer Znuny - Avatar, Presence, Teams Chat/Anruf/Meeting</Description>

    <ChangeLog Version="7.3.0" Date="2026-09-26">Rework header integration: native Znuny menu stays fully intact, only the avatar shows photo/name/status, and the hover card takes over profile/settings/logout once connected. Keep MSAL's silent token renewal working under CSP and surface silent disconnects with a Reconnect notification. Rebuild the Customer Information widget on Znuny 7.3.1's native structure. Restyle Collaboration's own notifications to match native Znuny 7.3 notifications. Fix four authorization gaps and reduce PII exposure in AgentCollaborationAJAX.</ChangeLog>

    <Filelist>
        <!-- Configuration -->
        <File Permission="660" Location="Kernel/Config/Files/XML/Collaboration.xml" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdHJzX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTWFzdGVyIFN3aXRjaCAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWFzdGVyIHN3aXRjaCBmb3IgdGhlIENvbGxhYm9yYXRpb24gYWRkLW9uLiBXaGVuIGRpc2FibGVkLCBubyBDb2xsYWJvcmF0aW9uIEphdmFTY3JpcHQgaXMgaW5pdGlhbGl6ZWQgYW5kIG5vIHBlci1wYWdlIGRhdGEgKHRpY2tldCBvd25lciwgY3VzdG9tZXIsIGFnZW50IGVtYWlsKSBpcyBnYXRoZXJlZCBvciBpbmplY3RlZCBpbnRvIHRoZSBwYWdlIC0gdGhlIGFkZC1vbiBiZWNvbWVzIGNvbXBsZXRlbHkgaW5lcnQgd2l0aG91dCBuZWVkaW5nIHRvIGJlIHVuaW5zdGFsbGVkLiBUbyBhbHNvIHN0b3AgdGhlIGFkZC1vbidzIEpTL0NTUyBmaWxlcyB0aGVtc2VsdmVzIGZyb20gYmVpbmcgbG9hZGVkIG9uIGV2ZXJ5IHBhZ2UsIGFkZGl0aW9uYWxseSBzZXQgTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMjIyMxMDAtQ29sbGFib3JhdGlvbiBhbmQgTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTIyMjMTAwLUNvbGxhYm9yYXRpb24gdG8gaW52YWxpZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFByb3ZpZGVyIFNlbGVjdGlvbiAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OlByb3ZpZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNlbGVjdCB0aGUgY29sbGFib3JhdGlvbiBwcm92aWRlciB0byB1c2UuIE0zNjUgPSBNaWNyb3NvZnQgMzY1LCBabnVueSA9IExvY2FsIGRhdGEgb25seSAoYXZhdGFycyB3aXRoIGluaXRpYWxzLCBwcm9maWxlIGZyb20gQ3VzdG9tZXJVc2VyL1VzZXIpLCBNb2NrID0gVGVzdC9EZXZlbG9wbWVudCBtb2RlIHdpdGggc3RhdGljIGRhdGEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTZWxlY3QiIFNlbGVjdGVkSUQ9Ik0zNjUiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJNMzY1IiBUcmFuc2xhdGFibGU9IjEiPk1pY3Jvc29mdCAzNjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IlpudW55IiBUcmFuc2xhdGFibGU9IjEiPlpudW55IChMb2NhbCBEYXRhIE9ubHkpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJNb2NrIiBUcmFuc2xhdGFibGU9IjEiPk1vY2sgKERldmVsb3BtZW50L1Rlc3RpbmcpPC9JdGVtPgogICAgICAgICAgICA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpGYWxsYmFja1Byb3ZpZGVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZhbGxiYWNrIHByb3ZpZGVyIHdoZW4gcHJpbWFyeSBwcm92aWRlciBmYWlscyB0byByZXR1cm4gZGF0YSAoZS5nLiwgdXNlciBub3QgZm91bmQgaW4gTTM2NSkuIFpudW55IHVzZXMgbG9jYWwgQ3VzdG9tZXJVc2VyL1VzZXIgZGF0YS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlNlbGVjdCIgU2VsZWN0ZWRJRD0iWm51bnkiPgogICAgICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJPcHRpb24iIFZhbHVlPSJabnVueSIgVHJhbnNsYXRhYmxlPSIxIj5abnVueSAoTG9jYWwgRGF0YSBPbmx5KTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iIiBUcmFuc2xhdGFibGU9IjEiPk5vbmUgKE5vIEZhbGxiYWNrKTwvSXRlbT4KICAgICAgICAgICAgPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIE1pY3Jvc29mdCAzNjUgUHJvdmlkZXIgU2V0dGluZ3MgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTo6VGVuYW50SUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+TWljcm9zb2Z0IEVudHJhIElEIChBenVyZSBBRCkgVGVuYW50IElELiBSZXF1aXJlZCBmb3IgTTM2NSBwcm92aWRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5bMC05YS1mQS1GLV0qJCI+PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iQ29sbGFib3JhdGlvbjo6UHJvdmlkZXI6Ok0zNjU6OkNsaWVudElEIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPk1pY3Jvc29mdCBFbnRyYSBJRCBBcHAgUmVnaXN0cmF0aW9uIENsaWVudCBJRC4gUmVxdWlyZWQgZm9yIE0zNjUgcHJvdmlkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeWzAtOWEtZkEtRi1dKiQiPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpSZWRpcmVjdFVSSSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5PQXV0aCBSZWRpcmVjdCBVUkkuIFVzdWFsbHkgeW91ciBabnVueSBiYXNlIFVSTC4gTXVzdCBtYXRjaCB0aGUgUmVkaXJlY3QgVVJJIGNvbmZpZ3VyZWQgaW4gRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciPjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgogICAgPCEtLSBGZWF0dXJlIFRvZ2dsZXMgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpFbmFibGVBdmF0YXIiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIGF2YXRhciAocHJvZmlsZSBwaWN0dXJlKSBkaXNwbGF5IGZyb20gY29sbGFib3JhdGlvbiBwcm92aWRlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkZlYXR1cmVzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZVByZXNlbmNlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZSBwcmVzZW5jZSAob25saW5lIHN0YXR1cykgaW5kaWNhdG9yIG9uIGF2YXRhcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpGZWF0dXJlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpFbmFibGVIb3ZlckNhcmRzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZSBob3ZlciBjYXJkcyAocGVyc29uIGNhcmRzKSB3aXRoIGRldGFpbGVkIGNvbnRhY3QgaW5mb3JtYXRpb24gd2hlbiBob3ZlcmluZyBvdmVyIGF2YXRhcnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpGZWF0dXJlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpFbmFibGVDaGF0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZSBjaGF0IGxpbmtzIChUZWFtcyBjaGF0IGRlZXAtbGlua3MpIGluIGhvdmVyIGNhcmRzIGFuZCB0aWNrZXQgem9vbS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkZlYXR1cmVzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZUNhbGwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIGNhbGwgbGlua3MgKFRlYW1zIGNhbGwgZGVlcC1saW5rcykgaW4gaG92ZXIgY2FyZHMgYW5kIHRpY2tldCB6b29tLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6RmVhdHVyZXM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPFNldHRpbmcgTmFtZT0iQ29sbGFib3JhdGlvbjo6RW5hYmxlTWVldGluZ3MiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlIG1lZXRpbmcgc2NoZWR1bGVyIHdpdGggZnJlZS9idXN5IGxvb2t1cCBhbmQgVGVhbXMgbWVldGluZyBjcmVhdGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkZlYXR1cmVzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkVuYWJsZU93bmVySW5mb1BhbmVsIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgb3duZXIgaW5mbyBwYW5lbCAoYXZhdGFyLCBvdXQtb2Ytb2ZmaWNlIHN0YXR1cywgZnJlZS9idXN5IGNhbGVuZGFyKSB3aGVuIHNlbGVjdGluZyBhIHRpY2tldCBvd25lciBpbiBBZ2VudFRpY2tldE93bmVyLCBBZ2VudFRpY2tldFBob25lLCBldGMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpGZWF0dXJlczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTWVldGluZyBTY2hlZHVsZXIgU2V0dGluZ3MgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpRdWV1ZUNhbGVuZGFyTWFwcGluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYXBwaW5nIG9mIHF1ZXVlcyB0byBabnVueSBjYWxlbmRhcnMgZm9yIG1lZXRpbmcgYXBwb2ludG1lbnRzLiBTdWItcXVldWVzIGluaGVyaXQgdGhlIGNhbGVuZGFyIG9mIHRoZWlyIHBhcmVudCBxdWV1ZSB1bmxlc3MgdGhleSBoYXZlIHRoZWlyIG93biBtYXBwaW5nLiBFeGFtcGxlOiBRdWV1ZSAiSVQiIG1hcHMgdG8gIklULUNhbGVuZGFyIiwgdGhlbiAiSVQ6OkhhcmR3YXJlIiBhbmQgIklUOjpTb2Z0d2FyZSIgd2lsbCBhbHNvIHVzZSAiSVQtQ2FsZW5kYXIiIHVubGVzcyBleHBsaWNpdGx5IGNvbmZpZ3VyZWQgb3RoZXJ3aXNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6TWVldGluZ3M8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSVQtUXVldWUiPkt1bmRlbiBNZWV0aW5nczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWlzYyI+RGVmYXVsdCBDYWxlbmRhcjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIFVJIFNldHRpbmdzIC0gV2hlcmUgdG8gc2hvdyBjb2xsYWJvcmF0aW9uIGZlYXR1cmVzIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iQ29sbGFib3JhdGlvbjo6U2hvd0luSGVhZGVyIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgbG9nZ2VkLWluIGFnZW50IGF2YXRhciBhbmQgbG9naW4gYnV0dG9uIGluIHRoZSBoZWFkZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpVSTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpTaG93SW5UaWNrZXRJbmZvIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgYXZhdGFycyBmb3IgdGlja2V0IG93bmVyIGFuZCBjdXN0b21lciBpbiB0aGUgdGlja2V0IGluZm8gc2lkZWJhci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlVJPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OlNob3dJbkFydGljbGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgYXZhdGFyIGZvciBhcnRpY2xlIHNlbmRlciBpbiBhcnRpY2xlIHZpZXcuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpVSTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjE8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpTaG93Q3VzdG9tZXJJbmZvV2lkZ2V0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3cgZW5oYW5jZWQgY3VzdG9tZXIgaW5mb3JtYXRpb24gd2lkZ2V0IGluIHRpY2tldCB6b29tIHNpZGViYXIgd2l0aCBhdmF0YXIsIHByZXNlbmNlLCBhbmQgcXVpY2sgYWN0aW9ucy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OlVJPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkhpZGVOYXRpdmVDdXN0b21lckluZm8iIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+SGlkZSB0aGUgbmF0aXZlIFpudW55IEN1c3RvbWVyIEluZm9ybWF0aW9uIHdpZGdldCB3aGVuIENvbGxhYm9yYXRpb24gQ3VzdG9tZXJJbmZvIHdpZGdldCBpcyBlbmFibGVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6VUk8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIENhY2hpbmcgU2V0dGluZ3MgLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpDYWNoZTo6QXZhdGFyVFRMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBhdmF0YXIgaW1hZ2VzLiBEZWZhdWx0OiAzNjAwICgxIGhvdXIpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6Q29sbGFib3JhdGlvbjo6Q2FjaGU8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKyQiPjM2MDA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8U2V0dGluZyBOYW1lPSJDb2xsYWJvcmF0aW9uOjpDYWNoZTo6UHJlc2VuY2VUVEwiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgY2FjaGVkIHByZXNlbmNlIHN0YXR1cy4gRGVmYXVsdDogNjAgKDEgbWludXRlKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkNvbGxhYm9yYXRpb246OkNhY2hlPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJTdHJpbmciIFZhbHVlUmVnZXg9Il5cZCskIj42MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkNvbGxhYm9yYXRpb246OkNhY2hlOjpQcm9maWxlVFRMIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBwcm9maWxlIGRhdGEuIERlZmF1bHQ6IDg2NDAwICgyNCBob3VycykuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpDb2xsYWJvcmF0aW9uOjpDYWNoZTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeXGQrJCI+ODY0MDA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTGlua09iamVjdCBDb25maWd1cmF0aW9uIC0gRGVmaW5lIGFuZCBhbGxvdyBDb2xsYWJvcmF0aW9uIGxpbmsgdHlwZSAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDwhLS0gRGVmaW5lIHRoZSBDb2xsYWJvcmF0aW9uIGxpbmsgdHlwZSAocmVxdWlyZWQgZm9yIFR5cGVMaXN0KSAtLT4KICAgIDxTZXR0aW5nIE5hbWU9IkxpbmtPYmplY3Q6OlR5cGUjIyNDb2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGxpbmsgdHlwZSAnQ29sbGFib3JhdGlvbicgZm9yIGxpbmtpbmcgdGlja2V0cyB3aXRoIGNhbGVuZGFyIGFwcG9pbnRtZW50cyBjcmVhdGVkIHZpYSB0aGUgQ29sbGFib3JhdGlvbiBBZGQtb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpMaW5rT2JqZWN0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNvdXJjZU5hbWUiIFRyYW5zbGF0YWJsZT0iMSI+Q29sbGFib3JhdGlvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGFyZ2V0TmFtZSIgVHJhbnNsYXRhYmxlPSIxIj5Db2xsYWJvcmF0aW9uPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tIEFsbG93IENvbGxhYm9yYXRpb24gbGlua3MgYmV0d2VlbiBBcHBvaW50bWVudCBhbmQgVGlja2V0IC0tPgogICAgPFNldHRpbmcgTmFtZT0iTGlua09iamVjdDo6UG9zc2libGVMaW5rIyMjOTEwMC1Db2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpbmtzIGFwcG9pbnRtZW50cyBhbmQgdGlja2V0cyB3aXRoIGEgIkNvbGxhYm9yYXRpb24iIHR5cGUgbGluayAoZm9yIENvbGxhYm9yYXRpb24gQWRkLW9uIG1lZXRpbmdzKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkxpbmtPYmplY3Q8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iT2JqZWN0MSI+QXBwb2ludG1lbnQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik9iamVjdDIiPlRpY2tldDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVHlwZSI+Q29sbGFib3JhdGlvbjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIE91dHB1dCBGaWx0ZXIgUmVnaXN0cmF0aW9uIC0tPgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CgogICAgPFNldHRpbmcgTmFtZT0iRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyQ29udGVudCMjI091dHB1dEZpbHRlckNvbGxhYm9yYXRpb25Jbml0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkluamVjdHMgY29sbGFib3JhdGlvbiBpbml0aWFsaXphdGlvbiBKYXZhU2NyaXB0IGludG8gYWxsIGFnZW50IHBhZ2VzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpPdXRwdXRGaWx0ZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6RmlsdGVyQ29udGVudDo6Q29sbGFib3JhdGlvbkluaXQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlRlbXBsYXRlcyI+CiAgICAgICAgICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSGVhZGVyIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CgogICAgPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CiAgICA8IS0tIEFKQVggTW9kdWxlIFJlZ2lzdHJhdGlvbiAtLT4KICAgIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgoKICAgIDxTZXR0aW5nIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudENvbGxhYm9yYXRpb25BSkFYIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFKQVggZW5kcG9pbnQgZm9yIENvbGxhYm9yYXRpb24gZGF0YSAoY3VzdG9tZXIgdGlja2V0IGNvdW50LCBjdXN0b21lciBkYXRhKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIiBUcmFuc2xhdGFibGU9IjEiPkNvbGxhYm9yYXRpb24gQUpBWCBCYWNrZW5kPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaXRsZSIgVHJhbnNsYXRhYmxlPSIxIj5Db2xsYWJvcmF0aW9uQUpBWDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmF2QmFyTmFtZSI+PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJHcm91cCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT51c2VyczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KICAgIDwhLS0gTG9hZGVyIENvbmZpZ3VyYXRpb24gLS0+CiAgICA8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KCiAgICA8U2V0dGluZyBOYW1lPSJMb2FkZXI6OkFnZW50OjpDb21tb25KUyMjIzEwMC1Db2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZSAoQ29sbGFib3JhdGlvbikuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPnRoaXJkcGFydHkvbXNhbC1icm93c2VyLTQuMjcuMC9tc2FsLWJyb3dzZXIubWluLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2suanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NS5qczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueS5qczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSS5qczwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgoKICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6QWdlbnQ6OkNvbW1vbkNTUyMjIzEwMC1Db2xsYWJvcmF0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgQ1NTIGZpbGVzIHRvIGFsd2F5cyBiZSBsb2FkZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UgKENvbGxhYm9yYXRpb24pLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkNvbGxhYm9yYXRpb24uY3NzPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cgo8L290cnNfY29uZmlnPgo=</File>

        <!-- Language Files -->
        <File Permission="660" Location="Kernel/Language/de_Collaboration.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0NvbGxhYm9yYXRpb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIFN5c0NvbmZpZyBEZXNjcmlwdGlvbnMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgdGhlIGNvbGxhYm9yYXRpb24gcHJvdmlkZXIgdG8gdXNlLiBNMzY1ID0gTWljcm9zb2Z0IDM2NSwgTW9jayA9IFRlc3QvRGV2ZWxvcG1lbnQgbW9kZSB3aXRoIHN0YXRpYyBkYXRhLid9ID0KICAgICAgICAnV8OkaGxlbiBTaWUgZGVuIEtvbGxhYm9yYXRpb25zLVByb3ZpZGVyLiBNMzY1ID0gTWljcm9zb2Z0IDM2NSwgTW9jayA9IFRlc3QtL0VudHdpY2tsdW5nc21vZHVzIG1pdCBzdGF0aXNjaGVuIERhdGVuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9jayAoRGV2ZWxvcG1lbnQvVGVzdGluZyknfSA9ICdNb2NrIChFbnR3aWNrbHVuZy9UZXN0KSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNaWNyb3NvZnQgMzY1J30gPSAnTWljcm9zb2Z0IDM2NSc7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWljcm9zb2Z0IEVudHJhIElEIChBenVyZSBBRCkgVGVuYW50IElELiBSZXF1aXJlZCBmb3IgTTM2NSBwcm92aWRlci4nfSA9CiAgICAgICAgJ01pY3Jvc29mdCBFbnRyYSBJRCAoQXp1cmUgQUQpIFRlbmFudCBJRC4gRXJmb3JkZXJsaWNoIGbDvHIgTTM2NSBQcm92aWRlci4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pY3Jvc29mdCBFbnRyYSBJRCBBcHAgUmVnaXN0cmF0aW9uIENsaWVudCBJRC4gUmVxdWlyZWQgZm9yIE0zNjUgcHJvdmlkZXIuJ30gPQogICAgICAgICdNaWNyb3NvZnQgRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbiBDbGllbnQgSUQuIEVyZm9yZGVybGljaCBmw7xyIE0zNjUgUHJvdmlkZXIuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPQXV0aCBSZWRpcmVjdCBVUkkuIFVzdWFsbHkgeW91ciBabnVueSBiYXNlIFVSTC4gTXVzdCBtYXRjaCB0aGUgUmVkaXJlY3QgVVJJIGNvbmZpZ3VyZWQgaW4gRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbi4nfSA9CiAgICAgICAgJ09BdXRoIFJlZGlyZWN0IFVSSS4gTm9ybWFsZXJ3ZWlzZSBJaHJlIFpudW55LUJhc2lzLVVSTC4gTXVzcyBtaXQgZGVyIFJlZGlyZWN0IFVSSSBpbiBkZXIgRW50cmEgSUQgQXBwIFJlZ2lzdHJhdGlvbiDDvGJlcmVpbnN0aW1tZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGUgYXZhdGFyIChwcm9maWxlIHBpY3R1cmUpIGRpc3BsYXkgZnJvbSBjb2xsYWJvcmF0aW9uIHByb3ZpZGVyLid9ID0KICAgICAgICAnQXZhdGFyIChQcm9maWxiaWxkKSB2b20gS29sbGFib3JhdGlvbnMtUHJvdmlkZXIgYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGUgcHJlc2VuY2UgKG9ubGluZSBzdGF0dXMpIGluZGljYXRvciBvbiBhdmF0YXJzLid9ID0KICAgICAgICAnUHLDpHNlbnogKE9ubGluZS1TdGF0dXMpIEluZGlrYXRvciBhdWYgQXZhdGFyZW4gYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFbmFibGUgaG92ZXIgY2FyZHMgKHBlcnNvbiBjYXJkcykgd2l0aCBkZXRhaWxlZCBjb250YWN0IGluZm9ybWF0aW9uIHdoZW4gaG92ZXJpbmcgb3ZlciBhdmF0YXJzLid9ID0KICAgICAgICAnSG92ZXItQ2FyZHMgKFBlcnNvbmVua2FydGVuKSBtaXQgZGV0YWlsbGllcnRlbiBLb250YWt0aW5mb3JtYXRpb25lbiBiZWltIMOcYmVyZmFocmVuIHZvbiBBdmF0YXJlbiBhbnplaWdlbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZSBjaGF0IGxpbmtzIChUZWFtcyBjaGF0IGRlZXAtbGlua3MpIGluIGhvdmVyIGNhcmRzIGFuZCB0aWNrZXQgem9vbS4nfSA9CiAgICAgICAgJ0NoYXQtTGlua3MgKFRlYW1zLUNoYXQgRGVlcC1MaW5rcykgaW4gSG92ZXItQ2FyZHMgdW5kIFRpY2tldC1ab29tIGFuemVpZ2VuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW5hYmxlIGNhbGwgbGlua3MgKFRlYW1zIGNhbGwgZGVlcC1saW5rcykgaW4gaG92ZXIgY2FyZHMgYW5kIHRpY2tldCB6b29tLid9ID0KICAgICAgICAnQW5ydWYtTGlua3MgKFRlYW1zLUFucnVmIERlZXAtTGlua3MpIGluIEhvdmVyLUNhcmRzIHVuZCBUaWNrZXQtWm9vbSBhbnplaWdlbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZSBtZWV0aW5nIHNjaGVkdWxlciB3aXRoIGZyZWUvYnVzeSBsb29rdXAgYW5kIFRlYW1zIG1lZXRpbmcgY3JlYXRpb24uJ30gPQogICAgICAgICdNZWV0aW5nLVNjaGVkdWxlciBtaXQgRnJlaS9HZWJ1Y2h0LUFiZnJhZ2UgdW5kIFRlYW1zLU1lZXRpbmctRXJzdGVsbHVuZyBha3RpdmllcmVuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBvd25lciBpbmZvIHBhbmVsIChhdmF0YXIsIG91dC1vZi1vZmZpY2Ugc3RhdHVzLCBmcmVlL2J1c3kgY2FsZW5kYXIpIHdoZW4gc2VsZWN0aW5nIGEgdGlja2V0IG93bmVyIGluIEFnZW50VGlja2V0T3duZXIsIEFnZW50VGlja2V0UGhvbmUsIGV0Yy4nfSA9CiAgICAgICAgJ0Jlc2l0emVyLUluZm8tUGFuZWwgYW56ZWlnZW4gKEF2YXRhciwgQWJ3ZXNlbmhlaXRzc3RhdHVzLCBGcmVpL0dlYnVjaHQtS2FsZW5kZXIpIGJlaSBkZXIgQXVzd2FobCBlaW5lcyBUaWNrZXQtQmVzaXR6ZXJzIGluIEFnZW50VGlja2V0T3duZXIsIEFnZW50VGlja2V0UGhvbmUsIGV0Yy4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgbG9nZ2VkLWluIGFnZW50IGF2YXRhciBhbmQgbG9naW4gYnV0dG9uIGluIHRoZSBoZWFkZXIuJ30gPQogICAgICAgICdBdmF0YXIgZGVzIGFuZ2VtZWxkZXRlbiBBZ2VudGVuIHVuZCBMb2dpbi1CdXR0b24gaW0gSGVhZGVyIGFuemVpZ2VuLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBhdmF0YXJzIGZvciB0aWNrZXQgb3duZXIgYW5kIGN1c3RvbWVyIGluIHRoZSB0aWNrZXQgaW5mbyBzaWRlYmFyLid9ID0KICAgICAgICAnQXZhdGFyZSBmw7xyIFRpY2tldC1CZXNpdHplciB1bmQgS3VuZGUgaW4gZGVyIFRpY2tldC1JbmZvLVNpZGViYXIgYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGF2YXRhciBmb3IgYXJ0aWNsZSBzZW5kZXIgaW4gYXJ0aWNsZSB2aWV3Lid9ID0KICAgICAgICAnQXZhdGFyIGRlcyBBcnRpa2VsLUFic2VuZGVycyBpbiBkZXIgQXJ0aWtlbGFuc2ljaHQgYW56ZWlnZW4uJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTaG93IGNvbGxhYm9yYXRpb24gYWN0aW9ucyB3aWRnZXQgaW4gdGlja2V0IHpvb20gKGNoYXQsIGNhbGwsIG1lZXRpbmcgYnV0dG9ucykuJ30gPQogICAgICAgICdLb2xsYWJvcmF0aW9ucy1Ba3Rpb25zLVdpZGdldCBpbSBUaWNrZXQtWm9vbSBhbnplaWdlbiAoQ2hhdCwgQW5ydWYsIE1lZXRpbmcgQnV0dG9ucykuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydUaW1lIHRvIGxpdmUgKGluIHNlY29uZHMpIGZvciBjYWNoZWQgYXZhdGFyIGltYWdlcy4gRGVmYXVsdDogMzYwMCAoMSBob3VyKS4nfSA9CiAgICAgICAgJ0xlYmVuc2RhdWVyIChpbiBTZWt1bmRlbikgZsO8ciBnZWNhY2h0ZSBBdmF0YXItQmlsZGVyLiBTdGFuZGFyZDogMzYwMCAoMSBTdHVuZGUpLic7CgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGltZSB0byBsaXZlIChpbiBzZWNvbmRzKSBmb3IgY2FjaGVkIHByZXNlbmNlIHN0YXR1cy4gRGVmYXVsdDogNjAgKDEgbWludXRlKS4nfSA9CiAgICAgICAgJ0xlYmVuc2RhdWVyIChpbiBTZWt1bmRlbikgZsO8ciBnZWNhY2h0ZW4gUHLDpHNlbnotU3RhdHVzLiBTdGFuZGFyZDogNjAgKDEgTWludXRlKS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgdG8gbGl2ZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBwcm9maWxlIGRhdGEuIERlZmF1bHQ6IDg2NDAwICgyNCBob3VycykuJ30gPQogICAgICAgICdMZWJlbnNkYXVlciAoaW4gU2VrdW5kZW4pIGbDvHIgZ2VjYWNodGUgUHJvZmlsZGF0ZW4uIFN0YW5kYXJkOiA4NjQwMCAoMjQgU3R1bmRlbikuJzsKCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmplY3RzIGNvbGxhYm9yYXRpb24gaW5pdGlhbGl6YXRpb24gSmF2YVNjcmlwdCBpbnRvIGFsbCBhZ2VudCBwYWdlcy4nfSA9CiAgICAgICAgJ0bDvGd0IEtvbGxhYm9yYXRpb25zLUluaXRpYWxpc2llcnVuZ3MtSmF2YVNjcmlwdCBpbiBhbGxlIEFnZW50ZW4tU2VpdGVuIGVpbi4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZSAoQ29sbGFib3JhdGlvbikuJ30gPQogICAgICAgICdMaXN0ZSBkZXIgSlMtRGF0ZWllbiwgZGllIGltbWVyIGbDvHIgZGFzIEFnZW50ZW4tSW50ZXJmYWNlIGdlbGFkZW4gd2VyZGVuIChDb2xsYWJvcmF0aW9uKS4nOwoKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xpc3Qgb2YgQ1NTIGZpbGVzIHRvIGFsd2F5cyBiZSBsb2FkZWQgZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UgKENvbGxhYm9yYXRpb24pLid9ID0KICAgICAgICAnTGlzdGUgZGVyIENTUy1EYXRlaWVuLCBkaWUgaW1tZXIgZsO8ciBkYXMgQWdlbnRlbi1JbnRlcmZhY2UgZ2VsYWRlbiB3ZXJkZW4gKENvbGxhYm9yYXRpb24pLic7CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBVSSBTdHJpbmdzCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgogICAgIyBMb2dpbi9Mb2dvdXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvZ2luIHdpdGggTWljcm9zb2Z0J30gPSAnTWl0IE1pY3Jvc29mdCBhbm1lbGRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2dvdXQnfSA9ICdBYm1lbGRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2dnZWQgaW4gYXMnfSA9ICdBbmdlbWVsZGV0IGFscyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydOb3QgbG9nZ2VkIGluJ30gPSAnTmljaHQgYW5nZW1lbGRldCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMb2dpbiByZXF1aXJlZCd9ID0gJ0FubWVsZHVuZyBlcmZvcmRlcmxpY2gnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xpY2sgdG8gbG9naW4gd2l0aCB5b3VyIE1pY3Jvc29mdCAzNjUgYWNjb3VudCd9ID0gJ0tsaWNrZW4gU2llIGhpZXIsIHVtIHNpY2ggbWl0IElocmVtIE1pY3Jvc29mdCAzNjUgS29udG8gYW56dW1lbGRlbic7CgogICAgIyBQcmVzZW5jZSBTdGF0dXMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F2YWlsYWJsZSd9ID0gJ1ZlcmbDvGdiYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQnVzeSd9ID0gJ0Jlc2Now6RmdGlndCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBd2F5J30gPSAnQWJ3ZXNlbmQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRG8gbm90IGRpc3R1cmInfSA9ICdOaWNodCBzdMO2cmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09mZmxpbmUnfSA9ICdPZmZsaW5lJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Vua25vd24nfSA9ICdVbmJla2FubnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW4gYSBjYWxsJ30gPSAnSW0gQW5ydWYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW4gYSBtZWV0aW5nJ30gPSAnSW0gTWVldGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQcmVzZW50aW5nJ30gPSAnUHLDpHNlbnRpZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0JlIHJpZ2h0IGJhY2snfSA9ICdCaW4gZ2xlaWNoIHp1csO8Y2snOwoKICAgICMgV29yayBMb2NhdGlvbgogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnV29yayBsb2NhdGlvbid9ID0gJ0FyYmVpdHNvcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT2ZmaWNlJ30gPSAnQsO8cm8nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUmVtb3RlJ30gPSAnUmVtb3RlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RpbWUgb2ZmJ30gPSAnQWJ3ZXNlbmQnOwoKICAgICMgT3V0IG9mIE9mZmljZQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3V0IG9mIE9mZmljZSd9ID0gJ0Fid2VzZW5kJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NjaGVkdWxlZCBBYnNlbmNlJ30gPSAnR2VwbGFudGUgQWJ3ZXNlbmhlaXQnOwoKICAgICMgSG92ZXIgQ2FyZAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGVyc29uIENhcmQnfSA9ICdQZXJzb25lbmthcnRlJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0RlcGFydG1lbnQnfSA9ICdBYnRlaWx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWFuYWdlcid9ID0gJ1Zvcmdlc2V0enRlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydQaG9uZSd9ID0gJ1RlbGVmb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTW9iaWxlJ30gPSAnTW9iaWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRW1haWwnfSA9ICdFLU1haWwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSm9iIFRpdGxlJ30gPSAnUG9zaXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVmlldyBtYW5hZ2VyJ30gPSAnVm9yZ2VzZXR6dGVuIGFuemVpZ2VuJzsKCiAgICAjIEFjdGlvbnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NoYXQnfSA9ICdDaGF0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGwnfSA9ICdBbnJ1Zic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWV0aW5nJ30gPSAnTWVldGluZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTdGFydCBDaGF0J30gPSAnQ2hhdCBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IENhbGwnfSA9ICdBbnJ1ZiBzdGFydGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1N0YXJ0IFZpZGVvIENhbGwnfSA9ICdWaWRlb2FucnVmIHN0YXJ0ZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2NoZWR1bGUgTWVldGluZyd9ID0gJ01lZXRpbmcgcGxhbmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NlbmQgRW1haWwnfSA9ICdFLU1haWwgc2VuZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NhbGwgUGhvbmUnfSA9ICdUZWxlZm9uIGFucnVmZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2FsbCBNb2JpbGUnfSA9ICdNb2JpbCBhbnJ1ZmVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgdG8gY2xpcGJvYXJkJ30gPSAnSW4gWndpc2NoZW5hYmxhZ2Uga29waWVyZW4nOwoKICAgICMgVGVhbXMgQWN0aW9ucwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbXMgQ2hhdCd9ID0gJ1RlYW1zIENoYXQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGVhbXMgQ2FsbCd9ID0gJ1RlYW1zIEFucnVmJzsKCiAgICAjIFRpY2tldCBab29tIFdpZGdldAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29sbGFib3JhdGlvbid9ID0gJ0tvbGxhYm9yYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29udGFjdCBDdXN0b21lcid9ID0gJ0t1bmRlIGtvbnRha3RpZXJlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDaGF0IHdpdGggQ3VzdG9tZXInfSA9ICdNaXQgS3VuZGUgY2hhdHRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxsIEN1c3RvbWVyJ30gPSAnS3VuZGUgYW5ydWZlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTY2hlZHVsZSBNZWV0aW5nIHdpdGggQ3VzdG9tZXInfSA9ICdNZWV0aW5nIG1pdCBLdW5kZSBwbGFuZW4nOwoKICAgICMgQ3VzdG9tZXIgSW5mbyBXaWRnZXQKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbWVyIEluZm9ybWF0aW9uJ30gPSAnS3VuZGVuaW5mb3JtYXRpb24nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2NoZWR1bGUgQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gZWluc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPcGVuIFRpY2tldHMgKEN1c3RvbWVyKSd9ID0gJ09mZmVuZSBUaWNrZXRzIChLdW5kZSknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3BlbiBUaWNrZXRzIChVc2VyKSd9ID0gJ09mZmVuZSBUaWNrZXRzIChCZW51dHplciknOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3VzdG9tZXInfSA9ICdLdW5kZSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydNZWV0aW5nIHNjaGVkdWxpbmcgcmVxdWlyZXMgTWljcm9zb2Z0IDM2NSBsb2dpbi4nfSA9ICdUZXJtaW5wbGFudW5nIGVyZm9yZGVydCBNaWNyb3NvZnQgMzY1IEFubWVsZHVuZy4nOwogICAgIyBEeW5hbWljIEN1c3RvbWVyIFNlbGVjdGlvbiAoVGlja2V0IENyZWF0ZSBQYWdlcykKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGN1c3RvbWVyIHNlbGVjdGVkJ30gPSAnS2VpbiBLdW5kZSBhdXNnZXfDpGhsdCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydTZWxlY3QgYSBjdXN0b21lciB0byBzZWUgZGV0YWlscyd9ID0gJ1fDpGhsZW4gU2llIGVpbmVuIEt1bmRlbiBhdXMsIHVtIERldGFpbHMgenUgc2VoZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2hvdyBlbmhhbmNlZCBjdXN0b21lciBpbmZvcm1hdGlvbiB3aWRnZXQgaW4gdGlja2V0IHpvb20gc2lkZWJhciB3aXRoIGF2YXRhciwgcHJlc2VuY2UsIGFuZCBxdWljayBhY3Rpb25zLid9ID0KICAgICAgICAnRXJ3ZWl0ZXJ0ZXMgS3VuZGVuaW5mb3JtYXRpb25zLVdpZGdldCBpbSBUaWNrZXQtWm9vbSBtaXQgQXZhdGFyLCBQcsOkc2VueiB1bmQgU2NobmVsbGFrdGlvbmVuIGFuemVpZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydIaWRlIHRoZSBuYXRpdmUgWm51bnkgQ3VzdG9tZXIgSW5mb3JtYXRpb24gd2lkZ2V0IHdoZW4gQ29sbGFib3JhdGlvbiBDdXN0b21lckluZm8gd2lkZ2V0IGlzIGVuYWJsZWQuJ30gPQogICAgICAgICdOYXRpdmVzIFpudW55IEt1bmRlbmluZm9ybWF0aW9ucy1XaWRnZXQgYXVzYmxlbmRlbiwgd2VubiBDb2xsYWJvcmF0aW9uIEN1c3RvbWVySW5mbyBXaWRnZXQgYWt0aXZpZXJ0IGlzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQUpBWCBlbmRwb2ludCBmb3IgQ29sbGFib3JhdGlvbiBkYXRhIChjdXN0b21lciB0aWNrZXQgY291bnQsIGN1c3RvbWVyIGRhdGEpLid9ID0KICAgICAgICAnQUpBWC1FbmRwdW5rdCBmw7xyIEtvbGxhYm9yYXRpb25zZGF0ZW4gKEt1bmRlbi1UaWNrZXQtQW56YWhsLCBLdW5kZW5kYXRlbikuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbGxhYm9yYXRpb24gQUpBWCBCYWNrZW5kJ30gPSAnS29sbGFib3JhdGlvbiBBSkFYIEJhY2tlbmQnOwoKICAgICMgTWVldGluZyBTY2hlZHVsZXIKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01lZXRpbmcgRHVyYXRpb24nfSA9ICdNZWV0aW5nLURhdWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzE1IG1pbnV0ZXMnfSA9ICcxNSBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzMwIG1pbnV0ZXMnfSA9ICczMCBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzQ1IG1pbnV0ZXMnfSA9ICc0NSBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JzYwIG1pbnV0ZXMnfSA9ICc2MCBNaW51dGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0N1c3RvbSBkdXJhdGlvbid9ID0gJ0VpZ2VuZSBEYXVlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydtaW51dGVzJ30gPSAnTWludXRlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBdmFpbGFibGUgU2xvdHMnfSA9ICdWZXJmw7xnYmFyZSBaZWl0c2xvdHMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9hZGluZyBhdmFpbGFibGUgdGltZXMuLi4nfSA9ICdMYWRlIHZlcmbDvGdiYXJlIFplaXRlbi4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyBhdmFpbGFibGUgc2xvdHMgZm91bmQnfSA9ICdLZWluZSB2ZXJmw7xnYmFyZW4gWmVpdHNsb3RzIGdlZnVuZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nob3cgbW9yZSBzbG90cyd9ID0gJ1dlaXRlcmUgWmVpdHNsb3RzIGFuemVpZ2VuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NyZWF0ZSBNZWV0aW5nJ30gPSAnTWVldGluZyBlcnN0ZWxsZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVldGluZyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSd9ID0gJ01lZXRpbmcgZXJmb2xncmVpY2ggZXJzdGVsbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkIHRvIGNyZWF0ZSBtZWV0aW5nJ30gPSAnRmVobGVyIGJlaW0gRXJzdGVsbGVuIGRlcyBNZWV0aW5ncyc7CgogICAgIyBNZWV0aW5nIFNjaGVkdWxlciBEaWFsb2cKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0F0dGVuZGVlcyd9ID0gJ1RlaWxuZWhtZXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3ViamVjdCd9ID0gJ0JldHJlZmYnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWVldGluZyBUeXBlJ30gPSAnVGVybWluYXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1RlYW1zIE1lZXRpbmcnfSA9ICdUZWFtcyBNZWV0aW5nJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09uLXNpdGUnfSA9ICdWb3IgT3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09uLXNpdGUgTWVldGluZyd9ID0gJ1Zvci1PcnQtVGVybWluJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvY2F0aW9uJ30gPSAnT3J0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VudGVyIG1lZXRpbmcgbG9jYXRpb24uLi4nfSA9ICdWZXJhbnN0YWx0dW5nc29ydCBlaW5nZWJlbi4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEdXJhdGlvbid9ID0gJ0RhdWVyJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J01pbid9ID0gJ01pbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEYXRlJ30gPSAnRGF0dW0nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXZhaWxhYmxlIFRpbWVzJ30gPSAnVmVyZsO8Z2JhcmUgWmVpdGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09ubHkgdGltZXMgd2hlbiBib3RoIGF0dGVuZGVlcyBhcmUgYXZhaWxhYmxlIGFyZSBzaG93bi4nfSA9ICdOdXIgWmVpdGVuLCB6dSBkZW5lbiBiZWlkZSBUZWlsbmVobWVyIHZlcmbDvGdiYXIgc2luZCwgd2VyZGVuIGFuZ2V6ZWlndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ3JlYXRlIEFwcG9pbnRtZW50J30gPSAnVGVybWluIGVyc3RlbGxlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDcmVhdGluZy4uLid9ID0gJ1dpcmQgZXJzdGVsbHQuLi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuJ30gPSAnS2VpbmUgdmVyZsO8Z2JhcmVuIFplaXRlbiBmw7xyIGRpZXNlcyBEYXR1bS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkIHRvIGxvYWQgYXZhaWxhYmlsaXR5IGRhdGEuJ30gPSAnRmVobGVyIGJlaW0gTGFkZW4gZGVyIFZlcmbDvGdiYXJrZWl0c2RhdGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKb2luIFVSTCd9ID0gJ0JlaXRyZXRlbi1VUkwnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnT3duZXInfSA9ICdCZXNpdHplcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZXNwb25zaWJsZSd9ID0gJ1ZlcmFudHdvcnRsaWNoZXInOwoKICAgICMgTGluayBUeXBlCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydMaW5rIHR5cGUgZm9yIENvbGxhYm9yYXRpb24gYXBwb2ludG1lbnRzLiBVc2VkIHRvIGlkZW50aWZ5IGFwcG9pbnRtZW50cyBjcmVhdGVkIHRocm91Z2ggdGhlIENvbGxhYm9yYXRpb24gQWRkLW9uIGZvciBtZWV0aW5nIHNjaGVkdWxpbmcuJ30gPQogICAgICAgICdMaW5rLVR5cCBmw7xyIEtvbGxhYm9yYXRpb25zLVRlcm1pbmUuIFdpcmQgenVyIElkZW50aWZpemllcnVuZyB2b24gVGVybWluZW4gdmVyd2VuZGV0LCBkaWUgw7xiZXIgZGFzIENvbGxhYm9yYXRpb24gQWRkLW9uIGVyc3RlbGx0IHd1cmRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTGlua3MgYXBwb2ludG1lbnRzIGFuZCB0aWNrZXRzIHdpdGggYSAiQ29sbGFib3JhdGlvbiIgdHlwZSBsaW5rLiBVc2VkIGJ5IHRoZSBDb2xsYWJvcmF0aW9uIEFkZC1vbiBmb3IgbWVldGluZyBzY2hlZHVsaW5nLid9ID0KICAgICAgICAnVmVya27DvHBmdCBUZXJtaW5lIHVuZCBUaWNrZXRzIG1pdCBlaW5lbSAiS29sbGFib3JhdGlvbiItTGluay4gV2lyZCB2b20gQ29sbGFib3JhdGlvbiBBZGQtb24gZsO8ciBUZXJtaW5wbGFudW5nIHZlcndlbmRldC4nOwoKICAgICMgQXBwb2ludG1lbnQgQ2FuY2VsbGF0aW9uCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5jZWwgQXBwb2ludG1lbnQnfSA9ICdUZXJtaW4gYWJzYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gY2FuY2VsIHRoaXMgYXBwb2ludG1lbnQ/IEF0dGVuZGVlcyB3aWxsIGJlIG5vdGlmaWVkLid9ID0KICAgICAgICAnU2luZCBTaWUgc2ljaGVyLCBkYXNzIFNpZSBkaWVzZW4gVGVybWluIGFic2FnZW4gbcO2Y2h0ZW4/IERpZSBUZWlsbmVobWVyIHdlcmRlbiBiZW5hY2hyaWNodGlndC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY2FuY2VsbGVkLiBBdHRlbmRlZXMgaGF2ZSBiZWVuIG5vdGlmaWVkLid9ID0KICAgICAgICAnVGVybWluIGFiZ2VzYWd0LiBEaWUgVGVpbG5laG1lciB3dXJkZW4gYmVuYWNocmljaHRpZ3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1pudW55IGFwcG9pbnRtZW50IGRlbGV0ZWQsIGJ1dCBmYWlsZWQgdG8gY2FuY2VsIE91dGxvb2sgZXZlbnQuJ30gPQogICAgICAgICdabnVueS1UZXJtaW4gZ2Vsw7ZzY2h0LCBhYmVyIE91dGxvb2stVGVybWluIGtvbm50ZSBuaWNodCBhYmdlc2FndCB3ZXJkZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNhbmNlbGxlZC4nfSA9ICdUZXJtaW4gYWJnZXNhZ3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCB0byBjYW5jZWwgYXBwb2ludG1lbnQuJ30gPSAnRmVobGVyIGJlaW0gQWJzYWdlbiBkZXMgVGVybWlucy4nOwoKICAgICMgRXJyb3IgTWVzc2FnZXMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvZ2luIGZhaWxlZCd9ID0gJ0FubWVsZHVuZyBmZWhsZ2VzY2hsYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgbG9hZCBhdmF0YXInfSA9ICdBdmF0YXIga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBsb2FkIHByZXNlbmNlJ30gPSAnUHLDpHNlbnoga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBsb2FkIHByb2ZpbGUnfSA9ICdQcm9maWwga29ubnRlIG5pY2h0IGdlbGFkZW4gd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Byb3ZpZGVyIG5vdCBjb25maWd1cmVkJ30gPSAnUHJvdmlkZXIgbmljaHQga29uZmlndXJpZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZlYXR1cmUgbm90IGF2YWlsYWJsZSd9ID0gJ0Z1bmt0aW9uIG5pY2h0IHZlcmbDvGdiYXInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGxvZ2luIGZpcnN0J30gPSAnQml0dGUgenVlcnN0IGFubWVsZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1Nlc3Npb24gZXhwaXJlZCwgcGxlYXNlIGxvZ2luIGFnYWluJ30gPSAnU2l0enVuZyBhYmdlbGF1ZmVuLCBiaXR0ZSBlcm5ldXQgYW5tZWxkZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gQ2FsZW5kYXIgQ29uZmlndXJlZCd9ID0gJ0tlaW4gS2FsZW5kZXIga29uZmlndXJpZXJ0JzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIGNhbGVuZGFyIGlzIGNvbmZpZ3VyZWQgZm9yIHF1ZXVlICVzLid9ID0gJ0bDvHIgZGllIFF1ZXVlICVzIGlzdCBrZWluIEthbGVuZGVyIGtvbmZpZ3VyaWVydC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yIHRvIGNvbmZpZ3VyZSBhIGNhbGVuZGFyIG1hcHBpbmcgZm9yIHRoaXMgcXVldWUgaW4gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIChDb2xsYWJvcmF0aW9uOjpRdWV1ZUNhbGVuZGFyTWFwcGluZykuJ30gPQogICAgICAgICdCaXR0ZSBrb250YWt0aWVyZW4gU2llIElocmVuIEFkbWluaXN0cmF0b3IsIHVtIGVpbmUgS2FsZW5kZXItWnVvcmRudW5nIGbDvHIgZGllc2UgUXVldWUgaW4gZGVyIFN5c3RlbWtvbmZpZ3VyYXRpb24genUgaGludGVybGVnZW4gKENvbGxhYm9yYXRpb246OlF1ZXVlQ2FsZW5kYXJNYXBwaW5nKS4nOwoKICAgICMgQ29uZmlndXJhdGlvbiBFcnJvcnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbGxhYm9yYXRpb24gQWRkLW9uOid9ID0gJ0NvbGxhYm9yYXRpb24gQWRkLW9uOic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydub3QgY29uZmlndXJlZC4nfSA9ICduaWNodCBrb25maWd1cmllcnQuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gc2V0dGluZ3MnfSA9ICdFaW5zdGVsbHVuZ2VuIMO2ZmZuZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yLid9ID0gJ0JpdHRlIGtvbnRha3RpZXJlbiBTaWUgSWhyZW4gQWRtaW5pc3RyYXRvci4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ2xvc2UgdGhpcyBtZXNzYWdlJ30gPSAnRGllc2UgTmFjaHJpY2h0IHNjaGxpZcOfZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTWljcm9zb2Z0IDM2NSBjb25uZWN0aW9uIGxvc3QuIFBsZWFzZSByZWNvbm5lY3QuJ30gPSAnTWljcm9zb2Z0LTM2NS1WZXJiaW5kdW5nIGdldHJlbm50LiBCaXR0ZSBlcm5ldXQgdmVyYmluZGVuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZWNvbm5lY3QnfSA9ICdFcm5ldXQgdmVyYmluZGVuJzsKCiAgICAjIERpYWxvZyBVSQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3VjY2Vzcyd9ID0gJ0VyZm9sZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydFcnJvcid9ID0gJ0ZlaGxlcic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydXYXJuaW5nJ30gPSAnV2FybnVuZyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydJbmZvcm1hdGlvbid9ID0gJ0luZm9ybWF0aW9uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvbmZpcm0nfSA9ICdCZXN0w6R0aWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYW5jZWwnfSA9ICdBYmJyZWNoZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnWWVzLCBjYW5jZWwnfSA9ICdKYSwgYWJzYWdlbic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyd9ID0gJ05laW4nOwoKICAgICMgQXBwb2ludG1lbnQgTWVzc2FnZXMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FwcG9pbnRtZW50IGNyZWF0ZWQnfSA9ICdUZXJtaW4gZXJzdGVsbHQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXBwb2ludG1lbnQgY3JlYXRlZCBzdWNjZXNzZnVsbHkhJ30gPSAnVGVybWluIGVyZm9sZ3JlaWNoIGVyc3RlbGx0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydPbi1zaXRlIGFwcG9pbnRtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISd9ID0gJ1Zvci1PcnQtVGVybWluIGVyZm9sZ3JlaWNoIGVyc3RlbGx0ISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDYWxlbmRhciBldmVudCBjcmVhdGVkLCBidXQgWm51bnkgYXBwb2ludG1lbnQgZmFpbGVkLid9ID0gJ0thbGVuZGVyZXJlaWduaXMgZXJzdGVsbHQsIGFiZXIgWm51bnktVGVybWluIGZlaGxnZXNjaGxhZ2VuLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydGYWlsZWQgdG8gY3JlYXRlIG1lZXRpbmcuJ30gPSAnRmVobGVyIGJlaW0gRXJzdGVsbGVuIGRlcyBNZWV0aW5ncy4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRmFpbGVkIHRvIGNyZWF0ZSBhcHBvaW50bWVudC4nfSA9ICdGZWhsZXIgYmVpbSBFcnN0ZWxsZW4gZGVzIFRlcm1pbnMuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ZhaWxlZCB0byBsb2FkIHRpY2tldCBkYXRhLid9ID0gJ0ZlaGxlciBiZWltIExhZGVuIGRlciBUaWNrZXQtRGF0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1BsZWFzZSBlbnRlciBhIGxvY2F0aW9uIGZvciB0aGUgb24tc2l0ZSBtZWV0aW5nLid9ID0gJ0JpdHRlIGdlYmVuIFNpZSBlaW5lbiBPcnQgZsO8ciBkZW4gVm9yLU9ydC1UZXJtaW4gZWluLic7CgogICAgIyBEaWFsb2cgQWN0aW9uIEJ1dHRvbnMKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvcHkgTGluayd9ID0gJ0xpbmsga29waWVyZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ29waWVkISd9ID0gJ0tvcGllcnQhJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0pvaW4gTWVldGluZyd9ID0gJ01lZXRpbmcgYmVpdHJldGVuJzsKCiAgICAjIFdpZGdldAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTG9hZGluZy4uLid9ID0gJ1dpcmQgZ2VsYWRlbi4uLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydKYXZhU2NyaXB0IGlzIHJlcXVpcmVkIGZvciBjb2xsYWJvcmF0aW9uIGZlYXR1cmVzLid9ID0gJ0phdmFTY3JpcHQgd2lyZCBmw7xyIEtvbGxhYm9yYXRpb25zZnVua3Rpb25lbiBiZW7DtnRpZ3QuJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>

        <!-- Custom Template Override (CSP for Microsoft 365) -->
        <File Permission="660" Location="Custom/Kernel/Output/HTML/Templates/Standard/HTTPHeaders.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIxIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDIxIFpudW55IEdtYkgsIGh0dHBzOi8vem51bnkub3JnLwojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCiMgTW9kaWZpZWQgZm9yIENvbGxhYm9yYXRpb24gQWRkLW9uOiBBZGRlZCBNaWNyb3NvZnQgMzY1IGVuZHBvaW50cyB0byBDU1AgY29ubmVjdC1zcmMKIyAtLQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD11dGYtOApbJSBJRiBEYXRhLkNvbnRlbnREaXNwb3NpdGlvbiAtJV0KQ29udGVudC1EaXNwb3NpdGlvbjogWyUgRGF0YS5Db250ZW50RGlzcG9zaXRpb24gJV0KWyUgRU5EIC0lXQpbJSBJRiAhQ29uZmlnKCdTZWN1cmU6OkRpc2FibGVCYW5uZXInKSAtJV0KWC1Qb3dlcmVkLUJ5OiBbJSBDb25maWcoIlByb2R1Y3QiKSAlXSBbJSBDb25maWcoIlZlcnNpb24iKSAlXSAoaHR0cHM6Ly93d3cuem51bnkub3JnLykKWyUgRU5EIC0lXQpYLVVBLUNvbXBhdGlibGU6IElFPWVkZ2UsY2hyb21lPTEKWyUgSUYgIUNvbmZpZygiRGlzYWJsZUlGcmFtZU9yaWdpblJlc3RyaWN0ZWQiKSAmJiAhRGF0YS5EaXNhYmxlSUZyYW1lT3JpZ2luUmVzdHJpY3RlZCAtJV0KWC1GcmFtZS1PcHRpb25zOiBTQU1FT1JJR0lOClslIEVORCAtJV0KWyUgSUYgIUNvbmZpZygiRGlzYWJsZUNvbnRlbnRTZWN1cml0eVBvbGljeSIpIC0lXQojIFNFQ1VSSVRZIE5PVEU6ICd1bnNhZmUtaW5saW5lJy8ndW5zYWZlLWV2YWwnIGluIHNjcmlwdC1zcmMgbWFrZSB0aGlzIENTUAojIGluZWZmZWN0aXZlIGFnYWluc3Qgc2NyaXB0IGluamVjdGlvbiAtIE1TQUwuanMgc3RvcmVzIHRoZSBNMzY1IE9BdXRoCiMgYWNjZXNzL3JlZnJlc2ggdG9rZW4gaW4gbG9jYWxTdG9yYWdlIChieSBkZXNpZ24sIHNlZSBDb2xsYWJvcmF0aW9uCiMgQ0xBVURFLm1kKSwgd2hpY2ggYW55IFhTUyBhbnl3aGVyZSBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIGNvdWxkIHRoZW4KIyByZWFkIGFuZCBleGZpbHRyYXRlLiBUaGlzIGlzIE5PVCBhIHNhZmUgZ2FwIHRvIGNsb3NlIGhlcmU6IFpudW55IGNvcmUncwojIG93biB0ZW1wbGF0ZXMgcmVseSBleHRlbnNpdmVseSBvbiBpbmxpbmUgPHNjcmlwdD4gYmxvY2tzIHRocm91Z2hvdXQgdGhlCiMgYWdlbnQgaW50ZXJmYWNlLCBzbyByZW1vdmluZyAndW5zYWZlLWlubGluZScgZnJvbSBzY3JpcHQtc3JjIHdvdWxkIGJyZWFrCiMgY29yZSBVSSBmYXIgYmV5b25kIHRoaXMgYWRkLW9uJ3Mgc2NvcGUsIG5vdCBqdXN0IENvbGxhYm9yYXRpb24uIEEgcmVhbAojIGZpeCBuZWVkcyBhIG5vbmNlLWJhc2VkIENTUCBhcHBsaWVkIHByb2R1Y3Qtd2lkZSBieSBabnVueSBpdHNlbGYsIG5vdCBhCiMgcGVyLWFkZC1vbiB0ZW1wbGF0ZSBvdmVycmlkZS4gTGVmdCB1bmNoYW5nZWQ7IGZsYWdnZWQgaGVyZSBzbyBpdCBpc24ndAojIG1pc3Rha2VuIGZvciBhbiBvdmVyc2lnaHQuCiMgZnJhbWUtc3JjOiBNU0FMJ3Mgc2lsZW50IHRva2VuIHJlbmV3YWwgKGFjcXVpcmVUb2tlblNpbGVudCdzIGZhbGxiYWNrCiMgb25jZSBhIGNhY2hlZCB0b2tlbiBjYW4ndCBiZSByZW5ld2VkIHB1cmVseSBmcm9tIGNhY2hlKSBsb2FkcyBhIGhpZGRlbgojIGlmcmFtZSBhdCBsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIHdpdGggcHJvbXB0PW5vbmUuIFdpdGhvdXQgdGhpcywKIyB0aGUgQ1NQIGZhbGxzIGJhY2sgdG8gZGVmYXVsdC1zcmMgZm9yIGZyYW1pbmcgZGVjaXNpb25zLCB3aGljaCBkb2Vzbid0CiMgaW5jbHVkZSBpdCAtIHRoZSBpZnJhbWUgZ2V0cyBzaWxlbnRseSBibG9ja2VkLCBicmVha2luZyBzaWxlbnQKIyByZW5ld2FsIG9uY2UgdGhlIGluaXRpYWwgYWNjZXNzIHRva2VuIGV4cGlyZXMgKH4xaCksIGV2ZW4gdGhvdWdoIHRoZQojIGluaXRpYWwgaW50ZXJhY3RpdmUgbG9naW4gKGEgcmVhbCBwb3B1cCB3aW5kb3csIG5vdCBhIGZyYW1lKSBhbmQKIyBjb25uZWN0LXNyYydzIG93biBYSFIvZmV0Y2ggY2FsbHMgYm90aCBrZWVwIHdvcmtpbmcuIFNhbWUgc3ltcHRvbQojIGV2ZXJ5IHRpbWU6IGxvb2tlZCBjb25uZWN0ZWQsIHRoZW4gcXVpZXRseSBkaXNjb25uZWN0ZWQgd2l0aCBubwojIHZpc2libGUgZXJyb3Igb25jZSB0aGUgdG9rZW4gbmVlZGVkIHJlbmV3aW5nLgojICdzZWxmJyBpcyBhbHNvIHJlcXVpcmVkIGhlcmU6IEF6dXJlIEFEJ3MgbGFzdCBzdGVwIGluIHRoYXQgc2FtZSBmbG93CiMgKHN1Y2Nlc3MgT1IgZXJyb3IsIGUuZy4gQUFEU1RTMTYwMDIxIGludGVyYWN0aW9uX3JlcXVpcmVkIHdoZW4gdGhlcmUncwojIG5vIGFjdGl2ZSBNaWNyb3NvZnQgU1NPIHNlc3Npb24gdG8gcmVuZXcgc2lsZW50bHkgYWdhaW5zdCkgcmVkaXJlY3RzCiMgdGhlIHZlcnkgc2FtZSBpZnJhbWUgYmFjayB0byBvdXIgb3duIHJlZGlyZWN0X3VyaSB0byBkZWxpdmVyIHRoZQojIHJlc3VsdCAtIHRoYXQgcmVkaXJlY3QtYmFjayBpcyBmcmFtaW5nIE9VUiBPV04gb3JpZ2luLCBhIHNlY29uZCwKIyBzZXBhcmF0ZSB0aGluZyBmcmFtZS1zcmMgaGFzIHRvIGFsbG93LCBub3QganVzdCB0aGUgaWRlbnRpdHkKIyBwcm92aWRlcidzIG93biBkb21haW4gZm9yIHRoZSBmaXJzdCBsZWcuCkNvbnRlbnQtU2VjdXJpdHktUG9saWN5OiBkZWZhdWx0LXNyYyAnc2VsZicgJ3Vuc2FmZS1pbmxpbmUnICd1bnNhZmUtZXZhbCcgZGF0YTogYmxvYjo7IGltZy1zcmMgJ3NlbGYnIGRhdGE6IGJsb2I6IGh0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbSBodHRwczovLyouc2hhcmVwb2ludC5jb207IGNvbm5lY3Qtc3JjICdzZWxmJyBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20gaHR0cHM6Ly9ncmFwaC5taWNyb3NvZnQuY29tIGh0dHBzOi8vKi5zaGFyZXBvaW50LmNvbTsgZnJhbWUtc3JjICdzZWxmJyBodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20KWyUgRU5EIC0lXQpYLUNvbnRlbnQtVHlwZS1PcHRpb25zOiBub3NuaWZmClJlZmVycmVyLVBvbGljeTogbm8tcmVmZXJyZXIKWyUgSUYgRGF0YS5YTG9naW5IZWFkZXIgLSVdCiMgV2l0aCB0aGlzIFgtSGVhZGVyLCBDb3JlLkFKQVggY2FuIHJlY29nbml6ZSB0aGF0IHRoZSBBSkFYIHJlcXVlc3QgcmV0dXJuZWQgdGhlIGxvZ2luIHBhZ2UgKHNlc3Npb24gdGltZW91dCkgYW5kIHBlcmZvcm0gYSByZWRpcmVjdC4KWC1PVFJTLUxvZ2luOiBbJSBFbnYoIkJhc2VsaW5rIikgJV0KWyUgRU5EIC0lXQpFeHBpcmVzOiBUdWUsIDEgSmFuIDE5ODAgMTI6MDA6MDAgR01UCkNhY2hlLUNvbnRyb2w6IG5vLWNhY2hlClByYWdtYTogbm8tY2FjaGUK</File>

        <!-- JavaScript - Core -->
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50CiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gUHJvdmlkZXIgQWJzdHJhY3Rpb24gTGF5ZXIKICoKICogICAgICBUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHVuaWZpZWQgaW50ZXJmYWNlIGZvciBjb2xsYWJvcmF0aW9uIHByb3ZpZGVycwogKiAgICAgIChNaWNyb3NvZnQgMzY1LCBHb29nbGUgV29ya3NwYWNlLCBldGMuKS4gVGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbgogKiAgICAgIGlzIGRlbGVnYXRlZCB0byBwcm92aWRlci1zcGVjaWZpYyBtb2R1bGVzLgogKgogKiAgICAgIEFyY2hpdGVjdHVyZToKICogICAgICAtIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5qcyAodGhpcyBmaWxlKSAtIEludGVyZmFjZS9SZWdpc3RyeQogKiAgICAgIC0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2suanMgLSBEZXZlbG9wbWVudC9UZXN0aW5nCiAqICAgICAgLSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NS5qcyAtIE1pY3Jvc29mdCAzNjUKICogICAgICAtIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSS5qcyAtIFVJIENvbXBvbmVudHMKICovCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgpDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIFZhcmlhYmxlcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdHJ5IG9mIGF2YWlsYWJsZSBwcm92aWRlcnMKICAgICAqLwogICAgdmFyIFByb3ZpZGVycyA9IHt9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50bHkgYWN0aXZlIHByb3ZpZGVyIGluc3RhbmNlCiAgICAgKi8KICAgIHZhciBBY3RpdmVQcm92aWRlciA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZhbGxiYWNrIHByb3ZpZGVyIGluc3RhbmNlICh1c2VkIHdoZW4gcHJpbWFyeSBmYWlscykKICAgICAqLwogICAgdmFyIEZhbGxiYWNrUHJvdmlkZXIgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnCiAgICAgKi8KICAgIHZhciBDb25maWcgPSB7CiAgICAgICAgUHJvdmlkZXI6ICdNb2NrJywKICAgICAgICBFbmFibGVBdmF0YXI6IHRydWUsCiAgICAgICAgRW5hYmxlUHJlc2VuY2U6IHRydWUsCiAgICAgICAgRW5hYmxlSG92ZXJDYXJkczogdHJ1ZSwKICAgICAgICBFbmFibGVDaGF0OiB0cnVlLAogICAgICAgIEVuYWJsZUNhbGw6IHRydWUsCiAgICAgICAgRW5hYmxlTWVldGluZ3M6IGZhbHNlLAogICAgICAgIFNob3dJbkhlYWRlcjogdHJ1ZSwKICAgICAgICBTaG93SW5UaWNrZXRJbmZvOiB0cnVlLAogICAgICAgIFNob3dJbkFydGljbGVzOiB0cnVlLAogICAgICAgIFNob3dDdXN0b21lckluZm9XaWRnZXQ6IHRydWUsCiAgICAgICAgSGlkZU5hdGl2ZUN1c3RvbWVySW5mbzogdHJ1ZSwKICAgICAgICBDYWNoZTogewogICAgICAgICAgICBBdmF0YXJUVEw6IDM2MDAsCiAgICAgICAgICAgIFByZXNlbmNlVFRMOiA2MCwKICAgICAgICAgICAgUHJvZmlsZVRUTDogODY0MDAKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBmb3IgYXZhdGFycywgcHJlc2VuY2UsIHByb2ZpbGVzCiAgICAgKi8KICAgIHZhciBDYWNoZSA9IHsKICAgICAgICBBdmF0YXJzOiB7fSwKICAgICAgICBQcmVzZW5jZToge30sCiAgICAgICAgUHJvZmlsZXM6IHt9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNYXBzIGVtYWlsIHRvIHByb3ZpZGVyIG5hbWUgKCdwcmltYXJ5JyBvciAnZmFsbGJhY2snKQogICAgICogICAgICAgICAgICAgIERldGVybWluZWQgYnkgR2V0UHJvZmlsZSAtIGlmIHByaW1hcnkgcHJvdmlkZXIga25vd3MgdGhlIHVzZXIsCiAgICAgKiAgICAgICAgICAgICAgYWxsIGRhdGEgY29tZXMgZnJvbSBwcmltYXJ5LiBJZiBub3QsIGFsbCBkYXRhIGZyb20gZmFsbGJhY2suCiAgICAgKi8KICAgIHZhciBVc2VyUHJvdmlkZXJNYXAgPSB7fTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gVHJhY2tzIHBlbmRpbmcgcmVxdWVzdHMgdG8gYXZvaWQgZHVwbGljYXRlIHBhcmFsbGVsIGNhbGxzCiAgICAgKiAgICAgICAgICAgICAgRm9ybWF0OiB7ICdBdmF0YXJzJzogeyAnZW1haWwnOiBQcm9taXNlIH0sICdQcmVzZW5jZSc6IHsgJ2VtYWlsJzogUHJvbWlzZSB9IH0KICAgICAqLwogICAgdmFyIFBlbmRpbmdSZXF1ZXN0cyA9IHsKICAgICAgICBBdmF0YXJzOiB7fSwKICAgICAgICBQcmVzZW5jZToge30KICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEV2ZW50IGxpc3RlbmVycwogICAgICovCiAgICB2YXIgRXZlbnRMaXN0ZW5lcnMgPSB7CiAgICAgICAgJ2xvZ2luJzogW10sCiAgICAgICAgJ2xvZ291dCc6IFtdLAogICAgICAgICdwcmVzZW5jZUNoYW5nZSc6IFtdLAogICAgICAgICdlcnJvcic6IFtdCiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBXaGV0aGVyIHRoZSBtb2R1bGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQKICAgICAqLwogICAgdmFyIEluaXRpYWxpemVkID0gZmFsc2U7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIEhlbHBlciBGdW5jdGlvbnMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFRyYW5zbGF0ZQogICAgICogQGRlc2NyaXB0aW9uIEhlbHBlciB0byB0cmFuc2xhdGUgdGV4dCB2aWEgQ29yZS5MYW5ndWFnZSBpZiBhdmFpbGFibGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBUZXh0IC0gVGV4dCB0byB0cmFuc2xhdGUKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRyYW5zbGF0ZWQgdGV4dCBvciBvcmlnaW5hbAogICAgICovCiAgICBmdW5jdGlvbiBUcmFuc2xhdGUoVGV4dCkgewogICAgICAgIGlmICh0eXBlb2YgQ29yZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQ29yZS5MYW5ndWFnZSAmJiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSkgewogICAgICAgICAgICByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoVGV4dCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBUZXh0OwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dNZXNzYWdlQm94CiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBhIFpudW55LXN0eWxlIE1lc3NhZ2VCb3ggbm90aWZpY2F0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gVHlwZSAtICdFcnJvcicgb3IgJ1dhcm5pbmcnCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTWVzc2FnZSAtIE1lc3NhZ2UgdG8gZGlzcGxheQogICAgICovCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQnVpbGQgdGhlIG5hdGl2ZS1zdHlsZSBhY3Rpb24gYnV0dG9uIHJvdwogICAgICogKC5hbGVydEFjdGlvbnMgPiAuYWxlcnRCdXR0b24pIGZvciBhIG1lc3NhZ2UgLSBzYW1lIG1hcmt1cCBabnVueSdzCiAgICAgKiBvd24gTW9kdWxlLkFsZXJ0LmpzIHByb2R1Y2VzIGZyb20gSlNPTiBhY3Rpb24gZGF0YSwgZS5nLiB0aGUKICAgICAqIGRhZW1vbiB3YXJuaW5nJ3MgIkNvbnRpbnVlIiBidXR0b24gLSBzbyBvdXIgb3duIGFjdGlvbiBsaW5rcwogICAgICogKGxpa2UgIk9wZW4gc2V0dGluZ3MiKSBsb29rIGFuZCBiZWhhdmUgbGlrZSBuYXRpdmUgb25lcyBpbnN0ZWFkCiAgICAgKiBvZiBhIHBsYWluIHVuZGVybGluZWQgdGV4dCBsaW5rLgogICAgICogQHBhcmFtIHtBcnJheX0gQWN0aW9ucyAtIFt7dXJsLCB0ZXh0fV0gZm9yIGEgcGxhaW4gbmF2aWdhdGlvbiBsaW5rLAogICAgICogb3IgW3tvbkNsaWNrLCB0ZXh0fV0gZm9yIGEgSlMgYWN0aW9uIChlLmcuIHJlY29ubmVjdGluZykgLSBvcgogICAgICogZmFsc3kvZW1wdHkgZm9yIG5vbmUuIEVhY2ggb25DbGljayBhY3Rpb24gZ2V0cyBhCiAgICAgKiBkYXRhLWNvbGxhYi1hY3Rpb24taW5kZXggZm9yIFdpcmVBY3Rpb25IYW5kbGVycyB0byBmaW5kIGJlbG93LgogICAgICogQHJldHVybnMge1N0cmluZ30gSFRNTCwgb3IgJycgaWYgdGhlcmUgYXJlIG5vIGFjdGlvbnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEJ1aWxkQWxlcnRBY3Rpb25zSFRNTChBY3Rpb25zKSB7CiAgICAgICAgaWYgKCFBY3Rpb25zIHx8ICFBY3Rpb25zLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHZhciBIdG1sID0gJzxkaXYgY2xhc3M9ImFsZXJ0QWN0aW9ucyI+JzsKICAgICAgICBBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKEFjdGlvbiwgSW5kZXgpIHsKICAgICAgICAgICAgdmFyIEluZGV4QXR0ciA9IEFjdGlvbi5vbkNsaWNrID8gJyBkYXRhLWNvbGxhYi1hY3Rpb24taW5kZXg9IicgKyBJbmRleCArICciJyA6ICcnOwogICAgICAgICAgICBIdG1sICs9ICc8YSBjbGFzcz0iYnRuLXByaW1hcnkgYWxlcnRCdXR0b24gYWxlcnRCdXR0b25Ob3RpZnkiIGhyZWY9IicgKyAoQWN0aW9uLnVybCB8fCAnIycpICsgJyInICsgSW5kZXhBdHRyICsgJz4nICsKICAgICAgICAgICAgICAgIEFjdGlvbi50ZXh0ICsgJzwvYT4nOwogICAgICAgIH0pOwogICAgICAgIEh0bWwgKz0gJzwvZGl2Pic7CiAgICAgICAgcmV0dXJuIEh0bWw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFdpcmUgdXAgb25DbGljayBjYWxsYmFja3MgZm9yIGFjdGlvbnMgYnVpbHQgYnkKICAgICAqIEJ1aWxkQWxlcnRBY3Rpb25zSFRNTCAodGhlIGhyZWYtb25seSBvbmVzIG5lZWQgbm8gSlMgLSB0aGV5J3JlCiAgICAgKiByZWFsIG5hdmlnYXRpb24gbGlua3MpLiBDbGlja2luZyBvbmUgY2xvc2VzIHRoZSBtZXNzYWdlLCBzaW5jZQogICAgICogdGhlIGFjdGlvbiAoZS5nLiByZWNvbm5lY3RpbmcpIG1ha2VzIGl0IG9ic29sZXRlLgogICAgICogQHBhcmFtIHtqUXVlcnl9ICRDb250YWluZXIgLSBUaGUgbWVzc2FnZS9tZXNzYWdlQm94IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge0FycmF5fSBBY3Rpb25zIC0gU2FtZSBhcnJheSBwYXNzZWQgdG8gQnVpbGRBbGVydEFjdGlvbnNIVE1MLgogICAgICovCiAgICBmdW5jdGlvbiBXaXJlQWN0aW9uSGFuZGxlcnMoJENvbnRhaW5lciwgQWN0aW9ucykgewogICAgICAgIGlmICghQWN0aW9ucyB8fCAhQWN0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBBY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKEFjdGlvbiwgSW5kZXgpIHsKICAgICAgICAgICAgaWYgKCFBY3Rpb24ub25DbGljaykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDb250YWluZXIuZmluZCgnW2RhdGEtY29sbGFiLWFjdGlvbi1pbmRleD0iJyArIEluZGV4ICsgJyJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgJENvbnRhaW5lci5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIEFjdGlvbi5vbkNsaWNrKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIFNob3dNZXNzYWdlQm94KFR5cGUsIE1lc3NhZ2UsIEFjdGlvbnMpIHsKICAgICAgICB2YXIgaWNvbiA9IFR5cGUgPT09ICdFcnJvcicgPyAnZmEtZXhjbGFtYXRpb24tY2lyY2xlJyA6ICdmYS1leGNsYW1hdGlvbi10cmlhbmdsZSc7CgogICAgICAgIC8vIE9ubHkgYWRkIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQuIFVzZXMgYSBkZWRpY2F0ZWQsIG5hbWVzcGFjZWQKICAgICAgICAvLyBtYXJrZXIgY2xhc3MgKENvbGxhYk1zZ3tUeXBlfSkgcmF0aGVyIHRoYW4gYSBiYXJlIEVycm9yL1dhcm5pbmcKICAgICAgICAvLyBjbGFzcyBmb3IgdGhpcyBjaGVjayAtIFpudW55J3Mgb3duIENvcmUuRGVmYXVsdC5jc3Mgc3R5bGVzIEFOWQogICAgICAgIC8vIGVsZW1lbnQgY2FycnlpbmcgYSBiYXJlIC5FcnJvci8uV2FybmluZyBjbGFzcyB3aXRoIGEgZ2VuZXJpYwogICAgICAgIC8vIHJlZC95ZWxsb3cgYmFja2dyb3VuZCtib3JkZXIgKGEgZ2xvYmFsIHV0aWxpdHkgY2xhc3MsIG1lYW50CiAgICAgICAgLy8gZm9yIHRoaW5ncyBsaWtlIGZvcm0tdmFsaWRhdGlvbiBtZXNzYWdlcyksIHdoaWNoIHdvdWxkCiAgICAgICAgLy8gb3RoZXJ3aXNlIHNpbGVudGx5IGRvdWJsZSB1cCB3aXRoIHRoZSBuYXRpdmUgYWxlcnQncyBvd24KICAgICAgICAvLyBiYWNrZ3JvdW5kIG9uIHRoZSB0cmF5IHBhdGggYmVsb3cgKHZpc2libGUgYXMgYSBtaXNtYXRjaGVkLAogICAgICAgIC8vIHNsaWdodGx5LW92ZXJzaXplZCwgc3F1YXJlLWNvcm5lcmVkIHRpbnQgYmVoaW5kIHRoZSBwcm9wZXJseQogICAgICAgIC8vIHJvdW5kZWQgbmF0aXZlIGFsZXJ0IGNhcmQpLgogICAgICAgIGlmICgkKCcuQ29sbGFiTXNnJyArIFR5cGUpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gWm51bnkgNy4zLngrIHNoaXBzIGEgcGVyc2lzdGVudCwgYWx3YXlzLXByZXNlbnQgbmF0aXZlCiAgICAgICAgLy8gbm90aWZpY2F0aW9uIHRyYXkgKC5tb2QubW9kTm90aWZpY2F0aW9uID4gLmlubmVyID4gLm1lc3NhZ2VzIC0KICAgICAgICAvLyBmaXhlZCB0b3AtcmlnaHQsIHNlZSBNb2R1bGUuTm90aWZpY2F0aW9uLmNzcy8uanMpLCB1c2VkIGUuZy4KICAgICAgICAvLyBmb3IgdGhlIG5hdGl2ZSAiRGFlbW9uIGlzIG5vdCBydW5uaW5nIiB3YXJuaW5nLiBSZXVzZSBpdHMgZXhhY3QKICAgICAgICAvLyBjbGFzc2VzIChtZXNzYWdlIG1lc3NhZ2V7VHlwZX0sIG1vZCBtb2RBbGVydCA+IGlubmVyID4gYWxlcnQKICAgICAgICAvLyBhbGVydFR5cGV7VHlwZX0gPiBhbGVydENvbnRlbnQsIG5vdGlmaWNhdGlvbkNsb3NlKSBzbyBvdXIgb3duCiAgICAgICAgLy8gbWVzc2FnZXMgbG9vayBhbmQgc2l0IGV4YWN0bHkgbGlrZSBuYXRpdmUgb25lcyAtIHN0YWNraW5nIGluCiAgICAgICAgLy8gdGhlIHNhbWUgdHJheSwgc2FtZSBjYXJkIHN0eWxpbmcgLSBpbnN0ZWFkIG9mIHRoZSBvbGQKICAgICAgICAvLyBmdWxsLXdpZHRoIGlubGluZSBiYW5uZXIgZnJvbSBwcmUtNy4zLngncyBkZXNpZ24uIERlbGliZXJhdGVseQogICAgICAgIC8vIE5PVCBob29raW5nIGludG8gWm51bnkncyBvd24gaW50ZXJuYWwgSlMgbW9kdWxlL3NhbmRib3ggc3lzdGVtCiAgICAgICAgLy8gdG8gYnVpbGQvbWFuYWdlIHRoaXMgKHVuZG9jdW1lbnRlZCwgdmVyc2lvbi1zcGVjaWZpYywgYW5kIHRoaXMKICAgICAgICAvLyB0cmF5IGRvZXNuJ3QgZXhpc3QgYXQgYWxsIHByZS03LjMueCAtIHNlZSB0aGUgZmFsbGJhY2sgYmVsb3cpIC0KICAgICAgICAvLyBqdXN0IGJvcnJvd2luZyB0aGUgc3RhYmxlLCBwdWJsaWMgQ1NTIGNsYXNzZXM7IG9wZW4vY2xvc2UgaXMKICAgICAgICAvLyBvdXIgb3duIHNtYWxsLCBzZWxmLWNvbnRhaW5lZCBoYW5kbGVyLCBzYW1lIGFzIGJlZm9yZS4KICAgICAgICB2YXIgJFRyYXlJbm5lciA9ICQoJy5tb2QubW9kTm90aWZpY2F0aW9uID4gLmlubmVyJykuZmlyc3QoKTsKICAgICAgICB2YXIgJFRyYXkgPSAkVHJheUlubmVyLmZpbmQoJz4gLm1lc3NhZ2VzJykuZmlyc3QoKTsKCiAgICAgICAgaWYgKCRUcmF5Lmxlbmd0aCkgewogICAgICAgICAgICAvLyBNYXRjaCB0aGUgbmF0aXZlIGNsb3NlIGJ1dHRvbiBleGFjdGx5IChzYW1lIGljb24gaW1hZ2UsCiAgICAgICAgICAgIC8vIG5vdCBqdXN0IHRoZSBzYW1lIGNpcmN1bGFyLWJhZGdlIENTUykgLSByZWFkIGl0cyBwYXRoIGZyb20KICAgICAgICAgICAgLy8gdGhlIHRyYXkncyBvd24gZGF0YSBhdHRyaWJ1dGUgKHNldCBzZXJ2ZXItc2lkZSBmcm9tCiAgICAgICAgICAgIC8vIEZyb250ZW5kOjpJbWFnZVBhdGgsIHNlZSBOb3RpZmljYXRpb24udHQpIHJhdGhlciB0aGFuCiAgICAgICAgICAgIC8vIGhhcmRjb2RpbmcgYSBza2luLXNwZWNpZmljIHBhdGguCiAgICAgICAgICAgIHZhciBDbG9zZUljb25QYXRoID0gJFRyYXlJbm5lci5hdHRyKCdkYXRhLWNsb3NlLWljb24tcGF0aCcpOwogICAgICAgICAgICB2YXIgQ2xvc2VUcmFuc2xhdGlvbiA9ICRUcmF5SW5uZXIuYXR0cignZGF0YS1jbG9zZS10cmFuc2xhdGlvbicpIHx8IFRyYW5zbGF0ZSgnQ2xvc2UgdGhpcyBtZXNzYWdlJyk7CiAgICAgICAgICAgIHZhciBDbG9zZUh0bWwgPSBDbG9zZUljb25QYXRoCiAgICAgICAgICAgICAgICA/ICc8aW1nIHNyYz0iJyArIENsb3NlSWNvblBhdGggKyAnIiBhbHQ9IicgKyBDbG9zZVRyYW5zbGF0aW9uICsgJyI+JwogICAgICAgICAgICAgICAgOiAnPGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+JzsKCiAgICAgICAgICAgIHZhciAkTWVzc2FnZSA9ICQoCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0ibWVzc2FnZSBtZXNzYWdlJyArIFR5cGUgKyAnIENvbGxhYm9yYXRpb25NZXNzYWdlIENvbGxhYk1zZycgKyBUeXBlICsgJyI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9Im1vZCBtb2RBbGVydCI+PGRpdiBjbGFzcz0iaW5uZXIiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iYWxlcnQgYWxlcnRUeXBlJyArIFR5cGUgKyAnIj4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJhbGVydENvbnRlbnQiPjxpIGNsYXNzPSJmYSAnICsgaWNvbiArICciPjwvaT4gJyArIE1lc3NhZ2UgKyAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZEFsZXJ0QWN0aW9uc0hUTUwoQWN0aW9ucykgKwogICAgICAgICAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAgICAgJzwvZGl2PjwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0ibm90aWZpY2F0aW9uQ2xvc2UiIHRpdGxlPSInICsgQ2xvc2VUcmFuc2xhdGlvbiArICciPicgKyBDbG9zZUh0bWwgKyAnPC9zcGFuPicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRNZXNzYWdlLmZpbmQoJy5ub3RpZmljYXRpb25DbG9zZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlLnJlbW92ZSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgV2lyZUFjdGlvbkhhbmRsZXJzKCRNZXNzYWdlLCBBY3Rpb25zKTsKCiAgICAgICAgICAgICRUcmF5LmFwcGVuZCgkTWVzc2FnZSk7CgogICAgICAgICAgICAvLyBNYXRjaCB0aGUgbmF0aXZlIG1vZHVsZSdzIG93biBicmllZiBkZWxheSBiZWZvcmUgYWRkaW5nCiAgICAgICAgICAgIC8vIC5tZXNzYWdlQWN0aXZlICh0cmlnZ2VycyBpdHMgc2xpZGUtaW4gdHJhbnNmb3JtL3RyYW5zaXRpb24pCiAgICAgICAgICAgIC8vIHNvIG91cnMgYW5pbWF0ZXMgaW4gdGhlIHNhbWUgd2F5IGFzIG5hdGl2ZSBub3RpZmljYXRpb25zLgogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICRNZXNzYWdlLmFkZENsYXNzKCdtZXNzYWdlQWN0aXZlJyk7CiAgICAgICAgICAgIH0sIDIwMCk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBGYWxsYmFjayBmb3IgcHJlLTcuMy54IGxpbmVzLCB3aGljaCBkb24ndCBoYXZlIHRoZSBuYXRpdmUKICAgICAgICAvLyBub3RpZmljYXRpb24gdHJheSBhYm92ZSAtIHRoZSBvcmlnaW5hbCBpbmxpbmUgTWVzc2FnZUJveAogICAgICAgIC8vIGJhbm5lci4KICAgICAgICAvLyBCYXJlIFR5cGUgKEVycm9yL1dhcm5pbmcpIGhlcmUgSVMgaW50ZW50aW9uYWwgYW5kIHJlcXVpcmVkIC0KICAgICAgICAvLyBuYXRpdmUgQ29yZS5Db21wb25lbnRzLmNzcyBzdHlsZXMgLk1lc3NhZ2VCb3guRXJyb3IvLldhcm5pbmcKICAgICAgICAvLyBkaXJlY3RseSAodGhlIHNhbWUgcGF0dGVybiBabnVueSdzIG93biAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoKQogICAgICAgIC8vIHVzZXMgZm9yIHRoaXMgcHJlLTcuMy54IGJhbm5lciksIHVubGlrZSB0aGUgdHJheSBwYXRoIGFib3ZlLgogICAgICAgIHZhciBjc3NDbGFzcyA9ICdNZXNzYWdlQm94IENvbGxhYm9yYXRpb25NZXNzYWdlIENvbGxhYk1zZycgKyBUeXBlICsgJyAnICsgVHlwZTsKICAgICAgICB2YXIgJG1lc3NhZ2VCb3ggPSAkKAogICAgICAgICAgICAnPGRpdiBjbGFzcz0iJyArIGNzc0NsYXNzICsgJyI+JyArCiAgICAgICAgICAgICAgICAnPHNwYW4+PGkgY2xhc3M9ImZhICcgKyBpY29uICsgJyI+PC9pPjwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICc8cD4nICsgTWVzc2FnZSArICc8L3A+JyArCiAgICAgICAgICAgICAgICBCdWlsZEFsZXJ0QWN0aW9uc0hUTUwoQWN0aW9ucykgKwogICAgICAgICAgICAgICAgJzxhIGNsYXNzPSJDbG9zZSBpY29uLWhvdmVyIiB0aXRsZT0iJyArIFRyYW5zbGF0ZSgnQ2xvc2UgdGhpcyBtZXNzYWdlJykgKyAnIiBocmVmPSIjIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+JyArCiAgICAgICAgICAgICAgICAnPC9hPicgKwogICAgICAgICAgICAnPC9kaXY+JwogICAgICAgICk7CgogICAgICAgIC8vIEFkZCBjbG9zZSBoYW5kbGVyCiAgICAgICAgJG1lc3NhZ2VCb3guZmluZCgnLkNsb3NlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLk1lc3NhZ2VCb3gnKS5yZW1vdmUoKTsKICAgICAgICB9KTsKICAgICAgICBXaXJlQWN0aW9uSGFuZGxlcnMoJG1lc3NhZ2VCb3gsIEFjdGlvbnMpOwoKICAgICAgICAvLyBJbnNlcnQgaW4gdGhlIG5vdGlmaWNhdGlvbiBhcmVhIChiZXR3ZWVuIEhlYWRlciBhbmQgTWFpbkJveCkKICAgICAgICAvLyBabnVueSBwbGFjZXMgTWVzc2FnZUJveGVzIGFmdGVyICNIZWFkZXIsIGJlZm9yZSAuTWFpbkJveAogICAgICAgIHZhciAkbWFpbkJveCA9ICQoJy5NYWluQm94JykuZmlyc3QoKTsKICAgICAgICB2YXIgJGV4aXN0aW5nTWVzc2FnZXMgPSAkKCcjQXBwV3JhcHBlciA+IC5NZXNzYWdlQm94JykubGFzdCgpOwoKICAgICAgICBpZiAoJGV4aXN0aW5nTWVzc2FnZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAvLyBJbnNlcnQgYWZ0ZXIgbGFzdCBleGlzdGluZyBNZXNzYWdlQm94CiAgICAgICAgICAgICRleGlzdGluZ01lc3NhZ2VzLmFmdGVyKCRtZXNzYWdlQm94KTsKICAgICAgICB9IGVsc2UgaWYgKCRtYWluQm94Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSBNYWluQm94IChzYW1lIHBvc2l0aW9uIGFzIG5hdGl2ZSBabnVueSBub3RpZmljYXRpb25zKQogICAgICAgICAgICAkbWFpbkJveC5iZWZvcmUoJG1lc3NhZ2VCb3gpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrOiBpbnNlcnQgYWZ0ZXIgSGVhZGVyCiAgICAgICAgICAgIHZhciAkaGVhZGVyID0gJCgnI0hlYWRlcicpOwogICAgICAgICAgICBpZiAoJGhlYWRlci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAkaGVhZGVyLmFmdGVyKCRtZXNzYWdlQm94KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIExhc3QgcmVzb3J0OiBwcmVwZW5kIHRvIEFwcFdyYXBwZXIKICAgICAgICAgICAgICAgICQoJyNBcHBXcmFwcGVyJykucHJlcGVuZCgkbWVzc2FnZUJveCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgU2hvd0NvbmZpZ3VyYXRpb25FcnJvcgogICAgICogQGRlc2NyaXB0aW9uIFNob3cgYSB2aXNpYmxlIGVycm9yIG5vdGlmaWNhdGlvbiBhYm91dCBtaXNzaW5nIGNvbmZpZ3VyYXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBNZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dDb25maWd1cmF0aW9uRXJyb3IoTWVzc2FnZSkgewogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gTTM2NSBjb25maWd1cmF0aW9uIGVycm9yIGFuZCBhZGQgYSBkaXJlY3QgbGluawogICAgICAgIHZhciBEaXNwbGF5TWVzc2FnZSA9IE1lc3NhZ2U7CiAgICAgICAgdmFyIEFjdGlvbnMgPSBudWxsOwogICAgICAgIGlmIChNZXNzYWdlLmluZGV4T2YoJ00zNjUgUHJvdmlkZXInKSAhPT0gLTEgJiYgTWVzc2FnZS5pbmRleE9mKCdNaXNzaW5nIHJlcXVpcmVkIFN5c0NvbmZpZycpICE9PSAtMSkgewogICAgICAgICAgICAvLyBFeHRyYWN0IG1pc3Npbmcgc2V0dGluZ3MgZnJvbSBtZXNzYWdlIGFuZCBmb3JtYXQgdGhlbSBuaWNlbHkKICAgICAgICAgICAgdmFyIE1pc3NpbmdTZXR0aW5ncyA9IFtdOwogICAgICAgICAgICBpZiAoTWVzc2FnZS5pbmRleE9mKCdUZW5hbnRJRCcpICE9PSAtMSkgTWlzc2luZ1NldHRpbmdzLnB1c2goJ1RlbmFudElEJyk7CiAgICAgICAgICAgIGlmIChNZXNzYWdlLmluZGV4T2YoJ0NsaWVudElEJykgIT09IC0xKSBNaXNzaW5nU2V0dGluZ3MucHVzaCgnQ2xpZW50SUQnKTsKICAgICAgICAgICAgaWYgKE1lc3NhZ2UuaW5kZXhPZignUmVkaXJlY3RVUkknKSAhPT0gLTEpIE1pc3NpbmdTZXR0aW5ncy5wdXNoKCdSZWRpcmVjdFVSSScpOwoKICAgICAgICAgICAgLy8gQnVpbGQgbGluayB0byBTeXNDb25maWcgc2VhcmNoIGZvciBhbGwgTTM2NSBzZXR0aW5ncwogICAgICAgICAgICB2YXIgQmFzZWxpbmsgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgfHwgJ2luZGV4LnBsPyc7CiAgICAgICAgICAgIHZhciBTeXNDb25maWdMaW5rID0gQmFzZWxpbmsgKyAnQWN0aW9uPUFkbWluU3lzdGVtQ29uZmlndXJhdGlvbjtTdWJhY3Rpb249U2VhcmNoO1NlYXJjaD1Db2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NSc7CgogICAgICAgICAgICAvLyBGb3JtYXQ6ICJDb2xsYWJvcmF0aW9uIEFkZC1vbjogVGVuYW50SUQsIENsaWVudElELCBSZWRpcmVjdFVSSSBuaWNodCBrb25maWd1cmllcnQuIgogICAgICAgICAgICAvLyAiT3BlbiBzZXR0aW5ncyIgaXMgYSBwcm9wZXIgYWN0aW9uIGJ1dHRvbiAoc2VlCiAgICAgICAgICAgIC8vIEJ1aWxkQWxlcnRBY3Rpb25zSFRNTCksIHN0eWxlZCBsaWtlIHRoZSBuYXRpdmUgIkNvbnRpbnVlIgogICAgICAgICAgICAvLyBidXR0b24gb24gWm51bnkncyBvd24gZGFlbW9uIHdhcm5pbmcsIGluc3RlYWQgb2YgYW4gaW5saW5lCiAgICAgICAgICAgIC8vIHVuZGVybGluZWQgdGV4dCBsaW5rLgogICAgICAgICAgICBEaXNwbGF5TWVzc2FnZSA9IFRyYW5zbGF0ZSgnQ29sbGFib3JhdGlvbiBBZGQtb246JykgKyAnICcgKwogICAgICAgICAgICAgICAgTWlzc2luZ1NldHRpbmdzLmpvaW4oJywgJykgKyAnICcgKyBUcmFuc2xhdGUoJ25vdCBjb25maWd1cmVkLicpOwogICAgICAgICAgICBBY3Rpb25zID0gW3sgdXJsOiBTeXNDb25maWdMaW5rLCB0ZXh0OiBUcmFuc2xhdGUoJ09wZW4gc2V0dGluZ3MnKSB9XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBEaXNwbGF5TWVzc2FnZSA9IE1lc3NhZ2UgKyAnICcgKyBUcmFuc2xhdGUoJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci4nKTsKICAgICAgICB9CiAgICAgICAgU2hvd01lc3NhZ2VCb3goJ0Vycm9yJywgRGlzcGxheU1lc3NhZ2UsIEFjdGlvbnMpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dDb25maWd1cmF0aW9uV2FybmluZwogICAgICogQGRlc2NyaXB0aW9uIFNob3cgYSB2aXNpYmxlIHdhcm5pbmcgbm90aWZpY2F0aW9uIGFib3V0IHJlY29tbWVuZGVkIGNvbmZpZ3VyYXRpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBNZXNzYWdlIC0gV2FybmluZyBtZXNzYWdlIHRvIGRpc3BsYXkKICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0NvbmZpZ3VyYXRpb25XYXJuaW5nKE1lc3NhZ2UsIEFjdGlvbnMpIHsKICAgICAgICBTaG93TWVzc2FnZUJveCgnV2FybmluZycsIE1lc3NhZ2UsIEFjdGlvbnMpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJvdmlkZXIgSW50ZXJmYWNlIERlZmluaXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFByb3ZpZGVyIEludGVyZmFjZSAtIEFsbCBwcm92aWRlcnMgbXVzdCBpbXBsZW1lbnQgdGhlc2UgbWV0aG9kcy4KICAgICAqICAgICAgTWV0aG9kcyByZXR1cm4gUHJvbWlzZXMgZm9yIGFzeW5jIG9wZXJhdGlvbnMuCiAgICAgKgogICAgICogQGludGVyZmFjZSBQcm92aWRlckludGVyZmFjZQogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gaW5pdChjb25maWcpIC0gSW5pdGlhbGl6ZSBwcm92aWRlcgogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gbG9naW4oKSAtIEludGVyYWN0aXZlIGxvZ2luCiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBsb2dvdXQoKSAtIExvZ291dAogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gaXNMb2dnZWRJbigpIC0gQ2hlY2sgbG9naW4gc3RhdHVzCiAgICAgKiBAcHJvcGVydHkge0Z1bmN0aW9ufSBnZXRDdXJyZW50VXNlcigpIC0gR2V0IGxvZ2dlZC1pbiB1c2VyIGluZm8KICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldEF2YXRhcihlbWFpbCkgLSBHZXQgYXZhdGFyIFVSTAogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0UHJlc2VuY2UoZW1haWwpIC0gR2V0IG9ubGluZSBzdGF0dXMKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldFByb2ZpbGUoZW1haWwpIC0gR2V0IHVzZXIgcHJvZmlsZQogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0RnJlZUJ1c3koZW1haWxzLCBzdGFydCwgZW5kKSAtIEdldCBhdmFpbGFiaWxpdHkKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGNyZWF0ZU1lZXRpbmcoZGV0YWlscykgLSBDcmVhdGUgb25saW5lIG1lZXRpbmcKICAgICAqIEBwcm9wZXJ0eSB7RnVuY3Rpb259IGdldENoYXRMaW5rKGVtYWlsKSAtIEdldCBjaGF0IGRlZXAtbGluawogICAgICogQHByb3BlcnR5IHtGdW5jdGlvbn0gZ2V0Q2FsbExpbmsoZW1haWwpIC0gR2V0IGNhbGwgZGVlcC1saW5rCiAgICAgKiBAcHJvcGVydHkge09iamVjdH0gY2FwYWJpbGl0aWVzIC0gV2hhdCBmZWF0dXJlcyB0aGlzIHByb3ZpZGVyIHN1cHBvcnRzCiAgICAgKi8KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gSW5pdGlhbGl6YXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZSB0aGUgQ29sbGFib3JhdGlvbiBtb2R1bGUgd2l0aCBjb25maWd1cmF0aW9uCiAgICAgKiBAcGFyYW0ge09iamVjdH0gVXNlckNvbmZpZyAtIENvbmZpZ3VyYXRpb24gZnJvbSBTeXNDb25maWcKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uIChVc2VyQ29uZmlnKSB7CiAgICAgICAgaWYgKEluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIE1lcmdlIHVzZXIgY29uZmlnIHdpdGggZGVmYXVsdHMKICAgICAgICBpZiAoVXNlckNvbmZpZykgewogICAgICAgICAgICAkLmV4dGVuZCh0cnVlLCBDb25maWcsIFVzZXJDb25maWcpOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9hZCBjb25maWcgZnJvbSBDb3JlLkNvbmZpZyBpZiBhdmFpbGFibGUgKHNldCBieSB0ZW1wbGF0ZSkKICAgICAgICBMb2FkQ29uZmlnRnJvbVpudW55KCk7CgogICAgICAgIC8vIFNlbGVjdCBhbmQgaW5pdGlhbGl6ZSBwcmltYXJ5IHByb3ZpZGVyCiAgICAgICAgdmFyIFByb3ZpZGVyTmFtZSA9IENvbmZpZy5Qcm92aWRlciB8fCAnTW9jayc7CiAgICAgICAgaWYgKFByb3ZpZGVyc1tQcm92aWRlck5hbWVdKSB7CiAgICAgICAgICAgIEFjdGl2ZVByb3ZpZGVyID0gUHJvdmlkZXJzW1Byb3ZpZGVyTmFtZV07CgogICAgICAgICAgICAvLyBJbml0aWFsaXplIHByb3ZpZGVyIHdpdGggY29uZmlnCiAgICAgICAgICAgIHZhciBQcm92aWRlckNvbmZpZyA9IENvbmZpZ1snUHJvdmlkZXInICsgUHJvdmlkZXJOYW1lXSB8fCB7fTsKICAgICAgICAgICAgQWN0aXZlUHJvdmlkZXIuaW5pdChQcm92aWRlckNvbmZpZykudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBUcnkgc2lsZW50IGxvZ2luCiAgICAgICAgICAgICAgICBUcnlTaWxlbnRMb2dpbigpOwogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb2xsYWJvcmF0aW9uXSBQcm92aWRlciBpbml0aWFsaXphdGlvbiBmYWlsZWQ6JywgRXJyb3IubWVzc2FnZSB8fCBFcnJvcik7CiAgICAgICAgICAgICAgICBUcmlnZ2VyRXZlbnQoJ2Vycm9yJywgeyB0eXBlOiAnaW5pdCcsIGVycm9yOiBFcnJvciB9KTsKCiAgICAgICAgICAgICAgICAvLyBTaG93IHVzZXItdmlzaWJsZSBub3RpZmljYXRpb24gZm9yIGNvbmZpZ3VyYXRpb24gZXJyb3JzCiAgICAgICAgICAgICAgICBpZiAoRXJyb3IubWVzc2FnZSAmJiBFcnJvci5tZXNzYWdlLmluZGV4T2YoJ01pc3NpbmcgcmVxdWlyZWQgU3lzQ29uZmlnJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgU2hvd0NvbmZpZ3VyYXRpb25FcnJvcihFcnJvci5tZXNzYWdlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICB9CgogICAgICAgIC8vIEluaXRpYWxpemUgZmFsbGJhY2sgcHJvdmlkZXIgKGlmIGNvbmZpZ3VyZWQgYW5kIGRpZmZlcmVudCBmcm9tIHByaW1hcnkpCiAgICAgICAgdmFyIEZhbGxiYWNrUHJvdmlkZXJOYW1lID0gQ29uZmlnLkZhbGxiYWNrUHJvdmlkZXIgfHwgJyc7CiAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXJOYW1lICYmIEZhbGxiYWNrUHJvdmlkZXJOYW1lICE9PSBQcm92aWRlck5hbWUgJiYgUHJvdmlkZXJzW0ZhbGxiYWNrUHJvdmlkZXJOYW1lXSkgewogICAgICAgICAgICBGYWxsYmFja1Byb3ZpZGVyID0gUHJvdmlkZXJzW0ZhbGxiYWNrUHJvdmlkZXJOYW1lXTsKICAgICAgICAgICAgRmFsbGJhY2tQcm92aWRlci5pbml0KHt9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKEVycm9yKSB7CiAgICAgICAgICAgICAgICBGYWxsYmFja1Byb3ZpZGVyID0gbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBJbml0aWFsaXplZCA9IHRydWU7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVnaXN0ZXJQcm92aWRlcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXIgYSBjb2xsYWJvcmF0aW9uIHByb3ZpZGVyCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTmFtZSAtIFByb3ZpZGVyIG5hbWUgKGUuZy4sICdNMzY1JywgJ01vY2snKQogICAgICogQHBhcmFtIHtPYmplY3R9IFByb3ZpZGVyIC0gUHJvdmlkZXIgaW1wbGVtZW50YXRpb24KICAgICAqLwogICAgVGFyZ2V0TlMuUmVnaXN0ZXJQcm92aWRlciA9IGZ1bmN0aW9uIChOYW1lLCBQcm92aWRlcikgewogICAgICAgIGlmICghTmFtZSB8fCAhUHJvdmlkZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gVmFsaWRhdGUgcHJvdmlkZXIgaW1wbGVtZW50cyByZXF1aXJlZCBtZXRob2RzCiAgICAgICAgdmFyIFJlcXVpcmVkTWV0aG9kcyA9IFsnaW5pdCcsICdsb2dpbicsICdsb2dvdXQnLCAnaXNMb2dnZWRJbicsICdnZXRBdmF0YXInXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IFJlcXVpcmVkTWV0aG9kcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAodHlwZW9mIFByb3ZpZGVyW1JlcXVpcmVkTWV0aG9kc1tpXV0gIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgUHJvdmlkZXJzW05hbWVdID0gUHJvdmlkZXI7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0Q29uZmlnCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCBjb25maWd1cmF0aW9uCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBDdXJyZW50IGNvbmZpZwogICAgICovCiAgICBUYXJnZXROUy5HZXRDb25maWcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuICQuZXh0ZW5kKHRydWUsIHt9LCBDb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIElzRmVhdHVyZUVuYWJsZWQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGEgZmVhdHVyZSBpcyBlbmFibGVkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRmVhdHVyZSAtIEZlYXR1cmUgbmFtZSAoZS5nLiwgJ0F2YXRhcicsICdQcmVzZW5jZScpCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBlbmFibGVkCiAgICAgKi8KICAgIFRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQgPSBmdW5jdGlvbiAoRmVhdHVyZSkgewogICAgICAgIHZhciBDb25maWdLZXkgPSAnRW5hYmxlJyArIEZlYXR1cmU7CiAgICAgICAgcmV0dXJuIENvbmZpZ1tDb25maWdLZXldID09PSB0cnVlIHx8IENvbmZpZ1tDb25maWdLZXldID09PSAnMScgfHwgQ29uZmlnW0NvbmZpZ0tleV0gPT09IDE7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSGFzQ2FwYWJpbGl0eQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgY3VycmVudCBwcm92aWRlciBzdXBwb3J0cyBhIGNhcGFiaWxpdHkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDYXBhYmlsaXR5IC0gQ2FwYWJpbGl0eSBuYW1lCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBzdXBwb3J0ZWQKICAgICAqLwogICAgVGFyZ2V0TlMuSGFzQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDYXBhYmlsaXR5KSB7CiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuY2FwYWJpbGl0aWVzKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmNhcGFiaWxpdGllc1tDYXBhYmlsaXR5XSA9PT0gdHJ1ZTsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQdWJsaWMgTWV0aG9kcyAtIEF1dGhlbnRpY2F0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIExvZ2luCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWF0ZSBpbnRlcmFjdGl2ZSBsb2dpbgogICAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gbG9naW4gc3VjY2Vzc2Z1bAogICAgICovCiAgICBUYXJnZXROUy5Mb2dpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHByb3ZpZGVyIGNvbmZpZ3VyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIubG9naW4oKS50aGVuKGZ1bmN0aW9uIChVc2VyKSB7CiAgICAgICAgICAgIFRyaWdnZXJFdmVudCgnbG9naW4nLCBVc2VyKTsKICAgICAgICAgICAgcmV0dXJuIFVzZXI7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgTG9nb3V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBMb2dvdXQgZnJvbSBwcm92aWRlcgogICAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIHdoZW4gbG9nb3V0IGNvbXBsZXRlCiAgICAgKi8KICAgIFRhcmdldE5TLkxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHByb3ZpZGVyIGNvbmZpZ3VyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIubG9nb3V0KCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENsZWFyQ2FjaGUoKTsKICAgICAgICAgICAgVHJpZ2dlckV2ZW50KCdsb2dvdXQnLCB7fSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgSXNMb2dnZWRJbgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgaWYgdXNlciBpcyBsb2dnZWQgaW4KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmIGxvZ2dlZCBpbgogICAgICovCiAgICBUYXJnZXROUy5Jc0xvZ2dlZEluID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghQWN0aXZlUHJvdmlkZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuaXNMb2dnZWRJbigpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldEN1cnJlbnRVc2VyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudGx5IGxvZ2dlZC1pbiB1c2VyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IFVzZXIgb2JqZWN0IG9yIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIuZ2V0Q3VycmVudFVzZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5nZXRDdXJyZW50VXNlcigpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldExvZ2luSW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGxvZ2luIFVJIG1ldGFkYXRhIGZyb20gYWN0aXZlIHByb3ZpZGVyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IExvZ2luIGluZm8ge2xhYmVsLCBpY29uLCByZXF1aXJlc0V4cGxpY2l0TG9naW59IG9yIG51bGwgaWYgbm8gbG9naW4gbmVlZGVkCiAgICAgKi8KICAgIFRhcmdldE5TLkdldExvZ2luSW5mbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5nZXRMb2dpbkluZm8pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAvLyBQcm92aWRlciBkb2Vzbid0IHJlcXVpcmUgZXhwbGljaXQgbG9naW4KICAgICAgICB9CiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmdldExvZ2luSW5mbygpOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gQXZhdGFyICYgUHJlc2VuY2UKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgR2V0QXZhdGFyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgYXZhdGFyIFVSTCBmb3IgZW1haWwgYWRkcmVzcy4KICAgICAqICAgICAgICAgICAgICBVc2VzIHRoZSBwcm92aWRlciBkZXRlcm1pbmVkIGJ5IEdldFByb2ZpbGUgKFVzZXJQcm92aWRlck1hcCkuCiAgICAgKiAgICAgICAgICAgICAgSWYgcHJvdmlkZXIgZG9lc24ndCBoYXZlIGF2YXRhciwgcmV0dXJucyBTVkcgZmFsbGJhY2suCiAgICAgKiAgICAgICAgICAgICAgSW1wbGVtZW50cyByZXF1ZXN0IGRlZHVwbGljYXRpb24gdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxTdHJpbmc+fSBBdmF0YXIgVVJMIG9yIGZhbGxiYWNrCiAgICAgKi8KICAgIFRhcmdldE5TLkdldEF2YXRhciA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIGlmICghRW1haWwpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShUYXJnZXROUy5HZXRGYWxsYmFja0F2YXRhclVybCgnJykpOwogICAgICAgIH0KCiAgICAgICAgRW1haWwgPSBFbWFpbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAvLyBDaGVjayBjYWNoZSBmaXJzdAogICAgICAgIHZhciBDYWNoZWQgPSBHZXRGcm9tQ2FjaGUoJ0F2YXRhcnMnLCBFbWFpbCwgQ29uZmlnLkNhY2hlLkF2YXRhclRUTCk7CiAgICAgICAgaWYgKENhY2hlZCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENhY2hlZCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGFscmVhZHkgYSBwZW5kaW5nIHJlcXVlc3QgZm9yIHRoaXMgZW1haWwKICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHJhY2UgY29uZGl0aW9ucyB3aGVuIG11bHRpcGxlIGNhbGxlcnMgcmVxdWVzdCB0aGUgc2FtZSBhdmF0YXIKICAgICAgICBpZiAoUGVuZGluZ1JlcXVlc3RzLkF2YXRhcnNbRW1haWxdKSB7CiAgICAgICAgICAgIHJldHVybiBQZW5kaW5nUmVxdWVzdHMuQXZhdGFyc1tFbWFpbF07CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBmZWF0dXJlIGVuYWJsZWQKICAgICAgICBpZiAoIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ0F2YXRhcicpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoVGFyZ2V0TlMuR2V0RmFsbGJhY2tBdmF0YXJVcmwoRW1haWwpKTsKICAgICAgICB9CgogICAgICAgIC8vIERldGVybWluZSB3aGljaCBwcm92aWRlciB0byB1c2UgYmFzZWQgb24gVXNlclByb3ZpZGVyTWFwIChzZXQgYnkgR2V0UHJvZmlsZSkKICAgICAgICB2YXIgVXNlUHJvdmlkZXIgPSBVc2VyUHJvdmlkZXJNYXBbRW1haWxdOwogICAgICAgIHZhciBSZXF1ZXN0UHJvbWlzZTsKCiAgICAgICAgLy8gSWYgdXNlciBpcyBtYXBwZWQgdG8gZmFsbGJhY2sgcHJvdmlkZXIsIHVzZSBmYWxsYmFjawogICAgICAgIGlmIChVc2VQcm92aWRlciA9PT0gJ2ZhbGxiYWNrJykgewogICAgICAgICAgICBpZiAoRmFsbGJhY2tQcm92aWRlciAmJiBGYWxsYmFja1Byb3ZpZGVyLmNhcGFiaWxpdGllcyAmJiBGYWxsYmFja1Byb3ZpZGVyLmNhcGFiaWxpdGllcy5hdmF0YXIpIHsKICAgICAgICAgICAgICAgIFJlcXVlc3RQcm9taXNlID0gRmFsbGJhY2tQcm92aWRlci5nZXRBdmF0YXIoRW1haWwpCiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKFVybCkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnQXZhdGFycycsIEVtYWlsLCBVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVXJsOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEZhbGxiYWNrID0gVGFyZ2V0TlMuR2V0RmFsbGJhY2tBdmF0YXJVcmwoRW1haWwpOwogICAgICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnQXZhdGFycycsIEVtYWlsLCBGYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBGYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoVGFyZ2V0TlMuR2V0RmFsbGJhY2tBdmF0YXJVcmwoRW1haWwpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiBub3QgbG9nZ2VkIGluIHRvIHByaW1hcnkgcHJvdmlkZXIsIHVzZSBmYWxsYmFjawogICAgICAgIGVsc2UgaWYgKCFUYXJnZXROUy5Jc0xvZ2dlZEluKCkpIHsKICAgICAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXIgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMuYXZhdGFyKSB7CiAgICAgICAgICAgICAgICBSZXF1ZXN0UHJvbWlzZSA9IEZhbGxiYWNrUHJvdmlkZXIuZ2V0QXZhdGFyKEVtYWlsKQogICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ0F2YXRhcnMnLCBFbWFpbCwgVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVybDsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUYXJnZXROUy5HZXRGYWxsYmFja0F2YXRhclVybChFbWFpbCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFRhcmdldE5TLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gVXNlIHByaW1hcnkgcHJvdmlkZXIgLSBpZiBpdCBmYWlscywgdXNlIFNWRyAoTk9UIGZhbGxiYWNrIHByb3ZpZGVyKQogICAgICAgIC8vIFRoaXMgaXMgaW50ZW50aW9uYWw6IGlmIHByaW1hcnkga25vd3MgdGhlIHVzZXIgYnV0IGhhcyBubyBhdmF0YXIsIHdlIGRvbid0IGFzayBmYWxsYmFjawogICAgICAgIGVsc2UgewogICAgICAgICAgICBSZXF1ZXN0UHJvbWlzZSA9IEFjdGl2ZVByb3ZpZGVyLmdldEF2YXRhcihFbWFpbCkKICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChVcmwpIHsKICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnQXZhdGFycycsIEVtYWlsLCBVcmwpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBVcmw7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBQcmltYXJ5IGZhaWxlZCAtIHVzZSBTVkcgZmFsbGJhY2ssIE5PVCBmYWxsYmFjayBwcm92aWRlcgogICAgICAgICAgICAgICAgICAgIHZhciBGYWxsYmFjayA9IFRhcmdldE5TLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKTsKICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnQXZhdGFycycsIEVtYWlsLCBGYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbGxiYWNrOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBUcmFjayB0aGUgcGVuZGluZyByZXF1ZXN0IGFuZCBjbGVhbiB1cCB3aGVuIGRvbmUKICAgICAgICBQZW5kaW5nUmVxdWVzdHMuQXZhdGFyc1tFbWFpbF0gPSBSZXF1ZXN0UHJvbWlzZS5maW5hbGx5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZGVsZXRlIFBlbmRpbmdSZXF1ZXN0cy5BdmF0YXJzW0VtYWlsXTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIFBlbmRpbmdSZXF1ZXN0cy5BdmF0YXJzW0VtYWlsXTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRQcmVzZW5jZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHByZXNlbmNlL29ubGluZSBzdGF0dXMgZm9yIGVtYWlsLgogICAgICogICAgICAgICAgICAgIFVzZXMgdGhlIHByb3ZpZGVyIGRldGVybWluZWQgYnkgR2V0UHJvZmlsZSAoVXNlclByb3ZpZGVyTWFwKS4KICAgICAqICAgICAgICAgICAgICBJZiBwcm92aWRlciBkb2Vzbid0IGhhdmUgcHJlc2VuY2UsIHJldHVybnMgJ3Vua25vd24nLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gUHJlc2VuY2Ugb2JqZWN0IHtzdGF0dXMsIGFjdGl2aXR5fQogICAgICovCiAgICBUYXJnZXROUy5HZXRQcmVzZW5jZSA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIHZhciBEZWZhdWx0UHJlc2VuY2UgPSB7IHN0YXR1czogJ3Vua25vd24nLCBhY3Rpdml0eTogJ3Vua25vd24nIH07CgogICAgICAgIGlmICghRW1haWwpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShEZWZhdWx0UHJlc2VuY2UpOwogICAgICAgIH0KCiAgICAgICAgRW1haWwgPSBFbWFpbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAvLyBDaGVjayBjYWNoZQogICAgICAgIHZhciBDYWNoZWQgPSBHZXRGcm9tQ2FjaGUoJ1ByZXNlbmNlJywgRW1haWwsIENvbmZpZy5DYWNoZS5QcmVzZW5jZVRUTCk7CiAgICAgICAgaWYgKENhY2hlZCAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENhY2hlZCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBmZWF0dXJlIGVuYWJsZWQKICAgICAgICBpZiAoIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ1ByZXNlbmNlJykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShEZWZhdWx0UHJlc2VuY2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIHByb3ZpZGVyIHRvIHVzZSBiYXNlZCBvbiBVc2VyUHJvdmlkZXJNYXAgKHNldCBieSBHZXRQcm9maWxlKQogICAgICAgIHZhciBVc2VQcm92aWRlciA9IFVzZXJQcm92aWRlck1hcFtFbWFpbF07CgogICAgICAgIC8vIElmIHVzZXIgaXMgbWFwcGVkIHRvIGZhbGxiYWNrIHByb3ZpZGVyLCB1c2UgZmFsbGJhY2sKICAgICAgICBpZiAoVXNlUHJvdmlkZXIgPT09ICdmYWxsYmFjaycpIHsKICAgICAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXIgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMucHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBGYWxsYmFja1Byb3ZpZGVyLmdldFByZXNlbmNlKEVtYWlsKQogICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChQcmVzZW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnUHJlc2VuY2UnLCBFbWFpbCwgUHJlc2VuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJlc2VuY2U7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdFByZXNlbmNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByZXNlbmNlKTsKICAgICAgICB9CgogICAgICAgIC8vIElmIG5vdCBsb2dnZWQgaW4gdG8gcHJpbWFyeSBwcm92aWRlciwgdXNlIGZhbGxiYWNrCiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0xvZ2dlZEluKCkpIHsKICAgICAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXIgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMucHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBGYWxsYmFja1Byb3ZpZGVyLmdldFByZXNlbmNlKEVtYWlsKQogICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChQcmVzZW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnUHJlc2VuY2UnLCBFbWFpbCwgUHJlc2VuY2UpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJlc2VuY2U7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdFByZXNlbmNlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByZXNlbmNlKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGNhcGFiaWxpdHkKICAgICAgICBpZiAoIVRhcmdldE5TLkhhc0NhcGFiaWxpdHkoJ3ByZXNlbmNlJykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShEZWZhdWx0UHJlc2VuY2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGZldGNoIHByZXNlbmNlIHdpdGggdXNlciBJRAogICAgICAgIGZ1bmN0aW9uIEZldGNoUHJlc2VuY2VXaXRoSWQoVXNlcklkLCBPcmlnaW5hbEVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5nZXRQcmVzZW5jZShVc2VySWQsIE9yaWdpbmFsRW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICBTZXRDYWNoZSgnUHJlc2VuY2UnLCBPcmlnaW5hbEVtYWlsLCBQcmVzZW5jZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJlc2VuY2U7CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBEZWZhdWx0UHJlc2VuY2U7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIGNhY2hlZCBwcm9maWxlIHdpdGggdXNlciBJRCAoR1VJRCkgLSBwcmVzZW5jZSBBUEkgd29ya3MgYmV0dGVyIHdpdGggSUQKICAgICAgICB2YXIgQ2FjaGVkUHJvZmlsZSA9IEdldEZyb21DYWNoZSgnUHJvZmlsZXMnLCBFbWFpbCwgQ29uZmlnLkNhY2hlLlByb2ZpbGVUVEwpOwoKICAgICAgICBpZiAoQ2FjaGVkUHJvZmlsZSAmJiBDYWNoZWRQcm9maWxlLmlkKSB7CiAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBjYWNoZWQgcHJvZmlsZSB3aXRoIEdVSUQgLSB1c2UgaXQgZGlyZWN0bHkKICAgICAgICAgICAgcmV0dXJuIEZldGNoUHJlc2VuY2VXaXRoSWQoQ2FjaGVkUHJvZmlsZS5pZCwgRW1haWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gTm8gY2FjaGVkIHByb2ZpbGUgLSBsb2FkIHByb2ZpbGUgZmlyc3QgdG8gZ2V0IHRoZSBHVUlELCB0aGVuIGZldGNoIHByZXNlbmNlCiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIGFsd2F5cyB1c2UgR1VJRCBmb3IgcHJlc2VuY2UgcXVlcmllcyAoZW1haWwtYmFzZWQgcXVlcmllcyByZXR1cm4gUHJlc2VuY2VVbmtub3duKQogICAgICAgIHJldHVybiBUYXJnZXROUy5HZXRQcm9maWxlKEVtYWlsKS50aGVuKGZ1bmN0aW9uIChQcm9maWxlKSB7CiAgICAgICAgICAgIGlmIChQcm9maWxlICYmIFByb2ZpbGUuaWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBGZXRjaFByZXNlbmNlV2l0aElkKFByb2ZpbGUuaWQsIEVtYWlsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcm9maWxlIGxvYWRlZCBidXQgbm8gSUQgKGZhbGxiYWNrIHByb3ZpZGVyPykgLSB0cnkgd2l0aCBlbWFpbCBhbnl3YXkKICAgICAgICAgICAgcmV0dXJuIEZldGNoUHJlc2VuY2VXaXRoSWQoRW1haWwsIEVtYWlsKTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBEZWZhdWx0UHJlc2VuY2U7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVmcmVzaFByZXNlbmNlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBGb3JjZSByZWZyZXNoIHByZXNlbmNlIHN0YXR1cyBmb3IgZW1haWwgKGJ5cGFzc2VzIGNhY2hlKS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFByZXNlbmNlIG9iamVjdCB7c3RhdHVzLCBhY3Rpdml0eX0KICAgICAqLwogICAgVGFyZ2V0TlMuUmVmcmVzaFByZXNlbmNlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgc3RhdHVzOiAndW5rbm93bicsIGFjdGl2aXR5OiAndW5rbm93bicgfSk7CiAgICAgICAgfQoKICAgICAgICBFbWFpbCA9IEVtYWlsLnRvTG93ZXJDYXNlKCk7CgogICAgICAgIC8vIENsZWFyIGNhY2hlZCBwcmVzZW5jZSBmb3IgdGhpcyBlbWFpbAogICAgICAgIGlmIChDYWNoZS5QcmVzZW5jZSAmJiBDYWNoZS5QcmVzZW5jZVtFbWFpbF0pIHsKICAgICAgICAgICAgZGVsZXRlIENhY2hlLlByZXNlbmNlW0VtYWlsXTsKICAgICAgICB9CgogICAgICAgIC8vIEZldGNoIGZyZXNoIHByZXNlbmNlCiAgICAgICAgcmV0dXJuIFRhcmdldE5TLkdldFByZXNlbmNlKEVtYWlsKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBDbGVhckNhY2hlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDbGVhciBhbGwgY2FjaGVzIG9yIHNwZWNpZmljIGNhY2hlIHR5cGUuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW1R5cGVdIC0gT3B0aW9uYWw6ICdQcmVzZW5jZScsICdQcm9maWxlcycsICdBdmF0YXJzJy4gSWYgZW1wdHksIGNsZWFycyBhbGwuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW0VtYWlsXSAtIE9wdGlvbmFsOiBDbGVhciBvbmx5IGZvciBzcGVjaWZpYyBlbWFpbC4KICAgICAqLwogICAgVGFyZ2V0TlMuQ2xlYXJDYWNoZSA9IGZ1bmN0aW9uIChUeXBlLCBFbWFpbCkgewogICAgICAgIGlmIChFbWFpbCkgewogICAgICAgICAgICBFbWFpbCA9IEVtYWlsLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoVHlwZSAmJiBFbWFpbCkgewogICAgICAgICAgICAvLyBDbGVhciBzcGVjaWZpYyB0eXBlIGFuZCBlbWFpbAogICAgICAgICAgICBpZiAoQ2FjaGVbVHlwZV0gJiYgQ2FjaGVbVHlwZV1bRW1haWxdKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgQ2FjaGVbVHlwZV1bRW1haWxdOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChUeXBlKSB7CiAgICAgICAgICAgIC8vIENsZWFyIGVudGlyZSB0eXBlCiAgICAgICAgICAgIENhY2hlW1R5cGVdID0ge307CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQ2xlYXIgYWxsCiAgICAgICAgICAgIENhY2hlLkF2YXRhcnMgPSB7fTsKICAgICAgICAgICAgQ2FjaGUuUHJlc2VuY2UgPSB7fTsKICAgICAgICAgICAgQ2FjaGUuUHJvZmlsZXMgPSB7fTsKICAgICAgICAgICAgVXNlclByb3ZpZGVyTWFwID0ge307CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCB1c2VyIHByb2ZpbGUgZm9yIGVtYWlsLgogICAgICogICAgICAgICAgICAgIFRoaXMgbWV0aG9kIGRldGVybWluZXMgd2hpY2ggcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHRoZSB1c2VyLgogICAgICogICAgICAgICAgICAgIElmIHByaW1hcnkgcHJvdmlkZXIga25vd3MgdGhlIHVzZXIsIGFsbCBkYXRhIGNvbWVzIGZyb20gcHJpbWFyeS4KICAgICAqICAgICAgICAgICAgICBJZiBub3QsIGFsbCBkYXRhIGNvbWVzIGZyb20gZmFsbGJhY2sgcHJvdmlkZXIuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5HZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgdmFyIERlZmF1bHRQcm9maWxlID0geyBkaXNwbGF5TmFtZTogRW1haWwsIGVtYWlsOiBFbWFpbCB9OwoKICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByb2ZpbGUpOwogICAgICAgIH0KCiAgICAgICAgRW1haWwgPSBFbWFpbC50b0xvd2VyQ2FzZSgpOwoKICAgICAgICAvLyBDaGVjayBjYWNoZQogICAgICAgIHZhciBDYWNoZWQgPSBHZXRGcm9tQ2FjaGUoJ1Byb2ZpbGVzJywgRW1haWwsIENvbmZpZy5DYWNoZS5Qcm9maWxlVFRMKTsKICAgICAgICBpZiAoQ2FjaGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoQ2FjaGVkKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIGZlYXR1cmUgZW5hYmxlZAogICAgICAgIGlmICghVGFyZ2V0TlMuSXNGZWF0dXJlRW5hYmxlZCgnSG92ZXJDYXJkcycpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByb2ZpbGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgbm90IGxvZ2dlZCBpbiB0byBwcmltYXJ5IHByb3ZpZGVyLCB1c2UgZmFsbGJhY2sgcHJvdmlkZXIKICAgICAgICBpZiAoIVRhcmdldE5TLklzTG9nZ2VkSW4oKSkgewogICAgICAgICAgICBVc2VyUHJvdmlkZXJNYXBbRW1haWwudG9Mb3dlckNhc2UoKV0gPSAnZmFsbGJhY2snOwogICAgICAgICAgICBpZiAoRmFsbGJhY2tQcm92aWRlciAmJiBGYWxsYmFja1Byb3ZpZGVyLmNhcGFiaWxpdGllcyAmJiBGYWxsYmFja1Byb3ZpZGVyLmNhcGFiaWxpdGllcy5wcm9maWxlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRmFsbGJhY2tQcm92aWRlci5nZXRQcm9maWxlKEVtYWlsKQogICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChQcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNldENhY2hlKCdQcm9maWxlcycsIEVtYWlsLCBQcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2ZpbGU7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdFByb2ZpbGU7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShEZWZhdWx0UHJvZmlsZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBjYXBhYmlsaXR5CiAgICAgICAgaWYgKCFUYXJnZXROUy5IYXNDYXBhYmlsaXR5KCdwcm9maWxlJykpIHsKICAgICAgICAgICAgVXNlclByb3ZpZGVyTWFwW0VtYWlsLnRvTG93ZXJDYXNlKCldID0gJ2ZhbGxiYWNrJzsKICAgICAgICAgICAgaWYgKEZhbGxiYWNrUHJvdmlkZXIgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMgJiYgRmFsbGJhY2tQcm92aWRlci5jYXBhYmlsaXRpZXMucHJvZmlsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEZhbGxiYWNrUHJvdmlkZXIuZ2V0UHJvZmlsZShFbWFpbCkKICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBTZXRDYWNoZSgnUHJvZmlsZXMnLCBFbWFpbCwgUHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9maWxlOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRQcm9maWxlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoRGVmYXVsdFByb2ZpbGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gR2V0IGZyb20gcHJpbWFyeSBwcm92aWRlcgogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5nZXRQcm9maWxlKEVtYWlsKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgLy8gUHJpbWFyeSBwcm92aWRlciBrbm93cyB0aGlzIHVzZXIgLSBtYXJrIGZvciBhbGwgZnV0dXJlIHJlcXVlc3RzCiAgICAgICAgICAgICAgICBVc2VyUHJvdmlkZXJNYXBbRW1haWwudG9Mb3dlckNhc2UoKV0gPSAncHJpbWFyeSc7CiAgICAgICAgICAgICAgICBTZXRDYWNoZSgnUHJvZmlsZXMnLCBFbWFpbCwgUHJvZmlsZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvZmlsZTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIFByaW1hcnkgcHJvdmlkZXIgZG9lc24ndCBrbm93IHRoaXMgdXNlciAtIHRyeSBmYWxsYmFjawogICAgICAgICAgICAgICAgVXNlclByb3ZpZGVyTWFwW0VtYWlsLnRvTG93ZXJDYXNlKCldID0gJ2ZhbGxiYWNrJzsKICAgICAgICAgICAgICAgIGlmIChGYWxsYmFja1Byb3ZpZGVyICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzICYmIEZhbGxiYWNrUHJvdmlkZXIuY2FwYWJpbGl0aWVzLnByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsbGJhY2tQcm92aWRlci5nZXRQcm9maWxlKEVtYWlsKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0Q2FjaGUoJ1Byb2ZpbGVzJywgRW1haWwsIFByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb2ZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVmYXVsdFByb2ZpbGU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRQcm9maWxlOwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRPdXRPZk9mZmljZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgR2V0UHJlc2VuY2UoKSBhbmQgY2hlY2sgcHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScKICAgICAqIEBkZXNjcmlwdGlvbiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBPT0Ygc3RhdHVzIGlzIG5vdyBlbWJlZGRlZCBpbiBwcmVzZW5jZSByZXNwb25zZS4KICAgICAqICAgICAgICAgICAgICBVc2UgR2V0UHJlc2VuY2UoKS50aGVuKHAgPT4gcC5vdXRPZk9mZmljZSkgaW5zdGVhZC4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdHxudWxsPn0gT09GIG9iamVjdCBkZXJpdmVkIGZyb20gcHJlc2VuY2UsIG9yIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBEZXJpdmUgT09GIGZyb20gcHJlc2VuY2UgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICAgICAgICByZXR1cm4gVGFyZ2V0TlMuR2V0UHJlc2VuY2UoRW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgIGlmIChQcmVzZW5jZSAmJiBQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIFByZXNlbmNlLm91dE9mT2ZmaWNlIHx8IHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhbHdheXNFbmFibGVkJywKICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRTdGFydERhdGVUaW1lOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZEVuZERhdGVUaW1lOiBudWxsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBDb21tdW5pY2F0aW9uIExpbmtzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEdldENoYXRMaW5rCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY2hhdCBkZWVwLWxpbmsgZm9yIGVtYWlsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfG51bGx9IENoYXQgVVJMIG9yIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuR2V0Q2hhdExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsIHx8ICFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdDaGF0JykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5nZXRDaGF0TGluaykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5nZXRDaGF0TGluayhFbWFpbCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgR2V0Q2FsbExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBjYWxsIGRlZXAtbGluayBmb3IgZW1haWwKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd8bnVsbH0gQ2FsbCBVUkwgb3IgbnVsbAogICAgICovCiAgICBUYXJnZXROUy5HZXRDYWxsTGluayA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIGlmICghRW1haWwgfHwgIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ0NhbGwnKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICghQWN0aXZlUHJvdmlkZXIgfHwgIUFjdGl2ZVByb3ZpZGVyLmdldENhbGxMaW5rKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIEFjdGl2ZVByb3ZpZGVyLmdldENhbGxMaW5rKEVtYWlsKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRVc2VyUHJvdmlkZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQHJldHVybnMge1N0cmluZ30gJ3ByaW1hcnknLCAnZmFsbGJhY2snLCBvciAndW5rbm93bicKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwKICAgICAqIEBkZXNjcmlwdGlvbiBSZXR1cm5zIHdoaWNoIHByb3ZpZGVyIGlzIHVzZWQgZm9yIHRoaXMgdXNlci4KICAgICAqICAgICAgICAgICAgICBPbmx5IHZhbGlkIGFmdGVyIEdldFByb2ZpbGUoKSB3YXMgY2FsbGVkIGZvciB0aGlzIGVtYWlsLgogICAgICogICAgICAgICAgICAgIFVzZSB0aGlzIHRvIGNoZWNrIGlmIFRlYW1zIGFjdGlvbnMgc2hvdWxkIGJlIHNob3duLgogICAgICovCiAgICBUYXJnZXROUy5HZXRVc2VyUHJvdmlkZXIgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsKSByZXR1cm4gJ3Vua25vd24nOwogICAgICAgIHJldHVybiBVc2VyUHJvdmlkZXJNYXBbRW1haWwudG9Mb3dlckNhc2UoKV0gfHwgJ3Vua25vd24nOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gTWVldGluZ3MKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgR2V0RnJlZUJ1c3kKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBmcmVlL2J1c3kgaW5mb3JtYXRpb24gZm9yIHVzZXJzCiAgICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IEVtYWlscyAtIEVtYWlsIGFkZHJlc3NlcwogICAgICogQHBhcmFtIHtEYXRlfSBTdGFydCAtIFN0YXJ0IHRpbWUKICAgICAqIEBwYXJhbSB7RGF0ZX0gRW5kIC0gRW5kIHRpbWUKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEZyZWUvYnVzeSBzbG90cwogICAgICovCiAgICBUYXJnZXROUy5HZXRGcmVlQnVzeSA9IGZ1bmN0aW9uIChFbWFpbHMsIFN0YXJ0LCBFbmQpIHsKICAgICAgICBpZiAoIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ01lZXRpbmdzJykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTWVldGluZ3MgZmVhdHVyZSBub3QgZW5hYmxlZCcpKTsKICAgICAgICB9CgogICAgICAgIGlmICghVGFyZ2V0TlMuSGFzQ2FwYWJpbGl0eSgnZnJlZUJ1c3knKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IGZyZWUvYnVzeScpKTsKICAgICAgICB9CgogICAgICAgIGlmICghQWN0aXZlUHJvdmlkZXIgfHwgIUFjdGl2ZVByb3ZpZGVyLmdldEZyZWVCdXN5KSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHByb3ZpZGVyIGNvbmZpZ3VyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuZ2V0RnJlZUJ1c3koRW1haWxzLCBTdGFydCwgRW5kKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBDcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW4gb25saW5lIG1lZXRpbmcgKGxlZ2FjeSAtIHVzZSBDcmVhdGVDYWxlbmRhckV2ZW50IGluc3RlYWQpCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGV0YWlscyAtIE1lZXRpbmcgZGV0YWlscwogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gTWVldGluZyBpbmZvIHdpdGggam9pbiBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuQ3JlYXRlTWVldGluZyA9IGZ1bmN0aW9uIChEZXRhaWxzKSB7CiAgICAgICAgaWYgKCFUYXJnZXROUy5Jc0ZlYXR1cmVFbmFibGVkKCdNZWV0aW5ncycpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ01lZXRpbmdzIGZlYXR1cmUgbm90IGVuYWJsZWQnKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIVRhcmdldE5TLkhhc0NhcGFiaWxpdHkoJ2NyZWF0ZU1lZXRpbmcnKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdQcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IG1lZXRpbmcgY3JlYXRpb24nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5jcmVhdGVNZWV0aW5nKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHByb3ZpZGVyIGNvbmZpZ3VyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuY3JlYXRlTWVldGluZyhEZXRhaWxzKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBDcmVhdGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYSBjYWxlbmRhciBldmVudCAod2l0aCBvcHRpb25hbCBUZWFtcyBtZWV0aW5nKQogICAgICogICAgICAgICAgICAgIFVzZXMgR3JhcGggQVBJIC9tZS9ldmVudHMgd2hpY2ggc2VuZHMgaW52aXRhdGlvbnMgYW5kIGFsbG93cyBjYW5jZWxsYXRpb24KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBEZXRhaWxzIC0gRXZlbnQgZGV0YWlscwogICAgICogQHBhcmFtIHtTdHJpbmd9IERldGFpbHMuc3ViamVjdCAtIEV2ZW50IHN1YmplY3QKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLnN0YXJ0RGF0ZVRpbWUgLSBTdGFydCB0aW1lIChJU08gZm9ybWF0KQogICAgICogQHBhcmFtIHtTdHJpbmd9IERldGFpbHMuZW5kRGF0ZVRpbWUgLSBFbmQgdGltZSAoSVNPIGZvcm1hdCkKICAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gRGV0YWlscy5hdHRlbmRlZXMgLSBFbWFpbCBhZGRyZXNzZXMgb2YgYXR0ZW5kZWVzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IERldGFpbHMuaXNPbmxpbmVNZWV0aW5nIC0gVHJ1ZSBmb3IgVGVhbXMgbWVldGluZywgZmFsc2UgZm9yIG9uLXNpdGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLmxvY2F0aW9uIC0gTG9jYXRpb24gKGZvciBvbi1zaXRlIG1lZXRpbmdzKQogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gRXZlbnQgaW5mbyB7aWQsIGpvaW5Vcmx9CiAgICAgKi8KICAgIFRhcmdldE5TLkNyZWF0ZUNhbGVuZGFyRXZlbnQgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIGlmICghVGFyZ2V0TlMuSXNGZWF0dXJlRW5hYmxlZCgnTWVldGluZ3MnKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdNZWV0aW5ncyBmZWF0dXJlIG5vdCBlbmFibGVkJykpOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFUYXJnZXROUy5IYXNDYXBhYmlsaXR5KCdjcmVhdGVDYWxlbmRhckV2ZW50JykpIHsKICAgICAgICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRlTWVldGluZyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgaWYgKERldGFpbHMuaXNPbmxpbmVNZWV0aW5nICYmIFRhcmdldE5TLkhhc0NhcGFiaWxpdHkoJ2NyZWF0ZU1lZXRpbmcnKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFRhcmdldE5TLkNyZWF0ZU1lZXRpbmcoRGV0YWlscyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignUHJvdmlkZXIgZG9lcyBub3Qgc3VwcG9ydCBjYWxlbmRhciBldmVudHMnKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5jcmVhdGVDYWxlbmRhckV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHByb3ZpZGVyIGNvbmZpZ3VyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gQWN0aXZlUHJvdmlkZXIuY3JlYXRlQ2FsZW5kYXJFdmVudChEZXRhaWxzKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBEZWxldGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUvY2FuY2VsIGEgY2FsZW5kYXIgZXZlbnQgKHNlbmRzIGNhbmNlbGxhdGlvbiB0byBhdHRlbmRlZXMpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRXZlbnRJZCAtIEdyYXBoIEFQSSBldmVudCBJRAogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gUmVzdWx0IHtzdWNjZXNzOiB0cnVlfQogICAgICovCiAgICBUYXJnZXROUy5EZWxldGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKEV2ZW50SWQpIHsKICAgICAgICBpZiAoIVRhcmdldE5TLklzRmVhdHVyZUVuYWJsZWQoJ01lZXRpbmdzJykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTWVldGluZ3MgZmVhdHVyZSBub3QgZW5hYmxlZCcpKTsKICAgICAgICB9CgogICAgICAgIGlmICghVGFyZ2V0TlMuSGFzQ2FwYWJpbGl0eSgnZGVsZXRlQ2FsZW5kYXJFdmVudCcpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1Byb3ZpZGVyIGRvZXMgbm90IHN1cHBvcnQgY2FsZW5kYXIgZXZlbnQgZGVsZXRpb24nKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUFjdGl2ZVByb3ZpZGVyIHx8ICFBY3RpdmVQcm92aWRlci5kZWxldGVDYWxlbmRhckV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vIHByb3ZpZGVyIGNvbmZpZ3VyZWQnKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIUV2ZW50SWQpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignRXZlbnRJZCBpcyByZXF1aXJlZCcpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBBY3RpdmVQcm92aWRlci5kZWxldGVDYWxlbmRhckV2ZW50KEV2ZW50SWQpOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gRXZlbnRzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIE9uCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBSZWdpc3RlciBldmVudCBsaXN0ZW5lcgogICAgICogQHBhcmFtIHtTdHJpbmd9IEV2ZW50IC0gRXZlbnQgbmFtZSAobG9naW4sIGxvZ291dCwgcHJlc2VuY2VDaGFuZ2UsIGVycm9yKQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gQ2FsbGJhY2sgLSBDYWxsYmFjayBmdW5jdGlvbgogICAgICovCiAgICBUYXJnZXROUy5PbiA9IGZ1bmN0aW9uIChFdmVudCwgQ2FsbGJhY2spIHsKICAgICAgICBpZiAoRXZlbnRMaXN0ZW5lcnNbRXZlbnRdICYmIHR5cGVvZiBDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBFdmVudExpc3RlbmVyc1tFdmVudF0ucHVzaChDYWxsYmFjayk7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIE9mZgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gUmVtb3ZlIGV2ZW50IGxpc3RlbmVyCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRXZlbnQgLSBFdmVudCBuYW1lCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDYWxsYmFjayAtIENhbGxiYWNrIHRvIHJlbW92ZQogICAgICovCiAgICBUYXJnZXROUy5PZmYgPSBmdW5jdGlvbiAoRXZlbnQsIENhbGxiYWNrKSB7CiAgICAgICAgaWYgKEV2ZW50TGlzdGVuZXJzW0V2ZW50XSkgewogICAgICAgICAgICB2YXIgSW5kZXggPSBFdmVudExpc3RlbmVyc1tFdmVudF0uaW5kZXhPZihDYWxsYmFjayk7CiAgICAgICAgICAgIGlmIChJbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBFdmVudExpc3RlbmVyc1tFdmVudF0uc3BsaWNlKEluZGV4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRVc2VyVGltZVpvbmUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCB0aGUgdXNlcidzIHRpbWV6b25lIGZyb20gdGhlIGJyb3dzZXIKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IElBTkEgdGltZXpvbmUgc3RyaW5nIChlLmcuLCAnRXVyb3BlL0JlcmxpbicpCiAgICAgKi8KICAgIFRhcmdldE5TLkdldFVzZXJUaW1lWm9uZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgLy8gRmFsbGJhY2sgZm9yIG9sZGVyIGJyb3dzZXJzCiAgICAgICAgICAgIHJldHVybiAnVVRDJzsKICAgICAgICB9CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIFV0aWxpdHkgTWV0aG9kcyAoZm9yIHVzZSBieSBwcm92aWRlcnMpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEdldEZhbGxiYWNrQXZhdGFyVXJsCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwdWJsaWMKICAgICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZSBmYWxsYmFjayBhdmF0YXIgVVJMIChTVkcgd2l0aCBpbml0aWFscykKICAgICAqICAgICAgICAgICAgICBUaGlzIGlzIHRoZSBjZW50cmFsIGltcGxlbWVudGF0aW9uIC0gcHJvdmlkZXJzIHNob3VsZCB1c2UgdGhpcwogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcyBmb3IgY29sb3IgYW5kIGluaXRpYWxzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW0Rpc3BsYXlOYW1lXSAtIE9wdGlvbmFsIGRpc3BsYXkgbmFtZSBmb3IgYmV0dGVyIGluaXRpYWxzCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBEYXRhIFVSSSBmb3IgU1ZHIGF2YXRhcgogICAgICovCiAgICBUYXJnZXROUy5HZXRGYWxsYmFja0F2YXRhclVybCA9IGZ1bmN0aW9uIChFbWFpbCwgRGlzcGxheU5hbWUpIHsKICAgICAgICB2YXIgSW5pdGlhbHMgPSBUYXJnZXROUy5HZXRJbml0aWFscyhEaXNwbGF5TmFtZSB8fCBFbWFpbCk7CiAgICAgICAgdmFyIENvbG9yID0gVGFyZ2V0TlMuR2V0Q29sb3JGb3JFbWFpbChFbWFpbCk7CgogICAgICAgIC8vIFNFQ1VSSVRZOiBJbml0aWFscyBhcmUgY3VycmVudGx5IGFsd2F5cyA8PTIgY2hhcmFjdGVycyBmcm9tCiAgICAgICAgLy8gR2V0SW5pdGlhbHMoKSwgc28gdGhpcyBpcyBhIG5vLW9wIHRvZGF5IC0gZXNjYXBlZCBkZWZlbnNpdmVseQogICAgICAgIC8vIHNvIGEgZnV0dXJlIGNoYW5nZSB0aGVyZSBjYW4ndCByZW9wZW4gYW4gU1ZHL0hUTUwgaW5qZWN0aW9uCiAgICAgICAgLy8gdmVjdG9yIHRocm91Z2ggdGhpcyBzdHJpbmctYnVpbHQgbWFya3VwLgogICAgICAgIHZhciBFc2NhcGVkSW5pdGlhbHMgPSBTdHJpbmcoSW5pdGlhbHMpLnJlcGxhY2UoL1smPD4iJ10vZywgZnVuY3Rpb24gKENoYXIpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICcmJzogJyZhbXA7JywgJzwnOiAnJmx0OycsICc+JzogJyZndDsnLCAnIic6ICcmcXVvdDsnLCAiJyI6ICcmIzM5OycKICAgICAgICAgICAgfVtDaGFyXTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ3JlYXRlIFNWRyBkYXRhIFVSSQogICAgICAgIHZhciBTVkcgPSAnPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI2NCIgaGVpZ2h0PSI2NCI+JyArCiAgICAgICAgICAgICc8Y2lyY2xlIGN4PSIzMiIgY3k9IjMyIiByPSIzMiIgZmlsbD0iJyArIENvbG9yICsgJyIvPicgKwogICAgICAgICAgICAnPHRleHQgeD0iMzIiIHk9IjMyIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIiBkeT0iMC4zNWVtIiAnICsKICAgICAgICAgICAgJ2ZpbGw9IiNmZmYiIGZvbnQtZmFtaWx5PSJBcmlhbCxzYW5zLXNlcmlmIiBmb250LXNpemU9IjI0IiBmb250LXdlaWdodD0iNjAwIj4nICsKICAgICAgICAgICAgRXNjYXBlZEluaXRpYWxzICsgJzwvdGV4dD48L3N2Zz4nOwoKICAgICAgICByZXR1cm4gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIGJ0b2EoU1ZHKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBHZXRJbml0aWFscwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcHVibGljCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGluaXRpYWxzIGZyb20gbmFtZSBvciBlbWFpbAogICAgICogICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGNlbnRyYWwgaW1wbGVtZW50YXRpb24gLSBwcm92aWRlcnMgc2hvdWxkIHVzZSB0aGlzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTmFtZU9yRW1haWwgLSBEaXNwbGF5IG5hbWUgb3IgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gMS0yIGNoYXJhY3RlciBpbml0aWFscwogICAgICovCiAgICBUYXJnZXROUy5HZXRJbml0aWFscyA9IGZ1bmN0aW9uIChOYW1lT3JFbWFpbCkgewogICAgICAgIGlmICghTmFtZU9yRW1haWwpIHsKICAgICAgICAgICAgcmV0dXJuICc/JzsKICAgICAgICB9CgogICAgICAgIC8vIFJlbW92ZSBlbWFpbCBkb21haW4gaWYgcHJlc2VudAogICAgICAgIHZhciBOYW1lID0gTmFtZU9yRW1haWwuc3BsaXQoJ0AnKVswXTsKCiAgICAgICAgLy8gU3BsaXQgYnkgY29tbW9uIHNlcGFyYXRvcnMgKHNwYWNlLCBkb3QsIHVuZGVyc2NvcmUsIGh5cGhlbikKICAgICAgICB2YXIgUGFydHMgPSBOYW1lLnNwbGl0KC9bXHMuXy1dKy8pOwoKICAgICAgICBpZiAoUGFydHMubGVuZ3RoID49IDIpIHsKICAgICAgICAgICAgLy8gVXNlIGZpcnN0IGFuZCBsYXN0IHBhcnQgZm9yIGluaXRpYWxzCiAgICAgICAgICAgIHJldHVybiAoUGFydHNbMF1bMF0gKyBQYXJ0c1tQYXJ0cy5sZW5ndGggLSAxXVswXSkudG9VcHBlckNhc2UoKTsKICAgICAgICB9IGVsc2UgaWYgKFBhcnRzWzBdLmxlbmd0aCA+PSAyKSB7CiAgICAgICAgICAgIHJldHVybiBQYXJ0c1swXS5zdWJzdHJpbmcoMCwgMikudG9VcHBlckNhc2UoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gUGFydHNbMF0udG9VcHBlckNhc2UoKSB8fCAnPyc7CiAgICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEdldENvbG9yRm9yRW1haWwKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQHB1YmxpYwogICAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlIGNvbnNpc3RlbnQgY29sb3IgZm9yIGVtYWlsCiAgICAgKiAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgY2VudHJhbCBpbXBsZW1lbnRhdGlvbiAtIHByb3ZpZGVycyBzaG91bGQgdXNlIHRoaXMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IEhleCBjb2xvciBjb2RlCiAgICAgKi8KICAgIFRhcmdldE5TLkdldENvbG9yRm9yRW1haWwgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICB2YXIgQ29sb3JzID0gWwogICAgICAgICAgICAnIzYwN2Q4YicsICcjNzk1NTQ4JywgJyM5YzI3YjAnLCAnIzY3M2FiNycsCiAgICAgICAgICAgICcjM2Y1MWI1JywgJyMyMTk2ZjMnLCAnIzAwOTY4OCcsICcjNGNhZjUwJywKICAgICAgICAgICAgJyNmZjk4MDAnLCAnI2ZmNTcyMicsICcjZTkxZTYzJywgJyMwMGJjZDQnCiAgICAgICAgXTsKCiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gQ29sb3JzWzBdOwogICAgICAgIH0KCiAgICAgICAgLy8gU2ltcGxlIGhhc2gKICAgICAgICB2YXIgSGFzaCA9IDA7CiAgICAgICAgdmFyIFN0ciA9IEVtYWlsLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTdHIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgSGFzaCA9ICgoSGFzaCA8PCA1KSAtIEhhc2gpICsgU3RyLmNoYXJDb2RlQXQoaSk7CiAgICAgICAgICAgIEhhc2ggPSBIYXNoICYgSGFzaDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDb2xvcnNbTWF0aC5hYnMoSGFzaCkgJSBDb2xvcnMubGVuZ3RoXTsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBMb2FkIGNvbmZpZ3VyYXRpb24gZnJvbSBabnVueSdzIENvcmUuQ29uZmlnCiAgICAgKi8KICAgIGZ1bmN0aW9uIExvYWRDb25maWdGcm9tWm51bnkoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBDb3JlICE9PSAndW5kZWZpbmVkJyAmJiBDb3JlLkNvbmZpZyAmJiBDb3JlLkNvbmZpZy5HZXQpIHsKICAgICAgICAgICAgdmFyIFpudW55Q29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdDb2xsYWJvcmF0aW9uJyk7CiAgICAgICAgICAgIGlmIChabnVueUNvbmZpZykgewogICAgICAgICAgICAgICAgJC5leHRlbmQodHJ1ZSwgQ29uZmlnLCBabnVueUNvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFRyeSBzaWxlbnQgbG9naW4gKFNTTykKICAgICAqLwogICAgZnVuY3Rpb24gVHJ5U2lsZW50TG9naW4oKSB7CiAgICAgICAgaWYgKCFBY3RpdmVQcm92aWRlciB8fCAhQWN0aXZlUHJvdmlkZXIudHJ5U2lsZW50TG9naW4pIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgQWN0aXZlUHJvdmlkZXIudHJ5U2lsZW50TG9naW4oKS50aGVuKGZ1bmN0aW9uIChVc2VyKSB7CiAgICAgICAgICAgIGlmIChVc2VyKSB7CiAgICAgICAgICAgICAgICBUcmlnZ2VyRXZlbnQoJ2xvZ2luJywgVXNlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoRXJyb3IpIHsKICAgICAgICAgICAgLy8gU2lsZW50IGxvZ2luIGZhaWxlZC4gVXN1YWxseSBleHBlY3RlZCAobm8gY2FjaGVkIGFjY291bnQKICAgICAgICAgICAgLy8geWV0IC0gZmlyc3QgdmlzaXQsIG9yIGxvZ2dlZCBvdXQgZWxzZXdoZXJlKSBhbmQgc2lsZW50bHkKICAgICAgICAgICAgLy8gaWdub3JlZCwgc2FtZSBhcyBiZWZvcmUuIEJ1dCB3YXNDb25uZWN0ZWRCZWZvcmUgKHNlZSB0aGUKICAgICAgICAgICAgLy8gTTM2NSBwcm92aWRlcidzIHRyeVNpbGVudExvZ2luKSBtZWFucyBhIGNhY2hlZCBhY2NvdW50IFdBUwogICAgICAgICAgICAvLyBmb3VuZCBhbmQgbWF0Y2hlZCBvdXIgdGVuYW50IC0gdGhlIHJlbmV3YWwgaXRzZWxmIGlzIHdoYXQKICAgICAgICAgICAgLy8gZmFpbGVkIChleHBpcmVkIHJlZnJlc2ggdG9rZW4sIGFuIGVudmlyb25tZW50IGlzc3VlIGxpa2UgYQogICAgICAgICAgICAvLyBDU1AgYmxvY2tpbmcgTVNBTCdzIHNpbGVudCBpZnJhbWUsIGNvbnNlbnQgcmV2b2tlZCwgLi4uKS4KICAgICAgICAgICAgLy8gVGhhdCdzIGEgcmVhbCwgc2lsZW50IGNvbm5lY3Rpb24gbG9zcyB0aGUgYWdlbnQgd291bGQKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIG9ubHkgbm90aWNlIGJ5IGNoYW5jZSAoYSBtaXNzaW5nIGF2YXRhciwgYQogICAgICAgICAgICAvLyBUZWFtcyBidXR0b24gdGhhdCBzdG9wcyB3b3JraW5nKSAtIHN1cmZhY2UgaXQgaW5zdGVhZCwKICAgICAgICAgICAgLy8gd2l0aCBhIG9uZS1jbGljayB3YXkgYmFjayBpbi4gVGhlIHJlY29ubmVjdCBidXR0b24gaXMgYQogICAgICAgICAgICAvLyBnZW51aW5lIGNsaWNrLCBzbyB0aGUgaW50ZXJhY3RpdmUgbG9naW4gcG9wdXAgaXQgdHJpZ2dlcnMKICAgICAgICAgICAgLy8gd29uJ3QgaGl0IGJyb3dzZXIgcG9wdXAtYmxvY2tlciBoZXVyaXN0aWNzIHRoZSB3YXkgYW4KICAgICAgICAgICAgLy8gdW5wcm9tcHRlZCBiYWNrZ3JvdW5kIHBvcHVwIHdvdWxkLgogICAgICAgICAgICBpZiAoRXJyb3IgJiYgRXJyb3Iud2FzQ29ubmVjdGVkQmVmb3JlKSB7CiAgICAgICAgICAgICAgICBTaG93Q29uZmlndXJhdGlvbldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRlKCdNaWNyb3NvZnQgMzY1IGNvbm5lY3Rpb24gbG9zdC4gUGxlYXNlIHJlY29ubmVjdC4nKSwKICAgICAgICAgICAgICAgICAgICBbeyB0ZXh0OiBUcmFuc2xhdGUoJ1JlY29ubmVjdCcpLCBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7IFRhcmdldE5TLkxvZ2luKCk7IH0gfV0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gVHJpZ2dlciBhbiBldmVudAogICAgICovCiAgICBmdW5jdGlvbiBUcmlnZ2VyRXZlbnQoRXZlbnQsIERhdGEpIHsKICAgICAgICAvLyBDbGVhciBjYWNoZSBvbiBsb2dpbiB0byBlbnN1cmUgZnJlc2ggZGF0YSBmcm9tIHRoZSBuZXcgcHJvdmlkZXIgY29udGV4dAogICAgICAgIC8vIFRoaXMgcHJldmVudHMgc3RhbGUgZmFsbGJhY2sgYXZhdGFycyBmcm9tIGJlaW5nIHVzZWQgYWZ0ZXIgTTM2NSBsb2dpbgogICAgICAgIGlmIChFdmVudCA9PT0gJ2xvZ2luJykgewogICAgICAgICAgICBDbGVhckNhY2hlKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoRXZlbnRMaXN0ZW5lcnNbRXZlbnRdKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgRXZlbnRMaXN0ZW5lcnNbRXZlbnRdLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXJzW0V2ZW50XVtpXShEYXRhKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGl0ZW0gZnJvbSBjYWNoZSBpZiBub3QgZXhwaXJlZAogICAgICovCiAgICBmdW5jdGlvbiBHZXRGcm9tQ2FjaGUoVHlwZSwgS2V5LCBUVEwpIHsKICAgICAgICBpZiAoIUNhY2hlW1R5cGVdIHx8ICFDYWNoZVtUeXBlXVtLZXldKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIEVudHJ5ID0gQ2FjaGVbVHlwZV1bS2V5XTsKICAgICAgICB2YXIgTm93ID0gTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCk7CgogICAgICAgIGlmIChOb3cgLSBFbnRyeS50aW1lID4gVFRMKSB7CiAgICAgICAgICAgIGRlbGV0ZSBDYWNoZVtUeXBlXVtLZXldOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBFbnRyeS52YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gU2V0IGl0ZW0gaW4gY2FjaGUKICAgICAqLwogICAgZnVuY3Rpb24gU2V0Q2FjaGUoVHlwZSwgS2V5LCBWYWx1ZSkgewogICAgICAgIGlmICghQ2FjaGVbVHlwZV0pIHsKICAgICAgICAgICAgQ2FjaGVbVHlwZV0gPSB7fTsKICAgICAgICB9CgogICAgICAgIENhY2hlW1R5cGVdW0tleV0gPSB7CiAgICAgICAgICAgIHZhbHVlOiBWYWx1ZSwKICAgICAgICAgICAgdGltZTogTWF0aC5mbG9vcihEYXRlLm5vdygpIC8gMTAwMCkKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDbGVhciBhbGwgY2FjaGVzIGFuZCBwZW5kaW5nIHJlcXVlc3RzCiAgICAgKiAgICAgICAgICAgICAgQ2FsbGVkIG9uIGxvZ2luL2xvZ291dCB0byBlbnN1cmUgZnJlc2ggZGF0YQogICAgICogICAgICAgICAgICAgIFBlbmRpbmdSZXF1ZXN0cyBNVVNUIGJlIGNsZWFyZWQgb24gbG9naW4gYmVjYXVzZToKICAgICAqICAgICAgICAgICAgICAtIFJlcXVlc3RzIHN0YXJ0ZWQgYmVmb3JlIGxvZ2luIHVzZSB0aGUgZmFsbGJhY2sgcHJvdmlkZXIKICAgICAqICAgICAgICAgICAgICAtIEFmdGVyIGxvZ2luLCB3ZSB3YW50IGZyZXNoIHJlcXVlc3RzIHVzaW5nIE0zNjUgcHJvdmlkZXIKICAgICAqICAgICAgICAgICAgICAtIElmIHdlIGRvbid0IGNsZWFyLCB0aGUgb2xkIHByb21pc2VzIGFyZSByZXVzZWQgYW5kIHJldHVybiBzdGFsZSBkYXRhCiAgICAgKi8KICAgIGZ1bmN0aW9uIENsZWFyQ2FjaGUoKSB7CiAgICAgICAgQ2FjaGUuQXZhdGFycyA9IHt9OwogICAgICAgIENhY2hlLlByZXNlbmNlID0ge307CiAgICAgICAgQ2FjaGUuUHJvZmlsZXMgPSB7fTsKICAgICAgICBVc2VyUHJvdmlkZXJNYXAgPSB7fTsKICAgICAgICAvLyBDbGVhciBwZW5kaW5nIHJlcXVlc3RzIHNvIG5ldyBjYWxscyBhZnRlciBsb2dpbiBjcmVhdGUgZnJlc2ggcmVxdWVzdHMKICAgICAgICBQZW5kaW5nUmVxdWVzdHMuQXZhdGFycyA9IHt9OwogICAgICAgIFBlbmRpbmdSZXF1ZXN0cy5QcmVzZW5jZSA9IHt9OwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBVSSBOb3RpZmljYXRpb25zCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIFNob3dFcnJvcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBhbiBlcnJvciBtZXNzYWdlIGluIFpudW55IE1lc3NhZ2VCb3ggc3R5bGUKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBNZXNzYWdlIC0gRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5CiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dFcnJvciA9IGZ1bmN0aW9uIChNZXNzYWdlLCBBY3Rpb25zKSB7CiAgICAgICAgU2hvd01lc3NhZ2VCb3goJ0Vycm9yJywgTWVzc2FnZSwgQWN0aW9ucyk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgU2hvd1dhcm5pbmcKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFNob3cgYSB3YXJuaW5nIG1lc3NhZ2UgaW4gWm51bnkgTWVzc2FnZUJveCBzdHlsZQogICAgICogQHBhcmFtIHtTdHJpbmd9IE1lc3NhZ2UgLSBXYXJuaW5nIG1lc3NhZ2UgdG8gZGlzcGxheQogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FybmluZyA9IGZ1bmN0aW9uIChNZXNzYWdlLCBBY3Rpb25zKSB7CiAgICAgICAgU2hvd01lc3NhZ2VCb3goJ1dhcm5pbmcnLCBNZXNzYWdlLCBBY3Rpb25zKTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiB8fCB7fSkpOwo=</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.UI.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICogQGRlc2NyaXB0aW9uCiAqICAgICAgVUkgQ29tcG9uZW50cyBmb3IgQ29sbGFib3JhdGlvbiBBZGQtb24KICoKICogICAgICBDb21wb25lbnRzOgogKiAgICAgIC0gQXZhdGFyIHdpdGggUHJlc2VuY2UgaW5kaWNhdG9yCiAqICAgICAgLSBIb3ZlciBDYXJkIChQZXJzb24gQ2FyZCkKICogICAgICAtIEhlYWRlciBMb2dpbiBCdXR0b24KICogICAgICAtIFRpY2tldCBab29tIEFjdGlvbnMgV2lkZ2V0CiAqICAgICAgLSBNZWV0aW5nIFNjaGVkdWxlciBEaWFsb2cKICogICAgICAtIENoYXQgRXhwb3J0IERpYWxvZwogKi8KdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIHZhciBDb2xsYWIgPSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb247CiAgICB2YXIgSG92ZXJDYXJkVGltZW91dCA9IG51bGw7CiAgICB2YXIgQWN0aXZlSG92ZXJDYXJkID0gbnVsbDsKICAgIHZhciBIb3ZlckNhcmREZWxheSA9IDMwMDsgLy8gbXMgYmVmb3JlIHNob3dpbmcgaG92ZXIgY2FyZAogICAgdmFyIEN1c3RvbWVySW5mb1dpZGdldEluaXRpYWxpemVkID0gZmFsc2U7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcmVzZW5jZSBTdGF0dXMgTWFwcGluZwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgdmFyIFByZXNlbmNlTWFwID0gewogICAgICAgICdhdmFpbGFibGUnOiB7IGNsYXNzOiAnYXZhaWxhYmxlJywgbGFiZWw6ICdBdmFpbGFibGUnIH0sCiAgICAgICAgJ2J1c3knOiB7IGNsYXNzOiAnYnVzeScsIGxhYmVsOiAnQnVzeScgfSwKICAgICAgICAnZG5kJzogeyBjbGFzczogJ2RuZCcsIGxhYmVsOiAnRG8gbm90IGRpc3R1cmInIH0sCiAgICAgICAgJ2Rvbm90ZGlzdHVyYic6IHsgY2xhc3M6ICdkbmQnLCBsYWJlbDogJ0RvIG5vdCBkaXN0dXJiJyB9LAogICAgICAgICdhd2F5JzogeyBjbGFzczogJ2F3YXknLCBsYWJlbDogJ0F3YXknIH0sCiAgICAgICAgJ2JlcmlnaHRiYWNrJzogeyBjbGFzczogJ2JlcmlnaHRiYWNrJywgbGFiZWw6ICdCZSByaWdodCBiYWNrJyB9LAogICAgICAgICdvZmZsaW5lJzogeyBjbGFzczogJ29mZmxpbmUnLCBsYWJlbDogJ09mZmxpbmUnIH0sCiAgICAgICAgJ3ByZXNlbmNldW5rbm93bic6IHsgY2xhc3M6ICd1bmtub3duJywgbGFiZWw6ICdVbmtub3duJyB9LAogICAgICAgICd1bmtub3duJzogeyBjbGFzczogJ3Vua25vd24nLCBsYWJlbDogJ1Vua25vd24nIH0sCiAgICAgICAgJ2luY2FsbCc6IHsgY2xhc3M6ICdidXN5JywgbGFiZWw6ICdJbiBhIGNhbGwnIH0sCiAgICAgICAgJ2luYWNhbGwnOiB7IGNsYXNzOiAnYnVzeScsIGxhYmVsOiAnSW4gYSBjYWxsJyB9LAogICAgICAgICdpbmFtZWV0aW5nJzogeyBjbGFzczogJ2J1c3knLCBsYWJlbDogJ0luIGEgbWVldGluZycgfSwKICAgICAgICAncHJlc2VudGluZyc6IHsgY2xhc3M6ICdidXN5JywgbGFiZWw6ICdQcmVzZW50aW5nJyB9CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gTW9kYWwgRGlhbG9nIEZ1bmN0aW9ucwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93RGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGEgc3R5bGVkIG1vZGFsIGRpYWxvZyAocmVwbGFjZXMgYnJvd3NlciBhbGVydCkKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIC0gRGlhbG9nIG9wdGlvbnMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLnRpdGxlIC0gRGlhbG9nIHRpdGxlIChvcHRpb25hbCkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLm1lc3NhZ2UgLSBNYWluIG1lc3NhZ2UgdGV4dAogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMuZGV0YWlsIC0gQWRkaXRpb25hbCBkZXRhaWwgdGV4dCAob3B0aW9uYWwsIHNob3duIGluIHNtYWxsZXIgZm9udCkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLnR5cGUgLSBEaWFsb2cgdHlwZTogJ2luZm8nLCAnc3VjY2VzcycsICdlcnJvcicsICd3YXJuaW5nJwogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMuYnV0dG9uVGV4dCAtIE9LIGJ1dHRvbiB0ZXh0IChkZWZhdWx0OiAnT0snKQogICAgICogQHBhcmFtIHtBcnJheX0gT3B0aW9ucy5idXR0b25zIC0gQ3VzdG9tIGFjdGlvbiBidXR0b25zIFt7dGV4dCwgaWNvbiwgb25DbGljaywgY2xhc3N9XQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gT3B0aW9ucy5vbkNsb3NlIC0gQ2FsbGJhY2sgd2hlbiBkaWFsb2cgY2xvc2VzCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dEaWFsb2cgPSBmdW5jdGlvbihPcHRpb25zKSB7CiAgICAgICAgT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgICAgICAgICAgdGl0bGU6ICcnLAogICAgICAgICAgICBtZXNzYWdlOiAnJywKICAgICAgICAgICAgZGV0YWlsOiAnJywKICAgICAgICAgICAgdHlwZTogJ2luZm8nLAogICAgICAgICAgICBidXR0b25UZXh0OiAnT0snLAogICAgICAgICAgICBidXR0b25zOiBbXSwKICAgICAgICAgICAgb25DbG9zZTogbnVsbAogICAgICAgIH0sIE9wdGlvbnMpOwoKICAgICAgICAvLyBSZW1vdmUgYW55IGV4aXN0aW5nIGRpYWxvZwogICAgICAgICQoJy5Db2xsYWJEaWFsb2ctb3ZlcmxheScpLnJlbW92ZSgpOwoKICAgICAgICAvLyBJY29uIGJhc2VkIG9uIHR5cGUKICAgICAgICB2YXIgSWNvbkNsYXNzID0gJ2ZhLWluZm8tY2lyY2xlJzsKICAgICAgICBpZiAoT3B0aW9ucy50eXBlID09PSAnc3VjY2VzcycpIEljb25DbGFzcyA9ICdmYS1jaGVjay1jaXJjbGUnOwogICAgICAgIGVsc2UgaWYgKE9wdGlvbnMudHlwZSA9PT0gJ2Vycm9yJykgSWNvbkNsYXNzID0gJ2ZhLWV4Y2xhbWF0aW9uLWNpcmNsZSc7CiAgICAgICAgZWxzZSBpZiAoT3B0aW9ucy50eXBlID09PSAnd2FybmluZycpIEljb25DbGFzcyA9ICdmYS1leGNsYW1hdGlvbi10cmlhbmdsZSc7CgogICAgICAgIC8vIEJ1aWxkIGN1c3RvbSBidXR0b25zIEhUTUwKICAgICAgICB2YXIgQ3VzdG9tQnV0dG9uc0hUTUwgPSAnJzsKICAgICAgICBpZiAoT3B0aW9ucy5idXR0b25zICYmIE9wdGlvbnMuYnV0dG9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIEN1c3RvbUJ1dHRvbnNIVE1MID0gJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19fYWN0aW9ucyI+JzsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBPcHRpb25zLmJ1dHRvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBCdG4gPSBPcHRpb25zLmJ1dHRvbnNbaV07CiAgICAgICAgICAgICAgICB2YXIgQnRuQ2xhc3MgPSBCdG4uY2xhc3MgfHwgJ0NvbGxhYkRpYWxvZ19fYWN0aW9uQnRuJzsKICAgICAgICAgICAgICAgIHZhciBJY29uSFRNTCA9IEJ0bi5pY29uID8gJzxpIGNsYXNzPSJmYSAnICsgQnRuLmljb24gKyAnIj48L2k+ICcgOiAnJzsKICAgICAgICAgICAgICAgIEN1c3RvbUJ1dHRvbnNIVE1MICs9ICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IicgKyBCdG5DbGFzcyArICciIGRhdGEtYWN0aW9uLWluZGV4PSInICsgaSArICciPicgKwogICAgICAgICAgICAgICAgICAgIEljb25IVE1MICsgRXNjYXBlSHRtbChCdG4udGV4dCkgKyAnPC9idXR0b24+JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBDdXN0b21CdXR0b25zSFRNTCArPSAnPC9kaXY+JzsKICAgICAgICB9CgogICAgICAgIC8vIEJ1aWxkIGRpYWxvZyBIVE1MCiAgICAgICAgdmFyIERpYWxvZ0hUTUwgPSAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nLW92ZXJsYXkiPicgKwogICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nIENvbGxhYkRpYWxvZy0tJyArIE9wdGlvbnMudHlwZSArICciPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19faGVhZGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhICcgKyBJY29uQ2xhc3MgKyAnIENvbGxhYkRpYWxvZ19faWNvbiI+PC9pPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iQ29sbGFiRGlhbG9nX190aXRsZSI+JyArIChPcHRpb25zLnRpdGxlIHx8IEdldERpYWxvZ1RpdGxlKE9wdGlvbnMudHlwZSkpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDb2xsYWJEaWFsb2dfX2Nsb3NlIiBhcmlhLWxhYmVsPSJDbG9zZSI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19ib2R5Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19tZXNzYWdlIj4nICsgRXNjYXBlSHRtbChPcHRpb25zLm1lc3NhZ2UpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgICAgIChPcHRpb25zLmRldGFpbCA/ICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2dfX2RldGFpbCI+JyArIEVzY2FwZUh0bWwoT3B0aW9ucy5kZXRhaWwpICsgJzwvZGl2PicgOiAnJykgKwogICAgICAgICAgICAgICAgICAgIEN1c3RvbUJ1dHRvbnNIVE1MICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2dfX2Zvb3RlciI+JyArCiAgICAgICAgICAgICAgICAgICAgJzxidXR0b24gdHlwZT0iYnV0dG9uIiBjbGFzcz0iQ29sbGFiRGlhbG9nX19idG4gQ29sbGFiRGlhbG9nX19idG4tLXByaW1hcnkiPicgKyBFc2NhcGVIdG1sKE9wdGlvbnMuYnV0dG9uVGV4dCkgKyAnPC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAnPC9kaXY+JzsKCiAgICAgICAgdmFyICREaWFsb2cgPSAkKERpYWxvZ0hUTUwpOwogICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJERpYWxvZyk7CgogICAgICAgIC8vIEZvY3VzIHRoZSBPSyBidXR0b24KICAgICAgICAkRGlhbG9nLmZpbmQoJy5Db2xsYWJEaWFsb2dfX2J0bi0tcHJpbWFyeScpLmZvY3VzKCk7CgogICAgICAgIC8vIENsb3NlIGhhbmRsZXJzCiAgICAgICAgZnVuY3Rpb24gQ2xvc2VEaWFsb2coKSB7CiAgICAgICAgICAgICREaWFsb2cuYWRkQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5LS1jbG9zaW5nJyk7CiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9mZigna2V5ZG93bi5jb2xsYWJEaWFsb2cnKTsKICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICREaWFsb2cucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBpZiAoT3B0aW9ucy5vbkNsb3NlKSB7CiAgICAgICAgICAgICAgICAgICAgT3B0aW9ucy5vbkNsb3NlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDdXN0b20gYWN0aW9uIGJ1dHRvbiBoYW5kbGVycwogICAgICAgICREaWFsb2cuZmluZCgnLkNvbGxhYkRpYWxvZ19fYWN0aW9ucyBidXR0b24nKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIEluZGV4ID0gcGFyc2VJbnQoJCh0aGlzKS5hdHRyKCdkYXRhLWFjdGlvbi1pbmRleCcpLCAxMCk7CiAgICAgICAgICAgIHZhciBCdG4gPSBPcHRpb25zLmJ1dHRvbnNbSW5kZXhdOwogICAgICAgICAgICBpZiAoQnRuICYmIEJ0bi5vbkNsaWNrKSB7CiAgICAgICAgICAgICAgICBCdG4ub25DbGljaygkRGlhbG9nLCBDbG9zZURpYWxvZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJERpYWxvZy5maW5kKCcuQ29sbGFiRGlhbG9nX19jbG9zZSwgLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5Jykub24oJ2NsaWNrJywgQ2xvc2VEaWFsb2cpOwogICAgICAgICREaWFsb2cub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5JykpIHsKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gRVNDIGtleSB0byBjbG9zZQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdrZXlkb3duLmNvbGxhYkRpYWxvZycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQW5pbWF0ZSBpbgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICREaWFsb2cuYWRkQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5LS12aXNpYmxlJyk7CiAgICAgICAgfSwgMTApOwoKICAgICAgICByZXR1cm4gJERpYWxvZzsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93Q29uZmlybURpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBhIHN0eWxlZCBjb25maXJtYXRpb24gZGlhbG9nIChyZXBsYWNlcyBicm93c2VyIGNvbmZpcm0pCiAgICAgKiBAcGFyYW0ge09iamVjdH0gT3B0aW9ucyAtIERpYWxvZyBvcHRpb25zCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gT3B0aW9ucy50aXRsZSAtIERpYWxvZyB0aXRsZSAob3B0aW9uYWwpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gT3B0aW9ucy5tZXNzYWdlIC0gTWFpbiBtZXNzYWdlIHRleHQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLmNvbmZpcm1UZXh0IC0gQ29uZmlybSBidXR0b24gdGV4dCAoZGVmYXVsdDogJ09LJykKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLmNhbmNlbFRleHQgLSBDYW5jZWwgYnV0dG9uIHRleHQgKGRlZmF1bHQ6ICdBYmJyZWNoZW4nKQogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMudHlwZSAtIERpYWxvZyB0eXBlOiAnd2FybmluZycsICdkYW5nZXInCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBPcHRpb25zLm9uQ29uZmlybSAtIENhbGxiYWNrIHdoZW4gY29uZmlybWVkCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBPcHRpb25zLm9uQ2FuY2VsIC0gQ2FsbGJhY2sgd2hlbiBjYW5jZWxsZWQKICAgICAqLwogICAgVGFyZ2V0TlMuU2hvd0NvbmZpcm1EaWFsb2cgPSBmdW5jdGlvbihPcHRpb25zKSB7CiAgICAgICAgT3B0aW9ucyA9ICQuZXh0ZW5kKHsKICAgICAgICAgICAgdGl0bGU6ICcnLAogICAgICAgICAgICBtZXNzYWdlOiAnJywKICAgICAgICAgICAgY29uZmlybVRleHQ6ICdPSycsCiAgICAgICAgICAgIGNhbmNlbFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwnKSwKICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICBvbkNvbmZpcm06IG51bGwsCiAgICAgICAgICAgIG9uQ2FuY2VsOiBudWxsCiAgICAgICAgfSwgT3B0aW9ucyk7CgogICAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgZGlhbG9nCiAgICAgICAgJCgnLkNvbGxhYkRpYWxvZy1vdmVybGF5JykucmVtb3ZlKCk7CgogICAgICAgIC8vIEljb24gYmFzZWQgb24gdHlwZQogICAgICAgIHZhciBJY29uQ2xhc3MgPSAnZmEtcXVlc3Rpb24tY2lyY2xlJzsKICAgICAgICBpZiAoT3B0aW9ucy50eXBlID09PSAnZGFuZ2VyJykgSWNvbkNsYXNzID0gJ2ZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJzsKCiAgICAgICAgLy8gQnVpbGQgZGlhbG9nIEhUTUwKICAgICAgICB2YXIgRGlhbG9nSFRNTCA9ICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2ctb3ZlcmxheSI+JyArCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJEaWFsb2cgQ29sbGFiRGlhbG9nLS1jb25maXJtIENvbGxhYkRpYWxvZy0tJyArIE9wdGlvbnMudHlwZSArICciPicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19faGVhZGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhICcgKyBJY29uQ2xhc3MgKyAnIENvbGxhYkRpYWxvZ19faWNvbiI+PC9pPicgKwogICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz0iQ29sbGFiRGlhbG9nX190aXRsZSI+JyArIChPcHRpb25zLnRpdGxlIHx8IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb25maXJtJykpICsgJzwvc3Bhbj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDb2xsYWJEaWFsb2dfX2Nsb3NlIiBhcmlhLWxhYmVsPSJDbG9zZSI+PGkgY2xhc3M9ImZhIGZhLXRpbWVzIj48L2k+PC9idXR0b24+JyArCiAgICAgICAgICAgICAgICAnPC9kaXY+JyArCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19ib2R5Ij4nICsKICAgICAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiRGlhbG9nX19tZXNzYWdlIj4nICsgRXNjYXBlSHRtbChPcHRpb25zLm1lc3NhZ2UpICsgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYkRpYWxvZ19fZm9vdGVyIj4nICsKICAgICAgICAgICAgICAgICAgICAnPGJ1dHRvbiB0eXBlPSJidXR0b24iIGNsYXNzPSJDb2xsYWJEaWFsb2dfX2J0biBDb2xsYWJEaWFsb2dfX2J0bi0tc2Vjb25kYXJ5Ij4nICsgRXNjYXBlSHRtbChPcHRpb25zLmNhbmNlbFRleHQpICsgJzwvYnV0dG9uPicgKwogICAgICAgICAgICAgICAgICAgICc8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgY2xhc3M9IkNvbGxhYkRpYWxvZ19fYnRuIENvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5Ij4nICsgRXNjYXBlSHRtbChPcHRpb25zLmNvbmZpcm1UZXh0KSArICc8L2J1dHRvbj4nICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nICsKICAgICAgICAgICAgJzwvZGl2PicgKwogICAgICAgICc8L2Rpdj4nOwoKICAgICAgICB2YXIgJERpYWxvZyA9ICQoRGlhbG9nSFRNTCk7CiAgICAgICAgJCgnYm9keScpLmFwcGVuZCgkRGlhbG9nKTsKCiAgICAgICAgLy8gRm9jdXMgdGhlIGNvbmZpcm0gYnV0dG9uCiAgICAgICAgJERpYWxvZy5maW5kKCcuQ29sbGFiRGlhbG9nX19idG4tLXByaW1hcnknKS5mb2N1cygpOwoKICAgICAgICAvLyBDbG9zZSBoYW5kbGVycwogICAgICAgIGZ1bmN0aW9uIENsb3NlRGlhbG9nKGNvbmZpcm1lZCkgewogICAgICAgICAgICAkRGlhbG9nLmFkZENsYXNzKCdDb2xsYWJEaWFsb2ctb3ZlcmxheS0tY2xvc2luZycpOwogICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24uY29sbGFiRGlhbG9nJyk7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkRGlhbG9nLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgaWYgKGNvbmZpcm1lZCAmJiBPcHRpb25zLm9uQ29uZmlybSkgewogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMub25Db25maXJtKCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjb25maXJtZWQgJiYgT3B0aW9ucy5vbkNhbmNlbCkgewogICAgICAgICAgICAgICAgICAgIE9wdGlvbnMub25DYW5jZWwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgMjAwKTsKICAgICAgICB9CgogICAgICAgICREaWFsb2cuZmluZCgnLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7IENsb3NlRGlhbG9nKHRydWUpOyB9KTsKICAgICAgICAkRGlhbG9nLmZpbmQoJy5Db2xsYWJEaWFsb2dfX2J0bi0tc2Vjb25kYXJ5LCAuQ29sbGFiRGlhbG9nX19jbG9zZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgeyBDbG9zZURpYWxvZyhmYWxzZSk7IH0pOwogICAgICAgICREaWFsb2cub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoJChlLnRhcmdldCkuaGFzQ2xhc3MoJ0NvbGxhYkRpYWxvZy1vdmVybGF5JykpIHsKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBFU0MgdG8gY2FuY2VsLCBFbnRlciB0byBjb25maXJtCiAgICAgICAgJChkb2N1bWVudCkub24oJ2tleWRvd24uY29sbGFiRGlhbG9nJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNykgeyAvLyBFU0MKICAgICAgICAgICAgICAgIENsb3NlRGlhbG9nKGZhbHNlKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDEzKSB7IC8vIEVudGVyCiAgICAgICAgICAgICAgICBDbG9zZURpYWxvZyh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBBbmltYXRlIGluCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgJERpYWxvZy5hZGRDbGFzcygnQ29sbGFiRGlhbG9nLW92ZXJsYXktLXZpc2libGUnKTsKICAgICAgICB9LCAxMCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZGVmYXVsdCBkaWFsb2cgdGl0bGUgYmFzZWQgb24gdHlwZQogICAgICovCiAgICBmdW5jdGlvbiBHZXREaWFsb2dUaXRsZShUeXBlKSB7CiAgICAgICAgc3dpdGNoIChUeXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ3N1Y2Nlc3MnOiByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1Y2Nlc3MnKTsKICAgICAgICAgICAgY2FzZSAnZXJyb3InOiByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Vycm9yJyk7CiAgICAgICAgICAgIGNhc2UgJ3dhcm5pbmcnOiByZXR1cm4gQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dhcm5pbmcnKTsKICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdJbmZvcm1hdGlvbicpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRXNjYXBlIEhUTUwgdG8gcHJldmVudCBYU1MKICAgICAqLwogICAgZnVuY3Rpb24gRXNjYXBlSHRtbChUZXh0KSB7CiAgICAgICAgaWYgKCFUZXh0KSByZXR1cm4gJyc7CiAgICAgICAgcmV0dXJuIFN0cmluZyhUZXh0KQogICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgICAgICAucmVwbGFjZSgvPC9nLCAnJmx0OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JykKICAgICAgICAgICAgLnJlcGxhY2UoLyIvZywgJyZxdW90OycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzAzOTsnKQogICAgICAgICAgICAucmVwbGFjZSgvXG4vZywgJzxicj4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ29weSB0ZXh0IHRvIGNsaXBib2FyZAogICAgICovCiAgICBmdW5jdGlvbiBDb3B5VG9DbGlwYm9hcmQoVGV4dCkgewogICAgICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KSB7CiAgICAgICAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KFRleHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGZvciBvbGRlciBicm93c2VycwogICAgICAgICAgICB2YXIgJFRlbXAgPSAkKCc8dGV4dGFyZWE+JykudmFsKFRleHQpLmFwcGVuZFRvKCdib2R5Jykuc2VsZWN0KCk7CiAgICAgICAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7CiAgICAgICAgICAgICRUZW1wLnJlbW92ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gSW5pdGlhbGl6YXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZSBVSSBjb21wb25lbnRzCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgQ29sbGFib3JhdGlvbiBjb25maWcgd2FzIGluamVjdGVkIGJ5IHRoZSBzZXJ2ZXIgKG9ubHkgb24gYXV0aGVudGljYXRlZCBwYWdlcykKICAgICAgICAvLyBUaGUgT3V0cHV0IEZpbHRlciBzZXRzIENvcmUuQ29uZmlnLkNvbGxhYm9yYXRpb24gb25seSBmb3IgbG9nZ2VkLWluIHVzZXJzCiAgICAgICAgdmFyIFNlcnZlckNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ29sbGFib3JhdGlvbicpOwogICAgICAgIGlmICghU2VydmVyQ29uZmlnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBDb25maWcgPSBDb2xsYWIuR2V0Q29uZmlnKCk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzCiAgICAgICAgQ29sbGFiLk9uKCdsb2dpbicsIE9uTG9naW4pOwogICAgICAgIENvbGxhYi5PbignbG9nb3V0JywgT25Mb2dvdXQpOwoKICAgICAgICAvLyBLZWVwIFpudW55J3MgbmF0aXZlIHRvcC1yaWdodCBub3RpZmljYXRpb24gdHJheSAodXNlZCBmb3IgYm90aAogICAgICAgIC8vIG5hdGl2ZSBtZXNzYWdlcyBsaWtlICJEYWVtb24gaXMgbm90IHJ1bm5pbmciIGFuZCBvdXIgb3duLCBzZWUKICAgICAgICAvLyBTaG93TWVzc2FnZUJveCBpbiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uanMpIGJlbG93IHRoZSBoZWFkZXIKICAgICAgICAvLyByZWdhcmRsZXNzIG9mIGhvdyB0YWxsIHRoZSBoZWFkZXIgYWN0dWFsbHkgaXMgLSBub3QganVzdAogICAgICAgIC8vIENvbGxhYm9yYXRpb24ncyBvd24gY29uY2VybiwgYnV0IG5vYm9keSBlbHNlIGZpeGVzIGl0IGVpdGhlci4KICAgICAgICAvLyBEZWZlcnJlZCB0byAkKGRvY3VtZW50KS5yZWFkeSAodGhpcyBJbml0KCkgY2FsbCBpdHNlbGYgY2FuIHJ1bgogICAgICAgIC8vIGJlZm9yZSAjSGVhZGVyIGV4aXN0cyBpbiB0aGUgRE9NIHlldCksIGFuZCBkcml2ZW4gYnkgYQogICAgICAgIC8vIFJlc2l6ZU9ic2VydmVyIG9uICNIZWFkZXIgaXRzZWxmIHJhdGhlciB0aGFuIG9ubHkgd2luZG93CiAgICAgICAgLy8gcmVzaXplIC0gI0hlYWRlcidzIGhlaWdodCBjYW4gY2hhbmdlIGZvciByZWFzb25zIHRoYXQgbmV2ZXIKICAgICAgICAvLyBmaXJlIGEgd2luZG93IHJlc2l6ZSBldmVudCBhdCBhbGwgKGUuZy4gdGhlIEFubm91bmNlbWVudAogICAgICAgIC8vIGFkZC1vbidzIG5hdiBiYW5uZXIsIG9yICNOYXZpZ2F0aW9uIHdyYXBwaW5nIHRvIGEgc2Vjb25kIHJvdywKICAgICAgICAvLyBib3RoIGluc2VydGVkL3JlbmRlcmVkIGFzeW5jaHJvbm91c2x5IGFmdGVyIG91ciBvd24gb25lLXRpbWUKICAgICAgICAvLyBpbml0aWFsIG1lYXN1cmVtZW50IHdvdWxkIG90aGVyd2lzZSBoYXZlIGFscmVhZHkgcnVuIGFuZCBnb25lCiAgICAgICAgLy8gc3RhbGUpLiB3aW5kb3cgcmVzaXplIGlzIGtlcHQgdG9vLCBvbmx5IGFzIGFuIGV4dHJhIHNhZmV0eSBuZXQKICAgICAgICAvLyBmb3IgYnJvd3NlcnMgd2l0aG91dCBSZXNpemVPYnNlcnZlci4KICAgICAgICAkKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgRml4Tm90aWZpY2F0aW9uVHJheVBvc2l0aW9uKCk7CgogICAgICAgICAgICB2YXIgJEhlYWRlckVsID0gJCgnI0hlYWRlcicpWzBdOwogICAgICAgICAgICBpZiAoJEhlYWRlckVsICYmIHdpbmRvdy5SZXNpemVPYnNlcnZlcikgewogICAgICAgICAgICAgICAgbmV3IFJlc2l6ZU9ic2VydmVyKEZpeE5vdGlmaWNhdGlvblRyYXlQb3NpdGlvbikub2JzZXJ2ZSgkSGVhZGVyRWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgTm90aWZpY2F0aW9uVHJheVJlc2l6ZVRpbWVyID0gbnVsbDsKICAgICAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuY29sbGFiTm90aWZpY2F0aW9uVHJheScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChOb3RpZmljYXRpb25UcmF5UmVzaXplVGltZXIpOwogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uVHJheVJlc2l6ZVRpbWVyID0gc2V0VGltZW91dChGaXhOb3RpZmljYXRpb25UcmF5UG9zaXRpb24sIDIwMCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGhlYWRlciBpZiBjb25maWd1cmVkCiAgICAgICAgaWYgKENvbmZpZy5TaG93SW5IZWFkZXIpIHsKICAgICAgICAgICAgSW5pdEhlYWRlcigpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2V0dXAgZ2xvYmFsIGhvdmVyIGNhcmQgaGFuZGxlcgogICAgICAgIFNldHVwSG92ZXJDYXJkSGFuZGxlcigpOwoKICAgICAgICAvLyBJbml0aWFsaXplIG9uIHBhZ2UgbG9hZAogICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gUHJvY2VzcyBleGlzdGluZyBhdmF0YXJzIG9uIHBhZ2UKICAgICAgICAgICAgUHJvY2Vzc0F2YXRhcnNPblBhZ2UoKTsKCiAgICAgICAgICAgIC8vIFByb2Nlc3MgbmF0aXZlIGFydGljbGUgYXZhdGFycyBpbiB0aWNrZXQgem9vbQogICAgICAgICAgICBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMoKTsKCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY3VzdG9tZXIgaW5mbyB3aWRnZXQgaWYgb24gdGlja2V0IHBhZ2UKICAgICAgICAgICAgLy8gTm90ZTogWm51bnkgc3RvcmVzIFRpY2tldElEIGluIENvcmUuQ29uZmlnLCBub3QgYXMgYSBET00gZWxlbWVudAogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdUaWNrZXRJRCcpKSB7CiAgICAgICAgICAgICAgICBJbml0Q3VzdG9tZXJJbmZvV2lkZ2V0KCk7CgogICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBvd25lci9yZXNwb25zaWJsZSBhdmF0YXJzIGluIFRpY2tldCBJbmZvcm1hdGlvbiB3aWRnZXQKICAgICAgICAgICAgICAgIEluaXRUaWNrZXRJbmZvQXZhdGFycygpOwoKICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgY2FuY2VsIGJ1dHRvbnMgZm9yIGxpbmtlZCBhcHBvaW50bWVudHMKICAgICAgICAgICAgICAgIEluaXRDYW5jZWxBcHBvaW50bWVudEJ1dHRvbnMoKTsKCiAgICAgICAgICAgICAgICAvLyBXYXRjaCBmb3IgZHluYW1pY2FsbHkgbG9hZGVkIGFydGljbGVzIChzaW5nbGUgYXJ0aWNsZSB2aWV3IHN3aXRjaGluZykKICAgICAgICAgICAgICAgIFNldHVwQXJ0aWNsZU9ic2VydmVyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgZHluYW1pYyBjdXN0b21lciBpbmZvIHdpZGdldCBvbiB0aWNrZXQgY3JlYXRlIHBhZ2VzCiAgICAgICAgICAgIC8vIChBZ2VudFRpY2tldFBob25lLCBBZ2VudFRpY2tldEVtYWlsLCBBZ2VudFRpY2tldEN1c3RvbWVyKQogICAgICAgICAgICB2YXIgQ29sbGFiQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwogICAgICAgICAgICBpZiAoQ29sbGFiQ29uZmlnLkR5bmFtaWNDdXN0b21lclNlbGVjdGlvbikgewogICAgICAgICAgICAgICAgSW5pdER5bmFtaWNDdXN0b21lckluZm9XaWRnZXQoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSBPd25lciBJbmZvIFBhbmVsIGZvciBvd25lciBzZWxlY3Rpb24gZHJvcGRvd25zCiAgICAgICAgICAgIGlmIChDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uT3duZXJJbmZvUGFuZWwgJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsLkluaXQpIHsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Pd25lckluZm9QYW5lbC5Jbml0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFNldHVwIG9ic2VydmVyIGZvciBkeW5hbWljYWxseSBsb2FkZWQgYXJ0aWNsZXMKICAgICAqICAgICAgICAgICAgICBXYXRjaGVzICNBcnRpY2xlSXRlbXMgY29udGFpbmVyIGZvciBhcnRpY2xlIHN3aXRjaGluZwogICAgICovCiAgICBmdW5jdGlvbiBTZXR1cEFydGljbGVPYnNlcnZlcigpIHsKICAgICAgICB2YXIgUHJvY2Vzc1BlbmRpbmcgPSBmYWxzZTsKICAgICAgICB2YXIgUHJvY2Vzc1RpbWVvdXQgPSBudWxsOwoKICAgICAgICAvLyBUaHJvdHRsZWQgcHJvY2Vzc2luZyBmdW5jdGlvbgogICAgICAgIGZ1bmN0aW9uIFRocm90dGxlZFByb2Nlc3MoKSB7CiAgICAgICAgICAgIGlmIChQcm9jZXNzUGVuZGluZykgcmV0dXJuOwogICAgICAgICAgICBQcm9jZXNzUGVuZGluZyA9IHRydWU7CgogICAgICAgICAgICAvLyBDbGVhciBhbnkgcGVuZGluZyB0aW1lb3V0CiAgICAgICAgICAgIGlmIChQcm9jZXNzVGltZW91dCkgewogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KFByb2Nlc3NUaW1lb3V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRGVsYXkgdG8gYmF0Y2ggbXVsdGlwbGUgbXV0YXRpb25zCiAgICAgICAgICAgIFByb2Nlc3NUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGFyZSB1bnByb2Nlc3NlZCBhcnRpY2xlIGF2YXRhcnMKICAgICAgICAgICAgICAgIHZhciAkVW5wcm9jZXNzZWQgPSAkKCcuQXZhdGFyIC5BcnRpY2xlU2VuZGVySW5pdGlhbHMnKS5maWx0ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEkKHRoaXMpLmNsb3Nlc3QoJy5XaWRnZXRTaW1wbGUnKS5oYXNDbGFzcygnQ29sbGFiQXJ0aWNsZS0tcHJvY2Vzc2VkJyk7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoJFVucHJvY2Vzc2VkLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBQcm9jZXNzQXJ0aWNsZUF2YXRhcnMoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBQcm9jZXNzUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgUHJvY2Vzc1RpbWVvdXQgPSBudWxsOwogICAgICAgICAgICB9LCAxMDApOwogICAgICAgIH0KCiAgICAgICAgLy8gUHJpbWFyeSB0YXJnZXQ6ICNBcnRpY2xlSXRlbXMgY29udGFpbmVyICh3aGVyZSBhcnRpY2xlIGNvbnRlbnQgY2hhbmdlcykKICAgICAgICB2YXIgJEFydGljbGVJdGVtcyA9ICQoJyNBcnRpY2xlSXRlbXMnKTsKCiAgICAgICAgaWYgKCRBcnRpY2xlSXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgb24gI0FydGljbGVJdGVtcyAtIHRoZSBzcGVjaWZpYyBjb250YWluZXIgd2hlcmUgY2hhbmdlcyBoYXBwZW4KICAgICAgICAgICAgdmFyIE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oTXV0YXRpb25zKSB7CiAgICAgICAgICAgICAgICAvLyBBbnkgY2hhbmdlIGluc2lkZSBBcnRpY2xlSXRlbXMgdHJpZ2dlcnMgcHJvY2Vzc2luZwogICAgICAgICAgICAgICAgVGhyb3R0bGVkUHJvY2VzcygpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIE9ic2VydmVyLm9ic2VydmUoJEFydGljbGVJdGVtc1swXSwgewogICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLAogICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEZhbGxiYWNrOiBIb29rIGludG8gWm51bnkncyBBSkFYIGNvbXBsZXRlIGV2ZW50cwogICAgICAgICQoZG9jdW1lbnQpLmFqYXhDb21wbGV0ZShmdW5jdGlvbihFdmVudCwgWEhSLCBTZXR0aW5ncykgewogICAgICAgICAgICAvLyBQcm9jZXNzIGFmdGVyIGFueSBBSkFYIHRoYXQgbWlnaHQgbG9hZCBhcnRpY2xlIGNvbnRlbnQKICAgICAgICAgICAgaWYgKFNldHRpbmdzLnVybCAmJiAoCiAgICAgICAgICAgICAgICBTZXR0aW5ncy51cmwuaW5kZXhPZignQXJ0aWNsZUlEJykgPiAtMSB8fAogICAgICAgICAgICAgICAgU2V0dGluZ3MudXJsLmluZGV4T2YoJ1RpY2tldFpvb20nKSA+IC0xIHx8CiAgICAgICAgICAgICAgICBTZXR0aW5ncy51cmwuaW5kZXhPZignQXJ0aWNsZScpID4gLTEgfHwKICAgICAgICAgICAgICAgIFNldHRpbmdzLnVybC5pbmRleE9mKCdBZ2VudFRpY2tldFpvb20nKSA+IC0xCiAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIC8vIFNtYWxsIGRlbGF5IHRvIGxldCBET00gdXBkYXRlCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KFRocm90dGxlZFByb2Nlc3MsIDUwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBBdmF0YXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgQ3JlYXRlQXZhdGFyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgYW4gYXZhdGFyIGVsZW1lbnQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBPcHRpb25zIC0gQXZhdGFyIG9wdGlvbnMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBPcHRpb25zLmVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHBhcmFtIHtTdHJpbmd9IE9wdGlvbnMuc2l6ZSAtIFNpemU6IHNtYWxsLCBtZWRpdW0sIGxhcmdlLCB4bGFyZ2UKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gT3B0aW9ucy5zaG93UHJlc2VuY2UgLSBTaG93IHByZXNlbmNlIGluZGljYXRvcgogICAgICogQHBhcmFtIHtCb29sZWFufSBPcHRpb25zLmNsaWNrYWJsZSAtIEVuYWJsZSBob3ZlciBjYXJkIG9uIGNsaWNrCiAgICAgKiBAcmV0dXJucyB7alF1ZXJ5fSBBdmF0YXIgZWxlbWVudAogICAgICovCiAgICBUYXJnZXROUy5DcmVhdGVBdmF0YXIgPSBmdW5jdGlvbiAoT3B0aW9ucykgewogICAgICAgIE9wdGlvbnMgPSAkLmV4dGVuZCh7CiAgICAgICAgICAgIGVtYWlsOiAnJywKICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsCiAgICAgICAgICAgIHNob3dQcmVzZW5jZTogdHJ1ZSwKICAgICAgICAgICAgY2xpY2thYmxlOiB0cnVlCiAgICAgICAgfSwgT3B0aW9ucyk7CgogICAgICAgIHZhciAkQXZhdGFyID0gJCgnPGRpdj4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhcicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyLS0nICsgT3B0aW9ucy5zaXplKQogICAgICAgICAgICAuYXR0cignZGF0YS1lbWFpbCcsIE9wdGlvbnMuZW1haWwpOwoKICAgICAgICBpZiAoT3B0aW9ucy5jbGlja2FibGUgJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0hvdmVyQ2FyZHMnKSkgewogICAgICAgICAgICAkQXZhdGFyLmFkZENsYXNzKCdDb2xsYWJBdmF0YXItLWNsaWNrYWJsZScpOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIHBsYWNlaG9sZGVyICh0ZXh0LWJhc2VkIGluaXRpYWxzIGZhbGxiYWNrKQogICAgICAgIHZhciAkRmFsbGJhY2sgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpCiAgICAgICAgICAgIC50ZXh0KEdldEluaXRpYWxzKE9wdGlvbnMuZW1haWwpKTsKICAgICAgICAkQXZhdGFyLmFwcGVuZCgkRmFsbGJhY2spOwoKICAgICAgICAvLyBDcmVhdGUgaW1nIGVsZW1lbnQgSU1NRURJQVRFTFkgKHN5bmNocm9ub3VzbHkpIHRvIHByZXZlbnQgcmFjZSBjb25kaXRpb25zCiAgICAgICAgLy8gd2l0aCBVcGRhdGVBdmF0YXIgd2hpY2ggbWlnaHQgcnVuIGJlZm9yZSBvdXIgR2V0QXZhdGFyIHByb21pc2UgcmVzb2x2ZXMuCiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIFVwZGF0ZUF2YXRhciBhbHdheXMgZmluZHMgYW4gZXhpc3RpbmcgaW1nIGVsZW1lbnQuCiAgICAgICAgdmFyICRJbWcgPSBudWxsOwogICAgICAgIGlmIChDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnQXZhdGFyJykpIHsKICAgICAgICAgICAgJEltZyA9ICQoJzxpbWc+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19pbWFnZScpCiAgICAgICAgICAgICAgICAuYXR0cignYWx0JywgJycpCiAgICAgICAgICAgICAgICAub24oJ2Vycm9yJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICRGYWxsYmFjay5zaG93KCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gUHJlcGVuZCBpbWcgaW1tZWRpYXRlbHkgKHdpdGggbm8gc3JjIHlldCkKICAgICAgICAgICAgJEF2YXRhci5wcmVwZW5kKCRJbWcpOwoKICAgICAgICAgICAgLy8gTG9hZCBhdmF0YXIgVVJMIGFzeW5jaHJvbm91c2x5CiAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoT3B0aW9ucy5lbWFpbCkudGhlbihmdW5jdGlvbiAoVXJsKSB7CiAgICAgICAgICAgICAgICBpZiAoIVVybCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHNyYyBpZiBuZXcgdmFsdWUgaXMgImJldHRlciIgKHJlYWwgaW1hZ2UgdnMgU1ZHIGZhbGxiYWNrKQogICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRTcmMgPSAkSW1nLmF0dHIoJ3NyYycpIHx8ICcnOwogICAgICAgICAgICAgICAgdmFyIE5ld0lzU3ZnRmFsbGJhY2sgPSBVcmwuaW5kZXhPZignZGF0YTppbWFnZS9zdmcnKSA9PT0gMDsKICAgICAgICAgICAgICAgIHZhciBDdXJyZW50SXNTdmdGYWxsYmFjayA9ICFDdXJyZW50U3JjIHx8IEN1cnJlbnRTcmMuaW5kZXhPZignZGF0YTppbWFnZS9zdmcnKSA9PT0gMDsKICAgICAgICAgICAgICAgIHZhciBTaG91bGRVcGRhdGUgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50SXNTdmdGYWxsYmFjayB8fCAhTmV3SXNTdmdGYWxsYmFjazsKICAgICAgICAgICAgICAgIGlmIChTaG91bGRVcGRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAkSW1nLmF0dHIoJ3NyYycsIFVybCk7CiAgICAgICAgICAgICAgICAgICAgJEZhbGxiYWNrLmhpZGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgcHJlc2VuY2UgaW5kaWNhdG9yCiAgICAgICAgaWYgKE9wdGlvbnMuc2hvd1ByZXNlbmNlICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdQcmVzZW5jZScpKSB7CiAgICAgICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlJykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UtLXVua25vd24nKTsKICAgICAgICAgICAgJEF2YXRhci5hcHBlbmQoJFByZXNlbmNlKTsKCiAgICAgICAgICAgIC8vIExvYWQgcHJlc2VuY2UKICAgICAgICAgICAgQ29sbGFiLkdldFByZXNlbmNlKE9wdGlvbnMuZW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICBVcGRhdGVQcmVzZW5jZUluZGljYXRvcigkUHJlc2VuY2UsIFByZXNlbmNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJEF2YXRhcjsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBVcGRhdGVBdmF0YXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFVwZGF0ZSBhbiBleGlzdGluZyBhdmF0YXIgZWxlbWVudAogICAgICogQHBhcmFtIHtqUXVlcnl9ICRBdmF0YXIgLSBBdmF0YXIgZWxlbWVudAogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVBdmF0YXIgPSBmdW5jdGlvbiAoJEF2YXRhcikgewogICAgICAgIHZhciBFbWFpbCA9ICRBdmF0YXIuYXR0cignZGF0YS1lbWFpbCcpOwogICAgICAgIGlmICghRW1haWwpIHJldHVybjsKCiAgICAgICAgLy8gRmluZCBleGlzdGluZyBpbWcgZWxlbWVudCAtIENyZWF0ZUF2YXRhciBjcmVhdGVzIGl0IHN5bmNocm9ub3VzbHksCiAgICAgICAgLy8gc28gaXQgc2hvdWxkIGFsd2F5cyBleGlzdC4gSWYgbm90LCBza2lwIChhdmF0YXIgZmVhdHVyZSBtaWdodCBiZSBkaXNhYmxlZCkuCiAgICAgICAgdmFyICRJbWcgPSAkQXZhdGFyLmZpbmQoJy5Db2xsYWJBdmF0YXJfX2ltYWdlJyk7CiAgICAgICAgaWYgKCEkSW1nLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAvLyBVcGRhdGUgYXZhdGFyIGltYWdlCiAgICAgICAgQ29sbGFiLkdldEF2YXRhcihFbWFpbCkudGhlbihmdW5jdGlvbiAoVXJsKSB7CiAgICAgICAgICAgIGlmICghVXJsKSByZXR1cm47CgogICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSBzcmMgaWYgbmV3IHZhbHVlIGlzICJiZXR0ZXIiIChyZWFsIGltYWdlIHZzIFNWRyBmYWxsYmFjaykKICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBmYWxsYmFjayByZXNwb25zZXMgZnJvbSBvdmVyd3JpdGluZyByZWFsIGF2YXRhcnMKICAgICAgICAgICAgdmFyIEN1cnJlbnRTcmMgPSAkSW1nLmF0dHIoJ3NyYycpIHx8ICcnOwogICAgICAgICAgICB2YXIgTmV3SXNTdmdGYWxsYmFjayA9IFVybC5pbmRleE9mKCdkYXRhOmltYWdlL3N2ZycpID09PSAwOwogICAgICAgICAgICB2YXIgQ3VycmVudElzU3ZnRmFsbGJhY2sgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50U3JjLmluZGV4T2YoJ2RhdGE6aW1hZ2Uvc3ZnJykgPT09IDA7CiAgICAgICAgICAgIHZhciBTaG91bGRVcGRhdGUgPSAhQ3VycmVudFNyYyB8fCBDdXJyZW50SXNTdmdGYWxsYmFjayB8fCAhTmV3SXNTdmdGYWxsYmFjazsKICAgICAgICAgICAgaWYgKFNob3VsZFVwZGF0ZSkgewogICAgICAgICAgICAgICAgJEltZy5hdHRyKCdzcmMnLCBVcmwpOwogICAgICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBVcGRhdGUgcHJlc2VuY2UKICAgICAgICB2YXIgJFByZXNlbmNlID0gJEF2YXRhci5maW5kKCcuQ29sbGFiUHJlc2VuY2UnKTsKICAgICAgICBpZiAoJFByZXNlbmNlLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoRW1haWwpLnRoZW4oZnVuY3Rpb24gKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICBVcGRhdGVQcmVzZW5jZUluZGljYXRvcigkUHJlc2VuY2UsIFByZXNlbmNlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzIC0gSG92ZXIgQ2FyZAogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBTaG93SG92ZXJDYXJkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IGhvdmVyIGNhcmQgZm9yIGVtYWlsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJEFuY2hvciAtIEVsZW1lbnQgdG8gYW5jaG9yIHRoZSBjYXJkIHRvCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dIb3ZlckNhcmQgPSBmdW5jdGlvbiAoRW1haWwsICRBbmNob3IpIHsKICAgICAgICAvLyBPbmx5IGNoZWNrIGZlYXR1cmUgZW5hYmxlZCAtIEdldFByb2ZpbGUgaGFuZGxlcyBmYWxsYmFjayB3aGVuIG5vdCBsb2dnZWQgaW4KICAgICAgICBpZiAoIUNvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdIb3ZlckNhcmRzJykpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSGlkZSBhbnkgZXhpc3RpbmcgaG92ZXIgY2FyZAogICAgICAgIEhpZGVIb3ZlckNhcmQoKTsKCiAgICAgICAgLy8gQ3JlYXRlIGhvdmVyIGNhcmQKICAgICAgICB2YXIgJENhcmQgPSBDcmVhdGVIb3ZlckNhcmRFbGVtZW50KCk7CiAgICAgICAgJENhcmQuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZC0tbG9hZGluZycpOwoKICAgICAgICAvLyBQb3NpdGlvbiBuZWFyIGFuY2hvcgogICAgICAgIFBvc2l0aW9uSG92ZXJDYXJkKCRDYXJkLCAkQW5jaG9yKTsKCiAgICAgICAgLy8gQWRkIHRvIHBhZ2UKICAgICAgICAkKCdib2R5JykuYXBwZW5kKCRDYXJkKTsKICAgICAgICBBY3RpdmVIb3ZlckNhcmQgPSAkQ2FyZDsKCiAgICAgICAgLy8gU2hvdyB3aXRoIGFuaW1hdGlvbgogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkQ2FyZC5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkLS12aXNpYmxlJyk7CiAgICAgICAgfSwgMTApOwoKICAgICAgICAvLyBXaGV0aGVyIHRoaXMgY2FyZCBiZWxvbmdzIHRvIHRoZSBoZWFkZXIncyBvd24gYXZhdGFyICh0aGUKICAgICAgICAvLyBsb2dnZWQtaW4gYWdlbnQpLCBkZWNpZGVkIHN0cnVjdHVyYWxseSBmcm9tIHRoZSB0cmlnZ2VyCiAgICAgICAgLy8gZWxlbWVudCAtIE5PVCBmcm9tIGZldGNoZWQgcHJvZmlsZS9zZXNzaW9uIGRhdGEuIFRoaXMgaXMgdGhlCiAgICAgICAgLy8gb25seSB3YXkgb3V0IG9mIGEgYnJva2VuIE0zNjUgc2Vzc2lvbiBvbmNlIG91ciBvd24gYmFkZ2UKICAgICAgICAvLyB0YWtlcyBvdmVyIHRoZSBoZWFkZXIncyBhdmF0YXIgc3BvdCwgc28gaXQgbXVzdCBub3QgZGVwZW5kIG9uCiAgICAgICAgLy8gdGhlIHZlcnkgZGF0YSB0aGF0IGEgYnJva2VuIHNlc3Npb24gZmFpbHMgdG8gcHJvdmlkZSAoZXhwaXJlZAogICAgICAgIC8vIHRva2VuLCBHcmFwaCBlcnJvcnMsIEdldEN1cnJlbnRVc2VyKCkvR2V0UHJvZmlsZSgpIG1pc21hdGNoCiAgICAgICAgLy8gb3IgZmFpbHVyZSwgZXRjLikgLSBzZWUgUG9wdWxhdGVIb3ZlckNhcmQgYW5kIHRoZSAuY2F0Y2goKQogICAgICAgIC8vIGJlbG93LCBib3RoIG9mIHdoaWNoIGd1YXJhbnRlZSBQcmVmZXJlbmNlcytMb2dvdXQgcmVuZGVyIGZvcgogICAgICAgIC8vIHRoaXMgY2FyZCBubyBtYXR0ZXIgd2hhdCB0aGUgTTM2NSBzaWRlIGdpdmVzIGJhY2suCiAgICAgICAgdmFyIElzT3duQ2FyZCA9ICRBbmNob3IuY2xvc2VzdCgnLlVzZXJBdmF0YXInKS5sZW5ndGggPiAwOwoKICAgICAgICAvLyBMb2FkIHByb2ZpbGUgZGF0YSAoT09GIGlzIG5vdyBkZXJpdmVkIGZyb20gcHJlc2VuY2UuYWN0aXZpdHkpCiAgICAgICAgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICBDb2xsYWIuR2V0UHJvZmlsZShFbWFpbCksCiAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoRW1haWwpLAogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoRW1haWwpCiAgICAgICAgXSkudGhlbihmdW5jdGlvbiAoUmVzdWx0cykgewogICAgICAgICAgICB2YXIgUHJvZmlsZSA9IFJlc3VsdHNbMF07CiAgICAgICAgICAgIHZhciBBdmF0YXJVcmwgPSBSZXN1bHRzWzFdOwogICAgICAgICAgICB2YXIgUHJlc2VuY2UgPSBSZXN1bHRzWzJdOwoKICAgICAgICAgICAgUG9wdWxhdGVIb3ZlckNhcmQoJENhcmQsIFByb2ZpbGUsIEF2YXRhclVybCwgUHJlc2VuY2UsIElzT3duQ2FyZCk7CiAgICAgICAgICAgICRDYXJkLnJlbW92ZUNsYXNzKCdDb2xsYWJIb3ZlckNhcmQtLWxvYWRpbmcnKTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX2JvZHknKS5odG1sKAogICAgICAgICAgICAgICAgJzxwIHN0eWxlPSJwYWRkaW5nOiAyMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGNvbG9yOiAjOTk5OyI+JyArCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ291bGQgbm90IGxvYWQgcHJvZmlsZScpICsKICAgICAgICAgICAgICAgICc8L3A+JwogICAgICAgICAgICApOwogICAgICAgICAgICAvLyBQcm9maWxlIGxvYWQgZmFpbGVkIGVudGlyZWx5ICh0aGUgYnJva2VuLU0zNjUtbG9naW4gY2FzZQogICAgICAgICAgICAvLyB0aGlzIHdob2xlIGd1YXJhbnRlZSBleGlzdHMgZm9yKSAtIHN0aWxsIGdpdmUgdGhlIGFnZW50IGEKICAgICAgICAgICAgLy8gd2F5IHRvIGZpeCBpdCB2aWEgUHJlZmVyZW5jZXMvTG9nb3V0IGlmIHRoaXMgaXMgdGhlaXIgb3duCiAgICAgICAgICAgIC8vIGNhcmQuCiAgICAgICAgICAgIGlmIChJc093bkNhcmQpIHsKICAgICAgICAgICAgICAgIEFwcGVuZE93bkNhcmRGb290ZXJCdXR0b25zKCRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX2Zvb3RlcicpLmVtcHR5KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDYXJkLnJlbW92ZUNsYXNzKCdDb2xsYWJIb3ZlckNhcmQtLWxvYWRpbmcnKTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBIaWRlSG92ZXJDYXJkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBIaWRlIGFjdGl2ZSBob3ZlciBjYXJkCiAgICAgKi8KICAgIFRhcmdldE5TLkhpZGVIb3ZlckNhcmQgPSBIaWRlSG92ZXJDYXJkOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBIZWFkZXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQG5hbWUgVXBkYXRlSGVhZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBVcGRhdGUgaGVhZGVyIC0gcmVwbGFjZXMgWm51bnkgVXNlckF2YXRhciB3aXRoIEhlYWRlclVzZXJCYWRnZSB3aGVuIGNvbm5lY3RlZAogICAgICovCiAgICBUYXJnZXROUy5VcGRhdGVIZWFkZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyICRVc2VyQXZhdGFyID0gR2V0VXNlckF2YXRhckVsZW1lbnQoKTsKICAgICAgICBpZiAoISRVc2VyQXZhdGFyLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAvLyBUaGUgYmFkZ2UgYW5kIGl0cyBtZW51IGFyZSBidWlsdCBvbmNlLCB1bmNvbmRpdGlvbmFsbHksIGJ5CiAgICAgICAgLy8gSW5pdEhlYWRlcigpIC0gc2VlIHRoYXQgZnVuY3Rpb24ncyBvd24gY29tbWVudCBmb3Igd2h5LiBUaGlzCiAgICAgICAgLy8gb25seSBldmVyIFVQREFURVMgdGhlaXIgZXhpc3RpbmcgY29udGVudCBiYXNlZCBvbiBjb25uZWN0aW9uCiAgICAgICAgLy8gc3RhdGU7IGl0IG11c3QgbmV2ZXIgcmVtb3ZlL3JlY3JlYXRlIHRoZSBiYWRnZSBvciB0b3VjaCB0aGUKICAgICAgICAvLyBuYXRpdmUgPGE+Ly5Db2xsYWJIaWRkZW4gc3RhdGUsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggYnJhbmNoCiAgICAgICAgLy8gYmVsb3cgcnVucyAtIGRvaW5nIHNvIHByZXZpb3VzbHkgdW5kaWQgSW5pdEhlYWRlcigpJ3Mgd29yayBvbgogICAgICAgIC8vIGV2ZXJ5IGNhbGwgd2hlcmUgSXNMb2dnZWRJbigpIHdhcyBmYWxzZSAodGhlIGNvbW1vbiBjYXNlLAogICAgICAgIC8vIHNpbmNlIG1vc3QgYWdlbnRzIGFyZW4ndCBhbHdheXMgbWlkLU0zNjUtc2Vzc2lvbiksIHdoaWNoCiAgICAgICAgLy8gc2lsZW50bHkgcmUtYnJva2UgdGhlIGhlYWRlciBiYWNrIGludG8gdGhlIHN0YXRlIHRoYXQgbWFkZQogICAgICAgIC8vIExvZ291dCB1bnJlYWNoYWJsZSBpbiB0aGUgZmlyc3QgcGxhY2UuCiAgICAgICAgdmFyICRCYWRnZSA9ICRVc2VyQXZhdGFyLmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQnKTsKICAgICAgICBpZiAoISRCYWRnZS5sZW5ndGgpIHJldHVybjsgLy8gSW5pdEhlYWRlcigpIGhhc24ndCBydW4geWV0CgogICAgICAgIGlmIChDb2xsYWIuSXNMb2dnZWRJbigpKSB7CiAgICAgICAgICAgIHZhciBVc2VyID0gQ29sbGFiLkdldEN1cnJlbnRVc2VyKCk7CiAgICAgICAgICAgIGlmICghVXNlcikgcmV0dXJuOyAvLyBzdGFsZS9pbmNvbnNpc3RlbnQgcHJvdmlkZXIgc3RhdGUgLSBsZWF2ZSB0aGUgYmFkZ2UgYXMgaXQgYWxyZWFkeSBpcwoKICAgICAgICAgICAgJFVzZXJBdmF0YXIuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZS0tY29ubmVjdGVkJyk7CgogICAgICAgICAgICBpZiAoSXNIZWFkZXJCYWNrZ3JvdW5kTGlnaHQoKSkgewogICAgICAgICAgICAgICAgJEJhZGdlLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQtLWxpZ2h0SGVhZGVyJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdIb3ZlckNhcmRzJykpIHsKICAgICAgICAgICAgICAgICRCYWRnZS5hZGRDbGFzcygnQ29sbGFiSG92ZXJUcmlnZ2VyJykuYXR0cignZGF0YS1lbWFpbCcsIFVzZXIuZW1haWwpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkQmFkZ2UuZmluZCgnLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2snKS50ZXh0KEdldEluaXRpYWxzKFVzZXIuZW1haWwsIFVzZXIuZGlzcGxheU5hbWUpKTsKICAgICAgICAgICAgJEJhZGdlLmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX25hbWUnKS50ZXh0KFVzZXIuZGlzcGxheU5hbWUgfHwgVXNlci5lbWFpbC5zcGxpdCgnQCcpWzBdKTsKICAgICAgICAgICAgJEJhZGdlLmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlJykudGV4dChVc2VyLmpvYlRpdGxlIHx8ICdDb25uZWN0ZWQnKTsKCiAgICAgICAgICAgIC8vIFVwZGF0ZSBhdmF0YXIgaW1hZ2UgZnJvbSBwcm92aWRlcgogICAgICAgICAgICBDb2xsYWIuR2V0QXZhdGFyKFVzZXIuZW1haWwpLnRoZW4oZnVuY3Rpb24gKEF2YXRhclVybCkgewogICAgICAgICAgICAgICAgdmFyICRBdmF0YXIgPSAkQmFkZ2UuZmluZCgnLkNvbGxhYkF2YXRhcicpOwogICAgICAgICAgICAgICAgaWYgKEF2YXRhclVybCkgewogICAgICAgICAgICAgICAgICAgIHZhciAkSW1nID0gJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19pbWFnZScpOwogICAgICAgICAgICAgICAgICAgIGlmICghJEltZy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEltZyA9ICQoJzxpbWc+JykuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhcl9faW1hZ2UnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEF2YXRhci5wcmVwZW5kKCRJbWcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkSW1nLmF0dHIoJ3NyYycsIEF2YXRhclVybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gVXBkYXRlIHByZXNlbmNlIGluZGljYXRvcgogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoVXNlci5lbWFpbCkudGhlbihmdW5jdGlvbiAoUHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgIHZhciAkUHJlc2VuY2UgPSAkQmFkZ2UuZmluZCgnLkNvbGxhYlByZXNlbmNlJyk7CiAgICAgICAgICAgICAgICB2YXIgUHJlc2VuY2VDbGFzcyA9IEdldFByZXNlbmNlQ2xhc3MoUHJlc2VuY2Uuc3RhdHVzKTsKICAgICAgICAgICAgICAgICRQcmVzZW5jZQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoaSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGMubWF0Y2goL0NvbGxhYlByZXNlbmNlLS1cUysvZykgfHwgW10pLmpvaW4oJyAnKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UgJyArIFByZXNlbmNlQ2xhc3MpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIFVwZGF0ZSBuYW1lIGFuZCBqb2IgdGl0bGUgZnJvbSBwcm9maWxlIChlc3BlY2lhbGx5IGltcG9ydGFudCBmb3IgZmFsbGJhY2sgdXNlcnMpCiAgICAgICAgICAgIENvbGxhYi5HZXRQcm9maWxlKFVzZXIuZW1haWwpLnRoZW4oZnVuY3Rpb24gKFByb2ZpbGUpIHsKICAgICAgICAgICAgICAgIGlmIChQcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGRpc3BsYXlOYW1lIGlmIHByb2ZpbGUgaGFzIGJldHRlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgaWYgKFByb2ZpbGUuZGlzcGxheU5hbWUgJiYgUHJvZmlsZS5kaXNwbGF5TmFtZSAhPT0gVXNlci5lbWFpbCkgewogICAgICAgICAgICAgICAgICAgICAgICAkQmFkZ2UuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9fbmFtZScpLnRleHQoUHJvZmlsZS5kaXNwbGF5TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBpbml0aWFscyB0b28KICAgICAgICAgICAgICAgICAgICAgICAgJEJhZGdlLmZpbmQoJy5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykudGV4dChHZXRJbml0aWFscyhVc2VyLmVtYWlsLCBQcm9maWxlLmRpc3BsYXlOYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChQcm9maWxlLmpvYlRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRCYWRnZS5maW5kKCcuQ29sbGFiVXNlckJhZGdlX190aXRsZScpLnRleHQoUHJvZmlsZS5qb2JUaXRsZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gTm90IGNvbm5lY3RlZCAoeWV0LCBvciBsb2dnZWQgb3V0IG9mIHRoZSBwcm92aWRlcikgLSB0aGUKICAgICAgICAgICAgLy8gYmFkZ2Ugc3RheXMgaW4gcGxhY2UgKGl0J3Mgb3VyIHBlcm1hbmVudCByZXBsYWNlbWVudCBmb3IKICAgICAgICAgICAgLy8gdGhlIG5hdGl2ZSBhdmF0YXIsIG5vdCBhIGNvbm5lY3Rpb24gaW5kaWNhdG9yIG9uIGl0cyBvd24pLAogICAgICAgICAgICAvLyBqdXN0IHdpdGhvdXQgcHJvdmlkZXItc291cmNlZCBlbnJpY2htZW50LiBJdHMgZmFsbGJhY2sKICAgICAgICAgICAgLy8gY29udGVudCAobmF0aXZlIGluaXRpYWxzL25hbWUsIHNldCBvbmNlIGluIEluaXRIZWFkZXIpIGlzCiAgICAgICAgICAgIC8vIGxlZnQgYXMtaXMgLSBub3RoaW5nIHRvIHJlc2V0IGhlcmUuCiAgICAgICAgICAgICRVc2VyQXZhdGFyLnJlbW92ZUNsYXNzKCdDb2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZCcpOwoKICAgICAgICAgICAgLy8gVW5kbyB0aGUgQ29sbGFiSG92ZXJUcmlnZ2VyL2RhdGEtZW1haWwgbWFya2luZyBmcm9tIHRoZQogICAgICAgICAgICAvLyBjb25uZWN0ZWQgYnJhbmNoIGFib3ZlIC0gd2l0aG91dCB0aGlzLCBob3ZlcmluZyB5b3VyIG93bgogICAgICAgICAgICAvLyBhdmF0YXIgYWZ0ZXIgbG9nZ2luZyBvdXQgd291bGQgc3RpbGwgdHJ5IHRvIG9wZW4gYSBob3ZlcgogICAgICAgICAgICAvLyBjYXJkIChmb3IgYSBub3ctc3RhbGUgZW1haWwpLCBldmVuIHRob3VnaCB0aGVyZSdzIG5vCiAgICAgICAgICAgIC8vIGFjdGl2ZSBzZXNzaW9uIHRvIHNvdXJjZSBpdHMgZGF0YSBmcm9tLiBObyBob3ZlciBjYXJkIGZvcgogICAgICAgICAgICAvLyB5b3VyIG93biBhdmF0YXIgdW50aWwgY29ubmVjdGVkIGFnYWluIC0gYnkgZGVzaWduLgogICAgICAgICAgICAkQmFkZ2UucmVtb3ZlQ2xhc3MoJ0NvbGxhYkhvdmVyVHJpZ2dlcicpLnJlbW92ZUF0dHIoJ2RhdGEtZW1haWwnKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgQ1NTIGNsYXNzIGZvciBwcmVzZW5jZSBzdGF0dXMKICAgICAqLwogICAgZnVuY3Rpb24gR2V0UHJlc2VuY2VDbGFzcyhTdGF0dXMpIHsKICAgICAgICB2YXIgU3RhdHVzTG93ZXIgPSAoU3RhdHVzIHx8ICd1bmtub3duJykudG9Mb3dlckNhc2UoKTsKICAgICAgICB2YXIgTWFwID0gewogICAgICAgICAgICAnYXZhaWxhYmxlJzogJ0NvbGxhYlByZXNlbmNlLS1hdmFpbGFibGUnLAogICAgICAgICAgICAnYnVzeSc6ICdDb2xsYWJQcmVzZW5jZS0tYnVzeScsCiAgICAgICAgICAgICdkbmQnOiAnQ29sbGFiUHJlc2VuY2UtLWRuZCcsCiAgICAgICAgICAgICdkb25vdGRpc3R1cmInOiAnQ29sbGFiUHJlc2VuY2UtLWRuZCcsCiAgICAgICAgICAgICdhd2F5JzogJ0NvbGxhYlByZXNlbmNlLS1hd2F5JywKICAgICAgICAgICAgJ2JlcmlnaHRiYWNrJzogJ0NvbGxhYlByZXNlbmNlLS1iZXJpZ2h0YmFjaycsCiAgICAgICAgICAgICdvZmZsaW5lJzogJ0NvbGxhYlByZXNlbmNlLS1vZmZsaW5lJywKICAgICAgICAgICAgJ3Vua25vd24nOiAnQ29sbGFiUHJlc2VuY2UtLXVua25vd24nCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gTWFwW1N0YXR1c0xvd2VyXSB8fCAnQ29sbGFiUHJlc2VuY2UtLXVua25vd24nOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHVibGljIE1ldGhvZHMgLSBDdXN0b21lciBJbmZvIFdpZGdldAogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBJbml0Q3VzdG9tZXJJbmZvV2lkZ2V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIHRoZSBjdXN0b21lciBpbmZvcm1hdGlvbiB3aWRnZXQgaW4gdGlja2V0IHpvb20KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEN1c3RvbWVySW5mb1dpZGdldCA9IEluaXRDdXN0b21lckluZm9XaWRnZXQ7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMgLSBIZWFkZXIgKEludGVncmF0aW9uIHdpdGggWm51bnkgVXNlckF2YXRhcikKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGaW5kIFpudW55J3MgaGVhZGVyIHVzZXItYXZhdGFyIDxsaT4uIFNlbGVjdGVkIGJ5IGNsYXNzLAogICAgICogbm90ICNVc2VyQXZhdGFyLCBiZWNhdXNlIFpudW55IDYuNS54IExUUyByZW5kZXJzIDxsaSBjbGFzcz0iVXNlckF2YXRhciI+CiAgICAgKiB3aXRoIG5vIGlkIGF0dHJpYnV0ZSBhdCBhbGwgLSB0aGUgaWQgd2FzIGFkZGVkIGxhdGVyIChwcmVzZW50IGJ5IDcuMi54KS4KICAgICAqIFRoZSBjbGFzcyBpcyBwcmVzZW50IG9uIGV2ZXJ5IFpudW55IGxpbmUgc2VlbiBzbyBmYXIgKDYuNS54LTcuMy54KS4KICAgICAqIEByZXR1cm5zIHtqUXVlcnl9IFRoZSBVc2VyQXZhdGFyIGVsZW1lbnQsIG9yIGFuIGVtcHR5IGpRdWVyeSBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldFVzZXJBdmF0YXJFbGVtZW50KCkgewogICAgICAgIHJldHVybiAkKCcuVXNlckF2YXRhcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGaW5kIHRoZSBVc2VyQXZhdGFyIGRyb3Bkb3duIHN1Ym1lbnUgd2l0aGluICRVc2VyQXZhdGFyLgogICAgICogWm51bnkgNy4yLngrIHdyYXBzIGl0IGluIDxkaXYgY2xhc3M9IlVzZXJBdmF0YXJfc3VibWVudSI+OyBabnVueSA2LjUueAogICAgICogTFRTIHVzZXMgYSBwbGFpbiwgdW5jbGFzc2VkIDxkaXY+IGluIHRoZSBzYW1lIHBvc2l0aW9uLiBGYWxsIGJhY2sgdG8KICAgICAqIHRoYXQgcG9zaXRpb25hbCBtYXRjaCBzbyB0aGUgaGVhZGVyIGludGVncmF0aW9uIHN0aWxsIHdvcmtzIHRoZXJlLgogICAgICogQHBhcmFtIHtqUXVlcnl9ICRVc2VyQXZhdGFyIC0gVGhlIFVzZXJBdmF0YXIgZWxlbWVudC4KICAgICAqIEByZXR1cm5zIHtqUXVlcnl9IFRoZSBzdWJtZW51IGVsZW1lbnQsIG9yIGFuIGVtcHR5IGpRdWVyeSBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldFVzZXJBdmF0YXJTdWJtZW51KCRVc2VyQXZhdGFyKSB7CiAgICAgICAgdmFyICRTdWJtZW51ID0gJFVzZXJBdmF0YXIuZmluZCgnLlVzZXJBdmF0YXJfc3VibWVudScpOwogICAgICAgIGlmICghJFN1Ym1lbnUubGVuZ3RoKSB7CiAgICAgICAgICAgICRTdWJtZW51ID0gJFVzZXJBdmF0YXIuY2hpbGRyZW4oJ2RpdicpLmZpcnN0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkU3VibWVudTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB0aGUgaGVhZGVyJ3Mgb3duIGJhY2tncm91bmQgaXMgbGlnaHQgZW5vdWdoIHRoYXQKICAgICAqIGRhcmsgdGV4dCBpcyBuZWVkZWQgb24gaXQsIGluc3RlYWQgb2YgdGhlIGxpZ2h0IHRleHQgYSBkYXJrIGhlYWRlcgogICAgICogbmVlZHMuIFpudW55IDYuNS54IExUUydzIGhlYWRlciBpcyBkYXJrIChubyAtLW1lbnUtYmcgY3VzdG9tIHByb3BlcnR5CiAgICAgKiBhdCBhbGwgLSB0cmVhdGVkIGFzIGRhcmssIG1hdGNoaW5nIGl0cyBhY3R1YWwgY29sb3IpOyA3LjAueC03LjIueCdzCiAgICAgKiByZWRlc2lnbmVkIGhlYWRlciBpcyB3aGl0ZSAoLS1tZW51LWJnOiAjZmZmZmZmKS4gUmVhZGluZyB0aGUgdGhlbWUncwogICAgICogb3duIHZhcmlhYmxlIGF0IHJ1bnRpbWUgbWVhbnMgdGhpcyBrZWVwcyB3b3JraW5nIGNvcnJlY3RseSB3aGljaGV2ZXIKICAgICAqIHdheSBhIGZ1dHVyZSByZWRlc2lnbiBvciBjdXN0b20gc2tpbiBnb2VzLCByYXRoZXIgdGhhbiBoYXJkY29kaW5nIGFuCiAgICAgKiBhc3N1bXB0aW9uIHRoYXQgd2FzIG9ubHkgZXZlciB0cnVlIGZvciB0aGUgbGluZSBpdCB3YXMgd3JpdHRlbiBvbi4KICAgICAqIEByZXR1cm5zIHtib29sZWFufQogICAgICovCiAgICBmdW5jdGlvbiBJc0hlYWRlckJhY2tncm91bmRMaWdodCgpIHsKICAgICAgICB2YXIgTWVudUJnID0gZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJy0tbWVudS1iZycpLnRyaW0oKTsKICAgICAgICBpZiAoIU1lbnVCZykgcmV0dXJuIGZhbHNlOyAvLyBubyB2YXJpYWJsZSBhdCBhbGw6IDYuNS54IExUUydzIGFjdHVhbCBkYXJrIGhlYWRlcgogICAgICAgIHZhciBNYXRjaCA9IE1lbnVCZy5tYXRjaCgvXiM/KFswLTlhLWZdezJ9KShbMC05YS1mXXsyfSkoWzAtOWEtZl17Mn0pJC9pKTsKICAgICAgICBpZiAoIU1hdGNoKSByZXR1cm4gZmFsc2U7IC8vIG5vdCBhIGhleCBjb2xvciAocmdiKCkvbmFtZWQvZXRjLikgLSBub3Qgc2VlbiBpbiBwcmFjdGljZSwgYXNzdW1lIGRhcmsKICAgICAgICB2YXIgUiA9IHBhcnNlSW50KE1hdGNoWzFdLCAxNiksIEcgPSBwYXJzZUludChNYXRjaFsyXSwgMTYpLCBCID0gcGFyc2VJbnQoTWF0Y2hbM10sIDE2KTsKICAgICAgICAvLyBTdGFuZGFyZCByZWxhdGl2ZSBsdW1pbmFuY2Ugd2VpZ2h0aW5nIChJVFUtUiBCVC42MDEpLgogICAgICAgIHJldHVybiAoMC4yOTkgKiBSICsgMC41ODcgKiBHICsgMC4xMTQgKiBCKSA+IDE4NjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gWm51bnkncyBuYXRpdmUgdG9wLXJpZ2h0IG5vdGlmaWNhdGlvbiB0cmF5CiAgICAgKiAoLm1vZC5tb2ROb3RpZmljYXRpb24gPiAuaW5uZXIsIHNlZSBNb2R1bGUuTm90aWZpY2F0aW9uLmNzcykgaXMKICAgICAqIGZpeGVkIGF0IGB0b3A6IDkwcHhgIC0gYSB2YWx1ZSBiYWtlZCBpbnRvIFpudW55J3Mgb3duIENTUywKICAgICAqIGFwcGFyZW50bHkgYXNzdW1pbmcgYSBzaW5nbGUtcm93IGhlYWRlci9uYXYuIEV4dHJhIHRvcC1sZXZlbCBuYXYKICAgICAqIGVudHJpZXMgKGZyb20gYW55IGFkZC1vbiwgZS5nLiBDaGVja2xpc3RzKSBjYW4gcHVzaCAjTmF2aWdhdGlvbiB0bwogICAgICogd3JhcCBvbnRvIGEgc2Vjb25kIHJvdywgZ3Jvd2luZyAjSGVhZGVyIHdlbGwgcGFzdCB0aGF0IGFzc3VtZWQKICAgICAqIGhlaWdodCAtIGJvdGggbmF0aXZlIG5vdGlmaWNhdGlvbnMgKGxpa2UgIkRhZW1vbiBpcyBub3QgcnVubmluZyIpCiAgICAgKiBhbmQgb3VyIG93biAoU2hvd01lc3NhZ2VCb3ggaW4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLmpzKSB0aGVuCiAgICAgKiByZW5kZXIgcGFydGx5IGhpZGRlbiB1bmRlci9iZWhpbmQgdGhlIGhlYWRlciBpbnN0ZWFkIG9mIGNsZWFyaW5nCiAgICAgKiBpdC4gT3ZlcnJpZGluZyB0aGUgdHJheSdzIGlubGluZSB0b3Agb2Zmc2V0IHRvIHRyYWNrIHRoZSBoZWFkZXIncwogICAgICogUkVBTCByZW5kZXJlZCBoZWlnaHQgZml4ZXMgYm90aCwgd2l0aG91dCBuZWVkaW5nIHRvIGtub3cgd2h5IHRoZQogICAgICogaGVhZGVyIGdyZXcgLSBjb3ZlcnMgQ29sbGFib3JhdGlvbidzIG93biBtZXNzYWdlcyBlaXRoZXIgd2F5LCBhbmQKICAgICAqIGhhcHBlbnMgdG8gYWxzbyBmaXggbmF0aXZlIG9uZXMgYXMgYSBzaWRlIGVmZmVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gRml4Tm90aWZpY2F0aW9uVHJheVBvc2l0aW9uKCkgewogICAgICAgIHZhciAkSGVhZGVyID0gJCgnI0hlYWRlcicpOwogICAgICAgIHZhciAkVHJheUlubmVyID0gJCgnLm1vZC5tb2ROb3RpZmljYXRpb24gPiAuaW5uZXInKTsKICAgICAgICBpZiAoISRIZWFkZXIubGVuZ3RoIHx8ICEkVHJheUlubmVyLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICB2YXIgTmF0aXZlQXNzdW1lZFRvcCA9IDkwOyAvLyBNb2R1bGUuTm90aWZpY2F0aW9uLmNzcydzIG93biBmaXhlZCB2YWx1ZQogICAgICAgIHZhciBHYXAgPSAxNjsgLy8gcm91Z2hseSBtYXRjaGVzIG5hdGl2ZSdzIG93biB2aXN1YWwgYnJlYXRoaW5nIHJvb20KICAgICAgICB2YXIgUmVxdWlyZWRUb3AgPSAkSGVhZGVyLm91dGVySGVpZ2h0KCkgKyBHYXA7CgogICAgICAgIGlmIChSZXF1aXJlZFRvcCA+IE5hdGl2ZUFzc3VtZWRUb3ApIHsKICAgICAgICAgICAgJFRyYXlJbm5lci5jc3MoJ3RvcCcsIFJlcXVpcmVkVG9wICsgJ3B4Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSGVhZGVyIGlzIGJhY2sgdG8gKG9yIG5ldmVyIGxlZnQpIGl0cyBub3JtYWwgaGVpZ2h0IC0gbGV0CiAgICAgICAgICAgIC8vIG5hdGl2ZSBDU1MncyBvd24gOTBweCBhcHBseSBhZ2FpbiByYXRoZXIgdGhhbiBwaW4gYSBzdGFsZQogICAgICAgICAgICAvLyBpbmxpbmUgdmFsdWUuCiAgICAgICAgICAgICRUcmF5SW5uZXIuY3NzKCd0b3AnLCAnJyk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIEluaXRIZWFkZXIoKSB7CiAgICAgICAgLy8gRmluZCBabnVueSdzIGV4aXN0aW5nIFVzZXJBdmF0YXIgZWxlbWVudAogICAgICAgIHZhciAkVXNlckF2YXRhciA9IEdldFVzZXJBdmF0YXJFbGVtZW50KCk7CiAgICAgICAgaWYgKCEkVXNlckF2YXRhci5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBpbml0aWFsaXplZAogICAgICAgIGlmICgkVXNlckF2YXRhci5oYXNDbGFzcygnQ29sbGFiVXNlckJhZGdlLS1pbml0aWFsaXplZCcpKSByZXR1cm47CiAgICAgICAgJFVzZXJBdmF0YXIuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZS0taW5pdGlhbGl6ZWQnKTsKCiAgICAgICAgdmFyICROYXRpdmVMaW5rID0gJFVzZXJBdmF0YXIuZmluZCgnPiBhJykuZmlyc3QoKTsKICAgICAgICB2YXIgJE5hdGl2ZVN1Ym1lbnUgPSBHZXRVc2VyQXZhdGFyU3VibWVudSgkVXNlckF2YXRhcik7CgogICAgICAgIC8vIFJldXNlIHdoYXRldmVyIFpudW55IGFscmVhZHkgcmVuZGVyZWQgYXMgdGhlIGluaXRpYWwsIHByZS1Db2xsYWIKICAgICAgICAvLyBkaXNwbGF5IChpbml0aWFscykgLSBhY2N1cmF0ZSBpbW1lZGlhdGVseSwgbm8gbmVlZCB0byB3YWl0IGZvcgogICAgICAgIC8vIGEgcHJvdmlkZXIgcm91bmQtdHJpcCBqdXN0IHRvIHNob3cgKnNvbWV0aGluZyogdXNlZnVsLgogICAgICAgIHZhciBOYXRpdmVJbml0aWFscyA9ICROYXRpdmVMaW5rLmZpbmQoJy5Jbml0aWFscycpLnRleHQoKS50cmltKCk7CgogICAgICAgIC8vIFJlcGxhY2UgdGhlIG5hdGl2ZSBhdmF0YXIgbGluaydzIENPTlRFTlQgd2l0aCBvdXIgb3duIGJhZGdlIC0KICAgICAgICAvLyBidXQgZGVsaWJlcmF0ZWx5IGtlZXAgdGhlIDxhPiBFTEVNRU5UIElUU0VMRiwgYW5kIGxlYXZlIFpudW55J3MKICAgICAgICAvLyBuYXRpdmUgZHJvcGRvd24gKFByZWZlcmVuY2VzL0xvZ291dCkgY29tcGxldGVseSB1bnRvdWNoZWQgYW5kCiAgICAgICAgLy8gZnVsbHkgZnVuY3Rpb25hbC4gQW4gZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgZml4IGluc3RlYWQgaGlkCiAgICAgICAgLy8gdGhhdCBuYXRpdmUgPGE+IGFuZCByZXBsYWNlZCBpdCB3aXRoIGEgbmV3IHNpYmxpbmcgZWxlbWVudCAtCiAgICAgICAgLy8gWm51bnkgNy4zLngncyBvd24gY2xpY2stdG8tcmV2ZWFsIGhhbmRsZXIgaXMgYm91bmQgb25jZSwgYXQKICAgICAgICAvLyBwYWdlIGxvYWQsIHRvIHRoYXQgc3BlY2lmaWMgPGE+IG5vZGUgKHNlZSBDb3JlLkFnZW50LmpzJ3MKICAgICAgICAvLyBJbml0QXZhdGFyRmx5b3V0KCkpLCBwYWlyZWQgd2l0aCBhIENTUyBydWxlIHRoYXQgb25seSByZXZlYWxzCiAgICAgICAgLy8gdGhlIGRyb3Bkb3duIGZvciBgYS5BY3RpdmUgKyBkaXYuVXNlckF2YXRhcl9zdWJtZW51YCAtIGhpZGluZwogICAgICAgIC8vIHRoYXQgZXhhY3Qgbm9kZSBsZWZ0IG5vIHdheSB0byBldmVyIHRyaWdnZXIgdGhlIGRyb3Bkb3duIGFnYWluLAogICAgICAgIC8vIHNvIFByZWZlcmVuY2VzL0xvZ291dCBiZWNhbWUgcGVybWFuZW50bHkgdW5yZWFjaGFibGUgb25jZQogICAgICAgIC8vIGNvbm5lY3RlZC4gS2VlcGluZyB0aGUgc2FtZSBub2RlIChhbmQgdGhlcmVmb3JlIGl0cyBuYXRpdmUKICAgICAgICAvLyBoYW5kbGVyKSBhbmQgb25seSBzd2FwcGluZyB3aGF0J3MgcmVuZGVyZWQgaW5zaWRlIGl0IGF2b2lkcwogICAgICAgIC8vIHRoYXQgZnJhZ2lsaXR5IGVudGlyZWx5LCBhbmQgbWVhbnMgdGhlIG5hdGl2ZSBkcm9wZG93biBuZXZlcgogICAgICAgIC8vIG5lZWRzIHRvIGJlIHRvdWNoZWQsIGhpZGRlbiwgb3IgcmVpbXBsZW1lbnRlZCBhdCBhbGwuCiAgICAgICAgdmFyICRCYWRnZSA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQnKTsKICAgICAgICBpZiAoSXNIZWFkZXJCYWNrZ3JvdW5kTGlnaHQoKSkgewogICAgICAgICAgICAkQmFkZ2UuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZV9fY29udGVudC0tbGlnaHRIZWFkZXInKTsKICAgICAgICB9CgogICAgICAgIHZhciAkQXZhdGFyV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2F2YXRhcicpOwogICAgICAgIHZhciAkQXZhdGFyID0gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhciBDb2xsYWJBdmF0YXItLWxhcmdlJyk7CiAgICAgICAgdmFyICRGYWxsYmFjayA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykudGV4dChOYXRpdmVJbml0aWFscyB8fCAnPycpOwogICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UgQ29sbGFiUHJlc2VuY2UtLXVua25vd24nKTsKICAgICAgICAkQXZhdGFyLmFwcGVuZCgkRmFsbGJhY2ssICRQcmVzZW5jZSk7CiAgICAgICAgJEF2YXRhcldyYXAuYXBwZW5kKCRBdmF0YXIpOwoKICAgICAgICB2YXIgJEluZm8gPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiVXNlckJhZGdlX19pbmZvJyk7CiAgICAgICAgdmFyICROYW1lID0gJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZV9fbmFtZScpLnRleHQoJycpOwogICAgICAgIHZhciAkVGl0bGUgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiVXNlckJhZGdlX190aXRsZScpLnRleHQoJycpOwogICAgICAgICRJbmZvLmFwcGVuZCgkTmFtZSwgJFRpdGxlKTsKCiAgICAgICAgJEJhZGdlLmFwcGVuZCgkQXZhdGFyV3JhcCwgJEluZm8pOwogICAgICAgICROYXRpdmVMaW5rLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2UtLXJlcGxhY2VkJykuZW1wdHkoKS5hcHBlbmQoJEJhZGdlKTsKCiAgICAgICAgLy8gQWxzbyBlbmQgdGhlIENvbGxhYm9yYXRpb24gcHJvdmlkZXIgc2Vzc2lvbiAoTTM2NSBzaWduLW91dCkKICAgICAgICAvLyB3aGVuIHRoZSBhZ2VudCBsb2dzIG91dCBvZiBabnVueSB2aWEgdGhlIG5hdGl2ZSBMb2dvdXQgbGluayAtCiAgICAgICAgLy8gcmVxdWlyZWQgc28gYW4gYWdlbnQgbG9nZ2luZyBvdXQgb2YgWm51bnkgZG9lc24ndCBsZWF2ZSBhCiAgICAgICAgLy8gc3RhbGUsIHNpbGVudGx5LXN0aWxsLXNpZ25lZC1pbiBNaWNyb3NvZnQgc2Vzc2lvbiBiZWhpbmQKICAgICAgICAvLyAocmVsZXZhbnQgb24gc2hhcmVkL2tpb3NrLXN0eWxlIGFnZW50IHdvcmtzdGF0aW9ucyBpbgogICAgICAgIC8vIHBhcnRpY3VsYXIpLiBNU0FMJ3MgbG9nb3V0UG9wdXAoKSAoc2VlIHRoZSBNMzY1IHByb3ZpZGVyKSBvcGVucwogICAgICAgIC8vIGl0cyBvd24gcG9wdXAgcmF0aGVyIHRoYW4gbmF2aWdhdGluZyB0aGlzIHdpbmRvdywgc28gZmlyaW5nIGl0CiAgICAgICAgLy8gYWxvbmdzaWRlIGxldHRpbmcgdGhlIG5hdGl2ZSBsaW5rJ3Mgb3duIG5hdmlnYXRpb24gcHJvY2VlZCBpcwogICAgICAgIC8vIHNhZmUgLSBzYW1lIGZpcmUtYW5kLWZvcmdldCBwYXR0ZXJuIGFscmVhZHkgdXNlZCBieSB0aGUKICAgICAgICAvLyBob3Zlci1jYXJkJ3Mgb3duIGxvZ291dCBidXR0b24gZWxzZXdoZXJlIGluIHRoaXMgZmlsZS4gTm90CiAgICAgICAgLy8gcHJldmVudGluZyBkZWZhdWx0OiB0aGUgbmF0aXZlIGxpbmsncyBocmVmICh3aXRoIGl0cyBvd24gbGl2ZQogICAgICAgIC8vIENoYWxsZW5nZVRva2VuKSBtdXN0IGRvIHRoZSBhY3R1YWwgWm51bnkgbG9nb3V0LCB1bm1vZGlmaWVkLgogICAgICAgICROYXRpdmVTdWJtZW51LmZpbmQoJy5Mb2dvdXRCdXR0b24sICNMb2dvdXRCdXR0b24nKS5vbignY2xpY2suY29sbGFiTG9nb3V0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb2xsYWIuTG9nb3V0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFdoaWxlIGNvbm5lY3RlZCwgU2V0dGluZ3MvTG9nb3V0IGxpdmUgaW4gdGhlIGhvdmVyIGNhcmQgaW5zdGVhZAogICAgICAgIC8vIChzZWUgVXBkYXRlSGVhZGVyKCkvQXBwZW5kT3duQ2FyZEZvb3RlckJ1dHRvbnMpIGFuZCB0aGUgbmF0aXZlCiAgICAgICAgLy8gZHJvcGRvd24gaXMgaGlkZGVuIHZpYSBDU1MgKC5Db2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZCwgc2VlCiAgICAgICAgLy8gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLmNzcykgLSBidXQgdGhhdCBDU1Mgb3ZlcnJpZGUgb25seSBoaWRlcwogICAgICAgIC8vIHRoZSBuYXRpdmUgaGFuZGxlcidzIG93biBSRVNVTFQsIGFuZCB3YXMgZm91bmQgdG8gYmUgcmFjeTogdGhlCiAgICAgICAgLy8gbmF0aXZlIGhhbmRsZXIgZG9lc24ndCBqdXN0IHRvZ2dsZSBhIGNsYXNzLCBpdCBhbHNvIGNhbGxzCiAgICAgICAgLy8galF1ZXJ5J3MgLmZhZGVUb2dnbGUoJ2Zhc3QnKSBvbiB0aGUgc3VibWVudSwgYW4gYW5pbWF0aW9uIHRoYXQKICAgICAgICAvLyBkcml2ZXMgaXRzIE9XTiBpbmxpbmUgZGlzcGxheS9vcGFjaXR5IG92ZXIgfjIwMG1zIC0gY2xpY2tpbmcKICAgICAgICAvLyBjZXJ0YWluIGFyZWFzIG9mIHRoZSB3aWRlIGJhZGdlIChlLmcuIHRoZSBhdmF0YXIgaW1hZ2UpIGNvdWxkCiAgICAgICAgLy8gb2NjYXNpb25hbGx5IHN0aWxsIGNhdGNoIGl0IG1pZC1hbmltYXRpb24gYW5kIHNob3cgdGhyb3VnaAogICAgICAgIC8vIGJlZm9yZSB0aGUgbmV4dCBjbGljayBjeWNsZS4gSW50ZXJjZXB0aW5nIHRoZSBjbGljayBoZXJlLCBpbgogICAgICAgIC8vIHRoZSBDQVBUVVJFIHBoYXNlIG9uIHRoZSA8bGk+IChiZWZvcmUgdGhlIG5hdGl2ZSBoYW5kbGVyIC0gYm91bmQKICAgICAgICAvLyB0byB0aGUgPGE+IGl0c2VsZiBpbiB0aGUgYnViYmxlIHBoYXNlIC0gZXZlciBydW5zIGF0IGFsbCksIHN0b3BzCiAgICAgICAgLy8gdGhlIG5hdGl2ZSB0b2dnbGUvZmFkZVRvZ2dsZSBmcm9tIGV2ZXIgc3RhcnRpbmcgd2hpbGUgY29ubmVjdGVkLAogICAgICAgIC8vIGluc3RlYWQgb2YgcmFjaW5nIGl0cyB2aXN1YWwgcmVzdWx0IGFmdGVyd2FyZC4gU3RpbGwgZG9lc24ndAogICAgICAgIC8vIHRvdWNoIHRoZSBuYXRpdmUgYmluZGluZyBpdHNlbGYgLSB0aGlzIGlzIGEgc2VwYXJhdGUsIGFkZGl0aXZlCiAgICAgICAgLy8gbGlzdGVuZXIgLSBhbmQgaXQgcmVhZHMgdGhlIGxpdmUgY29ubmVjdGlvbiBzdGF0ZSBvbiBldmVyeQogICAgICAgIC8vIGNsaWNrLCBzbyBpdCBuZWVkcyBubyBleHRyYSB3aXJpbmcgb24gbG9naW4vbG9nb3V0LgogICAgICAgICRVc2VyQXZhdGFyWzBdLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIGlmICgkVXNlckF2YXRhci5oYXNDbGFzcygnQ29sbGFiVXNlckJhZGdlLS1jb25uZWN0ZWQnKSkgewogICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LCB0cnVlKTsKCiAgICAgICAgLy8gQ2xvc2UgZHJvcGRvd24gd2hlbiBjbGlja2luZyBlbHNld2hlcmUgKGZvciBabnVueSBkcm9wZG93biB3aGVuIG5vdCBjb25uZWN0ZWQpCiAgICAgICAgLy8gVXNlIG5hbWVzcGFjZSB0byBwcmV2ZW50IGR1cGxpY2F0ZSBoYW5kbGVycwogICAgICAgICQoZG9jdW1lbnQpLm9mZignY2xpY2suY29sbGFiSGVhZGVyJykub24oJ2NsaWNrLmNvbGxhYkhlYWRlcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBpZiAoISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuVXNlckF2YXRhcicpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgR2V0VXNlckF2YXRhclN1Ym1lbnUoJFVzZXJBdmF0YXIpLnJlbW92ZUNsYXNzKCdzaG93Jyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQWRkIGxvZ2luIG1lbnUgaXRlbSB0byBVc2VyQXZhdGFyX3N1Ym1lbnUgKGZvciBwcm92aWRlcnMgd2l0aCBsb2dpbiBjYXBhYmlsaXR5KQogICAgICAgIHZhciBMb2dpbkluZm8gPSBDb2xsYWIuR2V0TG9naW5JbmZvKCk7CiAgICAgICAgaWYgKExvZ2luSW5mbyAmJiBMb2dpbkluZm8ucmVxdWlyZXNFeHBsaWNpdExvZ2luKSB7CiAgICAgICAgICAgIEFkZExvZ2luTWVudUl0ZW0oJFVzZXJBdmF0YXIsIExvZ2luSW5mbyk7CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgaGVhZGVyIHN0YXRlIC0gdGhpcyB3aWxsIGVucmljaCB0aGUgYmFkZ2Ugd2l0aCByZWFsCiAgICAgICAgLy8gcHJvdmlkZXIgZGF0YSBpZiBhbHJlYWR5IGNvbm5lY3RlZC4KICAgICAgICBUYXJnZXROUy5VcGRhdGVIZWFkZXIoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGxvZ2luIG1lbnUgaXRlbSB0byBVc2VyQXZhdGFyIGRyb3Bkb3duCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJFVzZXJBdmF0YXIgLSBUaGUgVXNlckF2YXRhciBlbGVtZW50CiAgICAgKiBAcGFyYW0ge09iamVjdH0gTG9naW5JbmZvIC0gTG9naW4gaW5mbyBmcm9tIHByb3ZpZGVyIHtsYWJlbCwgaWNvbiwgcmVxdWlyZXNFeHBsaWNpdExvZ2lufQogICAgICovCiAgICBmdW5jdGlvbiBBZGRMb2dpbk1lbnVJdGVtKCRVc2VyQXZhdGFyLCBMb2dpbkluZm8pIHsKICAgICAgICAvLyBGaW5kIHRoZSBzdWJtZW51IC0gWm51bnkgdXNlcyBzcGFuIHdpdGggbGlua3MsIG5vdCB1bC9saQogICAgICAgIHZhciAkU3VibWVudSA9IEdldFVzZXJBdmF0YXJTdWJtZW51KCRVc2VyQXZhdGFyKTsKICAgICAgICBpZiAoISRTdWJtZW51Lmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBtZW51IGl0ZW0gYWxyZWFkeSBleGlzdHMKICAgICAgICBpZiAoJFN1Ym1lbnUuZmluZCgnI0NvbGxhYlByb3ZpZGVyTG9naW4nKS5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgLy8gVXNlIGxvZ2luIGluZm8gZnJvbSBwcm92aWRlciAobm8gaGFyZGNvZGVkIHByb3ZpZGVyIGtub3dsZWRnZSkKICAgICAgICB2YXIgTGFiZWwgPSBMb2dpbkluZm8ubGFiZWwgfHwgJ1Byb3ZpZGVyJzsKICAgICAgICB2YXIgSWNvbiA9IExvZ2luSW5mby5pY29uIHx8ICdmYS1wbHVnJzsKCiAgICAgICAgLy8gU0VDVVJJVFkgKFM2KTogVmFsaWRhdGUgaWNvbiBjbGFzcyB0byBwcmV2ZW50IFhTUwogICAgICAgIC8vIE9ubHkgYWxsb3cgdmFsaWQgRm9udCBBd2Vzb21lIGljb24gY2xhc3MgbmFtZXMgKGZhLSopCiAgICAgICAgdmFyIFZhbGlkSWNvblBhdHRlcm4gPSAvXmZhLVthLXowLTktXSskLzsKICAgICAgICBpZiAoIVZhbGlkSWNvblBhdHRlcm4udGVzdChJY29uKSkgewogICAgICAgICAgICBJY29uID0gJ2ZhLXBsdWcnOyAgLy8gU2FmZSBkZWZhdWx0CiAgICAgICAgfQoKICAgICAgICAvLyBDcmVhdGUgYSBsYWJlbCBmb3IgdGhlIHByb3ZpZGVyIHNlY3Rpb24KICAgICAgICB2YXIgJExhYmVsID0gJCgnPGxhYmVsPicpLnRleHQoTGFiZWwpLmFkZENsYXNzKCdDb2xsYWJQcm92aWRlckxhYmVsJyk7CgogICAgICAgIC8vIENyZWF0ZSBsb2dpbiBsaW5rCiAgICAgICAgdmFyICRMb2dpbkxpbmsgPSAkKCc8YSBocmVmPSIjIiBpZD0iQ29sbGFiUHJvdmlkZXJMb2dpbiI+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJQcm92aWRlckxvZ2luSXRlbScpCiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgJyArIEljb24gKyAnIj48L2k+IDxzdHJvbmc+QW5tZWxkZW48L3N0cm9uZz4nKQogICAgICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIHByb3ZpZGVyIGxvZ2luCiAgICAgICAgICAgICAgICBDb2xsYWIuTG9naW4oKS50aGVuKGZ1bmN0aW9uKFVzZXIpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5VcGRhdGVIZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICAvLyBIaWRlIGxvZ2luIGl0ZW0sIHNob3cgbG9nb3V0CiAgICAgICAgICAgICAgICAgICAgJExvZ2luTGluay5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgJExvZ291dExpbmsuc2hvdygpOwogICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2dpbiBmYWlsZWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogTGFiZWwgKyAnICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9naW4gZmFpbGVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogRXJyb3IubWVzc2FnZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBDcmVhdGUgbG9nb3V0IGxpbmsgKGhpZGRlbiBpbml0aWFsbHkpCiAgICAgICAgdmFyICRMb2dvdXRMaW5rID0gJCgnPGEgaHJlZj0iIyIgaWQ9IkNvbGxhYlByb3ZpZGVyTG9nb3V0Ij4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByb3ZpZGVyTG9nb3V0SXRlbScpCiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtc2lnbi1vdXQiPjwvaT4gPHN0cm9uZz5BYm1lbGRlbjwvc3Ryb25nPicpCiAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgLm9uKCdjbGljaycsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBsb2dvdXQKICAgICAgICAgICAgICAgIENvbGxhYi5Mb2dvdXQoKTsKICAgICAgICAgICAgICAgIFRhcmdldE5TLlVwZGF0ZUhlYWRlcigpOwogICAgICAgICAgICAgICAgLy8gU2hvdyBsb2dpbiBpdGVtLCBoaWRlIGxvZ291dAogICAgICAgICAgICAgICAgJExvZ2luTGluay5zaG93KCk7CiAgICAgICAgICAgICAgICAkTG9nb3V0TGluay5oaWRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBDcmVhdGUgYSBzcGFuIHdyYXBwZXIgZm9yIHByb3ZpZGVyIGxpbmtzIChtYXRjaGVzIFpudW55IHN0cnVjdHVyZSkKICAgICAgICB2YXIgJFByb3ZpZGVyU2VjdGlvbiA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJQcm92aWRlclNlY3Rpb24nKTsKICAgICAgICAkUHJvdmlkZXJTZWN0aW9uLmFwcGVuZCgkTG9naW5MaW5rLCAkTG9nb3V0TGluayk7CgogICAgICAgIC8vIEluc2VydCBhZnRlciB0aGUgIktvbnRvIiBsYWJlbAogICAgICAgIHZhciAkS29udG9MYWJlbCA9ICRTdWJtZW51LmZpbmQoJ2xhYmVsJykuZmlsdGVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gJCh0aGlzKS50ZXh0KCkudHJpbSgpID09PSAnS29udG8nOwogICAgICAgIH0pOwoKICAgICAgICBpZiAoJEtvbnRvTGFiZWwubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIEluc2VydCBwcm92aWRlciBzZWN0aW9uIGJlZm9yZSBLb250byBzZWN0aW9uCiAgICAgICAgICAgICRMYWJlbC5pbnNlcnRCZWZvcmUoJEtvbnRvTGFiZWwpOwogICAgICAgICAgICAkUHJvdmlkZXJTZWN0aW9uLmluc2VydEJlZm9yZSgkS29udG9MYWJlbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRmFsbGJhY2s6IGluc2VydCBhZnRlciBjb2x1bW4td3JhcHBlciAodXNlciBuYW1lKQogICAgICAgICAgICB2YXIgJENvbHVtbldyYXBwZXIgPSAkU3VibWVudS5maW5kKCcuY29sdW1uLXdyYXBwZXInKTsKICAgICAgICAgICAgaWYgKCRDb2x1bW5XcmFwcGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJENvbHVtbldyYXBwZXIuYWZ0ZXIoJFByb3ZpZGVyU2VjdGlvbikuYWZ0ZXIoJExhYmVsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIExhc3QgZmFsbGJhY2s6IHByZXBlbmQgdG8gc3VibWVudQogICAgICAgICAgICAgICAgJFN1Ym1lbnUucHJlcGVuZCgkUHJvdmlkZXJTZWN0aW9uKS5wcmVwZW5kKCRMYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFVwZGF0ZSB2aXNpYmlsaXR5IGJhc2VkIG9uIGN1cnJlbnQgbG9naW4gc3RhdGUKICAgICAgICBpZiAoQ29sbGFiLklzTG9nZ2VkSW4oKSkgewogICAgICAgICAgICAkTG9naW5MaW5rLmhpZGUoKTsKICAgICAgICAgICAgJExvZ291dExpbmsuc2hvdygpOwogICAgICAgIH0KICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgTWV0aG9kcyAtIEhvdmVyIENhcmQKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIFNldHVwSG92ZXJDYXJkSGFuZGxlcigpIHsKICAgICAgICAvLyBVc2UgbmFtZXNwYWNlIHRvIHByZXZlbnQgZHVwbGljYXRlIGhhbmRsZXJzIG9uIHJlLWluaXRpYWxpemF0aW9uCiAgICAgICAgdmFyIG5zID0gJy5jb2xsYWJIb3ZlckNhcmQnOwoKICAgICAgICAvLyBTZWxlY3RvcnMgZm9yIGhvdmVyIHRyaWdnZXJzOgogICAgICAgIC8vIC0gLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlOiBJbmRpdmlkdWFsIGF2YXRhcnMgKGFydGljbGUgYXZhdGFycykKICAgICAgICAvLyAtIC5Db2xsYWJIb3ZlclRyaWdnZXI6IEJhZGdlIGNvbnRhaW5lcnMgKEhlYWRlclVzZXJCYWRnZSwgQ3VzdG9tZXJJbmZvIHdpZGdldCkKICAgICAgICB2YXIgVHJpZ2dlclNlbGVjdG9yID0gJy5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZSwgLkNvbGxhYkhvdmVyVHJpZ2dlcic7CgogICAgICAgIC8vIFJlbW92ZSBhbnkgZXhpc3RpbmcgaGFuZGxlcnMgZmlyc3QKICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ21vdXNlZW50ZXInICsgbnMgKyAnIG1vdXNlbGVhdmUnICsgbnMgKyAnIGNsaWNrJyArIG5zICsgJyBrZXlkb3duJyArIG5zKTsKCiAgICAgICAgLy8gRGVsZWdhdGUgaG92ZXIgZXZlbnRzIGZvciBhbGwgaG92ZXIgdHJpZ2dlcnMKICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2VlbnRlcicgKyBucywgVHJpZ2dlclNlbGVjdG9yLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkVHJpZ2dlciA9ICQodGhpcyk7CiAgICAgICAgICAgIHZhciBFbWFpbCA9ICRUcmlnZ2VyLmF0dHIoJ2RhdGEtZW1haWwnKTsKCiAgICAgICAgICAgIGlmICghRW1haWwpIHJldHVybjsKCiAgICAgICAgICAgIC8vIENsZWFyIGFueSBleGlzdGluZyB0aW1lb3V0IHRvIHByZXZlbnQgbWVtb3J5IGxlYWtzCiAgICAgICAgICAgIGlmIChIb3ZlckNhcmRUaW1lb3V0KSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoSG92ZXJDYXJkVGltZW91dCk7CiAgICAgICAgICAgICAgICBIb3ZlckNhcmRUaW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgSG92ZXJDYXJkVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0hvdmVyQ2FyZChFbWFpbCwgJFRyaWdnZXIpOwogICAgICAgICAgICB9LCBIb3ZlckNhcmREZWxheSk7CiAgICAgICAgfSk7CgogICAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWxlYXZlJyArIG5zLCBUcmlnZ2VyU2VsZWN0b3IsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKEhvdmVyQ2FyZFRpbWVvdXQpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChIb3ZlckNhcmRUaW1lb3V0KTsKICAgICAgICAgICAgICAgIEhvdmVyQ2FyZFRpbWVvdXQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIEtlZXAgaG92ZXIgY2FyZCBvcGVuIHdoZW4gbW91c2UgaXMgb3ZlciBpdAogICAgICAgICQoZG9jdW1lbnQpLm9uKCdtb3VzZWVudGVyJyArIG5zLCAnLkNvbGxhYkhvdmVyQ2FyZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKEhvdmVyQ2FyZFRpbWVvdXQpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChIb3ZlckNhcmRUaW1lb3V0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAkKGRvY3VtZW50KS5vbignbW91c2VsZWF2ZScgKyBucywgJy5Db2xsYWJIb3ZlckNhcmQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEhpZGVIb3ZlckNhcmQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2xvc2Ugb24gY2xpY2sgb3V0c2lkZQogICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycgKyBucywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgIGlmIChBY3RpdmVIb3ZlckNhcmQgJiYgISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuQ29sbGFiSG92ZXJDYXJkLCAuQ29sbGFiQXZhdGFyLCAuQ29sbGFiSG92ZXJUcmlnZ2VyJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBIaWRlSG92ZXJDYXJkKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQ2xvc2Ugb24gZXNjYXBlCiAgICAgICAgJChkb2N1bWVudCkub24oJ2tleWRvd24nICsgbnMsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBpZiAoRXZlbnQua2V5ID09PSAnRXNjYXBlJyAmJiBBY3RpdmVIb3ZlckNhcmQpIHsKICAgICAgICAgICAgICAgIEhpZGVIb3ZlckNhcmQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIENyZWF0ZUhvdmVyQ2FyZEVsZW1lbnQoKSB7CiAgICAgICAgdmFyICRDYXJkID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkJyk7CgogICAgICAgIC8vIEhlYWRlcgogICAgICAgIHZhciAkSGVhZGVyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19oZWFkZXInKTsKICAgICAgICB2YXIgJEF2YXRhciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkF2YXRhciBDb2xsYWJBdmF0YXItLWxhcmdlJyk7CiAgICAgICAgdmFyICRJbmZvID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19pbmZvJyk7CiAgICAgICAgdmFyICROYW1lID0gJCgnPGgzPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX25hbWUnKS50ZXh0KCcuLi4nKTsKICAgICAgICB2YXIgJFRpdGxlID0gJCgnPHA+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fdGl0bGUnKS50ZXh0KCcuLi4nKTsKCiAgICAgICAgJEluZm8uYXBwZW5kKCROYW1lLCAkVGl0bGUpOwogICAgICAgICRIZWFkZXIuYXBwZW5kKCRBdmF0YXIsICRJbmZvKTsKCiAgICAgICAgLy8gQm9keQogICAgICAgIHZhciAkQm9keSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fYm9keScpOwoKICAgICAgICAvLyBGb290ZXIKICAgICAgICB2YXIgJEZvb3RlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fZm9vdGVyJyk7CgogICAgICAgICRDYXJkLmFwcGVuZCgkSGVhZGVyLCAkQm9keSwgJEZvb3Rlcik7CgogICAgICAgIHJldHVybiAkQ2FyZDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGFuIGljb24gYnV0dG9uL2xpbmsgZm9yIHRoZSBob3ZlciBjYXJkIGZvb3RlciwKICAgICAqIHdpdGggcHJvcGVyIGVzY2FwaW5nLiBTaGFyZWQgYnkgUG9wdWxhdGVIb3ZlckNhcmQgYW5kCiAgICAgKiBBcHBlbmRPd25DYXJkRm9vdGVyQnV0dG9ucyAoYWxzbyB1c2VkIGZyb20gU2hvd0hvdmVyQ2FyZCdzIG93bgogICAgICogY2F0Y2goKSBwYXRoLCB3aGVyZSBubyBQcm9maWxlIGRhdGEgZXhpc3RzIGF0IGFsbCkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZUljb25CdXR0b24oVGFnLCBIcmVmLCBUaXRsZSwgSWNvbkNsYXNzLCBUYXJnZXQpIHsKICAgICAgICB2YXIgJEJ0biA9ICQoJzwnICsgVGFnICsgJz4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkJ1dHRvbiBDb2xsYWJCdXR0b24tLWljb24nKQogICAgICAgICAgICAuYXR0cigndGl0bGUnLCBUaXRsZSkKICAgICAgICAgICAgLmFwcGVuZCgkKCc8aT4nKS5hZGRDbGFzcyhJY29uQ2xhc3MpKTsKICAgICAgICBpZiAoSHJlZikgewogICAgICAgICAgICAkQnRuLmF0dHIoJ2hyZWYnLCBIcmVmKTsKICAgICAgICB9CiAgICAgICAgaWYgKFRhcmdldCkgewogICAgICAgICAgICAkQnRuLmF0dHIoJ3RhcmdldCcsIFRhcmdldCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkQnRuOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBBcHBlbmQgdGhlIGhlYWRlcidzIG93bi1jYXJkIGZvb3RlciBidXR0b25zCiAgICAgKiAoUHJlZmVyZW5jZXMgKyBMb2dvdXQpIHRvIGEgaG92ZXIgY2FyZCBmb290ZXIuIFVuY29uZGl0aW9uYWwgLSBubwogICAgICogUHJvZmlsZS9DdXJyZW50VXNlciBkYXRhIHJlcXVpcmVkIC0gc28gdGhpcyByZW5kZXJzIGlkZW50aWNhbGx5CiAgICAgKiB3aGV0aGVyIG9yIG5vdCBNMzY1IGRhdGEgbG9hZGVkIHN1Y2Nlc3NmdWxseS4gVGhpcyBpcyB0aGUKICAgICAqIGd1YXJhbnRlZWQgd2F5IHRvIGZpeCAob3IgZXNjYXBlKSBhIGJyb2tlbiBNMzY1IGxvZ2luOiBMb2dvdXQKICAgICAqIGFsd2F5cyBlbmRzIGJvdGggdGhlIENvbGxhYm9yYXRpb24gc2Vzc2lvbiBhbmQgdGhlIFpudW55IHNlc3Npb24uCiAgICAgKiBAcGFyYW0ge2pRdWVyeX0gJEZvb3RlciAtIFRoZSAoYWxyZWFkeSBlbXB0aWVkKSBob3ZlciBjYXJkIGZvb3Rlci4KICAgICAqLwogICAgZnVuY3Rpb24gQXBwZW5kT3duQ2FyZEZvb3RlckJ1dHRvbnMoJEZvb3RlcikgewogICAgICAgIHZhciBQcmVmZXJlbmNlc1VybCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRQcmVmZXJlbmNlcyc7CiAgICAgICAgJEZvb3Rlci5hcHBlbmQoQ3JlYXRlSWNvbkJ1dHRvbignYScsIFByZWZlcmVuY2VzVXJsLAogICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGVyc29uYWwgcHJlZmVyZW5jZXMnKSwgJ2ZhIGZhLWNvZycpKTsKCiAgICAgICAgdmFyICRMb2dvdXRCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQnV0dG9uIENvbGxhYkJ1dHRvbi0taWNvbiBDb2xsYWJCdXR0b24tLWxvZ291dCcpCiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2dvdXQnKSkKICAgICAgICAgICAgLmFwcGVuZCgkKCc8aT4nKS5hZGRDbGFzcygnZmEgZmEtc2lnbi1vdXQnKSk7CiAgICAgICAgJExvZ291dEJ0bi5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEhpZGVIb3ZlckNhcmQoKTsKICAgICAgICAgICAgLy8gRmlyc3QgbG9nb3V0IGZyb20gQ29sbGFib3JhdGlvbiBwcm92aWRlcgogICAgICAgICAgICBDb2xsYWIuTG9nb3V0KCk7CiAgICAgICAgICAgIC8vIFRoZW4gcmVkaXJlY3QgdG8gWm51bnkgbG9nb3V0CiAgICAgICAgICAgIHZhciBMb2dvdXRVcmwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAnQWN0aW9uPUxvZ291dCc7CiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gTG9nb3V0VXJsOwogICAgICAgIH0pOwogICAgICAgICRGb290ZXIuYXBwZW5kKCRMb2dvdXRCdG4pOwogICAgfQoKICAgIGZ1bmN0aW9uIFBvcHVsYXRlSG92ZXJDYXJkKCRDYXJkLCBQcm9maWxlLCBBdmF0YXJVcmwsIFByZXNlbmNlLCBJc093bkNhcmQpIHsKICAgICAgICAvLyBVcGRhdGUgYXZhdGFyIC0gdXNpbmcgRE9NIEFQSSB0byBwcmV2ZW50IFhTUwogICAgICAgIHZhciAkQXZhdGFyID0gJENhcmQuZmluZCgnLkNvbGxhYkF2YXRhcicpLmVtcHR5KCk7CiAgICAgICAgaWYgKEF2YXRhclVybCkgewogICAgICAgICAgICB2YXIgJEltZyA9ICQoJzxpbWc+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19pbWFnZScpCiAgICAgICAgICAgICAgICAuYXR0cignc3JjJywgQXZhdGFyVXJsKQogICAgICAgICAgICAgICAgLmF0dHIoJ2FsdCcsICcnKTsKICAgICAgICAgICAgJEF2YXRhci5hcHBlbmQoJEltZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyICRGYWxsYmFjayA9ICQoJzxkaXY+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpCiAgICAgICAgICAgICAgICAudGV4dChHZXRJbml0aWFscyhQcm9maWxlLmVtYWlsLCBQcm9maWxlLmRpc3BsYXlOYW1lKSk7CiAgICAgICAgICAgICRBdmF0YXIuYXBwZW5kKCRGYWxsYmFjayk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgcHJlc2VuY2UgLSB1c2luZyBET00gQVBJIHRvIHByZXZlbnQgWFNTCiAgICAgICAgdmFyIFByZXNlbmNlSW5mbyA9IEdldFByZXNlbmNlSW5mbyhQcmVzZW5jZS5zdGF0dXMpOwogICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UnKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlLS0nICsgUHJlc2VuY2VJbmZvLmNsYXNzKTsKICAgICAgICAkQXZhdGFyLmFwcGVuZCgkUHJlc2VuY2UpOwoKICAgICAgICAvLyBVcGRhdGUgbmFtZSBhbmQgdGl0bGUKICAgICAgICAkQ2FyZC5maW5kKCcuQ29sbGFiSG92ZXJDYXJkX19uYW1lJykudGV4dChQcm9maWxlLmRpc3BsYXlOYW1lIHx8IFByb2ZpbGUuZW1haWwpOwogICAgICAgICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX3RpdGxlJykudGV4dChQcm9maWxlLmpvYlRpdGxlIHx8ICcnKTsKCiAgICAgICAgLy8gQnVpbGQgYm9keSBjb250ZW50IC0gdXNpbmcgRE9NIEFQSSB0byBwcmV2ZW50IFhTUwogICAgICAgIHZhciAkQm9keSA9ICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX2JvZHknKS5lbXB0eSgpOwoKICAgICAgICAvLyBTaG93IE9PRiBtZXNzYWdlIGJhbm5lciBpZiB1c2VyIGlzIG91dCBvZiBvZmZpY2UKICAgICAgICBpZiAoUHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScgJiYgUHJlc2VuY2Uub3V0T2ZPZmZpY2UgJiYgUHJlc2VuY2Uub3V0T2ZPZmZpY2UubWVzc2FnZSkgewogICAgICAgICAgICB2YXIgJE9PRkJhbm5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fb29mQmFubmVyJyk7CiAgICAgICAgICAgIC8vIEhlYWRlciB3aXRoIGljb24gYW5kIHRpdGxlIGlubGluZQogICAgICAgICAgICB2YXIgJE9PRkhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fb29mSGVhZGVyJyk7CiAgICAgICAgICAgIHZhciAkT09GSWNvbiA9ICQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS1zaWduLW91dCBDb2xsYWJIb3ZlckNhcmRfX29vZkljb24nKTsKICAgICAgICAgICAgdmFyICRPT0ZUaXRsZSA9ICQoJzxzcGFuPicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fb29mVGl0bGUnKQogICAgICAgICAgICAgICAgLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ091dCBvZiBPZmZpY2UnKSk7CiAgICAgICAgICAgICRPT0ZIZWFkZXIuYXBwZW5kKCRPT0ZJY29uLCAkT09GVGl0bGUpOwogICAgICAgICAgICAvLyBNZXNzYWdlIHRha2VzIGZ1bGwgd2lkdGggYmVsb3cgaGVhZGVyCiAgICAgICAgICAgIHZhciBDbGVhbk1lc3NhZ2UgPSBQcmVzZW5jZS5vdXRPZk9mZmljZS5tZXNzYWdlCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXlxzK3xccyskL2csICcnKSAgLy8gdHJpbQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xuezMsfS9nLCAnXG5cbicpOyAgLy8gbWF4IDIgbmV3bGluZXMKICAgICAgICAgICAgdmFyICRPT0ZNZXNzYWdlID0gJCgnPGRpdj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX29vZk1lc3NhZ2UnKQogICAgICAgICAgICAgICAgLnRleHQoQ2xlYW5NZXNzYWdlKTsKICAgICAgICAgICAgJE9PRkJhbm5lci5hcHBlbmQoJE9PRkhlYWRlciwgJE9PRk1lc3NhZ2UpOwogICAgICAgICAgICAkQm9keS5hcHBlbmQoJE9PRkJhbm5lcik7CiAgICAgICAgfQoKICAgICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgcm93IHdpdGggc2FmZSB0ZXh0IG9yIGVsZW1lbnQgdmFsdWUKICAgICAgICBmdW5jdGlvbiBBZGRSb3coTGFiZWwsIFZhbHVlT3JFbGVtZW50KSB7CiAgICAgICAgICAgIHZhciAkUm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19yb3cnKTsKICAgICAgICAgICAgJFJvdy5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZF9fbGFiZWwnKS50ZXh0KExhYmVsKSk7CiAgICAgICAgICAgIHZhciAkVmFsdWUgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX192YWx1ZScpOwogICAgICAgICAgICBpZiAodHlwZW9mIFZhbHVlT3JFbGVtZW50ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgJFZhbHVlLnRleHQoVmFsdWVPckVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVlLmFwcGVuZChWYWx1ZU9yRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFJvdy5hcHBlbmQoJFZhbHVlKTsKICAgICAgICAgICAgJEJvZHkuYXBwZW5kKCRSb3cpOwogICAgICAgIH0KCiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhIGNvcHkgYnV0dG9uIGZvciBjb250YWN0IGRhdGEKICAgICAgICBmdW5jdGlvbiBDcmVhdGVDb3B5QnV0dG9uKFRleHRUb0NvcHkpIHsKICAgICAgICAgICAgdmFyICRDb3B5QnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIENvbGxhYkJ1dHRvbi0tY29weScpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvcHkgdG8gY2xpcGJvYXJkJykpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS1jb3B5JykpOwogICAgICAgICAgICAkQ29weUJ0bi5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoVGV4dFRvQ29weSkudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAvLyBWaXN1YWwgZmVlZGJhY2sgLSBzaG93IGNoZWNrbWFyayBicmllZmx5CiAgICAgICAgICAgICAgICAgICAgJENvcHlCdG4uZmluZCgnaScpLnJlbW92ZUNsYXNzKCdmYS1jb3B5JykuYWRkQ2xhc3MoJ2ZhLWNoZWNrJyk7CiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJENvcHlCdG4uZmluZCgnaScpLnJlbW92ZUNsYXNzKCdmYS1jaGVjaycpLmFkZENsYXNzKCdmYS1jb3B5Jyk7CiAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiAkQ29weUJ0bjsKICAgICAgICB9CgogICAgICAgIGlmIChQcm9maWxlLmRlcGFydG1lbnQpIHsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZXBhcnRtZW50JyksIFByb2ZpbGUuZGVwYXJ0bWVudCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoUHJvZmlsZS5tYW5hZ2VyICYmIFByb2ZpbGUubWFuYWdlci5kaXNwbGF5TmFtZSkgewogICAgICAgICAgICAvLyBDcmVhdGUgbWFuYWdlciBlbGVtZW50IHNhZmVseSB3aXRoIERPTSBBUEkKICAgICAgICAgICAgdmFyICRNYW5hZ2VyID0gJCgnPHNwYW4+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiSG92ZXJDYXJkX19tYW5hZ2VyJykKICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWVtYWlsJywgUHJvZmlsZS5tYW5hZ2VyLmVtYWlsIHx8ICcnKQogICAgICAgICAgICAgICAgLnRleHQoUHJvZmlsZS5tYW5hZ2VyLmRpc3BsYXlOYW1lICsgJyAnKQogICAgICAgICAgICAgICAgLmFwcGVuZCgkKCc8aT4nKS5hZGRDbGFzcygnZmEgZmEtZXh0ZXJuYWwtbGluaycpKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYW5hZ2VyJyksICRNYW5hZ2VyKTsKICAgICAgICB9CgogICAgICAgIGlmIChQcm9maWxlLm9mZmljZUxvY2F0aW9uKSB7CiAgICAgICAgICAgIEFkZFJvdyhDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2ZmaWNlJyksIFByb2ZpbGUub2ZmaWNlTG9jYXRpb24pOwogICAgICAgIH0KCiAgICAgICAgaWYgKFByb2ZpbGUuYnVzaW5lc3NQaG9uZXMgJiYgUHJvZmlsZS5idXNpbmVzc1Bob25lcy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gQ3JlYXRlIHBob25lIGxpbmsgd2l0aCBjb3B5IGJ1dHRvbgogICAgICAgICAgICB2YXIgJFBob25lV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2NvcHlhYmxlJyk7CiAgICAgICAgICAgIHZhciAkUGhvbmVMaW5rID0gJCgnPGE+JykKICAgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJ3RlbDonICsgUHJvZmlsZS5idXNpbmVzc1Bob25lc1swXSkKICAgICAgICAgICAgICAgIC50ZXh0KFByb2ZpbGUuYnVzaW5lc3NQaG9uZXNbMF0pOwogICAgICAgICAgICAkUGhvbmVXcmFwLmFwcGVuZCgkUGhvbmVMaW5rLCBDcmVhdGVDb3B5QnV0dG9uKFByb2ZpbGUuYnVzaW5lc3NQaG9uZXNbMF0pKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQaG9uZScpLCAkUGhvbmVXcmFwKTsKICAgICAgICB9CgogICAgICAgIGlmIChQcm9maWxlLm1vYmlsZVBob25lKSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBtb2JpbGUgbGluayB3aXRoIGNvcHkgYnV0dG9uCiAgICAgICAgICAgIHZhciAkTW9iaWxlV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2NvcHlhYmxlJyk7CiAgICAgICAgICAgIHZhciAkTW9iaWxlTGluayA9ICQoJzxhPicpCiAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsICd0ZWw6JyArIFByb2ZpbGUubW9iaWxlUGhvbmUpCiAgICAgICAgICAgICAgICAudGV4dChQcm9maWxlLm1vYmlsZVBob25lKTsKICAgICAgICAgICAgJE1vYmlsZVdyYXAuYXBwZW5kKCRNb2JpbGVMaW5rLCBDcmVhdGVDb3B5QnV0dG9uKFByb2ZpbGUubW9iaWxlUGhvbmUpKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb2JpbGUnKSwgJE1vYmlsZVdyYXApOwogICAgICAgIH0KCiAgICAgICAgaWYgKFByb2ZpbGUuZW1haWwpIHsKICAgICAgICAgICAgLy8gQ3JlYXRlIGVtYWlsIGxpbmsgd2l0aCBjb3B5IGJ1dHRvbgogICAgICAgICAgICB2YXIgJEVtYWlsV3JhcCA9ICQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJIb3ZlckNhcmRfX2NvcHlhYmxlJyk7CiAgICAgICAgICAgIHZhciAkRW1haWxMaW5rID0gJCgnPGE+JykKICAgICAgICAgICAgICAgIC5hdHRyKCdocmVmJywgJ21haWx0bzonICsgUHJvZmlsZS5lbWFpbCkKICAgICAgICAgICAgICAgIC50ZXh0KFByb2ZpbGUuZW1haWwpOwogICAgICAgICAgICAkRW1haWxXcmFwLmFwcGVuZCgkRW1haWxMaW5rLCBDcmVhdGVDb3B5QnV0dG9uKFByb2ZpbGUuZW1haWwpKTsKICAgICAgICAgICAgQWRkUm93KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdFbWFpbCcpLCAkRW1haWxXcmFwKTsKICAgICAgICB9CgogICAgICAgIC8vIFByZXNlbmNlIHN0YXR1cyAtIHVzaW5nIERPTSBBUEkKICAgICAgICB2YXIgJFN0YXR1c1NwYW4gPSAkKCc8c3Bhbj4nKQogICAgICAgICAgICAuY3NzKCdjb2xvcicsICd2YXIoLS1jb2xsYWItcHJlc2VuY2UtJyArIFByZXNlbmNlSW5mby5jbGFzcyArICcpJykKICAgICAgICAgICAgLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoUHJlc2VuY2VJbmZvLmxhYmVsKSk7CiAgICAgICAgQWRkUm93KCdTdGF0dXMnLCAkU3RhdHVzU3Bhbik7CgogICAgICAgIC8vIFdvcmsgbG9jYXRpb24gKG9mZmljZS9yZW1vdGUpIG9yIFRpbWUgb2ZmICh3aGVuIE9PRiBpcyBhY3RpdmUpCiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkxhYmVscyA9IHsKICAgICAgICAgICAgJ29mZmljZSc6ICdPZmZpY2UnLAogICAgICAgICAgICAncmVtb3RlJzogJ1JlbW90ZScsCiAgICAgICAgICAgICd0aW1lT2ZmJzogJ1RpbWUgb2ZmJwogICAgICAgIH07CiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkljb25zID0gewogICAgICAgICAgICAnb2ZmaWNlJzogJ2ZhLWJ1aWxkaW5nJywKICAgICAgICAgICAgJ3JlbW90ZSc6ICdmYS1ob21lJywKICAgICAgICAgICAgJ3RpbWVPZmYnOiAnZmEtc2lnbi1vdXQnCiAgICAgICAgfTsKCiAgICAgICAgLy8gRGV0ZXJtaW5lIGxvY2F0aW9uIHR5cGU6IE9PRiB0YWtlcyBwcmVjZWRlbmNlLCB0aGVuIHdvcmtMb2NhdGlvbgogICAgICAgIHZhciBMb2NhdGlvblR5cGUgPSBudWxsOwogICAgICAgIGlmIChQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICBMb2NhdGlvblR5cGUgPSAndGltZU9mZic7CiAgICAgICAgfSBlbHNlIGlmIChQcmVzZW5jZS53b3JrTG9jYXRpb24gJiYgUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGUpIHsKICAgICAgICAgICAgTG9jYXRpb25UeXBlID0gUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoTG9jYXRpb25UeXBlKSB7CiAgICAgICAgICAgIHZhciBMb2NhdGlvbkxhYmVsID0gV29ya0xvY2F0aW9uTGFiZWxzW0xvY2F0aW9uVHlwZV0gfHwgTG9jYXRpb25UeXBlOwogICAgICAgICAgICB2YXIgTG9jYXRpb25JY29uID0gV29ya0xvY2F0aW9uSWNvbnNbTG9jYXRpb25UeXBlXSB8fCAnZmEtbWFwLW1hcmtlcic7CiAgICAgICAgICAgIHZhciAkTG9jYXRpb25TcGFuID0gJCgnPHNwYW4+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiV29ya0xvY2F0aW9uIENvbGxhYldvcmtMb2NhdGlvbi0tJyArIExvY2F0aW9uVHlwZSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhICcgKyBMb2NhdGlvbkljb24pKQogICAgICAgICAgICAgICAgLmFwcGVuZCgnICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZShMb2NhdGlvbkxhYmVsKSk7CiAgICAgICAgICAgIEFkZFJvdyhDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV29yayBsb2NhdGlvbicpLCAkTG9jYXRpb25TcGFuKTsKICAgICAgICB9CgogICAgICAgIC8vIE1hbmFnZXIgY2xpY2sgaGFuZGxlcgogICAgICAgICRCb2R5LmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX21hbmFnZXInKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBNYW5hZ2VyRW1haWwgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtZW1haWwnKTsKICAgICAgICAgICAgaWYgKE1hbmFnZXJFbWFpbCkgewogICAgICAgICAgICAgICAgdmFyICRBbmNob3IgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0hvdmVyQ2FyZChNYW5hZ2VyRW1haWwsICRBbmNob3IpOwogICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBCdWlsZCBmb290ZXIgYnV0dG9ucyAtIHVzaW5nIERPTSBBUEkgdG8gcHJldmVudCBYU1MKICAgICAgICB2YXIgJEZvb3RlciA9ICRDYXJkLmZpbmQoJy5Db2xsYWJIb3ZlckNhcmRfX2Zvb3RlcicpLmVtcHR5KCk7CgogICAgICAgIC8vIFdoZXRoZXIgdGhpcyBpcyB0aGUgY3VycmVudCB1c2VyJ3Mgb3duIGNhcmQuIFByZWZlciB0aGUKICAgICAgICAvLyBzdHJ1Y3R1cmFsIHNpZ25hbCBjb21wdXRlZCBieSBTaG93SG92ZXJDYXJkIChJc093bkNhcmQgLSBiYXNlZAogICAgICAgIC8vIG9uIHdoaWNoIGVsZW1lbnQgdHJpZ2dlcmVkIHRoZSBjYXJkLCBub3Qgb24gZGF0YSk7IGl0IHN0YXlzCiAgICAgICAgLy8gY29ycmVjdCBldmVuIHdoZW4gQ3VycmVudFVzZXIvUHJvZmlsZSBkYXRhIGlzIG1pc3NpbmcsIHN0YWxlLAogICAgICAgIC8vIG9yIG1pc21hdGNoZWQgKGUuZy4gYSBicm9rZW4vZXhwaXJlZCBNMzY1IHNlc3Npb24gcmV0dXJuaW5nIGEKICAgICAgICAvLyBQcm9maWxlIHdpdGhvdXQgYSB1c2FibGUgZW1haWwpLiBPbmx5IGZhbGwgYmFjayB0byB0aGUgb2xkCiAgICAgICAgLy8gZGF0YS1iYXNlZCBjb21wYXJpc29uIGlmIGEgY2FsbGVyIGRpZG4ndCBwYXNzIElzT3duQ2FyZCBhdAogICAgICAgIC8vIGFsbC4KICAgICAgICB2YXIgSXNDdXJyZW50VXNlciA9ICh0eXBlb2YgSXNPd25DYXJkID09PSAnYm9vbGVhbicpCiAgICAgICAgICAgID8gSXNPd25DYXJkCiAgICAgICAgICAgIDogKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBDdXJyZW50VXNlciA9IENvbGxhYi5HZXRDdXJyZW50VXNlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuICEhKEN1cnJlbnRVc2VyICYmIFByb2ZpbGUgJiYgQ3VycmVudFVzZXIuZW1haWwgPT09IFByb2ZpbGUuZW1haWwpOwogICAgICAgICAgICB9KSgpOwoKICAgICAgICAvLyBDaGVjayBpZiB1c2VyIGlzIGZyb20gcHJpbWFyeSBwcm92aWRlciAoTTM2NSkgLSBvbmx5IHRoZW4gVGVhbXMgaXMgYXZhaWxhYmxlCiAgICAgICAgLy8gRmFsbGJhY2sgcHJvdmlkZXIgKFpudW55KSB1c2VycyBkb24ndCBoYXZlIFRlYW1zCiAgICAgICAgdmFyIFVzZXJQcm92aWRlciA9IFByb2ZpbGUgPyBDb2xsYWIuR2V0VXNlclByb3ZpZGVyKFByb2ZpbGUuZW1haWwpIDogbnVsbDsKICAgICAgICB2YXIgSGFzVGVhbXMgPSBVc2VyUHJvdmlkZXIgPT09ICdwcmltYXJ5JzsKCiAgICAgICAgLy8gVGVhbXMgYWN0aW9uIGJ1dHRvbnMgLSBvbmx5IHNob3cgZm9yIG90aGVyIHBlb3BsZSBBTkQgb25seSBpZiBmcm9tIHByaW1hcnkgcHJvdmlkZXIgKE0zNjUpCiAgICAgICAgLy8gTm90ZTogRW1haWwvUGhvbmUvTW9iaWxlIGFyZSBhbHJlYWR5IGNsaWNrYWJsZSBsaW5rcyBpbiB0aGUgYm9keSwgc28gd2Ugb25seSBzaG93IFRlYW1zIGFjdGlvbnMgaGVyZQogICAgICAgIGlmICghSXNDdXJyZW50VXNlciAmJiBIYXNUZWFtcykgewogICAgICAgICAgICAvLyBUZWFtcyBDaGF0IGJ1dHRvbgogICAgICAgICAgICB2YXIgQ2hhdExpbmsgPSBDb2xsYWIuR2V0Q2hhdExpbmsoUHJvZmlsZS5lbWFpbCk7CiAgICAgICAgICAgIGlmIChDaGF0TGluayAmJiBDb2xsYWIuSXNMb2dnZWRJbigpICYmIENvbGxhYi5IYXNDYXBhYmlsaXR5KCdjaGF0JykpIHsKICAgICAgICAgICAgICAgICRGb290ZXIuYXBwZW5kKENyZWF0ZUljb25CdXR0b24oJ2EnLCBDaGF0TGluaywKICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGVhbXMgQ2hhdCcpLCAnZmEgZmEtY29tbWVudCcsICdfYmxhbmsnKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFRlYW1zIENhbGwgYnV0dG9uCiAgICAgICAgICAgIHZhciBDYWxsTGluayA9IENvbGxhYi5HZXRDYWxsTGluayhQcm9maWxlLmVtYWlsKTsKICAgICAgICAgICAgaWYgKENhbGxMaW5rICYmIENvbGxhYi5Jc0xvZ2dlZEluKCkgJiYgQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ2NhbGwnKSkgewogICAgICAgICAgICAgICAgJEZvb3Rlci5hcHBlbmQoQ3JlYXRlSWNvbkJ1dHRvbignYScsIENhbGxMaW5rLAogICAgICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUZWFtcyBDYWxsJyksICdmYSBmYS1waG9uZS1zcXVhcmUnLCAnX2JsYW5rJykpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBTZXR0aW5ncyBhbmQgbG9nb3V0IC0gb25seSBmb3IgY3VycmVudCB1c2VyJ3Mgb3duIGNhcmQuIEFsd2F5cwogICAgICAgIC8vIGJvdGggcmVuZGVyZWQgdG9nZXRoZXIsIHVuY29uZGl0aW9uYWxseSAtIHNlZQogICAgICAgIC8vIEFwcGVuZE93bkNhcmRGb290ZXJCdXR0b25zJ3Mgb3duIGNvbW1lbnQgZm9yIHdoeS4KICAgICAgICBpZiAoSXNDdXJyZW50VXNlcikgewogICAgICAgICAgICBBcHBlbmRPd25DYXJkRm9vdGVyQnV0dG9ucygkRm9vdGVyKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gUG9zaXRpb25Ib3ZlckNhcmQoJENhcmQsICRBbmNob3IpIHsKICAgICAgICB2YXIgQW5jaG9yT2Zmc2V0ID0gJEFuY2hvci5vZmZzZXQoKTsKICAgICAgICB2YXIgQW5jaG9yV2lkdGggPSAkQW5jaG9yLm91dGVyV2lkdGgoKTsKICAgICAgICB2YXIgQW5jaG9ySGVpZ2h0ID0gJEFuY2hvci5vdXRlckhlaWdodCgpOwogICAgICAgIHZhciBXaW5kb3dXaWR0aCA9ICQod2luZG93KS53aWR0aCgpOwogICAgICAgIHZhciBXaW5kb3dIZWlnaHQgPSAkKHdpbmRvdykuaGVpZ2h0KCk7CiAgICAgICAgdmFyIFNjcm9sbFRvcCA9ICQod2luZG93KS5zY3JvbGxUb3AoKTsKICAgICAgICB2YXIgQ2FyZFdpZHRoID0gMzIwOwogICAgICAgIHZhciBDYXJkSGVpZ2h0ID0gMzUwOyAvLyBBcHByb3hpbWF0ZQoKICAgICAgICAvLyBDYWxjdWxhdGUgYXZhaWxhYmxlIHNwYWNlIGluIGVhY2ggZGlyZWN0aW9uCiAgICAgICAgdmFyIFNwYWNlQmVsb3cgPSAoV2luZG93SGVpZ2h0ICsgU2Nyb2xsVG9wKSAtIChBbmNob3JPZmZzZXQudG9wICsgQW5jaG9ySGVpZ2h0KTsKICAgICAgICB2YXIgU3BhY2VBYm92ZSA9IEFuY2hvck9mZnNldC50b3AgLSBTY3JvbGxUb3A7CiAgICAgICAgdmFyIFNwYWNlUmlnaHQgPSBXaW5kb3dXaWR0aCAtIChBbmNob3JPZmZzZXQubGVmdCArIEFuY2hvcldpZHRoKTsKICAgICAgICB2YXIgU3BhY2VMZWZ0ID0gQW5jaG9yT2Zmc2V0LmxlZnQ7CgogICAgICAgIHZhciBMZWZ0LCBUb3A7CiAgICAgICAgdmFyIFBvc2l0aW9uQWJvdmUgPSBmYWxzZTsKCiAgICAgICAgLy8gRGV0ZXJtaW5lIGhvcml6b250YWwgcG9zaXRpb24KICAgICAgICAvLyBDaGVjayBpZiBhbmNob3IgaXMgaW4gc2lkZWJhciAocmlnaHQgc2lkZSBvZiBwYWdlKQogICAgICAgIHZhciBJc0luU2lkZWJhciA9IEFuY2hvck9mZnNldC5sZWZ0ID4gV2luZG93V2lkdGggLyAyOwoKICAgICAgICBpZiAoSXNJblNpZGViYXIgJiYgU3BhY2VMZWZ0ID4gQ2FyZFdpZHRoICsgMjApIHsKICAgICAgICAgICAgLy8gU2lkZWJhcjogcG9zaXRpb24gY2FyZCB0byB0aGUgTEVGVCBvZiBhbmNob3IKICAgICAgICAgICAgTGVmdCA9IEFuY2hvck9mZnNldC5sZWZ0IC0gQ2FyZFdpZHRoIC0gMTA7CiAgICAgICAgfSBlbHNlIGlmIChTcGFjZVJpZ2h0ID4gQ2FyZFdpZHRoICsgMjApIHsKICAgICAgICAgICAgLy8gRGVmYXVsdDogcG9zaXRpb24gdG8gdGhlIHJpZ2h0IG9mIGFuY2hvcgogICAgICAgICAgICBMZWZ0ID0gQW5jaG9yT2Zmc2V0LmxlZnQgKyBBbmNob3JXaWR0aCArIDEwOwogICAgICAgIH0gZWxzZSBpZiAoU3BhY2VMZWZ0ID4gQ2FyZFdpZHRoICsgMjApIHsKICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHBvc2l0aW9uIHRvIHRoZSBsZWZ0CiAgICAgICAgICAgIExlZnQgPSBBbmNob3JPZmZzZXQubGVmdCAtIENhcmRXaWR0aCAtIDEwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE5vIHNwYWNlIG9uIHNpZGVzOiBjZW50ZXIgaG9yaXpvbnRhbGx5CiAgICAgICAgICAgIExlZnQgPSBNYXRoLm1heCgxMCwgKFdpbmRvd1dpZHRoIC0gQ2FyZFdpZHRoKSAvIDIpOwogICAgICAgIH0KCiAgICAgICAgLy8gRGV0ZXJtaW5lIHZlcnRpY2FsIHBvc2l0aW9uCiAgICAgICAgLy8gUHJlZmVyIHNob3dpbmcgYmVsb3cgYW5jaG9yLCBidXQgc3dpdGNoIHRvIGFib3ZlIGlmIG5vdCBlbm91Z2ggc3BhY2UKICAgICAgICBpZiAoU3BhY2VCZWxvdyA+PSBDYXJkSGVpZ2h0ICsgMjApIHsKICAgICAgICAgICAgLy8gRW5vdWdoIHNwYWNlIGJlbG93OiBhbGlnbiB0b3Agb2YgY2FyZCB3aXRoIHRvcCBvZiBhbmNob3IKICAgICAgICAgICAgVG9wID0gQW5jaG9yT2Zmc2V0LnRvcDsKICAgICAgICB9IGVsc2UgaWYgKFNwYWNlQWJvdmUgPj0gQ2FyZEhlaWdodCArIDIwKSB7CiAgICAgICAgICAgIC8vIE5vdCBlbm91Z2ggc3BhY2UgYmVsb3csIGJ1dCBlbm91Z2ggYWJvdmU6IHBvc2l0aW9uIGFib3ZlIGFuY2hvcgogICAgICAgICAgICBUb3AgPSBBbmNob3JPZmZzZXQudG9wICsgQW5jaG9ySGVpZ2h0IC0gQ2FyZEhlaWdodDsKICAgICAgICAgICAgUG9zaXRpb25BYm92ZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gTmVpdGhlciBoYXMgZW5vdWdoIHNwYWNlOiBwb3NpdGlvbiB0byBmaXQgdmlzaWJsZSBhcmVhCiAgICAgICAgICAgIC8vIFByZWZlciBzaG93aW5nIGZyb20gdG9wIG9mIGFuY2hvciwgY2xhbXBlZCB0byB2aWV3cG9ydAogICAgICAgICAgICBUb3AgPSBBbmNob3JPZmZzZXQudG9wOwogICAgICAgICAgICB2YXIgTWF4VG9wID0gV2luZG93SGVpZ2h0ICsgU2Nyb2xsVG9wIC0gQ2FyZEhlaWdodCAtIDIwOwogICAgICAgICAgICB2YXIgTWluVG9wID0gU2Nyb2xsVG9wICsgMTA7CgogICAgICAgICAgICBpZiAoVG9wID4gTWF4VG9wKSB7CiAgICAgICAgICAgICAgICBUb3AgPSBNYXhUb3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFRvcCA8IE1pblRvcCkgewogICAgICAgICAgICAgICAgVG9wID0gTWluVG9wOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBGaW5hbCBib3VuZGFyeSBjaGVjawogICAgICAgIGlmIChMZWZ0IDwgMTApIHsKICAgICAgICAgICAgTGVmdCA9IDEwOwogICAgICAgIH0KICAgICAgICBpZiAoTGVmdCArIENhcmRXaWR0aCA+IFdpbmRvd1dpZHRoIC0gMTApIHsKICAgICAgICAgICAgTGVmdCA9IFdpbmRvd1dpZHRoIC0gQ2FyZFdpZHRoIC0gMTA7CiAgICAgICAgfQoKICAgICAgICAkQ2FyZC5jc3MoewogICAgICAgICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJywKICAgICAgICAgICAgbGVmdDogTGVmdCArICdweCcsCiAgICAgICAgICAgIHRvcDogVG9wICsgJ3B4JwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgY2xhc3MgZm9yIHBvc2l0aW9uaW5nICh1c2VmdWwgZm9yIENTUyBhcnJvdyBkaXJlY3Rpb24pCiAgICAgICAgJENhcmQucmVtb3ZlQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZC0tYWJvdmUgQ29sbGFiSG92ZXJDYXJkLS1iZWxvdycpOwogICAgICAgICRDYXJkLmFkZENsYXNzKFBvc2l0aW9uQWJvdmUgPyAnQ29sbGFiSG92ZXJDYXJkLS1hYm92ZScgOiAnQ29sbGFiSG92ZXJDYXJkLS1iZWxvdycpOwogICAgfQoKICAgIGZ1bmN0aW9uIEhpZGVIb3ZlckNhcmQoKSB7CiAgICAgICAgaWYgKEFjdGl2ZUhvdmVyQ2FyZCkgewogICAgICAgICAgICBBY3RpdmVIb3ZlckNhcmQucmVtb3ZlQ2xhc3MoJ0NvbGxhYkhvdmVyQ2FyZC0tdmlzaWJsZScpOwogICAgICAgICAgICB2YXIgJENhcmQgPSBBY3RpdmVIb3ZlckNhcmQ7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJENhcmQucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgICAgIEFjdGl2ZUhvdmVyQ2FyZCA9IG51bGw7CiAgICAgICAgfQogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBNZXRob2RzIC0gQ3VzdG9tZXIgSW5mbyBXaWRnZXQKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIFRyYWNrIHBlbmRpbmcgQUpBWCByZXF1ZXN0IGZvciBkeW5hbWljIHdpZGdldCB1cGRhdGVzCiAgICB2YXIgRHluYW1pY1dpZGdldFBlbmRpbmdSZXF1ZXN0ID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQmluZCB0aGUgc2FtZSBjb2xsYXBzZS9leHBhbmQgYmVoYXZpb3IgWm51bnkncyBuYXRpdmUKICAgICAqIE1vZHVsZS5TaWRlYmFyV2lkZ2V0LmpzIGdpdmVzIGV2ZXJ5ICIubW9kLm1vZFNpZGViYXJXaWRnZXQiICh0aGUKICAgICAqIDcuMy4xKyByZWRlc2lnbidzIHdyYXBwZXIgZm9yIHdpZGdldHMgbGlrZSB0aGUgbmF0aXZlICJDdXN0b21lcgogICAgICogSW5mb3JtYXRpb24iLyJUaWNrZXQgSW5mb3JtYXRpb24iIC0gc2VlIFJlc29sdmVXaWRnZXRCb3gncyBvd24KICAgICAqIGNvbW1lbnQpLiBUaGF0IG1vZHVsZSBvbmx5IGluaXRpYWxpemVzIHdpZGdldHMgcHJlc2VudCBhdCBwYWdlCiAgICAgKiBsb2FkLCB0aHJvdWdoIFpudW55J3Mgb3duIEVudi5BcHBsaWNhdGlvbiBtb2R1bGUgcmVnaXN0cmF0aW9uCiAgICAgKiBzeXN0ZW0gLSBhIHdpZGdldCBidWlsdCBhbmQgaW5zZXJ0ZWQgYnkgb3VyIG93biBKUyBhZnRlcndhcmQsCiAgICAgKiBsaWtlIHRoaXMgb25lLCBuZXZlciBnZXRzIHJlZ2lzdGVyZWQgYXQgYWxsLCBzbyBpdHMgdGl0bGUgd291bGQKICAgICAqIG5ldmVyIHJlc3BvbmQgdG8gY2xpY2tzLiBSYXRoZXIgdGhhbiBmaWdodCB0aGF0IHJlZ2lzdHJhdGlvbgogICAgICogc3lzdGVtIGZvciBhIGR5bmFtaWNhbGx5LWNyZWF0ZWQgZWxlbWVudCwgdGhpcyByZXBsaWNhdGVzIGl0cwogICAgICogZXhhY3QgYmVoYXZpb3IgKHNhbWUgY2xhc3Nlcywgc2FtZSBtYXgtaGVpZ2h0IGFuaW1hdGlvbikgYXMgYQogICAgICogc21hbGwsIHNlbGYtY29udGFpbmVkIGhhbmRsZXIgLSB0aGUgQ1NTIChNb2R1bGUuU2lkZWJhcldpZGdldC5jc3MpCiAgICAgKiBpcyBlbnRpcmVseSBjbGFzcy1kcml2ZW4gYW5kIG5lZWRzIG5vIGNvb3BlcmF0aW9uIGZyb20gWm51bnkncyBvd24KICAgICAqIEpTIHRvIHJlbmRlciBjb3JyZWN0bHkgZWl0aGVyIHdheS4KICAgICAqIEBwYXJhbSB7alF1ZXJ5fSAkV2lkZ2V0IC0gVGhlICIubW9kLm1vZFNpZGViYXJXaWRnZXQiIGVsZW1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEJpbmRTaWRlYmFyV2lkZ2V0VG9nZ2xlKCRXaWRnZXQpIHsKICAgICAgICB2YXIgJElubmVyID0gJFdpZGdldC5maW5kKCc+IC5pbm5lcicpLmZpcnN0KCk7CiAgICAgICAgJElubmVyLmZpbmQoJz4gLnNpZGViYXJXaWRnZXRUaXRsZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyICRDb250ZW50ID0gJElubmVyLmZpbmQoJz4gLnNpZGViYXJXaWRnZXRDb250ZW50JykuZmlyc3QoKTsKICAgICAgICAgICAgaWYgKCRJbm5lci5oYXNDbGFzcygnc2lkZWJhcldpZGdldENsb3NlZCcpKSB7CiAgICAgICAgICAgICAgICB2YXIgU2Nyb2xsSGVpZ2h0ID0gJENvbnRlbnRbMF0uc2Nyb2xsSGVpZ2h0ICsgMzA7CiAgICAgICAgICAgICAgICAkQ29udGVudC5jc3MoJ21heC1oZWlnaHQnLCBTY3JvbGxIZWlnaHQgKyAncHgnKTsKICAgICAgICAgICAgICAgICRJbm5lci5yZW1vdmVDbGFzcygnc2lkZWJhcldpZGdldENsb3NlZCcpOwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnQuY3NzKCdtYXgtaGVpZ2h0JywgJ3Vuc2V0Jyk7CiAgICAgICAgICAgICAgICB9LCAyNTApOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgJENvbnRlbnQuY3NzKCdtYXgtaGVpZ2h0JywgJzBweCcpOwogICAgICAgICAgICAgICAgJElubmVyLmFkZENsYXNzKCdzaWRlYmFyV2lkZ2V0Q2xvc2VkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRmluZHMgdGhlIG91dGVyIHdpZGdldCAiYm94IiB0byBoaWRlL21lYXN1cmUsIGdpdmVuIGFueSBlbGVtZW50CiAgICAgKiAgICAgICAgICAgICAgaW4gb3IgYXJvdW5kIGl0LiBabnVueSA3LjMuMSdzIEdVSSByZWRlc2lnbiB3cmFwcyBzaWRlYmFyIHdpZGdldHMKICAgICAqICAgICAgICAgICAgICAoQ3VzdG9tZXIgSW5mb3JtYXRpb24sIFRpY2tldCBJbmZvcm1hdGlvbiwgLi4uKSBpbiBhbiBvdXRlcgogICAgICogICAgICAgICAgICAgICIubW9kLm1vZFNpZGViYXJXaWRnZXQiIGNvbnRhaW5lciwgd2l0aCB0aGUgd2lkZ2V0J3Mgb3duIHRpdGxlCiAgICAgKiAgICAgICAgICAgICAgbW92ZWQgT1VUU0lERSB0aGUgb2xkICIuV2lkZ2V0U2ltcGxlIi8iLkhlYWRlciIgbWFya3VwIGludG8gYQogICAgICogICAgICAgICAgICAgIHNpYmxpbmcgIi5zaWRlYmFyV2lkZ2V0VGl0bGUiLiBTb21lIHJlZGVzaWduZWQgd2lkZ2V0cyAoZS5nLgogICAgICogICAgICAgICAgICAgIFRpY2tldCBJbmZvcm1hdGlvbikgZG9uJ3QgZXZlbiBoYXZlIGEgIi5XaWRnZXRTaW1wbGUiIGVsZW1lbnQKICAgICAqICAgICAgICAgICAgICBhdCBhbGwgYW55bW9yZS4gVGhpcyBjaGVja3MgdGhlIG5ldyB3cmFwcGVyIGZpcnN0LCB0aGVuIGZhbGxzCiAgICAgKiAgICAgICAgICAgICAgYmFjayB0byB0aGUgcHJlLTcuMy4xICIuV2lkZ2V0U2ltcGxlIiBjb252ZW50aW9uIChhcyBhbgogICAgICogICAgICAgICAgICAgIGFuY2VzdG9yLCBvciAtIGlmICRFbCBpdHNlbGYgaXMgdGhlIG91dGVyIGJveCAtIGEgZGVzY2VuZGFudCkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc29sdmVXaWRnZXRCb3goJEVsKSB7CiAgICAgICAgdmFyICRCb3ggPSAkRWwuY2xvc2VzdCgnLm1vZC5tb2RTaWRlYmFyV2lkZ2V0Jyk7CiAgICAgICAgaWYgKCRCb3gubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAkQm94OwogICAgICAgIH0KICAgICAgICAkQm94ID0gJEVsLmNsb3Nlc3QoJy5XaWRnZXRTaW1wbGUnKTsKICAgICAgICBpZiAoJEJveC5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuICRCb3g7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkRWwuaXMoJy5XaWRnZXRTaW1wbGUnKSA/ICRFbCA6ICRFbC5maW5kKCcuV2lkZ2V0U2ltcGxlJykuZmlyc3QoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRmluZHMgdGhlIHNpZGViYXIgY29udGFpbmVyIHRvIGluc2VydC9zZWFyY2ggd2lkZ2V0cyBpbi4gUHJlZmVycwogICAgICogICAgICAgICAgICAgIFpudW55IDcuMy4xJ3MgR1VJLXJlZGVzaWduICIuc2lkZWJhckNvbnRlbnQiLCBmYWxscyBiYWNrIHRvIHRoZQogICAgICogICAgICAgICAgICAgIHByZS03LjMuMSAiLlNpZGViYXJDb2x1bW4iLgogICAgICovCiAgICBmdW5jdGlvbiBHZXRTaWRlYmFyQ29udGFpbmVyKCkgewogICAgICAgIHZhciAkU2lkZWJhciA9ICQoJy5zaWRlYmFyQ29udGVudCcpLmZpcnN0KCk7CiAgICAgICAgaWYgKCRTaWRlYmFyLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gJFNpZGViYXI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkKCcuU2lkZWJhckNvbHVtbicpLmZpcnN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIGR5bmFtaWMgY3VzdG9tZXIgaW5mb3JtYXRpb24gd2lkZ2V0IGZvciB0aWNrZXQgY3JlYXRlIHBhZ2VzCiAgICAgKiAgICAgICAgICAgICAgKEFnZW50VGlja2V0UGhvbmUsIEFnZW50VGlja2V0RW1haWwsIEFnZW50VGlja2V0Q3VzdG9tZXIpCiAgICAgKiAgICAgICAgICAgICAgVGhlc2UgcGFnZXMgaGF2ZSBkeW5hbWljIGN1c3RvbWVyIHNlbGVjdGlvbiB2aWEgYXV0b2NvbXBsZXRlLgogICAgICovCiAgICBmdW5jdGlvbiBJbml0RHluYW1pY0N1c3RvbWVySW5mb1dpZGdldCgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwoKICAgICAgICBpZiAoIUNvbmZpZy5TaG93Q3VzdG9tZXJJbmZvV2lkZ2V0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEhpZGUgdGhlIG5hdGl2ZSAjQ3VzdG9tZXJJbmZvIHdpZGdldAogICAgICAgIGlmIChDb25maWcuSGlkZU5hdGl2ZUN1c3RvbWVySW5mbykgewogICAgICAgICAgICBIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvV2lkZ2V0QnlJZCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ3JlYXRlIGVtcHR5IHdpZGdldCB3aXRoIHBsYWNlaG9sZGVyCiAgICAgICAgdmFyICRFbXB0eVdpZGdldCA9IENyZWF0ZUVtcHR5Q3VzdG9tZXJJbmZvV2lkZ2V0KCk7CgogICAgICAgIC8vIEluc2VydCBpbnRvIHNpZGViYXIKICAgICAgICB2YXIgJFNpZGViYXIgPSBHZXRTaWRlYmFyQ29udGFpbmVyKCk7CiAgICAgICAgaWYgKCRTaWRlYmFyLmxlbmd0aCkgewogICAgICAgICAgICAkU2lkZWJhci5wcmVwZW5kKCRFbXB0eVdpZGdldCk7CiAgICAgICAgfQoKICAgICAgICAvLyBTdWJzY3JpYmUgdG8gWm51bnkncyBjdXN0b21lciBzZWxlY3Rpb24gZXZlbnQKICAgICAgICAvLyBUaGlzIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSBjdXN0b21lciBpcyBzZWxlY3RlZCBmcm9tIHRoZSBhdXRvY29tcGxldGUKICAgICAgICBpZiAoQ29yZS5BcHAgJiYgQ29yZS5BcHAuU3Vic2NyaWJlKSB7CiAgICAgICAgICAgIENvcmUuQXBwLlN1YnNjcmliZSgnRXZlbnQuQWdlbnQuQ3VzdG9tZXJTZWFyY2guR2V0Q3VzdG9tZXJJbmZvLkNhbGxiYWNrJywgZnVuY3Rpb24oQ3VzdG9tZXJJRCkgewogICAgICAgICAgICAgICAgLy8gQ3VzdG9tZXJJRCBpcyB0aGUgQ3VzdG9tZXJVc2VySUQgKGxvZ2luKSwgbm90IHRoZSBlbWFpbAogICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBmZXRjaCB0aGUgZW1haWwgZnJvbSB0aGUgYmFja2VuZAogICAgICAgICAgICAgICAgVXBkYXRlRHluYW1pY0N1c3RvbWVySW5mb1dpZGdldChDdXN0b21lcklEKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHNvIHdhdGNoIGZvciBjdXN0b21lciByZW1vdmFsICh3aGVuIFNlbGVjdGVkQ3VzdG9tZXJVc2VyIGJlY29tZXMgZW1wdHkpCiAgICAgICAgdmFyICRTZWxlY3RlZEN1c3RvbWVyVXNlciA9ICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpOwogICAgICAgIGlmICgkU2VsZWN0ZWRDdXN0b21lclVzZXIubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIFVzZSBNdXRhdGlvbk9ic2VydmVyIHRvIGRldGVjdCBjaGFuZ2VzIHRvIHRoZSBoaWRkZW4gaW5wdXQKICAgICAgICAgICAgdmFyIE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24obXV0YXRpb25zKSB7CiAgICAgICAgICAgICAgICBtdXRhdGlvbnMuZm9yRWFjaChmdW5jdGlvbihtdXRhdGlvbikgewogICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnYXR0cmlidXRlcycgJiYgbXV0YXRpb24uYXR0cmlidXRlTmFtZSA9PT0gJ3ZhbHVlJykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTmV3VmFsdWUgPSAkU2VsZWN0ZWRDdXN0b21lclVzZXIudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghTmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEN1c3RvbWVyIHdhcyByZW1vdmVkIC0gc2hvdyBlbXB0eSB3aWRnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3dFbXB0eUN1c3RvbWVySW5mb1dpZGdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBPYnNlcnZlci5vYnNlcnZlKCRTZWxlY3RlZEN1c3RvbWVyVXNlclswXSwgeyBhdHRyaWJ1dGVzOiB0cnVlIH0pOwoKICAgICAgICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIGRpcmVjdCB2YWx1ZSBjaGFuZ2VzIChmYWxsYmFjaykKICAgICAgICAgICAgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIGlmICghJCh0aGlzKS52YWwoKSkgewogICAgICAgICAgICAgICAgICAgIFNob3dFbXB0eUN1c3RvbWVySW5mb1dpZGdldCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEZhbGxiYWNrOiBXYXRjaCBmb3IgRE9NIGNoYW5nZXMgdG8gdGhlIG5hdGl2ZSB3aWRnZXQgY29udGVudAogICAgICAgIC8vIEluIGNhc2UgdGhlIGV2ZW50IGRvZXNuJ3QgZmlyZSByZWxpYWJseQogICAgICAgIHZhciAkTmF0aXZlV2lkZ2V0ID0gJCgnI0N1c3RvbWVySW5mbycpOwogICAgICAgIGlmICgkTmF0aXZlV2lkZ2V0Lmxlbmd0aCkgewogICAgICAgICAgICB2YXIgQ29udGVudE9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBuYXRpdmUgd2lkZ2V0IGhhcyBjb250ZW50IG5vdwogICAgICAgICAgICAgICAgdmFyICRDb250ZW50ID0gJE5hdGl2ZVdpZGdldC5maW5kKCcuQ29udGVudCcpOwogICAgICAgICAgICAgICAgdmFyIENvbnRlbnRUZXh0ID0gJENvbnRlbnQudGV4dCgpLnRyaW0oKTsKCiAgICAgICAgICAgICAgICAvLyBJZiBjb250ZW50IGlzIG5vdCAibm9uZSIgYW5kIG5vdCBlbXB0eSwgdHJ5IHRvIGV4dHJhY3QgY3VzdG9tZXIgZGF0YQogICAgICAgICAgICAgICAgaWYgKENvbnRlbnRUZXh0ICYmIENvbnRlbnRUZXh0ICE9PSAnbm9uZScgJiYgQ29udGVudFRleHQgIT09IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdub25lJykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gZ2V0IEN1c3RvbWVyVXNlcklEIGZyb20gdGhlIHBhZ2UKICAgICAgICAgICAgICAgICAgICB2YXIgQ3VzdG9tZXJVc2VySUQgPSAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlRHluYW1pY0N1c3RvbWVySW5mb1dpZGdldChDdXN0b21lclVzZXJJRCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciAkTmF0aXZlQ29udGVudCA9ICROYXRpdmVXaWRnZXQuZmluZCgnLkNvbnRlbnQnKTsKICAgICAgICAgICAgaWYgKCROYXRpdmVDb250ZW50Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgQ29udGVudE9ic2VydmVyLm9ic2VydmUoJE5hdGl2ZUNvbnRlbnRbMF0sIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBhIGN1c3RvbWVyIGlzIGFscmVhZHkgc2VsZWN0ZWQgKGUuZy4sIG9uIEFnZW50VGlja2V0Q3VzdG9tZXIgd2hlbiBlZGl0aW5nIGV4aXN0aW5nIHRpY2tldCkKICAgICAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgdGhlIHBhZ2UgbG9hZHMgd2l0aCBhIHByZS1zZWxlY3RlZCBjdXN0b21lcgogICAgICAgIHZhciAkSW5pdGlhbEN1c3RvbWVyID0gJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyk7CiAgICAgICAgaWYgKCRJbml0aWFsQ3VzdG9tZXIubGVuZ3RoICYmICRJbml0aWFsQ3VzdG9tZXIudmFsKCkpIHsKICAgICAgICAgICAgVXBkYXRlRHluYW1pY0N1c3RvbWVySW5mb1dpZGdldCgkSW5pdGlhbEN1c3RvbWVyLnZhbCgpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEhpZGUgdGhlIG5hdGl2ZSBDdXN0b21lckluZm8gd2lkZ2V0IGJ5IElEIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlcykKICAgICAqLwogICAgZnVuY3Rpb24gSGlkZU5hdGl2ZUN1c3RvbWVySW5mb1dpZGdldEJ5SWQoKSB7CiAgICAgICAgZnVuY3Rpb24gSGlkZVdpZGdldCgpIHsKICAgICAgICAgICAgLy8gT24gdGlja2V0IGNyZWF0ZSBwYWdlcywgdGhlIHdpZGdldCBoYXMgSUQgI0N1c3RvbWVySW5mbwogICAgICAgICAgICB2YXIgJE5hdGl2ZVdpZGdldCA9ICQoJyNDdXN0b21lckluZm8nKTsKICAgICAgICAgICAgaWYgKCROYXRpdmVXaWRnZXQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgaXQncyBub3Qgb3VyIHdpZGdldAogICAgICAgICAgICAgICAgaWYgKCEkTmF0aXZlV2lkZ2V0LmlzKCcjQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0JykgJiYKICAgICAgICAgICAgICAgICAgICAhJE5hdGl2ZVdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSGlkZSB0aGUgd2hvbGUgb3V0ZXIgYm94LCBub3QganVzdCAjQ3VzdG9tZXJJbmZvIGl0c2VsZjoKICAgICAgICAgICAgICAgICAgICAvLyBzaW5jZSBabnVueSA3LjMuMSwgI0N1c3RvbWVySW5mbydzIHRpdGxlIGxpdmVzIGluIGEgc2libGluZwogICAgICAgICAgICAgICAgICAgIC8vICIuc2lkZWJhcldpZGdldFRpdGxlIiwgd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGxlZnQgYmVoaW5kCiAgICAgICAgICAgICAgICAgICAgLy8gYXMgYW4gZW1wdHktbG9va2luZyBoZWFkZXIgd2l0aCBub3RoaW5nIHVuZGVybmVhdGguCiAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZVdpZGdldEJveCgkTmF0aXZlV2lkZ2V0KS5hZGRDbGFzcygnQ29sbGFiSGlkZGVuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFJ1biBpbW1lZGlhdGVseSBhbmQgd2l0aCBkZWxheXMKICAgICAgICBIaWRlV2lkZ2V0KCk7CiAgICAgICAgc2V0VGltZW91dChIaWRlV2lkZ2V0LCAxMDApOwogICAgICAgIHNldFRpbWVvdXQoSGlkZVdpZGdldCwgNTAwKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGFuIGVtcHR5IGN1c3RvbWVyIGluZm8gd2lkZ2V0IHdpdGggcGxhY2Vob2xkZXIKICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlRW1wdHlDdXN0b21lckluZm9XaWRnZXQoKSB7CiAgICAgICAgLy8gTmF0aXZlIHN0cnVjdHVyZSAoWm51bnkgNy4zLjErIHJlZGVzaWduIC0gc2VlIFJlc29sdmVXaWRnZXRCb3gncwogICAgICAgIC8vIG93biBjb21tZW50IGFuZCBNb2R1bGUuU2lkZWJhcldpZGdldC5qcy8uY3NzKSwgbm90IHRoZSBvbGRlcgogICAgICAgIC8vIFdpZGdldFNpbXBsZS9IZWFkZXIgcGF0dGVybiAtIG1hdGNoZXMgd2hhdCB0aGUgcmVhbCBuYXRpdmUKICAgICAgICAvLyAiQ3VzdG9tZXIgSW5mb3JtYXRpb24iLyJUaWNrZXQgSW5mb3JtYXRpb24iIHdpZGdldHMgYWN0dWFsbHkKICAgICAgICAvLyB1c2UsIGluc3RlYWQgb2YgYW4gb3V0ZGF0ZWQgcHJlLTcuMy4xIGxvb2sgd2l0aCBhIGRpZmZlcmVudAogICAgICAgIC8vIGhlYWRlciBiYWNrZ3JvdW5kLCBhcnJvdyBpY29uIGFuZCBhbmltYXRpb24uCiAgICAgICAgdmFyICRXaWRnZXQgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsICdDb2xsYWJDdXN0b21lckluZm9XaWRnZXQnKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ21vZCBtb2RTaWRlYmFyV2lkZ2V0IENvbGxhYkN1c3RvbWVySW5mb1dpZGdldC0tZW1wdHknKQogICAgICAgICAgICAuYXR0cignZGF0YS1jdXN0b21lci1lbWFpbCcsICcnKQogICAgICAgICAgICAuYXR0cignZGF0YS1jdXN0b21lci1sb2dpbicsICcnKTsKCiAgICAgICAgdmFyICRJbm5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ2lubmVyJyk7CgogICAgICAgIHZhciAkVGl0bGUgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdzaWRlYmFyV2lkZ2V0VGl0bGUnKQogICAgICAgICAgICAuYXBwZW5kKCc8aDM+JyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDdXN0b21lciBJbmZvcm1hdGlvbicpICsgJzwvaDM+Jyk7CgogICAgICAgIHZhciAkQ29udGVudCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ3NpZGViYXJXaWRnZXRDb250ZW50Jyk7CgogICAgICAgIHZhciAkUGxhY2Vob2xkZXIgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19wbGFjZWhvbGRlcicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxpIGNsYXNzPSJmYSBmYS11c2VyLWNpcmNsZSI+PC9pPicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxzcGFuPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gY3VzdG9tZXIgc2VsZWN0ZWQnKSArICc8L3NwYW4+JykKICAgICAgICAgICAgLmFwcGVuZCgnPHNtYWxsPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgdG8gc2VlIGRldGFpbHMnKSArICc8L3NtYWxsPicpOwoKICAgICAgICAkQ29udGVudC5hcHBlbmQoJFBsYWNlaG9sZGVyKTsKICAgICAgICAkSW5uZXIuYXBwZW5kKCRUaXRsZSwgJENvbnRlbnQpOwogICAgICAgICRXaWRnZXQuYXBwZW5kKCRJbm5lcik7CgogICAgICAgIEJpbmRTaWRlYmFyV2lkZ2V0VG9nZ2xlKCRXaWRnZXQpOwoKICAgICAgICByZXR1cm4gJFdpZGdldDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyBlbXB0eSBwbGFjZWhvbGRlciBpbiB0aGUgd2lkZ2V0CiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dFbXB0eUN1c3RvbWVySW5mb1dpZGdldCgpIHsKICAgICAgICB2YXIgJFdpZGdldCA9ICQoJyNDb2xsYWJDdXN0b21lckluZm9XaWRnZXQnKTsKICAgICAgICBpZiAoISRXaWRnZXQubGVuZ3RoKSByZXR1cm47CgogICAgICAgICRXaWRnZXQuYWRkQ2xhc3MoJ0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldC0tZW1wdHknKTsKICAgICAgICAkV2lkZ2V0LmF0dHIoJ2RhdGEtY3VzdG9tZXItZW1haWwnLCAnJyk7CiAgICAgICAgJFdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWxvZ2luJywgJycpOwoKICAgICAgICB2YXIgJENvbnRlbnQgPSAkV2lkZ2V0LmZpbmQoJy5zaWRlYmFyV2lkZ2V0Q29udGVudCcpOwogICAgICAgICRDb250ZW50LmVtcHR5KCk7CgogICAgICAgIHZhciAkUGxhY2Vob2xkZXIgPSAkKCc8ZGl2PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19wbGFjZWhvbGRlcicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxpIGNsYXNzPSJmYSBmYS11c2VyLWNpcmNsZSI+PC9pPicpCiAgICAgICAgICAgIC5hcHBlbmQoJzxzcGFuPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gY3VzdG9tZXIgc2VsZWN0ZWQnKSArICc8L3NwYW4+JykKICAgICAgICAgICAgLmFwcGVuZCgnPHNtYWxsPicgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgdG8gc2VlIGRldGFpbHMnKSArICc8L3NtYWxsPicpOwoKICAgICAgICAkQ29udGVudC5hcHBlbmQoJFBsYWNlaG9sZGVyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBkeW5hbWljIGN1c3RvbWVyIGluZm8gd2lkZ2V0IHdpdGggY3VzdG9tZXIgZGF0YQogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyVXNlcklEIC0gVGhlIGN1c3RvbWVyIHVzZXIgbG9naW4vSUQKICAgICAqLwogICAgZnVuY3Rpb24gVXBkYXRlRHluYW1pY0N1c3RvbWVySW5mb1dpZGdldChDdXN0b21lclVzZXJJRCkgewogICAgICAgIGlmICghQ3VzdG9tZXJVc2VySUQpIHsKICAgICAgICAgICAgU2hvd0VtcHR5Q3VzdG9tZXJJbmZvV2lkZ2V0KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciAkV2lkZ2V0ID0gJCgnI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCcpOwogICAgICAgIGlmICghJFdpZGdldC5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlcXVlc3QKICAgICAgICBpZiAoRHluYW1pY1dpZGdldFBlbmRpbmdSZXF1ZXN0KSB7CiAgICAgICAgICAgIER5bmFtaWNXaWRnZXRQZW5kaW5nUmVxdWVzdC5hYm9ydCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gU2hvdyBsb2FkaW5nIHN0YXRlCiAgICAgICAgJFdpZGdldC5yZW1vdmVDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0LS1lbXB0eScpOwogICAgICAgIHZhciAkQ29udGVudCA9ICRXaWRnZXQuZmluZCgnLnNpZGViYXJXaWRnZXRDb250ZW50Jyk7CiAgICAgICAgJENvbnRlbnQuaHRtbCgnPGRpdiBjbGFzcz0iQ29sbGFiQ3VzdG9tZXJJbmZvX19sb2FkaW5nIj48aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+PC9kaXY+Jyk7CgogICAgICAgIC8vIEZldGNoIGN1c3RvbWVyIGRhdGEgZnJvbSBiYWNrZW5kCiAgICAgICAgLy8gRm9yVGlja2V0Q3JlYXRlPTEgc2tpcHMgdGlja2V0IHBlcm1pc3Npb24gY2hlY2sgKGFnZW50IGlzIGNyZWF0aW5nIGEgbmV3IHRpY2tldCkKICAgICAgICBEeW5hbWljV2lkZ2V0UGVuZGluZ1JlcXVlc3QgPSAkLmFqYXgoewogICAgICAgICAgICB1cmw6IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgdHlwZTogJ1BPU1QnLAogICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudENvbGxhYm9yYXRpb25BSkFYJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldEN1c3RvbWVyRGF0YScsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbjogQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICBGb3JUaWNrZXRDcmVhdGU6IDEKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZGF0YVR5cGU6ICdqc29uJywKICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIER5bmFtaWNXaWRnZXRQZW5kaW5nUmVxdWVzdCA9IG51bGw7CgogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MgJiYgUmVzcG9uc2UuRGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBDdXN0b21lckRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBSZXNwb25zZS5EYXRhLlVzZXJFbWFpbCB8fCBDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgbG9naW46IFJlc3BvbnNlLkRhdGEuVXNlckxvZ2luIHx8IEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBSZXNwb25zZS5EYXRhLlVzZXJGdWxsbmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueTogUmVzcG9uc2UuRGF0YS5Vc2VyQ3VzdG9tZXJJRCB8fCAnJwogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRXaWRnZXQuYXR0cignZGF0YS1jdXN0b21lci1lbWFpbCcsIEN1c3RvbWVyRGF0YS5lbWFpbCk7CiAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWxvZ2luJywgQ3VzdG9tZXJEYXRhLmxvZ2luKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGV4aXN0aW5nIFBvcHVsYXRlQ3VzdG9tZXJJbmZvV2lkZ2V0IGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgICAgLy8gSXQgbmVlZHMgYSBmaWVsZHNldCB3aXRoIGNsYXNzIENvbGxhYkN1c3RvbWVySW5mbyBpbiB0aGUgQ29udGVudAogICAgICAgICAgICAgICAgICAgIHZhciAkQ29udGVudEFyZWEgPSAkV2lkZ2V0LmZpbmQoJy5zaWRlYmFyV2lkZ2V0Q29udGVudCcpOwogICAgICAgICAgICAgICAgICAgICRDb250ZW50QXJlYS5odG1sKCc8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93IENvbGxhYkN1c3RvbWVySW5mbyI+PGRpdiBjbGFzcz0iQ29sbGFiQ3VzdG9tZXJJbmZvX19sb2FkaW5nIj48aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+PC9kaXY+PC9maWVsZHNldD4nKTsKCiAgICAgICAgICAgICAgICAgICAgUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQoJFdpZGdldCwgQ3VzdG9tZXJEYXRhKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3Igb3Igbm8gZGF0YSAtIHNob3cgZXJyb3Igc3RhdGUuIEV2ZXJ5IEVycm9yCiAgICAgICAgICAgICAgICAgICAgLy8gR2V0Q3VzdG9tZXJEYXRhIGN1cnJlbnRseSByZXR1cm5zIGlzIGEgc3RhdGljIHN0cmluZwogICAgICAgICAgICAgICAgICAgIC8vIChjaGVja2VkIGFsbCBjYWxsIHNpdGVzIGluIEFnZW50Q29sbGFib3JhdGlvbkFKQVgucG0pLAogICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBidWlsZGluZyB0aGlzIHZpYSAuaHRtbCgpIHN0cmluZyBjb25jYXRlbmF0aW9uCiAgICAgICAgICAgICAgICAgICAgLy8gbWVhbnMgYW55IGZ1dHVyZSBTdWJhY3Rpb24gdGhhdCBldmVyIGVjaG9lcyBhCiAgICAgICAgICAgICAgICAgICAgLy8gZHluYW1pYyB2YWx1ZSBpbnRvIEVycm9yIHdvdWxkIGJlIGFuIGluc3RhbnQgRE9NCiAgICAgICAgICAgICAgICAgICAgLy8gWFNTIHdpdGggbm8gY2xpZW50LXNpZGUgY2hhbmdlIG5lZWRlZCAtIHVzZSAudGV4dCgpCiAgICAgICAgICAgICAgICAgICAgLy8gb24gdGhlIG1lc3NhZ2UgaXRzZWxmIGluc3RlYWQsIHVuY29uZGl0aW9uYWxseS4KICAgICAgICAgICAgICAgICAgICB2YXIgJEVycm9yID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19lcnJvcicpOwogICAgICAgICAgICAgICAgICAgICRFcnJvci5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZScpKTsKICAgICAgICAgICAgICAgICAgICAkRXJyb3IuYXBwZW5kKCQoJzxzcGFuPicpLnRleHQoJyAnICsgKFJlc3BvbnNlICYmIFJlc3BvbnNlLkVycm9yID8gUmVzcG9uc2UuRXJyb3IgOiAnRmFpbGVkIHRvIGxvYWQgY3VzdG9tZXIgZGF0YScpKSk7CiAgICAgICAgICAgICAgICAgICAgJENvbnRlbnQuZW1wdHkoKS5hcHBlbmQoJEVycm9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhociwgc3RhdHVzKSB7CiAgICAgICAgICAgICAgICBEeW5hbWljV2lkZ2V0UGVuZGluZ1JlcXVlc3QgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gJ2Fib3J0JykgewogICAgICAgICAgICAgICAgICAgICRDb250ZW50Lmh0bWwoJzxkaXYgY2xhc3M9IkNvbGxhYkN1c3RvbWVySW5mb19fZXJyb3IiPicgKwogICAgICAgICAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSI+PC9pPiBGYWlsZWQgdG8gbG9hZCBjdXN0b21lciBkYXRhJyArCiAgICAgICAgICAgICAgICAgICAgICAgICc8L2Rpdj4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIHRoZSBjdXN0b21lciBpbmZvcm1hdGlvbiB3aWRnZXQKICAgICAqLwogICAgZnVuY3Rpb24gSW5pdEN1c3RvbWVySW5mb1dpZGdldCgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwoKICAgICAgICBpZiAoIUNvbmZpZy5TaG93Q3VzdG9tZXJJbmZvV2lkZ2V0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIE9ubHkgb24gdGlja2V0IHpvb20gcGFnZXMKICAgICAgICBpZiAoIUNvcmUuQ29uZmlnLkdldCgnVGlja2V0SUQnKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBpbml0aWFsaXphdGlvbgogICAgICAgIGlmIChDdXN0b21lckluZm9XaWRnZXRJbml0aWFsaXplZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIEN1c3RvbWVySW5mb1dpZGdldEluaXRpYWxpemVkID0gdHJ1ZTsKCiAgICAgICAgLy8gSGlkZSBuYXRpdmUgd2lkZ2V0IGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoQ29uZmlnLkhpZGVOYXRpdmVDdXN0b21lckluZm8pIHsKICAgICAgICAgICAgSGlkZU5hdGl2ZUN1c3RvbWVySW5mb1dpZGdldCgpOwogICAgICAgIH0KCiAgICAgICAgLy8gR2V0IGN1c3RvbWVyIGRhdGEgZnJvbSBwYWdlCiAgICAgICAgdmFyIEN1c3RvbWVyRGF0YSA9IEdldEN1c3RvbWVyRGF0YUZyb21QYWdlRm9yV2lkZ2V0KCk7CiAgICAgICAgaWYgKCFDdXN0b21lckRhdGEgfHwgIUN1c3RvbWVyRGF0YS5lbWFpbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBDcmVhdGUgd2lkZ2V0IGNvbnRhaW5lcgogICAgICAgIHZhciAkV2lkZ2V0ID0gQ3JlYXRlQ3VzdG9tZXJJbmZvV2lkZ2V0RWxlbWVudChDdXN0b21lckRhdGEpOwoKICAgICAgICAvLyBJbnNlcnQgYXQgVE9QIG9mIHNpZGViYXIgKGJlZm9yZSBhbGwgb3RoZXIgd2lkZ2V0cykKICAgICAgICB2YXIgJFNpZGViYXIgPSBHZXRTaWRlYmFyQ29udGFpbmVyKCk7CiAgICAgICAgaWYgKCRTaWRlYmFyLmxlbmd0aCkgewogICAgICAgICAgICAkU2lkZWJhci5wcmVwZW5kKCRXaWRnZXQpOwogICAgICAgIH0KCiAgICAgICAgLy8gUG9wdWxhdGUgd2l0aCBkYXRhCiAgICAgICAgUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQoJFdpZGdldCwgQ3VzdG9tZXJEYXRhKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gSGlkZSB0aGUgbmF0aXZlIFpudW55IEN1c3RvbWVyIEluZm9ybWF0aW9uIHdpZGdldAogICAgICogICAgICAgICAgICAgIE9OTFkgaGlkZXMgIkt1bmRlbmluZm9ybWF0aW9uIiAvICJDdXN0b21lciBJbmZvcm1hdGlvbiIgLSBOT1QgIlRpY2tldC1JbmZvcm1hdGlvbmVuIgogICAgICovCiAgICBmdW5jdGlvbiBIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvV2lkZ2V0KCkgewogICAgICAgIC8vIEZ1bmN0aW9uIHRvIGhpZGUgdGhlIHdpZGdldCBvbmNlIGZvdW5kCiAgICAgICAgZnVuY3Rpb24gSGlkZVdpZGdldCgpIHsKICAgICAgICAgICAgLy8gQXBwcm9hY2ggMTogV2lkZ2V0IGJ5IGhlYWRlciB0ZXh0IChtb3N0IHJlbGlhYmxlIC0gR2VybWFuL0VuZ2xpc2gpCiAgICAgICAgICAgIC8vIEJlIHZlcnkgc3BlY2lmaWM6IG9ubHkgZXhhY3QgbWF0Y2hlcyBmb3IgY3VzdG9tZXIgaW5mbyB3aWRnZXQgdGl0bGVzLgogICAgICAgICAgICAvLyBTaW5jZSBabnVueSA3LjMuMSwgdGhlIHRpdGxlIGxpdmVzIGluICIuc2lkZWJhcldpZGdldFRpdGxlIGgzIgogICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBvbGQgIi5XaWRnZXRTaW1wbGUgLkhlYWRlciBoMiIgLSBjaGVjayBib3RoLgogICAgICAgICAgICAkKCcuU2lkZWJhckNvbHVtbiAuV2lkZ2V0U2ltcGxlIC5IZWFkZXIgaDIsIC5zaWRlYmFyQ29udGVudCAuc2lkZWJhcldpZGdldFRpdGxlIGgzJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBUZXh0ID0gJCh0aGlzKS50ZXh0KCkudHJpbSgpOwogICAgICAgICAgICAgICAgLy8gT25seSBoaWRlIGlmIGhlYWRlciBtYXRjaGVzIGN1c3RvbWVyIGluZm9ybWF0aW9uIGV4YWN0bHkKICAgICAgICAgICAgICAgIC8vIE5PVCAiVGlja2V0LUluZm9ybWF0aW9uZW4iIG9yIHNpbWlsYXIKICAgICAgICAgICAgICAgIGlmIChUZXh0ID09PSAnQ3VzdG9tZXIgSW5mb3JtYXRpb24nIHx8CiAgICAgICAgICAgICAgICAgICAgVGV4dCA9PT0gJ0t1bmRlbmluZm9ybWF0aW9uJyB8fAogICAgICAgICAgICAgICAgICAgIFRleHQgPT09ICdDdXN0b21lciBVc2VyIEluZm9ybWF0aW9uJyB8fAogICAgICAgICAgICAgICAgICAgIFRleHQgPT09ICdLdW5kZW5iZW51dHplci1JbmZvcm1hdGlvbmVuJykgewogICAgICAgICAgICAgICAgICAgIHZhciAkV2lkZ2V0ID0gUmVzb2x2ZVdpZGdldEJveCgkKHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBoaWRlIG91ciBvd24gd2lkZ2V0CiAgICAgICAgICAgICAgICAgICAgaWYgKCRXaWRnZXQubGVuZ3RoICYmCiAgICAgICAgICAgICAgICAgICAgICAgICEkV2lkZ2V0LmlzKCcjQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0JykgJiYKICAgICAgICAgICAgICAgICAgICAgICAgISRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mbycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkV2lkZ2V0LmFkZENsYXNzKCdDb2xsYWJIaWRkZW4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gQXBwcm9hY2ggMjogQXN5bmMgd2lkZ2V0IGJ5IHNwZWNpZmljIElEIHBhdHRlcm4KICAgICAgICAgICAgLy8gWm51bnkgdXNlcyBmb3JtYXQgbGlrZSAiQXN5bmNfMDIwMC1DdXN0b21lckluZm9ybWF0aW9uIgogICAgICAgICAgICAkKCdbaWQqPSItQ3VzdG9tZXJJbmZvcm1hdGlvbiJdJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciAkV2lkZ2V0ID0gUmVzb2x2ZVdpZGdldEJveCgkKHRoaXMpKTsKICAgICAgICAgICAgICAgIGlmICgkV2lkZ2V0Lmxlbmd0aCAmJgogICAgICAgICAgICAgICAgICAgICEkV2lkZ2V0LmlzKCcjQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0JykgJiYKICAgICAgICAgICAgICAgICAgICAhJFdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5hZGRDbGFzcygnQ29sbGFiSGlkZGVuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gUnVuIGltbWVkaWF0ZWx5CiAgICAgICAgSGlkZVdpZGdldCgpOwoKICAgICAgICAvLyBBbHNvIHJ1biBhZnRlciBhIGRlbGF5IChmb3IgYXN5bmMgd2lkZ2V0cykKICAgICAgICBzZXRUaW1lb3V0KEhpZGVXaWRnZXQsIDUwMCk7CiAgICAgICAgc2V0VGltZW91dChIaWRlV2lkZ2V0LCAxNTAwKTsKCiAgICAgICAgLy8gVXNlIE11dGF0aW9uT2JzZXJ2ZXIgdG8gY2F0Y2ggYXN5bmMgd2lkZ2V0IGxvYWRpbmcKICAgICAgICB2YXIgT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpIHsKICAgICAgICAgICAgSGlkZVdpZGdldCgpOwogICAgICAgIH0pOwogICAgICAgIE9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuYm9keSwgeyBjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWUgfSk7CgogICAgICAgIC8vIFN0b3Agb2JzZXJ2aW5nIGFmdGVyIDUgc2Vjb25kcwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIE9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9LCA1MDAwKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1c3RvbWVyIGRhdGEgZnJvbSBwYWdlIGZvciB0aGUgd2lkZ2V0CiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldEN1c3RvbWVyRGF0YUZyb21QYWdlRm9yV2lkZ2V0KCkgewogICAgICAgIHZhciBDb25maWcgPSBDb2xsYWIuR2V0Q29uZmlnKCk7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIGxvZ2luOiAnJywKICAgICAgICAgICAgbmFtZTogJycsCiAgICAgICAgICAgIGVtYWlsOiAnJywKICAgICAgICAgICAgY29tcGFueTogJycKICAgICAgICB9OwoKICAgICAgICAvLyBQcmltYXJ5IHNvdXJjZTogU2VydmVyLXNpZGUgaW5qZWN0ZWQgZGF0YSBmcm9tIE91dHB1dCBGaWx0ZXIKICAgICAgICBpZiAoQ29uZmlnLkN1c3RvbWVyRW1haWwpIHsKICAgICAgICAgICAgRGF0YS5lbWFpbCA9IENvbmZpZy5DdXN0b21lckVtYWlsOwogICAgICAgICAgICBEYXRhLmxvZ2luID0gQ29uZmlnLkN1c3RvbWVyTG9naW4gfHwgQ29uZmlnLkN1c3RvbWVyRW1haWw7CiAgICAgICAgICAgIERhdGEubmFtZSA9IENvbmZpZy5DdXN0b21lck5hbWUgfHwgJyc7CiAgICAgICAgICAgIHJldHVybiBEYXRhOwogICAgICAgIH0KCiAgICAgICAgLy8gRmFsbGJhY2s6IFRyeSB0byBnZXQgZnJvbSBleGlzdGluZyB0aWNrZXQgaW5mbwogICAgICAgIC8vIE1ldGhvZCAxOiBGcm9tIHNpZGViYXIgbGlua3MKICAgICAgICB2YXIgJEN1c3RvbWVyTGluayA9IEdldFNpZGViYXJDb250YWluZXIoKS5maW5kKCdhW2hyZWYqPSJBZ2VudEN1c3RvbWVySW5mb3JtYXRpb25DZW50ZXIiXScpLmZpcnN0KCk7CiAgICAgICAgaWYgKCRDdXN0b21lckxpbmsubGVuZ3RoKSB7CiAgICAgICAgICAgIERhdGEubmFtZSA9ICRDdXN0b21lckxpbmsudGV4dCgpLnRyaW0oKTsKCiAgICAgICAgICAgIC8vIEV4dHJhY3QgQ3VzdG9tZXJVc2VyTG9naW4gZnJvbSBVUkwKICAgICAgICAgICAgdmFyIEhyZWYgPSAkQ3VzdG9tZXJMaW5rLmF0dHIoJ2hyZWYnKSB8fCAnJzsKICAgICAgICAgICAgdmFyIE1hdGNoID0gSHJlZi5tYXRjaCgvQ3VzdG9tZXJVc2VyTG9naW49KFteJjtdKykvKTsKICAgICAgICAgICAgaWYgKE1hdGNoKSB7CiAgICAgICAgICAgICAgICBEYXRhLmxvZ2luID0gZGVjb2RlVVJJQ29tcG9uZW50KE1hdGNoWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gTWV0aG9kIDI6IExvb2sgZm9yIGVtYWlsIGluIHNpZGViYXIgdGV4dAogICAgICAgIGlmICghRGF0YS5lbWFpbCkgewogICAgICAgICAgICBHZXRTaWRlYmFyQ29udGFpbmVyKCkuZmluZCgnLlZhbHVlLCB0ZCwgLkZpZWxkVmFsdWUnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyIFRleHQgPSAkKHRoaXMpLnRleHQoKTsKICAgICAgICAgICAgICAgIHZhciBFbWFpbE1hdGNoID0gVGV4dC5tYXRjaCgvW1x3Li1dK0BbXHcuLV0rXC5cdysvKTsKICAgICAgICAgICAgICAgIGlmIChFbWFpbE1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgRGF0YS5lbWFpbCA9IEVtYWlsTWF0Y2hbMF07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBicmVhawogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIE1ldGhvZCA0OiBGcm9tIGV4aXN0aW5nIENvbGxhYldpZGdldCBjb250YWluZXIKICAgICAgICB2YXIgJENvbGxhYldpZGdldCA9ICQoJyNDb2xsYWJXaWRnZXQnKTsKICAgICAgICBpZiAoJENvbGxhYldpZGdldC5sZW5ndGggJiYgJENvbGxhYldpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWVtYWlsJykpIHsKICAgICAgICAgICAgRGF0YS5lbWFpbCA9ICRDb2xsYWJXaWRnZXQuYXR0cignZGF0YS1jdXN0b21lci1lbWFpbCcpOwogICAgICAgIH0KCiAgICAgICAgLy8gVXNlIGVtYWlsIGFzIGxvZ2luIGZhbGxiYWNrCiAgICAgICAgaWYgKCFEYXRhLmxvZ2luICYmIERhdGEuZW1haWwpIHsKICAgICAgICAgICAgRGF0YS5sb2dpbiA9IERhdGEuZW1haWw7CiAgICAgICAgfQoKICAgICAgICAvLyBVc2UgbG9naW4gYXMgZW1haWwgZmFsbGJhY2sgKGlmIGxvZ2luIGxvb2tzIGxpa2UgZW1haWwpCiAgICAgICAgaWYgKCFEYXRhLmVtYWlsICYmIERhdGEubG9naW4gJiYgRGF0YS5sb2dpbi5pbmRleE9mKCdAJykgPiAtMSkgewogICAgICAgICAgICBEYXRhLmVtYWlsID0gRGF0YS5sb2dpbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBEYXRhOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgdGhlIGN1c3RvbWVyIGluZm8gd2lkZ2V0IGVsZW1lbnQgKG1hdGNoaW5nIG5hdGl2ZSBabnVueSBzdHJ1Y3R1cmUpCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZUN1c3RvbWVySW5mb1dpZGdldEVsZW1lbnQoQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgLy8gTmF0aXZlIHN0cnVjdHVyZSAoWm51bnkgNy4zLjErIHJlZGVzaWduIC0gc2VlCiAgICAgICAgLy8gQmluZFNpZGViYXJXaWRnZXRUb2dnbGUvUmVzb2x2ZVdpZGdldEJveCdzIG93biBjb21tZW50cyksCiAgICAgICAgLy8gbWF0Y2hpbmcgd2hhdCB0aGUgcmVhbCBuYXRpdmUgIkN1c3RvbWVyIEluZm9ybWF0aW9uIiB3aWRnZXQKICAgICAgICAvLyAoY3VycmVudGx5IGhpZGRlbiBieSBIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvV2lkZ2V0KSBhbmQKICAgICAgICAvLyAiVGlja2V0IEluZm9ybWF0aW9uIiBhY3R1YWxseSB1c2UgLSBub3QgdGhlIG9sZGVyCiAgICAgICAgLy8gV2lkZ2V0U2ltcGxlL0hlYWRlciBwYXR0ZXJuLCB3aGljaCBsb29rcyB2aXNpYmx5IGRpZmZlcmVudAogICAgICAgIC8vIChoZWFkZXIgYmFja2dyb3VuZCwgYXJyb3cgaWNvbiBhbmQgYW5pbWF0aW9uIGFsbCBkaWZmZXIpLgogICAgICAgIHZhciAkV2lkZ2V0ID0gJCgnPGRpdj4nKQogICAgICAgICAgICAuYXR0cignaWQnLCAnQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0JykKICAgICAgICAgICAgLmFkZENsYXNzKCdtb2QgbW9kU2lkZWJhcldpZGdldCcpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWN1c3RvbWVyLWVtYWlsJywgQ3VzdG9tZXJEYXRhLmVtYWlsKQogICAgICAgICAgICAuYXR0cignZGF0YS1jdXN0b21lci1sb2dpbicsIEN1c3RvbWVyRGF0YS5sb2dpbik7CgogICAgICAgIHZhciAkSW5uZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdpbm5lcicpOwoKICAgICAgICB2YXIgJFRpdGxlID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnc2lkZWJhcldpZGdldFRpdGxlJykuYXBwZW5kKCc8aDM+S3VuZGVuaW5mb3JtYXRpb248L2gzPicpOwoKICAgICAgICB2YXIgJENvbnRlbnQgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdzaWRlYmFyV2lkZ2V0Q29udGVudCcpOwoKICAgICAgICAvLyBMb2FkaW5nIHN0YXRlIGluc2lkZSBmaWVsZHNldAogICAgICAgIHZhciAkRmllbGRzZXQgPSAkKCc8ZmllbGRzZXQ+JykuYWRkQ2xhc3MoJ1RhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgTmFycm93IENvbGxhYkN1c3RvbWVySW5mbycpOwogICAgICAgICRGaWVsZHNldC5hcHBlbmQoCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJDdXN0b21lckluZm9fX2xvYWRpbmciIHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjtwYWRkaW5nOjIwcHg7Ij4nICsKICAgICAgICAgICAgJzxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT4nICsKICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICApOwoKICAgICAgICAkQ29udGVudC5hcHBlbmQoJEZpZWxkc2V0KTsKICAgICAgICAkSW5uZXIuYXBwZW5kKCRUaXRsZSwgJENvbnRlbnQpOwogICAgICAgICRXaWRnZXQuYXBwZW5kKCRJbm5lcik7CgogICAgICAgIEJpbmRTaWRlYmFyV2lkZ2V0VG9nZ2xlKCRXaWRnZXQpOwoKICAgICAgICByZXR1cm4gJFdpZGdldDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUG9wdWxhdGUgdGhlIGN1c3RvbWVyIGluZm8gd2lkZ2V0IHdpdGggZGF0YQogICAgICogICAgICAgICAgICAgIFVzZXMgc2FtZSBzdHJ1Y3R1cmUgYXMgSGVhZGVyVXNlckJhZGdlIChDb2xsYWJVc2VyQmFkZ2UgY2xhc3NlcykKICAgICAqLwogICAgZnVuY3Rpb24gUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQoJFdpZGdldCwgQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgdmFyICRGaWVsZHNldCA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mbycpOwoKICAgICAgICAvLyBDbGVhciBsb2FkaW5nIHN0YXRlLiBObyAuQ2xlYXIgcGxhY2Vob2xkZXIgbmVlZGVkIC0gdGhhdCdzIGEKICAgICAgICAvLyBmbG9hdC1jbGVhcmluZyBjb252ZW50aW9uLCBpcnJlbGV2YW50IGhlcmUgc2luY2UgdGhlIGZpZWxkc2V0CiAgICAgICAgLy8gKG5hdGl2ZSAuVGFibGVMaWtlIGxheW91dCkgaXMgZmxleCwgbm90IGZsb2F0LWJhc2VkOyBpdCB3b3VsZAogICAgICAgIC8vIG90aGVyd2lzZSBzaXQgYXMgYW4gZW1wdHkgY2hpbGQgY29zdGluZyBhIGZ1bGwgZmxleCBgZ2FwYCBzbG90CiAgICAgICAgLy8gZm9yIG5vdGhpbmcgKHNlZSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uY3NzJ3Mgb3duIGNvbW1lbnQgb24KICAgICAgICAvLyAuQ29sbGFiQ3VzdG9tZXJJbmZvJ3MgZ2FwIG92ZXJyaWRlKS4KICAgICAgICAkRmllbGRzZXQuZW1wdHkoKTsKCiAgICAgICAgLy8gQ3VzdG9tZXIgYmFkZ2UgLSByZXVzZSBDb2xsYWJVc2VyQmFkZ2Ugc3RydWN0dXJlIChsaWtlIEhlYWRlclVzZXJCYWRnZSkKICAgICAgICB2YXIgJEJhZGdlID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiVXNlckJhZGdlX19jb250ZW50IENvbGxhYkN1c3RvbWVySW5mb19fYmFkZ2UnKTsKCiAgICAgICAgLy8gTWFpbiByb3cgLSBjb250YWlucyBBdmF0YXIgKyBJbmZvICh0aGlzIGlzIHRoZSBob3ZlciB0cmlnZ2VyIGFyZWEpCiAgICAgICAgdmFyICRNYWluUm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19tYWluUm93Jyk7CiAgICAgICAgLy8gQWRkIGhvdmVyIHRyaWdnZXIgb25seSB0byBtYWluIHJvdyAoYXZhdGFyLCBuYW1lLCB0aXRsZSkgLSBub3QgYmFkZ2VzCiAgICAgICAgaWYgKENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdIb3ZlckNhcmRzJykpIHsKICAgICAgICAgICAgJE1haW5Sb3cuYWRkQ2xhc3MoJ0NvbGxhYkhvdmVyVHJpZ2dlcicpLmF0dHIoJ2RhdGEtZW1haWwnLCBDdXN0b21lckRhdGEuZW1haWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXZhdGFyIHdyYXBwZXIgLSBzYW1lIHN0cnVjdHVyZSBhcyBIZWFkZXJVc2VyQmFkZ2UKICAgICAgICB2YXIgJEF2YXRhcldyYXAgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2F2YXRhcicpOwoKICAgICAgICAvLyBDcmVhdGUgYXZhdGFyIG1hbnVhbGx5IChsaWtlIEhlYWRlclVzZXJCYWRnZSBkb2VzKQogICAgICAgIHZhciAkQXZhdGFyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQXZhdGFyIENvbGxhYkF2YXRhci0tbGFyZ2UnKTsKICAgICAgICB2YXIgJEZhbGxiYWNrID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLnRleHQoR2V0SW5pdGlhbHMoQ3VzdG9tZXJEYXRhLmVtYWlsLCBDdXN0b21lckRhdGEubmFtZSkpOwogICAgICAgIHZhciAkUHJlc2VuY2UgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZSBDb2xsYWJQcmVzZW5jZS0tdW5rbm93bicpOwoKICAgICAgICAvLyBDcmVhdGUgaW1nIGVsZW1lbnQgU1lOQ0hST05PVVNMWSB0byBwcmV2ZW50IHJhY2UgY29uZGl0aW9ucyB3aXRoIFJlZnJlc2hDdXN0b21lckluZm9XaWRnZXQKICAgICAgICB2YXIgJEltZyA9IG51bGw7CiAgICAgICAgaWYgKENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdBdmF0YXInKSkgewogICAgICAgICAgICAkSW1nID0gJCgnPGltZz4nKS5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19pbWFnZScpLmF0dHIoJ2FsdCcsICcnKTsKICAgICAgICAgICAgJEF2YXRhci5wcmVwZW5kKCRJbWcpOwogICAgICAgIH0KICAgICAgICAkQXZhdGFyLmFwcGVuZCgkRmFsbGJhY2ssICRQcmVzZW5jZSk7CiAgICAgICAgJEF2YXRhcldyYXAuYXBwZW5kKCRBdmF0YXIpOwoKICAgICAgICAvLyBJbmZvIGFyZWEgLSBzYW1lIHN0cnVjdHVyZSBhcyBIZWFkZXJVc2VyQmFkZ2UKICAgICAgICB2YXIgJEluZm8gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJVc2VyQmFkZ2VfX2luZm8nKTsKICAgICAgICB2YXIgJE5hbWUgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiVXNlckJhZGdlX19uYW1lJykudGV4dChDdXN0b21lckRhdGEubmFtZSB8fCBDdXN0b21lckRhdGEuZW1haWwpOwogICAgICAgIHZhciAkVGl0bGUgPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiVXNlckJhZGdlX190aXRsZScpLnRleHQoJycpOyAvLyBGaWxsZWQgbGF0ZXIgdmlhIEFKQVgKICAgICAgICAkSW5mby5hcHBlbmQoJE5hbWUsICRUaXRsZSk7CgogICAgICAgICRNYWluUm93LmFwcGVuZCgkQXZhdGFyV3JhcCwgJEluZm8pOwoKICAgICAgICAkQmFkZ2UuYXBwZW5kKCRNYWluUm93KTsKICAgICAgICAkRmllbGRzZXQuYXBwZW5kKCRCYWRnZSk7CgogICAgICAgIC8vIExvYWQgYXZhdGFyIFVSTCBhc3luY2hyb25vdXNseQogICAgICAgICRXaWRnZXQuYXR0cignZGF0YS1hdmF0YXItbG9hZGluZycsICd0cnVlJyk7CiAgICAgICAgaWYgKENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdBdmF0YXInKSAmJiAkSW1nKSB7CiAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoQ3VzdG9tZXJEYXRhLmVtYWlsKS50aGVuKGZ1bmN0aW9uKEF2YXRhclVybCkgewogICAgICAgICAgICAgICAgaWYgKEF2YXRhclVybCkgewogICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHNyYyBpZiBuZXcgdmFsdWUgaXMgImJldHRlciIgKHJlYWwgaW1hZ2UgdnMgU1ZHIGZhbGxiYWNrKQogICAgICAgICAgICAgICAgICAgIHZhciBDdXJyZW50U3JjID0gJEltZy5hdHRyKCdzcmMnKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICB2YXIgTmV3SXNTdmdGYWxsYmFjayA9IEF2YXRhclVybC5pbmRleE9mKCdkYXRhOmltYWdlL3N2ZycpID09PSAwOwogICAgICAgICAgICAgICAgICAgIHZhciBDdXJyZW50SXNTdmdGYWxsYmFjayA9ICFDdXJyZW50U3JjIHx8IEN1cnJlbnRTcmMuaW5kZXhPZignZGF0YTppbWFnZS9zdmcnKSA9PT0gMDsKICAgICAgICAgICAgICAgICAgICB2YXIgU2hvdWxkVXBkYXRlID0gIUN1cnJlbnRTcmMgfHwgQ3VycmVudElzU3ZnRmFsbGJhY2sgfHwgIU5ld0lzU3ZnRmFsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgaWYgKFNob3VsZFVwZGF0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSW1nLmF0dHIoJ3NyYycsIEF2YXRhclVybCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRGYWxsYmFjay5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgfSkuZmluYWxseShmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICRXaWRnZXQucmVtb3ZlQXR0cignZGF0YS1hdmF0YXItbG9hZGluZycpOwogICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkV2lkZ2V0LnJlbW92ZUF0dHIoJ2RhdGEtYXZhdGFyLWxvYWRpbmcnKTsKICAgICAgICB9CgogICAgICAgIC8vIExvYWQgcHJlc2VuY2UgYXN5bmNocm9ub3VzbHkgKGxpa2UgSGVhZGVyVXNlckJhZGdlKQogICAgICAgIGlmIChDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnUHJlc2VuY2UnKSkgewogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoQ3VzdG9tZXJEYXRhLmVtYWlsKS50aGVuKGZ1bmN0aW9uKFByZXNlbmNlKSB7CiAgICAgICAgICAgICAgICB2YXIgUHJlc2VuY2VDbGFzcyA9IEdldFByZXNlbmNlQ2xhc3MoUHJlc2VuY2Uuc3RhdHVzKTsKICAgICAgICAgICAgICAgICRQcmVzZW5jZQogICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcyhmdW5jdGlvbihpLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYy5tYXRjaCgvQ29sbGFiUHJlc2VuY2UtLVxTKy9nKSB8fCBbXSkuam9pbignICcpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZSAnICsgUHJlc2VuY2VDbGFzcyk7CgogICAgICAgICAgICAgICAgLy8gU2hvdyB3b3JrIGxvY2F0aW9uIGJhZGdlIChvZmZpY2UvcmVtb3RlKSBvciBUaW1lIG9mZiAod2hlbiBPT0YgaXMgYWN0aXZlKQogICAgICAgICAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkxhYmVscyA9IHsKICAgICAgICAgICAgICAgICAgICAnb2ZmaWNlJzogJ09mZmljZScsCiAgICAgICAgICAgICAgICAgICAgJ3JlbW90ZSc6ICdSZW1vdGUnLAogICAgICAgICAgICAgICAgICAgICd0aW1lT2ZmJzogJ1RpbWUgb2ZmJwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBXb3JrTG9jYXRpb25JY29ucyA9IHsKICAgICAgICAgICAgICAgICAgICAnb2ZmaWNlJzogJ2ZhLWJ1aWxkaW5nJywKICAgICAgICAgICAgICAgICAgICAncmVtb3RlJzogJ2ZhLWhvbWUnLAogICAgICAgICAgICAgICAgICAgICd0aW1lT2ZmJzogJ2ZhLXNpZ24tb3V0JwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgbG9jYXRpb24gdHlwZTogT09GIHRha2VzIHByZWNlZGVuY2UsIHRoZW4gd29ya0xvY2F0aW9uCiAgICAgICAgICAgICAgICB2YXIgTG9jYXRpb25UeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uVHlwZSA9ICd0aW1lT2ZmJzsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoUHJlc2VuY2Uud29ya0xvY2F0aW9uICYmIFByZXNlbmNlLndvcmtMb2NhdGlvbi50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb25UeXBlID0gUHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKExvY2F0aW9uVHlwZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBMb2NhdGlvbkxhYmVsID0gV29ya0xvY2F0aW9uTGFiZWxzW0xvY2F0aW9uVHlwZV0gfHwgTG9jYXRpb25UeXBlOwogICAgICAgICAgICAgICAgICAgIHZhciBMb2NhdGlvbkljb24gPSBXb3JrTG9jYXRpb25JY29uc1tMb2NhdGlvblR5cGVdIHx8ICdmYS1tYXAtbWFya2VyJzsKCiAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHdvcmsgbG9jYXRpb24gYmFkZ2UgaW5saW5lIGFmdGVyIHRpdGxlCiAgICAgICAgICAgICAgICAgICAgdmFyICRXb3JrTG9jYXRpb24gPSAkKCc8c3Bhbj4nKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYldvcmtMb2NhdGlvbiBDb2xsYWJXb3JrTG9jYXRpb24tLScgKyBMb2NhdGlvblR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhICcgKyBMb2NhdGlvbkljb24pKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKExvY2F0aW9uTGFiZWwpKTsKICAgICAgICAgICAgICAgICAgICAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX2luZm8nKS5hcHBlbmQoJFdvcmtMb2NhdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gSXRlbVJvdyBsaXN0IGZvciBsaW5rcyAobmF0aXZlIFpudW55IHN0cnVjdHVyZSkKICAgICAgICB2YXIgJEl0ZW1MaXN0ID0gJCgnPHVsPicpLmFkZENsYXNzKCdJdGVtUm93Jyk7CgogICAgICAgIC8vIE9wZW4gVGlja2V0cyAoQ3VzdG9tZXIpIGxpbmsgLSBhbGwgdGlja2V0cyBvZiB0aGUgY3VzdG9tZXIvY29tcGFueQogICAgICAgIHZhciAkVGlja2V0SXRlbSA9ICQoJzxsaT4nKTsKICAgICAgICB2YXIgJFRpY2tldEljb24gPSAkKCc8aT4nKS5hZGRDbGFzcygnZmEgZmEtaW5kdXN0cnkgT3BlblRpY2tldCcpOwogICAgICAgIHZhciAkVGlja2V0TGluayA9ICQoJzxhPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnT3BlblRpY2tldCBDb2xsYWJDdXN0b21lckluZm9fX3RpY2tldExpbmsnKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAuYXR0cigndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT3BlbiBUaWNrZXRzIChDdXN0b21lciknKSkKICAgICAgICAgICAgLmh0bWwoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09wZW4gVGlja2V0cyAoQ3VzdG9tZXIpJykgKyAnIDxzcGFuIGNsYXNzPSJDb2xsYWJDdXN0b21lckluZm9fX3RpY2tldENvdW50Ij4oLi4uKTwvc3Bhbj4nKTsKICAgICAgICAkVGlja2V0TGluay5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgLy8gVXNlIFNlYXJjaFVSTCBmcm9tIGJhY2tlbmQgaWYgYXZhaWxhYmxlIChjb250YWlucyBjb3JyZWN0IEN1c3RvbWVySUQpCiAgICAgICAgICAgIHZhciBTZWFyY2hVUkwgPSAkKHRoaXMpLmF0dHIoJ2RhdGEtc2VhcmNoLXVybCcpOwogICAgICAgICAgICBpZiAoU2VhcmNoVVJMKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cub3BlbihTZWFyY2hVUkwsICdfYmxhbmsnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgQ3VzdG9tZXJVc2VyTG9naW4gKG1heSBub3QgYmUgYWNjdXJhdGUgZm9yIG11bHRpLXVzZXIgY3VzdG9tZXJzKQogICAgICAgICAgICAgICAgT3BlbkN1c3RvbWVyVGlja2V0U2VhcmNoKEN1c3RvbWVyRGF0YS5sb2dpbik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAkVGlja2V0SXRlbS5hcHBlbmQoJFRpY2tldEljb24sICRUaWNrZXRMaW5rKTsKICAgICAgICAkSXRlbUxpc3QuYXBwZW5kKCRUaWNrZXRJdGVtKTsKCiAgICAgICAgLy8gT3BlbiBUaWNrZXRzIChVc2VyKSBsaW5rIC0gdGlja2V0cyB3aGVyZSB0aGlzIHNwZWNpZmljIEN1c3RvbWVyVXNlciBpcyBhc3NpZ25lZAogICAgICAgIHZhciAkVXNlclRpY2tldEl0ZW0gPSAkKCc8bGk+Jyk7CiAgICAgICAgdmFyICRVc2VyVGlja2V0SWNvbiA9ICQoJzxpPicpLmFkZENsYXNzKCdmYSBmYS11c2VyIE9wZW5UaWNrZXQnKTsKICAgICAgICB2YXIgJFVzZXJUaWNrZXRMaW5rID0gJCgnPGE+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdPcGVuVGlja2V0IENvbGxhYkN1c3RvbWVySW5mb19fdXNlclRpY2tldExpbmsnKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09wZW4gVGlja2V0cyAoVXNlciknKSkKICAgICAgICAgICAgLmh0bWwoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09wZW4gVGlja2V0cyAoVXNlciknKSArICcgPHNwYW4gY2xhc3M9IkNvbGxhYkN1c3RvbWVySW5mb19fdXNlclRpY2tldENvdW50Ij4oLi4uKTwvc3Bhbj4nKTsKICAgICAgICAkVXNlclRpY2tldExpbmsub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIE9wZW5DdXN0b21lclVzZXJUaWNrZXRTZWFyY2goQ3VzdG9tZXJEYXRhLmxvZ2luKTsKICAgICAgICB9KTsKICAgICAgICAkVXNlclRpY2tldEl0ZW0uYXBwZW5kKCRVc2VyVGlja2V0SWNvbiwgJFVzZXJUaWNrZXRMaW5rKTsKICAgICAgICAkSXRlbUxpc3QuYXBwZW5kKCRVc2VyVGlja2V0SXRlbSk7CgogICAgICAgICRGaWVsZHNldC5hcHBlbmQoJEl0ZW1MaXN0KTsKCiAgICAgICAgLy8gQWN0aW9uIGJ1dHRvbnMgY29udGFpbmVyIC0gd2lsbCBiZSBwb3B1bGF0ZWQgYWZ0ZXIgR2V0UHJvZmlsZSgpIGRldGVybWluZXMgdGhlIHByb3ZpZGVyCiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHdlIGtub3cgaWYgdGhlIGN1c3RvbWVyIGlzIGZyb20gTTM2NSAoaGFzIFRlYW1zKSBvciBabnVueSBmYWxsYmFjayAobm8gVGVhbXMpCiAgICAgICAgdmFyICRBY3Rpb25zID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25zJykuYXR0cignaWQnLCAnQ29sbGFiQ3VzdG9tZXJBY3Rpb25zJyk7CgogICAgICAgIC8vIEZldGNoIGFkZGl0aW9uYWwgZGF0YSBhc3luY2hyb25vdXNseSAtIHRoaXMgd2lsbCBhbHNvIHJlbmRlciB0aGUgYWN0aW9uIGJ1dHRvbnMKICAgICAgICBGZXRjaEN1c3RvbWVyRW5yaWNobWVudERhdGEoJFdpZGdldCwgQ3VzdG9tZXJEYXRhLCAkQWN0aW9ucyk7CiAgICAgICAgRmV0Y2hDdXN0b21lclRpY2tldENvdW50KCRXaWRnZXQsIEN1c3RvbWVyRGF0YSk7CiAgICAgICAgRmV0Y2hDdXN0b21lclVzZXJUaWNrZXRDb3VudCgkV2lkZ2V0LCBDdXN0b21lckRhdGEpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGZXRjaCBjdXN0b21lciBlbnJpY2htZW50IGRhdGEgZnJvbSBNMzY1IG9yIFpudW55CiAgICAgKiAgICAgICAgICAgICAgQWxzbyByZW5kZXJzIGFjdGlvbiBidXR0b25zIGFmdGVyIEdldFByb2ZpbGUoKSBkZXRlcm1pbmVzIHRoZSBwcm92aWRlciAoaWYgJEFjdGlvbnMgaXMgcHJvdmlkZWQpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZldGNoQ3VzdG9tZXJFbnJpY2htZW50RGF0YSgkV2lkZ2V0LCBDdXN0b21lckRhdGEsICRBY3Rpb25zKSB7CiAgICAgICAgLy8gR2V0IE0zNjUgcHJvZmlsZSBkYXRhIGlmIGF2YWlsYWJsZQogICAgICAgIGlmIChDb2xsYWIuSXNMb2dnZWRJbigpICYmIENvbGxhYi5IYXNDYXBhYmlsaXR5KCdwcm9maWxlJykpIHsKICAgICAgICAgICAgLy8gRmV0Y2ggcHJvZmlsZSBhbmQgcHJlc2VuY2UgZGF0YSBpbiBwYXJhbGxlbCAoT09GIGlzIGRlcml2ZWQgZnJvbSBwcmVzZW5jZS5hY3Rpdml0eSkKICAgICAgICAgICAgUHJvbWlzZS5hbGwoWwogICAgICAgICAgICAgICAgQ29sbGFiLkdldFByb2ZpbGUoQ3VzdG9tZXJEYXRhLmVtYWlsKSwKICAgICAgICAgICAgICAgIENvbGxhYi5HZXRQcmVzZW5jZShDdXN0b21lckRhdGEuZW1haWwpLmNhdGNoKGZ1bmN0aW9uKCkgeyByZXR1cm4geyBzdGF0dXM6ICd1bmtub3duJyB9OyB9KQogICAgICAgICAgICBdKS50aGVuKGZ1bmN0aW9uKFJlc3VsdHMpIHsKICAgICAgICAgICAgICAgIHZhciBQcm9maWxlID0gUmVzdWx0c1swXTsKICAgICAgICAgICAgICAgIHZhciBQcmVzZW5jZSA9IFJlc3VsdHNbMV07CgogICAgICAgICAgICAgICAgaWYgKFByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgam9iIHRpdGxlICh1c2luZyBDb2xsYWJVc2VyQmFkZ2UgY2xhc3NlcykKICAgICAgICAgICAgICAgICAgICB2YXIgJFRpdGxlID0gJFdpZGdldC5maW5kKCcuQ29sbGFiVXNlckJhZGdlX190aXRsZScpOwogICAgICAgICAgICAgICAgICAgIGlmIChQcm9maWxlLmpvYlRpdGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaXRsZS50ZXh0KFByb2ZpbGUuam9iVGl0bGUpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG5hbWUgaWYgTTM2NSBoYXMgYmV0dGVyIGRhdGEKICAgICAgICAgICAgICAgICAgICBpZiAoUHJvZmlsZS5kaXNwbGF5TmFtZSAmJiBQcm9maWxlLmRpc3BsYXlOYW1lICE9PSBDdXN0b21lckRhdGEuZW1haWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5maW5kKCcuQ29sbGFiVXNlckJhZGdlX19uYW1lJykudGV4dChQcm9maWxlLmRpc3BsYXlOYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gTm93IHRoYXQgR2V0UHJvZmlsZSgpIGhhcyBzZXQgVXNlclByb3ZpZGVyTWFwLCByZW5kZXIgdGhlIGFjdGlvbiBidXR0b25zIChpZiAkQWN0aW9ucyBwcm92aWRlZCkKICAgICAgICAgICAgICAgIGlmICgkQWN0aW9ucykgewogICAgICAgICAgICAgICAgICAgIFJlbmRlckN1c3RvbWVyQWN0aW9uQnV0dG9ucygkV2lkZ2V0LCBDdXN0b21lckRhdGEsICRBY3Rpb25zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAvLyBNMzY1IGRhdGEgbm90IGF2YWlsYWJsZSAtIHVzZSBabnVueSBmYWxsYmFjawogICAgICAgICAgICAgICAgRmV0Y2habnVueUN1c3RvbWVyRGF0YSgkV2lkZ2V0LCBDdXN0b21lckRhdGEpOwogICAgICAgICAgICAgICAgLy8gU3RpbGwgcmVuZGVyIGFjdGlvbiBidXR0b25zICh3aWxsIHNob3cgbm8gVGVhbXMgYnV0dG9ucyBmb3IgZmFsbGJhY2sgdXNlcnMpCiAgICAgICAgICAgICAgICBpZiAoJEFjdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBSZW5kZXJDdXN0b21lckFjdGlvbkJ1dHRvbnMoJFdpZGdldCwgQ3VzdG9tZXJEYXRhLCAkQWN0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIE5vdCBsb2dnZWQgaW4gdG8gTTM2NSAtIHVzZSBabnVueSBkYXRhCiAgICAgICAgICAgIEZldGNoWm51bnlDdXN0b21lckRhdGEoJFdpZGdldCwgQ3VzdG9tZXJEYXRhKTsKICAgICAgICAgICAgLy8gUmVuZGVyIGFjdGlvbiBidXR0b25zIChubyBUZWFtcyBidXR0b25zIHdoZW4gbm90IGxvZ2dlZCBpbikKICAgICAgICAgICAgaWYgKCRBY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBSZW5kZXJDdXN0b21lckFjdGlvbkJ1dHRvbnMoJFdpZGdldCwgQ3VzdG9tZXJEYXRhLCAkQWN0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFJlbmRlciBhY3Rpb24gYnV0dG9ucyBmb3IgY3VzdG9tZXIgaW5mbyB3aWRnZXQKICAgICAqICAgICAgICAgICAgICBDYWxsZWQgYWZ0ZXIgR2V0UHJvZmlsZSgpIHRvIGVuc3VyZSBVc2VyUHJvdmlkZXJNYXAgaXMgc2V0CiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlbmRlckN1c3RvbWVyQWN0aW9uQnV0dG9ucygkV2lkZ2V0LCBDdXN0b21lckRhdGEsICRBY3Rpb25zKSB7CiAgICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgRE9NIGVsZW1lbnQgaWYgaXQgZXhpc3RzIChoYW5kbGVzIHJhY2UgY29uZGl0aW9ucyBiZXR3ZWVuIGluaXRpYWwgbG9hZCBhbmQgcmVmcmVzaCkKICAgICAgICB2YXIgJEV4aXN0aW5nQWN0aW9ucyA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9ucycpOwogICAgICAgIGlmICgkRXhpc3RpbmdBY3Rpb25zLmxlbmd0aCkgewogICAgICAgICAgICAkQWN0aW9ucyA9ICRFeGlzdGluZ0FjdGlvbnM7CiAgICAgICAgfQoKICAgICAgICAvLyBDbGVhciBleGlzdGluZyBidXR0b25zIHRvIGF2b2lkIGR1cGxpY2F0ZXMKICAgICAgICAkQWN0aW9ucy5lbXB0eSgpOwoKICAgICAgICAvLyBIZWxwZXIgdG8gY3JlYXRlIGljb24gYnV0dG9uIChzYW1lIHN0eWxlIGFzIEhvdmVyQ2FyZCkKICAgICAgICBmdW5jdGlvbiBDcmVhdGVJY29uQnV0dG9uKFRhZywgSHJlZiwgVGl0bGUsIEljb25DbGFzcywgVGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciAkQnRuID0gJCgnPCcgKyBUYWcgKyAnPicpCiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkJ1dHRvbiBDb2xsYWJCdXR0b24tLWljb24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgVGl0bGUpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpPicpLmFkZENsYXNzKEljb25DbGFzcykpOwogICAgICAgICAgICBpZiAoSHJlZikgewogICAgICAgICAgICAgICAgJEJ0bi5hdHRyKCdocmVmJywgSHJlZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFRhcmdldCkgewogICAgICAgICAgICAgICAgJEJ0bi5hdHRyKCd0YXJnZXQnLCBUYXJnZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAkQnRuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgY3VzdG9tZXIgaXMgZnJvbSBwcmltYXJ5IHByb3ZpZGVyIChNMzY1KSAtIG9ubHkgdGhlbiBUZWFtcyBpcyBhdmFpbGFibGUKICAgICAgICAvLyBGYWxsYmFjayBwcm92aWRlciAoWm51bnkpIHVzZXJzIGRvbid0IGhhdmUgVGVhbXMKICAgICAgICB2YXIgVXNlclByb3ZpZGVyID0gQ29sbGFiLkdldFVzZXJQcm92aWRlcihDdXN0b21lckRhdGEuZW1haWwpOwogICAgICAgIHZhciBIYXNUZWFtcyA9IFVzZXJQcm92aWRlciA9PT0gJ3ByaW1hcnknOwoKICAgICAgICAvLyBUZWFtcyBDaGF0IGJ1dHRvbiAobGVmdC1hbGlnbmVkKSAtIG9ubHkgaWYgTTM2NSB1c2VyCiAgICAgICAgaWYgKEhhc1RlYW1zICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdDaGF0JykgJiYgQ29sbGFiLklzTG9nZ2VkSW4oKSAmJiBDb2xsYWIuSGFzQ2FwYWJpbGl0eSgnY2hhdCcpKSB7CiAgICAgICAgICAgIHZhciBDaGF0TGluayA9IENvbGxhYi5HZXRDaGF0TGluayhDdXN0b21lckRhdGEuZW1haWwpOwogICAgICAgICAgICAkQWN0aW9ucy5hcHBlbmQoQ3JlYXRlSWNvbkJ1dHRvbignYScsIENoYXRMaW5rLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RlYW1zIENoYXQnKSwgJ2ZhIGZhLWNvbW1lbnQnLCAnX2JsYW5rJykpOwogICAgICAgIH0KCiAgICAgICAgLy8gVGVhbXMgQ2FsbCBidXR0b24gKGxlZnQtYWxpZ25lZCkgLSBvbmx5IGlmIE0zNjUgdXNlcgogICAgICAgIGlmIChIYXNUZWFtcyAmJiBDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnQ2FsbCcpICYmIENvbGxhYi5Jc0xvZ2dlZEluKCkgJiYgQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ2NhbGwnKSkgewogICAgICAgICAgICB2YXIgQ2FsbExpbmsgPSBDb2xsYWIuR2V0Q2FsbExpbmsoQ3VzdG9tZXJEYXRhLmVtYWlsKTsKICAgICAgICAgICAgJEFjdGlvbnMuYXBwZW5kKENyZWF0ZUljb25CdXR0b24oJ2EnLCBDYWxsTGluaywKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUZWFtcyBDYWxsJyksICdmYSBmYS1waG9uZS1zcXVhcmUnLCAnX2JsYW5rJykpOwogICAgICAgIH0KCiAgICAgICAgLy8gTWVldGluZyBidXR0b24gLSByaWdodC1hbGlnbmVkLCBvbmx5IHNob3cgaWYgTTM2NSB1c2VyLCBsb2dnZWQgaW4sIGNhcGFiaWxpdHkgYXZhaWxhYmxlLCBhbmQgY3VycmVudCBhZ2VudCBpcyB0aWNrZXQgb3duZXIKICAgICAgICB2YXIgU2VydmVyQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdDb2xsYWJvcmF0aW9uJykgfHwge307CiAgICAgICAgaWYgKEhhc1RlYW1zICYmIENvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdNZWV0aW5ncycpICYmIENvbGxhYi5Jc0xvZ2dlZEluKCkgJiYgQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ2NyZWF0ZU1lZXRpbmcnKSAmJiBTZXJ2ZXJDb25maWcuSXNUaWNrZXRPd25lcikgewogICAgICAgICAgICAvLyBTcGFjZXIgdG8gcHVzaCBtZWV0aW5nIGJ1dHRvbiB0byB0aGUgcmlnaHQKICAgICAgICAgICAgJEFjdGlvbnMuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9uc1NwYWNlcicpKTsKCiAgICAgICAgICAgIHZhciAkTWVldGluZ0J0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQnV0dG9uIENvbGxhYkJ1dHRvbi0taWNvbicpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NjaGVkdWxlIE1lZXRpbmcnKSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhIGZhLWNhbGVuZGFyJykpOwogICAgICAgICAgICAkTWVldGluZ0J0bi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIFNob3dNZWV0aW5nU2NoZWR1bGVyRm9yQ3VzdG9tZXIoQ3VzdG9tZXJEYXRhLmVtYWlsLCBDdXN0b21lckRhdGEubmFtZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkQWN0aW9ucy5hcHBlbmQoJE1lZXRpbmdCdG4pOwogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBhcHBlbmQgdG8gRE9NIGlmIG5vdCBhbHJlYWR5IHRoZXJlIGFuZCBoYXMgY29udGVudAogICAgICAgIGlmICgkQWN0aW9ucy5jaGlsZHJlbigpLmxlbmd0aCA+IDAgJiYgISRBY3Rpb25zLnBhcmVudCgpLmxlbmd0aCkgewogICAgICAgICAgICAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJDdXN0b21lckluZm8nKS5hcHBlbmQoJEFjdGlvbnMpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRmV0Y2ggY3VzdG9tZXIgZGF0YSBmcm9tIFpudW55IGJhY2tlbmQKICAgICAqLwogICAgZnVuY3Rpb24gRmV0Y2habnVueUN1c3RvbWVyRGF0YSgkV2lkZ2V0LCBDdXN0b21lckRhdGEpIHsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnR2V0Q3VzdG9tZXJEYXRhJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlckxvZ2luOiBDdXN0b21lckRhdGEubG9naW4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5TdWNjZXNzICYmIFJlc3BvbnNlLkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBVc2luZyBDb2xsYWJVc2VyQmFkZ2UgY2xhc3NlcyAoc2FtZSBhcyBIZWFkZXJVc2VyQmFkZ2UpCiAgICAgICAgICAgICAgICAgICAgdmFyICRUaXRsZSA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9fdGl0bGUnKTsKICAgICAgICAgICAgICAgICAgICAvLyBVc2UgVXNlclRpdGxlIGZyb20gWm51bnkgQ3VzdG9tZXJVc2VyCiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLkRhdGEuVXNlclRpdGxlICYmICEkVGl0bGUudGV4dCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaXRsZS50ZXh0KFJlc3BvbnNlLkRhdGEuVXNlclRpdGxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIG5hbWUgaWYgbmVlZGVkIGFuZCBjdXJyZW50IGlzIGp1c3QgZW1haWwKICAgICAgICAgICAgICAgICAgICB2YXIgJE5hbWUgPSAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJVc2VyQmFkZ2VfX25hbWUnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRGF0YS5Vc2VyRnVsbG5hbWUgJiYgJE5hbWUudGV4dCgpID09PSBDdXN0b21lckRhdGEuZW1haWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5hbWUudGV4dChSZXNwb25zZS5EYXRhLlVzZXJGdWxsbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnanNvbicKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGZXRjaCBjdXN0b21lciB0aWNrZXQgY291bnQgZnJvbSBabnVueSBiYWNrZW5kCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZldGNoQ3VzdG9tZXJUaWNrZXRDb3VudCgkV2lkZ2V0LCBDdXN0b21lckRhdGEpIHsKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnR2V0Q3VzdG9tZXJUaWNrZXRDb3VudCcsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbjogQ3VzdG9tZXJEYXRhLmxvZ2luCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgIHZhciAkQ291bnQgPSAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJDdXN0b21lckluZm9fX3RpY2tldENvdW50Jyk7CiAgICAgICAgICAgICAgICAgICAgJENvdW50LnRleHQoJygnICsgUmVzcG9uc2UuVGlja2V0Q291bnQgKyAnKScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBTdG9yZSBzZWFyY2ggVVJMIGZvciBsYXRlciB1c2UKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuU2VhcmNoVVJMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRXaWRnZXQuZmluZCgnLkNvbGxhYkN1c3RvbWVySW5mb19fdGlja2V0TGluaycpLmF0dHIoJ2RhdGEtc2VhcmNoLXVybCcsIFJlc3BvbnNlLlNlYXJjaFVSTCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnanNvbicKICAgICAgICApOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGZXRjaCBjdXN0b21lciB1c2VyIHRpY2tldCBjb3VudCBmcm9tIFpudW55IGJhY2tlbmQgKHNwZWNpZmljIHVzZXIsIG5vdCBjdXN0b21lciBjb21wYW55KQogICAgICovCiAgICBmdW5jdGlvbiBGZXRjaEN1c3RvbWVyVXNlclRpY2tldENvdW50KCRXaWRnZXQsIEN1c3RvbWVyRGF0YSkgewogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDb2xsYWJvcmF0aW9uQUpBWCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdHZXRDdXN0b21lclVzZXJUaWNrZXRDb3VudCcsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbjogQ3VzdG9tZXJEYXRhLmxvZ2luCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgIHZhciAkQ291bnQgPSAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJDdXN0b21lckluZm9fX3VzZXJUaWNrZXRDb3VudCcpOwogICAgICAgICAgICAgICAgICAgICRDb3VudC50ZXh0KCcoJyArIFJlc3BvbnNlLlRpY2tldENvdW50ICsgJyknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiBjdXN0b21lciB0aWNrZXQgc2VhcmNoCiAgICAgKi8KICAgIGZ1bmN0aW9uIE9wZW5DdXN0b21lclRpY2tldFNlYXJjaChDdXN0b21lclVzZXJMb2dpbikgewogICAgICAgIC8vIE9wZW4gdGlja2V0IHNlYXJjaCBmaWx0ZXJlZCBieSBjdXN0b21lciAoQ3VzdG9tZXJJRCkgaW4gbmV3IHdpbmRvdwogICAgICAgIHZhciBVcmwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKwogICAgICAgICAgICAnQWN0aW9uPUFnZW50VGlja2V0U2VhcmNoO1N1YmFjdGlvbj1TZWFyY2g7JyArCiAgICAgICAgICAgICdDdXN0b21lcklEUmF3PScgKyBlbmNvZGVVUklDb21wb25lbnQoQ3VzdG9tZXJVc2VyTG9naW4pICsgJzsnICsKICAgICAgICAgICAgJ1N0YXRlVHlwZT1PcGVuJzsKICAgICAgICB3aW5kb3cub3BlbihVcmwsICdfYmxhbmsnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gT3BlbiBjdXN0b21lciB1c2VyIHRpY2tldCBzZWFyY2ggKHNwZWNpZmljIHVzZXIsIG5vdCBjdXN0b21lciBjb21wYW55KQogICAgICovCiAgICBmdW5jdGlvbiBPcGVuQ3VzdG9tZXJVc2VyVGlja2V0U2VhcmNoKEN1c3RvbWVyVXNlckxvZ2luKSB7CiAgICAgICAgLy8gT3BlbiB0aWNrZXQgc2VhcmNoIGZpbHRlcmVkIGJ5IHNwZWNpZmljIEN1c3RvbWVyVXNlciAoQ3VzdG9tZXJVc2VyTG9naW4pCiAgICAgICAgdmFyIFVybCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArCiAgICAgICAgICAgICdBY3Rpb249QWdlbnRUaWNrZXRTZWFyY2g7U3ViYWN0aW9uPVNlYXJjaDsnICsKICAgICAgICAgICAgJ0N1c3RvbWVyVXNlckxvZ2luUmF3PScgKyBlbmNvZGVVUklDb21wb25lbnQoQ3VzdG9tZXJVc2VyTG9naW4pICsgJzsnICsKICAgICAgICAgICAgJ1N0YXRlVHlwZT1PcGVuJzsKICAgICAgICB3aW5kb3cub3BlbihVcmwsICdfYmxhbmsnKTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIE1lZXRpbmcgU2NoZWR1bGVyIERpYWxvZwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgdmFyIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZSA9IHsKICAgICAgICAkRGlhbG9nOiBudWxsLAogICAgICAgIFRpY2tldERhdGE6IG51bGwsCiAgICAgICAgQ3VzdG9tZXJEYXRhOiBudWxsLAogICAgICAgIE93bmVyRGF0YTogbnVsbCwKICAgICAgICBTZWxlY3RlZER1cmF0aW9uOiAzMCwKICAgICAgICBTZWxlY3RlZERhdGU6IG51bGwsCiAgICAgICAgU2VsZWN0ZWRTbG90OiBudWxsLAogICAgICAgIEZyZWVTbG90czogW10sCiAgICAgICAgSXNDcmVhdGluZzogZmFsc2UsCiAgICAgICAgTWVldGluZ1R5cGU6ICd0ZWFtcycsICAvLyAndGVhbXMnIG9yICdvbnNpdGUnCiAgICAgICAgTG9jYXRpb246ICcnCiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTaG93IG1lZXRpbmcgc2NoZWR1bGVyIGZvciBjdXN0b21lcgogICAgICovCiAgICBmdW5jdGlvbiBTaG93TWVldGluZ1NjaGVkdWxlckZvckN1c3RvbWVyKEN1c3RvbWVyRW1haWwsIEN1c3RvbWVyTmFtZSkgewogICAgICAgIC8vIENoZWNrIGlmIG1lZXRpbmcgY2FwYWJpbGl0eSBpcyBhdmFpbGFibGUKICAgICAgICBpZiAoIUNvbGxhYi5IYXNDYXBhYmlsaXR5KCdjcmVhdGVNZWV0aW5nJykpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsCiAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWVldGluZyBzY2hlZHVsaW5nIHJlcXVpcmVzIE1pY3Jvc29mdCAzNjUgbG9naW4uJykKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEdldCB0aWNrZXQgSUQgZnJvbSBjb25maWcKICAgICAgICB2YXIgVGlja2V0SUQgPSBDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldElEJyk7CiAgICAgICAgaWYgKCFUaWNrZXRJRCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJbml0aWFsaXplIHN0YXRlCiAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLkN1c3RvbWVyRGF0YSA9IHsKICAgICAgICAgICAgZW1haWw6IEN1c3RvbWVyRW1haWwsCiAgICAgICAgICAgIG5hbWU6IEN1c3RvbWVyTmFtZSB8fCBDdXN0b21lckVtYWlsCiAgICAgICAgfTsKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlID0gbmV3IERhdGUoKTsKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWRTbG90ID0gbnVsbDsKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuRnJlZVNsb3RzID0gW107CiAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID0gJ3RlYW1zJzsgIC8vIERlZmF1bHQgdG8gVGVhbXMKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTG9jYXRpb24gPSAnJzsKCiAgICAgICAgLy8gRmV0Y2ggdGlja2V0IGRhdGEgKGluY2x1ZGVzIG93bmVyIGluZm8gYW5kIGNhbGVuZGFyIGF2YWlsYWJpbGl0eSkKICAgICAgICBGZXRjaFRpY2tldERhdGFGb3JNZWV0aW5nKFRpY2tldElELCBmdW5jdGlvbihUaWNrZXREYXRhKSB7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIGEgY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgdGhpcyBxdWV1ZQogICAgICAgICAgICBpZiAoIVRpY2tldERhdGEuSGFzQ2FsZW5kYXIpIHsKICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICB0aXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vIENhbGVuZGFyIENvbmZpZ3VyZWQnKSwKICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm8gY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgcXVldWUgJXMuJywgVGlja2V0RGF0YS5RdWV1ZSksCiAgICAgICAgICAgICAgICAgICAgZGV0YWlsOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yIHRvIGNvbmZpZ3VyZSBhIGNhbGVuZGFyIG1hcHBpbmcgZm9yIHRoaXMgcXVldWUgaW4gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uIChDb2xsYWJvcmF0aW9uOjpRdWV1ZUNhbGVuZGFyTWFwcGluZykuJykKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuVGlja2V0RGF0YSA9IFRpY2tldERhdGE7CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Pd25lckRhdGEgPSB7CiAgICAgICAgICAgICAgICBlbWFpbDogVGlja2V0RGF0YS5Pd25lckVtYWlsLAogICAgICAgICAgICAgICAgbmFtZTogVGlja2V0RGF0YS5Pd25lckZ1bGxuYW1lIHx8IFRpY2tldERhdGEuT3duZXJMb2dpbgogICAgICAgICAgICB9OwoKICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzaG93IGRpYWxvZwogICAgICAgICAgICBDcmVhdGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCk7CiAgICAgICAgICAgIFNob3dNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCk7CgogICAgICAgICAgICAvLyBMb2FkIGluaXRpYWwgZnJlZS9idXN5IGRhdGEKICAgICAgICAgICAgTG9hZEZyZWVCdXN5U2xvdHMoKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRmV0Y2ggdGlja2V0IGRhdGEgZnJvbSBiYWNrZW5kCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZldGNoVGlja2V0RGF0YUZvck1lZXRpbmcoVGlja2V0SUQsIENhbGxiYWNrKSB7CiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudENvbGxhYm9yYXRpb25BSkFYJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldFRpY2tldERhdGEnLAogICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldElECiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGZ1bmN0aW9uKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcyAmJiBSZXNwb25zZS5EYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2soUmVzcG9uc2UuRGF0YSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmFpbGVkIHRvIGxvYWQgdGlja2V0IGRhdGEuJykKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIHRoZSBtZWV0aW5nIHNjaGVkdWxlciBkaWFsb2cgZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiBDcmVhdGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCkgewogICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBkaWFsb2cgaWYgYW55CiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS4kRGlhbG9nKSB7CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS4kRGlhbG9nLnJlbW92ZSgpOwogICAgICAgIH0KCiAgICAgICAgdmFyIFRpY2tldERhdGEgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuVGlja2V0RGF0YTsKICAgICAgICB2YXIgQ3VzdG9tZXJEYXRhID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLkN1c3RvbWVyRGF0YTsKICAgICAgICB2YXIgT3duZXJEYXRhID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLk93bmVyRGF0YTsKCiAgICAgICAgLy8gQ3JlYXRlIGRpYWxvZyBzdHJ1Y3R1cmUKICAgICAgICB2YXIgJERpYWxvZyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXInKTsKCiAgICAgICAgdmFyICREaWFsb2dCb3ggPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kaWFsb2cnKTsKCiAgICAgICAgLy8gSGVhZGVyCiAgICAgICAgdmFyICRIZWFkZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19oZWFkZXInKTsKICAgICAgICAkSGVhZGVyLmFwcGVuZCgkKCc8aDM+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3RpdGxlJykudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2NoZWR1bGUgQXBwb2ludG1lbnQnKSkpOwogICAgICAgIHZhciAkQ2xvc2VCdG4gPSAkKCc8YnV0dG9uPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19jbG9zZScpLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS10aW1lcyI+PC9pPicpOwogICAgICAgICRDbG9zZUJ0bi5vbignY2xpY2snLCBIaWRlTWVldGluZ1NjaGVkdWxlckRpYWxvZyk7CiAgICAgICAgJEhlYWRlci5hcHBlbmQoJENsb3NlQnRuKTsKICAgICAgICAkRGlhbG9nQm94LmFwcGVuZCgkSGVhZGVyKTsKCiAgICAgICAgLy8gQm9keQogICAgICAgIHZhciAkQm9keSA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2JvZHknKTsKCiAgICAgICAgLy8gQXR0ZW5kZWVzIFNlY3Rpb24KICAgICAgICB2YXIgJEF0dGVuZGVlc1NlY3Rpb24gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zZWN0aW9uJyk7CiAgICAgICAgJEF0dGVuZGVlc1NlY3Rpb24uYXBwZW5kKCQoJzxsYWJlbD4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbGFiZWwnKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdHRlbmRlZXMnKSkpOwoKICAgICAgICB2YXIgJEF0dGVuZGVlcyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlcycpOwoKICAgICAgICAvLyBPd25lciBhdHRlbmRlZQogICAgICAgICRBdHRlbmRlZXMuYXBwZW5kKENyZWF0ZUF0dGVuZGVlRWxlbWVudChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT3duZXInKSwgT3duZXJEYXRhLmVtYWlsLCBPd25lckRhdGEubmFtZSkpOwoKICAgICAgICAvLyBDdXN0b21lciBhdHRlbmRlZQogICAgICAgICRBdHRlbmRlZXMuYXBwZW5kKENyZWF0ZUF0dGVuZGVlRWxlbWVudChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3VzdG9tZXInKSwgQ3VzdG9tZXJEYXRhLmVtYWlsLCBDdXN0b21lckRhdGEubmFtZSkpOwoKICAgICAgICAkQXR0ZW5kZWVzU2VjdGlvbi5hcHBlbmQoJEF0dGVuZGVlcyk7CiAgICAgICAgJEJvZHkuYXBwZW5kKCRBdHRlbmRlZXNTZWN0aW9uKTsKCiAgICAgICAgLy8gU3ViamVjdCBTZWN0aW9uCiAgICAgICAgdmFyICRTdWJqZWN0U2VjdGlvbiA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3NlY3Rpb24nKTsKICAgICAgICAkU3ViamVjdFNlY3Rpb24uYXBwZW5kKCQoJzxsYWJlbD4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbGFiZWwnKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTdWJqZWN0JykpKTsKICAgICAgICB2YXIgRGVmYXVsdFN1YmplY3QgPSAnVGlja2V0IycgKyBUaWNrZXREYXRhLlRpY2tldE51bWJlciArICc6ICcgKyBUaWNrZXREYXRhLlRpdGxlOwogICAgICAgIHZhciAkU3ViamVjdElucHV0ID0gJCgnPGlucHV0PicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9faW5wdXQnKQogICAgICAgICAgICAuYXR0cigndHlwZScsICd0ZXh0JykKICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ0NvbGxhYk1lZXRpbmdTdWJqZWN0JykKICAgICAgICAgICAgLnZhbChEZWZhdWx0U3ViamVjdCk7CiAgICAgICAgJFN1YmplY3RTZWN0aW9uLmFwcGVuZCgkU3ViamVjdElucHV0KTsKICAgICAgICAkQm9keS5hcHBlbmQoJFN1YmplY3RTZWN0aW9uKTsKCiAgICAgICAgLy8gTWVldGluZyBUeXBlIFNlY3Rpb24KICAgICAgICB2YXIgJFR5cGVTZWN0aW9uID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbicpOwogICAgICAgICRUeXBlU2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01lZXRpbmcgVHlwZScpKSk7CiAgICAgICAgdmFyICRUeXBlcyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGVzJyk7CgogICAgICAgIC8vIFRlYW1zIGJ1dHRvbgogICAgICAgIHZhciAkVGVhbXNCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZScpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLXR5cGUnLCAndGVhbXMnKQogICAgICAgICAgICAuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLXZpZGVvLWNhbWVyYSI+PC9pPiAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RlYW1zIE1lZXRpbmcnKSk7CiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5NZWV0aW5nVHlwZSA9PT0gJ3RlYW1zJykgewogICAgICAgICAgICAkVGVhbXNCdG4uYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGUtLXNlbGVjdGVkJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBPbi1zaXRlIGJ1dHRvbgogICAgICAgIHZhciAkT25zaXRlQnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGUnKQogICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAuYXR0cignZGF0YS10eXBlJywgJ29uc2l0ZScpCiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtbWFwLW1hcmtlciI+PC9pPiAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09uLXNpdGUnKSk7CiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5NZWV0aW5nVHlwZSA9PT0gJ29uc2l0ZScpIHsKICAgICAgICAgICAgJE9uc2l0ZUJ0bi5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZS0tc2VsZWN0ZWQnKTsKICAgICAgICB9CgogICAgICAgIC8vIFR5cGUgc2VsZWN0aW9uIGhhbmRsZXIKICAgICAgICAkVGVhbXNCdG4ub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5NZWV0aW5nVHlwZSA9ICd0ZWFtcyc7CiAgICAgICAgICAgICRUeXBlcy5maW5kKCcuQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZScpLnJlbW92ZUNsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCcpOwogICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCcpOwogICAgICAgICAgICAkKCcjQ29sbGFiTWVldGluZ0xvY2F0aW9uU2VjdGlvbicpLmhpZGUoKTsKICAgICAgICAgICAgVXBkYXRlQ3JlYXRlQnV0dG9uU3RhdGUoKTsKICAgICAgICB9KTsKCiAgICAgICAgJE9uc2l0ZUJ0bi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID0gJ29uc2l0ZSc7CiAgICAgICAgICAgICRUeXBlcy5maW5kKCcuQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZScpLnJlbW92ZUNsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCcpOwogICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCcpOwogICAgICAgICAgICAkKCcjQ29sbGFiTWVldGluZ0xvY2F0aW9uU2VjdGlvbicpLnNob3coKTsKICAgICAgICAgICAgVXBkYXRlQ3JlYXRlQnV0dG9uU3RhdGUoKTsKICAgICAgICB9KTsKCiAgICAgICAgJFR5cGVzLmFwcGVuZCgkVGVhbXNCdG4sICRPbnNpdGVCdG4pOwogICAgICAgICRUeXBlU2VjdGlvbi5hcHBlbmQoJFR5cGVzKTsKICAgICAgICAkQm9keS5hcHBlbmQoJFR5cGVTZWN0aW9uKTsKCiAgICAgICAgLy8gTG9jYXRpb24gU2VjdGlvbiAob25seSBmb3Igb24tc2l0ZSBtZWV0aW5ncykKICAgICAgICB2YXIgJExvY2F0aW9uU2VjdGlvbiA9ICQoJzxkaXY+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zZWN0aW9uJykKICAgICAgICAgICAgLmF0dHIoJ2lkJywgJ0NvbGxhYk1lZXRpbmdMb2NhdGlvblNlY3Rpb24nKQogICAgICAgICAgICAuY3NzKCdkaXNwbGF5JywgTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlID09PSAnb25zaXRlJyA/ICdibG9jaycgOiAnbm9uZScpOwogICAgICAgICRMb2NhdGlvblNlY3Rpb24uYXBwZW5kKCQoJzxsYWJlbD4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbGFiZWwnKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2NhdGlvbicpICsgJyAqJykpOwogICAgICAgIHZhciAkTG9jYXRpb25JbnB1dCA9ICQoJzxpbnB1dD4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2lucHV0JykKICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAndGV4dCcpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsICdDb2xsYWJNZWV0aW5nTG9jYXRpb24nKQogICAgICAgICAgICAuYXR0cigncGxhY2Vob2xkZXInLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRW50ZXIgbWVldGluZyBsb2NhdGlvbi4uLicpKQogICAgICAgICAgICAudmFsKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Mb2NhdGlvbik7CiAgICAgICAgJExvY2F0aW9uSW5wdXQub24oJ2lucHV0JywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Mb2NhdGlvbiA9ICQodGhpcykudmFsKCk7CiAgICAgICAgICAgIFVwZGF0ZUNyZWF0ZUJ1dHRvblN0YXRlKCk7CiAgICAgICAgfSk7CiAgICAgICAgJExvY2F0aW9uU2VjdGlvbi5hcHBlbmQoJExvY2F0aW9uSW5wdXQpOwogICAgICAgICRCb2R5LmFwcGVuZCgkTG9jYXRpb25TZWN0aW9uKTsKCiAgICAgICAgLy8gRHVyYXRpb24gU2VjdGlvbgogICAgICAgIHZhciAkRHVyYXRpb25TZWN0aW9uID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbicpOwogICAgICAgICREdXJhdGlvblNlY3Rpb24uYXBwZW5kKCQoJzxsYWJlbD4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbGFiZWwnKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEdXJhdGlvbicpKSk7CiAgICAgICAgdmFyICREdXJhdGlvbnMgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbnMnKTsKICAgICAgICBbMTUsIDMwLCA0NSwgNjBdLmZvckVhY2goZnVuY3Rpb24oTWludXRlcykgewogICAgICAgICAgICB2YXIgJEJ0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZHVyYXRpb24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykKICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWR1cmF0aW9uJywgTWludXRlcykKICAgICAgICAgICAgICAgIC50ZXh0KE1pbnV0ZXMgKyAnICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWluJykpOwogICAgICAgICAgICBpZiAoTWludXRlcyA9PT0gTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkRHVyYXRpb24pIHsKICAgICAgICAgICAgICAgICRCdG4uYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9uLS1zZWxlY3RlZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRCdG4ub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREdXJhdGlvbiA9IE1pbnV0ZXM7CiAgICAgICAgICAgICAgICAkRHVyYXRpb25zLmZpbmQoJy5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbicpLnJlbW92ZUNsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbi0tc2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9uLS1zZWxlY3RlZCcpOwogICAgICAgICAgICAgICAgTG9hZEZyZWVCdXN5U2xvdHMoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICREdXJhdGlvbnMuYXBwZW5kKCRCdG4pOwogICAgICAgIH0pOwogICAgICAgICREdXJhdGlvblNlY3Rpb24uYXBwZW5kKCREdXJhdGlvbnMpOwogICAgICAgICRCb2R5LmFwcGVuZCgkRHVyYXRpb25TZWN0aW9uKTsKCiAgICAgICAgLy8gRGF0ZSBTZWN0aW9uCiAgICAgICAgdmFyICREYXRlU2VjdGlvbiA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3NlY3Rpb24nKTsKICAgICAgICAkRGF0ZVNlY3Rpb24uYXBwZW5kKCQoJzxsYWJlbD4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbGFiZWwnKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEYXRlJykpKTsKICAgICAgICB2YXIgJERhdGVQaWNrZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlUGlja2VyJyk7CiAgICAgICAgdmFyIFRvZGF5ID0gbmV3IERhdGUoKTsKICAgICAgICBUb2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICB2YXIgJERhdGVJbnB1dCA9ICQoJzxpbnB1dD4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RhdGVJbnB1dCcpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2RhdGUnKQogICAgICAgICAgICAuYXR0cignaWQnLCAnQ29sbGFiTWVldGluZ0RhdGUnKQogICAgICAgICAgICAuYXR0cignbWluJywgRm9ybWF0RGF0ZUZvcklucHV0KFRvZGF5KSkgIC8vIFByZXZlbnQgcGFzdCBkYXRlcwogICAgICAgICAgICAudmFsKEZvcm1hdERhdGVGb3JJbnB1dChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlKSk7CiAgICAgICAgJERhdGVJbnB1dC5vbignY2hhbmdlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBOZXdEYXRlID0gbmV3IERhdGUoJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgIC8vIEVuc3VyZSBkYXRlIGlzIG5vdCBpbiB0aGUgcGFzdAogICAgICAgICAgICBpZiAoTmV3RGF0ZSA8IFRvZGF5KSB7CiAgICAgICAgICAgICAgICBOZXdEYXRlID0gbmV3IERhdGUoVG9kYXkpOwogICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoRm9ybWF0RGF0ZUZvcklucHV0KE5ld0RhdGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlID0gTmV3RGF0ZTsKICAgICAgICAgICAgTG9hZEZyZWVCdXN5U2xvdHMoKTsKICAgICAgICB9KTsKICAgICAgICAkRGF0ZVBpY2tlci5hcHBlbmQoJERhdGVJbnB1dCk7CgogICAgICAgIHZhciAkRGF0ZU5hdiA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RhdGVOYXYnKTsKICAgICAgICB2YXIgJFByZXZCdG4gPSAkKCc8YnV0dG9uPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlQnRuJykuYXR0cigndHlwZScsICdidXR0b24nKS5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi1sZWZ0Ij48L2k+Jyk7CiAgICAgICAgJFByZXZCdG4ub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBOZXdEYXRlID0gbmV3IERhdGUoTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkRGF0ZSk7CiAgICAgICAgICAgIE5ld0RhdGUuc2V0RGF0ZShOZXdEYXRlLmdldERhdGUoKSAtIDEpOwogICAgICAgICAgICAvLyBQcmV2ZW50IGdvaW5nIGJlZm9yZSB0b2RheQogICAgICAgICAgICBpZiAoTmV3RGF0ZSA8IFRvZGF5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkRGF0ZSA9IE5ld0RhdGU7CiAgICAgICAgICAgICREYXRlSW5wdXQudmFsKEZvcm1hdERhdGVGb3JJbnB1dChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlKSk7CiAgICAgICAgICAgIExvYWRGcmVlQnVzeVNsb3RzKCk7CiAgICAgICAgfSk7CiAgICAgICAgdmFyICROZXh0QnRuID0gJCgnPGJ1dHRvbj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZUJ0bicpLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tcmlnaHQiPjwvaT4nKTsKICAgICAgICAkTmV4dEJ0bi5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkRGF0ZS5zZXREYXRlKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZERhdGUuZ2V0RGF0ZSgpICsgMSk7CiAgICAgICAgICAgICREYXRlSW5wdXQudmFsKEZvcm1hdERhdGVGb3JJbnB1dChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlKSk7CiAgICAgICAgICAgIExvYWRGcmVlQnVzeVNsb3RzKCk7CiAgICAgICAgfSk7CiAgICAgICAgJERhdGVOYXYuYXBwZW5kKCRQcmV2QnRuLCAkTmV4dEJ0bik7CiAgICAgICAgJERhdGVQaWNrZXIuYXBwZW5kKCREYXRlTmF2KTsKICAgICAgICAkRGF0ZVNlY3Rpb24uYXBwZW5kKCREYXRlUGlja2VyKTsKICAgICAgICAkQm9keS5hcHBlbmQoJERhdGVTZWN0aW9uKTsKCiAgICAgICAgLy8gVGltZSBTbG90cyBTZWN0aW9uCiAgICAgICAgdmFyICRTbG90c1NlY3Rpb24gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zZWN0aW9uJyk7CiAgICAgICAgJFNsb3RzU2VjdGlvbi5hcHBlbmQoJCgnPGxhYmVsPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F2YWlsYWJsZSBUaW1lcycpKSk7CiAgICAgICAgdmFyICRTbG90c0NvbnRhaW5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RzJykuYXR0cignaWQnLCAnQ29sbGFiTWVldGluZ1Nsb3RzQ29udGFpbmVyJyk7CiAgICAgICAgJFNsb3RzQ29udGFpbmVyLmFwcGVuZCgKICAgICAgICAgICAgJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbG9hZGluZycpLmh0bWwoCiAgICAgICAgICAgICAgICAnPGkgY2xhc3M9ImZhIGZhLXNwaW5uZXIgZmEtc3BpbiI+PC9pPicgKwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0xvYWRpbmcgYXZhaWxhYmxlIHRpbWVzLi4uJykKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICAgICAgJFNsb3RzU2VjdGlvbi5hcHBlbmQoJFNsb3RzQ29udGFpbmVyKTsKICAgICAgICAkU2xvdHNTZWN0aW9uLmFwcGVuZCgkKCc8cD4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9faGludCcpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09ubHkgdGltZXMgd2hlbiBib3RoIGF0dGVuZGVlcyBhcmUgYXZhaWxhYmxlIGFyZSBzaG93bi4nKSkpOwogICAgICAgICRCb2R5LmFwcGVuZCgkU2xvdHNTZWN0aW9uKTsKCiAgICAgICAgJERpYWxvZ0JveC5hcHBlbmQoJEJvZHkpOwoKICAgICAgICAvLyBGb290ZXIKICAgICAgICB2YXIgJEZvb3RlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2Zvb3RlcicpOwogICAgICAgIHZhciAkQ2FuY2VsQnRuID0gJCgnPGJ1dHRvbj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYnRuJykuYXR0cigndHlwZScsICdidXR0b24nKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwnKSk7CiAgICAgICAgJENhbmNlbEJ0bi5vbignY2xpY2snLCBIaWRlTWVldGluZ1NjaGVkdWxlckRpYWxvZyk7CiAgICAgICAgdmFyICRDcmVhdGVCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYnRuIENvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2J0bi0tcHJpbWFyeScpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgIC5hdHRyKCdpZCcsICdDb2xsYWJNZWV0aW5nQ3JlYXRlQnRuJykKICAgICAgICAgICAgLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NyZWF0ZSBBcHBvaW50bWVudCcpKTsKICAgICAgICAkQ3JlYXRlQnRuLm9uKCdjbGljaycsIENyZWF0ZU1lZXRpbmdGcm9tRGlhbG9nKTsKICAgICAgICAkRm9vdGVyLmFwcGVuZCgkQ2FuY2VsQnRuLCAkQ3JlYXRlQnRuKTsKICAgICAgICAkRGlhbG9nQm94LmFwcGVuZCgkRm9vdGVyKTsKCiAgICAgICAgJERpYWxvZy5hcHBlbmQoJERpYWxvZ0JveCk7CgogICAgICAgIC8vIENsb3NlIG9uIG92ZXJsYXkgY2xpY2sKICAgICAgICAkRGlhbG9nLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmlzKCcuQ29sbGFiTWVldGluZ1NjaGVkdWxlcicpKSB7CiAgICAgICAgICAgICAgICBIaWRlTWVldGluZ1NjaGVkdWxlckRpYWxvZygpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIENsb3NlIG9uIGVzY2FwZSAtIHJlbW92ZSBmaXJzdCB0byBwcmV2ZW50IGR1cGxpY2F0ZXMKICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24ubWVldGluZ1NjaGVkdWxlcicpLm9uKCdrZXlkb3duLm1lZXRpbmdTY2hlZHVsZXInLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIGlmIChlLmtleSA9PT0gJ0VzY2FwZScpIHsKICAgICAgICAgICAgICAgIEhpZGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cgPSAkRGlhbG9nOwogICAgICAgICQoJ2JvZHknKS5hcHBlbmQoJERpYWxvZyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBhbiBhdHRlbmRlZSBlbGVtZW50IGZvciB0aGUgZGlhbG9nCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZUF0dGVuZGVlRWxlbWVudChSb2xlLCBFbWFpbCwgTmFtZSkgewogICAgICAgIHZhciAkQXR0ZW5kZWUgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZScpOwoKICAgICAgICAkQXR0ZW5kZWUuYXBwZW5kKCQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZVJvbGUnKS50ZXh0KFJvbGUpKTsKCiAgICAgICAgLy8gQXZhdGFyCiAgICAgICAgdmFyICRBdmF0YXJXcmFwID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVBdmF0YXInKTsKICAgICAgICB2YXIgJEF2YXRhciA9IFRhcmdldE5TLkNyZWF0ZUF2YXRhcih7CiAgICAgICAgICAgIGVtYWlsOiBFbWFpbCwKICAgICAgICAgICAgc2l6ZTogJ21lZGl1bScsCiAgICAgICAgICAgIHNob3dQcmVzZW5jZTogdHJ1ZSwKICAgICAgICAgICAgY2xpY2thYmxlOiBmYWxzZQogICAgICAgIH0pOwogICAgICAgICRBdmF0YXJXcmFwLmFwcGVuZCgkQXZhdGFyKTsKICAgICAgICAkQXR0ZW5kZWUuYXBwZW5kKCRBdmF0YXJXcmFwKTsKCiAgICAgICAgLy8gSW5mbwogICAgICAgIHZhciAkSW5mbyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlSW5mbycpOwogICAgICAgICRJbmZvLmFwcGVuZCgkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZU5hbWUnKS50ZXh0KE5hbWUpKTsKICAgICAgICAkSW5mby5hcHBlbmQoJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVFbWFpbCcpLnRleHQoRW1haWwpKTsKICAgICAgICAkQXR0ZW5kZWUuYXBwZW5kKCRJbmZvKTsKCiAgICAgICAgcmV0dXJuICRBdHRlbmRlZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gU2hvdyB0aGUgbWVldGluZyBzY2hlZHVsZXIgZGlhbG9nCiAgICAgKi8KICAgIGZ1bmN0aW9uIFNob3dNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCkgewogICAgICAgIGlmIChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZykgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXItLXZpc2libGUnKTsKICAgICAgICAgICAgfSwgMTApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gSGlkZSB0aGUgbWVldGluZyBzY2hlZHVsZXIgZGlhbG9nCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhpZGVNZWV0aW5nU2NoZWR1bGVyRGlhbG9nKCkgewogICAgICAgIGlmIChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZykgewogICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuJERpYWxvZy5yZW1vdmVDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlci0tdmlzaWJsZScpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS4kRGlhbG9nKSB7CiAgICAgICAgICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLiREaWFsb2cgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCAyMDApOwogICAgICAgIH0KICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2tleWRvd24ubWVldGluZ1NjaGVkdWxlcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBMb2FkIGZyZWUvYnVzeSBzbG90cyBmb3Igc2VsZWN0ZWQgZGF0ZQogICAgICovCiAgICBmdW5jdGlvbiBMb2FkRnJlZUJ1c3lTbG90cygpIHsKICAgICAgICB2YXIgJENvbnRhaW5lciA9ICQoJyNDb2xsYWJNZWV0aW5nU2xvdHNDb250YWluZXInKTsKICAgICAgICBpZiAoISRDb250YWluZXIubGVuZ3RoKSByZXR1cm47CgogICAgICAgIC8vIFNob3cgbG9hZGluZwogICAgICAgICRDb250YWluZXIuaHRtbCgKICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2xvYWRpbmciPicgKwogICAgICAgICAgICAnPGkgY2xhc3M9ImZhIGZhLXNwaW5uZXIgZmEtc3BpbiI+PC9pPicgKwogICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9hZGluZyBhdmFpbGFibGUgdGltZXMuLi4nKSArCiAgICAgICAgICAgICc8L2Rpdj4nCiAgICAgICAgKTsKCiAgICAgICAgLy8gRGlzYWJsZSBjcmVhdGUgYnV0dG9uCiAgICAgICAgJCgnI0NvbGxhYk1lZXRpbmdDcmVhdGVCdG4nKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZFNsb3QgPSBudWxsOwoKICAgICAgICB2YXIgT3duZXJFbWFpbCA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Pd25lckRhdGEuZW1haWw7CiAgICAgICAgdmFyIEN1c3RvbWVyRW1haWwgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuQ3VzdG9tZXJEYXRhLmVtYWlsOwogICAgICAgIHZhciBTZWxlY3RlZERhdGUgPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuU2VsZWN0ZWREYXRlOwogICAgICAgIHZhciBEdXJhdGlvbiA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZER1cmF0aW9uOwoKICAgICAgICAvLyBDYWxjdWxhdGUgc3RhcnQvZW5kIG9mIGRheQogICAgICAgIHZhciBTdGFydE9mRGF5ID0gbmV3IERhdGUoU2VsZWN0ZWREYXRlKTsKICAgICAgICBTdGFydE9mRGF5LnNldEhvdXJzKDgsIDAsIDAsIDApOwogICAgICAgIHZhciBFbmRPZkRheSA9IG5ldyBEYXRlKFNlbGVjdGVkRGF0ZSk7CiAgICAgICAgRW5kT2ZEYXkuc2V0SG91cnMoMTgsIDAsIDAsIDApOwoKICAgICAgICAvLyBHZXQgZnJlZS9idXN5IGZvciBib3RoIGF0dGVuZGVlcwogICAgICAgIFByb21pc2UuYWxsKFsKICAgICAgICAgICAgQ29sbGFiLkdldEZyZWVCdXN5KFtPd25lckVtYWlsXSwgU3RhcnRPZkRheSwgRW5kT2ZEYXkpLAogICAgICAgICAgICBDb2xsYWIuR2V0RnJlZUJ1c3koW0N1c3RvbWVyRW1haWxdLCBTdGFydE9mRGF5LCBFbmRPZkRheSkKICAgICAgICBdKS50aGVuKGZ1bmN0aW9uKFJlc3VsdHMpIHsKICAgICAgICAgICAgdmFyIE93bmVyU2NoZWR1bGUgPSBSZXN1bHRzWzBdICYmIFJlc3VsdHNbMF1bT3duZXJFbWFpbF0gPyBSZXN1bHRzWzBdW093bmVyRW1haWxdIDogW107CiAgICAgICAgICAgIHZhciBDdXN0b21lclNjaGVkdWxlID0gUmVzdWx0c1sxXSAmJiBSZXN1bHRzWzFdW0N1c3RvbWVyRW1haWxdID8gUmVzdWx0c1sxXVtDdXN0b21lckVtYWlsXSA6IFtdOwoKICAgICAgICAgICAgLy8gR2VuZXJhdGUgYWxsIHBvc3NpYmxlIHNsb3RzCiAgICAgICAgICAgIHZhciBBbGxTbG90cyA9IEdlbmVyYXRlVGltZVNsb3RzKFN0YXJ0T2ZEYXksIEVuZE9mRGF5LCBEdXJhdGlvbik7CgogICAgICAgICAgICAvLyBGaWx0ZXIgdG8gb25seSBmcmVlIHNsb3RzIChib3RoIGF0dGVuZGVlcyBhdmFpbGFibGUpCiAgICAgICAgICAgIHZhciBGcmVlU2xvdHMgPSBBbGxTbG90cy5maWx0ZXIoZnVuY3Rpb24oU2xvdCkgewogICAgICAgICAgICAgICAgdmFyIE93bmVyRnJlZSA9IElzU2xvdEZyZWUoU2xvdCwgT3duZXJTY2hlZHVsZSk7CiAgICAgICAgICAgICAgICB2YXIgQ3VzdG9tZXJGcmVlID0gSXNTbG90RnJlZShTbG90LCBDdXN0b21lclNjaGVkdWxlKTsKICAgICAgICAgICAgICAgIHJldHVybiBPd25lckZyZWUgJiYgQ3VzdG9tZXJGcmVlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5GcmVlU2xvdHMgPSBGcmVlU2xvdHM7CgogICAgICAgICAgICAvLyBSZW5kZXIgc2xvdHMKICAgICAgICAgICAgUmVuZGVyVGltZVNsb3RzKCRDb250YWluZXIsIEZyZWVTbG90cyk7CgogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAkQ29udGFpbmVyLmh0bWwoCiAgICAgICAgICAgICAgICAnPGRpdiBjbGFzcz0iQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZW1wdHkiPicgKwogICAgICAgICAgICAgICAgJzxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSI+PC9pPicgKwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZhaWxlZCB0byBsb2FkIGF2YWlsYWJpbGl0eSBkYXRhLicpICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdlbmVyYXRlIHRpbWUgc2xvdHMgZm9yIGEgZ2l2ZW4gcmFuZ2UgKG9ubHkgZnV0dXJlIHNsb3RzKQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZVRpbWVTbG90cyhTdGFydCwgRW5kLCBEdXJhdGlvbk1pbnV0ZXMpIHsKICAgICAgICB2YXIgU2xvdHMgPSBbXTsKICAgICAgICB2YXIgQ3VycmVudCA9IG5ldyBEYXRlKFN0YXJ0KTsKICAgICAgICB2YXIgTm93ID0gbmV3IERhdGUoKTsKCiAgICAgICAgd2hpbGUgKEN1cnJlbnQgPCBFbmQpIHsKICAgICAgICAgICAgdmFyIFNsb3RFbmQgPSBuZXcgRGF0ZShDdXJyZW50LmdldFRpbWUoKSArIER1cmF0aW9uTWludXRlcyAqIDYwICogMTAwMCk7CiAgICAgICAgICAgIC8vIE9ubHkgaW5jbHVkZSBzbG90cyB0aGF0IHN0YXJ0IGluIHRoZSBmdXR1cmUKICAgICAgICAgICAgaWYgKFNsb3RFbmQgPD0gRW5kICYmIEN1cnJlbnQgPiBOb3cpIHsKICAgICAgICAgICAgICAgIFNsb3RzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBuZXcgRGF0ZShDdXJyZW50KSwKICAgICAgICAgICAgICAgICAgICBlbmQ6IFNsb3RFbmQKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEN1cnJlbnQgPSBuZXcgRGF0ZShDdXJyZW50LmdldFRpbWUoKSArIER1cmF0aW9uTWludXRlcyAqIDYwICogMTAwMCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gU2xvdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGEgc2xvdCBpcyBmcmVlIGJhc2VkIG9uIGJ1c3kgcGVyaW9kcwogICAgICovCiAgICBmdW5jdGlvbiBJc1Nsb3RGcmVlKFNsb3QsIEJ1c3lQZXJpb2RzKSB7CiAgICAgICAgaWYgKCFCdXN5UGVyaW9kcyB8fCAhQnVzeVBlcmlvZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBObyBidXN5IHBlcmlvZHMgPSBmcmVlCiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEJ1c3lQZXJpb2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBCdXN5ID0gQnVzeVBlcmlvZHNbaV07CiAgICAgICAgICAgIHZhciBCdXN5U3RhcnQgPSBuZXcgRGF0ZShCdXN5LnN0YXJ0KTsKICAgICAgICAgICAgdmFyIEJ1c3lFbmQgPSBuZXcgRGF0ZShCdXN5LmVuZCk7CgogICAgICAgICAgICAvLyBDaGVjayBmb3Igb3ZlcmxhcAogICAgICAgICAgICBpZiAoU2xvdC5zdGFydCA8IEJ1c3lFbmQgJiYgU2xvdC5lbmQgPiBCdXN5U3RhcnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gT3ZlcmxhcCBmb3VuZAogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gVXBkYXRlIHRoZSBjcmVhdGUgYnV0dG9uIHN0YXRlIGJhc2VkIG9uIGN1cnJlbnQgZm9ybSB2YWxpZGl0eQogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVDcmVhdGVCdXR0b25TdGF0ZSgpIHsKICAgICAgICB2YXIgJENyZWF0ZUJ0biA9ICQoJyNDb2xsYWJNZWV0aW5nQ3JlYXRlQnRuJyk7CiAgICAgICAgaWYgKCEkQ3JlYXRlQnRuLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICB2YXIgSXNWYWxpZCA9IHRydWU7CgogICAgICAgIC8vIE11c3QgaGF2ZSBhIHNlbGVjdGVkIHNsb3QKICAgICAgICBpZiAoIU1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZFNsb3QpIHsKICAgICAgICAgICAgSXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIG9uLXNpdGUgbWVldGluZ3MsIGxvY2F0aW9uIGlzIHJlcXVpcmVkCiAgICAgICAgaWYgKE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5NZWV0aW5nVHlwZSA9PT0gJ29uc2l0ZScgJiYgIU1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Mb2NhdGlvbi50cmltKCkpIHsKICAgICAgICAgICAgSXNWYWxpZCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgJENyZWF0ZUJ0bi5hdHRyKCdkaXNhYmxlZCcsICFJc1ZhbGlkKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUmVuZGVyIHRpbWUgc2xvdHMgaW4gY29udGFpbmVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlbmRlclRpbWVTbG90cygkQ29udGFpbmVyLCBTbG90cykgewogICAgICAgICRDb250YWluZXIuZW1wdHkoKTsKCiAgICAgICAgaWYgKCFTbG90cy5sZW5ndGgpIHsKICAgICAgICAgICAgJENvbnRhaW5lci5odG1sKAogICAgICAgICAgICAgICAgJzxkaXYgY2xhc3M9IkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2VtcHR5Ij4nICsKICAgICAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXItdGltZXMtbyI+PC9pPicgKwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vIGF2YWlsYWJsZSB0aW1lcyBmb3IgdGhpcyBkYXRlLicpICsKICAgICAgICAgICAgICAgICc8L2Rpdj4nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFNsb3RzLmZvckVhY2goZnVuY3Rpb24oU2xvdCwgSW5kZXgpIHsKICAgICAgICAgICAgdmFyICRTbG90ID0gJCgnPGRpdj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90JykKICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWluZGV4JywgSW5kZXgpOwoKICAgICAgICAgICAgJFNsb3QuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RSYWRpbycpKTsKICAgICAgICAgICAgJFNsb3QuYXBwZW5kKCQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90VGltZScpLnRleHQoCiAgICAgICAgICAgICAgICBGb3JtYXRUaW1lKFNsb3Quc3RhcnQpICsgJyAtICcgKyBGb3JtYXRUaW1lKFNsb3QuZW5kKQogICAgICAgICAgICApKTsKCiAgICAgICAgICAgIC8vIEZpcnN0IHNsb3QgaW5kaWNhdG9yCiAgICAgICAgICAgIGlmIChJbmRleCA9PT0gMCkgewogICAgICAgICAgICAgICAgJFNsb3QuYXBwZW5kKCQoJzxzcGFuPicpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90SW5kaWNhdG9yJykuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLXN0YXIiPjwvaT4nKSk7CiAgICAgICAgICAgICAgICAvLyBBdXRvLXNlbGVjdCBmaXJzdCBzbG90CiAgICAgICAgICAgICAgICAkU2xvdC5hZGRDbGFzcygnQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdC0tc2VsZWN0ZWQnKTsKICAgICAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5TZWxlY3RlZFNsb3QgPSBTbG90OwogICAgICAgICAgICAgICAgVXBkYXRlQ3JlYXRlQnV0dG9uU3RhdGUoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNsb3Qub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAkQ29udGFpbmVyLmZpbmQoJy5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90JykucmVtb3ZlQ2xhc3MoJ0NvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3QtLXNlbGVjdGVkJyk7CiAgICAgICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCdDb2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90LS1zZWxlY3RlZCcpOwogICAgICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkU2xvdCA9IFNsb3RzW0luZGV4XTsKICAgICAgICAgICAgICAgIFVwZGF0ZUNyZWF0ZUJ1dHRvblN0YXRlKCk7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJENvbnRhaW5lci5hcHBlbmQoJFNsb3QpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgbWVldGluZyBmcm9tIGRpYWxvZyBkYXRhCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZU1lZXRpbmdGcm9tRGlhbG9nKCkgewogICAgICAgIGlmIChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuSXNDcmVhdGluZykgcmV0dXJuOwogICAgICAgIGlmICghTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkU2xvdCkgcmV0dXJuOwoKICAgICAgICAvLyBWYWxpZGF0ZSBsb2NhdGlvbiBmb3Igb24tc2l0ZSBtZWV0aW5ncwogICAgICAgIGlmIChNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTWVldGluZ1R5cGUgPT09ICdvbnNpdGUnICYmICFNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTG9jYXRpb24udHJpbSgpKSB7CiAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgbWVzc2FnZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1BsZWFzZSBlbnRlciBhIGxvY2F0aW9uIGZvciB0aGUgb24tc2l0ZSBtZWV0aW5nLicpLAogICAgICAgICAgICAgICAgb25DbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnI0NvbGxhYk1lZXRpbmdMb2NhdGlvbicpLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuSXNDcmVhdGluZyA9IHRydWU7CgogICAgICAgIHZhciAkQ3JlYXRlQnRuID0gJCgnI0NvbGxhYk1lZXRpbmdDcmVhdGVCdG4nKTsKICAgICAgICAkQ3JlYXRlQnRuLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSkudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3JlYXRpbmcuLi4nKSk7CgogICAgICAgIHZhciBTdWJqZWN0ID0gJCgnI0NvbGxhYk1lZXRpbmdTdWJqZWN0JykudmFsKCkgfHwgJ01lZXRpbmcnOwogICAgICAgIHZhciBTbG90ID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLlNlbGVjdGVkU2xvdDsKICAgICAgICB2YXIgVGlja2V0RGF0YSA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5UaWNrZXREYXRhOwogICAgICAgIHZhciBDdXN0b21lckVtYWlsID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLkN1c3RvbWVyRGF0YS5lbWFpbDsKICAgICAgICB2YXIgT3duZXJFbWFpbCA9IE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Pd25lckRhdGEuZW1haWw7CiAgICAgICAgdmFyIE1lZXRpbmdUeXBlID0gTWVldGluZ1NjaGVkdWxlclN0YXRlLk1lZXRpbmdUeXBlOwoKICAgICAgICBpZiAoTWVldGluZ1R5cGUgPT09ICd0ZWFtcycpIHsKICAgICAgICAgICAgLy8gVGVhbXMgTWVldGluZzogQ3JlYXRlIFRlYW1zIG1lZXRpbmcgZmlyc3QsIHRoZW4gWm51bnkgYXBwb2ludG1lbnQKICAgICAgICAgICAgQ3JlYXRlVGVhbXNNZWV0aW5nQW5kQXBwb2ludG1lbnQoU3ViamVjdCwgU2xvdCwgVGlja2V0RGF0YSwgQ3VzdG9tZXJFbWFpbCwgT3duZXJFbWFpbCwgJENyZWF0ZUJ0bik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gT24tc2l0ZSBNZWV0aW5nOiBPbmx5IGNyZWF0ZSBabnVueSBhcHBvaW50bWVudAogICAgICAgICAgICBDcmVhdGVPbnNpdGVBcHBvaW50bWVudChTdWJqZWN0LCBTbG90LCBUaWNrZXREYXRhLCBDdXN0b21lckVtYWlsLCBPd25lckVtYWlsLCAkQ3JlYXRlQnRuKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBUZWFtcyBtZWV0aW5nICh2aWEgQ2FsZW5kYXIgRXZlbnQgQVBJKSBhbmQgdGhlbiBabnVueSBhcHBvaW50bWVudAogICAgICogICAgICAgICAgICAgIFVzZXMgQ3JlYXRlQ2FsZW5kYXJFdmVudCB3aGljaCBzdG9yZXMgR3JhcGhFdmVudElEIGZvciBsYXRlciBjYW5jZWxsYXRpb24KICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlVGVhbXNNZWV0aW5nQW5kQXBwb2ludG1lbnQoU3ViamVjdCwgU2xvdCwgVGlja2V0RGF0YSwgQ3VzdG9tZXJFbWFpbCwgT3duZXJFbWFpbCwgJENyZWF0ZUJ0bikgewogICAgICAgIHZhciBFdmVudERldGFpbHMgPSB7CiAgICAgICAgICAgIHN1YmplY3Q6IFN1YmplY3QsCiAgICAgICAgICAgIHN0YXJ0RGF0ZVRpbWU6IEZvcm1hdExvY2FsSVNPU3RyaW5nKFNsb3Quc3RhcnQpLAogICAgICAgICAgICBlbmREYXRlVGltZTogRm9ybWF0TG9jYWxJU09TdHJpbmcoU2xvdC5lbmQpLAogICAgICAgICAgICBhdHRlbmRlZXM6IFtDdXN0b21lckVtYWlsLCBPd25lckVtYWlsXSwKICAgICAgICAgICAgaXNPbmxpbmVNZWV0aW5nOiB0cnVlLCAgLy8gQ3JlYXRlcyBUZWFtcyBtZWV0aW5nIHZpYSBDYWxlbmRhciBFdmVudHMgQVBJCiAgICAgICAgICAgIHRpbWVab25lOiBDb2xsYWIuR2V0VXNlclRpbWVab25lKCkKICAgICAgICB9OwoKICAgICAgICBDb2xsYWIuQ3JlYXRlQ2FsZW5kYXJFdmVudChFdmVudERldGFpbHMpLnRoZW4oZnVuY3Rpb24oQ2FsZW5kYXJFdmVudCkgewogICAgICAgICAgICAvLyBDcmVhdGUgWm51bnkgYXBwb2ludG1lbnQgd2l0aCBHcmFwaEV2ZW50SUQgZm9yIGxhdGVyIGNhbmNlbGxhdGlvbgogICAgICAgICAgICB2YXIgRGVzY3JpcHRpb24gPSBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGVhbXMgTWVldGluZycpICsgJ1xuXG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0dyYXBoRXZlbnRJRDogJyArIENhbGVuZGFyRXZlbnQuaWQgKyAnXG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0pvaW4gVVJMJykgKyAnOiAnICsgQ2FsZW5kYXJFdmVudC5qb2luVXJsICsgJ1xuXG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F0dGVuZGVlcycpICsgJzpcbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLSAnICsgTWVldGluZ1NjaGVkdWxlclN0YXRlLk93bmVyRGF0YS5uYW1lICsgJyAoJyArIE93bmVyRW1haWwgKyAnKVxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICctICcgKyBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuQ3VzdG9tZXJEYXRhLm5hbWUgKyAnICgnICsgQ3VzdG9tZXJFbWFpbCArICcpJzsKCiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDb2xsYWJvcmF0aW9uQUpBWCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnQ3JlYXRlQXBwb2ludG1lbnQnLAogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksICAvLyBTRUNVUklUWTogQ1NSRiBwcm90ZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQ6IFRpY2tldERhdGEuVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVGl0bGU6IFN1YmplY3QsCiAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBGb3JtYXREYXRlVGltZUZvclpudW55KFNsb3Quc3RhcnQpLAogICAgICAgICAgICAgICAgICAgIEVuZFRpbWU6IEZvcm1hdERhdGVUaW1lRm9yWm51bnkoU2xvdC5lbmQpLAogICAgICAgICAgICAgICAgICAgIFRpbWVab25lOiBDb2xsYWIuR2V0VXNlclRpbWVab25lKCksICAvLyBTdGFydFRpbWUvRW5kVGltZSBhcmUgd2FsbC1jbG9jaywgbm90IFVUQyAtIGJhY2tlbmQgY29udmVydHMgdXNpbmcgdGhpcwogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiBEZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb2NhdGlvbjogJ01pY3Jvc29mdCBUZWFtcyBNZWV0aW5nJyAgLy8gU2hvcnQgbG9jYXRpb24sIGZ1bGwgVVJMIGluIERlc2NyaXB0aW9uCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuSXNDcmVhdGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZSA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERldGFpbCA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuV2FybmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSArPSAnXG4nICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdGUnKSArICc6ICcgKyBSZXNwb25zZS5XYXJuaW5nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxlbmRhckV2ZW50LmpvaW5VcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGFpbCA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKb2luIFVSTCcpICsgJzpcbicgKyBDYWxlbmRhckV2ZW50LmpvaW5Vcmw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgSGlkZU1lZXRpbmdTY2hlZHVsZXJEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGFjdGlvbiBidXR0b25zIGZvciBUZWFtcyBtZWV0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBBY3Rpb25CdXR0b25zID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDYWxlbmRhckV2ZW50LmpvaW5VcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvcHkgbGluayBidXR0b24gKGFsd2F5cyBzaG93bikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkJ1dHRvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvcHkgTGluaycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICdmYS1jb3B5JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbigkRGlhbG9nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlUb0NsaXBib2FyZChDYWxlbmRhckV2ZW50LmpvaW5VcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJEJ0biA9ICREaWFsb2cuZmluZCgnW2RhdGEtYWN0aW9uLWluZGV4PSIwIl0nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJ0bi5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2hlY2siPjwvaT4gJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDb3BpZWQhJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEJ0bi5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY29weSI+PC9pPiAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NvcHkgTGluaycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSm9pbiBtZWV0aW5nIGJ1dHRvbiAob25seSBpZiBtZWV0aW5nIHN0YXJ0cyB3aXRoaW4gMTUgbWludXRlcykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOb3cgPSBuZXcgRGF0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE1pbnV0ZXNVbnRpbFN0YXJ0ID0gKFNsb3Quc3RhcnQuZ2V0VGltZSgpIC0gTm93LmdldFRpbWUoKSkgLyAoMTAwMCAqIDYwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNaW51dGVzVW50aWxTdGFydCA8PSAxNSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbkJ1dHRvbnMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKb2luIE1lZXRpbmcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbjogJ2ZhLXZpZGVvLWNhbWVyYScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnQ29sbGFiRGlhbG9nX19hY3Rpb25CdG4gQ29sbGFiRGlhbG9nX19hY3Rpb25CdG4tLXByaW1hcnknLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbigkRGlhbG9nLCBDbG9zZURpYWxvZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oQ2FsZW5kYXJFdmVudC5qb2luVXJsLCAnX2JsYW5rJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50IGNyZWF0ZWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IERldGFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbnM6IEFjdGlvbkJ1dHRvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWxvYWQgcGFnZSB0byBzaG93IHRoZSBhcHBvaW50bWVudCBsaW5rIGluIHRpY2tldCB6b29tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRXJyb3JNc2cgPSBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ2FsZW5kYXIgZXZlbnQgY3JlYXRlZCwgYnV0IFpudW55IGFwcG9pbnRtZW50IGZhaWxlZC4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEVycm9yRGV0YWlsID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZSAmJiBSZXNwb25zZS5FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JEZXRhaWwgPSBSZXNwb25zZS5FcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsZW5kYXJFdmVudC5qb2luVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckRldGFpbCArPSAoRXJyb3JEZXRhaWwgPyAnXG5cbicgOiAnJykgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSm9pbiBVUkwnKSArICc6XG4nICsgQ2FsZW5kYXJFdmVudC5qb2luVXJsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogRXJyb3JNc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IEVycm9yRGV0YWlsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3JlYXRlQnRuLmF0dHIoJ2Rpc2FibGVkJywgZmFsc2UpLnRleHQoQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0NyZWF0ZSBBcHBvaW50bWVudCcpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CgogICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uKEVycm9yKSB7CiAgICAgICAgICAgIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Jc0NyZWF0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGYWlsZWQgdG8gY3JlYXRlIG1lZXRpbmcuJyksCiAgICAgICAgICAgICAgICBkZXRhaWw6IEVycm9yLm1lc3NhZ2UgfHwgU3RyaW5nKEVycm9yKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJENyZWF0ZUJ0bi5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDcmVhdGUgQXBwb2ludG1lbnQnKSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBvbi1zaXRlIGFwcG9pbnRtZW50ICh2aWEgQ2FsZW5kYXIgRXZlbnQgQVBJICsgWm51bnkpCiAgICAgKiAgICAgICAgICAgICAgQ3JlYXRlcyBPdXRsb29rIGNhbGVuZGFyIGV2ZW50ICh3aXRob3V0IFRlYW1zKSBmb3IgaW52aXRhdGlvbi9jYW5jZWxsYXRpb24gZW1haWxzCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZU9uc2l0ZUFwcG9pbnRtZW50KFN1YmplY3QsIFNsb3QsIFRpY2tldERhdGEsIEN1c3RvbWVyRW1haWwsIE93bmVyRW1haWwsICRDcmVhdGVCdG4pIHsKICAgICAgICB2YXIgTG9jYXRpb24gPSBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuTG9jYXRpb24udHJpbSgpOwoKICAgICAgICB2YXIgRXZlbnREZXRhaWxzID0gewogICAgICAgICAgICBzdWJqZWN0OiBTdWJqZWN0LAogICAgICAgICAgICBzdGFydERhdGVUaW1lOiBGb3JtYXRMb2NhbElTT1N0cmluZyhTbG90LnN0YXJ0KSwKICAgICAgICAgICAgZW5kRGF0ZVRpbWU6IEZvcm1hdExvY2FsSVNPU3RyaW5nKFNsb3QuZW5kKSwKICAgICAgICAgICAgYXR0ZW5kZWVzOiBbQ3VzdG9tZXJFbWFpbCwgT3duZXJFbWFpbF0sCiAgICAgICAgICAgIGlzT25saW5lTWVldGluZzogZmFsc2UsICAvLyBObyBUZWFtcyBtZWV0aW5nIC0ganVzdCBjYWxlbmRhciBldmVudAogICAgICAgICAgICBsb2NhdGlvbjogTG9jYXRpb24sCiAgICAgICAgICAgIHRpbWVab25lOiBDb2xsYWIuR2V0VXNlclRpbWVab25lKCkKICAgICAgICB9OwoKICAgICAgICBDb2xsYWIuQ3JlYXRlQ2FsZW5kYXJFdmVudChFdmVudERldGFpbHMpLnRoZW4oZnVuY3Rpb24oQ2FsZW5kYXJFdmVudCkgewogICAgICAgICAgICAvLyBDcmVhdGUgWm51bnkgYXBwb2ludG1lbnQgd2l0aCBHcmFwaEV2ZW50SUQgZm9yIGxhdGVyIGNhbmNlbGxhdGlvbgogICAgICAgICAgICB2YXIgRGVzY3JpcHRpb24gPSBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT24tc2l0ZSBNZWV0aW5nJykgKyAnXG5cbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnR3JhcGhFdmVudElEOiAnICsgQ2FsZW5kYXJFdmVudC5pZCArICdcbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9jYXRpb24nKSArICc6ICcgKyBMb2NhdGlvbiArICdcblxuJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdHRlbmRlZXMnKSArICc6XG4nICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy0gJyArIE1lZXRpbmdTY2hlZHVsZXJTdGF0ZS5Pd25lckRhdGEubmFtZSArICcgKCcgKyBPd25lckVtYWlsICsgJylcbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLSAnICsgTWVldGluZ1NjaGVkdWxlclN0YXRlLkN1c3RvbWVyRGF0YS5uYW1lICsgJyAoJyArIEN1c3RvbWVyRW1haWwgKyAnKSc7CgogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0NyZWF0ZUFwcG9pbnRtZW50JywKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogQ29yZS5Db25maWcuR2V0KCdDaGFsbGVuZ2VUb2tlbicpLCAgLy8gU0VDVVJJVFk6IENTUkYgcHJvdGVjdGlvbgogICAgICAgICAgICAgICAgICAgIFRpY2tldElEOiBUaWNrZXREYXRhLlRpY2tldElELAogICAgICAgICAgICAgICAgICAgIFRpdGxlOiBTdWJqZWN0LAogICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZTogRm9ybWF0RGF0ZVRpbWVGb3JabnVueShTbG90LnN0YXJ0KSwKICAgICAgICAgICAgICAgICAgICBFbmRUaW1lOiBGb3JtYXREYXRlVGltZUZvclpudW55KFNsb3QuZW5kKSwKICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZTogQ29sbGFiLkdldFVzZXJUaW1lWm9uZSgpLCAgLy8gU3RhcnRUaW1lL0VuZFRpbWUgYXJlIHdhbGwtY2xvY2ssIG5vdCBVVEMgLSBiYWNrZW5kIGNvbnZlcnRzIHVzaW5nIHRoaXMKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogRGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgTG9jYXRpb246IExvY2F0aW9uCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBNZWV0aW5nU2NoZWR1bGVyU3RhdGUuSXNDcmVhdGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgTWVzc2FnZSA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPbi1zaXRlIGFwcG9pbnRtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IScpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuV2FybmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSArPSAnXG4nICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdGUnKSArICc6ICcgKyBSZXNwb25zZS5XYXJuaW5nOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEZXRhaWwgPSBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9jYXRpb24nKSArICc6ICcgKyBMb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgSGlkZU1lZXRpbmdTY2hlZHVsZXJEaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50IGNyZWF0ZWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IE1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IERldGFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCBwYWdlIHRvIHNob3cgdGhlIGFwcG9pbnRtZW50IGxpbmsgaW4gdGlja2V0IHpvb20KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBFcnJvck1zZyA9IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYWxlbmRhciBldmVudCBjcmVhdGVkLCBidXQgWm51bnkgYXBwb2ludG1lbnQgZmFpbGVkLicpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRXJyb3JEZXRhaWwgPSAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuRXJyb3IpID8gUmVzcG9uc2UuRXJyb3IgOiAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FybmluZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBFcnJvck1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbDogRXJyb3JEZXRhaWwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICRDcmVhdGVCdG4uYXR0cignZGlzYWJsZWQnLCBmYWxzZSkudGV4dChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ3JlYXRlIEFwcG9pbnRtZW50JykpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKCiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oRXJyb3IpIHsKICAgICAgICAgICAgTWVldGluZ1NjaGVkdWxlclN0YXRlLklzQ3JlYXRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLAogICAgICAgICAgICAgICAgbWVzc2FnZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZhaWxlZCB0byBjcmVhdGUgYXBwb2ludG1lbnQuJyksCiAgICAgICAgICAgICAgICBkZXRhaWw6IEVycm9yLm1lc3NhZ2UgfHwgU3RyaW5nKEVycm9yKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJENyZWF0ZUJ0bi5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKS50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDcmVhdGUgQXBwb2ludG1lbnQnKSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZvcm1hdCBkYXRlIGZvciBpbnB1dFt0eXBlPWRhdGVdCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZvcm1hdERhdGVGb3JJbnB1dChEYXRlKSB7CiAgICAgICAgdmFyIFllYXIgPSBEYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgdmFyIE1vbnRoID0gU3RyaW5nKERhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIERheSA9IFN0cmluZyhEYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICByZXR1cm4gWWVhciArICctJyArIE1vbnRoICsgJy0nICsgRGF5OwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGb3JtYXQgdGltZSBmb3IgZGlzcGxheQogICAgICovCiAgICBmdW5jdGlvbiBGb3JtYXRUaW1lKERhdGUpIHsKICAgICAgICB2YXIgSG91cnMgPSBTdHJpbmcoRGF0ZS5nZXRIb3VycygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBNaW51dGVzID0gU3RyaW5nKERhdGUuZ2V0TWludXRlcygpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHJldHVybiBIb3VycyArICc6JyArIE1pbnV0ZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEZvcm1hdCBkYXRldGltZSBmb3IgWm51bnkgKFlZWVktTU0tREQgSEg6TU06U1MpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZvcm1hdERhdGVUaW1lRm9yWm51bnkoRGF0ZSkgewogICAgICAgIHZhciBZZWFyID0gRGF0ZS5nZXRGdWxsWWVhcigpOwogICAgICAgIHZhciBNb250aCA9IFN0cmluZyhEYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBEYXkgPSBTdHJpbmcoRGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIEhvdXJzID0gU3RyaW5nKERhdGUuZ2V0SG91cnMoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgTWludXRlcyA9IFN0cmluZyhEYXRlLmdldE1pbnV0ZXMoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgU2Vjb25kcyA9IFN0cmluZyhEYXRlLmdldFNlY29uZHMoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICByZXR1cm4gWWVhciArICctJyArIE1vbnRoICsgJy0nICsgRGF5ICsgJyAnICsgSG91cnMgKyAnOicgKyBNaW51dGVzICsgJzonICsgU2Vjb25kczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0IGRhdGUgYXMgbG9jYWwgSVNPIHN0cmluZyAod2l0aG91dCBVVEMgY29udmVyc2lvbikKICAgICAqICAgICAgICAgICAgICBJTVBPUlRBTlQ6IHRvSVNPU3RyaW5nKCkgY29udmVydHMgdG8gVVRDIHdoaWNoIGNhdXNlcyB0aW1lem9uZSBvZmZzZXQgaXNzdWVzCiAgICAgKiAgICAgICAgICAgICAgVGhpcyBmdW5jdGlvbiB1c2VzIGxvY2FsIHRpbWUgY29tcG9uZW50cyBmb3IgR3JhcGggQVBJIGNhbGxzCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZvcm1hdExvY2FsSVNPU3RyaW5nKERhdGUpIHsKICAgICAgICB2YXIgWWVhciA9IERhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICB2YXIgTW9udGggPSBTdHJpbmcoRGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgRGF5ID0gU3RyaW5nKERhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBIb3VycyA9IFN0cmluZyhEYXRlLmdldEhvdXJzKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIE1pbnV0ZXMgPSBTdHJpbmcoRGF0ZS5nZXRNaW51dGVzKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIFNlY29uZHMgPSBTdHJpbmcoRGF0ZS5nZXRTZWNvbmRzKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgcmV0dXJuIFllYXIgKyAnLScgKyBNb250aCArICctJyArIERheSArICdUJyArIEhvdXJzICsgJzonICsgTWludXRlcyArICc6JyArIFNlY29uZHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFJlZnJlc2ggY3VzdG9tZXIgaW5mbyB3aWRnZXQgKGNhbGxlZCBhZnRlciBNMzY1IGxvZ2luKQogICAgICovCiAgICBmdW5jdGlvbiBSZWZyZXNoQ3VzdG9tZXJJbmZvV2lkZ2V0KCkgewogICAgICAgIHZhciAkV2lkZ2V0ID0gJCgnI0NvbGxhYkN1c3RvbWVySW5mb1dpZGdldCcpOwogICAgICAgIGlmICghJFdpZGdldC5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgdmFyIEN1c3RvbWVyRGF0YSA9IHsKICAgICAgICAgICAgZW1haWw6ICRXaWRnZXQuYXR0cignZGF0YS1jdXN0b21lci1lbWFpbCcpLAogICAgICAgICAgICBsb2dpbjogJFdpZGdldC5hdHRyKCdkYXRhLWN1c3RvbWVyLWxvZ2luJyksCiAgICAgICAgICAgIG5hbWU6ICRXaWRnZXQuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9fbmFtZScpLnRleHQoKQogICAgICAgIH07CgogICAgICAgIGlmICghQ3VzdG9tZXJEYXRhLmVtYWlsKSByZXR1cm47CgogICAgICAgIC8vIFJlZnJlc2ggYXZhdGFyICh3YXMgbG9hZGVkIGJlZm9yZSBsb2dpbiwgbWlnaHQgaGF2ZSBmYWxsYmFjaykKICAgICAgICB2YXIgJEF2YXRhciA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXInKTsKICAgICAgICAvLyBGaW5kIGV4aXN0aW5nIGltZyAtIFBvcHVsYXRlQ3VzdG9tZXJJbmZvV2lkZ2V0IGNyZWF0ZXMgaXQgc3luY2hyb25vdXNseQogICAgICAgIHZhciAkSW1nID0gJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19pbWFnZScpOwoKICAgICAgICAvLyBPbmx5IHJlZnJlc2ggaWYgaW1nIGV4aXN0cyAoUG9wdWxhdGVDdXN0b21lckluZm9XaWRnZXQgc2hvdWxkIGhhdmUgY3JlYXRlZCBpdCkKICAgICAgICBpZiAoJEltZy5sZW5ndGggJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0F2YXRhcicpKSB7CiAgICAgICAgICAgIC8vIFNraXAgaWYgd2lkZ2V0IGlzIHN0aWxsIGxvYWRpbmcgZnJvbSBpbml0aWFsIFBvcHVsYXRlQ3VzdG9tZXJJbmZvV2lkZ2V0IGNhbGwKICAgICAgICAgICAgaWYgKCRXaWRnZXQuYXR0cignZGF0YS1hdmF0YXItbG9hZGluZycpICE9PSAndHJ1ZScpIHsKICAgICAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoQ3VzdG9tZXJEYXRhLmVtYWlsKS50aGVuKGZ1bmN0aW9uKEF2YXRhclVybCkgewogICAgICAgICAgICAgICAgICAgIGlmIChBdmF0YXJVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSB1cGRhdGUgc3JjIGlmIG5ldyB2YWx1ZSBpcyAiYmV0dGVyIiAocmVhbCBpbWFnZSB2cyBTVkcgZmFsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBDdXJyZW50U3JjID0gJEltZy5hdHRyKCdzcmMnKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIE5ld0lzU3ZnRmFsbGJhY2sgPSBBdmF0YXJVcmwuaW5kZXhPZignZGF0YTppbWFnZS9zdmcnKSA9PT0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIEN1cnJlbnRJc1N2Z0ZhbGxiYWNrID0gIUN1cnJlbnRTcmMgfHwgQ3VycmVudFNyYy5pbmRleE9mKCdkYXRhOmltYWdlL3N2ZycpID09PSAwOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgU2hvdWxkVXBkYXRlID0gIUN1cnJlbnRTcmMgfHwgQ3VycmVudElzU3ZnRmFsbGJhY2sgfHwgIU5ld0lzU3ZnRmFsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChTaG91bGRVcGRhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRJbWcuYXR0cignc3JjJywgQXZhdGFyVXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBdmF0YXIuZmluZCgnLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2snKS5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBSZWZyZXNoIHByZXNlbmNlCiAgICAgICAgdmFyICRQcmVzZW5jZSA9ICRXaWRnZXQuZmluZCgnLkNvbGxhYlByZXNlbmNlJyk7CiAgICAgICAgaWYgKCRQcmVzZW5jZS5sZW5ndGggJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ1ByZXNlbmNlJykpIHsKICAgICAgICAgICAgQ29sbGFiLkdldFByZXNlbmNlKEN1c3RvbWVyRGF0YS5lbWFpbCkudGhlbihmdW5jdGlvbihQcmVzZW5jZSkgewogICAgICAgICAgICAgICAgdmFyIFByZXNlbmNlQ2xhc3MgPSBHZXRQcmVzZW5jZUNsYXNzKFByZXNlbmNlLnN0YXR1cyk7CiAgICAgICAgICAgICAgICAkUHJlc2VuY2UKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoZnVuY3Rpb24oaSwgYykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGMubWF0Y2goL0NvbGxhYlByZXNlbmNlLS1cUysvZykgfHwgW10pLmpvaW4oJyAnKTsKICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UgJyArIFByZXNlbmNlQ2xhc3MpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIFJlZnJlc2ggZW5yaWNobWVudCBkYXRhIChuYW1lLCB0aXRsZSkgYW5kIGFjdGlvbiBidXR0b25zCiAgICAgICAgLy8gRmluZCBvciBjcmVhdGUgdGhlIGFjdGlvbnMgY29udGFpbmVyCiAgICAgICAgdmFyICRBY3Rpb25zID0gJFdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25zJyk7CiAgICAgICAgaWYgKCEkQWN0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gQ3JlYXRlIGFjdGlvbnMgY29udGFpbmVyIGlmIGl0IGRvZXNuJ3QgZXhpc3QKICAgICAgICAgICAgJEFjdGlvbnMgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJDdXN0b21lckluZm9fX2FjdGlvbnMnKS5hdHRyKCdpZCcsICdDb2xsYWJDdXN0b21lckFjdGlvbnMnKTsKICAgICAgICAgICAgJFdpZGdldC5maW5kKCcuQ29sbGFiQ3VzdG9tZXJJbmZvJykuYXBwZW5kKCRBY3Rpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBDbGVhciBleGlzdGluZyBidXR0b25zIGZvciByZS1yZW5kZXIKICAgICAgICAgICAgJEFjdGlvbnMuZW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgRmV0Y2hDdXN0b21lckVucmljaG1lbnREYXRhKCRXaWRnZXQsIEN1c3RvbWVyRGF0YSwgJEFjdGlvbnMpOwoKICAgICAgICAvLyBSZWZyZXNoIHdvcmsgbG9jYXRpb24gKG1pZ2h0IG5vdCBoYXZlIGJlZW4gYXZhaWxhYmxlIGJlZm9yZSBsb2dpbikKICAgICAgICBpZiAoQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ1ByZXNlbmNlJykpIHsKICAgICAgICAgICAgQ29sbGFiLkdldFByZXNlbmNlKEN1c3RvbWVyRGF0YS5lbWFpbCkudGhlbihmdW5jdGlvbihQcmVzZW5jZSkgewogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIHdvcmsgbG9jYXRpb24gYmFkZ2UgaWYgYW55CiAgICAgICAgICAgICAgICAkV2lkZ2V0LmZpbmQoJy5Db2xsYWJXb3JrTG9jYXRpb24nKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAvLyBXb3JrIGxvY2F0aW9uIGxhYmVscyBhbmQgaWNvbnMKICAgICAgICAgICAgICAgIHZhciBXb3JrTG9jYXRpb25MYWJlbHMgPSB7CiAgICAgICAgICAgICAgICAgICAgJ29mZmljZSc6ICdPZmZpY2UnLAogICAgICAgICAgICAgICAgICAgICdyZW1vdGUnOiAnUmVtb3RlJywKICAgICAgICAgICAgICAgICAgICAndGltZU9mZic6ICdUaW1lIG9mZicKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgV29ya0xvY2F0aW9uSWNvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgJ29mZmljZSc6ICdmYS1idWlsZGluZycsCiAgICAgICAgICAgICAgICAgICAgJ3JlbW90ZSc6ICdmYS1ob21lJywKICAgICAgICAgICAgICAgICAgICAndGltZU9mZic6ICdmYS1zaWduLW91dCcKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGxvY2F0aW9uIHR5cGU6IE9PRiB0YWtlcyBwcmVjZWRlbmNlLCB0aGVuIHdvcmtMb2NhdGlvbgogICAgICAgICAgICAgICAgdmFyIExvY2F0aW9uVHlwZSA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoUHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScpIHsKICAgICAgICAgICAgICAgICAgICBMb2NhdGlvblR5cGUgPSAndGltZU9mZic7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFByZXNlbmNlLndvcmtMb2NhdGlvbiAmJiBQcmVzZW5jZS53b3JrTG9jYXRpb24udHlwZSkgewogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uVHlwZSA9IFByZXNlbmNlLndvcmtMb2NhdGlvbi50eXBlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChMb2NhdGlvblR5cGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgTG9jYXRpb25MYWJlbCA9IFdvcmtMb2NhdGlvbkxhYmVsc1tMb2NhdGlvblR5cGVdIHx8IExvY2F0aW9uVHlwZTsKICAgICAgICAgICAgICAgICAgICB2YXIgTG9jYXRpb25JY29uID0gV29ya0xvY2F0aW9uSWNvbnNbTG9jYXRpb25UeXBlXSB8fCAnZmEtbWFwLW1hcmtlcic7CgogICAgICAgICAgICAgICAgICAgIHZhciAkV29ya0xvY2F0aW9uID0gJCgnPHNwYW4+JykKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJXb3JrTG9jYXRpb24gQ29sbGFiV29ya0xvY2F0aW9uLS0nICsgTG9jYXRpb25UeXBlKQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCQoJzxpPicpLmFkZENsYXNzKCdmYSAnICsgTG9jYXRpb25JY29uKSkKICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZShMb2NhdGlvbkxhYmVsKSk7CiAgICAgICAgICAgICAgICAgICAgJFdpZGdldC5maW5kKCcuQ29sbGFiVXNlckJhZGdlX19pbmZvJykuYXBwZW5kKCRXb3JrTG9jYXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBBcHBvaW50bWVudCBDYW5jZWxsYXRpb24KICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDYW5jZWwgYW4gYXBwb2ludG1lbnQgKEdyYXBoIEV2ZW50ICsgWm51bnkgQXBwb2ludG1lbnQpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQXBwb2ludG1lbnRJRCAtIFpudW55IEFwcG9pbnRtZW50IElECiAgICAgKiBAcGFyYW0ge1N0cmluZ30gVGlja2V0SUQgLSBSZWxhdGVkIFRpY2tldCBJRAogICAgICovCiAgICBmdW5jdGlvbiBDYW5jZWxBcHBvaW50bWVudChBcHBvaW50bWVudElELCBUaWNrZXRJRCkgewogICAgICAgIFRhcmdldE5TLlNob3dDb25maXJtRGlhbG9nKHsKICAgICAgICAgICAgdGl0bGU6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwgQXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgbWVzc2FnZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgdGhpcyBhcHBvaW50bWVudD8gQXR0ZW5kZWVzIHdpbGwgYmUgbm90aWZpZWQuJyksCiAgICAgICAgICAgIGNvbmZpcm1UZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnWWVzLCBjYW5jZWwnKSwKICAgICAgICAgICAgY2FuY2VsVGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vJyksCiAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywKICAgICAgICAgICAgb25Db25maXJtOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIC8vIFN0ZXAgMTogR2V0IEdyYXBoRXZlbnRJRCBhbmQgZGVsZXRlIFpudW55IGFwcG9pbnRtZW50IHZpYSBiYWNrZW5kCiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdDYW5jZWxBcHBvaW50bWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiBDb3JlLkNvbmZpZy5HZXQoJ0NoYWxsZW5nZVRva2VuJyksICAvLyBTRUNVUklUWTogQ1NSRiBwcm90ZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEOiBUaWNrZXRJRAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0ZXAgMjogRGVsZXRlIEdyYXBoIGNhbGVuZGFyIGV2ZW50IChzZW5kcyBjYW5jZWxsYXRpb24gZW1haWwgdG8gYXR0ZW5kZWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLkdyYXBoRXZlbnRJRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxhYi5EZWxldGVDYWxlbmRhckV2ZW50KFJlc3BvbnNlLkdyYXBoRXZlbnRJRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc3VjY2VzcycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50IGNhbmNlbGxlZC4gQXR0ZW5kZWVzIGhhdmUgYmVlbiBub3RpZmllZC4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlNob3dEaWFsb2coewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuaW5nJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnWm51bnkgYXBwb2ludG1lbnQgZGVsZXRlZCwgYnV0IGZhaWxlZCB0byBjYW5jZWwgT3V0bG9vayBldmVudC4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IEVycm9yLm1lc3NhZ2UgfHwgU3RyaW5nKEVycm9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gR3JhcGggZXZlbnQgKGFwcG9pbnRtZW50IGNyZWF0ZWQgd2l0aG91dCBNMzY1IG9yIGxlZ2FjeSBhcHBvaW50bWVudCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5TaG93RGlhbG9nKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3MnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQgY2FuY2VsbGVkLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmFpbGVkIHRvIGNhbmNlbCBhcHBvaW50bWVudC4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IFJlc3BvbnNlLkVycm9yIHx8ICcnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEFkZCBjYW5jZWwgYnV0dG9ucyB0byBDb2xsYWJvcmF0aW9uLWxpbmtlZCBhcHBvaW50bWVudHMgaW4gTGlua2VkT2JqZWN0cyB3aWRnZXQKICAgICAqLwogICAgZnVuY3Rpb24gQWRkQ2FuY2VsQnV0dG9uc1RvTGlua2VkQXBwb2ludG1lbnRzKCkgewogICAgICAgIHZhciBUaWNrZXRJRCA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0SUQnKTsKICAgICAgICBpZiAoIVRpY2tldElEKSByZXR1cm47CgogICAgICAgIC8vIEZpbmQgdGhlIEFwcG9pbnRtZW50IHdpZGdldCAoWm51bnkgdXNlcyAjV2lkZ2V0QXBwb2ludG1lbnQgZm9yIGxpbmtlZCBhcHBvaW50bWVudHMpCiAgICAgICAgdmFyICRBcHBvaW50bWVudFdpZGdldCA9ICQoJyNXaWRnZXRBcHBvaW50bWVudCcpOwogICAgICAgIGlmICghJEFwcG9pbnRtZW50V2lkZ2V0Lmxlbmd0aCkgewogICAgICAgICAgICAvLyBUcnkgYWx0ZXJuYXRpdmUgc2VsZWN0b3JzCiAgICAgICAgICAgICRBcHBvaW50bWVudFdpZGdldCA9ICQoJ1tpZCo9IkFwcG9pbnRtZW50Il0uV2lkZ2V0U2ltcGxlJyk7CiAgICAgICAgfQogICAgICAgIGlmICghJEFwcG9pbnRtZW50V2lkZ2V0Lmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAvLyBGaW5kIGFsbCByb3dzIGluIHRoZSBhcHBvaW50bWVudCB0YWJsZQogICAgICAgICRBcHBvaW50bWVudFdpZGdldC5maW5kKCd0YWJsZSB0Ym9keSB0cicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciAkUm93ID0gJCh0aGlzKTsKCiAgICAgICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBwcm9jZXNzZWQKICAgICAgICAgICAgaWYgKCRSb3cuaGFzQ2xhc3MoJ0NvbGxhYkNhbmNlbFByb2Nlc3NlZCcpKSByZXR1cm47CiAgICAgICAgICAgICRSb3cuYWRkQ2xhc3MoJ0NvbGxhYkNhbmNlbFByb2Nlc3NlZCcpOwoKICAgICAgICAgICAgdmFyIFJvd1RleHQgPSAkUm93LnRleHQoKTsKCiAgICAgICAgICAgIC8vIENoZWNrIGZvciBDb2xsYWJvcmF0aW9uL0tvbGxhYm9yYXRpb24gbGluayB0eXBlIGluIHRoZSByb3cgdGV4dAogICAgICAgICAgICAvLyAoc2hvd24gaW4gIlZlcmtudWVwZnQgYWxzIiAvICJMaW5rZWQgYXMiIGNvbHVtbikKICAgICAgICAgICAgdmFyIElzQ29sbGFib3JhdGlvblR5cGUgPSAoCiAgICAgICAgICAgICAgICBSb3dUZXh0LmluZGV4T2YoJ0NvbGxhYm9yYXRpb24nKSA+IC0xIHx8CiAgICAgICAgICAgICAgICBSb3dUZXh0LmluZGV4T2YoJ0tvbGxhYm9yYXRpb24nKSA+IC0xCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAvLyBPbmx5IHByb2Nlc3MgQ29sbGFib3JhdGlvbi10eXBlIGxpbmtzCiAgICAgICAgICAgIGlmICghSXNDb2xsYWJvcmF0aW9uVHlwZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBFeHRyYWN0IEFwcG9pbnRtZW50SUQgZnJvbSB0aGUgZGVsZXRlIGxpbmsncyBkYXRhIGF0dHJpYnV0ZQogICAgICAgICAgICB2YXIgJERlbGV0ZUxpbmsgPSAkUm93LmZpbmQoJy5JbnN0YW50TGlua0RlbGV0ZScpOwogICAgICAgICAgICB2YXIgQXBwb2ludG1lbnRJRCA9ICREZWxldGVMaW5rLmF0dHIoJ2RhdGEtZGVsZXRlLWxpbmstc291cmNla2V5Jyk7CgogICAgICAgICAgICAvLyBGYWxsYmFjazogdHJ5IHRvIGV4dHJhY3QgZnJvbSBocmVmCiAgICAgICAgICAgIGlmICghQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICAgICAgdmFyICRMaW5rID0gJFJvdy5maW5kKCdhW2hyZWYqPSJBcHBvaW50bWVudElEIl0nKTsKICAgICAgICAgICAgICAgIHZhciBIcmVmTWF0Y2ggPSAoJExpbmsuYXR0cignaHJlZicpIHx8ICcnKS5tYXRjaCgvQXBwb2ludG1lbnRJRD0oXGQrKS8pOwogICAgICAgICAgICAgICAgaWYgKEhyZWZNYXRjaCkgewogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPSBIcmVmTWF0Y2hbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBIaWRlIHRoZSBkZWZhdWx0IGRlbGV0ZSBsaW5rCiAgICAgICAgICAgIGlmICgkRGVsZXRlTGluay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICREZWxldGVMaW5rLmFkZENsYXNzKCdDb2xsYWJIaWRkZW4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRmluZCB0aGUgYWN0aW9uIGNlbGwgKGxhc3QgY29sdW1uIHdpdGggZGVsZXRlIGxpbmspCiAgICAgICAgICAgIHZhciAkQWN0aW9uQ2VsbCA9ICRSb3cuZmluZCgndGQ6bGFzdC1jaGlsZCcpOwogICAgICAgICAgICBpZiAoISRBY3Rpb25DZWxsLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEFjdGlvbkNlbGwgPSAkUm93OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBDcmVhdGUgY2FuY2VsIGJ1dHRvbgogICAgICAgICAgICB2YXIgJENhbmNlbEJ0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdDYW5jZWwgQXBwb2ludG1lbnQnKSkKICAgICAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXItdGltZXMtbyI+PC9pPicpOwoKICAgICAgICAgICAgJENhbmNlbEJ0bi5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgQ2FuY2VsQXBwb2ludG1lbnQoQXBwb2ludG1lbnRJRCwgVGlja2V0SUQpOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICRBY3Rpb25DZWxsLmFwcGVuZCgkQ2FuY2VsQnRuKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQWRkIGNhbmNlbCBidXR0b25zIHRvIENvbGxhYm9yYXRpb24tbGlua2VkIGFwcG9pbnRtZW50cyBpbiBzdGFuZGFyZCBMaW5rZWRPYmplY3RzIHdpZGdldCAod2l0aG91dCBJVFNNKQogICAgICogICAgICAgICAgICAgIFRoaXMgd2lkZ2V0IHVzZXMgYSBkaWZmZXJlbnQgc3RydWN0dXJlIHdpdGggaDMgaGVhZGVycyBmb3IgbGluayB0eXBlcwogICAgICovCiAgICBmdW5jdGlvbiBBZGRDYW5jZWxCdXR0b25zVG9TdGFuZGFyZExpbmtlZE9iamVjdHMoKSB7CiAgICAgICAgdmFyIFRpY2tldElEID0gQ29yZS5Db25maWcuR2V0KCdUaWNrZXRJRCcpOwogICAgICAgIGlmICghVGlja2V0SUQpIHJldHVybjsKCiAgICAgICAgLy8gRmluZCB0aGUgc3RhbmRhcmQgTGlua2VkT2JqZWN0cyB3aWRnZXQgKGNsYXNzOiBXaWRnZXRTaW1wbGUgTGlua1RhYmxlKQogICAgICAgIHZhciAkTGlua1RhYmxlV2lkZ2V0cyA9ICQoJy5XaWRnZXRTaW1wbGUuTGlua1RhYmxlJyk7CiAgICAgICAgaWYgKCEkTGlua1RhYmxlV2lkZ2V0cy5sZW5ndGgpIHJldHVybjsKCiAgICAgICAgJExpbmtUYWJsZVdpZGdldHMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyICRXaWRnZXQgPSAkKHRoaXMpOwoKICAgICAgICAgICAgLy8gRmluZCBoMyBoZWFkZXJzIHdpdGggIktvbGxhYm9yYXRpb24iIG9yICJDb2xsYWJvcmF0aW9uIiB0ZXh0CiAgICAgICAgICAgICRXaWRnZXQuZmluZCgnaDMnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdmFyICRIZWFkZXIgPSAkKHRoaXMpOwogICAgICAgICAgICAgICAgdmFyIEhlYWRlclRleHQgPSAkSGVhZGVyLnRleHQoKS50cmltKCk7CgogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIENvbGxhYm9yYXRpb24gc2VjdGlvbgogICAgICAgICAgICAgICAgdmFyIElzQ29sbGFib3JhdGlvblR5cGUgPSAoCiAgICAgICAgICAgICAgICAgICAgSGVhZGVyVGV4dC5pbmRleE9mKCdDb2xsYWJvcmF0aW9uJykgPiAtMSB8fAogICAgICAgICAgICAgICAgICAgIEhlYWRlclRleHQuaW5kZXhPZignS29sbGFib3JhdGlvbicpID4gLTEKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCFJc0NvbGxhYm9yYXRpb25UeXBlKSByZXR1cm47CgogICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgdGFibGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoaXMgaDMKICAgICAgICAgICAgICAgIHZhciAkVGFibGUgPSAkSGVhZGVyLm5leHQoJ3RhYmxlLkRhdGFUYWJsZScpOwogICAgICAgICAgICAgICAgaWYgKCEkVGFibGUubGVuZ3RoKSByZXR1cm47CgogICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHJvdyBpbiB0aGlzIENvbGxhYm9yYXRpb24gdGFibGUKICAgICAgICAgICAgICAgICRUYWJsZS5maW5kKCd0Ym9keSB0cicpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRSb3cgPSAkKHRoaXMpOwoKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkCiAgICAgICAgICAgICAgICAgICAgaWYgKCRSb3cuaGFzQ2xhc3MoJ0NvbGxhYkNhbmNlbFByb2Nlc3NlZCcpKSByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgJFJvdy5hZGRDbGFzcygnQ29sbGFiQ2FuY2VsUHJvY2Vzc2VkJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGFwcG9pbnRtZW50IGxpbmsKICAgICAgICAgICAgICAgICAgICB2YXIgJExpbmsgPSAkUm93LmZpbmQoJ2FbaHJlZio9IkFwcG9pbnRtZW50SUQiXScpOwogICAgICAgICAgICAgICAgICAgIGlmICghJExpbmsubGVuZ3RoKSByZXR1cm47CgogICAgICAgICAgICAgICAgICAgIC8vIEV4dHJhY3QgQXBwb2ludG1lbnRJRCBmcm9tIGhyZWYKICAgICAgICAgICAgICAgICAgICB2YXIgSHJlZk1hdGNoID0gKCRMaW5rLmF0dHIoJ2hyZWYnKSB8fCAnJykubWF0Y2goL0FwcG9pbnRtZW50SUQ9KFxkKykvKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUhyZWZNYXRjaCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICB2YXIgQXBwb2ludG1lbnRJRCA9IEhyZWZNYXRjaFsxXTsKCiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgY2VsbCBjb250YWluaW5nIHRoZSBsaW5rCiAgICAgICAgICAgICAgICAgICAgdmFyICRDZWxsID0gJExpbmsuY2xvc2VzdCgndGQnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoISRDZWxsLmxlbmd0aCkgcmV0dXJuOwoKICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2xhc3MgZm9yIHBvc2l0aW9uaW5nCiAgICAgICAgICAgICAgICAgICAgJENlbGwuYWRkQ2xhc3MoJ0NvbGxhYkNhbmNlbENlbGwnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNhbmNlbCBidXR0b24gKGlubGluZSB2YXJpYW50IGZvciByaWdodC1hbGlnbmVkIHBvc2l0aW9uaW5nKQogICAgICAgICAgICAgICAgICAgIHZhciAkQ2FuY2VsQnRuID0gJCgnPGJ1dHRvbj4nKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYkNhbmNlbEFwcG9pbnRtZW50IENvbGxhYkNhbmNlbEFwcG9pbnRtZW50LS1pbmxpbmUnKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQ2FuY2VsIEFwcG9pbnRtZW50JykpCiAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2FsZW5kYXItdGltZXMtbyI+PC9pPicpOwoKICAgICAgICAgICAgICAgICAgICAkQ2FuY2VsQnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxBcHBvaW50bWVudChBcHBvaW50bWVudElELCBUaWNrZXRJRCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICRDZWxsLmFwcGVuZCgkQ2FuY2VsQnRuKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgTWV0aG9kcyAtIFRpY2tldCBJbmZvIEF2YXRhcnMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIGF2YXRhcnMgZm9yIE93bmVyL1Jlc3BvbnNpYmxlIGluIFRpY2tldC1JbmZvcm1hdGlvbiB3aWRnZXQKICAgICAqICAgICAgICAgICAgICBSZXBsYWNlcyB0ZXh0IG5hbWVzIHdpdGggYXZhdGFyICsgbmFtZSBkaXNwbGF5IGluY2x1ZGluZyBob3Zlci1jYXJkcwogICAgICovCiAgICBmdW5jdGlvbiBJbml0VGlja2V0SW5mb0F2YXRhcnMoKSB7CiAgICAgICAgdmFyIENvbmZpZyA9IENvbGxhYi5HZXRDb25maWcoKTsKCiAgICAgICAgLy8gQ2hlY2sgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICAgICAgaWYgKCFDb25maWcuRW5hYmxlT3duZXJJbmZvUGFuZWwpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gT25seSBvbiB0aWNrZXQgem9vbSBwYWdlcwogICAgICAgIGlmICghQ29yZS5Db25maWcuR2V0KCdUaWNrZXRJRCcpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEdldCBvd25lci9yZXNwb25zaWJsZSBkYXRhIGZyb20gY29uZmlnIChpbmplY3RlZCBieSBPdXRwdXQgRmlsdGVyKQogICAgICAgIHZhciBPd25lckVtYWlsID0gQ29uZmlnLk93bmVyRW1haWw7CiAgICAgICAgdmFyIE93bmVyTmFtZSA9IENvbmZpZy5Pd25lck5hbWU7CiAgICAgICAgdmFyIFJlc3BvbnNpYmxlRW1haWwgPSBDb25maWcuUmVzcG9uc2libGVFbWFpbDsKICAgICAgICB2YXIgUmVzcG9uc2libGVOYW1lID0gQ29uZmlnLlJlc3BvbnNpYmxlTmFtZTsKCiAgICAgICAgLy8gUHJvY2VzcyBhZnRlciBzaG9ydCBkZWxheSB0byBlbnN1cmUgRE9NIGlzIHJlYWR5CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgUmVwbGFjZVRpY2tldEluZm9GaWVsZCgnT3duZXInLCBPd25lckVtYWlsLCBPd25lck5hbWUpOwogICAgICAgICAgICBSZXBsYWNlVGlja2V0SW5mb0ZpZWxkKCdSZXNwb25zaWJsZScsIFJlc3BvbnNpYmxlRW1haWwsIFJlc3BvbnNpYmxlTmFtZSk7CiAgICAgICAgfSwgMTAwKTsKCiAgICAgICAgLy8gQWxzbyBydW4gYWZ0ZXIgbG9uZ2VyIGRlbGF5IGZvciBhc3luYyB3aWRnZXRzCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgUmVwbGFjZVRpY2tldEluZm9GaWVsZCgnT3duZXInLCBPd25lckVtYWlsLCBPd25lck5hbWUpOwogICAgICAgICAgICBSZXBsYWNlVGlja2V0SW5mb0ZpZWxkKCdSZXNwb25zaWJsZScsIFJlc3BvbnNpYmxlRW1haWwsIFJlc3BvbnNpYmxlTmFtZSk7CiAgICAgICAgfSwgMTAwMCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFJlcGxhY2UgYSBzcGVjaWZpYyBmaWVsZCBpbiBUaWNrZXQtSW5mb3JtYXRpb24gd2lkZ2V0IHdpdGggYXZhdGFyIGRpc3BsYXkKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZFR5cGUgLSAnT3duZXInIG9yICdSZXNwb25zaWJsZScKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MgZm9yIGF2YXRhci9ob3Zlci1jYXJkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gTmFtZSAtIERpc3BsYXkgbmFtZQogICAgICovCiAgICBmdW5jdGlvbiBSZXBsYWNlVGlja2V0SW5mb0ZpZWxkKEZpZWxkVHlwZSwgRW1haWwsIE5hbWUpIHsKICAgICAgICAvLyBTa2lwIGlmIG5vIGRhdGEKICAgICAgICBpZiAoIUVtYWlsICYmICFOYW1lKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIExhYmVscyB0byBzZWFyY2ggZm9yIChHZXJtYW4gYW5kIEVuZ2xpc2gpCiAgICAgICAgdmFyIExhYmVscyA9IHsKICAgICAgICAgICAgJ093bmVyJzogWydCZXNpdHplcicsICdPd25lciddLAogICAgICAgICAgICAnUmVzcG9uc2libGUnOiBbJ1ZlcmFudHdvcnRsaWNoZXInLCAnUmVzcG9uc2libGUnXQogICAgICAgIH07CgogICAgICAgIHZhciBTZWFyY2hMYWJlbHMgPSBMYWJlbHNbRmllbGRUeXBlXSB8fCBbXTsKICAgICAgICBpZiAoIVNlYXJjaExhYmVscy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gRmluZCBUaWNrZXQtSW5mb3JtYXRpb25lbiB3aWRnZXQgYnkgaGVhZGVyIHRleHQKICAgICAgICB2YXIgJFRpY2tldEluZm9XaWRnZXQgPSBudWxsOwogICAgICAgIC8vIFNpbmNlIFpudW55IDcuMy4xLCB0aGlzIHdpZGdldCdzIHRpdGxlIGxpdmVzIGluICIuc2lkZWJhcldpZGdldFRpdGxlIGgzIgogICAgICAgIC8vIGFuZCB0aGUgd2lkZ2V0IGl0c2VsZiBubyBsb25nZXIgaGFzIGEgIi5XaWRnZXRTaW1wbGUiIGNsYXNzIGF0IGFsbCAtCiAgICAgICAgLy8gY2hlY2sgYm90aCBjb252ZW50aW9ucyBhbmQgcmVzb2x2ZSB2aWEgUmVzb2x2ZVdpZGdldEJveCgpLgogICAgICAgIC8vIE9uIHByb2Nlc3MgdGlja2V0cywgWm51bnkgcmVuZGVycyB0aGUgdmVyeSBzYW1lIHdpZGdldCAoT3duZXIsCiAgICAgICAgLy8gQ3VzdG9tZXIgSUQsIGV0Yy4gYWxsIHByZXNlbnQsIHNhbWUgbWFya3VwKSB0aXRsZWQgIlByb2Nlc3MKICAgICAgICAvLyBJbmZvcm1hdGlvbiIgLyAiUHJvemVzc2luZm9ybWF0aW9uZW4iIGluc3RlYWQgLSB3aXRob3V0IHRoaXMsCiAgICAgICAgLy8gdGhlIGZlYXR1cmUgc2lsZW50bHkgZGlkIG5vdGhpbmcgb24gcHJvY2VzcyB0aWNrZXRzLgogICAgICAgIHZhciBUaWNrZXRJbmZvVGl0bGVzID0gWwogICAgICAgICAgICAnVGlja2V0LUluZm9ybWF0aW9uZW4nLCAnVGlja2V0IEluZm9ybWF0aW9uJywKICAgICAgICAgICAgJ1Byb3plc3NpbmZvcm1hdGlvbmVuJywgJ1Byb2Nlc3MgSW5mb3JtYXRpb24nCiAgICAgICAgXTsKICAgICAgICAkKCcuU2lkZWJhckNvbHVtbiAuV2lkZ2V0U2ltcGxlIC5IZWFkZXIgaDIsIC5TaWRlYmFyQ29sdW1uIC5XaWRnZXRTaW1wbGUgLkhlYWRlciBoMywgLnNpZGViYXJDb250ZW50IC5zaWRlYmFyV2lkZ2V0VGl0bGUgaDMnKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgVGV4dCA9ICQodGhpcykudGV4dCgpLnRyaW0oKTsKICAgICAgICAgICAgaWYgKFRpY2tldEluZm9UaXRsZXMuaW5kZXhPZihUZXh0KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0SW5mb1dpZGdldCA9IFJlc29sdmVXaWRnZXRCb3goJCh0aGlzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKCEkVGlja2V0SW5mb1dpZGdldCB8fCAhJFRpY2tldEluZm9XaWRnZXQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEZpbmQgdGhlIGxhYmVsIGVsZW1lbnQgd2l0aGluIHRoZSB3aWRnZXQKICAgICAgICB2YXIgJFZhbHVlRWxlbWVudCA9IG51bGw7CgogICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgc2VsZWN0b3JzIChabnVueSB1c2VzIHZhcmlvdXMgc3RydWN0dXJlcykKICAgICAgICAvLyBQYXR0ZXJuIDE6IDxsYWJlbD5CZXNpdHplcjo8L2xhYmVsPiBmb2xsb3dlZCBieSA8cCBjbGFzcz0iVmFsdWUiPk5hbWU8L3A+CiAgICAgICAgLy8KICAgICAgICAvLyBJTVBPUlRBTlQ6IGxhYmVsIGFuZCB2YWx1ZSBhcmUgTk9UIGluZGl2aWR1YWxseSB3cmFwcGVkIC0gWm51bnkncwogICAgICAgIC8vIFRpY2tldC9Qcm9jZXNzIEluZm9ybWF0aW9uIHdpZGdldCBwdXRzIEFMTCBmaWVsZHMgYXMgZmxhdAogICAgICAgIC8vIHNpYmxpbmdzIGluc2lkZSBPTkUgc2hhcmVkIDxmaWVsZHNldD4gKEN1c3RvbWVyIElELCBBY2NvdW50ZWQKICAgICAgICAvLyB0aW1lLCBPd25lciwgLi4uIGFsbCBhcyBkaXJlY3QgY2hpbGRyZW4pLiBUYWtpbmcgdGhlIGxhYmVsJ3MKICAgICAgICAvLyAucGFyZW50KCkgYW5kIHNlYXJjaGluZyAuZmluZCgnLlZhbHVlJykuZmlyc3QoKSB0aGVyZWZvcmUKICAgICAgICAvLyByZXR1cm5zIHRoZSBGSVJTVCB2YWx1ZSBpbiB0aGUgd2hvbGUgZmllbGRzZXQgLSBlLmcuICJDdXN0b21lcgogICAgICAgIC8vIElEIidzIHZhbHVlIHdoZW4gT3duZXIgaXNuJ3QgdGhlIGZpcnN0IGZpZWxkIC0gbm90IHRoZSB2YWx1ZQogICAgICAgIC8vIHRoYXQgYWN0dWFsbHkgYmVsb25ncyB0byB0aGlzIGxhYmVsLiBBbHdheXMgdGFrZSB0aGUKICAgICAgICAvLyBpbW1lZGlhdGVseS1mb2xsb3dpbmcgVmFsdWUgc2libGluZyBpbnN0ZWFkLgogICAgICAgICRUaWNrZXRJbmZvV2lkZ2V0LmZpbmQoJ2xhYmVsJykuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIExhYmVsVGV4dCA9ICQodGhpcykudGV4dCgpLnRyaW0oKS5yZXBsYWNlKCc6JywgJycpOwogICAgICAgICAgICBpZiAoU2VhcmNoTGFiZWxzLmluZGV4T2YoTGFiZWxUZXh0KSA+IC0xKSB7CiAgICAgICAgICAgICAgICB2YXIgJFZhbHVlID0gJCh0aGlzKS5uZXh0QWxsKCcuVmFsdWUsIHAuVmFsdWUsIHNwYW4uVmFsdWUnKS5maXJzdCgpOwogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzZWQgKHBlci1maWVsZCwgbm90IHBlci1zaGFyZWQtY29udGFpbmVyKQogICAgICAgICAgICAgICAgaWYgKCEkVmFsdWUubGVuZ3RoIHx8ICRWYWx1ZS5maW5kKCcuQ29sbGFiVGlja2V0SW5mb0F2YXRhcicpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRWYWx1ZUVsZW1lbnQgPSAkVmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gUGF0dGVybiAyOiBmaWVsZHNldCB3aXRoIDxzcGFuIGNsYXNzPSJLZXkiPkJlc2l0emVyPC9zcGFuPiA8c3BhbiBjbGFzcz0iVmFsdWUiPk5hbWU8L3NwYW4+CiAgICAgICAgaWYgKCEkVmFsdWVFbGVtZW50IHx8ICEkVmFsdWVFbGVtZW50Lmxlbmd0aCkgewogICAgICAgICAgICAkVGlja2V0SW5mb1dpZGdldC5maW5kKCcuS2V5LCBzcGFuLktleScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgS2V5VGV4dCA9ICQodGhpcykudGV4dCgpLnRyaW0oKS5yZXBsYWNlKCc6JywgJycpOwogICAgICAgICAgICAgICAgaWYgKFNlYXJjaExhYmVscy5pbmRleE9mKEtleVRleHQpID4gLTEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgJFZhbHVlID0gJCh0aGlzKS5uZXh0QWxsKCcuVmFsdWUsIHNwYW4uVmFsdWUnKS5maXJzdCgpOwogICAgICAgICAgICAgICAgICAgIGlmICghJFZhbHVlLmxlbmd0aCB8fCAkVmFsdWUuZmluZCgnLkNvbGxhYlRpY2tldEluZm9BdmF0YXInKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkVmFsdWVFbGVtZW50ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoISRWYWx1ZUVsZW1lbnQgfHwgISRWYWx1ZUVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIE1hcmsgYXMgcHJvY2Vzc2VkIHRvIHByZXZlbnQgZG91YmxlIHByb2Nlc3NpbmcgLSBtYXJrZWQgb24gdGhlCiAgICAgICAgLy8gVmFsdWUgZWxlbWVudCBpdHNlbGYgKG5vdCBhIHNoYXJlZCBhbmNlc3RvciksIHNpbmNlIE93bmVyIGFuZAogICAgICAgIC8vIFJlc3BvbnNpYmxlIGNhbiBzaXQgaW4gdGhlIHZlcnkgc2FtZSBmaWVsZHNldC4KICAgICAgICAkVmFsdWVFbGVtZW50LmFkZENsYXNzKCdDb2xsYWJUaWNrZXRJbmZvLS1wcm9jZXNzZWQnKTsKCiAgICAgICAgLy8gQ3JlYXRlIGF2YXRhciBlbGVtZW50CiAgICAgICAgdmFyICRBdmF0YXJDb250YWluZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJUaWNrZXRJbmZvQXZhdGFyJyk7CgogICAgICAgIC8vIE1haW4gcm93IHdpdGggYXZhdGFyIGFuZCBpbmZvIChob3ZlciB0cmlnZ2VyKQogICAgICAgIHZhciAkTWFpblJvdyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYlRpY2tldEluZm9BdmF0YXJfX3JvdycpOwogICAgICAgIGlmIChFbWFpbCAmJiBDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnSG92ZXJDYXJkcycpKSB7CiAgICAgICAgICAgICRNYWluUm93LmFkZENsYXNzKCdDb2xsYWJIb3ZlclRyaWdnZXInKS5hdHRyKCdkYXRhLWVtYWlsJywgRW1haWwpOwogICAgICAgIH0KCiAgICAgICAgLy8gQXZhdGFyIHdyYXBwZXIKICAgICAgICB2YXIgJEF2YXRhcldyYXAgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJUaWNrZXRJbmZvQXZhdGFyX19hdmF0YXInKTsKCiAgICAgICAgLy8gQ3JlYXRlIGF2YXRhciAoc21hbGwgc2l6ZSBmb3IgaW5saW5lIGRpc3BsYXkpCiAgICAgICAgdmFyICRBdmF0YXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXIgQ29sbGFiQXZhdGFyLS1tZWRpdW0nKTsKICAgICAgICB2YXIgJEZhbGxiYWNrID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLnRleHQoR2V0SW5pdGlhbHMoRW1haWwsIE5hbWUpKTsKICAgICAgICB2YXIgJFByZXNlbmNlID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiUHJlc2VuY2UgQ29sbGFiUHJlc2VuY2UtLXVua25vd24nKTsKICAgICAgICAkQXZhdGFyLmFwcGVuZCgkRmFsbGJhY2ssICRQcmVzZW5jZSk7CiAgICAgICAgJEF2YXRhcldyYXAuYXBwZW5kKCRBdmF0YXIpOwoKICAgICAgICAvLyBJbmZvIGFyZWEgd2l0aCBuYW1lCiAgICAgICAgdmFyICRJbmZvID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9faW5mbycpOwogICAgICAgIHZhciAkTmFtZVNwYW4gPSAkKCc8c3Bhbj4nKS5hZGRDbGFzcygnQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fbmFtZScpLnRleHQoTmFtZSB8fCBFbWFpbCB8fCAnLScpOwogICAgICAgICRJbmZvLmFwcGVuZCgkTmFtZVNwYW4pOwoKICAgICAgICAkTWFpblJvdy5hcHBlbmQoJEF2YXRhcldyYXAsICRJbmZvKTsKICAgICAgICAkQXZhdGFyQ29udGFpbmVyLmFwcGVuZCgkTWFpblJvdyk7CgogICAgICAgIC8vIFJlcGxhY2UgdmFsdWUgZWxlbWVudCBjb250ZW50CiAgICAgICAgJFZhbHVlRWxlbWVudC5lbXB0eSgpLmFwcGVuZCgkQXZhdGFyQ29udGFpbmVyKTsKCiAgICAgICAgLy8gTG9hZCBhdmF0YXIgaW1hZ2UgYXN5bmNocm9ub3VzbHkKICAgICAgICBpZiAoRW1haWwgJiYgQ29sbGFiLklzRmVhdHVyZUVuYWJsZWQoJ0F2YXRhcicpKSB7CiAgICAgICAgICAgIENvbGxhYi5HZXRBdmF0YXIoRW1haWwpLnRoZW4oZnVuY3Rpb24oQXZhdGFyVXJsKSB7CiAgICAgICAgICAgICAgICBpZiAoQXZhdGFyVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyICRJbWcgPSAkKCc8aW1nPicpLmFkZENsYXNzKCdDb2xsYWJBdmF0YXJfX2ltYWdlJykuYXR0cignc3JjJywgQXZhdGFyVXJsKTsKICAgICAgICAgICAgICAgICAgICAkQXZhdGFyLmZpbmQoJy5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrJykuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICRBdmF0YXIucHJlcGVuZCgkSW1nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAvLyBLZWVwIGZhbGxiYWNrIGluaXRpYWxzCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gTG9hZCBwcmVzZW5jZSBhc3luY2hyb25vdXNseQogICAgICAgIGlmIChFbWFpbCAmJiBDb2xsYWIuSXNGZWF0dXJlRW5hYmxlZCgnUHJlc2VuY2UnKSkgewogICAgICAgICAgICBDb2xsYWIuR2V0UHJlc2VuY2UoRW1haWwpLnRoZW4oZnVuY3Rpb24oUHJlc2VuY2UpIHsKICAgICAgICAgICAgICAgIGlmIChQcmVzZW5jZSAmJiBQcmVzZW5jZS5zdGF0dXMpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgUHJlc2VuY2VDbGFzcyA9IEdldFByZXNlbmNlQ2xhc3MoUHJlc2VuY2Uuc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICAkUHJlc2VuY2UKICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKGZ1bmN0aW9uKGksIGMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoYy5tYXRjaCgvQ29sbGFiUHJlc2VuY2UtLVxTKy9nKSB8fCBbXSkuam9pbignICcpOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYlByZXNlbmNlICcgKyBQcmVzZW5jZUNsYXNzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAvLyBLZWVwIHVua25vd24gcHJlc2VuY2UKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplIGNhbmNlbCBidXR0b25zIGZvciBsaW5rZWQgYXBwb2ludG1lbnRzCiAgICAgKiAgICAgICAgICAgICAgQ2FsbGVkIG9uIHBhZ2UgbG9hZCBhbmQgYWZ0ZXIgYXN5bmMgd2lkZ2V0IGxvYWRpbmcKICAgICAqLwogICAgZnVuY3Rpb24gSW5pdENhbmNlbEFwcG9pbnRtZW50QnV0dG9ucygpIHsKICAgICAgICAvLyBSdW4gaW1tZWRpYXRlbHkgZm9yIGJvdGggd2lkZ2V0IHR5cGVzCiAgICAgICAgQWRkQ2FuY2VsQnV0dG9uc1RvTGlua2VkQXBwb2ludG1lbnRzKCk7ICAgICAgLy8gSVRTTSB3aWRnZXQKICAgICAgICBBZGRDYW5jZWxCdXR0b25zVG9TdGFuZGFyZExpbmtlZE9iamVjdHMoKTsgICAvLyBTdGFuZGFyZCBMaW5rZWRPYmplY3RzIHdpZGdldAoKICAgICAgICAvLyBBbHNvIHJ1biBhZnRlciBkZWxheXMgZm9yIGFzeW5jIHdpZGdldCBsb2FkaW5nCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgQWRkQ2FuY2VsQnV0dG9uc1RvTGlua2VkQXBwb2ludG1lbnRzKCk7CiAgICAgICAgICAgIEFkZENhbmNlbEJ1dHRvbnNUb1N0YW5kYXJkTGlua2VkT2JqZWN0cygpOwogICAgICAgIH0sIDUwMCk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgQWRkQ2FuY2VsQnV0dG9uc1RvTGlua2VkQXBwb2ludG1lbnRzKCk7CiAgICAgICAgICAgIEFkZENhbmNlbEJ1dHRvbnNUb1N0YW5kYXJkTGlua2VkT2JqZWN0cygpOwogICAgICAgIH0sIDE1MDApOwoKICAgICAgICAvLyBVc2UgTXV0YXRpb25PYnNlcnZlciB0byBjYXRjaCBhc3luYyB3aWRnZXQgbG9hZGluZwogICAgICAgIHZhciBPYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBBZGRDYW5jZWxCdXR0b25zVG9MaW5rZWRBcHBvaW50bWVudHMoKTsKICAgICAgICAgICAgQWRkQ2FuY2VsQnV0dG9uc1RvU3RhbmRhcmRMaW5rZWRPYmplY3RzKCk7CiAgICAgICAgfSk7CiAgICAgICAgT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCB7IGNoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZSB9KTsKCiAgICAgICAgLy8gU3RvcCBvYnNlcnZpbmcgYWZ0ZXIgMTAgc2Vjb25kcwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIE9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9LCAxMDAwMCk7CiAgICB9CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMgLSBQYWdlIFByb2Nlc3NpbmcKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIFByb2Nlc3NBdmF0YXJzT25QYWdlKCkgewogICAgICAgIC8vIEZpbmQgYWxsIHBsYWNlaG9sZGVyIGVsZW1lbnRzIHRoYXQgc2hvdWxkIGJlY29tZSBhdmF0YXJzCiAgICAgICAgJCgnW2RhdGEtY29sbGFiLWVtYWlsXScpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJFBsYWNlaG9sZGVyID0gJCh0aGlzKTsKICAgICAgICAgICAgdmFyIEVtYWlsID0gJFBsYWNlaG9sZGVyLmF0dHIoJ2RhdGEtY29sbGFiLWVtYWlsJyk7CiAgICAgICAgICAgIHZhciBTaXplID0gJFBsYWNlaG9sZGVyLmF0dHIoJ2RhdGEtY29sbGFiLXNpemUnKSB8fCAnbWVkaXVtJzsKICAgICAgICAgICAgdmFyIFNob3dQcmVzZW5jZSA9ICRQbGFjZWhvbGRlci5hdHRyKCdkYXRhLWNvbGxhYi1wcmVzZW5jZScpICE9PSAnZmFsc2UnOwoKICAgICAgICAgICAgLy8gU2tpcCBlbGVtZW50cyB0aGF0IGFyZSBhbHJlYWR5IGF2YXRhcnMgb3IgcGFydCBvZiBhIFVzZXJCYWRnZQogICAgICAgICAgICAvLyAoVXNlckJhZGdlIG1hbmFnZXMgaXRzIG93biBhdmF0YXIpCiAgICAgICAgICAgIGlmICgkUGxhY2Vob2xkZXIuaGFzQ2xhc3MoJ0NvbGxhYkF2YXRhcicpIHx8CiAgICAgICAgICAgICAgICAkUGxhY2Vob2xkZXIuaGFzQ2xhc3MoJ0NvbGxhYlVzZXJCYWRnZV9fY29udGVudCcpIHx8CiAgICAgICAgICAgICAgICAkUGxhY2Vob2xkZXIuY2xvc2VzdCgnLkNvbGxhYlVzZXJCYWRnZV9fY29udGVudCcpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBza2lwIHRoaXMgZWxlbWVudAogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoRW1haWwpIHsKICAgICAgICAgICAgICAgIHZhciAkQXZhdGFyID0gVGFyZ2V0TlMuQ3JlYXRlQXZhdGFyKHsKICAgICAgICAgICAgICAgICAgICBlbWFpbDogRW1haWwsCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogU2l6ZSwKICAgICAgICAgICAgICAgICAgICBzaG93UHJlc2VuY2U6IFNob3dQcmVzZW5jZSwKICAgICAgICAgICAgICAgICAgICBjbGlja2FibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICRQbGFjZWhvbGRlci5yZXBsYWNlV2l0aCgkQXZhdGFyKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBVcGRhdGUgZXhpc3RpbmcgYXZhdGFycwogICAgICAgICQoJy5Db2xsYWJBdmF0YXInKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuVXBkYXRlQXZhdGFyKCQodGhpcykpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vIFRyYWNrIHByb2Nlc3NlZCBhcnRpY2xlIHdpZGdldHMgYnkgdGhlaXIgYXJ0aWNsZSBJRCB0byBwcmV2ZW50IGR1cGxpY2F0ZXMKICAgIC8vIFRoaXMgc3Vydml2ZXMgRE9NIHJlLXJlbmRlcnMgYmV0dGVyIHRoYW4gQ1NTIGNsYXNzZXMKICAgIHZhciBQcm9jZXNzZWRBcnRpY2xlV2lkZ2V0cyA9IHt9OwoKICAgIC8qKgogICAgICogQG5hbWUgUHJvY2Vzc0FydGljbGVBdmF0YXJzCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gUHJvY2VzcyBuYXRpdmUgWm51bnkgYXJ0aWNsZSBhdmF0YXJzIGFuZCByZXBsYWNlIHRoZW0gd2l0aCBDb2xsYWJvcmF0aW9uIGF2YXRhcnMKICAgICAqLwogICAgZnVuY3Rpb24gUHJvY2Vzc0FydGljbGVBdmF0YXJzKCkgewogICAgICAgIC8vIEZpbmQgYWxsIG5hdGl2ZSBhcnRpY2xlIGF2YXRhcnMgKEFydGljbGVTZW5kZXJJbml0aWFscykKICAgICAgICAkKCcuQXZhdGFyIC5BcnRpY2xlU2VuZGVySW5pdGlhbHMnKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyICRJbml0aWFsc0NvbnRhaW5lciA9ICQodGhpcyk7CiAgICAgICAgICAgIHZhciAkQXZhdGFyQ29udGFpbmVyID0gJEluaXRpYWxzQ29udGFpbmVyLmNsb3Nlc3QoJy5BdmF0YXInKTsKCiAgICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBhcnRpY2xlIHdpZGdldCBGSVJTVAogICAgICAgICAgICB2YXIgJFdpZGdldCA9ICRBdmF0YXJDb250YWluZXIuY2xvc2VzdCgnLldpZGdldFNpbXBsZScpOwogICAgICAgICAgICBpZiAoISRXaWRnZXQubGVuZ3RoKSByZXR1cm47CgogICAgICAgICAgICAvLyBHZXQgYXJ0aWNsZSBJRCBmcm9tIHdpZGdldCBmb3IgdHJhY2tpbmcgKG1vcmUgcmVsaWFibGUgdGhhbiBET00gY2xhc3NlcykKICAgICAgICAgICAgdmFyIEFydGljbGVJRCA9ICRXaWRnZXQuYXR0cignaWQnKSB8fCAkV2lkZ2V0LmRhdGEoJ2FydGljbGUtaWQnKTsKICAgICAgICAgICAgaWYgKCFBcnRpY2xlSUQpIHsKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBmaW5kIGFydGljbGUgSUQgZnJvbSBoZWFkZXIgbGluawogICAgICAgICAgICAgICAgdmFyICRIZWFkZXJMaW5rID0gJFdpZGdldC5maW5kKCcuSGVhZGVyIGgyIGFbbmFtZV0nKTsKICAgICAgICAgICAgICAgIGlmICgkSGVhZGVyTGluay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPSAkSGVhZGVyTGluay5hdHRyKCduYW1lJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFBSSU1BUlkgQ0hFQ0s6IFNraXAgaWYgYSBDb2xsYWJBdmF0YXIgYWxyZWFkeSBleGlzdHMgQU5ZV0hFUkUgaW4gdGhpcyB3aWRnZXQKICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSBjaGVjayAtIGlmIG91ciBhdmF0YXIgaXMgdGhlcmUsIGRvbid0IGNyZWF0ZSBhbm90aGVyCiAgICAgICAgICAgIGlmICgkV2lkZ2V0LmZpbmQoJy5Db2xsYWJBdmF0YXInKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhlIG5hdGl2ZSBhdmF0YXIgaXMgaGlkZGVuIChtaWdodCBiZSB2aXNpYmxlIGFmdGVyIHJlLXJlbmRlcikKICAgICAgICAgICAgICAgICRBdmF0YXJDb250YWluZXIuYWRkQ2xhc3MoJ0NvbGxhYkhpZGRlbicpOwogICAgICAgICAgICAgICAgLy8gTWFyayB3aWRnZXQgYXMgcHJvY2Vzc2VkIChjbGFzcyBtaWdodCBoYXZlIGJlZW4gbG9zdCBkdXJpbmcgcmUtcmVuZGVyKQogICAgICAgICAgICAgICAgJFdpZGdldC5hZGRDbGFzcygnQ29sbGFiQXJ0aWNsZS0tcHJvY2Vzc2VkJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFNFQ09OREFSWSBDSEVDSzogU2tpcCBpZiB0aGlzIHdpZGdldCB3YXMgYWxyZWFkeSBwcm9jZXNzZWQgKENTUyBjbGFzcykKICAgICAgICAgICAgaWYgKCRXaWRnZXQuaGFzQ2xhc3MoJ0NvbGxhYkFydGljbGUtLXByb2Nlc3NlZCcpKSByZXR1cm47CgogICAgICAgICAgICAvLyBURVJUSUFSWSBDSEVDSzogU2tpcCBpZiB3ZSd2ZSBwcm9jZXNzZWQgdGhpcyBhcnRpY2xlIElEIGJlZm9yZSAoSlMgdHJhY2tpbmcpCiAgICAgICAgICAgIGlmIChBcnRpY2xlSUQgJiYgUHJvY2Vzc2VkQXJ0aWNsZVdpZGdldHNbQXJ0aWNsZUlEXSkgewogICAgICAgICAgICAgICAgJFdpZGdldC5hZGRDbGFzcygnQ29sbGFiQXJ0aWNsZS0tcHJvY2Vzc2VkJyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE1hcmsgYXMgcHJvY2Vzc2VkIElNTUVESUFURUxZIHVzaW5nIGFsbCB0aHJlZSBtZXRob2RzCiAgICAgICAgICAgICRXaWRnZXQuYWRkQ2xhc3MoJ0NvbGxhYkFydGljbGUtLXByb2Nlc3NlZCcpOwogICAgICAgICAgICBpZiAoQXJ0aWNsZUlEKSB7CiAgICAgICAgICAgICAgICBQcm9jZXNzZWRBcnRpY2xlV2lkZ2V0c1tBcnRpY2xlSURdID0gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gRXh0cmFjdCBlbWFpbCBmcm9tIEhpZGRlbiBzcGFuIGluIGhlYWRlcgogICAgICAgICAgICAvLyBGb3JtYXQ6ICJEaXNwbGF5IE5hbWUiIDxlbWFpbEBkb21haW4uZGU+CiAgICAgICAgICAgIHZhciAkSGlkZGVuU3BhbiA9ICRXaWRnZXQuZmluZCgnLkhlYWRlciBoMiAuSGlkZGVuJykuZmlyc3QoKTsKICAgICAgICAgICAgdmFyIEhpZGRlblRleHQgPSAkSGlkZGVuU3Bhbi50ZXh0KCk7CiAgICAgICAgICAgIHZhciBFbWFpbE1hdGNoID0gSGlkZGVuVGV4dC5tYXRjaCgvPChbXj5dKyk+Lyk7CiAgICAgICAgICAgIHZhciBFbWFpbCA9IEVtYWlsTWF0Y2ggPyBFbWFpbE1hdGNoWzFdIDogbnVsbDsKCiAgICAgICAgICAgIC8vIEV4dHJhY3QgZGlzcGxheSBuYW1lIGZvciBiZXR0ZXIgaW5pdGlhbHMKICAgICAgICAgICAgdmFyIE5hbWVNYXRjaCA9IEhpZGRlblRleHQubWF0Y2goLyIoW14iXSspIi8pOwogICAgICAgICAgICB2YXIgRGlzcGxheU5hbWUgPSBOYW1lTWF0Y2ggPyBOYW1lTWF0Y2hbMV0gOiBudWxsOwoKICAgICAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICAgICAgLy8gTm8gZW1haWwgZm91bmQsIHNraXAgdGhpcyBhdmF0YXIKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSGlkZSB0aGUgb3JpZ2luYWwgWm51bnkgYXZhdGFyIGNvbnRhaW5lciBjb21wbGV0ZWx5CiAgICAgICAgICAgICRBdmF0YXJDb250YWluZXIuYWRkQ2xhc3MoJ0NvbGxhYkhpZGRlbicpOwoKICAgICAgICAgICAgLy8gQ3JlYXRlIENvbGxhYm9yYXRpb24gYXZhdGFyCiAgICAgICAgICAgIHZhciAkQ29sbGFiQXZhdGFyID0gVGFyZ2V0TlMuQ3JlYXRlQXZhdGFyKHsKICAgICAgICAgICAgICAgIGVtYWlsOiBFbWFpbCwKICAgICAgICAgICAgICAgIHNpemU6ICd4bGFyZ2UnLCAgLy8gNjRweCAtIG1hdGNoZXMgbmF0aXZlIGF2YXRhciBzaXplCiAgICAgICAgICAgICAgICBzaG93UHJlc2VuY2U6IHRydWUsCiAgICAgICAgICAgICAgICBjbGlja2FibGU6IHRydWUKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgZGlzcGxheSBuYW1lLCB1cGRhdGUgdGhlIGZhbGxiYWNrIGluaXRpYWxzCiAgICAgICAgICAgIGlmIChEaXNwbGF5TmFtZSkgewogICAgICAgICAgICAgICAgJENvbGxhYkF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLnRleHQoR2V0SW5pdGlhbHMoRW1haWwsIERpc3BsYXlOYW1lKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEluc2VydCBvdXIgYXZhdGFyIEJFRk9SRSB0aGUgaGlkZGVuIG5hdGl2ZSBhdmF0YXIgKGFzIHNpYmxpbmcpCiAgICAgICAgICAgICRBdmF0YXJDb250YWluZXIuYmVmb3JlKCRDb2xsYWJBdmF0YXIpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBIZWxwZXIgRnVuY3Rpb25zCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICBmdW5jdGlvbiBHZXRJbml0aWFscyhOYW1lT3JFbWFpbCwgRGlzcGxheU5hbWUpIHsKICAgICAgICAvLyBQcmVmZXIgZGlzcGxheU5hbWUgaWYgcHJvdmlkZWQKICAgICAgICBpZiAoRGlzcGxheU5hbWUpIHsKICAgICAgICAgICAgdmFyIE5hbWVQYXJ0cyA9IERpc3BsYXlOYW1lLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgICAgICAgIGlmIChOYW1lUGFydHMubGVuZ3RoID49IDIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTmFtZVBhcnRzWzBdWzBdICsgTmFtZVBhcnRzW05hbWVQYXJ0cy5sZW5ndGggLSAxXVswXSkudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gRGlzcGxheU5hbWUuc3Vic3RyaW5nKDAsIDIpLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBGYWxsYmFjayB0byBlbWFpbAogICAgICAgIGlmICghTmFtZU9yRW1haWwpIHJldHVybiAnPyc7CgogICAgICAgIHZhciBOYW1lID0gTmFtZU9yRW1haWwuc3BsaXQoJ0AnKVswXTsKICAgICAgICB2YXIgUGFydHMgPSBOYW1lLnNwbGl0KC9bLl8tXS8pOwoKICAgICAgICBpZiAoUGFydHMubGVuZ3RoID49IDIpIHsKICAgICAgICAgICAgcmV0dXJuIChQYXJ0c1swXVswXSArIFBhcnRzWzFdWzBdKS50b1VwcGVyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIE5hbWUuc3Vic3RyaW5nKDAsIDIpLnRvVXBwZXJDYXNlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gR2V0UHJlc2VuY2VJbmZvKFN0YXR1cykgewogICAgICAgIHZhciBMb3dlclN0YXR1cyA9IChTdGF0dXMgfHwgJ3Vua25vd24nKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1xzKy9nLCAnJyk7CiAgICAgICAgcmV0dXJuIFByZXNlbmNlTWFwW0xvd2VyU3RhdHVzXSB8fCBQcmVzZW5jZU1hcFsndW5rbm93biddOwogICAgfQoKICAgIGZ1bmN0aW9uIFVwZGF0ZVByZXNlbmNlSW5kaWNhdG9yKCRFbGVtZW50LCBQcmVzZW5jZSkgewogICAgICAgIHZhciBJbmZvID0gR2V0UHJlc2VuY2VJbmZvKFByZXNlbmNlLnN0YXR1cyk7CgogICAgICAgIC8vIFJlbW92ZSBhbGwgc3RhdHVzIGNsYXNzZXMKICAgICAgICAkRWxlbWVudC5yZW1vdmVDbGFzcyhmdW5jdGlvbiAoSW5kZXgsIENsYXNzTmFtZSkgewogICAgICAgICAgICByZXR1cm4gKENsYXNzTmFtZS5tYXRjaCgvQ29sbGFiUHJlc2VuY2UtLVxTKy9nKSB8fCBbXSkuam9pbignICcpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgbmV3IHN0YXR1cyBjbGFzcwogICAgICAgICRFbGVtZW50LmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZS0tJyArIEluZm8uY2xhc3MpOwogICAgICAgICRFbGVtZW50LmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoSW5mby5sYWJlbCkpOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gRXZlbnQgSGFuZGxlcnMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIGZ1bmN0aW9uIE9uTG9naW4oVXNlcikgewogICAgICAgIFRhcmdldE5TLlVwZGF0ZUhlYWRlcigpOwogICAgICAgIFByb2Nlc3NBdmF0YXJzT25QYWdlKCk7CiAgICAgICAgUHJvY2Vzc0FydGljbGVBdmF0YXJzKCk7CiAgICAgICAgLy8gUmVmcmVzaCBjdXN0b21lciBpbmZvIHdpZGdldCB3aXRoIE0zNjUgZGF0YQogICAgICAgIFJlZnJlc2hDdXN0b21lckluZm9XaWRnZXQoKTsKCiAgICAgICAgLy8gS2VlcCB0aGUgaGVhZGVyIGRyb3Bkb3duJ3Mgb3duIHByb3ZpZGVyIExvZ2luL0xvZ291dCB0b2dnbGUKICAgICAgICAvLyAoYnVpbHQgb25jZSBieSBBZGRMb2dpbk1lbnVJdGVtLCBhdCBwYWdlIGxvYWQpIGluIHN5bmMuIFNpbGVudAogICAgICAgIC8vIFNTTyBpcyBhbiBhc3luYyByb3VuZCB0cmlwIChNU0FMJ3MgYWNxdWlyZVRva2VuU2lsZW50KCkpIHRoYXQKICAgICAgICAvLyB2ZXJ5IG9mdGVuIG9ubHkgcmVzb2x2ZXMgYWZ0ZXIgdGhhdCBtZW51IGhhcyBhbHJlYWR5IGJlZW4KICAgICAgICAvLyBidWlsdCBzaG93aW5nICJub3QgbG9nZ2VkIGluIiAtIHdpdGhvdXQgdGhpcywgdGhlIGRyb3Bkb3duCiAgICAgICAgLy8ga2VlcHMgb2ZmZXJpbmcgYSBzdGFsZSAiTG9naW4iIGV2ZW4gb25jZSBhY3R1YWxseSBjb25uZWN0ZWQsCiAgICAgICAgLy8gd2hpbGUgdGhlIGF2YXRhciBiYWRnZSAodXBkYXRlZCBoZXJlIHZpYSBVcGRhdGVIZWFkZXIpIGFscmVhZHkKICAgICAgICAvLyBzaG93cyB0aGUgcmVhbCwgY29ubmVjdGVkIHN0YXRlIC0gYSBjb25mdXNpbmcgaGFsZi11cGRhdGVkCiAgICAgICAgLy8gaGVhZGVyIHRoYXQgbG9va3MgbGlrZSB0aGUgTTM2NSBpbnRlZ3JhdGlvbiBpc24ndCByZWFsbHkKICAgICAgICAvLyBhY3RpdmUuCiAgICAgICAgJCgnI0NvbGxhYlByb3ZpZGVyTG9naW4nKS5oaWRlKCk7CiAgICAgICAgJCgnI0NvbGxhYlByb3ZpZGVyTG9nb3V0Jykuc2hvdygpOwogICAgfQoKICAgIGZ1bmN0aW9uIE9uTG9nb3V0KCkgewogICAgICAgIFRhcmdldE5TLlVwZGF0ZUhlYWRlcigpOwoKICAgICAgICAvLyBSZXNldCBhdmF0YXJzIHRvIGZhbGxiYWNrCiAgICAgICAgJCgnLkNvbGxhYkF2YXRhcicpLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgJEF2YXRhciA9ICQodGhpcyk7CiAgICAgICAgICAgICRBdmF0YXIuZmluZCgnLkNvbGxhYkF2YXRhcl9faW1hZ2UnKS5yZW1vdmUoKTsKICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiQXZhdGFyX19mYWxsYmFjaycpLnNob3coKTsKICAgICAgICAgICAgJEF2YXRhci5maW5kKCcuQ29sbGFiUHJlc2VuY2UnKQogICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKGZ1bmN0aW9uIChpLCBjKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjLm1hdGNoKC9Db2xsYWJQcmVzZW5jZS0tXFMrL2cpIHx8IFtdKS5qb2luKCcgJyk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJQcmVzZW5jZS0tdW5rbm93bicpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBNaXJyb3IgT25Mb2dpbidzIG93biBzeW5jIG9mIHRoZSBkcm9wZG93bidzIExvZ2luL0xvZ291dCB0b2dnbGUuCiAgICAgICAgJCgnI0NvbGxhYlByb3ZpZGVyTG9naW4nKS5zaG93KCk7CiAgICAgICAgJCgnI0NvbGxhYlByb3ZpZGVyTG9nb3V0JykuaGlkZSgpOwogICAgfQoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkgfHwge30pKTsKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBBdXRvLUluaXRpYWxpemUKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7CiAgICAvLyBJbml0aWFsaXplIFVJIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gZW5zdXJlIENvbGxhYm9yYXRpb24gY29yZSBpcyByZWFkeQogICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiAmJiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkpIHsKICAgICAgICAgICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJLkluaXQoKTsKICAgICAgICB9CiAgICB9LCAxMDApOwp9KTsK</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.OwnerInfoPanel.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsCiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24KICogQGRlc2NyaXB0aW9uCiAqICAgICAgT3duZXIgSW5mbyBQYW5lbCBmb3IgQ29sbGFib3JhdGlvbiBBZGQtb24KICoKICogICAgICBEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlbGVjdGVkIHRpY2tldCBvd25lcjoKICogICAgICAtIEF2YXRhciB3aXRoIGhvdmVyLWNhcmQKICogICAgICAtIE91dC1vZi1PZmZpY2UgYmFubmVyIChpZiBhY3RpdmUpCiAqICAgICAgLSBGcmVlL0J1c3kgd2VlayBjYWxlbmRhciB2aWV3CiAqCiAqICAgICAgQXR0YWNoZXMgdG8gb3duZXIgZHJvcGRvd24gZmllbGRzIChOZXdPd25lcklELCBOZXdSZXNwb25zaWJsZUlELCBldGMuKQogKi8KdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLk93bmVySW5mb1BhbmVsID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIHZhciBDb2xsYWIgPSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb247CiAgICAvLyBOb3RlOiBDb2xsYWJVSSBpcyBhY2Nlc3NlZCBsYXppbHkgc2luY2UgVUkuanMgbG9hZHMgYWZ0ZXIgdGhpcyBmaWxlCgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEN1cnJlbnRseSBkaXNwbGF5ZWQgZW1haWwgaW4gYWN0aXZlIHBhbmVsCiAgICAgKi8KICAgIHZhciBBY3RpdmVFbWFpbCA9IG51bGw7CgogICAgLy8gTm90ZTogV2VlayBvZmZzZXQgaXMgbm93IHN0b3JlZCBwZXItY2FsZW5kYXIgYXMgZGF0YSBhdHRyaWJ1dGUgKGRhdGEtd2Vlay1vZmZzZXQpCiAgICAvLyB0byBzdXBwb3J0IG11bHRpcGxlIGNhbGVuZGFycyBvbiBzYW1lIHBhZ2UgKE93bmVyICsgUmVzcG9uc2libGUpCgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIE93bmVyIGRyb3Bkb3duIHNlbGVjdG9ycyB0byB3YXRjaAogICAgICogICAgICAgICAgICAgIE5vdGU6IFNvbWUgcGFnZXMgdXNlIE5ld1VzZXJJRCBpbnN0ZWFkIG9mIE5ld093bmVySUQgKGUuZy4sIEFnZW50VGlja2V0RW1haWwsIEFnZW50VGlja2V0UGhvbmUpCiAgICAgKi8KICAgIHZhciBPd25lclNlbGVjdG9ycyA9IFsKICAgICAgICAnI05ld093bmVySUQnLAogICAgICAgICcjTmV3VXNlcklEJywKICAgICAgICAnI05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICcjT3duZXJJRCcsCiAgICAgICAgJ3NlbGVjdFtuYW1lPSJOZXdPd25lcklEIl0nLAogICAgICAgICdzZWxlY3RbbmFtZT0iTmV3VXNlcklEIl0nLAogICAgICAgICdzZWxlY3RbbmFtZT0iT3duZXJJRCJdJywKICAgICAgICAnc2VsZWN0W25hbWU9Ik5ld1Jlc3BvbnNpYmxlSUQiXScKICAgIF07CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIERheSBuYW1lcyAoR2VybWFuIGFiYnJldmlhdGlvbnMpCiAgICAgKi8KICAgIHZhciBEYXlOYW1lcyA9IFsnTW8nLCAnRGknLCAnTWknLCAnRG8nLCAnRnInLCAnU2EnLCAnU28nXTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFB1YmxpYyBNZXRob2RzCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uT3duZXJJbmZvUGFuZWwKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgb3duZXIgaW5mbyBwYW5lbCBsaXN0ZW5lcnMKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29sbGFiLkdldENvbmZpZygpOwoKICAgICAgICBpZiAoIUNvbmZpZy5FbmFibGVPd25lckluZm9QYW5lbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBCaW5kIHRvIG93bmVyIGRyb3Bkb3ducyBvbiBwYWdlCiAgICAgICAgQmluZE93bmVyRHJvcGRvd25zKCk7CgogICAgICAgIC8vIEFsc28gc2V0IHVwIGRvY3VtZW50LWxldmVsIElucHV0RmllbGQgZXZlbnQgbGlzdGVuZXIgZm9yIGR5bmFtaWNhbGx5IGxvYWRlZCBkcm9wZG93bnMKICAgICAgICBTZXR1cERvY3VtZW50TGV2ZWxMaXN0ZW5lcnMoKTsKICAgIH07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcml2YXRlIE1ldGhvZHMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBCaW5kIGNoYW5nZSBoYW5kbGVycyB0byBvd25lciBkcm9wZG93bnMKICAgICAqLwogICAgZnVuY3Rpb24gQmluZE93bmVyRHJvcGRvd25zKCkgewogICAgICAgICQoT3duZXJTZWxlY3RvcnMuam9pbignLCcpKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQmluZFNpbmdsZURyb3Bkb3duKCQodGhpcykpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBCaW5kIGEgc2luZ2xlIGRyb3Bkb3duIGVsZW1lbnQKICAgICAqLwogICAgZnVuY3Rpb24gQmluZFNpbmdsZURyb3Bkb3duKCRTZWxlY3QpIHsKICAgICAgICBpZiAoISRTZWxlY3QgfHwgISRTZWxlY3QubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBib3VuZAogICAgICAgIGlmICgkU2VsZWN0LmRhdGEoJ2NvbGxhYi1vd25lci1ib3VuZCcpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFNlbGVjdC5kYXRhKCdjb2xsYWItb3duZXItYm91bmQnLCB0cnVlKTsKCiAgICAgICAgLy8gRmluZCB0aGUgY29udGFpbmVyIC0gbG9vayBmb3IgcGFyZW50IC5GaWVsZCBvciBJbnB1dEZpZWxkX0NvbnRhaW5lcgogICAgICAgIHZhciAkRmllbGRDb250YWluZXIgPSAkU2VsZWN0LmNsb3Nlc3QoJy5GaWVsZCcpOwogICAgICAgIGlmICghJEZpZWxkQ29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAkRmllbGRDb250YWluZXIgPSAkU2VsZWN0LmNsb3Nlc3QoJy5JbnB1dEZpZWxkX0NvbnRhaW5lcicpOwogICAgICAgIH0KICAgICAgICBpZiAoISRGaWVsZENvbnRhaW5lci5sZW5ndGgpIHsKICAgICAgICAgICAgJEZpZWxkQ29udGFpbmVyID0gJFNlbGVjdC5wYXJlbnQoKTsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSBwYW5lbCBjb250YWluZXIgYWZ0ZXIgdGhlIGZpZWxkIGNvbnRhaW5lcgogICAgICAgIHZhciBDb250YWluZXJJRCA9ICdDb2xsYWJPd25lckluZm9QYW5lbF8nICsgJFNlbGVjdC5hdHRyKCdpZCcpOwogICAgICAgIHZhciAkQ29udGFpbmVyID0gJCgnIycgKyBDb250YWluZXJJRCk7CiAgICAgICAgaWYgKCEkQ29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAkQ29udGFpbmVyID0gJCgnPGRpdj4nKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY29udGFpbmVyJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIENvbnRhaW5lcklEKTsKICAgICAgICAgICAgJEZpZWxkQ29udGFpbmVyLmFmdGVyKCRDb250YWluZXIpOwogICAgICAgIH0KCiAgICAgICAgLy8gQmluZCBjaGFuZ2UgZXZlbnQgLSB3b3JrcyB3aXRoIGJvdGggbmF0aXZlIGFuZCBNb2Rlcm5pemUgZHJvcGRvd25zCiAgICAgICAgJFNlbGVjdC5vbignY2hhbmdlLmNvbGxhYk93bmVyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBPbk93bmVyQ2hhbmdlKCRTZWxlY3QsICRDb250YWluZXIpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTZXQgdXAgZG9jdW1lbnQtbGV2ZWwgZXZlbnQgbGlzdGVuZXJzIGZvciBkeW5hbWljYWxseSBsb2FkZWQgZHJvcGRvd25zCiAgICAgKiAgICAgICAgICAgICAgVGhpcyBjYXRjaGVzIGRyb3Bkb3ducyB0aGF0IGFyZSBsb2FkZWQgYWZ0ZXIgSW5pdCgpIHJ1bnMKICAgICAqLwogICAgZnVuY3Rpb24gU2V0dXBEb2N1bWVudExldmVsTGlzdGVuZXJzKCkgewogICAgICAgIC8vIEZpZWxkIElEcyB0byB3YXRjaCBmb3IKICAgICAgICB2YXIgT3duZXJGaWVsZElEcyA9IFsKICAgICAgICAgICAgJ05ld093bmVySUQnLAogICAgICAgICAgICAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgICdPd25lcklEJwogICAgICAgIF07CgogICAgICAgIC8vIExpc3RlbiBmb3IgSW5wdXRGaWVsZCBldmVudHMgYXQgZG9jdW1lbnQgbGV2ZWwgKFpudW55IE1vZGVybml6ZSkKICAgICAgICAkKGRvY3VtZW50KS5vbignSW5wdXRGaWVsZFNlYXJjaENvbXBsZXRlLmNvbGxhYk93bmVyR2xvYmFsJywgZnVuY3Rpb24gKEV2ZW50LCBEYXRhKSB7CiAgICAgICAgICAgIGlmICghRGF0YSB8fCAhRGF0YS5GaWVsZElEKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXMgYW4gb3duZXItcmVsYXRlZCBmaWVsZAogICAgICAgICAgICBpZiAoT3duZXJGaWVsZElEcy5pbmRleE9mKERhdGEuRmllbGRJRCkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciAkU2VsZWN0ID0gJCgnIycgKyBEYXRhLkZpZWxkSUQpOwogICAgICAgICAgICBpZiAoISRTZWxlY3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZHJvcGRvd24gaXMgYm91bmQgKGZvciBkeW5hbWljYWxseSBsb2FkZWQgZmllbGRzKQogICAgICAgICAgICBCaW5kU2luZ2xlRHJvcGRvd24oJFNlbGVjdCk7CgogICAgICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIGNvbnRhaW5lcgogICAgICAgICAgICB2YXIgQ29udGFpbmVySUQgPSAnQ29sbGFiT3duZXJJbmZvUGFuZWxfJyArIERhdGEuRmllbGRJRDsKICAgICAgICAgICAgdmFyICRDb250YWluZXIgPSAkKCcjJyArIENvbnRhaW5lcklEKTsKCiAgICAgICAgICAgIGlmICgkQ29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgT25Pd25lckNoYW5nZSgkU2VsZWN0LCAkQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIH0sIDEwMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gQWxzbyB0cnkgdG8gYmluZCBhZnRlciBzaG9ydCBkZWxheSBmb3IgQUpBWC1sb2FkZWQgY29udGVudAogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICBCaW5kT3duZXJEcm9wZG93bnMoKTsKICAgICAgICB9LCA1MDApOwoKICAgICAgICAvLyBBbmQgYWZ0ZXIgbG9uZ2VyIGRlbGF5IGFzIGZhbGxiYWNrCiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIEJpbmRPd25lckRyb3Bkb3ducygpOwogICAgICAgIH0sIDE1MDApOwoKICAgICAgICAvLyBMaXN0ZW4gZm9yIEFKQVggbG9hZGVyIGNvbXBsZXRlIGV2ZW50cyAoWm51bnkgbG9hZHMgY29udGVudCB2aWEgQUpBWCkKICAgICAgICBpZiAoQ29yZS5BcHAgJiYgQ29yZS5BcHAuU3Vic2NyaWJlKSB7CiAgICAgICAgICAgIENvcmUuQXBwLlN1YnNjcmliZSgnQUpBWExvYWRlckNvbXBsZXRlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gUmUtY2hlY2sgZm9yIG93bmVyIGRyb3Bkb3ducyBhZnRlciBBSkFYIGNvbnRlbnQgbG9hZHMKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIEJpbmRPd25lckRyb3Bkb3ducygpOwogICAgICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBbHNvIGxpc3RlbiBmb3IgSW5wdXRGaWVsZCBpbml0aWFsaXphdGlvbiBldmVudHMKICAgICAgICAkKGRvY3VtZW50KS5vbignSW5wdXRGaWVsZEluaXQuY29sbGFiT3duZXJHbG9iYWwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQmluZE93bmVyRHJvcGRvd25zKCk7CiAgICAgICAgICAgIH0sIDIwMCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEhhbmRsZSBvd25lciBkcm9wZG93biBjaGFuZ2UKICAgICAqLwogICAgZnVuY3Rpb24gT25Pd25lckNoYW5nZSgkU2VsZWN0LCAkQ29udGFpbmVyKSB7CiAgICAgICAgdmFyIFVzZXJJRCA9ICRTZWxlY3QudmFsKCk7CgogICAgICAgIC8vIENsZWFyIHBhbmVsIGlmIG5vIHNlbGVjdGlvbgogICAgICAgIGlmICghVXNlcklEIHx8IFVzZXJJRCA9PT0gJycgfHwgVXNlcklEID09PSAnMCcgfHwgVXNlcklEID09PSAnLScpIHsKICAgICAgICAgICAgJENvbnRhaW5lci5lbXB0eSgpLmhpZGUoKTsKICAgICAgICAgICAgQWN0aXZlRW1haWwgPSBudWxsOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93IGxvYWRpbmcgc3RhdGUKICAgICAgICAkQ29udGFpbmVyLmh0bWwoCiAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJDb2xsYWJPd25lckluZm9QYW5lbCBDb2xsYWJPd25lckluZm9QYW5lbC0tbG9hZGluZyI+JyArCiAgICAgICAgICAgICc8aSBjbGFzcz0iZmEgZmEtc3Bpbm5lciBmYS1zcGluIj48L2k+ICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTG9hZGluZy4uLicpICsKICAgICAgICAgICAgJzwvZGl2PicKICAgICAgICApLnNob3coKTsKCiAgICAgICAgLy8gR2V0IGFnZW50IGVtYWlsIGJ5IFVzZXJJRAogICAgICAgIEdldEFnZW50RW1haWwoVXNlcklEKS50aGVuKGZ1bmN0aW9uIChBZ2VudERhdGEpIHsKICAgICAgICAgICAgaWYgKCFBZ2VudERhdGEgfHwgIUFnZW50RGF0YS5lbWFpbCkgewogICAgICAgICAgICAgICAgJENvbnRhaW5lci5lbXB0eSgpLmhpZGUoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWN0aXZlRW1haWwgPSBBZ2VudERhdGEuZW1haWw7CgogICAgICAgICAgICAvLyBMb2FkIGFsbCBkYXRhIGluIHBhcmFsbGVsIHdpdGggaW5kaXZpZHVhbCBlcnJvciBoYW5kbGluZwogICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgb25lIGZhaWxpbmcgY2FsbCBkb2Vzbid0IGJyZWFrIHRoZSBlbnRpcmUgcGFuZWwKICAgICAgICAgICAgdmFyIFByb2ZpbGVQcm9taXNlID0gQ29sbGFiLkdldFByb2ZpbGUoQWdlbnREYXRhLmVtYWlsKQogICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkaXNwbGF5TmFtZTogQWdlbnREYXRhLmZ1bGxuYW1lLCBlbWFpbDogQWdlbnREYXRhLmVtYWlsIH07CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBGcmVlQnVzeVByb21pc2UgPSBMb2FkV2Vla0ZyZWVCdXN5KEFnZW50RGF0YS5lbWFpbCwgMCkKICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHZhciBQcmVzZW5jZVByb21pc2UgPSBDb2xsYWIuR2V0UHJlc2VuY2UoQWdlbnREYXRhLmVtYWlsKQogICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBzdGF0dXM6ICd1bmtub3duJyB9OwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1Byb2ZpbGVQcm9taXNlLCBGcmVlQnVzeVByb21pc2UsIFByZXNlbmNlUHJvbWlzZV0pCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgIHZhciBQcm9maWxlID0gUmVzdWx0c1swXTsKICAgICAgICAgICAgICAgICAgICB2YXIgRnJlZUJ1c3kgPSBSZXN1bHRzWzFdOwogICAgICAgICAgICAgICAgICAgIHZhciBQcmVzZW5jZSA9IFJlc3VsdHNbMl07CgogICAgICAgICAgICAgICAgICAgIC8vIERlcml2ZSBPT0YgZnJvbSBwcmVzZW5jZSBhY3Rpdml0eSAobm8gc2VwYXJhdGUgQVBJIGNhbGwgbmVlZGVkKQogICAgICAgICAgICAgICAgICAgIHZhciBPT0YgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChQcmVzZW5jZSAmJiBQcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJykgewogICAgICAgICAgICAgICAgICAgICAgICBPT0YgPSBQcmVzZW5jZS5vdXRPZk9mZmljZSB8fCB7IHN0YXR1czogJ2Fsd2F5c0VuYWJsZWQnIH07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBSZW5kZXJPd25lckluZm9QYW5lbCgkQ29udGFpbmVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGU6IFByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mT2ZmaWNlOiBPT0YsCiAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVCdXN5OiBGcmVlQnVzeSwKICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2U6IFByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogQWdlbnREYXRhLmVtYWlsLAogICAgICAgICAgICAgICAgICAgICAgICBmdWxsbmFtZTogQWdlbnREYXRhLmZ1bGxuYW1lCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICRDb250YWluZXIuZW1wdHkoKS5oaWRlKCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdldCBhZ2VudCBlbWFpbCBieSBVc2VySUQgdmlhIEFKQVgKICAgICAqLwogICAgZnVuY3Rpb24gR2V0QWdlbnRFbWFpbChVc2VySUQpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldEFnZW50QnlVc2VySUQnLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRDogVXNlcklECiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlICYmIFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySUQ6IFJlc3BvbnNlLlVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBSZXNwb25zZS5FbWFpbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxuYW1lOiBSZXNwb25zZS5GdWxsbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2luOiBSZXNwb25zZS5Mb2dpbgogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAnanNvbicKICAgICAgICAgICAgKTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gTG9hZCBmcmVlL2J1c3kgZGF0YSBmb3IgYSBzcGVjaWZpYyB3ZWVrCiAgICAgKi8KICAgIGZ1bmN0aW9uIExvYWRXZWVrRnJlZUJ1c3koRW1haWwsIFdlZWtPZmZzZXQpIHsKICAgICAgICAvLyBDYWxjdWxhdGUgd2VlayBib3VuZGFyaWVzIChNb25kYXkgdG8gU3VuZGF5KQogICAgICAgIHZhciBUb2RheSA9IG5ldyBEYXRlKCk7CiAgICAgICAgdmFyIERheU9mV2VlayA9IFRvZGF5LmdldERheSgpOwogICAgICAgIHZhciBNb25kYXkgPSBuZXcgRGF0ZShUb2RheSk7CiAgICAgICAgTW9uZGF5LnNldERhdGUoVG9kYXkuZ2V0RGF0ZSgpIC0gKERheU9mV2VlayA9PT0gMCA/IDYgOiBEYXlPZldlZWsgLSAxKSArIChXZWVrT2Zmc2V0ICogNykpOwogICAgICAgIE1vbmRheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKCiAgICAgICAgdmFyIFN1bmRheSA9IG5ldyBEYXRlKE1vbmRheSk7CiAgICAgICAgU3VuZGF5LnNldERhdGUoTW9uZGF5LmdldERhdGUoKSArIDYpOwogICAgICAgIFN1bmRheS5zZXRIb3VycygyMywgNTksIDU5LCA5OTkpOwoKICAgICAgICAvLyBDaGVjayBpZiBNZWV0aW5ncyBmZWF0dXJlIGlzIGVuYWJsZWQKICAgICAgICBpZiAoIUNvbGxhYi5Jc0ZlYXR1cmVFbmFibGVkKCdNZWV0aW5ncycpKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiB1c2VyIGlzIGxvZ2dlZCBpbiAocmVxdWlyZWQgZm9yIEdyYXBoIEFQSSkKICAgICAgICBpZiAoIUNvbGxhYi5Jc0xvZ2dlZEluKCkpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIHByb3ZpZGVyIHN1cHBvcnRzIGZyZWUvYnVzeQogICAgICAgIGlmICghQ29sbGFiLkhhc0NhcGFiaWxpdHkoJ2ZyZWVCdXN5JykpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBDb2xsYWIuR2V0RnJlZUJ1c3koW0VtYWlsXSwgTW9uZGF5LCBTdW5kYXkpCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChEYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHdlZWtTdGFydDogTW9uZGF5LAogICAgICAgICAgICAgICAgICAgIHdlZWtFbmQ6IFN1bmRheSwKICAgICAgICAgICAgICAgICAgICB3ZWVrT2Zmc2V0OiBXZWVrT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgIGJ1c3lQZXJpb2RzOiBEYXRhW0VtYWlsXSB8fCBbXQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUmVuZGVyIHRoZSBvd25lciBpbmZvIHBhbmVsCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlbmRlck93bmVySW5mb1BhbmVsKCRDb250YWluZXIsIERhdGEpIHsKICAgICAgICB2YXIgJFBhbmVsID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWwnKTsKCiAgICAgICAgLy8gPT09IEhlYWRlcjogQXZhdGFyICsgTmFtZSArIE9PRiBCYWRnZSArIFRvZ2dsZSA9PT0KICAgICAgICB2YXIgJEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19oZWFkZXInKTsKCiAgICAgICAgLy8gQXZhdGFyIHdpdGggaG92ZXItY2FyZCBmdW5jdGlvbmFsaXR5CiAgICAgICAgdmFyICRBdmF0YXJXcmFwID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2F2YXRhcicpOwogICAgICAgIHZhciBDb2xsYWJVSSA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSTsKICAgICAgICBpZiAoQ29sbGFiVUkgJiYgQ29sbGFiVUkuQ3JlYXRlQXZhdGFyKSB7CiAgICAgICAgICAgIHZhciAkQXZhdGFyID0gQ29sbGFiVUkuQ3JlYXRlQXZhdGFyKHsKICAgICAgICAgICAgICAgIGVtYWlsOiBEYXRhLmVtYWlsLAogICAgICAgICAgICAgICAgc2l6ZTogJ2xhcmdlJywKICAgICAgICAgICAgICAgIHNob3dQcmVzZW5jZTogdHJ1ZSwKICAgICAgICAgICAgICAgIGNsaWNrYWJsZTogdHJ1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJEF2YXRhcldyYXAuYXBwZW5kKCRBdmF0YXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEZhbGxiYWNrIGlmIFVJIG5vdCBsb2FkZWQKICAgICAgICAgICAgJEF2YXRhcldyYXAuaHRtbCgnPGRpdiBjbGFzcz0iQ29sbGFiQXZhdGFyIENvbGxhYkF2YXRhci0tbGFyZ2UiPjwvZGl2PicpOwogICAgICAgIH0KICAgICAgICAkSGVhZGVyLmFwcGVuZCgkQXZhdGFyV3JhcCk7CgogICAgICAgIC8vIEluZm8gY29udGFpbmVyIHdpdGggbmFtZSBhbmQgdGl0bGUKICAgICAgICB2YXIgJEluZm8gPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faW5mbycpOwoKICAgICAgICAvLyBOYW1lIHJvdyAoanVzdCBuYW1lLCBiYWRnZXMgbW92ZWQgdG8gaGVhZGVyKQogICAgICAgIHZhciAkTmFtZVJvdyA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19uYW1lUm93Jyk7CiAgICAgICAgdmFyIERpc3BsYXlOYW1lID0gRGF0YS5wcm9maWxlLmRpc3BsYXlOYW1lIHx8IERhdGEuZnVsbG5hbWUgfHwgRGF0YS5lbWFpbDsKICAgICAgICAkTmFtZVJvdy5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19uYW1lJykudGV4dChEaXNwbGF5TmFtZSkpOwogICAgICAgICRJbmZvLmFwcGVuZCgkTmFtZVJvdyk7CgogICAgICAgIGlmIChEYXRhLnByb2ZpbGUuam9iVGl0bGUpIHsKICAgICAgICAgICAgJEluZm8uYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX190aXRsZScpLnRleHQoRGF0YS5wcm9maWxlLmpvYlRpdGxlKSk7CiAgICAgICAgfQogICAgICAgICRIZWFkZXIuYXBwZW5kKCRJbmZvKTsKCiAgICAgICAgLy8gQWRkIHN0YXR1cyBiYWRnZSB0byBoZWFkZXIgLSBvbmx5IE9ORSBiYWRnZSAoT09GIGhhcyBwcmlvcml0eSBvdmVyIFdvcmtMb2NhdGlvbikKICAgICAgICAvLyBXaGVuIE9PRiBpcyBhY3RpdmUsIE1pY3Jvc29mdCBkb2Vzbid0IHJldHVybiB3b3JrTG9jYXRpb24gYW55d2F5CiAgICAgICAgaWYgKERhdGEub3V0T2ZPZmZpY2UpIHsKICAgICAgICAgICAgLy8gT09GIGFjdGl2ZTogU2hvdyAiQWJ3ZXNlbmQiIGJhZGdlIHVzaW5nIFdvcmtMb2NhdGlvbiBzdHlsZQogICAgICAgICAgICB2YXIgJE9PRkJhZGdlID0gQ3JlYXRlV29ya0xvY2F0aW9uQmFkZ2UoeyB0eXBlOiAndGltZU9mZicgfSk7CiAgICAgICAgICAgICRIZWFkZXIuYXBwZW5kKCRPT0ZCYWRnZSk7CiAgICAgICAgfSBlbHNlIGlmIChEYXRhLnByZXNlbmNlICYmIERhdGEucHJlc2VuY2Uud29ya0xvY2F0aW9uICYmIERhdGEucHJlc2VuY2Uud29ya0xvY2F0aW9uLnR5cGUpIHsKICAgICAgICAgICAgdmFyICRXb3JrTG9jQmFkZ2UgPSBDcmVhdGVXb3JrTG9jYXRpb25CYWRnZShEYXRhLnByZXNlbmNlLndvcmtMb2NhdGlvbik7CiAgICAgICAgICAgICRIZWFkZXIuYXBwZW5kKCRXb3JrTG9jQmFkZ2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FsZW5kYXIgdG9nZ2xlIGJ1dHRvbiAob25seSBpZiBmcmVlQnVzeSBkYXRhIGF2YWlsYWJsZSkKICAgICAgICBpZiAoRGF0YS5mcmVlQnVzeSkgewogICAgICAgICAgICB2YXIgJFRvZ2dsZSA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX3RvZ2dsZScpCiAgICAgICAgICAgICAgICAuYXR0cigndHlwZScsICdidXR0b24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RvZ2dsZSBjYWxlbmRhcicpKQogICAgICAgICAgICAgICAgLmh0bWwoJzxpIGNsYXNzPSJmYSBmYS1jYXJldC11cCI+PC9pPicpOwogICAgICAgICAgICAkSGVhZGVyLmFwcGVuZCgkVG9nZ2xlKTsKICAgICAgICB9CgogICAgICAgICRQYW5lbC5hcHBlbmQoJEhlYWRlcik7CgogICAgICAgIC8vID09PSBXZWVrIENhbGVuZGFyIChjb2xsYXBzaWJsZSkgPT09CiAgICAgICAgaWYgKERhdGEuZnJlZUJ1c3kpIHsKICAgICAgICAgICAgdmFyICRDYWxlbmRhcldyYXBwZXIgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY2FsZW5kYXJXcmFwcGVyJyk7CiAgICAgICAgICAgIHZhciAkQ2FsZW5kYXIgPSBDcmVhdGVXZWVrQ2FsZW5kYXIoRGF0YS5mcmVlQnVzeSwgRGF0YS5lbWFpbCk7CiAgICAgICAgICAgICRDYWxlbmRhcldyYXBwZXIuYXBwZW5kKCRDYWxlbmRhcik7CiAgICAgICAgICAgICRQYW5lbC5hcHBlbmQoJENhbGVuZGFyV3JhcHBlcik7CgogICAgICAgICAgICAvLyBUb2dnbGUgaGFuZGxlciAtIHJvdGF0ZXMgYXJyb3cgdmlhIENTUyBjbGFzcwogICAgICAgICAgICAkUGFuZWwuZmluZCgnLkNvbGxhYk93bmVySW5mb1BhbmVsX190b2dnbGUnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJEJ0biA9ICQodGhpcyk7CiAgICAgICAgICAgICAgICB2YXIgJFdyYXBwZXIgPSAkUGFuZWwuZmluZCgnLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxlbmRhcldyYXBwZXInKTsKICAgICAgICAgICAgICAgICRXcmFwcGVyLnRvZ2dsZUNsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY2FsZW5kYXJXcmFwcGVyLS1jb2xsYXBzZWQnKTsKICAgICAgICAgICAgICAgICRCdG4udG9nZ2xlQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX190b2dnbGUtLWNvbGxhcHNlZCcpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgICRDb250YWluZXIuZW1wdHkoKS5hcHBlbmQoJFBhbmVsKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIFdvcmsgTG9jYXRpb24gYmFkZ2UgKG9mZmljZS9yZW1vdGUvdGltZU9mZikKICAgICAqLwogICAgZnVuY3Rpb24gQ3JlYXRlV29ya0xvY2F0aW9uQmFkZ2UoV29ya0xvY2F0aW9uKSB7CiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkxhYmVscyA9IHsKICAgICAgICAgICAgJ29mZmljZSc6ICdPZmZpY2UnLAogICAgICAgICAgICAncmVtb3RlJzogJ1JlbW90ZScsCiAgICAgICAgICAgICd0aW1lT2ZmJzogJ1RpbWUgb2ZmJwogICAgICAgIH07CiAgICAgICAgdmFyIFdvcmtMb2NhdGlvbkljb25zID0gewogICAgICAgICAgICAnb2ZmaWNlJzogJ2ZhLWJ1aWxkaW5nJywKICAgICAgICAgICAgJ3JlbW90ZSc6ICdmYS1ob21lJywKICAgICAgICAgICAgJ3RpbWVPZmYnOiAnZmEtc2lnbi1vdXQnCiAgICAgICAgfTsKCiAgICAgICAgdmFyIExvY2F0aW9uVHlwZSA9IFdvcmtMb2NhdGlvbi50eXBlIHx8IFdvcmtMb2NhdGlvbjsKICAgICAgICB2YXIgTG9jYXRpb25MYWJlbCA9IFdvcmtMb2NhdGlvbkxhYmVsc1tMb2NhdGlvblR5cGVdIHx8IExvY2F0aW9uVHlwZTsKICAgICAgICB2YXIgTG9jYXRpb25JY29uID0gV29ya0xvY2F0aW9uSWNvbnNbTG9jYXRpb25UeXBlXSB8fCAnZmEtbWFwLW1hcmtlcic7CgogICAgICAgIHZhciAkQmFkZ2UgPSAkKCc8c3Bhbj4nKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0NvbGxhYldvcmtMb2NhdGlvbiBDb2xsYWJXb3JrTG9jYXRpb24tLScgKyBMb2NhdGlvblR5cGUpCiAgICAgICAgICAgIC5hcHBlbmQoJCgnPGk+JykuYWRkQ2xhc3MoJ2ZhICcgKyBMb2NhdGlvbkljb24pKQogICAgICAgICAgICAuYXBwZW5kKCcgJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKExvY2F0aW9uTGFiZWwpKTsKCiAgICAgICAgcmV0dXJuICRCYWRnZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGRldGFpbGVkIHdlZWsgY2FsZW5kYXIgdmlldyB3aXRoIGhhbGYtaG91cmx5IGRpc3BsYXkgKDQ4IGJsb2NrcyBwZXIgZGF5KQogICAgICogICAgICAgICAgICAgIEZlYXR1cmVzOiBTY3JvbGxhYmxlIHRpbWVsaW5lLCBzdGlja3kgZGF5IGxhYmVscywgYXV0by1zY3JvbGwgdG8gN2FtCiAgICAgKi8KICAgIGZ1bmN0aW9uIENyZWF0ZVdlZWtDYWxlbmRhcihGcmVlQnVzeSwgRW1haWwsIFdlZWtPZmZzZXQpIHsKICAgICAgICB2YXIgJENhbGVuZGFyID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbGVuZGFyJyk7CgogICAgICAgIC8vIFN0b3JlIHdlZWsgb2Zmc2V0IHBlciBjYWxlbmRhciAoc3VwcG9ydHMgbXVsdGlwbGUgY2FsZW5kYXJzIG9uIHNhbWUgcGFnZSkKICAgICAgICAvLyBVc2UgcHJvdmlkZWQgV2Vla09mZnNldCBvciBkZWZhdWx0IHRvIDAKICAgICAgICBXZWVrT2Zmc2V0ID0gV2Vla09mZnNldCB8fCAwOwogICAgICAgICRDYWxlbmRhci5kYXRhKCd3ZWVrT2Zmc2V0JywgV2Vla09mZnNldCk7CgogICAgICAgIC8vIEhlYWRlciB3aXRoIG5hdmlnYXRpb24KICAgICAgICB2YXIgJENhbEhlYWRlciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19jYWxIZWFkZXInKTsKICAgICAgICB2YXIgJFByZXZCdG4gPSAkKCc8YnV0dG9uPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbE5hdicpCiAgICAgICAgICAgIC5hdHRyKCd0eXBlJywgJ2J1dHRvbicpCiAgICAgICAgICAgIC5hdHRyKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdQcmV2aW91cyB3ZWVrJykpCiAgICAgICAgICAgIC5odG1sKCc8aSBjbGFzcz0iZmEgZmEtY2hldnJvbi1sZWZ0Ij48L2k+Jyk7CgogICAgICAgIC8vIERpc2FibGUgcHJldmlvdXMgYnV0dG9uIGlmIG9uIGN1cnJlbnQgd2VlayAoZG9uJ3QgYWxsb3cgbmF2aWdhdGluZyB0byBwYXN0KQogICAgICAgIGlmIChXZWVrT2Zmc2V0IDw9IDApIHsKICAgICAgICAgICAgJFByZXZCdG4ucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIHZhciAkTmV4dEJ0biA9ICQoJzxidXR0b24+JykKICAgICAgICAgICAgLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fY2FsTmF2JykKICAgICAgICAgICAgLmF0dHIoJ3R5cGUnLCAnYnV0dG9uJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05leHQgd2VlaycpKQogICAgICAgICAgICAuaHRtbCgnPGkgY2xhc3M9ImZhIGZhLWNoZXZyb24tcmlnaHQiPjwvaT4nKTsKICAgICAgICB2YXIgJFdlZWtMYWJlbCA9ICQoJzxzcGFuPicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbExhYmVsJykKICAgICAgICAgICAgLnRleHQoRm9ybWF0V2Vla0xhYmVsKEZyZWVCdXN5LndlZWtTdGFydCwgRnJlZUJ1c3kud2Vla0VuZCkpOwoKICAgICAgICAkQ2FsSGVhZGVyLmFwcGVuZCgkUHJldkJ0biwgJFdlZWtMYWJlbCwgJE5leHRCdG4pOwogICAgICAgICRDYWxlbmRhci5hcHBlbmQoJENhbEhlYWRlcik7CgogICAgICAgIC8vIE1haW4gY2FsZW5kYXIgYm9keSB3aXRoIHN0aWNreSBkYXkgbGFiZWxzIGFuZCBzY3JvbGxhYmxlIHRpbWVsaW5lCiAgICAgICAgdmFyICRDYWxCb2R5ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2NhbEJvZHknKTsKCiAgICAgICAgLy8gRGF5IGxhYmVscyBjb2x1bW4gKHN0aWNreSBsZWZ0IHNpZGUpCiAgICAgICAgdmFyICREYXlMYWJlbHNDb2wgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWxzQ29sJyk7CiAgICAgICAgLy8gRW1wdHkgY2VsbCBmb3IgaG91ciBsYWJlbHMgcm93IGFsaWdubWVudAogICAgICAgICREYXlMYWJlbHNDb2wuYXBwZW5kKCQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbEhlYWRlcicpKTsKCiAgICAgICAgdmFyIFRvZGF5ID0gbmV3IERhdGUoKTsKICAgICAgICBUb2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTsKCiAgICAgICAgLy8gSW5uZXIgY29udGFpbmVyIGZvciBkYXkgbGFiZWxzIHdpdGggZ2FwCiAgICAgICAgdmFyICREYXlMYWJlbHNJbm5lciA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbHNJbm5lcicpOwoKICAgICAgICAvLyBDcmVhdGUgZGF5IGxhYmVscwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNzsgaSsrKSB7CiAgICAgICAgICAgIHZhciBEYXlEYXRlID0gbmV3IERhdGUoRnJlZUJ1c3kud2Vla1N0YXJ0KTsKICAgICAgICAgICAgRGF5RGF0ZS5zZXREYXRlKEZyZWVCdXN5LndlZWtTdGFydC5nZXREYXRlKCkgKyBpKTsKICAgICAgICAgICAgdmFyIElzVG9kYXkgPSBJc1NhbWVEYXkoRGF5RGF0ZSwgVG9kYXkpOwogICAgICAgICAgICB2YXIgSXNXZWVrZW5kID0gKGkgPj0gNSk7CgogICAgICAgICAgICB2YXIgJERheUxhYmVsID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsJyk7CiAgICAgICAgICAgIGlmIChJc1RvZGF5KSB7CiAgICAgICAgICAgICAgICAkRGF5TGFiZWwuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0tdG9kYXknKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoSXNXZWVrZW5kKSB7CiAgICAgICAgICAgICAgICAkRGF5TGFiZWwuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0td2Vla2VuZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICREYXlMYWJlbC5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlOYW1lJykudGV4dChEYXlOYW1lc1tpXSkpOwogICAgICAgICAgICB2YXIgZGF5TnVtID0gRGF5RGF0ZS5nZXREYXRlKCk7CiAgICAgICAgICAgICREYXlMYWJlbC5hcHBlbmQoJCgnPHNwYW4+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlOdW0nKS50ZXh0KGRheU51bSA8IDEwID8gJzAnICsgZGF5TnVtIDogZGF5TnVtKSk7CiAgICAgICAgICAgICREYXlMYWJlbHNJbm5lci5hcHBlbmQoJERheUxhYmVsKTsKICAgICAgICB9CiAgICAgICAgJERheUxhYmVsc0NvbC5hcHBlbmQoJERheUxhYmVsc0lubmVyKTsKICAgICAgICAkQ2FsQm9keS5hcHBlbmQoJERheUxhYmVsc0NvbCk7CgogICAgICAgIC8vIFNjcm9sbGFibGUgdGltZWxpbmUgYXJlYQogICAgICAgIHZhciAkVGltZWxpbmVTY3JvbGwgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fdGltZWxpbmVTY3JvbGwnKTsKCiAgICAgICAgLy8gSG91ciBsYWJlbHMgcm93ICg0OCBoYWxmLWhvdXIgc2xvdHMpCiAgICAgICAgdmFyICRIb3VyTGFiZWxzID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJMYWJlbHNSb3cnKTsKICAgICAgICBmb3IgKHZhciBzbG90ID0gMDsgc2xvdCA8IDQ4OyBzbG90KyspIHsKICAgICAgICAgICAgdmFyICRIb3VyTGFiZWwgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsJyk7CiAgICAgICAgICAgIC8vIEFkZCBib3JkZXIgY2xhc3MgYXQgZnVsbCBob3VycyAoZXZlcnkgMiBzbG90cykgdG8gYWxpZ24gd2l0aCBibG9ja3MKICAgICAgICAgICAgaWYgKHNsb3QgJSAyID09PSAwKSB7CiAgICAgICAgICAgICAgICAkSG91ckxhYmVsLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsLS1ob3VyU3RhcnQnKTsKICAgICAgICAgICAgICAgIHZhciBob3VyID0gc2xvdCAvIDI7CiAgICAgICAgICAgICAgICAkSG91ckxhYmVsLnRleHQoaG91ciA8IDEwID8gJzAnICsgaG91ciA6IGhvdXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRIb3VyTGFiZWxzLmFwcGVuZCgkSG91ckxhYmVsKTsKICAgICAgICB9CiAgICAgICAgJFRpbWVsaW5lU2Nyb2xsLmFwcGVuZCgkSG91ckxhYmVscyk7CgogICAgICAgIC8vIFdlZWsgZ3JpZCAtIG9uZSByb3cgcGVyIGRheQogICAgICAgIHZhciAkR3JpZCA9ICQoJzxkaXY+JykuYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19kYXlzR3JpZCcpOwoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDc7IGkrKykgewogICAgICAgICAgICB2YXIgRGF5RGF0ZSA9IG5ldyBEYXRlKEZyZWVCdXN5LndlZWtTdGFydCk7CiAgICAgICAgICAgIERheURhdGUuc2V0RGF0ZShGcmVlQnVzeS53ZWVrU3RhcnQuZ2V0RGF0ZSgpICsgaSk7CiAgICAgICAgICAgIHZhciBJc1dlZWtlbmQgPSAoaSA+PSA1KTsKCiAgICAgICAgICAgIHZhciAkUm93ID0gJCgnPGRpdj4nKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdycpOwogICAgICAgICAgICBpZiAoSXNXZWVrZW5kKSB7CiAgICAgICAgICAgICAgICAkUm93LmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93LS13ZWVrZW5kJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIDQ4IGhhbGYtaG91ciBibG9ja3MKICAgICAgICAgICAgdmFyIERheUJ1c3kgPSBHZXRCdXN5QmxvY2tzRm9yRGF5KEZyZWVCdXN5LmJ1c3lQZXJpb2RzLCBEYXlEYXRlKTsKICAgICAgICAgICAgdmFyIEhhbGZIb3VybHlCdXN5ID0gR2V0SGFsZkhvdXJseUJ1c3lTdGF0dXMoRGF5QnVzeSwgRGF5RGF0ZSk7CgogICAgICAgICAgICBmb3IgKHZhciBzbG90ID0gMDsgc2xvdCA8IDQ4OyBzbG90KyspIHsKICAgICAgICAgICAgICAgIHZhciBob3VyID0gTWF0aC5mbG9vcihzbG90IC8gMik7CiAgICAgICAgICAgICAgICB2YXIgaXNGaXJzdEhhbGYgPSAoc2xvdCAlIDIgPT09IDApOwogICAgICAgICAgICAgICAgdmFyICRIb3VyQmxvY2sgPSAkKCc8ZGl2PicpLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrJyk7CgogICAgICAgICAgICAgICAgLy8gTWFyayB3b3JrIGhvdXJzICg4LTE4KQogICAgICAgICAgICAgICAgaWYgKGhvdXIgPj0gOCAmJiBob3VyIDwgMTgpIHsKICAgICAgICAgICAgICAgICAgICAkSG91ckJsb2NrLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS13b3JrSG91cnMnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBBZGQgaG91ciBzZXBhcmF0b3IgY2xhc3MgZm9yIGZpcnN0IGhhbGYgb2YgZWFjaCBob3VyCiAgICAgICAgICAgICAgICBpZiAoaXNGaXJzdEhhbGYpIHsKICAgICAgICAgICAgICAgICAgICAkSG91ckJsb2NrLmFkZENsYXNzKCdDb2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS1ob3VyU3RhcnQnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgdGltZUxhYmVsID0gaG91ciArICc6JyArIChpc0ZpcnN0SGFsZiA/ICcwMCcgOiAnMzAnKTsKICAgICAgICAgICAgICAgIGlmIChIYWxmSG91cmx5QnVzeVtzbG90XSkgewogICAgICAgICAgICAgICAgICAgICRIb3VyQmxvY2suYWRkQ2xhc3MoJ0NvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2stLWJ1c3knKTsKICAgICAgICAgICAgICAgICAgICAkSG91ckJsb2NrLmF0dHIoJ3RpdGxlJywgdGltZUxhYmVsICsgJyAtICcgKyBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQnVzeScpKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEhvdXJCbG9jay5hdHRyKCd0aXRsZScsIHRpbWVMYWJlbCArICcgLSAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyZWUnKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkUm93LmFwcGVuZCgkSG91ckJsb2NrKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdyaWQuYXBwZW5kKCRSb3cpOwogICAgICAgIH0KCiAgICAgICAgJFRpbWVsaW5lU2Nyb2xsLmFwcGVuZCgkR3JpZCk7CiAgICAgICAgJENhbEJvZHkuYXBwZW5kKCRUaW1lbGluZVNjcm9sbCk7CiAgICAgICAgJENhbGVuZGFyLmFwcGVuZCgkQ2FsQm9keSk7CgogICAgICAgIC8vIEF1dG8tc2Nyb2xsIHRvIDdhbSBhZnRlciByZW5kZXJpbmcgKHNsb3QgMTQgPSA3OjAwKQogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgQmxvY2tXaWR0aCA9IDE0OyAvLyBXaWR0aCBvZiBlYWNoIGhhbGYtaG91ciBibG9jayBpbiBweAogICAgICAgICAgICB2YXIgU2Nyb2xsVG8gPSAxNCAqIEJsb2NrV2lkdGg7IC8vIDdhbSA9IHNsb3QgMTQKICAgICAgICAgICAgJFRpbWVsaW5lU2Nyb2xsLnNjcm9sbExlZnQoU2Nyb2xsVG8pOwogICAgICAgIH0sIDUwKTsKCiAgICAgICAgLy8gTmF2aWdhdGlvbiBoYW5kbGVycyAodXNlIHBlci1jYWxlbmRhciB3ZWVrT2Zmc2V0KQogICAgICAgICRQcmV2QnRuLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFdlZWtPZmZzZXQgPSAkQ2FsZW5kYXIuZGF0YSgnd2Vla09mZnNldCcpIHx8IDA7CiAgICAgICAgICAgIGlmIChXZWVrT2Zmc2V0ID4gMCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyLmRhdGEoJ3dlZWtPZmZzZXQnLCBXZWVrT2Zmc2V0IC0gMSk7CiAgICAgICAgICAgICAgICBOYXZpZ2F0ZVdlZWsoRW1haWwsICRDYWxlbmRhcik7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJE5leHRCdG4ub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgV2Vla09mZnNldCA9ICRDYWxlbmRhci5kYXRhKCd3ZWVrT2Zmc2V0JykgfHwgMDsKICAgICAgICAgICAgJENhbGVuZGFyLmRhdGEoJ3dlZWtPZmZzZXQnLCBXZWVrT2Zmc2V0ICsgMSk7CiAgICAgICAgICAgIE5hdmlnYXRlV2VlayhFbWFpbCwgJENhbGVuZGFyKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuICRDYWxlbmRhcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGJ1c3kgc3RhdHVzIGZvciBlYWNoIGhhbGYtaG91ciBzbG90IG9mIGEgZGF5ICgwLTQ3KQogICAgICogICAgICAgICAgICAgIFNsb3QgMCA9IDAwOjAwLTAwOjMwLCBTbG90IDEgPSAwMDozMC0wMTowMCwgZXRjLgogICAgICovCiAgICBmdW5jdGlvbiBHZXRIYWxmSG91cmx5QnVzeVN0YXR1cyhCdXN5UGVyaW9kcywgRGF5RGF0ZSkgewogICAgICAgIHZhciBIYWxmSG91cmx5U3RhdHVzID0gW107CiAgICAgICAgZm9yICh2YXIgcyA9IDA7IHMgPCA0ODsgcysrKSB7CiAgICAgICAgICAgIEhhbGZIb3VybHlTdGF0dXNbc10gPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIEJ1c3lQZXJpb2RzLmZvckVhY2goZnVuY3Rpb24gKFBlcmlvZCkgewogICAgICAgICAgICB2YXIgU3RhcnQgPSBuZXcgRGF0ZShQZXJpb2Quc3RhcnQpOwogICAgICAgICAgICB2YXIgRW5kID0gbmV3IERhdGUoUGVyaW9kLmVuZCk7CgogICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIG92ZXJsYXAgd2l0aCB0aGlzIGRheQogICAgICAgICAgICB2YXIgRGF5U3RhcnQgPSBuZXcgRGF0ZShEYXlEYXRlKTsKICAgICAgICAgICAgRGF5U3RhcnQuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgICAgICAgIHZhciBEYXlFbmQgPSBuZXcgRGF0ZShEYXlEYXRlKTsKICAgICAgICAgICAgRGF5RW5kLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CgogICAgICAgICAgICAvLyBHZXQgZWZmZWN0aXZlIHN0YXJ0L2VuZCB3aXRoaW4gdGhpcyBkYXkKICAgICAgICAgICAgdmFyIEVmZmVjdGl2ZVN0YXJ0ID0gU3RhcnQgPCBEYXlTdGFydCA/IERheVN0YXJ0IDogU3RhcnQ7CiAgICAgICAgICAgIHZhciBFZmZlY3RpdmVFbmQgPSBFbmQgPiBEYXlFbmQgPyBEYXlFbmQgOiBFbmQ7CgogICAgICAgICAgICBpZiAoRWZmZWN0aXZlU3RhcnQgPD0gRWZmZWN0aXZlRW5kKSB7CiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIGhhbGYtaG91ciBzbG90cwogICAgICAgICAgICAgICAgdmFyIFN0YXJ0U2xvdCA9IEVmZmVjdGl2ZVN0YXJ0LmdldEhvdXJzKCkgKiAyICsgKEVmZmVjdGl2ZVN0YXJ0LmdldE1pbnV0ZXMoKSA+PSAzMCA/IDEgOiAwKTsKICAgICAgICAgICAgICAgIHZhciBFbmRTbG90ID0gRWZmZWN0aXZlRW5kLmdldEhvdXJzKCkgKiAyICsgKEVmZmVjdGl2ZUVuZC5nZXRNaW51dGVzKCkgPiAzMCA/IDEgOiAwKTsKCiAgICAgICAgICAgICAgICAvLyBJZiBlbmQgaXMgZXhhY3RseSBvbiBhIGhhbGYtaG91ciBib3VuZGFyeSwgZG9uJ3QgbWFyayB0aGF0IHNsb3QKICAgICAgICAgICAgICAgIGlmIChFZmZlY3RpdmVFbmQuZ2V0TWludXRlcygpID09PSAwICYmIEVmZmVjdGl2ZUVuZC5nZXRTZWNvbmRzKCkgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBFbmRTbG90ID0gTWF0aC5tYXgoMCwgRW5kU2xvdCAtIDEpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFZmZlY3RpdmVFbmQuZ2V0TWludXRlcygpID09PSAzMCAmJiBFZmZlY3RpdmVFbmQuZ2V0U2Vjb25kcygpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgRW5kU2xvdCA9IE1hdGgubWF4KDAsIEVuZFNsb3QgLSAxKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBNYXJrIGhhbGYtaG91ciBzbG90cyBhcyBidXN5CiAgICAgICAgICAgICAgICBmb3IgKHZhciBzID0gU3RhcnRTbG90OyBzIDw9IEVuZFNsb3QgJiYgcyA8IDQ4OyBzKyspIHsKICAgICAgICAgICAgICAgICAgICBIYWxmSG91cmx5U3RhdHVzW3NdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gSGFsZkhvdXJseVN0YXR1czsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gTmF2aWdhdGUgdG8gZGlmZmVyZW50IHdlZWsKICAgICAqLwogICAgZnVuY3Rpb24gTmF2aWdhdGVXZWVrKEVtYWlsLCAkQ2FsZW5kYXIpIHsKICAgICAgICAvLyBHZXQgd2VlayBvZmZzZXQgZnJvbSB0aGlzIHNwZWNpZmljIGNhbGVuZGFyCiAgICAgICAgdmFyIFdlZWtPZmZzZXQgPSAkQ2FsZW5kYXIuZGF0YSgnd2Vla09mZnNldCcpIHx8IDA7CgogICAgICAgIC8vIFNob3cgbG9hZGluZyBzdGF0ZSBvbiBncmlkCiAgICAgICAgJENhbGVuZGFyLmZpbmQoJy5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5c0dyaWQnKS5hZGRDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nJyk7CgogICAgICAgIC8vIEZldGNoIG5ldyBkYXRhCiAgICAgICAgTG9hZFdlZWtGcmVlQnVzeShFbWFpbCwgV2Vla09mZnNldCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKEZyZWVCdXN5KSB7CiAgICAgICAgICAgICAgICBpZiAoIUZyZWVCdXN5KSB7CiAgICAgICAgICAgICAgICAgICAgJENhbGVuZGFyLmZpbmQoJy5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5c0dyaWQnKS5yZW1vdmVDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlLXJlbmRlciBjYWxlbmRhciB3aXRoIGNvcnJlY3Qgd2VlayBvZmZzZXQKICAgICAgICAgICAgICAgIHZhciAkTmV3Q2FsZW5kYXIgPSBDcmVhdGVXZWVrQ2FsZW5kYXIoRnJlZUJ1c3ksIEVtYWlsLCBXZWVrT2Zmc2V0KTsKICAgICAgICAgICAgICAgICRDYWxlbmRhci5yZXBsYWNlV2l0aCgkTmV3Q2FsZW5kYXIpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyLmZpbmQoJy5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5c0dyaWQnKS5yZW1vdmVDbGFzcygnQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheXNHcmlkLS1sb2FkaW5nJyk7CiAgICAgICAgICAgIH0pOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gSGVscGVyIEZ1bmN0aW9ucwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFN0cmlwIEhUTUwgdGFncyBmcm9tIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiBTdHJpcEhUTUwoSFRNTCkgewogICAgICAgIHZhciBUZW1wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgVGVtcC5pbm5lckhUTUwgPSBIVE1MOwogICAgICAgIHJldHVybiBUZW1wLnRleHRDb250ZW50IHx8IFRlbXAuaW5uZXJUZXh0IHx8ICcnOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBGb3JtYXQgZGF0ZSBhcyBERC5NTS5ZWVlZCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZvcm1hdERhdGUoRGF0ZU9iaikgewogICAgICAgIHZhciBEYXkgPSBTdHJpbmcoRGF0ZU9iai5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIE1vbnRoID0gU3RyaW5nKERhdGVPYmouZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7CiAgICAgICAgdmFyIFllYXIgPSBEYXRlT2JqLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgcmV0dXJuIERheSArICcuJyArIE1vbnRoICsgJy4nICsgWWVhcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gRm9ybWF0IHdlZWsgbGFiZWwgKERELk1NLiAtIERELk1NLllZWVkgfCBLVyBYWCkKICAgICAqLwogICAgZnVuY3Rpb24gRm9ybWF0V2Vla0xhYmVsKFN0YXJ0LCBFbmQpIHsKICAgICAgICB2YXIgU3RhcnREYXkgPSBTdHJpbmcoU3RhcnQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBTdGFydE1vbnRoID0gU3RyaW5nKFN0YXJ0LmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBFbmREYXkgPSBTdHJpbmcoRW5kLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTsKICAgICAgICB2YXIgRW5kTW9udGggPSBTdHJpbmcoRW5kLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpOwogICAgICAgIHZhciBFbmRZZWFyID0gRW5kLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgdmFyIFdlZWtOdW1iZXIgPSBHZXRJU09XZWVrTnVtYmVyKFN0YXJ0KTsKICAgICAgICByZXR1cm4gU3RhcnREYXkgKyAnLicgKyBTdGFydE1vbnRoICsgJy4gLSAnICsgRW5kRGF5ICsgJy4nICsgRW5kTW9udGggKyAnLicgKyBFbmRZZWFyICsgJyB8IEtXICcgKyBXZWVrTnVtYmVyOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgSVNPIHdlZWsgbnVtYmVyIGZvciBhIGRhdGUKICAgICAqLwogICAgZnVuY3Rpb24gR2V0SVNPV2Vla051bWJlcihEYXRlT2JqKSB7CiAgICAgICAgdmFyIFRlbXBEYXRlID0gbmV3IERhdGUoRGF0ZU9iai5nZXRUaW1lKCkpOwogICAgICAgIFRlbXBEYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICAgIC8vIFRodXJzZGF5IGluIGN1cnJlbnQgd2VlayBkZWNpZGVzIHRoZSB5ZWFyCiAgICAgICAgVGVtcERhdGUuc2V0RGF0ZShUZW1wRGF0ZS5nZXREYXRlKCkgKyAzIC0gKFRlbXBEYXRlLmdldERheSgpICsgNikgJSA3KTsKICAgICAgICAvLyBKYW51YXJ5IDQgaXMgYWx3YXlzIGluIHdlZWsgMQogICAgICAgIHZhciBXZWVrMSA9IG5ldyBEYXRlKFRlbXBEYXRlLmdldEZ1bGxZZWFyKCksIDAsIDQpOwogICAgICAgIC8vIEFkanVzdCB0byBUaHVyc2RheSBpbiB3ZWVrIDEgYW5kIGNvdW50IG51bWJlciBvZiB3ZWVrcyBmcm9tIGRhdGUgdG8gd2VlazEKICAgICAgICByZXR1cm4gMSArIE1hdGgucm91bmQoKChUZW1wRGF0ZS5nZXRUaW1lKCkgLSBXZWVrMS5nZXRUaW1lKCkpIC8gODY0MDAwMDAgLSAzICsgKFdlZWsxLmdldERheSgpICsgNikgJSA3KSAvIDcpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiB0d28gZGF0ZXMgYXJlIHRoZSBzYW1lIGRheQogICAgICovCiAgICBmdW5jdGlvbiBJc1NhbWVEYXkoRGF0ZTEsIERhdGUyKSB7CiAgICAgICAgcmV0dXJuIERhdGUxLmdldEZ1bGxZZWFyKCkgPT09IERhdGUyLmdldEZ1bGxZZWFyKCkgJiYKICAgICAgICAgICAgICAgRGF0ZTEuZ2V0TW9udGgoKSA9PT0gRGF0ZTIuZ2V0TW9udGgoKSAmJgogICAgICAgICAgICAgICBEYXRlMS5nZXREYXRlKCkgPT09IERhdGUyLmdldERhdGUoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGJ1c3kgYmxvY2tzIHRoYXQgb3ZlcmxhcCB3aXRoIGEgc3BlY2lmaWMgZGF5CiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldEJ1c3lCbG9ja3NGb3JEYXkoQnVzeVBlcmlvZHMsIERheURhdGUpIHsKICAgICAgICB2YXIgRGF5U3RhcnQgPSBuZXcgRGF0ZShEYXlEYXRlKTsKICAgICAgICBEYXlTdGFydC5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgICB2YXIgRGF5RW5kID0gbmV3IERhdGUoRGF5RGF0ZSk7CiAgICAgICAgRGF5RW5kLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSk7CgogICAgICAgIHJldHVybiBCdXN5UGVyaW9kcy5maWx0ZXIoZnVuY3Rpb24gKFBlcmlvZCkgewogICAgICAgICAgICB2YXIgU3RhcnQgPSBuZXcgRGF0ZShQZXJpb2Quc3RhcnQpOwogICAgICAgICAgICB2YXIgRW5kID0gbmV3IERhdGUoUGVyaW9kLmVuZCk7CiAgICAgICAgICAgIHJldHVybiBTdGFydCA8IERheUVuZCAmJiBFbmQgPiBEYXlTdGFydDsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ2F0ZWdvcml6ZSBidXN5IHBlcmlvZHMgaW50byBtb3JuaW5nL2FmdGVybm9vbi9ldmVuaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhdGVnb3JpemVCdXN5UGVyaW9kcyhCdXN5UGVyaW9kcywgRGF5RGF0ZSkgewogICAgICAgIHZhciBSZXN1bHQgPSB7IG1vcm5pbmc6IGZhbHNlLCBhZnRlcm5vb246IGZhbHNlLCBldmVuaW5nOiBmYWxzZSB9OwoKICAgICAgICBCdXN5UGVyaW9kcy5mb3JFYWNoKGZ1bmN0aW9uIChQZXJpb2QpIHsKICAgICAgICAgICAgdmFyIFN0YXJ0ID0gbmV3IERhdGUoUGVyaW9kLnN0YXJ0KTsKICAgICAgICAgICAgdmFyIEVuZCA9IG5ldyBEYXRlKFBlcmlvZC5lbmQpOwoKICAgICAgICAgICAgLy8gR2V0IGhvdXJzIGluIHRoZSBjb250ZXh0IG9mIHRoZSBkYXkKICAgICAgICAgICAgdmFyIERheVN0YXJ0ID0gbmV3IERhdGUoRGF5RGF0ZSk7CiAgICAgICAgICAgIERheVN0YXJ0LnNldEhvdXJzKDAsIDAsIDAsIDApOwoKICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGVmZmVjdGl2ZSBzdGFydC9lbmQgaG91cnMgZm9yIHRoaXMgZGF5CiAgICAgICAgICAgIHZhciBFZmZlY3RpdmVTdGFydCA9IFN0YXJ0IDwgRGF5U3RhcnQgPyAwIDogU3RhcnQuZ2V0SG91cnMoKTsKICAgICAgICAgICAgdmFyIEVmZmVjdGl2ZUVuZCA9IEVuZC5nZXRIb3VycygpIHx8IDI0OwoKICAgICAgICAgICAgLy8gTW9ybmluZzogNi0xMiwgQWZ0ZXJub29uOiAxMi0xOCwgRXZlbmluZzogMTgtMjIKICAgICAgICAgICAgaWYgKEVmZmVjdGl2ZVN0YXJ0IDwgMTIgJiYgRWZmZWN0aXZlRW5kID4gNikgewogICAgICAgICAgICAgICAgUmVzdWx0Lm1vcm5pbmcgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChFZmZlY3RpdmVTdGFydCA8IDE4ICYmIEVmZmVjdGl2ZUVuZCA+IDEyKSB7CiAgICAgICAgICAgICAgICBSZXN1bHQuYWZ0ZXJub29uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoRWZmZWN0aXZlU3RhcnQgPCAyMiAmJiBFZmZlY3RpdmVFbmQgPiAxOCkgewogICAgICAgICAgICAgICAgUmVzdWx0LmV2ZW5pbmcgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBSZXN1bHQ7CiAgICB9CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Pd25lckluZm9QYW5lbCB8fCB7fSkpOwo=</File>

        <!-- JavaScript - Providers -->
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.Provider.Mock.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlcgogKiBAZGVzY3JpcHRpb24KICogICAgICBNb2NrIFByb3ZpZGVyIGZvciBDb2xsYWJvcmF0aW9uIEFkZC1vbgogKgogKiAgICAgIFRoaXMgcHJvdmlkZXIgcmV0dXJucyBzdGF0aWMgdGVzdCBkYXRhIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZy4KICogICAgICBJdCBzaW11bGF0ZXMgQVBJIGxhdGVuY3kgYW5kIHZhcmlvdXMgdXNlciBzdGF0ZXMuCiAqCiAqICAgICAgRmVhdHVyZXM6CiAqICAgICAgLSBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZAogKiAgICAgIC0gQ29uZmlndXJhYmxlIGRlbGF5IHRvIHNpbXVsYXRlIG5ldHdvcmsgbGF0ZW5jeQogKiAgICAgIC0gVmFyaW91cyB0ZXN0IHVzZXJzIHdpdGggZGlmZmVyZW50IHN0YXRlcwogKiAgICAgIC0gUmFuZG9tIHByZXNlbmNlIGNoYW5nZXMgZm9yIHRlc3RpbmcKICovCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBDb25maWd1cmF0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gU2ltdWxhdGVkIG5ldHdvcmsgZGVsYXkgaW4gbWlsbGlzZWNvbmRzCiAgICAgKi8KICAgIHZhciBTaW11bGF0ZWREZWxheSA9IDIwMDsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciB1c2VyIGlzICJsb2dnZWQgaW4iCiAgICAgKi8KICAgIHZhciBMb2dnZWRJbiA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IG1vY2sgdXNlcgogICAgICovCiAgICB2YXIgQ3VycmVudFVzZXIgPSBudWxsOwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gVGVzdCBEYXRhIChmYWxsYmFjayAtIG92ZXJ3cml0dGVuIGJ5IGNvbmZpZyBpZiBhdmFpbGFibGUpCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hldGhlciBleHRlcm5hbCBjb25maWcgaGFzIGJlZW4gbG9hZGVkCiAgICAgKi8KICAgIHZhciBDb25maWdMb2FkZWQgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gUHJvbWlzZSBmb3IgY29uZmlnIGxvYWRpbmcgKHRvIHByZXZlbnQgZHVwbGljYXRlIGxvYWRzKQogICAgICovCiAgICB2YXIgQ29uZmlnTG9hZFByb21pc2UgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNb2NrIHVzZXJzIGRhdGFiYXNlIC0gbG9hZGVkIGZyb20gZXh0ZXJuYWwgY29uZmlnIChkZXYtZW52aXJvbm1lbnQuanNvbikKICAgICAqICAgICAgICAgICAgICBObyBoYXJkY29kZWQgZmFsbGJhY2sgZGF0YSAtIGNvbmZpZyBtdXN0IGJlIGF2YWlsYWJsZQogICAgICovCiAgICB2YXIgTW9ja1VzZXJzID0ge307CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm92aWRlciBDYXBhYmlsaXRpZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHB1YmxpYwogICAgICogQGRlc2NyaXB0aW9uIENhcGFiaWxpdGllcyB0aGlzIHByb3ZpZGVyIHN1cHBvcnRzCiAgICAgKi8KICAgIFRhcmdldE5TLmNhcGFiaWxpdGllcyA9IHsKICAgICAgICBhdmF0YXI6IHRydWUsCiAgICAgICAgcHJlc2VuY2U6IHRydWUsCiAgICAgICAgcHJvZmlsZTogdHJ1ZSwKICAgICAgICBjaGF0OiB0cnVlLAogICAgICAgIGNhbGw6IHRydWUsCiAgICAgICAgZnJlZUJ1c3k6IHRydWUsCiAgICAgICAgY3JlYXRlTWVldGluZzogdHJ1ZSwKICAgICAgICBjcmVhdGVDYWxlbmRhckV2ZW50OiB0cnVlLAogICAgICAgIGRlbGV0ZUNhbGVuZGFyRXZlbnQ6IHRydWUsCiAgICAgICAgb3V0T2ZPZmZpY2U6IGZhbHNlICAvLyBEZXByZWNhdGVkIC0gdXNlIHByZXNlbmNlLmFjdGl2aXR5ID09PSAnT3V0T2ZPZmZpY2UnIGluc3RlYWQKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRMb2dpbkluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGxvZ2luIFVJIG1ldGFkYXRhIGZvciB0aGlzIHByb3ZpZGVyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMb2dpbiBpbmZvIHtsYWJlbCwgaWNvbiwgcmVxdWlyZXNFeHBsaWNpdExvZ2lufQogICAgICovCiAgICBUYXJnZXROUy5nZXRMb2dpbkluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbGFiZWw6ICdNb2NrIFByb3ZpZGVyJywKICAgICAgICAgICAgaWNvbjogJ2ZhLXNpZ24taW4nLAogICAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0TG9naW46IHRydWUKICAgICAgICB9OwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBpbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIG1vY2sgcHJvdmlkZXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBDb25maWcgLSBQcm92aWRlciBjb25maWd1cmF0aW9uCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBpbml0aWFsaXplZAogICAgICovCiAgICBUYXJnZXROUy5pbml0ID0gZnVuY3Rpb24gKENvbmZpZykgewogICAgICAgIGlmIChDb25maWcgJiYgQ29uZmlnLlNpbXVsYXRlZERlbGF5KSB7CiAgICAgICAgICAgIFNpbXVsYXRlZERlbGF5ID0gQ29uZmlnLlNpbXVsYXRlZERlbGF5OwogICAgICAgIH0KCiAgICAgICAgLy8gTG9hZCBleHRlcm5hbCB1c2VyIGNvbmZpZywgdGhlbiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgogICAgICAgIHJldHVybiBMb2FkTW9ja1VzZXJzKCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBEZWxheSg1MCk7CiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgdHJ5U2lsZW50TG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gVHJ5IHNpbGVudCBsb2dpbiAtIG9ubHkgc3VjY2VlZHMgaWYgdXNlciBpcyBpbiBtb2NrIGRhdGEKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFVzZXIgb2JqZWN0IG9yIHJlamVjdHMgaWYgdXNlciBub3QgZm91bmQKICAgICAqLwogICAgVGFyZ2V0TlMudHJ5U2lsZW50TG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIERlbGF5KDEwMCkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIEdldCBjdXJyZW50IFpudW55IHVzZXIncyBlbWFpbCBmcm9tIENvbGxhYm9yYXRpb24gY29uZmlnCiAgICAgICAgICAgIHZhciBDb2xsYWJDb25maWcgPSBDb3JlLkNvbmZpZy5HZXQoJ0NvbGxhYm9yYXRpb24nKSB8fCB7fTsKICAgICAgICAgICAgdmFyIFpudW55VXNlckVtYWlsID0gQ29sbGFiQ29uZmlnLlVzZXJFbWFpbCB8fCAnJzsKICAgICAgICAgICAgdmFyIE1vY2tVc2VyID0gbnVsbDsKCiAgICAgICAgICAgIGlmIChabnVueVVzZXJFbWFpbCkgewogICAgICAgICAgICAgICAgTW9ja1VzZXIgPSBHZXRNb2NrVXNlcihabnVueVVzZXJFbWFpbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIEZvciB0ZXN0aW5nOiBpZiBubyBVc2VyRW1haWwgY29uZmlndXJlZCwgdXNlIGZpcnN0IGF2YWlsYWJsZSB0ZXN0IHVzZXIKICAgICAgICAgICAgaWYgKCFNb2NrVXNlciAmJiAhWm51bnlVc2VyRW1haWwpIHsKICAgICAgICAgICAgICAgIHZhciBGaXJzdEtleSA9IE9iamVjdC5rZXlzKE1vY2tVc2VycylbMF07CiAgICAgICAgICAgICAgICBpZiAoRmlyc3RLZXkpIHsKICAgICAgICAgICAgICAgICAgICBNb2NrVXNlciA9IE1vY2tVc2Vyc1tGaXJzdEtleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHVzZXIgbm90IGluIG1vY2sgZGF0YSwgZmFpbCBzaWxlbnQgbG9naW4gKGNvbnNpc3RlbnQgd2l0aCBNMzY1IGJlaGF2aW9yKQogICAgICAgICAgICBpZiAoIU1vY2tVc2VyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VzZXIgbm90IGZvdW5kIGluIG1vY2sgZGF0YScpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMb2dnZWRJbiA9IHRydWU7CiAgICAgICAgICAgIEN1cnJlbnRVc2VyID0gTW9ja1VzZXI7CiAgICAgICAgICAgIHJldHVybiBDdXJyZW50VXNlcjsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2dpbgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5Nb2NrCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBJbnRlcmFjdGl2ZSBsb2dpbiAtIG9ubHkgc3VjY2VlZHMgaWYgdXNlciBpcyBpbiBtb2NrIGRhdGEKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFVzZXIgb2JqZWN0IG9yIHJlamVjdHMgaWYgdXNlciBub3QgZm91bmQKICAgICAqLwogICAgVGFyZ2V0TlMubG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIERlbGF5KFNpbXVsYXRlZERlbGF5KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgWm51bnkgdXNlcidzIGVtYWlsIGZyb20gQ29sbGFib3JhdGlvbiBjb25maWcKICAgICAgICAgICAgdmFyIENvbGxhYkNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ29sbGFib3JhdGlvbicpIHx8IHt9OwogICAgICAgICAgICB2YXIgWm51bnlVc2VyRW1haWwgPSBDb2xsYWJDb25maWcuVXNlckVtYWlsIHx8ICcnOwogICAgICAgICAgICB2YXIgTW9ja1VzZXIgPSBudWxsOwoKICAgICAgICAgICAgaWYgKFpudW55VXNlckVtYWlsKSB7CiAgICAgICAgICAgICAgICBNb2NrVXNlciA9IEdldE1vY2tVc2VyKFpudW55VXNlckVtYWlsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gSWYgdXNlciBub3QgaW4gbW9jayBkYXRhLCBmYWlsIGxvZ2luCiAgICAgICAgICAgIGlmICghTW9ja1VzZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVXNlciBub3QgZm91bmQgaW4gbW9jayBkYXRhLicpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBMb2dnZWRJbiA9IHRydWU7CiAgICAgICAgICAgIEN1cnJlbnRVc2VyID0gTW9ja1VzZXI7CiAgICAgICAgICAgIHJldHVybiBDdXJyZW50VXNlcjsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2dvdXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gTG9nb3V0CiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBsb2dnZWQgb3V0CiAgICAgKi8KICAgIFRhcmdldE5TLmxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gRGVsYXkoMTAwKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgTG9nZ2VkSW4gPSBmYWxzZTsKICAgICAgICAgICAgQ3VycmVudFVzZXIgPSBudWxsOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGlzTG9nZ2VkSW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ2hlY2sgbG9naW4gc3RhdHVzCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBsb2dnZWQgaW4KICAgICAqLwogICAgVGFyZ2V0TlMuaXNMb2dnZWRJbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gTG9nZ2VkSW47CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q3VycmVudFVzZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgdXNlcgogICAgICogQHJldHVybnMge09iamVjdHxudWxsfSBDdXJyZW50IHVzZXIKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIEN1cnJlbnRVc2VyOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEF2YXRhcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5Nb2NrCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgYXZhdGFyIFVSTCBmb3IgZW1haWwKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIEVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEF2YXRhciBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0QXZhdGFyID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBNb2NrVXNlcnMKICAgICAgICByZXR1cm4gTG9hZE1vY2tVc2VycygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVXNlciA9IEdldE1vY2tVc2VyKEVtYWlsKTsKCiAgICAgICAgICAgIGlmIChVc2VyICYmIFVzZXIuaGFzQXZhdGFyKSB7CiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gY3VzdG9tIGF2YXRhciBVUkwgaWYgZGVmaW5lZCAoZS5nLiwgZm9yIG1heF9tdXN0ZXJtYW5uLmpwZykKICAgICAgICAgICAgICAgIGlmIChVc2VyLmF2YXRhclVybCkgewogICAgICAgICAgICAgICAgICAgIC8vIFVzZSBabnVueSdzIFdlYlBhdGggZm9yIHN0YXRpYyBmaWxlcyAoZS5nLiwgL3pudW55LXdlYi8pCiAgICAgICAgICAgICAgICAgICAgdmFyIFdlYlBhdGggPSBDb3JlLkNvbmZpZy5HZXQoJ1dlYlBhdGgnKSB8fCAnL3pudW55LXdlYi8nOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXZWJQYXRoICsgVXNlci5hdmF0YXJVcmw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgdXNlIGNlbnRyYWwgZmFsbGJhY2sgYXZhdGFyIHdpdGggZGlzcGxheSBuYW1lCiAgICAgICAgICAgICAgICByZXR1cm4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkdldEZhbGxiYWNrQXZhdGFyVXJsKFVzZXIuZW1haWwsIFVzZXIuZGlzcGxheU5hbWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBObyBhdmF0YXIgLSBsZXQgdGhlIG1haW4gbW9kdWxlIGhhbmRsZSBmYWxsYmFjawogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBhdmF0YXInKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0UHJlc2VuY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHByZXNlbmNlIGZvciBlbWFpbAogICAgICogQHBhcmFtIHtTdHJpbmd9IFVzZXJJZE9yRW1haWwgLSBVc2VyIElEIG9yIGVtYWlsIChmb3IgTTM2NSBjb21wYXRpYmlsaXR5KQogICAgICogQHBhcmFtIHtTdHJpbmd9IE9yaWdpbmFsRW1haWwgLSBPcmlnaW5hbCBlbWFpbCBhZGRyZXNzIChvcHRpb25hbCwgdXNlZCB3aGVuIGZpcnN0IHBhcmFtIGlzIElEKQogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gUHJlc2VuY2Ugb2JqZWN0CiAgICAgKi8KICAgIFRhcmdldE5TLmdldFByZXNlbmNlID0gZnVuY3Rpb24gKFVzZXJJZE9yRW1haWwsIE9yaWdpbmFsRW1haWwpIHsKICAgICAgICAvLyBVc2UgT3JpZ2luYWxFbWFpbCBpZiBwcm92aWRlZCAoTTM2NS1zdHlsZSBjYWxsKSwgb3RoZXJ3aXNlIHVzZSBmaXJzdCBwYXJhbQogICAgICAgIHZhciBFbWFpbCA9IE9yaWdpbmFsRW1haWwgfHwgVXNlcklkT3JFbWFpbDsKCiAgICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBNb2NrVXNlcnMKICAgICAgICByZXR1cm4gTG9hZE1vY2tVc2VycygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgLyAyKTsKICAgICAgICB9KS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIFVzZXIgPSBHZXRNb2NrVXNlcihFbWFpbCk7CgogICAgICAgICAgICBpZiAoVXNlcikgewogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgT09GIGlzIGN1cnJlbnRseSBhY3RpdmUKICAgICAgICAgICAgICAgIHZhciBJc09PRiA9IElzT09GQ3VycmVudGx5QWN0aXZlKFVzZXIub3V0T2ZPZmZpY2UpOwogICAgICAgICAgICAgICAgdmFyIEFjdGl2aXR5ID0gSXNPT0YgPyAnT3V0T2ZPZmZpY2UnIDogKFVzZXIuYWN0aXZpdHkgfHwgJ0F2YWlsYWJsZScpOwoKICAgICAgICAgICAgICAgIHZhciBSZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBVc2VyLnByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiBBY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAvLyBXb3JrTG9jYXRpb24gaXMgbnVsbCB3aGVuIE9PRiBpcyBhY3RpdmUgKE1pY3Jvc29mdCBiZWhhdmlvcikKICAgICAgICAgICAgICAgICAgICB3b3JrTG9jYXRpb246IElzT09GID8gbnVsbCA6IChVc2VyLndvcmtMb2NhdGlvbiB8fCBudWxsKQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAvLyBFbWJlZCBPT0YgZGF0YSBpbiBwcmVzZW5jZSByZXNwb25zZSBmb3IgZGF0ZSBkaXNwbGF5CiAgICAgICAgICAgICAgICBpZiAoSXNPT0YgJiYgVXNlci5vdXRPZk9mZmljZSkgewogICAgICAgICAgICAgICAgICAgIFJlc3VsdC5vdXRPZk9mZmljZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiBVc2VyLm91dE9mT2ZmaWNlLnN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkU3RhcnREYXRlVGltZTogVXNlci5vdXRPZk9mZmljZS5zY2hlZHVsZWRTdGFydERhdGVUaW1lIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZEVuZERhdGVUaW1lOiBVc2VyLm91dE9mT2ZmaWNlLnNjaGVkdWxlZEVuZERhdGVUaW1lIHx8IG51bGwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVzZXIgbm90IGluIE1vY2sgZGF0YWJhc2UgLSBsZXQgZmFsbGJhY2sgcHJvdmlkZXIgaGFuZGxlIGl0CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1VzZXIgbm90IGZvdW5kIGluIE1vY2sgcHJvdmlkZXInKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDaGVjayBpZiBPT0YgaXMgY3VycmVudGx5IGFjdGl2ZQogICAgICogQHBhcmFtIHtPYmplY3R9IE9PRiAtIE9PRiBjb25maWd1cmF0aW9uIG9iamVjdAogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgT09GIGlzIGN1cnJlbnRseSBhY3RpdmUKICAgICAqLwogICAgZnVuY3Rpb24gSXNPT0ZDdXJyZW50bHlBY3RpdmUoT09GKSB7CiAgICAgICAgaWYgKCFPT0YgfHwgT09GLnN0YXR1cyA9PT0gJ2Rpc2FibGVkJykgcmV0dXJuIGZhbHNlOwogICAgICAgIGlmIChPT0Yuc3RhdHVzID09PSAnYWx3YXlzRW5hYmxlZCcpIHJldHVybiB0cnVlOwoKICAgICAgICAvLyBGb3Igc2NoZWR1bGVkIE9PRiwgY2hlY2sgaWYgY3VycmVudCB0aW1lIGlzIHdpdGhpbiByYW5nZQogICAgICAgIGlmIChPT0Yuc3RhdHVzID09PSAnc2NoZWR1bGVkJykgewogICAgICAgICAgICB2YXIgTm93ID0gbmV3IERhdGUoKTsKICAgICAgICAgICAgaWYgKE9PRi5zY2hlZHVsZWRTdGFydERhdGVUaW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgU3RhcnQgPSBuZXcgRGF0ZShPT0Yuc2NoZWR1bGVkU3RhcnREYXRlVGltZSk7CiAgICAgICAgICAgICAgICBpZiAoTm93IDwgU3RhcnQpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoT09GLnNjaGVkdWxlZEVuZERhdGVUaW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgRW5kID0gbmV3IERhdGUoT09GLnNjaGVkdWxlZEVuZERhdGVUaW1lKTsKICAgICAgICAgICAgICAgIGlmIChOb3cgPiBFbmQpIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0T3V0T2ZPZmZpY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgcHJlc2VuY2UuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScgaW5zdGVhZAogICAgICogQGRlc2NyaXB0aW9uIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIE9PRiBzdGF0dXMgaXMgbm93IGVtYmVkZGVkIGluIHByZXNlbmNlIHJlc3BvbnNlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8bnVsbD59IEFsd2F5cyByZXR1cm5zIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHByb2ZpbGUgZm9yIGVtYWlsCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5nZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgLy8gRW5zdXJlIGNvbmZpZyBpcyBsb2FkZWQgYmVmb3JlIGFjY2Vzc2luZyBNb2NrVXNlcnMKICAgICAgICByZXR1cm4gTG9hZE1vY2tVc2VycygpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkpOwogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgVXNlciA9IEdldE1vY2tVc2VyKEVtYWlsKTsKCiAgICAgICAgICAgIGlmIChVc2VyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGlkOiBVc2VyLmlkLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBVc2VyLmRpc3BsYXlOYW1lLAogICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZTogVXNlci5naXZlbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3VybmFtZTogVXNlci5zdXJuYW1lLAogICAgICAgICAgICAgICAgICAgIGVtYWlsOiBVc2VyLmVtYWlsLAogICAgICAgICAgICAgICAgICAgIGpvYlRpdGxlOiBVc2VyLmpvYlRpdGxlLAogICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IFVzZXIuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbjogVXNlci5vZmZpY2VMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc1Bob25lczogVXNlci5idXNpbmVzc1Bob25lcywKICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogVXNlci5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBVc2VyLm1hbmFnZXIKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIFVzZXIgbm90IGluIE1vY2sgZGF0YWJhc2UgLSBsZXQgZmFsbGJhY2sgcHJvdmlkZXIgaGFuZGxlIGl0CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ1VzZXIgbm90IGZvdW5kIGluIE1vY2sgcHJvdmlkZXInKSk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q2hhdExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IFRlYW1zIGNoYXQgZGVlcC1saW5rCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBFbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBDaGF0IFVSTAogICAgICovCiAgICBUYXJnZXROUy5nZXRDaGF0TGluayA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIC8vIFRlYW1zIGRlZXAtbGluayBmb3JtYXQKICAgICAgICByZXR1cm4gJ2h0dHBzOi8vdGVhbXMubWljcm9zb2Z0LmNvbS9sL2NoYXQvMC8wP3VzZXJzPScgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldENhbGxMaW5rCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBUZWFtcyBjYWxsIGRlZXAtbGluawogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gRW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gQ2FsbCBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q2FsbExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICAvLyBUZWFtcyBkZWVwLWxpbmsgZm9ybWF0CiAgICAgICAgcmV0dXJuICdodHRwczovL3RlYW1zLm1pY3Jvc29mdC5jb20vbC9jYWxsLzAvMD91c2Vycz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEVtYWlsKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRGcmVlQnVzeQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5Nb2NrCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZnJlZS9idXN5IGRhdGEgLSByZXR1cm5zIEJVU1kgcGVyaW9kcyBmb3IgdGVzdGluZwogICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBFbWFpbHMgLSBFbWFpbCBhZGRyZXNzZXMKICAgICAqIEBwYXJhbSB7RGF0ZX0gU3RhcnQgLSBTdGFydCB0aW1lCiAgICAgKiBAcGFyYW0ge0RhdGV9IEVuZCAtIEVuZCB0aW1lCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qga2V5ZWQgYnkgZW1haWwgd2l0aCBidXN5IHBlcmlvZHMKICAgICAqCiAgICAgKiBSZXR1cm5zIGZvcm1hdDogeyAnZW1haWxAZXhhbXBsZS5jb20nOiBbe3N0YXJ0LCBlbmR9LCAuLi5dLCAuLi4gfQogICAgICogVGhlIFVJIHVzZXMgdGhlc2UgYnVzeSBwZXJpb2RzIHRvIGRldGVybWluZSB3aGljaCBzbG90cyBhcmUgRlJFRQogICAgICovCiAgICBUYXJnZXROUy5nZXRGcmVlQnVzeSA9IGZ1bmN0aW9uIChFbWFpbHMsIFN0YXJ0LCBFbmQpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgKiAyKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gR2VuZXJhdGUgQlVTWSBwZXJpb2RzIChub3QgZnJlZSBzbG90cykKICAgICAgICAgICAgLy8gVGhlIFVJIHdpbGwgZmlsdGVyIHRoZXNlIG91dCB0byBzaG93IG9ubHkgZnJlZSB0aW1lcwogICAgICAgICAgICB2YXIgUmVzdWx0ID0ge307CgogICAgICAgICAgICAvLyBEZWZpbmUgYnVzeSBwZXJpb2RzIGZvciB0aGUgcmVxdWVzdGVkIGRheQogICAgICAgICAgICAvLyAxMjowMC0xMzowMCA9IEx1bmNoIGJyZWFrIChidXN5KQogICAgICAgICAgICAvLyAxNTowMC0xNTozMCA9IFRlYW0gbWVldGluZyAoYnVzeSkKICAgICAgICAgICAgdmFyIFJlcXVlc3REYXRlID0gbmV3IERhdGUoU3RhcnQpOwoKICAgICAgICAgICAgRW1haWxzLmZvckVhY2goZnVuY3Rpb24oRW1haWwpIHsKICAgICAgICAgICAgICAgIHZhciBCdXN5UGVyaW9kcyA9IFtdOwoKICAgICAgICAgICAgICAgIC8vIEx1bmNoIGJyZWFrOiAxMjowMC0xMzowMAogICAgICAgICAgICAgICAgdmFyIEx1bmNoU3RhcnQgPSBuZXcgRGF0ZShSZXF1ZXN0RGF0ZSk7CiAgICAgICAgICAgICAgICBMdW5jaFN0YXJ0LnNldEhvdXJzKDEyLCAwLCAwLCAwKTsKICAgICAgICAgICAgICAgIHZhciBMdW5jaEVuZCA9IG5ldyBEYXRlKFJlcXVlc3REYXRlKTsKICAgICAgICAgICAgICAgIEx1bmNoRW5kLnNldEhvdXJzKDEzLCAwLCAwLCAwKTsKCiAgICAgICAgICAgICAgICBpZiAoTHVuY2hTdGFydCA+PSBTdGFydCAmJiBMdW5jaEVuZCA8PSBFbmQpIHsKICAgICAgICAgICAgICAgICAgICBCdXN5UGVyaW9kcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IEx1bmNoU3RhcnQudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBMdW5jaEVuZC50b0lTT1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gVGVhbSBtZWV0aW5nOiAxNTowMC0xNTozMAogICAgICAgICAgICAgICAgdmFyIE1lZXRpbmdTdGFydCA9IG5ldyBEYXRlKFJlcXVlc3REYXRlKTsKICAgICAgICAgICAgICAgIE1lZXRpbmdTdGFydC5zZXRIb3VycygxNSwgMCwgMCwgMCk7CiAgICAgICAgICAgICAgICB2YXIgTWVldGluZ0VuZCA9IG5ldyBEYXRlKFJlcXVlc3REYXRlKTsKICAgICAgICAgICAgICAgIE1lZXRpbmdFbmQuc2V0SG91cnMoMTUsIDMwLCAwLCAwKTsKCiAgICAgICAgICAgICAgICBpZiAoTWVldGluZ1N0YXJ0ID49IFN0YXJ0ICYmIE1lZXRpbmdFbmQgPD0gRW5kKSB7CiAgICAgICAgICAgICAgICAgICAgQnVzeVBlcmlvZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBNZWV0aW5nU3RhcnQudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBNZWV0aW5nRW5kLnRvSVNPU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBSZXN1bHRbRW1haWxdID0gQnVzeVBlcmlvZHM7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgcmV0dXJuIFJlc3VsdDsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBvbmxpbmUgbWVldGluZwogICAgICogQHBhcmFtIHtPYmplY3R9IERldGFpbHMgLSBNZWV0aW5nIGRldGFpbHMKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IE1lZXRpbmcgaW5mbwogICAgICovCiAgICBUYXJnZXROUy5jcmVhdGVNZWV0aW5nID0gZnVuY3Rpb24gKERldGFpbHMpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgKiAyKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIE1lZXRpbmdJZCA9ICdtb2NrLW1lZXRpbmctJyArIERhdGUubm93KCk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgaWQ6IE1lZXRpbmdJZCwKICAgICAgICAgICAgICAgIHN1YmplY3Q6IERldGFpbHMuc3ViamVjdCB8fCAnWm51bnkgTWVldGluZycsCiAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lOiBEZXRhaWxzLnN0YXJ0RGF0ZVRpbWUsCiAgICAgICAgICAgICAgICBlbmREYXRlVGltZTogRGV0YWlscy5lbmREYXRlVGltZSwKICAgICAgICAgICAgICAgIGpvaW5Vcmw6ICdodHRwczovL3RlYW1zLm1pY3Jvc29mdC5jb20vbC9tZWV0dXAtam9pbi8nICsgTWVldGluZ0lkLAogICAgICAgICAgICAgICAgb3JnYW5pemVyOiBDdXJyZW50VXNlciA/IEN1cnJlbnRVc2VyLmVtYWlsIDogJ2FnZW50QGV4YW1wbGUuY29tJywKICAgICAgICAgICAgICAgIGF0dGVuZGVlczogRGV0YWlscy5hdHRlbmRlZXMgfHwgW10KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBjYWxlbmRhciBldmVudCAod2l0aCBvcHRpb25hbCBUZWFtcyBtZWV0aW5nKQogICAgICogQHBhcmFtIHtPYmplY3R9IERldGFpbHMgLSBFdmVudCBkZXRhaWxzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5zdWJqZWN0IC0gRXZlbnQgc3ViamVjdAogICAgICogQHBhcmFtIHtTdHJpbmd9IERldGFpbHMuc3RhcnREYXRlVGltZSAtIFN0YXJ0IHRpbWUgKElTTyBzdHJpbmcpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5lbmREYXRlVGltZSAtIEVuZCB0aW1lIChJU08gc3RyaW5nKQogICAgICogQHBhcmFtIHtBcnJheTxTdHJpbmc+fSBEZXRhaWxzLmF0dGVuZGVlcyAtIEF0dGVuZGVlIGVtYWlsIGFkZHJlc3NlcwogICAgICogQHBhcmFtIHtCb29sZWFufSBEZXRhaWxzLmlzT25saW5lTWVldGluZyAtIFdoZXRoZXIgdG8gY3JlYXRlIFRlYW1zIG1lZXRpbmcKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbRGV0YWlscy5sb2NhdGlvbl0gLSBMb2NhdGlvbiBmb3Igb24tc2l0ZSBtZWV0aW5ncwogICAgICogQHBhcmFtIHtTdHJpbmd9IFtEZXRhaWxzLnRpbWVab25lXSAtIElBTkEgdGltZXpvbmUgKGUuZy4sICdFdXJvcGUvQmVybGluJykKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEV2ZW50IGluZm8gd2l0aCBpZCBhbmQgb3B0aW9uYWwgam9pblVybAogICAgICovCiAgICBUYXJnZXROUy5jcmVhdGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKERldGFpbHMpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkgKiAyKS50aGVuKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIEV2ZW50SWQgPSAnbW9jay1ldmVudC0nICsgRGF0ZS5ub3coKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpZDogRXZlbnRJZCwKICAgICAgICAgICAgICAgIHN1YmplY3Q6IERldGFpbHMuc3ViamVjdCB8fCAnWm51bnkgQXBwb2ludG1lbnQnLAogICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogRGV0YWlscy5zdGFydERhdGVUaW1lLAogICAgICAgICAgICAgICAgZW5kRGF0ZVRpbWU6IERldGFpbHMuZW5kRGF0ZVRpbWUsCiAgICAgICAgICAgICAgICB0aW1lWm9uZTogRGV0YWlscy50aW1lWm9uZSB8fCAnVVRDJywKICAgICAgICAgICAgICAgIGpvaW5Vcmw6IERldGFpbHMuaXNPbmxpbmVNZWV0aW5nCiAgICAgICAgICAgICAgICAgICAgPyAnaHR0cHM6Ly90ZWFtcy5taWNyb3NvZnQuY29tL2wvbWVldHVwLWpvaW4vJyArIEV2ZW50SWQKICAgICAgICAgICAgICAgICAgICA6IG51bGwsCiAgICAgICAgICAgICAgICBvcmdhbml6ZXI6IEN1cnJlbnRVc2VyID8gQ3VycmVudFVzZXIuZW1haWwgOiAnYWdlbnRAZXhhbXBsZS5jb20nLAogICAgICAgICAgICAgICAgYXR0ZW5kZWVzOiBEZXRhaWxzLmF0dGVuZGVlcyB8fCBbXQogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGRlbGV0ZUNhbGVuZGFyRXZlbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTW9jawogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gRGVsZXRlL2NhbmNlbCBjYWxlbmRhciBldmVudCAoc2VuZHMgY2FuY2VsbGF0aW9uIHRvIGF0dGVuZGVlcykKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFdmVudElkIC0gRXZlbnQgSUQgdG8gZGVsZXRlCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBTdWNjZXNzIHN0YXR1cwogICAgICovCiAgICBUYXJnZXROUy5kZWxldGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKEV2ZW50SWQpIHsKICAgICAgICByZXR1cm4gRGVsYXkoU2ltdWxhdGVkRGVsYXkpLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZQogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByaXZhdGUgSGVscGVyIEZ1bmN0aW9ucwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIExvYWQgbW9jayB1c2VycyBmcm9tIGV4dGVybmFsIGNvbmZpZyBmaWxlCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBjb25maWcgaXMgbG9hZGVkLCByZWplY3RzIG9uIGVycm9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIExvYWRNb2NrVXNlcnMoKSB7CiAgICAgICAgaWYgKENvbmZpZ0xvYWRQcm9taXNlKSB7CiAgICAgICAgICAgIHJldHVybiBDb25maWdMb2FkUHJvbWlzZTsKICAgICAgICB9CgogICAgICAgIHZhciBXZWJQYXRoID0gQ29yZS5Db25maWcuR2V0KCdXZWJQYXRoJykgfHwgJy96bnVueS13ZWIvJzsKICAgICAgICB2YXIgQ29uZmlnVXJsID0gV2ViUGF0aCArICdqcy9kZXYtZW52aXJvbm1lbnQuanNvbic7CgogICAgICAgIENvbmZpZ0xvYWRQcm9taXNlID0gZmV0Y2goQ29uZmlnVXJsKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2Uub2spIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvbmZpZyBub3QgZm91bmQ6ICcgKyBSZXNwb25zZS5zdGF0dXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKENvbmZpZykgewogICAgICAgICAgICAgICAgLy8gQnVpbGQgTW9ja1VzZXJzIGZyb20gY29uZmlnCiAgICAgICAgICAgICAgICB2YXIgTmV3TW9ja1VzZXJzID0ge307CgogICAgICAgICAgICAgICAgLy8gQWRkIGFnZW50cyB3aXRoIG1vY2tQcm9maWxlCiAgICAgICAgICAgICAgICAoQ29uZmlnLmFnZW50cyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoQWdlbnQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoQWdlbnQubW9ja1Byb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb2ZpbGUgPSBBZ2VudC5tb2NrUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgTmV3TW9ja1VzZXJzW0FnZW50LmVtYWlsLnRvTG93ZXJDYXNlKCldID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFByb2ZpbGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogQWdlbnQuZmlyc3ROYW1lICsgJyAnICsgQWdlbnQubGFzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnaXZlbk5hbWU6IEFnZW50LmZpcnN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cm5hbWU6IEFnZW50Lmxhc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IEFnZW50LmVtYWlsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgam9iVGl0bGU6IFByb2ZpbGUuam9iVGl0bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBhcnRtZW50OiBQcm9maWxlLmRlcGFydG1lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbjogUHJvZmlsZS5vZmZpY2VMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzUGhvbmVzOiBQcm9maWxlLmJ1c2luZXNzUGhvbmVzIHx8IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlUGhvbmU6IFByb2ZpbGUubW9iaWxlUGhvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBQcm9maWxlLm1hbmFnZXIgfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbmNlOiBQcm9maWxlLnByZXNlbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHk6IFByb2ZpbGUuYWN0aXZpdHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrTG9jYXRpb246IFByb2ZpbGUud29ya0xvY2F0aW9uIHx8IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNBdmF0YXI6IFByb2ZpbGUuaGFzQXZhdGFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyVXJsOiBQcm9maWxlLmF2YXRhclVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE9mT2ZmaWNlOiBQcm9maWxlLm91dE9mT2ZmaWNlIHx8IG51bGwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvLyBBZGQgY3VzdG9tZXJzIHdpdGggbW9ja1Byb2ZpbGUKICAgICAgICAgICAgICAgIChDb25maWcuY3VzdG9tZXJzIHx8IFtdKS5mb3JFYWNoKGZ1bmN0aW9uIChDdXN0b21lcikgewogICAgICAgICAgICAgICAgICAgIGlmIChDdXN0b21lci5tb2NrUHJvZmlsZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHJvZmlsZSA9IEN1c3RvbWVyLm1vY2tQcm9maWxlOwogICAgICAgICAgICAgICAgICAgICAgICBOZXdNb2NrVXNlcnNbQ3VzdG9tZXIuZW1haWwudG9Mb3dlckNhc2UoKV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogUHJvZmlsZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBDdXN0b21lci5maXJzdE5hbWUgKyAnICcgKyBDdXN0b21lci5sYXN0TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZTogQ3VzdG9tZXIuZmlyc3ROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VybmFtZTogQ3VzdG9tZXIubGFzdE5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogQ3VzdG9tZXIuZW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZTogUHJvZmlsZS5qb2JUaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IFByb2ZpbGUuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uOiBQcm9maWxlLm9mZmljZUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXM6IFByb2ZpbGUuYnVzaW5lc3NQaG9uZXMgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogUHJvZmlsZS5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IFByb2ZpbGUubWFuYWdlciB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2U6IFByb2ZpbGUucHJlc2VuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogUHJvZmlsZS5hY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtMb2NhdGlvbjogUHJvZmlsZS53b3JrTG9jYXRpb24gfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F2YXRhcjogUHJvZmlsZS5oYXNBdmF0YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXJVcmw6IFByb2ZpbGUuYXZhdGFyVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZPZmZpY2U6IFByb2ZpbGUub3V0T2ZPZmZpY2UgfHwgbnVsbAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIEFkZCB0ZXN0IHVzZXJzCiAgICAgICAgICAgICAgICAoQ29uZmlnLnRlc3RVc2VycyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoVGVzdFVzZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoVGVzdFVzZXIubW9ja1Byb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFByb2ZpbGUgPSBUZXN0VXNlci5tb2NrUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgTmV3TW9ja1VzZXJzW1Rlc3RVc2VyLmVtYWlsLnRvTG93ZXJDYXNlKCldID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IFByb2ZpbGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogUHJvZmlsZS5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuTmFtZTogUHJvZmlsZS5naXZlbk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJuYW1lOiBQcm9maWxlLnN1cm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWFpbDogVGVzdFVzZXIuZW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZTogUHJvZmlsZS5qb2JUaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IFByb2ZpbGUuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uOiBQcm9maWxlLm9mZmljZUxvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXM6IFByb2ZpbGUuYnVzaW5lc3NQaG9uZXMgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogUHJvZmlsZS5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXI6IFByb2ZpbGUubWFuYWdlciB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VuY2U6IFByb2ZpbGUucHJlc2VuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eTogUHJvZmlsZS5hY3Rpdml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtMb2NhdGlvbjogUHJvZmlsZS53b3JrTG9jYXRpb24gfHwgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0F2YXRhcjogUHJvZmlsZS5oYXNBdmF0YXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXJVcmw6IFByb2ZpbGUuYXZhdGFyVXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0T2ZPZmZpY2U6IFByb2ZpbGUub3V0T2ZPZmZpY2UgfHwgbnVsbAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIFJlcGxhY2UgTW9ja1VzZXJzIHdpdGggbG9hZGVkIGNvbmZpZwogICAgICAgICAgICAgICAgTW9ja1VzZXJzID0gTmV3TW9ja1VzZXJzOwogICAgICAgICAgICAgICAgQ29uZmlnTG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChFcnJvcikgewogICAgICAgICAgICAgICAgLy8gUmUtdGhyb3cgZXJyb3IgLSBNb2NrIHByb3ZpZGVyIGNhbm5vdCBmdW5jdGlvbiB3aXRob3V0IGNvbmZpZwogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3I7CiAgICAgICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gQ29uZmlnTG9hZFByb21pc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFNpbXVsYXRlIG5ldHdvcmsgZGVsYXkKICAgICAqLwogICAgZnVuY3Rpb24gRGVsYXkoTXMpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKFJlc29sdmUpIHsKICAgICAgICAgICAgc2V0VGltZW91dChSZXNvbHZlLCBNcyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdldCBtb2NrIHVzZXIgYnkgZW1haWwgKGNhc2UtaW5zZW5zaXRpdmUpCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdldE1vY2tVc2VyKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciBMb3dlckVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gRGlyZWN0IG1hdGNoCiAgICAgICAgaWYgKE1vY2tVc2Vyc1tMb3dlckVtYWlsXSkgewogICAgICAgICAgICByZXR1cm4gTW9ja1VzZXJzW0xvd2VyRW1haWxdOwogICAgICAgIH0KCiAgICAgICAgLy8gU2VhcmNoIGFsbCB1c2VycwogICAgICAgIGZvciAodmFyIEtleSBpbiBNb2NrVXNlcnMpIHsKICAgICAgICAgICAgaWYgKE1vY2tVc2Vycy5oYXNPd25Qcm9wZXJ0eShLZXkpICYmIEtleS50b0xvd2VyQ2FzZSgpID09PSBMb3dlckVtYWlsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTW9ja1VzZXJzW0tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUmVnaXN0ZXIgUHJvdmlkZXIKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8vIEF1dG8tcmVnaXN0ZXIgd2hlbiBzY3JpcHQgbG9hZHMKICAgIGlmIChDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlJlZ2lzdGVyUHJvdmlkZXIpIHsKICAgICAgICBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUmVnaXN0ZXJQcm92aWRlcignTW9jaycsIFRhcmdldE5TKTsKICAgIH0KCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk1vY2sgfHwge30pKTsK</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.Provider.M365.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlcgogKiBAZGVzY3JpcHRpb24KICogICAgICBNaWNyb3NvZnQgMzY1IFByb3ZpZGVyIGZvciBDb2xsYWJvcmF0aW9uIEFkZC1vbgogKgogKiAgICAgIFRoaXMgcHJvdmlkZXIgaW50ZWdyYXRlcyB3aXRoIE1pY3Jvc29mdCBHcmFwaCBBUEkgdmlhIE1TQUwuanMgZm9yOgogKiAgICAgIC0gQXV0aGVudGljYXRpb24gKFNpbGVudCBTU08gKyBJbnRlcmFjdGl2ZSBMb2dpbikKICogICAgICAtIFVzZXIgQXZhdGFycyBmcm9tIEV4Y2hhbmdlL0VudHJhIElECiAqICAgICAgLSBQcmVzZW5jZSBTdGF0dXMgZnJvbSBUZWFtcwogKiAgICAgIC0gVXNlciBQcm9maWxlcyBmcm9tIEVudHJhIElECiAqICAgICAgLSBGcmVlL0J1c3kgQ2FsZW5kYXIgRGF0YQogKiAgICAgIC0gVGVhbXMgTWVldGluZyBDcmVhdGlvbgogKiAgICAgIC0gVGVhbXMgQ2hhdC9DYWxsIERlZXAgTGlua3MKICoKICogICAgICBSZXF1aXJlZCBFbnRyYSBJRCBBcHAgUmVnaXN0cmF0aW9uIFBlcm1pc3Npb25zOgogKiAgICAgIC0gVXNlci5SZWFkIChkZWxlZ2F0ZWQpIC0gT3duIHByb2ZpbGUKICogICAgICAtIFVzZXIuUmVhZC5BbGwgKGRlbGVnYXRlZCkgLSBPdGhlciB1c2VycycgcHJvZmlsZXMgYW5kIGF2YXRhcnMKICogICAgICAtIFByZXNlbmNlLlJlYWQuQWxsIChkZWxlZ2F0ZWQpIC0gUHJlc2VuY2Ugc3RhdHVzCiAqICAgICAgLSBDYWxlbmRhcnMuUmVhZC5TaGFyZWQgKGRlbGVnYXRlZCkgLSBGcmVlL0J1c3kKICogICAgICAtIENhbGVuZGFycy5SZWFkV3JpdGUgKGRlbGVnYXRlZCkgLSBDcmVhdGUvZGVsZXRlIG1lZXRpbmdzCiAqLwp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwpDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gPSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gfHwge307CkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlciA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlciB8fCB7fTsKCkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNU0FMIFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uIGluc3RhbmNlCiAgICAgKi8KICAgIHZhciBNc2FsSW5zdGFuY2UgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGF1dGhlbnRpY2F0ZWQgYWNjb3VudAogICAgICovCiAgICB2YXIgQ3VycmVudEFjY291bnQgPSBudWxsOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDYWNoZWQgdXNlciBwcm9maWxlIGZyb20gR3JhcGggQVBJIChoYXMgZnVsbCBkaXNwbGF5TmFtZSkKICAgICAqLwogICAgdmFyIEN1cnJlbnRVc2VyUHJvZmlsZSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIFByb3ZpZGVyIGNvbmZpZ3VyYXRpb24KICAgICAqLwogICAgdmFyIENvbmZpZyA9IG51bGw7CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIEdyYXBoIEFQSSBiYXNlIFVSTAogICAgICovCiAgICB2YXIgR3JhcGhCYXNlVXJsID0gJ2h0dHBzOi8vZ3JhcGgubWljcm9zb2Z0LmNvbS92MS4wJzsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gV2hpdGVsaXN0IG9mIGFsbG93ZWQgR3JhcGggQVBJIGVuZHBvaW50IHBhdHRlcm5zCiAgICAgKiAgICAgICAgICAgICAgU2VjdXJpdHk6IFByZXZlbnRzIGFyYml0cmFyeSBBUEkgY2FsbHMgdmlhIEdyYXBoQXBpQ2FsbAogICAgICovCiAgICB2YXIgQWxsb3dlZEVuZHBvaW50UGF0dGVybnMgPSBbCiAgICAgICAgLy8gQ3VycmVudCB1c2VyIGVuZHBvaW50cwogICAgICAgIC9eXC9tZShcPy4qKT8kLywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvbWUsIC9tZT8kc2VsZWN0PS4uLgogICAgICAgIC9eXC9tZVwvcGhvdG9cL1wkdmFsdWUkLywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAvbWUvcGhvdG8vJHZhbHVlCiAgICAgICAgL15cL21lXC9wcmVzZW5jZSQvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC9tZS9wcmVzZW5jZSAob3duIHByZXNlbmNlKQogICAgICAgIC9eXC9tZVwvY2FsZW5kYXJcL2dldFNjaGVkdWxlJC8sICAgICAgICAgICAgICAgICAgICAvLyAvbWUvY2FsZW5kYXIvZ2V0U2NoZWR1bGUgKFBPU1QpCiAgICAgICAgL15cL21lXC9ldmVudHMoXD8uKik/JC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC9tZS9ldmVudHMgKFBPU1QgZm9yIGNyZWF0ZSkKICAgICAgICAvXlwvbWVcL2V2ZW50c1wvW15cL10rJC8sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gL21lL2V2ZW50cy97aWR9IChERUxFVEUpCgogICAgICAgIC8vIE90aGVyIHVzZXIgZW5kcG9pbnRzIChyZWFkLW9ubHkpCiAgICAgICAgL15cL3VzZXJzXC9bXlwvXSsoXD8uKik/JC8sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC91c2Vycy97ZW1haWx9PyRzZWxlY3Q9Li4uCiAgICAgICAgL15cL3VzZXJzXC9bXlwvXStcL3Bob3RvXC9cJHZhbHVlJC8sICAgICAgICAgICAgICAgIC8vIC91c2Vycy97ZW1haWx9L3Bob3RvLyR2YWx1ZQogICAgICAgIC9eXC91c2Vyc1wvW15cL10rXC9wcmVzZW5jZSQvLCAgICAgICAgICAgICAgICAgICAgICAvLyAvdXNlcnMve2VtYWlsfS9wcmVzZW5jZQogICAgICAgIC9eXC91c2Vyc1wvW15cL10rXC9tYW5hZ2VyKFw/LiopPyQvICAgICAgICAgICAgICAgICAvLyAvdXNlcnMve2VtYWlsfS9tYW5hZ2VyCiAgICBdOwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBTY29wZXMgZm9yIEdyYXBoIEFQSSBhY2Nlc3MKICAgICAqLwogICAgdmFyIEdyYXBoU2NvcGVzID0gWwogICAgICAgICdVc2VyLlJlYWQnLAogICAgICAgICdVc2VyLlJlYWQuQWxsJywKICAgICAgICAnUHJlc2VuY2UuUmVhZCcsCiAgICAgICAgJ1ByZXNlbmNlLlJlYWQuQWxsJywKICAgICAgICAnQ2FsZW5kYXJzLlJlYWQuU2hhcmVkJywKICAgICAgICAnQ2FsZW5kYXJzLlJlYWRXcml0ZScKICAgIF07CgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAvLyBQcm92aWRlciBDYXBhYmlsaXRpZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHB1YmxpYwogICAgICogQGRlc2NyaXB0aW9uIENhcGFiaWxpdGllcyB0aGlzIHByb3ZpZGVyIHN1cHBvcnRzCiAgICAgKi8KICAgIFRhcmdldE5TLmNhcGFiaWxpdGllcyA9IHsKICAgICAgICBhdmF0YXI6IHRydWUsCiAgICAgICAgcHJlc2VuY2U6IHRydWUsCiAgICAgICAgcHJvZmlsZTogdHJ1ZSwKICAgICAgICBjaGF0OiB0cnVlLAogICAgICAgIGNhbGw6IHRydWUsCiAgICAgICAgZnJlZUJ1c3k6IHRydWUsCiAgICAgICAgY3JlYXRlTWVldGluZzogdHJ1ZSwKICAgICAgICBjcmVhdGVDYWxlbmRhckV2ZW50OiB0cnVlLAogICAgICAgIGRlbGV0ZUNhbGVuZGFyRXZlbnQ6IHRydWUsCiAgICAgICAgb3V0T2ZPZmZpY2U6IGZhbHNlICAvLyBEZXByZWNhdGVkIC0gdXNlIHByZXNlbmNlLmFjdGl2aXR5ID09PSAnT3V0T2ZPZmZpY2UnIGluc3RlYWQKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRMb2dpbkluZm8KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGxvZ2luIFVJIG1ldGFkYXRhIGZvciB0aGlzIHByb3ZpZGVyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBMb2dpbiBpbmZvIHtsYWJlbCwgaWNvbiwgcmVxdWlyZXNFeHBsaWNpdExvZ2lufQogICAgICovCiAgICBUYXJnZXROUy5nZXRMb2dpbkluZm8gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbGFiZWw6ICdNaWNyb3NvZnQgMzY1JywKICAgICAgICAgICAgaWNvbjogJ2ZhLXdpbmRvd3MnLAogICAgICAgICAgICByZXF1aXJlc0V4cGxpY2l0TG9naW46IHRydWUKICAgICAgICB9OwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAbmFtZSBpbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIE0zNjUgcHJvdmlkZXIgd2l0aCBNU0FMCiAgICAgKiBAcGFyYW0ge09iamVjdH0gUHJvdmlkZXJDb25maWcgLSBQcm92aWRlciBjb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUHJvdmlkZXJDb25maWcuVGVuYW50SUQgLSBFbnRyYSBJRCBUZW5hbnQgSUQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBQcm92aWRlckNvbmZpZy5DbGllbnRJRCAtIEFwcCBSZWdpc3RyYXRpb24gQ2xpZW50IElECiAgICAgKiBAcGFyYW0ge1N0cmluZ30gUHJvdmlkZXJDb25maWcuUmVkaXJlY3RVUkkgLSBPQXV0aCBSZWRpcmVjdCBVUkkKICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZXNvbHZlcyB3aGVuIGluaXRpYWxpemVkCiAgICAgKi8KICAgIFRhcmdldE5TLmluaXQgPSBmdW5jdGlvbiAoUHJvdmlkZXJDb25maWcpIHsKICAgICAgICBDb25maWcgPSBQcm92aWRlckNvbmZpZzsKCiAgICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgY29uZmlndXJhdGlvbiB3aXRoIGRldGFpbGVkIGVycm9yIG1lc3NhZ2VzCiAgICAgICAgdmFyIG1pc3NpbmdDb25maWcgPSBbXTsKICAgICAgICBpZiAoIUNvbmZpZy5UZW5hbnRJRCkgewogICAgICAgICAgICBtaXNzaW5nQ29uZmlnLnB1c2goJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpUZW5hbnRJRCcpOwogICAgICAgIH0KICAgICAgICBpZiAoIUNvbmZpZy5DbGllbnRJRCkgewogICAgICAgICAgICBtaXNzaW5nQ29uZmlnLnB1c2goJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpDbGllbnRJRCcpOwogICAgICAgIH0KICAgICAgICBpZiAoIUNvbmZpZy5SZWRpcmVjdFVSSSkgewogICAgICAgICAgICBtaXNzaW5nQ29uZmlnLnB1c2goJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpSZWRpcmVjdFVSSScpOwogICAgICAgIH0KCiAgICAgICAgaWYgKG1pc3NpbmdDb25maWcubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgZXJyb3JNc2cgPSAnTTM2NSBQcm92aWRlcjogTWlzc2luZyByZXF1aXJlZCBTeXNDb25maWcgc2V0dGluZ3M6ICcgKyBtaXNzaW5nQ29uZmlnLmpvaW4oJywgJykgKwogICAgICAgICAgICAgICAgJy4gUGxlYXNlIGNvbmZpZ3VyZSB0aGVzZSBzZXR0aW5ncyBpbiBBZG1pbiA+IFN5c3RlbSBDb25maWd1cmF0aW9uLic7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb2xsYWJvcmF0aW9uIE0zNjVdICcgKyBlcnJvck1zZyk7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoZXJyb3JNc2cpKTsKICAgICAgICB9CgogICAgICAgIC8vIENoZWNrIGlmIE1TQUwgaXMgbG9hZGVkCiAgICAgICAgaWYgKHR5cGVvZiBtc2FsID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB2YXIgbXNhbEVycm9yID0gJ01TQUwuanMgbGlicmFyeSBub3QgbG9hZGVkLiBDaGVjayBicm93c2VyIGNvbnNvbGUgZm9yIHNjcmlwdCBsb2FkaW5nIGVycm9ycy4nOwogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbQ29sbGFib3JhdGlvbiBNMzY1XSAnICsgbXNhbEVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihtc2FsRXJyb3IpKTsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSBNU0FMIGNvbmZpZ3VyYXRpb24KICAgICAgICB2YXIgbXNhbENvbmZpZyA9IHsKICAgICAgICAgICAgYXV0aDogewogICAgICAgICAgICAgICAgY2xpZW50SWQ6IENvbmZpZy5DbGllbnRJRCwKICAgICAgICAgICAgICAgIGF1dGhvcml0eTogJ2h0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS8nICsgQ29uZmlnLlRlbmFudElELAogICAgICAgICAgICAgICAgcmVkaXJlY3RVcmk6IENvbmZpZy5SZWRpcmVjdFVSSSB8fCB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgcG9zdExvZ291dFJlZGlyZWN0VXJpOiB3aW5kb3cubG9jYXRpb24ub3JpZ2luICsgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgbmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybDogZmFsc2UsCiAgICAgICAgICAgICAgICAvLyBBdm9pZCBuZXR3b3JrIGRpc2NvdmVyeSBjYWxsIChDU1AgbWF5IGJsb2NrIGl0KQogICAgICAgICAgICAgICAga25vd25BdXRob3JpdGllczogWydsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tJ10KICAgICAgICAgICAgfSwKICAgICAgICAgICAgY2FjaGU6IHsKICAgICAgICAgICAgICAgIGNhY2hlTG9jYXRpb246ICdsb2NhbFN0b3JhZ2UnLCAgLy8gVXNlIGxvY2FsU3RvcmFnZSB0byBwZXJzaXN0IGFjcm9zcyB0YWJzCiAgICAgICAgICAgICAgICBzdG9yZUF1dGhTdGF0ZUluQ29va2llOiBmYWxzZQogICAgICAgICAgICB9LAogICAgICAgICAgICBzeXN0ZW06IHsKICAgICAgICAgICAgICAgIGxvZ2dlck9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICBsb2dMZXZlbDogbXNhbC5Mb2dMZXZlbC5FcnJvciwKICAgICAgICAgICAgICAgICAgICBsb2dnZXJDYWxsYmFjazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2dnaW5nIGRpc2FibGVkIGZvciBwcm9kdWN0aW9uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgTXNhbEluc3RhbmNlID0gbmV3IG1zYWwuUHVibGljQ2xpZW50QXBwbGljYXRpb24obXNhbENvbmZpZyk7CgogICAgICAgICAgICAvLyBIYW5kbGUgcmVkaXJlY3QgcHJvbWlzZSAoZm9yIHBvcHVwL3JlZGlyZWN0IGZsb3dzKQogICAgICAgICAgICByZXR1cm4gTXNhbEluc3RhbmNlLmluaXRpYWxpemUoKS50aGVuKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1zYWxJbnN0YW5jZS5oYW5kbGVSZWRpcmVjdFByb21pc2UoKTsKICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIC8vIFJldHVybmVkIGZyb20gbG9naW4gcmVkaXJlY3QKICAgICAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IHJlc3BvbnNlLmFjY291bnQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBleGlzdGluZyBhY2NvdW50IGluIGNhY2hlIHRoYXQgbWF0Y2hlcyBvdXIgdGVuYW50CiAgICAgICAgICAgICAgICAgICAgdmFyIGFjY291bnRzID0gTXNhbEluc3RhbmNlLmdldEFsbEFjY291bnRzKCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1hdGNoaW5nQWNjb3VudCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjb3VudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjY291bnRzW2ldLnRlbmFudElkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NvdW50c1tpXS50ZW5hbnRJZC50b0xvd2VyQ2FzZSgpID09PSBDb25maWcuVGVuYW50SUQudG9Mb3dlckNhc2UoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hpbmdBY2NvdW50ID0gYWNjb3VudHNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoaW5nQWNjb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IG1hdGNoaW5nQWNjb3VudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIE1TQUwgaW5pdGlhbGl6YXRpb24gaXNzdWVzIC0gbG9nZ2VkIGJ1dCBub3QgYmxvY2tpbmcKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsKICAgICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgdHJ5U2lsZW50TG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gVHJ5IHRvIGFjcXVpcmUgdG9rZW4gc2lsZW50bHkgKFNTTykKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFVzZXIgb2JqZWN0IGlmIHN1Y2Nlc3NmdWwKICAgICAqLwogICAgVGFyZ2V0TlMudHJ5U2lsZW50TG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFNc2FsSW5zdGFuY2UpIHsKICAgICAgICAgICAgLy8gU2lsZW50IGZhaWwgLSBpbml0KCkgYWxyZWFkeSBzaG93ZWQgdGhlIGVycm9yCiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ00zNjUgUHJvdmlkZXIgbm90IGluaXRpYWxpemVkIC0gY2hlY2sgU3lzQ29uZmlnIHNldHRpbmdzJykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGFjY291bnRzID0gTXNhbEluc3RhbmNlLmdldEFsbEFjY291bnRzKCk7CiAgICAgICAgaWYgKGFjY291bnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBhY2NvdW50cycpKTsKICAgICAgICB9CgogICAgICAgIC8vIEZpbmQgYWNjb3VudCBtYXRjaGluZyBvdXIgdGVuYW50CiAgICAgICAgdmFyIG1hdGNoaW5nQWNjb3VudCA9IG51bGw7CiAgICAgICAgdmFyIGV4cGVjdGVkQXV0aG9yaXR5ID0gJ2h0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS8nICsgQ29uZmlnLlRlbmFudElELnRvTG93ZXJDYXNlKCkgKyAnLyc7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWNjb3VudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGFjY291bnQgPSBhY2NvdW50c1tpXTsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYWNjb3VudCdzIGVudmlyb25tZW50IG1hdGNoZXMgb3VyIHRlbmFudAogICAgICAgICAgICBpZiAoYWNjb3VudC50ZW5hbnRJZCAmJiBhY2NvdW50LnRlbmFudElkLnRvTG93ZXJDYXNlKCkgPT09IENvbmZpZy5UZW5hbnRJRC50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICAgICAgICBtYXRjaGluZ0FjY291bnQgPSBhY2NvdW50OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghbWF0Y2hpbmdBY2NvdW50KSB7CiAgICAgICAgICAgIC8vIENsZWFyIG1pc21hdGNoZWQgYWNjb3VudHMgdG8gYXZvaWQgZnV0dXJlIGF1dGhvcml0eV9taXNtYXRjaCBlcnJvcnMKICAgICAgICAgICAgYWNjb3VudHMuZm9yRWFjaChmdW5jdGlvbihhY2NvdW50KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIE1zYWxJbnN0YW5jZS5zZXRBY3RpdmVBY2NvdW50KG51bGwpOwogICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gbWF0Y2hpbmcgYWNjb3VudCcpKTsKICAgICAgICB9CgogICAgICAgIHZhciBzaWxlbnRSZXF1ZXN0ID0gewogICAgICAgICAgICBhY2NvdW50OiBtYXRjaGluZ0FjY291bnQsCiAgICAgICAgICAgIHNjb3BlczogR3JhcGhTY29wZXMsCiAgICAgICAgICAgIGZvcmNlUmVmcmVzaDogZmFsc2UKICAgICAgICB9OwoKICAgICAgICByZXR1cm4gTXNhbEluc3RhbmNlLmFjcXVpcmVUb2tlblNpbGVudChzaWxlbnRSZXF1ZXN0KQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIEN1cnJlbnRBY2NvdW50ID0gcmVzcG9uc2UuYWNjb3VudDsKICAgICAgICAgICAgICAgIHJldHVybiBHZXRDdXJyZW50VXNlclByb2ZpbGUoKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgLy8gSGFuZGxlIGF1dGhvcml0eSBtaXNtYXRjaCBieSBjbGVhcmluZyBzdGFsZSBjYWNoZQogICAgICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yQ29kZSA9PT0gJ2F1dGhvcml0eV9taXNtYXRjaCcgfHwKICAgICAgICAgICAgICAgICAgICAoZXJyb3IubWVzc2FnZSAmJiBlcnJvci5tZXNzYWdlLmluZGV4T2YoJ2F1dGhvcml0eV9taXNtYXRjaCcpICE9PSAtMSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBhbGwgYWNjb3VudHMgLSB0aGV5J3JlIGZyb20gd3JvbmcgYXV0aG9yaXR5CiAgICAgICAgICAgICAgICAgICAgdmFyIGFsbEFjY291bnRzID0gTXNhbEluc3RhbmNlLmdldEFsbEFjY291bnRzKCk7CiAgICAgICAgICAgICAgICAgICAgYWxsQWNjb3VudHMuZm9yRWFjaChmdW5jdGlvbihhY2NvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNc2FsSW5zdGFuY2Uuc2V0QWN0aXZlQWNjb3VudChudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IG51bGw7CiAgICAgICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSBudWxsOwoKICAgICAgICAgICAgICAgIC8vIFJlYWNoaW5nIHRoaXMgY2F0Y2ggbWVhbnMgYSBjYWNoZWQgYWNjb3VudCBtYXRjaGluZyBvdXIKICAgICAgICAgICAgICAgIC8vIHRlbmFudCBXQVMgZm91bmQgKHRoZSBlYXJsaWVyICJObyBhY2NvdW50cyIvIk5vIG1hdGNoaW5nCiAgICAgICAgICAgICAgICAvLyBhY2NvdW50IiByZWplY3Rpb25zIGFib3ZlIGhhcHBlbiBiZWZvcmUgdGhpcyBjYWxsKSBidXQKICAgICAgICAgICAgICAgIC8vIHRoZSBhY3R1YWwgc2lsZW50IHJlbmV3YWwgc3RpbGwgZmFpbGVkIC0gYSByZWFsCiAgICAgICAgICAgICAgICAvLyBjb25uZWN0aW9uIGxvc3MgKGV4cGlyZWQgcmVmcmVzaCB0b2tlbiwgYW4gZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgIC8vIGlzc3VlIGxpa2UgYSBDU1AgYmxvY2tpbmcgTVNBTCdzIHNpbGVudCBpZnJhbWUsIGNvbnNlbnQKICAgICAgICAgICAgICAgIC8vIHJldm9rZWQsIC4uLiksIG5vdCBqdXN0ICJuZXZlciBsb2dnZWQgaW4gb24gdGhpcwogICAgICAgICAgICAgICAgLy8gYnJvd3NlciB5ZXQiLiBNYXJrZWQgc28gdGhlIGNhbGxlciAoVHJ5U2lsZW50TG9naW4gaW4KICAgICAgICAgICAgICAgIC8vIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5qcykgY2FuIHRlbGwgdGhlIHR3byBhcGFydCBhbmQKICAgICAgICAgICAgICAgIC8vIG9ubHkgc3VyZmFjZSBhIG5vdGlmaWNhdGlvbiBmb3IgdGhpcyBvbmUuCiAgICAgICAgICAgICAgICBlcnJvci53YXNDb25uZWN0ZWRCZWZvcmUgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGxvZ2luCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEludGVyYWN0aXZlIGxvZ2luIHZpYSBwb3B1cAogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gVXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMubG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFNc2FsSW5zdGFuY2UpIHsKICAgICAgICAgICAgdmFyIGVycm9yTXNnID0gJ00zNjUgbG9naW4gZmFpbGVkOiBQcm92aWRlciBub3QgaW5pdGlhbGl6ZWQuICcgKwogICAgICAgICAgICAgICAgJ1BsZWFzZSBjaGVjayB0aGF0IFRlbmFudElEIGFuZCBDbGllbnRJRCBhcmUgY29uZmlndXJlZCBpbiBBZG1pbiA+IFN5c3RlbSBDb25maWd1cmF0aW9uICcgKwogICAgICAgICAgICAgICAgJyhDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTo6VGVuYW50SUQgYW5kIENvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpDbGllbnRJRCkuJzsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignW0NvbGxhYm9yYXRpb24gTTM2NV0gJyArIGVycm9yTXNnKTsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihlcnJvck1zZykpOwogICAgICAgIH0KCiAgICAgICAgdmFyIGxvZ2luUmVxdWVzdCA9IHsKICAgICAgICAgICAgc2NvcGVzOiBHcmFwaFNjb3BlcywKICAgICAgICAgICAgcHJvbXB0OiAnc2VsZWN0X2FjY291bnQnCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIE1zYWxJbnN0YW5jZS5sb2dpblBvcHVwKGxvZ2luUmVxdWVzdCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IHJlc3BvbnNlLmFjY291bnQ7CiAgICAgICAgICAgICAgICByZXR1cm4gR2V0Q3VycmVudFVzZXJQcm9maWxlKCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tDb2xsYWJvcmF0aW9uIE0zNjVdIExvZ2luIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlIHx8IGVycm9yKTsKICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBsb2dvdXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gTG9nb3V0IGFuZCBjbGVhciBzZXNzaW9uCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgd2hlbiBsb2dnZWQgb3V0CiAgICAgKi8KICAgIFRhcmdldE5TLmxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoIU1zYWxJbnN0YW5jZSB8fCAhQ3VycmVudEFjY291bnQpIHsKICAgICAgICAgICAgQ3VycmVudEFjY291bnQgPSBudWxsOwogICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSBudWxsOwogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgbG9nb3V0UmVxdWVzdCA9IHsKICAgICAgICAgICAgYWNjb3VudDogQ3VycmVudEFjY291bnQsCiAgICAgICAgICAgIHBvc3RMb2dvdXRSZWRpcmVjdFVyaTogd2luZG93LmxvY2F0aW9uLm9yaWdpbiArIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZQogICAgICAgIH07CgogICAgICAgIHJldHVybiBNc2FsSW5zdGFuY2UubG9nb3V0UG9wdXAobG9nb3V0UmVxdWVzdCkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFjY291bnQgPSBudWxsOwogICAgICAgICAgICAgICAgQ3VycmVudFVzZXJQcm9maWxlID0gbnVsbDsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIENsZWFyIGxvY2FsIHN0YXRlIGV2ZW4gaWYgbG9nb3V0IGZhaWxzCiAgICAgICAgICAgICAgICBDdXJyZW50QWNjb3VudCA9IG51bGw7CiAgICAgICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSBudWxsOwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBpc0xvZ2dlZEluCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIHVzZXIgaXMgbG9nZ2VkIGluCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZSBpZiBsb2dnZWQgaW4KICAgICAqLwogICAgVGFyZ2V0TlMuaXNMb2dnZWRJbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gQ3VycmVudEFjY291bnQgIT09IG51bGw7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q3VycmVudFVzZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgYXV0aGVudGljYXRlZCB1c2VyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFDdXJyZW50QWNjb3VudCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gUHJlZmVyIGNhY2hlZCBHcmFwaCBBUEkgcHJvZmlsZSAoaGFzIGZ1bGwgZGlzcGxheU5hbWUgbGlrZSAiTWF4IEFnZW50IikKICAgICAgICAvLyBpbnN0ZWFkIG9mIE1TQUwgYWNjb3VudC5uYW1lIChzaG9ydCBuYW1lIGxpa2UgIm1heCIpCiAgICAgICAgaWYgKEN1cnJlbnRVc2VyUHJvZmlsZSkgewogICAgICAgICAgICByZXR1cm4gQ3VycmVudFVzZXJQcm9maWxlOwogICAgICAgIH0KICAgICAgICAvLyBGYWxsYmFjayB0byBNU0FMIGFjY291bnQgaW5mbyAoYmVmb3JlIHByb2ZpbGUgaXMgbG9hZGVkKQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGlkOiBDdXJyZW50QWNjb3VudC5sb2NhbEFjY291bnRJZCwKICAgICAgICAgICAgZGlzcGxheU5hbWU6IEN1cnJlbnRBY2NvdW50Lm5hbWUsCiAgICAgICAgICAgIGVtYWlsOiBDdXJyZW50QWNjb3VudC51c2VybmFtZSwKICAgICAgICAgICAgdGVuYW50SWQ6IEN1cnJlbnRBY2NvdW50LnRlbmFudElkCiAgICAgICAgfTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRBdmF0YXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHVzZXIgYXZhdGFyIGZyb20gR3JhcGggQVBJCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEJhc2U2NCBkYXRhIFVSTCBvZiBhdmF0YXIgaW1hZ2UKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0QXZhdGFyID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgcmV0dXJuIEdyYXBoQXBpQ2FsbCgnL3VzZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpICsgJy9waG90by8kdmFsdWUnLCB7CiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InCiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoYmxvYikgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmVhZGVyLm9uZXJyb3IgPSByZWplY3Q7CiAgICAgICAgICAgICAgICByZWFkZXIucmVhZEFzRGF0YVVSTChibG9iKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7CiAgICAgICAgICAgIC8vIDQwNCA9IG5vIHBob3RvLCBsZXQgbWFpbiBtb2R1bGUgaGFuZGxlIGZhbGxiYWNrCiAgICAgICAgICAgIGlmIChlcnJvci5zdGF0dXMgPT09IDQwNCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm8gYXZhdGFyJykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByZXNlbmNlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCB1c2VyIHByZXNlbmNlIHN0YXR1cyBmcm9tIEdyYXBoIEFQSQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gVXNlciBlbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcmVzZW5jZSBvYmplY3Qgd2l0aCBzdGF0dXMgYW5kIGFjdGl2aXR5CiAgICAgKi8KICAgIFRhcmdldE5TLmdldFByZXNlbmNlID0gZnVuY3Rpb24gKFVzZXJJZE9yRW1haWwsIE9yaWdpbmFsRW1haWwpIHsKICAgICAgICAvLyBVc2VySWRPckVtYWlsIGNhbiBiZSBhIEdVSUQgKHVzZXIgSUQpIG9yIGVtYWlsIGFkZHJlc3MKICAgICAgICAvLyBPcmlnaW5hbEVtYWlsIGlzIHRoZSBvcmlnaW5hbCBlbWFpbCBmb3IgbG9nZ2luZyAob3B0aW9uYWwpCiAgICAgICAgdmFyIGRpc3BsYXlFbWFpbCA9IE9yaWdpbmFsRW1haWwgfHwgVXNlcklkT3JFbWFpbDsKCiAgICAgICAgLy8gVXNlIC9tZS9wcmVzZW5jZSBmb3IgY3VycmVudCB1c2VyIChtb3JlIHJlbGlhYmxlKSwgL3VzZXJzL3tpZH0vcHJlc2VuY2UgZm9yIG90aGVycwogICAgICAgIHZhciBjdXJyZW50VXNlckVtYWlsID0gQ3VycmVudEFjY291bnQgPyBDdXJyZW50QWNjb3VudC51c2VybmFtZS50b0xvd2VyQ2FzZSgpIDogJyc7CiAgICAgICAgdmFyIGlzQ3VycmVudFVzZXIgPSAoVXNlcklkT3JFbWFpbC50b0xvd2VyQ2FzZSgpID09PSBjdXJyZW50VXNlckVtYWlsKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAoT3JpZ2luYWxFbWFpbCAmJiBPcmlnaW5hbEVtYWlsLnRvTG93ZXJDYXNlKCkgPT09IGN1cnJlbnRVc2VyRW1haWwpOwogICAgICAgIHZhciBlbmRwb2ludCA9IGlzQ3VycmVudFVzZXIKICAgICAgICAgICAgPyAnL21lL3ByZXNlbmNlJwogICAgICAgICAgICA6ICcvdXNlcnMvJyArIGVuY29kZVVSSUNvbXBvbmVudChVc2VySWRPckVtYWlsKSArICcvcHJlc2VuY2UnOwoKICAgICAgICByZXR1cm4gR3JhcGhBcGlDYWxsKGVuZHBvaW50KQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgLy8gTWFwIE1pY3Jvc29mdCBhdmFpbGFiaWxpdHkgdG8gb3VyIHN0YW5kYXJkIHN0YXR1cyAobWF0Y2hpbmcgVGVhbXMgaWNvbnMpCiAgICAgICAgICAgICAgICB2YXIgc3RhdHVzTWFwID0gewogICAgICAgICAgICAgICAgICAgICdBdmFpbGFibGUnOiAnYXZhaWxhYmxlJywKICAgICAgICAgICAgICAgICAgICAnQXZhaWxhYmxlSWRsZSc6ICdhdmFpbGFibGUnLAogICAgICAgICAgICAgICAgICAgICdCdXN5JzogJ2J1c3knLAogICAgICAgICAgICAgICAgICAgICdCdXN5SWRsZSc6ICdidXN5JywKICAgICAgICAgICAgICAgICAgICAnRG9Ob3REaXN0dXJiJzogJ2RvTm90RGlzdHVyYicsCiAgICAgICAgICAgICAgICAgICAgJ0F3YXknOiAnYXdheScsCiAgICAgICAgICAgICAgICAgICAgJ0JlUmlnaHRCYWNrJzogJ2JlcmlnaHRiYWNrJywKICAgICAgICAgICAgICAgICAgICAnT2ZmbGluZSc6ICdvZmZsaW5lJywKICAgICAgICAgICAgICAgICAgICAnUHJlc2VuY2VVbmtub3duJzogJ3Vua25vd24nCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIEV4dHJhY3Qgd29yayBsb2NhdGlvbiBpZiBhdmFpbGFibGUgKG9mZmljZSwgcmVtb3RlLCB0aW1lT2ZmLCB1bnNwZWNpZmllZCkKICAgICAgICAgICAgICAgIHZhciB3b3JrTG9jYXRpb24gPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKGRhdGEud29ya0xvY2F0aW9uICYmIGRhdGEud29ya0xvY2F0aW9uLndvcmtMb2NhdGlvblR5cGUgJiYKICAgICAgICAgICAgICAgICAgICBkYXRhLndvcmtMb2NhdGlvbi53b3JrTG9jYXRpb25UeXBlICE9PSAndW5zcGVjaWZpZWQnICYmCiAgICAgICAgICAgICAgICAgICAgZGF0YS53b3JrTG9jYXRpb24ud29ya0xvY2F0aW9uVHlwZSAhPT0gJ3Vua25vd25GdXR1cmVWYWx1ZScpIHsKICAgICAgICAgICAgICAgICAgICB3b3JrTG9jYXRpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGRhdGEud29ya0xvY2F0aW9uLndvcmtMb2NhdGlvblR5cGUsICAvLyBvZmZpY2UsIHJlbW90ZSwgdGltZU9mZgogICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IGRhdGEud29ya0xvY2F0aW9uLnNvdXJjZSB8fCAndW5rbm93bicsICAvLyBtYW51YWwsIHNjaGVkdWxlZCwgYXV0b21hdGljCiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlSWQ6IGRhdGEud29ya0xvY2F0aW9uLnBsYWNlSWQgfHwgbnVsbAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c01hcFtkYXRhLmF2YWlsYWJpbGl0eV0gfHwgJ3Vua25vd24nLAogICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiBkYXRhLmFjdGl2aXR5IHx8IGRhdGEuYXZhaWxhYmlsaXR5LAogICAgICAgICAgICAgICAgICAgIHdvcmtMb2NhdGlvbjogd29ya0xvY2F0aW9uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBPT0Ygc3RhdHVzOgogICAgICAgICAgICAgICAgLy8gMS4gVmlhIGFjdGl2aXR5IGZpZWxkIChvbGRlciBBUEkgYmVoYXZpb3IpOiBhY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJwogICAgICAgICAgICAgICAgLy8gMi4gVmlhIG91dE9mT2ZmaWNlU2V0dGluZ3MgKGN1cnJlbnQgQVBJIGJlaGF2aW9yKTogb3V0T2ZPZmZpY2VTZXR0aW5ncy5pc091dE9mT2ZmaWNlID09PSB0cnVlCiAgICAgICAgICAgICAgICB2YXIgaXNPdXRPZk9mZmljZSA9IChyZXN1bHQuYWN0aXZpdHkgPT09ICdPdXRPZk9mZmljZScpIHx8CiAgICAgICAgICAgICAgICAgICAgKGRhdGEub3V0T2ZPZmZpY2VTZXR0aW5ncyAmJiBkYXRhLm91dE9mT2ZmaWNlU2V0dGluZ3MuaXNPdXRPZk9mZmljZSA9PT0gdHJ1ZSk7CgogICAgICAgICAgICAgICAgaWYgKGlzT3V0T2ZPZmZpY2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSBhY3Rpdml0eSB0byAnT3V0T2ZPZmZpY2UnIGZvciBjb25zaXN0ZW50IFVJIGhhbmRsaW5nCiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFjdGl2aXR5ID0gJ091dE9mT2ZmaWNlJzsKICAgICAgICAgICAgICAgICAgICByZXN1bHQub3V0T2ZPZmZpY2UgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ2Fsd2F5c0VuYWJsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRTdGFydERhdGVUaW1lOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRFbmREYXRlVGltZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogZGF0YS5vdXRPZk9mZmljZVNldHRpbmdzID8gZGF0YS5vdXRPZk9mZmljZVNldHRpbmdzLm1lc3NhZ2UgOiBudWxsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB3b3JrTG9jYXRpb24gd2hlbiBPT0YgKE1pY3Jvc29mdCBiZWhhdmlvcikKICAgICAgICAgICAgICAgICAgICByZXN1bHQud29ya0xvY2F0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9KQogICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgLy8gUmV0dXJuIHVua25vd24gLSBkb24ndCByZWplY3QsIGxldCBhYnN0cmFjdGlvbiBsYXllciBoYW5kbGUgcHJvdmlkZXIgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHN0YXR1czogJ3Vua25vd24nLAogICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5OiAnVW5rbm93bicsCiAgICAgICAgICAgICAgICAgICAgd29ya0xvY2F0aW9uOiBudWxsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRPdXRPZk9mZmljZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXByZWNhdGVkIFVzZSBwcmVzZW5jZS5hY3Rpdml0eSA9PT0gJ091dE9mT2ZmaWNlJyBpbnN0ZWFkCiAgICAgKiBAZGVzY3JpcHRpb24gVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gT09GIHN0YXR1cyBpcyBub3cgZGVyaXZlZCBmcm9tIHByZXNlbmNlLgogICAgICogICAgICAgICAgICAgIFRoZSBtYWlsYm94U2V0dGluZ3MgQVBJIHJlcXVpcmVzIEV4Y2hhbmdlIEFkbWluIGZvciBvdGhlciB1c2Vycy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1Byb21pc2U8bnVsbD59IEFsd2F5cyByZXR1cm5zIG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IHVzZXIgcHJvZmlsZSBmcm9tIEdyYXBoIEFQSQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gVXNlciBlbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5nZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgdmFyIHByb2ZpbGUgPSB7fTsKCiAgICAgICAgLy8gR2V0IHVzZXIgcHJvZmlsZQogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy91c2Vycy8nICsgZW5jb2RlVVJJQ29tcG9uZW50KEVtYWlsKSArICc/JHNlbGVjdD1pZCxkaXNwbGF5TmFtZSxnaXZlbk5hbWUsc3VybmFtZSxtYWlsLGpvYlRpdGxlLGRlcGFydG1lbnQsb2ZmaWNlTG9jYXRpb24sYnVzaW5lc3NQaG9uZXMsbW9iaWxlUGhvbmUnKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgcHJvZmlsZSA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogZGF0YS5pZCwKICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogZGF0YS5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICBnaXZlbk5hbWU6IGRhdGEuZ2l2ZW5OYW1lLAogICAgICAgICAgICAgICAgICAgIHN1cm5hbWU6IGRhdGEuc3VybmFtZSwKICAgICAgICAgICAgICAgICAgICBlbWFpbDogZGF0YS5tYWlsIHx8IEVtYWlsLAogICAgICAgICAgICAgICAgICAgIGpvYlRpdGxlOiBkYXRhLmpvYlRpdGxlLAogICAgICAgICAgICAgICAgICAgIGRlcGFydG1lbnQ6IGRhdGEuZGVwYXJ0bWVudCwKICAgICAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbjogZGF0YS5vZmZpY2VMb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICBidXNpbmVzc1Bob25lczogZGF0YS5idXNpbmVzc1Bob25lcyB8fCBbXSwKICAgICAgICAgICAgICAgICAgICBtb2JpbGVQaG9uZTogZGF0YS5tb2JpbGVQaG9uZSwKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyOiBudWxsCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgbWFuYWdlcgogICAgICAgICAgICAgICAgcmV0dXJuIEdyYXBoQXBpQ2FsbCgnL3VzZXJzLycgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpICsgJy9tYW5hZ2VyPyRzZWxlY3Q9ZGlzcGxheU5hbWUsbWFpbCcpCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFuYWdlciBub3QgZm91bmQgb3Igbm90IGFjY2Vzc2libGUgLSBPSwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKG1hbmFnZXJEYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAobWFuYWdlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBwcm9maWxlLm1hbmFnZXIgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBtYW5hZ2VyRGF0YS5kaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IG1hbmFnZXJEYXRhLm1haWwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIC8vIFJlamVjdCBzbyBmYWxsYmFjayBwcm92aWRlciBjYW4gYmUgdXNlZAogICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycm9yKTsKICAgICAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q2hhdExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IFRlYW1zIGNoYXQgZGVlcC1saW5rCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IFRlYW1zIGNoYXQgVVJMCiAgICAgKi8KICAgIFRhcmdldE5TLmdldENoYXRMaW5rID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgLy8gdGVuYW50SWQgaXMgcmVxdWlyZWQgcGVyIE1pY3Jvc29mdCdzIGN1cnJlbnQgZGVlcC1saW5rIGRvY3MKICAgICAgICAvLyAobGVhcm4ubWljcm9zb2Z0LmNvbS8uLi4vZGVlcC1saW5rLXRlYW1zLCAiQ29uZmlndXJlIGRlZXAgbGluawogICAgICAgIC8vIHRvIHN0YXJ0IGEgY2hhdCBtYW51YWxseSIpIC0gd2l0aG91dCBpdCwgVGVhbXMgV2ViIG9wZW5lZCBjb2xkCiAgICAgICAgLy8gZnJvbSBhbiBleHRlcm5hbCBwYWdlIChubyBleGlzdGluZyBzaWduZWQtaW4gdGVuYW50IGNvbnRleHQsCiAgICAgICAgLy8gdW5saWtlIHRoZSBkZXNrdG9wIGNsaWVudCkgY2FuIGZhaWwgdG8gcmVzb2x2ZSB3aGljaCB0ZW5hbnQgdG8KICAgICAgICAvLyBvcGVuIHRoZSBjaGF0IGluLgogICAgICAgIHJldHVybiAnaHR0cHM6Ly90ZWFtcy5taWNyb3NvZnQuY29tL2wvY2hhdC8wLzA/dGVuYW50SWQ9JyArIGVuY29kZVVSSUNvbXBvbmVudChDb25maWcuVGVuYW50SUQpICsKICAgICAgICAgICAgJyZ1c2Vycz0nICsgZW5jb2RlVVJJQ29tcG9uZW50KEVtYWlsKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRDYWxsTGluawogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgVGVhbXMgY2FsbCBkZWVwLWxpbmsKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gVGVhbXMgY2FsbCBVUkwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q2FsbExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gJ2h0dHBzOi8vdGVhbXMubWljcm9zb2Z0LmNvbS9sL2NhbGwvMC8wP3VzZXJzPScgKyBlbmNvZGVVUklDb21wb25lbnQoRW1haWwpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEZyZWVCdXN5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBmcmVlL2J1c3kgZGF0YSBmb3IgdXNlcnMKICAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gRW1haWxzIC0gVXNlciBlbWFpbCBhZGRyZXNzZXMKICAgICAqIEBwYXJhbSB7RGF0ZX0gU3RhcnQgLSBTdGFydCB0aW1lCiAgICAgKiBAcGFyYW0ge0RhdGV9IEVuZCAtIEVuZCB0aW1lCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBPYmplY3Qgd2l0aCBidXN5IHBlcmlvZHMgcGVyIGVtYWlsCiAgICAgKi8KICAgIFRhcmdldE5TLmdldEZyZWVCdXN5ID0gZnVuY3Rpb24gKEVtYWlscywgU3RhcnQsIEVuZCkgewogICAgICAgIC8vIEdldCB0aW1lem9uZQogICAgICAgIHZhciBUaW1lWm9uZSA9IEludGwuRGF0ZVRpbWVGb3JtYXQoKS5yZXNvbHZlZE9wdGlvbnMoKS50aW1lWm9uZSB8fCAnRXVyb3BlL0Jlcmxpbic7CgogICAgICAgIC8vIEZvcm1hdCBkYXRlIGFzIGxvY2FsIElTTyBzdHJpbmcgKHdpdGhvdXQgVVRDIGNvbnZlcnNpb24pCiAgICAgICAgLy8gdG9JU09TdHJpbmcoKSBjb252ZXJ0cyB0byBVVEMgd2hpY2ggY2F1c2VzIHRpbWV6b25lIG9mZnNldCBpc3N1ZXMKICAgICAgICBmdW5jdGlvbiB0b0xvY2FsSVNPU3RyaW5nKGRhdGUpIHsKICAgICAgICAgICAgdmFyIHBhZCA9IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4gOiBuOyB9OwogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpICsgJy0nICsKICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldE1vbnRoKCkgKyAxKSArICctJyArCiAgICAgICAgICAgICAgICAgICBwYWQoZGF0ZS5nZXREYXRlKCkpICsgJ1QnICsKICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldEhvdXJzKCkpICsgJzonICsKICAgICAgICAgICAgICAgICAgIHBhZChkYXRlLmdldE1pbnV0ZXMoKSkgKyAnOicgKwogICAgICAgICAgICAgICAgICAgcGFkKGRhdGUuZ2V0U2Vjb25kcygpKTsKICAgICAgICB9CgogICAgICAgIHZhciByZXF1ZXN0Qm9keSA9IHsKICAgICAgICAgICAgc2NoZWR1bGVzOiBFbWFpbHMsCiAgICAgICAgICAgIHN0YXJ0VGltZTogewogICAgICAgICAgICAgICAgZGF0ZVRpbWU6IHRvTG9jYWxJU09TdHJpbmcoU3RhcnQpLAogICAgICAgICAgICAgICAgdGltZVpvbmU6IFRpbWVab25lCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZFRpbWU6IHsKICAgICAgICAgICAgICAgIGRhdGVUaW1lOiB0b0xvY2FsSVNPU3RyaW5nKEVuZCksCiAgICAgICAgICAgICAgICB0aW1lWm9uZTogVGltZVpvbmUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXZhaWxhYmlsaXR5Vmlld0ludGVydmFsOiAzMAogICAgICAgIH07CgogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy9tZS9jYWxlbmRhci9nZXRTY2hlZHVsZScsIHsKICAgICAgICAgICAgbWV0aG9kOiAnUE9TVCcsCiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RCb2R5KQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwoKICAgICAgICAgICAgaWYgKGRhdGEudmFsdWUpIHsKICAgICAgICAgICAgICAgIGRhdGEudmFsdWUuZm9yRWFjaChmdW5jdGlvbiAoc2NoZWR1bGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW1haWwgPSBzY2hlZHVsZS5zY2hlZHVsZUlkOwogICAgICAgICAgICAgICAgICAgIHZhciBidXN5UGVyaW9kcyA9IFtdOwoKICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZSBzY2hlZHVsZUl0ZW1zIGZvciBhY3R1YWwgYnVzeSBwZXJpb2RzCiAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxlLnNjaGVkdWxlSXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUuc2NoZWR1bGVJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zdGF0dXMgIT09ICdmcmVlJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgQVBJIHRpbWVzIHRvIHByb3BlciBEYXRlIG9iamVjdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHcmFwaCBBUEkgcmV0dXJucyB0aW1lcyBpbiBVVEMgKHRpbWVab25lOiAnVVRDJyksIGJ1dCB3aXRob3V0ICdaJyBzdWZmaXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGFwcGVuZCAnWicgc28gSmF2YVNjcmlwdCBwYXJzZXMgdGhlbSBhcyBVVEMsIG5vdCBsb2NhbCB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0RGF0ZVRpbWUgPSBpdGVtLnN0YXJ0LmRhdGVUaW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbmREYXRlVGltZSA9IGl0ZW0uZW5kLmRhdGVUaW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aW1lem9uZSBpcyBVVEMsIGFwcGVuZCBaIHNvIEpTIHBhcnNlcyBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5zdGFydC50aW1lWm9uZSA9PT0gJ1VUQycgJiYgIXN0YXJ0RGF0ZVRpbWUuZW5kc1dpdGgoJ1onKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydERhdGVUaW1lID0gc3RhcnREYXRlVGltZSArICdaJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZW5kLnRpbWVab25lID09PSAnVVRDJyAmJiAhZW5kRGF0ZVRpbWUuZW5kc1dpdGgoJ1onKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlVGltZSA9IGVuZERhdGVUaW1lICsgJ1onOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udmVydCB0byBEYXRlIGFuZCBiYWNrIHRvIElTTyBzdHJpbmcgZm9yIGNvbnNpc3RlbnQgY29tcGFyaXNvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGVUaW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IG5ldyBEYXRlKGVuZERhdGVUaW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzeVBlcmlvZHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUudG9JU09TdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBlbmREYXRlLnRvSVNPU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogaXRlbS5zdGF0dXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICByZXN1bHRbZW1haWxdID0gYnVzeVBlcmlvZHM7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENyZWF0ZSBvbmxpbmUgbWVldGluZyAobGVnYWN5IC0gdXNlIGNyZWF0ZUNhbGVuZGFyRXZlbnQpCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGV0YWlscyAtIE1lZXRpbmcgZGV0YWlscwogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gTWVldGluZyBpbmZvCiAgICAgKi8KICAgIFRhcmdldE5TLmNyZWF0ZU1lZXRpbmcgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIC8vIERlbGVnYXRlIHRvIGNyZWF0ZUNhbGVuZGFyRXZlbnQgd2l0aCBpc09ubGluZU1lZXRpbmc9dHJ1ZQogICAgICAgIC8vIFVzZSAkLmV4dGVuZCB0byBhdm9pZCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgRGV0YWlscyBvYmplY3QKICAgICAgICB2YXIgTWVldGluZ0RldGFpbHMgPSAkLmV4dGVuZCh7fSwgRGV0YWlscywgeyBpc09ubGluZU1lZXRpbmc6IHRydWUgfSk7CiAgICAgICAgcmV0dXJuIFRhcmdldE5TLmNyZWF0ZUNhbGVuZGFyRXZlbnQoTWVldGluZ0RldGFpbHMpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGNyZWF0ZUNhbGVuZGFyRXZlbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuTTM2NQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGNhbGVuZGFyIGV2ZW50ICh3aXRoIG9wdGlvbmFsIFRlYW1zIG1lZXRpbmcpCiAgICAgKiBAcGFyYW0ge09iamVjdH0gRGV0YWlscyAtIEV2ZW50IGRldGFpbHMKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLnN1YmplY3QgLSBFdmVudCBzdWJqZWN0CiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRGV0YWlscy5zdGFydERhdGVUaW1lIC0gU3RhcnQgdGltZSAoSVNPIHN0cmluZykKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBEZXRhaWxzLmVuZERhdGVUaW1lIC0gRW5kIHRpbWUgKElTTyBzdHJpbmcpCiAgICAgKiBAcGFyYW0ge0FycmF5PFN0cmluZz59IERldGFpbHMuYXR0ZW5kZWVzIC0gQXR0ZW5kZWUgZW1haWwgYWRkcmVzc2VzCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IERldGFpbHMuaXNPbmxpbmVNZWV0aW5nIC0gV2hldGhlciB0byBjcmVhdGUgVGVhbXMgbWVldGluZwogICAgICogQHBhcmFtIHtTdHJpbmd9IFtEZXRhaWxzLmxvY2F0aW9uXSAtIExvY2F0aW9uIGZvciBvbi1zaXRlIG1lZXRpbmdzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gW0RldGFpbHMudGltZVpvbmVdIC0gSUFOQSB0aW1lem9uZQogICAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gRXZlbnQgaW5mbyB3aXRoIGlkIGFuZCBvcHRpb25hbCBqb2luVXJsCiAgICAgKi8KICAgIFRhcmdldE5TLmNyZWF0ZUNhbGVuZGFyRXZlbnQgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIHZhciBUaW1lWm9uZSA9IERldGFpbHMudGltZVpvbmUgfHwgSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lIHx8ICdFdXJvcGUvQmVybGluJzsKCiAgICAgICAgdmFyIGV2ZW50Qm9keSA9IHsKICAgICAgICAgICAgc3ViamVjdDogRGV0YWlscy5zdWJqZWN0IHx8ICdabnVueSBBcHBvaW50bWVudCcsCiAgICAgICAgICAgIHN0YXJ0OiB7CiAgICAgICAgICAgICAgICBkYXRlVGltZTogRGV0YWlscy5zdGFydERhdGVUaW1lLAogICAgICAgICAgICAgICAgdGltZVpvbmU6IFRpbWVab25lCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVuZDogewogICAgICAgICAgICAgICAgZGF0ZVRpbWU6IERldGFpbHMuZW5kRGF0ZVRpbWUsCiAgICAgICAgICAgICAgICB0aW1lWm9uZTogVGltZVpvbmUKICAgICAgICAgICAgfSwKICAgICAgICAgICAgYXR0ZW5kZWVzOiAoRGV0YWlscy5hdHRlbmRlZXMgfHwgW10pLm1hcChmdW5jdGlvbiAoZW1haWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgZW1haWxBZGRyZXNzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3M6IGVtYWlsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmVxdWlyZWQnCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KQogICAgICAgIH07CgogICAgICAgIC8vIEFkZCBUZWFtcyBtZWV0aW5nIGlmIHJlcXVlc3RlZAogICAgICAgIGlmIChEZXRhaWxzLmlzT25saW5lTWVldGluZykgewogICAgICAgICAgICBldmVudEJvZHkuaXNPbmxpbmVNZWV0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgZXZlbnRCb2R5Lm9ubGluZU1lZXRpbmdQcm92aWRlciA9ICd0ZWFtc0ZvckJ1c2luZXNzJzsKICAgICAgICB9CgogICAgICAgIC8vIEFkZCBsb2NhdGlvbiBmb3Igb24tc2l0ZSBtZWV0aW5ncwogICAgICAgIGlmIChEZXRhaWxzLmxvY2F0aW9uKSB7CiAgICAgICAgICAgIGV2ZW50Qm9keS5sb2NhdGlvbiA9IHsKICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBEZXRhaWxzLmxvY2F0aW9uCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gR3JhcGhBcGlDYWxsKCcvbWUvZXZlbnRzJywgewogICAgICAgICAgICBtZXRob2Q6ICdQT1NUJywKICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnRCb2R5KQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGlkOiBkYXRhLmlkLAogICAgICAgICAgICAgICAgc3ViamVjdDogZGF0YS5zdWJqZWN0LAogICAgICAgICAgICAgICAgc3RhcnREYXRlVGltZTogZGF0YS5zdGFydC5kYXRlVGltZSwKICAgICAgICAgICAgICAgIGVuZERhdGVUaW1lOiBkYXRhLmVuZC5kYXRlVGltZSwKICAgICAgICAgICAgICAgIHRpbWVab25lOiBkYXRhLnN0YXJ0LnRpbWVab25lLAogICAgICAgICAgICAgICAgam9pblVybDogZGF0YS5vbmxpbmVNZWV0aW5nID8gZGF0YS5vbmxpbmVNZWV0aW5nLmpvaW5VcmwgOiBudWxsLAogICAgICAgICAgICAgICAgd2ViTGluazogZGF0YS53ZWJMaW5rLAogICAgICAgICAgICAgICAgb3JnYW5pemVyOiBDdXJyZW50QWNjb3VudCA/IEN1cnJlbnRBY2NvdW50LnVzZXJuYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIGF0dGVuZGVlczogRGV0YWlscy5hdHRlbmRlZXMgfHwgW10KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBkZWxldGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLk0zNjUKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIERlbGV0ZS9jYW5jZWwgY2FsZW5kYXIgZXZlbnQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFdmVudElkIC0gR3JhcGggZXZlbnQgSUQKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFN1Y2Nlc3Mgc3RhdHVzCiAgICAgKi8KICAgIFRhcmdldE5TLmRlbGV0ZUNhbGVuZGFyRXZlbnQgPSBmdW5jdGlvbiAoRXZlbnRJZCkgewogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy9tZS9ldmVudHMvJyArIGVuY29kZVVSSUNvbXBvbmVudChFdmVudElkKSwgewogICAgICAgICAgICBtZXRob2Q6ICdERUxFVEUnCiAgICAgICAgfSkudGhlbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlCiAgICAgICAgICAgIH07CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBIZWxwZXIgRnVuY3Rpb25zCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGN1cnJlbnQgdXNlciBwcm9maWxlIGZyb20gR3JhcGggQVBJCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBVc2VyIHByb2ZpbGUKICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VycmVudFVzZXJQcm9maWxlKCkgewogICAgICAgIHJldHVybiBHcmFwaEFwaUNhbGwoJy9tZT8kc2VsZWN0PWlkLGRpc3BsYXlOYW1lLG1haWwsam9iVGl0bGUnKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoZGF0YSkgewogICAgICAgICAgICAgICAgLy8gQ2FjaGUgcHJvZmlsZSBmb3IgZ2V0Q3VycmVudFVzZXIoKSAtIGhhcyBmdWxsIGRpc3BsYXlOYW1lCiAgICAgICAgICAgICAgICBDdXJyZW50VXNlclByb2ZpbGUgPSB7CiAgICAgICAgICAgICAgICAgICAgaWQ6IGRhdGEuaWQsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IGRhdGEuZGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICAgICAgZW1haWw6IGRhdGEubWFpbCB8fCBDdXJyZW50QWNjb3VudC51c2VybmFtZSwKICAgICAgICAgICAgICAgICAgICBqb2JUaXRsZTogZGF0YS5qb2JUaXRsZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBDdXJyZW50VXNlclByb2ZpbGU7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBGYWxsYmFjayB0byBhY2NvdW50IGluZm8KICAgICAgICAgICAgICAgIEN1cnJlbnRVc2VyUHJvZmlsZSA9IHsKICAgICAgICAgICAgICAgICAgICBpZDogQ3VycmVudEFjY291bnQubG9jYWxBY2NvdW50SWQsCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IEN1cnJlbnRBY2NvdW50Lm5hbWUsCiAgICAgICAgICAgICAgICAgICAgZW1haWw6IEN1cnJlbnRBY2NvdW50LnVzZXJuYW1lCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIEN1cnJlbnRVc2VyUHJvZmlsZTsKICAgICAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGlmIGVuZHBvaW50IGlzIGluIHRoZSB3aGl0ZWxpc3QKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbmRwb2ludCAtIEFQSSBlbmRwb2ludCB0byB2YWxpZGF0ZQogICAgICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWYgYWxsb3dlZAogICAgICovCiAgICBmdW5jdGlvbiBJc0VuZHBvaW50QWxsb3dlZChFbmRwb2ludCkgewogICAgICAgIC8vIFNlY3VyaXR5OiB0aGUgW15cL10rIHNlZ21lbnRzIGFib3ZlIG9ubHkgcmVqZWN0IGEgbGl0ZXJhbCAnLycgLQogICAgICAgIC8vIGFuIGVuZHBvaW50IGxpa2UgJy91c2Vycy9mb28lMmYuLiUyZmFkbWluJyBzdGlsbCBtYXRjaGVzIGFzIGEKICAgICAgICAvLyBzaW5nbGUgc2VnbWVudCBoZXJlLCBhbmQgY291bGQgYmUgZGVjb2RlZCBhIHNlY29uZCB0aW1lCiAgICAgICAgLy8gZG93bnN0cmVhbSBpbnRvIGV4dHJhIHBhdGggc2VnbWVudHMgdGhhdCBlc2NhcGUgdGhlIGludGVuZGVkCiAgICAgICAgLy8gcmVzb3VyY2UuIFJlamVjdCBlbmNvZGVkIHNsYXNoZXMgb3V0cmlnaHQuCiAgICAgICAgaWYgKCAvJTJmL2kudGVzdChFbmRwb2ludCkgfHwgLyU1Yy9pLnRlc3QoRW5kcG9pbnQpICkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IEFsbG93ZWRFbmRwb2ludFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChBbGxvd2VkRW5kcG9pbnRQYXR0ZXJuc1tpXS50ZXN0KEVuZHBvaW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBNYWtlIEdyYXBoIEFQSSBjYWxsIHdpdGggYXV0b21hdGljIHRva2VuIGFjcXVpc2l0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW5kcG9pbnQgLSBBUEkgZW5kcG9pbnQgKGUuZy4sICcvbWUvcGhvdG8vJHZhbHVlJykKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbT3B0aW9uc10gLSBGZXRjaCBvcHRpb25zCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTwqPn0gQVBJIHJlc3BvbnNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdyYXBoQXBpQ2FsbChFbmRwb2ludCwgT3B0aW9ucykgewogICAgICAgIE9wdGlvbnMgPSBPcHRpb25zIHx8IHt9OwoKICAgICAgICBpZiAoIU1zYWxJbnN0YW5jZSB8fCAhQ3VycmVudEFjY291bnQpIHsKICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm90IGF1dGhlbnRpY2F0ZWQnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBTZWN1cml0eTogVmFsaWRhdGUgZW5kcG9pbnQgYWdhaW5zdCB3aGl0ZWxpc3QKICAgICAgICBpZiAoIUlzRW5kcG9pbnRBbGxvd2VkKEVuZHBvaW50KSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdFbmRwb2ludCBub3QgYWxsb3dlZDogJyArIEVuZHBvaW50KSk7CiAgICAgICAgfQoKICAgICAgICB2YXIgdG9rZW5SZXF1ZXN0ID0gewogICAgICAgICAgICBhY2NvdW50OiBDdXJyZW50QWNjb3VudCwKICAgICAgICAgICAgc2NvcGVzOiBHcmFwaFNjb3BlcwogICAgICAgIH07CgogICAgICAgIHJldHVybiBNc2FsSW5zdGFuY2UuYWNxdWlyZVRva2VuU2lsZW50KHRva2VuUmVxdWVzdCkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikgewogICAgICAgICAgICAgICAgLy8gVG9rZW4gZXhwaXJlZCBvciBuZWVkcyBpbnRlcmFjdGlvbgogICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgbXNhbC5JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1zYWxJbnN0YW5jZS5hY3F1aXJlVG9rZW5Qb3B1cCh0b2tlblJlcXVlc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uICh0b2tlblJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB2YXIgaGVhZGVycyA9IHsKICAgICAgICAgICAgICAgICAgICAnQXV0aG9yaXphdGlvbic6ICdCZWFyZXIgJyArIHRva2VuUmVzcG9uc2UuYWNjZXNzVG9rZW4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgaWYgKE9wdGlvbnMuYm9keSkgewogICAgICAgICAgICAgICAgICAgIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaChHcmFwaEJhc2VVcmwgKyBFbmRwb2ludCwgewogICAgICAgICAgICAgICAgICAgIG1ldGhvZDogT3B0aW9ucy5tZXRob2QgfHwgJ0dFVCcsCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyczogaGVhZGVycywKICAgICAgICAgICAgICAgICAgICBib2R5OiBPcHRpb25zLmJvZHkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBERUxFVEUgKDIwNCBObyBDb250ZW50KQogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gMjA0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSGFuZGxlIGVycm9ycwogICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5vaykgewogICAgICAgICAgICAgICAgICAgIHZhciBlcnJvciA9IG5ldyBFcnJvcignR3JhcGggQVBJIGVycm9yOiAnICsgcmVzcG9uc2Uuc3RhdHVzKTsKICAgICAgICAgICAgICAgICAgICBlcnJvci5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gSGFuZGxlIGJpbmFyeSByZXNwb25zZSAoYXZhdGFyKQogICAgICAgICAgICAgICAgaWYgKE9wdGlvbnMucmVzcG9uc2VUeXBlID09PSAnYmxvYicpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBKU09OIHJlc3BvbnNlCiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOwogICAgICAgICAgICB9KTsKICAgIH0KCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFJlZ2lzdGVyIFByb3ZpZGVyCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBBdXRvLXJlZ2lzdGVyIHdoZW4gc2NyaXB0IGxvYWRzCiAgICBpZiAoQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uICYmIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5SZWdpc3RlclByb3ZpZGVyKSB7CiAgICAgICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlJlZ2lzdGVyUHJvdmlkZXIoJ00zNjUnLCBUYXJnZXROUyk7CiAgICB9CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5NMzY1IHx8IHt9KSk7Cg==</File>
        <File Permission="660" Location="var/httpd/htdocs/js/Core.Agent.Collaboration.Provider.Znuny.js" Encode="Base64">Ly8gLS0KLy8gQ29weXJpZ2h0IChDKSAyMDI2IHdvbGtpZy5pdCwgaHR0cHM6Ly93b2xraWcuaXQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKLyoqCiAqIEBuYW1lc3BhY2UgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIKICogQGRlc2NyaXB0aW9uCiAqICAgICAgWm51bnkgUHJvdmlkZXIgZm9yIENvbGxhYm9yYXRpb24gQWRkLW9uCiAqCiAqICAgICAgVGhpcyBwcm92aWRlciB1c2VzIGxvY2FsIFpudW55IGRhdGEgKEN1c3RvbWVyVXNlciwgVXNlcikgYXMgYSBmYWxsYmFjawogKiAgICAgIHdoZW4gdGhlIHByaW1hcnkgcHJvdmlkZXIgKGUuZy4sIE0zNjUpIGZhaWxzIG9yIGlzIG5vdCBhdmFpbGFibGUuCiAqCiAqICAgICAgRmVhdHVyZXM6CiAqICAgICAgLSBObyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCAodXNlcyBjdXJyZW50IFpudW55IHNlc3Npb24pCiAqICAgICAgLSBTVkcgYXZhdGFycyB3aXRoIGluaXRpYWxzCiAqICAgICAgLSBQcm9maWxlIGRhdGEgZnJvbSBDdXN0b21lclVzZXIvVXNlciBkYXRhYmFzZQogKiAgICAgIC0gTm8gcHJlc2VuY2UsIGNoYXQsIGNhbGwsIG9yIG1lZXRpbmcgZmVhdHVyZXMKICoKICogICAgICBUeXBpY2FsIHVzZSBjYXNlOiBGYWxsYmFjayBwcm92aWRlciB3aGVuIE0zNjUgdXNlciBub3QgZm91bmQKICovCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CkNvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiA9IENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbiB8fCB7fTsKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyID0gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyIHx8IHt9OwoKQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55ID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJpdmF0ZSBWYXJpYWJsZXMKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IHVzZXIgKGZyb20gWm51bnkgc2Vzc2lvbikKICAgICAqLwogICAgdmFyIEN1cnJlbnRVc2VyID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAZGVzY3JpcHRpb24gQ2FjaGUgZm9yIHByb2ZpbGUgZGF0YSB0byBhdm9pZCByZXBlYXRlZCBBSkFYIGNhbGxzCiAgICAgKi8KICAgIHZhciBQcm9maWxlQ2FjaGUgPSB7fTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFByb3ZpZGVyIENhcGFiaWxpdGllcwogICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAZGVzY3JpcHRpb24gQ2FwYWJpbGl0aWVzIHRoaXMgcHJvdmlkZXIgc3VwcG9ydHMKICAgICAqLwogICAgVGFyZ2V0TlMuY2FwYWJpbGl0aWVzID0gewogICAgICAgIGF2YXRhcjogdHJ1ZSwgICAgICAgICAgIC8vIFNWRyB3aXRoIGluaXRpYWxzCiAgICAgICAgcHJlc2VuY2U6IGZhbHNlLCAgICAgICAgLy8gTm8gbGl2ZSBwcmVzZW5jZSBpbiBabnVueQogICAgICAgIHByb2ZpbGU6IHRydWUsICAgICAgICAgIC8vIEN1c3RvbWVyVXNlci9Vc2VyIGRhdGEKICAgICAgICBjaGF0OiBmYWxzZSwgICAgICAgICAgICAvLyBObyBjaGF0IGludGVncmF0aW9uCiAgICAgICAgY2FsbDogZmFsc2UsICAgICAgICAgICAgLy8gTm8gY2FsbCBpbnRlZ3JhdGlvbgogICAgICAgIGZyZWVCdXN5OiBmYWxzZSwgICAgICAgIC8vIE5vIGNhbGVuZGFyIGludGVncmF0aW9uCiAgICAgICAgY3JlYXRlTWVldGluZzogZmFsc2UsCiAgICAgICAgY3JlYXRlQ2FsZW5kYXJFdmVudDogZmFsc2UsCiAgICAgICAgZGVsZXRlQ2FsZW5kYXJFdmVudDogZmFsc2UsCiAgICAgICAgb3V0T2ZPZmZpY2U6IHRydWUgICAgICAgLy8gWm51bnkgYWdlbnQgT09GIHZpYSB1c2VyIHByZWZlcmVuY2VzCiAgICB9OwoKICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgLy8gUHJvdmlkZXIgSW50ZXJmYWNlIEltcGxlbWVudGF0aW9uCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvKioKICAgICAqIEBuYW1lIGluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemUgdGhlIFpudW55IHByb3ZpZGVyCiAgICAgKiBAcGFyYW0ge09iamVjdH0gQ29uZmlnIC0gUHJvdmlkZXIgY29uZmlndXJhdGlvbiAobm90IHVzZWQpCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVzb2x2ZXMgaW1tZWRpYXRlbHkKICAgICAqLwogICAgVGFyZ2V0TlMuaW5pdCA9IGZ1bmN0aW9uIChDb25maWcpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgdHJ5U2lsZW50TG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIFRyeSBzaWxlbnQgbG9naW4gLSBhbHdheXMgc3VjY2VlZHMgKHVzZXMgWm51bnkgc2Vzc2lvbikKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMudHJ5U2lsZW50TG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdXNlciBmcm9tIENvbGxhYm9yYXRpb24gY29uZmlnIChzZXQgYnkgYmFja2VuZCkKICAgICAgICB2YXIgQ29sbGFiQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdDb2xsYWJvcmF0aW9uJykgfHwge307CgogICAgICAgIEN1cnJlbnRVc2VyID0gewogICAgICAgICAgICBpZDogQ29yZS5Db25maWcuR2V0KCdVc2VySUQnKSB8fCAnem51bnktdXNlcicsCiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBDb2xsYWJDb25maWcuVXNlckZ1bGxuYW1lIHx8IENvcmUuQ29uZmlnLkdldCgnVXNlckZ1bGxuYW1lJykgfHwgJ1pudW55IEFnZW50JywKICAgICAgICAgICAgZW1haWw6IENvbGxhYkNvbmZpZy5Vc2VyRW1haWwgfHwgQ29yZS5Db25maWcuR2V0KCdVc2VyRW1haWwnKSB8fCAnJywKICAgICAgICAgICAgbG9naW5OYW1lOiBDb3JlLkNvbmZpZy5HZXQoJ1VzZXJMb2dpbicpIHx8ICcnCiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDdXJyZW50VXNlcik7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgbG9naW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEludGVyYWN0aXZlIGxvZ2luIC0gc2FtZSBhcyBzaWxlbnQgbG9naW4KICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMubG9naW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgLy8gU2FtZSBhcyBzaWxlbnQgbG9naW4gZm9yIFpudW55IHByb3ZpZGVyCiAgICAgICAgcmV0dXJuIFRhcmdldE5TLnRyeVNpbGVudExvZ2luKCk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgbG9nb3V0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBMb2dvdXQgLSBqdXN0IGNsZWFycyBsb2NhbCBzdGF0ZQogICAgICogQHJldHVybnMge1Byb21pc2V9IFJlc29sdmVzIGltbWVkaWF0ZWx5CiAgICAgKi8KICAgIFRhcmdldE5TLmxvZ291dCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDdXJyZW50VXNlciA9IG51bGw7CiAgICAgICAgUHJvZmlsZUNhY2hlID0ge307CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGlzTG9nZ2VkSW4KICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIENoZWNrIGxvZ2luIHN0YXR1cyAtIGFsd2F5cyB0cnVlIGlmIFpudW55IHNlc3Npb24gZXhpc3RzCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gVHJ1ZQogICAgICovCiAgICBUYXJnZXROUy5pc0xvZ2dlZEluID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEN1cnJlbnRVc2VyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgY3VycmVudCB1c2VyCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fG51bGx9IEN1cnJlbnQgdXNlciBvYmplY3QKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q3VycmVudFVzZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIEN1cnJlbnRVc2VyOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEF2YXRhcgogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGF2YXRhciAtIHVzZXMgY2VudHJhbCBTVkcgZ2VuZXJhdGlvbiB3aXRoIGluaXRpYWxzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPFN0cmluZz59IEJhc2U2NCBkYXRhIFVSTCBvZiBTVkcgYXZhdGFyCiAgICAgKi8KICAgIFRhcmdldE5TLmdldEF2YXRhciA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIC8vIEZpcnN0IHRyeSB0byBnZXQgcHJvZmlsZSB0byB1c2UgcmVhbCBuYW1lIGZvciBpbml0aWFscwogICAgICAgIHJldHVybiBUYXJnZXROUy5nZXRQcm9maWxlKEVtYWlsKQogICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoUHJvZmlsZSkgewogICAgICAgICAgICAgICAgLy8gVXNlIGNlbnRyYWwgZmFsbGJhY2sgYXZhdGFyIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICByZXR1cm4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsLCBQcm9maWxlLmRpc3BsYXlOYW1lKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIEZhbGxiYWNrOiB1c2UgZW1haWwgZm9yIGluaXRpYWxzCiAgICAgICAgICAgICAgICByZXR1cm4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkdldEZhbGxiYWNrQXZhdGFyVXJsKEVtYWlsKTsKICAgICAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0UHJlc2VuY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBwcmVzZW5jZSAtIGFsd2F5cyByZXR1cm5zIHVua25vd24gKG5vdCBzdXBwb3J0ZWQpCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFByZXNlbmNlIG9iamVjdCB3aXRoIHVua25vd24gc3RhdHVzCiAgICAgKi8KICAgIFRhcmdldE5TLmdldFByZXNlbmNlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7CiAgICAgICAgICAgIHN0YXR1czogJ3Vua25vd24nLAogICAgICAgICAgICBhY3Rpdml0eTogJ1Vua25vd24nCiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0T3V0T2ZPZmZpY2UKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBvdXQtb2Ytb2ZmaWNlIHN0YXR1cyBmcm9tIFpudW55IGFnZW50IHByZWZlcmVuY2VzCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdHxudWxsPn0gT09GIG9iamVjdCBvciBudWxsIGlmIG5vdCBhY3RpdmUKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0T3V0T2ZPZmZpY2UgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICBpZiAoIUVtYWlsKSB7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldE91dE9mT2ZmaWNlJywKICAgICAgICAgICAgICAgICAgICBFbWFpbDogRW1haWwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKFJlc3BvbnNlLk91dE9mT2ZmaWNlIHx8IG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdqc29uJwogICAgICAgICAgICApOwogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldFByb2ZpbGUKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBwcm9maWxlIGZyb20gWm51bnkgZGF0YWJhc2UgKEN1c3RvbWVyVXNlciBvciBVc2VyKQogICAgICogQHBhcmFtIHtTdHJpbmd9IEVtYWlsIC0gVXNlciBlbWFpbCBhZGRyZXNzCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9maWxlIG9iamVjdAogICAgICovCiAgICBUYXJnZXROUy5nZXRQcm9maWxlID0gZnVuY3Rpb24gKEVtYWlsKSB7CiAgICAgICAgaWYgKCFFbWFpbCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdObyBlbWFpbCBwcm92aWRlZCcpKTsKICAgICAgICB9CgogICAgICAgIHZhciBMb3dlckVtYWlsID0gRW1haWwudG9Mb3dlckNhc2UoKTsKCiAgICAgICAgLy8gU0VDVVJJVFkgKFM5KTogUmUtZW5hYmxlZCBjYWNoZSAod2FzIGRpc2FibGVkIGZvciB0ZXN0aW5nKQogICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0CiAgICAgICAgaWYgKFByb2ZpbGVDYWNoZVtMb3dlckVtYWlsXSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFByb2ZpbGVDYWNoZVtMb3dlckVtYWlsXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIGJhY2tlbmQgdG8gZ2V0IHByb2ZpbGUKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q29sbGFib3JhdGlvbkFKQVgnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0dldFVzZXJQcm9maWxlJywKICAgICAgICAgICAgICAgICAgICBFbWFpbDogRW1haWwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UgJiYgUmVzcG9uc2UuU3VjY2VzcyAmJiBSZXNwb25zZS5Qcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUNhY2hlW0xvd2VyRW1haWxdID0gUmVzcG9uc2UuUHJvZmlsZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShSZXNwb25zZS5Qcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gbWluaW1hbCBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBNaW5pbWFsUHJvZmlsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBFbWFpbC5zcGxpdCgnQCcpWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW1haWw6IEVtYWlsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVDYWNoZVtMb3dlckVtYWlsXSA9IE1pbmltYWxQcm9maWxlOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKE1pbmltYWxQcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgJ2pzb24nCiAgICAgICAgICAgICk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgZ2V0Q2hhdExpbmsKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uIEdldCBjaGF0IGxpbmsgLSBub3Qgc3VwcG9ydGVkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRW1haWwgLSBVc2VyIGVtYWlsIGFkZHJlc3MKICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG51bGwKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0Q2hhdExpbmsgPSBmdW5jdGlvbiAoRW1haWwpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBnZXRDYWxsTGluawogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gR2V0IGNhbGwgbGluayAtIG5vdCBzdXBwb3J0ZWQKICAgICAqIEBwYXJhbSB7U3RyaW5nfSBFbWFpbCAtIFVzZXIgZW1haWwgYWRkcmVzcwogICAgICogQHJldHVybnMge1N0cmluZ30gbnVsbAogICAgICovCiAgICBUYXJnZXROUy5nZXRDYWxsTGluayA9IGZ1bmN0aW9uIChFbWFpbCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIGdldEZyZWVCdXN5CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBHZXQgZnJlZS9idXN5IGRhdGEgLSBub3Qgc3VwcG9ydGVkCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBFbXB0eSByZXN1bHQKICAgICAqLwogICAgVGFyZ2V0TlMuZ2V0RnJlZUJ1c3kgPSBmdW5jdGlvbiAoRW1haWxzLCBTdGFydCwgRW5kKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCcpKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBjcmVhdGVNZWV0aW5nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBDcmVhdGUgbWVldGluZyAtIG5vdCBzdXBwb3J0ZWQKICAgICAqIEByZXR1cm5zIHtQcm9taXNlfSBSZWplY3RlZCBwcm9taXNlCiAgICAgKi8KICAgIFRhcmdldE5TLmNyZWF0ZU1lZXRpbmcgPSBmdW5jdGlvbiAoRGV0YWlscykgewogICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ05vdCBzdXBwb3J0ZWQnKSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgY3JlYXRlQ2FsZW5kYXJFdmVudAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5Qcm92aWRlci5abnVueQogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlIGNhbGVuZGFyIGV2ZW50IC0gbm90IHN1cHBvcnRlZAogICAgICogQHJldHVybnMge1Byb21pc2V9IFJlamVjdGVkIHByb21pc2UKICAgICAqLwogICAgVGFyZ2V0TlMuY3JlYXRlQ2FsZW5kYXJFdmVudCA9IGZ1bmN0aW9uIChEZXRhaWxzKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignTm90IHN1cHBvcnRlZCcpKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBkZWxldGVDYWxlbmRhckV2ZW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlByb3ZpZGVyLlpudW55CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbiBEZWxldGUgY2FsZW5kYXIgZXZlbnQgLSBub3Qgc3VwcG9ydGVkCiAgICAgKiBAcmV0dXJucyB7UHJvbWlzZX0gUmVqZWN0ZWQgcHJvbWlzZQogICAgICovCiAgICBUYXJnZXROUy5kZWxldGVDYWxlbmRhckV2ZW50ID0gZnVuY3Rpb24gKEV2ZW50SWQpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKCdOb3Qgc3VwcG9ydGVkJykpOwogICAgfTsKCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIC8vIFJlZ2lzdGVyIFByb3ZpZGVyCiAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAvLyBBdXRvLXJlZ2lzdGVyIHdoZW4gc2NyaXB0IGxvYWRzCiAgICBpZiAoQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uICYmIENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5SZWdpc3RlclByb3ZpZGVyKSB7CiAgICAgICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlJlZ2lzdGVyUHJvdmlkZXIoJ1pudW55JywgVGFyZ2V0TlMpOwogICAgfQoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uUHJvdmlkZXIuWm51bnkgfHwge30pKTsK</File>

        <!-- JavaScript - Third Party (MSAL.js) -->
        <File Permission="660" Location="var/httpd/htdocs/js/thirdparty/msal-browser-4.27.0/msal-browser.min.js" Encode="Base64">LyohIEBhenVyZS9tc2FsLWJyb3dzZXIgdjQuMjcuMCAyMDI1LTEyLTA0ICovCiJ1c2Ugc3RyaWN0IjshZnVuY3Rpb24oZSx0KXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP3QoZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sdCk6dCgoZT0idW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbFRoaXM/Z2xvYmFsVGhpczplfHxzZWxmKS5tc2FsPXt9KX0odGhpcywoZnVuY3Rpb24oZSl7Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqLwpjb25zdCB0PXtMSUJSQVJZX05BTUU6Ik1TQUwuSlMiLFNLVToibXNhbC5qcy5jb21tb24iLERFRkFVTFRfQVVUSE9SSVRZOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vY29tbW9uLyIsREVGQVVMVF9BVVRIT1JJVFlfSE9TVDoibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSIsREVGQVVMVF9DT01NT05fVEVOQU5UOiJjb21tb24iLEFERlM6ImFkZnMiLERTVFM6ImRzdHN2MiIsQUFEX0lOU1RBTkNFX0RJU0NPVkVSWV9FTkRQVDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL2NvbW1vbi9kaXNjb3ZlcnkvaW5zdGFuY2U/YXBpLXZlcnNpb249MS4xJmF1dGhvcml6YXRpb25fZW5kcG9pbnQ9IixDSUFNX0FVVEhfVVJMOiIuY2lhbWxvZ2luLmNvbSIsQUFEX1RFTkFOVF9ET01BSU5fU1VGRklYOiIub25taWNyb3NvZnQuY29tIixSRVNPVVJDRV9ERUxJTToifCIsTk9fQUNDT1VOVDoiTk9fQUNDT1VOVCIsQ0xBSU1TOiJjbGFpbXMiLENPTlNVTUVSX1VUSUQ6IjkxODgwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsT1BFTklEX1NDT1BFOiJvcGVuaWQiLFBST0ZJTEVfU0NPUEU6InByb2ZpbGUiLE9GRkxJTkVfQUNDRVNTX1NDT1BFOiJvZmZsaW5lX2FjY2VzcyIsRU1BSUxfU0NPUEU6ImVtYWlsIixDT0RFX0dSQU5UX1RZUEU6ImF1dGhvcml6YXRpb25fY29kZSIsUlRfR1JBTlRfVFlQRToicmVmcmVzaF90b2tlbiIsUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0Q6IlMyNTYiLFVSTF9GT1JNX0NPTlRFTlRfVFlQRToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkO2NoYXJzZXQ9dXRmLTgiLEFVVEhPUklaQVRJT05fUEVORElORzoiYXV0aG9yaXphdGlvbl9wZW5kaW5nIixOT1RfREVGSU5FRDoibm90X2RlZmluZWQiLEVNUFRZX1NUUklORzoiIixOT1RfQVBQTElDQUJMRToiTi9BIixOT1RfQVZBSUxBQkxFOiJOb3QgQXZhaWxhYmxlIixGT1JXQVJEX1NMQVNIOiIvIixJTURTX0VORFBPSU5UOiJodHRwOi8vMTY5LjI1NC4xNjkuMjU0L21ldGFkYXRhL2luc3RhbmNlL2NvbXB1dGUvbG9jYXRpb24iLElNRFNfVkVSU0lPTjoiMjAyMC0wNi0wMSIsSU1EU19USU1FT1VUOjJlMyxBWlVSRV9SRUdJT05fQVVUT19ESVNDT1ZFUl9GTEFHOiJUcnlBdXRvRGV0ZWN0IixSRUdJT05BTF9BVVRIX1BVQkxJQ19DTE9VRF9TVUZGSVg6ImxvZ2luLm1pY3Jvc29mdC5jb20iLEtOT1dOX1BVQkxJQ19DTE9VRFM6WyJsb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tIiwibG9naW4ud2luZG93cy5uZXQiLCJsb2dpbi5taWNyb3NvZnQuY29tIiwic3RzLndpbmRvd3MubmV0Il0sU0hSX05PTkNFX1ZBTElESVRZOjI0MCxJTlZBTElEX0lOU1RBTkNFOiJpbnZhbGlkX2luc3RhbmNlIn0scj0yMDAsbj00MDAsbz00MDAsaT00OTkscz01MDAsYT01OTksYz0iR0VUIixsPSJQT1NUIixoPVt0Lk9QRU5JRF9TQ09QRSx0LlBST0ZJTEVfU0NPUEUsdC5PRkZMSU5FX0FDQ0VTU19TQ09QRV0sZD1bLi4uaCx0LkVNQUlMX1NDT1BFXSx1PSJDb250ZW50LVR5cGUiLGc9IkNvbnRlbnQtTGVuZ3RoIixwPSJSZXRyeS1BZnRlciIsbT0iWC1BbmNob3JNYWlsYm94IixmPSJXV1ctQXV0aGVudGljYXRlIix5PSJBdXRoZW50aWNhdGlvbi1JbmZvIixDPSJ4LW1zLXJlcXVlc3QtaWQiLHc9IngtbXMtaHR0cHZlciIsdj0iYWN0aXZlLWFjY291bnQtZmlsdGVycyIsST0iY29tbW9uIixUPSJvcmdhbml6YXRpb25zIixBPSJjb25zdW1lcnMiLGs9ImFjY2Vzc190b2tlbiIsUz0ieG1zX2NjIixiPXtMT0dJTjoibG9naW4iLFNFTEVDVF9BQ0NPVU5UOiJzZWxlY3RfYWNjb3VudCIsQ09OU0VOVDoiY29uc2VudCIsTk9ORToibm9uZSIsQ1JFQVRFOiJjcmVhdGUiLE5PX1NFU1NJT046Im5vX3Nlc3Npb24ifSxFPSJjb2RlIixSPSJpZF90b2tlbiB0b2tlbiByZWZyZXNoX3Rva2VuIixfPXtRVUVSWToicXVlcnkiLEZSQUdNRU5UOiJmcmFnbWVudCJ9LFA9InF1ZXJ5IixNPSJhdXRob3JpemF0aW9uX2NvZGUiLE89InJlZnJlc2hfdG9rZW4iLHE9Ik1TU1RTIixOPSJBREZTIixVPSJHZW5lcmljIixMPSItIixEPSIuIixIPXtJRF9UT0tFTjoiSWRUb2tlbiIsQUNDRVNTX1RPS0VOOiJBY2Nlc3NUb2tlbiIsQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUU6IkFjY2Vzc1Rva2VuX1dpdGhfQXV0aFNjaGVtZSIsUkVGUkVTSF9UT0tFTjoiUmVmcmVzaFRva2VuIn0seD0iYXBwbWV0YWRhdGEiLEI9IjEiLEY9ImF1dGhvcml0eS1tZXRhZGF0YSIsej04NjQwMCxLPSJjb25maWciLEc9ImNhY2hlIiwkPSJuZXR3b3JrIixRPSJoYXJkY29kZWRfdmFsdWVzIixqPXtTQ0hFTUFfVkVSU0lPTjo1LE1BWF9MQVNUX0hFQURFUl9CWVRFUzozMzAsTUFYX0NBQ0hFRF9FUlJPUlM6NTAsQ0FDSEVfS0VZOiJzZXJ2ZXItdGVsZW1ldHJ5IixDQVRFR09SWV9TRVBBUkFUT1I6InwiLFZBTFVFX1NFUEFSQVRPUjoiLCIsT1ZFUkZMT1dfVFJVRToiMSIsT1ZFUkZMT1dfRkFMU0U6IjAiLFVOS05PV05fRVJST1I6InVua25vd25fZXJyb3IifSxXPXtCRUFSRVI6IkJlYXJlciIsUE9QOiJwb3AiLFNTSDoic3NoLWNlcnQifSxWPTYwLEo9MzYwMCxZPSJ0aHJvdHRsaW5nIixYPSJyZXRyeS1hZnRlciwgaDQyOSIsWj0iaW52YWxpZF9ncmFudCIsZWU9ImNsaWVudF9taXNtYXRjaCIsdGU9IjEiLHJlPSIzIixuZT0iNCIsb2U9IjIiLGllPSI0IixzZT0iNSIsYWU9IjAiLGNlPSIxIixsZT0iMiIsaGU9IjMiLGRlPSI0Iix1ZT17Snd0OiJKV1QiLEp3azoiSldLIixQb3A6InBvcCJ9LGdlPSJ1bmV4cGVjdGVkX2Vycm9yIixwZT0icG9zdF9yZXF1ZXN0X2ZhaWxlZCI7dmFyIG1lPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLHBvc3RSZXF1ZXN0RmFpbGVkOnBlLHVuZXhwZWN0ZWRFcnJvcjpnZX0pOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBmZT17W2dlXToiVW5leHBlY3RlZCBlcnJvciBpbiBhdXRoZW50aWNhdGlvbi4iLFtwZV06IlBvc3QgcmVxdWVzdCBmYWlsZWQgZnJvbSB0aGUgbmV0d29yaywgY291bGQgYmUgYSA0eHgvNXh4IG9yIGEgbmV0d29yayB1bmF2YWlsYWJpbGl0eS4gUGxlYXNlIGNoZWNrIHRoZSBleGFjdCBlcnJvciBjb2RlIGZvciBkZXRhaWxzLiJ9LHllPXt1bmV4cGVjdGVkRXJyb3I6e2NvZGU6Z2UsZGVzYzpmZVtnZV19LHBvc3RSZXF1ZXN0RmFpbGVkOntjb2RlOnBlLGRlc2M6ZmVbcGVdfX07Y2xhc3MgQ2UgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIocj9gJHtlfTogJHtyfWA6ZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsQ2UucHJvdG90eXBlKSx0aGlzLmVycm9yQ29kZT1lfHx0LkVNUFRZX1NUUklORyx0aGlzLmVycm9yTWVzc2FnZT1yfHx0LkVNUFRZX1NUUklORyx0aGlzLnN1YkVycm9yPW58fHQuRU1QVFlfU1RSSU5HLHRoaXMubmFtZT0iQXV0aEVycm9yIn1zZXRDb3JyZWxhdGlvbklkKGUpe3RoaXMuY29ycmVsYXRpb25JZD1lfX1mdW5jdGlvbiB3ZShlLHQpe3JldHVybiBuZXcgQ2UoZSx0P2Ake2ZlW2VdfSAke3R9YDpmZVtlXSl9Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NvbnN0IHZlPSJjbGllbnRfaW5mb19kZWNvZGluZ19lcnJvciIsSWU9ImNsaWVudF9pbmZvX2VtcHR5X2Vycm9yIixUZT0idG9rZW5fcGFyc2luZ19lcnJvciIsQWU9Im51bGxfb3JfZW1wdHlfdG9rZW4iLGtlPSJlbmRwb2ludHNfcmVzb2x1dGlvbl9lcnJvciIsU2U9Im5ldHdvcmtfZXJyb3IiLGJlPSJvcGVuaWRfY29uZmlnX2Vycm9yIixFZT0iaGFzaF9ub3RfZGVzZXJpYWxpemVkIixSZT0iaW52YWxpZF9zdGF0ZSIsX2U9InN0YXRlX21pc21hdGNoIixQZT0ic3RhdGVfbm90X2ZvdW5kIixNZT0ibm9uY2VfbWlzbWF0Y2giLE9lPSJhdXRoX3RpbWVfbm90X2ZvdW5kIixxZT0ibWF4X2FnZV90cmFuc3BpcmVkIixOZT0ibXVsdGlwbGVfbWF0Y2hpbmdfdG9rZW5zIixVZT0ibXVsdGlwbGVfbWF0Y2hpbmdfYWNjb3VudHMiLExlPSJtdWx0aXBsZV9tYXRjaGluZ19hcHBNZXRhZGF0YSIsRGU9InJlcXVlc3RfY2Fubm90X2JlX21hZGUiLEhlPSJjYW5ub3RfcmVtb3ZlX2VtcHR5X3Njb3BlIix4ZT0iY2Fubm90X2FwcGVuZF9zY29wZXNldCIsQmU9ImVtcHR5X2lucHV0X3Njb3Blc2V0IixGZT0iZGV2aWNlX2NvZGVfcG9sbGluZ19jYW5jZWxsZWQiLHplPSJkZXZpY2VfY29kZV9leHBpcmVkIixLZT0iZGV2aWNlX2NvZGVfdW5rbm93bl9lcnJvciIsR2U9Im5vX2FjY291bnRfaW5fc2lsZW50X3JlcXVlc3QiLCRlPSJpbnZhbGlkX2NhY2hlX3JlY29yZCIsUWU9ImludmFsaWRfY2FjaGVfZW52aXJvbm1lbnQiLGplPSJub19hY2NvdW50X2ZvdW5kIixXZT0ibm9fY3J5cHRvX29iamVjdCIsVmU9InVuZXhwZWN0ZWRfY3JlZGVudGlhbF90eXBlIixKZT0iaW52YWxpZF9hc3NlcnRpb24iLFllPSJpbnZhbGlkX2NsaWVudF9jcmVkZW50aWFsIixYZT0idG9rZW5fcmVmcmVzaF9yZXF1aXJlZCIsWmU9InVzZXJfdGltZW91dF9yZWFjaGVkIixldD0idG9rZW5fY2xhaW1zX2NuZl9yZXF1aXJlZF9mb3Jfc2lnbmVkand0Iix0dD0iYXV0aG9yaXphdGlvbl9jb2RlX21pc3NpbmdfZnJvbV9zZXJ2ZXJfcmVzcG9uc2UiLHJ0PSJiaW5kaW5nX2tleV9ub3RfcmVtb3ZlZCIsbnQ9ImVuZF9zZXNzaW9uX2VuZHBvaW50X25vdF9zdXBwb3J0ZWQiLG90PSJrZXlfaWRfbWlzc2luZyIsaXQ9Im5vX25ldHdvcmtfY29ubmVjdGl2aXR5IixzdD0idXNlcl9jYW5jZWxlZCIsYXQ9Im1pc3NpbmdfdGVuYW50X2lkX2Vycm9yIixjdD0ibWV0aG9kX25vdF9pbXBsZW1lbnRlZCIsbHQ9Im5lc3RlZF9hcHBfYXV0aF9icmlkZ2VfZGlzYWJsZWQiLGh0PSJwbGF0Zm9ybV9icm9rZXJfZXJyb3IiO3ZhciBkdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxhdXRoVGltZU5vdEZvdW5kOk9lLGF1dGhvcml6YXRpb25Db2RlTWlzc2luZ0Zyb21TZXJ2ZXJSZXNwb25zZTp0dCxiaW5kaW5nS2V5Tm90UmVtb3ZlZDpydCxjYW5ub3RBcHBlbmRTY29wZVNldDp4ZSxjYW5ub3RSZW1vdmVFbXB0eVNjb3BlOkhlLGNsaWVudEluZm9EZWNvZGluZ0Vycm9yOnZlLGNsaWVudEluZm9FbXB0eUVycm9yOkllLGRldmljZUNvZGVFeHBpcmVkOnplLGRldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkOkZlLGRldmljZUNvZGVVbmtub3duRXJyb3I6S2UsZW1wdHlJbnB1dFNjb3BlU2V0OkJlLGVuZFNlc3Npb25FbmRwb2ludE5vdFN1cHBvcnRlZDpudCxlbmRwb2ludFJlc29sdXRpb25FcnJvcjprZSxoYXNoTm90RGVzZXJpYWxpemVkOkVlLGludmFsaWRBc3NlcnRpb246SmUsaW52YWxpZENhY2hlRW52aXJvbm1lbnQ6UWUsaW52YWxpZENhY2hlUmVjb3JkOiRlLGludmFsaWRDbGllbnRDcmVkZW50aWFsOlllLGludmFsaWRTdGF0ZTpSZSxrZXlJZE1pc3Npbmc6b3QsbWF4QWdlVHJhbnNwaXJlZDpxZSxtZXRob2ROb3RJbXBsZW1lbnRlZDpjdCxtaXNzaW5nVGVuYW50SWRFcnJvcjphdCxtdWx0aXBsZU1hdGNoaW5nQWNjb3VudHM6VWUsbXVsdGlwbGVNYXRjaGluZ0FwcE1ldGFkYXRhOkxlLG11bHRpcGxlTWF0Y2hpbmdUb2tlbnM6TmUsbmVzdGVkQXBwQXV0aEJyaWRnZURpc2FibGVkOmx0LG5ldHdvcmtFcnJvcjpTZSxub0FjY291bnRGb3VuZDpqZSxub0FjY291bnRJblNpbGVudFJlcXVlc3Q6R2Usbm9DcnlwdG9PYmplY3Q6V2Usbm9OZXR3b3JrQ29ubmVjdGl2aXR5Oml0LG5vbmNlTWlzbWF0Y2g6TWUsbnVsbE9yRW1wdHlUb2tlbjpBZSxvcGVuSWRDb25maWdFcnJvcjpiZSxwbGF0Zm9ybUJyb2tlckVycm9yOmh0LHJlcXVlc3RDYW5ub3RCZU1hZGU6RGUsc3RhdGVNaXNtYXRjaDpfZSxzdGF0ZU5vdEZvdW5kOlBlLHRva2VuQ2xhaW1zQ25mUmVxdWlyZWRGb3JTaWduZWRKd3Q6ZXQsdG9rZW5QYXJzaW5nRXJyb3I6VGUsdG9rZW5SZWZyZXNoUmVxdWlyZWQ6WGUsdW5leHBlY3RlZENyZWRlbnRpYWxUeXBlOlZlLHVzZXJDYW5jZWxlZDpzdCx1c2VyVGltZW91dFJlYWNoZWQ6WmV9KTsKLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgdXQ9e1t2ZV06IlRoZSBjbGllbnQgaW5mbyBjb3VsZCBub3QgYmUgcGFyc2VkL2RlY29kZWQgY29ycmVjdGx5IixbSWVdOiJUaGUgY2xpZW50IGluZm8gd2FzIGVtcHR5IixbVGVdOiJUb2tlbiBjYW5ub3QgYmUgcGFyc2VkIixbQWVdOiJUaGUgdG9rZW4gaXMgbnVsbCBvciBlbXB0eSIsW2tlXToiRW5kcG9pbnRzIGNhbm5vdCBiZSByZXNvbHZlZCIsW1NlXToiTmV0d29yayByZXF1ZXN0IGZhaWxlZCIsW2JlXToiQ291bGQgbm90IHJldHJpZXZlIGVuZHBvaW50cy4gQ2hlY2sgeW91ciBhdXRob3JpdHkgYW5kIHZlcmlmeSB0aGUgLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb24gZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVxdWlyZWQgZW5kcG9pbnRzLiIsW0VlXToiVGhlIGhhc2ggcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgZGVzZXJpYWxpemVkIixbUmVdOiJTdGF0ZSB3YXMgbm90IHRoZSBleHBlY3RlZCBmb3JtYXQiLFtfZV06IlN0YXRlIG1pc21hdGNoIGVycm9yIixbUGVdOiJTdGF0ZSBub3QgZm91bmQiLFtNZV06Ik5vbmNlIG1pc21hdGNoIGVycm9yIixbT2VdOiJNYXggQWdlIHdhcyByZXF1ZXN0ZWQgYW5kIHRoZSBJRCB0b2tlbiBpcyBtaXNzaW5nIHRoZSBhdXRoX3RpbWUgdmFyaWFibGUuIGF1dGhfdGltZSBpcyBhbiBvcHRpb25hbCBjbGFpbSBhbmQgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdCAtIGl0IG11c3QgYmUgZW5hYmxlZC4gU2VlIGh0dHBzOi8vYWthLm1zL21zYWxqcy9vcHRpb25hbC1jbGFpbXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uIixbcWVdOiJNYXggQWdlIGlzIHNldCB0byAwLCBvciB0b28gbXVjaCB0aW1lIGhhcyBlbGFwc2VkIHNpbmNlIHRoZSBsYXN0IGVuZC11c2VyIGF1dGhlbnRpY2F0aW9uLiIsW05lXToiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIHRva2VucyBzYXRpc2Z5aW5nIHRoZSByZXF1aXJlbWVudHMuIENhbGwgQWNxdWlyZVRva2VuIGFnYWluIHByb3ZpZGluZyBtb3JlIHJlcXVpcmVtZW50cyBzdWNoIGFzIGF1dGhvcml0eSBvciBhY2NvdW50LiIsW1VlXToiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIGFjY291bnRzIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFBsZWFzZSBwYXNzIG1vcmUgaW5mbyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgYWNjb3VudCIsW0xlXToiVGhlIGNhY2hlIGNvbnRhaW5zIG11bHRpcGxlIGFwcE1ldGFkYXRhIHNhdGlzZnlpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFBsZWFzZSBwYXNzIG1vcmUgaW5mbyB0byBvYnRhaW4gdGhlIGNvcnJlY3QgYXBwTWV0YWRhdGEiLFtEZV06IlRva2VuIHJlcXVlc3QgY2Fubm90IGJlIG1hZGUgd2l0aG91dCBhdXRob3JpemF0aW9uIGNvZGUgb3IgcmVmcmVzaCB0b2tlbi4iLFtIZV06IkNhbm5vdCByZW1vdmUgbnVsbCBvciBlbXB0eSBzY29wZSBmcm9tIFNjb3BlU2V0IixbeGVdOiJDYW5ub3QgYXBwZW5kIFNjb3BlU2V0IixbQmVdOiJFbXB0eSBpbnB1dCBTY29wZVNldCBjYW5ub3QgYmUgcHJvY2Vzc2VkIixbRmVdOiJDYWxsZXIgaGFzIGNhbmNlbGxlZCB0b2tlbiBlbmRwb2ludCBwb2xsaW5nIGR1cmluZyBkZXZpY2UgY29kZSBmbG93IGJ5IHNldHRpbmcgRGV2aWNlQ29kZVJlcXVlc3QuY2FuY2VsID0gdHJ1ZS4iLFt6ZV06IkRldmljZSBjb2RlIGlzIGV4cGlyZWQuIixbS2VdOiJEZXZpY2UgY29kZSBzdG9wcGVkIHBvbGxpbmcgZm9yIHVua25vd24gcmVhc29ucy4iLFtHZV06IlBsZWFzZSBwYXNzIGFuIGFjY291bnQgb2JqZWN0LCBzaWxlbnQgZmxvdyBpcyBub3Qgc3VwcG9ydGVkIHdpdGhvdXQgYWNjb3VudCBpbmZvcm1hdGlvbiIsWyRlXToiQ2FjaGUgcmVjb3JkIG9iamVjdCB3YXMgbnVsbCBvciB1bmRlZmluZWQuIixbUWVdOiJJbnZhbGlkIGVudmlyb25tZW50IHdoZW4gYXR0ZW1wdGluZyB0byBjcmVhdGUgY2FjaGUgZW50cnkiLFtqZV06Ik5vIGFjY291bnQgZm91bmQgaW4gY2FjaGUgZm9yIGdpdmVuIGtleS4iLFtXZV06Ik5vIGNyeXB0byBvYmplY3QgZGV0ZWN0ZWQuIixbVmVdOiJVbmV4cGVjdGVkIGNyZWRlbnRpYWwgdHlwZS4iLFtKZV06IkNsaWVudCBhc3NlcnRpb24gbXVzdCBtZWV0IHJlcXVpcmVtZW50cyBkZXNjcmliZWQgaW4gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc1MTUiLFtZZV06IkNsaWVudCBjcmVkZW50aWFsIChzZWNyZXQsIGNlcnRpZmljYXRlLCBvciBhc3NlcnRpb24pIG11c3Qgbm90IGJlIGVtcHR5IHdoZW4gY3JlYXRpbmcgYSBjb25maWRlbnRpYWwgY2xpZW50LiBBbiBhcHBsaWNhdGlvbiBzaG91bGQgYXQgbW9zdCBoYXZlIG9uZSBjcmVkZW50aWFsIixbWGVdOiJDYW5ub3QgcmV0dXJuIHRva2VuIGZyb20gY2FjaGUgYmVjYXVzZSBpdCBtdXN0IGJlIHJlZnJlc2hlZC4gVGhpcyBtYXkgYmUgZHVlIHRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIHJlYXNvbnM6IGZvcmNlUmVmcmVzaCBwYXJhbWV0ZXIgaXMgc2V0IHRvIHRydWUsIGNsYWltcyBoYXZlIGJlZW4gcmVxdWVzdGVkLCB0aGVyZSBpcyBubyBjYWNoZWQgYWNjZXNzIHRva2VuIG9yIGl0IGlzIGV4cGlyZWQuIixbWmVdOiJVc2VyIGRlZmluZWQgdGltZW91dCBmb3IgZGV2aWNlIGNvZGUgcG9sbGluZyByZWFjaGVkIixbZXRdOiJDYW5ub3QgZ2VuZXJhdGUgYSBQT1Agand0IGlmIHRoZSB0b2tlbl9jbGFpbXMgYXJlIG5vdCBwb3B1bGF0ZWQiLFt0dF06IlNlcnZlciByZXNwb25zZSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml6YXRpb24gY29kZSB0byBwcm9jZWVkIixbcnRdOiJDb3VsZCBub3QgcmVtb3ZlIHRoZSBjcmVkZW50aWFsJ3MgYmluZGluZyBrZXkgZnJvbSBzdG9yYWdlLiIsW250XToiVGhlIHByb3ZpZGVkIGF1dGhvcml0eSBkb2VzIG5vdCBzdXBwb3J0IGxvZ291dCIsW290XToiQSBrZXlJZCB2YWx1ZSBpcyBtaXNzaW5nIGZyb20gdGhlIHJlcXVlc3RlZCBib3VuZCB0b2tlbidzIGNhY2hlIHJlY29yZCBhbmQgaXMgcmVxdWlyZWQgdG8gbWF0Y2ggdGhlIHRva2VuIHRvIGl0J3Mgc3RvcmVkIGJpbmRpbmcga2V5LiIsW2l0XToiTm8gbmV0d29yayBjb25uZWN0aXZpdHkuIENoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4iLFtzdF06IlVzZXIgY2FuY2VsbGVkIHRoZSBmbG93LiIsW2F0XToiQSB0ZW5hbnQgaWQgLSBub3QgY29tbW9uLCBvcmdhbml6YXRpb25zLCBvciBjb25zdW1lcnMgLSBtdXN0IGJlIHNwZWNpZmllZCB3aGVuIHVzaW5nIHRoZSBjbGllbnRfY3JlZGVudGlhbHMgZmxvdy4iLFtjdF06IlRoaXMgbWV0aG9kIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZCIsW2x0XToiVGhlIG5lc3RlZCBhcHAgYXV0aCBicmlkZ2UgaXMgZGlzYWJsZWQiLFtodF06IkFuIGVycm9yIG9jY3VycmVkIGluIHRoZSBuYXRpdmUgYnJva2VyLiBTZWUgdGhlIHBsYXRmb3JtQnJva2VyRXJyb3IgcHJvcGVydHkgZm9yIGRldGFpbHMuIn0sZ3Q9e2NsaWVudEluZm9EZWNvZGluZ0Vycm9yOntjb2RlOnZlLGRlc2M6dXRbdmVdfSxjbGllbnRJbmZvRW1wdHlFcnJvcjp7Y29kZTpJZSxkZXNjOnV0W0llXX0sdG9rZW5QYXJzaW5nRXJyb3I6e2NvZGU6VGUsZGVzYzp1dFtUZV19LG51bGxPckVtcHR5VG9rZW46e2NvZGU6QWUsZGVzYzp1dFtBZV19LGVuZHBvaW50UmVzb2x1dGlvbkVycm9yOntjb2RlOmtlLGRlc2M6dXRba2VdfSxuZXR3b3JrRXJyb3I6e2NvZGU6U2UsZGVzYzp1dFtTZV19LHVuYWJsZVRvR2V0T3BlbmlkQ29uZmlnRXJyb3I6e2NvZGU6YmUsZGVzYzp1dFtiZV19LGhhc2hOb3REZXNlcmlhbGl6ZWQ6e2NvZGU6RWUsZGVzYzp1dFtFZV19LGludmFsaWRTdGF0ZUVycm9yOntjb2RlOlJlLGRlc2M6dXRbUmVdfSxzdGF0ZU1pc21hdGNoRXJyb3I6e2NvZGU6X2UsZGVzYzp1dFtfZV19LHN0YXRlTm90Rm91bmRFcnJvcjp7Y29kZTpQZSxkZXNjOnV0W1BlXX0sbm9uY2VNaXNtYXRjaEVycm9yOntjb2RlOk1lLGRlc2M6dXRbTWVdfSxhdXRoVGltZU5vdEZvdW5kRXJyb3I6e2NvZGU6T2UsZGVzYzp1dFtPZV19LG1heEFnZVRyYW5zcGlyZWQ6e2NvZGU6cWUsZGVzYzp1dFtxZV19LG11bHRpcGxlTWF0Y2hpbmdUb2tlbnM6e2NvZGU6TmUsZGVzYzp1dFtOZV19LG11bHRpcGxlTWF0Y2hpbmdBY2NvdW50czp7Y29kZTpVZSxkZXNjOnV0W1VlXX0sbXVsdGlwbGVNYXRjaGluZ0FwcE1ldGFkYXRhOntjb2RlOkxlLGRlc2M6dXRbTGVdfSx0b2tlblJlcXVlc3RDYW5ub3RCZU1hZGU6e2NvZGU6RGUsZGVzYzp1dFtEZV19LHJlbW92ZUVtcHR5U2NvcGVFcnJvcjp7Y29kZTpIZSxkZXNjOnV0W0hlXX0sYXBwZW5kU2NvcGVTZXRFcnJvcjp7Y29kZTp4ZSxkZXNjOnV0W3hlXX0sZW1wdHlJbnB1dFNjb3BlU2V0RXJyb3I6e2NvZGU6QmUsZGVzYzp1dFtCZV19LERldmljZUNvZGVQb2xsaW5nQ2FuY2VsbGVkOntjb2RlOkZlLGRlc2M6dXRbRmVdfSxEZXZpY2VDb2RlRXhwaXJlZDp7Y29kZTp6ZSxkZXNjOnV0W3plXX0sRGV2aWNlQ29kZVVua25vd25FcnJvcjp7Y29kZTpLZSxkZXNjOnV0W0tlXX0sTm9BY2NvdW50SW5TaWxlbnRSZXF1ZXN0Ontjb2RlOkdlLGRlc2M6dXRbR2VdfSxpbnZhbGlkQ2FjaGVSZWNvcmQ6e2NvZGU6JGUsZGVzYzp1dFskZV19LGludmFsaWRDYWNoZUVudmlyb25tZW50Ontjb2RlOlFlLGRlc2M6dXRbUWVdfSxub0FjY291bnRGb3VuZDp7Y29kZTpqZSxkZXNjOnV0W2plXX0sbm9DcnlwdG9PYmo6e2NvZGU6V2UsZGVzYzp1dFtXZV19LHVuZXhwZWN0ZWRDcmVkZW50aWFsVHlwZTp7Y29kZTpWZSxkZXNjOnV0W1ZlXX0saW52YWxpZEFzc2VydGlvbjp7Y29kZTpKZSxkZXNjOnV0W0plXX0saW52YWxpZENsaWVudENyZWRlbnRpYWw6e2NvZGU6WWUsZGVzYzp1dFtZZV19LHRva2VuUmVmcmVzaFJlcXVpcmVkOntjb2RlOlhlLGRlc2M6dXRbWGVdfSx1c2VyVGltZW91dFJlYWNoZWQ6e2NvZGU6WmUsZGVzYzp1dFtaZV19LHRva2VuQ2xhaW1zUmVxdWlyZWQ6e2NvZGU6ZXQsZGVzYzp1dFtldF19LG5vQXV0aG9yaXphdGlvbkNvZGVGcm9tU2VydmVyOntjb2RlOnR0LGRlc2M6dXRbdHRdfSxiaW5kaW5nS2V5Tm90UmVtb3ZlZEVycm9yOntjb2RlOnJ0LGRlc2M6dXRbcnRdfSxsb2dvdXROb3RTdXBwb3J0ZWQ6e2NvZGU6bnQsZGVzYzp1dFtudF19LGtleUlkTWlzc2luZzp7Y29kZTpvdCxkZXNjOnV0W290XX0sbm9OZXR3b3JrQ29ubmVjdGl2aXR5Ontjb2RlOml0LGRlc2M6dXRbaXRdfSx1c2VyQ2FuY2VsZWRFcnJvcjp7Y29kZTpzdCxkZXNjOnV0W3N0XX0sbWlzc2luZ1RlbmFudElkRXJyb3I6e2NvZGU6YXQsZGVzYzp1dFthdF19LG5lc3RlZEFwcEF1dGhCcmlkZ2VEaXNhYmxlZDp7Y29kZTpsdCxkZXNjOnV0W2x0XX0scGxhdGZvcm1Ccm9rZXJFcnJvcjp7Y29kZTpodCxkZXNjOnV0W2h0XX19O2NsYXNzIHB0IGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQ/YCR7dXRbZV19OiAke3R9YDp1dFtlXSksdGhpcy5uYW1lPSJDbGllbnRBdXRoRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHB0LnByb3RvdHlwZSl9fWZ1bmN0aW9uIG10KGUsdCl7cmV0dXJuIG5ldyBwdChlLHQpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBmdD17Y3JlYXRlTmV3R3VpZDooKT0+e3Rocm93IG10KGN0KX0sYmFzZTY0RGVjb2RlOigpPT57dGhyb3cgbXQoY3QpfSxiYXNlNjRFbmNvZGU6KCk9Pnt0aHJvdyBtdChjdCl9LGJhc2U2NFVybEVuY29kZTooKT0+e3Rocm93IG10KGN0KX0sZW5jb2RlS2lkOigpPT57dGhyb3cgbXQoY3QpfSxhc3luYyBnZXRQdWJsaWNLZXlUaHVtYnByaW50KCl7dGhyb3cgbXQoY3QpfSxhc3luYyByZW1vdmVUb2tlbkJpbmRpbmdLZXkoKXt0aHJvdyBtdChjdCl9LGFzeW5jIGNsZWFyS2V5c3RvcmUoKXt0aHJvdyBtdChjdCl9LGFzeW5jIHNpZ25Kd3QoKXt0aHJvdyBtdChjdCl9LGFzeW5jIGhhc2hTdHJpbmcoKXt0aHJvdyBtdChjdCl9fTsKLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovdmFyIHl0O2UuTG9nTGV2ZWw9dm9pZCAwLCh5dD1lLkxvZ0xldmVsfHwoZS5Mb2dMZXZlbD17fSkpW3l0LkVycm9yPTBdPSJFcnJvciIseXRbeXQuV2FybmluZz0xXT0iV2FybmluZyIseXRbeXQuSW5mbz0yXT0iSW5mbyIseXRbeXQuVmVyYm9zZT0zXT0iVmVyYm9zZSIseXRbeXQuVHJhY2U9NF09IlRyYWNlIjtjbGFzcyBDdHtjb25zdHJ1Y3RvcihyLG4sbyl7dGhpcy5sZXZlbD1lLkxvZ0xldmVsLkluZm87Y29uc3QgaT1yfHxDdC5jcmVhdGVEZWZhdWx0TG9nZ2VyT3B0aW9ucygpO3RoaXMubG9jYWxDYWxsYmFjaz1pLmxvZ2dlckNhbGxiYWNrfHwoKCk9Pnt9KSx0aGlzLnBpaUxvZ2dpbmdFbmFibGVkPWkucGlpTG9nZ2luZ0VuYWJsZWR8fCExLHRoaXMubGV2ZWw9Im51bWJlciI9PXR5cGVvZiBpLmxvZ0xldmVsP2kubG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLHRoaXMuY29ycmVsYXRpb25JZD1pLmNvcnJlbGF0aW9uSWR8fHQuRU1QVFlfU1RSSU5HLHRoaXMucGFja2FnZU5hbWU9bnx8dC5FTVBUWV9TVFJJTkcsdGhpcy5wYWNrYWdlVmVyc2lvbj1vfHx0LkVNUFRZX1NUUklOR31zdGF0aWMgY3JlYXRlRGVmYXVsdExvZ2dlck9wdGlvbnMoKXtyZXR1cm57bG9nZ2VyQ2FsbGJhY2s6KCk9Pnt9LHBpaUxvZ2dpbmdFbmFibGVkOiExLGxvZ0xldmVsOmUuTG9nTGV2ZWwuSW5mb319Y2xvbmUoZSx0LHIpe3JldHVybiBuZXcgQ3Qoe2xvZ2dlckNhbGxiYWNrOnRoaXMubG9jYWxDYWxsYmFjayxwaWlMb2dnaW5nRW5hYmxlZDp0aGlzLnBpaUxvZ2dpbmdFbmFibGVkLGxvZ0xldmVsOnRoaXMubGV2ZWwsY29ycmVsYXRpb25JZDpyfHx0aGlzLmNvcnJlbGF0aW9uSWR9LGUsdCl9bG9nTWVzc2FnZSh0LHIpe2lmKHIubG9nTGV2ZWw+dGhpcy5sZXZlbHx8IXRoaXMucGlpTG9nZ2luZ0VuYWJsZWQmJnIuY29udGFpbnNQaWkpcmV0dXJuO2NvbnN0IG49YCR7YFskeyhuZXcgRGF0ZSkudG9VVENTdHJpbmcoKX1dIDogWyR7ci5jb3JyZWxhdGlvbklkfHx0aGlzLmNvcnJlbGF0aW9uSWR8fCIifV1gfSA6ICR7dGhpcy5wYWNrYWdlTmFtZX1AJHt0aGlzLnBhY2thZ2VWZXJzaW9ufSA6ICR7ZS5Mb2dMZXZlbFtyLmxvZ0xldmVsXX0gLSAke3R9YDt0aGlzLmV4ZWN1dGVDYWxsYmFjayhyLmxvZ0xldmVsLG4sci5jb250YWluc1BpaXx8ITEpfWV4ZWN1dGVDYWxsYmFjayhlLHQscil7dGhpcy5sb2NhbENhbGxiYWNrJiZ0aGlzLmxvY2FsQ2FsbGJhY2soZSx0LHIpfWVycm9yKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuRXJyb3IsY29udGFpbnNQaWk6ITEsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfWVycm9yUGlpKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuRXJyb3IsY29udGFpbnNQaWk6ITAsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfXdhcm5pbmcocixuKXt0aGlzLmxvZ01lc3NhZ2Uocix7bG9nTGV2ZWw6ZS5Mb2dMZXZlbC5XYXJuaW5nLGNvbnRhaW5zUGlpOiExLGNvcnJlbGF0aW9uSWQ6bnx8dC5FTVBUWV9TVFJJTkd9KX13YXJuaW5nUGlpKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuV2FybmluZyxjb250YWluc1BpaTohMCxjb3JyZWxhdGlvbklkOm58fHQuRU1QVFlfU1RSSU5HfSl9aW5mbyhyLG4pe3RoaXMubG9nTWVzc2FnZShyLHtsb2dMZXZlbDplLkxvZ0xldmVsLkluZm8sY29udGFpbnNQaWk6ITEsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfWluZm9QaWkocixuKXt0aGlzLmxvZ01lc3NhZ2Uocix7bG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLGNvbnRhaW5zUGlpOiEwLGNvcnJlbGF0aW9uSWQ6bnx8dC5FTVBUWV9TVFJJTkd9KX12ZXJib3NlKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuVmVyYm9zZSxjb250YWluc1BpaTohMSxjb3JyZWxhdGlvbklkOm58fHQuRU1QVFlfU1RSSU5HfSl9dmVyYm9zZVBpaShyLG4pe3RoaXMubG9nTWVzc2FnZShyLHtsb2dMZXZlbDplLkxvZ0xldmVsLlZlcmJvc2UsY29udGFpbnNQaWk6ITAsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfXRyYWNlKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuVHJhY2UsY29udGFpbnNQaWk6ITEsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfXRyYWNlUGlpKHIsbil7dGhpcy5sb2dNZXNzYWdlKHIse2xvZ0xldmVsOmUuTG9nTGV2ZWwuVHJhY2UsY29udGFpbnNQaWk6ITAsY29ycmVsYXRpb25JZDpufHx0LkVNUFRZX1NUUklOR30pfWlzUGlpTG9nZ2luZ0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5waWlMb2dnaW5nRW5hYmxlZHx8ITF9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB3dD0iQGF6dXJlL21zYWwtY29tbW9uIix2dD0iMTUuMTMuMyIsSXQ9e05vbmU6Im5vbmUiLEF6dXJlUHVibGljOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iLEF6dXJlUHBlOiJodHRwczovL2xvZ2luLndpbmRvd3MtcHBlLm5ldCIsQXp1cmVDaGluYToiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuIixBenVyZUdlcm1hbnk6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmRlIixBenVyZVVzR292ZXJubWVudDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMifSxUdD0icmVkaXJlY3RfdXJpX2VtcHR5IixBdD0iY2xhaW1zX3JlcXVlc3RfcGFyc2luZ19lcnJvciIsa3Q9ImF1dGhvcml0eV91cmlfaW5zZWN1cmUiLFN0PSJ1cmxfcGFyc2VfZXJyb3IiLGJ0PSJlbXB0eV91cmxfZXJyb3IiLEV0PSJlbXB0eV9pbnB1dF9zY29wZXNfZXJyb3IiLFJ0PSJpbnZhbGlkX2NsYWltcyIsX3Q9InRva2VuX3JlcXVlc3RfZW1wdHkiLFB0PSJsb2dvdXRfcmVxdWVzdF9lbXB0eSIsTXQ9ImludmFsaWRfY29kZV9jaGFsbGVuZ2VfbWV0aG9kIixPdD0icGtjZV9wYXJhbXNfbWlzc2luZyIscXQ9ImludmFsaWRfY2xvdWRfZGlzY292ZXJ5X21ldGFkYXRhIixOdD0iaW52YWxpZF9hdXRob3JpdHlfbWV0YWRhdGEiLFV0PSJ1bnRydXN0ZWRfYXV0aG9yaXR5IixMdD0ibWlzc2luZ19zc2hfandrIixEdD0ibWlzc2luZ19zc2hfa2lkIixIdD0ibWlzc2luZ19ub25jZV9hdXRoZW50aWNhdGlvbl9oZWFkZXIiLHh0PSJpbnZhbGlkX2F1dGhlbnRpY2F0aW9uX2hlYWRlciIsQnQ9ImNhbm5vdF9zZXRfT0lEQ09wdGlvbnMiLEZ0PSJjYW5ub3RfYWxsb3dfcGxhdGZvcm1fYnJva2VyIix6dD0iYXV0aG9yaXR5X21pc21hdGNoIixLdD0iaW52YWxpZF9yZXF1ZXN0X21ldGhvZF9mb3JfRUFSIixHdD0iaW52YWxpZF9hdXRob3JpemVfcG9zdF9ib2R5X3BhcmFtZXRlcnMiLCR0PSJpbnZhbGlkX3BsYXRmb3JtX2Jyb2tlcl9jb25maWd1cmF0aW9uIjt2YXIgUXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYXV0aG9yaXR5TWlzbWF0Y2g6enQsYXV0aG9yaXR5VXJpSW5zZWN1cmU6a3QsY2Fubm90QWxsb3dQbGF0Zm9ybUJyb2tlcjpGdCxjYW5ub3RTZXRPSURDT3B0aW9uczpCdCxjbGFpbXNSZXF1ZXN0UGFyc2luZ0Vycm9yOkF0LGVtcHR5SW5wdXRTY29wZXNFcnJvcjpFdCxpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXI6eHQsaW52YWxpZEF1dGhvcml0eU1ldGFkYXRhOk50LGludmFsaWRBdXRob3JpemVQb3N0Qm9keVBhcmFtZXRlcnM6R3QsaW52YWxpZENsYWltczpSdCxpbnZhbGlkQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YTpxdCxpbnZhbGlkQ29kZUNoYWxsZW5nZU1ldGhvZDpNdCxpbnZhbGlkUGxhdGZvcm1Ccm9rZXJDb25maWd1cmF0aW9uOiR0LGludmFsaWRSZXF1ZXN0TWV0aG9kRm9yRUFSOkt0LGxvZ291dFJlcXVlc3RFbXB0eTpQdCxtaXNzaW5nTm9uY2VBdXRoZW50aWNhdGlvbkhlYWRlcjpIdCxtaXNzaW5nU3NoSndrOkx0LG1pc3NpbmdTc2hLaWQ6RHQscGtjZVBhcmFtc01pc3Npbmc6T3QscmVkaXJlY3RVcmlFbXB0eTpUdCx0b2tlblJlcXVlc3RFbXB0eTpfdCx1bnRydXN0ZWRBdXRob3JpdHk6VXQsdXJsRW1wdHlFcnJvcjpidCx1cmxQYXJzZUVycm9yOlN0fSk7Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NvbnN0IGp0PXtbVHRdOiJBIHJlZGlyZWN0IFVSSSBpcyByZXF1aXJlZCBmb3IgYWxsIGNhbGxzLCBhbmQgbm9uZSBoYXMgYmVlbiBzZXQuIixbQXRdOiJDb3VsZCBub3QgcGFyc2UgdGhlIGdpdmVuIGNsYWltcyByZXF1ZXN0IG9iamVjdC4iLFtrdF06IkF1dGhvcml0eSBVUklzIG11c3QgdXNlIGh0dHBzLiAgUGxlYXNlIHNlZSBoZXJlIGZvciB2YWxpZCBhdXRob3JpdHkgY29uZmlndXJhdGlvbiBvcHRpb25zOiBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy9henVyZS9hY3RpdmUtZGlyZWN0b3J5L2RldmVsb3AvbXNhbC1qcy1pbml0aWFsaXppbmctY2xpZW50LWFwcGxpY2F0aW9ucyNjb25maWd1cmF0aW9uLW9wdGlvbnMiLFtTdF06IlVSTCBjb3VsZCBub3QgYmUgcGFyc2VkIGludG8gYXBwcm9wcmlhdGUgc2VnbWVudHMuIixbYnRdOiJVUkwgd2FzIGVtcHR5IG9yIG51bGwuIixbRXRdOiJTY29wZXMgY2Fubm90IGJlIHBhc3NlZCBhcyBudWxsLCB1bmRlZmluZWQgb3IgZW1wdHkgYXJyYXkgYmVjYXVzZSB0aGV5IGFyZSByZXF1aXJlZCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuLiIsW1J0XToiR2l2ZW4gY2xhaW1zIHBhcmFtZXRlciBtdXN0IGJlIGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QuIixbX3RdOiJUb2tlbiByZXF1ZXN0IHdhcyBlbXB0eSBhbmQgbm90IGZvdW5kIGluIGNhY2hlLiIsW1B0XToiVGhlIGxvZ291dCByZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZC4iLFtNdF06J2NvZGVfY2hhbGxlbmdlX21ldGhvZCBwYXNzZWQgaXMgaW52YWxpZC4gVmFsaWQgdmFsdWVzIGFyZSAicGxhaW4iIGFuZCAiUzI1NiIuJyxbT3RdOiJCb3RoIHBhcmFtczogY29kZV9jaGFsbGVuZ2UgYW5kIGNvZGVfY2hhbGxlbmdlX21ldGhvZCBhcmUgdG8gYmUgcGFzc2VkIGlmIHRvIGJlIHNlbnQgaW4gdGhlIHJlcXVlc3QiLFtxdF06IkludmFsaWQgY2xvdWREaXNjb3ZlcnlNZXRhZGF0YSBwcm92aWRlZC4gTXVzdCBiZSBhIHN0cmluZ2lmaWVkIEpTT04gb2JqZWN0IGNvbnRhaW5pbmcgdGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludCBhbmQgbWV0YWRhdGEgZmllbGRzIixbTnRdOiJJbnZhbGlkIGF1dGhvcml0eU1ldGFkYXRhIHByb3ZpZGVkLiBNdXN0IGJ5IGEgc3RyaW5naWZpZWQgSlNPTiBvYmplY3QgY29udGFpbmluZyBhdXRob3JpemF0aW9uX2VuZHBvaW50LCB0b2tlbl9lbmRwb2ludCwgaXNzdWVyIGZpZWxkcy4iLFtVdF06IlRoZSBwcm92aWRlZCBhdXRob3JpdHkgaXMgbm90IGEgdHJ1c3RlZCBhdXRob3JpdHkuIFBsZWFzZSBpbmNsdWRlIHRoaXMgYXV0aG9yaXR5IGluIHRoZSBrbm93bkF1dGhvcml0aWVzIGNvbmZpZyBwYXJhbWV0ZXIuIixbTHRdOiJNaXNzaW5nIHNzaEp3ayBpbiBTU0ggY2VydGlmaWNhdGUgcmVxdWVzdC4gQSBzdHJpbmdpZmllZCBKU09OIFdlYiBLZXkgaXMgcmVxdWlyZWQgd2hlbiB1c2luZyB0aGUgU1NIIGF1dGhlbnRpY2F0aW9uIHNjaGVtZS4iLFtEdF06Ik1pc3Npbmcgc3NoS2lkIGluIFNTSCBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiBBIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHB1YmxpYyBTU0gga2V5IGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIFNTSCBhdXRoZW50aWNhdGlvbiBzY2hlbWUuIixbSHRdOiJVbmFibGUgdG8gZmluZCBhbiBhdXRoZW50aWNhdGlvbiBoZWFkZXIgY29udGFpbmluZyBzZXJ2ZXIgbm9uY2UuIEVpdGhlciB0aGUgQXV0aGVudGljYXRpb24tSW5mbyBvciBXV1ctQXV0aGVudGljYXRlIGhlYWRlcnMgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIG9idGFpbiBhIHNlcnZlciBub25jZS4iLFt4dF06IkludmFsaWQgYXV0aGVudGljYXRpb24gaGVhZGVyIHByb3ZpZGVkIixbQnRdOiJDYW5ub3Qgc2V0IE9JRENPcHRpb25zIHBhcmFtZXRlci4gUGxlYXNlIGNoYW5nZSB0aGUgcHJvdG9jb2wgbW9kZSB0byBPSURDIG9yIHVzZSBhIG5vbi1NaWNyb3NvZnQgYXV0aG9yaXR5LiIsW0Z0XToiQ2Fubm90IHNldCBhbGxvd1BsYXRmb3JtQnJva2VyIHBhcmFtZXRlciB0byB0cnVlIHdoZW4gbm90IGluIEFBRCBwcm90b2NvbCBtb2RlLiIsW3p0XToiQXV0aG9yaXR5IG1pc21hdGNoIGVycm9yLiBBdXRob3JpdHkgcHJvdmlkZWQgaW4gbG9naW4gcmVxdWVzdCBvciBQdWJsaWNDbGllbnRBcHBsaWNhdGlvbiBjb25maWcgZG9lcyBub3QgbWF0Y2ggdGhlIGVudmlyb25tZW50IG9mIHRoZSBwcm92aWRlZCBhY2NvdW50LiBQbGVhc2UgdXNlIGEgbWF0Y2hpbmcgYWNjb3VudCBvciBtYWtlIGFuIGludGVyYWN0aXZlIHJlcXVlc3QgdG8gbG9naW4gdG8gdGhpcyBhdXRob3JpdHkuIixbR3RdOiJJbnZhbGlkIGF1dGhvcml6ZSBwb3N0IGJvZHkgcGFyYW1ldGVycyBwcm92aWRlZC4gSWYgeW91IGFyZSB1c2luZyBhdXRob3JpemVQb3N0Qm9keVBhcmFtZXRlcnMsIHRoZSByZXF1ZXN0IG1ldGhvZCBtdXN0IGJlIFBPU1QuIFBsZWFzZSBjaGVjayB0aGUgcmVxdWVzdCBtZXRob2QgYW5kIHBhcmFtZXRlcnMuIixbS3RdOiJJbnZhbGlkIHJlcXVlc3QgbWV0aG9kIGZvciBFQVIgcHJvdG9jb2wgbW9kZS4gVGhlIHJlcXVlc3QgbWV0aG9kIGNhbm5vdCBiZSBHRVQgd2hlbiB1c2luZyBFQVIgcHJvdG9jb2wgbW9kZS4gUGxlYXNlIGNoYW5nZSB0aGUgcmVxdWVzdCBtZXRob2QgdG8gUE9TVC4iLFskdF06IkludmFsaWQgcGxhdGZvcm0gYnJva2VyIGNvbmZpZ3VyYXRpb24uIGBhbGxvd1BsYXRmb3JtQnJva2VyV2l0aERPTWAgY2FuIG9ubHkgYmUgZW5hYmxlZCB3aGVuIGBhbGxvd1BsYXRmb3JtQnJva2VyYCBpcyBlbmFibGVkLiJ9LFd0PXtyZWRpcmVjdFVyaU5vdFNldDp7Y29kZTpUdCxkZXNjOmp0W1R0XX0sY2xhaW1zUmVxdWVzdFBhcnNpbmdFcnJvcjp7Y29kZTpBdCxkZXNjOmp0W0F0XX0sYXV0aG9yaXR5VXJpSW5zZWN1cmU6e2NvZGU6a3QsZGVzYzpqdFtrdF19LHVybFBhcnNlRXJyb3I6e2NvZGU6U3QsZGVzYzpqdFtTdF19LHVybEVtcHR5RXJyb3I6e2NvZGU6YnQsZGVzYzpqdFtidF19LGVtcHR5U2NvcGVzRXJyb3I6e2NvZGU6RXQsZGVzYzpqdFtFdF19LGludmFsaWRDbGFpbXNSZXF1ZXN0Ontjb2RlOlJ0LGRlc2M6anRbUnRdfSx0b2tlblJlcXVlc3RFbXB0eUVycm9yOntjb2RlOl90LGRlc2M6anRbX3RdfSxsb2dvdXRSZXF1ZXN0RW1wdHlFcnJvcjp7Y29kZTpQdCxkZXNjOmp0W1B0XX0saW52YWxpZENvZGVDaGFsbGVuZ2VNZXRob2Q6e2NvZGU6TXQsZGVzYzpqdFtNdF19LGludmFsaWRDb2RlQ2hhbGxlbmdlUGFyYW1zOntjb2RlOk90LGRlc2M6anRbT3RdfSxpbnZhbGlkQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YTp7Y29kZTpxdCxkZXNjOmp0W3F0XX0saW52YWxpZEF1dGhvcml0eU1ldGFkYXRhOntjb2RlOk50LGRlc2M6anRbTnRdfSx1bnRydXN0ZWRBdXRob3JpdHk6e2NvZGU6VXQsZGVzYzpqdFtVdF19LG1pc3NpbmdTc2hKd2s6e2NvZGU6THQsZGVzYzpqdFtMdF19LG1pc3NpbmdTc2hLaWQ6e2NvZGU6RHQsZGVzYzpqdFtEdF19LG1pc3NpbmdOb25jZUF1dGhlbnRpY2F0aW9uSGVhZGVyOntjb2RlOkh0LGRlc2M6anRbSHRdfSxpbnZhbGlkQXV0aGVudGljYXRpb25IZWFkZXI6e2NvZGU6eHQsZGVzYzpqdFt4dF19LGNhbm5vdFNldE9JRENPcHRpb25zOntjb2RlOkJ0LGRlc2M6anRbQnRdfSxjYW5ub3RBbGxvd1BsYXRmb3JtQnJva2VyOntjb2RlOkZ0LGRlc2M6anRbRnRdfSxhdXRob3JpdHlNaXNtYXRjaDp7Y29kZTp6dCxkZXNjOmp0W3p0XX0saW52YWxpZEF1dGhvcml6ZVBvc3RCb2R5UGFyYW1ldGVyczp7Y29kZTpHdCxkZXNjOmp0W0d0XX0saW52YWxpZFJlcXVlc3RNZXRob2RGb3JFQVI6e2NvZGU6S3QsZGVzYzpqdFtLdF19LGludmFsaWRQbGF0Zm9ybUJyb2tlckNvbmZpZ3VyYXRpb246e2NvZGU6JHQsZGVzYzpqdFskdF19fTtjbGFzcyBWdCBleHRlbmRzIENle2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUsanRbZV0pLHRoaXMubmFtZT0iQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yIixPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxWdC5wcm90b3R5cGUpfX1mdW5jdGlvbiBKdChlKXtyZXR1cm4gbmV3IFZ0KGUpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBZdHtzdGF0aWMgaXNFbXB0eU9iaihlKXtpZihlKXRyeXtjb25zdCB0PUpTT04ucGFyc2UoZSk7cmV0dXJuIDA9PT1PYmplY3Qua2V5cyh0KS5sZW5ndGh9Y2F0Y2goZSl7fXJldHVybiEwfXN0YXRpYyBzdGFydHNXaXRoKGUsdCl7cmV0dXJuIDA9PT1lLmluZGV4T2YodCl9c3RhdGljIGVuZHNXaXRoKGUsdCl7cmV0dXJuIGUubGVuZ3RoPj10Lmxlbmd0aCYmZS5sYXN0SW5kZXhPZih0KT09PWUubGVuZ3RoLXQubGVuZ3RofXN0YXRpYyBxdWVyeVN0cmluZ1RvT2JqZWN0KGUpe2NvbnN0IHQ9e30scj1lLnNwbGl0KCImIiksbj1lPT5kZWNvZGVVUklDb21wb25lbnQoZS5yZXBsYWNlKC9cKy9nLCIgIikpO3JldHVybiByLmZvckVhY2goKGU9PntpZihlLnRyaW0oKSl7Y29uc3RbcixvXT1lLnNwbGl0KC89KC4rKS9nLDIpO3ImJm8mJih0W24ocildPW4obykpfX0pKSx0fXN0YXRpYyB0cmltQXJyYXlFbnRyaWVzKGUpe3JldHVybiBlLm1hcCgoZT0+ZS50cmltKCkpKX1zdGF0aWMgcmVtb3ZlRW1wdHlTdHJpbmdzRnJvbUFycmF5KGUpe3JldHVybiBlLmZpbHRlcigoZT0+ISFlKSl9c3RhdGljIGpzb25QYXJzZUhlbHBlcihlKXt0cnl7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7cmV0dXJuIG51bGx9fXN0YXRpYyBtYXRjaFBhdHRlcm4oZSx0KXtyZXR1cm4gbmV3IFJlZ0V4cChlLnJlcGxhY2UoL1xcL2csIlxcXFwiKS5yZXBsYWNlKC9cKi9nLCJbXiBdKiIpLnJlcGxhY2UoL1w/L2csIlxcPyIpKS50ZXN0KHQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3MgWHR7Y29uc3RydWN0b3IoZSl7Y29uc3QgdD1lP1l0LnRyaW1BcnJheUVudHJpZXMoWy4uLmVdKTpbXSxyPXQ/WXQucmVtb3ZlRW1wdHlTdHJpbmdzRnJvbUFycmF5KHQpOltdO2lmKCFyfHwhci5sZW5ndGgpdGhyb3cgSnQoRXQpO3RoaXMuc2NvcGVzPW5ldyBTZXQsci5mb3JFYWNoKChlPT50aGlzLnNjb3Blcy5hZGQoZSkpKX1zdGF0aWMgZnJvbVN0cmluZyhlKXtjb25zdCByPShlfHx0LkVNUFRZX1NUUklORykuc3BsaXQoIiAiKTtyZXR1cm4gbmV3IFh0KHIpfXN0YXRpYyBjcmVhdGVTZWFyY2hTY29wZXMoZSl7Y29uc3Qgcj1lJiZlLmxlbmd0aD4wP2U6Wy4uLmhdLG49bmV3IFh0KHIpO3JldHVybiBuLmNvbnRhaW5zT25seU9JRENTY29wZXMoKT9uLnJlbW92ZVNjb3BlKHQuT0ZGTElORV9BQ0NFU1NfU0NPUEUpOm4ucmVtb3ZlT0lEQ1Njb3BlcygpLG59Y29udGFpbnNTY29wZShlKXtjb25zdCB0PXRoaXMucHJpbnRTY29wZXNMb3dlckNhc2UoKS5zcGxpdCgiICIpLHI9bmV3IFh0KHQpO3JldHVybiEhZSYmci5zY29wZXMuaGFzKGUudG9Mb3dlckNhc2UoKSl9Y29udGFpbnNTY29wZVNldChlKXtyZXR1cm4hKCFlfHxlLnNjb3Blcy5zaXplPD0wKSYmKHRoaXMuc2NvcGVzLnNpemU+PWUuc2NvcGVzLnNpemUmJmUuYXNBcnJheSgpLmV2ZXJ5KChlPT50aGlzLmNvbnRhaW5zU2NvcGUoZSkpKSl9Y29udGFpbnNPbmx5T0lEQ1Njb3Blcygpe2xldCBlPTA7cmV0dXJuIGQuZm9yRWFjaCgodD0+e3RoaXMuY29udGFpbnNTY29wZSh0KSYmKGUrPTEpfSkpLHRoaXMuc2NvcGVzLnNpemU9PT1lfWFwcGVuZFNjb3BlKGUpe2UmJnRoaXMuc2NvcGVzLmFkZChlLnRyaW0oKSl9YXBwZW5kU2NvcGVzKGUpe3RyeXtlLmZvckVhY2goKGU9PnRoaXMuYXBwZW5kU2NvcGUoZSkpKX1jYXRjaChlKXt0aHJvdyBtdCh4ZSl9fXJlbW92ZVNjb3BlKGUpe2lmKCFlKXRocm93IG10KEhlKTt0aGlzLnNjb3Blcy5kZWxldGUoZS50cmltKCkpfXJlbW92ZU9JRENTY29wZXMoKXtkLmZvckVhY2goKGU9Pnt0aGlzLnNjb3Blcy5kZWxldGUoZSl9KSl9dW5pb25TY29wZVNldHMoZSl7aWYoIWUpdGhyb3cgbXQoQmUpO2NvbnN0IHQ9bmV3IFNldDtyZXR1cm4gZS5zY29wZXMuZm9yRWFjaCgoZT0+dC5hZGQoZS50b0xvd2VyQ2FzZSgpKSkpLHRoaXMuc2NvcGVzLmZvckVhY2goKGU9PnQuYWRkKGUudG9Mb3dlckNhc2UoKSkpKSx0fWludGVyc2VjdGluZ1Njb3BlU2V0cyhlKXtpZighZSl0aHJvdyBtdChCZSk7ZS5jb250YWluc09ubHlPSURDU2NvcGVzKCl8fGUucmVtb3ZlT0lEQ1Njb3BlcygpO2NvbnN0IHQ9dGhpcy51bmlvblNjb3BlU2V0cyhlKSxyPWUuZ2V0U2NvcGVDb3VudCgpLG49dGhpcy5nZXRTY29wZUNvdW50KCk7cmV0dXJuIHQuc2l6ZTxuK3J9Z2V0U2NvcGVDb3VudCgpe3JldHVybiB0aGlzLnNjb3Blcy5zaXplfWFzQXJyYXkoKXtjb25zdCBlPVtdO3JldHVybiB0aGlzLnNjb3Blcy5mb3JFYWNoKCh0PT5lLnB1c2godCkpKSxlfXByaW50U2NvcGVzKCl7aWYodGhpcy5zY29wZXMpe3JldHVybiB0aGlzLmFzQXJyYXkoKS5qb2luKCIgIil9cmV0dXJuIHQuRU1QVFlfU1RSSU5HfXByaW50U2NvcGVzTG93ZXJDYXNlKCl7cmV0dXJuIHRoaXMucHJpbnRTY29wZXMoKS50b0xvd2VyQ2FzZSgpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gWnQoZSx0KXtpZighZSl0aHJvdyBtdChJZSk7dHJ5e2NvbnN0IHI9dChlKTtyZXR1cm4gSlNPTi5wYXJzZShyKX1jYXRjaChlKXt0aHJvdyBtdCh2ZSl9fWZ1bmN0aW9uIGVyKGUpe2lmKCFlKXRocm93IG10KHZlKTtjb25zdCByPWUuc3BsaXQoRCwyKTtyZXR1cm57dWlkOnJbMF0sdXRpZDpyLmxlbmd0aDwyP3QuRU1QVFlfU1RSSU5HOnJbMV19fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiB0cihlLHQpe3JldHVybiEhZSYmISF0JiZlPT09dC5zcGxpdCgiLiIpWzFdfWZ1bmN0aW9uIHJyKGUsdCxyLG4pe2lmKG4pe2NvbnN0e29pZDp0LHN1YjpyLHRpZDpvLG5hbWU6aSx0ZnA6cyxhY3I6YSxwcmVmZXJyZWRfdXNlcm5hbWU6Yyx1cG46bCxsb2dpbl9oaW50Omh9PW4sZD1vfHxzfHxhfHwiIjtyZXR1cm57dGVuYW50SWQ6ZCxsb2NhbEFjY291bnRJZDp0fHxyfHwiIixuYW1lOmksdXNlcm5hbWU6Y3x8bHx8IiIsbG9naW5IaW50OmgsaXNIb21lVGVuYW50OnRyKGQsZSl9fXJldHVybnt0ZW5hbnRJZDpyLGxvY2FsQWNjb3VudElkOnQsdXNlcm5hbWU6IiIsaXNIb21lVGVuYW50OnRyKHIsZSl9fWZ1bmN0aW9uIG5yKGUsdCxyLG4pe2xldCBvPWU7aWYodCl7Y29uc3R7aXNIb21lVGVuYW50OnIsLi4ubn09dDtvPXsuLi5lLC4uLm59fWlmKHIpe2NvbnN0e2lzSG9tZVRlbmFudDp0LC4uLml9PXJyKGUuaG9tZUFjY291bnRJZCxlLmxvY2FsQWNjb3VudElkLGUudGVuYW50SWQscik7cmV0dXJuIG89ey4uLm8sLi4uaSxpZFRva2VuQ2xhaW1zOnIsaWRUb2tlbjpufSxvfXJldHVybiBvfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBvcj0wLGlyPTEsc3I9Mixhcj0zOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiBjcihlKXtpZihlKXtyZXR1cm4gZS50aWR8fGUudGZwfHxlLmFjcnx8bnVsbH1yZXR1cm4gbnVsbH0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgbHI9e0FBRDoiQUFEIixPSURDOiJPSURDIixFQVI6IkVBUiJ9OwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBocntzdGF0aWMgZ2V0QWNjb3VudEluZm8oZSl7cmV0dXJue2hvbWVBY2NvdW50SWQ6ZS5ob21lQWNjb3VudElkLGVudmlyb25tZW50OmUuZW52aXJvbm1lbnQsdGVuYW50SWQ6ZS5yZWFsbSx1c2VybmFtZTplLnVzZXJuYW1lLGxvY2FsQWNjb3VudElkOmUubG9jYWxBY2NvdW50SWQsbG9naW5IaW50OmUubG9naW5IaW50LG5hbWU6ZS5uYW1lLG5hdGl2ZUFjY291bnRJZDplLm5hdGl2ZUFjY291bnRJZCxhdXRob3JpdHlUeXBlOmUuYXV0aG9yaXR5VHlwZSx0ZW5hbnRQcm9maWxlczpuZXcgTWFwKChlLnRlbmFudFByb2ZpbGVzfHxbXSkubWFwKChlPT5bZS50ZW5hbnRJZCxlXSkpKSxkYXRhQm91bmRhcnk6ZS5kYXRhQm91bmRhcnl9fWlzU2luZ2xlVGVuYW50KCl7cmV0dXJuIXRoaXMudGVuYW50UHJvZmlsZXN9c3RhdGljIGNyZWF0ZUFjY291bnQoZSx0LHIpe2NvbnN0IG49bmV3IGhyO2xldCBvO3QuYXV0aG9yaXR5VHlwZT09PWlyP24uYXV0aG9yaXR5VHlwZT1OOnQucHJvdG9jb2xNb2RlPT09bHIuT0lEQz9uLmF1dGhvcml0eVR5cGU9VTpuLmF1dGhvcml0eVR5cGU9cSxlLmNsaWVudEluZm8mJnImJihvPVp0KGUuY2xpZW50SW5mbyxyKSxvLnhtc190ZGJyJiYobi5kYXRhQm91bmRhcnk9IkVVIj09PW8ueG1zX3RkYnI/IkVVIjoiTm9uZSIpKSxuLmNsaWVudEluZm89ZS5jbGllbnRJbmZvLG4uaG9tZUFjY291bnRJZD1lLmhvbWVBY2NvdW50SWQsbi5uYXRpdmVBY2NvdW50SWQ9ZS5uYXRpdmVBY2NvdW50SWQ7Y29uc3QgaT1lLmVudmlyb25tZW50fHx0JiZ0LmdldFByZWZlcnJlZENhY2hlKCk7aWYoIWkpdGhyb3cgbXQoUWUpO24uZW52aXJvbm1lbnQ9aSxuLnJlYWxtPW8/LnV0aWR8fGNyKGUuaWRUb2tlbkNsYWltcyl8fCIiLG4ubG9jYWxBY2NvdW50SWQ9bz8udWlkfHxlLmlkVG9rZW5DbGFpbXM/Lm9pZHx8ZS5pZFRva2VuQ2xhaW1zPy5zdWJ8fCIiO2NvbnN0IHM9ZS5pZFRva2VuQ2xhaW1zPy5wcmVmZXJyZWRfdXNlcm5hbWV8fGUuaWRUb2tlbkNsYWltcz8udXBuLGE9ZS5pZFRva2VuQ2xhaW1zPy5lbWFpbHM/ZS5pZFRva2VuQ2xhaW1zLmVtYWlsc1swXTpudWxsO2lmKG4udXNlcm5hbWU9c3x8YXx8IiIsbi5sb2dpbkhpbnQ9ZS5pZFRva2VuQ2xhaW1zPy5sb2dpbl9oaW50LG4ubmFtZT1lLmlkVG9rZW5DbGFpbXM/Lm5hbWV8fCIiLG4uY2xvdWRHcmFwaEhvc3ROYW1lPWUuY2xvdWRHcmFwaEhvc3ROYW1lLG4ubXNHcmFwaEhvc3Q9ZS5tc0dyYXBoSG9zdCxlLnRlbmFudFByb2ZpbGVzKW4udGVuYW50UHJvZmlsZXM9ZS50ZW5hbnRQcm9maWxlcztlbHNle2NvbnN0IHQ9cnIoZS5ob21lQWNjb3VudElkLG4ubG9jYWxBY2NvdW50SWQsbi5yZWFsbSxlLmlkVG9rZW5DbGFpbXMpO24udGVuYW50UHJvZmlsZXM9W3RdfXJldHVybiBufXN0YXRpYyBjcmVhdGVGcm9tQWNjb3VudEluZm8oZSx0LHIpe2NvbnN0IG49bmV3IGhyO3JldHVybiBuLmF1dGhvcml0eVR5cGU9ZS5hdXRob3JpdHlUeXBlfHxVLG4uaG9tZUFjY291bnRJZD1lLmhvbWVBY2NvdW50SWQsbi5sb2NhbEFjY291bnRJZD1lLmxvY2FsQWNjb3VudElkLG4ubmF0aXZlQWNjb3VudElkPWUubmF0aXZlQWNjb3VudElkLG4ucmVhbG09ZS50ZW5hbnRJZCxuLmVudmlyb25tZW50PWUuZW52aXJvbm1lbnQsbi51c2VybmFtZT1lLnVzZXJuYW1lLG4ubmFtZT1lLm5hbWUsbi5sb2dpbkhpbnQ9ZS5sb2dpbkhpbnQsbi5jbG91ZEdyYXBoSG9zdE5hbWU9dCxuLm1zR3JhcGhIb3N0PXIsbi50ZW5hbnRQcm9maWxlcz1BcnJheS5mcm9tKGUudGVuYW50UHJvZmlsZXM/LnZhbHVlcygpfHxbXSksbi5kYXRhQm91bmRhcnk9ZS5kYXRhQm91bmRhcnksbn1zdGF0aWMgZ2VuZXJhdGVIb21lQWNjb3VudElkKGUsdCxyLG4sbyl7aWYodCE9PWlyJiZ0IT09c3Ipe2lmKGUpdHJ5e2NvbnN0IHQ9WnQoZSxuLmJhc2U2NERlY29kZSk7aWYodC51aWQmJnQudXRpZClyZXR1cm5gJHt0LnVpZH0uJHt0LnV0aWR9YH1jYXRjaChlKXt9ci53YXJuaW5nKCJObyBjbGllbnQgaW5mbyBpbiByZXNwb25zZSIpfXJldHVybiBvPy5zdWJ8fCIifXN0YXRpYyBpc0FjY291bnRFbnRpdHkoZSl7cmV0dXJuISFlJiYoZS5oYXNPd25Qcm9wZXJ0eSgiaG9tZUFjY291bnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJlbnZpcm9ubWVudCIpJiZlLmhhc093blByb3BlcnR5KCJyZWFsbSIpJiZlLmhhc093blByb3BlcnR5KCJsb2NhbEFjY291bnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJ1c2VybmFtZSIpJiZlLmhhc093blByb3BlcnR5KCJhdXRob3JpdHlUeXBlIikpfXN0YXRpYyBhY2NvdW50SW5mb0lzRXF1YWwoZSx0LHIpe2lmKCFlfHwhdClyZXR1cm4hMTtsZXQgbj0hMDtpZihyKXtjb25zdCByPWUuaWRUb2tlbkNsYWltc3x8e30sbz10LmlkVG9rZW5DbGFpbXN8fHt9O249ci5pYXQ9PT1vLmlhdCYmci5ub25jZT09PW8ubm9uY2V9cmV0dXJuIGUuaG9tZUFjY291bnRJZD09PXQuaG9tZUFjY291bnRJZCYmZS5sb2NhbEFjY291bnRJZD09PXQubG9jYWxBY2NvdW50SWQmJmUudXNlcm5hbWU9PT10LnVzZXJuYW1lJiZlLnRlbmFudElkPT09dC50ZW5hbnRJZCYmZS5sb2dpbkhpbnQ9PT10LmxvZ2luSGludCYmZS5lbnZpcm9ubWVudD09PXQuZW52aXJvbm1lbnQmJmUubmF0aXZlQWNjb3VudElkPT09dC5uYXRpdmVBY2NvdW50SWQmJm59fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiBkcihlLHQpe2NvbnN0IHI9ZnVuY3Rpb24oZSl7aWYoIWUpdGhyb3cgbXQoQWUpO2NvbnN0IHQ9L14oW15cLlxzXSopXC4oW15cLlxzXSspXC4oW15cLlxzXSopJC8uZXhlYyhlKTtpZighdHx8dC5sZW5ndGg8NCl0aHJvdyBtdChUZSk7cmV0dXJuIHRbMl19KGUpO3RyeXtjb25zdCBlPXQocik7cmV0dXJuIEpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7dGhyb3cgbXQoVGUpfX1mdW5jdGlvbiB1cihlKXtpZighZS5zaWduaW5fc3RhdGUpcmV0dXJuITE7Y29uc3QgdD1bImttc2kiLCJkdmNfZG1qZCJdO3JldHVybiBlLnNpZ25pbl9zdGF0ZS5zb21lKChlPT50LmluY2x1ZGVzKGUudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSl9ZnVuY3Rpb24gZ3IoZSx0KXtpZigwPT09dHx8RGF0ZS5ub3coKS0zZTU+ZSt0KXRocm93IG10KHFlKX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gcHIoZSl7aWYoIWUpcmV0dXJuIGU7bGV0IHQ9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiBZdC5lbmRzV2l0aCh0LCI/Iik/dD10LnNsaWNlKDAsLTEpOll0LmVuZHNXaXRoKHQsIj8vIikmJih0PXQuc2xpY2UoMCwtMikpLFl0LmVuZHNXaXRoKHQsIi8iKXx8KHQrPSIvIiksdH1mdW5jdGlvbiBtcihlKXtyZXR1cm4gZS5zdGFydHNXaXRoKCIjLyIpP2Uuc3Vic3RyaW5nKDIpOmUuc3RhcnRzV2l0aCgiIyIpfHxlLnN0YXJ0c1dpdGgoIj8iKT9lLnN1YnN0cmluZygxKTplfWZ1bmN0aW9uIGZyKGUpe2lmKCFlfHxlLmluZGV4T2YoIj0iKTwwKXJldHVybiBudWxsO3RyeXtjb25zdCB0PW1yKGUpLHI9T2JqZWN0LmZyb21FbnRyaWVzKG5ldyBVUkxTZWFyY2hQYXJhbXModCkpO2lmKHIuY29kZXx8ci5lYXJfandlfHxyLmVycm9yfHxyLmVycm9yX2Rlc2NyaXB0aW9ufHxyLnN0YXRlKXJldHVybiByfWNhdGNoKGUpe3Rocm93IG10KEVlKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB5cihlLHQ9ITAscil7Y29uc3Qgbj1uZXcgQXJyYXk7cmV0dXJuIGUuZm9yRWFjaCgoKGUsbyk9PnshdCYmciYmbyBpbiByP24ucHVzaChgJHtvfT0ke2V9YCk6bi5wdXNoKGAke299PSR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfWApfSkpLG4uam9pbigiJiIpfWZ1bmN0aW9uIENyKGUpe2lmKCFlKXJldHVybiBlO2NvbnN0IHQ9ZS5zcGxpdCgiIyIpWzBdO3RyeXtjb25zdCBlPW5ldyBVUkwodCk7cmV0dXJuIHByKGUub3JpZ2luK2UucGF0aG5hbWUrZS5zZWFyY2gpfWNhdGNoKGUpe3JldHVybiBwcih0KX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIHdye2dldCB1cmxTdHJpbmcoKXtyZXR1cm4gdGhpcy5fdXJsU3RyaW5nfWNvbnN0cnVjdG9yKGUpe2lmKHRoaXMuX3VybFN0cmluZz1lLCF0aGlzLl91cmxTdHJpbmcpdGhyb3cgSnQoYnQpO2UuaW5jbHVkZXMoIiMiKXx8KHRoaXMuX3VybFN0cmluZz13ci5jYW5vbmljYWxpemVVcmkoZSkpfXN0YXRpYyBjYW5vbmljYWxpemVVcmkoZSl7aWYoZSl7bGV0IHQ9ZS50b0xvd2VyQ2FzZSgpO3JldHVybiBZdC5lbmRzV2l0aCh0LCI/Iik/dD10LnNsaWNlKDAsLTEpOll0LmVuZHNXaXRoKHQsIj8vIikmJih0PXQuc2xpY2UoMCwtMikpLFl0LmVuZHNXaXRoKHQsIi8iKXx8KHQrPSIvIiksdH1yZXR1cm4gZX12YWxpZGF0ZUFzVXJpKCl7bGV0IGU7dHJ5e2U9dGhpcy5nZXRVcmxDb21wb25lbnRzKCl9Y2F0Y2goZSl7dGhyb3cgSnQoU3QpfWlmKCFlLkhvc3ROYW1lQW5kUG9ydHx8IWUuUGF0aFNlZ21lbnRzKXRocm93IEp0KFN0KTtpZighZS5Qcm90b2NvbHx8Imh0dHBzOiIhPT1lLlByb3RvY29sLnRvTG93ZXJDYXNlKCkpdGhyb3cgSnQoa3QpfXN0YXRpYyBhcHBlbmRRdWVyeVN0cmluZyhlLHQpe3JldHVybiB0P2UuaW5kZXhPZigiPyIpPDA/YCR7ZX0/JHt0fWA6YCR7ZX0mJHt0fWA6ZX1zdGF0aWMgcmVtb3ZlSGFzaEZyb21VcmwoZSl7cmV0dXJuIHdyLmNhbm9uaWNhbGl6ZVVyaShlLnNwbGl0KCIjIilbMF0pfXJlcGxhY2VUZW5hbnRQYXRoKGUpe2NvbnN0IHQ9dGhpcy5nZXRVcmxDb21wb25lbnRzKCkscj10LlBhdGhTZWdtZW50cztyZXR1cm4hZXx8MD09PXIubGVuZ3RofHxyWzBdIT09SSYmclswXSE9PVR8fChyWzBdPWUpLHdyLmNvbnN0cnVjdEF1dGhvcml0eVVyaUZyb21PYmplY3QodCl9Z2V0VXJsQ29tcG9uZW50cygpe2NvbnN0IGU9UmVnRXhwKCJeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/IiksdD10aGlzLnVybFN0cmluZy5tYXRjaChlKTtpZighdCl0aHJvdyBKdChTdCk7Y29uc3Qgcj17UHJvdG9jb2w6dFsxXSxIb3N0TmFtZUFuZFBvcnQ6dFs0XSxBYnNvbHV0ZVBhdGg6dFs1XSxRdWVyeVN0cmluZzp0WzddfTtsZXQgbj1yLkFic29sdXRlUGF0aC5zcGxpdCgiLyIpO3JldHVybiBuPW4uZmlsdGVyKChlPT5lJiZlLmxlbmd0aD4wKSksci5QYXRoU2VnbWVudHM9bixyLlF1ZXJ5U3RyaW5nJiZyLlF1ZXJ5U3RyaW5nLmVuZHNXaXRoKCIvIikmJihyLlF1ZXJ5U3RyaW5nPXIuUXVlcnlTdHJpbmcuc3Vic3RyaW5nKDAsci5RdWVyeVN0cmluZy5sZW5ndGgtMSkpLHJ9c3RhdGljIGdldERvbWFpbkZyb21VcmwoZSl7Y29uc3QgdD1SZWdFeHAoIl4oW146Lz8jXSs6Ly8pPyhbXi8/I10qKSIpLHI9ZS5tYXRjaCh0KTtpZighcil0aHJvdyBKdChTdCk7cmV0dXJuIHJbMl19c3RhdGljIGdldEFic29sdXRlVXJsKGUscil7aWYoZVswXT09PXQuRk9SV0FSRF9TTEFTSCl7Y29uc3QgdD1uZXcgd3IocikuZ2V0VXJsQ29tcG9uZW50cygpO3JldHVybiB0LlByb3RvY29sKyIvLyIrdC5Ib3N0TmFtZUFuZFBvcnQrZX1yZXR1cm4gZX1zdGF0aWMgY29uc3RydWN0QXV0aG9yaXR5VXJpRnJvbU9iamVjdChlKXtyZXR1cm4gbmV3IHdyKGUuUHJvdG9jb2wrIi8vIitlLkhvc3ROYW1lQW5kUG9ydCsiLyIrZS5QYXRoU2VnbWVudHMuam9pbigiLyIpKX1zdGF0aWMgaGFzaENvbnRhaW5zS25vd25Qcm9wZXJ0aWVzKGUpe3JldHVybiEhZnIoZSl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB2cj17ImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iOnt0b2tlbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUuY29tL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvdG9rZW4iLGp3a3NfdXJpOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20ve3RlbmFudGlkfS9kaXNjb3ZlcnkvdjIuMC9rZXlzIixpc3N1ZXI6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L3YyLjAiLGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L29hdXRoMi92Mi4wL2F1dGhvcml6ZSIsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLmNvbS97dGVuYW50aWR9L29hdXRoMi92Mi4wL2xvZ291dCJ9LCJsb2dpbi5jaGluYWNsb3VkYXBpLmNuIjp7dG9rZW5fZW5kcG9pbnQ6Imh0dHBzOi8vbG9naW4uY2hpbmFjbG91ZGFwaS5jbi97dGVuYW50aWR9L29hdXRoMi92Mi4wL3Rva2VuIixqd2tzX3VyaToiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuL3t0ZW5hbnRpZH0vZGlzY292ZXJ5L3YyLjAva2V5cyIsaXNzdWVyOiJodHRwczovL2xvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuL3t0ZW5hbnRpZH0vdjIuMCIsYXV0aG9yaXphdGlvbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvYXV0aG9yaXplIixlbmRfc2Vzc2lvbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5jaGluYWNsb3VkYXBpLmNuL3t0ZW5hbnRpZH0vb2F1dGgyL3YyLjAvbG9nb3V0In0sImxvZ2luLm1pY3Jvc29mdG9ubGluZS51cyI6e3Rva2VuX2VuZHBvaW50OiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS51cy97dGVuYW50aWR9L29hdXRoMi92Mi4wL3Rva2VuIixqd2tzX3VyaToiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMve3RlbmFudGlkfS9kaXNjb3ZlcnkvdjIuMC9rZXlzIixpc3N1ZXI6Imh0dHBzOi8vbG9naW4ubWljcm9zb2Z0b25saW5lLnVzL3t0ZW5hbnRpZH0vdjIuMCIsYXV0aG9yaXphdGlvbl9lbmRwb2ludDoiaHR0cHM6Ly9sb2dpbi5taWNyb3NvZnRvbmxpbmUudXMve3RlbmFudGlkfS9vYXV0aDIvdjIuMC9hdXRob3JpemUiLGVuZF9zZXNzaW9uX2VuZHBvaW50OiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS51cy97dGVuYW50aWR9L29hdXRoMi92Mi4wL2xvZ291dCJ9fSxJcj17bWV0YWRhdGE6W3twcmVmZXJyZWRfbmV0d29yazoibG9naW4ubWljcm9zb2Z0b25saW5lLmNvbSIscHJlZmVycmVkX2NhY2hlOiJsb2dpbi53aW5kb3dzLm5ldCIsYWxpYXNlczpbImxvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20iLCJsb2dpbi53aW5kb3dzLm5ldCIsImxvZ2luLm1pY3Jvc29mdC5jb20iLCJzdHMud2luZG93cy5uZXQiXX0se3ByZWZlcnJlZF9uZXR3b3JrOiJsb2dpbi5wYXJ0bmVyLm1pY3Jvc29mdG9ubGluZS5jbiIscHJlZmVycmVkX2NhY2hlOiJsb2dpbi5wYXJ0bmVyLm1pY3Jvc29mdG9ubGluZS5jbiIsYWxpYXNlczpbImxvZ2luLnBhcnRuZXIubWljcm9zb2Z0b25saW5lLmNuIiwibG9naW4uY2hpbmFjbG91ZGFwaS5jbiJdfSx7cHJlZmVycmVkX25ldHdvcms6ImxvZ2luLm1pY3Jvc29mdG9ubGluZS5kZSIscHJlZmVycmVkX2NhY2hlOiJsb2dpbi5taWNyb3NvZnRvbmxpbmUuZGUiLGFsaWFzZXM6WyJsb2dpbi5taWNyb3NvZnRvbmxpbmUuZGUiXX0se3ByZWZlcnJlZF9uZXR3b3JrOiJsb2dpbi5taWNyb3NvZnRvbmxpbmUudXMiLHByZWZlcnJlZF9jYWNoZToibG9naW4ubWljcm9zb2Z0b25saW5lLnVzIixhbGlhc2VzOlsibG9naW4ubWljcm9zb2Z0b25saW5lLnVzIiwibG9naW4udXNnb3ZjbG91ZGFwaS5uZXQiXX0se3ByZWZlcnJlZF9uZXR3b3JrOiJsb2dpbi11cy5taWNyb3NvZnRvbmxpbmUuY29tIixwcmVmZXJyZWRfY2FjaGU6ImxvZ2luLXVzLm1pY3Jvc29mdG9ubGluZS5jb20iLGFsaWFzZXM6WyJsb2dpbi11cy5taWNyb3NvZnRvbmxpbmUuY29tIl19XX0sVHI9bmV3IFNldDtmdW5jdGlvbiBBcihlLHQscixuKXtpZihuPy50cmFjZShgZ2V0QWxpYXNlc0Zyb21NZXRhZGF0YSBjYWxsZWQgd2l0aCBzb3VyY2U6ICR7cn1gKSxlJiZ0KXtjb25zdCBvPWtyKHQsZSk7aWYobylyZXR1cm4gbj8udHJhY2UoYGdldEFsaWFzZXNGcm9tTWV0YWRhdGE6IGZvdW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiAke3J9LCByZXR1cm5pbmcgYWxpYXNlc2ApLG8uYWxpYXNlcztuPy50cmFjZShgZ2V0QWxpYXNlc0Zyb21NZXRhZGF0YTogZGlkIG5vdCBmaW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiAke3J9YCl9cmV0dXJuIG51bGx9ZnVuY3Rpb24ga3IoZSx0KXtmb3IobGV0IHI9MDtyPGUubGVuZ3RoO3IrKyl7Y29uc3Qgbj1lW3JdO2lmKG4uYWxpYXNlcy5pbmNsdWRlcyh0KSlyZXR1cm4gbn1yZXR1cm4gbnVsbH0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovSXIubWV0YWRhdGEuZm9yRWFjaCgoZT0+e2UuYWxpYXNlcy5mb3JFYWNoKChlPT57VHIuYWRkKGUpfSkpfSkpO2NvbnN0IFNyPSJjYWNoZV9xdW90YV9leGNlZWRlZCIsYnI9ImNhY2hlX2Vycm9yX3Vua25vd24iLEVyPXtbU3JdOiJFeGNlZWRlZCBjYWNoZSBzdG9yYWdlIGNhcGFjaXR5LiIsW2JyXToiVW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGVuIHVzaW5nIGNhY2hlIHN0b3JhZ2UuIn07Y2xhc3MgUnIgZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe2NvbnN0IHI9dHx8KEVyW2VdP0VyW2VdOkVyW2JyXSk7c3VwZXIoYCR7ZX06ICR7cn1gKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxSci5wcm90b3R5cGUpLHRoaXMubmFtZT0iQ2FjaGVFcnJvciIsdGhpcy5lcnJvckNvZGU9ZSx0aGlzLmVycm9yTWVzc2FnZT1yfX1mdW5jdGlvbiBfcihlKXtyZXR1cm4gZSBpbnN0YW5jZW9mIEVycm9yPyJRdW90YUV4Y2VlZGVkRXJyb3IiPT09ZS5uYW1lfHwiTlNfRVJST1JfRE9NX1FVT1RBX1JFQUNIRUQiPT09ZS5uYW1lfHxlLm1lc3NhZ2UuaW5jbHVkZXMoImV4Y2VlZGVkIHRoZSBxdW90YSIpP25ldyBScihTcik6bmV3IFJyKGUubmFtZSxlLm1lc3NhZ2UpOm5ldyBScihicil9Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIFBye2NvbnN0cnVjdG9yKGUsdCxyLG4sbyl7dGhpcy5jbGllbnRJZD1lLHRoaXMuY3J5cHRvSW1wbD10LHRoaXMuY29tbW9uTG9nZ2VyPXIuY2xvbmUod3QsdnQpLHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucz1vLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ9bn1nZXRBbGxBY2NvdW50cyhlLHQpe3JldHVybiB0aGlzLmJ1aWxkVGVuYW50UHJvZmlsZXModGhpcy5nZXRBY2NvdW50c0ZpbHRlcmVkQnkoZSx0KSx0LGUpfWdldEFjY291bnRJbmZvRmlsdGVyZWRCeShlLHQpe2lmKDA9PT1PYmplY3Qua2V5cyhlKS5sZW5ndGh8fE9iamVjdC52YWx1ZXMoZSkuZXZlcnkoKGU9PiFlKSkpcmV0dXJuIHRoaXMuY29tbW9uTG9nZ2VyLndhcm5pbmcoImdldEFjY291bnRJbmZvRmlsdGVyZWRCeTogQWNjb3VudCBmaWx0ZXIgaXMgZW1wdHkgb3IgaW52YWxpZCwgcmV0dXJuaW5nIG51bGwiKSxudWxsO2NvbnN0IHI9dGhpcy5nZXRBbGxBY2NvdW50cyhlLHQpO2lmKHIubGVuZ3RoPjEpe3JldHVybiByLnNvcnQoKGU9PmUuaWRUb2tlbkNsYWltcz8tMToxKSlbMF19cmV0dXJuIDE9PT1yLmxlbmd0aD9yWzBdOm51bGx9Z2V0QmFzZUFjY291bnRJbmZvKGUsdCl7Y29uc3Qgcj10aGlzLmdldEFjY291bnRzRmlsdGVyZWRCeShlLHQpO3JldHVybiByLmxlbmd0aD4wP2hyLmdldEFjY291bnRJbmZvKHJbMF0pOm51bGx9YnVpbGRUZW5hbnRQcm9maWxlcyhlLHQscil7cmV0dXJuIGUuZmxhdE1hcCgoZT0+dGhpcy5nZXRUZW5hbnRQcm9maWxlc0Zyb21BY2NvdW50RW50aXR5KGUsdCxyPy50ZW5hbnRJZCxyKSkpfWdldFRlbmFudGVkQWNjb3VudEluZm9CeUZpbHRlcihlLHQscixuLG8pe2xldCBpLHM9bnVsbDtpZihvJiYhdGhpcy50ZW5hbnRQcm9maWxlTWF0Y2hlc0ZpbHRlcihyLG8pKXJldHVybiBudWxsO2NvbnN0IGE9dGhpcy5nZXRJZFRva2VuKGUsbix0LHIudGVuYW50SWQpO3JldHVybiBhJiYoaT1kcihhLnNlY3JldCx0aGlzLmNyeXB0b0ltcGwuYmFzZTY0RGVjb2RlKSwhdGhpcy5pZFRva2VuQ2xhaW1zTWF0Y2hUZW5hbnRQcm9maWxlRmlsdGVyKGksbykpP251bGw6KHM9bnIoZSxyLGksYT8uc2VjcmV0KSxzKX1nZXRUZW5hbnRQcm9maWxlc0Zyb21BY2NvdW50RW50aXR5KGUsdCxyLG4pe2NvbnN0IG89aHIuZ2V0QWNjb3VudEluZm8oZSk7bGV0IGk9by50ZW5hbnRQcm9maWxlc3x8bmV3IE1hcDtjb25zdCBzPXRoaXMuZ2V0VG9rZW5LZXlzKCk7aWYocil7Y29uc3QgZT1pLmdldChyKTtpZighZSlyZXR1cm5bXTtpPW5ldyBNYXAoW1tyLGVdXSl9Y29uc3QgYT1bXTtyZXR1cm4gaS5mb3JFYWNoKChlPT57Y29uc3Qgcj10aGlzLmdldFRlbmFudGVkQWNjb3VudEluZm9CeUZpbHRlcihvLHMsZSx0LG4pO3ImJmEucHVzaChyKX0pKSxhfXRlbmFudFByb2ZpbGVNYXRjaGVzRmlsdGVyKGUsdCl7cmV0dXJuISh0LmxvY2FsQWNjb3VudElkJiYhdGhpcy5tYXRjaExvY2FsQWNjb3VudElkRnJvbVRlbmFudFByb2ZpbGUoZSx0LmxvY2FsQWNjb3VudElkKSkmJigoIXQubmFtZXx8ZS5uYW1lPT09dC5uYW1lKSYmKHZvaWQgMD09PXQuaXNIb21lVGVuYW50fHxlLmlzSG9tZVRlbmFudD09PXQuaXNIb21lVGVuYW50KSl9aWRUb2tlbkNsYWltc01hdGNoVGVuYW50UHJvZmlsZUZpbHRlcihlLHQpe2lmKHQpe2lmKHQubG9jYWxBY2NvdW50SWQmJiF0aGlzLm1hdGNoTG9jYWxBY2NvdW50SWRGcm9tVG9rZW5DbGFpbXMoZSx0LmxvY2FsQWNjb3VudElkKSlyZXR1cm4hMTtpZih0LmxvZ2luSGludCYmIXRoaXMubWF0Y2hMb2dpbkhpbnRGcm9tVG9rZW5DbGFpbXMoZSx0LmxvZ2luSGludCkpcmV0dXJuITE7aWYodC51c2VybmFtZSYmIXRoaXMubWF0Y2hVc2VybmFtZShlLnByZWZlcnJlZF91c2VybmFtZSx0LnVzZXJuYW1lKSlyZXR1cm4hMTtpZih0Lm5hbWUmJiF0aGlzLm1hdGNoTmFtZShlLHQubmFtZSkpcmV0dXJuITE7aWYodC5zaWQmJiF0aGlzLm1hdGNoU2lkKGUsdC5zaWQpKXJldHVybiExfXJldHVybiEwfWFzeW5jIHNhdmVDYWNoZVJlY29yZChlLHQscixuKXtpZighZSl0aHJvdyBtdCgkZSk7dHJ5e2UuYWNjb3VudCYmYXdhaXQgdGhpcy5zZXRBY2NvdW50KGUuYWNjb3VudCx0LHIpLGUuaWRUb2tlbiYmITEhPT1uPy5pZFRva2VuJiZhd2FpdCB0aGlzLnNldElkVG9rZW5DcmVkZW50aWFsKGUuaWRUb2tlbix0LHIpLGUuYWNjZXNzVG9rZW4mJiExIT09bj8uYWNjZXNzVG9rZW4mJmF3YWl0IHRoaXMuc2F2ZUFjY2Vzc1Rva2VuKGUuYWNjZXNzVG9rZW4sdCxyKSxlLnJlZnJlc2hUb2tlbiYmITEhPT1uPy5yZWZyZXNoVG9rZW4mJmF3YWl0IHRoaXMuc2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbChlLnJlZnJlc2hUb2tlbix0LHIpLGUuYXBwTWV0YWRhdGEmJnRoaXMuc2V0QXBwTWV0YWRhdGEoZS5hcHBNZXRhZGF0YSx0KX1jYXRjaChlKXt0aHJvdyB0aGlzLmNvbW1vbkxvZ2dlcj8uZXJyb3IoIkNhY2hlTWFuYWdlci5zYXZlQ2FjaGVSZWNvcmQ6IGZhaWxlZCIpLGUgaW5zdGFuY2VvZiBDZT9lOl9yKGUpfX1hc3luYyBzYXZlQWNjZXNzVG9rZW4oZSx0LHIpe2NvbnN0IG49e2NsaWVudElkOmUuY2xpZW50SWQsY3JlZGVudGlhbFR5cGU6ZS5jcmVkZW50aWFsVHlwZSxlbnZpcm9ubWVudDplLmVudmlyb25tZW50LGhvbWVBY2NvdW50SWQ6ZS5ob21lQWNjb3VudElkLHJlYWxtOmUucmVhbG0sdG9rZW5UeXBlOmUudG9rZW5UeXBlLHJlcXVlc3RlZENsYWltc0hhc2g6ZS5yZXF1ZXN0ZWRDbGFpbXNIYXNofSxvPXRoaXMuZ2V0VG9rZW5LZXlzKCksaT1YdC5mcm9tU3RyaW5nKGUudGFyZ2V0KTtvLmFjY2Vzc1Rva2VuLmZvckVhY2goKGU9PntpZighdGhpcy5hY2Nlc3NUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSxuLCExKSlyZXR1cm47Y29uc3Qgcj10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLHQpO2lmKHImJnRoaXMuY3JlZGVudGlhbE1hdGNoZXNGaWx0ZXIocixuKSl7WHQuZnJvbVN0cmluZyhyLnRhcmdldCkuaW50ZXJzZWN0aW5nU2NvcGVTZXRzKGkpJiZ0aGlzLnJlbW92ZUFjY2Vzc1Rva2VuKGUsdCl9fSkpLGF3YWl0IHRoaXMuc2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGUsdCxyKX1nZXRBY2NvdW50c0ZpbHRlcmVkQnkoZSx0KXtjb25zdCByPXRoaXMuZ2V0QWNjb3VudEtleXMoKSxuPVtdO3JldHVybiByLmZvckVhY2goKHI9Pntjb25zdCBvPXRoaXMuZ2V0QWNjb3VudChyLHQpO2lmKCFvKXJldHVybjtpZihlLmhvbWVBY2NvdW50SWQmJiF0aGlzLm1hdGNoSG9tZUFjY291bnRJZChvLGUuaG9tZUFjY291bnRJZCkpcmV0dXJuO2lmKGUudXNlcm5hbWUmJiF0aGlzLm1hdGNoVXNlcm5hbWUoby51c2VybmFtZSxlLnVzZXJuYW1lKSlyZXR1cm47aWYoZS5lbnZpcm9ubWVudCYmIXRoaXMubWF0Y2hFbnZpcm9ubWVudChvLGUuZW52aXJvbm1lbnQpKXJldHVybjtpZihlLnJlYWxtJiYhdGhpcy5tYXRjaFJlYWxtKG8sZS5yZWFsbSkpcmV0dXJuO2lmKGUubmF0aXZlQWNjb3VudElkJiYhdGhpcy5tYXRjaE5hdGl2ZUFjY291bnRJZChvLGUubmF0aXZlQWNjb3VudElkKSlyZXR1cm47aWYoZS5hdXRob3JpdHlUeXBlJiYhdGhpcy5tYXRjaEF1dGhvcml0eVR5cGUobyxlLmF1dGhvcml0eVR5cGUpKXJldHVybjtjb25zdCBpPXtsb2NhbEFjY291bnRJZDplPy5sb2NhbEFjY291bnRJZCxuYW1lOmU/Lm5hbWV9LHM9by50ZW5hbnRQcm9maWxlcz8uZmlsdGVyKChlPT50aGlzLnRlbmFudFByb2ZpbGVNYXRjaGVzRmlsdGVyKGUsaSkpKTtzJiYwPT09cy5sZW5ndGh8fG4ucHVzaChvKX0pKSxufWNyZWRlbnRpYWxNYXRjaGVzRmlsdGVyKGUsdCl7aWYodC5jbGllbnRJZCYmIXRoaXMubWF0Y2hDbGllbnRJZChlLHQuY2xpZW50SWQpKXJldHVybiExO2lmKHQudXNlckFzc2VydGlvbkhhc2gmJiF0aGlzLm1hdGNoVXNlckFzc2VydGlvbkhhc2goZSx0LnVzZXJBc3NlcnRpb25IYXNoKSlyZXR1cm4hMTtpZigic3RyaW5nIj09dHlwZW9mIHQuaG9tZUFjY291bnRJZCYmIXRoaXMubWF0Y2hIb21lQWNjb3VudElkKGUsdC5ob21lQWNjb3VudElkKSlyZXR1cm4hMTtpZih0LmVudmlyb25tZW50JiYhdGhpcy5tYXRjaEVudmlyb25tZW50KGUsdC5lbnZpcm9ubWVudCkpcmV0dXJuITE7aWYodC5yZWFsbSYmIXRoaXMubWF0Y2hSZWFsbShlLHQucmVhbG0pKXJldHVybiExO2lmKHQuY3JlZGVudGlhbFR5cGUmJiF0aGlzLm1hdGNoQ3JlZGVudGlhbFR5cGUoZSx0LmNyZWRlbnRpYWxUeXBlKSlyZXR1cm4hMTtpZih0LmZhbWlseUlkJiYhdGhpcy5tYXRjaEZhbWlseUlkKGUsdC5mYW1pbHlJZCkpcmV0dXJuITE7aWYodC50YXJnZXQmJiF0aGlzLm1hdGNoVGFyZ2V0KGUsdC50YXJnZXQpKXJldHVybiExO2lmKCh0LnJlcXVlc3RlZENsYWltc0hhc2h8fGUucmVxdWVzdGVkQ2xhaW1zSGFzaCkmJmUucmVxdWVzdGVkQ2xhaW1zSGFzaCE9PXQucmVxdWVzdGVkQ2xhaW1zSGFzaClyZXR1cm4hMTtpZihlLmNyZWRlbnRpYWxUeXBlPT09SC5BQ0NFU1NfVE9LRU5fV0lUSF9BVVRIX1NDSEVNRSl7aWYodC50b2tlblR5cGUmJiF0aGlzLm1hdGNoVG9rZW5UeXBlKGUsdC50b2tlblR5cGUpKXJldHVybiExO2lmKHQudG9rZW5UeXBlPT09Vy5TU0gmJnQua2V5SWQmJiF0aGlzLm1hdGNoS2V5SWQoZSx0LmtleUlkKSlyZXR1cm4hMX1yZXR1cm4hMH1nZXRBcHBNZXRhZGF0YUZpbHRlcmVkQnkoZSl7Y29uc3QgdD10aGlzLmdldEtleXMoKSxyPXt9O3JldHVybiB0LmZvckVhY2goKHQ9PntpZighdGhpcy5pc0FwcE1ldGFkYXRhKHQpKXJldHVybjtjb25zdCBuPXRoaXMuZ2V0QXBwTWV0YWRhdGEodCk7biYmKGUuZW52aXJvbm1lbnQmJiF0aGlzLm1hdGNoRW52aXJvbm1lbnQobixlLmVudmlyb25tZW50KXx8ZS5jbGllbnRJZCYmIXRoaXMubWF0Y2hDbGllbnRJZChuLGUuY2xpZW50SWQpfHwoclt0XT1uKSl9KSkscn1nZXRBdXRob3JpdHlNZXRhZGF0YUJ5QWxpYXMoZSl7Y29uc3QgdD10aGlzLmdldEF1dGhvcml0eU1ldGFkYXRhS2V5cygpO2xldCByPW51bGw7cmV0dXJuIHQuZm9yRWFjaCgodD0+e2lmKCF0aGlzLmlzQXV0aG9yaXR5TWV0YWRhdGEodCl8fC0xPT09dC5pbmRleE9mKHRoaXMuY2xpZW50SWQpKXJldHVybjtjb25zdCBuPXRoaXMuZ2V0QXV0aG9yaXR5TWV0YWRhdGEodCk7biYmLTEhPT1uLmFsaWFzZXMuaW5kZXhPZihlKSYmKHI9bil9KSkscn1yZW1vdmVBbGxBY2NvdW50cyhlKXt0aGlzLmdldEFsbEFjY291bnRzKHt9LGUpLmZvckVhY2goKHQ9Pnt0aGlzLnJlbW92ZUFjY291bnQodCxlKX0pKX1yZW1vdmVBY2NvdW50KGUsdCl7dGhpcy5yZW1vdmVBY2NvdW50Q29udGV4dChlLHQpO3RoaXMuZ2V0QWNjb3VudEtleXMoKS5maWx0ZXIoKHQ9PnQuaW5jbHVkZXMoZS5ob21lQWNjb3VudElkKSYmdC5pbmNsdWRlcyhlLmVudmlyb25tZW50KSkpLmZvckVhY2goKGU9Pnt0aGlzLnJlbW92ZUl0ZW0oZSx0KSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7YWNjb3VudHNSZW1vdmVkOjF9LHQpfSkpfXJlbW92ZUFjY291bnRDb250ZXh0KGUsdCl7Y29uc3Qgcj10aGlzLmdldFRva2VuS2V5cygpLG49dD0+dC5pbmNsdWRlcyhlLmhvbWVBY2NvdW50SWQpJiZ0LmluY2x1ZGVzKGUuZW52aXJvbm1lbnQpO3IuaWRUb2tlbi5maWx0ZXIobikuZm9yRWFjaCgoZT0+e3RoaXMucmVtb3ZlSWRUb2tlbihlLHQpfSkpLHIuYWNjZXNzVG9rZW4uZmlsdGVyKG4pLmZvckVhY2goKGU9Pnt0aGlzLnJlbW92ZUFjY2Vzc1Rva2VuKGUsdCl9KSksci5yZWZyZXNoVG9rZW4uZmlsdGVyKG4pLmZvckVhY2goKGU9Pnt0aGlzLnJlbW92ZVJlZnJlc2hUb2tlbihlLHQpfSkpfXJlbW92ZUFjY2Vzc1Rva2VuKGUsdCl7Y29uc3Qgcj10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLHQpO2lmKHRoaXMucmVtb3ZlSXRlbShlLHQpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHthY2Nlc3NUb2tlbnNSZW1vdmVkOjF9LHQpLCFyfHxyLmNyZWRlbnRpYWxUeXBlLnRvTG93ZXJDYXNlKCkhPT1ILkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FLnRvTG93ZXJDYXNlKCl8fHIudG9rZW5UeXBlIT09Vy5QT1ApcmV0dXJuO2NvbnN0IG49ci5rZXlJZDtuJiZ0aGlzLmNyeXB0b0ltcGwucmVtb3ZlVG9rZW5CaW5kaW5nS2V5KG4pLmNhdGNoKCgoKT0+e3RoaXMuY29tbW9uTG9nZ2VyLmVycm9yKGBGYWlsZWQgdG8gcmVtb3ZlIHRva2VuIGJpbmRpbmcga2V5ICR7bn1gLHQpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmluY3JlbWVudEZpZWxkcyh7cmVtb3ZlVG9rZW5CaW5kaW5nS2V5RmFpbHVyZToxfSx0KX0pKX1yZW1vdmVBcHBNZXRhZGF0YShlKXtyZXR1cm4gdGhpcy5nZXRLZXlzKCkuZm9yRWFjaCgodD0+e3RoaXMuaXNBcHBNZXRhZGF0YSh0KSYmdGhpcy5yZW1vdmVJdGVtKHQsZSl9KSksITB9Z2V0SWRUb2tlbihlLHQscixuLG8pe3RoaXMuY29tbW9uTG9nZ2VyLnRyYWNlKCJDYWNoZU1hbmFnZXIgLSBnZXRJZFRva2VuIGNhbGxlZCIpO2NvbnN0IGk9e2hvbWVBY2NvdW50SWQ6ZS5ob21lQWNjb3VudElkLGVudmlyb25tZW50OmUuZW52aXJvbm1lbnQsY3JlZGVudGlhbFR5cGU6SC5JRF9UT0tFTixjbGllbnRJZDp0aGlzLmNsaWVudElkLHJlYWxtOm59LHM9dGhpcy5nZXRJZFRva2Vuc0J5RmlsdGVyKGksdCxyKSxhPXMuc2l6ZTtpZihhPDEpcmV0dXJuIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRJZFRva2VuIC0gTm8gdG9rZW4gZm91bmQiKSxudWxsO2lmKGE+MSl7bGV0IHI9cztpZighbil7Y29uc3QgdD1uZXcgTWFwO3MuZm9yRWFjaCgoKHIsbik9PntyLnJlYWxtPT09ZS50ZW5hbnRJZCYmdC5zZXQobixyKX0pKTtjb25zdCBuPXQuc2l6ZTtpZihuPDEpcmV0dXJuIHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRJZFRva2VuIC0gTXVsdGlwbGUgSUQgdG9rZW5zIGZvdW5kIGZvciBhY2NvdW50IGJ1dCBub25lIG1hdGNoIGFjY291bnQgZW50aXR5IHRlbmFudCBpZCwgcmV0dXJuaW5nIGZpcnN0IHJlc3VsdCIpLHMudmFsdWVzKCkubmV4dCgpLnZhbHVlO2lmKDE9PT1uKXJldHVybiB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIE11bHRpcGxlIElEIHRva2VucyBmb3VuZCBmb3IgYWNjb3VudCwgZGVmYXVsdGluZyB0byBob21lIHRlbmFudCBwcm9maWxlIiksdC52YWx1ZXMoKS5uZXh0KCkudmFsdWU7cj10fXJldHVybiB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIE11bHRpcGxlIG1hdGNoaW5nIElEIHRva2VucyBmb3VuZCwgY2xlYXJpbmcgdGhlbSIpLHIuZm9yRWFjaCgoKGUscik9Pnt0aGlzLnJlbW92ZUlkVG9rZW4ocix0KX0pKSxvJiZ0JiZvLmFkZEZpZWxkcyh7bXVsdGlNYXRjaGVkSUQ6cy5zaXplfSx0KSxudWxsfXJldHVybiB0aGlzLmNvbW1vbkxvZ2dlci5pbmZvKCJDYWNoZU1hbmFnZXI6Z2V0SWRUb2tlbiAtIFJldHVybmluZyBJRCB0b2tlbiIpLHMudmFsdWVzKCkubmV4dCgpLnZhbHVlfWdldElkVG9rZW5zQnlGaWx0ZXIoZSx0LHIpe2NvbnN0IG49ciYmci5pZFRva2VufHx0aGlzLmdldFRva2VuS2V5cygpLmlkVG9rZW4sbz1uZXcgTWFwO3JldHVybiBuLmZvckVhY2goKHI9PntpZighdGhpcy5pZFRva2VuS2V5TWF0Y2hlc0ZpbHRlcihyLHtjbGllbnRJZDp0aGlzLmNsaWVudElkLC4uLmV9KSlyZXR1cm47Y29uc3Qgbj10aGlzLmdldElkVG9rZW5DcmVkZW50aWFsKHIsdCk7biYmdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihuLGUpJiZvLnNldChyLG4pfSkpLG99aWRUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSx0KXtjb25zdCByPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oIXQuY2xpZW50SWR8fC0xIT09ci5pbmRleE9mKHQuY2xpZW50SWQudG9Mb3dlckNhc2UoKSkpJiYoIXQuaG9tZUFjY291bnRJZHx8LTEhPT1yLmluZGV4T2YodC5ob21lQWNjb3VudElkLnRvTG93ZXJDYXNlKCkpKX1yZW1vdmVJZFRva2VuKGUsdCl7dGhpcy5yZW1vdmVJdGVtKGUsdCl9cmVtb3ZlUmVmcmVzaFRva2VuKGUsdCl7dGhpcy5yZW1vdmVJdGVtKGUsdCl9Z2V0QWNjZXNzVG9rZW4oZSx0LHIsbil7Y29uc3Qgbz10LmNvcnJlbGF0aW9uSWQ7dGhpcy5jb21tb25Mb2dnZXIudHJhY2UoIkNhY2hlTWFuYWdlciAtIGdldEFjY2Vzc1Rva2VuIGNhbGxlZCIsbyk7Y29uc3QgaT1YdC5jcmVhdGVTZWFyY2hTY29wZXModC5zY29wZXMpLHM9dC5hdXRoZW50aWNhdGlvblNjaGVtZXx8Vy5CRUFSRVIsYT1zJiZzLnRvTG93ZXJDYXNlKCkhPT1XLkJFQVJFUi50b0xvd2VyQ2FzZSgpP0guQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUU6SC5BQ0NFU1NfVE9LRU4sYz17aG9tZUFjY291bnRJZDplLmhvbWVBY2NvdW50SWQsZW52aXJvbm1lbnQ6ZS5lbnZpcm9ubWVudCxjcmVkZW50aWFsVHlwZTphLGNsaWVudElkOnRoaXMuY2xpZW50SWQscmVhbG06bnx8ZS50ZW5hbnRJZCx0YXJnZXQ6aSx0b2tlblR5cGU6cyxrZXlJZDp0LnNzaEtpZCxyZXF1ZXN0ZWRDbGFpbXNIYXNoOnQucmVxdWVzdGVkQ2xhaW1zSGFzaH0sbD1yJiZyLmFjY2Vzc1Rva2VufHx0aGlzLmdldFRva2VuS2V5cygpLmFjY2Vzc1Rva2VuLGg9W107bC5mb3JFYWNoKChlPT57aWYodGhpcy5hY2Nlc3NUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSxjLCEwKSl7Y29uc3QgdD10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLG8pO3QmJnRoaXMuY3JlZGVudGlhbE1hdGNoZXNGaWx0ZXIodCxjKSYmaC5wdXNoKHQpfX0pKTtjb25zdCBkPWgubGVuZ3RoO3JldHVybiBkPDE/KHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRBY2Nlc3NUb2tlbiAtIE5vIHRva2VuIGZvdW5kIixvKSxudWxsKTpkPjE/KHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRBY2Nlc3NUb2tlbiAtIE11bHRpcGxlIGFjY2VzcyB0b2tlbnMgZm91bmQsIGNsZWFyaW5nIHRoZW0iLG8pLGguZm9yRWFjaCgoZT0+e3RoaXMucmVtb3ZlQWNjZXNzVG9rZW4odGhpcy5nZW5lcmF0ZUNyZWRlbnRpYWxLZXkoZSksbyl9KSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe211bHRpTWF0Y2hlZEFUOmgubGVuZ3RofSxvKSxudWxsKToodGhpcy5jb21tb25Mb2dnZXIuaW5mbygiQ2FjaGVNYW5hZ2VyOmdldEFjY2Vzc1Rva2VuIC0gUmV0dXJuaW5nIGFjY2VzcyB0b2tlbiIsbyksaFswXSl9YWNjZXNzVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGUsdCxyKXtjb25zdCBuPWUudG9Mb3dlckNhc2UoKTtpZih0LmNsaWVudElkJiYtMT09PW4uaW5kZXhPZih0LmNsaWVudElkLnRvTG93ZXJDYXNlKCkpKXJldHVybiExO2lmKHQuaG9tZUFjY291bnRJZCYmLTE9PT1uLmluZGV4T2YodC5ob21lQWNjb3VudElkLnRvTG93ZXJDYXNlKCkpKXJldHVybiExO2lmKHQucmVhbG0mJi0xPT09bi5pbmRleE9mKHQucmVhbG0udG9Mb3dlckNhc2UoKSkpcmV0dXJuITE7aWYodC5yZXF1ZXN0ZWRDbGFpbXNIYXNoJiYtMT09PW4uaW5kZXhPZih0LnJlcXVlc3RlZENsYWltc0hhc2gudG9Mb3dlckNhc2UoKSkpcmV0dXJuITE7aWYodC50YXJnZXQpe2NvbnN0IGU9dC50YXJnZXQuYXNBcnJheSgpO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKXtpZihyJiYhbi5pbmNsdWRlcyhlW3RdLnRvTG93ZXJDYXNlKCkpKXJldHVybiExO2lmKCFyJiZuLmluY2x1ZGVzKGVbdF0udG9Mb3dlckNhc2UoKSkpcmV0dXJuITB9fXJldHVybiEwfWdldEFjY2Vzc1Rva2Vuc0J5RmlsdGVyKGUsdCl7Y29uc3Qgcj10aGlzLmdldFRva2VuS2V5cygpLG49W107cmV0dXJuIHIuYWNjZXNzVG9rZW4uZm9yRWFjaCgocj0+e2lmKCF0aGlzLmFjY2Vzc1Rva2VuS2V5TWF0Y2hlc0ZpbHRlcihyLGUsITApKXJldHVybjtjb25zdCBvPXRoaXMuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKHIsdCk7byYmdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcihvLGUpJiZuLnB1c2gobyl9KSksbn1nZXRSZWZyZXNoVG9rZW4oZSx0LHIsbixvKXt0aGlzLmNvbW1vbkxvZ2dlci50cmFjZSgiQ2FjaGVNYW5hZ2VyIC0gZ2V0UmVmcmVzaFRva2VuIGNhbGxlZCIpO2NvbnN0IGk9dD9COnZvaWQgMCxzPXtob21lQWNjb3VudElkOmUuaG9tZUFjY291bnRJZCxlbnZpcm9ubWVudDplLmVudmlyb25tZW50LGNyZWRlbnRpYWxUeXBlOkguUkVGUkVTSF9UT0tFTixjbGllbnRJZDp0aGlzLmNsaWVudElkLGZhbWlseUlkOml9LGE9biYmbi5yZWZyZXNoVG9rZW58fHRoaXMuZ2V0VG9rZW5LZXlzKCkucmVmcmVzaFRva2VuLGM9W107YS5mb3JFYWNoKChlPT57aWYodGhpcy5yZWZyZXNoVG9rZW5LZXlNYXRjaGVzRmlsdGVyKGUscykpe2NvbnN0IHQ9dGhpcy5nZXRSZWZyZXNoVG9rZW5DcmVkZW50aWFsKGUscik7dCYmdGhpcy5jcmVkZW50aWFsTWF0Y2hlc0ZpbHRlcih0LHMpJiZjLnB1c2godCl9fSkpO2NvbnN0IGw9Yy5sZW5ndGg7cmV0dXJuIGw8MT8odGhpcy5jb21tb25Mb2dnZXIuaW5mbygiQ2FjaGVNYW5hZ2VyOmdldFJlZnJlc2hUb2tlbiAtIE5vIHJlZnJlc2ggdG9rZW4gZm91bmQuIiksbnVsbCk6KGw+MSYmbyYmciYmby5hZGRGaWVsZHMoe211bHRpTWF0Y2hlZFJUOmx9LHIpLHRoaXMuY29tbW9uTG9nZ2VyLmluZm8oIkNhY2hlTWFuYWdlcjpnZXRSZWZyZXNoVG9rZW4gLSByZXR1cm5pbmcgcmVmcmVzaCB0b2tlbiIpLGNbMF0pfXJlZnJlc2hUb2tlbktleU1hdGNoZXNGaWx0ZXIoZSx0KXtjb25zdCByPWUudG9Mb3dlckNhc2UoKTtyZXR1cm4oIXQuZmFtaWx5SWR8fC0xIT09ci5pbmRleE9mKHQuZmFtaWx5SWQudG9Mb3dlckNhc2UoKSkpJiYoISghdC5mYW1pbHlJZCYmdC5jbGllbnRJZCYmLTE9PT1yLmluZGV4T2YodC5jbGllbnRJZC50b0xvd2VyQ2FzZSgpKSkmJighdC5ob21lQWNjb3VudElkfHwtMSE9PXIuaW5kZXhPZih0LmhvbWVBY2NvdW50SWQudG9Mb3dlckNhc2UoKSkpKX1yZWFkQXBwTWV0YWRhdGFGcm9tQ2FjaGUoZSl7Y29uc3QgdD17ZW52aXJvbm1lbnQ6ZSxjbGllbnRJZDp0aGlzLmNsaWVudElkfSxyPXRoaXMuZ2V0QXBwTWV0YWRhdGFGaWx0ZXJlZEJ5KHQpLG49T2JqZWN0LmtleXMocikubWFwKChlPT5yW2VdKSksbz1uLmxlbmd0aDtpZihvPDEpcmV0dXJuIG51bGw7aWYobz4xKXRocm93IG10KExlKTtyZXR1cm4gblswXX1pc0FwcE1ldGFkYXRhRk9DSShlKXtjb25zdCB0PXRoaXMucmVhZEFwcE1ldGFkYXRhRnJvbUNhY2hlKGUpO3JldHVybiEoIXR8fHQuZmFtaWx5SWQhPT1CKX1tYXRjaEhvbWVBY2NvdW50SWQoZSx0KXtyZXR1cm4hKCJzdHJpbmciIT10eXBlb2YgZS5ob21lQWNjb3VudElkfHx0IT09ZS5ob21lQWNjb3VudElkKX1tYXRjaExvY2FsQWNjb3VudElkRnJvbVRva2VuQ2xhaW1zKGUsdCl7cmV0dXJuIHQ9PT0oZS5vaWR8fGUuc3ViKX1tYXRjaExvY2FsQWNjb3VudElkRnJvbVRlbmFudFByb2ZpbGUoZSx0KXtyZXR1cm4gZS5sb2NhbEFjY291bnRJZD09PXR9bWF0Y2hOYW1lKGUsdCl7cmV0dXJuISh0LnRvTG93ZXJDYXNlKCkhPT1lLm5hbWU/LnRvTG93ZXJDYXNlKCkpfW1hdGNoVXNlcm5hbWUoZSx0KXtyZXR1cm4hKCFlfHwic3RyaW5nIiE9dHlwZW9mIGV8fHQ/LnRvTG93ZXJDYXNlKCkhPT1lLnRvTG93ZXJDYXNlKCkpfW1hdGNoVXNlckFzc2VydGlvbkhhc2goZSx0KXtyZXR1cm4hKCFlLnVzZXJBc3NlcnRpb25IYXNofHx0IT09ZS51c2VyQXNzZXJ0aW9uSGFzaCl9bWF0Y2hFbnZpcm9ubWVudChlLHQpe2lmKHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucyl7Y29uc3Qgcj1mdW5jdGlvbihlLHQpe2xldCByO2NvbnN0IG49ZS5jYW5vbmljYWxBdXRob3JpdHk7aWYobil7Y29uc3Qgbz1uZXcgd3IobikuZ2V0VXJsQ29tcG9uZW50cygpLkhvc3ROYW1lQW5kUG9ydDtyPUFyKG8sZS5jbG91ZERpc2NvdmVyeU1ldGFkYXRhPy5tZXRhZGF0YSxLLHQpfHxBcihvLElyLm1ldGFkYXRhLFEsdCl8fGUua25vd25BdXRob3JpdGllc31yZXR1cm4gcnx8W119KHRoaXMuc3RhdGljQXV0aG9yaXR5T3B0aW9ucyx0aGlzLmNvbW1vbkxvZ2dlcik7aWYoci5pbmNsdWRlcyh0KSYmci5pbmNsdWRlcyhlLmVudmlyb25tZW50KSlyZXR1cm4hMH1jb25zdCByPXRoaXMuZ2V0QXV0aG9yaXR5TWV0YWRhdGFCeUFsaWFzKHQpO3JldHVybiEhKHImJnIuYWxpYXNlcy5pbmRleE9mKGUuZW52aXJvbm1lbnQpPi0xKX1tYXRjaENyZWRlbnRpYWxUeXBlKGUsdCl7cmV0dXJuIGUuY3JlZGVudGlhbFR5cGUmJnQudG9Mb3dlckNhc2UoKT09PWUuY3JlZGVudGlhbFR5cGUudG9Mb3dlckNhc2UoKX1tYXRjaENsaWVudElkKGUsdCl7cmV0dXJuISghZS5jbGllbnRJZHx8dCE9PWUuY2xpZW50SWQpfW1hdGNoRmFtaWx5SWQoZSx0KXtyZXR1cm4hKCFlLmZhbWlseUlkfHx0IT09ZS5mYW1pbHlJZCl9bWF0Y2hSZWFsbShlLHQpe3JldHVybiEoZS5yZWFsbT8udG9Mb3dlckNhc2UoKSE9PXQudG9Mb3dlckNhc2UoKSl9bWF0Y2hOYXRpdmVBY2NvdW50SWQoZSx0KXtyZXR1cm4hKCFlLm5hdGl2ZUFjY291bnRJZHx8dCE9PWUubmF0aXZlQWNjb3VudElkKX1tYXRjaExvZ2luSGludEZyb21Ub2tlbkNsYWltcyhlLHQpe3JldHVybiBlLmxvZ2luX2hpbnQ9PT10fHwoZS5wcmVmZXJyZWRfdXNlcm5hbWU9PT10fHxlLnVwbj09PXQpfW1hdGNoU2lkKGUsdCl7cmV0dXJuIGUuc2lkPT09dH1tYXRjaEF1dGhvcml0eVR5cGUoZSx0KXtyZXR1cm4hKCFlLmF1dGhvcml0eVR5cGV8fHQudG9Mb3dlckNhc2UoKSE9PWUuYXV0aG9yaXR5VHlwZS50b0xvd2VyQ2FzZSgpKX1tYXRjaFRhcmdldChlLHQpe2lmKGUuY3JlZGVudGlhbFR5cGUhPT1ILkFDQ0VTU19UT0tFTiYmZS5jcmVkZW50aWFsVHlwZSE9PUguQUNDRVNTX1RPS0VOX1dJVEhfQVVUSF9TQ0hFTUV8fCFlLnRhcmdldClyZXR1cm4hMTtyZXR1cm4gWHQuZnJvbVN0cmluZyhlLnRhcmdldCkuY29udGFpbnNTY29wZVNldCh0KX1tYXRjaFRva2VuVHlwZShlLHQpe3JldHVybiEoIWUudG9rZW5UeXBlfHxlLnRva2VuVHlwZSE9PXQpfW1hdGNoS2V5SWQoZSx0KXtyZXR1cm4hKCFlLmtleUlkfHxlLmtleUlkIT09dCl9aXNBcHBNZXRhZGF0YShlKXtyZXR1cm4tMSE9PWUuaW5kZXhPZih4KX1pc0F1dGhvcml0eU1ldGFkYXRhKGUpe3JldHVybi0xIT09ZS5pbmRleE9mKEYpfWdlbmVyYXRlQXV0aG9yaXR5TWV0YWRhdGFDYWNoZUtleShlKXtyZXR1cm5gJHtGfS0ke3RoaXMuY2xpZW50SWR9LSR7ZX1gfXN0YXRpYyB0b09iamVjdChlLHQpe2Zvcihjb25zdCByIGluIHQpZVtyXT10W3JdO3JldHVybiBlfX1jbGFzcyBNciBleHRlbmRzIFBye2FzeW5jIHNldEFjY291bnQoKXt0aHJvdyBtdChjdCl9Z2V0QWNjb3VudCgpe3Rocm93IG10KGN0KX1hc3luYyBzZXRJZFRva2VuQ3JlZGVudGlhbCgpe3Rocm93IG10KGN0KX1nZXRJZFRva2VuQ3JlZGVudGlhbCgpe3Rocm93IG10KGN0KX1hc3luYyBzZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwoKXt0aHJvdyBtdChjdCl9Z2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKCl7dGhyb3cgbXQoY3QpfWFzeW5jIHNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoKXt0aHJvdyBtdChjdCl9Z2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbCgpe3Rocm93IG10KGN0KX1zZXRBcHBNZXRhZGF0YSgpe3Rocm93IG10KGN0KX1nZXRBcHBNZXRhZGF0YSgpe3Rocm93IG10KGN0KX1zZXRTZXJ2ZXJUZWxlbWV0cnkoKXt0aHJvdyBtdChjdCl9Z2V0U2VydmVyVGVsZW1ldHJ5KCl7dGhyb3cgbXQoY3QpfXNldEF1dGhvcml0eU1ldGFkYXRhKCl7dGhyb3cgbXQoY3QpfWdldEF1dGhvcml0eU1ldGFkYXRhKCl7dGhyb3cgbXQoY3QpfWdldEF1dGhvcml0eU1ldGFkYXRhS2V5cygpe3Rocm93IG10KGN0KX1zZXRUaHJvdHRsaW5nQ2FjaGUoKXt0aHJvdyBtdChjdCl9Z2V0VGhyb3R0bGluZ0NhY2hlKCl7dGhyb3cgbXQoY3QpfXJlbW92ZUl0ZW0oKXt0aHJvdyBtdChjdCl9Z2V0S2V5cygpe3Rocm93IG10KGN0KX1nZXRBY2NvdW50S2V5cygpe3Rocm93IG10KGN0KX1nZXRUb2tlbktleXMoKXt0aHJvdyBtdChjdCl9Z2VuZXJhdGVDcmVkZW50aWFsS2V5KCl7dGhyb3cgbXQoY3QpfWdlbmVyYXRlQWNjb3VudEtleSgpe3Rocm93IG10KGN0KX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NvbnN0IE9yPXtBY3F1aXJlVG9rZW5CeUNvZGU6ImFjcXVpcmVUb2tlbkJ5Q29kZSIsQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW46ImFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuIixBY3F1aXJlVG9rZW5TaWxlbnQ6ImFjcXVpcmVUb2tlblNpbGVudCIsQWNxdWlyZVRva2VuU2lsZW50QXN5bmM6ImFjcXVpcmVUb2tlblNpbGVudEFzeW5jIixBY3F1aXJlVG9rZW5Qb3B1cDoiYWNxdWlyZVRva2VuUG9wdXAiLEFjcXVpcmVUb2tlblByZVJlZGlyZWN0OiJhY3F1aXJlVG9rZW5QcmVSZWRpcmVjdCIsQWNxdWlyZVRva2VuUmVkaXJlY3Q6ImFjcXVpcmVUb2tlblJlZGlyZWN0IixDcnlwdG9PcHRzR2V0UHVibGljS2V5VGh1bWJwcmludDoiY3J5cHRvT3B0c0dldFB1YmxpY0tleVRodW1icHJpbnQiLENyeXB0b09wdHNTaWduSnd0OiJjcnlwdG9PcHRzU2lnbkp3dCIsU2lsZW50Q2FjaGVDbGllbnRBY3F1aXJlVG9rZW46InNpbGVudENhY2hlQ2xpZW50QWNxdWlyZVRva2VuIixTaWxlbnRJZnJhbWVDbGllbnRBY3F1aXJlVG9rZW46InNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiIsQXdhaXRDb25jdXJyZW50SWZyYW1lOiJhd2FpdENvbmN1cnJlbnRJZnJhbWUiLFNpbGVudFJlZnJlc2hDbGllbnRBY3F1aXJlVG9rZW46InNpbGVudFJlZnJlc2hDbGllbnRBY3F1aXJlVG9rZW4iLFNzb1NpbGVudDoic3NvU2lsZW50IixTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eToic3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldERpc2NvdmVyZWRBdXRob3JpdHkiLEZldGNoQWNjb3VudElkV2l0aE5hdGl2ZUJyb2tlcjoiZmV0Y2hBY2NvdW50SWRXaXRoTmF0aXZlQnJva2VyIixOYXRpdmVJbnRlcmFjdGlvbkNsaWVudEFjcXVpcmVUb2tlbjoibmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW4iLEJhc2VDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzOiJiYXNlQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0SGVhZGVycyIsTmV0d29ya0NsaWVudFNlbmRQb3N0UmVxdWVzdEFzeW5jOiJuZXR3b3JrQ2xpZW50U2VuZFBvc3RSZXF1ZXN0QXN5bmMiLFJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50OiJyZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCIsQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludDoiYXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCIsQnJva2VySGFuZGhzaGFrZToiYnJva2VySGFuZHNoYWtlIixBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbkluQnJva2VyOiJhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbkluQnJva2VyIixBY3F1aXJlVG9rZW5CeUJyb2tlcjoiYWNxdWlyZVRva2VuQnlCcm9rZXIiLFJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3Q6InJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QiLFJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbjoicmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuIixSZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuOiJyZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuIixSZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbjoicmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4iLFJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHk6InJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHkiLEFjcXVpcmVUb2tlbkZyb21DYWNoZToiYWNxdWlyZVRva2VuRnJvbUNhY2hlIixTaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuOiJzaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuIixTaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQ6InNpbGVudEZsb3dDbGllbnRHZW5lcmF0ZVJlc3VsdEZyb21DYWNoZVJlY29yZCIsQWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWU6ImFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lIixJbml0aWFsaXplQmFzZVJlcXVlc3Q6ImluaXRpYWxpemVCYXNlUmVxdWVzdCIsSW5pdGlhbGl6ZVNpbGVudFJlcXVlc3Q6ImluaXRpYWxpemVTaWxlbnRSZXF1ZXN0IixJbml0aWFsaXplQ2xpZW50QXBwbGljYXRpb246ImluaXRpYWxpemVDbGllbnRBcHBsaWNhdGlvbiIsSW5pdGlhbGl6ZUNhY2hlOiJpbml0aWFsaXplQ2FjaGUiLFNpbGVudElmcmFtZUNsaWVudFRva2VuSGVscGVyOiJzaWxlbnRJZnJhbWVDbGllbnRUb2tlbkhlbHBlciIsU2lsZW50SGFuZGxlckluaXRpYXRlQXV0aFJlcXVlc3Q6InNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0IixTaWxlbnRIYW5kbGVyTW9uaXRvcklmcmFtZUZvckhhc2g6InNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCIsU2lsZW50SGFuZGxlckxvYWRGcmFtZToic2lsZW50SGFuZGxlckxvYWRGcmFtZSIsU2lsZW50SGFuZGxlckxvYWRGcmFtZVN5bmM6InNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jIixTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQ6InN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCIsU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldENsaWVudENvbmZpZ3VyYXRpb246InN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uIixTdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0OiJzdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0IixHZXRBdXRoQ29kZVVybDoiZ2V0QXV0aENvZGVVcmwiLEdldFN0YW5kYXJkUGFyYW1zOiJnZXRTdGFuZGFyZFBhcmFtcyIsSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcjoiaGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciIsSGFuZGxlQ29kZVJlc3BvbnNlOiJoYW5kbGVDb2RlUmVzcG9uc2UiLEhhbmRsZVJlc3BvbnNlRWFyOiJoYW5kbGVSZXNwb25zZUVhciIsSGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlcjoiaGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlciIsSGFuZGxlUmVzcG9uc2VDb2RlOiJoYW5kbGVSZXNwb25zZUNvZGUiLFVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHk6InVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHkiLEF1dGhDbGllbnRBY3F1aXJlVG9rZW46ImF1dGhDbGllbnRBY3F1aXJlVG9rZW4iLEF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0OiJhdXRoQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCIsQXV0aENsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHk6ImF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5IixQb3BUb2tlbkdlbmVyYXRlQ25mOiJwb3BUb2tlbkdlbmVyYXRlQ25mIixQb3BUb2tlbkdlbmVyYXRlS2lkOiJwb3BUb2tlbkdlbmVyYXRlS2lkIixIYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlOiJoYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlIixEZXNlcmlhbGl6ZVJlc3BvbnNlOiJkZXNlcmlhbGl6ZVJlc3BvbnNlIixBdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlOiJhdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlIixBdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzQXN5bmM6ImF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYyIsQXV0aG9yaXR5UmVzb2x2ZUVuZHBvaW50c0Zyb21Mb2NhbFNvdXJjZXM6ImF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNGcm9tTG9jYWxTb3VyY2VzIixBdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcms6ImF1dGhvcml0eUdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTmV0d29yayIsQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YToiYXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSIsQXV0aG9yaXR5R2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrOiJhdXRob3JpdHlHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmsiLEF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGE6ImF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGEiLEF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb246ImF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24iLFJlZ2lvbkRpc2NvdmVyeURldGVjdFJlZ2lvbjoicmVnaW9uRGlzY292ZXJ5RGV0ZWN0UmVnaW9uIixSZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUzoicmVnaW9uRGlzY292ZXJ5R2V0UmVnaW9uRnJvbUlNRFMiLFJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uOiJyZWdpb25EaXNjb3ZlcnlHZXRDdXJyZW50VmVyc2lvbiIsQWNxdWlyZVRva2VuQnlDb2RlQXN5bmM6ImFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jIixHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6ImdldEVuZHBvaW50TWV0YWRhdGFGcm9tTmV0d29yayIsR2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrTWVhc3VyZW1lbnQ6ImdldENsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tTmV0d29ya01lYXN1cmVtZW50IixIYW5kbGVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudDoiaGFuZGxlUmVkaXJlY3RQcm9taXNlIixIYW5kbGVOYXRpdmVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudDoiaGFuZGxlTmF0aXZlUmVkaXJlY3RQcm9taXNlIixVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhTWVhc3VyZW1lbnQ6InVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFNZWFzdXJlbWVudCIsVXNlcm5hbWVQYXNzd29yZENsaWVudEFjcXVpcmVUb2tlbjoidXNlcm5hbWVQYXNzd29yZENsaWVudEFjcXVpcmVUb2tlbiIsTmF0aXZlTWVzc2FnZUhhbmRsZXJIYW5kc2hha2U6Im5hdGl2ZU1lc3NhZ2VIYW5kbGVySGFuZHNoYWtlIixOYXRpdmVHZW5lcmF0ZUF1dGhSZXN1bHQ6Im5hdGl2ZUdlbmVyYXRlQXV0aFJlc3VsdCIsUmVtb3ZlSGlkZGVuSWZyYW1lOiJyZW1vdmVIaWRkZW5JZnJhbWUiLENsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXM6ImNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMiLENhY2hlTWFuYWdlckdldFJlZnJlc2hUb2tlbjoiY2FjaGVNYW5hZ2VyR2V0UmVmcmVzaFRva2VuIixJbXBvcnRFeGlzdGluZ0NhY2hlOiJpbXBvcnRFeGlzdGluZ0NhY2hlIixTZXRVc2VyRGF0YToic2V0VXNlckRhdGEiLExvY2FsU3RvcmFnZVVwZGF0ZWQ6ImxvY2FsU3RvcmFnZVVwZGF0ZWQiLEdlbmVyYXRlUGtjZUNvZGVzOiJnZW5lcmF0ZVBrY2VDb2RlcyIsR2VuZXJhdGVDb2RlVmVyaWZpZXI6ImdlbmVyYXRlQ29kZVZlcmlmaWVyIixHZW5lcmF0ZUNvZGVDaGFsbGVuZ2VGcm9tVmVyaWZpZXI6ImdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciIsU2hhMjU2RGlnZXN0OiJzaGEyNTZEaWdlc3QiLEdldFJhbmRvbVZhbHVlczoiZ2V0UmFuZG9tVmFsdWVzIixHZW5lcmF0ZUhLREY6ImdlbmVyYXRlSEtERiIsR2VuZXJhdGVCYXNlS2V5OiJnZW5lcmF0ZUJhc2VLZXkiLEJhc2U2NERlY29kZToiYmFzZTY0RGVjb2RlIixVcmxFbmNvZGVBcnI6InVybEVuY29kZUFyciIsRW5jcnlwdDoiZW5jcnlwdCIsRGVjcnlwdDoiZGVjcnlwdCIsR2VuZXJhdGVFYXJLZXk6ImdlbmVyYXRlRWFyS2V5IixEZWNyeXB0RWFyUmVzcG9uc2U6ImRlY3J5cHRFYXJSZXNwb25zZSJ9LHFyPW5ldyBNYXAoW1tPci5BY3F1aXJlVG9rZW5CeUNvZGUsIkFUQnlDb2RlIl0sW09yLkFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLCJBVEJ5UlQiXSxbT3IuQWNxdWlyZVRva2VuU2lsZW50LCJBVFMiXSxbT3IuQWNxdWlyZVRva2VuU2lsZW50QXN5bmMsIkFUU0FzeW5jIl0sW09yLkFjcXVpcmVUb2tlblBvcHVwLCJBVFBvcHVwIl0sW09yLkFjcXVpcmVUb2tlblJlZGlyZWN0LCJBVFJlZGlyZWN0Il0sW09yLkNyeXB0b09wdHNHZXRQdWJsaWNLZXlUaHVtYnByaW50LCJDcnlwdG9HZXRQS1RodW1iIl0sW09yLkNyeXB0b09wdHNTaWduSnd0LCJDcnlwdG9TaWduSnd0Il0sW09yLlNpbGVudENhY2hlQ2xpZW50QWNxdWlyZVRva2VuLCJTbHRDYWNoZUNsaWVudEFUIl0sW09yLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbiwiU2x0SWZyYW1lQ2xpZW50QVQiXSxbT3IuU2lsZW50UmVmcmVzaENsaWVudEFjcXVpcmVUb2tlbiwiU2x0UkNsaWVudEFUIl0sW09yLlNzb1NpbGVudCwiU3NvU2x0Il0sW09yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LCJTdGRJbnRDbGllbnRHZXREaXNjQXV0aCJdLFtPci5GZXRjaEFjY291bnRJZFdpdGhOYXRpdmVCcm9rZXIsIkZldGNoQWNjSWRXaXRoTnR2QnJva2VyIl0sW09yLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLCJOdHZJbnRDbGllbnRBVCJdLFtPci5CYXNlQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0SGVhZGVycywiQmFzZUNsaWVudENyZWF0ZVRSZXFIZWFkIl0sW09yLk5ldHdvcmtDbGllbnRTZW5kUG9zdFJlcXVlc3RBc3luYywiTmV0Q2xpZW50U2VuZFBvc3QiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVBvc3RUb1Rva2VuRW5kcG9pbnQsIlJUQ2xpZW50RXhlY1Bvc3QiXSxbT3IuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCwiQXV0aENvZGVDbGllbnRFeGVjUG9zdCJdLFtPci5Ccm9rZXJIYW5kaHNoYWtlLCJCcm9rZXJIYW5kc2hha2UiXSxbT3IuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW5JbkJyb2tlciwiQVRCeVJUSW5Ccm9rZXIiXSxbT3IuQWNxdWlyZVRva2VuQnlCcm9rZXIsIkFUQnlCcm9rZXIiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCwiUlRDbGllbnRFeGVjVFJlcSJdLFtPci5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW4sIlJUQ2xpZW50QVQiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbiwiUlRDbGllbnRBVFdpdGhDYWNoZWRSVCJdLFtPci5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbiwiUlRDbGllbnRBVEJ5UlQiXSxbT3IuUmVmcmVzaFRva2VuQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0Qm9keSwiUlRDbGllbnRDcmVhdGVUUmVxQm9keSJdLFtPci5BY3F1aXJlVG9rZW5Gcm9tQ2FjaGUsIkFURnJvbUNhY2hlIl0sW09yLlNpbGVudEZsb3dDbGllbnRBY3F1aXJlQ2FjaGVkVG9rZW4sIlNsdEZsb3dDbGllbnRBVENhY2hlZCJdLFtPci5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsIlNsdEZsb3dDbGllbnRHZW5SZXNGcm9tQ2FjaGUiXSxbT3IuQWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUsIkFUQnlTbHRJZnJhbWUiXSxbT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LCJJbml0QmFzZVJlcSJdLFtPci5Jbml0aWFsaXplU2lsZW50UmVxdWVzdCwiSW5pdFNsdFJlcSJdLFtPci5Jbml0aWFsaXplQ2xpZW50QXBwbGljYXRpb24sIkluaXRDbGllbnRBcHBsaWNhdGlvbiJdLFtPci5Jbml0aWFsaXplQ2FjaGUsIkluaXRDYWNoZSJdLFtPci5JbXBvcnRFeGlzdGluZ0NhY2hlLCJpbXBvcnRDYWNoZSJdLFtPci5TZXRVc2VyRGF0YSwic2V0VXNlckRhdGEiXSxbT3IuTG9jYWxTdG9yYWdlVXBkYXRlZCwibG9jYWxTdG9yYWdlVXBkYXRlZCJdLFtPci5TaWxlbnRJZnJhbWVDbGllbnRUb2tlbkhlbHBlciwiU0lDbGllbnRUSGVscGVyIl0sW09yLlNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0LCJTSGFuZGxlckluaXRBdXRoUmVxIl0sW09yLlNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCwiU2x0SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoIl0sW09yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUsIlNIYW5kbGVyTG9hZEZyYW1lIl0sW09yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jLCJTSGFuZGxlckxvYWRGcmFtZVN5bmMiXSxbT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LCJTdGRJbnRDbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCJdLFtPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbiwiU3RkSW50Q2xpZW50R2V0Q2xpZW50Q29uZiJdLFtPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LCJTdGRJbnRDbGllbnRJbml0QXV0aFJlcSJdLFtPci5HZXRBdXRoQ29kZVVybCwiR2V0QXV0aENvZGVVcmwiXSxbT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciwiSGFuZGxlQ29kZVJlc0Zyb21TZXJ2ZXIiXSxbT3IuSGFuZGxlQ29kZVJlc3BvbnNlLCJIYW5kbGVDb2RlUmVzcCJdLFtPci5IYW5kbGVSZXNwb25zZUVhciwiSGFuZGxlUmVzcEVhciJdLFtPci5IYW5kbGVSZXNwb25zZUNvZGUsIkhhbmRsZVJlc3BDb2RlIl0sW09yLkhhbmRsZVJlc3BvbnNlUGxhdGZvcm1Ccm9rZXIsIkhhbmRsZVJlc3BQbGF0QnJva2VyIl0sW09yLlVwZGF0ZVRva2VuRW5kcG9pbnRBdXRob3JpdHksIlVwZFRFbmRwb2ludEF1dGgiXSxbT3IuQXV0aENsaWVudEFjcXVpcmVUb2tlbiwiQXV0aENsaWVudEFUIl0sW09yLkF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LCJBdXRoQ2xpZW50RXhlY1RSZXEiXSxbT3IuQXV0aENsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksIkF1dGhDbGllbnRDcmVhdGVUUmVxQm9keSJdLFtPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLCJQb3BUR2VuQ25mIl0sW09yLlBvcFRva2VuR2VuZXJhdGVLaWQsIlBvcFRHZW5LaWQiXSxbT3IuSGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZSwiSGFuZGxlU2VydmVyVFJlcyJdLFtPci5EZXNlcmlhbGl6ZVJlc3BvbnNlLCJEZXNlcmlhbGl6ZVJlcyJdLFtPci5BdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLCJBdXRoRmFjdENyZWF0ZURpc2NJbnN0Il0sW09yLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYywiQXV0aFJlc29sdmVFbmRwb2ludHNBc3luYyJdLFtPci5BdXRob3JpdHlSZXNvbHZlRW5kcG9pbnRzRnJvbUxvY2FsU291cmNlcywiQXV0aFJlc29sdmVFbmRwb2ludHNGcm9tTG9jYWwiXSxbT3IuQXV0aG9yaXR5R2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrLCJBdXRoR2V0Q0RNZXRhRnJvbU5ldCJdLFtPci5BdXRob3JpdHlVcGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhLCJBdXRoVXBkQ0RNZXRhIl0sW09yLkF1dGhvcml0eUdldEVuZHBvaW50TWV0YWRhdGFGcm9tTmV0d29yaywiQXV0aFVwZENETWV0YUZyb21OZXQiXSxbT3IuQXV0aG9yaXR5VXBkYXRlRW5kcG9pbnRNZXRhZGF0YSwiQXV0aFVwZEVuZHBvaW50TWV0YSJdLFtPci5BdXRob3JpdHlVcGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLCJBdXRoVXBkTWV0YVdpdGhSZWdJbmZvIl0sW09yLlJlZ2lvbkRpc2NvdmVyeURldGVjdFJlZ2lvbiwiUmVnRGlzY0RldGVjdFJlZyJdLFtPci5SZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUywiUmVnRGlzY0dldFJlZ0Zyb21JTURTIl0sW09yLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLCJSZWdEaXNjR2V0Q3VycmVudFZlciJdLFtPci5BY3F1aXJlVG9rZW5CeUNvZGVBc3luYywiQVRCeUNvZGVBc3luYyJdLFtPci5HZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmssIkdldEVuZHBvaW50TWV0YUZyb21OZXQiXSxbT3IuR2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrTWVhc3VyZW1lbnQsIkdldENETWV0YUZyb21OZXQiXSxbT3IuSGFuZGxlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsIkhhbmRsZVJlZGlyZWN0UHJvbWlzZSJdLFtPci5IYW5kbGVOYXRpdmVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudCwiSGFuZGxlTnR2UmVkaXJlY3RQcm9taXNlIl0sW09yLlVwZGF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFNZWFzdXJlbWVudCwiVXBkYXRlQ0RNZXRhIl0sW09yLlVzZXJuYW1lUGFzc3dvcmRDbGllbnRBY3F1aXJlVG9rZW4sIlVzZXJQYXNzQ2xpZW50QVQiXSxbT3IuTmF0aXZlTWVzc2FnZUhhbmRsZXJIYW5kc2hha2UsIk50dk1zZ0hhbmRsZXJIYW5kc2hha2UiXSxbT3IuTmF0aXZlR2VuZXJhdGVBdXRoUmVzdWx0LCJOdHZHZW5BdXRoUmVzIl0sW09yLlJlbW92ZUhpZGRlbklmcmFtZSwiUmVtb3ZlSGlkZGVuSWZyYW1lIl0sW09yLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsIkNsZWFyVEFuZEtleXNXaXRoQ2xhaW1zIl0sW09yLkNhY2hlTWFuYWdlckdldFJlZnJlc2hUb2tlbiwiQ2FjaGVNYW5hZ2VyR2V0UlQiXSxbT3IuR2VuZXJhdGVQa2NlQ29kZXMsIkdlblBrY2VDb2RlcyJdLFtPci5HZW5lcmF0ZUNvZGVWZXJpZmllciwiR2VuQ29kZVZlcmlmaWVyIl0sW09yLkdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciwiR2VuQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllciJdLFtPci5TaGEyNTZEaWdlc3QsIlNoYTI1NkRpZ2VzdCJdLFtPci5HZXRSYW5kb21WYWx1ZXMsIkdldFJhbmRvbVZhbHVlcyJdLFtPci5HZW5lcmF0ZUhLREYsImdlbkhLREYiXSxbT3IuR2VuZXJhdGVCYXNlS2V5LCJnZW5CYXNlS2V5Il0sW09yLkJhc2U2NERlY29kZSwiYjY0RGVjb2RlIl0sW09yLlVybEVuY29kZUFyciwidXJsRW5jQXJyIl0sW09yLkVuY3J5cHQsImVuY3J5cHQiXSxbT3IuRGVjcnlwdCwiZGVjcnlwdCJdLFtPci5HZW5lcmF0ZUVhcktleSwiZ2VuRWFyS2V5Il0sW09yLkRlY3J5cHRFYXJSZXNwb25zZSwiZGVjcnlwdEVhclJlc3AiXV0pLE5yPTEsVXI9MixMcj1uZXcgU2V0KFsiYWNjZXNzVG9rZW5TaXplIiwiZHVyYXRpb25NcyIsImlkVG9rZW5TaXplIiwibWF0c1NpbGVudFN0YXR1cyIsIm1hdHNIdHRwU3RhdHVzIiwicmVmcmVzaFRva2VuU2l6ZSIsInF1ZXVlZFRpbWVNcyIsInN0YXJ0VGltZU1zIiwic3RhdHVzIiwibXVsdGlNYXRjaGVkQVQiLCJtdWx0aU1hdGNoZWRJRCIsIm11bHRpTWF0Y2hlZFJUIiwidW5lbmNyeXB0ZWRDYWNoZUNvdW50IiwiZW5jcnlwdGVkQ2FjaGVFeHBpcmVkQ291bnQiLCJvbGRBY2NvdW50Q291bnQiLCJvbGRBY2Nlc3NDb3VudCIsIm9sZElkQ291bnQiLCJvbGRSZWZyZXNoQ291bnQiLCJjdXJyQWNjb3VudENvdW50IiwiY3VyckFjY2Vzc0NvdW50IiwiY3VycklkQ291bnQiLCJjdXJyUmVmcmVzaENvdW50IiwiZXhwaXJlZENhY2hlUmVtb3ZlZENvdW50IiwidXBncmFkZWRDYWNoZUNvdW50Il0pOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8KY2xhc3MgRHJ7c3RhcnRNZWFzdXJlbWVudCgpe31lbmRNZWFzdXJlbWVudCgpe31mbHVzaE1lYXN1cmVtZW50KCl7cmV0dXJuIG51bGx9fWNsYXNzIEhye2dlbmVyYXRlSWQoKXtyZXR1cm4iY2FsbGJhY2staWQifXN0YXJ0TWVhc3VyZW1lbnQoZSx0KXtyZXR1cm57ZW5kOigpPT5udWxsLGRpc2NhcmQ6KCk9Pnt9LGFkZDooKT0+e30saW5jcmVtZW50OigpPT57fSxldmVudDp7ZXZlbnRJZDp0aGlzLmdlbmVyYXRlSWQoKSxzdGF0dXM6TnIsYXV0aG9yaXR5OiIiLGxpYnJhcnlOYW1lOiIiLGxpYnJhcnlWZXJzaW9uOiIiLGNsaWVudElkOiIiLG5hbWU6ZSxzdGFydFRpbWVNczpEYXRlLm5vdygpLGNvcnJlbGF0aW9uSWQ6dHx8IiJ9LG1lYXN1cmVtZW50Om5ldyBEcn19c3RhcnRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KCl7cmV0dXJuIG5ldyBEcn1jYWxjdWxhdGVRdWV1ZWRUaW1lKCl7cmV0dXJuIDB9YWRkUXVldWVNZWFzdXJlbWVudCgpe31zZXRQcmVRdWV1ZVRpbWUoKXt9ZW5kTWVhc3VyZW1lbnQoKXtyZXR1cm4gbnVsbH1kaXNjYXJkTWVhc3VyZW1lbnRzKCl7fXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soKXtyZXR1cm4hMH1hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKCl7cmV0dXJuIiJ9ZW1pdEV2ZW50cygpe31hZGRGaWVsZHMoKXt9aW5jcmVtZW50RmllbGRzKCl7fWNhY2hlRXZlbnRCeUNvcnJlbGF0aW9uSWQoKXt9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB4cj17dG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kczozMDAscHJldmVudENvcnNQcmVmbGlnaHQ6ITF9LEJyPXtsb2dnZXJDYWxsYmFjazooKT0+e30scGlpTG9nZ2luZ0VuYWJsZWQ6ITEsbG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLGNvcnJlbGF0aW9uSWQ6dC5FTVBUWV9TVFJJTkd9LEZyPXtjbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkOiExfSx6cj17YXN5bmMgc2VuZEdldFJlcXVlc3RBc3luYygpe3Rocm93IG10KGN0KX0sYXN5bmMgc2VuZFBvc3RSZXF1ZXN0QXN5bmMoKXt0aHJvdyBtdChjdCl9fSxLcj17c2t1OnQuU0tVLHZlcnNpb246dnQsY3B1OnQuRU1QVFlfU1RSSU5HLG9zOnQuRU1QVFlfU1RSSU5HfSxHcj17Y2xpZW50U2VjcmV0OnQuRU1QVFlfU1RSSU5HLGNsaWVudEFzc2VydGlvbjp2b2lkIDB9LCRyPXthenVyZUNsb3VkSW5zdGFuY2U6SXQuTm9uZSx0ZW5hbnQ6YCR7dC5ERUZBVUxUX0NPTU1PTl9URU5BTlR9YH0sUXI9e2FwcGxpY2F0aW9uOnthcHBOYW1lOiIiLGFwcFZlcnNpb246IiJ9fTtmdW5jdGlvbiBqcihlKXtyZXR1cm4gZS5hdXRoT3B0aW9ucy5hdXRob3JpdHkub3B0aW9ucy5wcm90b2NvbE1vZGU9PT1sci5PSURDfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBXcj0iaG9tZV9hY2NvdW50X2lkIixWcj0iVVBOIixKcj0iY2xpZW50X2lkIixZcj0icmVkaXJlY3RfdXJpIixYcj0idG9rZW5fdHlwZSIsWnI9InJlcV9jbmYiLGVuPSJyZXR1cm5fc3BhX2NvZGUiLHRuPSJ4LWNsaWVudC14dHJhLXNrdSIscm49ImJya19jbGllbnRfaWQiLG5uPSJicmtfcmVkaXJlY3RfdXJpIixvbj0iaW5zdGFuY2VfYXdhcmUiOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmZ1bmN0aW9uIHNuKGUsdCxyKXtpZighdClyZXR1cm47Y29uc3Qgbj1lLmdldChKcik7biYmZS5oYXMocm4pJiZyPy5hZGRGaWVsZHMoe2VtYmVkZGVkQ2xpZW50SWQ6bixlbWJlZGRlZFJlZGlyZWN0VXJpOmUuZ2V0KFlyKX0sdCl9ZnVuY3Rpb24gYW4oZSx0KXtlLnNldCgicmVzcG9uc2VfdHlwZSIsdCl9ZnVuY3Rpb24gY24oZSx0LHI9ITAsbj1oKXshcnx8bi5pbmNsdWRlcygib3BlbmlkIil8fHQuaW5jbHVkZXMoIm9wZW5pZCIpfHxuLnB1c2goIm9wZW5pZCIpO2NvbnN0IG89cj9bLi4udHx8W10sLi4ubl06dHx8W10saT1uZXcgWHQobyk7ZS5zZXQoInNjb3BlIixpLnByaW50U2NvcGVzKCkpfWZ1bmN0aW9uIGxuKGUsdCl7ZS5zZXQoSnIsdCl9ZnVuY3Rpb24gaG4oZSx0KXtlLnNldChZcix0KX1mdW5jdGlvbiBkbihlLHQpe2Uuc2V0KCJsb2dpbl9oaW50Iix0KX1mdW5jdGlvbiB1bihlLHQpe2Uuc2V0KG0sYFVQTjoke3R9YCl9ZnVuY3Rpb24gZ24oZSx0KXtlLnNldChtLGBPaWQ6JHt0LnVpZH1AJHt0LnV0aWR9YCl9ZnVuY3Rpb24gcG4oZSx0KXtlLnNldCgic2lkIix0KX1mdW5jdGlvbiBtbihlLHQscil7Y29uc3Qgbj1Sbih0LHIpO3RyeXtKU09OLnBhcnNlKG4pfWNhdGNoKGUpe3Rocm93IEp0KFJ0KX1lLnNldCgiY2xhaW1zIixuKX1mdW5jdGlvbiBmbihlLHQpe2Uuc2V0KCJjbGllbnQtcmVxdWVzdC1pZCIsdCl9ZnVuY3Rpb24geW4oZSx0KXtlLnNldCgieC1jbGllbnQtU0tVIix0LnNrdSksZS5zZXQoIngtY2xpZW50LVZFUiIsdC52ZXJzaW9uKSx0Lm9zJiZlLnNldCgieC1jbGllbnQtT1MiLHQub3MpLHQuY3B1JiZlLnNldCgieC1jbGllbnQtQ1BVIix0LmNwdSl9ZnVuY3Rpb24gQ24oZSx0KXt0Py5hcHBOYW1lJiZlLnNldCgieC1hcHAtbmFtZSIsdC5hcHBOYW1lKSx0Py5hcHBWZXJzaW9uJiZlLnNldCgieC1hcHAtdmVyIix0LmFwcFZlcnNpb24pfWZ1bmN0aW9uIHduKGUsdCl7dCYmZS5zZXQoInN0YXRlIix0KX1mdW5jdGlvbiB2bihlLHQscil7aWYoIXR8fCFyKXRocm93IEp0KE90KTtlLnNldCgiY29kZV9jaGFsbGVuZ2UiLHQpLGUuc2V0KCJjb2RlX2NoYWxsZW5nZV9tZXRob2QiLHIpfWZ1bmN0aW9uIEluKGUsdCl7ZS5zZXQoImNsaWVudF9zZWNyZXQiLHQpfWZ1bmN0aW9uIFRuKGUsdCl7dCYmZS5zZXQoImNsaWVudF9hc3NlcnRpb24iLHQpfWZ1bmN0aW9uIEFuKGUsdCl7dCYmZS5zZXQoImNsaWVudF9hc3NlcnRpb25fdHlwZSIsdCl9ZnVuY3Rpb24ga24oZSx0KXtlLnNldCgiZ3JhbnRfdHlwZSIsdCl9ZnVuY3Rpb24gU24oZSl7ZS5zZXQoImNsaWVudF9pbmZvIiwiMSIpfWZ1bmN0aW9uIGJuKGUpe2UuaGFzKG9uKXx8ZS5zZXQob24sInRydWUiKX1mdW5jdGlvbiBFbihlLHQpe09iamVjdC5lbnRyaWVzKHQpLmZvckVhY2goKChbdCxyXSk9PnshZS5oYXModCkmJnImJmUuc2V0KHQscil9KSl9ZnVuY3Rpb24gUm4oZSx0KXtsZXQgcjtpZihlKXRyeXtyPUpTT04ucGFyc2UoZSl9Y2F0Y2goZSl7dGhyb3cgSnQoUnQpfWVsc2Ugcj17fTtyZXR1cm4gdCYmdC5sZW5ndGg+MCYmKHIuaGFzT3duUHJvcGVydHkoayl8fChyW2tdPXt9KSxyW2tdW1NdPXt2YWx1ZXM6dH0pLEpTT04uc3RyaW5naWZ5KHIpfWZ1bmN0aW9uIF9uKGUsdCl7dCYmKGUuc2V0KFhyLFcuUE9QKSxlLnNldChacix0KSl9ZnVuY3Rpb24gUG4oZSx0KXt0JiYoZS5zZXQoWHIsVy5TU0gpLGUuc2V0KFpyLHQpKX1mdW5jdGlvbiBNbihlLHQpe2Uuc2V0KCJ4LWNsaWVudC1jdXJyZW50LXRlbGVtZXRyeSIsdC5nZW5lcmF0ZUN1cnJlbnRSZXF1ZXN0SGVhZGVyVmFsdWUoKSksZS5zZXQoIngtY2xpZW50LWxhc3QtdGVsZW1ldHJ5Iix0LmdlbmVyYXRlTGFzdFJlcXVlc3RIZWFkZXJWYWx1ZSgpKX1mdW5jdGlvbiBPbihlKXtlLnNldCgieC1tcy1saWItY2FwYWJpbGl0eSIsWCl9ZnVuY3Rpb24gcW4oZSx0LHIpe2UuaGFzKHJuKXx8ZS5zZXQocm4sdCksZS5oYXMobm4pfHxlLnNldChubixyKX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmNvbnN0IE5uPShlLHQscixuLG8pPT4oLi4uaSk9PntyLnRyYWNlKGBFeGVjdXRpbmcgZnVuY3Rpb24gJHt0fWApO2NvbnN0IHM9bj8uc3RhcnRNZWFzdXJlbWVudCh0LG8pO2lmKG8pe2NvbnN0IGU9dCsiQ2FsbENvdW50IjtuPy5pbmNyZW1lbnRGaWVsZHMoe1tlXToxfSxvKX10cnl7Y29uc3Qgbj1lKC4uLmkpO3JldHVybiBzPy5lbmQoe3N1Y2Nlc3M6ITB9KSxyLnRyYWNlKGBSZXR1cm5pbmcgcmVzdWx0IGZyb20gJHt0fWApLG59Y2F0Y2goZSl7ci50cmFjZShgRXJyb3Igb2NjdXJyZWQgaW4gJHt0fWApO3RyeXtyLnRyYWNlKEpTT04uc3RyaW5naWZ5KGUpKX1jYXRjaChlKXtyLnRyYWNlKCJVbmFibGUgdG8gcHJpbnQgZXJyb3IgbWVzc2FnZS4iKX10aHJvdyBzPy5lbmQoe3N1Y2Nlc3M6ITF9LGUpLGV9fSxVbj0oZSx0LHIsbixvKT0+KC4uLmkpPT57ci50cmFjZShgRXhlY3V0aW5nIGZ1bmN0aW9uICR7dH1gKTtjb25zdCBzPW4/LnN0YXJ0TWVhc3VyZW1lbnQodCxvKTtpZihvKXtjb25zdCBlPXQrIkNhbGxDb3VudCI7bj8uaW5jcmVtZW50RmllbGRzKHtbZV06MX0sbyl9cmV0dXJuIG4/LnNldFByZVF1ZXVlVGltZSh0LG8pLGUoLi4uaSkudGhlbigoZT0+KHIudHJhY2UoYFJldHVybmluZyByZXN1bHQgZnJvbSAke3R9YCkscz8uZW5kKHtzdWNjZXNzOiEwfSksZSkpKS5jYXRjaCgoZT0+e3IudHJhY2UoYEVycm9yIG9jY3VycmVkIGluICR7dH1gKTt0cnl7ci50cmFjZShKU09OLnN0cmluZ2lmeShlKSl9Y2F0Y2goZSl7ci50cmFjZSgiVW5hYmxlIHRvIHByaW50IGVycm9yIG1lc3NhZ2UuIil9dGhyb3cgcz8uZW5kKHtzdWNjZXNzOiExfSxlKSxlfSkpfTsKLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmNsYXNzIExue2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMubmV0d29ya0ludGVyZmFjZT1lLHRoaXMubG9nZ2VyPXQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudD1yLHRoaXMuY29ycmVsYXRpb25JZD1ufWFzeW5jIGRldGVjdFJlZ2lvbihlLG4pe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUmVnaW9uRGlzY292ZXJ5RGV0ZWN0UmVnaW9uLHRoaXMuY29ycmVsYXRpb25JZCk7bGV0IGk9ZTtpZihpKW4ucmVnaW9uX3NvdXJjZT1yZTtlbHNle2NvbnN0IGU9TG4uSU1EU19PUFRJT05TO3RyeXtjb25zdCBzPWF3YWl0IFVuKHRoaXMuZ2V0UmVnaW9uRnJvbUlNRFMuYmluZCh0aGlzKSxPci5SZWdpb25EaXNjb3ZlcnlHZXRSZWdpb25Gcm9tSU1EUyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkodC5JTURTX1ZFUlNJT04sZSk7aWYocy5zdGF0dXM9PT1yJiYoaT1zLmJvZHksbi5yZWdpb25fc291cmNlPW5lKSxzLnN0YXR1cz09PW8pe2NvbnN0IHQ9YXdhaXQgVW4odGhpcy5nZXRDdXJyZW50VmVyc2lvbi5iaW5kKHRoaXMpLE9yLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShlKTtpZighdClyZXR1cm4gbi5yZWdpb25fc291cmNlPXRlLG51bGw7Y29uc3Qgbz1hd2FpdCBVbih0aGlzLmdldFJlZ2lvbkZyb21JTURTLmJpbmQodGhpcyksT3IuUmVnaW9uRGlzY292ZXJ5R2V0UmVnaW9uRnJvbUlNRFMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZSk7by5zdGF0dXM9PT1yJiYoaT1vLmJvZHksbi5yZWdpb25fc291cmNlPW5lKX19Y2F0Y2goZSl7cmV0dXJuIG4ucmVnaW9uX3NvdXJjZT10ZSxudWxsfX1yZXR1cm4gaXx8KG4ucmVnaW9uX3NvdXJjZT10ZSksaXx8bnVsbH1hc3luYyBnZXRSZWdpb25Gcm9tSU1EUyhlLHIpe3JldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZ2lvbkRpc2NvdmVyeUdldFJlZ2lvbkZyb21JTURTLHRoaXMuY29ycmVsYXRpb25JZCksdGhpcy5uZXR3b3JrSW50ZXJmYWNlLnNlbmRHZXRSZXF1ZXN0QXN5bmMoYCR7dC5JTURTX0VORFBPSU5UfT9hcGktdmVyc2lvbj0ke2V9JmZvcm1hdD10ZXh0YCxyLHQuSU1EU19USU1FT1VUKX1hc3luYyBnZXRDdXJyZW50VmVyc2lvbihlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZ2lvbkRpc2NvdmVyeUdldEN1cnJlbnRWZXJzaW9uLHRoaXMuY29ycmVsYXRpb25JZCk7dHJ5e2NvbnN0IHI9YXdhaXQgdGhpcy5uZXR3b3JrSW50ZXJmYWNlLnNlbmRHZXRSZXF1ZXN0QXN5bmMoYCR7dC5JTURTX0VORFBPSU5UfT9mb3JtYXQ9anNvbmAsZSk7cmV0dXJuIHIuc3RhdHVzPT09byYmci5ib2R5JiZyLmJvZHlbIm5ld2VzdC12ZXJzaW9ucyJdJiZyLmJvZHlbIm5ld2VzdC12ZXJzaW9ucyJdLmxlbmd0aD4wP3IuYm9keVsibmV3ZXN0LXZlcnNpb25zIl1bMF06bnVsbH1jYXRjaChlKXtyZXR1cm4gbnVsbH19fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8KZnVuY3Rpb24gRG4oKXtyZXR1cm4gTWF0aC5yb3VuZCgobmV3IERhdGUpLmdldFRpbWUoKS8xZTMpfWZ1bmN0aW9uIEhuKGUpe3JldHVybiBlLmdldFRpbWUoKS8xZTN9ZnVuY3Rpb24geG4oZSl7cmV0dXJuIGU/bmV3IERhdGUoMWUzKk51bWJlcihlKSk6bmV3IERhdGV9ZnVuY3Rpb24gQm4oZSx0KXtjb25zdCByPU51bWJlcihlKXx8MDtyZXR1cm4gRG4oKSt0PnJ9ZnVuY3Rpb24gRm4oZSx0KXtjb25zdCByPU51bWJlcihlKSsyNCp0KjYwKjYwKjFlMztyZXR1cm4gRGF0ZS5ub3coKT5yfWZ1bmN0aW9uIHpuKGUpe3JldHVybiBOdW1iZXIoZSk+RG4oKX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gS24oZSx0LHIsbixvKXtyZXR1cm57Y3JlZGVudGlhbFR5cGU6SC5JRF9UT0tFTixob21lQWNjb3VudElkOmUsZW52aXJvbm1lbnQ6dCxjbGllbnRJZDpuLHNlY3JldDpyLHJlYWxtOm8sbGFzdFVwZGF0ZWRBdDpEYXRlLm5vdygpLnRvU3RyaW5nKCl9fWZ1bmN0aW9uIEduKGUsdCxyLG4sbyxpLHMsYSxjLGwsaCxkLHUsZyxwKXtjb25zdCBtPXtob21lQWNjb3VudElkOmUsY3JlZGVudGlhbFR5cGU6SC5BQ0NFU1NfVE9LRU4sc2VjcmV0OnIsY2FjaGVkQXQ6RG4oKS50b1N0cmluZygpLGV4cGlyZXNPbjpzLnRvU3RyaW5nKCksZXh0ZW5kZWRFeHBpcmVzT246YS50b1N0cmluZygpLGVudmlyb25tZW50OnQsY2xpZW50SWQ6bixyZWFsbTpvLHRhcmdldDppLHRva2VuVHlwZTpofHxXLkJFQVJFUixsYXN0VXBkYXRlZEF0OkRhdGUubm93KCkudG9TdHJpbmcoKX07aWYoZCYmKG0udXNlckFzc2VydGlvbkhhc2g9ZCksbCYmKG0ucmVmcmVzaE9uPWwudG9TdHJpbmcoKSksZyYmKG0ucmVxdWVzdGVkQ2xhaW1zPWcsbS5yZXF1ZXN0ZWRDbGFpbXNIYXNoPXApLG0udG9rZW5UeXBlPy50b0xvd2VyQ2FzZSgpIT09Vy5CRUFSRVIudG9Mb3dlckNhc2UoKSlzd2l0Y2gobS5jcmVkZW50aWFsVHlwZT1ILkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FLG0udG9rZW5UeXBlKXtjYXNlIFcuUE9QOmNvbnN0IGU9ZHIocixjKTtpZighZT8uY25mPy5raWQpdGhyb3cgbXQoZXQpO20ua2V5SWQ9ZS5jbmYua2lkO2JyZWFrO2Nhc2UgVy5TU0g6bS5rZXlJZD11fXJldHVybiBtfWZ1bmN0aW9uICRuKGUsdCxyLG4sbyxpLHMpe2NvbnN0IGE9e2NyZWRlbnRpYWxUeXBlOkguUkVGUkVTSF9UT0tFTixob21lQWNjb3VudElkOmUsZW52aXJvbm1lbnQ6dCxjbGllbnRJZDpuLHNlY3JldDpyLGxhc3RVcGRhdGVkQXQ6RGF0ZS5ub3coKS50b1N0cmluZygpfTtyZXR1cm4gaSYmKGEudXNlckFzc2VydGlvbkhhc2g9aSksbyYmKGEuZmFtaWx5SWQ9bykscyYmKGEuZXhwaXJlc09uPXMudG9TdHJpbmcoKSksYX1mdW5jdGlvbiBRbihlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgiaG9tZUFjY291bnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJlbnZpcm9ubWVudCIpJiZlLmhhc093blByb3BlcnR5KCJjcmVkZW50aWFsVHlwZSIpJiZlLmhhc093blByb3BlcnR5KCJjbGllbnRJZCIpJiZlLmhhc093blByb3BlcnR5KCJzZWNyZXQiKX1mdW5jdGlvbiBqbihlKXtyZXR1cm4hIWUmJihRbihlKSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVhbG0iKSYmZS5oYXNPd25Qcm9wZXJ0eSgidGFyZ2V0IikmJihlLmNyZWRlbnRpYWxUeXBlPT09SC5BQ0NFU1NfVE9LRU58fGUuY3JlZGVudGlhbFR5cGU9PT1ILkFDQ0VTU19UT0tFTl9XSVRIX0FVVEhfU0NIRU1FKSl9ZnVuY3Rpb24gV24oZSl7cmV0dXJuISFlJiYoUW4oZSkmJmUuY3JlZGVudGlhbFR5cGU9PT1ILlJFRlJFU0hfVE9LRU4pfWZ1bmN0aW9uIFZuKCl7cmV0dXJuIERuKCkren1mdW5jdGlvbiBKbihlLHQscil7ZS5hdXRob3JpemF0aW9uX2VuZHBvaW50PXQuYXV0aG9yaXphdGlvbl9lbmRwb2ludCxlLnRva2VuX2VuZHBvaW50PXQudG9rZW5fZW5kcG9pbnQsZS5lbmRfc2Vzc2lvbl9lbmRwb2ludD10LmVuZF9zZXNzaW9uX2VuZHBvaW50LGUuaXNzdWVyPXQuaXNzdWVyLGUuZW5kcG9pbnRzRnJvbU5ldHdvcms9cixlLmp3a3NfdXJpPXQuandrc191cml9ZnVuY3Rpb24gWW4oZSx0LHIpe2UuYWxpYXNlcz10LmFsaWFzZXMsZS5wcmVmZXJyZWRfY2FjaGU9dC5wcmVmZXJyZWRfY2FjaGUsZS5wcmVmZXJyZWRfbmV0d29yaz10LnByZWZlcnJlZF9uZXR3b3JrLGUuYWxpYXNlc0Zyb21OZXR3b3JrPXJ9ZnVuY3Rpb24gWG4oZSl7cmV0dXJuIGUuZXhwaXJlc0F0PD1EbigpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9Mbi5JTURTX09QVElPTlM9e2hlYWRlcnM6e01ldGFkYXRhOiJ0cnVlIn19O2NsYXNzIFpue2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSl7dGhpcy5jYW5vbmljYWxBdXRob3JpdHk9ZSx0aGlzLl9jYW5vbmljYWxBdXRob3JpdHkudmFsaWRhdGVBc1VyaSgpLHRoaXMubmV0d29ya0ludGVyZmFjZT10LHRoaXMuY2FjaGVNYW5hZ2VyPXIsdGhpcy5hdXRob3JpdHlPcHRpb25zPW4sdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YT17cmVnaW9uX3VzZWQ6dm9pZCAwLHJlZ2lvbl9zb3VyY2U6dm9pZCAwLHJlZ2lvbl9vdXRjb21lOnZvaWQgMH0sdGhpcy5sb2dnZXI9byx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXMsdGhpcy5jb3JyZWxhdGlvbklkPWksdGhpcy5tYW5hZ2VkSWRlbnRpdHk9YXx8ITEsdGhpcy5yZWdpb25EaXNjb3Zlcnk9bmV3IExuKHQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpfWdldEF1dGhvcml0eVR5cGUoZSl7aWYoZS5Ib3N0TmFtZUFuZFBvcnQuZW5kc1dpdGgodC5DSUFNX0FVVEhfVVJMKSlyZXR1cm4gYXI7Y29uc3Qgcj1lLlBhdGhTZWdtZW50cztpZihyLmxlbmd0aClzd2l0Y2goclswXS50b0xvd2VyQ2FzZSgpKXtjYXNlIHQuQURGUzpyZXR1cm4gaXI7Y2FzZSB0LkRTVFM6cmV0dXJuIHNyfXJldHVybiBvcn1nZXQgYXV0aG9yaXR5VHlwZSgpe3JldHVybiB0aGlzLmdldEF1dGhvcml0eVR5cGUodGhpcy5jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzKX1nZXQgcHJvdG9jb2xNb2RlKCl7cmV0dXJuIHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5wcm90b2NvbE1vZGV9Z2V0IG9wdGlvbnMoKXtyZXR1cm4gdGhpcy5hdXRob3JpdHlPcHRpb25zfWdldCBjYW5vbmljYWxBdXRob3JpdHkoKXtyZXR1cm4gdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LnVybFN0cmluZ31zZXQgY2Fub25pY2FsQXV0aG9yaXR5KGUpe3RoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eT1uZXcgd3IoZSksdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LnZhbGlkYXRlQXNVcmkoKSx0aGlzLl9jYW5vbmljYWxBdXRob3JpdHlVcmxDb21wb25lbnRzPW51bGx9Z2V0IGNhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMoKXtyZXR1cm4gdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50c3x8KHRoaXMuX2Nhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHM9dGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5LmdldFVybENvbXBvbmVudHMoKSksdGhpcy5fY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50c31nZXQgaG9zdG5hbWVBbmRQb3J0KCl7cmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5Ib3N0TmFtZUFuZFBvcnQudG9Mb3dlckNhc2UoKX1nZXQgdGVuYW50KCl7cmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHNbMF19Z2V0IGF1dGhvcml6YXRpb25FbmRwb2ludCgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmF1dGhvcml6YXRpb25fZW5kcG9pbnQpO3Rocm93IG10KGtlKX1nZXQgdG9rZW5FbmRwb2ludCgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLnRva2VuX2VuZHBvaW50KTt0aHJvdyBtdChrZSl9Z2V0IGRldmljZUNvZGVFbmRwb2ludCgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLnRva2VuX2VuZHBvaW50LnJlcGxhY2UoIi90b2tlbiIsIi9kZXZpY2Vjb2RlIikpO3Rocm93IG10KGtlKX1nZXQgZW5kU2Vzc2lvbkVuZHBvaW50KCl7aWYodGhpcy5kaXNjb3ZlcnlDb21wbGV0ZSgpKXtpZighdGhpcy5tZXRhZGF0YS5lbmRfc2Vzc2lvbl9lbmRwb2ludCl0aHJvdyBtdChudCk7cmV0dXJuIHRoaXMucmVwbGFjZVBhdGgodGhpcy5tZXRhZGF0YS5lbmRfc2Vzc2lvbl9lbmRwb2ludCl9dGhyb3cgbXQoa2UpfWdldCBzZWxmU2lnbmVkSnd0QXVkaWVuY2UoKXtpZih0aGlzLmRpc2NvdmVyeUNvbXBsZXRlKCkpcmV0dXJuIHRoaXMucmVwbGFjZVBhdGgodGhpcy5tZXRhZGF0YS5pc3N1ZXIpO3Rocm93IG10KGtlKX1nZXQgandrc1VyaSgpe2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5yZXBsYWNlUGF0aCh0aGlzLm1ldGFkYXRhLmp3a3NfdXJpKTt0aHJvdyBtdChrZSl9Y2FuUmVwbGFjZVRlbmFudChlKXtyZXR1cm4gMT09PWUuUGF0aFNlZ21lbnRzLmxlbmd0aCYmIVpuLnJlc2VydmVkVGVuYW50RG9tYWlucy5oYXMoZS5QYXRoU2VnbWVudHNbMF0pJiZ0aGlzLmdldEF1dGhvcml0eVR5cGUoZSk9PT1vciYmdGhpcy5wcm90b2NvbE1vZGUhPT1sci5PSURDfXJlcGxhY2VUZW5hbnQoZSl7cmV0dXJuIGUucmVwbGFjZSgve3RlbmFudH18e3RlbmFudGlkfS9nLHRoaXMudGVuYW50KX1yZXBsYWNlUGF0aChlKXtsZXQgdD1lO2NvbnN0IHI9bmV3IHdyKHRoaXMubWV0YWRhdGEuY2Fub25pY2FsX2F1dGhvcml0eSkuZ2V0VXJsQ29tcG9uZW50cygpLG49ci5QYXRoU2VnbWVudHM7cmV0dXJuIHRoaXMuY2Fub25pY2FsQXV0aG9yaXR5VXJsQ29tcG9uZW50cy5QYXRoU2VnbWVudHMuZm9yRWFjaCgoKGUsbyk9PntsZXQgaT1uW29dO2lmKDA9PT1vJiZ0aGlzLmNhblJlcGxhY2VUZW5hbnQocikpe2NvbnN0IGU9bmV3IHdyKHRoaXMubWV0YWRhdGEuYXV0aG9yaXphdGlvbl9lbmRwb2ludCkuZ2V0VXJsQ29tcG9uZW50cygpLlBhdGhTZWdtZW50c1swXTtpIT09ZSYmKHRoaXMubG9nZ2VyLnZlcmJvc2UoYFJlcGxhY2luZyB0ZW5hbnQgZG9tYWluIG5hbWUgJHtpfSB3aXRoIGlkICR7ZX1gKSxpPWUpfWUhPT1pJiYodD10LnJlcGxhY2UoYC8ke2l9L2AsYC8ke2V9L2ApKX0pKSx0aGlzLnJlcGxhY2VUZW5hbnQodCl9Z2V0IGRlZmF1bHRPcGVuSWRDb25maWd1cmF0aW9uRW5kcG9pbnQoKXtjb25zdCBlPXRoaXMuaG9zdG5hbWVBbmRQb3J0O3JldHVybiB0aGlzLmNhbm9uaWNhbEF1dGhvcml0eS5lbmRzV2l0aCgidjIuMC8iKXx8dGhpcy5hdXRob3JpdHlUeXBlPT09aXJ8fHRoaXMucHJvdG9jb2xNb2RlPT09bHIuT0lEQyYmIXRoaXMuaXNBbGlhc09mS25vd25NaWNyb3NvZnRBdXRob3JpdHkoZSk/YCR7dGhpcy5jYW5vbmljYWxBdXRob3JpdHl9LndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gOmAke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fXYyLjAvLndlbGwta25vd24vb3BlbmlkLWNvbmZpZ3VyYXRpb25gfWRpc2NvdmVyeUNvbXBsZXRlKCl7cmV0dXJuISF0aGlzLm1ldGFkYXRhfWFzeW5jIHJlc29sdmVFbmRwb2ludHNBc3luYygpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aG9yaXR5UmVzb2x2ZUVuZHBvaW50c0FzeW5jLHRoaXMuY29ycmVsYXRpb25JZCk7Y29uc3QgZT10aGlzLmdldEN1cnJlbnRNZXRhZGF0YUVudGl0eSgpLHQ9YXdhaXQgVW4odGhpcy51cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhLmJpbmQodGhpcyksT3IuQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoZSk7dGhpcy5jYW5vbmljYWxBdXRob3JpdHk9dGhpcy5jYW5vbmljYWxBdXRob3JpdHkucmVwbGFjZSh0aGlzLmhvc3RuYW1lQW5kUG9ydCxlLnByZWZlcnJlZF9uZXR3b3JrKTtjb25zdCByPWF3YWl0IFVuKHRoaXMudXBkYXRlRW5kcG9pbnRNZXRhZGF0YS5iaW5kKHRoaXMpLE9yLkF1dGhvcml0eVVwZGF0ZUVuZHBvaW50TWV0YWRhdGEsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKGUpO3RoaXMudXBkYXRlQ2FjaGVkTWV0YWRhdGEoZSx0LHtzb3VyY2U6cn0pLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7Y2xvdWREaXNjb3ZlcnlTb3VyY2U6dCxhdXRob3JpdHlFbmRwb2ludFNvdXJjZTpyfSx0aGlzLmNvcnJlbGF0aW9uSWQpfWdldEN1cnJlbnRNZXRhZGF0YUVudGl0eSgpe2xldCBlPXRoaXMuY2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhQnlBbGlhcyh0aGlzLmhvc3RuYW1lQW5kUG9ydCk7cmV0dXJuIGV8fChlPXthbGlhc2VzOltdLHByZWZlcnJlZF9jYWNoZTp0aGlzLmhvc3RuYW1lQW5kUG9ydCxwcmVmZXJyZWRfbmV0d29yazp0aGlzLmhvc3RuYW1lQW5kUG9ydCxjYW5vbmljYWxfYXV0aG9yaXR5OnRoaXMuY2Fub25pY2FsQXV0aG9yaXR5LGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6IiIsdG9rZW5fZW5kcG9pbnQ6IiIsZW5kX3Nlc3Npb25fZW5kcG9pbnQ6IiIsaXNzdWVyOiIiLGFsaWFzZXNGcm9tTmV0d29yazohMSxlbmRwb2ludHNGcm9tTmV0d29yazohMSxleHBpcmVzQXQ6Vm4oKSxqd2tzX3VyaToiIn0pLGV9dXBkYXRlQ2FjaGVkTWV0YWRhdGEoZSx0LHIpe3QhPT1HJiZyPy5zb3VyY2UhPT1HJiYoZS5leHBpcmVzQXQ9Vm4oKSxlLmNhbm9uaWNhbF9hdXRob3JpdHk9dGhpcy5jYW5vbmljYWxBdXRob3JpdHkpO2NvbnN0IG49dGhpcy5jYWNoZU1hbmFnZXIuZ2VuZXJhdGVBdXRob3JpdHlNZXRhZGF0YUNhY2hlS2V5KGUucHJlZmVycmVkX2NhY2hlKTt0aGlzLmNhY2hlTWFuYWdlci5zZXRBdXRob3JpdHlNZXRhZGF0YShuLGUpLHRoaXMubWV0YWRhdGE9ZX1hc3luYyB1cGRhdGVFbmRwb2ludE1ldGFkYXRhKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aG9yaXR5VXBkYXRlRW5kcG9pbnRNZXRhZGF0YSx0aGlzLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9dGhpcy51cGRhdGVFbmRwb2ludE1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhlKTtpZih0KXtpZih0LnNvdXJjZT09PVEmJnRoaXMuYXV0aG9yaXR5T3B0aW9ucy5henVyZVJlZ2lvbkNvbmZpZ3VyYXRpb24/LmF6dXJlUmVnaW9uJiZ0Lm1ldGFkYXRhKXtKbihlLGF3YWl0IFVuKHRoaXMudXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbi5iaW5kKHRoaXMpLE9yLkF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQubWV0YWRhdGEpLCExKSxlLmNhbm9uaWNhbF9hdXRob3JpdHk9dGhpcy5jYW5vbmljYWxBdXRob3JpdHl9cmV0dXJuIHQuc291cmNlfWxldCByPWF3YWl0IFVuKHRoaXMuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrLmJpbmQodGhpcyksT3IuQXV0aG9yaXR5R2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKSgpO2lmKHIpcmV0dXJuIHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5henVyZVJlZ2lvbkNvbmZpZ3VyYXRpb24/LmF6dXJlUmVnaW9uJiYocj1hd2FpdCBVbih0aGlzLnVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24uYmluZCh0aGlzKSxPci5BdXRob3JpdHlVcGRhdGVNZXRhZGF0YVdpdGhSZWdpb25hbEluZm9ybWF0aW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShyKSksSm4oZSxyLCEwKSwkO3Rocm93IG10KGJlLHRoaXMuZGVmYXVsdE9wZW5JZENvbmZpZ3VyYXRpb25FbmRwb2ludCl9dXBkYXRlRW5kcG9pbnRNZXRhZGF0YUZyb21Mb2NhbFNvdXJjZXMoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiQXR0ZW1wdGluZyB0byBnZXQgZW5kcG9pbnQgbWV0YWRhdGEgZnJvbSBhdXRob3JpdHkgY29uZmlndXJhdGlvbiIpO2NvbnN0IHQ9dGhpcy5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUNvbmZpZygpO2lmKHQpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIkZvdW5kIGVuZHBvaW50IG1ldGFkYXRhIGluIGF1dGhvcml0eSBjb25maWd1cmF0aW9uIiksSm4oZSx0LCExKSx7c291cmNlOkt9O2lmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIkRpZCBub3QgZmluZCBlbmRwb2ludCBtZXRhZGF0YSBpbiB0aGUgY29uZmlnLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGVuZHBvaW50IG1ldGFkYXRhIGZyb20gdGhlIGhhcmRjb2RlZCB2YWx1ZXMuIiksdGhpcy5hdXRob3JpdHlPcHRpb25zLnNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlKXRoaXMubG9nZ2VyLnZlcmJvc2UoIlNraXBwaW5nIGhhcmRjb2RlZCBtZXRhZGF0YSBjYWNoZSBzaW5jZSBza2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZSBpcyBzZXQgdG8gdHJ1ZS4gQXR0ZW1wdGluZyB0byBnZXQgZW5kcG9pbnQgbWV0YWRhdGEgZnJvbSB0aGUgbmV0d29yayBtZXRhZGF0YSBjYWNoZS4iKTtlbHNle2NvbnN0IHQ9dGhpcy5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUhhcmRjb2RlZFZhbHVlcygpO2lmKHQpcmV0dXJuIEpuKGUsdCwhMSkse3NvdXJjZTpRLG1ldGFkYXRhOnR9O3RoaXMubG9nZ2VyLnZlcmJvc2UoIkRpZCBub3QgZmluZCBlbmRwb2ludCBtZXRhZGF0YSBpbiBoYXJkY29kZWQgdmFsdWVzLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGVuZHBvaW50IG1ldGFkYXRhIGZyb20gdGhlIG5ldHdvcmsgbWV0YWRhdGEgY2FjaGUuIil9Y29uc3Qgcj1YbihlKTtyZXR1cm4gdGhpcy5pc0F1dGhvcml0eVNhbWVUeXBlKGUpJiZlLmVuZHBvaW50c0Zyb21OZXR3b3JrJiYhcj8odGhpcy5sb2dnZXIudmVyYm9zZSgiRm91bmQgZW5kcG9pbnQgbWV0YWRhdGEgaW4gdGhlIGNhY2hlLiIpLHtzb3VyY2U6R30pOihyJiZ0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgbWV0YWRhdGEgZW50aXR5IGlzIGV4cGlyZWQuIiksbnVsbCl9aXNBdXRob3JpdHlTYW1lVHlwZShlKXtyZXR1cm4gbmV3IHdyKGUuY2Fub25pY2FsX2F1dGhvcml0eSkuZ2V0VXJsQ29tcG9uZW50cygpLlBhdGhTZWdtZW50cy5sZW5ndGg9PT10aGlzLmNhbm9uaWNhbEF1dGhvcml0eVVybENvbXBvbmVudHMuUGF0aFNlZ21lbnRzLmxlbmd0aH1nZXRFbmRwb2ludE1ldGFkYXRhRnJvbUNvbmZpZygpe2lmKHRoaXMuYXV0aG9yaXR5T3B0aW9ucy5hdXRob3JpdHlNZXRhZGF0YSl0cnl7cmV0dXJuIEpTT04ucGFyc2UodGhpcy5hdXRob3JpdHlPcHRpb25zLmF1dGhvcml0eU1ldGFkYXRhKX1jYXRjaChlKXt0aHJvdyBKdChOdCl9cmV0dXJuIG51bGx9YXN5bmMgZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrKCl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5BdXRob3JpdHlHZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcmssdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBlPXt9LHQ9dGhpcy5kZWZhdWx0T3BlbklkQ29uZmlndXJhdGlvbkVuZHBvaW50O3RoaXMubG9nZ2VyLnZlcmJvc2UoYEF1dGhvcml0eS5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6IGF0dGVtcHRpbmcgdG8gcmV0cmlldmUgT0F1dGggZW5kcG9pbnRzIGZyb20gJHt0fWApO3RyeXtjb25zdCByPWF3YWl0IHRoaXMubmV0d29ya0ludGVyZmFjZS5zZW5kR2V0UmVxdWVzdEFzeW5jKHQsZSksbj0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovCmZ1bmN0aW9uKGUpe3JldHVybiBlLmhhc093blByb3BlcnR5KCJhdXRob3JpemF0aW9uX2VuZHBvaW50IikmJmUuaGFzT3duUHJvcGVydHkoInRva2VuX2VuZHBvaW50IikmJmUuaGFzT3duUHJvcGVydHkoImlzc3VlciIpJiZlLmhhc093blByb3BlcnR5KCJqd2tzX3VyaSIpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8oci5ib2R5KTtyZXR1cm4gbj9yLmJvZHk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoIkF1dGhvcml0eS5nZXRFbmRwb2ludE1ldGFkYXRhRnJvbU5ldHdvcms6IGNvdWxkIG5vdCBwYXJzZSByZXNwb25zZSBhcyBPcGVuSUQgY29uZmlndXJhdGlvbiIpLG51bGwpfWNhdGNoKGUpe3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKGBBdXRob3JpdHkuZ2V0RW5kcG9pbnRNZXRhZGF0YUZyb21OZXR3b3JrOiAke2V9YCksbnVsbH19Z2V0RW5kcG9pbnRNZXRhZGF0YUZyb21IYXJkY29kZWRWYWx1ZXMoKXtyZXR1cm4gdGhpcy5ob3N0bmFtZUFuZFBvcnQgaW4gdnI/dnJbdGhpcy5ob3N0bmFtZUFuZFBvcnRdOm51bGx9YXN5bmMgdXBkYXRlTWV0YWRhdGFXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkF1dGhvcml0eVVwZGF0ZU1ldGFkYXRhV2l0aFJlZ2lvbmFsSW5mb3JtYXRpb24sdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCByPXRoaXMuYXV0aG9yaXR5T3B0aW9ucy5henVyZVJlZ2lvbkNvbmZpZ3VyYXRpb24/LmF6dXJlUmVnaW9uO2lmKHIpe2lmKHIhPT10LkFaVVJFX1JFR0lPTl9BVVRPX0RJU0NPVkVSX0ZMQUcpcmV0dXJuIHRoaXMucmVnaW9uRGlzY292ZXJ5TWV0YWRhdGEucmVnaW9uX291dGNvbWU9b2UsdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fdXNlZD1yLFpuLnJlcGxhY2VXaXRoUmVnaW9uYWxJbmZvcm1hdGlvbihlLHIpO2NvbnN0IG49YXdhaXQgVW4odGhpcy5yZWdpb25EaXNjb3ZlcnkuZGV0ZWN0UmVnaW9uLmJpbmQodGhpcy5yZWdpb25EaXNjb3ZlcnkpLE9yLlJlZ2lvbkRpc2NvdmVyeURldGVjdFJlZ2lvbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkodGhpcy5hdXRob3JpdHlPcHRpb25zLmF6dXJlUmVnaW9uQ29uZmlndXJhdGlvbj8uZW52aXJvbm1lbnRSZWdpb24sdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YSk7aWYobilyZXR1cm4gdGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fb3V0Y29tZT1pZSx0aGlzLnJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhLnJlZ2lvbl91c2VkPW4sWm4ucmVwbGFjZVdpdGhSZWdpb25hbEluZm9ybWF0aW9uKGUsbik7dGhpcy5yZWdpb25EaXNjb3ZlcnlNZXRhZGF0YS5yZWdpb25fb3V0Y29tZT1zZX1yZXR1cm4gZX1hc3luYyB1cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aG9yaXR5VXBkYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YSx0aGlzLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9dGhpcy51cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhlKTtpZih0KXJldHVybiB0O2NvbnN0IHI9YXdhaXQgVW4odGhpcy5nZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmsuYmluZCh0aGlzKSxPci5BdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmssdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKCk7aWYocilyZXR1cm4gWW4oZSxyLCEwKSwkO3Rocm93IEp0KFV0KX11cGRhdGVDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUxvY2FsU291cmNlcyhlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJBdHRlbXB0aW5nIHRvIGdldCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgIGZyb20gYXV0aG9yaXR5IGNvbmZpZ3VyYXRpb24iKSx0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBLbm93biBBdXRob3JpdGllczogJHt0aGlzLmF1dGhvcml0eU9wdGlvbnMua25vd25BdXRob3JpdGllc3x8dC5OT1RfQVBQTElDQUJMRX1gKSx0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBBdXRob3JpdHkgTWV0YWRhdGE6ICR7dGhpcy5hdXRob3JpdHlPcHRpb25zLmF1dGhvcml0eU1ldGFkYXRhfHx0Lk5PVF9BUFBMSUNBQkxFfWApLHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYENhbm9uaWNhbCBBdXRob3JpdHk6ICR7ZS5jYW5vbmljYWxfYXV0aG9yaXR5fHx0Lk5PVF9BUFBMSUNBQkxFfWApO2NvbnN0IHI9dGhpcy5nZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbUNvbmZpZygpO2lmKHIpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIkZvdW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiBhdXRob3JpdHkgY29uZmlndXJhdGlvbiIpLFluKGUsciwhMSksSztpZih0aGlzLmxvZ2dlci52ZXJib3NlKCJEaWQgbm90IGZpbmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGluIHRoZSBjb25maWcuLi4gQXR0ZW1wdGluZyB0byBnZXQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGZyb20gdGhlIGhhcmRjb2RlZCB2YWx1ZXMuIiksdGhpcy5vcHRpb25zLnNraXBBdXRob3JpdHlNZXRhZGF0YUNhY2hlKXRoaXMubG9nZ2VyLnZlcmJvc2UoIlNraXBwaW5nIGhhcmRjb2RlZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgY2FjaGUgc2luY2Ugc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGUgaXMgc2V0IHRvIHRydWUuIEF0dGVtcHRpbmcgdG8gZ2V0IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLiIpO2Vsc2V7Y29uc3QgdD0obj10aGlzLmhvc3RuYW1lQW5kUG9ydCxrcihJci5tZXRhZGF0YSxuKSk7aWYodClyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiRm91bmQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhIGZyb20gaGFyZGNvZGVkIHZhbHVlcy4iKSxZbihlLHQsITEpLFE7dGhpcy5sb2dnZXIudmVyYm9zZSgiRGlkIG5vdCBmaW5kIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBpbiBoYXJkY29kZWQgdmFsdWVzLi4uIEF0dGVtcHRpbmcgdG8gZ2V0IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBuZXR3b3JrIG1ldGFkYXRhIGNhY2hlLiIpfXZhciBuO2NvbnN0IG89WG4oZSk7cmV0dXJuIHRoaXMuaXNBdXRob3JpdHlTYW1lVHlwZShlKSYmZS5hbGlhc2VzRnJvbU5ldHdvcmsmJiFvPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJGb3VuZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEgaW4gdGhlIGNhY2hlLiIpLEcpOihvJiZ0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgbWV0YWRhdGEgZW50aXR5IGlzIGV4cGlyZWQuIiksbnVsbCl9Z2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Db25maWcoKXtpZih0aGlzLmF1dGhvcml0eVR5cGU9PT1hcilyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiQ0lBTSBhdXRob3JpdGllcyBkbyBub3Qgc3VwcG9ydCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEsIGdlbmVyYXRlIHRoZSBhbGlhc2VzIGZyb20gYXV0aG9yaXR5IGhvc3QuIiksWm4uY3JlYXRlQ2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21Ib3N0KHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtpZih0aGlzLmF1dGhvcml0eU9wdGlvbnMuY2xvdWREaXNjb3ZlcnlNZXRhZGF0YSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBoYXMgYmVlbiBwcm92aWRlZCBhcyBhIG5ldHdvcmsgcmVzcG9uc2UsIGluIHRoZSBjb25maWcuIik7dHJ5e3RoaXMubG9nZ2VyLnZlcmJvc2UoIkF0dGVtcHRpbmcgdG8gcGFyc2UgdGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YS4iKTtjb25zdCBlPWtyKEpTT04ucGFyc2UodGhpcy5hdXRob3JpdHlPcHRpb25zLmNsb3VkRGlzY292ZXJ5TWV0YWRhdGEpLm1ldGFkYXRhLHRoaXMuaG9zdG5hbWVBbmRQb3J0KTtpZih0aGlzLmxvZ2dlci52ZXJib3NlKCJQYXJzZWQgdGhlIGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YS4iKSxlKXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGVyZSBpcyByZXR1cm5hYmxlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBwYXJzZWQgY2xvdWQgZGlzY292ZXJ5IG1ldGFkYXRhLiIpLGU7dGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlcmUgaXMgbm8gbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhlIHBhcnNlZCBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEuIil9Y2F0Y2goZSl7dGhyb3cgdGhpcy5sb2dnZXIudmVyYm9zZSgiVW5hYmxlIHRvIHBhcnNlIHRoZSBjbG91ZCBkaXNjb3ZlcnkgbWV0YWRhdGEuIFRocm93aW5nIEludmFsaWQgQ2xvdWQgRGlzY292ZXJ5IE1ldGFkYXRhIEVycm9yLiIpLEp0KHF0KX19cmV0dXJuIHRoaXMuaXNJbktub3duQXV0aG9yaXRpZXMoKT8odGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlIGhvc3QgaXMgaW5jbHVkZWQgaW4ga25vd25BdXRob3JpdGllcy4gQ3JlYXRpbmcgbmV3IGNsb3VkIGRpc2NvdmVyeSBtZXRhZGF0YSBmcm9tIHRoZSBob3N0LiIpLFpuLmNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdCh0aGlzLmhvc3RuYW1lQW5kUG9ydCkpOm51bGx9YXN5bmMgZ2V0Q2xvdWREaXNjb3ZlcnlNZXRhZGF0YUZyb21OZXR3b3JrKCl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5BdXRob3JpdHlHZXRDbG91ZERpc2NvdmVyeU1ldGFkYXRhRnJvbU5ldHdvcmssdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBlPWAke3QuQUFEX0lOU1RBTkNFX0RJU0NPVkVSWV9FTkRQVH0ke3RoaXMuY2Fub25pY2FsQXV0aG9yaXR5fW9hdXRoMi92Mi4wL2F1dGhvcml6ZWAscj17fTtsZXQgbj1udWxsO3RyeXtjb25zdCBvPWF3YWl0IHRoaXMubmV0d29ya0ludGVyZmFjZS5zZW5kR2V0UmVxdWVzdEFzeW5jKGUscik7bGV0IGkscztpZihmdW5jdGlvbihlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgidGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludCIpJiZlLmhhc093blByb3BlcnR5KCJtZXRhZGF0YSIpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8oby5ib2R5KSlpPW8uYm9keSxzPWkubWV0YWRhdGEsdGhpcy5sb2dnZXIudmVyYm9zZVBpaShgdGVuYW50X2Rpc2NvdmVyeV9lbmRwb2ludCBpczogJHtpLnRlbmFudF9kaXNjb3ZlcnlfZW5kcG9pbnR9YCk7ZWxzZXtpZighZnVuY3Rpb24oZSl7cmV0dXJuIGUuaGFzT3duUHJvcGVydHkoImVycm9yIikmJmUuaGFzT3duUHJvcGVydHkoImVycm9yX2Rlc2NyaXB0aW9uIil9KG8uYm9keSkpcmV0dXJuIHRoaXMubG9nZ2VyLmVycm9yKCJBQUQgZGlkIG5vdCByZXR1cm4gYSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5UmVzcG9uc2Ugb3IgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2UiKSxudWxsO2lmKHRoaXMubG9nZ2VyLndhcm5pbmcoYEEgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2Ugd2FzIHJldHVybmVkLiBUaGUgY2xvdWQgaW5zdGFuY2UgZGlzY292ZXJ5IG5ldHdvcmsgcmVxdWVzdCdzIHN0YXR1cyBjb2RlIGlzOiAke28uc3RhdHVzfWApLGk9by5ib2R5LGkuZXJyb3I9PT10LklOVkFMSURfSU5TVEFOQ0UpcmV0dXJuIHRoaXMubG9nZ2VyLmVycm9yKCJUaGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeUVycm9yUmVzcG9uc2UgZXJyb3IgaXMgaW52YWxpZF9pbnN0YW5jZS4iKSxudWxsO3RoaXMubG9nZ2VyLndhcm5pbmcoYFRoZSBDbG91ZEluc3RhbmNlRGlzY292ZXJ5RXJyb3JSZXNwb25zZSBlcnJvciBpcyAke2kuZXJyb3J9YCksdGhpcy5sb2dnZXIud2FybmluZyhgVGhlIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlFcnJvclJlc3BvbnNlIGVycm9yIGRlc2NyaXB0aW9uIGlzICR7aS5lcnJvcl9kZXNjcmlwdGlvbn1gKSx0aGlzLmxvZ2dlci53YXJuaW5nKCJTZXR0aW5nIHRoZSB2YWx1ZSBvZiB0aGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhIChyZXR1cm5lZCBmcm9tIHRoZSBuZXR3b3JrKSB0byBbXSIpLHM9W119dGhpcy5sb2dnZXIudmVyYm9zZSgiQXR0ZW1wdGluZyB0byBmaW5kIGEgbWF0Y2ggYmV0d2VlbiB0aGUgZGV2ZWxvcGVyJ3MgYXV0aG9yaXR5IGFuZCB0aGUgQ2xvdWRJbnN0YW5jZURpc2NvdmVyeU1ldGFkYXRhIHJldHVybmVkIGZyb20gdGhlIG5ldHdvcmsgcmVxdWVzdC4iKSxuPWtyKHMsdGhpcy5ob3N0bmFtZUFuZFBvcnQpfWNhdGNoKGUpe2lmKGUgaW5zdGFuY2VvZiBDZSl0aGlzLmxvZ2dlci5lcnJvcihgVGhlcmUgd2FzIGEgbmV0d29yayBlcnJvciB3aGlsZSBhdHRlbXB0aW5nIHRvIGdldCB0aGUgY2xvdWQgZGlzY292ZXJ5IGluc3RhbmNlIG1ldGFkYXRhLlxuRXJyb3I6ICR7ZS5lcnJvckNvZGV9XG5FcnJvciBEZXNjcmlwdGlvbjogJHtlLmVycm9yTWVzc2FnZX1gKTtlbHNle2NvbnN0IHQ9ZTt0aGlzLmxvZ2dlci5lcnJvcihgQSBub24tTVNBTEpTIGVycm9yIHdhcyB0aHJvd24gd2hpbGUgYXR0ZW1wdGluZyB0byBnZXQgdGhlIGNsb3VkIGluc3RhbmNlIGRpc2NvdmVyeSBtZXRhZGF0YS5cbkVycm9yOiAke3QubmFtZX1cbkVycm9yIERlc2NyaXB0aW9uOiAke3QubWVzc2FnZX1gKX1yZXR1cm4gbnVsbH1yZXR1cm4gbnx8KHRoaXMubG9nZ2VyLndhcm5pbmcoIlRoZSBkZXZlbG9wZXIncyBhdXRob3JpdHkgd2FzIG5vdCBmb3VuZCB3aXRoaW4gdGhlIENsb3VkSW5zdGFuY2VEaXNjb3ZlcnlNZXRhZGF0YSByZXR1cm5lZCBmcm9tIHRoZSBuZXR3b3JrIHJlcXVlc3QuIiksdGhpcy5sb2dnZXIudmVyYm9zZSgiQ3JlYXRpbmcgY3VzdG9tIEF1dGhvcml0eSBmb3IgY3VzdG9tIGRvbWFpbiBzY2VuYXJpby4iKSxuPVpuLmNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdCh0aGlzLmhvc3RuYW1lQW5kUG9ydCkpLG59aXNJbktub3duQXV0aG9yaXRpZXMoKXtyZXR1cm4gdGhpcy5hdXRob3JpdHlPcHRpb25zLmtub3duQXV0aG9yaXRpZXMuZmlsdGVyKChlPT5lJiZ3ci5nZXREb21haW5Gcm9tVXJsKGUpLnRvTG93ZXJDYXNlKCk9PT10aGlzLmhvc3RuYW1lQW5kUG9ydCkpLmxlbmd0aD4wfXN0YXRpYyBnZW5lcmF0ZUF1dGhvcml0eShlLHIpe2xldCBuO2lmKHImJnIuYXp1cmVDbG91ZEluc3RhbmNlIT09SXQuTm9uZSl7Y29uc3QgZT1yLnRlbmFudD9yLnRlbmFudDp0LkRFRkFVTFRfQ09NTU9OX1RFTkFOVDtuPWAke3IuYXp1cmVDbG91ZEluc3RhbmNlfS8ke2V9L2B9cmV0dXJuIG58fGV9c3RhdGljIGNyZWF0ZUNsb3VkRGlzY292ZXJ5TWV0YWRhdGFGcm9tSG9zdChlKXtyZXR1cm57cHJlZmVycmVkX25ldHdvcms6ZSxwcmVmZXJyZWRfY2FjaGU6ZSxhbGlhc2VzOltlXX19Z2V0UHJlZmVycmVkQ2FjaGUoKXtpZih0aGlzLm1hbmFnZWRJZGVudGl0eSlyZXR1cm4gdC5ERUZBVUxUX0FVVEhPUklUWV9IT1NUO2lmKHRoaXMuZGlzY292ZXJ5Q29tcGxldGUoKSlyZXR1cm4gdGhpcy5tZXRhZGF0YS5wcmVmZXJyZWRfY2FjaGU7dGhyb3cgbXQoa2UpfWlzQWxpYXMoZSl7cmV0dXJuIHRoaXMubWV0YWRhdGEuYWxpYXNlcy5pbmRleE9mKGUpPi0xfWlzQWxpYXNPZktub3duTWljcm9zb2Z0QXV0aG9yaXR5KGUpe3JldHVybiBUci5oYXMoZSl9c3RhdGljIGlzUHVibGljQ2xvdWRBdXRob3JpdHkoZSl7cmV0dXJuIHQuS05PV05fUFVCTElDX0NMT1VEUy5pbmRleE9mKGUpPj0wfXN0YXRpYyBidWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKGUscixuKXtjb25zdCBvPW5ldyB3cihlKTtvLnZhbGlkYXRlQXNVcmkoKTtjb25zdCBpPW8uZ2V0VXJsQ29tcG9uZW50cygpO2xldCBzPWAke3J9LiR7aS5Ib3N0TmFtZUFuZFBvcnR9YDt0aGlzLmlzUHVibGljQ2xvdWRBdXRob3JpdHkoaS5Ib3N0TmFtZUFuZFBvcnQpJiYocz1gJHtyfS4ke3QuUkVHSU9OQUxfQVVUSF9QVUJMSUNfQ0xPVURfU1VGRklYfWApO2NvbnN0IGE9d3IuY29uc3RydWN0QXV0aG9yaXR5VXJpRnJvbU9iamVjdCh7Li4uby5nZXRVcmxDb21wb25lbnRzKCksSG9zdE5hbWVBbmRQb3J0OnN9KS51cmxTdHJpbmc7cmV0dXJuIG4/YCR7YX0/JHtufWA6YX1zdGF0aWMgcmVwbGFjZVdpdGhSZWdpb25hbEluZm9ybWF0aW9uKGUsdCl7Y29uc3Qgcj17Li4uZX07cmV0dXJuIHIuYXV0aG9yaXphdGlvbl9lbmRwb2ludD1abi5idWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKHIuYXV0aG9yaXphdGlvbl9lbmRwb2ludCx0KSxyLnRva2VuX2VuZHBvaW50PVpuLmJ1aWxkUmVnaW9uYWxBdXRob3JpdHlTdHJpbmcoci50b2tlbl9lbmRwb2ludCx0KSxyLmVuZF9zZXNzaW9uX2VuZHBvaW50JiYoci5lbmRfc2Vzc2lvbl9lbmRwb2ludD1abi5idWlsZFJlZ2lvbmFsQXV0aG9yaXR5U3RyaW5nKHIuZW5kX3Nlc3Npb25fZW5kcG9pbnQsdCkpLHJ9c3RhdGljIHRyYW5zZm9ybUNJQU1BdXRob3JpdHkoZSl7bGV0IHI9ZTtjb25zdCBuPW5ldyB3cihlKS5nZXRVcmxDb21wb25lbnRzKCk7aWYoMD09PW4uUGF0aFNlZ21lbnRzLmxlbmd0aCYmbi5Ib3N0TmFtZUFuZFBvcnQuZW5kc1dpdGgodC5DSUFNX0FVVEhfVVJMKSl7cj1gJHtyfSR7bi5Ib3N0TmFtZUFuZFBvcnQuc3BsaXQoIi4iKVswXX0ke3QuQUFEX1RFTkFOVF9ET01BSU5fU1VGRklYfWB9cmV0dXJuIHJ9fWZ1bmN0aW9uIGVvKGUpe3JldHVybiBlLmVuZHNXaXRoKHQuRk9SV0FSRF9TTEFTSCk/ZTpgJHtlfSR7dC5GT1JXQVJEX1NMQVNIfWB9ZnVuY3Rpb24gdG8oZSl7Y29uc3QgdD1lLmNsb3VkRGlzY292ZXJ5TWV0YWRhdGE7bGV0IHI7aWYodCl0cnl7cj1KU09OLnBhcnNlKHQpfWNhdGNoKGUpe3Rocm93IEp0KHF0KX1yZXR1cm57Y2Fub25pY2FsQXV0aG9yaXR5OmUuYXV0aG9yaXR5P2VvKGUuYXV0aG9yaXR5KTp2b2lkIDAsa25vd25BdXRob3JpdGllczplLmtub3duQXV0aG9yaXRpZXMsY2xvdWREaXNjb3ZlcnlNZXRhZGF0YTpyfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovYXN5bmMgZnVuY3Rpb24gcm8oZSx0LHIsbixvLGkscyl7cz8uYWRkUXVldWVNZWFzdXJlbWVudChPci5BdXRob3JpdHlGYWN0b3J5Q3JlYXRlRGlzY292ZXJlZEluc3RhbmNlLGkpO2NvbnN0IGE9Wm4udHJhbnNmb3JtQ0lBTUF1dGhvcml0eShlbyhlKSksYz1uZXcgWm4oYSx0LHIsbixvLGkscyk7dHJ5e3JldHVybiBhd2FpdCBVbihjLnJlc29sdmVFbmRwb2ludHNBc3luYy5iaW5kKGMpLE9yLkF1dGhvcml0eVJlc29sdmVFbmRwb2ludHNBc3luYyxvLHMsaSkoKSxjfWNhdGNoKGUpe3Rocm93IG10KGtlKX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL1puLnJlc2VydmVkVGVuYW50RG9tYWlucz1uZXcgU2V0KFsie3RlbmFudH0iLCJ7dGVuYW50aWR9IixJLEEsVF0pO2NsYXNzIG5vIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoZSx0LHIsbixvKXtzdXBlcihlLHQsciksdGhpcy5uYW1lPSJTZXJ2ZXJFcnJvciIsdGhpcy5lcnJvck5vPW4sdGhpcy5zdGF0dXM9byxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxuby5wcm90b3R5cGUpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gb28oZSx0LHIpe3JldHVybntjbGllbnRJZDplLGF1dGhvcml0eTp0LmF1dGhvcml0eSxzY29wZXM6dC5zY29wZXMsaG9tZUFjY291bnRJZGVudGlmaWVyOnIsY2xhaW1zOnQuY2xhaW1zLGF1dGhlbnRpY2F0aW9uU2NoZW1lOnQuYXV0aGVudGljYXRpb25TY2hlbWUscmVzb3VyY2VSZXF1ZXN0TWV0aG9kOnQucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLHJlc291cmNlUmVxdWVzdFVyaTp0LnJlc291cmNlUmVxdWVzdFVyaSxzaHJDbGFpbXM6dC5zaHJDbGFpbXMsc3NoS2lkOnQuc3NoS2lkLGVtYmVkZGVkQ2xpZW50SWQ6dC5lbWJlZGRlZENsaWVudElkfHx0LnRva2VuQm9keVBhcmFtZXRlcnM/LmNsaWVudElkfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3MgaW97c3RhdGljIGdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkoZSl7cmV0dXJuYCR7WX0uJHtKU09OLnN0cmluZ2lmeShlKX1gfXN0YXRpYyBwcmVQcm9jZXNzKGUscixuKXtjb25zdCBvPWlvLmdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkociksaT1lLmdldFRocm90dGxpbmdDYWNoZShvKTtpZihpKXtpZihpLnRocm90dGxlVGltZTxEYXRlLm5vdygpKXJldHVybiB2b2lkIGUucmVtb3ZlSXRlbShvLG4pO3Rocm93IG5ldyBubyhpLmVycm9yQ29kZXM/LmpvaW4oIiAiKXx8dC5FTVBUWV9TVFJJTkcsaS5lcnJvck1lc3NhZ2UsaS5zdWJFcnJvcil9fXN0YXRpYyBwb3N0UHJvY2VzcyhlLHQscixuKXtpZihpby5jaGVja1Jlc3BvbnNlU3RhdHVzKHIpfHxpby5jaGVja1Jlc3BvbnNlRm9yUmV0cnlBZnRlcihyKSl7Y29uc3Qgbz17dGhyb3R0bGVUaW1lOmlvLmNhbGN1bGF0ZVRocm90dGxlVGltZShwYXJzZUludChyLmhlYWRlcnNbcF0pKSxlcnJvcjpyLmJvZHkuZXJyb3IsZXJyb3JDb2RlczpyLmJvZHkuZXJyb3JfY29kZXMsZXJyb3JNZXNzYWdlOnIuYm9keS5lcnJvcl9kZXNjcmlwdGlvbixzdWJFcnJvcjpyLmJvZHkuc3ViZXJyb3J9O2Uuc2V0VGhyb3R0bGluZ0NhY2hlKGlvLmdlbmVyYXRlVGhyb3R0bGluZ1N0b3JhZ2VLZXkodCksbyxuKX19c3RhdGljIGNoZWNrUmVzcG9uc2VTdGF0dXMoZSl7cmV0dXJuIDQyOT09PWUuc3RhdHVzfHxlLnN0YXR1cz49NTAwJiZlLnN0YXR1czw2MDB9c3RhdGljIGNoZWNrUmVzcG9uc2VGb3JSZXRyeUFmdGVyKGUpe3JldHVybiEhZS5oZWFkZXJzJiYoZS5oZWFkZXJzLmhhc093blByb3BlcnR5KHApJiYoZS5zdGF0dXM8MjAwfHxlLnN0YXR1cz49MzAwKSl9c3RhdGljIGNhbGN1bGF0ZVRocm90dGxlVGltZShlKXtjb25zdCB0PWU8PTA/MDplLHI9RGF0ZS5ub3coKS8xZTM7cmV0dXJuIE1hdGguZmxvb3IoMWUzKk1hdGgubWluKHIrKHR8fFYpLHIrSikpfXN0YXRpYyByZW1vdmVUaHJvdHRsZShlLHQscixuKXtjb25zdCBvPW9vKHQscixuKSxpPXRoaXMuZ2VuZXJhdGVUaHJvdHRsaW5nU3RvcmFnZUtleShvKTtlLnJlbW92ZUl0ZW0oaSxyLmNvcnJlbGF0aW9uSWQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3Mgc28gZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQscil7c3VwZXIoZS5lcnJvckNvZGUsZS5lcnJvck1lc3NhZ2UsZS5zdWJFcnJvciksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsc28ucHJvdG90eXBlKSx0aGlzLm5hbWU9Ik5ldHdvcmtFcnJvciIsdGhpcy5lcnJvcj1lLHRoaXMuaHR0cFN0YXR1cz10LHRoaXMucmVzcG9uc2VIZWFkZXJzPXJ9fWZ1bmN0aW9uIGFvKGUsdCxyLG4pe3JldHVybiBlLmVycm9yTWVzc2FnZT1gJHtlLmVycm9yTWVzc2FnZX0sIGFkZGl0aW9uYWxFcnJvckluZm86IGVycm9yLm5hbWU6JHtuPy5uYW1lfSwgZXJyb3IubWVzc2FnZToke24/Lm1lc3NhZ2V9YCxuZXcgc28oZSx0LHIpfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBjb3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY29uZmlnPWZ1bmN0aW9uKHthdXRoT3B0aW9uczplLHN5c3RlbU9wdGlvbnM6dCxsb2dnZXJPcHRpb25zOnIsY2FjaGVPcHRpb25zOm4sc3RvcmFnZUludGVyZmFjZTpvLG5ldHdvcmtJbnRlcmZhY2U6aSxjcnlwdG9JbnRlcmZhY2U6cyxjbGllbnRDcmVkZW50aWFsczphLGxpYnJhcnlJbmZvOmMsdGVsZW1ldHJ5Omwsc2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpoLHBlcnNpc3RlbmNlUGx1Z2luOmQsc2VyaWFsaXphYmxlQ2FjaGU6dX0pe2NvbnN0IGc9ey4uLkJyLC4uLnJ9O3JldHVybnthdXRoT3B0aW9uczoocD1lLHtjbGllbnRDYXBhYmlsaXRpZXM6W10sYXp1cmVDbG91ZE9wdGlvbnM6JHIsc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6ITEsaW5zdGFuY2VBd2FyZTohMSxlbmNvZGVFeHRyYVF1ZXJ5UGFyYW1zOiExLC4uLnB9KSxzeXN0ZW1PcHRpb25zOnsuLi54ciwuLi50fSxsb2dnZXJPcHRpb25zOmcsY2FjaGVPcHRpb25zOnsuLi5GciwuLi5ufSxzdG9yYWdlSW50ZXJmYWNlOm98fG5ldyBNcihlLmNsaWVudElkLGZ0LG5ldyBDdChnKSxuZXcgSHIpLG5ldHdvcmtJbnRlcmZhY2U6aXx8enIsY3J5cHRvSW50ZXJmYWNlOnN8fGZ0LGNsaWVudENyZWRlbnRpYWxzOmF8fEdyLGxpYnJhcnlJbmZvOnsuLi5LciwuLi5jfSx0ZWxlbWV0cnk6ey4uLlFyLC4uLmx9LHNlcnZlclRlbGVtZXRyeU1hbmFnZXI6aHx8bnVsbCxwZXJzaXN0ZW5jZVBsdWdpbjpkfHxudWxsLHNlcmlhbGl6YWJsZUNhY2hlOnV8fG51bGx9O3ZhciBwfShlKSx0aGlzLmxvZ2dlcj1uZXcgQ3QodGhpcy5jb25maWcubG9nZ2VyT3B0aW9ucyx3dCx2dCksdGhpcy5jcnlwdG9VdGlscz10aGlzLmNvbmZpZy5jcnlwdG9JbnRlcmZhY2UsdGhpcy5jYWNoZU1hbmFnZXI9dGhpcy5jb25maWcuc3RvcmFnZUludGVyZmFjZSx0aGlzLm5ldHdvcmtDbGllbnQ9dGhpcy5jb25maWcubmV0d29ya0ludGVyZmFjZSx0aGlzLnNlcnZlclRlbGVtZXRyeU1hbmFnZXI9dGhpcy5jb25maWcuc2VydmVyVGVsZW1ldHJ5TWFuYWdlcix0aGlzLmF1dGhvcml0eT10aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5hdXRob3JpdHksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10fWNyZWF0ZVRva2VuUmVxdWVzdEhlYWRlcnMoZSl7Y29uc3Qgcj17fTtpZihyW3VdPXQuVVJMX0ZPUk1fQ09OVEVOVF9UWVBFLCF0aGlzLmNvbmZpZy5zeXN0ZW1PcHRpb25zLnByZXZlbnRDb3JzUHJlZmxpZ2h0JiZlKXN3aXRjaChlLnR5cGUpe2Nhc2UgV3I6dHJ5e2NvbnN0IHQ9ZXIoZS5jcmVkZW50aWFsKTtyW21dPWBPaWQ6JHt0LnVpZH1AJHt0LnV0aWR9YH1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJDb3VsZCBub3QgcGFyc2UgaG9tZSBhY2NvdW50IElEIGZvciBDQ1MgSGVhZGVyOiAiK2UpfWJyZWFrO2Nhc2UgVnI6clttXT1gVVBOOiAke2UuY3JlZGVudGlhbH1gfXJldHVybiByfWFzeW5jIGV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50KGUsdCxyLG4sbyxpKXtpJiZ0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KGksbyk7Y29uc3Qgcz1hd2FpdCB0aGlzLnNlbmRQb3N0UmVxdWVzdChuLGUse2JvZHk6dCxoZWFkZXJzOnJ9LG8pO3JldHVybiB0aGlzLmNvbmZpZy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyJiZzLnN0YXR1czw1MDAmJjQyOSE9PXMuc3RhdHVzJiZ0aGlzLmNvbmZpZy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyLmNsZWFyVGVsZW1ldHJ5Q2FjaGUoKSxzfWFzeW5jIHNlbmRQb3N0UmVxdWVzdChlLHQscixuKXtsZXQgbztpby5wcmVQcm9jZXNzKHRoaXMuY2FjaGVNYW5hZ2VyLGUsbik7dHJ5e289YXdhaXQgVW4odGhpcy5uZXR3b3JrQ2xpZW50LnNlbmRQb3N0UmVxdWVzdEFzeW5jLmJpbmQodGhpcy5uZXR3b3JrQ2xpZW50KSxPci5OZXR3b3JrQ2xpZW50U2VuZFBvc3RSZXF1ZXN0QXN5bmMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxuKSh0LHIpO2NvbnN0IGU9by5oZWFkZXJzfHx7fTt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRGaWVsZHMoe3JlZnJlc2hUb2tlblNpemU6by5ib2R5LnJlZnJlc2hfdG9rZW4/Lmxlbmd0aHx8MCxodHRwVmVyVG9rZW46ZVt3XXx8IiIscmVxdWVzdElkOmVbQ118fCIifSxuKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2Ygc28pe2NvbnN0IHQ9ZS5yZXNwb25zZUhlYWRlcnM7dGhyb3cgdCYmdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtodHRwVmVyVG9rZW46dFt3XXx8IiIscmVxdWVzdElkOnRbQ118fCIiLGNvbnRlbnRUeXBlSGVhZGVyOnRbdV18fHZvaWQgMCxjb250ZW50TGVuZ3RoSGVhZGVyOnRbZ118fHZvaWQgMCxodHRwU3RhdHVzOmUuaHR0cFN0YXR1c30sbiksZS5lcnJvcn10aHJvdyBlIGluc3RhbmNlb2YgQ2U/ZTptdChTZSl9cmV0dXJuIGlvLnBvc3RQcm9jZXNzKHRoaXMuY2FjaGVNYW5hZ2VyLGUsbyxuKSxvfWFzeW5jIHVwZGF0ZUF1dGhvcml0eShlLHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuVXBkYXRlVG9rZW5FbmRwb2ludEF1dGhvcml0eSx0KTtjb25zdCByPWBodHRwczovLyR7ZX0vJHt0aGlzLmF1dGhvcml0eS50ZW5hbnR9L2Asbj1hd2FpdCBybyhyLHRoaXMubmV0d29ya0NsaWVudCx0aGlzLmNhY2hlTWFuYWdlcix0aGlzLmF1dGhvcml0eS5vcHRpb25zLHRoaXMubG9nZ2VyLHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7dGhpcy5hdXRob3JpdHk9bn1jcmVhdGVUb2tlblF1ZXJ5UGFyYW1ldGVycyhlKXtjb25zdCB0PW5ldyBNYXA7cmV0dXJuIGUuZW1iZWRkZWRDbGllbnRJZCYmcW4odCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSksZS50b2tlblF1ZXJ5UGFyYW1ldGVycyYmRW4odCxlLnRva2VuUXVlcnlQYXJhbWV0ZXJzKSxmbih0LGUuY29ycmVsYXRpb25JZCksc24odCxlLmNvcnJlbGF0aW9uSWQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkseXIodCl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCBsbz0ibm9fdG9rZW5zX2ZvdW5kIixobz0ibmF0aXZlX2FjY291bnRfdW5hdmFpbGFibGUiLHVvPSJyZWZyZXNoX3Rva2VuX2V4cGlyZWQiLGdvPSJ1eF9ub3RfYWxsb3dlZCIscG89ImludGVyYWN0aW9uX3JlcXVpcmVkIixtbz0iY29uc2VudF9yZXF1aXJlZCIsZm89ImxvZ2luX3JlcXVpcmVkIix5bz0iYmFkX3Rva2VuIjt2YXIgQ289T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYmFkVG9rZW46eW8sY29uc2VudFJlcXVpcmVkOm1vLGludGVyYWN0aW9uUmVxdWlyZWQ6cG8sbG9naW5SZXF1aXJlZDpmbyxuYXRpdmVBY2NvdW50VW5hdmFpbGFibGU6aG8sbm9Ub2tlbnNGb3VuZDpsbyxyZWZyZXNoVG9rZW5FeHBpcmVkOnVvLHV4Tm90QWxsb3dlZDpnb30pOwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jb25zdCB3bz1bcG8sbW8sZm8seW8sZ29dLHZvPVsibWVzc2FnZV9vbmx5IiwiYWRkaXRpb25hbF9hY3Rpb24iLCJiYXNpY19hY3Rpb24iLCJ1c2VyX3Bhc3N3b3JkX2V4cGlyZWQiLCJjb25zZW50X3JlcXVpcmVkIiwiYmFkX3Rva2VuIl0sSW89e1tsb106Ik5vIHJlZnJlc2ggdG9rZW4gZm91bmQgaW4gdGhlIGNhY2hlLiBQbGVhc2Ugc2lnbi1pbi4iLFtob106IlRoZSByZXF1ZXN0ZWQgYWNjb3VudCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBuYXRpdmUgYnJva2VyLiBJdCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQgb3IgbG9nZ2VkIG91dC4gUGxlYXNlIHNpZ24taW4gYWdhaW4gdXNpbmcgYW4gaW50ZXJhY3RpdmUgQVBJLiIsW3VvXToiUmVmcmVzaCB0b2tlbiBoYXMgZXhwaXJlZC4iLFt5b106IklkZW50aXR5IHByb3ZpZGVyIHJldHVybmVkIGJhZF90b2tlbiBkdWUgdG8gYW4gZXhwaXJlZCBvciBpbnZhbGlkIHJlZnJlc2ggdG9rZW4uIFBsZWFzZSBpbnZva2UgYW4gaW50ZXJhY3RpdmUgQVBJIHRvIHJlc29sdmUuIixbZ29dOiJgY2FuU2hvd1VJYCBmbGFnIGluIEVkZ2Ugd2FzIHNldCB0byBmYWxzZS4gVXNlciBpbnRlcmFjdGlvbiByZXF1aXJlZCBvbiB3ZWIgcGFnZS4gUGxlYXNlIGludm9rZSBhbiBpbnRlcmFjdGl2ZSBBUEkgdG8gcmVzb2x2ZS4ifSxUbz17bm9Ub2tlbnNGb3VuZEVycm9yOntjb2RlOmxvLGRlc2M6SW9bbG9dfSxuYXRpdmVfYWNjb3VudF91bmF2YWlsYWJsZTp7Y29kZTpobyxkZXNjOklvW2hvXX0sYmFkX3Rva2VuOntjb2RlOnlvLGRlc2M6SW9beW9dfX07Y2xhc3MgQW8gZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHIsbixvLGkscyxhLGMpe3N1cGVyKGUscixuKSxPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxBby5wcm90b3R5cGUpLHRoaXMudGltZXN0YW1wPW98fHQuRU1QVFlfU1RSSU5HLHRoaXMudHJhY2VJZD1pfHx0LkVNUFRZX1NUUklORyx0aGlzLmNvcnJlbGF0aW9uSWQ9c3x8dC5FTVBUWV9TVFJJTkcsdGhpcy5jbGFpbXM9YXx8dC5FTVBUWV9TVFJJTkcsdGhpcy5uYW1lPSJJbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yIix0aGlzLmVycm9yTm89Y319ZnVuY3Rpb24ga28oZSx0LHIpe2NvbnN0IG49ISFlJiZ3by5pbmRleE9mKGUpPi0xLG89ISFyJiZ2by5pbmRleE9mKHIpPi0xLGk9ISF0JiZ3by5zb21lKChlPT50LmluZGV4T2YoZSk+LTEpKTtyZXR1cm4gbnx8aXx8b31mdW5jdGlvbiBTbyhlKXtyZXR1cm4gbmV3IEFvKGUsSW9bZV0pfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBib3tzdGF0aWMgc2V0UmVxdWVzdFN0YXRlKGUscixuKXtjb25zdCBvPWJvLmdlbmVyYXRlTGlicmFyeVN0YXRlKGUsbik7cmV0dXJuIHI/YCR7b30ke3QuUkVTT1VSQ0VfREVMSU19JHtyfWA6b31zdGF0aWMgZ2VuZXJhdGVMaWJyYXJ5U3RhdGUoZSx0KXtpZighZSl0aHJvdyBtdChXZSk7Y29uc3Qgcj17aWQ6ZS5jcmVhdGVOZXdHdWlkKCl9O3QmJihyLm1ldGE9dCk7Y29uc3Qgbj1KU09OLnN0cmluZ2lmeShyKTtyZXR1cm4gZS5iYXNlNjRFbmNvZGUobil9c3RhdGljIHBhcnNlUmVxdWVzdFN0YXRlKGUscil7aWYoIWUpdGhyb3cgbXQoV2UpO2lmKCFyKXRocm93IG10KFJlKTt0cnl7Y29uc3Qgbj1yLnNwbGl0KHQuUkVTT1VSQ0VfREVMSU0pLG89blswXSxpPW4ubGVuZ3RoPjE/bi5zbGljZSgxKS5qb2luKHQuUkVTT1VSQ0VfREVMSU0pOnQuRU1QVFlfU1RSSU5HLHM9ZS5iYXNlNjREZWNvZGUobyksYT1KU09OLnBhcnNlKHMpO3JldHVybnt1c2VyUmVxdWVzdFN0YXRlOml8fHQuRU1QVFlfU1RSSU5HLGxpYnJhcnlTdGF0ZTphfX1jYXRjaChlKXt0aHJvdyBtdChSZSl9fX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgRW89InN3IjtjbGFzcyBSb3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuY3J5cHRvVXRpbHM9ZSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXR9YXN5bmMgZ2VuZXJhdGVDbmYoZSx0KXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlBvcFRva2VuR2VuZXJhdGVDbmYsZS5jb3JyZWxhdGlvbklkKTtjb25zdCByPWF3YWl0IFVuKHRoaXMuZ2VuZXJhdGVLaWQuYmluZCh0aGlzKSxPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpLG49dGhpcy5jcnlwdG9VdGlscy5iYXNlNjRVcmxFbmNvZGUoSlNPTi5zdHJpbmdpZnkocikpO3JldHVybntraWQ6ci5raWQscmVxQ25mU3RyaW5nOm59fWFzeW5jIGdlbmVyYXRlS2lkKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUG9wVG9rZW5HZW5lcmF0ZUtpZCxlLmNvcnJlbGF0aW9uSWQpO3JldHVybntraWQ6YXdhaXQgdGhpcy5jcnlwdG9VdGlscy5nZXRQdWJsaWNLZXlUaHVtYnByaW50KGUpLHhtc19rc2w6RW99fWFzeW5jIHNpZ25Qb3BUb2tlbihlLHQscil7cmV0dXJuIHRoaXMuc2lnblBheWxvYWQoZSx0LHIpfWFzeW5jIHNpZ25QYXlsb2FkKGUsdCxyLG4pe2NvbnN0e3Jlc291cmNlUmVxdWVzdE1ldGhvZDpvLHJlc291cmNlUmVxdWVzdFVyaTppLHNockNsYWltczpzLHNock5vbmNlOmEsc2hyT3B0aW9uczpjfT1yLGw9aT9uZXcgd3IoaSk6dm9pZCAwLGg9bD8uZ2V0VXJsQ29tcG9uZW50cygpO3JldHVybiB0aGlzLmNyeXB0b1V0aWxzLnNpZ25Kd3Qoe2F0OmUsdHM6RG4oKSxtOm8/LnRvVXBwZXJDYXNlKCksdTpoPy5Ib3N0TmFtZUFuZFBvcnQsbm9uY2U6YXx8dGhpcy5jcnlwdG9VdGlscy5jcmVhdGVOZXdHdWlkKCkscDpoPy5BYnNvbHV0ZVBhdGgscTpoPy5RdWVyeVN0cmluZz9bW10saC5RdWVyeVN0cmluZ106dm9pZCAwLGNsaWVudF9jbGFpbXM6c3x8dm9pZCAwLC4uLm59LHQsYyxyLmNvcnJlbGF0aW9uSWQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY2xhc3MgX297Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNhY2hlPWUsdGhpcy5oYXNDaGFuZ2VkPXR9Z2V0IGNhY2hlSGFzQ2hhbmdlZCgpe3JldHVybiB0aGlzLmhhc0NoYW5nZWR9Z2V0IHRva2VuQ2FjaGUoKXtyZXR1cm4gdGhpcy5jYWNoZX19Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIFBve2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMpe3RoaXMuY2xpZW50SWQ9ZSx0aGlzLmNhY2hlU3RvcmFnZT10LHRoaXMuY3J5cHRvT2JqPXIsdGhpcy5sb2dnZXI9bix0aGlzLnNlcmlhbGl6YWJsZUNhY2hlPW8sdGhpcy5wZXJzaXN0ZW5jZVBsdWdpbj1pLHRoaXMucGVyZm9ybWFuY2VDbGllbnQ9c312YWxpZGF0ZVRva2VuUmVzcG9uc2UoZSxyKXtpZihlLmVycm9yfHxlLmVycm9yX2Rlc2NyaXB0aW9ufHxlLnN1YmVycm9yKXtjb25zdCBvPWBFcnJvcihzKTogJHtlLmVycm9yX2NvZGVzfHx0Lk5PVF9BVkFJTEFCTEV9IC0gVGltZXN0YW1wOiAke2UudGltZXN0YW1wfHx0Lk5PVF9BVkFJTEFCTEV9IC0gRGVzY3JpcHRpb246ICR7ZS5lcnJvcl9kZXNjcmlwdGlvbnx8dC5OT1RfQVZBSUxBQkxFfSAtIENvcnJlbGF0aW9uIElEOiAke2UuY29ycmVsYXRpb25faWR8fHQuTk9UX0FWQUlMQUJMRX0gLSBUcmFjZSBJRDogJHtlLnRyYWNlX2lkfHx0Lk5PVF9BVkFJTEFCTEV9YCxjPWUuZXJyb3JfY29kZXM/Lmxlbmd0aD9lLmVycm9yX2NvZGVzWzBdOnZvaWQgMCxsPW5ldyBubyhlLmVycm9yLG8sZS5zdWJlcnJvcixjLGUuc3RhdHVzKTtpZihyJiZlLnN0YXR1cyYmZS5zdGF0dXM+PXMmJmUuc3RhdHVzPD1hKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLndhcm5pbmcoYGV4ZWN1dGVUb2tlblJlcXVlc3Q6dmFsaWRhdGVUb2tlblJlc3BvbnNlIC0gQUFEIGlzIGN1cnJlbnRseSB1bmF2YWlsYWJsZSBhbmQgdGhlIGFjY2VzcyB0b2tlbiBpcyB1bmFibGUgdG8gYmUgcmVmcmVzaGVkLlxuJHtsfWApO2lmKHImJmUuc3RhdHVzJiZlLnN0YXR1cz49biYmZS5zdGF0dXM8PWkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIud2FybmluZyhgZXhlY3V0ZVRva2VuUmVxdWVzdDp2YWxpZGF0ZVRva2VuUmVzcG9uc2UgLSBBQUQgaXMgY3VycmVudGx5IGF2YWlsYWJsZSBidXQgaXMgdW5hYmxlIHRvIHJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbi5cbiR7bH1gKTtpZihrbyhlLmVycm9yLGUuZXJyb3JfZGVzY3JpcHRpb24sZS5zdWJlcnJvcikpdGhyb3cgbmV3IEFvKGUuZXJyb3IsZS5lcnJvcl9kZXNjcmlwdGlvbixlLnN1YmVycm9yLGUudGltZXN0YW1wfHx0LkVNUFRZX1NUUklORyxlLnRyYWNlX2lkfHx0LkVNUFRZX1NUUklORyxlLmNvcnJlbGF0aW9uX2lkfHx0LkVNUFRZX1NUUklORyxlLmNsYWltc3x8dC5FTVBUWV9TVFJJTkcsYyk7dGhyb3cgbH19YXN5bmMgaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZShlLHIsbixvLGkscyxhLGMsbCl7bGV0IGgsZDtpZih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsZS5jb3JyZWxhdGlvbl9pZCksZS5pZF90b2tlbil7aWYoaD1kcihlLmlkX3Rva2VufHx0LkVNUFRZX1NUUklORyx0aGlzLmNyeXB0b09iai5iYXNlNjREZWNvZGUpLGkmJmkubm9uY2UmJmgubm9uY2UhPT1pLm5vbmNlKXRocm93IG10KE1lKTtpZihvLm1heEFnZXx8MD09PW8ubWF4QWdlKXtjb25zdCBlPWguYXV0aF90aW1lO2lmKCFlKXRocm93IG10KE9lKTtncihlLG8ubWF4QWdlKX19dGhpcy5ob21lQWNjb3VudElkZW50aWZpZXI9aHIuZ2VuZXJhdGVIb21lQWNjb3VudElkKGUuY2xpZW50X2luZm98fHQuRU1QVFlfU1RSSU5HLHIuYXV0aG9yaXR5VHlwZSx0aGlzLmxvZ2dlcix0aGlzLmNyeXB0b09iaixoKSxpJiZpLnN0YXRlJiYoZD1iby5wYXJzZVJlcXVlc3RTdGF0ZSh0aGlzLmNyeXB0b09iaixpLnN0YXRlKSksZS5rZXlfaWQ9ZS5rZXlfaWR8fG8uc3NoS2lkfHx2b2lkIDA7Y29uc3QgdT10aGlzLmdlbmVyYXRlQ2FjaGVSZWNvcmQoZSxyLG4sbyxoLHMsaSk7bGV0IGc7dHJ5e2lmKHRoaXMucGVyc2lzdGVuY2VQbHVnaW4mJnRoaXMuc2VyaWFsaXphYmxlQ2FjaGUmJih0aGlzLmxvZ2dlci52ZXJib3NlKCJQZXJzaXN0ZW5jZSBlbmFibGVkLCBjYWxsaW5nIGJlZm9yZUNhY2hlQWNjZXNzIiksZz1uZXcgX28odGhpcy5zZXJpYWxpemFibGVDYWNoZSwhMCksYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZVBsdWdpbi5iZWZvcmVDYWNoZUFjY2VzcyhnKSksYSYmIWMmJnUuYWNjb3VudCl7Y29uc3QgZT10aGlzLmNhY2hlU3RvcmFnZS5nZW5lcmF0ZUFjY291bnRLZXkoaHIuZ2V0QWNjb3VudEluZm8odS5hY2NvdW50KSk7aWYoIXRoaXMuY2FjaGVTdG9yYWdlLmdldEFjY291bnQoZSxvLmNvcnJlbGF0aW9uSWQpKXJldHVybiB0aGlzLmxvZ2dlci53YXJuaW5nKCJBY2NvdW50IHVzZWQgdG8gcmVmcmVzaCB0b2tlbnMgbm90IGluIHBlcnNpc3RlbmNlLCByZWZyZXNoZWQgdG9rZW5zIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgY2FjaGUiKSxhd2FpdCBQby5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KHRoaXMuY3J5cHRvT2JqLHIsdSwhMSxvLGgsZCx2b2lkIDAsbCl9YXdhaXQgdGhpcy5jYWNoZVN0b3JhZ2Uuc2F2ZUNhY2hlUmVjb3JkKHUsby5jb3JyZWxhdGlvbklkLHVyKGh8fHt9KSxvLnN0b3JlSW5DYWNoZSl9ZmluYWxseXt0aGlzLnBlcnNpc3RlbmNlUGx1Z2luJiZ0aGlzLnNlcmlhbGl6YWJsZUNhY2hlJiZnJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiUGVyc2lzdGVuY2UgZW5hYmxlZCwgY2FsbGluZyBhZnRlckNhY2hlQWNjZXNzIiksYXdhaXQgdGhpcy5wZXJzaXN0ZW5jZVBsdWdpbi5hZnRlckNhY2hlQWNjZXNzKGcpKX1yZXR1cm4gUG8uZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdCh0aGlzLmNyeXB0b09iaixyLHUsITEsbyxoLGQsZSxsKX1nZW5lcmF0ZUNhY2hlUmVjb3JkKGUsdCxyLG4sbyxpLHMpe2NvbnN0IGE9dC5nZXRQcmVmZXJyZWRDYWNoZSgpO2lmKCFhKXRocm93IG10KFFlKTtjb25zdCBjPWNyKG8pO2xldCBsLGg7ZS5pZF90b2tlbiYmbyYmKGw9S24odGhpcy5ob21lQWNjb3VudElkZW50aWZpZXIsYSxlLmlkX3Rva2VuLHRoaXMuY2xpZW50SWQsY3x8IiIpLGg9TW8odGhpcy5jYWNoZVN0b3JhZ2UsdCx0aGlzLmhvbWVBY2NvdW50SWRlbnRpZmllcix0aGlzLmNyeXB0b09iai5iYXNlNjREZWNvZGUsbi5jb3JyZWxhdGlvbklkLG8sZS5jbGllbnRfaW5mbyxhLGMscyx2b2lkIDAsdGhpcy5sb2dnZXIpKTtsZXQgZD1udWxsO2lmKGUuYWNjZXNzX3Rva2VuKXtjb25zdCBvPWUuc2NvcGU/WHQuZnJvbVN0cmluZyhlLnNjb3BlKTpuZXcgWHQobi5zY29wZXN8fFtdKSxzPSgic3RyaW5nIj09dHlwZW9mIGUuZXhwaXJlc19pbj9wYXJzZUludChlLmV4cGlyZXNfaW4sMTApOmUuZXhwaXJlc19pbil8fDAsbD0oInN0cmluZyI9PXR5cGVvZiBlLmV4dF9leHBpcmVzX2luP3BhcnNlSW50KGUuZXh0X2V4cGlyZXNfaW4sMTApOmUuZXh0X2V4cGlyZXNfaW4pfHwwLGg9KCJzdHJpbmciPT10eXBlb2YgZS5yZWZyZXNoX2luP3BhcnNlSW50KGUucmVmcmVzaF9pbiwxMCk6ZS5yZWZyZXNoX2luKXx8dm9pZCAwLHU9citzLGc9dStsLHA9aCYmaD4wP3IraDp2b2lkIDA7ZD1Hbih0aGlzLmhvbWVBY2NvdW50SWRlbnRpZmllcixhLGUuYWNjZXNzX3Rva2VuLHRoaXMuY2xpZW50SWQsY3x8dC50ZW5hbnR8fCIiLG8ucHJpbnRTY29wZXMoKSx1LGcsdGhpcy5jcnlwdG9PYmouYmFzZTY0RGVjb2RlLHAsZS50b2tlbl90eXBlLGksZS5rZXlfaWQsbi5jbGFpbXMsbi5yZXF1ZXN0ZWRDbGFpbXNIYXNoKX1sZXQgdT1udWxsO2lmKGUucmVmcmVzaF90b2tlbil7bGV0IHQ7aWYoZS5yZWZyZXNoX3Rva2VuX2V4cGlyZXNfaW4pe3Q9cisoInN0cmluZyI9PXR5cGVvZiBlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbj9wYXJzZUludChlLnJlZnJlc2hfdG9rZW5fZXhwaXJlc19pbiwxMCk6ZS5yZWZyZXNoX3Rva2VuX2V4cGlyZXNfaW4pfXU9JG4odGhpcy5ob21lQWNjb3VudElkZW50aWZpZXIsYSxlLnJlZnJlc2hfdG9rZW4sdGhpcy5jbGllbnRJZCxlLmZvY2ksaSx0KX1sZXQgZz1udWxsO3JldHVybiBlLmZvY2kmJihnPXtjbGllbnRJZDp0aGlzLmNsaWVudElkLGVudmlyb25tZW50OmEsZmFtaWx5SWQ6ZS5mb2NpfSkse2FjY291bnQ6aCxpZFRva2VuOmwsYWNjZXNzVG9rZW46ZCxyZWZyZXNoVG9rZW46dSxhcHBNZXRhZGF0YTpnfX1zdGF0aWMgYXN5bmMgZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdChlLHIsbixvLGkscyxhLGMsbCl7bGV0IGgsZCx1PXQuRU1QVFlfU1RSSU5HLGc9W10scD1udWxsLG09dC5FTVBUWV9TVFJJTkc7aWYobi5hY2Nlc3NUb2tlbil7aWYobi5hY2Nlc3NUb2tlbi50b2tlblR5cGUhPT1XLlBPUHx8aS5wb3BLaWQpdT1uLmFjY2Vzc1Rva2VuLnNlY3JldDtlbHNle2NvbnN0IHQ9bmV3IFJvKGUpLHtzZWNyZXQ6cixrZXlJZDpvfT1uLmFjY2Vzc1Rva2VuO2lmKCFvKXRocm93IG10KG90KTt1PWF3YWl0IHQuc2lnblBvcFRva2VuKHIsbyxpKX1nPVh0LmZyb21TdHJpbmcobi5hY2Nlc3NUb2tlbi50YXJnZXQpLmFzQXJyYXkoKSxwPXhuKG4uYWNjZXNzVG9rZW4uZXhwaXJlc09uKSxoPXhuKG4uYWNjZXNzVG9rZW4uZXh0ZW5kZWRFeHBpcmVzT24pLG4uYWNjZXNzVG9rZW4ucmVmcmVzaE9uJiYoZD14bihuLmFjY2Vzc1Rva2VuLnJlZnJlc2hPbikpfW4uYXBwTWV0YWRhdGEmJihtPW4uYXBwTWV0YWRhdGEuZmFtaWx5SWQ9PT1CP0I6IiIpO2NvbnN0IGY9cz8ub2lkfHxzPy5zdWJ8fCIiLHk9cz8udGlkfHwiIjtjPy5zcGFfYWNjb3VudGlkJiZuLmFjY291bnQmJihuLmFjY291bnQubmF0aXZlQWNjb3VudElkPWM/LnNwYV9hY2NvdW50aWQpO2NvbnN0IEM9bi5hY2NvdW50P25yKGhyLmdldEFjY291bnRJbmZvKG4uYWNjb3VudCksdm9pZCAwLHMsbi5pZFRva2VuPy5zZWNyZXQpOm51bGw7cmV0dXJue2F1dGhvcml0eTpyLmNhbm9uaWNhbEF1dGhvcml0eSx1bmlxdWVJZDpmLHRlbmFudElkOnksc2NvcGVzOmcsYWNjb3VudDpDLGlkVG9rZW46bj8uaWRUb2tlbj8uc2VjcmV0fHwiIixpZFRva2VuQ2xhaW1zOnN8fHt9LGFjY2Vzc1Rva2VuOnUsZnJvbUNhY2hlOm8sZXhwaXJlc09uOnAsZXh0RXhwaXJlc09uOmgscmVmcmVzaE9uOmQsY29ycmVsYXRpb25JZDppLmNvcnJlbGF0aW9uSWQscmVxdWVzdElkOmx8fHQuRU1QVFlfU1RSSU5HLGZhbWlseUlkOm0sdG9rZW5UeXBlOm4uYWNjZXNzVG9rZW4/LnRva2VuVHlwZXx8dC5FTVBUWV9TVFJJTkcsc3RhdGU6YT9hLnVzZXJSZXF1ZXN0U3RhdGU6dC5FTVBUWV9TVFJJTkcsY2xvdWRHcmFwaEhvc3ROYW1lOm4uYWNjb3VudD8uY2xvdWRHcmFwaEhvc3ROYW1lfHx0LkVNUFRZX1NUUklORyxtc0dyYXBoSG9zdDpuLmFjY291bnQ/Lm1zR3JhcGhIb3N0fHx0LkVNUFRZX1NUUklORyxjb2RlOmM/LnNwYV9jb2RlLGZyb21OYXRpdmVCcm9rZXI6ITF9fX1mdW5jdGlvbiBNbyhlLHQscixuLG8saSxzLGEsYyxsLGgsZCl7ZD8udmVyYm9zZSgic2V0Q2FjaGVkQWNjb3VudCBjYWxsZWQiKTtjb25zdCB1PWUuZ2V0QWNjb3VudEtleXMoKS5maW5kKChlPT5lLnN0YXJ0c1dpdGgocikpKTtsZXQgZz1udWxsO3UmJihnPWUuZ2V0QWNjb3VudCh1LG8pKTtjb25zdCBwPWd8fGhyLmNyZWF0ZUFjY291bnQoe2hvbWVBY2NvdW50SWQ6cixpZFRva2VuQ2xhaW1zOmksY2xpZW50SW5mbzpzLGVudmlyb25tZW50OmEsY2xvdWRHcmFwaEhvc3ROYW1lOmw/LmNsb3VkX2dyYXBoX2hvc3RfbmFtZSxtc0dyYXBoSG9zdDpsPy5tc2dyYXBoX2hvc3QsbmF0aXZlQWNjb3VudElkOmh9LHQsbiksbT1wLnRlbmFudFByb2ZpbGVzfHxbXSxmPWN8fHAucmVhbG07aWYoZiYmIW0uZmluZCgoZT0+ZS50ZW5hbnRJZD09PWYpKSl7Y29uc3QgZT1ycihyLHAubG9jYWxBY2NvdW50SWQsZixpKTttLnB1c2goZSl9cmV0dXJuIHAudGVuYW50UHJvZmlsZXM9bSxwfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9hc3luYyBmdW5jdGlvbiBPbyhlLHQscil7aWYoInN0cmluZyI9PXR5cGVvZiBlKXJldHVybiBlO3JldHVybiBlKHtjbGllbnRJZDp0LHRva2VuRW5kcG9pbnQ6cn0pfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBxbyBleHRlbmRzIGNve2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KSx0aGlzLmluY2x1ZGVSZWRpcmVjdFVyaT0hMCx0aGlzLm9pZGNEZWZhdWx0U2NvcGVzPXRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmF1dGhvcml0eS5vcHRpb25zLk9JRENPcHRpb25zPy5kZWZhdWx0U2NvcGVzfWFzeW5jIGFjcXVpcmVUb2tlbihlLHQpe2lmKHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aENsaWVudEFjcXVpcmVUb2tlbixlLmNvcnJlbGF0aW9uSWQpLCFlLmNvZGUpdGhyb3cgbXQoRGUpO2NvbnN0IHI9RG4oKSxuPWF3YWl0IFVuKHRoaXMuZXhlY3V0ZVRva2VuUmVxdWVzdC5iaW5kKHRoaXMpLE9yLkF1dGhDbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKSh0aGlzLmF1dGhvcml0eSxlKSxvPW4uaGVhZGVycz8uW0NdLGk9bmV3IFBvKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLHRoaXMuY2FjaGVNYW5hZ2VyLHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5sb2dnZXIsdGhpcy5jb25maWcuc2VyaWFsaXphYmxlQ2FjaGUsdGhpcy5jb25maWcucGVyc2lzdGVuY2VQbHVnaW4sdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7cmV0dXJuIGkudmFsaWRhdGVUb2tlblJlc3BvbnNlKG4uYm9keSksVW4oaS5oYW5kbGVTZXJ2ZXJUb2tlblJlc3BvbnNlLmJpbmQoaSksT3IuSGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkobi5ib2R5LHRoaXMuYXV0aG9yaXR5LHIsZSx0LHZvaWQgMCx2b2lkIDAsdm9pZCAwLG8pfWdldExvZ291dFVyaShlKXtpZighZSl0aHJvdyBKdChQdCk7Y29uc3QgdD10aGlzLmNyZWF0ZUxvZ291dFVybFF1ZXJ5U3RyaW5nKGUpO3JldHVybiB3ci5hcHBlbmRRdWVyeVN0cmluZyh0aGlzLmF1dGhvcml0eS5lbmRTZXNzaW9uRW5kcG9pbnQsdCl9YXN5bmMgZXhlY3V0ZVRva2VuUmVxdWVzdChlLHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQXV0aENsaWVudEV4ZWN1dGVUb2tlblJlcXVlc3QsdC5jb3JyZWxhdGlvbklkKTtjb25zdCByPXRoaXMuY3JlYXRlVG9rZW5RdWVyeVBhcmFtZXRlcnModCksbj13ci5hcHBlbmRRdWVyeVN0cmluZyhlLnRva2VuRW5kcG9pbnQsciksbz1hd2FpdCBVbih0aGlzLmNyZWF0ZVRva2VuUmVxdWVzdEJvZHkuYmluZCh0aGlzKSxPci5BdXRoQ2xpZW50Q3JlYXRlVG9rZW5SZXF1ZXN0Qm9keSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkodCk7bGV0IGk7aWYodC5jbGllbnRJbmZvKXRyeXtjb25zdCBlPVp0KHQuY2xpZW50SW5mbyx0aGlzLmNyeXB0b1V0aWxzLmJhc2U2NERlY29kZSk7aT17Y3JlZGVudGlhbDpgJHtlLnVpZH0ke0R9JHtlLnV0aWR9YCx0eXBlOldyfX1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJDb3VsZCBub3QgcGFyc2UgY2xpZW50IGluZm8gZm9yIENDUyBIZWFkZXI6ICIrZSl9Y29uc3Qgcz10aGlzLmNyZWF0ZVRva2VuUmVxdWVzdEhlYWRlcnMoaXx8dC5jY3NDcmVkZW50aWFsKSxhPW9vKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLHQpO3JldHVybiBVbih0aGlzLmV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50LmJpbmQodGhpcyksT3IuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkobixvLHMsYSx0LmNvcnJlbGF0aW9uSWQsT3IuQXV0aG9yaXphdGlvbkNvZGVDbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCl9YXN5bmMgY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keShlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkF1dGhDbGllbnRDcmVhdGVUb2tlblJlcXVlc3RCb2R5LGUuY29ycmVsYXRpb25JZCk7Y29uc3QgdD1uZXcgTWFwO2lmKGxuKHQsZS5lbWJlZGRlZENsaWVudElkfHxlLnRva2VuQm9keVBhcmFtZXRlcnM/LltKcl18fHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkKSx0aGlzLmluY2x1ZGVSZWRpcmVjdFVyaSlobih0LGUucmVkaXJlY3RVcmkpO2Vsc2UgaWYoIWUucmVkaXJlY3RVcmkpdGhyb3cgSnQoVHQpO2lmKGNuKHQsZS5zY29wZXMsITAsdGhpcy5vaWRjRGVmYXVsdFNjb3BlcyksZnVuY3Rpb24oZSx0KXtlLnNldCgiY29kZSIsdCl9KHQsZS5jb2RlKSx5bih0LHRoaXMuY29uZmlnLmxpYnJhcnlJbmZvKSxDbih0LHRoaXMuY29uZmlnLnRlbGVtZXRyeS5hcHBsaWNhdGlvbiksT24odCksdGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyJiYhanIodGhpcy5jb25maWcpJiZNbih0LHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciksZS5jb2RlVmVyaWZpZXImJmZ1bmN0aW9uKGUsdCl7ZS5zZXQoImNvZGVfdmVyaWZpZXIiLHQpfSh0LGUuY29kZVZlcmlmaWVyKSx0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRTZWNyZXQmJkluKHQsdGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50U2VjcmV0KSx0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRBc3NlcnRpb24pe2NvbnN0IHI9dGhpcy5jb25maWcuY2xpZW50Q3JlZGVudGlhbHMuY2xpZW50QXNzZXJ0aW9uO1RuKHQsYXdhaXQgT28oci5hc3NlcnRpb24sdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQsZS5yZXNvdXJjZVJlcXVlc3RVcmkpKSxBbih0LHIuYXNzZXJ0aW9uVHlwZSl9aWYoa24odCxNKSxTbih0KSxlLmF1dGhlbnRpY2F0aW9uU2NoZW1lPT09Vy5QT1Ape2NvbnN0IHI9bmV3IFJvKHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7bGV0IG47aWYoZS5wb3BLaWQpbj10aGlzLmNyeXB0b1V0aWxzLmVuY29kZUtpZChlLnBvcEtpZCk7ZWxzZXtuPShhd2FpdCBVbihyLmdlbmVyYXRlQ25mLmJpbmQociksT3IuUG9wVG9rZW5HZW5lcmF0ZUNuZix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSx0aGlzLmxvZ2dlcikpLnJlcUNuZlN0cmluZ31fbih0LG4pfWVsc2UgaWYoZS5hdXRoZW50aWNhdGlvblNjaGVtZT09PVcuU1NIKXtpZighZS5zc2hKd2spdGhyb3cgSnQoTHQpO1BuKHQsZS5zc2hKd2spfWxldCByO2lmKCghWXQuaXNFbXB0eU9iaihlLmNsYWltcyl8fHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcyYmdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aD4wKSYmbW4odCxlLmNsYWltcyx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMpLGUuY2xpZW50SW5mbyl0cnl7Y29uc3QgdD1adChlLmNsaWVudEluZm8sdGhpcy5jcnlwdG9VdGlscy5iYXNlNjREZWNvZGUpO3I9e2NyZWRlbnRpYWw6YCR7dC51aWR9JHtEfSR7dC51dGlkfWAsdHlwZTpXcn19Y2F0Y2goZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiQ291bGQgbm90IHBhcnNlIGNsaWVudCBpbmZvIGZvciBDQ1MgSGVhZGVyOiAiK2UpfWVsc2Ugcj1lLmNjc0NyZWRlbnRpYWw7aWYodGhpcy5jb25maWcuc3lzdGVtT3B0aW9ucy5wcmV2ZW50Q29yc1ByZWZsaWdodCYmcilzd2l0Y2goci50eXBlKXtjYXNlIFdyOnRyeXtnbih0LGVyKHIuY3JlZGVudGlhbCkpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLnZlcmJvc2UoIkNvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXI6ICIrZSl9YnJlYWs7Y2FzZSBWcjp1bih0LHIuY3JlZGVudGlhbCl9cmV0dXJuIGUuZW1iZWRkZWRDbGllbnRJZCYmcW4odCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSksZS50b2tlbkJvZHlQYXJhbWV0ZXJzJiZFbih0LGUudG9rZW5Cb2R5UGFyYW1ldGVycyksIWUuZW5hYmxlU3BhQXV0aG9yaXphdGlvbkNvZGV8fGUudG9rZW5Cb2R5UGFyYW1ldGVycyYmZS50b2tlbkJvZHlQYXJhbWV0ZXJzW2VuXXx8RW4odCx7W2VuXToiMSJ9KSxzbih0LGUuY29ycmVsYXRpb25JZCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSx5cih0KX1jcmVhdGVMb2dvdXRVcmxRdWVyeVN0cmluZyhlKXtjb25zdCB0PW5ldyBNYXA7cmV0dXJuIGUucG9zdExvZ291dFJlZGlyZWN0VXJpJiZmdW5jdGlvbihlLHQpe2Uuc2V0KCJwb3N0X2xvZ291dF9yZWRpcmVjdF91cmkiLHQpfSh0LGUucG9zdExvZ291dFJlZGlyZWN0VXJpKSxlLmNvcnJlbGF0aW9uSWQmJmZuKHQsZS5jb3JyZWxhdGlvbklkKSxlLmlkVG9rZW5IaW50JiZmdW5jdGlvbihlLHQpe2Uuc2V0KCJpZF90b2tlbl9oaW50Iix0KX0odCxlLmlkVG9rZW5IaW50KSxlLnN0YXRlJiZ3bih0LGUuc3RhdGUpLGUubG9nb3V0SGludCYmZnVuY3Rpb24oZSx0KXtlLnNldCgibG9nb3V0X2hpbnQiLHQpfSh0LGUubG9nb3V0SGludCksZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyYmRW4odCxlLmV4dHJhUXVlcnlQYXJhbWV0ZXJzKSx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5pbnN0YW5jZUF3YXJlJiZibih0KSx5cih0LHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmVuY29kZUV4dHJhUXVlcnlQYXJhbXMsZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBObyBleHRlbmRzIGNve2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KX1hc3luYyBhY3F1aXJlVG9rZW4oZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5SZWZyZXNoVG9rZW5DbGllbnRBY3F1aXJlVG9rZW4sZS5jb3JyZWxhdGlvbklkKTtjb25zdCB0PURuKCkscj1hd2FpdCBVbih0aGlzLmV4ZWN1dGVUb2tlblJlcXVlc3QuYmluZCh0aGlzKSxPci5SZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlVG9rZW5SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShlLHRoaXMuYXV0aG9yaXR5KSxuPXIuaGVhZGVycz8uW0NdLG89bmV3IFBvKHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudElkLHRoaXMuY2FjaGVNYW5hZ2VyLHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5sb2dnZXIsdGhpcy5jb25maWcuc2VyaWFsaXphYmxlQ2FjaGUsdGhpcy5jb25maWcucGVyc2lzdGVuY2VQbHVnaW4pO3JldHVybiBvLnZhbGlkYXRlVG9rZW5SZXNwb25zZShyLmJvZHkpLFVuKG8uaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZS5iaW5kKG8pLE9yLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKHIuYm9keSx0aGlzLmF1dGhvcml0eSx0LGUsdm9pZCAwLHZvaWQgMCwhMCxlLmZvcmNlQ2FjaGUsbil9YXN5bmMgYWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4oZSl7aWYoIWUpdGhyb3cgSnQoX3QpO2lmKHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sZS5jb3JyZWxhdGlvbklkKSwhZS5hY2NvdW50KXRocm93IG10KEdlKTtpZih0aGlzLmNhY2hlTWFuYWdlci5pc0FwcE1ldGFkYXRhRk9DSShlLmFjY291bnQuZW52aXJvbm1lbnQpKXRyeXtyZXR1cm4gYXdhaXQgVW4odGhpcy5hY3F1aXJlVG9rZW5XaXRoQ2FjaGVkUmVmcmVzaFRva2VuLmJpbmQodGhpcyksT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSwhMCl9Y2F0Y2godCl7Y29uc3Qgcj10IGluc3RhbmNlb2YgQW8mJnQuZXJyb3JDb2RlPT09bG8sbj10IGluc3RhbmNlb2Ygbm8mJnQuZXJyb3JDb2RlPT09WiYmdC5zdWJFcnJvcj09PWVlO2lmKHJ8fG4pcmV0dXJuIFVuKHRoaXMuYWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUsITEpO3Rocm93IHR9cmV0dXJuIFVuKHRoaXMuYWNxdWlyZVRva2VuV2l0aENhY2hlZFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUsITEpfWFzeW5jIGFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4oZSx0KXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbldpdGhDYWNoZWRSZWZyZXNoVG9rZW4sZS5jb3JyZWxhdGlvbklkKTtjb25zdCByPU5uKHRoaXMuY2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbi5iaW5kKHRoaXMuY2FjaGVNYW5hZ2VyKSxPci5DYWNoZU1hbmFnZXJHZXRSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUuYWNjb3VudCx0LGUuY29ycmVsYXRpb25JZCx2b2lkIDAsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7aWYoIXIpdGhyb3cgU28obG8pO2lmKHIuZXhwaXJlc09uJiZCbihyLmV4cGlyZXNPbixlLnJlZnJlc2hUb2tlbkV4cGlyYXRpb25PZmZzZXRTZWNvbmRzfHwzMDApKXRocm93IHRoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZEZpZWxkcyh7cnRFeHBpcmVzT25NczpOdW1iZXIoci5leHBpcmVzT24pfSxlLmNvcnJlbGF0aW9uSWQpLFNvKHVvKTtjb25zdCBuPXsuLi5lLHJlZnJlc2hUb2tlbjpyLnNlY3JldCxhdXRoZW50aWNhdGlvblNjaGVtZTplLmF1dGhlbnRpY2F0aW9uU2NoZW1lfHxXLkJFQVJFUixjY3NDcmVkZW50aWFsOntjcmVkZW50aWFsOmUuYWNjb3VudC5ob21lQWNjb3VudElkLHR5cGU6V3J9fTt0cnl7cmV0dXJuIGF3YWl0IFVuKHRoaXMuYWNxdWlyZVRva2VuLmJpbmQodGhpcyksT3IuUmVmcmVzaFRva2VuQ2xpZW50QWNxdWlyZVRva2VuLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShuKX1jYXRjaCh0KXtpZih0IGluc3RhbmNlb2YgQW8mJih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRGaWVsZHMoe3J0RXhwaXJlc09uTXM6TnVtYmVyKHIuZXhwaXJlc09uKX0sZS5jb3JyZWxhdGlvbklkKSx0LnN1YkVycm9yPT09eW8pKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5XaXRoUmVmcmVzaFRva2VuOiBiYWQgcmVmcmVzaCB0b2tlbiwgcmVtb3ZpbmcgZnJvbSBjYWNoZSIpO2NvbnN0IHQ9dGhpcy5jYWNoZU1hbmFnZXIuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KHIpO3RoaXMuY2FjaGVNYW5hZ2VyLnJlbW92ZVJlZnJlc2hUb2tlbih0LGUuY29ycmVsYXRpb25JZCl9dGhyb3cgdH19YXN5bmMgZXhlY3V0ZVRva2VuUmVxdWVzdChlLHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQ/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuUmVmcmVzaFRva2VuQ2xpZW50RXhlY3V0ZVRva2VuUmVxdWVzdCxlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHI9dGhpcy5jcmVhdGVUb2tlblF1ZXJ5UGFyYW1ldGVycyhlKSxuPXdyLmFwcGVuZFF1ZXJ5U3RyaW5nKHQudG9rZW5FbmRwb2ludCxyKSxvPWF3YWl0IFVuKHRoaXMuY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keS5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpLGk9dGhpcy5jcmVhdGVUb2tlblJlcXVlc3RIZWFkZXJzKGUuY2NzQ3JlZGVudGlhbCkscz1vbyh0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxlKTtyZXR1cm4gVW4odGhpcy5leGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludC5iaW5kKHRoaXMpLE9yLlJlZnJlc2hUb2tlbkNsaWVudEV4ZWN1dGVQb3N0VG9Ub2tlbkVuZHBvaW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShuLG8saSxzLGUuY29ycmVsYXRpb25JZCxPci5SZWZyZXNoVG9rZW5DbGllbnRFeGVjdXRlUG9zdFRvVG9rZW5FbmRwb2ludCl9YXN5bmMgY3JlYXRlVG9rZW5SZXF1ZXN0Qm9keShlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlJlZnJlc2hUb2tlbkNsaWVudENyZWF0ZVRva2VuUmVxdWVzdEJvZHksZS5jb3JyZWxhdGlvbklkKTtjb25zdCB0PW5ldyBNYXA7aWYobG4odCxlLmVtYmVkZGVkQ2xpZW50SWR8fGUudG9rZW5Cb2R5UGFyYW1ldGVycz8uW0pyXXx8dGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50SWQpLGUucmVkaXJlY3RVcmkmJmhuKHQsZS5yZWRpcmVjdFVyaSksY24odCxlLnNjb3BlcywhMCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5hdXRob3JpdHkub3B0aW9ucy5PSURDT3B0aW9ucz8uZGVmYXVsdFNjb3Blcyksa24odCxPKSxTbih0KSx5bih0LHRoaXMuY29uZmlnLmxpYnJhcnlJbmZvKSxDbih0LHRoaXMuY29uZmlnLnRlbGVtZXRyeS5hcHBsaWNhdGlvbiksT24odCksdGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyJiYhanIodGhpcy5jb25maWcpJiZNbih0LHRoaXMuc2VydmVyVGVsZW1ldHJ5TWFuYWdlciksZnVuY3Rpb24oZSx0KXtlLnNldCgicmVmcmVzaF90b2tlbiIsdCl9KHQsZS5yZWZyZXNoVG9rZW4pLHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudFNlY3JldCYmSW4odCx0aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRTZWNyZXQpLHRoaXMuY29uZmlnLmNsaWVudENyZWRlbnRpYWxzLmNsaWVudEFzc2VydGlvbil7Y29uc3Qgcj10aGlzLmNvbmZpZy5jbGllbnRDcmVkZW50aWFscy5jbGllbnRBc3NlcnRpb247VG4odCxhd2FpdCBPbyhyLmFzc2VydGlvbix0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCxlLnJlc291cmNlUmVxdWVzdFVyaSkpLEFuKHQsci5hc3NlcnRpb25UeXBlKX1pZihlLmF1dGhlbnRpY2F0aW9uU2NoZW1lPT09Vy5QT1Ape2NvbnN0IHI9bmV3IFJvKHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7bGV0IG47aWYoZS5wb3BLaWQpbj10aGlzLmNyeXB0b1V0aWxzLmVuY29kZUtpZChlLnBvcEtpZCk7ZWxzZXtuPShhd2FpdCBVbihyLmdlbmVyYXRlQ25mLmJpbmQociksT3IuUG9wVG9rZW5HZW5lcmF0ZUNuZix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSx0aGlzLmxvZ2dlcikpLnJlcUNuZlN0cmluZ31fbih0LG4pfWVsc2UgaWYoZS5hdXRoZW50aWNhdGlvblNjaGVtZT09PVcuU1NIKXtpZighZS5zc2hKd2spdGhyb3cgSnQoTHQpO1BuKHQsZS5zc2hKd2spfWlmKCghWXQuaXNFbXB0eU9iaihlLmNsYWltcyl8fHRoaXMuY29uZmlnLmF1dGhPcHRpb25zLmNsaWVudENhcGFiaWxpdGllcyYmdGhpcy5jb25maWcuYXV0aE9wdGlvbnMuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aD4wKSYmbW4odCxlLmNsYWltcyx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRDYXBhYmlsaXRpZXMpLHRoaXMuY29uZmlnLnN5c3RlbU9wdGlvbnMucHJldmVudENvcnNQcmVmbGlnaHQmJmUuY2NzQ3JlZGVudGlhbClzd2l0Y2goZS5jY3NDcmVkZW50aWFsLnR5cGUpe2Nhc2UgV3I6dHJ5e2duKHQsZXIoZS5jY3NDcmVkZW50aWFsLmNyZWRlbnRpYWwpKX1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJDb3VsZCBub3QgcGFyc2UgaG9tZSBhY2NvdW50IElEIGZvciBDQ1MgSGVhZGVyOiAiK2UpfWJyZWFrO2Nhc2UgVnI6dW4odCxlLmNjc0NyZWRlbnRpYWwuY3JlZGVudGlhbCl9cmV0dXJuIGUuZW1iZWRkZWRDbGllbnRJZCYmcW4odCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5jbGllbnRJZCx0aGlzLmNvbmZpZy5hdXRoT3B0aW9ucy5yZWRpcmVjdFVyaSksZS50b2tlbkJvZHlQYXJhbWV0ZXJzJiZFbih0LGUudG9rZW5Cb2R5UGFyYW1ldGVycyksc24odCxlLmNvcnJlbGF0aW9uSWQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkseXIodCl9fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9jbGFzcyBVbyBleHRlbmRzIGNve2NvbnN0cnVjdG9yKGUsdCl7c3VwZXIoZSx0KX1hc3luYyBhY3F1aXJlQ2FjaGVkVG9rZW4oZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRGbG93Q2xpZW50QWNxdWlyZUNhY2hlZFRva2VuLGUuY29ycmVsYXRpb25JZCk7bGV0IHQ9YWU7aWYoZS5mb3JjZVJlZnJlc2h8fCF0aGlzLmNvbmZpZy5jYWNoZU9wdGlvbnMuY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZCYmIVl0LmlzRW1wdHlPYmooZS5jbGFpbXMpKXRocm93IHRoaXMuc2V0Q2FjaGVPdXRjb21lKGNlLGUuY29ycmVsYXRpb25JZCksbXQoWGUpO2lmKCFlLmFjY291bnQpdGhyb3cgbXQoR2UpO2NvbnN0IHI9ZS5hY2NvdW50LnRlbmFudElkfHxmdW5jdGlvbihlKXtjb25zdCB0PW5ldyB3cihlKS5nZXRVcmxDb21wb25lbnRzKCkscj10LlBhdGhTZWdtZW50cy5zbGljZSgtMSlbMF0/LnRvTG93ZXJDYXNlKCk7c3dpdGNoKHIpe2Nhc2UgSTpjYXNlIFQ6Y2FzZSBBOnJldHVybjtkZWZhdWx0OnJldHVybiByfX0oZS5hdXRob3JpdHkpLG49dGhpcy5jYWNoZU1hbmFnZXIuZ2V0VG9rZW5LZXlzKCksbz10aGlzLmNhY2hlTWFuYWdlci5nZXRBY2Nlc3NUb2tlbihlLmFjY291bnQsZSxuLHIpO2lmKCFvKXRocm93IHRoaXMuc2V0Q2FjaGVPdXRjb21lKGxlLGUuY29ycmVsYXRpb25JZCksbXQoWGUpO2lmKHpuKG8uY2FjaGVkQXQpfHxCbihvLmV4cGlyZXNPbix0aGlzLmNvbmZpZy5zeXN0ZW1PcHRpb25zLnRva2VuUmVuZXdhbE9mZnNldFNlY29uZHMpKXRocm93IHRoaXMuc2V0Q2FjaGVPdXRjb21lKGhlLGUuY29ycmVsYXRpb25JZCksbXQoWGUpO28ucmVmcmVzaE9uJiZCbihvLnJlZnJlc2hPbiwwKSYmKHQ9ZGUpO2NvbnN0IGk9ZS5hdXRob3JpdHl8fHRoaXMuYXV0aG9yaXR5LmdldFByZWZlcnJlZENhY2hlKCkscz17YWNjb3VudDp0aGlzLmNhY2hlTWFuYWdlci5nZXRBY2NvdW50KHRoaXMuY2FjaGVNYW5hZ2VyLmdlbmVyYXRlQWNjb3VudEtleShlLmFjY291bnQpLGUuY29ycmVsYXRpb25JZCksYWNjZXNzVG9rZW46byxpZFRva2VuOnRoaXMuY2FjaGVNYW5hZ2VyLmdldElkVG9rZW4oZS5hY2NvdW50LGUuY29ycmVsYXRpb25JZCxuLHIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkscmVmcmVzaFRva2VuOm51bGwsYXBwTWV0YWRhdGE6dGhpcy5jYWNoZU1hbmFnZXIucmVhZEFwcE1ldGFkYXRhRnJvbUNhY2hlKGkpfTtyZXR1cm4gdGhpcy5zZXRDYWNoZU91dGNvbWUodCxlLmNvcnJlbGF0aW9uSWQpLHRoaXMuY29uZmlnLnNlcnZlclRlbGVtZXRyeU1hbmFnZXImJnRoaXMuY29uZmlnLnNlcnZlclRlbGVtZXRyeU1hbmFnZXIuaW5jcmVtZW50Q2FjaGVIaXRzKCksW2F3YWl0IFVuKHRoaXMuZ2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQuYmluZCh0aGlzKSxPci5TaWxlbnRGbG93Q2xpZW50R2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKHMsZSksdF19c2V0Q2FjaGVPdXRjb21lKGUsdCl7dGhpcy5zZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyPy5zZXRDYWNoZU91dGNvbWUoZSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uYWRkRmllbGRzKHtjYWNoZU91dGNvbWU6ZX0sdCksZSE9PWFlJiZ0aGlzLmxvZ2dlci5pbmZvKGBUb2tlbiByZWZyZXNoIGlzIHJlcXVpcmVkIGR1ZSB0byBjYWNoZSBvdXRjb21lOiAke2V9YCl9YXN5bmMgZ2VuZXJhdGVSZXN1bHRGcm9tQ2FjaGVSZWNvcmQoZSx0KXtsZXQgcjtpZih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlNpbGVudEZsb3dDbGllbnRHZW5lcmF0ZVJlc3VsdEZyb21DYWNoZVJlY29yZCx0LmNvcnJlbGF0aW9uSWQpLGUuaWRUb2tlbiYmKHI9ZHIoZS5pZFRva2VuLnNlY3JldCx0aGlzLmNvbmZpZy5jcnlwdG9JbnRlcmZhY2UuYmFzZTY0RGVjb2RlKSksdC5tYXhBZ2V8fDA9PT10Lm1heEFnZSl7Y29uc3QgZT1yPy5hdXRoX3RpbWU7aWYoIWUpdGhyb3cgbXQoT2UpO2dyKGUsdC5tYXhBZ2UpfXJldHVybiBQby5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KHRoaXMuY3J5cHRvVXRpbHMsdGhpcy5hdXRob3JpdHksZSwhMCx0LHIpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3QgTG89e3NlbmRHZXRSZXF1ZXN0QXN5bmM6KCk9PlByb21pc2UucmVqZWN0KG10KGN0KSksc2VuZFBvc3RSZXF1ZXN0QXN5bmM6KCk9PlByb21pc2UucmVqZWN0KG10KGN0KSl9OwovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi9mdW5jdGlvbiBEbyhlLHQscixuKXtjb25zdCBvPXQuY29ycmVsYXRpb25JZCxpPW5ldyBNYXA7bG4oaSx0LmVtYmVkZGVkQ2xpZW50SWR8fHQuZXh0cmFRdWVyeVBhcmFtZXRlcnM/LltKcl18fGUuY2xpZW50SWQpO2lmKGNuKGksWy4uLnQuc2NvcGVzfHxbXSwuLi50LmV4dHJhU2NvcGVzVG9Db25zZW50fHxbXV0sITAsZS5hdXRob3JpdHkub3B0aW9ucy5PSURDT3B0aW9ucz8uZGVmYXVsdFNjb3BlcyksaG4oaSx0LnJlZGlyZWN0VXJpKSxmbihpLG8pLGZ1bmN0aW9uKGUsdCl7ZS5zZXQoInJlc3BvbnNlX21vZGUiLHR8fFApfShpLHQucmVzcG9uc2VNb2RlKSxTbihpKSx0LnByb21wdCYmKCFmdW5jdGlvbihlLHQpe2Uuc2V0KCJwcm9tcHQiLHQpfShpLHQucHJvbXB0KSxuPy5hZGRGaWVsZHMoe3Byb21wdDp0LnByb21wdH0sbykpLHQuZG9tYWluSGludCYmKCFmdW5jdGlvbihlLHQpe2Uuc2V0KCJkb21haW5faGludCIsdCl9KGksdC5kb21haW5IaW50KSxuPy5hZGRGaWVsZHMoe2RvbWFpbkhpbnRGcm9tUmVxdWVzdDohMH0sbykpLHQucHJvbXB0IT09Yi5TRUxFQ1RfQUNDT1VOVClpZih0LnNpZCYmdC5wcm9tcHQ9PT1iLk5PTkUpci52ZXJib3NlKCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBQcm9tcHQgaXMgbm9uZSwgYWRkaW5nIHNpZCBmcm9tIHJlcXVlc3QiKSxwbihpLHQuc2lkKSxuPy5hZGRGaWVsZHMoe3NpZEZyb21SZXF1ZXN0OiEwfSxvKTtlbHNlIGlmKHQuYWNjb3VudCl7Y29uc3QgZT0ocz10LmFjY291bnQscy5pZFRva2VuQ2xhaW1zPy5zaWR8fG51bGwpO2xldCBhPWZ1bmN0aW9uKGUpe3JldHVybiBlLmxvZ2luSGludHx8ZS5pZFRva2VuQ2xhaW1zPy5sb2dpbl9oaW50fHxudWxsfQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8odC5hY2NvdW50KTtpZihhJiZ0LmRvbWFpbkhpbnQmJihyLndhcm5pbmcoJ0F1dGhvcml6YXRpb25Db2RlQ2xpZW50LmNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6ICJkb21haW5IaW50IiBwYXJhbSBpcyBzZXQsIHNraXBwaW5nIG9wYXF1ZSAibG9naW5faGludCIgY2xhaW0uIFBsZWFzZSBjb25zaWRlciBub3QgcGFzc2luZyBkb21haW5IaW50JyksYT1udWxsKSxhKXtyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IGxvZ2luX2hpbnQgY2xhaW0gcHJlc2VudCBvbiBhY2NvdW50IiksZG4oaSxhKSxuPy5hZGRGaWVsZHMoe2xvZ2luSGludEZyb21DbGFpbTohMH0sbyk7dHJ5e2duKGksZXIodC5hY2NvdW50LmhvbWVBY2NvdW50SWQpKX1jYXRjaChlKXtyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IENvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXIiKX19ZWxzZSBpZihlJiZ0LnByb21wdD09PWIuTk9ORSl7ci52ZXJib3NlKCJjcmVhdGVBdXRoQ29kZVVybFF1ZXJ5U3RyaW5nOiBQcm9tcHQgaXMgbm9uZSwgYWRkaW5nIHNpZCBmcm9tIGFjY291bnQiKSxwbihpLGUpLG4/LmFkZEZpZWxkcyh7c2lkRnJvbUNsYWltOiEwfSxvKTt0cnl7Z24oaSxlcih0LmFjY291bnQuaG9tZUFjY291bnRJZCkpfWNhdGNoKGUpe3IudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogQ291bGQgbm90IHBhcnNlIGhvbWUgYWNjb3VudCBJRCBmb3IgQ0NTIEhlYWRlciIpfX1lbHNlIGlmKHQubG9naW5IaW50KXIudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogQWRkaW5nIGxvZ2luX2hpbnQgZnJvbSByZXF1ZXN0IiksZG4oaSx0LmxvZ2luSGludCksdW4oaSx0LmxvZ2luSGludCksbj8uYWRkRmllbGRzKHtsb2dpbkhpbnRGcm9tUmVxdWVzdDohMH0sbyk7ZWxzZSBpZih0LmFjY291bnQudXNlcm5hbWUpe3IudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogQWRkaW5nIGxvZ2luX2hpbnQgZnJvbSBhY2NvdW50IiksZG4oaSx0LmFjY291bnQudXNlcm5hbWUpLG4/LmFkZEZpZWxkcyh7bG9naW5IaW50RnJvbVVwbjohMH0sbyk7dHJ5e2duKGksZXIodC5hY2NvdW50LmhvbWVBY2NvdW50SWQpKX1jYXRjaChlKXtyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IENvdWxkIG5vdCBwYXJzZSBob21lIGFjY291bnQgSUQgZm9yIENDUyBIZWFkZXIiKX19fWVsc2UgdC5sb2dpbkhpbnQmJihyLnZlcmJvc2UoImNyZWF0ZUF1dGhDb2RlVXJsUXVlcnlTdHJpbmc6IE5vIGFjY291bnQsIGFkZGluZyBsb2dpbl9oaW50IGZyb20gcmVxdWVzdCIpLGRuKGksdC5sb2dpbkhpbnQpLHVuKGksdC5sb2dpbkhpbnQpLG4/LmFkZEZpZWxkcyh7bG9naW5IaW50RnJvbVJlcXVlc3Q6ITB9LG8pKTtlbHNlIHIudmVyYm9zZSgiY3JlYXRlQXV0aENvZGVVcmxRdWVyeVN0cmluZzogUHJvbXB0IGlzIHNlbGVjdF9hY2NvdW50LCBpZ25vcmluZyBhY2NvdW50IGhpbnRzIik7dmFyIHM7cmV0dXJuIHQubm9uY2UmJmZ1bmN0aW9uKGUsdCl7ZS5zZXQoIm5vbmNlIix0KX0oaSx0Lm5vbmNlKSx0LnN0YXRlJiZ3bihpLHQuc3RhdGUpLCh0LmNsYWltc3x8ZS5jbGllbnRDYXBhYmlsaXRpZXMmJmUuY2xpZW50Q2FwYWJpbGl0aWVzLmxlbmd0aD4wKSYmbW4oaSx0LmNsYWltcyxlLmNsaWVudENhcGFiaWxpdGllcyksdC5lbWJlZGRlZENsaWVudElkJiZxbihpLGUuY2xpZW50SWQsZS5yZWRpcmVjdFVyaSksIWUuaW5zdGFuY2VBd2FyZXx8dC5leHRyYVF1ZXJ5UGFyYW1ldGVycyYmT2JqZWN0LmtleXModC5leHRyYVF1ZXJ5UGFyYW1ldGVycykuaW5jbHVkZXMob24pfHxibihpKSxpfWZ1bmN0aW9uIEhvKGUsdCxyLG4pe2NvbnN0IG89eXIodCxyLG4pO3JldHVybiB3ci5hcHBlbmRRdWVyeVN0cmluZyhlLmF1dGhvcml6YXRpb25FbmRwb2ludCxvKX1mdW5jdGlvbiB4byhlLHQpe2lmKCFlLnN0YXRlfHwhdCl0aHJvdyBlLnN0YXRlP210KFBlLCJDYWNoZWQgU3RhdGUiKTptdChQZSwiU2VydmVyIFN0YXRlIik7bGV0IHIsbjt0cnl7cj1kZWNvZGVVUklDb21wb25lbnQoZS5zdGF0ZSl9Y2F0Y2godCl7dGhyb3cgbXQoUmUsZS5zdGF0ZSl9dHJ5e249ZGVjb2RlVVJJQ29tcG9uZW50KHQpfWNhdGNoKHQpe3Rocm93IG10KFJlLGUuc3RhdGUpfWlmKHIhPT1uKXRocm93IG10KF9lKTtpZihlLmVycm9yfHxlLmVycm9yX2Rlc2NyaXB0aW9ufHxlLnN1YmVycm9yKXtjb25zdCB0PWZ1bmN0aW9uKGUpe2NvbnN0IHQ9ImNvZGU9IixyPWUuZXJyb3JfdXJpPy5sYXN0SW5kZXhPZih0KTtyZXR1cm4gciYmcj49MD9lLmVycm9yX3VyaT8uc3Vic3RyaW5nKHIrdC5sZW5ndGgpOnZvaWQgMH0oZSk7aWYoa28oZS5lcnJvcixlLmVycm9yX2Rlc2NyaXB0aW9uLGUuc3ViZXJyb3IpKXRocm93IG5ldyBBbyhlLmVycm9yfHwiIixlLmVycm9yX2Rlc2NyaXB0aW9uLGUuc3ViZXJyb3IsZS50aW1lc3RhbXB8fCIiLGUudHJhY2VfaWR8fCIiLGUuY29ycmVsYXRpb25faWR8fCIiLGUuY2xhaW1zfHwiIix0KTt0aHJvdyBuZXcgbm8oZS5lcnJvcnx8IiIsZS5lcnJvcl9kZXNjcmlwdGlvbixlLnN1YmVycm9yLHQpfX1mdW5jdGlvbiBCbyhlKXtjb25zdHtza3VzOnQsbGlicmFyeU5hbWU6cixsaWJyYXJ5VmVyc2lvbjpuLGV4dGVuc2lvbk5hbWU6byxleHRlbnNpb25WZXJzaW9uOml9PWUscz1uZXcgTWFwKFtbMCxbcixuXV0sWzIsW28saV1dXSk7bGV0IGE9W107aWYodD8ubGVuZ3RoKXtpZihhPXQuc3BsaXQoIiwiKSxhLmxlbmd0aDw0KXJldHVybiB0fWVsc2UgYT1BcnJheS5mcm9tKHtsZW5ndGg6NH0sKCgpPT4ifCIpKTtyZXR1cm4gcy5mb3JFYWNoKCgoZSx0KT0+ezI9PT1lLmxlbmd0aCYmZVswXT8ubGVuZ3RoJiZlWzFdPy5sZW5ndGgmJmZ1bmN0aW9uKGUpe2NvbnN0e3NrdUFycjp0LGluZGV4OnIsc2t1TmFtZTpuLHNrdVZlcnNpb246b309ZTtpZihyPj10Lmxlbmd0aClyZXR1cm47dFtyXT1bbixvXS5qb2luKCJ8Iil9KHtza3VBcnI6YSxpbmRleDp0LHNrdU5hbWU6ZVswXSxza3VWZXJzaW9uOmVbMV19KX0pKSxhLmpvaW4oIiwiKX1jbGFzcyBGb3tjb25zdHJ1Y3RvcihlLHIpe3RoaXMuY2FjaGVPdXRjb21lPWFlLHRoaXMuY2FjaGVNYW5hZ2VyPXIsdGhpcy5hcGlJZD1lLmFwaUlkLHRoaXMuY29ycmVsYXRpb25JZD1lLmNvcnJlbGF0aW9uSWQsdGhpcy53cmFwcGVyU0tVPWUud3JhcHBlclNLVXx8dC5FTVBUWV9TVFJJTkcsdGhpcy53cmFwcGVyVmVyPWUud3JhcHBlclZlcnx8dC5FTVBUWV9TVFJJTkcsdGhpcy50ZWxlbWV0cnlDYWNoZUtleT1qLkNBQ0hFX0tFWStMK2UuY2xpZW50SWR9Z2VuZXJhdGVDdXJyZW50UmVxdWVzdEhlYWRlclZhbHVlKCl7Y29uc3QgZT1gJHt0aGlzLmFwaUlkfSR7ai5WQUxVRV9TRVBBUkFUT1J9JHt0aGlzLmNhY2hlT3V0Y29tZX1gLHQ9W3RoaXMud3JhcHBlclNLVSx0aGlzLndyYXBwZXJWZXJdLHI9dGhpcy5nZXROYXRpdmVCcm9rZXJFcnJvckNvZGUoKTtyPy5sZW5ndGgmJnQucHVzaChgYnJva2VyX2Vycm9yPSR7cn1gKTtjb25zdCBuPXQuam9pbihqLlZBTFVFX1NFUEFSQVRPUiksbz1bZSx0aGlzLmdldFJlZ2lvbkRpc2NvdmVyeUZpZWxkcygpXS5qb2luKGouVkFMVUVfU0VQQVJBVE9SKTtyZXR1cm5bai5TQ0hFTUFfVkVSU0lPTixvLG5dLmpvaW4oai5DQVRFR09SWV9TRVBBUkFUT1IpfWdlbmVyYXRlTGFzdFJlcXVlc3RIZWFkZXJWYWx1ZSgpe2NvbnN0IGU9dGhpcy5nZXRMYXN0UmVxdWVzdHMoKSx0PUZvLm1heEVycm9yc1RvU2VuZChlKSxyPWUuZmFpbGVkUmVxdWVzdHMuc2xpY2UoMCwyKnQpLmpvaW4oai5WQUxVRV9TRVBBUkFUT1IpLG49ZS5lcnJvcnMuc2xpY2UoMCx0KS5qb2luKGouVkFMVUVfU0VQQVJBVE9SKSxvPWUuZXJyb3JzLmxlbmd0aCxpPVtvLHQ8bz9qLk9WRVJGTE9XX1RSVUU6ai5PVkVSRkxPV19GQUxTRV0uam9pbihqLlZBTFVFX1NFUEFSQVRPUik7cmV0dXJuW2ouU0NIRU1BX1ZFUlNJT04sZS5jYWNoZUhpdHMscixuLGldLmpvaW4oai5DQVRFR09SWV9TRVBBUkFUT1IpfWNhY2hlRmFpbGVkUmVxdWVzdChlKXtjb25zdCB0PXRoaXMuZ2V0TGFzdFJlcXVlc3RzKCk7dC5lcnJvcnMubGVuZ3RoPj1qLk1BWF9DQUNIRURfRVJST1JTJiYodC5mYWlsZWRSZXF1ZXN0cy5zaGlmdCgpLHQuZmFpbGVkUmVxdWVzdHMuc2hpZnQoKSx0LmVycm9ycy5zaGlmdCgpKSx0LmZhaWxlZFJlcXVlc3RzLnB1c2godGhpcy5hcGlJZCx0aGlzLmNvcnJlbGF0aW9uSWQpLGUgaW5zdGFuY2VvZiBFcnJvciYmZSYmZS50b1N0cmluZygpP2UgaW5zdGFuY2VvZiBDZT9lLnN1YkVycm9yP3QuZXJyb3JzLnB1c2goZS5zdWJFcnJvcik6ZS5lcnJvckNvZGU/dC5lcnJvcnMucHVzaChlLmVycm9yQ29kZSk6dC5lcnJvcnMucHVzaChlLnRvU3RyaW5nKCkpOnQuZXJyb3JzLnB1c2goZS50b1N0cmluZygpKTp0LmVycm9ycy5wdXNoKGouVU5LTk9XTl9FUlJPUiksdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksdCx0aGlzLmNvcnJlbGF0aW9uSWQpfWluY3JlbWVudENhY2hlSGl0cygpe2NvbnN0IGU9dGhpcy5nZXRMYXN0UmVxdWVzdHMoKTtyZXR1cm4gZS5jYWNoZUhpdHMrPTEsdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksZSx0aGlzLmNvcnJlbGF0aW9uSWQpLGUuY2FjaGVIaXRzfWdldExhc3RSZXF1ZXN0cygpe3JldHVybiB0aGlzLmNhY2hlTWFuYWdlci5nZXRTZXJ2ZXJUZWxlbWV0cnkodGhpcy50ZWxlbWV0cnlDYWNoZUtleSl8fHtmYWlsZWRSZXF1ZXN0czpbXSxlcnJvcnM6W10sY2FjaGVIaXRzOjB9fWNsZWFyVGVsZW1ldHJ5Q2FjaGUoKXtjb25zdCBlPXRoaXMuZ2V0TGFzdFJlcXVlc3RzKCksdD1Gby5tYXhFcnJvcnNUb1NlbmQoZSk7aWYodD09PWUuZXJyb3JzLmxlbmd0aCl0aGlzLmNhY2hlTWFuYWdlci5yZW1vdmVJdGVtKHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksdGhpcy5jb3JyZWxhdGlvbklkKTtlbHNle2NvbnN0IHI9e2ZhaWxlZFJlcXVlc3RzOmUuZmFpbGVkUmVxdWVzdHMuc2xpY2UoMip0KSxlcnJvcnM6ZS5lcnJvcnMuc2xpY2UodCksY2FjaGVIaXRzOjB9O3RoaXMuY2FjaGVNYW5hZ2VyLnNldFNlcnZlclRlbGVtZXRyeSh0aGlzLnRlbGVtZXRyeUNhY2hlS2V5LHIsdGhpcy5jb3JyZWxhdGlvbklkKX19c3RhdGljIG1heEVycm9yc1RvU2VuZChlKXtsZXQgcixuPTAsbz0wO2NvbnN0IGk9ZS5lcnJvcnMubGVuZ3RoO2ZvcihyPTA7cjxpO3IrKyl7Y29uc3QgaT1lLmZhaWxlZFJlcXVlc3RzWzIqcl18fHQuRU1QVFlfU1RSSU5HLHM9ZS5mYWlsZWRSZXF1ZXN0c1syKnIrMV18fHQuRU1QVFlfU1RSSU5HLGE9ZS5lcnJvcnNbcl18fHQuRU1QVFlfU1RSSU5HO2lmKG8rPWkudG9TdHJpbmcoKS5sZW5ndGgrcy50b1N0cmluZygpLmxlbmd0aCthLmxlbmd0aCszLCEobzxqLk1BWF9MQVNUX0hFQURFUl9CWVRFUykpYnJlYWs7bis9MX1yZXR1cm4gbn1nZXRSZWdpb25EaXNjb3ZlcnlGaWVsZHMoKXtjb25zdCBlPVtdO3JldHVybiBlLnB1c2godGhpcy5yZWdpb25Vc2VkfHx0LkVNUFRZX1NUUklORyksZS5wdXNoKHRoaXMucmVnaW9uU291cmNlfHx0LkVNUFRZX1NUUklORyksZS5wdXNoKHRoaXMucmVnaW9uT3V0Y29tZXx8dC5FTVBUWV9TVFJJTkcpLGUuam9pbigiLCIpfXVwZGF0ZVJlZ2lvbkRpc2NvdmVyeU1ldGFkYXRhKGUpe3RoaXMucmVnaW9uVXNlZD1lLnJlZ2lvbl91c2VkLHRoaXMucmVnaW9uU291cmNlPWUucmVnaW9uX3NvdXJjZSx0aGlzLnJlZ2lvbk91dGNvbWU9ZS5yZWdpb25fb3V0Y29tZX1zZXRDYWNoZU91dGNvbWUoZSl7dGhpcy5jYWNoZU91dGNvbWU9ZX1zZXROYXRpdmVCcm9rZXJFcnJvckNvZGUoZSl7Y29uc3QgdD10aGlzLmdldExhc3RSZXF1ZXN0cygpO3QubmF0aXZlQnJva2VyRXJyb3JDb2RlPWUsdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksdCx0aGlzLmNvcnJlbGF0aW9uSWQpfWdldE5hdGl2ZUJyb2tlckVycm9yQ29kZSgpe3JldHVybiB0aGlzLmdldExhc3RSZXF1ZXN0cygpLm5hdGl2ZUJyb2tlckVycm9yQ29kZX1jbGVhck5hdGl2ZUJyb2tlckVycm9yQ29kZSgpe2NvbnN0IGU9dGhpcy5nZXRMYXN0UmVxdWVzdHMoKTtkZWxldGUgZS5uYXRpdmVCcm9rZXJFcnJvckNvZGUsdGhpcy5jYWNoZU1hbmFnZXIuc2V0U2VydmVyVGVsZW1ldHJ5KHRoaXMudGVsZW1ldHJ5Q2FjaGVLZXksZSx0aGlzLmNvcnJlbGF0aW9uSWQpfXN0YXRpYyBtYWtlRXh0cmFTa3VTdHJpbmcoZSl7cmV0dXJuIEJvKGUpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovY29uc3Qgem89Im1pc3Npbmdfa2lkX2Vycm9yIixLbz0ibWlzc2luZ19hbGdfZXJyb3IiLEdvPXtbem9dOiJUaGUgSk9TRSBIZWFkZXIgZm9yIHRoZSByZXF1ZXN0ZWQgSldULCBKV1Mgb3IgSldLIG9iamVjdCByZXF1aXJlcyBhIGtleUlkIHRvIGJlIGNvbmZpZ3VyZWQgYXMgdGhlICdraWQnIGhlYWRlciBjbGFpbS4gTm8gJ2tpZCcgdmFsdWUgd2FzIHByb3ZpZGVkLiIsW0tvXToiVGhlIEpPU0UgSGVhZGVyIGZvciB0aGUgcmVxdWVzdGVkIEpXVCwgSldTIG9yIEpXSyBvYmplY3QgcmVxdWlyZXMgYW4gYWxnb3JpdGhtIHRvIGJlIHNwZWNpZmllZCBhcyB0aGUgJ2FsZycgaGVhZGVyIGNsYWltLiBObyAnYWxnJyB2YWx1ZSB3YXMgcHJvdmlkZWQuIn07Y2xhc3MgJG8gZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy5uYW1lPSJKb3NlSGVhZGVyRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCRvLnByb3RvdHlwZSl9fWZ1bmN0aW9uIFFvKGUpe3JldHVybiBuZXcgJG8oZSxHb1tlXSl9Ci8qISBAYXp1cmUvbXNhbC1jb21tb24gdjE1LjEzLjMgMjAyNS0xMi0wNCAqL2NsYXNzIGpve2NvbnN0cnVjdG9yKGUpe3RoaXMudHlwPWUudHlwLHRoaXMuYWxnPWUuYWxnLHRoaXMua2lkPWUua2lkfXN0YXRpYyBnZXRTaHJIZWFkZXJTdHJpbmcoZSl7aWYoIWUua2lkKXRocm93IFFvKHpvKTtpZighZS5hbGcpdGhyb3cgUW8oS28pO2NvbnN0IHQ9bmV3IGpvKHt0eXA6ZS50eXB8fHVlLlBvcCxraWQ6ZS5raWQsYWxnOmUuYWxnfSk7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfX0KLyohIEBhenVyZS9tc2FsLWNvbW1vbiB2MTUuMTMuMyAyMDI1LTEyLTA0ICovZnVuY3Rpb24gV28oZSx0LHIsbj01KXtpZihlIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGUgaW5zdGFuY2VvZiBDZT8oci5lcnJvckNvZGU9ZS5lcnJvckNvZGUsci5zdWJFcnJvckNvZGU9ZS5zdWJFcnJvcix2b2lkKChlIGluc3RhbmNlb2Ygbm98fGUgaW5zdGFuY2VvZiBBbykmJihyLnNlcnZlckVycm9yTm89ZS5lcnJvck5vKSkpOnZvaWQoZSBpbnN0YW5jZW9mIFJyP3IuZXJyb3JDb2RlPWUuZXJyb3JDb2RlOnIuZXJyb3JTdGFjaz8ubGVuZ3RoP3QudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50LmFkZEVycm9yU3RhY2s6IFN0YWNrIGFscmVhZHkgZXhpc3QiLHIuY29ycmVsYXRpb25JZCk6ZS5zdGFjaz8ubGVuZ3RoPyhlLnN0YWNrJiYoci5lcnJvclN0YWNrPWZ1bmN0aW9uKGUsdCl7aWYodDwwKXJldHVybltdO2NvbnN0IHI9ZS5zcGxpdCgiXG4iKXx8W10sbj1bXSxvPXJbMF07by5zdGFydHNXaXRoKCJUeXBlRXJyb3I6IENhbm5vdCByZWFkIHByb3BlcnR5Iil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yOiBDYW5ub3QgcmVhZCBwcm9wZXJ0aWVzIG9mIil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yOiBDYW5ub3Qgc2V0IHByb3BlcnR5Iil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yOiBDYW5ub3Qgc2V0IHByb3BlcnRpZXMgb2YiKXx8by5lbmRzV2l0aCgiaXMgbm90IGEgZnVuY3Rpb24iKT9uLnB1c2goVm8obykpOihvLnN0YXJ0c1dpdGgoIlN5bnRheEVycm9yIil8fG8uc3RhcnRzV2l0aCgiVHlwZUVycm9yIikpJiZuLnB1c2goVm8oby5yZXBsYWNlKC9bJ10uKlsnXXxbIl0uKlsiXS9nLCI8cmVkYWN0ZWQ+IikpKTtmb3IobGV0IGU9MTtlPHIubGVuZ3RoJiYhKG4ubGVuZ3RoPj10KTtlKyspe2NvbnN0IHQ9cltlXTtuLnB1c2goVm8odCkpfXJldHVybiBufShlLnN0YWNrLG4pKSxyLmVycm9yTmFtZT1lLm5hbWUpOnQudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50LmFkZEVycm9yU3RhY2s6IElucHV0IHN0YWNrIGlzIGVtcHR5IixyLmNvcnJlbGF0aW9uSWQpKTt0LnRyYWNlKCJQZXJmb3JtYW5jZUNsaWVudC5hZGRFcnJvclN0YWNrOiBJbnB1dCBlcnJvciBpcyBub3QgaW5zdGFuY2Ugb2YgRXJyb3IiLHIuY29ycmVsYXRpb25JZCl9ZnVuY3Rpb24gVm8oZSl7Y29uc3QgdD1lLmxhc3RJbmRleE9mKCIgIikrMTtpZih0PDEpcmV0dXJuIGU7Y29uc3Qgcj1lLnN1YnN0cmluZyh0KTtsZXQgbj1yLmxhc3RJbmRleE9mKCIvIik7cmV0dXJuIG49bjwwP3IubGFzdEluZGV4T2YoIlxcIik6bixuPj0wPyhlLnN1YnN0cmluZygwLHQpKyIoIityLnN1YnN0cmluZyhuKzEpKygiKSI9PT1yLmNoYXJBdChyLmxlbmd0aC0xKT8iIjoiKSIpKS50cmltU3RhcnQoKTplLnRyaW1TdGFydCgpfWNsYXNzIEpve2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSl7dGhpcy5hdXRob3JpdHk9dCx0aGlzLmxpYnJhcnlOYW1lPW4sdGhpcy5saWJyYXJ5VmVyc2lvbj1vLHRoaXMuYXBwbGljYXRpb25UZWxlbWV0cnk9aSx0aGlzLmNsaWVudElkPWUsdGhpcy5sb2dnZXI9cix0aGlzLmNhbGxiYWNrcz1uZXcgTWFwLHRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkPW5ldyBNYXAsdGhpcy5ldmVudFN0YWNrPW5ldyBNYXAsdGhpcy5xdWV1ZU1lYXN1cmVtZW50cz1uZXcgTWFwLHRoaXMucHJlUXVldWVUaW1lQnlDb3JyZWxhdGlvbklkPW5ldyBNYXAsdGhpcy5pbnRGaWVsZHM9c3x8bmV3IFNldDtmb3IoY29uc3QgZSBvZiBMcil0aGlzLmludEZpZWxkcy5hZGQoZSk7dGhpcy5hYmJyZXZpYXRpb25zPWF8fG5ldyBNYXA7Zm9yKGNvbnN0W2UsdF1vZiBxcil0aGlzLmFiYnJldmlhdGlvbnMuc2V0KGUsdCl9c3RhcnRQZXJmb3JtYW5jZU1lYXN1cmVtZW50KGUsdCl7cmV0dXJue319Z2V0UHJlUXVldWVUaW1lKGUsdCl7Y29uc3Qgcj10aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5nZXQodCk7aWYocil7aWYoci5uYW1lPT09ZSlyZXR1cm4gci50aW1lO3RoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudC5nZXRQcmVRdWV1ZVRpbWU6IG5vIHByZS1xdWV1ZSB0aW1lIGZvdW5kIGZvciAke2V9LCB1bmFibGUgdG8gYWRkIHF1ZXVlIG1lYXN1cmVtZW50YCl9ZWxzZSB0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQuZ2V0UHJlUXVldWVUaW1lOiBubyBwcmUtcXVldWUgdGltZXMgZm91bmQgZm9yIGNvcnJlbGF0aW9uSWQ6ICR7dH0sIHVuYWJsZSB0byBhZGQgcXVldWUgbWVhc3VyZW1lbnRgKX1jYWxjdWxhdGVRdWV1ZWRUaW1lKGUsdCl7cmV0dXJuIGU8MT8odGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBwcmVRdWV1ZVRpbWUgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbm90ICR7ZX1gKSwwKTp0PDE/KHRoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogY3VycmVudFRpbWUgc2hvdWxkIGJlIGEgcG9zaXRpdmUgaW50ZWdlciBhbmQgbm90ICR7dH1gKSwwKTp0PGU/KHRoaXMubG9nZ2VyLnRyYWNlKCJQZXJmb3JtYW5jZUNsaWVudDogY3VycmVudFRpbWUgaXMgbGVzcyB0aGFuIHByZVF1ZXVlVGltZSwgY2hlY2sgaG93IHRpbWUgaXMgYmVpbmcgcmV0cmlldmVkIiksMCk6dC1lfWFkZFF1ZXVlTWVhc3VyZW1lbnQoZSx0LHIsbil7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IGNvcnJlbGF0aW9uSWQgbm90IHByb3ZpZGVkIGZvciAke2V9LCBjYW5ub3QgYWRkIHF1ZXVlIG1lYXN1cmVtZW50YCk7aWYoMD09PXIpdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IHF1ZXVlIHRpbWUgcHJvdmlkZWQgZm9yICR7ZX0gaXMgJHtyfWApO2Vsc2UgaWYoIXIpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IG5vIHF1ZXVlIHRpbWUgcHJvdmlkZWQgZm9yICR7ZX1gKTtjb25zdCBvPXtldmVudE5hbWU6ZSxxdWV1ZVRpbWU6bj8wOnIsbWFudWFsbHlDb21wbGV0ZWQ6bn0saT10aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLmdldCh0KTtpZihpKWkucHVzaChvKSx0aGlzLnF1ZXVlTWVhc3VyZW1lbnRzLnNldCh0LGkpO2Vsc2V7dGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQ6IGFkZGluZyBjb3JyZWxhdGlvbklkICR7dH0gdG8gcXVldWUgbWVhc3VyZW1lbnRzYCk7Y29uc3QgZT1bb107dGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5zZXQodCxlKX10aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5kZWxldGUodCl9c3RhcnRNZWFzdXJlbWVudChlLHQpe2NvbnN0IHI9dHx8dGhpcy5nZW5lcmF0ZUlkKCk7dHx8dGhpcy5sb2dnZXIuaW5mbyhgUGVyZm9ybWFuY2VDbGllbnQ6IE5vIGNvcnJlbGF0aW9uIGlkIHByb3ZpZGVkIGZvciAke2V9LCBnZW5lcmF0aW5nYCxyKSx0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHN0YXJ0ZWQgZm9yICR7ZX1gLHIpO2NvbnN0IG49e2V2ZW50SWQ6dGhpcy5nZW5lcmF0ZUlkKCksc3RhdHVzOk5yLGF1dGhvcml0eTp0aGlzLmF1dGhvcml0eSxsaWJyYXJ5TmFtZTp0aGlzLmxpYnJhcnlOYW1lLGxpYnJhcnlWZXJzaW9uOnRoaXMubGlicmFyeVZlcnNpb24sY2xpZW50SWQ6dGhpcy5jbGllbnRJZCxuYW1lOmUsc3RhcnRUaW1lTXM6RGF0ZS5ub3coKSxjb3JyZWxhdGlvbklkOnIsYXBwTmFtZTp0aGlzLmFwcGxpY2F0aW9uVGVsZW1ldHJ5Py5hcHBOYW1lLGFwcFZlcnNpb246dGhpcy5hcHBsaWNhdGlvblRlbGVtZXRyeT8uYXBwVmVyc2lvbn07dmFyIG8saSxzO3JldHVybiB0aGlzLmNhY2hlRXZlbnRCeUNvcnJlbGF0aW9uSWQobiksbz1uLGk9dGhpcy5hYmJyZXZpYXRpb25zLChzPXRoaXMuZXZlbnRTdGFjay5nZXQocikpJiZzLnB1c2goe25hbWU6aS5nZXQoby5uYW1lKXx8by5uYW1lfSkse2VuZDooZSx0LHIpPT50aGlzLmVuZE1lYXN1cmVtZW50KHsuLi5uLC4uLmV9LHQsciksZGlzY2FyZDooKT0+dGhpcy5kaXNjYXJkTWVhc3VyZW1lbnRzKG4uY29ycmVsYXRpb25JZCksYWRkOmU9PnRoaXMuYWRkRmllbGRzKGUsbi5jb3JyZWxhdGlvbklkKSxpbmNyZW1lbnQ6ZT0+dGhpcy5pbmNyZW1lbnRGaWVsZHMoZSxuLmNvcnJlbGF0aW9uSWQpLGV2ZW50Om4sbWVhc3VyZW1lbnQ6bmV3IERyfX1lbmRNZWFzdXJlbWVudChlLHQscil7Y29uc3Qgbj10aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQoZS5jb3JyZWxhdGlvbklkKTtpZighbilyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBNZWFzdXJlbWVudCBub3QgZm91bmQgZm9yICR7ZS5ldmVudElkfWAsZS5jb3JyZWxhdGlvbklkKSxudWxsO2NvbnN0IG89ZS5ldmVudElkPT09bi5ldmVudElkO2xldCBpPXt0b3RhbFF1ZXVlVGltZTowLHRvdGFsUXVldWVDb3VudDowLG1hbnVhbGx5Q29tcGxldGVkQ291bnQ6MH07ZS5kdXJhdGlvbk1zPU1hdGgucm91bmQoZS5kdXJhdGlvbk1zfHx0aGlzLmdldER1cmF0aW9uTXMoZS5zdGFydFRpbWVNcykpO2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkoZnVuY3Rpb24oZSx0LHIsbil7aWYoIXI/Lmxlbmd0aClyZXR1cm47Y29uc3Qgbz1lPT5lLmxlbmd0aD9lW2UubGVuZ3RoLTFdOnZvaWQgMCxpPXQuZ2V0KGUubmFtZSl8fGUubmFtZSxzPW8ocik7aWYocz8ubmFtZSE9PWkpcmV0dXJuO2NvbnN0IGE9cj8ucG9wKCk7aWYoIWEpcmV0dXJuO2NvbnN0IGM9biBpbnN0YW5jZW9mIENlP24uZXJyb3JDb2RlOm4gaW5zdGFuY2VvZiBFcnJvcj9uLm5hbWU6dm9pZCAwLGw9biBpbnN0YW5jZW9mIENlP24uc3ViRXJyb3I6dm9pZCAwO2MmJmEuY2hpbGRFcnIhPT1jJiYoYS5lcnI9YyxsJiYoYS5zdWJFcnI9bCkpLGRlbGV0ZSBhLm5hbWUsZGVsZXRlIGEuY2hpbGRFcnI7Y29uc3QgaD17Li4uYSxkdXI6ZS5kdXJhdGlvbk1zfTtlLnN1Y2Nlc3N8fChoLmZhaWw9MSk7Y29uc3QgZD1vKHIpO2lmKCFkKXJldHVybntbaV06aH07bGV0IHU7aWYoYyYmKGQuY2hpbGRFcnI9YyksZFtpXSl7Y29uc3QgZT1PYmplY3Qua2V5cyhkKS5maWx0ZXIoKGU9PmUuc3RhcnRzV2l0aChpKSkpLmxlbmd0aDt1PWAke2l9XyR7ZSsxfWB9ZWxzZSB1PWk7cmV0dXJuIGRbdV09aCxkfShlLHRoaXMuYWJicmV2aWF0aW9ucyx0aGlzLmV2ZW50U3RhY2suZ2V0KG4uY29ycmVsYXRpb25JZCksdCkpO2lmKG8/KGk9dGhpcy5nZXRRdWV1ZUluZm8oZS5jb3JyZWxhdGlvbklkKSx0aGlzLmRpc2NhcmRNZWFzdXJlbWVudHMobi5jb3JyZWxhdGlvbklkKSk6bi5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzPy5kZWxldGUoZS5ldmVudElkKSx0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50IGVuZGVkIGZvciAke2UubmFtZX06ICR7ZS5kdXJhdGlvbk1zfSBtc2AsZS5jb3JyZWxhdGlvbklkKSx0JiZXbyh0LHRoaXMubG9nZ2VyLG4pLCFvKXJldHVybiBuW2UubmFtZSsiRHVyYXRpb25NcyJdPU1hdGguZmxvb3IoZS5kdXJhdGlvbk1zKSx7Li4ubn07byYmIXQmJihuLmVycm9yQ29kZXx8bi5zdWJFcnJvckNvZGUpJiYodGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBSZW1vdmUgZXJyb3IgYW5kIHN1Yi1lcnJvciBjb2RlcyBmb3Igcm9vdCBldmVudCAke2UubmFtZX0gYXMgaW50ZXJtZWRpYXRlIGVycm9yIHdhcyBzdWNjZXNzZnVsbHkgaGFuZGxlZGAsZS5jb3JyZWxhdGlvbklkKSxuLmVycm9yQ29kZT12b2lkIDAsbi5zdWJFcnJvckNvZGU9dm9pZCAwKTtsZXQgYT17Li4ubiwuLi5lfSxjPTA7cmV0dXJuIGEuaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50cz8uZm9yRWFjaCgodD0+e3RoaXMubG9nZ2VyLnRyYWNlKGBQZXJmb3JtYW5jZUNsaWVudDogSW5jb21wbGV0ZSBzdWJtZWFzdXJlbWVudCAke3QubmFtZX0gZm91bmQgZm9yICR7ZS5uYW1lfWAsYS5jb3JyZWxhdGlvbklkKSxjKyt9KSksYS5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzPXZvaWQgMCxhPXsuLi5hLHF1ZXVlZFRpbWVNczppLnRvdGFsUXVldWVUaW1lLHF1ZXVlZENvdW50OmkudG90YWxRdWV1ZUNvdW50LHF1ZXVlZE1hbnVhbGx5Q29tcGxldGVkQ291bnQ6aS5tYW51YWxseUNvbXBsZXRlZENvdW50LHN0YXR1czpVcixpbmNvbXBsZXRlU3Vic0NvdW50OmMsY29udGV4dDpzfSxyJiYoYS5hY2NvdW50VHlwZT1mdW5jdGlvbihlKXtjb25zdCB0PWU/LmlkVG9rZW5DbGFpbXM7cmV0dXJuIHQ/LnRmcHx8dD8uYWNyPyJCMkMiOnQ/LnRpZD8iOTE4ODA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkIj09PXQ/LnRpZD8iTVNBIjoiQUFEIjp2b2lkIDB9KHIpLGEuZGF0YUJvdW5kYXJ5PXIuZGF0YUJvdW5kYXJ5KSx0aGlzLnRydW5jYXRlSW50ZWdyYWxGaWVsZHMoYSksdGhpcy5lbWl0RXZlbnRzKFthXSxlLmNvcnJlbGF0aW9uSWQpLGF9YWRkRmllbGRzKGUsdCl7dGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBVcGRhdGluZyBzdGF0aWMgZmllbGRzIik7Y29uc3Qgcj10aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQodCk7cj90aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5zZXQodCx7Li4uciwuLi5lfSk6dGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBub3QgZm91bmQgZm9yIix0KX1pbmNyZW1lbnRGaWVsZHMoZSx0KXt0aGlzLmxvZ2dlci50cmFjZSgiUGVyZm9ybWFuY2VDbGllbnQ6IFVwZGF0aW5nIGNvdW50ZXJzIik7Y29uc3Qgcj10aGlzLmV2ZW50c0J5Q29ycmVsYXRpb25JZC5nZXQodCk7aWYocilmb3IoY29uc3QgdCBpbiBlKXtpZihyLmhhc093blByb3BlcnR5KHQpKXtpZihpc05hTihOdW1iZXIoclt0XSkpKXJldHVybn1lbHNlIHJbdF09MDtyW3RdKz1lW3RdfWVsc2UgdGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBub3QgZm91bmQgZm9yIix0KX1jYWNoZUV2ZW50QnlDb3JyZWxhdGlvbklkKGUpe2NvbnN0IHQ9dGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuZ2V0KGUuY29ycmVsYXRpb25JZCk7dD8odGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmb3IgJHtlLm5hbWV9IGFkZGVkL3VwZGF0ZWRgLGUuY29ycmVsYXRpb25JZCksdC5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzPXQuaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50c3x8bmV3IE1hcCx0LmluY29tcGxldGVTdWJNZWFzdXJlbWVudHMuc2V0KGUuZXZlbnRJZCx7bmFtZTplLm5hbWUsc3RhcnRUaW1lTXM6ZS5zdGFydFRpbWVNc30pKToodGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudCBmb3IgJHtlLm5hbWV9IHN0YXJ0ZWRgLGUuY29ycmVsYXRpb25JZCksdGhpcy5ldmVudHNCeUNvcnJlbGF0aW9uSWQuc2V0KGUuY29ycmVsYXRpb25JZCx7Li4uZX0pLHRoaXMuZXZlbnRTdGFjay5zZXQoZS5jb3JyZWxhdGlvbklkLFtdKSl9Z2V0UXVldWVJbmZvKGUpe2NvbnN0IHQ9dGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5nZXQoZSk7dHx8dGhpcy5sb2dnZXIudHJhY2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBubyBxdWV1ZSBtZWFzdXJlbWVudHMgZm91bmQgZm9yIGZvciBjb3JyZWxhdGlvbklkOiAke2V9YCk7bGV0IHI9MCxuPTAsbz0wO3JldHVybiB0Py5mb3JFYWNoKChlPT57cis9ZS5xdWV1ZVRpbWUsbisrLG8rPWUubWFudWFsbHlDb21wbGV0ZWQ/MTowfSkpLHt0b3RhbFF1ZXVlVGltZTpyLHRvdGFsUXVldWVDb3VudDpuLG1hbnVhbGx5Q29tcGxldGVkQ291bnQ6b319ZGlzY2FyZE1lYXN1cmVtZW50cyhlKXt0aGlzLmxvZ2dlci50cmFjZSgiUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyBkaXNjYXJkZWQiLGUpLHRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkLmRlbGV0ZShlKSx0aGlzLmxvZ2dlci50cmFjZSgiUGVyZm9ybWFuY2VDbGllbnQ6IFF1ZXVlTWVhc3VyZW1lbnRzIGRpc2NhcmRlZCIsZSksdGhpcy5xdWV1ZU1lYXN1cmVtZW50cy5kZWxldGUoZSksdGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBQcmUtcXVldWUgdGltZXMgZGlzY2FyZGVkIixlKSx0aGlzLnByZVF1ZXVlVGltZUJ5Q29ycmVsYXRpb25JZC5kZWxldGUoZSksdGhpcy5sb2dnZXIudHJhY2UoIlBlcmZvcm1hbmNlQ2xpZW50OiBFdmVudCBzdGFjayBkaXNjYXJkZWQiLGUpLHRoaXMuZXZlbnRTdGFjay5kZWxldGUoZSl9YWRkUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtmb3IoY29uc3RbdCxyXW9mIHRoaXMuY2FsbGJhY2tzKWlmKHIudG9TdHJpbmcoKT09PWUudG9TdHJpbmcoKSlyZXR1cm4gdGhpcy5sb2dnZXIud2FybmluZyhgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIGNhbGxiYWNrIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCB3aXRoIGlkOiAke3R9YCksdDtjb25zdCB0PXRoaXMuZ2VuZXJhdGVJZCgpO3JldHVybiB0aGlzLmNhbGxiYWNrcy5zZXQodCxlKSx0aGlzLmxvZ2dlci52ZXJib3NlKGBQZXJmb3JtYW5jZUNsaWVudDogUGVyZm9ybWFuY2UgY2FsbGJhY2sgcmVnaXN0ZXJlZCB3aXRoIGlkOiAke3R9YCksdH1yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpe2NvbnN0IHQ9dGhpcy5jYWxsYmFja3MuZGVsZXRlKGUpO3JldHVybiB0P3RoaXMubG9nZ2VyLnZlcmJvc2UoYFBlcmZvcm1hbmNlQ2xpZW50OiBQZXJmb3JtYW5jZSBjYWxsYmFjayAke2V9IHJlbW92ZWQuYCk6dGhpcy5sb2dnZXIudmVyYm9zZShgUGVyZm9ybWFuY2VDbGllbnQ6IFBlcmZvcm1hbmNlIGNhbGxiYWNrICR7ZX0gbm90IHJlbW92ZWQuYCksdH1lbWl0RXZlbnRzKGUsdCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiUGVyZm9ybWFuY2VDbGllbnQ6IEVtaXR0aW5nIHBlcmZvcm1hbmNlIGV2ZW50cyIsdCksdGhpcy5jYWxsYmFja3MuZm9yRWFjaCgoKHIsbik9Pnt0aGlzLmxvZ2dlci50cmFjZShgUGVyZm9ybWFuY2VDbGllbnQ6IEVtaXR0aW5nIGV2ZW50IHRvIGNhbGxiYWNrICR7bn1gLHQpLHIuYXBwbHkobnVsbCxbZV0pfSkpfXRydW5jYXRlSW50ZWdyYWxGaWVsZHMoZSl7dGhpcy5pbnRGaWVsZHMuZm9yRWFjaCgodD0+e3QgaW4gZSYmIm51bWJlciI9PXR5cGVvZiBlW3RdJiYoZVt0XT1NYXRoLmZsb29yKGVbdF0pKX0pKX1nZXREdXJhdGlvbk1zKGUpe2NvbnN0IHQ9RGF0ZS5ub3coKS1lO3JldHVybiB0PDA/dDowfX1jb25zdCBZbz0icGtjZV9ub3RfY3JlYXRlZCIsWG89ImVhcl9qd2tfZW1wdHkiLFpvPSJlYXJfandlX2VtcHR5IixlaT0iY3J5cHRvX25vbmV4aXN0ZW50Iix0aT0iZW1wdHlfbmF2aWdhdGVfdXJpIixyaT0iaGFzaF9lbXB0eV9lcnJvciIsbmk9Im5vX3N0YXRlX2luX2hhc2giLG9pPSJoYXNoX2RvZXNfbm90X2NvbnRhaW5fa25vd25fcHJvcGVydGllcyIsaWk9InVuYWJsZV90b19wYXJzZV9zdGF0ZSIsc2k9InN0YXRlX2ludGVyYWN0aW9uX3R5cGVfbWlzbWF0Y2giLGFpPSJpbnRlcmFjdGlvbl9pbl9wcm9ncmVzcyIsY2k9InBvcHVwX3dpbmRvd19lcnJvciIsbGk9ImVtcHR5X3dpbmRvd19lcnJvciIsaGk9InVzZXJfY2FuY2VsbGVkIixkaT0ibW9uaXRvcl9wb3B1cF90aW1lb3V0Iix1aT0ibW9uaXRvcl93aW5kb3dfdGltZW91dCIsZ2k9InJlZGlyZWN0X2luX2lmcmFtZSIscGk9ImJsb2NrX2lmcmFtZV9yZWxvYWQiLG1pPSJibG9ja19uZXN0ZWRfcG9wdXBzIixmaT0iaWZyYW1lX2Nsb3NlZF9wcmVtYXR1cmVseSIseWk9InNpbGVudF9sb2dvdXRfdW5zdXBwb3J0ZWQiLENpPSJub19hY2NvdW50X2Vycm9yIix3aT0ic2lsZW50X3Byb21wdF92YWx1ZV9lcnJvciIsdmk9Im5vX3Rva2VuX3JlcXVlc3RfY2FjaGVfZXJyb3IiLElpPSJ1bmFibGVfdG9fcGFyc2VfdG9rZW5fcmVxdWVzdF9jYWNoZV9lcnJvciIsVGk9ImF1dGhfcmVxdWVzdF9ub3Rfc2V0X2Vycm9yIixBaT0iaW52YWxpZF9jYWNoZV90eXBlIixraT0ibm9uX2Jyb3dzZXJfZW52aXJvbm1lbnQiLFNpPSJkYXRhYmFzZV9ub3Rfb3BlbiIsYmk9Im5vX25ldHdvcmtfY29ubmVjdGl2aXR5IixFaT0icG9zdF9yZXF1ZXN0X2ZhaWxlZCIsUmk9ImdldF9yZXF1ZXN0X2ZhaWxlZCIsX2k9ImZhaWxlZF90b19wYXJzZV9yZXNwb25zZSIsUGk9InVuYWJsZV90b19sb2FkX3Rva2VuIixNaT0iY3J5cHRvX2tleV9ub3RfZm91bmQiLE9pPSJhdXRoX2NvZGVfcmVxdWlyZWQiLHFpPSJhdXRoX2NvZGVfb3JfbmF0aXZlQWNjb3VudElkX3JlcXVpcmVkIixOaT0ic3BhX2NvZGVfYW5kX25hdGl2ZUFjY291bnRJZF9wcmVzZW50IixVaT0iZGF0YWJhc2VfdW5hdmFpbGFibGUiLExpPSJ1bmFibGVfdG9fYWNxdWlyZV90b2tlbl9mcm9tX25hdGl2ZV9wbGF0Zm9ybSIsRGk9Im5hdGl2ZV9oYW5kc2hha2VfdGltZW91dCIsSGk9Im5hdGl2ZV9leHRlbnNpb25fbm90X2luc3RhbGxlZCIseGk9Im5hdGl2ZV9jb25uZWN0aW9uX25vdF9lc3RhYmxpc2hlZCIsQmk9InVuaW5pdGlhbGl6ZWRfcHVibGljX2NsaWVudF9hcHBsaWNhdGlvbiIsRmk9Im5hdGl2ZV9wcm9tcHRfbm90X3N1cHBvcnRlZCIsemk9ImludmFsaWRfYmFzZTY0X3N0cmluZyIsS2k9ImludmFsaWRfcG9wX3Rva2VuX3JlcXVlc3QiLEdpPSJmYWlsZWRfdG9fYnVpbGRfaGVhZGVycyIsJGk9ImZhaWxlZF90b19wYXJzZV9oZWFkZXJzIixRaT0iZmFpbGVkX3RvX2RlY3J5cHRfZWFyX3Jlc3BvbnNlIixqaT0idGltZWRfb3V0Ijt2YXIgV2k9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYXV0aENvZGVPck5hdGl2ZUFjY291bnRJZFJlcXVpcmVkOnFpLGF1dGhDb2RlUmVxdWlyZWQ6T2ksYXV0aFJlcXVlc3ROb3RTZXRFcnJvcjpUaSxibG9ja0lmcmFtZVJlbG9hZDpwaSxibG9ja05lc3RlZFBvcHVwczptaSxjcnlwdG9LZXlOb3RGb3VuZDpNaSxjcnlwdG9Ob25FeGlzdGVudDplaSxkYXRhYmFzZU5vdE9wZW46U2ksZGF0YWJhc2VVbmF2YWlsYWJsZTpVaSxlYXJKd2VFbXB0eTpabyxlYXJKd2tFbXB0eTpYbyxlbXB0eU5hdmlnYXRlVXJpOnRpLGVtcHR5V2luZG93RXJyb3I6bGksZmFpbGVkVG9CdWlsZEhlYWRlcnM6R2ksZmFpbGVkVG9EZWNyeXB0RWFyUmVzcG9uc2U6UWksZmFpbGVkVG9QYXJzZUhlYWRlcnM6JGksZmFpbGVkVG9QYXJzZVJlc3BvbnNlOl9pLGdldFJlcXVlc3RGYWlsZWQ6UmksaGFzaERvZXNOb3RDb250YWluS25vd25Qcm9wZXJ0aWVzOm9pLGhhc2hFbXB0eUVycm9yOnJpLGlmcmFtZUNsb3NlZFByZW1hdHVyZWx5OmZpLGludGVyYWN0aW9uSW5Qcm9ncmVzczphaSxpbnZhbGlkQmFzZTY0U3RyaW5nOnppLGludmFsaWRDYWNoZVR5cGU6QWksaW52YWxpZFBvcFRva2VuUmVxdWVzdDpLaSxtb25pdG9yUG9wdXBUaW1lb3V0OmRpLG1vbml0b3JXaW5kb3dUaW1lb3V0OnVpLG5hdGl2ZUNvbm5lY3Rpb25Ob3RFc3RhYmxpc2hlZDp4aSxuYXRpdmVFeHRlbnNpb25Ob3RJbnN0YWxsZWQ6SGksbmF0aXZlSGFuZHNoYWtlVGltZW91dDpEaSxuYXRpdmVQcm9tcHROb3RTdXBwb3J0ZWQ6Rmksbm9BY2NvdW50RXJyb3I6Q2ksbm9OZXR3b3JrQ29ubmVjdGl2aXR5OmJpLG5vU3RhdGVJbkhhc2g6bmksbm9Ub2tlblJlcXVlc3RDYWNoZUVycm9yOnZpLG5vbkJyb3dzZXJFbnZpcm9ubWVudDpraSxwa2NlTm90Q3JlYXRlZDpZbyxwb3B1cFdpbmRvd0Vycm9yOmNpLHBvc3RSZXF1ZXN0RmFpbGVkOkVpLHJlZGlyZWN0SW5JZnJhbWU6Z2ksc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWQ6eWksc2lsZW50UHJvbXB0VmFsdWVFcnJvcjp3aSxzcGFDb2RlQW5kTmF0aXZlQWNjb3VudElkUHJlc2VudDpOaSxzdGF0ZUludGVyYWN0aW9uVHlwZU1pc21hdGNoOnNpLHRpbWVkT3V0OmppLHVuYWJsZVRvQWNxdWlyZVRva2VuRnJvbU5hdGl2ZVBsYXRmb3JtOkxpLHVuYWJsZVRvTG9hZFRva2VuOlBpLHVuYWJsZVRvUGFyc2VTdGF0ZTppaSx1bmFibGVUb1BhcnNlVG9rZW5SZXF1ZXN0Q2FjaGVFcnJvcjpJaSx1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb246QmksdXNlckNhbmNlbGxlZDpoaX0pO2NvbnN0IFZpPSJGb3IgbW9yZSB2aXNpdDogYWthLm1zL21zYWxqcy9icm93c2VyLWVycm9ycyIsSmk9e1tZb106IlRoZSBQS0NFIGNvZGUgY2hhbGxlbmdlIGFuZCB2ZXJpZmllciBjb3VsZCBub3QgYmUgZ2VuZXJhdGVkLiIsW1hvXToiTm8gRUFSIGVuY3J5cHRpb24ga2V5IHByb3ZpZGVkLiBUaGlzIGlzIHVuZXhwZWN0ZWQuIixbWm9dOiJTZXJ2ZXIgcmVzcG9uc2UgZG9lcyBub3QgY29udGFpbiBlYXJfandlIHByb3BlcnR5LiBUaGlzIGlzIHVuZXhwZWN0ZWQuIixbZWldOiJUaGUgY3J5cHRvIG9iamVjdCBvciBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlLiIsW3RpXToiTmF2aWdhdGlvbiBVUkkgaXMgZW1wdHkuIFBsZWFzZSBjaGVjayBzdGFjayB0cmFjZSBmb3IgbW9yZSBpbmZvLiIsW3JpXTpgSGFzaCB2YWx1ZSBjYW5ub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2UgaXQgaXMgZW1wdHkuIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIHJlZGlyZWN0VXJpIGlzIG5vdCBjbGVhcmluZyB0aGUgaGFzaC4gJHtWaX1gLFtuaV06Ikhhc2ggZG9lcyBub3QgY29udGFpbiBzdGF0ZS4gUGxlYXNlIHZlcmlmeSB0aGF0IHRoZSByZXF1ZXN0IG9yaWdpbmF0ZWQgZnJvbSBtc2FsLiIsW29pXTpgSGFzaCBkb2VzIG5vdCBjb250YWluIGtub3duIHByb3Blcml0ZXMuIFBsZWFzZSB2ZXJpZnkgdGhhdCB5b3VyIHJlZGlyZWN0VXJpIGlzIG5vdCBjaGFuZ2luZyB0aGUgaGFzaC4gICR7Vml9YCxbaWldOiJVbmFibGUgdG8gcGFyc2Ugc3RhdGUuIFBsZWFzZSB2ZXJpZnkgdGhhdCB0aGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gbXNhbC4iLFtzaV06Ikhhc2ggY29udGFpbnMgc3RhdGUgYnV0IHRoZSBpbnRlcmFjdGlvbiB0eXBlIGRvZXMgbm90IG1hdGNoIHRoZSBjYWxsZXIuIixbYWldOmBJbnRlcmFjdGlvbiBpcyBjdXJyZW50bHkgaW4gcHJvZ3Jlc3MuIFBsZWFzZSBlbnN1cmUgdGhhdCB0aGlzIGludGVyYWN0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBiZWZvcmUgY2FsbGluZyBhbiBpbnRlcmFjdGl2ZSBBUEkuICAgJHtWaX1gLFtjaV06IkVycm9yIG9wZW5pbmcgcG9wdXAgd2luZG93LiBUaGlzIGNhbiBoYXBwZW4gaWYgeW91IGFyZSB1c2luZyBJRSBvciBpZiBwb3B1cHMgYXJlIGJsb2NrZWQgaW4gdGhlIGJyb3dzZXIuIixbbGldOiJ3aW5kb3cub3BlbiByZXR1cm5lZCBudWxsIG9yIHVuZGVmaW5lZCB3aW5kb3cgb2JqZWN0LiIsW2hpXToiVXNlciBjYW5jZWxsZWQgdGhlIGZsb3cuIixbZGldOmBUb2tlbiBhY3F1aXNpdGlvbiBpbiBwb3B1cCBmYWlsZWQgZHVlIHRvIHRpbWVvdXQuICAke1ZpfWAsW3VpXTpgVG9rZW4gYWNxdWlzaXRpb24gaW4gaWZyYW1lIGZhaWxlZCBkdWUgdG8gdGltZW91dC4gICR7Vml9YCxbZ2ldOiJSZWRpcmVjdHMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGlmcmFtZWQgb3IgYnJva2VyZWQgYXBwbGljYXRpb25zLiBQbGVhc2UgZW5zdXJlIHlvdSBhcmUgdXNpbmcgTVNBTC5qcyBpbiBhIHRvcCBmcmFtZSBvZiB0aGUgd2luZG93IGlmIHVzaW5nIHRoZSByZWRpcmVjdCBBUElzLCBvciB1c2UgdGhlIHBvcHVwIEFQSXMuIixbcGldOmBSZXF1ZXN0IHdhcyBibG9ja2VkIGluc2lkZSBhbiBpZnJhbWUgYmVjYXVzZSBNU0FMIGRldGVjdGVkIGFuIGF1dGhlbnRpY2F0aW9uIHJlc3BvbnNlLiAgJHtWaX1gLFttaV06IlJlcXVlc3Qgd2FzIGJsb2NrZWQgaW5zaWRlIGEgcG9wdXAgYmVjYXVzZSBNU0FMIGRldGVjdGVkIGl0IHdhcyBydW5uaW5nIGluIGEgcG9wdXAuIixbZmldOiJUaGUgaWZyYW1lIGJlaW5nIG1vbml0b3JlZCB3YXMgY2xvc2VkIHByZW1hdHVyZWx5LiIsW3lpXToiU2lsZW50IGxvZ291dCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgY2FsbCBsb2dvdXRSZWRpcmVjdCBvciBsb2dvdXRQb3B1cCBpbnN0ZWFkLiIsW0NpXToiTm8gYWNjb3VudCBvYmplY3QgcHJvdmlkZWQgdG8gYWNxdWlyZVRva2VuU2lsZW50IGFuZCBubyBhY3RpdmUgYWNjb3VudCBoYXMgYmVlbiBzZXQuIFBsZWFzZSBjYWxsIHNldEFjdGl2ZUFjY291bnQgb3IgcHJvdmlkZSBhbiBhY2NvdW50IG9uIHRoZSByZXF1ZXN0LiIsW3dpXToiVGhlIHZhbHVlIGdpdmVuIGZvciB0aGUgcHJvbXB0IHZhbHVlIGlzIG5vdCB2YWxpZCBmb3Igc2lsZW50IHJlcXVlc3RzIC0gbXVzdCBiZSBzZXQgdG8gJ25vbmUnIG9yICdub19zZXNzaW9uJy4iLFt2aV06Ik5vIHRva2VuIHJlcXVlc3QgZm91bmQgaW4gY2FjaGUuIixbSWldOiJUaGUgY2FjaGVkIHRva2VuIHJlcXVlc3QgY291bGQgbm90IGJlIHBhcnNlZC4iLFtUaV06IkF1dGggUmVxdWVzdCBub3Qgc2V0LiBQbGVhc2UgZW5zdXJlIGluaXRpYXRlQXV0aFJlcXVlc3Qgd2FzIGNhbGxlZCBmcm9tIHRoZSBJbnRlcmFjdGlvbkhhbmRsZXIiLFtBaV06IkludmFsaWQgY2FjaGUgdHlwZSIsW2tpXToiTG9naW4gYW5kIHRva2VuIHJlcXVlc3RzIGFyZSBub3Qgc3VwcG9ydGVkIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy4iLFtTaV06IkRhdGFiYXNlIGlzIG5vdCBvcGVuISIsW2JpXToiTm8gbmV0d29yayBjb25uZWN0aXZpdHkuIENoZWNrIHlvdXIgaW50ZXJuZXQgY29ubmVjdGlvbi4iLFtFaV06Ik5ldHdvcmsgcmVxdWVzdCBmYWlsZWQ6IElmIHRoZSBicm93c2VyIHRocmV3IGEgQ09SUyBlcnJvciwgY2hlY2sgdGhhdCB0aGUgcmVkaXJlY3RVcmkgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgQXp1cmUgQXBwIFBvcnRhbCBhcyB0eXBlICdTUEEnIixbUmldOiJOZXR3b3JrIHJlcXVlc3QgZmFpbGVkLiBQbGVhc2UgY2hlY2sgdGhlIG5ldHdvcmsgdHJhY2UgdG8gZGV0ZXJtaW5lIHJvb3QgY2F1c2UuIixbX2ldOiJGYWlsZWQgdG8gcGFyc2UgbmV0d29yayByZXNwb25zZS4gQ2hlY2sgbmV0d29yayB0cmFjZS4iLFtQaV06IkVycm9yIGxvYWRpbmcgdG9rZW4gdG8gY2FjaGUuIixbTWldOiJDcnlwdG9ncmFwaGljIEtleSBvciBLZXlwYWlyIG5vdCBmb3VuZCBpbiBicm93c2VyIHN0b3JhZ2UuIixbT2ldOiJBbiBhdXRob3JpemF0aW9uIGNvZGUgbXVzdCBiZSBwcm92aWRlZCAoYXMgdGhlIGBjb2RlYCBwcm9wZXJ0eSBvbiB0aGUgcmVxdWVzdCkgdG8gdGhpcyBmbG93LiIsW3FpXToiQW4gYXV0aG9yaXphdGlvbiBjb2RlIG9yIG5hdGl2ZUFjY291bnRJZCBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoaXMgZmxvdy4iLFtOaV06IlJlcXVlc3QgY2Fubm90IGNvbnRhaW4gYm90aCBzcGEgY29kZSBhbmQgbmF0aXZlIGFjY291bnQgaWQuIixbVWldOiJJbmRleGVkREIsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBwZXJzaXN0ZW50IGNyeXB0b2dyYXBoaWMga2V5IHN0b3JhZ2UsIGlzIHVuYXZhaWxhYmxlLiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYnJvd3NlciBwcml2YWN5IGZlYXR1cmVzIHdoaWNoIGJsb2NrIHBlcnNpc3RlbnQgc3RvcmFnZSBpbiB0aGlyZC1wYXJ0eSBjb250ZXh0cy4iLFtMaV06YFVuYWJsZSB0byBhY3F1aXJlIHRva2VuIGZyb20gbmF0aXZlIHBsYXRmb3JtLiAgJHtWaX1gLFtEaV06IlRpbWVkIG91dCB3aGlsZSBhdHRlbXB0aW5nIHRvIGVzdGFibGlzaCBjb25uZWN0aW9uIHRvIGJyb3dzZXIgZXh0ZW5zaW9uIixbSGldOiJOYXRpdmUgZXh0ZW5zaW9uIGlzIG5vdCBpbnN0YWxsZWQuIElmIHlvdSB0aGluayB0aGlzIGlzIGEgbWlzdGFrZSBjYWxsIHRoZSBpbml0aWFsaXplIGZ1bmN0aW9uLiIsW3hpXTpgQ29ubmVjdGlvbiB0byBuYXRpdmUgcGxhdGZvcm0gaGFzIG5vdCBiZWVuIGVzdGFibGlzaGVkLiBQbGVhc2UgaW5zdGFsbCBhIGNvbXBhdGlibGUgYnJvd3NlciBleHRlbnNpb24gYW5kIHJ1biBpbml0aWFsaXplKCkuICAke1ZpfWAsW0JpXTpgWW91IG11c3QgY2FsbCBhbmQgYXdhaXQgdGhlIGluaXRpYWxpemUgZnVuY3Rpb24gYmVmb3JlIGF0dGVtcHRpbmcgdG8gY2FsbCBhbnkgb3RoZXIgTVNBTCBBUEkuICAke1ZpfWAsW0ZpXToiVGhlIHByb3ZpZGVkIHByb21wdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBuYXRpdmUgcGxhdGZvcm0uIFRoaXMgcmVxdWVzdCBzaG91bGQgYmUgcm91dGVkIHRvIHRoZSB3ZWIgYmFzZWQgZmxvdy4iLFt6aV06IkludmFsaWQgYmFzZTY0IGVuY29kZWQgc3RyaW5nLiIsW0tpXToiSW52YWxpZCBQb1AgdG9rZW4gcmVxdWVzdC4gVGhlIHJlcXVlc3Qgc2hvdWxkIG5vdCBoYXZlIGJvdGggYSBwb3BLaWQgdmFsdWUgYW5kIHNpZ25Qb3BUb2tlbiBzZXQgdG8gdHJ1ZS4iLFtHaV06IkZhaWxlZCB0byBidWlsZCByZXF1ZXN0IGhlYWRlcnMgb2JqZWN0LiIsWyRpXToiRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlIGhlYWRlcnMiLFtRaV06IkZhaWxlZCB0byBkZWNyeXB0IGVhciByZXNwb25zZSIsW2ppXToiVGhlIHJlcXVlc3QgdGltZWQgb3V0LiJ9LFlpPXtwa2NlTm90R2VuZXJhdGVkOntjb2RlOllvLGRlc2M6SmlbWW9dfSxjcnlwdG9Eb2VzTm90RXhpc3Q6e2NvZGU6ZWksZGVzYzpKaVtlaV19LGVtcHR5TmF2aWdhdGVVcmlFcnJvcjp7Y29kZTp0aSxkZXNjOkppW3RpXX0saGFzaEVtcHR5RXJyb3I6e2NvZGU6cmksZGVzYzpKaVtyaV19LGhhc2hEb2VzTm90Q29udGFpblN0YXRlRXJyb3I6e2NvZGU6bmksZGVzYzpKaVtuaV19LGhhc2hEb2VzTm90Q29udGFpbktub3duUHJvcGVydGllc0Vycm9yOntjb2RlOm9pLGRlc2M6Smlbb2ldfSx1bmFibGVUb1BhcnNlU3RhdGVFcnJvcjp7Y29kZTppaSxkZXNjOkppW2lpXX0sc3RhdGVJbnRlcmFjdGlvblR5cGVNaXNtYXRjaEVycm9yOntjb2RlOnNpLGRlc2M6Smlbc2ldfSxpbnRlcmFjdGlvbkluUHJvZ3Jlc3M6e2NvZGU6YWksZGVzYzpKaVthaV19LHBvcHVwV2luZG93RXJyb3I6e2NvZGU6Y2ksZGVzYzpKaVtjaV19LGVtcHR5V2luZG93RXJyb3I6e2NvZGU6bGksZGVzYzpKaVtsaV19LHVzZXJDYW5jZWxsZWRFcnJvcjp7Y29kZTpoaSxkZXNjOkppW2hpXX0sbW9uaXRvclBvcHVwVGltZW91dEVycm9yOntjb2RlOmRpLGRlc2M6SmlbZGldfSxtb25pdG9ySWZyYW1lVGltZW91dEVycm9yOntjb2RlOnVpLGRlc2M6SmlbdWldfSxyZWRpcmVjdEluSWZyYW1lRXJyb3I6e2NvZGU6Z2ksZGVzYzpKaVtnaV19LGJsb2NrVG9rZW5SZXF1ZXN0c0luSGlkZGVuSWZyYW1lRXJyb3I6e2NvZGU6cGksZGVzYzpKaVtwaV19LGJsb2NrQWNxdWlyZVRva2VuSW5Qb3B1cHNFcnJvcjp7Y29kZTptaSxkZXNjOkppW21pXX0saWZyYW1lQ2xvc2VkUHJlbWF0dXJlbHlFcnJvcjp7Y29kZTpmaSxkZXNjOkppW2ZpXX0sc2lsZW50TG9nb3V0VW5zdXBwb3J0ZWRFcnJvcjp7Y29kZTp5aSxkZXNjOkppW3lpXX0sbm9BY2NvdW50RXJyb3I6e2NvZGU6Q2ksZGVzYzpKaVtDaV19LHNpbGVudFByb21wdFZhbHVlRXJyb3I6e2NvZGU6d2ksZGVzYzpKaVt3aV19LG5vVG9rZW5SZXF1ZXN0Q2FjaGVFcnJvcjp7Y29kZTp2aSxkZXNjOkppW3ZpXX0sdW5hYmxlVG9QYXJzZVRva2VuUmVxdWVzdENhY2hlRXJyb3I6e2NvZGU6SWksZGVzYzpKaVtJaV19LGF1dGhSZXF1ZXN0Tm90U2V0Ontjb2RlOlRpLGRlc2M6SmlbVGldfSxpbnZhbGlkQ2FjaGVUeXBlOntjb2RlOkFpLGRlc2M6SmlbQWldfSxub3RJbkJyb3dzZXJFbnZpcm9ubWVudDp7Y29kZTpraSxkZXNjOkppW2tpXX0sZGF0YWJhc2VOb3RPcGVuOntjb2RlOlNpLGRlc2M6SmlbU2ldfSxub05ldHdvcmtDb25uZWN0aXZpdHk6e2NvZGU6YmksZGVzYzpKaVtiaV19LHBvc3RSZXF1ZXN0RmFpbGVkOntjb2RlOkVpLGRlc2M6SmlbRWldfSxnZXRSZXF1ZXN0RmFpbGVkOntjb2RlOlJpLGRlc2M6SmlbUmldfSxmYWlsZWRUb1BhcnNlTmV0d29ya1Jlc3BvbnNlOntjb2RlOl9pLGRlc2M6SmlbX2ldfSx1bmFibGVUb0xvYWRUb2tlbkVycm9yOntjb2RlOlBpLGRlc2M6SmlbUGldfSxzaWduaW5nS2V5Tm90Rm91bmRJblN0b3JhZ2U6e2NvZGU6TWksZGVzYzpKaVtNaV19LGF1dGhDb2RlUmVxdWlyZWQ6e2NvZGU6T2ksZGVzYzpKaVtPaV19LGF1dGhDb2RlT3JOYXRpdmVBY2NvdW50UmVxdWlyZWQ6e2NvZGU6cWksZGVzYzpKaVtxaV19LHNwYUNvZGVBbmROYXRpdmVBY2NvdW50UHJlc2VudDp7Y29kZTpOaSxkZXNjOkppW05pXX0sZGF0YWJhc2VVbmF2YWlsYWJsZTp7Y29kZTpVaSxkZXNjOkppW1VpXX0sdW5hYmxlVG9BY3F1aXJlVG9rZW5Gcm9tTmF0aXZlUGxhdGZvcm06e2NvZGU6TGksZGVzYzpKaVtMaV19LG5hdGl2ZUhhbmRzaGFrZVRpbWVvdXQ6e2NvZGU6RGksZGVzYzpKaVtEaV19LG5hdGl2ZUV4dGVuc2lvbk5vdEluc3RhbGxlZDp7Y29kZTpIaSxkZXNjOkppW0hpXX0sbmF0aXZlQ29ubmVjdGlvbk5vdEVzdGFibGlzaGVkOntjb2RlOnhpLGRlc2M6SmlbeGldfSx1bmluaXRpYWxpemVkUHVibGljQ2xpZW50QXBwbGljYXRpb246e2NvZGU6QmksZGVzYzpKaVtCaV19LG5hdGl2ZVByb21wdE5vdFN1cHBvcnRlZDp7Y29kZTpGaSxkZXNjOkppW0ZpXX0saW52YWxpZEJhc2U2NFN0cmluZ0Vycm9yOntjb2RlOnppLGRlc2M6SmlbemldfSxpbnZhbGlkUG9wVG9rZW5SZXF1ZXN0Ontjb2RlOktpLGRlc2M6SmlbS2ldfX07Y2xhc3MgWGkgZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsSmlbZV0sdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsWGkucHJvdG90eXBlKSx0aGlzLm5hbWU9IkJyb3dzZXJBdXRoRXJyb3IifX1mdW5jdGlvbiBaaShlLHQpe3JldHVybiBuZXcgWGkoZSx0KX1jb25zdCBlcz0iaW52YWxpZF9ncmFudCIsdHM9NDgzLHJzPTYwMCxucz0ibXNhbCIsb3M9MzAsaXM9Im1zYWwuanMuYnJvd3NlciIsc3M9IjUzZWUyODRkLTkyMGEtNGI1OS05ZDMwLWE2MDMxNWIyNjgzNiIsYXM9InBwbmJucGVvbGdraWNnZWdrYmtiam1obGlkZW9waWppIixjcz0iTUFUUyIsbHM9Ik1pY3Jvc29mdEVudHJhIixocz0iRE9NIEFQSSIsZHM9ImdldC10b2tlbi1hbmQtc2lnbi1vdXQiLHVzPSJQbGF0Zm9ybUF1dGhET01IYW5kbGVyIixncz0iUGxhdGZvcm1BdXRoRXh0ZW5zaW9uSGFuZGxlciIscHM9IkhhbmRzaGFrZSIsbXM9IkhhbmRzaGFrZVJlc3BvbnNlIixmcz0iR2V0VG9rZW4iLHlzPSJSZXNwb25zZSIsQ3M9e0xvY2FsU3RvcmFnZToibG9jYWxTdG9yYWdlIixTZXNzaW9uU3RvcmFnZToic2Vzc2lvblN0b3JhZ2UiLE1lbW9yeVN0b3JhZ2U6Im1lbW9yeVN0b3JhZ2UifSx3cz0iR0VUIix2cz0iUE9TVCIsSXM9InNpZ25pbiIsVHM9InNpZ25vdXQiLEFzPSJyZXF1ZXN0Lm9yaWdpbiIsa3M9InVybEhhc2giLFNzPSJyZXF1ZXN0LnBhcmFtcyIsYnM9ImNvZGUudmVyaWZpZXIiLEVzPSJpbnRlcmFjdGlvbi5zdGF0dXMiLFJzPSJyZXF1ZXN0Lm5hdGl2ZSIsX3M9IndyYXBwZXIuc2t1IixQcz0id3JhcHBlci52ZXJzaW9uIixNcz17YWNxdWlyZVRva2VuUmVkaXJlY3Q6ODYxLGFjcXVpcmVUb2tlblBvcHVwOjg2Mixzc29TaWxlbnQ6ODYzLGFjcXVpcmVUb2tlblNpbGVudF9hdXRoQ29kZTo4NjQsaGFuZGxlUmVkaXJlY3RQcm9taXNlOjg2NSxhY3F1aXJlVG9rZW5CeUNvZGU6ODY2LGFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93OjYxLGxvZ291dDo5NjEsbG9nb3V0UG9wdXA6OTYyfTt2YXIgT3M7ZS5JbnRlcmFjdGlvblR5cGU9dm9pZCAwLChPcz1lLkludGVyYWN0aW9uVHlwZXx8KGUuSW50ZXJhY3Rpb25UeXBlPXt9KSkuUmVkaXJlY3Q9InJlZGlyZWN0IixPcy5Qb3B1cD0icG9wdXAiLE9zLlNpbGVudD0ic2lsZW50IixPcy5Ob25lPSJub25lIjtjb25zdCBxcz17U3RhcnR1cDoic3RhcnR1cCIsTG9naW46ImxvZ2luIixMb2dvdXQ6ImxvZ291dCIsQWNxdWlyZVRva2VuOiJhY3F1aXJlVG9rZW4iLFNzb1NpbGVudDoic3NvU2lsZW50IixIYW5kbGVSZWRpcmVjdDoiaGFuZGxlUmVkaXJlY3QiLE5vbmU6Im5vbmUifSxOcz17c2NvcGVzOmh9LFVzPSJtc2FsLmRiIixMcz1gJHtVc30ua2V5c2AsRHM9e0RlZmF1bHQ6MCxBY2Nlc3NUb2tlbjoxLEFjY2Vzc1Rva2VuQW5kUmVmcmVzaFRva2VuOjIsUmVmcmVzaFRva2VuOjMsUmVmcmVzaFRva2VuQW5kTmV0d29yazo0LFNraXA6NX0sSHM9W0RzLkRlZmF1bHQsRHMuU2tpcCxEcy5SZWZyZXNoVG9rZW5BbmROZXR3b3JrXTtmdW5jdGlvbiB4cyhlKXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KEZzKGUpLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKSl9ZnVuY3Rpb24gQnMoZSl7cmV0dXJuIHpzKGUpLnJlcGxhY2UoLz0vZywiIikucmVwbGFjZSgvXCsvZywiLSIpLnJlcGxhY2UoL1wvL2csIl8iKX1mdW5jdGlvbiBGcyhlKXtyZXR1cm4genMoKG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpKX1mdW5jdGlvbiB6cyhlKXtjb25zdCB0PUFycmF5LmZyb20oZSwoZT0+U3RyaW5nLmZyb21Db2RlUG9pbnQoZSkpKS5qb2luKCIiKTtyZXR1cm4gYnRvYSh0KX1mdW5jdGlvbiBLcyhlKXtyZXR1cm4obmV3IFRleHREZWNvZGVyKS5kZWNvZGUoR3MoZSkpfWZ1bmN0aW9uIEdzKGUpe2xldCB0PWUucmVwbGFjZSgvLS9nLCIrIikucmVwbGFjZSgvXy9nLCIvIik7c3dpdGNoKHQubGVuZ3RoJTQpe2Nhc2UgMDpicmVhaztjYXNlIDI6dCs9Ij09IjticmVhaztjYXNlIDM6dCs9Ij0iO2JyZWFrO2RlZmF1bHQ6dGhyb3cgWmkoemkpfWNvbnN0IHI9YXRvYih0KTtyZXR1cm4gVWludDhBcnJheS5mcm9tKHIsKGU9PmUuY29kZVBvaW50QXQoMCl8fDApKX1jb25zdCAkcz0iQUVTLUdDTSIsUXM9IkhLREYiLGpzPSJTSEEtMjU2IixXcz1uZXcgVWludDhBcnJheShbMSwwLDFdKSxWcz0iMDEyMzQ1Njc4OWFiY2RlZiIsSnM9bmV3IFVpbnQzMkFycmF5KDEpLFlzPSJyYXciLFhzPSJlbmNyeXB0Iixacz0iZGVjcnlwdCIsZWE9e25hbWU6IlJTQVNTQS1QS0NTMS12MV81IixoYXNoOmpzLG1vZHVsdXNMZW5ndGg6MjA0OCxwdWJsaWNFeHBvbmVudDpXc307YXN5bmMgZnVuY3Rpb24gdGEoZSx0LHIpe3Q/LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU2hhMjU2RGlnZXN0LHIpO2NvbnN0IG49KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGUpO3JldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kaWdlc3QoanMsbil9ZnVuY3Rpb24gcmEoZSl7cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKGUpfWZ1bmN0aW9uIG5hKCl7cmV0dXJuIHdpbmRvdy5jcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKEpzKSxKc1swXX1mdW5jdGlvbiBvYSgpe2NvbnN0IGU9RGF0ZS5ub3coKSx0PTEwMjQqbmEoKSsoMTAyMyZuYSgpKSxyPW5ldyBVaW50OEFycmF5KDE2KSxuPU1hdGgudHJ1bmModC8yKiozMCksbz10JjIqKjMwLTEsaT1uYSgpO3JbMF09ZS8yKio0MCxyWzFdPWUvMioqMzIsclsyXT1lLzIqKjI0LHJbM109ZS82NTUzNixyWzRdPWUvMjU2LHJbNV09ZSxyWzZdPTExMnxuPj4+OCxyWzddPW4scls4XT0xMjh8bz4+PjI0LHJbOV09bz4+PjE2LHJbMTBdPW8+Pj44LHJbMTFdPW8sclsxMl09aT4+PjI0LHJbMTNdPWk+Pj4xNixyWzE0XT1pPj4+OCxyWzE1XT1pO2xldCBzPSIiO2ZvcihsZXQgZT0wO2U8ci5sZW5ndGg7ZSsrKXMrPVZzLmNoYXJBdChyW2VdPj4+NCkscys9VnMuY2hhckF0KDE1JnJbZV0pLDMhPT1lJiY1IT09ZSYmNyE9PWUmJjkhPT1lfHwocys9Ii0iKTtyZXR1cm4gc31hc3luYyBmdW5jdGlvbiBpYShlKXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZXhwb3J0S2V5KCJqd2siLGUpfWFzeW5jIGZ1bmN0aW9uIHNhKCl7Y29uc3QgZT1hd2FpdCBjYSgpLHQ9e2FsZzoiZGlyIixrdHk6Im9jdCIsazpCcyhuZXcgVWludDhBcnJheShlKSl9O3JldHVybiBGcyhKU09OLnN0cmluZ2lmeSh0KSl9YXN5bmMgZnVuY3Rpb24gYWEoZSx0KXtjb25zdCByPXQuc3BsaXQoIi4iKTtpZig1IT09ci5sZW5ndGgpdGhyb3cgWmkoUWksImp3ZV9sZW5ndGgiKTtjb25zdCBuPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUpe2NvbnN0IHQ9S3MoZSkscj1HcyhKU09OLnBhcnNlKHQpLmspO3JldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5pbXBvcnRLZXkoWXMsciwkcywhMSxbWnNdKX0oZSkuY2F0Y2goKCgpPT57dGhyb3cgWmkoUWksImltcG9ydF9rZXkiKX0pKTt0cnl7Y29uc3QgZT0obmV3IFRleHRFbmNvZGVyKS5lbmNvZGUoclswXSksdD1HcyhyWzJdKSxvPUdzKHJbM10pLGk9R3Mocls0XSkscz04KmkuYnl0ZUxlbmd0aCxhPW5ldyBVaW50OEFycmF5KG8ubGVuZ3RoK2kubGVuZ3RoKTthLnNldChvKSxhLnNldChpLG8ubGVuZ3RoKTtjb25zdCBjPWF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRlY3J5cHQoe25hbWU6JHMsaXY6dCx0YWdMZW5ndGg6cyxhZGRpdGlvbmFsRGF0YTplfSxuLGEpO3JldHVybihuZXcgVGV4dERlY29kZXIpLmRlY29kZShjKX1jYXRjaChlKXt0aHJvdyBaaShRaSwiZGVjcnlwdCIpfX1hc3luYyBmdW5jdGlvbiBjYSgpe2NvbnN0IGU9YXdhaXQgd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoe25hbWU6JHMsbGVuZ3RoOjI1Nn0sITAsW1hzLFpzXSk7cmV0dXJuIHdpbmRvdy5jcnlwdG8uc3VidGxlLmV4cG9ydEtleShZcyxlKX1hc3luYyBmdW5jdGlvbiBsYShlKXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KFlzLGUsUXMsITEsWyJkZXJpdmVLZXkiXSl9YXN5bmMgZnVuY3Rpb24gaGEoZSx0LHIpe3JldHVybiB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZXJpdmVLZXkoe25hbWU6UXMsc2FsdDp0LGhhc2g6anMsaW5mbzoobmV3IFRleHRFbmNvZGVyKS5lbmNvZGUocil9LGUse25hbWU6JHMsbGVuZ3RoOjI1Nn0sITEsW1hzLFpzXSl9YXN5bmMgZnVuY3Rpb24gZGEoZSx0LHIpe2NvbnN0IG49KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKHQpLG89d2luZG93LmNyeXB0by5nZXRSYW5kb21WYWx1ZXMobmV3IFVpbnQ4QXJyYXkoMTYpKSxpPWF3YWl0IGhhKGUsbyxyKSxzPWF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmVuY3J5cHQoe25hbWU6JHMsaXY6bmV3IFVpbnQ4QXJyYXkoMTIpfSxpLG4pO3JldHVybntkYXRhOkJzKG5ldyBVaW50OEFycmF5KHMpKSxub25jZTpCcyhvKX19YXN5bmMgZnVuY3Rpb24gdWEoZSx0LHIsbil7Y29uc3Qgbz1HcyhuKSxpPWF3YWl0IGhhKGUsR3ModCkscikscz1hd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kZWNyeXB0KHtuYW1lOiRzLGl2Om5ldyBVaW50OEFycmF5KDEyKX0saSxvKTtyZXR1cm4obmV3IFRleHREZWNvZGVyKS5kZWNvZGUocyl9YXN5bmMgZnVuY3Rpb24gZ2EoZSl7Y29uc3QgdD1hd2FpdCB0YShlKTtyZXR1cm4gQnMobmV3IFVpbnQ4QXJyYXkodCkpfWNvbnN0IHBhPSJzdG9yYWdlX25vdF9zdXBwb3J0ZWQiLG1hPSJzdHViYmVkX3B1YmxpY19jbGllbnRfYXBwbGljYXRpb25fY2FsbGVkIixmYT0iaW5fbWVtX3JlZGlyZWN0X3VuYXZhaWxhYmxlIjt2YXIgeWE9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsaW5NZW1SZWRpcmVjdFVuYXZhaWxhYmxlOmZhLHN0b3JhZ2VOb3RTdXBwb3J0ZWQ6cGEsc3R1YmJlZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uQ2FsbGVkOm1hfSk7Y29uc3QgQ2E9e1twYV06IkdpdmVuIHN0b3JhZ2UgY29uZmlndXJhdGlvbiBvcHRpb24gd2FzIG5vdCBzdXBwb3J0ZWQuIixbbWFdOiJTdHViIGluc3RhbmNlIG9mIFB1YmxpYyBDbGllbnQgQXBwbGljYXRpb24gd2FzIGNhbGxlZC4gSWYgdXNpbmcgbXNhbC1yZWFjdCwgcGxlYXNlIGVuc3VyZSBjb250ZXh0IGlzIG5vdCB1c2VkIHdpdGhvdXQgYSBwcm92aWRlci4gRm9yIG1vcmUgdmlzaXQ6IGFrYS5tcy9tc2FsanMvYnJvd3Nlci1lcnJvcnMiLFtmYV06IlJlZGlyZWN0IGNhbm5vdCBiZSBzdXBwb3J0ZWQuIEluLW1lbW9yeSBzdG9yYWdlIHdhcyBzZWxlY3RlZCBhbmQgc3RvcmVBdXRoU3RhdGVJbkNvb2tpZT1mYWxzZSwgd2hpY2ggd291bGQgY2F1c2UgdGhlIGxpYnJhcnkgdG8gYmUgdW5hYmxlIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgaGFzaC4gSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRoZSByZWRpcmVjdCBBUEksIHBsZWFzZSB1c2Ugc2Vzc2lvbi9sb2NhbFN0b3JhZ2Ugb3Igc2V0IHN0b3JlQXV0aFN0YXRlSW5Db29raWU9dHJ1ZS4ifSx3YT17c3RvcmFnZU5vdFN1cHBvcnRlZEVycm9yOntjb2RlOnBhLGRlc2M6Q2FbcGFdfSxzdHViUGNhSW5zdGFuY2VDYWxsZWQ6e2NvZGU6bWEsZGVzYzpDYVttYV19LGluTWVtUmVkaXJlY3RVbmF2YWlsYWJsZTp7Y29kZTpmYSxkZXNjOkNhW2ZhXX19O2NsYXNzIHZhIGV4dGVuZHMgQ2V7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMubmFtZT0iQnJvd3NlckNvbmZpZ3VyYXRpb25BdXRoRXJyb3IiLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHZhLnByb3RvdHlwZSl9fWZ1bmN0aW9uIElhKGUpe3JldHVybiBuZXcgdmEoZSxDYVtlXSl9ZnVuY3Rpb24gVGEoZSl7ZS5sb2NhdGlvbi5oYXNoPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmhpc3RvcnkucmVwbGFjZVN0YXRlJiZlLmhpc3RvcnkucmVwbGFjZVN0YXRlKG51bGwsIiIsYCR7ZS5sb2NhdGlvbi5vcmlnaW59JHtlLmxvY2F0aW9uLnBhdGhuYW1lfSR7ZS5sb2NhdGlvbi5zZWFyY2h9YCl9ZnVuY3Rpb24gQWEoZSl7Y29uc3QgdD1lLnNwbGl0KCIjIik7dC5zaGlmdCgpLHdpbmRvdy5sb2NhdGlvbi5oYXNoPXQubGVuZ3RoPjA/dC5qb2luKCIjIik6IiJ9ZnVuY3Rpb24ga2EoKXtyZXR1cm4gd2luZG93LnBhcmVudCE9PXdpbmRvd31mdW5jdGlvbiBTYSgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiYhIXdpbmRvdy5vcGVuZXImJndpbmRvdy5vcGVuZXIhPT13aW5kb3cmJiJzdHJpbmciPT10eXBlb2Ygd2luZG93Lm5hbWUmJjA9PT13aW5kb3cubmFtZS5pbmRleE9mKGAke25zfS5gKX1mdW5jdGlvbiBiYSgpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubG9jYXRpb24/d2luZG93LmxvY2F0aW9uLmhyZWYuc3BsaXQoIj8iKVswXS5zcGxpdCgiIyIpWzBdOiIifWZ1bmN0aW9uIEVhKCl7Y29uc3QgZT1uZXcgd3Iod2luZG93LmxvY2F0aW9uLmhyZWYpLmdldFVybENvbXBvbmVudHMoKTtyZXR1cm5gJHtlLlByb3RvY29sfS8vJHtlLkhvc3ROYW1lQW5kUG9ydH0vYH1mdW5jdGlvbiBSYSgpe2lmKHdyLmhhc2hDb250YWluc0tub3duUHJvcGVydGllcyh3aW5kb3cubG9jYXRpb24uaGFzaCkmJmthKCkpdGhyb3cgWmkocGkpfWZ1bmN0aW9uIF9hKGUpe2lmKGthKCkmJiFlKXRocm93IFppKGdpKX1mdW5jdGlvbiBQYSgpe2lmKFNhKCkpdGhyb3cgWmkobWkpfWZ1bmN0aW9uIE1hKCl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3cpdGhyb3cgWmkoa2kpfWZ1bmN0aW9uIE9hKGUpe2lmKCFlKXRocm93IFppKEJpKX1mdW5jdGlvbiBxYShlKXtNYSgpLFJhKCksUGEoKSxPYShlKX1mdW5jdGlvbiBOYShlLHQpe2lmKHFhKGUpLF9hKHQuc3lzdGVtLmFsbG93UmVkaXJlY3RJbklmcmFtZSksdC5jYWNoZS5jYWNoZUxvY2F0aW9uPT09Q3MuTWVtb3J5U3RvcmFnZSYmIXQuY2FjaGUuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSl0aHJvdyBJYShmYSl9ZnVuY3Rpb24gVWEoZSl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIik7dC5yZWw9InByZWNvbm5lY3QiLHQuaHJlZj1uZXcgVVJMKGUpLm9yaWdpbix0LmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCksd2luZG93LnNldFRpbWVvdXQoKCgpPT57dHJ5e2RvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQodCl9Y2F0Y2h7fX0pLDFlNCl9ZnVuY3Rpb24gTGEoKXtyZXR1cm4gb2EoKX1jb25zdCBEYT1Sbjt2YXIgSGE9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsYWRkQ2xpZW50Q2FwYWJpbGl0aWVzVG9DbGFpbXM6RGEsYmxvY2tBUElDYWxsc0JlZm9yZUluaXRpYWxpemU6T2EsYmxvY2tBY3F1aXJlVG9rZW5JblBvcHVwczpQYSxibG9ja05vbkJyb3dzZXJFbnZpcm9ubWVudDpNYSxibG9ja1JlZGlyZWN0SW5JZnJhbWU6X2EsYmxvY2tSZWxvYWRJbkhpZGRlbklmcmFtZXM6UmEsY2xlYXJIYXNoOlRhLGNyZWF0ZUd1aWQ6TGEsZ2V0Q3VycmVudFVyaTpiYSxnZXRIb21lcGFnZTpFYSxpbnZva2U6Tm4saW52b2tlQXN5bmM6VW4saXNJbklmcmFtZTprYSxpc0luUG9wdXA6U2EscHJlY29ubmVjdDpVYSxwcmVmbGlnaHRDaGVjazpxYSxyZWRpcmVjdFByZWZsaWdodENoZWNrOk5hLHJlcGxhY2VIYXNoOkFhfSk7Y2xhc3MgeGF7bmF2aWdhdGVJbnRlcm5hbChlLHQpe3JldHVybiB4YS5kZWZhdWx0TmF2aWdhdGVXaW5kb3coZSx0KX1uYXZpZ2F0ZUV4dGVybmFsKGUsdCl7cmV0dXJuIHhhLmRlZmF1bHROYXZpZ2F0ZVdpbmRvdyhlLHQpfXN0YXRpYyBkZWZhdWx0TmF2aWdhdGVXaW5kb3coZSx0KXtyZXR1cm4gdC5ub0hpc3Rvcnk/d2luZG93LmxvY2F0aW9uLnJlcGxhY2UoZSk6d2luZG93LmxvY2F0aW9uLmFzc2lnbihlKSxuZXcgUHJvbWlzZSgoKGUscik9PntzZXRUaW1lb3V0KCgoKT0+e3IoWmkoamksImZhaWxlZF90b19yZWRpcmVjdCIpKX0pLHQudGltZW91dCl9KSl9fWNsYXNzIEJhe2FzeW5jIHNlbmRHZXRSZXF1ZXN0QXN5bmMoZSx0KXtsZXQgcixuPXt9LG89MDtjb25zdCBpPUZhKHQpO3RyeXtyPWF3YWl0IGZldGNoKGUse21ldGhvZDp3cyxoZWFkZXJzOml9KX1jYXRjaChlKXt0aHJvdyBhbyhaaSh3aW5kb3cubmF2aWdhdG9yLm9uTGluZT9SaTpiaSksdm9pZCAwLHZvaWQgMCxlKX1uPXphKHIuaGVhZGVycyk7dHJ5e3JldHVybiBvPXIuc3RhdHVzLHtoZWFkZXJzOm4sYm9keTphd2FpdCByLmpzb24oKSxzdGF0dXM6b319Y2F0Y2goZSl7dGhyb3cgYW8oWmkoX2kpLG8sbixlKX19YXN5bmMgc2VuZFBvc3RSZXF1ZXN0QXN5bmMoZSx0KXtjb25zdCByPXQmJnQuYm9keXx8IiIsbj1GYSh0KTtsZXQgbyxpPTAscz17fTt0cnl7bz1hd2FpdCBmZXRjaChlLHttZXRob2Q6dnMsaGVhZGVyczpuLGJvZHk6cn0pfWNhdGNoKGUpe3Rocm93IGFvKFppKHdpbmRvdy5uYXZpZ2F0b3Iub25MaW5lP0VpOmJpKSx2b2lkIDAsdm9pZCAwLGUpfXM9emEoby5oZWFkZXJzKTt0cnl7cmV0dXJuIGk9by5zdGF0dXMse2hlYWRlcnM6cyxib2R5OmF3YWl0IG8uanNvbigpLHN0YXR1czppfX1jYXRjaChlKXt0aHJvdyBhbyhaaShfaSksaSxzLGUpfX19ZnVuY3Rpb24gRmEoZSl7dHJ5e2NvbnN0IHQ9bmV3IEhlYWRlcnM7aWYoIWV8fCFlLmhlYWRlcnMpcmV0dXJuIHQ7Y29uc3Qgcj1lLmhlYWRlcnM7cmV0dXJuIE9iamVjdC5lbnRyaWVzKHIpLmZvckVhY2goKChbZSxyXSk9Pnt0LmFwcGVuZChlLHIpfSkpLHR9Y2F0Y2goZSl7dGhyb3cgYW8oWmkoR2kpLHZvaWQgMCx2b2lkIDAsZSl9fWZ1bmN0aW9uIHphKGUpe3RyeXtjb25zdCB0PXt9O3JldHVybiBlLmZvckVhY2goKChlLHIpPT57dFtyXT1lfSkpLHR9Y2F0Y2goZSl7dGhyb3cgWmkoJGkpfX1jb25zdCBLYT0xZTQ7Y29uc3QgR2E9IkBhenVyZS9tc2FsLWJyb3dzZXIiLCRhPSI0LjI3LjAiLFFhPSJtc2FsIixqYT0iYnJvd3NlciIsV2E9YCR7UWF9LiR7amF9LmxvZy5sZXZlbGAsVmE9YCR7UWF9LiR7amF9LmxvZy5waWlgLEphPWAke1FhfS4ke2phfS5wZXJmb3JtYW5jZS5lbmFibGVkYCxZYT1gJHtRYX0udmVyc2lvbmAsWGE9ImFjY291bnQua2V5cyIsWmE9InRva2VuLmtleXMiO2Z1bmN0aW9uIGVjKGU9Mil7cmV0dXJuIGU8MT9gJHtRYX0uJHtYYX1gOmAke1FhfS4ke2V9LiR7WGF9YH1mdW5jdGlvbiB0YyhlLHQ9Mil7cmV0dXJuIHQ8MT9gJHtRYX0uJHtaYX0uJHtlfWA6YCR7UWF9LiR7dH0uJHtaYX0uJHtlfWB9Y2xhc3MgcmN7c3RhdGljIGxvZ2dlckNhbGxiYWNrKHQscil7c3dpdGNoKHQpe2Nhc2UgZS5Mb2dMZXZlbC5FcnJvcjpyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKHIpO2Nhc2UgZS5Mb2dMZXZlbC5JbmZvOnJldHVybiB2b2lkIGNvbnNvbGUuaW5mbyhyKTtjYXNlIGUuTG9nTGV2ZWwuVmVyYm9zZTpyZXR1cm4gdm9pZCBjb25zb2xlLmRlYnVnKHIpO2Nhc2UgZS5Mb2dMZXZlbC5XYXJuaW5nOnJldHVybiB2b2lkIGNvbnNvbGUud2FybihyKTtkZWZhdWx0OnJldHVybiB2b2lkIGNvbnNvbGUubG9nKHIpfX1jb25zdHJ1Y3RvcihyKXtsZXQgbjt0aGlzLmJyb3dzZXJFbnZpcm9ubWVudD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyx0aGlzLmNvbmZpZz1mdW5jdGlvbih7YXV0aDpyLGNhY2hlOm4sc3lzdGVtOm8sdGVsZW1ldHJ5Oml9LHMpe2NvbnN0IGE9e2NsaWVudElkOnQuRU1QVFlfU1RSSU5HLGF1dGhvcml0eTpgJHt0LkRFRkFVTFRfQVVUSE9SSVRZfWAsa25vd25BdXRob3JpdGllczpbXSxjbG91ZERpc2NvdmVyeU1ldGFkYXRhOnQuRU1QVFlfU1RSSU5HLGF1dGhvcml0eU1ldGFkYXRhOnQuRU1QVFlfU1RSSU5HLHJlZGlyZWN0VXJpOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P2JhKCk6IiIscG9zdExvZ291dFJlZGlyZWN0VXJpOnQuRU1QVFlfU1RSSU5HLG5hdmlnYXRlVG9Mb2dpblJlcXVlc3RVcmw6ITAsY2xpZW50Q2FwYWJpbGl0aWVzOltdLHByb3RvY29sTW9kZTpsci5BQUQsT0lEQ09wdGlvbnM6e3NlcnZlclJlc3BvbnNlVHlwZTpfLkZSQUdNRU5ULGRlZmF1bHRTY29wZXM6W3QuT1BFTklEX1NDT1BFLHQuUFJPRklMRV9TQ09QRSx0Lk9GRkxJTkVfQUNDRVNTX1NDT1BFXX0sYXp1cmVDbG91ZE9wdGlvbnM6e2F6dXJlQ2xvdWRJbnN0YW5jZTpJdC5Ob25lLHRlbmFudDp0LkVNUFRZX1NUUklOR30sc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6ITEsc3VwcG9ydHNOZXN0ZWRBcHBBdXRoOiExLGluc3RhbmNlQXdhcmU6ITEsZW5jb2RlRXh0cmFRdWVyeVBhcmFtczohMX0sYz17Y2FjaGVMb2NhdGlvbjpDcy5TZXNzaW9uU3RvcmFnZSxjYWNoZVJldGVudGlvbkRheXM6NSx0ZW1wb3JhcnlDYWNoZUxvY2F0aW9uOkNzLlNlc3Npb25TdG9yYWdlLHN0b3JlQXV0aFN0YXRlSW5Db29raWU6ITEsc2VjdXJlQ29va2llczohMSxjYWNoZU1pZ3JhdGlvbkVuYWJsZWQ6ISghbnx8bi5jYWNoZUxvY2F0aW9uIT09Q3MuTG9jYWxTdG9yYWdlKSxjbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkOiExfSxsPXtsb2dnZXJDYWxsYmFjazooKT0+e30sbG9nTGV2ZWw6ZS5Mb2dMZXZlbC5JbmZvLHBpaUxvZ2dpbmdFbmFibGVkOiExfSxoPXsuLi57Li4ueHIsbG9nZ2VyT3B0aW9uczpsLG5ldHdvcmtDbGllbnQ6cz9uZXcgQmE6TG8sbmF2aWdhdGlvbkNsaWVudDpuZXcgeGEsbG9hZEZyYW1lVGltZW91dDowLHdpbmRvd0hhc2hUaW1lb3V0Om8/LmxvYWRGcmFtZVRpbWVvdXR8fDZlNCxpZnJhbWVIYXNoVGltZW91dDpvPy5sb2FkRnJhbWVUaW1lb3V0fHxLYSxuYXZpZ2F0ZUZyYW1lV2FpdDowLHJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQ6M2U0LGFzeW5jUG9wdXBzOiExLGFsbG93UmVkaXJlY3RJbklmcmFtZTohMSxhbGxvd1BsYXRmb3JtQnJva2VyOiExLGFsbG93UGxhdGZvcm1Ccm9rZXJXaXRoRE9NOiExLG5hdGl2ZUJyb2tlckhhbmRzaGFrZVRpbWVvdXQ6bz8ubmF0aXZlQnJva2VySGFuZHNoYWtlVGltZW91dHx8MmUzLHBvbGxJbnRlcnZhbE1pbGxpc2Vjb25kczpvc30sLi4ubyxsb2dnZXJPcHRpb25zOm8/LmxvZ2dlck9wdGlvbnN8fGx9LGQ9e2FwcGxpY2F0aW9uOnthcHBOYW1lOnQuRU1QVFlfU1RSSU5HLGFwcFZlcnNpb246dC5FTVBUWV9TVFJJTkd9LGNsaWVudDpuZXcgSHJ9O3I/LnByb3RvY29sTW9kZSE9PWxyLk9JREMmJnI/Lk9JRENPcHRpb25zJiZuZXcgQ3QoaC5sb2dnZXJPcHRpb25zKS53YXJuaW5nKEpTT04uc3RyaW5naWZ5KEp0KEJ0KSkpO2lmKHI/LnByb3RvY29sTW9kZSYmci5wcm90b2NvbE1vZGU9PT1sci5PSURDJiZoPy5hbGxvd1BsYXRmb3JtQnJva2VyKXRocm93IEp0KEZ0KTtyZXR1cm57YXV0aDp7Li4uYSwuLi5yLE9JRENPcHRpb25zOnsuLi5hLk9JRENPcHRpb25zLC4uLnI/Lk9JRENPcHRpb25zfX0sY2FjaGU6ey4uLmMsLi4ubn0sc3lzdGVtOmgsdGVsZW1ldHJ5OnsuLi5kLC4uLml9fX0ocix0aGlzLmJyb3dzZXJFbnZpcm9ubWVudCk7dHJ5e249d2luZG93W0NzLlNlc3Npb25TdG9yYWdlXX1jYXRjaChlKXt9Y29uc3Qgbz1uPy5nZXRJdGVtKFdhKSxpPW4/LmdldEl0ZW0oVmEpPy50b0xvd2VyQ2FzZSgpLHM9InRydWUiPT09aXx8ImZhbHNlIiE9PWkmJnZvaWQgMCxhPXsuLi50aGlzLmNvbmZpZy5zeXN0ZW0ubG9nZ2VyT3B0aW9uc30sYz1vJiZPYmplY3Qua2V5cyhlLkxvZ0xldmVsKS5pbmNsdWRlcyhvKT9lLkxvZ0xldmVsW29dOnZvaWQgMDtjJiYoYS5sb2dnZXJDYWxsYmFjaz1yYy5sb2dnZXJDYWxsYmFjayxhLmxvZ0xldmVsPWMpLHZvaWQgMCE9PXMmJihhLnBpaUxvZ2dpbmdFbmFibGVkPXMpLHRoaXMubG9nZ2VyPW5ldyBDdChhLEdhLCRhKSx0aGlzLmF2YWlsYWJsZT0hMX1nZXRDb25maWcoKXtyZXR1cm4gdGhpcy5jb25maWd9Z2V0TG9nZ2VyKCl7cmV0dXJuIHRoaXMubG9nZ2VyfWlzQXZhaWxhYmxlKCl7cmV0dXJuIHRoaXMuYXZhaWxhYmxlfWlzQnJvd3NlckVudmlyb25tZW50KCl7cmV0dXJuIHRoaXMuYnJvd3NlckVudmlyb25tZW50fX1jb25zdCBuYz0iVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCIsb2M9IlVTRVJfQ0FOQ0VMIixpYz0iTk9fTkVUV09SSyIsc2M9IlRSQU5TSUVOVF9FUlJPUiIsYWM9IlBFUlNJU1RFTlRfRVJST1IiLGNjPSJESVNBQkxFRCIsbGM9IkFDQ09VTlRfVU5BVkFJTEFCTEUiLGhjPSJORVNURURfQVBQX0FVVEhfVU5BVkFJTEFCTEUiO2NsYXNzIGRje3N0YXRpYyBhc3luYyBpbml0aWFsaXplTmVzdGVkQXBwQXV0aEJyaWRnZSgpe2lmKHZvaWQgMD09PXdpbmRvdyl0aHJvdyBuZXcgRXJyb3IoIndpbmRvdyBpcyB1bmRlZmluZWQiKTtpZih2b2lkIDA9PT13aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZSl0aHJvdyBuZXcgRXJyb3IoIndpbmRvdy5uZXN0ZWRBcHBBdXRoQnJpZGdlIGlzIHVuZGVmaW5lZCIpO3RyeXt3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIiwoZT0+e2NvbnN0IHQ9InN0cmluZyI9PXR5cGVvZiBlP2U6ZS5kYXRhLHI9SlNPTi5wYXJzZSh0KSxuPWRjLmJyaWRnZVJlcXVlc3RzLmZpbmQoKGU9PmUucmVxdWVzdElkPT09ci5yZXF1ZXN0SWQpKTt2b2lkIDAhPT1uJiYoZGMuYnJpZGdlUmVxdWVzdHMuc3BsaWNlKGRjLmJyaWRnZVJlcXVlc3RzLmluZGV4T2YobiksMSksci5zdWNjZXNzP24ucmVzb2x2ZShyKTpuLnJlamVjdChyLmVycm9yKSl9KSk7Y29uc3QgZT1hd2FpdCBuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCByPWRjLmJ1aWxkUmVxdWVzdCgiR2V0SW5pdENvbnRleHQiKSxuPXtyZXF1ZXN0SWQ6ci5yZXF1ZXN0SWQsbWV0aG9kOnIubWV0aG9kLHJlc29sdmU6ZSxyZWplY3Q6dH07ZGMuYnJpZGdlUmVxdWVzdHMucHVzaChuKSx3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShyKSl9KSk7cmV0dXJuIGRjLnZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhlLmluaXRDb250ZXh0KX1jYXRjaChlKXt0aHJvdyB3aW5kb3cuY29uc29sZS5sb2coZSksZX19Z2V0VG9rZW5JbnRlcmFjdGl2ZShlKXtyZXR1cm4gdGhpcy5nZXRUb2tlbigiR2V0VG9rZW5Qb3B1cCIsZSl9Z2V0VG9rZW5TaWxlbnQoZSl7cmV0dXJuIHRoaXMuZ2V0VG9rZW4oIkdldFRva2VuIixlKX1hc3luYyBnZXRUb2tlbihlLHQpe2NvbnN0IHI9YXdhaXQgdGhpcy5zZW5kUmVxdWVzdChlLHt0b2tlblBhcmFtczp0fSk7cmV0dXJue3Rva2VuOmRjLnZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhyLnRva2VuKSxhY2NvdW50OmRjLnZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhyLmFjY291bnQpfX1nZXRIb3N0Q2FwYWJpbGl0aWVzKCl7cmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzPz9udWxsfWdldEFjY291bnRDb250ZXh0KCl7cmV0dXJuIHRoaXMuYWNjb3VudENvbnRleHQ/dGhpcy5hY2NvdW50Q29udGV4dDpudWxsfXN0YXRpYyBidWlsZFJlcXVlc3QoZSx0KXtyZXR1cm57bWVzc2FnZVR5cGU6Ik5lc3RlZEFwcEF1dGhSZXF1ZXN0IixtZXRob2Q6ZSxyZXF1ZXN0SWQ6b2EoKSxzZW5kVGltZTpEYXRlLm5vdygpLGNsaWVudExpYnJhcnk6aXMsY2xpZW50TGlicmFyeVZlcnNpb246JGEsLi4udH19c2VuZFJlcXVlc3QoZSx0KXtjb25zdCByPWRjLmJ1aWxkUmVxdWVzdChlLHQpO3JldHVybiBuZXcgUHJvbWlzZSgoKGUsdCk9Pntjb25zdCBuPXtyZXF1ZXN0SWQ6ci5yZXF1ZXN0SWQsbWV0aG9kOnIubWV0aG9kLHJlc29sdmU6ZSxyZWplY3Q6dH07ZGMuYnJpZGdlUmVxdWVzdHMucHVzaChuKSx3aW5kb3cubmVzdGVkQXBwQXV0aEJyaWRnZS5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShyKSl9KSl9c3RhdGljIHZhbGlkYXRlQnJpZGdlUmVzdWx0T3JUaHJvdyhlKXtpZih2b2lkIDA9PT1lKXt0aHJvd3tzdGF0dXM6aGN9fXJldHVybiBlfWNvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuc2RrTmFtZT1lLHRoaXMuc2RrVmVyc2lvbj10LHRoaXMuYWNjb3VudENvbnRleHQ9cix0aGlzLmNhcGFiaWxpdGllcz1ufXN0YXRpYyBhc3luYyBjcmVhdGUoKXtjb25zdCBlPWF3YWl0IGRjLmluaXRpYWxpemVOZXN0ZWRBcHBBdXRoQnJpZGdlKCk7cmV0dXJuIG5ldyBkYyhlLnNka05hbWUsZS5zZGtWZXJzaW9uLGUuYWNjb3VudENvbnRleHQsZS5jYXBhYmlsaXRpZXMpfX1kYy5icmlkZ2VSZXF1ZXN0cz1bXTtjbGFzcyB1YyBleHRlbmRzIHJje2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmJyaWRnZVByb3h5PXZvaWQgMCx0aGlzLmFjY291bnRDb250ZXh0PW51bGx9Z2V0TW9kdWxlTmFtZSgpe3JldHVybiB1Yy5NT0RVTEVfTkFNRX1nZXRJZCgpe3JldHVybiB1Yy5JRH1nZXRCcmlkZ2VQcm94eSgpe3JldHVybiB0aGlzLmJyaWRnZVByb3h5fWFzeW5jIGluaXRpYWxpemUoKXt0cnl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuX19pbml0aWFsaXplTmVzdGVkQXBwQXV0aCYmYXdhaXQgd2luZG93Ll9faW5pdGlhbGl6ZU5lc3RlZEFwcEF1dGgoKTtjb25zdCBlPWF3YWl0IGRjLmNyZWF0ZSgpO3RoaXMuYWNjb3VudENvbnRleHQ9ZS5nZXRBY2NvdW50Q29udGV4dCgpLHRoaXMuYnJpZGdlUHJveHk9ZSx0aGlzLmF2YWlsYWJsZT12b2lkIDAhPT1lfX1jYXRjaChlKXt0aGlzLmxvZ2dlci5pbmZvUGlpKGBDb3VsZCBub3QgaW5pdGlhbGl6ZSBOZXN0ZWQgQXBwIEF1dGggYnJpZGdlICgke2V9KWApfXJldHVybiB0aGlzLmxvZ2dlci5pbmZvKGBOZXN0ZWQgQXBwIEF1dGggQnJpZGdlIGF2YWlsYWJsZTogJHt0aGlzLmF2YWlsYWJsZX1gKSx0aGlzLmF2YWlsYWJsZX19dWMuTU9EVUxFX05BTUU9IiIsdWMuSUQ9Ik5lc3RlZEFwcE9wZXJhdGluZ0NvbnRleHQiO2NsYXNzIGdjIGV4dGVuZHMgcmN7Z2V0TW9kdWxlTmFtZSgpe3JldHVybiBnYy5NT0RVTEVfTkFNRX1nZXRJZCgpe3JldHVybiBnYy5JRH1hc3luYyBpbml0aWFsaXplKCl7cmV0dXJuIHRoaXMuYXZhaWxhYmxlPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHRoaXMuYXZhaWxhYmxlfX1nYy5NT0RVTEVfTkFNRT0iIixnYy5JRD0iU3RhbmRhcmRPcGVyYXRpbmdDb250ZXh0IjtjbGFzcyBwY3tjb25zdHJ1Y3Rvcigpe3RoaXMuZGJOYW1lPVVzLHRoaXMudmVyc2lvbj0xLHRoaXMudGFibGVOYW1lPUxzLHRoaXMuZGJPcGVuPSExfWFzeW5jIG9wZW4oKXtyZXR1cm4gbmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgcj13aW5kb3cuaW5kZXhlZERCLm9wZW4odGhpcy5kYk5hbWUsdGhpcy52ZXJzaW9uKTtyLmFkZEV2ZW50TGlzdGVuZXIoInVwZ3JhZGVuZWVkZWQiLChlPT57ZS50YXJnZXQucmVzdWx0LmNyZWF0ZU9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKX0pKSxyLmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCh0PT57Y29uc3Qgcj10O3RoaXMuZGI9ci50YXJnZXQucmVzdWx0LHRoaXMuZGJPcGVuPSEwLGUoKX0pKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoKCk9PnQoWmkoVWkpKSkpfSkpfWNsb3NlQ29ubmVjdGlvbigpe2NvbnN0IGU9dGhpcy5kYjtlJiZ0aGlzLmRiT3BlbiYmKGUuY2xvc2UoKSx0aGlzLmRiT3Blbj0hMSl9YXN5bmMgdmFsaWRhdGVEYklzT3Blbigpe2lmKCF0aGlzLmRiT3BlbilyZXR1cm4gdGhpcy5vcGVuKCl9YXN5bmMgZ2V0SXRlbShlKXtyZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZURiSXNPcGVuKCksbmV3IFByb21pc2UoKCh0LHIpPT57aWYoIXRoaXMuZGIpcmV0dXJuIHIoWmkoU2kpKTtjb25zdCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oW3RoaXMudGFibGVOYW1lXSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkuZ2V0KGUpO24uYWRkRXZlbnRMaXN0ZW5lcigic3VjY2VzcyIsKGU9Pntjb25zdCByPWU7dGhpcy5jbG9zZUNvbm5lY3Rpb24oKSx0KHIudGFyZ2V0LnJlc3VsdCl9KSksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGU9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoZSl9KSl9KSl9YXN5bmMgc2V0SXRlbShlLHQpe3JldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKSxuZXcgUHJvbWlzZSgoKHIsbik9PntpZighdGhpcy5kYilyZXR1cm4gbihaaShTaSkpO2NvbnN0IG89dGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCJyZWFkd3JpdGUiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkucHV0KHQsZSk7by5hZGRFdmVudExpc3RlbmVyKCJzdWNjZXNzIiwoKCk9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoKX0pKSxvLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZT0+e3RoaXMuY2xvc2VDb25uZWN0aW9uKCksbihlKX0pKX0pKX1hc3luYyByZW1vdmVJdGVtKGUpe3JldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKSxuZXcgUHJvbWlzZSgoKHQscik9PntpZighdGhpcy5kYilyZXR1cm4gcihaaShTaSkpO2NvbnN0IG49dGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCJyZWFkd3JpdGUiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkuZGVsZXRlKGUpO24uYWRkRXZlbnRMaXN0ZW5lcigic3VjY2VzcyIsKCgpPT57dGhpcy5jbG9zZUNvbm5lY3Rpb24oKSx0KCl9KSksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGU9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoZSl9KSl9KSl9YXN5bmMgZ2V0S2V5cygpe3JldHVybiBhd2FpdCB0aGlzLnZhbGlkYXRlRGJJc09wZW4oKSxuZXcgUHJvbWlzZSgoKGUsdCk9PntpZighdGhpcy5kYilyZXR1cm4gdChaaShTaSkpO2NvbnN0IHI9dGhpcy5kYi50cmFuc2FjdGlvbihbdGhpcy50YWJsZU5hbWVdLCJyZWFkb25seSIpLm9iamVjdFN0b3JlKHRoaXMudGFibGVOYW1lKS5nZXRBbGxLZXlzKCk7ci5hZGRFdmVudExpc3RlbmVyKCJzdWNjZXNzIiwodD0+e2NvbnN0IHI9dDt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLGUoci50YXJnZXQucmVzdWx0KX0pKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoZT0+e3RoaXMuY2xvc2VDb25uZWN0aW9uKCksdChlKX0pKX0pKX1hc3luYyBjb250YWluc0tleShlKXtyZXR1cm4gYXdhaXQgdGhpcy52YWxpZGF0ZURiSXNPcGVuKCksbmV3IFByb21pc2UoKCh0LHIpPT57aWYoIXRoaXMuZGIpcmV0dXJuIHIoWmkoU2kpKTtjb25zdCBuPXRoaXMuZGIudHJhbnNhY3Rpb24oW3RoaXMudGFibGVOYW1lXSwicmVhZG9ubHkiKS5vYmplY3RTdG9yZSh0aGlzLnRhYmxlTmFtZSkuY291bnQoZSk7bi5hZGRFdmVudExpc3RlbmVyKCJzdWNjZXNzIiwoZT0+e2NvbnN0IHI9ZTt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHQoMT09PXIudGFyZ2V0LnJlc3VsdCl9KSksbi5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsKGU9Pnt0aGlzLmNsb3NlQ29ubmVjdGlvbigpLHIoZSl9KSl9KSl9YXN5bmMgZGVsZXRlRGF0YWJhc2UoKXtyZXR1cm4gdGhpcy5kYiYmdGhpcy5kYk9wZW4mJnRoaXMuY2xvc2VDb25uZWN0aW9uKCksbmV3IFByb21pc2UoKChlLHQpPT57Y29uc3Qgcj13aW5kb3cuaW5kZXhlZERCLmRlbGV0ZURhdGFiYXNlKFVzKSxuPXNldFRpbWVvdXQoKCgpPT50KCExKSksMjAwKTtyLmFkZEV2ZW50TGlzdGVuZXIoInN1Y2Nlc3MiLCgoKT0+KGNsZWFyVGltZW91dChuKSxlKCEwKSkpKSxyLmFkZEV2ZW50TGlzdGVuZXIoImJsb2NrZWQiLCgoKT0+KGNsZWFyVGltZW91dChuKSxlKCEwKSkpKSxyLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIiwoKCk9PihjbGVhclRpbWVvdXQobiksdCghMSkpKSl9KSl9fWNsYXNzIG1je2NvbnN0cnVjdG9yKCl7dGhpcy5jYWNoZT1uZXcgTWFwfWFzeW5jIGluaXRpYWxpemUoKXt9Z2V0SXRlbShlKXtyZXR1cm4gdGhpcy5jYWNoZS5nZXQoZSl8fG51bGx9Z2V0VXNlckRhdGEoZSl7cmV0dXJuIHRoaXMuZ2V0SXRlbShlKX1zZXRJdGVtKGUsdCl7dGhpcy5jYWNoZS5zZXQoZSx0KX1hc3luYyBzZXRVc2VyRGF0YShlLHQpe3RoaXMuc2V0SXRlbShlLHQpfXJlbW92ZUl0ZW0oZSl7dGhpcy5jYWNoZS5kZWxldGUoZSl9Z2V0S2V5cygpe2NvbnN0IGU9W107cmV0dXJuIHRoaXMuY2FjaGUuZm9yRWFjaCgoKHQscik9PntlLnB1c2gocil9KSksZX1jb250YWluc0tleShlKXtyZXR1cm4gdGhpcy5jYWNoZS5oYXMoZSl9Y2xlYXIoKXt0aGlzLmNhY2hlLmNsZWFyKCl9ZGVjcnlwdERhdGEoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpfX1jbGFzcyBmY3tjb25zdHJ1Y3RvcihlKXt0aGlzLmluTWVtb3J5Q2FjaGU9bmV3IG1jLHRoaXMuaW5kZXhlZERCQ2FjaGU9bmV3IHBjLHRoaXMubG9nZ2VyPWV9aGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKXtpZighKGUgaW5zdGFuY2VvZiBYaSYmZS5lcnJvckNvZGU9PT1VaSkpdGhyb3cgZTt0aGlzLmxvZ2dlci5lcnJvcigiQ291bGQgbm90IGFjY2VzcyBwZXJzaXN0ZW50IHN0b3JhZ2UuIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBicm93c2VyIHByaXZhY3kgZmVhdHVyZXMgd2hpY2ggYmxvY2sgcGVyc2lzdGVudCBzdG9yYWdlIGluIHRoaXJkLXBhcnR5IGNvbnRleHRzLiIpfWFzeW5jIGdldEl0ZW0oZSl7Y29uc3QgdD10aGlzLmluTWVtb3J5Q2FjaGUuZ2V0SXRlbShlKTtpZighdCl0cnl7cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlF1ZXJpZWQgaXRlbSBub3QgZm91bmQgaW4gaW4tbWVtb3J5IGNhY2hlLCBub3cgcXVlcnlpbmcgcGVyc2lzdGVudCBzdG9yYWdlLiIpLGF3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuZ2V0SXRlbShlKX1jYXRjaChlKXt0aGlzLmhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZSl9cmV0dXJuIHR9YXN5bmMgc2V0SXRlbShlLHQpe3RoaXMuaW5NZW1vcnlDYWNoZS5zZXRJdGVtKGUsdCk7dHJ5e2F3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuc2V0SXRlbShlLHQpfWNhdGNoKGUpe3RoaXMuaGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKX19YXN5bmMgcmVtb3ZlSXRlbShlKXt0aGlzLmluTWVtb3J5Q2FjaGUucmVtb3ZlSXRlbShlKTt0cnl7YXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5yZW1vdmVJdGVtKGUpfWNhdGNoKGUpe3RoaXMuaGFuZGxlRGF0YWJhc2VBY2Nlc3NFcnJvcihlKX19YXN5bmMgZ2V0S2V5cygpe2NvbnN0IGU9dGhpcy5pbk1lbW9yeUNhY2hlLmdldEtleXMoKTtpZigwPT09ZS5sZW5ndGgpdHJ5e3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJJbi1tZW1vcnkgY2FjaGUgaXMgZW1wdHksIG5vdyBxdWVyeWluZyBwZXJzaXN0ZW50IHN0b3JhZ2UuIiksYXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5nZXRLZXlzKCl9Y2F0Y2goZSl7dGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpfXJldHVybiBlfWFzeW5jIGNvbnRhaW5zS2V5KGUpe2NvbnN0IHQ9dGhpcy5pbk1lbW9yeUNhY2hlLmNvbnRhaW5zS2V5KGUpO2lmKCF0KXRyeXtyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiS2V5IG5vdCBmb3VuZCBpbiBpbi1tZW1vcnkgY2FjaGUsIG5vdyBxdWVyeWluZyBwZXJzaXN0ZW50IHN0b3JhZ2UuIiksYXdhaXQgdGhpcy5pbmRleGVkREJDYWNoZS5jb250YWluc0tleShlKX1jYXRjaChlKXt0aGlzLmhhbmRsZURhdGFiYXNlQWNjZXNzRXJyb3IoZSl9cmV0dXJuIHR9Y2xlYXJJbk1lbW9yeSgpe3RoaXMubG9nZ2VyLnZlcmJvc2UoIkRlbGV0aW5nIGluLW1lbW9yeSBrZXlzdG9yZSIpLHRoaXMuaW5NZW1vcnlDYWNoZS5jbGVhcigpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIkluLW1lbW9yeSBrZXlzdG9yZSBkZWxldGVkIil9YXN5bmMgY2xlYXJQZXJzaXN0ZW50KCl7dHJ5e3RoaXMubG9nZ2VyLnZlcmJvc2UoIkRlbGV0aW5nIHBlcnNpc3RlbnQga2V5c3RvcmUiKTtjb25zdCBlPWF3YWl0IHRoaXMuaW5kZXhlZERCQ2FjaGUuZGVsZXRlRGF0YWJhc2UoKTtyZXR1cm4gZSYmdGhpcy5sb2dnZXIudmVyYm9zZSgiUGVyc2lzdGVudCBrZXlzdG9yZSBkZWxldGVkIiksZX1jYXRjaChlKXtyZXR1cm4gdGhpcy5oYW5kbGVEYXRhYmFzZUFjY2Vzc0Vycm9yKGUpLCExfX19Y2xhc3MgeWN7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMubG9nZ2VyPWUsZnVuY3Rpb24oZSl7aWYoIXdpbmRvdyl0aHJvdyBaaShraSk7aWYoIXdpbmRvdy5jcnlwdG8pdGhyb3cgWmkoZWkpO2lmKCFlJiYhd2luZG93LmNyeXB0by5zdWJ0bGUpdGhyb3cgWmkoZWksImNyeXB0b19zdWJ0bGVfdW5kZWZpbmVkIil9KHI/PyExKSx0aGlzLmNhY2hlPW5ldyBmYyh0aGlzLmxvZ2dlciksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10fWNyZWF0ZU5ld0d1aWQoKXtyZXR1cm4gb2EoKX1iYXNlNjRFbmNvZGUoZSl7cmV0dXJuIEZzKGUpfWJhc2U2NERlY29kZShlKXtyZXR1cm4gS3MoZSl9YmFzZTY0VXJsRW5jb2RlKGUpe3JldHVybiB4cyhlKX1lbmNvZGVLaWQoZSl7cmV0dXJuIHRoaXMuYmFzZTY0VXJsRW5jb2RlKEpTT04uc3RyaW5naWZ5KHtraWQ6ZX0pKX1hc3luYyBnZXRQdWJsaWNLZXlUaHVtYnByaW50KGUpe2NvbnN0IHQ9dGhpcy5wZXJmb3JtYW5jZUNsaWVudD8uc3RhcnRNZWFzdXJlbWVudChPci5DcnlwdG9PcHRzR2V0UHVibGljS2V5VGh1bWJwcmludCxlLmNvcnJlbGF0aW9uSWQpLHI9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuZ2VuZXJhdGVLZXkoZWEsZSx0KX0oeWMuRVhUUkFDVEFCTEUseWMuUE9QX0tFWV9VU0FHRVMpLG49YXdhaXQgaWEoci5wdWJsaWNLZXkpLG89Q2Moe2U6bi5lLGt0eTpuLmt0eSxuOm4ubn0pLGk9YXdhaXQgdGhpcy5oYXNoU3RyaW5nKG8pLHM9YXdhaXQgaWEoci5wcml2YXRlS2V5KSxhPWF3YWl0IGFzeW5jIGZ1bmN0aW9uKGUsdCxyKXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuaW1wb3J0S2V5KCJqd2siLGUsZWEsdCxyKX0ocywhMSxbInNpZ24iXSk7cmV0dXJuIGF3YWl0IHRoaXMuY2FjaGUuc2V0SXRlbShpLHtwcml2YXRlS2V5OmEscHVibGljS2V5OnIucHVibGljS2V5LHJlcXVlc3RNZXRob2Q6ZS5yZXNvdXJjZVJlcXVlc3RNZXRob2QscmVxdWVzdFVyaTplLnJlc291cmNlUmVxdWVzdFVyaX0pLHQmJnQuZW5kKHtzdWNjZXNzOiEwfSksaX1hc3luYyByZW1vdmVUb2tlbkJpbmRpbmdLZXkoZSl7YXdhaXQgdGhpcy5jYWNoZS5yZW1vdmVJdGVtKGUpO2lmKGF3YWl0IHRoaXMuY2FjaGUuY29udGFpbnNLZXkoZSkpdGhyb3cgbXQocnQpfWFzeW5jIGNsZWFyS2V5c3RvcmUoKXt0aGlzLmNhY2hlLmNsZWFySW5NZW1vcnkoKTt0cnl7cmV0dXJuIGF3YWl0IHRoaXMuY2FjaGUuY2xlYXJQZXJzaXN0ZW50KCksITB9Y2F0Y2goZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBFcnJvcj90aGlzLmxvZ2dlci5lcnJvcihgQ2xlYXJpbmcga2V5c3RvcmUgZmFpbGVkIHdpdGggZXJyb3I6ICR7ZS5tZXNzYWdlfWApOnRoaXMubG9nZ2VyLmVycm9yKCJDbGVhcmluZyBrZXlzdG9yZSBmYWlsZWQgd2l0aCB1bmtub3duIGVycm9yIiksITF9fWFzeW5jIHNpZ25Kd3QoZSx0LHIsbil7Y29uc3Qgbz10aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5zdGFydE1lYXN1cmVtZW50KE9yLkNyeXB0b09wdHNTaWduSnd0LG4pLGk9YXdhaXQgdGhpcy5jYWNoZS5nZXRJdGVtKHQpO2lmKCFpKXRocm93IFppKE1pKTtjb25zdCBzPWF3YWl0IGlhKGkucHVibGljS2V5KSxhPUNjKHMpLGM9eHMoSlNPTi5zdHJpbmdpZnkoe2tpZDp0fSkpLGw9eHMoam8uZ2V0U2hySGVhZGVyU3RyaW5nKHsuLi5yPy5oZWFkZXIsYWxnOnMuYWxnLGtpZDpjfSkpO2UuY25mPXtqd2s6SlNPTi5wYXJzZShhKX07Y29uc3QgaD1gJHtsfS4ke3hzKEpTT04uc3RyaW5naWZ5KGUpKX1gLGQ9KG5ldyBUZXh0RW5jb2RlcikuZW5jb2RlKGgpLHU9YXdhaXQgYXN5bmMgZnVuY3Rpb24oZSx0KXtyZXR1cm4gd2luZG93LmNyeXB0by5zdWJ0bGUuc2lnbihlYSxlLHQpfShpLnByaXZhdGVLZXksZCksZz1gJHtofS4ke0JzKG5ldyBVaW50OEFycmF5KHUpKX1gO3JldHVybiBvJiZvLmVuZCh7c3VjY2VzczohMH0pLGd9YXN5bmMgaGFzaFN0cmluZyhlKXtyZXR1cm4gZ2EoZSl9fWZ1bmN0aW9uIENjKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlLE9iamVjdC5rZXlzKGUpLnNvcnQoKSl9eWMuUE9QX0tFWV9VU0FHRVM9WyJzaWduIiwidmVyaWZ5Il0seWMuRVhUUkFDVEFCTEU9ITA7Y29uc3Qgd2M9ODY0ZTUsdmM9IkxheCIsSWM9Ik5vbmUiO2NsYXNzIFRje2luaXRpYWxpemUoKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9Z2V0SXRlbShlKXtjb25zdCB0PWAke2VuY29kZVVSSUNvbXBvbmVudChlKX1gLHI9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7Iik7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDtlKyspe2NvbnN0IG49cltlXSxbbywuLi5pXT1kZWNvZGVVUklDb21wb25lbnQobikudHJpbSgpLnNwbGl0KCI9Iikscz1pLmpvaW4oIj0iKTtpZihvPT09dClyZXR1cm4gc31yZXR1cm4iIn1nZXRVc2VyRGF0YSgpe3Rocm93IG10KGN0KX1zZXRJdGVtKGUsdCxyLG49ITAsbz12Yyl7bGV0IGk9YCR7ZW5jb2RlVVJJQ29tcG9uZW50KGUpfT0ke2VuY29kZVVSSUNvbXBvbmVudCh0KX07cGF0aD0vO1NhbWVTaXRlPSR7b307YDtpZihyKXtjb25zdCBlPWZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IERhdGUscj1uZXcgRGF0ZSh0LmdldFRpbWUoKStlKndjKTtyZXR1cm4gci50b1VUQ1N0cmluZygpfShyKTtpKz1gZXhwaXJlcz0ke2V9O2B9KG58fG89PT1JYykmJihpKz0iU2VjdXJlOyIpLGRvY3VtZW50LmNvb2tpZT1pfWFzeW5jIHNldFVzZXJEYXRhKCl7cmV0dXJuIFByb21pc2UucmVqZWN0KG10KGN0KSl9cmVtb3ZlSXRlbShlKXt0aGlzLnNldEl0ZW0oZSwiIiwtMSl9Z2V0S2V5cygpe2NvbnN0IGU9ZG9jdW1lbnQuY29va2llLnNwbGl0KCI7IiksdD1bXTtyZXR1cm4gZS5mb3JFYWNoKChlPT57Y29uc3Qgcj1kZWNvZGVVUklDb21wb25lbnQoZSkudHJpbSgpLnNwbGl0KCI9Iik7dC5wdXNoKHJbMF0pfSkpLHR9Y29udGFpbnNLZXkoZSl7cmV0dXJuIHRoaXMuZ2V0S2V5cygpLmluY2x1ZGVzKGUpfWRlY3J5cHREYXRhKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKX19ZnVuY3Rpb24gQWMoZSx0KXtjb25zdCByPWUuZ2V0SXRlbShlYyh0KSk7cmV0dXJuIHI/SlNPTi5wYXJzZShyKTpbXX1mdW5jdGlvbiBrYyhlLHQscil7Y29uc3Qgbj10LmdldEl0ZW0odGMoZSxyKSk7aWYobil7Y29uc3QgZT1KU09OLnBhcnNlKG4pO2lmKGUmJmUuaGFzT3duUHJvcGVydHkoImlkVG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWNjZXNzVG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgicmVmcmVzaFRva2VuIikpcmV0dXJuIGV9cmV0dXJue2lkVG9rZW46W10sYWNjZXNzVG9rZW46W10scmVmcmVzaFRva2VuOltdfX1mdW5jdGlvbiBTYyhlKXtyZXR1cm4gZS5oYXNPd25Qcm9wZXJ0eSgiaWQiKSYmZS5oYXNPd25Qcm9wZXJ0eSgibm9uY2UiKSYmZS5oYXNPd25Qcm9wZXJ0eSgiZGF0YSIpfWNvbnN0IGJjPSJtc2FsLmNhY2hlLmVuY3J5cHRpb24iO2NsYXNzIEVje2NvbnN0cnVjdG9yKGUsdCxyKXtpZighd2luZG93LmxvY2FsU3RvcmFnZSl0aHJvdyBJYShwYSk7dGhpcy5tZW1vcnlTdG9yYWdlPW5ldyBtYyx0aGlzLmluaXRpYWxpemVkPSExLHRoaXMuY2xpZW50SWQ9ZSx0aGlzLmxvZ2dlcj10LHRoaXMucGVyZm9ybWFuY2VDbGllbnQ9cix0aGlzLmJyb2FkY2FzdD1uZXcgQnJvYWRjYXN0Q2hhbm5lbCgibXNhbC5icm9hZGNhc3QuY2FjaGUiKX1hc3luYyBpbml0aWFsaXplKGUpe2NvbnN0IHQ9bmV3IFRjLHI9dC5nZXRJdGVtKGJjKTtsZXQgbj17a2V5OiIiLGlkOiIifTtpZihyKXRyeXtuPUpTT04ucGFyc2Uocil9Y2F0Y2goZSl7fWlmKG4ua2V5JiZuLmlkKXtjb25zdCB0PU5uKEdzLE9yLkJhc2U2NERlY29kZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKG4ua2V5KTt0aGlzLmVuY3J5cHRpb25Db29raWU9e2lkOm4uaWQsa2V5OmF3YWl0IFVuKGxhLE9yLkdlbmVyYXRlSEtERix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKHQpfX1lbHNle2NvbnN0IHI9b2EoKSxuPWF3YWl0IFVuKGNhLE9yLkdlbmVyYXRlQmFzZUtleSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKCksbz1ObihCcyxPci5VcmxFbmNvZGVBcnIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlKShuZXcgVWludDhBcnJheShuKSk7dGhpcy5lbmNyeXB0aW9uQ29va2llPXtpZDpyLGtleTphd2FpdCBVbihsYSxPci5HZW5lcmF0ZUhLREYsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlKShuKX07Y29uc3QgaT17aWQ6cixrZXk6b307dC5zZXRJdGVtKGJjLEpTT04uc3RyaW5naWZ5KGkpLDAsITAsSWMpfWF3YWl0IFVuKHRoaXMuaW1wb3J0RXhpc3RpbmdDYWNoZS5iaW5kKHRoaXMpLE9yLkltcG9ydEV4aXN0aW5nQ2FjaGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlKShlKSx0aGlzLmJyb2FkY2FzdC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLnVwZGF0ZUNhY2hlLmJpbmQodGhpcykpLHRoaXMuaW5pdGlhbGl6ZWQ9ITB9Z2V0SXRlbShlKXtyZXR1cm4gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKGUpfWdldFVzZXJEYXRhKGUpe2lmKCF0aGlzLmluaXRpYWxpemVkKXRocm93IFppKEJpKTtyZXR1cm4gdGhpcy5tZW1vcnlTdG9yYWdlLmdldEl0ZW0oZSl9YXN5bmMgZGVjcnlwdERhdGEoZSx0LHIpe2lmKCF0aGlzLmluaXRpYWxpemVkfHwhdGhpcy5lbmNyeXB0aW9uQ29va2llKXRocm93IFppKEJpKTtpZih0LmlkIT09dGhpcy5lbmNyeXB0aW9uQ29va2llLmlkKXJldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7ZW5jcnlwdGVkQ2FjaGVFeHBpcmVkQ291bnQ6MX0sciksbnVsbDtjb25zdCBuPWF3YWl0IFVuKHVhLE9yLkRlY3J5cHQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxyKSh0aGlzLmVuY3J5cHRpb25Db29raWUua2V5LHQubm9uY2UsdGhpcy5nZXRDb250ZXh0KGUpLHQuZGF0YSk7aWYoIW4pcmV0dXJuIG51bGw7dHJ5e3JldHVybnsuLi5KU09OLnBhcnNlKG4pLGxhc3RVcGRhdGVkQXQ6dC5sYXN0VXBkYXRlZEF0fX1jYXRjaChlKXtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe2VuY3J5cHRlZENhY2hlQ29ycnVwdGlvbkNvdW50OjF9LHIpLG51bGx9fXNldEl0ZW0oZSx0KXt3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oZSx0KX1hc3luYyBzZXRVc2VyRGF0YShlLHQscixuLG8pe2lmKCF0aGlzLmluaXRpYWxpemVkfHwhdGhpcy5lbmNyeXB0aW9uQ29va2llKXRocm93IFppKEJpKTtpZihvKXRoaXMuc2V0SXRlbShlLHQpO2Vsc2V7Y29uc3R7ZGF0YTpvLG5vbmNlOml9PWF3YWl0IFVuKGRhLE9yLkVuY3J5cHQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxyKSh0aGlzLmVuY3J5cHRpb25Db29raWUua2V5LHQsdGhpcy5nZXRDb250ZXh0KGUpKSxzPXtpZDp0aGlzLmVuY3J5cHRpb25Db29raWUuaWQsbm9uY2U6aSxkYXRhOm8sbGFzdFVwZGF0ZWRBdDpufTt0aGlzLnNldEl0ZW0oZSxKU09OLnN0cmluZ2lmeShzKSl9dGhpcy5tZW1vcnlTdG9yYWdlLnNldEl0ZW0oZSx0KSx0aGlzLmJyb2FkY2FzdC5wb3N0TWVzc2FnZSh7a2V5OmUsdmFsdWU6dCxjb250ZXh0OnRoaXMuZ2V0Q29udGV4dChlKX0pfXJlbW92ZUl0ZW0oZSl7dGhpcy5tZW1vcnlTdG9yYWdlLmNvbnRhaW5zS2V5KGUpJiYodGhpcy5tZW1vcnlTdG9yYWdlLnJlbW92ZUl0ZW0oZSksdGhpcy5icm9hZGNhc3QucG9zdE1lc3NhZ2Uoe2tleTplLHZhbHVlOm51bGwsY29udGV4dDp0aGlzLmdldENvbnRleHQoZSl9KSksd2luZG93LmxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXMod2luZG93LmxvY2FsU3RvcmFnZSl9Y29udGFpbnNLZXkoZSl7cmV0dXJuIHdpbmRvdy5sb2NhbFN0b3JhZ2UuaGFzT3duUHJvcGVydHkoZSl9Y2xlYXIoKXt0aGlzLm1lbW9yeVN0b3JhZ2UuY2xlYXIoKTtBYyh0aGlzKS5mb3JFYWNoKChlPT50aGlzLnJlbW92ZUl0ZW0oZSkpKTtjb25zdCBlPWtjKHRoaXMuY2xpZW50SWQsdGhpcyk7ZS5pZFRva2VuLmZvckVhY2goKGU9PnRoaXMucmVtb3ZlSXRlbShlKSkpLGUuYWNjZXNzVG9rZW4uZm9yRWFjaCgoZT0+dGhpcy5yZW1vdmVJdGVtKGUpKSksZS5yZWZyZXNoVG9rZW4uZm9yRWFjaCgoZT0+dGhpcy5yZW1vdmVJdGVtKGUpKSksdGhpcy5nZXRLZXlzKCkuZm9yRWFjaCgoZT0+eyhlLnN0YXJ0c1dpdGgoUWEpfHwtMSE9PWUuaW5kZXhPZih0aGlzLmNsaWVudElkKSkmJnRoaXMucmVtb3ZlSXRlbShlKX0pKX1hc3luYyBpbXBvcnRFeGlzdGluZ0NhY2hlKGUpe2lmKCF0aGlzLmVuY3J5cHRpb25Db29raWUpcmV0dXJuO2xldCB0PUFjKHRoaXMpO3Q9YXdhaXQgdGhpcy5pbXBvcnRBcnJheSh0LGUpLHQubGVuZ3RoP3RoaXMuc2V0SXRlbShlYygpLEpTT04uc3RyaW5naWZ5KHQpKTp0aGlzLnJlbW92ZUl0ZW0oZWMoKSk7Y29uc3Qgcj1rYyh0aGlzLmNsaWVudElkLHRoaXMpO3IuaWRUb2tlbj1hd2FpdCB0aGlzLmltcG9ydEFycmF5KHIuaWRUb2tlbixlKSxyLmFjY2Vzc1Rva2VuPWF3YWl0IHRoaXMuaW1wb3J0QXJyYXkoci5hY2Nlc3NUb2tlbixlKSxyLnJlZnJlc2hUb2tlbj1hd2FpdCB0aGlzLmltcG9ydEFycmF5KHIucmVmcmVzaFRva2VuLGUpLHIuaWRUb2tlbi5sZW5ndGh8fHIuYWNjZXNzVG9rZW4ubGVuZ3RofHxyLnJlZnJlc2hUb2tlbi5sZW5ndGg/dGhpcy5zZXRJdGVtKHRjKHRoaXMuY2xpZW50SWQpLEpTT04uc3RyaW5naWZ5KHIpKTp0aGlzLnJlbW92ZUl0ZW0odGModGhpcy5jbGllbnRJZCkpfWFzeW5jIGdldEl0ZW1Gcm9tRW5jcnlwdGVkQ2FjaGUoZSx0KXtpZighdGhpcy5lbmNyeXB0aW9uQ29va2llKXJldHVybiBudWxsO2NvbnN0IHI9dGhpcy5nZXRJdGVtKGUpO2lmKCFyKXJldHVybiBudWxsO2xldCBuO3RyeXtuPUpTT04ucGFyc2Uocil9Y2F0Y2goZSl7cmV0dXJuIG51bGx9cmV0dXJuIFNjKG4pP24uaWQhPT10aGlzLmVuY3J5cHRpb25Db29raWUuaWQ/KHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtlbmNyeXB0ZWRDYWNoZUV4cGlyZWRDb3VudDoxfSx0KSxudWxsKToodGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe2VuY3J5cHRlZENhY2hlQ291bnQ6MX0sdCksVW4odWEsT3IuRGVjcnlwdCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHRoaXMuZW5jcnlwdGlvbkNvb2tpZS5rZXksbi5ub25jZSx0aGlzLmdldENvbnRleHQoZSksbi5kYXRhKSk6KHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHt1bmVuY3J5cHRlZENhY2hlQ291bnQ6MX0sdCkscil9YXN5bmMgaW1wb3J0QXJyYXkoZSx0KXtjb25zdCByPVtdLG49W107cmV0dXJuIGUuZm9yRWFjaCgoZT0+e2NvbnN0IG89dGhpcy5nZXRJdGVtRnJvbUVuY3J5cHRlZENhY2hlKGUsdCkudGhlbigodD0+e3Q/KHRoaXMubWVtb3J5U3RvcmFnZS5zZXRJdGVtKGUsdCksci5wdXNoKGUpKTp0aGlzLnJlbW92ZUl0ZW0oZSl9KSk7bi5wdXNoKG8pfSkpLGF3YWl0IFByb21pc2UuYWxsKG4pLHJ9Z2V0Q29udGV4dChlKXtsZXQgdD0iIjtyZXR1cm4gZS5pbmNsdWRlcyh0aGlzLmNsaWVudElkKSYmKHQ9dGhpcy5jbGllbnRJZCksdH11cGRhdGVDYWNoZShlKXt0aGlzLmxvZ2dlci50cmFjZSgiVXBkYXRpbmcgaW50ZXJuYWwgY2FjaGUgZnJvbSBicm9hZGNhc3QgZXZlbnQiKTtjb25zdCB0PXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5Mb2NhbFN0b3JhZ2VVcGRhdGVkKTt0LmFkZCh7aXNCYWNrZ3JvdW5kOiEwfSk7Y29uc3R7a2V5OnIsdmFsdWU6bixjb250ZXh0Om99PWUuZGF0YTtyZXR1cm4gcj9vJiZvIT09dGhpcy5jbGllbnRJZD8odGhpcy5sb2dnZXIudHJhY2UoYElnbm9yaW5nIGJyb2FkY2FzdCBldmVudCBmcm9tIGNsaWVudElkOiAke299YCksdm9pZCB0LmVuZCh7c3VjY2VzczohMSxlcnJvckNvZGU6ImNvbnRleHRNaXNtYXRjaCJ9KSk6KG4/KHRoaXMubWVtb3J5U3RvcmFnZS5zZXRJdGVtKHIsbiksdGhpcy5sb2dnZXIudmVyYm9zZSgiVXBkYXRlZCBpdGVtIGluIGludGVybmFsIGNhY2hlIikpOih0aGlzLm1lbW9yeVN0b3JhZ2UucmVtb3ZlSXRlbShyKSx0aGlzLmxvZ2dlci52ZXJib3NlKCJSZW1vdmVkIGl0ZW0gZnJvbSBpbnRlcm5hbCBjYWNoZSIpKSx2b2lkIHQuZW5kKHtzdWNjZXNzOiEwfSkpOih0aGlzLmxvZ2dlci5lcnJvcigiQnJvYWRjYXN0IGV2ZW50IG1pc3Npbmcga2V5Iiksdm9pZCB0LmVuZCh7c3VjY2VzczohMSxlcnJvckNvZGU6Im5vS2V5In0pKX19Y2xhc3MgUmN7Y29uc3RydWN0b3IoKXtpZighd2luZG93LnNlc3Npb25TdG9yYWdlKXRocm93IElhKHBhKX1hc3luYyBpbml0aWFsaXplKCl7fWdldEl0ZW0oZSl7cmV0dXJuIHdpbmRvdy5zZXNzaW9uU3RvcmFnZS5nZXRJdGVtKGUpfWdldFVzZXJEYXRhKGUpe3JldHVybiB0aGlzLmdldEl0ZW0oZSl9c2V0SXRlbShlLHQpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5zZXRJdGVtKGUsdCl9YXN5bmMgc2V0VXNlckRhdGEoZSx0KXt0aGlzLnNldEl0ZW0oZSx0KX1yZW1vdmVJdGVtKGUpe3dpbmRvdy5zZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEtleXMoKXtyZXR1cm4gT2JqZWN0LmtleXMod2luZG93LnNlc3Npb25TdG9yYWdlKX1jb250YWluc0tleShlKXtyZXR1cm4gd2luZG93LnNlc3Npb25TdG9yYWdlLmhhc093blByb3BlcnR5KGUpfWRlY3J5cHREYXRhKCl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKX19Y29uc3QgX2M9e0lOSVRJQUxJWkVfU1RBUlQ6Im1zYWw6aW5pdGlhbGl6ZVN0YXJ0IixJTklUSUFMSVpFX0VORDoibXNhbDppbml0aWFsaXplRW5kIixBQ0NPVU5UX0FEREVEOiJtc2FsOmFjY291bnRBZGRlZCIsQUNDT1VOVF9SRU1PVkVEOiJtc2FsOmFjY291bnRSZW1vdmVkIixBQ1RJVkVfQUNDT1VOVF9DSEFOR0VEOiJtc2FsOmFjdGl2ZUFjY291bnRDaGFuZ2VkIixMT0dJTl9TVEFSVDoibXNhbDpsb2dpblN0YXJ0IixMT0dJTl9TVUNDRVNTOiJtc2FsOmxvZ2luU3VjY2VzcyIsTE9HSU5fRkFJTFVSRToibXNhbDpsb2dpbkZhaWx1cmUiLEFDUVVJUkVfVE9LRU5fU1RBUlQ6Im1zYWw6YWNxdWlyZVRva2VuU3RhcnQiLEFDUVVJUkVfVE9LRU5fU1VDQ0VTUzoibXNhbDphY3F1aXJlVG9rZW5TdWNjZXNzIixBQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6Im1zYWw6YWNxdWlyZVRva2VuRmFpbHVyZSIsQUNRVUlSRV9UT0tFTl9ORVRXT1JLX1NUQVJUOiJtc2FsOmFjcXVpcmVUb2tlbkZyb21OZXR3b3JrU3RhcnQiLFNTT19TSUxFTlRfU1RBUlQ6Im1zYWw6c3NvU2lsZW50U3RhcnQiLFNTT19TSUxFTlRfU1VDQ0VTUzoibXNhbDpzc29TaWxlbnRTdWNjZXNzIixTU09fU0lMRU5UX0ZBSUxVUkU6Im1zYWw6c3NvU2lsZW50RmFpbHVyZSIsQUNRVUlSRV9UT0tFTl9CWV9DT0RFX1NUQVJUOiJtc2FsOmFjcXVpcmVUb2tlbkJ5Q29kZVN0YXJ0IixBQ1FVSVJFX1RPS0VOX0JZX0NPREVfU1VDQ0VTUzoibXNhbDphY3F1aXJlVG9rZW5CeUNvZGVTdWNjZXNzIixBQ1FVSVJFX1RPS0VOX0JZX0NPREVfRkFJTFVSRToibXNhbDphY3F1aXJlVG9rZW5CeUNvZGVGYWlsdXJlIixIQU5ETEVfUkVESVJFQ1RfU1RBUlQ6Im1zYWw6aGFuZGxlUmVkaXJlY3RTdGFydCIsSEFORExFX1JFRElSRUNUX0VORDoibXNhbDpoYW5kbGVSZWRpcmVjdEVuZCIsUE9QVVBfT1BFTkVEOiJtc2FsOnBvcHVwT3BlbmVkIixMT0dPVVRfU1RBUlQ6Im1zYWw6bG9nb3V0U3RhcnQiLExPR09VVF9TVUNDRVNTOiJtc2FsOmxvZ291dFN1Y2Nlc3MiLExPR09VVF9GQUlMVVJFOiJtc2FsOmxvZ291dEZhaWx1cmUiLExPR09VVF9FTkQ6Im1zYWw6bG9nb3V0RW5kIixSRVNUT1JFX0ZST01fQkZDQUNIRToibXNhbDpyZXN0b3JlRnJvbUJGQ2FjaGUiLEJST0tFUl9DT05ORUNUSU9OX0VTVEFCTElTSEVEOiJtc2FsOmJyb2tlckNvbm5lY3Rpb25Fc3RhYmxpc2hlZCJ9O2Z1bmN0aW9uIFBjKGUsdCl7Y29uc3Qgcj1lLmluZGV4T2YodCk7cj4tMSYmZS5zcGxpY2UociwxKX1jbGFzcyBNYyBleHRlbmRzIFBye2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMpe3N1cGVyKGUscixuLG8scyksdGhpcy5jYWNoZUNvbmZpZz10LHRoaXMubG9nZ2VyPW4sdGhpcy5pbnRlcm5hbFN0b3JhZ2U9bmV3IG1jLHRoaXMuYnJvd3NlclN0b3JhZ2U9T2MoZSx0LmNhY2hlTG9jYXRpb24sbixvKSx0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZT1PYyhlLHQudGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbixuLG8pLHRoaXMuY29va2llU3RvcmFnZT1uZXcgVGMsdGhpcy5ldmVudEhhbmRsZXI9aX1hc3luYyBpbml0aWFsaXplKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtjYWNoZUxvY2F0aW9uOnRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbixjYWNoZVJldGVudGlvbkRheXM6dGhpcy5jYWNoZUNvbmZpZy5jYWNoZVJldGVudGlvbkRheXN9LGUpLGF3YWl0IHRoaXMuYnJvd3NlclN0b3JhZ2UuaW5pdGlhbGl6ZShlKSxhd2FpdCB0aGlzLm1pZ3JhdGVFeGlzdGluZ0NhY2hlKGUpLHRoaXMudHJhY2tWZXJzaW9uQ2hhbmdlcyhlKX1hc3luYyBtaWdyYXRlRXhpc3RpbmdDYWNoZShlKXtsZXQgdD1BYyh0aGlzLmJyb3dzZXJTdG9yYWdlKSxyPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSk7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe3ByZU1pZ3JhdGVBY250Q291bnQ6dC5sZW5ndGgscHJlTWlncmF0ZUFUQ291bnQ6ci5hY2Nlc3NUb2tlbi5sZW5ndGgscHJlTWlncmF0ZUlUQ291bnQ6ci5pZFRva2VuLmxlbmd0aCxwcmVNaWdyYXRlUlRDb3VudDpyLnJlZnJlc2hUb2tlbi5sZW5ndGh9LGUpO2ZvcihsZXQgdD0wO3Q8Mjt0Kyspe2NvbnN0IHI9dDthd2FpdCB0aGlzLnJlbW92ZVN0YWxlQWNjb3VudHModCxyLGUpfWZvcihsZXQgdD0wO3Q8Mjt0Kyspe2NvbnN0IHI9dDthd2FpdCB0aGlzLm1pZ3JhdGVJZFRva2Vucyh0LHIsZSl9Y29uc3Qgbj10aGlzLmdldEtNU0lWYWx1ZXMoKTtmb3IobGV0IHQ9MDt0PDI7dCsrKWF3YWl0IHRoaXMubWlncmF0ZUFjY2Vzc1Rva2Vucyh0LG4sZSksYXdhaXQgdGhpcy5taWdyYXRlUmVmcmVzaFRva2Vucyh0LG4sZSk7dD1BYyh0aGlzLmJyb3dzZXJTdG9yYWdlKSxyPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe3Bvc3RNaWdyYXRlQWNudENvdW50OnQubGVuZ3RoLHBvc3RNaWdyYXRlQVRDb3VudDpyLmFjY2Vzc1Rva2VuLmxlbmd0aCxwb3N0TWlncmF0ZUlUQ291bnQ6ci5pZFRva2VuLmxlbmd0aCxwb3N0TWlncmF0ZVJUQ291bnQ6ci5yZWZyZXNoVG9rZW4ubGVuZ3RofSxlKX1hc3luYyB1cGRhdGVPbGRFbnRyeShlLHQpe2NvbnN0IHI9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGUpLG49dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihyfHwiIik7aWYoIW4pcmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShlKSxudWxsO2lmKG4ubGFzdFVwZGF0ZWRBdCl7aWYoRm4obi5sYXN0VXBkYXRlZEF0LHRoaXMuY2FjaGVDb25maWcuY2FjaGVSZXRlbnRpb25EYXlzKSlyZXR1cm4gdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKGUpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtleHBpcmVkQ2FjaGVSZW1vdmVkQ291bnQ6MX0sdCksbnVsbH1lbHNlIG4ubGFzdFVwZGF0ZWRBdD1EYXRlLm5vdygpLnRvU3RyaW5nKCksdGhpcy5zZXRJdGVtKGUsSlNPTi5zdHJpbmdpZnkobiksdCk7Y29uc3Qgbz1TYyhuKT9hd2FpdCB0aGlzLmJyb3dzZXJTdG9yYWdlLmRlY3J5cHREYXRhKGUsbix0KTpuO3JldHVybiBvJiZRbihvKT8oam4obyl8fFduKG8pKSYmby5leHBpcmVzT24mJkJuKG8uZXhwaXJlc09uLDMwMCk/KHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShlKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7ZXhwaXJlZENhY2hlUmVtb3ZlZENvdW50OjF9LHQpLG51bGwpOm86KHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtpbnZhbGlkQ2FjaGVDb3VudDoxfSx0KSxudWxsKX1hc3luYyByZW1vdmVTdGFsZUFjY291bnRzKGUsdCxyKXtjb25zdCBuPUFjKHRoaXMuYnJvd3NlclN0b3JhZ2UsZSk7aWYoMCE9PW4ubGVuZ3RoKXtmb3IoY29uc3QgZSBvZlsuLi5uXSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe29sZEFjbnRDb3VudDoxfSxyKTtjb25zdCBvPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SXRlbShlKSxpPXRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24ob3x8IiIpO2k/aS5sYXN0VXBkYXRlZEF0P0ZuKGkubGFzdFVwZGF0ZWRBdCx0aGlzLmNhY2hlQ29uZmlnLmNhY2hlUmV0ZW50aW9uRGF5cykmJihhd2FpdCB0aGlzLnJlbW92ZUFjY291bnRPbGRTY2hlbWEoZSxpLHQsciksUGMobixlKSk6KGkubGFzdFVwZGF0ZWRBdD1EYXRlLm5vdygpLnRvU3RyaW5nKCksdGhpcy5zZXRJdGVtKGUsSlNPTi5zdHJpbmdpZnkoaSkscikpOlBjKG4sZSl9dGhpcy5zZXRBY2NvdW50S2V5cyhuLHIsZSl9fWFzeW5jIHJlbW92ZUFjY291bnRPbGRTY2hlbWEoZSx0LHIsbil7Y29uc3Qgbz1TYyh0KT9hd2FpdCB0aGlzLmJyb3dzZXJTdG9yYWdlLmRlY3J5cHREYXRhKGUsdCxuKTp0LGk9bz8uaG9tZUFjY291bnRJZDtpZihpKXtjb25zdCBlPXRoaXMuZ2V0VG9rZW5LZXlzKHIpO1suLi5lLmlkVG9rZW5dLmZpbHRlcigoZT0+ZS5pbmNsdWRlcyhpKSkpLmZvckVhY2goKHQ9Pnt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0odCksUGMoZS5pZFRva2VuLHQpfSkpLFsuLi5lLmFjY2Vzc1Rva2VuXS5maWx0ZXIoKGU9PmUuaW5jbHVkZXMoaSkpKS5mb3JFYWNoKCh0PT57dGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKHQpLFBjKGUuYWNjZXNzVG9rZW4sdCl9KSksWy4uLmUucmVmcmVzaFRva2VuXS5maWx0ZXIoKGU9PmUuaW5jbHVkZXMoaSkpKS5mb3JFYWNoKCh0PT57dGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKHQpLFBjKGUucmVmcmVzaFRva2VuLHQpfSkpLHRoaXMuc2V0VG9rZW5LZXlzKGUsbixyKX10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7ZXhwaXJlZEFjbnRSZW1vdmVkQ291bnQ6MX0sbiksdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKGUpfWdldEtNU0lWYWx1ZXMoKXtjb25zdCBlPXt9LHQ9dGhpcy5nZXRUb2tlbktleXMoKS5pZFRva2VuO2Zvcihjb25zdCByIG9mIHQpe2NvbnN0IHQ9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRVc2VyRGF0YShyKTtpZih0KXtjb25zdCByPUpTT04ucGFyc2UodCksbj1kcihyLnNlY3JldCxLcyk7biYmKGVbci5ob21lQWNjb3VudElkXT11cihuKSl9fXJldHVybiBlfWFzeW5jIG1pZ3JhdGVJZFRva2VucyhlLHQscil7Y29uc3Qgbj1rYyh0aGlzLmNsaWVudElkLHRoaXMuYnJvd3NlclN0b3JhZ2UsZSk7aWYoMD09PW4uaWRUb2tlbi5sZW5ndGgpcmV0dXJuO2NvbnN0IG89a2ModGhpcy5jbGllbnRJZCx0aGlzLmJyb3dzZXJTdG9yYWdlLDIpLGk9QWModGhpcy5icm93c2VyU3RvcmFnZSkscz1BYyh0aGlzLmJyb3dzZXJTdG9yYWdlLHQpO2Zvcihjb25zdCBlIG9mWy4uLm4uaWRUb2tlbl0pe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtvbGRJVENvdW50OjF9LHIpO2NvbnN0IHQ9YXdhaXQgdGhpcy51cGRhdGVPbGRFbnRyeShlLHIpO2lmKCF0KXtQYyhuLmlkVG9rZW4sZSk7Y29udGludWV9Y29uc3QgYT1pLmZpbmQoKGU9PmUuaW5jbHVkZXModC5ob21lQWNjb3VudElkKSkpLGM9cy5maW5kKChlPT5lLmluY2x1ZGVzKHQuaG9tZUFjY291bnRJZCkpKTtsZXQgbD1udWxsO2lmKGEpbD10aGlzLmdldEFjY291bnQoYSxyKTtlbHNlIGlmKGMpe2NvbnN0IGU9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGMpLHQ9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihlfHwiIik7bD10JiZTYyh0KT9hd2FpdCB0aGlzLmJyb3dzZXJTdG9yYWdlLmRlY3J5cHREYXRhKGMsdCxyKTp0fWlmKCFsKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7c2tpcElUTWlncmF0ZUNvdW50OjF9LHIpO2NvbnRpbnVlfWNvbnN0IGg9ZHIodC5zZWNyZXQsS3MpLGQ9dGhpcy5nZW5lcmF0ZUNyZWRlbnRpYWxLZXkodCksdT10aGlzLmdldElkVG9rZW5DcmVkZW50aWFsKGQsciksZz1PYmplY3Qua2V5cyhoKS5pbmNsdWRlcygic2lnbmluX3N0YXRlIikscD11JiZPYmplY3Qua2V5cyhkcih1LnNlY3JldCxLcyl8fHt9KS5pbmNsdWRlcygic2lnbmluX3N0YXRlIik7aWYoIXV8fHQubGFzdFVwZGF0ZWRBdD51Lmxhc3RVcGRhdGVkQXQmJihnfHwhcCkpe2NvbnN0IGU9bC50ZW5hbnRQcm9maWxlc3x8W10sbj1jcihoKXx8bC5yZWFsbTtpZihuJiYhZS5maW5kKChlPT5lLnRlbmFudElkPT09bikpKXtjb25zdCB0PXJyKGwuaG9tZUFjY291bnRJZCxsLmxvY2FsQWNjb3VudElkLG4saCk7ZS5wdXNoKHQpfWwudGVuYW50UHJvZmlsZXM9ZTtjb25zdCBzPXRoaXMuZ2VuZXJhdGVBY2NvdW50S2V5KGhyLmdldEFjY291bnRJbmZvKGwpKSxhPXVyKGgpO2F3YWl0IHRoaXMuc2V0VXNlckRhdGEocyxKU09OLnN0cmluZ2lmeShsKSxyLGwubGFzdFVwZGF0ZWRBdCxhKSxpLmluY2x1ZGVzKHMpfHxpLnB1c2gocyksYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShkLEpTT04uc3RyaW5naWZ5KHQpLHIsdC5sYXN0VXBkYXRlZEF0LGEpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHttaWdyYXRlZElUQ291bnQ6MX0sciksby5pZFRva2VuLnB1c2goZCl9fXRoaXMuc2V0VG9rZW5LZXlzKG4scixlKSx0aGlzLnNldFRva2VuS2V5cyhvLHIpLHRoaXMuc2V0QWNjb3VudEtleXMoaSxyKX1hc3luYyBtaWdyYXRlQWNjZXNzVG9rZW5zKGUsdCxyKXtjb25zdCBuPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSxlKTtpZigwPT09bi5hY2Nlc3NUb2tlbi5sZW5ndGgpcmV0dXJuO2NvbnN0IG89a2ModGhpcy5jbGllbnRJZCx0aGlzLmJyb3dzZXJTdG9yYWdlLDIpO2Zvcihjb25zdCBlIG9mWy4uLm4uYWNjZXNzVG9rZW5dKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmluY3JlbWVudEZpZWxkcyh7b2xkQVRDb3VudDoxfSxyKTtjb25zdCBpPWF3YWl0IHRoaXMudXBkYXRlT2xkRW50cnkoZSxyKTtpZighaSl7UGMobi5hY2Nlc3NUb2tlbixlKTtjb250aW51ZX1pZighT2JqZWN0LmtleXModCkuaW5jbHVkZXMoaS5ob21lQWNjb3VudElkKSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe3NraXBBVE1pZ3JhdGVDb3VudDoxfSxyKTtjb250aW51ZX1jb25zdCBzPXRoaXMuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGkpLGE9dFtpLmhvbWVBY2NvdW50SWRdO2lmKG8uYWNjZXNzVG9rZW4uaW5jbHVkZXMocykpe2NvbnN0IGU9dGhpcy5nZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWwocyxyKTsoIWV8fGkubGFzdFVwZGF0ZWRBdD5lLmxhc3RVcGRhdGVkQXQpJiYoYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShzLEpTT04uc3RyaW5naWZ5KGkpLHIsaS5sYXN0VXBkYXRlZEF0LGEpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHttaWdyYXRlZEFUQ291bnQ6MX0scikpfWVsc2UgYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShzLEpTT04uc3RyaW5naWZ5KGkpLHIsaS5sYXN0VXBkYXRlZEF0LGEpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHttaWdyYXRlZEFUQ291bnQ6MX0sciksby5hY2Nlc3NUb2tlbi5wdXNoKHMpfXRoaXMuc2V0VG9rZW5LZXlzKG4scixlKSx0aGlzLnNldFRva2VuS2V5cyhvLHIpfWFzeW5jIG1pZ3JhdGVSZWZyZXNoVG9rZW5zKGUsdCxyKXtjb25zdCBuPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSxlKTtpZigwPT09bi5yZWZyZXNoVG9rZW4ubGVuZ3RoKXJldHVybjtjb25zdCBvPWtjKHRoaXMuY2xpZW50SWQsdGhpcy5icm93c2VyU3RvcmFnZSwyKTtmb3IoY29uc3QgZSBvZlsuLi5uLnJlZnJlc2hUb2tlbl0pe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHtvbGRSVENvdW50OjF9LHIpO2NvbnN0IGk9YXdhaXQgdGhpcy51cGRhdGVPbGRFbnRyeShlLHIpO2lmKCFpKXtQYyhuLnJlZnJlc2hUb2tlbixlKTtjb250aW51ZX1pZighT2JqZWN0LmtleXModCkuaW5jbHVkZXMoaS5ob21lQWNjb3VudElkKSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe3NraXBSVE1pZ3JhdGVDb3VudDoxfSxyKTtjb250aW51ZX1jb25zdCBzPXRoaXMuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGkpLGE9dFtpLmhvbWVBY2NvdW50SWRdO2lmKG8ucmVmcmVzaFRva2VuLmluY2x1ZGVzKHMpKXtjb25zdCBlPXRoaXMuZ2V0UmVmcmVzaFRva2VuQ3JlZGVudGlhbChzLHIpOyghZXx8aS5sYXN0VXBkYXRlZEF0PmUubGFzdFVwZGF0ZWRBdCkmJihhd2FpdCB0aGlzLnNldFVzZXJEYXRhKHMsSlNPTi5zdHJpbmdpZnkoaSkscixpLmxhc3RVcGRhdGVkQXQsYSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe21pZ3JhdGVkUlRDb3VudDoxfSxyKSl9ZWxzZSBhd2FpdCB0aGlzLnNldFVzZXJEYXRhKHMsSlNPTi5zdHJpbmdpZnkoaSkscixpLmxhc3RVcGRhdGVkQXQsYSksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe21pZ3JhdGVkUlRDb3VudDoxfSxyKSxvLnJlZnJlc2hUb2tlbi5wdXNoKHMpfXRoaXMuc2V0VG9rZW5LZXlzKG4scixlKSx0aGlzLnNldFRva2VuS2V5cyhvLHIpfXRyYWNrVmVyc2lvbkNoYW5nZXMoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0oWWEpO3QmJih0aGlzLmxvZ2dlci5pbmZvKGBNU0FMLmpzIHdhcyBsYXN0IGluaXRpYWxpemVkIGJ5IHZlcnNpb246ICR7dH1gKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7cHJldmlvdXNMaWJyYXJ5VmVyc2lvbjp0fSxlKSksdCE9PSRhJiZ0aGlzLnNldEl0ZW0oWWEsJGEsZSl9dmFsaWRhdGVBbmRQYXJzZUpzb24oZSl7aWYoIWUpcmV0dXJuIG51bGw7dHJ5e2NvbnN0IHQ9SlNPTi5wYXJzZShlKTtyZXR1cm4gdCYmIm9iamVjdCI9PXR5cGVvZiB0P3Q6bnVsbH1jYXRjaChlKXtyZXR1cm4gbnVsbH19c2V0SXRlbShlLHQscil7Y29uc3Qgbj1uZXcgQXJyYXkoMykuZmlsbCgwKSxvPVtdO2ZvcihsZXQgaT0wO2k8PTIwO2krKyl0cnl7aWYodGhpcy5icm93c2VyU3RvcmFnZS5zZXRJdGVtKGUsdCksaT4wKWZvcihsZXQgZT0wO2U8PTI7ZSsrKXtjb25zdCB0PW4uc2xpY2UoMCxlKS5yZWR1Y2UoKChlLHQpPT5lK3QpLDApO2lmKHQ+PWkpYnJlYWs7Y29uc3Qgcz1pPnQrbltlXT90K25bZV06aTtpPnQmJm5bZV0+MCYmdGhpcy5yZW1vdmVBY2Nlc3NUb2tlbktleXMoby5zbGljZSh0LHMpLHIsZSl9YnJlYWt9Y2F0Y2gocyl7Y29uc3QgYT1fcihzKTtpZighKGEuZXJyb3JDb2RlPT09U3ImJmk8MjApKXRocm93IGE7aWYoIW8ubGVuZ3RoKWZvcihsZXQgcj0wO3I8PTI7cisrKWlmKGU9PT10Yyh0aGlzLmNsaWVudElkLHIpKXtjb25zdCBlPUpTT04ucGFyc2UodCkuYWNjZXNzVG9rZW47by5wdXNoKC4uLmUpLG5bcl09ZS5sZW5ndGh9ZWxzZXtjb25zdCBlPXRoaXMuZ2V0VG9rZW5LZXlzKHIpLmFjY2Vzc1Rva2VuO28ucHVzaCguLi5lKSxuW3JdPWUubGVuZ3RofWlmKG8ubGVuZ3RoPD1pKXRocm93IGE7dGhpcy5yZW1vdmVBY2Nlc3NUb2tlbihvW2ldLHIsITEpfX1hc3luYyBzZXRVc2VyRGF0YShlLHQscixuLG8pe2NvbnN0IGk9bmV3IEFycmF5KDMpLmZpbGwoMCkscz1bXTtmb3IobGV0IGE9MDthPD0yMDthKyspdHJ5e2lmKGF3YWl0IFVuKHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0VXNlckRhdGEuYmluZCh0aGlzLmJyb3dzZXJTdG9yYWdlKSxPci5TZXRVc2VyRGF0YSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KShlLHQscixuLG8pLGE+MClmb3IobGV0IGU9MDtlPD0yO2UrKyl7Y29uc3QgdD1pLnNsaWNlKDAsZSkucmVkdWNlKCgoZSx0KT0+ZSt0KSwwKTtpZih0Pj1hKWJyZWFrO2NvbnN0IG49YT50K2lbZV0/dCtpW2VdOmE7YT50JiZpW2VdPjAmJnRoaXMucmVtb3ZlQWNjZXNzVG9rZW5LZXlzKHMuc2xpY2UodCxuKSxyLGUpfWJyZWFrfWNhdGNoKGUpe2NvbnN0IHQ9X3IoZSk7aWYoISh0LmVycm9yQ29kZT09PVNyJiZhPDIwKSl0aHJvdyB0O2lmKCFzLmxlbmd0aClmb3IobGV0IGU9MDtlPD0yO2UrKyl7Y29uc3QgdD10aGlzLmdldFRva2VuS2V5cyhlKS5hY2Nlc3NUb2tlbjtzLnB1c2goLi4udCksaVtlXT10Lmxlbmd0aH1pZihzLmxlbmd0aDw9YSl0aHJvdyB0O3RoaXMucmVtb3ZlQWNjZXNzVG9rZW4oc1thXSxyLCExKX19Z2V0QWNjb3VudChlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFjY291bnQgY2FsbGVkIik7Y29uc3Qgcj10aGlzLmJyb3dzZXJTdG9yYWdlLmdldFVzZXJEYXRhKGUpO2lmKCFyKXJldHVybiB0aGlzLnJlbW92ZUFjY291bnRLZXlGcm9tTWFwKGUsdCksbnVsbDtjb25zdCBuPXRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24ocik7cmV0dXJuIG4mJmhyLmlzQWNjb3VudEVudGl0eShuKT9Qci50b09iamVjdChuZXcgaHIsbik6bnVsbH1hc3luYyBzZXRBY2NvdW50KGUsdCxyKXt0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRBY2NvdW50IGNhbGxlZCIpO2NvbnN0IG49dGhpcy5nZW5lcmF0ZUFjY291bnRLZXkoaHIuZ2V0QWNjb3VudEluZm8oZSkpLG89RGF0ZS5ub3coKS50b1N0cmluZygpO2UubGFzdFVwZGF0ZWRBdD1vLGF3YWl0IHRoaXMuc2V0VXNlckRhdGEobixKU09OLnN0cmluZ2lmeShlKSx0LG8scik7Y29uc3QgaT10aGlzLmFkZEFjY291bnRLZXlUb01hcChuLHQpO3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtrbXNpOnJ9LHQpLHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZSYmaSYmdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDQ09VTlRfQURERUQsdm9pZCAwLGhyLmdldEFjY291bnRJbmZvKGUpKX1nZXRBY2NvdW50S2V5cygpe3JldHVybiBBYyh0aGlzLmJyb3dzZXJTdG9yYWdlKX1zZXRBY2NvdW50S2V5cyhlLHQscj0yKXswPT09ZS5sZW5ndGg/dGhpcy5yZW1vdmVJdGVtKGVjKHIpKTp0aGlzLnNldEl0ZW0oZWMociksSlNPTi5zdHJpbmdpZnkoZSksdCl9YWRkQWNjb3VudEtleVRvTWFwKGUsdCl7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuYWRkQWNjb3VudEtleVRvTWFwIGNhbGxlZCIpLHRoaXMubG9nZ2VyLnRyYWNlUGlpKGBCcm93c2VyQ2FjaGVNYW5hZ2VyLmFkZEFjY291bnRLZXlUb01hcCBjYWxsZWQgd2l0aCBrZXk6ICR7ZX1gKTtjb25zdCByPXRoaXMuZ2V0QWNjb3VudEtleXMoKTtyZXR1cm4tMT09PXIuaW5kZXhPZihlKT8oci5wdXNoKGUpLHRoaXMuc2V0SXRlbShlYygpLEpTT04uc3RyaW5naWZ5KHIpLHQpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuYWRkQWNjb3VudEtleVRvTWFwIGFjY291bnQga2V5IGFkZGVkIiksITApOih0aGlzLmxvZ2dlci52ZXJib3NlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmFkZEFjY291bnRLZXlUb01hcCBhY2NvdW50IGtleSBhbHJlYWR5IGV4aXN0cyBpbiBtYXAiKSwhMSl9cmVtb3ZlQWNjb3VudEtleUZyb21NYXAoZSx0KXt0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBjYWxsZWQiKSx0aGlzLmxvZ2dlci50cmFjZVBpaShgQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBjYWxsZWQgd2l0aCBrZXk6ICR7ZX1gKTtjb25zdCByPXRoaXMuZ2V0QWNjb3VudEtleXMoKSxuPXIuaW5kZXhPZihlKTtuPi0xPyhyLnNwbGljZShuLDEpLHRoaXMuc2V0QWNjb3VudEtleXMocix0KSx0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5yZW1vdmVBY2NvdW50S2V5RnJvbU1hcCBhY2NvdW50IGtleSByZW1vdmVkIikpOnRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlbW92ZUFjY291bnRLZXlGcm9tTWFwIGtleSBub3QgZm91bmQgaW4gZXhpc3RpbmcgbWFwIil9cmVtb3ZlQWNjb3VudChlLHQpe2NvbnN0IHI9dGhpcy5nZXRBY3RpdmVBY2NvdW50KHQpO3I/LmhvbWVBY2NvdW50SWQ9PT1lLmhvbWVBY2NvdW50SWQmJnI/LmVudmlyb25tZW50PT09ZS5lbnZpcm9ubWVudCYmdGhpcy5zZXRBY3RpdmVBY2NvdW50KG51bGwsdCksc3VwZXIucmVtb3ZlQWNjb3VudChlLHQpLHRoaXMucmVtb3ZlQWNjb3VudEtleUZyb21NYXAodGhpcy5nZW5lcmF0ZUFjY291bnRLZXkoZSksdCksdGhpcy5icm93c2VyU3RvcmFnZS5nZXRLZXlzKCkuZm9yRWFjaCgodD0+e3QuaW5jbHVkZXMoZS5ob21lQWNjb3VudElkKSYmdC5pbmNsdWRlcyhlLmVudmlyb25tZW50KSYmdGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVJdGVtKHQpfSkpLHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZSYmdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDQ09VTlRfUkVNT1ZFRCx2b2lkIDAsZSl9cmVtb3ZlSWRUb2tlbihlLHQpe3N1cGVyLnJlbW92ZUlkVG9rZW4oZSx0KTtjb25zdCByPXRoaXMuZ2V0VG9rZW5LZXlzKCksbj1yLmlkVG9rZW4uaW5kZXhPZihlKTtuPi0xJiYodGhpcy5sb2dnZXIuaW5mbygiaWRUb2tlbiByZW1vdmVkIGZyb20gdG9rZW5LZXlzIG1hcCIpLHIuaWRUb2tlbi5zcGxpY2UobiwxKSx0aGlzLnNldFRva2VuS2V5cyhyLHQpKX1yZW1vdmVBY2Nlc3NUb2tlbihlLHQscj0hMCl7c3VwZXIucmVtb3ZlQWNjZXNzVG9rZW4oZSx0KSxyJiZ0aGlzLnJlbW92ZUFjY2Vzc1Rva2VuS2V5cyhbZV0sdCl9cmVtb3ZlQWNjZXNzVG9rZW5LZXlzKGUsdCxyPTIpe3RoaXMubG9nZ2VyLnRyYWNlKCJyZW1vdmVBY2Nlc3NUb2tlbktleSBjYWxsZWQiKTtjb25zdCBuPXRoaXMuZ2V0VG9rZW5LZXlzKHIpO2xldCBvPTA7aWYoZS5mb3JFYWNoKChlPT57Y29uc3QgdD1uLmFjY2Vzc1Rva2VuLmluZGV4T2YoZSk7dD4tMSYmKG4uYWNjZXNzVG9rZW4uc3BsaWNlKHQsMSksbysrKX0pKSxvPjApcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oYHJlbW92ZWQgJHtvfSBhY2Nlc3NUb2tlbiBrZXlzIGZyb20gdG9rZW5LZXlzIG1hcGApLHZvaWQgdGhpcy5zZXRUb2tlbktleXMobix0LHIpfXJlbW92ZVJlZnJlc2hUb2tlbihlLHQpe3N1cGVyLnJlbW92ZVJlZnJlc2hUb2tlbihlLHQpO2NvbnN0IHI9dGhpcy5nZXRUb2tlbktleXMoKSxuPXIucmVmcmVzaFRva2VuLmluZGV4T2YoZSk7bj4tMSYmKHRoaXMubG9nZ2VyLmluZm8oInJlZnJlc2hUb2tlbiByZW1vdmVkIGZyb20gdG9rZW5LZXlzIG1hcCIpLHIucmVmcmVzaFRva2VuLnNwbGljZShuLDEpLHRoaXMuc2V0VG9rZW5LZXlzKHIsdCkpfWdldFRva2VuS2V5cyhlPTIpe3JldHVybiBrYyh0aGlzLmNsaWVudElkLHRoaXMuYnJvd3NlclN0b3JhZ2UsZSl9c2V0VG9rZW5LZXlzKGUsdCxyPTIpezAhPT1lLmlkVG9rZW4ubGVuZ3RofHwwIT09ZS5hY2Nlc3NUb2tlbi5sZW5ndGh8fDAhPT1lLnJlZnJlc2hUb2tlbi5sZW5ndGg/dGhpcy5zZXRJdGVtKHRjKHRoaXMuY2xpZW50SWQsciksSlNPTi5zdHJpbmdpZnkoZSksdCk6dGhpcy5yZW1vdmVJdGVtKHRjKHRoaXMuY2xpZW50SWQscikpfWdldElkVG9rZW5DcmVkZW50aWFsKGUsdCl7Y29uc3Qgcj10aGlzLmJyb3dzZXJTdG9yYWdlLmdldFVzZXJEYXRhKGUpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRJZFRva2VuQ3JlZGVudGlhbDogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSx0aGlzLnJlbW92ZUlkVG9rZW4oZSx0KSxudWxsO2NvbnN0IG49dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihyKTtyZXR1cm4gbiYmKChvPW4pJiZRbihvKSYmby5oYXNPd25Qcm9wZXJ0eSgicmVhbG0iKSYmby5jcmVkZW50aWFsVHlwZT09PUguSURfVE9LRU4pPyh0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRJZFRva2VuQ3JlZGVudGlhbDogY2FjaGUgaGl0Iiksbik6KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldElkVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpO3ZhciBvfWFzeW5jIHNldElkVG9rZW5DcmVkZW50aWFsKGUsdCxyKXt0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRJZFRva2VuQ3JlZGVudGlhbCBjYWxsZWQiKTtjb25zdCBuPXRoaXMuZ2VuZXJhdGVDcmVkZW50aWFsS2V5KGUpLG89RGF0ZS5ub3coKS50b1N0cmluZygpO2UubGFzdFVwZGF0ZWRBdD1vLGF3YWl0IHRoaXMuc2V0VXNlckRhdGEobixKU09OLnN0cmluZ2lmeShlKSx0LG8scik7Y29uc3QgaT10aGlzLmdldFRva2VuS2V5cygpOy0xPT09aS5pZFRva2VuLmluZGV4T2YobikmJih0aGlzLmxvZ2dlci5pbmZvKCJCcm93c2VyQ2FjaGVNYW5hZ2VyOiBhZGRUb2tlbktleSAtIGlkVG9rZW4gYWRkZWQgdG8gbWFwIiksaS5pZFRva2VuLnB1c2gobiksdGhpcy5zZXRUb2tlbktleXMoaSx0KSl9Z2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsKGUsdCl7Y29uc3Qgcj10aGlzLmJyb3dzZXJTdG9yYWdlLmdldFVzZXJEYXRhKGUpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY2Nlc3NUb2tlbkNyZWRlbnRpYWw6IGNhbGxlZCwgbm8gY2FjaGUgaGl0IiksdGhpcy5yZW1vdmVBY2Nlc3NUb2tlbktleXMoW2VdLHQpLG51bGw7Y29uc3Qgbj10aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHIpO3JldHVybiBuJiZqbihuKT8odGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsOiBjYWNoZSBoaXQiKSxuKToodGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpfWFzeW5jIHNldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChlLHQscil7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0QWNjZXNzVG9rZW5DcmVkZW50aWFsIGNhbGxlZCIpO2NvbnN0IG49dGhpcy5nZW5lcmF0ZUNyZWRlbnRpYWxLZXkoZSksbz1EYXRlLm5vdygpLnRvU3RyaW5nKCk7ZS5sYXN0VXBkYXRlZEF0PW8sYXdhaXQgdGhpcy5zZXRVc2VyRGF0YShuLEpTT04uc3RyaW5naWZ5KGUpLHQsbyxyKTtjb25zdCBpPXRoaXMuZ2V0VG9rZW5LZXlzKCkscz1pLmFjY2Vzc1Rva2VuLmluZGV4T2Yobik7LTEhPT1zJiZpLmFjY2Vzc1Rva2VuLnNwbGljZShzLDEpLHRoaXMubG9nZ2VyLnRyYWNlKGBhY2Nlc3MgdG9rZW4gJHstMT09PXM/ImFkZGVkIHRvIjoidXBkYXRlZCBpbiJ9IG1hcGApLGkuYWNjZXNzVG9rZW4ucHVzaChuKSx0aGlzLnNldFRva2VuS2V5cyhpLHQpfWdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoZSx0KXtjb25zdCByPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0VXNlckRhdGEoZSk7aWYoIXIpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWw6IGNhbGxlZCwgbm8gY2FjaGUgaGl0IiksdGhpcy5yZW1vdmVSZWZyZXNoVG9rZW4oZSx0KSxudWxsO2NvbnN0IG49dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihyKTtyZXR1cm4gbiYmV24obik/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWw6IGNhY2hlIGhpdCIpLG4pOih0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRSZWZyZXNoVG9rZW5DcmVkZW50aWFsOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpfWFzeW5jIHNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoZSx0LHIpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwgY2FsbGVkIik7Y29uc3Qgbj10aGlzLmdlbmVyYXRlQ3JlZGVudGlhbEtleShlKSxvPURhdGUubm93KCkudG9TdHJpbmcoKTtlLmxhc3RVcGRhdGVkQXQ9byxhd2FpdCB0aGlzLnNldFVzZXJEYXRhKG4sSlNPTi5zdHJpbmdpZnkoZSksdCxvLHIpO2NvbnN0IGk9dGhpcy5nZXRUb2tlbktleXMoKTstMT09PWkucmVmcmVzaFRva2VuLmluZGV4T2YobikmJih0aGlzLmxvZ2dlci5pbmZvKCJCcm93c2VyQ2FjaGVNYW5hZ2VyOiBhZGRUb2tlbktleSAtIHJlZnJlc2hUb2tlbiBhZGRlZCB0byBtYXAiKSxpLnJlZnJlc2hUb2tlbi5wdXNoKG4pLHRoaXMuc2V0VG9rZW5LZXlzKGksdCkpfWdldEFwcE1ldGFkYXRhKGUpe2NvbnN0IHQ9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKGUpO2lmKCF0KXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBcHBNZXRhZGF0YTogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSxudWxsO2NvbnN0IHI9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbih0KTtyZXR1cm4gciYmKG49ZSwobz1yKSYmMD09PW4uaW5kZXhPZih4KSYmby5oYXNPd25Qcm9wZXJ0eSgiY2xpZW50SWQiKSYmby5oYXNPd25Qcm9wZXJ0eSgiZW52aXJvbm1lbnQiKSk/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFwcE1ldGFkYXRhOiBjYWNoZSBoaXQiKSxyKToodGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0QXBwTWV0YWRhdGE6IGNhbGxlZCwgbm8gY2FjaGUgaGl0IiksbnVsbCk7dmFyIG4sb31zZXRBcHBNZXRhZGF0YShlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldEFwcE1ldGFkYXRhIGNhbGxlZCIpO2NvbnN0IHI9ZnVuY3Rpb24oe2Vudmlyb25tZW50OmUsY2xpZW50SWQ6dH0pe3JldHVyblt4LGUsdF0uam9pbihMKS50b0xvd2VyQ2FzZSgpfShlKTt0aGlzLnNldEl0ZW0ocixKU09OLnN0cmluZ2lmeShlKSx0KX1nZXRTZXJ2ZXJUZWxlbWV0cnkoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0oZSk7aWYoIXQpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSxudWxsO2NvbnN0IHI9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbih0KTtyZXR1cm4gciYmZnVuY3Rpb24oZSx0KXtjb25zdCByPTA9PT1lLmluZGV4T2Yoai5DQUNIRV9LRVkpO2xldCBuPSEwO3JldHVybiB0JiYobj10Lmhhc093blByb3BlcnR5KCJmYWlsZWRSZXF1ZXN0cyIpJiZ0Lmhhc093blByb3BlcnR5KCJlcnJvcnMiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiY2FjaGVIaXRzIikpLHImJm59KGUscik/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FjaGUgaGl0Iikscik6KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldFNlcnZlclRlbGVtZXRyeTogY2FsbGVkLCBubyBjYWNoZSBoaXQiKSxudWxsKX1zZXRTZXJ2ZXJUZWxlbWV0cnkoZSx0LHIpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnNldFNlcnZlclRlbGVtZXRyeSBjYWxsZWQiKSx0aGlzLnNldEl0ZW0oZSxKU09OLnN0cmluZ2lmeSh0KSxyKX1nZXRBdXRob3JpdHlNZXRhZGF0YShlKXtjb25zdCB0PXRoaXMuaW50ZXJuYWxTdG9yYWdlLmdldEl0ZW0oZSk7aWYoIXQpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGw7Y29uc3Qgcj10aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHQpO3JldHVybiByJiZmdW5jdGlvbihlLHQpe3JldHVybiEhdCYmMD09PWUuaW5kZXhPZihGKSYmdC5oYXNPd25Qcm9wZXJ0eSgiYWxpYXNlcyIpJiZ0Lmhhc093blByb3BlcnR5KCJwcmVmZXJyZWRfY2FjaGUiKSYmdC5oYXNPd25Qcm9wZXJ0eSgicHJlZmVycmVkX25ldHdvcmsiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiY2Fub25pY2FsX2F1dGhvcml0eSIpJiZ0Lmhhc093blByb3BlcnR5KCJhdXRob3JpemF0aW9uX2VuZHBvaW50IikmJnQuaGFzT3duUHJvcGVydHkoInRva2VuX2VuZHBvaW50IikmJnQuaGFzT3duUHJvcGVydHkoImlzc3VlciIpJiZ0Lmhhc093blByb3BlcnR5KCJhbGlhc2VzRnJvbU5ldHdvcmsiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiZW5kcG9pbnRzRnJvbU5ldHdvcmsiKSYmdC5oYXNPd25Qcm9wZXJ0eSgiZXhwaXJlc0F0IikmJnQuaGFzT3duUHJvcGVydHkoImp3a3NfdXJpIil9KGUscik/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEF1dGhvcml0eU1ldGFkYXRhOiBjYWNoZSBoaXQiKSxyKTpudWxsfWdldEF1dGhvcml0eU1ldGFkYXRhS2V5cygpe3JldHVybiB0aGlzLmludGVybmFsU3RvcmFnZS5nZXRLZXlzKCkuZmlsdGVyKChlPT50aGlzLmlzQXV0aG9yaXR5TWV0YWRhdGEoZSkpKX1zZXRXcmFwcGVyTWV0YWRhdGEoZSx0KXt0aGlzLmludGVybmFsU3RvcmFnZS5zZXRJdGVtKF9zLGUpLHRoaXMuaW50ZXJuYWxTdG9yYWdlLnNldEl0ZW0oUHMsdCl9Z2V0V3JhcHBlck1ldGFkYXRhKCl7cmV0dXJuW3RoaXMuaW50ZXJuYWxTdG9yYWdlLmdldEl0ZW0oX3MpfHx0LkVNUFRZX1NUUklORyx0aGlzLmludGVybmFsU3RvcmFnZS5nZXRJdGVtKFBzKXx8dC5FTVBUWV9TVFJJTkddfXNldEF1dGhvcml0eU1ldGFkYXRhKGUsdCl7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0QXV0aG9yaXR5TWV0YWRhdGEgY2FsbGVkIiksdGhpcy5pbnRlcm5hbFN0b3JhZ2Uuc2V0SXRlbShlLEpTT04uc3RyaW5naWZ5KHQpKX1nZXRBY3RpdmVBY2NvdW50KGUpe2NvbnN0IHQ9dGhpcy5nZW5lcmF0ZUNhY2hlS2V5KHYpLHI9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJdGVtKHQpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY3RpdmVBY2NvdW50OiBObyBhY3RpdmUgYWNjb3VudCBmaWx0ZXJzIGZvdW5kIiksbnVsbDtjb25zdCBuPXRoaXMudmFsaWRhdGVBbmRQYXJzZUpzb24ocik7cmV0dXJuIG4/KHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldEFjdGl2ZUFjY291bnQ6IEFjdGl2ZSBhY2NvdW50IGZpbHRlcnMgc2NoZW1hIGZvdW5kIiksdGhpcy5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoe2hvbWVBY2NvdW50SWQ6bi5ob21lQWNjb3VudElkLGxvY2FsQWNjb3VudElkOm4ubG9jYWxBY2NvdW50SWQsdGVuYW50SWQ6bi50ZW5hbnRJZH0sZSkpOih0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRBY3RpdmVBY2NvdW50OiBObyBhY3RpdmUgYWNjb3VudCBmb3VuZCIpLG51bGwpfXNldEFjdGl2ZUFjY291bnQoZSx0KXtjb25zdCByPXRoaXMuZ2VuZXJhdGVDYWNoZUtleSh2KTtpZihlKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJzZXRBY3RpdmVBY2NvdW50OiBBY3RpdmUgYWNjb3VudCBzZXQiKTtjb25zdCBuPXtob21lQWNjb3VudElkOmUuaG9tZUFjY291bnRJZCxsb2NhbEFjY291bnRJZDplLmxvY2FsQWNjb3VudElkLHRlbmFudElkOmUudGVuYW50SWQsbGFzdFVwZGF0ZWRBdDpEbigpLnRvU3RyaW5nKCl9O3RoaXMuc2V0SXRlbShyLEpTT04uc3RyaW5naWZ5KG4pLHQpfWVsc2UgdGhpcy5sb2dnZXIudmVyYm9zZSgic2V0QWN0aXZlQWNjb3VudDogTm8gYWNjb3VudCBwYXNzZWQsIGFjdGl2ZSBhY2NvdW50IG5vdCBzZXQiKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0ocik7dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDVElWRV9BQ0NPVU5UX0NIQU5HRUQpfWdldFRocm90dGxpbmdDYWNoZShlKXtjb25zdCB0PXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SXRlbShlKTtpZighdClyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGw7Y29uc3Qgcj10aGlzLnZhbGlkYXRlQW5kUGFyc2VKc29uKHQpO3JldHVybiByJiZmdW5jdGlvbihlLHQpe2xldCByPSExO2UmJihyPTA9PT1lLmluZGV4T2YoWSkpO2xldCBuPSEwO3JldHVybiB0JiYobj10Lmhhc093blByb3BlcnR5KCJ0aHJvdHRsZVRpbWUiKSksciYmbn0oZSxyKT8odGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWNoZSBoaXQiKSxyKToodGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGhyb3R0bGluZ0NhY2hlOiBjYWxsZWQsIG5vIGNhY2hlIGhpdCIpLG51bGwpfXNldFRocm90dGxpbmdDYWNoZShlLHQscil7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuc2V0VGhyb3R0bGluZ0NhY2hlIGNhbGxlZCIpLHRoaXMuc2V0SXRlbShlLEpTT04uc3RyaW5naWZ5KHQpLHIpfWdldFRlbXBvcmFyeUNhY2hlKGUsdCl7Y29uc3Qgcj10P3RoaXMuZ2VuZXJhdGVDYWNoZUtleShlKTplO2lmKHRoaXMuY2FjaGVDb25maWcuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSl7Y29uc3QgZT10aGlzLmNvb2tpZVN0b3JhZ2UuZ2V0SXRlbShyKTtpZihlKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUZW1wb3JhcnlDYWNoZTogc3RvcmVBdXRoU3RhdGVJbkNvb2tpZXMgc2V0IHRvIHRydWUsIHJldHJpZXZpbmcgZnJvbSBjb29raWVzIiksZX1jb25zdCBuPXRoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlLmdldEl0ZW0ocik7aWYoIW4pe2lmKHRoaXMuY2FjaGVDb25maWcuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZSl7Y29uc3QgZT10aGlzLmJyb3dzZXJTdG9yYWdlLmdldEl0ZW0ocik7aWYoZSlyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGVtcG9yYXJ5Q2FjaGU6IFRlbXBvcmFyeSBjYWNoZSBpdGVtIGZvdW5kIGluIGxvY2FsIHN0b3JhZ2UiKSxlfXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRUZW1wb3JhcnlDYWNoZTogTm8gY2FjaGUgaXRlbSBmb3VuZCBpbiBsb2NhbCBzdG9yYWdlIiksbnVsbH1yZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0VGVtcG9yYXJ5Q2FjaGU6IFRlbXBvcmFyeSBjYWNoZSBpdGVtIHJldHVybmVkIiksbn1zZXRUZW1wb3JhcnlDYWNoZShlLHQscil7Y29uc3Qgbj1yP3RoaXMuZ2VuZXJhdGVDYWNoZUtleShlKTplO3RoaXMudGVtcG9yYXJ5Q2FjaGVTdG9yYWdlLnNldEl0ZW0obix0KSx0aGlzLmNhY2hlQ29uZmlnLnN0b3JlQXV0aFN0YXRlSW5Db29raWUmJih0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5zZXRUZW1wb3JhcnlDYWNoZTogc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSBzZXQgdG8gdHJ1ZSwgc2V0dGluZyBpdGVtIGNvb2tpZSIpLHRoaXMuY29va2llU3RvcmFnZS5zZXRJdGVtKG4sdCx2b2lkIDAsdGhpcy5jYWNoZUNvbmZpZy5zZWN1cmVDb29raWVzKSl9cmVtb3ZlSXRlbShlKXt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUl0ZW0oZSl9cmVtb3ZlVGVtcG9yYXJ5SXRlbShlKXt0aGlzLnRlbXBvcmFyeUNhY2hlU3RvcmFnZS5yZW1vdmVJdGVtKGUpLHRoaXMuY2FjaGVDb25maWcuc3RvcmVBdXRoU3RhdGVJbkNvb2tpZSYmKHRoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlbW92ZUl0ZW06IHN0b3JlQXV0aFN0YXRlSW5Db29raWUgaXMgdHJ1ZSwgY2xlYXJpbmcgaXRlbSBjb29raWUiKSx0aGlzLmNvb2tpZVN0b3JhZ2UucmVtb3ZlSXRlbShlKSl9Z2V0S2V5cygpe3JldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEtleXMoKX1jbGVhcihlKXt0aGlzLnJlbW92ZUFsbEFjY291bnRzKGUpLHRoaXMucmVtb3ZlQXBwTWV0YWRhdGEoZSksdGhpcy50ZW1wb3JhcnlDYWNoZVN0b3JhZ2UuZ2V0S2V5cygpLmZvckVhY2goKGU9PnstMT09PWUuaW5kZXhPZihRYSkmJi0xPT09ZS5pbmRleE9mKHRoaXMuY2xpZW50SWQpfHx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0oZSl9KSksdGhpcy5icm93c2VyU3RvcmFnZS5nZXRLZXlzKCkuZm9yRWFjaCgoZT0+ey0xPT09ZS5pbmRleE9mKFFhKSYmLTE9PT1lLmluZGV4T2YodGhpcy5jbGllbnRJZCl8fHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbShlKX0pKSx0aGlzLmludGVybmFsU3RvcmFnZS5jbGVhcigpfWNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMoZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkNsZWFyVG9rZW5zQW5kS2V5c1dpdGhDbGFpbXMsZSk7Y29uc3QgdD10aGlzLmdldFRva2VuS2V5cygpO2xldCByPTA7dC5hY2Nlc3NUb2tlbi5mb3JFYWNoKCh0PT57Y29uc3Qgbj10aGlzLmdldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbCh0LGUpO24/LnJlcXVlc3RlZENsYWltc0hhc2gmJnQuaW5jbHVkZXMobi5yZXF1ZXN0ZWRDbGFpbXNIYXNoLnRvTG93ZXJDYXNlKCkpJiYodGhpcy5yZW1vdmVBY2Nlc3NUb2tlbih0LGUpLHIrKyl9KSkscj4wJiZ0aGlzLmxvZ2dlci53YXJuaW5nKGAke3J9IGFjY2VzcyB0b2tlbnMgd2l0aCBjbGFpbXMgaW4gdGhlIGNhY2hlIGtleXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuYCl9Z2VuZXJhdGVDYWNoZUtleShlKXtyZXR1cm4gWXQuc3RhcnRzV2l0aChlLFFhKT9lOmAke1FhfS4ke3RoaXMuY2xpZW50SWR9LiR7ZX1gfWdlbmVyYXRlQ3JlZGVudGlhbEtleShlKXtjb25zdCB0PWUuY3JlZGVudGlhbFR5cGU9PT1ILlJFRlJFU0hfVE9LRU4mJmUuZmFtaWx5SWR8fGUuY2xpZW50SWQscj1lLnRva2VuVHlwZSYmZS50b2tlblR5cGUudG9Mb3dlckNhc2UoKSE9PVcuQkVBUkVSLnRvTG93ZXJDYXNlKCk/ZS50b2tlblR5cGUudG9Mb3dlckNhc2UoKToiIjtyZXR1cm5bYCR7UWF9LjJgLGUuaG9tZUFjY291bnRJZCxlLmVudmlyb25tZW50LGUuY3JlZGVudGlhbFR5cGUsdCxlLnJlYWxtfHwiIixlLnRhcmdldHx8IiIsZS5yZXF1ZXN0ZWRDbGFpbXNIYXNofHwiIixyXS5qb2luKCJ8IikudG9Mb3dlckNhc2UoKX1nZW5lcmF0ZUFjY291bnRLZXkoZSl7Y29uc3QgdD1lLmhvbWVBY2NvdW50SWQuc3BsaXQoIi4iKVsxXTtyZXR1cm5bYCR7UWF9LjJgLGUuaG9tZUFjY291bnRJZCxlLmVudmlyb25tZW50LHR8fGUudGVuYW50SWR8fCIiXS5qb2luKCJ8IikudG9Mb3dlckNhc2UoKX1yZXNldFJlcXVlc3RDYWNoZSgpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLnJlc2V0UmVxdWVzdENhY2hlIGNhbGxlZCIpLHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoU3MpKSx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KGJzKSksdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKHRoaXMuZ2VuZXJhdGVDYWNoZUtleShBcykpLHRoaXMucmVtb3ZlVGVtcG9yYXJ5SXRlbSh0aGlzLmdlbmVyYXRlQ2FjaGVLZXkoa3MpKSx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0odGhpcy5nZW5lcmF0ZUNhY2hlS2V5KFJzKSksdGhpcy5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITEpfWNhY2hlQXV0aG9yaXplUmVxdWVzdChlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmNhY2hlQXV0aG9yaXplUmVxdWVzdCBjYWxsZWQiKTtjb25zdCByPUZzKEpTT04uc3RyaW5naWZ5KGUpKTtpZih0aGlzLnNldFRlbXBvcmFyeUNhY2hlKFNzLHIsITApLHQpe2NvbnN0IGU9RnModCk7dGhpcy5zZXRUZW1wb3JhcnlDYWNoZShicyxlLCEwKX19Z2V0Q2FjaGVkUmVxdWVzdCgpe3RoaXMubG9nZ2VyLnRyYWNlKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldENhY2hlZFJlcXVlc3QgY2FsbGVkIik7Y29uc3QgZT10aGlzLmdldFRlbXBvcmFyeUNhY2hlKFNzLCEwKTtpZighZSl0aHJvdyBaaSh2aSk7Y29uc3QgdD10aGlzLmdldFRlbXBvcmFyeUNhY2hlKGJzLCEwKTtsZXQgcixuPSIiO3RyeXtyPUpTT04ucGFyc2UoS3MoZSkpLHQmJihuPUtzKHQpKX1jYXRjaCh0KXt0aHJvdyB0aGlzLmxvZ2dlci5lcnJvclBpaShgQXR0ZW1wdGVkIHRvIHBhcnNlOiAke2V9YCksdGhpcy5sb2dnZXIuZXJyb3IoYFBhcnNpbmcgY2FjaGVkIHRva2VuIHJlcXVlc3QgdGhyZXcgd2l0aCBlcnJvcjogJHt0fWApLFppKElpKX1yZXR1cm5bcixuXX1nZXRDYWNoZWROYXRpdmVSZXF1ZXN0KCl7dGhpcy5sb2dnZXIudHJhY2UoIkJyb3dzZXJDYWNoZU1hbmFnZXIuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCBjYWxsZWQiKTtjb25zdCBlPXRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoUnMsITApO2lmKCFlKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiQnJvd3NlckNhY2hlTWFuYWdlci5nZXRDYWNoZWROYXRpdmVSZXF1ZXN0OiBObyBjYWNoZWQgbmF0aXZlIHJlcXVlc3QgZm91bmQiKSxudWxsO2NvbnN0IHQ9dGhpcy52YWxpZGF0ZUFuZFBhcnNlSnNvbihlKTtyZXR1cm4gdHx8KHRoaXMubG9nZ2VyLmVycm9yKCJCcm93c2VyQ2FjaGVNYW5hZ2VyLmdldENhY2hlZE5hdGl2ZVJlcXVlc3Q6IFVuYWJsZSB0byBwYXJzZSBuYXRpdmUgcmVxdWVzdCIpLG51bGwpfWlzSW50ZXJhY3Rpb25JblByb2dyZXNzKGUpe2NvbnN0IHQ9dGhpcy5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKT8uY2xpZW50SWQ7cmV0dXJuIGU/dD09PXRoaXMuY2xpZW50SWQ6ISF0fWdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpe2NvbnN0IGU9YCR7UWF9LiR7RXN9YCx0PXRoaXMuZ2V0VGVtcG9yYXJ5Q2FjaGUoZSwhMSk7dHJ5e3JldHVybiB0P0pTT04ucGFyc2UodCk6bnVsbH1jYXRjaCh0KXtyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoIkNhbm5vdCBwYXJzZSBpbnRlcmFjdGlvbiBzdGF0dXMuIFJlbW92aW5nIHRlbXBvcmFyeSBjYWNoZSBpdGVtcyBhbmQgY2xlYXJpbmcgdXJsIGhhc2guIFJldHJ5aW5nIGludGVyYWN0aW9uIHNob3VsZCBmaXggdGhlIGVycm9yIiksdGhpcy5yZW1vdmVUZW1wb3JhcnlJdGVtKGUpLHRoaXMucmVzZXRSZXF1ZXN0Q2FjaGUoKSxUYSh3aW5kb3cpLG51bGx9fXNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyhlLHQ9SXMpe2NvbnN0IHI9YCR7UWF9LiR7RXN9YDtpZihlKXtpZih0aGlzLmdldEludGVyYWN0aW9uSW5Qcm9ncmVzcygpKXRocm93IFppKGFpKTt0aGlzLnNldFRlbXBvcmFyeUNhY2hlKHIsSlNPTi5zdHJpbmdpZnkoe2NsaWVudElkOnRoaXMuY2xpZW50SWQsdHlwZTp0fSksITEpfWVsc2UgZXx8dGhpcy5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKT8uY2xpZW50SWQhPT10aGlzLmNsaWVudElkfHx0aGlzLnJlbW92ZVRlbXBvcmFyeUl0ZW0ocil9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7Y29uc3Qgcj1LbihlLmFjY291bnQ/LmhvbWVBY2NvdW50SWQsZS5hY2NvdW50Py5lbnZpcm9ubWVudCxlLmlkVG9rZW4sdGhpcy5jbGllbnRJZCxlLnRlbmFudElkKTtsZXQgbjt0LmNsYWltcyYmKG49YXdhaXQgdGhpcy5jcnlwdG9JbXBsLmhhc2hTdHJpbmcodC5jbGFpbXMpKTtjb25zdCBvPXtpZFRva2VuOnIsYWNjZXNzVG9rZW46R24oZS5hY2NvdW50Py5ob21lQWNjb3VudElkLGUuYWNjb3VudC5lbnZpcm9ubWVudCxlLmFjY2Vzc1Rva2VuLHRoaXMuY2xpZW50SWQsZS50ZW5hbnRJZCxlLnNjb3Blcy5qb2luKCIgIiksZS5leHBpcmVzT24/SG4oZS5leHBpcmVzT24pOjAsZS5leHRFeHBpcmVzT24/SG4oZS5leHRFeHBpcmVzT24pOjAsS3Msdm9pZCAwLGUudG9rZW5UeXBlLHZvaWQgMCx0LnNzaEtpZCx0LmNsYWltcyxuKX07cmV0dXJuIHRoaXMuc2F2ZUNhY2hlUmVjb3JkKG8sZS5jb3JyZWxhdGlvbklkLHVyKGRyKGUuaWRUb2tlbixLcykpKX1hc3luYyBzYXZlQ2FjaGVSZWNvcmQoZSx0LHIsbil7dHJ5e2F3YWl0IHN1cGVyLnNhdmVDYWNoZVJlY29yZChlLHQscixuKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgUnImJnRoaXMucGVyZm9ybWFuY2VDbGllbnQmJnQpdHJ5e2NvbnN0IGU9dGhpcy5nZXRUb2tlbktleXMoKTt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7Y2FjaGVSdENvdW50OmUucmVmcmVzaFRva2VuLmxlbmd0aCxjYWNoZUlkQ291bnQ6ZS5pZFRva2VuLmxlbmd0aCxjYWNoZUF0Q291bnQ6ZS5hY2Nlc3NUb2tlbi5sZW5ndGh9LHQpfWNhdGNoKGUpe310aHJvdyBlfX19ZnVuY3Rpb24gT2MoZSx0LHIsbil7dHJ5e3N3aXRjaCh0KXtjYXNlIENzLkxvY2FsU3RvcmFnZTpyZXR1cm4gbmV3IEVjKGUscixuKTtjYXNlIENzLlNlc3Npb25TdG9yYWdlOnJldHVybiBuZXcgUmN9fWNhdGNoKGUpe3IuZXJyb3IoZSl9cmV0dXJuIG5ldyBtY31jb25zdCBxYz0oZSx0LHIsbik9Pm5ldyBNYyhlLHtjYWNoZUxvY2F0aW9uOkNzLk1lbW9yeVN0b3JhZ2UsY2FjaGVSZXRlbnRpb25EYXlzOjUsdGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbjpDcy5NZW1vcnlTdG9yYWdlLHN0b3JlQXV0aFN0YXRlSW5Db29raWU6ITEsc2VjdXJlQ29va2llczohMSxjYWNoZU1pZ3JhdGlvbkVuYWJsZWQ6ITEsY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDohMX0sZnQsdCxyLG4pO2Z1bmN0aW9uIE5jKGUsdCxyLG4sbyl7cmV0dXJuIGUudmVyYm9zZSgiZ2V0QWxsQWNjb3VudHMgY2FsbGVkIikscj90LmdldEFsbEFjY291bnRzKG98fHt9LG4pOltdfWZ1bmN0aW9uIFVjKGUsdCxyLG4pe2NvbnN0IG89ci5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoZSxuKTtyZXR1cm4gbz8odC52ZXJib3NlKCJnZXRBY2NvdW50OiBBY2NvdW50IG1hdGNoaW5nIHByb3ZpZGVkIGZpbHRlciBmb3VuZCwgcmV0dXJuaW5nIiksbyk6KHQudmVyYm9zZSgiZ2V0QWNjb3VudDogTm8gbWF0Y2hpbmcgYWNjb3VudCBmb3VuZCwgcmV0dXJuaW5nIG51bGwiKSxudWxsKX1mdW5jdGlvbiBMYyhlLHQscixuKXtpZih0LnRyYWNlKCJnZXRBY2NvdW50QnlVc2VybmFtZSBjYWxsZWQiKSwhZSlyZXR1cm4gdC53YXJuaW5nKCJnZXRBY2NvdW50QnlVc2VybmFtZTogTm8gdXNlcm5hbWUgcHJvdmlkZWQiKSxudWxsO2NvbnN0IG89ci5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoe3VzZXJuYW1lOmV9LG4pO3JldHVybiBvPyh0LnZlcmJvc2UoImdldEFjY291bnRCeVVzZXJuYW1lOiBBY2NvdW50IG1hdGNoaW5nIHVzZXJuYW1lIGZvdW5kLCByZXR1cm5pbmciKSx0LnZlcmJvc2VQaWkoYGdldEFjY291bnRCeVVzZXJuYW1lOiBSZXR1cm5pbmcgc2lnbmVkLWluIGFjY291bnRzIG1hdGNoaW5nIHVzZXJuYW1lOiAke2V9YCksbyk6KHQudmVyYm9zZSgiZ2V0QWNjb3VudEJ5VXNlcm5hbWU6IE5vIG1hdGNoaW5nIGFjY291bnQgZm91bmQsIHJldHVybmluZyBudWxsIiksbnVsbCl9ZnVuY3Rpb24gRGMoZSx0LHIsbil7aWYodC50cmFjZSgiZ2V0QWNjb3VudEJ5SG9tZUlkIGNhbGxlZCIpLCFlKXJldHVybiB0Lndhcm5pbmcoImdldEFjY291bnRCeUhvbWVJZDogTm8gaG9tZUFjY291bnRJZCBwcm92aWRlZCIpLG51bGw7Y29uc3Qgbz1yLmdldEFjY291bnRJbmZvRmlsdGVyZWRCeSh7aG9tZUFjY291bnRJZDplfSxuKTtyZXR1cm4gbz8odC52ZXJib3NlKCJnZXRBY2NvdW50QnlIb21lSWQ6IEFjY291bnQgbWF0Y2hpbmcgaG9tZUFjY291bnRJZCBmb3VuZCwgcmV0dXJuaW5nIiksdC52ZXJib3NlUGlpKGBnZXRBY2NvdW50QnlIb21lSWQ6IFJldHVybmluZyBzaWduZWQtaW4gYWNjb3VudHMgbWF0Y2hpbmcgaG9tZUFjY291bnRJZDogJHtlfWApLG8pOih0LnZlcmJvc2UoImdldEFjY291bnRCeUhvbWVJZDogTm8gbWF0Y2hpbmcgYWNjb3VudCBmb3VuZCwgcmV0dXJuaW5nIG51bGwiKSxudWxsKX1mdW5jdGlvbiBIYyhlLHQscixuKXtpZih0LnRyYWNlKCJnZXRBY2NvdW50QnlMb2NhbElkIGNhbGxlZCIpLCFlKXJldHVybiB0Lndhcm5pbmcoImdldEFjY291bnRCeUxvY2FsSWQ6IE5vIGxvY2FsQWNjb3VudElkIHByb3ZpZGVkIiksbnVsbDtjb25zdCBvPXIuZ2V0QWNjb3VudEluZm9GaWx0ZXJlZEJ5KHtsb2NhbEFjY291bnRJZDplfSxuKTtyZXR1cm4gbz8odC52ZXJib3NlKCJnZXRBY2NvdW50QnlMb2NhbElkOiBBY2NvdW50IG1hdGNoaW5nIGxvY2FsQWNjb3VudElkIGZvdW5kLCByZXR1cm5pbmciKSx0LnZlcmJvc2VQaWkoYGdldEFjY291bnRCeUxvY2FsSWQ6IFJldHVybmluZyBzaWduZWQtaW4gYWNjb3VudHMgbWF0Y2hpbmcgbG9jYWxBY2NvdW50SWQ6ICR7ZX1gKSxvKToodC52ZXJib3NlKCJnZXRBY2NvdW50QnlMb2NhbElkOiBObyBtYXRjaGluZyBhY2NvdW50IGZvdW5kLCByZXR1cm5pbmcgbnVsbCIpLG51bGwpfWZ1bmN0aW9uIHhjKGUsdCxyKXt0LnNldEFjdGl2ZUFjY291bnQoZSxyKX1mdW5jdGlvbiBCYyhlLHQpe3JldHVybiBlLmdldEFjdGl2ZUFjY291bnQodCl9Y2xhc3MgRmN7Y29uc3RydWN0b3IoZSl7dGhpcy5ldmVudENhbGxiYWNrcz1uZXcgTWFwLHRoaXMubG9nZ2VyPWV8fG5ldyBDdCh7fSksInVuZGVmaW5lZCIhPXR5cGVvZiBCcm9hZGNhc3RDaGFubmVsJiYodGhpcy5icm9hZGNhc3RDaGFubmVsPW5ldyBCcm9hZGNhc3RDaGFubmVsKCJtc2FsLmJyb2FkY2FzdC5ldmVudCIpKSx0aGlzLmludm9rZUNyb3NzVGFiQ2FsbGJhY2tzPXRoaXMuaW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MuYmluZCh0aGlzKX1hZGRFdmVudENhbGxiYWNrKGUsdCxyKXtpZigidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyl7Y29uc3Qgbj1yfHxMYSgpO3JldHVybiB0aGlzLmV2ZW50Q2FsbGJhY2tzLmhhcyhuKT8odGhpcy5sb2dnZXIuZXJyb3IoYEV2ZW50IGNhbGxiYWNrIHdpdGggaWQ6ICR7bn0gaXMgYWxyZWFkeSByZWdpc3RlcmVkLiBQbGVhc2UgcHJvdmlkZSBhIHVuaXF1ZSBpZCBvciByZW1vdmUgdGhlIGV4aXN0aW5nIGNhbGxiYWNrIGFuZCB0cnkgYWdhaW4uYCksbnVsbCk6KHRoaXMuZXZlbnRDYWxsYmFja3Muc2V0KG4sW2UsdHx8W11dKSx0aGlzLmxvZ2dlci52ZXJib3NlKGBFdmVudCBjYWxsYmFjayByZWdpc3RlcmVkIHdpdGggaWQ6ICR7bn1gKSxuKX1yZXR1cm4gbnVsbH1yZW1vdmVFdmVudENhbGxiYWNrKGUpe3RoaXMuZXZlbnRDYWxsYmFja3MuZGVsZXRlKGUpLHRoaXMubG9nZ2VyLnZlcmJvc2UoYEV2ZW50IGNhbGxiYWNrICR7ZX0gcmVtb3ZlZC5gKX1lbWl0RXZlbnQoZSx0LHIsbil7Y29uc3Qgbz17ZXZlbnRUeXBlOmUsaW50ZXJhY3Rpb25UeXBlOnR8fG51bGwscGF5bG9hZDpyfHxudWxsLGVycm9yOm58fG51bGwsdGltZXN0YW1wOkRhdGUubm93KCl9O3N3aXRjaChlKXtjYXNlIF9jLkFDQ09VTlRfQURERUQ6Y2FzZSBfYy5BQ0NPVU5UX1JFTU9WRUQ6Y2FzZSBfYy5BQ1RJVkVfQUNDT1VOVF9DSEFOR0VEOnRoaXMuYnJvYWRjYXN0Q2hhbm5lbD8ucG9zdE1lc3NhZ2Uobyk7YnJlYWs7ZGVmYXVsdDp0aGlzLmludm9rZUNhbGxiYWNrcyhvKX19aW52b2tlQ2FsbGJhY2tzKGUpe3RoaXMuZXZlbnRDYWxsYmFja3MuZm9yRWFjaCgoKFt0LHJdLG4pPT57KDA9PT1yLmxlbmd0aHx8ci5pbmNsdWRlcyhlLmV2ZW50VHlwZSkpJiYodGhpcy5sb2dnZXIudmVyYm9zZShgRW1pdHRpbmcgZXZlbnQgdG8gY2FsbGJhY2sgJHtufTogJHtlLmV2ZW50VHlwZX1gKSx0LmFwcGx5KG51bGwsW2VdKSl9KSl9aW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MoZSl7Y29uc3QgdD1lLmRhdGE7dGhpcy5pbnZva2VDYWxsYmFja3ModCl9c3Vic2NyaWJlQ3Jvc3NUYWIoKXt0aGlzLmJyb2FkY2FzdENoYW5uZWw/LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuaW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MpfXVuc3Vic2NyaWJlQ3Jvc3NUYWIoKXt0aGlzLmJyb2FkY2FzdENoYW5uZWw/LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMuaW52b2tlQ3Jvc3NUYWJDYWxsYmFja3MpfX1jbGFzcyB6Y3tjb25zdHJ1Y3RvcihlLHQscixuLG8saSxzLGEsYyl7dGhpcy5jb25maWc9ZSx0aGlzLmJyb3dzZXJTdG9yYWdlPXQsdGhpcy5icm93c2VyQ3J5cHRvPXIsdGhpcy5uZXR3b3JrQ2xpZW50PXRoaXMuY29uZmlnLnN5c3RlbS5uZXR3b3JrQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyPW8sdGhpcy5uYXZpZ2F0aW9uQ2xpZW50PWksdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj1hLHRoaXMuY29ycmVsYXRpb25JZD1jfHxvYSgpLHRoaXMubG9nZ2VyPW4uY2xvbmUoaXMsJGEsdGhpcy5jb3JyZWxhdGlvbklkKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXN9YXN5bmMgY2xlYXJDYWNoZU9uTG9nb3V0KGUsdCl7aWYodCl0cnl7dGhpcy5icm93c2VyU3RvcmFnZS5yZW1vdmVBY2NvdW50KHQsZSksdGhpcy5sb2dnZXIudmVyYm9zZSgiQ2xlYXJlZCBjYWNoZSBpdGVtcyBiZWxvbmdpbmcgdG8gdGhlIGFjY291bnQgcHJvdmlkZWQgaW4gdGhlIGxvZ291dCByZXF1ZXN0LiIpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLmVycm9yKCJBY2NvdW50IHByb3ZpZGVkIGluIGxvZ291dCByZXF1ZXN0IHdhcyBub3QgZm91bmQuIExvY2FsIGNhY2hlIHVuY2hhbmdlZC4iKX1lbHNlIHRyeXt0aGlzLmxvZ2dlci52ZXJib3NlKCJObyBhY2NvdW50IHByb3ZpZGVkIGluIGxvZ291dCByZXF1ZXN0LCBjbGVhcmluZyBhbGwgY2FjaGUgaXRlbXMuIix0aGlzLmNvcnJlbGF0aW9uSWQpLHRoaXMuYnJvd3NlclN0b3JhZ2UuY2xlYXIoZSksYXdhaXQgdGhpcy5icm93c2VyQ3J5cHRvLmNsZWFyS2V5c3RvcmUoKX1jYXRjaChlKXt0aGlzLmxvZ2dlci5lcnJvcigiQXR0ZW1wdGVkIHRvIGNsZWFyIGFsbCBNU0FMIGNhY2hlIGl0ZW1zIGFuZCBmYWlsZWQuIExvY2FsIGNhY2hlIHVuY2hhbmdlZC4iKX19Z2V0UmVkaXJlY3RVcmkoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiZ2V0UmVkaXJlY3RVcmkgY2FsbGVkIik7Y29uc3QgdD1lfHx0aGlzLmNvbmZpZy5hdXRoLnJlZGlyZWN0VXJpO3JldHVybiB3ci5nZXRBYnNvbHV0ZVVybCh0LGJhKCkpfWluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKGUsdCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIgY2FsbGVkIik7Y29uc3Qgcj17Y2xpZW50SWQ6dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxjb3JyZWxhdGlvbklkOnRoaXMuY29ycmVsYXRpb25JZCxhcGlJZDplLGZvcmNlUmVmcmVzaDp0fHwhMSx3cmFwcGVyU0tVOnRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0V3JhcHBlck1ldGFkYXRhKClbMF0sd3JhcHBlclZlcjp0aGlzLmJyb3dzZXJTdG9yYWdlLmdldFdyYXBwZXJNZXRhZGF0YSgpWzFdfTtyZXR1cm4gbmV3IEZvKHIsdGhpcy5icm93c2VyU3RvcmFnZSl9YXN5bmMgZ2V0RGlzY292ZXJlZEF1dGhvcml0eShlKXtjb25zdHthY2NvdW50OnR9PWUscj1lLnJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVycyYmZS5yZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkoImluc3RhbmNlX2F3YXJlIik/ZS5yZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnMuaW5zdGFuY2VfYXdhcmU6dm9pZCAwO3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmNvcnJlbGF0aW9uSWQpO2NvbnN0IG49e3Byb3RvY29sTW9kZTp0aGlzLmNvbmZpZy5hdXRoLnByb3RvY29sTW9kZSxPSURDT3B0aW9uczp0aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLGtub3duQXV0aG9yaXRpZXM6dGhpcy5jb25maWcuYXV0aC5rbm93bkF1dGhvcml0aWVzLGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6dGhpcy5jb25maWcuYXV0aC5jbG91ZERpc2NvdmVyeU1ldGFkYXRhLGF1dGhvcml0eU1ldGFkYXRhOnRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5TWV0YWRhdGEsc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6dGhpcy5jb25maWcuYXV0aC5za2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZX0sbz1lLnJlcXVlc3RBdXRob3JpdHl8fHRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5LGk9cj8ubGVuZ3RoPyJ0cnVlIj09PXI6dGhpcy5jb25maWcuYXV0aC5pbnN0YW5jZUF3YXJlLHM9dCYmaT90aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eS5yZXBsYWNlKHdyLmdldERvbWFpbkZyb21VcmwobyksdC5lbnZpcm9ubWVudCk6byxhPVpuLmdlbmVyYXRlQXV0aG9yaXR5KHMsZS5yZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnN8fHRoaXMuY29uZmlnLmF1dGguYXp1cmVDbG91ZE9wdGlvbnMpLGM9YXdhaXQgVW4ocm8sT3IuQXV0aG9yaXR5RmFjdG9yeUNyZWF0ZURpc2NvdmVyZWRJbnN0YW5jZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoYSx0aGlzLmNvbmZpZy5zeXN0ZW0ubmV0d29ya0NsaWVudCx0aGlzLmJyb3dzZXJTdG9yYWdlLG4sdGhpcy5sb2dnZXIsdGhpcy5jb3JyZWxhdGlvbklkLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO2lmKHQmJiFjLmlzQWxpYXModC5lbnZpcm9ubWVudCkpdGhyb3cgSnQoenQpO3JldHVybiBjfX1hc3luYyBmdW5jdGlvbiBLYyhlLHQscixuKXtyLmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LGUuY29ycmVsYXRpb25JZCk7Y29uc3Qgbz1lLmF1dGhvcml0eXx8dC5hdXRoLmF1dGhvcml0eSxpPVsuLi5lJiZlLnNjb3Blc3x8W11dLHM9ey4uLmUsY29ycmVsYXRpb25JZDplLmNvcnJlbGF0aW9uSWQsYXV0aG9yaXR5Om8sc2NvcGVzOml9O2lmKHMuYXV0aGVudGljYXRpb25TY2hlbWUpe2lmKHMuYXV0aGVudGljYXRpb25TY2hlbWU9PT1XLlNTSCl7aWYoIWUuc3NoSndrKXRocm93IEp0KEx0KTtpZighZS5zc2hLaWQpdGhyb3cgSnQoRHQpfW4udmVyYm9zZShgQXV0aGVudGljYXRpb24gU2NoZW1lIHNldCB0byAiJHtzLmF1dGhlbnRpY2F0aW9uU2NoZW1lfSIgYXMgY29uZmlndXJlZCBpbiBBdXRoIHJlcXVlc3RgKX1lbHNlIHMuYXV0aGVudGljYXRpb25TY2hlbWU9Vy5CRUFSRVIsbi52ZXJib3NlKCdBdXRoZW50aWNhdGlvbiBTY2hlbWUgd2FzblwndCBleHBsaWNpdGx5IHNldCBpbiByZXF1ZXN0LCBkZWZhdWx0aW5nIHRvICJCZWFyZXIiIHJlcXVlc3QnKTtyZXR1cm4gdC5jYWNoZS5jbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkJiZlLmNsYWltcyYmIVl0LmlzRW1wdHlPYmooZS5jbGFpbXMpJiYocy5yZXF1ZXN0ZWRDbGFpbXNIYXNoPWF3YWl0IGdhKGUuY2xhaW1zKSksc31hc3luYyBmdW5jdGlvbiBHYyhlLHQscixuLG8pe24uYWRkUXVldWVNZWFzdXJlbWVudChPci5Jbml0aWFsaXplU2lsZW50UmVxdWVzdCxlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IGk9YXdhaXQgVW4oS2MsT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LG8sbixlLmNvcnJlbGF0aW9uSWQpKGUscixuLG8pO3JldHVybnsuLi5lLC4uLmksYWNjb3VudDp0LGZvcmNlUmVmcmVzaDplLmZvcmNlUmVmcmVzaHx8ITF9fWZ1bmN0aW9uICRjKGUsdCl7bGV0IHI7Y29uc3Qgbj1lLmh0dHBNZXRob2Q7aWYodD09PWxyLkVBUil7aWYocj1ufHxsLHIhPT1sKXRocm93IEp0KEt0KX1lbHNlIHI9bnx8YztpZihlLmF1dGhvcml6ZVBvc3RCb2R5UGFyYW1ldGVycyYmciE9PWwpdGhyb3cgSnQoR3QpO3JldHVybiByfWNsYXNzIFFjIGV4dGVuZHMgemN7aW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgiaW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QgY2FsbGVkIixlPy5jb3JyZWxhdGlvbklkKTtjb25zdCB0PXtjb3JyZWxhdGlvbklkOnRoaXMuY29ycmVsYXRpb25JZHx8b2EoKSwuLi5lfTtpZihlKWlmKGUubG9nb3V0SGludCl0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRIaW50IGhhcyBhbHJlYWR5IGJlZW4gc2V0IGluIGxvZ291dFJlcXVlc3QiKTtlbHNlIGlmKGUuYWNjb3VudCl7Y29uc3Qgcj10aGlzLmdldExvZ291dEhpbnRGcm9tSWRUb2tlbkNsYWltcyhlLmFjY291bnQpO3ImJih0aGlzLmxvZ2dlci52ZXJib3NlKCJTZXR0aW5nIGxvZ291dEhpbnQgdG8gbG9naW5faGludCBJRCBUb2tlbiBDbGFpbSB2YWx1ZSBmb3IgdGhlIGFjY291bnQgcHJvdmlkZWQiKSx0LmxvZ291dEhpbnQ9cil9ZWxzZSB0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRIaW50IHdhcyBub3Qgc2V0IGFuZCBhY2NvdW50IHdhcyBub3QgcGFzc2VkIGludG8gbG9nb3V0IHJlcXVlc3QsIGxvZ291dEhpbnQgd2lsbCBub3QgYmUgc2V0Iik7ZWxzZSB0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRIaW50IHdpbGwgbm90IGJlIHNldCBzaW5jZSBubyBsb2dvdXQgcmVxdWVzdCB3YXMgY29uZmlndXJlZCIpO3JldHVybiBlJiZudWxsPT09ZS5wb3N0TG9nb3V0UmVkaXJlY3RVcmk/dGhpcy5sb2dnZXIudmVyYm9zZSgicG9zdExvZ291dFJlZGlyZWN0VXJpIHBhc3NlZCBhcyBudWxsLCBub3Qgc2V0dGluZyBwb3N0IGxvZ291dCByZWRpcmVjdCB1cmkiLHQuY29ycmVsYXRpb25JZCk6ZSYmZS5wb3N0TG9nb3V0UmVkaXJlY3RVcmk/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIlNldHRpbmcgcG9zdExvZ291dFJlZGlyZWN0VXJpIHRvIHVyaSBzZXQgb24gbG9nb3V0IHJlcXVlc3QiLHQuY29ycmVsYXRpb25JZCksdC5wb3N0TG9nb3V0UmVkaXJlY3RVcmk9d3IuZ2V0QWJzb2x1dGVVcmwoZS5wb3N0TG9nb3V0UmVkaXJlY3RVcmksYmEoKSkpOm51bGw9PT10aGlzLmNvbmZpZy5hdXRoLnBvc3RMb2dvdXRSZWRpcmVjdFVyaT90aGlzLmxvZ2dlci52ZXJib3NlKCJwb3N0TG9nb3V0UmVkaXJlY3RVcmkgY29uZmlndXJlZCBhcyBudWxsIGFuZCBubyB1cmkgc2V0IG9uIHJlcXVlc3QsIG5vdCBwYXNzaW5nIHBvc3QgbG9nb3V0IHJlZGlyZWN0Iix0LmNvcnJlbGF0aW9uSWQpOnRoaXMuY29uZmlnLmF1dGgucG9zdExvZ291dFJlZGlyZWN0VXJpPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJTZXR0aW5nIHBvc3RMb2dvdXRSZWRpcmVjdFVyaSB0byBjb25maWd1cmVkIHVyaSIsdC5jb3JyZWxhdGlvbklkKSx0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaT13ci5nZXRBYnNvbHV0ZVVybCh0aGlzLmNvbmZpZy5hdXRoLnBvc3RMb2dvdXRSZWRpcmVjdFVyaSxiYSgpKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoIlNldHRpbmcgcG9zdExvZ291dFJlZGlyZWN0VXJpIHRvIGN1cnJlbnQgcGFnZSIsdC5jb3JyZWxhdGlvbklkKSx0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaT13ci5nZXRBYnNvbHV0ZVVybChiYSgpLGJhKCkpKSx0fWdldExvZ291dEhpbnRGcm9tSWRUb2tlbkNsYWltcyhlKXtjb25zdCB0PWUuaWRUb2tlbkNsYWltcztpZih0KXtpZih0LmxvZ2luX2hpbnQpcmV0dXJuIHQubG9naW5faGludDt0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgSUQgVG9rZW4gQ2xhaW1zIHRpZWQgdG8gdGhlIHByb3ZpZGVkIGFjY291bnQgZG8gbm90IGNvbnRhaW4gYSBsb2dpbl9oaW50IGNsYWltLCBsb2dvdXRIaW50IHdpbGwgbm90IGJlIGFkZGVkIHRvIGxvZ291dCByZXF1ZXN0Iil9ZWxzZSB0aGlzLmxvZ2dlci52ZXJib3NlKCJUaGUgcHJvdmlkZWQgYWNjb3VudCBkb2VzIG5vdCBjb250YWluIElEIFRva2VuIENsYWltcywgbG9nb3V0SGludCB3aWxsIG5vdCBiZSBhZGRlZCB0byBsb2dvdXQgcmVxdWVzdCIpO3JldHVybiBudWxsfWFzeW5jIGNyZWF0ZUF1dGhDb2RlQ2xpZW50KGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCB0PWF3YWl0IFVuKHRoaXMuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShlKTtyZXR1cm4gbmV3IHFvKHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCl9YXN5bmMgZ2V0Q2xpZW50Q29uZmlndXJhdGlvbihlKXtjb25zdHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOnIscmVxdWVzdEF1dGhvcml0eTpuLHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczpvLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczppLGFjY291bnQ6c309ZTt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldENsaWVudENvbmZpZ3VyYXRpb24sdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBhPWUuYXV0aG9yaXR5fHxhd2FpdCBVbih0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3JlcXVlc3RBdXRob3JpdHk6bixyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6byxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6aSxhY2NvdW50OnN9KSxjPXRoaXMuY29uZmlnLnN5c3RlbS5sb2dnZXJPcHRpb25zO3JldHVybnthdXRoT3B0aW9uczp7Y2xpZW50SWQ6dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxhdXRob3JpdHk6YSxjbGllbnRDYXBhYmlsaXRpZXM6dGhpcy5jb25maWcuYXV0aC5jbGllbnRDYXBhYmlsaXRpZXMscmVkaXJlY3RVcmk6dGhpcy5jb25maWcuYXV0aC5yZWRpcmVjdFVyaX0sc3lzdGVtT3B0aW9uczp7dG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kczp0aGlzLmNvbmZpZy5zeXN0ZW0udG9rZW5SZW5ld2FsT2Zmc2V0U2Vjb25kcyxwcmV2ZW50Q29yc1ByZWZsaWdodDohMH0sbG9nZ2VyT3B0aW9uczp7bG9nZ2VyQ2FsbGJhY2s6Yy5sb2dnZXJDYWxsYmFjayxwaWlMb2dnaW5nRW5hYmxlZDpjLnBpaUxvZ2dpbmdFbmFibGVkLGxvZ0xldmVsOmMubG9nTGV2ZWwsY29ycmVsYXRpb25JZDp0aGlzLmNvcnJlbGF0aW9uSWR9LGNhY2hlT3B0aW9uczp7Y2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDp0aGlzLmNvbmZpZy5jYWNoZS5jbGFpbXNCYXNlZENhY2hpbmdFbmFibGVkfSxjcnlwdG9JbnRlcmZhY2U6dGhpcy5icm93c2VyQ3J5cHRvLG5ldHdvcmtJbnRlcmZhY2U6dGhpcy5uZXR3b3JrQ2xpZW50LHN0b3JhZ2VJbnRlcmZhY2U6dGhpcy5icm93c2VyU3RvcmFnZSxzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOnIsbGlicmFyeUluZm86e3NrdTppcyx2ZXJzaW9uOiRhLGNwdTp0LkVNUFRZX1NUUklORyxvczp0LkVNUFRZX1NUUklOR30sdGVsZW1ldHJ5OnRoaXMuY29uZmlnLnRlbGVtZXRyeX19YXN5bmMgaW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0KGUscil7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsdGhpcy5jb3JyZWxhdGlvbklkKTtjb25zdCBuPXRoaXMuZ2V0UmVkaXJlY3RVcmkoZS5yZWRpcmVjdFVyaSksbz17aW50ZXJhY3Rpb25UeXBlOnJ9LGk9Ym8uc2V0UmVxdWVzdFN0YXRlKHRoaXMuYnJvd3NlckNyeXB0byxlJiZlLnN0YXRlfHx0LkVNUFRZX1NUUklORyxvKSxzPXsuLi5hd2FpdCBVbihLYyxPci5Jbml0aWFsaXplQmFzZVJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHsuLi5lLGNvcnJlbGF0aW9uSWQ6dGhpcy5jb3JyZWxhdGlvbklkfSx0aGlzLmNvbmZpZyx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyKSxyZWRpcmVjdFVyaTpuLHN0YXRlOmksbm9uY2U6ZS5ub25jZXx8b2EoKSxyZXNwb25zZU1vZGU6dGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGV9LGE9ey4uLnMsaHR0cE1ldGhvZDokYyhzLHRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlKX07aWYoZS5sb2dpbkhpbnR8fGUuc2lkKXJldHVybiBhO2NvbnN0IGM9ZS5hY2NvdW50fHx0aGlzLmJyb3dzZXJTdG9yYWdlLmdldEFjdGl2ZUFjY291bnQodGhpcy5jb3JyZWxhdGlvbklkKTtyZXR1cm4gYyYmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlNldHRpbmcgdmFsaWRhdGVkIHJlcXVlc3QgYWNjb3VudCIsdGhpcy5jb3JyZWxhdGlvbklkKSx0aGlzLmxvZ2dlci52ZXJib3NlUGlpKGBTZXR0aW5nIHZhbGlkYXRlZCByZXF1ZXN0IGFjY291bnQ6ICR7Yy5ob21lQWNjb3VudElkfWAsdGhpcy5jb3JyZWxhdGlvbklkKSxhLmFjY291bnQ9YyksYX19ZnVuY3Rpb24gamMoZSx0LHIpe2NvbnN0IG49ZnIoZSk7aWYoIW4pdGhyb3cgbXIoZSk/KHIuZXJyb3IoYEEgJHt0fSBpcyBwcmVzZW50IGluIHRoZSBpZnJhbWUgYnV0IGl0IGRvZXMgbm90IGNvbnRhaW4ga25vd24gcHJvcGVydGllcy4gSXQncyBsaWtlbHkgdGhhdCB0aGUgJHt0fSBoYXMgYmVlbiByZXBsYWNlZCBieSBjb2RlIHJ1bm5pbmcgb24gdGhlIHJlZGlyZWN0VXJpIHBhZ2UuYCksci5lcnJvclBpaShgVGhlICR7dH0gZGV0ZWN0ZWQgaXM6ICR7ZX1gKSxaaShvaSkpOihyLmVycm9yKGBUaGUgcmVxdWVzdCBoYXMgcmV0dXJuZWQgdG8gdGhlIHJlZGlyZWN0VXJpIGJ1dCBhICR7dH0gaXMgbm90IHByZXNlbnQuIEl0J3MgbGlrZWx5IHRoYXQgdGhlICR7dH0gaGFzIGJlZW4gcmVtb3ZlZCBvciB0aGUgcGFnZSBoYXMgYmVlbiByZWRpcmVjdGVkIGJ5IGNvZGUgcnVubmluZyBvbiB0aGUgcmVkaXJlY3RVcmkgcGFnZS5gKSxaaShyaSkpO3JldHVybiBufWZ1bmN0aW9uIFdjKGUsdCxyKXtpZighZS5zdGF0ZSl0aHJvdyBaaShuaSk7Y29uc3Qgbj1mdW5jdGlvbihlLHQpe2lmKCF0KXJldHVybiBudWxsO3RyeXtyZXR1cm4gYm8ucGFyc2VSZXF1ZXN0U3RhdGUoZSx0KS5saWJyYXJ5U3RhdGUubWV0YX1jYXRjaChlKXt0aHJvdyBtdChSZSl9fSh0LGUuc3RhdGUpO2lmKCFuKXRocm93IFppKGlpKTtpZihuLmludGVyYWN0aW9uVHlwZSE9PXIpdGhyb3cgWmkoc2kpfWNsYXNzIFZje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyl7dGhpcy5hdXRoTW9kdWxlPWUsdGhpcy5icm93c2VyU3RvcmFnZT10LHRoaXMuYXV0aENvZGVSZXF1ZXN0PXIsdGhpcy5sb2dnZXI9bix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PW99YXN5bmMgaGFuZGxlQ29kZVJlc3BvbnNlKGUsdCl7bGV0IHI7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkhhbmRsZUNvZGVSZXNwb25zZSx0LmNvcnJlbGF0aW9uSWQpO3RyeXtyPWZ1bmN0aW9uKGUsdCl7aWYoeG8oZSx0KSwhZS5jb2RlKXRocm93IG10KHR0KTtyZXR1cm4gZX0oZSx0LnN0YXRlKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2Ygbm8mJmUuc3ViRXJyb3I9PT1oaT9aaShoaSk6ZX1yZXR1cm4gVW4odGhpcy5oYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyLmJpbmQodGhpcyksT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkocix0KX1hc3luYyBoYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyKGUsdCxyPSEwKXtpZih0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcix0LmNvcnJlbGF0aW9uSWQpLHRoaXMubG9nZ2VyLnRyYWNlKCJJbnRlcmFjdGlvbkhhbmRsZXIuaGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlciBjYWxsZWQiKSx0aGlzLmF1dGhDb2RlUmVxdWVzdC5jb2RlPWUuY29kZSxlLmNsb3VkX2luc3RhbmNlX2hvc3RfbmFtZSYmYXdhaXQgVW4odGhpcy5hdXRoTW9kdWxlLnVwZGF0ZUF1dGhvcml0eS5iaW5kKHRoaXMuYXV0aE1vZHVsZSksT3IuVXBkYXRlVG9rZW5FbmRwb2ludEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkoZS5jbG91ZF9pbnN0YW5jZV9ob3N0X25hbWUsdC5jb3JyZWxhdGlvbklkKSxyJiYoZS5ub25jZT10Lm5vbmNlfHx2b2lkIDApLGUuc3RhdGU9dC5zdGF0ZSxlLmNsaWVudF9pbmZvKXRoaXMuYXV0aENvZGVSZXF1ZXN0LmNsaWVudEluZm89ZS5jbGllbnRfaW5mbztlbHNle2NvbnN0IGU9dGhpcy5jcmVhdGVDY3NDcmVkZW50aWFscyh0KTtlJiYodGhpcy5hdXRoQ29kZVJlcXVlc3QuY2NzQ3JlZGVudGlhbD1lKX1yZXR1cm4gYXdhaXQgVW4odGhpcy5hdXRoTW9kdWxlLmFjcXVpcmVUb2tlbi5iaW5kKHRoaXMuYXV0aE1vZHVsZSksT3IuQXV0aENsaWVudEFjcXVpcmVUb2tlbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkodGhpcy5hdXRoQ29kZVJlcXVlc3QsZSl9Y3JlYXRlQ2NzQ3JlZGVudGlhbHMoZSl7cmV0dXJuIGUuYWNjb3VudD97Y3JlZGVudGlhbDplLmFjY291bnQuaG9tZUFjY291bnRJZCx0eXBlOldyfTplLmxvZ2luSGludD97Y3JlZGVudGlhbDplLmxvZ2luSGludCx0eXBlOlZyfTpudWxsfX1jb25zdCBKYz0idXNlcl9zd2l0Y2giLFljPXtbSmNdOiJVc2VyIGF0dGVtcHRlZCB0byBzd2l0Y2ggYWNjb3VudHMgaW4gdGhlIG5hdGl2ZSBicm9rZXIsIHdoaWNoIGlzIG5vdCBhbGxvd2VkLiBBbGwgbmV3IGFjY291bnRzIG11c3Qgc2lnbi1pbiB0aHJvdWdoIHRoZSBzdGFuZGFyZCB3ZWIgZmxvdyBmaXJzdCwgcGxlYXNlIHRyeSBhZ2Fpbi4ifTtjbGFzcyBYYyBleHRlbmRzIENle2NvbnN0cnVjdG9yKGUsdCxyKXtzdXBlcihlLHQpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLFhjLnByb3RvdHlwZSksdGhpcy5uYW1lPSJOYXRpdmVBdXRoRXJyb3IiLHRoaXMuZXh0PXJ9fWZ1bmN0aW9uIFpjKGUpe2lmKGUuZXh0JiZlLmV4dC5zdGF0dXMmJiJESVNBQkxFRCI9PT1lLmV4dC5zdGF0dXMpcmV0dXJuITA7aWYoZS5leHQmJmUuZXh0LmVycm9yJiYtMjE0NzE4Njk0Mz09PWUuZXh0LmVycm9yKXJldHVybiEwO3N3aXRjaChlLmVycm9yQ29kZSl7Y2FzZSJDb250ZW50RXJyb3IiOmNhc2UiUGFnZUV4Y2VwdGlvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gZWwoZSx0LHIpe2lmKHImJnIuc3RhdHVzKXN3aXRjaChyLnN0YXR1cyl7Y2FzZSJBQ0NPVU5UX1VOQVZBSUxBQkxFIjpyZXR1cm4gU28oaG8pO2Nhc2UiVVNFUl9JTlRFUkFDVElPTl9SRVFVSVJFRCI6cmV0dXJuIG5ldyBBbyhlLHQpO2Nhc2UiVVNFUl9DQU5DRUwiOnJldHVybiBaaShoaSk7Y2FzZSJOT19ORVRXT1JLIjpyZXR1cm4gWmkoYmkpO2Nhc2UiVVhfTk9UX0FMTE9XRUQiOnJldHVybiBTbyhnbyl9cmV0dXJuIG5ldyBYYyhlLFljW2VdfHx0LHIpfWNsYXNzIHRsIGV4dGVuZHMgUWN7YXN5bmMgYWNxdWlyZVRva2VuKGUpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRDYWNoZUNsaWVudEFjcXVpcmVUb2tlbixlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5hY3F1aXJlVG9rZW5TaWxlbnRfc2lsZW50Rmxvdykscj1hd2FpdCBVbih0aGlzLmdldENsaWVudENvbmZpZ3VyYXRpb24uYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0Q2xpZW50Q29uZmlndXJhdGlvbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6dCxyZXF1ZXN0QXV0aG9yaXR5OmUuYXV0aG9yaXR5LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLGFjY291bnQ6ZS5hY2NvdW50fSksbj1uZXcgVW8ocix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTt0aGlzLmxvZ2dlci52ZXJib3NlKCJTaWxlbnQgYXV0aCBjbGllbnQgY3JlYXRlZCIpO3RyeXtjb25zdCB0PShhd2FpdCBVbihuLmFjcXVpcmVDYWNoZWRUb2tlbi5iaW5kKG4pLE9yLlNpbGVudEZsb3dDbGllbnRBY3F1aXJlQ2FjaGVkVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpKVswXTtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe2Zyb21DYWNoZTohMH0sZS5jb3JyZWxhdGlvbklkKSx0fWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBYaSYmZS5lcnJvckNvZGU9PT1NaSYmdGhpcy5sb2dnZXIudmVyYm9zZSgiU2lnbmluZyBrZXlwYWlyIGZvciBib3VuZCBhY2Nlc3MgdG9rZW4gbm90IGZvdW5kLiBSZWZyZXNoaW5nIGJvdW5kIGFjY2VzcyB0b2tlbiBhbmQgZ2VuZXJhdGluZyBhIG5ldyBjcnlwdG8ga2V5cGFpci4iKSxlfX1sb2dvdXQoZSl7dGhpcy5sb2dnZXIudmVyYm9zZSgibG9nb3V0UmVkaXJlY3QgY2FsbGVkIik7Y29uc3QgdD10aGlzLmluaXRpYWxpemVMb2dvdXRSZXF1ZXN0KGUpO3JldHVybiB0aGlzLmNsZWFyQ2FjaGVPbkxvZ291dCh0LmNvcnJlbGF0aW9uSWQsdD8uYWNjb3VudCl9fWNsYXNzIHJsIGV4dGVuZHMgemN7Y29uc3RydWN0b3IoZSx0LHIsbixvLGkscyxhLGMsbCxoLGQpe3N1cGVyKGUsdCxyLG4sbyxpLGEsYyxkKSx0aGlzLmFwaUlkPXMsdGhpcy5hY2NvdW50SWQ9bCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyPWMsdGhpcy5uYXRpdmVTdG9yYWdlTWFuYWdlcj1oLHRoaXMuc2lsZW50Q2FjaGVDbGllbnQ9bmV3IHRsKGUsdGhpcy5uYXRpdmVTdG9yYWdlTWFuYWdlcixyLG4sbyxpLGEsYyxkKTtjb25zdCB1PXRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuZ2V0RXh0ZW5zaW9uTmFtZSgpO3RoaXMuc2t1cz1Gby5tYWtlRXh0cmFTa3VTdHJpbmcoe2xpYnJhcnlOYW1lOmlzLGxpYnJhcnlWZXJzaW9uOiRhLGV4dGVuc2lvbk5hbWU6dSxleHRlbnNpb25WZXJzaW9uOnRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuZ2V0RXh0ZW5zaW9uVmVyc2lvbigpfSl9YWRkUmVxdWVzdFNLVXMoZSl7ZS5leHRyYVBhcmFtZXRlcnM9ey4uLmUuZXh0cmFQYXJhbWV0ZXJzLFt0bl06dGhpcy5za3VzfX1hc3luYyBhY3F1aXJlVG9rZW4oZSx0KXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuTmF0aXZlSW50ZXJhY3Rpb25DbGllbnRBY3F1aXJlVG9rZW4sdGhpcy5jb3JyZWxhdGlvbklkKSx0aGlzLmxvZ2dlci50cmFjZSgiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBhY3F1aXJlVG9rZW4gY2FsbGVkLiIpO2NvbnN0IHI9dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLHRoaXMuY29ycmVsYXRpb25JZCksbj1EbigpLG89dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcih0aGlzLmFwaUlkKTt0cnl7Y29uc3QgaT1hd2FpdCB0aGlzLmluaXRpYWxpemVOYXRpdmVSZXF1ZXN0KGUpO3RyeXtjb25zdCBlPWF3YWl0IHRoaXMuYWNxdWlyZVRva2Vuc0Zyb21DYWNoZSh0aGlzLmFjY291bnRJZCxpKTtyZXR1cm4gci5lbmQoe3N1Y2Nlc3M6ITAsaXNOYXRpdmVCcm9rZXI6ITEsZnJvbUNhY2hlOiEwfSksZX1jYXRjaChlKXtpZih0PT09RHMuQWNjZXNzVG9rZW4pdGhyb3cgdGhpcy5sb2dnZXIuaW5mbygiTVNBTCBpbnRlcm5hbCBDYWNoZSBkb2VzIG5vdCBjb250YWluIHRva2VucywgcmV0dXJuIGVycm9yIGFzIHBlciBjYWNoZSBwb2xpY3kiKSxyLmVuZCh7c3VjY2VzczohMSxicm9rZXJFcnJvckNvZGU6ImNhY2hlX3JlcXVlc3RfZmFpbGVkIn0pLGU7dGhpcy5sb2dnZXIuaW5mbygiTVNBTCBpbnRlcm5hbCBDYWNoZSBkb2VzIG5vdCBjb250YWluIHRva2VucywgcHJvY2VlZCB0byBtYWtlIGEgbmF0aXZlIGNhbGwiKX1jb25zdCBzPWF3YWl0IHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuc2VuZE1lc3NhZ2UoaSk7cmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlTmF0aXZlUmVzcG9uc2UocyxpLG4pLnRoZW4oKGU9PihyLmVuZCh7c3VjY2VzczohMCxpc05hdGl2ZUJyb2tlcjohMCxyZXF1ZXN0SWQ6ZS5yZXF1ZXN0SWR9KSxvLmNsZWFyTmF0aXZlQnJva2VyRXJyb3JDb2RlKCksZSkpKS5jYXRjaCgoZT0+e3Rocm93IHIuZW5kKHtzdWNjZXNzOiExLGVycm9yQ29kZTplLmVycm9yQ29kZSxzdWJFcnJvckNvZGU6ZS5zdWJFcnJvcn0pLGV9KSl9Y2F0Y2goZSl7dGhyb3cgZSBpbnN0YW5jZW9mIFhjJiZvLnNldE5hdGl2ZUJyb2tlckVycm9yQ29kZShlLmVycm9yQ29kZSksci5lbmQoe3N1Y2Nlc3M6ITF9KSxlfX1jcmVhdGVTaWxlbnRDYWNoZVJlcXVlc3QoZSx0KXtyZXR1cm57YXV0aG9yaXR5OmUuYXV0aG9yaXR5LGNvcnJlbGF0aW9uSWQ6dGhpcy5jb3JyZWxhdGlvbklkLHNjb3BlczpYdC5mcm9tU3RyaW5nKGUuc2NvcGUpLmFzQXJyYXkoKSxhY2NvdW50OnQsZm9yY2VSZWZyZXNoOiExfX1hc3luYyBhY3F1aXJlVG9rZW5zRnJvbUNhY2hlKGUsdCl7aWYoIWUpdGhyb3cgdGhpcy5sb2dnZXIud2FybmluZygiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQ6YWNxdWlyZVRva2Vuc0Zyb21DYWNoZSAtIE5vIG5hdGl2ZUFjY291bnRJZCBwcm92aWRlZCIpLG10KGplKTtjb25zdCByPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0QmFzZUFjY291bnRJbmZvKHtuYXRpdmVBY2NvdW50SWQ6ZX0sdGhpcy5jb3JyZWxhdGlvbklkKTtpZighcil0aHJvdyBtdChqZSk7dHJ5e2NvbnN0IGU9dGhpcy5jcmVhdGVTaWxlbnRDYWNoZVJlcXVlc3QodCxyKSxuPWF3YWl0IHRoaXMuc2lsZW50Q2FjaGVDbGllbnQuYWNxdWlyZVRva2VuKGUpLG89ey4uLnIsaWRUb2tlbkNsYWltczpuPy5pZFRva2VuQ2xhaW1zLGlkVG9rZW46bj8uaWRUb2tlbn07cmV0dXJuey4uLm4sYWNjb3VudDpvfX1jYXRjaChlKXt0aHJvdyBlfX1hc3luYyBhY3F1aXJlVG9rZW5SZWRpcmVjdChlLHQpe3RoaXMubG9nZ2VyLnRyYWNlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGFjcXVpcmVUb2tlblJlZGlyZWN0IGNhbGxlZC4iKTtjb25zdHsuLi5yfT1lO2RlbGV0ZSByLm9uUmVkaXJlY3ROYXZpZ2F0ZTtjb25zdCBuPWF3YWl0IHRoaXMuaW5pdGlhbGl6ZU5hdGl2ZVJlcXVlc3Qocik7dHJ5e2F3YWl0IHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIuc2VuZE1lc3NhZ2Uobil9Y2F0Y2goZSl7aWYoZSBpbnN0YW5jZW9mIFhjKXtpZih0aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpLnNldE5hdGl2ZUJyb2tlckVycm9yQ29kZShlLmVycm9yQ29kZSksWmMoZSkpdGhyb3cgZX19dGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShScyxKU09OLnN0cmluZ2lmeShuKSwhMCk7Y29uc3Qgbz17YXBpSWQ6TXMuYWNxdWlyZVRva2VuUmVkaXJlY3QsdGltZW91dDp0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCxub0hpc3Rvcnk6ITF9LGk9dGhpcy5jb25maWcuYXV0aC5uYXZpZ2F0ZVRvTG9naW5SZXF1ZXN0VXJsP3dpbmRvdy5sb2NhdGlvbi5ocmVmOnRoaXMuZ2V0UmVkaXJlY3RVcmkoZS5yZWRpcmVjdFVyaSk7dC5lbmQoe3N1Y2Nlc3M6ITB9KSxhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVFeHRlcm5hbChpLG8pfWFzeW5jIGhhbmRsZVJlZGlyZWN0UHJvbWlzZShlLHQpe2lmKHRoaXMubG9nZ2VyLnRyYWNlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQuIiksIXRoaXMuYnJvd3NlclN0b3JhZ2UuaXNJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITApKXJldHVybiB0aGlzLmxvZ2dlci5pbmZvKCJoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbnRlcmFjdGlvbiBpbiBwcm9ncmVzcywgcmV0dXJuaW5nIG51bGwuIiksbnVsbDtjb25zdCByPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0Q2FjaGVkTmF0aXZlUmVxdWVzdCgpO2lmKCFyKXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQgYnV0IHRoZXJlIGlzIG5vIGNhY2hlZCByZXF1ZXN0LCByZXR1cm5pbmcgbnVsbC4iKSxlJiZ0JiZlPy5hZGRGaWVsZHMoe2Vycm9yQ29kZToibm9fY2FjaGVkX3JlcXVlc3QifSx0KSxudWxsO2NvbnN0e3Byb21wdDpuLC4uLm99PXI7biYmdGhpcy5sb2dnZXIudmVyYm9zZSgiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIGFuZCBwcm9tcHQgd2FzIGluY2x1ZGVkIGluIHRoZSBvcmlnaW5hbCByZXF1ZXN0LCByZW1vdmluZyBwcm9tcHQgZnJvbSBjYWNoZWQgcmVxdWVzdCB0byBwcmV2ZW50IHNlY29uZCBpbnRlcmFjdGlvbiB3aXRoIG5hdGl2ZSBicm9rZXIgd2luZG93LiIpLHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmJyb3dzZXJTdG9yYWdlLmdlbmVyYXRlQ2FjaGVLZXkoUnMpKTtjb25zdCBpPURuKCk7dHJ5e3RoaXMubG9nZ2VyLnZlcmJvc2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gaGFuZGxlUmVkaXJlY3RQcm9taXNlIHNlbmRpbmcgbWVzc2FnZSB0byBuYXRpdmUgYnJva2VyLiIpO2NvbnN0IHQ9YXdhaXQgdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlci5zZW5kTWVzc2FnZShvKSxyPWF3YWl0IHRoaXMuaGFuZGxlTmF0aXZlUmVzcG9uc2UodCxvLGkpO3JldHVybiB0aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpLmNsZWFyTmF0aXZlQnJva2VyRXJyb3JDb2RlKCksZSYmdGhpcy5jb3JyZWxhdGlvbklkJiZ0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7aXNOYXRpdmVCcm9rZXI6ITB9LHRoaXMuY29ycmVsYXRpb25JZCkscn1jYXRjaChlKXt0aHJvdyBlfX1sb2dvdXQoKXtyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gbG9nb3V0IGNhbGxlZC4iKSxQcm9taXNlLnJlamVjdCgiTG9nb3V0IG5vdCBpbXBsZW1lbnRlZCB5ZXQiKX1hc3luYyBoYW5kbGVOYXRpdmVSZXNwb25zZShlLHQscil7dGhpcy5sb2dnZXIudHJhY2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gaGFuZGxlTmF0aXZlUmVzcG9uc2UgY2FsbGVkLiIpO2NvbnN0IG49ZHIoZS5pZF90b2tlbixLcyksbz10aGlzLmNyZWF0ZUhvbWVBY2NvdW50SWRlbnRpZmllcihlLG4pLGk9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRBY2NvdW50SW5mb0ZpbHRlcmVkQnkoe25hdGl2ZUFjY291bnRJZDp0LmFjY291bnRJZH0sdGhpcy5jb3JyZWxhdGlvbklkKT8uaG9tZUFjY291bnRJZDtpZih0LmV4dHJhUGFyYW1ldGVycz8uY2hpbGRfY2xpZW50X2lkJiZlLmFjY291bnQuaWQhPT10LmFjY291bnRJZCl0aGlzLmxvZ2dlci5pbmZvKCJoYW5kbGVOYXRpdmVTZXJ2ZXJSZXNwb25zZTogRG91YmxlIGJyb2tlciBmbG93IGRldGVjdGVkLCBpZ25vcmluZyBhY2NvdW50SWQgbWlzbWF0Y2giKTtlbHNlIGlmKG8hPT1pJiZlLmFjY291bnQuaWQhPT10LmFjY291bnRJZCl0aHJvdyBlbChKYyk7Y29uc3Qgcz1hd2FpdCB0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkoe3JlcXVlc3RBdXRob3JpdHk6dC5hdXRob3JpdHl9KSxhPU1vKHRoaXMuYnJvd3NlclN0b3JhZ2UscyxvLEtzLHRoaXMuY29ycmVsYXRpb25JZCxuLGUuY2xpZW50X2luZm8sdm9pZCAwLG4udGlkLHZvaWQgMCxlLmFjY291bnQuaWQsdGhpcy5sb2dnZXIpO2UuZXhwaXJlc19pbj1OdW1iZXIoZS5leHBpcmVzX2luKTtjb25zdCBjPWF3YWl0IHRoaXMuZ2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdChlLHQsbixhLHMuY2Fub25pY2FsQXV0aG9yaXR5LHIpO3JldHVybiBhd2FpdCB0aGlzLmNhY2hlQWNjb3VudChhLHRoaXMuY29ycmVsYXRpb25JZCx1cihuKSksYXdhaXQgdGhpcy5jYWNoZU5hdGl2ZVRva2VucyhlLHQsbyxuLGUuYWNjZXNzX3Rva2VuLGMudGVuYW50SWQsciksY31jcmVhdGVIb21lQWNjb3VudElkZW50aWZpZXIoZSxyKXtyZXR1cm4gaHIuZ2VuZXJhdGVIb21lQWNjb3VudElkKGUuY2xpZW50X2luZm98fHQuRU1QVFlfU1RSSU5HLG9yLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlckNyeXB0byxyKX1nZW5lcmF0ZVNjb3BlcyhlLHQpe3JldHVybiB0P1h0LmZyb21TdHJpbmcodCk6WHQuZnJvbVN0cmluZyhlKX1hc3luYyBnZW5lcmF0ZVBvcEFjY2Vzc1Rva2VuKGUsdCl7aWYodC50b2tlblR5cGU9PT1XLlBPUCYmdC5zaWduUG9wVG9rZW4pe2lmKGUuc2hyKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiaGFuZGxlTmF0aXZlU2VydmVyUmVzcG9uc2U6IFNIUiBpcyBlbmFibGVkIGluIG5hdGl2ZSBsYXllciIpLGUuc2hyO2NvbnN0IHI9bmV3IFJvKHRoaXMuYnJvd3NlckNyeXB0byksbj17cmVzb3VyY2VSZXF1ZXN0TWV0aG9kOnQucmVzb3VyY2VSZXF1ZXN0TWV0aG9kLHJlc291cmNlUmVxdWVzdFVyaTp0LnJlc291cmNlUmVxdWVzdFVyaSxzaHJDbGFpbXM6dC5zaHJDbGFpbXMsc2hyTm9uY2U6dC5zaHJOb25jZX07aWYoIXQua2V5SWQpdGhyb3cgbXQob3QpO3JldHVybiByLnNpZ25Qb3BUb2tlbihlLmFjY2Vzc190b2tlbix0LmtleUlkLG4pfXJldHVybiBlLmFjY2Vzc190b2tlbn1hc3luYyBnZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KGUscixuLG8saSxzKXtjb25zdCBhPXRoaXMuYWRkVGVsZW1ldHJ5RnJvbU5hdGl2ZVJlc3BvbnNlKGUucHJvcGVydGllcy5NQVRTKSxjPXRoaXMuZ2VuZXJhdGVTY29wZXMoci5zY29wZSxlLnNjb3BlKSxsPWUuYWNjb3VudC5wcm9wZXJ0aWVzfHx7fSxoPWwuVUlEfHxuLm9pZHx8bi5zdWJ8fHQuRU1QVFlfU1RSSU5HLGQ9bC5UZW5hbnRJZHx8bi50aWR8fHQuRU1QVFlfU1RSSU5HLHU9bnIoaHIuZ2V0QWNjb3VudEluZm8obyksdm9pZCAwLG4sZS5pZF90b2tlbik7dS5uYXRpdmVBY2NvdW50SWQhPT1lLmFjY291bnQuaWQmJih1Lm5hdGl2ZUFjY291bnRJZD1lLmFjY291bnQuaWQpO2NvbnN0IGc9YXdhaXQgdGhpcy5nZW5lcmF0ZVBvcEFjY2Vzc1Rva2VuKGUscikscD1yLnRva2VuVHlwZT09PVcuUE9QP1cuUE9QOlcuQkVBUkVSO3JldHVybnthdXRob3JpdHk6aSx1bmlxdWVJZDpoLHRlbmFudElkOmQsc2NvcGVzOmMuYXNBcnJheSgpLGFjY291bnQ6dSxpZFRva2VuOmUuaWRfdG9rZW4saWRUb2tlbkNsYWltczpuLGFjY2Vzc1Rva2VuOmcsZnJvbUNhY2hlOiEhYSYmdGhpcy5pc1Jlc3BvbnNlRnJvbUNhY2hlKGEpLGV4cGlyZXNPbjp4bihzK2UuZXhwaXJlc19pbiksdG9rZW5UeXBlOnAsY29ycmVsYXRpb25JZDp0aGlzLmNvcnJlbGF0aW9uSWQsc3RhdGU6ZS5zdGF0ZSxmcm9tTmF0aXZlQnJva2VyOiEwfX1hc3luYyBjYWNoZUFjY291bnQoZSx0LHIpe2F3YWl0IHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0QWNjb3VudChlLHRoaXMuY29ycmVsYXRpb25JZCxyKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnJlbW92ZUFjY291bnRDb250ZXh0KGhyLmdldEFjY291bnRJbmZvKGUpLHQpfWNhY2hlTmF0aXZlVG9rZW5zKGUscixuLG8saSxzLGEpe2NvbnN0IGM9S24obixyLmF1dGhvcml0eSxlLmlkX3Rva2VufHwiIixyLmNsaWVudElkLG8udGlkfHwiIiksbD1hKyhyLnRva2VuVHlwZT09PVcuUE9QP3QuU0hSX05PTkNFX1ZBTElESVRZOigic3RyaW5nIj09dHlwZW9mIGUuZXhwaXJlc19pbj9wYXJzZUludChlLmV4cGlyZXNfaW4sMTApOmUuZXhwaXJlc19pbil8fDApLGg9dGhpcy5nZW5lcmF0ZVNjb3BlcyhlLnNjb3BlLHIuc2NvcGUpLGQ9e2lkVG9rZW46YyxhY2Nlc3NUb2tlbjpHbihuLHIuYXV0aG9yaXR5LGksci5jbGllbnRJZCxvLnRpZHx8cyxoLnByaW50U2NvcGVzKCksbCwwLEtzLHZvaWQgMCxyLnRva2VuVHlwZSx2b2lkIDAsci5rZXlJZCl9O3JldHVybiB0aGlzLm5hdGl2ZVN0b3JhZ2VNYW5hZ2VyLnNhdmVDYWNoZVJlY29yZChkLHRoaXMuY29ycmVsYXRpb25JZCx1cihvKSxyLnN0b3JlSW5DYWNoZSl9Z2V0RXhwaXJlc0luVmFsdWUoZSxyKXtyZXR1cm4gZT09PVcuUE9QP3QuU0hSX05PTkNFX1ZBTElESVRZOigic3RyaW5nIj09dHlwZW9mIHI/cGFyc2VJbnQociwxMCk6cil8fDB9YWRkVGVsZW1ldHJ5RnJvbU5hdGl2ZVJlc3BvbnNlKGUpe2NvbnN0IHQ9dGhpcy5nZXRNQVRTRnJvbVJlc3BvbnNlKGUpO3JldHVybiB0Pyh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7ZXh0ZW5zaW9uSWQ6dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlci5nZXRFeHRlbnNpb25JZCgpLGV4dGVuc2lvblZlcnNpb246dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlci5nZXRFeHRlbnNpb25WZXJzaW9uKCksbWF0c0Jyb2tlclZlcnNpb246dC5icm9rZXJfdmVyc2lvbixtYXRzQWNjb3VudEpvaW5PblN0YXJ0OnQuYWNjb3VudF9qb2luX29uX3N0YXJ0LG1hdHNBY2NvdW50Sm9pbk9uRW5kOnQuYWNjb3VudF9qb2luX29uX2VuZCxtYXRzRGV2aWNlSm9pbjp0LmRldmljZV9qb2luLG1hdHNQcm9tcHRCZWhhdmlvcjp0LnByb21wdF9iZWhhdmlvcixtYXRzQXBpRXJyb3JDb2RlOnQuYXBpX2Vycm9yX2NvZGUsbWF0c1VpVmlzaWJsZTp0LnVpX3Zpc2libGUsbWF0c1NpbGVudENvZGU6dC5zaWxlbnRfY29kZSxtYXRzU2lsZW50QmlTdWJDb2RlOnQuc2lsZW50X2JpX3N1Yl9jb2RlLG1hdHNTaWxlbnRNZXNzYWdlOnQuc2lsZW50X21lc3NhZ2UsbWF0c1NpbGVudFN0YXR1czp0LnNpbGVudF9zdGF0dXMsbWF0c0h0dHBTdGF0dXM6dC5odHRwX3N0YXR1cyxtYXRzSHR0cEV2ZW50Q291bnQ6dC5odHRwX2V2ZW50X2NvdW50fSx0aGlzLmNvcnJlbGF0aW9uSWQpLHQpOm51bGx9Z2V0TUFUU0Zyb21SZXNwb25zZShlKXtpZihlKXRyeXtyZXR1cm4gSlNPTi5wYXJzZShlKX1jYXRjaChlKXt0aGlzLmxvZ2dlci5lcnJvcigiTmF0aXZlSW50ZXJhY3Rpb25DbGllbnQgLSBFcnJvciBwYXJzaW5nIE1BVFMgdGVsZW1ldHJ5LCByZXR1cm5pbmcgbnVsbCBpbnN0ZWFkIil9cmV0dXJuIG51bGx9aXNSZXNwb25zZUZyb21DYWNoZShlKXtyZXR1cm4gdm9pZCAwPT09ZS5pc19jYWNoZWQ/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50IC0gTUFUUyB0ZWxlbWV0cnkgZG9lcyBub3QgY29udGFpbiBmaWVsZCBpbmRpY2F0aW5nIGlmIHJlc3BvbnNlIHdhcyBzZXJ2ZWQgZnJvbSBjYWNoZS4gUmV0dXJuaW5nIGZhbHNlLiIpLCExKTohIWUuaXNfY2FjaGVkfWFzeW5jIGluaXRpYWxpemVOYXRpdmVSZXF1ZXN0KGUpe3RoaXMubG9nZ2VyLnRyYWNlKCJOYXRpdmVJbnRlcmFjdGlvbkNsaWVudCAtIGluaXRpYWxpemVOYXRpdmVSZXF1ZXN0IGNhbGxlZCIpO2NvbnN0IHQ9YXdhaXQgdGhpcy5nZXRDYW5vbmljYWxBdXRob3JpdHkoZSkse3Njb3BlczpyLC4uLm59PWUsbz1uZXcgWHQocnx8W10pO28uYXBwZW5kU2NvcGVzKGgpO2NvbnN0IGk9ey4uLm4sYWNjb3VudElkOnRoaXMuYWNjb3VudElkLGNsaWVudElkOnRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsYXV0aG9yaXR5OnQudXJsU3RyaW5nLHNjb3BlOm8ucHJpbnRTY29wZXMoKSxyZWRpcmVjdFVyaTp0aGlzLmdldFJlZGlyZWN0VXJpKGUucmVkaXJlY3RVcmkpLHByb21wdDp0aGlzLmdldFByb21wdChlLnByb21wdCksY29ycmVsYXRpb25JZDp0aGlzLmNvcnJlbGF0aW9uSWQsdG9rZW5UeXBlOmUuYXV0aGVudGljYXRpb25TY2hlbWUsd2luZG93VGl0bGVTdWJzdHJpbmc6ZG9jdW1lbnQudGl0bGUsZXh0cmFQYXJhbWV0ZXJzOnsuLi5lLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLC4uLmUudG9rZW5RdWVyeVBhcmFtZXRlcnN9LGV4dGVuZGVkRXhwaXJ5VG9rZW46ITEsa2V5SWQ6ZS5wb3BLaWR9O2lmKGkuc2lnblBvcFRva2VuJiZlLnBvcEtpZCl0aHJvdyBaaShLaSk7aWYodGhpcy5oYW5kbGVFeHRyYUJyb2tlclBhcmFtcyhpKSxpLmV4dHJhUGFyYW1ldGVycz1pLmV4dHJhUGFyYW1ldGVyc3x8e30saS5leHRyYVBhcmFtZXRlcnMudGVsZW1ldHJ5PWNzLGUuYXV0aGVudGljYXRpb25TY2hlbWU9PT1XLlBPUCl7Y29uc3QgdD17cmVzb3VyY2VSZXF1ZXN0VXJpOmUucmVzb3VyY2VSZXF1ZXN0VXJpLHJlc291cmNlUmVxdWVzdE1ldGhvZDplLnJlc291cmNlUmVxdWVzdE1ldGhvZCxzaHJDbGFpbXM6ZS5zaHJDbGFpbXMsc2hyTm9uY2U6ZS5zaHJOb25jZX0scj1uZXcgUm8odGhpcy5icm93c2VyQ3J5cHRvKTtsZXQgbjtpZihpLmtleUlkKW49dGhpcy5icm93c2VyQ3J5cHRvLmJhc2U2NFVybEVuY29kZShKU09OLnN0cmluZ2lmeSh7a2lkOmkua2V5SWR9KSksaS5zaWduUG9wVG9rZW49ITE7ZWxzZXtjb25zdCBlPWF3YWl0IFVuKHIuZ2VuZXJhdGVDbmYuYmluZChyKSxPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKSh0LHRoaXMubG9nZ2VyKTtuPWUucmVxQ25mU3RyaW5nLGkua2V5SWQ9ZS5raWQsaS5zaWduUG9wVG9rZW49ITB9aS5yZXFDbmY9bn1yZXR1cm4gdGhpcy5hZGRSZXF1ZXN0U0tVcyhpKSxpfWFzeW5jIGdldENhbm9uaWNhbEF1dGhvcml0eShlKXtjb25zdCB0PWUuYXV0aG9yaXR5fHx0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eTtlLmFjY291bnQmJmF3YWl0IHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eSh7cmVxdWVzdEF1dGhvcml0eTp0LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLGFjY291bnQ6ZS5hY2NvdW50fSk7Y29uc3Qgcj1uZXcgd3IodCk7cmV0dXJuIHIudmFsaWRhdGVBc1VyaSgpLHJ9Z2V0UHJvbXB0KGUpe3N3aXRjaCh0aGlzLmFwaUlkKXtjYXNlIE1zLnNzb1NpbGVudDpjYXNlIE1zLmFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93OnJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiaW5pdGlhbGl6ZU5hdGl2ZVJlcXVlc3Q6IHNpbGVudCByZXF1ZXN0IHNldHMgcHJvbXB0IHRvIG5vbmUiKSxiLk5PTkV9aWYoZSlzd2l0Y2goZSl7Y2FzZSBiLk5PTkU6Y2FzZSBiLkNPTlNFTlQ6Y2FzZSBiLkxPR0lOOmNhc2UgYi5TRUxFQ1RfQUNDT1VOVDpyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoImluaXRpYWxpemVOYXRpdmVSZXF1ZXN0OiBwcm9tcHQgaXMgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSBmbG93IiksZTtkZWZhdWx0OnRocm93IHRoaXMubG9nZ2VyLnRyYWNlKGBpbml0aWFsaXplTmF0aXZlUmVxdWVzdDogcHJvbXB0ID0gJHtlfSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIG5hdGl2ZSBmbG93YCksWmkoRmkpfWVsc2UgdGhpcy5sb2dnZXIudHJhY2UoImluaXRpYWxpemVOYXRpdmVSZXF1ZXN0OiBwcm9tcHQgd2FzIG5vdCBwcm92aWRlZCIpfWhhbmRsZUV4dHJhQnJva2VyUGFyYW1zKGUpe2NvbnN0IHQ9ZS5leHRyYVBhcmFtZXRlcnMmJmUuZXh0cmFQYXJhbWV0ZXJzLmhhc093blByb3BlcnR5KHJuKSYmZS5leHRyYVBhcmFtZXRlcnMuaGFzT3duUHJvcGVydHkobm4pJiZlLmV4dHJhUGFyYW1ldGVycy5oYXNPd25Qcm9wZXJ0eShKcik7aWYoIWUuZW1iZWRkZWRDbGllbnRJZCYmIXQpcmV0dXJuO2xldCByPSIiO2NvbnN0IG49ZS5yZWRpcmVjdFVyaTtlLmVtYmVkZGVkQ2xpZW50SWQ/KGUucmVkaXJlY3RVcmk9dGhpcy5jb25maWcuYXV0aC5yZWRpcmVjdFVyaSxyPWUuZW1iZWRkZWRDbGllbnRJZCk6ZS5leHRyYVBhcmFtZXRlcnMmJihlLnJlZGlyZWN0VXJpPWUuZXh0cmFQYXJhbWV0ZXJzW25uXSxyPWUuZXh0cmFQYXJhbWV0ZXJzW0pyXSksZS5leHRyYVBhcmFtZXRlcnM9e2NoaWxkX2NsaWVudF9pZDpyLGNoaWxkX3JlZGlyZWN0X3VyaTpufSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50Py5hZGRGaWVsZHMoe2VtYmVkZGVkQ2xpZW50SWQ6cixlbWJlZGRlZFJlZGlyZWN0VXJpOm59LHRoaXMuY29ycmVsYXRpb25JZCl9fWFzeW5jIGZ1bmN0aW9uIG5sKGUsdCxyLG4sbyl7Y29uc3QgaT1Ebyh7Li4uZS5hdXRoLGF1dGhvcml0eTp0fSxyLG4sbyk7aWYoeW4oaSx7c2t1OmlzLHZlcnNpb246JGEsb3M6IiIsY3B1OiIifSksZS5hdXRoLnByb3RvY29sTW9kZSE9PWxyLk9JREMmJkNuKGksZS50ZWxlbWV0cnkuYXBwbGljYXRpb24pLHIucGxhdGZvcm1Ccm9rZXImJihmdW5jdGlvbihlKXtlLnNldCgibmF0aXZlYnJva2VyIiwiMSIpfShpKSxvLmFkZEZpZWxkcyh7aXNQbGF0Zm9ybUF1dGhvcml6ZVJlcXVlc3Q6ITB9LHIuY29ycmVsYXRpb25JZCksci5hdXRoZW50aWNhdGlvblNjaGVtZT09PVcuUE9QKSl7Y29uc3QgZT1uZXcgeWMobixvKSx0PW5ldyBSbyhlKTtsZXQgcztpZihyLnBvcEtpZClzPWUuZW5jb2RlS2lkKHIucG9wS2lkKTtlbHNle3M9KGF3YWl0IFVuKHQuZ2VuZXJhdGVDbmYuYmluZCh0KSxPci5Qb3BUb2tlbkdlbmVyYXRlQ25mLG4sbyxyLmNvcnJlbGF0aW9uSWQpKHIsbikpLnJlcUNuZlN0cmluZ31fbihpLHMpfXJldHVybiBzbihpLHIuY29ycmVsYXRpb25JZCxvKSxpfWFzeW5jIGZ1bmN0aW9uIG9sKGUscixuLG8saSl7aWYoIW4uY29kZUNoYWxsZW5nZSl0aHJvdyBKdChPdCk7Y29uc3Qgcz1hd2FpdCBVbihubCxPci5HZXRTdGFuZGFyZFBhcmFtcyxvLGksbi5jb3JyZWxhdGlvbklkKShlLHIsbixvLGkpO3JldHVybiBhbihzLEUpLHZuKHMsbi5jb2RlQ2hhbGxlbmdlLHQuUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0QpLEVuKHMsbi5leHRyYVF1ZXJ5UGFyYW1ldGVyc3x8e30pLEhvKHIscyxlLmF1dGguZW5jb2RlRXh0cmFRdWVyeVBhcmFtcyxuLmV4dHJhUXVlcnlQYXJhbWV0ZXJzKX1hc3luYyBmdW5jdGlvbiBpbChlLHIsbixvLGkscyl7aWYoIW8uZWFySndrKXRocm93IFppKFhvKTtjb25zdCBhPWF3YWl0IG5sKHIsbixvLGkscyk7YW4oYSxSKSxmdW5jdGlvbihlLHQpe2Uuc2V0KCJlYXJfandrIixlbmNvZGVVUklDb21wb25lbnQodCkpLGUuc2V0KCJlYXJfandlX2NyeXB0byIsImV5SmhiR2NpT2lKa2FYSWlMQ0psYm1NaU9pSkJNalUyUjBOTkluMCIpfShhLG8uZWFySndrKSx2bihhLG8uY29kZUNoYWxsZW5nZSx0LlMyNTZfQ09ERV9DSEFMTEVOR0VfTUVUSE9EKTtjb25zdCBjPW5ldyBNYXA7RW4oYyxvLmV4dHJhUXVlcnlQYXJhbWV0ZXJzfHx7fSk7cmV0dXJuIGFsKGUsSG8obixjLHIuYXV0aC5lbmNvZGVFeHRyYVF1ZXJ5UGFyYW1zLG8uZXh0cmFRdWVyeVBhcmFtZXRlcnMpLGEpfWFzeW5jIGZ1bmN0aW9uIHNsKGUscixuLG8saSxzKXtjb25zdCBhPWF3YWl0IG5sKHIsbixvLGkscyk7YW4oYSxFKSx2bihhLG8uY29kZUNoYWxsZW5nZSxvLmNvZGVDaGFsbGVuZ2VNZXRob2R8fHQuUzI1Nl9DT0RFX0NIQUxMRU5HRV9NRVRIT0QpLGZ1bmN0aW9uKGUsdCl7T2JqZWN0LmVudHJpZXModCkuZm9yRWFjaCgoKFt0LHJdKT0+e3ImJmUuc2V0KHQscil9KSl9KGEsby5hdXRob3JpemVQb3N0Qm9keVBhcmFtZXRlcnN8fHt9KTtjb25zdCBjPW5ldyBNYXA7RW4oYyxvLmV4dHJhUXVlcnlQYXJhbWV0ZXJzfHx7fSk7cmV0dXJuIGFsKGUsSG8obixjLHIuYXV0aC5lbmNvZGVFeHRyYVF1ZXJ5UGFyYW1zLG8uZXh0cmFRdWVyeVBhcmFtZXRlcnMpLGEpfWZ1bmN0aW9uIGFsKGUsdCxyKXtjb25zdCBuPWUuY3JlYXRlRWxlbWVudCgiZm9ybSIpO3JldHVybiBuLm1ldGhvZD0icG9zdCIsbi5hY3Rpb249dCxyLmZvckVhY2goKCh0LHIpPT57Y29uc3Qgbz1lLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7by5oaWRkZW49ITAsby5uYW1lPXIsby52YWx1ZT10LG4uYXBwZW5kQ2hpbGQobyl9KSksZS5ib2R5LmFwcGVuZENoaWxkKG4pLG59YXN5bmMgZnVuY3Rpb24gY2woZSx0LHIsbixvLGkscyxhLGMsbCl7aWYoYS52ZXJib3NlKCJBY2NvdW50IGlkIGZvdW5kLCBjYWxsaW5nIFdBTSBmb3IgdG9rZW4iKSwhbCl0aHJvdyBaaSh4aSk7Y29uc3QgaD1uZXcgeWMoYSxjKSxkPW5ldyBybChuLG8saCxhLHMsbi5zeXN0ZW0ubmF2aWdhdGlvbkNsaWVudCxyLGMsbCx0LGksZS5jb3JyZWxhdGlvbklkKSx7dXNlclJlcXVlc3RTdGF0ZTp1fT1iby5wYXJzZVJlcXVlc3RTdGF0ZShoLGUuc3RhdGUpO3JldHVybiBVbihkLmFjcXVpcmVUb2tlbi5iaW5kKGQpLE9yLk5hdGl2ZUludGVyYWN0aW9uQ2xpZW50QWNxdWlyZVRva2VuLGEsYyxlLmNvcnJlbGF0aW9uSWQpKHsuLi5lLHN0YXRlOnUscHJvbXB0OnZvaWQgMH0pfWFzeW5jIGZ1bmN0aW9uIGxsKGUsdCxyLG4sbyxpLHMsYSxjLGwsaCxkKXtpZihpby5yZW1vdmVUaHJvdHRsZShzLG8uYXV0aC5jbGllbnRJZCxlKSx0LmFjY291bnRJZClyZXR1cm4gVW4oY2wsT3IuSGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlcixsLGgsZS5jb3JyZWxhdGlvbklkKShlLHQuYWNjb3VudElkLG4sbyxzLGEsYyxsLGgsZCk7Y29uc3QgdT17Li4uZSxjb2RlOnQuY29kZXx8IiIsY29kZVZlcmlmaWVyOnJ9LGc9bmV3IFZjKGkscyx1LGwsaCk7cmV0dXJuIGF3YWl0IFVuKGcuaGFuZGxlQ29kZVJlc3BvbnNlLmJpbmQoZyksT3IuSGFuZGxlQ29kZVJlc3BvbnNlLGwsaCxlLmNvcnJlbGF0aW9uSWQpKHQsZSl9YXN5bmMgZnVuY3Rpb24gaGwoZSx0LHIsbixvLGkscyxhLGMsbCxoKXtpZihpby5yZW1vdmVUaHJvdHRsZShpLG4uYXV0aC5jbGllbnRJZCxlKSx4byh0LGUuc3RhdGUpLCF0LmVhcl9qd2UpdGhyb3cgWmkoWm8pO2lmKCFlLmVhckp3ayl0aHJvdyBaaShYbyk7Y29uc3QgZD1KU09OLnBhcnNlKGF3YWl0IFVuKGFhLE9yLkRlY3J5cHRFYXJSZXNwb25zZSxjLGwsZS5jb3JyZWxhdGlvbklkKShlLmVhckp3ayx0LmVhcl9qd2UpKTtpZihkLmFjY291bnRJZClyZXR1cm4gVW4oY2wsT3IuSGFuZGxlUmVzcG9uc2VQbGF0Zm9ybUJyb2tlcixjLGwsZS5jb3JyZWxhdGlvbklkKShlLGQuYWNjb3VudElkLHIsbixpLHMsYSxjLGwsaCk7Y29uc3QgdT1uZXcgUG8obi5hdXRoLmNsaWVudElkLGksbmV3IHljKGMsbCksYyxudWxsLG51bGwsbCk7dS52YWxpZGF0ZVRva2VuUmVzcG9uc2UoZCk7Y29uc3QgZz17Y29kZToiIixzdGF0ZTplLnN0YXRlLG5vbmNlOmUubm9uY2UsY2xpZW50X2luZm86ZC5jbGllbnRfaW5mbyxjbG91ZF9ncmFwaF9ob3N0X25hbWU6ZC5jbG91ZF9ncmFwaF9ob3N0X25hbWUsY2xvdWRfaW5zdGFuY2VfaG9zdF9uYW1lOmQuY2xvdWRfaW5zdGFuY2VfaG9zdF9uYW1lLGNsb3VkX2luc3RhbmNlX25hbWU6ZC5jbG91ZF9pbnN0YW5jZV9uYW1lLG1zZ3JhcGhfaG9zdDpkLm1zZ3JhcGhfaG9zdH07cmV0dXJuIGF3YWl0IFVuKHUuaGFuZGxlU2VydmVyVG9rZW5SZXNwb25zZS5iaW5kKHUpLE9yLkhhbmRsZVNlcnZlclRva2VuUmVzcG9uc2UsYyxsLGUuY29ycmVsYXRpb25JZCkoZCxvLERuKCksZSxnLHZvaWQgMCx2b2lkIDAsdm9pZCAwLHZvaWQgMCl9YXN5bmMgZnVuY3Rpb24gZGwoZSx0LHIpe2UuYWRkUXVldWVNZWFzdXJlbWVudChPci5HZW5lcmF0ZVBrY2VDb2RlcyxyKTtjb25zdCBuPU5uKHVsLE9yLkdlbmVyYXRlQ29kZVZlcmlmaWVyLHQsZSxyKShlLHQscik7cmV0dXJue3ZlcmlmaWVyOm4sY2hhbGxlbmdlOmF3YWl0IFVuKGdsLE9yLkdlbmVyYXRlQ29kZUNoYWxsZW5nZUZyb21WZXJpZmllcix0LGUscikobixlLHQscil9fWZ1bmN0aW9uIHVsKGUsdCxyKXt0cnl7Y29uc3Qgbj1uZXcgVWludDhBcnJheSgzMik7Tm4ocmEsT3IuR2V0UmFuZG9tVmFsdWVzLHQsZSxyKShuKTtyZXR1cm4gQnMobil9Y2F0Y2goZSl7dGhyb3cgWmkoWW8pfX1hc3luYyBmdW5jdGlvbiBnbChlLHQscixuKXt0LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuR2VuZXJhdGVDb2RlQ2hhbGxlbmdlRnJvbVZlcmlmaWVyLG4pO3RyeXtjb25zdCBvPWF3YWl0IFVuKHRhLE9yLlNoYTI1NkRpZ2VzdCxyLHQsbikoZSx0LG4pO3JldHVybiBCcyhuZXcgVWludDhBcnJheShvKSl9Y2F0Y2goZSl7dGhyb3cgWmkoWW8pfX1jbGFzcyBwbHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmxvZ2dlcj1lLHRoaXMuaGFuZHNoYWtlVGltZW91dE1zPXQsdGhpcy5leHRlbnNpb25JZD1uLHRoaXMucmVzb2x2ZXJzPW5ldyBNYXAsdGhpcy5oYW5kc2hha2VSZXNvbHZlcnM9bmV3IE1hcCx0aGlzLm1lc3NhZ2VDaGFubmVsPW5ldyBNZXNzYWdlQ2hhbm5lbCx0aGlzLndpbmRvd0xpc3RlbmVyPXRoaXMub25XaW5kb3dNZXNzYWdlLmJpbmQodGhpcyksdGhpcy5wZXJmb3JtYW5jZUNsaWVudD1yLHRoaXMuaGFuZHNoYWtlRXZlbnQ9ci5zdGFydE1lYXN1cmVtZW50KE9yLk5hdGl2ZU1lc3NhZ2VIYW5kbGVySGFuZHNoYWtlKSx0aGlzLnBsYXRmb3JtQXV0aFR5cGU9Z3N9YXN5bmMgc2VuZE1lc3NhZ2UoZSl7dGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBzZW5kTWVzc2FnZSBjYWxsZWQuIik7Y29uc3QgdD17bWV0aG9kOmZzLHJlcXVlc3Q6ZX0scj17Y2hhbm5lbDpzcyxleHRlbnNpb25JZDp0aGlzLmV4dGVuc2lvbklkLHJlc3BvbnNlSWQ6b2EoKSxib2R5OnR9O3RoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gU2VuZGluZyByZXF1ZXN0IHRvIGJyb3dzZXIgZXh0ZW5zaW9uIiksdGhpcy5sb2dnZXIudHJhY2VQaWkodGhpcy5wbGF0Zm9ybUF1dGhUeXBlK2AgLSBTZW5kaW5nIHJlcXVlc3QgdG8gYnJvd3NlciBleHRlbnNpb246ICR7SlNPTi5zdHJpbmdpZnkocil9YCksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5wb3N0TWVzc2FnZShyKTtjb25zdCBuPWF3YWl0IG5ldyBQcm9taXNlKCgoZSx0KT0+e3RoaXMucmVzb2x2ZXJzLnNldChyLnJlc3BvbnNlSWQse3Jlc29sdmU6ZSxyZWplY3Q6dH0pfSkpO3JldHVybiB0aGlzLnZhbGlkYXRlUGxhdGZvcm1Ccm9rZXJSZXNwb25zZShuKX1zdGF0aWMgYXN5bmMgY3JlYXRlUHJvdmlkZXIoZSx0LHIpe2UudHJhY2UoIlBsYXRmb3JtQXV0aEV4dGVuc2lvbkhhbmRsZXIgLSBjcmVhdGVQcm92aWRlciBjYWxsZWQuIik7dHJ5e2NvbnN0IG49bmV3IHBsKGUsdCxyLGFzKTtyZXR1cm4gYXdhaXQgbi5zZW5kSGFuZHNoYWtlUmVxdWVzdCgpLG59Y2F0Y2gobil7Y29uc3Qgbz1uZXcgcGwoZSx0LHIpO3JldHVybiBhd2FpdCBvLnNlbmRIYW5kc2hha2VSZXF1ZXN0KCksb319YXN5bmMgc2VuZEhhbmRzaGFrZVJlcXVlc3QoKXt0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrIiAtIHNlbmRIYW5kc2hha2VSZXF1ZXN0IGNhbGxlZC4iKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsdGhpcy53aW5kb3dMaXN0ZW5lciwhMSk7Y29uc3QgZT17Y2hhbm5lbDpzcyxleHRlbnNpb25JZDp0aGlzLmV4dGVuc2lvbklkLHJlc3BvbnNlSWQ6b2EoKSxib2R5OnttZXRob2Q6cHN9fTtyZXR1cm4gdGhpcy5oYW5kc2hha2VFdmVudC5hZGQoe2V4dGVuc2lvbklkOnRoaXMuZXh0ZW5zaW9uSWQsZXh0ZW5zaW9uSGFuZHNoYWtlVGltZW91dE1zOnRoaXMuaGFuZHNoYWtlVGltZW91dE1zfSksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2U9ZT0+e3RoaXMub25DaGFubmVsTWVzc2FnZShlKX0sd2luZG93LnBvc3RNZXNzYWdlKGUsd2luZG93Lm9yaWdpbixbdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Ml0pLG5ldyBQcm9taXNlKCgodCxyKT0+e3RoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLnNldChlLnJlc3BvbnNlSWQse3Jlc29sdmU6dCxyZWplY3Q6cn0pLHRoaXMudGltZW91dElkPXdpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLndpbmRvd0xpc3RlbmVyLCExKSx0aGlzLm1lc3NhZ2VDaGFubmVsLnBvcnQxLmNsb3NlKCksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Mi5jbG9zZSgpLHRoaXMuaGFuZHNoYWtlRXZlbnQuZW5kKHtleHRlbnNpb25IYW5kc2hha2VUaW1lZE91dDohMCxzdWNjZXNzOiExfSkscihaaShEaSkpLHRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmRlbGV0ZShlLnJlc3BvbnNlSWQpfSksdGhpcy5oYW5kc2hha2VUaW1lb3V0TXMpfSkpfW9uV2luZG93TWVzc2FnZShlKXtpZih0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrIiAtIG9uV2luZG93TWVzc2FnZSBjYWxsZWQiKSxlLnNvdXJjZSE9PXdpbmRvdylyZXR1cm47Y29uc3QgdD1lLmRhdGE7aWYodC5jaGFubmVsJiZ0LmNoYW5uZWw9PT1zcyYmKCF0LmV4dGVuc2lvbklkfHx0LmV4dGVuc2lvbklkPT09dGhpcy5leHRlbnNpb25JZCkmJnQuYm9keS5tZXRob2Q9PT1wcyl7Y29uc3QgZT10aGlzLmhhbmRzaGFrZVJlc29sdmVycy5nZXQodC5yZXNwb25zZUlkKTtpZighZSlyZXR1cm4gdm9pZCB0aGlzLmxvZ2dlci50cmFjZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrYC5vbldpbmRvd01lc3NhZ2UgLSByZXNvbHZlciBjYW4ndCBiZSBmb3VuZCBmb3IgcmVxdWVzdCAke3QucmVzcG9uc2VJZH1gKTt0aGlzLmxvZ2dlci52ZXJib3NlKHQuZXh0ZW5zaW9uSWQ/YEV4dGVuc2lvbiB3aXRoIGlkOiAke3QuZXh0ZW5zaW9uSWR9IG5vdCBpbnN0YWxsZWRgOiJObyBleHRlbnNpb24gaW5zdGFsbGVkIiksY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dElkKSx0aGlzLm1lc3NhZ2VDaGFubmVsLnBvcnQxLmNsb3NlKCksdGhpcy5tZXNzYWdlQ2hhbm5lbC5wb3J0Mi5jbG9zZSgpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0aGlzLndpbmRvd0xpc3RlbmVyLCExKSx0aGlzLmhhbmRzaGFrZUV2ZW50LmVuZCh7c3VjY2VzczohMSxleHRlbnNpb25JbnN0YWxsZWQ6ITF9KSxlLnJlamVjdChaaShIaSkpfX1vbkNoYW5uZWxNZXNzYWdlKGUpe3RoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gb25DaGFubmVsTWVzc2FnZSBjYWxsZWQuIik7Y29uc3QgdD1lLmRhdGEscj10aGlzLnJlc29sdmVycy5nZXQodC5yZXNwb25zZUlkKSxuPXRoaXMuaGFuZHNoYWtlUmVzb2x2ZXJzLmdldCh0LnJlc3BvbnNlSWQpO3RyeXtjb25zdCBlPXQuYm9keS5tZXRob2Q7aWYoZT09PXlzKXtpZighcilyZXR1cm47Y29uc3QgZT10LmJvZHkucmVzcG9uc2U7aWYodGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBSZWNlaXZlZCByZXNwb25zZSBmcm9tIGJyb3dzZXIgZXh0ZW5zaW9uIiksdGhpcy5sb2dnZXIudHJhY2VQaWkodGhpcy5wbGF0Zm9ybUF1dGhUeXBlK2AgLSBSZWNlaXZlZCByZXNwb25zZSBmcm9tIGJyb3dzZXIgZXh0ZW5zaW9uOiAke0pTT04uc3RyaW5naWZ5KGUpfWApLCJTdWNjZXNzIiE9PWUuc3RhdHVzKXIucmVqZWN0KGVsKGUuY29kZSxlLmRlc2NyaXB0aW9uLGUuZXh0KSk7ZWxzZXtpZighZS5yZXN1bHQpdGhyb3cgd2UoZ2UsIkV2ZW50IGRvZXMgbm90IGNvbnRhaW4gcmVzdWx0LiIpO2UucmVzdWx0LmNvZGUmJmUucmVzdWx0LmRlc2NyaXB0aW9uP3IucmVqZWN0KGVsKGUucmVzdWx0LmNvZGUsZS5yZXN1bHQuZGVzY3JpcHRpb24sZS5yZXN1bHQuZXh0KSk6ci5yZXNvbHZlKGUucmVzdWx0KX10aGlzLnJlc29sdmVycy5kZWxldGUodC5yZXNwb25zZUlkKX1lbHNlIGlmKGU9PT1tcyl7aWYoIW4pcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlK2Aub25DaGFubmVsTWVzc2FnZSAtIHJlc29sdmVyIGNhbid0IGJlIGZvdW5kIGZvciByZXF1ZXN0ICR7dC5yZXNwb25zZUlkfWApO2NsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLHRoaXMud2luZG93TGlzdGVuZXIsITEpLHRoaXMuZXh0ZW5zaW9uSWQ9dC5leHRlbnNpb25JZCx0aGlzLmV4dGVuc2lvblZlcnNpb249dC5ib2R5LnZlcnNpb24sdGhpcy5sb2dnZXIudmVyYm9zZSh0aGlzLnBsYXRmb3JtQXV0aFR5cGUrYCAtIFJlY2VpdmVkIEhhbmRzaGFrZVJlc3BvbnNlIGZyb20gZXh0ZW5zaW9uOiAke3RoaXMuZXh0ZW5zaW9uSWR9YCksdGhpcy5oYW5kc2hha2VFdmVudC5lbmQoe2V4dGVuc2lvbkluc3RhbGxlZDohMCxzdWNjZXNzOiEwfSksbi5yZXNvbHZlKCksdGhpcy5oYW5kc2hha2VSZXNvbHZlcnMuZGVsZXRlKHQucmVzcG9uc2VJZCl9fWNhdGNoKHQpe3RoaXMubG9nZ2VyLmVycm9yKCJFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGZyb20gV0FNIEV4dGVuc2lvbiIpLHRoaXMubG9nZ2VyLmVycm9yUGlpKGBFcnJvciBwYXJzaW5nIHJlc3BvbnNlIGZyb20gV0FNIEV4dGVuc2lvbjogJHt0fWApLHRoaXMubG9nZ2VyLmVycm9yUGlpKGBVbmFibGUgdG8gcGFyc2UgJHtlfWApLHI/ci5yZWplY3QodCk6biYmbi5yZWplY3QodCl9fXZhbGlkYXRlUGxhdGZvcm1Ccm9rZXJSZXNwb25zZShlKXtpZihlLmhhc093blByb3BlcnR5KCJhY2Nlc3NfdG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiaWRfdG9rZW4iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiY2xpZW50X2luZm8iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWNjb3VudCIpJiZlLmhhc093blByb3BlcnR5KCJzY29wZSIpJiZlLmhhc093blByb3BlcnR5KCJleHBpcmVzX2luIikpcmV0dXJuIGU7dGhyb3cgd2UoZ2UsIlJlc3BvbnNlIG1pc3NpbmcgZXhwZWN0ZWQgcHJvcGVydGllcy4iKX1nZXRFeHRlbnNpb25JZCgpe3JldHVybiB0aGlzLmV4dGVuc2lvbklkfWdldEV4dGVuc2lvblZlcnNpb24oKXtyZXR1cm4gdGhpcy5leHRlbnNpb25WZXJzaW9ufWdldEV4dGVuc2lvbk5hbWUoKXtyZXR1cm4gdGhpcy5nZXRFeHRlbnNpb25JZCgpPT09YXM/ImNocm9tZSI6dGhpcy5nZXRFeHRlbnNpb25JZCgpPy5sZW5ndGg/InVua25vd24iOnZvaWQgMH19Y2xhc3MgbWx7Y29uc3RydWN0b3IoZSx0LHIpe3RoaXMubG9nZ2VyPWUsdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10LHRoaXMuY29ycmVsYXRpb25JZD1yLHRoaXMucGxhdGZvcm1BdXRoVHlwZT11c31zdGF0aWMgYXN5bmMgY3JlYXRlUHJvdmlkZXIoZSx0LHIpe2lmKGUudHJhY2UoIlBsYXRmb3JtQXV0aERPTUhhbmRsZXI6IGNyZWF0ZVByb3ZpZGVyIGNhbGxlZCIpLHdpbmRvdy5uYXZpZ2F0b3I/LnBsYXRmb3JtQXV0aGVudGljYXRpb24pe2NvbnN0IG49YXdhaXQgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybUF1dGhlbnRpY2F0aW9uLmdldFN1cHBvcnRlZENvbnRyYWN0cyhscyk7aWYobj8uaW5jbHVkZXMoZHMpKXJldHVybiBlLnRyYWNlKCJQbGF0Zm9ybSBhdXRoIGFwaSBhdmFpbGFibGUgaW4gRE9NIiksbmV3IG1sKGUsdCxyKX19Z2V0RXh0ZW5zaW9uSWQoKXtyZXR1cm4gbHN9Z2V0RXh0ZW5zaW9uVmVyc2lvbigpe3JldHVybiIifWdldEV4dGVuc2lvbk5hbWUoKXtyZXR1cm4gaHN9YXN5bmMgc2VuZE1lc3NhZ2UoZSl7dGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBTZW5kaW5nIHJlcXVlc3QgdG8gYnJvd3NlciBET00gQVBJIik7dHJ5e2NvbnN0IHQ9dGhpcy5pbml0aWFsaXplUGxhdGZvcm1ET01SZXF1ZXN0KGUpLHI9YXdhaXQgd2luZG93Lm5hdmlnYXRvci5wbGF0Zm9ybUF1dGhlbnRpY2F0aW9uLmV4ZWN1dGVHZXRUb2tlbih0KTtyZXR1cm4gdGhpcy52YWxpZGF0ZVBsYXRmb3JtQnJva2VyUmVzcG9uc2Uocil9Y2F0Y2goZSl7dGhyb3cgdGhpcy5sb2dnZXIuZXJyb3IodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBleGVjdXRlR2V0VG9rZW4gRE9NIEFQSSBlcnJvciIpLGV9fWluaXRpYWxpemVQbGF0Zm9ybURPTVJlcXVlc3QoZSl7dGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBpbml0aWFsaXplTmF0aXZlRE9NUmVxdWVzdCBjYWxsZWQiKTtjb25zdHthY2NvdW50SWQ6dCxjbGllbnRJZDpyLGF1dGhvcml0eTpuLHNjb3BlOm8scmVkaXJlY3RVcmk6aSxjb3JyZWxhdGlvbklkOnMsc3RhdGU6YSxzdG9yZUluQ2FjaGU6YyxlbWJlZGRlZENsaWVudElkOmwsZXh0cmFQYXJhbWV0ZXJzOmgsLi4uZH09ZSx1PXRoaXMuZ2V0RE9NRXh0cmFQYXJhbXMoZCk7cmV0dXJue2FjY291bnRJZDp0LGJyb2tlcklkOnRoaXMuZ2V0RXh0ZW5zaW9uSWQoKSxhdXRob3JpdHk6bixjbGllbnRJZDpyLGNvcnJlbGF0aW9uSWQ6c3x8dGhpcy5jb3JyZWxhdGlvbklkLGV4dHJhUGFyYW1ldGVyczp7Li4uaCwuLi51fSxpc1NlY3VyaXR5VG9rZW5TZXJ2aWNlOiExLHJlZGlyZWN0VXJpOmksc2NvcGU6byxzdGF0ZTphLHN0b3JlSW5DYWNoZTpjLGVtYmVkZGVkQ2xpZW50SWQ6bH19dmFsaWRhdGVQbGF0Zm9ybUJyb2tlclJlc3BvbnNlKGUpe2lmKGUuaGFzT3duUHJvcGVydHkoImlzU3VjY2VzcyIpKXtpZihlLmhhc093blByb3BlcnR5KCJhY2Nlc3NUb2tlbiIpJiZlLmhhc093blByb3BlcnR5KCJpZFRva2VuIikmJmUuaGFzT3duUHJvcGVydHkoImNsaWVudEluZm8iKSYmZS5oYXNPd25Qcm9wZXJ0eSgiYWNjb3VudCIpJiZlLmhhc093blByb3BlcnR5KCJzY29wZXMiKSYmZS5oYXNPd25Qcm9wZXJ0eSgiZXhwaXJlc0luIikpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gcGxhdGZvcm0gYnJva2VyIHJldHVybmVkIHN1Y2Nlc3NmdWwgYW5kIHZhbGlkIHJlc3BvbnNlIiksdGhpcy5jb252ZXJ0VG9QbGF0Zm9ybUJyb2tlclJlc3BvbnNlKGUpO2lmKGUuaGFzT3duUHJvcGVydHkoImVycm9yIikpe2NvbnN0IHQ9ZTtpZighMT09PXQuaXNTdWNjZXNzJiZ0LmVycm9yJiZ0LmVycm9yLmNvZGUpdGhyb3cgdGhpcy5sb2dnZXIudHJhY2UodGhpcy5wbGF0Zm9ybUF1dGhUeXBlKyIgLSBwbGF0Zm9ybSBicm9rZXIgcmV0dXJuZWQgZXJyb3IgcmVzcG9uc2UiKSxlbCh0LmVycm9yLmNvZGUsdC5lcnJvci5kZXNjcmlwdGlvbix7ZXJyb3I6cGFyc2VJbnQodC5lcnJvci5lcnJvckNvZGUpLHByb3RvY29sX2Vycm9yOnQuZXJyb3IucHJvdG9jb2xFcnJvcixzdGF0dXM6dC5lcnJvci5zdGF0dXMscHJvcGVydGllczp0LmVycm9yLnByb3BlcnRpZXN9KX19dGhyb3cgd2UoZ2UsIlJlc3BvbnNlIG1pc3NpbmcgZXhwZWN0ZWQgcHJvcGVydGllcy4iKX1jb252ZXJ0VG9QbGF0Zm9ybUJyb2tlclJlc3BvbnNlKGUpe3RoaXMubG9nZ2VyLnRyYWNlKHRoaXMucGxhdGZvcm1BdXRoVHlwZSsiIC0gY29udmVydFRvTmF0aXZlUmVzcG9uc2UgY2FsbGVkIik7cmV0dXJue2FjY2Vzc190b2tlbjplLmFjY2Vzc1Rva2VuLGlkX3Rva2VuOmUuaWRUb2tlbixjbGllbnRfaW5mbzplLmNsaWVudEluZm8sYWNjb3VudDplLmFjY291bnQsZXhwaXJlc19pbjplLmV4cGlyZXNJbixzY29wZTplLnNjb3BlcyxzdGF0ZTplLnN0YXRlfHwiIixwcm9wZXJ0aWVzOmUucHJvcGVydGllc3x8e30sZXh0ZW5kZWRMaWZldGltZVRva2VuOmUuZXh0ZW5kZWRMaWZldGltZVRva2VuPz8hMSxzaHI6ZS5wcm9vZk9mUG9zc2Vzc2lvblBheWxvYWR9fWdldERPTUV4dHJhUGFyYW1zKGUpe3JldHVybnsuLi5PYmplY3QuZW50cmllcyhlKS5yZWR1Y2UoKChlLFt0LHJdKT0+KGVbdF09U3RyaW5nKHIpLGUpKSx7fSl9fX1hc3luYyBmdW5jdGlvbiBmbChlLHQscixuLG8pe2xldCBpO2UudHJhY2UoImdldFBsYXRmb3JtQXV0aFByb3ZpZGVyIGNhbGxlZCIsciksZS50cmFjZSgiSGFzIGNsaWVudCBhbGxvd2VkIHBsYXRmb3JtIGF1dGggdmlhIERPTSBBUEk6ICIrbyk7dHJ5e28mJihpPWF3YWl0IG1sLmNyZWF0ZVByb3ZpZGVyKGUsdCxyKSksaXx8KGUudHJhY2UoIlBsYXRmb3JtIGF1dGggdmlhIERPTSBBUEkgbm90IGF2YWlsYWJsZSwgY2hlY2tpbmcgZm9yIGV4dGVuc2lvbiIpLGk9YXdhaXQgcGwuY3JlYXRlUHJvdmlkZXIoZSxufHwyZTMsdCkpfWNhdGNoKHQpe2UudHJhY2UoIlBsYXRmb3JtIGF1dGggbm90IGF2YWlsYWJsZSIsdCl9cmV0dXJuIGl9ZnVuY3Rpb24geWwoZSx0LHIsbil7aWYodC50cmFjZSgiaXNQbGF0Zm9ybUF1dGhBbGxvd2VkIGNhbGxlZCIpLCFlLnN5c3RlbS5hbGxvd1BsYXRmb3JtQnJva2VyJiZlLnN5c3RlbS5hbGxvd1BsYXRmb3JtQnJva2VyV2l0aERPTSl0aHJvdyBKdCgkdCk7aWYoIWUuc3lzdGVtLmFsbG93UGxhdGZvcm1Ccm9rZXIpcmV0dXJuIHQudHJhY2UoImlzUGxhdGZvcm1BdXRoQWxsb3dlZDogYWxsb3dQbGF0Zm9ybUJyb2tlciBpcyBub3QgZW5hYmxlZCwgcmV0dXJuaW5nIGZhbHNlIiksITE7aWYoIXIpcmV0dXJuIHQudHJhY2UoImlzUGxhdGZvcm1BdXRoQWxsb3dlZDogUGxhdGZvcm0gYXV0aCBwcm92aWRlciBpcyBub3QgaW5pdGlhbGl6ZWQsIHJldHVybmluZyBmYWxzZSIpLCExO2lmKG4pc3dpdGNoKG4pe2Nhc2UgVy5CRUFSRVI6Y2FzZSBXLlBPUDpyZXR1cm4gdC50cmFjZSgiaXNQbGF0Zm9ybUF1dGhBbGxvd2VkOiBhdXRoZW50aWNhdGlvblNjaGVtZSBpcyBzdXBwb3J0ZWQsIHJldHVybmluZyB0cnVlIiksITA7ZGVmYXVsdDpyZXR1cm4gdC50cmFjZSgiaXNQbGF0Zm9ybUF1dGhBbGxvd2VkOiBhdXRoZW50aWNhdGlvblNjaGVtZSBpcyBub3Qgc3VwcG9ydGVkLCByZXR1cm5pbmcgZmFsc2UiKSwhMX1yZXR1cm4hMH1jbGFzcyBDbCBleHRlbmRzIFFje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSxjLGwpe3N1cGVyKGUsdCxyLG4sbyxpLHMsYyxsKSx0aGlzLnVubG9hZFdpbmRvdz10aGlzLnVubG9hZFdpbmRvdy5iaW5kKHRoaXMpLHRoaXMubmF0aXZlU3RvcmFnZT1hLHRoaXMuZXZlbnRIYW5kbGVyPW99YWNxdWlyZVRva2VuKGUsdCl7bGV0IHI7dHJ5e2lmKHI9e3BvcHVwTmFtZTp0aGlzLmdlbmVyYXRlUG9wdXBOYW1lKGUuc2NvcGVzfHxoLGUuYXV0aG9yaXR5fHx0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eSkscG9wdXBXaW5kb3dBdHRyaWJ1dGVzOmUucG9wdXBXaW5kb3dBdHRyaWJ1dGVzfHx7fSxwb3B1cFdpbmRvd1BhcmVudDplLnBvcHVwV2luZG93UGFyZW50Pz93aW5kb3d9LHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtpc0FzeW5jUG9wdXA6dGhpcy5jb25maWcuc3lzdGVtLmFzeW5jUG9wdXBzfSx0aGlzLmNvcnJlbGF0aW9uSWQpLHRoaXMuY29uZmlnLnN5c3RlbS5hc3luY1BvcHVwcylyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiYXN5bmNQb3B1cHMgc2V0IHRvIHRydWUsIGFjcXVpcmluZyB0b2tlbiIpLHRoaXMuYWNxdWlyZVRva2VuUG9wdXBBc3luYyhlLHIsdCk7e2NvbnN0IG49ey4uLmUsaHR0cE1ldGhvZDokYyhlLHRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlKX07cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImFzeW5jUG9wdXAgc2V0IHRvIGZhbHNlLCBvcGVuaW5nIHBvcHVwIGJlZm9yZSBhY3F1aXJpbmcgdG9rZW4iKSxyLnBvcHVwPXRoaXMub3BlblNpemVkUG9wdXAoImFib3V0OmJsYW5rIixyKSx0aGlzLmFjcXVpcmVUb2tlblBvcHVwQXN5bmMobixyLHQpfX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fWxvZ291dChlKXt0cnl7dGhpcy5sb2dnZXIudmVyYm9zZSgibG9nb3V0UG9wdXAgY2FsbGVkIik7Y29uc3QgdD10aGlzLmluaXRpYWxpemVMb2dvdXRSZXF1ZXN0KGUpLHI9e3BvcHVwTmFtZTp0aGlzLmdlbmVyYXRlTG9nb3V0UG9wdXBOYW1lKHQpLHBvcHVwV2luZG93QXR0cmlidXRlczplPy5wb3B1cFdpbmRvd0F0dHJpYnV0ZXN8fHt9LHBvcHVwV2luZG93UGFyZW50OmU/LnBvcHVwV2luZG93UGFyZW50Pz93aW5kb3d9LG49ZSYmZS5hdXRob3JpdHksbz1lJiZlLm1haW5XaW5kb3dSZWRpcmVjdFVyaTtyZXR1cm4gdGhpcy5jb25maWcuc3lzdGVtLmFzeW5jUG9wdXBzPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJhc3luY1BvcHVwcyBzZXQgdG8gdHJ1ZSIpLHRoaXMubG9nb3V0UG9wdXBBc3luYyh0LHIsbixvKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoImFzeW5jUG9wdXAgc2V0IHRvIGZhbHNlLCBvcGVuaW5nIHBvcHVwIiksci5wb3B1cD10aGlzLm9wZW5TaXplZFBvcHVwKCJhYm91dDpibGFuayIsciksdGhpcy5sb2dvdXRQb3B1cEFzeW5jKHQscixuLG8pKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fWFzeW5jIGFjcXVpcmVUb2tlblBvcHVwQXN5bmModCxyLG4pe3RoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblBvcHVwQXN5bmMgY2FsbGVkIik7Y29uc3Qgbz1hd2FpdCBVbih0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXApO3IucG9wdXAmJlVhKG8uYXV0aG9yaXR5KTtjb25zdCBpPXlsKHRoaXMuY29uZmlnLHRoaXMubG9nZ2VyLHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsdC5hdXRoZW50aWNhdGlvblNjaGVtZSk7cmV0dXJuIG8ucGxhdGZvcm1Ccm9rZXI9aSx0aGlzLmNvbmZpZy5hdXRoLnByb3RvY29sTW9kZT09PWxyLkVBUj90aGlzLmV4ZWN1dGVFYXJGbG93KG8scixuKTp0aGlzLmV4ZWN1dGVDb2RlRmxvdyhvLHIsbil9YXN5bmMgZXhlY3V0ZUNvZGVGbG93KHQscixuKXtjb25zdCBvPXQuY29ycmVsYXRpb25JZCxpPXRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIoTXMuYWNxdWlyZVRva2VuUG9wdXApLHM9bnx8YXdhaXQgVW4oZGwsT3IuR2VuZXJhdGVQa2NlQ29kZXMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxvKSh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyLG8pLGE9ey4uLnQsY29kZUNoYWxsZW5nZTpzLmNoYWxsZW5nZX07dHJ5e2NvbnN0IG49YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LG8pKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOmkscmVxdWVzdEF1dGhvcml0eTphLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6YS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6YS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmEuYWNjb3VudH0pO2lmKGEuaHR0cE1ldGhvZD09PWwpcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUNvZGVGbG93V2l0aFBvc3QoYSxyLG4scy52ZXJpZmllcik7e2NvbnN0IGk9YXdhaXQgVW4ob2wsT3IuR2V0QXV0aENvZGVVcmwsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxvKSh0aGlzLmNvbmZpZyxuLmF1dGhvcml0eSxhLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpLGM9dGhpcy5pbml0aWF0ZUF1dGhSZXF1ZXN0KGkscik7dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLlBPUFVQX09QRU5FRCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx7cG9wdXBXaW5kb3c6Y30sbnVsbCk7Y29uc3QgbD1hd2FpdCB0aGlzLm1vbml0b3JQb3B1cEZvckhhc2goYyxyLnBvcHVwV2luZG93UGFyZW50KSxoPU5uKGpjLE9yLkRlc2VyaWFsaXplUmVzcG9uc2UsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKGwsdGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGUsdGhpcy5sb2dnZXIpO3JldHVybiBhd2FpdCBVbihsbCxPci5IYW5kbGVSZXNwb25zZUNvZGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxvKSh0LGgscy52ZXJpZmllcixNcy5hY3F1aXJlVG9rZW5Qb3B1cCx0aGlzLmNvbmZpZyxuLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9fWNhdGNoKGUpe3Rocm93IHIucG9wdXA/LmNsb3NlKCksZSBpbnN0YW5jZW9mIENlJiYoZS5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCksaS5jYWNoZUZhaWxlZFJlcXVlc3QoZSkpLGV9fWFzeW5jIGV4ZWN1dGVFYXJGbG93KGUsdCxyKXtjb25zdCBuPWUuY29ycmVsYXRpb25JZCxvPWF3YWl0IFVuKHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eS5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoe3JlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxpPWF3YWl0IFVuKHNhLE9yLkdlbmVyYXRlRWFyS2V5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoKSxzPXJ8fGF3YWl0IFVuKGRsLE9yLkdlbmVyYXRlUGtjZUNvZGVzLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikodGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixuKSxhPXsuLi5lLGVhckp3azppLGNvZGVDaGFsbGVuZ2U6cy5jaGFsbGVuZ2V9LGM9dC5wb3B1cHx8dGhpcy5vcGVuUG9wdXAoImFib3V0OmJsYW5rIix0KTsoYXdhaXQgaWwoYy5kb2N1bWVudCx0aGlzLmNvbmZpZyxvLGEsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCkpLnN1Ym1pdCgpO2NvbnN0IGw9YXdhaXQgVW4odGhpcy5tb25pdG9yUG9wdXBGb3JIYXNoLmJpbmQodGhpcyksT3IuU2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoYyx0LnBvcHVwV2luZG93UGFyZW50KSxoPU5uKGpjLE9yLkRlc2VyaWFsaXplUmVzcG9uc2UsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKGwsdGhpcy5jb25maWcuYXV0aC5PSURDT3B0aW9ucy5zZXJ2ZXJSZXNwb25zZVR5cGUsdGhpcy5sb2dnZXIpO2lmKCFoLmVhcl9qd2UmJmguY29kZSl7Y29uc3QgdD1hd2FpdCBVbih0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5hY3F1aXJlVG9rZW5Qb3B1cCkscmVxdWVzdEF1dGhvcml0eTplLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6ZS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6ZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmUuYWNjb3VudCxhdXRob3JpdHk6b30pO3JldHVybiBVbihsbCxPci5IYW5kbGVSZXNwb25zZUNvZGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxuKShhLGgscy52ZXJpZmllcixNcy5hY3F1aXJlVG9rZW5Qb3B1cCx0aGlzLmNvbmZpZyx0LHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9cmV0dXJuIFVuKGhsLE9yLkhhbmRsZVJlc3BvbnNlRWFyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbikoYSxoLE1zLmFjcXVpcmVUb2tlblBvcHVwLHRoaXMuY29uZmlnLG8sdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLm5hdGl2ZVN0b3JhZ2UsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyKX1hc3luYyBleGVjdXRlQ29kZUZsb3dXaXRoUG9zdChlLHQscixuKXtjb25zdCBvPWUuY29ycmVsYXRpb25JZCxpPWF3YWl0IFVuKHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eS5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbykoe3JlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxzPXQucG9wdXB8fHRoaXMub3BlblBvcHVwKCJhYm91dDpibGFuayIsdCk7KGF3YWl0IHNsKHMuZG9jdW1lbnQsdGhpcy5jb25maWcsaSxlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpKS5zdWJtaXQoKTtjb25zdCBhPWF3YWl0IFVuKHRoaXMubW9uaXRvclBvcHVwRm9ySGFzaC5iaW5kKHRoaXMpLE9yLlNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LG8pKHMsdC5wb3B1cFdpbmRvd1BhcmVudCksYz1ObihqYyxPci5EZXNlcmlhbGl6ZVJlc3BvbnNlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKShhLHRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlLHRoaXMubG9nZ2VyKTtyZXR1cm4gVW4obGwsT3IuSGFuZGxlUmVzcG9uc2VDb2RlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsbykoZSxjLG4sTXMuYWNxdWlyZVRva2VuUG9wdXAsdGhpcy5jb25maWcscix0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMubmF0aXZlU3RvcmFnZSx0aGlzLmV2ZW50SGFuZGxlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpfWFzeW5jIGxvZ291dFBvcHVwQXN5bmModCxyLG4sbyl7dGhpcy5sb2dnZXIudmVyYm9zZSgibG9nb3V0UG9wdXBBc3luYyBjYWxsZWQiKSx0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuTE9HT1VUX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLHQpO2NvbnN0IGk9dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5sb2dvdXRQb3B1cCk7dHJ5e2F3YWl0IHRoaXMuY2xlYXJDYWNoZU9uTG9nb3V0KHRoaXMuY29ycmVsYXRpb25JZCx0LmFjY291bnQpO2NvbnN0IHM9YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6aSxyZXF1ZXN0QXV0aG9yaXR5Om4sYWNjb3VudDp0LmFjY291bnR8fHZvaWQgMH0pO3RyeXtzLmF1dGhvcml0eS5lbmRTZXNzaW9uRW5kcG9pbnR9Y2F0Y2h7aWYodC5hY2NvdW50Py5ob21lQWNjb3VudElkJiZ0LnBvc3RMb2dvdXRSZWRpcmVjdFVyaSYmcy5hdXRob3JpdHkucHJvdG9jb2xNb2RlPT09bHIuT0lEQyl7aWYodGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLHQpLG8pe2NvbnN0IGU9e2FwaUlkOk1zLmxvZ291dFBvcHVwLHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSx0PXdyLmdldEFic29sdXRlVXJsKG8sYmEoKSk7YXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlSW50ZXJuYWwodCxlKX1yZXR1cm4gdm9pZCByLnBvcHVwPy5jbG9zZSgpfX1jb25zdCBhPXMuZ2V0TG9nb3V0VXJpKHQpO3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dPVVRfU1VDQ0VTUyxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx0KTtjb25zdCBjPXRoaXMub3BlblBvcHVwKGEscik7aWYodGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLlBPUFVQX09QRU5FRCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx7cG9wdXBXaW5kb3c6Y30sbnVsbCksYXdhaXQgdGhpcy5tb25pdG9yUG9wdXBGb3JIYXNoKGMsci5wb3B1cFdpbmRvd1BhcmVudCkuY2F0Y2goKCgpPT57fSkpLG8pe2NvbnN0IGU9e2FwaUlkOk1zLmxvZ291dFBvcHVwLHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSx0PXdyLmdldEFic29sdXRlVXJsKG8sYmEoKSk7dGhpcy5sb2dnZXIudmVyYm9zZSgiUmVkaXJlY3RpbmcgbWFpbiB3aW5kb3cgdG8gdXJsIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCIpLHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYFJlZGlyZWN0aW5nIG1haW4gd2luZG93IHRvOiAke3R9YCksYXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlSW50ZXJuYWwodCxlKX1lbHNlIHRoaXMubG9nZ2VyLnZlcmJvc2UoIk5vIG1haW4gd2luZG93IG5hdmlnYXRpb24gcmVxdWVzdGVkIil9Y2F0Y2godCl7dGhyb3cgci5wb3B1cD8uY2xvc2UoKSx0IGluc3RhbmNlb2YgQ2UmJih0LnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKSxpLmNhY2hlRmFpbGVkUmVxdWVzdCh0KSksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLG51bGwsdCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXApLHR9dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXApfWluaXRpYXRlQXV0aFJlcXVlc3QoZSx0KXtpZihlKXJldHVybiB0aGlzLmxvZ2dlci5pbmZvUGlpKGBOYXZpZ2F0ZSB0bzogJHtlfWApLHRoaXMub3BlblBvcHVwKGUsdCk7dGhyb3cgdGhpcy5sb2dnZXIuZXJyb3IoIk5hdmlnYXRlIHVybCBpcyBlbXB0eSIpLFppKHRpKX1tb25pdG9yUG9wdXBGb3JIYXNoKGUsdCl7cmV0dXJuIG5ldyBQcm9taXNlKCgodCxyKT0+e3RoaXMubG9nZ2VyLnZlcmJvc2UoIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gcG9sbGluZyBzdGFydGVkIik7Y29uc3Qgbj1zZXRJbnRlcnZhbCgoKCk9PntpZihlLmNsb3NlZClyZXR1cm4gdGhpcy5sb2dnZXIuZXJyb3IoIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gd2luZG93IGNsb3NlZCIpLGNsZWFySW50ZXJ2YWwobiksdm9pZCByKFppKGhpKSk7bGV0IG89IiI7dHJ5e289ZS5sb2NhdGlvbi5ocmVmfWNhdGNoKGUpe31pZighb3x8ImFib3V0OmJsYW5rIj09PW8pcmV0dXJuO2NsZWFySW50ZXJ2YWwobik7bGV0IGk9IiI7Y29uc3Qgcz10aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLnNlcnZlclJlc3BvbnNlVHlwZTtlJiYoaT1zPT09Xy5RVUVSWT9lLmxvY2F0aW9uLnNlYXJjaDplLmxvY2F0aW9uLmhhc2gpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIlBvcHVwSGFuZGxlci5tb25pdG9yUG9wdXBGb3JIYXNoIC0gcG9wdXAgd2luZG93IGlzIG9uIHNhbWUgb3JpZ2luIGFzIGNhbGxlciIpLHQoaSl9KSx0aGlzLmNvbmZpZy5zeXN0ZW0ucG9sbEludGVydmFsTWlsbGlzZWNvbmRzKX0pKS5maW5hbGx5KCgoKT0+e3RoaXMuY2xlYW5Qb3B1cChlLHQpfSkpfW9wZW5Qb3B1cChlLHQpe3RyeXtsZXQgcjtpZih0LnBvcHVwPyhyPXQucG9wdXAsdGhpcy5sb2dnZXIudmVyYm9zZVBpaShgTmF2aWdhdGluZyBwb3B1cCB3aW5kb3cgdG86ICR7ZX1gKSxyLmxvY2F0aW9uLmFzc2lnbihlKSk6dm9pZCAwPT09dC5wb3B1cCYmKHRoaXMubG9nZ2VyLnZlcmJvc2VQaWkoYE9wZW5pbmcgcG9wdXAgd2luZG93IHRvOiAke2V9YCkscj10aGlzLm9wZW5TaXplZFBvcHVwKGUsdCkpLCFyKXRocm93IFppKGxpKTtyZXR1cm4gci5mb2N1cyYmci5mb2N1cygpLHRoaXMuY3VycmVudFdpbmRvdz1yLHQucG9wdXBXaW5kb3dQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JldW5sb2FkIix0aGlzLnVubG9hZFdpbmRvdykscn1jYXRjaChlKXt0aHJvdyB0aGlzLmxvZ2dlci5lcnJvcigiZXJyb3Igb3BlbmluZyBwb3B1cCAiK2UubWVzc2FnZSksWmkoY2kpfX1vcGVuU2l6ZWRQb3B1cChlLHtwb3B1cE5hbWU6dCxwb3B1cFdpbmRvd0F0dHJpYnV0ZXM6cixwb3B1cFdpbmRvd1BhcmVudDpufSl7Y29uc3Qgbz1uLnNjcmVlbkxlZnQ/bi5zY3JlZW5MZWZ0Om4uc2NyZWVuWCxpPW4uc2NyZWVuVG9wP24uc2NyZWVuVG9wOm4uc2NyZWVuWSxzPW4uaW5uZXJXaWR0aHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRofHxkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoLGE9bi5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQ7bGV0IGM9ci5wb3B1cFNpemU/LndpZHRoLGw9ci5wb3B1cFNpemU/LmhlaWdodCxoPXIucG9wdXBQb3NpdGlvbj8udG9wLGQ9ci5wb3B1cFBvc2l0aW9uPy5sZWZ0O3JldHVybighY3x8YzwwfHxjPnMpJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiRGVmYXVsdCBwb3B1cCB3aW5kb3cgd2lkdGggdXNlZC4gV2luZG93IHdpZHRoIG5vdCBjb25maWd1cmVkIG9yIGludmFsaWQuIiksYz10cyksKCFsfHxsPDB8fGw+YSkmJih0aGlzLmxvZ2dlci52ZXJib3NlKCJEZWZhdWx0IHBvcHVwIHdpbmRvdyBoZWlnaHQgdXNlZC4gV2luZG93IGhlaWdodCBub3QgY29uZmlndXJlZCBvciBpbnZhbGlkLiIpLGw9cnMpLCghaHx8aDwwfHxoPmEpJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiRGVmYXVsdCBwb3B1cCB3aW5kb3cgdG9wIHBvc2l0aW9uIHVzZWQuIFdpbmRvdyB0b3Agbm90IGNvbmZpZ3VyZWQgb3IgaW52YWxpZC4iKSxoPU1hdGgubWF4KDAsYS8yLXJzLzIraSkpLCghZHx8ZDwwfHxkPnMpJiYodGhpcy5sb2dnZXIudmVyYm9zZSgiRGVmYXVsdCBwb3B1cCB3aW5kb3cgbGVmdCBwb3NpdGlvbiB1c2VkLiBXaW5kb3cgbGVmdCBub3QgY29uZmlndXJlZCBvciBpbnZhbGlkLiIpLGQ9TWF0aC5tYXgoMCxzLzItdHMvMitvKSksbi5vcGVuKGUsdCxgd2lkdGg9JHtjfSwgaGVpZ2h0PSR7bH0sIHRvcD0ke2h9LCBsZWZ0PSR7ZH0sIHNjcm9sbGJhcnM9eWVzYCl9dW5sb2FkV2luZG93KGUpe3RoaXMuY3VycmVudFdpbmRvdyYmdGhpcy5jdXJyZW50V2luZG93LmNsb3NlKCksZS5wcmV2ZW50RGVmYXVsdCgpfWNsZWFuUG9wdXAoZSx0KXtlLmNsb3NlKCksdC5yZW1vdmVFdmVudExpc3RlbmVyKCJiZWZvcmV1bmxvYWQiLHRoaXMudW5sb2FkV2luZG93KX1nZW5lcmF0ZVBvcHVwTmFtZShlLHQpe3JldHVybmAke25zfS4ke3RoaXMuY29uZmlnLmF1dGguY2xpZW50SWR9LiR7ZS5qb2luKCItIil9LiR7dH0uJHt0aGlzLmNvcnJlbGF0aW9uSWR9YH1nZW5lcmF0ZUxvZ291dFBvcHVwTmFtZShlKXtjb25zdCB0PWUuYWNjb3VudCYmZS5hY2NvdW50LmhvbWVBY2NvdW50SWQ7cmV0dXJuYCR7bnN9LiR7dGhpcy5jb25maWcuYXV0aC5jbGllbnRJZH0uJHt0fS4ke3RoaXMuY29ycmVsYXRpb25JZH1gfX1jbGFzcyB3bCBleHRlbmRzIFFje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSxjLGwpe3N1cGVyKGUsdCxyLG4sbyxpLHMsYyxsKSx0aGlzLm5hdGl2ZVN0b3JhZ2U9YX1hc3luYyBhY3F1aXJlVG9rZW4odCl7Y29uc3Qgcj1hd2FpdCBVbih0aGlzLmluaXRpYWxpemVBdXRob3JpemF0aW9uUmVxdWVzdC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRJbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpO3IucGxhdGZvcm1Ccm9rZXI9eWwodGhpcy5jb25maWcsdGhpcy5sb2dnZXIsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcix0LmF1dGhlbnRpY2F0aW9uU2NoZW1lKTtjb25zdCBuPXQ9Pnt0LnBlcnNpc3RlZCYmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlBhZ2Ugd2FzIHJlc3RvcmVkIGZyb20gYmFjay9mb3J3YXJkIGNhY2hlLiBDbGVhcmluZyB0ZW1wb3JhcnkgY2FjaGUuIiksdGhpcy5icm93c2VyU3RvcmFnZS5yZXNldFJlcXVlc3RDYWNoZSgpLHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5SRVNUT1JFX0ZST01fQkZDQUNIRSxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCkpfSxvPXRoaXMuZ2V0UmVkaXJlY3RTdGFydFBhZ2UodC5yZWRpcmVjdFN0YXJ0UGFnZSk7dGhpcy5sb2dnZXIudmVyYm9zZVBpaShgUmVkaXJlY3Qgc3RhcnQgcGFnZTogJHtvfWApLHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0VGVtcG9yYXJ5Q2FjaGUoQXMsbywhMCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInBhZ2VzaG93IixuKTt0cnl7dGhpcy5jb25maWcuYXV0aC5wcm90b2NvbE1vZGU9PT1sci5FQVI/YXdhaXQgdGhpcy5leGVjdXRlRWFyRmxvdyhyKTphd2FpdCB0aGlzLmV4ZWN1dGVDb2RlRmxvdyhyLHQub25SZWRpcmVjdE5hdmlnYXRlKX1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgQ2UmJmUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJwYWdlc2hvdyIsbiksZX19YXN5bmMgZXhlY3V0ZUNvZGVGbG93KGUsdCl7Y29uc3Qgcj1lLmNvcnJlbGF0aW9uSWQsbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKE1zLmFjcXVpcmVUb2tlblJlZGlyZWN0KSxvPWF3YWl0IFVuKGRsLE9yLkdlbmVyYXRlUGtjZUNvZGVzLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQscikodGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixyKSxpPXsuLi5lLGNvZGVDaGFsbGVuZ2U6by5jaGFsbGVuZ2V9O3RoaXMuYnJvd3NlclN0b3JhZ2UuY2FjaGVBdXRob3JpemVSZXF1ZXN0KGksby52ZXJpZmllcik7dHJ5e2lmKGkuaHR0cE1ldGhvZD09PWwpcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZUNvZGVGbG93V2l0aFBvc3QoaSk7e2NvbnN0IHI9YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuY29ycmVsYXRpb25JZCkoe3NlcnZlclRlbGVtZXRyeU1hbmFnZXI6bixyZXF1ZXN0QXV0aG9yaXR5OmkuYXV0aG9yaXR5LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczppLmF6dXJlQ2xvdWRPcHRpb25zLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczppLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLGFjY291bnQ6aS5hY2NvdW50fSksbz1hd2FpdCBVbihvbCxPci5HZXRBdXRoQ29kZVVybCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkodGhpcy5jb25maWcsci5hdXRob3JpdHksaSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtyZXR1cm4gYXdhaXQgdGhpcy5pbml0aWF0ZUF1dGhSZXF1ZXN0KG8sdCl9fWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBDZSYmKGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLG4uY2FjaGVGYWlsZWRSZXF1ZXN0KGUpKSxlfX1hc3luYyBleGVjdXRlRWFyRmxvdyhlKXtjb25zdCB0PWUuY29ycmVsYXRpb25JZCxyPWF3YWl0IFVuKHRoaXMuZ2V0RGlzY292ZXJlZEF1dGhvcml0eS5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXREaXNjb3ZlcmVkQXV0aG9yaXR5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkoe3JlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxuPWF3YWl0IFVuKHNhLE9yLkdlbmVyYXRlRWFyS2V5LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkoKSxvPWF3YWl0IFVuKGRsLE9yLkdlbmVyYXRlUGtjZUNvZGVzLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkodGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcix0KSxpPXsuLi5lLGVhckp3azpuLGNvZGVDaGFsbGVuZ2U6by5jaGFsbGVuZ2V9O3RoaXMuYnJvd3NlclN0b3JhZ2UuY2FjaGVBdXRob3JpemVSZXF1ZXN0KGksby52ZXJpZmllcik7cmV0dXJuKGF3YWl0IGlsKGRvY3VtZW50LHRoaXMuY29uZmlnLHIsaSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSkuc3VibWl0KCksbmV3IFByb21pc2UoKChlLHQpPT57c2V0VGltZW91dCgoKCk9Pnt0KFppKGppLCJmYWlsZWRfdG9fcmVkaXJlY3QiKSl9KSx0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCl9KSl9YXN5bmMgZXhlY3V0ZUNvZGVGbG93V2l0aFBvc3QoZSl7Y29uc3QgdD1lLmNvcnJlbGF0aW9uSWQscj1hd2FpdCBVbih0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHtyZXF1ZXN0QXV0aG9yaXR5OmUuYXV0aG9yaXR5LHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczplLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLGFjY291bnQ6ZS5hY2NvdW50fSk7dGhpcy5icm93c2VyU3RvcmFnZS5jYWNoZUF1dGhvcml6ZVJlcXVlc3QoZSk7cmV0dXJuKGF3YWl0IHNsKGRvY3VtZW50LHRoaXMuY29uZmlnLHIsZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSkuc3VibWl0KCksbmV3IFByb21pc2UoKChlLHQpPT57c2V0VGltZW91dCgoKCk9Pnt0KFppKGppLCJmYWlsZWRfdG9fcmVkaXJlY3QiKSl9KSx0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCl9KSl9YXN5bmMgaGFuZGxlUmVkaXJlY3RQcm9taXNlKGU9IiIscixuLG8pe2NvbnN0IGk9dGhpcy5pbml0aWFsaXplU2VydmVyVGVsZW1ldHJ5TWFuYWdlcihNcy5oYW5kbGVSZWRpcmVjdFByb21pc2UpO3RyeXtjb25zdFtzLGFdPXRoaXMuZ2V0UmVkaXJlY3RSZXNwb25zZShlfHwiIik7aWYoIXMpcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBkaWQgbm90IGRldGVjdCBhIHJlc3BvbnNlIGFzIGEgcmVzdWx0IG9mIGEgcmVkaXJlY3QuIENsZWFuaW5nIHRlbXBvcmFyeSBjYWNoZS4iKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCksImJhY2tfZm9yd2FyZCIhPT1mdW5jdGlvbigpe2lmKCJ1bmRlZmluZWQiPT10eXBlb2Ygd2luZG93fHx2b2lkIDA9PT13aW5kb3cucGVyZm9ybWFuY2V8fCJmdW5jdGlvbiIhPXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSlyZXR1cm47Y29uc3QgZT13aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5VHlwZSgibmF2aWdhdGlvbiIpLHQ9ZS5sZW5ndGg/ZVswXTp2b2lkIDA7cmV0dXJuIHQ/LnR5cGV9KCk/by5ldmVudC5lcnJvckNvZGU9Im5vX3NlcnZlcl9yZXNwb25zZSI6dGhpcy5sb2dnZXIudmVyYm9zZSgiQmFjayBuYXZpZ2F0aW9uIGV2ZW50IGRldGVjdGVkLiBNdXRpbmcgbm9fc2VydmVyX3Jlc3BvbnNlIGVycm9yIiksbnVsbDtjb25zdCBjPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0VGVtcG9yYXJ5Q2FjaGUoQXMsITApfHx0LkVNUFRZX1NUUklORyxsPUNyKGMpO2lmKGw9PT1Dcih3aW5kb3cubG9jYXRpb24uaHJlZikmJnRoaXMuY29uZmlnLmF1dGgubmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiQ3VycmVudCBwYWdlIGlzIGxvZ2luUmVxdWVzdFVybCwgaGFuZGxpbmcgcmVzcG9uc2UiKSxjLmluZGV4T2YoIiMiKT4tMSYmQWEoYyk7cmV0dXJuIGF3YWl0IHRoaXMuaGFuZGxlUmVzcG9uc2UocyxyLG4saSl9aWYoIXRoaXMuY29uZmlnLmF1dGgubmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybClyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiTmF2aWdhdGVUb0xvZ2luUmVxdWVzdFVybCBzZXQgdG8gZmFsc2UsIGhhbmRsaW5nIHJlc3BvbnNlIiksYXdhaXQgdGhpcy5oYW5kbGVSZXNwb25zZShzLHIsbixpKTtpZigha2EoKXx8dGhpcy5jb25maWcuc3lzdGVtLmFsbG93UmVkaXJlY3RJbklmcmFtZSl7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShrcyxhLCEwKTtjb25zdCBlPXthcGlJZDpNcy5oYW5kbGVSZWRpcmVjdFByb21pc2UsdGltZW91dDp0aGlzLmNvbmZpZy5zeXN0ZW0ucmVkaXJlY3ROYXZpZ2F0aW9uVGltZW91dCxub0hpc3Rvcnk6ITB9O2xldCB0PSEwO2lmKGMmJiJudWxsIiE9PWMpdGhpcy5sb2dnZXIudmVyYm9zZShgTmF2aWdhdGluZyB0byBsb2dpblJlcXVlc3RVcmw6ICR7Y31gKSx0PWF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUludGVybmFsKGMsZSk7ZWxzZXtjb25zdCByPUVhKCk7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRUZW1wb3JhcnlDYWNoZShBcyxyLCEwKSx0aGlzLmxvZ2dlci53YXJuaW5nKCJVbmFibGUgdG8gZ2V0IHZhbGlkIGxvZ2luIHJlcXVlc3QgdXJsIGZyb20gY2FjaGUsIHJlZGlyZWN0aW5nIHRvIGhvbWUgcGFnZSIpLHQ9YXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlSW50ZXJuYWwocixlKX1pZighdClyZXR1cm4gYXdhaXQgdGhpcy5oYW5kbGVSZXNwb25zZShzLHIsbixpKX1yZXR1cm4gbnVsbH1jYXRjaChlKXt0aHJvdyBlIGluc3RhbmNlb2YgQ2UmJihlLnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKSxpLmNhY2hlRmFpbGVkUmVxdWVzdChlKSksZX19Z2V0UmVkaXJlY3RSZXNwb25zZSh0KXt0aGlzLmxvZ2dlci52ZXJib3NlKCJnZXRSZWRpcmVjdFJlc3BvbnNlSGFzaCBjYWxsZWQiKTtsZXQgcj10O3J8fChyPXRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlPT09Xy5RVUVSWT93aW5kb3cubG9jYXRpb24uc2VhcmNoOndpbmRvdy5sb2NhdGlvbi5oYXNoKTtsZXQgbj1mcihyKTtpZihuKXt0cnl7V2Mobix0aGlzLmJyb3dzZXJDcnlwdG8sZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpfWNhdGNoKGUpe3JldHVybiBlIGluc3RhbmNlb2YgQ2UmJnRoaXMubG9nZ2VyLmVycm9yKGBJbnRlcmFjdGlvbiB0eXBlIHZhbGlkYXRpb24gZmFpbGVkIGR1ZSB0byAke2UuZXJyb3JDb2RlfTogJHtlLmVycm9yTWVzc2FnZX1gKSxbbnVsbCwiIl19cmV0dXJuIFRhKHdpbmRvdyksdGhpcy5sb2dnZXIudmVyYm9zZSgiSGFzaCBjb250YWlucyBrbm93biBwcm9wZXJ0aWVzLCByZXR1cm5pbmcgcmVzcG9uc2UgaGFzaCIpLFtuLHJdfWNvbnN0IG89dGhpcy5icm93c2VyU3RvcmFnZS5nZXRUZW1wb3JhcnlDYWNoZShrcywhMCk7cmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmJyb3dzZXJTdG9yYWdlLmdlbmVyYXRlQ2FjaGVLZXkoa3MpKSxvJiYobj1mcihvKSxuKT8odGhpcy5sb2dnZXIudmVyYm9zZSgiSGFzaCBkb2VzIG5vdCBjb250YWluIGtub3duIHByb3BlcnRpZXMsIHJldHVybmluZyBjYWNoZWQgaGFzaCIpLFtuLG9dKTpbbnVsbCwiIl19YXN5bmMgaGFuZGxlUmVzcG9uc2UoZSx0LHIsbil7aWYoIWUuc3RhdGUpdGhyb3cgWmkobmkpO2lmKGUuZWFyX2p3ZSl7Y29uc3Qgcj1hd2FpdCBVbih0aGlzLmdldERpc2NvdmVyZWRBdXRob3JpdHkuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50R2V0RGlzY292ZXJlZEF1dGhvcml0eSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkoe3JlcXVlc3RBdXRob3JpdHk6dC5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOnQuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOnQuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDp0LmFjY291bnR9KTtyZXR1cm4gVW4oaGwsT3IuSGFuZGxlUmVzcG9uc2VFYXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0LmNvcnJlbGF0aW9uSWQpKHQsZSxNcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCx0aGlzLmNvbmZpZyxyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9Y29uc3Qgbz1hd2FpdCBVbih0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5jb3JyZWxhdGlvbklkKSh7c2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpuLHJlcXVlc3RBdXRob3JpdHk6dC5hdXRob3JpdHl9KTtyZXR1cm4gVW4obGwsT3IuSGFuZGxlUmVzcG9uc2VDb2RlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKSh0LGUscixNcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCx0aGlzLmNvbmZpZyxvLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9YXN5bmMgaW5pdGlhdGVBdXRoUmVxdWVzdChlLHQpe2lmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0IGNhbGxlZCIpLGUpe3RoaXMubG9nZ2VyLmluZm9QaWkoYFJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBOYXZpZ2F0ZSB0bzogJHtlfWApO2NvbnN0IHI9e2FwaUlkOk1zLmFjcXVpcmVUb2tlblJlZGlyZWN0LHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSxuPXR8fHRoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogSW52b2tpbmcgb25SZWRpcmVjdE5hdmlnYXRlIGNhbGxiYWNrIik7cmV0dXJuITEhPT1uKGUpPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogb25SZWRpcmVjdE5hdmlnYXRlIGRpZCBub3QgcmV0dXJuIGZhbHNlLCBuYXZpZ2F0aW5nIiksdm9pZCBhd2FpdCB0aGlzLm5hdmlnYXRpb25DbGllbnQubmF2aWdhdGVFeHRlcm5hbChlLHIpKTp2b2lkIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlJlZGlyZWN0SGFuZGxlci5pbml0aWF0ZUF1dGhSZXF1ZXN0OiBvblJlZGlyZWN0TmF2aWdhdGUgcmV0dXJuZWQgZmFsc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24iKX1yZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiUmVkaXJlY3RIYW5kbGVyLmluaXRpYXRlQXV0aFJlcXVlc3Q6IE5hdmlnYXRpbmcgd2luZG93IHRvIG5hdmlnYXRlIHVybCIpLHZvaWQgYXdhaXQgdGhpcy5uYXZpZ2F0aW9uQ2xpZW50Lm5hdmlnYXRlRXh0ZXJuYWwoZSxyKX10aHJvdyB0aGlzLmxvZ2dlci5pbmZvKCJSZWRpcmVjdEhhbmRsZXIuaW5pdGlhdGVBdXRoUmVxdWVzdDogTmF2aWdhdGUgdXJsIGlzIGVtcHR5IiksWmkodGkpfWFzeW5jIGxvZ291dCh0KXt0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dvdXRSZWRpcmVjdCBjYWxsZWQiKTtjb25zdCByPXRoaXMuaW5pdGlhbGl6ZUxvZ291dFJlcXVlc3QodCksbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKE1zLmxvZ291dCk7dHJ5e3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dPVVRfU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCksYXdhaXQgdGhpcy5jbGVhckNhY2hlT25Mb2dvdXQodGhpcy5jb3JyZWxhdGlvbklkLHIuYWNjb3VudCk7Y29uc3Qgbz17YXBpSWQ6TXMubG9nb3V0LHRpbWVvdXQ6dGhpcy5jb25maWcuc3lzdGVtLnJlZGlyZWN0TmF2aWdhdGlvblRpbWVvdXQsbm9IaXN0b3J5OiExfSxpPWF3YWl0IFVuKHRoaXMuY3JlYXRlQXV0aENvZGVDbGllbnQuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50Q3JlYXRlQXV0aENvZGVDbGllbnQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOm4scmVxdWVzdEF1dGhvcml0eTp0JiZ0LmF1dGhvcml0eSxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6dD8uZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDp0JiZ0LmFjY291bnR8fHZvaWQgMH0pO2lmKGkuYXV0aG9yaXR5LnByb3RvY29sTW9kZT09PWxyLk9JREMpdHJ5e2kuYXV0aG9yaXR5LmVuZFNlc3Npb25FbmRwb2ludH1jYXRjaHtpZihyLmFjY291bnQ/LmhvbWVBY2NvdW50SWQpcmV0dXJuIHZvaWQgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LHIpfWNvbnN0IHM9aS5nZXRMb2dvdXRVcmkocik7aWYodGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LHIpLCF0fHwiZnVuY3Rpb24iIT10eXBlb2YgdC5vblJlZGlyZWN0TmF2aWdhdGUpcmV0dXJuIHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCl8fHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCEwLFRzKSx2b2lkIGF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUV4dGVybmFsKHMsbyk7aWYoITEhPT10Lm9uUmVkaXJlY3ROYXZpZ2F0ZShzKSlyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiTG9nb3V0IG9uUmVkaXJlY3ROYXZpZ2F0ZSBkaWQgbm90IHJldHVybiBmYWxzZSwgbmF2aWdhdGluZyIpLHRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCl8fHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCEwLFRzKSx2b2lkIGF3YWl0IHRoaXMubmF2aWdhdGlvbkNsaWVudC5uYXZpZ2F0ZUV4dGVybmFsKHMsbyk7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITEpLHRoaXMubG9nZ2VyLnZlcmJvc2UoIkxvZ291dCBvblJlZGlyZWN0TmF2aWdhdGUgcmV0dXJuZWQgZmFsc2UsIHN0b3BwaW5nIG5hdmlnYXRpb24iKX1jYXRjaCh0KXt0aHJvdyB0IGluc3RhbmNlb2YgQ2UmJih0LnNldENvcnJlbGF0aW9uSWQodGhpcy5jb3JyZWxhdGlvbklkKSxuLmNhY2hlRmFpbGVkUmVxdWVzdCh0KSksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LG51bGwsdCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpLHR9dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR09VVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpfWdldFJlZGlyZWN0U3RhcnRQYWdlKGUpe2NvbnN0IHQ9ZXx8d2luZG93LmxvY2F0aW9uLmhyZWY7cmV0dXJuIHdyLmdldEFic29sdXRlVXJsKHQsYmEoKSl9fWFzeW5jIGZ1bmN0aW9uIHZsKGUsdCxyLG4sbyl7aWYodC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlNpbGVudEhhbmRsZXJJbml0aWF0ZUF1dGhSZXF1ZXN0LG4pLCFlKXRocm93IHIuaW5mbygiTmF2aWdhdGUgdXJsIGlzIGVtcHR5IiksWmkodGkpO3JldHVybiBvP1VuKGtsLE9yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUscix0LG4pKGUsbyx0LG4pOk5uKFNsLE9yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWVTeW5jLHIsdCxuKShlKX1hc3luYyBmdW5jdGlvbiBJbChlLHQscixuLG8pe2NvbnN0IGk9YmwoKTtpZighaS5jb250ZW50RG9jdW1lbnQpdGhyb3ciTm8gZG9jdW1lbnQgYXNzb2NpYXRlZCB3aXRoIGlmcmFtZSEiO3JldHVybihhd2FpdCBzbChpLmNvbnRlbnREb2N1bWVudCxlLHQscixuLG8pKS5zdWJtaXQoKSxpfWFzeW5jIGZ1bmN0aW9uIFRsKGUsdCxyLG4sbyl7Y29uc3QgaT1ibCgpO2lmKCFpLmNvbnRlbnREb2N1bWVudCl0aHJvdyJObyBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggaWZyYW1lISI7cmV0dXJuKGF3YWl0IGlsKGkuY29udGVudERvY3VtZW50LGUsdCxyLG4sbykpLnN1Ym1pdCgpLGl9YXN5bmMgZnVuY3Rpb24gQWwoZSx0LHIsbixvLGkscyl7cmV0dXJuIG4uYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRIYW5kbGVyTW9uaXRvcklmcmFtZUZvckhhc2gsaSksbmV3IFByb21pc2UoKChuLGkpPT57dDxLYSYmby53YXJuaW5nKGBzeXN0ZW0ubG9hZEZyYW1lVGltZW91dCBvciBzeXN0ZW0uaWZyYW1lSGFzaFRpbWVvdXQgc2V0IHRvIGxvd2VyICgke3R9bXMpIHRoYW4gdGhlIGRlZmF1bHQgKDEwMDAwbXMpLiBUaGlzIG1heSByZXN1bHQgaW4gdGltZW91dHMuYCk7Y29uc3QgYT13aW5kb3cuc2V0VGltZW91dCgoKCk9Pnt3aW5kb3cuY2xlYXJJbnRlcnZhbChjKSxpKFppKHVpKSl9KSx0KSxjPXdpbmRvdy5zZXRJbnRlcnZhbCgoKCk9PntsZXQgdD0iIjtjb25zdCByPWUuY29udGVudFdpbmRvdzt0cnl7dD1yP3IubG9jYXRpb24uaHJlZjoiIn1jYXRjaChlKXt9aWYoIXR8fCJhYm91dDpibGFuayI9PT10KXJldHVybjtsZXQgbz0iIjtyJiYobz1zPT09Xy5RVUVSWT9yLmxvY2F0aW9uLnNlYXJjaDpyLmxvY2F0aW9uLmhhc2gpLHdpbmRvdy5jbGVhclRpbWVvdXQoYSksd2luZG93LmNsZWFySW50ZXJ2YWwoYyksbihvKX0pLHIpfSkpLmZpbmFsbHkoKCgpPT57Tm4oRWwsT3IuUmVtb3ZlSGlkZGVuSWZyYW1lLG8sbixpKShlKX0pKX1mdW5jdGlvbiBrbChlLHQscixuKXtyZXR1cm4gci5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLlNpbGVudEhhbmRsZXJMb2FkRnJhbWUsbiksbmV3IFByb21pc2UoKChyLG4pPT57Y29uc3Qgbz1ibCgpO3dpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e28/KG8uc3JjPWUscihvKSk6bigiVW5hYmxlIHRvIGxvYWQgaWZyYW1lIil9KSx0KX0pKX1mdW5jdGlvbiBTbChlKXtjb25zdCB0PWJsKCk7cmV0dXJuIHQuc3JjPWUsdH1mdW5jdGlvbiBibCgpe2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaWZyYW1lIik7cmV0dXJuIGUuY2xhc3NOYW1lPSJtc2FsU2lsZW50SWZyYW1lIixlLnN0eWxlLnZpc2liaWxpdHk9ImhpZGRlbiIsZS5zdHlsZS5wb3NpdGlvbj0iYWJzb2x1dGUiLGUuc3R5bGUud2lkdGg9ZS5zdHlsZS5oZWlnaHQ9IjAiLGUuc3R5bGUuYm9yZGVyPSIwIixlLnNldEF0dHJpYnV0ZSgic2FuZGJveCIsImFsbG93LXNjcmlwdHMgYWxsb3ctc2FtZS1vcmlnaW4gYWxsb3ctZm9ybXMiKSxlLnNldEF0dHJpYnV0ZSgiYWxsb3ciLCJsb2NhbC1uZXR3b3JrLWFjY2VzcyAqIiksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChlKSxlfWZ1bmN0aW9uIEVsKGUpe2RvY3VtZW50LmJvZHk9PT1lLnBhcmVudE5vZGUmJmRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSl9Y2xhc3MgUmwgZXh0ZW5kcyBRY3tjb25zdHJ1Y3RvcihlLHQscixuLG8saSxzLGEsYyxsLGgpe3N1cGVyKGUsdCxyLG4sbyxpLGEsbCxoKSx0aGlzLmFwaUlkPXMsdGhpcy5uYXRpdmVTdG9yYWdlPWN9YXN5bmMgYWNxdWlyZVRva2VuKHQpe3RoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkUXVldWVNZWFzdXJlbWVudChPci5TaWxlbnRJZnJhbWVDbGllbnRBY3F1aXJlVG9rZW4sdC5jb3JyZWxhdGlvbklkKSx0LmxvZ2luSGludHx8dC5zaWR8fHQuYWNjb3VudCYmdC5hY2NvdW50LnVzZXJuYW1lfHx0aGlzLmxvZ2dlci53YXJuaW5nKCJObyB1c2VyIGhpbnQgcHJvdmlkZWQuIFRoZSBhdXRob3JpemF0aW9uIHNlcnZlciBtYXkgbmVlZCBtb3JlIGluZm9ybWF0aW9uIHRvIGNvbXBsZXRlIHRoaXMgcmVxdWVzdC4iKTtjb25zdCByPXsuLi50fTtyLnByb21wdD9yLnByb21wdCE9PWIuTk9ORSYmci5wcm9tcHQhPT1iLk5PX1NFU1NJT04mJih0aGlzLmxvZ2dlci53YXJuaW5nKGBTaWxlbnRJZnJhbWVDbGllbnQuIFJlcGxhY2luZyBpbnZhbGlkIHByb21wdCAke3IucHJvbXB0fSB3aXRoICR7Yi5OT05FfWApLHIucHJvbXB0PWIuTk9ORSk6ci5wcm9tcHQ9Yi5OT05FO2NvbnN0IG49YXdhaXQgVW4odGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKShyLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCk7cmV0dXJuIG4ucGxhdGZvcm1Ccm9rZXI9eWwodGhpcy5jb25maWcsdGhpcy5sb2dnZXIsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixuLmF1dGhlbnRpY2F0aW9uU2NoZW1lKSxVYShuLmF1dGhvcml0eSksdGhpcy5jb25maWcuYXV0aC5wcm90b2NvbE1vZGU9PT1sci5FQVI/dGhpcy5leGVjdXRlRWFyRmxvdyhuKTp0aGlzLmV4ZWN1dGVDb2RlRmxvdyhuKX1hc3luYyBleGVjdXRlQ29kZUZsb3coZSl7bGV0IHQ7Y29uc3Qgcj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpO3RyeXtyZXR1cm4gdD1hd2FpdCBVbih0aGlzLmNyZWF0ZUF1dGhDb2RlQ2xpZW50LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudENyZWF0ZUF1dGhDb2RlQ2xpZW50LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKSh7c2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpyLHJlcXVlc3RBdXRob3JpdHk6ZS5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOmUuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOmUuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDplLmFjY291bnR9KSxhd2FpdCBVbih0aGlzLnNpbGVudFRva2VuSGVscGVyLmJpbmQodGhpcyksT3IuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKHQsZSl9Y2F0Y2gobil7aWYobiBpbnN0YW5jZW9mIENlJiYobi5zZXRDb3JyZWxhdGlvbklkKHRoaXMuY29ycmVsYXRpb25JZCksci5jYWNoZUZhaWxlZFJlcXVlc3QobikpLCEodCYmbiBpbnN0YW5jZW9mIENlJiZuLmVycm9yQ29kZT09PWVzKSl0aHJvdyBuO3JldHVybiB0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7cmV0cnlFcnJvcjpuLmVycm9yQ29kZX0sdGhpcy5jb3JyZWxhdGlvbklkKSxhd2FpdCBVbih0aGlzLnNpbGVudFRva2VuSGVscGVyLmJpbmQodGhpcyksT3IuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHQsZSl9fWFzeW5jIGV4ZWN1dGVFYXJGbG93KGUpe2NvbnN0IHQ9ZS5jb3JyZWxhdGlvbklkLHI9YXdhaXQgVW4odGhpcy5nZXREaXNjb3ZlcmVkQXV0aG9yaXR5LmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldERpc2NvdmVyZWRBdXRob3JpdHksdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KSh7cmVxdWVzdEF1dGhvcml0eTplLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6ZS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6ZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmUuYWNjb3VudH0pLG49YXdhaXQgVW4oc2EsT3IuR2VuZXJhdGVFYXJLZXksdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KSgpLG89YXdhaXQgVW4oZGwsT3IuR2VuZXJhdGVQa2NlQ29kZXMsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KSh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyLHQpLGk9ey4uLmUsZWFySndrOm4sY29kZUNoYWxsZW5nZTpvLmNoYWxsZW5nZX0scz1hd2FpdCBVbihUbCxPci5TaWxlbnRIYW5kbGVySW5pdGlhdGVBdXRoUmVxdWVzdCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHRoaXMuY29uZmlnLHIsaSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KSxhPXRoaXMuY29uZmlnLmF1dGguT0lEQ09wdGlvbnMuc2VydmVyUmVzcG9uc2VUeXBlLGM9YXdhaXQgVW4oQWwsT3IuU2lsZW50SGFuZGxlck1vbml0b3JJZnJhbWVGb3JIYXNoLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkocyx0aGlzLmNvbmZpZy5zeXN0ZW0uaWZyYW1lSGFzaFRpbWVvdXQsdGhpcy5jb25maWcuc3lzdGVtLnBvbGxJbnRlcnZhbE1pbGxpc2Vjb25kcyx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyLHQsYSksbD1ObihqYyxPci5EZXNlcmlhbGl6ZVJlc3BvbnNlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdCkoYyxhLHRoaXMubG9nZ2VyKTtpZighbC5lYXJfandlJiZsLmNvZGUpe2NvbnN0IG49YXdhaXQgVW4odGhpcy5jcmVhdGVBdXRoQ29kZUNsaWVudC5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRDcmVhdGVBdXRoQ29kZUNsaWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQpKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOnRoaXMuaW5pdGlhbGl6ZVNlcnZlclRlbGVtZXRyeU1hbmFnZXIodGhpcy5hcGlJZCkscmVxdWVzdEF1dGhvcml0eTplLmF1dGhvcml0eSxyZXF1ZXN0QXp1cmVDbG91ZE9wdGlvbnM6ZS5henVyZUNsb3VkT3B0aW9ucyxyZXF1ZXN0RXh0cmFRdWVyeVBhcmFtZXRlcnM6ZS5leHRyYVF1ZXJ5UGFyYW1ldGVycyxhY2NvdW50OmUuYWNjb3VudCxhdXRob3JpdHk6cn0pO3JldHVybiBVbihsbCxPci5IYW5kbGVSZXNwb25zZUNvZGUsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KShpLGwsby52ZXJpZmllcix0aGlzLmFwaUlkLHRoaXMuY29uZmlnLG4sdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLm5hdGl2ZVN0b3JhZ2UsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyKX1yZXR1cm4gVW4oaGwsT3IuSGFuZGxlUmVzcG9uc2VFYXIsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0KShpLGwsdGhpcy5hcGlJZCx0aGlzLmNvbmZpZyxyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5uYXRpdmVTdG9yYWdlLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcil9bG9nb3V0KCl7cmV0dXJuIFByb21pc2UucmVqZWN0KFppKHlpKSl9YXN5bmMgc2lsZW50VG9rZW5IZWxwZXIoZSx0KXtjb25zdCByPXQuY29ycmVsYXRpb25JZDt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU2lsZW50SWZyYW1lQ2xpZW50VG9rZW5IZWxwZXIscik7Y29uc3Qgbj1hd2FpdCBVbihkbCxPci5HZW5lcmF0ZVBrY2VDb2Rlcyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5sb2dnZXIsciksbz17Li4udCxjb2RlQ2hhbGxlbmdlOm4uY2hhbGxlbmdlfTtsZXQgaTtpZih0Lmh0dHBNZXRob2Q9PT1sKWk9YXdhaXQgVW4oSWwsT3IuU2lsZW50SGFuZGxlckluaXRpYXRlQXV0aFJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxyKSh0aGlzLmNvbmZpZyxlLmF1dGhvcml0eSxvLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpO2Vsc2V7Y29uc3QgdD1hd2FpdCBVbihvbCxPci5HZXRBdXRoQ29kZVVybCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHRoaXMuY29uZmlnLGUuYXV0aG9yaXR5LG8sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7aT1hd2FpdCBVbih2bCxPci5TaWxlbnRIYW5kbGVySW5pdGlhdGVBdXRoUmVxdWVzdCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixyLHRoaXMuY29uZmlnLnN5c3RlbS5uYXZpZ2F0ZUZyYW1lV2FpdCl9Y29uc3Qgcz10aGlzLmNvbmZpZy5hdXRoLk9JRENPcHRpb25zLnNlcnZlclJlc3BvbnNlVHlwZSxhPWF3YWl0IFVuKEFsLE9yLlNpbGVudEhhbmRsZXJNb25pdG9ySWZyYW1lRm9ySGFzaCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKGksdGhpcy5jb25maWcuc3lzdGVtLmlmcmFtZUhhc2hUaW1lb3V0LHRoaXMuY29uZmlnLnN5c3RlbS5wb2xsSW50ZXJ2YWxNaWxsaXNlY29uZHMsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmxvZ2dlcixyLHMpLGM9Tm4oamMsT3IuRGVzZXJpYWxpemVSZXNwb25zZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKGEscyx0aGlzLmxvZ2dlcik7cmV0dXJuIFVuKGxsLE9yLkhhbmRsZVJlc3BvbnNlQ29kZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHQsYyxuLnZlcmlmaWVyLHRoaXMuYXBpSWQsdGhpcy5jb25maWcsZSx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMubmF0aXZlU3RvcmFnZSx0aGlzLmV2ZW50SGFuZGxlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpfX1jbGFzcyBfbCBleHRlbmRzIFFje2FzeW5jIGFjcXVpcmVUb2tlbihlKXt0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuU2lsZW50UmVmcmVzaENsaWVudEFjcXVpcmVUb2tlbixlLmNvcnJlbGF0aW9uSWQpO2NvbnN0IHQ9YXdhaXQgVW4oS2MsT3IuSW5pdGlhbGl6ZUJhc2VSZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShlLHRoaXMuY29uZmlnLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5sb2dnZXIpLHI9ey4uLmUsLi4udH07ZS5yZWRpcmVjdFVyaSYmKHIucmVkaXJlY3RVcmk9dGhpcy5nZXRSZWRpcmVjdFVyaShlLnJlZGlyZWN0VXJpKSk7Y29uc3Qgbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKE1zLmFjcXVpcmVUb2tlblNpbGVudF9zaWxlbnRGbG93KSxvPWF3YWl0IHRoaXMuY3JlYXRlUmVmcmVzaFRva2VuQ2xpZW50KHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOm4sYXV0aG9yaXR5VXJsOnIuYXV0aG9yaXR5LGF6dXJlQ2xvdWRPcHRpb25zOnIuYXp1cmVDbG91ZE9wdGlvbnMsYWNjb3VudDpyLmFjY291bnR9KTtyZXR1cm4gVW4oby5hY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbi5iaW5kKG8pLE9yLlJlZnJlc2hUb2tlbkNsaWVudEFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShyKS5jYXRjaCgoZT0+e3Rocm93IGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLG4uY2FjaGVGYWlsZWRSZXF1ZXN0KGUpLGV9KSl9bG9nb3V0KCl7cmV0dXJuIFByb21pc2UucmVqZWN0KFppKHlpKSl9YXN5bmMgY3JlYXRlUmVmcmVzaFRva2VuQ2xpZW50KGUpe2NvbnN0IHQ9YXdhaXQgVW4odGhpcy5nZXRDbGllbnRDb25maWd1cmF0aW9uLmJpbmQodGhpcyksT3IuU3RhbmRhcmRJbnRlcmFjdGlvbkNsaWVudEdldENsaWVudENvbmZpZ3VyYXRpb24sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmNvcnJlbGF0aW9uSWQpKHtzZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyOmUuc2VydmVyVGVsZW1ldHJ5TWFuYWdlcixyZXF1ZXN0QXV0aG9yaXR5OmUuYXV0aG9yaXR5VXJsLHJlcXVlc3RBenVyZUNsb3VkT3B0aW9uczplLmF6dXJlQ2xvdWRPcHRpb25zLHJlcXVlc3RFeHRyYVF1ZXJ5UGFyYW1ldGVyczplLmV4dHJhUXVlcnlQYXJhbWV0ZXJzLGFjY291bnQ6ZS5hY2NvdW50fSk7cmV0dXJuIG5ldyBObyh0LHRoaXMucGVyZm9ybWFuY2VDbGllbnQpfX1jbGFzcyBQbHtjb25zdHJ1Y3RvcihlLHQscixuKXt0aGlzLmlzQnJvd3NlckVudmlyb25tZW50PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LHRoaXMuY29uZmlnPWUsdGhpcy5zdG9yYWdlPXQsdGhpcy5sb2dnZXI9cix0aGlzLmNyeXB0b09iaj1ufWFzeW5jIGxvYWRFeHRlcm5hbFRva2VucyhlLHQscil7aWYoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpdGhyb3cgWmkoa2kpO2NvbnN0IG49ZS5jb3JyZWxhdGlvbklkfHxvYSgpLG89dC5pZF90b2tlbj9kcih0LmlkX3Rva2VuLEtzKTp2b2lkIDAsaT11cihvfHx7fSkscz17cHJvdG9jb2xNb2RlOnRoaXMuY29uZmlnLmF1dGgucHJvdG9jb2xNb2RlLGtub3duQXV0aG9yaXRpZXM6dGhpcy5jb25maWcuYXV0aC5rbm93bkF1dGhvcml0aWVzLGNsb3VkRGlzY292ZXJ5TWV0YWRhdGE6dGhpcy5jb25maWcuYXV0aC5jbG91ZERpc2NvdmVyeU1ldGFkYXRhLGF1dGhvcml0eU1ldGFkYXRhOnRoaXMuY29uZmlnLmF1dGguYXV0aG9yaXR5TWV0YWRhdGEsc2tpcEF1dGhvcml0eU1ldGFkYXRhQ2FjaGU6dGhpcy5jb25maWcuYXV0aC5za2lwQXV0aG9yaXR5TWV0YWRhdGFDYWNoZX0sYT1lLmF1dGhvcml0eT9uZXcgWm4oWm4uZ2VuZXJhdGVBdXRob3JpdHkoZS5hdXRob3JpdHksZS5henVyZUNsb3VkT3B0aW9ucyksdGhpcy5jb25maWcuc3lzdGVtLm5ldHdvcmtDbGllbnQsdGhpcy5zdG9yYWdlLHMsdGhpcy5sb2dnZXIsZS5jb3JyZWxhdGlvbklkfHxvYSgpKTp2b2lkIDAsYz1hd2FpdCB0aGlzLmxvYWRBY2NvdW50KGUsci5jbGllbnRJbmZvfHx0LmNsaWVudF9pbmZvfHwiIixuLG8sYSksbD1hd2FpdCB0aGlzLmxvYWRJZFRva2VuKHQsYy5ob21lQWNjb3VudElkLGMuZW52aXJvbm1lbnQsYy5yZWFsbSxuLGkpLGg9YXdhaXQgdGhpcy5sb2FkQWNjZXNzVG9rZW4oZSx0LGMuaG9tZUFjY291bnRJZCxjLmVudmlyb25tZW50LGMucmVhbG0scixuLGkpLGQ9YXdhaXQgdGhpcy5sb2FkUmVmcmVzaFRva2VuKHQsYy5ob21lQWNjb3VudElkLGMuZW52aXJvbm1lbnQsbixpKTtyZXR1cm4gdGhpcy5nZW5lcmF0ZUF1dGhlbnRpY2F0aW9uUmVzdWx0KGUse2FjY291bnQ6YyxpZFRva2VuOmwsYWNjZXNzVG9rZW46aCxyZWZyZXNoVG9rZW46ZH0sbyxhKX1hc3luYyBsb2FkQWNjb3VudChlLHQscixuLG8pe2lmKHRoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBsb2FkaW5nIGFjY291bnQiKSxlLmFjY291bnQpe2NvbnN0IHQ9aHIuY3JlYXRlRnJvbUFjY291bnRJbmZvKGUuYWNjb3VudCk7cmV0dXJuIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXRBY2NvdW50KHQscix1cihufHx7fSkpLHR9aWYoIW98fCF0JiYhbil0aHJvdyB0aGlzLmxvZ2dlci5lcnJvcigiVG9rZW5DYWNoZSAtIGlmIGFuIGFjY291bnQgaXMgbm90IHByb3ZpZGVkIG9uIHRoZSByZXF1ZXN0LCBhdXRob3JpdHkgYW5kIGVpdGhlciBjbGllbnRJbmZvIG9yIGlkVG9rZW4gbXVzdCBiZSBwcm92aWRlZCBpbnN0ZWFkLiIpLFppKFBpKTtjb25zdCBpPWhyLmdlbmVyYXRlSG9tZUFjY291bnRJZCh0LG8uYXV0aG9yaXR5VHlwZSx0aGlzLmxvZ2dlcix0aGlzLmNyeXB0b09iaixuKSxzPW4/LnRpZCxhPU1vKHRoaXMuc3RvcmFnZSxvLGksS3MscixuLHQsby5ob3N0bmFtZUFuZFBvcnQscyx2b2lkIDAsdm9pZCAwLHRoaXMubG9nZ2VyKTtyZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLnNldEFjY291bnQoYSxyLHVyKG58fHt9KSksYX1hc3luYyBsb2FkSWRUb2tlbihlLHQscixuLG8saSl7aWYoIWUuaWRfdG9rZW4pcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBubyBpZCB0b2tlbiBmb3VuZCBpbiByZXNwb25zZSIpLG51bGw7dGhpcy5sb2dnZXIudmVyYm9zZSgiVG9rZW5DYWNoZSAtIGxvYWRpbmcgaWQgdG9rZW4iKTtjb25zdCBzPUtuKHQscixlLmlkX3Rva2VuLHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsbik7cmV0dXJuIGF3YWl0IHRoaXMuc3RvcmFnZS5zZXRJZFRva2VuQ3JlZGVudGlhbChzLG8saSksc31hc3luYyBsb2FkQWNjZXNzVG9rZW4oZSx0LHIsbixvLGkscyxhKXtpZighdC5hY2Nlc3NfdG9rZW4pcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBubyBhY2Nlc3MgdG9rZW4gZm91bmQgaW4gcmVzcG9uc2UiKSxudWxsO2lmKCF0LmV4cGlyZXNfaW4pcmV0dXJuIHRoaXMubG9nZ2VyLmVycm9yKCJUb2tlbkNhY2hlIC0gbm8gZXhwaXJhdGlvbiBzZXQgb24gdGhlIGFjY2VzcyB0b2tlbi4gQ2Fubm90IGFkZCBpdCB0byB0aGUgY2FjaGUuIiksbnVsbDtpZighKHQuc2NvcGV8fGUuc2NvcGVzJiZlLnNjb3Blcy5sZW5ndGgpKXJldHVybiB0aGlzLmxvZ2dlci5lcnJvcigiVG9rZW5DYWNoZSAtIHNjb3BlcyBub3Qgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlLiBDYW5ub3QgYWRkIHRva2VuIHRvIHRoZSBjYWNoZS4iKSxudWxsO3RoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBsb2FkaW5nIGFjY2VzcyB0b2tlbiIpO2NvbnN0IGM9dC5zY29wZT9YdC5mcm9tU3RyaW5nKHQuc2NvcGUpOm5ldyBYdChlLnNjb3BlcyksbD1pLmV4cGlyZXNPbnx8dC5leHBpcmVzX2luK0RuKCksaD1pLmV4dGVuZGVkRXhwaXJlc09ufHwodC5leHRfZXhwaXJlc19pbnx8dC5leHBpcmVzX2luKStEbigpLGQ9R24ocixuLHQuYWNjZXNzX3Rva2VuLHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsbyxjLnByaW50U2NvcGVzKCksbCxoLEtzKTtyZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLnNldEFjY2Vzc1Rva2VuQ3JlZGVudGlhbChkLHMsYSksZH1hc3luYyBsb2FkUmVmcmVzaFRva2VuKGUsdCxyLG4sbyl7aWYoIWUucmVmcmVzaF90b2tlbilyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiVG9rZW5DYWNoZSAtIG5vIHJlZnJlc2ggdG9rZW4gZm91bmQgaW4gcmVzcG9uc2UiKSxudWxsO3RoaXMubG9nZ2VyLnZlcmJvc2UoIlRva2VuQ2FjaGUgLSBsb2FkaW5nIHJlZnJlc2ggdG9rZW4iKTtjb25zdCBpPSRuKHQscixlLnJlZnJlc2hfdG9rZW4sdGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxlLmZvY2ksdm9pZCAwLGUucmVmcmVzaF90b2tlbl9leHBpcmVzX2luKTtyZXR1cm4gYXdhaXQgdGhpcy5zdG9yYWdlLnNldFJlZnJlc2hUb2tlbkNyZWRlbnRpYWwoaSxuLG8pLGl9Z2VuZXJhdGVBdXRoZW50aWNhdGlvblJlc3VsdChlLHQscixuKXtsZXQgbyxpPSIiLHM9W10sYT1udWxsO3Q/LmFjY2Vzc1Rva2VuJiYoaT10LmFjY2Vzc1Rva2VuLnNlY3JldCxzPVh0LmZyb21TdHJpbmcodC5hY2Nlc3NUb2tlbi50YXJnZXQpLmFzQXJyYXkoKSxhPXhuKHQuYWNjZXNzVG9rZW4uZXhwaXJlc09uKSxvPXhuKHQuYWNjZXNzVG9rZW4uZXh0ZW5kZWRFeHBpcmVzT24pKTtjb25zdCBjPXQuYWNjb3VudDtyZXR1cm57YXV0aG9yaXR5Om4/bi5jYW5vbmljYWxBdXRob3JpdHk6IiIsdW5pcXVlSWQ6dC5hY2NvdW50LmxvY2FsQWNjb3VudElkLHRlbmFudElkOnQuYWNjb3VudC5yZWFsbSxzY29wZXM6cyxhY2NvdW50OmhyLmdldEFjY291bnRJbmZvKGMpLGlkVG9rZW46dC5pZFRva2VuPy5zZWNyZXR8fCIiLGlkVG9rZW5DbGFpbXM6cnx8e30sYWNjZXNzVG9rZW46aSxmcm9tQ2FjaGU6ITAsZXhwaXJlc09uOmEsY29ycmVsYXRpb25JZDplLmNvcnJlbGF0aW9uSWR8fCIiLHJlcXVlc3RJZDoiIixleHRFeHBpcmVzT246byxmYW1pbHlJZDp0LnJlZnJlc2hUb2tlbj8uZmFtaWx5SWR8fCIiLHRva2VuVHlwZTp0Py5hY2Nlc3NUb2tlbj8udG9rZW5UeXBlfHwiIixzdGF0ZTplLnN0YXRlfHwiIixjbG91ZEdyYXBoSG9zdE5hbWU6Yy5jbG91ZEdyYXBoSG9zdE5hbWV8fCIiLG1zR3JhcGhIb3N0OmMubXNHcmFwaEhvc3R8fCIiLGZyb21OYXRpdmVCcm9rZXI6ITF9fX1jbGFzcyBNbCBleHRlbmRzIHFve2NvbnN0cnVjdG9yKGUpe3N1cGVyKGUpLHRoaXMuaW5jbHVkZVJlZGlyZWN0VXJpPSExfX1jbGFzcyBPbCBleHRlbmRzIFFje2NvbnN0cnVjdG9yKGUsdCxyLG4sbyxpLHMsYSxjLGwpe3N1cGVyKGUsdCxyLG4sbyxpLGEsYyxsKSx0aGlzLmFwaUlkPXN9YXN5bmMgYWNxdWlyZVRva2VuKHQpe2lmKCF0LmNvZGUpdGhyb3cgWmkoT2kpO2NvbnN0IHI9YXdhaXQgVW4odGhpcy5pbml0aWFsaXplQXV0aG9yaXphdGlvblJlcXVlc3QuYmluZCh0aGlzKSxPci5TdGFuZGFyZEludGVyYWN0aW9uQ2xpZW50SW5pdGlhbGl6ZUF1dGhvcml6YXRpb25SZXF1ZXN0LHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKSh0LGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCksbj10aGlzLmluaXRpYWxpemVTZXJ2ZXJUZWxlbWV0cnlNYW5hZ2VyKHRoaXMuYXBpSWQpO3RyeXtjb25zdCBlPXsuLi5yLGNvZGU6dC5jb2RlfSxvPWF3YWl0IFVuKHRoaXMuZ2V0Q2xpZW50Q29uZmlndXJhdGlvbi5iaW5kKHRoaXMpLE9yLlN0YW5kYXJkSW50ZXJhY3Rpb25DbGllbnRHZXRDbGllbnRDb25maWd1cmF0aW9uLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdC5jb3JyZWxhdGlvbklkKSh7c2VydmVyVGVsZW1ldHJ5TWFuYWdlcjpuLHJlcXVlc3RBdXRob3JpdHk6ci5hdXRob3JpdHkscmVxdWVzdEF6dXJlQ2xvdWRPcHRpb25zOnIuYXp1cmVDbG91ZE9wdGlvbnMscmVxdWVzdEV4dHJhUXVlcnlQYXJhbWV0ZXJzOnIuZXh0cmFRdWVyeVBhcmFtZXRlcnMsYWNjb3VudDpyLmFjY291bnR9KSxpPW5ldyBNbChvKTt0aGlzLmxvZ2dlci52ZXJib3NlKCJBdXRoIGNvZGUgY2xpZW50IGNyZWF0ZWQiKTtjb25zdCBzPW5ldyBWYyhpLHRoaXMuYnJvd3NlclN0b3JhZ2UsZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTtyZXR1cm4gYXdhaXQgVW4ocy5oYW5kbGVDb2RlUmVzcG9uc2VGcm9tU2VydmVyLmJpbmQocyksT3IuSGFuZGxlQ29kZVJlc3BvbnNlRnJvbVNlcnZlcix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkoe2NvZGU6dC5jb2RlLG1zZ3JhcGhfaG9zdDp0Lm1zR3JhcGhIb3N0LGNsb3VkX2dyYXBoX2hvc3RfbmFtZTp0LmNsb3VkR3JhcGhIb3N0TmFtZSxjbG91ZF9pbnN0YW5jZV9ob3N0X25hbWU6dC5jbG91ZEluc3RhbmNlSG9zdE5hbWV9LHIsITEpfWNhdGNoKGUpe3Rocm93IGUgaW5zdGFuY2VvZiBDZSYmKGUuc2V0Q29ycmVsYXRpb25JZCh0aGlzLmNvcnJlbGF0aW9uSWQpLG4uY2FjaGVGYWlsZWRSZXF1ZXN0KGUpKSxlfX1sb2dvdXQoKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoWmkoeWkpKX19ZnVuY3Rpb24gcWwoZSx0LHIpe3RyeXtxYShlKX1jYXRjaChlKXt0aHJvdyB0LmVuZCh7c3VjY2VzczohMX0sZSxyKSxlfX1jbGFzcyBObHtjb25zdHJ1Y3RvcihlKXt0aGlzLm9wZXJhdGluZ0NvbnRleHQ9ZSx0aGlzLmlzQnJvd3NlckVudmlyb25tZW50PXRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpLHRoaXMuY29uZmlnPWUuZ2V0Q29uZmlnKCksdGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLmxvZ2dlcj10aGlzLm9wZXJhdGluZ0NvbnRleHQuZ2V0TG9nZ2VyKCksdGhpcy5uZXR3b3JrQ2xpZW50PXRoaXMuY29uZmlnLnN5c3RlbS5uZXR3b3JrQ2xpZW50LHRoaXMubmF2aWdhdGlvbkNsaWVudD10aGlzLmNvbmZpZy5zeXN0ZW0ubmF2aWdhdGlvbkNsaWVudCx0aGlzLnJlZGlyZWN0UmVzcG9uc2U9bmV3IE1hcCx0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzPW5ldyBNYXAsdGhpcy5wZXJmb3JtYW5jZUNsaWVudD10aGlzLmNvbmZpZy50ZWxlbWV0cnkuY2xpZW50LHRoaXMuYnJvd3NlckNyeXB0bz10aGlzLmlzQnJvd3NlckVudmlyb25tZW50P25ldyB5Yyh0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50KTpmdCx0aGlzLmV2ZW50SGFuZGxlcj1uZXcgRmModGhpcy5sb2dnZXIpLHRoaXMuYnJvd3NlclN0b3JhZ2U9dGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudD9uZXcgTWModGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCx0aGlzLmNvbmZpZy5jYWNoZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmV2ZW50SGFuZGxlcix0byh0aGlzLmNvbmZpZy5hdXRoKSk6cWModGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyKTtjb25zdCB0PXtjYWNoZUxvY2F0aW9uOkNzLk1lbW9yeVN0b3JhZ2UsY2FjaGVSZXRlbnRpb25EYXlzOjUsdGVtcG9yYXJ5Q2FjaGVMb2NhdGlvbjpDcy5NZW1vcnlTdG9yYWdlLHN0b3JlQXV0aFN0YXRlSW5Db29raWU6ITEsc2VjdXJlQ29va2llczohMSxjYWNoZU1pZ3JhdGlvbkVuYWJsZWQ6ITEsY2xhaW1zQmFzZWRDYWNoaW5nRW5hYmxlZDohMX07dGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2U9bmV3IE1jKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsdCx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLmV2ZW50SGFuZGxlciksdGhpcy50b2tlbkNhY2hlPW5ldyBQbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlckNyeXB0byksdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzPW5ldyBNYXAsdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5PXRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eS5iaW5kKHRoaXMpLHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudD10aGlzLnRyYWNrUGFnZVZpc2liaWxpdHlXaXRoTWVhc3VyZW1lbnQuYmluZCh0aGlzKX1zdGF0aWMgYXN5bmMgY3JlYXRlQ29udHJvbGxlcihlLHQpe2NvbnN0IHI9bmV3IE5sKGUpO3JldHVybiBhd2FpdCByLmluaXRpYWxpemUodCkscn10cmFja1BhZ2VWaXNpYmlsaXR5KGUpe2UmJih0aGlzLmxvZ2dlci5pbmZvKCJQZXJmOiBWaXNpYmlsaXR5IGNoYW5nZSBkZXRlY3RlZCIpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuaW5jcmVtZW50RmllbGRzKHt2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6MX0sZSkpfWFzeW5jIGluaXRpYWxpemUoZSx0KXtpZih0aGlzLmxvZ2dlci50cmFjZSgiaW5pdGlhbGl6ZSBjYWxsZWQiKSx0aGlzLmluaXRpYWxpemVkKXJldHVybiB2b2lkIHRoaXMubG9nZ2VyLmluZm8oImluaXRpYWxpemUgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQsIGV4aXRpbmcgZWFybHkuIik7aWYoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oImluIG5vbi1icm93c2VyIGVudmlyb25tZW50LCBleGl0aW5nIGVhcmx5LiIpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsdm9pZCB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuSU5JVElBTElaRV9FTkQpO2NvbnN0IHI9ZT8uY29ycmVsYXRpb25JZHx8dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpLG49dGhpcy5jb25maWcuc3lzdGVtLmFsbG93UGxhdGZvcm1Ccm9rZXIsbz10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuSW5pdGlhbGl6ZUNsaWVudEFwcGxpY2F0aW9uLHIpO2lmKHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5JTklUSUFMSVpFX1NUQVJUKSwhdCl0cnl7dGhpcy5sb2dNdWx0aXBsZUluc3RhbmNlcyhvKX1jYXRjaHt9aWYoYXdhaXQgVW4odGhpcy5icm93c2VyU3RvcmFnZS5pbml0aWFsaXplLmJpbmQodGhpcy5icm93c2VyU3RvcmFnZSksT3IuSW5pdGlhbGl6ZUNhY2hlLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQscikociksbil0cnl7dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj1hd2FpdCBmbCh0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIsdGhpcy5jb25maWcuc3lzdGVtLm5hdGl2ZUJyb2tlckhhbmRzaGFrZVRpbWVvdXQsdGhpcy5jb25maWcuc3lzdGVtLmFsbG93UGxhdGZvcm1Ccm9rZXJXaXRoRE9NKX1jYXRjaChlKXt0aGlzLmxvZ2dlci52ZXJib3NlKGUpfXRoaXMuY29uZmlnLmNhY2hlLmNsYWltc0Jhc2VkQ2FjaGluZ0VuYWJsZWR8fCh0aGlzLmxvZ2dlci52ZXJib3NlKCJDbGFpbXMtYmFzZWQgY2FjaGluZyBpcyBkaXNhYmxlZC4gQ2xlYXJpbmcgdGhlIHByZXZpb3VzIGNhY2hlIHdpdGggY2xhaW1zIiksTm4odGhpcy5icm93c2VyU3RvcmFnZS5jbGVhclRva2Vuc0FuZEtleXNXaXRoQ2xhaW1zLmJpbmQodGhpcy5icm93c2VyU3RvcmFnZSksT3IuQ2xlYXJUb2tlbnNBbmRLZXlzV2l0aENsYWltcyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHIpKHIpKSx0aGlzLmNvbmZpZy5zeXN0ZW0uYXN5bmNQb3B1cHMmJmF3YWl0IHRoaXMucHJlR2VuZXJhdGVQa2NlQ29kZXMociksdGhpcy5pbml0aWFsaXplZD0hMCx0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuSU5JVElBTElaRV9FTkQpLG8uZW5kKHthbGxvd1BsYXRmb3JtQnJva2VyOm4sc3VjY2VzczohMH0pfWFzeW5jIGhhbmRsZVJlZGlyZWN0UHJvbWlzZShlKXtpZih0aGlzLmxvZ2dlci52ZXJib3NlKCJoYW5kbGVSZWRpcmVjdFByb21pc2UgY2FsbGVkIiksT2EodGhpcy5pbml0aWFsaXplZCksdGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudCl7Y29uc3QgdD1lfHwiIjtsZXQgcj10aGlzLnJlZGlyZWN0UmVzcG9uc2UuZ2V0KHQpO3JldHVybiB2b2lkIDA9PT1yPyhyPXRoaXMuaGFuZGxlUmVkaXJlY3RQcm9taXNlSW50ZXJuYWwoZSksdGhpcy5yZWRpcmVjdFJlc3BvbnNlLnNldCh0LHIpLHRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBoYXMgYmVlbiBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBzdG9yaW5nIHRoZSBwcm9taXNlIikpOnRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBoYXMgYmVlbiBjYWxsZWQgcHJldmlvdXNseSwgcmV0dXJuaW5nIHRoZSByZXN1bHQgZnJvbSB0aGUgZmlyc3QgY2FsbCIpLHJ9cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSByZXR1cm5zIG51bGwsIG5vdCBicm93c2VyIGVudmlyb25tZW50IiksbnVsbH1hc3luYyBoYW5kbGVSZWRpcmVjdFByb21pc2VJbnRlcm5hbCh0KXtpZighdGhpcy5icm93c2VyU3RvcmFnZS5pc0ludGVyYWN0aW9uSW5Qcm9ncmVzcyghMCkpcmV0dXJuIHRoaXMubG9nZ2VyLmluZm8oImhhbmRsZVJlZGlyZWN0UHJvbWlzZSBjYWxsZWQgYnV0IHRoZXJlIGlzIG5vIGludGVyYWN0aW9uIGluIHByb2dyZXNzLCByZXR1cm5pbmcgbnVsbC4iKSxudWxsO2NvbnN0IHI9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoKT8udHlwZTtpZihyPT09VHMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSByZW1vdmluZyBpbnRlcmFjdGlvbl9pbl9wcm9ncmVzcyBmbGFnIGFuZCByZXR1cm5pbmcgbnVsbCBhZnRlciBzaWduLW91dCIpLHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCExKSxQcm9taXNlLnJlc29sdmUobnVsbCk7Y29uc3Qgbj10aGlzLmdldEFsbEFjY291bnRzKCksbz10aGlzLmJyb3dzZXJTdG9yYWdlLmdldENhY2hlZE5hdGl2ZVJlcXVlc3QoKSxpPW8mJnRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXImJiF0O2xldCBzLGE7dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkhBTkRMRV9SRURJUkVDVF9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCk7dHJ5e2lmKGkmJnRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpe3M9dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblJlZGlyZWN0LG8/LmNvcnJlbGF0aW9uSWR8fCIiKSx0aGlzLmxvZ2dlci50cmFjZSgiaGFuZGxlUmVkaXJlY3RQcm9taXNlIC0gYWNxdWlyaW5nIHRva2VuIGZyb20gbmF0aXZlIHBsYXRmb3JtIikscy5hZGQoe2lzUGxhdGZvcm1Ccm9rZXJSZXF1ZXN0OiEwfSk7Y29uc3QgZT1uZXcgcmwodGhpcy5jb25maWcsdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LE1zLmhhbmRsZVJlZGlyZWN0UHJvbWlzZSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsby5hY2NvdW50SWQsdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2Usby5jb3JyZWxhdGlvbklkKTthPVVuKGUuaGFuZGxlUmVkaXJlY3RQcm9taXNlLmJpbmQoZSksT3IuSGFuZGxlTmF0aXZlUmVkaXJlY3RQcm9taXNlTWVhc3VyZW1lbnQsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxzLmV2ZW50LmNvcnJlbGF0aW9uSWQpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQscy5ldmVudC5jb3JyZWxhdGlvbklkKX1lbHNle2NvbnN0W2Uscl09dGhpcy5icm93c2VyU3RvcmFnZS5nZXRDYWNoZWRSZXF1ZXN0KCksbj1lLmNvcnJlbGF0aW9uSWQ7cz10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuUmVkaXJlY3QsbiksdGhpcy5sb2dnZXIudHJhY2UoImhhbmRsZVJlZGlyZWN0UHJvbWlzZSAtIGFjcXVpcmluZyB0b2tlbiBmcm9tIHdlYiBmbG93Iik7Y29uc3Qgbz10aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KG4pO2E9VW4oby5oYW5kbGVSZWRpcmVjdFByb21pc2UuYmluZChvKSxPci5IYW5kbGVSZWRpcmVjdFByb21pc2VNZWFzdXJlbWVudCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHMuZXZlbnQuY29ycmVsYXRpb25JZCkodCxlLHIscyl9fWNhdGNoKGUpe3Rocm93IHRoaXMuYnJvd3NlclN0b3JhZ2UucmVzZXRSZXF1ZXN0Q2FjaGUoKSxlfXJldHVybiBhLnRoZW4oKHQ9PntpZih0KXt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCk7bi5sZW5ndGg8dGhpcy5nZXRBbGxBY2NvdW50cygpLmxlbmd0aD8odGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR0lOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCksdGhpcy5sb2dnZXIudmVyYm9zZSgiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSByZXR1cm5lZCByZXN1bHQsIGxvZ2luIHN1Y2Nlc3MiKSk6KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCksdGhpcy5sb2dnZXIudmVyYm9zZSgiaGFuZGxlUmVkaXJlY3RSZXNwb25zZSByZXR1cm5lZCByZXN1bHQsIGFjcXVpcmUgdG9rZW4gc3VjY2VzcyIpKSxzLmVuZCh7c3VjY2VzczohMH0sdm9pZCAwLHQuYWNjb3VudCl9ZWxzZSBzLmV2ZW50LmVycm9yQ29kZT9zLmVuZCh7c3VjY2VzczohMX0sdm9pZCAwKTpzLmRpc2NhcmQoKTtyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkhBTkRMRV9SRURJUkVDVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpLHR9KSkuY2F0Y2goKHQ9Pnt0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCk7Y29uc3Qgcj10O3Rocm93IG4ubGVuZ3RoPjA/dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCxudWxsLHIpOnRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dJTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LG51bGwsciksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkhBTkRMRV9SRURJUkVDVF9FTkQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QpLHMuZW5kKHtzdWNjZXNzOiExfSxyKSx0fSkpfWFzeW5jIGFjcXVpcmVUb2tlblJlZGlyZWN0KHQpe2NvbnN0IHI9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCh0KTt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5SZWRpcmVjdCBjYWxsZWQiLHIpO2NvbnN0IG49dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblByZVJlZGlyZWN0LHIpO24uYWRkKHtzY2VuYXJpb0lkOnQuc2NlbmFyaW9JZH0pO2NvbnN0IG89dC5vblJlZGlyZWN0TmF2aWdhdGU7aWYobyl0Lm9uUmVkaXJlY3ROYXZpZ2F0ZT1lPT57Y29uc3Qgcj0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vKGUpOnZvaWQgMDtyZXR1cm4gbi5hZGQoe25hdmlnYXRlQ2FsbGJhY2tSZXN1bHQ6ITEhPT1yfSksbi5ldmVudD1uLmVuZCh7c3VjY2VzczohMH0sdm9pZCAwLHQuYWNjb3VudCl8fG4uZXZlbnQscn07ZWxzZXtjb25zdCBlPXRoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlO3RoaXMuY29uZmlnLmF1dGgub25SZWRpcmVjdE5hdmlnYXRlPXI9Pntjb25zdCBvPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2Uocik6dm9pZCAwO3JldHVybiBuLmFkZCh7bmF2aWdhdGVDYWxsYmFja1Jlc3VsdDohMSE9PW99KSxuLmV2ZW50PW4uZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsdC5hY2NvdW50KXx8bi5ldmVudCxvfX1jb25zdCBpPXRoaXMuZ2V0QWxsQWNjb3VudHMoKS5sZW5ndGg+MDt0cnl7bGV0IG87aWYoTmEodGhpcy5pbml0aWFsaXplZCx0aGlzLmNvbmZpZyksdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITAsSXMpLGk/dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuUmVkaXJlY3QsdCk6dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkxPR0lOX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LHQpLHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXImJnRoaXMuY2FuVXNlUGxhdGZvcm1Ccm9rZXIodCkpe289bmV3IHJsKHRoaXMuY29uZmlnLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubmF2aWdhdGlvbkNsaWVudCxNcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsdGhpcy5nZXROYXRpdmVBY2NvdW50SWQodCksdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UscikuYWNxdWlyZVRva2VuUmVkaXJlY3QodCxuKS5jYXRjaCgoZT0+e2lmKG4uYWRkKHticm9rZXJFcnJvck5hbWU6ZS5uYW1lLGJyb2tlckVycm9yQ29kZTplLmVycm9yQ29kZX0pLGUgaW5zdGFuY2VvZiBYYyYmWmMoZSkpe3RoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXI9dm9pZCAwO3JldHVybiB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KHIpLmFjcXVpcmVUb2tlbih0KX1pZihlIGluc3RhbmNlb2YgQW8pe3RoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblJlZGlyZWN0IC0gUmVzb2x2aW5nIGludGVyYWN0aW9uIHJlcXVpcmVkIGVycm9yIHRocm93biBieSBuYXRpdmUgYnJva2VyIGJ5IGZhbGxpbmcgYmFjayB0byB3ZWIgZmxvdyIpO3JldHVybiB0aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KHIpLmFjcXVpcmVUb2tlbih0KX10aHJvdyBlfSkpfWVsc2V7bz10aGlzLmNyZWF0ZVJlZGlyZWN0Q2xpZW50KHIpLmFjcXVpcmVUb2tlbih0KX1yZXR1cm4gYXdhaXQgb31jYXRjaChvKXt0aHJvdyB0aGlzLmJyb3dzZXJTdG9yYWdlLnJlc2V0UmVxdWVzdENhY2hlKCksMj09PW4uZXZlbnQuc3RhdHVzP3RoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5BY3F1aXJlVG9rZW5SZWRpcmVjdCxyKS5lbmQoe3N1Y2Nlc3M6ITF9LG8sdC5hY2NvdW50KTpuLmVuZCh7c3VjY2VzczohMX0sbyx0LmFjY291bnQpLGk/dGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5SZWRpcmVjdCxudWxsLG8pOnRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dJTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0LG51bGwsbyksb319YWNxdWlyZVRva2VuUG9wdXAodCl7Y29uc3Qgcj10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKHQpLG49dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblBvcHVwLHIpO24uYWRkKHtzY2VuYXJpb0lkOnQuc2NlbmFyaW9JZH0pO3RyeXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5Qb3B1cCBjYWxsZWQiLHIpLHFsKHRoaXMuaW5pdGlhbGl6ZWQsbix0LmFjY291bnQpLHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCEwLElzKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9Y29uc3Qgbz10aGlzLmdldEFsbEFjY291bnRzKCk7bGV0IGk7by5sZW5ndGg+MD90aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCx0KTp0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuTE9HSU5fU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsdCk7Y29uc3Qgcz10aGlzLmdldFByZUdlbmVyYXRlZFBrY2VDb2RlcyhyKTtpZih0aGlzLmNhblVzZVBsYXRmb3JtQnJva2VyKHQpKW4uYWRkKHtpc1BsYXRmb3JtQnJva2VyUmVxdWVzdDohMH0pLGk9dGhpcy5hY3F1aXJlVG9rZW5OYXRpdmUoey4uLnQsY29ycmVsYXRpb25JZDpyfSxNcy5hY3F1aXJlVG9rZW5Qb3B1cCkudGhlbigoZT0+KG4uZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsZS5hY2NvdW50KSxlKSkpLmNhdGNoKChlPT57aWYobi5hZGQoe2Jyb2tlckVycm9yTmFtZTplLm5hbWUsYnJva2VyRXJyb3JDb2RlOmUuZXJyb3JDb2RlfSksZSBpbnN0YW5jZW9mIFhjJiZaYyhlKSl7dGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj12b2lkIDA7cmV0dXJuIHRoaXMuY3JlYXRlUG9wdXBDbGllbnQocikuYWNxdWlyZVRva2VuKHQscyl9aWYoZSBpbnN0YW5jZW9mIEFvKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5Qb3B1cCAtIFJlc29sdmluZyBpbnRlcmFjdGlvbiByZXF1aXJlZCBlcnJvciB0aHJvd24gYnkgbmF0aXZlIGJyb2tlciBieSBmYWxsaW5nIGJhY2sgdG8gd2ViIGZsb3ciKTtyZXR1cm4gdGhpcy5jcmVhdGVQb3B1cENsaWVudChyKS5hY3F1aXJlVG9rZW4odCxzKX10aHJvdyBlfSkpO2Vsc2V7aT10aGlzLmNyZWF0ZVBvcHVwQ2xpZW50KHIpLmFjcXVpcmVUb2tlbih0LHMpfXJldHVybiBpLnRoZW4oKHQ9PihvLmxlbmd0aDx0aGlzLmdldEFsbEFjY291bnRzKCkubGVuZ3RoP3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5MT0dJTl9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwLHQpOnRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsdCksbi5lbmQoe3N1Y2Nlc3M6ITAsYWNjZXNzVG9rZW5TaXplOnQuYWNjZXNzVG9rZW4ubGVuZ3RoLGlkVG9rZW5TaXplOnQuaWRUb2tlbi5sZW5ndGh9LHZvaWQgMCx0LmFjY291bnQpLHQpKSkuY2F0Y2goKHI9PihvLmxlbmd0aD4wP3RoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsbnVsbCxyKTp0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuTE9HSU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCxudWxsLHIpLG4uZW5kKHtzdWNjZXNzOiExfSxyLHQuYWNjb3VudCksUHJvbWlzZS5yZWplY3QocikpKSkuZmluYWxseSgoYXN5bmMoKT0+e3RoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCExKSx0aGlzLmNvbmZpZy5zeXN0ZW0uYXN5bmNQb3B1cHMmJmF3YWl0IHRoaXMucHJlR2VuZXJhdGVQa2NlQ29kZXMocil9KSl9dHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCgpe2NvbnN0IGU9dGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudHx8dGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luY01lYXN1cmVtZW50O2UmJih0aGlzLmxvZ2dlci5pbmZvKCJQZXJmOiBWaXNpYmlsaXR5IGNoYW5nZSBkZXRlY3RlZCBpbiAiLGUuZXZlbnQubmFtZSksZS5pbmNyZW1lbnQoe3Zpc2liaWxpdHlDaGFuZ2VDb3VudDoxfSkpfWFzeW5jIHNzb1NpbGVudCh0KXtjb25zdCByPXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQodCksbj17Li4udCxwcm9tcHQ6dC5wcm9tcHQsY29ycmVsYXRpb25JZDpyfTtsZXQgbztpZih0aGlzLnNzb1NpbGVudE1lYXN1cmVtZW50PXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5Tc29TaWxlbnQsciksdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudD8uYWRkKHtzY2VuYXJpb0lkOnQuc2NlbmFyaW9JZH0pLHFsKHRoaXMuaW5pdGlhbGl6ZWQsdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudCx0LmFjY291bnQpLHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmluY3JlbWVudCh7dmlzaWJpbGl0eUNoYW5nZUNvdW50OjB9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLnRyYWNrUGFnZVZpc2liaWxpdHlXaXRoTWVhc3VyZW1lbnQpLHRoaXMubG9nZ2VyLnZlcmJvc2UoInNzb1NpbGVudCBjYWxsZWQiLHIpLHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5TU09fU0lMRU5UX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxuKSx0aGlzLmNhblVzZVBsYXRmb3JtQnJva2VyKG4pKXRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmFkZCh7aXNQbGF0Zm9ybUJyb2tlclJlcXVlc3Q6ITB9KSxvPXRoaXMuYWNxdWlyZVRva2VuTmF0aXZlKG4sTXMuc3NvU2lsZW50KS5jYXRjaCgoZT0+e2lmKHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmFkZCh7YnJva2VyRXJyb3JOYW1lOmUubmFtZSxicm9rZXJFcnJvckNvZGU6ZS5lcnJvckNvZGV9KSxlIGluc3RhbmNlb2YgWGMmJlpjKGUpKXt0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyPXZvaWQgMDtyZXR1cm4gdGhpcy5jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQobi5jb3JyZWxhdGlvbklkKS5hY3F1aXJlVG9rZW4obil9dGhyb3cgZX0pKTtlbHNle289dGhpcy5jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQobi5jb3JyZWxhdGlvbklkKS5hY3F1aXJlVG9rZW4obil9cmV0dXJuIG8udGhlbigodD0+KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5TU09fU0lMRU5UX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LHQpLHRoaXMuc3NvU2lsZW50TWVhc3VyZW1lbnQ/LmVuZCh7c3VjY2VzczohMCxhY2Nlc3NUb2tlblNpemU6dC5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6dC5pZFRva2VuLmxlbmd0aH0sdm9pZCAwLHQuYWNjb3VudCksdCkpKS5jYXRjaCgocj0+e3Rocm93IHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5TU09fU0lMRU5UX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG51bGwsciksdGhpcy5zc29TaWxlbnRNZWFzdXJlbWVudD8uZW5kKHtzdWNjZXNzOiExfSxyLHQuYWNjb3VudCkscn0pKS5maW5hbGx5KCgoKT0+e2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLHRoaXMudHJhY2tQYWdlVmlzaWJpbGl0eVdpdGhNZWFzdXJlbWVudCl9KSl9YXN5bmMgYWNxdWlyZVRva2VuQnlDb2RlKHQpe2NvbnN0IHI9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCh0KTt0aGlzLmxvZ2dlci50cmFjZSgiYWNxdWlyZVRva2VuQnlDb2RlIGNhbGxlZCIscik7Y29uc3Qgbj10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuQnlDb2RlLHIpO3FsKHRoaXMuaW5pdGlhbGl6ZWQsbiksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fQllfQ09ERV9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQsdCksbi5hZGQoe3NjZW5hcmlvSWQ6dC5zY2VuYXJpb0lkfSk7dHJ5e2lmKHQuY29kZSYmdC5uYXRpdmVBY2NvdW50SWQpdGhyb3cgWmkoTmkpO2lmKHQuY29kZSl7Y29uc3Qgbz10LmNvZGU7bGV0IGk9dGhpcy5oeWJyaWRBdXRoQ29kZVJlc3BvbnNlcy5nZXQobyk7cmV0dXJuIGk/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIkV4aXN0aW5nIGFjcXVpcmVUb2tlbkJ5Q29kZSByZXF1ZXN0IGZvdW5kIixyKSxuLmRpc2NhcmQoKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoIkluaXRpYXRpbmcgbmV3IGFjcXVpcmVUb2tlbkJ5Q29kZSByZXF1ZXN0IixyKSxpPXRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmMoey4uLnQsY29ycmVsYXRpb25JZDpyfSkudGhlbigodD0+KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX0JZX0NPREVfU1VDQ0VTUyxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQsdCksdGhpcy5oeWJyaWRBdXRoQ29kZVJlc3BvbnNlcy5kZWxldGUobyksbi5lbmQoe3N1Y2Nlc3M6ITAsYWNjZXNzVG9rZW5TaXplOnQuYWNjZXNzVG9rZW4ubGVuZ3RoLGlkVG9rZW5TaXplOnQuaWRUb2tlbi5sZW5ndGh9LHZvaWQgMCx0LmFjY291bnQpLHQpKSkuY2F0Y2goKHQ9Pnt0aHJvdyB0aGlzLmh5YnJpZEF1dGhDb2RlUmVzcG9uc2VzLmRlbGV0ZShvKSx0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9CWV9DT0RFX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG51bGwsdCksbi5lbmQoe3N1Y2Nlc3M6ITF9LHQpLHR9KSksdGhpcy5oeWJyaWRBdXRoQ29kZVJlc3BvbnNlcy5zZXQobyxpKSksYXdhaXQgaX1pZih0Lm5hdGl2ZUFjY291bnRJZCl7aWYodGhpcy5jYW5Vc2VQbGF0Zm9ybUJyb2tlcih0LHQubmF0aXZlQWNjb3VudElkKSl7bi5hZGQoe2lzUGxhdGZvcm1Ccm9rZXJSZXF1ZXN0OiEwfSk7Y29uc3QgZT1hd2FpdCB0aGlzLmFjcXVpcmVUb2tlbk5hdGl2ZSh7Li4udCxjb3JyZWxhdGlvbklkOnJ9LE1zLmFjcXVpcmVUb2tlbkJ5Q29kZSx0Lm5hdGl2ZUFjY291bnRJZCkuY2F0Y2goKGU9Pnt0aHJvdyBlIGluc3RhbmNlb2YgWGMmJlpjKGUpJiYodGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcj12b2lkIDApLG4uYWRkKHticm9rZXJFcnJvck5hbWU6ZS5uYW1lLGJyb2tlckVycm9yQ29kZTplLmVycm9yQ29kZX0pLGV9KSk7cmV0dXJuIG4uZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsZS5hY2NvdW50KSxlfXRocm93IFppKExpKX10aHJvdyBaaShxaSl9Y2F0Y2godCl7dGhyb3cgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fQllfQ09ERV9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxudWxsLHQpLG4uZW5kKHtzdWNjZXNzOiExfSx0KSx0fX1hc3luYyBhY3F1aXJlVG9rZW5CeUNvZGVBc3luYyhlKXt0aGlzLmxvZ2dlci50cmFjZSgiYWNxdWlyZVRva2VuQnlDb2RlQXN5bmMgY2FsbGVkIixlLmNvcnJlbGF0aW9uSWQpLHRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmNNZWFzdXJlbWVudD10aGlzLnBlcmZvcm1hbmNlQ2xpZW50LnN0YXJ0TWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuQnlDb2RlQXN5bmMsZS5jb3JyZWxhdGlvbklkKSx0aGlzLmFjcXVpcmVUb2tlbkJ5Q29kZUFzeW5jTWVhc3VyZW1lbnQ/LmluY3JlbWVudCh7dmlzaWJpbGl0eUNoYW5nZUNvdW50OjB9KSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLnRyYWNrUGFnZVZpc2liaWxpdHlXaXRoTWVhc3VyZW1lbnQpO2NvbnN0IHQ9dGhpcy5jcmVhdGVTaWxlbnRBdXRoQ29kZUNsaWVudChlLmNvcnJlbGF0aW9uSWQpO3JldHVybiBhd2FpdCB0LmFjcXVpcmVUb2tlbihlKS50aGVuKChlPT4odGhpcy5hY3F1aXJlVG9rZW5CeUNvZGVBc3luY01lYXN1cmVtZW50Py5lbmQoe3N1Y2Nlc3M6ITAsZnJvbUNhY2hlOmUuZnJvbUNhY2hlfSksZSkpKS5jYXRjaCgoZT0+e3Rocm93IHRoaXMuYWNxdWlyZVRva2VuQnlDb2RlQXN5bmNNZWFzdXJlbWVudD8uZW5kKHtzdWNjZXNzOiExfSxlKSxlfSkpLmZpbmFsbHkoKCgpPT57ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5V2l0aE1lYXN1cmVtZW50KX0pKX1hc3luYyBhY3F1aXJlVG9rZW5Gcm9tQ2FjaGUoZSx0KXtzd2l0Y2godGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlbkZyb21DYWNoZSxlLmNvcnJlbGF0aW9uSWQpLHQpe2Nhc2UgRHMuRGVmYXVsdDpjYXNlIERzLkFjY2Vzc1Rva2VuOmNhc2UgRHMuQWNjZXNzVG9rZW5BbmRSZWZyZXNoVG9rZW46Y29uc3QgdD10aGlzLmNyZWF0ZVNpbGVudENhY2hlQ2xpZW50KGUuY29ycmVsYXRpb25JZCk7cmV0dXJuIFVuKHQuYWNxdWlyZVRva2VuLmJpbmQodCksT3IuU2lsZW50Q2FjaGVDbGllbnRBY3F1aXJlVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCxlLmNvcnJlbGF0aW9uSWQpKGUpO2RlZmF1bHQ6dGhyb3cgbXQoWGUpfX1hc3luYyBhY3F1aXJlVG9rZW5CeVJlZnJlc2hUb2tlbihlLHQpe3N3aXRjaCh0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFF1ZXVlTWVhc3VyZW1lbnQoT3IuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sZS5jb3JyZWxhdGlvbklkKSx0KXtjYXNlIERzLkRlZmF1bHQ6Y2FzZSBEcy5BY2Nlc3NUb2tlbkFuZFJlZnJlc2hUb2tlbjpjYXNlIERzLlJlZnJlc2hUb2tlbjpjYXNlIERzLlJlZnJlc2hUb2tlbkFuZE5ldHdvcms6Y29uc3QgdD10aGlzLmNyZWF0ZVNpbGVudFJlZnJlc2hDbGllbnQoZS5jb3JyZWxhdGlvbklkKTtyZXR1cm4gVW4odC5hY3F1aXJlVG9rZW4uYmluZCh0KSxPci5TaWxlbnRSZWZyZXNoQ2xpZW50QWNxdWlyZVRva2VuLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsZS5jb3JyZWxhdGlvbklkKShlKTtkZWZhdWx0OnRocm93IG10KFhlKX19YXN5bmMgYWNxdWlyZVRva2VuQnlTaWxlbnRJZnJhbWUoZSl7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLGUuY29ycmVsYXRpb25JZCk7Y29uc3QgdD10aGlzLmNyZWF0ZVNpbGVudElmcmFtZUNsaWVudChlLmNvcnJlbGF0aW9uSWQpO3JldHVybiBVbih0LmFjcXVpcmVUb2tlbi5iaW5kKHQpLE9yLlNpbGVudElmcmFtZUNsaWVudEFjcXVpcmVUb2tlbix0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUuY29ycmVsYXRpb25JZCkoZSl9YXN5bmMgbG9nb3V0KGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChlKTtyZXR1cm4gdGhpcy5sb2dnZXIud2FybmluZygibG9nb3V0IEFQSSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gbXNhbC1icm93c2VyIHYzLjAuMC4gVXNlIGxvZ291dFJlZGlyZWN0IGluc3RlYWQuIix0KSx0aGlzLmxvZ291dFJlZGlyZWN0KHtjb3JyZWxhdGlvbklkOnQsLi4uZX0pfWFzeW5jIGxvZ291dFJlZGlyZWN0KGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChlKTtOYSh0aGlzLmluaXRpYWxpemVkLHRoaXMuY29uZmlnKSx0aGlzLmJyb3dzZXJTdG9yYWdlLnNldEludGVyYWN0aW9uSW5Qcm9ncmVzcyghMCxUcyk7cmV0dXJuIHRoaXMuY3JlYXRlUmVkaXJlY3RDbGllbnQodCkubG9nb3V0KGUpfWxvZ291dFBvcHVwKGUpe3RyeXtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoZSk7cWEodGhpcy5pbml0aWFsaXplZCksdGhpcy5icm93c2VyU3RvcmFnZS5zZXRJbnRlcmFjdGlvbkluUHJvZ3Jlc3MoITAsVHMpO3JldHVybiB0aGlzLmNyZWF0ZVBvcHVwQ2xpZW50KHQpLmxvZ291dChlKS5maW5hbGx5KCgoKT0+e3RoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0SW50ZXJhY3Rpb25JblByb2dyZXNzKCExKX0pKX1jYXRjaChlKXtyZXR1cm4gUHJvbWlzZS5yZWplY3QoZSl9fWFzeW5jIGNsZWFyQ2FjaGUoZSl7aWYoIXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIuaW5mbygiaW4gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQsIHJldHVybmluZyBlYXJseS4iKTtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoZSk7cmV0dXJuIHRoaXMuY3JlYXRlU2lsZW50Q2FjaGVDbGllbnQodCkubG9nb3V0KGUpfWdldEFsbEFjY291bnRzKGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBOYyh0aGlzLmxvZ2dlcix0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQsdCxlKX1nZXRBY2NvdW50KGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBVYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWNjb3VudEJ5VXNlcm5hbWUoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKCk7cmV0dXJuIExjKGUsdGhpcy5sb2dnZXIsdGhpcy5icm93c2VyU3RvcmFnZSx0KX1nZXRBY2NvdW50QnlIb21lSWQoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKCk7cmV0dXJuIERjKGUsdGhpcy5sb2dnZXIsdGhpcy5icm93c2VyU3RvcmFnZSx0KX1nZXRBY2NvdW50QnlMb2NhbElkKGUpe2NvbnN0IHQ9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBIYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9c2V0QWN0aXZlQWNjb3VudChlKXtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoKTt4YyhlLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWN0aXZlQWNjb3VudCgpe2NvbnN0IGU9dGhpcy5nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZCgpO3JldHVybiBCYyh0aGlzLmJyb3dzZXJTdG9yYWdlLGUpfWFzeW5jIGh5ZHJhdGVDYWNoZShlLHQpe3RoaXMubG9nZ2VyLnZlcmJvc2UoImh5ZHJhdGVDYWNoZSBjYWxsZWQiKTtjb25zdCByPWhyLmNyZWF0ZUZyb21BY2NvdW50SW5mbyhlLmFjY291bnQsZS5jbG91ZEdyYXBoSG9zdE5hbWUsZS5tc0dyYXBoSG9zdCk7cmV0dXJuIGF3YWl0IHRoaXMuYnJvd3NlclN0b3JhZ2Uuc2V0QWNjb3VudChyLGUuY29ycmVsYXRpb25JZCx1cihlLmlkVG9rZW5DbGFpbXMpKSxlLmZyb21OYXRpdmVCcm9rZXI/KHRoaXMubG9nZ2VyLnZlcmJvc2UoIlJlc3BvbnNlIHdhcyBmcm9tIG5hdGl2ZSBicm9rZXIsIHN0b3JpbmcgaW4tbWVtb3J5IiksdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UuaHlkcmF0ZUNhY2hlKGUsdCkpOnRoaXMuYnJvd3NlclN0b3JhZ2UuaHlkcmF0ZUNhY2hlKGUsdCl9YXN5bmMgYWNxdWlyZVRva2VuTmF0aXZlKGUsdCxyLG4pe2lmKHRoaXMubG9nZ2VyLnRyYWNlKCJhY3F1aXJlVG9rZW5OYXRpdmUgY2FsbGVkIiksIXRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpdGhyb3cgWmkoeGkpO3JldHVybiBuZXcgcmwodGhpcy5jb25maWcsdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LHQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLHJ8fHRoaXMuZ2V0TmF0aXZlQWNjb3VudElkKGUpLHRoaXMubmF0aXZlSW50ZXJuYWxTdG9yYWdlLGUuY29ycmVsYXRpb25JZCkuYWNxdWlyZVRva2VuKGUsbil9Y2FuVXNlUGxhdGZvcm1Ccm9rZXIoZSx0KXtpZih0aGlzLmxvZ2dlci50cmFjZSgiY2FuVXNlUGxhdGZvcm1Ccm9rZXIgY2FsbGVkIiksIXRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIpcmV0dXJuIHRoaXMubG9nZ2VyLnRyYWNlKCJjYW5Vc2VQbGF0Zm9ybUJyb2tlcjogcGxhdGZvcm0gYnJva2VyIHVuYXZpbGFibGUsIHJldHVybmluZyBmYWxzZSIpLCExO2lmKCF5bCh0aGlzLmNvbmZpZyx0aGlzLmxvZ2dlcix0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLGUuYXV0aGVudGljYXRpb25TY2hlbWUpKXJldHVybiB0aGlzLmxvZ2dlci50cmFjZSgiY2FuVXNlUGxhdGZvcm1Ccm9rZXI6IGlzQnJva2VyQXZhaWxhYmxlIHJldHVybmVkIGZhbHNlLCByZXR1cm5pbmcgZmFsc2UiKSwhMTtpZihlLnByb21wdClzd2l0Y2goZS5wcm9tcHQpe2Nhc2UgYi5OT05FOmNhc2UgYi5DT05TRU5UOmNhc2UgYi5MT0dJTjpjYXNlIGIuU0VMRUNUX0FDQ09VTlQ6dGhpcy5sb2dnZXIudHJhY2UoImNhblVzZVBsYXRmb3JtQnJva2VyOiBwcm9tcHQgaXMgY29tcGF0aWJsZSB3aXRoIHBsYXRmb3JtIGJyb2tlciBmbG93Iik7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdGhpcy5sb2dnZXIudHJhY2UoYGNhblVzZVBsYXRmb3JtQnJva2VyOiBwcm9tcHQgPSAke2UucHJvbXB0fSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHBsYXRmb3JtIGJyb2tlciBmbG93LCByZXR1cm5pbmcgZmFsc2VgKSwhMX1yZXR1cm4hKCF0JiYhdGhpcy5nZXROYXRpdmVBY2NvdW50SWQoZSkpfHwodGhpcy5sb2dnZXIudHJhY2UoImNhblVzZVBsYXRmb3JtQnJva2VyOiBuYXRpdmVBY2NvdW50SWQgaXMgbm90IGF2YWlsYWJsZSwgcmV0dXJuaW5nIGZhbHNlIiksITEpfWdldE5hdGl2ZUFjY291bnRJZChlKXtjb25zdCB0PWUuYWNjb3VudHx8dGhpcy5nZXRBY2NvdW50KHtsb2dpbkhpbnQ6ZS5sb2dpbkhpbnQsc2lkOmUuc2lkfSl8fHRoaXMuZ2V0QWN0aXZlQWNjb3VudCgpO3JldHVybiB0JiZ0Lm5hdGl2ZUFjY291bnRJZHx8IiJ9Y3JlYXRlUG9wdXBDbGllbnQoZSl7cmV0dXJuIG5ldyBDbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLmV2ZW50SGFuZGxlcix0aGlzLm5hdmlnYXRpb25DbGllbnQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0aGlzLm5hdGl2ZUludGVybmFsU3RvcmFnZSx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLGUpfWNyZWF0ZVJlZGlyZWN0Q2xpZW50KGUpe3JldHVybiBuZXcgd2wodGhpcy5jb25maWcsdGhpcy5icm93c2VyU3RvcmFnZSx0aGlzLmJyb3dzZXJDcnlwdG8sdGhpcy5sb2dnZXIsdGhpcy5ldmVudEhhbmRsZXIsdGhpcy5uYXZpZ2F0aW9uQ2xpZW50LHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixlKX1jcmVhdGVTaWxlbnRJZnJhbWVDbGllbnQoZSl7cmV0dXJuIG5ldyBSbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLmV2ZW50SGFuZGxlcix0aGlzLm5hdmlnYXRpb25DbGllbnQsTXMuc3NvU2lsZW50LHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5uYXRpdmVJbnRlcm5hbFN0b3JhZ2UsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixlKX1jcmVhdGVTaWxlbnRDYWNoZUNsaWVudChlKXtyZXR1cm4gbmV3IHRsKHRoaXMuY29uZmlnLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubmF2aWdhdGlvbkNsaWVudCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsZSl9Y3JlYXRlU2lsZW50UmVmcmVzaENsaWVudChlKXtyZXR1cm4gbmV3IF9sKHRoaXMuY29uZmlnLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyLHRoaXMuZXZlbnRIYW5kbGVyLHRoaXMubmF2aWdhdGlvbkNsaWVudCx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMucGxhdGZvcm1BdXRoUHJvdmlkZXIsZSl9Y3JlYXRlU2lsZW50QXV0aENvZGVDbGllbnQoZSl7cmV0dXJuIG5ldyBPbCh0aGlzLmNvbmZpZyx0aGlzLmJyb3dzZXJTdG9yYWdlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLmV2ZW50SGFuZGxlcix0aGlzLm5hdmlnYXRpb25DbGllbnQsTXMuYWNxdWlyZVRva2VuQnlDb2RlLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5wbGF0Zm9ybUF1dGhQcm92aWRlcixlKX1hZGRFdmVudENhbGxiYWNrKGUsdCl7cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLmFkZEV2ZW50Q2FsbGJhY2soZSx0KX1yZW1vdmVFdmVudENhbGxiYWNrKGUpe3RoaXMuZXZlbnRIYW5kbGVyLnJlbW92ZUV2ZW50Q2FsbGJhY2soZSl9YWRkUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtyZXR1cm4gTWEoKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl9cmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb25maWcuY2FjaGUuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZT90aGlzLmV2ZW50SGFuZGxlci5zdWJzY3JpYmVDcm9zc1RhYigpOnRoaXMubG9nZ2VyLmluZm8oIkFjY291bnQgc3RvcmFnZSBldmVudHMgYXJlIG9ubHkgYXZhaWxhYmxlIHdoZW4gY2FjaGVMb2NhdGlvbiBpcyBzZXQgdG8gbG9jYWxTdG9yYWdlIil9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb25maWcuY2FjaGUuY2FjaGVMb2NhdGlvbj09PUNzLkxvY2FsU3RvcmFnZT90aGlzLmV2ZW50SGFuZGxlci51bnN1YnNjcmliZUNyb3NzVGFiKCk6dGhpcy5sb2dnZXIuaW5mbygiQWNjb3VudCBzdG9yYWdlIGV2ZW50cyBhcmUgb25seSBhdmFpbGFibGUgd2hlbiBjYWNoZUxvY2F0aW9uIGlzIHNldCB0byBsb2NhbFN0b3JhZ2UiKX1nZXRUb2tlbkNhY2hlKCl7cmV0dXJuIHRoaXMudG9rZW5DYWNoZX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5sb2dnZXJ9c2V0TG9nZ2VyKGUpe3RoaXMubG9nZ2VyPWV9aW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl7dGhpcy5icm93c2VyU3RvcmFnZS5zZXRXcmFwcGVyTWV0YWRhdGEoZSx0KX1zZXROYXZpZ2F0aW9uQ2xpZW50KGUpe3RoaXMubmF2aWdhdGlvbkNsaWVudD1lfWdldENvbmZpZ3VyYXRpb24oKXtyZXR1cm4gdGhpcy5jb25maWd9Z2V0UGVyZm9ybWFuY2VDbGllbnQoKXtyZXR1cm4gdGhpcy5wZXJmb3JtYW5jZUNsaWVudH1pc0Jyb3dzZXJFbnYoKXtyZXR1cm4gdGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudH1nZXRSZXF1ZXN0Q29ycmVsYXRpb25JZChlKXtyZXR1cm4gZT8uY29ycmVsYXRpb25JZD9lLmNvcnJlbGF0aW9uSWQ6dGhpcy5pc0Jyb3dzZXJFbnZpcm9ubWVudD9vYSgpOnQuRU1QVFlfU1RSSU5HfWFzeW5jIGxvZ2luUmVkaXJlY3QoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKGUpO3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJsb2dpblJlZGlyZWN0IGNhbGxlZCIsdCksdGhpcy5hY3F1aXJlVG9rZW5SZWRpcmVjdCh7Y29ycmVsYXRpb25JZDp0LC4uLmV8fE5zfSl9bG9naW5Qb3B1cChlKXtjb25zdCB0PXRoaXMuZ2V0UmVxdWVzdENvcnJlbGF0aW9uSWQoZSk7cmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoImxvZ2luUG9wdXAgY2FsbGVkIix0KSx0aGlzLmFjcXVpcmVUb2tlblBvcHVwKHtjb3JyZWxhdGlvbklkOnQsLi4uZXx8TnN9KX1hc3luYyBhY3F1aXJlVG9rZW5TaWxlbnQoZSl7Y29uc3QgdD10aGlzLmdldFJlcXVlc3RDb3JyZWxhdGlvbklkKGUpLHI9dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblNpbGVudCx0KTtyLmFkZCh7Y2FjaGVMb29rdXBQb2xpY3k6ZS5jYWNoZUxvb2t1cFBvbGljeSxzY2VuYXJpb0lkOmUuc2NlbmFyaW9JZH0pLHFsKHRoaXMuaW5pdGlhbGl6ZWQscixlLmFjY291bnQpLHRoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblNpbGVudCBjYWxsZWQiLHQpO2NvbnN0IG49ZS5hY2NvdW50fHx0aGlzLmdldEFjdGl2ZUFjY291bnQoKTtpZighbil0aHJvdyBaaShDaSk7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50RGVkdXBlZChlLG4sdCkudGhlbigobj0+KHIuZW5kKHtzdWNjZXNzOiEwLGZyb21DYWNoZTpuLmZyb21DYWNoZSxhY2Nlc3NUb2tlblNpemU6bi5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6bi5pZFRva2VuLmxlbmd0aH0sdm9pZCAwLG4uYWNjb3VudCksey4uLm4sc3RhdGU6ZS5zdGF0ZSxjb3JyZWxhdGlvbklkOnR9KSkpLmNhdGNoKChlPT57dGhyb3cgZSBpbnN0YW5jZW9mIENlJiZlLnNldENvcnJlbGF0aW9uSWQodCksci5lbmQoe3N1Y2Nlc3M6ITF9LGUsbiksZX0pKX1hc3luYyBhY3F1aXJlVG9rZW5TaWxlbnREZWR1cGVkKGUsdCxyKXtjb25zdCBuPW9vKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsey4uLmUsYXV0aG9yaXR5OmUuYXV0aG9yaXR5fHx0aGlzLmNvbmZpZy5hdXRoLmF1dGhvcml0eX0sdC5ob21lQWNjb3VudElkKSxvPUpTT04uc3RyaW5naWZ5KG4pLGk9dGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzLmdldChvKTtpZih2b2lkIDA9PT1pKXt0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSwgc3RvcmluZyBhY3RpdmUgcmVxdWVzdCIsciksdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe2RlZHVwZWQ6ITF9LHIpO2NvbnN0IG49VW4odGhpcy5hY3F1aXJlVG9rZW5TaWxlbnRBc3luYy5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQscikoey4uLmUsY29ycmVsYXRpb25JZDpyfSx0KTtyZXR1cm4gdGhpcy5hY3RpdmVTaWxlbnRUb2tlblJlcXVlc3RzLnNldChvLG4pLG4uZmluYWxseSgoKCk9Pnt0aGlzLmFjdGl2ZVNpbGVudFRva2VuUmVxdWVzdHMuZGVsZXRlKG8pfSkpfXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgaGFzIGJlZW4gY2FsbGVkIHByZXZpb3VzbHksIHJldHVybmluZyB0aGUgcmVzdWx0IGZyb20gdGhlIGZpcnN0IGNhbGwiLHIpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHtkZWR1cGVkOiEwfSxyKSxpfWFzeW5jIGFjcXVpcmVUb2tlblNpbGVudEFzeW5jKHQscil7Y29uc3Qgbj0oKT0+dGhpcy50cmFja1BhZ2VWaXNpYmlsaXR5KHQuY29ycmVsYXRpb25JZCk7dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRRdWV1ZU1lYXN1cmVtZW50KE9yLkFjcXVpcmVUb2tlblNpbGVudEFzeW5jLHQuY29ycmVsYXRpb25JZCksdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fU1RBUlQsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LHQpLHQuY29ycmVsYXRpb25JZCYmdGhpcy5wZXJmb3JtYW5jZUNsaWVudC5pbmNyZW1lbnRGaWVsZHMoe3Zpc2liaWxpdHlDaGFuZ2VDb3VudDowfSx0LmNvcnJlbGF0aW9uSWQpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInZpc2liaWxpdHljaGFuZ2UiLG4pO2NvbnN0IG89YXdhaXQgVW4oR2MsT3IuSW5pdGlhbGl6ZVNpbGVudFJlcXVlc3QsdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0LmNvcnJlbGF0aW9uSWQpKHQscix0aGlzLmNvbmZpZyx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMubG9nZ2VyKSxpPXQuY2FjaGVMb29rdXBQb2xpY3l8fERzLkRlZmF1bHQ7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50Tm9JZnJhbWUobyxpKS5jYXRjaCgoYXN5bmMgZT0+e2NvbnN0IHQ9ZnVuY3Rpb24oZSx0KXtjb25zdCByPSEoZSBpbnN0YW5jZW9mIEFvJiZlLnN1YkVycm9yIT09eW8pLG49ZS5lcnJvckNvZGU9PT1lc3x8ZS5lcnJvckNvZGU9PT1YZSxvPXImJm58fGUuZXJyb3JDb2RlPT09bG98fGUuZXJyb3JDb2RlPT09dW8saT1Icy5pbmNsdWRlcyh0KTtyZXR1cm4gbyYmaX0oZSxpKTtpZih0KXtpZih0aGlzLmFjdGl2ZUlmcmFtZVJlcXVlc3Qpe2lmKGkhPT1Ecy5Ta2lwKXtjb25zdFt0LHJdPXRoaXMuYWN0aXZlSWZyYW1lUmVxdWVzdDt0aGlzLmxvZ2dlci52ZXJib3NlKGBJZnJhbWUgcmVxdWVzdCBpcyBhbHJlYWR5IGluIHByb2dyZXNzLCBhd2FpdGluZyByZXNvbHV0aW9uIGZvciByZXF1ZXN0IHdpdGggY29ycmVsYXRpb25JZDogJHtyfWAsby5jb3JyZWxhdGlvbklkKTtjb25zdCBuPXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5Bd2FpdENvbmN1cnJlbnRJZnJhbWUsby5jb3JyZWxhdGlvbklkKTtuLmFkZCh7YXdhaXRJZnJhbWVDb3JyZWxhdGlvbklkOnJ9KTtjb25zdCBzPWF3YWl0IHQ7aWYobi5lbmQoe3N1Y2Nlc3M6c30pLHMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoYFBhcmFsbGVsIGlmcmFtZSByZXF1ZXN0IHdpdGggY29ycmVsYXRpb25JZDogJHtyfSBzdWNjZWVkZWQuIFJldHJ5aW5nIGNhY2hlIGFuZC9vciBSVCByZWRlbXB0aW9uYCxvLmNvcnJlbGF0aW9uSWQpLHRoaXMuYWNxdWlyZVRva2VuU2lsZW50Tm9JZnJhbWUobyxpKTt0aHJvdyB0aGlzLmxvZ2dlci5pbmZvKGBJZnJhbWUgcmVxdWVzdCB3aXRoIGNvcnJlbGF0aW9uSWQ6ICR7cn0gZmFpbGVkLiBJbnRlcmFjdGlvbiBpcyByZXF1aXJlZC5gKSxlfXJldHVybiB0aGlzLmxvZ2dlci53YXJuaW5nKCJBbm90aGVyIGlmcmFtZSByZXF1ZXN0IGlzIGN1cnJlbnRseSBpbiBwcm9ncmVzcyBhbmQgQ2FjaGVMb29rdXBQb2xpY3kgaXMgc2V0IHRvIFNraXAuIFRoaXMgbWF5IHJlc3VsdCBpbiBkZWdyYWRlZCBwZXJmb3JtYW5jZSBhbmQvb3IgcmVsaWFiaWxpdHkgZm9yIGJvdGggY2FsbHMuIFBsZWFzZSBjb25zaWRlciBjaGFuZ2luZyB0aGUgQ2FjaGVMb29rdXBQb2xpY3kgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgcmVxdWVzdCBxdWV1aW5nIGFuZCB0b2tlbiBjYWNoZS4iLG8uY29ycmVsYXRpb25JZCksVW4odGhpcy5hY3F1aXJlVG9rZW5CeVNpbGVudElmcmFtZS5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsby5jb3JyZWxhdGlvbklkKShvKX17bGV0IGU7cmV0dXJuIHRoaXMuYWN0aXZlSWZyYW1lUmVxdWVzdD1bbmV3IFByb21pc2UoKHQ9PntlPXR9KSksby5jb3JyZWxhdGlvbklkXSx0aGlzLmxvZ2dlci52ZXJib3NlKCJSZWZyZXNoIHRva2VuIGV4cGlyZWQvaW52YWxpZCBvciBDYWNoZUxvb2t1cFBvbGljeSBpcyBzZXQgdG8gU2tpcCwgYXR0ZW1wdGluZyBhY3F1aXJlIHRva2VuIGJ5IGlmcmFtZS4iLG8uY29ycmVsYXRpb25JZCksVW4odGhpcy5hY3F1aXJlVG9rZW5CeVNpbGVudElmcmFtZS5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlbkJ5U2lsZW50SWZyYW1lLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsby5jb3JyZWxhdGlvbklkKShvKS50aGVuKCh0PT4oZSghMCksdCkpKS5jYXRjaCgodD0+e3Rocm93IGUoITEpLHR9KSkuZmluYWxseSgoKCk9Pnt0aGlzLmFjdGl2ZUlmcmFtZVJlcXVlc3Q9dm9pZCAwfSkpfX10aHJvdyBlfSkpLnRoZW4oKHI9Pih0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxyKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7ZnJvbUNhY2hlOnIuZnJvbUNhY2hlfSx0LmNvcnJlbGF0aW9uSWQpLHIpKSkuY2F0Y2goKHQ9Pnt0aHJvdyB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxudWxsLHQpLHR9KSkuZmluYWxseSgoKCk9Pntkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIixuKX0pKX1hc3luYyBhY3F1aXJlVG9rZW5TaWxlbnROb0lmcmFtZSh0LHIpe3JldHVybiB5bCh0aGlzLmNvbmZpZyx0aGlzLmxvZ2dlcix0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyLHQuYXV0aGVudGljYXRpb25TY2hlbWUpJiZ0LmFjY291bnQubmF0aXZlQWNjb3VudElkPyh0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgLSBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgdG9rZW4gZnJvbSBuYXRpdmUgcGxhdGZvcm0iKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LmFkZEZpZWxkcyh7aXNQbGF0Zm9ybUJyb2tlclJlcXVlc3Q6ITB9LHQuY29ycmVsYXRpb25JZCksdGhpcy5hY3F1aXJlVG9rZW5OYXRpdmUodCxNcy5hY3F1aXJlVG9rZW5TaWxlbnRfc2lsZW50Rmxvdyx0LmFjY291bnQubmF0aXZlQWNjb3VudElkLHIpLmNhdGNoKChhc3luYyBlPT57aWYodGhpcy5wZXJmb3JtYW5jZUNsaWVudC5hZGRGaWVsZHMoe2Jyb2tlckVycm9yTmFtZTplLm5hbWUsYnJva2VyRXJyb3JDb2RlOmUuZXJyb3JDb2RlfSx0LmNvcnJlbGF0aW9uSWQpLGUgaW5zdGFuY2VvZiBYYyYmWmMoZSkpdGhyb3cgdGhpcy5sb2dnZXIudmVyYm9zZSgiYWNxdWlyZVRva2VuU2lsZW50IC0gbmF0aXZlIHBsYXRmb3JtIHVuYXZhaWxhYmxlLCBmYWxsaW5nIGJhY2sgdG8gd2ViIGZsb3ciKSx0aGlzLnBsYXRmb3JtQXV0aFByb3ZpZGVyPXZvaWQgMCxtdChYZSk7dGhyb3cgZX0pKSk6KHRoaXMubG9nZ2VyLnZlcmJvc2UoImFjcXVpcmVUb2tlblNpbGVudCAtIGF0dGVtcHRpbmcgdG8gYWNxdWlyZSB0b2tlbiBmcm9tIHdlYiBmbG93Iikscj09PURzLkFjY2Vzc1Rva2VuJiZ0aGlzLmxvZ2dlci52ZXJib3NlKCJhY3F1aXJlVG9rZW5TaWxlbnQgLSBjYWNoZSBsb29rdXAgcG9saWN5IHNldCB0byBBY2Nlc3NUb2tlbiwgYXR0ZW1wdGluZyB0byBhY3F1aXJlIHRva2VuIGZyb20gbG9jYWwgY2FjaGUiKSxVbih0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZS5iaW5kKHRoaXMpLE9yLkFjcXVpcmVUb2tlbkZyb21DYWNoZSx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHQuY29ycmVsYXRpb25JZCkodCxyKS5jYXRjaCgobj0+e2lmKHI9PT1Ecy5BY2Nlc3NUb2tlbil0aHJvdyBuO3JldHVybiB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9ORVRXT1JLX1NUQVJULGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCx0KSxVbih0aGlzLmFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuLmJpbmQodGhpcyksT3IuQWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4sdGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCx0LmNvcnJlbGF0aW9uSWQpKHQscil9KSkpfWFzeW5jIHByZUdlbmVyYXRlUGtjZUNvZGVzKGUpe3JldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJHZW5lcmF0aW5nIG5ldyBQS0NFIGNvZGVzIiksdGhpcy5wa2NlQ29kZT1hd2FpdCBVbihkbCxPci5HZW5lcmF0ZVBrY2VDb2Rlcyx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LGUpKHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5sb2dnZXIsZSksUHJvbWlzZS5yZXNvbHZlKCl9Z2V0UHJlR2VuZXJhdGVkUGtjZUNvZGVzKGUpe3RoaXMubG9nZ2VyLnZlcmJvc2UoIkF0dGVtcHRpbmcgdG8gcGljayB1cCBwcmUtZ2VuZXJhdGVkIFBLQ0UgY29kZXMiKTtjb25zdCB0PXRoaXMucGtjZUNvZGU/ey4uLnRoaXMucGtjZUNvZGV9OnZvaWQgMDtyZXR1cm4gdGhpcy5wa2NlQ29kZT12b2lkIDAsdGhpcy5sb2dnZXIudmVyYm9zZSgodD8iRm91bmQiOiJEaWQgbm90IGZpbmQiKSsiIHByZS1nZW5lcmF0ZWQgUEtDRSBjb2RlcyIpLHRoaXMucGVyZm9ybWFuY2VDbGllbnQuYWRkRmllbGRzKHt1c2VQcmVHZW5lcmF0ZWRQa2NlOiEhdH0sZSksdH1sb2dNdWx0aXBsZUluc3RhbmNlcyhlKXtjb25zdCB0PXRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQ7aWYoIXdpbmRvdylyZXR1cm47d2luZG93Lm1zYWw9d2luZG93Lm1zYWx8fHt9LHdpbmRvdy5tc2FsLmNsaWVudElkcz13aW5kb3cubXNhbC5jbGllbnRJZHN8fFtdO3dpbmRvdy5tc2FsLmNsaWVudElkcy5sZW5ndGg+MCYmdGhpcy5sb2dnZXIudmVyYm9zZSgiVGhlcmUgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSBvZiBNU0FMLmpzIGluIHRoZSB3aW5kb3cuIiksd2luZG93Lm1zYWwuY2xpZW50SWRzLnB1c2godCksZnVuY3Rpb24oZSx0LHIpe2NvbnN0IG49d2luZG93Lm1zYWw/LmNsaWVudElkc3x8W10sbz1uLmxlbmd0aCxpPW4uZmlsdGVyKCh0PT50PT09ZSkpLmxlbmd0aDtpPjEmJnIud2FybmluZygiVGhlcmUgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSBvZiBNU0FMLmpzIGluIHRoZSB3aW5kb3cgd2l0aCB0aGUgc2FtZSBjbGllbnQgaWQuIiksdC5hZGQoe21zYWxJbnN0YW5jZUNvdW50Om8sc2FtZUNsaWVudElkSW5zdGFuY2VDb3VudDppfSl9KHQsZSx0aGlzLmxvZ2dlcil9fWNsYXNzIFVse2NvbnN0cnVjdG9yKGUsdCxyLG4pe3RoaXMuY2xpZW50SWQ9ZSx0aGlzLmNsaWVudENhcGFiaWxpdGllcz10LHRoaXMuY3J5cHRvPXIsdGhpcy5sb2dnZXI9bn10b05hYVRva2VuUmVxdWVzdChlKXtsZXQgdDt0PXZvaWQgMD09PWUuZXh0cmFRdWVyeVBhcmFtZXRlcnM/bmV3IE1hcDpuZXcgTWFwKE9iamVjdC5lbnRyaWVzKGUuZXh0cmFRdWVyeVBhcmFtZXRlcnMpKTtjb25zdCByPWUuY29ycmVsYXRpb25JZHx8dGhpcy5jcnlwdG8uY3JlYXRlTmV3R3VpZCgpLG49Um4oZS5jbGFpbXMsdGhpcy5jbGllbnRDYXBhYmlsaXRpZXMpLG89ZS5zY29wZXN8fGg7cmV0dXJue3BsYXRmb3JtQnJva2VySWQ6ZS5hY2NvdW50Py5ob21lQWNjb3VudElkLGNsaWVudElkOnRoaXMuY2xpZW50SWQsYXV0aG9yaXR5OmUuYXV0aG9yaXR5LHNjb3BlOm8uam9pbigiICIpLGNvcnJlbGF0aW9uSWQ6cixjbGFpbXM6WXQuaXNFbXB0eU9iaihuKT92b2lkIDA6bixzdGF0ZTplLnN0YXRlLGF1dGhlbnRpY2F0aW9uU2NoZW1lOmUuYXV0aGVudGljYXRpb25TY2hlbWV8fFcuQkVBUkVSLGV4dHJhUGFyYW1ldGVyczp0fX1mcm9tTmFhVG9rZW5SZXNwb25zZShlLHQscil7aWYoIXQudG9rZW4uaWRfdG9rZW58fCF0LnRva2VuLmFjY2Vzc190b2tlbil0aHJvdyBtdChBZSk7Y29uc3Qgbj14bihyKyh0LnRva2VuLmV4cGlyZXNfaW58fDApKSxvPWRyKHQudG9rZW4uaWRfdG9rZW4sdGhpcy5jcnlwdG8uYmFzZTY0RGVjb2RlKSxpPXRoaXMuZnJvbU5hYUFjY291bnRJbmZvKHQuYWNjb3VudCx0LnRva2VuLmlkX3Rva2VuLG8pLHM9dC50b2tlbi5zY29wZXx8ZS5zY29wZTtyZXR1cm57YXV0aG9yaXR5OnQudG9rZW4uYXV0aG9yaXR5fHxpLmVudmlyb25tZW50LHVuaXF1ZUlkOmkubG9jYWxBY2NvdW50SWQsdGVuYW50SWQ6aS50ZW5hbnRJZCxzY29wZXM6cy5zcGxpdCgiICIpLGFjY291bnQ6aSxpZFRva2VuOnQudG9rZW4uaWRfdG9rZW4saWRUb2tlbkNsYWltczpvLGFjY2Vzc1Rva2VuOnQudG9rZW4uYWNjZXNzX3Rva2VuLGZyb21DYWNoZTohMSxleHBpcmVzT246bix0b2tlblR5cGU6ZS5hdXRoZW50aWNhdGlvblNjaGVtZXx8Vy5CRUFSRVIsY29ycmVsYXRpb25JZDplLmNvcnJlbGF0aW9uSWQsZXh0RXhwaXJlc09uOm4sc3RhdGU6ZS5zdGF0ZX19ZnJvbU5hYUFjY291bnRJbmZvKGUsdCxyKXtjb25zdCBuPXJ8fGUuaWRUb2tlbkNsYWltcyxvPWUubG9jYWxBY2NvdW50SWR8fG4/Lm9pZHx8bj8uc3VifHwiIixpPWUudGVuYW50SWR8fG4/LnRpZHx8IiIscz1lLmhvbWVBY2NvdW50SWR8fGAke299LiR7aX1gLGE9ZS51c2VybmFtZXx8bj8ucHJlZmVycmVkX3VzZXJuYW1lfHwiIixjPWUubmFtZXx8bj8ubmFtZSxsPWUubG9naW5IaW50fHxuPy5sb2dpbl9oaW50LGg9bmV3IE1hcCxkPXJyKHMsbyxpLG4pO2guc2V0KGksZCk7cmV0dXJue2hvbWVBY2NvdW50SWQ6cyxlbnZpcm9ubWVudDplLmVudmlyb25tZW50LHRlbmFudElkOmksdXNlcm5hbWU6YSxsb2NhbEFjY291bnRJZDpvLG5hbWU6Yyxsb2dpbkhpbnQ6bCxpZFRva2VuOnQsaWRUb2tlbkNsYWltczpuLHRlbmFudFByb2ZpbGVzOmh9fWZyb21CcmlkZ2VFcnJvcihlKXtpZighZnVuY3Rpb24oZSl7cmV0dXJuIHZvaWQgMCE9PWUuc3RhdHVzfShlKSlyZXR1cm4gbmV3IENlKCJ1bmtub3duX2Vycm9yIiwiQW4gdW5rbm93biBlcnJvciBvY2N1cnJlZCIpO3N3aXRjaChlLnN0YXR1cyl7Y2FzZSBvYzpyZXR1cm4gbmV3IHB0KHN0KTtjYXNlIGljOnJldHVybiBuZXcgcHQoaXQpO2Nhc2UgbGM6cmV0dXJuIG5ldyBwdChqZSk7Y2FzZSBjYzpyZXR1cm4gbmV3IHB0KGx0KTtjYXNlIGhjOnJldHVybiBuZXcgcHQoZS5jb2RlfHxsdCxlLmRlc2NyaXB0aW9uKTtjYXNlIHNjOmNhc2UgYWM6cmV0dXJuIG5ldyBubyhlLmNvZGUsZS5kZXNjcmlwdGlvbik7Y2FzZSBuYzpyZXR1cm4gbmV3IEFvKGUuY29kZSxlLmRlc2NyaXB0aW9uKTtkZWZhdWx0OnJldHVybiBuZXcgQ2UoZS5jb2RlLGUuZGVzY3JpcHRpb24pfX10b0F1dGhlbnRpY2F0aW9uUmVzdWx0RnJvbUNhY2hlKGUsdCxyLG4sbyl7aWYoIXR8fCFyKXRocm93IG10KEFlKTtjb25zdCBpPWRyKHQuc2VjcmV0LHRoaXMuY3J5cHRvLmJhc2U2NERlY29kZSkscz1yLnRhcmdldHx8bi5zY29wZXMuam9pbigiICIpO3JldHVybnthdXRob3JpdHk6ci5lbnZpcm9ubWVudHx8ZS5lbnZpcm9ubWVudCx1bmlxdWVJZDplLmxvY2FsQWNjb3VudElkLHRlbmFudElkOmUudGVuYW50SWQsc2NvcGVzOnMuc3BsaXQoIiAiKSxhY2NvdW50OmUsaWRUb2tlbjp0LnNlY3JldCxpZFRva2VuQ2xhaW1zOml8fHt9LGFjY2Vzc1Rva2VuOnIuc2VjcmV0LGZyb21DYWNoZTohMCxleHBpcmVzT246eG4oci5leHBpcmVzT24pLGV4dEV4cGlyZXNPbjp4bihyLmV4dGVuZGVkRXhwaXJlc09uKSx0b2tlblR5cGU6bi5hdXRoZW50aWNhdGlvblNjaGVtZXx8Vy5CRUFSRVIsY29ycmVsYXRpb25JZDpvLHN0YXRlOm4uc3RhdGV9fX1jb25zdCBMbD17Y29kZToidW5zdXBwb3J0ZWRfbWV0aG9kIixkZXNjOiJUaGlzIG1ldGhvZCBpcyBub3Qgc3VwcG9ydGVkIGluIG5lc3RlZCBhcHAgZW52aXJvbm1lbnQuIn07Y2xhc3MgRGwgZXh0ZW5kcyBDZXtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsRGwucHJvdG90eXBlKSx0aGlzLm5hbWU9Ik5lc3RlZEFwcEF1dGhFcnJvciJ9c3RhdGljIGNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKXtyZXR1cm4gbmV3IERsKExsLmNvZGUsTGwuZGVzYyl9fWNsYXNzIEhse2NvbnN0cnVjdG9yKGUpe3RoaXMub3BlcmF0aW5nQ29udGV4dD1lO2NvbnN0IHQ9dGhpcy5vcGVyYXRpbmdDb250ZXh0LmdldEJyaWRnZVByb3h5KCk7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoInVuZXhwZWN0ZWQ6IGJyaWRnZVByb3h5IGlzIHVuZGVmaW5lZCIpO3RoaXMuYnJpZGdlUHJveHk9dCx0aGlzLmNvbmZpZz1lLmdldENvbmZpZygpLHRoaXMubG9nZ2VyPXRoaXMub3BlcmF0aW5nQ29udGV4dC5nZXRMb2dnZXIoKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXRoaXMuY29uZmlnLnRlbGVtZXRyeS5jbGllbnQsdGhpcy5icm93c2VyQ3J5cHRvPWUuaXNCcm93c2VyRW52aXJvbm1lbnQoKT9uZXcgeWModGhpcy5sb2dnZXIsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCwhMCk6ZnQsdGhpcy5ldmVudEhhbmRsZXI9bmV3IEZjKHRoaXMubG9nZ2VyKSx0aGlzLmJyb3dzZXJTdG9yYWdlPXRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpP25ldyBNYyh0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLHRoaXMuY29uZmlnLmNhY2hlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyLHRvKHRoaXMuY29uZmlnLmF1dGgpKTpxYyh0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQsdGhpcy5ldmVudEhhbmRsZXIpLHRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXI9bmV3IFVsKHRoaXMuY29uZmlnLmF1dGguY2xpZW50SWQsdGhpcy5jb25maWcuYXV0aC5jbGllbnRDYXBhYmlsaXRpZXMsdGhpcy5icm93c2VyQ3J5cHRvLHRoaXMubG9nZ2VyKTtjb25zdCByPXRoaXMuYnJpZGdlUHJveHkuZ2V0QWNjb3VudENvbnRleHQoKTt0aGlzLmN1cnJlbnRBY2NvdW50Q29udGV4dD1yfHxudWxsfXN0YXRpYyBhc3luYyBjcmVhdGVDb250cm9sbGVyKGUpe2NvbnN0IHQ9bmV3IEhsKGUpO3JldHVybiBQcm9taXNlLnJlc29sdmUodCl9YXN5bmMgaW5pdGlhbGl6ZShlLHQpe2NvbnN0IHI9ZT8uY29ycmVsYXRpb25JZHx8b2EoKTtyZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyU3RvcmFnZS5pbml0aWFsaXplKHIpLFByb21pc2UucmVzb2x2ZSgpfWVuc3VyZVZhbGlkUmVxdWVzdChlKXtyZXR1cm4gZT8uY29ycmVsYXRpb25JZD9lOnsuLi5lLGNvcnJlbGF0aW9uSWQ6dGhpcy5icm93c2VyQ3J5cHRvLmNyZWF0ZU5ld0d1aWQoKX19YXN5bmMgYWNxdWlyZVRva2VuSW50ZXJhY3RpdmUodCl7Y29uc3Qgcj10aGlzLmVuc3VyZVZhbGlkUmVxdWVzdCh0KTt0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCxyKTtjb25zdCBuPXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5BY3F1aXJlVG9rZW5Qb3B1cCxyLmNvcnJlbGF0aW9uSWQpO24uYWRkKHtuZXN0ZWRBcHBBdXRoUmVxdWVzdDohMH0pO3RyeXtjb25zdCBvPXRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIudG9OYWFUb2tlblJlcXVlc3QociksaT1EbigpLHM9YXdhaXQgdGhpcy5icmlkZ2VQcm94eS5nZXRUb2tlbkludGVyYWN0aXZlKG8pLGE9ey4uLnRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIuZnJvbU5hYVRva2VuUmVzcG9uc2UobyxzLGkpfTt0cnl7YXdhaXQgdGhpcy5oeWRyYXRlQ2FjaGUoYSx0KX1jYXRjaChlKXt0aGlzLmxvZ2dlci53YXJuaW5nUGlpKGBGYWlsZWQgdG8gaHlkcmF0ZSBjYWNoZS4gRXJyb3I6ICR7ZX1gLHIuY29ycmVsYXRpb25JZCl9cmV0dXJuIHRoaXMuY3VycmVudEFjY291bnRDb250ZXh0PXtob21lQWNjb3VudElkOmEuYWNjb3VudC5ob21lQWNjb3VudElkLGVudmlyb25tZW50OmEuYWNjb3VudC5lbnZpcm9ubWVudCx0ZW5hbnRJZDphLmFjY291bnQudGVuYW50SWR9LHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuUG9wdXAsYSksbi5hZGQoe2FjY2Vzc1Rva2VuU2l6ZTphLmFjY2Vzc1Rva2VuLmxlbmd0aCxpZFRva2VuU2l6ZTphLmlkVG9rZW4ubGVuZ3RofSksbi5lbmQoe3N1Y2Nlc3M6ITAscmVxdWVzdElkOmEucmVxdWVzdElkfSx2b2lkIDAsYS5hY2NvdW50KSxhfWNhdGNoKHIpe2NvbnN0IG89ciBpbnN0YW5jZW9mIENlP3I6dGhpcy5uZXN0ZWRBcHBBdXRoQWRhcHRlci5mcm9tQnJpZGdlRXJyb3Iocik7dGhyb3cgdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fRkFJTFVSRSxlLkludGVyYWN0aW9uVHlwZS5Qb3B1cCxudWxsLHIpLG4uZW5kKHtzdWNjZXNzOiExfSxyLHQuYWNjb3VudCksb319YXN5bmMgYWNxdWlyZVRva2VuU2lsZW50SW50ZXJuYWwodCl7Y29uc3Qgcj10aGlzLmVuc3VyZVZhbGlkUmVxdWVzdCh0KTt0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVEFSVCxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQscik7Y29uc3Qgbj1hd2FpdCB0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZShyKTtpZihuKXJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9TVUNDRVNTLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxuKSxuO2NvbnN0IG89dGhpcy5wZXJmb3JtYW5jZUNsaWVudC5zdGFydE1lYXN1cmVtZW50KE9yLlNzb1NpbGVudCxyLmNvcnJlbGF0aW9uSWQpO28uaW5jcmVtZW50KHt2aXNpYmlsaXR5Q2hhbmdlQ291bnQ6MH0pLG8uYWRkKHtuZXN0ZWRBcHBBdXRoUmVxdWVzdDohMH0pO3RyeXtjb25zdCBuPXRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIudG9OYWFUb2tlblJlcXVlc3Qocik7bi5mb3JjZVJlZnJlc2g9ci5mb3JjZVJlZnJlc2g7Y29uc3QgaT1EbigpLHM9YXdhaXQgdGhpcy5icmlkZ2VQcm94eS5nZXRUb2tlblNpbGVudChuKSxhPXRoaXMubmVzdGVkQXBwQXV0aEFkYXB0ZXIuZnJvbU5hYVRva2VuUmVzcG9uc2UobixzLGkpO3RyeXthd2FpdCB0aGlzLmh5ZHJhdGVDYWNoZShhLHQpfWNhdGNoKGUpe3RoaXMubG9nZ2VyLndhcm5pbmdQaWkoYEZhaWxlZCB0byBoeWRyYXRlIGNhY2hlLiBFcnJvcjogJHtlfWAsci5jb3JyZWxhdGlvbklkKX1yZXR1cm4gdGhpcy5jdXJyZW50QWNjb3VudENvbnRleHQ9e2hvbWVBY2NvdW50SWQ6YS5hY2NvdW50LmhvbWVBY2NvdW50SWQsZW52aXJvbm1lbnQ6YS5hY2NvdW50LmVudmlyb25tZW50LHRlbmFudElkOmEuYWNjb3VudC50ZW5hbnRJZH0sdGhpcy5ldmVudEhhbmRsZXIuZW1pdEV2ZW50KF9jLkFDUVVJUkVfVE9LRU5fU1VDQ0VTUyxlLkludGVyYWN0aW9uVHlwZS5TaWxlbnQsYSksbz8uYWRkKHthY2Nlc3NUb2tlblNpemU6YS5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6YS5pZFRva2VuLmxlbmd0aH0pLG8/LmVuZCh7c3VjY2VzczohMCxyZXF1ZXN0SWQ6YS5yZXF1ZXN0SWR9LHZvaWQgMCxhLmFjY291bnQpLGF9Y2F0Y2gocil7Y29uc3Qgbj1yIGluc3RhbmNlb2YgQ2U/cjp0aGlzLm5lc3RlZEFwcEF1dGhBZGFwdGVyLmZyb21CcmlkZ2VFcnJvcihyKTt0aHJvdyB0aGlzLmV2ZW50SGFuZGxlci5lbWl0RXZlbnQoX2MuQUNRVUlSRV9UT0tFTl9GQUlMVVJFLGUuSW50ZXJhY3Rpb25UeXBlLlNpbGVudCxudWxsLHIpLG8/LmVuZCh7c3VjY2VzczohMX0scix0LmFjY291bnQpLG59fWFzeW5jIGFjcXVpcmVUb2tlbkZyb21DYWNoZSh0KXtjb25zdCByPXRoaXMucGVyZm9ybWFuY2VDbGllbnQuc3RhcnRNZWFzdXJlbWVudChPci5BY3F1aXJlVG9rZW5TaWxlbnQsdC5jb3JyZWxhdGlvbklkKTtpZihyPy5hZGQoe25lc3RlZEFwcEF1dGhSZXF1ZXN0OiEwfSksdC5jbGFpbXMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIkNsYWltcyBhcmUgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCwgc2tpcHBpbmcgY2FjaGUgbG9va3VwIiksbnVsbDtpZih0LmZvcmNlUmVmcmVzaClyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiZm9yY2VSZWZyZXNoIGlzIHNldCB0byB0cnVlLCBza2lwcGluZyBjYWNoZSBsb29rdXAiKSxudWxsO2xldCBuPW51bGw7c3dpdGNoKHQuY2FjaGVMb29rdXBQb2xpY3l8fCh0LmNhY2hlTG9va3VwUG9saWN5PURzLkRlZmF1bHQpLHQuY2FjaGVMb29rdXBQb2xpY3kpe2Nhc2UgRHMuRGVmYXVsdDpjYXNlIERzLkFjY2Vzc1Rva2VuOmNhc2UgRHMuQWNjZXNzVG9rZW5BbmRSZWZyZXNoVG9rZW46bj1hd2FpdCB0aGlzLmFjcXVpcmVUb2tlbkZyb21DYWNoZUludGVybmFsKHQpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG51bGx9cmV0dXJuIG4/KHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1MsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG4pLHIuYWRkKHthY2Nlc3NUb2tlblNpemU6bi5hY2Nlc3NUb2tlbi5sZW5ndGgsaWRUb2tlblNpemU6bi5pZFRva2VuLmxlbmd0aH0pLHIuZW5kKHtzdWNjZXNzOiEwfSx2b2lkIDAsbi5hY2NvdW50KSxuKToodGhpcy5sb2dnZXIud2FybmluZygiQ2FjaGVkIHRva2VucyBhcmUgbm90IGZvdW5kIGZvciB0aGUgYWNjb3VudCwgcHJvY2VlZGluZyB3aXRoIHNpbGVudCB0b2tlbiByZXF1ZXN0LiIpLHRoaXMuZXZlbnRIYW5kbGVyLmVtaXRFdmVudChfYy5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkUsZS5JbnRlcmFjdGlvblR5cGUuU2lsZW50LG51bGwpLHIuZW5kKHtzdWNjZXNzOiExfSx2b2lkIDAsdC5hY2NvdW50KSxudWxsKX1hc3luYyBhY3F1aXJlVG9rZW5Gcm9tQ2FjaGVJbnRlcm5hbChlKXtjb25zdCB0PXRoaXMuYnJpZGdlUHJveHkuZ2V0QWNjb3VudENvbnRleHQoKXx8dGhpcy5jdXJyZW50QWNjb3VudENvbnRleHQ7bGV0IHI9bnVsbDtjb25zdCBuPWUuY29ycmVsYXRpb25JZHx8dGhpcy5icm93c2VyQ3J5cHRvLmNyZWF0ZU5ld0d1aWQoKTtpZih0JiYocj1VYyh0LHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsbikpLCFyKXJldHVybiB0aGlzLmxvZ2dlci52ZXJib3NlKCJObyBhY3RpdmUgYWNjb3VudCBmb3VuZCwgZmFsbGluZyBiYWNrIHRvIHRoZSBob3N0IiksUHJvbWlzZS5yZXNvbHZlKG51bGwpO3RoaXMubG9nZ2VyLnZlcmJvc2UoImFjdGl2ZSBhY2NvdW50IGZvdW5kLCBhdHRlbXB0aW5nIHRvIGFjcXVpcmUgdG9rZW4gc2lsZW50bHkiKTtjb25zdCBvPXsuLi5lLGNvcnJlbGF0aW9uSWQ6ZS5jb3JyZWxhdGlvbklkfHx0aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpLGF1dGhvcml0eTplLmF1dGhvcml0eXx8ci5lbnZpcm9ubWVudCxzY29wZXM6ZS5zY29wZXM/Lmxlbmd0aD9lLnNjb3BlczpbLi4uaF19LGk9dGhpcy5icm93c2VyU3RvcmFnZS5nZXRUb2tlbktleXMoKSxzPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0QWNjZXNzVG9rZW4ocixvLGksci50ZW5hbnRJZCk7aWYoIXMpcmV0dXJuIHRoaXMubG9nZ2VyLnZlcmJvc2UoIk5vIGNhY2hlZCBhY2Nlc3MgdG9rZW4gZm91bmQiKSxQcm9taXNlLnJlc29sdmUobnVsbCk7aWYoem4ocy5jYWNoZWRBdCl8fEJuKHMuZXhwaXJlc09uLHRoaXMuY29uZmlnLnN5c3RlbS50b2tlblJlbmV3YWxPZmZzZXRTZWNvbmRzKSlyZXR1cm4gdGhpcy5sb2dnZXIudmVyYm9zZSgiQ2FjaGVkIGFjY2VzcyB0b2tlbiBoYXMgZXhwaXJlZCIpLFByb21pc2UucmVzb2x2ZShudWxsKTtjb25zdCBhPXRoaXMuYnJvd3NlclN0b3JhZ2UuZ2V0SWRUb2tlbihyLG8uY29ycmVsYXRpb25JZCxpLHIudGVuYW50SWQsdGhpcy5wZXJmb3JtYW5jZUNsaWVudCk7cmV0dXJuIGE/dGhpcy5uZXN0ZWRBcHBBdXRoQWRhcHRlci50b0F1dGhlbnRpY2F0aW9uUmVzdWx0RnJvbUNhY2hlKHIsYSxzLG8sby5jb3JyZWxhdGlvbklkKToodGhpcy5sb2dnZXIudmVyYm9zZSgiTm8gY2FjaGVkIGlkIHRva2VuIGZvdW5kIiksUHJvbWlzZS5yZXNvbHZlKG51bGwpKX1hc3luYyBhY3F1aXJlVG9rZW5Qb3B1cChlKXtyZXR1cm4gdGhpcy5hY3F1aXJlVG9rZW5JbnRlcmFjdGl2ZShlKX1hY3F1aXJlVG9rZW5SZWRpcmVjdChlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YXN5bmMgYWNxdWlyZVRva2VuU2lsZW50KGUpe3JldHVybiB0aGlzLmFjcXVpcmVUb2tlblNpbGVudEludGVybmFsKGUpfWFjcXVpcmVUb2tlbkJ5Q29kZShlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YWNxdWlyZVRva2VuTmF0aXZlKGUsdCxyKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YWNxdWlyZVRva2VuQnlSZWZyZXNoVG9rZW4oZSx0KXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmV2ZW50SGFuZGxlci5hZGRFdmVudENhbGxiYWNrKGUsdCl9cmVtb3ZlRXZlbnRDYWxsYmFjayhlKXt0aGlzLmV2ZW50SGFuZGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGUpfWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpe3Rocm93IERsLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKX1nZXRBbGxBY2NvdW50cyhlKXtjb25zdCB0PXRoaXMuYnJvd3NlckNyeXB0by5jcmVhdGVOZXdHdWlkKCk7cmV0dXJuIE5jKHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdGhpcy5pc0Jyb3dzZXJFbnYoKSx0LGUpfWdldEFjY291bnQoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBVYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWNjb3VudEJ5VXNlcm5hbWUoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBMYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9Z2V0QWNjb3VudEJ5SG9tZUlkKGUpe2NvbnN0IHQ9dGhpcy5icm93c2VyQ3J5cHRvLmNyZWF0ZU5ld0d1aWQoKTtyZXR1cm4gRGMoZSx0aGlzLmxvZ2dlcix0aGlzLmJyb3dzZXJTdG9yYWdlLHQpfWdldEFjY291bnRCeUxvY2FsSWQoZSl7Y29uc3QgdD10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBIYyhlLHRoaXMubG9nZ2VyLHRoaXMuYnJvd3NlclN0b3JhZ2UsdCl9c2V0QWN0aXZlQWNjb3VudChlKXtjb25zdCB0PXRoaXMuYnJvd3NlckNyeXB0by5jcmVhdGVOZXdHdWlkKCk7cmV0dXJuIHhjKGUsdGhpcy5icm93c2VyU3RvcmFnZSx0KX1nZXRBY3RpdmVBY2NvdW50KCl7Y29uc3QgZT10aGlzLmJyb3dzZXJDcnlwdG8uY3JlYXRlTmV3R3VpZCgpO3JldHVybiBCYyh0aGlzLmJyb3dzZXJTdG9yYWdlLGUpfWhhbmRsZVJlZGlyZWN0UHJvbWlzZShlKXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpfWxvZ2luUG9wdXAoZSl7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuSW50ZXJhY3RpdmUoZXx8TnMpfWxvZ2luUmVkaXJlY3QoZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWxvZ291dChlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9bG9nb3V0UmVkaXJlY3QoZSl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWxvZ291dFBvcHVwKGUpe3Rocm93IERsLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKX1zc29TaWxlbnQoZSl7cmV0dXJuIHRoaXMuYWNxdWlyZVRva2VuU2lsZW50SW50ZXJuYWwoZSl9Z2V0VG9rZW5DYWNoZSgpe3Rocm93IERsLmNyZWF0ZVVuc3VwcG9ydGVkRXJyb3IoKX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5sb2dnZXJ9c2V0TG9nZ2VyKGUpe3RoaXMubG9nZ2VyPWV9aW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl7fXNldE5hdmlnYXRpb25DbGllbnQoZSl7dGhpcy5sb2dnZXIud2FybmluZygic2V0TmF2aWdhdGlvbkNsaWVudCBpcyBub3Qgc3VwcG9ydGVkIGluIG5lc3RlZCBhcHAgYXV0aCIpfWdldENvbmZpZ3VyYXRpb24oKXtyZXR1cm4gdGhpcy5jb25maWd9aXNCcm93c2VyRW52KCl7cmV0dXJuIHRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpfWdldEJyb3dzZXJDcnlwdG8oKXtyZXR1cm4gdGhpcy5icm93c2VyQ3J5cHRvfWdldFBlcmZvcm1hbmNlQ2xpZW50KCl7dGhyb3cgRGwuY3JlYXRlVW5zdXBwb3J0ZWRFcnJvcigpfWdldFJlZGlyZWN0UmVzcG9uc2UoKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YXN5bmMgY2xlYXJDYWNoZShlKXt0aHJvdyBEbC5jcmVhdGVVbnN1cHBvcnRlZEVycm9yKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7dGhpcy5sb2dnZXIudmVyYm9zZSgiaHlkcmF0ZUNhY2hlIGNhbGxlZCIpO2NvbnN0IHI9aHIuY3JlYXRlRnJvbUFjY291bnRJbmZvKGUuYWNjb3VudCxlLmNsb3VkR3JhcGhIb3N0TmFtZSxlLm1zR3JhcGhIb3N0KTtyZXR1cm4gYXdhaXQgdGhpcy5icm93c2VyU3RvcmFnZS5zZXRBY2NvdW50KHIsZS5jb3JyZWxhdGlvbklkLHVyKGUuaWRUb2tlbkNsYWltcykpLHRoaXMuYnJvd3NlclN0b3JhZ2UuaHlkcmF0ZUNhY2hlKGUsdCl9fWFzeW5jIGZ1bmN0aW9uIHhsKGUpe2NvbnN0IHQ9bmV3IGdjKGUpLHI9bmV3IHVjKGUpLG49W3QuaW5pdGlhbGl6ZSgpLHIuaW5pdGlhbGl6ZSgpXTtyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwobiksci5pc0F2YWlsYWJsZSgpJiZlLmF1dGguc3VwcG9ydHNOZXN0ZWRBcHBBdXRoP0hsLmNyZWF0ZUNvbnRyb2xsZXIocik6dC5pc0F2YWlsYWJsZSgpP05sLmNyZWF0ZUNvbnRyb2xsZXIodCk6bnVsbH1jbGFzcyBCbHtzdGF0aWMgYXN5bmMgY3JlYXRlUHVibGljQ2xpZW50QXBwbGljYXRpb24oZSl7Y29uc3QgdD1hd2FpdCBhc3luYyBmdW5jdGlvbihlLHQpe2NvbnN0IHI9bmV3IGdjKGUpO3JldHVybiBhd2FpdCByLmluaXRpYWxpemUoKSxObC5jcmVhdGVDb250cm9sbGVyKHIsdCl9KGUpO3JldHVybiBuZXcgQmwoZSx0KX1jb25zdHJ1Y3RvcihlLHQpe3RoaXMuaXNCcm9rZXI9ITEsdGhpcy5jb250cm9sbGVyPXR8fG5ldyBObChuZXcgZ2MoZSkpfWFzeW5jIGluaXRpYWxpemUoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5pbml0aWFsaXplKGUsdGhpcy5pc0Jyb2tlcil9YXN5bmMgYWNxdWlyZVRva2VuUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5Qb3B1cChlKX1hY3F1aXJlVG9rZW5SZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblJlZGlyZWN0KGUpfWFjcXVpcmVUb2tlblNpbGVudChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblNpbGVudChlKX1hY3F1aXJlVG9rZW5CeUNvZGUoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5CeUNvZGUoZSl9YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuYWRkRXZlbnRDYWxsYmFjayhlLHQpfXJlbW92ZUV2ZW50Q2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGUpfWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpfWdldEFjY291bnQoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY2NvdW50KGUpfWdldEFjY291bnRCeUhvbWVJZChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeUhvbWVJZChlKX1nZXRBY2NvdW50QnlMb2NhbElkKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjb3VudEJ5TG9jYWxJZChlKX1nZXRBY2NvdW50QnlVc2VybmFtZShlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeVVzZXJuYW1lKGUpfWdldEFsbEFjY291bnRzKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWxsQWNjb3VudHMoZSl9aGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpfWxvZ2luUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblBvcHVwKGUpfWxvZ2luUmVkaXJlY3QoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblJlZGlyZWN0KGUpfWxvZ291dChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dChlKX1sb2dvdXRSZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dFJlZGlyZWN0KGUpfWxvZ291dFBvcHVwKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIubG9nb3V0UG9wdXAoZSl9c3NvU2lsZW50KGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuc3NvU2lsZW50KGUpfWdldFRva2VuQ2FjaGUoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFRva2VuQ2FjaGUoKX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldExvZ2dlcigpfXNldExvZ2dlcihlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TG9nZ2VyKGUpfXNldEFjdGl2ZUFjY291bnQoZSl7dGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZUFjY291bnQoZSl9Z2V0QWN0aXZlQWNjb3VudCgpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWN0aXZlQWNjb3VudCgpfWluaXRpYWxpemVXcmFwcGVyTGlicmFyeShlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl9c2V0TmF2aWdhdGlvbkNsaWVudChlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TmF2aWdhdGlvbkNsaWVudChlKX1nZXRDb25maWd1cmF0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRDb25maWd1cmF0aW9uKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5oeWRyYXRlQ2FjaGUoZSx0KX1jbGVhckNhY2hlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuY2xlYXJDYWNoZShlKX19YXN5bmMgZnVuY3Rpb24gRmwoZSl7Y29uc3QgdD1uZXcgQmwoZSk7cmV0dXJuIGF3YWl0IHQuaW5pdGlhbGl6ZSgpLHR9Y2xhc3Mgemx7Y29uc3RydWN0b3IoZSl7dGhpcy5pbml0aWFsaXplZD0hMSx0aGlzLm9wZXJhdGluZ0NvbnRleHQ9ZSx0aGlzLmlzQnJvd3NlckVudmlyb25tZW50PXRoaXMub3BlcmF0aW5nQ29udGV4dC5pc0Jyb3dzZXJFbnZpcm9ubWVudCgpLHRoaXMuY29uZmlnPWUuZ2V0Q29uZmlnKCksdGhpcy5sb2dnZXI9ZS5nZXRMb2dnZXIoKSx0aGlzLnBlcmZvcm1hbmNlQ2xpZW50PXRoaXMuY29uZmlnLnRlbGVtZXRyeS5jbGllbnQsdGhpcy5icm93c2VyQ3J5cHRvPXRoaXMuaXNCcm93c2VyRW52aXJvbm1lbnQ/bmV3IHljKHRoaXMubG9nZ2VyLHRoaXMucGVyZm9ybWFuY2VDbGllbnQpOmZ0LHRoaXMuZXZlbnRIYW5kbGVyPW5ldyBGYyh0aGlzLmxvZ2dlciksdGhpcy5icm93c2VyU3RvcmFnZT10aGlzLmlzQnJvd3NlckVudmlyb25tZW50P25ldyBNYyh0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLHRoaXMuY29uZmlnLmNhY2hlLHRoaXMuYnJvd3NlckNyeXB0byx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyLHZvaWQgMCk6cWModGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCx0aGlzLmxvZ2dlcix0aGlzLnBlcmZvcm1hbmNlQ2xpZW50LHRoaXMuZXZlbnRIYW5kbGVyKX1nZXRCcm93c2VyU3RvcmFnZSgpe3JldHVybiB0aGlzLmJyb3dzZXJTdG9yYWdlfWdldEFjY291bnQoZSl7cmV0dXJuIG51bGx9Z2V0QWNjb3VudEJ5SG9tZUlkKGUpe3JldHVybiBudWxsfWdldEFjY291bnRCeUxvY2FsSWQoZSl7cmV0dXJuIG51bGx9Z2V0QWNjb3VudEJ5VXNlcm5hbWUoZSl7cmV0dXJuIG51bGx9Z2V0QWxsQWNjb3VudHMoKXtyZXR1cm5bXX1pbml0aWFsaXplKCl7cmV0dXJuIHRoaXMuaW5pdGlhbGl6ZWQ9ITAsUHJvbWlzZS5yZXNvbHZlKCl9YWNxdWlyZVRva2VuUG9wdXAoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319YWNxdWlyZVRva2VuUmVkaXJlY3QoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCksUHJvbWlzZS5yZXNvbHZlKCl9YWNxdWlyZVRva2VuU2lsZW50KGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWFjcXVpcmVUb2tlbkJ5Q29kZShlKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1hY3F1aXJlVG9rZW5OYXRpdmUoZSx0LHIpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWFjcXVpcmVUb2tlbkJ5UmVmcmVzaFRva2VuKGUsdCl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiBudWxsfXJlbW92ZUV2ZW50Q2FsbGJhY2soZSl7fWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCksIiJ9cmVtb3ZlUGVyZm9ybWFuY2VDYWxsYmFjayhlKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSwhMH1lbmFibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpe09hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCl9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX1oYW5kbGVSZWRpcmVjdFByb21pc2UoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLFByb21pc2UucmVzb2x2ZShudWxsKX1sb2dpblBvcHVwKGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWxvZ2luUmVkaXJlY3QoZSl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319bG9nb3V0KGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWxvZ291dFJlZGlyZWN0KGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWxvZ291dFBvcHVwKGUpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fXNzb1NpbGVudChlKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1nZXRUb2tlbkNhY2hlKCl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCkse319Z2V0TG9nZ2VyKCl7cmV0dXJuIHRoaXMubG9nZ2VyfXNldExvZ2dlcihlKXtPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpfXNldEFjdGl2ZUFjY291bnQoZSl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX1nZXRBY3RpdmVBY2NvdW50KCl7cmV0dXJuIE9hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCksbnVsbH1pbml0aWFsaXplV3JhcHBlckxpYnJhcnkoZSx0KXt0aGlzLmJyb3dzZXJTdG9yYWdlLnNldFdyYXBwZXJNZXRhZGF0YShlLHQpfXNldE5hdmlnYXRpb25DbGllbnQoZSl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX1nZXRDb25maWd1cmF0aW9uKCl7cmV0dXJuIHRoaXMuY29uZmlnfWlzQnJvd3NlckVudigpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLCEwfWdldEJyb3dzZXJDcnlwdG8oKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1nZXRQZXJmb3JtYW5jZUNsaWVudCgpe3JldHVybiBPYSh0aGlzLmluaXRpYWxpemVkKSxNYSgpLHt9fWdldFJlZGlyZWN0UmVzcG9uc2UoKXtyZXR1cm4gT2EodGhpcy5pbml0aWFsaXplZCksTWEoKSx7fX1hc3luYyBjbGVhckNhY2hlKGUpe09hKHRoaXMuaW5pdGlhbGl6ZWQpLE1hKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7T2EodGhpcy5pbml0aWFsaXplZCksTWEoKX19Y2xhc3MgS2wgZXh0ZW5kcyByY3tnZXRJZCgpe3JldHVybiBLbC5JRH1nZXRNb2R1bGVOYW1lKCl7cmV0dXJuIEtsLk1PRFVMRV9OQU1FfWFzeW5jIGluaXRpYWxpemUoKXtyZXR1cm4hMH19S2wuTU9EVUxFX05BTUU9IiIsS2wuSUQ9IlVua25vd25PcGVyYXRpbmdDb250ZXh0IjtjbGFzcyBHbHtzdGF0aWMgYXN5bmMgY3JlYXRlUHVibGljQ2xpZW50QXBwbGljYXRpb24oZSl7Y29uc3QgdD1hd2FpdCB4bChlKTtsZXQgcjtyZXR1cm4gcj1udWxsIT09dD9uZXcgR2woZSx0KTpuZXcgR2woZSkscn1jb25zdHJ1Y3RvcihlLHQpe2lmKHRoaXMuY29uZmlndXJhdGlvbj1lLHQpdGhpcy5jb250cm9sbGVyPXQ7ZWxzZXtjb25zdCB0PW5ldyBLbChlKTt0aGlzLmNvbnRyb2xsZXI9bmV3IHpsKHQpfX1hc3luYyBpbml0aWFsaXplKCl7aWYodGhpcy5jb250cm9sbGVyIGluc3RhbmNlb2Ygemwpe2NvbnN0IGU9YXdhaXQgeGwodGhpcy5jb25maWd1cmF0aW9uKTtyZXR1cm4gbnVsbCE9PWUmJih0aGlzLmNvbnRyb2xsZXI9ZSksdGhpcy5jb250cm9sbGVyLmluaXRpYWxpemUoKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCl9YXN5bmMgYWNxdWlyZVRva2VuUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5Qb3B1cChlKX1hY3F1aXJlVG9rZW5SZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblJlZGlyZWN0KGUpfWFjcXVpcmVUb2tlblNpbGVudChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmFjcXVpcmVUb2tlblNpbGVudChlKX1hY3F1aXJlVG9rZW5CeUNvZGUoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hY3F1aXJlVG9rZW5CeUNvZGUoZSl9YWRkRXZlbnRDYWxsYmFjayhlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuYWRkRXZlbnRDYWxsYmFjayhlLHQpfXJlbW92ZUV2ZW50Q2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVFdmVudENhbGxiYWNrKGUpfWFkZFBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5hZGRQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfXJlbW92ZVBlcmZvcm1hbmNlQ2FsbGJhY2soZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5yZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrKGUpfWVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmVuYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl9ZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzKCl7dGhpcy5jb250cm9sbGVyLmRpc2FibGVBY2NvdW50U3RvcmFnZUV2ZW50cygpfWdldEFjY291bnQoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRBY2NvdW50KGUpfWdldEFjY291bnRCeUhvbWVJZChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeUhvbWVJZChlKX1nZXRBY2NvdW50QnlMb2NhbElkKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWNjb3VudEJ5TG9jYWxJZChlKX1nZXRBY2NvdW50QnlVc2VybmFtZShlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldEFjY291bnRCeVVzZXJuYW1lKGUpfWdldEFsbEFjY291bnRzKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWxsQWNjb3VudHMoZSl9aGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaGFuZGxlUmVkaXJlY3RQcm9taXNlKGUpfWxvZ2luUG9wdXAoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblBvcHVwKGUpfWxvZ2luUmVkaXJlY3QoZSl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5sb2dpblJlZGlyZWN0KGUpfWxvZ291dChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dChlKX1sb2dvdXRSZWRpcmVjdChlKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmxvZ291dFJlZGlyZWN0KGUpfWxvZ291dFBvcHVwKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIubG9nb3V0UG9wdXAoZSl9c3NvU2lsZW50KGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuc3NvU2lsZW50KGUpfWdldFRva2VuQ2FjaGUoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldFRva2VuQ2FjaGUoKX1nZXRMb2dnZXIoKXtyZXR1cm4gdGhpcy5jb250cm9sbGVyLmdldExvZ2dlcigpfXNldExvZ2dlcihlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TG9nZ2VyKGUpfXNldEFjdGl2ZUFjY291bnQoZSl7dGhpcy5jb250cm9sbGVyLnNldEFjdGl2ZUFjY291bnQoZSl9Z2V0QWN0aXZlQWNjb3VudCgpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuZ2V0QWN0aXZlQWNjb3VudCgpfWluaXRpYWxpemVXcmFwcGVyTGlicmFyeShlLHQpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuaW5pdGlhbGl6ZVdyYXBwZXJMaWJyYXJ5KGUsdCl9c2V0TmF2aWdhdGlvbkNsaWVudChlKXt0aGlzLmNvbnRyb2xsZXIuc2V0TmF2aWdhdGlvbkNsaWVudChlKX1nZXRDb25maWd1cmF0aW9uKCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5nZXRDb25maWd1cmF0aW9uKCl9YXN5bmMgaHlkcmF0ZUNhY2hlKGUsdCl7cmV0dXJuIHRoaXMuY29udHJvbGxlci5oeWRyYXRlQ2FjaGUoZSx0KX1jbGVhckNhY2hlKGUpe3JldHVybiB0aGlzLmNvbnRyb2xsZXIuY2xlYXJDYWNoZShlKX19Y29uc3QgJGw9e2luaXRpYWxpemU6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWNxdWlyZVRva2VuUG9wdXA6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWNxdWlyZVRva2VuUmVkaXJlY3Q6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWNxdWlyZVRva2VuU2lsZW50OigpPT5Qcm9taXNlLnJlamVjdChJYShtYSkpLGFjcXVpcmVUb2tlbkJ5Q29kZTooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxnZXRBbGxBY2NvdW50czooKT0+W10sZ2V0QWNjb3VudDooKT0+bnVsbCxnZXRBY2NvdW50QnlIb21lSWQ6KCk9Pm51bGwsZ2V0QWNjb3VudEJ5VXNlcm5hbWU6KCk9Pm51bGwsZ2V0QWNjb3VudEJ5TG9jYWxJZDooKT0+bnVsbCxoYW5kbGVSZWRpcmVjdFByb21pc2U6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksbG9naW5Qb3B1cDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxsb2dpblJlZGlyZWN0OigpPT5Qcm9taXNlLnJlamVjdChJYShtYSkpLGxvZ291dDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxsb2dvdXRSZWRpcmVjdDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxsb2dvdXRQb3B1cDooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxzc29TaWxlbnQ6KCk9PlByb21pc2UucmVqZWN0KElhKG1hKSksYWRkRXZlbnRDYWxsYmFjazooKT0+bnVsbCxyZW1vdmVFdmVudENhbGxiYWNrOigpPT57fSxhZGRQZXJmb3JtYW5jZUNhbGxiYWNrOigpPT4iIixyZW1vdmVQZXJmb3JtYW5jZUNhbGxiYWNrOigpPT4hMSxlbmFibGVBY2NvdW50U3RvcmFnZUV2ZW50czooKT0+e30sZGlzYWJsZUFjY291bnRTdG9yYWdlRXZlbnRzOigpPT57fSxnZXRUb2tlbkNhY2hlOigpPT57dGhyb3cgSWEobWEpfSxnZXRMb2dnZXI6KCk9Pnt0aHJvdyBJYShtYSl9LHNldExvZ2dlcjooKT0+e30sc2V0QWN0aXZlQWNjb3VudDooKT0+e30sZ2V0QWN0aXZlQWNjb3VudDooKT0+bnVsbCxpbml0aWFsaXplV3JhcHBlckxpYnJhcnk6KCk9Pnt9LHNldE5hdmlnYXRpb25DbGllbnQ6KCk9Pnt9LGdldENvbmZpZ3VyYXRpb246KCk9Pnt0aHJvdyBJYShtYSl9LGh5ZHJhdGVDYWNoZTooKT0+UHJvbWlzZS5yZWplY3QoSWEobWEpKSxjbGVhckNhY2hlOigpPT5Qcm9taXNlLnJlamVjdChJYShtYSkpfTtmdW5jdGlvbiBRbCgpe2xldCBlO3RyeXtlPXdpbmRvd1tDcy5TZXNzaW9uU3RvcmFnZV07Y29uc3QgdD1lPy5nZXRJdGVtKEphKTtpZigxPT09TnVtYmVyKHQpKXJldHVybiBQcm9taXNlLnJlc29sdmUoKS50aGVuKChmdW5jdGlvbigpe3JldHVybiBKbH0pKX1jYXRjaChlKXt9fWZ1bmN0aW9uIGpsKCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJnZvaWQgMCE9PXdpbmRvdy5wZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3d9ZnVuY3Rpb24gV2woZSl7aWYoZSYmamwoKSlyZXR1cm4gTWF0aC5yb3VuZCh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktZSl9Y2xhc3MgVmx7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmNvcnJlbGF0aW9uSWQ9dCx0aGlzLm1lYXN1cmVOYW1lPVZsLm1ha2VNZWFzdXJlTmFtZShlLHQpLHRoaXMuc3RhcnRNYXJrPVZsLm1ha2VTdGFydE1hcmsoZSx0KSx0aGlzLmVuZE1hcms9VmwubWFrZUVuZE1hcmsoZSx0KX1zdGF0aWMgbWFrZU1lYXN1cmVOYW1lKGUsdCl7cmV0dXJuYG1zYWwubWVhc3VyZS4ke2V9LiR7dH1gfXN0YXRpYyBtYWtlU3RhcnRNYXJrKGUsdCl7cmV0dXJuYG1zYWwuc3RhcnQuJHtlfS4ke3R9YH1zdGF0aWMgbWFrZUVuZE1hcmsoZSx0KXtyZXR1cm5gbXNhbC5lbmQuJHtlfS4ke3R9YH1zdGF0aWMgc3VwcG9ydHNCcm93c2VyUGVyZm9ybWFuY2UoKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmdm9pZCAwIT09d2luZG93LnBlcmZvcm1hbmNlJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLm1hcmsmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UubWVhc3VyZSYmImZ1bmN0aW9uIj09dHlwZW9mIHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhck1hcmtzJiYiZnVuY3Rpb24iPT10eXBlb2Ygd2luZG93LnBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMmJiJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cucGVyZm9ybWFuY2UuZ2V0RW50cmllc0J5TmFtZX1zdGF0aWMgZmx1c2hNZWFzdXJlbWVudHMoZSx0KXtpZihWbC5zdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZSgpKXRyeXt0LmZvckVhY2goKHQ9Pntjb25zdCByPVZsLm1ha2VNZWFzdXJlTmFtZSh0Lm5hbWUsZSk7d2luZG93LnBlcmZvcm1hbmNlLmdldEVudHJpZXNCeU5hbWUociwibWVhc3VyZSIpLmxlbmd0aD4wJiYod2luZG93LnBlcmZvcm1hbmNlLmNsZWFyTWVhc3VyZXMociksd2luZG93LnBlcmZvcm1hbmNlLmNsZWFyTWFya3MoVmwubWFrZVN0YXJ0TWFyayhyLGUpKSx3aW5kb3cucGVyZm9ybWFuY2UuY2xlYXJNYXJrcyhWbC5tYWtlRW5kTWFyayhyLGUpKSl9KSl9Y2F0Y2goZSl7fX1zdGFydE1lYXN1cmVtZW50KCl7aWYoVmwuc3VwcG9ydHNCcm93c2VyUGVyZm9ybWFuY2UoKSl0cnl7d2luZG93LnBlcmZvcm1hbmNlLm1hcmsodGhpcy5zdGFydE1hcmspfWNhdGNoKGUpe319ZW5kTWVhc3VyZW1lbnQoKXtpZihWbC5zdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZSgpKXRyeXt3aW5kb3cucGVyZm9ybWFuY2UubWFyayh0aGlzLmVuZE1hcmspLHdpbmRvdy5wZXJmb3JtYW5jZS5tZWFzdXJlKHRoaXMubWVhc3VyZU5hbWUsdGhpcy5zdGFydE1hcmssdGhpcy5lbmRNYXJrKX1jYXRjaChlKXt9fWZsdXNoTWVhc3VyZW1lbnQoKXtpZihWbC5zdXBwb3J0c0Jyb3dzZXJQZXJmb3JtYW5jZSgpKXRyeXtjb25zdCBlPXdpbmRvdy5wZXJmb3JtYW5jZS5nZXRFbnRyaWVzQnlOYW1lKHRoaXMubWVhc3VyZU5hbWUsIm1lYXN1cmUiKTtpZihlLmxlbmd0aD4wKXtjb25zdCB0PWVbMF0uZHVyYXRpb247cmV0dXJuIHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhck1lYXN1cmVzKHRoaXMubWVhc3VyZU5hbWUpLHdpbmRvdy5wZXJmb3JtYW5jZS5jbGVhck1hcmtzKHRoaXMuc3RhcnRNYXJrKSx3aW5kb3cucGVyZm9ybWFuY2UuY2xlYXJNYXJrcyh0aGlzLmVuZE1hcmspLHR9fWNhdGNoKGUpe31yZXR1cm4gbnVsbH19dmFyIEpsPU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLEJyb3dzZXJQZXJmb3JtYW5jZU1lYXN1cmVtZW50OlZsfSk7ZS5BY2NvdW50RW50aXR5PWhyLGUuQXBpSWQ9TXMsZS5BdXRoRXJyb3I9Q2UsZS5BdXRoRXJyb3JDb2Rlcz1tZSxlLkF1dGhFcnJvck1lc3NhZ2U9eWUsZS5BdXRoZW50aWNhdGlvbkhlYWRlclBhcnNlcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmhlYWRlcnM9ZX1nZXRTaHJOb25jZSgpe2NvbnN0IGU9dGhpcy5oZWFkZXJzW3ldO2lmKGUpe2NvbnN0IHQ9dGhpcy5wYXJzZUNoYWxsZW5nZXMoZSk7aWYodC5uZXh0bm9uY2UpcmV0dXJuIHQubmV4dG5vbmNlO3Rocm93IEp0KHh0KX1jb25zdCB0PXRoaXMuaGVhZGVyc1tmXTtpZih0KXtjb25zdCBlPXRoaXMucGFyc2VDaGFsbGVuZ2VzKHQpO2lmKGUubm9uY2UpcmV0dXJuIGUubm9uY2U7dGhyb3cgSnQoeHQpfXRocm93IEp0KEh0KX1wYXJzZUNoYWxsZW5nZXMoZSl7Y29uc3Qgcj1lLmluZGV4T2YoIiAiKSxuPWUuc3Vic3RyKHIrMSkuc3BsaXQoIiwiKSxvPXt9O3JldHVybiBuLmZvckVhY2goKGU9Pntjb25zdFtyLG5dPWUuc3BsaXQoIj0iKTtvW3JdPXVuZXNjYXBlKG4ucmVwbGFjZSgvWyciXSsvZyx0LkVNUFRZX1NUUklORykpfSkpLG99fQovKiEgQGF6dXJlL21zYWwtY29tbW9uIHYxNS4xMy4zIDIwMjUtMTItMDQgKi8sZS5BdXRoZW50aWNhdGlvblNjaGVtZT1XLGUuQXp1cmVDbG91ZEluc3RhbmNlPUl0LGUuQnJvd3NlckF1dGhFcnJvcj1YaSxlLkJyb3dzZXJBdXRoRXJyb3JDb2Rlcz1XaSxlLkJyb3dzZXJBdXRoRXJyb3JNZXNzYWdlPVlpLGUuQnJvd3NlckNhY2hlTG9jYXRpb249Q3MsZS5Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvcj12YSxlLkJyb3dzZXJDb25maWd1cmF0aW9uQXV0aEVycm9yQ29kZXM9eWEsZS5Ccm93c2VyQ29uZmlndXJhdGlvbkF1dGhFcnJvck1lc3NhZ2U9d2EsZS5Ccm93c2VyUGVyZm9ybWFuY2VDbGllbnQ9Y2xhc3MgZXh0ZW5kcyBKb3tjb25zdHJ1Y3RvcihlLHIsbil7c3VwZXIoZS5hdXRoLmNsaWVudElkLGUuYXV0aC5hdXRob3JpdHl8fGAke3QuREVGQVVMVF9BVVRIT1JJVFl9YCxuZXcgQ3QoZS5zeXN0ZW0/LmxvZ2dlck9wdGlvbnN8fHt9LEdhLCRhKSxHYSwkYSxlLnRlbGVtZXRyeT8uYXBwbGljYXRpb258fHthcHBOYW1lOiIiLGFwcFZlcnNpb246IiJ9LHIsbil9Z2VuZXJhdGVJZCgpe3JldHVybiBvYSgpfWdldFBhZ2VWaXNpYmlsaXR5KCl7cmV0dXJuIGRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZT8udG9TdHJpbmcoKXx8bnVsbH1kZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKGUpe1FsKCk/LnRoZW4oKHQ9Pntjb25zdCByPXRoaXMuZXZlbnRzQnlDb3JyZWxhdGlvbklkLmdldChlLmV2ZW50LmNvcnJlbGF0aW9uSWQpLG49ciYmci5ldmVudElkPT09ZS5ldmVudC5ldmVudElkLG89W107biYmcj8uaW5jb21wbGV0ZVN1Yk1lYXN1cmVtZW50cyYmci5pbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzLmZvckVhY2goKGU9PntvLnB1c2goey4uLmV9KX0pKSx0LkJyb3dzZXJQZXJmb3JtYW5jZU1lYXN1cmVtZW50LmZsdXNoTWVhc3VyZW1lbnRzKGUuZXZlbnQuY29ycmVsYXRpb25JZCxvKX0pKX1zdGFydE1lYXN1cmVtZW50KGUsdCl7Y29uc3Qgcj10aGlzLmdldFBhZ2VWaXNpYmlsaXR5KCksbj1zdXBlci5zdGFydE1lYXN1cmVtZW50KGUsdCksbz1qbCgpP3dpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTp2b2lkIDAsaT1RbCgpPy50aGVuKCh0PT5uZXcgdC5Ccm93c2VyUGVyZm9ybWFuY2VNZWFzdXJlbWVudChlLG4uZXZlbnQuY29ycmVsYXRpb25JZCkpKTtyZXR1cm4gaT8udGhlbigoZT0+ZS5zdGFydE1lYXN1cmVtZW50KCkpKSx7Li4ubixlbmQ6KGUsdCxzKT0+e2NvbnN0IGE9bi5lbmQoey4uLmUsc3RhcnRQYWdlVmlzaWJpbGl0eTpyLGVuZFBhZ2VWaXNpYmlsaXR5OnRoaXMuZ2V0UGFnZVZpc2liaWxpdHkoKSxkdXJhdGlvbk1zOldsKG8pfSx0LHMpO3JldHVybiBpPy50aGVuKChlPT5lLmVuZE1lYXN1cmVtZW50KCkpKSx0aGlzLmRlbGV0ZUluY29tcGxldGVTdWJNZWFzdXJlbWVudHMobiksYX0sZGlzY2FyZDooKT0+e24uZGlzY2FyZCgpLGk/LnRoZW4oKGU9PmUuZmx1c2hNZWFzdXJlbWVudCgpKSksdGhpcy5kZWxldGVJbmNvbXBsZXRlU3ViTWVhc3VyZW1lbnRzKG4pfX19c2V0UHJlUXVldWVUaW1lKGUsdCl7aWYoIWpsKCkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogd2luZG93IHBlcmZvcm1hbmNlIEFQSSBub3QgYXZhaWxhYmxlLCB1bmFibGUgdG8gc2V0IHRlbGVtZXRyeSBxdWV1ZSB0aW1lIGZvciAke2V9YCk7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogY29ycmVsYXRpb25JZCBmb3IgJHtlfSBub3QgcHJvdmlkZWQsIHVuYWJsZSB0byBzZXQgdGVsZW1ldHJ5IHF1ZXVlIHRpbWVgKTtjb25zdCByPXRoaXMucHJlUXVldWVUaW1lQnlDb3JyZWxhdGlvbklkLmdldCh0KTtyJiYodGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogSW5jb21wbGV0ZSBwcmUtcXVldWUgJHtyLm5hbWV9IGZvdW5kYCx0KSx0aGlzLmFkZFF1ZXVlTWVhc3VyZW1lbnQoci5uYW1lLHQsdm9pZCAwLCEwKSksdGhpcy5wcmVRdWV1ZVRpbWVCeUNvcnJlbGF0aW9uSWQuc2V0KHQse25hbWU6ZSx0aW1lOndpbmRvdy5wZXJmb3JtYW5jZS5ub3coKX0pfWFkZFF1ZXVlTWVhc3VyZW1lbnQoZSx0LHIsbil7aWYoIWpsKCkpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogd2luZG93IHBlcmZvcm1hbmNlIEFQSSBub3QgYXZhaWxhYmxlLCB1bmFibGUgdG8gYWRkIHF1ZXVlIG1lYXN1cmVtZW50IGZvciAke2V9YCk7aWYoIXQpcmV0dXJuIHZvaWQgdGhpcy5sb2dnZXIudHJhY2UoYEJyb3dzZXJQZXJmb3JtYW5jZUNsaWVudDogY29ycmVsYXRpb25JZCBmb3IgJHtlfSBub3QgcHJvdmlkZWQsIHVuYWJsZSB0byBhZGQgcXVldWUgbWVhc3VyZW1lbnRgKTtjb25zdCBvPXN1cGVyLmdldFByZVF1ZXVlVGltZShlLHQpO2lmKCFvKXJldHVybjtjb25zdCBpPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKSxzPXJ8fHN1cGVyLmNhbGN1bGF0ZVF1ZXVlZFRpbWUobyxpKTtyZXR1cm4gc3VwZXIuYWRkUXVldWVNZWFzdXJlbWVudChlLHQscyxuKX19LGUuQnJvd3NlclBlcmZvcm1hbmNlTWVhc3VyZW1lbnQ9VmwsZS5Ccm93c2VyVXRpbHM9SGEsZS5DYWNoZUxvb2t1cFBvbGljeT1EcyxlLkNsaWVudEF1dGhFcnJvcj1wdCxlLkNsaWVudEF1dGhFcnJvckNvZGVzPWR0LGUuQ2xpZW50QXV0aEVycm9yTWVzc2FnZT1ndCxlLkNsaWVudENvbmZpZ3VyYXRpb25FcnJvcj1WdCxlLkNsaWVudENvbmZpZ3VyYXRpb25FcnJvckNvZGVzPVF0LGUuQ2xpZW50Q29uZmlndXJhdGlvbkVycm9yTWVzc2FnZT1XdCxlLkRFRkFVTFRfSUZSQU1FX1RJTUVPVVRfTVM9S2EsZS5FdmVudEhhbmRsZXI9RmMsZS5FdmVudE1lc3NhZ2VVdGlscz1jbGFzc3tzdGF0aWMgZ2V0SW50ZXJhY3Rpb25TdGF0dXNGcm9tRXZlbnQodCxyKXtzd2l0Y2godC5ldmVudFR5cGUpe2Nhc2UgX2MuTE9HSU5fU1RBUlQ6cmV0dXJuIHFzLkxvZ2luO2Nhc2UgX2MuU1NPX1NJTEVOVF9TVEFSVDpyZXR1cm4gcXMuU3NvU2lsZW50O2Nhc2UgX2MuQUNRVUlSRV9UT0tFTl9TVEFSVDppZih0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0fHx0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwKXJldHVybiBxcy5BY3F1aXJlVG9rZW47YnJlYWs7Y2FzZSBfYy5IQU5ETEVfUkVESVJFQ1RfU1RBUlQ6cmV0dXJuIHFzLkhhbmRsZVJlZGlyZWN0O2Nhc2UgX2MuTE9HT1VUX1NUQVJUOnJldHVybiBxcy5Mb2dvdXQ7Y2FzZSBfYy5TU09fU0lMRU5UX1NVQ0NFU1M6Y2FzZSBfYy5TU09fU0lMRU5UX0ZBSUxVUkU6aWYociYmciE9PXFzLlNzb1NpbGVudClicmVhaztyZXR1cm4gcXMuTm9uZTtjYXNlIF9jLkxPR09VVF9FTkQ6aWYociYmciE9PXFzLkxvZ291dClicmVhaztyZXR1cm4gcXMuTm9uZTtjYXNlIF9jLkhBTkRMRV9SRURJUkVDVF9FTkQ6aWYociYmciE9PXFzLkhhbmRsZVJlZGlyZWN0KWJyZWFrO3JldHVybiBxcy5Ob25lO2Nhc2UgX2MuTE9HSU5fU1VDQ0VTUzpjYXNlIF9jLkxPR0lOX0ZBSUxVUkU6Y2FzZSBfYy5BQ1FVSVJFX1RPS0VOX1NVQ0NFU1M6Y2FzZSBfYy5BQ1FVSVJFX1RPS0VOX0ZBSUxVUkU6Y2FzZSBfYy5SRVNUT1JFX0ZST01fQkZDQUNIRTppZih0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlJlZGlyZWN0fHx0LmludGVyYWN0aW9uVHlwZT09PWUuSW50ZXJhY3Rpb25UeXBlLlBvcHVwKXtpZihyJiZyIT09cXMuTG9naW4mJnIhPT1xcy5BY3F1aXJlVG9rZW4pYnJlYWs7cmV0dXJuIHFzLk5vbmV9fXJldHVybiBudWxsfX0sZS5FdmVudFR5cGU9X2MsZS5JbnRlcmFjdGlvblJlcXVpcmVkQXV0aEVycm9yPUFvLGUuSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvckNvZGVzPUNvLGUuSW50ZXJhY3Rpb25SZXF1aXJlZEF1dGhFcnJvck1lc3NhZ2U9VG8sZS5JbnRlcmFjdGlvblN0YXR1cz1xcyxlLkpzb25XZWJUb2tlblR5cGVzPXVlLGUuTG9jYWxTdG9yYWdlPUVjLGUuTG9nZ2VyPUN0LGUuTWVtb3J5U3RvcmFnZT1tYyxlLk5hdmlnYXRpb25DbGllbnQ9eGEsZS5PSURDX0RFRkFVTFRfU0NPUEVTPWgsZS5QZXJmb3JtYW5jZUV2ZW50cz1PcixlLlByb21wdFZhbHVlPWIsZS5Qcm90b2NvbE1vZGU9bHIsZS5QdWJsaWNDbGllbnRBcHBsaWNhdGlvbj1CbCxlLlB1YmxpY0NsaWVudE5leHQ9R2wsZS5TZXJ2ZXJFcnJvcj1ubyxlLlNlcnZlclJlc3BvbnNlVHlwZT1fLGUuU2Vzc2lvblN0b3JhZ2U9UmMsZS5TaWduZWRIdHRwUmVxdWVzdD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe2NvbnN0IHI9dCYmdC5sb2dnZXJPcHRpb25zfHx7fTt0aGlzLmxvZ2dlcj1uZXcgQ3QocixHYSwkYSksdGhpcy5jcnlwdG9PcHM9bmV3IHljKHRoaXMubG9nZ2VyKSx0aGlzLnBvcFRva2VuR2VuZXJhdG9yPW5ldyBSbyh0aGlzLmNyeXB0b09wcyksdGhpcy5zaHJQYXJhbWV0ZXJzPWV9YXN5bmMgZ2VuZXJhdGVQdWJsaWNLZXlUaHVtYnByaW50KCl7Y29uc3R7a2lkOmV9PWF3YWl0IHRoaXMucG9wVG9rZW5HZW5lcmF0b3IuZ2VuZXJhdGVLaWQodGhpcy5zaHJQYXJhbWV0ZXJzKTtyZXR1cm4gZX1hc3luYyBzaWduUmVxdWVzdChlLHQscil7cmV0dXJuIHRoaXMucG9wVG9rZW5HZW5lcmF0b3Iuc2lnblBheWxvYWQoZSx0LHRoaXMuc2hyUGFyYW1ldGVycyxyKX1hc3luYyByZW1vdmVLZXlzKGUpe3JldHVybiB0aGlzLmNyeXB0b09wcy5yZW1vdmVUb2tlbkJpbmRpbmdLZXkoZSkudGhlbigoKCk9PiEwKSkuY2F0Y2goKGU9PntpZihlIGluc3RhbmNlb2YgcHQmJmUuZXJyb3JDb2RlPT09cnQpcmV0dXJuITE7dGhyb3cgZX0pKX19LGUuU3RyaW5nVXRpbHM9WXQsZS5TdHViUGVyZm9ybWFuY2VDbGllbnQ9SHIsZS5VcmxTdHJpbmc9d3IsZS5XcmFwcGVyU0tVPXtSZWFjdDoiQGF6dXJlL21zYWwtcmVhY3QiLEFuZ3VsYXI6IkBhenVyZS9tc2FsLWFuZ3VsYXIifSxlLmNyZWF0ZU5lc3RhYmxlUHVibGljQ2xpZW50QXBwbGljYXRpb249YXN5bmMgZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgdWMoZSk7aWYoYXdhaXQgdC5pbml0aWFsaXplKCksdC5pc0F2YWlsYWJsZSgpKXtjb25zdCByPW5ldyBIbCh0KSxuPW5ldyBCbChlLHIpO3JldHVybiBhd2FpdCBuLmluaXRpYWxpemUoKSxufXJldHVybiBGbChlKX0sZS5jcmVhdGVTdGFuZGFyZFB1YmxpY0NsaWVudEFwcGxpY2F0aW9uPUZsLGUuaXNQbGF0Zm9ybUJyb2tlckF2YWlsYWJsZT1hc3luYyBmdW5jdGlvbihlLHQscixuKXtjb25zdCBvPW5ldyBDdChlfHx7fSxHYSwkYSk7by50cmFjZSgiaXNQbGF0Zm9ybUJyb2tlckF2YWlsYWJsZSBjYWxsZWQiKTtjb25zdCBpPXR8fG5ldyBIcjtyZXR1cm4idW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvdz8oby50cmFjZSgiTm9uLWJyb3dzZXIgZW52aXJvbm1lbnQgZGV0ZWN0ZWQsIHJldHVybmluZyBmYWxzZSIpLCExKTohIWF3YWl0IGZsKG8saSxyfHxvYSgpLHZvaWQgMCxuKX0sZS5zdHViYmVkUHVibGljQ2xpZW50QXBwbGljYXRpb249JGwsZS52ZXJzaW9uPSRhfSkpOwo=</File>
        <File Permission="660" Location="var/httpd/htdocs/js/thirdparty/msal-browser-4.27.0/LICENSE.txt" Encode="Base64">TUlUIExpY2Vuc2UKCkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQpTT0ZUV0FSRS4KCi0tLQoKTVNBTC5qcyAoTWljcm9zb2Z0IEF1dGhlbnRpY2F0aW9uIExpYnJhcnkgZm9yIEphdmFTY3JpcHQpClZlcnNpb246IDQuMjcuMApTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9BenVyZUFEL21pY3Jvc29mdC1hdXRoZW50aWNhdGlvbi1saWJyYXJ5LWZvci1qcwpOUE06IGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL0BhenVyZS9tc2FsLWJyb3dzZXIK</File>

        <!-- CSS -->
        <File Permission="660" Location="var/httpd/htdocs/skins/Agent/default/css/Core.Agent.Collaboration.css" Encode="Base64">LyoqCiAqIFpudW55IENvbGxhYm9yYXRpb24gQWRkLW9uIC0gU3R5bGVzCiAqCiAqIERlc2lnbiBQaGlsb3NvcGh5OgogKiAtIFpudW55LW5hdGl2ZSBsb29rIGFuZCBmZWVsIChub3QgTWljcm9zb2Z0L1RlYW1zIGluc3BpcmVkKQogKiAtIFVzZSBabnVueSBjb2xvciBwYWxldHRlIGFuZCBleGlzdGluZyBwYXR0ZXJucwogKiAtIFN1YnRsZSBpbnRlZ3JhdGlvbiB0aGF0IGRvZXNuJ3QgZGlzdHJhY3QgZnJvbSB0aWNrZXQgd29yawogKi8KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBDU1MgVmFyaWFibGVzIC0gWm51bnkgQ29sb3IgUGFsZXR0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgo6cm9vdCB7CiAgICAvKiBQcmVzZW5jZSBjb2xvcnMgLSBabnVueS1uYXRpdmUgcGFsZXR0ZSAqLwogICAgLS1jb2xsYWItcHJlc2VuY2UtYXZhaWxhYmxlOiAjNWNiODVjOyAgICAgLyogR3JlZW4gLSBhdmFpbGFibGUgKi8KICAgIC0tY29sbGFiLXByZXNlbmNlLWJ1c3k6ICNkOTUzNGY7ICAgICAgICAgIC8qIFJlZCAtIGJ1c3kvaW4gY2FsbCAqLwogICAgLS1jb2xsYWItcHJlc2VuY2UtYXdheTogI2YwYWQ0ZTsgICAgICAgICAgLyogWWVsbG93L09yYW5nZSAtIGF3YXkgKi8KICAgIC0tY29sbGFiLXByZXNlbmNlLWRuZDogI2Q5NTM0ZjsgICAgICAgICAgIC8qIFJlZCAtIGRvIG5vdCBkaXN0dXJiICovCiAgICAtLWNvbGxhYi1wcmVzZW5jZS1vZmZsaW5lOiAjOTk5OyAgICAgICAgICAvKiBHcmF5IC0gb2ZmbGluZSAqLwogICAgLS1jb2xsYWItcHJlc2VuY2UtdW5rbm93bjogIzk5OTsgICAgICAgICAgLyogR3JheSAtIHVua25vd24gKi8KCiAgICAvKiBVSSBjb2xvcnMgKi8KICAgIC0tY29sbGFiLWhvdmVyLWJnOiAjZjVmNWY1OwogICAgLS1jb2xsYWItYm9yZGVyOiAjZGRkOwogICAgLS1jb2xsYWItc2hhZG93OiByZ2JhKDAsIDAsIDAsIDAuMTUpOwogICAgLS1jb2xsYWItbGluazogI2Y5MjsgICAgICAgICAgICAgICAgICAgICAgLyogWm51bnkgb3JhbmdlICovCiAgICAtLWNvbGxhYi1saW5rLWhvdmVyOiAjZTgwOwogICAgLS1jb2xsYWItdGV4dDogIzMzMzsKICAgIC0tY29sbGFiLXRleHQtbXV0ZWQ6ICM3Nzc7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBBdmF0YXIgQ29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiQXZhdGFyIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi8qIEF2YXRhciBzaXplcyAqLwouQ29sbGFiQXZhdGFyLS1zbWFsbCB7CiAgICB3aWR0aDogMjRweDsKICAgIGhlaWdodDogMjRweDsKfQoKLkNvbGxhYkF2YXRhci0tbWVkaXVtIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgouQ29sbGFiQXZhdGFyLS1sYXJnZSB7CiAgICB3aWR0aDogNDhweDsKICAgIGhlaWdodDogNDhweDsKfQoKLkNvbGxhYkF2YXRhci0teGxhcmdlIHsKICAgIHdpZHRoOiA2NHB4OwogICAgaGVpZ2h0OiA2NHB4Owp9CgovKiBBdmF0YXIgaW1hZ2UgKi8KLkNvbGxhYkF2YXRhcl9faW1hZ2UgewogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBvYmplY3QtZml0OiBjb3ZlcjsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1ob3Zlci1iZyk7Cn0KCi8qIEZhbGxiYWNrIGF2YXRhciAoaW5pdGlhbHMpICovCi5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiAxMDAlOwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgYmFja2dyb3VuZC1jb2xvcjogIzYwN2Q4YjsKICAgIGNvbG9yOiAjZmZmOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgouQ29sbGFiQXZhdGFyLS1zbWFsbCAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDEwcHg7Cn0KCi5Db2xsYWJBdmF0YXItLW1lZGl1bSAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5Db2xsYWJBdmF0YXItLWxhcmdlIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKfQoKLkNvbGxhYkF2YXRhci0teGxhcmdlIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKfQoKLyogQ2xpY2thYmxlIGF2YXRhciAoZm9yIHN0YW5kYWxvbmUgYXZhdGFycyBsaWtlIGFydGljbGUgYXZhdGFycykgKi8KLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLyogSG92ZXIgcmluZyBvbiBhdmF0YXIgY29udGFpbmVyIChub3Qgb24gaW1hZ2UpIGZvciBzZWFtbGVzcyBhcHBlYXJhbmNlICovCi5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciB7CiAgICBib3gtc2hhZG93OiAwIDAgMCAycHggdmFyKC0tY29sbGFiLWxpbmspOwp9CgouQ29sbGFiQXZhdGFyLS1jbGlja2FibGU6aG92ZXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qIEhvdmVyIHRyaWdnZXIgZm9yIGJhZGdlIGNvbnRhaW5lcnMgKEhlYWRlclVzZXJCYWRnZSwgQ3VzdG9tZXJJbmZvIHdpZGdldCkgKi8KLkNvbGxhYkhvdmVyVHJpZ2dlciB7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi8qIFNob3cgcmluZyBvbiBhdmF0YXIgd2hlbiBiYWRnZSBjb250YWluZXIgaXMgaG92ZXJlZCAqLwouQ29sbGFiSG92ZXJUcmlnZ2VyOmhvdmVyIC5Db2xsYWJBdmF0YXIgewogICAgYm94LXNoYWRvdzogMCAwIDAgMnB4IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLkNvbGxhYkhvdmVyVHJpZ2dlcjpob3ZlciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkNvbGxhYkhvdmVyVHJpZ2dlcjpob3ZlciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBvcGFjaXR5OiAwLjk7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBQcmVzZW5jZSBJbmRpY2F0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiUHJlc2VuY2UgewogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgYm90dG9tOiAwOwogICAgcmlnaHQ6IDA7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICBib3JkZXI6IDJweCBzb2xpZCAjZmZmOwogICAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi8qIFByZXNlbmNlIHNpemVzIGJhc2VkIG9uIGF2YXRhciBzaXplICovCi5Db2xsYWJBdmF0YXItLXNtYWxsIC5Db2xsYWJQcmVzZW5jZSB7CiAgICB3aWR0aDogOHB4OwogICAgaGVpZ2h0OiA4cHg7CiAgICBib3JkZXItd2lkdGg6IDFweDsKfQoKLkNvbGxhYkF2YXRhci0tbWVkaXVtIC5Db2xsYWJQcmVzZW5jZSB7CiAgICB3aWR0aDogMTBweDsKICAgIGhlaWdodDogMTBweDsKfQoKLkNvbGxhYkF2YXRhci0tbGFyZ2UgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4Owp9CgouQ29sbGFiQXZhdGFyLS14bGFyZ2UgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxNHB4OwogICAgaGVpZ2h0OiAxNHB4Owp9CgovKiBQcmVzZW5jZSBzdGF0dXMgY29sb3JzIGFuZCBpY29ucyAqLwovKiBOb3RlOiBBbGwgcHJlc2VuY2UgaW5kaWNhdG9ycyBpbmhlcml0IHBvc2l0aW9uOmFic29sdXRlIGZyb20gYmFzZSAuQ29sbGFiUHJlc2VuY2UgKi8KCi8qIEF2YWlsYWJsZSAtIGdyZWVuIHdpdGggc21hbGwgd2hpdGUgY2hlY2ttYXJrICovCi5Db2xsYWJQcmVzZW5jZS0tYXZhaWxhYmxlIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1wcmVzZW5jZS1hdmFpbGFibGUpOwp9Ci5Db2xsYWJQcmVzZW5jZS0tYXZhaWxhYmxlOjphZnRlciB7CiAgICBjb250ZW50OiAnJzsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHRvcDogMzUlOwogICAgbGVmdDogNTAlOwogICAgd2lkdGg6IDI1JTsKICAgIGhlaWdodDogNDUlOwogICAgYm9yZGVyOiBzb2xpZCAjZmZmOwogICAgYm9yZGVyLXdpZHRoOiAwIDEuNXB4IDEuNXB4IDA7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKSByb3RhdGUoNDVkZWcpOwp9CgovKiBCdXN5IC0gc29saWQgcmVkIChubyBpY29uKSAqLwouQ29sbGFiUHJlc2VuY2UtLWJ1c3ksCi5Db2xsYWJQcmVzZW5jZS0taW5jYWxsLAouQ29sbGFiUHJlc2VuY2UtLWlubWVldGluZyB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xsYWItcHJlc2VuY2UtYnVzeSk7Cn0KCi8qIEF3YXkgLSB5ZWxsb3cvb3JhbmdlIHNvbGlkIChubyBpY29uKSAqLwouQ29sbGFiUHJlc2VuY2UtLWF3YXkgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sbGFiLXByZXNlbmNlLWF3YXkpOwp9CgovKiBCZSByaWdodCBiYWNrIC0geWVsbG93L29yYW5nZSBzb2xpZCAobm8gaWNvbikgKi8KLkNvbGxhYlByZXNlbmNlLS1iZXJpZ2h0YmFjayB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xsYWItcHJlc2VuY2UtYXdheSk7Cn0KCi8qIERvIG5vdCBkaXN0dXJiIC0gcmVkIHdpdGggd2hpdGUgbWludXMgKi8KLkNvbGxhYlByZXNlbmNlLS1kbmQgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sbGFiLXByZXNlbmNlLWRuZCk7Cn0KLkNvbGxhYlByZXNlbmNlLS1kbmQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHdpZHRoOiA2MCU7CiAgICBoZWlnaHQ6IDJweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi8qIE9mZmxpbmUgLSBncmF5IHdpdGggc21hbGwgd2hpdGUgWCAqLwouQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmUgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tY29sbGFiLXByZXNlbmNlLW9mZmxpbmUpOwp9Ci5Db2xsYWJQcmVzZW5jZS0tb2ZmbGluZTo6YmVmb3JlLAouQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmU6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNTAlOwogICAgaGVpZ2h0OiAxLjVweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KLkNvbGxhYlByZXNlbmNlLS1vZmZsaW5lOjpiZWZvcmUgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDQ1ZGVnKTsKfQouQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmU6OmFmdGVyIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHJvdGF0ZSgtNDVkZWcpOwp9CgovKiBVbmtub3duIC0gZ3JheSBzb2xpZCAobm8gaWNvbikgKi8KLkNvbGxhYlByZXNlbmNlLS11bmtub3duIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWNvbGxhYi1wcmVzZW5jZS11bmtub3duKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIFdvcmsgTG9jYXRpb24gQmFkZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5Db2xsYWJXb3JrTG9jYXRpb24gewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiAycHggOHB4OwogICAgYm9yZGVyLXJhZGl1czogMTJweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBsaW5lLWhlaWdodDogMS40OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLkNvbGxhYldvcmtMb2NhdGlvbiBpIHsKICAgIGZvbnQtc2l6ZTogMTBweDsKICAgIGxpbmUtaGVpZ2h0OiAxOwp9CgovKiBPZmZpY2UgLSBwdXJwbGUvYmx1ZSBsaWtlIFRlYW1zICovCi5Db2xsYWJXb3JrTG9jYXRpb24tLW9mZmljZSB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZThlM2YzOwogICAgY29sb3I6ICM1YjRiOWU7Cn0KCi8qIFJlbW90ZSAtIHRlYWwvZ3JlZW4gKi8KLkNvbGxhYldvcmtMb2NhdGlvbi0tcmVtb3RlIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2YzZWY7CiAgICBjb2xvcjogIzJlN2Q2ZTsKfQoKLyogVGltZSBvZmYgLSBvcmFuZ2UveWVsbG93ICovCi5Db2xsYWJXb3JrTG9jYXRpb24tLXRpbWVPZmYgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjNlMDsKICAgIGNvbG9yOiAjZTY1MTAwOwp9CgovKiBXb3JrIGxvY2F0aW9uIGluIEhvdmVyQ2FyZCByb3cgKi8KLkNvbGxhYkhvdmVyQ2FyZF9fcm93IC5Db2xsYWJXb3JrTG9jYXRpb24gewogICAgbWFyZ2luLWxlZnQ6IDA7Cn0KCi8qIFdvcmsgbG9jYXRpb24gaW4gQ3VzdG9tZXJJbmZvIHdpZGdldCAtIG5vdyBoYW5kbGVkIGJ5IF9fYmFkZ2VzUm93ICovCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogSG92ZXIgQ2FyZCAoUGVyc29uIENhcmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYkhvdmVyQ2FyZCB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB6LWluZGV4OiA5OTk5OwogICAgd2lkdGg6IDMyMHB4OwogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgYm94LXNoYWRvdzogMCA0cHggMTJweCB2YXIoLS1jb2xsYWItc2hhZG93KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCk7CiAgICBvcGFjaXR5OiAwOwogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzIGVhc2UsIHZpc2liaWxpdHkgMC4ycyBlYXNlOwp9CgouQ29sbGFiSG92ZXJDYXJkLS12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgovKiBDYXJkIGhlYWRlciB3aXRoIGF2YXRhciBhbmQgbmFtZSAqLwouQ29sbGFiSG92ZXJDYXJkX19oZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxNnB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgZmxleC13cmFwOiB3cmFwOwp9CgovKiBEaXNhYmxlIGhvdmVyIGVmZmVjdCBvbiBhdmF0YXIgaW5zaWRlIGhvdmVyIGNhcmQgKi8KLkNvbGxhYkhvdmVyQ2FyZF9faGVhZGVyIC5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciB7CiAgICBib3gtc2hhZG93OiBub25lOwp9CgouQ29sbGFiSG92ZXJDYXJkX19oZWFkZXIgLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlOmhvdmVyIC5Db2xsYWJBdmF0YXJfX2ltYWdlLAouQ29sbGFiSG92ZXJDYXJkX19oZWFkZXIgLkNvbGxhYkF2YXRhci0tY2xpY2thYmxlOmhvdmVyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX2luZm8gewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fbmFtZSB7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbWFyZ2luOiAwIDAgMnB4IDA7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgouQ29sbGFiSG92ZXJDYXJkX190aXRsZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgbWFyZ2luOiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKfQoKLyogQ2FyZCBib2R5IHdpdGggY29udGFjdCBkZXRhaWxzICovCi5Db2xsYWJIb3ZlckNhcmRfX2JvZHkgewogICAgcGFkZGluZzogMTZweDsKfQoKLyogT09GIE1lc3NhZ2UgQmFubmVyIGluIEhvdmVyQ2FyZCAqLwouQ29sbGFiSG92ZXJDYXJkX19vb2ZCYW5uZXIgewogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgbWFyZ2luOiAtMTZweCAtMTZweCAxMnB4IC0xNnB4OwogICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2ZmZjNlMCAwJSwgI2ZmZTBiMiAxMDAlKTsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZjYzgwOwp9CgouQ29sbGFiSG92ZXJDYXJkX19vb2ZIZWFkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIG1hcmdpbi1ib3R0b206IDZweDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fb29mSWNvbiB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogI2U2NTEwMDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fb29mVGl0bGUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiAjZTY1MTAwOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fb29mTWVzc2FnZSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogIzVkNDAzNzsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7CiAgICBtYXgtaGVpZ2h0OiAxMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwp9CgouQ29sbGFiSG92ZXJDYXJkX19yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogNXB4IDA7CiAgICBsaW5lLWhlaWdodDogMS41Owp9CgouQ29sbGFiSG92ZXJDYXJkX19yb3c6Zmlyc3QtY2hpbGQgewogICAgcGFkZGluZy10b3A6IDA7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX3JvdzpsYXN0LWNoaWxkIHsKICAgIHBhZGRpbmctYm90dG9tOiAwOwp9CgouQ29sbGFiSG92ZXJDYXJkX19yb3c6bm90KDpsYXN0LWNoaWxkKSB7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwgewogICAgZmxleC1zaHJpbms6IDA7CiAgICB3aWR0aDogOTBweDsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKICAgIHBhZGRpbmctdG9wOiAycHg7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX3ZhbHVlIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7CiAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUgYSB7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUgYTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmstaG92ZXIpOwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0KCi8qIE1hbmFnZXIgbGluayAqLwouQ29sbGFiSG92ZXJDYXJkX19tYW5hZ2VyIHsKICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogNHB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi5Db2xsYWJIb3ZlckNhcmRfX21hbmFnZXI6aG92ZXIgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyKTsKfQoKLyogQ2FyZCBmb290ZXIgd2l0aCBhY3Rpb24gYnV0dG9ucyAqLwouQ29sbGFiSG92ZXJDYXJkX19mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogOHB4OwogICAgcGFkZGluZzogMTJweCAxNnB4OwogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDAgMCA0cHggNHB4Owp9CgovKiBTcGFjZXIgdG8gcHVzaCBzZXR0aW5ncy9sb2dvdXQgdG8gdGhlIHJpZ2h0ICovCi5Db2xsYWJIb3ZlckNhcmRfX2Zvb3RlclNwYWNlciB7CiAgICBmbGV4OiAxOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQWN0aW9uIEJ1dHRvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYkJ1dHRvbiB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNnB4OwogICAgcGFkZGluZzogNnB4IDEycHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQpOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMnMgZWFzZTsKfQoKLkNvbGxhYkJ1dHRvbjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiQnV0dG9uOmhvdmVyIGkgewogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJCdXR0b24gaSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlOwp9CgovKiBJY29uLW9ubHkgYnV0dG9uICovCi5Db2xsYWJCdXR0b24tLWljb24gewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBwYWRkaW5nOiAwOwp9CgouQ29sbGFiQnV0dG9uLS1pY29uIGkgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgovKiBQcmltYXJ5IGJ1dHRvbiAqLwouQ29sbGFiQnV0dG9uLS1wcmltYXJ5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJCdXR0b24tLXByaW1hcnkgaSB7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYkJ1dHRvbi0tcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluay1ob3Zlcik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyKTsKfQoKLyogTG9nb3V0IGJ1dHRvbiAtIHN1YnRsZSByZWQgb24gaG92ZXIgKi8KLkNvbGxhYkJ1dHRvbi0tbG9nb3V0IHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwp9CgouQ29sbGFiQnV0dG9uLS1sb2dvdXQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogI2Q5NTM0ZjsKICAgIGJvcmRlci1jb2xvcjogI2Q5NTM0ZjsKICAgIGNvbG9yOiAjZmZmOwp9CgovKiBDb3B5IGJ1dHRvbiAtIHNtYWxsIGlubGluZSBidXR0b24gZm9yIGNvcHlpbmcgY29udGFjdCBkYXRhICovCi5Db2xsYWJCdXR0b24tLWNvcHkgewogICAgd2lkdGg6IDIwcHg7CiAgICBoZWlnaHQ6IDIwcHg7CiAgICBtaW4td2lkdGg6IDIwcHg7CiAgICBwYWRkaW5nOiAwOwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBvcGFjaXR5OiAwLjQ7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKfQoKLkNvbGxhYkJ1dHRvbi0tY29weTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKICAgIG9wYWNpdHk6IDE7Cn0KCi5Db2xsYWJCdXR0b24tLWNvcHkgaSB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwp9CgouQ29sbGFiQnV0dG9uLS1jb3B5OmhvdmVyIGkgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogQ29weWFibGUgdmFsdWUgd3JhcHBlciAtIGlubGluZSBmbGV4IGZvciBsaW5rICsgY29weSBidXR0b24gKi8KLkNvbGxhYkhvdmVyQ2FyZF9fY29weWFibGUgewogICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICBnYXA6IDhweDsKICAgIHdpZHRoOiAxMDAlOwogICAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKLkNvbGxhYkhvdmVyQ2FyZF9fY29weWFibGUgYSB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBIZWFkZXIgTG9naW4gQnV0dG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiVXNlckJhZGdlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgcGFkZGluZzogNHB4IDhweDsKICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCAwLjJzIGVhc2U7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKfQoKLkNvbGxhYlVzZXJCYWRnZTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKfQoKLkNvbGxhYlVzZXJCYWRnZV9fY29udGVudCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTBweDsKfQoKLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBiYWNrZ3JvdW5kOiAjNjA3ZDhiOwp9CgouQ29sbGFiVXNlckJhZGdlX19pbmZvIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgZ2FwOiAycHg7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5Db2xsYWJVc2VyQmFkZ2VfX25hbWUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogMTUwcHg7Cn0KCi5Db2xsYWJVc2VyQmFkZ2VfX3N0YXR1cyB7CiAgICBmb250LXNpemU6IDExcHg7CiAgICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjYpOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLkNvbGxhYlVzZXJCYWRnZV9fc3RhdHVzLS1jb25uZWN0ZWQgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogTm90IGxvZ2dlZCBpbiBzdGF0ZSAtIHN1YnRsZSBncmF5ICovCi5Db2xsYWJVc2VyQmFkZ2UtLWRpc2Nvbm5lY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDUpOwogICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjE1KTsKfQoKLkNvbGxhYlVzZXJCYWRnZS0tZGlzY29ubmVjdGVkOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxNTMsIDM0LCAwLjE1KTsKICAgIGJvcmRlci1jb2xvcjogcmdiYSgyNTUsIDE1MywgMzQsIDAuNCk7Cn0KCi5Db2xsYWJVc2VyQmFkZ2UtLWRpc2Nvbm5lY3RlZCAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgYmFja2dyb3VuZDogIzYwN2Q4YjsKfQoKLkNvbGxhYlVzZXJCYWRnZS0tZGlzY29ubmVjdGVkIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjazo6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJcZjBjMCI7CiAgICBmb250LWZhbWlseTogRm9udEF3ZXNvbWU7CiAgICBmb250LXNpemU6IDEycHg7Cn0KCi5Db2xsYWJVc2VyQmFkZ2UtLWRpc2Nvbm5lY3RlZCAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgZm9udC1zaXplOiAwOwp9CgovKiBMb2dnZWQgaW4gc3RhdGUgLSBubyBzcGVjaWFsIGJhY2tncm91bmQsIG5vIGJvcmRlciAqLwouQ29sbGFiVXNlckJhZGdlLS1jb25uZWN0ZWQgewogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBib3JkZXI6IG5vbmU7Cn0KCi5Db2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGJvcmRlcjogbm9uZTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIFRpY2tldCBab29tIFdpZGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi5Db2xsYWJXaWRnZXQgewogICAgcGFkZGluZzogMTBweDsKfQoKLkNvbGxhYldpZGdldF9fdGl0bGUgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5Db2xsYWJXaWRnZXRfX3RpdGxlIGkgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLkNvbGxhYldpZGdldF9fY3VzdG9tZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxMHB4OwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG1hcmdpbi1ib3R0b206IDEycHg7Cn0KCi5Db2xsYWJXaWRnZXRfX2N1c3RvbWVySW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwp9CgouQ29sbGFiV2lkZ2V0X19jdXN0b21lck5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5Db2xsYWJXaWRnZXRfX2N1c3RvbWVyRW1haWwgewogICAgZm9udC1zaXplOiAxMXB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5Db2xsYWJXaWRnZXRfX2FjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtd3JhcDogd3JhcDsKICAgIGdhcDogOHB4Owp9CgouQ29sbGFiV2lkZ2V0X19sb2dpbkhpbnQgewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgcGFkZGluZzogMjBweCAxMHB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLkNvbGxhYldpZGdldF9fbG9naW5IaW50IGkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDI0cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogTWVldGluZyBTY2hlZHVsZXIgTW9kYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyogTW9kYWwgT3ZlcmxheSAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlciB7CiAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNSk7CiAgICB6LWluZGV4OiA5OTk4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZSwgdmlzaWJpbGl0eSAwLjJzIGVhc2U7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyLS12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7CiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgovKiBEaWFsb2cgQm94ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kaWFsb2cgewogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIHdpZHRoOiA0ODBweDsKICAgIG1heC13aWR0aDogOTV2dzsKICAgIG1heC1oZWlnaHQ6IDkwdmg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7CiAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlci0tdmlzaWJsZSAuQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGlhbG9nIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7Cn0KCi8qIEhlYWRlciAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9faGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgcGFkZGluZzogMTZweCAyMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdGl0bGUgewogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIG1hcmdpbjogMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19jbG9zZSB7CiAgICB3aWR0aDogMzJweDsKICAgIGhlaWdodDogMzJweDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2Nsb3NlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZyk7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQpOwp9CgovKiBCb2R5ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19ib2R5IHsKICAgIGZsZXg6IDE7CiAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgcGFkZGluZzogMjBweDsKfQoKLyogU2VjdGlvbiAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbiB7CiAgICBtYXJnaW4tYm90dG9tOiAyMHB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2VjdGlvbjpsYXN0LWNoaWxkIHsKICAgIG1hcmdpbi1ib3R0b206IDA7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sYWJlbCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIG1hcmdpbi1ib3R0b206IDhweDsKfQoKLyogQXR0ZW5kZWVzIFNlY3Rpb24gKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlcyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTJweDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMTBweCAxMnB4OwogICAgYmFja2dyb3VuZDogI2Y5ZjlmOTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNlZWU7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZVJvbGUgewogICAgZm9udC1zaXplOiAxMHB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbWluLXdpZHRoOiA2MHB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVBdmF0YXIgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBmbGV4LXNocmluazogMDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlQXZhdGFyIC5Db2xsYWJBdmF0YXIgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZUF2YXRhciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2F0dGVuZGVlQXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVBdmF0YXIgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxMHB4OwogICAgaGVpZ2h0OiAxMHB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYXR0ZW5kZWVJbmZvIHsKICAgIGZsZXg6IDE7CiAgICBtaW4td2lkdGg6IDA7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZU5hbWUgewogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19hdHRlbmRlZUVtYWlsIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwp9CgovKiBTdWJqZWN0IElucHV0ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19pbnB1dCB7CiAgICB3aWR0aDogMTAwJTsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1zaXplOiAxM3B4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjE1cyBlYXNlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2lucHV0OmZvY3VzIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogRHVyYXRpb24gQnV0dG9ucyAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZHVyYXRpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICBnYXA6IDhweDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2R1cmF0aW9uIHsKICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbjpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kdXJhdGlvbi0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmspOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBjb2xvcjogI2ZmZjsKfQoKLyogTWVldGluZyBUeXBlIEJ1dHRvbnMgKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3R5cGVzIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDEwcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlIHsKICAgIGZsZXg6IDE7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgZ2FwOiA4cHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlIGkgewogICAgZm9udC1zaXplOiAxNnB4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZTpob3ZlciB7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX190eXBlLS1zZWxlY3RlZCB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fdHlwZS0tc2VsZWN0ZWQ6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmstaG92ZXIpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluay1ob3Zlcik7CiAgICBjb2xvcjogI2ZmZjsKfQoKLyogRGF0ZSBQaWNrZXIgKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2RhdGVQaWNrZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEwcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlSW5wdXQgewogICAgZmxleDogMTsKICAgIHBhZGRpbmc6IDEwcHggMTJweDsKICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZU5hdiB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZ2FwOiA0cHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19kYXRlQnRuIHsKICAgIHdpZHRoOiAzNnB4OwogICAgaGVpZ2h0OiAzNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fZGF0ZUJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGNvbG9yOiAjZmZmOwp9CgovKiBUaW1lIFNsb3RzICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90cyB7CiAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3QgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDEycHg7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2YwZjBmMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xNXMgZWFzZTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3Q6bGFzdC1jaGlsZCB7CiAgICBib3JkZXItYm90dG9tOiBub25lOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdDpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItaG92ZXItYmcpOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdC0tc2VsZWN0ZWQgewogICAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDE1MywgMzQsIDAuMSk7CiAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RSYWRpbyB7CiAgICB3aWR0aDogMTZweDsKICAgIGhlaWdodDogMTZweDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIpOwogICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgZmxleC1zaHJpbms6IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90LS1zZWxlY3RlZCAuQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdFJhZGlvIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tY29sbGFiLWxpbmspOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fc2xvdC0tc2VsZWN0ZWQgLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RSYWRpbzo6YWZ0ZXIgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDNweDsKICAgIGxlZnQ6IDNweDsKICAgIHdpZHRoOiA2cHg7CiAgICBoZWlnaHQ6IDZweDsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX3Nsb3RUaW1lIHsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBmb250LXNpemU6IDEzcHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19zbG90SW5kaWNhdG9yIHsKICAgIG1hcmdpbi1sZWZ0OiBhdXRvOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKICAgIGZvbnQtc2l6ZTogMTJweDsKfQoKLyogRW1wdHkgU3RhdGUgKi8KLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2VtcHR5IHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDQwcHggMjBweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19lbXB0eSBpIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1zaXplOiAzMnB4OwogICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIGNvbG9yOiAjY2NjOwp9CgovKiBMb2FkaW5nIFN0YXRlICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sb2FkaW5nIHsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIHBhZGRpbmc6IDQwcHggMjBweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19sb2FkaW5nIGkgewogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDI0cHg7CiAgICBtYXJnaW4tYm90dG9tOiA4cHg7CiAgICBhbmltYXRpb246IHNwaW4gMXMgbGluZWFyIGluZmluaXRlOwp9CgpAa2V5ZnJhbWVzIHNwaW4gewogICAgZnJvbSB7IHRyYW5zZm9ybTogcm90YXRlKDBkZWcpOyB9CiAgICB0byB7IHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7IH0KfQoKLyogRm9vdGVyICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwogICAgYm9yZGVyLXJhZGl1czogMCAwIDZweCA2cHg7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19idG4gewogICAgcGFkZGluZzogMTBweCAyMHB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlcik7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fYnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZyk7Cn0KCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19idG4tLXByaW1hcnkgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmspOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluayk7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2J0bi0tcHJpbWFyeTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluay1ob3Zlcik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLWhvdmVyKTsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX2J0bi0tcHJpbWFyeTpkaXNhYmxlZCB7CiAgICBiYWNrZ3JvdW5kOiAjY2NjOwogICAgYm9yZGVyLWNvbG9yOiAjY2NjOwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKfQoKLyogU3VjY2Vzcy9FcnJvciBNZXNzYWdlcyAqLwouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbWVzc2FnZSB7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBtYXJnaW4tYm90dG9tOiAxNnB4OwogICAgZm9udC1zaXplOiAxM3B4Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbWVzc2FnZS0tc3VjY2VzcyB7CiAgICBiYWNrZ3JvdW5kOiAjZDRlZGRhOwogICAgYm9yZGVyOiAxcHggc29saWQgI2MzZTZjYjsKICAgIGNvbG9yOiAjMTU1NzI0Owp9CgouQ29sbGFiTWVldGluZ1NjaGVkdWxlcl9fbWVzc2FnZS0tZXJyb3IgewogICAgYmFja2dyb3VuZDogI2Y4ZDdkYTsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNmNWM2Y2I7CiAgICBjb2xvcjogIzcyMWMyNDsKfQoKLkNvbGxhYk1lZXRpbmdTY2hlZHVsZXJfX21lc3NhZ2UtLXdhcm5pbmcgewogICAgYmFja2dyb3VuZDogI2ZmZjNjZDsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNmZmVlYmE7CiAgICBjb2xvcjogIzg1NjQwNDsKfQoKLyogSGludCB0ZXh0ICovCi5Db2xsYWJNZWV0aW5nU2NoZWR1bGVyX19oaW50IHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCk7CiAgICBtYXJnaW4tdG9wOiA4cHg7CiAgICBmb250LXN0eWxlOiBpdGFsaWM7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBVdGlsaXR5IENsYXNzZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQ29sbGFiSGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLkNvbGxhYkxvYWRpbmcgewogICAgb3BhY2l0eTogMC42OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBBcnRpY2xlIEF2YXRhciAoaW4gdGlja2V0IHpvb20pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouQXJ0aWNsZU1ldGEgLkNvbGxhYkF2YXRhciB7CiAgICBtYXJnaW4tcmlnaHQ6IDhweDsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi8qIE5hdGl2ZSBabnVueSBhcnRpY2xlIGF2YXRhciBjb250YWluZXIgaW50ZWdyYXRpb24gKi8KLkF2YXRhciAuQ29sbGFiQXZhdGFyIHsKICAgIHdpZHRoOiA2NHB4OwogICAgaGVpZ2h0OiA2NHB4OwogICAgbWFyZ2luOiAwOwp9CgovKiBPdmVycmlkZSBabnVueSdzIGRlZmF1bHQgcm91bmRlZCBjb3JuZXJzIHdpdGggZnVsbHkgcm91bmQgYXZhdGFycyAqLwouQXZhdGFyIC5Db2xsYWJBdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5BdmF0YXIgLkNvbGxhYkF2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjaywKLkF2YXRhci5Db2xsYWJBdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5BdmF0YXIuQ29sbGFiQXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrLAouQXJ0aWNsZU1haWxDb250ZW50IC5BdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5BcnRpY2xlTWFpbENvbnRlbnQgLkF2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjaywKLkF2YXRhciAuQ29sbGFiQXZhdGFyIGltZywKLkF2YXRhci5Db2xsYWJBdmF0YXIgaW1nIHsKICAgIHdpZHRoOiA2NHB4OwogICAgaGVpZ2h0OiA2NHB4OwogICAgYm9yZGVyLXJhZGl1czogNTAlICFpbXBvcnRhbnQ7ICAvKiBGdWxseSByb3VuZCBsaWtlIEhlYWRlclVzZXJCYWRnZSAqLwp9CgouQXZhdGFyIC5Db2xsYWJBdmF0YXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgZm9udC1zaXplOiAyMHB4OwogICAgYmFja2dyb3VuZDogI2U4ZThlODsKICAgIGNvbG9yOiAjODg4Owp9CgovKiBQcmVzZW5jZSBpbmRpY2F0b3IgaW4gYXJ0aWNsZSBhdmF0YXIgKi8KLkF2YXRhciAuQ29sbGFiUHJlc2VuY2UgewogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDE0cHg7CiAgICBib3R0b206IDJweDsKICAgIHJpZ2h0OiAycHg7CiAgICBib3JkZXItd2lkdGg6IDJweDsKfQoKLyogRGlzYWJsZSBvcmFuZ2UgaG92ZXIgZWZmZWN0IG9uIGFydGljbGUgYXZhdGFycyAqLwouQXZhdGFyIC5Db2xsYWJBdmF0YXItLWNsaWNrYWJsZTpob3ZlciAuQ29sbGFiQXZhdGFyX19pbWFnZSwKLkF2YXRhciAuQ29sbGFiQXZhdGFyLS1jbGlja2FibGU6aG92ZXIgLkNvbGxhYkF2YXRhcl9fZmFsbGJhY2sgewogICAgb3BhY2l0eTogMTsKICAgIGJveC1zaGFkb3c6IG5vbmU7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBUaWNrZXQgSW5mbyBTaWRlYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgouU2lkZWJhckNvbHVtbiAuQ29sbGFiQXZhdGFyIHsKICAgIG1hcmdpbi1yaWdodDogNnB4Owp9CgouVGlja2V0SW5mb3JtYXRpb25Sb3cgLkNvbGxhYkF2YXRhciB7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogSGVhZGVyIFVzZXJBdmF0YXIgSW50ZWdyYXRpb24gKEhlYWRlclVzZXJCYWRnZSkgICAgICAgICAgICAgICovCi8qIERlc2lnbjogV2hpdGUgY2FyZCB3aXRoIG9yYW5nZSBib3JkZXIsIGF2YXRhciBsZWZ0LCBpbmZvIHJpZ2h0ICovCi8qIFNlbGVjdGVkIGJ5IC5Vc2VyQXZhdGFyIGNsYXNzLCBub3QgI1VzZXJBdmF0YXIgaWQgLSBabnVueSA2LjUueCBMVFMgICovCi8qIHJlbmRlcnMgPGxpIGNsYXNzPSJVc2VyQXZhdGFyIj4gd2l0aCBubyBpZCBhdCBhbGwgKGFkZGVkIGJ5IDcuMi54KS4gKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiBSZW1vdmUgWm51bnkncyBuYXRpdmUgYm9yZGVyIG9uIFVzZXJBdmF0YXIgaW1hZ2VzICovCi5Vc2VyQXZhdGFyIGltZyB7CiAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogQ29udGFpbmVyIHN0eWxpbmcgd2hlbiBjb25uZWN0ZWQgKi8KLyogd2lkdGgvaGVpZ2h0OiBhdXRvIG92ZXJyaWRlIG5lZWRlZCBvbiA2LjUueCBMVFMgLSBpdHMgb3duIGNvcmUgQ1NTCiAqIGZpeGVzIEVWRVJZICNUb29sQmFyIGxpIChmbG9hdDpsZWZ0KSBhdCB3aWR0aDoyNHB4L2hlaWdodDozNHB4LCBzaXplZAogKiBmb3IgdGhlIG5hdGl2ZSBpY29uLW9ubHkgY29udGVudC4gT3VyIGNvbm5lY3RlZCBiYWRnZSBpcyBtdWNoIHdpZGVyCiAqIChuYW1lICsgdGl0bGUgbmV4dCB0byB0aGUgYXZhdGFyKTsgd2l0aG91dCB0aGlzLCB0aGUgPGxpPidzIG93biBib3gKICogc3RheXMgMjRweCB3aWRlIHdoaWxlIHRoZSBiYWRnZSB2aXN1YWxseSBvdmVyZmxvd3Mgb3V0IG9mIGl0LCBkcmF3aW5nCiAqIG9uIHRvcCBvZiB3aGF0ZXZlciB0b29sYmFyIGljb24gc2l0cyB0byBpdHMgcmlnaHQgaW5zdGVhZCBvZiBwdXNoaW5nCiAqIGl0IGFzaWRlLiBDT1JSRUNUSU9OOiB0aGlzIHdhcyB3cml0dGVuIG1hdGNoaW5nIG9ubHkgI1Rvb2xCYXIKICogKDYuNS54J3MgaWQpIC0gNy4wLngrIHJlbmRlcnMgI0hlYWRlclRvb2xCYXIgaW5zdGVhZCwgc28gdGhpcyBydWxlCiAqIG5ldmVyIG1hdGNoZWQgdGhlcmUgYXQgYWxsLiBNYXRjaGVzIGJvdGggbm93OyByZWR1bmRhbnQtYnV0LWhhcm1sZXNzCiAqIG9uIDcuMC54LTcuMi54LCB3aG9zZSBvd24gI0hlYWRlclRvb2xCYXIgbGkgYWxyZWFkeSBzZXRzIHdpZHRoL2hlaWdodDoKICogYXV0byBpdHNlbGYgKG5vIGZsb2F0LWJhc2VkIHNpemluZyBpbiB0aGF0IHJlZGVzaWduIHRvIGJlZ2luIHdpdGgpLAogKiBidXQga2VwdCBmb3Igd2hpY2hldmVyIGZ1dHVyZSBsaW5lIG1pZ2h0IHJlaW50cm9kdWNlIGl0LiBNYXRjaGluZwogKiBlaXRoZXIgaWQga2VlcHMgdGhlIGNvcmUgcnVsZSdzIG93biBzcGVjaWZpY2l0eSAoaWQgKyBlbGVtZW50KSBzbwogKiB0aGlzIHN0aWxsIG5lZWRzIG5vICFpbXBvcnRhbnQuICovCiNUb29sQmFyIC5Vc2VyQXZhdGFyLkNvbGxhYlVzZXJCYWRnZS0tY29ubmVjdGVkLAojSGVhZGVyVG9vbEJhciAuVXNlckF2YXRhci5Db2xsYWJVc2VyQmFkZ2UtLWNvbm5lY3RlZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHdpZHRoOiBhdXRvOwogICAgaGVpZ2h0OiBhdXRvOwp9CgovKiBNYWluIGJhZGdlIGNvbnRhaW5lciAtIGNvbXBhY3QsIG5vIGJvcmRlciAqLwouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMnB4OwogICAgcGFkZGluZzogMDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fY29udGVudDpob3ZlciAuQ29sbGFiVXNlckJhZGdlX19uYW1lLAouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50OmhvdmVyIC5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlIHsKICAgIGNvbG9yOiAjZmY4YTI1Owp9CgovKiBUaGUgbmF0aXZlIDxhPiAoWm51bnkncyBvd24gY2xpY2stdG8tcmV2ZWFsIHRyaWdnZXIgZm9yIHRoZQogKiBQcmVmZXJlbmNlcy9Mb2dvdXQgZHJvcGRvd24sIHNlZSBJbml0SGVhZGVyKCkncyBvd24gY29tbWVudCBpbgogKiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkuanMpIGlzIGtlcHQgYXMtaXMgYW5kIGp1c3QgZ2V0cyBvdXIgd2lkZXIKICogYmFkZ2Ugc3dhcHBlZCBpbiBhcyBpdHMgY29udGVudCBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgc21hbGwgaWNvbi4KICogSXRzIG5hdGl2ZSAuaWNvbi1ob3Zlci1tZCBzaXppbmcgKGZpeGVkIHdpZHRoL2hlaWdodCwgbWVhbnQgZm9yIHRoZQogKiBzbWFsbCBpY29uLW9ubHkgYXZhdGFyKSBuZWVkcyBvdmVycmlkaW5nIHRvIGZpdCB0aGF0IHdpZGVyIGNvbnRlbnQgLQogKiBldmVyeXRoaW5nIGVsc2UgYWJvdXQgdGhlIGVsZW1lbnQgKGFuZCB0aGUgbmF0aXZlIGRyb3Bkb3duIGl0CiAqIHRyaWdnZXJzKSBpcyB1bnRvdWNoZWQuICovCi5Vc2VyQXZhdGFyID4gYS5Db2xsYWJVc2VyQmFkZ2UtLXJlcGxhY2VkIHsKICAgIHdpZHRoOiBhdXRvICFpbXBvcnRhbnQ7CiAgICBoZWlnaHQ6IGF1dG8gIWltcG9ydGFudDsKfQoKLyogT25jZSBjb25uZWN0ZWQsIFNldHRpbmdzL0xvZ291dCBsaXZlIGluIHRoZSBob3ZlciBjYXJkIGluc3RlYWQgKHNlZQogKiBBcHBlbmRPd25DYXJkRm9vdGVyQnV0dG9ucyBpbiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkuanMpIC0gdGhlCiAqIG5hdGl2ZSBkcm9wZG93biAoUHJlZmVyZW5jZXMvTG9nb3V0L00zNjUgbG9naW4pIGJlY29tZXMgYSByZWR1bmRhbnQKICogc2Vjb25kIHN1cmZhY2Ugb2ZmZXJpbmcgdGhlIHNhbWUgdGhpbmdzLCBzbyBpdCdzIGhpZGRlbiB3aGlsZQogKiBjb25uZWN0ZWQuIFRoaXMgc3RpbGwgZG9lc24ndCB0b3VjaCB0aGUgbmF0aXZlIDxhPidzIGNsaWNrLWJpbmRpbmcKICogaXRzZWxmIChjbGlja2luZyBzdGlsbCB0b2dnbGVzIC5BY3RpdmUgaW50ZXJuYWxseSwgaGFybWxlc3NseSAtIHNlZQogKiBJbml0SGVhZGVyKCkncyBvd24gY29tbWVudCBmb3Igd2h5IHRoYXQgYmluZGluZyBpcyBuZXZlciB0b3VjaGVkKSAtCiAqIG9ubHkgdGhlIENTUyByZXZlYWwgcnVsZSdzIG93biAqcmVzdWx0KiBpcyBvdmVycmlkZGVuIGhlcmUsIGtleWVkIG9mZgogKiAuQ29sbGFiVXNlckJhZGdlLS1jb25uZWN0ZWQgKGFscmVhZHkgdG9nZ2xlZCBieSBVcGRhdGVIZWFkZXIoKSksIHNvCiAqIHRoZSBzdWJtZW51IHNpbXBseSBuZXZlciBiZWNvbWVzIHZpc2libGUgd2hpbGUgY29ubmVjdGVkLCBhbmQgZ29lcwogKiBiYWNrIHRvIG5vcm1hbCBhdXRvbWF0aWNhbGx5IG9uIGxvZ291dCB3aXRoIG5vIEpTIGludm9sdmVkLgogKiBTZWxlY3RvciBtaXJyb3JzIFpudW55J3Mgb3duIG5hdGl2ZSByZXZlYWwgcnVsZSAoQ29yZS5IZWFkZXIuY3NzKQogKiB3aXRoIG9uZSBhZGRlZCBjbGFzcywgc28gaXQgd2lucyB0aGUgc3BlY2lmaWNpdHkgbWF0Y2ggZGVzcGl0ZSBib3RoCiAqIHVzaW5nICFpbXBvcnRhbnQuICovCmJvZHkuVmlzaWJsZS1TY3JlZW5YTCAjSGVhZGVyVG9vbEJhciBsaS5Vc2VyQXZhdGFyLkNvbGxhYlVzZXJCYWRnZS0tY29ubmVjdGVkID4gYS5BY3RpdmUgKyBkaXYuVXNlckF2YXRhcl9zdWJtZW51IHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKLyogQXZhdGFyIHdyYXBwZXIgLSBjb250YWlucyB0aGUgQ29sbGFiQXZhdGFyICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciB7CiAgICBmbGV4LXNocmluazogMDsKICAgIHdpZHRoOiA0OHB4OwogICAgaGVpZ2h0OiA0OHB4Owp9CgovKiBPdmVycmlkZSBhdmF0YXIgc2l6ZSBpbnNpZGUgYmFkZ2UgKi8KLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXIgewogICAgd2lkdGg6IDQ4cHg7CiAgICBoZWlnaHQ6IDQ4cHg7Cn0KCi8qICFpbXBvcnRhbnQgb24gdGhlIDxpbWc+IGNhc2Ugb25seSwgbmVlZGVkIG9uIDYuNS54IExUUzogaXRzIG93biBjb3JlCiAqIENTUyBoYXMgIiNUb29sQmFyIGxpLlVzZXJBdmF0YXIgaW1nIHsgd2lkdGg6MzVweDsgaGVpZ2h0OjM1cHg7IC4uLn0iCiAqIChpZCtjbGFzcytlbGVtZW50IHNwZWNpZmljaXR5KSBzaXplZCBmb3IgdGhlIG5hdGl2ZSAzNXB4IGF2YXRhcgogKiBwaG90bywgd2hpY2ggb3RoZXJ3aXNlIHdpbnMgb3ZlciB0aGlzIHBsYWluLWNsYXNzIHJ1bGUgYW5kIGxlYXZlcyBhCiAqIDM1cHggcGhvdG8gZmxvYXRpbmcgaW5zaWRlIG91ciA0OHB4IGF2YXRhciBjaXJjbGUuIFRoZSBmYWxsYmFjawogKiAoaW5pdGlhbHMpIHNwYW4gaXNuJ3QgYW4gPGltZz4sIHNvIHRoYXQgbmF0aXZlIHJ1bGUgbmV2ZXIgbWF0Y2hlcyBpdAogKiBhbmQgbm8gIWltcG9ydGFudCBpcyBuZWVkZWQgdGhlcmUuICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19pbWFnZSB7CiAgICB3aWR0aDogNDhweCAhaW1wb3J0YW50OwogICAgaGVpZ2h0OiA0OHB4ICFpbXBvcnRhbnQ7Cn0KCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICB3aWR0aDogNDhweDsKICAgIGhlaWdodDogNDhweDsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIGZvbnQtc2l6ZTogMTZweDsKfQoKLyogUHJlc2VuY2UgaW5kaWNhdG9yIHNpemUgZm9yIGJhZGdlIGF2YXRhciAqLwouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYlByZXNlbmNlIHsKICAgIHdpZHRoOiAxMnB4OwogICAgaGVpZ2h0OiAxMnB4OwogICAgYm9yZGVyLXdpZHRoOiAycHg7CiAgICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLyogRW5zdXJlIHByZXNlbmNlIGljb25zIGFyZSB2aXNpYmxlIGluIGhlYWRlciAtIGV4cGxpY2l0IHJ1bGVzIGZvciBzcGVjaWZpY2l0eSAqLwouVXNlckF2YXRhciAuQ29sbGFiUHJlc2VuY2UtLWF2YWlsYWJsZTo6YWZ0ZXIgewogICAgY29udGVudDogJyc7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDM1JTsKICAgIGxlZnQ6IDUwJTsKICAgIHdpZHRoOiAyNSU7CiAgICBoZWlnaHQ6IDQ1JTsKICAgIGJvcmRlcjogc29saWQgI2ZmZjsKICAgIGJvcmRlci13aWR0aDogMCAxLjVweCAxLjVweCAwOwogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDQ1ZGVnKTsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlByZXNlbmNlLS1kbmQ6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHdpZHRoOiA2MCU7CiAgICBoZWlnaHQ6IDJweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5Vc2VyQXZhdGFyIC5Db2xsYWJQcmVzZW5jZS0tb2ZmbGluZTo6YmVmb3JlLAouVXNlckF2YXRhciAuQ29sbGFiUHJlc2VuY2UtLW9mZmxpbmU6OmFmdGVyIHsKICAgIGNvbnRlbnQ6ICcnOwogICAgcG9zaXRpb246IGFic29sdXRlOwogICAgdG9wOiA1MCU7CiAgICBsZWZ0OiA1MCU7CiAgICB3aWR0aDogNTAlOwogICAgaGVpZ2h0OiAxLjVweDsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7Cn0KCi5Vc2VyQXZhdGFyIC5Db2xsYWJQcmVzZW5jZS0tb2ZmbGluZTo6YmVmb3JlIHsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpIHJvdGF0ZSg0NWRlZyk7Cn0KCi5Vc2VyQXZhdGFyIC5Db2xsYWJQcmVzZW5jZS0tb2ZmbGluZTo6YWZ0ZXIgewogICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKC00NWRlZyk7Cn0KCi8qIEluZm8gYXJlYSAtIG5hbWUgYW5kIHRpdGxlIHN0YWNrZWQgdmVydGljYWxseSAqLwouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19pbmZvIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBnYXA6IDJweDsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogVXNlciBuYW1lIC0gYm9sZC4gV2hpdGUgdGV4dCBmb3IgYSBkYXJrICNIZWFkZXIgKFpudW55IDYuNS54IExUUzoKICogIzMzMyBiZyAtIHNlZSBDb3JlLkhlYWRlci5jc3MpLiBDT1JSRUNUSU9OOiB0aGlzIGZpbGUgaXMgTk9UIDYuNS54LW9ubHkKICogKGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB0aGlzIGNvbW1lbnQgY2xhaW1lZCBpdCB3YXMpIC0gaXQncyB0aGUgc2FtZQogKiBDU1Mgc2hpcHBlZCBvbiBldmVyeSBsaW5lLCBhbmQgNy4wLngtNy4yLngncyByZWRlc2lnbmVkICNIZWFkZXIgaXMKICogd2hpdGUgKC0tbWVudS1iZzogI2ZmZmZmZiksIHdoZXJlIHdoaXRlLW9uLXdoaXRlIG1hZGUgdGhlIG5hbWUvdGl0bGUKICogaW52aXNpYmxlIC0gYSByZWFsIHJlZ3Jlc3Npb24gZm91bmQgYW5kIGZpeGVkIDIwMjYtMDktMjAuIFRoZQogKiAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50LS1saWdodEhlYWRlciBjbGFzcyAoYWRkZWQgaW4KICogQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJLmpzIHZpYSBJc0hlYWRlckJhY2tncm91bmRMaWdodCgpLCBkZXRlY3RlZAogKiBmcm9tIHRoZSB0aGVtZSdzIG93biAtLW1lbnUtYmcgYXQgcnVudGltZSByYXRoZXIgdGhhbiBhc3N1bWVkIHBlcgogKiB2ZXJzaW9uKSBzd2l0Y2hlcyB0byBkYXJrIHRleHQgYmVsb3cuICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX25hbWUgewogICAgZm9udC1zaXplOiAxNXB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiAjZmZmOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogMjUwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlOwp9CgovKiBKb2IgdGl0bGUgLSBzbWFsbGVyLCBtdXRlZC4gI2NjYyB0byBtYXRjaCA2LjUueCdzIG93biBkcm9wZG93biB0ZXh0CiAqIGNvbG9yICgjVG9vbEJhciBsaS5Vc2VyQXZhdGFyIGRpdiBzcGFuKSwgbm90ICM3Nzcgd2hpY2ggaXMgdW5yZWFkYWJsZQogKiBvbiB0aGUgZGFyayAjSGVhZGVyIGJhY2tncm91bmQgLSBzZWUgLkNvbGxhYlVzZXJCYWRnZV9fbmFtZSBhYm92ZS4gKi8KLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fdGl0bGUgewogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgIGNvbG9yOiAjY2NjOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgIG1heC13aWR0aDogMjUwcHg7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4ycyBlYXNlOwp9CgovKiBMaWdodC1oZWFkZXIgbGluZXMgKDcuMC54LTcuMi54IGNvbmZpcm1lZCBzbyBmYXIpOiBkYXJrIHRleHQgaW5zdGVhZCAtCiAqIHNhbWUgdmFsdWVzIGFscmVhZHkgdXNlZCBmb3IgLkNvbGxhYkN1c3RvbWVySW5mbyBmdXJ0aGVyIGRvd24sIHdoaWNoCiAqIHNpdHMgb24gYSBsaWdodCBiYWNrZ3JvdW5kIGZvciB0aGUgc2FtZSByZWFzb24uICovCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQtLWxpZ2h0SGVhZGVyIC5Db2xsYWJVc2VyQmFkZ2VfX25hbWUgewogICAgY29sb3I6ICMzMzM7Cn0KCi5Vc2VyQXZhdGFyIC5Db2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQtLWxpZ2h0SGVhZGVyIC5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlIHsKICAgIGNvbG9yOiAjNzc3Owp9CgouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50LS1saWdodEhlYWRlcjpob3ZlciAuQ29sbGFiVXNlckJhZGdlX19uYW1lLAouVXNlckF2YXRhciAuQ29sbGFiVXNlckJhZGdlX19jb250ZW50LS1saWdodEhlYWRlcjpob3ZlciAuQ29sbGFiVXNlckJhZGdlX190aXRsZSB7CiAgICBjb2xvcjogI2ZmOGEyNTsKfQoKLyogRGVwcmVjYXRlZCAtIHVzZSBfX3RpdGxlIGluc3RlYWQgKi8KLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fc3RhdHVzIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGNvbG9yOiAjNzc3OwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLlVzZXJBdmF0YXIgLkNvbGxhYlVzZXJCYWRnZV9fc3RhdHVzLS1jb25uZWN0ZWQgewogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rKTsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIEN1c3RvbWVyIEluZm9ybWF0aW9uIFdpZGdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQ3VzdG9tZXIgSW5mb3JtYXRpb24gV2lkZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBSZXVzZXMgQ29sbGFiVXNlckJhZGdlIHN0cnVjdHVyZSAoc2FtZSBhcyBIZWFkZXJVc2VyQmFkZ2UpICAgKi8KLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgojQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0IHsKICAgIC8qIFdpZGdldCB1c2VzIFpudW55J3MgbmF0aXZlIC5tb2QubW9kU2lkZWJhcldpZGdldCBzdHJ1Y3R1cmUgKHNlZQogICAgICogTW9kdWxlLlNpZGViYXJXaWRnZXQuY3NzLy5qcykgLSBzYW1lIG9uZSB0aGUgcmVhbCBuYXRpdmUKICAgICAqICJDdXN0b21lciBJbmZvcm1hdGlvbiIvIlRpY2tldCBJbmZvcm1hdGlvbiIgd2lkZ2V0cyB1c2UuIEhlYWRlcgogICAgICogYmFja2dyb3VuZCwgYXJyb3cgaWNvbiwgcGFkZGluZywgYW5kIHRoZSBjb2xsYXBzZS9leHBhbmQKICAgICAqIGFuaW1hdGlvbiBhbGwgY29tZSBmcm9tIHRoYXQgbmF0aXZlIENTUyB3aXRoIG5vIG92ZXJyaWRlcyBuZWVkZWQKICAgICAqIGhlcmU7IEJpbmRTaWRlYmFyV2lkZ2V0VG9nZ2xlKCkgaW4gQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJLmpzCiAgICAgKiByZXBsaWNhdGVzIGl0cyBKUyBiZWhhdmlvciBmb3IgdGhpcyBKUy1pbnNlcnRlZCB3aWRnZXQuICovCn0KCi8qIFRoaXMgd2lkZ2V0J3MgZmllbGRzZXQgYWxzbyBjYXJyaWVzIFpudW55J3MgbmF0aXZlIC5UYWJsZUxpa2UgY2xhc3MKICogKGtlcHQgZm9yIGl0cyB3aWR0aC9jZW50ZXJpbmcgcnVsZXMpLCBidXQgbm90aGluZyBoZXJlIHN0aWxsIGdpdmVzIGl0CiAqIGBkaXNwbGF5OiBmbGV4OyBmbGV4LWZsb3c6IGNvbHVtbmAgLSB0aGF0IHVzZWQgdG8gY29tZSBmcm9tIGEgbmF0aXZlCiAqIHJ1bGUgcmVxdWlyaW5nIGEgLldpZGdldFNpbXBsZSA+IC5Db250ZW50IGFuY2VzdG9yLCB3aGljaCBubyBsb25nZXIKICogZXhpc3RzIG5vdyB0aGF0IHRoaXMgd2lkZ2V0IHVzZXMgdGhlIG1vZFNpZGViYXJXaWRnZXQgc3RydWN0dXJlIChzZWUKICogYWJvdmUpLiBEZWNsYXJlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gYW55IGluaGVyaXRlZAogKiBsYXlvdXQuIC5zaWRlYmFyV2lkZ2V0Q29udGVudCBhbHJlYWR5IHN1cHBsaWVzIGl0cyBvd24gMTVweCBwYWRkaW5nCiAqIG5hdGl2ZWx5LCBzbyBub25lIGlzIGFkZGVkIGhlcmUuICovCiNDb2xsYWJDdXN0b21lckluZm9XaWRnZXQgLkNvbGxhYkN1c3RvbWVySW5mbyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogMTBweDsKfQoKLyogQ3VzdG9tZXIgYmFkZ2UgY29udGFpbmVyIC0gbm93IGNvbnRhaW5zIG1haW4gcm93ICsgYmFkZ2VzIHJvdy4KICogTm8gbWFyZ2luLWJvdHRvbSBvZiBpdHMgb3duIC0gdGhlIGZpZWxkc2V0J3Mgb3duIGBnYXBgIChhYm92ZSkKICogYWxyZWFkeSBzcGFjZXMgaXQgZnJvbSB0aGUgbmV4dCBlbGVtZW50LiAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX2NvbnRlbnQgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgIHBhZGRpbmc6IDA7Cn0KCi8qIEF2YXRhciB3cmFwcGVyICovCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIHsKICAgIGZsZXgtc2hyaW5rOiAwOwogICAgd2lkdGg6IDQ4cHg7CiAgICBoZWlnaHQ6IDQ4cHg7Cn0KCi8qIEVuc3VyZSBhdmF0YXIgaW4gY3VzdG9tZXIgaW5mbyBpcyBhbHdheXMgNDh4NDggKi8KLkNvbGxhYkN1c3RvbWVySW5mbyAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhciB7CiAgICB3aWR0aDogNDhweDsKICAgIGhlaWdodDogNDhweDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mbyAuQ29sbGFiVXNlckJhZGdlX19hdmF0YXIgLkNvbGxhYkF2YXRhcl9faW1hZ2UsCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiA0OHB4OwogICAgaGVpZ2h0OiA0OHB4Owp9CgouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX2F2YXRhciAuQ29sbGFiQXZhdGFyX19mYWxsYmFjayB7CiAgICBmb250LXNpemU6IDE2cHg7Cn0KCi8qIFByZXNlbmNlIGluZGljYXRvciBzaXplICovCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fYXZhdGFyIC5Db2xsYWJQcmVzZW5jZSB7CiAgICB3aWR0aDogMTJweDsKICAgIGhlaWdodDogMTJweDsKICAgIGJvcmRlci13aWR0aDogMnB4Owp9CgovKiBJbmZvIGFyZWEgLSBuYW1lIGFuZCB0aXRsZSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX2luZm8gewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogMnB4OwogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKfQoKLyogVXNlciBuYW1lICovCi5Db2xsYWJDdXN0b21lckluZm8gLkNvbGxhYlVzZXJCYWRnZV9fbmFtZSB7CiAgICBmb250LXNpemU6IDE1cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6ICMzMzM7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgbGluZS1oZWlnaHQ6IDEuMzsKICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7Cn0KCi8qIEpvYiB0aXRsZSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvIC5Db2xsYWJVc2VyQmFkZ2VfX3RpdGxlIHsKICAgIGZvbnQtc2l6ZTogMTNweDsKICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICBjb2xvcjogIzc3NzsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBsaW5lLWhlaWdodDogMS4zOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKfQoKLyogSXRlbVJvdyBsaXN0IC0gbmF0aXZlIFpudW55IHN0eWxpbmcgKi8KLkNvbGxhYkN1c3RvbWVySW5mbyAuSXRlbVJvdyB7CiAgICBsaXN0LXN0eWxlOiBub25lOwogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mbyAuSXRlbVJvdyBsaSB7CiAgICBwYWRkaW5nOiA0cHggMDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mbyAuSXRlbVJvdyBsaSBpIHsKICAgIHdpZHRoOiAxNnB4OwogICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBjb2xvcjogIzc3NzsKfQoKLyogSWNvbiB1c2VzIGRlZmF1bHQgZ3JleSBjb2xvciBsaWtlIG90aGVyIGljb25zICovCgouQ29sbGFiQ3VzdG9tZXJJbmZvIC5JdGVtUm93IGxpIGEgewogICAgY29sb3I6ICMwMDA7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7Cn0KCi5Db2xsYWJDdXN0b21lckluZm8gLkl0ZW1Sb3cgbGkgYTpob3ZlciB7CiAgICBjb2xvcjogI2ZmOTkyMjsKICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKLyogT3BlblRpY2tldCBsaW5rIHVzZXMgc2FtZSBjb2xvciBhcyBvdGhlciBsaW5rcyAoYmxhY2ssIG9yYW5nZSBvbiBob3ZlcikgKi8KCi5Db2xsYWJDdXN0b21lckluZm9fX3RpY2tldENvdW50IHsKICAgIC8qIElubGluZSB3aXRoIHRleHQgKi8KfQoKLyogQWN0aW9uIGJ1dHRvbnMgcm93IC0gVGVhbXMgQ2hhdCwgQXVkaW8sIFZpZGVvIChsZWZ0KSArIE1lZXRpbmcgKHJpZ2h0KSAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25zIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBnYXA6IDhweDsKICAgIC8qIE5vIG1hcmdpbi10b3AgLSB0aGUgZmllbGRzZXQncyBvd24gYGdhcGAgKHNlZSAuQ29sbGFiQ3VzdG9tZXJJbmZvCiAgICAgKiBhYm92ZSkgYWxyZWFkeSBzcGFjZXMgdGhpcyBmcm9tIHRoZSBJdGVtUm93IGxpc3Q7IHRoaXMgd291bGQKICAgICAqIG90aGVyd2lzZSBkb3VibGUgdXAgd2l0aCBpdC4gKi8KICAgIHBhZGRpbmctdG9wOiA4cHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsKfQoKLyogU3BhY2VyIHRvIHB1c2ggbWVldGluZyBidXR0b24gdG8gdGhlIHJpZ2h0ICovCi5Db2xsYWJDdXN0b21lckluZm9fX2FjdGlvbnNTcGFjZXIgewogICAgZmxleDogMTsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fYWN0aW9uQnRuIHsKICAgIGZsZXg6IDE7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGdhcDogNXB4OwogICAgcGFkZGluZzogNnB4IDEwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgYmFja2dyb3VuZDogI2Y1ZjVmNTsKICAgIGNvbG9yOiAjMzMzOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX2FjdGlvbkJ0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiAjZmY5OTIyOwogICAgYm9yZGVyLWNvbG9yOiAjZmY5OTIyOwogICAgY29sb3I6ICNmZmY7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX2FjdGlvbkJ0bjpob3ZlciBpIHsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiQ3VzdG9tZXJJbmZvX19hY3Rpb25CdG4gaSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBjb2xvcjogIzY2NjsKICAgIHRyYW5zaXRpb246IGNvbG9yIDAuMTVzIGVhc2U7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBDYW5jZWwgQXBwb2ludG1lbnQgQnV0dG9uIChMaW5rZWRPYmplY3RzIHdpZGdldCkgICAgICAgICAgICAgKi8KLyogU3R5bGVkIHRvIG1hdGNoIFpudW55J3MgbmF0aXZlIC50YWJsZS1pY29uLWhvdmVyLW1kICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYkNhbmNlbEFwcG9pbnRtZW50IHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIHdpZHRoOiAzMHB4OwogICAgaGVpZ2h0OiAzMHB4OwogICAgcGFkZGluZzogMDsKICAgIGJvcmRlcjogbm9uZTsKICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgY29sb3I6IGluaGVyaXQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWJvcmRlci1yYWRpdXMteHMsIDRweCk7CiAgICB0cmFuc2l0aW9uOiB2YXIoLS1tYWluLXRyYW5zaXRpb24sIGFsbCAwLjE1cyBlYXNlKTsKfQoKLkNvbGxhYkNhbmNlbEFwcG9pbnRtZW50OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktY29sb3IsICNmZjk5MjIpOwp9CgouQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQ6aG92ZXIgaSB7CiAgICBjb2xvcjogdmFyKC0td2hpdGUsICNmZmYpOwp9CgouQ29sbGFiQ2FuY2VsQXBwb2ludG1lbnQgaSB7CiAgICBmb250LXNpemU6IHZhcigtLWZvbnQtc2l6ZS1sZywgMTZweCk7CiAgICB0cmFuc2l0aW9uOiB2YXIoLS1tYWluLXRyYW5zaXRpb24sIGFsbCAwLjE1cyBlYXNlKTsKfQoKLyogSW5saW5lIHZhcmlhbnQgZm9yIHN0YW5kYXJkIExpbmtlZE9iamVjdHMgd2lkZ2V0ICh3aXRob3V0IElUU00pICovCi5Db2xsYWJDYW5jZWxBcHBvaW50bWVudC0taW5saW5lIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHJpZ2h0OiA1cHg7CiAgICB0b3A6IDUwJTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNTAlKTsKfQoKLyogRW5zdXJlIHBhcmVudCBjZWxsIGhhcyByZWxhdGl2ZSBwb3NpdGlvbmluZyBhbmQgc3BhY2UgZm9yIGJ1dHRvbiAqLwouTGlua1RhYmxlIHRkLkNvbGxhYkNhbmNlbENlbGwgewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgcGFkZGluZy1yaWdodDogNDBweDsKfQoKLyogVXRpbGl0eSBjbGFzcyB0byBoaWRlIGVsZW1lbnRzICovCi5Db2xsYWJIaWRkZW4gewogICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50Owp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogUHJvdmlkZXIgTG9naW4gTWVudSBJdGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYlByb3ZpZGVyTG9naW5JdGVtLAouQ29sbGFiUHJvdmlkZXJMb2dvdXRJdGVtIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBwYWRkaW5nOiA4cHggMTVweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCwgIzMzMyk7CiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzIGVhc2U7CiAgICBjdXJzb3I6IHBvaW50ZXI7Cn0KCi5Db2xsYWJQcm92aWRlckxvZ2luSXRlbTpob3ZlciwKLkNvbGxhYlByb3ZpZGVyTG9nb3V0SXRlbTpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1jb2xsYWItaG92ZXItYmcsICNmNWY1ZjUpOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKfQoKLkNvbGxhYlByb3ZpZGVyTG9naW5JdGVtIGksCi5Db2xsYWJQcm92aWRlckxvZ291dEl0ZW0gaSB7CiAgICB3aWR0aDogMTZweDsKICAgIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLyogUHJvdmlkZXItc3BlY2lmaWMgaWNvbiBjb2xvcnMgKi8KLkNvbGxhYlByb3ZpZGVyTG9naW5JdGVtIC5mYS13aW5kb3dzIHsKICAgIGNvbG9yOiAjMDA3OGQ0OyAvKiBNaWNyb3NvZnQgYmx1ZSAqLwp9CgouQ29sbGFiUHJvdmlkZXJMb2dpbkl0ZW0gLmZhLWZsYXNrIHsKICAgIGNvbG9yOiAjNmM3NTdkOyAvKiBHcmF5IGZvciBNb2NrICovCn0KCi5Db2xsYWJQcm92aWRlckxvZ291dEl0ZW0gaSB7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM3NzcpOwp9CgovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLyogQ29sbGFib3JhdGlvbiBNb2RhbCBEaWFsb2dzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFN0eWxlZCByZXBsYWNlbWVudHMgZm9yIGJyb3dzZXIgYWxlcnQoKSBhbmQgY29uZmlybSgpICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIE92ZXJsYXkgKi8KLkNvbGxhYkRpYWxvZy1vdmVybGF5IHsKICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgIHRvcDogMDsKICAgIGxlZnQ6IDA7CiAgICByaWdodDogMDsKICAgIGJvdHRvbTogMDsKICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC41KTsKICAgIHotaW5kZXg6IDEwMDAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgIG9wYWNpdHk6IDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKfQoKLkNvbGxhYkRpYWxvZy1vdmVybGF5LS12aXNpYmxlIHsKICAgIG9wYWNpdHk6IDE7Cn0KCi5Db2xsYWJEaWFsb2ctb3ZlcmxheS0tY2xvc2luZyB7CiAgICBvcGFjaXR5OiAwOwp9CgovKiBEaWFsb2cgQ29udGFpbmVyICovCi5Db2xsYWJEaWFsb2cgewogICAgYmFja2dyb3VuZDogI2ZmZjsKICAgIGJvcmRlci1yYWRpdXM6IDZweDsKICAgIGJveC1zaGFkb3c6IDAgOHB4IDMycHggcmdiYSgwLCAwLCAwLCAwLjI1KTsKICAgIG1pbi13aWR0aDogMzIwcHg7CiAgICBtYXgtd2lkdGg6IDQ4MHB4OwogICAgbWF4LWhlaWdodDogODB2aDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgdHJhbnNmb3JtOiBzY2FsZSgwLjk1KTsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2U7Cn0KCi5Db2xsYWJEaWFsb2ctb3ZlcmxheS0tdmlzaWJsZSAuQ29sbGFiRGlhbG9nIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMSk7Cn0KCi5Db2xsYWJEaWFsb2ctb3ZlcmxheS0tY2xvc2luZyAuQ29sbGFiRGlhbG9nIHsKICAgIHRyYW5zZm9ybTogc2NhbGUoMC45NSk7Cn0KCi8qIERpYWxvZyBIZWFkZXIgKi8KLkNvbGxhYkRpYWxvZ19faGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiAxMHB4OwogICAgcGFkZGluZzogMTZweCAyMHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIsICNkZGQpOwogICAgYmFja2dyb3VuZDogI2ZhZmFmYTsKICAgIGJvcmRlci1yYWRpdXM6IDZweCA2cHggMCAwOwp9CgouQ29sbGFiRGlhbG9nX19pY29uIHsKICAgIGZvbnQtc2l6ZTogMjBweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouQ29sbGFiRGlhbG9nLS1pbmZvIC5Db2xsYWJEaWFsb2dfX2ljb24gewogICAgY29sb3I6ICMxN2EyYjg7Cn0KCi5Db2xsYWJEaWFsb2ctLXN1Y2Nlc3MgLkNvbGxhYkRpYWxvZ19faWNvbiB7CiAgICBjb2xvcjogIzI4YTc0NTsKfQoKLkNvbGxhYkRpYWxvZy0td2FybmluZyAuQ29sbGFiRGlhbG9nX19pY29uLAouQ29sbGFiRGlhbG9nLS1jb25maXJtIC5Db2xsYWJEaWFsb2dfX2ljb24gewogICAgY29sb3I6ICNmMGFkNGU7Cn0KCi5Db2xsYWJEaWFsb2ctLWVycm9yIC5Db2xsYWJEaWFsb2dfX2ljb24sCi5Db2xsYWJEaWFsb2ctLWRhbmdlciAuQ29sbGFiRGlhbG9nX19pY29uIHsKICAgIGNvbG9yOiAjZGMzNTQ1Owp9CgouQ29sbGFiRGlhbG9nX190aXRsZSB7CiAgICBmbGV4OiAxOwogICAgZm9udC1zaXplOiAxNnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCwgIzMzMyk7CiAgICBtYXJnaW46IDA7Cn0KCi5Db2xsYWJEaWFsb2dfX2Nsb3NlIHsKICAgIHdpZHRoOiAzMnB4OwogICAgaGVpZ2h0OiAzMnB4OwogICAgYm9yZGVyOiBub25lOwogICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkLCAjNzc3KTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgZmxleC1zaHJpbms6IDA7Cn0KCi5Db2xsYWJEaWFsb2dfX2Nsb3NlOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZywgI2Y1ZjVmNSk7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQsICMzMzMpOwp9CgovKiBEaWFsb2cgQm9keSAqLwouQ29sbGFiRGlhbG9nX19ib2R5IHsKICAgIHBhZGRpbmc6IDIwcHg7CiAgICBvdmVyZmxvdy15OiBhdXRvOwp9CgouQ29sbGFiRGlhbG9nX19tZXNzYWdlIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCwgIzMzMyk7CiAgICBsaW5lLWhlaWdodDogMS41OwogICAgd29yZC13cmFwOiBicmVhay13b3JkOwp9CgouQ29sbGFiRGlhbG9nX19kZXRhaWwgewogICAgbWFyZ2luLXRvcDogMTJweDsKICAgIHBhZGRpbmc6IDEycHg7CiAgICBiYWNrZ3JvdW5kOiAjZjlmOWY5OwogICAgYm9yZGVyOiAxcHggc29saWQgI2VlZTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dC1tdXRlZCwgIzc3Nyk7CiAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgIHdvcmQtYnJlYWs6IG5vcm1hbDsKICAgIG1heC1oZWlnaHQ6IDE1MHB4OwogICAgb3ZlcmZsb3cteTogYXV0bzsKfQoKLyogRGlhbG9nIEZvb3RlciAqLwouQ29sbGFiRGlhbG9nX19mb290ZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICBnYXA6IDEwcHg7CiAgICBwYWRkaW5nOiAxNnB4IDIwcHg7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwogICAgYm9yZGVyLXJhZGl1czogMCAwIDZweCA2cHg7Cn0KCi8qIERpYWxvZyBCdXR0b25zICovCi5Db2xsYWJEaWFsb2dfX2J0biB7CiAgICBwYWRkaW5nOiAxMHB4IDIwcHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBmb250LXNpemU6IDEzcHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgdHJhbnNpdGlvbjogYWxsIDAuMTVzIGVhc2U7CiAgICBtaW4td2lkdGg6IDgwcHg7Cn0KCi5Db2xsYWJEaWFsb2dfX2J0bjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItaG92ZXItYmcsICNmNWY1ZjUpOwp9CgouQ29sbGFiRGlhbG9nX19idG46Zm9jdXMgewogICAgb3V0bGluZTogbm9uZTsKICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDI1NSwgMTUzLCAzNCwgMC4yNSk7Cn0KCi5Db2xsYWJEaWFsb2dfX2J0bi0tcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiRGlhbG9nX19idG4tLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmstaG92ZXIsICNlODApOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluay1ob3ZlciwgI2U4MCk7Cn0KCi5Db2xsYWJEaWFsb2dfX2J0bi0tc2Vjb25kYXJ5IHsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1ib3JkZXIsICNkZGQpOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKfQoKLkNvbGxhYkRpYWxvZ19fYnRuLS1zZWNvbmRhcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWhvdmVyLWJnLCAjZjVmNWY1KTsKfQoKLyogRGFuZ2VyIHZhcmlhbnQgZm9yIGRlc3RydWN0aXZlIGFjdGlvbnMgKi8KLkNvbGxhYkRpYWxvZy0tZGFuZ2VyIC5Db2xsYWJEaWFsb2dfX2J0bi0tcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiAjZGMzNTQ1OwogICAgYm9yZGVyLWNvbG9yOiAjZGMzNTQ1Owp9CgouQ29sbGFiRGlhbG9nLS1kYW5nZXIgLkNvbGxhYkRpYWxvZ19fYnRuLS1wcmltYXJ5OmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNjODIzMzM7CiAgICBib3JkZXItY29sb3I6ICNjODIzMzM7Cn0KCi8qIERpYWxvZyBBY3Rpb24gQnV0dG9ucyAoQ29weSBMaW5rLCBKb2luIE1lZXRpbmcsIGV0Yy4pICovCi5Db2xsYWJEaWFsb2dfX2FjdGlvbnMgewogICAgZGlzcGxheTogZmxleDsKICAgIGdhcDogMTBweDsKICAgIG1hcmdpbi10b3A6IDE2cHg7CiAgICBmbGV4LXdyYXA6IHdyYXA7Cn0KCi5Db2xsYWJEaWFsb2dfX2FjdGlvbkJ0biB7CiAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDZweDsKICAgIHBhZGRpbmc6IDhweCAxNnB4OwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgZm9udC1zaXplOiAxM3B4OwogICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCwgIzMzMyk7CiAgICB0cmFuc2l0aW9uOiBhbGwgMC4xNXMgZWFzZTsKfQoKLkNvbGxhYkRpYWxvZ19fYWN0aW9uQnRuOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1ob3Zlci1iZywgI2Y1ZjVmNSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7Cn0KCi5Db2xsYWJEaWFsb2dfX2FjdGlvbkJ0biBpIHsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQoKLyogUHJpbWFyeSBhY3Rpb24gYnV0dG9uIChlLmcuLCBKb2luIE1lZXRpbmcpICovCi5Db2xsYWJEaWFsb2dfX2FjdGlvbkJ0bi0tcHJpbWFyeSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7CiAgICBib3JkZXItY29sb3I6IHZhcigtLWNvbGxhYi1saW5rLCAjZjkyKTsKICAgIGNvbG9yOiAjZmZmOwp9CgouQ29sbGFiRGlhbG9nX19hY3Rpb25CdG4tLXByaW1hcnk6aG92ZXIgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmstaG92ZXIsICNlODApOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluay1ob3ZlciwgI2U4MCk7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYkRpYWxvZ19fYWN0aW9uQnRuLS1wcmltYXJ5IGkgewogICAgY29sb3I6ICNmZmY7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBPd25lciBJbmZvIFBhbmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jb250YWluZXIgewogICAgbWFyZ2luLXRvcDogMTBweDsKICAgIG1hcmdpbi1ib3R0b206IDEwcHg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbCB7CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBib3JkZXItcmFkaXVzOiA2cHg7CiAgICBib3gtc2hhZG93OiAwIDJweCA4cHggcmdiYSgwLCAwLCAwLCAwLjA4KTsKICAgIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbC0tbG9hZGluZyB7CiAgICBwYWRkaW5nOiAyMHB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkLCAjNjY2KTsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsLS1sb2FkaW5nIGkgewogICAgbWFyZ2luLXJpZ2h0OiA2cHg7Cn0KCi8qIFBhbmVsIEhlYWRlciAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hlYWRlciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIHBhZGRpbmc6IDEycHggMTZweDsKICAgIGJhY2tncm91bmQ6ICNmYWZhZmE7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fYXZhdGFyIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2luZm8gewogICAgZmxleDogMTsKICAgIG1pbi13aWR0aDogMDsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fbmFtZVJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogOHB4OwogICAgZmxleC13cmFwOiBub3dyYXA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fbmFtZSB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7Cn0KCi8qIENhbGVuZGFyIFRvZ2dsZSBCdXR0b24gKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX190b2dnbGUgewogICAgd2lkdGg6IDMycHg7CiAgICBoZWlnaHQ6IDMycHg7CiAgICBib3JkZXI6IG5vbmU7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM2NjYpOwogICAgdHJhbnNpdGlvbjogY29sb3IgMC4xNXMgZWFzZTsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX3RvZ2dsZTpob3ZlciB7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX3RvZ2dsZSBpIHsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdG9nZ2xlLS1jb2xsYXBzZWQgaSB7CiAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwp9CgovKiBCYWRnZXMgaW4gaGVhZGVyIChXb3JrTG9jYXRpb24pIC0gcHVzaCB0byByaWdodCAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hlYWRlciAuQ29sbGFiV29ya0xvY2F0aW9uIHsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBGaXJzdCBiYWRnZSBnZXRzIGF1dG8gbWFyZ2luIHRvIHB1c2ggYmFkZ2VzIHJpZ2h0ICh3aGVuIG5vIHRvZ2dsZSkgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19pbmZvICsgLkNvbGxhYldvcmtMb2NhdGlvbiB7CiAgICBtYXJnaW4tbGVmdDogYXV0bzsKfQoKLyogQ2FsZW5kYXIgV3JhcHBlciAoY29sbGFwc2libGUpICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9fY2FsZW5kYXJXcmFwcGVyIHsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB0cmFuc2l0aW9uOiBtYXgtaGVpZ2h0IDAuM3MgZWFzZSwgb3BhY2l0eSAwLjNzIGVhc2U7CiAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgIG9wYWNpdHk6IDE7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fY2FsZW5kYXJXcmFwcGVyLS1jb2xsYXBzZWQgewogICAgbWF4LWhlaWdodDogMDsKICAgIG9wYWNpdHk6IDA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdGl0bGUgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkLCAjNjY2KTsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICBtYXJnaW4tdG9wOiAycHg7Cn0KCi8qIFdlZWsgQ2FsZW5kYXIgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxlbmRhciB7CiAgICBwYWRkaW5nOiAxMnB4IDE2cHg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fY2FsSGVhZGVyIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgbWFyZ2luLWJvdHRvbTogMTBweDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxOYXYgewogICAgd2lkdGg6IDI4cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkLCAjNjY2KTsKICAgIHRyYW5zaXRpb246IGFsbCAwLjE1cyBlYXNlOwogICAgcGFkZGluZzogMDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxOYXY6aG92ZXI6bm90KDpkaXNhYmxlZCkgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1jb2xsYWItbGluaywgI2Y5Mik7CiAgICBjb2xvcjogI2ZmZjsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxOYXY6ZGlzYWJsZWQgewogICAgb3BhY2l0eTogMC40OwogICAgY3Vyc29yOiBub3QtYWxsb3dlZDsKICAgIGJhY2tncm91bmQ6ICNmNWY1ZjU7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fY2FsTGFiZWwgewogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgIGNvbG9yOiB2YXIoLS1jb2xsYWItdGV4dCwgIzMzMyk7Cn0KCi8qIENhbGVuZGFyIEJvZHkgLSBGbGV4IGNvbnRhaW5lciBmb3IgZGF5IGxhYmVscyArIHNjcm9sbGFibGUgdGltZWxpbmUgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19jYWxCb2R5IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1jb2xsYWItYm9yZGVyLCAjZGRkKTsKICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwp9CgovKiBEYXkgTGFiZWxzIENvbHVtbiAtIFN0aWNreSBsZWZ0IHNpZGUgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbHNDb2wgewogICAgZmxleC1zaHJpbms6IDA7CiAgICBiYWNrZ3JvdW5kOiAjZjVmNWY1OwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbHNJbm5lciB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogMnB4IDA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWxIZWFkZXIgewogICAgaGVpZ2h0OiAyOHB4OwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWNvbGxhYi1ib3JkZXIsICNkZGQpOwp9CgovKiBEYXkgTGFiZWwgKE1vIDIzKSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsIHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA0cHg7CiAgICBwYWRkaW5nOiA0cHggMTBweDsKICAgIGhlaWdodDogMjhweDsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi8qIFRvZGF5IGluZGljYXRvciBvbiBkYXkgbGFiZWwgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlMYWJlbC0tdG9kYXkgewogICAgYmFja2dyb3VuZDogdmFyKC0tY29sbGFiLWxpbmssICNmOTIpOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheUxhYmVsLS10b2RheSAuQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheU5hbWUsCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWwtLXRvZGF5IC5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TnVtIHsKICAgIGNvbG9yOiAjZmZmICFpbXBvcnRhbnQ7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5TGFiZWwtLXdlZWtlbmQgewogICAgYmFja2dyb3VuZDogI2VlZTsKICAgIG9wYWNpdHk6IDAuODsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlOYW1lIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKICAgIGZvbnQtd2VpZ2h0OiA2MDA7CiAgICBjb2xvcjogdmFyKC0tY29sbGFiLXRleHQtbXV0ZWQsICM2NjYpOwogICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgIHdpZHRoOiAyMHB4Owp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheU51bSB7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LCAjMzMzKTsKfQoKLyogU2Nyb2xsYWJsZSBUaW1lbGluZSBBcmVhICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdGltZWxpbmVTY3JvbGwgewogICAgZmxleDogMTsKICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICBvdmVyZmxvdy15OiBoaWRkZW47CiAgICBiYWNrZ3JvdW5kOiAjZmZmOwp9CgovKiBIb3VyIExhYmVscyBSb3cgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyTGFiZWxzUm93IHsKICAgIGRpc3BsYXk6IGZsZXg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tY29sbGFiLWJvcmRlciwgI2RkZCk7CiAgICBiYWNrZ3JvdW5kOiAjZmFmYWZhOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJMYWJlbCB7CiAgICB3aWR0aDogMTRweDsgIC8qIEVhY2ggaGFsZi1ob3VyIGJsb2NrIGlzIDE0cHggKi8KICAgIGZsZXgtc2hyaW5rOiAwOwogICAgZm9udC1zaXplOiA5cHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6IHZhcigtLWNvbGxhYi10ZXh0LW11dGVkLCAjODg4KTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBwYWRkaW5nLWxlZnQ6IDFweDsKICAgIGxpbmUtaGVpZ2h0OiAyOHB4OwogICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtczsKICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBCbGlua01hY1N5c3RlbUZvbnQsICJTZWdvZSBVSSIsIG1vbm9zcGFjZTsKfQoKLyogQm9yZGVyIG9ubHkgb24gZnVsbCBob3VyIGxhYmVscyAoZXZlcnkgMm5kIHNsb3QpICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsLS1ob3VyU3RhcnQgewogICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMSk7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckxhYmVsLS1ob3VyU3RhcnQ6Zmlyc3QtY2hpbGQgewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7Cn0KCi8qIEVtcHR5IHBsYWNlaG9sZGVyIGZvciBhbGlnbm1lbnQgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyTGFiZWxFbXB0eSB7CiAgICB3aWR0aDogMTRweDsKICAgIGZsZXgtc2hyaW5rOiAwOwp9CgovKiBEYXlzIEdyaWQgKHJvd3Mgb2YgaGFsZi1ob3VyIGJsb2NrcykgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlzR3JpZCB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgIGdhcDogM3B4OwogICAgcGFkZGluZzogMnB4IDA7CiAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnMgZWFzZTsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlzR3JpZC0tbG9hZGluZyB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLyogRGF5IFJvdyAob25lIHJvdyBvZiBoYWxmLWhvdXIgYmxvY2tzKSAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgaGVpZ2h0OiAyOHB4Owp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdzpsYXN0LWNoaWxkIHsKICAgIC8qIG5vIHNwZWNpYWwgc3R5bGluZyBuZWVkZWQgd2l0aCBnYXAgKi8KfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19kYXlSb3ctLXdlZWtlbmQgewogICAgYmFja2dyb3VuZDogI2Y4ZjhmODsKfQoKLyogSW5kaXZpZHVhbCBIYWxmLUhvdXIgQmxvY2sgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2sgewogICAgd2lkdGg6IDE0cHg7CiAgICBoZWlnaHQ6IDI4cHg7CiAgICBmbGV4LXNocmluazogMDsKICAgIGJhY2tncm91bmQ6ICNlOGY1ZTk7ICAvKiBMaWdodCBncmVlbiA9IGZyZWUgKi8KICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xcyBlYXNlOwogICAgY3Vyc29yOiBkZWZhdWx0OwogICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjUpOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2s6bGFzdC1jaGlsZCB7CiAgICBib3JkZXItcmlnaHQ6IG5vbmU7Cn0KCi8qIEZ1bGwgaG91ciBzZXBhcmF0b3IgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2stLWhvdXJTdGFydCB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xKTsKfQoKLyogV29yayBob3VycyAoOC0xOCkgc2xpZ2h0bHkgaGlnaGxpZ2h0ZWQgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX19ob3VyQmxvY2stLXdvcmtIb3VycyB7CiAgICBiYWNrZ3JvdW5kOiAjYzhlNmM5OyAgLyogU2xpZ2h0bHkgZGFya2VyIGdyZWVuIGZvciB3b3JrIGhvdXJzICovCn0KCi8qIEJ1c3kgaG91ciBibG9jayAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jay0tYnVzeSB7CiAgICBiYWNrZ3JvdW5kOiB2YXIoLS1jb2xsYWItcHJlc2VuY2UtYnVzeSwgI2Q5NTM0ZikgIWltcG9ydGFudDsKfQoKLyogSG92ZXIgZWZmZWN0IG9uIGhvdXIgYmxvY2tzICovCi5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrOmhvdmVyIHsKICAgIGZpbHRlcjogYnJpZ2h0bmVzcygwLjkpOwp9CgovKiBXZWVrZW5kIHJvdyBob3VyIGJsb2NrcyAqLwouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdy0td2Vla2VuZCAuQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jayB7CiAgICBiYWNrZ3JvdW5kOiAjZjBmMGYwOwp9CgouQ29sbGFiT3duZXJJbmZvUGFuZWxfX2RheVJvdy0td2Vla2VuZCAuQ29sbGFiT3duZXJJbmZvUGFuZWxfX2hvdXJCbG9jay0td29ya0hvdXJzIHsKICAgIGJhY2tncm91bmQ6ICNlOGU4ZTg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fZGF5Um93LS13ZWVrZW5kIC5Db2xsYWJPd25lckluZm9QYW5lbF9faG91ckJsb2NrLS1idXN5IHsKICAgIGJhY2tncm91bmQ6IHZhcigtLWNvbGxhYi1wcmVzZW5jZS1idXN5LCAjZDk1MzRmKSAhaW1wb3J0YW50Owp9CgovKiBTY3JvbGxiYXIgc3R5bGluZyBmb3IgdGltZWxpbmUgKi8KLkNvbGxhYk93bmVySW5mb1BhbmVsX190aW1lbGluZVNjcm9sbDo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgaGVpZ2h0OiA4cHg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdGltZWxpbmVTY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgIGJhY2tncm91bmQ6ICNmMGYwZjA7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdGltZWxpbmVTY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iIHsKICAgIGJhY2tncm91bmQ6ICNjY2M7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KCi5Db2xsYWJPd25lckluZm9QYW5lbF9fdGltZWxpbmVTY3JvbGw6Oi13ZWJraXQtc2Nyb2xsYmFyLXRodW1iOmhvdmVyIHsKICAgIGJhY2tncm91bmQ6ICNhYWE7Cn0KCi8qIEN1c3RvbWVySW5mbyBtYWluIHJvdyAtIGhvdmVyIHRyaWdnZXIgYXJlYSAoYXZhdGFyLCBuYW1lLCB0aXRsZSkgKi8KLkNvbGxhYkN1c3RvbWVySW5mb19fbWFpblJvdyB7CiAgICBkaXNwbGF5OiBmbGV4OwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIGdhcDogMTJweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLyogSG92ZXIgZWZmZWN0OiB0ZXh0IHR1cm5zIG9yYW5nZSBvbiBtYWluIHJvdyBob3ZlciAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvX19tYWluUm93OmhvdmVyIC5Db2xsYWJVc2VyQmFkZ2VfX25hbWUsCi5Db2xsYWJDdXN0b21lckluZm9fX21haW5Sb3c6aG92ZXIgLkNvbGxhYlVzZXJCYWRnZV9fdGl0bGUgewogICAgY29sb3I6ICNmZjk5MjI7Cn0KCi8qIFdvcmsgTG9jYXRpb24gYmFkZ2UgaW4gQ3VzdG9tZXJJbmZvIGluZm8gYXJlYSAtIGZpdHMgY29udGVudCwgbm8gc3RyZXRjaCAqLwouQ29sbGFiVXNlckJhZGdlX19pbmZvIC5Db2xsYWJXb3JrTG9jYXRpb24gewogICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgIG1hcmdpbi10b3A6IDRweDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi8qIER5bmFtaWMgQ3VzdG9tZXIgSW5mbyBXaWRnZXQgKFRpY2tldCBDcmVhdGUgUGFnZXMpICAgICAgICAgICAqLwovKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qIEVtcHR5IHN0YXRlIHdpZGdldCBtb2RpZmllciAqLwouQ29sbGFiQ3VzdG9tZXJJbmZvV2lkZ2V0LS1lbXB0eSAuc2lkZWJhcldpZGdldENvbnRlbnQgewogICAgcGFkZGluZzogMjBweCAxNXB4OwogICAgdGV4dC1hbGlnbjogY2VudGVyOwp9CgovKiBQbGFjZWhvbGRlciBzdHlsaW5nIGZvciBlbXB0eSB3aWRnZXQgKi8KLkNvbGxhYkN1c3RvbWVySW5mb19fcGxhY2Vob2xkZXIgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgZ2FwOiA4cHg7CiAgICBjb2xvcjogIzk5OTsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fcGxhY2Vob2xkZXIgaSB7CiAgICBmb250LXNpemU6IDQ4cHg7CiAgICBjb2xvcjogI2NjYzsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fcGxhY2Vob2xkZXIgc3BhbiB7CiAgICBmb250LXNpemU6IDE0cHg7CiAgICBmb250LXdlaWdodDogNTAwOwogICAgY29sb3I6ICM2NjY7Cn0KCi5Db2xsYWJDdXN0b21lckluZm9fX3BsYWNlaG9sZGVyIHNtYWxsIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGNvbG9yOiAjOTk5Owp9CgovKiBMb2FkaW5nIHN0YXRlICovCi5Db2xsYWJDdXN0b21lckluZm9fX2xvYWRpbmcgewogICAgZGlzcGxheTogZmxleDsKICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgIHBhZGRpbmc6IDMwcHg7CiAgICBjb2xvcjogIzk5OTsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fbG9hZGluZyBpIHsKICAgIGZvbnQtc2l6ZTogMjRweDsKfQoKLyogRXJyb3Igc3RhdGUgKi8KLkNvbGxhYkN1c3RvbWVySW5mb19fZXJyb3IgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIHBhZGRpbmc6IDE1cHg7CiAgICBjb2xvcjogI2Q5NTM0ZjsKICAgIGZvbnQtc2l6ZTogMTNweDsKfQoKLkNvbGxhYkN1c3RvbWVySW5mb19fZXJyb3IgaSB7CiAgICBmb250LXNpemU6IDE2cHg7Cn0KCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwovKiBUaWNrZXQgSW5mbyBBdmF0YXJzIChPd25lci9SZXNwb25zaWJsZSBpbiBUaWNrZXQtSW5mbyBXaWRnZXQpICovCi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXIgewogICAgZGlzcGxheTogYmxvY2s7Cn0KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyX19yb3cgewogICAgZGlzcGxheTogZmxleDsKICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICBnYXA6IDhweDsKICAgIGN1cnNvcjogcG9pbnRlcjsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX3Jvdzpob3ZlciAuQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fbmFtZSB7CiAgICBjb2xvcjogI2ZmOTkyMjsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhciB7CiAgICBmbGV4LXNocmluazogMDsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhciAuQ29sbGFiQXZhdGFyIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4Owp9CgouQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ltYWdlLAouQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIHdpZHRoOiAyOHB4OwogICAgaGVpZ2h0OiAyOHB4Owp9CgouQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9fYXZhdGFyIC5Db2xsYWJBdmF0YXJfX2ZhbGxiYWNrIHsKICAgIGZvbnQtc2l6ZTogMTFweDsKfQoKLkNvbGxhYlRpY2tldEluZm9BdmF0YXJfX2F2YXRhciAuQ29sbGFiUHJlc2VuY2UgewogICAgd2lkdGg6IDEwcHg7CiAgICBoZWlnaHQ6IDEwcHg7CiAgICBib3R0b206IC0xcHg7CiAgICByaWdodDogLTFweDsKICAgIGJvcmRlci13aWR0aDogMnB4Owp9CgouQ29sbGFiVGlja2V0SW5mb0F2YXRhcl9faW5mbyB7CiAgICBmbGV4OiAxOwogICAgbWluLXdpZHRoOiAwOwogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47Cn0KCi5Db2xsYWJUaWNrZXRJbmZvQXZhdGFyX19uYW1lIHsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICBjb2xvcjogIzMzMzsKICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICB0cmFuc2l0aW9uOiBjb2xvciAwLjE1cyBlYXNlOwp9CgovKiBFbnN1cmUgVmFsdWUgZWxlbWVudCBkb2Vzbid0IGFkZCBleHRyYSBzdHlsaW5nIC0gY2xhc3MgaXMgYXBwbGllZAogICBkaXJlY3RseSB0byB0aGUgc3BlY2lmaWMgLlZhbHVlIGVsZW1lbnQgYmVpbmcgcmVwbGFjZWQsIG5vdCBhIHNoYXJlZAogICBhbmNlc3RvciAoT3duZXIvUmVzcG9uc2libGUvQ3VzdG9tZXIgSUQgY2FuIGJlIHNpYmxpbmdzIGluIHRoZSBzYW1lCiAgIGZpZWxkc2V0LCBzbyBhIHNoYXJlZC1hbmNlc3RvciBzZWxlY3RvciB3b3VsZCBhZmZlY3QgYWxsIG9mIHRoZW0pLiAqLwouVmFsdWUuQ29sbGFiVGlja2V0SW5mby0tcHJvY2Vzc2VkIHsKICAgIHBhZGRpbmc6IDA7CiAgICBtYXJnaW46IDA7Cn0KCi8qIFJlbW92ZSBsaW5rIHN0eWxpbmcgZnJvbSBuYXRpdmUgZWxlbWVudHMgd2hlbiByZXBsYWNlZCAqLwouVmFsdWUuQ29sbGFiVGlja2V0SW5mby0tcHJvY2Vzc2VkIGEgewogICAgZGlzcGxheTogY29udGVudHM7Cn0K</File>

        <!-- Templates -->
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/Collaboration/Init.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gSW5pdGlhbGl6YXRpb24gVGVtcGxhdGUKCiAgICBUaGlzIHRlbXBsYXRlIGluaXRpYWxpemVzIHRoZSBDb2xsYWJvcmF0aW9uIEphdmFTY3JpcHQgbW9kdWxlcyB3aXRoCiAgICBjb25maWd1cmF0aW9uIGZyb20gU3lzQ29uZmlnLiBJdCBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0aGUgcGFnZQogICAgaGVhZCB2aWEgYW4gT3V0cHV0IEZpbHRlci4KCiAgICBWYXJpYWJsZXMgcHJvdmlkZWQgYnkgdGhlIE91dHB1dCBGaWx0ZXI6CiAgICAtIERhdGEuUHJvdmlkZXIgICAgICAgICA6IEFjdGl2ZSBwcm92aWRlciBuYW1lIChNMzY1LCBNb2NrKQogICAgLSBEYXRhLkZhbGxiYWNrUHJvdmlkZXIgOiBGYWxsYmFjayBwcm92aWRlciBuYW1lIChabnVueSwgZW1wdHkpCiAgICAtIERhdGEuVGVuYW50SUQgICAgICAgICA6IE1pY3Jvc29mdCAzNjUgVGVuYW50IElECiAgICAtIERhdGEuQ2xpZW50SUQgICAgICAgICA6IE1pY3Jvc29mdCAzNjUgQ2xpZW50IElECiAgICAtIERhdGEuUmVkaXJlY3RVUkkgICAgICA6IE9BdXRoIFJlZGlyZWN0IFVSSQogICAgLSBEYXRhLkVuYWJsZUF2YXRhciAgICAgOiAxLzAKICAgIC0gRGF0YS5FbmFibGVQcmVzZW5jZSAgIDogMS8wCiAgICAtIERhdGEuRW5hYmxlSG92ZXJDYXJkcyA6IDEvMAogICAgLSBEYXRhLkVuYWJsZUNoYXQgICAgICAgOiAxLzAKICAgIC0gRGF0YS5FbmFibGVDYWxsICAgICAgIDogMS8wCiAgICAtIERhdGEuRW5hYmxlTWVldGluZ3MgICA6IDEvMAogICAgLSBEYXRhLkVuYWJsZU93bmVySW5mb1BhbmVsIDogMS8wCiAgICAtIERhdGEuT3duZXJFbWFpbCAgICAgICA6IE93bmVyIGVtYWlsIChvbiBBZ2VudFRpY2tldFpvb20pCiAgICAtIERhdGEuT3duZXJOYW1lICAgICAgICA6IE93bmVyIG5hbWUgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5Pd25lcklEICAgICAgICAgIDogT3duZXIgSUQgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5SZXNwb25zaWJsZUVtYWlsIDogUmVzcG9uc2libGUgZW1haWwgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5SZXNwb25zaWJsZU5hbWUgIDogUmVzcG9uc2libGUgbmFtZSAob24gQWdlbnRUaWNrZXRab29tKQogICAgLSBEYXRhLlJlc3BvbnNpYmxlSUQgICAgOiBSZXNwb25zaWJsZSBJRCAob24gQWdlbnRUaWNrZXRab29tKQogICAgLSBEYXRhLlNob3dJbkhlYWRlciAgICAgOiAxLzAKICAgIC0gRGF0YS5TaG93SW5UaWNrZXRJbmZvIDogMS8wCiAgICAtIERhdGEuU2hvd0luQXJ0aWNsZXMgICA6IDEvMAogICAgLSBEYXRhLlNob3dDdXN0b21lckluZm9XaWRnZXQgOiAxLzAKICAgIC0gRGF0YS5IaWRlTmF0aXZlQ3VzdG9tZXJJbmZvIDogMS8wCiAgICAtIERhdGEuRHluYW1pY0N1c3RvbWVyU2VsZWN0aW9uIDogMS8wIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlcykKICAgIC0gRGF0YS5DYWNoZUF2YXRhclRUTCAgIDogc2Vjb25kcwogICAgLSBEYXRhLkNhY2hlUHJlc2VuY2VUVEwgOiBzZWNvbmRzCiAgICAtIERhdGEuQ2FjaGVQcm9maWxlVFRMICA6IHNlY29uZHMKICAgIC0gRGF0YS5Vc2VyRW1haWwgICAgICAgIDogQ3VycmVudCBhZ2VudCdzIGVtYWlsIGFkZHJlc3MKICAgIC0gRGF0YS5DdXN0b21lckVtYWlsICAgIDogQ3VzdG9tZXIgZW1haWwgKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5DdXN0b21lckxvZ2luICAgIDogQ3VzdG9tZXIgbG9naW4gKG9uIEFnZW50VGlja2V0Wm9vbSkKICAgIC0gRGF0YS5DdXN0b21lck5hbWUgICAgIDogQ3VzdG9tZXIgbmFtZSAob24gQWdlbnRUaWNrZXRab29tKQolXQoKWyUjIE1TQUwuanMgaXMgbG9hZGVkIHZpYSBabnVueSBMb2FkZXIgKENvbGxhYm9yYXRpb24ueG1sKSB0byBlbnN1cmUgY29ycmVjdCBsb2FkIG9yZGVyICVdClslIyBGYWxsYmFjazogTG9hZCBNU0FMLmpzIHZpYSBzY3JpcHQgdGFnIGlmIG5vdCBhbHJlYWR5IGxvYWRlZCAoZS5nLiwgbG9hZGVyIGNhY2hlIGlzc3VlKSAlXQpbJSBJRiBEYXRhLlByb3ZpZGVyID09ICdNMzY1JyAlXQo8c2NyaXB0PgppZiAodHlwZW9mIG1zYWwgPT09ICd1bmRlZmluZWQnKSB7CiAgICBkb2N1bWVudC53cml0ZSgnPHNjcmlwdCBzcmM9IlslIENvbmZpZygiRnJvbnRlbmQ6OldlYlBhdGgiKSAlXWpzL3RoaXJkcGFydHkvbXNhbC1icm93c2VyLTQuMjcuMC9tc2FsLWJyb3dzZXIubWluLmpzIj48XC9zY3JpcHQ+Jyk7Cn0KPC9zY3JpcHQ+ClslIEVORCAlXQoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBDb2xsYWJvcmF0aW9uIENvbmZpZ3VyYXRpb24gLSB3YWl0IGZvciBDb3JlLkNvbmZpZyB0byBiZSBhdmFpbGFibGUKICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgQ29sbGFib3JhdGlvbkNvbmZpZyA9IHsKICAgICAgICAgICAgUHJvdmlkZXI6ICdbJSBEYXRhLlByb3ZpZGVyIHwgaHRtbCAlXScsCiAgICAgICAgICAgIEZhbGxiYWNrUHJvdmlkZXI6ICdbJSBEYXRhLkZhbGxiYWNrUHJvdmlkZXIgfCBodG1sICVdJywKICAgICAgICAgICAgUHJvdmlkZXJNMzY1OiB7CiAgICAgICAgICAgICAgICBUZW5hbnRJRDogJ1slIERhdGEuVGVuYW50SUQgfCBodG1sICVdJywKICAgICAgICAgICAgICAgIENsaWVudElEOiAnWyUgRGF0YS5DbGllbnRJRCB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgUmVkaXJlY3RVUkk6ICdbJSBEYXRhLlJlZGlyZWN0VVJJIHwgaHRtbCAlXScKICAgICAgICAgICAgfSwKICAgICAgICAgICAgRW5hYmxlQXZhdGFyOiBbJSBJRiBEYXRhLkVuYWJsZUF2YXRhciAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIEVuYWJsZVByZXNlbmNlOiBbJSBJRiBEYXRhLkVuYWJsZVByZXNlbmNlICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlSG92ZXJDYXJkczogWyUgSUYgRGF0YS5FbmFibGVIb3ZlckNhcmRzICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlQ2hhdDogWyUgSUYgRGF0YS5FbmFibGVDaGF0ICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlQ2FsbDogWyUgSUYgRGF0YS5FbmFibGVDYWxsICVddHJ1ZVslIEVMU0UgJV1mYWxzZVslIEVORCAlXSwKICAgICAgICAgICAgRW5hYmxlTWVldGluZ3M6IFslIElGIERhdGEuRW5hYmxlTWVldGluZ3MgJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICBFbmFibGVPd25lckluZm9QYW5lbDogWyUgSUYgRGF0YS5FbmFibGVPd25lckluZm9QYW5lbCAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIFNob3dJbkhlYWRlcjogWyUgSUYgRGF0YS5TaG93SW5IZWFkZXIgJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICBTaG93SW5UaWNrZXRJbmZvOiBbJSBJRiBEYXRhLlNob3dJblRpY2tldEluZm8gJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICBTaG93SW5BcnRpY2xlczogWyUgSUYgRGF0YS5TaG93SW5BcnRpY2xlcyAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIFNob3dDdXN0b21lckluZm9XaWRnZXQ6IFslIElGIERhdGEuU2hvd0N1c3RvbWVySW5mb1dpZGdldCAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIEhpZGVOYXRpdmVDdXN0b21lckluZm86IFslIElGIERhdGEuSGlkZU5hdGl2ZUN1c3RvbWVySW5mbyAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0sCiAgICAgICAgICAgIENhY2hlOiB7CiAgICAgICAgICAgICAgICBBdmF0YXJUVEw6IFslIERhdGEuQ2FjaGVBdmF0YXJUVEwgfHwgMzYwMCAlXSwKICAgICAgICAgICAgICAgIFByZXNlbmNlVFRMOiBbJSBEYXRhLkNhY2hlUHJlc2VuY2VUVEwgfHwgNjAgJV0sCiAgICAgICAgICAgICAgICBQcm9maWxlVFRMOiBbJSBEYXRhLkNhY2hlUHJvZmlsZVRUTCB8fCA4NjQwMCAlXQogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBDdXJyZW50IGFnZW50IGRhdGEKICAgICAgICAgICAgVXNlckVtYWlsOiAnWyUgRGF0YS5Vc2VyRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgVXNlckZ1bGxuYW1lOiAnWyUgRGF0YS5Vc2VyRnVsbG5hbWUgfCBodG1sICVdJywKICAgICAgICAgICAgLy8gQ3VzdG9tZXIgZGF0YSAob25seSBvbiBBZ2VudFRpY2tldFpvb20pCiAgICAgICAgICAgIEN1c3RvbWVyRW1haWw6ICdbJSBEYXRhLkN1c3RvbWVyRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgQ3VzdG9tZXJMb2dpbjogJ1slIERhdGEuQ3VzdG9tZXJMb2dpbiB8IGh0bWwgJV0nLAogICAgICAgICAgICBDdXN0b21lck5hbWU6ICdbJSBEYXRhLkN1c3RvbWVyTmFtZSB8IGh0bWwgJV0nLAogICAgICAgICAgICAvLyBUaWNrZXQgb3duZXJzaGlwIChmb3Igc2hvd2luZyBNZWV0aW5nIGJ1dHRvbiBvbmx5IHRvIG93bmVyKQogICAgICAgICAgICBJc1RpY2tldE93bmVyOiBbJSBJRiBEYXRhLklzVGlja2V0T3duZXIgJV10cnVlWyUgRUxTRSAlXWZhbHNlWyUgRU5EICVdLAogICAgICAgICAgICAvLyBPd25lciBhbmQgUmVzcG9uc2libGUgZGF0YSAob25seSBvbiBBZ2VudFRpY2tldFpvb20pCiAgICAgICAgICAgIE93bmVyRW1haWw6ICdbJSBEYXRhLk93bmVyRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgT3duZXJOYW1lOiAnWyUgRGF0YS5Pd25lck5hbWUgfCBodG1sICVdJywKICAgICAgICAgICAgT3duZXJJRDogWyUgRGF0YS5Pd25lcklEIHx8IDAgJV0sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRW1haWw6ICdbJSBEYXRhLlJlc3BvbnNpYmxlRW1haWwgfCBodG1sICVdJywKICAgICAgICAgICAgUmVzcG9uc2libGVOYW1lOiAnWyUgRGF0YS5SZXNwb25zaWJsZU5hbWUgfCBodG1sICVdJywKICAgICAgICAgICAgUmVzcG9uc2libGVJRDogWyUgRGF0YS5SZXNwb25zaWJsZUlEIHx8IDAgJV0sCiAgICAgICAgICAgIC8vIER5bmFtaWMgY3VzdG9tZXIgc2VsZWN0aW9uIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlczogQWdlbnRUaWNrZXRQaG9uZSwgQWdlbnRUaWNrZXRFbWFpbCwgQWdlbnRUaWNrZXRDdXN0b21lcikKICAgICAgICAgICAgRHluYW1pY0N1c3RvbWVyU2VsZWN0aW9uOiBbJSBJRiBEYXRhLkR5bmFtaWNDdXN0b21lclNlbGVjdGlvbiAlXXRydWVbJSBFTFNFICVdZmFsc2VbJSBFTkQgJV0KICAgICAgICB9OwoKICAgICAgICAvLyBGdW5jdGlvbiB0byBpbml0aWFsaXplIHdoZW4gcmVhZHkKICAgICAgICBmdW5jdGlvbiBJbml0Q29sbGFib3JhdGlvbigpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBDb3JlICE9PSAndW5kZWZpbmVkJyAmJiBDb3JlLkNvbmZpZyAmJiBDb3JlLkNvbmZpZy5TZXQpIHsKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLlNldCgnQ29sbGFib3JhdGlvbicsIENvbGxhYm9yYXRpb25Db25maWcpOwoKICAgICAgICAgICAgICAgIC8vIExvYWQgdHJhbnNsYXRpb25zIGZvciBKYXZhU2NyaXB0CiAgICAgICAgICAgICAgICBpZiAoQ29yZS5MYW5ndWFnZSAmJiBDb3JlLkxhbmd1YWdlLkxvYWQpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLkxvYWQoe30sIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3VzdG9tZXIgSW5mbyBXaWRnZXQKICAgICAgICAgICAgICAgICAgICAgICAgJ09wZW4gVGlja2V0cyAoQ3VzdG9tZXIpJzogJ1slIFRyYW5zbGF0ZSgiT3BlbiBUaWNrZXRzIChDdXN0b21lcikiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT3BlbiBUaWNrZXRzIChVc2VyKSc6ICdbJSBUcmFuc2xhdGUoIk9wZW4gVGlja2V0cyAoVXNlcikiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXIgSW5mb3JtYXRpb24nOiAnWyUgVHJhbnNsYXRlKCJDdXN0b21lciBJbmZvcm1hdGlvbiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgJ0NoYXQnOiAnWyUgVHJhbnNsYXRlKCJDaGF0IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGwnOiAnWyUgVHJhbnNsYXRlKCJDYWxsIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ01lZXRpbmcnOiAnWyUgVHJhbnNsYXRlKCJNZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1RlYW1zIENoYXQnOiAnWyUgVHJhbnNsYXRlKCJUZWFtcyBDaGF0IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1RlYW1zIENhbGwnOiAnWyUgVHJhbnNsYXRlKCJUZWFtcyBDYWxsIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1NjaGVkdWxlIE1lZXRpbmcnOiAnWyUgVHJhbnNsYXRlKCJTY2hlZHVsZSBNZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1N0YXJ0IENoYXQnOiAnWyUgVHJhbnNsYXRlKCJTdGFydCBDaGF0IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1NlbmQgRW1haWwnOiAnWyUgVHJhbnNsYXRlKCJTZW5kIEVtYWlsIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGwgUGhvbmUnOiAnWyUgVHJhbnNsYXRlKCJDYWxsIFBob25lIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbGwgTW9iaWxlJzogJ1slIFRyYW5zbGF0ZSgiQ2FsbCBNb2JpbGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnTWVldGluZyBzY2hlZHVsaW5nIHJlcXVpcmVzIE1pY3Jvc29mdCAzNjUgbG9naW4uJzogJ1slIFRyYW5zbGF0ZSgiTWVldGluZyBzY2hlZHVsaW5nIHJlcXVpcmVzIE1pY3Jvc29mdCAzNjUgbG9naW4uIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29yayBMb2NhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAnV29yayBsb2NhdGlvbic6ICdbJSBUcmFuc2xhdGUoIldvcmsgbG9jYXRpb24iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT2ZmaWNlJzogJ1slIFRyYW5zbGF0ZSgiT2ZmaWNlIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1JlbW90ZSc6ICdbJSBUcmFuc2xhdGUoIlJlbW90ZSIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdUaW1lIG9mZic6ICdbJSBUcmFuc2xhdGUoIlRpbWUgb2ZmIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3V0IG9mIE9mZmljZQogICAgICAgICAgICAgICAgICAgICAgICAnT3V0IG9mIE9mZmljZSc6ICdbJSBUcmFuc2xhdGUoIk91dCBvZiBPZmZpY2UiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnU2NoZWR1bGVkIEFic2VuY2UnOiAnWyUgVHJhbnNsYXRlKCJTY2hlZHVsZWQgQWJzZW5jZSIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZXNlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICdBdmFpbGFibGUnOiAnWyUgVHJhbnNsYXRlKCJBdmFpbGFibGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQnVzeSc6ICdbJSBUcmFuc2xhdGUoIkJ1c3kiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQXdheSc6ICdbJSBUcmFuc2xhdGUoIkF3YXkiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRG8gbm90IGRpc3R1cmInOiAnWyUgVHJhbnNsYXRlKCJEbyBub3QgZGlzdHVyYiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdCZSByaWdodCBiYWNrJzogJ1slIFRyYW5zbGF0ZSgiQmUgcmlnaHQgYmFjayIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdPZmZsaW5lJzogJ1slIFRyYW5zbGF0ZSgiT2ZmbGluZSIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdVbmtub3duJzogJ1slIFRyYW5zbGF0ZSgiVW5rbm93biIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdJbiBhIGNhbGwnOiAnWyUgVHJhbnNsYXRlKCJJbiBhIGNhbGwiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSW4gYSBtZWV0aW5nJzogJ1slIFRyYW5zbGF0ZSgiSW4gYSBtZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1ByZXNlbnRpbmcnOiAnWyUgVHJhbnNsYXRlKCJQcmVzZW50aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWVldGluZyBTY2hlZHVsZXIgRGlhbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICdTY2hlZHVsZSBBcHBvaW50bWVudCc6ICdbJSBUcmFuc2xhdGUoIlNjaGVkdWxlIEFwcG9pbnRtZW50IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0F0dGVuZGVlcyc6ICdbJSBUcmFuc2xhdGUoIkF0dGVuZGVlcyIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdTdWJqZWN0JzogJ1slIFRyYW5zbGF0ZSgiU3ViamVjdCIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdNZWV0aW5nIFR5cGUnOiAnWyUgVHJhbnNsYXRlKCJNZWV0aW5nIFR5cGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnVGVhbXMgTWVldGluZyc6ICdbJSBUcmFuc2xhdGUoIlRlYW1zIE1lZXRpbmciKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT24tc2l0ZSc6ICdbJSBUcmFuc2xhdGUoIk9uLXNpdGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT24tc2l0ZSBNZWV0aW5nJzogJ1slIFRyYW5zbGF0ZSgiT24tc2l0ZSBNZWV0aW5nIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0xvY2F0aW9uJzogJ1slIFRyYW5zbGF0ZSgiTG9jYXRpb24iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRW50ZXIgbWVldGluZyBsb2NhdGlvbi4uLic6ICdbJSBUcmFuc2xhdGUoIkVudGVyIG1lZXRpbmcgbG9jYXRpb24uLi4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRHVyYXRpb24nOiAnWyUgVHJhbnNsYXRlKCJEdXJhdGlvbiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdNaW4nOiAnWyUgVHJhbnNsYXRlKCJNaW4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnRGF0ZSc6ICdbJSBUcmFuc2xhdGUoIkRhdGUiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQXZhaWxhYmxlIFRpbWVzJzogJ1slIFRyYW5zbGF0ZSgiQXZhaWxhYmxlIFRpbWVzIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0xvYWRpbmcgYXZhaWxhYmxlIHRpbWVzLi4uJzogJ1slIFRyYW5zbGF0ZSgiTG9hZGluZyBhdmFpbGFibGUgdGltZXMuLi4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT25seSB0aW1lcyB3aGVuIGJvdGggYXR0ZW5kZWVzIGFyZSBhdmFpbGFibGUgYXJlIHNob3duLic6ICdbJSBUcmFuc2xhdGUoIk9ubHkgdGltZXMgd2hlbiBib3RoIGF0dGVuZGVlcyBhcmUgYXZhaWxhYmxlIGFyZSBzaG93bi4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuJzogJ1slIFRyYW5zbGF0ZSgiTm8gYXZhaWxhYmxlIHRpbWVzIGZvciB0aGlzIGRhdGUuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIGF2YWlsYWJpbGl0eSBkYXRhLic6ICdbJSBUcmFuc2xhdGUoIkZhaWxlZCB0byBsb2FkIGF2YWlsYWJpbGl0eSBkYXRhLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDcmVhdGUgQXBwb2ludG1lbnQnOiAnWyUgVHJhbnNsYXRlKCJDcmVhdGUgQXBwb2ludG1lbnQiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnQ3JlYXRpbmcuLi4nOiAnWyUgVHJhbnNsYXRlKCJDcmVhdGluZy4uLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDYW5jZWwnOiAnWyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT3duZXInOiAnWyUgVHJhbnNsYXRlKCJPd25lciIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdSZXNwb25zaWJsZSc6ICdbJSBUcmFuc2xhdGUoIlJlc3BvbnNpYmxlIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0N1c3RvbWVyJzogJ1slIFRyYW5zbGF0ZSgiQ3VzdG9tZXIiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBNZWV0aW5nIFN1Y2Nlc3MgRGlhbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjcmVhdGVkJzogJ1slIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgY3JlYXRlZCIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEnOiAnWyUgVHJhbnNsYXRlKCJBcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnT24tc2l0ZSBhcHBvaW50bWVudCBjcmVhdGVkIHN1Y2Nlc3NmdWxseSEnOiAnWyUgVHJhbnNsYXRlKCJPbi1zaXRlIGFwcG9pbnRtZW50IGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ISIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdKb2luIFVSTCc6ICdbJSBUcmFuc2xhdGUoIkpvaW4gVVJMIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvcHkgTGluayc6ICdbJSBUcmFuc2xhdGUoIkNvcHkgTGluayIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDb3BpZWQhJzogJ1slIFRyYW5zbGF0ZSgiQ29waWVkISIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdKb2luIE1lZXRpbmcnOiAnWyUgVHJhbnNsYXRlKCJKb2luIE1lZXRpbmciKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBvbi1zaXRlIG1lZXRpbmcuJzogJ1slIFRyYW5zbGF0ZSgiUGxlYXNlIGVudGVyIGEgbG9jYXRpb24gZm9yIHRoZSBvbi1zaXRlIG1lZXRpbmcuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBjcmVhdGUgbWVldGluZy4nOiAnWyUgVHJhbnNsYXRlKCJGYWlsZWQgdG8gY3JlYXRlIG1lZXRpbmcuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBsb2FkIHRpY2tldCBkYXRhLic6ICdbJSBUcmFuc2xhdGUoIkZhaWxlZCB0byBsb2FkIHRpY2tldCBkYXRhLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdDYWxlbmRhciBldmVudCBjcmVhdGVkLCBidXQgWm51bnkgYXBwb2ludG1lbnQgZmFpbGVkLic6ICdbJSBUcmFuc2xhdGUoIkNhbGVuZGFyIGV2ZW50IGNyZWF0ZWQsIGJ1dCBabnVueSBhcHBvaW50bWVudCBmYWlsZWQuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gQ2FsZW5kYXIgV2FybmluZwogICAgICAgICAgICAgICAgICAgICAgICAnTm8gQ2FsZW5kYXIgQ29uZmlndXJlZCc6ICdbJSBUcmFuc2xhdGUoIk5vIENhbGVuZGFyIENvbmZpZ3VyZWQiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnTm8gY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgcXVldWUgJXMuJzogJ1slIFRyYW5zbGF0ZSgiTm8gY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgcXVldWUgJXMuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvciB0byBjb25maWd1cmUgYSBjYWxlbmRhciBtYXBwaW5nIGZvciB0aGlzIHF1ZXVlIGluIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiAoQ29sbGFib3JhdGlvbjo6UXVldWVDYWxlbmRhck1hcHBpbmcpLic6ICdbJSBUcmFuc2xhdGUoIlBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvciB0byBjb25maWd1cmUgYSBjYWxlbmRhciBtYXBwaW5nIGZvciB0aGlzIHF1ZXVlIGluIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbiAoQ29sbGFib3JhdGlvbjo6UXVldWVDYWxlbmRhck1hcHBpbmcpLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFwcG9pbnRtZW50IENhbmNlbGxhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAnQ2FuY2VsIEFwcG9pbnRtZW50JzogJ1slIFRyYW5zbGF0ZSgiQ2FuY2VsIEFwcG9pbnRtZW50IikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjYW5jZWwgdGhpcyBhcHBvaW50bWVudD8gQXR0ZW5kZWVzIHdpbGwgYmUgbm90aWZpZWQuJzogJ1slIFRyYW5zbGF0ZSgiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNhbmNlbCB0aGlzIGFwcG9pbnRtZW50PyBBdHRlbmRlZXMgd2lsbCBiZSBub3RpZmllZC4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnWWVzLCBjYW5jZWwnOiAnWyUgVHJhbnNsYXRlKCJZZXMsIGNhbmNlbCIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjYW5jZWxsZWQuIEF0dGVuZGVlcyBoYXZlIGJlZW4gbm90aWZpZWQuJzogJ1slIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgY2FuY2VsbGVkLiBBdHRlbmRlZXMgaGF2ZSBiZWVuIG5vdGlmaWVkLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdBcHBvaW50bWVudCBjYW5jZWxsZWQuJzogJ1slIFRyYW5zbGF0ZSgiQXBwb2ludG1lbnQgY2FuY2VsbGVkLiIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgICdabnVueSBhcHBvaW50bWVudCBkZWxldGVkLCBidXQgZmFpbGVkIHRvIGNhbmNlbCBPdXRsb29rIGV2ZW50Lic6ICdbJSBUcmFuc2xhdGUoIlpudW55IGFwcG9pbnRtZW50IGRlbGV0ZWQsIGJ1dCBmYWlsZWQgdG8gY2FuY2VsIE91dGxvb2sgZXZlbnQuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBjYW5jZWwgYXBwb2ludG1lbnQuJzogJ1slIFRyYW5zbGF0ZSgiRmFpbGVkIHRvIGNhbmNlbCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBEeW5hbWljIEN1c3RvbWVyIFNlbGVjdGlvbiAodGlja2V0IGNyZWF0ZSBwYWdlcykKICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGN1c3RvbWVyIHNlbGVjdGVkJzogJ1slIFRyYW5zbGF0ZSgiTm8gY3VzdG9tZXIgc2VsZWN0ZWQiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnU2VsZWN0IGEgY3VzdG9tZXIgdG8gc2VlIGRldGFpbHMnOiAnWyUgVHJhbnNsYXRlKCJTZWxlY3QgYSBjdXN0b21lciB0byBzZWUgZGV0YWlscyIpIHwgaHRtbCAlXScsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbmZpZ3VyYXRpb24gRXJyb3JzCiAgICAgICAgICAgICAgICAgICAgICAgICdDb2xsYWJvcmF0aW9uIEFkZC1vbjonOiAnWyUgVHJhbnNsYXRlKCJDb2xsYWJvcmF0aW9uIEFkZC1vbjoiKSB8IGh0bWwgJV0nLAogICAgICAgICAgICAgICAgICAgICAgICAnbm90IGNvbmZpZ3VyZWQuJzogJ1slIFRyYW5zbGF0ZSgibm90IGNvbmZpZ3VyZWQuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ09wZW4gc2V0dGluZ3MnOiAnWyUgVHJhbnNsYXRlKCJPcGVuIHNldHRpbmdzIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci4nOiAnWyUgVHJhbnNsYXRlKCJQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuIikgfCBodG1sICVdJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0Nsb3NlIHRoaXMgbWVzc2FnZSc6ICdbJSBUcmFuc2xhdGUoIkNsb3NlIHRoaXMgbWVzc2FnZSIpIHwgaHRtbCAlXScKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoQ29yZS5BZ2VudCAmJiBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24gJiYgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLkluaXQpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uSW5pdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBUcnkgdG8gaW5pdGlhbGl6ZSB3aGVuIERPTSBpcyByZWFkeQogICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsKICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIEluaXRDb2xsYWJvcmF0aW9uKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBET00gYWxyZWFkeSBsb2FkZWQsIGJ1dCBDb3JlLkNvbmZpZyBtaWdodCBub3QgYmUgcmVhZHkgeWV0CiAgICAgICAgICAgIC8vIFVzZSBhIHNtYWxsIGRlbGF5IHRvIGVuc3VyZSBabnVueSBjb3JlIEpTIGlzIGxvYWRlZAogICAgICAgICAgICBzZXRUaW1lb3V0KEluaXRDb2xsYWJvcmF0aW9uLCAxMDApOwogICAgICAgIH0KICAgIH0pKCk7Ci8vXV0+PC9zY3JpcHQ+Cg==</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/Collaboration/LoginButton.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gSGVhZGVyIExvZ2luIEJ1dHRvbiBUZW1wbGF0ZQoKICAgIFRoaXMgdGVtcGxhdGUgcmVuZGVycyB0aGUgbG9naW4gYnV0dG9uIGFuZCB1c2VyIGF2YXRhciBpbiB0aGUgaGVhZGVyLgogICAgVGhlIGFjdHVhbCBsb2dpYyBpcyBoYW5kbGVkIGJ5IEphdmFTY3JpcHQgKENvcmUuQWdlbnQuQ29sbGFib3JhdGlvbi5VSSkuCiVdCgo8ZGl2IGlkPSJDb2xsYWJIZWFkZXJMb2dpbiIgY2xhc3M9IkNvbGxhYkhlYWRlckxvZ2luIENvbGxhYkhlYWRlckxvZ2luLS1ub3Rsb2dnZWRpbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgnQ2xpY2sgdG8gbG9naW4gd2l0aCB5b3VyIE1pY3Jvc29mdCAzNjUgYWNjb3VudCcpIHwgaHRtbCAlXSI+CiAgICA8ZGl2IGNsYXNzPSJDb2xsYWJBdmF0YXIgQ29sbGFiQXZhdGFyLS1zbWFsbCBDb2xsYWJIZWFkZXJMb2dpbl9fYXZhdGFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXVzZXIiPjwvaT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhlYWRlckxvZ2luX190ZXh0Ij5bJSBUcmFuc2xhdGUoJ0xvZ2luIHdpdGggTWljcm9zb2Z0JykgfCBodG1sICVdPC9zcGFuPgo8L2Rpdj4K</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/Collaboration/PersonCard.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gUGVyc29uIENhcmQgKEhvdmVyIENhcmQpIFRlbXBsYXRlCgogICAgVGhpcyB0ZW1wbGF0ZSBkZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGhvdmVyIGNhcmQgc2hvd24gd2hlbgogICAgaG92ZXJpbmcgb3ZlciBhbiBhdmF0YXIuIFRoZSBjb250ZW50IGlzIHBvcHVsYXRlZCBkeW5hbWljYWxseQogICAgYnkgSmF2YVNjcmlwdCBiYXNlZCBvbiBwcm9maWxlIGRhdGEgZnJvbSB0aGUgcHJvdmlkZXIuCgogICAgTm90ZTogVGhpcyB0ZW1wbGF0ZSBzZXJ2ZXMgYXMgYSByZWZlcmVuY2UuIFRoZSBhY3R1YWwgaG92ZXIgY2FyZAogICAgaXMgY3JlYXRlZCBkeW5hbWljYWxseSBieSBDb3JlLkFnZW50LkNvbGxhYm9yYXRpb24uVUkuanMKJV0KCjxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZCI+CiAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2hlYWRlciI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29sbGFiQXZhdGFyIENvbGxhYkF2YXRhci0tbGFyZ2UiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJBdmF0YXJfX2ZhbGxiYWNrIj4/PzwvZGl2PgogICAgICAgICAgICA8IS0tIEF2YXRhciBpbWFnZSBsb2FkZWQgZHluYW1pY2FsbHkgLS0+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYlByZXNlbmNlIENvbGxhYlByZXNlbmNlLS11bmtub3duIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2luZm8iPgogICAgICAgICAgICA8aDMgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbmFtZSI+WyUgRGF0YS5EaXNwbGF5TmFtZSB8IGh0bWwgJV08L2gzPgogICAgICAgICAgICA8cCBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX190aXRsZSI+WyUgRGF0YS5Kb2JUaXRsZSB8IGh0bWwgJV08L3A+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2JvZHkiPgogICAgICAgIFslIElGIERhdGEuRGVwYXJ0bWVudCAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnRGVwYXJ0bWVudCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPlslIERhdGEuRGVwYXJ0bWVudCB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIFslIElGIERhdGEuTWFuYWdlciAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnTWFuYWdlcicpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbWFuYWdlciIgZGF0YS1lbWFpbD0iWyUgRGF0YS5NYW5hZ2VyRW1haWwgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk1hbmFnZXIgfCBodG1sICVdIDxpIGNsYXNzPSJmYSBmYS1leHRlcm5hbC1saW5rIj48L2k+CiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICBbJSBFTkQgJV0KCiAgICAgICAgWyUgSUYgRGF0YS5PZmZpY2UgJV0KICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX3JvdyI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX2xhYmVsIj5bJSBUcmFuc2xhdGUoJ09mZmljZScpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPlslIERhdGEuT2ZmaWNlIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICBbJSBFTkQgJV0KCiAgICAgICAgWyUgSUYgRGF0YS5QaG9uZSAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnUGhvbmUnKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJDb2xsYWJIb3ZlckNhcmRfX3ZhbHVlIj4KICAgICAgICAgICAgICAgIDxhIGhyZWY9InRlbDpbJSBEYXRhLlBob25lIHwgdXJpICVdIj5bJSBEYXRhLlBob25lIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIFslIEVORCAlXQoKICAgICAgICBbJSBJRiBEYXRhLk1vYmlsZSAlXQogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlslIFRyYW5zbGF0ZSgnTW9iaWxlJykgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX192YWx1ZSI+CiAgICAgICAgICAgICAgICA8YSBocmVmPSJ0ZWw6WyUgRGF0YS5Nb2JpbGUgfCB1cmkgJV0iPlslIERhdGEuTW9iaWxlIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIFslIEVORCAlXQoKICAgICAgICBbJSBJRiBEYXRhLkVtYWlsICVdCiAgICAgICAgPGRpdiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX19yb3ciPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX19sYWJlbCI+WyUgVHJhbnNsYXRlKCdFbWFpbCcpIHwgaHRtbCAlXTwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUiPgogICAgICAgICAgICAgICAgPGEgaHJlZj0ibWFpbHRvOlslIERhdGEuRW1haWwgfCB1cmkgJV0iPlslIERhdGEuRW1haWwgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIDxkaXYgY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fcm93Ij4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fbGFiZWwiPlN0YXR1czwvc3Bhbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkNvbGxhYkhvdmVyQ2FyZF9fdmFsdWUgQ29sbGFiSG92ZXJDYXJkX19wcmVzZW5jZSI+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoJ1Vua25vd24nKSB8IGh0bWwgJV0KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iQ29sbGFiSG92ZXJDYXJkX19mb290ZXIiPgogICAgICAgIFslIElGIERhdGEuRW1haWwgJV0KICAgICAgICA8YSBocmVmPSJtYWlsdG86WyUgRGF0YS5FbWFpbCB8IHVyaSAlXSIgY2xhc3M9IkNvbGxhYkJ1dHRvbiBDb2xsYWJCdXR0b24tLWljb24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoJ1NlbmQgRW1haWwnKSB8IGh0bWwgJV0iPgogICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtZW52ZWxvcGUiPjwvaT4KICAgICAgICA8L2E+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIFslIElGIERhdGEuQ2hhdExpbmsgJV0KICAgICAgICA8YSBocmVmPSJbJSBEYXRhLkNoYXRMaW5rIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdTdGFydCBDaGF0JykgfCBodG1sICVdIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNvbW1lbnQiPjwvaT4KICAgICAgICA8L2E+CiAgICAgICAgWyUgRU5EICVdCgogICAgICAgIFslIElGIERhdGEuQ2FsbExpbmsgJV0KICAgICAgICA8YSBocmVmPSJbJSBEYXRhLkNhbGxMaW5rIHwgaHRtbCAlXSIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdTdGFydCBDYWxsJykgfCBodG1sICVdIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBob25lIj48L2k+CiAgICAgICAgPC9hPgogICAgICAgIFslIEVORCAlXQoKICAgICAgICBbJSBJRiBEYXRhLlBob25lICVdCiAgICAgICAgPGEgaHJlZj0idGVsOlslIERhdGEuUGhvbmUgfCB1cmkgJV0iIGNsYXNzPSJDb2xsYWJCdXR0b24gQ29sbGFiQnV0dG9uLS1pY29uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCdDYWxsIFBob25lJykgfCBodG1sICVdIj4KICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLXBob25lLXNxdWFyZSI+PC9pPgogICAgICAgIDwvYT4KICAgICAgICBbJSBFTkQgJV0KICAgIDwvZGl2Pgo8L2Rpdj4K</File>
        <File Permission="660" Location="Kernel/Output/HTML/Templates/Standard/AgentTicketZoom/CollaborationWidget.tt" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpbJSMKICAgIENvbGxhYm9yYXRpb24gQWRkLW9uIC0gVGlja2V0IFpvb20gV2lkZ2V0IFRlbXBsYXRlCgogICAgVGhpcyB0ZW1wbGF0ZSByZW5kZXJzIHRoZSBjb2xsYWJvcmF0aW9uIGFjdGlvbnMgd2lkZ2V0IGluIHRoZQogICAgdGlja2V0IHpvb20gc2lkZWJhci4gSXQgc2hvd3MgdGhlIGN1c3RvbWVyIGF2YXRhciBhbmQgcHJvdmlkZXMKICAgIHF1aWNrIGFjdGlvbiBidXR0b25zIGZvciBjaGF0LCBjYWxsLCBhbmQgbWVldGluZy4KCiAgICBWYXJpYWJsZXM6CiAgICAtIERhdGEuQ3VzdG9tZXJFbWFpbCA6IEN1c3RvbWVyIGVtYWlsIGFkZHJlc3MKICAgIC0gRGF0YS5DdXN0b21lck5hbWUgIDogQ3VzdG9tZXIgZGlzcGxheSBuYW1lCiAgICAtIERhdGEuVGlja2V0SUQgICAgICA6IEN1cnJlbnQgdGlja2V0IElECiAgICAtIERhdGEuVGlja2V0TnVtYmVyICA6IEN1cnJlbnQgdGlja2V0IG51bWJlcgoKICAgIE5vdGU6IE1vc3Qgb2YgdGhlIHdpZGdldCBjb250ZW50IGlzIGdlbmVyYXRlZCBkeW5hbWljYWxseSBieQogICAgQ29yZS5BZ2VudC5Db2xsYWJvcmF0aW9uLlVJLmpzIHRvIGhhbmRsZSBsb2dpbiBzdGF0ZSBjaGFuZ2VzLgolXQoKPGRpdiBpZD0iQ29sbGFiV2lkZ2V0IiBjbGFzcz0iV2lkZ2V0U2ltcGxlIiBkYXRhLWN1c3RvbWVyLWVtYWlsPSJbJSBEYXRhLkN1c3RvbWVyRW1haWwgfCBodG1sICVdIj4KICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgPGgyPgogICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtdXNlcnMiPjwvaT4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCdDb2xsYWJvcmF0aW9uJykgfCBodG1sICVdCiAgICAgICAgPC9oMj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iQ29sbGFiV2lkZ2V0Ij4KICAgICAgICAgICAgPCEtLSBDb250ZW50IHBvcHVsYXRlZCBieSBKYXZhU2NyaXB0IC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb2xsYWJXaWRnZXRfX2xvYWRpbmciIHN0eWxlPSJ0ZXh0LWFsaWduOiBjZW50ZXI7IHBhZGRpbmc6IDIwcHg7Ij4KICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1zcGlubmVyIGZhLXNwaW4iPjwvaT4KICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgnTG9hZGluZy4uLicpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CgpbJSMKICAgIFN0YXRpYyB2ZXJzaW9uIGZvciB3aGVuIEphdmFTY3JpcHQgaXMgZGlzYWJsZWQgb3Igbm90IHlldCBsb2FkZWQuCiAgICBUaGlzIHByb3ZpZGVzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCB0aGUgY29sbGFib3JhdGlvbiBmZWF0dXJlcy4KJV0KPG5vc2NyaXB0PgogICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCdDb2xsYWJvcmF0aW9uJykgfCBodG1sICVdPC9oMj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgPHAgc3R5bGU9InBhZGRpbmc6IDEwcHg7IGNvbG9yOiAjOTk5OyI+CiAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoJ0phdmFTY3JpcHQgaXMgcmVxdWlyZWQgZm9yIGNvbGxhYm9yYXRpb24gZmVhdHVyZXMuJykgfCBodG1sICVdCiAgICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L25vc2NyaXB0Pgo=</File>

        <!-- Output Filters -->
        <File Permission="660" Location="Kernel/Output/HTML/FilterContent/CollaborationInit.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpGaWx0ZXJDb250ZW50OjpDb2xsYWJvcmF0aW9uSW5pdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkZpbHRlckNvbnRlbnQ6OkNvbGxhYm9yYXRpb25Jbml0IC0gSW5qZWN0IENvbGxhYm9yYXRpb24gaW5pdGlhbGl6YXRpb24KCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBvdXRwdXQgZmlsdGVyIGluamVjdHMgdGhlIENvbGxhYm9yYXRpb24gaW5pdGlhbGl6YXRpb24gSmF2YVNjcmlwdAppbnRvIGFsbCBhZ2VudCBwYWdlcy4gSXQgcmVhZHMgY29uZmlndXJhdGlvbiBmcm9tIFN5c0NvbmZpZyBhbmQgcGFzc2VzCml0IHRvIHRoZSBJbml0LnR0IHRlbXBsYXRlLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIG9iamVjdC4KCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFJ1bigpCgpFeGVjdXRlIHRoZSBvdXRwdXQgZmlsdGVyLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgTWFzdGVyIHN3aXRjaDogd2hlbiBkaXNhYmxlZCwgaW5qZWN0IG5vdGhpbmcgYXQgYWxsIC0gbm8gSW5pdC50dAogICAgIyBzY3JpcHQsIG5vIHBlci1wYWdlIHRpY2tldC9jdXN0b21lci9vd25lciBsb29rdXBzLiBDb21iaW5lZCB3aXRoCiAgICAjIG1hcmtpbmcgTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMjIyMxMDAtQ29sbGFib3JhdGlvbiBhbmQKICAgICMgTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTIyMjMTAwLUNvbGxhYm9yYXRpb24gYXMgaW52YWxpZCBpbgogICAgIyBTeXNDb25maWcgKHN0b3BzIHRoZSBhZGQtb24ncyBvd24gSlMvQ1NTIGZpbGVzIGZyb20gYmVpbmcgbG9hZGVkCiAgICAjIGF0IGFsbCksIHRoaXMgbWFrZXMgdGhlIGFkZC1vbiBmdWxseSBpbmVydCB3aXRob3V0IHVuaW5zdGFsbGluZyBpdC4KICAgIHJldHVybiAxIGlmICEoICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6RW5hYmxlZCcpIC8vIDEgKTsKCiAgICAjIENoZWNrIGlmIHdlIGhhdmUgdGVtcGxhdGUgZGF0YQogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtEYXRhfTsKICAgIHJldHVybiAxIGlmIHJlZiAkUGFyYW17RGF0YX0gbmUgJ1NDQUxBUic7CiAgICByZXR1cm4gMSBpZiAhJHsgJFBhcmFte0RhdGF9IH07CgogICAgIyBPbmx5IHByb2Nlc3MgZm9yIGFnZW50IGludGVyZmFjZQogICAgcmV0dXJuIDEgaWYgJExheW91dE9iamVjdC0+e1Nlc3Npb25Tb3VyY2V9ICYmICRMYXlvdXRPYmplY3QtPntTZXNzaW9uU291cmNlfSBuZSAnQWdlbnRJbnRlcmZhY2UnOwoKICAgICMgU2tpcCBsb2dpbiBwYWdlIC0gb25seSBzaG93IG9uIGF1dGhlbnRpY2F0ZWQgcGFnZXMKICAgICMgQ2hlY2sgaWYgdXNlciBpcyBsb2dnZWQgaW4gYnkgdmVyaWZ5aW5nIFVzZXJJRCBleGlzdHMgYW5kIGlzIG5vdCBlbXB0eQogICAgcmV0dXJuIDEgaWYgISRMYXlvdXRPYmplY3QtPntVc2VySUR9OwoKICAgICMgR2V0IHByb3ZpZGVyIHNldHRpbmcKICAgIG15ICRQcm92aWRlciAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpQcm92aWRlcicpICAgICAgICAgfHwgJ01vY2snOwogICAgbXkgJEZhbGxiYWNrUHJvdmlkZXIgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OkZhbGxiYWNrUHJvdmlkZXInKSB8fCAnWm51bnknOwoKICAgICMgR2V0IE1pY3Jvc29mdCAzNjUgc2V0dGluZ3MKICAgICMgQWxsIHRocmVlIHNldHRpbmdzIChUZW5hbnRJRCwgQ2xpZW50SUQsIFJlZGlyZWN0VVJJKSBhcmUgcmVxdWlyZWQgZm9yIE0zNjUgcHJvdmlkZXIKICAgICMgTWlzc2luZyBzZXR0aW5ncyB3aWxsIHNob3cgYW4gZXJyb3IgaW4gdGhlIGJyb3dzZXIgVUkKICAgIG15ICRUZW5hbnRJRCAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6UHJvdmlkZXI6Ok0zNjU6OlRlbmFudElEJykgfHwgJyc7CiAgICBteSAkQ2xpZW50SUQgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OlByb3ZpZGVyOjpNMzY1OjpDbGllbnRJRCcpIHx8ICcnOwogICAgbXkgJFJlZGlyZWN0VVJJID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpQcm92aWRlcjo6TTM2NTo6UmVkaXJlY3RVUkknKSB8fCAnJzsKCiAgICAjIEdldCBmZWF0dXJlIHRvZ2dsZXMKICAgIG15ICRFbmFibGVBdmF0YXIgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVBdmF0YXInKSAgICAgLy8gMTsKICAgIG15ICRFbmFibGVQcmVzZW5jZSAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVQcmVzZW5jZScpICAgLy8gMTsKICAgIG15ICRFbmFibGVIb3ZlckNhcmRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVIb3ZlckNhcmRzJykgLy8gMTsKICAgIG15ICRFbmFibGVDaGF0ICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVDaGF0JykgICAgICAgLy8gMTsKICAgIG15ICRFbmFibGVDYWxsICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVDYWxsJykgICAgICAgLy8gMTsKICAgIG15ICRFbmFibGVNZWV0aW5ncyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6RW5hYmxlTWVldGluZ3MnKSAgICAgICAvLyAwOwogICAgICAgIG15ICRFbmFibGVPd25lckluZm9QYW5lbCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6RW5hYmxlT3duZXJJbmZvUGFuZWwnKSAvLyAxOwoKICAgICMgR2V0IFVJIHNldHRpbmdzCiAgICBteSAkU2hvd0luSGVhZGVyICAgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0luSGVhZGVyJykgICAgICAgICAgIC8vIDE7CiAgICBteSAkU2hvd0luVGlja2V0SW5mbyAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0luVGlja2V0SW5mbycpICAgICAgIC8vIDE7CiAgICBteSAkU2hvd0luQXJ0aWNsZXMgICAgICAgICA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0luQXJ0aWNsZXMnKSAgICAgICAgIC8vIDE7CiAgICBteSAkU2hvd0N1c3RvbWVySW5mb1dpZGdldCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6U2hvd0N1c3RvbWVySW5mb1dpZGdldCcpIC8vIDE7CiAgICBteSAkSGlkZU5hdGl2ZUN1c3RvbWVySW5mbyA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6SGlkZU5hdGl2ZUN1c3RvbWVySW5mbycpIC8vIDE7CgogICAgIyBHZXQgY2FjaGUgc2V0dGluZ3MKICAgIG15ICRDYWNoZUF2YXRhclRUTCAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpDYWNoZTo6QXZhdGFyVFRMJykgICB8fCAzNjAwOwogICAgbXkgJENhY2hlUHJlc2VuY2VUVEwgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OkNhY2hlOjpQcmVzZW5jZVRUTCcpIHx8IDYwOwogICAgbXkgJENhY2hlUHJvZmlsZVRUTCAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0NvbGxhYm9yYXRpb246OkNhY2hlOjpQcm9maWxlVFRMJykgIHx8IDg2NDAwOwoKICAgICMgR2V0IGN1cnJlbnQgYWdlbnQncyBkYXRhCiAgICBteSAkVXNlckVtYWlsICAgID0gJExheW91dE9iamVjdC0+e1VzZXJFbWFpbH0gICAgfHwgJyc7CiAgICBteSAkVXNlckZ1bGxuYW1lID0gJExheW91dE9iamVjdC0+e1VzZXJGdWxsbmFtZX0gfHwgJyc7CgogICAgIyBHZXQgY3VzdG9tZXIgZGF0YSBpZiBvbiBBZ2VudFRpY2tldFpvb20KICAgIG15ICRDdXN0b21lckVtYWlsICA9ICcnOwogICAgbXkgJEN1c3RvbWVyTG9naW4gID0gJyc7CiAgICBteSAkQ3VzdG9tZXJOYW1lICAgPSAnJzsKICAgIG15ICRJc1RpY2tldE93bmVyICA9IDA7CgogICAgIyBPd25lciBhbmQgUmVzcG9uc2libGUgZGF0YQogICAgbXkgJE93bmVyRW1haWwgICAgICAgPSAnJzsKICAgIG15ICRPd25lck5hbWUgICAgICAgID0gJyc7CiAgICBteSAkT3duZXJJRCAgICAgICAgICA9IDA7CiAgICBteSAkUmVzcG9uc2libGVFbWFpbCA9ICcnOwogICAgbXkgJFJlc3BvbnNpYmxlTmFtZSAgPSAnJzsKICAgIG15ICRSZXNwb25zaWJsZUlEICAgID0gMDsKCiAgICAjIER5bmFtaWMgY3VzdG9tZXIgc2VsZWN0aW9uIGZsYWcgKGZvciB0aWNrZXQgY3JlYXRlIHBhZ2VzKQogICAgbXkgJER5bmFtaWNDdXN0b21lclNlbGVjdGlvbiA9IDA7CgogICAgbXkgJFBhcmFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdBY3Rpb24nICkgfHwgJyc7CgogICAgIyBDaGVjayBpZiB3ZSdyZSBvbiBhIHRpY2tldCBjcmVhdGlvbiBwYWdlIHdpdGggZHluYW1pYyBjdXN0b21lciBzZWxlY3Rpb24KICAgIGlmICggJEFjdGlvbiA9fiAvXkFnZW50VGlja2V0KFBob25lfEVtYWlsfEN1c3RvbWVyKSQvICkgewogICAgICAgICREeW5hbWljQ3VzdG9tZXJTZWxlY3Rpb24gPSAxOwogICAgICAgICMgQ3VzdG9tZXIgZGF0YSB3aWxsIGJlIGxvYWRlZCBkeW5hbWljYWxseSB2aWEgSmF2YVNjcmlwdAogICAgICAgICMgTm8gc2VydmVyLXNpZGUgY3VzdG9tZXIgZGF0YSBleHRyYWN0aW9uIG5lZWRlZCBoZXJlCiAgICB9CgogICAgaWYgKCAkQWN0aW9uIGVxICdBZ2VudFRpY2tldFpvb20nICkgewogICAgICAgIG15ICRUaWNrZXRJRCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKTsKCiAgICAgICAgaWYgKCRUaWNrZXRJRCkgewogICAgICAgICAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICAgICAgICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICglVGlja2V0KSB7CiAgICAgICAgICAgICAgICAjIENoZWNrIGlmIGN1cnJlbnQgYWdlbnQgaXMgdGlja2V0IG93bmVyCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7T3duZXJJRH0gJiYgJExheW91dE9iamVjdC0+e1VzZXJJRH0gJiYgJFRpY2tldHtPd25lcklEfSA9PSAkTGF5b3V0T2JqZWN0LT57VXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXNUaWNrZXRPd25lciA9IDE7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgT3duZXIgZGF0YQogICAgICAgICAgICAgICAgaWYgKCAkVGlja2V0e093bmVySUR9ICYmICRUaWNrZXR7T3duZXJJRH0gIT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAkT3duZXJJRCA9ICRUaWNrZXR7T3duZXJJRH07CiAgICAgICAgICAgICAgICAgICAgbXkgJU93bmVyRGF0YSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRPd25lcklELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCVPd25lckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE93bmVyRW1haWwgPSAkT3duZXJEYXRhe1VzZXJFbWFpbH0gfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgICRPd25lck5hbWUgID0gJE93bmVyRGF0YXtVc2VyRnVsbG5hbWV9IHx8ICRPd25lckRhdGF7VXNlckZpcnN0bmFtZX0gLiAnICcgLiAkT3duZXJEYXRhe1VzZXJMYXN0bmFtZX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgR2V0IFJlc3BvbnNpYmxlIGRhdGEKICAgICAgICAgICAgICAgIGlmICggJFRpY2tldHtSZXNwb25zaWJsZUlEfSAmJiAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9ICE9IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlc3BvbnNpYmxlSUQgPSAkVGlja2V0e1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgICAgIG15ICVSZXNwb25zaWJsZURhdGEgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICglUmVzcG9uc2libGVEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNwb25zaWJsZUVtYWlsID0gJFJlc3BvbnNpYmxlRGF0YXtVc2VyRW1haWx9IHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAkUmVzcG9uc2libGVOYW1lICA9ICRSZXNwb25zaWJsZURhdGF7VXNlckZ1bGxuYW1lfSB8fCAkUmVzcG9uc2libGVEYXRhe1VzZXJGaXJzdG5hbWV9IC4gJyAnIC4gJFJlc3BvbnNpYmxlRGF0YXtVc2VyTGFzdG5hbWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckxvZ2luID0gJFRpY2tldHtDdXN0b21lclVzZXJJRH07CgogICAgICAgICAgICAgICAgICAgICMgR2V0IGN1c3RvbWVyIHVzZXIgZGF0YSBmb3IgZW1haWwKICAgICAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgICAgICAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lckxvZ2luLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICglQ3VzdG9tZXJVc2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVtYWlsID0gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9IHx8ICRDdXN0b21lckxvZ2luOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJOYW1lICA9ICRDdXN0b21lclVzZXJ7VXNlckZ1bGxuYW1lfSB8fCAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9IC4gJyAnIC4gJEN1c3RvbWVyVXNlcntVc2VyTGFzdG5hbWV9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBGYWxsYmFjazogdXNlIEN1c3RvbWVyVXNlcklEIGFzIGVtYWlsIGlmIGl0IGxvb2tzIGxpa2UgYW4gZW1haWwKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJMb2dpbiA9fiAvQC8gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFbWFpbCA9ICRDdXN0b21lckxvZ2luOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgUmVuZGVyIHRoZSBpbml0aWFsaXphdGlvbiB0ZW1wbGF0ZQogICAgbXkgJEluaXRIVE1MID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQ29sbGFib3JhdGlvbi9Jbml0JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBQcm92aWRlciAgICAgICAgICAgICAgPT4gJFByb3ZpZGVyLAogICAgICAgICAgICBGYWxsYmFja1Byb3ZpZGVyICAgICAgPT4gJEZhbGxiYWNrUHJvdmlkZXIsCiAgICAgICAgICAgIFRlbmFudElEICAgICAgICAgICAgICA9PiAkVGVuYW50SUQsCiAgICAgICAgICAgIENsaWVudElEICAgICAgICAgICAgICA9PiAkQ2xpZW50SUQsCiAgICAgICAgICAgIFJlZGlyZWN0VVJJICAgICAgICAgICA9PiAkUmVkaXJlY3RVUkksCiAgICAgICAgICAgIEVuYWJsZUF2YXRhciAgICAgICAgICA9PiAkRW5hYmxlQXZhdGFyLAogICAgICAgICAgICBFbmFibGVQcmVzZW5jZSAgICAgICAgPT4gJEVuYWJsZVByZXNlbmNlLAogICAgICAgICAgICBFbmFibGVIb3ZlckNhcmRzICAgICAgPT4gJEVuYWJsZUhvdmVyQ2FyZHMsCiAgICAgICAgICAgIEVuYWJsZUNoYXQgICAgICAgICAgICA9PiAkRW5hYmxlQ2hhdCwKICAgICAgICAgICAgRW5hYmxlQ2FsbCAgICAgICAgICAgID0+ICRFbmFibGVDYWxsLAogICAgICAgICAgICBFbmFibGVNZWV0aW5ncyAgICAgICAgPT4gJEVuYWJsZU1lZXRpbmdzLAogICAgICAgICAgICBFbmFibGVPd25lckluZm9QYW5lbCAgPT4gJEVuYWJsZU93bmVySW5mb1BhbmVsLAogICAgICAgICAgICBTaG93SW5IZWFkZXIgICAgICAgICAgID0+ICRTaG93SW5IZWFkZXIsCiAgICAgICAgICAgIFNob3dJblRpY2tldEluZm8gICAgICAgPT4gJFNob3dJblRpY2tldEluZm8sCiAgICAgICAgICAgIFNob3dJbkFydGljbGVzICAgICAgICAgPT4gJFNob3dJbkFydGljbGVzLAogICAgICAgICAgICBTaG93Q3VzdG9tZXJJbmZvV2lkZ2V0ID0+ICRTaG93Q3VzdG9tZXJJbmZvV2lkZ2V0LAogICAgICAgICAgICBIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvID0+ICRIaWRlTmF0aXZlQ3VzdG9tZXJJbmZvLAogICAgICAgICAgICBDYWNoZUF2YXRhclRUTCAgICAgICAgID0+ICRDYWNoZUF2YXRhclRUTCwKICAgICAgICAgICAgQ2FjaGVQcmVzZW5jZVRUTCAgICAgICA9PiAkQ2FjaGVQcmVzZW5jZVRUTCwKICAgICAgICAgICAgQ2FjaGVQcm9maWxlVFRMICAgICAgICA9PiAkQ2FjaGVQcm9maWxlVFRMLAogICAgICAgICAgICAjIEN1cnJlbnQgYWdlbnQgZGF0YQogICAgICAgICAgICBVc2VyRW1haWwgICAgICAgICAgICAgID0+ICRVc2VyRW1haWwsCiAgICAgICAgICAgIFVzZXJGdWxsbmFtZSAgICAgICAgICAgPT4gJFVzZXJGdWxsbmFtZSwKICAgICAgICAgICAgIyBDdXN0b21lciBkYXRhIGZvciB0aWNrZXQgem9vbQogICAgICAgICAgICBDdXN0b21lckVtYWlsICAgICAgICAgID0+ICRDdXN0b21lckVtYWlsLAogICAgICAgICAgICBDdXN0b21lckxvZ2luICAgICAgICAgID0+ICRDdXN0b21lckxvZ2luLAogICAgICAgICAgICBDdXN0b21lck5hbWUgICAgICAgICAgID0+ICRDdXN0b21lck5hbWUsCiAgICAgICAgICAgICMgVGlja2V0IG93bmVyc2hpcAogICAgICAgICAgICBJc1RpY2tldE93bmVyICAgICAgICAgID0+ICRJc1RpY2tldE93bmVyLAogICAgICAgICAgICAjIE93bmVyIGFuZCBSZXNwb25zaWJsZSBkYXRhCiAgICAgICAgICAgIE93bmVyRW1haWwgICAgICAgICAgICAgPT4gJE93bmVyRW1haWwsCiAgICAgICAgICAgIE93bmVyTmFtZSAgICAgICAgICAgICAgPT4gJE93bmVyTmFtZSwKICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgICAgICA9PiAkT3duZXJJRCwKICAgICAgICAgICAgUmVzcG9uc2libGVFbWFpbCAgICAgICA9PiAkUmVzcG9uc2libGVFbWFpbCwKICAgICAgICAgICAgUmVzcG9uc2libGVOYW1lICAgICAgICA9PiAkUmVzcG9uc2libGVOYW1lLAogICAgICAgICAgICBSZXNwb25zaWJsZUlEICAgICAgICAgID0+ICRSZXNwb25zaWJsZUlELAogICAgICAgICAgICAjIER5bmFtaWMgY3VzdG9tZXIgc2VsZWN0aW9uIChmb3IgdGlja2V0IGNyZWF0ZSBwYWdlcykKICAgICAgICAgICAgRHluYW1pY0N1c3RvbWVyU2VsZWN0aW9uID0+ICREeW5hbWljQ3VzdG9tZXJTZWxlY3Rpb24sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBJbmplY3QgaW50byBwYWdlIGhlYWQgKGJlZm9yZSA8L2hlYWQ+KQogICAgaWYgKCRJbml0SFRNTCkgewogICAgICAgICR7ICRQYXJhbXtEYXRhfSB9ID1+IHN7PC9oZWFkPn17JEluaXRIVE1MXG48L2hlYWQ+fWk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgoKPWN1dAo=</File>

        <!-- Modules -->
        <File Permission="660" Location="Kernel/Modules/AgentCollaborationAJAX.pm" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRDb2xsYWJvcmF0aW9uQUpBWDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SlNPTicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok1vZHVsZXM6OkFnZW50Q29sbGFib3JhdGlvbkFKQVggLSBBSkFYIGVuZHBvaW50IGZvciBDb2xsYWJvcmF0aW9uIEFkZC1vbgoKPWhlYWQxIERFU0NSSVBUSU9OCgpQcm92aWRlcyBBSkFYIGVuZHBvaW50cyBmb3I6Ci0gR2V0Q3VzdG9tZXJUaWNrZXRDb3VudDogQ291bnQgb3BlbiB0aWNrZXRzIGZvciBhIGN1c3RvbWVyIChieSBDdXN0b21lcklEKQotIEdldEN1c3RvbWVyVXNlclRpY2tldENvdW50OiBDb3VudCBvcGVuIHRpY2tldHMgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIgdXNlciAoYnkgQ3VzdG9tZXJVc2VyTG9naW4pCi0gR2V0Q3VzdG9tZXJEYXRhOiBHZXQgY3VzdG9tZXIgdXNlciBkYXRhIGZyb20gWm51bnkKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkNyZWF0ZSBhbiBvYmplY3QuCgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKRXhlY3V0ZSB0aGUgbW9kdWxlLgoKPWN1dAoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBNYXN0ZXIgc3dpdGNoOiByZWZ1c2UgdG8gZG8gYW55dGhpbmcgd2hpbGUgdGhlIGFkZC1vbiBpcyBkaXNhYmxlZCwKICAgICMgZXZlbiBpZiBhIHJlcXVlc3QgcmVhY2hlcyB0aGlzIGVuZHBvaW50IGRpcmVjdGx5IChlLmcuIGEgc3RhbGUKICAgICMgcGFnZSBzdGlsbCBob2xkaW5nIHRoZSBKUywgb3IgYSBjcmFmdGVkIHJlcXVlc3QpIHJhdGhlciB0aGFuIHZpYQogICAgIyB0aGUgbm9ybWFsLCBhbHJlYWR5LXN1cHByZXNzZWQgZnJvbnRlbmQgaW5pdC4KICAgIGlmICggISggJENvbmZpZ09iamVjdC0+R2V0KCdDb2xsYWJvcmF0aW9uOjpFbmFibGVkJykgLy8gMSApICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdDb2xsYWJvcmF0aW9uIGFkZC1vbiBpcyBkaXNhYmxlZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZIChTMSk6IFZlcmlmeSB1c2VyIGlzIGF1dGhlbnRpY2F0ZWQgYmVmb3JlIHByb2Nlc3NpbmcgYW55IHJlcXVlc3QKICAgIGlmICggISRTZWxmLT57VXNlcklEfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQXV0aGVudGljYXRpb24gcmVxdWlyZWQnLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFN1YmFjdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdWJhY3Rpb24nICkgfHwgJyc7CgogICAgIyBEaXNwYXRjaCB0byBoYW5kbGVyCiAgICBpZiAoICRTdWJhY3Rpb24gZXEgJ0dldEN1c3RvbWVyVGlja2V0Q291bnQnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldEN1c3RvbWVyVGlja2V0Q291bnQoKTsKICAgIH0KICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnR2V0Q3VzdG9tZXJVc2VyVGlja2V0Q291bnQnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldEN1c3RvbWVyVXNlclRpY2tldENvdW50KCk7CiAgICB9CiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0dldEN1c3RvbWVyRGF0YScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0Q3VzdG9tZXJEYXRhKCk7CiAgICB9CiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0dldFRpY2tldERhdGEnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0dldFRpY2tldERhdGEoKTsKICAgIH0KICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnQ3JlYXRlQXBwb2ludG1lbnQnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0NyZWF0ZUFwcG9pbnRtZW50KCk7CiAgICB9CiAgICBlbHNpZiAoICRTdWJhY3Rpb24gZXEgJ0NhbmNlbEFwcG9pbnRtZW50JyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9DYW5jZWxBcHBvaW50bWVudCgpOwogICAgfQogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdHZXRVc2VyUHJvZmlsZScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0VXNlclByb2ZpbGUoKTsKICAgIH0KICAgIGVsc2lmICggJFN1YmFjdGlvbiBlcSAnR2V0QWdlbnRCeVVzZXJJRCcgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0QWdlbnRCeVVzZXJJRCgpOwogICAgfQogICAgZWxzaWYgKCAkU3ViYWN0aW9uIGVxICdHZXRPdXRPZk9mZmljZScgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fR2V0T3V0T2ZPZmZpY2UoKTsKICAgIH0KCiAgICAjIEludmFsaWQgc3ViYWN0aW9uCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgU3ViYWN0aW9uJywKICAgICk7Cn0KCj1oZWFkMiBfR2V0Q3VzdG9tZXJUaWNrZXRDb3VudCgpCgpHZXQgY291bnQgb2Ygb3BlbiB0aWNrZXRzIGZvciBhIGN1c3RvbWVyLgoKUmV0dXJucyBKU09OOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgVGlja2V0Q291bnQ6IDUsCiAgICAgICAgU2VhcmNoVVJMOiAiaW5kZXgucGw/QWN0aW9uPUFnZW50VGlja2V0U2VhcmNoLi4uIgogICAgfQoKPWN1dAoKc3ViIF9HZXRDdXN0b21lclRpY2tldENvdW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIEdldCBjdXN0b21lciBsb2dpbiBwYXJhbWV0ZXIKICAgIG15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXJMb2dpbicgKSB8fCAnJzsKCiAgICBpZiAoICEkQ3VzdG9tZXJVc2VyTG9naW4gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgQ3VzdG9tZXJVc2VyTG9naW4gcGFyYW1ldGVyJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IEN1c3RvbWVySUQgZnJvbSBDdXN0b21lclVzZXIgKHRvIHNlYXJjaCBmb3IgYWxsIHRpY2tldHMgb2YgdGhlIGN1c3RvbWVyL2NvbXBhbnkpCiAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICk7CgogICAgbXkgJEN1c3RvbWVySUQgPSAkQ3VzdG9tZXJVc2Vye1VzZXJDdXN0b21lcklEfSB8fCAkQ3VzdG9tZXJVc2VyTG9naW47CgogICAgIyBTZWFyY2ggZm9yIG9wZW4gdGlja2V0cyBieSBDdXN0b21lcklEIChhbGwgdGlja2V0cyBvZiB0aGUgY3VzdG9tZXIvY29tcGFueSkKICAgIG15ICRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBDdXN0b21lcklEUmF3ID0+ICRDdXN0b21lcklELAogICAgICAgIFN0YXRlVHlwZSAgICAgPT4gWyAnbmV3JywgJ29wZW4nLCAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgUmVzdWx0ICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFBlcm1pc3Npb24gICAgPT4gJ3JvJywKICAgICk7CgogICAgIyBCdWlsZCBzZWFyY2ggVVJMIGZvciBsaW5raW5nCiAgICBteSAkU2VhcmNoVVJMID0gJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfQogICAgICAgIC4gJ0FjdGlvbj1BZ2VudFRpY2tldFNlYXJjaDtTdWJhY3Rpb249U2VhcmNoOycKICAgICAgICAuICdDdXN0b21lcklEUmF3PScgLiAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRDdXN0b21lcklEKSAuICc7JwogICAgICAgIC4gJ1N0YXRlVHlwZT1PcGVuJzsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICBUaWNrZXRDb3VudCA9PiAkVGlja2V0Q291bnQgfHwgMCwKICAgICAgICBTZWFyY2hVUkwgICA9PiAkU2VhcmNoVVJMLAogICAgKTsKfQoKPWhlYWQyIF9HZXRDdXN0b21lclVzZXJUaWNrZXRDb3VudCgpCgpHZXQgY291bnQgb2Ygb3BlbiB0aWNrZXRzIGZvciBhIHNwZWNpZmljIGN1c3RvbWVyIHVzZXIgKHBlcnNvbikuClVubGlrZSBfR2V0Q3VzdG9tZXJUaWNrZXRDb3VudCB3aGljaCBzZWFyY2hlcyBieSBDdXN0b21lcklEIChjb21wYW55KSwKdGhpcyBzZWFyY2hlcyBieSBDdXN0b21lclVzZXJMb2dpbiAoc3BlY2lmaWMgcGVyc29uKS4KClJldHVybnMgSlNPTjoKICAgIHsKICAgICAgICBTdWNjZXNzOiAxLAogICAgICAgIFRpY2tldENvdW50OiAzCiAgICB9Cgo9Y3V0CgpzdWIgX0dldEN1c3RvbWVyVXNlclRpY2tldENvdW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBHZXQgY3VzdG9tZXIgdXNlciBsb2dpbiBwYXJhbWV0ZXIKICAgIG15ICRDdXN0b21lclVzZXJMb2dpbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lclVzZXJMb2dpbicgKSB8fCAnJzsKCiAgICBpZiAoICEkQ3VzdG9tZXJVc2VyTG9naW4gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgQ3VzdG9tZXJVc2VyTG9naW4gcGFyYW1ldGVyJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VhcmNoIGZvciBvcGVuIHRpY2tldHMgd2hlcmUgdGhpcyBzcGVjaWZpYyBDdXN0b21lclVzZXIgaXMgYXNzaWduZWQKICAgIG15ICRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBDdXN0b21lclVzZXJMb2dpblJhdyA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgU3RhdGVUeXBlICAgICAgICAgICAgPT4gWyAnbmV3JywgJ29wZW4nLCAncGVuZGluZyByZW1pbmRlcicsICdwZW5kaW5nIGF1dG8nIF0sCiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgICAgPT4gJ0NPVU5UJywKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgUGVybWlzc2lvbiAgICAgICAgICAgPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgIFN1Y2Nlc3MgICAgID0+IDEsCiAgICAgICAgVGlja2V0Q291bnQgPT4gJFRpY2tldENvdW50IHx8IDAsCiAgICApOwp9Cgo9aGVhZDIgX0dldEN1c3RvbWVyRGF0YSgpCgpHZXQgY3VzdG9tZXIgdXNlciBkYXRhIGZyb20gWm51bnkuCgpSZXR1cm5zIEpTT046CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBEYXRhOiB7CiAgICAgICAgICAgIFVzZXJMb2dpbjogImN1c3RvbWVyQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgVXNlckZpcnN0bmFtZTogIk1heCIsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZTogIk11c3Rlcm1hbm4iLAogICAgICAgICAgICBVc2VyRnVsbG5hbWU6ICJNYXggTXVzdGVybWFubiIsCiAgICAgICAgICAgIFVzZXJFbWFpbDogImN1c3RvbWVyQGV4YW1wbGUuY29tIiwKICAgICAgICAgICAgVXNlckN1c3RvbWVySUQ6ICJDdXN0b21lckNvbXBhbnkiLAogICAgICAgICAgICBVc2VyVGl0bGU6ICJTdXBwb3J0IEFnZW50IiwKICAgICAgICAgICAgVXNlclBob25lOiAiKzQ5IDEyMyA0NTY3ODkiLAogICAgICAgICAgICBVc2VyTW9iaWxlOiAiKzQ5IDE3MCAxMjM0NTY3IgogICAgICAgIH0KICAgIH0KCj1jdXQKCnN1YiBfR2V0Q3VzdG9tZXJEYXRhIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkVGlja2V0T2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgR2V0IGN1c3RvbWVyIGxvZ2luIHBhcmFtZXRlcgogICAgbXkgJEN1c3RvbWVyVXNlckxvZ2luID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlckxvZ2luJyApIHx8ICcnOwoKICAgIGlmICggISRDdXN0b21lclVzZXJMb2dpbiApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBDdXN0b21lclVzZXJMb2dpbiBwYXJhbWV0ZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBpZiB0aGlzIGlzIGNhbGxlZCBkdXJpbmcgdGlja2V0IGNyZWF0aW9uIChubyBleGlzdGluZyB0aWNrZXQgeWV0KQogICAgbXkgJEZvclRpY2tldENyZWF0ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JUaWNrZXRDcmVhdGUnICkgfHwgMDsKCiAgICBpZiAoICRGb3JUaWNrZXRDcmVhdGUgKSB7CiAgICAgICAgIyBTRUNVUklUWSAoUzVhKTogRm9yIHRpY2tldCBjcmVhdGlvbiwgdmVyaWZ5IGFnZW50IGNhbiBjcmVhdGUgdGlja2V0cwogICAgICAgICMgQWdlbnQgbXVzdCBoYXZlICdjcmVhdGUnIHBlcm1pc3Npb24gb24gYXQgbGVhc3Qgb25lIHF1ZXVlCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICApOwoKICAgICAgICBpZiAoICElR3JvdXBMaXN0ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvciAgID0+ICdBY2Nlc3MgZGVuaWVkIC0gbm8gcGVybWlzc2lvbiB0byBjcmVhdGUgdGlja2V0cycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgUGVybWlzc2lvbiBPSyAtIGFnZW50IGNhbiBjcmVhdGUgdGlja2V0cywgYWxsb3cgY3VzdG9tZXIgZGF0YSBsb29rdXAKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgU0VDVVJJVFkgKFM1KTogVmVyaWZ5IGFnZW50IGhhcyBwZXJtaXNzaW9uIHRvIHZpZXcgdGhpcyBjdXN0b21lcidzIGRhdGEKICAgICAgICAjIENoZWNrIGlmIGFnZW50IGhhcyBhY2Nlc3MgdG8gYXQgbGVhc3Qgb25lIHRpY2tldCBmcm9tIHRoaXMgY3VzdG9tZXIKICAgICAgICBteSBAVGlja2V0SURzID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICBDdXN0b21lclVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgTGltaXQgICAgICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICFAVGlja2V0SURzICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvciAgID0+ICdBY2Nlc3MgZGVuaWVkIC0gbm8gcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgY3VzdG9tZXInLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBjdXN0b21lciB1c2VyIGRhdGEKICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgKTsKCiAgICBpZiAoICElQ3VzdG9tZXJVc2VyICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdDdXN0b21lciBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBSZXR1cm4gcmVsZXZhbnQgZmllbGRzCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJMb2dpbn0gICAgICB8fCAnJywKICAgICAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRmlyc3RuYW1lfSAgfHwgJycsCiAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgID0+ICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSAgIHx8ICcnLAogICAgICAgICAgICBVc2VyRnVsbG5hbWUgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJGdWxsbmFtZX0gICB8fCAnJywKICAgICAgICAgICAgVXNlckVtYWlsICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9ICAgICAgfHwgJycsCiAgICAgICAgICAgIFVzZXJDdXN0b21lcklEID0+ICRDdXN0b21lclVzZXJ7VXNlckN1c3RvbWVySUR9IHx8ICcnLAogICAgICAgICAgICBVc2VyVGl0bGUgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJUaXRsZX0gICAgICB8fCAnJywKICAgICAgICAgICAgVXNlclBob25lICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyUGhvbmV9ICAgICAgfHwgJycsCiAgICAgICAgICAgIFVzZXJNb2JpbGUgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlck1vYmlsZX0gICAgIHx8ICcnLAogICAgICAgICAgICBVc2VyU3RyZWV0ICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJTdHJlZXR9ICAgICB8fCAnJywKICAgICAgICAgICAgVXNlckNpdHkgICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyQ2l0eX0gICAgICAgfHwgJycsCiAgICAgICAgICAgIFVzZXJaaXAgICAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlclppcH0gICAgICAgIHx8ICcnLAogICAgICAgICAgICBVc2VyQ291bnRyeSAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJDb3VudHJ5fSAgICB8fCAnJywKICAgICAgICAgICAgVXNlckNvbW1lbnQgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyQ29tbWVudH0gICAgfHwgJycsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBfR2V0VGlja2V0RGF0YSgpCgpHZXQgdGlja2V0IGRhdGEgaW5jbHVkaW5nIG93bmVyIGluZm9ybWF0aW9uIGZvciBtZWV0aW5nIHNjaGVkdWxlci4KClJldHVybnMgSlNPTjoKICAgIHsKICAgICAgICBTdWNjZXNzOiAxLAogICAgICAgIERhdGE6IHsKICAgICAgICAgICAgVGlja2V0SUQ6IDEyMywKICAgICAgICAgICAgVGlja2V0TnVtYmVyOiAiMjAyNDAxMDExMjM0NTY3OCIsCiAgICAgICAgICAgIFRpdGxlOiAiVGlja2V0IFN1YmplY3QiLAogICAgICAgICAgICBRdWV1ZTogIklUOjpIYXJkd2FyZSIsCiAgICAgICAgICAgIE93bmVySUQ6IDIsCiAgICAgICAgICAgIE93bmVyTG9naW46ICJhZ2VudCIsCiAgICAgICAgICAgIE93bmVyRnVsbG5hbWU6ICJBZ2VudCBOYW1lIiwKICAgICAgICAgICAgT3duZXJFbWFpbDogImFnZW50QGNvbXBhbnkuY29tIgogICAgICAgIH0KICAgIH0KCj1jdXQKCnN1YiBfR2V0VGlja2V0RGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJFVzZXJPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBHZXQgdGlja2V0IElEIHBhcmFtZXRlcgogICAgbXkgJFRpY2tldElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApIHx8ICcnOwoKICAgIGlmICggISRUaWNrZXRJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBUaWNrZXRJRCBwYXJhbWV0ZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgVGlja2V0SUQgaXMgbnVtZXJpYyB0byBwcmV2ZW50IGluamVjdGlvbgogICAgaWYgKCAkVGlja2V0SUQgIX4gL15cZCskLyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBUaWNrZXRJRCBmb3JtYXQgLSBtdXN0IGJlIG51bWVyaWMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWTogVmVyaWZ5IHRoZSByZXF1ZXN0aW5nIGFnZW50IGFjdHVhbGx5IGhhcyBhY2Nlc3MgdG8gdGhpcwogICAgIyB0aWNrZXQgKFRpY2tldEdldCBpdHNlbGYgZG9lcyBub3QgZW5mb3JjZSBwZXJtaXNzaW9ucykuCiAgICBteSAkSGFzQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gdmlldyB0aGlzIHRpY2tldCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCB0aWNrZXQgZGF0YQogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISVUaWNrZXQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1RpY2tldCBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgb3duZXIgZGF0YQogICAgbXkgJU93bmVyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgKTsKCiAgICAjIENoZWNrIGlmIGEgY2FsZW5kYXIgaXMgY29uZmlndXJlZCBmb3IgdGhpcyBxdWV1ZQogICAgbXkgJENhbGVuZGFyTmFtZSA9ICRTZWxmLT5fR2V0Q2FsZW5kYXJGb3JRdWV1ZSggJFRpY2tldHtRdWV1ZX0gKTsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyA9PiAxLAogICAgICAgIERhdGEgICAgPT4gewogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICBUaWNrZXROdW1iZXIgID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAkVGlja2V0e1RpdGxlfSwKICAgICAgICAgICAgUXVldWUgICAgICAgICA9PiAkVGlja2V0e1F1ZXVlfSwKICAgICAgICAgICAgUXVldWVJRCAgICAgICA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgID0+ICRUaWNrZXR7T3duZXJJRH0sCiAgICAgICAgICAgIE93bmVyTG9naW4gICAgPT4gJE93bmVye1VzZXJMb2dpbn0gICAgfHwgJycsCiAgICAgICAgICAgIE93bmVyRnVsbG5hbWUgPT4gJE93bmVye1VzZXJGdWxsbmFtZX0gfHwgJycsCiAgICAgICAgICAgIE93bmVyRW1haWwgICAgPT4gJE93bmVye1VzZXJFbWFpbH0gICAgfHwgJycsCiAgICAgICAgICAgIENhbGVuZGFyTmFtZSAgPT4gJENhbGVuZGFyTmFtZSB8fCAnJywKICAgICAgICAgICAgSGFzQ2FsZW5kYXIgICA9PiAkQ2FsZW5kYXJOYW1lID8gMSA6IDAsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBfQ3JlYXRlQXBwb2ludG1lbnQoKQoKQ3JlYXRlIGEgWm51bnkgY2FsZW5kYXIgYXBwb2ludG1lbnQgYW5kIGxpbmsgaXQgdG8gYSB0aWNrZXQuCgpQYXJhbWV0ZXJzOgogICAgVGlja2V0SUQgICAgLSBUaWNrZXQgSUQgdG8gbGluayB0aGUgYXBwb2ludG1lbnQgdG8KICAgIFRpdGxlICAgICAgIC0gQXBwb2ludG1lbnQgdGl0bGUKICAgIFN0YXJ0VGltZSAgIC0gU3RhcnQgdGltZSAoWVlZWS1NTS1ERCBISDpNTTpTUyksIGluIHRoZSBhZ2VudCdzIG93bgogICAgICAgICAgICAgICAgICB3YWxsLWNsb2NrIHRpbWUgem9uZSAoc2VlIFRpbWVab25lKQogICAgRW5kVGltZSAgICAgLSBFbmQgdGltZSAoWVlZWS1NTS1ERCBISDpNTTpTUyksIHNhbWUgdGltZSB6b25lIGFzIFN0YXJ0VGltZQogICAgVGltZVpvbmUgICAgLSBJQU5BIHRpbWUgem9uZSBTdGFydFRpbWUvRW5kVGltZSBhcmUgZXhwcmVzc2VkIGluIChlLmcuCiAgICAgICAgICAgICAgICAgICJFdXJvcGUvQmVybGluIik7IGNvbnZlcnRlZCB0byB0aGUgc3lzdGVtJ3Mgc3RvcmFnZSB0aW1lCiAgICAgICAgICAgICAgICAgIHpvbmUgKE9UUlNUaW1lWm9uZSkgYmVmb3JlIHNhdmluZy4gRGVmYXVsdHMgdG8gVVRDLgogICAgRGVzY3JpcHRpb24gLSBPcHRpb25hbCBkZXNjcmlwdGlvbgogICAgTG9jYXRpb24gICAgLSBPcHRpb25hbCBsb2NhdGlvbiAoZS5nLiwgVGVhbXMgbWVldGluZyBVUkwpCgpSZXR1cm5zIEpTT046CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBBcHBvaW50bWVudElEOiAxMjMsCiAgICAgICAgQ2FsZW5kYXJOYW1lOiAiSVQtQ2FsZW5kYXIiCiAgICB9CgpJZiBubyBjYWxlbmRhciBpcyBjb25maWd1cmVkIGZvciB0aGUgcXVldWU6CiAgICB7CiAgICAgICAgU3VjY2VzczogMSwKICAgICAgICBBcHBvaW50bWVudElEOiAwLAogICAgICAgIFdhcm5pbmc6ICJObyBjYWxlbmRhciBjb25maWd1cmVkIGZvciB0aGlzIHF1ZXVlIC0gYXBwb2ludG1lbnQgc2tpcHBlZCIKICAgIH0KCj1jdXQKCnN1YiBfQ3JlYXRlQXBwb2ludG1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJENhbGVuZGFyT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkTGlua09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpOwogICAgbXkgJExvZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgU0VDVVJJVFkgKFMyKTogVmFsaWRhdGUgQ1NSRiB0b2tlbiBmb3Igc3RhdGUtY2hhbmdpbmcgb3BlcmF0aW9uCiAgICBteSAkQ2hhbGxlbmdlVG9rZW4gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2hhbGxlbmdlVG9rZW4nICkgfHwgJyc7CiAgICBpZiAoICEkQ2hhbGxlbmdlVG9rZW4gfHwgJENoYWxsZW5nZVRva2VuIG5lICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhbGxlbmdlVG9rZW59ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdJbnZhbGlkIHNlY3VyaXR5IHRva2VuIC0gcGxlYXNlIHJlbG9hZCB0aGUgcGFnZSBhbmQgdHJ5IGFnYWluJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHBhcmFtZXRlcnMKICAgIG15ICRUaWNrZXRJRCAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXRJRCcgKSAgICB8fCAnJzsKICAgIG15ICRUaXRsZSAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaXRsZScgKSAgICAgICB8fCAnJzsKICAgIG15ICRTdGFydFRpbWUgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydFRpbWUnICkgICB8fCAnJzsKICAgIG15ICRFbmRUaW1lICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbmRUaW1lJyApICAgICB8fCAnJzsKICAgIG15ICREZXNjcmlwdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXNjcmlwdGlvbicgKSB8fCAnJzsKICAgIG15ICRMb2NhdGlvbiAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdMb2NhdGlvbicgKSAgICB8fCAnJzsKCiAgICAjIFN0YXJ0VGltZS9FbmRUaW1lIGFyZSBuYWl2ZSAid2FsbCBjbG9jayIgc3RyaW5ncyBpbiB0aGUgYWdlbnQncyBvd24KICAgICMgYnJvd3NlciB0aW1lIHpvbmUgKGUuZy4gRXVyb3BlL0JlcmxpbiksIG5vdCB0aGUgc3lzdGVtJ3Mgc3RvcmFnZQogICAgIyB0aW1lIHpvbmUgKE9UUlNUaW1lWm9uZSwgdHlwaWNhbGx5IFVUQykuIFdpdGhvdXQgVGltZVpvbmUsIHRoZXknZAogICAgIyBiZSBzdG9yZWQgYXMgaWYgYWxyZWFkeSBpbiBPVFJTVGltZVpvbmUsIHNpbGVudGx5IHNoaWZ0aW5nIHRoZQogICAgIyBhcHBvaW50bWVudCBieSB0aGUgem9uZSdzIFVUQyBvZmZzZXQgLSBtaXNtYXRjaGluZyB0aGUgR3JhcGggQVBJCiAgICAjIG1lZXRpbmcvZXZlbnQsIHdoaWNoIElTIGdpdmVuIGJvdGggdGhlIHdhbGwtY2xvY2sgdGltZSBhbmQgYW4KICAgICMgZXhwbGljaXQgSUFOQSB6b25lIGFuZCByZXNvbHZlcyBpdCBjb3JyZWN0bHkuCiAgICBteSAkVGltZVpvbmUgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVGltZVpvbmUnICkgfHwgJ1VUQyc7CgogICAgIyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJzCiAgICBpZiAoICEkVGlja2V0SUQgfHwgISRUaXRsZSB8fCAhJFN0YXJ0VGltZSB8fCAhJEVuZFRpbWUgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgcmVxdWlyZWQgcGFyYW1ldGVycyAoVGlja2V0SUQsIFRpdGxlLCBTdGFydFRpbWUsIEVuZFRpbWUpJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIFRpY2tldElEIGlzIG51bWVyaWMgdG8gcHJldmVudCBpbmplY3Rpb24KICAgIGlmICggJFRpY2tldElEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgVGlja2V0SUQgZm9ybWF0IC0gbXVzdCBiZSBudW1lcmljJywKICAgICAgICApOwogICAgfQoKICAgICMgU2VjdXJpdHk6IFZhbGlkYXRlIGRhdGV0aW1lIGZvcm1hdCAoWVlZWS1NTS1ERCBISDpNTTpTUykKICAgIG15ICREYXRlVGltZVJlZ2V4ID0gcXIvXlxkezR9LVxkezJ9LVxkezJ9XHNcZHsyfTpcZHsyfTpcZHsyfSQvOwogICAgaWYgKCAkU3RhcnRUaW1lICF+ICREYXRlVGltZVJlZ2V4ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdJbnZhbGlkIFN0YXJ0VGltZSBmb3JtYXQgLSBleHBlY3RlZCBZWVlZLU1NLUREIEhIOk1NOlNTJywKICAgICAgICApOwogICAgfQogICAgaWYgKCAkRW5kVGltZSAhfiAkRGF0ZVRpbWVSZWdleCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBFbmRUaW1lIGZvcm1hdCAtIGV4cGVjdGVkIFlZWVktTU0tREQgSEg6TU06U1MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgVGl0bGUgbGVuZ3RoCiAgICBpZiAoIGxlbmd0aCgkVGl0bGUpID4gMjU1ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdUaXRsZSB0b28gbG9uZyAtIG1heGltdW0gMjU1IGNoYXJhY3RlcnMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTZWN1cml0eTogVmFsaWRhdGUgRGVzY3JpcHRpb24gYW5kIExvY2F0aW9uIGxlbmd0aAogICAgaWYgKCBsZW5ndGgoJERlc2NyaXB0aW9uKSA+IDIwMDAgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0Rlc2NyaXB0aW9uIHRvbyBsb25nIC0gbWF4aW11bSAyMDAwIGNoYXJhY3RlcnMnLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoIGxlbmd0aCgkTG9jYXRpb24pID4gMjU1ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdMb2NhdGlvbiB0b28gbG9uZyAtIG1heGltdW0gMjU1IGNoYXJhY3RlcnMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWSAoUzEwKTogVmFsaWRhdGUgTG9jYXRpb24gZm9yIG1hbGljaW91cyBjb250ZW50CiAgICBpZiAoICRMb2NhdGlvbiAmJiAkTG9jYXRpb24gPX4gL2phdmFzY3JpcHQ6fGRhdGE6fDxzY3JpcHR8PGlmcmFtZXxvblx3K1xzKj0vaSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnSW52YWxpZCBsb2NhdGlvbiBmb3JtYXQgLSBjb250YWlucyBwcm9oaWJpdGVkIGNvbnRlbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWTogVmVyaWZ5IHRoZSByZXF1ZXN0aW5nIGFnZW50IGhhcyB3cml0ZSBhY2Nlc3MgdG8gdGhpcyB0aWNrZXQKICAgICMgYmVmb3JlIGNyZWF0aW5nIGFueXRoaW5nIGFnYWluc3QgaXQuCiAgICBteSAkSGFzQWNjZXNzID0gJFRpY2tldE9iamVjdC0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncncnLAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gbW9kaWZ5IHRoaXMgdGlja2V0JywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISVUaWNrZXQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1RpY2tldCBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgY2FsZW5kYXIgZm9yIHF1ZXVlICh3aXRoIGluaGVyaXRhbmNlKQogICAgbXkgJENhbGVuZGFyTmFtZSA9ICRTZWxmLT5fR2V0Q2FsZW5kYXJGb3JRdWV1ZSggJFRpY2tldHtRdWV1ZX0gKTsKCiAgICBpZiAoICEkQ2FsZW5kYXJOYW1lICkgewogICAgICAgICMgTm8gY2FsZW5kYXIgY29uZmlndXJlZCAtIHJldHVybiBzdWNjZXNzIGJ1dCBza2lwIGFwcG9pbnRtZW50CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzICAgICAgID0+IDEsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMCwKICAgICAgICAgICAgV2FybmluZyAgICAgICA9PiAnTm8gY2FsZW5kYXIgY29uZmlndXJlZCBmb3IgdGhpcyBxdWV1ZSAtIGFwcG9pbnRtZW50IHNraXBwZWQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgY2FsZW5kYXIgYnkgbmFtZSAoZGlyZWN0IGxvb2t1cCB3aXRob3V0IHVzZXIgcGVybWlzc2lvbiBmaWx0ZXJpbmcpCiAgICBteSAlQ2FsZW5kYXIgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyR2V0KAogICAgICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgKTsKCiAgICBpZiAoICElQ2FsZW5kYXIgfHwgISRDYWxlbmRhcntDYWxlbmRhcklEfSApIHsKICAgICAgICAjIENhbGVuZGFyIGRvZXNuJ3QgZXhpc3QgLSBsaXN0IGF2YWlsYWJsZSBjYWxlbmRhcnMgZm9yIGRlYnVnZ2luZwogICAgICAgIG15IEBBbGxDYWxlbmRhcnMgPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyTGlzdCggVmFsaWRJRCA9PiAxICk7CiAgICAgICAgbXkgQENhbGVuZGFyTmFtZXMgPSBtYXAgeyAkXy0+e0NhbGVuZGFyTmFtZX0gfSBAQWxsQ2FsZW5kYXJzOwoKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBFcnJvciAgICAgICAgICAgICAgPT4gIkNhbGVuZGFyICckQ2FsZW5kYXJOYW1lJyBub3QgZm91bmQiLAogICAgICAgICAgICBBdmFpbGFibGVDYWxlbmRhcnMgPT4gXEBDYWxlbmRhck5hbWVzLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENhbGVuZGFySUQgPSAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH07CgogICAgIyBTRUNVUklUWTogVGhlIGNhbGVuZGFyIGxvb2t1cCBhYm92ZSBpcyBieSBuYW1lIG9ubHksIHdpdGggbm8gdXNlcgogICAgIyBwZXJtaXNzaW9uIGZpbHRlcmluZy4gVmVyaWZ5IHRoZSBhZ2VudCBhY3R1YWxseSBoYXMgd3JpdGUgYWNjZXNzIHRvCiAgICAjIHRoaXMgc3BlY2lmaWMgY2FsZW5kYXIncyBncm91cCBiZWZvcmUgY3JlYXRpbmcgYW4gYXBwb2ludG1lbnQgaW4gaXQuCiAgICBteSAkQ2FsZW5kYXJQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQ2FsZW5kYXJJRCwKICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBpZiAoICEkQ2FsZW5kYXJQZXJtaXNzaW9uIHx8ICRDYWxlbmRhclBlcm1pc3Npb24gZXEgJ3JvJyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAiQWNjZXNzIGRlbmllZCAtIG5vIHBlcm1pc3Npb24gdG8gY3JlYXRlIGFwcG9pbnRtZW50cyBpbiBjYWxlbmRhciAnJENhbGVuZGFyTmFtZSciLAogICAgICAgICk7CiAgICB9CgogICAgIyBDb252ZXJ0IGZyb20gdGhlIGFnZW50J3Mgd2FsbC1jbG9jayB0aW1lIHpvbmUgdG8gdGhlIHN5c3RlbSdzCiAgICAjIHN0b3JhZ2UgdGltZSB6b25lIChPVFJTVGltZVpvbmUpIC0gc2VlIHRoZSBUaW1lWm9uZSBjb21tZW50IGFib3ZlLgogICAgIyBNaXJyb3JzIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRBcHBvaW50bWVudEVkaXQncyBvd24KICAgICMgbmV3KFRpbWVab25lID0+IC4uLiktPlRvT1RSU1RpbWVab25lKCkgcGF0dGVybiBmb3IgdGhlIG5hdGl2ZQogICAgIyBhcHBvaW50bWVudCBlZGl0b3IuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICBUaW1lWm9uZSA9PiAkVGltZVpvbmUsCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgIFRpbWVab25lID0+ICRUaW1lWm9uZSwKICAgICAgICB9LAogICAgKTsKICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgfHwgISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICMgRG9uJ3QgZWNobyB0aGUgcmF3IFRpbWVab25lL1N0YXJ0VGltZS9FbmRUaW1lIHZhbHVlcyBiYWNrIC0gYWxsCiAgICAgICAgIyB0aHJlZSBhcmUgYXR0YWNrZXItY29udHJvbGxlZCBQT1NUIHBhcmFtcywgYW5kIHRoaXMgc3RyaW5nIGlzbid0CiAgICAgICAgIyBIVE1MLWVzY2FwZWQgYmVmb3JlIGxhbmRpbmcgaW4gdGhlIEpTT04gcmVzcG9uc2UgYm9keS4gTm8KICAgICAgICAjIGN1cnJlbnQgY2xpZW50LXNpZGUgY2FsbGVyIHJlbmRlcnMgaXQgdW5lc2NhcGVkLCBidXQgbm90CiAgICAgICAgIyBpbnRlcnBvbGF0aW5nIGl0IGF0IGFsbCByZW1vdmVzIHRoZSByZWZsZWN0aW9uIG91dHJpZ2h0IHJhdGhlcgogICAgICAgICMgdGhhbiByZWx5aW5nIG9uIHRoYXQgc3RheWluZyB0cnVlLgogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdJbnZhbGlkIFRpbWVab25lIG9yIGRhdGUvdGltZSB2YWx1ZScsCiAgICAgICAgKTsKICAgIH0KICAgICRTdGFydFRpbWVPYmplY3QtPlRvT1RSU1RpbWVab25lKCk7CiAgICAkRW5kVGltZU9iamVjdC0+VG9PVFJTVGltZVpvbmUoKTsKICAgICRTdGFydFRpbWUgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgJEVuZFRpbWUgICA9ICRFbmRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgICMgQ3JlYXRlIGFwcG9pbnRtZW50CiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgQ2FsZW5kYXJJRCAgPT4gJENhbGVuZGFySUQsCiAgICAgICAgVGl0bGUgICAgICAgPT4gJFRpdGxlLAogICAgICAgIFN0YXJ0VGltZSAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgRW5kVGltZSAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgRGVzY3JpcHRpb24gPT4gJERlc2NyaXB0aW9uLAogICAgICAgIExvY2F0aW9uICAgID0+ICRMb2NhdGlvbiwKICAgICAgICBVc2VySUQgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgIGlmICggISRBcHBvaW50bWVudElEICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdGYWlsZWQgdG8gY3JlYXRlIGFwcG9pbnRtZW50JywKICAgICAgICApOwogICAgfQoKICAgICMgTGluayBhcHBvaW50bWVudCB0byB0aWNrZXQgKHVzaW5nIENvbGxhYm9yYXRpb24gbGluayB0eXBlIGZvciBpZGVudGlmaWNhdGlvbikKICAgIG15ICRMaW5rUmVzdWx0ID0gJExpbmtPYmplY3QtPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdUaWNrZXQnLAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRBcHBvaW50bWVudElELAogICAgICAgIFR5cGUgICAgICAgICA9PiAnQ29sbGFib3JhdGlvbicsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJExpbmtSZXN1bHQgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRmFpbGVkIHRvIGxpbmsgQXBwb2ludG1lbnQgJEFwcG9pbnRtZW50SUQgdG8gVGlja2V0ICRUaWNrZXRJRCIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyAgICAgICA9PiAxLAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgQ2FsZW5kYXJOYW1lICA9PiAkQ2FsZW5kYXJOYW1lLAogICAgKTsKfQoKPWhlYWQyIF9DYW5jZWxBcHBvaW50bWVudCgpCgpDYW5jZWwgYSBabnVueSBjYWxlbmRhciBhcHBvaW50bWVudCBhbmQgcmVtb3ZlIGl0cyBsaW5rIHRvIGEgdGlja2V0LgpSZXR1cm5zIHRoZSBHcmFwaEV2ZW50SUQgc28gdGhlIGZyb250ZW5kIGNhbiBjYW5jZWwgdGhlIE91dGxvb2sgY2FsZW5kYXIgZXZlbnQuCgpQYXJhbWV0ZXJzOgogICAgQXBwb2ludG1lbnRJRCAtIEFwcG9pbnRtZW50IElEIHRvIGNhbmNlbAogICAgVGlja2V0SUQgICAgICAtIFRpY2tldCBJRCB0byB1bmxpbmsgKG9wdGlvbmFsKQoKUmV0dXJucyBKU09OOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgR3JhcGhFdmVudElEOiAiQUFNay4uLiIgKG9yIGVtcHR5IGlmIG5vdCBmb3VuZCkKICAgIH0KCj1jdXQKCnN1YiBfQ2FuY2VsQXBwb2ludG1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7CiAgICBteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKICAgIG15ICRMaW5rT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7CiAgICBteSAkTG9nT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CiAgICBteSAkTGF5b3V0T2JqZWN0ICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgIyBTRUNVUklUWSAoUzIpOiBWYWxpZGF0ZSBDU1JGIHRva2VuIGZvciBzdGF0ZS1jaGFuZ2luZyBvcGVyYXRpb24KICAgIG15ICRDaGFsbGVuZ2VUb2tlbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDaGFsbGVuZ2VUb2tlbicgKSB8fCAnJzsKICAgIGlmICggISRDaGFsbGVuZ2VUb2tlbiB8fCAkQ2hhbGxlbmdlVG9rZW4gbmUgJExheW91dE9iamVjdC0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgc2VjdXJpdHkgdG9rZW4gLSBwbGVhc2UgcmVsb2FkIHRoZSBwYWdlIGFuZCB0cnkgYWdhaW4nLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJEFwcG9pbnRtZW50SUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQXBwb2ludG1lbnRJRCcgKSB8fCAnJzsKICAgIG15ICRUaWNrZXRJRCAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApICAgICAgfHwgJyc7CgogICAgaWYgKCAhJEFwcG9pbnRtZW50SUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgQXBwb2ludG1lbnRJRCBwYXJhbWV0ZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgYXBwb2ludG1lbnQgZGF0YSAodG8gZXh0cmFjdCBHcmFwaEV2ZW50SUQgZnJvbSBkZXNjcmlwdGlvbikKICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICk7CgogICAgaWYgKCAhJUFwcG9pbnRtZW50ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdBcHBvaW50bWVudCBub3QgZm91bmQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWTogUHVyZSBJRCBsb29rdXAgKyBkZWxldGUgaGFzIG5vIG93bmVyc2hpcCBjaGVjayBvdGhlcndpc2UgLQogICAgIyByZXF1aXJlIHRoZSBzYW1lIGNhbGVuZGFyIHdyaXRlIHBlcm1pc3Npb24gdGhhdCBhcHBvaW50bWVudCBjcmVhdGlvbgogICAgIyBhbHJlYWR5IHJlcXVpcmVzLCBrZXllZCBvZmYgdGhlIGFwcG9pbnRtZW50J3Mgb3duIENhbGVuZGFySUQgKG5vdCB0aGUKICAgICMgb3B0aW9uYWwsIGNsaWVudC1zdXBwbGllZCBUaWNrZXRJRCkuCiAgICBteSAkQ2FsZW5kYXJQZXJtaXNzaW9uID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgaWYgKCAhJENhbGVuZGFyUGVybWlzc2lvbiB8fCAkQ2FsZW5kYXJQZXJtaXNzaW9uIGVxICdybycgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0FjY2VzcyBkZW5pZWQgLSBubyBwZXJtaXNzaW9uIHRvIGNhbmNlbCBhcHBvaW50bWVudHMgaW4gdGhpcyBjYWxlbmRhcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEV4dHJhY3QgR3JhcGhFdmVudElEIGZyb20gRGVzY3JpcHRpb24KICAgIG15ICRHcmFwaEV2ZW50SUQgPSAnJzsKICAgIGlmICggJEFwcG9pbnRtZW50e0Rlc2NyaXB0aW9ufSAmJiAkQXBwb2ludG1lbnR7RGVzY3JpcHRpb259ID1+IC9HcmFwaEV2ZW50SUQ6XHMqKFteXHNcbl0rKS8gKSB7CiAgICAgICAgJEdyYXBoRXZlbnRJRCA9ICQxOwogICAgfQoKICAgICMgRGVsZXRlIGxpbmsgZmlyc3QgKGlmIFRpY2tldElEIHByb3ZpZGVkKQogICAgaWYgKCRUaWNrZXRJRCkgewogICAgICAgIG15ICRMaW5rRGVsZXRlUmVzdWx0ID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGUoCiAgICAgICAgICAgIE9iamVjdDEgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgIEtleTEgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBPYmplY3QyID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEtleTIgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ0NvbGxhYm9yYXRpb24nLAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkTGlua0RlbGV0ZVJlc3VsdCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRlbGV0ZSBDb2xsYWJvcmF0aW9uIGxpbmsgYmV0d2VlbiBUaWNrZXQgJFRpY2tldElEIGFuZCBBcHBvaW50bWVudCAkQXBwb2ludG1lbnRJRCIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRGVsZXRlIFpudW55IGFwcG9pbnRtZW50CiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ZhaWxlZCB0byBkZWxldGUgYXBwb2ludG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJBcHBvaW50bWVudCAkQXBwb2ludG1lbnRJRCBjYW5jZWxsZWQgYnkgdXNlciAkU2VsZi0+e1VzZXJJRH0iLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyAgICAgID0+IDEsCiAgICAgICAgR3JhcGhFdmVudElEID0+ICRHcmFwaEV2ZW50SUQsCiAgICApOwp9Cgo9aGVhZDIgX0dldFVzZXJQcm9maWxlKCkKCkdldCB1c2VyIHByb2ZpbGUgYnkgZW1haWwgYWRkcmVzcy4KU2VhcmNoZXMgQ3VzdG9tZXJVc2VyIGZpcnN0LCB0aGVuIFVzZXIgKEFnZW50cykuCgpQYXJhbWV0ZXJzOgogICAgRW1haWwgLSBFbWFpbCBhZGRyZXNzIHRvIHNlYXJjaCBmb3IKClJldHVybnMgSlNPTiAoaW4gUHJvdmlkZXIgZm9ybWF0KToKICAgIHsKICAgICAgICBTdWNjZXNzOiAxLAogICAgICAgIFByb2ZpbGU6IHsKICAgICAgICAgICAgZGlzcGxheU5hbWU6ICJNYXggTXVzdGVybWFubiIsCiAgICAgICAgICAgIGdpdmVuTmFtZTogIk1heCIsCiAgICAgICAgICAgIHN1cm5hbWU6ICJNdXN0ZXJtYW5uIiwKICAgICAgICAgICAgZW1haWw6ICJtYXhAZXhhbXBsZS5jb20iLAogICAgICAgICAgICBqb2JUaXRsZTogIlN1cHBvcnQgQWdlbnQiLAogICAgICAgICAgICBidXNpbmVzc1Bob25lczogWyIrNDkgMTIzIDQ1Njc4OSJdLAogICAgICAgICAgICBtb2JpbGVQaG9uZTogIis0OSAxNzAgMTIzNDU2NyIsCiAgICAgICAgICAgIG9mZmljZUxvY2F0aW9uOiAiQmVybGluIiwKICAgICAgICAgICAgZGVwYXJ0bWVudDogbnVsbCwKICAgICAgICAgICAgbWFuYWdlcjogbnVsbCwKICAgICAgICAgICAgdGlja2V0Q291bnQ6IDUgIC8vIE9ubHkgZm9yIGN1c3RvbWVycwogICAgICAgIH0KICAgIH0KCj1jdXQKCnN1YiBfR2V0VXNlclByb2ZpbGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICRVc2VyT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKICAgIG15ICRMb2dPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgIyBHZXQgZW1haWwgcGFyYW1ldGVyCiAgICBteSAkRW1haWwgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRW1haWwnICkgfHwgJyc7CgogICAgaWYgKCAhJEVtYWlsICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdNaXNzaW5nIEVtYWlsIHBhcmFtZXRlcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZIChTMyk6IFZhbGlkYXRlIGVtYWlsIGZvcm1hdCB0byBwcmV2ZW50IGVudW1lcmF0aW9uIGF0dGFja3MKICAgIGlmICggJEVtYWlsICF+IC9eW15cc1xAXStcQFteXHNcQF0rXC5bXlxzXEBdKyQvICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdJbnZhbGlkIGVtYWlsIGZvcm1hdCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZIChTMyk6IFZhbGlkYXRlIGVtYWlsIGxlbmd0aAogICAgaWYgKCBsZW5ndGgoJEVtYWlsKSA+IDI1NCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnRW1haWwgYWRkcmVzcyB0b28gbG9uZycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZIChTMyk6IFJhdGUgbGltaXRpbmcgLSBtYXggNjAgcmVxdWVzdHMgcGVyIG1pbnV0ZSBwZXIgdXNlcgogICAgaWYgKCAhJFNlbGYtPl9DaGVja1JhdGVMaW1pdCgnR2V0VXNlclByb2ZpbGUnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnUmF0ZSBsaW1pdCBleGNlZWRlZCAtIHBsZWFzZSB3YWl0IGJlZm9yZSBtYWtpbmcgbW9yZSByZXF1ZXN0cycsCiAgICAgICAgKTsKICAgIH0KCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICBNZXNzYWdlICA9PiAnW0NvbGxhYm9yYXRpb25dIEdldFVzZXJQcm9maWxlIGNhbGxlZCBmb3IgZW1haWwnLAogICAgKTsKCiAgICBteSAlUHJvZmlsZTsKICAgIG15ICRJc0N1c3RvbWVyID0gMDsKCiAgICAjIEZpcnN0LCB0cnkgdG8gZmluZCBhcyBDdXN0b21lclVzZXIgKGJ5IGVtYWlsKQogICAgbXkgJUN1c3RvbWVyVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRFbWFpbCwKICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDEsCiAgICAgICAgTGltaXQgICAgICAgICAgICA9PiAxLAogICAgKTsKCiAgICAjIFNFQ1VSSVRZOiBMb2cgYXQgZGVidWcgbGV2ZWwgb25seSwgbm8gUElJIGV4cG9zdXJlCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICBNZXNzYWdlICA9PiAiW0NvbGxhYm9yYXRpb25dIEN1c3RvbWVyU2VhcmNoIGZvdW5kOiAiIC4gc2NhbGFyKGtleXMgJUN1c3RvbWVyVXNlckxpc3QpIC4gIiByZXN1bHRzIiwKICAgICk7CgogICAgaWYgKCVDdXN0b21lclVzZXJMaXN0KSB7CiAgICAgICAgbXkgKCRDdXN0b21lclVzZXJMb2dpbikgPSBrZXlzICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgIG15ICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICApOwoKICAgICAgICBpZiAoJUN1c3RvbWVyVXNlcikgewogICAgICAgICAgICAkSXNDdXN0b21lciA9IDE7CgogICAgICAgICAgICAjIEJ1aWxkIGRpc3BsYXlOYW1lIGZyb20gRmlyc3RuYW1lICsgTGFzdG5hbWUgaWYgVXNlckZ1bGxuYW1lIGlzIGVtcHR5CiAgICAgICAgICAgIG15ICREaXNwbGF5TmFtZSA9ICRDdXN0b21lclVzZXJ7VXNlckZ1bGxuYW1lfSB8fCAnJzsKICAgICAgICAgICAgaWYgKCAhJERpc3BsYXlOYW1lICYmICggJEN1c3RvbWVyVXNlcntVc2VyRmlyc3RuYW1lfSB8fCAkQ3VzdG9tZXJVc2Vye1VzZXJMYXN0bmFtZX0gKSApIHsKICAgICAgICAgICAgICAgICREaXNwbGF5TmFtZSA9IGpvaW4oICcgJywKICAgICAgICAgICAgICAgICAgICBncmVwIHsgZGVmaW5lZCAkXyAmJiAkXyBuZSAnJyB9CiAgICAgICAgICAgICAgICAgICAgKCAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9LCAkQ3VzdG9tZXJVc2Vye1VzZXJMYXN0bmFtZX0gKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJVByb2ZpbGUgPSAoCiAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZSAgICA9PiAkRGlzcGxheU5hbWUsCiAgICAgICAgICAgICAgICBnaXZlbk5hbWUgICAgICA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJGaXJzdG5hbWV9IHx8ICcnLAogICAgICAgICAgICAgICAgc3VybmFtZSAgICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyTGFzdG5hbWV9ICB8fCAnJywKICAgICAgICAgICAgICAgIGVtYWlsICAgICAgICAgID0+ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSAgICAgfHwgJEVtYWlsLAogICAgICAgICAgICAgICAgam9iVGl0bGUgICAgICAgPT4gJEN1c3RvbWVyVXNlcntVc2VyVGl0bGV9ICAgICB8fCAnJywKICAgICAgICAgICAgICAgIGJ1c2luZXNzUGhvbmVzID0+ICRDdXN0b21lclVzZXJ7VXNlclBob25lfSA/IFsgJEN1c3RvbWVyVXNlcntVc2VyUGhvbmV9IF0gOiBbXSwKICAgICAgICAgICAgICAgIG1vYmlsZVBob25lICAgID0+ICRDdXN0b21lclVzZXJ7VXNlck1vYmlsZX0gICAgfHwgJycsCiAgICAgICAgICAgICAgICBvZmZpY2VMb2NhdGlvbiA9PiAkQ3VzdG9tZXJVc2Vye1VzZXJDaXR5fSAgICAgIHx8ICcnLAogICAgICAgICAgICAgICAgZGVwYXJ0bWVudCAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICBtYW5hZ2VyICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU0VDVVJJVFk6IFVubGlrZSBfR2V0Q3VzdG9tZXJEYXRhLCB0aGlzIGVuZHBvaW50IGhhZCBubwogICAgICAgICAgICAjIGF1dGhvcml6YXRpb24gY2hlY2sgYXQgYWxsIC0gYW55IGFnZW50IGNvdWxkIHB1bGwgYW55CiAgICAgICAgICAgICMgY3VzdG9tZXIncyBwaG9uZS9tb2JpbGUvb2ZmaWNlIGJ5IGVtYWlsLiBSZXF1aXJlIHRoZSBzYW1lCiAgICAgICAgICAgICMgImFnZW50IGhhcyBhbiBleGlzdGluZyB0aWNrZXQgd2l0aCB0aGlzIGN1c3RvbWVyIiBidXNpbmVzcwogICAgICAgICAgICAjIHJ1bGUgX0dldEN1c3RvbWVyRGF0YSBhbHJlYWR5IGVuZm9yY2VzLiBPbiBmYWlsdXJlLCBkZWdyYWRlCiAgICAgICAgICAgICMgdG8gdGhlIHNhbWUgbWluaW1hbCBwcm9maWxlIHVzZWQgYmVsb3cgZm9yICJ1c2VyIG5vdCBmb3VuZCIKICAgICAgICAgICAgIyByYXRoZXIgdGhhbiBlcnJvcmluZyBvdXQsIHNvIGhvdmVyIGNhcmRzIGVsc2V3aGVyZSBrZWVwCiAgICAgICAgICAgICMgd29ya2luZyBhbmQgb25seSBsb3NlIHRoZSBlbnJpY2htZW50IHRoZXkgd2VyZSBuZXZlcgogICAgICAgICAgICAjIGVudGl0bGVkIHRvIGluIHRoZSBmaXJzdCBwbGFjZS4KICAgICAgICAgICAgbXkgQEF1dGhUaWNrZXRJRHMgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgICAgICAgICA9PiAnQVJSQVknLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW4gPT4gJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgUGVybWlzc2lvbiAgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggIUBBdXRoVGlja2V0SURzICkgewogICAgICAgICAgICAgICAgJVByb2ZpbGUgICAgPSAoKTsKICAgICAgICAgICAgICAgICRJc0N1c3RvbWVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIElmIG5vdCBmb3VuZCBhcyBDdXN0b21lclVzZXIsIHRyeSBVc2VyIChBZ2VudHMpCiAgICBpZiAoICElUHJvZmlsZSApIHsKICAgICAgICBteSAkTG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICAgICAjIFRyeSBjYXNlLWluc2Vuc2l0aXZlIHNlYXJjaCB0aHJvdWdoIGFsbCB1c2VycwogICAgICAgIG15ICVBbGxVc2VycyA9ICRVc2VyT2JqZWN0LT5Vc2VyTGlzdCggVmFsaWQgPT4gMSApOwogICAgICAgIG15ICRMb3dlckVtYWlsID0gbGMoJEVtYWlsKTsKICAgICAgICBteSAlVXNlckxpc3Q7CgogICAgICAgICMgU0VDVVJJVFk6IGRlYnVnIGxldmVsIG9ubHkgLSBhdm9pZCB3cml0aW5nIGV2ZXJ5IGFnZW50J3MgZW1haWwKICAgICAgICAjIGludG8gdGhlIHN5c3RlbSBsb2cgYXQgbm90aWNlIGxldmVsIGZvciBldmVyeSBwcm9maWxlIGxvb2t1cC4KICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gU2VhcmNoaW5nIGZvciBhZ2VudCB3aXRoIGVtYWlsOiAkRW1haWwgKGZvdW5kICIgLiBzY2FsYXIoa2V5cyAlQWxsVXNlcnMpIC4gIiB1c2VycykiLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlQWxsVXNlcnMgKSB7CiAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSggVXNlcklEID0+ICRVc2VySUQgKTsKICAgICAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlckVtYWlsfSApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gQ2hlY2tpbmcgVXNlciAkVXNlcklEICgkVXNlckRhdGF7VXNlckxvZ2lufSk6IGVtYWlsPSckVXNlckRhdGF7VXNlckVtYWlsfScgdnMgc2VhcmNoPSckTG93ZXJFbWFpbCciLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggbGMoICRVc2VyRGF0YXtVc2VyRW1haWx9ICkgZXEgJExvd2VyRW1haWwgKSB7CiAgICAgICAgICAgICAgICAgICAgJFVzZXJMaXN0eyRVc2VySUR9ID0gJEFsbFVzZXJzeyRVc2VySUR9OwogICAgICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltDb2xsYWJvcmF0aW9uXSBGb3VuZCBtYXRjaDogVXNlciAkVXNlcklEICgkVXNlckRhdGF7VXNlckxvZ2lufSkiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRVc2VySUQgKCBrZXlzICVVc2VyTGlzdCApIHsKICAgICAgICAgICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCVVc2VyKSB7CiAgICAgICAgICAgICAgICAjIEJ1aWxkIGRpc3BsYXlOYW1lIGZyb20gRmlyc3RuYW1lICsgTGFzdG5hbWUgaWYgVXNlckZ1bGxuYW1lIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBteSAkRGlzcGxheU5hbWUgPSAkVXNlcntVc2VyRnVsbG5hbWV9IHx8ICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJERpc3BsYXlOYW1lICYmICggJFVzZXJ7VXNlckZpcnN0bmFtZX0gfHwgJFVzZXJ7VXNlckxhc3RuYW1lfSApICkgewogICAgICAgICAgICAgICAgICAgICREaXNwbGF5TmFtZSA9IGpvaW4oICcgJywKICAgICAgICAgICAgICAgICAgICAgICAgZ3JlcCB7IGRlZmluZWQgJF8gJiYgJF8gbmUgJycgfQogICAgICAgICAgICAgICAgICAgICAgICAoICRVc2Vye1VzZXJGaXJzdG5hbWV9LCAkVXNlcntVc2VyTGFzdG5hbWV9ICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVQcm9maWxlID0gKAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lICAgID0+ICREaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICBnaXZlbk5hbWUgICAgICA9PiAkVXNlcntVc2VyRmlyc3RuYW1lfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICBzdXJuYW1lICAgICAgICA9PiAkVXNlcntVc2VyTGFzdG5hbWV9ICB8fCAnJywKICAgICAgICAgICAgICAgICAgICBlbWFpbCAgICAgICAgICA9PiAkVXNlcntVc2VyRW1haWx9ICAgICB8fCAkRW1haWwsCiAgICAgICAgICAgICAgICAgICAgam9iVGl0bGUgICAgICAgPT4gJFVzZXJ7VXNlclRpdGxlfSAgICAgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXMgPT4gJFVzZXJ7VXNlclBob25lfSA/IFsgJFVzZXJ7VXNlclBob25lfSBdIDogW10sCiAgICAgICAgICAgICAgICAgICAgbW9iaWxlUGhvbmUgICAgPT4gJFVzZXJ7VXNlck1vYmlsZX0gICAgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgb2ZmaWNlTG9jYXRpb24gPT4gJFVzZXJ7VXNlckNpdHl9ICAgICAgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgZGVwYXJ0bWVudCAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlciAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIElmIHN0aWxsIG5vdCBmb3VuZCwgcmV0dXJuIG1pbmltYWwgcHJvZmlsZQogICAgaWYgKCAhJVByb2ZpbGUgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiW0NvbGxhYm9yYXRpb25dIE5vIHVzZXIgZm91bmQgZm9yICckRW1haWwnLCByZXR1cm5pbmcgbWluaW1hbCBwcm9maWxlIiwKICAgICAgICApOwoKICAgICAgICBteSAkTG9jYWxQYXJ0ID0gJEVtYWlsOwogICAgICAgICRMb2NhbFBhcnQgPX4gcy9ALiokLy87CiAgICAgICAgJExvY2FsUGFydCA9fiBzL1suXy1dLyAvZzsKICAgICAgICAkTG9jYWxQYXJ0ID0gdWNmaXJzdCgkTG9jYWxQYXJ0KTsKCiAgICAgICAgJVByb2ZpbGUgPSAoCiAgICAgICAgICAgIGRpc3BsYXlOYW1lICAgID0+ICRMb2NhbFBhcnQsCiAgICAgICAgICAgIGdpdmVuTmFtZSAgICAgID0+ICcnLAogICAgICAgICAgICBzdXJuYW1lICAgICAgICA9PiAnJywKICAgICAgICAgICAgZW1haWwgICAgICAgICAgPT4gJEVtYWlsLAogICAgICAgICAgICBqb2JUaXRsZSAgICAgICA9PiAnJywKICAgICAgICAgICAgYnVzaW5lc3NQaG9uZXMgPT4gW10sCiAgICAgICAgICAgIG1vYmlsZVBob25lICAgID0+ICcnLAogICAgICAgICAgICBvZmZpY2VMb2NhdGlvbiA9PiAnJywKICAgICAgICAgICAgZGVwYXJ0bWVudCAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIG1hbmFnZXIgICAgICAgID0+IHVuZGVmLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gRm91bmQgdXNlciAnJEVtYWlsJzogZGlzcGxheU5hbWU9JyRQcm9maWxle2Rpc3BsYXlOYW1lfSciLAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgdGlja2V0IGNvdW50IGZvciBjdXN0b21lcnMKICAgIGlmICgkSXNDdXN0b21lcikgewogICAgICAgIG15ICRUaWNrZXRDb3VudCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyTG9naW5SYXcgPT4gJFByb2ZpbGV7ZW1haWx9LAogICAgICAgICAgICBTdGF0ZVR5cGUgICAgICAgICAgICA9PiBbICduZXcnLCAnb3BlbicsICdwZW5kaW5nIHJlbWluZGVyJywgJ3BlbmRpbmcgYXV0bycgXSwKICAgICAgICAgICAgUmVzdWx0ICAgICAgICAgICAgICAgPT4gJ0NPVU5UJywKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBQZXJtaXNzaW9uICAgICAgICAgICA9PiAncm8nLAogICAgICAgICk7CiAgICAgICAgJFByb2ZpbGV7dGlja2V0Q291bnR9ID0gJFRpY2tldENvdW50IHx8IDA7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBQcm9maWxlID0+IFwlUHJvZmlsZSwKICAgICk7Cn0KCj1oZWFkMiBfR2V0QWdlbnRCeVVzZXJJRCgpCgpHZXQgYWdlbnQgZGF0YSBieSBVc2VySUQuClVzZWQgYnkgT3duZXJJbmZvUGFuZWwgdG8gZ2V0IGVtYWlsIGFkZHJlc3MgZm9yIGEgc2VsZWN0ZWQgYWdlbnQuCgpQYXJhbWV0ZXJzOgogICAgVXNlcklEIC0gWm51bnkgVXNlcklEIG9mIHRoZSBhZ2VudAoKUmV0dXJucyBKU09OOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgVXNlcklEOiAxMjMsCiAgICAgICAgRW1haWw6ICJhZ2VudEBleGFtcGxlLmNvbSIsCiAgICAgICAgRnVsbG5hbWU6ICJNYXggTXVzdGVybWFubiIsCiAgICAgICAgTG9naW46ICJtYXguYWdlbnQiCiAgICB9Cgo9Y3V0CgpzdWIgX0dldEFnZW50QnlVc2VySUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVXNlck9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJExvZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgR2V0IFVzZXJJRCBwYXJhbWV0ZXIKICAgIG15ICRVc2VySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVXNlcklEJyApIHx8ICcnOwoKICAgIGlmICggISRVc2VySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ01pc3NpbmcgVXNlcklEIHBhcmFtZXRlcicsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZOiBWYWxpZGF0ZSBVc2VySUQgaXMgbnVtZXJpYwogICAgaWYgKCAkVXNlcklEICF+IC9eXGQrJC8gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0ludmFsaWQgVXNlcklEIGZvcm1hdCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZOiBSYXRlIGxpbWl0aW5nIC0gYm91bmQgVXNlcklEIGVudW1lcmF0aW9uCiAgICBpZiAoICEkU2VsZi0+X0NoZWNrUmF0ZUxpbWl0KCdHZXRBZ2VudEJ5VXNlcklEJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ1JhdGUgbGltaXQgZXhjZWVkZWQgLSBwbGVhc2Ugd2FpdCBiZWZvcmUgbWFraW5nIG1vcmUgcmVxdWVzdHMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBHZXQgYWdlbnQgZGF0YQogICAgbXkgJVVzZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgVmFsaWQgID0+IDEsCiAgICApOwoKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJbQ29sbGFib3JhdGlvbl0gR2V0QWdlbnRCeVVzZXJJRDogVXNlciBub3QgZm91bmQgZm9yIFVzZXJJRCAkVXNlcklEIiwKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdVc2VyIG5vdCBmb3VuZCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIFNFQ1VSSVRZOiBXaXRob3V0IHRoaXMsIGFueSBsb2dnZWQtaW4gYWdlbnQgY291bGQgZW51bWVyYXRlIGV2ZXJ5CiAgICAjIG90aGVyIGFnZW50J3MgZW1haWwvbG9naW4vZnVsbG5hbWUgYnkgaXRlcmF0aW5nIFVzZXJJRCwgc2luY2UKICAgICMgR2V0VXNlckRhdGEoKSBpdHNlbGYgZG9lc24ndCBjaGVjayBhbnkgcmVsYXRpb25zaGlwIGJldHdlZW4gY2FsbGVyCiAgICAjIGFuZCB0YXJnZXQuIFJlcXVpcmUgdGhlIHJlcXVlc3RlciBhbmQgdGFyZ2V0IHRvIHNoYXJlIGF0IGxlYXN0IG9uZQogICAgIyBwZXJtaXNzaW9uIGdyb3VwIC0gdGhlIHNhbWUgcmVsYXRpb25zaGlwIFpudW55J3Mgb3duIG93bmVyLwogICAgIyByZXNwb25zaWJsZSBkcm9wZG93bnMgYXJlIHNjb3BlZCBieSAtIHNvIHRoaXMgb25seSBldmVyIHJlc29sdmVzCiAgICAjIGNvbGxlYWd1ZXMgdGhlIGFnZW50IGNvdWxkIGFscmVhZHkgc2VlIGFzIHRpY2tldCBvd25lciBjYW5kaWRhdGVzLgogICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAlUmVxdWVzdGVyR3JvdXBzID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgKTsKICAgIG15ICVUYXJnZXRHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgIFVzZXJJRCA9PiAkVXNlcklELAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgKTsKICAgIG15ICRTaGFyZXNHcm91cCA9IGdyZXAgeyAkUmVxdWVzdGVyR3JvdXBzeyRffSB9IGtleXMgJVRhcmdldEdyb3VwczsKCiAgICBpZiAoICEkU2hhcmVzR3JvdXAgKSB7CiAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIltDb2xsYWJvcmF0aW9uXSBHZXRBZ2VudEJ5VXNlcklEOiBVc2VySUQgJFNlbGYtPntVc2VySUR9IGhhcyBubyBzaGFyZWQgZ3JvdXAgd2l0aCB0YXJnZXQgVXNlcklEICRVc2VySUQgLSBkZW5pZWQiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgIEVycm9yICAgPT4gJ0FjY2VzcyBkZW5pZWQgLSBubyByZWxhdGlvbnNoaXAgdG8gdGhpcyBhZ2VudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICBNZXNzYWdlICA9PiAiW0NvbGxhYm9yYXRpb25dIEdldEFnZW50QnlVc2VySUQ6IEZvdW5kIHVzZXIgJFVzZXJ7VXNlckxvZ2lufSBmb3IgVXNlcklEICRVc2VySUQiLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgU3VjY2VzcyAgPT4gMSwKICAgICAgICBVc2VySUQgICA9PiAkVXNlcklELAogICAgICAgIEVtYWlsICAgID0+ICRVc2Vye1VzZXJFbWFpbH0gfHwgJycsCiAgICAgICAgRnVsbG5hbWUgPT4gJFVzZXJ7VXNlckZ1bGxuYW1lfSB8fCAnJywKICAgICAgICBMb2dpbiAgICA9PiAkVXNlcntVc2VyTG9naW59IHx8ICcnLAogICAgKTsKfQoKPWhlYWQyIF9HZXRPdXRPZk9mZmljZSgpCgpHZXQgb3V0LW9mLW9mZmljZSBzdGF0dXMgZm9yIGFuIGFnZW50IGJ5IGVtYWlsLgoKUGFyYW1ldGVyczoKICAgIEVtYWlsIC0gRW1haWwgYWRkcmVzcyBvZiB0aGUgYWdlbnQKClJldHVybnMgSlNPTjoKICAgIHsKICAgICAgICBTdWNjZXNzOiAxLAogICAgICAgIE91dE9mT2ZmaWNlOiB7CiAgICAgICAgICAgIHN0YXR1czogImFsd2F5c0VuYWJsZWQiLAogICAgICAgICAgICBpbnRlcm5hbFJlcGx5TWVzc2FnZTogIkljaCBiaW4gYWJ3ZXNlbmQuLi4iLAogICAgICAgICAgICBzY2hlZHVsZWRTdGFydERhdGVUaW1lOiAiMjAyNS0xMi0yOVQwMDowMDowMFoiLAogICAgICAgICAgICBzY2hlZHVsZWRFbmREYXRlVGltZTogIjIwMjYtMDEtMDRUMjM6NTk6NTlaIgogICAgICAgIH0KICAgIH0KCklmIE9PRiBpcyBub3QgYWN0aXZlOgogICAgewogICAgICAgIFN1Y2Nlc3M6IDEsCiAgICAgICAgT3V0T2ZPZmZpY2U6IG51bGwKICAgIH0KCj1jdXQKCnN1YiBfR2V0T3V0T2ZPZmZpY2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkVXNlck9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpOwogICAgbXkgJExvZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpOwoKICAgICMgR2V0IGVtYWlsIHBhcmFtZXRlcgogICAgbXkgJEVtYWlsID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VtYWlsJyApIHx8ICcnOwoKICAgIGlmICggISRFbWFpbCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPl9KU09OUmVzcG9uc2UoCiAgICAgICAgICAgIFN1Y2Nlc3MgPT4gMCwKICAgICAgICAgICAgRXJyb3IgICA9PiAnTWlzc2luZyBFbWFpbCBwYXJhbWV0ZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBTRUNVUklUWTogUmF0ZSBsaW1pdGluZyAtIGJvdW5kIGVtYWlsIGVudW1lcmF0aW9uCiAgICBpZiAoICEkU2VsZi0+X0NoZWNrUmF0ZUxpbWl0KCdHZXRPdXRPZk9mZmljZScpICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyA9PiAwLAogICAgICAgICAgICBFcnJvciAgID0+ICdSYXRlIGxpbWl0IGV4Y2VlZGVkIC0gcGxlYXNlIHdhaXQgYmVmb3JlIG1ha2luZyBtb3JlIHJlcXVlc3RzJywKICAgICAgICApOwogICAgfQoKICAgICMgRmluZCB1c2VyIGJ5IGVtYWlsIChjYXNlLWluc2Vuc2l0aXZlKQogICAgbXkgJUFsbFVzZXJzID0gJFVzZXJPYmplY3QtPlVzZXJMaXN0KCBWYWxpZCA9PiAxICk7CiAgICBteSAkTG93ZXJFbWFpbCA9IGxjKCRFbWFpbCk7CiAgICBteSAkVXNlcklEOwoKICAgIGZvciBteSAkVUlEICgga2V5cyAlQWxsVXNlcnMgKSB7CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKCBVc2VySUQgPT4gJFVJRCApOwogICAgICAgIGlmICggJFVzZXJEYXRhe1VzZXJFbWFpbH0gJiYgbGMoICRVc2VyRGF0YXtVc2VyRW1haWx9ICkgZXEgJExvd2VyRW1haWwgKSB7CiAgICAgICAgICAgICRVc2VySUQgPSAkVUlEOwogICAgICAgICAgICBsYXN0OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEkVXNlcklEICkgewogICAgICAgICMgVXNlciBub3QgZm91bmQgLSBubyBPT0YgZGF0YQogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICAgICAgT3V0T2ZPZmZpY2UgPT4gdW5kZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdldCB1c2VyIHByZWZlcmVuY2VzIGZvciBPT0YKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+ICRVc2VySUQgKTsKCiAgICAjIENoZWNrIGlmIE9PRiBpcyBlbmFibGVkCiAgICBpZiAoICEkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2V9IHx8ICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZX0gbmUgJzEnICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICAgICAgT3V0T2ZPZmZpY2UgPT4gdW5kZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEJ1aWxkIGRhdGUgc3RyaW5ncwogICAgbXkgJFN0YXJ0RGF0ZTsKICAgIG15ICRFbmREYXRlOwoKICAgIGlmICggJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlU3RhcnRZZWFyfSAmJiAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydE1vbnRofSAmJiAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydERheX0gKSB7CiAgICAgICAgJFN0YXJ0RGF0ZSA9IHNwcmludGYoCiAgICAgICAgICAgICclMDRkLSUwMmQtJTAyZFQwMDowMDowMFonLAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydFllYXJ9LAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VTdGFydE1vbnRofSwKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlU3RhcnREYXl9CiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZFllYXJ9ICYmICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZE1vbnRofSAmJiAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VFbmREYXl9ICkgewogICAgICAgICRFbmREYXRlID0gc3ByaW50ZigKICAgICAgICAgICAgJyUwNGQtJTAyZC0lMDJkVDIzOjU5OjU5WicsCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZFllYXJ9LAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VFbmRNb250aH0sCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZERheX0KICAgICAgICApOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT09GIGlzIGN1cnJlbnRseSBhY3RpdmUgKHdpdGhpbiBkYXRlIHJhbmdlKQogICAgbXkgJE5vdyA9IHRpbWUoKTsKICAgIG15ICRJc0FjdGl2ZSA9IDE7CgogICAgaWYgKCRTdGFydERhdGUpIHsKICAgICAgICAjIFBhcnNlIHN0YXJ0IGRhdGUKICAgICAgICBpZiAoICRTdGFydERhdGUgPX4gL14oXGR7NH0pLShcZHsyfSktKFxkezJ9KS8gKSB7CiAgICAgICAgICAgIHVzZSBQT1NJWCBxdyhta3RpbWUpOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lc3RhbXAgPSBQT1NJWDo6bWt0aW1lKCAwLCAwLCAwLCAkMywgJDIgLSAxLCAkMSAtIDE5MDAgKTsKICAgICAgICAgICAgaWYgKCAkTm93IDwgJFN0YXJ0VGltZXN0YW1wICkgewogICAgICAgICAgICAgICAgJElzQWN0aXZlID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRJc0FjdGl2ZSAmJiAkRW5kRGF0ZSApIHsKICAgICAgICAjIFBhcnNlIGVuZCBkYXRlCiAgICAgICAgaWYgKCAkRW5kRGF0ZSA9fiAvXihcZHs0fSktKFxkezJ9KS0oXGR7Mn0pLyApIHsKICAgICAgICAgICAgdXNlIFBPU0lYIHF3KG1rdGltZSk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lc3RhbXAgPSBQT1NJWDo6bWt0aW1lKCA1OSwgNTksIDIzLCAkMywgJDIgLSAxLCAkMSAtIDE5MDAgKTsKICAgICAgICAgICAgaWYgKCAkTm93ID4gJEVuZFRpbWVzdGFtcCApIHsKICAgICAgICAgICAgICAgICRJc0FjdGl2ZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJElzQWN0aXZlICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0pTT05SZXNwb25zZSgKICAgICAgICAgICAgU3VjY2VzcyAgICAgPT4gMSwKICAgICAgICAgICAgT3V0T2ZPZmZpY2UgPT4gdW5kZWYsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEJ1aWxkIE9PRiBtZXNzYWdlIChabnVueSBkb2Vzbid0IGhhdmUgc2VwYXJhdGUgaW50ZXJuYWwvZXh0ZXJuYWwgbWVzc2FnZXMpCiAgICAjIFdlIGJ1aWxkIGEgc2ltcGxlIG1lc3NhZ2UgZnJvbSB0aGUgZGF0ZSByYW5nZQogICAgbXkgJE1lc3NhZ2UgPSAnQWJ3ZXNlbmQnOwogICAgaWYgKCAkU3RhcnREYXRlICYmICRFbmREYXRlICkgewogICAgICAgIG15ICRTdGFydEZvcm1hdHRlZCA9IHNwcmludGYoICclMDJkLiUwMmQuJTA0ZCcsCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0RGF5fSwKICAgICAgICAgICAgJFByZWZlcmVuY2Vze091dE9mT2ZmaWNlU3RhcnRNb250aH0sCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZVN0YXJ0WWVhcn0KICAgICAgICApOwogICAgICAgIG15ICRFbmRGb3JtYXR0ZWQgPSBzcHJpbnRmKCAnJTAyZC4lMDJkLiUwNGQnLAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VFbmREYXl9LAogICAgICAgICAgICAkUHJlZmVyZW5jZXN7T3V0T2ZPZmZpY2VFbmRNb250aH0sCiAgICAgICAgICAgICRQcmVmZXJlbmNlc3tPdXRPZk9mZmljZUVuZFllYXJ9CiAgICAgICAgKTsKICAgICAgICAkTWVzc2FnZSA9ICJBYndlc2VuZCB2b20gJFN0YXJ0Rm9ybWF0dGVkIGJpcyAkRW5kRm9ybWF0dGVkIjsKICAgIH0KCiAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICBNZXNzYWdlICA9PiAiW0NvbGxhYm9yYXRpb25dIEdldE91dE9mT2ZmaWNlOiBVc2VyICRVc2VySUQgaXMgT09GIHVudGlsICRFbmREYXRlIiwKICAgICk7CgogICAgcmV0dXJuICRTZWxmLT5fSlNPTlJlc3BvbnNlKAogICAgICAgIFN1Y2Nlc3MgICAgID0+IDEsCiAgICAgICAgT3V0T2ZPZmZpY2UgPT4gewogICAgICAgICAgICBzdGF0dXMgICAgICAgICAgICAgICAgID0+ICdhbHdheXNFbmFibGVkJywKICAgICAgICAgICAgaW50ZXJuYWxSZXBseU1lc3NhZ2UgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgZXh0ZXJuYWxSZXBseU1lc3NhZ2UgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgZXh0ZXJuYWxBdWRpZW5jZSAgICAgICA9PiAnYWxsJywKICAgICAgICAgICAgc2NoZWR1bGVkU3RhcnREYXRlVGltZSA9PiAkU3RhcnREYXRlLAogICAgICAgICAgICBzY2hlZHVsZWRFbmREYXRlVGltZSAgID0+ICRFbmREYXRlLAogICAgICAgIH0sCiAgICApOwp9Cgo9aGVhZDIgX0dldENhbGVuZGFyRm9yUXVldWUoKQoKR2V0IHRoZSBjYWxlbmRhciBuYW1lIGZvciBhIHF1ZXVlLCB3aXRoIGluaGVyaXRhbmNlIGZyb20gcGFyZW50IHF1ZXVlcy4KCkV4YW1wbGU6IEZvciBxdWV1ZSAiSVQ6OkhhcmR3YXJlOjpQcmludGVyIiwgY2hlY2tzOgogICAgMS4gSVQ6OkhhcmR3YXJlOjpQcmludGVyIChkaXJlY3QgbWF0Y2gpCiAgICAyLiBJVDo6SGFyZHdhcmUgKHBhcmVudCkKICAgIDMuIElUIChncmFuZHBhcmVudCkKCj1jdXQKCnN1YiBfR2V0Q2FsZW5kYXJGb3JRdWV1ZSB7CiAgICBteSAoICRTZWxmLCAkUXVldWVOYW1lICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkTWFwcGluZyA9ICRDb25maWdPYmplY3QtPkdldCgnQ29sbGFib3JhdGlvbjo6UXVldWVDYWxlbmRhck1hcHBpbmcnKSB8fCB7fTsKCiAgICAjIERpcmVjdCBtYXRjaD8KICAgIGlmICggJE1hcHBpbmctPnskUXVldWVOYW1lfSApIHsKICAgICAgICByZXR1cm4gJE1hcHBpbmctPnskUXVldWVOYW1lfTsKICAgIH0KCiAgICAjIENoZWNrIHBhcmVudCBxdWV1ZXMgKHJlY3Vyc2l2ZSkKICAgIG15IEBQYXJ0cyA9IHNwbGl0IC86Oi8sICRRdWV1ZU5hbWU7CiAgICB3aGlsZSAoIEBQYXJ0cyA+IDEgKSB7CiAgICAgICAgcG9wIEBQYXJ0czsKICAgICAgICBteSAkUGFyZW50UXVldWUgPSBqb2luICc6OicsIEBQYXJ0czsKICAgICAgICBpZiAoICRNYXBwaW5nLT57JFBhcmVudFF1ZXVlfSApIHsKICAgICAgICAgICAgcmV0dXJuICRNYXBwaW5nLT57JFBhcmVudFF1ZXVlfTsKICAgICAgICB9CiAgICB9CgogICAgIyBObyBtYXBwaW5nIGZvdW5kCiAgICByZXR1cm47Cn0KCj1oZWFkMiBfQ2hlY2tSYXRlTGltaXQoKQoKRW5mb3JjZSBhIHBlci1hZ2VudCwgcGVyLWVuZHBvaW50IHJhdGUgbGltaXQgb2YgNjAgcmVxdWVzdHMvbWludXRlLCB0bwpib3VuZCB0aGUgZW51bWVyYXRpb24gc3VyZmFjZSBvZiBsb29rdXAgZW5kcG9pbnRzIChlbWFpbC9Vc2VySUQgLT4gcHJvZmlsZQpkYXRhKS4gRWFjaCBuYW1lZCBlbmRwb2ludCBnZXRzIGl0cyBvd24gaW5kZXBlbmRlbnQgYnVkZ2V0IHNvIGhlYXZ5CmxlZ2l0aW1hdGUgdXNlIG9mIG9uZSBlbmRwb2ludCAoZS5nLiBob3ZlciBjYXJkcykgY2FuJ3QgZXhoYXVzdCBhbm90aGVyJ3MuCgogICAgbXkgJE9rID0gJFNlbGYtPl9DaGVja1JhdGVMaW1pdCgnR2V0QWdlbnRCeVVzZXJJRCcpOwoKUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIHdpdGhpbiBidWRnZXQgKGFuZCBjb3VudHMgaXQpLCBmYWxzZSBpZgp0aGUgbGltaXQgd2FzIGFscmVhZHkgcmVhY2hlZC4KCj1jdXQKCnN1YiBfQ2hlY2tSYXRlTGltaXQgewogICAgbXkgKCAkU2VsZiwgJEVuZHBvaW50TmFtZSApID0gQF87CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICBteSAkTG9nT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyk7CgogICAgbXkgJFJhdGVMaW1pdEtleSA9ICJDb2xsYWJvcmF0aW9uUmF0ZUxpbWl0Ojoke0VuZHBvaW50TmFtZX06OiRTZWxmLT57VXNlcklEfSI7CiAgICBteSAkUmVxdWVzdENvdW50ID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAnQ29sbGFib3JhdGlvbicsCiAgICAgICAgS2V5ICA9PiAkUmF0ZUxpbWl0S2V5LAogICAgKSB8fCAwOwoKICAgIGlmICggJFJlcXVlc3RDb3VudCA+PSA2MCApIHsKICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiW0NvbGxhYm9yYXRpb25dIFJhdGUgbGltaXQgZXhjZWVkZWQgZm9yICRFbmRwb2ludE5hbWUsIFVzZXJJRCAkU2VsZi0+e1VzZXJJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJ0NvbGxhYm9yYXRpb24nLAogICAgICAgIEtleSAgID0+ICRSYXRlTGltaXRLZXksCiAgICAgICAgVmFsdWUgPT4gJFJlcXVlc3RDb3VudCArIDEsCiAgICAgICAgVFRMICAgPT4gNjAsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0pTT05SZXNwb25zZSgpCgpSZXR1cm4gYSBKU09OIHJlc3BvbnNlLgoKPWN1dAoKc3ViIF9KU09OUmVzcG9uc2UgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJEpTT05PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CgogICAgbXkgJEpTT04gPSAkSlNPTk9iamVjdC0+RW5jb2RlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9dXRmLTgnLAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwp9CgoxOwoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4KCj1jdXQK</File>

        <!-- Unit Tests -->
        <File Permission="660" Location="scripts/test/Collaboration/AgentCollaborationAJAX.t" Encode="Base64">IyAtLQojIENvcHlyaWdodCAoQykgMjAyNiB3b2xraWcuaXQsIGh0dHBzOi8vd29sa2lnLml0CiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0zLjAudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgKHF3KCRTZWxmKSk7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXI7CgojIEdldCBoZWxwZXIgb2JqZWN0Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBUZXN0IFNldHVwCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojIENyZWF0ZSB0ZXN0IGN1c3RvbWVyIHVzZXIKbXkgJEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgKICAgIExhbmd1YWdlID0+ICdkZScsCik7CgokU2VsZi0+VHJ1ZSgKICAgICRDdXN0b21lclVzZXJMb2dpbiwKICAgICdUZXN0IGN1c3RvbWVyIHVzZXIgY3JlYXRlZDogJyAuICgkQ3VzdG9tZXJVc2VyTG9naW4gfHwgJ0ZBSUxFRCcpLAopOwoKIyBHZXQgdGVzdCBjdXN0b21lciBlbWFpbApteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCik7CgpteSAkQ3VzdG9tZXJFbWFpbCA9ICRDdXN0b21lclVzZXJ7VXNlckVtYWlsfSB8fCAnJzsKCiRTZWxmLT5UcnVlKAogICAgJEN1c3RvbWVyRW1haWwsCiAgICAnQ3VzdG9tZXIgZW1haWwgcmV0cmlldmVkOiAnIC4gJEN1c3RvbWVyRW1haWwsCik7CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIEdldFVzZXJQcm9maWxlIFRlc3RzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokU2VsZi0+VHJ1ZSgKICAgIDEsCiAgICAnLS0tIEdldFVzZXJQcm9maWxlIFRlc3RzIC0tLScsCik7CgojIFRlc3Q6IEdldCBwcm9maWxlIGZvciBleGlzdGluZyBjdXN0b21lcgpTS0lQOiB7CiAgICBpZiAoISRDdXN0b21lckVtYWlsKSB7CiAgICAgICAgJFNlbGYtPlRydWUoMSwgJ1NLSVA6IE5vIGN1c3RvbWVyIGVtYWlsIGZvciB0ZXN0Jyk7CiAgICAgICAgbGFzdCBTS0lQOwogICAgfQoKICAgICMgU2ltdWxhdGUgQUpBWCByZXF1ZXN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBXZSBjYW4ndCBlYXNpbHkgc2ltdWxhdGUgdGhlIGZ1bGwgQUpBWCBmbG93LCBzbyB3ZSB0ZXN0IHRoZSBtb2R1bGUgZGlyZWN0bHkKICAgIG15ICRBSkFYTW9kdWxlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpNb2R1bGVzOjpBZ2VudENvbGxhYm9yYXRpb25BSkFYJyk7CgogICAgaWYgKCEkQUpBWE1vZHVsZSkgewogICAgICAgICRTZWxmLT5UcnVlKDEsICdTS0lQOiBBZ2VudENvbGxhYm9yYXRpb25BSkFYIG1vZHVsZSBub3QgbG9hZGVkJyk7CiAgICAgICAgbGFzdCBTS0lQOwogICAgfQoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRBSkFYTW9kdWxlLAogICAgICAgICdBZ2VudENvbGxhYm9yYXRpb25BSkFYIG1vZHVsZSBsb2FkZWQnLAogICAgKTsKfQoKIyBUZXN0OiBDdXN0b21lclVzZXIgc2VhcmNoIGJ5IGVtYWlsIHdvcmtzCnsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgbXkgJUN1c3RvbWVyTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJEN1c3RvbWVyRW1haWwsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLAogICAgICAgIExpbWl0ICAgICAgICAgICAgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgc2NhbGFyIGtleXMgJUN1c3RvbWVyTGlzdCwKICAgICAgICAnQ3VzdG9tZXJTZWFyY2ggZmluZHMgY3VzdG9tZXIgYnkgZW1haWwnLAogICAgKTsKCiAgICBpZiAoJUN1c3RvbWVyTGlzdCkgewogICAgICAgIG15ICgkRm91bmRMb2dpbikgPSBrZXlzICVDdXN0b21lckxpc3Q7CiAgICAgICAgJFNlbGYtPklzKAogICAgICAgICAgICAkRm91bmRMb2dpbiwKICAgICAgICAgICAgJEN1c3RvbWVyVXNlckxvZ2luLAogICAgICAgICAgICAnRm91bmQgY3VzdG9tZXIgbG9naW4gbWF0Y2hlczogJyAuICRGb3VuZExvZ2luLAogICAgICAgICk7CiAgICB9Cn0KCiMgVGVzdDogQ3VzdG9tZXJVc2VyIGRhdGEgcmV0cmlldmFsCnsKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICVDdXN0b21lckRhdGEsCiAgICAgICAgJ0N1c3RvbWVyVXNlckRhdGFHZXQgcmV0dXJucyBkYXRhJywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEN1c3RvbWVyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICdVc2VyRW1haWwgZXhpc3RzOiAnIC4gKCRDdXN0b21lckRhdGF7VXNlckVtYWlsfSB8fCAnJyksCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRDdXN0b21lckRhdGF7VXNlckZ1bGxuYW1lfSB8fCAkQ3VzdG9tZXJEYXRhe1VzZXJGaXJzdG5hbWV9LAogICAgICAgICdVc2VyIG5hbWUgZXhpc3RzJywKICAgICk7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgQWdlbnQgVXNlciBUZXN0cwojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKJFNlbGYtPlRydWUoCiAgICAxLAogICAgJy0tLSBBZ2VudCBVc2VyIFRlc3RzIC0tLScsCik7CgojIFRlc3Q6IEZpbmQgYWdlbnQgYnkgZW1haWwgcHJlZmVyZW5jZQp7CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBHZXQgcm9vdCB1c2VyIGRhdGEKICAgIG15ICVSb290VXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJVJvb3RVc2VyLAogICAgICAgICdSb290IHVzZXIgZGF0YSByZXRyaWV2ZWQnLAogICAgKTsKCiAgICAjIEdldFVzZXJEYXRhKCkgZmFsbHMgYmFjayB0byBVc2VyTG9naW4gd2hlbmV2ZXIgbm8gVXNlckVtYWlsCiAgICAjIHByZWZlcmVuY2UgaXMgYWN0dWFsbHkgc3RvcmVkIChzZWUgS2VybmVsOjpTeXN0ZW06OlVzZXI6OkdldFVzZXJEYXRhLAogICAgIyAiaWYgKCEkUHJlZmVyZW5jZXN7VXNlckVtYWlsfSkgeyAkUHJlZmVyZW5jZXN7VXNlckVtYWlsfSA9CiAgICAjICREYXRhe1VzZXJMb2dpbn07IH0iKSAtIHJvb3QncyBsb2dpbiAocm9vdEBsb2NhbGhvc3QpIGhhcHBlbnMgdG8KICAgICMgbG9vayBsaWtlIGFuIGVtYWlsLCBidXQgdGhhdCBkb2Vzbid0IG1lYW4gYSByZWFsIFVzZXJFbWFpbAogICAgIyBwcmVmZXJlbmNlIHJvdyBleGlzdHMgdG8gZmluZC4gQ2hlY2sgdGhlIGFjdHVhbCBzdG9yZWQgcHJlZmVyZW5jZXMKICAgICMgZGlyZWN0bHkgaW5zdGVhZCBvZiB0cnVzdGluZyBHZXRVc2VyRGF0YSdzIGZhbGxiYWNrIHZhbHVlLCBvciB0aGlzCiAgICAjIGFzc2VydGlvbiBmYWlscyBmb3IgYW55IHVzZXIgcmVseWluZyBvbiB0aGF0IGZhbGxiYWNrICh3aGljaCBpcyB0aGUKICAgICMgY29tbW9uIGNhc2UsIG5vdCBhbiBlZGdlIGNhc2UpLgogICAgbXkgJVJvb3RQcmVmZXJlbmNlcyA9ICRVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcyggVXNlcklEID0+IDEgKTsKCiAgICBpZiAoICRSb290UHJlZmVyZW5jZXN7VXNlckVtYWlsfSApIHsKICAgICAgICBteSAlVXNlckxpc3QgPSAkVXNlck9iamVjdC0+U2VhcmNoUHJlZmVyZW5jZXMoCiAgICAgICAgICAgIEtleSAgID0+ICdVc2VyRW1haWwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUm9vdFByZWZlcmVuY2Vze1VzZXJFbWFpbH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgIHNjYWxhciBrZXlzICVVc2VyTGlzdCwKICAgICAgICAgICAgJ1NlYXJjaFByZWZlcmVuY2VzIGZpbmRzIHVzZXIgYnkgZW1haWw6ICcgLiAkUm9vdFByZWZlcmVuY2Vze1VzZXJFbWFpbH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAnU0tJUDogUm9vdCB1c2VyIGhhcyBubyBVc2VyRW1haWwgcHJlZmVyZW5jZSBhY3R1YWxseSBzdG9yZWQgKEdldFVzZXJEYXRhIGZhbGxzIGJhY2sgdG8gVXNlckxvZ2luLCB3aGljaCBTZWFyY2hQcmVmZXJlbmNlcyBjYW5ub3QgZmluZCknLAogICAgICAgICk7CiAgICB9Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgVGlja2V0IENvdW50IFRlc3RzCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgokU2VsZi0+VHJ1ZSgKICAgIDEsCiAgICAnLS0tIFRpY2tldCBDb3VudCBUZXN0cyAtLS0nLAopOwoKIyBUZXN0OiBUaWNrZXRTZWFyY2ggZm9yIGN1c3RvbWVyIHdvcmtzCnsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBDb3VudCB0aWNrZXRzIGZvciB0ZXN0IGN1c3RvbWVyIChzaG91bGQgYmUgMCBmb3IgbmV3IGN1c3RvbWVyKQogICAgbXkgJFRpY2tldENvdW50ID0gJFRpY2tldE9iamVjdC0+VGlja2V0U2VhcmNoKAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luUmF3ID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICBTdGF0ZVR5cGUgICAgICAgICAgICA9PiBbICduZXcnLCAnb3BlbicsICdwZW5kaW5nIHJlbWluZGVyJywgJ3BlbmRpbmcgYXV0bycgXSwKICAgICAgICBSZXN1bHQgICAgICAgICAgICAgICA9PiAnQ09VTlQnLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiAgICAgICAgICAgPT4gJ3JvJywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgZGVmaW5lZCAkVGlja2V0Q291bnQsCiAgICAgICAgJ1RpY2tldFNlYXJjaCBDT1VOVCB3b3JrcyAocmVzdWx0OiAnIC4gKCRUaWNrZXRDb3VudCAvLyAndW5kZWYnKSAuICcpJywKICAgICk7Cn0KCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMgUHJvZmlsZSBGb3JtYXQgVGVzdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gUHJvZmlsZSBGb3JtYXQgVGVzdHMgLS0tJywKKTsKCiMgVGVzdDogUHJvZmlsZSBzdHJ1Y3R1cmUgbWF0Y2hlcyBleHBlY3RlZCBmb3JtYXQKewogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXJMb2dpbiwKICAgICk7CgogICAgIyBCdWlsZCBwcm9maWxlIGluIGV4cGVjdGVkIGZvcm1hdAogICAgbXkgJVByb2ZpbGUgPSAoCiAgICAgICAgZGlzcGxheU5hbWUgICAgPT4gJEN1c3RvbWVyRGF0YXtVc2VyRnVsbG5hbWV9ICB8fCAnJywKICAgICAgICBnaXZlbk5hbWUgICAgICA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJGaXJzdG5hbWV9IHx8ICcnLAogICAgICAgIHN1cm5hbWUgICAgICAgID0+ICRDdXN0b21lckRhdGF7VXNlckxhc3RuYW1lfSAgfHwgJycsCiAgICAgICAgZW1haWwgICAgICAgICAgPT4gJEN1c3RvbWVyRGF0YXtVc2VyRW1haWx9ICAgICB8fCAnJywKICAgICAgICBqb2JUaXRsZSAgICAgICA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJUaXRsZX0gICAgIHx8ICcnLAogICAgICAgIGJ1c2luZXNzUGhvbmVzID0+ICRDdXN0b21lckRhdGF7VXNlclBob25lfSA/IFsgJEN1c3RvbWVyRGF0YXtVc2VyUGhvbmV9IF0gOiBbXSwKICAgICAgICBtb2JpbGVQaG9uZSAgICA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJNb2JpbGV9ICAgIHx8ICcnLAogICAgICAgIG9mZmljZUxvY2F0aW9uID0+ICRDdXN0b21lckRhdGF7VXNlckNpdHl9ICAgICAgfHwgJycsCiAgICApOwoKICAgICRTZWxmLT5UcnVlKAogICAgICAgICRQcm9maWxle2Rpc3BsYXlOYW1lfSB8fCAkUHJvZmlsZXtlbWFpbH0sCiAgICAgICAgJ1Byb2ZpbGUgaGFzIGRpc3BsYXlOYW1lIG9yIGVtYWlsJywKICAgICk7CgogICAgJFNlbGYtPklzKAogICAgICAgIHJlZiAkUHJvZmlsZXtidXNpbmVzc1Bob25lc30sCiAgICAgICAgJ0FSUkFZJywKICAgICAgICAnYnVzaW5lc3NQaG9uZXMgaXMgYXJyYXknLAogICAgKTsKfQoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBFZGdlIENhc2UgVGVzdHMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gRWRnZSBDYXNlIFRlc3RzIC0tLScsCik7CgojIFRlc3Q6IFVua25vd24gZW1haWwgcmV0dXJucyBtaW5pbWFsIHByb2ZpbGUgc3RydWN0dXJlCnsKICAgIG15ICRVbmtub3duRW1haWwgPSAnbm9uZXhpc3RlbnQtJyAuIHRpbWUoKSAuICdAbm93aGVyZS5pbnZhbGlkJzsKCiAgICAjIFNpbXVsYXRlIHdoYXQgdGhlIG1vZHVsZSBkb2VzCiAgICBteSAkTG9jYWxQYXJ0ID0gJFVua25vd25FbWFpbDsKICAgICRMb2NhbFBhcnQgPX4gcy9ALiokLy87CiAgICAkTG9jYWxQYXJ0ID1+IHMvWy5fLV0vIC9nOwogICAgJExvY2FsUGFydCA9IHVjZmlyc3QoJExvY2FsUGFydCk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJExvY2FsUGFydCwKICAgICAgICAnTG9jYWwgcGFydCBleHRyYWN0aW9uIHdvcmtzOiAnIC4gJExvY2FsUGFydCwKICAgICk7Cn0KCiMgVGVzdDogRW1haWwgd2l0aCBzcGVjaWFsIGNoYXJhY3RlcnMKewogICAgbXkgJFNwZWNpYWxFbWFpbCA9ICd0ZXN0LnVzZXIrdGFnQGV4YW1wbGUuY29tJzsKICAgIG15ICRMb2NhbFBhcnQgPSAkU3BlY2lhbEVtYWlsOwogICAgJExvY2FsUGFydCA9fiBzL0AuKiQvLzsKCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJExvY2FsUGFydCwKICAgICAgICAndGVzdC51c2VyK3RhZycsCiAgICAgICAgJ1NwZWNpYWwgY2hhcmFjdGVycyBwcmVzZXJ2ZWQgaW4gbG9jYWwgcGFydCcsCiAgICApOwp9CgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojIENsZWFudXAKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiRTZWxmLT5UcnVlKAogICAgMSwKICAgICctLS0gVGVzdCBDb21wbGV0ZSAtLS0nLAopOwoKMTsK</File>
    </Filelist>

    <!-- Database: Create Collaboration link type for Ticket-Appointment links -->
    <DatabaseInstall Type="post">
        <!-- Add Collaboration link type if not exists -->
        <Insert Table="link_type">
            <Data Key="name" Type="Quote">Collaboration</Data>
            <Data Key="valid_id">1</Data>
            <Data Key="create_time">current_timestamp</Data>
            <Data Key="create_by">1</Data>
            <Data Key="change_time">current_timestamp</Data>
            <Data Key="change_by">1</Data>
        </Insert>
    </DatabaseInstall>

    <DatabaseUninstall Type="pre">
        <!-- Remove Collaboration link type on uninstall -->
        <Delete Table="link_type">
            <Where Column="name" CompareType="Equal" Type="Quote">Collaboration</Where>
        </Delete>
    </DatabaseUninstall>

    <IntroInstall Type="pre" Title="Installation Information" Lang="en"><![CDATA[
        <p><strong>Thank you for installing the Znuny Collaboration Add-on!</strong></p>
        <p>This add-on integrates Microsoft 365 (Teams, Outlook, Exchange) directly into Znuny.</p>
        <p><strong>After installation:</strong></p>
        <ol>
            <li>Create an App Registration in Microsoft Entra ID</li>
            <li>Configure SysConfig settings (TenantID, ClientID)</li>
            <li>Enable desired features</li>
        </ol>
        <p>See the documentation for detailed setup instructions.</p>
    ]]></IntroInstall>
    <IntroInstall Type="pre" Title="Installationsinformationen" Lang="de"><![CDATA[
        <p><strong>Vielen Dank fuer die Installation des Znuny Collaboration Add-ons!</strong></p>
        <p>Dieses Add-on integriert Microsoft 365 (Teams, Outlook, Exchange) direkt in Znuny.</p>
        <p><strong>Nach der Installation:</strong></p>
        <ol>
            <li>App Registration in Microsoft Entra ID erstellen</li>
            <li>SysConfig-Einstellungen konfigurieren (TenantID, ClientID)</li>
            <li>Gewuenschte Features aktivieren</li>
        </ol>
        <p>Detaillierte Anleitungen finden Sie in der Dokumentation.</p>
    ]]></IntroInstall>

    <IntroUninstall Type="pre" Title="Uninstall Information" Lang="en"><![CDATA[
        <p><strong>You are about to uninstall the Collaboration Add-on.</strong></p>
        <p><em>Note:</em> No data is stored in Znuny - all collaboration data comes from Microsoft 365.</p>
    ]]></IntroUninstall>
    <IntroUninstall Type="pre" Title="Deinstallationsinformationen" Lang="de"><![CDATA[
        <p><strong>Sie sind dabei, das Collaboration Add-on zu deinstallieren.</strong></p>
        <p><em>Hinweis:</em> Es werden keine Daten in Znuny gespeichert - alle Kollaborationsdaten kommen von Microsoft 365.</p>
    ]]></IntroUninstall>

</otrs_package>
