<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>AppointmentToTicket</Name>
    <Version>11.0.3</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-10-29 09:09:36" Version="11.0.3">Added sysconfig setting to restrict object types for df screens; added hungarian translations.</ChangeLog>
    <ChangeLog Date="2025-02-26 13:31:20" Version="11.0.2">- Add CustomerKey for TicketCreation.
- Translations &amp; OTOBO Updates.</ChangeLog>
    <ChangeLog Date="2024-04-02 13:31:38" Version="11.0.1">Initial Release on OTOBO 11.</ChangeLog>
    <Description Lang="en">This package brings the functionality to automatically create a ticket with configurable parameters to a freely chooseable point in time in relation to an appointment.</Description>
    <Description Lang="hu">Ez a csomag azt a funkciót adja hozzá, hogy automatikusan létre lehessen hozni egy beállítható paraméterekkel rendelkező jegyet egy szabadon választható időpontra egy naptáridőponttal kapcsolatban.</Description>
    <Framework>11.0.x</Framework>
    <CodeUninstall Type="pre">

        # create the package name
        my $CodeModule = 'var::packagesetup::AppointmentToTicket';

        $Kernel::OM-&gt;Get($CodeModule)-&gt;CodeUninstall();
    </CodeUninstall>
    <BuildCommitID>59770d26e9d0dfe776d0b7252571ac698f743d13</BuildCommitID>
    <BuildDate>2026-10-29 09:09:40</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AgentAppointmentEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBlNDRjMThhZWE5YWJjMTI1ZmRkZjljZWVlZDIwNGRiNGZhYjI5MGUwIC0gS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50QXBwb2ludG1lbnRFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ID0gJy0nOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICk7CgogICAgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyAkRHluYW1pY0ZpZWxkTGlzdCAvLyBbXSB9OwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpLT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIG1ldGhvZHMgd2hpY2ggYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIHN0YW5kYXJkIGZpZWxkcwogICAgJFNlbGYtPntGaWVsZE1ldGhvZHN9ID0gWwogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnRGVzdCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VG9zCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTdGF0ZXMKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgRmllbGRJRCA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0UHJpb3JpdGllcwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBGaWVsZElEID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBNZXRob2QgID0+IFwmX0dldFNlcnZpY2VzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1NMQUlEJywKICAgICAgICAgICAgTWV0aG9kICA9PiBcJl9HZXRTTEFzCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEZpZWxkSUQgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgIE1ldGhvZCAgPT4gXCZfR2V0VHlwZXMKICAgICAgICB9LAogICAgXTsKCiAgICAjIGRlcGVuZGFuY2llcyBvZiBzdGFuZGFyZCBmaWVsZHMgd2hpY2ggYXJlIG5vdCBkZWZpbmVkIHZpYSBBQ0xzCiAgICAkU2VsZi0+e0ludGVybmFsRGVwZW5kYW5jeX0gPSB7CiAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgU0xBSUQgICAgID0+IDEsCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAxLCAgICAjQ3VzdG9tZXJVc2VyIHVwZGF0ZXMgY2FuIGJlIHN1Ym1pdHRlZCBhcyBFbGVtZW50Q2hhbmdlZDogU2VydmljZUlECiAgICAgICAgfSwKICAgICAgICBDdXN0b21lclVzZXIgPT4gewogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwKICAgICAgICB9LAogICAgfTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgbmFtZXMgb2YgYWxsIHBhcmFtZXRlcnMKICAgIG15IEBQYXJhbU5hbWVzID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbU5hbWVzKCk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBQQVJBTU5BTUU6CiAgICBmb3IgbXkgJEtleSAoQFBhcmFtTmFtZXMpIHsKCiAgICAgICAgIyBza2lwIHRoZSBBY3Rpb24gcGFyYW1ldGVyLCBpdCdzIGdpdmluZyBCdWlsZERhdGVTZWxlY3Rpb24gcHJvYmxlbXMgZm9yIHNvbWUgcmVhc29uCiAgICAgICAgbmV4dCBQQVJBTU5BTUUgaWYgJEtleSBlcSAnQWN0aW9uJzsKCiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwoKICAgICAgICBteSAlU2FmZUdldFBhcmFtID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5TYWZldHkoCiAgICAgICAgICAgIFN0cmluZyAgICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgIE5vQXBwbGV0ICAgICA9PiAxLAogICAgICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICAgICAgTm9FbWJlZCAgICAgID0+IDEsCiAgICAgICAgICAgIE5vU1ZHICAgICAgICA9PiAxLAogICAgICAgICAgICBOb0ltZyAgICAgICAgPT4gMSwKICAgICAgICAgICAgTm9JbnRTcmNMb2FkID0+IDEsCiAgICAgICAgICAgIE5vRXh0U3JjTG9hZCA9PiAxLAogICAgICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkU2FmZUdldFBhcmFte1N0cmluZ307CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgaGFzaCBmb3IgY2hlY2sgZHVwbGljYXRlZCBlbnRyaWVzCiAgICBteSAlQWRkcmVzc2VzTGlzdDsKCiAgICAjIE11bHRpcGxlQ3VzdG9tZXIgRnJvbS1maWVsZAogICAgbXkgQE11bHRpcGxlQ3VzdG9tZXI7CiAgICBteSAkQ3VzdG9tZXJzTnVtYmVyID0gJEdldFBhcmFteydDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXInfSB8fCAwOwogICAgIyBDb250YWlucyB1c2VyIG5hbWUKICAgIG15ICRTZWxlY3RlZCA9ICRHZXRQYXJhbXsnQ3VzdG9tZXJTZWxlY3RlZCd9IHx8ICcnOwoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgIGlmICgkQ3VzdG9tZXJzTnVtYmVyKSB7CiAgICAgICAgbXkgJEN1c3RvbWVyQ291bnRlciA9IDE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDAgLi4uICRDdXN0b21lcnNOdW1iZXIgKSB7CiAgICAgICAgICAgIG15ICRDdXN0b21lckVsZW1lbnQgID0gJEdldFBhcmFteydDdXN0b21lclRpY2tldFRleHRfJyAuICRDb3VudH07CiAgICAgICAgICAgIG15ICRDdXN0b21lclNlbGVjdGVkID0gJFNlbGVjdGVkID09ICRDb3VudCA/ICdjaGVja2VkPSJjaGVja2VkIicgOiAnJzsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyS2V5ICAgICAgPSAkR2V0UGFyYW17J0N1c3RvbWVyS2V5XycgLiAkQ291bnR9IHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRDdXN0b21lckVsZW1lbnQpIHsKCiAgICAgICAgICAgICAgICBteSAkQ291bnRBdXggICAgICAgICA9ICRDdXN0b21lckNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckVycm9yICAgID0gJyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJFcnJvck1zZyA9ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJEaXNhYmxlZCA9ICcnOwoKICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte0Zyb219ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSAuPSAnLCAnIC4gJEN1c3RvbWVyRWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtGcm9tfSA9ICRDdXN0b21lckVsZW1lbnQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBlbWFpbCBhZGRyZXNzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEVtYWlsICggTWFpbDo6QWRkcmVzcy0+cGFyc2UoJEN1c3RvbWVyRWxlbWVudCkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBZGRyZXNzZXNMaXN0eyRDdXN0b21lckVsZW1lbnR9ICYmICRDdXN0b21lckVycm9yIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckVycm9yTXNnID0gJ0lzRHVwbGljYXRlZFNlcnZlckVycm9yTXNnJzsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJFcnJvciAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJFcnJvciBuZSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJEaXNhYmxlZCA9ICdkaXNhYmxlZD0iZGlzYWJsZWQiJzsKICAgICAgICAgICAgICAgICAgICAkQ291bnRBdXggICAgICAgICA9ICRDb3VudCAuICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICA9PiAkQ291bnRBdXgsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFbGVtZW50ICA9PiAkQ3VzdG9tZXJFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyU2VsZWN0ZWQgPT4gJEN1c3RvbWVyU2VsZWN0ZWQsCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJLZXkgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJFcnJvciAgICA9PiAkQ3VzdG9tZXJFcnJvciwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICRDdXN0b21lckVycm9yTXNnLAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRGlzYWJsZWQgPT4gJEN1c3RvbWVyRGlzYWJsZWQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJEFkZHJlc3Nlc0xpc3R7JEN1c3RvbWVyRWxlbWVudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCIpOwogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6RmllbGRSZXN0cmljdGlvbnMnKTsKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDYWxlbmRhck9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcicpOwogICAgbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwogICAgbXkgJFBsdWdpbk9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpQbHVnaW4nKTsKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoIERhdGEgPT4gW10gKTsKCiAgICBteSAlUGVybWlzc2lvbkxldmVsID0gKAogICAgICAgICdybycgICAgICAgID0+IDEsCiAgICAgICAgJ21vdmVfaW50bycgPT4gMiwKICAgICAgICAnY3JlYXRlJyAgICA9PiAzLAogICAgICAgICdub3RlJyAgICAgID0+IDQsCiAgICAgICAgJ293bmVyJyAgICAgPT4gNSwKICAgICAgICAncHJpb3JpdHknICA9PiA2LAogICAgICAgICdydycgICAgICAgID0+IDcsCiAgICApOwoKICAgIG15ICRQZXJtaXNzaW9ucyA9ICdydyc7CgojUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZm9yIFBhcmFtT2JqZWN0CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwoKICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJFNlbGYtPntEeW5hbWljRmllbGR9LT4lKiApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbnZlcnQgZHluYW1pYyBmaWVsZCB2YWx1ZXMgaW50byBhIHN0cnVjdHVyZSBmb3IgQUNMcwogICAgbXkgJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIHNvcnQga2V5cyAlRHluYW1pY0ZpZWxkVmFsdWVzICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CgogICAgICAgICREeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkIH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGR9OwogICAgfQogICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSBcJUR5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnM7CiNFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjawogICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZWRpdCBtYXNrCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdE1hc2snICkgewoKICAgICAgICAjIGdldCBhbGwgdXNlcidzIHZhbGlkIGNhbGVuZGFycwogICAgICAgIG15ICRWYWxpZElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTG9va3VwKAogICAgICAgICAgICBWYWxpZCA9PiAndmFsaWQnLAogICAgICAgICk7CiAgICAgICAgbXkgQENhbGVuZGFycyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJMaXN0KAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICApOwoKICAgICAgICAjIHRyYW5zZm9ybSBkYXRhIGZvciBzZWxlY3QgYm94CiAgICAgICAgbXkgQENhbGVuZGFyRGF0YSA9IG1hcCB7CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICRfLT57Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkXy0+e0NhbGVuZGFyTmFtZX0sCiAgICAgICAgICAgIH0KICAgICAgICB9IEBDYWxlbmRhcnM7CgogICAgICAgICMgdHJhbnNmb3JtIGRhdGEgZm9yIElEIGxvb2t1cAogICAgICAgIG15ICVDYWxlbmRhckxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57Q2FsZW5kYXJJRH0gPT4gJF8tPntDYWxlbmRhck5hbWV9CiAgICAgICAgfSBAQ2FsZW5kYXJzOwoKICAgICAgICBmb3IgbXkgJENhbGVuZGFyIChAQ2FsZW5kYXJEYXRhKSB7CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgIG15ICRDYWxlbmRhclBlcm1pc3Npb24gPSAkQ2FsZW5kYXJPYmplY3QtPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFyLT57S2V5fSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkxldmVseyRDYWxlbmRhclBlcm1pc3Npb259IDwgMyApIHsKCiAgICAgICAgICAgICAgICAjIHBlcm1pc3Npb25zIDwgY3JlYXRlCiAgICAgICAgICAgICAgICAkQ2FsZW5kYXItPntEaXNhYmxlZH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSB5ZWFyIGJvdW5kYXJpZXMKICAgICAgICBteSAoICVZZWFyUGVyaW9kUGFzdCwgJVllYXJQZXJpb2RGdXR1cmUgKTsKICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyAoU3RhcnQgRW5kIFJlY3VycmVuY2VVbnRpbCkpIHsKICAgICAgICAgICAgJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gPSAkWWVhclBlcmlvZEZ1dHVyZXskRmllbGR9ID0gNTsKICAgICAgICB9CgogICAgICAgICMgZG8gbm90IHVzZSBkYXRlIHNlbGVjdGlvbiB0aW1lIHpvbmUgY2FsY3VsYXRpb24gYnkgZGVmYXVsdAogICAgICAgIG15ICRPdmVycmlkZVRpbWVab25lID0gMTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50OwogICAgICAgIGlmICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG5vbi1leGlzdGVudCBhcHBvaW50bWVudAogICAgICAgICAgICBpZiAoICEkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0FwcG9pbnRtZW50IG5vdCBmb3VuZCEnKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVzZSB0aW1lIHpvbmUgY2FsY3VsYXRpb24gaWYgZWRpdGluZyBleGlzdGluZyBhcHBvaW50bWVudHMKICAgICAgICAgICAgIyBidXQgb25seSBpZiBub3QgZGVhbGluZyB3aXRoIGFuIGFsbCBkYXkgYXBwb2ludG1lbnQKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3ZlcnJpZGVUaW1lWm9uZSA9ICRBcHBvaW50bWVudHtBbGxEYXl9IHx8IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICAgICAgJFBlcm1pc3Npb25zID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhclBlcm1pc3Npb25HZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBHZXQgc3RhcnQgdGltZSBjb21wb25lbnRzLgogICAgICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lU2V0dGluZ3MgPSAkU3RhcnRUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZUNvbXBvbmVudHM7CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFN0YXJ0VGltZVNldHRpbmdzfSApIHsKICAgICAgICAgICAgICAgICRTdGFydFRpbWVDb21wb25lbnRzLT57IlN0YXJ0JEtleSJ9ID0gJFN0YXJ0VGltZVNldHRpbmdzLT57JEtleX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGVuZCB0aW1lIGNvbXBvbmVudHMuCiAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgRW5kIHRpbWVzIGZvciBhbGwgZGF5IGFwcG9pbnRtZW50cyBhcmUgaW5jbHVzaXZlLCBzdWJ0cmFjdCB3aG9sZSBkYXkuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e0FsbERheX0gKSB7CiAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEVuZFRpbWVPYmplY3QgPCAkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEVuZFRpbWVTZXR0aW5ncyA9ICRFbmRUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWVDb21wb25lbnRzOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRFbmRUaW1lU2V0dGluZ3N9ICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVDb21wb25lbnRzLT57IkVuZCRLZXkifSA9ICRFbmRUaW1lU2V0dGluZ3MtPnskS2V5fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gKCAlQXBwb2ludG1lbnQsICV7JFN0YXJ0VGltZUNvbXBvbmVudHN9LCAleyRFbmRUaW1lQ29tcG9uZW50c30gKTsKCiAgICAgICAgICAgICMgR2V0IHJlY3VycmVuY2UgdW50aWwgY29tcG9uZW50cy4KICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsU2V0dGluZ3MgPSAkUmVjdXJyZW5jZVVudGlsVGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsQ29tcG9uZW50czsKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEVuZFRpbWVTZXR0aW5nc30gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbENvbXBvbmVudHMtPnsiUmVjdXJyZW5jZVVudGlsJEtleSJ9ID0gJFJlY3VycmVuY2VVbnRpbFNldHRpbmdzLT57JEtleX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gKCAlQXBwb2ludG1lbnQsICV7JFJlY3VycmVuY2VVbnRpbENvbXBvbmVudHN9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgeWVhciBib3VuZGFyaWVzIGZvciBidWlsZCBzZWxlY3Rpb24gbWV0aG9kLgogICAgICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgICAgICBteSAkRGF0ZVRpbWVTZXR0aW5ncyA9ICREYXRlVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhTdGFydCBFbmQgUmVjdXJyZW5jZVVudGlsKSkgewogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7IiR7RmllbGR9WWVhciJ9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICREaWZmID0gJEFwcG9pbnRtZW50eyIke0ZpZWxkfVllYXIifSAtICREYXRlVGltZVNldHRpbmdzLT57WWVhcn07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGlmZiA+IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFllYXJQZXJpb2RGdXR1cmV7JEZpZWxkfSA9IGFicyAkRGlmZjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRGlmZiA8IDAgJiYgYWJzICREaWZmID4gJFllYXJQZXJpb2RQYXN0eyRGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRZZWFyUGVyaW9kUGFzdHskRmllbGR9ID0gYWJzICREaWZmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVHlwZSA9ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VUeXBlfTsKCiAgICAgICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERheU9mZnNldCA9ICRTZWxmLT5fRGF5T2Zmc2V0R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lID0+ICRBcHBvaW50bWVudHtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17RGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0RheXN9ID0gJEdldFBhcmFte0RheXN9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERheSAoQERheXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ICs9ICREYXlPZmZzZXQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERheSA9PSA4ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtEYXlzfSA9IGpvaW4oICIsIiwgQERheXMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoRGF5c30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoRGF5c30gPSAkR2V0UGFyYW17TW9udGhEYXlzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZWxlY3RlZCBkYXlzIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkRGF5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE1vbnRoRGF5IChATW9udGhEYXlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE1vbnRoRGF5ICs9ICREYXlPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkRGF0ZVRpbWVTZXR0aW5ncy0+e0RheX0gPT0gMzIgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRNb250aERheSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9ID0gam9pbiggIiwiLCBATW9udGhEYXlzICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVjdXJyZW5jZVR5cGUgZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXlPZmZzZXQgPSAkU2VsZi0+X0RheU9mZnNldEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte01vbnRoc30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSAkR2V0UGFyYW17TW9udGhzfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aHMgPSBAeyAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKICAgICAgICAgICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e01vbnRoc30gPSBqb2luKCAiLCIsIEBNb250aHMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgZGVhbGluZyB3aXRoIHRpY2tldCBhcHBvaW50bWVudC4KICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldElEfSA9ICRDYWxlbmRhck9iamVjdC0+VGlja2V0QXBwb2ludG1lbnRUaWNrZXRJRCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbXkgJFJ1bGUgPSAkQ2FsZW5kYXJPYmplY3QtPlRpY2tldEFwcG9pbnRtZW50UnVsZUdldCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBSdWxlSUQgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgR2V0IGRhdGUgdHlwZXMgZnJvbSB0aGUgdGlja2V0IGFwcG9pbnRtZW50IHJ1bGUuCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRSdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFN0YXJ0RGF0ZSBFbmREYXRlKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUnVsZS0+eyRUeXBlfSBlcSAnRmlyc3RSZXNwb25zZVRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnVXBkYXRlVGltZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRSdWxlLT57JFR5cGV9IGVxICdTb2x1dGlvblRpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkUnVsZS0+eyRUeXBlfSBlcSAnUGVuZGluZ1RpbWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seVN0YXJ0fSAgICA9IDEgaWYgJFR5cGUgZXEgJ1N0YXJ0RGF0ZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVhZE9ubHlEdXJhdGlvbn0gPSAxIGlmICRUeXBlIGVxICdFbmREYXRlJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRSdWxlLT57JFR5cGV9ID1+IC9eUGx1c19bMC05XSskLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWFkT25seUR1cmF0aW9ufSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlbGVjdGVkIHRpbWVzdGFtcAogICAgICAgIG15ICRTZWxlY3RlZFRpbWVzdGFtcCA9IHNwcmludGYoCiAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydFllYXJ9ICAvLyAkR2V0UGFyYW17U3RhcnRZZWFyfSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9IC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgIC8vICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICApOwoKICAgICAgICAjIEdldCBjdXJyZW50IGRhdGUgY29tcG9uZW50cy4KICAgICAgICBteSAkU2VsZWN0ZWRTeXN0ZW1UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFNlbGVjdGVkVGltZXN0YW1wLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJFNlbGVjdGVkU3lzdGVtVGltZVNldHRpbmdzID0gJFNlbGVjdGVkU3lzdGVtVGltZU9iamVjdC0+R2V0KCk7CgogICAgICAgICMgU2V0IGN1cnJlbnQgZGF0ZSBjb21wb25lbnRzIGlmIG5vdCBkZWZpbmVkLgogICAgICAgICRBcHBvaW50bWVudHtEYXlzfSAgICAgIC8vPSAkU2VsZWN0ZWRTeXN0ZW1UaW1lU2V0dGluZ3MtPntEYXlPZldlZWt9OwogICAgICAgICRBcHBvaW50bWVudHtNb250aERheXN9IC8vPSAkU2VsZWN0ZWRTeXN0ZW1UaW1lU2V0dGluZ3MtPntEYXl9OwogICAgICAgICRBcHBvaW50bWVudHtNb250aHN9ICAgIC8vPSAkU2VsZWN0ZWRTeXN0ZW1UaW1lU2V0dGluZ3MtPntNb250aH07CgogICAgICAgICMgY2FsZW5kYXIgSUQgc2VsZWN0aW9uCiAgICAgICAgbXkgJENhbGVuZGFySUQgPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gLy8gJEdldFBhcmFte0NhbGVuZGFySUR9OwoKICAgICAgICAjIGNhbGVuZGFyIG5hbWUKICAgICAgICBpZiAoJENhbGVuZGFySUQpIHsKICAgICAgICAgICAgJFBhcmFte0NhbGVuZGFyTmFtZX0gPSAkQ2FsZW5kYXJMb29rdXB7JENhbGVuZGFySUR9OwogICAgICAgIH0KCiAgICAgICAgIyBjYWxlbmRhciBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Q2FsZW5kYXJJRFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDYWxlbmRhcklELAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NhbGVuZGFySUQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgVmFsaWRhdGVfUmVxdWlyZWQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGFsbCBkYXkKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9IHx8CiAgICAgICAgICAgICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICYmICRBcHBvaW50bWVudHtBbGxEYXl9ICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0FsbERheVN0cmluZ30gID0gVHJhbnNsYXRhYmxlKCdZZXMnKTsKICAgICAgICAgICAgJFBhcmFte0FsbERheUNoZWNrZWR9ID0gJ2NoZWNrZWQgJzsKCiAgICAgICAgICAgICMgc3RhcnQgZGF0ZQogICAgICAgICAgICAkUGFyYW17U3RhcnREYXRlfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0WWVhcn0gIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9IC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtTdGFydERheX0gICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBlbmQgZGF0ZQogICAgICAgICAgICAkUGFyYW17RW5kRGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkIiwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtFbmRZZWFyfSAgLy8gJEdldFBhcmFte0VuZFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZE1vbnRofSAvLyAkR2V0UGFyYW17RW5kTW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZERheX0gICAvLyAkR2V0UGFyYW17RW5kRGF5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtBbGxEYXlTdHJpbmd9ICA9IFRyYW5zbGF0YWJsZSgnTm8nKTsKICAgICAgICAgICAgJFBhcmFte0FsbERheUNoZWNrZWR9ID0gJyc7CgogICAgICAgICAgICAjIHN0YXJ0IGRhdGUKICAgICAgICAgICAgJFBhcmFte1N0YXJ0RGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TW9udGh9ICAvLyAkR2V0UGFyYW17U3RhcnRNb250aH0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnREYXl9ICAgIC8vICRHZXRQYXJhbXtTdGFydERheX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAgIC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1N0YXJ0TWludXRlfSAvLyAkR2V0UGFyYW17U3RhcnRNaW51dGV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBlbmQgZGF0ZQogICAgICAgICAgICAkUGFyYW17RW5kRGF0ZX0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kWWVhcn0gICAvLyAkR2V0UGFyYW17RW5kWWVhcn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTW9udGh9ICAvLyAkR2V0UGFyYW17RW5kTW9udGh9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e0VuZERheX0gICAgLy8gJEdldFBhcmFte0VuZERheX0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kSG91cn0gICAvLyAkR2V0UGFyYW17RW5kSG91cn0sCiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7RW5kTWludXRlfSAvLyAkR2V0UGFyYW17RW5kTWludXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc3RhcnQgZGF0ZSBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhcnREYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgICA9PiAnU3RhcnQnLAogICAgICAgICAgICBTdGFydEhvdXIgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0SG91cn0gICAvLyAkR2V0UGFyYW17U3RhcnRIb3VyfSwKICAgICAgICAgICAgU3RhcnRNaW51dGUgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtTdGFydE1pbnV0ZX0gLy8gJEdldFBhcmFte1N0YXJ0TWludXRlfSwKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQmVmb3JlUHJlZml4ID0+ICdFbmQnLAogICAgICAgICAgICBWYWxpZGF0ZSAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSAmJiAkR2V0UGFyYW17UmVhZE9ubHlTdGFydH0gPyAwIDogMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtTdGFydH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGVuZCBkYXRlIHN0cmluZwogICAgICAgICRQYXJhbXtFbmREYXRlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIFByZWZpeCAgICAgICAgICAgICAgICAgID0+ICdFbmQnLAogICAgICAgICAgICBFbmRIb3VyICAgICAgICAgICAgICAgICA9PiAkQXBwb2ludG1lbnR7RW5kSG91cn0gICAvLyAkR2V0UGFyYW17RW5kSG91cn0sCiAgICAgICAgICAgIEVuZE1pbnV0ZSAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtFbmRNaW51dGV9IC8vICRHZXRQYXJhbXtFbmRNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFZhbGlkYXRlRGF0ZUFmdGVyUHJlZml4ID0+ICdTdGFydCcsCiAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gJiYgJEdldFBhcmFte1JlYWRPbmx5RHVyYXRpb259ID8gMCA6IDEsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtFbmR9LAogICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlICAgICAgICA9PiAkWWVhclBlcmlvZEZ1dHVyZXtFbmR9LAogICAgICAgICAgICBPdmVycmlkZVRpbWVab25lICAgICAgICA9PiAkT3ZlcnJpZGVUaW1lWm9uZSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBtYWluIG9iamVjdAogICAgICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICAgICAgIyBjaGVjayBpZiB0ZWFtIG9iamVjdCBpcyByZWdpc3RlcmVkCiAgICAgICAgaWYgKCAkTWFpbk9iamVjdC0+UmVxdWlyZSggJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScsIFNpbGVudCA9PiAxICkgKSB7CgogICAgICAgICAgICBteSAkVGVhbUlEcyA9ICRBcHBvaW50bWVudHtUZWFtSUR9OwogICAgICAgICAgICBpZiAoICEkVGVhbUlEcyApIHsKICAgICAgICAgICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgICAgICAgICAgJFRlYW1JRHMgPSBcQFRlYW1JRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRSZXNvdXJjZUlEcyA9ICRBcHBvaW50bWVudHtSZXNvdXJjZUlEfTsKICAgICAgICAgICAgaWYgKCAhJFJlc291cmNlSURzICkgewogICAgICAgICAgICAgICAgbXkgQFJlc291cmNlSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgICAgICRSZXNvdXJjZUlEcyA9IFxAUmVzb3VyY2VJRHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICAgICAgICAgIG15ICRUZWFtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpUZWFtJyk7CiAgICAgICAgICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICAgICAgICAgICMgZ2V0IGFsbG93ZWQgdGVhbSBsaXN0IGZvciBjdXJyZW50IHVzZXIKICAgICAgICAgICAgbXkgJVRlYW1MaXN0ID0gJFRlYW1PYmplY3QtPkFsbG93ZWRUZWFtTGlzdCgKICAgICAgICAgICAgICAgIFByZXZlbnRFbXB0eSA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgdGVhbSBuYW1lcwogICAgICAgICAgICBteSBAVGVhbU5hbWVzOwogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAVGVhbU5hbWVzLCAkVGVhbUxpc3R7JFRlYW1JRH0gaWYgJFRlYW1MaXN0eyRUZWFtSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBUZWFtTmFtZXMgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VGVhbU5hbWVzfSA9IGpvaW4oICc8YnI+JywgQFRlYW1OYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1RlYW1OYW1lc30gPSAkU2VsZi0+e0VtcHR5U3RyaW5nfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0ZWFtIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtUZWFtSURTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlVGVhbUxpc3QsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFRlYW1JRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RlYW1JRCcsCiAgICAgICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpdGVyYXRlIHRocm91Z2ggc2VsZWN0ZWQgdGVhbXMKICAgICAgICAgICAgbXkgJVRlYW1Vc2VyTGlzdEFsbDsKICAgICAgICAgICAgVEVBTUlEOgogICAgICAgICAgICBmb3IgbXkgJFRlYW1JRCAoIEB7JFRlYW1JRHN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVzb3VyY2UgbmFtZXMKICAgICAgICAgICAgbXkgQFJlc291cmNlTmFtZXM7CiAgICAgICAgICAgIGZvciBteSAkUmVzb3VyY2VJRCAoIEB7JFJlc291cmNlSURzfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFJlc291cmNlTmFtZXMsICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9IGlmICRUZWFtVXNlckxpc3RBbGx7JFJlc291cmNlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggc2NhbGFyIEBSZXNvdXJjZU5hbWVzICkgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gam9pbiggJzxicj4nLCBAUmVzb3VyY2VOYW1lcyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFBhcmFte1Jlc291cmNlTmFtZXN9ID0gJFNlbGYtPntFbXB0eVN0cmluZ307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgdGVhbSB1c2VyIGxpc3Qgc3RyaW5nCiAgICAgICAgICAgICRQYXJhbXtSZXNvdXJjZUlEU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVRlYW1Vc2VyTGlzdEFsbCwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUmVzb3VyY2VJRHMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Jlc291cmNlSUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gMDsKICAgICAgICBteSAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSA9ICdDdXN0b21EYWlseSc7ICAgICMgZGVmYXVsdAoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewoKICAgICAgICAgICAgIyBmcm9tIGFwcG9pbnRtZW50CiAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID0gJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSB8fCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVR5cGV9OwogICAgICAgICAgICBpZiAoICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlID1+IC9DdXN0b20vICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZTsKICAgICAgICAgICAgICAgICRTZWxlY3RlZFJlY3VycmVuY2VUeXBlICAgICAgID0gJ0N1c3RvbSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVjdXJyZW5jZSB0eXBlCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdOZXZlcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGFpbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBEYXknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1dlZWtseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0V2ZXJ5IFdlZWsnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ01vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdFdmVyeSBNb250aCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnWWVhcmx5JywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRXZlcnkgWWVhcicpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlUmVjdXJyZW5jZVR5cGVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBSZWN1cnJlbmNlVHlwZXM7CiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VWYWx1ZX0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZUxvb2t1cHskU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIHR5cGUgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlU3RyaW5nfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBSZWN1cnJlbmNlVHlwZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlVHlwZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBjdXN0b20gdHlwZQogICAgICAgIG15IEBSZWN1cnJlbmNlQ3VzdG9tVHlwZXMgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21EYWlseScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ0RhaWx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21XZWVrbHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdXZWVrbHknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbU1vbnRobHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdNb250aGx5JyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21ZZWFybHknLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gVHJhbnNsYXRhYmxlKCdZZWFybHknKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVSZWN1cnJlbmNlQ3VzdG9tVHlwZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFJlY3VycmVuY2VDdXN0b21UeXBlczsKICAgICAgICBteSAkUmVjdXJyZW5jZUN1c3RvbVR5cGUgPSAkUmVjdXJyZW5jZUN1c3RvbVR5cGVMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgIGxjICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICApIGlmICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJzsKCiAgICAgICAgIyByZWN1cnJlbmNlIGN1c3RvbSB0eXBlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcQFJlY3VycmVuY2VDdXN0b21UeXBlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkU2VsZWN0ZWRSZWN1cnJlbmNlQ3VzdG9tVHlwZSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnUmVjdXJyZW5jZUN1c3RvbVR5cGUnLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBpbnRlcnZhbAogICAgICAgIG15ICRTZWxlY3RlZEludGVydmFsID0gJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gfHwgMTsKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICkgewogICAgICAgICAgICBteSAlUmVjdXJyZW5jZUludGVydmFsTG9va3VwID0gKAogICAgICAgICAgICAgICAgJ0N1c3RvbURhaWx5JyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2RheShzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVdlZWtseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd3ZWVrKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAnQ3VzdG9tTW9udGhseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdtb250aChzKScsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJ0N1c3RvbVllYXJseScgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd5ZWFyKHMpJywKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRSZWN1cnJlbmNlQ3VzdG9tVHlwZSAmJiAkU2VsZWN0ZWRSZWN1cnJlbmNlVHlwZSBlcSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcKICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZXZlcnknKQogICAgICAgICAgICAgICAgICAgIC4gJyAnIC4gJEFwcG9pbnRtZW50e1JlY3VycmVuY2VJbnRlcnZhbH0gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRSZWN1cnJlbmNlSW50ZXJ2YWxMb29rdXB7JFNlbGVjdGVkUmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBpbnRlcnZhbCBzZWxlY3Rpb24gKDEtMzEpCiAgICAgICAgbXkgQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbDsKICAgICAgICBmb3IgKCBteSAkRGF5TnVtYmVyID0gMTsgJERheU51bWJlciA8IDMyOyAkRGF5TnVtYmVyKysgKSB7CiAgICAgICAgICAgIHB1c2ggQFJlY3VycmVuY2VDdXN0b21JbnRlcnZhbCwgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJERheU51bWJlciwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICREYXlOdW1iZXIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWxTdHJpbmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXEBSZWN1cnJlbmNlQ3VzdG9tSW50ZXJ2YWwsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGVjdGVkSW50ZXJ2YWwsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1JlY3VycmVuY2VJbnRlcnZhbCcsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGxpbWl0CiAgICAgICAgbXkgJFJlY3VycmVuY2VMaW1pdCA9IDE7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUNvdW50fSApIHsKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdCA9IDI7CgogICAgICAgICAgICBpZiAoJFNlbGVjdGVkUmVjdXJyZW5jZVR5cGUpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgJ2ZvciAlcyB0aW1lKHMpJywgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmVuY2UgbGltaXQgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VMaW1pdFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBUcmFuc2xhdGFibGUoJ3VudGlsIC4uLicpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAyLAogICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnZm9yIC4uLiB0aW1lKHMpJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFJlY3VycmVuY2VMaW1pdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdSZWN1cnJlbmNlTGltaXQnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsRGlmZlRpbWUgPSAwOwogICAgICAgIGlmICggISRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAgICAgIyBHZXQgY3VycmVudCBhbmQgc3RhcnQgdGltZSBmb3IgZGlmZmVyZW5jZS4KICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWUgICAgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFllYXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRZZWFyfSAgIC8vICRHZXRQYXJhbXtTdGFydFllYXJ9LAogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAkQXBwb2ludG1lbnR7U3RhcnRNb250aH0gIC8vICRHZXRQYXJhbXtTdGFydE1vbnRofSwKICAgICAgICAgICAgICAgICAgICBEYXkgICAgPT4gJEFwcG9pbnRtZW50e1N0YXJ0RGF5fSAgICAvLyAkR2V0UGFyYW17U3RhcnREYXl9LAogICAgICAgICAgICAgICAgICAgIEhvdXIgICA9PiAkQXBwb2ludG1lbnR7U3RhcnRIb3VyfSAgIC8vICRHZXRQYXJhbXtTdGFydEhvdXJ9LAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiAkQXBwb2ludG1lbnR7U3RhcnRNaW51dGV9IC8vICRHZXRQYXJhbXtTdGFydE1pbnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kID0+IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU3RhcnRUaW1lID0gJFN0YXJ0VGltZU9iamVjdC0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgJFJlY3VycmVuY2VVbnRpbERpZmZUaW1lID0gJFN0YXJ0VGltZSAtICRTeXN0ZW1UaW1lICsgNjAgKiA2MCAqIDI0ICogMzsgICAgIyBzdGFydCArMyBkYXlzCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQiLAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbFllYXJ9LAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbE1vbnRofSwKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtSZWN1cnJlbmNlVW50aWxEYXl9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCRTZWxlY3RlZFJlY3VycmVuY2VUeXBlKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVZhbHVlfSAuPSAnLCAnIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICd1bnRpbCAlcycsICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWN1cnJlbmNlIHVudGlsIGRhdGUgc3RyaW5nCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbFN0cmluZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICA9PiAnUmVjdXJyZW5jZVVudGlsJywKICAgICAgICAgICAgRm9ybWF0ICAgICAgICAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgICAgIERpZmZUaW1lICAgICAgICAgICAgICAgID0+ICRSZWN1cnJlbmNlVW50aWxEaWZmVGltZSwKICAgICAgICAgICAgVmFsaWRhdGVEYXRlQWZ0ZXJQcmVmaXggPT4gJ1N0YXJ0JywKICAgICAgICAgICAgVmFsaWRhdGUgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIE92ZXJyaWRlVGltZVpvbmUgICAgICAgID0+ICRPdmVycmlkZVRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIHRlbXBsYXRlCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvblRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyBub3RpZmljYXRpb24nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzkwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMTUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDMwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczNjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzQzMjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMTIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzg2NDAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxNzI4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzYwNDgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyB3ZWVrIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvblRlbXBsYXRlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBATm90aWZpY2F0aW9uVGVtcGxhdGVzOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvblRlbXBsYXRlID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvblRlbXBsYXRlfSB8fCAnMCc7CiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvblZhbHVlfSA9ICROb3RpZmljYXRpb25UZW1wbGF0ZUxvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgICAgICMgbm90aWZpY2F0aW9uIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25TdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBOb3RpZmljYXRpb25UZW1wbGF0ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25UZW1wbGF0ZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOb3RpZmljYXRpb25UZW1wbGF0ZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cwogICAgICAgIG15IEBOb3RpZmljYXRpb25DdXN0b21Vbml0cyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ21pbnV0ZXMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdtaW51dGUocyknKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2hvdXJzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnaG91cihzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnZGF5cycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2RheShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJU5vdGlmaWNhdGlvbkN1c3RvbVVuaXRMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0czsKICAgICAgICBteSAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0ID0gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0gfHwgJ21pbnV0ZXMnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVVuaXRzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxATm90aWZpY2F0aW9uQ3VzdG9tVW5pdHMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCcsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lCiAgICAgICAgbXkgQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUgPSAoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdiZWZvcmVzdGFydCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgc3RhcnRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcnN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYWZ0ZXIgdGhlIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN0YXJ0ZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZWVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2JlZm9yZSB0aGUgYXBwb2ludG1lbnQgZW5kcycpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYWZ0ZXJlbmQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gZW5kZWQnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICVOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWVMb29rdXAgPSBtYXAgewogICAgICAgICAgICAkXy0+e0tleX0gPT4gJF8tPntWYWx1ZX0KICAgICAgICB9IEBOb3RpZmljYXRpb25DdXN0b21Vbml0c1BvaW50T2ZUaW1lOwogICAgICAgIG15ICRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZSA9ICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfQogICAgICAgICAgICB8fCAnYmVmb3Jlc3RhcnQnOwoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gdW5pdHMgcG9pbnQgb2YgdGltZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWUsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScsCiAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgRXh0cmFjdCB0aGUgZGF0ZSB1bml0cyBmb3IgdGhlIGN1c3RvbSBkYXRlIHNlbGVjdGlvbi4KICAgICAgICBteSAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncyA9IHt9OwogICAgICAgIGlmICggJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApIHsKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVNldHRpbmdzID0gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lT2JqZWN0LT5HZXQoKTsKICAgICAgICB9CgogICAgICAgICMgbm90aWZpY2F0aW9uIGN1c3RvbSBkYXRlIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICBQcmVmaXggICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIgICA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e1llYXJ9LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1vbnRoICA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e01vbnRofSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkgICAgPT4gJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntEYXl9LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUhvdXIgICA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e0hvdXJ9LAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZSA9PiAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVTZXR0aW5ncy0+e01pbnV0ZX0sCiAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICAgICAgWWVhclBlcmlvZFBhc3QgICAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RQYXN0e1N0YXJ0fSwKICAgICAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSAgICAgICAgICAgICAgICAgPT4gJFllYXJQZXJpb2RGdXR1cmV7U3RhcnR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSByYWRpbyBidXR0b24gZm9yIGN1c3RvbSBkYXRlIHRpbWUgYW5kIHJlbGF0aXZlIGlucHV0CiAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbX0gfHw9ICcnOwoKICAgICAgICBpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdkYXRldGltZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQgJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvfSA9ICdjaGVja2VkICc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvfSA9ICdjaGVja2VkICc7CiAgICAgICAgfQoKICAgICAgICAjIG5vdGlmaWNhdGlvbiBjdXN0b20gc3RyaW5nIHZhbHVlCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9uVmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JwogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBcHBvaW50bWVudHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9CiAgICAgICAgICAgICAgICAmJiAkQXBwb2ludG1lbnR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSB8fD0gMDsKICAgICAgICAgICAgICAgICRQYXJhbXtOb3RpZmljYXRpb25WYWx1ZX0gLj0gJywgJwogICAgICAgICAgICAgICAgICAgIC4gJEFwcG9pbnRtZW50e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdExvb2t1cHskU2VsZWN0ZWROb3RpZmljYXRpb25DdXN0b21Vbml0fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lTG9va3VweyRTZWxlY3RlZE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRQb2ludE9mVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBteSAlRnV0dXJlVGFzazsKICAgICAgICBpZiAoICVBcHBvaW50bWVudCApIHsKICAgICAgICAgICAgbXkgJFRhc2tJRDsKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICRUYXNrSUQgPSAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAjIE9ubHkgZm9yIHBhcmVudCBhcHBvaW50bWVudHMKICAgICAgICAgICAgZWxzaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSApIHsKICAgICAgICAgICAgICAgICMgQ2hlY2sgYWxsIGFwcG9pbnRtZW50cyBvZiBzZXJpZXMgZm9yIGZ1dHVyZSB0YXNrIGlkCiAgICAgICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRHZXQoIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICB1bnNoaWZ0IEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICAgICAgQVBQT0lOVE1FTlRMSVNUOgogICAgICAgICAgICAgICAgZm9yIG15ICRSZWN1cnJpbmdBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmluZ0FwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlRMSVNUOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRUYXNrSUQgKSB7CiAgICAgICAgICAgICAgICAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgdGlja2V0IHRlbXBsYXRlCiAgICAgICAgbXkgQFRpY2tldFRlbXBsYXRlcyA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyB0aWNrZXQgY3JlYXRpb24nKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIG1pbnV0ZShzKSBiZWZvcmUnLCAwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczMDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzkwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBtaW51dGUocykgYmVmb3JlJywgMTUgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzE4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgbWludXRlKHMpIGJlZm9yZScsIDMwICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICczNjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnNzIwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyBob3VyKHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzQzMjAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGhvdXIocykgYmVmb3JlJywgMTIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzg2NDAwJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJyVzIGRheShzKSBiZWZvcmUnLCAxICksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICcxNzI4MDAnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnJXMgZGF5KHMpIGJlZm9yZScsIDIgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJzYwNDgwMCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICclcyB3ZWVrIGJlZm9yZScsIDEgKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0N1c3RvbScpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVRpY2tldFRlbXBsYXRlTG9va3VwID0gbWFwIHsKICAgICAgICAgICAgJF8tPntLZXl9ID0+ICRfLT57VmFsdWV9CiAgICAgICAgfSBAVGlja2V0VGVtcGxhdGVzOwoKICAgICAgICBteSAkU2VsZWN0ZWRUaWNrZXRUZW1wbGF0ZSA9IGRlZmluZWQgJEZ1dHVyZVRhc2t7RGF0YX0gPyAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSA6ICcwJzsKICAgICAgICAkUGFyYW17VGlja2V0VmFsdWV9ID0gJFRpY2tldFRlbXBsYXRlTG9va3VweyRTZWxlY3RlZFRpY2tldFRlbXBsYXRlfTsKCiAgICAgICAgIyB0aWNrZXQgc2VsZWN0aW9uCiAgICAgICAgJFBhcmFte1RpY2tldFN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQFRpY2tldFRlbXBsYXRlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZFRpY2tldFRlbXBsYXRlLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldFRlbXBsYXRlJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgY3VzdG9tIHVuaXRzCiAgICAgICAgbXkgQFRpY2tldEN1c3RvbVVuaXRzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ21pbnV0ZShzKScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnaG91cnMnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdob3VyKHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdkYXlzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnZGF5KHMpJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAlVGlja2V0Q3VzdG9tVW5pdExvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFRpY2tldEN1c3RvbVVuaXRzOwogICAgICAgIG15ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXQgPSAoICRGdXR1cmVUYXNre0RhdGF9ID8gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXR9IDogJycgKSB8fCAnbWludXRlcyc7CgogICAgICAgICMgdGlja2V0IGN1c3RvbSB1bml0cyBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tVW5pdHNTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBUaWNrZXRDdXN0b21Vbml0cywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0JywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyB0aWNrZXQgY3VzdG9tIHVuaXRzIHBvaW50IG9mIHRpbWUKICAgICAgICBteSBAVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZSA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBzdGFydHMnKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdhZnRlciB0aGUgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3RhcnRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnYmVmb3JlZW5kJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnYmVmb3JlIHRoZSBhcHBvaW50bWVudCBlbmRzJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdhZnRlcmVuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ2FmdGVyIHRoZSBhcHBvaW50bWVudCBoYXMgYmVlbiBlbmRlZCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgbXkgJVRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZUxvb2t1cCA9IG1hcCB7CiAgICAgICAgICAgICRfLT57S2V5fSA9PiAkXy0+e1ZhbHVlfQogICAgICAgIH0gQFRpY2tldEN1c3RvbVVuaXRzUG9pbnRPZlRpbWU7CiAgICAgICAgbXkgJFNlbGVjdGVkVGlja2V0Q3VzdG9tVW5pdFBvaW50T2ZUaW1lID0gKCAkRnV0dXJlVGFza3tEYXRhfSA/ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0gOiAnJyApCiAgICAgICAgICAgIHx8ICdiZWZvcmVzdGFydCc7CgogICAgICAgICMgdGlja2V0IGN1c3RvbSB1bml0cyBwb2ludCBvZiB0aW1lIHNlbGVjdGlvbgogICAgICAgICRQYXJhbXtUaWNrZXRDdXN0b21Vbml0c1BvaW50T2ZUaW1lU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFxAVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBFeHRyYWN0IHRoZSBkYXRlIHVuaXRzIGZvciB0aGUgY3VzdG9tIGRhdGUgc2VsZWN0aW9uLgogICAgICAgIG15ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzID0ge307CiAgICAgICAgaWYgKCAkRnV0dXJlVGFza3tEYXRhfSAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbURhdGVUaW1lfSApIHsKICAgICAgICAgICAgbXkgJFRpY2tldEN1c3RvbURhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVTZXR0aW5ncyA9ICRUaWNrZXRDdXN0b21EYXRlVGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgfQoKICAgICAgICAjIHRpY2tldCBjdXN0b20gZGF0ZSBzZWxlY3Rpb24KICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVTdHJnfSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ1RpY2tldEN1c3RvbURhdGVUaW1lJywKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVZZWFyICAgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntZZWFyfSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVNb250aCAgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntNb250aH0sCiAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lRGF5ICAgID0+ICRUaWNrZXRDdXN0b21EYXRlVGltZVNldHRpbmdzLT57RGF5fSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVIb3VyICAgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntIb3VyfSwKICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUgPT4gJFRpY2tldEN1c3RvbURhdGVUaW1lU2V0dGluZ3MtPntNaW51dGV9LAogICAgICAgICAgICBGb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgICAgICAgICAgICAgICAgID0+ICRZZWFyUGVyaW9kUGFzdHtTdGFydH0sCiAgICAgICAgICAgIFllYXJQZXJpb2RGdXR1cmUgICAgICAgICAgICAgICAgID0+ICRZZWFyUGVyaW9kRnV0dXJle1N0YXJ0fSwKICAgICAgICApOwoKICAgICAgICAjIHByZXBhcmUgcmFkaW8gYnV0dG9uIGZvciBjdXN0b20gZGF0ZSB0aW1lIGFuZCByZWxhdGl2ZSBpbnB1dAogICAgICAgIGlmICggJEZ1dHVyZVRhc2t7RGF0YX0gKSB7CiAgICAgICAgICAgICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSB8fD0gJyc7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRGdXR1cmVUYXNre0RhdGF9ICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dFJhZGlvfSA9ICdjaGVja2VkPSJjaGVja2VkIic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEZ1dHVyZVRhc2t7RGF0YX0gJiYgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0UmFkaW99ID0gJ2NoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICMgdGlja2V0IGN1c3RvbSBzdHJpbmcgdmFsdWUKICAgICAgICBpZiAoICRGdXR1cmVUYXNre0RhdGF9ICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewogICAgICAgICAgICAkUGFyYW17VGlja2V0VmFsdWV9IC49ICcsICcgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKAogICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAnRGF0ZUZvcm1hdCcKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRnV0dXJlVGFza3tEYXRhfSAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXR9CiAgICAgICAgICAgICAgICAmJiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IHx8PSAwOwogICAgICAgICAgICAgICAgJFBhcmFte1RpY2tldFZhbHVlfSAuPSAnLCAnCiAgICAgICAgICAgICAgICAgICAgLiAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0Q3VzdG9tVW5pdExvb2t1cHskU2VsZWN0ZWRUaWNrZXRDdXN0b21Vbml0fQogICAgICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkVGlja2V0Q3VzdG9tVW5pdFBvaW50T2ZUaW1lTG9va3VweyRTZWxlY3RlZFRpY2tldEN1c3RvbVVuaXRQb2ludE9mVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICAjIGdldCBwbHVnaW4gbGlzdAogICAgICAgICRQYXJhbXtQbHVnaW5MaXN0fSA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpc3QoKTsKCiAgICAgICAgIyBuZXcgYXBwb2ludG1lbnQgcGx1Z2luIHNlYXJjaAogICAgICAgIGlmICggJEdldFBhcmFte1BsdWdpbktleX0gJiYgKCAkR2V0UGFyYW17U2VhcmNofSB8fCAkR2V0UGFyYW17T2JqZWN0SUR9ICkgKSB7CgogICAgICAgICAgICBpZiAoIGdyZXAgeyAkXyBlcSAkR2V0UGFyYW17UGx1Z2luS2V5fSB9IGtleXMgJXsgJFBhcmFte1BsdWdpbkxpc3R9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZWFyY2ggdXNpbmcgcGx1Z2luCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0TGlzdCA9ICRQbHVnaW5PYmplY3QtPlBsdWdpblNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkRhdGF9LT57ICRHZXRQYXJhbXtQbHVnaW5LZXl9IH0gPSBbXTsKICAgICAgICAgICAgICAgIG15IEBMaW5rQXJyYXkgPSBzb3J0IGtleXMgJXskUmVzdWx0TGlzdH07CgogICAgICAgICAgICAgICAgIyBhZGQgcG9zc2libGUgbGlua3MKICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEIChATGlua0FycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17UGx1Z2luRGF0YX0tPnsgJEdldFBhcmFte1BsdWdpbktleX0gfSB9LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtJRCAgID0+ICRMaW5rSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtOYW1lID0+ICRSZXN1bHRMaXN0LT57JExpbmtJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmtVUkwgID0+IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnsgJEdldFBhcmFte1BsdWdpbktleX0gfS0+e1BsdWdpblVSTH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTGlua0lECiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkUGFyYW17UGx1Z2luTGlzdH0tPnsgJEdldFBhcmFte1BsdWdpbktleX0gfS0+e0xpbmtMaXN0fSA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcQExpbmtBcnJheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZWRpdCBhcHBvaW50bWVudCBwbHVnaW4gbGlua3MKICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgICAgIGZvciBteSAkUGx1Z2luS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtQbHVnaW5MaXN0fSB9ICkgewogICAgICAgICAgICAgICAgbXkgJExpbmtMaXN0ID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0xpc3QoCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ICAgICA9PiAkUGx1Z2luS2V5LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15IEBMaW5rQXJyYXk7CgogICAgICAgICAgICAgICAgJFBhcmFte1BsdWdpbkRhdGF9LT57JFBsdWdpbktleX0gPSBbXTsKICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggc29ydCBrZXlzICV7JExpbmtMaXN0fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtQbHVnaW5EYXRhfS0+eyRQbHVnaW5LZXl9IH0sICRMaW5rTGlzdC0+eyRMaW5rSUR9OwogICAgICAgICAgICAgICAgICAgIHB1c2ggQExpbmtBcnJheSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtMaXN0LT57JExpbmtJRH0tPntMaW5rSUR9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRQYXJhbXtQbHVnaW5MaXN0fS0+eyRQbHVnaW5LZXl9LT57TGlua0xpc3R9ID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IFxATGlua0FycmF5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAojICAgICAgICAgIyBodG1sIG1hc2sgb3V0cHV0CiMgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKIyAgICAgICAgICAgICBOYW1lID0+ICdFZGl0TWFzaycsCiMgICAgICAgICAgICAgRGF0YSA9PiB7CiMgICAgICAgICAgICAgICAgICVQYXJhbSwKIyAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAojICAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQsCiMgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbCA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiMgICAgICAgICAgICAgfSwKIyAgICAgICAgICk7CgogICAgICAgICMgQnVpbGQgdGlja2V0IGZpZWxkcwogICAgICAgICMgZnJvbnRlbmQgc3BlY2lmaWMgY29uZmlnCiAgICAgICAgbXkgJVVzZXJQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFVzZXJEYXRhKAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgRmV0Y2ggZHluYW1pYyBmaWVsZCBjb25maWdzCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZENvbmZpZ3M7CiAgICAgICAgaWYgKCBkZWZpbmVkICRDb25maWctPntEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICBARHluYW1pY0ZpZWxkQ29uZmlncyA9IGRlZmluZWQgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPyBAeyAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiB9IDogKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRHZXRQYXJhbXtEZXN0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScpLT5RdWV1ZUxvb2t1cCggUXVldWVJRCA9PiAkR2V0UGFyYW17RGVzdH0gKTsKICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJEdldFBhcmFte0Rlc3R9OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICVGdXR1cmVUYXNrICkgewogICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1F1ZXVlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17UXVldWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlTG9va3VwKCBRdWV1ZUlEID0+ICRHZXRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgICAgICAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTdGF0ZUlEfTsKICAgICAgICAgICAgJEdldFBhcmFte1R5cGVJRH0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1R5cGVJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTZXJ2aWNlSUR9OwogICAgICAgICAgICAkR2V0UGFyYW17U0xBSUR9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTTEFJRH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkVXNlckRlZmF1bHRRdWV1ZSA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VXNlckRlZmF1bHRRdWV1ZScpIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCRVc2VyRGVmYXVsdFF1ZXVlKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWVJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVMb29rdXAoIFF1ZXVlID0+ICRVc2VyRGVmYXVsdFF1ZXVlICk7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtRdWV1ZUlEfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UXVldWV9ID0gIiRHZXRQYXJhbXtUaWNrZXRRdWV1ZUlEfXx8JFVzZXJEZWZhdWx0UXVldWUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwogICAgICAgICMgY3ljbGUgdGhyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEBEeW5hbWljRmllbGRDb25maWdzICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ICkgewogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHdlYiByZXF1ZXN0IHdpdGggYXBwcm9hY2ggZm9yIGFycmF5CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4geyAkRHluYW1pY0ZpZWxkQ29uZmlnLT4lKiwgTmFtZSA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnW10nIH0sCiAgICAgICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQER5bmFtaWNGaWVsZENvbmZpZ3MgKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfSApOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAgICAgIyB0byBzdG9yZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gZGF0YWJhc2UgKG9yIHVuZGVmaW5lZCkKICAgICAgICAgICAgbXkgJFZhbHVlOwoKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgYSB1c2VyIHNwZWNpZmljIGRlZmF1bHQgdmFsdWUgZm9yCiAgICAgICAgICAgICMgdGhlIGR5bmFtaWMgZmllbGQsIG90aGVyd2lzZSB3aWxsIHVzZSBEeW5hbWljIEZpZWxkIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCB2YWx1ZSBmcm9tIGR5bmFtaWMgZmllbGQgY29uZmlnIChpZiBhbnkpCiAgICAgICAgICAgICRWYWx1ZSA9ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57RGVmYXVsdFZhbHVlfSB8fCAnJzsKCiAgICAgICAgICAgICMgb3ZlcnJpZGUgdGhlIHZhbHVlIGZyb20gdXNlciBwcmVmZXJlbmNlcyBpZiBpcyBzZXQKICAgICAgICAgICAgaWYgKCAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPSAkVXNlclByZWZlcmVuY2VzeyAnVXNlckR5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICVGdXR1cmVUYXNrICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30tPnskRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX19ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntEeW5hbWljRmllbGRzfS0+eyREeW5hbWljRmllbGRDb25maWctPntOYW1lfX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRWYWx1ZTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGh0bWwgc3RyaW5ncyBmb3IgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEhUTUxEYXRhOwogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJGkgKCAwIC4uICQjRHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCAkRHluYW1pY0ZpZWxkQ29uZmlnc1skaV0gKTsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkQ29uZmlnc1skaV07CgogICAgICAgICAgICAjIGdldCBmaWVsZCBodG1sCiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MRGF0YXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkT3JkZXJ9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgQUpBWFVwZGF0ZSAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICAgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPT0gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgbXkgQER5bmFtaWNGaWVsZEhUTUw7CiAgICAgICAgZm9yIG15ICRLZXkgKHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVEeW5hbWljRmllbGRIVE1MRGF0YSkgewogICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRIVE1MLCAkRHluYW1pY0ZpZWxkSFRNTERhdGF7JEtleX07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBsaXN0IHR5cGUKICAgICAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgZnV0dXJlIHRhc2sgZXhpc3RzLCB0cmFuc2Zvcm0gZXhpc3RpbmcgZGF0YSBpbnRvIG5lZWRlIHN0cnVjdHVyZQogICAgICAgIGlmICglRnV0dXJlVGFzaykgewogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU3RyaW5ncyA9IHNwbGl0IC8sLywgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21lclVzZXJ9OwogICAgICAgICAgICBpZiAoIEBDdXN0b21lclVzZXJTdHJpbmdzICkgewogICAgICAgICAgICAgICAgbXkgJENvdW50ID0gMTsKICAgICAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyU3RyaW5nICggQEN1c3RvbWVyVXNlclN0cmluZ3MgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlclN0cmluZywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggJUN1c3RvbWVyVXNlciApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBATXVsdGlwbGVDdXN0b21lciwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnQgPT4gJENvdW50KyssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVsZW1lbnQgPT4gJyInIC4gJEN1c3RvbWVyVXNlcntVc2VyRmlyc3RuYW1lfSAuICcgJyAuICRDdXN0b21lclVzZXJ7VXNlckxhc3RuYW1lfSAuICciIDwnIC4gJEN1c3RvbWVyVXNlcntVc2VyRW1haWx9IC4gJz4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAoICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9IGVxICRDdXN0b21lclVzZXJTdHJpbmcgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRDdXN0b21lclVzZXJ7VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycm9yTXNnID0+ICdDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckRpc2FibGVkID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBNdWx0aXBsZUN1c3RvbWVyLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCA9PiAkQ291bnQrKywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRWxlbWVudCA9PiAkQ3VzdG9tZXJVc2VyU3RyaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJTZWxlY3RlZCA9PiAoICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9IGVxICRDdXN0b21lclVzZXJTdHJpbmcgPyAnY2hlY2tlZD0iY2hlY2tlZCInIDogJycgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyRXJyb3IgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lckVycnJvck1zZyA9PiAnQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2cnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJEaXNhYmxlZCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkR2V0UGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9ID0gJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntTZWxlY3RlZEN1c3RvbWVyVXNlcn07CiAgICAgICAgfQoKCiAgICAgICAgIyBmb3IgZWFjaCBzdGFuZGFyZCBmaWVsZCB3aGljaCBoYXMgdG8gYmUgY2hlY2tlZCwgcnVuIHRoZSBkZWZpbmVkIG1ldGhvZAogICAgICAgIG15ICRRdWV1ZVZhbHVlcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFByaW9yaXR5VmFsdWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFN0YXRlVmFsdWVzID0gJFNlbGYtPl9HZXRTdGF0ZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkVHlwZVZhbHVlcyA9ICRTZWxmLT5fR2V0VHlwZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkU2VydmljZVZhbHVlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBteSAkU0xBVmFsdWVzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBCdWlsZCBxdWV1ZSBodG1sIHN0cmluZwogICAgICAgIG15ICRRdWV1ZUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICRRdWV1ZUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdNYW5kYXRvcnkgVmFsaWRhdGVfUmVxdWlyZWQgTW9kZXJuaXplJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+ICRRdWV1ZVZhbHVlcywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICA9PiAwLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gJEdldFBhcmFte1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICAgPT4gMCwKICAgICAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFF1ZXVlSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ01hbmRhdG9yeSBWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gJFF1ZXVlVmFsdWVzLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkR2V0UGFyYW17UXVldWVJRH0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAwLAogICAgICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIHR5cGUgc3RyaW5nCiAgICAgICAgbXkgJFR5cGVIVE1MU3RyaW5nOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAgICAgJFR5cGVIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFR5cGVWYWx1ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBNYW5kYXRvcnkgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RhdGUgc3RyaW5nCiAgICAgICAgbXkgJFN0YXRlSFRNTFN0cmluZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZSBWYWxpZGF0ZV9SZXF1aXJlZCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU3RhdGVWYWx1ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSB8fCAkQ29uZmlnLT57U3RhdGVEZWZhdWx0fSwKICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9IHx8ICRDb25maWctPntTdGF0ZURlZmF1bHR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICBNYW5kYXRvcnkgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIHNlcnZpY2UgYW5kIFNMQSBzdHJpbmcKICAgICAgICBteSAkU2VydmljZUhUTUxTdHJpbmc7CiAgICAgICAgbXkgJFNMQUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICAgICAkU2VydmljZUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIENsYXNzID0+ICdNb2Rlcm5pemUgJwogICAgICAgICAgICAgICAgICAgIC4gKCAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gPyAnVmFsaWRhdGVfUmVxdWlyZWQgJyA6ICcnICkKICAgICAgICAgICAgICAgICAgICAuICggJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSURJbnZhbGlkfSB8fCAnJyApLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlVmFsdWVzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdUcmVlVmlldycsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNMQUhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZSAnCiAgICAgICAgICAgICAgICAgICAgLiAoICRDb25maWctPntTTEFNYW5kYXRvcnl9ID8gJ1ZhbGlkYXRlX1JlcXVpcmVkICcgOiAnJyApCiAgICAgICAgICAgICAgICAgICAgLiAoICRQYXJhbXtFcnJvcnN9LT57U0xBSW52YWxpZH0gfHwgJycgKSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBVmFsdWVzLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgoKCiAgICAgICAgIyBnZXQgcHJpb3JpdHkgZGF0YQogICAgICAgIGlmICggISRHZXRQYXJhbXtQcmlvcml0eX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eX0gPSAkQ29uZmlnLT57UHJpb3JpdHl9OwogICAgICAgIH0KICAgICAgICBpZiAoICVGdXR1cmVUYXNrICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1ByaW9yaXR5SUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBwcmlvcml0eSBodG1sIHN0cmluZwogICAgICAgIG15ICRQcmlvcml0eUhUTUxTdHJpbmc7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICAkUHJpb3JpdHlIVE1MU3RyaW5nID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUHJpb3JpdHlWYWx1ZXMsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkR2V0UGFyYW17UHJpb3JpdHl9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gICA9PiAxLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0N1c3RvbWVySGlkZGVuQ29udGFpbmVyfSA9ICQjTXVsdGlwbGVDdXN0b21lciAhPSAtMSA/ICcnIDogJ0hpZGRlbic7CiAgICAgICAgJFBhcmFte0FydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXJ9ID0gKCRQYXJhbXtUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSB8fCAoICVGdXR1cmVUYXNrICYmICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lcn0pKSA/ICdjaGVja2VkPWNoZWNrZWQnIDogJyc7CgogICAgICAgIGlmICggJUZ1dHVyZVRhc2sgKSB7CiAgICAgICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXRNYXNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICV7JEZ1dHVyZVRhc2t7RGF0YX0gfHwgXHt9fSwKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBQZXJtaXNzaW9uTGV2ZWwgPT4gJFBlcm1pc3Npb25MZXZlbHskUGVybWlzc2lvbnN9LAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSFRNTFN0cmluZyA9PiAkUXVldWVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5SFRNTFN0cmluZyA9PiAkUHJpb3JpdHlIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFR5cGVIVE1MU3RyaW5nID0+ICRUeXBlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTdGF0ZUhUTUxTdHJpbmcgPT4gJFN0YXRlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSFRNTFN0cmluZyA9PiAkU2VydmljZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU2VydmljZU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U2VydmljZU1hbmRhdG9yeX0gfHwgMCwKICAgICAgICAgICAgICAgICAgICBTTEFIVE1MU3RyaW5nID0+ICRTTEFIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFNMQU1hbmRhdG9yeSA9PiAkQ29uZmlnLT57U0xBTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgPT4gXEBEeW5hbWljRmllbGRIVE1MLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgaHRtbCBtYXNrIG91dHB1dAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0VkaXRNYXNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIFBlcm1pc3Npb25MZXZlbCA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiAgICAgICAgICAgICAgICAgICAgUXVldWVIVE1MU3RyaW5nID0+ICRRdWV1ZUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlIVE1MU3RyaW5nID0+ICRQcmlvcml0eUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUhUTUxTdHJpbmcgPT4gJFR5cGVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFN0YXRlSFRNTFN0cmluZyA9PiAkU3RhdGVIVE1MU3RyaW5nLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VIVE1MU3RyaW5nID0+ICRTZXJ2aWNlSFRNTFN0cmluZywKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlTWFuZGF0b3J5ID0+ICRDb25maWctPntTZXJ2aWNlTWFuZGF0b3J5fSB8fCAwLAogICAgICAgICAgICAgICAgICAgIFNMQUhUTUxTdHJpbmcgPT4gJFNMQUhUTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU0xBTWFuZGF0b3J5ID0+ICRDb25maWctPntTTEFNYW5kYXRvcnl9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiBcQER5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQ3VzdG9tZXJDb3VudGVyID0gMDsKICAgICAgICBpZiAoIEBNdWx0aXBsZUN1c3RvbWVyICkgewogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKCBATXVsdGlwbGVDdXN0b21lciApIHsKICAgICAgICAgICAgICAgICMgc2V0IGVtcHR5IHZhbHVlcyBmb3IgZXJyb3JzCiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3J9ICAgID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRGlzYWJsZWR9ID0gJyc7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0N1c3RvbWVyRXJyb3JNc2d9ID0gJ0N1c3RvbWVyR2VuZXJpY1NlcnZlckVycm9yTXNnJzsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntDdXN0b21lckVycm9yTXNnfSwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPntDdXN0b21lckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRDdXN0b21lckNvdW50ZXIgKSB7CiAgICAgICAgICAgICRQYXJhbXtDdXN0b21lckhpZGRlbkNvbnRhaW5lcn0gPSAnSGlkZGVuJzsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNdWx0aXBsZUN1c3RvbWVyQ291bnRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ3VzdG9tZXJDb3VudGVyID0+ICRDdXN0b21lckNvdW50ZXIrKywKICAgICAgICAgICAgfSwKICAgICAgICApOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICBLZXkgICA9PiAnQ2FsZW5kYXJQZXJtaXNzaW9uTGV2ZWwnLAogICAgICAgICAgICBWYWx1ZSA9PiAkUGVybWlzc2lvbkxldmVseyRQZXJtaXNzaW9uc30sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgIEtleSAgID0+ICdFZGl0QXBwb2ludG1lbnRJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSAvLyAnJywKICAgICAgICApOwogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0VkaXRQYXJlbnRJRCcsCiAgICAgICAgICAgIFZhbHVlID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gLy8gJycsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgcmVnaXN0ZXJlZCBsb2NhdGlvbiBsaW5rcwogICAgICAgIG15ICRMb2NhdGlvbkxpbmtDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0FnZW50QXBwb2ludG1lbnRFZGl0OjpMb2NhdGlvbjo6TGluaycpIC8vIHt9OwogICAgICAgIGZvciBteSAkQ29uZmlnS2V5ICggc29ydCBrZXlzICV7JExvY2F0aW9uTGlua0NvbmZpZ30gKSB7CgogICAgICAgICAgICAjIHNob3cgbGluayBpY29uCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9jYXRpb25MaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIExvY2F0aW9uID0+ICRBcHBvaW50bWVudHtMb2NhdGlvbn0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgJXsgJExvY2F0aW9uTGlua0NvbmZpZy0+eyRDb25maWdLZXl9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIEFKQVggPT4gMSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZC9lZGl0IGFwcG9pbnRtZW50CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnRWRpdEFwcG9pbnRtZW50JyApIHsKCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIGlmICgkR2V0UGFyYW17VGlja2V0VGVtcGxhdGV9KSB7CiAgICAgICAgICAgICMgVmFsaWRhdGUgaW5jb21pbmcgdmFsdWVzCiAgICAgICAgICAgIG15ICRRdWV1ZVZhbHVlcyA9ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUXVldWVWYWx1ZXMtPnskR2V0UGFyYW17RGVzdH19ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0IScgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU3RhdGVWYWx1ZXMgPSAkU2VsZi0+X0dldFN0YXRlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN0YXRlVmFsdWVzLT57JEdldFBhcmFte05leHRTdGF0ZUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIG5leHQgc3RhdGUhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU2VydmljZVZhbHVlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAoJEdldFBhcmFte1NlcnZpY2VJRH0gfHwgJENvbmZpZy0+e1NlcnZpY2VNYW5kYXRvcnl9KSAmJiAhJFNlcnZpY2VWYWx1ZXMtPnskR2V0UGFyYW17U2VydmljZUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU0xBVmFsdWVzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgKCRHZXRQYXJhbXtTTEFJRH0gfHwgJENvbmZpZy0+e1NMQU1hbmRhdG9yeX0pICYmICEkU0xBVmFsdWVzLT57JEdldFBhcmFte1NMQUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIFNMQSEnICksCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRUeXBlVmFsdWVzID0gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICAhJFR5cGVWYWx1ZXMtPnskR2V0UGFyYW17VHlwZUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJyApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkUHJpb3JpdHlWYWx1ZXMgPSAkU2VsZi0+X0dldFByaW9yaXRpZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRQcmlvcml0eVZhbHVlcy0+eyRHZXRQYXJhbXtQcmlvcml0eUlEfX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHByaW9yaXR5IScgKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBBcHBvaW50bWVudFRpY2tldAoKICAgICAgICBteSAlQXBwb2ludG1lbnQ7CgogICAgICAgIGlmICggJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIHBlcm1pc3Npb25zCiAgICAgICAgICAgICRQZXJtaXNzaW9ucyA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRSZXF1aXJlZFBlcm1pc3Npb24gPSAyOwogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtDYWxlbmRhcklEfSAmJiAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gIT0gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9ICkgewoKICAgICAgICAgICAgICAgICMgaW4gb3JkZXIgdG8gbW92ZSBhcHBvaW50bWVudCB0byBhbm90aGVyIGNhbGVuZGFyLCB1c2VyIG5lZWRzICJjcmVhdGUiIHBlcm1pc3Npb24KICAgICAgICAgICAgICAgICRSZXF1aXJlZFBlcm1pc3Npb24gPSAzOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uTGV2ZWx7JFBlcm1pc3Npb25zfSA8ICRSZXF1aXJlZFBlcm1pc3Npb24gKSB7CgogICAgICAgICAgICAgICAgIyBubyBwZXJtaXNzaW9uCgogICAgICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAgICAgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdWNjZXNzID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICAgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uIScpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEdldFBhcmFte0FsbERheX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRZZWFyfSwgJEdldFBhcmFte1N0YXJ0TW9udGh9LCAkR2V0UGFyYW17U3RhcnREYXl9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLAogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFllYXJ9LCAkR2V0UGFyYW17RW5kTW9udGh9LCAkR2V0UGFyYW17RW5kRGF5fQogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBQcmV2ZW50IHN0b3JpbmcgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgIGlmICggJEVuZFRpbWVPYmplY3QgPCAkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QgPSAkU3RhcnRUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE1ha2UgZW5kIHRpbWUgaW5jbHVzaXZlLCBhZGQgd2hvbGUgZGF5LgogICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17UmVjdXJyaW5nfSAmJiAkR2V0UGFyYW17VXBkYXRlVHlwZX0gJiYgJEdldFBhcmFte1VwZGF0ZURlbHRhfSApIHsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgQ2FsY3VsYXRlIG5ldyBzdGFydC9lbmQgdGltZXMuCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1VwZGF0ZVR5cGV9IGVxICdTdGFydFRpbWUnICkgewogICAgICAgICAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJEdldFBhcmFte1VwZGF0ZURlbHRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VXBkYXRlVHlwZX0gZXEgJ0VuZFRpbWUnICkgewogICAgICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRHZXRQYXJhbXtVcGRhdGVEZWx0YX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkR2V0UGFyYW17VXBkYXRlRGVsdGF9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTdGFydFRpbWV9ID0gJFN0YXJ0VGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0WWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TW9udGh9CiAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtTdGFydERheX0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0SG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0WWVhcn0sICRHZXRQYXJhbXtTdGFydE1vbnRofSwgJEdldFBhcmFte1N0YXJ0RGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17U3RhcnRIb3VyfSwgJEdldFBhcmFte1N0YXJ0TWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIENvbnZlcnQgc3RhcnQgdGltZSB0byBsb2NhbCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAgICAgICAgICRTdGFydFRpbWVPYmplY3QtPlRvT1RPQk9UaW1lWm9uZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1N0YXJ0VGltZX0gPSAkQXBwb2ludG1lbnR7U3RhcnRUaW1lfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17RW5kWWVhcn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZE1vbnRofQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RW5kRGF5fQogICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RW5kSG91cn0KICAgICAgICAgICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0VuZE1pbnV0ZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kWWVhcn0sICRHZXRQYXJhbXtFbmRNb250aH0sICRHZXRQYXJhbXtFbmREYXl9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRIb3VyfSwgJEdldFBhcmFte0VuZE1pbnV0ZX0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBDb252ZXJ0IGVuZCB0aW1lIHRvIGxvY2FsIHRpbWUuCiAgICAgICAgICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBHZXQgYWxyZWFkeSBjYWxjdWxhdGVkIGxvY2FsIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBQcmV2ZW50IHN0b3JpbmcgZW5kIHRpbWUgYmVmb3JlIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgICAgICBpZiAoICRFbmRUaW1lT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte0VuZFRpbWV9ID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RW5kVGltZX0gPSAkQXBwb2ludG1lbnR7RW5kVGltZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgUHJldmVudCByZWN1cnJlbmNlIHVudGlsIGRhdGVzIGJlZm9yZSBzdGFydCB0aW1lLgogICAgICAgIGlmICggJEFwcG9pbnRtZW50e1JlY3VycmluZ30gJiYgJEFwcG9pbnRtZW50e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFJlY3VycmVuY2VVbnRpbE9iamVjdCA8ICRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZVVudGlsfSA9ICRHZXRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlY3VycmluZyBhcHBvaW50bWVudAogICAgICAgIGlmICggJEdldFBhcmFte1JlY3VycmluZ30gJiYgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSApIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ1llYXJseScKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tJyApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17RGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBEYXlzID0gc3BsaXQgLywvLCAkR2V0UGFyYW17RGF5c307CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxARGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTZXR0aW5ncyA9ICRTdGFydFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICRTdGFydFRpbWVTZXR0aW5ncy0+e0RheU9mV2Vla30gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte01vbnRoRGF5c30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15IEBNb250aERheXMgPSBzcGxpdCAvLC8sICRHZXRQYXJhbXtNb250aERheXN9OwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBcQE1vbnRoRGF5czsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdGFydFRpbWVTZXR0aW5ncyA9ICRTdGFydFRpbWVPYmplY3QtPkdldCgpOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0gPSBbICRTdGFydFRpbWVTZXR0aW5ncy0+e0RheX0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZWN1cnJlbmNlQ3VzdG9tVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TW9udGhzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQE1vbnRocyA9IHNwbGl0IC8sLywgJEdldFBhcmFte01vbnRoc307CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFxATW9udGhzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZVNldHRpbmdzID0gJFN0YXJ0VGltZU9iamVjdC0+R2V0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fSA9IFsgJFN0YXJ0VGltZVNldHRpbmdzLT57TW9udGh9IF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gPSAkR2V0UGFyYW17UmVjdXJyZW5jZUN1c3RvbVR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHVudGlsIC4uLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZUxpbWl0fSBlcSAnMScKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxZZWFyfQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbE1vbnRofQogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbERheX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAwMDowMDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbFllYXJ9LCAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWxEYXl9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUHJldmVudCByZWN1cnJlbmNlIHVudGlsIGRhdGVzIGJlZm9yZSBzdGFydCB0aW1lLgogICAgICAgICAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyZW5jZVVudGlsT2JqZWN0IDwgJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRHZXRQYXJhbXtTdGFydFRpbWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtSZWN1cnJlbmNlQ291bnR9ID0gdW5kZWY7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte1JlY3VycmVuY2VMaW1pdH0gZXEgJzInICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgbm90aWZpY2F0aW9uIGN1c3RvbSB0eXBlLCBpZiBzdXBwbGllZC4KICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0fSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219ID0gJ2RhdGV0aW1lJzsKCiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVZZWFyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aH0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5fSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyfSwKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNaW51dGV9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nICAgPT4gJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVpvbmUgPT4gJFNlbGYtPntVc2VyVGltZVpvbmV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+VG9PVE9CT1RpbWVab25lKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEdldFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9ICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIG15ICVGdXR1cmVUYXNrOwogICAgICAgIGlmICggJUFwcG9pbnRtZW50ICkgewogICAgICAgICAgICBteSAkVGFza0lEOwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICMgT25seSBmb3IgcGFyZW50IGFwcG9pbnRtZW50cwogICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBhbGwgYXBwb2ludG1lbnRzIG9mIHNlcmllcyBmb3IgZnV0dXJlIHRhc2sgaWQKICAgICAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICBQYXJlbnRJRCA9PiAkQXBwb2ludG1lbnR7UGFyZW50SUR9IHx8ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICAgICAgQVBQT0lOVE1FTlRMSVNUOgogICAgICAgICAgICAgICAgZm9yIG15ICRSZWN1cnJpbmdBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlY3VycmluZ0FwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlRMSVNUOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRUYXNrSUQgKSB7CiAgICAgICAgICAgICAgICAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRUYXNrSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ29uZmlnczsKICAgICAgICBpZiAoICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gJiYgZGVmaW5lZCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWY9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbICdUaWNrZXQnLCAnQXJ0aWNsZScgXSwKICAgICAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRDb25maWctPntEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICBARHluYW1pY0ZpZWxkQ29uZmlncyA9IGRlZmluZWQgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPyBAeyAkRHluYW1pY0ZpZWxkQ29uZmlnc1JlZiB9IDogKCk7CiAgICAgICAgfQoKICAgICAgICBteSAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFZhbHVlczsKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFZhbGlkYXRlIGR5bmFtaWMgZmllbGQgdmFsdWUKICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSA/ICRQb3NzaWJsZVZhbHVlcyA6IHVuZGVmLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgTWFuZGF0b3J5ID0+ICRDb25maWctPntEeW5hbWljRmllbGR9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID09IDIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkICVzIScsICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFZhbGlkYXRpb25SZXN1bHQtPntTZXJ2ZXJFcnJvcn0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRWYWxpZGF0aW9uUmVzdWx0LT57RXJyb3JNZXNzYWdlfSApLAogICAgICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgIHx8IChyZWYoJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0pIGVxICdBUlJBWScKICAgICAgICAgICAgICAgICAgICAmJiAhSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9KSkKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3Qgd2l0aCBhcHByb2FjaCBmb3IgYXJyYXkKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiB7ICREeW5hbWljRmllbGRDb25maWctPiUqLCBOYW1lID0+ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdbXScgfSwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBARHluYW1pY0ZpZWxkQ29uZmlncyApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9ICk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAjIHRvIHN0b3JlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSBkYXRhYmFzZSAob3IgdW5kZWZpbmVkKQogICAgICAgICAgICBteSAkVmFsdWU7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBhIHVzZXIgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZSBmb3IKICAgICAgICAgICAgIyB0aGUgZHluYW1pYyBmaWVsZCwgb3RoZXJ3aXNlIHdpbGwgdXNlIER5bmFtaWMgRmllbGQgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHZhbHVlIGZyb20gZHluYW1pYyBmaWVsZCBjb25maWcgKGlmIGFueSkKICAgICAgICAgICAgJFZhbHVlID0gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntEZWZhdWx0VmFsdWV9IHx8ICcnOwoKICAgICAgICAgICAgIyBvdmVycmlkZSB0aGUgdmFsdWUgZnJvbSB1c2VyIHByZWZlcmVuY2VzIGlmIGlzIHNldAogICAgICAgICAgICBpZiAoICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRVc2VyUHJlZmVyZW5jZXN7ICdVc2VyRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkVmFsdWVzeyREeW5hbWljRmllbGRDb25maWctPntOYW1lfX0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWU9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZHN9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgIyBQYXJzZSBwb3NzaWJseSBtdWx0aXBsZSBjdXN0b21lciB1c2VycwogICAgICAgIGlmICggQE11bHRpcGxlQ3VzdG9tZXIgKSB7CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJVc2VyIChATXVsdGlwbGVDdXN0b21lcikgewogICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVyVXNlcklkZW50aWZpZXIgPSAkQ3VzdG9tZXJVc2VyLT57Q3VzdG9tZXJLZXl9ID8gJEN1c3RvbWVyVXNlci0+e0N1c3RvbWVyS2V5fSA6ICRDdXN0b21lclVzZXItPntDdXN0b21lckVsZW1lbnR9OwogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyLT57Q3VzdG9tZXJTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSA9ICRDdXN0b21lclVzZXJJZGVudGlmaWVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSAuPSAiLCRDdXN0b21lclVzZXJJZGVudGlmaWVyIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtDdXN0b21lclVzZXJ9ID0gJEN1c3RvbWVyVXNlcklkZW50aWZpZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggY3VzdG9tZXIgaWQgZm9yIHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAlU2VsZWN0ZWRDdXN0b21lclVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgICAgICk7CiAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJVNlbGVjdGVkQ3VzdG9tZXJVc2VyRGF0YSA/ICRTZWxlY3RlZEN1c3RvbWVyVXNlckRhdGF7Q3VzdG9tZXJJRH0gOiAnJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgICMgdGVhbQogICAgICAgIGlmICggJEdldFBhcmFteydUZWFtSURbXSd9ICkgewogICAgICAgICAgICBteSBAVGVhbUlEcyA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICdUZWFtSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1RlYW1JRH0gPSBcQFRlYW1JRHM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17VGVhbUlEfSA9IHVuZGVmOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZXMKICAgICAgICBpZiAoICRHZXRQYXJhbXsnUmVzb3VyY2VJRFtdJ30gKSB7CiAgICAgICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1Jlc291cmNlSURbXScgKTsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gXEBSZXNvdXJjZUlEOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc291cmNlSUR9ID0gdW5kZWY7CiAgICAgICAgfQoKICAgICAgICAjIENoZWNrIGlmIGRlYWxpbmcgd2l0aCB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICkgewoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgcmVhZG9ubHkgdmFsdWVzIHN0YXkgdW5jaGFuZ2VkLgogICAgICAgICAgICAkR2V0UGFyYW17VGl0bGV9ICAgICAgPSAkQXBwb2ludG1lbnR7VGl0bGV9OwogICAgICAgICAgICAkR2V0UGFyYW17Q2FsZW5kYXJJRH0gPSAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH07CiAgICAgICAgICAgICRHZXRQYXJhbXtBbGxEYXl9ICAgICA9IHVuZGVmOwogICAgICAgICAgICAkR2V0UGFyYW17UmVjdXJyaW5nfSAgPSB1bmRlZjsKCiAgICAgICAgICAgIG15ICRSdWxlID0gJENhbGVuZGFyT2JqZWN0LT5UaWNrZXRBcHBvaW50bWVudFJ1bGVHZXQoCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFJ1bGVJRCAgICAgPT4gJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgUmVjYWxjdWxhdGUgZW5kIHRpbWUgYmFzZWQgb24gdGltZSBwcmVzZXQuCiAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFJ1bGUpICkgewogICAgICAgICAgICAgICAgaWYgKCAkUnVsZS0+e0VuZERhdGV9ID1+IC9eUGx1c18oWzAtOV0rKSQvICYmICRHZXRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRQcmVzZXQgPSBpbnQgJDE7CgogICAgICAgICAgICAgICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEdldFBhcmFte1N0YXJ0VGltZX0sICAgICMgYmFzZSBvbiBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBDYWxjdWxhdGUgZW5kIHRpbWUgdXNpbmcgcHJlc2V0IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgICAgIE1pbnV0ZXMgPT4gJFByZXNldCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtFbmRUaW1lfSA9ICRFbmRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAkU3VjY2VzczsKCiAgICAgICAgIyByZXNldCBlbXB0eSBwYXJhbWV0ZXJzCiAgICAgICAgZm9yIG15ICRQYXJhbSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXskUGFyYW19ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSB1bmRlZjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBwYXNzIGN1cnJlbnQgdXNlciBJRAogICAgICAgICRHZXRQYXJhbXtVc2VySUR9ID0gJFNlbGYtPntVc2VySUR9OwoKICAgICAgICAjIEdldCBwYXNzZWQgcGx1Z2luIHBhcmFtZXRlcnMuCiAgICAgICAgbXkgQFBsdWdpblBhcmFtcyA9IGdyZXAgeyAkXyA9fiAvXlBsdWdpbl8vIH0ga2V5cyAlR2V0UGFyYW07CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBpZiAoICFAUGx1Z2luUGFyYW1zICkgewogICAgICAgICAgICAjIENvbWluZyBmcm9tIGVpdGhlciBkcmFnIGFuZCBkcm9wIG9yIHJlc2l6ZSwgZmlsbGluZyBwYXJhbXMgd2l0aCBleGlzdGluZyBkYXRhIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkRnV0dXJlVGFza0lEOwogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0lEID0gJEFwcG9pbnRtZW50e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRBcHBvaW50bWVudHtSZWN1cnJpbmd9IHx8ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFwcG9pbnRtZW50TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQnKS0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50SUQgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSB8fCAkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwogICAgICAgICAgICAgICAgICAgIEFQUE9JTlRNRU5UUkVDVVJSSU5HOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUmVjdXJyaW5nQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVjdXJyaW5nQXBwb2ludG1lbnQtPntGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tJRCA9ICRSZWN1cnJpbmdBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UUkVDVVJSSU5HOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJEZ1dHVyZVRhc2tJRCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlRnV0dXJlVGFzayA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFza0lELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0FwcG9pbnRtZW50VGlja2V0fSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2t7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRGV0ZXJtaW5lIHRpY2tldCBjdXN0b20gdHlwZSwgaWYgc3VwcGxpZWQuCiAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gKSB7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1RpY2tldFRlbXBsYXRlfSBuZSAnQ3VzdG9tJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b219ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0Q3VzdG9tfSA9ICdyZWxhdGl2ZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VGlja2V0Q3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lfSA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCIsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lWWVhcn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lTW9udGh9LAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZURheX0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lSG91cn0sCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1RpY2tldEN1c3RvbURhdGVUaW1lTWludXRlfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBteSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRTZWxmLT57VXNlclRpbWVab25lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICAgICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPlRvT1RPQk9UaW1lWm9uZSgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0gPSAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSGFuZGxlIFRpY2tldCBDcmVhdGlvbiBvbiBBcHBvaW50bWVudAogICAgICAgIGlmICgkR2V0UGFyYW17QXBwb2ludG1lbnRUaWNrZXR9KSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0gPSB7CiAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICAgICAgICAgICAgICBPd25lcklEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICBDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEZXN0fSwKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyICAgICAgPT4gJEdldFBhcmFte1NlbGVjdGVkQ3VzdG9tZXJVc2VyfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICAgICAgU2VydmljZUlEICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgIFNMQUlEICAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+ICRHZXRQYXJhbXtUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZHN9LAogICAgICAgICAgICAgICAgJEdldFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkR2V0UGFyYW17QXBwb2ludG1lbnRUaWNrZXR9ID0gewogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGl0bGV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICAgICAgICAgICAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICAgICAgT3duZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICBDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUaWNrZXRDdXN0b219LAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJEdldFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAogICAgICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RGVzdH0sCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0N1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZEN1c3RvbWVyVXNlciAgICAgID0+ICRHZXRQYXJhbXtTZWxlY3RlZEN1c3RvbWVyVXNlcn0sCiAgICAgICAgICAgICAgICBQcmlvcml0eUlEICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgIFN0YXRlSUQgICAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICBTTEFJRCAgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICBUeXBlSUQgICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciA9PiAkR2V0UGFyYW17VGlja2V0QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lcn0sCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGRzfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICBpZiAoJUFwcG9pbnRtZW50KSB7CgogICAgICAgICAgICAjIENvbnRpbnVlIG9ubHkgaWYgY29taW5nIGZyb20gZWRpdCBzY3JlZW4KICAgICAgICAgICAgIyAgICh0aGVyZSBpcyBhdCBsZWFzdCBvbmUgcGFzc2VkIHBsdWdpbiBwYXJhbWV0ZXIpLgogICAgICAgICAgICBpZiAoQFBsdWdpblBhcmFtcykgewoKICAgICAgICAgICAgICAgICMgR2V0IGFsbCByZWxhdGVkIGFwcG9pbnRtZW50cyBiZWZvcmUgdGhlIHVwZGF0ZS4KICAgICAgICAgICAgICAgIG15IEBSZWxhdGVkQXBwb2ludG1lbnRzICA9ICggJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICk7CiAgICAgICAgICAgICAgICBteSBAQ2FsZW5kYXJBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgICAgICBDYWxlbmRhcklEID0+ICRBcHBvaW50bWVudHtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgcGFyZW50LCBpbmNsdWRlIGFueSBjaGlsZCBhcHBvaW50bWVudHMuCiAgICAgICAgICAgICAgICBwdXNoIEBSZWxhdGVkQXBwb2ludG1lbnRzLAogICAgICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgICAgICRfLT57QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ3JlcCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgJF8tPntQYXJlbnRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgJF8tPntQYXJlbnRJRH0gZXEgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBSZW1vdmUgYWxsIGV4aXN0aW5nIGxpbmtzLgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50QXBwb2ludG1lbnRJRCAoQFJlbGF0ZWRBcHBvaW50bWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRQbHVnaW5PYmplY3QtPlBsdWdpbkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEN1cnJlbnRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmtzIGNvdWxkIG5vdCBiZSBkZWxldGVkIGZvciBhcHBvaW50bWVudCAkQ3VycmVudEFwcG9pbnRtZW50SUQhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAgICAgICAgICVBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICRBcHBvaW50bWVudElEID0gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9IDogJFN1Y2Nlc3M7CgogICAgICAgIGlmICgkQXBwb2ludG1lbnRJRCkgewoKICAgICAgICAgICAgIyBDb250aW51ZSBvbmx5IGlmIGNvbWluZyBmcm9tIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICMgICAodGhlcmUgaXMgYXQgbGVhc3Qgb25lIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVyKS4KICAgICAgICAgICAgaWYgKEBQbHVnaW5QYXJhbXMpIHsKCiAgICAgICAgICAgICAgICAjIEdldCBmcmVzaCBhcHBvaW50bWVudCBkYXRhLgogICAgICAgICAgICAgICAgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIFByb2Nlc3MgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgbXkgQFJlbGF0ZWRBcHBvaW50bWVudHMgID0gKCRBcHBvaW50bWVudElEKTsKICAgICAgICAgICAgICAgIG15IEBDYWxlbmRhckFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIElmIHdlIGFyZSBkZWFsaW5nIHdpdGggYSBwYXJlbnQsIGluY2x1ZGUgYW55IGNoaWxkIGFwcG9pbnRtZW50cyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkXy0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyZXAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudElECiAgICAgICAgICAgICAgICAgICAgfSBAQ2FsZW5kYXJBcHBvaW50bWVudHM7CgogICAgICAgICAgICAgICAgIyBQcm9jZXNzIHBhc3NlZCBwbHVnaW4gcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIGZvciBteSAkUGx1Z2luUGFyYW0gKEBQbHVnaW5QYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkUGx1Z2luRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyktPkRlY29kZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkR2V0UGFyYW17JFBsdWdpblBhcmFtfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRQbHVnaW5LZXkgPSAkUGx1Z2luUGFyYW07CiAgICAgICAgICAgICAgICAgICAgJFBsdWdpbktleSA9fiBzL15QbHVnaW5fLy87CgogICAgICAgICAgICAgICAgICAgICMgRXhlY3V0ZSBsaW5rIGFkZCBtZXRob2Qgb2YgdGhlIHBsdWdpbi4KICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkUGx1Z2luRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkTGlua0lEICggQHskUGx1Z2luRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRBcHBvaW50bWVudElEIChAUmVsYXRlZEFwcG9pbnRtZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRMaW5rID0gJFBsdWdpbk9iamVjdC0+UGx1Z2luTGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkQ3VycmVudEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpbktleSAgICAgPT4gJFBsdWdpbktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luRGF0YSAgICA9PiAkTGlua0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkTGluayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgY291bGQgbm90IGJlIGNyZWF0ZWQgZm9yIGFwcG9pbnRtZW50ICRDdXJyZW50QXBwb2ludG1lbnRJRCEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICRKU09OID0gJExheW91dE9iamVjdC0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzID8gMSA6IDAsCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgQUpBWCB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYVXBkYXRlJyApIHsKCiAgICAgICAgbXkgJERlc3QgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgIyBUT0RPIENoZWNrIGhvdyB0aGlzIGlzIHVzZWQgbGF0ZXIgb24gc2luY2UgaW4gY2FzZSBvZiBleHRlcm5hbCBjdXN0b21lciB1c2VyLCBzZWxlY3RlZCBpcyBub3QgaW4gU2VsZWN0ZWRDdXN0b21lciBidXQgaW4gQ3VzdG9tZXJTZWxlY3RlZAogICAgICAgIG15ICRDdXN0b21lclVzZXIgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CiAgICAgICAgbXkgJFF1ZXVlSUQgICAgICAgID0gJyc7CgogICAgICAgICRRdWV1ZUlEID0gJERlc3Q7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJFF1ZXVlSUQ7CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Okxpc3RUeXBlJykgZXEgJ3RyZWUnICkgewogICAgICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJEF1dG9zZWxlY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwogICAgICAgIG15ICRBQ0xQcmVzZWxlY3Rpb247CiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldEFDTDo6QUNMUHJlc2VsZWN0aW9uJykgKSB7CgogICAgICAgICAgICAjIGdldCBjYWNoZWQgcHJlc2VsZWN0aW9uIHJ1bGVzCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdUaWNrZXRBQ0wnLAogICAgICAgICAgICAgICAgS2V5ICA9PiAnUHJlc2VsZWN0aW9uJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFDTFByZXNlbGVjdGlvbiApIHsKICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkRmllbGRSZXN0cmljdGlvbnNPYmplY3QtPlNldEFDTFByZXNlbGVjdGlvbkNhY2hlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVDb252ZXJnZW5jZSA9ICgKICAgICAgICAgICAgU3RkRmllbGRzID0+IDAsCiAgICAgICAgICAgIEZpZWxkcyAgICA9PiAwLAogICAgICAgICk7CiAgICAgICAgbXkgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAkRWxlbWVudENoYW5nZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoICRFbGVtZW50Q2hhbmdlZCA9PiAxICkgOiAoKTsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydCA9ICRFbGVtZW50Q2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICggJEVsZW1lbnRDaGFuZ2VkID0+IDEgKSA6ICgpOwogICAgICAgIG15ICVDaGFuZ2VkU3RkRmllbGRzICAgICAgID0gJEVsZW1lbnRDaGFuZ2VkICYmICRFbGVtZW50Q2hhbmdlZCAhfiAvXkR5bmFtaWNGaWVsZF8vID8gKCAkRWxlbWVudENoYW5nZWQgPT4gMSApIDogKCk7CgogICAgICAgIG15ICRMb29wUHJvdGVjdGlvbiA9IDEwMDsKICAgICAgICBteSAlU3RkRmllbGRWYWx1ZXM7CiAgICAgICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gKAogICAgICAgICAgICBWaXNpYmlsaXR5ID0+IHt9LAogICAgICAgICAgICBGaWVsZHMgICAgID0+IHt9LAogICAgICAgICk7CgogICAgICAgIHVudGlsICggJENvbnZlcmdlbmNle0ZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGRldGVybWluZSBzdGFuZGFyZCBmaWVsZCBpbnB1dAogICAgICAgICAgICB1bnRpbCAoICRDb252ZXJnZW5jZXtTdGRGaWVsZHN9ICkgewoKICAgICAgICAgICAgICAgIG15ICVOZXdDaGFuZ2VkRWxlbWVudHM7CgogICAgICAgICAgICAgICAgIyB3aGljaCBzdGFuZGFyZCBmaWVsZHMgdG8gY2hlY2sgLSBGaWVsZElEID0+IEdldFBhcmFtVmFsdWUgKG5lY2Nlc3NhcnkgZm9yIERlc3QpCiAgICAgICAgICAgICAgICBteSAlQ2hlY2sgPSAoCiAgICAgICAgICAgICAgICAgICAgRGVzdCAgICAgICAgPT4gJ1F1ZXVlSUQnLAogICAgICAgICAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHlJRCAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIFNlcnZpY2VJRCAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICAgICAgICAgIFNMQUlEICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgICAgICAgICAgVHlwZUlEICAgICAgPT4gJ1R5cGVJRCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRBQ0xQcmVzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBGSUVMRDoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkSUQgKCBzb3J0IGtleXMgJUNoZWNrICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uLT57RmllbGRzfXskRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkRmllbGRJRCBub3QgZGVmaW5lZCBpbiBUaWNrZXRBQ0wgcHJlc2VsZWN0aW9uIHJ1bGVzISIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPnskRmllbGRJRH0gJiYgJENoYW5nZWRFbGVtZW50c3skRmllbGRJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRWxlbWVudCAoIHNvcnQga2V5cyAlQ2hhbmdlZEVsZW1lbnRzICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBQ0xQcmVzZWxlY3Rpb24tPntSdWxlc317VGlja2V0fXskRWxlbWVudH17JEZpZWxkSUR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntJbnRlcm5hbERlcGVuZGFuY3l9eyRFbGVtZW50fXskRmllbGRJRH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRBQ0xQcmVzZWxlY3Rpb24tPntGaWVsZHN9eyRFbGVtZW50fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRFbGVtZW50IG5vdCBkZWZpbmVkIGluIFRpY2tldEFDTCBwcmVzZWxlY3Rpb24gcnVsZXMhIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdW5hZmZlY3RlZCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRDaGVja3skRmllbGRJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZm9yIGVhY2ggc3RhbmRhcmQgZmllbGQgd2hpY2ggaGFzIHRvIGJlIGNoZWNrZWQsIHJ1biB0aGUgZGVmaW5lZCBtZXRob2QKICAgICAgICAgICAgICAgIE1FVEhPRDoKICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0ZpZWxkTWV0aG9kc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IE1FVEhPRCBpZiAhJENoZWNreyAkRmllbGQtPntGaWVsZElEfSB9OwoKICAgICAgICAgICAgICAgICAgICAjIHVzZSAkQ2hlY2t7ICRGaWVsZC0+e0ZpZWxkSUR9IH0gZm9yIERlc3Q9PlF1ZXVlSUQKICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7ICRDaGVja3sgJEZpZWxkLT57RmllbGRJRH0gfSB9ID0gJEZpZWxkLT57TWV0aG9kfS0+KAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkR2V0UGFyYW17VGlja2V0UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTdGRGaWVsZFZhbHVlc3tUaWNrZXRTZXJ2aWNlSUR9IHx8IHVuZGVmLCAgICAjIG5lZWRlZCBmb3IgU0xBSUQKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHNwZWNpYWwgc3R1ZmYgZm9yIFF1ZXVlSUQvRGVzdDogRGVzdCBpcyAiUXVldWVJRHx8UXVldWVOYW1lIiA9PiAiUXVldWVOYW1lIjsKICAgICAgICAgICAgICAgICAgICBpZiAoICRGaWVsZC0+e0ZpZWxkSUR9IGVxICdEZXN0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgVE9zOgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJXsgJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFRPcyBpZiAoICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfXskUXVldWVJRH0gZXEgJy0nICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RkRmllbGRWYWx1ZXN7RGVzdH17JFF1ZXVlSUR9ID0gJFN0ZEZpZWxkVmFsdWVze1F1ZXVlSUR9eyRRdWV1ZUlEfTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBjdXJyZW50IHNlbGVjdGlvbiBvZiBRdWV1ZUlEIChEZXN0IHdpbGwgYmUgZG9uZSB0b2dldGhlciB3aXRoIHRoZSBvdGhlciBmaWVsZHMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEdldFBhcmFte1F1ZXVlSUR9ICYmICEkU3RkRmllbGRWYWx1ZXN7RGVzdH17ICRHZXRQYXJhbXtEZXN0fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ID0gJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICMgYXV0b3NlbGVjdAogICAgICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkR2V0UGFyYW17UXVldWVJRH0gJiYgJEF1dG9zZWxlY3QgJiYgJEF1dG9zZWxlY3QtPntEZXN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtRdWV1ZUlEfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyA9PiAkU3RkRmllbGRWYWx1ZXN7UXVldWVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHdoZXRoZXIgY3VycmVudCBzZWxlY3RlZCB2YWx1ZSBpcyBzdGlsbCB2YWxpZCBmb3IgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0KICAgICAgICAgICAgICAgICAgICAgICAgJiYgISRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfXsgJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBpZiBub3QgZW1wdHkgdGhlIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSAgICAgICAgICAgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgJE5ld0NoYW5nZWRFbGVtZW50c3sgJEZpZWxkLT57RmllbGRJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhdXRvc2VsZWN0CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJEdldFBhcmFteyAkRmllbGQtPntGaWVsZElEfSB9ICYmICRBdXRvc2VsZWN0ICYmICRBdXRvc2VsZWN0LT57ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEZpZWxkLT57RmllbGRJRH0gfSA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+QXV0b3NlbGVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzID0+ICRTdGRGaWVsZFZhbHVlc3sgJEZpZWxkLT57RmllbGRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17ICRGaWVsZC0+e0ZpZWxkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmV3Q2hhbmdlZEVsZW1lbnRzeyAkRmllbGQtPntGaWVsZElEfSB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDaGFuZ2VkU3RkRmllbGRzeyAkRmllbGQtPntGaWVsZElEfSB9ICAgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggISVOZXdDaGFuZ2VkRWxlbWVudHMgKSB7CiAgICAgICAgICAgICAgICAgICAgJENvbnZlcmdlbmNle1N0ZEZpZWxkc30gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyA9ICVOZXdDaGFuZ2VkRWxlbWVudHM7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoCiAgICAgICAgICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQsCiAgICAgICAgICAgICAgICAgICAgJU5ld0NoYW5nZWRFbGVtZW50cywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkTG9vcFByb3RlY3Rpb24tLSA8IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSYW4gaW50byB1bnJlc29sdmFibGUgbG9vcCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50cyAgICAgICAgPSAlQ2hhbmdlZEVsZW1lbnRzREZTdGFydDsKICAgICAgICAgICAgJUNoYW5nZWRFbGVtZW50c0RGU3RhcnQgPSAoKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJUN1ckZpZWxkU3RhdGVzOwogICAgICAgICAgICBpZiAoJUNoYW5nZWRFbGVtZW50cykgewoKICAgICAgICAgICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgJUN1ckZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRPYmplY3QgICAgICAgICAgICAgID0+ICRUaWNrZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkU2VsZi0+e0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9PiAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBDaGFuZ2VkRWxlbWVudHMgICAgICAgICAgID0+IFwlQ2hhbmdlZEVsZW1lbnRzLCAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXIgICAgICAgICAgICAgID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEF1dG9zZWxlY3QgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gPT4gJEFDTFByZXNlbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjb21iaW5lIEZpZWxkU3RhdGVzCiAgICAgICAgICAgICAgICAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSA9IHsKICAgICAgICAgICAgICAgICAgICAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tGaWVsZHN9IH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgICAgICV7ICRDdXJGaWVsZFN0YXRlc3tWaXNpYmlsaXR5fSB9LAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9ID0gewogICAgICAgICAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgIyBpZiBkeW5hbWljIGZpZWxkcyBjaGFuZ2VkLCBjaGVjayBzdGFuZGFyZCBmaWVsZHMgYWdhaW4KICAgICAgICAgICAgaWYgKCAlQ3VyRmllbGRTdGF0ZXMgJiYgSXNIYXNoUmVmV2l0aERhdGEoICRDdXJGaWVsZFN0YXRlc3tOZXdWYWx1ZXN9ICkgKSB7CiAgICAgICAgICAgICAgICAkQ29udmVyZ2VuY2V7U3RkRmllbGRzfSA9IDA7CiAgICAgICAgICAgICAgICAlQ2hhbmdlZEVsZW1lbnRzID0gbWFwIHsgJF8gPT4gMSB9IGtleXMgJXsgJEN1ckZpZWxkU3RhdGVze05ld1ZhbHVlc30gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRDb252ZXJnZW5jZXtGaWVsZHN9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICB9CgogICAgICAgICMgdXBkYXRlIER5bmFtaWMgRmllbGRzIFBvc3NpYmxlIFZhbHVlcyB2aWEgQUpBWAogICAgICAgIG15IEBEeW5hbWljRmllbGRBSkFYOwoKICAgICAgICAjIGN5Y2xlIHRocm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICRJbmRleCAoIHNvcnQga2V5cyAleyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfSB9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGR9LT5bJEluZGV4XTsKCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JEluZGV4fXtOb3RBQ0xSZWR1Y2libGV9CiAgICAgICAgICAgICAgICA/ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0KICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyRJbmRleH17UG9zc2libGVWYWx1ZXN9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0ifSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JEluZGV4fXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfSJ9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGRlZmluZSBkeW5hbWljIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0gKSApIHsKICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdHJpY3Rpb25zX1Zpc2liaWxpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkRHluRmllbGRTdGF0ZXN7VmlzaWJpbGl0eX0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEFKQVggcmV0dXJuIGZvciB0aGUgc3RhbmRhcmQgZmllbGRzCiAgICAgICAgbXkgQFN0ZEZpZWxkQUpBWDsKICAgICAgICBteSAlQXR0cmlidXRlcyA9ICgKICAgICAgICAgICAgRGVzdCA9PiB7CiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIE5leHRTdGF0ZUlEID0+IHsKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gewogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2VydmljZUlEID0+IHsKICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU0xBSUQgPT4gewogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFR5cGVJRCA9PiB7CiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgZGVsZXRlICRTdGRGaWVsZFZhbHVlc3tRdWV1ZUlEfTsKICAgICAgICBmb3IgbXkgJEZpZWxkICggc29ydCBrZXlzICVTdGRGaWVsZFZhbHVlcyApIHsKICAgICAgICAgICAgcHVzaCBAU3RkRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRGaWVsZCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFN0ZEZpZWxkVmFsdWVzeyRGaWVsZH0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRHZXRQYXJhbXskRmllbGR9LAogICAgICAgICAgICAgICAgJXsgJEF0dHJpYnV0ZXN7JEZpZWxkfSB9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIEBTdGRGaWVsZEFKQVgsCiAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQUpBWCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBkZWxldGUgbWFzawogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0RlbGV0ZUFwcG9pbnRtZW50JyApIHsKCiAgICAgICAgaWYgKCAkR2V0UGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRHZXRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gMDsKICAgICAgICAgICAgbXkgJEVycm9yICAgPSAnJzsKCiAgICAgICAgICAgICMgUHJldmVudCBkZWxldGluZyB0aWNrZXQgYXBwb2ludG1lbnQuCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50e1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSApIHsKICAgICAgICAgICAgICAgICRFcnJvciA9IFRyYW5zbGF0YWJsZSgnQ2Fubm90IGRlbGV0ZSB0aWNrZXQgYXBwb2ludG1lbnQhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgIyBHZXQgYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGJlZm9yZSB0aGUgZGVsZXRpb24uCiAgICAgICAgICAgICAgICBteSBAUmVsYXRlZEFwcG9pbnRtZW50cyAgPSAoICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICAgICAgbXkgQENhbGVuZGFyQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgd2UgYXJlIGRlYWxpbmcgd2l0aCBhIHBhcmVudCwgaW5jbHVkZSBhbnkgY2hpbGQgYXBwb2ludG1lbnRzLgogICAgICAgICAgICAgICAgcHVzaCBAUmVsYXRlZEFwcG9pbnRtZW50cywKICAgICAgICAgICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgICAgICAgICAkXy0+e0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGdyZXAgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRfLT57UGFyZW50SUR9CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRfLT57UGFyZW50SUR9IGVxICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfQogICAgICAgICAgICAgICAgICAgIH0gQENhbGVuZGFyQXBwb2ludG1lbnRzOwoKICAgICAgICAgICAgICAgICMgUmVtb3ZlIGFsbCBleGlzdGluZyBsaW5rcy4KICAgICAgICAgICAgICAgIGZvciBteSAkQ3VycmVudEFwcG9pbnRtZW50SUQgKEBSZWxhdGVkQXBwb2ludG1lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkUGx1Z2luT2JqZWN0LT5QbHVnaW5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRDdXJyZW50QXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMaW5rcyBjb3VsZCBub3QgYmUgZGVsZXRlZCBmb3IgYXBwb2ludG1lbnQgJEN1cnJlbnRBcHBvaW50bWVudElEISIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yID0gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9ucyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTdWNjZXNzICAgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICAgICAgICAgIEVycm9yICAgICAgICAgPT4gJEVycm9yLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEdldFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyB1cGRhdGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGRhdGVQcmVmZXJlbmNlcycgKSB7CgogICAgICAgIG15ICRTdWNjZXNzID0gMDsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59ICYmICgKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEZWZhdWx0Vmlld30gfHwgJEdldFBhcmFte0NhbGVuZGFyU2VsZWN0aW9ufQogICAgICAgICAgICAgICAgfHwgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkKICAgICAgICAgICAgICAgIHx8ICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleTsKICAgICAgICAgICAgbXkgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAnJzsKCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte0RlZmF1bHRWaWV3fSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ID0gJ0RlZmF1bHRWaWV3JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtDYWxlbmRhclNlbGVjdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdDYWxlbmRhclNlbGVjdGlvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkR2V0UGFyYW17U2hvd25SZXNvdXJjZXN9ICYmICRHZXRQYXJhbXtUZWFtSUR9ICkgewogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXkgICAgICAgPSAnU2hvd25SZXNvdXJjZXMnOwogICAgICAgICAgICAgICAgJFByZWZlcmVuY2VLZXlTdWZmaXggPSAiLSRHZXRQYXJhbXtUZWFtSUR9IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtTaG93bkFwcG9pbnRtZW50c30gKSB7CiAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZUtleSA9ICdTaG93bkFwcG9pbnRtZW50cyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlcicgLiAkR2V0UGFyYW17T3ZlcnZpZXdTY3JlZW59IC4gJFByZWZlcmVuY2VLZXkgLiAkUHJlZmVyZW5jZUtleVN1ZmZpeCwKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkR2V0UGFyYW17JFByZWZlcmVuY2VLZXl9LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGVsc2lmICggJEdldFBhcmFte092ZXJ2aWV3U2NyZWVufSAmJiAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIG15ICRQcmVmZXJlbmNlS2V5OwogICAgICAgICAgICBteSAkUHJlZmVyZW5jZUtleVN1ZmZpeCA9ICcnOwoKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzdG9yZURlZmF1bHRTZXR0aW5nc30gZXEgJ1Nob3duUmVzb3VyY2VzJyAmJiAkR2V0UGFyYW17VGVhbUlEfSApIHsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5ICAgICAgID0gJ1Nob3duUmVzb3VyY2VzJzsKICAgICAgICAgICAgICAgICRQcmVmZXJlbmNlS2V5U3VmZml4ID0gIi0kR2V0UGFyYW17VGVhbUlEfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYmxhbmsgdXNlciBwcmVmZXJlbmNlcwogICAgICAgICAgICAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyJyAuICRHZXRQYXJhbXtPdmVydmlld1NjcmVlbn0gLiAkUHJlZmVyZW5jZUtleSAuICRQcmVmZXJlbmNlS2V5U3VmZml4LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICcnLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgU3VjY2VzcyA9PiAkU3VjY2VzcywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgdGVhbSBsaXN0IHNlbGVjdGlvbiB1cGRhdGUKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdUZWFtVXNlckxpc3QnICkgewogICAgICAgIG15IEBUZWFtSURzID0gJFBhcmFtT2JqZWN0LT5HZXRBcnJheSggUGFyYW0gPT4gJ1RlYW1JRFtdJyApOwogICAgICAgIG15ICVUZWFtVXNlckxpc3RBbGw7CgogICAgICAgICMgQ2hlY2sgaWYgdGVhbSBvYmplY3QgaXMgcmVnaXN0ZXJlZC4KICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OlRlYW0nLCBTaWxlbnQgPT4gMSApICkgewogICAgICAgICAgICBteSAkVGVhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6VGVhbScpOwogICAgICAgICAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgICAgICAgICBURUFNSUQ6CiAgICAgICAgICAgIGZvciBteSAkVGVhbUlEIChAVGVhbUlEcykgewogICAgICAgICAgICAgICAgbmV4dCBURUFNSUQgaWYgISRUZWFtSUQ7CgogICAgICAgICAgICAgICAgIyBnZXQgbGlzdCBvZiB0ZWFtIG1lbWJlcnMKICAgICAgICAgICAgICAgIG15ICVUZWFtVXNlckxpc3QgPSAkVGVhbU9iamVjdC0+VGVhbVVzZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFRlYW1JRCA9PiAkVGVhbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVRlYW1Vc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICBteSAlVXNlciA9ICRVc2VyT2JqZWN0LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkVGVhbVVzZXJMaXN0eyRVc2VySUR9ID0gJFVzZXJ7VXNlckZ1bGxuYW1lfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAlVGVhbVVzZXJMaXN0QWxsID0gKCAlVGVhbVVzZXJMaXN0QWxsLCAlVGVhbVVzZXJMaXN0ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgSlNPTiBvdXRwdXQKICAgICAgICAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGVhbVVzZXJMaXN0ID0+IFwlVGVhbVVzZXJMaXN0QWxsLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgfQoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbicsCiAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICk7Cn0KCnN1YiBfRGF5T2Zmc2V0R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgR2V0IG9yaWdpbmFsIGRhdGUgY29tcG9uZW50cy4KICAgIG15ICRPcmlnaW5hbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkT3JpZ2luYWxUaW1lU2V0dGluZ3MgPSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5HZXQoKTsKCiAgICAjIEdldCBkZXN0aW5hdGlvbiB0aW1lIGFjY29yZGluZyB0byB1c2VyIHRpbWV6b25lLgogICAgbXkgJERlc3RpbmF0aW9uVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAkRGVzdGluYXRpb25UaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0gKTsKICAgIG15ICREZXN0aW5hdGlvblRpbWVTZXR0aW5ncyA9ICREZXN0aW5hdGlvblRpbWVPYmplY3QtPkdldCgpOwoKICAgICMgQ29tcGFyZSBkYXlzIG9mIHR3byB0aW1lcy4KICAgIGlmICggJE9yaWdpbmFsVGltZVNldHRpbmdzLT57RGF5fSA9PSAkRGVzdGluYXRpb25UaW1lU2V0dGluZ3MtPntEYXl9ICkgewogICAgICAgIHJldHVybiAwOyAgICAjIHNhbWUgZGF5CiAgICB9CiAgICBlbHNpZiAoICRPcmlnaW5hbFRpbWVPYmplY3QgPiAkRGVzdGluYXRpb25UaW1lT2JqZWN0ICkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFRvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1RvczsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpICkgewogICAgICAgICVOZXdUb3MgPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFNlbGVjdGlvblR5cGUgUXVldWUgb3IgU3lzdGVtQWRkcmVzcz8KICAgICAgICBteSAlVG9zOwogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyktPlN5c3RlbUFkZHJlc3NRdWV1ZUxpc3QoKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgKTsKICAgICAgICBteSAkU3lzdGVtQWRkcmVzc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzJyk7CiAgICAgICAgbXkgJFF1ZXVlT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgUVVFVUVJRDoKICAgICAgICBmb3IgbXkgJFF1ZXVlSUQgKCBzb3J0IGtleXMgJVRvcyApIHsKCiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkUXVldWVPYmplY3QtPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgUVVFVUVJRCBpZiAhJFVzZXJHcm91cHN7ICRRdWV1ZURhdGF7R3JvdXBJRH0gfTsKCiAgICAgICAgICAgIG15ICRTdHJpbmcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwoKICAgICAgICAgICAgIyByZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgIGlmICggISRRdWV1ZURhdGF7Q29tbWVudH0gKSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFN5c3RlbUFkZHJlc3NPYmplY3QtPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwoKICAgIHJldHVybiBcJU5ld1RvczsKfQoKc3ViIF9HZXRUeXBlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFN0YXRlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgbXkgJU5leHRTdGF0ZXM7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVOZXh0U3RhdGVzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdGF0ZUxpc3QoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIFwlTmV4dFN0YXRlczsKfQoKc3ViIF9HZXRTZXJ2aWNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNlcnZpY2UKICAgIG15ICVTZXJ2aWNlOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBzZXR0aW5nIGN1c3RvbWVyIHVzZXIgaWQKICAgICRQYXJhbXtDdXN0b21lclVzZXJJRH0gPSAkUGFyYW17U2VsZWN0ZWRDdXN0b21lclVzZXJ9OwoKICAgICMgZ2V0IG9wdGlvbnMgZm9yIGRlZmF1bHQgc2VydmljZXMgZm9yIHVua25vd24gY3VzdG9tZXJzCiAgICBteSAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1RpY2tldDo6U2VydmljZTo6RGVmYXVsdDo6VW5rbm93bkN1c3RvbWVyJyk7CgogICAgIyBjaGVjayBpZiBubyBDdXN0b21lclVzZXJJRCBpcyBzZWxlY3RlZAogICAgIyBpZiAkRGVmYXVsdFNlcnZpY2VVbmtub3duQ3VzdG9tZXIgPSAwIGxlYXZlIEN1c3RvbWVyVXNlcklEIGVtcHR5LCBpdCB3aWxsIG5vdCBnZXQgYW55IHNlcnZpY2VzCiAgICAjIGlmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciA9IDEgc2V0IEN1c3RvbWVyVXNlcklEIHRvIGdldCBkZWZhdWx0IHNlcnZpY2VzCiAgICBpZiAoICEkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICYmICREZWZhdWx0U2VydmljZVVua25vd25DdXN0b21lciApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ID0gJzxERUZBVUxUPic7CiAgICB9CgogICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGRlZmF1bHQgUXVldWUgaWYgbm9uZSBpcyBwcm92aWRlZAogICAgJFBhcmFte1F1ZXVlSUR9ID0gJFBhcmFte1F1ZXVlSUR9IHx8IDE7CgogICAgIyBnZXQgc2VydmljZXMgaWYgdGhleSB3ZXJlIG5vdCBkZXRlcm1pbmVkIGluIGFuIEFKQVggY2FsbAogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17U2VydmljZXN9ICkgewogICAgICAgICRQYXJhbXtTZXJ2aWNlc30gPSAkU2VsZi0+X0dldFNlcnZpY2VzKCVQYXJhbSk7CiAgICB9CgogICAgIyBnZXQgc2xhCiAgICBteSAlU0xBOwogICAgaWYgKCAkUGFyYW17U2VydmljZUlEfSAmJiAkUGFyYW17U2VydmljZXN9ICYmICV7ICRQYXJhbXtTZXJ2aWNlc30gfSApIHsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlc30tPnsgJFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgJVNMQSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0U0xBTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNMQTsKfQojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCjE7Cg==</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentAppointmentEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjMTRjYTU1YThiMWQzZDY4NmU4MDNjMTM5ODgxM2I4M2QyMjA5MWU1IC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudEFwcG9pbnRtZW50RWRpdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJFZGl0TWFzayIpICVdCjxkaXYgY2xhc3M9IklubmVyQ29udGVudCI+CiAgICA8Zm9ybSBpZD0iRWRpdEFwcG9pbnRtZW50Rm9ybSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJDaGFsbGVuZ2VUb2tlbiIgbmFtZT0iQ2hhbGxlbmdlVG9rZW4iIHZhbHVlPSJbJSBFbnYoIlVzZXJDaGFsbGVuZ2VUb2tlbiIpIHwgaHRtbCAlXSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBY3Rpb24iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IlslIEVudigiQWN0aW9uIikgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlN1YmFjdGlvbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iRWRpdEFwcG9pbnRtZW50Ii8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkFwcG9pbnRtZW50SUQiIG5hbWU9IkFwcG9pbnRtZW50SUQiIHZhbHVlPSJbJSBEYXRhLkFwcG9pbnRtZW50SUQgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmluZyIgbmFtZT0iUmVjdXJyaW5nIiB2YWx1ZT0iWyUgRGF0YS5SZWN1cnJpbmcgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VEYXlzIiBuYW1lPSJSZWN1cnJlbmNlRGF5cyIgdmFsdWU9IlslIERhdGEuUmVjdXJyZW5jZURheXMgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VNb250aHMiIG5hbWU9IlJlY3VycmVuY2VNb250aHMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VNb250aHMgfCBodG1sICVdIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IlJlY3VycmVuY2VNb250aERheXMiIG5hbWU9IlJlY3VycmVuY2VNb250aERheXMiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VNb250aERheXMgfCBodG1sICVdIi8+CiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBSkFYQWN0aW9uIiBuYW1lPSJBSkFYQWN0aW9uIiB2YWx1ZT0iWyUgRW52KCJBY3Rpb24iKSAlXSIgLz4KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiQmFzaWMgaW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpdGxlIlslIElGIERhdGEuUGVybWlzc2lvbkxldmVsID49IDIgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+WyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXTxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIEVORCAlXVslIFRyYW5zbGF0ZSgiVGl0bGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iVGl0bGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPVslIERhdGEuVGlja2V0SUQgJV0iPlslIERhdGEuVGl0bGUgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgPC9wPgpbJSBFTFNFICVdClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpdGxlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaXRsZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGl0bGUiIG5hbWU9IlRpdGxlIiB2YWx1ZT0iWyUgRGF0YS5UaXRsZSB8IGh0bWwgJV0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCIgLz4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaXRsZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkRlc2NyaXB0aW9uIj5bJSBUcmFuc2xhdGUoIkRlc2NyaXB0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIG5hbWU9IkRlc2NyaXB0aW9uIiBjbGFzcz0iVzc1cGMiIHJvd3M9IjQiPlslIERhdGEuRGVzY3JpcHRpb24gfCBodG1sICVdPC90ZXh0YXJlYT4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkxvY2F0aW9uIj5bJSBUcmFuc2xhdGUoIkxvY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTG9jYXRpb24iIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkxvY2F0aW9uIHx8ICItIiB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iTG9jYXRpb24iIG5hbWU9IkxvY2F0aW9uIiB2YWx1ZT0iWyUgRGF0YS5Mb2NhdGlvbiB8IGh0bWwgJV0iIGNsYXNzPSJXNTBwYyIgLz4KWyUgRU5EICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxvY2F0aW9uTGluayIpICVdCiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iTG9jYXRpb25MaW5rIEhpZGRlbiBbJSBEYXRhLkNTU0NsYXNzIHwgaHRtbCAlXSIgaHJlZj0iWyUgRGF0YS5VUkwgfCBodG1sICVdWyUgRGF0YS5Mb2NhdGlvbiB8IHVyaSAlXSIgZGF0YS1iYXNlLXVybD0iWyUgRGF0YS5VUkwgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuVGV4dCkgfCBodG1sICVdIiB0YXJnZXQ9IlslIERhdGEuVGFyZ2V0IHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIFslIERhdGEuSWNvbk5hbWUgfCBodG1sICVdIj48L2k+CiAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJMb2NhdGlvbkxpbmsiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJDYWxlbmRhcklEIlslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0gY2xhc3M9Ik1hbmRhdG9yeSJbJSBFTkQgJV0+ClslIElGICFEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEICYmIERhdGEuUGVybWlzc2lvbkxldmVsID49IDMgJV0KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ClslIEVORCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDYWxlbmRhciIpIHwgaHRtbCAlXToKICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlRpY2tldEFwcG9pbnRtZW50UnVsZUlEIHx8IERhdGEuUGVybWlzc2lvbkxldmVsIDwgMyAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IkNhbGVuZGFySUQiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLkNhbGVuZGFyTmFtZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuQ2FsZW5kYXJJRFN0cmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkNhbGVuZGFySURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+ClslIElGIERhdGEuVGVhbUlEU3RyZyAlXQogICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgPGxlZ2VuZD48c3Bhbj5bJSBUcmFuc2xhdGUoIlJlc291cmNlIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUZWFtSUQiPlslIFRyYW5zbGF0ZSgiVGVhbSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRlYW1JRCIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuVGVhbU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlRlYW1JRFN0cmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlJlc291cmNlSUQiPlslIFRyYW5zbGF0ZSgiQWdlbnQiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZXNvdXJjZUlEIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5SZXNvdXJjZU5hbWVzICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlc291cmNlSURTdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2ZpZWxkc2V0PgpbJSBFTkQgJV0KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJEYXRlL1RpbWUiKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXJ0RGF5Ij5bJSBUcmFuc2xhdGUoIlN0YXJ0IGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiAoIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5SZWFkT25seVN0YXJ0ICkgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iU3RhcnREYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLlN0YXJ0RGF0ZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgpbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdGFydERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGJlZm9yZSBFbmQgZGF0ZS4iKSB8IGh0bWwgJV08L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIFslIERhdGEuU3RhcnREYXRlU3RyaW5nICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJFbmREYXkiPlslIFRyYW5zbGF0ZSgiRW5kIGRhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiAoIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5SZWFkT25seUR1cmF0aW9uICkgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iRW5kRGF5IiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5FbmREYXRlIHwgTG9jYWxpemUoIlRpbWVMb25nIikgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkVuZERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkVuZERhdGVTdHJpbmcgJV0KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFsbERheSI+WyUgVHJhbnNsYXRlKCJBbGwtZGF5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5UaWNrZXRBcHBvaW50bWVudFJ1bGVJRCB8fCBEYXRhLlBlcm1pc3Npb25MZXZlbCA8IDIgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJBbGxEYXkiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5BbGxEYXlTdHJpbmcpIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iQWxsRGF5IiBuYW1lPSJBbGxEYXkiIFslIERhdGEuQWxsRGF5Q2hlY2tlZCAlXSAvPgpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVjdXJyZW5jZVR5cGUiPlslIFRyYW5zbGF0ZSgiUmVwZWF0IikgfCBodG1sICVdOjwvbGFiZWw+ClslIElGIERhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgfHwgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QYXJlbnRJRCAlXQogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkVkaXRQYXJlbnQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBzZWUgdGhlIHBhcmVudCBhcHBvaW50bWVudC4iKSB8IGh0bWwgJV08L2E+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIDxwIGlkPSJSZWN1cnJlbmNlVHlwZSIgY2xhc3M9IlJlYWRPbmx5VmFsdWUiPlslIERhdGEuUmVjdXJyZW5jZVZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRU5EICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTFNFICVdClslIElGIERhdGEuUGFyZW50SUQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaGlzIGFuIG9jY3VycmVuY2Ugb2YgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPGJyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IkVkaXRQYXJlbnQiPlslIFRyYW5zbGF0ZSgiQ2xpY2sgaGVyZSB0byBlZGl0IHRoZSBwYXJlbnQgYXBwb2ludG1lbnQuIikgfCBodG1sICVdPC9hPgogICAgICAgICAgICA8L2Rpdj4KWyUgRUxTRSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VUeXBlU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdiI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZEV4cGxhbmF0aW9uIj4KICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZyZXF1ZW5jeSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJFdmVyeSIpIHwgaHRtbCAlXToKICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuUmVjdXJyZW5jZUludGVydmFsU3RyaW5nICVdCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9IlJlY3VycmVuY2VJbnRlcnZhbFRleHQiPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dERheSBIaWRkZW4iPlslIFRyYW5zbGF0ZSgiZGF5KHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dFdlZWsgSGlkZGVuIj5bJSBUcmFuc2xhdGUoIndlZWsocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJUZXh0TW9udGggSGlkZGVuIj5bJSBUcmFuc2xhdGUoIm1vbnRoKHMpIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iVGV4dFllYXIgSGlkZGVuIj5bJSBUcmFuc2xhdGUoInllYXIocykiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkRheXMiIG5hbWU9IkRheXMiIHZhbHVlPSJbJSBEYXRhLkRheXMgJV0iIC8+CgojIFdlZWtseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHZhbHVlPSIxIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJNb25kYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNb24iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjIiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlR1ZXNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUdWUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjMiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIldlZG5lc2RheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIldlZCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNCIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVGh1cnNkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJUaHUiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkZyaWRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkZyaSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iNiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2F0dXJkYXkiKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJTYXQiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IjciIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlN1bmRheSIpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlN1biIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIFdlZWtseSB0YWJsZSBlbmQKCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCIgaWQ9IlJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ik1vbnRoRGF5cyIgbmFtZT0iTW9udGhEYXlzIiB2YWx1ZT0iWyUgRGF0YS5Nb250aERheXMgJV0iIC8+CgojIE1vbnRobHkgdGFibGUgc3RhcnQKICAgICAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9IkJ1dHRvblRhYmxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgpbJSBDb3VudCA9IDEgJV0KWyUgV0hJTEUgQ291bnQgPCAzMiAlXQpbJSBJRiBDb3VudCAlIDcgPT0gMSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgpbJSBFTkQgJV0KCiMgam9pbiBzdHJpbmdzIChNb250aGx5MSwgTW9udGhseTIsLi4uKQpbJSBNb250aGx5Q291bnQgPSAiTW9udGhseSIgXyBDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iWyUgQ291bnQgJV0iIHRpdGxlPSJbJSBDb3VudCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBDb3VudCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgpbJSBJRiBDb3VudCAlIDcgPT0gMCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KWyUgRU5EICVdCgpbJSBDb3VudCA9IENvdW50ICsgMSAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgojIE1vbnRobHkgdGFibGUgZW5kCgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2Ij4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgogICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT24iKSB8IGh0bWwgJV06CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9Ik1vbnRocyIgbmFtZT0iTW9udGhzIiB2YWx1ZT0iWyUgRGF0YS5Nb250aHMgJV0iIC8+CgojIFllYXJseSB0YWJsZSBzdGFydAogICAgICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz0iQnV0dG9uVGFibGUiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkphbnVhcnkiKSB8IGh0bWwgJV0iIHZhbHVlPSIxIiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkphbiIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJGZWJydWFyeSIpIHwgaHRtbCAlXSIgdmFsdWU9IjIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRmViIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk1hcmNoIikgfCBodG1sICVdIiB2YWx1ZT0iMyIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJNYXIiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQXByaWwiKSB8IGh0bWwgJV0iIHZhbHVlPSI0IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIkFwciIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiTWF5X2xvbmciKSB8IGh0bWwgJV0iIHZhbHVlPSI1IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIk1heSIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJKdW5lIikgfCBodG1sICVdIiB2YWx1ZT0iNiIgPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJKdW4iKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImZjIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iZmMtYnV0dG9uIGZjLXN0YXRlLWRlZmF1bHQiIHR5cGU9ImJ1dHRvbiIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiSnVseSIpIHwgaHRtbCAlXSIgdmFsdWU9IjciID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiSnVsIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkF1Z3VzdCIpIHwgaHRtbCAlXSIgdmFsdWU9IjgiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiQXVnIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZXB0ZW1iZXIiKSB8IGh0bWwgJV0iIHZhbHVlPSI5IiA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoIlNlcCIpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iZmMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJmYy1idXR0b24gZmMtc3RhdGUtZGVmYXVsdCIgdHlwZT0iYnV0dG9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJPY3RvYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTAiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiT2N0IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIk5vdmVtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTEiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiTm92IikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJmYyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9ImZjLWJ1dHRvbiBmYy1zdGF0ZS1kZWZhdWx0IiB0eXBlPSJidXR0b24iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkRlY2VtYmVyIikgfCBodG1sICVdIiB2YWx1ZT0iMTIiID4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgiRGVjIikgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiMgWWVhcmx5IHRhYmxlIGVuZAoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VMaW1pdERpdiIgY2xhc3M9IkZpZWxkIEhpZGRlbiI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VMaW1pdFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZVVudGlsRGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJlY3VycmVuY2VVbnRpbERheUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJJbnZhbGlkIGRhdGUhIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIHNldCB0aGlzIHRvIHZhbHVlIGFmdGVyIFN0YXJ0IGRhdGUuIikgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlJlY3VycmVuY2VVbnRpbFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0iUmVjdXJyZW5jZUNvdW50RGl2IiBjbGFzcz0iRmllbGQgSGlkZGVuIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iUmVjdXJyZW5jZUNvdW50IiBuYW1lPSJSZWN1cnJlbmNlQ291bnQiIHZhbHVlPSJbJSBEYXRhLlJlY3VycmVuY2VDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQpbJSBFTkQgJV0KICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdPC9zcGFuPjwvbGVnZW5kPgoKICAgICAgICAgICAgPGxhYmVsIGZvcj0iTm90aWZpY2F0aW9uVGVtcGxhdGUiPlslIFRyYW5zbGF0ZSgiTm90aWZpY2F0aW9uIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPCAyICVdCiAgICAgICAgICAgICAgICA8cCBpZD0iTm90aWZpY2F0aW9uVGVtcGxhdGUiIGNsYXNzPSJSZWFkT25seVZhbHVlIj5bJSBEYXRhLk5vdGlmaWNhdGlvblZhbHVlIHwgaHRtbCAlXTwvcD4KWyUgRUxTRSAlXQogICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25TdHJnICVdClslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiIGlkPSJOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYiPgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiPlslIFRyYW5zbGF0ZSgiUmVsYXRpdmUgcG9pbnQgb2YgdGltZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgoKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24iPgoKICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQiIHZhbHVlPSIiIGlkPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0IiBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXRSYWRpbyAlXT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZElubGluZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9Ik5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCIgdmFsdWU9IlslIERhdGEuTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgfCBodG1sICVdIiBzaXplPSIxIiBtYXhsZW5ndGg9IjIiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21Vbml0c1N0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLk5vdGlmaWNhdGlvbkN1c3RvbVVuaXRzUG9pbnRPZlRpbWVTdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSW5wdXQiPlslIFRyYW5zbGF0ZSgiRGF0ZS9UaW1lIikgfCBodG1sICVdOjwvbGFiZWw+CgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5Ob3RpZmljYXRpb25DdXN0b21EYXRlVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICA8L2ZpZWxkc2V0PgoKWyUgSUYgRGF0YS5QbHVnaW5MaXN0ICVdCiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICA8bGVnZW5kPjxzcGFuPlslIFRyYW5zbGF0ZSgiTGluayIpIHwgaHRtbCAlXTwvc3Bhbj48L2xlZ2VuZD4KWyUgRk9SRUFDSCBLZXkgSU4gRGF0YS5QbHVnaW5MaXN0LmtleXMgJV0KICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZShEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5OYW1lKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgpbJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdCiAgICAgICAgICAgICAgICA8aW5wdXQgaWQ9IlslIEtleSB8IGh0bWwgJV0iIHR5cGU9InRleHQiIGRhdGEtcGx1Z2luLWtleT0iWyUgS2V5IHwgaHRtbCAlXSIgZGF0YS1wbHVnaW4tdXJsPSJbJSBEYXRhLlBsdWdpbkxpc3QuJEtleS5QbHVnaW5VUkwgfCBodG1sICVdIiBjbGFzcz0iUGx1Z2luRmllbGQgVzkwcGMiIC8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iUGx1Z2luX1slIEtleSB8IGh0bWwgJV0iIG5hbWU9IlBsdWdpbl9bJSBLZXkgfCBodG1sICVdIiB2YWx1ZT0nWyUgRGF0YS5QbHVnaW5MaXN0LiRLZXkuTGlua0xpc3QgfHwgIltdIiAlXScgLz4KWyUgRUxTRSAlXQpbJSBJRiBEYXRhLlBsdWdpbkRhdGEuJEtleS5zaXplID09IDAgJV0KICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJSZWFkT25seVZhbHVlIj4tPC9wPgpbJSBFTkQgJV0KWyUgRU5EICVdCiMga2VlcCBmb2xsb3dpbmcgYmxvY2sgb24gYSBzaW5nbGUgbGluZSwgc28gOmVtcHR5IENTUyBzZWxlY3RvciB3b3VsZCB3b3JrIQogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGx1Z2luQ29udGFpbmVyX1slIEtleSB8IGh0bWwgJV0iWyUgSUYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPj0gMiAlXSBjbGFzcz0iUGx1Z2luQ29udGFpbmVyIlslIEVORCAlXT5bJSBGT1JFQUNIIExpbmsgSU4gRGF0YS5QbHVnaW5EYXRhLiRLZXkgJV08ZGl2IGNsYXNzPSJMaW5rX1slIExpbmsuTGlua0lEIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgTGluay5MaW5rVVJMICVdIj5bJSBMaW5rLkxpbmtOYW1lIHwgaHRtbCAlXTwvYT5bJSBJRiBEYXRhLlBlcm1pc3Npb25MZXZlbCA+PSAyICVdPGEgY2xhc3M9IlJlbW92ZUJ1dHRvbiIgaHJlZj0iIyIgZGF0YS1wbHVnaW4ta2V5PSJbJSBLZXkgfCBodG1sICVdIiBkYXRhLWxpbmstaWQ9IlslIExpbmsuTGlua0lEIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiUmVtb3ZlIGVudHJ5IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT48c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9hPlslIEVORCAlXQogICAgICAgICAgICAgICAgPC9kaXY+WyUgRU5EICVdPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIEVORCAlXQogICAgICAgIDwvZmllbGRzZXQ+ClslIEVORCAlXQojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsZWdlbmQ+PHNwYW4+WyUgVHJhbnNsYXRlKCJUaWNrZXQgQ3JlYXRpb24iKSB8IGh0bWwgJV08L3NwYW4+PC9sZWdlbmQ+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpY2tldFRlbXBsYXRlIj5bJSBUcmFuc2xhdGUoIlRpY2tldCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBUaWNrZXRUZW1wbGF0ZVNlbGVjdGlvbiI+ClslIElGIERhdGEuUGVybWlzc2lvbkxldmVsIDwgMiAlXQogICAgICAgICAgICAgICAgPHAgaWQ9IlRpY2tldFRlbXBsYXRlIiBjbGFzcz0iUmVhZE9ubHlWYWx1ZSI+WyUgRGF0YS5UaWNrZXRWYWx1ZSB8IGh0bWwgJV08L3A+ClslIEVMU0UgJV0KICAgICAgICAgICAgICAgIFslIERhdGEuVGlja2V0U3RyZyAlXQpbJSBFTkQgJV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCIgY2xhc3M9IkFwcG9pbnRtZW50VGlja2V0Q3VzdG9tVGltZSI+WyUgVHJhbnNsYXRlKCJSZWxhdGl2ZSBwb2ludCBvZiB0aW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkRXhwbGFuYXRpb24gQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCIgdmFsdWU9IiIgaWQ9IlRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQiIFslIERhdGEuVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dFJhZGlvICVdPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRJbmxpbmUiPgogICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQiIG5hbWU9IlRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50IiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCB8IGh0bWwgJV0iIHNpemU9IjEiIG1heGxlbmd0aD0iMiIgLz4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJTcGFjaW5nVG9wU21hbGwiPgogICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLlRpY2tldEN1c3RvbVVuaXRzU3RyZyAlXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNwYWNpbmdUb3BTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuVGlja2V0Q3VzdG9tVW5pdHNQb2ludE9mVGltZVN0cmcgJV0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dCIgY2xhc3M9IkFwcG9pbnRtZW50VGlja2V0Q3VzdG9tVGltZSI+WyUgVHJhbnNsYXRlKCJEYXRlL1RpbWUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGRFeHBsYW5hdGlvbiBBcHBvaW50bWVudFRpY2tldEN1c3RvbVRpbWUiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InJhZGlvIiBuYW1lPSJUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0IiB2YWx1ZT0iIiBpZD0iVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dCIgWyUgRGF0YS5UaWNrZXRDdXN0b21EYXRlVGltZUlucHV0UmFkaW8gJV0+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlRpY2tldEN1c3RvbURhdGVUaW1lU3RyZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgaWQ9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiB2YWx1ZT0iWyUgRGF0YS5UaWNrZXRTZWxlY3RlZEN1c3RvbWVyVXNlciB8IGh0bWwgJV0iLz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJGcm9tQ3VzdG9tZXIiIGNsYXNzPSJNYW5kYXRvcnkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRnJvbUN1c3RvbWVyIiB0eXBlPSJ0ZXh0IiBuYW1lPSJGcm9tQ3VzdG9tZXIiIHZhbHVlPSIiIGNsYXNzPSJDdXN0b21lckF1dG9Db21wbGV0ZSBXNzVwYyBbJSBEYXRhLkZyb21JbnZhbGlkIHwgaHRtbCAlXSIgYXV0b2NvbXBsZXRlPSJvZmYiIC8+CiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJGcm9tQ3VzdG9tZXJTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJGcm9tU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgIDxwPlslIFRyYW5zbGF0ZSgiUGxlYXNlIGluY2x1ZGUgYXQgbGVhc3Qgb25lIGN1c3RvbWVyIGZvciB0aGUgdGlja2V0LiIpIHwgaHRtbCAlXTwvcD4KWyUgUmVuZGVyQmxvY2tFbmQoIkZyb21TZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFslIERhdGEuQ3VzdG9tZXJIaWRkZW5Db250YWluZXIgfCBodG1sICVdIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkN1c3RvbWVyVGlja2V0VGVtcGxhdGVGcm9tQ3VzdG9tZXIgU3BhY2luZ1RvcFNtYWxsIEhpZGRlbiI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IG5hbWU9IkN1c3RvbWVyU2VsZWN0ZWQiIHRpdGxlPSJbJSBUcmFuc2xhdGUoIlNlbGVjdCB0aGlzIGN1c3RvbWVyIGFzIHRoZSBtYWluIGN1c3RvbWVyLiIpIHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyU2VsZWN0ZWQiIGNsYXNzPSJDdXN0b21lclRpY2tldFJhZGlvIiB0eXBlPSJyYWRpbyIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleSIgaWQ9IkN1c3RvbWVyS2V5IiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJDdXN0b21lciB1c2VyIikgfCBodG1sICVdIiBuYW1lPSJDdXN0b21lclRpY2tldFRleHQiIGlkPSJDdXN0b21lclRpY2tldFRleHQiIHR5cGU9InRleHQiIHZhbHVlPSIiIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iUmVtb3ZlQ3VzdG9tZXJUaWNrZXQiIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiPgogICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0iZmEgZmEtbWludXMtc3F1YXJlLW8iPjwvaT4KICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPlslIFRyYW5zbGF0ZSgiUmVtb3ZlIFRpY2tldCBDdXN0b21lciBVc2VyIikgfCBodG1sICVdPC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldEN1c3RvbWVyQ29udGVudEZyb21DdXN0b21lciIgY2xhc3M9IkN1c3RvbWVyQ29udGFpbmVyIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiTXVsdGlwbGVDdXN0b21lciIpICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iU3BhY2luZ1RvcFNtYWxsICI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclNlbGVjdGVkIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJTZWxlY3QgdGhpcyBjdXN0b21lciBhcyB0aGUgbWFpbiBjdXN0b21lci4iKSB8IGh0bWwgJV0iIGlkPSJDdXN0b21lclNlbGVjdGVkX1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJDdXN0b21lclRpY2tldFJhZGlvIiB0eXBlPSJyYWRpbyIgdmFsdWU9IlslIERhdGEuQ291bnQgfCBodG1sICVdIiBbJSBEYXRhLkN1c3RvbWVyU2VsZWN0ZWQgfCBodG1sICVdICBbJSBEYXRhLkN1c3RvbWVyRGlzYWJsZWQgfCBodG1sICVdIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lcktleV9bJSBEYXRhLkNvdW50IHwgaHRtbCAlXSIgaWQ9IkN1c3RvbWVyS2V5X1slIERhdGEuQ291bnQgfCBodG1sICVdIiBjbGFzcz0iQ3VzdG9tZXJLZXkiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJLZXkgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ3VzdG9tZXJUaWNrZXRUZXh0IFJhZGlvIFslIERhdGEuQ3VzdG9tZXJFcnJvciB8IGh0bWwgJV0iIHRpdGxlPSJbJSBUcmFuc2xhdGUoIkN1c3RvbWVyIHVzZXIiKSB8IGh0bWwgJV0iIG5hbWU9IkN1c3RvbWVyVGlja2V0VGV4dF9bJSBEYXRhLkNvdW50ICVdIiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV0iIHR5cGU9InRleHQiIHZhbHVlPSJbJSBEYXRhLkN1c3RvbWVyRWxlbWVudCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iIGNsYXNzPSJSZW1vdmVCdXR0b24gQ3VzdG9tZXJUaWNrZXRSZW1vdmUiIG5hbWU9IlJlbW92ZUN1c3RvbWVyVGlja2V0X1slIERhdGEuQ291bnQgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLW1pbnVzLXNxdWFyZS1vIj48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iSW52aXNpYmxlVGV4dCI+WyUgVHJhbnNsYXRlKCJSZW1vdmUgVGlja2V0IEN1c3RvbWVyIFVzZXIiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KClslIFJlbmRlckJsb2NrU3RhcnQoIkN1c3RvbWVyRXJyb3JFeHBsYW50aW9uIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkV4cGxhbmF0aW9uIEVycm9yIj5bJSBUcmFuc2xhdGUoIlBsZWFzZSByZW1vdmUgdGhpcyBlbnRyeSBhbmQgZW50ZXIgYSBuZXcgb25lIHdpdGggdGhlIGNvcnJlY3QgdmFsdWUuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJFcnJvckV4cGxhbnRpb24iKSAlXQoKICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRUZXh0X1slIERhdGEuQ291bnQgJV1TZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJDdXN0b21lckdlbmVyaWNTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiQ3VzdG9tZXJHZW5lcmljU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5bJSBUcmFuc2xhdGUoIlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZE1YU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJETlMgcHJvYmxlbSwgcGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBhbmQgdGhlIGVycm9yIGxvZy4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJbnZhbGlkRE5TU2VydmVyRXJyb3JNc2ciKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIikgfCBodG1sICVdPC9wPgpbJSBSZW5kZXJCbG9ja0VuZCgiSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiSXNEdXBsaWNhdGVkU2VydmVyRXJyb3JNc2ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+WyUgVHJhbnNsYXRlKCJUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4iKSB8IGh0bWwgJV08L3A+ClslIFJlbmRlckJsb2NrRW5kKCJJc0R1cGxpY2F0ZWRTZXJ2ZXJFcnJvck1zZyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lciIpICVdCgogICAgICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrU3RhcnQoIk11bHRpcGxlQ3VzdG9tZXJDb3VudGVyIikgJV0KICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXIiIGlkPSJDdXN0b21lclRpY2tldENvdW50ZXJGcm9tQ3VzdG9tZXIiIHR5cGU9ImhpZGRlbiIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJDb3VudGVyIHwgaHRtbCAlXSIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiTXVsdGlwbGVDdXN0b21lckNvdW50ZXIiKSAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDdXN0b21lcklEIiBpZD0iQ3VzdG9tZXJJRCIgdmFsdWU9IlslIERhdGEuQ3VzdG9tZXJJRCB8IGh0bWwgJV0iIHJlYWRvbmx5PSJyZWFkb25seSIvPgpbJSBJRiBEYXRhLlR5cGVIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGlja2V0VHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgnVHlwZScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuVHlwZUhUTUxTdHJpbmcgJV0KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldFR5cGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpY2tldFR5cGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIEVORCAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCdRdWV1ZScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUXVldWVIVE1MU3RyaW5nICVdCiAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBJRiBEYXRhLlNlcnZpY2VIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTZXJ2aWNlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPlslIFRyYW5zbGF0ZSgiU2VydmljZSIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TZXJ2aWNlSFRNTFN0cmluZyAlXQogICAgICAgICAgICAgICAgWyUgSUYgRGF0YS5TZXJ2aWNlTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlNlcnZpY2UgaW52YWxpZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIFslIElGIERhdGEuU0xBTWFuZGF0b3J5ICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTTEFJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTFNFICVdCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+WyUgVHJhbnNsYXRlKCJTZXJ2aWNlIExldmVsIEFncmVlbWVudCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICBbJSBFTkQgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5TTEFIVE1MU3RyaW5nICVdCiAgICAgICAgICAgICAgICBbJSBJRiBEYXRhLlNMQU1hbmRhdG9yeSAlXQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNMQUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTTEFJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgIFslIEVORCAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgRU5EICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iUHJpb3JpdHkiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+WyUgVHJhbnNsYXRlKCdQcmlvcml0eScpIHwgaHRtbCAlXTwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgIFslIERhdGEuUHJpb3JpdHlIVE1MU3RyaW5nICVdCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5leHRTdGF0ZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPlslIFRyYW5zbGF0ZSgnU3RhdGUnKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLlN0YXRlSFRNTFN0cmluZyAlXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICA8bGFiZWwgZm9yPSJUaWNrZXRBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyIj5bJSBUcmFuc2xhdGUoJ0FydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXInKSB8IGh0bWwgJV08L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgbmFtZT0iVGlja2V0QXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciIgaWQ9IlRpY2tldEFydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXIiIHZhbHVlPSIiIFslIERhdGEuQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciB8IGh0bWwgJV0gdHlwZT0iY2hlY2tib3giIC8+CiAgICAgICAgICAgIDwvZGl2PgpbJSBGT1JFQUNIIER5bmFtaWNGaWVsZCBJTiBEYXRhLkR5bmFtaWNGaWVsZEhUTUwgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICBbJSBEeW5hbWljRmllbGQuTGFiZWwgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgWyUgRHluYW1pY0ZpZWxkLkZpZWxkICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBFTkQgJV0KICAgICAgIDwvZmllbGRzZXQ+CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgPC9mb3JtPgo8L2Rpdj4KCjxkaXYgY2xhc3M9IkNvbnRlbnRGb290ZXIgQ2VudGVyIj4KWyUgSUYgIURhdGEuUGVybWlzc2lvbkxldmVsIHx8IERhdGEuUGVybWlzc2lvbkxldmVsID4gMSAlXQogICAgPGJ1dHRvbiBpZD0iRWRpdEZvcm1TdWJtaXQiIGNsYXNzPSJQcmltYXJ5IENhbGxGb3JBY3Rpb24iIHZhbHVlPSJbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV0iPjxzcGFuPjxpIGNsYXNzPSJmYSBmYS1jaGVjay1zcXVhcmUtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybUNvcHkiIGNsYXNzPSJDYWxsRm9yQWN0aW9uIiB2YWx1ZT0iWyUgVHJhbnNsYXRlKCJDb3B5IikgfCBodG1sICVdIj48c3Bhbj48aSBjbGFzcz0iZmEgZmEtZmlsZXMtbyI+PC9pPiBbJSBUcmFuc2xhdGUoIkNvcHkiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+ClslIEVORCAlXQpbJSBJRiBEYXRhLkFwcG9pbnRtZW50SUQgJiYgIURhdGEuVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgJiYgRGF0YS5QZXJtaXNzaW9uTGV2ZWwgPiAyICVdCiAgICA8YnV0dG9uIGlkPSJFZGl0Rm9ybURlbGV0ZSIgY2xhc3M9IkNhbGxGb3JBY3Rpb24iPjxzcGFuPlslIFRyYW5zbGF0ZSgiRGVsZXRlIikgfCBodG1sICVdPC9zcGFuPjwvYnV0dG9uPgpbJSBFTkQgJV0KICAgIDxidXR0b24gaWQ9IkVkaXRGb3JtQ2FuY2VsIiBjbGFzcz0iQ2FsbEZvckFjdGlvbiI+PHNwYW4+WyUgVHJhbnNsYXRlKCJDYW5jZWwiKSB8IGh0bWwgJV08L3NwYW4+PC9idXR0b24+CjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiRWRpdE1hc2siKSAlXQo=</File>
        <File Location="Custom/Kernel/System/Calendar/Appointment.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBlNDRjMThhZWE5YWJjMTI1ZmRkZjljZWVlZDIwNGRiNGZhYjI5MGUwIC0gS2VybmVsL1N5c3RlbS9DYWxlbmRhci9BcHBvaW50bWVudC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDYWxlbmRhcjo6QXBwb2ludG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgcGFyZW50IHF3KEtlcm5lbDo6U3lzdGVtOjpFdmVudEhhbmRsZXIpOwoKIyBjb3JlIG1vZHVsZXMKdXNlIERpZ2VzdDo6TUQ1ICgpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCAtIGNhbGVuZGFyIGFwcG9pbnRtZW50IGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgYXBwb2ludG1lbnQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQXBwb2ludG1lbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdBcHBvaW50bWVudENhbGVuZGFyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQXBwb2ludG1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRDcmVhdGUoKQoKY3JlYXRlcyBhIG5ldyBhcHBvaW50bWVudC4KCiAgICBteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHZhbGlkIFBhcmVudElEIGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIHZhbGlkIENhbGVuZGFySUQKICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgICAgPT4gJ2p3aW9qaS1md2ppbycsICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgcHJvdmlkZSBkZXNpcmVkIFVuaXF1ZUlEOyBpZiB0aGVyZSBpcyBhbHJlYWR5IGV4aXN0aW5nIEFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIHdpdGggc2FtZSBVbmlxdWVJRCwgc3lzdGVtIHdpbGwgZGVsZXRlIGl0CiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFRpdGxlCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsICAgICAgICAgIyAob3B0aW9uYWwpIERlc2NyaXB0aW9uCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIExvY2F0aW9uCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMAogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICA9PiBbIDEgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICA9PiBbIDEsIDMgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSBpZiBzdXBwbGllZAogICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBmbGFnIHRoZSBhcHBvaW50bWVudCBhcyByZWN1cnJpbmcgKHBhcmVudCBvbmx5ISkKICAgICAgICBSZWN1cnJpbmdSYXcgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgc2tpcCBsb29wIGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzIChkbyBub3QgY3JlYXRlIG9jY3VycmVuY2VzISkKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgPT4gJ0RhaWx5JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBSZWN1cnJpbmcpIFBvc3NpYmxlICJEYWlseSIsICJXZWVrbHkiLCAiTW9udGhseSIsICJZZWFybHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCgogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgICA9PiBbMSwgMywgNV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIEN1c3RvbSBSZWN1cnJpbmcpIFJlY3VycmVuY2UgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21XZWVrbHk6IDEtTW9uLCAyLVR1ZSwuLi4sIDctU3VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbU1vbnRobHk6IDEtMXN0LCAyLTJuZCwuLiwgMzF0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21ZZWFybHk6IDEtSmFuLCAyLUZlYiwuLi4sIDEyLURlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEhvdyBtYW55IEFwcG9pbnRtZW50cyB0byBjcmVhdGUKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUmVwZWF0aW5nIGludGVydmFsIChkZWZhdWx0IDEpCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFVudGlsIGRhdGUKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRXhwZWN0ZWQgc3RhcnQgdGltZSBmb3IgdGhpcyBvY2N1cnJlbmNlCiAgICAgICAgUmVjdXJyZW5jZUV4Y2x1ZGUgICAgID0+IFsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFdoaWNoIHNwZWNpZmljIG9jY3VycmVuY2VzIHRvIGV4Y2x1ZGUKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgdGltZSB0byBleGVjdXRlIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgPT4gJ0N1c3RvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGVtcGxhdGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVHlwZSBvZiB0aGUgY3VzdG9tIHRlbXBsYXRlIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJyZWxhdGl2ZSIsICJkYXRldGltZSIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyBjb3VudCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgdW5pdCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIGV4ZWN1dGUgZm9yIGN1c3RvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgImJlZm9yZXN0YXJ0IiwgImFmdGVyc3RhcnQiLCAiYmVmb3JlZW5kIiwgImFmdGVyZW5kIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBOb3RpZmljYXRpb24gZGF0ZSB0aW1lIGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgSUQgKGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERhdGEgZm9yIHRpY2tldCBjcmVhdGlvbgogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIHRpY2tldCBjcmVhdCBldmVudAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICBDdXN0b20gPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgdGlja2V0IHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnICAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgICAgIEN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBRdWV1ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgcXVldWUKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIGlkCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAndGVzdEB0ZXN0LmNvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBjdXN0b21lciB1c2VyCiAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0+ICd0ZXN0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgVXNlcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHVzZXIgaWQKICAgICAgICAgICAgT3duZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IG93bmVyIGlkCiAgICAgICAgICAgIExvY2sgPT4gJ3VubG9jaycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBsb2NrIHN0YXRlCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBwcmlvcml0eQogICAgICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc3RhdGUKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UKICAgICAgICAgICAgU0xBSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2VyIHNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50CiAgICAgICAgICAgIFR5cGVJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCB0eXBlIGlkCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5hbWUgdmFsdWUgY29tYmluYXRpb25zIGZvciBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTEgPT4gVmFsdWUxLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTIgPT4gVmFsdWUyLAogICAgICAgICAgICB9LAogICAgICAgICAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBJZiB0aGUgZmlyc3QgVGlja2V0IEFydGljbGUgaXMgdmlzaWJsZSBmb3IgdGhlIEN1c3RvbWVyCiAgICAgICAgfSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICApOwoKcmV0dXJucyBwYXJlbnQgQXBwb2ludG1lbnRJRCBpZiBzdWNjZXNzZnVsCgpFdmVudHM6CiAgICBBcHBvaW50bWVudENyZWF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgJFNlbGYtPl9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAjIGlmIFJlY3VycmluZyBpcyBwcm92aWRlZCwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIG11c3QgYmUgcHJlc2VudAogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgbXkgQFJlY3VycmVuY2VUeXBlcyA9ICgKICAgICAgICAgICAgIkRhaWx5IiwgICAgICAgIldlZWtseSIsICAgICAgICJNb250aGx5IiwgICAgICAgIlllYXJseSIsCiAgICAgICAgICAgICJDdXN0b21EYWlseSIsICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte1JlY3VycmVuY2VUeXBlfQogICAgICAgICAgICB8fCAhZ3JlcCB7ICRfIGVxICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gfSBAUmVjdXJyZW5jZVR5cGVzCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVHlwZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAhJFBhcmFte1JlY3VycmVuY2VGcmVxdWVuY3l9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlRnJlcXVlbmN5IG5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9IHx8PSAxOwoKICAgIGlmICggJFBhcmFte1VuaXF1ZUlEfSAmJiAhJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgICAgIFVuaXF1ZUlEICAgPT4gJFBhcmFte1VuaXF1ZUlEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgYXBwb2ludG1lbnQgd2l0aCBzYW1lIFVuaXF1ZUlECiAgICAgICAgaWYgKCAlQXBwb2ludG1lbnQgJiYgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUGFyZW50SUQKICAgIGlmICggJFBhcmFte1BhcmVudElEfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17UGFyZW50SUR9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQYXJlbnRJRCBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDaGVjayBTdGFydFRpbWUuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBTdGFydFRpbWUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIFVuaXF1ZUlECiAgICBpZiAoICEkUGFyYW17VW5pcXVlSUR9ICkgewogICAgICAgICRQYXJhbXtVbmlxdWVJRH0gPSAkU2VsZi0+R2V0VW5pcXVlSUQoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICBTdGFydFRpbWUgID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBDaGVjayBFbmRUaW1lLgogICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgRW5kVGltZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYXJyYXkgcmVmcwogICAgbXkgJUFycmF5czsKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhUZWFtSUQgUmVzb3VyY2VJRCBSZWN1cnJlbmNlRnJlcXVlbmN5IFJlY3VycmVuY2VFeGNsdWRlKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiBAeyAkUGFyYW17JFBhcmFtZXRlcn0gLy8gW10gfSApIHsKICAgICAgICAgICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbm90IEFSUkFZUkVGISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQXJyYXkgPSBAeyAkUGFyYW17JFBhcmFtZXRlcn0gfTsKCiAgICAgICAgICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgICAgICAgICAgQEFycmF5ID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAQXJyYXk7CgogICAgICAgICAgICAkQXJyYXlzeyRQYXJhbWV0ZXJ9ID0gam9pbiggJywnLCBAQXJyYXkgKSBpZiBAQXJyYXk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgbnVtYmVycwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFJlY3VycmluZyBSZWN1cnJlbmNlQ291bnQgUmVjdXJyZW5jZUludGVydmFsKQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICRQYXJhbXskUGFyYW1ldGVyfSAmJiAhSXNJbnRlZ2VyKCAkUGFyYW17JFBhcmFtZXRlcn0gKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbWV0ZXIgbXVzdCBiZSBhIG51bWJlciEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgUmVjdXJyZW5jZVVudGlsCiAgICBpZiAoICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ICkgewoKICAgICAgICAjIFVzdWFsbHkgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgPSAwLiBJbiB0aGlzIGNhc2UsIHRha2UgdGltZSBmcm9tIFN0YXJ0VGltZS4KICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFRpbWUgICAgICAgICA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICApOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFJlY3VycmVuY2VVbnRpbE9iamVjdAogICAgICAgICAgICB8fCAkU3RhcnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBSZWN1cnJlbmNlVW50aWwhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgQEJpbmQ7CgogICAgIyBwYXJlbnQgSUQgc3VwcGxpZWQKICAgIG15ICRQYXJlbnRJRENvbCA9IG15ICRQYXJlbnRJRFZhbCA9ICcnOwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRQYXJlbnRJRENvbCA9ICdwYXJlbnRfaWQsJzsKICAgICAgICAkUGFyZW50SURWYWwgPSAnPywnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17UGFyZW50SUR9OwoKICAgICAgICAjIHR1cm4gb2ZmIGFsbCByZWN1cnJpbmcgZmllbGRzCiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJpbmd9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlQ291bnR9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VVbnRpbH07CiAgICB9CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtVbmlxdWVJRH0sIFwkUGFyYW17VGl0bGV9LCBcJFBhcmFte0Rlc2NyaXB0aW9ufSwKICAgICAgICBcJFBhcmFte0xvY2F0aW9ufSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1N0YXJ0VGltZX0sICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfSwgICBcJFBhcmFte0FsbERheX0sCiAgICAgICAgXCRBcnJheXN7VGVhbUlEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRBcnJheXN7UmVzb3VyY2VJRH0sICAgICAgICAgIFwkUGFyYW17UmVjdXJyaW5nfSwgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSwKICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VJRH0sICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUV4Y2x1ZGV9LAogICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uRGF0ZX0sICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgIFwkUGFyYW17VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LCAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9OwoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgSU5TRVJUIElOVE8gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgKCRQYXJlbnRJRENvbCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnkpCiAgICAgICAgVkFMVUVTICgkUGFyZW50SURWYWwgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywgPywKICAgICAgICAgICAgPywgPywgY3VycmVudF90aW1lc3RhbXAsID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KQogICAgIjsKCiAgICAjIGNyZWF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15ICRBcHBvaW50bWVudElEOwoKICAgICMgcmV0dXJuIHBhcmVudCBpZCBmb3IgYXBwb2ludG1lbnQgb2NjdXJyZW5jZXMKICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRQYXJhbXtQYXJlbnRJRH07CiAgICB9CgogICAgIyBnZXQgYXBwb2ludG1lbnQgaWQgZm9yIHBhcmVudCBhcHBvaW50bWVudAogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAgICAgV0hFUkUgdW5pcXVlX2lkID0gPyBBTkQgcGFyZW50X2lkIElTIE5VTEwKICAgICAgICAgICAgJywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkQXBwb2ludG1lbnRJRCA9ICRSb3dbMF0gfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBpZiB0aGVyZSBpcyBub3QgYXBwb2ludG1lbnQgY3JlYXRlZAogICAgICAgIGlmICggISRBcHBvaW50bWVudElEICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ2FuXCd0IGdldCBBcHBvaW50bWVudElEIGZyb20gSU5TRVJUIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSAmJiAhJFBhcmFte1JlY3VycmluZ1Jhd30gKSB7CiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBpZiAoICRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0gJiYgISRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgbXkgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEID0gMDsKICAgICAgICBteSAkRXhlY3V0aW9uVGltZTsKICAgICAgICBteSAkQ3VycmVudERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewoKICAgICAgICAgICAgIyBHZXQgbmVhcmVzdCB1cGNvbWluZyBldmVudAogICAgICAgICAgICAjIElmIGFsbCBldmVudHMgYXJlIGluIHRoZSBwYXN0LCBubyBmdXR1cmUgdGFzayBpcyBjcmVhdGVkCiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkU2VsZi0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlUGFyZW50QXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQgKTsKICAgICAgICAgICAgdW5zaGlmdCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKCiAgICAgICAgICAgICAgICAjIFRha2Ugc21hbGxlc3QgcG9zaXRpdmUgZGlzdGFuY2UgZnJvbSBjdXJyZW50IHRpbWUKICAgICAgICAgICAgICAgICMgVGFrZSBleGVjdXRpb24gdGltZSBvZiBmdXR1cmUgdGFzayBhcyByZWZlcmVuY2UKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRBcHBvaW50bWVudC0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJEFwcG9pbnRtZW50LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPkNvbXBhcmUoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgKSA+IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEID0gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAgICAgJEV4ZWN1dGlvblRpbWUgICAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTZWxmLT5BcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldFRlbXBsYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+Q29tcGFyZSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnREYXRlVGltZU9iamVjdCApID4gMCApIHsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudElEOwogICAgICAgICAgICAgICAgJEV4ZWN1dGlvblRpbWUgICAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCkgewogICAgICAgICAgICBteSAkVGFza0lEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0FkZCgKICAgICAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJEV4ZWN1dGlvblRpbWUsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgICAgICA9PiAkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFRhc2tJRCkgewogICAgICAgICAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSAkVGFza0lEOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGlja2V0IHRhc2sgZm9yIGFwcG9pbnRtZW50ICRBcHBvaW50bWVudElEIGNvdWxkIG5vdCBiZSBjcmVhdGVkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU1FMID0gIgogICAgICAgICAgICAgICAgVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgICAgICAgICBTRVQgZnV0dXJlX3Rhc2tfaWQgPSA/CiAgICAgICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAgICAgIjsKICAgICAgICAgICAgQEJpbmQgPSAoIFwkVGFza0lELCBcJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEICk7CgogICAgICAgICAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgICAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGZpcmUgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50Q3JlYXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJEFwcG9pbnRtZW50SUQ7Cn0KCj1oZWFkMiBBcHBvaW50bWVudExpc3QoKQoKZ2V0IGEgaGFzaCBvZiBBcHBvaW50bWVudHMuCgogICAgbXkgQEFwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRpdGxlLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBkZXNjcmlwdGlvbiwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgTG9jYXRpb24gICAgICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgbG9jYXRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHN0YXJ0IGRhdGUKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgID0+ICcyMDE2LTAyLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBlbmQgZGF0ZQogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IHRlYW0KICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSByZXNvdXJjZQojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBwYXJlbnQgaWQsIHJldHVybnMgb25seSBjaGlsZHJlbgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBSZXN1bHQgICAgICAgICAgICAgID0+ICdIQVNIJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpLCBIQVNIfEFSUkFZCiAgICApOwoKcmV0dXJucyBhbiBhcnJheSBvZiBoYXNoZXMgd2l0aCBzZWxlY3QgQXBwb2ludG1lbnQgZGF0YSBvciBzaW1wbGUgYXJyYXkgb2YgQXBwb2ludG1lbnRJRHM6CgpSZXN1bHQgPT4gJ0hBU0gnOgoKICAgIEBBcHBvaW50bWVudHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+IDEsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgID0+ICcyMDE2LTAxLTAxIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgPT4gMCwKICAgICAgICAgICAgUmVjdXJyaW5nICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciByZWN1cnJpbmcgKHBhcmVudCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAyLAogICAgICAgICAgICBQYXJlbnRJRCAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZm9yIHJlY3VycmVkIChjaGlsZCkgYXBwb2ludG1lbnRzIG9ubHkKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLAogICAgICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxODAwMDAtQTc4QjU3QGxvY2FsaG9zdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgID0+ICdIb3cgdG8gdXNlIFByb2Nlc3MgdGlja2V0cy4uLicsCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgICAgIFN0YXJ0VGltZSAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBFbmRUaW1lICAgICAgID0+ICcyMDE2LTAxLTAyIDE3OjAwOjAwJywKICAgICAgICAgICAgVGVhbUlEICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgQWxsRGF5ICAgICAgICA9PiAwLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgICAgICAgICAgICAgICAgID0+IDMsCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTgwMDAwLUE3OEI1N0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgIFRpbWV6b25lSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEgXSwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBbIDEsIDMgXSwKICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjoxMDowMCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJ3JlbGF0aXZlJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAnMTAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYWZ0ZXJzdGFydCcsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MDA6MDAnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAgICMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEKICAgICAgICB9LAogICAgICAgIC4uLgogICAgKTsKClJlc3VsdCA9PiAnQVJSQVknOgoKICAgIEBBcHBvaW50bWVudHMgPSAoIDEsIDIsIC4uLiApCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDYWxlbmRhcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgb3V0cHV0IGFycmF5IG9mIGhhc2hlcyBieSBkZWZhdWx0CiAgICAkUGFyYW17UmVzdWx0fSA9ICRQYXJhbXtSZXN1bHR9IHx8ICdIQVNIJzsKCiAgICAjIGNhY2hlIGtleXMKICAgIG15ICRDYWNoZVR5cGUgICAgICAgID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9OwogICAgbXkgJENhY2hlS2V5VGl0bGUgICAgPSAkUGFyYW17VGl0bGV9ICAgICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RGVzYyAgICAgPSAkUGFyYW17RGVzY3JpcHRpb259IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5TG9jYXRpb24gPSAkUGFyYW17TG9jYXRpb259ICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5U3RhcnQgICAgPSAkUGFyYW17U3RhcnRUaW1lfSAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RW5kICAgICAgPSAkUGFyYW17RW5kVGltZX0gICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5VGVhbSAgICAgPSAkUGFyYW17VGVhbUlEfSAgICAgIHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5UmVzb3VyY2UgPSAkUGFyYW17UmVzb3VyY2VJRH0gIHx8ICdhbnknOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkQ2FjaGVLZXlQYXJlbnQgPSAkUGFyYW17UGFyZW50SUR9IHx8ICdhbnknOwoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUaXRsZX0gJiYgJFBhcmFte1RpdGxlfSA9fiAvXltcKl0rJC8gKSB7CiAgICAgICAgJENhY2hlS2V5VGl0bGUgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17RGVzY3JpcHRpb259ICYmICRQYXJhbXtEZXNjcmlwdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleURlc2MgPSAnYW55JzsKICAgIH0KICAgIGlmICggZGVmaW5lZCAkUGFyYW17TG9jYXRpb259ICYmICRQYXJhbXtMb2NhdGlvbn0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleUxvY2F0aW9uID0gJ2FueSc7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICBteSAkQ2FjaGVLZXkgPSAiJENhY2hlS2V5VGl0bGUtJENhY2hlS2V5RGVzYy0kQ2FjaGVLZXlMb2NhdGlvbi0kQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQtJENhY2hlS2V5VGVhbS0kQ2FjaGVLZXlSZXNvdXJjZS0kUGFyYW17UmVzdWx0fSI7CiAgICBteSAkQ2FjaGVLZXkgPSAiJENhY2hlS2V5VGl0bGUtJENhY2hlS2V5RGVzYy0kQ2FjaGVLZXlMb2NhdGlvbi0kQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQtJENhY2hlS2V5VGVhbS0kQ2FjaGVLZXlSZXNvdXJjZS0kQ2FjaGVLZXlQYXJlbnQtJFBhcmFte1Jlc3VsdH0iOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgKTsKCiAgICBpZiAoIHJlZiAkRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgIHJldHVybiBAeyREYXRhfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGNoZWNrIHRpbWUKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgbXkgJFNRTCA9ICcKIyAgICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAojICAgICAgICAgICAgIGVuZF90aW1lLCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgYWxsX2RheSwgcmVjdXJyaW5nLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZAojICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAojICAgICAgICAgV0hFUkUgY2FsZW5kYXJfaWQ9PwojICAgICAnOwogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKICAgICAgICAgICAgZW5kX3RpbWUsIHRlYW1faWQsIHJlc291cmNlX2lkLCBhbGxfZGF5LCByZWN1cnJpbmcsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGZ1dHVyZV90YXNrX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkID0gPwogICAgJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgbXkgQEJpbmQ7CgogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtDYWxlbmRhcklEfTsKCiAgICAjIEZpbHRlciB0aXRsZSwgZGVzY3JpcHRpb24gYW5kIGxvY2F0aW9uIGZpZWxkcyBieSB1c2luZyBRdWVyeUNvbmRpdGlvbiBtZXRob2QsIHdoaWNoIHdpbGwKICAgICMgICByZXR1cm4gYmFja2VuZCBzcGVjaWZpYyBTUUwgc3RhdGVtZW50cyBpbiBvcmRlciB0byBwcm92aWRlIGNhc2UgaW5zZW5zaXRpdmUgbWF0Y2ggYW5kCiAgICAjICAgd2lsZGNhcmQgc3VwcG9ydC4KICAgIEZJTFRFUjoKICAgIGZvciBteSAkRmlsdGVyIChxdyhUaXRsZSBEZXNjcmlwdGlvbiBMb2NhdGlvbikpIHsKICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJFBhcmFteyRGaWx0ZXJ9OwogICAgICAgICRTUUwgLj0gJyBBTkQgJyAuICREQk9iamVjdC0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiBsYyAkRmlsdGVyLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFBhcmFteyRGaWx0ZXJ9LAogICAgICAgICAgICBTZWFyY2hQcmVmaXggPT4gJyonLAogICAgICAgICAgICBTZWFyY2hTdWZmaXggPT4gJyonLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgKAogICAgICAgICAgICAoc3RhcnRfdGltZSA+PSA/IEFORCBzdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGVuZF90aW1lID4gPyBBTkQgZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKHN0YXJ0X3RpbWUgPD0gPyBBTkQgZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCBlbmRfdGltZSA+PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAhJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EIHN0YXJ0X3RpbWUgPD0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17RW5kVGltZX07CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIGlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSBAUmVzdWx0OwoKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoIC8sLywgJFJvd1s5XSAvLyAnJyApOwogICAgICAgIGlmICggJFBhcmFte1RlYW1JRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICFncmVwIHsgJF8gPT0gJFBhcmFte1RlYW1JRH0gfSBAVGVhbUlEOwogICAgICAgIH0KCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgICRSb3dbMTBdID0gJFJvd1sxMF0gPyAkUm93WzEwXSA6IDA7CiAgICAgICAgbXkgQFJlc291cmNlSUQgPSAkUm93WzEwXSA9fiAvLC8gPyBzcGxpdCggLywvLCAkUm93WzEwXSApIDogKCAkUm93WzEwXSApOwogICAgICAgIGlmICggJFBhcmFte1Jlc291cmNlSUR9ICkgewogICAgICAgICAgICBuZXh0IFJPVyBpZiAhZ3JlcCB7ICRfID09ICRQYXJhbXtSZXNvdXJjZUlEfSB9IEBSZXNvdXJjZUlEOwogICAgICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICMgcGFyZW50IGlkCiAgICAgICAgJFJvd1sxXSA9ICRSb3dbMV0gPyAkUm93WzFdIDogMDsKICAgICAgICBteSAkUGFyZW50SUQgPSAkUm93WzFdOwogICAgICAgIGlmICggJFBhcmFte1BhcmVudElEfSApIHsKICAgICAgICAgICAgbmV4dCBST1cgaWYgKCAkUGFyYW17UGFyZW50SUR9ICE9ICRQYXJlbnRJRCApOwogICAgICAgIH0KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgIG15ICVBcHBvaW50bWVudCA9ICgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzNdLAogICAgICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNF0sCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s1XSwKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzZdLAogICAgICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbN10sCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s4XSwKICAgICAgICAgICAgVGVhbUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBcQFRlYW1JRCwKICAgICAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiBcQFJlc291cmNlSUQsCiAgICAgICAgICAgIEFsbERheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxMV0sCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxMl0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxM10gfHwgJycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxNF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1sxNV0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJFJvd1sxNl0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFJvd1sxN10sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJFJvd1sxOF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJFJvd1sxOV0gfHwgJycsCiAgICAgICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgICAgICAgICAgICAgPT4gJFJvd1syMF0sCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICBGdXR1cmVUYXNrSUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMjFdLAojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICApOwogICAgICAgIHB1c2ggQFJlc3VsdCwgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICAjIGlmIFJlc3VsdCB3YXMgQVJSQVksIG91dHB1dCBvbmx5IElEcwogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQVJSQVknICkgewogICAgICAgIG15IEBSZXN1bHRMaXN0OwogICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBSZXN1bHQpIHsKICAgICAgICAgICAgcHVzaCBAUmVzdWx0TGlzdCwgJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgfQogICAgICAgIEBSZXN1bHQgPSBAUmVzdWx0TGlzdDsKICAgIH0KCiAgICAjIGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgIFZhbHVlID0+IFxAUmVzdWx0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gQFJlc3VsdDsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RGF5cygpCgpnZXQgYSBoYXNoIG9mIGRheXMgd2l0aCBBcHBvaW50bWVudHMgaW4gYWxsIHVzZXIgY2FsZW5kYXJzLgoKICAgIG15ICVBcHBvaW50bWVudERheXMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGF5cygKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBzdGFydCBkYXRlCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZW5kIGRhdGUKICAgICAgICBVc2VySUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIFVzZXJJRAogICAgKTsKCnJldHVybnMgYSBoYXNoIHdpdGggZGF5cyBhcyBrZXlzIGFuZCBudW1iZXIgb2YgQXBwb2ludG1lbnRzIGFzIHZhbHVlczoKCiAgICAlQXBwb2ludG1lbnREYXlzID0gewogICAgICAgICcyMDE2LTAxLTAxJyA9PiAxLAogICAgICAgICcyMDE2LTAxLTEzJyA9PiAyLAogICAgICAgICcyMDE2LTAxLTMwJyA9PiAxLAogICAgfTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudERheXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhY2hlIGtleXMKICAgIG15ICRDYWNoZVR5cGUgICAgID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0RheXMnIC4gJFBhcmFte1VzZXJJRH07CiAgICBteSAkQ2FjaGVLZXlTdGFydCA9ICRQYXJhbXtTdGFydFRpbWV9IHx8ICdhbnknOwogICAgbXkgJENhY2hlS2V5RW5kICAgPSAkUGFyYW17RW5kVGltZX0gICB8fCAnYW55JzsKCiAgICAjIGNoZWNrIHRpbWUKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0VGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlN0YXJ0VGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICA9PiAiJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kIiwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0hBU0gnICkgewogICAgICAgIHJldHVybiAleyREYXRhfTsKICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGdldCB1c2VyIGdyb3VwcwogICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICApOwogICAgbXkgQEdyb3VwSURzID0gc29ydCBrZXlzICVHcm91cExpc3Q7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBTRUxFQ1QgY2Euc3RhcnRfdGltZSwgY2EuZW5kX3RpbWUKICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IGNhCiAgICAgICAgSk9JTiBjYWxlbmRhciBjIE9OIGNhLmNhbGVuZGFyX2lkID0gYy5pZAogICAgICAgIFdIRVJFIGMuZ3JvdXBfaWQgSU4gKCAke1woam9pbiAnLCAnLCBAR3JvdXBJRHMpfSApCiAgICAiOwoKICAgIG15IEBCaW5kOwoKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgKAogICAgICAgICAgICAoY2Euc3RhcnRfdGltZSA+PSA/IEFORCBjYS5zdGFydF90aW1lIDwgPykgT1IKICAgICAgICAgICAgKGNhLmVuZF90aW1lID4gPyBBTkQgY2EuZW5kX3RpbWUgPD0gPykgT1IKICAgICAgICAgICAgKGNhLnN0YXJ0X3RpbWUgPD0gPyBBTkQgY2EuZW5kX3RpbWUgPj0gPykKICAgICAgICApICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sIFwkUGFyYW17RW5kVGltZX0sIFwkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgISRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EIGNhLmVuZF90aW1lID49ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1N0YXJ0VGltZX07CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17U3RhcnRUaW1lfSAmJiAkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCBjYS5zdGFydF90aW1lIDw9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0VuZFRpbWV9OwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIGNhLmlkIEFTQyc7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAoICRTdGFydFRpbWUsICRFbmRUaW1lICk7CgogICAgICAgICMgU3RhcnRUaW1lCiAgICAgICAgaWYgKCAkUGFyYW17U3RhcnRUaW1lfSApIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF0gbHQgJFBhcmFte1N0YXJ0VGltZX0gPyAkUGFyYW17U3RhcnRUaW1lfSA6ICRSb3dbMF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgRW5kVGltZQogICAgICAgIGlmICggJFBhcmFte0VuZFRpbWV9ICkgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV0gZ3QgJFBhcmFte0VuZFRpbWV9ID8gJFBhcmFte0VuZFRpbWV9IDogJFJvd1sxXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFJvd1sxXTsKICAgICAgICB9CgogICAgICAgICMgR2V0IHN5c3RlbSB0aW1lcy4KICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yICgKICAgICAgICAgICAgbXkgJExvb3BUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJExvb3BUaW1lT2JqZWN0IDwgJEVuZFRpbWVPYmplY3Q7CiAgICAgICAgICAgICRMb29wVGltZU9iamVjdC0+QWRkKCBEYXlzID0+IDEgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkTG9vcFRpbWUgPSAkTG9vcFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgICAgICAkTG9vcFRpbWUgPX4gcy9ccy4qPyQvL2dzbTsKCiAgICAgICAgICAgIGlmICggJFJlc3VsdHskTG9vcFRpbWV9ICkgewogICAgICAgICAgICAgICAgJFJlc3VsdHskTG9vcFRpbWV9Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0eyRMb29wVGltZX0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgS2V5ICAgPT4gIiRDYWNoZUtleVN0YXJ0LSRDYWNoZUtleUVuZCIsCiAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICApOwoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aGVhZDIgQXBwb2ludG1lbnRHZXQoKQoKR2V0IGFwcG9pbnRtZW50IGRhdGEuCgogICAgbXkgJUFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvcgogICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywgIyAocmVxdWlyZWQpIHdpbGwgcmV0dXJuIG9ubHkgcGFyZW50IGZvciByZWN1cnJpbmcgYXBwb2ludG1lbnRzCiAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpSZXR1cm5zIGEgaGFzaDoKCiAgICAlQXBwb2ludG1lbnQgPSAoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICA9PiAyLAogICAgICAgIFBhcmVudElEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IGZvciByZWN1cnJlZCAoY2hpbGQpIGFwcG9pbnRtZW50cwogICAgICAgIENhbGVuZGFySUQgICAgICAgICAgPT4gMSwKICAgICAgICBVbmlxdWVJRCAgICAgICAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsCiAgICAgICAgVGl0bGUgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsCiAgICAgICAgQWxsRGF5ICAgICAgICAgICAgICA9PiAwLAogICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgPT4gWyAxIF0sCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICA9PiBbIDEsIDMgXSwKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZVR5cGUgICAgICA9PiAnRGFpbHknLAogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgPT4gMSwKICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUludGVydmFsICA9PiAyLAogICAgICAgIFJlY3VycmVuY2VVbnRpbCAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgIFJlY3VycmVuY2VJRCAgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgIFJlY3VycmVuY2VFeGNsdWRlICAgPT4gWwogICAgICAgICAgICAnMjAxNi0wMS0xMCAwMDowMDowMCcsCiAgICAgICAgICAgICcyMDE2LTAxLTExIDAwOjAwOjAwJywKICAgICAgICBdLAogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowOjAwJywKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgPT4gJ0N1c3RvbScsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdENvdW50ICAgICAgID0+ICcxMicsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdCAgICAgICAgICAgID0+ICdtaW51dGVzJywKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21Vbml0UG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKCiAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgPT4gJzliYjIwZWEwMzVlN2E5OTMwNjUyYTlkODJkMDBjNzI1JywgICMgZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEKICAgICAgICBDcmVhdGVUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgQ3JlYXRlQnkgICAgICAgICAgICAgICAgPT4gMiwKICAgICAgICBDaGFuZ2VUaW1lICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgICAgICAgICAgPT4gMiwKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgRnV0dXJlVGFza0lEID0+IDEsCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgKTsKCj1jdXQKCnN1YiBBcHBvaW50bWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcHBvaW50bWVudElEfQogICAgICAgICYmICEoICRQYXJhbXtVbmlxdWVJRH0gJiYgJFBhcmFte0NhbGVuZGFySUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEFwcG9pbnRtZW50SUQgb3IgVW5pcXVlSUQgYW5kIENhbGVuZGFySUQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkRGF0YTsKCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgICREYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggcmVmICREYXRhIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJXskRGF0YX07CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgQEJpbmQ7CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgbXkgJFNRTCA9ICcKIyAgICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAojICAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKIyAgICAgICAgICAgICByZWN1cl9pbnRlcnZhbCwgcmVjdXJfdW50aWwsIHJlY3VyX2lkLCByZWN1cl9leGNsdWRlLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiMgICAgICAgICAgICAgY2hhbmdlX2J5CiMgICAgICAgICBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiMgICAgICAgIFdIRVJFCiMgICAgICc7CiAgICBteSAkU1FMID0gJwogICAgICAgIFNFTEVDVCBpZCwgcGFyZW50X2lkLCBjYWxlbmRhcl9pZCwgdW5pcXVlX2lkLCB0aXRsZSwgZGVzY3JpcHRpb24sIGxvY2F0aW9uLCBzdGFydF90aW1lLAogICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiAgICAgICAgICAgIHJlY3VyX2ludGVydmFsLCByZWN1cl91bnRpbCwgcmVjdXJfaWQsIHJlY3VyX2V4Y2x1ZGUsIG5vdGlmeV90aW1lLCBub3RpZnlfdGVtcGxhdGUsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCwgbm90aWZ5X2N1c3RvbV91bml0LCBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQsCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAogICAgICAgICAgICBjaGFuZ2VfYnksIGZ1dHVyZV90YXNrX2lkCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFCiAgICAnOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKICAgICAgICAkU1FMIC49ICdpZCA9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0FwcG9pbnRtZW50SUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAndW5pcXVlX2lkID0gPyBBTkQgY2FsZW5kYXJfaWQgPSA/IEFORCBwYXJlbnRfaWQgSVMgTlVMTCAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VW5pcXVlSUR9LCBcJFBhcmFte0NhbGVuZGFySUR9OwogICAgfQoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgdGVhbSBpZAogICAgICAgIG15IEBUZWFtSUQgPSBzcGxpdCggLywvLCAkUm93WzEwXSAvLyAnJyApOwoKICAgICAgICAjIHJlc291cmNlIGlkCiAgICAgICAgbXkgQFJlc291cmNlSUQgPSBzcGxpdCggLywvLCAkUm93WzExXSAvLyAnMCcgKTsKCiAgICAgICAgIyByZWN1cnJlbmNlIGZyZXF1ZW5jeQogICAgICAgIG15IEBSZWN1cnJlbmNlRnJlcXVlbmN5ID0gJFJvd1sxNF0gPyBzcGxpdCggLywvLCAkUm93WzE0XSApIDogdW5kZWY7CgogICAgICAgICMgcmVjdXJyZW5jZSBleGNsdWRlCiAgICAgICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gJFJvd1sxOV0gPyBzcGxpdCggLywvLCAkUm93WzE5XSApIDogdW5kZWY7CgogICAgICAgICRSZXN1bHR7QXBwb2ludG1lbnRJRH0gICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICRSZXN1bHR7UGFyZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzFdOwogICAgICAgICRSZXN1bHR7Q2FsZW5kYXJJRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzJdOwogICAgICAgICRSZXN1bHR7VW5pcXVlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzNdOwogICAgICAgICRSZXN1bHR7VGl0bGV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzRdOwogICAgICAgICRSZXN1bHR7RGVzY3JpcHRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzVdOwogICAgICAgICRSZXN1bHR7TG9jYXRpb259ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzZdOwogICAgICAgICRSZXN1bHR7U3RhcnRUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzddOwogICAgICAgICRSZXN1bHR7RW5kVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzhdOwogICAgICAgICRSZXN1bHR7QWxsRGF5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzldOwogICAgICAgICRSZXN1bHR7VGVhbUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBcQFRlYW1JRDsKICAgICAgICAkUmVzdWx0e1Jlc291cmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBSZXNvdXJjZUlEOwogICAgICAgICRSZXN1bHR7UmVjdXJyaW5nfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzEyXTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VUeXBlfSAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxM107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRnJlcXVlbmN5fSAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUZyZXF1ZW5jeTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VDb3VudH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxNV07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSW50ZXJ2YWx9ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTZdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZVVudGlsfSAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE3XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VJRH0gICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxOF07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlRXhjbHVkZX0gICAgICAgICAgICAgICAgICAgICA9IFxAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25EYXRlfSAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjBdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICAgICAgICAgICAgICAgICAgPSAkUm93WzIxXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbX0gICAgICAgICAgICAgICAgICAgID0gJFJvd1syMl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gICA9ICRSb3dbMjNdIHx8IDA7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9ICAgICAgICA9ICRSb3dbMjRdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0gPSAkUm93WzI1XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSAgICAgICAgICAgID0gJFJvd1syNl0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0gICAgICAgICAgICAgICA9ICRSb3dbMjddOwogICAgICAgICRSZXN1bHR7Q3JlYXRlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzI4XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOV07CiAgICAgICAgJFJlc3VsdHtDaGFuZ2VUaW1lfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMzBdOwogICAgICAgICRSZXN1bHR7Q2hhbmdlQnl9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMxXTsKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgJFJlc3VsdHtGdXR1cmVUYXNrSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMzJdOwojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIH0KCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudElEfSApIHsKCiAgICAgICAgIyBjYWNoZQogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgVmFsdWUgPT4gXCVSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVSZXN1bHQ7Cn0KCj1oZWFkMiBBcHBvaW50bWVudFVwZGF0ZSgpCgp1cGRhdGVzIGFuIGV4aXN0aW5nIGFwcG9pbnRtZW50LgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICBBcHBvaW50bWVudElEICAgICAgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVmFsaWQgQ2FsZW5kYXJJRAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBUaXRsZQogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLCAgICAgICAgICMgKG9wdGlvbmFsKSBEZXNjcmlwdGlvbgogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBMb2NhdGlvbgogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIEFsbERheSAgICAgICAgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBEZWZhdWx0IDAKICAgICAgICBUZWFtICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBSZXNvdXJjZUlEICAgICAgICAgICAgPT4gWyAxLCAzIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UgaWYgc3VwcGxpZWQKICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZmxhZyB0aGUgYXBwb2ludG1lbnQgYXMgcmVjdXJyaW5nIChwYXJlbnQgb25seSEpCgogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgICA9PiAnRGFpbHknLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIFJlY3VycmluZykgUG9zc2libGUgIkRhaWx5IiwgIldlZWtseSIsICJNb250aGx5IiwgIlllYXJseSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKCiAgICAgICAgUmVjdXJyZW5jZUZyZXF1ZW5jeSAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQgaWYgQ3VzdG9tIFJlY3VycmluZykgUmVjdXJyZW5jZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbVdlZWtseTogMS1Nb24sIDItVHVlLC4uLiwgNy1TdW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICBmb3IgQ3VzdG9tTW9udGhseTogMS1KYW4sIDItRmViLC4uLiwgMTItRGVjCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAuLi4KICAgICAgICBSZWN1cnJlbmNlQ291bnQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSG93IG1hbnkgQXBwb2ludG1lbnRzIHRvIGNyZWF0ZQogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBSZXBlYXRpbmcgaW50ZXJ2YWwgKGRlZmF1bHQgMSkKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgICAgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVW50aWwgZGF0ZQogICAgICAgIE5vdGlmaWNhdGlvblRpbWUgICAgICA9PiAnMjAxNi0wMS0wMSAxNzowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAgICAgIE5vdGlmaWNhdGlvblRlbXBsYXRlICA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciBub3RpZmljYXRpb24gcG9pbnQgb2YgdGltZQogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbSAgICA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEyJywgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5vdGlmaWNhdGlvbiBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEICAgID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICMgKG9wdGlvbmFsKSBUaWNrZXQgYXBwb2ludG1lbnQgcnVsZSBJRCAoZm9yIHRpY2tldCBhcHBvaW50bWVudHMgb25seSEpCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFVzZXJJRAojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBGdXR1cmVUYXNrSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgSUQgb2YgZnV0dXJlIHRhc2sKICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRGF0YSBmb3IgdGlja2V0IGNyZWF0aW9uCiAgICAgICAgICAgIFRpbWUgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIHRpbWUgdG8gZXhlY3V0ZSB0aGUgdGlja2V0IGNyZWF0IGV2ZW50CiAgICAgICAgICAgIFRlbXBsYXRlID0+ICdDdXN0b20nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRlbXBsYXRlIHRvIGJlIHVzZWQgZm9yIHRpY2tldCBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgIEN1c3RvbSA9PiAncmVsYXRpdmUnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFR5cGUgb2YgdGhlIGN1c3RvbSB0ZW1wbGF0ZSB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAicmVsYXRpdmUiLCAiZGF0ZXRpbWUiCiAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgY291bnQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgPT4gJ21pbnV0ZXMnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIHVuaXQgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcgICwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiBleGVjdXRlIGZvciBjdXN0b20gdGVtcGxhdGVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJiZWZvcmVzdGFydCIsICJhZnRlcnN0YXJ0IiwgImJlZm9yZWVuZCIsICJhZnRlcmVuZCIKICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGRhdGUgdGltZSBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBxdWV1ZQogICAgICAgICAgICBDdXN0b21lcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgY3VzdG9tZXIgaWQKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICd0ZXN0QHRlc3QuY29tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgPT4gJ3Rlc3QnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgU2VsZWN0ZWQgY3VzdG9tZXIgdXNlcgogICAgICAgICAgICBVc2VySUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgdXNlciBpZAogICAgICAgICAgICBPd25lcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgb3duZXIgaWQKICAgICAgICAgICAgTG9jayA9PiAndW5sb2NrJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGxvY2sgc3RhdGUKICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHByaW9yaXR5CiAgICAgICAgICAgIFN0YXRlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBzdGF0ZQogICAgICAgICAgICBTZXJ2aWNlSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc2VydmljZQogICAgICAgICAgICBTTEFJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc2VydmljZSBsZXZlbCBhZ3JlZW1lbnQKICAgICAgICAgICAgVHlwZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHR5cGUgaWQKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTmFtZSB2YWx1ZSBjb21iaW5hdGlvbnMgZm9yIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGROYW1lMSA9PiBWYWx1ZTEsCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGROYW1lMiA9PiBWYWx1ZTIsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudFVwZGF0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIENhbGVuZGFySUQgVGl0bGUgU3RhcnRUaW1lIEVuZFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBpZiBSZWN1cnJpbmcgaXMgcHJvdmlkZWQsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBtdXN0IGJlIHByZXNlbnQKICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gKSB7CgogICAgICAgIG15IEBSZWN1cnJlbmNlVHlwZXMgPSAoCiAgICAgICAgICAgICJEYWlseSIsICAgICAgICJXZWVrbHkiLCAgICAgICAiTW9udGhseSIsICAgICAgICJZZWFybHkiLAogICAgICAgICAgICAiQ3VzdG9tRGFpbHkiLCAiQ3VzdG9tV2Vla2x5IiwgIkN1c3RvbU1vbnRobHkiLCAiQ3VzdG9tWWVhcmx5IgogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRQYXJhbXtSZWN1cnJlbmNlVHlwZX0KICAgICAgICAgICAgfHwgIWdyZXAgeyAkXyBlcSAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IH0gQFJlY3VycmVuY2VUeXBlcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZVR5cGUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAoCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScKICAgICAgICAgICAgICAgIHx8ICRQYXJhbXtSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbU1vbnRobHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21ZZWFybHknCiAgICAgICAgICAgICkKICAgICAgICAgICAgJiYgISRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVjdXJyZW5jZUZyZXF1ZW5jeSBuZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAkUGFyYW17UmVjdXJyZW5jZUludGVydmFsfSB8fD0gMTsKCiAgICAjIENoZWNrIFN0YXJ0VGltZS4KICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICB9LAogICAgKTsKICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQ2hlY2sgRW5kVGltZS4KICAgIG15ICRFbmRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgaWYgKCAhJEVuZFRpbWVPYmplY3QgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbmRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGNoZWNrIGlmIGFycmF5IHJlZnMKICAgIG15ICVBcnJheXM7CiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoVGVhbUlEIFJlc291cmNlSUQgUmVjdXJyZW5jZUZyZXF1ZW5jeSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IC8vIFtdIH0gKSB7CiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG5vdCBBUlJBWVJFRiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRQYXJhbWV0ZXJ9IH07CgogICAgICAgICAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICAgICAgICAgIEBBcnJheSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQEFycmF5OwoKICAgICAgICAgICAgJEFycmF5c3skUGFyYW1ldGVyfSA9IGpvaW4oICcsJywgQEFycmF5ICkgaWYgQEFycmF5OwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG51bWJlcnMKICAgIGZvciBteSAkUGFyYW1ldGVyICgKICAgICAgICBxdyhSZWN1cnJpbmcgUmVjdXJyZW5jZUNvdW50IFJlY3VycmVuY2VJbnRlcnZhbCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkUGFyYW17JFBhcmFtZXRlcn0gJiYgIUlzSW50ZWdlciggJFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkUGFyYW1ldGVyIG11c3QgYmUgYSBudW1iZXIhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIFJlY3VycmVuY2VVbnRpbAogICAgaWYgKCAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSApIHsKCiAgICAgICAgIyBVc3VhbGx5IGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kID0gMC4gSW4gdGhpcyBjYXNlLCB0YWtlIHRpbWUgZnJvbSBTdGFydFRpbWUuCiAgICAgICAgJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gPSAkU2VsZi0+X1RpbWVDaGVjaygKICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgISRSZWN1cnJlbmNlVW50aWxPYmplY3QKICAgICAgICAgICAgfHwgJFN0YXJ0VGltZU9iamVjdCA+ICRSZWN1cnJlbmNlVW50aWxPYmplY3QKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VVbnRpbCBpbnZhbGlkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJldmlvdXMgQ2FsZW5kYXJJRAogICAgbXkgJFByZXZpb3VzQ2FsZW5kYXJJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHNldCByZWN1cnJlbmNlIGV4Y2x1ZGUgbGlzdAogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gQHsgJFBhcmFte1JlY3VycmVuY2VFeGNsdWRlfSAvLyBbXSB9OwoKICAgICMgZ2V0IFJlY3VycmVuY2VJRAogICAgbXkgJFJlY3VycmVuY2VJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRSZWN1cnJlbmNlSUQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgdXNlIGV4Y2x1ZGUgbGlzdCB0byBmbGFnIHRoZSByZWN1cnJpbmcgb2NjdXJyZW5jZSBhcyB1cGRhdGVkCiAgICBpZiAoJFJlY3VycmVuY2VJRCkgewogICAgICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9ICgkUmVjdXJyZW5jZUlEKTsKICAgIH0KCiAgICAjIHJlc2V0IGV4Y2x1ZGUgbGlzdCBpZiByZWN1cnJlbmNlIGlzIHR1cm5lZCBvZmYKICAgIGVsc2lmICggISRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9ICgpOwogICAgfQoKICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgc2VyaWFsaXplIGRhdGEKICAgIG15ICRSZWN1cnJlbmNlRXhjbHVkZSA9IGpvaW4oICcsJywgQFJlY3VycmVuY2VFeGNsdWRlICkgfHwgdW5kZWY7CgogICAgIyBkZWxldGUgZXhpc3RpbmcgcmVjdXJyZWQgYXBwb2ludG1lbnRzCiAgICBteSAkRGVsZXRlU3VjY2VzcyA9ICRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdEZWxldGUoCiAgICAgICAgUGFyZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICBpZiAoICEkRGVsZXRlU3VjY2VzcyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuYWJsZSB0byBkZWxldGUgcmVjdXJyaW5nIEFwcG9pbnRtZW50ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKIyAgICAgIyB1cGRhdGUgYXBwb2ludG1lbnQKIyAgICAgbXkgJFNRTCA9ICcKIyAgICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAojICAgICAgICAgU0VUCiMgICAgICAgICAgICAgY2FsZW5kYXJfaWQ9PywgdGl0bGU9PywgZGVzY3JpcHRpb249PywgbG9jYXRpb249Pywgc3RhcnRfdGltZT0/LCBlbmRfdGltZT0/LCBhbGxfZGF5PT8sCiMgICAgICAgICAgICAgdGVhbV9pZD0/LCByZXNvdXJjZV9pZD0/LCByZWN1cnJpbmc9PywgcmVjdXJfdHlwZT0/LCByZWN1cl9mcmVxPT8sIHJlY3VyX2NvdW50PT8sCiMgICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWw9PywgcmVjdXJfdW50aWw9PywgcmVjdXJfZXhjbHVkZT0/LCBub3RpZnlfdGltZT0/LCBub3RpZnlfdGVtcGxhdGU9PywKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tPT8sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudD0/LCBub3RpZnlfY3VzdG9tX3VuaXQ9PywKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQ9Pywgbm90aWZ5X2N1c3RvbV9kYXRlPT8sIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkPT8sCiMgICAgICAgICAgICAgY2hhbmdlX3RpbWU9Y3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieT0/CiMgICAgICAgICBXSEVSRSBpZD0/CiMgICAgICc7CgojICAgICAjIHVwZGF0ZSBkYiByZWNvcmQKIyAgICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiMgICAgICAgICBTUUwgID0+ICRTUUwsCiMgICAgICAgICBCaW5kID0+IFsKIyAgICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFySUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1RpdGxlfSwgICAgICAgICAgIFwkUGFyYW17RGVzY3JpcHRpb259LCBcJFBhcmFte0xvY2F0aW9ufSwKIyAgICAgICAgICAgICBcJFBhcmFte1N0YXJ0VGltZX0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9LCAgICAgICAgIFwkUGFyYW17QWxsRGF5fSwgICAgICBcJEFycmF5c3tUZWFtSUR9LAojICAgICAgICAgICAgIFwkQXJyYXlze1Jlc291cmNlSUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyaW5nfSwgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiMgICAgICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiMgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LCAgICAgICAgICAgICAgICAgICAgICAgXCRSZWN1cnJlbmNlRXhjbHVkZSwgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkRhdGV9LAojICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKIyAgICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiMgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiMgICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAojICAgICAgICAgXSwKIyAgICAgKTsKICAgIG15ICRTUUwgPSAnCiAgICAgICAgVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgU0VUCiAgICAgICAgICAgIGNhbGVuZGFyX2lkID0gPywgdGl0bGUgPSA/LCBkZXNjcmlwdGlvbiA9ID8sIGxvY2F0aW9uID0gPywgc3RhcnRfdGltZSA9ID8sIGVuZF90aW1lID0gPywgYWxsX2RheSA9ID8sCiAgICAgICAgICAgIHRlYW1faWQgPSA/LCByZXNvdXJjZV9pZCA9ID8sIHJlY3VycmluZyA9ID8sIHJlY3VyX3R5cGUgPSA/LCByZWN1cl9mcmVxID0gPywgcmVjdXJfY291bnQgPSA/LAogICAgICAgICAgICByZWN1cl9pbnRlcnZhbCA9ID8sIHJlY3VyX3VudGlsID0gPywgcmVjdXJfZXhjbHVkZSA9ID8sIG5vdGlmeV90aW1lID0gPywgbm90aWZ5X3RlbXBsYXRlID0gPywKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSA9ID8sIG5vdGlmeV9jdXN0b21fdW5pdF9jb3VudCA9ID8sIG5vdGlmeV9jdXN0b21fdW5pdCA9ID8sCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCA9ID8sIG5vdGlmeV9jdXN0b21fZGF0ZSA9ID8sIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkID0gPywKICAgICAgICAgICAgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcCwgY2hhbmdlX2J5ID0gPywgZnV0dXJlX3Rhc2tfaWQgPSA/CiAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAnOwoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0NhbGVuZGFySUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1RpdGxlfSwgICAgICAgICAgIFwkUGFyYW17RGVzY3JpcHRpb259LCBcJFBhcmFte0xvY2F0aW9ufSwKICAgICAgICAgICAgXCRQYXJhbXtTdGFydFRpbWV9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfSwgICAgICAgICBcJFBhcmFte0FsbERheX0sICAgICAgXCRBcnJheXN7VGVhbUlEfSwKICAgICAgICAgICAgXCRBcnJheXN7UmVzb3VyY2VJRH0sICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJpbmd9LCAgICAgICBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICAgICAgXCRBcnJheXN7UmVjdXJyZW5jZUZyZXF1ZW5jeX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlQ291bnR9LCBcJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgICAgICAgICAgICAgICAgICAgICAgIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sICAgICAgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b219LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICBcJFBhcmFte1RpY2tldEFwcG9pbnRtZW50UnVsZUlEfSwgICAgICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17RnV0dXJlVGFza0lEfSwgXCRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICBdLAogICAgKTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBhZGQgcmVjdXJyZWQgYXBwb2ludG1lbnRzIGFnYWluCiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBBcHBvaW50bWVudCA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIG15ICREQk9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgIG15ICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRDsKCiAgICAjIFNldCBmdXR1cmUgdGFzayBpZCB0byBOVUxMIGFuZCBkZWxldGUgZnV0dXJlIHRhc2sgaWYgbm8gaWQgcHJvdmlkZWQsIGVsc2UgdXBkYXRlIGV4aXN0aW5nIGZ1dHVyZSB0YXNrCiAgICBpZiAoICEkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIERhdGUgVGVtcGxhdGUgQ3VzdG9tIEN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXQgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSBDdXN0b21EYXRlVGltZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPnskUG9zc2libGVQYXJhbX0gPSB1bmRlZjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRQYXJhbXtGdXR1cmVUYXNrSUR9ICYmICEkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17RnV0dXJlVGFza0lEfQogICAgICAgICk7CiAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSB1bmRlZjsKICAgIH0KCiAgICAjIEZ1dHVyZVRhc2sgaXMgdG8gYmUgKHJlKWNyZWF0ZWQKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSApIHsKCiAgICAgICAgIyBDb2xsZWN0IGRhdGEgZm9yIGNyZWF0aW5nIG9yIHVwZGF0aW5nIGZ1dHVyZSB0YXNrCiAgICAgICAgbXkgJUZ1dHVyZVRhc2tEYXRhID0gKAogICAgICAgICAgICBUeXBlID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIENoZWNrIGZvciByZWN1cnJpbmcgYW5kIGlmIGV4ZWN1dGlvbiB0aW1lIGlzIGluIGZ1dHVyZQogICAgICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gKSB7CiAgICAgICAgICAgIG15IEBBcHBvaW50bWVudExpc3QgPSAkU2VsZi0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUHJldmlvdXNDYWxlbmRhcklELAogICAgICAgICAgICAgICAgUGFyZW50SUQgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSApOwogICAgICAgICAgICB1bnNoaWZ0IEBBcHBvaW50bWVudExpc3QsIFwlUGFyZW50QXBwb2ludG1lbnQ7CgogICAgICAgICAgICBBUFBPSU5UTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZSA9ICRTZWxmLT5BcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSgKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgICMgd2hlbiB0aGUgYXBwb2ludG1lbnQgd2FzIGp1c3QgdXBkYXRlZCBpbiBkYXRhYmFzZSwgbWF5YmUgdGhlIGRhdGEgaXMgc3RpbGwgaW5jb3JyZWN0IGhlcmUKICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPT0gJFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJFBhcmFte1N0YXJ0VGltZX0gOiAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSA9PSAkUGFyYW17QXBwb2ludG1lbnRJRH0gPyAkUGFyYW17RW5kVGltZX0gICA6ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudERhdGVUaW1lT2JqZWN0ICkgPiAwICkgewogICAgICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ID0gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tEYXRhe0V4ZWN1dGlvblRpbWV9ICAgICAgICAgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lOwogICAgICAgICAgICAgICAgICAgIGxhc3QgQVBQT0lOVE1FTlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEID0gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH07CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIyBTaW5nbGUgYXBwb2ludG1lbnQsIGNoZWNraW5nIGlmIGl0cyBleGVjdXRpb24gdGltZSBpcyBpbiB0aGUgZnV0dXJlCiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWUgPSAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUaW1lfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21EYXRlVGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPkNvbXBhcmUoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgKSApIHsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ID0gJFBhcmFte0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgJEZ1dHVyZVRhc2tBcHBvaW50bWVudElEICAgICAgICAgICAgICAgPSAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtFeGVjdXRpb25UaW1lfSAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICRQYXJhbXtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7VGFza0lEfSA9ICRQYXJhbXtGdXR1cmVUYXNrSUR9OwoKICAgICAgICAgICAgIyBJZiB0aGVyZSBpcyBhbiBhcHBvaW50bWVudCB3aXRoIGV4ZWN1dGlvbiB0aW1lIGluIHRoZSBmdXR1cmUsIHVwZGF0ZSBmdXR1cmUgdGFzawogICAgICAgICAgICBpZiAoICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrVXBkYXRlKCVGdXR1cmVUYXNrRGF0YSk7CiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZ1dHVyZSB0YXNrICRGdXR1cmVUYXNrRGF0YXtUYXNrSUR9IG9mIHR5cGUgYXBwb2ludG1lbnQgdGlja2V0IGZvciBhcHBvaW50bWVudCAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSBjb3VsZCBub3QgYmUgdXBkYXRlZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAjIERlbGV0ZSBleGlzdGluZyBmdXR1cmUgdGFzayBzaW5jZSB1cGRhdGVkIGV4ZWN1dGlvbiB0aW1lIGlzIG5vdCBpbiB0aGUgZnV0dXJlCiAgICAgICAgICAgICAgICAkUGFyYW17RnV0dXJlVGFza0lEfSA9IHVuZGVmOwogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2tEYXRhe1Rhc2tJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIE5vIGZ1dHVyZSB0YXNrIGlkIHByZXNlbnQsIGNyZWF0ZSBmdXR1cmUgdGFzayBpZiBleGVjdXRpb24gdGltZSBpcyBpbiB0aGUgZnV0dXJlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17RnV0dXJlVGFza0lEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tBZGQoJUZ1dHVyZVRhc2tEYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZHMgZnJvbSBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMgYW5kIHVwZGF0ZSBpdCB3aGVyZSBpdCBiZWxvbmdzIGFmdGVyd2FyZHMKICAgIG15ICREZWxldGVGdXR1cmVUYXNrSURTUUwgPSAiCiAgICAgICAgVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgU0VUIGZ1dHVyZV90YXNrX2lkID0gTlVMTAogICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgIE9SIHBhcmVudF9pZCA9ID8KICAgICI7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSwgXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJERlbGV0ZUZ1dHVyZVRhc2tJRFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgaWYgKCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCkgewogICAgICAgIG15ICRVcGRhdGVGdXR1cmVUYXNrSURTUUwgPSAiCiAgICAgICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICBTRVQgZnV0dXJlX3Rhc2tfaWQgPSA/CiAgICAgICAgICAgIFdIRVJFIGlkID0gPwogICAgICAgICI7CiAgICAgICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17RnV0dXJlVGFza0lEfSwgXCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCApOwoKICAgICAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJFVwZGF0ZUZ1dHVyZVRhc2tJRFNRTCwKICAgICAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICAgICAgKTsKICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgIG15IEBDYWxlbmRhcklEcyA9ICggJFBhcmFte0NhbGVuZGFySUR9ICk7CiAgICBwdXNoIEBDYWxlbmRhcklEcywgJFByZXZpb3VzQ2FsZW5kYXJJRCBpZiAkUHJldmlvdXNDYWxlbmRhcklEIG5lICRQYXJhbXtDYWxlbmRhcklEfTsKICAgIGZvciBteSAkQ2FsZW5kYXJJRCAoQENhbGVuZGFySURzKSB7CiAgICAgICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgICAgICk7CiAgICB9CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudFVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQ2FsZW5kYXJJRCAgICA9PiAkUGFyYW17Q2FsZW5kYXJJRH0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnREZWxldGUoKQoKZGVsZXRlcyBhbiBleGlzdGluZyBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7CgpFdmVudHM6CiAgICBBcHBvaW50bWVudERlbGV0ZQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIGdldCBDYWxlbmRhcklECiAgICBteSAkQ2FsZW5kYXJJRCA9ICRTZWxmLT5fQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHVzZXIncyBwZXJtaXNzaW9ucyBmb3IgdGhpcyBjYWxlbmRhcgogICAgbXkgJFBlcm1pc3Npb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKS0+Q2FsZW5kYXJQZXJtaXNzaW9uR2V0KAogICAgICAgIENhbGVuZGFySUQgPT4gJENhbGVuZGFySUQsCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgbXkgQFJlcXVpcmVkUGVybWlzc2lvbnMgPSAoICdjcmVhdGUnLCAncncnICk7CgogICAgaWYgKCAhZ3JlcCB7ICRQZXJtaXNzaW9uIGVxICRfIH0gQFJlcXVpcmVkUGVybWlzc2lvbnMgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyKCRQYXJhbXtVc2VySUR9KSBoYXMgbm8gcGVybWlzc2lvbiB0byBkZWxldGUgQXBwb2ludG1lbnQoJFBhcmFte0FwcG9pbnRtZW50SUR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzYXZlIGV4Y2x1c2lvbiBpbmZvIHRvIHBhcmVudCBhcHBvaW50bWVudAogICAgaWYgKCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICYmICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9ICkgewogICAgICAgICRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdFeGNsdWRlKAogICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJEFwcG9pbnRtZW50e1BhcmVudElEfSwKICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRBcHBvaW50bWVudHtSZWN1cnJlbmNlSUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVJlY3VycmluZ1N1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdSZWN1cnJpbmcgYXBwb2ludG1lbnRzIGNvdWxkblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICMgZGVsZXRlIGZ1dHVyZSB0YXNrIGlmIHByZXNlbnQKICAgICMgVE9ETyBIYW5kbGUgZGVsZXRpb24gb2YgYSByZWN1cnJpbmcgY2hpbGQgZXZlbnQgYW5kIHNoaWZ0IGZ1dHVyZSB0YXNrCiAgICBpZiAoICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9ICkgewogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICAgICAgVGFza0lEID0+ICRBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGdXR1cmUgdGFzayBBcHBvaW50bWVudFRpY2tldCBjb3VsblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBkZWxldGUgYXBwb2ludG1lbnQKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBpZCA9ID8KICAgICc7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgXSwKICAgICk7CgogICAgIyBGaXJlIGV2ZW50LgogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnREZWxldGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJENhbGVuZGFySUQsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRDYWxlbmRhcklELAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSgpCgpkZWxldGVzIGEgc2luZ2xlIHJlY3VycmluZyBhcHBvaW50bWVudCBvY2N1cnJlbmNlLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoCiAgICAgICAgVW5pcXVlSUQgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsICAgICMgKHJlcXVpcmVkKQogICAgICAgIFJlY3VycmVuY2VJRCA9PiAnMjAxNi0wMS0xMCAwMDowMDowMCcsICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKcmV0dXJucyAxIGlmIHN1Y2Nlc3NmdWw6CiAgICAkU3VjY2VzcyA9IDE7Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVbmlxdWVJRCBDYWxlbmRhcklEIFJlY3VycmVuY2VJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZGIgb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICBXSEVSRSB1bmlxdWVfaWQgPSA/IEFORCBjYWxlbmRhcl9pZCA9ID8gQU5EIHJlY3VyX2lkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfSwgXCRQYXJhbXtSZWN1cnJlbmNlSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJUFwcG9pbnRtZW50OwoKICAgICMgZ2V0IGFkZGl0aW9uYWwgaW5mbwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgIH0KICAgIHJldHVybiBpZiAhJUFwcG9pbnRtZW50OwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgID0+ICdERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGNhY2hlIG9iamVjdAogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGNsZWFuIHVwIGxpc3QgbWV0aG9kcyBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0xpc3QnIC4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgKTsKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEdldFVuaXF1ZUlEKCkKClJldHVybnMgVW5pcXVlSUQgY29udGFpbmluZyBhcHBvaW50bWVudCBzdGFydCB0aW1lLCByYW5kb20gaGFzaCBhbmQgc3lzdGVtIEM8RlFETj4uCgogICAgbXkgJFVuaXF1ZUlEID0gJEFwcG9pbnRtZW50T2JqZWN0LT5HZXRVbmlxdWVJRCgKICAgICAgICBDYWxlbmRhcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgU3RhcnRUaW1lICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICk7CgogICAgJFVuaXF1ZUlEID0gJzIwMTYwMTAxVDAwMDAwMC1COTkwOURAbG9jYWxob3N0JzsKCj1jdXQKCnN1YiBHZXRVbmlxdWVJRCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCBTdGFydFRpbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2FsY3VsYXRlIGEgaGFzaAogICAgbXkgJFJhbmRvbVN0cmluZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKCBMZW5ndGggPT4gMzIgKTsKICAgIG15ICRTdHJpbmcgICAgICAgPSAiJFBhcmFte0NhbGVuZGFySUR9LSRSYW5kb21TdHJpbmctJFBhcmFte1VzZXJJRH0iOwogICAgbXkgJERpZ2VzdCAgICAgICA9IHVucGFjayggJ04nLCBEaWdlc3Q6Ok1ENS0+bmV3KCktPmFkZCgkU3RyaW5nKS0+ZGlnZXN0KCkgKTsKICAgIG15ICREaWdlc3RIZXggICAgPSBzcHJpbnRmKCAnJXgnLCAkRGlnZXN0ICk7CiAgICBteSAkSGFzaCAgICAgICAgID0gdWMoIHNwcmludGYoICIlLjZzIiwgJERpZ2VzdEhleCApICk7CgogICAgIyBQcmVwYXJlIHN0YXJ0IHRpbWVzdGFtcCBmb3IgVW5pcXVlSUQuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICByZXR1cm4gaWYgISRTdGFydFRpbWVPYmplY3Q7CiAgICBteSAkU3RhcnRUaW1lU3RyZyA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAkU3RhcnRUaW1lU3RyZyA9fiBzL1stOl0vL2c7CiAgICAkU3RhcnRUaW1lU3RyZyA9fiBzL1xzL1QvOwoKICAgICMgZ2V0IHN5c3RlbSBGUUROCiAgICBteSAkRlFETiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRlFETicpOwoKICAgICMgcmV0dXJuIFVuaXF1ZUlECiAgICByZXR1cm4gIiRTdGFydFRpbWVTdHJnLSRIYXNoXEAkRlFETiI7Cn0KCj1oZWFkMiBBcHBvaW50bWVudFVwY29taW5nR2V0KCkKCkdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudCBzdGFydCBvciBlbmQuCgogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAnMjAxNi0wOC0wMiAwMzo1OTowMCcsICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgKTsKClJldHVybnMgYXBwb2ludG1lbnQgZGF0YSBvZiBBcHBvaW50bWVudEdldCgpLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VXBjb21pbmdHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjdXJyZW50IHRpbWVzdGFtcAogICAgbXkgJEN1cnJlbnRUaW1lc3RhbXA7CgogICAgIyBjcmVhdGUgbmVlZGVkIHNxbCBxdWVyeSBiYXNlZCBvbiB0aGUgY3VycmVudCBvciBhIGdpdmVuIHRpbWVzdGFtcAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50ICc7CgogICAgaWYgKCAkUGFyYW17VGltZXN0YW1wfSApIHsKICAgICAgICAkQ3VycmVudFRpbWVzdGFtcCA9ICRQYXJhbXtUaW1lc3RhbXB9OwogICAgICAgICRTUUwgLj0gIldIRVJFIG5vdGlmeV90aW1lID0gPyAiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9TdHJpbmcoKTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA+PSA/ICI7CiAgICB9CgogICAgJFNRTCAuPSAnT1JERVIgQlkgbm90aWZ5X3RpbWUgQVNDJzsKCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VycmVudFRpbWVzdGFtcCBdLAogICAgKTsKCiAgICBteSBAUmVzdWx0UmF3OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlVXBjb21pbmdBcHBvaW50bWVudDsKCiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gPSAkUm93WzBdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1BhcmVudElEfSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtDYWxlbmRhcklEfSAgICA9ICRSb3dbMl07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7VW5pcXVlSUR9ICAgICAgPSAkUm93WzNdOwoKICAgICAgICBwdXNoIEBSZXN1bHRSYXcsIFwlVXBjb21pbmdBcHBvaW50bWVudDsKICAgIH0KCiAgICBteSBAUmVzdWx0czsKCiAgICBBUFBPSU5UTUVOVERBVEE6CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50RGF0YSAoQFJlc3VsdFJhdykgewoKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEFwcG9pbnRtZW50RGF0YSk7CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntDYWxlbmRhcklEfTsKICAgICAgICBuZXh0IEFQUE9JTlRNRU5UREFUQSBpZiAhJEFwcG9pbnRtZW50RGF0YS0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoICV7JEFwcG9pbnRtZW50RGF0YX0gKTsKCiAgICAgICAgcHVzaCBAUmVzdWx0cywgXCVBcHBvaW50bWVudDsKICAgIH0KCiAgICByZXR1cm4gQFJlc3VsdHM7Cn0KCj1oZWFkMiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCkKCkRlbGV0ZSBhbGwgY2FsZW5kYXIgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgZnV0dXJlIHRhc2sgZGVsZXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKCiAgICAgICAgRlVUVVJFVEFTSzoKICAgICAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICEkRnV0dXJlVGFzazsKICAgICAgICAgICAgbmV4dCBGVVRVUkVUQVNLIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzayk7CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgZGVsZXRlIGZ1dHVyZSB0YXNrIHdpdGggaWQgJEZ1dHVyZVRhc2stPntUYXNrSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpCgpVcGRhdGUgT1RPQk8gZGFlbW9uIGZ1dHVyZSB0YXNrIGxpc3QgZm9yIHVwY29taW5nIGFwcG9pbnRtZW50cy4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc1VwZGF0ZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIGZ1dHVyZSB0YXNrIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBhcHBvaW50bWVudCBkYXRhIGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KCk7CgogICAgIyBjaGVjayBmb3Igbm8gdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBnZXQgYSBsb2NhbCBzY2hlZHVsZXIgZGIgb2JqZWN0CiAgICBteSAkU2NoZWR1bGVyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbHJlYWR5IHN0b3JlZCBmdXR1cmUgdGFza3MKICAgIG15IEBGdXR1cmVUYXNrTGlzdCA9ICRTY2hlZHVsZXJPYmplY3QtPkZ1dHVyZVRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0NhbGVuZGFyQXBwb2ludG1lbnQnLAogICAgKTsKCiAgICAjIGNoZWNrIGZvciBpbnZhbGlkIHRhc2sgY291bnQgKGp1c3Qgb25lIHRhc2sgbWF4IGFsbG93ZWQpCiAgICBpZiAoIHNjYWxhciBARnV0dXJlVGFza0xpc3QgPiAxICkgewoKICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb3VsZCBub3QgZGVsZXRlIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcyEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgaXQgaXMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgZnV0dXJlIHRhc2sgbGlzdAogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoIFxARnV0dXJlVGFza0xpc3QgKSApIHsKICAgICAgICBteSAkVXBkYXRlTmVlZGVkID0gMDsKCiAgICAgICAgRlVUVVJFVEFTSzoKICAgICAgICBmb3IgbXkgJEZ1dHVyZVRhc2sgKEBGdXR1cmVUYXNrTGlzdCkgewoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgIUlzSGFzaFJlZldpdGhEYXRhKCRGdXR1cmVUYXNrKQogICAgICAgICAgICAgICAgfHwgISRGdXR1cmVUYXNrLT57VGFza0lEfQogICAgICAgICAgICAgICAgfHwgISRGdXR1cmVUYXNrLT57RXhlY3V0aW9uVGltZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSBzdG9yZWQgZnV0dXJlIHRhc2sKICAgICAgICAgICAgbXkgJUZ1dHVyZVRhc2tEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza0dldCgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkRnV0dXJlVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSggXCVGdXR1cmVUYXNrRGF0YSApICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGRhdGUgdGltZSBvYmplY3RzIG9mIHN0b3JlZCBhbmQgdXBjb21pbmcgdGltZXMgdG8gY29tcGFyZS4KICAgICAgICAgICAgbXkgJEZ1dHVyZVRhc2tUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57Tm90aWZ5VGltZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkVXBjb21pbmdBcHBvaW50bWVudFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIERvIG5vdGhpbmcgaWYgdGhlIHVwY29taW5nIG5vdGlmaWNhdGlvbiB0aW1lIGVxdWFscyB0aGUgc3RvcmVkIHZhbHVlLgogICAgICAgICAgICBpZiAoICRVcGNvbWluZ0FwcG9pbnRtZW50VGltZU9iamVjdCAhPSAkRnV0dXJlVGFza1RpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlTmVlZGVkID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgRlVUVVJFVEFTSzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCRVcGRhdGVOZWVkZWQpIHsKCiAgICAgICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NEZWxldGUoKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNjaGVkdWxlIG5ldyBmdXR1cmUgdGFza3MgZm9yIG5vdGlmaWNhdGlvbiBhY3Rpb25zCiAgICBteSAkVGFza0lEID0gJFNjaGVkdWxlck9iamVjdC0+VGFza0FkZCgKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50c1swXS0+e05vdGlmaWNhdGlvbkRhdGV9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uJywKICAgICAgICBUeXBlICAgICAgICAgID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICAgICAgTm90aWZ5VGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkVGFza0lEICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBzY2hlZHVsZSBmdXR1cmUgdGFzayBmb3IgQXBwb2ludG1lbnRJRCAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntBcHBvaW50bWVudElEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgpCgpQcmVwYXJlIGFwcG9pbnRtZW50IG5vdGlmaWNhdGlvbiBkYXRhLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5fQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgcHJlcGFyYXRpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBfQXBwb2ludG1lbnROb3RpZmljYXRpb25QcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVzZXQgbm90aWZpY2F0aW9uIGRhdGEgaWYgbmVlZGVkCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKSB7CgogICAgICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uRGF0ZSBOb3RpZmljYXRpb25UZW1wbGF0ZSBOb3RpZmljYXRpb25DdXN0b20gTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdCBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBwb3NzaWJsZSBub3RpZmljYXRpb24gcGFyYW1zCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSBOb3RpZmljYXRpb25DdXN0b20gTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0CiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gJyc7CiAgICB9CgogICAgIyBzcGVjaWFsIGNoZWNrIGZvciByZWxhdGl2ZSB1bml0IGNvdW50IGFzIGl0IGNhbiBiZSB6ZXJvCiAgICAjIChlbXB0eSBhbmQgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgdHJlYXRlZCBhcyB6ZXJvIHRvIGF2b2lkIGVycm9ycykKICAgIGlmICgKICAgICAgICAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSApCiAgICAgICAgfHwgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IDw9IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ID0gMDsKICAgIH0KCiAgICAjIHNldCBlbXB0eSBkYXRldGltZSBzdHJpbmdzIHRvIHVuZGVmCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKHF3KE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWUpKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfTsKCiAgICAjCiAgICAjIHRlbXBsYXRlIFN0YXJ0CiAgICAjCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSBlcSAnU3RhcnQnICkgewoKICAgICAgICAjIHNldHVwIHRoZSBhcHBvaW50bWVudCBzdGFydCBkYXRlIGFzIG5vdGlmaWNhdGlvbiBkYXRlCiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9OwogICAgfQoKICAgICMKICAgICMgdGVtcGxhdGUgdGltZSBiZWZvcmUgc3RhcnQKICAgICMKICAgIGVsc2lmICgKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gbmUgJ0N1c3RvbScKICAgICAgICAmJiBJc051bWJlciggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkKICAgICAgICAmJiAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gPiAwCiAgICAgICAgKQogICAgewoKICAgICAgICByZXR1cm4gaWYgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gKTsKCiAgICAgICAgIyBvZmZzZXQgdGVtcGxhdGUgKGJlZm9yZSBzdGFydCBkYXRldGltZSkgdXNlZAogICAgICAgIG15ICRPZmZzZXQgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgICAgICMgR2V0IGRhdGUgdGltZSBvYmplY3Qgb2YgYXBwb2ludG1lbnQgc3RhcnQgdGltZS4KICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIFN1YnRyYWN0IG9mZnNldCBpbiBzZWNvbmRzIGZvciBuZXcgbm90aWZpY2F0aW9uIGRhdGUgdGltZS4KICAgICAgICAkU3RhcnRUaW1lT2JqZWN0LT5TdWJ0cmFjdCgKICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFN0YXJ0VGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIEN1c3RvbQogICAgIwogICAgZWxzZSB7CgogICAgICAgICMgQ29tcHV0ZSBkYXRlIG9mIGN1c3RvbSByZWxhdGl2ZSBpbnB1dC4KICAgICAgICBpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ3JlbGF0aXZlJyApIHsKCiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0Q291bnQgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0ICAgICAgPSAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdFBvaW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX07CgogICAgICAgICAgICAjIHNldHVwIHRoZSBjb3VudCB0byBjb21wdXRlIGZvciB0aGUgb2Zmc2V0CiAgICAgICAgICAgIG15ICVVbml0T2Zmc2V0Q29tcHV0ZSA9ICgKICAgICAgICAgICAgICAgIG1pbnV0ZXMgPT4gNjAsCiAgICAgICAgICAgICAgICBob3VycyAgID0+IDM2MDAsCiAgICAgICAgICAgICAgICBkYXlzICAgID0+IDg2NDAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdDsKCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIHN0YXJ0IHRpbWUuCiAgICAgICAgICAgIGlmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3Jlc3RhcnQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyc3RhcnQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIGVuZCB0aW1lLgogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE5vdCBzdXBwb3J0ZWQgcG9pbnQgb2YgdGltZS4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQKICAgICAgICAgICAgbXkgJE9mZnNldCA9ICggJEN1c3RvbVVuaXRDb3VudCAqICRVbml0T2Zmc2V0Q29tcHV0ZXskQ3VzdG9tVW5pdH0gKTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbmV3bHkgY29tcHV0ZWQgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZwogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRPZmZzZXQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gPSAkTm90aWZpY2F0aW9uTG9jYWxUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gZGF0ZS90aW1lIGlucHV0LgogICAgICAgIGVsc2lmICggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAjIHZhbGlkYXRpb24KICAgICAgICAgICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgZ2l2ZW4gZGF0ZSB0aW1lIHZhbHVlcyBhcyBub3RpZmljYXRpb24gZGF0ZXRpbWUgc3RyaW5nIChpLmUuIDIwMTYtMDYtMjggMDI6MDA6MDApCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gdW5kZWY7CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9ID0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAo9aGVhZDIgQXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoKQoKY29tcHV0ZXMgZXhlY3V0aW9uIHRpbWUgZm9yIGZ1dHVyZSB0YXNrcyBvZiB0eXBlIEFwcG9pbnRtZW50VG9UaWNrZXQgYmFzZWQgb24gc3RhcnQgdGltZSBhbmQgb2Zmc2V0IHBhcmFtcwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIFN0YXJ0VGltZSBFbmRUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVzZXQgdGlja2V0IGRhdGEgaWYgbmVlZGVkCiAgICBpZiAoICEkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gKSB7CgogICAgICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgICAgIHF3KAogICAgICAgICAgICAgICAgVGlja2V0RGF0ZSBUaWNrZXRUZW1wbGF0ZSBUaWNrZXRDdXN0b20gVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQKICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCBUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lIFRpY2tldEN1c3RvbURhdGVUaW1lCiAgICAgICAgICAgICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgICMgY29tcHV0ZSBleGVjdXRpb24gdGltZSBmb3IgdGFzawogICAgIyBwcmVwYXJlIHBvc3NpYmxlIHRpY2tldCBwYXJhbXMKICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAoCiAgICAgICAgcXcoCiAgICAgICAgICAgIFRpY2tldFRlbXBsYXRlIFRpY2tldEN1c3RvbSBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQKICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSAnJzsKICAgIH0KCiAgICAjIHNwZWNpYWwgY2hlY2sgZm9yIHJlbGF0aXZlIHVuaXQgY291bnQgYXMgaXQgY2FuIGJlIHplcm8KICAgICMgKGVtcHR5IGFuZCBuZWdhdGl2ZSB2YWx1ZXMgd2lsbCBiZSB0cmVhdGVkIGFzIHplcm8gdG8gYXZvaWQgZXJyb3JzKQogICAgaWYgKAogICAgICAgICFJc051bWJlciggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ICkKICAgICAgICB8fCAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gPD0gMAogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gPSAwOwogICAgfQoKICAgICMgc2V0IGVtcHR5IGRhdGV0aW1lIHN0cmluZ3MgdG8gdW5kZWYKICAgIGZvciBteSAkUG9zc2libGVQYXJhbSAocXcoVGlja2V0RGF0ZSBUaWNrZXRDdXN0b21EYXRlVGltZSkpIHsKICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gfHw9IHVuZGVmOwogICAgfQoKICAgIHJldHVybiBpZiAhJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9OwoKICAgICMKICAgICMgdGVtcGxhdGUgU3RhcnQKICAgICMKICAgIGlmICggJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9IGVxICdTdGFydCcgKSB7CgogICAgICAgICMgc2V0dXAgdGhlIGFwcG9pbnRtZW50IHN0YXJ0IGRhdGUgYXMgdGlja2V0IGRhdGUKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRQYXJhbXtTdGFydFRpbWV9OwogICAgfQoKICAgICMKICAgICMgdGVtcGxhdGUgdGltZSBiZWZvcmUgc3RhcnQKICAgICMKICAgIGVsc2lmICgKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gbmUgJ0N1c3RvbScKICAgICAgICAmJiBJc051bWJlciggJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ICkKICAgICAgICAmJiAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gPiAwCiAgICAgICAgKQogICAgewoKICAgICAgICByZXR1cm4gaWYgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX0gKTsKCiAgICAgICAgIyBvZmZzZXQgdGVtcGxhdGUgKGJlZm9yZSBzdGFydCBkYXRldGltZSkgdXNlZAogICAgICAgIG15ICRPZmZzZXQgPSAkUGFyYW17RGF0YX0tPntUaWNrZXRUZW1wbGF0ZX07CgogICAgICAgICMgR2V0IGRhdGUgdGltZSBvYmplY3Qgb2YgYXBwb2ludG1lbnQgc3RhcnQgdGltZS4KICAgICAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTdWJ0cmFjdCBvZmZzZXQgaW4gc2Vjb25kcyBmb3IgbmV3IG5vdGlmaWNhdGlvbiBkYXRlIHRpbWUuCiAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMKICAgIGVsc2UgewoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gcmVsYXRpdmUgaW5wdXQuCiAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRQb2ludCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRUaWNrZXRMb2NhbFRpbWVPYmplY3Q7CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBzdGFydCB0aW1lLgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRMb2NhbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBDb21wdXRlIGZyb20gZW5kIHRpbWUuCiAgICAgICAgICAgIGVsc2lmICggJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcmVuZCcgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0TG9jYWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIE5vdCBzdXBwb3J0ZWQgcG9pbnQgb2YgdGltZS4KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY29tcHV0ZSB0aGUgb2Zmc2V0IHRvIGJlIHVzZWQKICAgICAgICAgICAgbXkgJE9mZnNldCA9ICggJEN1c3RvbVVuaXRDb3VudCAqICRVbml0T2Zmc2V0Q29tcHV0ZXskQ3VzdG9tVW5pdH0gKTsKCiAgICAgICAgICAgICMgc2F2ZSB0aGUgbmV3bHkgY29tcHV0ZWQgdGlja2V0IGRhdGV0aW1lIHN0cmluZwogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnICkgewogICAgICAgICAgICAgICAgJFRpY2tldExvY2FsVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gJFRpY2tldExvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRUaWNrZXRMb2NhbFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgICAgICBTZWNvbmRzID0+ICRPZmZzZXQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gPSAkVGlja2V0TG9jYWxUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gZGF0ZS90aW1lIGlucHV0LgogICAgICAgIGVsc2lmICggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tfSBlcSAnZGF0ZXRpbWUnICkgewoKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tfSA9ICdkYXRldGltZSc7CgogICAgICAgICAgICAjIHZhbGlkYXRpb24KICAgICAgICAgICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2F2ZSB0aGUgZ2l2ZW4gZGF0ZSB0aW1lIHZhbHVlcyBhcyB0aWNrZXQgZGF0ZXRpbWUgc3RyaW5nIChpLmUuIDIwMTYtMDYtMjggMDI6MDA6MDApCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9OwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gdW5kZWY7CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9ICkgKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tRGF0ZVRpbWV9ID0gdW5kZWY7CiAgICB9CiAgICByZXR1cm4gJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX07Cgp9CgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCj1oZWFkMiBBcHBvaW50bWVudE5vdGlmaWNhdGlvbigpCgpXaWxsIGJlIHRyaWdnZXJlZCBieSB0aGUgT1RPQk8gZGFlbW9uIHRvIGZpcmUgZXZlbnRzIGZvciBhcHBvaW50bWVudHMsCnRoYXQgcmVhY2hlcyBpdCdzIHJlbWluZGVyIChub3RpZmljYXRpb24pIHRpbWUuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Tm90aWZpY2F0aW9uKCk7CgpyZXR1cm5zOgoKICAgIFRydWUgaWYgbm90aWZ5IGFjdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGZhbHNlLgoKPWN1dAoKc3ViIEFwcG9pbnRtZW50Tm90aWZpY2F0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhOb3RpZnlUaW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFwcG9pbnRtZW50cyBmb3IgdGhlIHJlbGF0ZWQgbm90aWZpY2F0aW9uIHRpbWVzdGFtcAogICAgbXkgQFVwY29taW5nQXBwb2ludG1lbnRzID0gJFNlbGYtPkFwcG9pbnRtZW50VXBjb21pbmdHZXQoCiAgICAgICAgVGltZXN0YW1wID0+ICRQYXJhbXtOb3RpZnlUaW1lfSwKICAgICk7CgogICAgcmV0dXJuIGlmICFJc0FycmF5UmVmV2l0aERhdGEoIFxAVXBjb21pbmdBcHBvaW50bWVudHMgKTsKCiAgICAjIHNsZWVwIGF0IGxlYXN0IDEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgdGltZXN0YW1wIGRvZXNuJ3QKICAgICMgZXF1YWxzIHRoZSBsYXN0IG9uZSBmb3IgdXBkYXRlIHVwY29taW5nIGZ1dHVyZSB0YXNrcwogICAgc2xlZXAgMTsKCiAgICBVUENPTUlOR0FQUE9JTlRNRU5UOgogICAgZm9yIG15ICRVcGNvbWluZ0FwcG9pbnRtZW50IChAVXBjb21pbmdBcHBvaW50bWVudHMpIHsKCiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICEkVXBjb21pbmdBcHBvaW50bWVudDsKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRVcGNvbWluZ0FwcG9pbnRtZW50KTsKICAgICAgICBuZXh0IFVQQ09NSU5HQVBQT0lOVE1FTlQgaWYgISRVcGNvbWluZ0FwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH07CgogICAgICAgICMgZmlyZSBldmVudAogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFVwY29taW5nQXBwb2ludG1lbnQtPntBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFVwY29taW5nQXBwb2ludG1lbnQtPntDYWxlZGFySUR9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCBBcHBvaW50bWVudCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntFbmRUaW1lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUV4Y2x1ZGV9IC8vIFtdIH07CgogICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgQFJlY3VycmVuY2VFeGNsdWRlID0gZ3JlcCB7IGRlZmluZWQgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgIyByZXNldCB0aGUgcGFyYW1ldGVyIGZvciBvY2N1cnJlbmNlcwogICAgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VFeGNsdWRlfSA9IHVuZGVmOwoKICAgIG15ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICBteSAkT3JpZ2luYWxFbmRUaW1lT2JqZWN0ICAgPSAkRW5kVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgIG15ICRTdGVwICAgICAgICAgICAgICAgICAgICA9IDA7CgogICAgIyB1bnRpbCAuLi4KICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIFVOVElMX1RJTUU6CiAgICAgICAgd2hpbGUgKCAkU3RhcnRUaW1lT2JqZWN0IDw9ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgKSB7CiAgICAgICAgICAgICRTdGVwICs9ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgcmVjdXJyaW5nIHRpbWVzCiAgICAgICAgICAgICRTdGFydFRpbWVPYmplY3QgPSAkU2VsZi0+X0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lKAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnQgID0+ICRQYXJhbXtBcHBvaW50bWVudH0sCiAgICAgICAgICAgICAgICBTdGVwICAgICAgICAgPT4gJFN0ZXAsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsU3RhcnRUaW1lT2JqZWN0LAogICAgICAgICAgICAgICAgQ3VycmVudFRpbWUgID0+ICRTdGFydFRpbWVPYmplY3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgISRTdGFydFRpbWVPYmplY3Q7CiAgICAgICAgICAgIGxhc3QgVU5USUxfVElNRSBpZiAkU3RhcnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdDsKCiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIFNlY29uZHMgPT4KICAgICAgICAgICAgICAgICAgICAkT3JpZ2luYWxFbmRUaW1lT2JqZWN0LT5EZWx0YSggRGF0ZVRpbWVPYmplY3QgPT4gJE9yaWdpbmFsU3RhcnRUaW1lT2JqZWN0ICktPntBYnNvbHV0ZVNlY29uZHN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lICAgPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICAgICAgICAgICMgQnVnZml4OiBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBwZXJsIHZlcnNpb24gc3lzdGVtIG1pZ2h0IGNhbGN1bGF0ZSB0aW1lem9uZSBkaWZmZXJlbmNlLgogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkU2VsZi0+X1RpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgVU5USUxfVElNRSBpZiBncmVwIHsgJFN0YXJ0VGltZSBlcSAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAgICAgICAgICRTZWxmLT5BcHBvaW50bWVudENyZWF0ZSgKICAgICAgICAgICAgICAgICV7ICRQYXJhbXtBcHBvaW50bWVudH0gfSwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgICAgICAgICAgICAgU3RhcnRUaW1lICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICAgICBFbmRUaW1lICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBmb3IgLi4uIHRpbWUocykKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH0gKSB7CgogICAgICAgIENPVU5UOgogICAgICAgIGZvciAoIDEgLi4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VDb3VudH0gLSAxICkgewogICAgICAgICAgICAkU3RlcCArPSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmluZyB0aW1lcwogICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0ID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiAkUGFyYW17QXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgU3RlcCAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCwKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkU3RhcnRUaW1lT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBDT1VOVCBpZiAhJFN0YXJ0VGltZU9iamVjdDsKCiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0ID0gJFN0YXJ0VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJEVuZFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIFNlY29uZHMgPT4KICAgICAgICAgICAgICAgICAgICAkT3JpZ2luYWxFbmRUaW1lT2JqZWN0LT5EZWx0YSggRGF0ZVRpbWVPYmplY3QgPT4gJE9yaWdpbmFsU3RhcnRUaW1lT2JqZWN0ICktPntBYnNvbHV0ZVNlY29uZHN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN0YXJ0VGltZSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIG15ICRFbmRUaW1lICAgPSAkRW5kVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKCiAgICAgICAgICAgICMgQnVnZml4OiBvbiBzb21lIHN5c3RlbXMgd2l0aCBvbGRlciBwZXJsIHZlcnNpb24gc3lzdGVtIG1pZ2h0IGNhbGN1bGF0ZSB0aW1lem9uZSBkaWZmZXJlbmNlLgogICAgICAgICAgICAkU3RhcnRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkU2VsZi0+X1RpbWVDaGVjaygKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgICAgICAgICBUaW1lICAgICAgICAgPT4gJEVuZFRpbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZXhjbHVkZWQgYXBwb2ludG1lbnRzCiAgICAgICAgICAgIG5leHQgQ09VTlQgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYXJlbnRJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRQYXJhbXtQYXJlbnRJRH0gKTsKICAgIG15IEBBcHBvaW50bWVudExpc3QgICA9ICRTZWxmLT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAkUGFyZW50QXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0sCiAgICAgICAgUGFyZW50SUQgICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZiBwcmVzZW50CiAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRMaXN0KSB7CiAgICAgICAgaWYgKCAkQXBwb2ludG1lbnQtPntGdXR1cmVUYXNrSUR9ICkgewogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEFwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdGdXR1cmUgdGFzayBBcHBvaW50bWVudFRpY2tldCBjb3VsblwndCBiZSBkZWxldGVkIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBkZWxldGUgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgbXkgJFNRTCA9ICcKICAgICAgICBERUxFVEUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFdIRVJFIHBhcmVudF9pZCA9ID8KICAgICc7CgogICAgIyBkZWxldGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17UGFyZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgUmVjdXJyZW5jZUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJERCT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIHJlY3VyX2V4Y2x1ZGUgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGdldCBleGlzdGluZyBleGNsdXNpb25zCiAgICBteSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzcGxpdCggLywvLCAkUm93WzBdICkgaWYgJFJvd1swXTsKICAgIH0KICAgIHB1c2ggQFJlY3VycmVuY2VFeGNsdWRlLCAkUGFyYW17UmVjdXJyZW5jZUlEfTsKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IHNvcnQgQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgam9pbiBpbnRvIHN0cmluZwogICAgbXkgJFJlY3VycmVuY2VFeGNsdWRlOwogICAgaWYgKEBSZWN1cnJlbmNlRXhjbHVkZSkgewogICAgICAgICRSZWN1cnJlbmNlRXhjbHVkZSA9IGpvaW4oICcsJywgQFJlY3VycmVuY2VFeGNsdWRlICk7CiAgICB9CgogICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnVVBEQVRFIGNhbGVuZGFyX2FwcG9pbnRtZW50IFNFVCByZWN1cl9leGNsdWRlID0gPyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFJlY3VycmVuY2VFeGNsdWRlLCBcJFBhcmFte1BhcmVudElEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17UGFyZW50SUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudEdldENhbGVuZGFySUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIGNhbGVuZGFyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JzsKICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0FwcG9pbnRtZW50SUR9ICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHN0YXJ0IHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkQ2FsZW5kYXJJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDYWxlbmRhcklEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJENhbGVuZGFySUQ7Cn0KCnN1YiBfQXBwb2ludG1lbnRHZXRSZWN1cnJlbmNlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50SUQpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNxbCBxdWVyeQogICAgbXkgJFNRTCAgPSAnU0VMRUNUIHJlY3VyX2lkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JzsKICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0FwcG9pbnRtZW50SUR9ICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIHN0YXJ0IHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAkUmVjdXJyZW5jZUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFJlY3VycmVuY2VJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRSZWN1cnJlbmNlSUQ7Cn0KCnN1YiBfQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KEFwcG9pbnRtZW50IFN0ZXAgT3JpZ2luYWxUaW1lIEN1cnJlbnRUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE9yaWdpbmFsVGltZU9iamVjdCA9ICRQYXJhbXtPcmlnaW5hbFRpbWV9OwoKICAgICMgV2Ugd2lsbCBtb2RpZnkgdGhpcyBvYmplY3QgdGhyb3VnaG91dCB0aGUgZnVuY3Rpb24uCiAgICBteSAkQ3VycmVudFRpbWVPYmplY3QgPSAkUGFyYW17Q3VycmVudFRpbWV9OwoKICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnRGFpbHknICkgewoKICAgICAgICAjIEFkZCBvbmUgZGF5LgogICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnV2Vla2x5JyApIHsKCiAgICAgICAgIyBBZGQgNyBkYXlzLgogICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+IDcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnTW9udGhseScgKSB7CiAgICAgICAgbXkgJFRlbXBUaW1lT2JqZWN0ID0gJE9yaWdpbmFsVGltZU9iamVjdC0+Q2xvbmUoKTsKCiAgICAgICAgIyBSZW1lbWJlciBzdGFydCBkYXkuCiAgICAgICAgbXkgJFN0YXJ0RGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICMgQWRkIG1vbnRocyBiYXNlZCBvbiBjdXJyZW50IHN0ZXAuCiAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgIE1vbnRocyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgZW5kIGRheS4KICAgICAgICBteSAkRW5kRGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICMgQ2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogSmFudWFyeSAzMSArIDEgbW9udGggPSBNYXJjaCAxKS4KICAgICAgICBpZiAoICRTdGFydERheSAhPSAkRW5kRGF5ICkgewogICAgICAgICAgICAkVGVtcFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgRGF5cyA9PiAkRW5kRGF5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFRlbXBUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdZZWFybHknICkgewogICAgICAgIG15ICRUZW1wVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CgogICAgICAgICMgUmVtZW1iZXIgc3RhcnQgZGF5LgogICAgICAgIG15ICRTdGFydERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAjIEFkZCB5ZWFycyBiYXNlZCBvbiBjdXJyZW50IHN0ZXAuCiAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgIFllYXJzID0+ICRQYXJhbXtTdGVwfSwKICAgICAgICApOwoKICAgICAgICAjIEdldCBlbmQgZGF5LgogICAgICAgIG15ICRFbmREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgIyBDaGVjayBpZiBtb250aCBkb2Vzbid0IGhhdmUgZW5vdWdoIGRheXMgKGZvciBleGFtcGxlOiBKYW51YXJ5IDMxICsgMSBtb250aCA9IE1hcmNoIDEpLgogICAgICAgIGlmICggJFN0YXJ0RGF5ICE9ICRFbmREYXkgKSB7CiAgICAgICAgICAgICRUZW1wVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICBEYXlzID0+ICRFbmREYXksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QgPSAkVGVtcFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbURhaWx5JyApIHsKCiAgICAgICAgIyBBZGQgbnVtYmVyIG9mIGRheXMuCiAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgIERheXMgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tV2Vla2x5JyApIHsKCiAgICAgICAgIyB0aGlzIGJsb2NrIGNvdmVycyBmb2xsb3dpbmcgdXNlIGNhc2U6CiAgICAgICAgIyBlYWNoIG4tdGggTW9uZGF5IGFuZCBGcmlkYXkKCiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICAjIGxvb3AgdXAgdG8gNypuIHRpbWVzICg3IGRheXMgaW4gd2VlayAqIGZyZXF1ZW5jeSkKICAgICAgICBMT09QOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCA3ICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCBvbmUgZGF5LgogICAgICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIERheXMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRDV0RpZmYgPSAkU2VsZi0+X0NXRGlmZigKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkQ3VycmVudFRpbWVPYmplY3QsCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJE9yaWdpbmFsVGltZU9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgTE9PUCBpZiAkQ1dEaWZmICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICBteSAkV2Vla0RheSA9ICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntEYXlPZldlZWt9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBTeXN0ZW1UaW1lIG1hdGNoIHJlcXVpcmVtZW50cwogICAgICAgICAgICBpZiAoIGdyZXAgeyAkV2Vla0RheSA9PSAkXyB9IEB7ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRnJlcXVlbmN5fSB9ICkgewogICAgICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgICAgIGxhc3QgTE9PUDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CgogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JyApIHsKCiAgICAgICAgIyBPY2N1cnMgZXZlcnkgMm5kIG1vbnRoIG9uIDV0aCwgMTB0aCBhbmQgMTV0aCBkYXkKICAgICAgICBteSAkRm91bmQ7CgogICAgICAgICMgbG9vcCB0aHJvdWdoIGVhY2ggZGF5IChtYXggb25lIHllYXIpLCBhbmQgY2hlY2sgaWYgZGF5IG1hdGNoZXMuCiAgICAgICAgREFZOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMDsgJENvdW50ZXIgPCAzMSAqIDM2NjsgJENvdW50ZXIrKyApIHsKCiAgICAgICAgICAgICMgQWRkIG9uZSBkYXkuCiAgICAgICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBTa2lwIG1vbnRoIGlmIG5lZWRlZAogICAgICAgICAgICBuZXh0IERBWQogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57TW9udGh9IC0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCktPntNb250aH0gKQogICAgICAgICAgICAgICAgJSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgbmV4dCBkYXkgaWYgdGhpcyBkYXkgc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBEQVkKICAgICAgICAgICAgICAgIGlmICFncmVwIHsgJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX0gPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgREFZOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWYgISRGb3VuZDsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JyApIHsKCiAgICAgICAgIyB0aGlzIGJsb2NrIGNvdmVycyBmb2xsb3dpbmcgdXNlIGNhc2U6CiAgICAgICAgIyBPY2N1cnMgZWFjaCAzdGggeWVhciwgSmFudWFyeSAxOHRoIGFuZCBNYXJjaCAxOHRoCiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICBteSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0OwogICAgICAgIGlmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0gKSB7CiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkTmV4dERheU9iamVjdCA9ICRDdXJyZW50VGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAkTmV4dERheU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgTU9OVEg6CiAgICAgICAgZm9yICggbXkgJENvdW50ZXIgPSAxOzsgJENvdW50ZXIrKyApIHsKICAgICAgICAgICAgbXkgJFRlbXBUaW1lT2JqZWN0ID0gJE9yaWdpbmFsVGltZU9iamVjdC0+Q2xvbmUoKTsKCiAgICAgICAgICAgICMgcmVtZW1iZXIgc3RhcnQgZGF5CiAgICAgICAgICAgIG15ICRTdGFydERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBNb250aHMgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGdldCBlbmQgZGF5CiAgICAgICAgICAgIG15ICRFbmREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogamFudWFyeSAzMSArIDEgbW9udGggPSBtYXJjaCAwMSkKICAgICAgICAgICAgaWYgKCAkU3RhcnREYXkgIT0gJEVuZERheSApIHsKICAgICAgICAgICAgICAgICRUZW1wVGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgICAgICAgICAgRGF5cyA9PiAkRW5kRGF5LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFRlbXBUaW1lT2JqZWN0LT5DbG9uZSgpOwoKICAgICAgICAgICAgIyBza2lwIHRoaXMgdGltZSwgc2luY2UgaXQgd2FzIGFscmVhZHkgY2hlY2tlZAogICAgICAgICAgICBuZXh0IE1PTlRIIGlmICRDdXJyZW50VGltZU9iamVjdCA8ICROZXh0RGF5T2JqZWN0OwoKICAgICAgICAgICAgIyBjaGVjayBsb29wIGNvbmRpdGlvbnMgKGFjY29yZGluZyB0byBVbnRpbCAvICkKICAgICAgICAgICAgaWYgKCRSZWN1cnJlbmNlVW50aWxPYmplY3QpIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEggaWYgJEN1cnJlbnRUaW1lT2JqZWN0ID4gJFJlY3VycmVuY2VVbnRpbE9iamVjdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxhc3QgTU9OVEgKICAgICAgICAgICAgICAgICAgICBpZiAkQ291bnRlcgogICAgICAgICAgICAgICAgICAgID4gMTIgKiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfSAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIGlmIHllYXIgaXMgT0sKICAgICAgICAgICAgbmV4dCBNT05USAogICAgICAgICAgICAgICAgaWYgKCAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57WWVhcn0gLSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5HZXQoKS0+e1llYXJ9ICkKICAgICAgICAgICAgICAgICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIG5leHQgbW9udGggaWYgdGhpcyBtb250aCBzaG91bGQgYmUgc2tpcHBlZAogICAgICAgICAgICBuZXh0IE1PTlRICiAgICAgICAgICAgICAgICBpZiAhZ3JlcCB7ICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntNb250aH0gPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfTsKCiAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgIGxhc3QgTU9OVEg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQ3VycmVudFRpbWVPYmplY3Q7Cn0KCj1oZWFkMiBfVGltZUNoZWNrKCkKCkNoZWNrIGlmIFRpbWUgYW5kIE9yaWdpbmFsVGltZSBoYXZlIHNhbWUgaG91ciwgbWludXRlIGFuZCBzZWNvbmQgdmFsdWUsIGFuZCByZXR1cm4gdGltZXN0YW1wIHdpdGgKdmFsdWVzIChob3VyLCBtaW51dGUgYW5kIHNlY29uZCkgYXMgaW4gVGltZS4KCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgT3JpZ2luYWxUaW1lID0+ICcyMDE2LTAxLTAxIDAwOjAxOjAwJywgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFRpbWUgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMjowMCcsICAgICAjIChyZXF1aXJlZCkKICAgICk7CgpSZXR1cm5zOgogICAgJFJlc3VsdCA9ICcyMDE2LTAyLTAxIDAwOjAxOjAwJzsKCj1jdXQKCnN1YiBfVGltZUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgZm9yIG15ICROZWVkZWQgKHF3KE9yaWdpbmFsVGltZSBUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgKCAkT3JpZ2luYWxEYXRlLCAkT3JpZ2luYWxUaW1lICkgPSAkUGFyYW17T3JpZ2luYWxUaW1lfSA9fiBtLyguKj8pXHMoLio/KSQvOwogICAgbXkgKCREYXRlKSA9ICRQYXJhbXtUaW1lfSA9fiBtLyguKj8pXHMoLio/KSQvOwoKICAgIHJldHVybiAiJERhdGUgJE9yaWdpbmFsVGltZSI7Cn0KCj1oZWFkMiBfQ1dEaWZmKCkKClJldHVybnMgaG93IG1hbnkgY2FsZW5kYXIgd2Vla3MgaGFzIHBhc3NlZCBiZXR3ZWVuIHR3byB1bml4IHRpbWVzLgoKICAgIG15ICRDV0RpZmYgPSAkU2VsZi0+X0NXRGlmZigKICAgICAgICBDdXJyZW50VGltZSAgPT4gJEN1cnJlbnRUaW1lT2JqZWN0LCAgICAgKHJlcXVpcmVkKSBEYXRlIHRpbWUgb2JqZWN0IHdpdGggY3VycmVudCB0aW1lCiAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFRpbWVPYmplY3QsICAgIChyZXF1aXJlZCkgRGF0ZSB0aW1lIG9iamVjdCB3aXRoIG9yaWdpbmFsIHRpbWUKICAgICk7CgpyZXR1cm5zOgogICAgJENXRGlmZiA9IDU7Cgo9Y3V0CgpzdWIgX0NXRGlmZiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhDdXJyZW50VGltZSBPcmlnaW5hbFRpbWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkT3JpZ2luYWxUaW1lT2JqZWN0ID0gJFBhcmFte09yaWdpbmFsVGltZX07CiAgICBteSAkQ3VycmVudFRpbWVPYmplY3QgID0gJFBhcmFte0N1cnJlbnRUaW1lfTsKCiAgICBteSAkU3RhcnRZZWFyID0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCktPntZZWFyfTsKICAgIG15ICRFbmRZZWFyICAgPSAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57WWVhcn07CgogICAgbXkgJFJlc3VsdCA9ICRDdXJyZW50VGltZU9iamVjdC0+e0NQQU5EYXRlVGltZU9iamVjdH0tPndlZWtfbnVtYmVyKCkKICAgICAgICAtICRPcmlnaW5hbFRpbWVPYmplY3QtPntDUEFORGF0ZVRpbWVPYmplY3R9LT53ZWVrX251bWJlcigpOwoKICAgICMgSWYgZGF0ZSBpcyBlbmQgb2YgdGhlIHllYXIgYW5kIGRhdGUgQ1cgc3RhcnRzIHdpdGggMSwgd2UgbmVlZCB0byBpbmNsdWRlIGFkZGl0aW9uYWwgeWVhci4KICAgIGlmICggJFJlc3VsdCA8IDAgJiYgJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX0gPT0gMzEgJiYgJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e01vbnRofSA9PSAxMiApIHsKICAgICAgICAkRW5kWWVhcisrOwogICAgfQoKICAgIGZvciBteSAkWWVhciAoICRTdGFydFllYXIgLi4gJEVuZFllYXIgLSAxICkgewogICAgICAgIG15ICRDVyAgPSAwOwogICAgICAgIG15ICREYXkgPSAzMTsKCiAgICAgICAgd2hpbGUgKCAkQ1cgPCA1MCApIHsKCiAgICAgICAgICAgICMgVG8gZ2V0IGhvdyBtYW55IENXJ3MgYXJlIGluIHRoaXMgeWVhciwgd2Ugc2V0IHRlbXBvcmFyeSBkYXRlIHRvIDMxLWRlYy4KICAgICAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gIiRZZWFyLTEyLSREYXkgMjM6NTk6MDAiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRDVyA9ICREYXRlVGltZU9iamVjdC0+e0NQQU5EYXRlVGltZU9iamVjdH0tPndlZWtfbnVtYmVyKCk7CiAgICAgICAgICAgICREYXktLTsKICAgICAgICB9CgogICAgICAgICRSZXN1bHQgKz0gJENXOwogICAgfQoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9ZW5kIEludGVybmFsOgoKPWN1dAoKMTsK</File>
        <File Location="Custom/Kernel/System/Daemon/SchedulerDB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBlNDRjMThhZWE5YWJjMTI1ZmRkZjljZWVlZDIwNGRiNGZhYjI5MGUwIC0gS2VybmVsL1N5c3RlbS9EYWVtb24vU2NoZWR1bGVyREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKdXNlIFRpbWU6OkhpUmVzICAoKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljQWdlbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCIC0gU2NoZWR1bGVyIGRhdGFiYXNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpJbmNsdWRlcyBhbGwgc2NoZWR1bGVyIHJlbGF0ZWQgZGF0YWJhc2UgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGEgc2NoZWR1bGVyIGRhdGFiYXNlIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgbXkgJFNjaGVkdWxlckRCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgVGFza0FkZCgpCgphZGQgYSBuZXcgdGFzayB0byBzY2hlZHVsZXIgdGFzayBsaXN0CgogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0FkZCgKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLCAgICAgIyBlLiBnLiBHZW5lcmljSW50ZXJmYWNlLCBUZXN0CiAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgICAgID0+ICdhbnkgbmFtZScsICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBBdHRlbXB0cyAgICAgICAgICAgICAgICAgPT4gNSwgICAgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAxKQogICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApLCBudW1iZXIgb2YgdGFza3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHdpdGggdGhlIHNhbWUgdHlwZSAoYW5kIG5hbWUgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHByb3ZpZGVkKSB0aGF0IGNhbiBleGlzdHMgYXQgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHRpbWUsIHZhbHVlIG9mIDAgbWVhbnMgdW5saW1pdGVkCiAgICAgICAgRGF0YSA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGF0YSBwYXlsb2FkCiAgICAgICAgICAgIC4uLgogICAgICAgIH0sCiAgICApOwoKUmV0dXJuczoKCiAgICBteSAkVGFza0lEID0gMTIzOyAgIyBmYWxzZSBpbiBjYXNlIG9mIGFuIGVycm9yIG9yIC0xIGluIGNhc2Ugb2YgcmVhY2ggTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzCgo9Y3V0CgpzdWIgVGFza0FkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoVHlwZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ICYmICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ID1+IG17XEEgXGQrIFx6fW1zeCApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgYWxsIHdvcmtlciB0YXNrcyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHR5cGUKICAgICAgICBteSBATGlzdCA9ICRTZWxmLT5UYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEZpbHRlcmVkTGlzdCA9IEBMaXN0OwoKICAgICAgICBpZiAoICRQYXJhbXtOYW1lfSApIHsKCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCB0YXNrcyB0aGF0IGRvZXMgbm90IG1hdGNoIHNwZWNpZmllZCB0YXNrIG5hbWUKICAgICAgICAgICAgQEZpbHRlcmVkTGlzdCA9IGdyZXAgeyAkXy0+e05hbWV9IGVxICRQYXJhbXtOYW1lfSB9IEBMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjb21wYXJlIHRoZSBudW1iZXIgb2YgdGFzayB3aXRoIHRoZSBtYXhpbXVtIHBhcmFsbGVsIGxpbWl0CiAgICAgICAgcmV0dXJuIC0xIGlmIHNjYWxhciBARmlsdGVyZWRMaXN0ID49ICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgb2YgYXR0ZW1wdHMgcGFyYW1ldGVyCiAgICAkUGFyYW17QXR0ZW1wdHN9IHx8PSAxOwoKICAgICMgc2VyaWFsaXplIGRhdGEgYXMgc3RyaW5nCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgZW5jb2RlIHRhc2sgZGF0YQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoJERhdGEpOwogICAgJERhdGEgPSBlbmNvZGVfYmFzZTY0KCREYXRhKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJElkZW50aWZpZXI7CiAgICBUUlk6CiAgICBmb3IgbXkgJFRyeSAoIDEgLi4gMTAgKSB7CgogICAgICAgICMgY2FsY3VsYXRlIGEgdGFzayBpZGVudGlmaWVyCiAgICAgICAgJElkZW50aWZpZXIgPSAkU2VsZi0+X0dldElkZW50aWZpZXIoKTsKCiAgICAgICAgIyBpbnNlcnQgdGhlIHRhc2sgKGluaXRpYWxseSBsb2NrZWQgd2l0aCBsb2NrX2tleSA9IDEgc28gaXQgd2lsbCBub3QgYmUgdGFrZW4gYnkgYW55IHdvcmtlcgogICAgICAgICMgICBhdCB0aGlzIG1vbWVudCkKICAgICAgICBsYXN0IFRSWSBpZiAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgICAgICAgICAoaWRlbnQsIG5hbWUsIHRhc2tfdHlwZSwgdGFza19kYXRhLCBhdHRlbXB0cywgbG9ja19rZXksIGNyZWF0ZV90aW1lKQogICAgICAgICAgICAgICAgVkFMVUVTCiAgICAgICAgICAgICAgICAgICAgKD8sID8sID8sID8sID8sIDEsIGN1cnJlbnRfdGltZXN0YW1wKScsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRJZGVudGlmaWVyLAogICAgICAgICAgICAgICAgXCRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICBcJERhdGEsCiAgICAgICAgICAgICAgICBcJFBhcmFte0F0dGVtcHRzfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRhc2sgaWQKICAgICREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgaWQgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZGVudCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJElkZW50aWZpZXIgXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgdGFzayBpZAogICAgbXkgJFRhc2tJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUYXNrSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdW5sb2NrIHRoZSB0YXNrLCBmb3Igbm93IG9uIHRoZSB0YXNrIGNhbiBiZSB0YWtlbiBieSBhbnkgd29ya2VyCiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMSBBTkQgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRUYXNrSUQsCiAgICAgICAgXSwKICAgICk7CgogICAgIyBkZWxldGUgdGFzayBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdUYXNrTGlzdFVubG9ja2VkJywKICAgICk7CgogICAgcmV0dXJuICRUYXNrSUQ7Cn0KCj1oZWFkMiBUYXNrR2V0KCkKCmdldCBzY2hlZHVsZXIgdGFzawoKICAgIG15ICVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrR2V0KAogICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICAlVGFzayA9ICgKICAgICAgICBUYXNrSUQgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ2FueSBuYW1lJywKICAgICAgICBUeXBlICAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgRGF0YSAgICAgICAgICAgPT4gJERhdGFSZWYsCiAgICAgICAgQXR0ZW1wdHMgICAgICAgPT4gMTAsCiAgICAgICAgTG9ja0tleSAgICAgICAgPT4gJ1hZWicsCiAgICAgICAgTG9ja1RpbWUgICAgICAgPT4gJzIwMTEtMDItMDggMTU6MDg6MDEnLAogICAgICAgIExvY2tVcGRhdGVUaW1lID0+ICcyMDExLTAyLTA4IDE1OjA4OjAxJywKICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICApOwoKPWN1dAoKc3ViIFRhc2tHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rhc2tJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRhc2tJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGFzayBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBTRUxFQ1QgbmFtZSwgdGFza190eXBlLCB0YXNrX2RhdGEsIGF0dGVtcHRzLCBsb2NrX2tleSwgbG9ja190aW1lLCBsb2NrX3VwZGF0ZV90aW1lLAogICAgICAgICAgICAgICAgY3JlYXRlX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBnZXQgc3RvcmFibGUgb2JqZWN0CiAgICBteSAkU3RvcmFibGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKTsKCiAgICBteSAlVGFzazsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBkZWNvZGUgdGFzayBkYXRhCiAgICAgICAgbXkgJERlY29kZWREYXRhID0gZGVjb2RlX2Jhc2U2NCggJERhdGFbMl0gKTsKCiAgICAgICAgIyBkZXNlcmlhbGl6ZSBkYXRhCiAgICAgICAgbXkgJERhdGFQYXJhbSA9ICRTdG9yYWJsZU9iamVjdC0+RGVzZXJpYWxpemUoIERhdGEgPT4gJERlY29kZWREYXRhICk7CgogICAgICAgIGlmICggISREYXRhUGFyYW0gKSB7CgogICAgICAgICAgICAjIGVycm9yIGxvZwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnVGFzayBkYXRhIGlzIG5vdCBpbiBhIGNvcnJlY3Qgc3RvcmFibGUgZm9ybWF0ISBUYXNrSUQ6ICcgLiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGRhbWFnZWQgdGFzawogICAgICAgICAgICAkU2VsZi0+VGFza0RlbGV0ZSgKICAgICAgICAgICAgICAgIFRhc2tJRCA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICVUYXNrID0gKAogICAgICAgICAgICBUYXNrSUQgICAgICAgICA9PiAkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICREYXRhWzFdLAogICAgICAgICAgICBEYXRhICAgICAgICAgICA9PiAkRGF0YVBhcmFtIHx8IHt9LAogICAgICAgICAgICBBdHRlbXB0cyAgICAgICA9PiAkRGF0YVszXSwKICAgICAgICAgICAgTG9ja0tleSAgICAgICAgPT4gJERhdGFbNF0gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgPT4gJERhdGFbNV0gLy8gJycsCiAgICAgICAgICAgIExvY2tVcGRhdGVUaW1lID0+ICREYXRhWzZdIC8vICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAkRGF0YVs3XSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVGFzazsKfQoKPWhlYWQyIFRhc2tEZWxldGUoKQoKZGVsZXRlIGEgdGFzayBmcm9tIHNjaGVkdWxlciB0YXNrIGxpc3QKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0RlbGV0ZSgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUYXNrRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSB0YXNrIGZyb20gdGhlIGxpc3QKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgdGFzayBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdUYXNrTGlzdFVubG9ja2VkJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUYXNrTGlzdCgpCgpnZXQgdGhlIGxpc3Qgb2Ygc2NoZWR1bGVyIHRhc2tzCgogICAgbXkgQExpc3QgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ3NvbWUgdHlwZScsICAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJuczoKCiAgICBATGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICAgICAgICAgIE5hbWUgICA9PiAnYW55IG5hbWUnLAogICAgICAgICAgICBUeXBlICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgPT4gNDU2LAogICAgICAgICAgICBOYW1lICAgPT4gJ2FueSBvdGhlciBuYW1lJywKICAgICAgICAgICAgVHlwZSAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICApOwoKPWN1dAoKc3ViIFRhc2tMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNRTCA9ICdTRUxFQ1QgaWQsIG5hbWUsIHRhc2tfdHlwZSBGUk9NIHNjaGVkdWxlcl90YXNrJzsKICAgIG15IEBCaW5kOwoKICAgICMgYWRkIHR5cGUKICAgIGlmICggJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB0YXNrX3R5cGUgPSA/JzsKICAgICAgICBAQmluZCA9ICggXCRQYXJhbXtUeXBlfSApOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBpZCBBU0MnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgcHVzaCBATGlzdCwgewogICAgICAgICAgICBUYXNrSUQgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkUm93WzJdLAogICAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aGVhZDIgVGFza0xpc3RVbmxvY2tlZCgpCgpnZXQgYSBsaXN0IG9mIHVubG9ja2VkIHRhc2tzCgogICAgbXkgQFRhc2tMaXN0ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrTGlzdFVubG9ja2VkKCk7CgpSZXR1cm5zOgoKICAgIEBUYXNrTGlzdCA9ICggNDU2LCA3ODksIDM5NSApOwoKPWN1dAoKc3ViIFRhc2tMaXN0VW5sb2NrZWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgcmVhZCBjYWNoZQogICAgbXkgJENhY2hlID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgICAgICAgICAgICA9PiAnVGFza0xpc3RVbmxvY2tlZCcsCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMCwKICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAxLAogICAgKTsKICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBpZCBGUk9NIHNjaGVkdWxlcl90YXNrIFdIRVJFIGxvY2tfa2V5ID0gMCBPUkRFUiBCWSBpZCBBU0MnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBATGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIHNldCBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgICAgICAgICAgICA9PiAnVGFza0xpc3RVbmxvY2tlZCcsCiAgICAgICAgVFRMICAgICAgICAgICAgPT4gMTAsCiAgICAgICAgVmFsdWUgICAgICAgICAgPT4gXEBMaXN0LAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuIEBMaXN0Owp9Cgo9aGVhZDIgVGFza0xvY2soKQoKbG9ja3MgdGFzayB0byBhIHNwZWNpZmljIFBJRAoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrTG9jaygKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgICAgIE5vZGVJRCA9PiAxLCAgICAjIHRoZSBpZCBvbiB0aGUgbm9kZSBpbiBhIGNsdXN0ZXIgZW52aXJvbm1lbnQKICAgICAgICBQSUQgICAgPT4gNDU2LCAgIyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgd29ya2VyIHRoYXQgaXMgbG9ja2luZyB0aGUgdGFzawogICAgKTsKCj1jdXQKCnN1YiBUYXNrTG9jayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoVGFza0lEIE5vZGVJRCBQSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkS2V5ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBsb2NrIGtleQogICAgbXkgJExvY2tLZXlOb2RlSUQgPSBzcHJpbnRmICclMDNkJywgJFBhcmFte05vZGVJRH07CiAgICBteSAkTG9ja0tleVBJRCAgICA9IHNwcmludGYgJyUwOGQnLCAkUGFyYW17UElEfTsKICAgIG15ICRMb2NrS2V5ICAgICAgID0gJzEnIC4gJExvY2tLZXlOb2RlSUQgLiAkTG9ja0tleVBJRDsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IGxvY2tlZCB0YXNrCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICdTRUxFQ1QgbG9ja19rZXkgRlJPTSBzY2hlZHVsZXJfdGFzayBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTG9ja0tleUZyb21EQkJlZm9yZSA9ICcnOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRMb2NrS2V5RnJvbURCQmVmb3JlID0gJERhdGFbMF0gfHwgJyc7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJExvY2tLZXlGcm9tREJCZWZvcmUgZXEgJExvY2tLZXk7CgogICAgIyBsb2NrIHRoZSB0YXNrIGluIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl90YXNrCiAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9ID8sIGxvY2tfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBsb2NrX3VwZGF0ZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSAwIEFORCBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJExvY2tLZXksCiAgICAgICAgICAgIFwkUGFyYW17VGFza0lEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBsb2NrZWQgdGFzawogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGxvY2tfa2V5LCBhdHRlbXB0cyBGUk9NIHNjaGVkdWxlcl90YXNrIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGFza0lEfSBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRMb2NrS2V5RnJvbURCID0gJyc7CiAgICBteSAkQXR0ZW1wdHMgICAgICA9IDA7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJExvY2tLZXlGcm9tREIgPSAkRGF0YVswXTsKICAgICAgICAkQXR0ZW1wdHMgICAgICA9ICREYXRhWzFdOwogICAgfQoKICAgIHJldHVybiBpZiAkTG9ja0tleUZyb21EQiBuZSAkTG9ja0tleTsKCiAgICAjIHJlbW92ZSB0YXNrIGlmIGF0dGVtcHRzIGlzIDAKICAgIGlmICggISRBdHRlbXB0cyApIHsKICAgICAgICAkU2VsZi0+VGFza0RlbGV0ZSgKICAgICAgICAgICAgVGFza0lEID0+ICRQYXJhbXtUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAkQXR0ZW1wdHMtLTsKCiAgICAgICAgIyBkZWNyZW1lbnQgbnVtYmVyIG9mIGF0dGVtcHRzCiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICAgICAgU0VUIGF0dGVtcHRzID0gPwogICAgICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSA/IEFORCBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkQXR0ZW1wdHMsCiAgICAgICAgICAgICAgICBcJExvY2tLZXksCiAgICAgICAgICAgICAgICBcJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdUYXNrTGlzdFVubG9ja2VkJywKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUYXNrQ2xlYW51cCgpCgpkZWxldGVzIG9ic29sZXRlIHdvcmtlciB0YXNrcwoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5UYXNrQ2xlYW51cCgpOwoKPWN1dAoKc3ViIFRhc2tDbGVhbnVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQExpc3QgPSAkU2VsZi0+VGFza0xpc3QoKTsKCiAgICBUQVNLSVRFTToKICAgIGZvciBteSAkVGFza0l0ZW0gKEBMaXN0KSB7CgogICAgICAgIG15ICVUYXNrID0gJFNlbGYtPlRhc2tHZXQoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFza0l0ZW0tPntUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgICMgc2tpcCBpZiB0YXNrIGRvZXMgbm90IGhhdmUgYSBsb2NrIGtleQogICAgICAgIG5leHQgVEFTS0lURU0gaWYgISRUYXNre0xvY2tLZXl9OwoKICAgICAgICAjIHNraXAgaWYgdGhlIGxvY2sga2V5IGlzIGludmFsaWQKICAgICAgICBuZXh0IFRBU0tJVEVNIGlmICRUYXNre0xvY2tLZXl9IDwgMTsKCiAgICAgICAgIyBnZXQgc3lzdGVtIHRpbWUKICAgICAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCk7CgogICAgICAgICMgZ2V0IGV4cGlyYXRpb24gdGltZS4gNyBkYXlzIGFnbyBzeXN0ZW0gdGltZQogICAgICAgIG15ICRFeHBpcmVkVGltZSA9ICRTeXN0ZW1UaW1lIC0gKCA2MCAqIDYwICogMjQgKiA3ICk7CgogICAgICAgIG15ICRMb2NrVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUYXNre0xvY2tUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkTG9ja1RpbWUgPSAkTG9ja1RpbWUgPyAkTG9ja1RpbWUtPlRvRXBvY2goKSA6IDA7CgogICAgICAgICMgc2tpcCBpZiB0YXNrIGlzIG5vdCBleHBpcmVkCiAgICAgICAgbmV4dCBUQVNLSVRFTSBpZiAkTG9ja1RpbWUgPiAkRXhwaXJlZFRpbWU7CgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFza3tUYXNrSUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRlbGV0ZSB0YXNrICRUYXNre05hbWV9LSRUYXNre1R5cGV9ICgkVGFza3tUYXNrSUR9KVxuIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBUYXNrU3VtbWFyeSgpCgpnZXQgYSBzdW1tYXJ5IG9mIHRoZSB0YXNrcyBmcm9tIHRoZSB3b3JrZXIgdGFzayB0YWJsZSBkaXZpZGVkIGludG8gaGFuZGxlZCBhbmQgdW5oYW5kbGVkCgogICAgbXkgQFN1bW1hcnkgPSAkU2NoZWR1bGVyREJPYmplY3QtPlRhc2tTdW1tYXJ5KCk7Cgo9Y3V0CgpzdWIgVGFza1N1bW1hcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuICgpIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCB0YXNrX3R5cGUsIGxvY2tfa2V5LCBsb2NrX3RpbWUsIGNyZWF0ZV90aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgT1JERVIgQlkgaWQgQVNDJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUeXBlICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIExvY2tLZXkgICAgPT4gJFJvd1szXSAvLyAwLAogICAgICAgICAgICBMb2NrVGltZSAgID0+ICRSb3dbNF0gLy8gJycsCiAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJFJvd1s1XSwKICAgICAgICB9OwogICAgfQoKICAgIG15IEBIYW5kbGVkVGFza3M7CiAgICBteSBAVW5oYW5kbGVkVGFza3M7CgogICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKICAgIFRBU0s6CiAgICBmb3IgbXkgJFRhc2sgKEBMaXN0KSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIHRhc2sgaXMgdW5sb2NrZWQgb3IgbG9jayBrZXkgaXMgbm90IHZhbGlkICh1bmhhbmRsZWQgdGFza3MpCiAgICAgICAgaWYgKCAkVGFzay0+e0xvY2tLZXl9IDwgMSApIHsKICAgICAgICAgICAgcHVzaCBAVW5oYW5kbGVkVGFza3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJFRhc2stPntOYW1lfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJFRhc2stPntUeXBlfSwKICAgICAgICAgICAgICAgIENyZWF0ZVRpbWUgPT4gJFRhc2stPntDcmVhdGVUaW1lfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIE5vZGVJRCBhbmQgUHJvY2Vzc0lEIGZyb20gdGhlIGxvY2sga2V5CiAgICAgICAgICAgIG15ICggJE5vZGVJRCwgJFByb2Nlc3NJRCApID0gJFRhc2stPntMb2NrS2V5fSA9fiBte1xBIDEgKFxkezN9KSAoXGR7OH0pIFx6fW1zeDsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIGR1cmF0aW9uIGZyb20gbG9jayB0aW1lCiAgICAgICAgICAgIG15ICRDdXJyZW50RHVyYXRpb247CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkVGFzay0+e0xvY2tUaW1lfSApIHsKICAgICAgICAgICAgICAgIG15ICRMb2NrU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUYXNrLT57TG9ja1RpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJExvY2tTeXN0ZW1UaW1lID0gJExvY2tTeXN0ZW1UaW1lID8gJExvY2tTeXN0ZW1UaW1lLT5Ub0Vwb2NoKCkgOiAwOwoKICAgICAgICAgICAgICAgICRDdXJyZW50RHVyYXRpb24gPSAkU2VsZi0+X1NlY29uZHMyU3RyaW5nKCAkU3lzdGVtVGltZSAtICRMb2NrU3lzdGVtVGltZSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBIYW5kbGVkVGFza3MsIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICA9PiAkVGFzay0+e05hbWV9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgID0+ICRUYXNrLT57VHlwZX0sCiAgICAgICAgICAgICAgICBOb2RlSUQgICAgICAgICAgPT4gJE5vZGVJRCwKICAgICAgICAgICAgICAgIFByb2Nlc3NJRCAgICAgICA9PiAkUHJvY2Vzc0lELAogICAgICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgID0+ICRUYXNrLT57TG9ja1RpbWV9LAogICAgICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgID0+ICRUYXNrLT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICBDdXJyZW50RHVyYXRpb24gPT4gJEN1cnJlbnREdXJhdGlvbgogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIHsKICAgICAgICAgICAgSGVhZGVyID0+ICdVbmhhbmRsZWQgV29ya2VyIFRhc2tzOicsCiAgICAgICAgICAgIENvbHVtbiA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA0MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0NyZWF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdDcmVhdGUgVGltZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMjAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdLAogICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFxAVW5oYW5kbGVkVGFza3MsCiAgICAgICAgICAgIE5vRGF0YU1lc3NhZ2UgPT4gJ1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3Mgd2FpdGluZyB0byBiZSBleGVjdXRlZC4nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBIZWFkZXIgPT4gJ0hhbmRsZWQgV29ya2VyIFRhc2tzOicsCiAgICAgICAgICAgIENvbHVtbiA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiA0MCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05vZGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ05JRCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1Byb2Nlc3NJRCcsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ1BJRCcsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gOSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0N1cnJlbnREdXJhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ0R1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gXEBIYW5kbGVkVGFza3MsCiAgICAgICAgICAgIE5vRGF0YU1lc3NhZ2UgPT4gJ1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3MgYmVpbmcgZXhlY3V0ZWQuJywKICAgICAgICB9LAogICAgKTsKfQoKPWhlYWQyIFRhc2tMb2NrVXBkYXRlKCkKCnNldHMgdGhlIHRhc2sgbG9jayB1cGRhdGUgdGltZSBhcyBjdXJyZW50IHRpbWUgZm9yIHRoZSBzcGVjaWZpZWQgdGFza3MKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza0xvY2tVcGRhdGUoCiAgICAgICAgVGFza0lEcyA9PiBbMTIzLCA0NTZdLAogICAgKTsKCj1jdXQKCnN1YiBUYXNrTG9ja1VwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtUYXNrSURzfSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGFza0lEcyBpcyBtaXNzaW5nIG9yIGludmFsaWQhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICBteSAkVGFza0lEcyA9IGpvaW4gJywnLCBtYXAgeyAkREJPYmplY3QtPlF1b3RlKCAkXywgJ0ludGVnZXInICkgfSBAeyAkUGFyYW17VGFza0lEc30gfTsKCiAgICByZXR1cm4gMSBpZiAhJFRhc2tJRHM7CgogICAgIyBzZXQgbG9jayB1cGRhdGUgdGltZSBpbiBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAiCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfdGFzawogICAgICAgICAgICBTRVQgbG9ja191cGRhdGVfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGlkIElOICggJFRhc2tJRHMgKSIsCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgVGFza1VubG9ja0V4cGlyZWQoKQoKcmVtb3ZlIGxvY2sgc3RhdHVzIGZvciB3b3JraW5nIHRhc2tzIHRoYXQgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgaXRzIGxvY2sgdXBkYXRlIHRpbWUgZm9yIG1vcmUgdGhhbiA1IG1pbnV0ZXMKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+VGFza1VubG9ja0V4cGlyZWQoKTsKCj1jdXQKCnN1YiBUYXNrVW5sb2NrRXhwaXJlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UgKGdldCBhbGwgd29ya2VyIHRhc2tzIHdpdGggYSBsb2NrIGtleSBkaWZmZXJlbnQgdGhhbiAwKQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCBsb2NrX3VwZGF0ZV90aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3Rhc2sKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPD4gMAogICAgICAgICAgICAgICAgQU5EIGxvY2tfa2V5IDw+IDEKICAgICAgICAgICAgT1JERVIgQlkgaWQgQVNDJywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKICAgICAgICAjIGNvbnZlcnQgbG9jayB1cGRhdGUgdGltZSBzdGFtcCB0byBhIHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJExvY2tVcGRhdGVUaW1lID0gMDsKCiAgICAgICAgaWYgKCAkUm93WzJdICkgewogICAgICAgICAgICAkTG9ja1VwZGF0ZVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUm93WzJdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExvY2tVcGRhdGVUaW1lID0gJExvY2tVcGRhdGVUaW1lID8gJExvY2tVcGRhdGVUaW1lLT5Ub0Vwb2NoKCkgOiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxvY2sgVXBkYXRlIFRpbWUgbWlzc2luZyBmb3IgdGFzayAkUm93WzFdISAoJFJvd1swXSkiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBza2lwIHRhc2sgaWYgaXQgaGFzIGJlZW4gbG9ja2VkIHVwZGF0ZSB0aW1lIGlzIGluIHdpdGhpbiB0aGUgbGFzdCA1IG1pbnV0ZXMKICAgICAgICBuZXh0IFJPVyBpZiAkU3lzdGVtVGltZSAtICRMb2NrVXBkYXRlVGltZSA8ICggNjAgKiA1ICk7CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgVGFza0lEICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgTG9ja1RpbWUgPT4gJFJvd1syXSwKICAgICAgICB9OwogICAgfQoKICAgICMgc3RvcCBpZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gdW5sb2NrCiAgICByZXR1cm4gMSBpZiAhQExpc3Q7CgogICAgZm9yIG15ICRUYXNrIChATGlzdCkgewoKICAgICAgICAjIHVubG9jayBhbGwgdGhlIHRhc2sgdGhhdCBoYXMgYmVlbiBsb2NrZWQgZm9yIG1vcmUgdGhhbiAxIG1pbnV0ZQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl90YXNrCiAgICAgICAgICAgICAgICBTRVQgbG9ja19rZXkgPSAwLCBsb2NrX3RpbWUgPSBOVUxMLCBsb2NrX3VwZGF0ZV90aW1lID0gTlVMTAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkVGFzay0+e1Rhc2tJRH0sIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEZ1dHVyZVRhc2tBZGQoKQoKYWRkIGEgbmV3IHRhc2sgdG8gc2NoZWR1bGVyIGZ1dHVyZSB0YXNrIGxpc3QKCiAgICBteSAkVGFza0lEID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrQWRkKAogICAgICAgIEV4ZWN1dGlvblRpbWUgICAgICAgICAgICA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywgICMgZS4gZy4gR2VuZXJpY0ludGVyZmFjZSwgVGVzdAogICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnYW55IG5hbWUnLCAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgQXR0ZW1wdHMgICAgICAgICAgICAgICAgID0+IDUsICAgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgKGRlZmF1bHQgMSkKICAgICAgICBNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMgPT4gMiwgICAgICAgICAgICAgICAgICAgIyBvcHRpb25hbCAoZGVmYXVsdCAwKSwgbnVtYmVyIG9mIHRhc2tzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB3aXRoIHRoZSBzYW1lIHR5cGUgKGFuZCBuYW1lIGlmIHByb3ZpZGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgdGhhdCBjYW4gZXhpc3RzIGF0IHRoZSBzYW1lIHRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICB2YWx1ZSBvZiAwIG1lYW5zIHVubGltaXRlZAogICAgICAgIERhdGEgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGRhdGEgcGF5bG9hZAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgKTsKClJldHVybnM6CgogICAgbXkgJFRhc2tJRCA9IDEyMzsgICMgb3IgZmFsc2UgaW4gY2FzZSBvZiBhbiBlcnJvcgoKPWN1dAoKc3ViIEZ1dHVyZVRhc2tBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KEV4ZWN1dGlvblRpbWUgVHlwZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIEV4ZWN1dGlvblRpbWUKCiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFeGVjdXRpb25UaW1lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkU3lzdGVtVGltZSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4ZWN1dGlvblRpbWUgaXMgaW52YWxpZCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgICRTeXN0ZW1UaW1lID0gJFN5c3RlbVRpbWUtPlRvRXBvY2goKTsKCiAgICBpZiAoICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ICYmICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ID1+IG17XEEgXGQrIFx6fW1zeCApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgYWxsIGZ1dHVyZSB0YXNrcyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHR5cGUKICAgICAgICBteSBATGlzdCA9ICRTZWxmLT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEZpbHRlcmVkTGlzdCA9IEBMaXN0OwogICAgICAgIGlmICggJFBhcmFte05hbWV9ICYmIEBMaXN0ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHRhc2tzIHRoYXQgZG9lcyBub3QgbWF0Y2ggc3BlY2lmaWVkIHRhc2sgbmFtZQogICAgICAgICAgICBARmlsdGVyZWRMaXN0ID0gZ3JlcCB7ICggJF8tPntOYW1lfSB8fCAnJyApIGVxICRQYXJhbXtOYW1lfSB9IEBMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjb21wYXJlIHRoZSBudW1iZXIgb2YgdGFzayB3aXRoIHRoZSBtYXhpbXVtIHBhcmFsbGVsIGxpbWl0CiAgICAgICAgcmV0dXJuIC0xIGlmIHNjYWxhciBARmlsdGVyZWRMaXN0ID49ICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgb2YgYXR0ZW1wdHMgcGFyYW1ldGVyCiAgICAkUGFyYW17QXR0ZW1wdHN9IHx8PSAxOwoKICAgICMgc2VyaWFsaXplIGRhdGEgYXMgc3RyaW5nCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgZW5jb2RlIHRhc2sgZGF0YQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoJERhdGEpOwogICAgJERhdGEgPSBlbmNvZGVfYmFzZTY0KCREYXRhKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJElkZW50aWZpZXI7CiAgICBUUlk6CiAgICBmb3IgbXkgJFRyeSAoIDEgLi4gMTAgKSB7CgogICAgICAgICMgY2FsY3VsYXRlIGEgdGFzayBpZGVudGlmaWVyCiAgICAgICAgJElkZW50aWZpZXIgPSAkU2VsZi0+X0dldElkZW50aWZpZXIoKTsKCiAgICAgICAgIyBpbnNlcnQgdGhlIGZ1dHVyZSB0YXNrIChpbml0aWFsbHkgbG9ja2VkIHdpdGggbG9ja19rZXkgPSAxIHNvIGl0IHdpbGwgbm90IGJlIHRha2VuIGJ5IGFueQogICAgICAgICMgICAgbW92ZWQgaW50byB3b3JrZXIgdGFzayBsaXN0IGF0IHRoaXMgbW9tZW50KQogICAgICAgIGxhc3QgVFJZIGlmICREQk9iamVjdC0+RG8oCiAgICAgICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgICAgICBJTlNFUlQgSU5UTyBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgICAgICAgICAoaWRlbnQsIGV4ZWN1dGlvbl90aW1lLCBuYW1lLCB0YXNrX3R5cGUsIHRhc2tfZGF0YSwgYXR0ZW1wdHMsIGxvY2tfa2V5LCBjcmVhdGVfdGltZSkKICAgICAgICAgICAgICAgIFZBTFVFUwogICAgICAgICAgICAgICAgICAgICg/LCA/LCA/LCA/LCA/LCA/LCAxLCBjdXJyZW50X3RpbWVzdGFtcCknLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkSWRlbnRpZmllciwKICAgICAgICAgICAgICAgIFwkUGFyYW17RXhlY3V0aW9uVGltZX0sCiAgICAgICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgIFwkRGF0YSwKICAgICAgICAgICAgICAgIFwkUGFyYW17QXR0ZW1wdHN9LAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgdGFzayBpZAogICAgJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCBpZCBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzayBXSEVSRSBpZGVudCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJElkZW50aWZpZXIgXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgdGFzayBpZAogICAgbXkgJFRhc2tJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUYXNrSUQgPSAkUm93WzBdOwogICAgfQoKICAgICMgdW5sb2NrIHRoZSB0YXNrLCBmb3Igbm93IG9uIHRoZSB0YXNrIGNhbiBiZSBtb3ZlZCB0byB0aGUgd29ya2VyIHRhc2sgbGlzdAogICAgJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9IDAKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSAxIEFORCBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFRhc2tJRCwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdGdXR1cmVUYXNrTGlzdFVubG9ja2VkJywgICAgIyBUT0RPIEZJWE1FCiAgICApOwoKICAgIHJldHVybiAkVGFza0lEOwp9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKCj1oZWFkMiBGdXR1cmVUYXNrVXBkYXRlKCkKCnVwZGF0ZXMgYW4gZXhpc3RpbmcgdGFzayBpbiB0aGUgc2NoZWR1bGVyIGZ1dHVyZSB0YXNrIGxpc3QKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza1VwZGF0ZSgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkS2V5IChxdyhUYXNrSUQgRXhlY3V0aW9uVGltZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIHZhbGlkIEV4ZWN1dGlvblRpbWUKCiAgICBteSAkU3lzdGVtVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFeGVjdXRpb25UaW1lfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICEkU3lzdGVtVGltZSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkV4ZWN1dGlvblRpbWUgaXMgaW52YWxpZCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KICAgICRTeXN0ZW1UaW1lID0gJFN5c3RlbVRpbWUtPlRvRXBvY2goKTsKCiAgICBpZiAoICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ICYmICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9ID1+IG17XEEgXGQrIFx6fW1zeCApIHsKCiAgICAgICAgIyBnZXQgdGhlIGxpc3Qgb2YgYWxsIGZ1dHVyZSB0YXNrcyBmb3IgdGhlIHNwZWNpZmllZCB0YXNrIHR5cGUKICAgICAgICBteSBATGlzdCA9ICRTZWxmLT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICAgICAgVHlwZSA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgKTsKCiAgICAgICAgbXkgQEZpbHRlcmVkTGlzdCA9IEBMaXN0OwogICAgICAgIGlmICggJFBhcmFte05hbWV9ICYmIEBMaXN0ICkgewoKICAgICAgICAgICAgIyByZW1vdmUgYWxsIHRhc2tzIHRoYXQgZG9lcyBub3QgbWF0Y2ggc3BlY2lmaWVkIHRhc2sgbmFtZQogICAgICAgICAgICBARmlsdGVyZWRMaXN0ID0gZ3JlcCB7ICggJF8tPntOYW1lfSB8fCAnJyApIGVxICRQYXJhbXtOYW1lfSB9IEBMaXN0OwogICAgICAgIH0KCiAgICAgICAgIyBjb21wYXJlIHRoZSBudW1iZXIgb2YgdGFzayB3aXRoIHRoZSBtYXhpbXVtIHBhcmFsbGVsIGxpbWl0CiAgICAgICAgcmV0dXJuIC0xIGlmIHNjYWxhciBARmlsdGVyZWRMaXN0ID49ICRQYXJhbXtNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9OwogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgb2YgYXR0ZW1wdHMgcGFyYW1ldGVyCiAgICAkUGFyYW17QXR0ZW1wdHN9IHx8PSAxOwoKICAgICMgc2VyaWFsaXplIGRhdGEgYXMgc3RyaW5nCiAgICBteSAkRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpLT5TZXJpYWxpemUoCiAgICAgICAgRGF0YSA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgICMgZW5jb2RlIHRhc2sgZGF0YQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVPdXRwdXQoJERhdGEpOwogICAgJERhdGEgPSBlbmNvZGVfYmFzZTY0KCREYXRhKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgVFJZOgogICAgZm9yIG15ICRUcnkgKCAxIC4uIDEwICkgewoKICAgICAgICAjIGluc2VydCB0aGUgZnV0dXJlIHRhc2sgKGluaXRpYWxseSBsb2NrZWQgd2l0aCBsb2NrX2tleSA9IDEgc28gaXQgd2lsbCBub3QgYmUgdGFrZW4gYnkgYW55CiAgICAgICAgIyAgICBtb3ZlZCBpbnRvIHdvcmtlciB0YXNrIGxpc3QgYXQgdGhpcyBtb21lbnQpCiAgICAgICAgbGFzdCBUUlkgaWYgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgICAgIFNFVCBleGVjdXRpb25fdGltZSA9ID8sIHRhc2tfZGF0YSA9ID8KICAgICAgICAgICAgICAgIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtFeGVjdXRpb25UaW1lfSwKICAgICAgICAgICAgICAgIFwkRGF0YSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VGFza0lEfSwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGZ1dHVyZSB0YXNrIGxpc3QgY2FjaGUKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAnU2NoZWR1bGVyREInLAogICAgICAgIEtleSAgPT4gJ0Z1dHVyZVRhc2tMaXN0VW5sb2NrZWQnLCAgICAjIFRPRE8gRklYTUUKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKPWhlYWQyIEZ1dHVyZVRhc2tHZXQoKQoKZ2V0IHNjaGVkdWxlciBmdXR1cmUgdGFzawoKICAgIG15ICVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICAlVGFzayA9ICgKICAgICAgICBUYXNrSUQgICAgICAgID0+IDEyMywKICAgICAgICBFeGVjdXRpb25UaW1lID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdhbnkgbmFtZScsCiAgICAgICAgVHlwZSAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkRGF0YVJlZiwKICAgICAgICBBdHRlbXB0cyAgICAgID0+IDEwLAogICAgICAgIExvY2tLZXkgICAgICAgPT4gJ1hZWicsCiAgICAgICAgTG9ja1RpbWUgICAgICA9PiAnMjAxMS0wMi0wOCAxNTowODowMScsCiAgICAgICAgQ3JlYXRlVGltZSAgICA9PiAnMjAxMS0wMi0wOCAxNTowODowMCcsCiAgICApOwoKPWN1dAoKc3ViIEZ1dHVyZVRhc2tHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rhc2tJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFRhc2tJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdGFzayBmcm9tIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4KICAgICAgICAgICAgJ1NFTEVDVCBleGVjdXRpb25fdGltZSwgbmFtZSwgdGFza190eXBlLCB0YXNrX2RhdGEsIGF0dGVtcHRzLCBsb2NrX2tleSwgbG9ja190aW1lLCBjcmVhdGVfdGltZQogICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl9mdXR1cmVfdGFzawogICAgICAgICAgICBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte1Rhc2tJRH0gXSwKICAgICk7CgogICAgIyBnZXQgc3RvcmFibGUgb2JqZWN0CiAgICBteSAkU3RvcmFibGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnKTsKCiAgICBteSAlVGFzazsKICAgIHdoaWxlICggbXkgQERhdGEgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyBkZWNvZGUgdGFzayBkYXRhCiAgICAgICAgbXkgJERlY29kZWREYXRhID0gZGVjb2RlX2Jhc2U2NCggJERhdGFbM10gKTsKCiAgICAgICAgIyBkZXNlcmlhbGl6ZSBkYXRhCiAgICAgICAgbXkgJERhdGFQYXJhbSA9ICRTdG9yYWJsZU9iamVjdC0+RGVzZXJpYWxpemUoIERhdGEgPT4gJERlY29kZWREYXRhICk7CgogICAgICAgIGlmICggISREYXRhUGFyYW0gKSB7CgogICAgICAgICAgICAjIGVycm9yIGxvZwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRnV0dXJlIHRhc2sgZGF0YSBpcyBub3QgaW4gYSBjb3JyZWN0IHN0b3JhYmxlIGZvcm1hdCEgVGFza0lEOiAnIC4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBkYW1hZ2VkIGZ1dHVyZSB0YXNrCiAgICAgICAgICAgICRTZWxmLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJVRhc2sgPSAoCiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgPT4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJERhdGFbMV0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJERhdGFbMl0sCiAgICAgICAgICAgIERhdGEgICAgICAgICAgPT4gJERhdGFQYXJhbSB8fCB7fSwKICAgICAgICAgICAgQXR0ZW1wdHMgICAgICA9PiAkRGF0YVs0XSwKICAgICAgICAgICAgTG9ja0tleSAgICAgICA9PiAkRGF0YVs1XSAvLyAwLAogICAgICAgICAgICBMb2NrVGltZSAgICAgID0+ICREYXRhWzZdIC8vICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgID0+ICREYXRhWzddLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICVUYXNrOwp9Cgo9aGVhZDIgRnV0dXJlVGFza0RlbGV0ZSgpCgpkZWxldGUgYSB0YXNrIGZyb20gc2NoZWR1bGVyIGZ1dHVyZSB0YXNrIGxpc3QKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0RlbGV0ZSgKICAgICAgICBUYXNrSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSB0YXNrIGZyb20gdGhlIGZ1dHVyZSBsaXN0CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gc2NoZWR1bGVyX2Z1dHVyZV90YXNrIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGFza0lEfSBdLAogICAgKTsKCiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBsaXN0IGNhY2hlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJ1NjaGVkdWxlckRCJywKICAgICAgICBLZXkgID0+ICdGdXR1cmVUYXNrTGlzdFVubG9ja2VkJywgICAgIyBUT0RPIEZJWE1FCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgRnV0dXJlVGFza0xpc3QoKQoKZ2V0IHRoZSBsaXN0IG9mIHNjaGVkdWxlciBmdXR1cmUgdGFza3MKCiAgICBteSBATGlzdCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0xpc3QoCiAgICAgICAgVHlwZSA9PiAnc29tZSB0eXBlJywgICMgb3B0aW9uYWwKICAgICk7CgpSZXR1cm5zOgoKICAgIEBMaXN0ID0gKAogICAgICAgIHsKICAgICAgICAgICAgVGFza0lEICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdhbnkgbmFtZScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgICAgICAgID0+IDQ1NiwKICAgICAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ2FueSBvdGhlciBuYW1lJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgfSwKICAgICAgICAjIC4uLgogICAgKTsKCj1jdXQKCnN1YiBGdXR1cmVUYXNrTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBleGVjdXRpb25fdGltZSwgbmFtZSwgdGFza190eXBlIEZST00gc2NoZWR1bGVyX2Z1dHVyZV90YXNrJzsKICAgIG15IEBCaW5kOwoKICAgICMgYWRkIHR5cGUKICAgIGlmICggJFBhcmFte1R5cGV9ICkgewogICAgICAgICRTUUwgLj0gJyBXSEVSRSB0YXNrX3R5cGUgPSA/JzsKICAgICAgICBAQmluZCA9ICggXCRQYXJhbXtUeXBlfSApOwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBpZCBBU0MnOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQExpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgcHVzaCBATGlzdCwgewogICAgICAgICAgICBUYXNrSUQgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgPT4gJFJvd1sxXSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkUm93WzJdLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICRSb3dbM10sCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gQExpc3Q7Cn0KCj1oZWFkMiBGdXR1cmVUYXNrVG9FeGVjdXRlKCkKCm1vdmVzIGFsbCBmdXR1cmUgdGFza3Mgd2l0aCByZWFjaGVkIGV4ZWN1dGlvbiB0aW1lIHRvIHRoZSB0YXNrIHRhYmxlIHRvIGV4ZWN1dGUKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza1RvRXhlY3V0ZSgKICAgICAgICBOb2RlSUQgPT4gMSwgICAgIyB0aGUgSUQgb2YgdGhlIG5vZGUgaW4gYSBjbHVzdGVyIGVudmlyb25tZW50CiAgICAgICAgUElEICAgID0+IDQ1NiwgICMgdGhlIHByb2Nlc3MgSUQgb2YgdGhlIGRhZW1vbiB0aGF0IGlzIG1vdmluZyB0aGUgdGFza3MgdG8gZXhlY3V0aW9uCiAgICApOwoKPWN1dAoKc3ViIEZ1dHVyZVRhc2tUb0V4ZWN1dGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KE5vZGVJRCBQSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkS2V5ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBsb2NrIGtleQogICAgbXkgJExvY2tLZXlOb2RlSUQgPSBzcHJpbnRmICclMDNkJywgJFBhcmFte05vZGVJRH07CiAgICBteSAkTG9ja0tleVBJRCAgICA9IHNwcmludGYgJyUwOGQnLCAkUGFyYW17UElEfTsKICAgIG15ICRMb2NrS2V5ICAgICAgID0gJzEnIC4gJExvY2tLZXlOb2RlSUQgLiAkTG9ja0tleVBJRDsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgY3VycmVudCB0aW1lCiAgICBteSAkQ3VycmVudFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9TdHJpbmcoKTsKCiAgICAjIGxvY2sgdGhlIHRhc2sgaW4gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX2Z1dHVyZV90YXNrCiAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9ID8sIGxvY2tfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMCBBTkQgZXhlY3V0aW9uX3RpbWUgPD0gPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkTG9ja0tleSwKICAgICAgICAgICAgXCRDdXJyZW50VGltZSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGdldCBhbGwgbG9ja2VkIGZ1dHVyZSB0YXNrcwogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCB0YXNrX3R5cGUsIHRhc2tfZGF0YSwgYXR0ZW1wdHMKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSA/CiAgICAgICAgICAgIE9SREVSIEJZIGV4ZWN1dGlvbl90aW1lIEFTQycsCiAgICAgICAgQmluZCA9PiBbIFwkTG9ja0tleSBdLAogICAgKTsKCiAgICAjIGdldCBzdG9yYWJsZSBvYmplY3QKICAgIG15ICRTdG9yYWJsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTdG9yYWJsZScpOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgQEZ1dHVyZVRhc2tMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgZGVjb2RlIHRhc2sgZGF0YQogICAgICAgIG15ICREZWNvZGVkRGF0YSA9IGRlY29kZV9iYXNlNjQoICRSb3dbM10gKTsKCiAgICAgICAgIyBkZXNlcmlhbGl6ZSBkYXRhCiAgICAgICAgbXkgJERhdGFQYXJhbSA9ICRTdG9yYWJsZU9iamVjdC0+RGVzZXJpYWxpemUoIERhdGEgPT4gJERlY29kZWREYXRhICk7CgogICAgICAgIGlmICggISREYXRhUGFyYW0gKSB7CgogICAgICAgICAgICAjIGVycm9yIGxvZwogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRnV0dXJlIHRhc2sgZGF0YSBpcyBub3QgaW4gYSBjb3JyZWN0IHN0b3JhYmxlIGZvcm1hdCEgVGFza0lEOiAnIC4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBkYW1hZ2VkIGZ1dHVyZSB0YXNrCiAgICAgICAgICAgICRTZWxmLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRQYXJhbXtUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJVRhc2sgPSAoCiAgICAgICAgICAgIFRhc2tJRCAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFR5cGUgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIERhdGEgICAgID0+ICREYXRhUGFyYW0gfHwge30sCiAgICAgICAgICAgIEF0dGVtcHRzID0+ICRSb3dbNF0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBARnV0dXJlVGFza0xpc3QsIFwlVGFzazsKICAgIH0KCiAgICAjIG1vdmUgdGFza3MgdG8gdGhlIGV4ZWN1dGlvbiB0YXNrIGxpc3QKICAgIGZvciBteSAkRnV0dXJlVGFzayAoQEZ1dHVyZVRhc2tMaXN0KSB7CgogICAgICAgIG15ICVUYXNrID0gJXskRnV0dXJlVGFza307CgogICAgICAgIGRlbGV0ZSAkVGFza3tUYXNrSUR9OwoKICAgICAgICAjIGFkZCB0YXNrIHRvIHRoZSBsaXN0CiAgICAgICAgJFNlbGYtPlRhc2tBZGQoJVRhc2spOwoKICAgICAgICAjIHJlbW92ZSBmdXR1cmUgdGFzawogICAgICAgICRTZWxmLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBGdXR1cmVUYXNrU3VtbWFyeSgpCgpnZXQgYSBzdW1tYXJ5IG9mIHRoZSB0YXNrcyBmcm9tIHRoZSBmdXR1cmUgdGFzayB0YWJsZQoKICAgIG15IEBTdW1tYXJ5ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrU3VtbWFyeSgpOwoKPWN1dAoKc3ViIEZ1dHVyZVRhc2tTdW1tYXJ5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQExpc3QgPSAkU2VsZi0+RnV0dXJlVGFza0xpc3QoKTsKCiAgICByZXR1cm4gKAogICAgICAgIHsKICAgICAgICAgICAgSGVhZGVyID0+ICdUYXNrcyB0byBiZSBleGVjdXRlZCBpbiBmdXR1cmU6JywKICAgICAgICAgICAgQ29sdW1uID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ05hbWUnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDQwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRXhlY3V0aW9uVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ1RvIEV4ZWN1dGUgQXQnLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcQExpc3QsCiAgICAgICAgICAgIE5vRGF0YU1lc3NhZ2UgPT4gJ1RoZXJlIGFyZSBjdXJyZW50bHkgbm8gdGFza3MgdG8gYmUgZXhlY3V0ZWQgaW4gZnV0dXJlLicsCiAgICAgICAgfSwKICAgICk7Cn0KCj1oZWFkMiBDcm9uVGFza1RvRXhlY3V0ZSgpCgpjcmVhdGVzIGNyb24gdGFza3MgdGhhdCBuZWVkcyB0byBiZSBydW4gaW4gdGhlIGN1cnJlbnQgdGltZSBpbnRvIHRoZSB0YXNrIHRhYmxlIHRvIGV4ZWN1dGUKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+Q3JvblRhc2tUb0V4ZWN1dGUoCiAgICAgICAgTm9kZUlEID0+IDEsICAgICMgdGhlIElEIG9mIHRoZSBub2RlIGluIGEgY2x1c3RlciBlbnZpcm9ubWVudAogICAgICAgIFBJRCAgICA9PiA0NTYsICAjIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBkYWVtb24gdGhhdCBpcyBjcmVhdGluZyB0aGUgdGFza3MgdG8gZXhlY3V0aW9uCiAgICApOwoKPWN1dAoKc3ViIENyb25UYXNrVG9FeGVjdXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkS2V5IChxdyhOb2RlSUQgUElEKSkgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEtleSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjcm9uIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2snKSB8fCB7fTsKCiAgICAjIGRvIG5vdGhpbmcgaWYgdGhlcmUgYXJlIG5vIGNyb24gdGFza3MgZGVmaW5pdGlvbnMgaW4gU3lzQ29uZmlnCiAgICByZXR1cm4gMSB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJENvbmZpZyk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDcm9uRXZlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3JvbkV2ZW50Jyk7CgogICAgbXkgJVVzZWRUYXNrTmFtZXM7CgogICAgQ1JPTkpPQktFWToKICAgIGZvciBteSAkQ3JvbmpvYktleSAoIHNvcnQga2V5cyAleyRDb25maWd9ICkgewoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgISRDcm9uam9iS2V5OwoKICAgICAgICAjIGV4dHJhY3QgY29uZmlnCiAgICAgICAgbXkgJEpvYkNvbmZpZyA9ICRDb25maWctPnskQ3JvbmpvYktleX07CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEpvYkNvbmZpZyk7CgogICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhNb2R1bGUgVGFza05hbWUgRnVuY3Rpb24pKSB7CiAgICAgICAgICAgIGlmICggISRKb2JDb25maWctPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmZpZyBvcHRpb24gRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2sjIyMkQ3JvbmpvYktleSBpcyBpbnZhbGlkLiIKICAgICAgICAgICAgICAgICAgICAgICAgLiAiIE5lZWQgJyROZWVkZWQnIHBhcmFtZXRlciEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IENST05KT0JLRVk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFVzZWRUYXNrTmFtZXN7ICRKb2JDb25maWctPntUYXNrTmFtZX0gfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvbmZpZyBvcHRpb24gRGFlbW9uOjpTY2hlZHVsZXJDcm9uVGFza01hbmFnZXI6OlRhc2sjIyMkQ3JvbmpvYktleSBpcyBpbnZhbGlkLiIKICAgICAgICAgICAgICAgICAgICAuICIgVGFza05hbWUgcGFyYW1ldGVyICckSm9iQ29uZmlnLT57VGFza05hbWV9JyBpcyBhbHJlYWR5IHVzZWQgYnkgYW5vdGhlciB0YXNrISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IENST05KT0JLRVk7CiAgICAgICAgfQoKICAgICAgICAjIGNhbGN1bGF0ZSBsYXN0IGNyb24gdGltZQogICAgICAgIG15ICRQcmV2aW91c0V2ZW50VGltZXN0YW1wID0gJENyb25FdmVudE9iamVjdC0+UHJldmlvdXNFdmVudEdldCgKICAgICAgICAgICAgU2NoZWR1bGUgPT4gJEpvYkNvbmZpZy0+e1NjaGVkdWxlfSwKICAgICAgICApOwoKICAgICAgICBuZXh0IENST05KT0JLRVkgaWYgISRQcmV2aW91c0V2ZW50VGltZXN0YW1wOwoKICAgICAgICAjIGV4ZWN1dGUgcmVjdXJyZW50IHRhc2tzCiAgICAgICAgJFNlbGYtPlJlY3VycmVudFRhc2tFeGVjdXRlKAogICAgICAgICAgICBOb2RlSUQgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte05vZGVJRH0sCiAgICAgICAgICAgIFBJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17UElEfSwKICAgICAgICAgICAgVGFza05hbWUgICAgICAgICAgICAgICAgID0+ICRKb2JDb25maWctPntUYXNrTmFtZX0sCiAgICAgICAgICAgIFRhc2tUeXBlICAgICAgICAgICAgICAgICA9PiAnQ3JvbicsCiAgICAgICAgICAgIFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgICA9PiAkUHJldmlvdXNFdmVudFRpbWVzdGFtcCwKICAgICAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+ICRKb2JDb25maWctPntNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXN9LAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgTW9kdWxlICAgPT4gJEpvYkNvbmZpZy0+e01vZHVsZX0gICB8fCAnJywKICAgICAgICAgICAgICAgIEZ1bmN0aW9uID0+ICRKb2JDb25maWctPntGdW5jdGlvbn0gfHwgJycsCiAgICAgICAgICAgICAgICBQYXJhbXMgICA9PiAkSm9iQ29uZmlnLT57UGFyYW1zfSAgIHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFVzZWRUYXNrTmFtZXN7ICRKb2JDb25maWctPntUYXNrTmFtZX0gfSA9IDE7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDcm9uVGFza0NsZWFudXAoKQoKcmVtb3ZlcyByZWN1cnJlbnQgdGFza3MgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIGNyb24gdGFza3MgZGVmaW5pdGlvbiBpbiBTeXNDb25maWcuCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkNyb25UYXNrQ2xlYW51cCgpOwoKPWN1dAoKc3ViIENyb25UYXNrQ2xlYW51cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyb24gY29uZmlnCiAgICBteSAkQ29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzaycpIHx8IHt9OwoKICAgICMgZG8gbm90aGluZyBpZiB0aGVyZSBhcmUgbm8gY3JvbiB0YXNrcyBkZWZpbml0aW9ucyBpbiBTeXNDb25maWcKICAgIHJldHVybiAxIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkQ29uZmlnKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENyb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnKTsKCiAgICBteSAlQ3JvbkpvYkxvb2t1cDsKCiAgICBDUk9OSk9CS0VZOgogICAgZm9yIG15ICRDcm9uam9iS2V5ICggc29ydCBrZXlzICV7JENvbmZpZ30gKSB7CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAhJENyb25qb2JLZXk7CgogICAgICAgICMgZXh0cmFjdCBjb25maWcKICAgICAgICBteSAkSm9iQ29uZmlnID0gJENvbmZpZy0+eyRDcm9uam9iS2V5fTsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkSm9iQ29uZmlnKTsKCiAgICAgICAgbmV4dCBDUk9OSk9CS0VZIGlmICggISRKb2JDb25maWctPntNb2R1bGV9ICk7CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAoICRKb2JDb25maWctPntNb2R1bGV9ICYmICEkSm9iQ29uZmlnLT57RnVuY3Rpb259ICk7CgogICAgICAgICMgY2FsY3VsYXRlIGxhc3QgY3JvbiB0aW1lCiAgICAgICAgbXkgJFByZXZpb3VzRXZlbnRUaW1lc3RhbXAgPSAkQ3JvbkV2ZW50T2JqZWN0LT5QcmV2aW91c0V2ZW50R2V0KAogICAgICAgICAgICBTY2hlZHVsZSA9PiAkSm9iQ29uZmlnLT57U2NoZWR1bGV9LAogICAgICAgICk7CgogICAgICAgIG5leHQgQ1JPTkpPQktFWSBpZiAhJFByZXZpb3VzRXZlbnRUaW1lc3RhbXA7CgogICAgICAgICRDcm9uSm9iTG9va3VweyAkSm9iQ29uZmlnLT57VGFza05hbWV9IH0gPSAxOwogICAgfQoKICAgICMgZ2V0IGEgbGlzdCBvZiBhbGwgZ2VuZXJpYyBhZ2VudCByZWN1cnJlbnQgdGFza3MKICAgIG15IEBUYXNrTGlzdCA9ICRTZWxmLT5SZWN1cnJlbnRUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDcm9uJywKICAgICk7CgogICAgVEFTSzoKICAgIGZvciBteSAkVGFzayAoQFRhc2tMaXN0KSB7CgogICAgICAgICMgc2tpcCBpZiB0YXNrIGhhcyBhbiBhY3RpdmUgZ2VuZXJpYyBhZ2VudCBqb2IgaW4gdGhlIERCCiAgICAgICAgbmV4dCBUQVNLIGlmICRDcm9uSm9iTG9va3VweyAkVGFzay0+e05hbWV9IH07CgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlJlY3VycmVudFRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUYXNrICRUYXNrLT57TmFtZX0tJFRhc2stPntUeXBlfSAoJFRhc2stPntUYXNrSUR9KSBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENyb25UYXNrU3VtbWFyeSgpCgpnZXQgYSBzdW1tYXJ5IG9mIHRoZSBjcm9uIHRhc2tzIGZyb20gdGhlIHJlY3VycmVudCB0YXNrIHRhYmxlCgogICAgbXkgQFN1bW1hcnkgPSAkU2NoZWR1bGVyREJPYmplY3QtPkNyb25UYXNrU3VtbWFyeSgpOwoKPWN1dAoKc3ViIENyb25UYXNrU3VtbWFyeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNyb24gam9icyBmcm9tIHRoZSBTeXNDb25maWcKICAgIG15ICRDb25maWcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrJykgfHwge307CgogICAgbXkgJVRhc2tMb29rdXA7CgogICAgSk9CTkFNRToKICAgIGZvciBteSAkSm9iTmFtZSAoIHNvcnQga2V5cyAleyRDb25maWd9ICkgewoKICAgICAgICBteSAkSm9iQ29uZmlnID0gJENvbmZpZy0+eyRKb2JOYW1lfTsKCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkSm9iQ29uZmlnOwogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJEpvYkNvbmZpZy0+e1NjaGVkdWxlfTsKCiAgICAgICAgJFRhc2tMb29rdXB7JEpvYk5hbWV9ID0gJEpvYkNvbmZpZy0+e1NjaGVkdWxlfTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPlJlY3VycmVudFRhc2tTdW1tYXJ5KAogICAgICAgIFR5cGUgICAgICAgID0+ICdDcm9uJywKICAgICAgICBEaXNwbGF5VHlwZSA9PiAnY3JvbicsCiAgICAgICAgVGFza0xvb2t1cCAgPT4gXCVUYXNrTG9va3VwLAogICAgKTsKfQoKPWhlYWQyIEdlbmVyaWNBZ2VudFRhc2tUb0V4ZWN1dGUoKQoKY3JlYXRlcyBnZW5lcmljIGFnZW50IHRhc2tzIHRoYXQgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSBjdXJyZW50IHRpbWUgaW50byB0aGUgdGFzayB0YWJsZSB0byBleGVjdXRlCgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPkdlbmVyaWNBZ2VudFRhc2tUb0V4ZWN1dGUoCiAgICAgICAgTm9kZUlEID0+IDEsICAgICMgdGhlIElEIG9mIHRoZSBub2RlIGluIGEgY2x1c3RlciBlbnZpcm9ubWVudAogICAgICAgIFBJRCAgICA9PiA0NTYsICAjIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBkYWVtb24gdGhhdCBpcyBjcmVhdGluZyB0aGUgdGFza3MgdG8gZXhlY3V0aW9uCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyaWNBZ2VudFRhc2tUb0V4ZWN1dGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRLZXkgKHF3KE5vZGVJRCBQSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkS2V5ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGdlbmVyaWMgYWdlbnQgb2JqZWN0CiAgICBteSAkR2VuZXJpY0FnZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNBZ2VudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBnZW5lcmljIGFnZW50IGpvYnMKICAgIG15ICVKb2JMaXN0ID0gJEdlbmVyaWNBZ2VudE9iamVjdC0+Sm9iTGlzdCgpOwoKICAgICMgZG8gbm90aGluZyBpZiB0aGVyZSBhcmUgbm8gZ2VuZXJpYyBhZ2VudCBqb2JzCiAgICByZXR1cm4gMSBpZiAhJUpvYkxpc3Q7CgogICAgIyBnZXQgQ1JPTiBldmVudCBvYmplY3RzCiAgICBteSAkQ3JvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcpOwoKICAgIEpPQk5BTUU6CiAgICBmb3IgbXkgJEpvYk5hbWUgKCBzb3J0IGtleXMgJUpvYkxpc3QgKSB7CgogICAgICAgICMgZ2V0IGpvYgogICAgICAgIG15ICVKb2IgPSAkR2VuZXJpY0FnZW50T2JqZWN0LT5Kb2JHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJEpvYk5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyBza2lwIGlmIGpvYiBpcyBpbnZhbGlkCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkSm9ie1ZhbGlkfTsKCiAgICAgICAgIyBnZXQgcmVxdWlyZWQgcGFyYW1zCiAgICAgICAgbXkgJFNjaGVkdWxlQ2hlY2sgPSAxOwogICAgICAgIGZvciBteSAkS2V5IChxdyggU2NoZWR1bGVEYXlzIFNjaGVkdWxlTWludXRlcyBTY2hlZHVsZUhvdXJzICkpIHsKICAgICAgICAgICAgaWYgKCAhJEpvYnskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTY2hlZHVsZUNoZWNrID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBza2lwIGlmIGpvYiBpcyBub3QgdGltZSBiYXNlZAogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFNjaGVkdWxlQ2hlY2s7CgogICAgICAgICMgZ2V0IENST04gdGFiIGZvciBHZW5lcmljIEFnZW50IFNjaGVkdWxlCiAgICAgICAgbXkgJFNjaGVkdWxlID0gJENyb25FdmVudE9iamVjdC0+R2VuZXJpY0FnZW50U2NoZWR1bGUyQ3JvblRhYiglSm9iKTsKCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICEkU2NoZWR1bGU7CgogICAgICAgICMgZ2V0IHRoZSBsYXN0IHRpbWUgdGhlIEdlbmVyaWNBZ2VudCBqb2Igc2hvdWxkIGJlIGV4ZWN1dGVkLCB0aGlzIHJldHVybnMgZXZlbiBUSElTIG1pbnV0ZQogICAgICAgIG15ICRQcmV2aW91c0V2ZW50VGltZXN0YW1wID0gJENyb25FdmVudE9iamVjdC0+UHJldmlvdXNFdmVudEdldCgKICAgICAgICAgICAgU2NoZWR1bGUgPT4gJFNjaGVkdWxlLAogICAgICAgICk7CgogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFByZXZpb3VzRXZlbnRUaW1lc3RhbXA7CgogICAgICAgICMgZXhlY3V0ZSByZWN1cnJlbnQgdGFza3MKICAgICAgICAkU2VsZi0+UmVjdXJyZW50VGFza0V4ZWN1dGUoCiAgICAgICAgICAgIE5vZGVJRCAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17Tm9kZUlEfSwKICAgICAgICAgICAgUElEICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtQSUR9LAogICAgICAgICAgICBUYXNrTmFtZSAgICAgICAgICAgICAgICAgPT4gJEpvYk5hbWUsCiAgICAgICAgICAgIFRhc2tUeXBlICAgICAgICAgICAgICAgICA9PiAnR2VuZXJpY0FnZW50JywKICAgICAgICAgICAgUHJldmlvdXNFdmVudFRpbWVzdGFtcCAgID0+ICRQcmV2aW91c0V2ZW50VGltZXN0YW1wLAogICAgICAgICAgICBNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMgPT4gMSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgID0+IFwlSm9iLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBHZW5lcmljQWdlbnRUYXNrQ2xlYW51cCgpCgpyZW1vdmVzIHJlY3VycmVudCB0YXNrcyB0aGF0IGRvZXMgbm90IGhhdmUgYSBtYXRjaGluZyBnZW5lcmljIGFnZW50IGpvYgoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5HZW5lcmljQWdlbnRUYXNrQ2xlYW51cCgpOwoKPWN1dAoKc3ViIEdlbmVyaWNBZ2VudFRhc2tDbGVhbnVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgZ2VuZXJpYyBhZ2VudCBvYmplY3QKICAgIG15ICRHZW5lcmljQWdlbnRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0FnZW50Jyk7CgogICAgIyBnZXQgYSBsaXN0IG9mIGdlbmVyaWMgYWdlbnQgam9icwogICAgbXkgJUpvYkxpc3QgPSAkR2VuZXJpY0FnZW50T2JqZWN0LT5Kb2JMaXN0KCk7CgogICAgIyBkbyBub3RoaW5nIGlmIHRoZXJlIGFyZSBubyBnZW5lcmljIGFnZW50IGpvYnMKICAgIHJldHVybiAxIGlmICElSm9iTGlzdDsKCiAgICBteSAlR2VuZXJpY0FnZW50Sm9iTG9va3VwOwoKICAgICMgZ2V0IENST04gZXZlbnQgb2JqZWN0cwogICAgbXkgJENyb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnKTsKCiAgICBKT0JOQU1FOgogICAgZm9yIG15ICRKb2JOYW1lICggc29ydCBrZXlzICVKb2JMaXN0ICkgewoKICAgICAgICAjIGdldCBqb2IKICAgICAgICBteSAlSm9iID0gJEdlbmVyaWNBZ2VudE9iamVjdC0+Sm9iR2V0KAogICAgICAgICAgICBOYW1lID0+ICRKb2JOYW1lLAogICAgICAgICk7CgogICAgICAgICMgc2tpcCBpZiBqb2IgaXMgaW52YWxpZAogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJEpvYntWYWxpZH07CgogICAgICAgICMgZ2V0IHJlcXVpcmVkIHBhcmFtcwogICAgICAgIG15ICRTY2hlZHVsZUNoZWNrID0gMTsKICAgICAgICBmb3IgbXkgJEtleSAocXcoIFNjaGVkdWxlRGF5cyBTY2hlZHVsZU1pbnV0ZXMgU2NoZWR1bGVIb3VycyApKSB7CiAgICAgICAgICAgIGlmICggISRKb2J7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2NoZWR1bGVDaGVjayA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2tpcCBpZiBqb2IgaXMgbm90IHRpbWUgYmFzZWQKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRTY2hlZHVsZUNoZWNrOwoKICAgICAgICAjIGdldCBDUk9OIHRhYiBmb3IgR2VuZXJpYyBBZ2VudCBTY2hlZHVsZQogICAgICAgIG15ICRTY2hlZHVsZSA9ICRDcm9uRXZlbnRPYmplY3QtPkdlbmVyaWNBZ2VudFNjaGVkdWxlMkNyb25UYWIoJUpvYik7CgogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFNjaGVkdWxlOwoKICAgICAgICAkR2VuZXJpY0FnZW50Sm9iTG9va3VweyRKb2JOYW1lfSA9IDE7CiAgICB9CgogICAgIyBnZXQgYSBsaXN0IG9mIGFsbCBnZW5lcmljIGFnZW50IHJlY3VycmVudCB0YXNrcwogICAgbXkgQFRhc2tMaXN0ID0gJFNlbGYtPlJlY3VycmVudFRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ0dlbmVyaWNBZ2VudCcsCiAgICApOwoKICAgIFRBU0s6CiAgICBmb3IgbXkgJFRhc2sgKEBUYXNrTGlzdCkgewoKICAgICAgICAjIHNraXAgaWYgdGFzayBoYXMgYW4gYWN0aXZlIGdlbmVyaWMgYWdlbnQgam9iIGluIHRoZSBEQgogICAgICAgIG5leHQgVEFTSyBpZiAkR2VuZXJpY0FnZW50Sm9iTG9va3VweyAkVGFzay0+e05hbWV9IH07CgogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlJlY3VycmVudFRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkVGFzay0+e1Rhc2tJRH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUYXNrICRUYXNrLT57TmFtZX0tJFRhc2stPntUeXBlfSAoJFRhc2stPntUYXNrSUR9KSBjb3VsZCBub3QgYmUgZGVsZXRlZCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEdlbmVyaWNBZ2VudFRhc2tTdW1tYXJ5KCkKCmdldCBhIHN1bW1hcnkgb2YgdGhlIGdlbmVyaWMgYWdlbnQgdGFza3MgZnJvbSB0aGUgcmVjdXJyZW50IHRhc2sgdGFibGUKCiAgICBteSBAU3VtbWFyeSA9ICRTY2hlZHVsZXJEQk9iamVjdC0+R2VuZXJpY0FnZW50VGFza1N1bW1hcnkoKTsKCj1jdXQKCnN1YiBHZW5lcmljQWdlbnRUYXNrU3VtbWFyeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGdlbmVyaWMgYWdlbnQgb2JqZWN0CiAgICBteSAkR2VuZXJpY0FnZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNBZ2VudCcpOwoKICAgICMgZ2V0IGEgbGlzdCBvZiBnZW5lcmljIGFnZW50IGpvYnMgZnJvbSB0aGUgREIKICAgIG15ICVKb2JMaXN0ID0gJEdlbmVyaWNBZ2VudE9iamVjdC0+Sm9iTGlzdCgpOwoKICAgICMgZ2V0IGNyb24gZXZlbnQgb2JqZWN0CiAgICBteSAkQ3JvbkV2ZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcpOwoKICAgIG15ICVUYXNrTG9va3VwOwoKICAgIEpPQk5BTUU6CiAgICBmb3IgbXkgJEpvYk5hbWUgKCBzb3J0IGtleXMgJUpvYkxpc3QgKSB7CgogICAgICAgICMgZ2V0IGpvYgogICAgICAgIG15ICVKb2JDb25maWcgPSAkR2VuZXJpY0FnZW50T2JqZWN0LT5Kb2JHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJEpvYk5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBKT0JOQU1FIGlmICElSm9iQ29uZmlnOwogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJEpvYkNvbmZpZ3tWYWxpZH07CgogICAgICAgICMgZ2V0IHJlcXVpcmVkIHBhcmFtcwogICAgICAgIG15ICRTY2hlZHVsZUNoZWNrID0gMTsKICAgICAgICBmb3IgbXkgJEtleSAocXcoIFNjaGVkdWxlRGF5cyBTY2hlZHVsZU1pbnV0ZXMgU2NoZWR1bGVIb3VycyApKSB7CiAgICAgICAgICAgIGlmICggISRKb2JDb25maWd7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAkU2NoZWR1bGVDaGVjayA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2tpcCBpZiBqb2IgaXMgbm90IHRpbWUgYmFzZWQKICAgICAgICBuZXh0IEpPQk5BTUUgaWYgISRTY2hlZHVsZUNoZWNrOwoKICAgICAgICAjIGdldCBDUk9OIHRhYiBmb3IgR2VuZXJpYyBBZ2VudCBTY2hlZHVsZQogICAgICAgIG15ICRTY2hlZHVsZSA9ICRDcm9uRXZlbnRPYmplY3QtPkdlbmVyaWNBZ2VudFNjaGVkdWxlMkNyb25UYWIoJUpvYkNvbmZpZyk7CgogICAgICAgIG5leHQgSk9CTkFNRSBpZiAhJFNjaGVkdWxlOwoKICAgICAgICAkVGFza0xvb2t1cHskSm9iTmFtZX0gPSAkU2NoZWR1bGU7CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT5SZWN1cnJlbnRUYXNrU3VtbWFyeSgKICAgICAgICBUeXBlICAgICAgICA9PiAnR2VuZXJpY0FnZW50JywKICAgICAgICBEaXNwbGF5VHlwZSA9PiAnZ2VuZXJpYyBhZ2VudCcsCiAgICAgICAgVGFza0xvb2t1cCAgPT4gXCVUYXNrTG9va3VwLAogICAgKTsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tHZXQoKQoKZ2V0IHNjaGVkdWxlciByZWN1cnJlbnQgdGFzawoKICAgIG15ICVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrR2V0KAogICAgICAgIFRhc2tJRCA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICAlVGFzayA9ICgKICAgICAgICBUYXNrSUQgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ2FueSBuYW1lJywKICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAnR2VuZXJpY0ludGVyZmFjZScsCiAgICAgICAgTGFzdEV4ZWN1dGlvblRpbWUgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIExvY2tLZXkgICAgICAgICAgID0+ICdYWVonLAogICAgICAgIExvY2tUaW1lICAgICAgICAgID0+ICcyMDE1LTAxLTAyIDAwOjAwOjAwJwogICAgICAgIENyZWF0ZVRpbWUgICAgICAgID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJwogICAgICAgIENoYW5nZVRpbWUgICAgICAgID0+ICcyMDE1LTAxLTAyIDAwOjAwOjAwJwogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUYXNrSUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZ2V0IHRhc2sgZnJvbSBkYXRhYmFzZQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgbmFtZSwgdGFza190eXBlLCBsYXN0X2V4ZWN1dGlvbl90aW1lLCBsb2NrX2tleSwgbG9ja190aW1lLCBjcmVhdGVfdGltZSwgY2hhbmdlX3RpbWUKICAgICAgICAgICAgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgIG15ICVUYXNrOwogICAgd2hpbGUgKCBteSBARGF0YSA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAlVGFzayA9ICgKICAgICAgICAgICAgVGFza0lEICAgICAgICAgICAgPT4gJFBhcmFte1Rhc2tJRH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICREYXRhWzBdLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICA9PiAkRGF0YVsxXSwKICAgICAgICAgICAgTGFzdEV4ZWN1dGlvblRpbWUgPT4gJERhdGFbMl0sCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgICAgID0+ICREYXRhWzNdIC8vIDAsCiAgICAgICAgICAgIExvY2tUaW1lICAgICAgICAgID0+ICREYXRhWzRdIC8vICcnLAogICAgICAgICAgICBDcmVhdGVUaW1lICAgICAgICA9PiAkRGF0YVs1XSwKICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgPT4gJERhdGFbNl0KICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVGFzazsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tMaXN0KCkKCmdldCB0aGUgbGlzdCBvZiBzY2hlZHVsZXIgcmVjdXJyZW50IHRhc2tzCgogICAgbXkgQExpc3QgPSAkU2NoZWR1bGVyREJPYmplY3QtPlJlY3VycmVudFRhc2tMaXN0KAogICAgICAgIFR5cGUgPT4gJ3NvbWUgdHlwZScsICAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJuczoKCiAgICBATGlzdCA9ICgKICAgICAgICB7CiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgICAgID0+IDEyMywKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ2FueSBuYW1lJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgPT4gJ0dlbmVyaWNJbnRlcmZhY2UnLAogICAgICAgICAgICBMYXN0RXhlY3V0aW9uVGltZSA9PiAnMjAxNS0wMS0wMSAwMDowMDowMCcsCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgICAgID0+ICdYWVonLAogICAgICAgICAgICBMb2NrVGltZSAgICAgICAgICA9PiAnMjAxNS0wMS0wMiAwMDowMDowMCcKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnCiAgICAgICAgICAgIENoYW5nZVRpbWUgICAgICAgID0+ICcyMDE1LTAxLTAyIDAwOjAwOjAwJwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBUYXNrSUQgICAgICAgICAgICA9PiA0NTYsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdhbnkgb3RoZXIgbmFtZScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdHZW5lcmljSW50ZXJmYWNlJywKICAgICAgICAgICAgTGFzdEV4ZWN1dGlvblRpbWUgPT4gJzIwMTUtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgICAgICBMb2NrS2V5ICAgICAgICAgICA9PiAnWFlaJywKICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgICAgPT4gJzIwMTUtMDEtMDIgMDA6MDA6MDAnCiAgICAgICAgICAgIENyZWF0ZVRpbWUgICAgICAgID0+ICcyMDE1LTAxLTAxIDAwOjAwOjAwJwogICAgICAgICAgICBDaGFuZ2VUaW1lICAgICAgICA9PiAnMjAxNS0wMS0wMiAwMDowMDowMCcKICAgICAgICB9LAogICAgICAgICMgLi4uCiAgICApOwoKPWN1dAoKc3ViIFJlY3VycmVudFRhc2tMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIG5hbWUsIHRhc2tfdHlwZSwgbGFzdF9leGVjdXRpb25fdGltZSwgbG9ja19rZXksIGxvY2tfdGltZSwgY3JlYXRlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV90aW1lCiAgICAgICAgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2snOwogICAgbXkgQEJpbmQ7CgogICAgIyBhZGQgdHlwZQogICAgaWYgKCAkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJFNRTCAuPSAnIFdIRVJFIHRhc2tfdHlwZSA9ID8nOwogICAgICAgIEBCaW5kID0gKCBcJFBhcmFte1R5cGV9ICk7CiAgICB9CgogICAgJFNRTCAuPSAnIE9SREVSIEJZIGlkIEFTQyc7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgICAgIFRhc2tJRCAgICAgICAgICAgID0+ICRSb3dbMF0sCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICRSb3dbMV0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIExhc3RFeGVjdXRpb25UaW1lID0+ICRSb3dbM10sCiAgICAgICAgICAgIExvY2tLZXkgICAgICAgICAgID0+ICRSb3dbNF0gLy8gMCwKICAgICAgICAgICAgTG9ja1RpbWUgICAgICAgICAgPT4gJFJvd1s1XSAvLyAnJywKICAgICAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgPT4gJFJvd1s3XSwKICAgICAgICB9OwogICAgfQoKICAgIHJldHVybiBATGlzdDsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tEZWxldGUoKQoKZGVsZXRlIGEgdGFzayBmcm9tIHNjaGVkdWxlciByZWN1cnJlbnQgdGFzayBsaXN0CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyREJPYmplY3QtPlJlY3VycmVudFRhc2tEZWxldGUoCiAgICAgICAgVGFza0lEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VGFza0lEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVGFza0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGFzayB0byBkZWxldGUgY2FjaGUKICAgIG15ICVUYXNrID0gJFNlbGYtPlJlY3VycmVudFRhc2tHZXQoCiAgICAgICAgVGFza0lEID0+ICRQYXJhbXtUYXNrSUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSB0YXNrIGZyb20gdGhlIHJlY3VycmVudCB0YXNrIGxpc3QKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUYXNrSUR9IF0sCiAgICApOwoKICAgICMgZGVsZXRlIGNhY2hlIGlmIHRhc2sgZXhpdHMgYmVmb3JlIHRoZSBkZWxldGUKICAgIGlmICglVGFzaykgewoKICAgICAgICBteSAkQ2FjaGVLZXkgPSAiJFRhc2t7TmFtZX06OiRUYXNre1R5cGV9IjsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnU2NoZWR1bGVyREJSZWN1cnJlbnRUYXNrRXhlY3V0ZScsCiAgICAgICAgICAgIEtleSAgPT4gJyRDYWNoZUtleScsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIFJlY3VycmVudFRhc2tFeGVjdXRlKCkKCmV4ZWN1dGVzIHJlY3VycmVudCB0YXNrcyBsaWtlIGNyb24gb3IgZ2VuZXJpYyBhZ2VudCB0YXNrcwoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrRXhlY3V0ZSgKICAgICAgICBOb2RlSUQgICAgICAgICAgICAgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgdGhlIElEIG9mIHRoZSBub2RlIGluIGEgY2x1c3RlciBlbnZpcm9ubWVudAogICAgICAgIFBJRCAgICAgICAgICAgICAgICAgICAgICA9PiA0NTYsICAgICAgICAgICAgICAgIyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZGFlbW9uIHRoYXQgaXMgY3JlYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgdGhlIHRhc2tzIHRvIGV4ZWN1dGlvbgogICAgICAgIFRhc2tOYW1lICAgICAgICAgICAgICAgICA9PiAnVW5pcXVlVGFza05hbWUnLAogICAgICAgIFRhc2tUeXBlICAgICAgICAgICAgICAgICA9PiAnQ3JvbicsCiAgICAgICAgUHJldmlvdXNFdmVudFRpbWVzdGFtcCAgID0+IDE0MzMyMTIzNDMsCiAgICAgICAgTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzID0+IDEsICAgICAgICAgICAgICAgICAjIG9wdGlvbmFsIChkZWZhdWx0IDApIG51bWJlciBvZiB0YXNrcyB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICBzYW1lIG5hbWUgYW5kIHR5cGUgdGhhdCBjYW4gYmUgaW4gZXhlY3V0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgIHRhYmxlIGF0IHRoZSBzYW1lIHRpbWUsIHZhbHVlIG9mIDAgbWVhbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgdW5saW1pdGVkCiAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAjIGRhdGEgcGF5bG9hZAogICAgICAgICAgICAuLi4KICAgICAgICB9LAogICAgKTsKCj1jdXQKCnN1YiBSZWN1cnJlbnRUYXNrRXhlY3V0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEtleSAocXcoTm9kZUlEIFBJRCBUYXNrTmFtZSBUYXNrVHlwZSBQcmV2aW91c0V2ZW50VGltZXN0YW1wIERhdGEpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRLZXl9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkS2V5ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgIG15ICRDYWNoZUtleSA9ICIkUGFyYW17VGFza05hbWV9OjokUGFyYW17VGFza1R5cGV9IjsKCiAgICAjIHJlYWQgY2FjaGUKICAgIG15ICRDYWNoZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTY2hlZHVsZXJEQlJlY3VycmVudFRhc2tFeGVjdXRlJywKICAgICAgICBLZXkgICAgICAgICAgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgQ2FjaGVJbk1lbW9yeSAgPT4gMCwKICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMSBpZiAkQ2FjaGUgJiYgJENhY2hlIGVxICRQYXJhbXtQcmV2aW91c0V2ZW50VGltZXN0YW1wfTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJExhc3RFeGVjdXRpb25UaW1lU3RhbXA7CgogICAgIyBnZXQgZW50cnkgaWQgYW5kIGxhc3QgZXhlY3V0aW9uIHRpbWUgZnJvbSBkYXRhYmFzZQogICAgbXkgJEVudHJ5SUQ7CiAgICBUUlk6CiAgICBmb3IgbXkgJFRyeSAoIDEgLi4gMTAgKSB7CgogICAgICAgICMgaW5zZXJ0IGVudHJ5IGlmIG5vdCBleGlzdHMKICAgICAgICBpZiAoICRUcnkgbmUgMSApIHsKCiAgICAgICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCA9PiAiCiAgICAgICAgICAgICAgICAgICAgSU5TRVJUIElOVE8gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgICAgICAgICAgICAgIChuYW1lLCB0YXNrX3R5cGUsIGxhc3RfZXhlY3V0aW9uX3RpbWUsIGxvY2tfa2V5LCBjcmVhdGVfdGltZSwgY2hhbmdlX3RpbWUpCiAgICAgICAgICAgICAgICAgICAgVkFMVUVTCiAgICAgICAgICAgICAgICAgICAgICAgICg/LCA/LCA/LCAwLCBjdXJyZW50X3RpbWVzdGFtcCwgY3VycmVudF90aW1lc3RhbXApIiwKICAgICAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgICAgIFwkUGFyYW17VGFza05hbWV9LAogICAgICAgICAgICAgICAgICAgIFwkUGFyYW17VGFza1R5cGV9LAogICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UHJldmlvdXNFdmVudFRpbWVzdGFtcH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZW50cnkgaWQKICAgICAgICBuZXh0IFRSWSBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIgogICAgICAgICAgICAgICAgU0VMRUNUIGlkLCBsYXN0X2V4ZWN1dGlvbl90aW1lCiAgICAgICAgICAgICAgICBGUk9NIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICAgICAgV0hFUkUgdGFza190eXBlID0gPyBBTkQgbmFtZSA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkUGFyYW17VGFza1R5cGV9LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUYXNrTmFtZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgZW50cnkgaWQKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEVudHJ5SUQgICAgICAgICAgICAgICAgPSAkUm93WzBdOwogICAgICAgICAgICAkTGFzdEV4ZWN1dGlvblRpbWVTdGFtcCA9ICRSb3dbMV07CiAgICAgICAgfQoKICAgICAgICBsYXN0IFRSWSBpZiAkRW50cnlJRDsKICAgIH0KCiAgICByZXR1cm4gaWYgISRFbnRyeUlEOwoKICAgIGlmICggJExhc3RFeGVjdXRpb25UaW1lU3RhbXAgZXEgJFBhcmFte1ByZXZpb3VzRXZlbnRUaW1lc3RhbXB9ICkgewoKICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAnU2NoZWR1bGVyREJSZWN1cnJlbnRUYXNrRXhlY3V0ZScsCiAgICAgICAgICAgIEtleSAgICAgICAgICAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVFRMICAgICAgICAgICAgPT4gNjAgKiA1LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiAkUGFyYW17UHJldmlvdXNFdmVudFRpbWVzdGFtcH0sCiAgICAgICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgICAgIENhY2hlSW5CYWNrZW5kID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGxvY2sga2V5CiAgICBteSAkTG9ja0tleU5vZGVJRCA9IHNwcmludGYgJyUwM2QnLCAkUGFyYW17Tm9kZUlEfTsKICAgIG15ICRMb2NrS2V5UElEICAgID0gc3ByaW50ZiAnJTA4ZCcsICRQYXJhbXtQSUR9OwogICAgbXkgJExvY2tLZXkgICAgICAgPSAnMScgLiAkTG9ja0tleU5vZGVJRCAuICRMb2NrS2V5UElEOwoKICAgICMgbG9jayB0aGUgZW50cnkgaW4gZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICBVUERBVEUgc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9ID8sIGxvY2tfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgIFdIRVJFIGxvY2tfa2V5ID0gMCBBTkQgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICBcJEVudHJ5SUQsCiAgICAgICAgXSwKICAgICk7CgogICAgIyBnZXQgbG9ja2VkIGVudHJ5CiAgICAkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAnU0VMRUNUIGxvY2tfa2V5IEZST00gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrIFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkRW50cnlJRCBdLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICRMb2NrS2V5RnJvbURCID0gJyc7CiAgICB3aGlsZSAoIG15IEBEYXRhID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJExvY2tLZXlGcm9tREIgPSAkRGF0YVswXTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAkTG9ja0tleUZyb21EQiBuZSAkTG9ja0tleTsKCiAgICAjIHNldCBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1NjaGVkdWxlckRCUmVjdXJyZW50VGFza0V4ZWN1dGUnLAogICAgICAgIEtleSAgICAgICAgICAgID0+ICRDYWNoZUtleSwKICAgICAgICBUVEwgICAgICAgICAgICA9PiA2MCAqIDUsCiAgICAgICAgVmFsdWUgICAgICAgICAgPT4gJFBhcmFte1ByZXZpb3VzRXZlbnRUaW1lc3RhbXB9LAogICAgICAgIENhY2hlSW5NZW1vcnkgID0+IDAsCiAgICAgICAgQ2FjaGVJbkJhY2tlbmQgPT4gMSwKICAgICk7CgogICAgIyBhZGQgdGhlIHRhc2sKICAgIG15ICRUYXNrSUQgPSAkU2VsZi0+VGFza0FkZCgKICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1Rhc2tUeXBlfSwKICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1Rhc2tOYW1lfSwKICAgICAgICBBdHRlbXB0cyAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBNYXhpbXVtUGFyYWxsZWxJbnN0YW5jZXMgPT4gJFBhcmFte01heGltdW1QYXJhbGxlbEluc3RhbmNlc30sCiAgICAgICAgRGF0YSAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfSwKICAgICk7CgogICAgIyB1bmxvY2sgdGhlIHRhc2sKICAgIGlmICggSXNQb3NpdGl2ZUludGVnZXIoJFRhc2tJRCkgKSB7CiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgICAgIFNFVCBsb2NrX2tleSA9IDAsIGxvY2tfdGltZSA9IE5VTEwsIGxhc3RfZXhlY3V0aW9uX3RpbWUgPSA/LCBsYXN0X3dvcmtlcl90YXNrX2lkID0gPywKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wCiAgICAgICAgICAgICAgICBXSEVSRSBsb2NrX2tleSA9ID8gQU5EIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtQcmV2aW91c0V2ZW50VGltZXN0YW1wfSwKICAgICAgICAgICAgICAgIFwkVGFza0lELAogICAgICAgICAgICAgICAgXCRMb2NrS2V5LAogICAgICAgICAgICAgICAgXCRFbnRyeUlELAogICAgICAgICAgICBdLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gMCwgbG9ja190aW1lID0gTlVMTCwgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICAgICAgV0hFUkUgbG9ja19rZXkgPSA/IEFORCBpZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgICAgIFwkTG9ja0tleSwKICAgICAgICAgICAgICAgIFwkRW50cnlJRCwKICAgICAgICAgICAgXSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICRUYXNrSUQ7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSBuZXcgc2NoZWR1bGVyIHJlY3VycmVudCB0YXNrICRQYXJhbXtUYXNrTmFtZX0hIiwKICAgICk7CgogICAgcmV0dXJuOwp9Cgo9aGVhZDIgUmVjdXJyZW50VGFza1N1bW1hcnkoKQoKZ2V0IGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIHRhc2tzIGZvciB0aGUgc3BlY2lmaWVkIHRhc2sgdHlwZQoKICAgIG15IEBTdW1tYXJ5ID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrU3VtbWFyeSgKICAgICAgICBUeXBlICAgICAgICAgPT4gJ3NvbWVfdHlwZScsCiAgICAgICAgRGlzcGxheVR5cGUgID0+ICdzb21lIHR5cGUnLAogICAgICAgIFRhc2tMb29rdXAgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgdGFza3Mgd2l0aCBuYW1lcyBpbiB0aGlzIHRhYmxlIHdpbGwgYmUgc2hvd24KICAgICAgICAgICAgVGFza05hbWUxID0+ICcqICogKiAqIConLCAgICAgICAgICAgIyAgIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbXMgaW4gdGhpcyB0YWJsZSBpcyBhIGNyb250YWIKICAgICAgICAgICAgVGFza05hbWUzID0+ICcqLzEgMyw0ICogKiAqIDAnLCAgICAgIyAgIGZvcm1hdCBzY2hlZHVsZQogICAgICAgIH0KICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza1N1bW1hcnkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFR5cGUgRGlzcGxheVR5cGUgVGFza0xvb2t1cCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAoKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCByZWYgJFBhcmFte1Rhc2tMb29rdXB9IG5lICdIQVNIJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRhc2tMb29rdXAgaXMgaW52YWxpZCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAoKTsKICAgIH0KCiAgICAjIGdldCBkYXRhYmFzZSBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgcmV0dXJuICgpIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkLCBuYW1lLCB0YXNrX3R5cGUsIGxhc3RfZXhlY3V0aW9uX3RpbWUsIGxhc3Rfd29ya2VyX3N0YXR1cywgbGFzdF93b3JrZXJfcnVubmluZ190aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgIFdIRVJFIHRhc2tfdHlwZSA9ID8KICAgICAgICAgICAgT1JERVIgQlkgaWQgQVNDJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUeXBlfSBdLAogICAgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENyb25FdmVudE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDcm9uRXZlbnQnKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBMaXN0OwogICAgUk9XOgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CgogICAgICAgICMgc2tpcCB0YXNrcyB0aGF0IGFyZSBub3QgcmVnaXN0ZXJlZCBpbiB0aGUgVGFza0xvb2t1cCB0YWJsZQogICAgICAgIG15ICRTY2hlZHVsZSA9ICRQYXJhbXtUYXNrTG9va3VwfS0+eyAkUm93WzFdIH07CgogICAgICAgIG5leHQgUk9XIGlmICEkU2NoZWR1bGU7CgogICAgICAgICMgY2FsY3VsYXRlIG5leHQgY3JvbiBldmVudCB0aW1lCiAgICAgICAgbXkgJE5leHRFeGVjdXRpb25UaW1lID0gJENyb25FdmVudE9iamVjdC0+TmV4dEV2ZW50R2V0KAogICAgICAgICAgICBTY2hlZHVsZSA9PiAkU2NoZWR1bGUsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJExhc3RXb3JrZXJTdGF0dXM7CiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbNF0gKSB7CiAgICAgICAgICAgICRMYXN0V29ya2VyU3RhdHVzID0gJFJvd1s0XSA/ICdTdWNjZXNzJyA6ICdGYWlsJzsKICAgICAgICB9CgogICAgICAgIG15ICRMYXN0V29ya2VyUnVubmluZ1RpbWU7CiAgICAgICAgaWYgKCBkZWZpbmVkICRSb3dbNV0gKSB7CiAgICAgICAgICAgICRMYXN0V29ya2VyUnVubmluZ1RpbWUgPSAkU2VsZi0+X1NlY29uZHMyU3RyaW5nKCAkUm93WzVdICk7CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBMaXN0LCB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgPT4gJFJvd1syXSwKICAgICAgICAgICAgTGFzdEV4ZWN1dGlvblRpbWUgICAgID0+ICRSb3dbM10gICAgICAgICAgICAgICAgLy8gJycsCiAgICAgICAgICAgIE5leHRFeGVjdXRpb25UaW1lICAgICA9PiAkTmV4dEV4ZWN1dGlvblRpbWUgICAgIC8vICcnLAogICAgICAgICAgICBMYXN0V29ya2VyU3RhdHVzICAgICAgPT4gJExhc3RXb3JrZXJTdGF0dXMgICAgICAvLyAnTi9BJywKICAgICAgICAgICAgTGFzdFdvcmtlclJ1bm5pbmdUaW1lID0+ICRMYXN0V29ya2VyUnVubmluZ1RpbWUgLy8gJ04vQScsCiAgICAgICAgfTsKICAgIH0KCiAgICByZXR1cm4gKAogICAgICAgIHsKICAgICAgICAgICAgSGVhZGVyID0+ICJSZWN1cnJlbnQgJFBhcmFte0Rpc3BsYXlUeXBlfSB0YXNrczoiLAogICAgICAgICAgICBDb2x1bW4gPT4gWwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gNDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdMYXN0RXhlY3V0aW9uVGltZScsCiAgICAgICAgICAgICAgICAgICAgRGlzcGxheU5hbWUgPT4gJ0xhc3QgRXhlY3V0aW9uJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAyMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0xhc3RXb3JrZXJTdGF0dXMnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdMYXN0IFN0YXR1cycsCiAgICAgICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgPT4gMTIsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdMYXN0V29ya2VyUnVubmluZ1RpbWUnLAogICAgICAgICAgICAgICAgICAgIERpc3BsYXlOYW1lID0+ICdMYXN0IER1cmF0aW9uJywKICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICA9PiAxOCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05leHRFeGVjdXRpb25UaW1lJywKICAgICAgICAgICAgICAgICAgICBEaXNwbGF5TmFtZSA9PiAnTmV4dCBFeGVjdXRpb24nLAogICAgICAgICAgICAgICAgICAgIFNpemUgICAgICAgID0+IDIwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcQExpc3QsCiAgICAgICAgICAgIE5vRGF0YU1lc3NhZ2UgPT4gIlRoZXJlIGFyZSBjdXJyZW50bHkgbm8gJFBhcmFte0Rpc3BsYXlUeXBlfSByZWN1cnJpbmcgdGFza3MgY29uZmlndXJlZC4iLAogICAgICAgIH0sCiAgICApOwp9Cgo9aGVhZDIgUmVjdXJyZW50VGFza1dvcmtlckluZm9TZXQoKQoKc2V0cyBsYXN0IHdvcmtlciBpbmZvcm1hdGlvbiAoc3VjY2VzcyBzdGF0dXMgYW5kIHJ1bm5pbmcgdGltZSkgdG8gYSByZWN1cnJlbnQgdGFzawoKICAgIG15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5SZWN1cnJlbnRUYXNrV29ya2VySW5mb1NldCgKICAgICAgICBMYXN0V29ya2VyVGFza0lEICAgICAgPT4gMTIzLCAgICAgICAgIyB0aGUgdGFzayBJRCBmcm9tIHRoZSB3b3JrZXIgdGFibGUgdGhhdCBpcyBwZXJmb3JtaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgcmVjdXJyaW5nIHRhc2sKICAgICAgICBMYXN0V29ya2VyU3RhdGlzICAgICAgPT4gMSwgICAgICAgICAgIyBvcHRpb25hbCAxIG9yIDAsIGRlZmF1bHRzIHRvIDAsIDEgbWVhbnMgc3VjY2VzcwogICAgICAgIExhc3RXb3JrZXJSdW5uaW5nVGltZSA9PiAxMjMsICAgICAgICAjIG9wdGlvbmFsLCBkZWZhdWx0cyB0byAwLCB0aGUgbnVtYmVyIGluIHNlY29uZHMgYSB3b3JrZXIgdG9vawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgdG8gY29tcGxldGUgdGhlIHRhc2sKICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza1dvcmtlckluZm9TZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0xhc3RXb3JrZXJUYXNrSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBMYXN0V29ya2VyVGFza0lEISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRMYXN0V29ya2VyU3RhdHVzICAgICAgPSAkUGFyYW17TGFzdFdvcmtlclN0YXR1c30gPyAxIDogMDsKICAgIG15ICRMYXN0V29ya2VyUnVubmluZ1RpbWUgPSAkUGFyYW17TGFzdFdvcmtlclJ1bm5pbmdUaW1lfSAvLyAwOwoKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFVQREFURSBzY2hlZHVsZXJfcmVjdXJyZW50X3Rhc2sKICAgICAgICAgICAgU0VUIGxhc3Rfd29ya2VyX3N0YXR1cyA9ID8sIGxhc3Rfd29ya2VyX3J1bm5pbmdfdGltZSA9ID8sIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAKICAgICAgICAgICAgV0hFUkUgbGFzdF93b3JrZXJfdGFza19pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJExhc3RXb3JrZXJTdGF0dXMsCiAgICAgICAgICAgIFwkTGFzdFdvcmtlclJ1bm5pbmdUaW1lLAogICAgICAgICAgICBcJFBhcmFte0xhc3RXb3JrZXJUYXNrSUR9LAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgUmVjdXJyZW50VGFza1VubG9ja0V4cGlyZWQoKQoKcmVtb3ZlIGxvY2sgc3RhdHVzIGZvciByZWN1cnJpbmcgdGFza3MgdGhhdCBoYXMgYmVlbiBsb2NrZWQgZm9yIG1vcmUgdGhhbiAxIG1pbnV0ZXMKCiAgICBteSAkU3VjY2VzcyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+UmVjdXJyZW50VGFza1VubG9ja0V4cGlyZWQoCiAgICAgICAgVHlwZSA9PiAnc29tZV90eXBlJywKICAgICk7Cgo9Y3V0CgpzdWIgUmVjdXJyZW50VGFza1VubG9ja0V4cGlyZWQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBUeXBlIiwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGFzayB0aGUgZGF0YWJhc2UgKGdldCBhbGwgcmVjdXJyZW50IHRhc2tzIGZvciB0aGUgZ2l2ZW4gdHlwZSB3aXRoIGEgbG9jayBrZXkgZGlmZmVyZW50IHRoYW4gMCkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIFNFTEVDVCBpZCwgbmFtZSwgbG9ja190aW1lCiAgICAgICAgICAgIEZST00gc2NoZWR1bGVyX3JlY3VycmVudF90YXNrCiAgICAgICAgICAgIFdIRVJFIHRhc2tfdHlwZSA9ID8KICAgICAgICAgICAgICAgIEFORCBsb2NrX2tleSA8PiAwCiAgICAgICAgICAgIE9SREVSIEJZIGlkIEFTQycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VHlwZX0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIGdldCBjdXJyZW50IHN5c3RlbSB0aW1lCiAgICAgICAgbXkgJFN5c3RlbVRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpOwoKICAgICAgICAjIGNvbnZlcnQgbG9jayB0aW1lIHN0YW1wIHRvIGEgc3lzdGVtIHRpbWUKICAgICAgICBteSAkTG9ja1RpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUm93WzJdLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJExvY2tUaW1lID0gJExvY2tUaW1lID8gJExvY2tUaW1lLT5Ub0Vwb2NoKCkgOiAwOwoKICAgICAgICAjIHNraXAgdGFzayBpZiBpdCBoYXMgYmVlbiBsb2NrZWQgd2l0aGluIHRoZSBsYXN0IG1pbnV0ZQogICAgICAgIG5leHQgUk9XIGlmICRTeXN0ZW1UaW1lIC0gJExvY2tUaW1lIDwgNjA7CgogICAgICAgIHB1c2ggQExpc3QsIHsKICAgICAgICAgICAgVGFza0lEICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJFJvd1sxXSwKICAgICAgICAgICAgTG9ja1RpbWUgPT4gJFJvd1syXSwKICAgICAgICB9OwogICAgfQoKICAgICMgc3RvcCBpZiB0aGVyZSBhcmUgbm8gdGFza3MgdG8gdW5sb2NrCiAgICByZXR1cm4gMSBpZiAhQExpc3Q7CgogICAgZm9yIG15ICRUYXNrIChATGlzdCkgewoKICAgICAgICAjIHVubG9jayBhbGwgdGhlIHRhc2sgdGhhdCBoYXMgYmVlbiBsb2NrZWQgZm9yIG1vcmUgdGhhbiAxIG1pbnV0ZQogICAgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgPT4gJwogICAgICAgICAgICAgICAgVVBEQVRFIHNjaGVkdWxlcl9yZWN1cnJlbnRfdGFzawogICAgICAgICAgICAgICAgU0VUIGxvY2tfa2V5ID0gMCwgbG9ja190aW1lID0gTlVMTCwgY2hhbmdlX3RpbWUgPSBjdXJyZW50X3RpbWVzdGFtcAogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkVGFzay0+e1Rhc2tJRH0sIF0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQxIFBSSVZBVEUgSU5URVJGQUNFCgo9aGVhZDIgX1NlY29uZHMyU3RyaW5nKCkKCmNvbnZlcnQgYW4gYW1vdW50IG9mIHNlY29uZHMgdG8gYSBtb3JlIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCwgZS5nLiA8IDEgU2Vjb25kLCA1IE1pbnV0ZXMKCiAgICBteSAkU3RyaW5nID0gJFNjaGVkdWxlckRCT2JqZWN0LT5fU2Vjb25kczJTdHJpbmcoLjIpOwoKcmV0dXJucwoKICAgICRTdHJpbmcgPSAnPCAxIFNlY29uZCc7CgpvcgoKICAgIG15ICRTdHJpbmcgPSAkU2NoZWR1bGVyREJPYmplY3QtPl9TZWNvbmRzMlN0cmluZyg4KTsKCnJldHVybnMKCiAgICAkU3RyaW5nID0gJzggU2Vjb25kKHMpJzsKCm9yCgogICAgbXkgJFN0cmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+X1NlY29uZHMyU3RyaW5nKDYyKTsKCnJldHVybnMKCiAgICAkU3RyaW5nID0gJzEgTWludXRlKHMpJzsKCm9yCgogICAgbXkgJFN0cmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+X1NlY29uZHMyU3RyaW5nKDM2MTApOwoKcmV0dXJucwoKICAgICRTdHJpbmcgPSAnMSBIb3VyKHMpJzsKCm9yCgogICAgbXkgJFN0cmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+X1NlY29uZHMyU3RyaW5nKDg2XzY0MCk7CgpyZXR1cm5zCgogICAgJFN0cmluZyA9ICcxIERheShzKSc7Cgo9Y3V0CgpzdWIgX1NlY29uZHMyU3RyaW5nIHsKICAgIG15ICggJFNlbGYsICRTZWNvbmRzICkgPSBAXzsKCiAgICByZXR1cm4gJzwgMSBTZWNvbmQnIGlmICRTZWNvbmRzIDwgMTsKCiAgICBpZiAoICRTZWNvbmRzID49IDI0ICogNjAgKiA2MCApIHsKICAgICAgICByZXR1cm4gc3ByaW50ZiAnJS4xZiBEYXkocyknLCAkU2Vjb25kcyAvICggMjQgKiA2MCAqIDYwICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWNvbmRzID49IDYwICogNjAgKSB7CiAgICAgICAgcmV0dXJuIHNwcmludGYgJyUuMWYgSG91cihzKScsICRTZWNvbmRzIC8gKCA2MCAqIDYwICk7CiAgICB9CiAgICBlbHNpZiAoICRTZWNvbmRzID49IDYwICkgewogICAgICAgIHJldHVybiBzcHJpbnRmICclLjFmIE1pbnV0ZShzKScsICRTZWNvbmRzIC8gKDYwKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiBzcHJpbnRmICclLjFmIFNlY29uZChzKScsICRTZWNvbmRzOwogICAgfQp9Cgo9aGVhZDIgX0dldElkZW50aWZpZXIoKQoKY2FsY3VsYXRlIGEgdGFzayBpZGVudGlmaWVyLgoKICAgIG15ICRJZGVudGlmaWVyID0gJFNjaGVkdWxlckRCT2JqZWN0LT5fR2V0SWRlbnRpZmllcigpOwoKcmV0dXJucwoKICAgICRJZGVudGlmaWVyID0gMTIzNDQ1Njc4OTsKCj1jdXQKCnN1YiBfR2V0SWRlbnRpZmllciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICggJFNlY29uZHMsICRNaWNyb3NlY29uZHMgKSA9IFRpbWU6OkhpUmVzOjpnZXR0aW1lb2ZkYXkoKTsKICAgIG15ICRQcm9jZXNzSUQgPSAkJDsKCiAgICBteSAkSWRlbnRpZmllciA9ICRQcm9jZXNzSUQgLiAkTWljcm9zZWNvbmRzOwoKICAgIG15ICRSYW5kb21TdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggICAgID0+IDE4IC0gbGVuZ3RoICRJZGVudGlmaWVyLAogICAgICAgIERpY3Rpb25hcnkgPT4gWyAwIC4uIDkgXSwgICAgICAgICAgICAgICAgIyBudW1lcmljCiAgICApOwoKICAgICRJZGVudGlmaWVyIC49ICRSYW5kb21TdHJpbmc7CgogICAgcmV0dXJuICRJZGVudGlmaWVyOwp9CgoxOwo=</File>
        <File Location="Kernel/Config/Files/XML/AppointmentToTicket.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90b2JvX2NvbmZpZyB2ZXJzaW9uPSIyLjAiIGluaXQ9IkFwcGxpY2F0aW9uIj4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjRHluYW1pY0ZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkR5bmFtaWMgZmllbGRzIHNob3duIGluIHRoZSBhcHBvaW50bWVudCBlZGl0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpBZ2VudEFwcG9pbnRtZW50RWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPERlZmF1bHRJdGVtIFZhbHVlVHlwZT0iU2VsZWN0Ij4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjAiIFRyYW5zbGF0YWJsZT0iMSI+MCAtIERpc2FibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iT3B0aW9uIiBWYWx1ZT0iMSIgVHJhbnNsYXRhYmxlPSIxIj4xIC0gRW5hYmxlZDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9Ik9wdGlvbiIgVmFsdWU9IjIiIFRyYW5zbGF0YWJsZT0iMSI+MiAtIEVuYWJsZWQgYW5kIHJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICAgICAgPC9EZWZhdWx0SXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI1ByaW9yaXR5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OkFnZW50QXBwb2ludG1lbnRFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iUHJpb3JpdHkiIFZhbHVlUmVnZXg9IiI+MyBub3JtYWw8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjU2VydmljZU1hbmRhdG9yeSIgVXNlclByZWZlcmVuY2VzR3JvdXA9IkFkdmFuY2VkIiBVc2VyTW9kaWZpY2F0aW9uUG9zc2libGU9IjEiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyBpZiBzZXJ2aWNlIG11c3QgYmUgc2VsZWN0ZWQgYnkgdGhlIGFnZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpBZ2VudEFwcG9pbnRtZW50RWRpdDwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iQ2hlY2tib3giPjA8L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50QXBwb2ludG1lbnRFZGl0IyMjU0xBTWFuZGF0b3J5IiBVc2VyUHJlZmVyZW5jZXNHcm91cD0iQWR2YW5jZWQiIFVzZXJNb2RpZmljYXRpb25Qb3NzaWJsZT0iMSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIGlmIFNMQSBtdXN0IGJlIHNlbGVjdGVkIGJ5IHRoZSBhZ2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6Vmlldzo6QWdlbnRBcHBvaW50bWVudEVkaXQ8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4wPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI1N0YXRlRGVmYXVsdCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QWdlbnQ6OlZpZXc6OkFnZW50QXBwb2ludG1lbnRFZGl0PC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEl0ZW0gVmFsdWVUeXBlPSJFbnRpdHkiIFZhbHVlRW50aXR5VHlwZT0iU3RhdGUiIFZhbHVlUmVnZXg9IiI+b3BlbjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQjIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGV0ZXJtaW5lcyB0aGUgbmV4dCBwb3NzaWJsZSB0aWNrZXQgc3RhdGVzLCBhZnRlciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgdGlja2V0IGZyb20gYSBjYWxlbmRhciBhcHBvaW50bWVudCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpWaWV3OjpUaWNrZXRDYWxlbmRhcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+b3BlbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIFRyYW5zbGF0YWJsZT0iMSI+cGVuZGluZyBhdXRvPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5wZW5kaW5nIHJlbWluZGVyPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gVHJhbnNsYXRhYmxlPSIxIj5jbG9zZWQ8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyMjIzAwOS1BcHBvaW50bWVudFRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXIgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uOjpMb2FkZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSmF2YVNjcmlwdCI+CiAgICAgICAgICAgICAgICAgICAgPEFycmF5PgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFKQVguanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuRGF0YS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZS5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICAgICAgICAgIDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJEeW5hbWljRmllbGRTY3JlZW5zIyMjQXBwb2ludG1lbnRUaWNrZXRzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoaXMgY29uZmlndXJhdGlvbiBkZWZpbmVzIGFsbCBwb3NzaWJsZSBzY3JlZW5zIHRvIGVuYWJsZSBvciBkaXNhYmxlIGR5bmFtaWMgZmllbGRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkR5bmFtaWNGaWVsZFNjcmVlbnM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQjIyNEeW5hbWljRmllbGQiPkFnZW50QXBwb2ludG1lbnRFZGl0PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkR5bmFtaWNGaWVsZFNjcmVlbnM6Ok9iamVjdFR5cGVzIyMjQXBwb2ludG1lbnRUaWNrZXRzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZSBhIGxpc3Qgb2YgZHluYW1pYyBmaWVsZCBvYmplY3QgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gYmUgYXNzaWduZWQgdG8gYWN0aW9ucyBvZiB0aGlzIHBhY2thZ2UgdmlhIHRoZSBkeW5hbWljIGZpZWxkIHNjcmVlbnMgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkJhc2U6OkR5bmFtaWNGaWVsZFNjcmVlbnM8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5BcnRpY2xlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VGlja2V0PC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnVGlja2V0LUVyc3RlbGx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJ0aWNsZSBpcyB2aXNpYmxlIGZvciBjdXN0b21lcid9ID0gJ0FydGlrZWwgaXN0IGbDvHIgS3VuZGVuIHNpY2h0YmFyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdGlja2V0IGNyZWF0aW9uJ30gPSAnS2VpbmUgVGlja2V0LUVyc3RlbGx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ0RpZSDDnGJlcnByw7xmdW5nIGRlcyBGZWxkZXMgZGVzdCBrb25udGUgbmljaHQgZHVyY2hnZWbDvGhydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICdEaWUgw5xiZXJwcsO8ZnVuZyBkZXMgRmVsZGVzIG5leHQgc3RhdGUga29ubnRlIG5pY2h0IGR1cmNoZ2Vmw7xocnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJ30gPSAnVmFsaWRpZXJ1bmcgaW0gQXXDn2VuZGllbnN0IGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBTTEEhJ30gPSAnRGllIFZhbGlkaWVydW5nIGRlcyBGZWxkZXMgU0xBIGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCB0eXBlISd9ID0gJ0RpZSDDnGJlcnByw7xmdW5nIGRlcyBGZWxkdHlwcyBrb25udGUgbmljaHQgZHVyY2hnZWbDvGhydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgcHJpb3JpdHkhJ30gPSAnRGllIMOcYmVycHLDvGZ1bmcgZGVzIEZlbGRlcyBQcmlvcml0w6R0IGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgYSBsaXN0IG9mIGR5bmFtaWMgZmllbGQgb2JqZWN0IHR5cGVzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlIGFzc2lnbmVkIHRvIGFjdGlvbnMgb2YgdGhpcyBwYWNrYWdlIHZpYSB0aGUgZHluYW1pYyBmaWVsZCBzY3JlZW5zIGludGVyZmFjZS4nfSA9CiAgICAgICAgJyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIHRoZSBuZXh0IHBvc3NpYmxlIHRpY2tldCBzdGF0ZXMsIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB0aWNrZXQgZnJvbSBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFcm1pdHRlbHQgZGllIG7DpGNoc3Rtw7ZnbGljaGVuIFRpY2tldHN0YXR1cywgbmFjaGRlbSBlaW4gbmV1ZXMgVGlja2V0IGF1cyBlaW5lbSBLYWxlbmRlcnRlcm1pbiBpbiBkZXIgQWdlbnRlbm9iZXJmbMOkY2hlIGVyc3RlbGx0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0R5bmFtaXNjaGUgRmVsZGVyLCBkaWUgaW4gZGVyIFRlcm1pbmJlYXJiZWl0dW5nc21hc2tlIGRlciBBZ2VudGVuc2Nobml0dHN0ZWxsZSBhbmdlemVpZ3Qgd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBmb3IgbmV3IHRpY2tldHMgaW4gdGhlIEFnZW50QXBwb2ludG1lbnRFZGl0IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0xlZ3QgZGVuIFN0YW5kYXJkbmFjaGZvbGdlc3RhdHVzIGbDvHIgbmV1ZSBUaWNrZXRzIGluIGRlciBTY2huaXR0c3RlbGxlIEFnZW50QXBwb2ludG1lbnRFZGl0IGZlc3QuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdMZWd0IGRpZSBTdGFuZGFyZHByaW9yaXTDpHQgZsO8ciBuZXVlIFRpY2tldHMgaW4gZGVyIFNjaG5pdHRzdGVsbGUgQWdlbnRBcHBvaW50bWVudEVkaXQgZmVzdC4nOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICcrJXMgbW9yZScsCiAgICAnQWxsIG9jY3VycmVuY2VzJywKICAgICdBbGwtZGF5JywKICAgICdBcHBvaW50bWVudCcsCiAgICAnQXByJywKICAgICdBcHJpbCcsCiAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLicsCiAgICAnQXVnJywKICAgICdBdWd1c3QnLAogICAgJ0Nsb3NlIHRoaXMgZGlhbG9nJywKICAgICdEYXknLAogICAgJ0RlYycsCiAgICAnRGVjZW1iZXInLAogICAgJ0R1cGxpY2F0ZWQgZW50cnknLAogICAgJ0ZlYicsCiAgICAnRmVicnVhcnknLAogICAgJ0ZpcnN0IHNlbGVjdCBhIGN1c3RvbWVyIHVzZXIsIHRoZW4gc2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnRnInLAogICAgJ0ZyaScsCiAgICAnRnJpZGF5JywKICAgICdJdCBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gdGhlIGZpZWxkLCBwbGVhc2UgdHJ5IGFnYWluLicsCiAgICAnSmFuJywKICAgICdKYW51YXJ5JywKICAgICdKdWwnLAogICAgJ0p1bHknLAogICAgJ0p1bXAnLAogICAgJ0p1bicsCiAgICAnSnVuZScsCiAgICAnSnVzdCB0aGlzIG9jY3VycmVuY2UnLAogICAgJ0xvYWRpbmcuLi4nLAogICAgJ01hcicsCiAgICAnTWFyY2gnLAogICAgJ01heScsCiAgICAnTWF5X2xvbmcnLAogICAgJ01vJywKICAgICdNb24nLAogICAgJ01vbmRheScsCiAgICAnTW9udGgnLAogICAgJ05hbWUnLAogICAgJ05leHQnLAogICAgJ05vdicsCiAgICAnTm92ZW1iZXInLAogICAgJ09jdCcsCiAgICAnT2N0b2JlcicsCiAgICAnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicsCiAgICAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnLAogICAgJ1ByZXZpb3VzJywKICAgICdSZXNvdXJjZXMnLAogICAgJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycsCiAgICAnU2EnLAogICAgJ1NhdCcsCiAgICAnU2F0dXJkYXknLAogICAgJ1NhdmUnLAogICAgJ1NlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nLAogICAgJ1NlcCcsCiAgICAnU2VwdGVtYmVyJywKICAgICdTZXR0aW5ncycsCiAgICAnU3UnLAogICAgJ1N1bicsCiAgICAnU3VuZGF5JywKICAgICdUaCcsCiAgICAnVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuJywKICAgICdUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50JywKICAgICdUaHUnLAogICAgJ1RodXJzZGF5JywKICAgICdUaW1lbGluZSBEYXknLAogICAgJ1RpbWVsaW5lIE1vbnRoJywKICAgICdUaW1lbGluZSBXZWVrJywKICAgICdUb2RheScsCiAgICAnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycsCiAgICAnVHUnLAogICAgJ1R1ZScsCiAgICAnVHVlc2RheScsCiAgICAnV2UnLAogICAgJ1dlZCcsCiAgICAnV2VkbmVzZGF5JywKICAgICdXZWVrJywKICAgICdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nLAogICAgJ21vcmUnLAogICAgJ25vbmUnLAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="Kernel/Language/hu_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Omh1X0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnSmVneWzDqXRyZWhvesOhcyc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydBcnRpY2xlIGlzIHZpc2libGUgZm9yIGN1c3RvbWVyJ30gPSAnQSBiZWplZ3l6w6lzIGzDoXRoYXTDsyBheiDDvGd5ZsOpbG5layc7CgogICAgIyBQZXJsIE1vZHVsZTogS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J05vIHRpY2tldCBjcmVhdGlvbid9ID0gJ05pbmNzIGplZ3lsw6l0cmVob3rDoXMnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgY8OpbCBtZXrFkW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICdOZW0gc2lrZXLDvGx0IHbDqWdyZWhhanRhbmkgYXogZWxsZW7FkXJ6w6lzdCBhIGvDtnZldGtlesWRIMOhbGxhcG90IG1lesWRbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBzZXJ2aWNlISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgc3pvbGfDoWx0YXTDoXMgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIFNMQSEnfSA9ICdOZW0gc2lrZXLDvGx0IHbDqWdyZWhhanRhbmkgYXogZWxsZW7FkXJ6w6lzdCBheiBTTEEgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJ30gPSAnTmVtIHNpa2Vyw7xsdCB2w6lncmVoYWp0YW5pIGF6IGVsbGVuxZFyesOpc3QgYSB0w61wdXMgbWV6xZFuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHByaW9yaXR5ISd9ID0gJ05lbSBzaWtlcsO8bHQgdsOpZ3JlaGFqdGFuaSBheiBlbGxlbsWRcnrDqXN0IGEgcHJpb3JpdMOhcyBtZXrFkW4hJzsKCiAgICAjIFN5c0NvbmZpZwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGVmaW5lIGEgbGlzdCBvZiBkeW5hbWljIGZpZWxkIG9iamVjdCB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZCB0byBiZSBhc3NpZ25lZCB0byBhY3Rpb25zIG9mIHRoaXMgcGFja2FnZSB2aWEgdGhlIGR5bmFtaWMgZmllbGQgc2NyZWVucyBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBem9uIGRpbmFtaWt1cyBtZXrFkSBvYmpla3R1bXTDrXB1c29rIGxpc3TDoWrDoW5hayBtZWdoYXTDoXJvesOhc2EsIGFtZWx5ZWsgaG96esOhcmVuZGVsaGV0xZFrIGEgY3NvbWFnIG3FsXZlbGV0ZWloZXogYSBkaW5hbWlrdXMgbWV6xZEga8OpcGVybnnFkWluZWsgZmVsw7xsZXTDqW4ga2VyZXN6dMO8bC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRGV0ZXJtaW5lcyB0aGUgbmV4dCBwb3NzaWJsZSB0aWNrZXQgc3RhdGVzLCBhZnRlciB0aGUgY3JlYXRpb24gb2YgYSBuZXcgdGlja2V0IGZyb20gYSBjYWxlbmRhciBhcHBvaW50bWVudCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTWVnaGF0w6Fyb3p6YSBhIGvDtnZldGtlesWRIGxlaGV0c8OpZ2VzIGplZ3nDoWxsYXBvdG9rYXQgZWd5IG5hcHTDoXJpZMWRcG9udGLDs2wgc3rDoXJtYXrDsyDDumogamVneSBsw6l0cmVob3rDoXNhIHV0w6FuIGF6IMO8Z3lpbnTDqXrFkWkgZmVsw7xsZXRlbi4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBeiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0IGlkxZFwb250IHN6ZXJrZXN6dMOpc2Uga8OpcGVybnnFkWrDqW4gbWVnamVsZW7DrXRldHQgZGluYW1pa3VzIG1lesWRay4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQmXDoWxsw610amEgYXogw7pqIGplZ3llayBhbGFww6lydGVsbWV6ZXR0IGvDtnZldGtlesWRIMOhbGxhcG90w6F0IGF6IGlkxZFwb250IHN6ZXJrZXN6dMOpc8OpbsOpbCBheiDDvGd5aW50w6l6xZFpIGZlbMO8bGV0ZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdCZcOhbGzDrXRqYSBheiDDumogamVneWVrIGFsYXDDqXJ0ZWxtZXpldHQgcHJpb3JpdMOhc8OhdCBheiBpZMWRcG9udCBzemVya2VzenTDqXPDqW7DqWwgYXogw7xneWludMOpesWRaSBmZWzDvGxldGVuLic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJyslcyBtb3JlJywKICAgICdBbGwgb2NjdXJyZW5jZXMnLAogICAgJ0FsbC1kYXknLAogICAgJ0FwcG9pbnRtZW50JywKICAgICdBcHInLAogICAgJ0FwcmlsJywKICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJywKICAgICdBdWcnLAogICAgJ0F1Z3VzdCcsCiAgICAnQ2xvc2UgdGhpcyBkaWFsb2cnLAogICAgJ0RheScsCiAgICAnRGVjJywKICAgICdEZWNlbWJlcicsCiAgICAnRHVwbGljYXRlZCBlbnRyeScsCiAgICAnRmViJywKICAgICdGZWJydWFyeScsCiAgICAnRmlyc3Qgc2VsZWN0IGEgY3VzdG9tZXIgdXNlciwgdGhlbiBzZWxlY3QgYSBjdXN0b21lciBJRCB0byBhc3NpZ24gdG8gdGhpcyB0aWNrZXQuJywKICAgICdGcicsCiAgICAnRnJpJywKICAgICdGcmlkYXknLAogICAgJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJywKICAgICdKYW4nLAogICAgJ0phbnVhcnknLAogICAgJ0p1bCcsCiAgICAnSnVseScsCiAgICAnSnVtcCcsCiAgICAnSnVuJywKICAgICdKdW5lJywKICAgICdKdXN0IHRoaXMgb2NjdXJyZW5jZScsCiAgICAnTG9hZGluZy4uLicsCiAgICAnTWFyJywKICAgICdNYXJjaCcsCiAgICAnTWF5JywKICAgICdNYXlfbG9uZycsCiAgICAnTW8nLAogICAgJ01vbicsCiAgICAnTW9uZGF5JywKICAgICdNb250aCcsCiAgICAnTmFtZScsCiAgICAnTmV4dCcsCiAgICAnTm92JywKICAgICdOb3ZlbWJlcicsCiAgICAnT2N0JywKICAgICdPY3RvYmVyJywKICAgICdQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJywKICAgICdQcmVzcyBDdHJsK0MgKENtZCtDKSB0byBjb3B5IHRvIGNsaXBib2FyZCcsCiAgICAnUHJldmlvdXMnLAogICAgJ1Jlc291cmNlcycsCiAgICAnUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzJywKICAgICdTYScsCiAgICAnU2F0JywKICAgICdTYXR1cmRheScsCiAgICAnU2F2ZScsCiAgICAnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnU2VwJywKICAgICdTZXB0ZW1iZXInLAogICAgJ1NldHRpbmdzJywKICAgICdTdScsCiAgICAnU3VuJywKICAgICdTdW5kYXknLAogICAgJ1RoJywKICAgICdUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4nLAogICAgJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnLAogICAgJ1RodScsCiAgICAnVGh1cnNkYXknLAogICAgJ1RpbWVsaW5lIERheScsCiAgICAnVGltZWxpbmUgTW9udGgnLAogICAgJ1RpbWVsaW5lIFdlZWsnLAogICAgJ1RvZGF5JywKICAgICdUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJywKICAgICdUdScsCiAgICAnVHVlJywKICAgICdUdWVzZGF5JywKICAgICdXZScsCiAgICAnV2VkJywKICAgICdXZWRuZXNkYXknLAogICAgJ1dlZWsnLAogICAgJ1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPycsCiAgICAnbW9yZScsCiAgICAnbm9uZScsCiAgICApOwoKfQoKMTsK</File>
        <File Location="Kernel/Language/ja_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmphX0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAn44OB44Kx44OD44OI44Gu5L2c5oiQJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0FydGljbGUgaXMgdmlzaWJsZSBmb3IgY3VzdG9tZXInfSA9ICfoqJjkuovjgpLpoaflrqLjgavlhazplosnOwoKICAgICMgUGVybCBNb2R1bGU6IEtlcm5lbC9Nb2R1bGVzL0FnZW50QXBwb2ludG1lbnRFZGl0LnBtCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydObyB0aWNrZXQgY3JlYXRpb24nfSA9ICfjg4HjgrHjg4Pjg4jjgpLkvZzmiJDjgZfjgarjgYQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ2Rlc3Qg44OV44Kj44O844Or44OJ44Gu5qSc6Ki844KS5a6f6KGM44Gn44GN44G+44Gb44KT44Gn44GX44Gf77yBJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICduZXh0IHN0YXRlIOODleOCo+ODvOODq+ODieOBruaknOiovOOCkuWun+ihjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJ30gPSAnc2VydmljZSDjg5XjgqPjg7zjg6vjg4njga7mpJzoqLzjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/vvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBTTEEhJ30gPSAnU0xBIOODleOCo+ODvOODq+ODieOBruaknOiovOOCkuWun+ihjOOBp+OBjeOBvuOBm+OCk+OBp+OBl+OBn++8gSc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHR5cGUhJ30gPSAndHlwZSDjg5XjgqPjg7zjg6vjg4njga7mpJzoqLzjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/vvIEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBwcmlvcml0eSEnfSA9ICdwcmlvcml0eSDjg5XjgqPjg7zjg6vjg4njga7mpJzoqLzjgpLlrp/ooYzjgafjgY3jgb7jgZvjgpPjgafjgZfjgZ/vvIEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmUgYSBsaXN0IG9mIGR5bmFtaWMgZmllbGQgb2JqZWN0IHR5cGVzIHdoaWNoIGFyZSBhbGxvd2VkIHRvIGJlIGFzc2lnbmVkIHRvIGFjdGlvbnMgb2YgdGhpcyBwYWNrYWdlIHZpYSB0aGUgZHluYW1pYyBmaWVsZCBzY3JlZW5zIGludGVyZmFjZS4nfSA9CiAgICAgICAgJ+ODgOOCpOODiuODn+ODg+OCr+ODleOCo+ODvOODq+ODieeUu+mdouOCpOODs+OCv+ODleOCp+ODvOOCueOCkuS7i+OBl+OBpuOAgeOBk+OBruODkeODg+OCseODvOOCuOOBruOCouOCr+OCt+ODp+ODs+OBq+WJsuOCiuW9k+OBpuOCi+OBk+OBqOOBjOOBp+OBjeOCi+ODgOOCpOODiuODn+ODg+OCr+ODleOCo+ODvOODq+ODieOBruOCquODluOCuOOCp+OCr+ODiOOCv+OCpOODl+OBruS4gOimp+OCkuWumue+qeOBl+OBvuOBmeOAgic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIHRoZSBuZXh0IHBvc3NpYmxlIHRpY2tldCBzdGF0ZXMsIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB0aWNrZXQgZnJvbSBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgafjgIHjgqvjg6zjg7Pjg4Djg7zjga7kuojntITjgYvjgonmlrDopo/jg4HjgrHjg4Pjg4jjgpLkvZzmiJDjgZfjgZ/lvozjgavpgbjmip7lj6/og73jgarjg4HjgrHjg4Pjg4jjgrnjg4bjg7zjgr/jgrnjgpLmsbrlrprjgZfjgb7jgZnjgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnRHluYW1pYyBmaWVsZHMgc2hvd24gaW4gdGhlIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICfmi4XlvZPogIXjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjga7kuojntITnt6jpm4bnlLvpnaLjgavooajnpLrjgZnjgovjg4DjgqTjg4rjg5/jg4Pjgq/jg5XjgqPjg7zjg6vjg4njgIInOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnQWdlbnRBcHBvaW50bWVudEVkaXQg44Kk44Oz44K/44OV44Kn44O844K544Gn44CB5paw6KaP44OB44Kx44OD44OI44Gu44OH44OV44Kp44Or44OI44Gu5qyh44Gu44K544OG44O844K/44K544KS6Kit5a6a44GX44G+44GZ44CCJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J1NldHMgdGhlIGRlZmF1bHQgcHJpb3JpdHkgZm9yIG5ldyB0aWNrZXRzIGluIHRoZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdBZ2VudEFwcG9pbnRtZW50RWRpdCDjgqTjg7Pjgr/jg5Xjgqfjg7zjgrnjgafjgIHmlrDopo/jg4HjgrHjg4Pjg4jjga7jg4fjg5Xjgqnjg6vjg4jjga7lhKrlhYjluqbjgpLoqK3lrprjgZfjgb7jgZnjgIInOwoKCiAgICBwdXNoIEB7ICRTZWxmLT57SmF2YVNjcmlwdFN0cmluZ3N9IC8vIFtdIH0sICgKICAgICcrJXMgbW9yZScsCiAgICAnQWxsIG9jY3VycmVuY2VzJywKICAgICdBbGwtZGF5JywKICAgICdBcHBvaW50bWVudCcsCiAgICAnQXByJywKICAgICdBcHJpbCcsCiAgICAnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGFwcG9pbnRtZW50PyBUaGlzIG9wZXJhdGlvbiBjYW5ub3QgYmUgdW5kb25lLicsCiAgICAnQXVnJywKICAgICdBdWd1c3QnLAogICAgJ0Nsb3NlIHRoaXMgZGlhbG9nJywKICAgICdEYXknLAogICAgJ0RlYycsCiAgICAnRGVjZW1iZXInLAogICAgJ0R1cGxpY2F0ZWQgZW50cnknLAogICAgJ0ZlYicsCiAgICAnRmVicnVhcnknLAogICAgJ0ZpcnN0IHNlbGVjdCBhIGN1c3RvbWVyIHVzZXIsIHRoZW4gc2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnRnInLAogICAgJ0ZyaScsCiAgICAnRnJpZGF5JywKICAgICdJdCBpcyBnb2luZyB0byBiZSBkZWxldGVkIGZyb20gdGhlIGZpZWxkLCBwbGVhc2UgdHJ5IGFnYWluLicsCiAgICAnSmFuJywKICAgICdKYW51YXJ5JywKICAgICdKdWwnLAogICAgJ0p1bHknLAogICAgJ0p1bXAnLAogICAgJ0p1bicsCiAgICAnSnVuZScsCiAgICAnSnVzdCB0aGlzIG9jY3VycmVuY2UnLAogICAgJ0xvYWRpbmcuLi4nLAogICAgJ01hcicsCiAgICAnTWFyY2gnLAogICAgJ01heScsCiAgICAnTWF5X2xvbmcnLAogICAgJ01vJywKICAgICdNb24nLAogICAgJ01vbmRheScsCiAgICAnTW9udGgnLAogICAgJ05hbWUnLAogICAgJ05leHQnLAogICAgJ05vdicsCiAgICAnTm92ZW1iZXInLAogICAgJ09jdCcsCiAgICAnT2N0b2JlcicsCiAgICAnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicsCiAgICAnUHJlc3MgQ3RybCtDIChDbWQrQykgdG8gY29weSB0byBjbGlwYm9hcmQnLAogICAgJ1ByZXZpb3VzJywKICAgICdSZXNvdXJjZXMnLAogICAgJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycsCiAgICAnU2EnLAogICAgJ1NhdCcsCiAgICAnU2F0dXJkYXknLAogICAgJ1NhdmUnLAogICAgJ1NlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nLAogICAgJ1NlcCcsCiAgICAnU2VwdGVtYmVyJywKICAgICdTZXR0aW5ncycsCiAgICAnU3UnLAogICAgJ1N1bicsCiAgICAnU3VuZGF5JywKICAgICdUaCcsCiAgICAnVGhpcyBhZGRyZXNzIGFscmVhZHkgZXhpc3RzIG9uIHRoZSBhZGRyZXNzIGxpc3QuJywKICAgICdUaGlzIGlzIGEgcmVwZWF0aW5nIGFwcG9pbnRtZW50JywKICAgICdUaHUnLAogICAgJ1RodXJzZGF5JywKICAgICdUaW1lbGluZSBEYXknLAogICAgJ1RpbWVsaW5lIE1vbnRoJywKICAgICdUaW1lbGluZSBXZWVrJywKICAgICdUb2RheScsCiAgICAnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycsCiAgICAnVHUnLAogICAgJ1R1ZScsCiAgICAnVHVlc2RheScsCiAgICAnV2UnLAogICAgJ1dlZCcsCiAgICAnV2VkbmVzZGF5JywKICAgICdXZWVrJywKICAgICdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nLAogICAgJ21vcmUnLAogICAgJ25vbmUnLAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="Kernel/System/Daemon/DaemonModules/SchedulerTaskWorker/AppointmentTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCAgICAgICAgICAgICAgICAgICAgICAgIHF3KEtlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OkJhc2VUYXNrV29ya2VyKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpEYWVtb25Nb2R1bGVzOjpTY2hlZHVsZXJUYXNrV29ya2VyOjpBcHBvaW50bWVudFRpY2tldCAtIFNjaGVkdWxlciBkYWVtb24gdGFzayBoYW5kbGVyIG1vZHVsZSBmb3IgQXBwb2ludG1lbnRUaWNrZXQKCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyB0YXNrIGhhbmRsZXIgZXhlY3V0ZXMgYXBwb2ludG1lbnQgdGlja2V0IGpvYnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkVGFza0hhbmRsZXJPYmplY3QgPSAkS2VybmVsOjpPTS1HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSAgICAgID0gJFBhcmFte0RlYnVnfTsKICAgICRTZWxmLT57V29ya2VyTmFtZX0gPSAnV29ya2VyOiBBcHBvaW50bWVudFRpY2tldCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgUnVuKCkKCnBlcmZvcm1zIHRoZSBzZWxlY3RlZCB0YXNrLgoKICAgIG15ICRSZXN1bHQgPSAkVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgICAgICBUYXNrSUQgICA9PiAxMjMsCiAgICAgICAgVGFza05hbWUgPT4gJ3NvbWUgbmFtZScsICAgICMgb3B0aW9uYWwKICAgICAgICBEYXRhICAgICA9PiB7ICAgICAgICAgICAgICAgIyBhcHBvaW50bWVudCBpZCBhcyBnb3QgZnJvbSBLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50OjpBcHBvaW50bWVudEdldCgpCiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLAogICAgICAgIH0sCiAgICApOwoKUmV0dXJuczoKCiAgICAkUmVzdWx0ID0gMTsgIyBvciBmYWlsIGluIGNhc2Ugb2YgYW4gZXJyb3IKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHRhc2sgcGFyYW1zCiAgICBteSAkQ2hlY2tSZXN1bHQgPSAkU2VsZi0+X0NoZWNrVGFza1BhcmFtcygKICAgICAgICAlUGFyYW0sCiAgICAgICAgTmVlZGVkRGF0YUF0dHJpYnV0ZXMgPT4KICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgJ0FwcG9pbnRtZW50VGlja2V0JywgJ0FwcG9pbnRtZW50SUQnCiAgICAgICAgICAgIF0sCiAgICApOwoKICAgICMgc3RvcCBleGVjdXRpb24gaWYgYW4gZXJyb3IgaW4gcGFyYW1zIGlzIGRldGVjdGVkCiAgICByZXR1cm4gaWYgISRDaGVja1Jlc3VsdDsKCiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRBcHBvaW50bWVudEVkaXQnKTsKCiAgICBpZiAoICRTZWxmLT57RGVidWd9ICkgewogICAgICAgIHByaW50ICIgICAgJFNlbGYtPntXb3JrZXJOYW1lfSBleGVjdXRlcyB0YXNrOiAkUGFyYW17VGFza05hbWV9XG4iOwogICAgfQoKICAgICMgZmV0Y2hpbmcgY3VzdG9tZXIgdXNlciBmcm9tIHNlbGVjdGVkY3VzdG9tZXJ1c2VyCiAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgKTsKCiAgICAjIGNyZWF0ZSB0aGUgYXBwb2ludG1lbnQgdGlja2V0CiAgICBteSAkVGlja2V0SUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldENyZWF0ZSgKICAgICAgICAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPiUqLAogICAgICAgIEN1c3RvbWVyVXNlciA9PiAlQ3VzdG9tZXJVc2VyID8gJEN1c3RvbWVyVXNlcntVc2VyTG9naW59IDogJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U2VsZWN0ZWRDdXN0b21lclVzZXJ9LAogICAgKTsKCiAgICBpZiAoICEkVGlja2V0SUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgdHJpZ2dlciB0aWNrZXQgYXBwb2ludG1lbnQgZm9yIEFwcG9pbnRtZW50SUQgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQKICAgIG15IEBEeW5hbWljRmllbGRDb25maWdzOwogICAgbXkgJUR5bmFtaWNGaWVsZHM7CiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9ICkgewoKICAgICAgICAjIEZldGNoIGR5bmFtaWMgZmllbGQgY29uZmlncwogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3NSZWYgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgT2JqZWN0VHlwZSAgPT4gWyAnVGlja2V0JywgJ0FydGljbGUnIF0sCiAgICAgICAgICAgICAgICBGaWVsZEZpbHRlciA9PiAkQ29uZmlnLT57RHluYW1pY0ZpZWxkfSB8fCB7fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgQER5bmFtaWNGaWVsZENvbmZpZ3MgPSBkZWZpbmVkICREeW5hbWljRmllbGRDb25maWdzUmVmID8gQHskRHluYW1pY0ZpZWxkQ29uZmlnc1JlZn0gOiAoKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICVEeW5hbWljRmllbGRzID0gJXsgJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30gfTsKICAgICAgICBEWU5BTUlDRklFTERUSUNLRVQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKEBEeW5hbWljRmllbGRDb25maWdzKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEVElDS0VUIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTERUSUNLRVQgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdUaWNrZXQnOwogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgdmFsdWUKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0R5bmFtaWNGaWVsZHN9LT57ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmluZyBmcm9tIGRhdGEKICAgIG15ICRBcnRpY2xlRnJvbTsKICAgIG15IEBDdXN0b21lclVzZXJzID0gc3BsaXQgLywvLCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDdXN0b21lclVzZXJ9OwogICAgZm9yIG15ICRDdXN0b21lclVzZXIgKEBDdXN0b21lclVzZXJzKSB7CiAgICAgICAgbXkgJUN1c3RvbWVyVXNlckRhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICApOwogICAgICAgIG15ICRDdXN0b21lclVzZXJTdHJpbmcKICAgICAgICAgICAgPSAlQ3VzdG9tZXJVc2VyRGF0YSA/ICJcIiRDdXN0b21lclVzZXJEYXRhe1VzZXJGaXJzdG5hbWV9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJMYXN0bmFtZX1cIiA8JEN1c3RvbWVyVXNlckRhdGF7VXNlckVtYWlsfT4iIDogJEN1c3RvbWVyVXNlcjsKICAgICAgICBpZiAoJEFydGljbGVGcm9tKSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJvbSAuPSAiLCAkQ3VzdG9tZXJVc2VyU3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRBcnRpY2xlRnJvbSA9ICIkQ3VzdG9tZXJVc2VyU3RyaW5nIjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEFydGljbGVPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScpOwogICAgbXkgJEFydGljbGVCYWNrZW5kT2JqZWN0ID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JDaGFubmVsKCBDaGFubmVsTmFtZSA9PiAnSW50ZXJuYWwnICk7CiAgICBteSAkQXJ0aWNsZUlEICAgICAgICAgICAgPSAkQXJ0aWNsZUJhY2tlbmRPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgIFNlbmRlclR5cGUgICAgICAgICAgID0+ICdzeXN0ZW0nLAogICAgICAgIElzVmlzaWJsZUZvckN1c3RvbWVyID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0FydGljbGVWaXNpYmxlRm9yQ3VzdG9tZXJ9IHx8IDAsCiAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgPT4gJEFydGljbGVGcm9tLAogICAgICAgIFRvICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICAgICAgU3ViamVjdCAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57U3ViamVjdH0sCiAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntDb250ZW50fSApLAogICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgID0+ICd0ZXh0L2h0bWwnLAogICAgICAgIENoYXJzZXQgICAgICAgICAgICAgID0+ICd1dGYtOCcsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICBIaXN0b3J5VHlwZSAgICAgICAgICA9PiAnTWlzYycsCiAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgPT4gJ0F1dG9tYXRpY2FsbHkgY3JlYXRlZCB0aWNrZXQgZnJvbSBhcHBvaW50bWVudCcsCiAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSAgICAgPT4gKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0F1dG9SZXNwb25zZUZvcldlYlRpY2tldHMnKSApCiAgICAgICAgPyAnYXV0byByZXBseScKICAgICAgICA6ICcnLAogICAgICAgIE9yaWdIZWFkZXIgPT4gewogICAgICAgICAgICBGcm9tICAgID0+ICRBcnRpY2xlRnJvbSwKICAgICAgICAgICAgVG8gICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgICAgICBTdWJqZWN0ID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0NvbnRlbnR9LAogICAgICAgIH0sCiAgICAgICAgUXVldWUgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57UXVldWVJRH0sCiAgICApOwoKICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgY3JlYXRlIGFydGljbGUgZm9yIHRpY2tldCAkVGlja2V0SUQgZnJvbSBhcHBvaW50bWVudCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudElEfSEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgYXJ0aWNsZSBkeW5hbWljIGZpZWxkcwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBEWU5BTUlDRklFTERBUlRJQ0xFOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnIChARHluYW1pY0ZpZWxkQ29uZmlncykgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMREFSVElDTEUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMREFSVElDTEUgaWYgJER5bmFtaWNGaWVsZENvbmZpZy0+e09iamVjdFR5cGV9IG5lICdBcnRpY2xlJzsKICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57RHluYW1pY0ZpZWxkc30tPnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZXRUaWNrZXR9LT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJUFwcG9pbnRtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIGxpbmsgdGhlIHRpY2tldHMKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtBZGQoCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICdBcHBvaW50bWVudCcsCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRUaWNrZXRJRCwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05vcm1hbCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGZ1dHVyZSB0YXNrIGlkIGZyb20gYXBwb2ludG1lbnQKICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICAgICAlQXBwb2ludG1lbnQsCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1VzZXJJRH0sCiAgICAgICAgRnV0dXJlVGFza0lEID0+IHVuZGVmLAogICAgKTsKCiAgICAjIENoZWNrIGlmIGFwcG9pbnRtZW50IGlzIHJlY3VycmluZyBhbmQgaWYgc28sIGNyZWF0ZSBuZXh0IGZ1dHVyZSB0YXNrIGZvciBhcHBvaW50bWVudCB3aGljaCBpcyBpbiB0aGUgZnV0dXJlIGFuZCBjbG9zZXN0IHRvIG5vdwogICAgaWYgKCAkQXBwb2ludG1lbnR7UmVjdXJyaW5nfSB8fCAkQXBwb2ludG1lbnR7UGFyZW50SUR9ICkgewoKICAgICAgICAjIEdldCBhbGwgcmVsYXRlZCBhcHBvaW50bWVudHMKICAgICAgICBteSBAQXBwb2ludG1lbnRzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudExpc3QoCiAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgICAgICBQYXJlbnRJRCAgID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0gfHwgJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9LAogICAgICAgICk7CgogICAgICAgICMgUHVzaCBwYXJlbnQgaW50byBsaXN0IHNpbmNlIEFwcG9pbnRtZW50TGlzdCB3aXRoIGZpbHRlciBQYXJlbnRJRCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBwYXJlbnQgaXRzZWxmCiAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudEdldCgKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAoICRBcHBvaW50bWVudHtQYXJlbnRJRH0gPyAkQXBwb2ludG1lbnR7UGFyZW50SUR9IDogJEFwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ICkKICAgICAgICApOwogICAgICAgIHB1c2ggQEFwcG9pbnRtZW50cywgXCVQYXJlbnRBcHBvaW50bWVudDsKCiAgICAgICAgbXkgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKICAgICAgICApOwoKICAgICAgICBteSAkTmV4dEFwcG9pbnRtZW50OwogICAgICAgIG15ICRUaW1lRGlmZjsKICAgICAgICBteSAkRXhlY3V0aW9uVGltZTsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50UmVmIChAQXBwb2ludG1lbnRzKSB7CgogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpLT5BcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUaW1lICAgICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e1RpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJFBhcmFte0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRBcHBvaW50bWVudFJlZi0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkQXBwb2ludG1lbnRSZWYtPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudFRpbWVPYmplY3QgKSA+IDAgKSB7CiAgICAgICAgICAgICAgICBteSAkRGVsdGFSZXN1bHQgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5EZWx0YSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnRUaW1lT2JqZWN0ICk7CiAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRUaW1lRGlmZiApIHsKICAgICAgICAgICAgICAgICAgICAkTmV4dEFwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50UmVmOwogICAgICAgICAgICAgICAgICAgICRUaW1lRGlmZiAgICAgICAgPSAkRGVsdGFSZXN1bHQtPntBYnNvbHV0ZVNlY29uZHN9OwogICAgICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgPSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkRGVsdGFSZXN1bHQtPntBYnNvbHV0ZVNlY29uZHN9IDwgJFRpbWVEaWZmICkgewogICAgICAgICAgICAgICAgICAgICROZXh0QXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRSZWY7CiAgICAgICAgICAgICAgICAgICAgJFRpbWVEaWZmICAgICAgICA9ICREZWx0YVJlc3VsdC0+e0Fic29sdXRlU2Vjb25kc307CiAgICAgICAgICAgICAgICAgICAgJEV4ZWN1dGlvblRpbWUgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmV4dEFwcG9pbnRtZW50KSB7CgogICAgICAgICAgICAjIHVwZGF0ZSBhcHBvaW50bWVudCBpbiBkYgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXI6OkFwcG9pbnRtZW50JyktPkFwcG9pbnRtZW50VXBkYXRlKAogICAgICAgICAgICAgICAgJE5leHRBcHBvaW50bWVudC0+JSosCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICA9PiAkUGFyYW17RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuICRUaWNrZXRJRDsKfQoKMTsK</File>
        <File Location="scripts/test/AppointmentToTicket/AppointmentToTicket.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJEcml2ZXI7CgpvdXIgJFNlbGY7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgRG8gbm90IGNoZWNrIGVtYWlscy4KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgR2V0IG5lY2Vzc2FyeSBvYmplY3RzLgpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkQXJ0aWNsZU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7Cm15ICRMaW5rT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Jyk7Cm15ICRTY2hlZHVsZXJEQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyk7Cm15ICRUYXNrSGFuZGxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OkRhZW1vbk1vZHVsZXM6OlNjaGVkdWxlclRhc2tXb3JrZXI6OkFwcG9pbnRtZW50VGlja2V0Jyk7Cm15ICRUaWNrZXRPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKJFNlbGYtPklzKAogICAgcmVmICRTY2hlZHVsZXJEQk9iamVjdCwKICAgICdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicsCiAgICAiS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREItPm5ldygpIiwKKTsKCiMgQ3JlYXRlIGNhbGVuZGFyCm15ICRDYWxlbmRhck5hbWUgPSAnVGVzdF8nIC4gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKbXkgJUNhbGVuZGFyICAgICA9ICRDYWxlbmRhck9iamVjdC0+Q2FsZW5kYXJDcmVhdGUoCiAgICBDYWxlbmRhck5hbWUgPT4gJENhbGVuZGFyTmFtZSwKICAgIEdyb3VwSUQgICAgICA9PiAxLAogICAgQ29sb3IgICAgICAgID0+ICcjRkY3NzAwJywKICAgIFVzZXJJRCAgICAgICA9PiAxLAopOwoKbXkgJFN0YXJ0VGltZU9iaiA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwopOwokU3RhcnRUaW1lT2JqLT5BZGQoCiAgICBEYXlzID0+IDEsCik7Cm15ICRFbmRUaW1lT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCik7CiRFbmRUaW1lT2JqLT5BZGQoCiAgICBEYXlzICA9PiAxLAogICAgSG91cnMgPT4gMSwKKTsKCiMgQ3JlYXRlIFRlc3QgQ3VzdG9tZXIgVXNlcgpteSAkVGVzdEN1c3RvbWVyVXNlckxvZ2luID0gJEhlbHBlck9iamVjdC0+VGVzdEN1c3RvbWVyVXNlckNyZWF0ZSgpOwoKIyBDcmVhdGUgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmVUYXNrCm15ICRSYW5kb21JRCAgICAgICAgICA9ICRIZWxwZXJPYmplY3QtPkdldFJhbmRvbUlEKCk7Cm15ICVBcHBvaW50bWVudFRpY2tldCA9ICgKICAgIFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdTdGFydCcsCiAgICBDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICIiLAogICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgIEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJ21pbnV0ZXMnLAogICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLAogICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFF1ZXVlSUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEN1c3RvbWVySUQgICAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIE93bmVySUQgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIExvY2sgICAgICAgICAgICAgICAgICAgICAgPT4gJ3VubG9jaycsCiAgICBQcmlvcml0eUlEICAgICAgICAgICAgICAgID0+IDMsCiAgICBTdGF0ZUlEICAgICAgICAgICAgICAgICAgID0+IDQsCiAgICBTZXJ2aWNlSUQgICAgICAgICAgICAgICAgID0+IHVuZGVmLAogICAgU0xBSUQgICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFR5cGVJRCAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIFN1YmplY3QgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlELAogICAgQ29udGVudCAgICAgICAgICAgICAgICAgICA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICBEeW5hbWljRmllbGRzICAgICAgICAgICAgID0+IHVuZGVmLAogICAgQXJ0aWNsZVZpc2libGVGb3JDdXN0b21lciA9PiB1bmRlZiwKKTsKbXkgJFNpbmdsZUFwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlELAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldCwKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldHtDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXR7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CgpteSAlU2luZ2xlQXBwb2ludG1lbnQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgQXBwb2ludG1lbnRJRCA9PiAkU2luZ2xlQXBwb2ludG1lbnRJRCwKKTsKCm15ICVGdXR1cmVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRTaW5nbGVBcHBvaW50bWVudHtGdXR1cmVUYXNrSUR9LAopOwoKIyBUcmlnZ2VyIEZ1dHVyZSBUYXNrIEV4ZWN1dGlvbgokVGFza0hhbmRsZXJPYmplY3QtPlJ1bigKICAgIFRhc2tJRCAgID0+ICRGdXR1cmVUYXNre1Rhc2tJRH0sCiAgICBUYXNrTmFtZSA9PiAkRnV0dXJlVGFza3tOYW1lfSwKICAgIERhdGEgICAgID0+ICRGdXR1cmVUYXNre0RhdGF9LAopOwoKIyBDaGVjayBpZiB0aWNrZXQgd2FzIGNyZWF0ZWQgLT4gdmlhIGxpbmsgb2JqZWN0Cm15ICRMaW5rTGlzdCA9ICRMaW5rT2JqZWN0LT5MaW5rTGlzdCgKICAgIE9iamVjdCA9PiAnQXBwb2ludG1lbnQnLAogICAgS2V5ICAgID0+ICRTaW5nbGVBcHBvaW50bWVudElELAogICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICBVc2VySUQgPT4gMSwKKTsKCiRTZWxmLT5JcygKICAgIHNjYWxhciBrZXlzICV7JExpbmtMaXN0fSwKICAgIDEsCiAgICAiVGhlIG51bWJlciBvZiBjcmVhdGVkIGxpbmtzIGZvciB0aGUgYXBwb2ludG1lbnQgaXMgbm90IGNvcnJlY3QiLAopOwoKIyBGZXRjaCBUaWNrZXQKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICgga2V5cyAkTGlua0xpc3QtPntUaWNrZXR9LT57Tm9ybWFsfS0+e1NvdXJjZX0tPiUqIClbMF0sCiAgICBVc2VySUQgICA9PiAxLAopOwoKJFNlbGYtPklzTm90KAogICAgc2NhbGFyIGtleXMgJVRpY2tldCwKICAgIDAsCiAgICAiVGlja2V0IHdhcyBub3QgY3JlYXRlZCIsCik7CgojIEZldGNoIEFydGljbGUKbXkgQEFydGljbGVMaXN0ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFydGljbGVMaXN0LAogICAgMSwKICAgICJUaGUgbnVtYmVyIG9mIGNyZWF0ZWQgYXJ0aWNsZXMgZm9yIHRoZSB0aWNrZXQgaXMgbm90IGNvcnJlY3QiLAopOwoKbXkgJUFydGljbGUgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7ICRBcnRpY2xlTGlzdFswXSB9ICktPkFydGljbGVHZXQoICV7ICRBcnRpY2xlTGlzdFswXSB9ICk7CiRTZWxmLT5Jc05vdCgKICAgIHNjYWxhciBrZXlzICVBcnRpY2xlLAogICAgMCwKICAgICJBcnRpY2xlIHdhcyBub3QgY3JlYXRlZCIsCik7CgojIENyZWF0ZSBSZWN1cnJpbmcgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmUgVGFzayBvbiBQYXJlbnQgQXBwb2ludG1lbnQKbXkgJFJhbmRvbUlEUmVjdXJyaW5nICAgICAgICAgID0gJEhlbHBlck9iamVjdC0+R2V0UmFuZG9tSUQoKTsKbXkgJUFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5nID0gKAogICAgVGltZSAgICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgIEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gIiIsCiAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+IHVuZGVmLAogICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICBDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCiAgICBDdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+IHVuZGVmLAogICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgQ3VzdG9tZXJVc2VyICAgICAgICAgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgICAgICA9PiAkVGVzdEN1c3RvbWVyVXNlckxvZ2luLAogICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgT3duZXJJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgTG9jayAgICAgICAgICAgICAgICAgICAgICA9PiAndW5sb2NrJywKICAgIFByaW9yaXR5SUQgICAgICAgICAgICAgICAgPT4gMywKICAgIFN0YXRlSUQgICAgICAgICAgICAgICAgICAgPT4gNCwKICAgIFNlcnZpY2VJRCAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBTTEFJRCAgICAgICAgICAgICAgICAgICAgID0+IHVuZGVmLAogICAgVHlwZUlEICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlEUmVjdXJyaW5nLAogICAgU3ViamVjdCAgICAgICAgICAgICAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSURSZWN1cnJpbmcsCiAgICBDb250ZW50ICAgICAgICAgICAgICAgICAgID0+ICdTb21lRGVzY3JpcHRpb25fJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICBBcnRpY2xlVmlzaWJsZUZvckN1c3RvbWVyID0+IHVuZGVmLAopOwpteSAkUmVjdXJyaW5nQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFJlY3VycmluZyAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIFJlY3VycmVuY2VEYXlzICAgICAgICAgICAgICAgICAgPT4gIiIsCiAgICBSZWN1cnJlbmNlTW9udGhzICAgICAgICAgICAgICAgID0+ICIiLAogICAgUmVjdXJyZW5jZU1vbnRoRGF5cyAgICAgICAgICAgICA9PiAiIiwKICAgIFJlY3VycmVuY2VUeXBlICAgICAgICAgICAgICAgICAgPT4gIldlZWtseSIsCiAgICBSZWN1cnJlbmNlQ3VzdG9tVHlwZSAgICAgICAgICAgID0+ICJDdXN0b21EYWlseSIsCiAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgICAgICAgICAgID0+IDEsCiAgICBEYXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDQsCiAgICBNb250aERheXMgICAgICAgICAgICAgICAgICAgICAgID0+IDMwLAogICAgTW9udGhzICAgICAgICAgICAgICAgICAgICAgICAgICA9PiA2LAogICAgUmVjdXJyZW5jZUxpbWl0ICAgICAgICAgICAgICAgICA9PiAyLAogICAgUmVjdXJyZW5jZVVudGlsRGF5ICAgICAgICAgICAgICA9PiAzLAogICAgUmVjdXJyZW5jZVVudGlsTW9udGggICAgICAgICAgICA9PiA3LAogICAgUmVjdXJyZW5jZVVudGlsWWVhciAgICAgICAgICAgICA9PiAyMDIyLAogICAgUmVjdXJyZW5jZUNvdW50ICAgICAgICAgICAgICAgICA9PiA0LAogICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSURSZWN1cnJpbmcsCiAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lRGVzY3JpcHRpb25fJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIFN0YXJ0VGltZSAgICAgICAgICAgICAgICAgICAgICAgPT4gJFN0YXJ0VGltZU9iai0+VG9TdHJpbmcoKSwKICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICBBcHBvaW50bWVudFRpY2tldCAgICAgICAgICAgICAgID0+IFwlQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmcsCiAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tUZW1wbGF0ZX0sCiAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tDdXN0b219LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmd7Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne0N1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAopOwokS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+Q2xlYW5VcCgpOwoKbXkgJVJlY3VycmluZ0FwcG9pbnRtZW50ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQsCik7CgpteSAlRnV0dXJlVGFza1JlY3VycmluZyA9ICRTY2hlZHVsZXJEQk9iamVjdC0+RnV0dXJlVGFza0dldCgKICAgIFRhc2tJRCA9PiAkUmVjdXJyaW5nQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSwKKTsKCm15ICRTdGFydFRpbWVQYXN0T2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAopOwokU3RhcnRUaW1lUGFzdE9iai0+U3VidHJhY3QoCiAgICBEYXlzID0+IDQsCik7CgpteSAkRW5kVGltZVBhc3RPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICBEYXlzICA9PiAzLAogICAgSG91cnMgPT4gMjMsCik7CgojIFNoaWZ0IEFwcG9pbnRtZW50IHRvIHRoZSBwYXN0IGFuZCBjaGVjayBpZiBGdXR1cmVUYXNrIHdhcyBzaGlmdGVkIHRvIHRoZSBjb3JyZWN0IENoaWxkIEFwcG9pbnRtZW50Cm15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICVSZWN1cnJpbmdBcHBvaW50bWVudCwKICAgIEFwcG9pbnRtZW50VGlja2V0ID0+ICRGdXR1cmVUYXNrUmVjdXJyaW5ne0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LAogICAgU3RhcnRUaW1lICAgICAgICAgPT4gJFN0YXJ0VGltZVBhc3RPYmotPlRvU3RyaW5nKCksCiAgICBFbmRUaW1lICAgICAgICAgICA9PiAkRW5kVGltZVBhc3RPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKIyBDaGVjayBpZiBGdXR1cmVUYXNrIHdhcyBzaGlmdGVkIGNvcnJlY3RseQpteSBAQXBwb2ludG1lbnRMaXN0ID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudExpc3QoCiAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcntDYWxlbmRhcklEfSwKICAgIFBhcmVudElEICAgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQsCik7CgokU2VsZi0+SXMoCiAgICBzY2FsYXIgQEFwcG9pbnRtZW50TGlzdCwKICAgIDMsCiAgICAiTnVtYmVyIG9mIGNoaWxkIGFwcG9pbnRtZW50cyBpcyBub3QgY29ycmVjdCIsCik7CgokU2VsZi0+SXNOb3QoCiAgICAkQXBwb2ludG1lbnRMaXN0WzBdLT57RnV0dXJlVGFza0lEfSwKICAgIHVuZGVmLAogICAgIkZ1dHVyZSB0YXNrIHdhcyBub3Qgc2hpZnRlZCBjb3JyZWN0bHkiLAopOwoKIyBDcmVhdGUgQXBwb2ludG1lbnQgd2l0aCBGdXR1cmVUYXNrLCBzaGlmdCBpdCBhbmQgY2hlY2sgRnV0dXJlVGFzayBFeGVjdXRpb24gVGltZQpteSAkU2luZ2xlQXBwb2ludG1lbnRJRDIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlELAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldCwKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0e0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldHtDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXR7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CgpteSAlU2luZ2xlQXBwb2ludG1lbnQyID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFNpbmdsZUFwcG9pbnRtZW50SUQyLAopOwpteSAlRnV0dXJlVGFzazIgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tHZXQoCiAgICBUYXNrSUQgPT4gJFNpbmdsZUFwcG9pbnRtZW50MntGdXR1cmVUYXNrSUR9LAopOwokU3RhcnRUaW1lT2JqLT5BZGQoCiAgICBEYXlzID0+IDEKKTsKJEVuZFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMSwKKTsKCiMgVXBkYXRlIEFwcG9pbnRtZW50CiRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudFVwZGF0ZSgKICAgICVTaW5nbGVBcHBvaW50bWVudDIsCiAgICBBcHBvaW50bWVudFRpY2tldCA9PiAkRnV0dXJlVGFzazJ7RGF0YX0tPntBcHBvaW50bWVudFRpY2tldH0sCiAgICBTdGFydFRpbWUgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICAgICAgICA9PiAxLAopOwoKbXkgJVNpbmdsZUFwcG9pbnRtZW50MlVwZGF0ZWQgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50R2V0KAogICAgQXBwb2ludG1lbnRJRCA9PiAkU2luZ2xlQXBwb2ludG1lbnRJRDIsCik7CgokU2VsZi0+SXMoCiAgICAkU3VjY2VzcywKICAgIDEsCiAgICAiQXBwb2ludG1lbnQgdXBkYXRlIHdhcyBub3Qgc3VjY2Vzc2Z1bCIsCik7CgpteSAlRnV0dXJlVGFzazJVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRTaW5nbGVBcHBvaW50bWVudDJVcGRhdGVke0Z1dHVyZVRhc2tJRH0sCik7CgokU2VsZi0+SXMoCiAgICAkRnV0dXJlVGFzazJVcGRhdGVke0V4ZWN1dGlvblRpbWV9LAogICAgJFN0YXJ0VGltZU9iai0+VG9TdHJpbmcoKSwKICAgICJGdXR1cmUgdGFzayB3YXMgbm90IHVwZGF0ZWQgY29ycmVjdGx5IiwKKTsKCiMgQ3JlYXRlIFJlY3VycmluZyBBcHBvaW50bWVudCB3aXRoIEZ1dHVyZSBUYXNrIG9uIFBhcmVudCBBcHBvaW50bWVudApteSAkUmVjdXJyaW5nQXBwb2ludG1lbnRJRDIgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgQ2FsZW5kYXJJRCAgICAgICAgICAgICAgICAgICAgICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRFJlY3VycmluZywKICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVEZXNjcmlwdGlvbl8nIC4gJFJhbmRvbUlEUmVjdXJyaW5nLAogICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgIEFwcG9pbnRtZW50VGlja2V0ICAgICAgICAgICAgICAgPT4gXCVBcHBvaW50bWVudFRpY2tldFJlY3VycmluZywKICAgIFRpY2tldFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne1RlbXBsYXRlfSwKICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJEFwcG9pbnRtZW50VGlja2V0UmVjdXJyaW5ne0N1c3RvbX0sCiAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRBcHBvaW50bWVudFRpY2tldFJlY3VycmluZ3tDdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkQXBwb2ludG1lbnRUaWNrZXRSZWN1cnJpbmd7Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCik7CiRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5DbGVhblVwKCk7CgpteSAlUmVjdXJyaW5nQXBwb2ludG1lbnQyID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudEdldCgKICAgIEFwcG9pbnRtZW50SUQgPT4gJFJlY3VycmluZ0FwcG9pbnRtZW50SUQyLAopOwoKbXkgJUZ1dHVyZVRhc2tSZWN1cnJpbmcyID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRSZWN1cnJpbmdBcHBvaW50bWVudDJ7RnV0dXJlVGFza0lEfSwKKTsKCiRTdGFydFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMQopOwokRW5kVGltZU9iai0+QWRkKAogICAgRGF5cyA9PiAxLAopOwoKIyBVcGRhdGUgQXBwb2ludG1lbnQKJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50VXBkYXRlKAogICAgJVJlY3VycmluZ0FwcG9pbnRtZW50MiwKICAgIEFwcG9pbnRtZW50VGlja2V0ID0+ICRGdXR1cmVUYXNrUmVjdXJyaW5nMntEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fSwKICAgIFN0YXJ0VGltZSAgICAgICAgID0+ICRTdGFydFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBFbmRUaW1lICAgICAgICAgICA9PiAkRW5kVGltZU9iai0+VG9TdHJpbmcoKSwKICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCik7CgokU2VsZi0+SXMoCiAgICAkU3VjY2VzcywKICAgIDEsCiAgICAiQXBwb2ludG1lbnQgdXBkYXRlIHdhcyBub3Qgc3VjY2Vzc2Z1bCIsCik7CgpteSAlRnV0dXJlVGFza1JlY3VycmluZzJVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRSZWN1cnJpbmdBcHBvaW50bWVudDJ7RnV0dXJlVGFza0lEfSwKKTsKCiRTZWxmLT5JcygKICAgICRGdXR1cmVUYXNrUmVjdXJyaW5nMlVwZGF0ZWR7RXhlY3V0aW9uVGltZX0sCiAgICAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgIkZ1dHVyZSB0YXNrIHdhcyBub3QgdXBkYXRlZCBjb3JyZWN0bHkiLAopOwoKJFNlbGYtPkRvbmVUZXN0aW5nKCk7Cg==</File>
        <File Location="scripts/test/Daemon/SchedulerDBFutureTaskUpdate.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBTZXQgdXAgdGhlIHRlc3QgZHJpdmVyICRTZWxmIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYSBzdGFuZGFsb25lIHNjcmlwdC4KdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJEcml2ZXI7CgpvdXIgJFNlbGY7CgokS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInID0+IHsKICAgICAgICBSZXN0b3JlRGF0YWJhc2UgPT4gMSwKICAgIH0sCik7Cm15ICRIZWxwZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VW5pdFRlc3Q6OkhlbHBlcicpOwpteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiMgRG8gbm90IGNoZWNrIGVtYWlscy4KJENvbmZpZ09iamVjdC0+U2V0KAogICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgVmFsdWUgPT4gMCwKKTsKCiMgR2V0IG5lY2Vzc2FyeSBvYmplY3RzLgpteSAkQ2FsZW5kYXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FsZW5kYXInKTsKbXkgJEFwcG9pbnRtZW50T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyOjpBcHBvaW50bWVudCcpOwpteSAkU2NoZWR1bGVyREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpOwokU2VsZi0+SXMoCiAgICByZWYgJFNjaGVkdWxlckRCT2JqZWN0LAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJywKICAgICJLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQi0+bmV3KCkiLAopOwoKIyBDcmVhdGUgY2FsZW5kYXIKbXkgJENhbGVuZGFyTmFtZSA9ICdUZXN0XycgLiAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwpteSAlQ2FsZW5kYXIgICAgID0gJENhbGVuZGFyT2JqZWN0LT5DYWxlbmRhckNyZWF0ZSgKICAgIENhbGVuZGFyTmFtZSA9PiAkQ2FsZW5kYXJOYW1lLAogICAgR3JvdXBJRCAgICAgID0+IDEsCiAgICBDb2xvciAgICAgICAgPT4gJyNGRjc3MDAnLAogICAgVXNlcklEICAgICAgID0+IDEsCik7CgpteSAkU3RhcnRUaW1lT2JqID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnCik7CiRTdGFydFRpbWVPYmotPkFkZCgKICAgIERheXMgPT4gMSwKKTsKbXkgJEVuZFRpbWVPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKKTsKJEVuZFRpbWVPYmotPkFkZCgKICAgIERheXMgID0+IDEsCiAgICBIb3VycyA9PiAxLAopOwoKIyBDcmVhdGUgYXBwb2ludG1lbnQKbXkgJFJhbmRvbUlEICAgICAgPSAkSGVscGVyT2JqZWN0LT5HZXRSYW5kb21JRCgpOwpteSAkQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICBDYWxlbmRhcklEICA9PiAkQ2FsZW5kYXJ7Q2FsZW5kYXJJRH0sCiAgICBUaXRsZSAgICAgICA9PiAnU29tZVRpdGxlXycgLiAkUmFuZG9tSUQsCiAgICBEZXNjcmlwdGlvbiA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICBTdGFydFRpbWUgICA9PiAkU3RhcnRUaW1lT2JqLT5Ub1N0cmluZygpLAogICAgRW5kVGltZSAgICAgPT4gJEVuZFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBVc2VySUQgICAgICA9PiAxLAopOwoKIyBDcmVhdGUgdGVzdCBjdXN0b21lciB1c2VyCm15ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4gPSAkSGVscGVyT2JqZWN0LT5UZXN0Q3VzdG9tZXJVc2VyQ3JlYXRlKCk7CgojIENyZWF0ZSBpbml0aWFsIGZ1dHVyZSB0YXNrCm15ICRGdXR1cmVUYXNrSUQgPSAkU2NoZWR1bGVyREJPYmplY3QtPkZ1dHVyZVRhc2tBZGQoCiAgICBFeGVjdXRpb25UaW1lID0+ICRTdGFydFRpbWVPYmotPlRvU3RyaW5nKCksCiAgICBUeXBlICAgICAgICAgID0+ICdBcHBvaW50bWVudFRpY2tldCcsCiAgICBEYXRhICAgICAgICAgID0+IHsKICAgICAgICBBcHBvaW50bWVudFRpY2tldCA9PiB7CiAgICAgICAgICAgIFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gdW5kZWYsCiAgICAgICAgICAgIFRlbXBsYXRlICAgICAgICAgICAgICAgICAgPT4gJ1N0YXJ0JywKICAgICAgICAgICAgQ3VzdG9tICAgICAgICAgICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiB1bmRlZiwKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2JlZm9yZXN0YXJ0JywKICAgICAgICAgICAgQ3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiB1bmRlZiwKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgICAgICAgICAgICA9PiAxLAogICAgICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICAgID0+ICRUZXN0Q3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgICAgICAgICAgPT4gJFRlc3RDdXN0b21lclVzZXJMb2dpbiwKICAgICAgICAgICAgU2VsZWN0ZWRDdXN0b21lclVzZXIgICAgICA9PiAndGVzdCcsCiAgICAgICAgICAgIFRpdGxlICAgICAgICAgICAgICAgICAgICAgPT4gJ1NvbWVUaXRsZV8nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgICAgICAgICAgID0+ICdTb21lVGl0bGVfJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICAgICAgICAgICA9PiAnU29tZURlc2NyaXB0aW9uXycgLiAkUmFuZG9tSUQsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgTG9jayAgICAgICAgICAgICAgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgUHJpb3JpdHlJRCAgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICBTdGF0ZUlEICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgfQopOwoKIyBDaGVjayBpZiB0YXNrIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CiRTZWxmLT5Jc05vdCgKICAgICRGdXR1cmVUYXNrSUQsCiAgICB1bmRlZiwKICAgICJGdXR1cmUgdGFzayBpZCBpcyB1bmRlZiIsCik7CiRTZWxmLT5Jc05vdCgKICAgICRGdXR1cmVUYXNrSUQsCiAgICAtMSwKICAgICJGdXR1cmUgdGFzayBjb3VsZCBub3QgYmUgY3JlYXRlZCwgUmVzdWx0OiAkRnV0dXJlVGFza0lEIiwKKTsKCm15ICVGdXR1cmVUYXNrID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRGdXR1cmVUYXNrSUQsCik7CgojIFVwZGF0ZSBleGVjdXRpb24gdGltZQpteSAkRXhlY3V0aW9uVGltZU5ldyA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJwopOwokRXhlY3V0aW9uVGltZU5ldy0+QWRkKAogICAgRGF5cyAgPT4gMiwKICAgIEhvdXJzID0+IDEsCik7Cm15ICRTdWNjZXNzID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrVXBkYXRlKAogICAgVGFza0lEICAgICAgICA9PiAkRnV0dXJlVGFza0lELAogICAgRXhlY3V0aW9uVGltZSA9PiAkRXhlY3V0aW9uVGltZU5ldy0+VG9TdHJpbmcoKSwKICAgIERhdGEgICAgICAgICAgPT4gewogICAgICAgIEFwcG9pbnRtZW50SUQgICAgID0+ICRGdXR1cmVUYXNre0RhdGF9LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAkRnV0dXJlVGFza3tEYXRhfS0+e0FwcG9pbnRtZW50VGlja2V0fS0+JSosCiAgICAgICAgICAgIFRpdGxlICAgPT4gJ1NvbWVUaXRsZTJfJyAuICRSYW5kb21JRCwKICAgICAgICAgICAgU3ViamVjdCA9PiAnU29tZVRpdGxlMl8nIC4gJFJhbmRvbUlELAogICAgICAgICAgICBCb2R5ICAgID0+ICdTb21lRGVzY3JpcHRpb24yXycgLiAkUmFuZG9tSUQsCiAgICAgICAgfQogICAgfSwKKTsKCiRTZWxmLT5JcygKICAgICRTdWNjZXNzLAogICAgMSwKICAgICJGdXR1cmUgdGFzayBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkiLAopOwoKbXkgJUZ1dHVyZVRhc2tVcGRhdGVkID0gJFNjaGVkdWxlckRCT2JqZWN0LT5GdXR1cmVUYXNrR2V0KAogICAgVGFza0lEID0+ICRGdXR1cmVUYXNrSUQsCik7CgokU2VsZi0+SXMoCiAgICAkRnV0dXJlVGFza1VwZGF0ZWR7RXhlY3V0aW9uVGltZX0sCiAgICAkRXhlY3V0aW9uVGltZU5ldy0+VG9TdHJpbmcoKSwKICAgICJVcGRhdGUgb2YgZnV0dXJlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWQgbm90IGNoYW5nZSB0aGUgZXhlY3V0aW9uIHRpbWUiLAopOwoKJFNlbGYtPklzKAogICAgJEZ1dHVyZVRhc2tVcGRhdGVke0RhdGF9LT57QXBwb2ludG1lbnRUaWNrZXR9LT57VGl0bGV9LAogICAgJ1NvbWVUaXRsZTJfJyAuICRSYW5kb21JRCwKICAgICJVcGRhdGUgb2YgZnV0dXJlIHRhc2sgd2FzIHN1Y2Nlc3NmdWwsIGJ1dCBkaWQgbm90IGNoYW5nZSB0aGUgdGlja2V0IHRpdGxlIiwKKTsKCiMgY2xlYW51cCBpcyBkb25lIGJ5IFJlc3RvcmVEYXRhYmFzZS4KCiRTZWxmLT5Eb25lVGVzdGluZygpOwo=</File>
        <File Location="var/packagesetup/AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI1IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6QXBwb2ludG1lbnRUb1RpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpBcHBvaW50bWVudFRvVGlja2V0IC0gY29kZSB0byBleGVjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ3Zhcjo6cGFja2FnZXNldHVwOjpBcHBvaW50bWVudFRvVGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBERUxFVEUgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICBXSEVSRSB0YXNrX3R5cGUgPSAnQXBwb2ludG1lbnRUaWNrZXQnCiAgICAiOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.AppointmentCalendar.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gYzE0Y2E1NWE4YjFkM2Q2ODZlODAzYzEzOTg4MTNiODNkMjIwOTFlNSAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgovKmdsb2JhbCBDbGlwYm9hcmQgKi8KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgovKioKICogQG5hbWVzcGFjZSBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICogQG1lbWJlcm9mIENvcmUuQWdlbnQKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgZnVuY3Rpb25zLgogKi8KQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgIC8vIEFwcG9pbnRtZW50IGRheXMgY2FjaGUgYW5kIHJlYWR5IGZsYWcKICAgIHZhciBBcHBvaW50bWVudERheXNDYWNoZSwKICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IGZhbHNlLAogICAgICAgIEFKQVhDb3VudGVyID0gMCwKICAgICAgICBDdXJyZW50VmlldywKICAgICAgICBDYWxlbmRhclNvdXJjZXMgPSB7fTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBJbml0aWFsaXplcyB0aGUgYXBwb2ludG1lbnQgY2FsZW5kYXIgY29udHJvbC4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ2FsZW5kYXJDb25maWcgPSBDb3JlLkNvbmZpZy5HZXQoJ0NhbGVuZGFyQ29uZmlnJyksCiAgICAgICAgICAgIFJlc291cmNlQ29uZmlnLAogICAgICAgICAgICAkQ2FsZW5kYXJPYmogPSAkKCcjY2FsZW5kYXInKSwKICAgICAgICAgICAgJERhdGVwaWNrZXJPYmosCiAgICAgICAgICAgIENsaXBib2FyZEpTLAogICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQgPSBbXTsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT0gJ0FnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldycpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3KCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICghQ2FsZW5kYXJDb25maWcpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgJERhdGVwaWNrZXJPYmogPSAkKCc8ZGl2IC8+JykKICAgICAgICAgICAgLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXInKQogICAgICAgICAgICAuYWRkQ2xhc3MoJ0hpZGRlbicpCiAgICAgICAgICAgIC5pbnNlcnRBZnRlcigkQ2FsZW5kYXJPYmopLAoKICAgICAgICBDbGlwYm9hcmRKUyA9IG5ldyBDbGlwYm9hcmQoJy5Db3B5VG9DbGlwYm9hcmQnKTsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnVGVhbUlEJykpIHsKICAgICAgICAgICAgUmVzb3VyY2VDb25maWcgPSB7CiAgICAgICAgICAgICAgICB1cmw6IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB0eXBlOiAnUE9TVCcsCiAgICAgICAgICAgICAgICBkYXRhOiB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRUZWFtTGlzdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnTGlzdFJlc291cmNlcycsCiAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiBDb3JlLkNvbmZpZy5HZXQoJ1RlYW1JRCcpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvLyBJbml0aWFsaXplIGNhbGVuZGFyCiAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcih7CiAgICAgICAgICAgIGhlYWRlcjogewogICAgICAgICAgICAgICAgbGVmdDogJ21vbnRoLGFnZW5kYVdlZWssYWdlbmRhRGF5IHRpbWVsaW5lTW9udGgsdGltZWxpbmVXZWVrLHRpbWVsaW5lRGF5JywKICAgICAgICAgICAgICAgIGNlbnRlcjogJ3RpdGxlJywKICAgICAgICAgICAgICAgIHJpZ2h0OiAnanVtcCx0b2RheSBwcmV2LG5leHQnCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGN1c3RvbUJ1dHRvbnM6IHsKICAgICAgICAgICAgICAgIGp1bXA6IHsKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVtcCcpLAogICAgICAgICAgICAgICAgICAgIGNsaWNrOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgU2hvd0RhdGVwaWNrZXIoJENhbGVuZGFyT2JqLCAkRGF0ZXBpY2tlck9iaiwgJCh0aGlzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBkZWZhdWx0VmlldzogQ29yZS5Db25maWcuR2V0KCdEZWZhdWx0VmlldycpLAogICAgICAgICAgICBhbGxEYXlUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQWxsLWRheScpLAogICAgICAgICAgICBpc1JUTDogQ29yZS5Db25maWcuR2V0KCdJc1JUTExhbmd1YWdlJyksCiAgICAgICAgICAgIGNvbHVtbkZvcm1hdDogJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICB0aW1lRm9ybWF0OiAnSEg6bW0nLAogICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgIHdlZWtOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICB3ZWVrTnVtYmVyVGl0bGU6ICcjJywKICAgICAgICAgICAgd2Vla051bWJlckNhbGN1bGF0aW9uOiAnSVNPJywKICAgICAgICAgICAgZXZlbnRMaW1pdDogdHJ1ZSwKICAgICAgICAgICAgZXZlbnRMaW1pdFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdtb3JlJyksCiAgICAgICAgICAgIGhlaWdodDogNjAwLAogICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgZmlyc3REYXk6IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSwKICAgICAgICAgICAgbW9udGhOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0phbnVhcnknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWJydWFyeScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01hcmNoJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXByaWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXlfbG9uZycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bmUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWx5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXVndXN0JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VwdGVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2N0b2JlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdmVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVjZW1iZXInKQogICAgICAgICAgICBdLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKYW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdWcnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXAnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPY3QnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOb3YnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWMnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWRuZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaHVyc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaWRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdHVyZGF5JykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RodScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdCcpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGJ1dHRvblRleHQ6IHsKICAgICAgICAgICAgICAgIHRvZGF5OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVG9kYXknKSwKICAgICAgICAgICAgICAgIG1vbnRoOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW9udGgnKSwKICAgICAgICAgICAgICAgIHdlZWs6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWVrJyksCiAgICAgICAgICAgICAgICBkYXk6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEYXknKSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaW1lbGluZSBNb250aCcpLAogICAgICAgICAgICAgICAgdGltZWxpbmVXZWVrOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGltZWxpbmUgV2VlaycpLAogICAgICAgICAgICAgICAgdGltZWxpbmVEYXk6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaW1lbGluZSBEYXknKSwKICAgICAgICAgICAgICAgIGp1bXA6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW1wJyksCiAgICAgICAgICAgICAgICBwcmV2RGF0ZXBpY2tlcjogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXZpb3VzJyksCiAgICAgICAgICAgICAgICBuZXh0RGF0ZXBpY2tlcjogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05leHQnKQogICAgICAgICAgICB9LAogICAgICAgICAgICBzY2hlZHVsZXJMaWNlbnNlS2V5OiAnR1BMLU15LVByb2plY3QtSXMtT3Blbi1Tb3VyY2UnLAogICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMDozMDowMCcsCiAgICAgICAgICAgIGZvcmNlRXZlbnREdXJhdGlvbjogdHJ1ZSwKICAgICAgICAgICAgbm93SW5kaWNhdG9yOiB0cnVlLAogICAgICAgICAgICB0aW1lem9uZTogJ2xvY2FsJywKICAgICAgICAgICAgcmVzb3VyY2VBcmVhV2lkdGg6ICcyMSUnLAogICAgICAgICAgICB2aWV3czogewogICAgICAgICAgICAgICAgbW9udGg6IHsKICAgICAgICAgICAgICAgICAgICB0aXRsZUZvcm1hdDogJ01NTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgY29sdW1uRm9ybWF0OiAnZGRkZCcKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhZ2VuZGFEYXk6IHsKICAgICAgICAgICAgICAgICAgICB0aXRsZUZvcm1hdDogJ0QgTU1NIFlZWVknLAogICAgICAgICAgICAgICAgICAgIHJlc291cmNlczogZmFsc2UKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lbGluZU1vbnRoOiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMjQ6MDA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoczogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2xvdExhYmVsRm9ybWF0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdEJwogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lbGluZVdlZWs6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcwMjowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgd2VlazogMQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc2xvdExhYmVsRm9ybWF0OiBbCiAgICAgICAgICAgICAgICAgICAgICAgICdkZGQsIEQgTU1NJywKICAgICAgICAgICAgICAgICAgICAgICAgJ0hIJwogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB0aW1lbGluZURheTogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICBkYXlzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEg6bW0nCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBsb2FkaW5nOiBmdW5jdGlvbihJc0xvYWRpbmcpIHsKICAgICAgICAgICAgICAgIGlmIChJc0xvYWRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAkKCcuQ2FsZW5kYXJXaWRnZXQnKS5hZGRDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkKCcuQ2FsZW5kYXJXaWRnZXQnKS5yZW1vdmVDbGFzcygnTG9hZGluZycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICB2aWV3UmVuZGVyOiBmdW5jdGlvbihWaWV3KSB7CgogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIG9uIGEgdGltZWxpbmUgdmlldy4KICAgICAgICAgICAgICAgIGlmIChWaWV3Lm5hbWUgPT09ICd0aW1lbGluZVdlZWsnIHx8IFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lRGF5JykgewoKICAgICAgICAgICAgICAgICAgICAvLyBBZGQgY2FsZW5kYXIgd2VlayBudW1iZXIgdG8gdGltZWxpbmUgdmlldyB0aXRsZXMuCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ2FsZW5kYXJPYmouZmluZCgnLmZjLXRvb2xiYXIgPiBkaXYgPiBoMicpLmFwcGVuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxzcGFuIC8+JykuYWRkQ2xhc3MoJ2ZjLXdlZWstbnVtYmVyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudGV4dChWaWV3LnN0YXJ0LmZvcm1hdCgnICNXJykpCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CgogICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgICAgICAgICAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB2aWV3IHNlbGVjdGlvbgogICAgICAgICAgICAgICAgaWYgKEN1cnJlbnRWaWV3ICE9PSB1bmRlZmluZWQgJiYgQ3VycmVudFZpZXcgIT09IFZpZXcubmFtZSkgewogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJ2aWV3U2NyZWVuOiBDb3JlLkNvbmZpZy5HZXQoJ092ZXJ2aWV3U2NyZWVuJykgPyBDb3JlLkNvbmZpZy5HZXQoJ092ZXJ2aWV3U2NyZWVuJykgOiAnQ2FsZW5kYXJPdmVydmlldycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmlldzogVmlldy5uYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5EZWJ1Zy5Mb2coJ0Vycm9yIHVwZGF0aW5nIHVzZXIgcHJlZmVyZW5jZXMhJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgQ3VycmVudFZpZXcgPSBWaWV3Lm5hbWU7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24oU3RhcnQsIEVuZCwgSlNFdmVudCwgVmlldywgUmVzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIFN0YXJ0OiBTdGFydCwKICAgICAgICAgICAgICAgICAgICBFbmQ6IEVuZCwKICAgICAgICAgICAgICAgICAgICBKU0V2ZW50OiBKU0V2ZW50LAogICAgICAgICAgICAgICAgICAgIFZpZXc6IFZpZXcsCiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2U6IFJlc291cmNlCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coRGF0YSk7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCd1bnNlbGVjdCcpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudENsaWNrOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6IENhbEV2ZW50LnN0YXJ0LAogICAgICAgICAgICAgICAgICAgIEVuZDogQ2FsRXZlbnQuZW5kLAogICAgICAgICAgICAgICAgICAgIENhbEV2ZW50OiBDYWxFdmVudAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKERhdGEpOwogICAgICAgICAgICAgICAgSlNFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnREcm9wOiBmdW5jdGlvbihDYWxFdmVudCwgRGVsdGEsIFJldmVydEZ1bmMpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIENhbEV2ZW50OiBDYWxFdmVudCwKICAgICAgICAgICAgICAgICAgICBQcmV2aW91c0FwcG9pbnRtZW50OiBDdXJyZW50QXBwb2ludG1lbnQsCiAgICAgICAgICAgICAgICAgICAgRGVsdGE6IERlbHRhLAogICAgICAgICAgICAgICAgICAgIFJldmVydEZ1bmM6IFJldmVydEZ1bmMKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBVcGRhdGVBcHBvaW50bWVudChEYXRhKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRSZXNpemU6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KERhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlbmRlcjogZnVuY3Rpb24oQ2FsRXZlbnQsICRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgJEljb25Db250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgJEljb247CgogICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LmFsbERheQogICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnJlY3VycmluZwogICAgICAgICAgICAgICAgICAgIHx8IENhbEV2ZW50LnBhcmVudElkCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQubm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBjb250YWluZXIgYW5kIGljb24gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICRJY29uQ29udGFpbmVyID0gJCgnPGRpdiAvPicpLmFkZENsYXNzKCdJY29ucycpOwogICAgICAgICAgICAgICAgICAgICRJY29uID0gJCgnPGkgLz4nKS5hZGRDbGFzcygnZmEnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gTWFyayBhcHBvaW50bWVudCB3aXRoIGFwcHJvcHJpYXRlIGljb24ocykKICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtc3VuLW8nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnJlY3VycmluZykgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLXJlcGVhdCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1saW5rJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5ub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1iZWxsJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1jaGFyLScgKyBDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldEFwcG9pbnRtZW50Q29uZmlnJylbQ2FsRXZlbnQudGlja2V0QXBwb2ludG1lbnRUeXBlXS5NYXJrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vIFByZXBlbmQgY29udGFpbmVyIHRvIHRoZSBhcHBvaW50bWVudAogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmZpbmQoJy5mYy1jb250ZW50JykKICAgICAgICAgICAgICAgICAgICAgICAgLnByZXBlbmQoJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlc2l6ZVN0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudERyYWdTdGFydDogZnVuY3Rpb24oQ2FsRXZlbnQpIHsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5zdGFydCA9IENhbEV2ZW50LnN0YXJ0OwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LmVuZCA9IENhbEV2ZW50LmVuZDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5yZXNvdXJjZUlkcyA9IENhbEV2ZW50LnJlc291cmNlSWRzOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudE1vdXNlb3ZlcjogZnVuY3Rpb24oQ2FsRXZlbnQsIEpTRXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkVG9vbHRpcE9iaiwKICAgICAgICAgICAgICAgICAgICBQb3NYID0gMCwKICAgICAgICAgICAgICAgICAgICBQb3NZID0gMCwKICAgICAgICAgICAgICAgICAgICBUb29sdGlwSFRNTCA9IENvcmUuVGVtcGxhdGUuUmVuZGVyKCdBZ2VudC9BcHBvaW50bWVudENhbGVuZGFyL0FwcG9pbnRtZW50VG9vbHRpcCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgJ1BsdWdpbkxpc3QnOiBDb3JlLkNvbmZpZy5HZXQoJ1BsdWdpbkxpc3QnKSwKICAgICAgICAgICAgICAgICAgICAgICAgJ0NhbEV2ZW50JzogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICdUb29sdGlwVGVtcGxhdGVSZXNvdXJjZSc6IENvcmUuQ29uZmlnLkdldCgnVG9vbHRpcFRlbXBsYXRlUmVzb3VyY2UnKSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAnVGlja2V0QXBwb2ludG1lbnRDb25maWcnOiBDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldEFwcG9pbnRtZW50Q29uZmlnJykKICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVMZWZ0ID0gJChkb2N1bWVudCkuc2Nyb2xsTGVmdCgpICsgJCh3aW5kb3cpLndpZHRoKCksCiAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlVG9wID0gJChkb2N1bWVudCkuc2Nyb2xsVG9wKCkgKyAkKHdpbmRvdykuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICAgICAgTGFzdFhQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICBMYXN0WVBvc2l0aW9uOwoKICAgICAgICAgICAgICAgIGlmICghSlNFdmVudCkgewogICAgICAgICAgICAgICAgICAgIEpTRXZlbnQgPSB3aW5kb3cuZXZlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoSlNFdmVudC5wYWdlWCB8fCBKU0V2ZW50LnBhZ2VZKSB7CiAgICAgICAgICAgICAgICAgICAgUG9zWCA9IEpTRXZlbnQucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEpTRXZlbnQucGFnZVk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEpTRXZlbnQuY2xpZW50WCB8fCBKU0V2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5jbGllbnRYICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0ICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7CiAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEpTRXZlbnQuY2xpZW50WSArIGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBJbmNyZWFzZSBwb3NpdGlvbnMgc28gdGhlIHRvb2x0aXAgZG8gbm90IG92ZXJsYXAgd2l0aCBtb3VzZSBwb2ludGVyCiAgICAgICAgICAgICAgICBQb3NYICs9IDEwOwogICAgICAgICAgICAgICAgUG9zWSArPSAxMDsKCiAgICAgICAgICAgICAgICBpZiAoVG9vbHRpcEhUTUwubGVuZ3RoID4gMCkgewoKICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdG9vbHRpcCBvYmplY3QKICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iaiA9ICQoVG9vbHRpcEhUTUwpCiAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBQb3NZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdDogUG9zWAogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJ2JvZHknKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRvcCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WVBvc2l0aW9uID0gUG9zWSArICRUb29sdGlwT2JqLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WVBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlVG9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBQb3NZIC0gJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmNzcygndG9wJywgUG9zWSArICdweCcpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIGxlZnQgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgTGFzdFhQb3NpdGlvbiA9IFBvc1ggKyAkVG9vbHRpcE9iai53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgIGlmIChMYXN0WFBvc2l0aW9uID4gRG9jdW1lbnRWaXNpYmxlTGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gUG9zWCAtICRUb29sdGlwT2JqLndpZHRoKCkgLSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCdsZWZ0JywgUG9zWCArICdweCcpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqLmZhZGVJbignZmFzdCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudE1vdXNlb3V0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICQoJy5BcHBvaW50bWVudFRvb2x0aXAnKS5mYWRlT3V0KCJmYXN0IikucmVtb3ZlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50QWZ0ZXJBbGxSZW5kZXI6IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZmlyc3QgZGF5IGluIHRpbWVsaW5lTW9udGggdmlldyBpcyBub3QgU2F0dXJkYXkgb3IgU3VuZGF5LCB0aGUgZmlyc3QgZGl2LmZjLWJnZXZlbnQgc2hvdWxkIGJlIHJlbW92ZWQuCiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBmcm9tIGZ1bGxjYWxlbmRhciBhbmQgaXQgY2FuIGJlIHNvbHZlZCBoZXJlLiBTZWUgYnVnIzE0NzY0LgogICAgICAgICAgICAgICAgaWYgKCEkKCcuZmMtdGltZWxpbmVNb250aC12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDplcSgwKScpLmhhc0NsYXNzKCdmYy1zYXQnKQogICAgICAgICAgICAgICAgICAgICYmICEkKCcuZmMtdGltZWxpbmVNb250aC12aWV3IC5mYy1zbGF0cyB0ZC5mYy13aWRnZXQtY29udGVudDplcSgwKScpLmhhc0NsYXNzKCdmYy1zdW4nKSkgewogICAgICAgICAgICAgICAgICAgICQoJy5mYy10aW1lbGluZU1vbnRoLXZpZXcgLmZjLWJnZXZlbnQtY29udGFpbmVyIC5mYy1iZ2V2ZW50OmVxKDApJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50czogQ29yZS5Db25maWcuR2V0KCdXb3JraW5nSG91cnNDb25maWcnKSwKICAgICAgICAgICAgcmVzb3VyY2VzOiBSZXNvdXJjZUNvbmZpZywKICAgICAgICAgICAgcmVzb3VyY2VDb2x1bW5zOiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTmFtZScpLAogICAgICAgICAgICAgICAgICAgIGZpZWxkOiAndGl0bGUnCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHJlc291cmNlTGFiZWxUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUmVzb3VyY2VzJykKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRlcGlja2VyCiAgICAgICAgJERhdGVwaWNrZXJPYmouZGF0ZXBpY2tlcih7CiAgICAgICAgICAgIHNob3dPbjogJ2J1dHRvbicsCiAgICAgICAgICAgIGJ1dHRvblRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW1wJyksCiAgICAgICAgICAgIGNvbnN0cmFpbklucHV0OiB0cnVlLAogICAgICAgICAgICBwcmV2VGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXZpb3VzJyksCiAgICAgICAgICAgIG5leHRUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTmV4dCcpLAogICAgICAgICAgICBmaXJzdERheTogQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhcldlZWtEYXlTdGFydCcpLAogICAgICAgICAgICBzaG93TW9udGhBZnRlclllYXI6IDAsCiAgICAgICAgICAgIG1vbnRoTmFtZXM6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKYW51YXJ5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmVicnVhcnknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXJjaCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcmlsJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWF5X2xvbmcnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW5lJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVseScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F1Z3VzdCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NlcHRlbWJlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09jdG9iZXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOb3ZlbWJlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RlY2VtYmVyJykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgbW9udGhOYW1lc1Nob3J0OiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSmFuJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRmViJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWFyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXByJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVuJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVsJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXVnJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VwJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2N0JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm92JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVjJykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgZGF5TmFtZXM6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTdW5kYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb25kYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUdWVzZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV2VkbmVzZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGh1cnNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGcmlkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTYXR1cmRheScpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGRheU5hbWVzU2hvcnQ6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTdW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb24nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUdWUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWQnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaHUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGcmknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTYXQnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lc01pbjogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW8nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUdScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGgnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhJykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgaXNSVEw6IENvcmUuQ29uZmlnLkdldCgnSXNSVExMYW5ndWFnZScpLAogICAgICAgICAgICBvblNlbGVjdDogZnVuY3Rpb24oRGF0ZVRleHQpIHsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ2dvdG9EYXRlJywgbmV3IERhdGUoRGF0ZVRleHQpKTsKICAgICAgICAgICAgICAgICQoJyNEYXRlcGlja2VyT3ZlcmxheScpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmouaGlkZSgpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBiZWZvcmVTaG93RGF5OiBmdW5jdGlvbihEYXRlT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBpZiAoQXBwb2ludG1lbnREYXlzQ2FjaGVSZWZyZXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2hlY2tEYXRlKERhdGVPYmplY3QpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RydWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICBvbkNoYW5nZU1vbnRoWWVhcjogZnVuY3Rpb24oWWVhciwgTW9udGgpIHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHZhciBTZXNzaW9uSURDb29raWUgPSBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRENvb2tpZScpLAogICAgICAgICAgICBTZXNzaW9uSUQgPSBTZXNzaW9uSURDb29raWUgPyAnJyA6IENvcmUuQ29uZmlnLkdldCgnU2Vzc2lvbklEJyksCiAgICAgICAgICAgIFNlc3Npb25OYW1lID0gQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uTmFtZScpLAogICAgICAgICAgICBDdXN0b21lclBhbmVsU2Vzc2lvbk5hbWUgPSBDb3JlLkNvbmZpZy5HZXQoJ0N1c3RvbWVyUGFuZWxTZXNzaW9uTmFtZScpOwogICAgICAgICQuZWFjaChDYWxlbmRhckNvbmZpZywgZnVuY3Rpb24gKEluZGV4LCBDYWxlbmRhcikgewogICAgICAgICAgICB2YXIgQ2FsZW5kYXJEYXRhID0gewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoIiNDaGFsbGVuZ2VUb2tlbiIpLnZhbCgpLAogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudExpc3QnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnTGlzdEFwcG9pbnRtZW50cycsCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEOiBDYWxlbmRhci5DYWxlbmRhcklELAogICAgICAgICAgICAgICAgUmVzb3VyY2VJRDogQ29yZS5Db25maWcuR2V0KCdSZXNvdXJjZUlEJyksCiAgICAgICAgICAgICAgICBUZWFtSUQ6IENvcmUuQ29uZmlnLkdldCgnVGVhbUlEJykKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKCFTZXNzaW9uSURDb29raWUpIHsKICAgICAgICAgICAgICAgIENhbGVuZGFyRGF0YVtTZXNzaW9uTmFtZV0gPSBTZXNzaW9uSUQ7CiAgICAgICAgICAgICAgICBDYWxlbmRhckRhdGFbQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lXSA9IFNlc3Npb25JRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBDYWxlbmRhclNvdXJjZXNbQ2FsZW5kYXIuQ2FsZW5kYXJJRF0gPSB7CiAgICAgICAgICAgICAgICBpZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIGRhdGE6IENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgICAgIGNvbG9yOiBDYWxlbmRhci5Db2xvciwKICAgICAgICAgICAgICAgIHRleHRDb2xvcjogQ2FsZW5kYXIuVGV4dENvbG9yLAogICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMiknLAogICAgICAgICAgICAgICAgc3RhcnRQYXJhbTogJ1N0YXJ0VGltZScsCiAgICAgICAgICAgICAgICBlbmRQYXJhbTogJ0VuZFRpbWUnLAoKICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHJlbW92ZUV2ZW50U291cmNlLgogICAgICAgICAgICAgICAgZ29vZ2xlQ2FsZW5kYXJJZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKCiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IGZ1bmN0aW9uKEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBUaWNrZXRBcHBvaW50bWVudENvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50RGF0YS5BcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogQXBwb2ludG1lbnREYXRhLlBhcmVudElELAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogQXBwb2ludG1lbnREYXRhLlN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBBcHBvaW50bWVudERhdGEuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IEFwcG9pbnRtZW50RGF0YS5FbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBBcHBvaW50bWVudERhdGEuRW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEFwcG9pbnRtZW50RGF0YS5UaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEFwcG9pbnRtZW50RGF0YS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IEFwcG9pbnRtZW50RGF0YS5Mb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZDogQXBwb2ludG1lbnREYXRhLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheTogcGFyc2VJbnQoQXBwb2ludG1lbnREYXRhLkFsbERheSwgMTApID8gdHJ1ZSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJpbmc6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5SZWN1cnJpbmcsIDEwKSA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbUlkczogQXBwb2ludG1lbnREYXRhLlRlYW1JRCwKICAgICAgICAgICAgICAgICAgICAgICAgdGVhbU5hbWVzOiBBcHBvaW50bWVudERhdGEuVGVhbU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUlkczogQXBwb2ludG1lbnREYXRhLlJlc291cmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTmFtZXM6IEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZU5hbWVzLAogICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5EYXRhOiBBcHBvaW50bWVudERhdGEuUGx1Z2luRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJOYW1lOiBDYWxlbmRhci5DYWxlbmRhck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyQ29sb3I6IENhbGVuZGFyLkNvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb246IEFwcG9pbnRtZW50RGF0YS5Ob3RpZmljYXRpb25EYXRlLmxlbmd0aCA/IHRydWUgOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRGF0ZTogQXBwb2ludG1lbnREYXRhLk5vdGlmaWNhdGlvbkRhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tldEFwcG9pbnRtZW50VHlwZTogQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydEVkaXRhYmxlOiB0eXBlb2YgQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlID09PSAndW5kZWZpbmVkJyA/IHRydWUgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW9mIFRpY2tldEFwcG9pbnRtZW50Q29uZmlnW0FwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudFN0YXJ0RGF0ZV0uTm9EcmFnICE9PSAndW5kZWZpbmVkJyA/IGZhbHNlIDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25FZGl0YWJsZTogdHlwZW9mIEFwcG9pbnRtZW50RGF0YS5UaWNrZXRBcHBvaW50bWVudEVuZERhdGUgPT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgVGlja2V0QXBwb2ludG1lbnRDb25maWdbQXBwb2ludG1lbnREYXRhLlRpY2tldEFwcG9pbnRtZW50U3RhcnREYXRlXS5Ob0RyYWcgIT09ICd1bmRlZmluZWQnID8gdHJ1ZSA6IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnLkNhbGVuZGFyU3dpdGNoIGlucHV0W3R5cGU9ImNoZWNrYm94Il0nKS5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ2FsZW5kYXJTd2l0Y2hJbml0KCQodGhpcykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBdXRvIG9wZW4gYXBwb2ludG1lbnQgY3JlYXRlIHNjcmVlbi4KICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk9wZW5FZGl0RGlhbG9nKHsKICAgICAgICAgICAgICAgIFN0YXJ0OiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuU3RhcnQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLlN0YXJ0KSA6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICBFbmQ6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDcmVhdGUnKS5FbmQgPyAkLmZ1bGxDYWxlbmRhci5tb21lbnQoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLkVuZCkgOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpLAogICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuUGx1Z2luS2V5ID8gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudENyZWF0ZScpLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgICAgICBTZWFyY2g6IENvcmUuQ29uZmlnLkdldCgnQXBwb2ludG1lbnRDcmVhdGUnKS5TZWFyY2ggPyBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuU2VhcmNoIDogbnVsbCwKICAgICAgICAgICAgICAgIE9iamVjdElEOiBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuT2JqZWN0SUQgPyBDb3JlLkNvbmZpZy5HZXQoJ0FwcG9pbnRtZW50Q3JlYXRlJykuT2JqZWN0SUQgOiBudWxsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQXV0byBvcGVuIGFwcG9pbnRtZW50IGVkaXQgc2NyZWVuCiAgICAgICAgZWxzZSBpZiAoQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudElEJykpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coeyBDYWxFdmVudDogeyBpZDogQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudElEJykgfSB9KTsKICAgICAgICB9CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpCiAgICAgICAgICAgIC5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKQogICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6ICQuZnVsbENhbGVuZGFyLm1vbWVudCgpLmFkZCgxLCAnaG91cnMnKS5zdGFydE9mKCdob3VyJyksCiAgICAgICAgICAgICAgICAgICAgRW5kOiAkLmZ1bGxDYWxlbmRhci5tb21lbnQoKS5hZGQoMiwgJ2hvdXJzJykuc3RhcnRPZignaG91cicpCiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICBDYWxlbmRhclNldHRpbmdzSW5pdCgpOwoKICAgICAgICBSZXNvdXJjZVNldHRpbmdzSW5pdCgpOwoKICAgICAgICAkKCcjVGVhbScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0NoYW5nZVRlYW1Gb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIENvcmUuVUkuVGFibGUuSW5pdFRhYmxlRmlsdGVyKCQoJyNGaWx0ZXJDYWxlbmRhcnMnKSwgJCgnI0NhbGVuZGFycycpKTsKCiAgICAgICAgQ2xpcGJvYXJkSlMub24oJ3N1Y2Nlc3MnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgJChFdmVudC50cmlnZ2VyKS5oaWRlKCkKICAgICAgICAgICAgICAgIC5mYWRlSW4oKTsKICAgICAgICAgICAgRXZlbnQuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICB9KTsKCiAgICAgICAgQ2xpcGJvYXJkSlMub24oJ2Vycm9yJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSW5pdFRvb2x0aXAoJChFdmVudC50cmlnZ2VyKSwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1ByZXNzIEN0cmwrQyAoQ21kK0MpIHRvIGNvcHkgdG8gY2xpcGJvYXJkJykpOwogICAgICAgICAgICAkKEV2ZW50LnRyaWdnZXIpLmZvY3VzKCk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIFNob3dEYXRlcGlja2VyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJENhbGVuZGFyT2JqIC0gQ2FsZW5kYXIgY29udHJvbCBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJERhdGVwaWNrZXJPYmogLSBEYXRlcGlja2VyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRKdW1wQnV0dG9uIC0gRGF0ZXBpY2tlciBidXR0b24gb2JqZWN0LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3cgZGF0ZSBwaWNrZXIgY29udHJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gU2hvd0RhdGVwaWNrZXIoJENhbGVuZGFyT2JqLCAkRGF0ZXBpY2tlck9iaiwgJEp1bXBCdXR0b24pIHsKICAgICAgICB2YXIgQ3VycmVudERhdGUgPSAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKCdnZXREYXRlJyksCiAgICAgICAgICAgIFllYXIgPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVknKSwKICAgICAgICAgICAgTW9udGggPSBDdXJyZW50RGF0ZS5mb3JtYXQoJ00nKTsKCiAgICAgICAgJCgnPGRpdiAvPicpLnByb3AoJ2lkJywgJ0RhdGVwaWNrZXJPdmVybGF5JykKICAgICAgICAgICAgLmFwcGVuZFRvKCQoJ2JvZHknKSkKICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmhpZGUoKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIEFwcG9pbnRtZW50RGF5cygkRGF0ZXBpY2tlck9iaiwgWWVhciwgTW9udGgpOwoKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKCdzZXREYXRlJywgQ3VycmVudERhdGUudG9EYXRlKCkpCiAgICAgICAgICAgIC5jc3MoewogICAgICAgICAgICAgICAgbGVmdDogcGFyc2VJbnQoJEp1bXBCdXR0b24ub2Zmc2V0KCkubGVmdCAtICREYXRlcGlja2VyT2JqLm91dGVyV2lkdGgoKSArICRKdW1wQnV0dG9uLm91dGVyV2lkdGgoKSwgMTApLAogICAgICAgICAgICAgICAgdG9wOiBwYXJzZUludCgkSnVtcEJ1dHRvbi5vZmZzZXQoKS50b3AgLSAkRGF0ZXBpY2tlck9iai5vdXRlckhlaWdodCgpICsgJEp1bXBCdXR0b24ub3V0ZXJIZWlnaHQoKSwgMTApCiAgICAgICAgICAgIH0pLmZhZGVJbignZmFzdCcpOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENoZWNrRGF0ZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge0RhdGVPYmplY3R9IERhdGVPYmplY3QgLSBBIEpTIGRhdGUgb2JqZWN0IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge0FycmF5fSBGaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0cnVlLCBzZWNvbmQgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIENTUwogICAgICogICAgICAgICAgICAgICAgICBjbGFzcywgdGhpcmQgZWxlbWVudCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgZGF0ZS4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBDaGVjayBpZiBkYXRlIGhhcyBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgZnVuY3Rpb24gQ2hlY2tEYXRlKERhdGVPYmplY3QpIHsKICAgICAgICB2YXIgRGF0ZU1vbWVudCA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChEYXRlT2JqZWN0KSwKICAgICAgICAgICAgRGF5QXBwb2ludG1lbnRzID0gQXBwb2ludG1lbnREYXlzQ2FjaGVbRGF0ZU1vbWVudC5mb3JtYXQoJ1lZWVktTU0tREQnKV0sCiAgICAgICAgICAgIERheUNsYXNzID0gRGF5QXBwb2ludG1lbnRzID8gJ0hpZ2hsaWdodCcgOiAnJywKICAgICAgICAgICAgRGF5RGVzY3JpcHRpb24gPSBEYXlBcHBvaW50bWVudHMgPyBEYXlBcHBvaW50bWVudHMudG9TdHJpbmcoKSA6ICcnOwoKICAgICAgICByZXR1cm4gW3RydWUsIERheUNsYXNzLCBEYXlEZXNjcmlwdGlvbl07CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQXBwb2ludG1lbnREYXlzCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJERhdGVwaWNrZXJPYmogLSBEYXRlcGlja2VyIGNvbnRyb2wgb2JqZWN0LgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBZZWFyIC0gU2VsZWN0ZWQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gTW9udGggLSBTZWxlY3RlZCBtb250aCAoMS0xMikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ2FjaGVzIHRoZSBsaXN0IG9mIGFwcG9pbnRtZW50IGRheXMgZm9yIGxhdGVyIHVzZS4KICAgICAqLwogICAgZnVuY3Rpb24gQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCkgewogICAgICAgIHZhciBTdGFydFRpbWUgPSAkLmZ1bGxDYWxlbmRhci5tb21lbnQoWWVhciArICctJyArIE1vbnRoLCAnWVlZWS1NJykuc3RhcnRPZignbW9udGgnKSwKICAgICAgICAgICAgRW5kVGltZSA9ICQuZnVsbENhbGVuZGFyLm1vbWVudChZZWFyICsgJy0nICsgTW9udGgsICdZWVlZLU0nKS5hZGQoMSwgJ21vbnRocycpLnN0YXJ0T2YoJ21vbnRoJyksCiAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdBcHBvaW50bWVudERheXMnLAogICAgICAgICAgICAgICAgU3RhcnRUaW1lOiBTdGFydFRpbWUuZm9ybWF0KCdZWVlZLU1NLUREJyksCiAgICAgICAgICAgICAgICBFbmRUaW1lOiBFbmRUaW1lLmZvcm1hdCgnWVlZWS1NTS1ERCcpCiAgICAgICAgICAgIH07CgogICAgICAgICREYXRlcGlja2VyT2JqLmFkZENsYXNzKCdBSkFYTG9hZGluZycpOwogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2U7CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzQ2FjaGUgPSBSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgJERhdGVwaWNrZXJPYmoucmVtb3ZlQ2xhc3MoJ0FKQVhMb2FkaW5nJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlZnJlc2ggdGhlIGRhdGUgcGlja2VyIGJlY2F1c2UgdGhpcyBjYWxsIGlzIGFzeW5jaHJvbm91cwogICAgICAgICAgICAgICAgICAgICREYXRlcGlja2VyT2JqLmRhdGVwaWNrZXIoJ3JlZnJlc2gnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBTaG93V2FpdGluZ0RpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFNob3dzIHdhaXRpbmcgZGlhbG9nLgogICAgICovCiAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZyA9IGZ1bmN0aW9uICgpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICQoJy5Nb2RhbC5EaWFsb2cuUGVyc2lzdGVudCcpLnJlbW92ZUNsYXNzKCdQZXJzaXN0ZW50Jyk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygnPGRpdiBjbGFzcz0iU3BhY2luZyBDZW50ZXIiPjxzcGFuIGNsYXNzPSJBSkFYTG9hZGVyIiB0aXRsZT0iJyArIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdMb2FkaW5nLi4uJykgKyAnIj48L3NwYW4+PC9kaXY+JywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0xvYWRpbmcuLi4nKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHVibGljCiAgICAgKiBAbmFtZSBPcGVuRWRpdERpYWxvZwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YSAtIEhhc2ggd2l0aCBhcHBvaW50bWVudCBkYXRhLgogICAgICogQHBhcmFtIHtNb21lbnR9IEFwcG9pbnRtZW50RGF0YS5TdGFydCAtIE1vbWVudCBvYmplY3Qgd2l0aCBzdGFydCBkYXRlL3RpbWUuCiAgICAgKiBAcGFyYW0ge01vbWVudH0gQXBwb2ludG1lbnREYXRhLkVuZCAtIE1vbWVudCBvYmplY3Qgd2l0aCBlbmQgZGF0ZS90aW1lLgogICAgICogQHBhcmFtIHtPYmplY3R9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAtIENhbGVuZGFyIGV2ZW50IG9iamVjdCAoRnVsbENhbGVuZGFyKS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgLSBDYWxlbmRhciByZXNvdXJjZSBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2Qgb3BlbnMgdGhlIGFwcG9pbnRtZW50IGRpYWxvZyBhZnRlciBzZWxlY3RpbmcgYSB0aW1lIHBlcmlvZCBvciBhbiBhcHBvaW50bWVudC4KICAgICAqLwogICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2cgPSBmdW5jdGlvbiAoQXBwb2ludG1lbnREYXRhKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICBTdWJhY3Rpb246ICdFZGl0TWFzaycsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0WWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5TdGFydC55ZWFyKCkgOiBudWxsLAogICAgICAgICAgICBTdGFydE1vbnRoOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgU3RhcnREYXk6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuU3RhcnQuZGF0ZSgpIDogbnVsbCwKICAgICAgICAgICAgU3RhcnRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0LmhvdXIoKSA6IG51bGwsCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLlN0YXJ0Lm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgRW5kWWVhcjogIUFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCA/IEFwcG9pbnRtZW50RGF0YS5FbmQueWVhcigpIDogbnVsbCwKICAgICAgICAgICAgRW5kTW9udGg6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1vbnRoKCkgKyAxIDogbnVsbCwKICAgICAgICAgICAgRW5kRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCkgOiBudWxsLAogICAgICAgICAgICBFbmRIb3VyOiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gQXBwb2ludG1lbnREYXRhLkVuZC5ob3VyKCkgOiBudWxsLAogICAgICAgICAgICBFbmRNaW51dGU6ICFBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgPyBBcHBvaW50bWVudERhdGEuRW5kLm1pbnV0ZSgpIDogbnVsbCwKICAgICAgICAgICAgQWxsRGF5OiAhQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50ID8gKEFwcG9pbnRtZW50RGF0YS5FbmQuaGFzVGltZSgpID8gJzAnIDogJzEnKSA6IG51bGwsCiAgICAgICAgICAgIFRlYW1JRDogQXBwb2ludG1lbnREYXRhLlJlc291cmNlID8gWyBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UuVGVhbUlEIF0gOiBudWxsLAogICAgICAgICAgICBSZXNvdXJjZUlEOiBBcHBvaW50bWVudERhdGEuUmVzb3VyY2UgPyBbIEFwcG9pbnRtZW50RGF0YS5SZXNvdXJjZS5pZCBdIDogbnVsbCwKICAgICAgICAgICAgUGx1Z2luS2V5OiBBcHBvaW50bWVudERhdGEuUGx1Z2luS2V5ID8gQXBwb2ludG1lbnREYXRhLlBsdWdpbktleSA6IG51bGwsCiAgICAgICAgICAgIFNlYXJjaDogQXBwb2ludG1lbnREYXRhLlNlYXJjaCA/IEFwcG9pbnRtZW50RGF0YS5TZWFyY2ggOiBudWxsLAogICAgICAgICAgICBPYmplY3RJRDogQXBwb2ludG1lbnREYXRhLk9iamVjdElEID8gQXBwb2ludG1lbnREYXRhLk9iamVjdElEIDogbnVsbAogICAgICAgIH07CgogICAgICAgIC8vIE1ha2UgZW5kIHRpbWUgZm9yIGFsbCBkYXkgYXBwb2ludG1lbnRzIGluY2x1c2l2ZQogICAgICAgIGlmIChEYXRhLkFsbERheSAmJiBEYXRhLkFsbERheSA9PT0gJzEnKSB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5FbmQuc3VidHJhY3QoMSwgJ2RheScpOwogICAgICAgICAgICBEYXRhLkVuZFllYXIgPSBBcHBvaW50bWVudERhdGEuRW5kLnllYXIoKTsKICAgICAgICAgICAgRGF0YS5FbmRNb250aCA9IEFwcG9pbnRtZW50RGF0YS5FbmQubW9udGgoKSArIDE7CiAgICAgICAgICAgIERhdGEuRW5kRGF5ID0gQXBwb2ludG1lbnREYXRhLkVuZC5kYXRlKCk7CiAgICAgICAgICAgIERhdGEuRW5kSG91ciA9IEFwcG9pbnRtZW50RGF0YS5FbmQuaG91cigpOwogICAgICAgICAgICBEYXRhLkVuZE1pbnV0ZSA9IEFwcG9pbnRtZW50RGF0YS5FbmQubWludXRlKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBFZGl0RGlhbG9nKCkgewogICAgICAgICAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgLy8gQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50JyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUw6IEhUTUwsCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgTW9kYWw6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlT25DbGlja091dHNpZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBDbG9zZU9uRXNjYXBlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzEwcHgnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgICAgICAgICBCdXR0b25zOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93QXV0b0dyb3c6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBlcnNpc3RlbnQ6IHRydWUKICAgICAgICAgICAgICAgICAgICB9KTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwoKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCgpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICdodG1sJwogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVwZWF0aW5nIGV2ZW50CiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudCAmJiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgIEhUTUw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nKSwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAvLyBDbG9zZU9uQ2xpY2tPdXRzaWRlOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogZmFsc2UsCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwgb2NjdXJyZW5jZXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7Ci8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVkaXREaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkaXREaWFsb2coZmFsc2UpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdXN0IHRoaXMgb2NjdXJyZW5jZScpLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzczogJ0NhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogRWRpdERpYWxvZwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlIHRoaXMgZGlhbG9nJykKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIEVkaXREaWFsb2coKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgVXBkYXRlQXBwb2ludG1lbnQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEgLSBIYXNoIHdpdGggYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQgLSBDYWxlbmRhciBldmVudCBvYmplY3QgKEZ1bGxDYWxlbmRhcikuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgdXBkYXRlcyB0aGUgYXBwb2ludG1lbnQgd2l0aCBzdXBwbGllZCBkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBVcGRhdGVBcHBvaW50bWVudChBcHBvaW50bWVudERhdGEpIHsKICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgIFN1YmFjdGlvbjogJ0VkaXRBcHBvaW50bWVudCcsCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5pZCwKICAgICAgICAgICAgU3RhcnRZZWFyOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQueWVhcigpLAogICAgICAgICAgICBTdGFydE1vbnRoOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubW9udGgoKSArIDEsCiAgICAgICAgICAgIFN0YXJ0RGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQuZGF0ZSgpLAogICAgICAgICAgICBTdGFydEhvdXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydC5ob3VyKCksCiAgICAgICAgICAgIFN0YXJ0TWludXRlOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuc3RhcnQubWludXRlKCksCiAgICAgICAgICAgIEVuZFllYXI6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpLAogICAgICAgICAgICBFbmRNb250aDogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMSwKICAgICAgICAgICAgRW5kRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKSwKICAgICAgICAgICAgRW5kSG91cjogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCksCiAgICAgICAgICAgIEVuZE1pbnV0ZTogQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKSwKICAgICAgICAgICAgQWxsRGF5OiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmhhc1RpbWUoKSA/ICcwJyA6ICcxJywKICAgICAgICAgICAgUmVjdXJyaW5nOiBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVjdXJyaW5nID8gJzEnIDogJzAnLAogICAgICAgICAgICBUZWFtSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC50ZWFtSWRzID8gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnRlYW1JZHMgOiB1bmRlZmluZWQsCiAgICAgICAgICAgIFJlc291cmNlSUQ6IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA/IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkcyA6CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucmVzb3VyY2VJZCA/IFsgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnJlc291cmNlSWQgXSA6IHVuZGVmaW5lZAogICAgICAgIH07CgogICAgICAgIC8vIEFzc2lnbmVkIHJlc291cmNlIGRpZG4ndCBjaGFuZ2UKICAgICAgICBpZiAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkCiAgICAgICAgICAgICYmIEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LnJlc291cmNlSWRzCiAgICAgICAgICAgICYmICQuaW5BcnJheSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5yZXNvdXJjZUlkLAogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHMKICAgICAgICAgICAgKSAhPT0gLTEKICAgICAgICApIHsKICAgICAgICAgICAgRGF0YS5SZXNvdXJjZUlEID0gQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQucmVzb3VyY2VJZHM7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBVcGRhdGUoKSB7Ci8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5DbG9zZURpYWxvZygkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVmZXRjaEV2ZW50cycpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5SZXZlcnRGdW5jKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSB0aGUgZGlhbG9nCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAkKCcuRGlhbG9nOnZpc2libGUnKS5yZW1vdmVDbGFzcygnUGVyc2lzdGVudCcpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLy8gTWFrZSBlbmQgdGltZSBmb3IgYWxsIGRheSBhcHBvaW50bWVudHMgaW5jbHVzaXZlCiAgICAgICAgaWYgKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5zdWJ0cmFjdCgxLCAnZGF5Jyk7CiAgICAgICAgICAgIERhdGEuRW5kWWVhciA9IEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5lbmQueWVhcigpOwogICAgICAgICAgICBEYXRhLkVuZE1vbnRoID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5tb250aCgpICsgMTsKICAgICAgICAgICAgRGF0YS5FbmREYXkgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQuZW5kLmRhdGUoKTsKICAgICAgICAgICAgRGF0YS5FbmRIb3VyID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5ob3VyKCk7CiAgICAgICAgICAgIERhdGEuRW5kTWludXRlID0gQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5taW51dGUoKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlcGVhdGluZyBldmVudAogICAgICAgIGlmIChBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQpIHsKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0RpYWxvZyh7CiAgICAgICAgICAgICAgICBUaXRsZTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnKSwKICAgICAgICAgICAgICAgIEhUTUw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXb3VsZCB5b3UgbGlrZSB0byBlZGl0IGp1c3QgdGhpcyBvY2N1cnJlbmNlIG9yIGFsbCBvY2N1cnJlbmNlcz8nKSwKICAgICAgICAgICAgICAgIE1vZGFsOiB0cnVlLAogICAgICAgICAgICAgICAgQ2xvc2VPbkNsaWNrT3V0c2lkZTogdHJ1ZSwKICAgICAgICAgICAgICAgIENsb3NlT25Fc2NhcGU6IHRydWUsCiAgICAgICAgICAgICAgICBQb3NpdGlvblRvcDogJzIwJScsCiAgICAgICAgICAgICAgICBQb3NpdGlvbkxlZnQ6ICdDZW50ZXInLAogICAgICAgICAgICAgICAgQnV0dG9uczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWw6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwgb2NjdXJyZW5jZXMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5IENhbGxGb3JBY3Rpb24nLAogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLkFwcG9pbnRtZW50SUQgPSBBcHBvaW50bWVudERhdGEuQ2FsRXZlbnQucGFyZW50SWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlJlY3VycmluZyA9ICcxJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuVXBkYXRlRGVsdGEgPSBBcHBvaW50bWVudERhdGEuRGVsdGEuYXNTZWNvbmRzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LnN0YXJ0LmRpZmYoQXBwb2ludG1lbnREYXRhLlByZXZpb3VzQXBwb2ludG1lbnQuc3RhcnQsICdzZWNvbmRzJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PT0gRGF0YS5VcGRhdGVEZWx0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnQm90aCc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudERhdGEuUHJldmlvdXNBcHBvaW50bWVudC5zdGFydC5kaWZmKEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5zdGFydCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnU3RhcnRUaW1lJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZURlbHRhID0gRGF0YS5VcGRhdGVEZWx0YSAqIC0xOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLkNhbEV2ZW50LmVuZC5kaWZmKEFwcG9pbnRtZW50RGF0YS5QcmV2aW91c0FwcG9pbnRtZW50LmVuZCwgJ3NlY29uZHMnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09PSBEYXRhLlVwZGF0ZURlbHRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLlVwZGF0ZVR5cGUgPSAnRW5kVGltZSc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1c3QgdGhpcyBvY2N1cnJlbmNlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzOiAnQ2FsbEZvckFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50RGF0YS5DYWxFdmVudC5wYXJlbnRJZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBUeXBlOiAnQ2xvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0Nsb3NlIHRoaXMgZGlhbG9nJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbigpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXRhLlJldmVydEZ1bmMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF0KICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVXBkYXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIENhbGVuZGFyU3dpdGNoSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgY2FsZW5kYXIgY2hlY2tib3ggYmVoYXZpb3IgYW5kIGxvYWRzIG11bHRpcGxlIGNhbGVuZGFycyB0byB0aGUKICAgICAqICAgICAgRnVsbENhbGVuZGFyIGNvbnRyb2wuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhbGVuZGFyU3dpdGNoSW5pdCgkQ2FsZW5kYXJTd2l0Y2gpIHsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBlbmFibGVkIHNvdXJjZXMKICAgICAgICBpZiAoJENhbGVuZGFyU3dpdGNoLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ2FkZEV2ZW50U291cmNlJywgQ2FsZW5kYXJTb3VyY2VzWyRDYWxlbmRhclN3aXRjaC5kYXRhKCdpZCcpXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBSZWdpc3RlciBjaGFuZ2UgZXZlbnQgaGFuZGxlcgogICAgICAgICRDYWxlbmRhclN3aXRjaC5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKCcuQ2FsZW5kYXJTd2l0Y2ggaW5wdXQ6Y2hlY2tlZCcpLmxlbmd0aCA+IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJMaW1pdCcpKSB7CiAgICAgICAgICAgICAgICAkQ2FsZW5kYXJTd2l0Y2gucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydChDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVG9vIG1hbnkgYWN0aXZlIGNhbGVuZGFycycpLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUGxlYXNlIGVpdGhlciB0dXJuIHNvbWUgb2ZmIGZpcnN0IG9yIGluY3JlYXNlIHRoZSBsaW1pdCBpbiBjb25maWd1cmF0aW9uLicpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIENhbGVuZGFyU3dpdGNoU291cmNlKCRDYWxlbmRhclN3aXRjaCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclN3aXRjaFNvdXJjZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRDYWxlbmRhclN3aXRjaCAtIGNhbGVuZGFyIGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgZW5hYmxlcy9kaXNhYmxlcyBjYWxlbmRhciBzb3VyY2UgaW4gRnVsbENhbGVuZGFyIGNvbnRyb2wgYW5kIHN0b3JlcwogICAgICogICAgICBzZWxlY3Rpb24gdG8gdXNlciBwcmVmZXJlbmNlcy4KICAgICAqLwogICAgZnVuY3Rpb24gQ2FsZW5kYXJTd2l0Y2hTb3VyY2UoJENhbGVuZGFyU3dpdGNoKSB7CiAgICAgICAgdmFyIENhbGVuZGFyU2VsZWN0aW9uID0gW107CgogICAgICAgIC8vIFNob3cvaGlkZSB0aGUgY2FsZW5kYXIgYXBwb2ludG1lbnRzCiAgICAgICAgaWYgKCRDYWxlbmRhclN3aXRjaC5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgJCgnI2NhbGVuZGFyJykuZnVsbENhbGVuZGFyKCdhZGRFdmVudFNvdXJjZScsIENhbGVuZGFyU291cmNlc1skQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICQoJyNjYWxlbmRhcicpLmZ1bGxDYWxlbmRhcigncmVtb3ZlRXZlbnRTb3VyY2UnLCAkQ2FsZW5kYXJTd2l0Y2guZGF0YSgnaWQnKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHZXQgYWxsIGNoZWNrZWQgY2FsZW5kYXJzCiAgICAgICAgJC5lYWNoKCQoJy5DYWxlbmRhclN3aXRjaCBpbnB1dDpjaGVja2VkJyksIGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICBDYWxlbmRhclNlbGVjdGlvbi5wdXNoKCQoRWxlbWVudCkuZGF0YSgnaWQnKSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFN0b3JlIHNlbGVjdGlvbiBpbiB1c2VyIHByZWZlcmVuY2VzCiAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIENhbGVuZGFyU2VsZWN0aW9uOiBKU09OLnN0cmluZ2lmeShDYWxlbmRhclNlbGVjdGlvbikKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBMb2NhdGlvbkxpbmtJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uT2JqIC0gbG9jYXRpb24gZmllbGQuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJExvY2F0aW9uTGlua3MgLSBsb2NhdGlvbiBsaW5rcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyBsb2NhdGlvbiBsaW5rIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0ID0gZnVuY3Rpb24gKCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpIHsKICAgICAgICB2YXIgTG9jYXRpb25WYWx1ZSA9ICRMb2NhdGlvbk9iai52YWwoKSB8fCAkTG9jYXRpb25PYmoudGV4dCgpOwoKICAgICAgICAkTG9jYXRpb25MaW5rcy5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICB2YXIgJExpbmtPYmogPSAkKEVsZW1lbnQpLAogICAgICAgICAgICAgICAgQmFzZVVSTCAgPSAkTGlua09iai5kYXRhKCdiYXNlVXJsJyk7CgogICAgICAgICAgICAvLyBVcGRhdGUgbGluayBVUkwgYW5kIHNob3cgaXQgaWYgbG9jYXRpb24gaXMgc2V0CiAgICAgICAgICAgIGlmIChMb2NhdGlvblZhbHVlLmxlbmd0aCA+IDAgJiYgTG9jYXRpb25WYWx1ZSAhPT0gJy0nKSB7CiAgICAgICAgICAgICAgICAkTGlua09iai5hdHRyKCdocmVmJywgQmFzZVVSTCArIGVuY29kZVVSSUNvbXBvbmVudChMb2NhdGlvblZhbHVlKSkKICAgICAgICAgICAgICAgICAgICAuZmFkZUluKCdmYXN0Jyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaGlkZSB0aGUgbGluawogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMaW5rT2JqLmZhZGVPdXQoJ2Zhc3QnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBSZWdpc3RlciBrZXkgdXAgZXZlbnQgaGFuZGxlcgogICAgICAgICRMb2NhdGlvbk9iai5vZmYoJ2tleXVwLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbigna2V5dXAuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBUYXJnZXROUy5Mb2NhdGlvbkxpbmtJbml0KCRMb2NhdGlvbk9iaiwgJExvY2F0aW9uTGlua3MpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgQWxsRGF5SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRBbGxEYXkgLSBhbGwgZGF5IGNoZWNrYm94IGVsZW1lbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIGRheSBjaGVja2JveCBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCA9IGZ1bmN0aW9uICgkQWxsRGF5KSB7CiAgICAgICAgaWYgKCQoJyNTdGFydE1vbnRoOmRpc2FibGVkJykubGVuZ3RoID4gMCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBTaG93L2hpZGUgdGhlIHN0YXJ0IGhvdXIvbWludXRlIGFuZCBjb21wbGV0ZSBlbmQgdGltZQogICAgICAgIGlmICgkQWxsRGF5LnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykudmFsKCcwJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpCiAgICAgICAgICAgICAgICAucHJvcCgncmVhZG9ubHknLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAkKCcjU3RhcnRIb3VyLCNTdGFydE1pbnV0ZSwjRW5kSG91ciwjRW5kTWludXRlJykKICAgICAgICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKQogICAgICAgICAgICAgICAgLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICAkQWxsRGF5Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkQWxsRGF5KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIFJlY3VycmluZ0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBGaWVsZHMgLSBBcnJheSB3aXRoIHJlZmVyZW5jZXMgdG8gcmVjdXJyaW5nIGZpZWxkcy4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmluZyAtIGZpZWxkIHdpdGggcmVjdXJyaW5nIGZsYWcuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVHlwZSAtIGRyb3AgZG93biB3aXRoIHJlY3VycmVuY2UgdHlwZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUgLSBSZWN1cnJlbmNlIHBhdHRlcm4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2IC0gQ3VzdG9tIHR5cGUgZHJvcC1kb3duCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0IC0gaW50ZXJ2YWwgdGV4dAogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiAtIGNvbnRhaW5zIHdlZWsgZGF5cyB0YWJsZQogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYgLSBjb250YWlucyBtb250aCBkYXlzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IC0gY29udGFpbnMgbW9udGhzIHRhYmxlCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYgLSBsYXllciB3aXRoIHJlY3VycmVuY2UgbGltaXQgZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0IC0gZHJvcCBkb3duIHdpdGggcmVjdXJyZW5jZSBsaW1pdCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSBjb3VudCBmaWVsZC4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdiAtIGxheWVyIHdpdGggcmVjY3VyZW5jZSB1bnRpbCBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkgLSBzZWxlY3QgZmllbGQgZm9yIHJlY2N1cmVuY2UgdW50aWwgZGF5LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHJlY3VycmVuY2UgZmllbGRzIGJlaGF2aW9yLgogICAgICovCiAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0ID0gZnVuY3Rpb24gKEZpZWxkcykgewoKICAgICAgICBmdW5jdGlvbiBSZWNJbml0KEZpZWxkcykgewogICAgICAgICAgICB2YXIgRGF5cyA9IFtdLAogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gW10sCiAgICAgICAgICAgICAgICBNb250aHMgPSBbXSwKICAgICAgICAgICAgICAgIEluZGV4OwoKICAgICAgICAgICAgaWYgKCQoJ2lucHV0I0RheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIERheXMgPSAkKCdpbnB1dCNEYXlzJykudmFsKCkuc3BsaXQoJywnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJCgnaW5wdXQjTW9udGhEYXlzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBNb250aERheXMgPSAkKCdpbnB1dCNNb250aERheXMnKS52YWwoKS5zcGxpdCgnLCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkKCdpbnB1dCNNb250aERheXMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIE1vbnRocyA9ICQoJ2lucHV0I01vbnRocycpLnZhbCgpLnNwbGl0KCcsJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoRGF5c1tJbmRleF0gIT0gIiIpIHsKICAgICAgICAgICAgICAgICAgICAkKCIjUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdiBidXR0b25bdmFsdWU9IiArIERheXNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBmb3IgKEluZGV4ID0gMDsgSW5kZXggPCBNb250aERheXMubGVuZ3RoOyBJbmRleCsrKSB7CiAgICAgICAgICAgICAgICBpZiAoTW9udGhEYXlzW0luZGV4XSAhPSAiIikgewogICAgICAgICAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b25bdmFsdWU9IiArIE1vbnRoRGF5c1tJbmRleF0gKyAiXSIpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciAoSW5kZXggPSAwOyBJbmRleCA8IE1vbnRocy5sZW5ndGg7IEluZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmIChNb250aHNbSW5kZXhdICE9ICIiKSB7CiAgICAgICAgICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uW3ZhbHVlPSIgKyBNb250aHNbSW5kZXhdICsgIl0iKQogICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoRmllbGRzLiRSZWN1cnJlbmNlVHlwZS52YWwoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmluZy52YWwoMCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwoKICAgICAgICAgICAgICAgIC8vIFNraXAgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZVR5cGUudmFsKCkgPT0gJ0N1c3RvbScpIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGVTdHJpbmdEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgIGlmIChGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlLnZhbCgpPT0iQ3VzdG9tRGFpbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUludGVydmFsVGV4dC5maW5kKCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAgICAgLmhpZGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuZW5kKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5UZXh0RGF5JykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21XZWVrbHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFdlZWsnKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS52YWwoKT09IkN1c3RvbU1vbnRobHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dE1vbnRoJykKICAgICAgICAgICAgICAgICAgICAgICAgLnNob3coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVR5cGUudmFsKCk9PSJDdXN0b21ZZWFybHkiKSB7CiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VJbnRlcnZhbFRleHQuZmluZCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5oaWRlKCkKICAgICAgICAgICAgICAgICAgICAgICAgLmVuZCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcuVGV4dFllYXInKQogICAgICAgICAgICAgICAgICAgICAgICAuc2hvdygpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUNvdW50RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdW1lIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5yZW1vdmVDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuc2hvdygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCB2YWxpZGF0aW9uIG9mIFJlY3VycmVuY2VVbnRpbCBmaWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEYXkuYWRkQ2xhc3MoJ1ZhbGlkYXRpb25JZ25vcmUnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwoKICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0Rpdik7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyaW5nLnZhbCgxKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2LnNob3coKTsKCiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdi5oaWRlKCk7CiAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2LmhpZGUoKTsKICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZUN1c3RvbVllYXJseURpdi5oaWRlKCk7CgogICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlTGltaXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ291bnREaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUgdmFsaWRhdGlvbiBvZiBSZWN1cnJlbmNlVW50aWwgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkcy4kUmVjdXJyZW5jZVVudGlsRGF5LnJlbW92ZUNsYXNzKCdWYWxpZGF0aW9uSWdub3JlJyk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVW50aWxEaXYuaGlkZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VDb3VudERpdi5zaG93KCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHZhbGlkYXRpb24gb2YgUmVjdXJyZW5jZVVudGlsIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZHMuJFJlY3VycmVuY2VVbnRpbERheS5hZGRDbGFzcygnVmFsaWRhdGlvbklnbm9yZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pLnRyaWdnZXIoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJyk7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKEZpZWxkcy4kUmVjdXJyZW5jZUxpbWl0RGl2KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlQ3VzdG9tVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5SZWN1cnJpbmdJbml0KEZpZWxkcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgRmllbGRzLiRSZWN1cnJlbmNlVHlwZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFJlY0luaXQoRmllbGRzKTsKICAgICAgICB9KS50cmlnZ2VyKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgTm90aWZpY2F0aW9uSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byByZW1pbmRlciBmaWVsZHMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiROb3RpZmljYXRpb24gLSBkcm9wIGRvd24gd2l0aCBzeXN0ZW0gbm90aWZpY2F0aW9uIHNlbGVjdGlvbi4KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiAtIGN1c3RvbSBzZWxlY3Rpb24gb2Ygc3lzdGVtIG5vdGlmaWNhdGlvbiBkYXRlCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgdGhlIHJlbWluZGVyIHNlY3Rpb24gYmVoYXZpb3IuCiAgICAgKi8KICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQgPSBmdW5jdGlvbiAoRmllbGRzKSB7CiAgICAgICAgdmFyIE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdiA9IEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2LmF0dHIoJ2lkJyk7CgogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvblRlbXBsYXRlLnZhbCgpICE9PSAnQ3VzdG9tJykgewoKICAgICAgICAgICAgLy8gaGlkZSB0aGUgY3VzdG9tIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5oaWRlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gY3VzdG9tIGZpZWxkIGlzIG5lZWRlZAogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0Rpdi5zaG93KCk7CgogICAgICAgICAgICAvLyBpbml0aWFsaXplIG1vZGVybiBmaWVsZHMgb24gY3VzdG9tIHNlbGVjdGlvbgogICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkluaXRTZWxlY3QoJCgnc2VsZWN0Lk1vZGVybml6ZScpKTsKICAgICAgICB9CgogICAgICAgIC8vIGRpc2FibGUgZW5hYmxlIHRoZSBkaWZmZXJlbnQgY3VzdG9tIGZpZWxkcwogICAgICAgIGlmIChGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcpKSB7CgogICAgICAgICAgICAvLyBlbmFibGUgcmVsYXRpdmUgZGF0ZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKCiAgICAgICAgICAgIC8vIGRpc2FibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lRGF5LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lSG91ci5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgLy8gZW5hYmxlIHRoZSBjdXN0b20gZGF0ZSB0aW1lIGlucHV0CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC52YWwoMSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZVllYXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKCcnKTsKICAgICAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnQucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgICAgICBGaWVsZHMuJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE86IFdvcmthcm91bmQgZm9yIElucHV0RmllbGRzIGJ1ZyBpbiB0aGUgZnJhbWV3b3JrIChkaXNhYmxlZCBhdHRyaWJ1dGUgbm90IGNoZWNrZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24pCiAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5EZWFjdGl2YXRlKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKE5vdGlmaWNhdGlvbkN1c3RvbVN0cmluZ0RpdikpOwogICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTm90aWZpY2F0aW9uQ3VzdG9tU3RyaW5nRGl2KSk7CgogICAgICAgIC8vIFJlZ2lzdGVyIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25UZW1wbGF0ZS5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKCiAgICAgICAgRmllbGRzLiROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0Lm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKCiAgICAgICAgICAgIC8vIGhhbmRsZSByYWRpbyBidXR0b25zCiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dC5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gcHJvY2VzcyBjaGFuZ2VzCiAgICAgICAgICAgIFRhcmdldE5TLk5vdGlmaWNhdGlvbkluaXQoRmllbGRzKTsKICAgICAgICB9KTsKICAgIH0KCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIC8qKgogICAgICogQG5hbWUgVGlja2V0SW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtPYmplY3R9IEZpZWxkcyAtIEFycmF5IHdpdGggcmVmZXJlbmNlcyB0byB0aWNrZXQgY3JlYXRpb24gZmllbGRzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IEZpZWxkcy4kVGlja2V0IC0gZHJvcCBkb3duIHdpdGggc3lzdGVtIG5vdGlmaWNhdGlvbiBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gRmllbGRzLiRUaWNrZXRDdXN0b21TdHJpbmdEaXYgLSBjdXN0b20gc2VsZWN0aW9uIG9mIHN5c3RlbSB0aWNrZXQgZGF0ZQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIHRoZSB0aWNrZXQgY3JlYXRpb24gc2VjdGlvbiBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGlja2V0SW5pdCA9IGZ1bmN0aW9uIChGaWVsZHMpIHsKCiAgICAgICAgaWYgKEZpZWxkcy4kVGlja2V0VGVtcGxhdGUudmFsKCkgPT09ICcwJykgewoKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gZGl2Om5vdCguSGlkZGVuKScpLmhpZGUoKTsKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwnKS5oaWRlKCk7CgogICAgICAgICAgICAvLyBSZW1vdmUgbWFuZGF0b3J5IGFuZCB2YWxpZGF0ZSBjbGFzc2VzCiAgICAgICAgICAgICQoJy5UaWNrZXRUZW1wbGF0ZVNlbGVjdGlvbiB+IGRpdiA+IC5WYWxpZGF0ZV9SZXF1aXJlZCcpLmFkZENsYXNzKCdWYWxpZGF0ZV9JZl9BY3RpdmUnKS5yZW1vdmVDbGFzcygnVmFsaWRhdGVfUmVxdWlyZWQnKTsKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gZGl2Om5vdCguSGlkZGVuKScpLnNob3coKTsKICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwnKS5zaG93KCk7CgogICAgICAgICAgICBpZiAoRmllbGRzLiRUaWNrZXRUZW1wbGF0ZS52YWwoKSAhPT0gJ0N1c3RvbScpIHsKCiAgICAgICAgICAgICAgICAvLyBoaWRlIHRoZSBjdXN0b20gZmllbGRzCiAgICAgICAgICAgICAgICAkKCcuVGlja2V0VGVtcGxhdGVTZWxlY3Rpb24gfiBkaXYuQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lJykuaGlkZSgpOwogICAgICAgICAgICAgICAgJCgnLlRpY2tldFRlbXBsYXRlU2VsZWN0aW9uIH4gbGFiZWwuQXBwb2ludG1lbnRUaWNrZXRDdXN0b21UaW1lJykuaGlkZSgpOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gQWRkIG1hbmRhdG9yeSBhbmQgdmFsaWRhdGUgY2xhc3NlcwogICAgICAgICAgICAkKCcuVGlja2V0VGVtcGxhdGVTZWxlY3Rpb24gfiBkaXYgPiAuVmFsaWRhdGVfSWZfQWN0aXZlJykuYWRkQ2xhc3MoJ1ZhbGlkYXRlX1JlcXVpcmVkJykucmVtb3ZlQ2xhc3MoJ1ZhbGlkYXRlX0lmX0FjdGl2ZScpOwoKICAgICAgICAgICAgLy8gQmluZCBldmVudCB0byBjdXN0b21lciByYWRpbyBidXR0b24uCiAgICAgICAgICAgICQoJy5DdXN0b21lclRpY2tldFJhZGlvJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5wcm9wKCdjaGVja2VkJykpewoKICAgICAgICAgICAgICAgICAgICBsZXQgQ3VzdG9tZXJLZXkgPSAkKCcjQ3VzdG9tZXJLZXlfJyArJCh0aGlzKS52YWwoKSkudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLlJlbG9hZEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAvLyBCaW5kIGV2ZW50IHRvIGN1c3RvbWVyIHJlbW92ZSBidXR0b24uCiAgICAgICAgICAgICQoJy5DdXN0b21lclRpY2tldFJlbW92ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guUmVtb3ZlQ3VzdG9tZXJUaWNrZXQoJCh0aGlzKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBjdXN0b21lciB1c2VyIHNlYXJjaCBmaWVsZAogICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlLkluaXQoKTsKICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBtb2Rlcm4gZmllbGRzIG9uIGN1c3RvbSBzZWxlY3Rpb24KICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5Jbml0U2VsZWN0KCQoJ3NlbGVjdC5Nb2Rlcm5pemUnKSk7CgogICAgICAgICAgICAvLyBpbml0IHNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgJCgnLkN1c3RvbWVyVGlja2V0UmFkaW8nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKCQodGhpcykucHJvcCgnY2hlY2tlZCcpKXsKCiAgICAgICAgICAgICAgICAgICAgbGV0IEN1c3RvbWVyS2V5ID0gJCgnI0N1c3RvbWVyS2V5XycgKyQodGhpcykudmFsKCkpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5SZWxvYWRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgIH0KCiAgICAgICAgLy8gZGlzYWJsZSBlbmFibGUgdGhlIGRpZmZlcmVudCBjdXN0b20gZmllbGRzCiAgICAgICAgaWYgKEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dC5wcm9wKCdjaGVja2VkJykpIHsKCiAgICAgICAgICAgIC8vIGVuYWJsZSByZWxhdGl2ZSBkYXRlIGZpZWxkcwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQudmFsKDEpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50LnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwoKICAgICAgICAgICAgLy8gZGlzYWJsZSB0aGUgY3VzdG9tIGRhdGUgdGltZSBmaWVsZHMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnZhbCgnJyk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVZZWFyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVIb3VyLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAvLyBlbmFibGUgdGhlIGN1c3RvbSBkYXRlIHRpbWUgaW5wdXQKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnZhbCgxKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZURheS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbURhdGVUaW1lWWVhci5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUhvdXIucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGUucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBkaXNhYmxlIHJlbGF0aXZlIGRhdGUgZmllbGRzCiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dC52YWwoJycpOwogICAgICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudC5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0LnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CiAgICAgICAgICAgIEZpZWxkcy4kVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gUmVnaXN0ZXIgY2hhbmdlIGV2ZW50IGhhbmRsZXIKICAgICAgICBGaWVsZHMuJFRpY2tldFRlbXBsYXRlLm9mZignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2hhbmdlLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbVJlbGF0aXZlSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICBGaWVsZHMuJFRpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQub2ZmKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicpLm9uKCdjaGFuZ2UuQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uKCkgewoKICAgICAgICAgICAgLy8gaGFuZGxlIHJhZGlvIGJ1dHRvbnMKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21EYXRlVGltZUlucHV0LnByb3AoJ2NoZWNrZWQnLCB0cnVlKTsKICAgICAgICAgICAgRmllbGRzLiRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0LnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7CgogICAgICAgICAgICAvLyBwcm9jZXNzIGNoYW5nZXMKICAgICAgICAgICAgVGFyZ2V0TlMuVGlja2V0SW5pdChGaWVsZHMpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBCaW5kIGZvcm0gdXBkYXRlIGV2ZW50IHRvIGZpZWxkcwogICAgICAgIHZhciBBSkFYVXBkYXRlRmllbGRzID0gWydUeXBlSUQnLCAnRGVzdCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCddLAogICAgICAgICAgICBNb2RpZmllZEZpZWxkczsKICAgICAgICAkLmVhY2goQUpBWFVwZGF0ZUZpZWxkcywgZnVuY3Rpb24oSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgIE1vZGlmaWVkRmllbGRzID0gQ29yZS5EYXRhLkNvcHlPYmplY3QoQUpBWFVwZGF0ZUZpZWxkcykuY29uY2F0KENvcmUuQ29uZmlnLkdldCgnRHluYW1pY0ZpZWxkTmFtZXMnKSk7CiAgICAgICAgICAgIE1vZGlmaWVkRmllbGRzLnNwbGljZShJbmRleCwgMSk7CgogICAgICAgICAgICBGaWVsZFVwZGF0ZShWYWx1ZSwgTW9kaWZpZWRGaWVsZHMpOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEZpZWxkVXBkYXRlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5UaWNrZXRQaG9uZS5Jbml0CiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBWYWx1ZSAtIEZpZWxkSUQKICAgICAqIEBwYXJhbSB7QXJyYXl9IE1vZGlmaWVkRmllbGRzIC0gRmllbGRzCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgQ3JlYXRlIG9uIGNoYW5nZSBldmVudCBoYW5kbGVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIEZpZWxkVXBkYXRlIChWYWx1ZSwgTW9kaWZpZWRGaWVsZHMpIHsKICAgICAgICAkKCcjJyArIFZhbHVlKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpLCAnQUpBWFVwZGF0ZScsIFZhbHVlLCBNb2RpZmllZEZpZWxkcyk7CiAgICAgICAgfSk7CgogICAgfQovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgLyoqCiAgICAgKiBAbmFtZSBUZWFtSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgdGVhbXMuCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlSURPYmogLSBmaWVsZCB3aXRoIGxpc3Qgb2YgcmVzb3VyY2VzLgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRUZWFtVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHRlYW0uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFJlc291cmNlVmFsdWVPYmogLSBmaWVsZCB3aXRoIHJlYWQgb25seSB2YWx1ZXMgZm9yIHJlc291cmNlcy4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyB0ZWFtIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuVGVhbUluaXQgPSBmdW5jdGlvbiAoJFRlYW1JRE9iaiwgJFJlc291cmNlSURPYmosICRUZWFtVmFsdWVPYmosICRSZXNvdXJjZVZhbHVlT2JqKSB7CiAgICAgICAgJFRlYW1JRE9iai5vZmYoJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NoYW5nZS5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1RlYW1Vc2VyTGlzdCcsCiAgICAgICAgICAgICAgICBUZWFtSUQ6ICRUZWFtSURPYmoudmFsKCkKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIHRydWUpOwoKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICBEYXRhLAogICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFNlbGVjdGVkSUQgPSAkUmVzb3VyY2VJRE9iai52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuVGVhbVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLmVtcHR5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXNwb25zZS5UZWFtVXNlckxpc3QsIGZ1bmN0aW9uIChJbmRleCwgVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBOZXdPcHRpb24gPSBuZXcgT3B0aW9uKFZhbHVlLCBJbmRleCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT3ZlcndyaXRlIG9wdGlvbiB0ZXh0LCBiZWNhdXNlIG9mIHdyb25nIGh0bWwgcXVvdGluZyBvZiB0ZXh0IGNvbnRlbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAoVGhpcyBpcyBuZWVkZWQgZm9yIElFLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ld09wdGlvbi5pbm5lckhUTUwgPSBDb3JlLkFwcC5Fc2NhcGVIVE1MKFZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNlbGVjdGVkSUQgJiYgU2VsZWN0ZWRJRC5pbmRleE9mKEluZGV4KSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3T3B0aW9uLnNlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVzb3VyY2VJRE9iai5hcHBlbmQoTmV3T3B0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGN1c3RvbSByZWRyYXcgZXZlbnQgZm9yIElucHV0RmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgICRSZXNvdXJjZUlET2JqLnRyaWdnZXIoJ3JlZHJhdy5JbnB1dEZpZWxkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIFRvZ2dsZUFKQVhMb2FkZXIoJFJlc291cmNlSURPYmosIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICB9KTsKCiAgICAgICAgZnVuY3Rpb24gQ29sbGFwc2VWYWx1ZXMoJFZhbHVlT2JqLCBWYWx1ZXMpIHsKICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJycpOwogICAgICAgICAgICAkLmVhY2goVmFsdWVzLCBmdW5jdGlvbiAoSW5kZXgsIFZhbHVlKSB7CiAgICAgICAgICAgICAgICB2YXIgQ291bnQgPSBWYWx1ZXMubGVuZ3RoLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBJbmRleCA9ICQoJy5EaWFsb2cnKS5jc3MoJ3otaW5kZXgnKTsKCiAgICAgICAgICAgICAgICBpZiAoSW5kZXggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlT2JqLmh0bWwoJFZhbHVlT2JqLmh0bWwoKSArIFZhbHVlICsgJzxicj4nKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVmFsdWVzLnNwbGljZSgtQ291bnQsIDIpOwogICAgICAgICAgICAgICAgICAgICQoJzxhIC8+JykuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdEaWFsb2dUb29sdGlwTGluaycpCiAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCcrJXMgbW9yZScsIENvdW50LTIpKQogICAgICAgICAgICAgICAgICAgICAgICAub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgJFRvb2x0aXBPYmosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWCA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEhUTUwgPSAnPHA+JyArIFZhbHVlcy5qb2luKCc8YnI+JykgKyAnPC9wPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnRWaXNpYmxlTGVmdCA9ICQoZG9jdW1lbnQpLnNjcm9sbExlZnQoKSArICQod2luZG93KS53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZVRvcCA9ICQoZG9jdW1lbnQpLnNjcm9sbFRvcCgpICsgJCh3aW5kb3cpLmhlaWdodCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RYUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdFlQb3NpdGlvbjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9zZSBleGlzdGluZyB0b29sdGlwcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZ1Rvb2x0aXAnKS5yZW1vdmUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoRXZlbnQucGFnZVggfHwgRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQucGFnZVg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IEV2ZW50LnBhZ2VZOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFdmVudC5jbGllbnRYIHx8IEV2ZW50LmNsaWVudFkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gRXZlbnQuY2xpZW50WCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NZICs9IDU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUb29sdGlwSW5kZXggIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9vbHRpcEluZGV4ID0gcGFyc2VJbnQoVG9vbHRpcEluZGV4LCAxMCkgKyA1MDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvb2x0aXBJbmRleCA9IDQwMDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRvb2x0aXAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iaiA9ICQoJzxkaXYvPicpLmFkZENsYXNzKCdBcHBvaW50bWVudFRvb2x0aXAgRGlhbG9nVG9vbHRpcCBIaWRkZW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFBvc1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQ6IFBvc1gKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKFRvb2x0aXBIVE1MKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jc3MoJ3otaW5kZXgnLCBUb29sdGlwSW5kZXgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNzcygnd2lkdGgnLCAnYXV0bycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9mZignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCdib2R5Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIHRvcCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFlQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZVRvcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvc1kgPSBQb3NZIC0gJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmUtY2FsY3VsYXRlIGxlZnQgcG9zaXRpb24gaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTGFzdFhQb3NpdGlvbiA+IERvY3VtZW50VmlzaWJsZUxlZnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NYID0gUG9zWCAtICRUb29sdGlwT2JqLndpZHRoKCkgLSAzMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2hvdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdG9vbHRpcCBvbiBhbnkgb3V0c2lkZSBjbGljawogICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnLkNsb3NlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISQoRXZlbnQudGFyZ2V0KS5jbG9zZXN0KCcuRGlhbG9nVG9vbHRpcExpbmsnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy5EaWFsb2dUb29sdGlwJykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJFZhbHVlT2JqKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29sbGFwc2UgcmVhZCBvbmx5IHZhbHVlcwogICAgICAgIGlmICgkVGVhbVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkVGVhbVZhbHVlT2JqLCAkVGVhbVZhbHVlT2JqLmh0bWwoKS5zcGxpdCgnPGJyPicpKTsKICAgICAgICB9CiAgICAgICAgaWYgKCRSZXNvdXJjZVZhbHVlT2JqLmxlbmd0aCkgewogICAgICAgICAgICBDb2xsYXBzZVZhbHVlcygkUmVzb3VyY2VWYWx1ZU9iaiwgJFJlc291cmNlVmFsdWVPYmouaHRtbCgpLnNwbGl0KCc8YnI+JykpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDYWxlbmRhclNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGNhbGVuZGFyIHNldHRpbmdzIGJlaGF2aW9yLgogICAgICovCiAgICBmdW5jdGlvbiBDYWxlbmRhclNldHRpbmdzSW5pdCgpIHsKICAgICAgICB2YXIgJENhbGVuZGFyU2V0dGluZ3NPYmogPSAkKCcjQ2FsZW5kYXJTZXR0aW5nc0J1dHRvbicpLAogICAgICAgICAgICBDYWxlbmRhclNldHRpbmdzRGlhbG9nSFRNTDsKCiAgICAgICAgaWYgKCEkQ2FsZW5kYXJTZXR0aW5nc09iai5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgQ2FsZW5kYXJTZXR0aW5nc0RpYWxvZ0hUTUwgPSBDb3JlLlRlbXBsYXRlLlJlbmRlcignQWdlbnQvQXBwb2ludG1lbnRDYWxlbmRhci9DYWxlbmRhclNldHRpbmdzRGlhbG9nJywgewogICAgICAgICAgICAnU2hvd25BcHBvaW50bWVudHNTdHJnJzogQ29yZS5Db25maWcuR2V0KCdTaG93bkFwcG9pbnRtZW50c1N0cmcnKQogICAgICAgIH0pOwoKICAgICAgICAvLyBDYWxlbmRhciBzZXR0aW5ncyBidXR0b24KICAgICAgICAkQ2FsZW5kYXJTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhDYWxlbmRhclNldHRpbmdzRGlhbG9nSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkU2hvd25BcHBvaW50bWVudHMgPSAkKCcjU2hvd25BcHBvaW50bWVudHMnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVydmlld1NjcmVlbjogQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpID8gQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpIDogJ0NhbGVuZGFyT3ZlcnZpZXcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG93bkFwcG9pbnRtZW50czogJFNob3duQXBwb2ludG1lbnRzLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSArICdBY3Rpb249QWdlbnRBcHBvaW50bWVudCcgKyAoQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpID8gQ29yZS5Db25maWcuR2V0KCdPdmVydmlld1NjcmVlbicpIDogJ0NhbGVuZGFyT3ZlcnZpZXcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2hvdyBzZXR0aW5ncyBkaWFsb2cgaW1tZWRpYXRlbHkKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclNldHRpbmdzU2hvdycpKSB7CiAgICAgICAgICAgICRDYWxlbmRhclNldHRpbmdzT2JqLnRyaWdnZXIoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgUmVzb3VyY2VTZXR0aW5nc0luaXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIG1ldGhvZCBpbml0aWFsaXplcyByZXNvdXJjZSBzZXR0aW5ncyBiZWhhdmlvci4KICAgICAqLwogICAgZnVuY3Rpb24gUmVzb3VyY2VTZXR0aW5nc0luaXQoKSB7CiAgICAgICAgdmFyICRSZXNvdXJjZVNldHRpbmdzT2JqID0gJCgnI1Jlc291cmNlU2V0dGluZ3NCdXR0b24nKSwKICAgICAgICAgICAgUmVzb3VyY2VTZXR0aW5nc0RpYWxvZ0hUTUw7CgogICAgICAgIGlmICghJFJlc291cmNlU2V0dGluZ3NPYmoubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIFJlc291cmNlU2V0dGluZ3NEaWFsb2dIVE1MID0gQ29yZS5UZW1wbGF0ZS5SZW5kZXIoJ0FnZW50L0FwcG9pbnRtZW50Q2FsZW5kYXIvUmVzb3VyY2VTZXR0aW5nc0RpYWxvZycsIENvcmUuQ29uZmlnLkdldCgnU2hvd25SZXNvdXJjZVNldHRpbmdzJykpOwoKICAgICAgICAvLyBSZXNvdXJjZSBzZXR0aW5ncyBidXR0b24KICAgICAgICAkUmVzb3VyY2VTZXR0aW5nc09iai5vZmYoJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInKS5vbignY2xpY2suQXBwb2ludG1lbnRDYWxlbmRhcicsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhSZXNvdXJjZVNldHRpbmdzRGlhbG9nSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NldHRpbmdzJyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M6ICdQcmltYXJ5JywKICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciAkTGlzdENvbnRhaW5lciA9ICQoJy5BbGxvY2F0aW9uTGlzdENvbnRhaW5lcicpLmZpbmQoJy5Bc3NpZ25lZEZpZWxkcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNob3duUmVzb3VyY2VzID0gW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ1VwZGF0ZVByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVhbUlEOiAkKCcjVGVhbScpLnZhbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJExpc3RDb250YWluZXIpICYmICRMaXN0Q29udGFpbmVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaCgkTGlzdENvbnRhaW5lci5maW5kKCdsaScpLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvd25SZXNvdXJjZXMucHVzaCgkKHRoaXMpLmF0dHIoJ2RhdGEtZmllbGRuYW1lJykpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YS5TaG93blJlc291cmNlcyA9IEpTT04uc3RyaW5naWZ5KFNob3duUmVzb3VyY2VzKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFSZXNwb25zZS5TdWNjZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgXSwgdHJ1ZSk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIENvcmUuQWdlbnQuVGFibGVGaWx0ZXJzLlNldEFsbG9jYXRpb25MaXN0KCk7CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfSk7CgogICAgICAgIC8vIEluaXRpYWxpemUgcmVzdG9yZSBzZXR0aW5ncyBidXR0b24uCiAgICAgICAgUmVzdG9yZURlZmF1bHRTZXR0aW5nc0luaXQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBSZXNvdXJjZVNldHRpbmdzSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFkZHMgcmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzIGJ1dHRvbiAodHJhc2ggY2FuKSB0byB2aWV3IGFuZCBpbml0aWFsaXplcyBpdHMgYmVoYXZpb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJlc3RvcmVEZWZhdWx0U2V0dGluZ3NJbml0KCkgewogICAgICAgIHZhciAkUmVzdG9yZVNldHRpbmdzT2JqOwoKICAgICAgICAvLyBTa2lwIGlmIGJ1dHRvbiBpcyBub3QgbmVlZGVkIG9yIHdlIGFscmVhZHkgaGF2ZSBvbmUuCiAgICAgICAgaWYgKAogICAgICAgICAgICAhQ29yZS5Db25maWcuR2V0KCdSZXN0b3JlRGVmYXVsdFNldHRpbmdzJykKICAgICAgICAgICAgfHwgJCgnI1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKS5sZW5ndGggPiAwCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIENyZWF0ZSB0aGUgYnV0dG9uLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmogPSAkKCc8YSAvPicpLmF0dHIoJ2lkJywgJ1Jlc3RvcmVEZWZhdWx0U2V0dGluZ3MnKQogICAgICAgICAgICAuYXR0cignaHJlZicsICcjJykKICAgICAgICAgICAgLmF0dHIoJ3RpdGxlJywgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1Jlc3RvcmUgZGVmYXVsdCBzZXR0aW5ncycpKQogICAgICAgICAgICAuYXBwZW5kKCQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLXRyYXNoJykpOwoKICAgICAgICAvLyBBZGQgaXQgdG8gdGhlIGNvbHVtbiBoZWFkZXIuCiAgICAgICAgJCgndHIuZmMtc3VwZXIgKyB0ciAuZmMtY2VsbC1jb250ZW50JykuYXBwZW5kKCRSZXN0b3JlU2V0dGluZ3NPYmopOwoKICAgICAgICAvLyBSZWdpc3RlciBjbGljayBoYW5kbGVyLgogICAgICAgICRSZXN0b3JlU2V0dGluZ3NPYmoub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRFZGl0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdVcGRhdGVQcmVmZXJlbmNlcycsCiAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdSZXNvdXJjZU92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzOiAnU2hvd25SZXNvdXJjZXMnLAogICAgICAgICAgICAgICAgICAgIFRlYW1JRDogJCgnI1RlYW0nKS52YWwoKQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIGlmICghUmVzcG9uc2UuU3VjY2VzcykgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24ucmVsb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBUb2dnbGVBSkFYTG9hZGVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCAtIE9iamVjdCByZWZlcmVuY2Ugb2YgdGhlIGZpZWxkIHdoaWNoIGlzIHVwZGF0ZWQKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gU2hvdyAtIFNob3cgb3IgaGlkZSB0aGUgQUpBWCBsb2FkZXIgaW1hZ2UKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBTaG93cyBhbmQgaGlkZXMgYW4gYWpheCBsb2FkZXIgZm9yIGV2ZXJ5IGVsZW1lbnQgd2hpY2ggaXMgdXBkYXRlcyB2aWEgYWpheC4KICAgICAqLwogICAgZnVuY3Rpb24gVG9nZ2xlQUpBWExvYWRlcigkRWxlbWVudCwgU2hvdykgewogICAgICAgIHZhciAkTG9hZGVyID0gJCgnI0FKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSksCiAgICAgICAgICAgIExvYWRlckhUTUwgPSAnPHNwYW4gaWQ9IkFKQVhMb2FkZXInICsgJEVsZW1lbnQuYXR0cignaWQnKSArICciIGNsYXNzPSJBSkFYTG9hZGVyIj48L3NwYW4+JzsKCiAgICAgICAgLy8gRWxlbWVudCBub3QgcHJlc2VudAogICAgICAgIGlmICghJEVsZW1lbnQubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFNob3cgb3IgaGlkZSB0aGUgbG9hZGVyCiAgICAgICAgaWYgKFNob3cpIHsKICAgICAgICAgICAgaWYgKCEkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoTG9hZGVySFRNTCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkTG9hZGVyLnNob3coKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICgkTG9hZGVyLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJExvYWRlci5oaWRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbmFtZSBQbHVnaW5Jbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJFBsdWdpbkZpZWxkcyAtIGZpZWxkcyB3aXRoIGRpZmZlcmVudCBwbHVnaW4gc2VhcmNoZXMuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgcGx1Z2luIGZpZWxkcyBiZWhhdmlvci4KICAgICAqLwogICAgVGFyZ2V0TlMuUGx1Z2luSW5pdCA9IGZ1bmN0aW9uICgkUGx1Z2luRmllbGRzKSB7CgogICAgICAgIGZ1bmN0aW9uIEluaXRSZW1vdmVCdXR0b25zKCkgewogICAgICAgICAgICAkKCcuUmVtb3ZlQnV0dG9uJykub2ZmKCdjbGljay5BcHBvaW50bWVudENhbGVuZGFyJykub24oJ2NsaWNrLkFwcG9pbnRtZW50Q2FsZW5kYXInLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgJFJlbW92ZU9iaiA9ICQodGhpcyksCiAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5ID0gJFJlbW92ZU9iai5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgICAgIFBsdWdpbkRhdGEgPSBKU09OLnBhcnNlKCRQbHVnaW5EYXRhT2JqLnZhbCgpKSwKICAgICAgICAgICAgICAgICAgICBMaW5rSUQgPSAkUmVtb3ZlT2JqLmRhdGEoJ2xpbmtJZCcpLnRvU3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgJFBhcmVudCA9ICRSZW1vdmVPYmoucGFyZW50KCk7CgogICAgICAgICAgICAgICAgUGx1Z2luRGF0YS5zcGxpY2UoUGx1Z2luRGF0YS5pbmRleE9mKExpbmtJRCksIDEpOwogICAgICAgICAgICAgICAgJFBsdWdpbkRhdGFPYmoudmFsKEpTT04uc3RyaW5naWZ5KFBsdWdpbkRhdGEpKTsKCiAgICAgICAgICAgICAgICAkUGFyZW50LnJlbW92ZSgpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBBZGRMaW5rKFBsdWdpbktleSwgUGx1Z2luVVJMLCBMaW5rSUQsIExpbmtOYW1lKSB7CiAgICAgICAgICAgIHZhciAkUGx1Z2luQ29udGFpbmVyT2JqID0gJCgnI1BsdWdpbkNvbnRhaW5lcl8nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUGx1Z2luS2V5KSksCiAgICAgICAgICAgICAgICAkUGx1Z2luRGF0YU9iaiA9ICQoJyNQbHVnaW5fJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFBsdWdpbktleSkpLAogICAgICAgICAgICAgICAgUGx1Z2luRGF0YSA9IEpTT04ucGFyc2UoJFBsdWdpbkRhdGFPYmoudmFsKCkpLAogICAgICAgICAgICAgICAgJEV4aXN0aW5nTGlua3MgPSAkUGx1Z2luQ29udGFpbmVyT2JqLmZpbmQoJy5MaW5rXycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihMaW5rSUQpKSwKICAgICAgICAgICAgICAgICRMaW5rQ29udGFpbmVyT2JqID0gJCgnPGRpdiAvPicpLAogICAgICAgICAgICAgICAgJFVSTE9iaiA9ICQoJzxhIC8+JyksCiAgICAgICAgICAgICAgICAkUmVtb3ZlT2JqID0gJCgnPGEgLz4nKSwKICAgICAgICAgICAgICAgIExpbmtVUkwgPSBQbHVnaW5VUkwucmVwbGFjZSgnJXMnLCBMaW5rSUQpOwoKICAgICAgICAgICAgaWYgKCRFeGlzdGluZ0xpbmtzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgUGx1Z2luRGF0YS5wdXNoKExpbmtJRCk7CiAgICAgICAgICAgICRQbHVnaW5EYXRhT2JqLnZhbChKU09OLnN0cmluZ2lmeShQbHVnaW5EYXRhKSk7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hZGRDbGFzcygnTGlua18nICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoTGlua0lEKSk7CgogICAgICAgICAgICAkVVJMT2JqLmF0dHIoJ2hyZWYnLCBMaW5rVVJMKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKQogICAgICAgICAgICAgICAgLnRleHQoTGlua05hbWUpCiAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJExpbmtDb250YWluZXJPYmopOwoKICAgICAgICAgICAgJFJlbW92ZU9iai5hdHRyKCdocmVmJywgJyMnKQogICAgICAgICAgICAgICAgLmFkZENsYXNzKCdSZW1vdmVCdXR0b24nKQogICAgICAgICAgICAgICAgLmRhdGEoJ3BsdWdpbktleScsIFBsdWdpbktleSkKICAgICAgICAgICAgICAgIC5kYXRhKCdsaW5rSWQnLCBMaW5rSUQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICQoJzxpIC8+JykuYWRkQ2xhc3MoJ2ZhIGZhLW1pbnVzLXNxdWFyZS1vJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hcHBlbmRUbygkUGx1Z2luQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgICAgICB9CgogICAgICAgICRQbHVnaW5GaWVsZHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgIFBsdWdpblVSTCA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpblVybCcpOwoKICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGluaXRpYWxpemVkIGZpZWxkcwogICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ3VpLWF1dG9jb21wbGV0ZS1pbnB1dCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBSkFYTnVtYmVyID0gKytBSkFYQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0gKyAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiAyMAogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAnQXV0b0NvbXBsZXRlWEhSJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBmcm9tIHRoZSBsYXRlc3QgYWpheCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFKQVhDb3VudGVyICE9PSBDdXJyZW50QUpBWE51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogIHRoaXMuS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJykudHJpZ2dlcignc2VsZWN0LkF1dG9jb21wbGV0ZScpOwogICAgICAgICAgICAgICAgQWRkTGluayhQbHVnaW5LZXksIFBsdWdpblVSTCwgVUkuaXRlbS5rZXksIFVJLml0ZW0ubGFiZWwpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwgUGx1Z2luS2V5KTsKICAgICAgICB9KTsKCiAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEVkaXRBcHBvaW50bWVudAogICAgICogQHBhcmFtIHtPYmplY3R9IERhdGEgLSBIYXNoIHdpdGggY2FsbCBhbmQgYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BcHBvaW50bWVudElEIC0gQXBwb2ludG1lbnQgSUQuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQWN0aW9uIC0gRWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3ViYWN0aW9uIC0gRWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuVGl0bGUgLSBBcHBvaW50bWVudCB0aXRsZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5EZXNjcmlwdGlvbiAtIEFwcG9pbnRtZW50IGRlc2NyaXB0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkxvY2F0aW9uIC0gQXBwb2ludG1lbnQgbG9jYXRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRZZWFyIC0gQXBwb2ludG1lbnQgc3RhcnQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1vbnRoIC0gQXBwb2ludG1lbnQgc3RhcnQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnREYXkgLSBBcHBvaW50bWVudCBzdGFydCBkYXkuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRIb3VyIC0gQXBwb2ludG1lbnQgc3RhcnQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1pbnV0ZSAtIEFwcG9pbnRtZW50IHN0YXJ0IG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRZZWFyIC0gQXBwb2ludG1lbnQgZW5kIHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTW9udGggLSBBcHBvaW50bWVudCBlbmQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kRGF5IC0gQXBwb2ludG1lbnQgZW5kIGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRIb3VyIC0gQXBwb2ludG1lbnQgZW5kIGhvdXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTWludXRlIC0gQXBwb2ludG1lbnQgZW5kIG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BbGxEYXkgLSBJcyBhcHBvaW50bWVudCBhbiBhbGwtZGF5IGFwcG9pbnRtZW50ICgwfDEpPwogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIHN1Ym1pdHMgYW4gZWRpdCBhcHBvaW50bWVudCBjYWxsIHRvIHRoZSBiYWNrZW5kIGFuZCByZWZyZXNoZXMgdGhlIHZpZXcuCiAgICAgICovCiAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQgPSBmdW5jdGlvbiAoRGF0YSkgewogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JykgewogICAgICAgICAgICAkKCcuT3ZlcnZpZXdDb250cm9sJykuYWRkQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlZmV0Y2hFdmVudHMnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgZnVuY3Rpb25hbGl0aWVzIGZvciBBZ2VudEFwcG9pbnRtZW50QWdlbnRPdmVydmlldyBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Jyk7CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPSAkTWFzdGVyQWN0aW9uTGluay5kYXRhKCdhcHBvaW50bWVudElkJyk7CgogICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coewogICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IHsKICAgICAgICAgICAgICAgICAgICBpZDogQXBwb2ludG1lbnRJRAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGZ1bmN0aW9uYWxpdGllcyBmb3IgQWdlbnRBcHBvaW50bWVudEVkaXQgc2NyZWVuLgogICAgICovCiAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuSW5pdCgpOwogICAgICAgIFRhcmdldE5TLkxvY2F0aW9uTGlua0luaXQoJCgnI0xvY2F0aW9uJyksICQoJy5Mb2NhdGlvbkxpbmsnKSk7CiAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkKCcjQWxsRGF5JykpOwogICAgICAgIFRhcmdldE5TLlJlY3VycmluZ0luaXQoewogICAgICAgICAgICAkUmVjdXJyaW5nOiAkKCcjUmVjdXJyaW5nJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZTogJCgnI1JlY3VycmVuY2VUeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZTogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdjogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0OiAkKCcjUmVjdXJyZW5jZUludGVydmFsVGV4dCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2OiAkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXREaXY6ICQoJyNSZWN1cnJlbmNlTGltaXREaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdDogJCgnI1JlY3VycmVuY2VMaW1pdCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsRGl2OiAkKCcjUmVjdXJyZW5jZVVudGlsRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxEYXk6ICQoJyNSZWN1cnJlbmNlVW50aWxEYXknKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDb3VudERpdjogJCgnI1JlY3VycmVuY2VDb3VudERpdicpCiAgICAgICAgfSk7CiAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdCh7CiAgICAgICAgICAgICROb3RpZmljYXRpb25UZW1wbGF0ZTogJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXY6ICQoJyNOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWU6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCcpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXk6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheScpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyOiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlJykKICAgICAgICB9KTsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIFRhcmdldE5TLlRpY2tldEluaXQoewogICAgICAgICAgICAkVGlja2V0VGVtcGxhdGU6ICQoJyNUaWNrZXRUZW1wbGF0ZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tU3RyaW5nRGl2OiAkKCcjVGlja2V0Q3VzdG9tU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21DcmVhdGlvbkRpdjogJCgnI1RpY2tldEN1c3RvbUNyZWF0aW9uRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQ6ICQoJyNUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lOiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dDogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQnKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lRGF5OiAkKCcjVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXknKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lTW9udGg6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoJyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21EYXRlVGltZVllYXI6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZVllYXInKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lSG91cjogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSG91cicpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGU6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1pbnV0ZScpCiAgICAgICAgfSk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgIFRhcmdldE5TLlRlYW1Jbml0KCQoJyNUZWFtSUQnKSwgJCgnI1Jlc291cmNlSUQnKSwgJCgnbGFiZWxbZm9yPSJUZWFtSUQiXSArIGRpdi5GaWVsZCBwLlJlYWRPbmx5VmFsdWUnKSwgJCgnbGFiZWxbZm9yPSJSZXNvdXJjZUlEIl0gKyBkaXYuRmllbGQgcC5SZWFkT25seVZhbHVlJykpOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclBlcm1pc3Npb25MZXZlbCcpID4gMSkgewogICAgICAgICAgICBUYXJnZXROUy5QbHVnaW5Jbml0KCQoJy5QbHVnaW5GaWVsZCcpLCAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSk7CiAgICAgICAgfQoKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuU2V0U3VibWl0RnVuY3Rpb24oJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKSwgZnVuY3Rpb24gKEZvcm0pIHsKICAgICAgICAgICAgdmFyIERhdGEgPSBuZXcgT2JqZWN0KCksCiAgICAgICAgICAgICAgICBEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgICAgICAgICBNb250aERheXMgPSBuZXcgQXJyYXkoKSwKICAgICAgICAgICAgICAgIE1vbnRocyA9IG5ldyBBcnJheSgpOwoKICAgICAgICAgICAgLy8gc2VyaWFsaXplIGRheXMKICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIERheXMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoImlucHV0I0RheXMiKS52YWwoRGF5cy5qb2luKCkpOwoKICAgICAgICAgICAgLy8gc2VyaWFsaXplIG1vbnRoIGRheXMKICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBNb250aERheXMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoImlucHV0I01vbnRoRGF5cyIpLnZhbChNb250aERheXMuam9pbigpKTsKCiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBtb250aHMKICAgICAgICAgICAgJCgiI1JlY3VycmVuY2VDdXN0b21ZZWFybHlEaXYgYnV0dG9uLmZjLXN0YXRlLWFjdGl2ZSIpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgICAgIE1vbnRocy5wdXNoKCQodGhpcykudmFsKCkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgiaW5wdXQjTW9udGhzIikudmFsKE1vbnRocy5qb2luKCkpOwoKICAgICAgICAgICAgJChGb3JtKS5maW5kKCdpbnB1dCx0ZXh0YXJlYSxzZWxlY3QnKS5lYWNoKGZ1bmN0aW9uIChJbmRleCwgRWxlbWVudCkgewogICAgICAgICAgICAgICAgaWYgKEVsZW1lbnQudHlwZSA9PSAnY2hlY2tib3gnKSB7CiAgICAgICAgICAgICAgICAgICAgRGF0YVtFbGVtZW50LmlkXSA9ICQoRWxlbWVudCkucHJvcCgnY2hlY2tlZCcpID8gJzEnIDogJzAnOwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEVsZW1lbnQubmFtZSA9PSAnQ3VzdG9tZXJTZWxlY3RlZCcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIURhdGFbRWxlbWVudC5uYW1lXSAmJiAkKEVsZW1lbnQpLnByb3AoJ2NoZWNrZWQnKSkgewogICAgICAgICAgICAgICAgICAgICAgICBEYXRhW0VsZW1lbnQubmFtZV0gPSAkKEVsZW1lbnQpLnZhbCgpOwogICAgICAgICAgICAgICAgICAgIH0KLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBEYXRhW0VsZW1lbnQuaWRdID0gJChFbGVtZW50KS52YWwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBUYXJnZXROUy5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQoRGF0YSk7CiAgICAgICAgfSk7CgogICAgICAgICQoIi5CdXR0b25UYWJsZSBidXR0b24iKS5vbigiY2xpY2siLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCh0aGlzKS50b2dnbGVDbGFzcygiZmMtc3RhdGUtYWN0aXZlIik7CiAgICAgICAgfSk7CgogICAgICAgIC8vIER1cGxpY2F0ZSBhcHBvaW50bWVudAogICAgICAgICQoJyNFZGl0Rm9ybUNvcHknKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gUmVzZXQgQXBwb2ludG1lbnRJRCwgcmVtb3ZlIENvcHkgJiBEZWxldGUgYnV0dG9ucwogICAgICAgICAgICAkKCIjRWRpdEFwcG9pbnRtZW50Rm9ybSBpbnB1dCNBcHBvaW50bWVudElEIikudmFsKCIiKTsKICAgICAgICAgICAgJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKS5zdWJtaXQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU2F2ZSB0aGUgYXBwb2ludG1lbnQKICAgICAgICAkKCcjRWRpdEZvcm1TdWJtaXQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgJCgnI0VkaXRBcHBvaW50bWVudEZvcm0nKS5zdWJtaXQoKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gRGVsZXRlIHRoZSBhcHBvaW50bWVudAogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0VkaXRBcHBvaW50bWVudElEJykpIHsKICAgICAgICAgICAgJCgnI0VkaXRGb3JtRGVsZXRlJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZiAod2luZG93LmNvbmZpcm0oQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBhcHBvaW50bWVudD8gVGhpcyBvcGVyYXRpb24gY2Fubm90IGJlIHVuZG9uZS4nKSkpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuRWRpdEFwcG9pbnRtZW50KHsKICAgICAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRJRDogQ29yZS5Db25maWcuR2V0KCdFZGl0QXBwb2ludG1lbnRJRCcpLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0RlbGV0ZUFwcG9pbnRtZW50JwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIEVkaXQgcGFyZW50IGFwcG9pbnRtZW50CiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnRWRpdFBhcmVudElEJykpIHsKICAgICAgICAgICAgJCgnI0VkaXRQYXJlbnQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCIjQ2hhbGxlbmdlVG9rZW4iKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50RWRpdCcsCiAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnRWRpdE1hc2snLAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IENvcmUuQ29uZmlnLkdldCgnRWRpdFBhcmVudElEJykKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YSwKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoSFRNTCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZyhIVE1MLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXBwb2ludG1lbnQnKSwgJzEwcHgnLCAnQ2VudGVyJywgdHJ1ZSwgdW5kZWZpbmVkLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkKCcuRGlhbG9nOnZpc2libGUnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFnZW50QXBwb2ludG1lbnRFZGl0KCk7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAnaHRtbCcKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwogICAgICAgICQoJyNFZGl0Rm9ybUNhbmNlbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICQoJy5EaWFsb2c6dmlzaWJsZScpLnJlbW92ZUNsYXNzKCdQZXJzaXN0ZW50Jyk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuQ2xvc2VEaWFsb2coJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIgYnV0dG9ucy4KICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhclBlcm1pc3Npb25MZXZlbCcpID4gMikgewogICAgICAgICAgICAkLmVhY2goWydTdGFydCcsICdFbmQnLCAnUmVjdXJyZW5jZVVudGlsJywgJ05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lJ10sIGZ1bmN0aW9uIChJbmRleCwgUHJlZml4KSB7CiAgICAgICAgICAgICAgICBDb3JlLlVJLkRhdGVwaWNrZXIuSW5pdCh7CiAgICAgICAgICAgICAgICAgICAgRGF5OiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnRGF5JyksCiAgICAgICAgICAgICAgICAgICAgTW9udGg6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdNb250aCcpLAogICAgICAgICAgICAgICAgICAgIFllYXI6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdZZWFyJyksCiAgICAgICAgICAgICAgICAgICAgSG91cjogJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQcmVmaXgpICsgJ0hvdXInKSwKICAgICAgICAgICAgICAgICAgICBNaW51dGU6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdNaW51dGUnKSwKICAgICAgICAgICAgICAgICAgICBXZWVrRGF5U3RhcnQ6IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KCiAgICBDb3JlLkluaXQuUmVnaXN0ZXJOYW1lc3BhY2UoVGFyZ2V0TlMsICdBUFBfTU9EVUxFJyk7CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhciB8fCB7fSkpOwo=</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.CustomerSearch.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNSBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gZTQ0YzE4YWVhOWFiYzEyNWZkZGY5Y2VlZWQyMDRkYjRmYWIyOTBlMCAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICogQG1lbWJlcm9mIENvcmUuQWdlbnQKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY3VzdG9tZXIgc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEJhY2t1cERhdGEKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAbWVtYmVyIHtPYmplY3R9CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2F2ZXMgQ3VzdG9tZXIgZGF0YSBmb3IgbGF0ZXIgcmVzdG9yZS4KICAgICAqLwogICAgdmFyIEJhY2t1cERhdGEgPSB7CiAgICAgICAgICAgIEN1c3RvbWVySW5mbzogJycsCiAgICAgICAgICAgIEN1c3RvbWVyRW1haWw6ICcnLAogICAgICAgICAgICBDdXN0b21lcktleTogJycKICAgICAgICB9LAogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQG1lbWJlciB7T2JqZWN0fQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIE5lZWRlZCBmb3IgdGhlIGNoYW5nZSBldmVudCBvZiBjdXN0b21lciBmaWVsZHMsIGlmIEFjdGl2ZUF1dG9Db21wbGV0ZSBpcyBmYWxzZSAoZGlzYWJsZWQpLgogICAgICovCiAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50ID0ge307CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBEaXNhYmxlIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSBjdXN0b21lciBJRCwgaWYgbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBEZWFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYoJCgnI1RlbXBsYXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLmxlbmd0aCkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5wcm9wKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGaXJzdCBzZWxlY3QgYSBjdXN0b21lciB1c2VyLCB0aGVuIHNlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nKSk7CiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykuYWRkQ2xhc3MoJ0Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IFZhbHVlIC0gVGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFjdGl2YXRlIHRoZSBjdXN0b21lciBJRCBzZWxlY3Rpb24gYnV0dG9uLCBpZiAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYgKCQoJyNUZW1wbGF0ZVNlbGVjdGlvbkN1c3RvbWVySUQnKS5sZW5ndGggJiYgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5oYXNDbGFzcygnRGlzYWJsZWQnKSkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykucHJvcCgndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicpKTsKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5yZW1vdmVDbGFzcygnRGlzYWJsZWQnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgR2V0Q3VzdG9tZXJJbmZvCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJVc2VySUQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZS4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VzdG9tZXJJbmZvKEN1c3RvbWVyVXNlcklEKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0N1c3RvbWVySW5mbycsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2lnbmF0dXJlVVJMOwoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CgogICAgICAgICAgICAkKCcjQ3VzdG9tZXJJRCcpLnZhbChSZXNwb25zZS5DdXN0b21lcklEKTsKICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbChSZXNwb25zZS5DdXN0b21lcklEKTsKCiAgICAgICAgICAgIC8vIFB1Ymxpc2ggaW5mb3JtYXRpb24gZm9yIHN1YnNjcmliZXJzCiAgICAgICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVySW5mby5DYWxsYmFjaycsIFtSZXNwb25zZS5DdXN0b21lcklEXSk7CgogICAgICAgICAgICAvLyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICAgICAgJCgnI0N1c3RvbWVySW5mbyAuQ29udGVudCcpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUYWJsZUhUTUxTdHJpbmcpOwoKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAovLyAgICAgICAgICAgICAvLyBvbmx5IGV4ZWN1dGUgdGhpcyBwYXJ0LCBpZiBpbiBBZ2VudFRpY2tldEVtYWlsIG9yIEFnZW50VGlja2V0UGhvbmUKLy8gICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQaG9uZScpIHsKLy8gICAgICAgICAgICAgICAgIHZhciAkRm9ybSA9IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyA/ICQoJyNOZXdFbWFpbFRpY2tldCcpIDogJCgnI05ld1Bob25lVGlja2V0Jyk7CiAgICAgICAgICAgIC8vIG9ubHkgZXhlY3V0ZSB0aGlzIHBhcnQsIGlmIGluIEFnZW50VGlja2V0RW1haWwgb3IgQWdlbnRUaWNrZXRQaG9uZSBvciBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICB2YXIgJEZvcm07CiAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjTmV3RW1haWxUaWNrZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJykgewogICAgICAgICAgICAgICAgICAgICRGb3JtID0gJCgnI05ld1Bob25lVGlja2V0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpOwogICAgICAgICAgICAgICAgfQovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgICAgICAgICAgLy8gcmVzZXQgc2VydmljZQogICAgICAgICAgICAgICAgJCgnI1NlcnZpY2VJRCcpLmF0dHIoJ3NlbGVjdGVkSW5kZXgnLCAwKTsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZXJ2aWNlcyAodHJpZ2dlciBTZXJ2aWNlSUQgY2hhbmdlIGV2ZW50KQogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJEZvcm0sICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzaWduYXR1cmUgaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgaWYgKCQoJyNEZXN0JykudmFsKCkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJ0FjdGlvbj0nICsgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSArICc7U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyAkKCcjRGVzdCcpLnZhbCgpICsgJztTZWxlY3RlZEN1c3RvbWVyVXNlcj0nICsgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRENvb2tpZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZVVSTCArPSAnOycgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25OYW1lJykgKyAnPScgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkKCcjU2lnbmF0dXJlJykuYXR0cignc3JjJywgU2lnbmF0dXJlVVJMKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UHJvY2VzcycpIHsKICAgICAgICAgICAgICAgIC8vIHJlc2V0IHNlcnZpY2UKICAgICAgICAgICAgICAgICQoJyNTZXJ2aWNlSUQnKS5hdHRyKCdzZWxlY3RlZEluZGV4JywgMCk7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgc2VydmljZXMgKHRyaWdnZXIgU2VydmljZUlEIGNoYW5nZSBldmVudCkKICAgICAgICAgICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNDdXN0b21lcklEJykuY2xvc2VzdCgnZm9ybScpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEdldEN1c3RvbWVyVGlja2V0cwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyVXNlcklECiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJJRAogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gZ2V0cyBjdXN0b21lciB0aWNrZXRzLgogICAgICovCiAgICBmdW5jdGlvbiBHZXRDdXN0b21lclRpY2tldHMoQ3VzdG9tZXJVc2VySUQsIEN1c3RvbWVySUQpIHsKCiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICBTdWJhY3Rpb246ICdDdXN0b21lclRpY2tldHMnLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgIEN1c3RvbWVySUQ6IEN1c3RvbWVySUQKICAgICAgICB9OwoKICAgICAgICAvLyBjaGVjayBpZiBjdXN0b21lciB0aWNrZXRzIHNob3VsZCBiZSBzaG93bgogICAgICAgIGlmICh0eXBlb2YgQ29yZS5Db25maWcuR2V0KCdDdXN0b21lclNlYXJjaCcpICE9PSAndW5kZWZpbmVkJyAmJiAhcGFyc2VJbnQoQ29yZS5Db25maWcuR2V0KCdDdXN0b21lclNlYXJjaCcpLlNob3dDdXN0b21lclRpY2tldHMsIDEwKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIEN1c3RvbWVySGlzdG9yeUV2ZW50cwogICAgICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVyVGlja2V0cwogICAgICAgICAqIEBmdW5jdGlvbgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGV2ZW50cyBmb3IgQ3VzdG9tZXIgSGlzdG9yeSBvdmVydmlldyB0YWJsZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBDdXN0b21lckhpc3RvcnlFdmVudHMoKSB7CiAgICAgICAgICAgICQoJ3NlbGVjdFtuYW1lPVJlc3BvbnNlSURdJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBVUkw7CiAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAkKHRoaXMpLnBhcmVudHMoKS5zZXJpYWxpemUoKTsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cChVUkwsICdUaWNrZXRBY3Rpb24nKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHNlbGVjdCBib3ggc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBmcm9tIHRoZSBzYW1lIHdpbmRvdy4KICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbCgnMCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgJCgnc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMgLk1hc3RlckFjdGlvbicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICAgICAgICAgdmFyICRNYXN0ZXJBY3Rpb25MaW5rID0gJCh0aGlzKS5maW5kKCdhLk1hc3RlckFjdGlvbkxpbmsnKTsKCiAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IE1hc3RlckFjdGlvbiBvbiBNb2Rlcm5pemUgaW5wdXQgZmllbGRzLgogICAgICAgICAgICAgICAgaWYgKCQoRXZlbnQudGFyZ2V0KS5oYXNDbGFzcygnSW5wdXRGaWVsZF9TZWFyY2gnKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEV2ZW50IG11c3QgYmUgZG9uZSBpbiB0aGUgcGFyZW50IHdpbmRvdyBiZWNhdXNlIEFnZW50VGlja2V0Q3VzdG9tZXIgaXMgaW4gcG9wdXAuCiAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q3VzdG9tZXInKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5FeGVjdXRlSW5QYXJlbnRXaW5kb3coZnVuY3Rpb24oV2luZG93T2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFdpbmRvd09iamVjdC5Db3JlLlVJLlBvcHVwLkZpcmVQb3B1cEV2ZW50KCdVUkwnLCB7IFVSTDogJE1hc3RlckFjdGlvbkxpbmsuYXR0cignaHJlZicpIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuQ2xvc2VQb3B1cCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFjdCBpZiB0aGUgbGluayB3YXMgbm90IGNsaWNrZWQgZGlyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgaWYgKEV2ZW50LnRhcmdldCAhPT0gJE1hc3RlckFjdGlvbkxpbmsuZ2V0KDApKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkKCIjU29ydEJ5Iikub2ZmKCdjaGFuZ2UnKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIFNvcnRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uID0gJCh0aGlzKS52YWwoKS5zcGxpdCgnfCcpOwoKICAgICAgICAgICAgICAgIGlmIChTZWxlY3Rpb24ubGVuZ3RoID09PSAyKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIFNob3cgc29ydGVkIGN1c3RvbWVyIHRpY2tldHMuCiAgICAgICAgICAgICAgICAgICAgU29ydGVkRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0N1c3RvbWVyVGlja2V0cycsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEOiBDdXN0b21lclVzZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRDogQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgU29ydEJ5OiBTZWxlY3Rpb25bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIE9yZGVyQnk6IFNlbGVjdGlvblsxXQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksIFNvcnRlZERhdGEsIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVGlja2V0cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUaWNrZXRzSFRNTFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcygpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gQWN0aXZhdGUgTW9kZXJuaXplIGZpZWxkcy4KICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgpOwogICAgICAgICAgICBDb3JlLkFwcC5TdWJzY3JpYmUoJ0V2ZW50LlVJLkFjY29yZGlvbi5PcGVuRWxlbWVudCcsIGZ1bmN0aW9uKCRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBDb3JlLlVJLklucHV0RmllbGRzLkFjdGl2YXRlKCRFbGVtZW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzCiAgICAgICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guR2V0Q3VzdG9tZXJUaWNrZXRzCiAgICAgICAgICogQGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybnMge0Jvb2xlYW59IFJldHVybnMgZmFsc2UuCiAgICAgICAgICogQGRlc2NyaXB0aW9uCiAgICAgICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIGFuZCBzaG93cyBjdXN0b21lciB0aWNrZXQgbGlua3MuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gUmVwbGFjZUN1c3RvbWVyVGlja2V0TGlua3MoKSB7CiAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5maW5kKCcuQXJpYVJvbGVNYWluJykucmVtb3ZlQXR0cigncm9sZScpLnJlbW92ZUNsYXNzKCdBcmlhUm9sZU1haW4nKTsKCiAgICAgICAgICAgIC8vIFJlcGxhY2Ugb3ZlcnZpZXcgbW9kZSBsaW5rcyAoUywgTSwgTCB2aWV3KSwgcGFnaW5hdGlvbiBsaW5rcyB3aXRoIEFKQVgKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmZpbmQoJy5PdmVydmlld1pvb20gYSwgLlBhZ2luYXRpb24gYSwgLlRhYmxlU21hbGwgdGggYScpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIEN1dCBvdXQgQmFzZVVSTCBhbmQgcXVlcnkgc3RyaW5nIGZyb20gdGhlIFVSTAogICAgICAgICAgICAgICAgdmFyIExpbmsgPSAkKHRoaXMpLmF0dHIoJ2hyZWYnKSwKICAgICAgICAgICAgICAgICAgICBVUkxDb21wb25lbnRzOwoKICAgICAgICAgICAgICAgIFVSTENvbXBvbmVudHMgPSBMaW5rLnNwbGl0KCc/JywgMik7CgogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkxDb21wb25lbnRzWzBdLCBVUkxDb21wb25lbnRzWzFdLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzaG93IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVGlja2V0cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuaHRtbChSZXNwb25zZS5DdXN0b21lclRpY2tldHNIVE1MU3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZUN1c3RvbWVyVGlja2V0TGlua3MoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMgYS5TcGxpdFNlbGVjdGlvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuVGlja2V0U3BsaXQuT3BlblNwbGl0U2VsZWN0aW9uKCQodGhpcykuYXR0cignaHJlZicpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgLy8gSW5pdCBhY2NvcmRpb24gb2Ygb3ZlcnZpZXcgYXJ0aWNsZSBwcmV2aWV3CiAgICAgICAgICAgIENvcmUuVUkuQWNjb3JkaW9uLkluaXQoJCgnLlByZXZpZXcgPiB1bCcpLCAnbGkgaDMgYScsICcuSGlkZGVuQmxvY2snKTsKCiAgICAgICAgICAgIC8vIEV2ZW50cyBmb3IgQ3VzdG9tZXIgSGlzdG9yeSB0YWJsZSAtIEFnZW50VGlja2V0UGhvbmUsIEFnZW50VGlja2V0RW1haWwgYW5kIEFnZW50VGlja2V0Q3VzdG9tZXIgc2NyZWVucy4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UGhvbmUnIHx8CiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcgfHwKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJyB8fAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50Q2hhdEFwcGVuZCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgQ3VzdG9tZXJIaXN0b3J5RXZlbnRzKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgLy8gc2hvdyBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgIGlmICgkKCcjQ3VzdG9tZXJUaWNrZXRzJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuaHRtbChSZXNwb25zZS5DdXN0b21lclRpY2tldHNIVE1MU3RyaW5nKTsKICAgICAgICAgICAgICAgIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzKCk7CgogICAgICAgICAgICAgICAgLy8gY2xpY2sgZXZlbnQgZm9yIG9wZW5pbmcgcG9wdXAKICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMgYS5Bc1BvcHVwJykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cCgkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMgYS5TcGxpdFNlbGVjdGlvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LlRpY2tldFNwbGl0Lk9wZW5TcGxpdFNlbGVjdGlvbigkKHRoaXMpLmF0dHIoJ2hyZWYnKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW4gQWdlbnRUaWNrZXRQaG9uZSwgdGhpcyBjaGVja3MgaWYgbW9yZSB0aGFuIG9uZSBlbnRyeSBpcyBhbGxvd2VkCiAgICAgKiAgICAgIGluIHRoZSBjdXN0b21lciBsaXN0IGFuZCBibG9ja3MvdW5ibG9ja3MgdGhlIGF1dG9jb21wbGV0ZSBmaWVsZCBhcyBuZWVkZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKSB7CgogICAgICAgIC8vIE9ubHkgb3BlcmF0ZSBpbiBBZ2VudFRpY2tldFBob25lCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldFBob25lJykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBDaGVjayBpZiBtdWx0aXBsZSBmcm9tIGVudHJpZXMgYXJlIGFsbG93ZWQKICAgICAgICBpZiAocGFyc2VJbnQoQ29yZS5Db25maWcuR2V0KCdDdXN0b21lclNlYXJjaCcpLkFsbG93TXVsdGlwbGVGcm9tLCAxMCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCQoJyNUaWNrZXRDdXN0b21lckNvbnRlbnRGcm9tQ3VzdG9tZXIgaW5wdXQuQ3VzdG9tZXJUaWNrZXRUZXh0JykubGVuZ3RoID4gMCkgewogICAgICAgICAgICAkKCcjRnJvbUN1c3RvbWVyJykudmFsKCcnKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpLnByb3AoJ3JlYWRvbmx5JywgdHJ1ZSk7CiAgICAgICAgICAgICQoJyNEZXN0JykudHJpZ2dlcignZm9jdXMnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICQoJyNGcm9tQ3VzdG9tZXInKS52YWwoJycpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpLnByb3AoJ3JlYWRvbmx5JywgZmFsc2UpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBJbml0U2ltcGxlCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgaW5wdXQgZmllbGQgd2l0aCBhdXRvY29tcGxldGUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIG1vZHVsZS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdFNpbXBsZSA9IGZ1bmN0aW9uICgkRWxlbWVudCkgewogICAgICAgIHZhciBDdXN0b21lclNlYXJjaFR5cGUgPSAkRWxlbWVudC5kYXRhKCdjdXN0b21lci1zZWFyY2gtdHlwZScpOwoKICAgICAgICBpZiAoQ3VzdG9tZXJTZWFyY2hUeXBlKSB7CiAgICAgICAgICAgIENvcmUuVUkuQXV0b2NvbXBsZXRlLkluaXQoJEVsZW1lbnQsIGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdTZWFyY2gnICsgQ3VzdG9tZXJTZWFyY2hUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1heFJlc3VsdHM6IENvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnTWF4UmVzdWx0c0Rpc3BsYXllZCcpCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZGF0YSgnQXV0b0NvbXBsZXRlWEhSJywgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChVUkwsIERhdGEsIGZ1bmN0aW9uIChSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFZhbHVlRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5yZW1vdmVEYXRhKCdBdXRvQ29tcGxldGVYSFInKTsKICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKFJlc3VsdCwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLkxhYmVsICsgKEN1c3RvbWVyU2VhcmNoVHlwZSA9PSAnQ3VzdG9tZXJVc2VyJyA/ICcgKCcgKyB0aGlzLlZhbHVlICsgJyknIDogJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLlZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlKFZhbHVlRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoVUkuaXRlbS52YWx1ZSkudHJpZ2dlcignc2VsZWN0LkF1dG9jb21wbGV0ZScpOwoKICAgICAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0sICdDdXN0b21lclNlYXJjaCcpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBJbml0CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQgLSBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgaW5wdXQgZmllbGQgd2l0aCBhdXRvY29tcGxldGUuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgSW5pdGlhbGl6ZXMgdGhlIG1vZHVsZS4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgkRWxlbWVudCkgewogICAgICAgIHZhciBBdXRvY29tcGxldGVGb2N1cyA9IGZhbHNlOwoKICAgICAgICAvLyBnZXQgY3VzdG9tZXIgdGlja2V0cyBmb3IgQWdlbnRUaWNrZXRDdXN0b21lcgogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDdXN0b21lcicpIHsKICAgICAgICAgICAgR2V0Q3VzdG9tZXJUaWNrZXRzKCQoJyNDdXN0b21lckF1dG9Db21wbGV0ZScpLnZhbCgpLCAkKCcjQ3VzdG9tZXJJRCcpLnZhbCgpKTsKCiAgICAgICAgICAgICRFbGVtZW50LmJsdXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCRFbGVtZW50LnZhbCgpID09PSAnJykgewogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlJlc2V0Q3VzdG9tZXJJbmZvKCk7CiAgICAgICAgICAgICAgICAgICAgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuZW1wdHkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBFbmFibGUgZnJlZSBzZWxlY3Rpb24gb3IgaW5wdXQgb2YgQ3VzdG9tZXJJRCBmaWVsZCBvbiBBZ2VudFRpY2tldFByb2Nlc3MgYW5kIEFnZW50VGlja2V0Q3VzdG9tZXIuCiAgICAgICAgaWYgKChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQcm9jZXNzJwogICAgICAgICAgICAmJiAhQ29yZS5Db25maWcuR2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFByb2Nlc3M6OkN1c3RvbWVySURSZWFkT25seScpKQogICAgICAgICAgICB8fAogICAgICAgICAgICAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q3VzdG9tZXInCiAgICAgICAgICAgICYmICFDb3JlLkNvbmZpZy5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q3VzdG9tZXI6OkN1c3RvbWVySURSZWFkT25seScpKQovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICApIHsKICAgICAgICAgICAgJCgnI0N1c3RvbWVyQXV0b0NvbXBsZXRlJykub24oJ2JsdXIga2V5dXAnICwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBpZigkKCcjQ3VzdG9tZXJBdXRvQ29tcGxldGUnKS52YWwoKSkgewogICAgICAgICAgICAgICAgICAgIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBnZXQgY3VzdG9tZXIgdGlja2V0cyBmb3IgQWdlbnRUaWNrZXRQaG9uZSBhbmQgQWdlbnRUaWNrZXRFbWFpbAogICAgICAgIGlmICgoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJykgJiYgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCkgIT09ICcnKSB7CiAgICAgICAgICAgIEdldEN1c3RvbWVyVGlja2V0cygkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoKSk7CiAgICAgICAgfQoKICAgICAgICAvLyBqdXN0IHNhdmUgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhlIGN1c3RvbWVyIGluZm8KICAgICAgICBpZiAoJCgnI0N1c3RvbWVySW5mbycpLmxlbmd0aCkgewogICAgICAgICAgICBCYWNrdXBEYXRhLkN1c3RvbWVySW5mbyA9ICQoJyNDdXN0b21lckluZm8gLkNvbnRlbnQnKS5odG1sKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVsZW1lbnQpKSB7CiAgICAgICAgICAgIC8vIEhpZGUgdG9vbHRpcCBpbiBhdXRvY29tcGxldGUgZmllbGQsIGlmIHVzZXIgYWxyZWFkeSB0eXBlZCBzb21ldGhpbmcgdG8gcHJldmVudCB0aGUgYXV0b2NvbXBsZXRlIGxpc3QKICAgICAgICAgICAgLy8gdG8gYmUgaGlkZGVuIHVuZGVyIHRoZSB0b29sdGlwLiAoT25seSBuZWVkZWQgZm9yIHNlcnZlcnNpZGUgZXJyb3JzKQogICAgICAgICAgICAkRWxlbWVudC5vZmYoJ2tleXVwLlZhbGlkYXRlJykub24oJ2tleXVwLlZhbGlkYXRlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICB2YXIgVmFsdWUgPSAkRWxlbWVudC52YWwoKTsKICAgICAgICAgICAgICAgaWYgKCRFbGVtZW50Lmhhc0NsYXNzKCdTZXJ2ZXJFcnJvcicpICYmIFZhbHVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgJCgnI09UT0JPX1VJX1Rvb2x0aXBzX0Vycm9yVG9vbHRpcCcpLmhpZGUoKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIENvcmUuQXBwLlN1YnNjcmliZSgnRXZlbnQuQ3VzdG9tZXJVc2VyQWRkcmVzc0Jvb2suQWRkVGlja2V0Q3VzdG9tZXIuQ2FsbGJhY2suJyArICRFbGVtZW50LmF0dHIoJ2lkJyksIGZ1bmN0aW9uKFVzZXJMb2dpbiwgQ3VzdG9tZXJUaWNrZXRUZXh0KSB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoQ3VzdG9tZXJUaWNrZXRUZXh0KTsKICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZFRpY2tldEN1c3RvbWVyKCRFbGVtZW50LmF0dHIoJ2lkJyksIEN1c3RvbWVyVGlja2V0VGV4dCwgVXNlckxvZ2luKTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBDb3JlLlVJLkF1dG9jb21wbGV0ZS5Jbml0KCRFbGVtZW50LCBmdW5jdGlvbiAoUmVxdWVzdCwgUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRlcm06IFJlcXVlc3QudGVybSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogQ29yZS5VSS5BdXRvY29tcGxldGUuR2V0Q29uZmlnKCdNYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICRFbGVtZW50LmRhdGEoJ0F1dG9Db21wbGV0ZVhIUicsIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFZhbHVlRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnJlbW92ZURhdGEoJ0F1dG9Db21wbGV0ZVhIUicpOwogICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuTGFiZWwgKyAiICgiICsgdGhpcy5WYWx1ZSArICIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbWVyIGxpc3QgcmVwcmVzZW50YXRpb24gKHNlZSBDdXN0b21lclVzZXJMaXN0RmllbGRzIGZyb20gRGVmYXVsdHMucG0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5MYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1c3RvbWVyIHVzZXIgaWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogdGhpcy5WYWx1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBSZXNwb25zZShWYWx1ZURhdGEpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICB2YXIgQ3VzdG9tZXJLZXkgPSBVSS5pdGVtLmtleSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclZhbHVlID0gVUkuaXRlbS52YWx1ZTsKCiAgICAgICAgICAgICAgICBCYWNrdXBEYXRhLkN1c3RvbWVyS2V5ID0gQ3VzdG9tZXJLZXk7CiAgICAgICAgICAgICAgICBCYWNrdXBEYXRhLkN1c3RvbWVyRW1haWwgPSBDdXN0b21lclZhbHVlOwoKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChDdXN0b21lclZhbHVlKTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnCiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQnCiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKCcnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0UGhvbmUnCiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWwnCiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQnCiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnCi8vIEVvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGhpZGRlbiBmaWVsZCBTZWxlY3RlZEN1c3RvbWVyVXNlcgogICAgICAgICAgICAgICAgICAgICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbChDdXN0b21lcktleSk7CgogICAgICAgICAgICAgICAgICAgIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCgpOwoKICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQgZm9yIEFnZW50VGlja2V0Q3VzdG9tZXIucG0KICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVXNlcklEJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJJRCcpLnZhbChDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkKCcjQ3VzdG9tZXJVc2VyT3B0aW9uJykubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VyT3B0aW9uJykudmFsKEN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkN1c3RvbWVyVXNlck9wdGlvbiIgaWQ9IkN1c3RvbWVyVXNlck9wdGlvbiI+JykudmFsKEN1c3RvbWVyS2V5KS5hcHBlbmRUbygkRWxlbWVudC5jbG9zZXN0KCdmb3JtJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY3VzdG9tZXIgdGlja2V0cwogICAgICAgICAgICAgICAgICAgIEdldEN1c3RvbWVyVGlja2V0cyhDdXN0b21lcktleSk7CgogICAgICAgICAgICAgICAgICAgIC8vIGdldCBjdXN0b21lciBkYXRhIGZvciBjdXN0b21lciBpbmZvIHRhYmxlCiAgICAgICAgICAgICAgICAgICAgR2V0Q3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZFRpY2tldEN1c3RvbWVyKCQoRXZlbnQudGFyZ2V0KS5hdHRyKCdpZCcpLCBDdXN0b21lclZhbHVlLCBDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sICdDdXN0b21lclNlYXJjaCcpOwoKICAgICAgICAgICAgLy8gUmVtZW1iZXIgaWYgYXV0b2NvbXBsZXRlIGl0ZW0gd2FzIGZvY3VzZWQgKGJ5IGtleWJvYXJkIG5hdmlnYXRpb24gb3IgbW91c2UpLgogICAgICAgICAgICAkRWxlbWVudC5vbignYXV0b2NvbXBsZXRlZm9jdXMnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIEF1dG9jb21wbGV0ZUZvY3VzID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAodHlwZW9mICRFbGVtZW50LmRhdGEoInVpLWF1dG9jb21wbGV0ZSIpID09PSAnb2JqZWN0JykgewoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGlmIHRoZSBhdXRvY29tcGxldGUgd2lkZ2V0IGlzIGxlZnQgYnkgbW91c2UuCiAgICAgICAgICAgICAgICAkKCRFbGVtZW50LmRhdGEoInVpLWF1dG9jb21wbGV0ZSIpLm1lbnUuZWxlbWVudCkub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgaWYgdGhlIGF1dG9jb21wbGV0ZSB3aWRnZXQgaXMgbGVmdCBieSBrZXlib2FyZCBuYXZpZ2F0aW9uLgogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGJ5IG92ZXJyaWRlIHRoZSBfbW92ZSBtZXRob2QgYmVjYXVzZSB0aGVyZSBpcyBubyBvcHBvc2l0ZSBldmVudCBvZiBhdXRvY29tcGxldGVmb2N1cy4KICAgICAgICAgICAgICAgICRFbGVtZW50LmRhdGEoInVpLWF1dG9jb21wbGV0ZSIpLl9tb3ZlID0gZnVuY3Rpb24oZGlyZWN0aW9uLCBldmVudCkgewoKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMubWVudS5lbGVtZW50LmlzKCI6dmlzaWJsZSIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoKG51bGwsIGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVudS5pc0ZpcnN0SXRlbSgpICYmIC9ecHJldmlvdXMvLnRlc3QoZGlyZWN0aW9uKSB8fAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnUuaXNMYXN0SXRlbSgpICYmIC9ebmV4dC8udGVzdChkaXJlY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlKHRoaXMudGVybSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIG1vdXNlbGVhdmUgZm9yIHJlbW92aW5nIHNlbGVjdGlvbiBvZiBhdXRvY29tcGxldGUgd2lkZ2V0LgogICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMubWVudS5lbGVtZW50KS50cmlnZ2VyKCdtb3VzZWxlYXZlJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnVbIGRpcmVjdGlvbiBdKGV2ZW50KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIGF1dG9jb21wbGV0ZSB3YXMgZm9jdXNlZCwgYnV0IHRoZW4gY2xvc2VkIGJ5IGEgYmx1ciwgY2xlYXIgdGhlIHNlYXJjaCBmaWVsZCBzaW5jZSB0aGlzIHZhbHVlIHdhcwogICAgICAgICAgICAvLyAgIG5ldmVyIGV4cGxpY2l0bHkgY29uZmlybWVkLiBEbyB0aGlzIGFsc28gd2hlbiB1c2VyIGRlY2lkZXMgdG8gY2xpY2sgb3V0c2lkZSB0aGUgYXV0b2NvbXBsZXRlIGxpc3QsCiAgICAgICAgICAgIC8vICAgd2hpY2ggY2F1c2VzIHRoZSBsaXN0IHRvIGNsb3NlLiBQbGVhc2Ugc2VlIGJ1ZyMxMzUzNyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgJEVsZW1lbnQub24oJ2F1dG9jb21wbGV0ZWNsb3NlJywgZnVuY3Rpb24oRXZlbnQpIHsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVGb2N1cwogICAgICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnQub3JpZ2luYWxFdmVudCA9PT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50Lm9yaWdpbmFsRXZlbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEV2ZW50Lm9yaWdpbmFsRXZlbnQudHlwZSA9PSAnYmx1cicKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKCcnKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVGb2N1cyA9IGZhbHNlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldFBob25lJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWwnCiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQnCiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3JwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFbGVtZW50LmJsdXIoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBGaWVsZFZhbHVlID0gJCh0aGlzKS52YWwoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoRmllbGRWYWx1ZSAhPT0gQmFja3VwRGF0YS5DdXN0b21lckVtYWlsICYmIEZpZWxkVmFsdWUgIT09IEJhY2t1cERhdGEuQ3VzdG9tZXJLZXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlcklEJykudmFsKCcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlck9wdGlvbicpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTaG93Q3VzdG9tZXJJRCcpLmh0bWwoJycpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVzdG9yZSBjdXN0b21lciBpbmZvIHRhYmxlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Q3VzdG9tZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJJbmZvIC5Db250ZW50JykuaHRtbChCYWNrdXBEYXRhLkN1c3RvbWVySW5mbyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJJRCcpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQcm9jZXNzJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlcnZpY2VzICh0cmlnZ2VyIFNlcnZpY2VJRCBjaGFuZ2UgZXZlbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ3VzdG9tZXJJRCcpLmNsb3Nlc3QoJ2Zvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemVzIHRoZSBjdXN0b21lciBmaWVsZC4KICAgICAgICAgICAgICAgIFRhcmdldE5TLkluaXRDdXN0b21lckZpZWxkKCRFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT24gdW5sb2FkIHJlbW92ZSBvbGQgc2VsZWN0ZWQgZGF0YS4gSWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgKHdpdGggRjUpIHRoaXMgZGF0YQogICAgICAgIC8vIHN0YXlzIGluIHRoZSBmaWVsZCBhbmQgaW52b2tlcyBhbiBhamF4IHJlcXVlc3Qgb3RoZXJ3aXNlLiBXZSBuZWVkIHRvIHVzZSBiZWZvcmV1bmxvYWQKICAgICAgICAvLyBoZXJlIGluc3RlYWQgb2YgdW5sb2FkIGJlY2F1c2UgdGhlIFVSTCBvZiB0aGUgd2luZG93IGRvZXMgbm90IGNoYW5nZSBvbiByZWxvYWQgd2hpY2gKICAgICAgICAvLyBkb2Vzbid0IHRyaWdnZXIgcGFnZWhpZGUuCiAgICAgICAgJCh3aW5kb3cpLm9uKCdiZWZvcmV1bmxvYWQuQ3VzdG9tZXJTZWFyY2gnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgnJyk7CiAgICAgICAgICAgIHJldHVybjsgLy8gcmV0dXJuIG5vdGhpbmcgdG8gc3VwcHJlc3MgdGhlIGNvbmZpcm1hdGlvbiBtZXNzYWdlCiAgICAgICAgfSk7CgogICAgICAgIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKTsKICAgIH07CgogICAgZnVuY3Rpb24gaHRtbERlY29kZShUZXh0KXsKICAgICAgICByZXR1cm4gVGV4dC5yZXBsYWNlKC8mYW1wOy9nLCAnJicpOwogICAgfQoKICAgIC8qKgogICAgICogQG5hbWUgQWRkVGlja2V0Q3VzdG9tZXIKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGZhbHNlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEZpZWxkCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJWYWx1ZSAtIFRoZSByZWFkYWJsZSBjdXN0b21lciBpZGVudGlmaWVyLgogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyS2V5IC0gQ3VzdG9tZXIga2V5IG9uIHN5c3RlbS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBTZXRBc1RpY2tldEN1c3RvbWVyIC0gIFNldCB0aGlzIGN1c3RvbWVyIGFzIG1haW4gdGlja2V0IGN1c3RvbWVyLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gYWRkcyBhIG5ldyB0aWNrZXQgY3VzdG9tZXIKICAgICAqLwogICAgVGFyZ2V0TlMuQWRkVGlja2V0Q3VzdG9tZXIgPSBmdW5jdGlvbiAoRmllbGQsIEN1c3RvbWVyVmFsdWUsIEN1c3RvbWVyS2V5LCBTZXRBc1RpY2tldEN1c3RvbWVyKSB7CgogICAgICAgIHZhciAkQ2xvbmUgPSAkKCcuQ3VzdG9tZXJUaWNrZXRUZW1wbGF0ZScgKyBGaWVsZCkuY2xvbmUoKSwKICAgICAgICAgICAgQ3VzdG9tZXJUaWNrZXRDb3VudGVyID0gJCgnI0N1c3RvbWVyVGlja2V0Q291bnRlcicgKyBGaWVsZCkudmFsKCksCiAgICAgICAgICAgIFRpY2tldEN1c3RvbWVySURzID0gMCwKICAgICAgICAgICAgSXNEdXBsaWNhdGVkID0gZmFsc2UsCiAgICAgICAgICAgIElzRm9jdXNlZCA9ICgkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpLmF0dHIoJ2lkJykgPT0gRmllbGQpLAogICAgICAgICAgICBTdWZmaXg7CgogICAgICAgIGlmICh0eXBlb2YgQ3VzdG9tZXJLZXkgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0gaHRtbERlY29kZShDdXN0b21lcktleSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoQ3VzdG9tZXJWYWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgdmFyIEN1cnJlbnRRdW90YXRpb24sCiAgICAgICAgICAgIE11bHRpRW50cnkgPSBbJyddLAogICAgICAgICAgICBTZWVuQXQgICAgID0gMCwKICAgICAgICAgICAgbiAgICAgICAgICA9IDA7CgogICAgICAgIC8vIGRvIGEgbWFudWFsIHNwbGl0IHRoYXQga2VlcHMgdHJhY2sgb2YgcXVvdGF0aW9uCiAgICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgQ3VzdG9tZXJWYWx1ZS5sZW5ndGg7IGkrKyApIHsKICAgICAgICAgICAgdmFyIENoYXIgPSBDdXN0b21lclZhbHVlLmNoYXJBdChpKTsKCiAgICAgICAgICAgIGlmICggQ3VycmVudFF1b3RhdGlvbiApIHsKICAgICAgICAgICAgICAgIE11bHRpRW50cnlbbl0gKz0gQ2hhcjsKICAgICAgICAgICAgICAgIGlmICggQ2hhciA9PT0gQ3VycmVudFF1b3RhdGlvbiApIHsKICAgICAgICAgICAgICAgICAgICBDdXJyZW50UXVvdGF0aW9uID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBDaGFyID09PSAnIicgfHwgQ2hhciA9PT0gIiciICkgewogICAgICAgICAgICAgICAgTXVsdGlFbnRyeVtuXSAgICArPSBDaGFyOwogICAgICAgICAgICAgICAgQ3VycmVudFF1b3RhdGlvbiAgPSBDaGFyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBTZWVuQXQgPT09IDEgJiYgKCBDaGFyID09PSAnLCcgfHwgQ2hhciA9PT0gIjsiICkgKSB7CiAgICAgICAgICAgICAgICBuKys7CiAgICAgICAgICAgICAgICBTZWVuQXQgICAgICAgID0gMDsKICAgICAgICAgICAgICAgIE11bHRpRW50cnlbbl0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICggQ2hhciA9PT0gJ0AnICkgewogICAgICAgICAgICAgICAgICAgIFNlZW5BdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBNdWx0aUVudHJ5W25dICs9IENoYXI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggbiA+IDAgKSB7CiAgICAgICAgICAgIGZvciAoIHZhciBtID0gMDsgbSA8PSBuOyBtKysgKSB7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lciggRmllbGQsIE11bHRpRW50cnlbbV0udHJpbSgpICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZWQgZW50cmllcwogICAgICAgICQoJ1tjbGFzcyo9Q3VzdG9tZXJUaWNrZXRUZXh0XScpLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID09PSBDdXN0b21lclZhbHVlKSB7CiAgICAgICAgICAgICAgICBJc0R1cGxpY2F0ZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKElzRHVwbGljYXRlZCkgewogICAgICAgICAgICBUYXJnZXROUy5TaG93RHVwbGljYXRlZERpYWxvZyhGaWVsZCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIGdldCBudW1iZXIgb2YgaG93IG11Y2ggY3VzdG9tZXIgdGlja2V0IGFyZSBwcmVzZW50CiAgICAgICAgVGlja2V0Q3VzdG9tZXJJRHMgPSAkKCcuQ3VzdG9tZXJDb250YWluZXIgaW5wdXRbdHlwZT0icmFkaW8iXScpLmxlbmd0aDsKCiAgICAgICAgLy8gaW5jcmVtZW50IGN1c3RvbWVyIGNvdW50ZXIKICAgICAgICBDdXN0b21lclRpY2tldENvdW50ZXIrKzsKCiAgICAgICAgLy8gc2V0IHN1Zml4CiAgICAgICAgU3VmZml4ID0gJ18nICsgQ3VzdG9tZXJUaWNrZXRDb3VudGVyOwoKICAgICAgICAvLyByZW1vdmUgdW5uZWNlc3NhcnkgY2xhc3NlcwogICAgICAgICRDbG9uZS5yZW1vdmVDbGFzcygnSGlkZGVuIEN1c3RvbWVyVGlja2V0VGVtcGxhdGUnICsgRmllbGQpOwoKICAgICAgICAvLyBjb3B5IHZhbHVlcyBhbmQgY2hhbmdlIGlkcyBhbmQgbmFtZXMKICAgICAgICAkQ2xvbmUuZmluZCgnOmlucHV0LCBhJykuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICB2YXIgSUQgPSAkKHRoaXMpLmF0dHIoJ2lkJyk7CiAgICAgICAgICAgICQodGhpcykuYXR0cignaWQnLCBJRCArIFN1ZmZpeCk7CiAgICAgICAgICAgICQodGhpcykudmFsKEN1c3RvbWVyVmFsdWUpOwogICAgICAgICAgICBpZiAoSUQgIT09ICdDdXN0b21lclNlbGVjdGVkJykgewogICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCduYW1lJywgSUQgKyBTdWZmaXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBhZGQgZXZlbnQgaGFuZGxlciB0byByYWRpbyBidXR0b24KICAgICAgICAgICAgaWYoJCh0aGlzKS5oYXNDbGFzcygnQ3VzdG9tZXJUaWNrZXRSYWRpbycpKSB7CgogICAgICAgICAgICAgICAgaWYgKFRpY2tldEN1c3RvbWVySURzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gc2V0IGNvdW50ZXIgYXMgdmFsdWUKICAgICAgICAgICAgICAgICQodGhpcykudmFsKEN1c3RvbWVyVGlja2V0Q291bnRlcik7CgogICAgICAgICAgICAgICAgLy8gYmluZCBjaGFuZ2UgZnVuY3Rpb24gdG8gcmFkaW8gYnV0dG9uIHRvIHNlbGVjdCBjdXN0b21lcgogICAgICAgICAgICAgICAgJCh0aGlzKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByb3cKICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5wcm9wKCdjaGVja2VkJykpewogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5SZWxvYWRDdXN0b21lckluZm8oQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gc2V0IGN1c3RvbWVyIGtleSBpZiBwcmVzZW50CiAgICAgICAgICAgIGlmKCQodGhpcykuaGFzQ2xhc3MoJ0N1c3RvbWVyS2V5JykpIHsKICAgICAgICAgICAgICAgICQodGhpcykudmFsKEN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIGV2ZW50IGhhbmRsZXIgdG8gcmVtb3ZlIGJ1dHRvbgogICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCdSZW1vdmVCdXR0b24nKSkgewoKICAgICAgICAgICAgICAgIC8vIGJpbmQgY2xpY2sgZnVuY3Rpb24gdG8gcmVtb3ZlIGJ1dHRvbgogICAgICAgICAgICAgICAgJCh0aGlzKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJvdwogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLlJlbW92ZUN1c3RvbWVyVGlja2V0KCQodGhpcykpOwoKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBDdXN0b21lckhpc3RvcnkgdGFibGUgaWYgdGhlcmUgYXJlIG5vIHNlbGVjdGVkIGN1c3RvbWVyIHVzZXJzCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNUaWNrZXRDdXN0b21lckNvbnRlbnQnICsgRmllbGQgKyAnIC5DdXN0b21lclRpY2tldFJhZGlvJykubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5lbXB0eSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIHNldCBidXR0b24gdmFsdWUKICAgICAgICAgICAgICAgICQodGhpcykudmFsKEN1c3RvbWVyVmFsdWUpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCdNb3ZlQ3VzdG9tZXJCdXR0b24nKSkgewogICAgICAgICAgICAgICAgJCh0aGlzKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIE1vdmVDdXN0b21lcktleSA9ICQoJy5DdXN0b21lcktleScsICQodGhpcykucGFyZW50KCkpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICBNb3ZlQ3VzdG9tZXJWYWwgPSAkKCcuQ3VzdG9tZXJUaWNrZXRUZXh0JywgJCh0aGlzKS5wYXJlbnQoKSkudmFsKCksCiAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEZpZWxkICAgICA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKCdUb01vdmUnKSAgPyAnVG9DdXN0b21lcicgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGFzQ2xhc3MoJ0NjTW92ZScpICA/ICdDY0N1c3RvbWVyJyAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5oYXNDbGFzcygnQmNjTW92ZScpID8gJ0JjY0N1c3RvbWVyJyA6ICcnOwoKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgdGhlIGN1cnJlbnQgZW50cnkKICAgICAgICAgICAgICAgICAgICAkKCcuUmVtb3ZlQnV0dG9uJywgJCh0aGlzKS5wYXJlbnQoKSkuY2xpY2soKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBjdXN0b21lciB0byB0aGUgdGFyZ2V0IGZpZWxkCiAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuQWRkVGlja2V0Q3VzdG9tZXIoVGFyZ2V0RmllbGQsIE1vdmVDdXN0b21lclZhbCwgTW92ZUN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gc2hvdyBjb250YWluZXIKICAgICAgICAkKCcjVGlja2V0Q3VzdG9tZXJDb250ZW50JyArIEZpZWxkKS5wYXJlbnQoKS5yZW1vdmVDbGFzcygnSGlkZGVuJyk7CiAgICAgICAgLy8gYXBwZW5kIHRvIGNvbnRhaW5lcgogICAgICAgICQoJyNUaWNrZXRDdXN0b21lckNvbnRlbnQnICsgRmllbGQpLmFwcGVuZCgkQ2xvbmUpOwoKICAgICAgICAvLyBzZXQgbmV3IHZhbHVlIGZvciBDdXN0b21lclRpY2tldENvdW50ZXIKICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRDb3VudGVyJyArIEZpZWxkKS52YWwoQ3VzdG9tZXJUaWNrZXRDb3VudGVyKTsKICAgICAgICBpZiAoKEN1c3RvbWVyS2V5ICE9PSAnJyAmJiBUaWNrZXRDdXN0b21lcklEcyA9PT0gMCAmJiAoRmllbGQgPT09ICdUb0N1c3RvbWVyJyB8fCBGaWVsZCA9PT0gJ0Zyb21DdXN0b21lcicpKSB8fCBTZXRBc1RpY2tldEN1c3RvbWVyKSB7CiAgICAgICAgICAgIGlmIChTZXRBc1RpY2tldEN1c3RvbWVyKSB7CiAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJTZWxlY3RlZF8nICsgQ3VzdG9tZXJUaWNrZXRDb3VudGVyKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkKCcuQ3VzdG9tZXJDb250YWluZXIgaW5wdXRbdHlwZT0icmFkaW8iXTpmaXJzdCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKS50cmlnZ2VyKCdjaGFuZ2UnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUmV0dXJuIHRoZSB2YWx1ZSB0byB0aGUgc2VhcmNoIGZpZWxkLgogICAgICAgICQoJyMnICsgRmllbGQpLnZhbCgnJyk7CgogICAgICAgIC8vIFJlLWZvY3VzIHRoZSBmaWVsZCwgYnV0IG9ubHkgaWYgaXQgd2FzIHByZXZpb3VzbHkgZm9jdXNlZC4KICAgICAgICBpZiAoSXNGb2N1c2VkKSB7CiAgICAgICAgICAgICQoJyMnICsgRmllbGQpLmZvY3VzKCk7CiAgICAgICAgfQoKICAgICAgICBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0KCk7CgogICAgICAgIC8vIFJlbG9hZCBDcnlwdCBvcHRpb25zIG9uIHNwZWNpZmljIHNjcmVlbnMuCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICQoJyNDcnlwdEtleUlEJykubGVuZ3RoCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyMnICsgRmllbGQpLmNsb3Nlc3QoJ2Zvcm0nKSwgJ0FKQVhVcGRhdGUnKTsKICAgICAgICB9CgogICAgICAgIC8vIG5vdyB0aGF0IHdlIGtub3cgdGhhdCBhdCBsZWFzdCBvbmUgY3VzdG9tZXIgaGFzIGJlZW4gYWRkZWQsCiAgICAgICAgLy8gd2UgY2FuIHJlbW92ZSBldmVudHVhbCBlcnJvcnMgZnJvbSB0aGUgY3VzdG9tZXIgZmllbGQKICAgICAgICAkKCcjRnJvbUN1c3RvbWVyLCAjVG9DdXN0b21lcicpCiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnRXJyb3IgU2VydmVyRXJyb3InKQogICAgICAgICAgICAuY2xvc2VzdCgnLkZpZWxkJykKICAgICAgICAgICAgLnByZXYoJ2xhYmVsJykKICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdMYWJlbEVycm9yJyk7CiAgICAgICAgQ29yZS5Gb3JtLkVycm9yVG9vbHRpcHMuSGlkZVRvb2x0aXAoKTsKCiAgICAgICAgQWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CgogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZW1vdmVDdXN0b21lclRpY2tldAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9IE9iamVjdCAtIEpRdWVyeSBvYmplY3QgdXNlZCBhcyBiYXNlIHRvIGRlbGV0ZSBpdCdzIHBhcmVudC4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgYSBjdXN0b21lciB0aWNrZXQgZW50cnkuCiAgICAgKi8KICAgIFRhcmdldE5TLlJlbW92ZUN1c3RvbWVyVGlja2V0ID0gZnVuY3Rpb24gKE9iamVjdCkgewogICAgICAgIHZhciBUaWNrZXRDdXN0b21lcklEcyA9IDAsCiAgICAgICAgJEZpZWxkID0gT2JqZWN0LmNsb3Nlc3QoJy5GaWVsZCcpLAogICAgICAgICRGb3JtOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZvcm0gPSBPYmplY3QuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIH0KICAgICAgICBPYmplY3QucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgVGlja2V0Q3VzdG9tZXJJRHMgPSAkKCcuQ3VzdG9tZXJDb250YWluZXIgaW5wdXRbdHlwZT0icmFkaW8iXScpLmxlbmd0aDsKICAgICAgICBpZiAoVGlja2V0Q3VzdG9tZXJJRHMgPT09IDApIHsKICAgICAgICAgICAgVGFyZ2V0TlMuUmVzZXRDdXN0b21lckluZm8oKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlbG9hZCBDcnlwdCBvcHRpb25zIG9uIHNwZWNpZmljIHNjcmVlbnMuCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICQoJyNDcnlwdEtleUlEJykubGVuZ3RoCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCRGb3JtLCAnQUpBWFVwZGF0ZScpOwogICAgICAgIH0KCiAgICAgICAgaWYoISQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdJykuaXMoJzpjaGVja2VkJykpewogICAgICAgICAgICAvL3NldCB0aGUgZmlyc3Qgb25lIGFzIGNoZWNrZWQKICAgICAgICAgICAgJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl06Zmlyc3QnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEZpZWxkLmZpbmQoJy5DdXN0b21lclRpY2tldFRleHQ6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAkRmllbGQuYWRkQ2xhc3MoJ0hpZGRlbicpOwoKICAgICAgICAgICAgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICB9CgogICAgICAgIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZXNldEN1c3RvbWVySW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCBzZWxlY3RlZCBjdXN0b21lciBpbmZvLgogICAgICovCiAgICBUYXJnZXROUy5SZXNldEN1c3RvbWVySW5mbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlcklEJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVySUQnKS52YWwoJycpOwogICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VyT3B0aW9uJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbCgnJyk7CgogICAgICAgICAgICAvLyByZXNldCBjdXN0b21lciBpbmZvIHRhYmxlCiAgICAgICAgICAgICQoJyNDdXN0b21lckluZm8gLkNvbnRlbnQnKS5odG1sKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdub25lJykpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFJlbG9hZEN1c3RvbWVySW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyS2V5CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZWxvYWRzIGluZm8gZm9yIHNlbGVjdGVkIGN1c3RvbWVyLgogICAgICovCiAgICBUYXJnZXROUy5SZWxvYWRDdXN0b21lckluZm8gPSBmdW5jdGlvbiAoQ3VzdG9tZXJLZXkpIHsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAvLyBnZXQgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZQogICAgICAgIEdldEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CgogICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRDdXN0b21lclVzZXIKICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRDdXN0b21lckZpZWxkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gJEVsZW1lbnQgLSBKUXVlcnkgb2JqZWN0LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGN1c3RvbWVyIGZpZWxkcy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEN1c3RvbWVyRmllbGQgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgT2JqZWN0SWQgPSAkRWxlbWVudC5hdHRyKCdpZCcpOwoKICAgICAgICAkKCcjJyArIE9iamVjdElkKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgaWYgKCEkKCcjJyArIE9iamVjdElkKS52YWwoKSB8fCAkKCcjJyArIE9iamVjdElkKS52YWwoKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgYXV0b2NvbXBsZXRpb24gaXMgZGlzYWJsZWQgYW5kIG9ubHkgYXZhaWJsZSB2aWEgdGhlIGNsaWNrCiAgICAgICAgICAgIC8vIG9mIGEgYnV0dG9uIG5leHQgdG8gdGhlIGlucHV0IGZpZWxkLCB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMKICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50IHRoZSBub3JtYWwgd2F5LgogICAgICAgICAgICBpZiAoIUNvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnQWN0aXZlQXV0b0NvbXBsZXRlJykpIHsKICAgICAgICAgICAgICAgIC8vIHdlIHdhaXQgc29tZSB0aW1lIGFmdGVyIHRoaXMgZXZlbnQgdG8gY2hlY2ssIGlmIHRoZSBzZWFyY2ggYnV0dG9uCiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBmaWVsZCB3YXMgcHJlc3NlZC4gSWYgc28sIG5vIGFjdGlvbiBpcyBuZWVkZWQKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjaGFuZ2UgZXZlbnQgd2FzIGZpcmVkIHdpdGhvdXQgY2xpY2tpbmcgdGhlIHNlYXJjaCBidXR0b24sCiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB0aGUgdXNlciBjbGlja2VkIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHNvIGFkZCB0aGUgY3VzdG9tZXIgKHRoZSBlbmV0ZXJlZCB2YWx1ZSkgdG8gdGhlIGxpc3QKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF0gPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50W09iamVjdElkXSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKENvcmUuVUkuQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvbkNsaWNrZWRbT2JqZWN0SWRdKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIENvcmUuVUkuQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvbkNsaWNrZWRbT2JqZWN0SWRdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyMnICsgT2JqZWN0SWQpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLy8gSWYgdGhlIGF1dG9jb21wbGV0ZSBwb3B1cCB3aW5kb3cgaXMgdmlzaWJsZSwgZGVsYXkgdGhpcyBjaGFuZ2UgZXZlbnQuCiAgICAgICAgICAgIC8vIEl0IG1pZ2h0IGJlIGNhdXNlZCBieSBjbGlja2luZyB3aXRoIHRoZSBtb3VzZSBpbnRvIHRoZSBhdXRvY29tcGxldGUgbGlzdC4KICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBpdCBpcyBjbG9zZWQgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IGFkZCBhIGN1c3RvbWVyIHR3aWNlLgoKICAgICAgICAgICAgaWYgKCRFbGVtZW50LmF1dG9jb21wbGV0ZSgid2lkZ2V0IikuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBPYmplY3RJZCkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLkFkZFRpY2tldEN1c3RvbWVyKE9iamVjdElkLCAkKCcjJyArIE9iamVjdElkKS52YWwoKSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnIycgKyBPYmplY3RJZCkub24oJ2tleXByZXNzJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzKXsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoT2JqZWN0SWQsICQoJyMnICsgT2JqZWN0SWQpLnZhbCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFNob3dEdXBsaWNhdGVkRGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRmllbGQgLSBJRCBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzIG9uIGNsb3NlIGV2ZW50LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvd3MgYW4gYWxlcnQgZGlhbG9nIGZvciBkdXBsaWNhdGVkIGVudHJpZXMuCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dEdXBsaWNhdGVkRGlhbG9nID0gZnVuY3Rpb24oRmllbGQpewogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydCgKICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0R1cGxpY2F0ZWQgZW50cnknKSwKICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LicpICsgJyAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJyksCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5BbGVydCcpKTsKICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGQpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkKS5mb2N1cygpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2ggfHwge30pKTsK</File>
        <File Location="doc/en/AppointmentToTicket.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="calendar_appointment">
            <ColumnAdd Name="future_task_id" Required="false" Type="INTEGER"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="calendar_appointment">
            <ColumnDrop Name="future_task_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>