<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>AppointmentToTicket</Name>
    <Version>11.1.1</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-07-22 15:34:21" Version="11.1.1">Update to OTOBO 11.1.</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>
    <Framework>11.1.x</Framework>
    <CodeUninstall Type="pre">

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

        $Kernel::OM-&gt;Get($CodeModule)-&gt;CodeUninstall();
    </CodeUninstall>
    <BuildCommitID>b066f040938f8dfde73f75d1657f40b219e54591</BuildCommitID>
    <BuildDate>2026-07-22 15:34:25</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AgentAppointmentEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWdlbnRBcHBvaW50bWVudEVkaXQucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50QXBwb2ludG1lbnRFZGl0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICRTZWxmLT57RW1wdHlTdHJpbmd9ID0gJy0nOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGZyb250ZW5kIHNwZWNpZmljIGNvbmZpZwogICAgbXkgJENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgPSAkS2VybmVsOjpPTS0+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL091dHB1dC9IVE1ML1RlbXBsYXRlcy9TdGFuZGFyZC9BZ2VudEFwcG9pbnRtZW50RWRpdC50dAojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBiNzg2Y2NmN2E4YmFhNjAxODg2ZmFlNzI5ZmMzNzJjYThhMjQwMDg3IC0gS2VybmVsL1N5c3RlbS9DYWxlbmRhci9BcHBvaW50bWVudC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBSZWN1cnJlbmNlVW50aWwhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBkYiBvYmplY3QKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgQEJpbmQ7CgogICAgIyB0aGUgcGFyZW50X2lkIGlzIG9ubHkgc3VwcGxpZWQgZm9yIHJlY3VycmluZyBldmVudHMKICAgIG15ICggJFBhcmVudElEQ29sLCAkUGFyZW50SURWYWwgKSA9ICggJycsICcnICk7CiAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgJFBhcmVudElEQ29sID0gJ3BhcmVudF9pZCwnOwogICAgICAgICRQYXJlbnRJRFZhbCA9ICc/LCc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtQYXJlbnRJRH07CgogICAgICAgICMgdHVybiBvZmYgYWxsIHJlY3VycmluZyBmaWVsZHMKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmluZ307CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlVHlwZX07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlRnJlcXVlbmN5fTsKICAgICAgICBkZWxldGUgJFBhcmFte1JlY3VycmVuY2VDb3VudH07CiAgICAgICAgZGVsZXRlICRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9OwogICAgICAgIGRlbGV0ZSAkUGFyYW17UmVjdXJyZW5jZVVudGlsfTsKICAgIH0KCiAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0NhbGVuZGFySUR9LCBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtUaXRsZX0sIFwkUGFyYW17RGVzY3JpcHRpb259LAogICAgICAgIFwkUGFyYW17TG9jYXRpb259LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17U3RhcnRUaW1lfSwgICAgICAgICAgICBcJFBhcmFte0VuZFRpbWV9LCAgIFwkUGFyYW17QWxsRGF5fSwKICAgICAgICBcJEFycmF5c3tUZWFtSUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgICAgICAgICAgXCRQYXJhbXtSZWN1cnJpbmd9LCBcJFBhcmFte1JlY3VycmVuY2VUeXBlfSwKICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRnJlcXVlbmN5fSwgICAgICAgICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VDb3VudH0sICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUlEfSwgICAgICAgICBcJEFycmF5c3tSZWN1cnJlbmNlRXhjbHVkZX0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25UZW1wbGF0ZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfSwgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0sCiAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH07CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBJTlNFUlQgSU5UTyBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAoJFBhcmVudElEQ29sIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCBhbGxfZGF5LCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgcmVjdXJyaW5nLCByZWN1cl90eXBlLCByZWN1cl9mcmVxLCByZWN1cl9jb3VudCwKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbSwgbm90aWZ5X2N1c3RvbV91bml0X2NvdW50LCBub3RpZnlfY3VzdG9tX3VuaXQsIG5vdGlmeV9jdXN0b21fdW5pdF9wb2ludCwKICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV9kYXRlLCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsCiAgICAgICAgICAgIGNoYW5nZV9ieSkKICAgICAgICBWQUxVRVMgKCRQYXJlbnRJRFZhbCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LCA/LAogICAgICAgICAgICA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pCiAgICAiOwoKICAgICMgY3JlYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJEFwcG9pbnRtZW50SUQ7CgogICAgIyByZXR1cm4gcGFyZW50IGlkIGZvciBhcHBvaW50bWVudCBvY2N1cnJlbmNlcwogICAgaWYgKCAkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgICRBcHBvaW50bWVudElEID0gJFBhcmFte1BhcmVudElEfTsKICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudCBpZCBmb3IgdGhlIGFwcG9pbnRtZW50IHRoYXQgd2FzIGp1c3QgYWRkZWQKICAgIGVsc2UgewogICAgICAgICgkQXBwb2ludG1lbnRJRCkgPSAkREJPYmplY3QtPlNlbGVjdFJvd0FycmF5KAogICAgICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsClNFTEVDVCBpZAogIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8KICAgIEFORCB1bmlxdWVfaWQgICA9ID8KICAgIEFORCB0aXRsZSAgICAgICA9ID8KICAgIEFORCBwYXJlbnRfaWQgICBJUyBOVUxMCiAgT1JERVIgQlkgaWQgREVTQwpFTkRfU1FMCiAgICAgICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICAgICAgICAgIFwkUGFyYW17VW5pcXVlSUR9LAogICAgICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gaWYgdGhlcmUgaXMgbm90IGFwcG9pbnRtZW50IGNyZWF0ZWQKICAgICAgICBpZiAoICEkQXBwb2ludG1lbnRJRCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NhblwndCBnZXQgQXBwb2ludG1lbnRJRCBmcm9tIElOU0VSVCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgQWRkIHJlY3VycmluZyBhcHBvaW50bWVudHMuIFRoZSBBcHBvaW50bWVudENyZWF0ZSBldmVudAogICAgIyB3aWxsIGJlIHRyaWdnZXJlZCBmb3IgZWFjaCBhZGRlZCBhcHBvaW50bWVudC4KICAgIGlmICggJFBhcmFte1JlY3VycmluZ30gJiYgISRQYXJhbXtSZWN1cnJpbmdSYXd9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgPT4gJEFwcG9pbnRtZW50SUQsCiAgICAgICAgICAgIEFwcG9pbnRtZW50ID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgaWYgKCAkUGFyYW17VGlja2V0VGVtcGxhdGV9ICYmICEkUGFyYW17UGFyZW50SUR9ICkgewogICAgICAgIG15ICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9IDA7CiAgICAgICAgbXkgJEV4ZWN1dGlvblRpbWU7CiAgICAgICAgbXkgJEN1cnJlbnREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKCiAgICAgICAgICAgICMgR2V0IG5lYXJlc3QgdXBjb21pbmcgZXZlbnQKICAgICAgICAgICAgIyBJZiBhbGwgZXZlbnRzIGFyZSBpbiB0aGUgcGFzdCwgbm8gZnV0dXJlIHRhc2sgaXMgY3JlYXRlZAogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJFNlbGYtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgICA9PiAkQXBwb2ludG1lbnRJRCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJVBhcmVudEFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElEICk7CiAgICAgICAgICAgIHVuc2hpZnQgQEFwcG9pbnRtZW50TGlzdCwgXCVQYXJlbnRBcHBvaW50bWVudDsKCiAgICAgICAgICAgIEFQUE9JTlRNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAQXBwb2ludG1lbnRMaXN0KSB7CgogICAgICAgICAgICAgICAgIyBUYWtlIHNtYWxsZXN0IHBvc2l0aXZlIGRpc3RhbmNlIGZyb20gY3VycmVudCB0aW1lCiAgICAgICAgICAgICAgICAjIFRha2UgZXhlY3V0aW9uIHRpbWUgb2YgZnV0dXJlIHRhc2sgYXMgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFNlbGYtPkFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte1RpY2tldEN1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkQXBwb2ludG1lbnQtPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kVGltZSAgID0+ICRBcHBvaW50bWVudC0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudERhdGVUaW1lT2JqZWN0ICkgPiAwICkgewogICAgICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgICAgICAgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBBUFBPSU5UTUVOVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtUaWNrZXRDdXN0b219LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJFBhcmFte1RpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBTdGFydFRpbWUgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPkNvbXBhcmUoIERhdGVUaW1lT2JqZWN0ID0+ICRDdXJyZW50RGF0ZVRpbWVPYmplY3QgKSA+IDAgKSB7CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQgPSAkQXBwb2ludG1lbnRJRDsKICAgICAgICAgICAgICAgICRFeGVjdXRpb25UaW1lICAgICAgICAgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQpIHsKICAgICAgICAgICAgbXkgJFRhc2tJRCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tBZGQoCiAgICAgICAgICAgICAgICBFeGVjdXRpb25UaW1lID0+ICRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnQXBwb2ludG1lbnRUaWNrZXQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT4lKiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgPT4gJEZ1dHVyZVRhc2tBcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRUYXNrSUQpIHsKICAgICAgICAgICAgICAgICRQYXJhbXtGdXR1cmVUYXNrSUR9ID0gJFRhc2tJRDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRpY2tldCB0YXNrIGZvciBhcHBvaW50bWVudCAkQXBwb2ludG1lbnRJRCBjb3VsZCBub3QgYmUgY3JlYXRlZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNRTCA9ICIKICAgICAgICAgICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgICAgICAgICAgU0VUIGZ1dHVyZV90YXNrX2lkID0gPwogICAgICAgICAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAgICAgICAgICI7CiAgICAgICAgICAgIEBCaW5kID0gKCBcJFRhc2tJRCwgXCRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCApOwoKICAgICAgICAgICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICAgICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICAgICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBmaXJlIGV2ZW50CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgIEV2ZW50ID0+ICdBcHBvaW50bWVudENyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRBcHBvaW50bWVudElELAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICAgICB9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuICRBcHBvaW50bWVudElEOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRMaXN0KCkKCmdldCBhIGhhc2ggb2YgQXBwb2ludG1lbnRzLgoKICAgIG15IEBBcHBvaW50bWVudHMgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIENhbGVuZGFySUQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgID0+ICcqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0aXRsZSwgd2lsZGNhcmQgc3VwcG9ydGVkCiAgICAgICAgRGVzY3JpcHRpb24gICAgICAgICA9PiAnKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZGVzY3JpcHRpb24sIHdpbGRjYXJkIHN1cHBvcnRlZAogICAgICAgIExvY2F0aW9uICAgICAgICAgICAgPT4gJyonLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGxvY2F0aW9uLCB3aWxkY2FyZCBzdXBwb3J0ZWQKICAgICAgICBTdGFydFRpbWUgICAgICAgICAgID0+ICcyMDE2LTAxLTAxIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSBzdGFydCBkYXRlCiAgICAgICAgRW5kVGltZSAgICAgICAgICAgICA9PiAnMjAxNi0wMi0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgZW5kIGRhdGUKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEZpbHRlciBieSB0ZWFtCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICA9PiAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgcmVzb3VyY2UKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgUGFyZW50SUQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgcGFyZW50IGlkLCByZXR1cm5zIG9ubHkgY2hpbGRyZW4KIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgUmVzdWx0ICAgICAgICAgICAgICA9PiAnSEFTSCcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSwgSEFTSHxBUlJBWQogICAgKTsKCnJldHVybnMgYW4gYXJyYXkgb2YgaGFzaGVzIHdpdGggc2VsZWN0IEFwcG9pbnRtZW50IGRhdGEgb3Igc2ltcGxlIGFycmF5IG9mIEFwcG9pbnRtZW50SURzOgoKUmVzdWx0ID0+ICdIQVNIJzoKCiAgICBAQXBwb2ludG1lbnRzID0gKAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+IDEsCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgPT4gJzIwMTYwMTAxVDE2MDAwMC03MUUzODZAbG9jYWxob3N0JywKICAgICAgICAgICAgVGl0bGUgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICA9PiAnMjAxNi0wMS0wMSAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgICAgICBBbGxEYXkgICAgICAgID0+IDAsCiAgICAgICAgICAgIFJlY3VycmluZyAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBmb3IgcmVjdXJyaW5nIChwYXJlbnQpIGFwcG9pbnRtZW50cyBvbmx5CiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gMiwKICAgICAgICAgICAgUGFyZW50SUQgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciByZWN1cnJlZCAoY2hpbGQpIGFwcG9pbnRtZW50cyBvbmx5CiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwKICAgICAgICAgICAgVW5pcXVlSUQgICAgICA9PiAnMjAxNjAxMDFUMTgwMDAwLUE3OEI1N0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBUaXRsZSAgICAgICAgID0+ICdXZWJpbmFyJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gICA9PiAnSG93IHRvIHVzZSBQcm9jZXNzIHRpY2tldHMuLi4nLAogICAgICAgICAgICBMb2NhdGlvbiAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgICAgICBTdGFydFRpbWUgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgRW5kVGltZSAgICAgICA9PiAnMjAxNi0wMS0wMiAxNzowMDowMCcsCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgPT4gWyAxIF0sCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgICAgIEFsbERheSAgICAgICAgPT4gMCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAzLAogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYwMTAxVDE4MDAwMC1BNzhCNTdAbG9jYWxob3N0JywKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnV2ViaW5hcicsCiAgICAgICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICAgICAgTG9jYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnU3RyYXViaW5nJywKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnMjAxNi0wMS0wMiAxNjowMDowMCcsCiAgICAgICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTc6MDA6MDAnLAogICAgICAgICAgICBUaW1lem9uZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gWyAxIF0sCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgICAgICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDIgMTY6MTA6MDAnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICdyZWxhdGl2ZScsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJzEwJywKICAgICAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgPT4gJ2FmdGVyc3RhcnQnLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICcyMDE2LTAxLTAyIDE2OjAwOjAwJywKICAgICAgICAgICAgVGlja2V0QXBwb2ludG1lbnRSdWxlSUQgICAgICAgICAgICAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAgICAjIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhCiAgICAgICAgfSwKICAgICAgICAuLi4KICAgICk7CgpSZXN1bHQgPT4gJ0FSUkFZJzoKCiAgICBAQXBwb2ludG1lbnRzID0gKCAxLCAyLCAuLi4gKQoKPWN1dAoKc3ViIEFwcG9pbnRtZW50TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ2FsZW5kYXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIG91dHB1dCBhcnJheSBvZiBoYXNoZXMgYnkgZGVmYXVsdAogICAgJFBhcmFte1Jlc3VsdH0gPSAkUGFyYW17UmVzdWx0fSB8fCAnSEFTSCc7CgogICAgIyBjYWNoZSBrZXlzCiAgICBteSAkQ2FjaGVUeXBlICAgICAgICA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfTsKICAgIG15ICRDYWNoZUtleVRpdGxlICAgID0gJFBhcmFte1RpdGxlfSAgICAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleURlc2MgICAgID0gJFBhcmFte0Rlc2NyaXB0aW9ufSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUxvY2F0aW9uID0gJFBhcmFte0xvY2F0aW9ufSAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVN0YXJ0ICAgID0gJFBhcmFte1N0YXJ0VGltZX0gICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgICAgID0gJFBhcmFte0VuZFRpbWV9ICAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVRlYW0gICAgID0gJFBhcmFte1RlYW1JRH0gICAgICB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleVJlc291cmNlID0gJFBhcmFte1Jlc291cmNlSUR9ICB8fCAnYW55JzsKCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgbXkgJENhY2hlS2V5UGFyZW50ID0gJFBhcmFte1BhcmVudElEfSB8fCAnYW55JzsKCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VGl0bGV9ICYmICRQYXJhbXtUaXRsZX0gPX4gL15bXCpdKyQvICkgewogICAgICAgICRDYWNoZUtleVRpdGxlID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Rlc2NyaXB0aW9ufSAmJiAkUGFyYW17RGVzY3JpcHRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlEZXNjID0gJ2FueSc7CiAgICB9CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0xvY2F0aW9ufSAmJiAkUGFyYW17TG9jYXRpb259ID1+IC9eW1wqXSskLyApIHsKICAgICAgICAkQ2FjaGVLZXlMb2NhdGlvbiA9ICdhbnknOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgbXkgJENhY2hlS2V5ID0gIiRDYWNoZUtleVRpdGxlLSRDYWNoZUtleURlc2MtJENhY2hlS2V5TG9jYXRpb24tJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kLSRDYWNoZUtleVRlYW0tJENhY2hlS2V5UmVzb3VyY2UtJFBhcmFte1Jlc3VsdH0iOwogICAgbXkgJENhY2hlS2V5ID0gIiRDYWNoZUtleVRpdGxlLSRDYWNoZUtleURlc2MtJENhY2hlS2V5TG9jYXRpb24tJENhY2hlS2V5U3RhcnQtJENhY2hlS2V5RW5kLSRDYWNoZUtleVRlYW0tJENhY2hlS2V5UmVzb3VyY2UtJENhY2hlS2V5UGFyZW50LSRQYXJhbXtSZXN1bHR9IjsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgJERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+R2V0KAogICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICk7CgogICAgaWYgKCByZWYgJERhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICByZXR1cm4gQHskRGF0YX07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuZFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgIG15ICRTUUwgPSAnCiMgICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKIyAgICAgICAgICAgICBlbmRfdGltZSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIGFsbF9kYXksIHJlY3VycmluZywgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQKIyAgICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKIyAgICAgICAgIFdIRVJFIGNhbGVuZGFyX2lkPT8KIyAgICAgJzsKICAgIG15ICRTUUwgPSAnCiAgICAgICAgU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQsIHRpdGxlLCBkZXNjcmlwdGlvbiwgbG9jYXRpb24sIHN0YXJ0X3RpbWUsCiAgICAgICAgICAgIGVuZF90aW1lLCB0ZWFtX2lkLCByZXNvdXJjZV9pZCwgYWxsX2RheSwgcmVjdXJyaW5nLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAogICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX2RhdGUsIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkLCBmdXR1cmVfdGFza19pZAogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBjYWxlbmRhcl9pZCA9ID8KICAgICc7CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgIG15IEBCaW5kOwoKICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17Q2FsZW5kYXJJRH07CgogICAgIyBGaWx0ZXIgdGl0bGUsIGRlc2NyaXB0aW9uIGFuZCBsb2NhdGlvbiBmaWVsZHMgYnkgdXNpbmcgUXVlcnlDb25kaXRpb24gbWV0aG9kLCB3aGljaCB3aWxsCiAgICAjICAgcmV0dXJuIGJhY2tlbmQgc3BlY2lmaWMgU1FMIHN0YXRlbWVudHMgaW4gb3JkZXIgdG8gcHJvdmlkZSBjYXNlIGluc2Vuc2l0aXZlIG1hdGNoIGFuZAogICAgIyAgIHdpbGRjYXJkIHN1cHBvcnQuCiAgICBGSUxURVI6CiAgICBmb3IgbXkgJEZpbHRlciAocXcoVGl0bGUgRGVzY3JpcHRpb24gTG9jYXRpb24pKSB7CiAgICAgICAgbmV4dCBGSUxURVIgaWYgISRQYXJhbXskRmlsdGVyfTsKICAgICAgICAkU1FMIC49ICcgQU5EICcgLiAkREJPYmplY3QtPlF1ZXJ5Q29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gbGMgJEZpbHRlciwKICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICRQYXJhbXskRmlsdGVyfSwKICAgICAgICAgICAgU2VhcmNoUHJlZml4ID0+ICcqJywKICAgICAgICAgICAgU2VhcmNoU3VmZml4ID0+ICcqJywKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICcgQU5EICgKICAgICAgICAgICAgKHN0YXJ0X3RpbWUgPj0gPyBBTkQgc3RhcnRfdGltZSA8ID8pIE9SCiAgICAgICAgICAgIChlbmRfdGltZSA+ID8gQU5EIGVuZF90aW1lIDw9ID8pIE9SCiAgICAgICAgICAgIChzdGFydF90aW1lIDw9ID8gQU5EIGVuZF90aW1lID49ID8pCiAgICAgICAgKSAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFwkUGFyYW17RW5kVGltZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICEkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJyBBTkQgZW5kX3RpbWUgPj0gPyAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfTsKICAgIH0KICAgIGVsc2lmICggISRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnIEFORCBzdGFydF90aW1lIDw9ID8gJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0VuZFRpbWV9OwogICAgfQoKICAgICRTUUwgLj0gJyBPUkRFUiBCWSBpZCBBU0MnOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgQFJlc3VsdDsKCiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgIyB0ZWFtIGlkCiAgICAgICAgbXkgQFRlYW1JRCA9IHNwbGl0KCAvLC8sICRSb3dbOV0gLy8gJycgKTsKICAgICAgICBpZiAoICRQYXJhbXtUZWFtSUR9ICkgewogICAgICAgICAgICBuZXh0IFJPVyBpZiAhZ3JlcCB7ICRfID09ICRQYXJhbXtUZWFtSUR9IH0gQFRlYW1JRDsKICAgICAgICB9CgogICAgICAgICMgcmVzb3VyY2UgaWQKICAgICAgICAkUm93WzEwXSA9ICRSb3dbMTBdID8gJFJvd1sxMF0gOiAwOwogICAgICAgIG15IEBSZXNvdXJjZUlEID0gJFJvd1sxMF0gPX4gLywvID8gc3BsaXQoIC8sLywgJFJvd1sxMF0gKSA6ICggJFJvd1sxMF0gKTsKICAgICAgICBpZiAoICRQYXJhbXtSZXNvdXJjZUlEfSApIHsKICAgICAgICAgICAgbmV4dCBST1cgaWYgIWdyZXAgeyAkXyA9PSAkUGFyYW17UmVzb3VyY2VJRH0gfSBAUmVzb3VyY2VJRDsKICAgICAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAjIHBhcmVudCBpZAogICAgICAgICRSb3dbMV0gPSAkUm93WzFdID8gJFJvd1sxXSA6IDA7CiAgICAgICAgbXkgJFBhcmVudElEID0gJFJvd1sxXTsKICAgICAgICBpZiAoICRQYXJhbXtQYXJlbnRJRH0gKSB7CiAgICAgICAgICAgIG5leHQgUk9XIGlmICggJFBhcmFte1BhcmVudElEfSAhPSAkUGFyZW50SUQgKTsKICAgICAgICB9CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICAgICBteSAlQXBwb2ludG1lbnQgPSAoCiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1swXSwKICAgICAgICAgICAgUGFyZW50SUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzFdLAogICAgICAgICAgICBDYWxlbmRhcklEICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMl0sCiAgICAgICAgICAgIFVuaXF1ZUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1szXSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzRdLAogICAgICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbNV0sCiAgICAgICAgICAgIExvY2F0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJFJvd1s2XSwKICAgICAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzddLAogICAgICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbOF0sCiAgICAgICAgICAgIFRlYW1JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBUZWFtSUQsCiAgICAgICAgICAgIFJlc291cmNlSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gXEBSZXNvdXJjZUlELAogICAgICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTFdLAogICAgICAgICAgICBSZWN1cnJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTJdLAogICAgICAgICAgICBOb3RpZmljYXRpb25EYXRlICAgICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTNdIHx8ICcnLAogICAgICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTRdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgICAgICAgICAgICAgICAgID0+ICRSb3dbMTVdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICRSb3dbMTZdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgICAgICAgID0+ICRSb3dbMTddLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lID0+ICRSb3dbMThdLAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSAgICAgICAgICAgID0+ICRSb3dbMTldIHx8ICcnLAogICAgICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICAgICAgICAgICAgID0+ICRSb3dbMjBdLAojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgRnV0dXJlVGFza0lEICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkUm93WzIxXSwKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgKTsKICAgICAgICBwdXNoIEBSZXN1bHQsIFwlQXBwb2ludG1lbnQ7CiAgICB9CgogICAgIyBpZiBSZXN1bHQgd2FzIEFSUkFZLCBvdXRwdXQgb25seSBJRHMKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICBteSBAUmVzdWx0TGlzdDsKICAgICAgICBmb3IgbXkgJEFwcG9pbnRtZW50IChAUmVzdWx0KSB7CiAgICAgICAgICAgIHB1c2ggQFJlc3VsdExpc3QsICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgIH0KICAgICAgICBAUmVzdWx0ID0gQFJlc3VsdExpc3Q7CiAgICB9CgogICAgIyBjYWNoZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICk7CgogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCj1oZWFkMiBBcHBvaW50bWVudERheXMoKQoKZ2V0IGEgaGFzaCBvZiBkYXlzIHdpdGggQXBwb2ludG1lbnRzIGluIGFsbCB1c2VyIGNhbGVuZGFycy4KCiAgICBteSAlQXBwb2ludG1lbnREYXlzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudERheXMoCiAgICAgICAgU3RhcnRUaW1lICAgICAgICAgICA9PiAnMjAxNi0wMS0wMSAwMDowMDowMCcsICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBGaWx0ZXIgYnkgc3RhcnQgZGF0ZQogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRmlsdGVyIGJ5IGVuZCBkYXRlCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBWYWxpZCBVc2VySUQKICAgICk7CgpyZXR1cm5zIGEgaGFzaCB3aXRoIGRheXMgYXMga2V5cyBhbmQgbnVtYmVyIG9mIEFwcG9pbnRtZW50cyBhcyB2YWx1ZXM6CgogICAgJUFwcG9pbnRtZW50RGF5cyA9IHsKICAgICAgICAnMjAxNi0wMS0wMScgPT4gMSwKICAgICAgICAnMjAxNi0wMS0xMycgPT4gMiwKICAgICAgICAnMjAxNi0wMS0zMCcgPT4gMSwKICAgIH07Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnREYXlzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSBrZXlzCiAgICBteSAkQ2FjaGVUeXBlICAgICA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdEYXlzJyAuICRQYXJhbXtVc2VySUR9OwogICAgbXkgJENhY2hlS2V5U3RhcnQgPSAkUGFyYW17U3RhcnRUaW1lfSB8fCAnYW55JzsKICAgIG15ICRDYWNoZUtleUVuZCAgID0gJFBhcmFte0VuZFRpbWV9ICAgfHwgJ2FueSc7CgogICAgIyBjaGVjayB0aW1lCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICkgewogICAgICAgIG15ICRTdGFydFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdGFydFRpbWVPYmplY3QgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTdGFydFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RW5kVGltZX0gKSB7CiAgICAgICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkRW5kVGltZU9iamVjdCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVuZFRpbWUgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIG15ICREYXRhID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgVHlwZSA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgPT4gIiRDYWNoZUtleVN0YXJ0LSRDYWNoZUtleUVuZCIsCiAgICApOwoKICAgIGlmICggcmVmICREYXRhIGVxICdIQVNIJyApIHsKICAgICAgICByZXR1cm4gJXskRGF0YX07CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBnZXQgdXNlciBncm91cHMKICAgIG15ICVHcm91cExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgKTsKICAgIG15IEBHcm91cElEcyA9IHNvcnQga2V5cyAlR3JvdXBMaXN0OwoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgU0VMRUNUIGNhLnN0YXJ0X3RpbWUsIGNhLmVuZF90aW1lCiAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCBjYQogICAgICAgIEpPSU4gY2FsZW5kYXIgYyBPTiBjYS5jYWxlbmRhcl9pZCA9IGMuaWQKICAgICAgICBXSEVSRSBjLmdyb3VwX2lkIElOICggJHtcKGpvaW4gJywgJywgQEdyb3VwSURzKX0gKQogICAgIjsKCiAgICBteSBAQmluZDsKCiAgICBpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICRQYXJhbXtFbmRUaW1lfSApIHsKCiAgICAgICAgJFNRTCAuPSAnQU5EICgKICAgICAgICAgICAgKGNhLnN0YXJ0X3RpbWUgPj0gPyBBTkQgY2Euc3RhcnRfdGltZSA8ID8pIE9SCiAgICAgICAgICAgIChjYS5lbmRfdGltZSA+ID8gQU5EIGNhLmVuZF90aW1lIDw9ID8pIE9SCiAgICAgICAgICAgIChjYS5zdGFydF90aW1lIDw9ID8gQU5EIGNhLmVuZF90aW1lID49ID8pCiAgICAgICAgKSAnOwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17U3RhcnRUaW1lfSwgXCRQYXJhbXtFbmRUaW1lfSwgXCRQYXJhbXtTdGFydFRpbWV9LCBcJFBhcmFte0VuZFRpbWV9LCBcJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgIFwkUGFyYW17RW5kVGltZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtTdGFydFRpbWV9ICYmICEkUGFyYW17RW5kVGltZX0gKSB7CgogICAgICAgICRTUUwgLj0gJ0FORCBjYS5lbmRfdGltZSA+PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtTdGFydFRpbWV9OwogICAgfQogICAgZWxzaWYgKCAhJFBhcmFte1N0YXJ0VGltZX0gJiYgJFBhcmFte0VuZFRpbWV9ICkgewoKICAgICAgICAkU1FMIC49ICdBTkQgY2Euc3RhcnRfdGltZSA8PSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtFbmRUaW1lfTsKICAgIH0KCiAgICAkU1FMIC49ICdPUkRFUiBCWSBjYS5pZCBBU0MnOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgbXkgJVJlc3VsdDsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgKCAkU3RhcnRUaW1lLCAkRW5kVGltZSApOwoKICAgICAgICAjIFN0YXJ0VGltZQogICAgICAgIGlmICggJFBhcmFte1N0YXJ0VGltZX0gKSB7CiAgICAgICAgICAgICRTdGFydFRpbWUgPSAkUm93WzBdIGx0ICRQYXJhbXtTdGFydFRpbWV9ID8gJFBhcmFte1N0YXJ0VGltZX0gOiAkUm93WzBdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIEVuZFRpbWUKICAgICAgICBpZiAoICRQYXJhbXtFbmRUaW1lfSApIHsKICAgICAgICAgICAgJEVuZFRpbWUgPSAkUm93WzFdIGd0ICRQYXJhbXtFbmRUaW1lfSA/ICRQYXJhbXtFbmRUaW1lfSA6ICRSb3dbMV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkRW5kVGltZSA9ICRSb3dbMV07CiAgICAgICAgfQoKICAgICAgICAjIEdldCBzeXN0ZW0gdGltZXMuCiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbmRUaW1lLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGZvciAoCiAgICAgICAgICAgIG15ICRMb29wVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRMb29wVGltZU9iamVjdCA8ICRFbmRUaW1lT2JqZWN0OwogICAgICAgICAgICAkTG9vcFRpbWVPYmplY3QtPkFkZCggRGF5cyA9PiAxICkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJExvb3BUaW1lID0gJExvb3BUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgICAgICAgICAgJExvb3BUaW1lID1+IHMvXHMuKj8kLy9nc207CgogICAgICAgICAgICBpZiAoICRSZXN1bHR7JExvb3BUaW1lfSApIHsKICAgICAgICAgICAgICAgICRSZXN1bHR7JExvb3BUaW1lfSsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJlc3VsdHskTG9vcFRpbWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgIEtleSAgID0+ICIkQ2FjaGVLZXlTdGFydC0kQ2FjaGVLZXlFbmQiLAogICAgICAgIFZhbHVlID0+IFwlUmVzdWx0LAogICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgKTsKCiAgICByZXR1cm4gJVJlc3VsdDsKfQoKPWhlYWQyIEFwcG9pbnRtZW50R2V0KCkKCkdldCBhcHBvaW50bWVudCBkYXRhLgoKICAgIG15ICVBcHBvaW50bWVudCA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3IKICAgICAgICBVbmlxdWVJRCAgICAgID0+ICcyMDE2MDEwMVQxNjAwMDAtNzFFMzg2QGxvY2FsaG9zdCcsICMgKHJlcXVpcmVkKSB3aWxsIHJldHVybiBvbmx5IHBhcmVudCBmb3IgcmVjdXJyaW5nIGFwcG9pbnRtZW50cwogICAgICAgIENhbGVuZGFySUQgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKUmV0dXJucyBhIGhhc2g6CgogICAgJUFwcG9pbnRtZW50ID0gKAogICAgICAgIEFwcG9pbnRtZW50SUQgICAgICAgPT4gMiwKICAgICAgICBQYXJlbnRJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb25seSBmb3IgcmVjdXJyZWQgKGNoaWxkKSBhcHBvaW50bWVudHMKICAgICAgICBDYWxlbmRhcklEICAgICAgICAgID0+IDEsCiAgICAgICAgVW5pcXVlSUQgICAgICAgICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLAogICAgICAgIFRpdGxlICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLAogICAgICAgIERlc2NyaXB0aW9uICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywKICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgID0+ICdTdHJhdWJpbmcnLAogICAgICAgIFN0YXJ0VGltZSAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLAogICAgICAgIEVuZFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLAogICAgICAgIEFsbERheSAgICAgICAgICAgICAgPT4gMCwKICAgICAgICBUZWFtSUQgICAgICAgICAgICAgID0+IFsgMSBdLAogICAgICAgIFJlc291cmNlSUQgICAgICAgICAgPT4gWyAxLCAzIF0sCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VUeXBlICAgICAgPT4gJ0RhaWx5JywKICAgICAgICBSZWN1cnJlbmNlRnJlcXVlbmN5ID0+IDEsCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICA9PiAxLAogICAgICAgIFJlY3VycmVuY2VJbnRlcnZhbCAgPT4gMiwKICAgICAgICBSZWN1cnJlbmNlVW50aWwgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlSUQgICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywKICAgICAgICBSZWN1cnJlbmNlRXhjbHVkZSAgID0+IFsKICAgICAgICAgICAgJzIwMTYtMDEtMTAgMDA6MDA6MDAnLAogICAgICAgICAgICAnMjAxNi0wMS0xMSAwMDowMDowMCcsCiAgICAgICAgXSwKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDowMCcsCiAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgICAgICAgICAgICAgID0+ICdDdXN0b20nLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXRDb3VudCAgICAgICA9PiAnMTInLAogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbVVuaXQgICAgICAgICAgICA9PiAnbWludXRlcycsCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tVW5pdFBvaW50T2ZUaW1lID0+ICdiZWZvcmVzdGFydCcsCgogICAgICAgIFRpY2tldEFwcG9pbnRtZW50UnVsZUlEID0+ICc5YmIyMGVhMDM1ZTdhOTkzMDY1MmE5ZDgyZDAwYzcyNScsICAjIGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhCiAgICAgICAgQ3JlYXRlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENyZWF0ZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiAgICAgICAgQ2hhbmdlVGltZSAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLAogICAgICAgIENoYW5nZUJ5ICAgICAgICAgICAgICAgID0+IDIsCiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIEZ1dHVyZVRhc2tJRCA9PiAxLAojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICk7Cgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKAogICAgICAgICEkUGFyYW17QXBwb2ludG1lbnRJRH0KICAgICAgICAmJiAhKCAkUGFyYW17VW5pcXVlSUR9ICYmICRQYXJhbXtDYWxlbmRhcklEfSApCiAgICAgICAgKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBBcHBvaW50bWVudElEIG9yIFVuaXF1ZUlEIGFuZCBDYWxlbmRhcklEISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJERhdGE7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICAkRGF0YSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoIHJlZiAkRGF0YSBlcSAnSEFTSCcgKSB7CiAgICAgICAgcmV0dXJuICV7JERhdGF9OwogICAgfQoKICAgICMgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgIG15IEBCaW5kOwoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgIG15ICRTUUwgPSAnCiMgICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKIyAgICAgICAgICAgICBlbmRfdGltZSwgYWxsX2RheSwgdGVhbV9pZCwgcmVzb3VyY2VfaWQsIHJlY3VycmluZywgcmVjdXJfdHlwZSwgcmVjdXJfZnJlcSwgcmVjdXJfY291bnQsCiMgICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwsIHJlY3VyX3VudGlsLCByZWN1cl9pZCwgcmVjdXJfZXhjbHVkZSwgbm90aWZ5X3RpbWUsIG5vdGlmeV90ZW1wbGF0ZSwKIyAgICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAojICAgICAgICAgICAgIG5vdGlmeV9jdXN0b21fZGF0ZSwgdGlja2V0X2FwcG9pbnRtZW50X3J1bGVfaWQsIGNyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLAojICAgICAgICAgICAgIGNoYW5nZV9ieQojICAgICAgICAgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudAojICAgICAgICBXSEVSRQojICAgICAnOwogICAgbXkgJFNRTCA9ICcKICAgICAgICBTRUxFQ1QgaWQsIHBhcmVudF9pZCwgY2FsZW5kYXJfaWQsIHVuaXF1ZV9pZCwgdGl0bGUsIGRlc2NyaXB0aW9uLCBsb2NhdGlvbiwgc3RhcnRfdGltZSwKICAgICAgICAgICAgZW5kX3RpbWUsIGFsbF9kYXksIHRlYW1faWQsIHJlc291cmNlX2lkLCByZWN1cnJpbmcsIHJlY3VyX3R5cGUsIHJlY3VyX2ZyZXEsIHJlY3VyX2NvdW50LAogICAgICAgICAgICByZWN1cl9pbnRlcnZhbCwgcmVjdXJfdW50aWwsIHJlY3VyX2lkLCByZWN1cl9leGNsdWRlLCBub3RpZnlfdGltZSwgbm90aWZ5X3RlbXBsYXRlLAogICAgICAgICAgICBub3RpZnlfY3VzdG9tLCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQsIG5vdGlmeV9jdXN0b21fdW5pdCwgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX2RhdGUsIHRpY2tldF9hcHBvaW50bWVudF9ydWxlX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwKICAgICAgICAgICAgY2hhbmdlX2J5LCBmdXR1cmVfdGFza19pZAogICAgICAgIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRQogICAgJzsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CiAgICAgICAgJFNRTCAuPSAnaWQgPSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtBcHBvaW50bWVudElEfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gJ3VuaXF1ZV9pZCA9ID8gQU5EIGNhbGVuZGFyX2lkID0gPyBBTkQgcGFyZW50X2lkIElTIE5VTEwgJzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VuaXF1ZUlEfSwgXCRQYXJhbXtDYWxlbmRhcklEfTsKICAgIH0KCiAgICAjIGRiIHF1ZXJ5CiAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQmluZCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICBteSAlUmVzdWx0OwoKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAjIHRlYW0gaWQKICAgICAgICBteSBAVGVhbUlEID0gc3BsaXQoIC8sLywgJFJvd1sxMF0gLy8gJycgKTsKCiAgICAgICAgIyByZXNvdXJjZSBpZAogICAgICAgIG15IEBSZXNvdXJjZUlEID0gc3BsaXQoIC8sLywgJFJvd1sxMV0gLy8gJzAnICk7CgogICAgICAgICMgcmVjdXJyZW5jZSBmcmVxdWVuY3kKICAgICAgICBteSBAUmVjdXJyZW5jZUZyZXF1ZW5jeSA9ICRSb3dbMTRdID8gc3BsaXQoIC8sLywgJFJvd1sxNF0gKSA6IHVuZGVmOwoKICAgICAgICAjIHJlY3VycmVuY2UgZXhjbHVkZQogICAgICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9ICRSb3dbMTldID8gc3BsaXQoIC8sLywgJFJvd1sxOV0gKSA6IHVuZGVmOwoKICAgICAgICAkUmVzdWx0e0FwcG9pbnRtZW50SUR9ICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1swXTsKICAgICAgICAkUmVzdWx0e1BhcmVudElEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxXTsKICAgICAgICAkUmVzdWx0e0NhbGVuZGFySUR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syXTsKICAgICAgICAkUmVzdWx0e1VuaXF1ZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szXTsKICAgICAgICAkUmVzdWx0e1RpdGxlfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s0XTsKICAgICAgICAkUmVzdWx0e0Rlc2NyaXB0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s1XTsKICAgICAgICAkUmVzdWx0e0xvY2F0aW9ufSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s2XTsKICAgICAgICAkUmVzdWx0e1N0YXJ0VGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s3XTsKICAgICAgICAkUmVzdWx0e0VuZFRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s4XTsKICAgICAgICAkUmVzdWx0e0FsbERheX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1s5XTsKICAgICAgICAkUmVzdWx0e1RlYW1JRH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gXEBUZWFtSUQ7CiAgICAgICAgJFJlc3VsdHtSZXNvdXJjZUlEfSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFxAUmVzb3VyY2VJRDsKICAgICAgICAkUmVzdWx0e1JlY3VycmluZ30gICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxMl07CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlVHlwZX0gICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTNdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUZyZXF1ZW5jeX0gICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VGcmVxdWVuY3k7CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlQ291bnR9ICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMTVdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUludGVydmFsfSAgICAgICAgICAgICAgICAgICAgPSAkUm93WzE2XTsKICAgICAgICAkUmVzdWx0e1JlY3VycmVuY2VVbnRpbH0gICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1sxN107CiAgICAgICAgJFJlc3VsdHtSZWN1cnJlbmNlSUR9ICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMThdOwogICAgICAgICRSZXN1bHR7UmVjdXJyZW5jZUV4Y2x1ZGV9ICAgICAgICAgICAgICAgICAgICAgPSBcQFJlY3VycmVuY2VFeGNsdWRlOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uRGF0ZX0gICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzIwXSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvblRlbXBsYXRlfSAgICAgICAgICAgICAgICAgID0gJFJvd1syMV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b219ICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjJdIHx8ICcnOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ICAgPSAkUm93WzIzXSB8fCAwOwogICAgICAgICRSZXN1bHR7Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fSAgICAgICAgPSAkUm93WzI0XSB8fCAnJzsKICAgICAgICAkUmVzdWx0e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9ID0gJFJvd1syNV0gfHwgJyc7CiAgICAgICAgJFJlc3VsdHtOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZX0gICAgICAgICAgICA9ICRSb3dbMjZdIHx8ICcnOwogICAgICAgICRSZXN1bHR7VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9ICAgICAgICAgICAgICAgPSAkUm93WzI3XTsKICAgICAgICAkUmVzdWx0e0NyZWF0ZVRpbWV9ICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1syOF07CiAgICAgICAgJFJlc3VsdHtDcmVhdGVCeX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9ICRSb3dbMjldOwogICAgICAgICRSZXN1bHR7Q2hhbmdlVGltZX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMwXTsKICAgICAgICAkUmVzdWx0e0NoYW5nZUJ5fSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFJvd1szMV07CiMgUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICRSZXN1bHR7RnV0dXJlVGFza0lEfSAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkUm93WzMyXTsKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICB9CgogICAgaWYgKCAkUGFyYW17QXBwb2ludG1lbnRJRH0gKSB7CgogICAgICAgICMgY2FjaGUKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIFZhbHVlID0+IFwlUmVzdWx0LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlUmVzdWx0Owp9Cgo9aGVhZDIgQXBwb2ludG1lbnRVcGRhdGUoKQoKdXBkYXRlcyBhbiBleGlzdGluZyBhcHBvaW50bWVudC4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGRhdGUoCiAgICAgICAgQXBwb2ludG1lbnRJRCAgICAgICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgQ2FsZW5kYXJJRCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpIFZhbGlkIENhbGVuZGFySUQKICAgICAgICBUaXRsZSAgICAgICAgICAgICAgICAgPT4gJ1dlYmluYXInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkgVGl0bGUKICAgICAgICBEZXNjcmlwdGlvbiAgICAgICAgICAgPT4gJ0hvdyB0byB1c2UgUHJvY2VzcyB0aWNrZXRzLi4uJywgICAgICAgICAjIChvcHRpb25hbCkgRGVzY3JpcHRpb24KICAgICAgICBMb2NhdGlvbiAgICAgICAgICAgICAgPT4gJ1N0cmF1YmluZycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgTG9jYXRpb24KICAgICAgICBTdGFydFRpbWUgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTY6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBFbmRUaW1lICAgICAgICAgICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCkKICAgICAgICBBbGxEYXkgICAgICAgICAgICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgRGVmYXVsdCAwCiAgICAgICAgVGVhbSAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgUmVzb3VyY2VJRCAgICAgICAgICAgID0+IFsgMSwgMyBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlIGlmIHN1cHBsaWVkCiAgICAgICAgUmVjdXJyaW5nICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGZsYWcgdGhlIGFwcG9pbnRtZW50IGFzIHJlY3VycmluZyAocGFyZW50IG9ubHkhKQoKICAgICAgICBSZWN1cnJlbmNlVHlwZSAgICAgICAgPT4gJ0RhaWx5JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChyZXF1aXJlZCBpZiBSZWN1cnJpbmcpIFBvc3NpYmxlICJEYWlseSIsICJXZWVrbHkiLCAiTW9udGhseSIsICJZZWFybHkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICJDdXN0b21XZWVrbHkiLCAiQ3VzdG9tTW9udGhseSIsICJDdXN0b21ZZWFybHkiCgogICAgICAgIFJlY3VycmVuY2VGcmVxdWVuY3kgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkIGlmIEN1c3RvbSBSZWN1cnJpbmcpIFJlY3VycmVuY2UgcGF0dGVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgIGZvciBDdXN0b21XZWVrbHk6IDEtTW9uLCAyLVR1ZSwuLi4sIDctU3VuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgZm9yIEN1c3RvbU1vbnRobHk6IDEtSmFuLCAyLUZlYiwuLi4sIDEyLURlYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgLi4uCiAgICAgICAgUmVjdXJyZW5jZUNvdW50ICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIEhvdyBtYW55IEFwcG9pbnRtZW50cyB0byBjcmVhdGUKICAgICAgICBSZWN1cnJlbmNlSW50ZXJ2YWwgICAgPT4gMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUmVwZWF0aW5nIGludGVydmFsIChkZWZhdWx0IDEpCiAgICAgICAgUmVjdXJyZW5jZVVudGlsICAgICAgID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFVudGlsIGRhdGUKICAgICAgICBOb3RpZmljYXRpb25UaW1lICAgICAgPT4gJzIwMTYtMDEtMDEgMTc6MDA6MDAnLCAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgdGltZSB0byBleGVjdXRlIHRoZSBub3RpZmljYXRpb24gZXZlbnQKICAgICAgICBOb3RpZmljYXRpb25UZW1wbGF0ZSAgPT4gJ0N1c3RvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGVtcGxhdGUgdG8gYmUgdXNlZCBmb3Igbm90aWZpY2F0aW9uIHBvaW50IG9mIHRpbWUKICAgICAgICBOb3RpZmljYXRpb25DdXN0b20gICAgPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVHlwZSBvZiB0aGUgY3VzdG9tIHRlbXBsYXRlIG5vdGlmaWNhdGlvbiBwb2ludCBvZiB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICAgIFBvc3NpYmxlICJyZWxhdGl2ZSIsICJkYXRldGltZSIKICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudCAgID0+ICcxMicsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyBjb3VudCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAnbWludXRlcycsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIG1pbnV0ZXMsIGhvdXJzIG9yIGRheXMgdW5pdCBmb3IgY3VzdG9tIHRlbXBsYXRlCiAgICAgICAgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnLCAgICAgICAgICAgIyAob3B0aW9uYWwpIFBvaW50IG9mIGV4ZWN1dGUgZm9yIGN1c3RvbSB0ZW1wbGF0ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgImJlZm9yZXN0YXJ0IiwgImFmdGVyc3RhcnQiLCAiYmVmb3JlZW5kIiwgImFmdGVyZW5kIgogICAgICAgIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBOb3RpZmljYXRpb24gZGF0ZSB0aW1lIGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICBUaWNrZXRBcHBvaW50bWVudFJ1bGVJRCAgICA9PiAnOWJiMjBlYTAzNWU3YTk5MzA2NTJhOWQ4MmQwMGM3MjUnLCAjIChvcHRpb25hbCkgVGlja2V0IGFwcG9pbnRtZW50IHJ1bGUgSUQgKGZvciB0aWNrZXQgYXBwb2ludG1lbnRzIG9ubHkhKQogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKSBVc2VySUQKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgRnV0dXJlVGFza0lEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIElEIG9mIGZ1dHVyZSB0YXNrCiAgICAgICAgQXBwb2ludG1lbnRUaWNrZXQgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIERhdGEgZm9yIHRpY2tldCBjcmVhdGlvbgogICAgICAgICAgICBUaW1lID0+ICcyMDE2LTAxLTEwIDAwOjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBQb2ludCBvZiB0aW1lIHRvIGV4ZWN1dGUgdGhlIHRpY2tldCBjcmVhdCBldmVudAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnQ3VzdG9tJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUZW1wbGF0ZSB0byBiZSB1c2VkIGZvciB0aWNrZXQgcG9pbnQgb2YgdGltZQogICAgICAgICAgICBDdXN0b20gPT4gJ3JlbGF0aXZlJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUeXBlIG9mIHRoZSBjdXN0b20gdGVtcGxhdGUgdGlja2V0IHBvaW50IG9mIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgICAgUG9zc2libGUgInJlbGF0aXZlIiwgImRhdGV0aW1lIgogICAgICAgICAgICBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCA9PiAnMTInLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBtaW51dGVzLCBob3VycyBvciBkYXlzIGNvdW50IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0ID0+ICdtaW51dGVzJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgbWludXRlcywgaG91cnMgb3IgZGF5cyB1bml0IGZvciBjdXN0b20gdGVtcGxhdGUKICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAnYmVmb3Jlc3RhcnQnICAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgUG9pbnQgb2YgZXhlY3V0ZSBmb3IgY3VzdG9tIHRlbXBsYXRlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgICBQb3NzaWJsZSAiYmVmb3Jlc3RhcnQiLCAiYWZ0ZXJzdGFydCIsICJiZWZvcmVlbmQiLCAiYWZ0ZXJlbmQiCiAgICAgICAgICAgIEN1c3RvbURhdGVUaW1lID0+ICcyMDE2LTAxLTAxIDE3OjAwOjAwJywgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBkYXRlIHRpbWUgZm9yIGN1c3RvbSB0ZW1wbGF0ZQogICAgICAgICAgICBRdWV1ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgcXVldWUKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IGN1c3RvbWVyIGlkCiAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAndGVzdEB0ZXN0LmNvbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBjdXN0b21lciB1c2VyCiAgICAgICAgICAgIFNlbGVjdGVkQ3VzdG9tZXJVc2VyID0+ICd0ZXN0JywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFNlbGVjdGVkIGN1c3RvbWVyIHVzZXIKICAgICAgICAgICAgVXNlcklEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHVzZXIgaWQKICAgICAgICAgICAgT3duZXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IG93bmVyIGlkCiAgICAgICAgICAgIExvY2sgPT4gJ3VubG9jaycsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBsb2NrIHN0YXRlCiAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCBwcmlvcml0eQogICAgICAgICAgICBTdGF0ZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBUaWNrZXQgc3RhdGUKICAgICAgICAgICAgU2VydmljZUlEID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UKICAgICAgICAgICAgU0xBSUQgPT4gMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgVGlja2V0IHNlcnZpY2UgbGV2ZWwgYWdyZWVtZW50CiAgICAgICAgICAgIFR5cGVJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFRpY2tldCB0eXBlIGlkCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIE5hbWUgdmFsdWUgY29tYmluYXRpb25zIGZvciBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTEgPT4gVmFsdWUxLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkTmFtZTIgPT4gVmFsdWUyLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnRVcGRhdGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBDYWxlbmRhcklEIFRpdGxlIFN0YXJ0VGltZSBFbmRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgaWYgUmVjdXJyaW5nIGlzIHByb3ZpZGVkLCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgbXVzdCBiZSBwcmVzZW50CiAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewoKICAgICAgICBteSBAUmVjdXJyZW5jZVR5cGVzID0gKAogICAgICAgICAgICAiRGFpbHkiLCAgICAgICAiV2Vla2x5IiwgICAgICAgIk1vbnRobHkiLCAgICAgICAiWWVhcmx5IiwKICAgICAgICAgICAgIkN1c3RvbURhaWx5IiwgIkN1c3RvbVdlZWtseSIsICJDdXN0b21Nb250aGx5IiwgIkN1c3RvbVllYXJseSIKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUGFyYW17UmVjdXJyZW5jZVR5cGV9CiAgICAgICAgICAgIHx8ICFncmVwIHsgJF8gZXEgJFBhcmFte1JlY3VycmVuY2VUeXBlfSB9IEBSZWN1cnJlbmNlVHlwZXMKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VUeXBlIGludmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21XZWVrbHknCiAgICAgICAgICAgICAgICB8fCAkUGFyYW17UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21Nb250aGx5JwogICAgICAgICAgICAgICAgfHwgJFBhcmFte1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tWWVhcmx5JwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICEkUGFyYW17UmVjdXJyZW5jZUZyZXF1ZW5jeX0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlY3VycmVuY2VGcmVxdWVuY3kgbmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgJFBhcmFte1JlY3VycmVuY2VJbnRlcnZhbH0gfHw9IDE7CgogICAgIyBDaGVjayBTdGFydFRpbWUuCiAgICBteSAkU3RhcnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgfSwKICAgICk7CiAgICBpZiAoICEkU3RhcnRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU3RhcnRUaW1lIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIENoZWNrIEVuZFRpbWUuCiAgICBteSAkRW5kVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICB9LAogICAgKTsKICAgIGlmICggISRFbmRUaW1lT2JqZWN0ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiRW5kVGltZSBpbnZhbGlkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBjaGVjayBpZiBhcnJheSByZWZzCiAgICBteSAlQXJyYXlzOwogICAgZm9yIG15ICRQYXJhbWV0ZXIgKAogICAgICAgIHF3KFRlYW1JRCBSZXNvdXJjZUlEIFJlY3VycmVuY2VGcmVxdWVuY3kpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmIEB7ICRQYXJhbXskUGFyYW1ldGVyfSAvLyBbXSB9ICkgewogICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBub3QgQVJSQVlSRUYhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXskUGFyYW1ldGVyfSB9OwoKICAgICAgICAgICAgIyByZW1vdmUgdW5kZWZpbmVkIHZhbHVlcwogICAgICAgICAgICBAQXJyYXkgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBBcnJheTsKCiAgICAgICAgICAgICRBcnJheXN7JFBhcmFtZXRlcn0gPSBqb2luKCAnLCcsIEBBcnJheSApIGlmIEBBcnJheTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBudW1iZXJzCiAgICBmb3IgbXkgJFBhcmFtZXRlciAoCiAgICAgICAgcXcoUmVjdXJyaW5nIFJlY3VycmVuY2VDb3VudCBSZWN1cnJlbmNlSW50ZXJ2YWwpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFBhcmFteyRQYXJhbWV0ZXJ9ICYmICFJc0ludGVnZXIoICRQYXJhbXskUGFyYW1ldGVyfSApICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJFBhcmFtZXRlciBtdXN0IGJlIGEgbnVtYmVyISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBSZWN1cnJlbmNlVW50aWwKICAgIGlmICggJFBhcmFte1JlY3VycmVuY2VVbnRpbH0gKSB7CgogICAgICAgICMgVXN1YWxseSBob3VyLCBtaW51dGUgYW5kIHNlY29uZCA9IDAuIEluIHRoaXMgY2FzZSwgdGFrZSB0aW1lIGZyb20gU3RhcnRUaW1lLgogICAgICAgICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9ID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRQYXJhbXtSZWN1cnJlbmNlVW50aWx9LAogICAgICAgICk7CgogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkUmVjdXJyZW5jZVVudGlsT2JqZWN0CiAgICAgICAgICAgIHx8ICRTdGFydFRpbWVPYmplY3QgPiAkUmVjdXJyZW5jZVVudGlsT2JqZWN0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJSZWN1cnJlbmNlVW50aWwgaW52YWxpZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHByZXZpb3VzIENhbGVuZGFySUQKICAgIG15ICRQcmV2aW91c0NhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBzZXQgcmVjdXJyZW5jZSBleGNsdWRlIGxpc3QKICAgIG15IEBSZWN1cnJlbmNlRXhjbHVkZSA9IEB7ICRQYXJhbXtSZWN1cnJlbmNlRXhjbHVkZX0gLy8gW10gfTsKCiAgICAjIGdldCBSZWN1cnJlbmNlSUQKICAgIG15ICRSZWN1cnJlbmNlSUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEKAogICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgKTsKCiAgICAjIHVzZSBleGNsdWRlIGxpc3QgdG8gZmxhZyB0aGUgcmVjdXJyaW5nIG9jY3VycmVuY2UgYXMgdXBkYXRlZAogICAgaWYgKCRSZWN1cnJlbmNlSUQpIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoJFJlY3VycmVuY2VJRCk7CiAgICB9CgogICAgIyByZXNldCBleGNsdWRlIGxpc3QgaWYgcmVjdXJyZW5jZSBpcyB0dXJuZWQgb2ZmCiAgICBlbHNpZiAoICEkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSAoKTsKICAgIH0KCiAgICAjIHJlbW92ZSB1bmRlZmluZWQgdmFsdWVzCiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBncmVwIHsgZGVmaW5lZCAkXyB9IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIHNlcmlhbGl6ZSBkYXRhCiAgICBteSAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApIHx8IHVuZGVmOwoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHJlY3VycmVkIGFwcG9pbnRtZW50cwogICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRGVsZXRlKAogICAgICAgIFBhcmVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmFibGUgdG8gZGVsZXRlIHJlY3VycmluZyBBcHBvaW50bWVudCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiMgICAgICMgdXBkYXRlIGFwcG9pbnRtZW50CiMgICAgIG15ICRTUUwgPSAnCiMgICAgICAgICBVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQKIyAgICAgICAgIFNFVAojICAgICAgICAgICAgIGNhbGVuZGFyX2lkPT8sIHRpdGxlPT8sIGRlc2NyaXB0aW9uPT8sIGxvY2F0aW9uPT8sIHN0YXJ0X3RpbWU9PywgZW5kX3RpbWU9PywgYWxsX2RheT0/LAojICAgICAgICAgICAgIHRlYW1faWQ9PywgcmVzb3VyY2VfaWQ9PywgcmVjdXJyaW5nPT8sIHJlY3VyX3R5cGU9PywgcmVjdXJfZnJlcT0/LCByZWN1cl9jb3VudD0/LAojICAgICAgICAgICAgIHJlY3VyX2ludGVydmFsPT8sIHJlY3VyX3VudGlsPT8sIHJlY3VyX2V4Y2x1ZGU9Pywgbm90aWZ5X3RpbWU9Pywgbm90aWZ5X3RlbXBsYXRlPT8sCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbT0/LCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQ9Pywgbm90aWZ5X2N1c3RvbV91bml0PT8sCiMgICAgICAgICAgICAgbm90aWZ5X2N1c3RvbV91bml0X3BvaW50PT8sIG5vdGlmeV9jdXN0b21fZGF0ZT0/LCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZD0/LAojICAgICAgICAgICAgIGNoYW5nZV90aW1lPWN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnk9PwojICAgICAgICAgV0hFUkUgaWQ9PwojICAgICAnOwoKIyAgICAgIyB1cGRhdGUgZGIgcmVjb3JkCiMgICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAojICAgICAgICAgU1FMICA9PiAkU1FMLAojICAgICAgICAgQmluZCA9PiBbCiMgICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcklEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sICAgICAgICAgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwgXCRQYXJhbXtMb2NhdGlvbn0sCiMgICAgICAgICAgICAgXCRQYXJhbXtTdGFydFRpbWV9LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtFbmRUaW1lfSwgICAgICAgICBcJFBhcmFte0FsbERheX0sICAgICAgXCRBcnJheXN7VGVhbUlEfSwKIyAgICAgICAgICAgICBcJEFycmF5c3tSZXNvdXJjZUlEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcJFBhcmFte1JlY3VycmluZ30sICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVR5cGV9LAojICAgICAgICAgICAgIFwkQXJyYXlze1JlY3VycmVuY2VGcmVxdWVuY3l9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAojICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZVVudGlsfSwgICAgICAgICAgICAgICAgICAgICAgIFwkUmVjdXJyZW5jZUV4Y2x1ZGUsICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25EYXRlfSwKIyAgICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvblRlbXBsYXRlfSwgICAgICAgICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbX0sCiMgICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAojICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWV9LAojICAgICAgICAgICAgIFwkUGFyYW17VGlja2V0QXBwb2ludG1lbnRSdWxlSUR9LCAgICAgICAgICAgICAgIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtBcHBvaW50bWVudElEfSwKIyAgICAgICAgIF0sCiMgICAgICk7CiAgICBteSAkU1FMID0gJwogICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFNFVAogICAgICAgICAgICBjYWxlbmRhcl9pZCA9ID8sIHRpdGxlID0gPywgZGVzY3JpcHRpb24gPSA/LCBsb2NhdGlvbiA9ID8sIHN0YXJ0X3RpbWUgPSA/LCBlbmRfdGltZSA9ID8sIGFsbF9kYXkgPSA/LAogICAgICAgICAgICB0ZWFtX2lkID0gPywgcmVzb3VyY2VfaWQgPSA/LCByZWN1cnJpbmcgPSA/LCByZWN1cl90eXBlID0gPywgcmVjdXJfZnJlcSA9ID8sIHJlY3VyX2NvdW50ID0gPywKICAgICAgICAgICAgcmVjdXJfaW50ZXJ2YWwgPSA/LCByZWN1cl91bnRpbCA9ID8sIHJlY3VyX2V4Y2x1ZGUgPSA/LCBub3RpZnlfdGltZSA9ID8sIG5vdGlmeV90ZW1wbGF0ZSA9ID8sCiAgICAgICAgICAgIG5vdGlmeV9jdXN0b20gPSA/LCBub3RpZnlfY3VzdG9tX3VuaXRfY291bnQgPSA/LCBub3RpZnlfY3VzdG9tX3VuaXQgPSA/LAogICAgICAgICAgICBub3RpZnlfY3VzdG9tX3VuaXRfcG9pbnQgPSA/LCBub3RpZnlfY3VzdG9tX2RhdGUgPSA/LCB0aWNrZXRfYXBwb2ludG1lbnRfcnVsZV9pZCA9ID8sCiAgICAgICAgICAgIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8sIGZ1dHVyZV90YXNrX2lkID0gPwogICAgICAgIFdIRVJFIGlkID0gPwogICAgJzsKCiAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCAgPT4gJFNRTCwKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDYWxlbmRhcklEfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCRQYXJhbXtUaXRsZX0sICAgICAgICAgICBcJFBhcmFte0Rlc2NyaXB0aW9ufSwgXCRQYXJhbXtMb2NhdGlvbn0sCiAgICAgICAgICAgIFwkUGFyYW17U3RhcnRUaW1lfSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17RW5kVGltZX0sICAgICAgICAgXCRQYXJhbXtBbGxEYXl9LCAgICAgIFwkQXJyYXlze1RlYW1JRH0sCiAgICAgICAgICAgIFwkQXJyYXlze1Jlc291cmNlSUR9LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyaW5nfSwgICAgICAgXCRQYXJhbXtSZWN1cnJlbmNlVHlwZX0sCiAgICAgICAgICAgIFwkQXJyYXlze1JlY3VycmVuY2VGcmVxdWVuY3l9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17UmVjdXJyZW5jZUNvdW50fSwgXCRQYXJhbXtSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgICAgICBcJFBhcmFte1JlY3VycmVuY2VVbnRpbH0sICAgICAgICAgICAgICAgICAgICAgICBcJFJlY3VycmVuY2VFeGNsdWRlLCAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uVGVtcGxhdGV9LCAgICAgICAgICAgICAgICAgIFwkUGFyYW17Tm90aWZpY2F0aW9uQ3VzdG9tfSwKICAgICAgICAgICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0sICAgXCRQYXJhbXtOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXR9LAogICAgICAgICAgICBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9LCBcJFBhcmFte05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRBcHBvaW50bWVudFJ1bGVJRH0sICAgICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte0Z1dHVyZVRhc2tJRH0sIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgXSwKICAgICk7CiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgYWRkIHJlY3VycmVkIGFwcG9pbnRtZW50cyBhZ2FpbgogICAgaWYgKCAkUGFyYW17UmVjdXJyaW5nfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQXBwb2ludG1lbnRSZWN1cnJpbmdDcmVhdGUoCiAgICAgICAgICAgIFBhcmVudElEICAgID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICAgICAgICAgQXBwb2ludG1lbnQgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICBteSAkQ3VycmVudERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CiAgICBteSAkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQ7CgogICAgIyBTZXQgZnV0dXJlIHRhc2sgaWQgdG8gTlVMTCBhbmQgZGVsZXRlIGZ1dHVyZSB0YXNrIGlmIG5vIGlkIHByb3ZpZGVkLCBlbHNlIHVwZGF0ZSBleGlzdGluZyBmdXR1cmUgdGFzawogICAgaWYgKCAhJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSApIHsKCiAgICAgICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtICgKICAgICAgICAgICAgcXcoCiAgICAgICAgICAgICAgICBEYXRlIFRlbXBsYXRlIEN1c3RvbSBDdXN0b21SZWxhdGl2ZVVuaXRDb3VudAogICAgICAgICAgICAgICAgQ3VzdG9tUmVsYXRpdmVVbml0IEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUgQ3VzdG9tRGF0ZVRpbWUKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57JFBvc3NpYmxlUGFyYW19ID0gdW5kZWY7CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkUGFyYW17RnV0dXJlVGFza0lEfSAmJiAhJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RlbXBsYXRlfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICBUYXNrSUQgPT4gJFBhcmFte0Z1dHVyZVRhc2tJRH0KICAgICAgICApOwogICAgICAgICRQYXJhbXtGdXR1cmVUYXNrSUR9ID0gdW5kZWY7CiAgICB9CgogICAgIyBGdXR1cmVUYXNrIGlzIHRvIGJlIChyZSljcmVhdGVkCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0gKSB7CgogICAgICAgICMgQ29sbGVjdCBkYXRhIGZvciBjcmVhdGluZyBvciB1cGRhdGluZyBmdXR1cmUgdGFzawogICAgICAgIG15ICVGdXR1cmVUYXNrRGF0YSA9ICgKICAgICAgICAgICAgVHlwZSA9PiAnQXBwb2ludG1lbnRUaWNrZXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50VGlja2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT4lKiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBmb3IgcmVjdXJyaW5nIGFuZCBpZiBleGVjdXRpb24gdGltZSBpcyBpbiBmdXR1cmUKICAgICAgICBpZiAoICRQYXJhbXtSZWN1cnJpbmd9ICkgewogICAgICAgICAgICBteSBAQXBwb2ludG1lbnRMaXN0ID0gJFNlbGYtPkFwcG9pbnRtZW50TGlzdCgKICAgICAgICAgICAgICAgIENhbGVuZGFySUQgPT4gJFByZXZpb3VzQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIFBhcmVudElEICAgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCggQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKICAgICAgICAgICAgdW5zaGlmdCBAQXBwb2ludG1lbnRMaXN0LCBcJVBhcmVudEFwcG9pbnRtZW50OwoKICAgICAgICAgICAgQVBQT0lOVE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXBwb2ludG1lbnQgKEBBcHBvaW50bWVudExpc3QpIHsKICAgICAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWUgPSAkU2VsZi0+QXBwb2ludG1lbnRUb1RpY2tldEV4ZWN1dGlvblRpbWUoCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldFRpbWUgICAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e1RpbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSAgICAgICAgICAgICAgICAgID0+ICRQYXJhbXtBcHBvaW50bWVudFRpY2tldH0tPntUZW1wbGF0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50ICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdENvdW50fSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0ICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0fSwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbURhdGVUaW1lICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbURhdGVUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICAjIHdoZW4gdGhlIGFwcG9pbnRtZW50IHdhcyBqdXN0IHVwZGF0ZWQgaW4gZGF0YWJhc2UsIG1heWJlIHRoZSBkYXRhIGlzIHN0aWxsIGluY29ycmVjdCBoZXJlCiAgICAgICAgICAgICAgICAgICAgU3RhcnRUaW1lID0+ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9ID09ICRQYXJhbXtBcHBvaW50bWVudElEfSA/ICRQYXJhbXtTdGFydFRpbWV9IDogJEFwcG9pbnRtZW50LT57U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgICAgICBFbmRUaW1lICAgPT4gJEFwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0gPT0gJFBhcmFte0FwcG9pbnRtZW50SUR9ID8gJFBhcmFte0VuZFRpbWV9ICAgOiAkQXBwb2ludG1lbnQtPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZSwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZU9iamVjdC0+Q29tcGFyZSggRGF0ZVRpbWVPYmplY3QgPT4gJEN1cnJlbnREYXRlVGltZU9iamVjdCApID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSA9ICRBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwogICAgICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrRGF0YXtFeGVjdXRpb25UaW1lfSAgICAgICAgID0gJEFwcG9pbnRtZW50RXhlY3V0aW9uVGltZTsKICAgICAgICAgICAgICAgICAgICBsYXN0IEFQUE9JTlRNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCA9ICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgU2luZ2xlIGFwcG9pbnRtZW50LCBjaGVja2luZyBpZiBpdHMgZXhlY3V0aW9uIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICBteSAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lID0gJFNlbGYtPkFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lKAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGltZSAgICAgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGltZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0VGVtcGxhdGUgICAgICAgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57VGVtcGxhdGV9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbSAgICAgICAgICAgICAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdCAgICAgICAgPT4gJFBhcmFte0FwcG9pbnRtZW50VGlja2V0fS0+e0N1c3RvbVJlbGF0aXZlVW5pdH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZX0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0Q3VzdG9tRGF0ZVRpbWUgICAgICAgICAgICA9PiAkUGFyYW17QXBwb2ludG1lbnRUaWNrZXR9LT57Q3VzdG9tRGF0ZVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSA9PiAkUGFyYW17U3RhcnRUaW1lfSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICA9PiAkUGFyYW17RW5kVGltZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkQXBwb2ludG1lbnRFeGVjdXRpb25UaW1lT2JqZWN0LT5Db21wYXJlKCBEYXRlVGltZU9iamVjdCA9PiAkQ3VycmVudERhdGVUaW1lT2JqZWN0ICkgKSB7CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSA9ICRQYXJhbXtBcHBvaW50bWVudElEfTsKICAgICAgICAgICAgICAgICRGdXR1cmVUYXNrQXBwb2ludG1lbnRJRCAgICAgICAgICAgICAgID0gJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH07CiAgICAgICAgICAgICAgICAkRnV0dXJlVGFza0RhdGF7RXhlY3V0aW9uVGltZX0gICAgICAgICA9ICRBcHBvaW50bWVudEV4ZWN1dGlvblRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCAkUGFyYW17RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgJEZ1dHVyZVRhc2tEYXRhe1Rhc2tJRH0gPSAkUGFyYW17RnV0dXJlVGFza0lEfTsKCiAgICAgICAgICAgICMgSWYgdGhlcmUgaXMgYW4gYXBwb2ludG1lbnQgd2l0aCBleGVjdXRpb24gdGltZSBpbiB0aGUgZnV0dXJlLCB1cGRhdGUgZnV0dXJlIHRhc2sKICAgICAgICAgICAgaWYgKCAkRnV0dXJlVGFza0RhdGF7RGF0YX0tPntBcHBvaW50bWVudElEfSApIHsKICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKS0+RnV0dXJlVGFza1VwZGF0ZSglRnV0dXJlVGFza0RhdGEpOwogICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGdXR1cmUgdGFzayAkRnV0dXJlVGFza0RhdGF7VGFza0lEfSBvZiB0eXBlIGFwcG9pbnRtZW50IHRpY2tldCBmb3IgYXBwb2ludG1lbnQgJEZ1dHVyZVRhc2tEYXRhe0RhdGF9LT57QXBwb2ludG1lbnRJRH0gY291bGQgbm90IGJlIHVwZGF0ZWQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgIyBEZWxldGUgZXhpc3RpbmcgZnV0dXJlIHRhc2sgc2luY2UgdXBkYXRlZCBleGVjdXRpb24gdGltZSBpcyBub3QgaW4gdGhlIGZ1dHVyZQogICAgICAgICAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSB1bmRlZjsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrRGF0YXtUYXNrSUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBObyBmdXR1cmUgdGFzayBpZCBwcmVzZW50LCBjcmVhdGUgZnV0dXJlIHRhc2sgaWYgZXhlY3V0aW9uIHRpbWUgaXMgaW4gdGhlIGZ1dHVyZQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e0FwcG9pbnRtZW50SUR9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte0Z1dHVyZVRhc2tJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrQWRkKCVGdXR1cmVUYXNrRGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgZnV0dXJlIHRhc2sgaWRzIGZyb20gYWxsIHJlbGF0ZWQgYXBwb2ludG1lbnRzIGFuZCB1cGRhdGUgaXQgd2hlcmUgaXQgYmVsb25ncyBhZnRlcndhcmRzCiAgICBteSAkRGVsZXRlRnV0dXJlVGFza0lEU1FMID0gIgogICAgICAgIFVQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudAogICAgICAgIFNFVCBmdXR1cmVfdGFza19pZCA9IE5VTEwKICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICBPUiBwYXJlbnRfaWQgPSA/CiAgICAiOwogICAgbXkgQEJpbmQgPSAoIFwkUGFyYW17QXBwb2ludG1lbnRJRH0sIFwkUGFyYW17QXBwb2ludG1lbnRJRH0gKTsKCiAgICAjIHVwZGF0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgID0+ICREZWxldGVGdXR1cmVUYXNrSURTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIGlmICgkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQpIHsKICAgICAgICBteSAkVXBkYXRlRnV0dXJlVGFza0lEU1FMID0gIgogICAgICAgICAgICBVUERBVEUgY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgU0VUIGZ1dHVyZV90YXNrX2lkID0gPwogICAgICAgICAgICBXSEVSRSBpZCA9ID8KICAgICAgICAiOwogICAgICAgIG15IEBCaW5kID0gKCBcJFBhcmFte0Z1dHVyZVRhc2tJRH0sIFwkRnV0dXJlVGFza0FwcG9pbnRtZW50SUQgKTsKCiAgICAgICAgIyB1cGRhdGUgZGIgcmVjb3JkCiAgICAgICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICRVcGRhdGVGdXR1cmVUYXNrSURTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgICAgICk7CiAgICB9CgojIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICBteSBAQ2FsZW5kYXJJRHMgPSAoICRQYXJhbXtDYWxlbmRhcklEfSApOwogICAgcHVzaCBAQ2FsZW5kYXJJRHMsICRQcmV2aW91c0NhbGVuZGFySUQgaWYgJFByZXZpb3VzQ2FsZW5kYXJJRCBuZSAkUGFyYW17Q2FsZW5kYXJJRH07CiAgICBmb3IgbXkgJENhbGVuZGFySUQgKEBDYWxlbmRhcklEcykgewogICAgICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkQ2FsZW5kYXJJRCwKICAgICAgICApOwogICAgfQogICAgJENhY2hlT2JqZWN0LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ0RheXMnIC4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZmlyZSBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnRVcGRhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgIENhbGVuZGFySUQgICAgPT4gJFBhcmFte0NhbGVuZGFySUR9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RGVsZXRlKCkKCmRlbGV0ZXMgYW4gZXhpc3RpbmcgYXBwb2ludG1lbnQuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RGVsZXRlKAogICAgICAgIEFwcG9pbnRtZW50SUQgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKRXZlbnRzOgogICAgQXBwb2ludG1lbnREZWxldGUKCj1jdXQKCnN1YiBBcHBvaW50bWVudERlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQXBwb2ludG1lbnRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgIyBnZXQgQ2FsZW5kYXJJRAogICAgbXkgJENhbGVuZGFySUQgPSAkU2VsZi0+X0FwcG9pbnRtZW50R2V0Q2FsZW5kYXJJRCgKICAgICAgICBBcHBvaW50bWVudElEID0+ICRQYXJhbXtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjaGVjayB1c2VyJ3MgcGVybWlzc2lvbnMgZm9yIHRoaXMgY2FsZW5kYXIKICAgIG15ICRQZXJtaXNzaW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhbGVuZGFyJyktPkNhbGVuZGFyUGVybWlzc2lvbkdldCgKICAgICAgICBDYWxlbmRhcklEID0+ICRDYWxlbmRhcklELAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIG15IEBSZXF1aXJlZFBlcm1pc3Npb25zID0gKCAnY3JlYXRlJywgJ3J3JyApOwoKICAgIGlmICggIWdyZXAgeyAkUGVybWlzc2lvbiBlcSAkXyB9IEBSZXF1aXJlZFBlcm1pc3Npb25zICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVXNlcigkUGFyYW17VXNlcklEfSkgaGFzIG5vIHBlcm1pc3Npb24gdG8gZGVsZXRlIEFwcG9pbnRtZW50KCRQYXJhbXtBcHBvaW50bWVudElEfSkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlQXBwb2ludG1lbnQgPSAkU2VsZi0+QXBwb2ludG1lbnRHZXQoCiAgICAgICAgQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgc2F2ZSBleGNsdXNpb24gaW5mbyB0byBwYXJlbnQgYXBwb2ludG1lbnQKICAgIGlmICggJEFwcG9pbnRtZW50e1BhcmVudElEfSAmJiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSApIHsKICAgICAgICAkU2VsZi0+X0FwcG9pbnRtZW50UmVjdXJyaW5nRXhjbHVkZSgKICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRBcHBvaW50bWVudHtQYXJlbnRJRH0sCiAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkQXBwb2ludG1lbnR7UmVjdXJyZW5jZUlEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICREZWxldGVSZWN1cnJpbmdTdWNjZXNzID0gJFNlbGYtPl9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSgKICAgICAgICBQYXJlbnRJRCA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgIGlmICggISREZWxldGVSZWN1cnJpbmdTdWNjZXNzICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnUmVjdXJyaW5nIGFwcG9pbnRtZW50cyBjb3VsZG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAjIGRlbGV0ZSBmdXR1cmUgdGFzayBpZiBwcmVzZW50CiAgICAjIFRPRE8gSGFuZGxlIGRlbGV0aW9uIG9mIGEgcmVjdXJyaW5nIGNoaWxkIGV2ZW50IGFuZCBzaGlmdCBmdXR1cmUgdGFzawogICAgaWYgKCAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSApIHsKICAgICAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tEZWxldGUoCiAgICAgICAgICAgIFRhc2tJRCA9PiAkQXBwb2ludG1lbnR7RnV0dXJlVGFza0lEfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRnV0dXJlIHRhc2sgQXBwb2ludG1lbnRUaWNrZXQgY291bG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgZGVsZXRlIGFwcG9pbnRtZW50CiAgICBteSAkU1FMID0gJwogICAgICAgIERFTEVURSBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50CiAgICAgICAgV0hFUkUgaWQgPSA/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgRmlyZSBldmVudC4KICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0FwcG9pbnRtZW50RGVsZXRlJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPT4gJFBhcmFte0FwcG9pbnRtZW50SUR9LAogICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRDYWxlbmRhcklELAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkUGFyYW17QXBwb2ludG1lbnRJRH0sCiAgICApOwoKICAgICMgY2xlYW4gdXAgbGlzdCBtZXRob2RzIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnTGlzdCcgLiAkQ2FsZW5kYXJJRCwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBBcHBvaW50bWVudERlbGV0ZU9jY3VycmVuY2UoKQoKZGVsZXRlcyBhIHNpbmdsZSByZWN1cnJpbmcgYXBwb2ludG1lbnQgb2NjdXJyZW5jZS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnREZWxldGVPY2N1cnJlbmNlKAogICAgICAgIFVuaXF1ZUlEICAgICA9PiAnMjAxNjAxMDFUMTYwMDAwLTcxRTM4NkBsb2NhbGhvc3QnLCAgICAjIChyZXF1aXJlZCkKICAgICAgICBSZWN1cnJlbmNlSUQgPT4gJzIwMTYtMDEtMTAgMDA6MDA6MDAnLCAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgKTsKCnJldHVybnMgMSBpZiBzdWNjZXNzZnVsOgogICAgJFN1Y2Nlc3MgPSAxOwoKPWN1dAoKc3ViIEFwcG9pbnRtZW50RGVsZXRlT2NjdXJyZW5jZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVW5pcXVlSUQgQ2FsZW5kYXJJRCBSZWN1cnJlbmNlSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGRiIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICcKICAgICAgICAgICAgU0VMRUNUIGlkIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICAgICAgV0hFUkUgdW5pcXVlX2lkID0gPyBBTkQgY2FsZW5kYXJfaWQgPSA/IEFORCByZWN1cl9pZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVbmlxdWVJRH0sIFwkUGFyYW17Q2FsZW5kYXJJRH0sIFwkUGFyYW17UmVjdXJyZW5jZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICVBcHBvaW50bWVudDsKCiAgICAjIGdldCBhZGRpdGlvbmFsIGluZm8KICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSA9ICRSb3dbMF07CiAgICB9CiAgICByZXR1cm4gaWYgISVBcHBvaW50bWVudDsKCiAgICAjIGRlbGV0ZSBkYiByZWNvcmQKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgICA9PiAnREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkQXBwb2ludG1lbnR7QXBwb2ludG1lbnRJRH0gXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjYWNoZSBvYmplY3QKICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICRBcHBvaW50bWVudHtBcHBvaW50bWVudElEfSwKICAgICk7CgogICAgIyBjbGVhbiB1cCBsaXN0IG1ldGhvZHMgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdMaXN0JyAuICRQYXJhbXtDYWxlbmRhcklEfSwKICAgICk7CiAgICAkQ2FjaGVPYmplY3QtPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnRGF5cycgLiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBHZXRVbmlxdWVJRCgpCgpSZXR1cm5zIFVuaXF1ZUlEIGNvbnRhaW5pbmcgYXBwb2ludG1lbnQgc3RhcnQgdGltZSwgcmFuZG9tIGhhc2ggYW5kIHN5c3RlbSBDPEZRRE4+LgoKICAgIG15ICRVbmlxdWVJRCA9ICRBcHBvaW50bWVudE9iamVjdC0+R2V0VW5pcXVlSUQoCiAgICAgICAgQ2FsZW5kYXJJRCA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgICMgKHJlcXVpcmVkKQogICAgICAgIFN0YXJ0VGltZSAgPT4gJzIwMTYtMDEtMDEgMDA6MDA6MDAnLCAgICAjIChyZXF1aXJlZCkKICAgICAgICBVc2VySUQgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKICAgICRVbmlxdWVJRCA9ICcyMDE2MDEwMVQwMDAwMDAtQjk5MDlEQGxvY2FsaG9zdCc7Cgo9Y3V0CgpzdWIgR2V0VW5pcXVlSUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENhbGVuZGFySUQgU3RhcnRUaW1lIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNhbGN1bGF0ZSBhIGhhc2gKICAgIG15ICRSYW5kb21TdHJpbmcgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZyggTGVuZ3RoID0+IDMyICk7CiAgICBteSAkU3RyaW5nICAgICAgID0gIiRQYXJhbXtDYWxlbmRhcklEfS0kUmFuZG9tU3RyaW5nLSRQYXJhbXtVc2VySUR9IjsKICAgIG15ICREaWdlc3QgICAgICAgPSB1bnBhY2soICdOJywgRGlnZXN0OjpNRDUtPm5ldygpLT5hZGQoJFN0cmluZyktPmRpZ2VzdCgpICk7CiAgICBteSAkRGlnZXN0SGV4ICAgID0gc3ByaW50ZiggJyV4JywgJERpZ2VzdCApOwogICAgbXkgJEhhc2ggICAgICAgICA9IHVjKCBzcHJpbnRmKCAiJS42cyIsICREaWdlc3RIZXggKSApOwoKICAgICMgUHJlcGFyZSBzdGFydCB0aW1lc3RhbXAgZm9yIFVuaXF1ZUlELgogICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgcmV0dXJuIGlmICEkU3RhcnRUaW1lT2JqZWN0OwogICAgbXkgJFN0YXJ0VGltZVN0cmcgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9bLTpdLy9nOwogICAgJFN0YXJ0VGltZVN0cmcgPX4gcy9ccy9ULzsKCiAgICAjIGdldCBzeXN0ZW0gRlFETgogICAgbXkgJEZRRE4gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0ZRRE4nKTsKCiAgICAjIHJldHVybiBVbmlxdWVJRAogICAgcmV0dXJuICIkU3RhcnRUaW1lU3RyZy0kSGFzaFxAJEZRRE4iOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRVcGNvbWluZ0dldCgpCgpHZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnQgc3RhcnQgb3IgZW5kLgoKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgKICAgICAgICBUaW1lc3RhbXAgPT4gJzIwMTYtMDgtMDIgMDM6NTk6MDAnLCAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgICk7CgpSZXR1cm5zIGFwcG9pbnRtZW50IGRhdGEgb2YgQXBwb2ludG1lbnRHZXQoKS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudFVwY29taW5nR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VycmVudCB0aW1lc3RhbXAKICAgIG15ICRDdXJyZW50VGltZXN0YW1wOwoKICAgICMgY3JlYXRlIG5lZWRlZCBzcWwgcXVlcnkgYmFzZWQgb24gdGhlIGN1cnJlbnQgb3IgYSBnaXZlbiB0aW1lc3RhbXAKICAgIG15ICRTUUwgPSAnU0VMRUNUIGlkLCBwYXJlbnRfaWQsIGNhbGVuZGFyX2lkLCB1bmlxdWVfaWQgRlJPTSBjYWxlbmRhcl9hcHBvaW50bWVudCAnOwoKICAgIGlmICggJFBhcmFte1RpbWVzdGFtcH0gKSB7CiAgICAgICAgJEN1cnJlbnRUaW1lc3RhbXAgPSAkUGFyYW17VGltZXN0YW1wfTsKICAgICAgICAkU1FMIC49ICJXSEVSRSBub3RpZnlfdGltZSA9ID8gIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRDdXJyZW50VGltZXN0YW1wID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyktPlRvU3RyaW5nKCk7CiAgICAgICAgJFNRTCAuPSAiV0hFUkUgbm90aWZ5X3RpbWUgPj0gPyAiOwogICAgfQoKICAgICRTUUwgLj0gJ09SREVSIEJZIG5vdGlmeV90aW1lIEFTQyc7CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBkYiBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWyBcJEN1cnJlbnRUaW1lc3RhbXAgXSwKICAgICk7CgogICAgbXkgQFJlc3VsdFJhdzsKCiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJVVwY29taW5nQXBwb2ludG1lbnQ7CgogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e0FwcG9pbnRtZW50SUR9ID0gJFJvd1swXTsKICAgICAgICAkVXBjb21pbmdBcHBvaW50bWVudHtQYXJlbnRJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFVwY29taW5nQXBwb2ludG1lbnR7Q2FsZW5kYXJJRH0gICAgPSAkUm93WzJdOwogICAgICAgICRVcGNvbWluZ0FwcG9pbnRtZW50e1VuaXF1ZUlEfSAgICAgID0gJFJvd1szXTsKCiAgICAgICAgcHVzaCBAUmVzdWx0UmF3LCBcJVVwY29taW5nQXBwb2ludG1lbnQ7CiAgICB9CgogICAgbXkgQFJlc3VsdHM7CgogICAgQVBQT0lOVE1FTlREQVRBOgogICAgZm9yIG15ICRBcHBvaW50bWVudERhdGEgKEBSZXN1bHRSYXcpIHsKCiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCRBcHBvaW50bWVudERhdGEpOwogICAgICAgIG5leHQgQVBQT0lOVE1FTlREQVRBIGlmICEkQXBwb2ludG1lbnREYXRhLT57Q2FsZW5kYXJJRH07CiAgICAgICAgbmV4dCBBUFBPSU5UTUVOVERBVEEgaWYgISRBcHBvaW50bWVudERhdGEtPntBcHBvaW50bWVudElEfTsKCiAgICAgICAgbXkgJUFwcG9pbnRtZW50ID0gJFNlbGYtPkFwcG9pbnRtZW50R2V0KCAleyRBcHBvaW50bWVudERhdGF9ICk7CgogICAgICAgIHB1c2ggQFJlc3VsdHMsIFwlQXBwb2ludG1lbnQ7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHRzOwp9Cgo9aGVhZDIgQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpCgpEZWxldGUgYWxsIGNhbGVuZGFyIGFwcG9pbnRtZW50IGZ1dHVyZSB0YXNrcy4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIGZ1dHVyZSB0YXNrIGRlbGV0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgQXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGEgbG9jYWwgc2NoZWR1bGVyIGRiIG9iamVjdAogICAgbXkgJFNjaGVkdWxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxyZWFkeSBzdG9yZWQgZnV0dXJlIHRhc2tzCiAgICBteSBARnV0dXJlVGFza0xpc3QgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICk7CgogICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEZ1dHVyZVRhc2tMaXN0ICkgKSB7CgogICAgICAgIEZVVFVSRVRBU0s6CiAgICAgICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgICAgIG5leHQgRlVUVVJFVEFTSyBpZiAhJEZ1dHVyZVRhc2s7CiAgICAgICAgICAgIG5leHQgRlVUVVJFVEFTSyBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJEZ1dHVyZVRhc2spOwoKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRGdXR1cmVUYXNrLT57VGFza0lEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGRlbGV0ZSBmdXR1cmUgdGFzayB3aXRoIGlkICRGdXR1cmVUYXNrLT57VGFza0lEfSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKQoKVXBkYXRlIE9UT0JPIGRhZW1vbiBmdXR1cmUgdGFzayBsaXN0IGZvciB1cGNvbWluZyBhcHBvaW50bWVudHMuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQXBwb2ludG1lbnRPYmplY3QtPkFwcG9pbnRtZW50RnV0dXJlVGFza3NVcGRhdGUoKTsKCnJldHVybnM6CgogICAgVHJ1ZSBpZiBmdXR1cmUgdGFzayB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudEZ1dHVyZVRhc2tzVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYXBwb2ludG1lbnQgZGF0YSBmb3IgdXBjb21pbmcgYXBwb2ludG1lbnRzCiAgICBteSBAVXBjb21pbmdBcHBvaW50bWVudHMgPSAkU2VsZi0+QXBwb2ludG1lbnRVcGNvbWluZ0dldCgpOwoKICAgICMgY2hlY2sgZm9yIG5vIHVwY29taW5nIGFwcG9pbnRtZW50cwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICkgKSB7CgogICAgICAgICMgZmx1c2ggb2Jzb2xldGUgZnV0dXJlIHRhc2tzCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+QXBwb2ludG1lbnRGdXR1cmVUYXNrc0RlbGV0ZSgpOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgICMgZ2V0IGEgbG9jYWwgc2NoZWR1bGVyIGRiIG9iamVjdAogICAgbXkgJFNjaGVkdWxlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTY2hlZHVsZXInKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxyZWFkeSBzdG9yZWQgZnV0dXJlIHRhc2tzCiAgICBteSBARnV0dXJlVGFza0xpc3QgPSAkU2NoZWR1bGVyT2JqZWN0LT5GdXR1cmVUYXNrTGlzdCgKICAgICAgICBUeXBlID0+ICdDYWxlbmRhckFwcG9pbnRtZW50JywKICAgICk7CgogICAgIyBjaGVjayBmb3IgaW52YWxpZCB0YXNrIGNvdW50IChqdXN0IG9uZSB0YXNrIG1heCBhbGxvd2VkKQogICAgaWYgKCBzY2FsYXIgQEZ1dHVyZVRhc2tMaXN0ID4gMSApIHsKCiAgICAgICAgIyBmbHVzaCBvYnNvbGV0ZSBmdXR1cmUgdGFza3MKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnQ291bGQgbm90IGRlbGV0ZSBhcHBvaW50bWVudCBmdXR1cmUgdGFza3MhJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0IGlzIG5lZWRlZCB0byB1cGRhdGUgdGhlIGZ1dHVyZSB0YXNrIGxpc3QKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCBcQEZ1dHVyZVRhc2tMaXN0ICkgKSB7CiAgICAgICAgbXkgJFVwZGF0ZU5lZWRlZCA9IDA7CgogICAgICAgIEZVVFVSRVRBU0s6CiAgICAgICAgZm9yIG15ICRGdXR1cmVUYXNrIChARnV0dXJlVGFza0xpc3QpIHsKCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICFJc0hhc2hSZWZXaXRoRGF0YSgkRnV0dXJlVGFzaykKICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e1Rhc2tJRH0KICAgICAgICAgICAgICAgIHx8ICEkRnV0dXJlVGFzay0+e0V4ZWN1dGlvblRpbWV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCB0aGUgc3RvcmVkIGZ1dHVyZSB0YXNrCiAgICAgICAgICAgIG15ICVGdXR1cmVUYXNrRGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCJyktPkZ1dHVyZVRhc2tHZXQoCiAgICAgICAgICAgICAgICBUYXNrSUQgPT4gJEZ1dHVyZVRhc2stPntUYXNrSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoIFwlRnV0dXJlVGFza0RhdGEgKSApIHsKICAgICAgICAgICAgICAgICRVcGRhdGVOZWVkZWQgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBGVVRVUkVUQVNLOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIEdldCBkYXRlIHRpbWUgb2JqZWN0cyBvZiBzdG9yZWQgYW5kIHVwY29taW5nIHRpbWVzIHRvIGNvbXBhcmUuCiAgICAgICAgICAgIG15ICRGdXR1cmVUYXNrVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRGdXR1cmVUYXNrRGF0YXtEYXRhfS0+e05vdGlmeVRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFVwY29taW5nQXBwb2ludG1lbnRUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBEbyBub3RoaW5nIGlmIHRoZSB1cGNvbWluZyBub3RpZmljYXRpb24gdGltZSBlcXVhbHMgdGhlIHN0b3JlZCB2YWx1ZS4KICAgICAgICAgICAgaWYgKCAkVXBjb21pbmdBcHBvaW50bWVudFRpbWVPYmplY3QgIT0gJEZ1dHVyZVRhc2tUaW1lT2JqZWN0ICkgewogICAgICAgICAgICAgICAgJFVwZGF0ZU5lZWRlZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEZVVFVSRVRBU0s7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkVXBkYXRlTmVlZGVkKSB7CgogICAgICAgICAgICAjIGZsdXNoIG9ic29sZXRlIGZ1dHVyZSB0YXNrcwogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5BcHBvaW50bWVudEZ1dHVyZVRhc2tzRGVsZXRlKCk7CgogICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0NvdWxkIG5vdCBkZWxldGUgYXBwb2ludG1lbnQgZnV0dXJlIHRhc2tzIScsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzY2hlZHVsZSBuZXcgZnV0dXJlIHRhc2tzIGZvciBub3RpZmljYXRpb24gYWN0aW9ucwogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJPYmplY3QtPlRhc2tBZGQoCiAgICAgICAgRXhlY3V0aW9uVGltZSA9PiAkVXBjb21pbmdBcHBvaW50bWVudHNbMF0tPntOb3RpZmljYXRpb25EYXRlfSwKICAgICAgICBOYW1lICAgICAgICAgID0+ICdBcHBvaW50bWVudE5vdGlmaWNhdGlvbicsCiAgICAgICAgVHlwZSAgICAgICAgICA9PiAnQ2FsZW5kYXJBcHBvaW50bWVudCcsCiAgICAgICAgRGF0YSAgICAgICAgICA9PiB7CiAgICAgICAgICAgIE5vdGlmeVRpbWUgPT4gJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57Tm90aWZpY2F0aW9uRGF0ZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFRhc2tJRCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICJDb3VsZCBub3Qgc2NoZWR1bGUgZnV0dXJlIHRhc2sgZm9yIEFwcG9pbnRtZW50SUQgJFVwY29taW5nQXBwb2ludG1lbnRzWzBdLT57QXBwb2ludG1lbnRJRH0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIF9BcHBvaW50bWVudE5vdGlmaWNhdGlvblByZXBhcmUoKQoKUHJlcGFyZSBhcHBvaW50bWVudCBub3RpZmljYXRpb24gZGF0YS4KCiAgICBteSAkU3VjY2VzcyA9ICRBcHBvaW50bWVudE9iamVjdC0+X0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSgpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIHByZXBhcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgZmFsc2UuCgo9Y3V0CgpzdWIgX0FwcG9pbnRtZW50Tm90aWZpY2F0aW9uUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc2V0IG5vdGlmaWNhdGlvbiBkYXRhIGlmIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbkRhdGUgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQgTm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSBOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSA9IHVuZGVmOwogICAgICAgIH0KICAgIH0KCiAgICAjIHByZXBhcmUgcG9zc2libGUgbm90aWZpY2F0aW9uIHBhcmFtcwogICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtICgKICAgICAgICBxdygKICAgICAgICAgICAgTm90aWZpY2F0aW9uVGVtcGxhdGUgTm90aWZpY2F0aW9uQ3VzdG9tIE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdAogICAgICAgICAgICBOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lCiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17RGF0YX0tPnskUG9zc2libGVQYXJhbX0gfHw9ICcnOwogICAgfQoKICAgICMgc3BlY2lhbCBjaGVjayBmb3IgcmVsYXRpdmUgdW5pdCBjb3VudCBhcyBpdCBjYW4gYmUgemVybwogICAgIyAoZW1wdHkgYW5kIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIHRyZWF0ZWQgYXMgemVybyB0byBhdm9pZCBlcnJvcnMpCiAgICBpZiAoCiAgICAgICAgIUlzTnVtYmVyKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudH0gKQogICAgICAgIHx8ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA8PSAwCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSA9IDA7CiAgICB9CgogICAgIyBzZXQgZW1wdHkgZGF0ZXRpbWUgc3RyaW5ncyB0byB1bmRlZgogICAgZm9yIG15ICRQb3NzaWJsZVBhcmFtIChxdyhOb3RpZmljYXRpb25EYXRlIE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lKSkgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIGlmICEkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX07CgogICAgIwogICAgIyB0ZW1wbGF0ZSBTdGFydAogICAgIwogICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25UZW1wbGF0ZX0gZXEgJ1N0YXJ0JyApIHsKCiAgICAgICAgIyBzZXR1cCB0aGUgYXBwb2ludG1lbnQgc3RhcnQgZGF0ZSBhcyBub3RpZmljYXRpb24gZGF0ZQogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJFBhcmFte0RhdGF9LT57U3RhcnRUaW1lfTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIHRpbWUgYmVmb3JlIHN0YXJ0CiAgICAjCiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9IG5lICdDdXN0b20nCiAgICAgICAgJiYgSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvblRlbXBsYXRlfSApCiAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ID4gMAogICAgICAgICkKICAgIHsKCiAgICAgICAgcmV0dXJuIGlmICFJc051bWJlciggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9ICk7CgogICAgICAgICMgb2Zmc2V0IHRlbXBsYXRlIChiZWZvcmUgc3RhcnQgZGF0ZXRpbWUpIHVzZWQKICAgICAgICBteSAkT2Zmc2V0ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uVGVtcGxhdGV9OwoKICAgICAgICAjIEdldCBkYXRlIHRpbWUgb2JqZWN0IG9mIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUuCiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e1N0YXJ0VGltZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBTdWJ0cmFjdCBvZmZzZXQgaW4gc2Vjb25kcyBmb3IgbmV3IG5vdGlmaWNhdGlvbiBkYXRlIHRpbWUuCiAgICAgICAgJFN0YXJ0VGltZU9iamVjdC0+U3VidHJhY3QoCiAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICApOwoKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRTdGFydFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIwogICAgIyB0ZW1wbGF0ZSBDdXN0b20KICAgICMKICAgIGVsc2UgewoKICAgICAgICAjIENvbXB1dGUgZGF0ZSBvZiBjdXN0b20gcmVsYXRpdmUgaW5wdXQuCiAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25DdXN0b219IGVxICdyZWxhdGl2ZScgKSB7CgogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdENvdW50ID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0Q291bnR9OwogICAgICAgICAgICBteSAkQ3VzdG9tVW5pdCAgICAgID0gJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uQ3VzdG9tUmVsYXRpdmVVbml0fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRQb2ludCA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWV9OwoKICAgICAgICAgICAgIyBzZXR1cCB0aGUgY291bnQgdG8gY29tcHV0ZSBmb3IgdGhlIG9mZnNldAogICAgICAgICAgICBteSAlVW5pdE9mZnNldENvbXB1dGUgPSAoCiAgICAgICAgICAgICAgICBtaW51dGVzID0+IDYwLAogICAgICAgICAgICAgICAgaG91cnMgICA9PiAzNjAwLAogICAgICAgICAgICAgICAgZGF5cyAgICA9PiA4NjQwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3Q7CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBzdGFydCB0aW1lLgogICAgICAgICAgICBpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZXN0YXJ0JyB8fCAkQ3VzdG9tVW5pdFBvaW50IGVxICdhZnRlcnN0YXJ0JyApIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENvbXB1dGUgZnJvbSBlbmQgdGltZS4KICAgICAgICAgICAgZWxzaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVlbmQnIHx8ICRDdXN0b21Vbml0UG9pbnQgZXEgJ2FmdGVyZW5kJyApIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBOb3Qgc3VwcG9ydGVkIHBvaW50IG9mIHRpbWUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIG5vdGlmaWNhdGlvbiBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyApIHsKICAgICAgICAgICAgICAgICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICROb3RpZmljYXRpb25Mb2NhbFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90aWZpY2F0aW9uTG9jYWxUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkRhdGV9ID0gJE5vdGlmaWNhdGlvbkxvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIGRhdGUvdGltZSBpbnB1dC4KICAgICAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbX0gPSAnZGF0ZXRpbWUnOwoKICAgICAgICAgICAgIyB2YWxpZGF0aW9uCiAgICAgICAgICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIGdpdmVuIGRhdGUgdGltZSB2YWx1ZXMgYXMgbm90aWZpY2F0aW9uIGRhdGV0aW1lIHN0cmluZyAoaS5lLiAyMDE2LTA2LTI4IDAyOjAwOjAwKQogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9ICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57Tm90aWZpY2F0aW9uRGF0ZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntOb3RpZmljYXRpb25EYXRlfSA9IHVuZGVmOwogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lfSA9IHVuZGVmOwogICAgfQoKICAgIHJldHVybiAxOwp9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKPWhlYWQyIEFwcG9pbnRtZW50VG9UaWNrZXRFeGVjdXRpb25UaW1lKCkKCmNvbXB1dGVzIGV4ZWN1dGlvbiB0aW1lIGZvciBmdXR1cmUgdGFza3Mgb2YgdHlwZSBBcHBvaW50bWVudFRvVGlja2V0IGJhc2VkIG9uIHN0YXJ0IHRpbWUgYW5kIG9mZnNldCBwYXJhbXMKCj1jdXQKCnN1YiBBcHBvaW50bWVudFRvVGlja2V0RXhlY3V0aW9uVGltZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBTdGFydFRpbWUgRW5kVGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc2V0IHRpY2tldCBkYXRhIGlmIG5lZWRlZAogICAgaWYgKCAhJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ICkgewoKICAgICAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgICAgICBxdygKICAgICAgICAgICAgICAgIFRpY2tldERhdGUgVGlja2V0VGVtcGxhdGUgVGlja2V0Q3VzdG9tIFRpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50CiAgICAgICAgICAgICAgICBUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXQgVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZSBUaWNrZXRDdXN0b21EYXRlVGltZQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSA9IHVuZGVmOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbXB1dGUgZXhlY3V0aW9uIHRpbWUgZm9yIHRhc2sKICAgICMgcHJlcGFyZSBwb3NzaWJsZSB0aWNrZXQgcGFyYW1zCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKAogICAgICAgIHF3KAogICAgICAgICAgICBUaWNrZXRUZW1wbGF0ZSBUaWNrZXRDdXN0b20gVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0CiAgICAgICAgICAgIFRpY2tldEN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWUKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtEYXRhfS0+eyRQb3NzaWJsZVBhcmFtfSB8fD0gJyc7CiAgICB9CgogICAgIyBzcGVjaWFsIGNoZWNrIGZvciByZWxhdGl2ZSB1bml0IGNvdW50IGFzIGl0IGNhbiBiZSB6ZXJvCiAgICAjIChlbXB0eSBhbmQgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgdHJlYXRlZCBhcyB6ZXJvIHRvIGF2b2lkIGVycm9ycykKICAgIGlmICgKICAgICAgICAhSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fSApCiAgICAgICAgfHwgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9IDw9IDAKICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnR9ID0gMDsKICAgIH0KCiAgICAjIHNldCBlbXB0eSBkYXRldGltZSBzdHJpbmdzIHRvIHVuZGVmCiAgICBmb3IgbXkgJFBvc3NpYmxlUGFyYW0gKHF3KFRpY2tldERhdGUgVGlja2V0Q3VzdG9tRGF0ZVRpbWUpKSB7CiAgICAgICAgJFBhcmFte0RhdGF9LT57JFBvc3NpYmxlUGFyYW19IHx8PSB1bmRlZjsKICAgIH0KCiAgICByZXR1cm4gaWYgISRQYXJhbXtEYXRhfS0+e1RpY2tldFRlbXBsYXRlfTsKCiAgICAjCiAgICAjIHRlbXBsYXRlIFN0YXJ0CiAgICAjCiAgICBpZiAoICRQYXJhbXtEYXRhfS0+e1RpY2tldFRlbXBsYXRlfSBlcSAnU3RhcnQnICkgewoKICAgICAgICAjIHNldHVwIHRoZSBhcHBvaW50bWVudCBzdGFydCBkYXRlIGFzIHRpY2tldCBkYXRlCiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gPSAkUGFyYW17U3RhcnRUaW1lfTsKICAgIH0KCiAgICAjCiAgICAjIHRlbXBsYXRlIHRpbWUgYmVmb3JlIHN0YXJ0CiAgICAjCiAgICBlbHNpZiAoCiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9IG5lICdDdXN0b20nCiAgICAgICAgJiYgSXNOdW1iZXIoICRQYXJhbXtEYXRhfS0+e1RpY2tldFRlbXBsYXRlfSApCiAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ID4gMAogICAgICAgICkKICAgIHsKCiAgICAgICAgcmV0dXJuIGlmICFJc051bWJlciggJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9ICk7CgogICAgICAgICMgb2Zmc2V0IHRlbXBsYXRlIChiZWZvcmUgc3RhcnQgZGF0ZXRpbWUpIHVzZWQKICAgICAgICBteSAkT2Zmc2V0ID0gJFBhcmFte0RhdGF9LT57VGlja2V0VGVtcGxhdGV9OwoKICAgICAgICAjIEdldCBkYXRlIHRpbWUgb2JqZWN0IG9mIGFwcG9pbnRtZW50IHN0YXJ0IHRpbWUuCiAgICAgICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdGFydFRpbWV9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgU3VidHJhY3Qgb2Zmc2V0IGluIHNlY29uZHMgZm9yIG5ldyBub3RpZmljYXRpb24gZGF0ZSB0aW1lLgogICAgICAgICRTdGFydFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICBTZWNvbmRzID0+ICRPZmZzZXQsCiAgICAgICAgKTsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgfQoKICAgICMKICAgICMgdGVtcGxhdGUgQ3VzdG9tCiAgICAjCiAgICBlbHNlIHsKCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIHJlbGF0aXZlIGlucHV0LgogICAgICAgIGlmICggJFBhcmFte0RhdGF9LT57VGlja2V0Q3VzdG9tfSBlcSAncmVsYXRpdmUnICkgewoKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXRDb3VudCA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdENvdW50fTsKICAgICAgICAgICAgbXkgJEN1c3RvbVVuaXQgICAgICA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbVJlbGF0aXZlVW5pdH07CiAgICAgICAgICAgIG15ICRDdXN0b21Vbml0UG9pbnQgPSAkUGFyYW17RGF0YX0tPntUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lfTsKCiAgICAgICAgICAgICMgc2V0dXAgdGhlIGNvdW50IHRvIGNvbXB1dGUgZm9yIHRoZSBvZmZzZXQKICAgICAgICAgICAgbXkgJVVuaXRPZmZzZXRDb21wdXRlID0gKAogICAgICAgICAgICAgICAgbWludXRlcyA9PiA2MCwKICAgICAgICAgICAgICAgIGhvdXJzICAgPT4gMzYwMCwKICAgICAgICAgICAgICAgIGRheXMgICAgPT4gODY0MDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkVGlja2V0TG9jYWxUaW1lT2JqZWN0OwoKICAgICAgICAgICAgIyBDb21wdXRlIGZyb20gc3RhcnQgdGltZS4KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJzdGFydCcgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0TG9jYWxUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0YXJ0VGltZX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ29tcHV0ZSBmcm9tIGVuZCB0aW1lLgogICAgICAgICAgICBlbHNpZiAoICRDdXN0b21Vbml0UG9pbnQgZXEgJ2JlZm9yZWVuZCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYWZ0ZXJlbmQnICkgewogICAgICAgICAgICAgICAgJFRpY2tldExvY2FsVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtFbmRUaW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBOb3Qgc3VwcG9ydGVkIHBvaW50IG9mIHRpbWUuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvbXB1dGUgdGhlIG9mZnNldCB0byBiZSB1c2VkCiAgICAgICAgICAgIG15ICRPZmZzZXQgPSAoICRDdXN0b21Vbml0Q291bnQgKiAkVW5pdE9mZnNldENvbXB1dGV7JEN1c3RvbVVuaXR9ICk7CgogICAgICAgICAgICAjIHNhdmUgdGhlIG5ld2x5IGNvbXB1dGVkIHRpY2tldCBkYXRldGltZSBzdHJpbmcKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tVW5pdFBvaW50IGVxICdiZWZvcmVzdGFydCcgfHwgJEN1c3RvbVVuaXRQb2ludCBlcSAnYmVmb3JlZW5kJyApIHsKICAgICAgICAgICAgICAgICRUaWNrZXRMb2NhbFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIFNlY29uZHMgPT4gJE9mZnNldCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRUaWNrZXRMb2NhbFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGlja2V0TG9jYWxUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICAgICAgU2Vjb25kcyA9PiAkT2Zmc2V0LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9ID0gJFRpY2tldExvY2FsVGltZU9iamVjdC0+VG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBDb21wdXRlIGRhdGUgb2YgY3VzdG9tIGRhdGUvdGltZSBpbnB1dC4KICAgICAgICBlbHNpZiAoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbX0gZXEgJ2RhdGV0aW1lJyApIHsKCiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbX0gPSAnZGF0ZXRpbWUnOwoKICAgICAgICAgICAgIyB2YWxpZGF0aW9uCiAgICAgICAgICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgdGhlIGdpdmVuIGRhdGUgdGltZSB2YWx1ZXMgYXMgdGlja2V0IGRhdGV0aW1lIHN0cmluZyAoaS5lLiAyMDE2LTA2LTI4IDAyOjAwOjAwKQogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9ICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57VGlja2V0RGF0ZX0gKSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntUaWNrZXREYXRlfSA9IHVuZGVmOwogICAgfQoKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfS0+e1RpY2tldEN1c3RvbURhdGVUaW1lfSA9IHVuZGVmOwogICAgfQogICAgcmV0dXJuICRQYXJhbXtEYXRhfS0+e1RpY2tldERhdGV9OwoKfQoKIyBFTyBBcHBvaW50bWVudFRvVGlja2V0Cgo9aGVhZDIgQXBwb2ludG1lbnROb3RpZmljYXRpb24oKQoKV2lsbCBiZSB0cmlnZ2VyZWQgYnkgdGhlIE9UT0JPIGRhZW1vbiB0byBmaXJlIGV2ZW50cyBmb3IgYXBwb2ludG1lbnRzLAp0aGF0IHJlYWNoZXMgaXQncyByZW1pbmRlciAobm90aWZpY2F0aW9uKSB0aW1lLgoKICAgIG15ICRTdWNjZXNzID0gJEFwcG9pbnRtZW50T2JqZWN0LT5BcHBvaW50bWVudE5vdGlmaWNhdGlvbigpOwoKcmV0dXJuczoKCiAgICBUcnVlIGlmIG5vdGlmeSBhY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBmYWxzZS4KCj1jdXQKCnN1YiBBcHBvaW50bWVudE5vdGlmaWNhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoTm90aWZ5VGltZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcHBvaW50bWVudHMgZm9yIHRoZSByZWxhdGVkIG5vdGlmaWNhdGlvbiB0aW1lc3RhbXAKICAgIG15IEBVcGNvbWluZ0FwcG9pbnRtZW50cyA9ICRTZWxmLT5BcHBvaW50bWVudFVwY29taW5nR2V0KAogICAgICAgIFRpbWVzdGFtcCA9PiAkUGFyYW17Tm90aWZ5VGltZX0sCiAgICApOwoKICAgIHJldHVybiBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCBcQFVwY29taW5nQXBwb2ludG1lbnRzICk7CgogICAgIyBzbGVlcCBhdCBsZWFzdCAxIHNlY29uZCB0byBtYWtlIHN1cmUgdGhlIHRpbWVzdGFtcCBkb2Vzbid0CiAgICAjIGVxdWFscyB0aGUgbGFzdCBvbmUgZm9yIHVwZGF0ZSB1cGNvbWluZyBmdXR1cmUgdGFza3MKICAgIHNsZWVwIDE7CgogICAgVVBDT01JTkdBUFBPSU5UTUVOVDoKICAgIGZvciBteSAkVXBjb21pbmdBcHBvaW50bWVudCAoQFVwY29taW5nQXBwb2ludG1lbnRzKSB7CgogICAgICAgIG5leHQgVVBDT01JTkdBUFBPSU5UTUVOVCBpZiAhJFVwY29taW5nQXBwb2ludG1lbnQ7CiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkVXBjb21pbmdBcHBvaW50bWVudCk7CiAgICAgICAgbmV4dCBVUENPTUlOR0FQUE9JTlRNRU5UIGlmICEkVXBjb21pbmdBcHBvaW50bWVudC0+e0FwcG9pbnRtZW50SUR9OwoKICAgICAgICAjIGZpcmUgZXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQXBwb2ludG1lbnROb3RpZmljYXRpb24nLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50LT57QXBwb2ludG1lbnRJRH0sCiAgICAgICAgICAgICAgICBDYWxlbmRhcklEICAgID0+ICRVcGNvbWluZ0FwcG9pbnRtZW50LT57Q2FsZWRhcklEfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWN1dAoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQgQXBwb2ludG1lbnQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0YXJ0VGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgIH0sCiAgICApOwogICAgbXkgJEVuZFRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57RW5kVGltZX0sCiAgICAgICAgfSwKICAgICk7CgogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlID0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VFeGNsdWRlfSAvLyBbXSB9OwoKICAgICMgcmVtb3ZlIHVuZGVmaW5lZCB2YWx1ZXMKICAgIEBSZWN1cnJlbmNlRXhjbHVkZSA9IGdyZXAgeyBkZWZpbmVkICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICMgcmVzZXQgdGhlIHBhcmFtZXRlciBmb3Igb2NjdXJyZW5jZXMKICAgICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlRXhjbHVkZX0gPSB1bmRlZjsKCiAgICBteSAkT3JpZ2luYWxTdGFydFRpbWVPYmplY3QgPSAkU3RhcnRUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgbXkgJE9yaWdpbmFsRW5kVGltZU9iamVjdCAgID0gJEVuZFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICBteSAkU3RlcCAgICAgICAgICAgICAgICAgICAgPSAwOwoKICAgICMgdW50aWwgLi4uCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgIG15ICRSZWN1cnJlbmNlVW50aWxPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVVudGlsfSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBVTlRJTF9USU1FOgogICAgICAgIHdoaWxlICggJFN0YXJ0VGltZU9iamVjdCA8PSAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ICkgewogICAgICAgICAgICAkU3RlcCArPSAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUludGVydmFsfTsKCiAgICAgICAgICAgICMgY2FsY3VsYXRlIHJlY3VycmluZyB0aW1lcwogICAgICAgICAgICAkU3RhcnRUaW1lT2JqZWN0ID0gJFNlbGYtPl9DYWxjdWxhdGVSZWN1cnJlbmNlVGltZSgKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50ICA9PiAkUGFyYW17QXBwb2ludG1lbnR9LAogICAgICAgICAgICAgICAgU3RlcCAgICAgICAgID0+ICRTdGVwLAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCwKICAgICAgICAgICAgICAgIEN1cnJlbnRUaW1lICA9PiAkU3RhcnRUaW1lT2JqZWN0LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBVTlRJTF9USU1FIGlmICEkU3RhcnRUaW1lT2JqZWN0OwogICAgICAgICAgICBsYXN0IFVOVElMX1RJTUUgaWYgJFN0YXJ0VGltZU9iamVjdCA+ICRSZWN1cnJlbmNlVW50aWxPYmplY3Q7CgogICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBTZWNvbmRzID0+CiAgICAgICAgICAgICAgICAgICAgJE9yaWdpbmFsRW5kVGltZU9iamVjdC0+RGVsdGEoIERhdGVUaW1lT2JqZWN0ID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCApLT57QWJzb2x1dGVTZWNvbmRzfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICBteSAkRW5kVGltZSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgICAgICAjIEJ1Z2ZpeDogb24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZS4KICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IFVOVElMX1RJTUUgaWYgZ3JlcCB7ICRTdGFydFRpbWUgZXEgJF8gfSBAUmVjdXJyZW5jZUV4Y2x1ZGU7CgogICAgICAgICAgICAjIHRoZSBBcHBvaW50bWVudENyZWF0ZSBldmVudCB3aWxsIGJlIHRyaWdnZXJlZAogICAgICAgICAgICAkU2VsZi0+QXBwb2ludG1lbnRDcmVhdGUoCiAgICAgICAgICAgICAgICAleyAkUGFyYW17QXBwb2ludG1lbnR9IH0sCiAgICAgICAgICAgICAgICBQYXJlbnRJRCAgICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICAgICAgICAgICAgIFN0YXJ0VGltZSAgICA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICAgICAgRW5kVGltZSAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICAgICAgUmVjdXJyZW5jZUlEID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZm9yIC4uLiB0aW1lKHMpCiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9ICkgewoKICAgICAgICBDT1VOVDoKICAgICAgICBmb3IgKCAxIC4uICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlQ291bnR9IC0gMSApIHsKICAgICAgICAgICAgJFN0ZXAgKz0gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIGNhbGN1bGF0ZSByZWN1cnJpbmcgdGltZXMKICAgICAgICAgICAgJFN0YXJ0VGltZU9iamVjdCA9ICRTZWxmLT5fQ2FsY3VsYXRlUmVjdXJyZW5jZVRpbWUoCiAgICAgICAgICAgICAgICBBcHBvaW50bWVudCAgPT4gJFBhcmFte0FwcG9pbnRtZW50fSwKICAgICAgICAgICAgICAgIFN0ZXAgICAgICAgICA9PiAkU3RlcCwKICAgICAgICAgICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxTdGFydFRpbWVPYmplY3QsCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJFN0YXJ0VGltZU9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGxhc3QgQ09VTlQgaWYgISRTdGFydFRpbWVPYmplY3Q7CgogICAgICAgICAgICAkRW5kVGltZU9iamVjdCA9ICRTdGFydFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgICAgICRFbmRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBTZWNvbmRzID0+CiAgICAgICAgICAgICAgICAgICAgJE9yaWdpbmFsRW5kVGltZU9iamVjdC0+RGVsdGEoIERhdGVUaW1lT2JqZWN0ID0+ICRPcmlnaW5hbFN0YXJ0VGltZU9iamVjdCApLT57QWJzb2x1dGVTZWNvbmRzfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydFRpbWUgPSAkU3RhcnRUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgICAgICBteSAkRW5kVGltZSAgID0gJEVuZFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgICAgICAjIEJ1Z2ZpeDogb24gc29tZSBzeXN0ZW1zIHdpdGggb2xkZXIgcGVybCB2ZXJzaW9uIHN5c3RlbSBtaWdodCBjYWxjdWxhdGUgdGltZXpvbmUgZGlmZmVyZW5jZS4KICAgICAgICAgICAgJFN0YXJ0VGltZSA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntTdGFydFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRTdGFydFRpbWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFbmRUaW1lID0gJFNlbGYtPl9UaW1lQ2hlY2soCiAgICAgICAgICAgICAgICBPcmlnaW5hbFRpbWUgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e0VuZFRpbWV9LAogICAgICAgICAgICAgICAgVGltZSAgICAgICAgID0+ICRFbmRUaW1lLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBza2lwIGV4Y2x1ZGVkIGFwcG9pbnRtZW50cwogICAgICAgICAgICBuZXh0IENPVU5UIGlmIGdyZXAgeyAkU3RhcnRUaW1lIGVxICRfIH0gQFJlY3VycmVuY2VFeGNsdWRlOwoKICAgICAgICAgICAgJFNlbGYtPkFwcG9pbnRtZW50Q3JlYXRlKAogICAgICAgICAgICAgICAgJXsgJFBhcmFte0FwcG9pbnRtZW50fSB9LAogICAgICAgICAgICAgICAgUGFyZW50SUQgICAgID0+ICRQYXJhbXtQYXJlbnRJRH0sCiAgICAgICAgICAgICAgICBTdGFydFRpbWUgICAgPT4gJFN0YXJ0VGltZSwKICAgICAgICAgICAgICAgIEVuZFRpbWUgICAgICA9PiAkRW5kVGltZSwKICAgICAgICAgICAgICAgIFJlY3VycmVuY2VJRCA9PiAkU3RhcnRUaW1lLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0RlbGV0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFyZW50SUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgojIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgIG15ICVQYXJlbnRBcHBvaW50bWVudCA9ICRTZWxmLT5BcHBvaW50bWVudEdldCggQXBwb2ludG1lbnRJRCA9PiAkUGFyYW17UGFyZW50SUR9ICk7CiAgICBteSBAQXBwb2ludG1lbnRMaXN0ICAgPSAkU2VsZi0+QXBwb2ludG1lbnRMaXN0KAogICAgICAgIENhbGVuZGFySUQgPT4gJFBhcmVudEFwcG9pbnRtZW50e0NhbGVuZGFySUR9LAogICAgICAgIFBhcmVudElEICAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICk7CgogICAgIyBkZWxldGUgZnV0dXJlIHRhc2sgaWYgcHJlc2VudAogICAgZm9yIG15ICRBcHBvaW50bWVudCAoQEFwcG9pbnRtZW50TGlzdCkgewogICAgICAgIGlmICggJEFwcG9pbnRtZW50LT57RnV0dXJlVGFza0lEfSApIHsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQicpLT5GdXR1cmVUYXNrRGVsZXRlKAogICAgICAgICAgICAgICAgVGFza0lEID0+ICRBcHBvaW50bWVudC0+e0Z1dHVyZVRhc2tJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnRnV0dXJlIHRhc2sgQXBwb2ludG1lbnRUaWNrZXQgY291bG5cJ3QgYmUgZGVsZXRlZCEnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiMgRU8gQXBwb2ludG1lbnRUb1RpY2tldAoKICAgICMgZGVsZXRlIHJlY3VycmluZyBhcHBvaW50bWVudHMKICAgIG15ICRTUUwgPSAnCiAgICAgICAgREVMRVRFIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQKICAgICAgICBXSEVSRSBwYXJlbnRfaWQgPSA/CiAgICAnOwoKICAgICMgZGVsZXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte1BhcmVudElEfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9BcHBvaW50bWVudFJlY3VycmluZ0V4Y2x1ZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhcmVudElEIFJlY3VycmVuY2VJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKICAgIG15ICREQk9iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwoKICAgICMgZGIgcXVlcnkKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gJ1NFTEVDVCByZWN1cl9leGNsdWRlIEZST00gY2FsZW5kYXJfYXBwb2ludG1lbnQgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBnZXQgZXhpc3RpbmcgZXhjbHVzaW9ucwogICAgbXkgQFJlY3VycmVuY2VFeGNsdWRlOwogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgQFJlY3VycmVuY2VFeGNsdWRlID0gc3BsaXQoIC8sLywgJFJvd1swXSApIGlmICRSb3dbMF07CiAgICB9CiAgICBwdXNoIEBSZWN1cnJlbmNlRXhjbHVkZSwgJFBhcmFte1JlY3VycmVuY2VJRH07CiAgICBAUmVjdXJyZW5jZUV4Y2x1ZGUgPSBzb3J0IEBSZWN1cnJlbmNlRXhjbHVkZTsKCiAgICAjIGpvaW4gaW50byBzdHJpbmcKICAgIG15ICRSZWN1cnJlbmNlRXhjbHVkZTsKICAgIGlmIChAUmVjdXJyZW5jZUV4Y2x1ZGUpIHsKICAgICAgICAkUmVjdXJyZW5jZUV4Y2x1ZGUgPSBqb2luKCAnLCcsIEBSZWN1cnJlbmNlRXhjbHVkZSApOwogICAgfQoKICAgICMgdXBkYXRlIGRiIHJlY29yZAogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ1VQREFURSBjYWxlbmRhcl9hcHBvaW50bWVudCBTRVQgcmVjdXJfZXhjbHVkZSA9ID8gV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRSZWN1cnJlbmNlRXhjbHVkZSwgXCRQYXJhbXtQYXJlbnRJRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgY2FjaGUKICAgICRDYWNoZU9iamVjdC0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJFBhcmFte1BhcmVudElEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXBwb2ludG1lbnRHZXRDYWxlbmRhcklEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCBjYWxlbmRhcl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkID0gPyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJENhbGVuZGFySUQ7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkREJPYmplY3QtPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQ2FsZW5kYXJJRCA9ICRSb3dbMF07CiAgICB9CgogICAgcmV0dXJuICRDYWxlbmRhcklEOwp9CgpzdWIgX0FwcG9pbnRtZW50R2V0UmVjdXJyZW5jZUlEIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudElEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBzcWwgcXVlcnkKICAgIG15ICRTUUwgID0gJ1NFTEVDVCByZWN1cl9pZCBGUk9NIGNhbGVuZGFyX2FwcG9pbnRtZW50IFdIRVJFIGlkID0gPyc7CiAgICBteSBAQmluZCA9ICggXCRQYXJhbXtBcHBvaW50bWVudElEfSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgIyBzdGFydCBxdWVyeQogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBcQEJpbmQsCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJFJlY3VycmVuY2VJRDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRSZWN1cnJlbmNlSUQgPSAkUm93WzBdOwogICAgfQoKICAgIHJldHVybiAkUmVjdXJyZW5jZUlEOwp9CgpzdWIgX0NhbGN1bGF0ZVJlY3VycmVuY2VUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhBcHBvaW50bWVudCBTdGVwIE9yaWdpbmFsVGltZSBDdXJyZW50VGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRPcmlnaW5hbFRpbWVPYmplY3QgPSAkUGFyYW17T3JpZ2luYWxUaW1lfTsKCiAgICAjIFdlIHdpbGwgbW9kaWZ5IHRoaXMgb2JqZWN0IHRocm91Z2hvdXQgdGhlIGZ1bmN0aW9uLgogICAgbXkgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFBhcmFte0N1cnJlbnRUaW1lfTsKCiAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0RhaWx5JyApIHsKCiAgICAgICAgIyBBZGQgb25lIGRheS4KICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ1dlZWtseScgKSB7CgogICAgICAgICMgQWRkIDcgZGF5cy4KICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgRGF5cyA9PiA3LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ01vbnRobHknICkgewogICAgICAgIG15ICRUZW1wVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CgogICAgICAgICMgUmVtZW1iZXIgc3RhcnQgZGF5LgogICAgICAgIG15ICRTdGFydERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAjIEFkZCBtb250aHMgYmFzZWQgb24gY3VycmVudCBzdGVwLgogICAgICAgICRUZW1wVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBNb250aHMgPT4gJFBhcmFte1N0ZXB9LAogICAgICAgICk7CgogICAgICAgICMgR2V0IGVuZCBkYXkuCiAgICAgICAgbXkgJEVuZERheSA9ICRUZW1wVGltZU9iamVjdC0+R2V0KCktPntEYXl9OwoKICAgICAgICAjIENoZWNrIGlmIG1vbnRoIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF5cyAoZm9yIGV4YW1wbGU6IEphbnVhcnkgMzEgKyAxIG1vbnRoID0gTWFyY2ggMSkuCiAgICAgICAgaWYgKCAkU3RhcnREYXkgIT0gJEVuZERheSApIHsKICAgICAgICAgICAgJFRlbXBUaW1lT2JqZWN0LT5TdWJ0cmFjdCgKICAgICAgICAgICAgICAgIERheXMgPT4gJEVuZERheSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRDdXJyZW50VGltZU9iamVjdCA9ICRUZW1wVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnWWVhcmx5JyApIHsKICAgICAgICBteSAkVGVtcFRpbWVPYmplY3QgPSAkT3JpZ2luYWxUaW1lT2JqZWN0LT5DbG9uZSgpOwoKICAgICAgICAjIFJlbWVtYmVyIHN0YXJ0IGRheS4KICAgICAgICBteSAkU3RhcnREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgIyBBZGQgeWVhcnMgYmFzZWQgb24gY3VycmVudCBzdGVwLgogICAgICAgICRUZW1wVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBZZWFycyA9PiAkUGFyYW17U3RlcH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgZW5kIGRheS4KICAgICAgICBteSAkRW5kRGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICMgQ2hlY2sgaWYgbW9udGggZG9lc24ndCBoYXZlIGVub3VnaCBkYXlzIChmb3IgZXhhbXBsZTogSmFudWFyeSAzMSArIDEgbW9udGggPSBNYXJjaCAxKS4KICAgICAgICBpZiAoICRTdGFydERheSAhPSAkRW5kRGF5ICkgewogICAgICAgICAgICAkVGVtcFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgRGF5cyA9PiAkRW5kRGF5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0ID0gJFRlbXBUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZVR5cGV9IGVxICdDdXN0b21EYWlseScgKSB7CgogICAgICAgICMgQWRkIG51bWJlciBvZiBkYXlzLgogICAgICAgICRDdXJyZW50VGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICBEYXlzID0+ICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVdlZWtseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgZWFjaCBuLXRoIE1vbmRheSBhbmQgRnJpZGF5CgogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgIyBsb29wIHVwIHRvIDcqbiB0aW1lcyAoNyBkYXlzIGluIHdlZWsgKiBmcmVxdWVuY3kpCiAgICAgICAgTE9PUDoKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgNyAqICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OyAkQ291bnRlcisrICkgewoKICAgICAgICAgICAgIyBBZGQgb25lIGRheS4KICAgICAgICAgICAgJEN1cnJlbnRUaW1lT2JqZWN0LT5BZGQoCiAgICAgICAgICAgICAgICBEYXlzID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAkQ1dEaWZmID0gJFNlbGYtPl9DV0RpZmYoCiAgICAgICAgICAgICAgICBDdXJyZW50VGltZSAgPT4gJEN1cnJlbnRUaW1lT2JqZWN0LAogICAgICAgICAgICAgICAgT3JpZ2luYWxUaW1lID0+ICRPcmlnaW5hbFRpbWVPYmplY3QsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IExPT1AgaWYgJENXRGlmZiAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgbXkgJFdlZWtEYXkgPSAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57RGF5T2ZXZWVrfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgU3lzdGVtVGltZSBtYXRjaCByZXF1aXJlbWVudHMKICAgICAgICAgICAgaWYgKCBncmVwIHsgJFdlZWtEYXkgPT0gJF8gfSBAeyAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUZyZXF1ZW5jeX0gfSApIHsKICAgICAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IExPT1A7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJEZvdW5kOwogICAgfQoKICAgIGVsc2lmICggJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VUeXBlfSBlcSAnQ3VzdG9tTW9udGhseScgKSB7CgogICAgICAgICMgT2NjdXJzIGV2ZXJ5IDJuZCBtb250aCBvbiA1dGgsIDEwdGggYW5kIDE1dGggZGF5CiAgICAgICAgbXkgJEZvdW5kOwoKICAgICAgICAjIGxvb3AgdGhyb3VnaCBlYWNoIGRheSAobWF4IG9uZSB5ZWFyKSwgYW5kIGNoZWNrIGlmIGRheSBtYXRjaGVzLgogICAgICAgIERBWToKICAgICAgICBmb3IgKCBteSAkQ291bnRlciA9IDA7ICRDb3VudGVyIDwgMzEgKiAzNjY7ICRDb3VudGVyKysgKSB7CgogICAgICAgICAgICAjIEFkZCBvbmUgZGF5LgogICAgICAgICAgICAkQ3VycmVudFRpbWVPYmplY3QtPkFkZCgKICAgICAgICAgICAgICAgIERheXMgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgU2tpcCBtb250aCBpZiBuZWVkZWQKICAgICAgICAgICAgbmV4dCBEQVkKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e01vbnRofSAtICRPcmlnaW5hbFRpbWVPYmplY3QtPkdldCgpLT57TW9udGh9ICkKICAgICAgICAgICAgICAgICUgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH07CgogICAgICAgICAgICAjIG5leHQgZGF5IGlmIHRoaXMgZGF5IHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICAgIG5leHQgREFZCiAgICAgICAgICAgICAgICBpZiAhZ3JlcCB7ICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntEYXl9ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICBsYXN0IERBWTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlmICEkRm91bmQ7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVHlwZX0gZXEgJ0N1c3RvbVllYXJseScgKSB7CgogICAgICAgICMgdGhpcyBibG9jayBjb3ZlcnMgZm9sbG93aW5nIHVzZSBjYXNlOgogICAgICAgICMgT2NjdXJzIGVhY2ggM3RoIHllYXIsIEphbnVhcnkgMTh0aCBhbmQgTWFyY2ggMTh0aAogICAgICAgIG15ICRGb3VuZDsKCiAgICAgICAgbXkgJFJlY3VycmVuY2VVbnRpbE9iamVjdDsKICAgICAgICBpZiAoICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlVW50aWx9ICkgewogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VVbnRpbH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJE5leHREYXlPYmplY3QgPSAkQ3VycmVudFRpbWVPYmplY3QtPkNsb25lKCk7CiAgICAgICAgJE5leHREYXlPYmplY3QtPkFkZCgKICAgICAgICAgICAgRGF5cyA9PiAxLAogICAgICAgICk7CgogICAgICAgIE1PTlRIOgogICAgICAgIGZvciAoIG15ICRDb3VudGVyID0gMTs7ICRDb3VudGVyKysgKSB7CiAgICAgICAgICAgIG15ICRUZW1wVGltZU9iamVjdCA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkNsb25lKCk7CgogICAgICAgICAgICAjIHJlbWVtYmVyIHN0YXJ0IGRheQogICAgICAgICAgICBteSAkU3RhcnREYXkgPSAkVGVtcFRpbWVPYmplY3QtPkdldCgpLT57RGF5fTsKCiAgICAgICAgICAgICRUZW1wVGltZU9iamVjdC0+QWRkKAogICAgICAgICAgICAgICAgTW9udGhzID0+ICRDb3VudGVyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgZW5kIGRheQogICAgICAgICAgICBteSAkRW5kRGF5ID0gJFRlbXBUaW1lT2JqZWN0LT5HZXQoKS0+e0RheX07CgogICAgICAgICAgICAjIGNoZWNrIGlmIG1vbnRoIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF5cyAoZm9yIGV4YW1wbGU6IGphbnVhcnkgMzEgKyAxIG1vbnRoID0gbWFyY2ggMDEpCiAgICAgICAgICAgIGlmICggJFN0YXJ0RGF5ICE9ICRFbmREYXkgKSB7CiAgICAgICAgICAgICAgICAkVGVtcFRpbWVPYmplY3QtPlN1YnRyYWN0KAogICAgICAgICAgICAgICAgICAgIERheXMgPT4gJEVuZERheSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDdXJyZW50VGltZU9iamVjdCA9ICRUZW1wVGltZU9iamVjdC0+Q2xvbmUoKTsKCiAgICAgICAgICAgICMgc2tpcCB0aGlzIHRpbWUsIHNpbmNlIGl0IHdhcyBhbHJlYWR5IGNoZWNrZWQKICAgICAgICAgICAgbmV4dCBNT05USCBpZiAkQ3VycmVudFRpbWVPYmplY3QgPCAkTmV4dERheU9iamVjdDsKCiAgICAgICAgICAgICMgY2hlY2sgbG9vcCBjb25kaXRpb25zIChhY2NvcmRpbmcgdG8gVW50aWwgLyApCiAgICAgICAgICAgIGlmICgkUmVjdXJyZW5jZVVudGlsT2JqZWN0KSB7CiAgICAgICAgICAgICAgICBsYXN0IE1PTlRIIGlmICRDdXJyZW50VGltZU9iamVjdCA+ICRSZWN1cnJlbmNlVW50aWxPYmplY3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsYXN0IE1PTlRICiAgICAgICAgICAgICAgICAgICAgaWYgJENvdW50ZXIKICAgICAgICAgICAgICAgICAgICA+IDEyICogJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VJbnRlcnZhbH0gKiAkUGFyYW17QXBwb2ludG1lbnR9LT57UmVjdXJyZW5jZUNvdW50fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiB5ZWFyIGlzIE9LCiAgICAgICAgICAgIG5leHQgTU9OVEgKICAgICAgICAgICAgICAgIGlmICggJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e1llYXJ9IC0gJE9yaWdpbmFsVGltZU9iamVjdC0+R2V0KCktPntZZWFyfSApCiAgICAgICAgICAgICAgICAlICRQYXJhbXtBcHBvaW50bWVudH0tPntSZWN1cnJlbmNlSW50ZXJ2YWx9OwoKICAgICAgICAgICAgIyBuZXh0IG1vbnRoIGlmIHRoaXMgbW9udGggc2hvdWxkIGJlIHNraXBwZWQKICAgICAgICAgICAgbmV4dCBNT05USAogICAgICAgICAgICAgICAgaWYgIWdyZXAgeyAkQ3VycmVudFRpbWVPYmplY3QtPkdldCgpLT57TW9udGh9ID09ICRfIH0gQHsgJFBhcmFte0FwcG9pbnRtZW50fS0+e1JlY3VycmVuY2VGcmVxdWVuY3l9IH07CgogICAgICAgICAgICAkRm91bmQgPSAxOwogICAgICAgICAgICBsYXN0IE1PTlRIOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWYgISRGb3VuZDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJEN1cnJlbnRUaW1lT2JqZWN0Owp9Cgo9aGVhZDIgX1RpbWVDaGVjaygpCgpDaGVjayBpZiBUaW1lIGFuZCBPcmlnaW5hbFRpbWUgaGF2ZSBzYW1lIGhvdXIsIG1pbnV0ZSBhbmQgc2Vjb25kIHZhbHVlLCBhbmQgcmV0dXJuIHRpbWVzdGFtcCB3aXRoCnZhbHVlcyAoaG91ciwgbWludXRlIGFuZCBzZWNvbmQpIGFzIGluIFRpbWUuCgogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT5fVGltZUNoZWNrKAogICAgICAgIE9yaWdpbmFsVGltZSA9PiAnMjAxNi0wMS0wMSAwMDowMTowMCcsICAgICAjIChyZXF1aXJlZCkKICAgICAgICBUaW1lICAgICAgICAgPT4gJzIwMTYtMDItMDEgMDA6MDI6MDAnLCAgICAgIyAocmVxdWlyZWQpCiAgICApOwoKUmV0dXJuczoKICAgICRSZXN1bHQgPSAnMjAxNi0wMi0wMSAwMDowMTowMCc7Cgo9Y3V0CgpzdWIgX1RpbWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhPcmlnaW5hbFRpbWUgVGltZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICggJE9yaWdpbmFsRGF0ZSwgJE9yaWdpbmFsVGltZSApID0gJFBhcmFte09yaWdpbmFsVGltZX0gPX4gbS8oLio/KVxzKC4qPykkLzsKICAgIG15ICgkRGF0ZSkgPSAkUGFyYW17VGltZX0gPX4gbS8oLio/KVxzKC4qPykkLzsKCiAgICByZXR1cm4gIiREYXRlICRPcmlnaW5hbFRpbWUiOwp9Cgo9aGVhZDIgX0NXRGlmZigpCgpSZXR1cm5zIGhvdyBtYW55IGNhbGVuZGFyIHdlZWtzIGhhcyBwYXNzZWQgYmV0d2VlbiB0d28gdW5peCB0aW1lcy4KCiAgICBteSAkQ1dEaWZmID0gJFNlbGYtPl9DV0RpZmYoCiAgICAgICAgQ3VycmVudFRpbWUgID0+ICRDdXJyZW50VGltZU9iamVjdCwgICAgIChyZXF1aXJlZCkgRGF0ZSB0aW1lIG9iamVjdCB3aXRoIGN1cnJlbnQgdGltZQogICAgICAgIE9yaWdpbmFsVGltZSA9PiAkT3JpZ2luYWxUaW1lT2JqZWN0LCAgICAocmVxdWlyZWQpIERhdGUgdGltZSBvYmplY3Qgd2l0aCBvcmlnaW5hbCB0aW1lCiAgICApOwoKcmV0dXJuczoKICAgICRDV0RpZmYgPSA1OwoKPWN1dAoKc3ViIF9DV0RpZmYgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ3VycmVudFRpbWUgT3JpZ2luYWxUaW1lKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJE9yaWdpbmFsVGltZU9iamVjdCA9ICRQYXJhbXtPcmlnaW5hbFRpbWV9OwogICAgbXkgJEN1cnJlbnRUaW1lT2JqZWN0ICA9ICRQYXJhbXtDdXJyZW50VGltZX07CgogICAgbXkgJFN0YXJ0WWVhciA9ICRPcmlnaW5hbFRpbWVPYmplY3QtPkdldCgpLT57WWVhcn07CiAgICBteSAkRW5kWWVhciAgID0gJEN1cnJlbnRUaW1lT2JqZWN0LT5HZXQoKS0+e1llYXJ9OwoKICAgIG15ICRSZXN1bHQgPSAkQ3VycmVudFRpbWVPYmplY3QtPntDUEFORGF0ZVRpbWVPYmplY3R9LT53ZWVrX251bWJlcigpCiAgICAgICAgLSAkT3JpZ2luYWxUaW1lT2JqZWN0LT57Q1BBTkRhdGVUaW1lT2JqZWN0fS0+d2Vla19udW1iZXIoKTsKCiAgICAjIElmIGRhdGUgaXMgZW5kIG9mIHRoZSB5ZWFyIGFuZCBkYXRlIENXIHN0YXJ0cyB3aXRoIDEsIHdlIG5lZWQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIHllYXIuCiAgICBpZiAoICRSZXN1bHQgPCAwICYmICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntEYXl9ID09IDMxICYmICRDdXJyZW50VGltZU9iamVjdC0+R2V0KCktPntNb250aH0gPT0gMTIgKSB7CiAgICAgICAgJEVuZFllYXIrKzsKICAgIH0KCiAgICBmb3IgbXkgJFllYXIgKCAkU3RhcnRZZWFyIC4uICRFbmRZZWFyIC0gMSApIHsKICAgICAgICBteSAkQ1cgID0gMDsKICAgICAgICBteSAkRGF5ID0gMzE7CgogICAgICAgIHdoaWxlICggJENXIDwgNTAgKSB7CgogICAgICAgICAgICAjIFRvIGdldCBob3cgbWFueSBDVydzIGFyZSBpbiB0aGlzIHllYXIsIHdlIHNldCB0ZW1wb3JhcnkgZGF0ZSB0byAzMS1kZWMuCiAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICIkWWVhci0xMi0kRGF5IDIzOjU5OjAwIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ1cgPSAkRGF0ZVRpbWVPYmplY3QtPntDUEFORGF0ZVRpbWVPYmplY3R9LT53ZWVrX251bWJlcigpOwogICAgICAgICAgICAkRGF5LS07CiAgICAgICAgfQoKICAgICAgICAkUmVzdWx0ICs9ICRDVzsKICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWVuZCBJbnRlcm5hbDoKCj1jdXQKCjE7Cg==</File>
        <File Location="Custom/Kernel/System/Daemon/SchedulerDB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9EYWVtb24vU2NoZWR1bGVyREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6RGFlbW9uOjpTY2hlZHVsZXJEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBNSU1FOjpCYXNlNjQgcXcoZGVjb2RlX2Jhc2U2NCBlbmNvZGVfYmFzZTY0KTsKdXNlIFRpbWU6OkhpUmVzICAoKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNyb25FdmVudCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljQWdlbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3RvcmFibGUnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpEYWVtb246OlNjaGVkdWxlckRCIC0gU2NoZWR1bGVyIGRhdGFiYXNlIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpJbmNsdWRlcyBhbGwgc2NoZWR1bGVyIHJlbGF0ZWQgZGF0YWJhc2UgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGEgc2NoZWR1bGVyIGRhdGFiYXNlIG9iamVjdC4gRG8gbm90IHVzZSBpdCBkaXJlY3RseSwgaW5zdGVhZCB1c2U6CgogICAgbXkgJFNjaGVkdWxlckRCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRhZW1vbjo6U2NoZWR1bGVyREInKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgVGFza0FkZCgpCgphZGQgYSBuZXcgdGFzayB0byBzY2hlZHVsZXIgdGFzayBsaXN0CgogICAgbXkgJFRhc2tJRCA9ICRTY2hlZHVsZXJEQk9iamVjdC0+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+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkxvYWRlcjo6TW9kdWxlOjpBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldyMjIzAwOS1BcHBvaW50bWVudFRpY2tldCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Mb2FkZXJtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb246OkxvYWRlcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJKYXZhU2NyaXB0Ij4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvcmUuQUpBWC5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5EYXRhLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlRpY2tldEFjdGlvbi5qczwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkR5bmFtaWNGaWVsZFNjcmVlbnMjIyNBcHBvaW50bWVudFRpY2tldHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGhpcyBjb25maWd1cmF0aW9uIGRlZmluZXMgYWxsIHBvc3NpYmxlIHNjcmVlbnMgdG8gZW5hYmxlIG9yIGRpc2FibGUgZHluYW1pYyBmaWVsZHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Gcm9udGVuZDo6QmFzZTo6RHluYW1pY0ZpZWxkU2NyZWVuczwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudEFwcG9pbnRtZW50RWRpdCMjI0R5bmFtaWNGaWVsZCI+QWdlbnRBcHBvaW50bWVudEVkaXQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgo8L290b2JvX2NvbmZpZz4K</File>
        <File Location="Kernel/Language/de_AppointmentToTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0FwcG9pbnRtZW50VG9UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIFRlbXBsYXRlOiBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnVGlja2V0IENyZWF0aW9uJ30gPSAnVGlja2V0LUVyc3RlbGx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQXJ0aWNsZSBpcyB2aXNpYmxlIGZvciBjdXN0b21lcid9ID0gJ0FydGlrZWwgaXN0IGbDvHIgS3VuZGVuIHNpY2h0YmFyJzsKCiAgICAjIFBlcmwgTW9kdWxlOiBLZXJuZWwvTW9kdWxlcy9BZ2VudEFwcG9pbnRtZW50RWRpdC5wbQogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnTm8gdGlja2V0IGNyZWF0aW9uJ30gPSAnS2VpbmUgVGlja2V0LUVyc3RlbGx1bmcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBkZXN0ISd9ID0gJ0RpZSDDnGJlcnByw7xmdW5nIGRlcyBGZWxkZXMgZGVzdCBrb25udGUgbmljaHQgZHVyY2hnZWbDvGhydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgbmV4dCBzdGF0ZSEnfSA9ICdEaWUgw5xiZXJwcsO8ZnVuZyBkZXMgRmVsZGVzIG5leHQgc3RhdGUga29ubnRlIG5pY2h0IGR1cmNoZ2Vmw7xocnQgd2VyZGVuISc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydDb3VsZCBub3QgcGVyZm9ybSB2YWxpZGF0aW9uIG9uIGZpZWxkIHNlcnZpY2UhJ30gPSAnVmFsaWRpZXJ1bmcgaW0gQXXDn2VuZGllbnN0IGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCBTTEEhJ30gPSAnRGllIFZhbGlkaWVydW5nIGRlcyBGZWxkZXMgU0xBIGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnQ291bGQgbm90IHBlcmZvcm0gdmFsaWRhdGlvbiBvbiBmaWVsZCB0eXBlISd9ID0gJ0RpZSDDnGJlcnByw7xmdW5nIGRlcyBGZWxkdHlwcyBrb25udGUgbmljaHQgZHVyY2hnZWbDvGhydCB3ZXJkZW4hJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0NvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgcHJpb3JpdHkhJ30gPSAnRGllIMOcYmVycHLDvGZ1bmcgZGVzIEZlbGRlcyBQcmlvcml0w6R0IGtvbm50ZSBuaWNodCBkdXJjaGdlZsO8aHJ0IHdlcmRlbiEnOwoKICAgICMgU3lzQ29uZmlnCiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZXRlcm1pbmVzIHRoZSBuZXh0IHBvc3NpYmxlIHRpY2tldCBzdGF0ZXMsIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyB0aWNrZXQgZnJvbSBhIGNhbGVuZGFyIGFwcG9pbnRtZW50IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPQogICAgICAgICdFcm1pdHRlbHQgZGllIG7DpGNoc3Rtw7ZnbGljaGVuIFRpY2tldHN0YXR1cywgbmFjaGRlbSBlaW4gbmV1ZXMgVGlja2V0IGF1cyBlaW5lbSBLYWxlbmRlcnRlcm1pbiBpbiBkZXIgQWdlbnRlbm9iZXJmbMOkY2hlIGVyc3RlbGx0IHd1cmRlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEeW5hbWljIGZpZWxkcyBzaG93biBpbiB0aGUgYXBwb2ludG1lbnQgZWRpdCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0R5bmFtaXNjaGUgRmVsZGVyLCBkaWUgaW4gZGVyIFRlcm1pbmJlYXJiZWl0dW5nc21hc2tlIGRlciBBZ2VudGVuc2Nobml0dHN0ZWxsZSBhbmdlemVpZ3Qgd2VyZGVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0xvYWRlcm1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnTG9hZGVybW9kdWwtUmVnaXN0cmllcnVuZyBmw7xyIGRpZSBBZ2VudGVuc2Nobml0dHN0ZWxsZS4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIGZvciBuZXcgdGlja2V0cyBpbiB0aGUgQWdlbnRBcHBvaW50bWVudEVkaXQgaW50ZXJmYWNlLid9ID0KICAgICAgICAnTGVndCBkZW4gU3RhbmRhcmRuYWNoZm9sZ2VzdGF0dXMgZsO8ciBuZXVlIFRpY2tldHMgaW4gZGVyIFNjaG5pdHRzdGVsbGUgQWdlbnRBcHBvaW50bWVudEVkaXQgZmVzdC4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2V0cyB0aGUgZGVmYXVsdCBwcmlvcml0eSBmb3IgbmV3IHRpY2tldHMgaW4gdGhlIEFnZW50QXBwb2ludG1lbnRFZGl0IGludGVyZmFjZS4nfSA9CiAgICAgICAgJ0xlZ3QgZGllIFN0YW5kYXJkcHJpb3JpdMOkdCBmw7xyIG5ldWUgVGlja2V0cyBpbiBkZXIgU2Nobml0dHN0ZWxsZSBBZ2VudEFwcG9pbnRtZW50RWRpdCBmZXN0Lic7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgJyslcyBtb3JlJywKICAgICdBbGwgb2NjdXJyZW5jZXMnLAogICAgJ0FsbC1kYXknLAogICAgJ0FwcG9pbnRtZW50JywKICAgICdBcHInLAogICAgJ0FwcmlsJywKICAgICdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJywKICAgICdBdWcnLAogICAgJ0F1Z3VzdCcsCiAgICAnQ2xvc2UgdGhpcyBkaWFsb2cnLAogICAgJ0RheScsCiAgICAnRGVjJywKICAgICdEZWNlbWJlcicsCiAgICAnRHVwbGljYXRlZCBlbnRyeScsCiAgICAnRmViJywKICAgICdGZWJydWFyeScsCiAgICAnRmlyc3Qgc2VsZWN0IGEgY3VzdG9tZXIgdXNlciwgdGhlbiBzZWxlY3QgYSBjdXN0b21lciBJRCB0byBhc3NpZ24gdG8gdGhpcyB0aWNrZXQuJywKICAgICdGcicsCiAgICAnRnJpJywKICAgICdGcmlkYXknLAogICAgJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJywKICAgICdKYW4nLAogICAgJ0phbnVhcnknLAogICAgJ0p1bCcsCiAgICAnSnVseScsCiAgICAnSnVtcCcsCiAgICAnSnVuJywKICAgICdKdW5lJywKICAgICdKdXN0IHRoaXMgb2NjdXJyZW5jZScsCiAgICAnTG9hZGluZy4uLicsCiAgICAnTWFyJywKICAgICdNYXJjaCcsCiAgICAnTWF5JywKICAgICdNYXlfbG9uZycsCiAgICAnTW8nLAogICAgJ01vbicsCiAgICAnTW9uZGF5JywKICAgICdNb250aCcsCiAgICAnTmFtZScsCiAgICAnTmV4dCcsCiAgICAnTm92JywKICAgICdOb3ZlbWJlcicsCiAgICAnT2N0JywKICAgICdPY3RvYmVyJywKICAgICdQbGVhc2UgZWl0aGVyIHR1cm4gc29tZSBvZmYgZmlyc3Qgb3IgaW5jcmVhc2UgdGhlIGxpbWl0IGluIGNvbmZpZ3VyYXRpb24uJywKICAgICdQcmVzcyBDdHJsK0MgKENtZCtDKSB0byBjb3B5IHRvIGNsaXBib2FyZCcsCiAgICAnUHJldmlvdXMnLAogICAgJ1Jlc291cmNlcycsCiAgICAnUmVzdG9yZSBkZWZhdWx0IHNldHRpbmdzJywKICAgICdTYScsCiAgICAnU2F0JywKICAgICdTYXR1cmRheScsCiAgICAnU2F2ZScsCiAgICAnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicsCiAgICAnU2VwJywKICAgICdTZXB0ZW1iZXInLAogICAgJ1NldHRpbmdzJywKICAgICdTdScsCiAgICAnU3VuJywKICAgICdTdW5kYXknLAogICAgJ1RoJywKICAgICdUaGlzIGFkZHJlc3MgYWxyZWFkeSBleGlzdHMgb24gdGhlIGFkZHJlc3MgbGlzdC4nLAogICAgJ1RoaXMgaXMgYSByZXBlYXRpbmcgYXBwb2ludG1lbnQnLAogICAgJ1RodScsCiAgICAnVGh1cnNkYXknLAogICAgJ1RpbWVsaW5lIERheScsCiAgICAnVGltZWxpbmUgTW9udGgnLAogICAgJ1RpbWVsaW5lIFdlZWsnLAogICAgJ1RvZGF5JywKICAgICdUb28gbWFueSBhY3RpdmUgY2FsZW5kYXJzJywKICAgICdUdScsCiAgICAnVHVlJywKICAgICdUdWVzZGF5JywKICAgICdXZScsCiAgICAnV2VkJywKICAgICdXZWRuZXNkYXknLAogICAgJ1dlZWsnLAogICAgJ1dvdWxkIHlvdSBsaWtlIHRvIGVkaXQganVzdCB0aGlzIG9jY3VycmVuY2Ugb3IgYWxsIG9jY3VycmVuY2VzPycsCiAgICAnbW9yZScsCiAgICAnbm9uZScsCiAgICApOwoKfQoKMTsK</File>
        <File Location="Kernel/System/Daemon/DaemonModules/SchedulerTaskWorker/AppointmentTicket.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+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">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6QXBwb2ludG1lbnRUb1RpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKPWhlYWQxIE5BTUUKCnZhcjo6cGFja2FnZXNldHVwOjpBcHBvaW50bWVudFRvVGlja2V0IC0gY29kZSB0byBleGVjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyOwogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkQ29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ3Zhcjo6cGFja2FnZXNldHVwOjpBcHBvaW50bWVudFRvVGlja2V0Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgYWx3YXlzIGRpc2NhcmQgdGhlIGNvbmZpZyBvYmplY3QgYmVmb3JlIHBhY2thZ2UgY29kZSBpcyBleGVjdXRlZCwKICAgICMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNvbmZpZyBvYmplY3Qgd2lsbCBiZSBjcmVhdGVkIG5ld2x5LCBzbyB0aGF0IGl0CiAgICAjIHdpbGwgdXNlIHRoZSByZWNlbnRseSB3cml0dGVuIG5ldyBjb25maWcgZnJvbSB0aGUgcGFja2FnZQogICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKAogICAgICAgIE9iamVjdHMgPT4gWydLZXJuZWw6OkNvbmZpZyddLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CgogICAgbXkgJFNRTCA9ICIKICAgICAgICBERUxFVEUgRlJPTSBzY2hlZHVsZXJfZnV0dXJlX3Rhc2sKICAgICAgICBXSEVSRSB0YXNrX3R5cGUgPSAnQXBwb2ludG1lbnRUaWNrZXQnCiAgICAiOwoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5EbygKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.AppointmentCalendar.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gZGViOTlkNjBkYWYyMTJhZTczZWM3ZmViNzgwNzRmM2Y3YWU1NjNmOCAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLmpzCi8vIC0tCi8vIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCi8vIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi8vIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi8vIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAovLyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwovLyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLy8gWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLy8gYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCi8vIC0tCgovKmdsb2JhbCBDbGlwYm9hcmQgKi8gICAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXJlZGVjbGFyZQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogKiBAbWVtYmVyb2YgQ29yZS5BZ2VudAogKiBAYXV0aG9yCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBhcHBvaW50bWVudCBjYWxlbmRhciBmdW5jdGlvbnMuCiAqLwpDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CgogICAgLy8gQXBwb2ludG1lbnQgZGF5cyBjYWNoZSBhbmQgcmVhZHkgZmxhZwogICAgdmFyIEFwcG9pbnRtZW50RGF5c0NhY2hlLAogICAgICAgIEFwcG9pbnRtZW50RGF5c0NhY2hlUmVmcmVzaGVkID0gZmFsc2UsCiAgICAgICAgQUpBWENvdW50ZXIgPSAwLAogICAgICAgIEN1cnJlbnRWaWV3LAogICAgICAgIENhbGVuZGFyU291cmNlcyA9IHt9OwoKICAgIC8qKgogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBhcHBvaW50bWVudCBjYWxlbmRhciBjb250cm9sLgogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBDYWxlbmRhckNvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJDb25maWcnKSwKICAgICAgICAgICAgUmVzb3VyY2VDb25maWcsCiAgICAgICAgICAgICRDYWxlbmRhck9iaiA9ICQoJyNjYWxlbmRhcicpLAogICAgICAgICAgICAkRGF0ZXBpY2tlck9iaiwKICAgICAgICAgICAgQ2xpcGJvYXJkSlMsCiAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudCA9IFtdOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PSAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JykgewogICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFDYWxlbmRhckNvbmZpZykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAkRGF0ZXBpY2tlck9iaiA9ICQoJzxkaXYgLz4nKQogICAgICAgICAgICAucHJvcCgnaWQnLCAnRGF0ZXBpY2tlcicpCiAgICAgICAgICAgIC5hZGRDbGFzcygnSGlkZGVuJykKICAgICAgICAgICAgLmluc2VydEFmdGVyKCRDYWxlbmRhck9iaiksCgogICAgICAgIENsaXBib2FyZEpTID0gbmV3IENsaXBib2FyZCgnLkNvcHlUb0NsaXBib2FyZCcpOwoKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdUZWFtSUQnKSkgewogICAgICAgICAgICBSZXNvdXJjZUNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIGRhdGE6IHsKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudFRlYW1MaXN0JywKICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdMaXN0UmVzb3VyY2VzJywKICAgICAgICAgICAgICAgICAgICBUZWFtSUQ6IENvcmUuQ29uZmlnLkdldCgnVGVhbUlEJykKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8vIEluaXRpYWxpemUgY2FsZW5kYXIKICAgICAgICAkQ2FsZW5kYXJPYmouZnVsbENhbGVuZGFyKHsKICAgICAgICAgICAgaGVhZGVyOiB7CiAgICAgICAgICAgICAgICBsZWZ0OiAnbW9udGgsYWdlbmRhV2VlayxhZ2VuZGFEYXkgdGltZWxpbmVNb250aCx0aW1lbGluZVdlZWssdGltZWxpbmVEYXknLAogICAgICAgICAgICAgICAgY2VudGVyOiAndGl0bGUnLAogICAgICAgICAgICAgICAgcmlnaHQ6ICdqdW1wLHRvZGF5IHByZXYsbmV4dCcKICAgICAgICAgICAgfSwKICAgICAgICAgICAgY3VzdG9tQnV0dG9uczogewogICAgICAgICAgICAgICAganVtcDogewogICAgICAgICAgICAgICAgICAgIHRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW1wJyksCiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICBTaG93RGF0ZXBpY2tlcigkQ2FsZW5kYXJPYmosICREYXRlcGlja2VyT2JqLCAkKHRoaXMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGRlZmF1bHRWaWV3OiBDb3JlLkNvbmZpZy5HZXQoJ0RlZmF1bHRWaWV3JyksCiAgICAgICAgICAgIGFsbERheVRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBbGwtZGF5JyksCiAgICAgICAgICAgIGlzUlRMOiBDb3JlLkNvbmZpZy5HZXQoJ0lzUlRMTGFuZ3VhZ2UnKSwKICAgICAgICAgICAgY29sdW1uRm9ybWF0OiAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgIHRpbWVGb3JtYXQ6ICdISDptbScsCiAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogJ0hIOm1tJywKICAgICAgICAgICAgdGl0bGVGb3JtYXQ6ICdEIE1NTSBZWVlZJywKICAgICAgICAgICAgd2Vla051bWJlcnM6IHRydWUsCiAgICAgICAgICAgIHdlZWtOdW1iZXJUaXRsZTogJyMnLAogICAgICAgICAgICB3ZWVrTnVtYmVyQ2FsY3VsYXRpb246ICdJU08nLAogICAgICAgICAgICBldmVudExpbWl0OiB0cnVlLAogICAgICAgICAgICBldmVudExpbWl0VGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ21vcmUnKSwKICAgICAgICAgICAgaGVpZ2h0OiA2MDAsCiAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLAogICAgICAgICAgICBzZWxlY3RhYmxlOiB0cnVlLAogICAgICAgICAgICBmaXJzdERheTogQ29yZS5Db25maWcuR2V0KCdDYWxlbmRhcldlZWtEYXlTdGFydCcpLAogICAgICAgICAgICBtb250aE5hbWVzOiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSmFudWFyeScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZlYnJ1YXJ5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTWFyY2gnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHJpbCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01heV9sb25nJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnSnVuZScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bHknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdWd1c3QnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXB0ZW1iZXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPY3RvYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTm92ZW1iZXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWNlbWJlcicpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG1vbnRoTmFtZXNTaG9ydDogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0phbicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZlYicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01hcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01heScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0F1ZycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NlcCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ09jdCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RlYycpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGRheU5hbWVzOiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU3VuZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW9uZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVHVlc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZG5lc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RodXJzZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRnJpZGF5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2F0dXJkYXknKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lc1Nob3J0OiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU3VuJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTW9uJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVHVlJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV2VkJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnVGh1JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRnJpJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2F0JykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgYnV0dG9uVGV4dDogewogICAgICAgICAgICAgICAgdG9kYXk6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUb2RheScpLAogICAgICAgICAgICAgICAgbW9udGg6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNb250aCcpLAogICAgICAgICAgICAgICAgd2VlazogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZWsnKSwKICAgICAgICAgICAgICAgIGRheTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0RheScpLAogICAgICAgICAgICAgICAgdGltZWxpbmVNb250aDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RpbWVsaW5lIE1vbnRoJyksCiAgICAgICAgICAgICAgICB0aW1lbGluZVdlZWs6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaW1lbGluZSBXZWVrJyksCiAgICAgICAgICAgICAgICB0aW1lbGluZURheTogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RpbWVsaW5lIERheScpLAogICAgICAgICAgICAgICAganVtcDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bXAnKSwKICAgICAgICAgICAgICAgIHByZXZEYXRlcGlja2VyOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUHJldmlvdXMnKSwKICAgICAgICAgICAgICAgIG5leHREYXRlcGlja2VyOiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnTmV4dCcpCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNjaGVkdWxlckxpY2Vuc2VLZXk6ICdHUEwtTXktUHJvamVjdC1Jcy1PcGVuLVNvdXJjZScsCiAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAwOjMwOjAwJywKICAgICAgICAgICAgZm9yY2VFdmVudER1cmF0aW9uOiB0cnVlLAogICAgICAgICAgICBub3dJbmRpY2F0b3I6IHRydWUsCiAgICAgICAgICAgIHRpbWV6b25lOiAnbG9jYWwnLAogICAgICAgICAgICByZXNvdXJjZUFyZWFXaWR0aDogJzIxJScsCiAgICAgICAgICAgIHZpZXdzOiB7CiAgICAgICAgICAgICAgICBtb250aDogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnTU1NTSBZWVlZJywKICAgICAgICAgICAgICAgICAgICBjb2x1bW5Gb3JtYXQ6ICdkZGRkJwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFnZW5kYURheTogewogICAgICAgICAgICAgICAgICAgIHRpdGxlRm9ybWF0OiAnRCBNTU0gWVlZWScsCiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBmYWxzZQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lTW9udGg6IHsKICAgICAgICAgICAgICAgICAgICBzbG90RHVyYXRpb246ICcyNDowMDowMCcsCiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IHsKICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ0QnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lV2VlazogewogICAgICAgICAgICAgICAgICAgIHNsb3REdXJhdGlvbjogJzAyOjAwOjAwJywKICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICB3ZWVrOiAxCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzbG90TGFiZWxGb3JtYXQ6IFsKICAgICAgICAgICAgICAgICAgICAgICAgJ2RkZCwgRCBNTU0nLAogICAgICAgICAgICAgICAgICAgICAgICAnSEgnCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHRpbWVsaW5lRGF5OiB7CiAgICAgICAgICAgICAgICAgICAgc2xvdER1cmF0aW9uOiAnMDA6MzA6MDAnLAogICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IDEKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHNsb3RMYWJlbEZvcm1hdDogWwogICAgICAgICAgICAgICAgICAgICAgICAnZGRkLCBEIE1NTScsCiAgICAgICAgICAgICAgICAgICAgICAgICdISDptbScKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxvYWRpbmc6IGZ1bmN0aW9uKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgaWYgKElzTG9hZGluZykgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLmFkZENsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICQoJy5DYWxlbmRhcldpZGdldCcpLnJlbW92ZUNsYXNzKCdMb2FkaW5nJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHZpZXdSZW5kZXI6IGZ1bmN0aW9uKFZpZXcpIHsKCiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBhcmUgb24gYSB0aW1lbGluZSB2aWV3LgogICAgICAgICAgICAgICAgaWYgKFZpZXcubmFtZSA9PT0gJ3RpbWVsaW5lV2VlaycgfHwgVmlldy5uYW1lID09PSAndGltZWxpbmVEYXknKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjYWxlbmRhciB3ZWVrIG51bWJlciB0byB0aW1lbGluZSB2aWV3IHRpdGxlcy4KICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5maW5kKCcuZmMtdG9vbGJhciA+IGRpdiA+IGgyJykuYXBwZW5kKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnPHNwYW4gLz4nKS5hZGRDbGFzcygnZmMtd2Vlay1udW1iZXInKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50ZXh0KFZpZXcuc3RhcnQuZm9ybWF0KCcgI1cnKSkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9LCAwKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSByZXN0b3JlIHNldHRpbmdzIGJ1dHRvbi4KICAgICAgICAgICAgICAgICAgICBSZXN0b3JlRGVmYXVsdFNldHRpbmdzSW5pdCgpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHZpZXcgc2VsZWN0aW9uCiAgICAgICAgICAgICAgICBpZiAoQ3VycmVudFZpZXcgIT09IHVuZGVmaW5lZCAmJiBDdXJyZW50VmlldyAhPT0gVmlldy5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbGxlbmdlVG9rZW46ICQoJyNDaGFsbGVuZ2VUb2tlbicpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnVXBkYXRlUHJlZmVyZW5jZXMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnZpZXdTY3JlZW46IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA/IENvcmUuQ29uZmlnLkdldCgnT3ZlcnZpZXdTY3JlZW4nKSA6ICdDYWxlbmRhck92ZXJ2aWV3JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWaWV3OiBWaWV3Lm5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIVJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkRlYnVnLkxvZygnRXJyb3IgdXBkYXRpbmcgdXNlciBwcmVmZXJlbmNlcyEnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBDdXJyZW50VmlldyA9IFZpZXcubmFtZTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbihTdGFydCwgRW5kLCBKU0V2ZW50LCBWaWV3LCBSZXNvdXJjZSkgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgU3RhcnQ6IFN0YXJ0LAogICAgICAgICAgICAgICAgICAgIEVuZDogRW5kLAogICAgICAgICAgICAgICAgICAgIEpTRXZlbnQ6IEpTRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgVmlldzogVmlldywKICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZTogUmVzb3VyY2UKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBUYXJnZXROUy5PcGVuRWRpdERpYWxvZyhEYXRhKTsKICAgICAgICAgICAgICAgICRDYWxlbmRhck9iai5mdWxsQ2FsZW5kYXIoJ3Vuc2VsZWN0Jyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50Q2xpY2s6IGZ1bmN0aW9uKENhbEV2ZW50LCBKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBTdGFydDogQ2FsRXZlbnQuc3RhcnQsCiAgICAgICAgICAgICAgICAgICAgRW5kOiBDYWxFdmVudC5lbmQsCiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVGFyZ2V0TlMuT3BlbkVkaXREaWFsb2coRGF0YSk7CiAgICAgICAgICAgICAgICBKU0V2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudERyb3A6IGZ1bmN0aW9uKENhbEV2ZW50LCBEZWx0YSwgUmV2ZXJ0RnVuYykgewogICAgICAgICAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IENhbEV2ZW50LAogICAgICAgICAgICAgICAgICAgIFByZXZpb3VzQXBwb2ludG1lbnQ6IEN1cnJlbnRBcHBvaW50bWVudCwKICAgICAgICAgICAgICAgICAgICBEZWx0YTogRGVsdGEsCiAgICAgICAgICAgICAgICAgICAgUmV2ZXJ0RnVuYzogUmV2ZXJ0RnVuYwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFVwZGF0ZUFwcG9pbnRtZW50KERhdGEpOwogICAgICAgICAgICB9LAogICAgICAgICAgICBldmVudFJlc2l6ZTogZnVuY3Rpb24oQ2FsRXZlbnQsIERlbHRhLCBSZXZlcnRGdW5jKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDYWxFdmVudDogQ2FsRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgUHJldmlvdXNBcHBvaW50bWVudDogQ3VycmVudEFwcG9pbnRtZW50LAogICAgICAgICAgICAgICAgICAgIERlbHRhOiBEZWx0YSwKICAgICAgICAgICAgICAgICAgICBSZXZlcnRGdW5jOiBSZXZlcnRGdW5jCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgVXBkYXRlQXBwb2ludG1lbnQoRGF0YSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVuZGVyOiBmdW5jdGlvbihDYWxFdmVudCwgJEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkSWNvbkNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAkSWNvbjsKCiAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQuYWxsRGF5CiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucmVjdXJyaW5nCiAgICAgICAgICAgICAgICAgICAgfHwgQ2FsRXZlbnQucGFyZW50SWQKICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC5ub3RpZmljYXRpb24KICAgICAgICAgICAgICAgICAgICB8fCBDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGUpIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbnRhaW5lciBhbmQgaWNvbiBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgJEljb25Db250YWluZXIgPSAkKCc8ZGl2IC8+JykuYWRkQ2xhc3MoJ0ljb25zJyk7CiAgICAgICAgICAgICAgICAgICAgJEljb24gPSAkKCc8aSAvPicpLmFkZENsYXNzKCdmYScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIGFwcG9pbnRtZW50IHdpdGggYXBwcm9wcmlhdGUgaWNvbihzKQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5hbGxEYXkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEljb24uY2xvbmUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdmYS1zdW4tbycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoQ2FsRXZlbnQucmVjdXJyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRJY29uLmNsb25lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnZmEtcmVwZWF0JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChDYWxFdmVudC5wYXJlbnRJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWxpbmsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50Lm5vdGlmaWNhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWJlbGwnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZFRvKCRJY29uQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKENhbEV2ZW50LnRpY2tldEFwcG9pbnRtZW50VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkSWNvbi5jbG9uZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ZhLWNoYXItJyArIENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKVtDYWxFdmVudC50aWNrZXRBcHBvaW50bWVudFR5cGVdLk1hcmspCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kVG8oJEljb25Db250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gUHJlcGVuZCBjb250YWluZXIgdG8gdGhlIGFwcG9pbnRtZW50CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuZmluZCgnLmZjLWNvbnRlbnQnKQogICAgICAgICAgICAgICAgICAgICAgICAucHJlcGVuZCgkSWNvbkNvbnRhaW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50UmVzaXplU3RhcnQ6IGZ1bmN0aW9uKENhbEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuc3RhcnQgPSBDYWxFdmVudC5zdGFydDsKICAgICAgICAgICAgICAgIEN1cnJlbnRBcHBvaW50bWVudC5lbmQgPSBDYWxFdmVudC5lbmQ7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50RHJhZ1N0YXJ0OiBmdW5jdGlvbihDYWxFdmVudCkgewogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnN0YXJ0ID0gQ2FsRXZlbnQuc3RhcnQ7CiAgICAgICAgICAgICAgICBDdXJyZW50QXBwb2ludG1lbnQuZW5kID0gQ2FsRXZlbnQuZW5kOwogICAgICAgICAgICAgICAgQ3VycmVudEFwcG9pbnRtZW50LnJlc291cmNlSWRzID0gQ2FsRXZlbnQucmVzb3VyY2VJZHM7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdmVyOiBmdW5jdGlvbihDYWxFdmVudCwgSlNFdmVudCkgewogICAgICAgICAgICAgICAgdmFyICRUb29sdGlwT2JqLAogICAgICAgICAgICAgICAgICAgIFBvc1ggPSAwLAogICAgICAgICAgICAgICAgICAgIFBvc1kgPSAwLAogICAgICAgICAgICAgICAgICAgIFRvb2x0aXBIVE1MID0gQ29yZS5UZW1wbGF0ZS5SZW5kZXIoJ0FnZW50L0FwcG9pbnRtZW50Q2FsZW5kYXIvQXBwb2ludG1lbnRUb29sdGlwJywgewogICAgICAgICAgICAgICAgICAgICAgICAnUGx1Z2luTGlzdCc6IENvcmUuQ29uZmlnLkdldCgnUGx1Z2luTGlzdCcpLAogICAgICAgICAgICAgICAgICAgICAgICAnQ2FsRXZlbnQnOiBDYWxFdmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2x0aXBUZW1wbGF0ZVJlc291cmNlJzogQ29yZS5Db25maWcuR2V0KCdUb29sdGlwVGVtcGxhdGVSZXNvdXJjZScpIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICdUaWNrZXRBcHBvaW50bWVudENvbmZpZyc6IENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKQogICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgIERvY3VtZW50VmlzaWJsZUxlZnQgPSAkKGRvY3VtZW50KS5zY3JvbGxMZWZ0KCkgKyAkKHdpbmRvdykud2lkdGgoKSwKICAgICAgICAgICAgICAgICAgICBEb2N1bWVudFZpc2libGVUb3AgPSAkKGRvY3VtZW50KS5zY3JvbGxUb3AoKSArICQod2luZG93KS5oZWlnaHQoKSwKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb247CgogICAgICAgICAgICAgICAgaWYgKCFKU0V2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgSlNFdmVudCA9IHdpbmRvdy5ldmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChKU0V2ZW50LnBhZ2VYIHx8IEpTRXZlbnQucGFnZVkpIHsKICAgICAgICAgICAgICAgICAgICBQb3NYID0gSlNFdmVudC5wYWdlWDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5wYWdlWTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoSlNFdmVudC5jbGllbnRYIHx8IEpTRXZlbnQuY2xpZW50WSkgewogICAgICAgICAgICAgICAgICAgIFBvc1ggPSBKU0V2ZW50LmNsaWVudFggKyBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgICAgICBQb3NZID0gSlNFdmVudC5jbGllbnRZICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3AgKyBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIEluY3JlYXNlIHBvc2l0aW9ucyBzbyB0aGUgdG9vbHRpcCBkbyBub3Qgb3ZlcmxhcCB3aXRoIG1vdXNlIHBvaW50ZXIKICAgICAgICAgICAgICAgIFBvc1ggKz0gMTA7CiAgICAgICAgICAgICAgICBQb3NZICs9IDEwOwoKICAgICAgICAgICAgICAgIGlmIChUb29sdGlwSFRNTC5sZW5ndGggPiAwKSB7CgogICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSB0b29sdGlwIG9iamVjdAogICAgICAgICAgICAgICAgICAgICRUb29sdGlwT2JqID0gJChUb29sdGlwSFRNTCkKICAgICAgICAgICAgICAgICAgICAgICAgLm9mZnNldCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IFBvc1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBQb3NYCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmRUbygnYm9keScpOwoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgdG9wIHBvc2l0aW9uIGlmIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIExhc3RZUG9zaXRpb24gPSBQb3NZICsgJFRvb2x0aXBPYmouaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RZUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVUb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgUG9zWSA9IFBvc1kgLSAkVG9vbHRpcE9iai5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouY3NzKCd0b3AnLCBQb3NZICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBSZS1jYWxjdWxhdGUgbGVmdCBwb3NpdGlvbiBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICAgICBMYXN0WFBvc2l0aW9uID0gUG9zWCArICRUb29sdGlwT2JqLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKExhc3RYUG9zaXRpb24gPiBEb2N1bWVudFZpc2libGVMZWZ0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFBvc1ggPSBQb3NYIC0gJFRvb2x0aXBPYmoud2lkdGgoKSAtIDMwOwogICAgICAgICAgICAgICAgICAgICAgICAkVG9vbHRpcE9iai5jc3MoJ2xlZnQnLCBQb3NYICsgJ3B4Jyk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHRoZSB0b29sdGlwCiAgICAgICAgICAgICAgICAgICAgJFRvb2x0aXBPYmouZmFkZUluKCdmYXN0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGV2ZW50TW91c2VvdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgJCgnLkFwcG9pbnRtZW50VG9vbHRpcCcpLmZhZGVPdXQoImZhc3QiKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRBZnRlckFsbFJlbmRlcjogZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmaXJzdCBkYXkgaW4gdGltZWxpbmVNb250aCB2aWV3IGlzIG5vdCBTYXR1cmRheSBvciBTdW5kYXksIHRoZSBmaXJzdCBkaXYuZmMtYmdldmVudCBzaG91bGQgYmUgcmVtb3ZlZC4KICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgYnVnIGZyb20gZnVsbGNhbGVuZGFyIGFuZCBpdCBjYW4gYmUgc29sdmVkIGhlcmUuIFNlZSBidWcjMTQ3NjQuCiAgICAgICAgICAgICAgICBpZiAoISQoJy5mYy10aW1lbGluZU1vbnRoLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50OmVxKDApJykuaGFzQ2xhc3MoJ2ZjLXNhdCcpCiAgICAgICAgICAgICAgICAgICAgJiYgISQoJy5mYy10aW1lbGluZU1vbnRoLXZpZXcgLmZjLXNsYXRzIHRkLmZjLXdpZGdldC1jb250ZW50OmVxKDApJykuaGFzQ2xhc3MoJ2ZjLXN1bicpKSB7CiAgICAgICAgICAgICAgICAgICAgJCgnLmZjLXRpbWVsaW5lTW9udGgtdmlldyAuZmMtYmdldmVudC1jb250YWluZXIgLmZjLWJnZXZlbnQ6ZXEoMCknKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXZlbnRzOiBDb3JlLkNvbmZpZy5HZXQoJ1dvcmtpbmdIb3Vyc0NvbmZpZycpLAogICAgICAgICAgICByZXNvdXJjZXM6IFJlc291cmNlQ29uZmlnLAogICAgICAgICAgICByZXNvdXJjZUNvbHVtbnM6IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBsYWJlbFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOYW1lJyksCiAgICAgICAgICAgICAgICAgICAgZmllbGQ6ICd0aXRsZScKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXSwKICAgICAgICAgICAgcmVzb3VyY2VMYWJlbFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdSZXNvdXJjZXMnKQogICAgICAgIH0pOwoKICAgICAgICAvLyBJbml0aWFsaXplIGRhdGVwaWNrZXIKICAgICAgICAkRGF0ZXBpY2tlck9iai5kYXRlcGlja2VyKHsKICAgICAgICAgICAgc2hvd09uOiAnYnV0dG9uJywKICAgICAgICAgICAgYnV0dG9uVGV4dDogQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bXAnKSwKICAgICAgICAgICAgY29uc3RyYWluSW5wdXQ6IHRydWUsCiAgICAgICAgICAgIHByZXZUZXh0OiBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnUHJldmlvdXMnKSwKICAgICAgICAgICAgbmV4dFRleHQ6IENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOZXh0JyksCiAgICAgICAgICAgIGZpcnN0RGF5OiBDb3JlLkNvbmZpZy5HZXQoJ0NhbGVuZGFyV2Vla0RheVN0YXJ0JyksCiAgICAgICAgICAgIHNob3dNb250aEFmdGVyWWVhcjogMCwKICAgICAgICAgICAgbW9udGhOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0phbnVhcnknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWJydWFyeScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01hcmNoJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXByaWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXlfbG9uZycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0p1bmUnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWx5JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnQXVndXN0JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VwdGVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnT2N0b2JlcicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ05vdmVtYmVyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnRGVjZW1iZXInKQogICAgICAgICAgICBdLAogICAgICAgICAgICBtb250aE5hbWVzU2hvcnQ6IFsKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKYW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGZWInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcHInKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdW4nKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdKdWwnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBdWcnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdTZXAnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdPY3QnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdOb3YnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdEZWMnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBkYXlOYW1lczogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbmRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdXZWRuZXNkYXknKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaHVyc2RheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaWRheScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdHVyZGF5JykKICAgICAgICAgICAgXSwKICAgICAgICAgICAgZGF5TmFtZXNTaG9ydDogWwogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1N1bicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ01vbicpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1ZScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1dlZCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RodScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyaScpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1NhdCcpCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIGRheU5hbWVzTWluOiBbCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU3UnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdNbycpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1R1JyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnV2UnKSwKICAgICAgICAgICAgICAgIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdUaCcpLAogICAgICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0ZyJyksCiAgICAgICAgICAgICAgICBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2EnKQogICAgICAgICAgICBdLAogICAgICAgICAgICBpc1JUTDogQ29yZS5Db25maWcuR2V0KCdJc1JUTExhbmd1YWdlJyksCiAgICAgICAgICAgIG9uU2VsZWN0OiBmdW5jdGlvbihEYXRlVGV4dCkgewogICAgICAgICAgICAgICAgJENhbGVuZGFyT2JqLmZ1bGxDYWxlbmRhcignZ290b0RhdGUnLCBuZXcgRGF0ZShEYXRlVGV4dCkpOwogICAgICAgICAgICAgICAgJCgnI0RhdGVwaWNrZXJPdmVybGF5JykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAkRGF0ZXBpY2tlck9iai5oaWRlKCk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGJlZm9yZVNob3dEYXk6IGZ1bmN0aW9uKERhdGVPYmplY3QpIHsKICAgICAgICAgICAgICAgIGlmIChBcHBvaW50bWVudERheXNDYWNoZVJlZnJlc2hlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBDaGVja0RhdGUoRGF0ZU9iamVjdCk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdHJ1ZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIG9uQ2hhbmdlTW9udGhZZWFyOiBmdW5jdGlvbihZZWFyLCBNb250aCkgewogICAgICAgICAgICAgICAgQXBwb2ludG1lbnREYXlzKCREYXRlcGlja2VyT2JqLCBZZWFyLCBNb250aCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgJC5lYWNoKENhbGVuZGFyQ29uZmlnLCBmdW5jdGlvbiAoSW5kZXgsIENhbGVuZGFyKSB7CiAgICAgICAgICAgIHZhciBDYWxlbmRhckRhdGEgPSB7CiAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgiI0NoYWxsZW5nZVRva2VuIikudmFsKCksCiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEFwcG9pbnRtZW50TGlzdCcsCiAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdMaXN0QXBwb2ludG1lbnRzJywKICAgICAgICAgICAgICAgIENhbGVuZGFySUQ6IENhbGVuZGFyLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICBSZXNvdXJjZUlEOiBDb3JlLkNvbmZpZy5HZXQoJ1Jlc291cmNlSUQnKSwKICAgICAgICAgICAgICAgIFRlYW1JRDogQ29yZS5Db25maWcuR2V0KCdUZWFtSUQnKQogICAgICAgICAgICB9OwogICAgICAgICAgICBDYWxlbmRhclNvdXJjZXNbQ2FsZW5kYXIuQ2FsZW5kYXJJRF0gPSB7CiAgICAgICAgICAgICAgICBpZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKICAgICAgICAgICAgICAgIHVybDogQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwKICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJywKICAgICAgICAgICAgICAgIGRhdGE6IENhbGVuZGFyRGF0YSwKICAgICAgICAgICAgICAgIGNvbG9yOiBDYWxlbmRhci5Db2xvciwKICAgICAgICAgICAgICAgIHRleHRDb2xvcjogQ2FsZW5kYXIuVGV4dENvbG9yLAogICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICdyZ2JhKDAsIDAsIDAsIDAuMiknLAogICAgICAgICAgICAgICAgc3RhcnRQYXJhbTogJ1N0YXJ0VGltZScsCiAgICAgICAgICAgICAgICBlbmRQYXJhbTogJ0VuZFRpbWUnLAoKICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHJlbW92ZUV2ZW50U291cmNlLgogICAgICAgICAgICAgICAgZ29vZ2xlQ2FsZW5kYXJJZDogQ2FsZW5kYXIuQ2FsZW5kYXJJRCwKCiAgICAgICAgICAgICAgICBldmVudERhdGFUcmFuc2Zvcm06IGZ1bmN0aW9uKEFwcG9pbnRtZW50RGF0YSkgewogICAgICAgICAgICAgICAgICAgIHZhciBUaWNrZXRBcHBvaW50bWVudENvbmZpZyA9IENvcmUuQ29uZmlnLkdldCgnVGlja2V0QXBwb2ludG1lbnRDb25maWcnKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IEFwcG9pbnRtZW50RGF0YS5BcHBvaW50bWVudElELAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJZDogQXBwb2ludG1lbnREYXRhLlBhcmVudElELAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogQXBwb2ludG1lbnREYXRhLlN0YXJ0VGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREYXRlOiBBcHBvaW50bWVudERhdGEuU3RhcnREYXRlLAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IEFwcG9pbnRtZW50RGF0YS5FbmRUaW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbmREYXRlOiBBcHBvaW50bWVudERhdGEuRW5kRGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IEFwcG9pbnRtZW50RGF0YS5UaXRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IEFwcG9pbnRtZW50RGF0YS5EZXNjcmlwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb246IEFwcG9pbnRtZW50RGF0YS5Mb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJJZDogQXBwb2ludG1lbnREYXRhLkNhbGVuZGFySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIGFsbERheTogcGFyc2VJbnQoQXBwb2ludG1lbnREYXRhLkFsbERheSwgMTApID8gdHJ1ZSA6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJpbmc6IHBhcnNlSW50KEFwcG9pbnRtZW50RGF0YS5SZWN1cnJpbmcsIDEwKSA/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+JykuYWRkQ2xhc3MoJ2ZhIGZhLW1pbnVzLXNxdWFyZS1vJykKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC5hcHBlbmRUbygkTGlua0NvbnRhaW5lck9iaik7CgogICAgICAgICAgICAkTGlua0NvbnRhaW5lck9iai5hcHBlbmRUbygkUGx1Z2luQ29udGFpbmVyT2JqKTsKICAgICAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgICAgICB9CgogICAgICAgICRQbHVnaW5GaWVsZHMuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkRWxlbWVudCA9ICQodGhpcyksCiAgICAgICAgICAgICAgICBQbHVnaW5LZXkgPSAkRWxlbWVudC5kYXRhKCdwbHVnaW5LZXknKSwKICAgICAgICAgICAgICAgIFBsdWdpblVSTCA9ICRFbGVtZW50LmRhdGEoJ3BsdWdpblVybCcpOwoKICAgICAgICAgICAgLy8gU2tpcCBhbHJlYWR5IGluaXRpYWxpemVkIGZpZWxkcwogICAgICAgICAgICBpZiAoJEVsZW1lbnQuaGFzQ2xhc3MoJ3VpLWF1dG9jb21wbGV0ZS1pbnB1dCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRBSkFYTnVtYmVyID0gKytBSkFYQ291bnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYWxsZW5nZVRva2VuOiAkKCcjQ2hhbGxlbmdlVG9rZW4nKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50QXBwb2ludG1lbnRQbHVnaW5TZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luS2V5OiBQbHVnaW5LZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0gKyAnKicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiAyMAogICAgICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKAogICAgICAgICAgICAgICAgICAgICAgICAnQXV0b0NvbXBsZXRlWEhSJywKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVSTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBbXTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHJlc3VsdCBpcyBmcm9tIHRoZSBsYXRlc3QgYWpheCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFKQVhDb3VudGVyICE9PSBDdXJyZW50QUpBWE51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5WYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogIHRoaXMuS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9LCBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJykudHJpZ2dlcignc2VsZWN0LkF1dG9jb21wbGV0ZScpOwogICAgICAgICAgICAgICAgQWRkTGluayhQbHVnaW5LZXksIFBsdWdpblVSTCwgVUkuaXRlbS5rZXksIFVJLml0ZW0ubGFiZWwpOwoKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSwgUGx1Z2luS2V5KTsKICAgICAgICB9KTsKCiAgICAgICAgSW5pdFJlbW92ZUJ1dHRvbnMoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEVkaXRBcHBvaW50bWVudAogICAgICogQHBhcmFtIHtPYmplY3R9IERhdGEgLSBIYXNoIHdpdGggY2FsbCBhbmQgYXBwb2ludG1lbnQgZGF0YS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BcHBvaW50bWVudElEIC0gQXBwb2ludG1lbnQgSUQuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuQWN0aW9uIC0gRWRpdCBhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3ViYWN0aW9uIC0gRWRpdCBzdWJhY3Rpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuVGl0bGUgLSBBcHBvaW50bWVudCB0aXRsZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5EZXNjcmlwdGlvbiAtIEFwcG9pbnRtZW50IGRlc2NyaXB0aW9uLgogICAgICogQHBhcmFtIHtJbnRlZ2VyfSBEYXRhLkxvY2F0aW9uIC0gQXBwb2ludG1lbnQgbG9jYXRpb24uCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRZZWFyIC0gQXBwb2ludG1lbnQgc3RhcnQgeWVhci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1vbnRoIC0gQXBwb2ludG1lbnQgc3RhcnQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnREYXkgLSBBcHBvaW50bWVudCBzdGFydCBkYXkuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuU3RhcnRIb3VyIC0gQXBwb2ludG1lbnQgc3RhcnQgaG91ci4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5TdGFydE1pbnV0ZSAtIEFwcG9pbnRtZW50IHN0YXJ0IG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRZZWFyIC0gQXBwb2ludG1lbnQgZW5kIHllYXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTW9udGggLSBBcHBvaW50bWVudCBlbmQgbW9udGguCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kRGF5IC0gQXBwb2ludG1lbnQgZW5kIGRheS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5FbmRIb3VyIC0gQXBwb2ludG1lbnQgZW5kIGhvdXIuCiAgICAgKiBAcGFyYW0ge0ludGVnZXJ9IERhdGEuRW5kTWludXRlIC0gQXBwb2ludG1lbnQgZW5kIG1pbnV0ZS4KICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gRGF0YS5BbGxEYXkgLSBJcyBhcHBvaW50bWVudCBhbiBhbGwtZGF5IGFwcG9pbnRtZW50ICgwfDEpPwogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIHN1Ym1pdHMgYW4gZWRpdCBhcHBvaW50bWVudCBjYWxsIHRvIHRoZSBiYWNrZW5kIGFuZCByZWZyZXNoZXMgdGhlIHZpZXcuCiAgICAgICovCiAgICBUYXJnZXROUy5FZGl0QXBwb2ludG1lbnQgPSBmdW5jdGlvbiAoRGF0YSkgewogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3JykgewogICAgICAgICAgICAkKCcuT3ZlcnZpZXdDb250cm9sJykuYWRkQ2xhc3MoJ0xvYWRpbmcnKTsKICAgICAgICB9CgogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQ0dJSGFuZGxlJyksCiAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgIGZ1bmN0aW9uIChSZXNwb25zZSkgewogICAgICAgICAgICAgICAgaWYgKFJlc3BvbnNlLlN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICAgICAkKCcjY2FsZW5kYXInKS5mdWxsQ2FsZW5kYXIoJ3JlZmV0Y2hFdmVudHMnKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGRpYWxvZwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgJCgnLkRpYWxvZzp2aXNpYmxlJykucmVtb3ZlQ2xhc3MoJ1BlcnNpc3RlbnQnKTsKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2FkIHBhZ2UgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudEFwcG9pbnRtZW50QWdlbmRhT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoUmVzcG9uc2UuRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoUmVzcG9uc2UuRXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICk7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgQWdlbnRBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBtZXRob2QgaW5pdGlhbGl6ZXMgZnVuY3Rpb25hbGl0aWVzIGZvciBBZ2VudEFwcG9pbnRtZW50QWdlbnRPdmVydmlldyBzY3JlZW4uCiAgICAgKi8KICAgIFRhcmdldE5TLkFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgQ29uZmlnID0gQ29yZS5Db25maWcuR2V0KCdBcHBvaW50bWVudEFnZW5kYU92ZXJ2aWV3Jyk7CgogICAgICAgICQoJyNBcHBvaW50bWVudENyZWF0ZUJ1dHRvbicpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5PcGVuRWRpdERpYWxvZyh7CiAgICAgICAgICAgICAgICBTdGFydDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDEsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKSwKICAgICAgICAgICAgICAgIEVuZDogJC5mdWxsQ2FsZW5kYXIubW9tZW50KENvbmZpZy5TdGFydCkuYWRkKDIsICdob3VycycpLnN0YXJ0T2YoJ2hvdXInKQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICAkKCcuTWFzdGVyQWN0aW9uJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKSwKICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQgPSAkTWFzdGVyQWN0aW9uTGluay5kYXRhKCdhcHBvaW50bWVudElkJyk7CgogICAgICAgICAgICBDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIuT3BlbkVkaXREaWFsb2coewogICAgICAgICAgICAgICAgQ2FsRXZlbnQ6IHsKICAgICAgICAgICAgICAgICAgICBpZDogQXBwb2ludG1lbnRJRAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFnZW50QXBwb2ludG1lbnRBZ2VuZGFPdmVydmlldwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhcgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGZ1bmN0aW9uYWxpdGllcyBmb3IgQWdlbnRBcHBvaW50bWVudEVkaXQgc2NyZWVuLgogICAgICovCiAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuSW5pdCgpOwogICAgICAgIFRhcmdldE5TLkxvY2F0aW9uTGlua0luaXQoJCgnI0xvY2F0aW9uJyksICQoJy5Mb2NhdGlvbkxpbmsnKSk7CiAgICAgICAgVGFyZ2V0TlMuQWxsRGF5SW5pdCgkKCcjQWxsRGF5JykpOwogICAgICAgIFRhcmdldE5TLlJlY3VycmluZ0luaXQoewogICAgICAgICAgICAkUmVjdXJyaW5nOiAkKCcjUmVjdXJyaW5nJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVHlwZTogJCgnI1JlY3VycmVuY2VUeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZTogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlJyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlQ3VzdG9tVHlwZVN0cmluZ0RpdjogJCgnI1JlY3VycmVuY2VDdXN0b21UeXBlU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlSW50ZXJ2YWxUZXh0OiAkKCcjUmVjdXJyZW5jZUludGVydmFsVGV4dCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZUN1c3RvbVdlZWtseURpdjogJCgnI1JlY3VycmVuY2VDdXN0b21XZWVrbHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21Nb250aGx5RGl2OiAkKCcjUmVjdXJyZW5jZUN1c3RvbU1vbnRobHlEaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDdXN0b21ZZWFybHlEaXY6ICQoJyNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlTGltaXREaXY6ICQoJyNSZWN1cnJlbmNlTGltaXREaXYnKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VMaW1pdDogJCgnI1JlY3VycmVuY2VMaW1pdCcpLAogICAgICAgICAgICAkUmVjdXJyZW5jZVVudGlsRGl2OiAkKCcjUmVjdXJyZW5jZVVudGlsRGl2JyksCiAgICAgICAgICAgICRSZWN1cnJlbmNlVW50aWxEYXk6ICQoJyNSZWN1cnJlbmNlVW50aWxEYXknKSwKICAgICAgICAgICAgJFJlY3VycmVuY2VDb3VudERpdjogJCgnI1JlY3VycmVuY2VDb3VudERpdicpCiAgICAgICAgfSk7CiAgICAgICAgVGFyZ2V0TlMuTm90aWZpY2F0aW9uSW5pdCh7CiAgICAgICAgICAgICROb3RpZmljYXRpb25UZW1wbGF0ZTogJCgnI05vdGlmaWNhdGlvblRlbXBsYXRlJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXY6ICQoJyNOb3RpZmljYXRpb25DdXN0b21TdHJpbmdEaXYnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlSW5wdXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZUlucHV0JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXRDb3VudDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlVW5pdENvdW50JyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQ6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVVuaXQnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbVJlbGF0aXZlUG9pbnRPZlRpbWU6ICQoJyNOb3RpZmljYXRpb25DdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZUlucHV0OiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVJbnB1dCcpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVEYXk6ICQoJyNOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZURheScpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVNb250aDogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTW9udGgnKSwKICAgICAgICAgICAgJE5vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcjogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lWWVhcicpLAogICAgICAgICAgICAkTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyOiAkKCcjTm90aWZpY2F0aW9uQ3VzdG9tRGF0ZVRpbWVIb3VyJyksCiAgICAgICAgICAgICROb3RpZmljYXRpb25DdXN0b21EYXRlVGltZU1pbnV0ZTogJCgnI05vdGlmaWNhdGlvbkN1c3RvbURhdGVUaW1lTWludXRlJykKICAgICAgICB9KTsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgIFRhcmdldE5TLlRpY2tldEluaXQoewogICAgICAgICAgICAkVGlja2V0VGVtcGxhdGU6ICQoJyNUaWNrZXRUZW1wbGF0ZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tU3RyaW5nRGl2OiAkKCcjVGlja2V0Q3VzdG9tU3RyaW5nRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21DcmVhdGlvbkRpdjogJCgnI1RpY2tldEN1c3RvbUNyZWF0aW9uRGl2JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZUlucHV0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVJbnB1dCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0Q291bnQ6ICQoJyNUaWNrZXRDdXN0b21SZWxhdGl2ZVVuaXRDb3VudCcpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0OiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVVbml0JyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21SZWxhdGl2ZVBvaW50T2ZUaW1lOiAkKCcjVGlja2V0Q3VzdG9tUmVsYXRpdmVQb2ludE9mVGltZScpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVJbnB1dDogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSW5wdXQnKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lRGF5OiAkKCcjVGlja2V0Q3VzdG9tRGF0ZVRpbWVEYXknKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lTW9udGg6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1vbnRoJyksCiAgICAgICAgICAgICRUaWNrZXRDdXN0b21EYXRlVGltZVllYXI6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZVllYXInKSwKICAgICAgICAgICAgJFRpY2tldEN1c3RvbURhdGVUaW1lSG91cjogJCgnI1RpY2tldEN1c3RvbURhdGVUaW1lSG91cicpLAogICAgICAgICAgICAkVGlja2V0Q3VzdG9tRGF0ZVRpbWVNaW51dGU6ICQoJyNUaWNrZXRDdXN0b21EYXRlVGltZU1pbnV0ZScpCiAgICAgICAgfSk7Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICBUYXJnZXROUy5UZWFtSW5pdCgkKCcjVGVhbUlEJyksICQoJyNSZXNvdXJjZUlEJyksICQoJ2xhYmVsW2Zvcj0iVGVhbUlEIl0gKyBkaXYuRmllbGQgcC5SZWFkT25seVZhbHVlJyksICQoJ2xhYmVsW2Zvcj0iUmVzb3VyY2VJRCJdICsgZGl2LkZpZWxkIHAuUmVhZE9ubHlWYWx1ZScpKTsKCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJQZXJtaXNzaW9uTGV2ZWwnKSA+IDEpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuUGx1Z2luSW5pdCgkKCcuUGx1Z2luRmllbGQnKSwgJCgnI0NoYWxsZW5nZVRva2VuJykudmFsKCkpOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLlNldFN1Ym1pdEZ1bmN0aW9uKCQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJyksIGZ1bmN0aW9uIChGb3JtKSB7CiAgICAgICAgICAgIHZhciBEYXRhID0gbmV3IE9iamVjdCgpLAogICAgICAgICAgICAgICAgRGF5cyA9IG5ldyBBcnJheSgpLAogICAgICAgICAgICAgICAgTW9udGhEYXlzID0gbmV3IEFycmF5KCksCiAgICAgICAgICAgICAgICBNb250aHMgPSBuZXcgQXJyYXkoKTsKCiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBkYXlzCiAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tV2Vla2x5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCJpbnB1dCNEYXlzIikudmFsKERheXMuam9pbigpKTsKCiAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSBtb250aCBkYXlzCiAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tTW9udGhseURpdiBidXR0b24uZmMtc3RhdGUtYWN0aXZlIikuZWFjaChmdW5jdGlvbigpewogICAgICAgICAgICAgICAgTW9udGhEYXlzLnB1c2goJCh0aGlzKS52YWwoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAkKCJpbnB1dCNNb250aERheXMiKS52YWwoTW9udGhEYXlzLmpvaW4oKSk7CgogICAgICAgICAgICAvLyBzZXJpYWxpemUgbW9udGhzCiAgICAgICAgICAgICQoIiNSZWN1cnJlbmNlQ3VzdG9tWWVhcmx5RGl2IGJ1dHRvbi5mYy1zdGF0ZS1hY3RpdmUiKS5lYWNoKGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICBNb250aHMucHVzaCgkKHRoaXMpLnZhbCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoImlucHV0I01vbnRocyIpLnZhbChNb250aHMuam9pbigpKTsKCiAgICAgICAgICAgICQoRm9ybSkuZmluZCgnaW5wdXQsdGV4dGFyZWEsc2VsZWN0JykuZWFjaChmdW5jdGlvbiAoSW5kZXgsIEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChFbGVtZW50LnR5cGUgPT0gJ2NoZWNrYm94JykgewogICAgICAgICAgICAgICAgICAgIERhdGFbRWxlbWVudC5pZF0gPSAkKEVsZW1lbnQpLnByb3AoJ2NoZWNrZWQnKSA/ICcxJyA6ICcwJzsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChFbGVtZW50Lm5hbWUgPT0gJ0N1c3RvbWVyU2VsZWN0ZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFEYXRhW0VsZW1lbnQubmFtZV0gJiYgJChFbGVtZW50KS5wcm9wKCdjaGVja2VkJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVtFbGVtZW50Lm5hbWVdID0gJChFbGVtZW50KS52YWwoKTsKICAgICAgICAgICAgICAgICAgICB9Ci8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgRGF0YVtFbGVtZW50LmlkXSA9ICQoRWxlbWVudCkudmFsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd1dhaXRpbmdEaWFsb2coKTsKICAgICAgICAgICAgVGFyZ2V0TlMuRWRpdEFwcG9pbnRtZW50KERhdGEpOwogICAgICAgIH0pOwoKICAgICAgICAkKCIuQnV0dG9uVGFibGUgYnV0dG9uIikub24oImNsaWNrIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQodGhpcykudG9nZ2xlQ2xhc3MoImZjLXN0YXRlLWFjdGl2ZSIpOwogICAgICAgIH0pOwoKICAgICAgICAvLyBEdXBsaWNhdGUgYXBwb2ludG1lbnQKICAgICAgICAkKCcjRWRpdEZvcm1Db3B5Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIFJlc2V0IEFwcG9pbnRtZW50SUQsIHJlbW92ZSBDb3B5ICYgRGVsZXRlIGJ1dHRvbnMKICAgICAgICAgICAgJCgiI0VkaXRBcHBvaW50bWVudEZvcm0gaW5wdXQjQXBwb2ludG1lbnRJRCIpLnZhbCgiIik7CiAgICAgICAgICAgICQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFNhdmUgdGhlIGFwcG9pbnRtZW50CiAgICAgICAgJCgnI0VkaXRGb3JtU3VibWl0Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNFZGl0QXBwb2ludG1lbnRGb3JtJykuc3VibWl0KCk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIERlbGV0ZSB0aGUgYXBwb2ludG1lbnQKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdFZGl0QXBwb2ludG1lbnRJRCcpKSB7CiAgICAgICAgICAgICQoJyNFZGl0Rm9ybURlbGV0ZScpLm9uKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25maXJtKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgYXBwb2ludG1lbnQ/IFRoaXMgb3BlcmF0aW9uIGNhbm5vdCBiZSB1bmRvbmUuJykpKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLlNob3dXYWl0aW5nRGlhbG9nKCk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5BcHBvaW50bWVudENhbGVuZGFyLkVkaXRBcHBvaW50bWVudCh7CiAgICAgICAgICAgICAgICAgICAgICAgIEFwcG9pbnRtZW50SUQ6IENvcmUuQ29uZmlnLkdldCgnRWRpdEFwcG9pbnRtZW50SUQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdEZWxldGVBcHBvaW50bWVudCcKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvLyBFZGl0IHBhcmVudCBhcHBvaW50bWVudAogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0VkaXRQYXJlbnRJRCcpKSB7CiAgICAgICAgICAgICQoJyNFZGl0UGFyZW50Jykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICBDaGFsbGVuZ2VUb2tlbjogJCgiI0NoYWxsZW5nZVRva2VuIikudmFsKCksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRBcHBvaW50bWVudEVkaXQnLAogICAgICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0VkaXRNYXNrJywKICAgICAgICAgICAgICAgICAgICBBcHBvaW50bWVudElEOiBDb3JlLkNvbmZpZy5HZXQoJ0VkaXRQYXJlbnRJRCcpCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQXBwb2ludG1lbnRDYWxlbmRhci5TaG93V2FpdGluZ0RpYWxvZygpOwogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbCgKICAgICAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLAogICAgICAgICAgICAgICAgICAgIERhdGEsCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKEhUTUwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5EaWFsb2cuU2hvd0NvbnRlbnREaWFsb2coSFRNTCwgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0FwcG9pbnRtZW50JyksICcxMHB4JywgJ0NlbnRlcicsIHRydWUsIHVuZGVmaW5lZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoJCgnLkRpYWxvZzp2aXNpYmxlJykpOwogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZ2VudEFwcG9pbnRtZW50RWRpdCgpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgJ2h0bWwnCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8vIENsb3NlIHRoZSBkaWFsb2cKICAgICAgICAkKCcjRWRpdEZvcm1DYW5jZWwnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHsKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAkKCcuRGlhbG9nOnZpc2libGUnKS5yZW1vdmVDbGFzcygnUGVyc2lzdGVudCcpOwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5EaWFsb2c6dmlzaWJsZScpKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBkYXRlcGlja2VyIGJ1dHRvbnMuCiAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQ2FsZW5kYXJQZXJtaXNzaW9uTGV2ZWwnKSA+IDIpIHsKICAgICAgICAgICAgJC5lYWNoKFsnU3RhcnQnLCAnRW5kJywgJ1JlY3VycmVuY2VVbnRpbCcsICdOb3RpZmljYXRpb25DdXN0b21EYXRlVGltZSddLCBmdW5jdGlvbiAoSW5kZXgsIFByZWZpeCkgewogICAgICAgICAgICAgICAgQ29yZS5VSS5EYXRlcGlja2VyLkluaXQoewogICAgICAgICAgICAgICAgICAgIERheTogJCgnIycgKyBDb3JlLkFwcC5Fc2NhcGVTZWxlY3RvcihQcmVmaXgpICsgJ0RheScpLAogICAgICAgICAgICAgICAgICAgIE1vbnRoOiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnTW9udGgnKSwKICAgICAgICAgICAgICAgICAgICBZZWFyOiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnWWVhcicpLAogICAgICAgICAgICAgICAgICAgIEhvdXI6ICQoJyMnICsgQ29yZS5BcHAuRXNjYXBlU2VsZWN0b3IoUHJlZml4KSArICdIb3VyJyksCiAgICAgICAgICAgICAgICAgICAgTWludXRlOiAkKCcjJyArIENvcmUuQXBwLkVzY2FwZVNlbGVjdG9yKFByZWZpeCkgKyAnTWludXRlJyksCiAgICAgICAgICAgICAgICAgICAgV2Vla0RheVN0YXJ0OiBDb3JlLkNvbmZpZy5HZXQoJ0NhbGVuZGFyV2Vla0RheVN0YXJ0JykKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgQ29yZS5Jbml0LlJlZ2lzdGVyTmFtZXNwYWNlKFRhcmdldE5TLCAnQVBQX01PRFVMRScpOwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkFwcG9pbnRtZW50Q2FsZW5kYXIgfHwge30pKTsK</File>
        <File Location="var/httpd/htdocs/js/Core.Agent.CustomerSearch.js" Permission="660" Encode="Base64">Ly8gLS0KLy8gT1RPQk8gaXMgYSB3ZWItYmFzZWQgdGlja2V0aW5nIHN5c3RlbSBmb3Igc2VydmljZSBvcmdhbmlzYXRpb25zLgovLyAtLQovLyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAyMCBPVFJTIEFHLCBodHRwczovL290cnMuY29tLwovLyBDb3B5cmlnaHQgKEMpIDIwMTktMjAyNiBSb3RoZXIgT1NTIEdtYkgsIGh0dHBzOi8vb3RvYm8uaW8vCi8vIC0tCi8vICRvcmlnaW46IG90b2JvIC0gZGViOTlkNjBkYWYyMTJhZTczZWM3ZmViNzgwNzRmM2Y3YWU1NjNmOCAtIHZhci9odHRwZC9odGRvY3MvanMvQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5qcwovLyAtLQovLyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgovLyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQovLyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgovLyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLy8gQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKLy8gRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi8vIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi8vIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICogQG1lbWJlcm9mIENvcmUuQWdlbnQKICogQGF1dGhvcgogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY3VzdG9tZXIgc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEJhY2t1cERhdGEKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAbWVtYmVyIHtPYmplY3R9CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgU2F2ZXMgQ3VzdG9tZXIgZGF0YSBmb3IgbGF0ZXIgcmVzdG9yZS4KICAgICAqLwogICAgdmFyIEJhY2t1cERhdGEgPSB7CiAgICAgICAgICAgIEN1c3RvbWVySW5mbzogJycsCiAgICAgICAgICAgIEN1c3RvbWVyRW1haWw6ICcnLAogICAgICAgICAgICBDdXN0b21lcktleTogJycKICAgICAgICB9LAogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50CiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQG1lbWJlciB7T2JqZWN0fQogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIE5lZWRlZCBmb3IgdGhlIGNoYW5nZSBldmVudCBvZiBjdXN0b21lciBmaWVsZHMsIGlmIEFjdGl2ZUF1dG9Db21wbGV0ZSBpcyBmYWxzZSAoZGlzYWJsZWQpLgogICAgICovCiAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50ID0ge307CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBEaXNhYmxlIHRoZSBzZWxlY3Rpb24gZm9yIHRoZSBjdXN0b21lciBJRCwgaWYgbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBEZWFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYoJCgnI1RlbXBsYXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLmxlbmd0aCkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSkKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5wcm9wKCd0aXRsZScsIENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdGaXJzdCBzZWxlY3QgYSBjdXN0b21lciB1c2VyLCB0aGVuIHNlbGVjdCBhIGN1c3RvbWVyIElEIHRvIGFzc2lnbiB0byB0aGlzIHRpY2tldC4nKSk7CiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykuYWRkQ2xhc3MoJ0Rpc2FibGVkJyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IFZhbHVlIC0gVGhlIHZhbHVlIGF0dHJpYnV0ZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQHBhcmFtIHtTdHJpbmd9IE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHRvIGJlIHNlbGVjdGVkLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEFjdGl2YXRlIHRoZSBjdXN0b21lciBJRCBzZWxlY3Rpb24gYnV0dG9uLCBpZiAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCAoKSB7CiAgICAgICAgaWYgKCQoJyNUZW1wbGF0ZVNlbGVjdGlvbkN1c3RvbWVySUQnKS5sZW5ndGggJiYgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5oYXNDbGFzcygnRGlzYWJsZWQnKSkgewogICAgICAgICAgICAkKCcjU2VsZWN0aW9uQ3VzdG9tZXJJRCcpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpCiAgICAgICAgICAgICQoJyNTZWxlY3Rpb25DdXN0b21lcklEJykucHJvcCgndGl0bGUnLCBDb3JlLkxhbmd1YWdlLlRyYW5zbGF0ZSgnU2VsZWN0IGEgY3VzdG9tZXIgSUQgdG8gYXNzaWduIHRvIHRoaXMgdGlja2V0LicpKTsKICAgICAgICAgICAgJCgnI1NlbGVjdGlvbkN1c3RvbWVySUQnKS5yZW1vdmVDbGFzcygnRGlzYWJsZWQnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgR2V0Q3VzdG9tZXJJbmZvCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gQ3VzdG9tZXJVc2VySUQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZS4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VzdG9tZXJJbmZvKEN1c3RvbWVyVXNlcklEKSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgIFN1YmFjdGlvbjogJ0N1c3RvbWVySW5mbycsCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQKICAgICAgICAgICAgfSwKICAgICAgICAgICAgU2lnbmF0dXJlVVJMOwoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CgogICAgICAgICAgICAkKCcjQ3VzdG9tZXJJRCcpLnZhbChSZXNwb25zZS5DdXN0b21lcklEKTsKICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbChSZXNwb25zZS5DdXN0b21lcklEKTsKCiAgICAgICAgICAgIC8vIFB1Ymxpc2ggaW5mb3JtYXRpb24gZm9yIHN1YnNjcmliZXJzCiAgICAgICAgICAgIENvcmUuQXBwLlB1Ymxpc2goJ0V2ZW50LkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVySW5mby5DYWxsYmFjaycsIFtSZXNwb25zZS5DdXN0b21lcklEXSk7CgogICAgICAgICAgICAvLyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICAgICAgJCgnI0N1c3RvbWVySW5mbyAuQ29udGVudCcpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUYWJsZUhUTUxTdHJpbmcpOwoKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAovLyAgICAgICAgICAgICAvLyBvbmx5IGV4ZWN1dGUgdGhpcyBwYXJ0LCBpZiBpbiBBZ2VudFRpY2tldEVtYWlsIG9yIEFnZW50VGlja2V0UGhvbmUKLy8gICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQaG9uZScpIHsKLy8gICAgICAgICAgICAgICAgIHZhciAkRm9ybSA9IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyA/ICQoJyNOZXdFbWFpbFRpY2tldCcpIDogJCgnI05ld1Bob25lVGlja2V0Jyk7CiAgICAgICAgICAgIC8vIG9ubHkgZXhlY3V0ZSB0aGlzIHBhcnQsIGlmIGluIEFnZW50VGlja2V0RW1haWwgb3IgQWdlbnRUaWNrZXRQaG9uZSBvciBBZ2VudEFwcG9pbnRtZW50RWRpdAogICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICB2YXIgJEZvcm07CiAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjTmV3RW1haWxUaWNrZXQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJykgewogICAgICAgICAgICAgICAgICAgICRGb3JtID0gJCgnI05ld1Bob25lVGlja2V0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnKSB7CiAgICAgICAgICAgICAgICAgICAgJEZvcm0gPSAkKCcjRWRpdEFwcG9pbnRtZW50Rm9ybScpOwogICAgICAgICAgICAgICAgfQovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CgogICAgICAgICAgICAgICAgLy8gcmVzZXQgc2VydmljZQogICAgICAgICAgICAgICAgJCgnI1NlcnZpY2VJRCcpLmF0dHIoJ3NlbGVjdGVkSW5kZXgnLCAwKTsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZXJ2aWNlcyAodHJpZ2dlciBTZXJ2aWNlSUQgY2hhbmdlIGV2ZW50KQogICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJEZvcm0sICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcpOwoKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzaWduYXR1cmUgaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgaWYgKCQoJyNEZXN0JykudmFsKCkgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJ0FjdGlvbj0nICsgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSArICc7U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyAkKCcjRGVzdCcpLnZhbCgpICsgJztTZWxlY3RlZEN1c3RvbWVyVXNlcj0nICsgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnI1NpZ25hdHVyZScpLmF0dHIoJ3NyYycsIFNpZ25hdHVyZVVSTCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFByb2Nlc3MnKSB7CiAgICAgICAgICAgICAgICAvLyByZXNldCBzZXJ2aWNlCiAgICAgICAgICAgICAgICAkKCcjU2VydmljZUlEJykuYXR0cignc2VsZWN0ZWRJbmRleCcsIDApOwogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHNlcnZpY2VzICh0cmlnZ2VyIFNlcnZpY2VJRCBjaGFuZ2UgZXZlbnQpCiAgICAgICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ3VzdG9tZXJJRCcpLmNsb3Nlc3QoJ2Zvcm0nKSwgJ0FKQVhVcGRhdGUnLCAnU2VydmljZUlEJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBHZXRDdXN0b21lclRpY2tldHMKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lclVzZXJJRAogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVySUQKICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGdldHMgY3VzdG9tZXIgdGlja2V0cy4KICAgICAqLwogICAgZnVuY3Rpb24gR2V0Q3VzdG9tZXJUaWNrZXRzKEN1c3RvbWVyVXNlcklELCBDdXN0b21lcklEKSB7CgogICAgICAgIHZhciBEYXRhID0gewogICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgU3ViYWN0aW9uOiAnQ3VzdG9tZXJUaWNrZXRzJywKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQ6IEN1c3RvbWVyVXNlcklELAogICAgICAgICAgICBDdXN0b21lcklEOiBDdXN0b21lcklECiAgICAgICAgfTsKCiAgICAgICAgLy8gY2hlY2sgaWYgY3VzdG9tZXIgdGlja2V0cyBzaG91bGQgYmUgc2hvd24KICAgICAgICBpZiAodHlwZW9mIENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJTZWFyY2gnKSAhPT0gJ3VuZGVmaW5lZCcgJiYgIXBhcnNlSW50KENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJTZWFyY2gnKS5TaG93Q3VzdG9tZXJUaWNrZXRzLCAxMCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBDdXN0b21lckhpc3RvcnlFdmVudHMKICAgICAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaC5HZXRDdXN0b21lclRpY2tldHMKICAgICAgICAgKiBAZnVuY3Rpb24KICAgICAgICAgKiBAZGVzY3JpcHRpb24KICAgICAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBldmVudHMgZm9yIEN1c3RvbWVyIEhpc3Rvcnkgb3ZlcnZpZXcgdGFibGUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQ3VzdG9tZXJIaXN0b3J5RXZlbnRzKCkgewogICAgICAgICAgICAkKCdzZWxlY3RbbmFtZT1SZXNwb25zZUlEXScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgVVJMOwogICAgICAgICAgICAgICAgaWYgKCQodGhpcykudmFsKCkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJCh0aGlzKS5wYXJlbnRzKCkuc2VyaWFsaXplKCk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVVJMLCAnVGlja2V0QWN0aW9uJyk7CgogICAgICAgICAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzZWxlY3QgYm94IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYWdhaW4gZnJvbSB0aGUgc2FtZSB3aW5kb3cuCiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS52YWwoJzAnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICQoJ3NlbGVjdFtuYW1lPVJlc3BvbnNlSURdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIC5NYXN0ZXJBY3Rpb24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAgICAgICAgIHZhciAkTWFzdGVyQWN0aW9uTGluayA9ICQodGhpcykuZmluZCgnYS5NYXN0ZXJBY3Rpb25MaW5rJyk7CgogICAgICAgICAgICAgICAgLy8gUHJldmVudCBNYXN0ZXJBY3Rpb24gb24gTW9kZXJuaXplIGlucHV0IGZpZWxkcy4KICAgICAgICAgICAgICAgIGlmICgkKEV2ZW50LnRhcmdldCkuaGFzQ2xhc3MoJ0lucHV0RmllbGRfU2VhcmNoJykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvLyBFdmVudCBtdXN0IGJlIGRvbmUgaW4gdGhlIHBhcmVudCB3aW5kb3cgYmVjYXVzZSBBZ2VudFRpY2tldEN1c3RvbWVyIGlzIGluIHBvcHVwLgogICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJykgewogICAgICAgICAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuRXhlY3V0ZUluUGFyZW50V2luZG93KGZ1bmN0aW9uKFdpbmRvd09iamVjdCkgewogICAgICAgICAgICAgICAgICAgICAgICBXaW5kb3dPYmplY3QuQ29yZS5VSS5Qb3B1cC5GaXJlUG9wdXBFdmVudCgnVVJMJywgeyBVUkw6ICRNYXN0ZXJBY3Rpb25MaW5rLmF0dHIoJ2hyZWYnKSB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBDb3JlLlVJLlBvcHVwLkNsb3NlUG9wdXAoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhY3QgaWYgdGhlIGxpbmsgd2FzIG5vdCBjbGlja2VkIGRpcmVjdGx5LgogICAgICAgICAgICAgICAgICAgIGlmIChFdmVudC50YXJnZXQgIT09ICRNYXN0ZXJBY3Rpb25MaW5rLmdldCgwKSkgewogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSAkTWFzdGVyQWN0aW9uTGluay5hdHRyKCdocmVmJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgJCgiI1NvcnRCeSIpLm9mZignY2hhbmdlJykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBTb3J0ZWREYXRhLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbiA9ICQodGhpcykudmFsKCkuc3BsaXQoJ3wnKTsKCiAgICAgICAgICAgICAgICBpZiAoU2VsZWN0aW9uLmxlbmd0aCA9PT0gMikgewoKICAgICAgICAgICAgICAgICAgICAvLyBTaG93IHNvcnRlZCBjdXN0b21lciB0aWNrZXRzLgogICAgICAgICAgICAgICAgICAgIFNvcnRlZERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICBTdWJhY3Rpb246ICdDdXN0b21lclRpY2tldHMnLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRDogQ3VzdG9tZXJVc2VySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQ6IEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRCeTogU2VsZWN0aW9uWzBdLAogICAgICAgICAgICAgICAgICAgICAgICBPcmRlckJ5OiBTZWxlY3Rpb25bMV0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBTb3J0ZWREYXRhLCBmdW5jdGlvbiAoUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclRpY2tldHMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5odG1sKFJlc3BvbnNlLkN1c3RvbWVyVGlja2V0c0hUTUxTdHJpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZUN1c3RvbWVyVGlja2V0TGlua3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIEFjdGl2YXRlIE1vZGVybml6ZSBmaWVsZHMuCiAgICAgICAgICAgIENvcmUuVUkuSW5wdXRGaWVsZHMuQWN0aXZhdGUoKTsKICAgICAgICAgICAgQ29yZS5BcHAuU3Vic2NyaWJlKCdFdmVudC5VSS5BY2NvcmRpb24uT3BlbkVsZW1lbnQnLCBmdW5jdGlvbigkRWxlbWVudCkgewogICAgICAgICAgICAgICAgQ29yZS5VSS5JbnB1dEZpZWxkcy5BY3RpdmF0ZSgkRWxlbWVudCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcwogICAgICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLkdldEN1c3RvbWVyVGlja2V0cwogICAgICAgICAqIEBmdW5jdGlvbgogICAgICAgICAqIEByZXR1cm5zIHtCb29sZWFufSBSZXR1cm5zIGZhbHNlLgogICAgICAgICAqIEBkZXNjcmlwdGlvbgogICAgICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZXBsYWNlcyBhbmQgc2hvd3MgY3VzdG9tZXIgdGlja2V0IGxpbmtzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzKCkgewogICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuZmluZCgnLkFyaWFSb2xlTWFpbicpLnJlbW92ZUF0dHIoJ3JvbGUnKS5yZW1vdmVDbGFzcygnQXJpYVJvbGVNYWluJyk7CgogICAgICAgICAgICAvLyBSZXBsYWNlIG92ZXJ2aWV3IG1vZGUgbGlua3MgKFMsIE0sIEwgdmlldyksIHBhZ2luYXRpb24gbGlua3Mgd2l0aCBBSkFYCiAgICAgICAgICAgICQoJyNDdXN0b21lclRpY2tldHMnKS5maW5kKCcuT3ZlcnZpZXdab29tIGEsIC5QYWdpbmF0aW9uIGEsIC5UYWJsZVNtYWxsIHRoIGEnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBDdXQgb3V0IEJhc2VVUkwgYW5kIHF1ZXJ5IHN0cmluZyBmcm9tIHRoZSBVUkwKICAgICAgICAgICAgICAgIHZhciBMaW5rID0gJCh0aGlzKS5hdHRyKCdocmVmJyksCiAgICAgICAgICAgICAgICAgICAgVVJMQ29tcG9uZW50czsKCiAgICAgICAgICAgICAgICBVUkxDb21wb25lbnRzID0gTGluay5zcGxpdCgnPycsIDIpOwoKICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMQ29tcG9uZW50c1swXSwgVVJMQ29tcG9uZW50c1sxXSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdyBjdXN0b21lciB0aWNrZXRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclRpY2tldHMnKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUaWNrZXRzSFRNTFN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2VDdXN0b21lclRpY2tldExpbmtzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIGEuU3BsaXRTZWxlY3Rpb24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb3JlLkFnZW50LlRpY2tldFNwbGl0Lk9wZW5TcGxpdFNlbGVjdGlvbigkKHRoaXMpLmF0dHIoJ2hyZWYnKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIC8vIEluaXQgYWNjb3JkaW9uIG9mIG92ZXJ2aWV3IGFydGljbGUgcHJldmlldwogICAgICAgICAgICBDb3JlLlVJLkFjY29yZGlvbi5Jbml0KCQoJy5QcmV2aWV3ID4gdWwnKSwgJ2xpIGgzIGEnLCAnLkhpZGRlbkJsb2NrJyk7CgogICAgICAgICAgICAvLyBFdmVudHMgZm9yIEN1c3RvbWVyIEhpc3RvcnkgdGFibGUgLSBBZ2VudFRpY2tldFBob25lLCBBZ2VudFRpY2tldEVtYWlsIGFuZCBBZ2VudFRpY2tldEN1c3RvbWVyIHNjcmVlbnMuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldFBob25lJyB8fAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnIHx8CiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDdXN0b21lcicgfHwKICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudENoYXRBcHBlbmQnCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEN1c3RvbWVySGlzdG9yeUV2ZW50cygpOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSwgZnVuY3Rpb24gKFJlc3BvbnNlKSB7CiAgICAgICAgICAgIC8vIHNob3cgY3VzdG9tZXIgdGlja2V0cwogICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVGlja2V0cycpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmh0bWwoUmVzcG9uc2UuQ3VzdG9tZXJUaWNrZXRzSFRNTFN0cmluZyk7CiAgICAgICAgICAgICAgICBSZXBsYWNlQ3VzdG9tZXJUaWNrZXRMaW5rcygpOwoKICAgICAgICAgICAgICAgIC8vIGNsaWNrIGV2ZW50IGZvciBvcGVuaW5nIHBvcHVwCiAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIGEuQXNQb3B1cCcpLm9mZignY2xpY2snKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzIGEuU3BsaXRTZWxlY3Rpb24nKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRTcGxpdC5PcGVuU3BsaXRTZWxlY3Rpb24oJCh0aGlzKS5hdHRyKCdocmVmJykpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgQ2hlY2tQaG9uZUN1c3RvbWVyQ291bnRMaW1pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluIEFnZW50VGlja2V0UGhvbmUsIHRoaXMgY2hlY2tzIGlmIG1vcmUgdGhhbiBvbmUgZW50cnkgaXMgYWxsb3dlZAogICAgICogICAgICBpbiB0aGUgY3VzdG9tZXIgbGlzdCBhbmQgYmxvY2tzL3VuYmxvY2tzIHRoZSBhdXRvY29tcGxldGUgZmllbGQgYXMgbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0KCkgewoKICAgICAgICAvLyBPbmx5IG9wZXJhdGUgaW4gQWdlbnRUaWNrZXRQaG9uZQogICAgICAgIGlmIChDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRQaG9uZScpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgaWYgbXVsdGlwbGUgZnJvbSBlbnRyaWVzIGFyZSBhbGxvd2VkCiAgICAgICAgaWYgKHBhcnNlSW50KENvcmUuQ29uZmlnLkdldCgnQ3VzdG9tZXJTZWFyY2gnKS5BbGxvd011bHRpcGxlRnJvbSwgMTApKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGlmICgkKCcjVGlja2V0Q3VzdG9tZXJDb250ZW50RnJvbUN1c3RvbWVyIGlucHV0LkN1c3RvbWVyVGlja2V0VGV4dCcpLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgJCgnI0Zyb21DdXN0b21lcicpLnZhbCgnJykucHJvcCgnZGlzYWJsZWQnLCB0cnVlKS5wcm9wKCdyZWFkb25seScsIHRydWUpOwogICAgICAgICAgICAkKCcjRGVzdCcpLnRyaWdnZXIoJ2ZvY3VzJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkKCcjRnJvbUN1c3RvbWVyJykudmFsKCcnKS5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKS5wcm9wKCdyZWFkb25seScsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgSW5pdFNpbXBsZQogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBtb2R1bGUuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXRTaW1wbGUgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgQ3VzdG9tZXJTZWFyY2hUeXBlID0gJEVsZW1lbnQuZGF0YSgnY3VzdG9tZXItc2VhcmNoLXR5cGUnKTsKCiAgICAgICAgaWYgKEN1c3RvbWVyU2VhcmNoVHlwZSkgewogICAgICAgICAgICBDb3JlLlVJLkF1dG9jb21wbGV0ZS5Jbml0KCRFbGVtZW50LCBmdW5jdGlvbiAoUmVxdWVzdCwgUmVzcG9uc2UpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLCBEYXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb246ICdBZ2VudEN1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgU3ViYWN0aW9uOiAnU2VhcmNoJyArIEN1c3RvbWVyU2VhcmNoVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLlVJLkF1dG9jb21wbGV0ZS5HZXRDb25maWcoJ01heFJlc3VsdHNEaXNwbGF5ZWQnKQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmRhdGEoJ0F1dG9Db21wbGV0ZVhIUicsIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBWYWx1ZURhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQucmVtb3ZlRGF0YSgnQXV0b0NvbXBsZXRlWEhSJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdGhpcy5MYWJlbCArIChDdXN0b21lclNlYXJjaFR5cGUgPT0gJ0N1c3RvbWVyVXNlcicgPyAnICgnICsgdGhpcy5WYWx1ZSArICcpJyA6ICcnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5WYWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZShWYWx1ZURhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKFVJLml0ZW0udmFsdWUpLnRyaWdnZXIoJ3NlbGVjdC5BdXRvY29tcGxldGUnKTsKCiAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9LCAnQ3VzdG9tZXJTZWFyY2gnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgSW5pdAogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IC0gVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlLgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIEluaXRpYWxpemVzIHRoZSBtb2R1bGUuCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMgZm9yIEFnZW50VGlja2V0Q3VzdG9tZXIKICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Q3VzdG9tZXInKSB7CiAgICAgICAgICAgIEdldEN1c3RvbWVyVGlja2V0cygkKCcjQ3VzdG9tZXJBdXRvQ29tcGxldGUnKS52YWwoKSwgJCgnI0N1c3RvbWVySUQnKS52YWwoKSk7CgogICAgICAgICAgICAkRWxlbWVudC5ibHVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICgkRWxlbWVudC52YWwoKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5SZXNldEN1c3RvbWVySW5mbygpOwogICAgICAgICAgICAgICAgICAgIERlYWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CiAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0cycpLmVtcHR5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gRW5hYmxlIGZyZWUgc2VsZWN0aW9uIG9yIGlucHV0IG9mIEN1c3RvbWVySUQgZmllbGQgb24gQWdlbnRUaWNrZXRQcm9jZXNzIGFuZCBBZ2VudFRpY2tldEN1c3RvbWVyLgogICAgICAgIGlmICgoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UHJvY2VzcycKICAgICAgICAgICAgJiYgIUNvcmUuQ29uZmlnLkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcm9jZXNzOjpDdXN0b21lcklEUmVhZE9ubHknKSkKICAgICAgICAgICAgfHwKICAgICAgICAgICAgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJwogICAgICAgICAgICAmJiAhQ29yZS5Db25maWcuR2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEN1c3RvbWVyOjpDdXN0b21lcklEUmVhZE9ubHknKSkKLy8gUm90aGVyT1NTIC8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRBcHBvaW50bWVudENhbGVuZGFyT3ZlcnZpZXcnCi8vIEVPIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICQoJyNDdXN0b21lckF1dG9Db21wbGV0ZScpLm9uKCdibHVyIGtleXVwJyAsIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgaWYoJCgnI0N1c3RvbWVyQXV0b0NvbXBsZXRlJykudmFsKCkpIHsKICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIERlYWN0aXZhdGVTZWxlY3Rpb25DdXN0b21lcklEKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMgZm9yIEFnZW50VGlja2V0UGhvbmUgYW5kIEFnZW50VGlja2V0RW1haWwKICAgICAgICBpZiAoKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJyB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRQaG9uZScpICYmICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgpICE9PSAnJykgewogICAgICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCkpOwogICAgICAgIH0KCiAgICAgICAgLy8ganVzdCBzYXZlIHRoZSBpbml0aWFsIHN0YXRlIG9mIHRoZSBjdXN0b21lciBpbmZvCiAgICAgICAgaWYgKCQoJyNDdXN0b21lckluZm8nKS5sZW5ndGgpIHsKICAgICAgICAgICAgQmFja3VwRGF0YS5DdXN0b21lckluZm8gPSAkKCcjQ3VzdG9tZXJJbmZvIC5Db250ZW50JykuaHRtbCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICAvLyBIaWRlIHRvb2x0aXAgaW4gYXV0b2NvbXBsZXRlIGZpZWxkLCBpZiB1c2VyIGFscmVhZHkgdHlwZWQgc29tZXRoaW5nIHRvIHByZXZlbnQgdGhlIGF1dG9jb21wbGV0ZSBsaXN0CiAgICAgICAgICAgIC8vIHRvIGJlIGhpZGRlbiB1bmRlciB0aGUgdG9vbHRpcC4gKE9ubHkgbmVlZGVkIGZvciBzZXJ2ZXJzaWRlIGVycm9ycykKICAgICAgICAgICAgJEVsZW1lbnQub2ZmKCdrZXl1cC5WYWxpZGF0ZScpLm9uKCdrZXl1cC5WYWxpZGF0ZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgdmFyIFZhbHVlID0gJEVsZW1lbnQudmFsKCk7CiAgICAgICAgICAgICAgIGlmICgkRWxlbWVudC5oYXNDbGFzcygnU2VydmVyRXJyb3InKSAmJiBWYWx1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICQoJyNPVE9CT19VSV9Ub29sdGlwc19FcnJvclRvb2x0aXAnKS5oaWRlKCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBDb3JlLkFwcC5TdWJzY3JpYmUoJ0V2ZW50LkN1c3RvbWVyVXNlckFkZHJlc3NCb29rLkFkZFRpY2tldEN1c3RvbWVyLkNhbGxiYWNrLicgKyAkRWxlbWVudC5hdHRyKCdpZCcpLCBmdW5jdGlvbihVc2VyTG9naW4sIEN1c3RvbWVyVGlja2V0VGV4dCkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKEN1c3RvbWVyVGlja2V0VGV4dCk7CiAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lcigkRWxlbWVudC5hdHRyKCdpZCcpLCBDdXN0b21lclRpY2tldFRleHQsIFVzZXJMb2dpbik7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgQ29yZS5VSS5BdXRvY29tcGxldGUuSW5pdCgkRWxlbWVudCwgZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpLAogICAgICAgICAgICAgICAgICAgIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICAgICAgICAgICAgICBUZXJtOiBSZXF1ZXN0LnRlcm0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1heFJlc3VsdHM6IENvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnTWF4UmVzdWx0c0Rpc3BsYXllZCcpCiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKCdBdXRvQ29tcGxldGVYSFInLCBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBWYWx1ZURhdGEgPSBbXTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5yZW1vdmVEYXRhKCdBdXRvQ29tcGxldGVYSFInKTsKICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlRGF0YS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLkxhYmVsICsgIiAoIiArIHRoaXMuVmFsdWUgKyAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b21lciBsaXN0IHJlcHJlc2VudGF0aW9uIChzZWUgQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyBmcm9tIERlZmF1bHRzLnBtKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuTGFiZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXN0b21lciB1c2VyIGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk6IHRoaXMuVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoVmFsdWVEYXRhKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSwgZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgdmFyIEN1c3RvbWVyS2V5ID0gVUkuaXRlbS5rZXksCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJWYWx1ZSA9IFVJLml0ZW0udmFsdWU7CgogICAgICAgICAgICAgICAgQmFja3VwRGF0YS5DdXN0b21lcktleSA9IEN1c3RvbWVyS2V5OwogICAgICAgICAgICAgICAgQmFja3VwRGF0YS5DdXN0b21lckVtYWlsID0gQ3VzdG9tZXJWYWx1ZTsKCiAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoQ3VzdG9tZXJWYWx1ZSk7CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3JwovLyBFTyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldFBob25lJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwovLyBSb3RoZXJPU1MgLyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50QXBwb2ludG1lbnRDYWxlbmRhck92ZXJ2aWV3JwovLyBFbyBBcHBvaW50bWVudFRvVGlja2V0CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRDdXN0b21lclVzZXIKICAgICAgICAgICAgICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgICAgICBBY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gbmVlZGVkIGZvciBBZ2VudFRpY2tldEN1c3RvbWVyLnBtCiAgICAgICAgICAgICAgICAgICAgaWYgKCQoJyNDdXN0b21lclVzZXJJRCcpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VySUQnKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCgnI0N1c3RvbWVyVXNlck9wdGlvbicpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlck9wdGlvbicpLnZhbChDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJDdXN0b21lclVzZXJPcHRpb24iIGlkPSJDdXN0b21lclVzZXJPcHRpb24iPicpLnZhbChDdXN0b21lcktleSkuYXBwZW5kVG8oJEVsZW1lbnQuY2xvc2VzdCgnZm9ybScpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICAgICAgICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZQogICAgICAgICAgICAgICAgICAgIEdldEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5BZGRUaWNrZXRDdXN0b21lcigkKEV2ZW50LnRhcmdldCkuYXR0cignaWQnKSwgQ3VzdG9tZXJWYWx1ZSwgQ3VzdG9tZXJLZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCAnQ3VzdG9tZXJTZWFyY2gnKTsKCiAgICAgICAgICAgIC8vIFJlbWVtYmVyIGlmIGF1dG9jb21wbGV0ZSBpdGVtIHdhcyBmb2N1c2VkIChieSBrZXlib2FyZCBuYXZpZ2F0aW9uIG9yIG1vdXNlKS4KICAgICAgICAgICAgJEVsZW1lbnQub24oJ2F1dG9jb21wbGV0ZWZvY3VzJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICBBdXRvY29tcGxldGVGb2N1cyA9IHRydWU7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKHR5cGVvZiAkRWxlbWVudC5kYXRhKCJ1aS1hdXRvY29tcGxldGUiKSA9PT0gJ29iamVjdCcpIHsKCiAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciBpZiB0aGUgYXV0b2NvbXBsZXRlIHdpZGdldCBpcyBsZWZ0IGJ5IG1vdXNlLgogICAgICAgICAgICAgICAgJCgkRWxlbWVudC5kYXRhKCJ1aS1hdXRvY29tcGxldGUiKS5tZW51LmVsZW1lbnQpLm9uKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGlmIHRoZSBhdXRvY29tcGxldGUgd2lkZ2V0IGlzIGxlZnQgYnkga2V5Ym9hcmQgbmF2aWdhdGlvbi4KICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgZG9uZSBieSBvdmVycmlkZSB0aGUgX21vdmUgbWV0aG9kIGJlY2F1c2UgdGhlcmUgaXMgbm8gb3Bwb3NpdGUgZXZlbnQgb2YgYXV0b2NvbXBsZXRlZm9jdXMuCiAgICAgICAgICAgICAgICAkRWxlbWVudC5kYXRhKCJ1aS1hdXRvY29tcGxldGUiKS5fbW92ZSA9IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZXZlbnQpIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm1lbnUuZWxlbWVudC5pcygiOnZpc2libGUiKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaChudWxsLCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lbnUuaXNGaXJzdEl0ZW0oKSAmJiAvXnByZXZpb3VzLy50ZXN0KGRpcmVjdGlvbikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51LmlzTGFzdEl0ZW0oKSAmJiAvXm5leHQvLnRlc3QoZGlyZWN0aW9uKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSh0aGlzLnRlcm0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBtb3VzZWxlYXZlIGZvciByZW1vdmluZyBzZWxlY3Rpb24gb2YgYXV0b2NvbXBsZXRlIHdpZGdldC4KICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzLm1lbnUuZWxlbWVudCkudHJpZ2dlcignbW91c2VsZWF2ZScpOwoKICAgICAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZW51WyBkaXJlY3Rpb24gXShldmVudCk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiBhdXRvY29tcGxldGUgd2FzIGZvY3VzZWQsIGJ1dCB0aGVuIGNsb3NlZCBieSBhIGJsdXIsIGNsZWFyIHRoZSBzZWFyY2ggZmllbGQgc2luY2UgdGhpcyB2YWx1ZSB3YXMKICAgICAgICAgICAgLy8gICBuZXZlciBleHBsaWNpdGx5IGNvbmZpcm1lZC4gRG8gdGhpcyBhbHNvIHdoZW4gdXNlciBkZWNpZGVzIHRvIGNsaWNrIG91dHNpZGUgdGhlIGF1dG9jb21wbGV0ZSBsaXN0LAogICAgICAgICAgICAvLyAgIHdoaWNoIGNhdXNlcyB0aGUgbGlzdCB0byBjbG9zZS4gUGxlYXNlIHNlZSBidWcjMTM1MzcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICRFbGVtZW50Lm9uKCdhdXRvY29tcGxldGVjbG9zZScsIGZ1bmN0aW9uKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMKICAgICAgICAgICAgICAgICAgICAmJiAoCiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50Lm9yaWdpbmFsRXZlbnQgPT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudC5vcmlnaW5hbEV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBFdmVudC5vcmlnaW5hbEV2ZW50LnR5cGUgPT0gJ2JsdXInCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbCgnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgQXV0b2NvbXBsZXRlRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRQaG9uZScKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0Q29tcG9zZScKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEZvcndhcmQnCiAgICAgICAgICAgICAgICAmJiBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpICE9PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICAgICAgJiYgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSAhPT0gJ0FnZW50VGlja2V0RW1haWxSZXNlbmQnCi8vIFJvdGhlck9TUyAvIEFwcG9pbnRtZW50VG9UaWNrZXQKICAgICAgICAgICAgICAgICYmIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudEFwcG9pbnRtZW50Q2FsZW5kYXJPdmVydmlldycKLy8gRU8gQXBwb2ludG1lbnRUb1RpY2tldAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC5ibHVyKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgRmllbGRWYWx1ZSA9ICQodGhpcykudmFsKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKEZpZWxkVmFsdWUgIT09IEJhY2t1cERhdGEuQ3VzdG9tZXJFbWFpbCAmJiBGaWVsZFZhbHVlICE9PSBCYWNrdXBEYXRhLkN1c3RvbWVyS2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNTZWxlY3RlZEN1c3RvbWVyVXNlcicpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJJRCcpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNDdXN0b21lclVzZXJPcHRpb24nKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICAkKCcjU2hvd0N1c3RvbWVySUQnKS5odG1sKCcnKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3RvcmUgY3VzdG9tZXIgaW5mbyB0YWJsZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgIT09ICdBZ2VudFRpY2tldEN1c3RvbWVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVySW5mbyAuQ29udGVudCcpLmh0bWwoQmFja3VwRGF0YS5DdXN0b21lckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVySUQnKS52YWwoJycpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0UHJvY2VzcycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBzZXJ2aWNlcyAodHJpZ2dlciBTZXJ2aWNlSUQgY2hhbmdlIGV2ZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI0N1c3RvbWVySUQnKS5jbG9zZXN0KCdmb3JtJyksICdBSkFYVXBkYXRlJywgJ1NlcnZpY2VJRCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplcyB0aGUgY3VzdG9tZXIgZmllbGQuCiAgICAgICAgICAgICAgICBUYXJnZXROUy5Jbml0Q3VzdG9tZXJGaWVsZCgkRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9uIHVubG9hZCByZW1vdmUgb2xkIHNlbGVjdGVkIGRhdGEuIElmIHRoZSBwYWdlIGlzIHJlbG9hZGVkICh3aXRoIEY1KSB0aGlzIGRhdGEKICAgICAgICAvLyBzdGF5cyBpbiB0aGUgZmllbGQgYW5kIGludm9rZXMgYW4gYWpheCByZXF1ZXN0IG90aGVyd2lzZS4gV2UgbmVlZCB0byB1c2UgYmVmb3JldW5sb2FkCiAgICAgICAgLy8gaGVyZSBpbnN0ZWFkIG9mIHVubG9hZCBiZWNhdXNlIHRoZSBVUkwgb2YgdGhlIHdpbmRvdyBkb2VzIG5vdCBjaGFuZ2Ugb24gcmVsb2FkIHdoaWNoCiAgICAgICAgLy8gZG9lc24ndCB0cmlnZ2VyIHBhZ2VoaWRlLgogICAgICAgICQod2luZG93KS5vbignYmVmb3JldW5sb2FkLkN1c3RvbWVyU2VhcmNoJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoJycpOwogICAgICAgICAgICByZXR1cm47IC8vIHJldHVybiBub3RoaW5nIHRvIHN1cHByZXNzIHRoZSBjb25maXJtYXRpb24gbWVzc2FnZQogICAgICAgIH0pOwoKICAgICAgICBDaGVja1Bob25lQ3VzdG9tZXJDb3VudExpbWl0KCk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGh0bWxEZWNvZGUoVGV4dCl7CiAgICAgICAgcmV0dXJuIFRleHQucmVwbGFjZSgvJmFtcDsvZywgJyYnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBuYW1lIEFkZFRpY2tldEN1c3RvbWVyCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJucyB7Qm9vbGVhbn0gUmV0dXJucyBmYWxzZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBGaWVsZAogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyVmFsdWUgLSBUaGUgcmVhZGFibGUgY3VzdG9tZXIgaWRlbnRpZmllci4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBDdXN0b21lcktleSAtIEN1c3RvbWVyIGtleSBvbiBzeXN0ZW0uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gU2V0QXNUaWNrZXRDdXN0b21lciAtICBTZXQgdGhpcyBjdXN0b21lciBhcyBtYWluIHRpY2tldCBjdXN0b21lci4KICAgICAqIEBkZXNjcmlwdGlvbgogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGFkZHMgYSBuZXcgdGlja2V0IGN1c3RvbWVyCiAgICAgKi8KICAgIFRhcmdldE5TLkFkZFRpY2tldEN1c3RvbWVyID0gZnVuY3Rpb24gKEZpZWxkLCBDdXN0b21lclZhbHVlLCBDdXN0b21lcktleSwgU2V0QXNUaWNrZXRDdXN0b21lcikgewoKICAgICAgICB2YXIgJENsb25lID0gJCgnLkN1c3RvbWVyVGlja2V0VGVtcGxhdGUnICsgRmllbGQpLmNsb25lKCksCiAgICAgICAgICAgIEN1c3RvbWVyVGlja2V0Q291bnRlciA9ICQoJyNDdXN0b21lclRpY2tldENvdW50ZXInICsgRmllbGQpLnZhbCgpLAogICAgICAgICAgICBUaWNrZXRDdXN0b21lcklEcyA9IDAsCiAgICAgICAgICAgIElzRHVwbGljYXRlZCA9IGZhbHNlLAogICAgICAgICAgICBJc0ZvY3VzZWQgPSAoJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KS5hdHRyKCdpZCcpID09IEZpZWxkKSwKICAgICAgICAgICAgU3VmZml4OwoKICAgICAgICBpZiAodHlwZW9mIEN1c3RvbWVyS2V5ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBDdXN0b21lcktleSA9IGh0bWxEZWNvZGUoQ3VzdG9tZXJLZXkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKEN1c3RvbWVyVmFsdWUgPT09ICcnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHZhciBDdXJyZW50UXVvdGF0aW9uLAogICAgICAgICAgICBNdWx0aUVudHJ5ID0gWycnXSwKICAgICAgICAgICAgU2VlbkF0ICAgICA9IDAsCiAgICAgICAgICAgIG4gICAgICAgICAgPSAwOwoKICAgICAgICAvLyBkbyBhIG1hbnVhbCBzcGxpdCB0aGF0IGtlZXBzIHRyYWNrIG9mIHF1b3RhdGlvbgogICAgICAgIGZvciAoIHZhciBpID0gMDsgaSA8IEN1c3RvbWVyVmFsdWUubGVuZ3RoOyBpKysgKSB7CiAgICAgICAgICAgIHZhciBDaGFyID0gQ3VzdG9tZXJWYWx1ZS5jaGFyQXQoaSk7CgogICAgICAgICAgICBpZiAoIEN1cnJlbnRRdW90YXRpb24gKSB7CiAgICAgICAgICAgICAgICBNdWx0aUVudHJ5W25dICs9IENoYXI7CiAgICAgICAgICAgICAgICBpZiAoIENoYXIgPT09IEN1cnJlbnRRdW90YXRpb24gKSB7CiAgICAgICAgICAgICAgICAgICAgQ3VycmVudFF1b3RhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggQ2hhciA9PT0gJyInIHx8IENoYXIgPT09ICInIiApIHsKICAgICAgICAgICAgICAgIE11bHRpRW50cnlbbl0gICAgKz0gQ2hhcjsKICAgICAgICAgICAgICAgIEN1cnJlbnRRdW90YXRpb24gID0gQ2hhcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggU2VlbkF0ID09PSAxICYmICggQ2hhciA9PT0gJywnIHx8IENoYXIgPT09ICI7IiApICkgewogICAgICAgICAgICAgICAgbisrOwogICAgICAgICAgICAgICAgU2VlbkF0ICAgICAgICA9IDA7CiAgICAgICAgICAgICAgICBNdWx0aUVudHJ5W25dID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIENoYXIgPT09ICdAJyApIHsKICAgICAgICAgICAgICAgICAgICBTZWVuQXQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgTXVsdGlFbnRyeVtuXSArPSBDaGFyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIG4gPiAwICkgewogICAgICAgICAgICBmb3IgKCB2YXIgbSA9IDA7IG0gPD0gbjsgbSsrICkgewogICAgICAgICAgICAgICAgVGFyZ2V0TlMuQWRkVGlja2V0Q3VzdG9tZXIoIEZpZWxkLCBNdWx0aUVudHJ5W21dLnRyaW0oKSApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIC8vIGNoZWNrIGZvciBkdXBsaWNhdGVkIGVudHJpZXMKICAgICAgICAkKCdbY2xhc3MqPUN1c3RvbWVyVGlja2V0VGV4dF0nKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSA9PT0gQ3VzdG9tZXJWYWx1ZSkgewogICAgICAgICAgICAgICAgSXNEdXBsaWNhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGlmIChJc0R1cGxpY2F0ZWQpIHsKICAgICAgICAgICAgVGFyZ2V0TlMuU2hvd0R1cGxpY2F0ZWREaWFsb2coRmllbGQpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvLyBnZXQgbnVtYmVyIG9mIGhvdyBtdWNoIGN1c3RvbWVyIHRpY2tldCBhcmUgcHJlc2VudAogICAgICAgIFRpY2tldEN1c3RvbWVySURzID0gJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl0nKS5sZW5ndGg7CgogICAgICAgIC8vIGluY3JlbWVudCBjdXN0b21lciBjb3VudGVyCiAgICAgICAgQ3VzdG9tZXJUaWNrZXRDb3VudGVyKys7CgogICAgICAgIC8vIHNldCBzdWZpeAogICAgICAgIFN1ZmZpeCA9ICdfJyArIEN1c3RvbWVyVGlja2V0Q291bnRlcjsKCiAgICAgICAgLy8gcmVtb3ZlIHVubmVjZXNzYXJ5IGNsYXNzZXMKICAgICAgICAkQ2xvbmUucmVtb3ZlQ2xhc3MoJ0hpZGRlbiBDdXN0b21lclRpY2tldFRlbXBsYXRlJyArIEZpZWxkKTsKCiAgICAgICAgLy8gY29weSB2YWx1ZXMgYW5kIGNoYW5nZSBpZHMgYW5kIG5hbWVzCiAgICAgICAgJENsb25lLmZpbmQoJzppbnB1dCwgYScpLmVhY2goZnVuY3Rpb24oKXsKICAgICAgICAgICAgdmFyIElEID0gJCh0aGlzKS5hdHRyKCdpZCcpOwogICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2lkJywgSUQgKyBTdWZmaXgpOwogICAgICAgICAgICAkKHRoaXMpLnZhbChDdXN0b21lclZhbHVlKTsKICAgICAgICAgICAgaWYgKElEICE9PSAnQ3VzdG9tZXJTZWxlY3RlZCcpIHsKICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignbmFtZScsIElEICsgU3VmZml4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gYWRkIGV2ZW50IGhhbmRsZXIgdG8gcmFkaW8gYnV0dG9uCiAgICAgICAgICAgIGlmKCQodGhpcykuaGFzQ2xhc3MoJ0N1c3RvbWVyVGlja2V0UmFkaW8nKSkgewoKICAgICAgICAgICAgICAgIGlmIChUaWNrZXRDdXN0b21lcklEcyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICQodGhpcykucHJvcCgnY2hlY2tlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIHNldCBjb3VudGVyIGFzIHZhbHVlCiAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbChDdXN0b21lclRpY2tldENvdW50ZXIpOwoKICAgICAgICAgICAgICAgIC8vIGJpbmQgY2hhbmdlIGZ1bmN0aW9uIHRvIHJhZGlvIGJ1dHRvbiB0byBzZWxlY3QgY3VzdG9tZXIKICAgICAgICAgICAgICAgICQodGhpcykub24oJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcm93CiAgICAgICAgICAgICAgICAgICAgaWYgKCQodGhpcykucHJvcCgnY2hlY2tlZCcpKXsKICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0TlMuUmVsb2FkQ3VzdG9tZXJJbmZvKEN1c3RvbWVyS2V5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNldCBjdXN0b21lciBrZXkgaWYgcHJlc2VudAogICAgICAgICAgICBpZigkKHRoaXMpLmhhc0NsYXNzKCdDdXN0b21lcktleScpKSB7CiAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbChDdXN0b21lcktleSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGFkZCBldmVudCBoYW5kbGVyIHRvIHJlbW92ZSBidXR0b24KICAgICAgICAgICAgaWYoJCh0aGlzKS5oYXNDbGFzcygnUmVtb3ZlQnV0dG9uJykpIHsKCiAgICAgICAgICAgICAgICAvLyBiaW5kIGNsaWNrIGZ1bmN0aW9uIHRvIHJlbW92ZSBidXR0b24KICAgICAgICAgICAgICAgICQodGhpcykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSByb3cKICAgICAgICAgICAgICAgICAgICBUYXJnZXROUy5SZW1vdmVDdXN0b21lclRpY2tldCgkKHRoaXMpKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgQ3VzdG9tZXJIaXN0b3J5IHRhYmxlIGlmIHRoZXJlIGFyZSBubyBzZWxlY3RlZCBjdXN0b21lciB1c2VycwogICAgICAgICAgICAgICAgICAgIGlmICgkKCcjVGlja2V0Q3VzdG9tZXJDb250ZW50JyArIEZpZWxkICsgJyAuQ3VzdG9tZXJUaWNrZXRSYWRpbycpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAkKCcjQ3VzdG9tZXJUaWNrZXRzJykuZW1wdHkoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBzZXQgYnV0dG9uIHZhbHVlCiAgICAgICAgICAgICAgICAkKHRoaXMpLnZhbChDdXN0b21lclZhbHVlKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoJCh0aGlzKS5oYXNDbGFzcygnTW92ZUN1c3RvbWVyQnV0dG9uJykpIHsKICAgICAgICAgICAgICAgICQodGhpcykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciBNb3ZlQ3VzdG9tZXJLZXkgPSAkKCcuQ3VzdG9tZXJLZXknLCAkKHRoaXMpLnBhcmVudCgpKS52YWwoKSwKICAgICAgICAgICAgICAgICAgICAgICAgTW92ZUN1c3RvbWVyVmFsID0gJCgnLkN1c3RvbWVyVGlja2V0VGV4dCcsICQodGhpcykucGFyZW50KCkpLnZhbCgpLAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGaWVsZCAgICAgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5oYXNDbGFzcygnVG9Nb3ZlJykgID8gJ1RvQ3VzdG9tZXInICA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmhhc0NsYXNzKCdDY01vdmUnKSAgPyAnQ2NDdXN0b21lcicgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGFzQ2xhc3MoJ0JjY01vdmUnKSA/ICdCY2NDdXN0b21lcicgOiAnJzsKCiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBjdXJyZW50IGVudHJ5CiAgICAgICAgICAgICAgICAgICAgJCgnLlJlbW92ZUJ1dHRvbicsICQodGhpcykucGFyZW50KCkpLmNsaWNrKCk7CgogICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY3VzdG9tZXIgdG8gdGhlIHRhcmdldCBmaWVsZAogICAgICAgICAgICAgICAgICAgIFRhcmdldE5TLkFkZFRpY2tldEN1c3RvbWVyKFRhcmdldEZpZWxkLCBNb3ZlQ3VzdG9tZXJWYWwsIE1vdmVDdXN0b21lcktleSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIC8vIHNob3cgY29udGFpbmVyCiAgICAgICAgJCgnI1RpY2tldEN1c3RvbWVyQ29udGVudCcgKyBGaWVsZCkucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ0hpZGRlbicpOwogICAgICAgIC8vIGFwcGVuZCB0byBjb250YWluZXIKICAgICAgICAkKCcjVGlja2V0Q3VzdG9tZXJDb250ZW50JyArIEZpZWxkKS5hcHBlbmQoJENsb25lKTsKCiAgICAgICAgLy8gc2V0IG5ldyB2YWx1ZSBmb3IgQ3VzdG9tZXJUaWNrZXRDb3VudGVyCiAgICAgICAgJCgnI0N1c3RvbWVyVGlja2V0Q291bnRlcicgKyBGaWVsZCkudmFsKEN1c3RvbWVyVGlja2V0Q291bnRlcik7CiAgICAgICAgaWYgKChDdXN0b21lcktleSAhPT0gJycgJiYgVGlja2V0Q3VzdG9tZXJJRHMgPT09IDAgJiYgKEZpZWxkID09PSAnVG9DdXN0b21lcicgfHwgRmllbGQgPT09ICdGcm9tQ3VzdG9tZXInKSkgfHwgU2V0QXNUaWNrZXRDdXN0b21lcikgewogICAgICAgICAgICBpZiAoU2V0QXNUaWNrZXRDdXN0b21lcikgewogICAgICAgICAgICAgICAgJCgnI0N1c3RvbWVyU2VsZWN0ZWRfJyArIEN1c3RvbWVyVGlja2V0Q291bnRlcikucHJvcCgnY2hlY2tlZCcsIHRydWUpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl06Zmlyc3QnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFJldHVybiB0aGUgdmFsdWUgdG8gdGhlIHNlYXJjaCBmaWVsZC4KICAgICAgICAkKCcjJyArIEZpZWxkKS52YWwoJycpOwoKICAgICAgICAvLyBSZS1mb2N1cyB0aGUgZmllbGQsIGJ1dCBvbmx5IGlmIGl0IHdhcyBwcmV2aW91c2x5IGZvY3VzZWQuCiAgICAgICAgaWYgKElzRm9jdXNlZCkgewogICAgICAgICAgICAkKCcjJyArIEZpZWxkKS5mb2N1cygpOwogICAgICAgIH0KCiAgICAgICAgQ2hlY2tQaG9uZUN1c3RvbWVyQ291bnRMaW1pdCgpOwoKICAgICAgICAvLyBSZWxvYWQgQ3J5cHQgb3B0aW9ucyBvbiBzcGVjaWZpYyBzY3JlZW5zLgogICAgICAgIGlmICgKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWwnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0Rm9yd2FyZCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsT3V0Ym91bmQnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKICAgICAgICAgICAgKQogICAgICAgICAgICAmJiAkKCcjQ3J5cHRLZXlJRCcpLmxlbmd0aAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjJyArIEZpZWxkKS5jbG9zZXN0KCdmb3JtJyksICdBSkFYVXBkYXRlJyk7CiAgICAgICAgfQoKICAgICAgICAvLyBub3cgdGhhdCB3ZSBrbm93IHRoYXQgYXQgbGVhc3Qgb25lIGN1c3RvbWVyIGhhcyBiZWVuIGFkZGVkLAogICAgICAgIC8vIHdlIGNhbiByZW1vdmUgZXZlbnR1YWwgZXJyb3JzIGZyb20gdGhlIGN1c3RvbWVyIGZpZWxkCiAgICAgICAgJCgnI0Zyb21DdXN0b21lciwgI1RvQ3VzdG9tZXInKQogICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ0Vycm9yIFNlcnZlckVycm9yJykKICAgICAgICAgICAgLmNsb3Nlc3QoJy5GaWVsZCcpCiAgICAgICAgICAgIC5wcmV2KCdsYWJlbCcpCiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnTGFiZWxFcnJvcicpOwogICAgICAgIENvcmUuRm9ybS5FcnJvclRvb2x0aXBzLkhpZGVUb29sdGlwKCk7CgogICAgICAgIEFjdGl2YXRlU2VsZWN0aW9uQ3VzdG9tZXJJRCgpOwoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8qKgogICAgICogQG5hbWUgUmVtb3ZlQ3VzdG9tZXJUaWNrZXQKICAgICAqIEBtZW1iZXJvZiBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSBPYmplY3QgLSBKUXVlcnkgb2JqZWN0IHVzZWQgYXMgYmFzZSB0byBkZWxldGUgaXQncyBwYXJlbnQuCiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIGEgY3VzdG9tZXIgdGlja2V0IGVudHJ5LgogICAgICovCiAgICBUYXJnZXROUy5SZW1vdmVDdXN0b21lclRpY2tldCA9IGZ1bmN0aW9uIChPYmplY3QpIHsKICAgICAgICB2YXIgVGlja2V0Q3VzdG9tZXJJRHMsCiAgICAgICAgJEZpZWxkID0gT2JqZWN0LmNsb3Nlc3QoJy5GaWVsZCcpLAogICAgICAgICRGb3JtOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgIENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRDb21wb3NlJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbE91dGJvdW5kJwogICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbFJlc2VuZCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEZvcm0gPSBPYmplY3QuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIH0KICAgICAgICBPYmplY3QucGFyZW50KCkucmVtb3ZlKCk7CiAgICAgICAgVGlja2V0Q3VzdG9tZXJJRHMgPSAkKCcuQ3VzdG9tZXJDb250YWluZXIgaW5wdXRbdHlwZT0icmFkaW8iXScpLmxlbmd0aDsKICAgICAgICBpZiAoVGlja2V0Q3VzdG9tZXJJRHMgPT09IDApIHsKICAgICAgICAgICAgVGFyZ2V0TlMuUmVzZXRDdXN0b21lckluZm8oKTsKICAgICAgICB9CgogICAgICAgIC8vIFJlbG9hZCBDcnlwdCBvcHRpb25zIG9uIHNwZWNpZmljIHNjcmVlbnMuCiAgICAgICAgaWYgKAogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRFbWFpbCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldENvbXBvc2UnCiAgICAgICAgICAgICAgICB8fCBDb3JlLkNvbmZpZy5HZXQoJ0FjdGlvbicpID09PSAnQWdlbnRUaWNrZXRGb3J3YXJkJwogICAgICAgICAgICAgICAgfHwgQ29yZS5Db25maWcuR2V0KCdBY3Rpb24nKSA9PT0gJ0FnZW50VGlja2V0RW1haWxPdXRib3VuZCcKICAgICAgICAgICAgICAgIHx8IENvcmUuQ29uZmlnLkdldCgnQWN0aW9uJykgPT09ICdBZ2VudFRpY2tldEVtYWlsUmVzZW5kJwogICAgICAgICAgICApCiAgICAgICAgICAgICYmICQoJyNDcnlwdEtleUlEJykubGVuZ3RoCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCRGb3JtLCAnQUpBWFVwZGF0ZScpOwogICAgICAgIH0KCiAgICAgICAgaWYoISQoJy5DdXN0b21lckNvbnRhaW5lciBpbnB1dFt0eXBlPSJyYWRpbyJdJykuaXMoJzpjaGVja2VkJykpewogICAgICAgICAgICAvL3NldCB0aGUgZmlyc3Qgb25lIGFzIGNoZWNrZWQKICAgICAgICAgICAgJCgnLkN1c3RvbWVyQ29udGFpbmVyIGlucHV0W3R5cGU9InJhZGlvIl06Zmlyc3QnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJEZpZWxkLmZpbmQoJy5DdXN0b21lclRpY2tldFRleHQ6dmlzaWJsZScpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAkRmllbGQuYWRkQ2xhc3MoJ0hpZGRlbicpOwoKICAgICAgICAgICAgRGVhY3RpdmF0ZVNlbGVjdGlvbkN1c3RvbWVySUQoKTsKICAgICAgICB9CgogICAgICAgIENoZWNrUGhvbmVDdXN0b21lckNvdW50TGltaXQoKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBAbmFtZSBSZXNldEN1c3RvbWVySW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gY2xlYXJzIGFsbCBzZWxlY3RlZCBjdXN0b21lciBpbmZvLgogICAgICovCiAgICBUYXJnZXROUy5SZXNldEN1c3RvbWVySW5mbyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgJCgnI1NlbGVjdGVkQ3VzdG9tZXJVc2VyJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVyVXNlcklEJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI0N1c3RvbWVySUQnKS52YWwoJycpOwogICAgICAgICAgICAkKCcjQ3VzdG9tZXJVc2VyT3B0aW9uJykudmFsKCcnKTsKICAgICAgICAgICAgJCgnI1Nob3dDdXN0b21lcklEJykuaHRtbCgnJyk7CgogICAgICAgICAgICAvLyByZXNldCBjdXN0b21lciBpbmZvIHRhYmxlCiAgICAgICAgICAgICQoJyNDdXN0b21lckluZm8gLkNvbnRlbnQnKS5odG1sKENvcmUuTGFuZ3VhZ2UuVHJhbnNsYXRlKCdub25lJykpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFJlbG9hZEN1c3RvbWVySW5mbwogICAgICogQG1lbWJlcm9mIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2gKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtTdHJpbmd9IEN1c3RvbWVyS2V5CiAgICAgKiBAZGVzY3JpcHRpb24KICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiByZWxvYWRzIGluZm8gZm9yIHNlbGVjdGVkIGN1c3RvbWVyLgogICAgICovCiAgICBUYXJnZXROUy5SZWxvYWRDdXN0b21lckluZm8gPSBmdW5jdGlvbiAoQ3VzdG9tZXJLZXkpIHsKCiAgICAgICAgLy8gZ2V0IGN1c3RvbWVyIHRpY2tldHMKICAgICAgICBHZXRDdXN0b21lclRpY2tldHMoQ3VzdG9tZXJLZXkpOwoKICAgICAgICAvLyBnZXQgY3VzdG9tZXIgZGF0YSBmb3IgY3VzdG9tZXIgaW5mbyB0YWJsZQogICAgICAgIEdldEN1c3RvbWVySW5mbyhDdXN0b21lcktleSk7CgogICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRDdXN0b21lclVzZXIKICAgICAgICAkKCcjU2VsZWN0ZWRDdXN0b21lclVzZXInKS52YWwoQ3VzdG9tZXJLZXkpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIEluaXRDdXN0b21lckZpZWxkCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gJEVsZW1lbnQgLSBKUXVlcnkgb2JqZWN0LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIGN1c3RvbWVyIGZpZWxkcy4KICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdEN1c3RvbWVyRmllbGQgPSBmdW5jdGlvbiAoJEVsZW1lbnQpIHsKICAgICAgICB2YXIgT2JqZWN0SWQgPSAkRWxlbWVudC5hdHRyKCdpZCcpOwoKICAgICAgICAkKCcjJyArIE9iamVjdElkKS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgaWYgKCEkKCcjJyArIE9iamVjdElkKS52YWwoKSB8fCAkKCcjJyArIE9iamVjdElkKS52YWwoKSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gaWYgYXV0b2NvbXBsZXRpb24gaXMgZGlzYWJsZWQgYW5kIG9ubHkgYXZhaWJsZSB2aWEgdGhlIGNsaWNrCiAgICAgICAgICAgIC8vIG9mIGEgYnV0dG9uIG5leHQgdG8gdGhlIGlucHV0IGZpZWxkLCB3ZSBjYW5ub3QgaGFuZGxlIHRoaXMKICAgICAgICAgICAgLy8gY2hhbmdlIGV2ZW50IHRoZSBub3JtYWwgd2F5LgogICAgICAgICAgICBpZiAoIUNvcmUuVUkuQXV0b2NvbXBsZXRlLkdldENvbmZpZygnQWN0aXZlQXV0b0NvbXBsZXRlJykpIHsKICAgICAgICAgICAgICAgIC8vIHdlIHdhaXQgc29tZSB0aW1lIGFmdGVyIHRoaXMgZXZlbnQgdG8gY2hlY2ssIGlmIHRoZSBzZWFyY2ggYnV0dG9uCiAgICAgICAgICAgICAgICAvLyBmb3IgdGhpcyBmaWVsZCB3YXMgcHJlc3NlZC4gSWYgc28sIG5vIGFjdGlvbiBpcyBuZWVkZWQKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjaGFuZ2UgZXZlbnQgd2FzIGZpcmVkIHdpdGhvdXQgY2xpY2tpbmcgdGhlIHNlYXJjaCBidXR0b24sCiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSB0aGUgdXNlciBjbGlja2VkIG91dCBvZiB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBhbHNvIGFkZCB0aGUgY3VzdG9tZXIgKHRoZSBlbmV0ZXJlZCB2YWx1ZSkgdG8gdGhlIGxpc3QKCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF0gPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJGaWVsZENoYW5nZVJ1bkNvdW50W09iamVjdElkXSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKENvcmUuVUkuQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvbkNsaWNrZWRbT2JqZWN0SWRdKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIEN1c3RvbWVyRmllbGRDaGFuZ2VSdW5Db3VudFtPYmplY3RJZF07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIENvcmUuVUkuQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvbkNsaWNrZWRbT2JqZWN0SWRdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyMnICsgT2JqZWN0SWQpLnRyaWdnZXIoJ2NoYW5nZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBDdXN0b21lckZpZWxkQ2hhbmdlUnVuQ291bnRbT2JqZWN0SWRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgoKICAgICAgICAgICAgLy8gSWYgdGhlIGF1dG9jb21wbGV0ZSBwb3B1cCB3aW5kb3cgaXMgdmlzaWJsZSwgZGVsYXkgdGhpcyBjaGFuZ2UgZXZlbnQuCiAgICAgICAgICAgIC8vIEl0IG1pZ2h0IGJlIGNhdXNlZCBieSBjbGlja2luZyB3aXRoIHRoZSBtb3VzZSBpbnRvIHRoZSBhdXRvY29tcGxldGUgbGlzdC4KICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBpdCBpcyBjbG9zZWQgdG8gYmUgc3VyZSB0aGF0IHdlIGRvbid0IGFkZCBhIGN1c3RvbWVyIHR3aWNlLgoKICAgICAgICAgICAgaWYgKCRFbGVtZW50LmF1dG9jb21wbGV0ZSgid2lkZ2V0IikuaXMoJzp2aXNpYmxlJykpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7CiAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBPYmplY3RJZCkudHJpZ2dlcignY2hhbmdlJyk7CiAgICAgICAgICAgICAgICB9LCAyMDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBDb3JlLkFnZW50LkN1c3RvbWVyU2VhcmNoLkFkZFRpY2tldEN1c3RvbWVyKE9iamVjdElkLCAkKCcjJyArIE9iamVjdElkKS52YWwoKSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9KTsKCiAgICAgICAgJCgnIycgKyBPYmplY3RJZCkub24oJ2tleXByZXNzJywgZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IDEzKXsKICAgICAgICAgICAgICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2guQWRkVGlja2V0Q3VzdG9tZXIoT2JqZWN0SWQsICQoJyMnICsgT2JqZWN0SWQpLnZhbCgpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfTsKCiAgICAvKioKICAgICAqIEBuYW1lIFNob3dEdXBsaWNhdGVkRGlhbG9nCiAgICAgKiBAbWVtYmVyb2YgQ29yZS5BZ2VudC5DdXN0b21lclNlYXJjaAogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gRmllbGQgLSBJRCBvYmplY3Qgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIHJlY2VpdmUgdGhlIGZvY3VzIG9uIGNsb3NlIGV2ZW50LgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gc2hvd3MgYW4gYWxlcnQgZGlhbG9nIGZvciBkdXBsaWNhdGVkIGVudHJpZXMuCiAgICAgKi8KICAgIFRhcmdldE5TLlNob3dEdXBsaWNhdGVkRGlhbG9nID0gZnVuY3Rpb24oRmllbGQpewogICAgICAgIENvcmUuVUkuRGlhbG9nLlNob3dBbGVydCgKICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0R1cGxpY2F0ZWQgZW50cnknKSwKICAgICAgICAgICAgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ1RoaXMgYWRkcmVzcyBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgYWRkcmVzcyBsaXN0LicpICsgJyAnICsgQ29yZS5MYW5ndWFnZS5UcmFuc2xhdGUoJ0l0IGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQgZnJvbSB0aGUgZmllbGQsIHBsZWFzZSB0cnkgYWdhaW4uJyksCiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIENvcmUuVUkuRGlhbG9nLkNsb3NlRGlhbG9nKCQoJy5BbGVydCcpKTsKICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGQpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkKS5mb2N1cygpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgKTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ3VzdG9tZXJTZWFyY2ggfHwge30pKTsK</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>