<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>ITSMConfigItemMultitenancy</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-10-28 10:33:27" Version="11.1.1">Initial release for OTOBO 11.1.</ChangeLog>
    <Description Lang="en">The OTOBO ITSM CMDB Package enhanced with group permissions at config item level.</Description>
    <Framework>11.1.x</Framework>
    <IntroInstall Lang="en" Title="Convert legacy reference fields" Type="post">

        &lt;br/&gt;
        If you are using Elasticsearch, please execute the console command &quot;bin/otobo.Console.pl Maint::Elasticsearch::Migration --target i&quot;&lt;br/&gt;

    </IntroInstall>
    <PackageRequired Version="11.1.0">ITSMConfigurationManagement</PackageRequired>
    <BuildCommitID>d76576f4f261a19b187420bef7741c4ae7df516d</BuildCommitID>
    <BuildDate>2026-10-28 10:33:31</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/GenericInterface/Operation/ConfigItem/ConfigItemUpsert.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvR2VuZXJpY0ludGVyZmFjZS9PcGVyYXRpb24vQ29uZmlnSXRlbS9Db25maWdJdGVtVXBzZXJ0LnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1VcHNlcnQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCnVzZSBwYXJlbnQgcXcoS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OkNvbmZpZ0l0ZW06OkNvbW1vbik7CgojIGNvcmUgbW9kdWxlcwp1c2UgTGlzdDo6VXRpbCAgIHF3KHBhaXJzKTsKdXNlIFNjYWxhcjo6VXRpbCBxdyhyZWZ0eXBlKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uOjpDb25maWdJdGVtOjpDb25maWdJdGVtVXBzZXJ0IC0gR2VuZXJpY0ludGVyZmFjZSBDb25maWd1cmF0aW9uIEl0ZW0gQWRkIGFuZCBVcGRhdGUgT3BlcmF0aW9uIGJhY2tlbmQKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCnVzdWFsbHksIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzCmJ5IHVzaW5nIEtlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6T3BlcmF0aW9uLT5uZXcoKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkIChxdyggT3BlcmF0aW9uIERlYnVnZ2VyT2JqZWN0IFdlYnNlcnZpY2VJRCApKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgU3VjY2VzcyAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9OwogICAgfQoKICAgICRTZWxmLT57T3BlcmF0aW9uTmFtZX0gPSAnQ29uZmlnSXRlbVVwc2VydCc7CgogICAgJFNlbGYtPntDb25maWd9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCJHZW5lcmljSW50ZXJmYWNlOjpPcGVyYXRpb246OiRTZWxmLT57T3BlcmF0aW9uTmFtZX0iKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBSdW4oKQoKcGVyZm9ybSBDb25maWdJdGVtVXBzZXJ0IE9wZXJhdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyBhYmxlIHRvIGFjY2VwdApvbmUgb3IgbW9yZSBDb25maWdJdGVtIGVudHJpZXMgaW4gb25lIGNhbGwuCgogICAgbXkgJFJlc3VsdCA9ICRPcGVyYXRpb25PYmplY3QtPlJ1bigKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgVXNlckxvZ2luICA9PiAnc29tZSBhZ2VudCBsb2dpbicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXNlckxvZ2luIG9yIFNlc3Npb25JRCBpcwogICAgICAgICAgICBTZXNzaW9uSUQgID0+IDEyMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgIHJlcXVpcmVkCiAgICAgICAgICAgIFBhc3N3b3JkICAgPT4gJ3NvbWUgcGFzc3dvcmQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIFVzZXJMb2dpbiBpcyBzZW50IHRoZW4gUGFzc3dvcmQgaXMgcmVxdWlyZWQKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBbICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgcmVxdWlyZWQKICAgICAgICAgICAgICAgIHsgLi4uIH0sCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgXQogICAgICAgIH0sCiAgICApOwoKICAgICRSZXN1bHQgPSB7CiAgICAgICAgU3VjY2VzcyAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDAgb3IgMQogICAgICAgIEVycm9yTWVzc2FnZSA9PiAnJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJbiBjYXNlIG9mIGFuIGVycm9yCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTnVtYmVyICAgICAgICAgICAgID0+ICcyMDEwMTAyNzAwMDAwMScsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgID0+IDEyMywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIyAuIC4gLgogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXSwKICAgICAgICB9LAogICAgfTsKCj1jdXQKCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPkluaXQoCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICk7CgogICAgaWYgKCAhJFJlc3VsdC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICdXZWJzZXJ2aWNlLkludmFsaWRDb25maWd1cmF0aW9uJywKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICRSZXN1bHQtPntFcnJvck1lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgKCRVc2VySUQpID0gJFNlbGYtPkF1dGgoCiAgICAgICAgJVBhcmFtCiAgICApOwoKICAgIGlmICggISRVc2VySUQgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkF1dGhGYWlsIiwKICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBBdXRob3JpemF0aW9uIGZhaWxpbmchIiwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoQ29uZmlnSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17RGF0YX0tPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5NaXNzaW5nUGFyYW1ldGVyIiwKICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogJE5lZWRlZCBwYXJhbWV0ZXIgaXMgbWlzc2luZyEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIG9wdGlvbmFsIGFycmF5L2hhc2hlcwogICAgZm9yIG15ICRPcHRpb25hbCAocXcoRHluYW1pY0ZpZWxkIEF0dGFjaG1lbnQpKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtEYXRhfS0+eyRPcHRpb25hbH0KICAgICAgICAgICAgJiYgIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17RGF0YX0tPnskT3B0aW9uYWx9ICkKICAgICAgICAgICAgJiYgIUlzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0RhdGF9LT57JE9wdGlvbmFsfSApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uTWlzc2luZ1BhcmFtZXRlciIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06ICRPcHRpb25hbCBwYXJhbWV0ZXIgaXMgbWlzc2luZyBvciBub3QgdmFsaWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJEdyb3VwT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICBteSAkSXRlbUdyb3VwTW9kZTsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgICMgdHJhbnNmb3JtIHNpbmdsZSBDSXMgdG8gYW4gYXJyYXkgcmVmZXJlbmNlCiAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtEYXRhfXtDb25maWdJdGVtfSApICkgewogICAgICAgICRQYXJhbXtEYXRhfXtDb25maWdJdGVtfSA9IFsgJFBhcmFte0RhdGF9e0NvbmZpZ0l0ZW19IF07CiAgICB9CgogICAgZm9yIG15ICRSZW1vdGVDSURhdGEgKCBAeyAkUGFyYW17RGF0YX17Q29uZmlnSXRlbX0gfSApIHsKICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVtb3RlQ0lEYXRhKSApIHsKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgIEVycm9yQ29kZSAgICA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfS5Xcm9uZ1N0cnVjdHVyZSIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFN0cnVjdHVyZSBmb3IgQ29uZmlnSXRlbSBpcyBub3QgY29ycmVjdCEiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgQFJlcXVpcmVkQXR0cmlidXRlcyA9IHF3KENsYXNzIERlcGxveW1lbnRTdGF0ZSBJbmNpZGVudFN0YXRlKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICBteSAkQ2xhc3NQcmVmZXJlbmNlcyA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgTmFtZSAgPT4gJFJlbW90ZUNJRGF0YS0+e0NsYXNzfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRDbGFzc1ByZWZlcmVuY2VzLT57Q29uZmlnSXRlbUdyb3VwfSAmJiByZWYgJENsYXNzUHJlZmVyZW5jZXMtPntDb25maWdJdGVtR3JvdXB9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICRJdGVtR3JvdXBNb2RlID0gJENsYXNzUHJlZmVyZW5jZXMtPntDb25maWdJdGVtR3JvdXB9WzBdOwogICAgICAgICAgICBpZiAoICRJdGVtR3JvdXBNb2RlID09IDIgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBSZXF1aXJlZEF0dHJpYnV0ZXMsICJHcm91cCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkSXRlbUdyb3VwTW9kZSA9PSAwICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSXRlbUdyb3VwSXNEaXNhYmxlZCIsCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBObyBncm91cCBzaG91bGQgYmUgYXNzaWduZWQgYmVjYXVzZSBpdGVtIGdyb3VwIHBlcm1pc3Npb25zIGFyZSBkaXNhYmxlZCBmb3IgdGhlIGNsYXNzISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgZm9yIG15ICROZWVkZWQgKCBzb3J0IEBSZXF1aXJlZEF0dHJpYnV0ZXMgKSB7CgogICAgICAgICAgICBpZiAoICFJc1N0cmluZ1dpdGhEYXRhKCAkUmVtb3RlQ0lEYXRhLT57JE5lZWRlZH0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9Lk1pc3NpbmdQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogTmVlZCAkTmVlZGVkIGZvciBldmVyeSBDb25maWdJdGVtISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHdlYnNlcnZpY2UgY29uZmlndXJhdGlvbgogICAgbXkgJFdlYnNlcnZpY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpLT5XZWJzZXJ2aWNlR2V0KAogICAgICAgIElEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICk7CgogICAgIyBnZXQgb3BlcmF0aW9uIGNvbmZpZwogICAgbXkgJE9wZXJhdGlvbkNvbmZpZyA9ICRXZWJzZXJ2aWNlLT57Q29uZmlnfS0+e1Byb3ZpZGVyfS0+e09wZXJhdGlvbn0tPnsgJFNlbGYtPntPcGVyYXRpb259IH07CgogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgbXkgJUNJQ2xhc3NNYXBwaW5nID0gKAogICAgICAgIEluY2lkZW50U3RhdGUgICA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgRGVwbG95bWVudFN0YXRlID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIENsYXNzICAgICAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICAjIGJ1aWxkIGR5bmFtaWMgZmllbGQgcmVmZXJlbmNlIGFuZCBsZW5zIGxvb2t1cAogICAgbXkgJURGUmVmTG9va3VwOwogICAgbXkgJURGTGVuc0xvb2t1cDsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZExpc3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiBbJ0lUU01Db25maWdJdGVtJ10sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKSB8fCBbXTsKCiAgICBERkNPTkZJRzoKICAgIGZvciBteSAkREZDb25maWcgKCAkRHluYW1pY0ZpZWxkTGlzdC0+QCogKSB7CgogICAgICAgIG5leHQgREZDT05GSUcgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRERkNvbmZpZyk7CgogICAgICAgIGlmICggJERGQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnTGVucycgKSB7CiAgICAgICAgICAgICRERkxlbnNMb29rdXB7ICRERkNvbmZpZy0+e05hbWV9IH0gPSAkREZDb25maWc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRERkNvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNSZWZlcmVuY2VGaWVsZCcKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkREZSZWZMb29rdXB7ICRERkNvbmZpZy0+e05hbWV9IH0gPSAkREZDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgICMgc3RvcmUgZHluYW1pYyBmaWVsZCByZWZlcmVuY2UgYW5kIGxlbnMgdmFsdWVzIHRvIHNldCB0aGVtIGFmdGVyIGNvbmZpZyBpdGVtIGFkZCAvIHVwZGF0ZQogICAgbXkgJUFsbERGU2hpZnRlZFZhbHVlczsKCiAgICBteSAlR2VuZXJhbENhdGFsb2dJdGVtTG9va3VwOwogICAgbXkgQENJc0hhbmRsZWQ7CiAgICBDSToKICAgIGZvciBteSAkUmVtb3RlQ0lEYXRhICggQHsgJFBhcmFte0RhdGF9e0NvbmZpZ0l0ZW19IH0gKSB7CgogICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRSZW1vdGVDSURhdGEpICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIHJlbW90ZSBDSSBzdHJ1Y3R1cmUgZm91bmQuIFNraXBwaW5nIGl0ZW0uIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgQ0k7CiAgICAgICAgfQoKICAgICAgICBteSAlUmVxdWlyZWRBdHRyaWJ1dGVzID0gbWFwIHsgJF8gPT4gJFJlbW90ZUNJRGF0YS0+eyRffSB9IHF3KENsYXNzIERlcGxveW1lbnRTdGF0ZSBJbmNpZGVudFN0YXRlKTsKCiAgICAgICAgIyBnZXQgSURzIGZvciBDbGFzcywgRGVwbC0gYW5kIEluY2lTdGF0ZQogICAgICAgIGZvciBteSAkQ3VycmVudENJICggc29ydCBrZXlzICVDSUNsYXNzTWFwcGluZyApIHsKCiAgICAgICAgICAgICMgY3JlYXRlL2dldCBsb29rdXAgZm9yIGdlbmVyYWwgY2F0YWxvZyBpdGVtcwogICAgICAgICAgICBteSAkR2VuZXJhbENhdGFsb2dJdGVtOwogICAgICAgICAgICBpZiAoICRHZW5lcmFsQ2F0YWxvZ0l0ZW1Mb29rdXB7ICRDSUNsYXNzTWFwcGluZ3skQ3VycmVudENJfSB9LT57ICRSZXF1aXJlZEF0dHJpYnV0ZXN7JEN1cnJlbnRDSX0gfSApIHsKICAgICAgICAgICAgICAgICRHZW5lcmFsQ2F0YWxvZ0l0ZW0gPSAkR2VuZXJhbENhdGFsb2dJdGVtTG9va3VweyAkQ0lDbGFzc01hcHBpbmd7JEN1cnJlbnRDSX0gfS0+eyAkUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dJdGVtID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRDSUNsYXNzTWFwcGluZ3skQ3VycmVudENJfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhSXNIYXNoUmVmV2l0aERhdGEoJEdlbmVyYWxDYXRhbG9nSXRlbSkKICAgICAgICAgICAgICAgICAgICB8fCAhSXNTdHJpbmdXaXRoRGF0YSggJEdlbmVyYWxDYXRhbG9nSXRlbS0+e0l0ZW1JRH0gKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgbG9va2luZyB1cCAkQ3VycmVudENJICckUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9Jy4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdG8gbG9va3VwCiAgICAgICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dJdGVtTG9va3VweyAkQ0lDbGFzc01hcHBpbmd7JEN1cnJlbnRDSX0gfS0+eyAkUmVxdWlyZWRBdHRyaWJ1dGVzeyRDdXJyZW50Q0l9IH0gPSAkR2VuZXJhbENhdGFsb2dJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRSZXF1aXJlZEF0dHJpYnV0ZXN7ICRDdXJyZW50Q0kgLiAnSUQnIH0gPSAkR2VuZXJhbENhdGFsb2dJdGVtLT57SXRlbUlEfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxhdGVzdCBkZWZpbml0aW9uIGZvciB0aGUgY2xhc3MKICAgICAgICBteSAkQ2xhc3NJRCA9ICRSZW1vdGVDSURhdGEtPntDbGFzc0lEfTsKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlUmV2ZXJzZUNsYXNzTGlzdCA9IHJldmVyc2UgJENsYXNzTGlzdC0+JSo7CiAgICAgICAgICAgICRDbGFzc0lEID0gJFJldmVyc2VDbGFzc0xpc3R7ICRSZW1vdGVDSURhdGEtPntDbGFzc30gfTsKICAgICAgICB9CiAgICAgICAgbXkgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICAjIHZhbGlkYXRlIGR5bmFtaWMgZmllbGRzCiAgICAgICAgREFUQToKICAgICAgICBmb3IgbXkgJERhdGEgKCBwYWlycyAkUmVtb3RlQ0lEYXRhLT4lKiApIHsKICAgICAgICAgICAgbXkgKCAkS2V5LCAkVmFsdWUgKSA9ICREYXRhLT5AKjsKCiAgICAgICAgICAgIG5leHQgREFUQSB1bmxlc3MgKCAkS2V5ID1+IC9eRHluYW1pY0ZpZWxkXy8gKTsKCiAgICAgICAgICAgIGlmICggJEtleSA9fiAvXkR5bmFtaWNGaWVsZF8oPzxQbGFpbkZpZWxkTmFtZT5bQS1aYS16MC05LV0rKS8gKSB7CiAgICAgICAgICAgICAgICBteSAkUGxhaW5GaWVsZE5hbWUgPSAkK3tQbGFpbkZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBpcyBpbiBjbGFzcyBkZWZpbml0aW9uCiAgICAgICAgICAgICAgICBpZiAoICEkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn17JFBsYWluRmllbGROYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTWVzc2FnZSA9PiAiJFNlbGYtPntPcGVyYXRpb25OYW1lfTogRHluYW1pY0ZpZWxkICckUGxhaW5GaWVsZE5hbWUnIGlzIG5vdCBwYXJ0IG9mIHRoZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICJkZWZpbml0aW9uIG9mIGNsYXNzICckUmVtb3RlQ0lEYXRhLT57Q2xhc3N9JyAoQ29uZmlnSXRlbSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAoICRSZW1vdGVDSURhdGEtPntOYW1lfSAvLyAnJyApIC4gIicpISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdldCBkeW5hbWljIGZpZWxkIGNvbmZpZwogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskUGxhaW5GaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgICMgdmFsaWRhdGUgdmFsdWUKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAjIHBvc3NpYmxlIHN0cnVjdHVyZXMgYXJlIHN0cmluZyBhbmQgYXJyYXksIG5vIGRhdGEgaW5zaWRlIGlzIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIGlmICggIUlzU3RyaW5nKCRWYWx1ZSkgJiYgcmVmICRWYWx1ZSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBWYWx1ZSBvZiBEeW5hbWljRmllbGQgJyRQbGFpbkZpZWxkTmFtZScgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIm11c3QgYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXkgKENvbmZpZ0l0ZW0gJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICggJFJlbW90ZUNJRGF0YS0+e05hbWV9IC8vICcnICkgLiAiJykhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0ZVZhbHVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpLT5GaWVsZFZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbGlkYXRlVmFsdWUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+UmV0dXJuRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uSW52YWxpZFBhcmFtZXRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IFZhbHVlIG9mIER5bmFtaWNGaWVsZCAnJFBsYWluRmllbGROYW1lJyBpcyBpbnZhbGlkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIoQ29uZmlnSXRlbSAnIiAuICggJFJlbW90ZUNJRGF0YS0+e05hbWV9IC8vICcnICkgLiAiJykhIiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICMgZ2V0IElEIGZvciB0aGUgR3JvdXAKICAgICAgICAjIHVzZXJzIGZyb20gdGhlIGl0c20gbWFuYWdlbWVudCBncm91cCBjYW4gYXNzaWduIHRoZSBDSSB0byBhbnkgZ3JvdXAsIG90aGVycyBjYW4gYXNzaWduIG9ubHkgdG8gb25lIG9mIHRoZWlyIGdyb3VwcwogICAgICAgICMgYXR0ZW1wdGluZyB0byBhc3NpZ24gYSBub24gYXV0aG9yaXplZCBncm91cCByZXR1cm5zIHRoZSBzYW1lIHJlc3VsdCBhcyBhc3NpZ25pbmcgYSBub24gZXhpc3RpbmcgZ3JvdXAKICAgICAgICBpZiAoICRSZW1vdGVDSURhdGEtPntHcm91cH0gKSB7CiAgICAgICAgICAgIG15ICVBdXRoR3JvdXBzOwogICAgICAgICAgICBteSAkTWFuYWdlbWVudEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ29uZmlnSXRlbU1hbmFnZW1lbnRHcm91cCIpOwogICAgICAgICAgICBteSAlVXNlckdyb3Vwc0xpc3QgID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uVXNlckdyb3VwR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gInJ3IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkTWFuYWdlbWVudEdyb3VwICYmIGdyZXAgeyAkXyBlcSAkTWFuYWdlbWVudEdyb3VwIH0gdmFsdWVzICVVc2VyR3JvdXBzTGlzdCApIHsKICAgICAgICAgICAgICAgICVBdXRoR3JvdXBzID0gJEdyb3VwT2JqZWN0LT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAlQXV0aEdyb3VwcyA9ICVVc2VyR3JvdXBzTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlR3JvdXBzTWFwcGluZyA9IHJldmVyc2UgJUF1dGhHcm91cHM7CiAgICAgICAgICAgICRSZXF1aXJlZEF0dHJpYnV0ZXN7R3JvdXBJRH0gPSAkR3JvdXBzTWFwcGluZ3sgJFJlbW90ZUNJRGF0YS0+e0dyb3VwfSB9OwogICAgICAgICAgICBpZiAoICEkUmVxdWlyZWRBdHRyaWJ1dGVze0dyb3VwSUR9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5SZXR1cm5FcnJvcigKICAgICAgICAgICAgICAgICAgICBFcnJvckNvZGUgICAgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX0uQWNjZXNzRGVuaWVkIiwKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENhbiBub3Qgd3JpdGUgdW5hdXRob3JpemVkIGdyb3VwIHRvIGNvbmZpZ3VyYXRpb24gaXRlbSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgIG15ICRJZGVudGlmaWVyID0gJE9wZXJhdGlvbkNvbmZpZy0+eyAnSWRlbnRpZmllcicgLiAkUmVxdWlyZWRBdHRyaWJ1dGVze0NsYXNzSUR9IH07CiAgICAgICAgaWYgKCAhJElkZW50aWZpZXIgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm90IGltcG9ydGluZyBpdGVtcyBpbiBjbGFzcyAkUmVxdWlyZWRBdHRyaWJ1dGVze0NsYXNzfSAtIHNraXBwaW5nLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2ggQENJc0hhbmRsZWQsIHt9OwoKICAgICAgICAgICAgbmV4dCBDSTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgd2hldGhlciB0aGlzIGl0ZW0gZXhpc3RzICh1cGRhdGUpIG9yIGlzIG5ldyAoY3JlYXRlKQogICAgICAgIG15ICRDb25maWdJdGVtSUQ7CgogICAgICAgICMgcHJlcGFyZSBzZWFyY2gKICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAoCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgICAgIFF1ZXJ5Q29uZGl0aW9uID0+IDAsCiAgICAgICAgKTsKICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCAkSWRlbnRpZmllci0+QCogKSB7CgogICAgICAgICAgICAjIGlmIG51bWJlciBvciBjb25maWcgaXRlbSBpZCBhcmUgZGVmaW5lZCBhcyBpZGVudGlmaWVycywgdXNlIG9ubHkgdGhpcwogICAgICAgICAgICBpZiAoICRBdHRyaWJ1dGUgZXEgJ051bWJlcicgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRSZW1vdGVDSURhdGEtPntOdW1iZXJ9ICkgewogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbU51bWJlciA9PiAkUmVtb3RlQ0lEYXRhLT57TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxhc3QgQVRUUklCVVRFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnQ29uZmlnSXRlbUlEJyApIHsKICAgICAgICAgICAgICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRSZW1vdGVDSURhdGEtPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRDb25maWdJdGVtKSApIHsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUlEID0gJFJlbW90ZUNJRGF0YS0+e0NvbmZpZ0l0ZW1JRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUlEID0gJyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdCBBVFRSSUJVVEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdDbGFzc2VzJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbXtDbGFzc2VzfSA9IFsgJFJlbW90ZUNJRGF0YS0+e0NsYXNzfSBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEF0dHJpYnV0ZSBlcSAnTmFtZScgKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW17TmFtZX0gPSAkUmVtb3RlQ0lEYXRhLT57TmFtZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQXR0cmlidXRlIGVxICdEZXBsU3RhdGVzJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hQYXJhbXtEZXBsU3RhdGVzfSA9IFsgJFJlbW90ZUNJRGF0YS0+e0RlcGxveW1lbnRTdGF0ZX0gXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRBdHRyaWJ1dGUgPX4gL15EeW4vICkgewogICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFteyRBdHRyaWJ1dGV9ID0gewogICAgICAgICAgICAgICAgICAgIEVxdWFscyA9PiAkUmVtb3RlQ0lEYXRhLT57JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgdXNlICRBdHRyaWJ1dGUgYXMgSWRlbnRpZmllciAtIHNraXBwaW5nLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAQ0lzSGFuZGxlZCwge307CgogICAgICAgICAgICAgICAgbmV4dCBDSTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkQ29uZmlnSXRlbUlEICkgewoKICAgICAgICAgICAgIyBhdm9pZCBleGVjdXRpbmcgYSBzZWFyY2ggd2l0aCBlbXB0eSBzZWFyY2ggcGFyYW1zIChleGNsdWRpbmcgJ1Jlc3VsdCA9PiAiQVJSQVkiJyBmcm9tIG1lYW5pbmdmdWwgcGFyYW1zKQogICAgICAgICAgICBteSAkUGVyZm9ybVNlYXJjaCA9IDA7CiAgICAgICAgICAgIFNFQVJDSFBBUkFNS0VZOgogICAgICAgICAgICBmb3IgbXkgJFNlYXJjaFBhcmFtS2V5ICgga2V5cyAlU2VhcmNoUGFyYW0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRTZWFyY2hQYXJhbUtleSBuZSAnUmVzdWx0JyAmJiAkU2VhcmNoUGFyYW17JFNlYXJjaFBhcmFtS2V5fSApIHsKICAgICAgICAgICAgICAgICAgICAkUGVyZm9ybVNlYXJjaCA9IDE7CgogICAgICAgICAgICAgICAgICAgIGxhc3QgU0VBUkNIUEFSQU1LRVk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkUGVyZm9ybVNlYXJjaCkgewoKICAgICAgICAgICAgICAgIG15IEBDb25maWdJdGVtSURzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goJVNlYXJjaFBhcmFtKTsKCiAgICAgICAgICAgICAgICBpZiAoIHNjYWxhciBAQ29uZmlnSXRlbUlEcyA+IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtZXRlcnMgPSBqb2luKCAnOycsIG1hcCB7IiRfID0+ICRTZWFyY2hQYXJhbXskX30ifSBrZXlzICVTZWFyY2hQYXJhbSApOwoKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgdXNlIGFtYmlndW91cyBzZWFyY2ggcmVzdWx0IC0gc2tpcHBpbmcuIFBhcmFtZXRlcnM6ICRTZWFyY2hQYXJhbWV0ZXJzOyIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBDSXNIYW5kbGVkLCB7fTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBDSTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1JRHNbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICBteSAkUGVybWlzc2lvbjsKICAgICAgICBpZiAoJENvbmZpZ0l0ZW1JRCkgewogICAgICAgICAgICAkUGVybWlzc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGVybWlzc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkUmVxdWlyZWRBdHRyaWJ1dGVze0NsYXNzSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggISRQZXJtaXNzaW9uICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKAogICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkFjY2Vzc0RlbmllZCIsCiAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIiRTZWxmLT57T3BlcmF0aW9uTmFtZX06IENhbiBub3Qgd3JpdGUgY29uZmlndXJhdGlvbiBpdGVtISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkQ29uZmlnSXRlbUlEICYmICEkUmVtb3RlQ0lEYXRhLT57TmFtZX0gKSB7CiAgICAgICAgICAgIG15ICROb3RpY2VJbmZvID0gJFJlbW90ZUNJRGF0YS0+e051bWJlcn0gPyAiTnVtYmVyOiAkUmVtb3RlQ0lEYXRhLT57TnVtYmVyfTsiIDogJyc7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk1pc3NpbmcgJ05hbWUnIHBhcmFtZXRlciBmb3IgY3JlYXRpbmcgYSBDSS4gU2tpcHBpbmcgaXRlbS4gJE5vdGljZUluZm8iLAogICAgICAgICAgICApOwogICAgICAgICAgICBwdXNoIEBDSXNIYW5kbGVkLCB7fTsKCiAgICAgICAgICAgIG5leHQgQ0k7CiAgICAgICAgfQoKICAgICAgICBteSBAQXR0YWNobWVudExpc3Q7CiAgICAgICAgaWYgKCBkZWZpbmVkICRSZW1vdGVDSURhdGEtPntBdHRhY2htZW50fSApIHsKCiAgICAgICAgICAgICMgaXNvbGF0ZSBBdHRhY2htZW50IHBhcmFtZXRlcgogICAgICAgICAgICBteSAkQXR0YWNobWVudCA9ICRSZW1vdGVDSURhdGEtPntBdHRhY2htZW50fTsKCiAgICAgICAgICAgICMgaG9tb2dlbmF0ZSBpbnB1dCB0byBhcnJheQogICAgICAgICAgICBpZiAoIHJlZiAkQXR0YWNobWVudCBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50TGlzdCwgJEF0dGFjaG1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAQXR0YWNobWVudExpc3QgPSBAeyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBBdHRhY2htZW50IGludGVybmFsIHN0cnVjdHVyZQogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJdGVtIChAQXR0YWNobWVudExpc3QpIHsKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRBdHRhY2htZW50SXRlbSkgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2RlICAgID0+ICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9LkludmFsaWRQYXJhbWV0ZXIiLAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkU2VsZi0+e09wZXJhdGlvbk5hbWV9OiBDb25maWdJdGVtLT5BdHRhY2htZW50IHBhcmFtZXRlciBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMKICAgICAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICRBdHRhY2htZW50SXRlbS0+JSogKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhcmVmdHlwZSAkQXR0YWNobWVudEl0ZW0tPnskQXR0cmlidXRlfSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICNyZW1vdmUgbGVhZGluZyBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnRJdGVtLT57JEF0dHJpYnV0ZX0gPX4gc3tcQVxzK317fTsKCiAgICAgICAgICAgICAgICAgICAgICAgICNyZW1vdmUgdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICRBdHRhY2htZW50SXRlbS0+eyRBdHRyaWJ1dGV9ID1+IHN7XHMrXHp9e307CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgY2hlY2sgQXR0YWNobWVudCBhdHRyaWJ1dGUgdmFsdWVzCiAgICAgICAgICAgICAgICBteSAkQXR0YWNobWVudENoZWNrID0gJFNlbGYtPl9DaGVja0F0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgQXR0YWNobWVudCA9PiAkQXR0YWNobWVudEl0ZW0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggISRBdHRhY2htZW50Q2hlY2stPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPlJldHVybkVycm9yKCAleyRBdHRhY2htZW50Q2hlY2t9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hpZnQgZHluYW1pYyBmaWVsZCByZWZlcmVuY2UgYW5kIGxlbnMgdmFsdWVzIGZyb20gY29uZmlnaXRlbSBkYXRhIHRvIHNldCB0aGVtIGFmdGVyd2FyZHMKICAgICAgICBteSAlREZTaGlmdGVkVmFsdWVzOwogICAgICAgIERGTkFNRToKICAgICAgICBmb3IgbXkgJERGTmFtZSAoIGtleXMgJURGUmVmTG9va3VwLCBrZXlzICVERkxlbnNMb29rdXAgKSB7CgogICAgICAgICAgICBuZXh0IERGTkFNRSB1bmxlc3MgZGVmaW5lZCAkUmVtb3RlQ0lEYXRhLT57IkR5bmFtaWNGaWVsZF8kREZOYW1lIn07CgogICAgICAgICAgICAkREZTaGlmdGVkVmFsdWVzeyRERk5hbWV9ID0gZGVsZXRlICRSZW1vdGVDSURhdGEtPnsiRHluYW1pY0ZpZWxkXyRERk5hbWUifTsKICAgICAgICB9CgogICAgICAgIGlmICgkQ29uZmlnSXRlbUlEKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICAgICAgICAgICAgICAkUmVtb3RlQ0lEYXRhLT4lKiwKICAgICAgICAgICAgICAgICVSZXF1aXJlZEF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgRGVwbFN0YXRlSUQgICAgPT4gJFJlcXVpcmVkQXR0cmlidXRlc3tEZXBsb3ltZW50U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBJbmNpU3RhdGVJRCAgICA9PiAkUmVxdWlyZWRBdHRyaWJ1dGVze0luY2lkZW50U3RhdGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgRXh0ZXJuYWxTb3VyY2UgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FcnJvcigKICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4gIkVycm9yIHdoaWxlIHVwZGF0aW5nIENvbmZpZ0l0ZW1JRCAkQ29uZmlnSXRlbUlEISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29uZmlnSXRlbUlEID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BZGQoCiAgICAgICAgICAgICAgICAkUmVtb3RlQ0lEYXRhLT4lKiwKICAgICAgICAgICAgICAgICVSZXF1aXJlZEF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVJRCAgICA9PiAkUmVxdWlyZWRBdHRyaWJ1dGVze0RlcGxveW1lbnRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgID0+ICRSZXF1aXJlZEF0dHJpYnV0ZXN7SW5jaWRlbnRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW1JRCApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+RXJyb3IoCiAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSBjcmVhdGluZyBDSSB3aXRoIE5hbWUgJyRSZXF1aXJlZEF0dHJpYnV0ZXN7TmFtZX0nLCBDbGFzcyAnJFJlcXVpcmVkQXR0cmlidXRlc3tDbGFzc30nIChDbGFzc0lEOiAnJFJlcXVpcmVkQXR0cmlidXRlc3tDbGFzc0lEfScpLiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkQWxsREZTaGlmdGVkVmFsdWVzeyRDb25maWdJdGVtSUR9ID0gXCVERlNoaWZ0ZWRWYWx1ZXM7CgogICAgICAgICMgaGFuZGxlIGNvbmZpZyBpdGVtIGF0dGFjaG1lbnRzCiAgICAgICAgaWYgKEBBdHRhY2htZW50TGlzdCkgewoKICAgICAgICAgICAgbXkgQEV4aXN0aW5nQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBmb3IgbXkgJEZpbGVuYW1lIChARXhpc3RpbmdBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgbXkgJERlbGV0ZVN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT5FcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgZGVsZXRpbmcgZXhpc3RpbmcgYXR0YWNobWVudCB3aXRoIE5hbWUgJyRGaWxlbmFtZScgZm9yIENvbmZpZ0l0ZW0gSUQgJENvbmZpZ0l0ZW1JRC4iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRMaXN0KSB7CgogICAgICAgICAgICAgICAgIyBkZWxldGUgYWxsIGNvbmZpZyBpdGVtIGF0dGFjaG1lbnRzCgogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICAgICAgJEF0dGFjaG1lbnQtPiUqLAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPkVycm9yKAogICAgICAgICAgICAgICAgICAgICAgICBFcnJvck1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciB3aGlsZSBhZGRpbmcgYXR0YWNobWVudCB3aXRoIE5hbWUgJyRBdHRhY2htZW50LT57RmlsZW5hbWV9JyBmb3IgQ29uZmlnSXRlbSBJRCAkQ29uZmlnSXRlbUlELiIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBAQ0lzSGFuZGxlZCwgewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRSZW1vdGVDSURhdGEtPntOYW1lfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2V0IGR5bmFtaWMgZmllbGQgcmVmZXJlbmNlIGFuZCBsZW5zIHZhbHVlcyBhZnRlciBhZGRpbmcgLyB1cGRhdGluZyBhbGwgY29uZmlnIGl0ZW1zCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENJREZQYWlyICggcGFpcnMgJUFsbERGU2hpZnRlZFZhbHVlcyApIHsKCiAgICAgICAgbXkgKCAkQ29uZmlnSXRlbUlELCAkREZWYWx1ZXMgKSA9ICRDSURGUGFpci0+QCo7CgogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkREZWYWx1ZXMpOwoKICAgICAgICAjIGdldCBjb25maWcgaXRlbSBkYXRhIGZvciB2ZXJzaW9uIGlkCiAgICAgICAgbXkgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgKTsKCiAgICAgICAgIyBmaXJzdCwgc2V0IGR5bmFtaWMgZmllbGQgcmVmZXJlbmNlIHZhbHVlcwogICAgICAgIERGUkVGOgogICAgICAgIGZvciBteSAkREZSZWZOYW1lICgga2V5cyAlREZSZWZMb29rdXAgKSB7CgogICAgICAgICAgICBuZXh0IERGUkVGIHVubGVzcyBleGlzdHMgJERGVmFsdWVzLT57JERGUmVmTmFtZX07CgogICAgICAgICAgICBteSAkU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkREZSZWZMb29rdXB7JERGUmVmTmFtZX0sCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRERlZhbHVlcy0+eyRERlJlZk5hbWV9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBFeHRlcm5hbFNvdXJjZSAgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2Vjb25kLCBzZXQgZHluYW1pYyBmaWVsZCBsZW5zIHZhbHVlcwogICAgICAgIERGTEVOUzoKICAgICAgICBmb3IgbXkgJERGTGVuc05hbWUgKCBrZXlzICVERkxlbnNMb29rdXAgKSB7CgogICAgICAgICAgICBuZXh0IERGTEVOUyB1bmxlc3MgZXhpc3RzICRERlZhbHVlcy0+eyRERkxlbnNOYW1lfTsKCiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICRERkxlbnNMb29rdXB7JERGTGVuc05hbWV9LAogICAgICAgICAgICAgICAgT2JqZWN0SUQgICAgICAgICAgID0+ICRDb25maWdJdGVtLT57VmVyc2lvbklEfSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkREZWYWx1ZXMtPnskREZMZW5zTmFtZX0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgIEV4dGVybmFsU291cmNlICAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIFN1Y2Nlc3MgPT4gMSwKICAgICAgICBEYXRhICAgID0+IHsgQ29uZmlnSXRlbSA9PiBcQENJc0hhbmRsZWQgfSwKICAgIH07Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/Modules/AgentITSMConfigItemEdit.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtRWRpdC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQ7Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICByZXR1cm4gYmxlc3MgeyVQYXJhbX0sICRUeXBlOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBteSBwYXJhbSBvYmplY3QKICAgIG15ICRQYXJhbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKCiAgICAjIGdldCBjb25maWdpdGVtIGlkIGFuZCBjbGFzcyBpZAogICAgbXkgJENvbmZpZ0l0ZW0gID0ge307CiAgICBteSAkRHVwbGljYXRlSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRHVwbGljYXRlSUQnICkgfHwgMDsKICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb25maWdJdGVtSUQnICkgfHwgMDsKICAgICRDb25maWdJdGVtLT57Q2xhc3NJRH0gICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDbGFzc0lEJyApICAgICAgfHwgMDsKCiAgICBteSAkSGFzQWNjZXNzOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBteSAkR3JvdXBPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBnZXQgY29uZmlnIG9mIGZyb250ZW5kIG1vZHVsZQogICAgJFNlbGYtPntDb25maWd9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgICMgZ2V0IG5lZWRlZCBkYXRhCiAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSAmJiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICMgY2hlY2sgYWNjZXNzIGZvciBjb25maWcgaXRlbQogICAgICAgICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtCiAgICAgICAgJENvbmZpZ0l0ZW0gPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCREdXBsaWNhdGVJRCkgewoKICAgICAgICBteSAkVmVyc2lvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKCiAgICAgICAgIyBUT0RPOiBDaGVjayBkdXBsaWNhdGlvbgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIHRvIGR1cGxpY2F0ZQogICAgICAgICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJER1cGxpY2F0ZUlELAogICAgICAgICAgICBWZXJzaW9uSUQgICAgID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGFjY2VzcyBmb3IgY29uZmlnIGl0ZW0KICAgICAgICAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICApOwoKICAgICAgICAjIHNldCBjb25maWcgaXRlbSBpZCBhbmQgbnVtYmVyCiAgICAgICAgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ID0gJ05FVyc7CiAgICAgICAgJENvbmZpZ0l0ZW0tPntOdW1iZXJ9ICAgICAgID0gVHJhbnNsYXRhYmxlKCdOZXcnKTsKICAgIH0KICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSApIHsKCiAgICAgICAgIyBzZXQgY29uZmlnIGl0ZW0gaWQgYW5kIG51bWJlcgogICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICdORVcnOwogICAgICAgICRDb25maWdJdGVtLT57TnVtYmVyfSAgICAgICA9IFRyYW5zbGF0YWJsZSgnTmV3Jyk7CgogICAgICAgICMgY2hlY2sgYWNjZXNzIGZvciBjb25maWcgaXRlbQogICAgICAgICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICApOwogICAgICAgICRDb25maWdJdGVtLT57Q2xhc3N9ID0gJENsYXNzTGlzdC0+eyAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9IH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBDb25maWdJdGVtSUQsIER1cGxpY2F0ZUlEIG9yIENsYXNzSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdXNlciBoYXMgbm8gYWNjZXNzIHJpZ2h0cyBzaG93IGVycm9yIHBhZ2UKICAgIGlmICggISRIYXNBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gYWNjZXNzIGlzIGdpdmVuIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEVkaXQgdGhlIGNvbmZpZyBpdGVtIHdpdGggdGhlIG5ld2VzdCBjb25maWcgaXRlbSBkZWZpbml0aW9uIG9mIHRoZSByZWxldmFudCBjbGFzcwogICAgbXkgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgaWYgKCAhJERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnLCAkQ29uZmlnSXRlbS0+e0NsYXNzfSApLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBmb3JtIGlkCiAgICBteSAkRm9ybUNhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6Rm9ybUNhY2hlJyk7CgogICAgJFNlbGYtPntGb3JtSUR9ID0gJEZvcm1DYWNoZU9iamVjdC0+UHJlcGFyZUZvcm1JRCgKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgKTsKCiAgICBteSAlR2V0UGFyYW07CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsdWVzOwogICAgbXkgJUFDTFJlZHVjaWJsZUR5bmFtaWNGaWVsZHM7CiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdDsKCiAgICAjIGdldCBpbml0aWFsIHZhbHVlcyBmb3IgdGhlIGNvbmZpZ2l0ZW0KICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKICAgICAgICAkRHluYW1pY0ZpZWxkTGlzdCA9ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfSA/IFsgdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogXSA6IFtdOwoKICAgICAgICBpZiAoICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBlcSAnTkVXJyApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1OYW1lOwoKICAgICAgICAgICAgaWYgKCREdXBsaWNhdGVJRCkgewoKICAgICAgICAgICAgICAgICMgZ2V0IERhdGEgZnJvbSBkdXBsaWNhdGUgQ0kKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW19ID0gJENvbmZpZ0l0ZW0tPnskUGFyYW19OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRDb25maWdJdGVtTmFtZSA9ICRHZXRQYXJhbXtOYW1lfSAuICcgKENvcHkpJzsKCiAgICAgICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoICREeW5hbWljRmllbGRMaXN0LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWYWx1ZXN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICAgICAgICAgICAgICMgcGVyZm9ybSBBQ0xzIG9uIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQUNMUmVkdWNpYmxlRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT4lKiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFte0NvbmZpZ0l0ZW1JRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgICAjIGdldCBnZW5lcmFsIGZvcm0gZGF0YQojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQojICAgICAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoTmFtZSBWZXJzaW9uU3RyaW5nIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIERlc2NyaXB0aW9uKSkgewogICAgICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAgICAgJEdldFBhcmFteyRQYXJhbX0gPSAkQ29uZmlnSXRlbS0+eyRQYXJhbX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCAkRHluYW1pY0ZpZWxkTGlzdC0+QCogKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgICAgICAgICAjIHBlcmZvcm0gQUNMcyBvbiB2YWx1ZXMKICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJwogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgJEFDTFJlZHVjaWJsZUR5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBlbHNlIHsKICAgICAgICBteSAkQWN0aXZlRmllbGRzID0gJEZvcm1DYWNoZU9iamVjdC0+R2V0Rm9ybURhdGEoCiAgICAgICAgICAgIEZvcm1JRCAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ0FjdGl2ZUR5bmFtaWNGaWVsZHMnLAogICAgICAgICkgLy8gW107CgogICAgICAgIGZvciBteSAkRmllbGROYW1lICggJEFjdGl2ZUZpZWxkcy0+QCogKSB7CiAgICAgICAgICAgIHB1c2ggQHskRHluYW1pY0ZpZWxkTGlzdH0sICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskRmllbGROYW1lfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGdlbmVyYWwgZm9ybSBkYXRhCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiMgICAgICAgIGZvciBteSAkUGFyYW0gKHF3KE5hbWUgVmVyc2lvblN0cmluZyBEZXBsU3RhdGVJRCBJbmNpU3RhdGVJRCBEZXNjcmlwdGlvbikpIHsKICAgICAgICBmb3IgbXkgJFBhcmFtIChxdyhOYW1lIFZlcnNpb25TdHJpbmcgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbSApOwogICAgICAgIH0KCiAgICAgICAgIyBzcGVjaWFsIGNhc2UgZm9yIGNsYXNzCiAgICAgICAgJEdldFBhcmFte0NsYXNzSUR9ID0gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfTsKCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggJER5bmFtaWNGaWVsZExpc3QtPkAqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntSZWFkb25seX07CgogICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgd2ViIHJlcXVlc3QKICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbHVlc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcGVyZm9ybSBBQ0xzIG9uIHZhbHVlcwogICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAkQUNMUmVkdWNpYmxlRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICBteSBAVXBkYXRhYmxlRmllbGRzID0gcXcoRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24pOwogICAgbXkgQFVwZGF0YWJsZUZpZWxkcyA9IHF3KERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIERlc2NyaXB0aW9uIEdyb3VwSUQpOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBwdXNoIEBVcGRhdGFibGVGaWVsZHMsIGtleXMgJUFDTFJlZHVjaWJsZUR5bmFtaWNGaWVsZHM7CgogICAgIyBjb252ZXJ0IGR5bmFtaWMgZmllbGQgdmFsdWVzIGludG8gYSBzdHJ1Y3R1cmUgZm9yIEFDTHMKICAgIG15ICVEeW5hbWljRmllbGRBQ0xQYXJhbWV0ZXJzOwogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBzb3J0IGtleXMgJUR5bmFtaWNGaWVsZFZhbHVlcyApIHsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZDsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZFZhbHVlc3skRHluYW1pY0ZpZWxkfTsKCiAgICAgICAgJER5bmFtaWNGaWVsZEFDTFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGQgfSA9ICREeW5hbWljRmllbGRWYWx1ZXN7JER5bmFtaWNGaWVsZH07CiAgICB9CiAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IFwlRHluYW1pY0ZpZWxkQUNMUGFyYW1ldGVyczsKCiAgICAjIGdldCB1cGxvYWQgY2FjaGUgb2JqZWN0CiAgICBteSAkVXBsb2FkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZScpOwoKICAgICMgYXR0YWNobWVudHMgb2YgZXhpc3RpbmcgY29uZmlnIGl0ZW0gbmVlZHMgdG8gYmUgbG9hZGVkIGluIHR3byBjYXNlczoKICAgICMgICAxLiBhbiBleGlzdGluZyBjb25maWcgaXRlbSBpcyBlZGl0ZWQgLSBubyBjbGFzcyBpZCBwcmVzZW50IGluIEdldFBhcmFtCiAgICAjICAgMi4gYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0gaXMgZHVwbGljYXRlZAogICAgaWYgKCAhJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICkgfHwgJER1cGxpY2F0ZUlEICkgewoKICAgICAgICAjIGdldCBhbGwgYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgbXkgQEV4aXN0aW5nQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJER1cGxpY2F0ZUlEIHx8ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICApOwoKICAgICAgICAjIGNvcHkgYWxsIGV4aXN0aW5nIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCBjYWNoZQogICAgICAgIEZJTEVOQU1FOgogICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBFeGlzdGluZ0F0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkRHVwbGljYXRlSUQgfHwgJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGFkZCBhdHRhY2htZW50IHRvIHRoZSB1cGxvYWQgY2FjaGUKICAgICAgICAgICAgJFVwbG9hZENhY2hlT2JqZWN0LT5Gb3JtSURBZGRGaWxlKAogICAgICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxvZyBvYmplY3QKICAgIG15ICRMb2dPYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKTsKICAgIG15ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RmllbGRSZXN0cmljdGlvbnMnKTsKCiAgICBteSAkQXV0b3NlbGVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29uZmlnSXRlbUFDTDo6QXV0b3NlbGVjdCcpIHx8IHVuZGVmOwogICAgbXkgJEFDTFByZXNlbGVjdGlvbjsKICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDb25maWdJdGVtQUNMOjpBQ0xQcmVzZWxlY3Rpb24nKSApIHsKCiAgICAgICAgIyBnZXQgY2FjaGVkIHByZXNlbGVjdGlvbiBydWxlcwogICAgICAgIG15ICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgICRBQ0xQcmVzZWxlY3Rpb24gPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbUFDTCcsCiAgICAgICAgICAgIEtleSAgPT4gJ1ByZXNlbGVjdGlvbicsCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQUNMUHJlc2VsZWN0aW9uICkgewogICAgICAgICAgICAkQUNMUHJlc2VsZWN0aW9uID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5TZXRBQ0xQcmVzZWxlY3Rpb25DYWNoZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRXJyb3I7CiAgICBteSAkTmFtZUR1cGxpY2F0ZXM7CiAgICBteSAkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2U7CiAgICBteSAlRHluYW1pY0ZpZWxkVmFsaWRhdGlvblJlc3VsdDsKICAgIG15ICVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlczsKICAgIG15ICVEeW5hbWljRmllbGRWaXNpYmlsaXR5OwoKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICBteSAkTmFtZU1vZHVsZSA9ICRDbGFzc1ByZWZlcmVuY2Vze05hbWVNb2R1bGV9ID8gJENsYXNzUHJlZmVyZW5jZXN7TmFtZU1vZHVsZX1bMF0gOiAnJzsKICAgIGlmICgkTmFtZU1vZHVsZSkgewoKICAgICAgICAjIGNoZWNrIGlmIG5hbWUgbW9kdWxlIGV4aXN0cwogICAgICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoIktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TmFtZTo6JE5hbWVNb2R1bGUiKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgbmFtZSBtb2R1bGUgZm9yIGNsYXNzICRDb25maWdJdGVtLT57Q2xhc3N9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICROYW1lTW9kdWxlID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWZXJzaW9uU3RyaW5nTW9kdWxlID0gJENsYXNzUHJlZmVyZW5jZXN7VmVyc2lvblN0cmluZ01vZHVsZX0gPyAkQ2xhc3NQcmVmZXJlbmNlc3tWZXJzaW9uU3RyaW5nTW9kdWxlfVswXSA6ICcnOwogICAgaWYgKCRWZXJzaW9uU3RyaW5nTW9kdWxlKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBtb2R1bGUgZXhpc3RzCiAgICAgICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpWZXJzaW9uU3RyaW5nOjokVmVyc2lvblN0cmluZ01vZHVsZSIpICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCB2ZXJzaW9uIHN0cmluZyBtb2R1bGUgZm9yIGNsYXNzICRDb25maWdJdGVtLT57Q2xhc3N9ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRWZXJzaW9uU3RyaW5nTW9kdWxlID0gdW5kZWY7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyApIHsKCiAgICAgICAgIyBnZXQgdGhlIHVwbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkUGFyYW1PYmplY3QtPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICk7CgogICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKCiAgICAgICAgICAgICMgYWRkIGF0dGFjaG1lbnQgdG8gdGhlIHVwbG9hZCBjYWNoZQogICAgICAgICAgICAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJEFsbFJlcXVpcmVkID0gMTsKCiAgICAgICAgIyBnZXQgZ2VuZXJhbCBmb3JtIGRhdGEKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24gR3JvdXBJRCkpIHsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAkQ29uZmlnSXRlbS0+eyRQYXJhbX0gPSAkR2V0UGFyYW17JFBhcmFtfTsKCiAgICAgICAgICAgIGlmICggISRDb25maWdJdGVtLT57JFBhcmFtfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRHZXRQYXJhbXtEZXNjcmlwdGlvbn0gLy89ICcnOwoKICAgICAgICAjIGdldCBuYW1lIG9ubHkgaWYgaXQgaXMgbm90IGZpbGxlZCBieSBhIG1vZHVsZQogICAgICAgIGlmICggISROYW1lTW9kdWxlICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e05hbWV9ID0gJEdldFBhcmFte05hbWV9OwoKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntOYW1lfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHZlcnNpb24gc3RyaW5nIG9ubHkgaWYgaXQgaXMgbm90IGZpbGxlZCBieSBhIG1vZHVsZQogICAgICAgIGlmICggISRWZXJzaW9uU3RyaW5nTW9kdWxlICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e1ZlcnNpb25TdHJpbmd9ID0gJEdldFBhcmFte1ZlcnNpb25TdHJpbmd9OwoKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntWZXJzaW9uU3RyaW5nfSApIHsKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2ssIHdoZXRoZXIgdGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgaXMgZW5hYmxlZAogICAgICAgIGlmICgKICAgICAgICAgICAgSXNTdHJpbmdXaXRoRGF0YSggJENvbmZpZ0l0ZW0tPntOYW1lfSApCiAgICAgICAgICAgICYmICRDb25maWdPYmplY3QtPkdldCgnVW5pcXVlQ0lOYW1lOjpFbmFibGVVbmlxdWVuZXNzQ2hlY2snKQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDaGVja2luZyBmb3IgZHVwbGljYXRlIG5hbWVzIChDbGFzc0lEOiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LCAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIk5hbWU6ICRDb25maWdJdGVtLT57TmFtZX0sIENvbmZpZ0l0ZW1JRDogJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9KSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkTmFtZUR1cGxpY2F0ZXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VW5pcXVlTmFtZUNoZWNrKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0b3AgcHJvY2Vzc2luZyBpZiB0aGUgbmFtZSBpcyBub3QgdW5pcXVlCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCROYW1lRHVwbGljYXRlcykgKSB7CgogICAgICAgICAgICAgICAgJEFsbFJlcXVpcmVkID0gMDsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGEgc3RyaW5nIG9mIGFsbCBkdXBsaWNhdGUgSURzCiAgICAgICAgICAgICAgICBteSAkTmFtZUR1cGxpY2F0ZXNTdHJpbmcgPSBqb2luICcsICcsIEB7JE5hbWVEdXBsaWNhdGVzfTsKCiAgICAgICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiVGhlIG5hbWUgJENvbmZpZ0l0ZW0tPntOYW1lfSBpcyBhbHJlYWR5IGluIHVzZSBieSB0aGUgQ29uZmlnSXRlbUlEKHMpOiAiCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJE5hbWVEdXBsaWNhdGVzU3RyaW5nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGNvbmZpZyBvcHRpb24gZm9yIHRoZSBuYW1lIHJlZ2V4IGNoZWNrcwogICAgICAgIG15ICRDSU5hbWVSZWdleENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkNJTmFtZVJlZ2V4Iik7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIENJIG5hbWUgaXMgZ2l2ZW4gYW5kIHNob3VsZCBiZSBjaGVja2VkIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24KICAgICAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRDb25maWdJdGVtLT57TmFtZX0gKSAmJiAkQ0lOYW1lUmVnZXhDb25maWcgKSB7CgogICAgICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjbGFzcyBuYW1lCiAgICAgICAgICAgIG15ICRDbGFzc05hbWUgPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtLT57Q2xhc3NJRH0gfSB8fCAnJzsKCiAgICAgICAgICAgICMgZ2V0IHRoZSByZWdleCBmb3IgdGhpcyBjbGFzcwogICAgICAgICAgICBteSAkQ0lOYW1lUmVnZXggPSAkQ0lOYW1lUmVnZXhDb25maWctPnsgJENsYXNzTmFtZSAuICc6OicgLiAnQ0lOYW1lUmVnZXgnIH0gfHwgJyc7CgogICAgICAgICAgICAjIGlmIGEgcmVnZXggaXMgZGVmaW5lZCBhbmQgdGhlIENJIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgogICAgICAgICAgICBpZiAoICRDSU5hbWVSZWdleCAmJiAkQ29uZmlnSXRlbS0+e05hbWV9ICF+IG17ICRDSU5hbWVSZWdleCB9eG1zICkgewoKICAgICAgICAgICAgICAgICRBbGxSZXF1aXJlZCA9IDA7CgogICAgICAgICAgICAgICAgIyBnZXQgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgY2xhc3MKICAgICAgICAgICAgICAgICRDSU5hbWVSZWdleEVycm9yTWVzc2FnZSA9ICRDSU5hbWVSZWdleENvbmZpZy0+eyAkQ2xhc3NOYW1lIC4gJzo6JyAuICdDSU5hbWVSZWdleEVycm9yTWVzc2FnZScgfSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2Zvcm0gZHluYW1pYyBmaWVsZCBkYXRhIGludG8gREZOYW1lID0+IERGTmFtZSBwYWlyCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZEFjbCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntOYW1lfSB9ICREeW5hbWljRmllbGRMaXN0LT5AKjsKCiAgICAgICAgIyBjYWxsIHRpY2tldCBBQ0xzIGZvciBEeW5hbWljRmllbGRzIHRvIGNoZWNrIGZpZWxkIHZpc2liaWxpdHkKICAgICAgICBteSAkQUNMUmVzdWx0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BY2woCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFJldHVyblR5cGUgICAgPT4gJ0Zvcm0nLAogICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZEFjbCwKICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJEFDTFJlc3VsdCkgewogICAgICAgICAgICAlRHluYW1pY0ZpZWxkVmlzaWJpbGl0eSA9IG1hcCB7ICdEeW5hbWljRmllbGRfJyAuICRfLT57TmFtZX0gPT4gMCB9ICREeW5hbWljRmllbGRMaXN0LT5AKjsKICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbERhdGEoKTsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoIHNvcnQga2V5cyAlQWNsRGF0YSApIHsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRWaXNpYmlsaXR5eyAnRHluYW1pY0ZpZWxkXycgLiAkRmllbGQgfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVEeW5hbWljRmllbGRWaXNpYmlsaXR5ID0gbWFwIHsgJ0R5bmFtaWNGaWVsZF8nIC4gJF8tPntOYW1lfSA9PiAxIH0gJER5bmFtaWNGaWVsZExpc3QtPkAqOwogICAgICAgIH0KCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggJER5bmFtaWNGaWVsZExpc3QtPkAqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXNGaWx0ZXI7CgogICAgICAgICAgICBpZiAoICRBQ0xSZWR1Y2libGVEeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskUG9zc2libGVWYWx1ZXN9OwogICAgICAgICAgICAgICAgICAgIEBBY2xEYXRheyBrZXlzICVBY2xEYXRhIH0gPSBrZXlzICVBY2xEYXRhOwoKICAgICAgICAgICAgICAgICAgICAjIHNldCBwb3NzaWJsZSB2YWx1ZXMgZmlsdGVyIGZyb20gQUNMcwogICAgICAgICAgICAgICAgICAgIG15ICRBQ0wgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFjbCgKICAgICAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICA9PiBcJUFjbERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRBQ0wpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJUZpbHRlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWNsRGF0YSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjb252ZXJ0IEZpbHRlciBrZXkgPT4ga2V5IGJhY2sgdG8ga2V5ID0+IHZhbHVlIHVzaW5nIG1hcAogICAgICAgICAgICAgICAgICAgICAgICAleyRQb3NzaWJsZVZhbHVlc0ZpbHRlcn0gPSBtYXAgeyAkXyA9PiAkUG9zc2libGVWYWx1ZXMtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgIyBwZXJmb3JtIHZhbGlkYXRpb24KICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkVmFsaWRhdGlvblJlc3VsdCkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoIkNvdWxkIG5vdCBwZXJmb3JtIHZhbGlkYXRpb24gb24gZmllbGQgJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSEiKSwKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHByb3BhZ2F0ZSB2YWxpZGF0aW9uIGVycm9yIHRvIHRoZSBFcnJvciB2YXJpYWJsZSB0byBiZSBkZXRlY3RlZCBieSB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gICAgICAgICAgICAgICAgICAgICAgICA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHR7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRBbGxSZXF1aXJlZCA9ICVFcnJvciA/IDAgOiAxOwoKICAgICAgICAjIHNhdmUgdmVyc2lvbiB0byBkYXRhYmFzZQogICAgICAgIGlmICgkQWxsUmVxdWlyZWQpIHsKCiAgICAgICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBmcm9tIHVwbG9hZCBjYWNoZQogICAgICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzRGF0YSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGEgbG9va3VwIGxvb2t1cCBoYXNoIG9mIHRoZSBuZXcgYXR0YWNobWVudHMKICAgICAgICAgICAgbXkgJU5ld0F0dGFjaG1lbnQ7CiAgICAgICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkQ29udGVudElECiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfSA9fiAvaW1hZ2UvaSApCiAgICAgICAgICAgICAgICAgICAgJiYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0ID0+ICRDb250ZW50SUQsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyB3b3JrYXJvdW5kIGZvciBsaW5rIGVuY29kZSBvZiByaWNoIHRleHQgZWRpdG9yLCBzZWUgYnVnIzUwNTMKICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudElETGlua0VuY29kZSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJENvbnRlbnRJRCk7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Rlc2NyaXB0aW9ufSA9fiBzLyhDb250ZW50SUQ9KSRDb250ZW50SURMaW5rRW5jb2RlLyQxJENvbnRlbnRJRC9nOwoKICAgICAgICAgICAgICAgICAgICAjIGlnbm9yZSBhdHRhY2htZW50IGlmIG5vdCBsaW5rZWQgaW4gYm9keQogICAgICAgICAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVAogICAgICAgICAgICAgICAgICAgICAgICBpZiAkR2V0UGFyYW17RGVzY3JpcHRpb259ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB0aGUga2V5IGlzIHRoZSBmaWxlbmFtZSArIGZpbGVzaXplICsgY29udGVudCB0eXBlCiAgICAgICAgICAgICAgICBteSAkS2V5ID0gJEF0dGFjaG1lbnQtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50LT57RmlsZXNpemV9CiAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudC0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgICAgICAgICAjIHN0b3JlIGFsbCBvZiB0aGUgbmV3IGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgJE5ld0F0dGFjaG1lbnR7JEtleX0gPSAkQXR0YWNobWVudDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0Rlc2NyaXB0aW9ufSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17RGVzY3JpcHRpb259LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBmb3IgZXhpc3RpbmcgQ29uZmlnSXRlbXMgY29tcGFyZSB3aXRoIHRoZSBjdXJyZW50IGRhdGEKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gbmUgJ05FVycgKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW0gYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgICAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayB0aGUgZXhpc3RpbmcgYXR0YWNobWVudHMKICAgICAgICAgICAgICAgIEZJTEVOQU1FOgogICAgICAgICAgICAgICAgZm9yIG15ICRGaWxlbmFtZSAoQEV4aXN0aW5nQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnQgZGF0YQogICAgICAgICAgICAgICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIHRoZSBrZXkgaXMgdGhlIGZpbGVuYW1lICsgZmlsZXNpemUgKyBjb250ZW50IHR5cGUKICAgICAgICAgICAgICAgICAgICAjIChubyBjb250ZW50IGlkLCBhcyBleGlzdGluZyBhdHRhY2htZW50cyBkb24ndCBoYXZlIGl0KQogICAgICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkQXR0YWNobWVudERhdGEtPntGaWxlbmFtZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX0KICAgICAgICAgICAgICAgICAgICAgICAgLiAkQXR0YWNobWVudERhdGEtPntDb250ZW50VHlwZX07CgogICAgICAgICAgICAgICAgICAgICMgYXR0YWNobWVudCBpcyBhbHJlYWR5IGV4aXN0aW5nLCB3ZSBjYW4gZGVsZXRlIGl0IGZyb20gdGhlIG5ldyBhdHRhY2htZW50IGhhc2gKICAgICAgICAgICAgICAgICAgICBpZiAoICROZXdBdHRhY2htZW50eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJE5ld0F0dGFjaG1lbnR7JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGV4aXN0aW5nIGF0dGFjaG1lbnQgaXMgbm8gbG9uZ2VyIGluIG5ldyBhdHRhY2htZW50cyBoYXNoCiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgZXhpc3RpbmcgYXR0YWNobWVudAogICAgICAgICAgICAgICAgICAgICAgICBteSAkRGVsZXRlU3VjY2Vzc2Z1bCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudERlbGV0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJERlbGV0ZVN1Y2Nlc3NmdWwgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ2V0IHZlcnNpb24gYXR0YWNobWVudHMgbWV0YSBkYXRhCiAgICAgICAgICAgICAgICBteSBARXhpc3RpbmdWZXJzaW9uQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+VmVyc2lvbkF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgdGhlIGV4aXN0aW5nIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICAgICBGSUxFTkFNRToKICAgICAgICAgICAgICAgIGZvciBteSAkRmlsZW5hbWUgKEBFeGlzdGluZ1ZlcnNpb25BdHRhY2htZW50cykgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCB0aGUgZXhpc3RpbmcgYXR0YWNobWVudCBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgPT4gJEZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgdGhlIGtleSBpcyB0aGUgZmlsZW5hbWUgKyBmaWxlc2l6ZSArIGNvbnRlbnQgdHlwZQogICAgICAgICAgICAgICAgICAgICMgKG5vIGNvbnRlbnQgaWQsIGFzIGV4aXN0aW5nIGF0dGFjaG1lbnRzIGRvbid0IGhhdmUgaXQpCiAgICAgICAgICAgICAgICAgICAgbXkgJEtleSA9ICRBdHRhY2htZW50RGF0YS0+e0ZpbGVuYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50RGF0YS0+e0ZpbGVzaXplfQogICAgICAgICAgICAgICAgICAgICAgICAuICRBdHRhY2htZW50RGF0YS0+e0NvbnRlbnRUeXBlfTsKCiAgICAgICAgICAgICAgICAgICAgIyBhdHRhY2htZW50IGlzIGFscmVhZHkgZXhpc3RpbmcsIHdlIGNhbiBkZWxldGUgaXQgZnJvbSB0aGUgbmV3IGF0dGFjaG1lbnQgaGFzaAogICAgICAgICAgICAgICAgICAgIGlmICggJE5ld0F0dGFjaG1lbnR7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkTmV3QXR0YWNobWVudHskS2V5fTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgZXhpc3RpbmcgYXR0YWNobWVudCBpcyBubyBsb25nZXIgaW4gbmV3IGF0dGFjaG1lbnRzIGhhc2gKICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSBleGlzdGluZyBhdHRhY2htZW50CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREZWxldGVTdWNjZXNzZnVsID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50RGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRDb25maWdJdGVtLT57VmVyc2lvbklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICA9PiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGVsZXRlU3VjY2Vzc2Z1bCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgVE9ETzogYmV0dGVyIGFsaWduIHdpdGggdGhlIGluaXRpYWwgRWRpdEZpZWxkVmFsdWVHZXQ/CiAgICAgICAgICAgICMgVE9ETzogVmlzaWJpbGl0eQogICAgICAgICAgICAjIHByZXBhcmUgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoICREeW5hbWljRmllbGRMaXN0LT5AKiApIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGQtPntSZWFkb25seX07CgogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkVmFsdWVzeyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gZXEgJ05FVycgKSB7CgogICAgICAgICAgICAgICAgIyBkZWxldGUgdGVtcG9yYXJ5IG51bWJlciAjIFRPRE86IGNoZWNrLCB3aGV0aGVyIHNldHRpbmcgbmV3IGFzIG51bWJlciBpcyBuZWNlc3NhcnkgaW4gdGhlIGZpcnN0IHBsYWNlCiAgICAgICAgICAgICAgICBkZWxldGUgJENvbmZpZ0l0ZW0tPntOdW1iZXJ9OwoKICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT4lKiwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAoKICAgICAgICAgICAgICAgICAgICAjIERlZmluaXRpb25JRCA9PiAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0sICMgVE9ETzogdGhpcyBpcyBub3QgdXNlZCB5ZXQKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBlcnJvcgogICAgICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVXBkYXRlU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT4lKiwKICAgICAgICAgICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJERlZmluaXRpb24tPntEZWZpbml0aW9uSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgIGlmICggISRVcGRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmV0Y2ggdXBkYXRlZCBjb25maWcgaXRlbSBkYXRhIHRvIHNlY3VyZSB2ZXJzaW9uIGlkIGJlaW5nIHByZXNlbnQKICAgICAgICAgICAgbXkgJE5ld0NvbmZpZ0l0ZW1EYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgd3JpdGUgdGhlIG5ldyBhdHRhY2htZW50cwogICAgICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKCB2YWx1ZXMgJU5ld0F0dGFjaG1lbnQgKSB7CgogICAgICAgICAgICAgICAgIyBhZGQgYXR0YWNobWVudAogICAgICAgICAgICAgICAgaWYgKCAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSAmJiAkQXR0YWNobWVudC0+e0Rpc3Bvc2l0aW9ufSBlcSAnaW5saW5lJyApIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQXR0YWNobWVudEFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkTmV3Q29uZmlnSXRlbURhdGEtPntWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYWxzbyB3cml0ZSBhdHRhY2htZW50cyB0byBsYXN0IHZlcnNpb24gaWYgaXQgZGlmZmVycyBiZWNhdXNlIHdlIGRlbGV0ZWQgdGhlbSBwcmV2aW91c2x5CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0gJiYgJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9ICE9ICROZXdDb25maWdJdGVtRGF0YS0+e1ZlcnNpb25JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25BdHRhY2htZW50QWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uSUQgPT4gJENvbmZpZ0l0ZW0tPntWZXJzaW9uSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgZXJyb3IKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBmb3JtIGRhdGEKICAgICAgICAgICAgJEZvcm1DYWNoZU9iamVjdC0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIHpvb20gbWFzawogICAgICAgICAgICBteSAkU2NyZWVuVHlwZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTY3JlZW5UeXBlJyApIHx8IDA7CiAgICAgICAgICAgIGlmICgkU2NyZWVuVHlwZSkgewoKICAgICAgICAgICAgICAgIG15ICRVUkwgPSAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1ab29tO0NvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0iOwoKICAgICAgICAgICAgICAgICMgcmV0dXJuIHRvIG92ZXJ2aWV3IG9yIHNlYXJjaCByZXN1bHRzIGluc3RlYWQgaWYgY2FsbGVkIER1cGxpY2F0ZSBmcm9tIHJvdyBhY3Rpb24KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb259e0xhc3RTY3JlZW5WaWV3fSBlcSAnQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW0nCiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntTZXNzaW9ufXtMYXN0U2NyZWVuVmlld30gPX4gbXtcQSBBY3Rpb249QWdlbnRJVFNNQ29uZmlnSXRlbSg/OiBTZWFyY2gpPzt9bXN4CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRVUkwgPSAkU2VsZi0+e1Nlc3Npb259e0xhc3RTY3JlZW5WaWV3fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UG9wdXBDbG9zZSgKICAgICAgICAgICAgICAgICAgICBVUkwgPT4gJFVSTCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTtDb25maWdJdGVtSUQ9JENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWFVwZGF0ZScgKSB7CiAgICAgICAgbXkgJEVsZW1lbnRDaGFuZ2VkICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcgKSB8fCAnJzsKICAgICAgICBteSAlQ2hhbmdlZEVsZW1lbnRzID0gJEVsZW1lbnRDaGFuZ2VkID8gKCAkRWxlbWVudENoYW5nZWQgPT4gMSApIDogKCk7CiAgICAgICAgbXkgJExvb3BQcm90ZWN0aW9uICA9IDEwMDsKCiAgICAgICAgIyBnZXQgdmFsdWVzIGFuZCB2aXNpYmlsaXR5IG9mIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJUR5bkZpZWxkU3RhdGVzID0gJEZpZWxkUmVzdHJpY3Rpb25zT2JqZWN0LT5HZXRGaWVsZFN0YXRlcygKICAgICAgICAgICAgQ29uZmlnSXRlbU9iamVjdCAgICAgICAgICA9PiAkQ29uZmlnSXRlbU9iamVjdCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyAgICAgICAgICAgICA9PiAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPT4gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QsCiAgICAgICAgICAgIENoYW5nZWRFbGVtZW50cyAgICAgICAgICAgPT4gXCVDaGFuZ2VkRWxlbWVudHMsICAgICAgICAgICAgICAgICMgb3B0aW9uYWwgdG8gcmVkdWNlIEFDTCBldmFsdWF0aW9uCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgQ29uZmlnSXRlbUlEICAgICAgICAgICAgICA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBHZXRQYXJhbSAgICAgICAgICAgICAgICAgID0+IHslR2V0UGFyYW19LAogICAgICAgICAgICBBdXRvc2VsZWN0ICAgICAgICAgICAgICAgID0+ICRBdXRvc2VsZWN0LAogICAgICAgICAgICBBQ0xQcmVzZWxlY3Rpb24gICAgICAgICAgID0+ICRBQ0xQcmVzZWxlY3Rpb24sCiAgICAgICAgICAgIExvb3BQcm90ZWN0aW9uICAgICAgICAgICAgPT4gXCRMb29wUHJvdGVjdGlvbiwKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIG5ldyB2YWx1ZXMKICAgICAgICAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfSA9IHsKICAgICAgICAgICAgJXsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gfSwKICAgICAgICAgICAgJXsgJER5bkZpZWxkU3RhdGVze05ld1ZhbHVlc30gfSwKICAgICAgICB9OwoKICAgICAgICAjIHVwZGF0ZSBEeW5hbWljIEZpZWxkcyBQb3NzaWJsZSBWYWx1ZXMgdmlhIEFKQVgKICAgICAgICBteSBARHluYW1pY0ZpZWxkQUpBWDsKCiAgICAgICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkTmFtZSAoIGtleXMgJXsgJER5bkZpZWxkU3RhdGVze0ZpZWxkc30gfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskTmFtZX07CgogICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e011bHRpVmFsdWV9ICYmIHJlZiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyROYW1lIn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkaSAoIDAgLi4gJCN7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJE5hbWUifSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgICAgICAgICAgPyAoICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJE5hbWUifVskaV0gLy8gJycgKQogICAgICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+IFsgJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9WyRpXSBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICROYW1lIC4gJ18nIC4gJGksCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyROYW1lIn1bJGldLAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfS0+e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBhZGQgdGVtcGxhdGUgdmFsdWUgZm9yIGtlZXBpbmcgdGVtcGxhdGVzIGluIGxpbmUgd2l0aCBBQ0xzCiAgICAgICAgICAgICAgICBpZiAoICEkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17Tm90QUNMUmVkdWNpYmxlfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkRGF0YVZhbHVlcyA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICREeW5GaWVsZFN0YXRlc3tGaWVsZHN9eyROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9IC8vICcnIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgZHluYW1pYyBmaWVsZCB0byB0aGUgbGlzdCBvZiBmaWVsZHMgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1RlbXBsYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0RlZmF1bHRWYWx1ZX0gLy8gJycsCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgID8gKCAkR2V0UGFyYW17RHluYW1pY0ZpZWxkfXsiRHluYW1pY0ZpZWxkXyROYW1lIn0gLy8gJycgKQogICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5CdWlsZFNlbGVjdGlvbkRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJE5hbWUifSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfHwgJER5bkZpZWxkU3RhdGVze0ZpZWxkc317JE5hbWV9e1Bvc3NpYmxlVmFsdWVzfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkTmFtZSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH17IkR5bmFtaWNGaWVsZF8kTmFtZSJ9LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmb3IgbXkgJFNldEZpZWxkICggdmFsdWVzICREeW5GaWVsZFN0YXRlc3tTZXRzfS0+JSogKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2V0RmllbGQtPntEeW5hbWljRmllbGRDb25maWd9OwoKICAgICAgICAgICAgIyB0aGUgZnJvbnRlbmQgbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgaW5uZXIgZmllbGQgaW5jbHVkaW5nIGl0cyBpbmRleCBvciB0aGUgJ19UZW1wbGF0ZScgc3VmZml4CiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRGcm9udGVuZE5hbWUgKCBrZXlzICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfS0+JSogKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtNdWx0aVZhbHVlfSAmJiByZWYgJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkaSAoIDAgLi4gJCN7ICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJERhdGFWYWx1ZXMgPSAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17Tm90QUNMUmVkdWNpYmxlfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX1bJGldIC8vICcnICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+QnVpbGRTZWxlY3Rpb25EYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiBbICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX1bJGldIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARHluYW1pY0ZpZWxkQUpBWCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJEZyb250ZW5kTmFtZSAuICJfJGkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGFWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkU2V0RmllbGQtPntWYWx1ZXN9eyRGcm9udGVuZE5hbWV9WyRpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9LT57VHJhbnNsYXRhYmxlVmFsdWVzfSB8fCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGVtcGxhdGUgdmFsdWUgZm9yIGtlZXBpbmcgdGVtcGxhdGVzIGluIGxpbmUgd2l0aCBBQ0xzCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e05vdEFDTFJlZHVjaWJsZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlcyAgICAgPT4gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e1Bvc3NpYmxlVmFsdWVzfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gWyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtEZWZhdWx0VmFsdWV9IC8vICcnIF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgYWRkIGR5bmFtaWMgZmllbGQgdG8gdGhlIGxpc3Qgb2YgZmllbGRzIHRvIHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRBSkFYLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gLiAnX1RlbXBsYXRlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317RGVmYXVsdFZhbHVlfSAvLyAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+ICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e1RyYW5zbGF0YWJsZVZhbHVlc30gfHwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICREYXRhVmFsdWVzID0gJFNldEZpZWxkLT57RmllbGRTdGF0ZXN9eyRGcm9udGVuZE5hbWV9e05vdEFDTFJlZHVjaWJsZX0KICAgICAgICAgICAgICAgICAgICA/ICggJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSAvLyAnJyApCiAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXMgICAgID0+ICRTZXRGaWVsZC0+e0ZpZWxkU3RhdGVzfXskRnJvbnRlbmROYW1lfXtQb3NzaWJsZVZhbHVlc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFNldEZpZWxkLT57VmFsdWVzfXskRnJvbnRlbmROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAkU2V0RmllbGQtPntGaWVsZFN0YXRlc317JEZyb250ZW5kTmFtZX17UG9zc2libGVWYWx1ZXN9CiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBkeW5hbWljIGZpZWxkIHRvIHRoZSBsaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUKICAgICAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnRHluYW1pY0ZpZWxkXycgLiAkRnJvbnRlbmROYW1lLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICREYXRhVmFsdWVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRTZXRGaWVsZC0+e1ZhbHVlc317JEZyb250ZW5kTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ30tPntUcmFuc2xhdGFibGVWYWx1ZXN9IHx8IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSggJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQER5bmFtaWNGaWVsZEFKQVgsIHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3RyaWN0aW9uc19WaXNpYmlsaXR5JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgbXkgJEpTT04gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRBSkFYLAogICAgICAgICAgICBdLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJExheW91dE9iamVjdC0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIHByZS1maWxsaW5nIGNhY2hlIGZvciByZWZlcmVuY2UgZmllbGQgLSBuZWNlc3NhcnkgZm9yIEFDTCBjYWxjdWxhdGlvbiBvZiBsZW5zIGZpZWxkcwogICAgICAgIERZTkFNSUNGSUVMRENPTkZJRzoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoICREeW5hbWljRmllbGRMaXN0LT5AKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTERDT05GSUcgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgbXkgJElzUmVmZXJlbmNlRmllbGQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzUmVmZXJlbmNlRmllbGQnLAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRENPTkZJRyB1bmxlc3MgJElzUmVmZXJlbmNlRmllbGQ7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpGb3JtQ2FjaGUnKS0+U2V0Rm9ybURhdGEoCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Bvc3NpYmxlVmFsdWVzX0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9eyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9In0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkTG9vcFByb3RlY3Rpb24gPSAxMDA7CgogICAgICAgICMgZ2V0IHZhbHVlcyBhbmQgdmlzaWJpbGl0eSBvZiBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICVEeW5GaWVsZFN0YXRlcyA9ICRGaWVsZFJlc3RyaWN0aW9uc09iamVjdC0+R2V0RmllbGRTdGF0ZXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1PYmplY3QgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1PYmplY3QsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgICAgICAgICAgICAgPT4gJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LAogICAgICAgICAgICBEeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0+ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LAogICAgICAgICAgICBBY3Rpb24gICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgICAgICAgICAgICAgICA9PiB7JUdldFBhcmFtfSwKICAgICAgICAgICAgQXV0b3NlbGVjdCAgICAgICAgICAgICAgICA9PiAkQXV0b3NlbGVjdCwKICAgICAgICAgICAgQUNMUHJlc2VsZWN0aW9uICAgICAgICAgICA9PiAkQUNMUHJlc2VsZWN0aW9uLAogICAgICAgICAgICBMb29wUHJvdGVjdGlvbiAgICAgICAgICAgID0+IFwkTG9vcFByb3RlY3Rpb24sCiAgICAgICAgKTsKCiAgICAgICAgIyBzdG9yZSBuZXcgdmFsdWVzCiAgICAgICAgJEdldFBhcmFte0R5bmFtaWNGaWVsZH0gPSB7CiAgICAgICAgICAgICV7ICRHZXRQYXJhbXtEeW5hbWljRmllbGR9IH0sCiAgICAgICAgICAgICV7ICREeW5GaWVsZFN0YXRlc3tOZXdWYWx1ZXN9IH0sCiAgICAgICAgfTsKCiAgICAgICAgJUR5bmFtaWNGaWVsZFZpc2liaWxpdHkgICAgID0gJER5bkZpZWxkU3RhdGVze1Zpc2liaWxpdHl9LT4lKjsKICAgICAgICAlRHluYW1pY0ZpZWxkUG9zc2libGVWYWx1ZXMgPSBtYXAgeyAnRHluYW1pY0ZpZWxkXycgLiAkXyA9PiAkRHluRmllbGRTdGF0ZXN7RmllbGRzfXskX317UG9zc2libGVWYWx1ZXN9IH0ga2V5cyAkRHluRmllbGRTdGF0ZXN7RmllbGRzfS0+JSo7CiAgICB9CgogICAgbXkgJE5hbWVFZGl0YWJsZSAgID0gJE5hbWVNb2R1bGUgPyAwIDogMTsKICAgIG15ICRSb3dOYW1lSW52YWxpZCA9ICRDb25maWdJdGVtLT57TmFtZX0KCiAgICAgICAgIyBJZiBhIG5hbWUgZXhpc3RzIHRoZW4gbWFyayByZWdleCBhbmQgZHVwbGljYXRlIGVycm9ycy4KICAgICAgICA/ICggKCAkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2UgfHwgSXNBcnJheVJlZldpdGhEYXRhKCROYW1lRHVwbGljYXRlcykgKSA/ICdTZXJ2ZXJFcnJvcicgOiB1bmRlZiApCgogICAgICAgICMgSWYgdGhlIG5hbWUgZG9lcyBub3QgZXhpc3QgYnV0IHNob3VsZCBleGlzdCB0aGVuIG1hcmsgaXQuCiAgICAgICAgOiAoICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTYXZlJyAmJiAkTmFtZUVkaXRhYmxlICkgPyAnU2VydmVyRXJyb3InIDogdW5kZWYgKTsKCiAgICAjIG91dHB1dCBuYW1lIGJsb2NrCiAgICBpZiAoICRDb25maWdJdGVtLT57TmFtZX0gfHwgJE5hbWVFZGl0YWJsZSApIHsKCiAgICAgICAgIyBvdXRwdXQgbmFtZSBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dOYW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBSb3dOYW1lSW52YWxpZCA9PiAkUm93TmFtZUludmFsaWQsCiAgICAgICAgICAgICAgICBSZWFkb25seSAgICAgICA9PiAhJE5hbWVFZGl0YWJsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzcGVjaWZpYyBlcnJvcnMKICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCROYW1lRHVwbGljYXRlcykgKSB7CgogICAgICAgICMgYnVpbGQgYXJyYXkgd2l0aCBDSS1OdW1iZXJzCiAgICAgICAgbXkgQE5hbWVEdXBsaWNhdGVzQnlDSU51bWJlcjsKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIEB7JE5hbWVEdXBsaWNhdGVzfSApIHsKCiAgICAgICAgICAgICMgbG9va3VwIHRoZSBDSSBudW1iZXIKICAgICAgICAgICAgbXkgJENJTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE5hbWVEdXBsaWNhdGVzQnlDSU51bWJlciwgJENJTnVtYmVyOwogICAgICAgIH0KCiAgICAgICAgbXkgJER1cGxpY2F0ZVN0cmluZyA9IGpvaW4gJywgJywgQE5hbWVEdXBsaWNhdGVzQnlDSU51bWJlcjsKCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgJExvZ09iamVjdC0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIlJlbmRlcmluZyBibG9jayBmb3IgZHVwbGljYXRlcyAoQ0ktTnVtYmVyczogJER1cGxpY2F0ZVN0cmluZykgZXJyb3IgbWVzc2FnZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93TmFtZUVycm9yRHVwbGljYXRlcycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgRHVwbGljYXRlcyA9PiAkRHVwbGljYXRlU3RyaW5nLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoJENJTmFtZVJlZ2V4RXJyb3JNZXNzYWdlKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd05hbWVFcnJvclJlZ0V4JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBSZWdFeEVycm9yTWVzc2FnZSA9PiAkQ0lOYW1lUmVnZXhFcnJvck1lc3NhZ2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICgkUm93TmFtZUludmFsaWQpIHsKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPntEZWJ1Z30gPiAwICkgewogICAgICAgICAgICAkTG9nT2JqZWN0LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlbmRlcmluZyBkZWZhdWx0IGVycm9yIGJsb2NrIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dOYW1lRXJyb3JEZWZhdWx0JywKICAgICAgICApOwogICAgfQoKICAgIG15ICRWZXJzaW9uU3RyaW5nRWRpdGFibGUgICA9ICRWZXJzaW9uU3RyaW5nTW9kdWxlID8gMCA6IDE7CiAgICBteSAkVmVyc2lvblN0cmluZ0R1cGxpY2F0ZXMgPSBbXTsKICAgIG15ICRSb3dWZXJzaW9uU3RyaW5nSW52YWxpZCA9ICRDb25maWdJdGVtLT57VmVyc2lvblN0cmluZ30KCiAgICAgICAgIyBJZiBhIHZlcnNpb24gc3RyaW5nIGV4aXN0cyB0aGVuIG1hcmsgZHVwbGljYXRlIGVycm9ycy4KICAgICAgICA/ICggSXNBcnJheVJlZldpdGhEYXRhKCRWZXJzaW9uU3RyaW5nRHVwbGljYXRlcykgPyAnU2VydmVyRXJyb3InIDogdW5kZWYgKQoKICAgICAgICAjIElmIHRoZSB2ZXJzaW9uIHN0cmluZyBkb2VzIG5vdCBleGlzdCBidXQgc2hvdWxkIGV4aXN0IHRoZW4gbWFyayBpdC4KICAgICAgICA6ICggKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICYmICRWZXJzaW9uU3RyaW5nRWRpdGFibGUgKSA/ICdTZXJ2ZXJFcnJvcicgOiB1bmRlZiApOwoKICAgICMgb3V0cHV0IHZlcnNpb24gc3RyaW5nIGJsb2NrCiAgICBpZiAoJFZlcnNpb25TdHJpbmdFZGl0YWJsZSkgewoKICAgICAgICAjIG91dHB1dCB2ZXJzaW9uIHN0cmluZyBibG9jawogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dWZXJzaW9uU3RyaW5nJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBSb3dWZXJzaW9uU3RyaW5nSW52YWxpZCA9PiAkUm93VmVyc2lvblN0cmluZ0ludmFsaWQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgc3BlY2lmaWMgZXJyb3JzCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkVmVyc2lvblN0cmluZ0R1cGxpY2F0ZXMpICkgewoKICAgICAgICAjIGJ1aWxkIGFycmF5IHdpdGggQ0ktTnVtYmVycwogICAgICAgIG15IEBWZXJzaW9uU3RyaW5nRHVwbGljYXRlc0J5Q0lOdW1iZXI7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBAeyRWZXJzaW9uU3RyaW5nRHVwbGljYXRlc30gKSB7CgogICAgICAgICAgICAjIGxvb2t1cCB0aGUgQ0kgbnVtYmVyCiAgICAgICAgICAgIG15ICRDSU51bWJlciA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtTG9va3VwKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBWZXJzaW9uU3RyaW5nRHVwbGljYXRlc0J5Q0lOdW1iZXIsICRDSU51bWJlcjsKICAgICAgICB9CgogICAgICAgIG15ICREdXBsaWNhdGVTdHJpbmcgPSBqb2luICcsICcsIEBWZXJzaW9uU3RyaW5nRHVwbGljYXRlc0J5Q0lOdW1iZXI7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICJSZW5kZXJpbmcgYmxvY2sgZm9yIGR1cGxpY2F0ZXMgKENJLU51bWJlcnM6ICREdXBsaWNhdGVTdHJpbmcpIGVycm9yIG1lc3NhZ2UiLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd1ZlcnNpb25TdHJpbmdFcnJvckR1cGxpY2F0ZXMnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIER1cGxpY2F0ZXMgPT4gJER1cGxpY2F0ZVN0cmluZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCRSb3dWZXJzaW9uU3RyaW5nSW52YWxpZCkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgICAgICRMb2dPYmplY3QtPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiUmVuZGVyaW5nIGRlZmF1bHQgZXJyb3IgYmxvY2siLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jvd1ZlcnNpb25TdHJpbmdFcnJvckRlZmF1bHQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGVwbG95bWVudCBzdGF0ZSBsaXN0CiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICApOwoKICAgICMgb3V0cHV0IGRlcGxveW1lbnQgc3RhdGUgaW52YWxpZCBibG9jawogICAgbXkgJFJvd0RlcGxTdGF0ZUludmFsaWQgPSAnJzsKICAgIGlmICggISRDb25maWdJdGVtLT57RGVwbFN0YXRlSUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CiAgICAgICAgJFJvd0RlcGxTdGF0ZUludmFsaWQgPSAnIFNlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGdlbmVyYXRlIERlcGxTdGF0ZU9wdGlvblN0cmcKICAgIG15ICREZXBsU3RhdGVPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICREZXBsU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnRGVwbFN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnRm9ybVVwZGF0ZSBWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnIC4gJFJvd0RlcGxTdGF0ZUludmFsaWQsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtEZXBsU3RhdGVJRH0sCiAgICApOwoKICAgICMgb3V0cHV0IGRlcGxveW1lbnQgc3RhdGUgYmxvY2sKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1Jvd0RlcGxTdGF0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIERlcGxTdGF0ZU9wdGlvblN0cmcgPT4gJERlcGxTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAnb3BlcmF0aW9uYWwnLCAnaW5jaWRlbnQnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgIyBvdXRwdXQgaW5jaWRlbnQgc3RhdGUgaW52YWxpZCBibG9jawogICAgbXkgJFJvd0luY2lTdGF0ZUludmFsaWQgPSAnJzsKICAgIGlmICggISRDb25maWdJdGVtLT57SW5jaVN0YXRlSUR9ICYmICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2F2ZScgKSB7CiAgICAgICAgJFJvd0luY2lTdGF0ZUludmFsaWQgPSAnIFNlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGdlbmVyYXRlIEluY2lTdGF0ZU9wdGlvblN0cmcKICAgIG15ICRJbmNpU3RhdGVPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgIE5hbWUgICAgICAgICA9PiAnSW5jaVN0YXRlSUQnLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgIENsYXNzICAgICAgICA9PiAnRm9ybVVwZGF0ZSBWYWxpZGF0ZV9SZXF1aXJlZCBNb2Rlcm5pemUnIC4gJFJvd0luY2lTdGF0ZUludmFsaWQsCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbmNpU3RhdGVJRH0sCiAgICApOwoKICAgICMgb3V0cHV0IGluY2lkZW50IHN0YXRlIGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3dJbmNpU3RhdGUnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBJbmNpU3RhdGVPcHRpb25TdHJnID0+ICRJbmNpU3RhdGVPcHRpb25TdHJnLAogICAgICAgIH0sCiAgICApOwoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICMgb3V0cHV0IGdyb3VwIGJsb2NrCiAgICBteSAkR3JvdXBDb25maWc7CiAgICBpZiAoICRDbGFzc1ByZWZlcmVuY2Vze0NvbmZpZ0l0ZW1Hcm91cH0gJiYgJENsYXNzUHJlZmVyZW5jZXN7Q29uZmlnSXRlbUdyb3VwfVswXSApIHsKICAgICAgICAkR3JvdXBDb25maWcgPSAkQ2xhc3NQcmVmZXJlbmNlc3tDb25maWdJdGVtR3JvdXB9WzBdOwogICAgfQogICAgaWYgKCRHcm91cENvbmZpZykgewogICAgICAgIG15ICRHcm91cExpc3Q7CiAgICAgICAgbXkgJUF1dGhHcm91cHNMaXN0ID0gJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICJydyIsCiAgICAgICAgKTsKICAgICAgICBteSAkTWFuYWdlbWVudEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJJVFNNQ29uZmlnSXRlbU1hbmFnZW1lbnRHcm91cCIpOwogICAgICAgIGlmICggJE1hbmFnZW1lbnRHcm91cCAmJiBncmVwIHsgJF8gZXEgJE1hbmFnZW1lbnRHcm91cCB9IHZhbHVlcyAlQXV0aEdyb3Vwc0xpc3QgKSB7CiAgICAgICAgICAgIG15ICVBbGxHcm91cHNMaXN0ID0gJEdyb3VwT2JqZWN0LT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICAkR3JvdXBMaXN0ID0gXCVBbGxHcm91cHNMaXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEdyb3VwTGlzdCA9IFwlQXV0aEdyb3Vwc0xpc3Q7CiAgICAgICAgfQoKICAgICAgICBteSAkVmFsaWRHcm91cHNMaXN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDb25maWdJdGVtTXVsdGl0ZW5hbmN5OjpWYWxpZEdyb3VwcycpOwogICAgICAgIGlmICgkVmFsaWRHcm91cHNMaXN0KSB7CiAgICAgICAgICAgIGZvciBteSAkR3JvdXBJRCAoIGtleXMgJEdyb3VwTGlzdC0+JSogKSB7CiAgICAgICAgICAgICAgICBpZiAoICFhbnkgeyAkXyBlcSAkR3JvdXBMaXN0LT57JEdyb3VwSUR9IH0gJFZhbGlkR3JvdXBzTGlzdC0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRHcm91cExpc3QtPnskR3JvdXBJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRJbnZhbGlkR3JvdXBzTGlzdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ29uZmlnSXRlbU11bHRpdGVuYW5jeTo6SW52YWxpZEdyb3VwcycpOwogICAgICAgIGlmICgkSW52YWxpZEdyb3Vwc0xpc3QpIHsKICAgICAgICAgICAgZm9yIG15ICRHcm91cElEICgga2V5cyAkR3JvdXBMaXN0LT4lKiApIHsKICAgICAgICAgICAgICAgIGlmICggYW55IHsgJF8gZXEgJEdyb3VwTGlzdC0+eyRHcm91cElEfSB9ICRJbnZhbGlkR3JvdXBzTGlzdC0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRHcm91cExpc3QtPnskR3JvdXBJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGdyb3VwIGludmFsaWQgYmxvY2sKICAgICAgICBteSAkUm93R3JvdXBJbnZhbGlkID0gJyc7CiAgICAgICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NhdmUnICkgewogICAgICAgICAgICBpZiAoICRHcm91cENvbmZpZyA9PSAyICYmICEkQ29uZmlnSXRlbS0+e0dyb3VwSUR9ICkgewogICAgICAgICAgICAgICAgJFJvd0dyb3VwSW52YWxpZCA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJENvbmZpZ0l0ZW0tPntHcm91cElEfSAmJiAhYW55IHsgJF8gZXEgJENvbmZpZ0l0ZW0tPntHcm91cElEfSB9IGtleXMgJEdyb3VwTGlzdC0+JSogKSB7CiAgICAgICAgICAgICAgICAkUm93R3JvdXBJbnZhbGlkID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRWYWxpZGF0ZVJlcXVpcmVkID0gJEdyb3VwQ29uZmlnID09IDIgPyAnVmFsaWRhdGVfUmVxdWlyZWQnIDogJyc7CgogICAgICAgICMgZ2VuZXJhdGUgR3JvdXBPcHRpb25TdHJnCiAgICAgICAgbXkgJEdyb3VwT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEdyb3VwTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdHcm91cElEJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAiRm9ybVVwZGF0ZSAkVmFsaWRhdGVSZXF1aXJlZCBNb2Rlcm5pemUgJFJvd0dyb3VwSW52YWxpZCIsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17R3JvdXBJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZ3JvdXAgYmxvY2sKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUm93R3JvdXAnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEdyb3VwT3B0aW9uU3RyZyA9PiAkR3JvdXBPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgTWFuZGF0b3J5Q2xhc3MgID0+ICRHcm91cENvbmZpZyA9PSAyID8gJ01hbmRhdG9yeScgOiAnJywKICAgICAgICAgICAgICAgIE1hcmtlciAgICAgICAgICA9PiAkR3JvdXBDb25maWcgPT0gMiA/ICcqJyAgICAgICAgIDogJycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgICMgZ2VuZXJhdGUgYmFzZSB1cmwKICAgIG15ICRVUkwgPSAiQWN0aW9uPVBpY3R1cmVVcGxvYWQ7Rm9ybUlEPSRTZWxmLT57Rm9ybUlEfTtDb250ZW50SUQ9IjsKCiAgICAjIHJlcGxhY2UgbGlua3MgdG8gaW5saW5lIGltYWdlcyBpbiBodG1sIGNvbnRlbnQKICAgIG15IEBJbmxpbmVBdHRhY2htZW50TGlzdDsKICAgIGlmICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IG5lICdORVcnICkgewogICAgICAgIEBJbmxpbmVBdHRhY2htZW50TGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQXR0YWNobWVudExpc3QoCiAgICAgICAgICAgIFZlcnNpb25JRCA9PiAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGZldGNoIGF0dGFjaG1lbnQgZGF0YSBhbmQgc3RvcmUgaW4gaGFzaCBmb3IgUmljaFRleHREb2N1bWVudFNlcnZlCiAgICBteSAlSW5saW5lQXR0YWNobWVudHM7CiAgICBGSUxFTkFNRToKICAgIGZvciBteSAkRmlsZW5hbWUgKEBJbmxpbmVBdHRhY2htZW50TGlzdCkgewogICAgICAgIG15ICRGaWxlRGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uQXR0YWNobWVudEdldCgKICAgICAgICAgICAgVmVyc2lvbklEID0+ICRDb25maWdJdGVtLT57VmVyc2lvbklEfSwKICAgICAgICAgICAgRmlsZW5hbWUgID0+ICRGaWxlbmFtZSwKICAgICAgICApOwoKICAgICAgICAkSW5saW5lQXR0YWNobWVudHN7ICRGaWxlRGF0YS0+e1ByZWZlcmVuY2VzfXtDb250ZW50SUR9IH0gPSAkRmlsZURhdGE7CiAgICAgICAgJElubGluZUF0dGFjaG1lbnRzeyAkRmlsZURhdGEtPntQcmVmZXJlbmNlc317Q29udGVudElEfSB9LT57Q29udGVudElEfSA9ICRGaWxlRGF0YS0+e1ByZWZlcmVuY2VzfXtDb250ZW50SUR9OwoKICAgICAgICAjIGFkZCB1cGxvYWRlZCBmaWxlIHRvIHVwbG9hZCBjYWNoZQogICAgICAgICRVcGxvYWRDYWNoZU9iamVjdC0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgRm9ybUlEICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZURhdGEtPntGaWxlbmFtZX0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRGaWxlRGF0YS0+e0NvbnRlbnR9LAogICAgICAgICAgICBDb250ZW50SUQgICA9PiAkRmlsZURhdGEtPntQcmVmZXJlbmNlc317Q29udGVudElEfSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJEZpbGVEYXRhLT57Q29udGVudFR5cGV9LAoKICAgICAgICAgICAgIyBjdXJyZW50bHksIG9ubHkgaW5saW5lIGltYWdlcyBmb3IgZGVzY3JpcHRpb24gYXJlIHN0b3JlZCBhdCB0aGUgY29uZmlnaXRlbSB2ZXJzaW9uCiAgICAgICAgICAgICMgICBzbyB3ZSBjYW4gcmVseSB1cG9uIGRlYWxpbmcgd2l0aCBpbmxpbmUgaW1hZ2VzIGhlcmUKICAgICAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2lubGluZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5lZWRlZCB0byBwcm92aWRlIG5lY2Vzc2FyeSBwYXJhbXMgZm9yIFJpY2hUZXh0RG9jdW1lbnRTZXJ2ZQogICAgbXkgJEZpZWxkQ29udGVudCA9ICRDb25maWdJdGVtLT57RGVzY3JpcHRpb259OwogICAgbXkgJURhdGEgICAgICAgICA9ICgKICAgICAgICBDb250ZW50ICAgICA9PiAkRmllbGRDb250ZW50IC8vICcnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9InV0Zi04IicsCiAgICAgICAgRGlzcG9zaXRpb24gPT4gJ2lubGluZScsCiAgICApOwoKICAgICMgcmVmb3JtYXQgcmljaCB0ZXh0IGRvY3VtZW50IHRvIGhhdmUgY29ycmVjdCBjaGFyc2V0IGFuZCBsaW5rcyB0bwogICAgIyBpbmxpbmUgZG9jdW1lbnRzCiAgICAlRGF0YSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRTZXJ2ZSgKICAgICAgICBEYXRhICAgICAgICAgICAgICAgPT4gXCVEYXRhLAogICAgICAgIFVSTCAgICAgICAgICAgICAgICA9PiAkVVJMLAogICAgICAgIEF0dGFjaG1lbnRzICAgICAgICA9PiBcJUlubGluZUF0dGFjaG1lbnRzLAogICAgICAgIExvYWRFeHRlcm5hbEltYWdlcyA9PiAxLAogICAgKTsKCiAgICAkRmllbGRDb250ZW50ID0gJERhdGF7Q29udGVudH07CgogICAgIyByZW1vdmUgYWN0aXZlIGh0bWwgY29udGVudCAoc2NyaXB0cywgYXBwbGV0cywgZXRjLi4uKQogICAgbXkgJEhUTUxVdGlsc09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKTsKICAgIG15ICVTYWZlQ29udGVudCAgICAgPSAkSFRNTFV0aWxzT2JqZWN0LT5TYWZldHkoCiAgICAgICAgU3RyaW5nICAgICAgID0+ICRGaWVsZENvbnRlbnQsCiAgICAgICAgTm9BcHBsZXQgICAgID0+IDEsCiAgICAgICAgTm9PYmplY3QgICAgID0+IDEsCiAgICAgICAgTm9FbWJlZCAgICAgID0+IDEsCiAgICAgICAgTm9JbnRTcmNMb2FkID0+IDAsCiAgICAgICAgTm9FeHRTcmNMb2FkID0+IDAsCiAgICAgICAgTm9KYXZhU2NyaXB0ID0+IDEsCiAgICApOwoKICAgICMgdGFrZSB0aGUgc2FmZSBjb250ZW50IGlmIG5lY2Vzc2FyeQogICAgaWYgKCAkU2FmZUNvbnRlbnR7UmVwbGFjZX0gKSB7CiAgICAgICAgJEZpZWxkQ29udGVudCA9ICRTYWZlQ29udGVudHtTdHJpbmd9OwogICAgfQoKICAgICMgZGV0ZWN0IGFsbCBwbGFpbiB0ZXh0IGxpbmtzIGFuZCBwdXQgdGhlbSBpbnRvIGFuIEhUTUwgPGE+IHRhZwogICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgPT4gJEZpZWxkQ29udGVudCwKICAgICk7CgogICAgIyBzZXQgdGFyZ2V0PSJfYmxhbmsiIGF0dHJpYnV0ZSB0byBhbGwgSFRNTCA8YT4gdGFncwogICAgIyB0aGUgTGlua1F1b3RlIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIGNhbGxlZCBhZ2FpbgogICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgICAgPT4gJEZpZWxkQ29udGVudCwKICAgICAgICBUYXJnZXRBZGQgPT4gMSwKICAgICk7CgogICAgIyBhZGQgbmVlZGVkIEhUTUwgaGVhZGVycwogICAgJEZpZWxkQ29udGVudCA9ICRIVE1MVXRpbHNPYmplY3QtPkRvY3VtZW50Q29tcGxldGUoCiAgICAgICAgU3RyaW5nICA9PiAkRmllbGRDb250ZW50LAogICAgICAgIENoYXJzZXQgPT4gJ3V0Zi04JywKICAgICk7CgogICAgIyBlc2NhcGUgc2luZ2xlIHF1b3RlcwogICAgJEZpZWxkQ29udGVudCA9fiBzLycvJiMzOTsvZzsKCiAgICAjIHJlbmRlciBkeW5hbWljIGZpZWxkcwogICAgbXkgJER5bmFtaWNGaWVsZEhUTUw7CiAgICBteSAlR3JvdXBMb29rdXA7CiAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9ICkgJiYgJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfXtTZWN0aW9uc30gKSB7CgogICAgICAgICMgVE9ETzogbG9vayB3aGF0IHRoaXMgd2FzL2lzIGFib3V0CiAgICAgICAgIyAgICAgICAgJFNlbGYtPntDdXN0b21lclNlYXJjaEl0ZW1JRHN9ID0gW107CgogICAgICAgICMgVE9ETzogSXQgd291bGQgYmUgbmljZSB0byBzd2l0Y2ggYmV0d2VlbiBwYWdlcyBmb3IgdGhlIGVkaXQgbWFzaywgdG9vLiBLZWVwaW5nIHRoZSBmaWVsZHMgaW4gc3luYwogICAgICAgICMgICAgICAgd2hpbGUgZWRpdGluZyBuZWVkcyBhIGJpdCBtb3JlIHByZXBhcmF0aW9uIHRob3VnaAogICAgICAgICMgVGh1cyBmb3Igbm93IG1ha2Ugc3VyZSB0byBzaG93IGR5bmFtaWMgZmllbGRzIG9ubHkgb25jZSwgZXZlbiBpZiBwcmVzZW50IG9uIG11bHRpcGxlIHBhZ2VzL3NlY3Rpb25zCiAgICAgICAgbXkgJEZpZWxkc1NlZW4gPSB7fTsKICAgICAgICBteSAkU2hvd0Rlc2NyaXB0aW9uOwogICAgICAgIG15IEBQYWdlSFRNTDsKICAgICAgICBteSAkU2VjdGlvbkhlYWRlclRlbXBsYXRlID0gJzxkaXYgY2xhc3M9IlJvdyBSb3dfU2VjdGlvbkhlYWRlciI+PGgzPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvaDM+PC9kaXY+JzsKCiAgICAgICAgUEFHRToKICAgICAgICBmb3IgbXkgJFBhZ2UgKCAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1BhZ2VzfS0+QCogKSB7CgogICAgICAgICAgICAjIEludGVyZmFjZXMgaXMgb3B0aW9uYWwsIGVmZmVjdGl2ZWx5IGRlZmF1bHQgdG8gWyAnQWdlbnQnIF0KICAgICAgICAgICAgaWYgKCAkUGFnZS0+e0ludGVyZmFjZXN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBQQUdFIHVubGVzcyBhbnkgeyAkXyBlcSAnQWdlbnQnIH0gJFBhZ2UtPntJbnRlcmZhY2VzfS0+QCo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhZ2UtPntHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJUdyb3VwTG9va3VwICkgewogICAgICAgICAgICAgICAgICAgICVHcm91cExvb2t1cCA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ3JhbnQgYWNjZXNzIHRvIHRoZSBwYWdlIG9ubHkgd2hlbiB0aGUgdXNlciBpcyBpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBncm91cHMKICAgICAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgYW55IHsgJEdyb3VwTG9va3VweyRffSB9ICRQYWdlLT57R3JvdXBzfS0+QCo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRQYWdlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgICAgIFNFQ1RJT046CiAgICAgICAgICAgIGZvciBteSAkU2VjdGlvbkNvbmZpZyAoICRQYWdlLT57Q29udGVudH0tPkAqICkgewogICAgICAgICAgICAgICAgbXkgJFNlY3Rpb24gPSAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1NlY3Rpb25zfXsgJFNlY3Rpb25Db25maWctPntTZWN0aW9ufSB9OwoKICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTiB1bmxlc3MgJFNlY3Rpb247CiAgICAgICAgICAgICAgICBpZiAoICRTZWN0aW9uLT57VHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VjdGlvbi0+e1R5cGV9IGVxICdEZXNjcmlwdGlvbicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTaG93RGVzY3JpcHRpb24gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRTZWN0aW9uLT57VHlwZX0gbmUgJ0R5bmFtaWNGaWVsZHMnICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgd2VlZCBvdXQgbXVsdGlwbGUgb2NjdXJyZW5jZXMgb2YgZHluYW1pYyBmaWVsZHMgLSBzZWUgY29tbWVudCBhYm92ZQogICAgICAgICAgICAgICAgJFNlY3Rpb24tPntDb250ZW50fSA9ICRTZWxmLT5fRGlzY2FyZEZpZWxkc1NlZW4oCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkU2VjdGlvbi0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgIFNlZW4gICAgPT4gJEZpZWxkc1NlZW4sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZG8gbm90IHByb2NlZWQgaWYgY29udGVudCBpcyBlbXB0eQogICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OIHVubGVzcyAkU2VjdGlvbi0+e0NvbnRlbnR9LT5AKjsKCiAgICAgICAgICAgICAgICBteSAkSFRNTCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpEeW5hbWljRmllbGQ6Ok1hc2snKS0+RWRpdFNlY3Rpb25SZW5kZXIoCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCAgICAgICAgICAgICAgPT4gJFNlY3Rpb24tPntDb250ZW50fSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzICAgICAgICA9PiAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0sCiAgICAgICAgICAgICAgICAgICAgVXBkYXRhYmxlRmllbGRzICAgICAgPT4gXEBVcGRhdGFibGVGaWVsZHMsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkVmFsdWVzICAgPT4gJEdldFBhcmFte0R5bmFtaWNGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVWYWx1ZXNGaWx0ZXIgPT4gXCVEeW5hbWljRmllbGRQb3NzaWJsZVZhbHVlcywKICAgICAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgICAgICAgICA9PiBcJUR5bmFtaWNGaWVsZFZhbGlkYXRpb25SZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICAgICAgPT4gXCVEeW5hbWljRmllbGRWaXNpYmlsaXR5LAogICAgICAgICAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc30sCiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXtEeW5hbWljRmllbGR9LT4lKiwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT04gdW5sZXNzICRIVE1MID1+IC9cdy87CgogICAgICAgICAgICAgICAgbXkgKCRTZWN0aW9uSGVhZGVyKSA9IGdyZXAgeyAkXy0+e0hlYWRlcn0gfSAkU2VjdGlvbi0+e0NvbnRlbnR9LT5AKjsKICAgICAgICAgICAgICAgIGlmICgkU2VjdGlvbkhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICRQYWdlRHluYW1pY0ZpZWxkSFRNTCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWN0aW9uSGVhZGVyVGVtcGxhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFNlY3Rpb25IZWFkZXItPntIZWFkZXJ9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhZ2VEeW5hbWljRmllbGRIVE1MIC49ICRIVE1MOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IFBBR0UgdW5sZXNzICRQYWdlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgICAgIHB1c2ggQFBhZ2VIVE1MLCB7CiAgICAgICAgICAgICAgICBIVE1MID0+ICRQYWdlRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhZ2UtPntOYW1lfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15IEBBY3RpdmVEeW5hbWljRmllbGRzID0gKCBrZXlzICRGaWVsZHNTZWVuLT4lKiApOwoKICAgICAgICAjIHN0b3JlIHRoZSBhY3RpdmUgZHluYW1pYyBmaWVsZHMsIHRvIG9ubHkgdmFsaWRhdGUgdGhvc2UKICAgICAgICAkRm9ybUNhY2hlT2JqZWN0LT5TZXRGb3JtRGF0YSgKICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnQWN0aXZlRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiBcQEFjdGl2ZUR5bmFtaWNGaWVsZHMsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBzY2FsYXIgQFBhZ2VIVE1MID4gMSApIHsKICAgICAgICAgICAgbXkgJEhlYWRlclRlbXBsYXRlID0KICAgICAgICAgICAgICAgICc8c3VtbWFyeT4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJvdyBSb3dfUGFnZUhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9ImZhIGZhLWNhcmV0LXJpZ2h0Ij48L2k+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJmYSBmYS1jYXJldC1kb3duIj48L2k+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGgyPlslIFRyYW5zbGF0ZShEYXRhLk5hbWUpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICAgICAgPGhyLz4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3N1bW1hcnk+JzsKCiAgICAgICAgICAgIGZvciBteSAkUGFnZSAoQFBhZ2VIVE1MKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTCAuPSAnPGRldGFpbHMgY2xhc3M9IlBhZ2VDb250ZW50Ij4nOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUwgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRIZWFkZXJUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhZ2UtPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MIC49ICRQYWdlLT57SFRNTH07CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTCAuPSAnPC9kZXRhaWxzPic7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkU2hvd0Rlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTCAuPSAnPGRldGFpbHMgY2xhc3M9IlBhZ2VDb250ZW50Ij4nOwogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUwgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRIZWFkZXJUZW1wbGF0ZSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0Rlc2NyaXB0aW9uJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoQFBhZ2VIVE1MKSB7CiAgICAgICAgICAgICREeW5hbWljRmllbGRIVE1MIC49ICRQYWdlSFRNTFswXXtIVE1MfTsKICAgICAgICB9CgogICAgICAgIGlmICgkU2hvd0Rlc2NyaXB0aW9uKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUm93RGVzY3JpcHRpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEZpZWxkQ29udGVudCAvLyAnJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgIG15IEBBbGxBdHRhY2htZW50c0xpc3QgPSAkVXBsb2FkQ2FjaGVPYmplY3QtPkZvcm1JREdldEFsbEZpbGVzTWV0YSgKICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgKTsKCiAgICAjIGV4Y2x1ZGUgaW5saW5lIGF0dGFjaG1lbnRzIGFzIHRoZXkgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQogICAgJFBhcmFte0F0dGFjaG1lbnRMaXN0fSA9IFsgZ3JlcCB7ICRfLT57RGlzcG9zaXRpb259IG5lICdpbmxpbmUnIH0gQEFsbEF0dGFjaG1lbnRzTGlzdCBdOwoKICAgICMgVE9ETyBtYXliZSByZXN0cmljdCB0aGlzIHRvIG9ubHkgaWYgZGYgcmljaHRleHQgYXJlIHRvIGJlIGRpc3BsYXllZAogICAgIyBhZGQgcmljaCB0ZXh0IGVkaXRvcgogICAgaWYgKCAkTGF5b3V0T2JqZWN0LT57QnJvd3NlclJpY2hUZXh0fSApIHsKCiAgICAgICAgIyB1c2UgaGVpZ2h0L3dpZHRoIGRlZmluZWQgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgJFBhcmFte1JpY2hUZXh0SGVpZ2h0fSA9ICRTZWxmLT57Q29uZmlnfXtSaWNoVGV4dEhlaWdodH0gfHwgMDsKICAgICAgICAkUGFyYW17UmljaFRleHRXaWR0aH0gID0gJFNlbGYtPntDb25maWd9e1JpY2hUZXh0V2lkdGh9ICB8fCAwOwoKICAgICAgICAjIHNldCB1cCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgJExheW91dE9iamVjdC0+U2V0UmljaFRleHRQYXJhbWV0ZXJzKAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICggJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9ICYmICRDb25maWdJdGVtLT57Q29uZmlnSXRlbUlEfSBuZSAnTkVXJyApIHx8ICREdXBsaWNhdGVJRCApIHsKCiAgICAgICAgIyBvdXRwdXQgYmxvY2sKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhcnRTbWFsbCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnRW5kU21hbGwnICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgIHJldHVybiBqb2luICcnLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0VkaXQnKSwKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQnLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkSFRNTCA9PiAkRHluYW1pY0ZpZWxkSFRNTCwKICAgICAgICAgICAgICAgICAgICBEdXBsaWNhdGVJRCAgICAgID0+ICREdXBsaWNhdGVJRCwKICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBOZWNlc3Nhcnkgc3R1ZmYgZm9yIEFkZCBOZXcKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgZGVsZXRlICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gaWYgISRIYXNBY2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIENsYXNzT3B0aW9uU3RyZwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRCcsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdXMTAwcGMnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJENvbmZpZ0l0ZW0tPntDbGFzc0lEfSwKICAgICAgICApOwoKICAgICAgICAjIEVuZCBOZWNlc3Nhcnkgc3R1ZmYgZm9yIEFkZCBOZXcKCiAgICAgICAgIyBvdXRwdXQgYmxvY2sKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3RhcnROb3JtYWwnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0VuZE5vcm1hbCcgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRWRpdCcpLAogICAgICAgICAgICApLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0JywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICV7JENvbmZpZ0l0ZW19LAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZEhUTUwgPT4gJER5bmFtaWNGaWVsZEhUTUwsCiAgICAgICAgICAgICAgICAgICAgRHVwbGljYXRlSUQgICAgICA9PiAkRHVwbGljYXRlSUQsCiAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApLAogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Gb290ZXI7CiAgICB9Cn0KCnN1YiBfRGlzY2FyZEZpZWxkc1NlZW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29udGVudDsKICAgIG15ICRSZWYgPSByZWYgJFBhcmFte0NvbnRlbnR9OwoKICAgIGlmICggJFJlZiBlcSAnQVJSQVknICkgewogICAgICAgIG15IEBDbGVhbmVkQXJyYXk7CgogICAgICAgIEVMRU1FTlQ6CiAgICAgICAgZm9yIG15ICRFbGVtZW50ICggJFBhcmFte0NvbnRlbnR9LT5AKiApIHsKICAgICAgICAgICAgbXkgJFJlZkVsZW1lbnQgPSByZWYgJEVsZW1lbnQ7CgogICAgICAgICAgICBpZiAoICRSZWZFbGVtZW50IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDbGVhbmVkQXJyYXksICRTZWxmLT5fRGlzY2FyZEZpZWxkc1NlZW4oCiAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBTZWVuICAgID0+ICRQYXJhbXtTZWVufSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UOwogICAgICAgICAgICB9CgogICAgICAgICAgICBlbHNpZiAoICRSZWZFbGVtZW50IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIGlmICggISRFbGVtZW50LT57REZ9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQENsZWFuZWRBcnJheSwgJFNlbGYtPl9EaXNjYXJkRmllbGRzU2VlbigKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkRWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgU2VlbiAgICA9PiAkUGFyYW17U2Vlbn0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1NlZW59eyAkRWxlbWVudC0+e0RGfSB9KysgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTEVNRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBDbGVhbmVkQXJyYXksICRFbGVtZW50OwogICAgICAgIH0KCiAgICAgICAgJENvbnRlbnQgPSBcQENsZWFuZWRBcnJheTsKICAgIH0KCiAgICBlbHNpZiAoICRSZWYgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVDbGVhbmVkSGFzaDsKCiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICRQYXJhbXtDb250ZW50fS0+JSogKSB7CiAgICAgICAgICAgICRDbGVhbmVkSGFzaHskS2V5fSA9ICRTZWxmLT5fRGlzY2FyZEZpZWxkc1NlZW4oCiAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRQYXJhbXtDb250ZW50fXskS2V5fSwKICAgICAgICAgICAgICAgIFNlZW4gICAgPT4gJFBhcmFte1NlZW59LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJENvbnRlbnQgPSBcJUNsZWFuZWRIYXNoOwogICAgfQoKICAgIGVsc2UgewogICAgICAgICRDb250ZW50ID0gJFBhcmFte0NvbnRlbnR9OwogICAgfQoKICAgIHJldHVybiAkQ29udGVudDsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentITSMConfigItemSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtU2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudElUU01Db25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55IHVuaXEpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRPdXRwdXQ7CgogICAgIyBnZXQgbmVjZXNzYXJ5IG9iamVjdHMKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFNlYXJjaFByb2ZpbGVPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNlYXJjaFByb2ZpbGUnKTsKCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgIyB1c2UgY29sdW1uIGNvbmZpZ3MgZnJvbSBBZ2VudElUU01Db25maWdJdGVtCiAgICAkU2VsZi0+e0NvbmZpZ317Q2xhc3NDb2x1bW5zQXZhaWxhYmxlfSA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpBZ2VudElUU01Db25maWdJdGVtJyktPntDbGFzc0NvbHVtbnNBdmFpbGFibGV9OwogICAgJFNlbGYtPntDb25maWd9e0NsYXNzQ29sdW1uc0RlZmF1bHR9ICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6QWdlbnRJVFNNQ29uZmlnSXRlbScpLT57Q2xhc3NDb2x1bW5zRGVmYXVsdH07CgogICAgIyBnZXQgY29uZmlnIGRhdGEKICAgICRTZWxmLT57U3RhcnRIaXR9ICAgID0gaW50KCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMSApOwogICAgJFNlbGYtPntTZWFyY2hMaW1pdH0gPSAkU2VsZi0+e0NvbmZpZ30tPntTZWFyY2hMaW1pdH0gfHwgMTAwMDA7CiAgICAkU2VsZi0+e1NvcnRCeX0gICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTb3J0QnknICkKICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ30tPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnTnVtYmVyJzsKICAgICRTZWxmLT57T3JkZXJCeX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnT3JkZXJCeScgKQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnfS0+eydPcmRlcjo6RGVmYXVsdCd9CiAgICAgICAgfHwgJ0Rvd24nOwogICAgJFNlbGYtPntQcm9maWxlfSAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUHJvZmlsZScgKSAgICAgfHwgJyc7CiAgICAkU2VsZi0+e1NhdmVQcm9maWxlfSAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTYXZlUHJvZmlsZScgKSB8fCAnJzsKICAgICRTZWxmLT57VGFrZUxhc3RTZWFyY2h9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rha2VMYXN0U2VhcmNoJyApOwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGFjY2VzcyByaWdodHMgb24gdGhlIGNsYXNzZXMKICAgIGZvciBteSAkQ2xhc3NJRCAoIHNvcnQga2V5cyAleyRDbGFzc0xpc3R9ICkgewogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBkZWxldGUgJENsYXNzTGlzdC0+eyRDbGFzc0lEfSBpZiAhJEhhc0FjY2VzczsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBpZAogICAgbXkgJENsYXNzSUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xhc3NJRCcgKTsKCiAgICAjIGNoZWNrIGlmIGNsYXNzIGlkIGlzIHZhbGlkCiAgICBpZiAoICRDbGFzc0lEICYmICEkQ2xhc3NMaXN0LT57JENsYXNzSUR9ICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ0ludmFsaWQgQ2xhc3NJRCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgc2luZ2xlIHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgbXkgJERlZmluaXRpb247CgogICAgaWYgKCRDbGFzc0lEKSB7CgogICAgICAgICMgc2V0IGZpbHRlciBwYXJhbXMgZm9yIHNob3dpbmcgY29ycmVjdCBjb2x1bW5zCiAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfTsKICAgICAgICAkU2VsZi0+e0ZpbHRlcnN9LT4lKiA9IG1hcCB7CiAgICAgICAgICAgICRfID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gJF8sCiAgICAgICAgICAgIH0KICAgICAgICB9IHZhbHVlcyAkQ2xhc3NMaXN0LT4lKjsKCiAgICAgICAgIyBnZXQgY3VycmVudCBkZWZpbml0aW9uCiAgICAgICAgJERlZmluaXRpb24gPSAkQ29uZmlnSXRlbU9iamVjdC0+RGVmaW5pdGlvbkdldCgKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICApOwoKICAgICAgICAjIGFib3J0LCBpZiBubyBkZWZpbml0aW9uIGlzIGRlZmluZWQKICAgICAgICBpZiAoICEkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25JRH0gKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdObyBkZWZpbml0aW9uIHdhcyBkZWZpbmVkIGZvciBjbGFzcyAlcyEnLCAkQ2xhc3NJRCApLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVNldElubmVyRmllbGRzOwogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0tPiUqICkgewogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnU2V0JzsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317SW5jbHVkZX0gKTsKCiAgICAgICAgICAgICMgaXRlcmF0ZSB0aGUgZW50aXJlIEluY2x1ZGUgc3RydWN0dXJlIHRvIGdldCB0aGUgdmVyc2lvbmVkIGR5bmFtaWMgZmllbGQgY29uZmlncwogICAgICAgICAgICBJTkNMVURFRUxFTUVOVDoKICAgICAgICAgICAgZm9yIG15ICRJbmNsdWRlRWxlbWVudCAoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0luY2x1ZGV9LT5AKiApIHsKCiAgICAgICAgICAgICAgICBpZiAoICRJbmNsdWRlRWxlbWVudC0+e0RGfSApIHsKICAgICAgICAgICAgICAgICAgICAkSW5jbHVkZUVsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSAuICc6OicKICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRJbmNsdWRlRWxlbWVudC0+e0RlZmluaXRpb259e0xhYmVsfSApOwogICAgICAgICAgICAgICAgICAgICRTZXRJbm5lckZpZWxkc3sgJEluY2x1ZGVFbGVtZW50LT57REZ9IH0gPSAkSW5jbHVkZUVsZW1lbnQtPntEZWZpbml0aW9ufTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJEluY2x1ZGVFbGVtZW50LT57R3JpZH0gKSB7CgogICAgICAgICAgICAgICAgICAgIG5leHQgSU5DTFVERUVMRU1FTlQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCAkSW5jbHVkZUVsZW1lbnQtPntHcmlkfSApOwogICAgICAgICAgICAgICAgICAgIG5leHQgSU5DTFVERUVMRU1FTlQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSggJEluY2x1ZGVFbGVtZW50LT57R3JpZH17Um93c30gKTsKCiAgICAgICAgICAgICAgICAgICAgUk9XOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUm93ICggJEluY2x1ZGVFbGVtZW50LT57R3JpZH17Um93c30tPkAqICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBST1cgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSgkUm93KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIFJPV0VMRU1FTlQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUm93RWxlbWVudCAoICRSb3ctPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkUm93RWxlbWVudC0+e0RGfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUm93RWxlbWVudC0+e0RlZmluaXRpb259e0xhYmVsfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApIC4gJzo6JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJFJvd0VsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2V0SW5uZXJGaWVsZHN7ICRSb3dFbGVtZW50LT57REZ9IH0gPSAkUm93RWxlbWVudC0+e0RlZmluaXRpb259OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0gPSB7CiAgICAgICAgICAgICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSosCiAgICAgICAgICAgICVTZXRJbm5lckZpZWxkcywKICAgICAgICB9OwoKICAgICAgICAjIGxvYWQgcHJvZmlsZXMgc3RyaW5nIHBhcmFtcwogICAgICAgIGlmICggKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0xvYWRQcm9maWxlJyAmJiAkU2VsZi0+e1Byb2ZpbGV9ICkgfHwgJFNlbGYtPntUYWtlTGFzdFNlYXJjaH0gKSB7CiAgICAgICAgICAgICVHZXRQYXJhbSA9ICRTZWFyY2hQcm9maWxlT2JqZWN0LT5TZWFyY2hQcm9maWxlR2V0KAogICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICAgICAgTmFtZSAgICAgID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjb252ZXJ0IGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSAmJiByZWYgJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9ID0gam9pbiAnOycsIEB7ICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9IH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IGRlZmF1bHQgcGFyYW1zIG9mIGRlZmF1bHQgYXR0cmlidXRlcwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30gKSB7CiAgICAgICAgICAgICAgICBLRVk6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdEeW5hbWljRmllbGQnOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL14oQ29uZmlnSXRlbSkoQ3JlYXRlfENoYW5nZSkvICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSBASXRlbXMgPSBzcGxpdCAvOy8sICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICggJEtleSwgJFZhbHVlICkgPSBzcGxpdCAvPS8sICRJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9IHx8PSAkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSB8fD0gJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBzdHJpbmcgcGFyYW1zIChnZXQgc3VibWl0dGVkIHBhcmFtcykKICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KE51bWJlciBOYW1lIFJlc3VsdEZvcm0gU2hvd25BdHRyaWJ1dGVzKSkgewoKICAgICAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBzdHJpbmcgcGFyYW1zIChnZXQgc3VibWl0dGVkIHBhcmFtcykKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKCiAgICAgICAgICAgICAgICAjIHJlbW92ZSB3aGl0ZSBzcGFjZSBvbiB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBhcnJheSBwYXJhbXMKICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KERlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMpKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgc2VhcmNoIGFycmF5IHBhcmFtcyAoZ2V0IHN1Ym1pdHRlZCBwYXJhbXMpCiAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgICAgICAgICBpZiAoQEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgRHluYW1pYyBmaWVsZHMgZnJvbSBwYXJhbSBvYmplY3QKICAgICAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0tPiUqICkgewogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkU2VsZi0+e0NvbmZpZ317RHluYW1pY0ZpZWxkfXsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgICAgICAgICAgIyBnZXQgc2VhcmNoIGZpZWxkIHByZWZlcmVuY2VzCiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICAgICAgZm9yIG15ICRQcmVmZXJlbmNlICggQHskU2VhcmNoRmllbGRQcmVmZXJlbmNlc30gKSB7CgogICAgICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5Qcm9maWxlU3RydWN0dXJlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHRoZSBjb21wbGV0ZSB2YWx1ZSBzdHJ1Y3R1cmUgaW4gR2V0UGFyYW0gdG8gc3RvcmUgaXQgbGF0ZXIgaW4gdGhlIHNlYXJjaCBwcm9maWxlCiAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0gPSAoICVHZXRQYXJhbSwgJXskRHluYW1pY0ZpZWxkVmFsdWV9ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgZGVsZXRlIHNlYXJjaCBwcm9maWxlcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhQcm9maWxlRGVsZXRlJyApIHsKCiAgICAgICAgIyByZW1vdmUgb2xkIHByb2ZpbGUgc3R1ZmYKICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IDEsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBpbml0IHNlYXJjaCBkaWFsb2cgKHNlbGVjdCBjbGFzcykKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBSkFYJyApIHsKCiAgICAgICAgbXkgJEVtcHR5U2VhcmNoID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0VtcHR5U2VhcmNoJyApOwogICAgICAgIGlmICggISRTZWxmLT57UHJvZmlsZX0gKSB7CiAgICAgICAgICAgICRFbXB0eVNlYXJjaCA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBkZWZhdWx0IHBhcmFtcyBvZiBkZWZhdWx0IGF0dHJpYnV0ZXMKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30gKSB7CgogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICEkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5IGVxICdEeW5hbWljRmllbGQnOwoKICAgICAgICAgICAgICAgIGlmICggJEtleSA9fiAvXihDb25maWdJdGVtKShDcmVhdGV8Q2hhbmdlKS8gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEl0ZW1zID0gc3BsaXQgLzsvLCAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9LT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgKCAkS2V5LCAkVmFsdWUgKSA9IHNwbGl0IC89LywgJEl0ZW07CiAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSB8fD0gJFZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSB8fD0gJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdlbmVyYXRlIGRyb3Bkb3duIGZvciBzZWxlY3RpbmcgdGhlIGNsYXNzCiAgICAgICAgIyBhdXRvbWF0aWNhbGx5IHNob3cgc2VhcmNoIG1hc2sgYWZ0ZXIgc2VsZWN0aW5nIGEgY2xhc3MgdmlhIEFKQVgKICAgICAgICBteSAkQ2xhc3NPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkQ2xhc3NMaXN0LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlYXJjaENsYXNzSUQnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzc0lEIHx8ICcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgaHRtbCBzZWFyY2ggbWFzayBvdXRwdXQKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoQUpBWCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIEVtcHR5U2VhcmNoICAgICA9PiAkRW1wdHlTZWFyY2gsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGVtcGxhdGUKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIHNldCBzZWFyY2ggZmllbGRzIGZvciBzZWxlY3RlZCBjbGFzcwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnIHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnTG9hZFByb2ZpbGUnICkgewoKICAgICAgICAjIENsYXNzSUQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzZWFyY2ggbWFzayBhbmQgZm9yIGFjdHVhbCBzZWFyY2hpbmcKICAgICAgICBpZiAoICEkQ2xhc3NJRCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENsYXNzSUQgaXMgZ2l2ZW4hJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIHVzZXIgaXMgYWxsb3dlZCB0byBzZWFyY2ggY2xhc3MKICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIHNjcmVlbgogICAgICAgIGlmICggISRIYXNBY2Nlc3MgKSB7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBhY2Nlc3MgcmlnaHRzIGZvciB0aGlzIGNsYXNzIGdpdmVuIScpLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZGVmYXVsdCBwYXJhbXMgb2YgZGVmYXVsdCBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9ICkgewoKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NvbmZpZ317RGVmYXVsdHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnRHluYW1pY0ZpZWxkJzsKCiAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL14oQ29uZmlnSXRlbSkoQ3JlYXRlfENoYW5nZSkvICkgewogICAgICAgICAgICAgICAgICAgIG15IEBJdGVtcyA9IHNwbGl0IC87LywgJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEl0ZW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICggJEtleSwgJFZhbHVlICkgPSBzcGxpdCAvPS8sICRJdGVtOwogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gfHw9ICRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JEtleX0gfHw9ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjb252ZXJ0IGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSAmJiByZWYgJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9ID0gam9pbiAnOycsIEB7ICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9IH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVE9ETyBtYXliZSBuaWNlciB0byBoYXZlIHRoaXMgYWxzbyBpbiBhIHN5c2NvbmZpZyBzZXR0aW5nCiAgICAgICAgIyBpbml0aWFsaXppbmcgd2l0aCBjb21tb24gYXR0cmlidXRlcwogICAgICAgIG15IEBBdHRyaWJ1dGVzID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnTnVtYmVyJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTnVtYmVyJyksCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSAgID0+ICdOYW1lJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnTmFtZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnRGVwbG95bWVudCBTdGF0ZScpLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnSW5jaVN0YXRlSURzJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIHdhbGsgdGhyb3VnaCBkZWZpbml0aW9uIHRvIGNoZWNrIHBlcm1pc3Npb25zIG9uIHBhZ2VzIHdoaWNoIGNvbnRhaW4gZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICVQZXJtaXR0ZWREeW5hbWljRmllbGRzOwogICAgICAgIG15ICVHcm91cExvb2t1cDsKCiAgICAgICAgUEFHRToKICAgICAgICBmb3IgbXkgJFBhZ2UgKCAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1BhZ2VzfS0+QCogKSB7CgogICAgICAgICAgICAjIEludGVyZmFjZXMgaXMgb3B0aW9uYWwsIGVmZmVjdGl2ZWx5IGRlZmF1bHQgdG8gWyAnQWdlbnQnIF0KICAgICAgICAgICAgaWYgKCAkUGFnZS0+e0ludGVyZmFjZXN9ICkgewogICAgICAgICAgICAgICAgbmV4dCBQQUdFIHVubGVzcyBhbnkgeyAkXyBlcSAnQWdlbnQnIH0gJFBhZ2UtPntJbnRlcmZhY2VzfS0+QCo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJFBhZ2UtPntHcm91cHN9ICkgewogICAgICAgICAgICAgICAgaWYgKCAhJUdyb3VwTG9va3VwICkgewogICAgICAgICAgICAgICAgICAgICVHcm91cExvb2t1cCA9IHJldmVyc2UgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZ3JhbnQgYWNjZXNzIHRvIHRoZSBwYWdlIG9ubHkgd2hlbiB0aGUgdXNlciBpcyBpbiBvbmUgb2YgdGhlIHNwZWNpZmllZCBncm91cHMKICAgICAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgYW55IHsgJEdyb3VwTG9va3VweyRffSB9ICRQYWdlLT57R3JvdXBzfS0+QCo7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNFQ1RJT046CiAgICAgICAgICAgIGZvciBteSAkU2VjdGlvbkNvbmZpZyAoICRQYWdlLT57Q29udGVudH0tPkAqICkgewogICAgICAgICAgICAgICAgbXkgJFNlY3Rpb24gPSAkRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9e1NlY3Rpb25zfXsgJFNlY3Rpb25Db25maWctPntTZWN0aW9ufSB9OwoKICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTiB1bmxlc3MgJFNlY3Rpb247CiAgICAgICAgICAgICAgICBpZiAoICRTZWN0aW9uLT57VHlwZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VjdGlvbi0+e1R5cGV9IG5lICdEeW5hbWljRmllbGRzJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBwcm9jZWVkIGlmIGNvbnRlbnQgaXMgZW1wdHkKICAgICAgICAgICAgICAgIG5leHQgU0VDVElPTiB1bmxlc3MgJFNlY3Rpb24tPntDb250ZW50fS0+QCo7CgogICAgICAgICAgICAgICAgbXkgJFNlY3Rpb25ERnMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0TWFzaygKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRTZWN0aW9uLT57Q29udGVudH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRTZWN0aW9uREZzKSApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJERGTmFtZSAoICRTZWN0aW9uREZzLT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBlcm1pdHRlZER5bmFtaWNGaWVsZHN7JERGTmFtZX0gPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIyBhbHNvIGluY2x1ZGUgU2V0LWlubmVyIGZpZWxkcwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskREZOYW1lfXtGaWVsZFR5cGV9IGVxICdTZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFNldElubmVyRmllbGRzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdE1hc2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn17JERGTmFtZX17Q29uZmlnfXtJbmNsdWRlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFNldElubmVyRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJElubmVyREYgKCAkU2V0SW5uZXJGaWVsZHMtPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUGVybWl0dGVkRHluYW1pY0ZpZWxkc3skSW5uZXJERn0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICREeW5hbWljRmllbGRTZXBhcmF0b3IgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBkeW5hbWljIGZpZWxkcyBzZWFyY2ggb3B0aW9ucyBmb3IgYXR0cmlidXRlIHNlbGVjdAogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgZGVmaW5pdGlvbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHNvcnQgeyAkYS0+e0xhYmVsfSBjbXAgJGItPntMYWJlbH0gfSB2YWx1ZXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJFNlbGYtPntDb25maWd9e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJFBlcm1pdHRlZER5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAgICAgIyBjcmVhdGUgYSBzZXBhcmF0b3IgZm9yIGR5bmFtaWMgZmllbGRzIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKCREeW5hbWljRmllbGRTZXBhcmF0b3IpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dHJpYnV0ZXMsICgKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAnLScsCiAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkU2VwYXJhdG9yID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgc2VhcmNoIGZpZWxkIHByZWZlcmVuY2VzCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZFByZWZlcmVuY2VzID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZpZWxkUHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMpOwoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIGR5bmFtaWMgZmllbGQgbGFiZWwKICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZWREeW5hbWljRmllbGRMYWJlbCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICBmb3IgbXkgJFByZWZlcmVuY2UgKCBAeyRTZWFyY2hGaWVsZFByZWZlcmVuY2VzfSApIHsKCiAgICAgICAgICAgICAgICAjIHRyYW5zbGF0ZSB0aGUgc3VmZml4CiAgICAgICAgICAgICAgICBteSAkVHJhbnNsYXRlZFN1ZmZpeCA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZS0+e0xhYmVsU3VmZml4fSwKICAgICAgICAgICAgICAgICkgfHwgJyc7CgogICAgICAgICAgICAgICAgaWYgKCRUcmFuc2xhdGVkU3VmZml4KSB7CiAgICAgICAgICAgICAgICAgICAgJFRyYW5zbGF0ZWRTdWZmaXggPSAnICgnIC4gJFRyYW5zbGF0ZWRTdWZmaXggLiAnKSc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcHVzaCBAQXR0cmlidXRlcywgKAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0+ICdTZWFyY2hfRHluYW1pY0ZpZWxkXycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRQcmVmZXJlbmNlLT57VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRUcmFuc2xhdGVkRHluYW1pY0ZpZWxkTGFiZWwgLiAkVHJhbnNsYXRlZFN1ZmZpeCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgSFRNTCBzdHJpbmdzIGZvciBhbGwgZHluYW1pYyBmaWVsZHMKICAgICAgICBteSAlRHluYW1pY0ZpZWxkSFRNTDsKCiAgICAgICAgIyBjeWNsZSB0cm91Z2ggdGhlIGFjdGl2YXRlZCBEeW5hbWljIEZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJFNlbGYtPntDb25maWd9e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJFBlcm1pdHRlZER5bmFtaWNGaWVsZHN7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9OwoKICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzRmlsdGVyOwoKICAgICAgICAgICAgbXkgJElzQUNMUmVkdWNpYmxlID0gJEJhY2tlbmRPYmplY3QtPkhhc0JlaGF2aW9yKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBQb3NzaWJsZVZhbHVlcwogICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGZpZWxkIGhhcyBQb3NzaWJsZVZhbHVlcyBwcm9wZXJ0eSBpbiBpdHMgY29uZmlndXJhdGlvbgogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpICkgewoKICAgICAgICAgICAgICAgICAgICAjIGdldCBoaXN0b3JpY2FsIHZhbHVlcyBmcm9tIGRhdGFiYXNlCiAgICAgICAgICAgICAgICAgICAgbXkgJEhpc3RvcmljYWxWYWx1ZXMgPSAkQmFja2VuZE9iamVjdC0+SGlzdG9yaWNhbFZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJERhdGEgPSAkUG9zc2libGVWYWx1ZXM7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGhpc3RvcmljIHZhbHVlcyB0byBjdXJyZW50IHZhbHVlcyAoaWYgdGhleSBkb24ndCBleGlzdCBhbnltb3JlKQogICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJEhpc3RvcmljYWxWYWx1ZXMpICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRIaXN0b3JpY2FsVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISREYXRhLT57JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGEtPnskS2V5fSA9ICRIaXN0b3JpY2FsVmFsdWVzLT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY29udmVydCBwb3NzaWJsZSB2YWx1ZXMga2V5ID0+IHZhbHVlIHRvIGtleSA9PiBrZXkgZm9yIEFDTHMgdXNpbmcgYSBIYXNoIHNsaWNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUFjbERhdGEgPSAleyREYXRhfTsKICAgICAgICAgICAgICAgICAgICBAQWNsRGF0YXsga2V5cyAlQWNsRGF0YSB9ID0ga2V5cyAlQWNsRGF0YTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgcG9zc2libGUgdmFsdWVzIGZpbHRlciBmcm9tIEFDTHMKICAgICAgICAgICAgICAgICAgICBteSAkQUNMID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BY2woCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5UeXBlICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgPT4gJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgID0+IFwlQWNsRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJERhdGEtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZWFyY2ggZmllbGQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICBmb3IgbXkgJFByZWZlcmVuY2UgKCBAeyRTZWFyY2hGaWVsZFByZWZlcmVuY2VzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmaWVsZCBIVE1MCiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSFRNTHsgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJFByZWZlcmVuY2UtPntUeXBlfSB9ID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZpZWxkUmVuZGVyKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyAgID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgUHJvZmlsZSAgICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZVZhbHVlc0ZpbHRlciA9PiAkUG9zc2libGVWYWx1ZXNGaWx0ZXIsCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdFZhbHVlICAgICAgICAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfXtEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgYXR0cmlidXRlcyBzdHJpbmcgZm9yIGF0dHJpYnV0ZXMgbGlzdAogICAgICAgICRQYXJhbXtBdHRyaWJ1dGVzU3RyZ30gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQXR0cmlidXRlJywKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGF0dHJpYnV0ZXMgc3RyaW5nIGZvciByZWNvdmVyeSBvbiBhZGQgb3Igc3VidHJhY3Qgc2VhcmNoIGZpZWxkcwogICAgICAgICRQYXJhbXtBdHRyaWJ1dGVzT3JpZ1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXEBBdHRyaWJ1dGVzLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0F0dHJpYnV0ZU9yaWcnLAogICAgICAgICAgICBNdWx0aXBsZSAgICAgPT4gMCwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgIG15ICVQcm9maWxlcyA9ICRTZWFyY2hQcm9maWxlT2JqZWN0LT5TZWFyY2hQcm9maWxlTGlzdCgKICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFNlbGYtPntVc2VyTG9naW59LAogICAgICAgICk7CgogICAgICAgICRQYXJhbXtQcm9maWxlc1N0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVByb2ZpbGVzLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1Byb2ZpbGUnLAogICAgICAgICAgICBJRCAgICAgICAgICAgPT4gJ1NlYXJjaFByb2ZpbGUnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlIGxpc3QKICAgICAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGRlcGxveW1lbnQgc3RhdGVzCiAgICAgICAgbXkgJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiAkRGVwbFN0YXRlTGlzdCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGVwbFN0YXRlSURzJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17RGVwbFN0YXRlSURzfSB8fCBbXSwKICAgICAgICAgICAgU2l6ZSAgICAgICA9PiA1LAogICAgICAgICAgICBNdWx0aXBsZSAgID0+IDEsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGluY2lkZW50IHN0YXRlcwogICAgICAgIG15ICRDdXJJbmNpU3RhdGVPcHRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJEluY2lTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEdldFBhcmFte0luY2lTdGF0ZUlEc30gfHwgW10sCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gNSwKICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICBDbGFzcyAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgb3V0cHV0IGZvcm1hdCBzdHJpbmcKICAgICAgICAkUGFyYW17UmVzdWx0Rm9ybVN0cmd9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTm9ybWFsID0+IFRyYW5zbGF0YWJsZSgnTm9ybWFsJyksCiAgICAgICAgICAgICAgICBQcmludCAgPT4gVHJhbnNsYXRhYmxlKCdQcmludCcpLAogICAgICAgICAgICAgICAgQ1NWICAgID0+IFRyYW5zbGF0YWJsZSgnQ1NWJyksCiAgICAgICAgICAgICAgICBFeGNlbCAgPT4gVHJhbnNsYXRhYmxlKCdFeGNlbCcpLAogICAgICAgICAgICB9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdSZXN1bHRGb3JtJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gfHwgJ05vcm1hbCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FKQVhDb250ZW50JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc0lEICAgICAgICAgICAgICAgID0+ICRDbGFzc0lELAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyA9PiAkQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIEN1ckluY2lTdGF0ZU9wdGlvblN0cmcgPT4gJEN1ckluY2lTdGF0ZU9wdGlvblN0cmcsCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzU3RyZyAgICAgICAgID0+ICRQYXJhbXtBdHRyaWJ1dGVzU3RyZ30sCiAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzT3JpZ1N0cmcgICAgID0+ICRQYXJhbXtBdHRyaWJ1dGVzT3JpZ1N0cmd9LAogICAgICAgICAgICAgICAgUmVzdWx0Rm9ybVN0cmcgICAgICAgICA9PiAkUGFyYW17UmVzdWx0Rm9ybVN0cmd9LAogICAgICAgICAgICAgICAgUHJvZmlsZXNTdHJnICAgICAgICAgICA9PiAkUGFyYW17UHJvZmlsZXNTdHJnfSwKICAgICAgICAgICAgICAgIE51bWJlciAgICAgICAgICAgICAgICAgPT4gJEdldFBhcmFte051bWJlcn0gfHwgJycsCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXtOYW1lfSAgIHx8ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IER5bmFtaWMgZmllbGRzIGJsb2NrcwogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRTZWxmLT57Q29uZmlnfXtEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRQZXJtaXR0ZWREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgdGhhdCBIVE1MIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQKICAgICAgICAgICAgICAgIG5leHQgUFJFRkVSRU5DRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoCiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICRQcmVmZXJlbmNlLT57VHlwZX0gfQogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICRQcmVmZXJlbmNlLT57VHlwZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57TGFiZWx9LAogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZEhUTUx7ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICRQcmVmZXJlbmNlLT57VHlwZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57RmllbGR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGF0dHJpYnV0ZXMgZm9yIHNlYXJjaAogICAgICAgIG15IEBTZWFyY2hBdHRyaWJ1dGVzOwoKICAgICAgICBteSAlR2V0UGFyYW1CYWNrdXAgPSAlR2V0UGFyYW07CgogICAgICAgICMgc2hvdyBhdHRyaWJ1dGVzCiAgICAgICAgbXkgQFNob3duQXR0cmlidXRlczsKICAgICAgICBpZiAoICRHZXRQYXJhbUJhY2t1cHtTaG93bkF0dHJpYnV0ZXN9ICkgewogICAgICAgICAgICBAU2hvd25BdHRyaWJ1dGVzID0gc3BsaXQgLzsvLCAkR2V0UGFyYW1CYWNrdXB7U2hvd25BdHRyaWJ1dGVzfTsKICAgICAgICB9CiAgICAgICAgbXkgJUFscmVhZHlTaG93bjsKCiAgICAgICAgaWYgKCRDbGFzc0lEKSB7CiAgICAgICAgICAgIElURU06CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkSXRlbS0+e0tleX07CiAgICAgICAgICAgICAgICBuZXh0IElURU0gaWYgISRLZXk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBzaG93bgogICAgICAgICAgICAgICAgaWYgKEBTaG93bkF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2hvdyA9IDA7CiAgICAgICAgICAgICAgICAgICAgU0hPV05fQVRUUklCVVRFOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkU2hvd25BdHRyaWJ1dGUgKEBTaG93bkF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAnTGFiZWwnIC4gJEtleSBlcSAkU2hvd25BdHRyaWJ1dGUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2hvdyA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFNIT1dOX0FUVFJJQlVURTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBuZXh0IElURU0gaWYgISRTaG93OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTSBpZiAhZGVmaW5lZCAkR2V0UGFyYW1CYWNrdXB7JEtleX07CgogICAgICAgICAgICAgICAgICAgICMgU2tpcCBlbXB0eSBzdHJpbmdzCiAgICAgICAgICAgICAgICAgICAgbmV4dCBJVEVNIGlmICRHZXRQYXJhbUJhY2t1cHskS2V5fSBlcSAnJzsKCiAgICAgICAgICAgICAgICAgICAgIyBTa2lwIGVtcHR5IGFycmF5cwogICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRHZXRQYXJhbUJhY2t1cHskS2V5fSBlcSAnQVJSQVknICYmICFAeyAkR2V0UGFyYW1CYWNrdXB7JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBJVEVNOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNob3cgYXR0cmlidXRlCiAgICAgICAgICAgICAgICBuZXh0IElURU0gaWYgJEFscmVhZHlTaG93bnskS2V5fTsKICAgICAgICAgICAgICAgICRBbHJlYWR5U2hvd257JEtleX0gPSAxOwoKICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEF0dHJpYnV0ZXMsICRLZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgTm8gcHJvZmlsZSwgc2hvdyBkZWZhdWx0IHNjcmVlbgogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBNZXJnZSByZWd1bGFyIHNob3cvaGlkZSBzZXR0aW5ncyBhbmQgdGhlIHNldHRpbmdzIGZvciB0aGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgbXkgJURlZmF1bHRzID0gJXsgJFNlbGYtPntDb25maWd9e0RlZmF1bHRzfSB8fCB7fSB9OwogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZHMgKCBzb3J0IGtleXMgJXsgJFNlbGYtPntDb25maWd9e0R5bmFtaWNGaWVsZH0gfHwge30gfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9e0R5bmFtaWNGaWVsZH0tPnskRHluYW1pY0ZpZWxkc30gPT0gMiApIHsKICAgICAgICAgICAgICAgICAgICAkRGVmYXVsdHN7IlNlYXJjaF9EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZHMifSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBPcmRlcmVkRGVmYXVsdHM7CiAgICAgICAgICAgIGlmICglRGVmYXVsdHMpIHsKCiAgICAgICAgICAgICAgICAjIG9yZGVyaW5nIGF0dHJpYnV0ZXMgb24gdGhlIHNhbWUgb3JkZXIgbGlrZSBpbiBBdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEtleUF0ciA9ICRJdGVtLT57S2V5fTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRGVmYXVsdHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEtleSBlcSAkS2V5QXRyICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAT3JkZXJlZERlZmF1bHRzLCAkS2V5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5IChAT3JkZXJlZERlZmF1bHRzKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnRHluYW1pY0ZpZWxkJzsgICAgIyBJZ25vcmUgZW50cnkgZm9yIERGIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRBbHJlYWR5U2hvd257JEtleX07CiAgICAgICAgICAgICAgICAgICAgJEFscmVhZHlTaG93bnskS2V5fSA9IDE7CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEF0dHJpYnV0ZXMsICRLZXk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgSWYgbm8gYXR0cmlidXRlIGlzIHNob3duLCBzaG93IGZ1bGx0ZXh0IHNlYXJjaC4KICAgICAgICAgICAgaWYgKCAha2V5cyAlQWxyZWFkeVNob3duICkgewogICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoQXR0cmlidXRlcywgJ0Z1bGx0ZXh0JzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgQFByb2ZpbGVBdHRyaWJ1dGVzOwoKICAgICAgICAjIHNob3cgYXR0cmlidXRlcwogICAgICAgIG15ICRBdHRyaWJ1dGVJc1VzZWQgPSAwOwogICAgICAgIEtFWToKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgIG5leHQgS0VZIGlmICEkS2V5OwogICAgICAgICAgICBuZXh0IEtFWSBpZiAhZGVmaW5lZCAkR2V0UGFyYW17JEtleX07CiAgICAgICAgICAgIG5leHQgS0VZIGlmICRHZXRQYXJhbXskS2V5fSBlcSAnJzsKICAgICAgICAgICAgbmV4dCBLRVkgaWYgcmVmICRHZXRQYXJhbXskS2V5fSBlcSAnQVJSQVknICYmICEkR2V0UGFyYW17JEtleX0tPkAqOwoKICAgICAgICAgICAgJEF0dHJpYnV0ZUlzVXNlZCA9IDE7CgogICAgICAgICAgICBwdXNoIEBQcm9maWxlQXR0cmlidXRlcywgJEtleTsKICAgICAgICB9CgogICAgICAgICMgaWYgbm8gYXR0cmlidXRlIGlzIHNob3duLCBzaG93IGNvbmZpZ2l0ZW0gbnVtYmVyCiAgICAgICAgaWYgKCAhJFNlbGYtPntQcm9maWxlfSApIHsKCiAgICAgICAgICAgICMgbWVyZ2Ugc2VhcmNoIGFuZCBwcm9maWxlIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaWYgKEBTZWFyY2hBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICBAUHJvZmlsZUF0dHJpYnV0ZXMgPSB1bmlxKCBAUHJvZmlsZUF0dHJpYnV0ZXMsIEBTZWFyY2hBdHRyaWJ1dGVzICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAUHJvZmlsZUF0dHJpYnV0ZXMgPSB1bmlxKCBAUHJvZmlsZUF0dHJpYnV0ZXMsICdOdW1iZXInICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01TZWFyY2hQcm9maWxlQXR0cmlidXRlcycsCiAgICAgICAgICAgIFZhbHVlID0+IFxAUHJvZmlsZUF0dHJpYnV0ZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGVtcGxhdGUKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICBBSkFYICAgICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCgKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBwZXJmb3JtIHNlYXJjaAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaCcgKSB7CgogICAgICAgIG15ICRTZWFyY2hEaWFsb2cgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VhcmNoRGlhbG9nJyApOwoKICAgICAgICAjIGZpbGwgdXAgcHJvZmlsZSBuYW1lIChlLmcuIHdpdGggbGFzdC1zZWFyY2gpCiAgICAgICAgaWYgKCAhJFNlbGYtPntQcm9maWxlfSB8fCAhJFNlbGYtPntTYXZlUHJvZmlsZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57UHJvZmlsZX0gPSAnbGFzdC1zZWFyY2gnOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IG92ZXJ2aWV3IHNjcmVlbgogICAgICAgIG15ICRVUkwgPSAiQWN0aW9uPUFnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2g7UHJvZmlsZT0kU2VsZi0+e1Byb2ZpbGV9OyIKICAgICAgICAgICAgLiAiVGFrZUxhc3RTZWFyY2g9MTtTdGFydEhpdD0kU2VsZi0+e1N0YXJ0SGl0fTtTdWJhY3Rpb249U2VhcmNoOyIKICAgICAgICAgICAgLiAiT3JkZXJCeT0kU2VsZi0+e09yZGVyQnl9O1NvcnRCeT0kU2VsZi0+e1NvcnRCeX0iOwoKICAgICAgICBpZiAoJENsYXNzSUQpIHsKICAgICAgICAgICAgJFVSTCAuPSAiO0NsYXNzSUQ9JENsYXNzSUQiOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2Vzc2lvbiBvYmplY3QKICAgICAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwoKICAgICAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5PdmVydmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVVJMLAogICAgICAgICk7CiAgICAgICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVVJMLAogICAgICAgICk7CgogICAgICAgICMgQ2xhc3NJRCBpcyByZXF1aXJlZCBmb3IgdGhlIHNlYXJjaCBtYXNrIGFuZCBmb3IgYWN0dWFsIHNlYXJjaGluZwogICAgICAgIGlmICggISRDbGFzc0lEICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gQ2xhc3NJRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgdXNlciBpcyBhbGxvd2VkIHRvIHNlYXJjaCBjbGFzcwogICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgZXJyb3Igc2NyZWVuCiAgICAgICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIGFjY2VzcyByaWdodHMgZm9yIHRoaXMgY2xhc3MgZ2l2ZW4hJyksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXJyZW50IGRlZmluaXRpb24KICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICk7CgogICAgICAgICMgYWJvcnQsIGlmIG5vIGRlZmluaXRpb24gaXMgZGVmaW5lZAogICAgICAgIGlmICggISREZWZpbml0aW9uLT57RGVmaW5pdGlvbklEfSApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ05vIGRlZmluaXRpb24gd2FzIGRlZmluZWQgZm9yIGNsYXNzICVzIScsICRDbGFzc0lEICksCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgIG15ICVTZXRJbm5lckZpZWxkczsKICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCB2YWx1ZXMgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9LT4lKiApIHsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ1NldCc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoICREeW5hbWljRmllbGRDb25maWctPntDb25maWd9e0luY2x1ZGV9ICk7CgogICAgICAgICAgICAjIGl0ZXJhdGUgdGhlIGVudGlyZSBJbmNsdWRlIHN0cnVjdHVyZSB0byBnZXQgdGhlIHZlcnNpb25lZCBkeW5hbWljIGZpZWxkIGNvbmZpZ3MKICAgICAgICAgICAgSU5DTFVERUVMRU1FTlQ6CiAgICAgICAgICAgIGZvciBteSAkSW5jbHVkZUVsZW1lbnQgKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtJbmNsdWRlfS0+QCogKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkSW5jbHVkZUVsZW1lbnQtPntERn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEluY2x1ZGVFbGVtZW50LT57RGVmaW5pdGlvbn17TGFiZWx9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9ICkgLiAnOjonCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkSW5jbHVkZUVsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gKTsKICAgICAgICAgICAgICAgICAgICAkU2V0SW5uZXJGaWVsZHN7ICRJbmNsdWRlRWxlbWVudC0+e0RGfSB9ID0gJEluY2x1ZGVFbGVtZW50LT57RGVmaW5pdGlvbn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRJbmNsdWRlRWxlbWVudC0+e0dyaWR9ICkgewoKICAgICAgICAgICAgICAgICAgICBuZXh0IElOQ0xVREVFTEVNRU5UIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoICRJbmNsdWRlRWxlbWVudC0+e0dyaWR9ICk7CgogICAgICAgICAgICAgICAgICAgIFJPVzoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJvdyAoICRJbmNsdWRlRWxlbWVudC0+e0dyaWR9e1Jvd3N9LT5AKiApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgUk9XIHVubGVzcyBJc0FycmF5UmVmV2l0aERhdGEoJFJvdyk7CgogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFJvd0VsZW1lbnQgKCAkUm93LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFJvd0VsZW1lbnQtPntERn0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJvd0VsZW1lbnQtPntEZWZpbml0aW9ufXtMYWJlbH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICREeW5hbWljRmllbGRDb25maWctPntMYWJlbH0gKSAuICc6OicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICRSb3dFbGVtZW50LT57RGVmaW5pdGlvbn17TGFiZWx9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNldElubmVyRmllbGRzeyAkUm93RWxlbWVudC0+e0RGfSB9ID0gJFJvd0VsZW1lbnQtPntEZWZpbml0aW9ufTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9ID0gewogICAgICAgICAgICAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0tPiUqLAogICAgICAgICAgICAlU2V0SW5uZXJGaWVsZHMsCiAgICAgICAgfTsKCiAgICAgICAgIyB3YWxrIHRocm91Z2ggZGVmaW5pdGlvbiB0byBjaGVjayBwZXJtaXNzaW9ucyBvbiBwYWdlcyB3aGljaCBjb250YWluIGR5bmFtaWMgZmllbGRzCiAgICAgICAgbXkgJVBlcm1pdHRlZER5bmFtaWNGaWVsZHM7CiAgICAgICAgbXkgJUdyb3VwTG9va3VwOwoKICAgICAgICBQQUdFOgogICAgICAgIGZvciBteSAkUGFnZSAoICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn17UGFnZXN9LT5AKiApIHsKCiAgICAgICAgICAgICMgSW50ZXJmYWNlcyBpcyBvcHRpb25hbCwgZWZmZWN0aXZlbHkgZGVmYXVsdCB0byBbICdBZ2VudCcgXQogICAgICAgICAgICBpZiAoICRQYWdlLT57SW50ZXJmYWNlc30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFBBR0UgdW5sZXNzIGFueSB7ICRfIGVxICdBZ2VudCcgfSAkUGFnZS0+e0ludGVyZmFjZXN9LT5AKjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFnZS0+e0dyb3Vwc30gKSB7CiAgICAgICAgICAgICAgICBpZiAoICElR3JvdXBMb29rdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgJUdyb3VwTG9va3VwID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBncmFudCBhY2Nlc3MgdG8gdGhlIHBhZ2Ugb25seSB3aGVuIHRoZSB1c2VyIGlzIGluIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGdyb3VwcwogICAgICAgICAgICAgICAgbmV4dCBQQUdFIHVubGVzcyBhbnkgeyAkR3JvdXBMb29rdXB7JF99IH0gJFBhZ2UtPntHcm91cHN9LT5AKjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgU0VDVElPTjoKICAgICAgICAgICAgZm9yIG15ICRTZWN0aW9uQ29uZmlnICggJFBhZ2UtPntDb250ZW50fS0+QCogKSB7CiAgICAgICAgICAgICAgICBteSAkU2VjdGlvbiA9ICREZWZpbml0aW9uLT57RGVmaW5pdGlvblJlZn17U2VjdGlvbnN9eyAkU2VjdGlvbkNvbmZpZy0+e1NlY3Rpb259IH07CgogICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OIHVubGVzcyAkU2VjdGlvbjsKICAgICAgICAgICAgICAgIGlmICggJFNlY3Rpb24tPntUeXBlfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWN0aW9uLT57VHlwZX0gbmUgJ0R5bmFtaWNGaWVsZHMnICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IFNFQ1RJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgZG8gbm90IHByb2NlZWQgaWYgY29udGVudCBpcyBlbXB0eQogICAgICAgICAgICAgICAgbmV4dCBTRUNUSU9OIHVubGVzcyAkU2VjdGlvbi0+e0NvbnRlbnR9LT5AKjsKCiAgICAgICAgICAgICAgICBteSAkU2VjdGlvbkRGcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RNYXNrKAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJFNlY3Rpb24tPntDb250ZW50fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJFNlY3Rpb25ERnMpICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkREZOYW1lICggJFNlY3Rpb25ERnMtPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICAkUGVybWl0dGVkRHluYW1pY0ZpZWxkc3skREZOYW1lfSA9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGFsc28gaW5jbHVkZSBTZXQtaW5uZXIgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJERlZmluaXRpb24tPntEeW5hbWljRmllbGRSZWZ9eyRERk5hbWV9e0ZpZWxkVHlwZX0gZXEgJ1NldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU2V0SW5uZXJGaWVsZHMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0TWFzaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfXskREZOYW1lfXtDb25maWd9e0luY2x1ZGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2V0SW5uZXJGaWVsZHMpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkSW5uZXJERiAoICRTZXRJbm5lckZpZWxkcy0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQZXJtaXR0ZWREeW5hbWljRmllbGRzeyRJbm5lckRGfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNvbnZlcnQgYXR0cmlidXRlcwogICAgICAgIGlmICggJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gJiYgcmVmICRHZXRQYXJhbXtTaG93bkF0dHJpYnV0ZXN9IGVxICcnICkgewogICAgICAgICAgICAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSA9IFsgc3BsaXQgLzsvLCAkR2V0UGFyYW17U2hvd25BdHRyaWJ1dGVzfSBdOwogICAgICAgIH0KCiAgICAgICAgIyBzYXZlIHNlYXJjaCBwcm9maWxlICh1bmRlciBsYXN0LXNlYXJjaCBvciByZWFsIHByb2ZpbGUgbmFtZSkKICAgICAgICAkU2VsZi0+e1NhdmVQcm9maWxlfSA9IDE7CgogICAgICAgICMgcmVtZW1iZXIgbGFzdCBzZWFyY2ggdmFsdWVzIG9ubHkgaWYgc2VhcmNoIGlzIGNhbGxlZCBmcm9tIGEgc2VhcmNoIGRpYWxvZwogICAgICAgICMgbm90IGZyb20gcmVzdWx0cyBwYWdlCiAgICAgICAgaWYgKCAkU2VsZi0+e1NhdmVQcm9maWxlfSAmJiAkU2VsZi0+e1Byb2ZpbGV9ICYmICRTZWFyY2hEaWFsb2cgKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBvbGQgcHJvZmlsZSBzdHVmZgogICAgICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZURlbGV0ZSgKICAgICAgICAgICAgICAgIEJhc2UgICAgICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcgLiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIE5hbWUgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRTZWxmLT57VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgaW5zZXJ0IG5ldyBwcm9maWxlIHBhcmFtcwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlR2V0UGFyYW0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXskS2V5fSAmJiAkS2V5IG5lICdXaGF0JyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUHJvZmlsZU9iamVjdC0+U2VhcmNoUHJvZmlsZUFkZCgKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZSAgICAgID0+ICdDb25maWdJdGVtU2VhcmNoJyAuICRDbGFzc0lELAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkU2VsZi0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUF0dHJpYnV0ZUxvb2t1cDsKCiAgICAgICAgIyBjcmVhdGUgYXR0cmlidXRlIGxvb2t1cCB0YWJsZQogICAgICAgIGZvciBteSAkQXR0cmlidXRlICggQHsgJEdldFBhcmFte1Nob3duQXR0cmlidXRlc30gfHwgW10gfSApIHsKICAgICAgICAgICAgJEF0dHJpYnV0ZUxvb2t1cHskQXR0cmlidXRlfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGR5bmFtaWMgZmllbGRzIHNlYXJjaCBwYXJhbWV0ZXJzIGZvciB0aWNrZXQgc2VhcmNoCiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFNlYXJjaFBhcmFtZXRlcnM7CgogICAgICAgICMgY3ljbGUgdHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggdmFsdWVzICREZWZpbml0aW9uLT57RHluYW1pY0ZpZWxkUmVmfS0+JSogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRTZWxmLT57Q29uZmlnfXtEeW5hbWljRmllbGR9eyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICRQZXJtaXR0ZWREeW5hbWljRmllbGRzeyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfTsKCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJEF0dHJpYnV0ZUxvb2t1cHsKICAgICAgICAgICAgICAgICAgICAgICAgJ0xhYmVsU2VhcmNoX0R5bmFtaWNGaWVsZF8nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkUHJlZmVyZW5jZS0+e1R5cGV9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFBSRUZFUkVOQ0U7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSBkeW5hbWljIGZpZWxkIHZhbHVlIGZyb20gdGhlIHByb2ZpbGUKICAgICAgICAgICAgICAgIG15ICRTZWFyY2hQYXJhbWV0ZXIgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQYXJhbWV0ZXJCdWlsZCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgICAgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgPT4gJFByZWZlcmVuY2UtPntUeXBlfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgc2VhcmNoIHBhcmFtZXRlcgogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRTZWFyY2hQYXJhbWV0ZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFNlYXJjaFBhcmFtZXRlcnN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFNlYXJjaFBhcmFtZXRlci0+e1BhcmFtZXRlcn07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15IEBTZWFyY2hSZXN1bHRMaXN0OwoKICAgICAgICAjIHN0YXJ0IHNlYXJjaCBpZiBjYWxsZWQgZnJvbSBhIHNlYXJjaCBkaWFsb2cgb3IgZnJvbSBhIHJlc3VsdHMgcGFnZQogICAgICAgIGlmICggJFNlYXJjaERpYWxvZyB8fCAkU2VsZi0+e1Rha2VMYXN0U2VhcmNofSApIHsKCiAgICAgICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgICAgIEBTZWFyY2hSZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlRHluYW1pY0ZpZWxkU2VhcmNoUGFyYW1ldGVycywKICAgICAgICAgICAgICAgIE9yZGVyQnkgID0+IFsgJFNlbGYtPntPcmRlckJ5fSBdLAogICAgICAgICAgICAgICAgU29ydEJ5ICAgPT4gWyAkU2VsZi0+e1NvcnRCeX0gXSwKICAgICAgICAgICAgICAgIExpbWl0ICAgID0+ICRTZWxmLT57U2VhcmNoTGltaXR9LAogICAgICAgICAgICAgICAgQ2xhc3NJRHMgPT4gWyRDbGFzc0lEXSwKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRoZSBjb25maWcgaXRlbSBkeW5hbWljIGZpZWxkcyBmb3IgQ1NWIGRpc3BsYXkKICAgICAgICBteSAkQ1NWRHluYW1pY0ZpZWxkID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpLT5EeW5hbWljRmllbGRMaXN0R2V0KAogICAgICAgICAgICBWYWxpZCAgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0lUU01Db25maWdJdGVtJ10sCiAgICAgICAgICAgIEZpZWxkRmlsdGVyID0+ICRTZWxmLT57Q29uZmlnfXtTZWFyY2hDU1ZEeW5hbWljRmllbGR9IHx8IHt9LAogICAgICAgICk7CgogICAgICAgICMgQ1NWIG91dHB1dAogICAgICAgIGlmICgKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdDU1YnCiAgICAgICAgICAgIHx8CiAgICAgICAgICAgICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnRXhjZWwnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICMgY3JlYXRlIGhlYWQgKGFjdHVhbCBoZWFkIGFuZCBoZWFkIGZvciBkYXRhIGZpbGwpCiAgICAgICAgICAgIG15IEBUbXBDU1ZIZWFkID0gQHsgJFNlbGYtPntDb25maWd9e1NlYXJjaENTVkRhdGF9IH07CiAgICAgICAgICAgIG15IEBDU1ZIZWFkICAgID0gQHsgJFNlbGYtPntDb25maWd9e1NlYXJjaENTVkRhdGF9IH07CgogICAgICAgICAgICAjIGluY2x1ZGUgdGhlIHNlbGVjdGVkIGR5bmFtaWMgZmllbGRzIGluIENWUyByZXN1bHRzCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRDb25maWcgKCBAeyRDU1ZEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSBlcSAnJzsKCiAgICAgICAgICAgICAgICBwdXNoIEBUbXBDU1ZIZWFkLCAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CiAgICAgICAgICAgICAgICBwdXNoIEBDU1ZIZWFkLCAgICAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TGFiZWx9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSBAQ1NWRGF0YTsKCiAgICAgICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBTZWFyY2hSZXN1bHRMaXN0KSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgICAgICAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkSGFzQWNjZXNzOwoKICAgICAgICAgICAgICAgICMgZ2V0IHZlcnNpb24KICAgICAgICAgICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgY3N2IHF1b3RlCiAgICAgICAgICAgICAgICBpZiAoICFAQ1NWSGVhZCApIHsKICAgICAgICAgICAgICAgICAgICBAQ1NWSGVhZCA9IEB7ICRTZWxmLT57Q29uZmlnfS0+e1NlYXJjaENTVkRhdGF9IH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBzdG9yZSBkYXRhCiAgICAgICAgICAgICAgICBteSBARGF0YTsKICAgICAgICAgICAgICAgIGZvciBteSAkSGVhZGVyIChAVG1wQ1NWSGVhZCkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIGhlYWRlciBpcyBhIGR5bmFtaWMgZmllbGQgYW5kIGdldCB0aGUgdmFsdWUgZnJvbSBkeW5hbWljIGZpZWxkCiAgICAgICAgICAgICAgICAgICAgIyBiYWNrZW5kCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkSGVhZGVyID1+IG17XEEgRHluYW1pY0ZpZWxkXyAoIFthLXpBLVpcZFwtXSsgKSBcen14bXMgKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGxvb3Agb3ZlciB0aGUgZHluYW1pYyBmaWVsZHMgY29uZmlndXJlZCBmb3IgQ1NWIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHskQ1NWRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBza2lwIGFsbCBmaWVsZHMgdGhhdCBkb2VzIG5vdCBtYXRjaCB3aXRoIGN1cnJlbnQgZmllbGQgbmFtZSAoJDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdpdGggb3V0IHRoZSAnRHluYW1pY0ZpZWxkXycgcHJlZml4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gbmUgJDE7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBnZXQgdGhlIHZhbHVlIGFzIGZvciBwcmludCAodG8gY29ycmVjdGx5IGRpc3BsYXkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVmFsdWVTdHJnID0gJEJhY2tlbmRPYmplY3QtPkRpc3BsYXlWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJExhc3RWZXJzaW9uLT57JEhlYWRlcn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTE91dHB1dCAgICAgICAgID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBARGF0YSwgJFZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRlcm1pbmF0ZSB0aGUgRFlOQU1JQ0ZJRUxEIGxvb3AKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgRFlOQU1JQ0ZJRUxEOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSByZXRyaWV2ZSBkYXRhIGZyb20gYXJ0aWNsZQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBEYXRhLCAkTGFzdFZlcnNpb24tPnskSGVhZGVyfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXNoIEBDU1ZEYXRhLCBcQERhdGE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3N2IHF1b3RlCiAgICAgICAgICAgICMgdHJhbnNsYXRlIG5vbiBleGlzdGluZyBoZWFkZXIgbWF5IHJlc3VsdCBpbiBhIGdhcmJhZ2UgZmlsZQogICAgICAgICAgICBpZiAoICFAQ1NWSGVhZCApIHsKICAgICAgICAgICAgICAgIEBDU1ZIZWFkID0gQHsgJFNlbGYtPntDb25maWd9LT57U2VhcmNoQ1NWRGF0YX0gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgaGVhZGVycwogICAgICAgICAgICBmb3IgbXkgJEhlYWRlciAoQENTVkhlYWQpIHsKCiAgICAgICAgICAgICAgICAjIHJlcGxhY2UgQ29uZmlnSXRlbU51bWJlciBoZWFkZXIgd2l0aCB0aGUgY3VycmVudCBDb25maWdJdGVtTnVtYmVyIGhvb2sgZnJvbSBzeXNjb25maWcKICAgICAgICAgICAgICAgIGlmICggJEhlYWRlciBlcSAnQ29uZmlnSXRlbU51bWJlcicgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhlYWRlciA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06Okhvb2snKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRIZWFkZXIgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJEhlYWRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IFNlcGFyYXRvciBmcm9tIGxhbmd1YWdlIGZpbGUuCiAgICAgICAgICAgIG15ICRVc2VyQ1NWU2VwYXJhdG9yID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+e1NlcGFyYXRvcn07CgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnUHJlZmVyZW5jZXNHcm91cHMnKS0+e0NTVlNlcGFyYXRvcn0tPntBY3RpdmV9ICkgewogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtVc2VyQ1NWU2VwYXJhdG9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkVXNlckNTVlNlcGFyYXRvciA9ICRVc2VyRGF0YXtVc2VyQ1NWU2VwYXJhdG9yfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENTVk9iamVjdCAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNTVicpOwogICAgICAgICAgICBteSAkQ3VyU3lzRFRPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17UmVzdWx0Rm9ybX0gZXEgJ0NTVicgKSB7CgogICAgICAgICAgICAgICAgIyBBc3NlbWJsZSBDU1YgZGF0YS4KICAgICAgICAgICAgICAgIG15ICRDU1YgPSAkQ1NWT2JqZWN0LT5BcnJheTJDU1YoCiAgICAgICAgICAgICAgICAgICAgSGVhZCAgICAgID0+IFxAQ1NWSGVhZCwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgPT4gXEBDU1ZEYXRhLAogICAgICAgICAgICAgICAgICAgIFNlcGFyYXRvciA9PiAkVXNlckNTVlNlcGFyYXRvciwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBSZXR1cm4gQ1NWIHRvIGRvd25sb2FkLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoYW5nZV9zZWFyY2hfJXMuY3N2JywKICAgICAgICAgICAgICAgICAgICAgICAgJEN1clN5c0RUT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgPT4gJyVGXyVILSVNJywKICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJ0ZXh0L2NzdjsgY2hhcnNldD0iIC4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ1NWLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtSZXN1bHRGb3JtfSBlcSAnRXhjZWwnICkgewoKICAgICAgICAgICAgICAgICMgQXNzZW1ibGUgRXhjZWwgZGF0YS4KICAgICAgICAgICAgICAgIG15ICRFeGNlbCA9ICRDU1ZPYmplY3QtPkFycmF5MkNTVigKICAgICAgICAgICAgICAgICAgICBIZWFkICAgPT4gXEBDU1ZIZWFkLAogICAgICAgICAgICAgICAgICAgIERhdGEgICA9PiBcQENTVkRhdGEsCiAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICdFeGNlbCcsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgUmV0dXJuIEV4Y2VsIHRvIGRvd25sb2FkLgogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgJ2NoYW5nZV9zZWFyY2hfJXMueGxzeCcsCiAgICAgICAgICAgICAgICAgICAgICAgICRDdXJTeXNEVE9iamVjdC0+Rm9ybWF0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICclRl8lSC0lTScsCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwuc2hlZXQiLAogICAgICAgICAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRFeGNlbCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcHJpbnQgUERGIG91dHB1dAogICAgICAgIGVsc2lmICggJEdldFBhcmFte1Jlc3VsdEZvcm19IGVxICdQcmludCcgKSB7CgogICAgICAgICAgICBteSBAUERGRGF0YTsKCiAgICAgICAgICAgICMgZ2V0IHBkZiBvYmplY3QKICAgICAgICAgICAgbXkgJFBERk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQREYnKTsKCiAgICAgICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBTZWFyY2hSZXN1bHRMaXN0KSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBmb3IgYWNjZXNzIHJpZ2h0cwogICAgICAgICAgICAgICAgbXkgJEhhc0FjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgIFNjb3BlICA9PiAnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICEkSGFzQWNjZXNzOwoKICAgICAgICAgICAgICAgICMgZ2V0IHZlcnNpb24KICAgICAgICAgICAgICAgIG15ICRMYXN0VmVyc2lvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBwZGYgcm93cwogICAgICAgICAgICAgICAgbXkgQFBERlJvdzsKICAgICAgICAgICAgICAgIGZvciBteSAkU3RvcmVEYXRhIChxdyhDbGFzcyBJbmNpU3RhdGUgTmFtZSBOdW1iZXIgRGVwbFN0YXRlIFZlcnNpb25JRCBDcmVhdGVUaW1lKSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFBERlJvdywgJExhc3RWZXJzaW9uLT57JFN0b3JlRGF0YX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdXNoIEBQREZEYXRhLCBcQFBERlJvdzsKCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgUERGIE91dHB1dAogICAgICAgICAgICBteSAkVGl0bGUgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvbmZpZ3VyYXRpb24gSXRlbScpIC4gJyAnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnU2VhcmNoJyk7CiAgICAgICAgICAgIG15ICRQcmludGVkQnkgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ3ByaW50ZWQgYnknKTsKICAgICAgICAgICAgbXkgJFBhZ2UgICAgICA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnUGFnZScpOwogICAgICAgICAgICBteSAkVGltZSAgICAgID0gJExheW91dE9iamVjdC0+e1RpbWV9OwoKICAgICAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAgICAgbXkgJE1heFBhZ2VzID0gJENvbmZpZ09iamVjdC0+R2V0KCdQREY6Ok1heFBhZ2VzJyk7CiAgICAgICAgICAgIGlmICggISRNYXhQYWdlcyB8fCAkTWF4UGFnZXMgPCAxIHx8ICRNYXhQYWdlcyA+IDEwMDAgKSB7CiAgICAgICAgICAgICAgICAkTWF4UGFnZXMgPSAxMDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIHRoZSBoZWFkZXIKICAgICAgICAgICAgbXkgJENlbGxEYXRhOwoKICAgICAgICAgICAgIyBvdXRwdXQgJ05vIFJlc3VsdCcsIGlmIG5vIGNvbnRlbnQgd2FzIGdpdmVuCiAgICAgICAgICAgIGlmIChAUERGRGF0YSkgewogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlswXS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdDbGFzcycpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlswXS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlsxXS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdJbmNpZGVudCBTdGF0ZScpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlsxXS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlsyXS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdOYW1lJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzJdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzNdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ051bWJlcicpOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPlszXS0+e0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJENlbGxEYXRhLT5bMF0tPls0XS0+e0NvbnRlbnR9ID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdEZXBsb3ltZW50IFN0YXRlJyk7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzRdLT57Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzVdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ1ZlcnNpb24nKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNV0tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNl0tPntDb250ZW50fSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ3JlYXRlIFRpbWUnKTsKICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WzBdLT5bNl0tPntGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKCiAgICAgICAgICAgICAgICAjIGNyZWF0ZSB0aGUgY29udGVudCBhcnJheQogICAgICAgICAgICAgICAgbXkgJENvdW50ZXJSb3cgPSAxOwogICAgICAgICAgICAgICAgZm9yIG15ICRSb3cgKEBQREZEYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvdW50ZXJDb2x1bW4gPSAwOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkQ29udGVudCAoIEB7JFJvd30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDZWxsRGF0YS0+WyRDb3VudGVyUm93XS0+WyRDb3VudGVyQ29sdW1uXS0+e0NvbnRlbnR9ID0gJENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgICRDb3VudGVyQ29sdW1uKys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRDb3VudGVyUm93Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2VsbERhdGEtPlswXS0+WzBdLT57Q29udGVudH0gPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05vIFJlc3VsdCEnKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBwYWdlIHBhcmFtcwogICAgICAgICAgICBteSAlUGFnZVBhcmFtOwogICAgICAgICAgICAkUGFnZVBhcmFte1BhZ2VPcmllbnRhdGlvbn0gPSAnbGFuZHNjYXBlJzsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtNYXJnaW5Ub3B9ICAgICAgID0gMzA7CiAgICAgICAgICAgICRQYWdlUGFyYW17TWFyZ2luUmlnaHR9ICAgICA9IDQwOwogICAgICAgICAgICAkUGFnZVBhcmFte01hcmdpbkJvdHRvbX0gICAgPSA0MDsKICAgICAgICAgICAgJFBhZ2VQYXJhbXtNYXJnaW5MZWZ0fSAgICAgID0gNDA7CiAgICAgICAgICAgICRQYWdlUGFyYW17SGVhZGVyUmlnaHR9ICAgICA9ICRUaXRsZTsKCiAgICAgICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgICAgIG15ICVUYWJsZVBhcmFtOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX0gICAgICAgICAgICA9ICRDZWxsRGF0YTsKICAgICAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgPSA2OwogICAgICAgICAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgICAgICA9IDA7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNEREREREQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgID0gMzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICAgICAgPSAzOwoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICAgICAkUERGT2JqZWN0LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgICAgIFRpdGxlICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Byb2R1Y3QnKSAuICc6ICcgLiAkVGl0bGUsCiAgICAgICAgICAgICAgICBFbmNvZGUgPT4gJExheW91dE9iamVjdC0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc3RhcnQgdGFibGUgb3V0cHV0CiAgICAgICAgICAgICRQREZPYmplY3QtPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAlUGFnZVBhcmFtLAogICAgICAgICAgICAgICAgRm9vdGVyUmlnaHQgPT4gJFBhZ2UgLiAnIDEnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBERk9iamVjdC0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gLTYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCB0aXRsZQogICAgICAgICAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgICAgICAgICAgVGV4dCAgICAgPT4gJFRpdGxlLAogICAgICAgICAgICAgICAgRm9udFNpemUgPT4gMTMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUERGT2JqZWN0LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0ICJwcmludGVkIGJ5IgogICAgICAgICAgICAkUERGT2JqZWN0LT5UZXh0KAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUHJpbnRlZEJ5IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGdWxsbmFtZX0gLiAnICcKICAgICAgICAgICAgICAgICAgICAuICRUaW1lLAogICAgICAgICAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQREZPYmplY3QtPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC0xNCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIFBBR0U6CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAyIC4uICRNYXhQYWdlcyApIHsKCiAgICAgICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgICAgICVUYWJsZVBhcmFtID0gJFBERk9iamVjdC0+VGFibGUoJVRhYmxlUGFyYW0pOwoKICAgICAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3IgYW5vdGhlciBwYWdlCiAgICAgICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgICAgICBsYXN0IFBBR0U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUERGT2JqZWN0LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgICAgICAgICAlUGFnZVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBGb290ZXJSaWdodCA9PiAkUGFnZSAuICcgJyAuICRDb3VudCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgICAgIG15ICRDdXJyZW50U3lzdGVtRFRPYmogPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgbXkgJFBERlN0cmluZyAgICAgICAgICA9ICRQREZPYmplY3QtPkRvY3VtZW50T3V0cHV0KCk7CiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAnY29uZmlnaXRlbV9zZWFyY2hfJXNfJXMucGRmJywKICAgICAgICAgICAgICAgICAgICAkQ3VycmVudFN5c3RlbURUT2JqLT5Gb3JtYXQoIEZvcm1hdCA9PiAnJUZfJUgtJU0nICksCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3BkZiIsCiAgICAgICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG5vcm1hbCBIVE1MIG91dHB1dAogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBzdGFydCBodG1sIHBhZ2UKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICMgdXNlIGNsYXNzbmFtZSBhcyBmaWx0ZXIKICAgICAgICAgICAgJFNlbGYtPntGaWx0ZXJ9ID0gJENsYXNzTGlzdC0+eyRDbGFzc0lEfSAgICAgICAgICAgICAgICAgICAgfHwgJ0FsbCc7CiAgICAgICAgICAgICRTZWxmLT57Vmlld30gICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdWaWV3JyApIHx8ICcnOwoKICAgICAgICAgICAgIyBzaG93IGNvbmZpZyBpdGVtcwogICAgICAgICAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e0ZpbHRlcn0gKQogICAgICAgICAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntWaWV3fSApCiAgICAgICAgICAgICAgICAuICc7U29ydEJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57U29ydEJ5fSApCiAgICAgICAgICAgICAgICAuICc7T3JkZXJCeT0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntPcmRlckJ5fSApCiAgICAgICAgICAgICAgICAuICc7UHJvZmlsZT0nIC4gJFNlbGYtPntQcm9maWxlfSAuICc7VGFrZUxhc3RTZWFyY2g9MTtTdWJhY3Rpb249U2VhcmNoJwogICAgICAgICAgICAgICAgLiAnO0NsYXNzSUQ9JyAuICRDbGFzc0lECiAgICAgICAgICAgICAgICAuICc7JzsKICAgICAgICAgICAgbXkgJExpbmtTb3J0ID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntGaWx0ZXJ9ICkKICAgICAgICAgICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRTZWxmLT57Vmlld30gKQogICAgICAgICAgICAgICAgLiAnO1Byb2ZpbGU9JyAuICRTZWxmLT57UHJvZmlsZX0gLiAnO1Rha2VMYXN0U2VhcmNoPTE7U3ViYWN0aW9uPVNlYXJjaCcKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScgLiAkQ2xhc3NJRAogICAgICAgICAgICAgICAgLiAnOyc7CiAgICAgICAgICAgIG15ICRMaW5rRmlsdGVyID0gJ1Rha2VMYXN0U2VhcmNoPTE7U3ViYWN0aW9uPVNlYXJjaDtQcm9maWxlPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1Byb2ZpbGV9ICkKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ2xhc3NJRCApCiAgICAgICAgICAgICAgICAuICc7JzsKICAgICAgICAgICAgbXkgJExpbmtCYWNrID0gJ1N1YmFjdGlvbj1Mb2FkUHJvZmlsZTtQcm9maWxlPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1Byb2ZpbGV9ICkKICAgICAgICAgICAgICAgIC4gJztDbGFzc0lEPScKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ2xhc3NJRCApCiAgICAgICAgICAgICAgICAuICc7VGFrZUxhc3RTZWFyY2g9MTsnOwoKICAgICAgICAgICAgbXkgJENsYXNzTmFtZSA9ICRDbGFzc0xpc3QtPnskQ2xhc3NJRH07CiAgICAgICAgICAgIG15ICRUaXRsZSAgICAgPSAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvbmZpZyBJdGVtIFNlYXJjaCBSZXN1bHRzJykKICAgICAgICAgICAgICAgIC4gJyAnCiAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnQ2xhc3MnKQogICAgICAgICAgICAgICAgLiAnICcKICAgICAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCRDbGFzc05hbWUpOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5JVFNNQ29uZmlnSXRlbUxpc3RTaG93KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEcyA9PiBcQFNlYXJjaFJlc3VsdExpc3QsCiAgICAgICAgICAgICAgICBUb3RhbCAgICAgICAgID0+IHNjYWxhciBAU2VhcmNoUmVzdWx0TGlzdCwKICAgICAgICAgICAgICAgIFZpZXcgICAgICAgICAgPT4gJFNlbGYtPntWaWV3fSwKICAgICAgICAgICAgICAgIEZpbHRlciAgICAgICAgPT4gJENsYXNzTmFtZSwKICAgICAgICAgICAgICAgIEVudiAgICAgICAgICAgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICBMaW5rUGFnZSAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICAgICAgICAgIExpbmtTb3J0ICAgICAgPT4gJExpbmtTb3J0LAogICAgICAgICAgICAgICAgTGlua0ZpbHRlciAgICA9PiAkTGlua0ZpbHRlciwKICAgICAgICAgICAgICAgIExpbmtCYWNrICAgICAgPT4gJExpbmtCYWNrLAogICAgICAgICAgICAgICAgUHJvZmlsZSAgICAgICA9PiAkU2VsZi0+e1Byb2ZpbGV9LAogICAgICAgICAgICAgICAgVGl0bGVOYW1lICAgICA9PiAkVGl0bGUsCiAgICAgICAgICAgICAgICBTb3J0QnkgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntTb3J0Qnl9ICksCiAgICAgICAgICAgICAgICBPcmRlckJ5ICAgICAgID0+ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntPcmRlckJ5fSApLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgIFJlcXVlc3RVUkwgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICAgICAgQnVsayAgICAgICAgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Db25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgICAgICBQcm9maWxlID0+ICRTZWxmLT57UHJvZmlsZX0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiAkQ2xhc3NJRCwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGJ1aWxkIGZvb3RlcgogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2FsbCBzZWFyY2ggZGlhbG9nIGZyb20gc2VhcmNoIGVtcHR5IHNjcmVlbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzZSB7CgogICAgICAgICMgc2hvdyBkZWZhdWx0IHNlYXJjaCBzY3JlZW4KICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgS2V5ICAgPT4gJ0lUU01Db25maWdJdGVtT3BlblNlYXJjaERpYWxvZycsCiAgICAgICAgICAgIFZhbHVlID0+IHsKICAgICAgICAgICAgICAgIFByb2ZpbGUgPT4gJFNlbGYtPntQcm9maWxlfSwKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBBY3Rpb24gID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0ZW1wbGF0ZQogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50SVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AgentITSMConfigItemZoom.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9BZ2VudElUU01Db25maWdJdGVtWm9vbS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRJVFNNQ29uZmlnSXRlbVpvb207Cgp1c2UgdjUuMjQ7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIG5hbWVzcGFjZTo6YXV0b2NsZWFuOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICByZXR1cm4gYmxlc3MgeyVQYXJhbX0sICRUeXBlOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcGFyYW0gb2JqZWN0CiAgICBteSAkUGFyYW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAkQ29uZmlnSXRlbUlEICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyApOwogICAgbXkgJEdldFBhcmFtVmVyc2lvbklEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZlcnNpb25JRCcgKTsKCiAgICAjIGdldCBsYXlvdXQgb2JqZWN0CiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkQ29uZmlnSXRlbUlEICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIENvbmZpZ0l0ZW1JRCBpcyBnaXZlbiEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzCiAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgU2NvcGUgID0+ICdJdGVtJywKICAgICAgICBJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIklUU01Db25maWdJdGVtOjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259IiktPntQZXJtaXNzaW9ufSwKICAgICk7CgogICAgaWYgKCAhJEhhc0FjY2VzcyApIHsKCiAgICAgICAgIyBlcnJvciBwYWdlCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnQ2FuXCd0IHNob3cgaXRlbSwgbm8gYWNjZXNzIHJpZ2h0cyBmb3IgQ29uZmlnSXRlbSBhcmUgZ2l2ZW4hJyksCiAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNvbnRlbnQKICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFZlcnNpb25JRCAgICAgPT4gJEdldFBhcmFtVmVyc2lvbklELAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CiAgICBpZiAoICEkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ0NvbmZpZ0l0ZW0gbm90IGZvdW5kIScpLAogICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2ZXJzaW9uIGxpc3QKICAgIG15ICRWZXJzaW9uTGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5WZXJzaW9uWm9vbUxpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmVyc2lvbkxpc3QpICkgewogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5FcnJvclNjcmVlbigKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCdObyB2ZXJzaW9ucyBmb3VuZCEnKSwKICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICk7CiAgICB9CgogICAgIyBUT0RPOiBDb21wYXJlIHdpdGggbGVnYWN5IGNvZGUgdG8gY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgZ29vZCBwbGFjZS4gTGluZSAyNTYgdGhyb3dzIGFuIGVycm9yIGlmIG5vdCBzZXQsIGVsc2UKICAgIG15ICRWZXJzaW9uSUQgPSAkQ29uZmlnSXRlbS0+e1ZlcnNpb25JRH07CgogICAgIyBydW4gY29uZmlnIGl0ZW0gbWVudSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0lUU01Db25maWdJdGVtOjpGcm9udGVuZDo6TWVudU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTWVudXMgICA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpNZW51TW9kdWxlJykgfTsKICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewoKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2V0IGNsYXNzZXMKICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gKSB7CgogICAgICAgICAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ1BvcFVwJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE1lbnVzeyRNZW51fS0+e01lbnVDbGFzc30gPSAnQXNQb3B1cCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJE1lbnVzeyRNZW51fS0+e1RhcmdldH0gZXEgJ0JhY2snICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTWVudXN7JE1lbnV9LT57TWVudUNsYXNzfSA9ICdIaXN0b3J5QmFjayc7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRDb3VudGVyID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRDb25maWdJdGVtLAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgICAgPT4gJENvdW50ZXIsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICA9PiAkTWVudXN7JE1lbnV9LAogICAgICAgICAgICAgICAgICAgIE1lbnVJRCAgICAgPT4gJE1lbnUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBpbmNpZGVudCBzaWduYWwKICAgIG15ICVJbmNpU2lnbmFscyA9ICgKICAgICAgICBUcmFuc2xhdGFibGUoJ29wZXJhdGlvbmFsJykgPT4gJ2dyZWVubGVkJywKICAgICAgICBUcmFuc2xhdGFibGUoJ3dhcm5pbmcnKSAgICAgPT4gJ3llbGxvd2xlZCcsCiAgICAgICAgVHJhbnNsYXRhYmxlKCdpbmNpZGVudCcpICAgID0+ICdyZWRsZWQnLAogICAgKTsKCiAgICAjIHRvIHN0b3JlIHRoZSBjb2xvciBmb3IgdGhlIGRlcGxveW1lbnQgc3RhdGVzCiAgICBteSAlRGVwbFNpZ25hbHM7CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgbGlzdCBvZiBkZXBsb3ltZW50IHN0YXRlcwogICAgbXkgJERlcGxveW1lbnRTdGF0ZXNMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICk7CgogICAgIyBzZXQgZGVwbG95bWVudCBzdHlsZSBjb2xvcnMKICAgIG15ICRTdHlsZUNsYXNzZXMgPSAnJzsKCiAgICBJVEVNSUQ6CiAgICBmb3IgbXkgJEl0ZW1JRCAoIHNvcnQga2V5cyAleyREZXBsb3ltZW50U3RhdGVzTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgcHJlZmVyZW5jZXMKICAgICAgICBteSAlUHJlZmVyZW5jZXMgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgYSBjb2xvciBpcyBkZWZpbmVkIGluIHByZWZlcmVuY2VzCiAgICAgICAgbmV4dCBJVEVNSUQgdW5sZXNzICRQcmVmZXJlbmNlc3tDb2xvcn07CiAgICAgICAgbXkgKCRDb2xvcikgPSAkUHJlZmVyZW5jZXN7Q29sb3J9LT5AKjsKICAgICAgICBuZXh0IElURU1JRCB1bmxlc3MgJENvbG9yOwoKICAgICAgICAjIGdldCBkZXBsb3ltZW50IHN0YXRlCiAgICAgICAgbXkgJERlcGxTdGF0ZSA9ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9OwoKICAgICAgICAjIHJlbW92ZSBhbnkgbm9uIGFzY2lpIHdvcmQgY2hhcmFjdGVycwogICAgICAgICREZXBsU3RhdGUgPX4gc3sgW15hLXpBLVowLTldIH17X31tc3hnOwoKICAgICAgICAjIHN0b3JlIHRoZSBvcmlnaW5hbCBkZXBsb3ltZW50IHN0YXRlIGFzIGtleQogICAgICAgICMgYW5kIHRoZSBzcyBzYWZlIGNvdmVydGVkIGRlcGxveW1lbnQgc3RhdGUgYXMgdmFsdWUKICAgICAgICAkRGVwbFNpZ25hbHN7ICREZXBsb3ltZW50U3RhdGVzTGlzdC0+eyRJdGVtSUR9IH0gPSAkRGVwbFN0YXRlOwoKICAgICAgICAjIGNvdmVydCB0byBsb3dlciBjYXNlCiAgICAgICAgbXkgJERlcGxTdGF0ZUNvbG9yID0gbGMoJENvbG9yKSA9fiBzL1teMC05YS1mXS8vbXNncjsKCiAgICAgICAgIyBhZGQgdG8gc3R5bGUgY2xhc3NlcyBzdHJpbmcKICAgICAgICAkU3R5bGVDbGFzc2VzIC49ICIKICAgICAgICAgICAgLkZsYWcgc3Bhbi4kRGVwbFN0YXRlIHsKICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMkRGVwbFN0YXRlQ29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAiOwogICAgfQoKICAgICMgd3JhcCBpbnRvIHN0eWxlIHRhZ3MKICAgIGlmICgkU3R5bGVDbGFzc2VzKSB7CiAgICAgICAgJFN0eWxlQ2xhc3NlcyA9ICI8c3R5bGU+JFN0eWxlQ2xhc3Nlczwvc3R5bGU+IjsKICAgIH0KCiAgICAjIGJ1aWxkIHZlcnNpb24gc2VsZWN0aW9uCiAgICBteSAkQmFzZUxpbmsgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGUgPT4gJ1slIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtWm9vbTsnCiAgICAgICAgICAgIC4gIkNvbmZpZ0l0ZW1JRD0kQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH07IgogICAgKTsKCiAgICBteSBAVmVyc2lvblNlbGVjdGlvbkRhdGEgPSBtYXAgewogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gKCAkQmFzZUxpbmsgLiAiVmVyc2lvbklEPSRfLT57VmVyc2lvbklEfSIgKSwKICAgICAgICAgICAgVmFsdWUgPT4gKAogICAgICAgICAgICAgICAgIlZlcnNpb24gIiAuICggJF8tPntWZXJzaW9uU3RyaW5nfSB8fCAkXy0+e1ZlcnNpb25JRH0gKQogICAgICAgICAgICApLAogICAgICAgIH0KICAgIH0gJFZlcnNpb25MaXN0LT5AKjsKCiAgICBteSAkVmVyc2lvblNlbGVjdGlvbiA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICA9PiBcQFZlcnNpb25TZWxlY3Rpb25EYXRhLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnVmVyc2lvblNlbGVjdGlvbicsCiAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgIFNlbGVjdGVkSUQgICA9PiAkVmVyc2lvbklEID8gJEJhc2VMaW5rIC4gIlZlcnNpb25JRD0kVmVyc2lvbklEIiA6IHVuZGVmLAogICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdTZWxlY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBWZXJzaW9uU2VsZWN0aW9uID0+ICRWZXJzaW9uU2VsZWN0aW9uLAogICAgICAgIH0sCiAgICApOwoKICAgICMgb3V0cHV0IGhlYWRlcgogICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVmFsdWUgPT4gIkNJIyRDb25maWdJdGVtLT57TnVtYmVyfSIgKTsKICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigpOwoKICAgICMgaWYgYSB2ZXJzaW9uIGFscmVhZHkgZXhpc3RzIChUT0RPOiBXaGVuIGRvZXMgaXQgbm90PykKICAgIGlmICggJENvbmZpZ0l0ZW0tPntOYW1lfSApIHsKCiAgICAgICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgICAgIG15ICRDb25maWdJdGVtTmFtZSA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgbmFtZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ05hbWUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbScpLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJENvbmZpZ0l0ZW1OYW1lLAogICAgICAgICAgICAgICAgSWRlbnRhdGlvbiAgPT4gMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgZGVwbG95bWVudCBzdGF0ZQogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRhJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiBUcmFuc2xhdGFibGUoJ0RlcGxveW1lbnQgU3RhdGUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIGRlcGxveW1lbnQgc3RhdGUgb2YgdGhpcyBjb25maWcgaXRlbScpLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57RGVwbFN0YXRlfSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBJZGVudGF0aW9uID0+IDEwLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGluY2lkZW50IHN0YXRlCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+IFRyYW5zbGF0YWJsZSgnSW5jaWRlbnQgU3RhdGUnKSwKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+IFRyYW5zbGF0YWJsZSgnVGhlIGluY2lkZW50IHN0YXRlIG9mIHRoaXMgY29uZmlnIGl0ZW0nKSwKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0luY2lTdGF0ZX0sCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgSWRlbnRhdGlvbiA9PiAxMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkRGVmaW5pdGlvbiA9ICRDb25maWdJdGVtT2JqZWN0LT5EZWZpbml0aW9uR2V0KAogICAgICAgICAgICBEZWZpbml0aW9uSUQgPT4gJENvbmZpZ0l0ZW0tPntEZWZpbml0aW9uSUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVHcm91cExvb2t1cDsKICAgICAgICBteSBAUGFnZXM7CiAgICAgICAgbXkgJFBhZ2VTaG93bjsKICAgICAgICBteSAkUGFnZVJlcXVlc3RlZCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdQYWdlJyApOwogICAgICAgIFBBR0U6CiAgICAgICAgZm9yIG15ICRQYWdlICggJERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfXtQYWdlc30tPkAqICkgewoKICAgICAgICAgICAgIyBJbnRlcmZhY2VzIGlzIG9wdGlvbmFsLCBlZmZlY3RpdmVseSBkZWZhdWx0IHRvIFsgJ0FnZW50JyBdCiAgICAgICAgICAgIGlmICggJFBhZ2UtPntJbnRlcmZhY2VzfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUEFHRSB1bmxlc3MgYW55IHsgJF8gZXEgJ0FnZW50JyB9ICRQYWdlLT57SW50ZXJmYWNlc30tPkAqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYWdlLT57R3JvdXBzfSApIHsKICAgICAgICAgICAgICAgIGlmICggISVHcm91cExvb2t1cCApIHsKICAgICAgICAgICAgICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdyYW50IGFjY2VzcyB0byB0aGUgcGFnZSBvbmx5IHdoZW4gdGhlIHVzZXIgaXMgaW4gb25lIG9mIHRoZSBzcGVjaWZpZWQgZ3JvdXBzCiAgICAgICAgICAgICAgICBuZXh0IFBBR0UgdW5sZXNzIGFueSB7ICRHcm91cExvb2t1cHskX30gfSAkUGFnZS0+e0dyb3Vwc30tPkAqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBQYWdlcywgJFBhZ2U7CgogICAgICAgICAgICBpZiAoICRQYWdlUmVxdWVzdGVkICYmICRQYWdlLT57TmFtZX0gZXEgJFBhZ2VSZXF1ZXN0ZWQgKSB7CiAgICAgICAgICAgICAgICAkUGFnZVNob3duID0gJFBhZ2U7CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAkUGFnZVNob3duIC8vPSBAUGFnZXMgPyAkUGFnZXNbMF0gOiB1bmRlZjsKCiAgICAgICAgaWYgKCBzY2FsYXIgQFBhZ2VzID09IDEgKSB7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VOYW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFBhZ2VOYW1lID0+ICRQYWdlc1swXXtOYW1lfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgbXkgJFBhZ2UgKEBQYWdlcykgewoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgUGFnZU5hbWUgICAgID0+ICRQYWdlLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb25JRCAgICA9PiAkR2V0UGFyYW1WZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkICAgICA9PiAkUGFnZS0+e05hbWV9IGVxICRQYWdlU2hvd24tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKEBQYWdlcykgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0R5bmFtaWNGaWVsZEhUTUx9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtOjpEeW5hbWljRmllbGQnKS0+UGFnZVJlbmRlcigKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgICAgICAgICBEZWZpbml0aW9uID0+ICREZWZpbml0aW9uLAogICAgICAgICAgICAgICAgUGFnZVJlZiAgICA9PiAkUGFnZVNob3duIC8vICRQYWdlc1swXSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMgZ2V0IHVzZXIgb2JqZWN0CiAgICBteSAkVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyk7CgogICAgIyBnZXQgY3JlYXRlICYgY2hhbmdlIHVzZXIgZGF0YQogICAgZm9yIG15ICRLZXkgKHF3KENyZWF0ZSBDaGFuZ2UpKSB7CiAgICAgICAgJENvbmZpZ0l0ZW0tPnsgJEtleSAuICdCeVVzZXJGdWxsTmFtZScgfSA9ICRVc2VyT2JqZWN0LT5Vc2VyTmFtZSgKICAgICAgICAgICAgVXNlcklEID0+ICRDb25maWdJdGVtLT57ICRLZXkgLiAnQnknIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCBtZXRhIGJsb2NrCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJXskQ29uZmlnSXRlbX0sCiAgICAgICAgICAgIEN1ckluY2lTaWduYWwgPT4gJEluY2lTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9IH0sCiAgICAgICAgICAgIEN1ckRlcGxTaWduYWwgPT4gJERlcGxTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZX0gfSwKICAgICAgICB9LAogICAgKTsKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICMgZGlzcGxheSBjb25maWcgaXRlbSBwZXJtaXNzaW9uIGdyb3VwIGluIHRoZSBtZXRhIGJsb2NrIGlmIHRoYXQgZmVhdHVyZSBpcyBlbmFibGVkIGZvciB0aGUgY2xhc3MKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0KAogICAgICAgIEl0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKICAgIGlmICggJENsYXNzUHJlZmVyZW5jZXN7Q29uZmlnSXRlbUdyb3VwfSAmJiAkQ2xhc3NQcmVmZXJlbmNlc3tDb25maWdJdGVtR3JvdXB9WzBdICkgewogICAgICAgIG15ICRHcm91cE5hbWU7CiAgICAgICAgaWYgKCRDb25maWdJdGVtLT57R3JvdXBJRH0pIHsKICAgICAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CiAgICAgICAgICAgIG15ICVHcm91cHMgICAgICA9ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEdyb3VwTmFtZSA9ICRHcm91cHN7ICRDb25maWdJdGVtLT57R3JvdXBJRH0gfTsKICAgICAgICB9CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBHcm91cE5hbWUgPT4gJEdyb3VwTmFtZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdCcpLT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0xpbmtPYmplY3Q6OlZpZXdNb2RlJyk7CgogICAgIyBjcmVhdGUgdGhlIGxpbmsgdGFibGUKICAgIG15ICRMaW5rVGFibGVTdHJnID0gJExheW91dE9iamVjdC0+TGlua09iamVjdFRhYmxlQ3JlYXRlKAogICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgVmlld01vZGUgICAgICAgICA9PiAkTGlua1RhYmxlVmlld01vZGUsCiAgICAgICAgT2JqZWN0ICAgICAgICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgIEtleSAgICAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICk7CgogICAgIyBvdXRwdXQgdGhlIGxpbmsgdGFibGUKICAgIGlmICgkTGlua1RhYmxlU3RyZykgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGUnIC4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIExpbmtUYWJsZVN0cmcgPT4gJExpbmtUYWJsZVN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbUlELAogICAgKTsKCiAgICBteSBATm9uSW5saW5lQXR0YWNobWVudHM7CgogICAgQVRUQUNITUVOVDoKICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICMgZ2V0IHRoZSBtZXRhZGF0YSBvZiB0aGUgY3VycmVudCBhdHRhY2htZW50CiAgICAgICAgbXkgJEF0dGFjaG1lbnREYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50LAogICAgICAgICk7CiAgICAgICAgcHVzaCBATm9uSW5saW5lQXR0YWNobWVudHMsICRBdHRhY2htZW50RGF0YTsKICAgIH0KCiAgICBpZiAoQE5vbklubGluZUF0dGFjaG1lbnRzKSB7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBdHRhY2htZW50cycsCiAgICAgICAgKTsKCiAgICAgICAgQVRUQUNITUVOVDoKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnREYXRhIChATm9uSW5saW5lQXR0YWNobWVudHMpIHsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICAgPT4gJEF0dGFjaG1lbnREYXRhLT57RmlsZW5hbWV9LAogICAgICAgICAgICAgICAgICAgIEZpbGVzaXplICAgICA9PiAkQXR0YWNobWVudERhdGEtPntGaWxlc2l6ZX0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBEb3dubG9hZEF0dGFjaG1lbnQKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZEF0dGFjaG1lbnQnICkgewoKICAgICAgICAjIGdldCBkYXRhIGZvciBhdHRhY2htZW50CiAgICAgICAgbXkgJEZpbGVuYW1lICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbGVuYW1lJyApOwogICAgICAgIG15ICRBdHRhY2htZW50RGF0YSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQXR0YWNobWVudEdldCgKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkRmlsZW5hbWUsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gZXJyb3IgaWYgZmlsZSBkb2VzIG5vdCBleGlzdAogICAgICAgIGlmICggISRBdHRhY2htZW50RGF0YSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBhdHRhY2htZW50ICgkRmlsZW5hbWUpISIsCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RXJyb3JTY3JlZW4oKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgICAgICAleyRBdHRhY2htZW50RGF0YX0sCiAgICAgICAgICAgIFR5cGUgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyktPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlblZpZXcnLAogICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnVXNlckNvbmZpZ0l0ZW1ab29tVGFibGVIZWlnaHQnLAogICAgICAgIFZhbHVlID0+ICRTZWxmLT57U2Vzc2lvbn17VXNlckNvbmZpZ0l0ZW1ab29tVGFibGVIZWlnaHR9LAogICAgKTsKCiAgICAjIHN0YXJ0IHRlbXBsYXRlIG91dHB1dAogICAgcmV0dXJuIGpvaW4gJycsCiAgICAgICAgJE91dHB1dCwKICAgICAgICAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRJVFNNQ29uZmlnSXRlbVpvb20nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPiUqLAogICAgICAgICAgICAgICAgQ3VySW5jaVNpZ25hbCA9PiAkSW5jaVNpZ25hbHN7ICRDb25maWdJdGVtLT57Q3VySW5jaVN0YXRlVHlwZX0gfSwKICAgICAgICAgICAgICAgIEN1ckRlcGxTaWduYWwgPT4gJERlcGxTaWduYWxzeyAkQ29uZmlnSXRlbS0+e0N1ckRlcGxTdGF0ZX0gfSwKICAgICAgICAgICAgICAgIFN0eWxlQ2xhc3NlcyAgPT4gJFN0eWxlQ2xhc3NlcywKICAgICAgICAgICAgfSwKICAgICAgICApLAogICAgICAgICRMYXlvdXRPYmplY3QtPkZvb3RlcjsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/CustomerITSMConfigItem.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9DdXN0b21lcklUU01Db25maWdJdGVtLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lcklUU01Db25maWdJdGVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55IG5vbmUpOwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCBkZWJ1ZwogICAgJFNlbGYtPntEZWJ1Z30gPSAwOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICBteSAkU29ydEJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvcnRCeScgKQogICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICB8fCAnQWdlJzsKCiAgICBpZiAoICRTb3J0QnkgZXEgJ0xhc3RDaGFuZ2VkJyApIHsKICAgICAgICAkU29ydEJ5ID0gJ0NoYW5nZWQnOwogICAgfQoKICAgICMgRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IG9yZGVyaW5nIHRvIGJlIHVzZWQuCiAgICBteSAkRGVmYXVsdE9yZGVyQnkgPSAkQ29uZmlnLT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICB8fCAnVXAnOwoKICAgICMgU2V0IHRoZSBzb3J0IG9yZGVyIGZyb20gdGhlIHJlcXVlc3QgcGFyYW1ldGVycywgb3IgdGFrZSB0aGUgZGVmYXVsdC4KICAgIG15ICRPcmRlckJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICB8fCAkRGVmYXVsdE9yZGVyQnk7CgogICAgIyBnZXQgc2Vzc2lvbiBvYmplY3QKICAgIG15ICRTZXNzaW9uT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgJFNlc3Npb25PYmplY3QtPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgKTsKCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgICMgZ2V0IGZpbHRlciBmcm9tIHdlYiByZXF1ZXN0CiAgICBteSAkRmlsdGVyID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0ZpbHRlcicgKSB8fCAnJzsKCiAgICAjIGdldCBmaWx0ZXJzIHN0b3JlZCBpbiB0aGUgdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwogICAgbXkgJFN0b3JlZEZpbHRlcnNLZXkgPSAnVXNlclN0b3JlZEZpbHRlckNvbHVtbnMtJyAuICRTZWxmLT57QWN0aW9ufSAuICctJyAuICRGaWx0ZXI7CiAgICBteSAkSlNPTk9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpKU09OJyk7CiAgICBteSAkU3RvcmVkRmlsdGVycyAgICA9ICRKU09OT2JqZWN0LT5EZWNvZGUoCiAgICAgICAgRGF0YSA9PiAkUHJlZmVyZW5jZXN7JFN0b3JlZEZpbHRlcnNLZXl9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBzdG9yZWQgZmlsdGVycyBpZiBuZWVkZWQKICAgIGlmICggJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0RlbGV0ZUZpbHRlcnMnICkgKSB7CiAgICAgICAgJFN0b3JlZEZpbHRlcnMgPSB7fTsKICAgIH0KCiAgICAjIGdldCB0aGUgY29sdW1uIGZpbHRlcnMgZnJvbSB0aGUgd2ViIHJlcXVlc3Qgb3IgdXNlciBwcmVmZXJlbmNlcwogICAgbXkgJUNvbHVtbkZpbHRlcjsKICAgIG15ICVHZXRDb2x1bW5GaWx0ZXI7CiAgICBDT0xVTU5OQU1FOgogICAgZm9yIG15ICRDb2x1bW5OYW1lICgKICAgICAgICBxdyhEZXBsU3RhdGUgQ3VyRGVwbFN0YXRlIEluY2lTdGF0ZSBDdXJJbmNpU3RhdGUgQ2xhc3MpCiAgICAgICAgKQogICAgewogICAgICAgICMgZ2V0IGNvbHVtbiBmaWx0ZXIgZnJvbSB3ZWIgcmVxdWVzdAogICAgICAgIG15ICRGaWx0ZXJWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb2x1bW5GaWx0ZXInIC4gJENvbHVtbk5hbWUgKQogICAgICAgICAgICB8fCAnJzsKCiAgICAgICAgIyBpZiBmaWx0ZXIgaXMgbm90IHByZXNlbnQgaW4gdGhlIHdlYiByZXF1ZXN0LCB0cnkgd2l0aCB0aGUgdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICggJEZpbHRlclZhbHVlIGVxICcnICkgewogICAgICAgICAgICAkRmlsdGVyVmFsdWUgPSAkU3RvcmVkRmlsdGVycy0+eyAkQ29sdW1uTmFtZSAuICdJRHMnIH0tPlswXSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICRGaWx0ZXJWYWx1ZSBlcSAnJzsKICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgJEZpbHRlclZhbHVlIGVxICdEZWxldGVGaWx0ZXInOwoKICAgICAgICBwdXNoIEB7ICRDb2x1bW5GaWx0ZXJ7ICRDb2x1bW5OYW1lIC4gJ0lEcycgfSB9LCAkRmlsdGVyVmFsdWU7CiAgICAgICAgJEdldENvbHVtbkZpbHRlcnskQ29sdW1uTmFtZX0gPSAkRmlsdGVyVmFsdWU7CiAgICB9CgogICAgIyBnZXQgYWxsIGR5bmFtaWMgZmllbGRzCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydJVFNNQ29uZmlnSXRlbSddLAogICAgKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7ICRTZWxmLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAjIGdldCBmaWx0ZXIgZnJvbSB3ZWIgcmVxdWVzdAogICAgICAgIG15ICRGaWx0ZXJWYWx1ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdDb2x1bW5GaWx0ZXJEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfQogICAgICAgICk7CgogICAgICAgICMgaWYgbm8gZmlsdGVyIGZyb20gd2ViIHJlcXVlc3QsIHRyeSBmcm9tIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICFkZWZpbmVkICRGaWx0ZXJWYWx1ZSB8fCAkRmlsdGVyVmFsdWUgZXEgJycgKSB7CiAgICAgICAgICAgICRGaWx0ZXJWYWx1ZSA9ICRTdG9yZWRGaWx0ZXJzLT57ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LT57RXF1YWxzfTsKICAgICAgICB9CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFkZWZpbmVkICRGaWx0ZXJWYWx1ZTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAkRmlsdGVyVmFsdWUgZXEgJyc7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgJEZpbHRlclZhbHVlIGVxICdEZWxldGVGaWx0ZXInOwoKICAgICAgICAkQ29sdW1uRmlsdGVyeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9IHsKICAgICAgICAgICAgRXF1YWxzID0+ICRGaWx0ZXJWYWx1ZSwKICAgICAgICB9OwogICAgICAgICRHZXRDb2x1bW5GaWx0ZXJ7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJEZpbHRlclZhbHVlOwogICAgfQoKICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhciAmIHRvIGdldCB0aGUgb3V0cHV0IGZhc3RlciEKICAgIG15ICRSZWZyZXNoID0gJyc7CiAgICBpZiAoICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSApIHsKICAgICAgICAkUmVmcmVzaCA9IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9OwogICAgfQoKICAgICMgZ2V0IGxheW91dCBvYmplY3QKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgbXkgJE91dHB1dDsKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IG5lICdBSkFYRmlsdGVyVXBkYXRlJyApIHsKICAgICAgICAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgIFJlZnJlc2ggPT4gJFJlZnJlc2gsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNvcnQgb24gZGVmYXVsdCBieSB1c2luZyBib3RoIChQcmlvcml0eSwgQWdlKSBlbHNlIHVzZSBvbmx5IG9uZSBzb3J0IGFyZ3VtZW50CiAgICBteSAlU29ydDsKCiAgICAjIGdldCBpZiBzZWFyY2ggcmVzdWx0IHNob3VsZCBiZSBwcmUtc29ydGVkIGJ5IHByaW9yaXR5CiAgICBteSAkUHJlU29ydEJ5UHJpb3JpdHkgPSAkQ29uZmlnLT57J1ByZVNvcnQ6OkJ5UHJpb3JpdHknfTsKICAgIGlmICggISRQcmVTb3J0QnlQcmlvcml0eSApIHsKICAgICAgICAlU29ydCA9ICgKICAgICAgICAgICAgU29ydEJ5ICA9PiAkU29ydEJ5LAogICAgICAgICAgICBPcmRlckJ5ID0+ICRPcmRlckJ5LAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAlU29ydCA9ICgKICAgICAgICAgICAgU29ydEJ5ICA9PiBbICdQcmlvcml0eScsICRTb3J0QnkgXSwKICAgICAgICAgICAgT3JkZXJCeSA9PiBbICdEb3duJywgICAgICRPcmRlckJ5IF0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG15IGNvbmZpZyBpdGVtIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIGRlZmluZSBwb3NpdGlvbiBvZiB0aGUgZmlsdGVyIGluIHRoZSBmcm9udGVuZAogICAgbXkgJFByaW9Db3VudGVyID0gMTAwMDsKCiAgICAjIHRvIHN0b3JlIHRoZSBOYXZCYXIgZmlsdGVycwogICAgbXkgJUZpbHRlcnM7CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIG9iamVjdAogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CgogICAgIyBnZXQgY2xhc3MgbGlzdAogICAgbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICBWYWxpZCA9PiAxLAogICAgKTsKCiAgICBteSAkRGVwbFN0YXRlTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgbXkgQFZpZXdhYmxlRGVwbFN0YXRlSURzOwogICAgbXkgQFZpZXdhYmxlQ2xhc3NJRHM7CgogICAgIyBmZXRjaCBmaWx0ZXJzIGZyb20gY29uZmlnCiAgICBteSAkUGVybWlzc2lvbkNvbmRpdGlvbnNDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyOjpDb25maWdJdGVtOjpQZXJtaXNzaW9uQ29uZGl0aW9ucycpOwogICAgbXkgJUdyb3VwTG9va3VwOwoKICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBlcm1pc3Npb25Db25kaXRpb25zQ29uZmlnKSApIHsKICAgICAgICBQRVJNQ09ORjoKICAgICAgICBmb3IgbXkgJENvbmZpZ0lkZW50aWZpZXIgKCBzb3J0IGtleXMgJFBlcm1pc3Npb25Db25kaXRpb25zQ29uZmlnLT4lKiApIHsKICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Db25kaXRpb25Db25maWcgPSAkUGVybWlzc2lvbkNvbmRpdGlvbnNDb25maWctPnskQ29uZmlnSWRlbnRpZmllcn07CiAgICAgICAgICAgIG5leHQgUEVSTUNPTkYgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnKTsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIGdyb3VwIHBlcm1pc3Npb24KICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57R3JvdXBzfSApICkgewoKICAgICAgICAgICAgICAgICMgcHJlcGFyZSBncm91cCBsb29rdXAgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICBpZiAoICElR3JvdXBMb29rdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgJUdyb3VwTG9va3VwID0gcmV2ZXJzZSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gMDsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cE5hbWUgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0dyb3Vwc30tPkAqICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRHcm91cExvb2t1cHskR3JvdXBOYW1lfTsKCiAgICAgICAgICAgICAgICAgICAgJEFjY2Vzc09rID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBuZXh0IFBFUk1DT05GIHVubGVzcyAkQWNjZXNzT2s7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IGFzIHNlbGVjdGVkIGZpbHRlciBpZiBub3QgcHJlc2VudAogICAgICAgICAgICAkRmlsdGVyIHx8PSAkQ29uZmlnSWRlbnRpZmllcjsKCiAgICAgICAgICAgICMgY29sbGVjdCBkeW5hbWljIGZpZWxkIHNlYXJjaCBwYXJhbXMKICAgICAgICAgICAgbXkgJURGU2VhcmNoUGFyYW1zOwogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0R5bmFtaWNGaWVsZFZhbHVlc30gKSApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICAgICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkTmFtZSAoIGtleXMgJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEeW5hbWljRmllbGRWYWx1ZXN9LT4lKiApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRmllbGROYW1lLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfXskRmllbGROYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJERGU2VhcmNoUGFyYW1zeyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRXF1YWxzID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfXskRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0R5bmFtaWNGaWVsZFZhbHVlc317JEZpZWxkTmFtZX0gZXEgJycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRERlNlYXJjaFBhcmFtc3siRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVtcHR5ID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlUGVybWlzc2lvbkNvbmRpdGlvblNlYXJjaFBhcmFtczsKICAgICAgICAgICAgaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0N1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICAgICAkUGVybWlzc2lvbkNvbmRpdGlvblNlYXJjaFBhcmFtc3siRHluYW1pY0ZpZWxkXyRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkfSJ9ID0gewogICAgICAgICAgICAgICAgICAgIEVxdWFscyA9PiAkU2VsZi0+e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgICAgICRQZXJtaXNzaW9uQ29uZGl0aW9uU2VhcmNoUGFyYW1zeyJEeW5hbWljRmllbGRfJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDdXN0b21lclVzZXJEeW5hbWljRmllbGR9In0gPSB7CiAgICAgICAgICAgICAgICAgICAgRXF1YWxzID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICVGaWx0ZXJTZWFyY2ggPSAoCiAgICAgICAgICAgICAgICBDbGFzc2VzICAgID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q2xhc3Nlc30sCiAgICAgICAgICAgICAgICBEZXBsU3RhdGVzID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc30sCiAgICAgICAgICAgICAgICAlREZTZWFyY2hQYXJhbXMsCiAgICAgICAgICAgICAgICAlUGVybWlzc2lvbkNvbmRpdGlvblNlYXJjaFBhcmFtcywKICAgICAgICAgICAgICAgICVTb3J0LAogICAgICAgICAgICAgICAgTGltaXQgPT4gJFNlbGYtPntTZWFyY2hMaW1pdH0gLy8gJzEwMDAnLAogICAgICAgICAgICApOwojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICAgICAgICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CiAgICAgICAgICAgICAgICBteSAlQXV0aG9yaXplZEdyb3Vwc0hhc2ggPSAkQ3VzdG9tZXJHcm91cE9iamVjdC0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSBAQXV0aG9yaXplZEdyb3VwSURzID0ga2V5cyAlQXV0aG9yaXplZEdyb3Vwc0hhc2g7CiAgICAgICAgICAgICAgICAkRmlsdGVyU2VhcmNoe0dyb3VwSURzfSA9IFxAQXV0aG9yaXplZEdyb3VwSURzOwogICAgICAgICAgICB9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgIyBhcHBseSBmaWx0ZXIgcmVzdHJpY3Rpb25zIHRvIHNlYXJjaCBmb3IKICAgICAgICAgICAgaWYgKCAkR2V0Q29sdW1uRmlsdGVye0NsYXNzfSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDbGFzc2VzfS0+QCogKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCBhbnkgeyAkQ2xhc3NMaXN0LT57ICRHZXRDb2x1bW5GaWx0ZXJ7Q2xhc3N9IH0gZXEgJF8gfSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0NsYXNzZXN9LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQFZpZXdhYmxlQ2xhc3NJRHMgPSAoICRHZXRDb2x1bW5GaWx0ZXJ7Q2xhc3N9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRGaWx0ZXJTZWFyY2h7Q2xhc3Nlc30gPSBbICRDbGFzc0xpc3QtPnsgJEdldENvbHVtbkZpbHRlcntDbGFzc30gfSBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIEBWaWV3YWJsZUNsYXNzSURzID0gKCAkR2V0Q29sdW1uRmlsdGVye0NsYXNzfSApOwogICAgICAgICAgICAgICAgICAgICRGaWx0ZXJTZWFyY2h7Q2xhc3Nlc30gPSBbICRDbGFzc0xpc3QtPnsgJEdldENvbHVtbkZpbHRlcntDbGFzc30gfSBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgQFZpZXdhYmxlQ2xhc3NJRHMgPSBzb3J0IGtleXMgJENsYXNzTGlzdC0+JSo7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkR2V0Q29sdW1uRmlsdGVye0RlcGxTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc30tPkAqICkgewogICAgICAgICAgICAgICAgICAgIGlmICggYW55IHsgJERlcGxTdGF0ZUxpc3QtPnsgJEdldENvbHVtbkZpbHRlcntEZXBsU3RhdGV9IH0gZXEgJF8gfSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0RlcGxveW1lbnRTdGF0ZXN9LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICAgICAgQFZpZXdhYmxlRGVwbFN0YXRlSURzID0gKCAkR2V0Q29sdW1uRmlsdGVye0RlcGxTdGF0ZX0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEZpbHRlclNlYXJjaHtEZXBsU3RhdGVzfSA9IFsgJERlcGxTdGF0ZUxpc3QtPnsgJEdldENvbHVtbkZpbHRlcntEZXBsU3RhdGV9IH0gXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBAVmlld2FibGVEZXBsU3RhdGVJRHMgPSAoICRHZXRDb2x1bW5GaWx0ZXJ7RGVwbFN0YXRlfSApOwogICAgICAgICAgICAgICAgICAgICRGaWx0ZXJTZWFyY2h7RGVwbFN0YXRlc30gPSBbICREZXBsU3RhdGVMaXN0LT57ICRHZXRDb2x1bW5GaWx0ZXJ7RGVwbFN0YXRlfSB9IF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBAVmlld2FibGVEZXBsU3RhdGVJRHMgPSBzb3J0IGtleXMgJERlcGxTdGF0ZUxpc3QtPiUqOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgICAgICBpZiAoIEBWaWV3YWJsZUNsYXNzSURzICYmIEBWaWV3YWJsZURlcGxTdGF0ZUlEcyApIHsKICAgICAgICAgICAgICAgICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgICAgICAgICAgICAgICVGaWx0ZXJTZWFyY2gsCiAgICAgICAgICAgICAgICAgICAgJUNvbHVtbkZpbHRlciwKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0NPVU5UJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRGaWx0ZXJzeyRDb25maWdJZGVudGlmaWVyfSA9IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgUHJpbyAgID0+ICRQcmlvQ291bnRlciwKICAgICAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gXCVGaWx0ZXJTZWFyY2gsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgICRQcmlvQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIGlmIG9ubHkgb25lIGZpbHRlciBleGlzdHMKICAgIGlmICggc2NhbGFyIGtleXMgJUZpbHRlcnMgPT0gMSApIHsKCiAgICAgICAgIyBnZXQgdGhlIG5hbWUgb2YgdGhlIG9ubHkgZmlsdGVyCiAgICAgICAgbXkgKCRGaWx0ZXJOYW1lKSA9IGtleXMgJUZpbHRlcnM7CgogICAgICAgICMgYWN0aXZhdGUgdGhpcyBmaWx0ZXIKICAgICAgICAkRmlsdGVyID0gJEZpbHRlck5hbWU7CiAgICB9CgogICAgIyBjaGVjayBpZiBmaWx0ZXIgaXMgdmFsaWQKICAgIGlmICggJEZpbHRlciAmJiAhZXhpc3RzICRGaWx0ZXJzeyRGaWx0ZXJ9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAnSW52YWxpZCBGaWx0ZXI6ICVzIScsICRGaWx0ZXIgKSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBoZWFkZXIgZmlsdGVyCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRmlsdGVycyApIHsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpbHRlckhlYWRlcicsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEtleX0gfSwKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkS2V5LAogICAgICAgICAgICAgICAgQ2xhc3NBID0+ICRLZXkgZXEgJEZpbHRlciA/ICdTZWxlY3RlZCcgOiAnJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBmaWx0ZXIgZGVsZXRlIGlmIG5lZWRlZAogICAgaWYgKCVHZXRDb2x1bW5GaWx0ZXIpIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRmlsdGVyRGVsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlciwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgIG15ICRWaWV3ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ZpZXcnICkgfHwgJyc7CgogICAgIyBsb29rdXAgbGF0ZXN0IHVzZWQgdmlldyBtb2RlCiAgICBpZiAoICEkVmlldyAmJiAkU2VsZi0+eyAnVXNlckNvbmZpZ0l0ZW1PdmVydmlldycgLiAkU2VsZi0+e0FjdGlvbn0gfSApIHsKICAgICAgICAkVmlldyA9ICRTZWxmLT57ICdVc2VyQ29uZmlnSXRlbU92ZXJ2aWV3JyAuICRTZWxmLT57QWN0aW9ufSB9OwogICAgfQoKICAgICMgb3RoZXJ3aXNlIHVzZSBQcmV2aWV3IGFzIGRlZmF1bHQgYXMgaW4gTGF5b3V0Q29uZmlnSXRlbQogICAgJFZpZXcgfHw9ICdTbWFsbCc7CgogICAgIyBDaGVjayBpZiBzZWxlY3RlZCB2aWV3IGlzIGF2YWlsYWJsZS4KICAgIG15ICRCYWNrZW5kcyA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjpDdXN0b21lck92ZXJ2aWV3Jyk7CiAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CgogICAgICAgICMgVHJ5IHRvIGZpbmQgZmFsbGJhY2ssIHRha2UgZmlyc3QgY29uZmlndXJlZCB2aWV3IG1vZGUuCiAgICAgICAgS0VZOgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEJhY2tlbmRzfSApIHsKICAgICAgICAgICAgJFZpZXcgPSAkS2V5OwogICAgICAgICAgICBsYXN0IEtFWTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgcGFnZSBzaG93biBjb3VudAogICAgbXkgJFBhZ2VTaG93biA9ICRCYWNrZW5kcy0+eyRWaWV3fSA/ICRCYWNrZW5kcy0+eyRWaWV3fS0+e1BhZ2VTaG93bn0gOiAxMDsKICAgIG15ICVQYWdlTmF2OwoKICAgICMgZG8gc2hvd24gY29uZmlnIGl0ZW0gbG9va3VwCiAgICBteSAkTGltaXQgPSAxXzAwMDsKCiAgICBteSAkRWxlbWVudENoYW5nZWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnICkgfHwgJyc7CiAgICBteSAkSGVhZGVyQ29sdW1uICAgPSAkRWxlbWVudENoYW5nZWQ7CiAgICAkSGVhZGVyQ29sdW1uID1+IHN7XEEgQ29sdW1uRmlsdGVyIH17fW1zeGc7CgogICAgIyBnZXQgZGF0YSAodmlld2FibGUgY29uZmlnIGl0ZW1zLi4uKQogICAgIyBzZWFyY2ggYWxsIGNvbmZpZyBpdGVtcwogICAgbXkgQFZpZXdhYmxlQ29uZmlnSXRlbXM7CiAgICBteSBAT3JpZ2luYWxWaWV3YWJsZUNvbmZpZ0l0ZW1zOwoKICAgICMgYnVpbGQgbGlua3MKICAgIG15ICRDb2x1bW5GaWx0ZXJMaW5rID0gJyc7CiAgICBDT0xVTU5OQU1FOgogICAgZm9yIG15ICRDb2x1bW5OYW1lICggc29ydCBrZXlzICVHZXRDb2x1bW5GaWx0ZXIgKSB7CiAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICEkQ29sdW1uTmFtZTsKICAgICAgICBuZXh0IENPTFVNTk5BTUUgaWYgIWRlZmluZWQgJEdldENvbHVtbkZpbHRlcnskQ29sdW1uTmFtZX07CiAgICAgICAgbmV4dCBDT0xVTU5OQU1FIGlmICRHZXRDb2x1bW5GaWx0ZXJ7JENvbHVtbk5hbWV9IGVxICcnOwogICAgICAgICRDb2x1bW5GaWx0ZXJMaW5rCiAgICAgICAgICAgIC49ICc7JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJ0NvbHVtbkZpbHRlcicgLiAkQ29sdW1uTmFtZSApCiAgICAgICAgICAgIC4gJz0nIC4gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJEdldENvbHVtbkZpbHRlcnskQ29sdW1uTmFtZX0gKTsKICAgIH0KCiAgICBteSAkTGlua1BhZ2UgPSAnRmlsdGVyPScKICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEZpbHRlciApCiAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFZpZXcgKQogICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJENvbHVtbkZpbHRlckxpbmsKICAgICAgICAuICc7JzsKCiAgICBteSAkTGlua1NvcnQgPSAnVmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkVmlldyApCiAgICAgICAgLiAnO0ZpbHRlcj0nCiAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRGaWx0ZXIgKQogICAgICAgIC4gJENvbHVtbkZpbHRlckxpbmsKICAgICAgICAuICc7JzsKCiAgICBteSAkTGlua0ZpbHRlciA9ICdTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgLiAnO09yZGVyQnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJE9yZGVyQnkgKQogICAgICAgIC4gJztWaWV3PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRWaWV3ICkKICAgICAgICAuICc7JzsKCiAgICBteSAkTGFzdENvbHVtbkZpbHRlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdMYXN0Q29sdW1uRmlsdGVyJyApIHx8ICcnOwoKICAgIGlmICggISRMYXN0Q29sdW1uRmlsdGVyICYmICRDb2x1bW5GaWx0ZXJMaW5rICkgewoKICAgICAgICAjIGlzIHBsYW5uZWQgdG8gaGF2ZSBhIGxpbmsgdG8gZ28gYmFjayBoZXJlCiAgICAgICAgJExhc3RDb2x1bW5GaWx0ZXIgPSAxOwogICAgfQoKICAgIGlmICggQFZpZXdhYmxlRGVwbFN0YXRlSURzICYmIEBWaWV3YWJsZUNsYXNzSURzICkgewoKICAgICAgICAjIGdldCBjb25maWcgaXRlbSB2YWx1ZXMKICAgICAgICBpZiAoCiAgICAgICAgICAgICFJc1N0cmluZ1dpdGhEYXRhKCRIZWFkZXJDb2x1bW4pCiAgICAgICAgICAgIHx8ICgKICAgICAgICAgICAgICAgIElzU3RyaW5nV2l0aERhdGEoJEhlYWRlckNvbHVtbikKICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ09ubHlWYWx1ZXNPbkNvbmZpZ0l0ZW0nKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57U2VhcmNofSB9LAogICAgICAgICAgICAgICAgJUNvbHVtbkZpbHRlciwKICAgICAgICAgICAgICAgIExpbWl0ICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRTdGFydEhpdCA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTdGFydEhpdCcgKSB8fCAxOwoKICAgICAgICAgICAgJVBhZ2VOYXYgPSAkTGF5b3V0T2JqZWN0LT5QYWdlTmF2QmFyKAogICAgICAgICAgICAgICAgTGltaXQgICAgID0+IDEwMDAwLAogICAgICAgICAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICAgICAgICAgIFBhZ2VTaG93biA9PiAkUGFnZVNob3duLAogICAgICAgICAgICAgICAgQWxsSGl0cyAgID0+IHNjYWxhciBAT3JpZ2luYWxWaWV3YWJsZUNvbmZpZ0l0ZW1zLAogICAgICAgICAgICAgICAgQWN0aW9uICAgID0+ICdBY3Rpb249Q3VzdG9tZXJJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICBMaW5rICAgICAgPT4gJExpbmtQYWdlLAogICAgICAgICAgICAgICAgSURQcmVmaXggID0+ICdDdXN0b21lcklUU01Db25maWdJdGVtJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIEBWaWV3YWJsZUNvbmZpZ0l0ZW1zID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfS0+e1NlYXJjaH0gfSwKICAgICAgICAgICAgICAgICVDb2x1bW5GaWx0ZXIsCiAgICAgICAgICAgICAgICBMaW1pdCAgPT4gJFN0YXJ0SGl0ICsgJFBhZ2VTaG93biAtIDEsCiAgICAgICAgICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICMgVE9ETyBNYXliZSB0aGVyZSBpcyBhIG1vcmUgZWxlZ2FudCB3YXkgdG8gZG8gdGhpcz8KICAgICRTZWxmLT57RmlsdGVyfSAgPSAkRmlsdGVyOwogICAgJFNlbGYtPntGaWx0ZXJzfSA9IFwlRmlsdGVyczsKCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQUpBWEZpbHRlclVwZGF0ZScgKSB7CgogICAgICAgIG15ICRGaWx0ZXJDb250ZW50ID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1MaXN0U2hvdygKICAgICAgICAgICAgRmlsdGVyQ29udGVudE9ubHkgICAgID0+IDEsCiAgICAgICAgICAgIEhlYWRlckNvbHVtbiAgICAgICAgICA9PiAkSGVhZGVyQ29sdW1uLAogICAgICAgICAgICBFbGVtZW50Q2hhbmdlZCAgICAgICAgPT4gJEVsZW1lbnRDaGFuZ2VkLAogICAgICAgICAgICBPcmlnaW5hbENvbmZpZ0l0ZW1JRHMgPT4gXEBPcmlnaW5hbFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIEVudiAgICAgICAgICAgICAgICAgICA9PiAkU2VsZiwKICAgICAgICAgICAgVmlldyAgICAgICAgICAgICAgICAgID0+ICRWaWV3LAogICAgICAgICAgICBFbmFibGVDb2x1bW5GaWx0ZXJzICAgPT4gMSwKICAgICAgICAgICAgRnJvbnRlbmQgICAgICAgICAgICAgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIEZpbHRlciAgICAgICAgICAgICAgICA9PiAkRmlsdGVyLAogICAgICAgICAgICBGaWx0ZXJzICAgICAgICAgICAgICAgPT4gXCVGaWx0ZXJzLAogICAgICAgICk7CgogICAgICAgIGlmICggISRGaWx0ZXJDb250ZW50ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoICdDYW5cJ3QgZ2V0IGZpbHRlciBjb250ZW50IGRhdGEgb2YgJXMhJywgJEhlYWRlckNvbHVtbiApLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uJywKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEZpbHRlckNvbnRlbnQsCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBzdG9yZSBjb2x1bW4gZmlsdGVycwogICAgICAgIG15ICRTdG9yZWRGaWx0ZXJzID0gXCVDb2x1bW5GaWx0ZXI7CgogICAgICAgIG15ICRTdG9yZWRGaWx0ZXJzS2V5ID0gJ1VzZXJTdG9yZWRGaWx0ZXJDb2x1bW5zLScgLiAkU2VsZi0+e0FjdGlvbn0gLiAnLScgLiAkU2VsZi0+e0ZpbHRlcn07CgogICAgICAgICRVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTdG9yZWRGaWx0ZXJzS2V5LAogICAgICAgICAgICBWYWx1ZSAgPT4gJEpTT05PYmplY3QtPkVuY29kZSggRGF0YSA9PiAkU3RvcmVkRmlsdGVycyApLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJENvdW50VG90YWwgPSAwOwogICAgbXkgJU5hdkJhckZpbHRlcjsKICAgIGZvciBteSAkRmlsdGVyQ29sdW1uICggc29ydCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgIG15ICRDb3VudCA9IDA7CiAgICAgICAgaWYgKEBWaWV3YWJsZURlcGxTdGF0ZUlEcykgewogICAgICAgICAgICAkQ291bnQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJDb2x1bW59LT57U2VhcmNofSB9LAogICAgICAgICAgICAgICAgJUNvbHVtbkZpbHRlciwKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnQ09VTlQnLAogICAgICAgICAgICApIHx8IDA7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRGaWx0ZXJDb2x1bW4gZXEgJEZpbHRlciApIHsKICAgICAgICAgICAgJENvdW50VG90YWwgPSAkQ291bnQ7CiAgICAgICAgfQoKICAgICAgICAkTmF2QmFyRmlsdGVyeyAkRmlsdGVyc3skRmlsdGVyQ29sdW1ufS0+e1ByaW99IH0gPSB7CiAgICAgICAgICAgIENvdW50ICA9PiAkQ291bnQsCiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyQ29sdW1uLAogICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyQ29sdW1ufSB9LAogICAgICAgIH07CiAgICB9CgogICAgIyBzaG93IGNvbmZpZyBpdGVtcwogICAgbXkgJENvbmZpZ0l0ZW1MaXN0SFRNTCA9ICRMYXlvdXRPYmplY3QtPklUU01Db25maWdJdGVtTGlzdFNob3coCiAgICAgICAgRmlsdGVyICAgICAgICAgICAgICAgID0+ICRGaWx0ZXIsCiAgICAgICAgRmlsdGVycyAgICAgICAgICAgICAgID0+IFwlTmF2QmFyRmlsdGVyLAogICAgICAgIENvbmZpZ0l0ZW1JRHMgICAgICAgICA9PiBcQFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgT3JpZ2luYWxDb25maWdJdGVtSURzID0+IFxAT3JpZ2luYWxWaWV3YWJsZUNvbmZpZ0l0ZW1zLAogICAgICAgIEdldENvbHVtbkZpbHRlciAgICAgICA9PiBcJUdldENvbHVtbkZpbHRlciwKICAgICAgICBMYXN0Q29sdW1uRmlsdGVyICAgICAgPT4gJExhc3RDb2x1bW5GaWx0ZXIsCiAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdDdXN0b21lcklUU01Db25maWdJdGVtJywKICAgICAgICBUb3RhbCAgICAgICAgICAgICAgICAgPT4gJENvdW50VG90YWwsCiAgICAgICAgUmVxdWVzdGVkVVJMICAgICAgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICBWaWV3ICAgICAgICAgICAgICAgICAgPT4gJFZpZXcsCiAgICAgICAgVGl0bGVOYW1lICAgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnT3ZlcnZpZXc6IElUU00gQ29uZmlnSXRlbScpLAogICAgICAgIFRpdGxlVmFsdWUgICAgICAgICAgICA9PiAkU2VsZi0+e0ZpbHRlcnN9eyRGaWx0ZXJ9LT57TmFtZX0sCiAgICAgICAgRW52ICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLAogICAgICAgIExpbmtQYWdlICAgICAgICAgICAgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgTGlua1NvcnQgICAgICAgICAgICAgID0+ICRMaW5rU29ydCwKICAgICAgICBMaW5rRmlsdGVyICAgICAgICAgICAgPT4gJExpbmtGaWx0ZXIsCiAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgID0+ICRPcmRlckJ5LAogICAgICAgIFNvcnRCeSAgICAgICAgICAgICAgICA9PiAkU29ydEJ5LAogICAgICAgIEVuYWJsZUNvbHVtbkZpbHRlcnMgICA9PiAxLAogICAgICAgIENvbHVtbkZpbHRlckZvcm0gICAgICA9PiB7CiAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyIHx8ICcnLAogICAgICAgIH0sCiAgICAgICAgRnJvbnRlbmQgPT4gJ0N1c3RvbWVyJywKCiAgICAgICAgIyBkbyBub3QgcHJpbnQgdGhlIHJlc3VsdCBlYXJsaWVyLCBidXQgcmV0dXJuIGNvbXBsZXRlIGNvbnRlbnQKICAgICAgICBPdXRwdXQgPT4gMSwKICAgICk7CgogICAgaWYgKCBkZWZpbmVkICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlIiktPnsiQ3VzdG9tZXJJVFNNQ29uZmlnSXRlbVNlYXJjaCJ9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hCb3gnLAogICAgICAgICk7CiAgICB9CgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lcklUU01Db25maWdJdGVtJywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJVFNNQ29uZmlnSXRlbUxpc3RIVE1MID0+ICRDb25maWdJdGVtTGlzdEhUTUwsCiAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdldCBwYWdlIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Modules/CustomerITSMConfigItemSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvTW9kdWxlcy9DdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpDdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKdXNlIExpc3Q6OlV0aWwgcXcoYW55KTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwp1c2UgS2VybmVsOjpMYW5ndWFnZSAgICAgICAgICAgICAgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciAkT2JqZWN0TWFuYWdlckRpc2FibGVkID0gMTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRCYWNrZW5kT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgbXkgJFBhcmFtT2JqZWN0ICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJFNlc3Npb25PYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dGhTZXNzaW9uJyk7CgogICAgbXkgJENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW06OkZyb250ZW5kOjokU2VsZi0+e0FjdGlvbn0iKTsKCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICAkU2Vzc2lvbk9iamVjdC0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICk7CgogICAgIyBnZXQgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcyBmb3IgdGhpcyBzY3JlZW4KICAgICRTZWxmLT57RHluYW1pY0ZpZWxkfSA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwKICAgICAgICBPYmplY3RUeXBlICA9PiBbJ0lUU01Db25maWdJdGVtJ10sCiAgICAgICAgRmllbGRGaWx0ZXIgPT4gJENvbmZpZy0+e0R5bmFtaWNGaWVsZH0sCiAgICApOwoKICAgIG15IEBTZXRJbm5lckZpZWxkczsKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkQ29uZmlnICggQHsgJFNlbGYtPntEeW5hbWljRmllbGR9IH0gKSB7CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ1NldCc7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzQXJyYXlSZWZXaXRoRGF0YSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0NvbmZpZ317SW5jbHVkZX0gKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgbGlzdCBvZiBpbmNsdWRlZCBkeW5hbWljIGZpZWxkIG5hbWVzIHRvIGdldCB0aGUgY29uZmlncwogICAgICAgIG15ICRTZXRJbm5lckZpZWxkTmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRMaXN0TWFzaygKICAgICAgICAgICAgQ29udGVudCA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57Q29uZmlnfXtJbmNsdWRlfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2V0SW5uZXJGaWVsZE5hbWVzKSApIHsKICAgICAgICAgICAgbXkgJElubmVyRmllbGRDb25maWdzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBGaWVsZEZpbHRlciA9PiB7IG1hcCB7ICggJF8gPT4gMSApIH0gJFNldElubmVyRmllbGROYW1lcy0+QCogfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCRJbm5lckZpZWxkQ29uZmlncykgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJElubmVyRmllbGRDb25maWdSZWYgKCAkSW5uZXJGaWVsZENvbmZpZ3MtPkAqICkgewoKICAgICAgICAgICAgICAgICAgICAjIG5lY2Vzc2FyeSB0byBub3Qgb3ZlcndyaXRlIGNhY2hlZCBkYXRhIG9mIGZpZWxkIGNvbmZpZyBieSBhbHRlcmluZyB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAgICAgICAgbXkgJUlubmVyRmllbGRDb25maWcgPSAkSW5uZXJGaWVsZENvbmZpZ1JlZi0+JSo7CgogICAgICAgICAgICAgICAgICAgICRJbm5lckZpZWxkQ29uZmlne0xhYmVsfSA9ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJER5bmFtaWNGaWVsZENvbmZpZy0+e0xhYmVsfSApIC4gJzo6JwogICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJElubmVyRmllbGRDb25maWd7TGFiZWx9ICk7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2V0SW5uZXJGaWVsZHMsIFwlSW5uZXJGaWVsZENvbmZpZzsKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcHVzaCBAeyAkU2VsZi0+e0R5bmFtaWNGaWVsZH0gfSwgQFNldElubmVyRmllbGRzOwoKICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhciAmIHRvIGdldCB0aGUgb3V0cHV0IGZhc3RlciEKICAgIG15ICRSZWZyZXNoID0gJyc7CiAgICBpZiAoICRTZWxmLT57VXNlclJlZnJlc2hUaW1lfSApIHsKICAgICAgICAkUmVmcmVzaCA9IDYwICogJFNlbGYtPntVc2VyUmVmcmVzaFRpbWV9OwogICAgfQoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICBSZWZyZXNoID0+ICRSZWZyZXNoLAogICAgKTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIFZhbGlkID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGluY2lkZW50IHN0YXRlIGxpc3QKICAgIG15ICRJbmNpU3RhdGVMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBnZXQgZmlsdGVyIGZyb20gd2ViIHJlcXVlc3QKICAgIG15ICRGaWx0ZXIgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnUGVybWlzc2lvbkNvbmRpdGlvbicgKSB8fCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnRmlsdGVyJyApIHx8ICcnOwoKICAgICMgZmV0Y2ggZmlsdGVycyBmcm9tIGNvbmZpZwogICAgbXkgJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6Q29uZmlnSXRlbTo6UGVybWlzc2lvbkNvbmRpdGlvbnMnKTsKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlncykgKSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgIG15ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnID0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzLT57IHNwcmludGYoICIlMDJkIiwgJEZpbHRlciApIH07CiAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZykgKSB7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnRmlsdGVyIGludmFsaWQhJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgZ3JvdXAgcGVybWlzc2lvbiBjaGVjawogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57R3JvdXBzfSApICkgewogICAgICAgIG15ICRBY2Nlc3NPayA9IDA7CgogICAgICAgICMgZmV0Y2ggZ3JvdXBzIG9mIGN1c3RvbWVyIHVzZXIKICAgICAgICBteSAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgR1JPVVA6CiAgICAgICAgZm9yIG15ICRQZXJtaXNzaW9uR3JvdXAgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0dyb3Vwc30tPkAqICkgewogICAgICAgICAgICBpZiAoICRHcm91cExvb2t1cHskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3NPayA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgIFRpdGxlID0+IFRyYW5zbGF0YWJsZSgnRXJyb3InKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiBUcmFuc2xhdGFibGUoJ05vIHBlcm1pc3Npb24nKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVQYWdlTmF2OwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1NlYXJjaEFjdGlvbicgKSB7CgogICAgICAgIG15ICRTb3J0QnkgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU29ydEJ5JyApCiAgICAgICAgICAgIHx8ICRDb25maWctPnsnU29ydEJ5OjpEZWZhdWx0J30KICAgICAgICAgICAgfHwgJ0FnZSc7CgogICAgICAgIGlmICggJFNvcnRCeSBlcSAnTGFzdENoYW5nZWQnICkgewogICAgICAgICAgICAkU29ydEJ5ID0gJ0NoYW5nZWQnOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgdGhlIGRlZmF1bHQgb3JkZXJpbmcgdG8gYmUgdXNlZC4KICAgICAgICBteSAkRGVmYXVsdE9yZGVyQnkgPSAkQ29uZmlnLT57J09yZGVyOjpEZWZhdWx0J30KICAgICAgICAgICAgfHwgJ1VwJzsKCiAgICAgICAgIyBTZXQgdGhlIHNvcnQgb3JkZXIgZnJvbSB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzLCBvciB0YWtlIHRoZSBkZWZhdWx0LgogICAgICAgIG15ICRPcmRlckJ5ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ09yZGVyQnknICkKICAgICAgICAgICAgfHwgJERlZmF1bHRPcmRlckJ5OwoKICAgICAgICAjIHNvcnQgb24gZGVmYXVsdCBieSB1c2luZyBib3RoIChQcmlvcml0eSwgQWdlKSBlbHNlIHVzZSBvbmx5IG9uZSBzb3J0IGFyZ3VtZW50CiAgICAgICAgbXkgJVNvcnQ7CgogICAgICAgICMgZ2V0IGlmIHNlYXJjaCByZXN1bHQgc2hvdWxkIGJlIHByZS1zb3J0ZWQgYnkgcHJpb3JpdHkKICAgICAgICBteSAkUHJlU29ydEJ5UHJpb3JpdHkgPSAkQ29uZmlnLT57J1ByZVNvcnQ6OkJ5UHJpb3JpdHknfTsKICAgICAgICBpZiAoICEkUHJlU29ydEJ5UHJpb3JpdHkgKSB7CiAgICAgICAgICAgICVTb3J0ID0gKAogICAgICAgICAgICAgICAgU29ydEJ5ICA9PiAkU29ydEJ5LAogICAgICAgICAgICAgICAgT3JkZXJCeSA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVTb3J0ID0gKAogICAgICAgICAgICAgICAgU29ydEJ5ICA9PiBbICdQcmlvcml0eScsICRTb3J0QnkgXSwKICAgICAgICAgICAgICAgIE9yZGVyQnkgPT4gWyAnRG93bicsICAgICAkT3JkZXJCeSBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJFZpZXcgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlldycgKSB8fCAnJzsKCiAgICAgICAgIyBsb29rdXAgbGF0ZXN0IHVzZWQgdmlldyBtb2RlCiAgICAgICAgaWYgKCAhJFZpZXcgJiYgJFNlbGYtPnsgJ1VzZXJDb25maWdJdGVtT3ZlcnZpZXcnIC4gJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgICAgICRWaWV3ID0gJFNlbGYtPnsgJ1VzZXJDb25maWdJdGVtT3ZlcnZpZXcnIC4gJFNlbGYtPntBY3Rpb259IH07CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSB1c2UgUHJldmlldyBhcyBkZWZhdWx0IGFzIGluIExheW91dENvbmZpZ0l0ZW0KICAgICAgICAkVmlldyB8fD0gJ1NtYWxsJzsKCiAgICAgICAgbXkgJExpbmtQYWdlID0gJ0ZpbHRlcj0nCiAgICAgICAgICAgIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsdGVyICkKICAgICAgICAgICAgLiAnO1N1YmFjdGlvbj0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1N1YmFjdGlvbn0gKQogICAgICAgICAgICAuICc7Vmlldz0nIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkVmlldyApCiAgICAgICAgICAgIC4gJztTb3J0Qnk9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNvcnRCeSApCiAgICAgICAgICAgIC4gJztPcmRlckJ5PScgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRPcmRlckJ5ICk7CgogICAgICAgIG15ICRMaW5rU29ydCA9ICdGaWx0ZXI9JwogICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEZpbHRlciApCiAgICAgICAgICAgIC4gJztTdWJhY3Rpb249JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntTdWJhY3Rpb259ICkKICAgICAgICAgICAgLiAnO1ZpZXc9JyAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFZpZXcgKTsKCiAgICAgICAgIyBnZXQgc2VhcmNoIHBhcmFtcyBmcm9tIHdlYiByZXF1ZXN0CiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgIGZvciBteSAkU2VhcmNoUGFyYW0gKHF3KE51bWJlciBOYW1lKSkgewoKICAgICAgICAgICAgIyBmZXRjaCBzaW5nbGUgdmFsdWUgcGFyYW1zCiAgICAgICAgICAgICRHZXRQYXJhbXskU2VhcmNoUGFyYW19ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJFNlYXJjaFBhcmFtICk7CiAgICAgICAgICAgICRMaW5rUGFnZSAuPSAiOyRTZWFyY2hQYXJhbT0iIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17JFNlYXJjaFBhcmFtfSApOwogICAgICAgICAgICAkTGlua1NvcnQgLj0gIjskU2VhcmNoUGFyYW09IiAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFteyRTZWFyY2hQYXJhbX0gKTsKICAgICAgICB9CgogICAgICAgIG15IEBBcnJheVNlYXJjaFBhcmFtcyA9IHF3KENsYXNzSURzKTsKCiAgICAgICAgaWYgKCAkQ29uZmlnLT57RGVwbG95bWVudFN0YXRlfSApIHsKICAgICAgICAgICAgcHVzaCBAQXJyYXlTZWFyY2hQYXJhbXMsICdEZXBsU3RhdGVJRHMnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZmlnLT57SW5jaWRlbnRTdGF0ZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQEFycmF5U2VhcmNoUGFyYW1zLCAnSW5jaVN0YXRlSURzJzsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkU2VhcmNoUGFyYW1BcnJheSAoQEFycmF5U2VhcmNoUGFyYW1zKSB7CgogICAgICAgICAgICAjIGZldGNoIG11bHRpIHZhbHVlIHBhcmFtcwogICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkU2VhcmNoUGFyYW1BcnJheSApOwogICAgICAgICAgICBpZiAoIGFueSB7JF99IEBBcnJheSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXskU2VhcmNoUGFyYW1BcnJheX0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgJExpbmtQYWdlIC49IGpvaW4oICcnLCBtYXAgeyAiOyRTZWFyY2hQYXJhbUFycmF5PSIgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRfICkgfSBAQXJyYXkgKTsKICAgICAgICAgICAgICAgICRMaW5rU29ydCAuPSBqb2luKCAnJywgbWFwIHsgIjskU2VhcmNoUGFyYW1BcnJheT0iIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkXyApIH0gQEFycmF5ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVTZWFyY2hDb25maWc7CiAgICAgICAgbXkgJUR5bmFtaWNGaWVsZFNlYXJjaFBhcmFtZXRlcnM7CgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgICMgZ2V0IHNlYXJjaCBmaWVsZCBwcmVmZXJlbmNlcwogICAgICAgICAgICBteSAkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCRTZWFyY2hGaWVsZFByZWZlcmVuY2VzKTsKCiAgICAgICAgICAgIFBSRUZFUkVOQ0U6CiAgICAgICAgICAgIGZvciBteSAkUHJlZmVyZW5jZSAoIEB7JFNlYXJjaEZpZWxkUHJlZmVyZW5jZXN9ICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCB0aGUgZHluYW1pYyBmaWVsZCB2YWx1ZSBmcm9tIHRoZSB3ZWIgcmVxdWVzdAogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnICAgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFJldHVyblByb2ZpbGVTdHJ1Y3R1cmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgICAgID0+ICRMYXlvdXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCB0aGUgY29tcGxldGUgdmFsdWUgc3RydWN0dXJlIGluIEdldFBhcmFtIHRvIHN0b3JlIGl0IGxhdGVyIGluIHRoZSBzZWFyY2gKICAgICAgICAgICAgICAgICMgcHJvZmlsZQogICAgICAgICAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSA9ICggJUdldFBhcmFtLCAleyREeW5hbWljRmllbGRWYWx1ZX0gKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWUgZnJvbSB0aGUgcHJvZmlsZQogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtZXRlciA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFBhcmFtZXRlckJ1aWxkKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFByb2ZpbGUgICAgICAgICAgICA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHNldCBzZWFyY2ggcGFyYW1ldGVyCiAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFNlYXJjaFBhcmFtZXRlciApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhcHBlbmQgc2VhcmNoIHBhcmFtcyB0byBsaW5rcwogICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRTZWFyY2hQYXJhbWV0ZXItPntQYXJhbWV0ZXJ9e0VxdWFsc30gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtQYWdlIC49IGpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCB7ICI7U2VhcmNoX0R5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX09IiAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJF8gKSB9ICRTZWFyY2hQYXJhbWV0ZXItPntQYXJhbWV0ZXJ9e0VxdWFsc30tPkAqCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRMaW5rU29ydCAuPSBqb2luKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAgeyAiO1NlYXJjaF9EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9PSIgLiAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRfICkgfSAkU2VhcmNoUGFyYW1ldGVyLT57UGFyYW1ldGVyfXtFcXVhbHN9LT5AKgogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJExpbmtQYWdlIC49ICI7U2VhcmNoX0R5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX09IiAuICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlYXJjaFBhcmFtZXRlci0+e1BhcmFtZXRlcn17RXF1YWxzfSApOwogICAgICAgICAgICAgICAgICAgICAgICAkTGlua1NvcnQgLj0gIjtTZWFyY2hfRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGRDb25maWctPntOYW1lfT0iIC4gJExheW91dE9iamVjdC0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VhcmNoUGFyYW1ldGVyLT57UGFyYW1ldGVyfXtFcXVhbHN9ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRTZWFyY2hQYXJhbWV0ZXJzeyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSA9ICRTZWFyY2hQYXJhbWV0ZXItPntQYXJhbWV0ZXJ9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRMaW5rUGFnZSAuPSAnOyc7CiAgICAgICAgJExpbmtTb3J0IC49ICc7JzsKCiAgICAgICAgJVNlYXJjaENvbmZpZyA9ICgKICAgICAgICAgICAgJVNlYXJjaENvbmZpZywKICAgICAgICAgICAgJUR5bmFtaWNGaWVsZFNlYXJjaFBhcmFtZXRlcnMsCiAgICAgICAgICAgICVTb3J0LAogICAgICAgICk7CgogICAgICAgICMgbWVyZ2UgZmlsdGVyZWQgY2xhc3NlcyB3aXRoIHBlcm1pc3Npb24gY29uZGl0aW9uIGNsYXNzZXMKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJEdldFBhcmFte0NsYXNzSURzfSApICkgewogICAgICAgICAgICBteSBAU2VhcmNoQ2xhc3NlczsKICAgICAgICAgICAgZm9yIG15ICRDbGFzc0lEICggJEdldFBhcmFte0NsYXNzSURzfS0+QCogKSB7CiAgICAgICAgICAgICAgICBpZiAoIGFueSB7ICRfIGVxICRDbGFzc0xpc3QtPnskQ2xhc3NJRH0gfSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0NsYXNzZXN9LT5AKiApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hDbGFzc2VzLCAkQ2xhc3NMaXN0LT57JENsYXNzSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWFyY2hDb25maWd7Q2xhc3Nlc30gPSBcQFNlYXJjaENsYXNzZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VhcmNoQ29uZmlne0NsYXNzZXN9ID0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntDbGFzc2VzfTsKICAgICAgICB9CgogICAgICAgIGlmICggISRTZWFyY2hDb25maWd7Q2xhc3Nlc30tPkAqICkgewogICAgICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Q3VzdG9tZXJGb290ZXIoKTsKCiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBtZXJnZSBmaWx0ZXJlZCBkZXBsb3ltZW50IHN0YXRlcyB3aXRoIHBlcm1pc3Npb24gY29uZGl0aW9uIGRlcGxveW1lbnQgc3RhdGVzCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRHZXRQYXJhbXtEZXBsU3RhdGVJRHN9ICkgKSB7CiAgICAgICAgICAgIG15IEBTZWFyY2hEZXBsU3RhdGVzOwogICAgICAgICAgICBmb3IgbXkgJERlcGxTdGF0ZUlEICggJEdldFBhcmFte0RlcGxTdGF0ZUlEc30tPkAqICkgewogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc30gKSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGFueSB7ICRfIGVxICREZXBsU3RhdGVMaXN0LT57JERlcGxTdGF0ZUlEfSB9ICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RGVwbG95bWVudFN0YXRlc30tPkAqICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hEZXBsU3RhdGVzLCAkRGVwbFN0YXRlTGlzdC0+eyREZXBsU3RhdGVJRH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRGVwbFN0YXRlcywgJERlcGxTdGF0ZUxpc3QtPnskRGVwbFN0YXRlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICFAU2VhcmNoRGVwbFN0YXRlcyApIHsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckhlYWRlcigKICAgICAgICAgICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckVycm9yKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uJyksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VhcmNoQ29uZmlne0RlcGxTdGF0ZXN9ID0gXEBTZWFyY2hEZXBsU3RhdGVzOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEZXBsb3ltZW50U3RhdGVzfSApICkgewogICAgICAgICAgICAkU2VhcmNoQ29uZmlne0RlcGxTdGF0ZXN9ID0gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEZXBsb3ltZW50U3RhdGVzfTsKICAgICAgICB9CgogICAgICAgICMgbWFwIGZpbHRlcmVkIGluY2lkZW50IHN0YXRlIGlkcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkR2V0UGFyYW17SW5jaVN0YXRlSURzfSApICkgewogICAgICAgICAgICBteSBAU2VhcmNoSW5jaVN0YXRlcyA9IG1hcCB7ICRJbmNpU3RhdGVMaXN0LT57JF99IH0gJEdldFBhcmFte0luY2lTdGF0ZUlEc30tPkAqOwogICAgICAgICAgICAkU2VhcmNoQ29uZmlne0luY2lTdGF0ZXN9ID0gXEBTZWFyY2hJbmNpU3RhdGVzOwogICAgICAgIH0KIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyR3JvdXBPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKICAgICAgICAgICAgbXkgJUF1dGhvcml6ZWRHcm91cHNIYXNoID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBBdXRob3JpemVkR3JvdXBJRHMgPSBrZXlzICVBdXRob3JpemVkR3JvdXBzSGFzaDsKICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3tHcm91cElEc30gPSBcQEF1dGhvcml6ZWRHcm91cElEczsKICAgICAgICB9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAgICAgJFNlYXJjaENvbmZpZ3tOdW1iZXJ9ID0gJEdldFBhcmFte051bWJlcn0gPyAkR2V0UGFyYW17TnVtYmVyfSA6IHVuZGVmOwogICAgICAgICRTZWFyY2hDb25maWd7TmFtZX0gICA9ICRHZXRQYXJhbXtOYW1lfSAgID8gJEdldFBhcmFte05hbWV9ICAgOiB1bmRlZjsKCiAgICAgICAgIyBjb2xsZWN0IGR5bmFtaWMgZmllbGQgc2VhcmNoIHBhcmFtcwogICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfSApICkgewoKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEZpZWxkTmFtZSAoIGtleXMgJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEeW5hbWljRmllbGRWYWx1ZXN9LT4lKiApIHsKCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgISREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICAgICBpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfXskRmllbGROYW1lfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoQ29uZmlneyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ID0gewogICAgICAgICAgICAgICAgICAgICAgICBFcXVhbHMgPT4gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWctPntEeW5hbWljRmllbGRWYWx1ZXN9eyRGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57RHluYW1pY0ZpZWxkVmFsdWVzfXskRmllbGROYW1lfSBlcSAnJyApIHsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoQ29uZmlneyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ID0gewogICAgICAgICAgICAgICAgICAgICAgICBFbXB0eSA9PiAxLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVzdHJpY3Qgc2VhcmNoIGJ5IHBlcm1pc3Npb24gY29uZGl0aW9uIGN1c3RvbWVyIGNvbXBhbnkgYW5kIGN1c3RvbWVyIHVzZXIKICAgICAgICAjIE5PVEUgdGhpcyBvdmVyd3JpdGVzIHByZXZpb3VzbHkgc2V0IHNlYXJjaCBwYXJhbXMgZm9yIHRoZSBjb25maWd1cmVkIGR5bmFtaWMgZmllbGRzCiAgICAgICAgaWYgKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0N1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgICRTZWFyY2hDb25maWd7IkR5bmFtaWNGaWVsZF8kUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0N1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZH0ifSA9IHsKICAgICAgICAgICAgICAgIEVxdWFscyA9PiAkU2VsZi0+e0N1c3RvbWVySUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgJFNlYXJjaENvbmZpZ3siRHluYW1pY0ZpZWxkXyRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlnLT57Q3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkfSJ9ID0gewogICAgICAgICAgICAgICAgRXF1YWxzID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIG15ICVGaWx0ZXJzID0gKAogICAgICAgICAgICAkRmlsdGVyID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgICA9PiAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgUHJpbyAgID0+IDEwMDAsCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gXCVTZWFyY2hDb25maWcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJVNlYXJjaENvbmZpZyApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU2VhcmNoIHBhcmFtcyBpbnZhbGlkIScpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgQ2hlY2sgaWYgc2VsZWN0ZWQgdmlldyBpcyBhdmFpbGFibGUuCiAgICAgICAgbXkgJEJhY2tlbmRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ29uZmlnSXRlbTo6RnJvbnRlbmQ6OkN1c3RvbWVyT3ZlcnZpZXcnKTsKICAgICAgICBpZiAoICEkQmFja2VuZHMtPnskVmlld30gKSB7CgogICAgICAgICAgICAjIFRyeSB0byBmaW5kIGZhbGxiYWNrLCB0YWtlIGZpcnN0IGNvbmZpZ3VyZWQgdmlldyBtb2RlLgogICAgICAgICAgICBLRVk6CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEJhY2tlbmRzfSApIHsKICAgICAgICAgICAgICAgICRWaWV3ID0gJEtleTsKICAgICAgICAgICAgICAgIGxhc3QgS0VZOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXN0b21lciBwYWdlIHNob3duIGNvdW50CiAgICAgICAgbXkgJFBhZ2VTaG93biA9ICRCYWNrZW5kcy0+eyRWaWV3fSA/ICRCYWNrZW5kcy0+eyRWaWV3fS0+e1BhZ2VTaG93bn0gOiAxMDsKCiAgICAgICAgIyBkbyBzaG93biBjb25maWcgaXRlbSBsb29rdXAKICAgICAgICBteSAkTGltaXQgPSAxXzAwMDsKCiAgICAgICAgIyBnZXQgZGF0YSAodmlld2FibGUgY29uZmlnIGl0ZW1zLi4uKQogICAgICAgICMgc2VhcmNoIGFsbCBjb25maWcgaXRlbXMKICAgICAgICBteSBAT3JpZ2luYWxWaWV3YWJsZUNvbmZpZ0l0ZW1zID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgICAgICVTZWFyY2hDb25maWcsCiAgICAgICAgICAgIExpbWl0ICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnQVJSQVknLAogICAgICAgICk7CgogICAgICAgIG15ICRUb3RhbCA9IHNjYWxhciBAT3JpZ2luYWxWaWV3YWJsZUNvbmZpZ0l0ZW1zOwoKICAgICAgICBteSAkU3RhcnRIaXQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU3RhcnRIaXQnICkgfHwgMTsKCiAgICAgICAgbXkgQFZpZXdhYmxlQ29uZmlnSXRlbXMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICAgICAgJVNlYXJjaENvbmZpZywKICAgICAgICAgICAgTGltaXQgID0+ICRTdGFydEhpdCArICRQYWdlU2hvd24gLSAxLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgICAgICApOwoKICAgICAgICAlUGFnZU5hdiA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgICAgIExpbWl0ICAgICA9PiAxMDAwMCwKICAgICAgICAgICAgU3RhcnRIaXQgID0+ICRTdGFydEhpdCwKICAgICAgICAgICAgUGFnZVNob3duID0+ICRQYWdlU2hvd24sCiAgICAgICAgICAgIEFsbEhpdHMgICA9PiBzY2FsYXIgQE9yaWdpbmFsVmlld2FibGVDb25maWdJdGVtcywKICAgICAgICAgICAgQWN0aW9uICAgID0+ICdBY3Rpb249Q3VzdG9tZXJJVFNNQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgICAgIExpbmsgICAgICA9PiAkTGlua1BhZ2UsCiAgICAgICAgICAgIElEUHJlZml4ICA9PiAnQ3VzdG9tZXJJVFNNQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBUT0RPIE1heWJlIHRoZXJlIGlzIGEgbW9yZSBlbGVnYW50IHdheSB0byBkbyB0aGlzPwogICAgICAgICRTZWxmLT57RmlsdGVyfSAgPSAkRmlsdGVyOwogICAgICAgICRTZWxmLT57RmlsdGVyc30gPSBcJUZpbHRlcnM7CgogICAgICAgICMgc2hvdyBjb25maWcgaXRlbXMKICAgICAgICBteSAkQ29uZmlnSXRlbUxpc3RIVE1MID0gJExheW91dE9iamVjdC0+SVRTTUNvbmZpZ0l0ZW1MaXN0U2hvdygKICAgICAgICAgICAgRmlsdGVyICAgICAgICAgICAgICAgID0+ICRGaWx0ZXIsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRHMgICAgICAgICA9PiBcQFZpZXdhYmxlQ29uZmlnSXRlbXMsCiAgICAgICAgICAgIE9yaWdpbmFsQ29uZmlnSXRlbUlEcyA9PiBcQE9yaWdpbmFsVmlld2FibGVDb25maWdJdGVtcywKICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgTGlua1BhZ2UgICAgICAgICAgICAgID0+ICRMaW5rUGFnZSwKICAgICAgICAgICAgTGlua1NvcnQgICAgICAgICAgICAgID0+ICRMaW5rU29ydCwKICAgICAgICAgICAgRW5hYmxlQ29sdW1uRmlsdGVyICAgID0+IDAsCiAgICAgICAgICAgIFZpZXcgICAgICAgICAgICAgICAgICA9PiAkVmlldywKICAgICAgICAgICAgVG90YWwgICAgICAgICAgICAgICAgID0+ICRUb3RhbCwKICAgICAgICAgICAgT3JkZXJCeSAgICAgICAgICAgICAgID0+ICRPcmRlckJ5LAogICAgICAgICAgICBTb3J0QnkgICAgICAgICAgICAgICAgPT4gJFNvcnRCeSwKICAgICAgICAgICAgRW52ICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLAogICAgICAgICAgICBGcm9udGVuZCAgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyJywKCiAgICAgICAgICAgICMgZG8gbm90IHByaW50IHRoZSByZXN1bHQgZWFybGllciwgYnV0IHJldHVybiBjb21wbGV0ZSBjb250ZW50CiAgICAgICAgICAgIE91dHB1dCA9PiAxLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZWFyY2hSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIElUU01Db25maWdJdGVtTGlzdEhUTUwgPT4gJENvbmZpZ0l0ZW1MaXN0SFRNTCwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGRlZmluZWQgJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckZyb250ZW5kOjpNb2R1bGUiKS0+eyJDdXN0b21lcklUU01Db25maWdJdGVtU2VhcmNoIn0gKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoQm94JywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICEkU2VsZi0+e1N1YmFjdGlvbn0gKSB7CgogICAgICAgICMgc3RvcmUgZHJvcGRvd24gcmVzdHJpY3Rpb25zIGZyb20gcGVybWlzc2lvbiBjb25kaXRpb24KICAgICAgICBteSAlU2VhcmNoYWJsZVBhcmFtcyA9ICgKICAgICAgICAgICAgSW5jaVN0YXRlID0+ICRJbmNpU3RhdGVMaXN0LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHNlYXJjaGFibGUgcGFyYW1zCiAgICAgICAgbXkgJUNsYXNzTG9va3VwID0gcmV2ZXJzZSAkQ2xhc3NMaXN0LT4lKjsKICAgICAgICAkU2VhcmNoYWJsZVBhcmFtc3tDbGFzc30gPSB7CiAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAkQ2xhc3NMb29rdXB7JF99CiAgICAgICAgICAgICAgICAgICAgPyAoICRDbGFzc0xvb2t1cHskX30gPT4gJF8gKQogICAgICAgICAgICAgICAgICAgIDogKCkKICAgICAgICAgICAgfSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0NsYXNzZXN9LT5AKgogICAgICAgIH07CgogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0RlcGxveW1lbnRTdGF0ZXN9ICkgKSB7CiAgICAgICAgICAgIG15ICVEZXBsU3RhdGVMb29rdXAgPSByZXZlcnNlICREZXBsU3RhdGVMaXN0LT4lKjsKICAgICAgICAgICAgJFNlYXJjaGFibGVQYXJhbXN7RGVwbFN0YXRlfSA9IHsKICAgICAgICAgICAgICAgIG1hcCB7CiAgICAgICAgICAgICAgICAgICAgJERlcGxTdGF0ZUxvb2t1cHskX30KICAgICAgICAgICAgICAgICAgICAgICAgPyAoICREZXBsU3RhdGVMb29rdXB7JF99ID0+ICRfICkKICAgICAgICAgICAgICAgICAgICAgICAgOiAoKQogICAgICAgICAgICAgICAgfSAkUGVybWlzc2lvbkNvbmRpdGlvbkNvbmZpZy0+e0RlcGxveW1lbnRTdGF0ZXN9LT5AKgogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlYXJjaGFibGVQYXJhbXN7RGVwbFN0YXRlfSA9ICREZXBsU3RhdGVMaXN0OwogICAgICAgIH0KCiAgICAgICAgbXkgJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lcjo6Q29uZmlnSXRlbTo6UGVybWlzc2lvbkNvbmRpdGlvbnMnKTsKCiAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzKSApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICAgICAgVGl0bGUgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcicpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnTm8gcGVybWlzc2lvbiEnKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU2VhcmNoRm9ybScsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJURlZmF1bHRzOwogICAgICAgIGlmICggJENvbmZpZy0+e0RlZmF1bHRzfSApIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkQ29uZmlnLT57RGVmYXVsdHN9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAhJENvbmZpZy0+e0RlZmF1bHRzfS0+eyRLZXl9OwogICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgJEtleSBlcSAnRHluYW1pY0ZpZWxkJzsKCiAgICAgICAgICAgICAgICBpZiAoICRLZXkgPX4gL15Db25maWdJdGVtKENyZWF0ZXxDaGFuZ2UpLyApIHsKICAgICAgICAgICAgICAgICAgICBteSBASXRlbXMgPSBzcGxpdCAvOy8sICRDb25maWctPntEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAoICRLZXksICRWYWx1ZSApID0gc3BsaXQgLz0vLCAkSXRlbTsKICAgICAgICAgICAgICAgICAgICAgICAgJERlZmF1bHRzeyRLZXl9ID0gJFZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICREZWZhdWx0c3skS2V5fSA9ICRDb25maWctPntEZWZhdWx0c30tPnskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBkcm9wZG93biBmb3Igc2VsZWN0aW5nIHRoZSBwZXJtaXNzaW9uIGNvbmRpdGlvbgogICAgICAgIG15ICVQZXJtaXNzaW9uQ29uZGl0aW9uRGF0YSA9IG1hcCB7IGludCgkXykgPT4gJFBlcm1pc3Npb25Db25kaXRpb25Db25maWdzLT57JF99LT57TmFtZX0gfSBrZXlzICRQZXJtaXNzaW9uQ29uZGl0aW9uQ29uZmlncy0+JSo7CiAgICAgICAgbXkgJFBlcm1pc3Npb25Db25kaXRpb25TdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlUGVybWlzc2lvbkNvbmRpdGlvbkRhdGEsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQZXJtaXNzaW9uQ29uZGl0aW9uJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEZpbHRlciB8fCAnJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Blcm1pc3Npb25Db25kaXRpb24nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFBlcm1pc3Npb25Db25kaXRpb25TdHJnID0+ICRQZXJtaXNzaW9uQ29uZGl0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGN5Y2xlIHRyb3VnaCB0aGUgYWN0aXZhdGVkIER5bmFtaWMgRmllbGRzIGZvciB0aGlzIHNjcmVlbgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoICRTZWxmLT57RHluYW1pY0ZpZWxkfS0+QCogKSB7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlc0ZpbHRlcjsKCiAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CgogICAgICAgICAgICAgICAgIyBnZXQgUG9zc2libGVWYWx1ZXMKICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiBmaWVsZCBoYXMgUG9zc2libGVWYWx1ZXMgcHJvcGVydHkgaW4gaXRzIGNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgaGlzdG9yaWNhbCB2YWx1ZXMgZnJvbSBkYXRhYmFzZQogICAgICAgICAgICAgICAgICAgIG15ICRIaXN0b3JpY2FsVmFsdWVzID0gJEJhY2tlbmRPYmplY3QtPkhpc3RvcmljYWxWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICREYXRhID0gJFBvc3NpYmxlVmFsdWVzOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBoaXN0b3JpYyB2YWx1ZXMgdG8gY3VycmVudCB2YWx1ZXMgKGlmIHRoZXkgZG9uJ3QgZXhpc3QgYW55bW9yZSkKICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCRIaXN0b3JpY2FsVmFsdWVzKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskSGlzdG9yaWNhbFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkRGF0YS0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRhLT57JEtleX0gPSAkSGlzdG9yaWNhbFZhbHVlcy0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgcG9zc2libGUgdmFsdWVzIGtleSA9PiB2YWx1ZSB0byBrZXkgPT4ga2V5IGZvciBBQ0xzIHVzaW5nIGEgSGFzaCBzbGljZQogICAgICAgICAgICAgICAgICAgIG15ICVBY2xEYXRhID0gJXskRGF0YX07CiAgICAgICAgICAgICAgICAgICAgQEFjbERhdGF7IGtleXMgJUFjbERhdGEgfSA9IGtleXMgJUFjbERhdGE7CgogICAgICAgICAgICAgICAgICAgICMgc2V0IHBvc3NpYmxlIHZhbHVlcyBmaWx0ZXIgZnJvbSBBQ0xzCiAgICAgICAgICAgICAgICAgICAgbXkgJEFDTCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWNsKAogICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblR5cGUgICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgIFJldHVyblN1YlR5cGUgID0+ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVBY2xEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJEFDTCkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlRmlsdGVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BY2xEYXRhKCk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnZlcnQgRmlsZXIga2V5ID0+IGtleSBiYWNrIHRvIGtleSA9PiB2YWx1ZSB1c2luZyBtYXAKICAgICAgICAgICAgICAgICAgICAgICAgJXskUG9zc2libGVWYWx1ZXNGaWx0ZXJ9ID0gbWFwIHsgJF8gPT4gJERhdGEtPnskX30gfSBrZXlzICVGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGdldCBzZWFyY2ggZmllbGQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkUHJlZmVyZW5jZXMgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRmllbGRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRQcmVmZXJlbmNlcyk7CgogICAgICAgICAgICBQUkVGRVJFTkNFOgogICAgICAgICAgICBmb3IgbXkgJFByZWZlcmVuY2UgKCBAeyRTZWFyY2hGaWVsZFByZWZlcmVuY2VzfSApIHsKCiAgICAgICAgICAgICAgICAjIGdldCBmaWVsZCBIVE1MCiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlVmFsdWVzRmlsdGVyID0+ICRQb3NzaWJsZVZhbHVlc0ZpbHRlciwKICAgICAgICAgICAgICAgICAgICBQcm9maWxlICAgICAgICAgICAgICA9PiB7fSwKICAgICAgICAgICAgICAgICAgICBEZWZhdWx0VmFsdWUgICAgICAgICA9PgogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnLT57RGVmYXVsdHN9e0R5bmFtaWNGaWVsZH17ICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9LAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkUHJlZmVyZW5jZS0+e1R5cGV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBGaWVsZCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0ZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOdW1iZXInLAogICAgICAgICk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICApOwoKICAgICAgICBteSAkQ2xhc3NTdHJnID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VhcmNoYWJsZVBhcmFtc3tDbGFzc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3NJRHMnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkRGVmYXVsdHN7Q2xhc3NJRHN9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgTXVsdGlwbGUgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBDbGFzc1N0cmcgPT4gJENsYXNzU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRDb25maWctPntEZXBsb3ltZW50U3RhdGV9ICkgewoKICAgICAgICAgICAgIyBnZW5lcmF0ZSBkcm9wZG93biBmb3Igc2VsZWN0aW5nIHRoZSB3YW50ZWQgZGVwbG95bWVudCBzdGF0ZXMKICAgICAgICAgICAgbXkgJEN1ckRlcGxTdGF0ZU9wdGlvblN0cmcgPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2VhcmNoYWJsZVBhcmFtc3tEZXBsU3RhdGV9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdEZXBsU3RhdGVJRHMnLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICREZWZhdWx0c3tEZXBsb3ltZW50U3RhdGVJRHN9LAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdEZXBsU3RhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZyA9PiAkQ3VyRGVwbFN0YXRlT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDb25maWctPntJbmNpZGVudFN0YXRlfSApIHsKCiAgICAgICAgICAgICMgZ2VuZXJhdGUgZHJvcGRvd24gZm9yIHNlbGVjdGluZyB0aGUgd2FudGVkIGluY2lkZW50IHN0YXRlcwogICAgICAgICAgICBteSAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZWFyY2hhYmxlUGFyYW1ze0luY2lTdGF0ZX0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0luY2lTdGF0ZUlEcycsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJERlZmF1bHRze0luY2lkZW50U3RhdGVJRHN9LAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICAgID0+IDUsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgICA9PiAxLAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmNpU3RhdGUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ3VySW5jaVN0YXRlT3B0aW9uU3RyZyA9PiAkQ3VySW5jaVN0YXRlT3B0aW9uU3RyZywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVySGVhZGVyKAogICAgICAgICAgICBUaXRsZSA9PiBUcmFuc2xhdGFibGUoJ0Vycm9yJyksCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRXJyb3IoCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdObyBwZXJtaXNzaW9uIScpLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVySVRTTUNvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICVQYWdlTmF2LAogICAgICAgIH0sCiAgICApOwoKICAgICMgYnVpbGQgTmF2aWdhdGlvbkJhcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKCiAgICAjIGdldCBwYWdlIGZvb3RlcgogICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZvb3RlcigpOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentITSMConfigItemEdit.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXJ0Tm9ybWFsIikgJV0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4gTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KICAgIDxoMT5bJSBUcmFuc2xhdGUoIkVkaXQiKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZSgiQ29uZmlnIEl0ZW0iKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZShEYXRhLk51bWJlcikgfCBodG1sICVdIC0gWyUgVHJhbnNsYXRlKCJDbGFzcyIpIHwgaHRtbCAlXTogWyUgVHJhbnNsYXRlKERhdGEuQ2xhc3MpIHwgaHRtbCAlXTwvaDE+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KWyUgUmVuZGVyQmxvY2tFbmQoIlN0YXJ0Tm9ybWFsIikgJV0KICAgICAgICA8Zm9ybSBhY3Rpb249IlslIEVudigiQ0dJSGFuZGxlIikgJV0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iQ2xhc3NJdGVtIiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyIgaWQ9IkNsYXNzSXRlbSI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlN0YXJ0U21hbGwiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYXlvdXRQb3B1cCBBUklBUm9sZU1haW4iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDE+WyUgVHJhbnNsYXRlKCJFZGl0IikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoIkNvbmZpZyBJdGVtIikgfCBodG1sICVdOiBbJSBUcmFuc2xhdGUoRGF0YS5OdW1iZXIpIHwgaHRtbCAlXSAtIFslIFRyYW5zbGF0ZSgiQ2xhc3MiKSB8IGh0bWwgJV06IFslIFRyYW5zbGF0ZShEYXRhLkNsYXNzKSB8IGh0bWwgJV08L2gxPgogICAgICAgICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+WyUgVHJhbnNsYXRlKCJDYW5jZWwgJiBjbG9zZSIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNjcmVlblR5cGUiIHZhbHVlPSJQb3B1cCIvPgpbJSBSZW5kZXJCbG9ja0VuZCgiU3RhcnRTbWFsbCIpICVdCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJbJSBFbnYoIkFjdGlvbiIpICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU2F2ZSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzSUQiIHZhbHVlPSJbJSBEYXRhLkNsYXNzSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29uZmlnSXRlbUlEIiB2YWx1ZT0iWyUgRGF0YS5Db25maWdJdGVtSUQgfCBodG1sICVdIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRHVwbGljYXRlSUQiIHZhbHVlPSJbJSBEYXRhLkR1cGxpY2F0ZUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IlslIERhdGEuRm9ybUlEIHwgaHRtbCAlXSIvPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9Ik5hbWUiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiTmFtZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5Sb3dOYW1lSW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjUwIiB2YWx1ZT0iWyUgRGF0YS5OYW1lIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVGhlIG5hbWUgb2YgdGhpcyBjb25maWcgaXRlbSIpIHwgaHRtbCAlXSJbJSBJRiBEYXRhLlJlYWRvbmx5ICVdIHJlYWRvbmx5WyUgRU5EICVdLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dOYW1lRXJyb3JEZWZhdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik5hbWVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dOYW1lRXJyb3JEZWZhdWx0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZUVycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJOYW1lU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIk5hbWUgaXMgYWxyZWFkeSBpbiB1c2UgYnkgdGhlIENvbmZpZ0l0ZW1zIHdpdGggdGhlIGZvbGxvd2luZyBOdW1iZXIocyk6ICVzIiwgRGF0YS5EdXBsaWNhdGVzKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dOYW1lRXJyb3JEdXBsaWNhdGVzIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93TmFtZUVycm9yUmVnRXgiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKERhdGEuUmVnRXhFcnJvck1lc3NhZ2UpIHwgaHRtbCAlXTwvcD48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd05hbWVFcnJvclJlZ0V4IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd05hbWUiKSAlXQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dWZXJzaW9uU3RyaW5nIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVmVyc2lvblN0cmluZyI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gWyUgVHJhbnNsYXRlKCJWZXJzaW9uIE51bWJlciIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlZlcnNpb25TdHJpbmciIGlkPSJWZXJzaW9uU3RyaW5nIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgWyUgRGF0YS5Sb3dWZXJzaW9uU3RyaW5nSW52YWxpZCB8IGh0bWwgJV0iIG1heGxlbmd0aD0iMjUwIiB2YWx1ZT0iWyUgRGF0YS5WZXJzaW9uU3RyaW5nIHwgaHRtbCAlXSIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiVmVyc2lvbiBudW1iZXIgb2YgdGhpcyBjb25maWcgaXRlbSIpIHwgaHRtbCAlXSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlZlcnNpb25TdHJpbmdFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dWZXJzaW9uU3RyaW5nRXJyb3JEZWZhdWx0IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlZlcnNpb25TdHJpbmdTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dWZXJzaW9uU3RyaW5nRXJyb3JEZWZhdWx0IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93VmVyc2lvblN0cmluZ0Vycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJWZXJzaW9uU3RyaW5nU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlZlcnNpb24gTnVtYmVyIGlzIGFscmVhZHkgaW4gdXNlIGJ5IHRoZSBDb25maWdJdGVtcyB3aXRoIHRoZSBmb2xsb3dpbmcgTnVtYmVyKHMpOiAlcyIsIERhdGEuRHVwbGljYXRlcykgfCBodG1sICVdPC9wPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93VmVyc2lvblN0cmluZ0Vycm9yRHVwbGljYXRlcyIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dWZXJzaW9uU3RyaW5nIikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiUm93RGVwbFN0YXRlIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVwbFN0YXRlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+IFslIFRyYW5zbGF0ZSgiRGVwbG95bWVudCBTdGF0ZSIpIHwgaHRtbCAlXTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5EZXBsU3RhdGVPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXBsU3RhdGVJREVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXBsU3RhdGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIlJvd0RlcGxTdGF0ZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd0luY2lTdGF0ZSIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkluY2lTdGF0ZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiBbJSBUcmFuc2xhdGUoIkluY2lkZW50IFN0YXRlIikgfCBodG1sICVdOiA8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkluY2lTdGF0ZU9wdGlvblN0cmcgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkluY2lTdGF0ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkluY2lTdGF0ZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD5bJSBUcmFuc2xhdGUoIlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIikgfCBodG1sICVdPC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93SW5jaVN0YXRlIikgJV0KCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5ClslIFJlbmRlckJsb2NrU3RhcnQoIlJvd0dyb3VwIikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJbJSBEYXRhLk1hbmRhdG9yeUNsYXNzIHwgaHRtbCAlXSIgZm9yPSJHcm91cElEIj48c3BhbiBjbGFzcz0iTWFya2VyIj5bJSBEYXRhLk1hcmtlciB8IGh0bWwgJV08L3NwYW4+IFslIFRyYW5zbGF0ZSgiR3JvdXAiKSB8IGh0bWwgJV06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuR3JvdXBPcHRpb25TdHJnICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJHcm91cElERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+WyUgVHJhbnNsYXRlKCJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiIpIHwgaHRtbCAlXTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ikdyb3VwSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPlslIFRyYW5zbGF0ZSgiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4iKSB8IGh0bWwgJV08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJSb3dHcm91cCIpICVdCiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKWyUgRGF0YS5EeW5hbWljRmllbGRIVE1MICVdCgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJSb3dEZXNjcmlwdGlvbiIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXNjcmlwdGlvbiI+WyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRGaWVsZCIgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iRGVzY3JpcHRpb24iIGNsYXNzPSJSaWNoVGV4dCBbJSBEYXRhLlJpY2hUZXh0SW52YWxpZCB8IGh0bWwgJV0iIG5hbWU9IkRlc2NyaXB0aW9uIiB0aXRsZT0iWyUgVHJhbnNsYXRlKCJEZXNjcmlwdGlvbiIpIHwgaHRtbCAlXSIgcm93cz0iMTUiIGNvbHM9IlslIENvbmZpZygiVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIikgfCBodG1sICVdIj5bJSBEYXRhLkRlc2NyaXB0aW9uIHwgaHRtbCAlXTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPgpbJSBSZW5kZXJCbG9ja0VuZCgiUm93RGVzY3JpcHRpb24iKSAlXQogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQXR0YWNobWVudHMiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgSU5DTFVERSAiRm9ybUVsZW1lbnRzL0F0dGFjaG1lbnRMaXN0LnR0IiAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG5hbWU9IlN1Ym1pdCIgY2xhc3M9IkNhbGxGb3JBY3Rpb24gUHJpbWFyeSIgaWQ9IlN1Ym1pdEJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5bJSBUcmFuc2xhdGUoIlNhdmUiKSB8IGh0bWwgJV08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIFRyYW5zbGF0ZSgib3IiKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGlkPSJDYW5jZWxCdXR0b24iIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1BZ2VudElUU01Db25maWdJdGVtQWRkIj5bJSBUcmFuc2xhdGUoIkNhbmNlbCIpIHwgaHRtbCAlXTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgIDwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiRW5kU21hbGwiKSAlXQogICAgICAgICAgICA8L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkVuZFNtYWxsIikgJV0KICAgICAgICA8L2Zvcm0+ClslIFJlbmRlckJsb2NrU3RhcnQoIkVuZE5vcm1hbCIpICVdCiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJFbmROb3JtYWwiKSAlXQo=</File>
        <File Location="Custom/Kernel/Output/HTML/Templates/Standard/AgentITSMConfigItemZoom.tt" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvT3V0cHV0L0hUTUwvVGVtcGxhdGVzL1N0YW5kYXJkL0FnZW50SVRTTUNvbmZpZ0l0ZW1ab29tLnR0CiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCjxkaXYgY2xhc3M9Ik1haW5Cb3ggQVJJQVJvbGVNYWluIj4KICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJIZWFkbGluZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyIgdGl0bGU9IlslIFRyYW5zbGF0ZShEYXRhLkN1ckluY2lTdGF0ZSkgfCBodG1sICVdIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VySW5jaVNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8aDEgdGl0bGU9IlslIFRyYW5zbGF0ZSgiQ29uZmlndXJhdGlvbiBJdGVtIikgfCBodG1sICVdOiBbJSBEYXRhLk51bWJlciB8IGh0bWwgJV0gJm5kYXNoOyBbJSBEYXRhLk5hbWUgfCB0cnVuY2F0ZSg0MCkgfCBodG1sICVdIj4KICAgICAgICAgICAgWyUgVHJhbnNsYXRlKCJDb25maWd1cmF0aW9uIEl0ZW0iKSB8IGh0bWwgJV06IFslIERhdGEuTnVtYmVyIHwgaHRtbCAlXSA8c3Bhbj4mbWRhc2g7PC9zcGFuPiBbJSBEYXRhLk5hbWUgfCB0cnVuY2F0ZSg2MCkgfCBodG1sICVdCiAgICAgICAgPC9oMT4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KCiAgICAgICAgWyUgRGF0YS5TdHlsZUNsYXNzZXMgJV0KCiAgICAgICAgPGRpdiBjbGFzcz0iU2lkZWJhckNvbHVtbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIk1ldGEiKSAlXQogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgdGl0bGU9IlslIFRyYW5zbGF0ZSgiU2hvdyBvciBoaWRlIHRoZSBjb250ZW50IikgfCBodG1sICVdIj48aSBjbGFzcz0iZmEgZmEtY2FyZXQtcmlnaHQiPjwvaT48aSBjbGFzcz0iZmEgZmEtY2FyZXQtZG93biI+PC9pPjwvYT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJDb25maWd1cmF0aW9uIEl0ZW0gSW5mb3JtYXRpb24iKSB8IGh0bWwgJV08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgVGlnaHQiPgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ2xhc3MiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj5bJSBUcmFuc2xhdGUoRGF0YS5DbGFzcykgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJOYW1lIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5OYW1lIHwgdHJ1bmNhdGUoMjUpIHwgaHRtbCAlXTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3VycmVudCBEZXBsb3ltZW50IFN0YXRlIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuQ3VyRGVwbFN0YXRlKSB8IGh0bWwgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmxhZyBTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlslIERhdGEuQ3VyRGVwbFNpZ25hbCB8IGh0bWwgJV0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgWyUgVHJhbnNsYXRlKERhdGEuQ3VyRGVwbFN0YXRlKSB8IGh0bWwgJV0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkN1cnJlbnQgSW5jaWRlbnQgU3RhdGUiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiIHRpdGxlPSJbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGbGFnIFNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iWyUgRGF0YS5DdXJJbmNpU2lnbmFsIHwgaHRtbCAlXSI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBUcmFuc2xhdGUoRGF0YS5DdXJJbmNpU3RhdGUpIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJHcm91cCIpICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkdyb3VwIikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+WyUgRGF0YS5Hcm91cE5hbWUgfCB0cnVuY2F0ZSgyNSkgfCBodG1sICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJHcm91cCIpICVdCiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPlslIFRyYW5zbGF0ZSgiQ3JlYXRlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ3JlYXRlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJDcmVhdGVkIGJ5IikgfCBodG1sICVdOjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJSBEYXRhLkNyZWF0ZUJ5VXNlckZ1bGxOYW1lIHwgaHRtbCAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5bJSBUcmFuc2xhdGUoIkxhc3QgY2hhbmdlZCIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPlslIERhdGEuQ2hhbmdlVGltZSB8IExvY2FsaXplKCJUaW1lTG9uZyIpICVdPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJMYXN0IGNoYW5nZWQgYnkiKSB8IGh0bWwgJV06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuQ2hhbmdlQnlVc2VyRnVsbE5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKWyUgUmVuZGVyQmxvY2tTdGFydCgiQXR0YWNobWVudHMiKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+WyUgVHJhbnNsYXRlKCJBdHRhY2htZW50cyIpIHwgaHRtbCAlXTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJBdHRhY2htZW50Um93IikgJV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IlslIEVudigiQmFzZWxpbmsiKSAlXUFjdGlvbj1bJSBFbnYoIkFjdGlvbiIpICVdO1N1YmFjdGlvbj1Eb3dubG9hZEF0dGFjaG1lbnQ7RmlsZW5hbWU9WyUgRGF0YS5GaWxlbmFtZSB8IHVyaSAlXTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFslIERhdGEuRmlsZW5hbWUgfCBodG1sICVdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWyUgRGF0YS5GaWxlc2l6ZSB8IExvY2FsaXplKCdGaWxlc2l6ZScpIHwgaHRtbCAlXSkKWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRSb3ciKSAlXQogICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KWyUgUmVuZGVyQmxvY2tFbmQoIkF0dGFjaG1lbnRzIikgJV0KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTWV0YSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIkxpbmtUYWJsZVNpbXBsZSIpICVdCiAgICAgICAgICAgIDxkaXYgY2xhc3M9IldpZGdldFNpbXBsZSBEb250UHJpbnQiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKCJMaW5rZWQgT2JqZWN0cyIpIHwgaHRtbCAlXTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgIFslIERhdGEuTGlua1RhYmxlU3RyZyAlXQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja0VuZCgiTGlua1RhYmxlU2ltcGxlIikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udHJvbFJvdyI+CiAgICAgICAgICAgICAgICA8aDI+PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJNZW51IikgJV0KWyUgUmVuZGVyQmxvY2tTdGFydCgiTWVudUl0ZW0iKSAlXQogICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iWyUgRW52KCJCYXNlbGluayIpICVdWyUgRGF0YS5MaW5rIHwgSW50ZXJwb2xhdGUgJV0iIGlkPSJNZW51WyUgRGF0YS5NZW51SUQgfCBodG1sICVdIiBjbGFzcz0iWyUgRGF0YS5NZW51Q2xhc3MgfCBodG1sICVdIiB0aXRsZT0iWyUgVHJhbnNsYXRlKERhdGEuRGVzY3JpcHRpb24pIHwgaHRtbCAlXSI+WyUgVHJhbnNsYXRlKERhdGEuTmFtZSkgfCBodG1sICVdPC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+ClslIFJlbmRlckJsb2NrRW5kKCJNZW51SXRlbSIpICVdClslIFJlbmRlckJsb2NrRW5kKCJNZW51IikgJV0KICAgICAgICAgICAgICAgIDwvdWw+CiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJTZWxlY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJTZWxlY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPGRpdiBpZD0iUGFnZVNlbGVjdGlvbiI+ClslIFJlbmRlckJsb2NrU3RhcnQoIlBhZ2VOYW1lIikgJV0KICAgICAgICAgICAgICAgICAgICA8aDI+WyUgVHJhbnNsYXRlKERhdGEuUGFnZU5hbWUpIHwgaHRtbCAlXTwvaDI+ClslIFJlbmRlckJsb2NrRW5kKCJQYWdlTmFtZSIpICVdClslIFJlbmRlckJsb2NrU3RhcnQoIlBhZ2VMaW5rIikgJV0KICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSJbJSBFbnYoIkJhc2VsaW5rIikgJV1BY3Rpb249WyUgRW52KCJBY3Rpb24iKSAlXTtDb25maWdJdGVtSUQ9WyUgRGF0YS5Db25maWdJdGVtSUQgfCB1cmkgJV07VmVyc2lvbklEPVslIERhdGEuVmVyc2lvbklEIHwgdXJpICVdO1BhZ2U9WyUgRGF0YS5QYWdlTmFtZSB8IHVyaSAlXSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9Im9vb1MgUGFnZVNlbGVjdGlvbkJ1dHRvbiBDYWxsRm9yQWN0aW9uWyUgSUYgRGF0YS5EaXNhYmxlZCAlXSBEaXNhYmxlZFslIEVMU0lGIERhdGEuU2VsZWN0ZWQgJV0gU2VsZWN0ZWRbJSBFTkQgJV0iPlslIFRyYW5zbGF0ZShEYXRhLlBhZ2VOYW1lKSB8IGh0bWwgJV08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2E+ClslIFJlbmRlckJsb2NrRW5kKCJQYWdlTGluayIpICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIiBpZD0iVmVyc2lvblNlbGVjdGlvbkNvbnRhaW5lciI+CiAgICAgICAgICAgICAgICAgICAgWyUgRGF0YS5WZXJzaW9uU2VsZWN0aW9uICVdCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJTZWxlY3Rpb25Sb3ciKSAlXQogICAgICAgICAgICA8ZGl2IGlkPSJJVFNNSXRlbXMiPgogICAgICAgICAgICAgICAgWyUgRGF0YS5EeW5hbWljRmllbGRIVE1MICVdCiAgICAgICAgICAgIDwvZGl2PgpbJSBSZW5kZXJCbG9ja1N0YXJ0KCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICBbJSBEYXRhLkxpbmtUYWJsZVN0cmcgJV0KICAgICAgICAgICAgPC9kaXY+ClslIFJlbmRlckJsb2NrRW5kKCJMaW5rVGFibGVDb21wbGV4IikgJV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+Cg==</File>
        <File Location="Custom/Kernel/System/Console/Command/Maint/Elasticsearch/Migration.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBjMDdlNTkwZTA0MjA4YmM1ZjFmNzg1MWIyZjI3ODg5MTk4NmVkY2ZhIC0gS2VybmVsL1N5c3RlbS9Db25zb2xlL0NvbW1hbmQvTWFpbnQvRWxhc3RpY3NlYXJjaC9NaWdyYXRpb24ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6Q29tbWFuZDo6TWFpbnQ6OkVsYXN0aWNzZWFyY2g6Ok1pZ3JhdGlvbjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKIyBjb3JlIG1vZHVsZXMKdXNlIFRpbWU6OkhpUmVzKCk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OkZvcmVhY2hUb0ZvcikKCiMgSW5mb3JtIHRoZSBvYmplY3QgbWFuYWdlciBhYm91dCB0aGUgaGFyZCBkZXBlbmRlbmNpZXMuCiMgVGhpcyBtb2R1bGUgbXVzdCBiZSBkaXNjYXJkZWQgd2hlbiBvbmUgb2YgdGhlIGhhcmQgZGVwZW5kZW5jaWVzIGhhcyBiZWVuIGRpc2NhcmRlZC4Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnLAopOwoKIyBJbmZvcm0gdGhlIENvZGVQb2xpY3kgYWJvdXQgdGhlIHNvZnQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGludGVudGlvbmFsbHkgbm90IGluIEBPYmplY3REZXBlbmRlbmNpZXMuCiMgU29mdCBkZXBlbmRlbmNpZXMgYXJlIG1vZHVsZXMgdGhhdCB1c2VkIGJ5IHRoaXMgb2JqZWN0LCBidXQgd2hvIGRvbid0IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QuCiMgVGhlcmUgaXMgbm8gbmVlZCB0byBkaXNjYXJkIHRoaXMgbW9kdWxlIHdoZW4gb25lIG9mIHRoZSBzb2Z0IGRlcGVuZGVuY2llcyBpcyBkaXNjYXJkZWQuCm91ciBAU29mdE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OlN5c3RlbTo6RkFRJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCik7CgpzdWIgQ29uZmlndXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFNlbGYtPkRlc2NyaXB0aW9uKCdNaWdyYXRlIGV4aXN0aW5nIHRpY2tldHMsIGN1c3RvbWVycyBhbmQgY3VzdG9tZXIgdXNlcnMgdG8gRWxhc3RpY3NlYXJjaC4nKTsKICAgICRTZWxmLT5BZGRPcHRpb24oCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ3RhcmdldCcsCiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgIlNwZWNpZnkgd2hpY2ggb2JqZWN0cyB3aWxsIGJlIG1pZ3JhdGVkLiB0OiBUaWNrZXRzOyB1OiBDdXN0b21lclVzZXJzOyBjOiBDdXN0b21lckNvbXBhbmllczsgaTogSVRTTUNvbmZpZ0l0ZW1zOyBmOiBGQVFzO0lmIG5vdCBzcGVjaWZpZWQsICd0dWNpZicgKGFsbCBmaXZlKSB3aWxsIGJlIGhhbmRsZWQuIiwKICAgICAgICBSZXF1aXJlZCAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggPT4gcXIvXlt0dWNpZl0rJC9zbXgsCiAgICApOwogICAgJFNlbGYtPkFkZE9wdGlvbigKICAgICAgICBOYW1lICAgICAgICA9PiAnbWljcm8tc2xlZXAnLAogICAgICAgIERlc2NyaXB0aW9uID0+ICJTcGVjaWZ5IG1pY3Jvc2Vjb25kcyB0byBzbGVlcCBhZnRlciBldmVyeSB0aWNrZXQgdG8gcmVkdWNlIHN5c3RlbSBsb2FkIChlLmcuIDEwMDApLiIsCiAgICAgICAgUmVxdWlyZWQgICAgPT4gMCwKICAgICAgICBIYXNWYWx1ZSAgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggID0+IHFyL15cZCskL3NteCwKICAgICk7CiAgICAkU2VsZi0+QWRkT3B0aW9uKAogICAgICAgIE5hbWUgICAgICAgID0+ICd1c2UtY3VzdG9tZXItYmF0Y2hlcycsCiAgICAgICAgRGVzY3JpcHRpb24gPT4KICAgICAgICAgICAgIlNvbWUgTERBUCBvciBBRCBzZXJ2ZXJzIGxpbWl0IHRoZSByZXR1cm4gb2YgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIHdlIGNhbiBzdGlsbCBnZXQgYWxsIHRoZSByZXN1bHRzIGJ5IHNwbGl0dGluZyB0aGUgcXVlcmllcy4gMTogc3BsaXRzIHRoZSBxdWVyaWVzIGludG8gc2VhcmNoZXMgZm9yIGEteiwgYTAtejksIDAtOS4gMjogYWEtenosIGEwLXo5IGFuZCAwLTkuIiwKICAgICAgICBSZXF1aXJlZCAgID0+IDAsCiAgICAgICAgSGFzVmFsdWUgICA9PiAxLAogICAgICAgIFZhbHVlUmVnZXggPT4gcXIvXlxkJC9zbXgsCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIFByZVJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgd2hldGhlciBlbGFzdGljIHNlYXJjaCB3ZWIgc2VydmljZSBpcyBlbmFibGVkIGFuZCBpZiBub3QsIGFjdGl2YXRlIGl0CiAgICBteSAkV2Vic2VydmljZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmljSW50ZXJmYWNlOjpXZWJzZXJ2aWNlJyk7CgogICAgbXkgJEVTV2Vic2VydmljZSA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlR2V0KAogICAgICAgIE5hbWUgPT4gJ0VsYXN0aWNzZWFyY2gnLAogICAgKTsKCiAgICBpZiAoICEkRVNXZWJzZXJ2aWNlICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5FbGFzdGljc2VhcmNoIHdlYnNlcnZpY2Ugbm90IGZvdW5kISBVbmFibGUgdG8gY29udGludWUuPC9yZWQ+XG4iKTsKICAgICAgICBkaWU7CiAgICB9CgogICAgaWYgKCAkRVNXZWJzZXJ2aWNlLT57VmFsaWRJRH0gIT0gMSApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PkVsYXN0aWNzZWFyY2ggd2Vic2VydmljZSBpcyBub3cgYWN0aXZhdGVkLiBJZiB5b3UgZG9uJ3Qgd2FudCB0byBrZWVwIGl0IGVuYWJsZWQsIHBsZWFzZSBkaXNhYmxlIGl0IG1hbnVhbGx5IGluIHRoZSBhZG1pbiBpbnRlcmZhY2UsIGFmdGVyIHRoZSBtaWdyYXRpb24gaXMgY29tcGxldGUuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgICAgICBteSAkU3VjY2VzcyA9ICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAleyRFU1dlYnNlcnZpY2V9LAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkVsYXN0aWNzZWFyY2ggd2Vic2VydmljZSBjb3VsZCBub3QgYmUgYWN0aXZhdGVkISBVbmFibGUgdG8gY29udGludWUuPC9yZWQ+XG4iKTsKICAgICAgICAgICAgZGllOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRVNPYmplY3QgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoJyk7CiAgICBteSAkQ29uZmlnICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6QXJ0aWNsZUluZGV4Q3JlYXRpb25TZXR0aW5ncycpOwogICAgbXkgJENvbmZpZ0luZGV4U2V0dGluZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkluZGV4U2V0dGluZ3MnKTsKICAgIG15ICRJbmRleFRlbXBsYXRlcyAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpJbmRleFRlbXBsYXRlJyk7CgogICAgIyBwcmVmZXIgRWxhc3RpY3NlYXJjaDo6SW5kZXhTZXR0aW5ncyMjI0RlZmF1bHQgb3ZlciBFbGFzdGljc2VhcmNoOjpBcnRpY2xlSW5kZXhDcmVhdGlvblNldHRpbmdzCiAgICBpZiAoICRDb25maWdJbmRleFNldHRpbmdzICYmICRDb25maWdJbmRleFNldHRpbmdzLT57RGVmYXVsdH0gKSB7CiAgICAgICAgJENvbmZpZyA9ICRDb25maWdJbmRleFNldHRpbmdzLT57RGVmYXVsdH07CiAgICB9CgogICAgIyB0ZXN0IHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIKICAgIGlmICggISRFU09iamVjdC0+VGVzdENvbm5lY3Rpb24oKSApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+Q29ubmVjdGlvbiBjb3VsZCBub3QgYmUgZXN0YWJsaXNoZWQhPC9yZWQ+XG4iKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJFRhcmdldHMgICAgICAgICAgICA9ICRTZWxmLT5HZXRPcHRpb24oJ3RhcmdldCcpIHx8ICd0dWNpZic7CiAgICBteSAkTWljcm9TbGVlcCAgICAgICAgID0gJFNlbGYtPkdldE9wdGlvbignbWljcm8tc2xlZXAnKTsKICAgIG15ICRDdXN0b21lckxpbWl0TGV2ZWwgPSAkU2VsZi0+R2V0T3B0aW9uKCd1c2UtY3VzdG9tZXItYmF0Y2hlcycpIHx8ICcwJzsKCiAgICBpZiAoICRUYXJnZXRzID1+IG0vdHxpfGYvICkgewogICAgICAgICRTZWxmLT5DcmVhdGVBdHRhY2htZW50UGlwZWxpbmUoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICApOwogICAgICAgICRTZWxmLT5DcmVhdGVUbXBBdHRhY2htZW50c0luZGV4KAogICAgICAgICAgICBFU09iamVjdCA9PiAkRVNPYmplY3QsCiAgICAgICAgICAgIENvbmZpZyAgID0+ICRDb25maWdJbmRleFNldHRpbmdzLT57VG1wQXR0YWNobWVudHN9IC8vICRDb25maWcsCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlcy0+e1RtcEF0dGFjaG1lbnRzfSAgICAgIC8vICRJbmRleFRlbXBsYXRlcy0+e0RlZmF1bHR9LAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAkVGFyZ2V0cyA9fiBtL2MvICkgewogICAgICAgICRTZWxmLT5NaWdyYXRlQ29tcGFuaWVzKAogICAgICAgICAgICBFU09iamVjdCA9PiAkRVNPYmplY3QsCiAgICAgICAgICAgIENvbmZpZyAgID0+ICRDb25maWdJbmRleFNldHRpbmdzLT57Q3VzdG9tZXJ9IC8vICRDb25maWcsCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlcy0+e0N1c3RvbWVyfSAgICAgIC8vICRJbmRleFRlbXBsYXRlcy0+e0RlZmF1bHR9LAogICAgICAgICAgICBTbGVlcCAgICA9PiAkTWljcm9TbGVlcCwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFRhcmdldHMgPX4gL3UvICkgewogICAgICAgICRTZWxmLT5NaWdyYXRlQ3VzdG9tZXJVc2VycygKICAgICAgICAgICAgRVNPYmplY3QgICA9PiAkRVNPYmplY3QsCiAgICAgICAgICAgIENvbmZpZyAgICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntDdXN0b21lclVzZXJ9IC8vICRDb25maWcsCiAgICAgICAgICAgIFRlbXBsYXRlICAgPT4gJEluZGV4VGVtcGxhdGVzLT57Q3VzdG9tZXJVc2VyfSAgICAgIC8vICRJbmRleFRlbXBsYXRlcy0+e0RlZmF1bHR9LAogICAgICAgICAgICBTbGVlcCAgICAgID0+ICRNaWNyb1NsZWVwLAogICAgICAgICAgICBMaW1pdExldmVsID0+ICRDdXN0b21lckxpbWl0TGV2ZWwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFRhcmdldHMgPX4gL3QvICkgewogICAgICAgICRTZWxmLT5NaWdyYXRlVGlja2V0cygKICAgICAgICAgICAgRVNPYmplY3QgPT4gJEVTT2JqZWN0LAogICAgICAgICAgICBDb25maWcgICA9PiAkQ29uZmlnSW5kZXhTZXR0aW5ncy0+e1RpY2tldH0gLy8gJENvbmZpZywKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGVzLT57VGlja2V0fSAgICAgIC8vICRJbmRleFRlbXBsYXRlcy0+e0RlZmF1bHR9LAogICAgICAgICAgICBTbGVlcCAgICA9PiAkTWljcm9TbGVlcCwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFRhcmdldHMgPX4gL2kvICkgewogICAgICAgICRTZWxmLT5NaWdyYXRlQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIEVTT2JqZWN0ID0+ICRFU09iamVjdCwKICAgICAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZ0luZGV4U2V0dGluZ3MtPntDb25maWdJdGVtfSAvLyAkQ29uZmlnLAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZXMtPntDb25maWdJdGVtfSAgICAgIC8vICRJbmRleFRlbXBsYXRlcy0+e0RlZmF1bHR9LAogICAgICAgICAgICBTbGVlcCAgICA9PiAkTWljcm9TbGVlcCwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFRhcmdldHMgPX4gL2YvICkgewogICAgICAgICRTZWxmLT5NaWdyYXRlRkFRcygKICAgICAgICAgICAgRVNPYmplY3QgPT4gJEVTT2JqZWN0LAogICAgICAgICAgICBDb25maWcgICA9PiAkQ29uZmlnSW5kZXhTZXR0aW5ncy0+e0ZBUX0gICAvLyAkQ29uZmlnLAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZXMtPntDb25maWdJdGVtfSAvLyAkSW5kZXhUZW1wbGF0ZXMtPntEZWZhdWx0fSwKICAgICAgICAgICAgU2xlZXAgICAgPT4gJE1pY3JvU2xlZXAsCiAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlT2soKTsKfQoKc3ViIENyZWF0ZUF0dGFjaG1lbnRQaXBlbGluZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0dXAgdGhlIGF0dGFjaG1lbnQgcGlwZWxpbmUKICAgIG15ICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+RGVsZXRlUGlwZWxpbmUoKTsKCiAgICBteSAlUGlwZWxpbmUgPSAoCiAgICAgICAgZGVzY3JpcHRpb24gPT4gIkV4dHJhY3QgZXh0ZXJuYWwgYXR0YWNobWVudCBpbmZvcm1hdGlvbiIsCiAgICAgICAgcHJvY2Vzc29ycyAgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3JlYWNoID0+IHsKICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgPT4gIkF0dGFjaG1lbnRzIiwKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9maWVsZCA9PiAiX2luZ2VzdC5fdmFsdWUuYXR0YWNobWVudCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCAgICAgICAgPT4gIl9pbmdlc3QuX3ZhbHVlLmRhdGEiCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvcmVhY2ggPT4gewogICAgICAgICAgICAgICAgICAgIGZpZWxkICAgICA9PiAiQXR0YWNobWVudHMiLAogICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9PiAiX2luZ2VzdC5fdmFsdWUuZGF0YSIKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIF0KICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVQaXBlbGluZSgKICAgICAgICBSZXF1ZXN0ID0+IFwlUGlwZWxpbmUsCiAgICApOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkF0dGFjaG1lbnQgcGlwZWxpbmUgc2V0IHVwLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5BdHRhY2htZW50IHBpcGVsaW5lIGNvdWxkIG5vdCBiZSBzZXQgdXAhPC9yZWQ+XG4iKTsKCiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBDcmVhdGVUbXBBdHRhY2htZW50c0luZGV4IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICBpbmRleCA9PiAndG1wYXR0YWNobWVudHMnLAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFBhcmFte0VTT2JqZWN0fS0+RHJvcEluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICk7CiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PlRoZSBwcmV2aW91cyBlcnJvciBtZXNzYWdlcyBhcmUgbGlrZWx5IHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIGRyb3AgYSBub25leGlzdGVudCBpbmRleCBhbmQgY2FuIHRoZW4gYmUgaWdub3JlZC48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgfQoKICAgIG15ICRJbmRleFNldHRpbmdzID0gJFBhcmFte0VTT2JqZWN0fS0+SW5kZXhTZXR0aW5nc0dldCglUGFyYW0pOwogICAgaWYgKCAhJEluZGV4U2V0dGluZ3MgKSB7CgogICAgICAgICMgRXJyb3IgaXMgc2hvd24gaW4gSW5kZXhTZXR0aW5nc0dldAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG15ICVSZXF1ZXN0ID0gKAogICAgICAgIHNldHRpbmdzID0+ICRJbmRleFNldHRpbmdzLAogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkNyZWF0ZUluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0LAogICAgKTsKCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5UZW1wb3JhcnkgYXR0YWNobWVudHMgaW5kZXggY3JlYXRlZC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+VGVtcG9yYXJ5IGF0dGFjaG1lbnRzIGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBNaWdyYXRlQ29tcGFuaWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgIG15ICVDdXN0b21lckNvbXBhbnlMaXN0ICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIExpbWl0ID0+IDAsCiAgICApOwoKICAgIG15ICVJbmRleE5hbWUgPSAoCiAgICAgICAgaW5kZXggPT4gJ2N1c3RvbWVyJywKICAgICk7CiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5UaGUgcHJldmlvdXMgZXJyb3IgbWVzc2FnZXMgYXJlIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRyeWluZyB0byBkcm9wIGEgbm9uZXhpc3RlbnQgaW5kZXggYW5kIGNhbiB0aGVuIGJlIGlnbm9yZWQuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkSW5kZXhTZXR0aW5ncyA9ICRQYXJhbXtFU09iamVjdH0tPkluZGV4U2V0dGluZ3NHZXQoJVBhcmFtKTsKICAgIGlmICggISRJbmRleFNldHRpbmdzICkgewoKICAgICAgICAjIEVycm9yIGlzIHNob3duIGluIEluZGV4U2V0dGluZ3NHZXQKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSAlUmVxdWVzdCA9ICgKICAgICAgICBzZXR0aW5ncyA9PiAkSW5kZXhTZXR0aW5ncywKICAgICAgICBtYXBwaW5ncyA9PiB7CiAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q3VzdG9tZXIgaW5kZXggY3JlYXRlZC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+Q3VzdG9tZXIgaW5kZXggY291bGQgbm90IGJlIGNyZWF0ZWQhPC9yZWQ+XG4iKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAjIHJldHVybiBpZiBubyBTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZAogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpDdXN0b21lckNvbXBhbnlTdG9yZUZpZWxkcycpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5ObyBDdXN0b21lckNvbXBhbnlTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZC48L3llbGxvdz5cbiIpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkQ291bnQgICAgICAgICA9IDA7CiAgICBteSAkQ3VzdG9tZXJDb3VudCA9IHNjYWxhciBrZXlzICVDdXN0b21lckNvbXBhbnlMaXN0OwoKICAgIG15ICRFcnJvcnMgPSAwOwogICAgQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIHNvcnQga2V5cyAlQ3VzdG9tZXJDb21wYW55TGlzdCApIHsKCiAgICAgICAgJENvdW50Kys7CgogICAgICAgICMgY3JlYXRlIHRoZSBjb21wYW55IGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoICEkUGFyYW17RVNPYmplY3R9LT5DdXN0b21lckNvbXBhbnlBZGQoIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQgKSApIHsKICAgICAgICAgICAgJEVycm9ycysrOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHByb2dyZXNzIGFuZCBwb3RlbnRpYWxseSBzbGVlcAogICAgICAgIGlmICggJENvdW50ICUgNTAwID09IDAgKSB7CiAgICAgICAgICAgIG15ICRQZXJjZW50ID0gaW50KCAkQ291bnQgLyAoICRDdXN0b21lckNvdW50IC8gMTAwICkgKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjx5ZWxsb3c+JENvdW50PC95ZWxsb3c+IG9mIDx5ZWxsb3c+JEN1c3RvbWVyQ291bnQ8L3llbGxvdz4gcHJvY2Vzc2VkICg8eWVsbG93PiRQZXJjZW50ICU8L3llbGxvdz4gZG9uZSkuXG4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBUaW1lOjpIaVJlczo6dXNsZWVwKCAkUGFyYW17U2xlZXB9ICkgaWYgJFBhcmFte1NsZWVwfTsKICAgIH0KCiAgICBpZiAoJEVycm9ycykgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5DdXN0b21lckNvbXBhbnkgdHJhbnNmZXIgY29tcGxldGUuICRFcnJvcnMgZXJyb3Iocykgb2NjdXJyZWQhPC95ZWxsb3c+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkN1c3RvbWVyQ29tcGFueSB0cmFuc2ZlciBjb21wbGV0ZS4gVHJhbnNmZXJyZWQgJENvdW50IGNvbXBhbmllcy48L2dyZWVuPlxuIik7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBNaWdyYXRlQ3VzdG9tZXJVc2VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdDsKICAgIG15ICRDdXN0b21lckxpbWl0TGV2ZWwgPSAkUGFyYW17TGltaXRMZXZlbH07CgogICAgIyBObyBzcGVjaWFsIHNlYXJjaCwgc2VhcmNoIGFsbCBjdXN0b21lcnMgdG9nZXRoZXIKICAgIGlmICggJEN1c3RvbWVyTGltaXRMZXZlbCA9PSAwICkgewogICAgICAgICVDdXN0b21lclVzZXJMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAnKicsCiAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICBMaW1pdCAgPT4gNF8wMDBfMDAwLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRDdXN0b21lckxpbWl0TGV2ZWwgPj0gMSApIHsKCiAgICAgICAgIyBTZWFyY2ggd2l0aCBDdXN0b21lclVzZXJMaW1pdCB4IGEuLnoKICAgICAgICBmb3IgbXkgJExldHRlciAoICJhIiB4ICRDdXN0b21lckxpbWl0TGV2ZWwgLi4gInoiIHggJEN1c3RvbWVyTGltaXRMZXZlbCwgJ2EwJyAuLiAnejknLCAnMCcgLi4gJzknICkgewoKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjxncmVlbj5TZWFyY2ggZm9yIGFsbCBjdXN0b21lcnVzZXIgbGlrZTogJExldHRlciouPC9ncmVlbj5cbiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0TmV3ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJExldHRlciAuICcqJywKICAgICAgICAgICAgICAgIFZhbGlkICA9PiAxLAogICAgICAgICAgICAgICAgTGltaXQgID0+IDRfMDAwXzAwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICVDdXN0b21lclVzZXJMaXN0ID0gKCAlQ3VzdG9tZXJVc2VyTGlzdCwgJUN1c3RvbWVyVXNlckxpc3ROZXcgKTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICBpbmRleCA9PiAnY3VzdG9tZXJ1c2VyJywKICAgICk7CiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUKICAgICk7CiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoCiAgICAgICAgICAgICI8eWVsbG93PlByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gZHJvcCBhIG5vbmV4aXN0ZW50IGluZGV4IGFuZCBjYW4gdGhlbiBiZSBpZ25vcmVkLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEluZGV4U2V0dGluZ3MgPSAkUGFyYW17RVNPYmplY3R9LT5JbmRleFNldHRpbmdzR2V0KCVQYXJhbSk7CiAgICBpZiAoICEkSW5kZXhTZXR0aW5ncyApIHsKCiAgICAgICAgIyBFcnJvciBpcyBzaG93biBpbiBJbmRleFNldHRpbmdzR2V0CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVJlcXVlc3QgPSAoCiAgICAgICAgc2V0dGluZ3MgPT4gJEluZGV4U2V0dGluZ3MsCiAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkNyZWF0ZUluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0LAogICAgKTsKCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5DdXN0b21lclVzZXIgaW5kZXggY3JlYXRlZC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+Q3VzdG9tZXJVc2VyIGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkN1c3RvbWVyVXNlclN0b3JlRmllbGRzJykgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93Pk5vIEN1c3RvbWVyVXNlclN0b3JlRmllbGRzIGFyZSBkZWZpbmVkLjwveWVsbG93PlxuIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJENvdW50ICAgICAgICAgICAgID0gMDsKICAgIG15ICRDdXN0b21lclVzZXJDb3VudCA9IHNjYWxhciBrZXlzICVDdXN0b21lclVzZXJMaXN0OwoKICAgIG15ICRFcnJvcnMgPSAwOwogICAgQ1VTVE9NRVJVU0VSSUQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcklEICggc29ydCBrZXlzICVDdXN0b21lclVzZXJMaXN0ICkgewoKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBjcmVhdGUgdGhlIGN1c3RvbWVyIHVzZXIgaW4gRWxhc3RpY3NlYXJjaAogICAgICAgIGlmICggISRQYXJhbXtFU09iamVjdH0tPkN1c3RvbWVyVXNlckFkZCggVXNlckxvZ2luID0+ICRDdXN0b21lclVzZXJJRCApICkgewogICAgICAgICAgICAkRXJyb3JzKys7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJvZ3Jlc3MgYW5kIHBvdGVudGlhbGx5IHNsZWVwCiAgICAgICAgaWYgKCAkQ291bnQgJSA1MDAgPT0gMCApIHsKICAgICAgICAgICAgbXkgJFBlcmNlbnQgPSBpbnQoICRDb3VudCAvICggJEN1c3RvbWVyVXNlckNvdW50IC8gMTAwICkgKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjx5ZWxsb3c+JENvdW50PC95ZWxsb3c+IG9mIDx5ZWxsb3c+JEN1c3RvbWVyVXNlckNvdW50PC95ZWxsb3c+IHByb2Nlc3NlZCAoPHllbGxvdz4kUGVyY2VudCAlPC95ZWxsb3c+IGRvbmUpLlxuIgogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgVGltZTo6SGlSZXM6OnVzbGVlcCggJFBhcmFte1NsZWVwfSApIGlmICRQYXJhbXtTbGVlcH07CiAgICB9CgogICAgaWYgKCRFcnJvcnMpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjx5ZWxsb3c+Q3VzdG9tZXJVc2VyIHRyYW5zZmVyIGNvbXBsZXRlLiAkRXJyb3JzIGVycm9yKHMpIG9jY3VycmVkITwveWVsbG93PlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5DdXN0b21lclVzZXIgdHJhbnNmZXIgY29tcGxldGUuIFRyYW5zZmVycmVkICRDb3VudCBjdXN0b21lciB1c2Vycy48L2dyZWVuPlxuIik7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBNaWdyYXRlVGlja2V0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUaWNrZXRPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwogICAgbXkgJEFydGljbGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpBcnRpY2xlJyk7CgogICAgbXkgQFRpY2tldElEcyA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFNlYXJjaCgKICAgICAgICBSZXN1bHQgICAgID0+ICdBUlJBWScsCiAgICAgICAgTGltaXQgICAgICA9PiAxMDBfMDAwXzAwMCwKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nLAogICAgKTsKCiAgICAjIERyb3AgZXhpc3RpbmcgdGlja2V0IGluZGV4CiAgICBteSAlSW5kZXhOYW1lID0gKAogICAgICAgIGluZGV4ID0+ICd0aWNrZXQnLAogICAgKTsKCiAgICBteSAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkRyb3BJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5QcmV2aW91cyBlcnJvciBtZXNzYWdlcyBhcmUgbGlrZWx5IHRoZSByZXN1bHQgb2YgdHJ5aW5nIHRvIGRyb3AgYSBub25leGlzdGVudCBpbmRleCBhbmQgY2FuIHRoZW4gYmUgaWdub3JlZC48L3llbGxvdz5cbiIKICAgICAgICApOwogICAgfQoKICAgIG15ICRJbmRleFNldHRpbmdzID0gJFBhcmFte0VTT2JqZWN0fS0+SW5kZXhTZXR0aW5nc0dldCglUGFyYW0pOwogICAgaWYgKCAhJEluZGV4U2V0dGluZ3MgKSB7CgogICAgICAgICMgRXJyb3IgaXMgc2hvd24gaW4gSW5kZXhTZXR0aW5nc0dldAogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG15ICVSZXF1ZXN0ID0gKAogICAgICAgIHNldHRpbmdzID0+ICRJbmRleFNldHRpbmdzLAogICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICBHcm91cElEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+IHsKICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgKTsKCiAgICAkU3VjY2VzcyA9ICRQYXJhbXtFU09iamVjdH0tPkNyZWF0ZUluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiBcJUluZGV4TmFtZSwKICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0LAogICAgKTsKCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5UaWNrZXQgaW5kZXggY3JlYXRlZC48L2dyZWVuPlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxyZWQ+VGlja2V0IGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OlRpY2tldFN0b3JlRmllbGRzJykgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93Pk5vIFRpY2tldFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkLjwveWVsbG93PlxuIik7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICRDb3VudCAgICAgPSAwOwogICAgbXkgJFBlcmNlbnQxMCA9ICggc29ydCB7ICRhIDw9PiAkYiB9ICggMTAsIGludCggJCNUaWNrZXRJRHMgLyAxMCApICkgKVsxXTsKICAgIG15ICRQZXJjZW50MSAgPSAoIHNvcnQgeyAkYSA8PT4gJGIgfSAoIDEsICBpbnQoICQjVGlja2V0SURzIC8gMTAwICkgKSApWzFdOwoKICAgIGlmICggJCNUaWNrZXRJRHMgPiAxMDAgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAiPHllbGxvdz5UaWNrZXRzIGFyZSB0cmFuc2ZlcmVkLiBUaGlzIGNhbiB0YWtlIHNldmVyYWwgaG91cnMsIGRlcGVuZGluZyBvbiB0aGUgbnVtYmVyIG9mIHRpY2tldHMuPC95ZWxsb3c+XG4iCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkRXJyb3JzID0gMDsKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldElEcykgewoKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBjcmVhdGUgdGhlIHRpY2tldAogICAgICAgIGlmICggISRQYXJhbXtFU09iamVjdH0tPlRpY2tldENyZWF0ZSggVGlja2V0SUQgPT4gJFRpY2tldElEICkgKSB7CiAgICAgICAgICAgICRFcnJvcnMrKzsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIHRoZSBhcnRpY2xlcwogICAgICAgIG15IEBBcnRpY2xlTGlzdCA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUxpc3QpIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRFcnJvcnMrKyBpZiAhJFN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJvZ3Jlc3MgYW5kIHBvdGVudGlhbGx5IHNsZWVwCiAgICAgICAgaWYgKCAkQ291bnQgJSAkUGVyY2VudDEwID09IDAgKSB7CiAgICAgICAgICAgIG15ICRQZXJjZW50ID0gaW50KCAkQ291bnQgLyAoICQjVGlja2V0SURzIC8gMTAwICkgKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjx5ZWxsb3c+JENvdW50PC95ZWxsb3c+IG9mIDx5ZWxsb3c+JCNUaWNrZXRJRHM8L3llbGxvdz4gcHJvY2Vzc2VkICg8eWVsbG93PiRQZXJjZW50ICU8L3llbGxvdz4gZG9uZSkuXG4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJCNUaWNrZXRJRHMgPiA1MCAmJiAkQ291bnQgJSAkUGVyY2VudDEgPT0gMCApIHsKICAgICAgICAgICAgJFNlbGYtPlByaW50KCcuICcpOwogICAgICAgICAgICBzZWxlY3QoKS0+Zmx1c2goKTsgICAgIyBzaG93IHRoZSBkb3QgaW1tZWRpYXRlbHkKICAgICAgICB9CgogICAgICAgIFRpbWU6OkhpUmVzOjp1c2xlZXAoICRQYXJhbXtTbGVlcH0gKSBpZiAkUGFyYW17U2xlZXB9OwogICAgfQoKICAgIGlmICgkRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PlRpY2tldCB0cmFuc2ZlciBjb21wbGV0ZS4gJEVycm9ycyBlcnJvcihzKSBvY2N1cnJlZCE8L3llbGxvdz5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+VGlja2V0IHRyYW5zZmVyIGNvbXBsZXRlLiBUcmFuc2ZlcnJlZCAkQ291bnQgdGlja2V0cy48L2dyZWVuPlxuIik7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBNaWdyYXRlQ29uZmlnSXRlbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHdoZXRoZXIgSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ21lbnQgaXMgaW5zdGFsbGVkCiAgICBteSAkUGFja2FnZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpQYWNrYWdlJyk7CiAgICBteSAkSXNJbnN0YWxsZWQgICA9ICRQYWNrYWdlT2JqZWN0LT5QYWNrYWdlSXNJbnN0YWxsZWQoCiAgICAgICAgTmFtZSA9PiAnSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50JywKICAgICk7CiAgICBpZiAoICEkSXNJbnN0YWxsZWQgKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+U2tpcHBpbmcgSVRTTUNvbmZpZ0l0ZW1zIChJVFNNQ29uZmlndXJhdGlvbk1hbmFnbWVudCBub3QgaW5zdGFsbGVkKS4uLjwvZ3JlZW4+XG4iKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyk7CiAgICBteSAkQ2xhc3NMaXN0ICAgICAgICAgICAgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7CgogICAgbXkgJEV4Y2x1ZGVkQ2xhc3NlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6RXhjbHVkZWRDSUNsYXNzZXMnKTsKICAgICRFeGNsdWRlZENsYXNzZXMgPSB7IG1hcCB7ICRfID0+IDEgfSBAeyRFeGNsdWRlZENsYXNzZXN9IH07CgogICAgbXkgQEFjdGl2ZUNsYXNzZXM7CiAgICBDTEFTUzoKICAgIGZvciBteSAkQ2xhc3MgKCBrZXlzICV7JENsYXNzTGlzdH0gKSB7CiAgICAgICAgbmV4dCBDTEFTUyBpZiAkRXhjbHVkZWRDbGFzc2VzLT57JENsYXNzfTsKICAgICAgICBwdXNoIEBBY3RpdmVDbGFzc2VzLCAkQ2xhc3M7CiAgICB9CgogICAgbXkgJUluZGV4TmFtZSA9ICgKICAgICAgICBpbmRleCA9PiAnY29uZmlnaXRlbScsCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+VGhlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gZHJvcCBhIG5vbmV4aXN0ZW50IGluZGV4IGFuZCBjYW4gdGhlbiBiZSBpZ25vcmVkLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEluZGV4U2V0dGluZ3MgPSAkUGFyYW17RVNPYmplY3R9LT5JbmRleFNldHRpbmdzR2V0KCVQYXJhbSk7CiAgICBpZiAoICEkSW5kZXhTZXR0aW5ncyApIHsKCiAgICAgICAgIyBFcnJvciBpcyBzaG93biBpbiBJbmRleFNldHRpbmdzR2V0CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVJlcXVlc3QgPSAoCiAgICAgICAgc2V0dGluZ3MgPT4gJEluZGV4U2V0dGluZ3MsCiAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ3VyRGVwbFN0YXRlSUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgfSwKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gewogICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgfSwKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+Q29uZmlnSXRlbSBpbmRleCBjcmVhdGVkLjwvZ3JlZW4+XG4iKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5QcmludCgiPHJlZD5Db25maWdJdGVtIGluZGV4IGNvdWxkIG5vdCBiZSBjcmVhdGVkITwvcmVkPlxuIik7CgogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgICMgcmV0dXJuIGlmIG5vIFN0b3JlRmllbGRzIGFyZSBkZWZpbmVkCiAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkNvbmZpZ0l0ZW1TdG9yZUZpZWxkcycpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5ObyBDb25maWdJdGVtU3RvcmVGaWVsZHMgYXJlIGRlZmluZWQuPC95ZWxsb3c+XG4iKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBpZiBjdXJyZW50bHkgbm8gYWN0aXZlIGNsYXNzZXMgYXJlIGRlZmluZWQsIHJldHVybgogICAgcmV0dXJuIDEgaWYgIUBBY3RpdmVDbGFzc2VzOwoKICAgIG15IEBDb25maWdJdGVtcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIENsYXNzSURzID0+IFtAQWN0aXZlQ2xhc3Nlc10sCiAgICAgICAgUmVzdWx0ICAgPT4gJ0FSUkFZJywKICAgICk7CgogICAgbXkgJENvdW50ICAgPSAwOwogICAgbXkgJENJQ291bnQgPSBzY2FsYXIgQENvbmZpZ0l0ZW1zOwoKICAgIG15ICRFcnJvcnMgPSAwOwogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKEBDb25maWdJdGVtcykgewoKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBjcmVhdGUgdGhlIGNvbmZpZyBpdGVtIGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoICEkUGFyYW17RVNPYmplY3R9LT5Db25maWdJdGVtQ3JlYXRlKCBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCApICkgewogICAgICAgICAgICAkRXJyb3JzKys7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJvZ3Jlc3MgYW5kIHBvdGVudGlhbGx5IHNsZWVwCiAgICAgICAgaWYgKCAkQ291bnQgJSAxMDAwID09IDAgKSB7CiAgICAgICAgICAgIG15ICRQZXJjZW50ID0gaW50KCAkQ291bnQgLyAoICRDSUNvdW50IC8gMTAwICkgKTsKICAgICAgICAgICAgJFNlbGYtPlByaW50KAogICAgICAgICAgICAgICAgIjx5ZWxsb3c+JENvdW50PC95ZWxsb3c+IG9mIDx5ZWxsb3c+JENJQ291bnQ8L3llbGxvdz4gcHJvY2Vzc2VkICg8eWVsbG93PiRQZXJjZW50ICU8L3llbGxvdz4gZG9uZSkuXG4iCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBUaW1lOjpIaVJlczo6dXNsZWVwKCAkUGFyYW17U2xlZXB9ICkgaWYgJFBhcmFte1NsZWVwfTsKICAgIH0KCiAgICBpZiAoJEVycm9ycykgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5Db25maWdJdGVtIHRyYW5zZmVyIGNvbXBsZXRlLiAkRXJyb3JzIGVycm9yKHMpIG9jY3VycmVkITwveWVsbG93PlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Db25maWdJdGVtIHRyYW5zZmVyIGNvbXBsZXRlLiBUcmFuc2ZlcnJlZCAkQ291bnQgY29uZmlnIGl0ZW1zLjwvZ3JlZW4+XG4iKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIE1pZ3JhdGVGQVFzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayB3aGV0aGVyIEZBUSBpcyBpbnN0YWxsZWQKICAgIG15ICRQYWNrYWdlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UnKTsKICAgIG15ICRJc0luc3RhbGxlZCAgID0gJFBhY2thZ2VPYmplY3QtPlBhY2thZ2VJc0luc3RhbGxlZCgKICAgICAgICBOYW1lID0+ICdGQVEnLAogICAgKTsKICAgIGlmICggISRJc0luc3RhbGxlZCApIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5Ta2lwcGluZyBGQVFzIChGQVEgbm90IGluc3RhbGxlZCkuLi48L2dyZWVuPlxuIik7CgogICAgICAgIHJldHVybiAxOwogICAgfQoKICAgIG15ICVJbmRleE5hbWUgPSAoCiAgICAgICAgaW5kZXggPT4gJ2ZhcScsCiAgICApOwogICAgbXkgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5Ecm9wSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IFwlSW5kZXhOYW1lLAogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgIjx5ZWxsb3c+VGhlIHByZXZpb3VzIGVycm9yIG1lc3NhZ2VzIGFyZSBsaWtlbHkgdGhlIHJlc3VsdCBvZiB0cnlpbmcgdG8gZHJvcCBhIG5vbmV4aXN0ZW50IGluZGV4IGFuZCBjYW4gdGhlbiBiZSBpZ25vcmVkLjwveWVsbG93PlxuIgogICAgICAgICk7CiAgICB9CgogICAgbXkgJEluZGV4U2V0dGluZ3MgPSAkUGFyYW17RVNPYmplY3R9LT5JbmRleFNldHRpbmdzR2V0KCVQYXJhbSk7CiAgICBpZiAoICEkSW5kZXhTZXR0aW5ncyApIHsKCiAgICAgICAgIyBFcnJvciBpcyBzaG93biBpbiBJbmRleFNldHRpbmdzR2V0CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbXkgJVJlcXVlc3QgPSAoCiAgICAgICAgc2V0dGluZ3MgPT4gJEluZGV4U2V0dGluZ3MsCiAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICBwcm9wZXJ0aWVzID0+IHsKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgQ2F0ZWdvcnlJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9CiAgICAgICAgfSwKICAgICk7CgogICAgJFN1Y2Nlc3MgPSAkUGFyYW17RVNPYmplY3R9LT5DcmVhdGVJbmRleCgKICAgICAgICBJbmRleE5hbWUgPT4gXCVJbmRleE5hbWUsCiAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdCwKICAgICk7CgogICAgaWYgKCRTdWNjZXNzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8Z3JlZW4+RkFRIGluZGV4IGNyZWF0ZWQuPC9ncmVlbj5cbiIpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8cmVkPkZBUSBpbmRleCBjb3VsZCBub3QgYmUgY3JlYXRlZCE8L3JlZD5cbiIpOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAjIHJldHVybiBpZiBubyBTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZAogICAgaWYgKCAhJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpGQVFTdG9yZUZpZWxkcycpICkgewogICAgICAgICRTZWxmLT5QcmludCgiPHllbGxvdz5ObyBGQVFTdG9yZUZpZWxkcyBhcmUgZGVmaW5lZC48L3llbGxvdz5cbiIpOwoKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwogICAgbXkgQEZBUXMgICAgICA9ICRGQVFPYmplY3QtPkZBUVNlYXJjaCgKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgbXkgJENvdW50ICAgID0gMDsKICAgIG15ICRGQVFDb3VudCA9IHNjYWxhciBARkFRczsKCiAgICBteSAkRXJyb3JzID0gMDsKICAgIGZvciBteSAkSXRlbUlEIChARkFRcykgewoKICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgIyBjcmVhdGUgdGhlIEZBUSBpbiBFbGFzdGljc2VhcmNoCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFte0VTT2JqZWN0fS0+RkFRQ3JlYXRlKAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3JzKys7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJvZ3Jlc3MgYW5kIHBvdGVudGlhbGx5IHNsZWVwCiAgICAgICAgaWYgKCAkQ291bnQgJSAxMDAwID09IDAgKSB7CiAgICAgICAgICAgIG15ICRQZXJjZW50ID0gaW50KCAkQ291bnQgLyAoICRGQVFDb3VudCAvIDEwMCApICk7CiAgICAgICAgICAgICRTZWxmLT5QcmludCgKICAgICAgICAgICAgICAgICI8eWVsbG93PiRDb3VudDwveWVsbG93PiBvZiA8eWVsbG93PiRGQVFDb3VudDwveWVsbG93PiBwcm9jZXNzZWQgKDx5ZWxsb3c+JFBlcmNlbnQgJTwveWVsbG93PiBkb25lKS5cbiIKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIFRpbWU6OkhpUmVzOjp1c2xlZXAoICRQYXJhbXtTbGVlcH0gKSBpZiAkUGFyYW17U2xlZXB9OwogICAgfQoKICAgIGlmICgkRXJyb3JzKSB7CiAgICAgICAgJFNlbGYtPlByaW50KCI8eWVsbG93PkZBUSB0cmFuc2ZlciBjb21wbGV0ZS4gJEVycm9ycyBlcnJvcihzKSBvY2N1cmVkITwveWVsbG93PlxuIik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+UHJpbnQoIjxncmVlbj5GQVEgdHJhbnNmZXIgY29tcGxldGUuIFRyYW5zZmVycmVkICRDb3VudCBGQVEgaXRlbXMuPC9ncmVlbj5cbiIpOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/Elasticsearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAwZDcwMWU0ZDQwYjBjY2NmMmNhOTIyMmI4NDRiOTE2YjJkYjg1NjUzIC0gS2VybmVsL1N5c3RlbS9FbGFzdGljc2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkVsYXN0aWNzZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoIDphbGwgKTsKCiMgSW5mb3JtIHRoZSBvYmplY3QgbWFuYWdlciBhYm91dCB0aGUgaGFyZCBkZXBlbmRlbmNpZXMuCiMgVGhpcyBtb2R1bGUgbXVzdCBiZSBkaXNjYXJkZWQgd2hlbiBvbmUgb2YgdGhlIGhhcmQgZGVwZW5kZW5jaWVzIGhhcyBiZWVuIGRpc2NhcmRlZC4Kb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyaWNJbnRlcmZhY2U6OldlYnNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAopOwoKIyBJbmZvcm0gdGhlIENvZGVQb2xpY3kgYWJvdXQgdGhlIHNvZnQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGludGVudGlvbmFsbHkgbm90IGluIEBPYmplY3REZXBlbmRlbmNpZXMuCiMgU29mdCBkZXBlbmRlbmNpZXMgYXJlIG1vZHVsZXMgdGhhdCB1c2VkIGJ5IHRoaXMgb2JqZWN0LCBidXQgd2hvIGRvbid0IGFmZmVjdCB0aGUgc3RhdGUgb2YgdGhpcyBvYmplY3QuCiMgVGhlcmUgaXMgbm8gbmVlZCB0byBkaXNjYXJkIHRoaXMgbW9kdWxlIHdoZW4gb25lIG9mIHRoZSBzb2Z0IGRlcGVuZGVuY2llcyBpcyBkaXNjYXJkZWQuCm91ciBAU29mdE9iamVjdERlcGVuZGVuY2llcyA9ICgKCiAgICAnS2VybmVsOjpTeXN0ZW06OkZBUScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpFbGFzdGljc2VhcmNoIC0gRWxhc3RpY3NlYXJjaCBCYWNrZW5kCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoaXMgbW9kdWxlIHByb2Nlc3NlcyBzZWFyY2ggY2FsbHMgZm9yIHZhcmlvdXMgb3RvYm8gY2xhc3NlcyB0byBjYWxsIHRoZSBnZW5lcmljIEVsYXN0aWNzZWFyY2ggc2VhcmNoIGludm9rZXIKCj1oZWFkMiBuZXcoKQoKQ3JlYXRlIGFuIEVsYXN0aWNzZWFyY2ggb2JqZWN0LiBEbyBub3QgdXNlIGl0IGRpcmVjdGx5LCBpbnN0ZWFkIHVzZToKCiAgICBteSAkRVNPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RWxhc3RpY3NlYXJjaCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgIyBnZXQgdGhlIEVsYXN0aWNzZWFyY2ggd2Vic2VydmljZSBpZAogICAgbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwogICAgbXkgJFdlYnNlcnZpY2UgICAgICAgPSAkV2Vic2VydmljZU9iamVjdC0+V2Vic2VydmljZUdldCgKICAgICAgICBOYW1lID0+ICdFbGFzdGljc2VhcmNoJywKICAgICk7CgogICAgJFNlbGYtPntXZWJzZXJ2aWNlSUR9ID0gJFdlYnNlcnZpY2UtPntJRH07CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgVGlja2V0U2VhcmNoKCkKClBlcmZvcm1zIGEgdGlja2V0IHNlYXJjaCB2aWEgRWxhc3RpY3NlYXJjaC4KCiAgICBteSBAVGlja2V0SURzID0gJEVTT2JqZWN0LT5UaWNrZXRTZWFyY2goCiAgICAgICAgIyByZXN1bHQgKHJlcXVpcmVkKQogICAgICAgIFJlc3VsdCA9PiAnQVJSQVknIHx8ICdIQVNIJyB8fCAnQ09VTlQnIHx8ICdGVUxMJywKCiAgICAgICAgIyB1c2VyIHNlYXJjaCAoVXNlcklEIGlzIHJlcXVpcmVkKQogICAgICAgIFVzZXJJRCAgICAgPT4gMTIzLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJyB8fCAncncnLAoKICAgICAgICAjIGN1c3RvbWVyIHNlYXJjaCAoQ3VzdG9tZXJVc2VySUQgaXMgcmVxdWlyZWQpCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gMTIzLAogICAgICAgIFBlcm1pc3Npb24gICAgID0+ICdybycgfHwgJ3J3JywKCiAgICAgICAgIyByZXN1bHQgbGltaXQKICAgICAgICBMaW1pdCA9PiAxMDAsCgogICAgICAgICMgQ3VzdG9tZXJJRCAob3B0aW9uYWwpIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgogICAgICAgIEN1c3RvbWVySUQgPT4gJzEyMycsCiAgICAgICAgQ3VzdG9tZXJJRCA9PiBbJzEyMycsICdBQkMnXSwKCiAgICAgICAgIyBDdXN0b21lcklEUmF3IChvcHRpb25hbCkgYXMgU1RSSU5HIG9yIGFzIEFSUkFZUkVGCiAgICAgICAgIyBDdXN0b21lcklEIHdpdGhvdXQgUXVlcnlDb25kaXRpb24gY2hlY2tpbmcKICAgICAgICAjVGhlIHJhdyB2YWx1ZSB3aWxsIGJlIHVzZWQgaWYgaXMgc2V0IHRoaXMgcGFyYW1ldGVyCiAgICAgICAgQ3VzdG9tZXJJRFJhdyA9PiAnMTIzICsgMzQ1JywKICAgICAgICBDdXN0b21lcklEUmF3ID0+IFsnMTIzJywgJ0FCQycsJzEyMyAmJiA0NTYnLCdBQkMgJSBlZmcnXSwKCiAgICAgICAgIyBDdXN0b21lclVzZXJMb2dpbiAob3B0aW9uYWwpIGFzIFNUUklORyBhcyBBUlJBWVJFRgogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+ICd1aWQxMjMnLAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luID0+IFsndWlkMTIzJywgJ3VpZDc3NyddLAoKICAgICAgICAjIEN1c3RvbWVyVXNlckxvZ2luUmF3IChvcHRpb25hbCkgYXMgU1RSSU5HIGFzIEFSUkFZUkVGCiAgICAgICAgI1RoZSByYXcgdmFsdWUgd2lsbCBiZSB1c2VkIGlmIGlzIHNldCB0aGlzIHBhcmFtZXRlcgogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luUmF3ID0+ICd1aWQnLAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luUmF3ID0+ICd1aWQgKyAxMjMnLAogICAgICAgIEN1c3RvbWVyVXNlckxvZ2luUmF3ID0+IFsndWlkICAtICAxMjMnLCAndWlkICMgNzc3ICsgMzIxJ10sCgogICAgICAgICMgT3JkZXJCeSBhbmQgU29ydEJ5IChvcHRpb25hbCkKICAgICAgICBPcmRlckJ5ID0+ICdEb3duJywgICMgRG93bnxVcAogICAgICAgIFNvcnRCeSAgPT4gJ0FnZScsICAgIyBTY29yZXxBZ2UKCiAgICAgICAgIyBDYWNoZVRUTCwgY2FjaGUgc2VhcmNoIHJlc3VsdCBpbiBzZWNvbmRzIChvcHRpb25hbCkKICAgICAgICBDYWNoZVRUTCA9PiA2MCAqIDE1LAogICAgKTsKCj1jdXQKCnN1YiBUaWNrZXRTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSZXN1bHRUeXBlICAgPSAkUGFyYW17UmVzdWx0fSAgfHwgJ0FSUkFZJzsKICAgIG15ICRPcmRlckJ5ICAgICAgPSAkUGFyYW17T3JkZXJCeX0gfHwgWyAnRG93bicsICAnRG93bicgXTsKICAgIG15ICRTb3J0QnkgICAgICAgPSAkUGFyYW17U29ydEJ5fSAgfHwgWyAnU2NvcmUnLCAnQWdlJyBdOwogICAgbXkgJExpbWl0ICAgICAgICA9ICRQYXJhbXtMaW1pdH0gICB8fCAxMDAwMDsKCiAgICBteSAkRnJvbSAgICAgICAgICAgPSAkUGFyYW17RnJvbX0gfHwgMDsKICAgIG15ICRFeHRlbmRlZFNlYXJjaCA9ICRQYXJhbXtFeHRlbmRlZFNlYXJjaH0gLy8gMTsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gJiYgISRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCBvciBDdXN0b21lclVzZXJJRCBwYXJhbXMgZm9yIHBlcm1pc3Npb24gY2hlY2shJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdhdGhlciB0aGUgaW5mbyBmb3IgdGhlIEVsYXN0aWNzZWFyY2ggcXVlcnkgcHJlcGFyYXRpb24KICAgICMgTXVzdCBpcyByZWFkIGFzIGFsbCBjb25kaXRpb25zIGhhdmUgdG8gYmUgbWV0LCBTaG91bGQgaXMgcmVhZCBhcyBhdCBsZWFzdCBvbmUgY29uZGl0aW9uIGhhcyB0byBiZSBtZXQKICAgIG15ICggQEZpbHRlcnMsIEBNdXN0cyApOwoKICAgICMgdXNlciBncm91cHMKICAgIGlmICggJFBhcmFte1VzZXJJRH0gJiYgJFBhcmFte1VzZXJJRH0gIT0gMSApIHsKCiAgICAgICAgIyBnZXQgdXNlcnMgZ3JvdXBzCiAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJFBhcmFte1Blcm1pc3Npb259IHx8ICdybycsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gaWYgd2UgaGF2ZSBubyBwZXJtaXNzaW9ucwogICAgICAgIHJldHVybiBpZiAhJUdyb3VwTGlzdDsKCiAgICAgICAgIyBhZGQgcGVybWlzc2lvbiByZXN0cmljdGlvbnMKICAgICAgICBwdXNoIEBGaWx0ZXJzLCB7CiAgICAgICAgICAgIHRlcm1zID0+IHsKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gWyBrZXlzICVHcm91cExpc3QgXSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgY3VzdG9tZXIgZ3JvdXBzCiAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyktPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgIFR5cGUgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gfHwgJ3JvJywKICAgICAgICAgICAgUmVzdWx0ID0+ICdIQVNIJywKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiBpZiB3ZSBoYXZlIG5vIHBlcm1pc3Npb25zCiAgICAgICAgcmV0dXJuIGlmICElR3JvdXBMaXN0OwoKICAgICAgICAjIGdldCBhbGwgY3VzdG9tZXIgaWRzCiAgICAgICAgbXkgQEN1c3RvbWVySURzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lcklEcygKICAgICAgICAgICAgVXNlciA9PiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgcHJlcGFyZSBjb21iaW5hdGlvbiBvZiBjdXN0b21lcjwtPmdyb3VwIGFjY2VzcwogICAgICAgICMgYWRkIGRlZmF1bHQgY29tYmluYXRpb24gZmlyc3QgKCBDdXN0b21lcklEcyArIEN1c3RvbWVyVXNlcklEIDwtPiBydyBhY2Nlc3MgZ3JvdXBzICkKICAgICAgICAjIHRoaXMgZ3JvdXAgd2lsbCBhbHdheXMgYmUgYWRkZWQgKGVuc3VyZXMgcHJldmlvdXMgYmVoYXZpb3IpCiAgICAgICAgbXkgQEN1c3RvbWVyR3JvdXBQZXJtaXNzaW9uOwogICAgICAgIHB1c2ggQEN1c3RvbWVyR3JvdXBQZXJtaXNzaW9uLCB7CiAgICAgICAgICAgIEN1c3RvbWVySURzICAgID0+IFxAQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgIEdyb3VwSURzICAgICAgID0+IFsgc29ydCBrZXlzICVHcm91cExpc3QgXSwKICAgICAgICB9OwoKICAgICAgICAjIGFkZCBhbGwgY29tYmluYXRpb25zIGJhc2VkIG9uIGdyb3VwIGFjY2VzcyBmb3Igb3RoZXIgQ3VzdG9tZXJJRHMgKGlmIGF2YWlsYWJsZSkKICAgICAgICAjIG9ubHkgYWN0aXZlIGlmIGN1c3RvbWVyIGdyb3VwIHN1cHBvcnQgYW5kIGV4dHJhIHBlcm1pc3Npb24gY29udGV4dCBhcmUgZW5hYmxlZAogICAgICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKICAgICAgICBteSAkRXh0cmFQZXJtaXNzaW9uQ29udGV4dCA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cENvbnRleHROYW1lR2V0KAogICAgICAgICAgICBTeXNDb25maWdOYW1lID0+ICcxMDAtQ3VzdG9tZXJJRC1vdGhlcicsCiAgICAgICAgKTsKICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSAmJiAkRXh0cmFQZXJtaXNzaW9uQ29udGV4dCApIHsKCiAgICAgICAgICAgICMgYWRkIGxvb2t1cCBmb3IgQ3VzdG9tZXJJRAogICAgICAgICAgICBteSAlQ3VzdG9tZXJJRHNMb29rdXAgPSBtYXAgeyAkXyA9PiAkXyB9IEBDdXN0b21lcklEczsKCiAgICAgICAgICAgICMgZm9yIGFsbCBDdXN0b21lcklEcyBnZXQgZ3JvdXBzIHdpdGggYWNjZXNzIHRvIG90aGVyIEN1c3RvbWVySURzCiAgICAgICAgICAgIG15ICVFeHRyYVBlcm1pc3Npb25Hcm91cHM7CiAgICAgICAgICAgIENVU1RPTUVSSUQ6CiAgICAgICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoQEN1c3RvbWVySURzKSB7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJJREV4dHJhUGVybWlzc2lvbkdyb3VwcyA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cEN1c3RvbWVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgPT4gJFBhcmFte1Blcm1pc3Npb259IHx8ICdybycsCiAgICAgICAgICAgICAgICAgICAgQ29udGV4dCAgICA9PiAkRXh0cmFQZXJtaXNzaW9uQ29udGV4dCwKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IENVU1RPTUVSSUQgaWYgISVDdXN0b21lcklERXh0cmFQZXJtaXNzaW9uR3JvdXBzOwoKICAgICAgICAgICAgICAgICMgYWRkIHRvIGdyb3VwcwogICAgICAgICAgICAgICAgJUV4dHJhUGVybWlzc2lvbkdyb3VwcyA9ICgKICAgICAgICAgICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgICAgICVDdXN0b21lcklERXh0cmFQZXJtaXNzaW9uR3JvdXBzLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgYWxsIHVuaXF1ZSBhY2Nlc3NpYmxlIEdyb3VwPC0+Q3VzdG9tZXIgY29tYmluYXRpb25zIHRvIHF1ZXJ5CiAgICAgICAgICAgICMgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgYWxsIGdyb3VwcyBjb3JyZXNwb25zaW5nIHdpdGggYSB1bmlxdWUgY3VzdG9tZXIgaWQgY29tYmluYXRpb24KICAgICAgICAgICAgIyAgIHdpbGwgYmUgY29tYmluZWQgaW50byBvbmUgcGFydAogICAgICAgICAgICBteSAlQ3VzdG9tZXJJRENvbWJpbmF0aW9uczsKICAgICAgICAgICAgR1JPVVBJRDoKICAgICAgICAgICAgZm9yIG15ICRHcm91cElEICggc29ydCBrZXlzICVFeHRyYVBlcm1pc3Npb25Hcm91cHMgKSB7CiAgICAgICAgICAgICAgICBteSBARXh0cmFDdXN0b21lcklEcyA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cEN1c3RvbWVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFBhcmFte1Blcm1pc3Npb259IHx8ICdybycsCiAgICAgICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSUQnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVBJRCBpZiAhQEV4dHJhQ3VzdG9tZXJJRHM7CgogICAgICAgICAgICAgICAgIyBleGNsdWRlIG93biBDdXN0b21lcklEcyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucwogICAgICAgICAgICAgICAgbXkgQE1lcmdlZEN1c3RvbWVySURzID0gZ3JlcCB7ICEkQ3VzdG9tZXJJRHNMb29rdXB7JF99IH0gQEV4dHJhQ3VzdG9tZXJJRHM7CiAgICAgICAgICAgICAgICBuZXh0IEdST1VQSUQgaWYgIUBNZXJnZWRDdXN0b21lcklEczsKCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGNvbWJpbmF0aW9uCiAgICAgICAgICAgICAgICBteSAkQ3VzdG9tZXJJRFN0cmluZyA9IGpvaW4gJywnLCBzb3J0IEBNZXJnZWRDdXN0b21lcklEczsKICAgICAgICAgICAgICAgIGlmICggISRDdXN0b21lcklEQ29tYmluYXRpb25zeyRDdXN0b21lcklEU3RyaW5nfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRENvbWJpbmF0aW9uc3skQ3VzdG9tZXJJRFN0cmluZ30gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySURzID0+IFxATWVyZ2VkQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1c2ggQHsgJEN1c3RvbWVySURDb21iaW5hdGlvbnN7JEN1c3RvbWVySURTdHJpbmd9LT57R3JvdXBJRHN9IH0sICRHcm91cElEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCB0byBxdWVyeSBjb21iaW5hdGlvbnMKICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJHcm91cFBlcm1pc3Npb24sIHNvcnQgdmFsdWVzICVDdXN0b21lcklEQ29tYmluYXRpb25zOwogICAgICAgIH0KCiAgICAgICAgIyBub3cgYWRkIGFsbCBjb21iaW5hdGlvbnMgdG8gcXVlcnk6CiAgICAgICAgIyB0aGlzIHdpbGwgY29tcGlsZSBhIHNlYXJjaCByZXN0cmljdGlvbiBiYXNlZCBvbiBjdXN0b21lcl9pZC9jdXN0b21lcl91c2VyX2lkIGFuZCBncm91cAogICAgICAgICMgICBhbmQgd2lsbCBtYXRjaCBpZiBhbnkgb2YgdGhlIHBlcm1pc3Npb24gY29tYmluYXRpb24gaXMgbWV0CiAgICAgICAgIyBhIHBlcm1pc3Npb24gY29tYmluYXRpb24gY291bGQgYmU6CiAgICAgICAgIyAgICAgKCA8Q3VzdG9tZXJVc2VySUQ+IE9SIDxDVVNUT01FUklEMT4gKSBBTkQgKCA8R1JPVVBJRDE+ICkKICAgICAgICAjIG9yCiAgICAgICAgIyAgICAgKCA8Q3VzdG9tZXJJRDE+IE9SIDxDVVNUT01FUklEMj4gT1IgPENVU1RPTUVSSUQzPiApIEFORCAoIDxHUk9VUElEMT4gT1IgPEdST1VQSUQyPiApCiAgICAgICAgbXkgQEN1c3RvbWVySURHcm91cENvbWJpbmF0aW9uczsKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5IChAQ3VzdG9tZXJHcm91cFBlcm1pc3Npb24pIHsKICAgICAgICAgICAgbXkgJERpcmVjdENvbmRpdGlvbnM7CiAgICAgICAgICAgIG15IEBDdXN0b21lcklEczsKCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkRW50cnktPntDdXN0b21lcklEc30gKSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCBAeyAkRW50cnktPntDdXN0b21lcklEc30gfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXtDdXN0b21lclVzZXJMb2dpblJhd30gfHwgKCAkRW50cnktPntDdXN0b21lclVzZXJJRH0gJiYgIUBDdXN0b21lcklEcyApICkgewogICAgICAgICAgICAgICAgJERpcmVjdENvbmRpdGlvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgdGVybSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtDdXN0b21lclVzZXJMb2dpblJhd30gLy8gJEVudHJ5LT57Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggQEN1c3RvbWVySURzICYmICRFbnRyeS0+e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICREaXJlY3RDb25kaXRpb25zID0gewogICAgICAgICAgICAgICAgICAgIGJvb2wgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgPT4gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlcm0gPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkRW50cnktPntDdXN0b21lclVzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+IFxAQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKEBDdXN0b21lcklEcykgewogICAgICAgICAgICAgICAgJERpcmVjdENvbmRpdGlvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+IFxAQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEBDdXN0b21lcklER3JvdXBDb21iaW5hdGlvbnMsIHsKICAgICAgICAgICAgICAgIGJvb2wgPT4gewogICAgICAgICAgICAgICAgICAgIGZpbHRlciA9PiBbCiAgICAgICAgICAgICAgICAgICAgICAgICREaXJlY3RDb25kaXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkRW50cnktPntHcm91cElEc30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwoKICAgICAgICB9CgogICAgICAgIGlmICggc2NhbGFyIEBDdXN0b21lcklER3JvdXBDb21iaW5hdGlvbnMgPT0gMSApIHsKICAgICAgICAgICAgcHVzaCBARmlsdGVycywgJEN1c3RvbWVySURHcm91cENvbWJpbmF0aW9uc1swXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHB1c2ggQEZpbHRlcnMsIHsKICAgICAgICAgICAgICAgIGJvb2wgPT4gewogICAgICAgICAgICAgICAgICAgIHNob3VsZCA9PiBcQEN1c3RvbWVySURHcm91cENvbWJpbmF0aW9ucywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgIH0KCiAgICAjIGZ1bGx0ZXh0IHNlYXJjaAogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtGdWxsdGV4dH0gKSB7CgogICAgICAgICMgZ2V0IGZpZWxkcyB0byBzZWFyY2gKICAgICAgICBteSAkRnVsbHRleHRGaWVsZHMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OlRpY2tldFNlYXJjaEZpZWxkcycpOwogICAgICAgIG15IEBTZWFyY2hGaWVsZHMgICA9IEB7ICRGdWxsdGV4dEZpZWxkcy0+e1RpY2tldH0gfTsKICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICggbWFwIHsiQXJ0aWNsZXNFeHRlcm5hbC4kXyJ9IEB7ICRGdWxsdGV4dEZpZWxkcy0+e0FydGljbGV9IH0gKTsKICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICggIkF0dGFjaG1lbnRzRXh0ZXJuYWwuQ29udGVudCIsICJBdHRhY2htZW50c0V4dGVybmFsLkZpbGVuYW1lIiApOwoKICAgICAgICAjIGFkZCBpbnRlcm5hbCBmaWVsZHMKICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICggbWFwIHsiQXJ0aWNsZXNJbnRlcm5hbC4kXyJ9IEB7ICRGdWxsdGV4dEZpZWxkcy0+e0FydGljbGV9IH0gKTsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoICJBdHRhY2htZW50c0ludGVybmFsLkNvbnRlbnQiLCAiQXR0YWNobWVudHNJbnRlcm5hbC5GaWxlbmFtZSIgKTsKICAgICAgICB9CgogICAgICAgICMgaGFuZGxlIGR5bmFtaWMgZmllbGRzCiAgICAgICAgaWYgKCAkRnVsbHRleHRGaWVsZHMtPntEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgICAgICAgICBteSAkWm9vbUNvbmZpZyAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclRpY2tldFpvb20nKSB8fCB7fTsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyRmllbGRzICAgICA9ICRab29tQ29uZmlnLT57RHluYW1pY0ZpZWxkfTsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lICggQHsgJEZ1bGx0ZXh0RmllbGRzLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKCiAgICAgICAgICAgICAgICAjIGFnZW50IHNlYXJjaAogICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlcklEfSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgYWxsIHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXJ0aWNsZSBkeW5hbWljZmllbGRzIGZvciBib3RoIGludGVybmFsIGFuZCBleHRlcm5hbCBhcnRpY2xlcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcnRpY2xlc0V4dGVybmFsLkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFydGljbGVzSW50ZXJuYWwuRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjdXN0b21lciBzZWFyY2gKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgZHluYW1pYyBmaWVsZCBpcyB2aXNpYmxlIGZvciBjdXN0b21lcnMKICAgICAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkQ3VzdG9tZXJGaWVsZHMgfHwgISRDdXN0b21lckZpZWxkcy0+eyREeW5hbWljRmllbGROYW1lfSApOwoKICAgICAgICAgICAgICAgICAgICAjIGFkZCB0aWNrZXQgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnVGlja2V0JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAiRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYWRkIGFydGljbGUgZHluYW1pY2ZpZWxkcyBmb3IgZXh0ZXJuYWwgYXJ0aWNsZXMKICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnQXJ0aWNsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCJBcnRpY2xlc0V4dGVybmFsLkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFF1ZXJ5ID0gJFNlbGYtPl9BdWdtZW50VGlja2V0U2VhcmNoUXVlcnlTdHJpbmcoCiAgICAgICAgICAgIFF1ZXJ5ICAgICAgICAgID0+ICRQYXJhbXtGdWxsdGV4dH0sCiAgICAgICAgICAgIFNlYXJjaEZpZWxkcyAgID0+IFxAU2VhcmNoRmllbGRzLAogICAgICAgICAgICBFeHRlbmRlZFNlYXJjaCA9PiAkRXh0ZW5kZWRTZWFyY2gsCiAgICAgICAgKTsKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbGFzdGljc2VhcmNoIFt0aWNrZXRdIFF1ZXJ5OiAiIC4gJFF1ZXJ5CiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcXVldWUgcmVzdHJpY3Rpb25zCiAgICAgICAgcHVzaCBATXVzdHMsIHsKICAgICAgICAgICAgcXVlcnlfc3RyaW5nID0+IHsKICAgICAgICAgICAgICAgIGZpZWxkcyA9PiBcQFNlYXJjaEZpZWxkcywKCiAgICAgICAgICAgICAgICBxdWVyeSA9PiAkUXVlcnksCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICB9CgogICAgIyBzaW1pbGFyIHNlYXJjaAogICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtNb3JlTGlrZVRoaXN9ICkgewoKICAgICAgICAjIGdldCBmaWVsZHMgdG8gc2VhcmNoCiAgICAgICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpUaWNrZXRTZWFyY2hGaWVsZHMnKTsKICAgICAgICBteSBAU2VhcmNoRmllbGRzICAgPSBAeyAkRnVsbHRleHRGaWVsZHMtPntUaWNrZXR9IH07CgogICAgICAgICMgcmVtb3ZlIHdlaWdodHMgZnJvbSBzZWFyY2hmaWVsZHNtIGVnICdUaXRsZV4zJyAtPiAnVGl0bGUnCiAgICAgICAgZm9yIG15ICRJbmRleCAoIDAgLi4gJCNTZWFyY2hGaWVsZHMgKSB7CgogICAgICAgICAgICAkU2VhcmNoRmllbGRzWyRJbmRleF0gPX4gcy9cXlswLTldKyQvLzsKICAgICAgICB9CgogICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCBtYXAgeyJBcnRpY2xlc0V4dGVybmFsLiRfIn0gQHsgJEZ1bGx0ZXh0RmllbGRzLT57QXJ0aWNsZX0gfSApOwogICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCAiQXR0YWNobWVudHNFeHRlcm5hbC5Db250ZW50IiwgIkF0dGFjaG1lbnRzRXh0ZXJuYWwuRmlsZW5hbWUiICk7CgogICAgICAgICMgYWRkIGludGVybmFsIGZpZWxkcwogICAgICAgIGlmICggJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgKCBtYXAgeyJBcnRpY2xlc0ludGVybmFsLiRfIn0gQHsgJEZ1bGx0ZXh0RmllbGRzLT57QXJ0aWNsZX0gfSApOwogICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICggIkF0dGFjaG1lbnRzSW50ZXJuYWwuQ29udGVudCIsICJBdHRhY2htZW50c0ludGVybmFsLkZpbGVuYW1lIiApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICAgICAgICAgIG15ICRab29tQ29uZmlnICAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbScpIHx8IHt9OwogICAgICAgICAgICBteSAkQ3VzdG9tZXJGaWVsZHMgICAgID0gJFpvb21Db25maWctPntEeW5hbWljRmllbGR9OwoKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZE5hbWUgKCBAeyAkRnVsbHRleHRGaWVsZHMtPntEeW5hbWljRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJER5bmFtaWNGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIElzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGQpOwoKICAgICAgICAgICAgICAgICMgYWdlbnQgc2VhcmNoCiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VySUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBhbGwgdGlja2V0IGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ1RpY2tldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSI7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGFkZCBhcnRpY2xlIGR5bmFtaWNmaWVsZHMgZm9yIGJvdGggaW50ZXJuYWwgYW5kIGV4dGVybmFsIGFydGljbGVzCiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRHluYW1pY0ZpZWxkLT57T2JqZWN0VHlwZX0gZXEgJ0FydGljbGUnICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFydGljbGVzRXh0ZXJuYWwuRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJ0aWNsZXNJbnRlcm5hbC5EeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGN1c3RvbWVyIHNlYXJjaAogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIyBjaGVjayBpZiBkeW5hbWljIGZpZWxkIGlzIHZpc2libGUgZm9yIGN1c3RvbWVycwogICAgICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRDdXN0b21lckZpZWxkcyB8fCAhJEN1c3RvbWVyRmllbGRzLT57JER5bmFtaWNGaWVsZE5hbWV9ICk7CgogICAgICAgICAgICAgICAgICAgICMgYWRkIHRpY2tldCBkeW5hbWljIGZpZWxkcwogICAgICAgICAgICAgICAgICAgIGlmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdUaWNrZXQnICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgYXJ0aWNsZSBkeW5hbWljZmllbGRzIGZvciBleHRlcm5hbCBhcnRpY2xlcwogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJER5bmFtaWNGaWVsZC0+e09iamVjdFR5cGV9IGVxICdBcnRpY2xlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoIkFydGljbGVzRXh0ZXJuYWwuRHluYW1pY0ZpZWxkXyREeW5hbWljRmllbGROYW1lIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKIyBJc3N1ZSA1ODE0LSByZWR1Y2UgbG9nZ2luZywgcmUtZW5hYmxlIGZvciBkZWJ1Z2dpbmcgbWFudWFsbHkgaWYgbmVlZGVkOgojCiMgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAojICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKIyAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbGFzdGljc2VhcmNoIFt0aWNrZXRdIFNpbWlsYXIgU2VhcmNoIFF1ZXJ5OiAiIC4gJFBhcmFte01vcmVMaWtlVGhpc30KIyAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgcXVldWUgcmVzdHJpY3Rpb25zCiAgICAgICAgcHVzaCBATXVzdHMsIHsKICAgICAgICAgICAgbW9yZV9saWtlX3RoaXMgPT4gewogICAgICAgICAgICAgICAgZmllbGRzICAgICAgICAgID0+IFxAU2VhcmNoRmllbGRzLAogICAgICAgICAgICAgICAgbGlrZSAgICAgICAgICAgID0+ICRQYXJhbXtNb3JlTGlrZVRoaXN9LAogICAgICAgICAgICAgICAgbWluX3Rlcm1fZnJlcSAgID0+IDEsCiAgICAgICAgICAgICAgICBtYXhfcXVlcnlfdGVybXMgPT4gMTIsCgogICAgICAgICAgICAgICAgIyBtaW5fZG9jX2ZyZXEgID0+IDUsICMgc2VlIEVTIGRvY3MgZm9yIG90aGVyIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICMgaHR0cHM6Ly93d3cuZWxhc3RpYy5jby9kb2NzL3JlZmVyZW5jZS9xdWVyeS1sYW5ndWFnZXMvcXVlcnktZHNsL3F1ZXJ5LWRzbC1tbHQtcXVlcnkKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgZGVmaW5lIHRoZSByZXR1cm4gdHlwZQogICAgbXkgJFJldHVybiA9ICggJFJlc3VsdFR5cGUgZXEgJ0hBU0gnICkgPyBbcXcoVGlja2V0SUQgVGlja2V0TnVtYmVyKV0gOgogICAgICAgICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgPyAnJyA6ICdUaWNrZXRJRCc7CgogICAgIyBkZWZpbmUgdGhlIHNvcnRpbmcKICAgIG15IEBTb3J0OwogICAgbXkgJU8yRSA9IHF3KERvd24gZGVzYyBVcCBhc2MpOwogICAgaWYgKCAhcmVmKCRTb3J0QnkpICkgewogICAgICAgICRTb3J0QnkgID0gWyRTb3J0QnldOwogICAgICAgICRPcmRlckJ5ID0gWyRPcmRlckJ5XTsKICAgIH0KICAgIGZvciBteSAkaSAoIDAgLi4gJCN7JFNvcnRCeX0gKSB7CgogICAgICAgICMgc2NvcmUgaXMgRWxhc3RpY3NlYXJjaCBzcGVjaWZpYwogICAgICAgIGlmICggJFNvcnRCeS0+WyRpXSBlcSAnU2NvcmUnICkgeyAkU29ydEJ5LT5bJGldID0gJ19zY29yZScgfQoKICAgICAgICAjIGFnZSBpcyBub3Qgc3RvcmVkIGluIEVsYXN0aWNzZWFyY2gKICAgICAgICBpZiAoICRTb3J0QnktPlskaV0gZXEgJ0FnZScgKSB7CiAgICAgICAgICAgICRTb3J0QnktPlskaV0gID0gJ0NyZWF0ZWQnOwogICAgICAgICAgICAkT3JkZXJCeS0+WyRpXSA9ICRPcmRlckJ5LT5bJGldIGVxICdVcCcgPyAnVXAnIDogJ0Rvd24nOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAU29ydCwgeyAkU29ydEJ5LT5bJGldID0+ICRPMkV7ICRPcmRlckJ5LT5bJGldIH0gfTsKICAgIH0KCiAgICAjIGNhbGwgdGhlIEVsYXN0aWNzZWFyY2ggd2Vic2VydmljZQogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnU2VhcmNoJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJ3RpY2tldCcsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICAgICAgU29ydCAgICAgID0+IFxAU29ydCwKICAgICAgICAgICAgRnJvbSAgICAgID0+ICRGcm9tLAogICAgICAgIH0KICAgICk7CgogICAgbXkgJFRvdGFsICAgPSAkUmVzdWx0LT57RGF0YX0tPntUb3RhbH0gICAvLyAwOwogICAgbXkgJFJlY29yZHMgPSAkUmVzdWx0LT57RGF0YX0tPntSZWNvcmRzfSAvLyBbXTsKCiMgSXNzdWUgNTgxNC0gcmVkdWNlIGxvZ2dpbmcsIHJlLWVuYWJsZSBmb3IgZGVidWdnaW5nIG1hbnVhbGx5IGlmIG5lZWRlZDoKIyAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKIyAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKIyAgICAgICAgTWVzc2FnZSAgPT4gIkVsYXN0aWNzZWFyY2ggW3RpY2tldF0gUmVzdWx0OiAiIC4gJFRvdGFsIC4gIiBIaXRzXG4iCiMgICAgKTsKCiAgICAjIGNvbnZlcnQgdGhlIEVsYXN0aWNzZWFyY2ggcmV0dXJuIHRvIHRoZSBuZWVkZWQgT1RSUyBzdHJ1Y3R1cmUgYW5kIHJldHVybgoKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgbWFwIHsKICAgICAgICAgICAgICAgIHsgJF8tPntUaWNrZXRJRH0gPT4gJF8tPntUaWNrZXROdW1iZXJ9IH0KICAgICAgICAgICAgfSBAeyRSZWNvcmRzfQogICAgICAgICk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIERhdGEgID0+IFwlRGF0YSwKICAgICAgICAgICAgVG90YWwgPT4gJFRvdGFsLAogICAgICAgIH07CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdBUlJBWScgKSB7CgogICAgICAgIG15IEBEYXRhID0gbWFwIHsgJF8tPntUaWNrZXRJRH0gfSBAeyRSZWNvcmRzfTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBEYXRhICA9PiBcQERhdGEsCiAgICAgICAgICAgIFRvdGFsID0+ICRUb3RhbCwKICAgICAgICB9OwogICAgfQogICAgZWxzaWYgKCAkUmVzdWx0VHlwZSBlcSAnRlVMTCcgKSB7CgogICAgICAgICMgYWdlIGhhcyB0byBiZSBjYWx1bGF0ZWQKICAgICAgICBteSAkTm93ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScKICAgICAgICApLT5Ub0Vwb2NoKCk7CgogICAgICAgIGZvciBteSAkRGF0YSAoIEB7JFJlY29yZHN9ICkgewogICAgICAgICAgICAkRGF0YS0+e0FnZX0gPSAkTm93IC0gJERhdGEtPntDcmVhdGVkfTsKICAgICAgICB9CgogICAgICAgIG15IEBEYXRhID0gbWFwIHsKICAgICAgICAgICAgeyAkXy0+e1RpY2tldElEfSA9PiAkXyB9CiAgICAgICAgfSBAeyRSZWNvcmRzfTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgRGF0YSAgPT4gXEBEYXRhLAogICAgICAgICAgICBUb3RhbCA9PiAkVG90YWwsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2lmICggJFJlc3VsdFR5cGUgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgcmV0dXJuICRUb3RhbDsKICAgIH0KCn0KCnN1YiBDdXN0b21lckNvbXBhbnlTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRDb25maWdPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUmVzdWx0VHlwZSAgICAgPSAkUGFyYW17UmVzdWx0fSAgfHwgJ0FSUkFZJzsKICAgIG15ICRMaW1pdCAgICAgICAgICA9ICRQYXJhbXtMaW1pdH0gICB8fCAxMDAwMDsKICAgIG15ICRGcm9tICAgICAgICAgICA9ICRQYXJhbXtGcm9tfSAgICB8fCAwOwogICAgbXkgJFNvcnRCeSAgICAgICAgID0gJFBhcmFte1NvcnRCeX0gIHx8ICdDdXN0b21lcklEJzsKICAgIG15ICRPcmRlckJ5ICAgICAgICA9ICRQYXJhbXtPcmRlckJ5fSB8fCAnYXNjJzsKICAgIG15ICRFeHRlbmRlZFNlYXJjaCA9ICRQYXJhbXtFeHRlbmRlZFNlYXJjaH0gLy8gMTsKCiAgICBpZiAoICRPcmRlckJ5IGVxICdVcCcgKSB7CiAgICAgICAgJE9yZGVyQnkgPSAnYXNjJzsKICAgIH0KICAgIGVsc2lmICggJE9yZGVyQnkgZXEgJ0Rvd24nICkgewogICAgICAgICRPcmRlckJ5ID0gJ2Rlc2MnOwogICAgfQoKICAgIG15ICRGdWxsdGV4dEZpZWxkcyA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6Q3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzJyk7CgogICAgJFBhcmFte0Z1bGx0ZXh0fSA9ICRTZWxmLT5fQXVnbWVudEN1c3RvbWVyQ29tcGFueVNlYXJjaFF1ZXJ5U3RyaW5nKAogICAgICAgIFF1ZXJ5ICAgICAgICAgID0+ICRQYXJhbXtGdWxsdGV4dH0sCiAgICAgICAgU2VhcmNoRmllbGRzICAgPT4gJEZ1bGx0ZXh0RmllbGRzLAogICAgICAgIEV4dGVuZGVkU2VhcmNoID0+ICRFeHRlbmRlZFNlYXJjaCwKICAgICk7CgogICAgbXkgKCBATXVzdHMsIEBGaWx0ZXJzICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgcHVzaCBATXVzdHMsIHsKICAgICAgICAgICAgcXVlcnlfc3RyaW5nID0+IHsKICAgICAgICAgICAgICAgIGZpZWxkcyA9PiAkRnVsbHRleHRGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gJFBhcmFte0Z1bGx0ZXh0fSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgdGhlIHJldHVybiB1c3VhbGx5IHdpbGwgYmUgQ3VzdG9tZXJJRCwgYnV0IGl0IGNhbiBiZSBkaWZmZXJlbnQgZm9yIGN1c3RvbSBiYWNrZW5kcwogICAgbXkgJFJldHVybiA9ICdDdXN0b21lckNvbXBhbnlLZXknOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1NlYXJjaCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICdjdXN0b21lcicsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICAgICAgRnJvbSAgICAgID0+ICRGcm9tLAogICAgICAgICAgICBTb3J0ICAgICAgPT4gWwogICAgICAgICAgICAgICAgeyAkU29ydEJ5ID0+ICRPcmRlckJ5IH0KICAgICAgICAgICAgXQogICAgICAgIH0KICAgICk7CgogICAgbXkgJFRvdGFsICAgPSAkUmVzdWx0LT57RGF0YX0tPntUb3RhbH07CiAgICBteSAkUmVjb3JkcyA9ICRSZXN1bHQtPntEYXRhfS0+e1JlY29yZHN9OwoKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0FSUkFZJyApIHsKCiAgICAgICAgbXkgQERhdGEgPSBtYXAgeyAkXy0+e0N1c3RvbWVyQ29tcGFueUtleX0gfSBAeyRSZWNvcmRzfTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBEYXRhICA9PiBcQERhdGEsCiAgICAgICAgICAgIFRvdGFsID0+ICRUb3RhbCwKICAgICAgICB9OwogICAgfQogICAgZWxzaWYgKCAkUmVzdWx0VHlwZSBlcSAnQ09VTlQnICkgewogICAgICAgIHJldHVybiAkVG90YWw7CiAgICB9Cgp9CgpzdWIgQ3VzdG9tZXJVc2VyU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFJlc3VsdFR5cGUgICAgID0gJFBhcmFte1Jlc3VsdH0gIHx8ICdBUlJBWSc7CiAgICBteSAkTGltaXQgICAgICAgICAgPSAkUGFyYW17TGltaXR9ICAgfHwgMTAwMDA7CiAgICBteSAkRnJvbSAgICAgICAgICAgPSAkUGFyYW17RnJvbX0gICAgfHwgMDsKICAgIG15ICRTb3J0QnkgICAgICAgICA9ICRQYXJhbXtTb3J0Qnl9ICB8fCAnVXNlckxvZ2luJzsKICAgIG15ICRPcmRlckJ5ICAgICAgICA9ICRQYXJhbXtPcmRlckJ5fSB8fCAnYXNjJzsKICAgIG15ICRFeHRlbmRlZFNlYXJjaCA9ICRQYXJhbXtFeHRlbmRlZFNlYXJjaH0gLy8gMTsKCiAgICBpZiAoICRPcmRlckJ5IGVxICdVcCcgKSB7CiAgICAgICAgJE9yZGVyQnkgPSAnYXNjJzsKICAgIH0KICAgIGVsc2lmICggJE9yZGVyQnkgZXEgJ0Rvd24nICkgewogICAgICAgICRPcmRlckJ5ID0gJ2Rlc2MnOwogICAgfQoKICAgIG15ICRGdWxsdGV4dEZpZWxkcyA9ICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzJyk7CgogICAgJFBhcmFte0Z1bGx0ZXh0fSA9ICRTZWxmLT5fQXVnbWVudEN1c3RvbWVyVXNlclNlYXJjaFF1ZXJ5U3RyaW5nKAogICAgICAgIFF1ZXJ5ICAgICAgICAgID0+ICRQYXJhbXtGdWxsdGV4dH0sCiAgICAgICAgU2VhcmNoRmllbGRzICAgPT4gJEZ1bGx0ZXh0RmllbGRzLAogICAgICAgIEV4dGVuZGVkU2VhcmNoID0+ICRFeHRlbmRlZFNlYXJjaCwKICAgICk7CgogICAgbXkgKCBATXVzdHMsIEBGaWx0ZXJzICk7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgcHVzaCBATXVzdHMsIHsKICAgICAgICAgICAgcXVlcnlfc3RyaW5nID0+IHsKICAgICAgICAgICAgICAgIGZpZWxkcyA9PiAkRnVsbHRleHRGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gJFBhcmFte0Z1bGx0ZXh0fSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgdGhlIHJldHVybiB1c3VhbGx5IHdpbGwgYmUgVXNlckxvZ2luLCBidXQgaXQgY2FuIGJlIGRpZmZlcmVudCBmb3IgY3VzdG9tIGJhY2tlbmRzCiAgICBteSAkUmV0dXJuID0gKCAkUmVzdWx0VHlwZSBlcSAnSEFTSCcgKSA/IFtxdyhDdXN0b21lcktleSBVc2VyRnVsbG5hbWUpXSA6ICdDdXN0b21lcktleSc7CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnU2VhcmNoJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJ2N1c3RvbWVydXNlcicsCiAgICAgICAgICAgIE11c3QgICAgICA9PiBcQE11c3RzLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gXEBGaWx0ZXJzLAogICAgICAgICAgICBMaW1pdCAgICAgPT4gJExpbWl0LAogICAgICAgICAgICBSZXR1cm4gICAgPT4gJFJldHVybiwKICAgICAgICAgICAgRnJvbSAgICAgID0+ICRGcm9tLAogICAgICAgICAgICBTb3J0ICAgICAgPT4gWwogICAgICAgICAgICAgICAgeyAkU29ydEJ5ID0+ICRPcmRlckJ5IH0KICAgICAgICAgICAgXQogICAgICAgIH0KICAgICk7CgogICAgbXkgJFRvdGFsICAgPSAkUmVzdWx0LT57RGF0YX0tPntUb3RhbH07CiAgICBteSAkUmVjb3JkcyA9ICRSZXN1bHQtPntEYXRhfS0+e1JlY29yZHN9OwoKICAgIGlmICggJFJlc3VsdFR5cGUgZXEgJ0hBU0gnICkgewoKICAgICAgICBteSAlRGF0YSA9ICgKICAgICAgICAgICAgbWFwIHsKICAgICAgICAgICAgICAgIHsgJF8tPntDdXN0b21lcktleX0gPT4gJF8tPntVc2VyRnVsbG5hbWV9IH0KICAgICAgICAgICAgfSBAeyRSZWNvcmRzfQogICAgICAgICk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIERhdGEgID0+IFwlRGF0YSwKICAgICAgICAgICAgVG90YWwgPT4gJFRvdGFsLAogICAgICAgIH07CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdBUlJBWScgKSB7CgogICAgICAgIG15IEBEYXRhID0gKCBtYXAgeyAkXy0+e0N1c3RvbWVyS2V5fSB9IEB7JFJlY29yZHN9ICk7CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIERhdGEgID0+IFxARGF0YSwKICAgICAgICAgICAgVG90YWwgPT4gJFRvdGFsLAogICAgICAgIH07CiAgICB9CiAgICBlbHNpZiAoICRSZXN1bHRUeXBlIGVxICdDT1VOVCcgKSB7CiAgICAgICAgcmV0dXJuICRUb3RhbDsKICAgIH0KCn0KCj1oZWFkMiBDb25maWdJdGVtU2VhcmNoKCkKClBlcmZvcm1zIGEgY29uZmlnIGl0ZW0gc2VhcmNoIHZpYSBFbGFzdGljc2VhcmNoLgoKICAgICRFU09iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBGdWxsdGV4dCA9PiAkU3RyaW5nLAogICAgICAgIExpbWl0ICAgID0+IDIwLCAgICAgIyBvcHRpb25hbAogICAgICAgIFJlc3VsdCAgID0+IEFSUkFZLCAgIyBvcHRpb25hbCwgQVJSQVkgKGRlZmF1bHQpIHwgRlVMTAoKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJENvbmZpZ09iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRSZXN1bHRUeXBlICAgICA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CiAgICBteSAkTGltaXQgICAgICAgICAgPSAkUGFyYW17TGltaXR9ICB8fCAxMDAwMDsKICAgIG15ICRGcm9tICAgICAgICAgICA9ICRQYXJhbXtGcm9tfSAgIHx8IDA7CiAgICBteSAkRXh0ZW5kZWRTZWFyY2ggPSAkUGFyYW17RXh0ZW5kZWRTZWFyY2h9IC8vIDE7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkIChxdy9Vc2VySUQgRnVsbHRleHQvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyk7CgogICAgJFBhcmFte0Z1bGx0ZXh0fSA9ICRTZWxmLT5fQXVnbWVudENvbmZpZ0l0ZW1TZWFyY2hRdWVyeVN0cmluZygKICAgICAgICBRdWVyeSAgICAgICAgICA9PiAkUGFyYW17RnVsbHRleHR9LAogICAgICAgIFNlYXJjaEZpZWxkcyAgID0+ICRGdWxsdGV4dEZpZWxkcywKICAgICAgICBFeHRlbmRlZFNlYXJjaCA9PiAkRXh0ZW5kZWRTZWFyY2gsCiAgICApOwoKICAgIG15ICggQE11c3RzLCBARmlsdGVycyApOwoKICAgICMgZ2V0IGdlbmVyYWwgY2F0YWxvZyBvYmplY3QKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgIG15ICRDbGFzc0xpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBpdGVtIG9iamVjdAogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKTsKCiAgICAjIGNoZWNrIGZvciBhY2Nlc3MgcmlnaHRzIG9uIHRoZSBjbGFzc2VzCiAgICBmb3IgbXkgJENsYXNzSUQgKCBzb3J0IGtleXMgJXskQ2xhc3NMaXN0fSApIHsKICAgICAgICBteSAkSGFzQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgU2NvcGUgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBDbGFzc0lEID0+ICRDbGFzc0lELAogICAgICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGRlbGV0ZSAkQ2xhc3NMaXN0LT57JENsYXNzSUR9IGlmICEkSGFzQWNjZXNzOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAjIHNldCB1cCBjbGFzcyBmaWx0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWNjZXNzIHJpZ2h0cwojICAgIHB1c2ggQEZpbHRlcnMsIHsKIyAgICAgICAgYm9vbCA9PiB7CiMgICAgICAgICAgICBmaWx0ZXIgPT4gWwojICAgICAgICAgICAgICAgIHsKIyAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewojICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRCA9PiBbIGtleXMgJXskQ2xhc3NMaXN0fSBdLAojICAgICAgICAgICAgICAgICAgICB9LAojICAgICAgICAgICAgICAgIH0sCiMgICAgICAgICAgICBdLAojICAgICAgICB9LAojICAgIH07CiMKICAgIG15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwogICAgbXkgJUdyb3VwTGlzdDsKICAgIG15ICVBdXRoR3JvdXBzTGlzdCA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvblVzZXJHcm91cEdldCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgVHlwZSAgID0+ICJybyIsCiAgICApOwogICAgbXkgJE1hbmFnZW1lbnRHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgiSVRTTUNvbmZpZ0l0ZW1NYW5hZ2VtZW50R3JvdXAiKTsKICAgIGlmICggJE1hbmFnZW1lbnRHcm91cCAmJiBncmVwIHsgJF8gZXEgJE1hbmFnZW1lbnRHcm91cCB9IHZhbHVlcyAlQXV0aEdyb3Vwc0xpc3QgKSB7CiAgICAgICAgJUdyb3VwTGlzdCA9ICRHcm91cE9iamVjdC0+R3JvdXBMaXN0KAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAlR3JvdXBMaXN0ID0gJUF1dGhHcm91cHNMaXN0OwogICAgfQoKICAgICMgc2V0IHVwIGNsYXNzIGFuZCBncm91cCBmaWx0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWNjZXNzIHJpZ2h0cwogICAgIyBjbGFzc2VzIHdpdGggbm8gZ3JvdXAgcmVzdHJpY3Rpb25zIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgdGhlIGdyb3VwIGZpbHRlcmluZwogICAgIyBmb3IgdGhlc2UgY2xhc3NlcyB0aGUgc2VhcmNoIGluY2x1ZGVzIGl0ZW1zIHdob3NlIEdyb3VwSUQgaXMgbnVsbAogICAgcHVzaCBARmlsdGVycywgewogICAgICAgIGJvb2w9PiB7CiAgICAgICAgICAgIGZpbHRlciA9PiBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgdGVybXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+IFsga2V5cyAleyRDbGFzc0xpc3R9IF0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkID0+IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gWyBrZXlzICVHcm91cExpc3QgXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c3Rfbm90ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0cyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgPT4gJ0dyb3VwSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgICAgICBtaW5pbXVtX3Nob3VsZF9tYXRjaCA9PiAxLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgXQogICAgICAgIH0KICAgIH07CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyk7CiAgICAgICAgbXkgQFNlYXJjaEZpZWxkcyAgID0gKAogICAgICAgICAgICBAeyAkRnVsbHRleHRGaWVsZHMtPntCYXNpY30gLy8gW10gfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0F0dGFjaG1lbnRzfSApIHsKICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAoICdBdHRhY2htZW50cy5Db250ZW50JywgJ0F0dGFjaG1lbnRzLkZpbGVuYW1lJyApOwogICAgICAgIH0KCiAgICAgICAgIyBoYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CgogICAgICAgICAgICBEWU5BTUlDRklFTEQ6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoIEB7ICRGdWxsdGV4dEZpZWxkcy0+e0R5bmFtaWNGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGQgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5EeW5hbWljRmllbGRHZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCB1bmxlc3MgSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZCk7CgogICAgICAgICAgICAgICAgIyBhZGQgYWxsIGNvbmZpZyBpdGVtIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnSVRTTUNvbmZpZ0l0ZW0nICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgIkR5bmFtaWNGaWVsZF8kRHluYW1pY0ZpZWxkTmFtZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQE11c3RzLCB7CiAgICAgICAgICAgIHF1ZXJ5X3N0cmluZyA9PiB7CiAgICAgICAgICAgICAgICBmaWVsZHMgPT4gXEBTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgICAgICBxdWVyeSAgPT4gJFBhcmFte0Z1bGx0ZXh0fSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgZGVmaW5lIHRoZSByZXR1cm4gdHlwZQogICAgbXkgJFJldHVybiA9ICggJFJlc3VsdFR5cGUgZXEgJ0ZVTEwnICkgPyAnJyA6ICdDb25maWdJdGVtSUQnOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1NlYXJjaCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICdjb25maWdpdGVtJywKICAgICAgICAgICAgTXVzdCAgICAgID0+IFxATXVzdHMsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiBcQEZpbHRlcnMsCiAgICAgICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJldHVybiAgICA9PiAkUmV0dXJuLAogICAgICAgICAgICBGcm9tICAgICAgPT4gJEZyb20sCiAgICAgICAgfQogICAgKTsKCiAgICBteSAkVG90YWwgICA9ICRSZXN1bHQtPntEYXRhfS0+e1RvdGFsfTsKICAgIG15ICRSZWNvcmRzID0gJFJlc3VsdC0+e0RhdGF9LT57UmVjb3Jkc307CgogICAgaWYgKCAkUmVzdWx0VHlwZSBlcSAnRlVMTCcgKSB7CgogICAgICAgIG15IEBEYXRhID0gKAogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgeyAkXy0+e0NvbmZpZ0l0ZW1JRH0gPT4gJF8gfQogICAgICAgICAgICB9IEB7JFJlY29yZHN9CiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgRGF0YSAgPT4gXEBEYXRhLAogICAgICAgICAgICBUb3RhbCA9PiAkVG90YWwsCiAgICAgICAgfTsKCiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgbXkgQERhdGEgPSAoIG1hcCB7ICRfLT57Q29uZmlnSXRlbUlEfSB9IEB7JFJlY29yZHN9ICk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgRGF0YSAgPT4gXEBEYXRhLAogICAgICAgICAgICBUb3RhbCA9PiAkVG90YWwsCiAgICAgICAgfTsKICAgIH0KCn0KCj1oZWFkMiBUaWNrZXRDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgdGlja2V0IGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIGV2ZW50IGJhc2VkIGluIGEgcHJvZHVjdGl2ZSBzeXN0ZW0uCkUuZy4gd2hlbiBhIFRpY2tldCBpcyByZXN0b3JlZCBmcm9tIHRoZSBhcmNoaXZlIG9yIHdoZW4gd2hlbiBhIHRpY2tldCBpcyBtb3ZlZCBmcm9tIGFuIGV4Y2x1ZGVkIHF1ZXVlLgoKICAgICRFU09iamVjdC0+VGlja2V0Q3JlYXRlKAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICk7Cgo9Y3V0CgpzdWIgVGlja2V0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVGlja2V0TWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgPT4gJ1RpY2tldENyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEFydGljbGVDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGFuIGFydGljbGUgaW4gdGhlIEVsYXN0aWNzZWFyY2ggZGF0YWJhc2UuIEhhcHBlbnMgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkFydGljbGVDcmVhdGUoCiAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICk7Cgo9Y3V0CgpzdWIgQXJ0aWNsZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1RpY2tldE1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICA9PiAnQXJ0aWNsZUNyZWF0ZScsCiAgICAgICAgICAgIFRpY2tldElEICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgpFeHBsaWNpdGx5IGNyZWF0ZXMgYSBjdXN0b21lciBjb21wYW55IGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIGV2ZW50IGJhc2VkIGluIGEgcHJvZHVjdGl2ZSBzeXN0ZW0uCgogICAgJEVTT2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgIG15ICVDdXN0b21lckNvbXBhbnkgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJJRH0sCiAgICApOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueU1hbmFnZW1lbnQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEV2ZW50ICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUFkZCcsCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlQ3VzdG9tZXJDb21wYW55LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKCn0KCj1oZWFkMiBDdXN0b21lclVzZXJBZGQoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgY3VzdG9tZXIgY29tcGFueSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBldmVudCBiYXNlZCBpbiBhIHByb2R1Y3RpdmUgc3lzdGVtLgoKICAgICRFU09iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgIFVzZXJMb2dpbiA9PiAkVXNlckxvZ2luLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJUN1c3RvbWVyVXNlciAgICAgICA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICk7CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnQ3VzdG9tZXJVc2VyTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICA9PiAnQ3VzdG9tZXJVc2VyQWRkJywKICAgICAgICAgICAgTmV3RGF0YSA9PiBcJUN1c3RvbWVyVXNlciwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cgp9Cgo9aGVhZDIgQ29uZmlnSXRlbUNyZWF0ZSgpCgpFeHBsaWNpdGx5IGNyZWF0ZXMgYSBjb25maWcgaXRlbSBpbiB0aGUgRWxhc3RpY3NlYXJjaCBkYXRhYmFzZS4gSGFwcGVucyBtb3N0bHkgZXZlbnQgYmFzZWQgaW4gYSBwcm9kdWN0aXZlIHN5c3RlbS4KCiAgICAkRVNPYmplY3QtPkNvbmZpZ0l0ZW1DcmVhdGUoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1DcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvQ29uZmlnSXRlbUlELykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgdGhlIGNvbmZpZyBpdGVtCiAgICBteSAkUmVzdWx0ID0gJFJlcXVlc3Rlck9iamVjdC0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdDb25maWdJdGVtTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdDb25maWdJdGVtQ3JlYXRlJywKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIH0KICAgICk7CiAgICByZXR1cm4gaWYgISRSZXN1bHQtPntTdWNjZXNzfTsKCiAgICAjIHVwZGF0ZSB0aGUgYXR0YWNobWVudHMKICAgIGlmICgKICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkNvbmZpZ0l0ZW1TZWFyY2hGaWVsZHMnKQogICAgICAgICYmCiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU2VhcmNoRmllbGRzJyktPnsnQXR0YWNobWVudHMnfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50TmFtZSAoQEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgIG15ICRBdHRhY2htZW50ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRBdHRhY2htZW50TmFtZSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgSW52b2tlciAgICAgID0+ICdDb25maWdJdGVtTWFuYWdlbWVudCcsCiAgICAgICAgICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICAgICAgRXZlbnQgICAgICAgID0+ICdBdHRhY2htZW50QWRkUG9zdCcsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKCn0KCj1oZWFkMiBGQVFDcmVhdGUoKQoKRXhwbGljaXRseSBjcmVhdGVzIGEgRkFRIGluIHRoZSBFbGFzdGljc2VhcmNoIGRhdGFiYXNlLiBIYXBwZW5zIG1vc3RseSBldmVudCBiYXNlZCBpbiBhIHByb2R1Y3RpdmUgc3lzdGVtLgoKICAgICRFU09iamVjdC0+RkFRQ3JlYXRlKAogICAgICAgIEl0ZW1JRCA9PiAkRkFRSXRlbUlELAogICAgKTsKCj1jdXQKCnN1YiBGQVFDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvSXRlbUlELykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRSZXF1ZXN0ZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpOwogICAgbXkgJENvbmZpZ09iamVjdCAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBjcmVhdGUgdGhlIEZBUQogICAgbXkgJFJlc3VsdCA9ICRSZXF1ZXN0ZXJPYmplY3QtPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnRkFRTWFuYWdlbWVudCcsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgRXZlbnQgID0+ICdGQVFDcmVhdGUnLAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiBpZiAhJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKICAgICMgdXBkYXRlIHRoZSBhdHRhY2htZW50cwogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6RkFRU2VhcmNoRmllbGRzJykKICAgICAgICAmJgogICAgICAgICRDb25maWdPYmplY3QtPkdldCgnRWxhc3RpY3NlYXJjaDo6RkFRU2VhcmNoRmllbGRzJyktPnsnQXR0YWNobWVudHMnfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkRkFRT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkZBUScpOwoKICAgICAgICBteSBAQXR0YWNobWVudEluZGV4ID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEluZGV4KAogICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfQogICAgICAgICk7CgogICAgICAgIGZvciBteSAkQXR0YWNobWVudEVudHJ5IChAQXR0YWNobWVudEluZGV4KSB7CiAgICAgICAgICAgIG15ICVBdHRhY2htZW50ID0gJEZBUU9iamVjdC0+QXR0YWNobWVudEdldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEZpbGVJRCA9PiAkQXR0YWNobWVudEVudHJ5LT57RmlsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXN1bHQgPSAkUmVxdWVzdGVyT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgICAgICAgICAgSW52b2tlciAgICAgID0+ICdGQVFNYW5hZ2VtZW50JywKICAgICAgICAgICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAlQXR0YWNobWVudCwKICAgICAgICAgICAgICAgICAgICBFdmVudCAgPT4gJ0ZBUUF0dGFjaG1lbnRBZGRQb3N0JywKICAgICAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwoKfQoKPWhlYWQyIEZBUVNlYXJjaCgpCgpQZXJmb3JtcyBhIEZBUSBzZWFyY2ggdmlhIEVsYXN0aWNzZWFyY2guCgogICAgJEVTT2JqZWN0LT5GQVFTZWFyY2goCiAgICAgICAgRnVsbHRleHQgPT4gJFN0cmluZywKICAgICAgICBMaW1pdCAgICA9PiAyMCwgICAgICMgb3B0aW9uYWwKICAgICAgICBSZXN1bHQgICA9PiBBUlJBWSwgICMgb3B0aW9uYWwsIEFSUkFZIChkZWZhdWx0KSB8IEZVTEwKCiAgICApOwoKPWN1dAoKc3ViIEZBUVNlYXJjaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUmVzdWx0VHlwZSAgID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKICAgIG15ICRMaW1pdCAgICAgICAgPSAkUGFyYW17TGltaXR9ICB8fCAxMDAwMDsKCiAgICBteSAkRnJvbSAgICAgICAgICAgPSAkUGFyYW17RnJvbX0gICAgfHwgMDsKICAgIG15ICRTb3J0QnkgICAgICAgICA9ICRQYXJhbXtTb3J0Qnl9ICB8fCAnVGl0bGUnOwogICAgbXkgJE9yZGVyQnkgICAgICAgID0gJFBhcmFte09yZGVyQnl9IHx8ICdhc2MnOwogICAgbXkgJEV4dGVuZGVkU2VhcmNoID0gJFBhcmFte0V4dGVuZGVkU2VhcmNofSAvLyAxOwoKICAgIGlmICggJE9yZGVyQnkgZXEgJ1VwJyApIHsKICAgICAgICAkT3JkZXJCeSA9ICdhc2MnOwogICAgfQogICAgZWxzaWYgKCAkT3JkZXJCeSBlcSAnRG93bicgKSB7CiAgICAgICAgJE9yZGVyQnkgPSAnZGVzYyc7CiAgICB9CgogICAgbXkgJEZ1bGx0ZXh0RmllbGRzID0gJENvbmZpZ09iamVjdC0+R2V0KCdFbGFzdGljc2VhcmNoOjpGQVFTZWFyY2hGaWVsZHMnKSAvLyB7fTsKCiAgICAkUGFyYW17RnVsbHRleHR9ID0gJFNlbGYtPl9BdWdtZW50RkFRU2VhcmNoUXVlcnlTdHJpbmcoCiAgICAgICAgUXVlcnkgICAgICAgICAgPT4gJFBhcmFte0Z1bGx0ZXh0fSwKICAgICAgICBTZWFyY2hGaWVsZHMgICA9PiAkRnVsbHRleHRGaWVsZHMsCiAgICAgICAgRXh0ZW5kZWRTZWFyY2ggPT4gJEV4dGVuZGVkU2VhcmNoLAogICAgKTsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcwogICAgZm9yIG15ICROZWVkZWQgKHF3L1VzZXJJRCBGdWxsdGV4dC8pIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCB1cCBjYXRlZ29yeSBmaWx0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgYWNjZXNzIHJpZ2h0cwogICAgbXkgJEZBUU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpGQVEnKTsKCiAgICBteSAkQ2F0ZWdvcnlHcm91cEhhc2hSZWY7CiAgICBpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckdyb3VwU3VwcG9ydCcpICkgewogICAgICAgICAgICAkQ2F0ZWdvcnlHcm91cEhhc2hSZWYgPSAkRkFRT2JqZWN0LT5HZXRDdXN0b21lckNhdGVnb3JpZXMoCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRDYXRlZ29yeUdyb3VwSGFzaFJlZiA9ICRGQVFPYmplY3QtPkNhdGVnb3J5TGlzdCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfQogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgICRDYXRlZ29yeUdyb3VwSGFzaFJlZiA9ICRGQVFPYmplY3QtPkdldFVzZXJDYXRlZ29yaWVzKAogICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBGb3IgbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjb2RlIGJlbG93LCBwbGVhc2Ugc2VlIEN1c3RvbWVyRkFRU2VhcmNoOjUwMCBmZgogICAgbXkgJUFsbG93ZWRDYXRlZ29yeUlEcyA9ICgpOwogICAgaWYgKCAkQ2F0ZWdvcnlHcm91cEhhc2hSZWYgJiYgcmVmICRDYXRlZ29yeUdyb3VwSGFzaFJlZiBlcSAnSEFTSCcgKSB7CiAgICAgICAgZm9yIG15ICRMZXZlbCAoIHNvcnQga2V5cyAleyRDYXRlZ29yeUdyb3VwSGFzaFJlZn0gKSB7CiAgICAgICAgICAgIGlmICggJENhdGVnb3J5R3JvdXBIYXNoUmVmLT57JExldmVsfSAmJiByZWYgJENhdGVnb3J5R3JvdXBIYXNoUmVmLT57JExldmVsfSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICBteSAlVGVtcElEcyA9IG1hcCB7ICRfID0+IDEgfSBrZXlzICV7ICRDYXRlZ29yeUdyb3VwSGFzaFJlZi0+eyRMZXZlbH0gfTsKICAgICAgICAgICAgICAgICVBbGxvd2VkQ2F0ZWdvcnlJRHMgPSAoCiAgICAgICAgICAgICAgICAgICAgJUFsbG93ZWRDYXRlZ29yeUlEcywKICAgICAgICAgICAgICAgICAgICAlVGVtcElEcwogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG15IEBDYXRlZ29yeUlEcyA9ICgpOwogICAgaWYgKCVBbGxvd2VkQ2F0ZWdvcnlJRHMpIHsKICAgICAgICBAQ2F0ZWdvcnlJRHMgPSBrZXlzICVBbGxvd2VkQ2F0ZWdvcnlJRHM7CiAgICB9CgogICAgbXkgKCBATXVzdHMsIEBGaWx0ZXJzICk7CgogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICBteSAkSW50ZXJmYWNlU3RhdGVzID0gJEZBUU9iamVjdC0+U3RhdGVUeXBlTGlzdCgKICAgICAgICAgICAgVHlwZXMgID0+ICRDb25maWdPYmplY3QtPkdldCgnRkFROjpDdXN0b21lcjo6U3RhdGVUeXBlcycpLAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICBwdXNoIEBGaWx0ZXJzLCB7CiAgICAgICAgICAgIGJvb2wgPT4gewogICAgICAgICAgICAgICAgZmlsdGVyID0+IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlcm1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhdGVnb3J5SUQgPT4gXEBDYXRlZ29yeUlEcywKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZVR5cGVJRCA9PiBbIGtleXMgJEludGVyZmFjZVN0YXRlcy0+JSogXSwKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcHVzaCBARmlsdGVycywgewogICAgICAgICAgICBib29sID0+IHsKICAgICAgICAgICAgICAgIGZpbHRlciA9PiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0ZXJtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+IFxAQ2F0ZWdvcnlJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0Z1bGx0ZXh0fSApIHsKCiAgICAgICAgbXkgQFNlYXJjaEZpZWxkczsKICAgICAgICBpZiAoICRQYXJhbXtVc2VyTG9naW59ICkgewogICAgICAgICAgICBteSBAQ2FuZGlkYXRlRmllbGRzID0gQHsgJEZ1bGx0ZXh0RmllbGRzLT57QmFzaWN9IC8vIFtdIH07CiAgICAgICAgICAgIGZvciBteSAkRmllbGQgKEBDYW5kaWRhdGVGaWVsZHMpIHsKICAgICAgICAgICAgICAgIGlmICggJEZpZWxkID1+IC8oRmllbGRcZCkvICkgewogICAgICAgICAgICAgICAgICAgIG15ICRGaWVsZFN0YXRlID0gJENvbmZpZ09iamVjdC0+R2V0KCAnRkFROjpJdGVtOjonIC4gJDEgKS0+e1Nob3d9OwogICAgICAgICAgICAgICAgICAgIGlmICggJEZpZWxkU3RhdGUgPX4gL15wdWJsaWN8ZXh0ZXJuYWwkLyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAkRmllbGQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAU2VhcmNoRmllbGRzLCAkRmllbGQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEBTZWFyY2hGaWVsZHMgPSAoCiAgICAgICAgICAgICAgICBAeyAkRnVsbHRleHRGaWVsZHMtPntCYXNpY30gLy8gW10gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJEZ1bGx0ZXh0RmllbGRzLT57QXR0YWNobWVudHN9ICkgewogICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICggJ0F0dGFjaG1lbnRzLkNvbnRlbnQnLCAnQXR0YWNobWVudHMuRmlsZW5hbWUnICk7CiAgICAgICAgfQoKICAgICAgICAjIGhhbmRsZSBkeW5hbWljIGZpZWxkcwogICAgICAgIGlmICggJEZ1bGx0ZXh0RmllbGRzLT57RHluYW1pY0ZpZWxkfSApIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICAgICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lICggQHsgJEZ1bGx0ZXh0RmllbGRzLT57RHluYW1pY0ZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICREeW5hbWljRmllbGROYW1lLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkKTsKCiAgICAgICAgICAgICAgICAjIGFkZCBhbGwgZmFxIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgICAgICBpZiAoICREeW5hbWljRmllbGQtPntPYmplY3RUeXBlfSBlcSAnRkFRJyApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBTZWFyY2hGaWVsZHMsICJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZE5hbWUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBwdXNoIEBNdXN0cywgewogICAgICAgICAgICBxdWVyeV9zdHJpbmcgPT4gewogICAgICAgICAgICAgICAgZmllbGRzID0+IFxAU2VhcmNoRmllbGRzLAogICAgICAgICAgICAgICAgcXVlcnkgID0+ICRQYXJhbXtGdWxsdGV4dH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGRlZmluZSB0aGUgcmV0dXJuIHR5cGUKICAgIG15ICRSZXR1cm4gPSAoICRSZXN1bHRUeXBlIGVxICdGVUxMJyApID8gJycgOiAnRkFRSXRlbUlEJzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdTZWFyY2gnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAnZmFxJywKICAgICAgICAgICAgTXVzdCAgICAgID0+IFxATXVzdHMsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiBcQEZpbHRlcnMsCiAgICAgICAgICAgIExpbWl0ICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgIFJldHVybiAgICA9PiAkUmV0dXJuLAogICAgICAgICAgICBGcm9tICAgICAgPT4gJEZyb20sCiAgICAgICAgfQogICAgKTsKCiAgICBteSAkVG90YWwgICA9ICRSZXN1bHQtPntEYXRhfS0+e1RvdGFsfTsKICAgIG15ICRSZWNvcmRzID0gJFJlc3VsdC0+e0RhdGF9LT57UmVjb3Jkc307CgogICAgaWYgKCAkUmVzdWx0VHlwZSBlcSAnRlVMTCcgKSB7CgogICAgICAgIG15IEBEYXRhID0gKAogICAgICAgICAgICBtYXAgewogICAgICAgICAgICAgICAgeyAkXy0+e0l0ZW1JRH0gPT4gJF8gfQogICAgICAgICAgICB9IEB7JFJlY29yZHN9CiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgRGF0YSAgPT4gXEBEYXRhLAogICAgICAgICAgICBUb3RhbCA9PiAkVG90YWwsCiAgICAgICAgfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBARGF0YSA9ICggbWFwIHsgJF8tPntJdGVtSUR9IH0gQHskUmVjb3Jkc30gKTsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgRGF0YSAgPT4gXEBEYXRhLAogICAgICAgICAgICBUb3RhbCA9PiAkVG90YWwsCiAgICAgICAgfTsKICAgIH0KfQoKPWhlYWQyIFRlc3RDb25uZWN0aW9uKCkKClRlc3QgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEVsYXN0aWNzZWFyY2ggc2VydmVyLgoKICAgIG15ICRTdWNjZXNzID0gJEVTT2JqZWN0LT5UZXN0Q29ubmVjdGlvbigpOwoKPWN1dAoKc3ViIFRlc3RDb25uZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUR1bW15SW5kZXggPSAoCiAgICAgICAgaW5kZXggPT4gJycsCiAgICApOwogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVXRpbHNfR0VUJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gXCVEdW1teUluZGV4LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKfQoKPWhlYWQyIENyZWF0ZUluZGV4KCkKCkNyZWF0ZSBhIG5ldyBpbmRleC4KCiAgICBteSAkU3VjY2VzcyA9ICRFU09iamVjdC0+Q3JlYXRlSW5kZXgoCiAgICAgICAgSW5kZXhOYW1lID0+IHsKICAgICAgICAgICAgbmFtZSA9PiAnc29tZXRoaW5nJywKICAgICAgICB9LAogICAgICAgIFJlcXVlc3QgICA9PiB7CiAgICAgICAgICAgIHNldHRpbmdzID0+IHsgLi4uIH0sCiAgICAgICAgICAgIG1hcHBpbmdzID0+IHsgLi4uIH0sCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgQ3JlYXRlSW5kZXggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUmVzdWx0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpHZW5lcmljSW50ZXJmYWNlOjpSZXF1ZXN0ZXInKS0+UnVuKAogICAgICAgIFdlYnNlcnZpY2VJRCA9PiAkU2VsZi0+e1dlYnNlcnZpY2VJRH0sCiAgICAgICAgSW52b2tlciAgICAgID0+ICdVdGlsc19QVVQnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiAkUGFyYW17SW5kZXhOYW1lfSwKICAgICAgICAgICAgUmVxdWVzdCAgID0+ICRQYXJhbXtSZXF1ZXN0fSwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cn0KCj1oZWFkMiBEcm9wSW5kZXgoKQoKRHJvcCBhIGNvbXBsZXRlIGluZGV4LgoKICAgICRFU09iamVjdC0+RHJvcEluZGV4KAogICAgICAgIEluZGV4TmFtZSA9PiAnbmFtZScsCiAgICApOwoKPWN1dAoKc3ViIERyb3BJbmRleCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzX0RFTEVURScsCiAgICAgICAgQXN5bmNocm9ub3VzID0+IDAsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgSW5kZXhOYW1lID0+ICRQYXJhbXtJbmRleE5hbWV9LAogICAgICAgIH0KICAgICk7CgogICAgcmV0dXJuICRSZXN1bHQtPntTdWNjZXNzfTsKfQoKc3ViIERlbGV0ZVBpcGVsaW5lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFJlc3VsdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6R2VuZXJpY0ludGVyZmFjZTo6UmVxdWVzdGVyJyktPlJ1bigKICAgICAgICBXZWJzZXJ2aWNlSUQgPT4gJFNlbGYtPntXZWJzZXJ2aWNlSUR9LAogICAgICAgIEludm9rZXIgICAgICA9PiAnVXRpbHNQaXBlbGluZV9ERUxFVEUnLAogICAgICAgIEFzeW5jaHJvbm91cyA9PiAwLAogICAgICAgIERhdGEgICAgICAgICA9PiB7CiAgICAgICAgICAgIEluZGV4TmFtZSA9PiB7fSwKICAgICAgICB9CiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0LT57U3VjY2Vzc307Cn0KCnN1YiBDcmVhdGVQaXBlbGluZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRSZXN1bHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkdlbmVyaWNJbnRlcmZhY2U6OlJlcXVlc3RlcicpLT5SdW4oCiAgICAgICAgV2Vic2VydmljZUlEID0+ICRTZWxmLT57V2Vic2VydmljZUlEfSwKICAgICAgICBJbnZva2VyICAgICAgPT4gJ1V0aWxzUGlwZWxpbmVfUFVUJywKICAgICAgICBBc3luY2hyb25vdXMgPT4gMCwKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICBJbmRleE5hbWUgPT4gJycsCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiAkUGFyYW17UmVxdWVzdH0sCiAgICAgICAgfQogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdC0+e1N1Y2Nlc3N9OwoKfQoKPWhlYWQyIEluZGV4U2V0dGluZ3NHZXQoKQoKR2V0IHNldHRpbmdzIGZvciBhIGNlcnRhaW4gaW5kZXgKCiAgICBteSAkU2V0dGluZ3MgPSAkRVNPYmplY3QtPkluZGV4U2V0dGluZ3NHZXQoCiAgICAgICAgQ29uZmlnICAgPT4gJENvbmZpZywKICAgICAgICBUZW1wbGF0ZSA9PiAkVGVtcGxhdGUsCiAgICA7KQoKPWN1dAoKc3ViIEluZGV4U2V0dGluZ3NHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnID0gJFBhcmFte0NvbmZpZ307CgogICAgbXkgJFNldHRpbmdzID0gJFNlbGYtPl9FeHBhbmRUZW1wbGF0ZSgKICAgICAgICBJdGVtICAgICAgICAgPT4gJFBhcmFte1RlbXBsYXRlfSwKICAgICAgICBDb25maWcgICAgICAgPT4gJENvbmZpZywKICAgICAgICBMYXlvdXRPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpLAogICAgKTsKCiAgICByZXR1cm4gJFNldHRpbmdzOwp9CgpzdWIgX0V4cGFuZFRlbXBsYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZyA9ICRQYXJhbXtDb25maWd9OwogICAgbXkgJE5vZGUgICA9ICRQYXJhbXtJdGVtfTsKCiAgICBpZiAoIHJlZiAkTm9kZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUV4cGFuZGVkOwogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyggJXskTm9kZX0gKSApIHsKICAgICAgICAgICAgJEV4cGFuZGVkeyRLZXl9ID0gJFNlbGYtPl9FeHBhbmRUZW1wbGF0ZSgKICAgICAgICAgICAgICAgIEl0ZW0gICAgICAgICA9PiAkTm9kZS0+eyRLZXl9LAogICAgICAgICAgICAgICAgQ29uZmlnICAgICAgID0+ICRDb25maWcsCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFBhcmFte0xheW91dE9iamVjdH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gXCVFeHBhbmRlZDsKICAgIH0KICAgIGVsc2lmICggcmVmICROb2RlIGVxICdBUlJBWScgKSB7CiAgICAgICAgbXkgQEV4cGFuZGVkOwogICAgICAgIGZvciBteSAkSXRlbSAoIEB7JE5vZGV9ICkgewogICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgQEV4cGFuZGVkLAogICAgICAgICAgICAgICAgJFNlbGYtPl9FeHBhbmRUZW1wbGF0ZSgKICAgICAgICAgICAgICAgICAgICBJdGVtICAgICAgICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnICAgICAgID0+ICRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRQYXJhbXtMYXlvdXRPYmplY3R9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxARXhwYW5kZWQ7CiAgICB9CiAgICBlbHNpZiAoICFkZWZpbmVkKCROb2RlKSApIHsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBlbHNpZiAoIElzTnVtYmVyKCROb2RlKSApIHsKICAgICAgICByZXR1cm4gJE5vZGU7CiAgICB9CiAgICBlbHNpZiAoIElzU3RyaW5nKCROb2RlKSApIHsKICAgICAgICByZXR1cm4gJFBhcmFte0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJE5vZGUsCiAgICAgICAgICAgIERhdGEgICAgID0+ICRDb25maWcsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHJldHVybiAkTm9kZTsKICAgIH0KfQoKPWhlYWQyIEluaXRpYWxTZXR1cCgpCgpUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IEk8aW5zdGFsbGVyLnBsPiBhbmQgYnkgYWx0ZXJuYXRpdmUgaW5zdGFsbCBzY3JpcHRzIHRvIGdldCBhIHdvcmtpbmcKaW5pdGlhbCBzZXR1cC4KCiAgICBteSAoJFN1Y2Nlc3MsICRGYXRhbEVycm9yKSA9ICRFU09iamVjdC0+SW5pdGlhbFNldHVwKCkKCj1jdXQKCnN1YiBJbml0aWFsU2V0dXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3lzQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZycpOwoKICAgICMgYWN0aXZhdGUgRWxhc3RpY3NlYXJjaCBpbiB0aGUgU3lzQ29uZmlnCiAgICB7CiAgICAgICAgbXkgJEV4Y2x1c2l2ZUxvY2tHVUlEID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ0xvY2soCiAgICAgICAgICAgIExvY2tBbGwgPT4gMSwKICAgICAgICAgICAgRm9yY2UgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU3lzQ29uZmlnT2JqZWN0LT5TZXR0aW5nVXBkYXRlKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICA9PiAnRWxhc3RpY3NlYXJjaDo6QWN0aXZlJywKICAgICAgICAgICAgSXNWYWxpZCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgRXhjbHVzaXZlTG9ja0dVSUQgPT4gJEV4Y2x1c2l2ZUxvY2tHVUlELAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VubG9jaygKICAgICAgICAgICAgVW5sb2NrQWxsID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBUT0RPOiBoYW5kbGUgZXJyb3JzCiAgICB9CgogICAgbXkgJFN1Y2Nlc3MgPSAxOwoKICAgICMgaW5pdGlhbGl6ZSBzdGFuZGFyZCBpbmRpY2VzCiAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICBteSAkRXJyb3JzOwogICAgICAgIG15ICRJbmRleENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnRWxhc3RpY3NlYXJjaDo6SW5kZXhTZXR0aW5ncycpOwogICAgICAgIG15ICREZWZhdWx0Q29uZmlnOwogICAgICAgIGlmICgkSW5kZXhDb25maWcpIHsKICAgICAgICAgICAgJERlZmF1bHRDb25maWcgPSAkSW5kZXhDb25maWctPntEZWZhdWx0fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICREZWZhdWx0Q29uZmlnID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdFbGFzdGljc2VhcmNoOjpBcnRpY2xlSW5kZXhDcmVhdGlvblNldHRpbmdzJyk7CiAgICAgICAgfQoKICAgICAgICAjIHRocm93IGFuIGZhdGFsIGVycm9yIHdoZW4gd2UgYXJlIGluIGEgd2ViIGNvbnRleHQKICAgICAgICByZXR1cm4gMCwgMSB1bmxlc3MgJERlZmF1bHRDb25maWc7CgogICAgICAgIG15ICREZWZhdWx0VGVtcGxhdGU7CiAgICAgICAgbXkgJEluZGV4VGVtcGxhdGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0VsYXN0aWNzZWFyY2g6OkluZGV4VGVtcGxhdGUnKTsKICAgICAgICBpZiAoJEluZGV4VGVtcGxhdGUpIHsKICAgICAgICAgICAgJERlZmF1bHRUZW1wbGF0ZSA9ICRJbmRleFRlbXBsYXRlLT57RGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyB0aHJvdyBhbiBmYXRhbCBlcnJvciB3aGVuIHdlIGFyZSBpbiBhIHdlYiBjb250ZXh0CiAgICAgICAgICAgIHJldHVybiAwLCAxOwogICAgICAgIH0KCiAgICAgICAgIyBDcmVhdGUgcGlwZWxpbmVzLgogICAgICAgICMgV3JpdGluZyB0aGUgc3RyaW5nICdmb3JlYWNoJyBpbiBhIGZ1bm55IHdheSwgYXMgc29tZSB2ZXJzaW9ucyBvZiB0aGUgQ29kZVBvbGljeQogICAgICAgICMgcmVwbGFjZWQgaXQgd2l0aCB0aGUgc3RyaW5nICdmb3InLgogICAgICAgIG15ICVQaXBlbGluZSA9ICgKICAgICAgICAgICAgZGVzY3JpcHRpb24gPT4gIkV4dHJhY3QgZXh0ZXJuYWwgYXR0YWNobWVudCBpbmZvcm1hdGlvbiIsCiAgICAgICAgICAgIHByb2Nlc3NvcnMgID0+IFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBxe2ZvcmVhY2h9ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgICAgID0+ICJBdHRhY2htZW50cyIsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NvciA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2htZW50ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfZmllbGQgPT4gIl9pbmdlc3QuX3ZhbHVlLmF0dGFjaG1lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkICAgICAgICA9PiAiX2luZ2VzdC5fdmFsdWUuZGF0YSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcXtmb3JlYWNofSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkICAgICA9PiAiQXR0YWNobWVudHMiLAogICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzb3IgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCA9PiAiX2luZ2VzdC5fdmFsdWUuZGF0YSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIF0KICAgICAgICApOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5DcmVhdGVQaXBlbGluZSgKICAgICAgICAgICAgUmVxdWVzdCA9PiBcJVBpcGVsaW5lLAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgIyBjcmVhdGUgaW5kZXggZm9yIGN1c3RvbWVyCiAgICAgICAgbXkgJVJlcXVlc3RDdXN0b21lciA9ICgKICAgICAgICAgICAgc2V0dGluZ3MgPT4gJFNlbGYtPkluZGV4U2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSW5kZXhDb25maWctPntDdXN0b21lcn0gICAvLyAkRGVmYXVsdENvbmZpZywKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlLT57Q3VzdG9tZXJ9IC8vICREZWZhdWx0VGVtcGxhdGUsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+Q3JlYXRlSW5kZXgoCiAgICAgICAgICAgIEluZGV4TmFtZSA9PiB7IGluZGV4ID0+ICdjdXN0b21lcicgfSwKICAgICAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdEN1c3RvbWVyLAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgIyBjcmVhdGUgaW5kZXggZm9yIGN1c3RvbWVyIHVzZXJzCiAgICAgICAgbXkgJVJlcXVlc3RDdXN0b21lclVzZXIgPSAoCiAgICAgICAgICAgIHNldHRpbmdzID0+ICRTZWxmLT5JbmRleFNldHRpbmdzR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEluZGV4Q29uZmlnLT57Q3VzdG9tZXJVc2VyfSAgIC8vICREZWZhdWx0Q29uZmlnLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGUtPntDdXN0b21lclVzZXJ9IC8vICREZWZhdWx0VGVtcGxhdGUsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2tleXdvcmQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5DcmVhdGVJbmRleCgKICAgICAgICAgICAgSW5kZXhOYW1lID0+IHsgaW5kZXggPT4gJ2N1c3RvbWVydXNlcicgfSwKICAgICAgICAgICAgUmVxdWVzdCAgID0+IFwlUmVxdWVzdEN1c3RvbWVyVXNlciwKICAgICAgICApOwogICAgICAgICRFcnJvcnMrKyB1bmxlc3MgJFN1Y2Nlc3M7CgogICAgICAgICMgY3JlYXRlIGluZGV4IGZvciB0aWNrZXRzCiAgICAgICAgbXkgJVJlcXVlc3RUaWNrZXQgPSAoCiAgICAgICAgICAgIHNldHRpbmdzID0+ICRTZWxmLT5JbmRleFNldHRpbmdzR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEluZGV4Q29uZmlnLT57VGlja2V0fSAgIC8vICREZWZhdWx0Q29uZmlnLAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEluZGV4VGVtcGxhdGUtPntUaWNrZXR9IC8vICREZWZhdWx0VGVtcGxhdGUsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIG1hcHBpbmdzID0+IHsKICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgPT4gewogICAgICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdpbnRlZ2VyJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0+ICdrZXl3b3JkJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAna2V5d29yZCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPkNyZWF0ZUluZGV4KAogICAgICAgICAgICBJbmRleE5hbWUgPT4geyBpbmRleCA9PiAndGlja2V0JyB9LAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0VGlja2V0LAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgIyBjcmVhdGUgaW5kZXggZm9yIHRtcGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJVJlcXVlc3RUbXBBdHRhY2htZW50cyA9ICgKICAgICAgICAgICAgc2V0dGluZ3MgPT4gJFNlbGYtPkluZGV4U2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSW5kZXhDb25maWctPntUbXBBdHRhY2htZW50c30gICAvLyAkRGVmYXVsdENvbmZpZywKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlLT57VG1wQXR0YWNobWVudHN9IC8vICREZWZhdWx0VGVtcGxhdGUsCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5DcmVhdGVJbmRleCgKICAgICAgICAgICAgSW5kZXhOYW1lID0+IHsgaW5kZXggPT4gJ3RtcGF0dGFjaG1lbnRzJyB9LAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0VG1wQXR0YWNobWVudHMsCiAgICAgICAgKTsKICAgICAgICAkRXJyb3JzKysgdW5sZXNzICRTdWNjZXNzOwoKICAgICAgICAjIGNyZWF0ZSBpbmRleCBmb3IgY29uZmlnaXRlbXMKICAgICAgICBteSAlUmVxdWVzdENvbmZpZ0l0ZW0gPSAoCiAgICAgICAgICAgIHNldHRpbmdzID0+ICRTZWxmLT5JbmRleFNldHRpbmdzR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnICAgPT4gJEluZGV4Q29uZmlnLT57Q29uZmlnSXRlbX0gICAvLyAkRGVmYXVsdENvbmZpZywKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJbmRleFRlbXBsYXRlLT57Q29uZmlnSXRlbX0gLy8gJERlZmF1bHRUZW1wbGF0ZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBDbGFzc0lEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT4gJ2ludGVnZXInLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT5DcmVhdGVJbmRleCgKICAgICAgICAgICAgSW5kZXhOYW1lID0+IHsgaW5kZXggPT4gJ2NvbmZpZ2l0ZW0nIH0sCiAgICAgICAgICAgIFJlcXVlc3QgICA9PiBcJVJlcXVlc3RDb25maWdJdGVtLAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgIyBjcmVhdGUgaW5kZXggZm9yIGZhcXMKICAgICAgICBteSAlUmVxdWVzdEZBUSA9ICgKICAgICAgICAgICAgc2V0dGluZ3MgPT4gJFNlbGYtPkluZGV4U2V0dGluZ3NHZXQoCiAgICAgICAgICAgICAgICBDb25maWcgICA9PiAkSW5kZXhDb25maWctPntGQVF9ICAgLy8gJERlZmF1bHRDb25maWcsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkSW5kZXhUZW1wbGF0ZS0+e0ZBUX0gLy8gJERlZmF1bHRUZW1wbGF0ZSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgbWFwcGluZ3MgPT4gewogICAgICAgICAgICAgICAgcHJvcGVydGllcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgSXRlbUlEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PiAnaW50ZWdlcicsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTdWNjZXNzID0gJFNlbGYtPkNyZWF0ZUluZGV4KAogICAgICAgICAgICBJbmRleE5hbWUgPT4geyBpbmRleCA9PiAnZmFxJyB9LAogICAgICAgICAgICBSZXF1ZXN0ICAgPT4gXCVSZXF1ZXN0RkFRLAogICAgICAgICk7CiAgICAgICAgJEVycm9ycysrIHVubGVzcyAkU3VjY2VzczsKCiAgICAgICAgJFN1Y2Nlc3MgPSAwIGlmICRFcnJvcnM7CiAgICB9CgogICAgaWYgKCRTdWNjZXNzKSB7CgogICAgICAgIG15ICRFeGNsdXNpdmVMb2NrR1VJRCA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdMb2NrKAogICAgICAgICAgICBMb2NrQWxsID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZW5hYmxlIHRvb2xiYXIKICAgICAgICBteSAlU2V0dGluZyA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJ0Zyb250ZW5kOjpUb29sQmFyTW9kdWxlIyMjMjUwLVRpY2tldDo6RWxhc3RpY3NlYXJjaEZ1bGx0ZXh0JywKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVcGRhdGUoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgID0+ICdGcm9udGVuZDo6VG9vbEJhck1vZHVsZSMjIzI1MC1UaWNrZXQ6OkVsYXN0aWNzZWFyY2hGdWxsdGV4dCcsCiAgICAgICAgICAgIElzVmFsaWQgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tHVUlEID0+ICRFeGNsdXNpdmVMb2NrR1VJRCwKICAgICAgICAgICAgRWZmZWN0aXZlVmFsdWUgICAgPT4gJFNldHRpbmd7RWZmZWN0aXZlVmFsdWV9LAogICAgICAgICk7CgogICAgICAgICMgZW5hYmxlIHNpbWlsYXIgc2VhcmNoIHdpZGdldAogICAgICAgICVTZXR0aW5nID0gJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ0dldCgKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRab29tIyMjV2lkZ2V0cyMjIzA0MDAtU2ltaWxhclRpY2tldHMnLAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VwZGF0ZSgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Wm9vbSMjI1dpZGdldHMjIyMwNDAwLVNpbWlsYXJUaWNrZXRzJywKICAgICAgICAgICAgSXNWYWxpZCAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgRXhjbHVzaXZlTG9ja0dVSUQgPT4gJEV4Y2x1c2l2ZUxvY2tHVUlELAogICAgICAgICAgICBFZmZlY3RpdmVWYWx1ZSAgICA9PiAkU2V0dGluZ3tFZmZlY3RpdmVWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VubG9jaygKICAgICAgICAgICAgVW5sb2NrQWxsID0+IDEsCiAgICAgICAgKTsKCiAgICB9CiAgICBlbHNlIHsKICAgICAgICAjIGRpc2FibGUgaW4gY2FzZSBvZiBmYWlsdXJlCiAgICAgICAgbXkgJFdlYnNlcnZpY2VPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJpY0ludGVyZmFjZTo6V2Vic2VydmljZScpOwogICAgICAgIG15ICRFU1dlYnNlcnZpY2UgICAgID0gJFdlYnNlcnZpY2VPYmplY3QtPldlYnNlcnZpY2VHZXQoCiAgICAgICAgICAgIE5hbWUgPT4gJ0VsYXN0aWNzZWFyY2gnLAogICAgICAgICk7CgogICAgICAgICRXZWJzZXJ2aWNlT2JqZWN0LT5XZWJzZXJ2aWNlVXBkYXRlKAogICAgICAgICAgICAleyRFU1dlYnNlcnZpY2V9LAogICAgICAgICAgICBWYWxpZElEID0+IDIsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIFN5c0NvbmZpZwogICAgICAgIG15ICRFeGNsdXNpdmVMb2NrR1VJRCA9ICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdMb2NrKAogICAgICAgICAgICBMb2NrQWxsID0+IDEsCiAgICAgICAgICAgIEZvcmNlICAgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFN5c0NvbmZpZ09iamVjdC0+U2V0dGluZ1VwZGF0ZSgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgPT4gJ0VsYXN0aWNzZWFyY2g6OkFjdGl2ZScsCiAgICAgICAgICAgIElzVmFsaWQgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIEV4Y2x1c2l2ZUxvY2tHVUlEID0+ICRFeGNsdXNpdmVMb2NrR1VJRCwKICAgICAgICApOwogICAgICAgICRTeXNDb25maWdPYmplY3QtPlNldHRpbmdVbmxvY2soCiAgICAgICAgICAgIFVubG9ja0FsbCA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyAnUmVidWlsZCcgdGhlIGNvbmZpZ3VyYXRpb24uCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWd1cmF0aW9uRGVwbG95KAogICAgICAgIENvbW1lbnRzICAgID0+ICJRdWljayBzZXR1cCBvZiBFbGFzdGljc2VhcmNoIiwKICAgICAgICBBbGxTZXR0aW5ncyA9PiAxLAogICAgICAgIEZvcmNlICAgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRTdWNjZXNzLCAwOwp9CgpzdWIgX0lzVXNpbmdFeHRlbmRlZFNlYXJjaFN5bnRheCB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUXVlcnkgPSAkUGFyYW17UXVlcnl9OwoKICAgIHJldHVybiAwIGlmICEkUXVlcnk7CgogICAgIyBTZWFyY2hUZXJtIGRvZXMgY29udGFpbiBhbnkgb2Y6CiAgICAjICAgICAgY29sb24gJzonLCBib29sZWFuIG9wZXJhdG9yICAnQU5ELCBPUiwgTk9UJyBvciB0aGUgc2hvcnRoYW5kcyAnJiYsIHx8LCAhJycKICAgICMgICAgICBicmFja2V0ICcoJywgb3IgZG91YmxlLXF1b3RlICciJwoKICAgIGlmICgKICAgICAgICAkUXVlcnkgPX4gbS8KICAgICAgICAgICAgXCp8CiAgICAgICAgICAgIDp8CiAgICAgICAgICAgIChcYkFORFxiKXwKICAgICAgICAgICAgKFxiT1JcYil8CiAgICAgICAgICAgIChcYk5PVFxiKXwKICAgICAgICAgICAgKCEpfAogICAgICAgICAgICAoXGImJlxiKXwKICAgICAgICAgICAgKFxiXHxcfFxiKXwKICAgICAgICAgICAgKFwoKXwKICAgICAgICAgICAgKCIpCiAgICAgICAgL3gKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN1YiBfQXVnbWVudFRpY2tldFNlYXJjaFF1ZXJ5U3RyaW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFF1ZXJ5ICAgICAgICAgID0gJFBhcmFte1F1ZXJ5fTsKICAgIG15ICRTZWFyY2hGaWVsZHMgICA9ICRQYXJhbXtTZWFyY2hGaWVsZHN9OwogICAgbXkgJEV4dGVuZGVkU2VhcmNoID0gJFBhcmFte0V4dGVuZGVkU2VhcmNofTsKCiAgICByZXR1cm4gJycgaWYgISRRdWVyeTsKCiAgICAjIEV4dGVuZGVkIFN5bnRheCBpcyBpbnRyb2R1Y2VkIHdpdGggJ0VTOicgcHJlZml4CiAgICBpZiAoICRFeHRlbmRlZFNlYXJjaCAmJiAkU2VsZi0+X0lzVXNpbmdFeHRlbmRlZFNlYXJjaFN5bnRheCggUXVlcnkgPT4gJFF1ZXJ5ICkgKSB7CgogICAgICAgICMgd2UgZG9uJ3Qgd2FudCB0aGUgYWdlbnQgdG8ga25vdyBhYm91dAogICAgICAgICMgdGhlICdBcnRpY2xlc0ludGVybmFsLicsICdBcnRpY2xlc0V4dGVybmFsLicsIGV0YwogICAgICAgICMgcHJlZml4ZXMgb2YgdGhlIFNlYXJjaGZpZWxkcywgYW5kIHRoZSBhZ2VudAogICAgICAgICMgc2hvdWxkIG5vdCBuZWVkIHRvIHR5cGUgdGhlbSBpbi4gSW5zdGVhZCB3ZSB3YW50CiAgICAgICAgIyB0byBiZSBhYmxlIHRvIGp1c3Qgc2VhcmNoIGZvciAiU3ViamVjdDoiIG9yICJGcm9tOiIKICAgICAgICAjIG9yICJCb2R5OiIgZXRjCiAgICAgICAgIyB0aGVyZWZvcmUgdHJhbnNsYXRlIHNlYXJjaCB0ZXJtcyBsaWtlICJCb2R5OlhZWiIKICAgICAgICAjIGludG8gIihBcnRpY2xlc0ludGVybmFsLkJvZHk6WFlaIE9SIEFydGljbGVzRXh0ZXJuYWwuQm9keTpYWVopIgoKICAgICAgICBmb3IgbXkgJFNlYXJjaEZpZWxkIChAJFNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgaWYgKCAkU2VhcmNoRmllbGQgPX4gL15BcnRpY2xlc0ludGVybmFsXC4vICkgewoKICAgICAgICAgICAgICAgIG15ICRSYXdGaWVsZCA9ICRTZWFyY2hGaWVsZDsKICAgICAgICAgICAgICAgICRSYXdGaWVsZCA9fiBzL15BcnRpY2xlc0ludGVybmFsXC4vLzsKCiAgICAgICAgICAgICAgICBteSAkUmd4ID0gcXIvKCg/OlxiJFJhd0ZpZWxkOlteJyApXSspfCg/OlxiJFJhd0ZpZWxkOiJbXiJdKiIpKS87CiAgICAgICAgICAgICAgICAkUXVlcnkgPX4gcy8kUmd4LyhBcnRpY2xlc0ludGVybmFsLiQxIE9SIEFydGljbGVzRXh0ZXJuYWwuJDEgKS9nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFNlYXJjaEZpZWxkID1+IC9eQXR0YWNobWVudHNJbnRlcm5hbFwuLyApIHsKCiAgICAgICAgICAgICAgICBteSAkUmF3RmllbGQgPSAkU2VhcmNoRmllbGQ7CiAgICAgICAgICAgICAgICAkUmF3RmllbGQgPX4gcy9eQXR0YWNobWVudHNJbnRlcm5hbFwuLy87CgogICAgICAgICAgICAgICAgbXkgJFJneCA9IHFyLyg/OihcYiRSYXdGaWVsZDpbXiIgKV0rKXwoPzpcYiRSYXdGaWVsZDoiW14iXSoiKSkvOwogICAgICAgICAgICAgICAgJFF1ZXJ5ID1+IHMvJFJneC8oQXR0YWNobWVudHNJbnRlcm5hbC4kMSBPUiBBdHRhY2htZW50c0V4dGVybmFsLiQxICkvZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRTZWFyY2hGaWVsZCA9fiAvXkR5bmFtaWNGaWVsZF8vICkgewoKICAgICAgICAgICAgICAgIG15ICRSYXdGaWVsZCA9ICRTZWFyY2hGaWVsZDsKICAgICAgICAgICAgICAgICRSYXdGaWVsZCA9fiBzL15EeW5hbWljRmllbGRfLy87CgogICAgICAgICAgICAgICAgbXkgJFJneCA9IHFyL1xAXGIkUmF3RmllbGQ6LzsKICAgICAgICAgICAgICAgICRRdWVyeSA9fiBzLyRSZ3gvJFNlYXJjaEZpZWxkOi9nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRRdWVyeSA9fiBzL1xiVGlja2V0Oi9UaXRsZTovZzsKICAgICAgICByZXR1cm4gJFF1ZXJ5OwogICAgfQoKICAgICMgZmFsbGJhY2sgdG8gY2xhc3NpYyBmdWxsdGV4dCBzZWFyY2gKICAgIG15IEBRdWVyeVBhcnRzID0gc3BsaXQgLyArLywgJFF1ZXJ5OwogICAgQFF1ZXJ5UGFydHMgPSBtYXAgeyAnKicgLiAkXyAuICcqJyB9IEBRdWVyeVBhcnRzOwoKICAgICRRdWVyeSA9IGpvaW4gJyAnLCBAUXVlcnlQYXJ0czsKICAgIHJldHVybiAkUXVlcnk7Cn0KCnN1YiBfQXVnbWVudEN1c3RvbWVyQ29tcGFueVNlYXJjaFF1ZXJ5U3RyaW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFF1ZXJ5ICAgICAgICAgID0gJFBhcmFte1F1ZXJ5fTsKICAgIG15ICRTZWFyY2hGaWVsZHMgICA9ICRQYXJhbXtTZWFyY2hGaWVsZHN9OwogICAgbXkgJEV4dGVuZGVkU2VhcmNoID0gJFBhcmFte0V4dGVuZGVkU2VhcmNofTsKCiAgICBpZiAoICRFeHRlbmRlZFNlYXJjaCAmJiAkU2VsZi0+X0lzVXNpbmdFeHRlbmRlZFNlYXJjaFN5bnRheCggUXVlcnkgPT4gJFF1ZXJ5ICkgKSB7CgogICAgICAgICMgQWxsb3cgdG8gZHJvcCB0aGUgIkN1c3RvbWVyIiBwcmVmaXggZnJvbSBzZWFyY2gKICAgICAgICAjIGZpZWxkcywgZm9yIGV4YW1wbGUgQ29tcGFueU5hbWUgaW5zdGVhZCBvZiBDdXN0b21lckNvbXBhbnlOYW1lCgogICAgICAgIGZvciBteSAkU2VhcmNoRmllbGQgKEAkU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZCA9fiAvXkN1c3RvbWVyLyApIHsKCiAgICAgICAgICAgICAgICBteSAkUmF3RmllbGQgPSAkU2VhcmNoRmllbGQ7CiAgICAgICAgICAgICAgICAkUmF3RmllbGQgPX4gcy9eQ3VzdG9tZXIvLzsKCiAgICAgICAgICAgICAgICBteSAkUmd4ID0gcXIvKCg/OlxiJFJhd0ZpZWxkOlteJyApXSspfCg/OlxiJFJhd0ZpZWxkOidbXiddKicpKS87CiAgICAgICAgICAgICAgICAkUXVlcnkgPX4gcy8kUmd4L0N1c3RvbWVyJDEvZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRTZWFyY2hGaWVsZCA9fiAvXkR5bmFtaWNGaWVsZF8vICkgewoKICAgICAgICAgICAgICAgIG15ICRSYXdGaWVsZCA9ICRTZWFyY2hGaWVsZDsKICAgICAgICAgICAgICAgICRSYXdGaWVsZCA9fiBzL15EeW5hbWljRmllbGRfLy87CgogICAgICAgICAgICAgICAgbXkgJFJneCA9IHFyL1xAXGIkUmF3RmllbGQ6LzsKICAgICAgICAgICAgICAgICRRdWVyeSA9fiBzLyRSZ3gvJFNlYXJjaEZpZWxkOi9nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAkUXVlcnk7CiAgICB9CgogICAgIyBmYWxsYmFjayB0byBjbGFzc2ljIGZ1bGx0ZXh0IHNlYXJjaAogICAgbXkgQFF1ZXJ5UGFydHMgPSBzcGxpdCAvICsvLCAkUXVlcnk7CiAgICBAUXVlcnlQYXJ0cyA9IG1hcCB7ICcqJyAuICRfIC4gJyonIH0gQFF1ZXJ5UGFydHM7CgogICAgJFF1ZXJ5ID0gam9pbiAnICcsIEBRdWVyeVBhcnRzOwogICAgcmV0dXJuICRRdWVyeTsKfQoKc3ViIF9BdWdtZW50Q3VzdG9tZXJVc2VyU2VhcmNoUXVlcnlTdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUXVlcnkgICAgICAgICAgPSAkUGFyYW17UXVlcnl9OwogICAgbXkgJFNlYXJjaEZpZWxkcyAgID0gJFBhcmFte1NlYXJjaEZpZWxkc307CiAgICBteSAkRXh0ZW5kZWRTZWFyY2ggPSAkUGFyYW17RXh0ZW5kZWRTZWFyY2h9OwoKICAgIGlmICggJEV4dGVuZGVkU2VhcmNoICYmICRTZWxmLT5fSXNVc2luZ0V4dGVuZGVkU2VhcmNoU3ludGF4KCBRdWVyeSA9PiAkUXVlcnkgKSApIHsKCiAgICAgICAgIyBBbGxvdyB0byBkcm9wIHRoZSAiVXNlciIgcHJlZml4IGZyb20gc2VhcmNoCiAgICAgICAgIyBmaWVsZHMsIGZvciBleGFtcGxlIEVtYWlsIGluc3RlYWQgb2YgVXNlckVtYWlsCgogICAgICAgIEZJRUxEOgogICAgICAgIGZvciBteSAkU2VhcmNoRmllbGQgKEAkU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZCA9fiAvVXNlckN1c3RvbWVySUQvICkgewogICAgICAgICAgICAgICAgbmV4dCBGSUVMRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VhcmNoRmllbGQgPX4gL15Vc2VyLyApIHsKCiAgICAgICAgICAgICAgICBteSAkUmF3RmllbGQgPSAkU2VhcmNoRmllbGQ7CiAgICAgICAgICAgICAgICAkUmF3RmllbGQgPX4gcy9eVXNlci8vOwoKICAgICAgICAgICAgICAgIG15ICRSZ3ggPSBxci8oKD86XGIkUmF3RmllbGQ6W14nICldKyl8KD86XGIkUmF3RmllbGQ6J1teJ10qJykpLzsKICAgICAgICAgICAgICAgICRRdWVyeSA9fiBzLyRSZ3gvVXNlciQxL2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkU2VhcmNoRmllbGQgPX4gL15EeW5hbWljRmllbGRfLyApIHsKCiAgICAgICAgICAgICAgICBteSAkUmF3RmllbGQgPSAkU2VhcmNoRmllbGQ7CiAgICAgICAgICAgICAgICAkUmF3RmllbGQgPX4gcy9eRHluYW1pY0ZpZWxkXy8vOwoKICAgICAgICAgICAgICAgIG15ICRSZ3ggPSBxci9cQFxiJFJhd0ZpZWxkOi87CiAgICAgICAgICAgICAgICAkUXVlcnkgPX4gcy8kUmd4LyRTZWFyY2hGaWVsZDovZzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gJFF1ZXJ5OwogICAgfQoKICAgICMgZmFsbGJhY2sgdG8gY2xhc3NpYyBmdWxsdGV4dCBzZWFyY2gKICAgIG15IEBRdWVyeVBhcnRzID0gc3BsaXQgLyArLywgJFF1ZXJ5OwogICAgQFF1ZXJ5UGFydHMgPSBtYXAgeyAnKicgLiAkXyAuICcqJyB9IEBRdWVyeVBhcnRzOwoKICAgICMgZmFsbGJhY2sgdG8gY2xhc3NpYyBmdWxsdGV4dCBzZWFyY2gKICAgICRRdWVyeSA9IGpvaW4gJyAnLCBAUXVlcnlQYXJ0czsKICAgIHJldHVybiAkUXVlcnk7Cn0KCnN1YiBfQXVnbWVudENvbmZpZ0l0ZW1TZWFyY2hRdWVyeVN0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRRdWVyeSAgICAgICAgICA9ICRQYXJhbXtRdWVyeX07CiAgICBteSAkU2VhcmNoRmllbGRzICAgPSAkUGFyYW17U2VhcmNoRmllbGRzfTsKICAgIG15ICRFeHRlbmRlZFNlYXJjaCA9ICRQYXJhbXtFeHRlbmRlZFNlYXJjaH07CgogICAgaWYgKCAkRXh0ZW5kZWRTZWFyY2ggJiYgJFNlbGYtPl9Jc1VzaW5nRXh0ZW5kZWRTZWFyY2hTeW50YXgoIFF1ZXJ5ID0+ICRRdWVyeSApICkgewoKICAgICAgICAjIEFsbG93IHRvIGRyb3AgdGhlICJVc2VyIiBwcmVmaXggZnJvbSBzZWFyY2gKICAgICAgICAjIGZpZWxkcywgZm9yIGV4YW1wbGUgRW1haWwgaW5zdGVhZCBvZiBVc2VyRW1haWwKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoICRTZWFyY2hGaWVsZHMtPntEeW5hbWljRmllbGR9LT5AKiApIHsKCiAgICAgICAgICAgIGlmICggJFNlYXJjaEZpZWxkID1+IC9eRHluYW1pY0ZpZWxkXy8gKSB7CgogICAgICAgICAgICAgICAgbXkgJFJhd0ZpZWxkID0gJFNlYXJjaEZpZWxkOwogICAgICAgICAgICAgICAgJFJhd0ZpZWxkID1+IHMvXkR5bmFtaWNGaWVsZF8vLzsKCiAgICAgICAgICAgICAgICBteSAkUmd4ID0gcXIvXEBcYiRSYXdGaWVsZDovOwogICAgICAgICAgICAgICAgJFF1ZXJ5ID1+IHMvJFJneC8kU2VhcmNoRmllbGQ6L2c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRRdWVyeTsKICAgIH0KCiAgICAjIGZhbGxiYWNrIHRvIGNsYXNzaWMgZnVsbHRleHQgc2VhcmNoCiAgICBteSBAUXVlcnlQYXJ0cyA9IHNwbGl0IC8gKy8sICRRdWVyeTsKICAgIEBRdWVyeVBhcnRzID0gbWFwIHsgJyonIC4gJF8gLiAnKicgfSBAUXVlcnlQYXJ0czsKCiAgICAkUXVlcnkgPSBqb2luICcgJywgQFF1ZXJ5UGFydHM7CiAgICByZXR1cm4gJFF1ZXJ5Owp9CgpzdWIgX0F1Z21lbnRGQVFTZWFyY2hRdWVyeVN0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRRdWVyeSAgICAgICAgICA9ICRQYXJhbXtRdWVyeX07CiAgICBteSAkU2VhcmNoRmllbGRzICAgPSAkUGFyYW17U2VhcmNoRmllbGRzfTsKICAgIG15ICRFeHRlbmRlZFNlYXJjaCA9ICRQYXJhbXtFeHRlbmRlZFNlYXJjaH07CgogICAgaWYgKCAkRXh0ZW5kZWRTZWFyY2ggJiYgJFNlbGYtPl9Jc1VzaW5nRXh0ZW5kZWRTZWFyY2hTeW50YXgoIFF1ZXJ5ID0+ICRRdWVyeSApICkgewoKICAgICAgICAjIHNwZWNpYWwgaGFuZGxpbmcgZm9yIEZpZWxkMSwgRmllbGQyLCBhbmQgRmllbGQzCgogICAgICAgICRRdWVyeSA9fiBzL1xiU3ltcHRvbTovRmllbGQxOi9nOwogICAgICAgICRRdWVyeSA9fiBzL1xiUHJvYmxlbTovRmllbGQyOi9nOwogICAgICAgICRRdWVyeSA9fiBzL1xiU29sdXRpb246L0ZpZWxkMzovZzsKCiAgICAgICAgJFF1ZXJ5ID1+IHMvXGJGQVE6L1RpdGxlOi9nOwoKICAgICAgICAjIEFsbG93IHRvIGRyb3AgdGhlICJVc2VyIiBwcmVmaXggZnJvbSBzZWFyY2gKICAgICAgICAjIGZpZWxkcywgZm9yIGV4YW1wbGUgRW1haWwgaW5zdGVhZCBvZiBVc2VyRW1haWwKCiAgICAgICAgRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoICRTZWFyY2hGaWVsZHMtPntEeW5hbWljRmllbGR9LT5AKiApIHsKCiAgICAgICAgICAgIGlmICggJFNlYXJjaEZpZWxkID1+IC9eRHluYW1pY0ZpZWxkXy8gKSB7CgogICAgICAgICAgICAgICAgbXkgJFJhd0ZpZWxkID0gJFNlYXJjaEZpZWxkOwogICAgICAgICAgICAgICAgJFJhd0ZpZWxkID1+IHMvXkR5bmFtaWNGaWVsZF8vLzsKCiAgICAgICAgICAgICAgICBteSAkUmd4ID0gcXIvXEBcYiRSYXdGaWVsZDovOwogICAgICAgICAgICAgICAgJFF1ZXJ5ID1+IHMvJFJneC8kU2VhcmNoRmllbGQ6L2c7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRRdWVyeTsKICAgIH0KCiAgICAjIGZhbGxiYWNrIHRvIGNsYXNzaWMgZnVsbHRleHQgc2VhcmNoCiAgICBteSBAUXVlcnlQYXJ0cyA9IHNwbGl0IC8gKy8sICRRdWVyeTsKICAgIEBRdWVyeVBhcnRzID0gbWFwIHsgJyonIC4gJF8gLiAnKicgfSBAUXVlcnlQYXJ0czsKCiAgICAkUXVlcnkgPSBqb2luICcgJywgQFF1ZXJ5UGFydHM7CiAgICByZXR1cm4gJFF1ZXJ5Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKdXNlIHV0Zjg7Cgp1c2UgcGFyZW50IHF3KAogICAgS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcgogICAgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpDb25maWdJdGVtQUNMCiAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkNvbmZpZ0l0ZW1TZWFyY2gKICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RGVmaW5pdGlvbgogICAgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpIaXN0b3J5CiAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkxpbmsKICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6TnVtYmVyCiAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb24KICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6VmVyc2lvbgopOwoKIyBjb3JlIG1vZHVsZXMKdXNlIFN0b3JhYmxlICAgICAgIHF3KGRjbG9uZSk7CnVzZSBMaXN0OjpBbGxVdGlscyBxdyhmaXJzdCB0cnVlKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJywKICAgICdLZXJuZWw6OlN5c3RlbTo6WE1MJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0gLSBsaWJyYXJ5IGZvciBJVFNNIGNvbmZpZyBpdGVtcy4KCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGNvbmZpZyBpdGVtIGZ1bmN0aW9ucy4gTm90ZSB0aGF0IGFkZGl0aW9uYWwgcGFyZW50IG1vZHVsZXMgYXJlIGxvYWRlZAp3aGljaCBlZmZlY3RpdmVseSBhZGQgbW9yZSBtZXRob2RzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlcjsKCiAgICBsb2NhbCAkS2VybmVsOjpPTSA9IEtlcm5lbDo6U3lzdGVtOjpPYmplY3RNYW5hZ2VyLT5uZXcoKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICgkVHlwZSkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdJVFNNQ29uZmlndXJhdGlvbk1hbmFnZW1lbnQnOwogICAgJFNlbGYtPntDYWNoZVRUTH0gID0gNjAgKiA2MCAqIDI0ICogMjA7CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnSVRTTUNvbmZpZ0l0ZW06OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1Db3VudCgpCgpjb3VudCBhbGwgcHJvZHVjdGl2ZSBjb25maWcgaXRlbXMgb2YgYSBjb25maWcgaXRlbSBjbGFzcwoKICAgIG15ICRDb3VudCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQ291bnQoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1Db3VudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q2xhc3NJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzSUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbGlzdCBvZiBwcm9kdWN0aXZlIGRlcGxveW1lbnQgc3RhdGVzCiAgICBteSAkU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgRnVuY3Rpb25hbGl0eSA9PiBbICdwcmVwcm9kdWN0aXZlJywgJ3Byb2R1Y3RpdmUnIF0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIDAgaWYgISV7JFN0YXRlTGlzdH07CgogICAgIyBjcmVhdGUgc3RhdGUgc3RyaW5nCiAgICBteSAkRGVwbFN0YXRlU3RyaW5nID0gam9pbiBxeywgfSwga2V5cyAleyRTdGF0ZUxpc3R9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICBteSAoJENvdW50KSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TZWxlY3RSb3dBcnJheSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCBDT1VOVChpZCkgRlJPTSBjb25maWdpdGVtIFdIRVJFIGNsYXNzX2lkID0gPyBBTkQgIgogICAgICAgICAgICAuICJjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSIsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgcmV0dXJuICRDb3VudDsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1SZXN1bHRMaXN0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGxpc3QgYXMgYXJyYXkgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkQ29uZmlnSXRlbUxpc3RSZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbVJlc3VsdExpc3QoCiAgICAgICAgQ2xhc3NJRCA9PiAxMjMsCiAgICAgICAgU3RhcnQgICA9PiAxMDAsCiAgICAgICAgTGltaXQgICA9PiA1MCwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVJlc3VsdExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0NsYXNzSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDbGFzc0lEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJFN0YXRlTGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpLT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyAgICAgICA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6RGVwbG95bWVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gWyAncHJlcHJvZHVjdGl2ZScsICdwcm9kdWN0aXZlJyBdLAogICAgICAgIH0sCiAgICApOwoKICAgICMgY3JlYXRlIHN0YXRlIHN0cmluZwogICAgbXkgJERlcGxTdGF0ZVN0cmluZyA9IGpvaW4gcXssIH0sIGtleXMgJXskU3RhdGVMaXN0fTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgaWQgRlJPTSBjb25maWdpdGVtICIKICAgICAgICAgICAgLiAiV0hFUkUgY2xhc3NfaWQgPSA/IEFORCBjdXJfZGVwbF9zdGF0ZV9pZCBJTiAoICREZXBsU3RhdGVTdHJpbmcgKSAiCiAgICAgICAgICAgIC4gIk9SREVSIEJZIGNoYW5nZV90aW1lIERFU0MiLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDbGFzc0lEfSBdLAogICAgICAgIFN0YXJ0ID0+ICRQYXJhbXtTdGFydH0sCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQ29uZmlnSXRlbUlETGlzdDsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlETGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICAjIGdldCBsYXN0IHZlcnNpb25zIGRhdGEKICAgIG15IEBDb25maWdJdGVtTGlzdDsKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEIChAQ29uZmlnSXRlbUlETGlzdCkgewoKICAgICAgICAjIGdldCB2ZXJzaW9uIGRhdGEKICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBDb25maWdJdGVtTGlzdCwgJENvbmZpZ0l0ZW07CiAgICB9CgogICAgcmV0dXJuIFxAQ29uZmlnSXRlbUxpc3Q7Cn0KCj1oZWFkMiBDb25maWdJdGVtR2V0KCkKCnJldHVybiBhIGNvbmZpZyBpdGVtIGFzIGEgaGFzaCByZWZlcmVuY2UuIFRoZSBsYXRlc3QgdmVyc2lvbiBpcyByZXRyaWV2ZWQgd2hlbiBDPENvbmZpZ0l0ZW1JRD4gaXMgcGFzc2VkIGFzIHBhcmFtZXRlci4KCiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gMTIzLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCkEgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXR1cm5lZCB3aGVuIHRoZSBDPFZlcnNpb25JRD4gaXMgcGFzc2VkLgoKICAgIG15ICRDb25maWdJdGVtID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgVmVyc2lvbklEICAgICA9PiAyNDMsCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLCAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICApOwoKV2hlbiBib3RoIEM8Q29uZmlnSXRlbUlEPiBhbmQgQzxWZXJzaW9uSUQ+IGFyZSBwYXNzZWQsIHRoZW4gYSBjb25zaXN0ZW5jeSBjaGVjayBpcyBwZXJmb3JtZWQKYW5kIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWMgdmVyc2lvbiBpcyByZXR1cm5lZC4KCkVycm9yIG1lc3NhZ2VzIGFyZSBzdXBwcmVzc2VkIGlmIHRoZSBwYXJhbWV0ZXIgQzxTaWxlbnQ+IGlzIHBhc3NlZC4KCiAgICBteSAkQ29uZmlnSXRlbSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIFZlcnNpb25JRCAgICAgPT4gMjQzLAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIFNpbGVudCAgICAgICAgPT4gMSwgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgKTsKCkEgaGFzaHJlZiB3aXRoIHRoZSBmb2xsb3dpbmcga2V5cyBpcyByZXR1cm5lZDoKCj1vdmVyIDQKCj1pdGVtIENvbmZpZ0l0ZW1JRAoKPWl0ZW0gTnVtYmVyCgo9aXRlbSBDbGFzc0lECgo9aXRlbSBDbGFzcwoKPWl0ZW0gTGFzdFZlcnNpb25JRAoKPWl0ZW0gQ3VyRGVwbFN0YXRlSUQKCj1pdGVtIEN1ckRlcGxTdGF0ZQoKPWl0ZW0gQ3VyRGVwbFN0YXRlVHlwZQoKPWl0ZW0gQ3VySW5jaVN0YXRlSUQKCj1pdGVtIEN1ckluY2lTdGF0ZQoKPWl0ZW0gQ3VySW5jaVN0YXRlVHlwZQoKPWl0ZW0gVmVyc2lvbklECgo9aXRlbSBOYW1lCgo9aXRlbSBWZXJzaW9uU3RyaW5nCgo9aXRlbSBEZXNjcmlwdGlvbgoKPWl0ZW0gRGVmaW5pdGlvbklECgo9aXRlbSBEZXBsU3RhdGVJRAoKPWl0ZW0gRGVwbFN0YXRlCgo9aXRlbSBEZXBsU3RhdGVUeXBlCgo9aXRlbSBJbmNpU3RhdGVJRAoKPWl0ZW0gSW5jaVN0YXRlCgo9aXRlbSBJbmNpU3RhdGVUeXBlCgo9aXRlbSBDcmVhdGVUaW1lCgo9aXRlbSBDcmVhdGVCeQoKPWl0ZW0gQ2hhbmdlVGltZQoKPWl0ZW0gQ2hhbmdlQnkKCj1iYWNrCgpDYWNoaW5nIGNhbid0IGJlIHR1cm5lZCBvZmYuCgpXaGVuIHRoZSBwYXJhbWV0ZXIgQzxEeW5hbWljRmllbGRzPiBpcyBwYXNzZWQgdGhlbiB0aGUgZHluYW1pYyBmaWVsZHMgYXJlIHJldHVybmVkIGFkZGl0aW9uYWxseS4KRHluYW1pY0ZpZWxkcyBhcmUgbm90IGNhY2hlZCBpbiB0aGUgYmFja2VuZCB0byBwcmV2ZW50IHN0YWxlIGxlbnMgdmFsdWVzIGZvciByZWZlcmVuY2VkIGl0ZW1zLgoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1HZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHdoZXRoZXIgdG8gc3VwcHJlc3MgZXJyb3IgbWVzc2FnZXMKICAgIG15ICRTaWxlbnQgPSAkUGFyYW17U2lsZW50fSA/IDEgOiAwOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17Q29uZmlnSXRlbUlEfSAmJiAhJFBhcmFte1ZlcnNpb25JRH0gKSB7CiAgICAgICAgaWYgKCAhJFNpbGVudCApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ29uZmlnSXRlbUlEIG9yIFZlcnNpb25JRCEnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgaWdub3JlIER5bmFtaWNGaWVsZHMgcGVyIGRlZmF1bHQsCiAgICBteSAkREZEYXRhID0gJFBhcmFte0R5bmFtaWNGaWVsZHN9ID8gMSA6IDA7CgogICAgIyBjaGVjayBjYWNoZQogICAgbXkgQENhY2hlS2V5SUQgPSAkUGFyYW17VmVyc2lvbklEfQogICAgICAgID8gKCBWZXJzaW9uSUQgPT4gJFBhcmFte1ZlcnNpb25JRH0gKQogICAgICAgIDogKCBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKTsKCiAgICBteSAkQ2FjaGVLZXlCYXNlICAgID0gam9pbiAnOjonLCAnQ29uZmlnSXRlbUdldCcsIEBDYWNoZUtleUlEOwogICAgbXkgJENhY2hlS2V5Q3VycmVudCA9IGpvaW4gJzo6JywgJENhY2hlS2V5QmFzZSwgREZEYXRhID0+ICRERkRhdGE7CgogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CgogICAgbXkgJENhY2hlQ3VycmVudCA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5Q3VycmVudCwKICAgICk7CgogICAgIyBjaGVjayBpZiByZXN1bHQgaXMgY2FjaGVkCiAgICBpZiAoIHJlZiAkQ2FjaGVDdXJyZW50IGVxICdIQVNIJyApIHsKICAgICAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICYmICRQYXJhbXtDb25maWdJdGVtSUR9ICYmICRQYXJhbXtDb25maWdJdGVtSUR9IG5lICRDYWNoZUN1cnJlbnQtPntDb25maWdJdGVtSUR9ICkgewogICAgICAgICAgICBpZiAoICEkU2lsZW50ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVmVyc2lvbklEICRQYXJhbXtWZXJzaW9uSUR9IGlzIG5vdCBhIHZlcnNpb24gb2YgQ29uZmlnSXRlbUlEICRQYXJhbXtDb25maWdJdGVtSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZGNsb25lKCRDYWNoZUN1cnJlbnQpOwogICAgfQoKICAgIG15ICVDb25maWdJdGVtOwoKICAgIG15ICRDYWNoZSA9ICRERkRhdGEgPT0gMSA/ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gJENhY2hlS2V5QmFzZSAuICdERkRhdGE6OjAnLAogICAgKSA6IHVuZGVmOwoKICAgIGlmICggcmVmICRDYWNoZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17VmVyc2lvbklEfSAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSBuZSAkQ2FjaGUtPntDb25maWdJdGVtSUR9ICkgewogICAgICAgICAgICBpZiAoICEkU2lsZW50ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVmVyc2lvbklEICRQYXJhbXtWZXJzaW9uSUR9IGlzIG5vdCBhIHZlcnNpb24gb2YgQ29uZmlnSXRlbUlEICRQYXJhbXtDb25maWdJdGVtSUR9ISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAlQ29uZmlnSXRlbSA9ICV7JENhY2hlfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICMgZ2V0IHNwZWNpZmljIENvbmZpZ0l0ZW1WZXJzaW9uCiAgICAgICAgIyBUaGUgcGFyYW1ldGVyIFZlcnNpb25JRCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgQ29uZmlnSXRlbUlECiAgICAgICAgbXkgQFJvdzsKICAgICAgICBpZiAoICRQYXJhbXtWZXJzaW9uSUR9ICkgewojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQojICAgICAgICAgICAgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TZWxlY3RSb3dBcnJheSgKIyAgICAgICAgICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsCiNTRUxFQ1QgY2kuaWQsIGNpLmNvbmZpZ2l0ZW1fbnVtYmVyLCBjaS5jbGFzc19pZCwgY2kubGFzdF92ZXJzaW9uX2lkLAojICAgIGNpLmN1cl9kZXBsX3N0YXRlX2lkLCBjaS5jdXJfaW5jaV9zdGF0ZV9pZCwKIyAgICB2LmlkLCB2Lm5hbWUsIHYudmVyc2lvbl9zdHJpbmcsIHYuZGVmaW5pdGlvbl9pZCwgdi5kZXBsX3N0YXRlX2lkLCB2LmluY2lfc3RhdGVfaWQsIHYuZGVzY3JpcHRpb24sCiMgICAgdi5jcmVhdGVfdGltZSwgdi5jcmVhdGVfYnksIHYuY2hhbmdlX3RpbWUsIHYuY2hhbmdlX2J5CiMgIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIHYKIyAgSU5ORVIgSk9JTiBjb25maWdpdGVtIGNpCiMgICAgT04gdi5jb25maWdpdGVtX2lkID0gY2kuaWQKIyAgV0hFUkUgdi5pZCA9ID8KI0VORF9TUUwKIyAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtWZXJzaW9uSUR9IF0sCiMgICAgICAgICAgICBMaW1pdCA9PiAxLAojICAgICAgICApOwogICAgICAgICAgICBAUm93ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlNlbGVjdFJvd0FycmF5KAogICAgICAgICAgICAgICAgU1FMID0+IDw8J0VORF9TUUwnLApTRUxFQ1QgY2kuaWQsIGNpLmNvbmZpZ2l0ZW1fbnVtYmVyLCBjaS5jbGFzc19pZCwgY2kubGFzdF92ZXJzaW9uX2lkLAogICAgY2kuY3VyX2RlcGxfc3RhdGVfaWQsIGNpLmN1cl9pbmNpX3N0YXRlX2lkLAogICAgdi5pZCwgdi5uYW1lLCB2LnZlcnNpb25fc3RyaW5nLCB2LmRlZmluaXRpb25faWQsIHYuZGVwbF9zdGF0ZV9pZCwgdi5pbmNpX3N0YXRlX2lkLCB2LmRlc2NyaXB0aW9uLAogICAgdi5jcmVhdGVfdGltZSwgdi5jcmVhdGVfYnksIHYuY2hhbmdlX3RpbWUsIHYuY2hhbmdlX2J5LCBjaS5ncm91cF9pZAogIEZST00gY29uZmlnaXRlbV92ZXJzaW9uIHYKICBJTk5FUiBKT0lOIGNvbmZpZ2l0ZW0gY2kKICAgIE9OIHYuY29uZmlnaXRlbV9pZCA9IGNpLmlkCiAgV0hFUkUgdi5pZCA9ID8KRU5EX1NRTAogICAgICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1ZlcnNpb25JRH0gXSwKICAgICAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgICAgICk7CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxhdGVzdCBDb25maWdJdGVtVmVyc2lvbgogICAgICAgIGVsc2UgewoKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKIyAgICAgICAgICAgIEBSb3cgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+U2VsZWN0Um93QXJyYXkoCiMgICAgICAgICAgICAgICAgU1FMID0+IDw8J0VORF9TUUwnLAojU0VMRUNUIGNpLmlkLCBjaS5jb25maWdpdGVtX251bWJlciwgY2kuY2xhc3NfaWQsIGNpLmxhc3RfdmVyc2lvbl9pZCwKIyAgICBjaS5jdXJfZGVwbF9zdGF0ZV9pZCwgY2kuY3VyX2luY2lfc3RhdGVfaWQsCiMgICAgdi5pZCwgdi5uYW1lLCB2LnZlcnNpb25fc3RyaW5nLCB2LmRlZmluaXRpb25faWQsIHYuZGVwbF9zdGF0ZV9pZCwgdi5pbmNpX3N0YXRlX2lkLCB2LmRlc2NyaXB0aW9uLAojICAgIGNpLmNyZWF0ZV90aW1lLCBjaS5jcmVhdGVfYnksIGNpLmNoYW5nZV90aW1lLCBjaS5jaGFuZ2VfYnkKIyAgRlJPTSBjb25maWdpdGVtIGNpCiMgIExFRlQgSk9JTiBjb25maWdpdGVtX3ZlcnNpb24gdgojICAgIE9OIGNpLmxhc3RfdmVyc2lvbl9pZCA9IHYuaWQKIyAgV0hFUkUgY2kuaWQgPSA/CiNFTkRfU1FMCiMgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17Q29uZmlnSXRlbUlEfSBdLAojICAgICAgICAgICAgTGltaXQgPT4gMSwKIyAgICAgICAgKTsKICAgICAgICAgICAgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TZWxlY3RSb3dBcnJheSgKICAgICAgICAgICAgICAgIFNRTCA9PiA8PCdFTkRfU1FMJywKU0VMRUNUIGNpLmlkLCBjaS5jb25maWdpdGVtX251bWJlciwgY2kuY2xhc3NfaWQsIGNpLmxhc3RfdmVyc2lvbl9pZCwKICAgIGNpLmN1cl9kZXBsX3N0YXRlX2lkLCBjaS5jdXJfaW5jaV9zdGF0ZV9pZCwKICAgIHYuaWQsIHYubmFtZSwgdi52ZXJzaW9uX3N0cmluZywgdi5kZWZpbml0aW9uX2lkLCB2LmRlcGxfc3RhdGVfaWQsIHYuaW5jaV9zdGF0ZV9pZCwgdi5kZXNjcmlwdGlvbiwKICAgIGNpLmNyZWF0ZV90aW1lLCBjaS5jcmVhdGVfYnksIGNpLmNoYW5nZV90aW1lLCBjaS5jaGFuZ2VfYnksIGNpLmdyb3VwX2lkCiAgRlJPTSBjb25maWdpdGVtIGNpCiAgTEVGVCBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2CiAgICBPTiBjaS5sYXN0X3ZlcnNpb25faWQgPSB2LmlkCiAgV0hFUkUgY2kuaWQgPSA/CkVORF9TUUwKICAgICAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICAgICApOwojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAgICAgfQoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICAkQ29uZmlnSXRlbXtDb25maWdJdGVtSUR9ICAgPSAkUm93WzBdOwogICAgICAgICRDb25maWdJdGVte051bWJlcn0gICAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJENvbmZpZ0l0ZW17Q2xhc3NJRH0gICAgICAgID0gJFJvd1syXTsKICAgICAgICAkQ29uZmlnSXRlbXtMYXN0VmVyc2lvbklEfSAgPSAkUm93WzNdOwogICAgICAgICRDb25maWdJdGVte0N1ckRlcGxTdGF0ZUlEfSA9ICRSb3dbNF07CiAgICAgICAgJENvbmZpZ0l0ZW17Q3VySW5jaVN0YXRlSUR9ID0gJFJvd1s1XTsKICAgICAgICAkQ29uZmlnSXRlbXtWZXJzaW9uSUR9ICAgICAgPSAkUm93WzZdOwogICAgICAgICRDb25maWdJdGVte05hbWV9ICAgICAgICAgICA9ICRSb3dbN107CiAgICAgICAgJENvbmZpZ0l0ZW17VmVyc2lvblN0cmluZ30gID0gJFJvd1s4XTsKICAgICAgICAkQ29uZmlnSXRlbXtEZWZpbml0aW9uSUR9ICAgPSAkUm93WzldOwogICAgICAgICRDb25maWdJdGVte0RlcGxTdGF0ZUlEfSAgICA9ICRSb3dbMTBdOwogICAgICAgICRDb25maWdJdGVte0luY2lTdGF0ZUlEfSAgICA9ICRSb3dbMTFdOwogICAgICAgICRDb25maWdJdGVte0Rlc2NyaXB0aW9ufSAgICA9ICRSb3dbMTJdOwogICAgICAgICRDb25maWdJdGVte0NyZWF0ZVRpbWV9ICAgICA9ICRSb3dbMTNdOwogICAgICAgICRDb25maWdJdGVte0NyZWF0ZUJ5fSAgICAgICA9ICRSb3dbMTRdOwogICAgICAgICRDb25maWdJdGVte0NoYW5nZVRpbWV9ICAgICA9ICRSb3dbMTVdOwogICAgICAgICRDb25maWdJdGVte0NoYW5nZUJ5fSAgICAgICA9ICRSb3dbMTZdOwojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgICRDb25maWdJdGVte0dyb3VwSUR9ID0gJFJvd1sxN107CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAgICAgIyBjaGVjayBjb25maWcgaXRlbQogICAgICAgIGlmICggISRDb25maWdJdGVte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgICAgIGlmICggISRTaWxlbnQgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIENvbmZpZ0l0ZW1JRCAoJFBhcmFte0NvbmZpZ0l0ZW1JRH0pISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFte1ZlcnNpb25JRH0gJiYgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gJiYgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gbmUgJENvbmZpZ0l0ZW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAgICAgaWYgKCAhJFNpbGVudCApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlZlcnNpb25JRCAkUGFyYW17VmVyc2lvbklEfSBpcyBub3QgYSB2ZXJzaW9uIG9mIENvbmZpZ0l0ZW1JRCAkUGFyYW17Q29uZmlnSXRlbUlEfSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyByZXRyaWV2ZSBhZGRpdGlvbmFsIGJhc2UgYXR0cmlidXRlcyBmcm9tIGdlbmVyYWwgY2F0YWxvZwogICAgICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwoKICAgICAgICAjIGFkZCB0aGUgQ2xhc3MsIGJhc2VkIG9uIHRoZSBDbGFzc0lECiAgICAgICAgewogICAgICAgICAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ29uZmlnSXRlbXtDbGFzc30gPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVte0NsYXNzSUR9IH07CiAgICAgICAgfQoKICAgICAgICAjIEFkZCBtb3JlIHJlYWRhYmxlIG5hbWVzIGZvciB0aGUgdmFyaW91cyBzdGF0ZXMuCiAgICAgICAgIyBBZGQgdGhlIHN0YXRlIHR5cGVzLgogICAgICAgIFNUQVRFOgogICAgICAgIGZvciBteSAkU3RhdGUgKHF3L0RlcGxTdGF0ZSBDdXJEZXBsU3RhdGUgSW5jaVN0YXRlIEN1ckluY2lTdGF0ZS8pIHsKICAgICAgICAgICAgbmV4dCBTVEFURSB1bmxlc3MgJENvbmZpZ0l0ZW17ICRTdGF0ZSAuICdJRCcgfTsKCiAgICAgICAgICAgIG15ICRJdGVtID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgICAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVteyAkU3RhdGUgLiAnSUQnIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkQ29uZmlnSXRlbXskU3RhdGV9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgJENvbmZpZ0l0ZW17ICRTdGF0ZSAuICdUeXBlJyB9ID0gJEl0ZW0tPntGdW5jdGlvbmFsaXR5fVswXSAvLyAnJzsKICAgICAgICB9CgogICAgICAgICMgY2FjaGUKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5QmFzZSAuICdERkRhdGE6OjAnLAogICAgICAgICAgICBWYWx1ZSA9PiBkY2xvbmUoIFwlQ29uZmlnSXRlbSApLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiBuZWVkIHRvIHJldHVybiBEeW5hbWljRmllbGRzCiAgICBpZiAoICRERkRhdGEgJiYgJENvbmZpZ0l0ZW17RGVmaW5pdGlvbklEfSApIHsKCiAgICAgICAgIyBnZXQgZHluYW1pYyBmaWVsZCBvYmplY3RzCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIG15ICREZWZpbml0aW9uID0gJFNlbGYtPkRlZmluaXRpb25HZXQoCiAgICAgICAgICAgIERlZmluaXRpb25JRCA9PiAkQ29uZmlnSXRlbXtEZWZpbml0aW9uSUR9LAogICAgICAgICk7CgogICAgICAgIERZTkFNSUNGSUVMRDoKICAgICAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIHZhbHVlcyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn0tPiUqICkgewoKICAgICAgICAgICAgIyB2YWxpZGF0ZSBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWc7CiAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyBJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzICREeW5hbWljRmllbGRDb25maWctPntOYW1lfTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBjdXJyZW50IHZhbHVlIGZvciBlYWNoIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBPYmplY3RJRCAgICAgICAgICAgPT4gJENvbmZpZ0l0ZW17VmVyc2lvbklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHRoZSBkeW5hbWljIGZpZWxkIG5hbWUgYW5kIHZhbHVlIGludG8gdGhlIGNvbmZpZyBpdGVtIGhhc2gKICAgICAgICAgICAgJENvbmZpZ0l0ZW17ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZSB0aGUgZnVsbCByZXN1bHQgaW4gbWVtb3J5IG9ubHkKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICAgICAgICAgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgICAgICAgICAgPT4gJENhY2hlS2V5QmFzZSAuICdERkRhdGE6OjEnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICA9PiBkY2xvbmUoIFwlQ29uZmlnSXRlbSApLAogICAgICAgICAgICBDYWNoZUluTWVtb3J5ICA9PiAxLAogICAgICAgICAgICBDYWNoZUluQmFja2VuZCA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIFwlQ29uZmlnSXRlbTsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1BZGQoKQoKYWRkIGEgbmV3IGNvbmZpZyBpdGVtLiBUaGlzIGltcGxpZXMgdGhhdCBhbiBpbml0aWFsIHZlcnNpb24gaXMgY3JlYXRlZCBhcyB3ZWxsLgoKICAgIG15ICRDb25maWdJdGVtSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUFkZCgKICAgICAgICBDbGFzc0lEICAgICAgICA9PiAxMjMsCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ05hbWUnLCAgICAjIG9wdGlvbmFsIHdoZW4gYSBuYW1lIG1vZHVsZSBpcyBjb25maWd1cmVkIGZvciB0aGUgY2xhc3MKICAgICAgICBWZXJzaW9uU3RyaW5nICA9PiAnVmVyc2lvbicsICMgb3B0aW9uYWwgd2hlbiBhIHZlcnNpb24gbnVtYmVyIG1vZHVsZSBpcyBjb25maWd1cmVkIGZvciB0aGUgY2xhc3MKICAgICAgICBEZXBsU3RhdGVJRCAgICA9PiAzLAogICAgICAgIEluY2lTdGF0ZUlEICAgID0+IDIsCiAgICAgICAgRGVzY3JpcHRpb24gICAgPT4gJ0FCQ0QnLAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgTnVtYmVyICAgICAgICAgPT4gJzExMScsICAgICMgb3B0aW9uYWwsIGEgbnVtYmVyIHdpbGwgZ2VuZXJhdGVkIHdoZW4gbm8gbnVtYmVyIGlzIHBhc3NlZAogICAgICAgIER5bmFtaWNGaWVsZF9YID0+ICRWYWx1ZSwgICAjIG9wdGlvbmFsCiAgICApOwoKTm8gY29uZmlnIGl0ZW0gd2lsbCBiZSBjcmVhdGVkIHdoZW4gYW4gYWxyZWFkeSBleGlzdGluZyBOdW1iZXIgaXMgcGFzc2VkLgoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NJRCBVc2VySUQgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkR2VuZXJhbENhdGFsb2dPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKTsKCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICRDbGFzc0xpc3Q7CiAgICByZXR1cm4gdW5sZXNzIHJlZiAkQ2xhc3NMaXN0IGVxICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBjbGFzcyBpZAogICAgaWYgKCAhJENsYXNzTGlzdC0+eyAkUGFyYW17Q2xhc3NJRH0gfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHZhbGlkIGNsYXNzIGlkIGdpdmVuIScsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRlcGxveW1lbnQgc3RhdGUgbGlzdAogICAgbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCiAgICByZXR1cm4gdW5sZXNzICREZXBsU3RhdGVMaXN0OwogICAgcmV0dXJuIHVubGVzcyByZWYgJERlcGxTdGF0ZUxpc3QgZXEgJ0hBU0gnOwoKICAgICMgY2hlY2sgdGhlIGRlcGxveW1lbnQgc3RhdGUgaWQKICAgIGlmICggISREZXBsU3RhdGVMaXN0LT57ICRQYXJhbXtEZXBsU3RhdGVJRH0gfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIHZhbGlkIGRlcGxveW1lbnQgc3RhdGUgaWQgZ2l2ZW4hJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaW5jaWRlbnQgc3RhdGUgbGlzdAogICAgbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICk7CgogICAgcmV0dXJuIHVubGVzcyAkSW5jaVN0YXRlTGlzdDsKICAgIHJldHVybiB1bmxlc3MgcmVmICRJbmNpU3RhdGVMaXN0IGVxICdIQVNIJzsKCiAgICAjIGNoZWNrIHRoZSBpbmNpZGVudCBzdGF0ZSBpZAogICAgaWYgKCAhJEluY2lTdGF0ZUxpc3QtPnsgJFBhcmFte0luY2lTdGF0ZUlEfSB9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTm8gdmFsaWQgaW5jaWRlbnQgc3RhdGUgaWQgZ2l2ZW4hJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJUNsYXNzUHJlZmVyZW5jZXMgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICk7CgogICAgIyBjcmVhdGUgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICBpZiAoICRQYXJhbXtOdW1iZXJ9ICkgewoKICAgICAgICAjIGZpbmQgZXhpc3RpbmcgY29uZmlnIGl0ZW0gbnVtYmVyCiAgICAgICAgbXkgJEV4aXN0cyA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyTG9va3VwKAogICAgICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+ICRQYXJhbXtOdW1iZXJ9LAogICAgICAgICk7CgogICAgICAgIGlmICgkRXhpc3RzKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDb25maWcgaXRlbSBudW1iZXIgYWxyZWFkeSBleGlzdHMhJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgbXkgJE51bWJlck1vZHVsZSA9ICRDbGFzc1ByZWZlcmVuY2Vze051bWJlck1vZHVsZX0gPyAkQ2xhc3NQcmVmZXJlbmNlc3tOdW1iZXJNb2R1bGV9WzBdIDogJ0F1dG9JbmNyZW1lbnQnOwoKICAgICAgICAjIGNyZWF0ZSBjb25maWcgaXRlbSBudW1iZXIKICAgICAgICAkUGFyYW17TnVtYmVyfSA9ICRTZWxmLT5Db25maWdJdGVtTnVtYmVyQ3JlYXRlKAogICAgICAgICAgICBUeXBlICAgID0+ICJLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok51bWJlcjo6JE51bWJlck1vZHVsZSIsCiAgICAgICAgICAgIENsYXNzSUQgPT4gJFBhcmFte0NsYXNzSUR9LAogICAgICAgICk7CiAgICB9CgogICAgbXkgJE5hbWVNb2R1bGUgPSAkQ2xhc3NQcmVmZXJlbmNlc3tOYW1lTW9kdWxlfSA/ICRDbGFzc1ByZWZlcmVuY2Vze05hbWVNb2R1bGV9WzBdIDogJyc7CiAgICBpZiAoJE5hbWVNb2R1bGUpIHsKCiAgICAgICAgIyBjaGVjayBpZiBuYW1lIG1vZHVsZSBleGlzdHMKICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCJLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok5hbWU6OiROYW1lTW9kdWxlIikgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIG5hbWUgbW9kdWxlIGZvciBjbGFzcyAkQ2xhc3NMaXN0LT57ICRQYXJhbXtDbGFzc0lEfSB9ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2ssIHdoZXRoZXIgdGhlIGZlYXR1cmUgdG8gY2hlY2sgZm9yIGEgdW5pcXVlIG5hbWUgaXMgZW5hYmxlZAogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdVbmlxdWVDSU5hbWU6OkVuYWJsZVVuaXF1ZW5lc3NDaGVjaycpICkgewoKICAgICAgICAgICAgbXkgJE5hbWVEdXBsaWNhdGVzID0gJFNlbGYtPlVuaXF1ZU5hbWVDaGVjaygKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAnTkVXJywKICAgICAgICAgICAgICAgIENsYXNzSUQgICAgICA9PiAkUGFyYW17Q2xhc3NJRH0sCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzdG9wIHByb2Nlc3NpbmcgaWYgdGhlIG5hbWUgaXMgbm90IHVuaXF1ZQogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkTmFtZUR1cGxpY2F0ZXMpICkgewoKICAgICAgICAgICAgICAgICMgYnVpbGQgYSBzdHJpbmcgb2YgYWxsIGR1cGxpY2F0ZSBJRHMKICAgICAgICAgICAgICAgIG15ICREdXBsaWNhdGVzID0gam9pbiAnLCAnLCBAeyROYW1lRHVwbGljYXRlc307CgogICAgICAgICAgICAgICAgIyB3cml0ZSBhbiBlcnJvciBsb2cgbWVzc2FnZSBjb250YWluaW5nIGFsbCB0aGUgZHVwbGljYXRlIElEcwogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIG5hbWUgJFBhcmFte05hbWV9IGlzIGFscmVhZHkgaW4gdXNlIChDb25maWdJdGVtSURzOiAkRHVwbGljYXRlcykhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmIElJCiAgICBpZiAoICEkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIE5hbWUhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQojICAgICMgaW5zZXJ0IG5ldyBjb25maWcgaXRlbQojICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5EbygKIyAgICAgICAgU1FMID0+ICdJTlNFUlQgSU5UTyBjb25maWdpdGVtICgnCiMgICAgICAgICAgICAuICdjb25maWdpdGVtX251bWJlciwgY3VyX2RlcGxfc3RhdGVfaWQsIGN1cl9pbmNpX3N0YXRlX2lkJwojICAgICAgICAgICAgLiAnLCBjbGFzc19pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieScKIyAgICAgICAgICAgIC4gJykgVkFMVUVTICg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKIyAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17TnVtYmVyfSwgXCRQYXJhbXtEZXBsU3RhdGVJRH0sIFwkUGFyYW17SW5jaVN0YXRlSUR9LCBcJFBhcmFte0NsYXNzSUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSBdLAojICAgICk7CiAgICBteSAkR3JvdXBJRCA9ICRQYXJhbXtHcm91cElEfSA/ICRQYXJhbXtHcm91cElEfSA6IHVuZGVmOwoKICAgICMgaW5zZXJ0IG5ldyBjb25maWcgaXRlbQogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gY29uZmlnaXRlbSAoJwogICAgICAgICAgICAuICdjb25maWdpdGVtX251bWJlciwgY3VyX2RlcGxfc3RhdGVfaWQsIGN1cl9pbmNpX3N0YXRlX2lkJwogICAgICAgICAgICAuICcsIGNsYXNzX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5LCBncm91cF9pZCcKICAgICAgICAgICAgLiAnKSBWQUxVRVMgKD8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte051bWJlcn0sIFwkUGFyYW17RGVwbFN0YXRlSUR9LCBcJFBhcmFte0luY2lTdGF0ZUlEfSwgXCRQYXJhbXtDbGFzc0lEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sIFwkR3JvdXBJRCBdLAogICAgKTsKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgICMgZmluZCBpZCBvZiBuZXcgaXRlbQogICAgIyBUT0RPOiB3aGF0IGFib3V0IGNvbmN1cnJlbnQgSU5TRVJUcyA/Pz8KICAgIG15ICgkQ29uZmlnSXRlbUlEKSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5TZWxlY3RSb3dBcnJheSgKICAgICAgICBTUUwgPT4gPDwnRU5EX1NRTCcsClNFTEVDVCBpZAogIEZST00gY29uZmlnaXRlbQogIFdIRVJFIGNvbmZpZ2l0ZW1fbnVtYmVyID0gPwogICAgQU5EIGNsYXNzX2lkID0gPwogIE9SREVSIEJZIGlkIERFU0MKRU5EX1NRTAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte051bWJlcn0sIFwkUGFyYW17Q2xhc3NJRH0gXSwKICAgICk7CgogICAgIyB0cmlnZ2VyIENvbmZpZ0l0ZW1DcmVhdGUKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0NvbmZpZ0l0ZW1DcmVhdGUnLAogICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkQ29uZmlnSXRlbUlEIC4gJyUlJyAuICRQYXJhbXtOdW1iZXJ9LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGFkZCB0aGUgZmlyc3QgdmVyc2lvbgogICAgbXkgJFZlcnNpb25JRCA9ICRTZWxmLT5WZXJzaW9uQWRkKAogICAgICAgIERlc2NyaXB0aW9uID0+ICcnLAogICAgICAgICVQYXJhbSwKICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICBMYXN0VmVyc2lvbiAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJ05FVycsCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAhJFZlcnNpb25JRCApIHsKCiAgICAgICAgIyBkZWxldGUgaGlzdG9yeSBlbnRyaWVzCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2hpc3RvcnkgV0hFUkUgY29uZmlnaXRlbV9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRDb25maWdJdGVtSUQgXSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSBjb25maWcgaXRlbSBpZiBubyB2ZXJzaW9uIGNvdWxkIGJlIGNyZWF0ZWQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+RG8oCiAgICAgICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkQ29uZmlnSXRlbUlEIF0sCiAgICAgICAgKTsKCiAgICAgICAgIyB3cml0ZSBhbiBlcnJvciBsb2cgbWVzc2FnZSBjb250YWluaW5nIGFsbCB0aGUgZHVwbGljYXRlIElEcwogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGNyZWF0ZSB2ZXJzaW9uISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkQ29uZmlnSXRlbUlEOwp9Cgo9aGVhZDIgQ29uZmlnSXRlbURlbGV0ZSgpCgpkZWxldGUgYW4gZXhpc3RpbmcgY29uZmlnIGl0ZW0KCiAgICBteSAkVHJ1ZSA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtRGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZmlnSXRlbUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtZW1iZXIgY29uZmlnIGl0ZW0gZGF0YSBiZWZvcmUgZGVsZXRlCiAgICBteSAkQ29uZmlnSXRlbURhdGEgPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGxpbmtzIHRvIHRoaXMgY29uZmlnIGl0ZW0gYmVmb3JlIGRlbGV0aW5nIHRoZSB2ZXJzaW9ucy4KICAgICMgTGlua0RlbGV0ZUFsbCgpIGNhbGxzIExpbmtEZWxldGUoKSBpbnRlcm5hbGx5LiBUaGlzIG1lYW5zIHRoYXQKICAgICMgdGhlIGV2ZW50IGhhbmRsZXJzIGFyZSBob25vcmVkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHRhYmxlIGNvbmZpZ2l0ZW1fbGluawogICAgIyBpcyBhbHNvIHB1cmdlZC4KICAgIHJldHVybiB1bmxlc3MgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QnKS0+TGlua0RlbGV0ZUFsbCgKICAgICAgICBPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICBLZXkgICAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBkeW5hbWljIGxpbmsgdGFibGUgZW50cmllcywgaWYgYW55CgogICAgbXkgJERCT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW1fbGluayBXSEVSRSBzb3VyY2VfY29uZmlnaXRlbV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CiAgICAkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCAgPT4gJ0RFTEVURSBGUk9NIGNvbmZpZ2l0ZW1fbGluayBXSEVSRSB0YXJnZXRfY29uZmlnaXRlbV9pZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBpZiB0aGVyZSBhcmUgc3RhdGljICh2ZXJzaW9uZWQpIGxpbmtzLCBkZWxldGUgYWxsIG9mIHRoZW0KICAgIG15ICRWZXJzaW9uTGlzdFJlZiA9ICRTZWxmLT5WZXJzaW9uTGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIGZvciBteSAkVmVyc2lvbklEIChAJFZlcnNpb25MaXN0UmVmKSB7CiAgICAgICAgJERCT2JqZWN0LT5EbygKICAgICAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbV9saW5rIFdIRVJFIHNvdXJjZV9jb25maWdpdGVtX3ZlcnNpb25faWQgPSA/JywKICAgICAgICAgICAgQmluZCA9PiBbIFwkVmVyc2lvbklEIF0sCiAgICAgICAgKTsKICAgICAgICAkREJPYmplY3QtPkRvKAogICAgICAgICAgICBTUUwgID0+ICdERUxFVEUgRlJPTSBjb25maWdpdGVtX2xpbmsgV0hFUkUgdGFyZ2V0X2NvbmZpZ2l0ZW1fdmVyc2lvbl9pZCA9ID8nLAogICAgICAgICAgICBCaW5kID0+IFsgXCRWZXJzaW9uSUQgXSwKICAgICAgICApOwogICAgfQoKICAgICMgZGVsZXRlIGV4aXN0aW5nIHZlcnNpb25zCiAgICAkU2VsZi0+VmVyc2lvbkRlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIGF0dGFjaG1lbnRzCiAgICBteSBARXhpc3RpbmdBdHRhY2htZW50cyA9ICRTZWxmLT5Db25maWdJdGVtQXR0YWNobWVudExpc3QoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgKTsKCiAgICAjIGRlbGV0ZSBhbGwgYXR0YWNobWVudHMgb2YgdGhpcyBjb25maWcgaXRlbQogICAgRklMRU5BTUU6CiAgICBmb3IgbXkgJEZpbGVuYW1lIChARXhpc3RpbmdBdHRhY2htZW50cykgewoKICAgICAgICAjIGRlbGV0ZSB0aGUgYXR0YWNobWVudAogICAgICAgIG15ICREZWxldGlvblN1Y2Nlc3MgPSAkU2VsZi0+Q29uZmlnSXRlbUF0dGFjaG1lbnREZWxldGUoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRGaWxlbmFtZSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIGlmICggISREZWxldGlvblN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVbmtub3duIHByb2JsZW0gd2hlbiBkZWxldGluZyBhdHRhY2htZW50ICRGaWxlbmFtZSBvZiBDb25maWdJdGVtICIKICAgICAgICAgICAgICAgICAgICAuICIkUGFyYW17Q29uZmlnSXRlbUlEfS4gUGxlYXNlIGNoZWNrIHRoZSBWaXJ0dWFsRlMgYmFja2VuZCBmb3Igc3RhbGUgIgogICAgICAgICAgICAgICAgICAgIC4gImZpbGVzISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtRGF0YS0+e0NsYXNzSUR9LAogICAgKTsKICAgIG15ICROYW1lTW9kdWxlID0gJENsYXNzUHJlZmVyZW5jZXN7TmFtZU1vZHVsZX0gPyAkQ2xhc3NQcmVmZXJlbmNlc3tOYW1lTW9kdWxlfVswXSA6ICcnOwogICAgaWYgKCROYW1lTW9kdWxlKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmFtZSBtb2R1bGUgZXhpc3RzCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCJLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06Ok5hbWU6OiROYW1lTW9kdWxlIikgKSB7CgogICAgICAgICAgICAjIGNyZWF0ZSBhIGJhY2tlbmQgb2JqZWN0CiAgICAgICAgICAgIG15ICROYW1lTW9kdWxlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgkTmFtZU1vZHVsZSk7CgogICAgICAgICAgICBpZiAoICROYW1lTW9kdWxlT2JqZWN0LT5jYW4oJ0NvbmZpZ0l0ZW1OYW1lRGVsZXRlJykgKSB7CiAgICAgICAgICAgICAgICAkTmFtZU1vZHVsZU9iamVjdC0+Q29uZmlnSXRlbU5hbWVEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSXRlbURhdGEtPntOYW1lfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIG5hbWUgbW9kdWxlIGZvciBjbGFzcyAkQ29uZmlnSXRlbURhdGEtPntDbGFzc30hIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmlnZ2VyIENvbmZpZ0l0ZW1EZWxldGUgZXZlbnQKICAgICMgdGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlIGRlbGV0aW5nIHRoZSBjb25maWcgaXRlbSBmcm9tIHRoZSBkYXRhYmFzZSwKICAgICMgYmVjYXVzZSBvZiBhIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgaW4gdGhlIGNvbmZpZ2l0ZW1faGlzdG9yeSB0YWJsZQogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ29uZmlnSXRlbURlbGV0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgTnVtYmVyICAgICAgID0+ICRDb25maWdJdGVtRGF0YS0+e051bWJlcn0sCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkQ29uZmlnSXRlbURhdGEtPntDbGFzc30sCiAgICAgICAgICAgIENvbmZpZ0l0ZW0gICA9PiAkQ29uZmlnSXRlbURhdGEsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZGVsZXRlIGNvbmZpZyBpdGVtCiAgICBteSAkU3VjY2VzcyA9ICREQk9iamVjdC0+RG8oCiAgICAgICAgU1FMICA9PiAnREVMRVRFIEZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0NvbmZpZ0l0ZW1JRH0gXSwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIGNhY2hlCiAgICBmb3IgbXkgJERGRGF0YSAoIDAsIDEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gam9pbigKICAgICAgICAgICAgICAgICc6OicsICdDb25maWdJdGVtR2V0JywKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIERGRGF0YSAgICAgICA9PiAkREZEYXRhCiAgICAgICAgICAgICksCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFN1Y2Nlc3M7Cn0KCj1oZWFkMiBDb25maWdJdGVtVXBkYXRlKCkKCnVwZGF0ZSBhIGNvbmZpZyBpdGVtLiBBIG5ldyB2ZXJzaW9uIHdpbGwgYmUgY3JlYXRlZCBvbmx5IHdoZW4gYSB2ZXJzaW9uIHRyaWdnZXIgYXBwbGllcy4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgID0+IDI3LAogICAgICAgIE51bWJlciAgICAgICAgID0+ICcxMTEnLCAgICAjIElEIG9yIE51bWJlciBpcyByZXF1aXJlZAogICAgICAgIFVzZXJJRCAgICAgICAgID0+IDEsCiAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ05hbWUnLCAgICMgb3B0aW9uYWwKICAgICAgICBEZWZpbml0aW9uSUQgICA9PiAxMjMsICAgICAgIyBvcHRpb25hbAogICAgICAgIERlcGxTdGF0ZUlEICAgID0+IDMsICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgSW5jaVN0YXRlSUQgICAgPT4gMiwgICAgICAgICMgb3B0aW9uYWwKICAgICAgICBEZXNjcmlwdGlvbiAgICA9PiAnQUJDRCcsICAgIyBvcHRpb25hbAogICAgICAgIER5bmFtaWNGaWVsZF9YID0+ICRWYWx1ZSwgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGxvb2t1cAogICAgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gLy89ICRTZWxmLT5Db25maWdJdGVtTG9va3VwKAogICAgICAgIENvbmZpZ0l0ZW1OdW1iZXIgPT4gJFBhcmFte051bWJlcn0sCiAgICApOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtZXRlcnMKICAgIGZvciBteSAkS2V5IChxdy9Db25maWdJdGVtSUQgVXNlcklELykgewogICAgICAgIGlmICggISRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgIiAuICggJEtleSBlcSAnQ29uZmlnSXRlbUlEJyA/ICdDb25maWdJdGVtSUQgb3IgTnVtYmVyJyA6ICRLZXkgKSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENhY2hlT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAjIGdhdGhlciBkeW5hbWljIGZpZWxkIGtleXMKICAgIG15IEBEeW5hbWljRmllbGROYW1lcyA9IG1hcAogICAgICAgIHttL15EeW5hbWljRmllbGRfKC4rKS99CiAgICAgICAgc29ydCBrZXlzICVQYXJhbTsKCiAgICAjIGdldCBjdXJyZW50IGNvbmZpZyBpdGVtLCBpbmNsdWRpbmcgaW5mbyBmcm9tIHRoZSBsYXN0IHZlcnNpb24KICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgIG15ICRDbGFzc0xpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2cnKS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICk7CiAgICBteSAkQ2xhc3MgPSAkQ2xhc3NMaXN0LT57ICRDb25maWdJdGVtLT57Q2xhc3NJRH0gfTsKCiAgICBpZiAoICEkQ2xhc3MgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBjbGFzcyBmb3VuZCBmb3IgaWQgJyRDb25maWdJdGVtLT57Q2xhc3NJRH0nIChDb25maWdJdGVtIyRDb25maWdJdGVtLT57TnVtYmVyfSkhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZ25vcmUgdGhlIHBhc3NlZCBpbiBuYW1lIHdoZW4gYSBuYW1lIG1vZHVsZSBpcyBhY3RpdmUKICAgIG15ICVDbGFzc1ByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+ICRDb25maWdJdGVtLT57Q2xhc3NJRH0sCiAgICApOwoKICAgICMgZXhlY3V0ZSBuYW1lIGNoZWNrIG9ubHkgaWYgbmFtZSBoYXMgY2hhbmdlZAogICAgbXkgJE5hbWVNb2R1bGUgPSAkQ2xhc3NQcmVmZXJlbmNlc3tOYW1lTW9kdWxlfSA/ICRDbGFzc1ByZWZlcmVuY2Vze05hbWVNb2R1bGV9WzBdIDogJyc7CiAgICBpZiAoJE5hbWVNb2R1bGUpIHsKCiAgICAgICAgIyBjaGVjayBpZiBuYW1lIG1vZHVsZSBleGlzdHMKICAgICAgICBpZiAoICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCROYW1lTW9kdWxlKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgbmFtZSBtb2R1bGUgZm9yIGNsYXNzICRDbGFzc0xpc3QtPnsgJFBhcmFte0NsYXNzSUR9IH0hIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGRlbGV0ZSAkUGFyYW17TmFtZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtOYW1lfSAmJiAkUGFyYW17TmFtZX0gbmUgJENvbmZpZ0l0ZW0tPntOYW1lfSApIHsKCiAgICAgICAgIyBjaGVjaywgd2hldGhlciB0aGUgZmVhdHVyZSB0byBjaGVjayBmb3IgYSB1bmlxdWUgbmFtZSBpcyBlbmFibGVkCiAgICAgICAgaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ1VuaXF1ZUNJTmFtZTo6RW5hYmxlVW5pcXVlbmVzc0NoZWNrJykgKSB7CgogICAgICAgICAgICBteSAkTmFtZUR1cGxpY2F0ZXMgPSAkU2VsZi0+VW5pcXVlTmFtZUNoZWNrKAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgID0+ICRQYXJhbXtDbGFzc0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHN0b3AgcHJvY2Vzc2luZyBpZiB0aGUgbmFtZSBpcyBub3QgdW5pcXVlCiAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCROYW1lRHVwbGljYXRlcykgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBhIHN0cmluZyBvZiBhbGwgZHVwbGljYXRlIElEcwogICAgICAgICAgICAgICAgbXkgJER1cGxpY2F0ZXMgPSBqb2luICcsICcsIEB7JE5hbWVEdXBsaWNhdGVzfTsKCiAgICAgICAgICAgICAgICAjIHdyaXRlIGFuIGVycm9yIGxvZyBtZXNzYWdlIGNvbnRhaW5pbmcgYWxsIHRoZSBkdXBsaWNhdGUgSURzCiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgbmFtZSAkUGFyYW17TmFtZX0gaXMgYWxyZWFkeSBpbiB1c2UgKENvbmZpZ0l0ZW1JRHM6ICREdXBsaWNhdGVzKSEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJVZlcnNpb25UcmlnZ2VyID0gbWFwCiAgICAgICAgeyAkXyA9PiAxIH0KICAgICAgICAoICRDbGFzc1ByZWZlcmVuY2Vze1ZlcnNpb25UcmlnZ2VyfSAvLyBbXSApLT5AKjsKCiAgICBteSAlQ2hhbmdlZDsgICAgICAgICAgICAgICMgdHJhY2sgY2hhbmdlZCB2YWx1ZXMgZm9yIHRoZSBFdmVudCBoYW5kbGVyLCBlLmcuIGZvciB3cml0aW5nIGhpc3RvcnkKICAgIG15ICRBZGRWZXJzaW9uICAgID0gMDsgICAgIyBmbGFnIGZvciBkZWNpZGluZyB3aGV0aGVyIGEgbmV3IHZlcnNpb24gaXMgY3JlYXRlZAogICAgbXkgJFVwZGF0ZVZlcnNpb24gPSAwOyAgICAjIGZsYWcgZm9yIGRlY2lkaW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgdmVyc2lvbiBuZWVkcyBhbiB1cGRhdGUKCiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiMgICAgIyBjaGVjayBuYW1lLCBkZXBsb3ltZW50IGFuZCBpbmNpZGVudCBzdGF0ZSwgYXMgd2VsbCBhcyBEZXNjcmlwdGlvbgojICAgIEFUVFI6CiMgICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3L05hbWUgRGVwbFN0YXRlSUQgSW5jaVN0YXRlSUQgRGVzY3JpcHRpb24vKSB7CiMgICAgICAgIG5leHQgQVRUUiB1bmxlc3MgZGVmaW5lZCAkUGFyYW17JEF0dHJpYnV0ZX07CiMgICAgICAgIG5leHQgQVRUUiBpZiAkUGFyYW17JEF0dHJpYnV0ZX0gZXEgJENvbmZpZ0l0ZW0tPnskQXR0cmlidXRlfTsKIwojICAgICAgICAkQ2hhbmdlZHskQXR0cmlidXRlfSA9IHsKIyAgICAgICAgICAgIE9sZCA9PiAkQ29uZmlnSXRlbS0+eyRBdHRyaWJ1dGV9LAojICAgICAgICAgICAgTmV3ID0+ICRQYXJhbXskQXR0cmlidXRlfSwKIyAgICAgICAgfTsKIwojICAgICAgICAkVXBkYXRlVmVyc2lvbiA9IDE7CiAgICBteSAkVXBkYXRlR3JvdXBJRCA9IDA7ICAgICMgZmxhZyBmb3IgZGVjaWRpbmcgd2hldGhlciB0aGUgY3VycmVudCBncm91cCBpZCBuZWVkcyBhbiB1cGRhdGUKCiAgICAjIGNoZWNrIG5hbWUsIGRlcGxveW1lbnQgYW5kIGluY2lkZW50IHN0YXRlLCBhcyB3ZWxsIGFzIERlc2NyaXB0aW9uIGFuZCBncm91cAogICAgQVRUUjoKICAgIGZvciBteSAkQXR0cmlidXRlIChxdy9OYW1lIERlcGxTdGF0ZUlEIEluY2lTdGF0ZUlEIERlc2NyaXB0aW9uIEdyb3VwSUQvKSB7CiAgICAgICAgbmV4dCBBVFRSIHVubGVzcyBkZWZpbmVkICRQYXJhbXskQXR0cmlidXRlfTsKICAgICAgICBuZXh0IEFUVFIgaWYgJFBhcmFteyRBdHRyaWJ1dGV9IGVxICRDb25maWdJdGVtLT57JEF0dHJpYnV0ZX07CgogICAgICAgICRDaGFuZ2VkeyRBdHRyaWJ1dGV9ID0gewogICAgICAgICAgICBPbGQgPT4gJENvbmZpZ0l0ZW0tPnskQXR0cmlidXRlfSwKICAgICAgICAgICAgTmV3ID0+ICRQYXJhbXskQXR0cmlidXRlfSwKICAgICAgICB9OwoKICAgICAgICAjIGNoYW5nZXMgdG8gR3JvdXBJRCBzaG91bGQgbm90IHRyaWdnZXIgVmVyc2lvbkFkZCBvciBWZXJzaW9uVXBkYXRlCiAgICAgICAgIyBUaHVzIGl0cyB1cGRhdGUgaGFzIHRvIGJlIHBlcmZvcm1lZCBsb2NhbGx5IGluIHRoaXMgbW9kdWxlCiAgICAgICAgaWYgKCRBdHRyaWJ1dGUgZXEgJ0dyb3VwSUQnKSB7CiAgICAgICAgICAgICRVcGRhdGVHcm91cElEID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRVcGRhdGVWZXJzaW9uID0gMTsKICAgICAgICB9CgogICAgICAgIGlmICggJFZlcnNpb25UcmlnZ2VyeyRBdHRyaWJ1dGV9ICkgewogICAgICAgICAgICAkQWRkVmVyc2lvbiA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgdGhlIGNvcm5lciBjYXNlIGluIHdoaWNoIHRoZSBHcm91cElEIHdhcyB1cGRhdGVkIHRvIG51bGwKICAgIGlmICgkQ29uZmlnSXRlbS0+e0dyb3VwSUR9ICYmICEkUGFyYW17R3JvdXBJRH0pIHsKICAgICAgICAkVXBkYXRlR3JvdXBJRCA9IDE7CiAgICAgICAgJENoYW5nZWR7R3JvdXBJRH0gPSB7CiAgICAgICAgICAgIE9sZCA9PiAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9LAogICAgICAgICAgICBOZXcgPT4gdW5kZWYsCiAgICAgICAgfTsKICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgICMgZ2V0IGxhdGVzdCBkZWZpbml0aW9uIGZvciB0aGUgY2xhc3MKICAgIG15ICREZWZpbml0aW9uID0gJFNlbGYtPkRlZmluaXRpb25HZXQoCiAgICAgICAgQ2xhc3NJRCA9PiAkQ29uZmlnSXRlbS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICBteSAlU2tpcEZvclVwZGF0ZURGczsKCiAgICAjIGNoZWNrIGZvciBjaGFuZ2VkIGR5bmFtaWMgZmllbGRzIHRvIHRyaWdnZXIgdmVyc2lvbnMgYW5kIGZpbHRlciBoaXN0b3J5IGVudHJpZXMKICAgIGlmIChARHluYW1pY0ZpZWxkTmFtZXMpIHsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkT2JqZWN0ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgIyBkeW5hbWljIGZpZWxkcwogICAgICAgIE5BTUU6CiAgICAgICAgZm9yIG15ICROYW1lIChARHluYW1pY0ZpZWxkTmFtZXMpIHsKICAgICAgICAgICAgbmV4dCBOQU1FIHVubGVzcyAkRGVmaW5pdGlvbi0+e0R5bmFtaWNGaWVsZFJlZn17JE5hbWV9OwoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgIE5hbWUgPT4gJE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlSXNEaWZmZXJlbnQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUxICAgICAgICAgICAgID0+ICRQYXJhbXsiRHluYW1pY0ZpZWxkXyROYW1lIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUyICAgICAgICAgICAgID0+ICRDb25maWdJdGVtLT57IkR5bmFtaWNGaWVsZF8kTmFtZSJ9LAogICAgICAgICAgICAgICAgICAgIEV4dGVybmFsU291cmNlICAgICA9PiAkUGFyYW17RXh0ZXJuYWxTb3VyY2V9LAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAjIGRvIG5vdCBwYXNzIHVuY2hhbmdlZCBkeW5hbWljIGZpZWxkcyB0byBWZXJzaW9uVXBkYXRlKCkKICAgICAgICAgICAgICAgICMgc3RvcmUgdGhlbSBmb3IgVmVyc2lvbkFkZCgpIGJlY2F1c2Ugb2YgcG90ZW50aWFsIGRpZmZlcmVuY2UgZnJvbSBFeHRlcm5hbFNvdXJjZQogICAgICAgICAgICAgICAgJFNraXBGb3JVcGRhdGVERnN7IkR5bmFtaWNGaWVsZF8kTmFtZSJ9ID0gZGVsZXRlICRQYXJhbXsiRHluYW1pY0ZpZWxkXyROYW1lIn07CgogICAgICAgICAgICAgICAgbmV4dCBOQU1FOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVXBkYXRlVmVyc2lvbiA9IDE7CgogICAgICAgICAgICBpZiAoICRWZXJzaW9uVHJpZ2dlcnsiRHluYW1pY0ZpZWxkXyROYW1lIn0gKSB7CiAgICAgICAgICAgICAgICAkQWRkVmVyc2lvbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgUm90aGVyIE9TUyAvIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CiAgICBpZiAoJFVwZGF0ZUdyb3VwSUQpIHsKCiAgICAgICAgIyB1cGRhdGUgY3VycmVudCBncm91cCBpZAogICAgICAgIG15ICRTdWNjZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgID0+ICdVUERBVEUgY29uZmlnaXRlbSBTRVQgZ3JvdXBfaWQgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENoYW5nZWR7R3JvdXBJRH17TmV3fSwgXCRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDbGVhciB0aGUgY2FjaGUgZm9yIENvbmZpZ0l0ZW1HZXQKICAgICAgICBteSAkVmVyc2lvbkxpc3QgPSAkU2VsZi0+VmVyc2lvbkxpc3QoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkREZEYXRhIChxdygwIDEpKSB7CiAgICAgICAgICAgIGZvciBteSAkVmVyc2lvbklEICgkVmVyc2lvbkxpc3QtPkAqKSB7CiAgICAgICAgICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgICAgICBLZXkgID0+IGpvaW4oCiAgICAgICAgICAgICAgICAgICAgICAgICc6OicsICdDb25maWdJdGVtR2V0JywKICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbklEID0+ICRWZXJzaW9uSUQsCiAgICAgICAgICAgICAgICAgICAgICAgIERGRGF0YSAgICA9PiAkREZEYXRhCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gam9pbigKICAgICAgICAgICAgICAgICAgICAnOjonLCAnQ29uZmlnSXRlbUdldCcsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIERGRGF0YSAgICAgICA9PiAkREZEYXRhCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgIGlmICgkQWRkVmVyc2lvbikgewogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPlZlcnNpb25BZGQoCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRDb25maWdJdGVtLT57RGVzY3JpcHRpb259IC8vICcnLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVTa2lwRm9yVXBkYXRlREZzLAogICAgICAgICAgICBMYXN0VmVyc2lvbiA9PiAkQ29uZmlnSXRlbSwKICAgICAgICApOwogICAgICAgIHJldHVybiB1bmxlc3MgJFN1Y2Nlc3M7CiAgICB9CiAgICBlbHNpZiAoJFVwZGF0ZVZlcnNpb24pIHsKICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT5WZXJzaW9uVXBkYXRlKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIFZlcnNpb24gPT4gJENvbmZpZ0l0ZW0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gdW5sZXNzICRTdWNjZXNzOwogICAgfQoKICAgIG15ICVFdmVudHMgPSAoCiAgICAgICAgTmFtZSAgICAgICAgPT4gJ05hbWVVcGRhdGUnLAogICAgICAgIERlcGxTdGF0ZUlEID0+ICdEZXBsb3ltZW50U3RhdGVVcGRhdGUnLAogICAgICAgIEluY2lTdGF0ZUlEID0+ICdJbmNpZGVudFN0YXRlVXBkYXRlJywKICAgICk7CgogICAgQ0hBTkdFOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICVDaGFuZ2VkICkgewogICAgICAgIG5leHQgQ0hBTkdFIGlmICEkRXZlbnRzeyRLZXl9OwoKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAkRXZlbnRzeyRLZXl9LAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgQ29tbWVudCAgICAgID0+ICRDaGFuZ2VkeyRLZXl9e05ld30gLiAnJSUnIC4gJENoYW5nZWR7JEtleX17T2xkfSwKICAgICAgICAgICAgICAgIE9sZCAgICAgICAgICA9PiAkQ2hhbmdlZHskS2V5fXtPbGR9LAogICAgICAgICAgICAgICAgTmV3ICAgICAgICAgID0+ICRDaGFuZ2VkeyRLZXl9e05ld30sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJpZ2dlciBDb25maWdJdGVtVXBkYXRlIGJ1dCBvbmx5IGlmIHRoZXJlIHdlcmUgdXBkYXRlcwogICAgaWYgKCAkQWRkVmVyc2lvbiB8fCAkVXBkYXRlVmVyc2lvbiB8fCAlQ2hhbmdlZCApIHsKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQ29uZmlnSXRlbVVwZGF0ZScsCiAgICAgICAgICAgIERhdGEgID0+IHsKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkQ29uZmlnSXRlbS0+e0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJENvbmZpZ0l0ZW0tPntDb25maWdJdGVtSUR9IC4gJyUlJyAuICRDb25maWdJdGVtLT57TnVtYmVyfSwKICAgICAgICAgICAgICAgIE9sZERlcGxTdGF0ZSA9PiAkQ2hhbmdlZHtEZXBsU3RhdGVJRH17T2xkfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb25maWdJdGVtQXR0YWNobWVudEFkZCgpCgphZGRzIGFuIGF0dGFjaG1lbnQgdG8gYSBjb25maWcgaXRlbQoKICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50QWRkKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICA9PiAxLAogICAgICAgIEZpbGVuYW1lICAgICAgICA9PiAnZmlsZW5hbWUnLAogICAgICAgIENvbnRlbnQgICAgICAgICA9PiAnY29udGVudCcsCiAgICAgICAgQ29udGVudFR5cGUgICAgID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUF0dGFjaG1lbnRBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCBGaWxlbmFtZSBDb250ZW50IENvbnRlbnRUeXBlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyB3cml0ZSB0byB2aXJ0dWFsIGZzCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+V3JpdGUoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gIkNvbmZpZ0l0ZW0vJFBhcmFte0NvbmZpZ0l0ZW1JRH0vJFBhcmFte0ZpbGVuYW1lfSIsCiAgICAgICAgTW9kZSAgICAgICAgPT4gJ2JpbmFyeScsCiAgICAgICAgQ29udGVudCAgICAgPT4gXCRQYXJhbXtDb250ZW50fSwKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIENvbnRlbnRJRCAgICA9PiAkUGFyYW17Q29udGVudElEfSwKICAgICAgICAgICAgQ29udGVudFR5cGUgID0+ICRQYXJhbXtDb250ZW50VHlwZX0sCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgY2hlY2sgZm9yIGVycm9yCiAgICBpZiAoJFN1Y2Nlc3MpIHsKCiAgICAgICAgIyB0cmlnZ2VyIEF0dGFjaG1lbnRBZGQtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQXR0YWNobWVudEFkZFBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnQXR0YWNobWVudEFkZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgYWRkIGF0dGFjaG1lbnQgZm9yIGNvbmZpZyBpdGVtICRQYXJhbXtDb25maWdJdGVtSUR9IiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMiBDb25maWdJdGVtQXR0YWNobWVudERlbGV0ZSgpCgpEZWxldGUgdGhlIGdpdmVuIGZpbGUgZnJvbSB0aGUgdmlydHVhbCBmaWxlc3lzdGVtLgoKICAgIG15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50RGVsZXRlKAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsICAgICAgICAgICAgICAgIyB1c2VkIGluIGV2ZW50IGhhbmRsaW5nLCBlLmcuIGZvciBsb2dnaW5nIHRoZSBoaXN0b3J5CiAgICAgICAgRmlsZW5hbWUgICAgID0+ICdQcm9qZWN0cGxhbi5wZGYnLCAjIGlkZW50aWZpZXMgdGhlIGF0dGFjaG1lbnQgKHRvZ2V0aGVyIHdpdGggdGhlIENvbmZpZ0l0ZW1JRCkKICAgICAgICBVc2VySUQgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUF0dGFjaG1lbnREZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCBGaWxlbmFtZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHByZWZpeAogICAgbXkgJEZpbGVuYW1lID0gJ0NvbmZpZ0l0ZW0vJyAuICRQYXJhbXtDb25maWdJdGVtSUR9IC4gJy8nIC4gJFBhcmFte0ZpbGVuYW1lfTsKCiAgICAjIGRlbGV0ZSBmaWxlCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+RGVsZXRlKAogICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICk7CgogICAgIyBjaGVjayBmb3IgZXJyb3IKICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAjIHRyaWdnZXIgQXR0YWNobWVudERlbGV0ZVBvc3QtRXZlbnQKICAgICAgICAkU2VsZi0+RXZlbnRIYW5kbGVyKAogICAgICAgICAgICBFdmVudCA9PiAnQXR0YWNobWVudERlbGV0ZVBvc3QnLAogICAgICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnQXR0YWNobWVudERlbGV0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW5ub3QgZGVsZXRlIGF0dGFjaG1lbnQgJEZpbGVuYW1lISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkU3VjY2VzczsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1BdHRhY2htZW50R2V0KCkKClRoaXMgbWV0aG9kIHJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgb25lIHNwZWNpZmljIGF0dGFjaG1lbnQuCgogICAgbXkgJEF0dGFjaG1lbnQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRHZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDQsCiAgICAgICAgRmlsZW5hbWUgICAgID0+ICd0ZXN0LnR4dCcsCiAgICApOwoKcmV0dXJucwoKICAgIHsKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEFsbFByZWZlcmVuY2VzID0+ICd0ZXN0JywKICAgICAgICB9LAogICAgICAgIEZpbGVuYW1lICAgID0+ICd0ZXN0LnR4dCcsCiAgICAgICAgQ29udGVudCAgICAgPT4gJ2NvbnRlbnQnLAogICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICBGaWxlc2l6ZSAgICA9PiAxMjM0ODQwOSwKICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICB9Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUF0dGFjaG1lbnRHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29uZmlnSXRlbUlEIEZpbGVuYW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBwcmVmaXgKICAgIG15ICRGaWxlbmFtZSA9ICdDb25maWdJdGVtLycgLiAkUGFyYW17Q29uZmlnSXRlbUlEfSAuICcvJyAuICRQYXJhbXtGaWxlbmFtZX07CgogICAgIyBmaW5kIGFsbCBhdHRhY2htZW50cyBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkZpbmQoCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lLAogICAgICAgIFByZWZlcmVuY2VzID0+IHsKICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIH0sCiAgICApOwoKICAgICMgcmV0dXJuIGVycm9yIGlmIGZpbGUgZG9lcyBub3QgZXhpc3QKICAgIGlmICggIUBBdHRhY2htZW50cyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHN1Y2ggYXR0YWNobWVudCAoJEZpbGVuYW1lKSEiLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZm9yIGF0dGFjaG1lbnQKICAgIG15ICVBdHRhY2htZW50RGF0YSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+UmVhZCgKICAgICAgICBGaWxlbmFtZSA9PiAkRmlsZW5hbWUsCiAgICAgICAgTW9kZSAgICAgPT4gJ2JpbmFyeScsCiAgICApOwoKICAgIG15ICRBdHRhY2htZW50SW5mbyA9IHsKICAgICAgICAlQXR0YWNobWVudERhdGEsCiAgICAgICAgRmlsZW5hbWUgICAgPT4gJFBhcmFte0ZpbGVuYW1lfSwKICAgICAgICBDb250ZW50ICAgICA9PiAkeyAkQXR0YWNobWVudERhdGF7Q29udGVudH0gfSwKICAgICAgICBDb250ZW50VHlwZSA9PiAkQXR0YWNobWVudERhdGF7UHJlZmVyZW5jZXN9e0NvbnRlbnRUeXBlfSwKICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgRmlsZXNpemUgICAgPT4gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfXtGaWxlc2l6ZVJhd30sCiAgICB9OwoKICAgIHJldHVybiAkQXR0YWNobWVudEluZm87Cn0KCj1oZWFkMiBDb25maWdJdGVtQXR0YWNobWVudExpc3QoKQoKUmV0dXJucyBhbiBhcnJheSB3aXRoIGFsbCBhdHRhY2htZW50cyBvZiB0aGUgZ2l2ZW4gY29uZmlnIGl0ZW0uCgogICAgbXkgQEF0dGFjaG1lbnRzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1BdHRhY2htZW50TGlzdCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgKTsKCnJldHVybnMKCiAgICBAQXR0YWNobWVudHMgPSAoCiAgICAgICAgJ2ZpbGVuYW1lLnR4dCcsCiAgICAgICAgJ290aGVyX2ZpbGUucGRmJywKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUF0dGFjaG1lbnRMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGFsbCBhdHRhY2htZW50cyBvZiB0aGlzIGNvbmZpZyBpdGVtCiAgICBteSBAQXR0YWNobWVudHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmlydHVhbEZTJyktPkZpbmQoCiAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgfSwKICAgICk7CgogICAgZm9yIG15ICRGaWxlbmFtZSAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICMgcmVtb3ZlIGV4dHJhIGluZm9ybWF0aW9uIGZyb20gZmlsZW5hbWUKICAgICAgICAkRmlsZW5hbWUgPX4gc3sgXEEgQ29uZmlnSXRlbSAvIFxkKyAvIH17fXhtczsKICAgIH0KCiAgICByZXR1cm4gQEF0dGFjaG1lbnRzOwp9Cgo9aGVhZDIgQ29uZmlnSXRlbUF0dGFjaG1lbnRFeGlzdHMoKQoKQ2hlY2tzIGlmIGEgZmlsZSB3aXRoIGEgZ2l2ZW4gZmlsZW5hbWUgZXhpc3RzLgoKICAgIG15ICRFeGlzdHMgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUF0dGFjaG1lbnRFeGlzdHMoCiAgICAgICAgRmlsZW5hbWUgPT4gJ3Rlc3QudHh0JywKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1BdHRhY2htZW50RXhpc3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhGaWxlbmFtZSBDb25maWdJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWaXJ0dWFsRlMnKS0+RmluZCgKICAgICAgICBGaWxlbmFtZSA9PiAnQ29uZmlnSXRlbS8nIC4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gLiAnLycgLiAkUGFyYW17RmlsZW5hbWV9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIENvbmZpZ0l0ZW1Mb29rdXAoKQoKVGhpcyBtZXRob2QgZG9lcyBhIGxvb2t1cCBmb3IgYSBjb25maWctaXRlbS4gSWYgYSBjb25maWctaXRlbSBpZCBpcyBnaXZlbiwKaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHRoZSBjb25maWctaXRlbS4gSWYgYSBjb25maWctaXRlbSBudW1iZXIgaXMgZ2l2ZW4sCnRoZSBhcHByb3ByaWF0ZSBpZCBpcyByZXR1cm5lZC4KCiAgICBteSAkTnVtYmVyID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1Mb29rdXAoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IDEyMzQsCiAgICApOwoKb3IKCiAgICBteSAkSUQgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbUxvb2t1cCgKICAgICAgICBDb25maWdJdGVtTnVtYmVyID0+IDEwMDAwMDEsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ0l0ZW1Mb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAoJEtleSkgPSBmaXJzdCB7ICRQYXJhbXskX30gfSBxdyhDb25maWdJdGVtSUQgQ29uZmlnSXRlbU51bWJlcik7CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkS2V5ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQgb3IgQ29uZmlnSXRlbU51bWJlciEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIHJlc3VsdCBpcyBjYWNoZWQgcmV0dXJuIHRoYXQgcmVzdWx0CiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX17Q29uZmlnSXRlbUxvb2t1cH17JEtleX17ICRQYXJhbXskS2V5fSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX17Q29uZmlnSXRlbUxvb2t1cH17JEtleX17ICRQYXJhbXskS2V5fSB9OwoKICAgICMgc2V0IHRoZSBhcHByb3ByaWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gJEtleSBlcSAnQ29uZmlnSXRlbU51bWJlcicKICAgICAgICA/CiAgICAgICAgJ1NFTEVDVCBpZCAgICAgICAgICAgICAgICBGUk9NIGNvbmZpZ2l0ZW0gV0hFUkUgY29uZmlnaXRlbV9udW1iZXIgPSA/JwogICAgICAgIDoKICAgICAgICAnU0VMRUNUIGNvbmZpZ2l0ZW1fbnVtYmVyIEZST00gY29uZmlnaXRlbSBXSEVSRSBpZCA9ID8nOwoKICAgICMgZmV0Y2ggdGhlIHJlcXVlc3RlZCB2YWx1ZQogICAgcmV0dXJuIHVubGVzcyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXskS2V5fSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgIG15ICRWYWx1ZTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJFZhbHVlID0gJFJvd1swXTsKICAgIH0KCiAgICAkU2VsZi0+e0NhY2hlfXtDb25maWdJdGVtTG9va3VwfXskS2V5fXsgJFBhcmFteyRLZXl9IH0gPSAkVmFsdWU7CgogICAgcmV0dXJuICRWYWx1ZTsKfQoKPWhlYWQyIFVuaXF1ZU5hbWVDaGVjaygpCgpUaGlzIG1ldGhvZCBjaGVja3MgYWxsIGFscmVhZHkgZXhpc3RpbmcgY29uZmlnIGl0ZW1zLCB3aGV0aGVyIHRoZSBnaXZlbiBuYW1lIGRvZXMgYWxyZWFkeSBleGlzdAp3aXRoaW4gdGhlIHNhbWUgY29uZmlnIGl0ZW0gY2xhc3Mgb3IgYW1vbmcgYWxsIGNsYXNzZXMsIGRlcGVuZGluZyBvbiB0aGUgU3lzQ29uZmlnIHZhbHVlIG9mClVuaXF1ZUNJTmFtZTo6VW5pcXVlbmVzc0NoZWNrU2NvcGUgKENsYXNzIG9yIEdsb2JhbCkuCgpUaGlzIG1ldGhvZCByZXF1aXJlcyAzIHBhcmFtZXRlcnM6IENvbmZpZ0l0ZW1JRCwgTmFtZSBhbmQgQ2xhc3MKIkNvbmZpZ0l0ZW1JRCIgIGlzIHRoZSBJRCBvZiB0aGUgQ29uZmlnSXRlbSwgd2hpY2ggaXMgdG8gYmUgY2hlY2tlZCBmb3IgdW5pcXVlbmVzcwoiTmFtZSIgICAgICAgICAgaXMgdGhlIGNvbmZpZyBpdGVtIG5hbWUgdG8gYmUgY2hlY2tlZCBmb3IgdW5pcXVlbmVzcwoiQ2xhc3NJRCIgICAgICAgaXMgdGhlIElEIG9mIHRoZSBjb25maWcgaXRlbSdzIGNsYXNzCgpBbGwgcGFyYW1ldGVycyBhcmUgbWFuZGF0b3J5LgoKICAgIG15ICREdXBsaWNhdGVOYW1lcyA9ICRDb25maWdJdGVtT2JqZWN0LT5VbmlxdWVOYW1lQ2hlY2soCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICc3MycKICAgICAgICBOYW1lICAgICAgICAgPT4gJ1BDIzAwNScsCiAgICAgICAgQ2xhc3NJRCAgICAgID0+ICczMicsCiAgICApOwoKVGhlIGdpdmVuIG5hbWUgaXMgbm90IHVuaXF1ZQoKICAgIG15ICROYW1lRHVwbGljYXRlcyA9IFsgNSwgMzUsIDQ4LCBdOyAgICAjIElEcyBvZiBDb25maWdJdGVtcyB3aXRoIHRoZSBzYW1lIG5hbWUKClRoZSBnaXZlbiBuYW1lIGlzIHVuaXF1ZQoKICAgIG15ICROYW1lRHVwbGljYXRlcyA9IFtdOwoKPWN1dAoKc3ViIFVuaXF1ZU5hbWVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCBOYW1lIENsYXNzSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTWlzc2luZyBwYXJhbWV0ZXIgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgQ29uZmlnSXRlbUlEIHBhcmFtIGZvciB2YWxpZCBmb3JtYXQKICAgIGlmICgKICAgICAgICAhSXNJbnRlZ2VyKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApCiAgICAgICAgJiYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApICYmICRQYXJhbXtDb25maWdJdGVtSUR9IG5lICdORVcnICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgQ29uZmlnSXRlbUlEIHBhcmFtZXRlciBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIG9yICdORVcnIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIE5hbWUgcGFyYW0gZm9yIHZhbGlkIGZvcm1hdAogICAgaWYgKCAhSXNTdHJpbmdXaXRoRGF0YSggJFBhcmFte05hbWV9ICkgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJUaGUgTmFtZSBwYXJhbWV0ZXIgbmVlZHMgdG8gYmUgYSBzdHJpbmchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIENsYXNzSUQgcGFyYW0gZm9yIHZhbGlkIGZvcm1hdAogICAgaWYgKCAhSXNJbnRlZ2VyKCAkUGFyYW17Q2xhc3NJRH0gKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBDbGFzc0lEIHBhcmFtZXRlciBuZWVkcyB0byBiZSBhbiBpbnRlZ2VyIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBsaXN0CiAgICBteSAkQ2xhc3NMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICApOwoKICAgICMgY2hlY2sgY2xhc3MgbGlzdCBmb3IgdmFsaWRpdHkKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRDbGFzc0xpc3QpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVW5hYmxlIHRvIHJldHJpZXZlIGEgdmFsaWQgY2xhc3MgbGlzdCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBjbGFzcyBuYW1lIGZyb20gdGhlIGNsYXNzIGxpc3QKICAgIG15ICRDbGFzcyA9ICRDbGFzc0xpc3QtPnsgJFBhcmFte0NsYXNzSUR9IH07CgogICAgIyBjaGVjayBjbGFzcyBmb3IgdmFsaWRpdHkKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoJENsYXNzKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuYWJsZSB0byBkZXRlcm1pbmUgYSBjb25maWcgaXRlbSBjbGFzcyB1c2luZyB0aGUgZ2l2ZW4gQ2xhc3NJRCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZWxzaWYgKCAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT57RGVidWd9ID4gMCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlc29sdmVkIENsYXNzSUQgJFBhcmFte0NsYXNzSUR9IHRvIGNsYXNzICRDbGFzcyIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB0aGUgdW5pcXVlbmVzcyBzY29wZSBmcm9tIFN5c0NvbmZpZwogICAgbXkgJFNjb3BlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdVbmlxdWVDSU5hbWU6OlVuaXF1ZW5lc3NDaGVja1Njb3BlJyk7CgogICAgIyBjaGVjayBzY29wZSBmb3IgdmFsaWRpdHkKICAgIGlmICggIUlzU3RyaW5nV2l0aERhdGEoJFNjb3BlKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBjb25maWd1cmF0aW9uIG9mIFVuaXF1ZUNJTmFtZTo6VW5pcXVlbmVzc0NoZWNrU2NvcGUgaXMgaW52YWxpZCEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRTY29wZSBuZSAnZ2xvYmFsJyAmJiAkU2NvcGUgbmUgJ2NsYXNzJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVuaXF1ZUNJTmFtZTo6VW5pcXVlbmVzc0NoZWNrU2NvcGUgaXMgJFNjb3BlLCBidXQgbXVzdCBiZSBlaXRoZXIgIgogICAgICAgICAgICAgICAgLiAiJ2dsb2JhbCcgb3IgJ2NsYXNzJyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPntEZWJ1Z30gPiAwICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHNjb3BlIGZvciBjaGVja2luZyB0aGUgdW5pcXVlbmVzcyBpcyAkU2NvcGUiLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJVNlYXJjaENyaXRlcmlhOwoKICAgICMgYWRkIHRoZSBjb25maWcgaXRlbSBjbGFzcyB0byB0aGUgc2VhcmNoIGNyaXRlcmlhIGlmIHRoZSB1bmlxdWVuZXNzIHNjb3BlIGlzIG5vdCBnbG9iYWwKICAgIGlmICggJFNjb3BlIG5lICdnbG9iYWwnICkgewogICAgICAgICRTZWFyY2hDcml0ZXJpYXtDbGFzc0lEc30gPSBbICRQYXJhbXtDbGFzc0lEfSBdOwogICAgfQoKICAgICRTZWFyY2hDcml0ZXJpYXtOYW1lfSA9ICRQYXJhbXtOYW1lfTsKCiAgICAjIHNlYXJjaCBmb3IgYSBjb25maWcgaXRlbSBtYXRjaGluZyB0aGUgZ2l2ZW4gbmFtZQogICAgbXkgQENvbmZpZ0l0ZW1JRHMgPSAkU2VsZi0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICAlU2VhcmNoQ3JpdGVyaWEsCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScKICAgICk7CgogICAgIyByZW1vdmUgdGhlIHByb3ZpZGVkIENvbmZpZ0l0ZW1JRCBmcm9tIHRoZSByZXN1bHRzLCBvdGhlcndpc2UgdGhlIGR1cGxpY2F0ZSBjaGVjayB3b3VsZCBmYWlsCiAgICAjIGJlY2F1c2UgdGhlIENvbmZpZ0l0ZW0gaXRzZWxmIGlzIGZvdW5kIGFzIGR1cGxpY2F0ZQogICAgbXkgQER1cGxpY2F0ZXMgPSBncmVwIHsgJF8gbmUgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfSBAQ29uZmlnSXRlbUlEczsKCiAgICAjIGlmIGEgY29uZmlnIGl0ZW0gd2FzIGZvdW5kLCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgdW5pcXVlCiAgICAjIGlmIG5vIGNvbmZpZyBpdGVtIHdhcyBmb3VuZCwgdGhlIGdpdmVuIG5hbWUgaXMgdW5pcXVlCgogICAgIyByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgY29uZmlnIGl0ZW0gc2VhcmNoIGZvciBkdXBsaWNhdGVzCiAgICByZXR1cm4gXEBEdXBsaWNhdGVzOwp9Cgo9aGVhZDIgQ3VySW5jaVN0YXRlUmVjYWxjKCkKCnJlY2FsY3VsYXRlcyB0aGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBvZiB0aGlzIGNvbmZpZyBpdGVtIGFuZCBvZiBjb25maWcgaXRlbXMKdGhhdCBhcmUgbGlua2VkIHRvIGl0LiBPbmx5IGxpbmtzIGJldHdlZW4gY29uZmlnIGl0ZW1zIGFyZSBjb25zaWRlcmVkIGhlcmUuIExpbmtzIHRvCm9yIGZyb20gY29uZmlnIGl0ZW0gdmVyc2lvbnMgYXJlIGlnbm9yZWQuCgpUaGUgY3VycmVudCBpbmNpZGVudCBzdGF0ZSBkZXBlbmRzIG9uIHRoZSBpbmNpZGVudCBzdGF0ZXMgdGhhdCB0aGlzIGNvbmZpZyBpdGVtIGRlcGVuZHMgb24uCkEgY2hhbmdlIG9mIHRoZSBpbmNpZGVudCBzdGF0ZSBtaWdodCBoYXZlIHJlcGVyY3Vzc2lvbnMgb24gdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUKb2YgdGhlIGNvbmZpZyBpdGVtcyB0aGF0IGRlcGVuZCBvbiB0aGlzIGNvbmZpZyBpdGVtLgoKSXQgaXMgYSBjb21tb24gdXNlIGNhc2UgdGhhdCBDPEN1ckluY2lTdGF0ZVJlY2FsYygpPiBpcyBjYWxsZWQgaW4gYSBsb29wIG92ZXIgYSBsaXN0IG9mIGNvbmZpZyBpdGVtcy4KRXhhbXBsZXMgYXJlIHRoZSBjb25zb2xlIGNvbW1hbmQgQzxBZG1pbjo6SVRTTTo6SW5jaWRlbnRTdGF0ZTo6UmVjYWxjdWxhdGU+IG9yIHdoZW4gdGhlIGxpbmtpbmcKb2YgdGhlIGNvbmZpZyBpdGVtcyBoYXMgY2hhbmdlZC4gRm9yIG9wdGltaXppbmcgdGhhdCBjYXNlIHRoZXJlIGFyZSB0aGUgcGFyYW1ldGVycwpDPE5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlPiBhbmQgQzxTY2FubmVkQ29uZmlnSXRlbUlEcz4gd2hpY2ggY2Fycnkgc3RhdGUgYmV0d2VlbgppbnZvY2F0aW9ucyBvZiB0aGlzIG1ldGhvZC4gVGhleSBwcm92aWRlIGNhY2hpbmcgYW5kIHByZXZlbnQgaW5maW5pdGUgbG9vcHMuCgpDaGFuZ2luZyB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgY29uZmlnIGl0ZW1zIGhhcyByZXBlcmN1c3Npb25zIG9uIHNlcnZpY2VzLiBUaGVzZSBlZmZlY3RzCmFyZSBoYW5kbGVkIGluIHRoaXMgbWV0aG9kIGFzIHdlbGwuCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q3VySW5jaVN0YXRlUmVjYWxjKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgICAgICAgID0+IDEyMywKICAgICAgICBOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZSA9PiAkTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUsICAjIG9wdGlvbmFsLCBpbmNpZGVudCBzdGF0ZXMgb2YgYWxyZWFkeSBjaGVja2VkIENJcwogICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzICAgICAgID0+ICRTY2FubmVkQ29uZmlnSXRlbUlEcywgICAgICAgICMgb3B0aW9uYWwsIElEcyBhbmQgaW5jaWRlbnQgc3RhdGVzIG9mIGFscmVhZHkgY2hlY2tlZCBDSXMKICAgICk7CgpGb3IgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbiBpdCBpcyBjb252ZW5pZW50IHRvIHBhc3MgYSBsaXN0IG9mIGNvbmZpZyBpdGVtcyB0byBDPEN1ckluY2lTdGF0ZVJlY2FsYygpPi4KCiAgICBteSAkU3VjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5DdXJJbmNpU3RhdGVSZWNhbGMoCiAgICAgICAgQ29uZmlnSXRlbUlEcyAgICAgICAgICAgICAgPT4gWyAxMjMsIDEyNCwgMTI1IF0sCiAgICApOwoKSW4gdGhhdCBjYXNlIHRoZSBsb29wIGlzIGRpc2NvbnRpbnVlZCB3aGVuIGFuIGl0ZXJhdGlvbiByZXBvcnRlZCBhIGZhaWx1cmUuCgo9Y3V0CgpzdWIgQ3VySW5jaVN0YXRlUmVjYWxjIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2VmdWwgZm9yIGFzeW5jIGV4ZWN1dGlvbgogICAgIyBhbGwgb3RoZXIgcGFyYW1ldGVycyB3aWxsIGJlIGlnbm9yZWQKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1JRHN9ICkgewoKICAgICAgICAjIHRoZXNlIGhhc2hlcyB3aWxsIGJlIGZpbGxlZCBpbiB0aGUgY2FsbHMgdG8gQ3VySW5jaVN0YXRlUmVjYWxjCiAgICAgICAgbXkgKCAlTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUsICVTY2FubmVkQ29uZmlnSXRlbUlEcyApOwoKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoICRQYXJhbXtDb25maWdJdGVtSURzfS0+QCogKSB7CiAgICAgICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPkN1ckluY2lTdGF0ZVJlY2FsYygKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgICAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICBOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZSA9PiBcJU5ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlLAogICAgICAgICAgICAgICAgU2Nhbm5lZENvbmZpZ0l0ZW1JRHMgICAgICAgPT4gXCVTY2FubmVkQ29uZmlnSXRlbUlEcywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB1bmxlc3MgJFN1Y2Nlc3M7CiAgICAgICAgfQoKICAgICAgICAjIGFsbCBmaW5lCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDb25maWdJdGVtSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDb25maWdJdGVtSUQhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoIHJlZiAkUGFyYW17Q29uZmlnSXRlbUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1RoZSBwYXJhbWV0ZXIgQ29uZmlnSXRlbUlEIG11c3QgYmUgYSBwbGFpbiBzY2FsYXIhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgaW5jaWRlbnQgbGluayB0eXBlcyBhbmQgZGlyZWN0aW9ucyBmcm9tIGNvbmZpZy4gRS5nLgogICAgIyB7IERlcGVuZHNPbiA9PiAnQm90aCcsIExvY2F0aW9uT2YgPT4gJ1NvdXJjZScgfQogICAgbXkgJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0lUU006OkNvcmU6OkluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24nKTsKCiAgICAjICRQYXJhbXtOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZX0gaG9sZHMgdGhlIGRldGVybWluZWQgaW5jaWRlbnQgc3RhdGVzIG9mIHRoZSBjb25zaWRlcmVkIGNvbmZpZyBpdGVtcy4KICAgICMgSXQgbWF5IGNvbnRhaW4gY29udGFpbiBjb250ZW50IGZyb20gcHJldmlvdXMgY2FsbHMgb2YgQ3VySW5jaVN0YXRlUmVjYWxjKCkgc28gdGhhdCB1bm5lY2Vzc2FyeSB3b3JrCiAgICAjIGNhbiBiZSBza2lwcGVkLgogICAgIyBOZXcgaW5jaWRlbnQgc3RhdGVzIGFyZSBjYWxjdWxhdGVkIGZyb20gYWxsIGluY2lkZW50IGxpbmsgdHlwZXMuCiAgICAjIFRoZSBuZXdseSBkZXRlcm1pbmVkIGluY2lkZW50IHN0YXRlcyBhcmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGNhbGxlciwgc28gdGhhdCB0aGUgY2FsbGVyCiAgICAjIGNhbiBwYXNzIGl0IHRvIHRoZSBuZXh0IGl0ZXJhdGlvbi4KICAgICMgSW5jb3Jwb3JhdGUgZGF0YSBmcm9tIHByZXZpb3VzIHJ1bihzKSBhbmQgcmVtZW1iZXIga25vd24gZGF0YS4KICAgICRQYXJhbXtOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZX0gLy89IHt9OwogICAgbXkgJEtub3duTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUgPSBkY2xvbmUoICRQYXJhbXtOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZX0gKTsKCiAgICAjIFJlbWVtYmVyIHRoZSBzY2FubmVkIGNvbmZpZyBpdGVtcwogICAgIyBJbmNvcnBvcmF0ZSBkYXRhIGZyb20gcHJldmlvdXMgcnVuKHMpIGFuZCByZW1lbWJlciBrbm93biBkYXRhLgogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSAvLz0ge307CiAgICBteSAkS25vd25TY2FubmVkQ29uZmlnSXRlbUlEcyA9IGRjbG9uZSggJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSApOwoKICAgICMgRmluZCBkZWVwbHkgY29ubmVjdGVkIGNvbmZpZyBpdGVtcyB3aXRoIGFuIGluY2lkZW50IHN0YXRlLgogICAgIyBUaGUgZGlyZWN0aW9uIGluICRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uIGlzIGlnbm9yZWQgaGVyZSBiZWNhdXNlIGRlcGVuZGVkIG9uIGl0ZW1zIGNvdWxkIGNoYW5nZQogICAgIyB0aGUgaW5jaWRlbnQgc3RhdGUgb2YgdGhlIGN1cnJlbnQgY29uZmlnIGl0ZW0uIE9yIGNoYW5nZXMgaW4KICAgICMgdGhlIGN1cnJlbnQgY29uZmlnIGl0ZW0gY291bGQgY2hhbmdlIGRvd25zdHJlYW0gY29uZmlnIGl0ZW1zLgogICAgJFNlbGYtPl9GaW5kSW5jaUNvbmZpZ0l0ZW1zKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIEluY2lkZW50TGlua1R5cGVzICAgID0+IFsga2V5cyAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbi0+JSogXSwKICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LAogICAgKTsKCiAgICAjIHRvIHN0b3JlIHRoZSByZWxhdGlvbiBiZXR3ZWVuIHNlcnZpY2VzIGFuZCBsaW5rZWQgQ0lzCiAgICAjIFRoZSBpbmZvIHdpbGwgYmUgdXNlZCBmb3IgdXBkYXRpbmcgdGhlIHNlcnZpY2VzLgogICAgbXkgJVNlcnZpY2VDSVJlbGF0aW9uOwoKICAgICMgY2FsY3VsYXRlIHRoZSBuZXcgQ0kgaW5jaWRlbnQgc3RhdGUgZm9yIGVhY2ggY29uZmlndXJlZCBsaW5rdHlwZQogICAgTElOS1RZUEU6CiAgICBmb3IgbXkgJExpbmtUeXBlICggc29ydCBrZXlzICRJbmNpZGVudExpbmtUeXBlRGlyZWN0aW9uLT4lKiApIHsKCiAgICAgICAgIyBnZXQgdGhlIGRpcmVjdGlvbgogICAgICAgIG15ICRMaW5rRGlyZWN0aW9uID0gJEluY2lkZW50TGlua1R5cGVEaXJlY3Rpb24tPnskTGlua1R5cGV9OwoKICAgICAgICAjIGludmVzdGlnYXRlIGFsbCBjb25maWcgaXRlbXMgd2l0aCBhIHdhcm5pbmcgc3RhdGUKICAgICAgICBDT05GSUdJVEVNSUQ6CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJXsgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfSB9ICkgewoKICAgICAgICAgICAgIyBTa2lwIGNvbmZpZyBpdGVtcyBrbm93biBmcm9tIHByZXZpb3VzIGV4ZWN1dGlvbihzKS4KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgSXNTdHJpbmdXaXRoRGF0YSggJEtub3duU2Nhbm5lZENvbmZpZ0l0ZW1JRHMtPnskQ29uZmlnSXRlbUlEfXtUeXBlfSApCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgJEtub3duU2Nhbm5lZENvbmZpZ0l0ZW1JRHMtPnskQ29uZmlnSXRlbUlEfXtUeXBlfSBlcSAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyRDb25maWdJdGVtSUR9e1R5cGV9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGludmVzdGlnYXRlIG9ubHkgY29uZmlnIGl0ZW1zIHdpdGggYW4gaW5jaWRlbnQgc3RhdGUKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgdW5sZXNzICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317JENvbmZpZ0l0ZW1JRH17VHlwZX0gZXEgJ2luY2lkZW50JzsKCiAgICAgICAgICAgICMgYW5ub3RhdGUgbGlua2VkIGNvbmZpZyBpdGVtcyB3aXRoIGEgd2FybmluZwogICAgICAgICAgICAkU2VsZi0+X0ZpbmRXYXJuQ29uZmlnSXRlbXMoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgICAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgRGlyZWN0aW9uICAgICAgICAgICAgPT4gJExpbmtEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICBOdW1iZXJPZkxpbmtUeXBlcyAgICA9PiBzY2FsYXIga2V5cyAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbi0+JSosCiAgICAgICAgICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgQ09ORklHSVRFTUlEOgogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBrZXlzICV7ICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30gfSApIHsKCiAgICAgICAgICAgICMgU2tpcCBjb25maWcgaXRlbXMga25vd24gZnJvbSBwcmV2aW91cyBleGVjdXRpb24ocykuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIElzU3RyaW5nV2l0aERhdGEoICRLbm93blNjYW5uZWRDb25maWdJdGVtSURzLT57JENvbmZpZ0l0ZW1JRH17VHlwZX0gKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICRLbm93blNjYW5uZWRDb25maWdJdGVtSURzLT57JENvbmZpZ0l0ZW1JRH17VHlwZX0gZXEgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXskQ29uZmlnSXRlbUlEfXtUeXBlfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBleHRyYWN0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICAgICAgICAgbXkgJEluY2lTdGF0ZVR5cGUgPSAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyRDb25maWdJdGVtSUR9e1R5cGV9OwoKICAgICAgICAgICAgIyBGaW5kIGFsbCBsaW5rZWQgc2VydmljZXMgb2YgdGhpcyBjb25maWcgaXRlbS4KICAgICAgICAgICAgIyBUaGVzZSBraW5kIG9mIGxpbmtzIGFyZSBub3QgYXZhaWxhYmxlIGZyb20gdGhlIHRhYmxlIGNvbmZpZ2l0ZW1fbGluawogICAgICAgICAgICBteSAlTGlua2VkU2VydmljZUlEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0JyktPkxpbmtLZXlMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0MSAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICBLZXkxICAgICAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgIE9iamVjdDIgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkTGlua1R5cGUsCiAgICAgICAgICAgICAgICBEaXJlY3Rpb24gPT4gJExpbmtEaXJlY3Rpb24sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIFNFUlZJQ0VJRDoKICAgICAgICAgICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJUxpbmtlZFNlcnZpY2VJRHMgKSB7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0aGUgQ0lzIHRoYXQgYXJlIGxpbmtlZCB3aXRoIHRoaXMgc2VydmljZQogICAgICAgICAgICAgICAgJFNlcnZpY2VDSVJlbGF0aW9ueyRTZXJ2aWNlSUR9IC8vPSBbXTsKICAgICAgICAgICAgICAgIHB1c2ggJFNlcnZpY2VDSVJlbGF0aW9ueyRTZXJ2aWNlSUR9LT5AKiwgJENvbmZpZ0l0ZW1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJEluY2lTdGF0ZVR5cGUgZXEgJ2luY2lkZW50JzsKCiAgICAgICAgICAgICRQYXJhbXtOZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZX17JENvbmZpZ0l0ZW1JRH0gPSAkSW5jaVN0YXRlVHlwZTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGhlIGluY2lkZW50IHN0YXRlIGxpc3Qgb2Ygd2FybmluZ3MKICAgIG15ICRXYXJuU3RhdGVMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nJyktPkl0ZW1MaXN0KAogICAgICAgIENsYXNzICAgICAgID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICBQcmVmZXJlbmNlcyA9PiB7CiAgICAgICAgICAgIEZ1bmN0aW9uYWxpdHkgPT4gJ3dhcm5pbmcnLAogICAgICAgIH0sCiAgICApOwoKICAgIGlmICggIWRlZmluZWQgJFdhcm5TdGF0ZUxpc3QgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlIFdhcm5pbmcgY2Fubm90IGJlIGludmFsaWQuIiwKICAgICAgICApOwogICAgfQoKICAgIG15ICVSZXZlcnNlV2FyblN0YXRlTGlzdCA9IHJldmVyc2UgJXskV2FyblN0YXRlTGlzdH07CiAgICBteSBAU29ydGVkV2Fybkxpc3QgICAgICAgPSBzb3J0IGtleXMgJVJldmVyc2VXYXJuU3RhdGVMaXN0OwogICAgbXkgJFdhcm5pbmdTdGF0ZUlEICAgICAgID0gJFJldmVyc2VXYXJuU3RhdGVMaXN0e1dhcm5pbmd9IHx8ICRSZXZlcnNlV2FyblN0YXRlTGlzdHsgJFNvcnRlZFdhcm5MaXN0WzBdIH07CiAgICBteSAkQ2FjaGVPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICAjIHNldCB0aGUgbmV3IGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgZm9yIENJcwogICAgQ09ORklHSVRFTUlEOgogICAgZm9yIG15ICRDb25maWdJdGVtSUQgKCBzb3J0IGtleXMgJFBhcmFte05ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlfS0+JSogKSB7CgogICAgICAgICMgU2tpcCBjb25maWcgaXRlbXMga25vd24gZnJvbSBwcmV2aW91cyBleGVjdXRpb24ocykuCiAgICAgICAgaWYgKAogICAgICAgICAgICBJc1N0cmluZ1dpdGhEYXRhKCAkS25vd25OZXdDb25maWdJdGVtSW5jaWRlbnRTdGF0ZS0+eyRDb25maWdJdGVtSUR9ICkKICAgICAgICAgICAgJiYgJEtub3duTmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGUtPnskQ29uZmlnSXRlbUlEfSBlcSAkUGFyYW17TmV3Q29uZmlnSXRlbUluY2lkZW50U3RhdGV9eyRDb25maWdJdGVtSUR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG5leHQgQ09ORklHSVRFTUlEOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmV3IGluY2lkZW50IHN0YXRlIHR5cGUgKGNhbiBvbmx5IGJlICdvcGVyYXRpb25hbCcgb3IgJ3dhcm5pbmcnKQogICAgICAgIG15ICRJbmNpU3RhdGVUeXBlID0gJFBhcmFte05ld0NvbmZpZ0l0ZW1JbmNpZGVudFN0YXRlfXskQ29uZmlnSXRlbUlEfTsKCiAgICAgICAgIyBnZXQgbGFzdCB2ZXJzaW9uCiAgICAgICAgbXkgJExhc3RWZXJzaW9uID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAwLAogICAgICAgICk7CgogICAgICAgIG15ICRDdXJJbmNpU3RhdGVJRDsKICAgICAgICBpZiAoICRJbmNpU3RhdGVUeXBlIGVxICd3YXJuaW5nJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBpcyBpbiAnaW5jaWRlbnQnCiAgICAgICAgICAgICMgdGhlbiB3ZSBkbyBub3Qgd2FudCB0byBjaGFuZ2UgaXQgdG8gd2FybmluZwogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkTGFzdFZlcnNpb24tPntJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnOwoKICAgICAgICAgICAgJEN1ckluY2lTdGF0ZUlEID0gJFdhcm5pbmdTdGF0ZUlEOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRJbmNpU3RhdGVUeXBlIGVxICdvcGVyYXRpb25hbCcgKSB7CiAgICAgICAgICAgICRDdXJJbmNpU3RhdGVJRCA9ICRMYXN0VmVyc2lvbi0+e0luY2lTdGF0ZUlEfTsKICAgICAgICB9CgogICAgICAgICMgTm8gdXBkYXRlIG5lY2Vzc2FyeSBpZiBpbmNpZGVudCBzdGF0ZSBpZCBvZiB2ZXJzaW9uIGFuZCBjb25maWcgaXRlbSBtYXRjaC4KICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkTGFzdFZlcnNpb24tPntDdXJJbmNpU3RhdGVJRH0gZXEgJEN1ckluY2lTdGF0ZUlEOwoKICAgICAgICAjIHVwZGF0ZSBjdXJyZW50IGluY2lkZW50IHN0YXRlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPkRvKAogICAgICAgICAgICBTUUwgID0+ICdVUERBVEUgY29uZmlnaXRlbSBTRVQgY3VyX2luY2lfc3RhdGVfaWQgPSA/IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEN1ckluY2lTdGF0ZUlELCBcJENvbmZpZ0l0ZW1JRCBdLAogICAgICAgICk7CgogICAgICAgICMgVE9ETzogQWxzbyB0aGUgVmVyc2lvbklELWNhY2hlcyBoYXZlIHRvIGJlIGNvbnNpZGVyZWQsIHRoZXkgYWxzbyBjb250YWluIEN1ckluY2lTdGF0ZQogICAgICAgICMgZGVsZXRlIHRoZSBjYWNoZQogICAgICAgIGZvciBteSAkREZEYXRhICggMCwgMSApIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gam9pbigKICAgICAgICAgICAgICAgICAgICAnOjonLCAnQ29uZmlnSXRlbUdldCcsCiAgICAgICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgICAgICAgICAgREZEYXRhICAgICAgID0+ICRERkRhdGEKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHRoZSBjdXJyZW50IGluY2lkZW50IHN0YXRlIHR5cGUgZm9yIGVhY2ggc2VydmljZSAoaW5mbHVlbmNlZCBieSBsaW5rZWQgQ0lzKQogICAgU0VSVklDRUlEOgogICAgZm9yIG15ICRTZXJ2aWNlSUQgKCBzb3J0IGtleXMgJVNlcnZpY2VDSVJlbGF0aW9uICkgewoKICAgICAgICAjIHNldCBkZWZhdWx0IGluY2lkZW50IHN0YXRlIHR5cGUKICAgICAgICBteSAkQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMgPSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAjIGdldCB0aGUgdW5pcXVlIGNvbmZpZyBpdGVtIGlkcyB3aGljaCBhcmUgZGlyZWN0bHkgbGlua2VkIHRvIHRoaXMgc2VydmljZQogICAgICAgIG15ICVVbmlxdWVDb25maWdJdGVtSURzID0gbWFwIHsgJF8gPT4gMSB9ICRTZXJ2aWNlQ0lSZWxhdGlvbnskU2VydmljZUlEfS0+QCo7CgogICAgICAgICMgaW52ZXN0aWdhdGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgb2YgZWFjaCBjb25maWcgaXRlbQogICAgICAgIENPTkZJR0lURU1JRDoKICAgICAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQga2V5cyAlVW5pcXVlQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJENvbmZpZ0l0ZW1EYXRhID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgICAgIENhY2hlICAgICAgICA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQgaWYgJENvbmZpZ0l0ZW1EYXRhLT57Q3VyRGVwbFN0YXRlVHlwZX0gbmUgJ3Byb2R1Y3RpdmUnOwogICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRCBpZiAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnb3BlcmF0aW9uYWwnOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIG11c3QgYmUgc2V0IHRvICd3YXJuaW5nJwogICAgICAgICAgICBpZiAoICRDb25maWdJdGVtRGF0YS0+e0N1ckluY2lTdGF0ZVR5cGV9IGVxICd3YXJuaW5nJyApIHsKICAgICAgICAgICAgICAgICRDdXJJbmNpU3RhdGVUeXBlRnJvbUNJcyA9ICd3YXJuaW5nJzsKCiAgICAgICAgICAgICAgICBuZXh0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBzZXJ2aWNlIG11c3QgYmUgc2V0IHRvICdpbmNpZGVudCcKICAgICAgICAgICAgaWYgKCAkQ29uZmlnSXRlbURhdGEtPntDdXJJbmNpU3RhdGVUeXBlfSBlcSAnaW5jaWRlbnQnICkgewogICAgICAgICAgICAgICAgJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzID0gJ2luY2lkZW50JzsKCiAgICAgICAgICAgICAgICBsYXN0IENPTkZJR0lURU1JRDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB1cGRhdGUgdGhlIGN1cnJlbnQgaW5jaWRlbnQgc3RhdGUgdHlwZSBmcm9tIENJcyBvZiB0aGUgc2VydmljZQogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlJyktPlNlcnZpY2VQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRTZXJ2aWNlSUQsCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnQ3VySW5jaVN0YXRlVHlwZUZyb21DSXMnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEN1ckluY2lTdGF0ZVR5cGVGcm9tQ0lzLAogICAgICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgT2JqZWN0QXR0cmlidXRlc0dldCgpCgpyZXR1cm5zIHRoZSBhdHRyaWJ1dGVzIGEgY29uZmlnIGl0ZW0gY2FuIGhhdmUgb24gdGhlIHN5c3RlbS4KCiAgICBteSAlQXR0cmlidXRlcyA9ICRUaWNrZXRPYmplY3QtPk9iamVjdEF0dHJpYnV0ZXNHZXQoCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAoMHwxKSwgICAgICAgICAjIChvcHRpb25hbCkgaWYgZHluYW1pYyBmaWVsZCBuYW1lcyBhcmUgaW5jbHVkZWQsIGRlZmF1bHQgMAogICAgICAgIFZlcnNpb24gICAgICAgPT4gKDB8MSksICAgICAgICAgIyAob3B0aW9uYWwpIGlmIHZlcnNpb24gaW5mb3JtYXRpb24gaXMgaW5jbHVkZWQsIGRlZmF1bHQgMQogICAgICAgIEVkaXRNYXNrICAgICAgPT4gKDB8MSksICAgICAgICAgIyAob3B0aW9uYWwpIGlmIGVkaXQgbWFzayBhdHRyaWJ1dGVzIGFyZSByZXR1cm5lZCBpbnN0ZWFkIG9mIGJhY2tlbmQgYXR0cmlidXRlcywgZGVmYXVsdCAwCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17VmVyc2lvbn0gLy89IDE7CgogICAgbXkgJUNvbmZpZ0l0ZW1BdHRyaWJ1dGVzOwoKICAgIGlmICggJFBhcmFte0VkaXRNYXNrfSApIHsKICAgICAgICAlQ29uZmlnSXRlbUF0dHJpYnV0ZXMgPSAoCiAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgPT4gMSwKICAgICAgICAgICAgSW5jaVN0YXRlSUQgICA9PiAxLAogICAgICAgICAgICBOYW1lICAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFZlcnNpb25TdHJpbmcgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJUNvbmZpZ0l0ZW1BdHRyaWJ1dGVzID0gKAogICAgICAgICAgICBDb25maWdJdGVtSUQgICA9PiAxLAogICAgICAgICAgICBOdW1iZXIgICAgICAgICA9PiAxLAogICAgICAgICAgICBDbGFzc0lEICAgICAgICA9PiAxLAogICAgICAgICAgICBDbGFzc2VzICAgICAgICA9PiAxLAogICAgICAgICAgICBDdXJEZXBsU3RhdGVJRCA9PiAxLAogICAgICAgICAgICBDdXJEZXBsU3RhdGVzICA9PiAxLAogICAgICAgICAgICBDdXJJbmNpU3RhdGVJRCA9PiAxLAogICAgICAgICAgICBDdXJJbmNpU3RhdGVzICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgaWYgcmVxdWVzdGVkLCBzZXQgdmVyc2lvbiBhdHRyaWJ1dGVzCiAgICAgICAgaWYgKCAkUGFyYW17VmVyc2lvbn0gKSB7CiAgICAgICAgICAgICVDb25maWdJdGVtQXR0cmlidXRlcyA9ICgKICAgICAgICAgICAgICAgICVDb25maWdJdGVtQXR0cmlidXRlcywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFZlcnNpb25TdHJpbmcgPT4gMSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZUlEICAgPT4gMSwKICAgICAgICAgICAgICAgIERlcGxTdGF0ZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZUlEICAgPT4gMSwKICAgICAgICAgICAgICAgIEluY2lTdGF0ZXMgICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBkeW5hbWljIGZpZWxkcyBuZWVkIHRvIGJlIGFkZGVkCiAgICBpZiAoICRQYXJhbXtEeW5hbWljRmllbGRzfSApIHsKICAgICAgICBteSAkRHluYW1pY0ZpZWxkcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdCgKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICAgICBPYmplY3RUeXBlID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkRmllbGROYW1lICggdmFsdWVzICREeW5hbWljRmllbGRzLT4lKiApIHsKICAgICAgICAgICAgJENvbmZpZ0l0ZW1BdHRyaWJ1dGVzeyJEeW5hbWljRmllbGRfJEZpZWxkTmFtZSJ9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVDb25maWdJdGVtQXR0cmlidXRlczsKfQoKPWhlYWQxIElOVEVSTkFMIElOVEVSRkFDRQoKPWhlYWQyIF9GaW5kSW5jaUNvbmZpZ0l0ZW1zKCkKCmZpbmQgY29ubmVjdGVkIGNvbmZpZyBpdGVtcyB3aXRoIGFuIGluY2lkZW50IHN0YXRlLgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5fRmluZEluY2lDb25maWdJdGVtcygKICAgICAgICBDb25maWdJdGVtSUQgICAgICAgICA9PiAkQ29uZmlnSXRlbUlELAogICAgICAgIEluY2lkZW50TGlua1R5cGVzICAgID0+IFsga2V5cyAkSW5jaWRlbnRMaW5rVHlwZURpcmVjdGlvbi0+JSogXSwKICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiBcJVNjYW5uZWRDb25maWdJdGVtSURzLAogICAgKTsKClRoZSBzY2FubmVkIGNvbmZpZyBpdGVtcyB3aWxsIGJlIGVudGVyZWQgaW4gdGhlIEM8U2Nhbm5lZENvbmZpZ0l0ZW1JRHM+IGhhc2hyZWYuIEVhY2ggY29uZmlnIGl0ZW0gd2lsbCBiZSBzY2FubmVkIG9ubHkgb25jZS4KVGhlIGF0dHJpYnV0ZSBDPFR5cGU+IHdpbGwgYmUgZWl0aGVyICdvcGVyYXRpb25hbCcgb3IgJ2luY2lkZW50Jy4KClRoZSBzZWFyY2ggZm9yIGNvbmZpZyBpdGVtcyB3aXRoIGluY2lkZW50cyByZWN1cnNlcyBpbnRvIHRoZSBncmFwaCBvZiBsaW5rZWQgY29uZmlnIGl0ZW1zLiBUaGUgZGlyZWN0bHkKbGlua2VkIGl0ZW1zIHdpbGwgYWx3YXlzIGJlIGNoZWNrZWQuIFJlY3Vyc2lvbiBzdG9wcyBvbmNlIGFuIGluY2lkZW50IGhhcyBiZWVuIGZvdW5kLgoKVGhpcyBtZXRob2Qgb25seSBjb2xsZWN0cyBkYXRhLCBubyBjdXJyZW50IGluY2lkZW50IHN0YXRlcyB3aWxsIGJlIGFsdGVyZWQuCgo9Y3V0CgpzdWIgX0ZpbmRJbmNpQ29uZmlnSXRlbXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIHVubGVzcyAkUGFyYW17Q29uZmlnSXRlbUlEfTsKCiAgICAjIGlnbm9yZSBhbHJlYWR5IHNjYW5uZWQgaWRzIChpbmZpbml0ZSBsb29wIHByb3RlY3Rpb24pCiAgICByZXR1cm4gaWYgZGVmaW5lZCAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9OwoKICAgICMgc2V0IGEgZGVmYXVsdCBzbyB0aGUgQ29uZmlnSXRlbSB3b24ndCBiZSBzY2FubmVkIGFnYWluCiAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9ID0ge307CiAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyAkUGFyYW17Q29uZmlnSXRlbUlEfSB9LT57VHlwZX0gPSAnb3BlcmF0aW9uYWwnOwoKICAgICMgYWRkIG93biBjb25maWcgaXRlbSBpZCB0byBsaXN0IG9mIGxpbmtlZCBjb25maWcgaXRlbXMKICAgIG15IEBDb25maWdJdGVtSURzID0gJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBmaW5kIHRoZSBkaXJlY3RseSBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICB7CiAgICAgICAgIyBEaXJlY3Rpb24gbXVzdCBBTFdBWVMgYmUgJ0JvdGgnIGhlcmUgYXMgd2UgbmVlZCB0byBpbmNsdWRlCiAgICAgICAgIyBhbGwgbGlua2VkIENJcyB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGlzIG9uZSEKICAgICAgICBteSAkTGlua2VkQ29uZmlnSXRlbXMgPSAkU2VsZi0+TGlua2VkQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgVHlwZXMgICAgICAgID0+ICRQYXJhbXtJbmNpZGVudExpbmtUeXBlc30sCiAgICAgICAgICAgIERpcmVjdGlvbiAgICA9PiAnQm90aCcsCiAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgcmVtZW1iZXIgb25seSB0aGUgbGlua2VkIGNvbmZpZyBpdGVtIGlkcywgaWdub3JlIHRoZSBjb25maWcgaXRlbSB2ZXJzaW9ucwogICAgICAgIHB1c2ggQENvbmZpZ0l0ZW1JRHMsCiAgICAgICAgICAgIGdyZXAge2RlZmluZWR9CiAgICAgICAgICAgIG1hcCAgeyAkXy0+e0NvbmZpZ0l0ZW1JRH0gfQogICAgICAgICAgICAkTGlua2VkQ29uZmlnSXRlbXMtPkAqOwogICAgfQoKICAgICMgTG9vcCBvdmVyIHRoZSByZXF1ZXN0ZWQgY29uZmlnIGl0ZW0gYW5kIHRoZSBkaXJlY3RseSBsaW5rZWQgY29uZmlnIGl0ZW1zCiAgICBDT05GSUdJVEVNSUQ6CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW1JRCAoIHNvcnQgQENvbmZpZ0l0ZW1JRHMgKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtIGRhdGEKICAgICAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJENvbmZpZ0l0ZW1JRCwKICAgICAgICAgICAgQ2FjaGUgICAgICAgID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBXaGVuIGFuIGluY2lkZW50IHdhcyBmb3VuZCwgbWFyayB0aGUgY29uZmlnIGl0ZW0gYW5kIHN0b3AgcmVjdXJzaW5nCiAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0N1ckluY2lTdGF0ZVR5cGV9IGVxICdpbmNpZGVudCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317JENvbmZpZ0l0ZW1JRH17VHlwZX0gPSAnaW5jaWRlbnQnOwoKICAgICAgICAgICAgbmV4dCBDT05GSUdJVEVNSUQ7CiAgICAgICAgfQoKICAgICAgICAjIG5vIGluY2lkZW50IHdhcyBlbmNvdW50ZXJlZCwgY29udGludWUgd2l0aCByZWN1cnNpb24KICAgICAgICAjIF9GaW5kSW5jaUNvbmZpZ0l0ZW1zKCkgbWlnaHQgYmUgY2FsbGVkIHdpdGggdGhlIGN1cnJlbnQgJFBhcmFte0NvbmZpZ0l0ZW1JRH0uCiAgICAgICAgIyBCdXQgdGhhdCBjYWxsIHdpbGwgZG8gbm90aGluZy4KICAgICAgICAkU2VsZi0+X0ZpbmRJbmNpQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIEluY2lkZW50TGlua1R5cGVzICAgID0+ICRQYXJhbXtJbmNpZGVudExpbmtUeXBlc30sCiAgICAgICAgICAgIFNjYW5uZWRDb25maWdJdGVtSURzID0+ICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBfRmluZFdhcm5Db25maWdJdGVtcygpCgpUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGNvbmZpZyBpdGVtIHRoYXQgYXJlIGluIGEgaW5jaWRlbnQgb3Igd2FybmluZyBzdGF0ZS4KRmluZCBjb25uZWN0ZWQgY29uZmlnIGl0ZW1zIGFuZCBhbm5vdGF0ZSB0aGVtIHdpdGggYSB3YXJuaW5nIGluIEM8U2Nhbm5lZENvbmZpZ0l0ZW1JRHM+LiBQcm9wYWdhdGUgdGhlIHdhcm5pbmcuCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPl9GaW5kV2FybkNvbmZpZ0l0ZW1zKAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgTGlua1R5cGUgICAgICAgICAgICAgPT4gJExpbmtUeXBlLAogICAgICAgIERpcmVjdGlvbiAgICAgICAgICAgID0+ICRMaW5rRGlyZWN0aW9uLAogICAgICAgIE51bWJlck9mTGlua1R5cGVzICAgID0+IDIsICAgICAgICAgICAgICAgICAgICAgIyBqdXN0IGZvciBpbmZpbml0ZSBsb29wIHByb3RlY3Rpb24KICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkU2Nhbm5lZENvbmZpZ0l0ZW1JRHMsCiAgICApOwoKPWN1dAoKc3ViIF9GaW5kV2FybkNvbmZpZ0l0ZW1zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIHJldHVybiB1bmxlc3MgJFBhcmFte0NvbmZpZ0l0ZW1JRH07CgogICAgIyBJbmZpbml0ZSBsb29wIHByb3RlY3Rpb24uCiAgICAjIElnbm9yZSBhbHJlYWR5IHNjYW5uZWQgaWRzLgogICAgIyBJdCBpcyBvayB0aGF0IGEgY29uZmlnIGl0ZW0gaXMgaW52ZXN0aWdhdGVkIGFzIG1hbnkgdGltZXMgYXMgdGhlcmUgYXJlIGNvbmZpZ3VyZWQgbGluayB0eXBlcyAqIG51bWJlciBvZiBpbmNpZGVudCBjb25maWcgaXRlZW1zCiAgICBteSAkSW5jaWRlbnRDb3VudCA9IHRydWUgeyAoICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317JF99e1R5cGV9IHx8ICcnICkgZXEgJ2luY2lkZW50JyB9CiAgICBrZXlzICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc30tPiUqOwogICAgaWYgKAogICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317ICRQYXJhbXtDb25maWdJdGVtSUR9IH0tPntGaW5kV2Fybn0KICAgICAgICAmJgogICAgICAgICRQYXJhbXtTY2FubmVkQ29uZmlnSXRlbUlEc317ICRQYXJhbXtDb25maWdJdGVtSUR9IH0tPntGaW5kV2Fybn0gPj0gKCAkUGFyYW17TnVtYmVyT2ZMaW5rVHlwZXN9ICogJEluY2lkZW50Q291bnQgKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbmNyZWFzZSB0aGUgdmlzaXQgY291bnRlcgogICAgJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXsgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gfS0+e0ZpbmRXYXJufSsrOwoKICAgICMgZmluZCBjb25maWcgaXRlbXMgdG8gd2hpY2ggdGhlIGluY2lkZW50IG9yIHdhcm5pbmcgbXVzdCBiZSBwcm9wYWdhdGVkCiAgICBteSAkTGlua2VkQ29uZmlnSXRlbXMgPSAkU2VsZi0+TGlua2VkQ29uZmlnSXRlbXMoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgIFR5cGVzICAgICAgICA9PiBbICRQYXJhbXtMaW5rVHlwZX0gXSwKICAgICAgICBEaXJlY3Rpb24gICAgPT4gJFBhcmFte0RpcmVjdGlvbn0sCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwogICAgbXkgQExpbmtlZENvbmZpZ0l0ZW1JRHMgPSBtYXAgeyAkXy0+e0NvbmZpZ0l0ZW1JRH0gfSAkTGlua2VkQ29uZmlnSXRlbXMtPkAqOwoKICAgIENPTkZJR0lURU1JRDoKICAgIGZvciBteSAkQ29uZmlnSXRlbUlEICggc29ydCBATGlua2VkQ29uZmlnSXRlbUlEcyApIHsKCiAgICAgICAgIyBzdGFydCByZWN1cnNpb24KICAgICAgICAkU2VsZi0+X0ZpbmRXYXJuQ29uZmlnSXRlbXMoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgICAgID0+ICRDb25maWdJdGVtSUQsCiAgICAgICAgICAgIExpbmtUeXBlICAgICAgICAgICAgID0+ICRQYXJhbXtMaW5rVHlwZX0sCiAgICAgICAgICAgIERpcmVjdGlvbiAgICAgICAgICAgID0+ICRQYXJhbXtEaXJlY3Rpb259LAogICAgICAgICAgICBOdW1iZXJPZkxpbmtUeXBlcyAgICA9PiAkUGFyYW17TnVtYmVyT2ZMaW5rVHlwZXN9LAogICAgICAgICAgICBTY2FubmVkQ29uZmlnSXRlbUlEcyA9PiAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9LAogICAgICAgICk7CgogICAgICAgIG5leHQgQ09ORklHSVRFTUlEIGlmICggJFBhcmFte1NjYW5uZWRDb25maWdJdGVtSURzfXskQ29uZmlnSXRlbUlEfXtUeXBlfSB8fCAnJyApIGVxICdpbmNpZGVudCc7CgogICAgICAgICMgc2V0IHdhcm5pbmcgc3RhdGUKICAgICAgICAkUGFyYW17U2Nhbm5lZENvbmZpZ0l0ZW1JRHN9eyRDb25maWdJdGVtSUR9e1R5cGV9ID0gJ3dhcm5pbmcnOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX1ByZXBhcmVMaWtlU3RyaW5nKCkKCmludGVybmFsIGZ1bmN0aW9uIHRvIHByZXBhcmUgbGlrZSBzdHJpbmdzCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPl9QcmVwYXJlTGlrZVN0cmluZyggJFN0cmluZ1JlZiApOwoKPWN1dAoKc3ViIF9QcmVwYXJlTGlrZVN0cmluZyB7CiAgICBteSAoICRTZWxmLCAkVmFsdWUgKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFZhbHVlOwogICAgcmV0dXJuIGlmIHJlZiAkVmFsdWUgbmUgJ1NDQUxBUic7CgogICAgIyBRdW90ZQogICAgJHskVmFsdWV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1b3RlKCAkeyRWYWx1ZX0sICdMaWtlJyApOwoKICAgICMgcmVwbGFjZSAqIHdpdGggJQogICAgJHskVmFsdWV9ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICByZXR1cm47Cn0KCj1oZWFkMSBJVFNNIENvbmZpZyBJdGVtIGV2ZW50czoKCkNvbmZpZ0l0ZW1DcmVhdGUsIENvbmZpZ0l0ZW1VcGRhdGUsIFZlcnNpb25DcmVhdGUsIFZlcnNpb25VcGRhdGUsIERlcGxveW1lbnRTdGF0ZVVwZGF0ZSwgSW5jaWRlbnRTdGF0ZVVwZGF0ZSwKQ29uZmlnSXRlbURlbGV0ZSwgTGlua0FkZCwgTGlua0RlbGV0ZSwgRGVmaW5pdGlvblVwZGF0ZSwgTmFtZVVwZGF0ZSwgRGVmaW5pdGlvbkNyZWF0ZSwgVmVyc2lvbkRlbGV0ZQoKPWN1dAoKMTsK</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem/ConfigItemSearch.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI2IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojICRvcmlnaW46IG90b2JvIC0gIC0gS2VybmVsL1N5c3RlbS9JVFNNQ29uZmlnSXRlbS9Db25maWdJdGVtU2VhcmNoLnBtCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgojIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKIyBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUwojIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uIElmIG5vdCwgc2VlIDxodHRwczovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpDb25maWdJdGVtU2VhcmNoOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKdXNlIHV0Zjg7CgojIGNvcmUgbW9kdWxlcwoKIyBDUEFOIG1vZHVsZXMKCiMgT1RPQk8gbW9kdWxlcwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoSXNBcnJheVJlZldpdGhEYXRhIElzU3RyaW5nV2l0aERhdGEpOwoKb3VyICRPYmplY3RNYW5hZ2VyRGlzYWJsZWQgPSAxOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6Q29uZmlnSXRlbVNlYXJjaCAtIHN1YiBtb2R1bGUgb2YgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtIGZvciBjb25maWcgaXRlbSBzZWFyY2gKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGNvbmZpZyBpdGVtIHNlYXJjaCBmdW5jdGlvbnMuIFRoZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSB2aWEgdGhlIEM8S2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtPiBvYmplY3QuCgo9aGVhZDIgQ29uZmlnSXRlbVNlYXJjaCgpCgpUbyBmaW5kIGNvbmZpZyBpdGVtcyBpbiB5b3VyIHN5c3RlbS4KCiAgICBteSBAQ29uZmlnSXRlbUlEcyA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgICMgcmVzdWx0IChvcHRpb25hbCwgZGVmYXVsdCBpcyAnSEFTSCcpCiAgICAgICAgUmVzdWx0ID0+ICdBUlJBWScgfHwgJ0hBU0gnIHx8ICdDT1VOVCcsCgogICAgICAgICMgbGltaXQgdGhlIG51bWJlciBvZiBmb3VuZCBjb25maWcgaXRlbXMgKG9wdGlvbmFsLCBkZWZhdWx0IGlzIDEwMDAwKQogICAgICAgIExpbWl0ID0+IDEwMCwKCiAgICAgICAgIyBVc2UgQ29uZmlnSXRlbVNlYXJjaCBhcyBhIGNvbmZpZyBpdGVtIGZpbHRlciBvbiBhIHNpbmdsZSBjb25maWcgaXRlbSwKICAgICAgICAjIG9yIGEgcHJlZGVmaW5lZCBjb25maWcgaXRlbSBsaXN0CiAgICAgICAgQ29uZmlnSXRlbUlEICAgICA9PiAxMjM0LAogICAgICAgIENvbmZpZ0l0ZW1JRCAgICAgPT4gWzEyMzQsIDEyMzVdLAoKICAgICAgICAjIGNvbmZpZyBpdGVtIG51bWJlciAob3B0aW9uYWwpIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgogICAgICAgICMgVGhlIHZhbHVlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIFNRTCBxdWVyeSBleHByZXNzaW9uLgogICAgICAgIE51bWJlciA9PiAnJTEyMzU0NiUnLAogICAgICAgIE51bWJlciA9PiBbJyUxMjM1NDYlJywgJyUxMjM2NjYlJ10sCgogICAgICAgICMgY29uZmlnIGl0ZW0gbmFtZSAob3B0aW9uYWwpIGFzIFNUUklORyBvciBhcyBBUlJBWVJFRgogICAgICAgICMgVGhlIHZhbHVlIHdpbGwgYmUgdHJlYXRlZCBhcyBhIFNRTCBxdWVyeSBleHByZXNzaW9uLgogICAgICAgICMgV2hlbiBDb25kaXRpb25JbmxpbmUgaXMgc2V0IHRoZW4gcmVtYWluaW5nIHdoaXRlc3BhY2Ugd2lsbCBiZSB0cmVhdGVkIGFzIGEgJiYgY29uZGl0aW9uIGFuZAogICAgICAgICMgYW5kIHRoZSBzZXR0aW5ncyBvZiBDb250ZW50U2VhcmNoUHJlZml4IGFuZCBDb250ZW50U2VhcmNoU3VmZml4IHdpbGwgYmUgaG9ub3JlZC4KICAgICAgICBOYW1lID0+ICclU29tZVRleHQlJywKICAgICAgICBOYW1lID0+IFsnJVNvbWVUZXN0MSUnLCAnJVNvbWVUZXN0MiUnXSwKCiAgICAgICAgQ2xhc3NlcyAgICAgICAgID0+IFsnQ29tcHV0ZXInLCAnTmV0d29yayddICAgIyAob3B0aW9uYWwpCiAgICAgICAgQ2xhc3NJRHMgICAgICAgID0+IFs5LCA4LCA3LCA2XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIERlcGxTdGF0ZXMgICAgICA9PiBbJ1Byb2R1Y3Rpb24nXSAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIERlcGxTdGF0ZUlEcyAgICA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBDdXJEZXBsU3RhdGVzICAgPT4gWydQcm9kdWN0aW9uJ10gICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDdXJEZXBsU3RhdGVJRHMgPT4gWzEsIDIsIDMsIDRdLCAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgSW5jaVN0YXRlcyAgICAgID0+IFsnV2FybmluZyddICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSW5jaVN0YXRlSURzICAgID0+IFsxLCAyLCAzLCA0XSwgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgIEN1ckluY2lTdGF0ZXMgICA9PiBbJ1dhcm5pbmcnXSAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEN1ckluY2lTdGF0ZUlEcyA9PiBbMSwgMiwgMywgNF0sICAgICAgICAgICAgICMgKG9wdGlvbmFsKQoKICAgICAgICBDcmVhdGVCeSAgICAgICAgPT4gWzEsIDIsIDNdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBDaGFuZ2VCeSAgICAgICAgPT4gWzMsIDIsIDFdLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBEeW5hbWljRmllbGRzCiAgICAgICAgIyAgIEF0IGxlYXN0IG9uZSBvcGVyYXRvciBtdXN0IGJlIHNwZWNpZmllZC4gT3BlcmF0b3JzIHdpbGwgYmUgY29ubmVjdGVkIHdpdGggQU5ELAogICAgICAgICMgICAgICAgdmFsdWVzIGluIGFuIG9wZXJhdG9yIHdpdGggT1IuCiAgICAgICAgIyAgIFlvdSBjYW4gYWxzbyBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gYW4gb3BlcmF0b3I6IFsndmFsdWUxJywgJ3ZhbHVlMiddCiAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkTmFtZVggPT4gewogICAgICAgICAgICBFbXB0eSAgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAgICAgICAgIyB3aWxsIHJldHVybiBkeW5hbWljIGZpZWxkcyB3aXRob3V0IGEgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2V0IHRvIDAgdG8gc2VhcmNoIGZpZWxkcyB3aXRoIGEgdmFsdWUgcHJlc2VudAogICAgICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIExpa2UgICAgICAgICAgICAgID0+ICd2YWx1ZSonLCAgICAgICAgICAgICAgICAjICJlcXVhbHMiIG9wZXJhdG9yIHdpdGggd2lsZGNhcmQgc3VwcG9ydAogICAgICAgICAgICBHcmVhdGVyVGhhbiAgICAgICA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgU21hbGxlclRoYW4gICAgICAgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgICAgICBTbWFsbGVyVGhhbkVxdWFscyA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgfQoKICAgICAgICAjIGNvbmZpZyBpdGVtcyBjcmVhdGVkIG1vcmUgdGhhbiA2MCBtaW51dGVzIGFnbyAoY29uZmlnIGl0ZW0gb2xkZXIgdGhhbiA2MCBtaW51dGVzKSAgKG9wdGlvbmFsKQogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lT2xkZXJNaW51dGVzID0+IDYwLAogICAgICAgICMgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgbGVzcyB0aGFuIDEyMCBtaW51dGVzIGFnbyAoY29uZmlnIGl0ZW0gbmV3ZXIgdGhhbiAxMjAgbWludXRlcykgKG9wdGlvbmFsKQogICAgICAgIENvbmZpZ0l0ZW1DcmVhdGVUaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjcmVhdGUgdGltZSBhZnRlciAuLi4gKGNvbmZpZyBpdGVtIG5ld2VyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVOZXdlckRhdGUgPT4gJzIwMDYtMDEtMDkgMDA6MDA6MDEnLAogICAgICAgICMgY29uZmlnIGl0ZW1zIHdpdGggY3JlYXRlZCB0aW1lIGJlZm9yZSAuLi4gKGNvbmZpZyBpdGVtIG9sZGVyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZVRpbWVPbGRlckRhdGUgPT4gJzIwMDYtMDEtMTkgMjM6NTk6NTknLAoKICAgICAgICAjIGNvbmZpZyBpdGVtcyBjaGFuZ2VkIG1vcmUgdGhhbiA2MCBtaW51dGVzIGFnbyAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJNaW51dGVzID0+IDYwLAogICAgICAgICMgY29uZmlnIGl0ZW1zIGNoYW5nZWQgbGVzcyB0aGFuIDEyMCBtaW51dGVzIGFnbyAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzID0+IDEyMCwKCiAgICAgICAgIyBjb25maWcgaXRlbXMgd2l0aCBjaGFuZ2VkIHRpbWUgYWZ0ZXIgLi4uIChjb25maWcgaXRlbSBjaGFuZ2VkIG5ld2VyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlID0+ICcyMDA2LTAxLTA5IDAwOjAwOjAxJywKICAgICAgICAjIGNvbmZpZyBpdGVtcyB3aXRoIGNoYW5nZWQgdGltZSBiZWZvcmUgLi4uIChjb25maWcgaXRlbSBjaGFuZ2VkIG9sZGVyIHRoYW4gdGhpcyBkYXRlKSAob3B0aW9uYWwpCiAgICAgICAgQ29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJEYXRlID0+ICcyMDA2LTAxLTE5IDIzOjU5OjU5JywKCiAgICAgICAgIyBPcmRlckJ5IChvcHRpb25hbCwgZGVmYXVsdCBpcyAnRG93bicpCiAgICAgICAgT3JkZXJCeSA9PiAnRG93bicsICAjIERvd258VXAKCiAgICAgICAgIyBTb3J0QnkgKG9wdGlvbmFsLCBkZWZhdWx0IGlzICdOdW1iZXInKQogICAgICAgIFNvcnRCeSAgPT4gJ05hbWUnLAoKICAgICAgICAjIE9yZGVyQnkgYW5kIFNvcnRCeSBhcyBBUlJBWSBmb3Igc3ViIHNvcnRpbmcgKG9wdGlvbmFsKQogICAgICAgIE9yZGVyQnkgPT4gWydEb3duJywgJ1VwJ10sCiAgICAgICAgU29ydEJ5ICA9PiBbJ0NvbmZpZ0l0ZW1JRCcsICdOdW1iZXInXSwKCiAgICAgICAgIyB1c2VyIHNlYXJjaAogICAgICAgIFVzZXJJRCAgICAgPT4gMTIzLCAgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgUGVybWlzc2lvbiA9PiAncm8nIHx8ICdydycsICMgb3B0aW9uYWwsIGRlZmF1bHQgaXMgJ3JvJwoKICAgICAgICAjIENhY2hlVFRMLCBjYWNoZSBzZWFyY2ggcmVzdWx0IGluIHNlY29uZHMgKG9wdGlvbmFsLCB0aGUgZGVmYXVsdCBpcyBmb3VyIG1pbnV0ZXMpCiAgICAgICAgQ2FjaGVUVEwgPT4gNjAgKiAxNSwKCiAgICAgICAgIyBFbi0gb3IgZGlzYWJsZSB1c2FnZSBvZiBRdWVyeUNvbmRpdGlvbjsgY29udHJvbGxpbmcgdGhlIGV2YWx1YXRpb24gb2Ygc29tZSBzcGVjaWFsIGNoYXJhY3RlcnMsIGUuZy4gJysnLCBhcyBzZWFyY2ggb3BlcmF0b3JzCiAgICAgICAgIyBkZWZhdWx0IDEKICAgICAgICBRdWVyeUNvbmRpdGlvbiA9PiAoMXwwKSwKICAgICk7CgpSZXR1cm5zIGZvciBDPFJlc3VsdCA9PiAnQVJSQVknPjoKCiAgICBAQ29uZmlnSXRlbUlEcyA9ICggMSwgMiwgMyApOwoKUmV0dXJucyBmb3IgQzxSZXN1bHQgPT4gJ0hBU0gnPiBvciB3aGVuIG5vIHJlc3VsdCB0eXBlIGlzIHNwZWNpZmllZDoKCiAgICAlQ29uZmlnSXRlbUlEcyA9ICgKICAgICAgICAxID0+ICcyMDEwMTAyNzAwMDAxJywKICAgICAgICAyID0+ICcyMDEwMTAyNzAwMDAyJywKICAgICAgICAzID0+ICcyMDEwMTAyNzAwMDAzJywKICAgICk7CgpSZXR1cm5zIGZvciBDPFJlc3VsdCA9PiAnQ09VTlQnPjoKCiAgICAkTnVtQ29uZmlnSXRlbUlEcyA9IDM7ICMgdGhyZWUgcmVzdWx0cwoKPWN1dAoKIyBUT0RPOiBDaGVjayBhbGwgaW5zdGFuY2VzIHdoZXJlIHRoaXMgaXMgY2FsbGVkLiBDaGFuZ2UgRHluYW1pY0ZpZWxkcywgT3JkZXJCeSAtPiBTb3J0QnksIE9yZGVyQnlEaXJlY3Rpb24gLT4gT3JkZXJCeSwgUmV0dXJuID0+IEFSUkFZIHJldHVybnMgbm90IGEgcmVmCnN1YiBDb25maWdJdGVtU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWZhdWx0IHZhbHVlcwogICAgbXkgJFJlc3VsdCAgICAgICAgID0gJFBhcmFte1Jlc3VsdH0gIHx8ICdIQVNIJzsKICAgIG15ICRPcmRlckJ5ICAgICAgICA9ICRQYXJhbXtPcmRlckJ5fSB8fCAnRG93bic7CiAgICBteSAkU29ydEJ5ICAgICAgICAgPSAkUGFyYW17U29ydEJ5fSAgfHwgJ051bWJlcic7CiAgICBteSAkTGltaXQgICAgICAgICAgPSAkUGFyYW17TGltaXR9ICAgfHwgMTAwMDA7CiAgICBteSAkUXVlcnlDb25kaXRpb24gPSAkUGFyYW17UXVlcnlDb25kaXRpb259IC8vIDE7CgogICAgbXkgJVNvcnRPcHRpb25zID0gKAogICAgICAgIENvbmZpZ0l0ZW0gICA9PiAnY2kuY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIE51bWJlciAgICAgICA9PiAnY2kuY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIE5hbWUgICAgICAgICA9PiAndi5uYW1lJywKICAgICAgICBEZXBsU3RhdGUgICAgPT4gJ2djX2RlcGwubmFtZScsCiAgICAgICAgSW5jaVN0YXRlICAgID0+ICdnY19pbmNpLm5hbWUnLAogICAgICAgIEN1ckRlcGxTdGF0ZSA9PiAnZ2NfY2RlcGwubmFtZScsCiAgICAgICAgQ3VySW5jaVN0YXRlID0+ICdnY19jaW5jaS5uYW1lJywKICAgICAgICBBZ2UgICAgICAgICAgPT4gJ2NpLmNyZWF0ZV90aW1lJywKICAgICAgICBDcmVhdGVkICAgICAgPT4gJ2NpLmNyZWF0ZV90aW1lJywKICAgICAgICBDaGFuZ2VkICAgICAgPT4gJ2NpLmNoYW5nZV90aW1lJywKICAgICk7CgogICAgIyBjaGVjayB0eXBlcyBvZiBnaXZlbiBhcmd1bWVudHMKICAgIEtFWToKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdygKICAgICAgICAgICAgQ2xhc3NJRHMgRGVwbFN0YXRlSURzIEN1ckRlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMgQ3VySW5jaVN0YXRlSURzIENyZWF0ZUJ5IENoYW5nZUJ5CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IEtFWSBpZiAhJFBhcmFteyRLZXl9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3aHkgbm8gc2VhcmNoIGZvciAnMCcgPz8/CiAgICAgICAgbmV4dCBLRVkgaWYgcmVmICRQYXJhbXskS2V5fSBlcSAnQVJSQVknICYmIEB7ICRQYXJhbXskS2V5fSB9OwoKICAgICAgICAjIGxvZyBlcnJvcgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIGdpdmVuIHBhcmFtICckS2V5JyBpcyBpbnZhbGlkIG9yIGFuIGVtcHR5IGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBvYmplY3RzCiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKICAgIG15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCiAgICAjIHF1b3RlIGlkIGFycmF5IGVsZW1lbnRzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkS2V5ICgKICAgICAgICBxdygKICAgICAgICAgICAgQ2xhc3NJRHMgRGVwbFN0YXRlSURzIEN1ckRlcGxTdGF0ZUlEcyBJbmNpU3RhdGVJRHMgQ3VySW5jaVN0YXRlSURzIENyZWF0ZUJ5IENoYW5nZUJ5CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICEkUGFyYW17JEtleX07CgogICAgICAgICMgcXVvdGUgZWxlbWVudHMKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKCBAeyAkUGFyYW17JEtleX0gfSApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkREJPYmplY3QtPlF1b3RlKCAkRWxlbWVudCwgJ0ludGVnZXInICkgKSB7CgogICAgICAgICAgICAgICAgIyBsb2cgZXJyb3IKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBnaXZlbiBwYXJhbSAnJEVsZW1lbnQnIGluICckS2V5JyBpcyBpbnZhbGlkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc29ydC9vcmRlciBieSBvcHRpb25zCiAgICBteSBAU29ydEJ5QXJyYXkgID0gcmVmICRTb3J0QnkgZXEgJ0FSUkFZJyAgPyAkU29ydEJ5LT5AKiAgOiAkU29ydEJ5OwogICAgbXkgQE9yZGVyQnlBcnJheSA9IHJlZiAkT3JkZXJCeSBlcSAnQVJSQVknID8gJE9yZGVyQnktPkAqIDogJE9yZGVyQnk7CgogICAgZm9yIG15ICRDb3VudCAoIDAgLi4gJCNTb3J0QnlBcnJheSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU29ydE9wdGlvbnN7ICRTb3J0QnlBcnJheVskQ291bnRdIH0KICAgICAgICAgICAgJiYgJFNvcnRCeUFycmF5WyRDb3VudF0gIX4gL15EeW5hbWljRmllbGRfLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB2YWxpZCBTb3J0QnkgKCcgLiAkU29ydEJ5QXJyYXlbJENvdW50XSAuICcpIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIFRPRE86IGZhbGwgYmFjayB0byBhIGRlZmF1bHQgb2YgJ1VwJwogICAgICAgIGlmICggJE9yZGVyQnlBcnJheVskQ291bnRdIG5lICdEb3duJyAmJiAkT3JkZXJCeUFycmF5WyRDb3VudF0gbmUgJ1VwJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgdmFsaWQgT3JkZXJCeSAoJyAuICRPcmRlckJ5QXJyYXlbJENvdW50XSAuICcpIScsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHNxbAogICAgbXkgJFNRTFNlbGVjdDsKCiAgICAjIFRPRE86IGFkZCB2ZXJzaW9uIHNlYXJjaAogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTFNlbGVjdCA9ICdTRUxFQ1QgQ09VTlQoRElTVElOQ1QoY2kuaWQpKSc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMU2VsZWN0ID0gJ1NFTEVDVCBESVNUSU5DVCBjaS5pZCwgY2kuY29uZmlnaXRlbV9udW1iZXInOwogICAgfQoKICAgIG15ICRTUUxGcm9tID0gJyBGUk9NIGNvbmZpZ2l0ZW0gY2knOwoKICAgICMgY2hlY2sgZm9yIG5lZWRlZCB2ZXJzaW9uIHNlYXJjaCBpbmRleCB0YWJsZSBqb2luCiAgICBteSAkVmVyc2lvblRhYmxlSm9pbmVkOwogICAgaWYgKCAkU2VsZi0+X1ZlcnNpb25TZWFyY2hJbmRleFNRTEpvaW5OZWVkZWQoIFNlYXJjaFBhcmFtcyA9PiBcJVBhcmFtICkgKSB7CiAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2IE9OIGNpLmxhc3RfdmVyc2lvbl9pZCA9IHYuaWQnOwogICAgICAgICRWZXJzaW9uVGFibGVKb2luZWQgPSAxOwogICAgfQoKICAgIG15ICRTUUxFeHQgPSAnIFdIRVJFIDEgPSAxJzsKCiAgICAjIExpbWl0IHRoZSBzZWFyY2ggdG8ganVzdCBvbmUgKG9yIGEgbGlzdCkgQ29uZmlnSXRlbUlECiAgICBpZiAoIElzU3RyaW5nV2l0aERhdGEoICRQYXJhbXtDb25maWdJdGVtSUR9ICkgfHwgSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Q29uZmlnSXRlbUlEfSApICkgewoKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ2NpLmlkJywKICAgICAgICAgICAgVmFsdWVzICAgID0+IHJlZiAkUGFyYW17Q29uZmlnSXRlbUlEfSBlcSAnQVJSQVknID8gJFBhcmFte0NvbmZpZ0l0ZW1JRH0gOiBbICRQYXJhbXtDb25maWdJdGVtSUR9IF0sCiAgICAgICAgICAgIFF1b3RlVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgICAgIEJpbmRNb2RlICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNRTEV4dCAuPSAnIEFORCAoICcgLiAkU1FMUXVlcnlJbkNvbmRpdGlvbiAuICcgKSAnOwogICAgfQoKICAgICMgbG9va3VwIGNsYXNzZXMKICAgIGlmICggJFBhcmFte0NsYXNzZXN9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJUNsYXNzTG9va3VwID0gcmV2ZXJzZSAlewogICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgKSAvLyB7fQogICAgICAgIH07CgogICAgICAgIGZvciBteSAkQ2xhc3MgKCBAeyAkUGFyYW17Q2xhc3Nlc30gfSApIHsKCiAgICAgICAgICAgIGlmICggISRDbGFzc0xvb2t1cHskQ2xhc3N9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gSUQgZm9yICRDbGFzcyBmb3VuZCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0NsYXNzSURzfSB9LCAkQ2xhc3NMb29rdXB7JENsYXNzfTsKICAgICAgICB9CiAgICB9CgogICAgIyBwZXJtaXNzaW9ucyBhcmUgaGFuZGxlZCB2aWEgY2xhc3NlcwogICAgaWYgKCAkUGFyYW17VXNlcklEfSAmJiAkUGFyYW17VXNlcklEfSAhPSAxICkgewoKICAgICAgICBteSBAQ2xhc3NJRHMgPSAkUGFyYW17Q2xhc3NJRHN9ID8gJFBhcmFte0NsYXNzSURzfS0+QCogOgogICAgICAgICAgICBrZXlzICV7CiAgICAgICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgICAgICApIC8vIHt9CiAgICAgICAgICAgIH07CgogICAgICAgIG15IEBBbGxvd2VkQ2xhc3NJRHM7CgogICAgICAgIGZvciBteSAkQ2xhc3NJRCAoQENsYXNzSURzKSB7CiAgICAgICAgICAgIG15ICRIYXNBY2Nlc3MgPSAkU2VsZi0+UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFNjb3BlICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgICAgIENsYXNzSUQgPT4gJENsYXNzSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUGFyYW17UGVybWlzc2lvbn0gLy8gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSGFzQWNjZXNzKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBBbGxvd2VkQ2xhc3NJRHMsICRDbGFzc0lEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gaWYgIUBBbGxvd2VkQ2xhc3NJRHM7CgogICAgICAgICRQYXJhbXtDbGFzc0lEc30gPSBcQEFsbG93ZWRDbGFzc0lEczsKIyBSb3RoZXIgT1NTLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgIG15ICVBbGxvd2VkR3JvdXBzSGFzaCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICRQYXJhbXtQZXJtaXNzaW9ufSAvLyAncm8nLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICAgICBDYWNoZWQgPT4gMSwKICAgICAgICApOwogICAgICAgIHJldHVybiBpZiAhJUFsbG93ZWRHcm91cHNIYXNoOwoKICAgICAgICBteSAkSXRlbU1hbmFnZW1lbnRHcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnSVRTTUNvbmZpZ0l0ZW1NYW5hZ2VtZW50R3JvdXAnKTsKCiAgICAgICAgIyBlbmZvcmNlIGdyb3VwIHBlcm1pc3Npb25zIG9ubHkgaWYgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIGNpIG1hbmFnZW1lbnQgZ3JvdXAKICAgICAgICBpZiAoICFncmVwIHsgJF8gZXEgJEl0ZW1NYW5hZ2VtZW50R3JvdXAgfSB2YWx1ZXMgJUFsbG93ZWRHcm91cHNIYXNoICkgewogICAgICAgICAgICBteSBAQWxsb3dlZEdyb3VwSURzID0ga2V5cyAlQWxsb3dlZEdyb3Vwc0hhc2g7CiAgICAgICAgICAgICRQYXJhbXtHcm91cElEc30gPSBcQEFsbG93ZWRHcm91cElEczsKICAgICAgICB9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGNsYXNzIGlkcwogICAgaWYgKCAkUGFyYW17Q2xhc3NJRHN9ICkgewogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnY2kuY2xhc3NfaWQnLAogICAgICAgICAgICBWYWx1ZXMgICAgPT4gJFBhcmFte0NsYXNzSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CiMgUm90aGVyIE9TUy8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICMgZ3JvdXAgaWRzCiAgICBpZiAoICRQYXJhbXtHcm91cElEc30gKSB7CiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdjaS5ncm91cF9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17R3JvdXBJRHN9LAogICAgICAgICAgICBRdW90ZVR5cGUgPT4gJ0ludGVnZXInLAogICAgICAgICAgICBCaW5kTW9kZSAgPT4gMCwKICAgICAgICApOwogICAgICAgIGlmICgkU1FMUXVlcnlJbkNvbmRpdGlvbikgewogICAgICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggY2kuZ3JvdXBfaWQgSVMgTlVMTCBPUiAnIC4gJFNRTFF1ZXJ5SW5Db25kaXRpb24gLiAnICkgJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICMgaWYgU1FMUXVlcnlJbkNvbmRpdGlvbiBpcyBlbXB0eQogICAgICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggY2kuZ3JvdXBfaWQgSVMgTlVMTCApICc7CiAgICAgICAgfQogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBsb29rdXAgZGVwbG95bWVudCBzdGF0ZXMKICAgIGlmICggJFBhcmFte0RlcGxTdGF0ZXN9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJURlcGxTdGF0ZUxvb2t1cCA9IHJldmVyc2UgJXsKICAgICAgICAgICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgICAgICAgICApIC8vIHt9CiAgICAgICAgfTsKCiAgICAgICAgZm9yIG15ICREZXBsU3RhdGUgKCBAeyAkUGFyYW17RGVwbFN0YXRlc30gfSApIHsKCiAgICAgICAgICAgIGlmICggISREZXBsU3RhdGVMb29rdXB7JERlcGxTdGF0ZX0gKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBJRCBmb3IgJERlcGxTdGF0ZSBmb3VuZCEiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQHsgJFBhcmFte0RlcGxTdGF0ZUlEc30gfSwgJERlcGxTdGF0ZUxvb2t1cHskRGVwbFN0YXRlfTsKICAgICAgICB9CiAgICB9CgogICAgIyBkZXBsb3ltZW50IHN0YXRlIGlkcwogICAgaWYgKCAkUGFyYW17RGVwbFN0YXRlSURzfSApIHsKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ3YuZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17RGVwbFN0YXRlSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CgogICAgIyBsb29rdXAgY3VycmVudCBkZXBsb3ltZW50IHN0YXRlcwogICAgaWYgKCAkUGFyYW17Q3VyRGVwbFN0YXRlc30gKSB7CgogICAgICAgICMgZ2V0IGNsYXNzIGxpc3QKICAgICAgICBteSAlQ3VyRGVwbFN0YXRlTG9va3VwID0gcmV2ZXJzZSAlewogICAgICAgICAgICAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCiAgICAgICAgICAgICkgLy8ge30KICAgICAgICB9OwoKICAgICAgICBmb3IgbXkgJEN1ckRlcGxTdGF0ZSAoIEB7ICRQYXJhbXtDdXJEZXBsU3RhdGVzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEN1ckRlcGxTdGF0ZUxvb2t1cHskQ3VyRGVwbFN0YXRlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIElEIGZvciAkQ3VyRGVwbFN0YXRlIGZvdW5kISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17Q3VyRGVwbFN0YXRlSURzfSB9LCAkQ3VyRGVwbFN0YXRlTG9va3VweyRDdXJEZXBsU3RhdGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGN1cnJlbnQgZGVwbG95bWVudCBzdGF0ZSBpZHMKICAgIGlmICggJFBhcmFte0N1ckRlcGxTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdjaS5jdXJfZGVwbF9zdGF0ZV9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17Q3VyRGVwbFN0YXRlSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CgogICAgIyBsb29rdXAgaW5jaWRlbnQgc3RhdGVzCiAgICBpZiAoICRQYXJhbXtJbmNpU3RhdGVzfSApIHsKCiAgICAgICAgIyBnZXQgY2xhc3MgbGlzdAogICAgICAgIG15ICVJbmNpU3RhdGVMb29rdXAgPSByZXZlcnNlICV7CiAgICAgICAgICAgICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW5jaWRlbnRTdGF0ZScsCiAgICAgICAgICAgICkgLy8ge30KICAgICAgICB9OwoKICAgICAgICBmb3IgbXkgJEluY2lTdGF0ZSAoIEB7ICRQYXJhbXtJbmNpU3RhdGVzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCAhJEluY2lTdGF0ZUxvb2t1cHskSW5jaVN0YXRlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vIElEIGZvciAkSW5jaVN0YXRlIGZvdW5kISIsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17SW5jaVN0YXRlSURzfSB9LCAkSW5jaVN0YXRlTG9va3VweyRJbmNpU3RhdGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGluY2lkZW50IHN0YXRlIGlkcwogICAgaWYgKCAkUGFyYW17SW5jaVN0YXRlSURzfSApIHsKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpLT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ3YuaW5jaV9zdGF0ZV9pZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICA9PiAkUGFyYW17SW5jaVN0YXRlSURzfSwKICAgICAgICAgICAgUXVvdGVUeXBlID0+ICdJbnRlZ2VyJywKICAgICAgICAgICAgQmluZE1vZGUgID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU1FMRXh0IC49ICcgQU5EICggJyAuICRTUUxRdWVyeUluQ29uZGl0aW9uIC4gJyApICc7CiAgICB9CgogICAgIyBsb29rdXAgY3VycmVudCBpbmNpZGVudCBzdGF0ZXMKICAgIGlmICggJFBhcmFte0N1ckluY2lTdGF0ZXN9ICkgewoKICAgICAgICAjIGdldCBjbGFzcyBsaXN0CiAgICAgICAgbXkgJUN1ckluY2lTdGF0ZUxvb2t1cCA9IHJldmVyc2UgJXsKICAgICAgICAgICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtTGlzdCgKICAgICAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbmNpZGVudFN0YXRlJywKICAgICAgICAgICAgKSAvLyB7fQogICAgICAgIH07CgogICAgICAgIGZvciBteSAkQ3VySW5jaVN0YXRlICggQHsgJFBhcmFte0N1ckluY2lTdGF0ZXN9IH0gKSB7CgogICAgICAgICAgICBpZiAoICEkQ3VySW5jaVN0YXRlTG9va3VweyRDdXJJbmNpU3RhdGV9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gSUQgZm9yICRDdXJJbmNpU3RhdGUgZm91bmQhIiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBwdXNoIEB7ICRQYXJhbXtDdXJJbmNpU3RhdGVJRHN9IH0sICRDdXJJbmNpU3RhdGVMb29rdXB7JEN1ckluY2lTdGF0ZX07CiAgICAgICAgfQogICAgfQoKICAgICMgaW5jaWRlbnQgc3RhdGUgaWRzCiAgICBpZiAoICRQYXJhbXtDdXJJbmNpU3RhdGVJRHN9ICkgewogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyktPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICA9PiAnY2kuY3VyX2luY2lfc3RhdGVfaWQnLAogICAgICAgICAgICBWYWx1ZXMgICAgPT4gJFBhcmFte0N1ckluY2lTdGF0ZUlEc30sCiAgICAgICAgICAgIFF1b3RlVHlwZSA9PiAnSW50ZWdlcicsCiAgICAgICAgICAgIEJpbmRNb2RlICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNRTEV4dCAuPSAnIEFORCAoICcgLiAkU1FMUXVlcnlJbkNvbmRpdGlvbiAuICcgKSAnOwogICAgfQoKICAgICMgb3RoZXIgY29uZmlnIGl0ZW0gc3R1ZmYKICAgIG15ICVGaWVsZFNRTE1hcCA9ICgKICAgICAgICBOdW1iZXIgICA9PiAnY2kuY29uZmlnaXRlbV9udW1iZXInLAogICAgICAgIE5hbWUgICAgID0+ICd2Lm5hbWUnLAogICAgICAgIENyZWF0ZUJ5ID0+ICdjaS5jcmVhdGVfYnknLAogICAgICAgIENoYW5nZUJ5ID0+ICdjaS5jaGFuZ2VfYnknLAogICAgKTsKCiAgICBBVFRSSUJVVEU6CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlRmllbGRTUUxNYXAgKSB7CiAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgIWRlZmluZWQgJFBhcmFteyRLZXl9OwoKICAgICAgICAjIGlmIGl0J3Mgbm8gcmVmLCBwdXQgaXQgdG8gYXJyYXkgcmVmCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyRLZXl9IGVxICcnICkgewogICAgICAgICAgICAkUGFyYW17JEtleX0gPSBbICRQYXJhbXskS2V5fSBdOwogICAgICAgIH0KCiAgICAgICAgIyBwcm9jZXNzIGFycmF5IHJlZgogICAgICAgIG15ICRVc2VkID0gMDsKCiAgICAgICAgVkFMVUU6CiAgICAgICAgZm9yIG15ICRWYWx1ZSAoIEB7ICRQYXJhbXskS2V5fSB9ICkgewogICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRWYWx1ZSB8fCAhbGVuZ3RoICRWYWx1ZTsKCiAgICAgICAgICAgICRWYWx1ZSA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAjIGNoZWNrIHNlYXJjaCBhdHRyaWJ1dGUsIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBmb3IgKgogICAgICAgICAgICBuZXh0IFZBTFVFIGlmICRWYWx1ZSA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgIGlmICggISRVc2VkICkgewogICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAnIEFORCAoJzsKICAgICAgICAgICAgICAgICRVc2VkID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gJyBPUiAnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoJFF1ZXJ5Q29uZGl0aW9uKSB7CgogICAgICAgICAgICAgICAgIyB1c2Ugc2VhcmNoIGNvbmRpdGlvbiBleHRlbnNpb24KICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gJERCT2JqZWN0LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkRmllbGRTUUxNYXB7JEtleX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gJEZpZWxkU1FMTWFweyRLZXl9IC4gIiA9ICciIC4gJERCT2JqZWN0LT5RdW90ZSgkVmFsdWUpIC4gIiciOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJFVzZWQpIHsKICAgICAgICAgICAgJFNRTEV4dCAuPSAnKSc7CiAgICAgICAgfQogICAgfQoKICAgICMgUmVtZW1iZXIgYWxyZWFkeSBqb2luZWQgdGFibGVzIGZvciBzb3J0aW5nLgogICAgbXkgJUR5bmFtaWNGaWVsZEpvaW5UYWJsZXM7CiAgICBteSAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIgPSAxOwoKICAgICMgZ2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0cwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJFBhcmFtTmFtZSAoIGtleXMgJVBhcmFtICkgewogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkUGFyYW1OYW1lID1+IG0vXkR5bmFtaWNGaWVsZF8oLispLzsKCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgTmFtZSA9PiAkMSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkRHluYW1pY0ZpZWxkLT4lKiApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gcXFbTm8gc3VjaCBkeW5hbWljIGZpZWxkICIkMSIgKG9yIGl0IGlzIGluYWN0aXZlKV0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSBkZWxldGUgJFBhcmFteyJEeW5hbWljRmllbGRfJER5bmFtaWNGaWVsZC0+e05hbWV9In07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIHVubGVzcyAkU2VhcmNoUGFyYW07CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgdW5sZXNzIHJlZiAkU2VhcmNoUGFyYW0gZXEgJ0hBU0gnOwoKICAgICAgICBteSAkTmVlZEpvaW47CiAgICAgICAgbXkgJFF1ZXJ5Rm9yRW1wdHlWYWx1ZXMgPSAwOwoKICAgICAgICBmb3IgbXkgJE9wZXJhdG9yICggc29ydCBrZXlzICRTZWFyY2hQYXJhbS0+JSogKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTEV4dFN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICBteSAkQ291bnRlciAgID0gMDsKICAgICAgICAgICAgVEVYVDoKICAgICAgICAgICAgZm9yIG15ICRUZXh0IChAU2VhcmNoUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgdW5sZXNzIGRlZmluZWQgJFRleHQ7CiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgZXEgJyc7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAqCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgIyBza2lwIHZhbGlkYXRpb24gZm9yIGVtcHR5IHZhbHVlcwogICAgICAgICAgICAgICAgaWYgKCAkT3BlcmF0b3IgbmUgJ0VtcHR5JyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyB2YWxpZGF0ZSBkYXRhIHR5cGUKICAgICAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGVTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIE5vVmFsaWRhdGVSZWdleCAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRWYWxpZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdmFsdWUgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHRTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgRW1wdHkgPT4gMSByZXF1aXJlcyBhIExFRlQgSk9JTi4KICAgICAgICAgICAgICAgIGlmICggJE9wZXJhdG9yIGVxICdFbXB0eScgJiYgJFRleHQgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEV4dFN1YiAuPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoU1FMR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnZFbXB0eSREeW5hbWljRmllbGRKb2luQ291bnRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRRdWVyeUZvckVtcHR5VmFsdWVzID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHRTdWIgLj0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlNlYXJjaFNRTEdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0b3IgICAgICAgICAgID0+ICRPcGVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMRXh0U3ViIC49ICcpJzsKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICRTUUxFeHRTdWI7CiAgICAgICAgICAgICAgICAkTmVlZEpvaW4gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJE5lZWRKb2luKSB7CgogICAgICAgICAgICBpZiAoICEkVmVyc2lvblRhYmxlSm9pbmVkICkgewogICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2IE9OIGNpLmxhc3RfdmVyc2lvbl9pZCA9IHYuaWQnOwogICAgICAgICAgICAgICAgJFZlcnNpb25UYWJsZUpvaW5lZCA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkUXVlcnlGb3JFbXB0eVZhbHVlcykgewoKICAgICAgICAgICAgICAgICMgVXNlIExFRlQgSk9JTiB0byBhbGxvdyBmb3IgbnVsbCB2YWx1ZXMuCiAgICAgICAgICAgICAgICAkU1FMRnJvbSAuPSAiIExFRlQgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdkVtcHR5JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKHYuaWQgPSBkZnZFbXB0eSREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdkVtcHR5JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLmZpZWxkX2lkID0gIiAuCiAgICAgICAgICAgICAgICAgICAgJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKSAiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gIiBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKHYuaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiIC4KICAgICAgICAgICAgICAgICAgICAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpICI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luVGFibGVzeyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpbWUgb2JqZWN0CiAgICAjIHJlbWVtYmVyIGN1cnJlbnQgdGltZSB0byBwcmV2ZW50IHNlYXJjaGVzIGZvciBmdXR1cmUgdGltZXN0YW1wcwogICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgb2xkZXIvbmV3ZXIgdGhhbiB4IG1pbnV0ZXMKICAgIG15ICVDb25maWdJdGVtVGltZSA9ICgKICAgICAgICBDb25maWdJdGVtQ3JlYXRlVGltZSA9PiAnY2kuY3JlYXRlX3RpbWUnLAogICAgKTsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVDb25maWdJdGVtVGltZSApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgb2xkZXIgdGhhbiB4IG1pbnV0ZXMKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFteyAkS2V5IC4gJ09sZGVyTWludXRlcycgfSApIHsKCiAgICAgICAgICAgICRQYXJhbXsgJEtleSAuICdPbGRlck1pbnV0ZXMnIH0gfHw9IDA7CgogICAgICAgICAgICBteSAkVGltZSA9ICREYXRlVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAgICAgJFRpbWUtPlN1YnRyYWN0KCBNaW51dGVzID0+ICRQYXJhbXsgJEtleSAuICdPbGRlck1pbnV0ZXMnIH0gKTsKCiAgICAgICAgICAgIG15ICRUYXJnZXRUaW1lID0gJEtleSBlcSAnQ29uZmlnSXRlbUNyZWF0ZVRpbWUnID8gJFRpbWUtPlRvU3RyaW5nKCkgOiAkVGltZS0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgJFNRTEV4dCAuPSBzcHJpbnRmKCAiIEFORCAoICVzIDw9ICclcycgKSIsICRDb25maWdJdGVtVGltZXskS2V5fSwgJFRhcmdldFRpbWUgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjcmVhdGVkIG5ld2VyIHRoYW4geCBtaW51dGVzCiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXsgJEtleSAuICdOZXdlck1pbnV0ZXMnIH0gKSB7CgogICAgICAgICAgICAkUGFyYW17ICRLZXkgLiAnTmV3ZXJNaW51dGVzJyB9IHx8PSAwOwoKICAgICAgICAgICAgbXkgJFRpbWUgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICAgICAgJFRpbWUtPlN1YnRyYWN0KCBNaW51dGVzID0+ICRQYXJhbXsgJEtleSAuICdOZXdlck1pbnV0ZXMnIH0gKTsKCiAgICAgICAgICAgIG15ICRUYXJnZXRUaW1lID0gJEtleSBlcSAnQ29uZmlnSXRlbUNyZWF0ZVRpbWUnID8gJFRpbWUtPlRvU3RyaW5nKCkgOiAkVGltZS0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgJFNRTEV4dCAuPSBzcHJpbnRmKCAiIEFORCAoICVzID49ICclcycgKSIsICRDb25maWdJdGVtVGltZXskS2V5fSwgJFRhcmdldFRpbWUgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgb2xkZXIvbmV3ZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVDb25maWdJdGVtVGltZSApIHsKCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgb2xkZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgICAgICBteSAkQ29tcGFyZU9sZGVyTmV3ZXJEYXRlOwogICAgICAgIGlmICggJFBhcmFteyAkS2V5IC4gJ09sZGVyRGF0ZScgfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgdGltZSBmb3JtYXQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFBhcmFteyAkS2V5IC4gJ09sZGVyRGF0ZScgfQogICAgICAgICAgICAgICAgIX4gL1xkXGRcZFxkLShcZFxkfFxkKS0oXGRcZHxcZCkgKFxkXGR8XGQpOihcZFxkfFxkKTooXGRcZHxcZCkvCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgdGltZSBmb3JtYXQgJyIgLiAkUGFyYW17ICRLZXkgLiAnT2xkZXJEYXRlJyB9IC4gIichIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFteyAkS2V5IC4gJ09sZGVyRGF0ZScgfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFRpbWUgKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHRpbWUgJyIKICAgICAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17ICRLZXkgLiAnT2xkZXJEYXRlJyB9IC4gIichIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvbXBhcmVPbGRlck5ld2VyRGF0ZSA9ICRUaW1lOwoKICAgICAgICAgICAgbXkgJFRhcmdldFRpbWUgPSAkS2V5IGVxICdDb25maWdJdGVtQ3JlYXRlVGltZScgPyAkVGltZS0+VG9TdHJpbmcoKSA6ICRUaW1lLT5Ub0Vwb2NoKCk7CgogICAgICAgICAgICAkU1FMRXh0IC49IHNwcmludGYoICIgQU5EICggJXMgPD0gJyVzJyApIiwgJENvbmZpZ0l0ZW1UaW1leyRLZXl9LCAkVGFyZ2V0VGltZSApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNyZWF0ZWQgbmV3ZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgICAgICBpZiAoICRQYXJhbXsgJEtleSAuICdOZXdlckRhdGUnIH0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRQYXJhbXsgJEtleSAuICdOZXdlckRhdGUnIH0KICAgICAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkIHRpbWUgZm9ybWF0ICciIC4gJFBhcmFteyAkS2V5IC4gJ05ld2VyRGF0ZScgfSAuICInISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRQYXJhbXsgJEtleSAuICdOZXdlckRhdGUnIH0sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRUaW1lICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PgogICAgICAgICAgICAgICAgICAgICAgICAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB0aW1lICciCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFBhcmFteyAkS2V5IC4gJ05ld2VyRGF0ZScgfSAuICInISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGRvbid0IGV4ZWN1dGUgcXVlcmllcyBpZiBuZXdlciBkYXRlIGlzIGFmdGVyIGN1cnJlbnQgZGF0ZQogICAgICAgICAgICByZXR1cm4gaWYgJFRpbWUgPiAkRGF0ZVRpbWVPYmplY3Q7CgogICAgICAgICAgICAjIGRvbid0IGV4ZWN1dGUgcXVlcmllcyBpZiBvbGRlci9uZXdlciBkYXRlIHJlc3RyaWN0aW9uIHNob3cgbm93IHZhbGlkIHRpbWVmcmFtZQogICAgICAgICAgICByZXR1cm4gaWYgJENvbXBhcmVPbGRlck5ld2VyRGF0ZSAmJiAkVGltZSA+ICRDb21wYXJlT2xkZXJOZXdlckRhdGU7CgogICAgICAgICAgICBteSAkVGFyZ2V0VGltZSA9ICRLZXkgZXEgJ0NvbmZpZ0l0ZW1DcmVhdGVUaW1lJyA/ICRUaW1lLT5Ub1N0cmluZygpIDogJFRpbWUtPlRvRXBvY2goKTsKCiAgICAgICAgICAgICRTUUxFeHQgLj0gc3ByaW50ZiggIiBBTkQgKCAlcyA+PSAnJXMnICkiLCAkQ29uZmlnSXRlbVRpbWV7JEtleX0sICRUYXJnZXRUaW1lICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBpdGVtcyBjaGFuZ2VkIG9sZGVyIHRoYW4geCBtaW51dGVzCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU9sZGVyTWludXRlc30gKSB7CgogICAgICAgICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlck1pbnV0ZXN9IHx8PSAwOwoKICAgICAgICBteSAkVGltZVN0YW1wID0gJERhdGVUaW1lT2JqZWN0LT5DbG9uZSgpOwogICAgICAgICRUaW1lU3RhbXAtPlN1YnRyYWN0KCBNaW51dGVzID0+ICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlck1pbnV0ZXN9ICk7CgogICAgICAgICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlckRhdGV9ID0gJFRpbWVTdGFtcC0+VG9TdHJpbmcoKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbXMgY2hhbmdlZCBuZXdlciB0aGFuIHggbWludXRlcwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVOZXdlck1pbnV0ZXN9ICkgewoKICAgICAgICAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzfSB8fD0gMDsKCiAgICAgICAgbXkgJFRpbWVTdGFtcCA9ICREYXRlVGltZU9iamVjdC0+Q2xvbmUoKTsKICAgICAgICAkVGltZVN0YW1wLT5TdWJ0cmFjdCggTWludXRlcyA9PiAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJNaW51dGVzfSApOwoKICAgICAgICAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlfSA9ICRUaW1lU3RhbXAtPlRvU3RyaW5nKCk7CiAgICB9CgogICAgIyBnZXQgY29uZmlnIGl0ZW1zIGNoYW5nZWQgb2xkZXIgdGhhbiB4eHh4LXh4LXh4IHh4Onh4IGRhdGUKICAgIG15ICRDb21wYXJlTGFzdENoYW5nZVRpbWVPbGRlck5ld2VyRGF0ZTsKICAgIGlmICggJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU9sZGVyRGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgdGltZSBmb3JtYXQKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVPbGRlckRhdGV9CiAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU9sZGVyRGF0ZX0nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU9sZGVyRGF0ZX0sCiAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGltZSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB0aW1lICciCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lT2xkZXJEYXRlfSAuICInISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJENvbXBhcmVMYXN0Q2hhbmdlVGltZU9sZGVyTmV3ZXJEYXRlID0gJFRpbWU7CgogICAgICAgICRTUUxFeHQgLj0gIiBBTkQgY2kuY2hhbmdlX3RpbWUgPD0gJyIgLiAkVGltZS0+VG9TdHJpbmcoKSAuICInIjsKICAgIH0KCiAgICAjIGdldCBjb25maWcgaXRlbXMgY2hhbmdlZCBuZXdlciB0aGFuIHh4eHgteHgteHggeHg6eHggZGF0ZQogICAgaWYgKCAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlfSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRQYXJhbXtDb25maWdJdGVtTGFzdENoYW5nZVRpbWVOZXdlckRhdGV9CiAgICAgICAgICAgICF+IC9cZFxkXGRcZC0oXGRcZHxcZCktKFxkXGR8XGQpIChcZFxkfFxkKTooXGRcZHxcZCk6KFxkXGR8XGQpLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCB0aW1lIGZvcm1hdCAnJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZX0nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIG15ICRUaW1lID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFBhcmFte0NvbmZpZ0l0ZW1MYXN0Q2hhbmdlVGltZU5ld2VyRGF0ZX0sCiAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICBpZiAoICEkVGltZSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB0aW1lICciCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17Q29uZmlnSXRlbUxhc3RDaGFuZ2VUaW1lTmV3ZXJEYXRlfSAuICInISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgZG9uJ3QgZXhlY3V0ZSBxdWVyaWVzIGlmIG5ld2VyIGRhdGUgaXMgYWZ0ZXIgY3VycmVudCBkYXRlCiAgICAgICAgcmV0dXJuIGlmICRUaW1lID4gJERhdGVUaW1lT2JqZWN0OwoKICAgICAgICAjIGRvbid0IGV4ZWN1dGUgcXVlcmllcyBpZiBvbGRlci9uZXdlciBkYXRlIHJlc3RyaWN0aW9uIHNob3cgbm93IHZhbGlkIHRpbWVmcmFtZQogICAgICAgIHJldHVybgogICAgICAgICAgICBpZiAkQ29tcGFyZUxhc3RDaGFuZ2VUaW1lT2xkZXJOZXdlckRhdGUgJiYgJFRpbWUgPiAkQ29tcGFyZUxhc3RDaGFuZ2VUaW1lT2xkZXJOZXdlckRhdGU7CgogICAgICAgICRTUUxFeHQgLj0gIiBBTkQgY2kuY2hhbmdlX3RpbWUgPj0gJyIgLiAkVGltZS0+VG9TdHJpbmcoKSAuICInIjsKICAgIH0KCiAgICAjIGRhdGFiYXNlIHF1ZXJ5IGZvciBzb3J0L29yZGVyIGJ5IG9wdGlvbgogICAgaWYgKCAkUmVzdWx0IG5lICdDT1VOVCcgKSB7CiAgICAgICAgJFNRTEV4dCAuPSAnIE9SREVSIEJZJzsKCiAgICAgICAgbXkgJUpvaW5lZFRhYmxlczsKICAgICAgICBmb3IgbXkgJENvdW50ICggMCAuLiAkI1NvcnRCeUFycmF5ICkgewogICAgICAgICAgICBpZiAoICRDb3VudCA+IDAgKSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICcsJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzb3J0IGJ5IGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgaWYgKCAkU29ydEJ5QXJyYXlbJENvdW50XSA9fiAvXkR5bmFtaWNGaWVsZF8oLiopLyApIHsKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGROYW1lID0gJDE7CiAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkICAgICA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZEdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICQxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkRHluYW1pY0ZpZWxkICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCB2YWxpZCBTb3J0QnkgKCcgLiAkU29ydEJ5QXJyYXlbJENvdW50XSAuICcpIScsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgSWYgdGhlIHRhYmxlIHdhcyBhbHJlYWR5IGpvaW5lZCBmb3Igc2VhcmNoaW5nLCB3ZSByZXVzZSBpdC4KICAgICAgICAgICAgICAgIGlmICggISREeW5hbWljRmllbGRKb2luVGFibGVzeyREeW5hbWljRmllbGROYW1lfSApIHsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZlcnNpb25UYWJsZUpvaW5lZCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGNvbmZpZ2l0ZW1fdmVyc2lvbiB2IE9OIGNpLmxhc3RfdmVyc2lvbl9pZCA9IHYuaWQnOwogICAgICAgICAgICAgICAgICAgICAgICAkVmVyc2lvblRhYmxlSm9pbmVkID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRTUUxGcm9tCiAgICAgICAgICAgICAgICAgICAgICAgIC49ICIgTEVGVCBPVVRFUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgICAgIE9OICh2LmlkID0gZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyLm9iamVjdF9pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIgLgogICAgICAgICAgICAgICAgICAgICAgICAkREJPYmplY3QtPlF1b3RlKCAkRHluYW1pY0ZpZWxkLT57SUR9LCAnSW50ZWdlcicgKSAuICIpICI7CgogICAgICAgICAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luVGFibGVzeyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiOwoKICAgICAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIrKzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkU1FMT3JkZXJGaWVsZCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxPcmRlckZpZWxkR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAkRHluYW1pY0ZpZWxkSm9pblRhYmxlc3skRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTUUxTZWxlY3QgLj0gIiwgJFNRTE9yZGVyRmllbGQgIjsKICAgICAgICAgICAgICAgICRTUUxFeHQgICAgLj0gIiAkU1FMT3JkZXJGaWVsZCAiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgam9pbiB0aGUgZ2VuZXJhbCBjYXRhbG9nIGZvciBzb3J0aW5nCiAgICAgICAgICAgICAgICBpZiAoICRTb3J0QnlBcnJheVskQ291bnRdIGVxICdEZXBsU3RhdGUnICYmICEkSm9pbmVkVGFibGVze0RlcGxTdGF0ZX0rKyApIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRnJvbSAuPSAnIElOTkVSIEpPSU4gZ2VuZXJhbF9jYXRhbG9nIGdjX2RlcGwgT04gKHYuZGVwbF9zdGF0ZV9pZCA9IGdjX2RlcGwuaWQpJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFNvcnRCeUFycmF5WyRDb3VudF0gZXEgJ0luY2lTdGF0ZScgJiYgISRKb2luZWRUYWJsZXN7SW5jaVN0YXRlfSsrICkgewogICAgICAgICAgICAgICAgICAgICRTUUxGcm9tIC49ICcgSU5ORVIgSk9JTiBnZW5lcmFsX2NhdGFsb2cgZ2NfaW5jaSBPTiAodi5pbmNpX3N0YXRlX2lkID0gZ2NfaW5jaS5pZCknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkU29ydEJ5QXJyYXlbJENvdW50XSBlcSAnQ3VyRGVwbFN0YXRlJyAmJiAhJEpvaW5lZFRhYmxlc3tDdXJEZXBsU3RhdGV9KysgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGdlbmVyYWxfY2F0YWxvZyBnY19jZGVwbCBPTiAoY2kuY3VyX2RlcGxfc3RhdGVfaWQgPSBnY19jZGVwbC5pZCknOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkU29ydEJ5QXJyYXlbJENvdW50XSBlcSAnQ3VySW5jaVN0YXRlJyAmJiAhJEpvaW5lZFRhYmxlc3tDdXJJbmNpU3RhdGV9KysgKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEZyb20gLj0gJyBJTk5FUiBKT0lOIGdlbmVyYWxfY2F0YWxvZyBnY19jaW5jaSBPTiAoY2kuY3VyX2luY2lfc3RhdGVfaWQgPSBnY19jaW5jaS5pZCknOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgUmVndWxhciBzb3J0LgogICAgICAgICAgICAgICAgJFNRTFNlbGVjdCAuPSAnLCAnIC4gJFNvcnRPcHRpb25zeyAkU29ydEJ5QXJyYXlbJENvdW50XSB9OwogICAgICAgICAgICAgICAgJFNRTEV4dCAgICAuPSAnICcgLiAkU29ydE9wdGlvbnN7ICRTb3J0QnlBcnJheVskQ291bnRdIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJE9yZGVyQnlBcnJheVskQ291bnRdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICcgQVNDJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gJyBERVNDJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVPYmplY3Q7CgogICAgaWYgKCAkUGFyYW17Q2FjaGVUVEx9ICkgewogICAgICAgICRDYWNoZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgICAgIG15ICRDYWNoZURhdGEgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTFNlbGVjdCAuICRTUUxGcm9tIC4gJFNRTEV4dCAuICRSZXN1bHQgLiAkTGltaXQsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICV7JENhY2hlRGF0YX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgcmV0dXJuIEB7JENhY2hlRGF0YX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCByZWYgJENhY2hlRGF0YSBlcSAnJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCRDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkYXRhYmFzZSBxdWVyeQogICAgbXkgJUNvbmZpZ0l0ZW1zOwogICAgbXkgQENvbmZpZ0l0ZW1JRHM7CiAgICBteSAkQ291bnQ7CgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTFNlbGVjdCAuICRTUUxGcm9tIC4gJFNRTEV4dCwKICAgICAgICBMaW1pdCA9PiAkTGltaXQKICAgICk7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJENvdW50ID0gJFJvd1swXTsKICAgICAgICAkQ29uZmlnSXRlbXN7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICAgICAgcHVzaCBAQ29uZmlnSXRlbUlEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIHJldHVybiBDT1VOVAogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CiAgICAgICAgaWYgKCRDYWNoZU9iamVjdCkgewogICAgICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICdDb25maWdJdGVtU2VhcmNoJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxTZWxlY3QgLiAkU1FMRnJvbSAuICRTUUxFeHQgLiAkUmVzdWx0IC4gJExpbWl0LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJENvdW50LAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFBhcmFte0NhY2hlVFRMfSB8fCA2MCAqIDQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAkQ291bnQ7CiAgICB9CgogICAgIyByZXR1cm4gSEFTSAogICAgZWxzaWYgKCAkUmVzdWx0IGVxICdIQVNIJyApIHsKICAgICAgICBpZiAoJENhY2hlT2JqZWN0KSB7CiAgICAgICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0NvbmZpZ0l0ZW1TZWFyY2gnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTFNlbGVjdCAuICRTUUxGcm9tIC4gJFNRTEV4dCAuICRSZXN1bHQgLiAkTGltaXQsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcJUNvbmZpZ0l0ZW1zLAogICAgICAgICAgICAgICAgVFRMICAgPT4gJFBhcmFte0NhY2hlVFRMfSB8fCA2MCAqIDQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAlQ29uZmlnSXRlbXM7CiAgICB9CgogICAgIyByZXR1cm4gQVJSQVkKICAgIGVsc2UgewogICAgICAgIGlmICgkQ2FjaGVPYmplY3QpIHsKICAgICAgICAgICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAnQ29uZmlnSXRlbVNlYXJjaCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMU2VsZWN0IC4gJFNRTEZyb20gLiAkU1FMRXh0IC4gJFJlc3VsdCAuICRMaW1pdCwKICAgICAgICAgICAgICAgIFZhbHVlID0+IFxAQ29uZmlnSXRlbUlEcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRQYXJhbXtDYWNoZVRUTH0gfHwgNjAgKiA0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQENvbmZpZ0l0ZW1JRHM7CiAgICB9Cn0KCnN1YiBfVmVyc2lvblNlYXJjaEluZGV4U1FMSm9pbk5lZWRlZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkQXR0cmlidXRlIChxdy9OYW1lIERlcGxTdGF0ZXMgSW5jaVN0YXRlcyBEZXBsU3RhdGVJRHMgSW5jaVN0YXRlSURzLykgewogICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtTZWFyY2hQYXJhbXN9eyRBdHRyaWJ1dGV9OwogICAgfQoKICAgIGZvciBteSAkS2V5ICgga2V5cyAkUGFyYW17U2VhcmNoUGFyYW1zfS0+JSogKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJEtleSA9fiAvXkR5bmFtaWNGaWVsZF8vOwogICAgfQoKICAgIHJldHVybjsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem/Event/DoHistory.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtL0V2ZW50L0RvSGlzdG9yeS5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5IC0gRXZlbnQgaGFuZGxlciB0aGF0IHJlY29yZHMgdGhlIGhpc3RvcnkKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok9iamVjdE1hbmFnZXI7CgogICAgbG9jYWwgJEtlcm5lbDo6T00gPSBLZXJuZWw6OlN5c3RlbTo6T2JqZWN0TWFuYWdlci0+bmV3KCk7CiAgICBteSAkRG9IaXN0b3J5T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6RG9IaXN0b3J5Jyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICByZXR1cm4gYmxlc3Mge30sICRUeXBlOwp9Cgo9aGVhZDIgUnVuKCkKClRoaXMgbWV0aG9kIGhhbmRsZXMgdGhlIGV2ZW50LgoKICAgICREb0hpc3RvcnlPYmplY3QtPlJ1bigKICAgICAgICBFdmVudCA9PiAnQ29uZmlnSXRlbUNyZWF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDb21tZW50ICAgICAgPT4gJ25ldyB2YWx1ZTogMScsCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAxMjMsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhEYXRhIEV2ZW50IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGZvciBkeW5hbWljIGZpZWxkcyBmaXJzdCwgbW9zdCBldmVudHMgd2lsbCBiZSB0aGlzLAogICAgIyBSZWFkYWJsZVZhbHVlIGFuZCBSZWFkYWJsZU9sZFZhbHVlIGFyZSBleHBlY3RlZCB0byBiZSBzdHJpbmdzCiAgICBpZiAoICRQYXJhbXtFdmVudH0gPX4gbS9eQ29uZmlnSXRlbUR5bmFtaWNGaWVsZFVwZGF0ZV8vICkgewogICAgICAgIHJldHVybiAkU2VsZi0+X0hpc3RvcnlBZGQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17RGF0YX17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgSGlzdG9yeVR5cGUgID0+ICdWYWx1ZVVwZGF0ZScsCiAgICAgICAgICAgIENvbW1lbnQgICAgICA9PiAiJFBhcmFte0RhdGF9e0ZpZWxkTmFtZX0lJSRQYXJhbXtEYXRhfXtSZWFkYWJsZU9sZFZhbHVlfSUlJFBhcmFte0RhdGF9e1JlYWRhYmxlVmFsdWV9IiwKICAgICAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkdWUgdG8gY29uc2lzdGVuY3kgd2l0aCB0aWNrZXQgaGlzdG9yeSwgd2UgbmVlZCBIaXN0b3J5VHlwZQogICAgJFBhcmFte0hpc3RvcnlUeXBlfSA9ICRQYXJhbXtFdmVudH07CgogICAgIyBkaXNwYXRjaCB0YWJsZSBmb3IgYWxsIGV2ZW50cwogICAgbXkgJURpc3BhdGNoZXIgPSAoCiAgICAgICAgQ29uZmlnSXRlbUNyZWF0ZSAgICAgID0+IFwmX0hpc3RvcnlBZGQsCiAgICAgICAgQ29uZmlnSXRlbVVwZGF0ZSAgICAgID0+IFwmX1JldHVybiwKICAgICAgICBDb25maWdJdGVtRGVsZXRlICAgICAgPT4gXCZfQ29uZmlnSXRlbURlbGV0ZSwKICAgICAgICBMaW5rQWRkICAgICAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBMaW5rRGVsZXRlICAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBOYW1lVXBkYXRlICAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBJbmNpZGVudFN0YXRlVXBkYXRlICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBEZXBsb3ltZW50U3RhdGVVcGRhdGUgPT4gXCZfSGlzdG9yeUFkZCwKIyBSb3RoZXIgT1NTIC8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKICAgICAgICBHcm91cFVwZGF0ZSAgICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgICAgIERlZmluaXRpb25VcGRhdGUgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZlcnNpb25DcmVhdGUgICAgICAgICA9PiBcJl9IaXN0b3J5QWRkLAogICAgICAgIFZlcnNpb25VcGRhdGUgICAgICAgICA9PiBcJl9SZXR1cm4sCiAgICAgICAgRGVmaW5pdGlvbkNyZWF0ZSAgICAgID0+IFwmX1JldHVybiwKICAgICAgICBWZXJzaW9uRGVsZXRlICAgICAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBBdHRhY2htZW50QWRkUG9zdCAgICAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICAgICBBdHRhY2htZW50RGVsZXRlUG9zdCAgPT4gXCZfSGlzdG9yeUFkZCwKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhZXhpc3RzICREaXNwYXRjaGVyeyAkUGFyYW17RXZlbnR9IH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdub24gZXhpc3RlbnQgaGlzdG9yeSB0eXBlOiAnIC4gJFBhcmFte0V2ZW50fSwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWxsIGNhbGxiYWNrCiAgICBteSAkU3ViID0gJERpc3BhdGNoZXJ7ICRQYXJhbXtFdmVudH0gfTsKICAgICRTZWxmLT4kU3ViKAogICAgICAgICVQYXJhbSwKICAgICAgICAleyAkUGFyYW17RGF0YX0gfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1oZWFkMSBJTlRFUk5BTCBJTlRFUkZBQ0UKCj1oZWFkMiBfUmV0dXJuKCkKCmRvIG5vdGhpbmcKCj1jdXQKCnN1YiBfUmV0dXJuIHsgcmV0dXJuIDEgfQoKPWhlYWQyIF9Db25maWdJdGVtRGVsZXRlKCkKCmhpc3RvcnkncyBldmVudCBoYW5kbGVyIGZvciBDb25maWdJdGVtRGVsZXRlCgo9Y3V0CgpzdWIgX0NvbmZpZ0l0ZW1EZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlbGV0ZSBoaXN0b3J5CiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+SGlzdG9yeURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgX0hpc3RvcnlBZGQoKQoKaGlzdG9yeSdzIGRlZmF1bHQgZXZlbnQgaGFuZGxlci4KCj1jdXQKCnN1YiBfSGlzdG9yeUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWRkIGhpc3RvcnkgZW50cnkKICAgIHJldHVybiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+SGlzdG9yeUFkZCgKICAgICAgICAlUGFyYW0sCiAgICApOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/ITSMConfigItem/Permission.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSAgLSBLZXJuZWwvU3lzdGVtL0lUU01Db25maWdJdGVtL1Blcm1pc3Npb24ucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlBlcm1pc3Npb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTGlzdDo6VXRpbCBxdyhhbnkgbm9uZSk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpQZXJtaXNzaW9uIC0gbW9kdWxlIGZvciBJVFNNQ29uZmlnSXRlbS5wbSB3aXRoIFBlcm1pc3Npb24gZnVuY3Rpb25zCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBQZXJtaXNzaW9uIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgUGVybWlzc2lvbigpCgpyZXR1cm5zIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb25zIG9yIG5vdAoKICAgIG15ICRBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFNjb3BlICAgID0+ICdDbGFzcycsICMgQ2xhc3MgfHwgSXRlbQogICAgICAgIENsYXNzSUQgID0+IDEyMywgICAgICMgaWYgU2NvcGUgaXMgJ0NsYXNzJwogICAgICAgIEl0ZW1JRCAgID0+IDEyMywgICAgICMgaWYgU2NvcGUgaXMgJ0l0ZW0nCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgKTsKCm9yIHdpdGhvdXQgbG9nZ2luZywgZm9yIGV4YW1wbGUgZm9yIHRvIGNoZWNrIGlmIGEgbGluay9hY3Rpb24gc2hvdWxkIGJlIHNob3duCgogICAgbXkgJEFjY2VzcyA9ICRDb25maWdJdGVtT2JqZWN0LT5QZXJtaXNzaW9uKAogICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgU2NvcGUgICAgPT4gJ0NsYXNzJywgIyBDbGFzcyB8fCBJdGVtCiAgICAgICAgQ2xhc3NJRCAgPT4gMTIzLCAgICAgIyBpZiBTY29wZSBpcyAnQ2xhc3MnCiAgICAgICAgSXRlbUlEICAgPT4gMTIzLCAgICAgIyBpZiBTY29wZSBpcyAnSXRlbScKICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVHlwZSBTY29wZSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBmb3IgZXhpc3RlbmNlIG9mIEl0ZW1JRCBvciBDbGFzc0lEIGRlcGVuZGVudAogICAgIyBvbiB0aGUgU2NvcGUKICAgIGlmICgKICAgICAgICAoICRQYXJhbXtTY29wZX0gZXEgJ0NsYXNzJyAmJiAhJFBhcmFte0NsYXNzSUR9ICkKICAgICAgICB8fAogICAgICAgICggJFBhcmFte1Njb3BlfSBlcSAnSXRlbScgJiYgISRQYXJhbXtJdGVtSUR9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIENsYXNzSUQgaWYgU2NvcGUgaXMgJ0NsYXNzJyBvciBJdGVtSUQgaWYgU2NvcGUgaXMgJ0l0ZW0nISIsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgaWYgKCAkUGFyYW17U2NvcGV9IGVxICdJdGVtJyApIHsKICAgICAgICBteSAkR3JvdXBBdXRoID0gJFNlbGYtPl9JdGVtR3JvdXBDaGVjaygKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIHVubGVzcyAkR3JvdXBBdXRoOwogICAgfQojIEVPIElUU01Db25maWdJdGVtTXVsdGl0ZW5hbmN5CgogICAgIyBSdW4gYWxsIElUU01Db25maWdJdGVtIFBlcm1pc3Npb24gbW9kdWxlcy4KICAgICMKICAgICMgVGhlIGlkZWEgaXMgdGhlIHRoZSBwZXJtaXNzaW9uIG1vZHVsZXMgYXJlIG9yZGVyZWQgYW5kIGNhbiBiZSBkaXZpZGVkIGludG8gdHdvIHBoYXNlcy4KICAgICMgSW4gdGhlIGZpcnN0IHBoYXNlICdSZXF1aXJlZCcgaXMgb24gYW5kICdHcmFudGVkJyBpcyBvZmYuIFRoaXMgYXNzdXJlcyB0aGF0IGFsbCByZXF1aXJlZAogICAgIyBwcmVjb25kaXRpb25zIGFyZSBtZXQuIEluIHRoZSBzZWNvbmQgcGhhc2UgJ1JlcXVpcmVkJyBpcyBvZmYgYW5kICdHcmFudGVkJyBpcyBvbi4gSXQgc3VmZmljZXMKICAgICMgd2hlbiBvbmx5IG9uIHNlY29uZCBwaGFzZSBtb2R1bGUgZ3JhbnRzIGFjY2Vzcy4KICAgICMKICAgICMgT3RoZXIgY29tYmluYXRpb25zIGFyZSBwb3NzaWJsZSBidXQgbWlnaHQgYnJpbmcgc3VycHJpc2luZyByZXN1bHRzLgogICAgaWYgKAogICAgICAgIHJlZiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoICdJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6JyAuICRQYXJhbXtTY29wZX0gKSBlcSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJU1vZHVsZXMgPSAlewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoICdJVFNNQ29uZmlnSXRlbTo6UGVybWlzc2lvbjo6JyAuICRQYXJhbXtTY29wZX0gKQogICAgICAgIH07CiAgICAgICAgTU9EVUxFOgogICAgICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICVNb2R1bGVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IE1PRFVMRSB1bmxlc3MgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSggJE1vZHVsZXN7JE1vZHVsZX0tPntNb2R1bGV9ICk7CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QKICAgICAgICAgICAgbXkgJE1vZHVsZU9iamVjdCA9ICRNb2R1bGVzeyRNb2R1bGV9LT57TW9kdWxlfS0+bmV3OwoKICAgICAgICAgICAgIyBleGVjdXRlIFJ1bigpCiAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRNb2R1bGVPYmplY3QtPlJ1biglUGFyYW0pOwoKICAgICAgICAgICAgIyBjaGVjayBncmFudGVkIG9wdGlvbiAoc2hvdWxkIEkgc2F5IG9rKQogICAgICAgICAgICBpZiAoICRBY2Nlc3NPayAmJiAkTW9kdWxlc3skTW9kdWxlfS0+e0dyYW50ZWR9ICkgewoKICAgICAgICAgICAgICAgICMgYWNjZXNzIG9rCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZWZ1c2UgYWNjZXNzICBiZWNhdXNlIGFjY2VzcyBpcyBmYWxzZSBidXQgaXQncyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgJiYgJE1vZHVsZXN7JE1vZHVsZX0tPntSZXF1aXJlZH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcm1pc3Npb24gZGVuaWVkIGJlY2F1c2UgbW9kdWxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIigkTW9kdWxlc3skTW9kdWxlfS0+e01vZHVsZX0pIGlzIHJlcXVpcmVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIihVc2VySUQ6ICRQYXJhbXtVc2VySUR9ICckUGFyYW17VHlwZX0nICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIm9uICRQYXJhbXtTY29wZX06ICIgLiAkUGFyYW17ICRQYXJhbXtTY29wZX0gLiAnSUQnIH0gLiAiKSEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZWZ1c2UgYWNjZXNzCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBkb24ndCBncmFudCBhY2Nlc3MKICAgIGlmICggISRQYXJhbXtMb2dOb30gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUGVybWlzc2lvbiBkZW5pZWQgKFVzZXJJRDogJFBhcmFte1VzZXJJRH0gJyRQYXJhbXtUeXBlfScgIgogICAgICAgICAgICAgICAgLiAib24gJFBhcmFte1Njb3BlfTogIiAuICRQYXJhbXsgJFBhcmFte1Njb3BlfSAuICdJRCcgfSAuICIpISIsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1oZWFkMiBDdXN0b21lclBlcm1pc3Npb24oKQoKcmV0dXJucyB3aGV0aGVyIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9ucyBvciBub3QKCiAgICBteSAkQWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgICAgICA9PiAxMjMsCiAgICAgICAgTG9nTm8gICAgICAgID0+IDEsICAgICMgb3B0aW9uYWwsIGRvIG5vdCBsb2csIGRlZmF1bHQ6IDAKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJQZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhDb25maWdJdGVtSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lckdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKICAgIG15ICVHcm91cExvb2t1cDsKCiAgICBteSAlQ29uZGl0aW9ucyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXI6OkNvbmZpZ0l0ZW06OlBlcm1pc3Npb25Db25kaXRpb25zJykgLy8ge30gfTsKICAgIG15ICRDb25maWdJdGVtID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CgogICAgICAgICMgaWYgZ3JvdXBfaWQgaXMgZGVmaW5lZCwgdGhlbiBpdCBtdXN0IGJlbG9uZyB0byBvbmUgb2YgdGhlIGN1c3RvbWVyIHVzZXIncyBhdXRob3JpemVkIGdyb3VwcwogICAgICAgIHJldHVybiBpZiAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9ICYmIG5vbmUgeyAkXyBlcSAkQ29uZmlnSXRlbS0+e0dyb3VwSUR9IH0gdmFsdWVzICVHcm91cExvb2t1cDsKICAgIH0KIyBFTyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQoKICAgIENPTkRJVElPTjoKICAgIGZvciBteSAkQ29uZGl0aW9uU2V0ICggdmFsdWVzICVDb25kaXRpb25zICkgewogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0dyb3Vwc30gJiYgJENvbmRpdGlvblNldC0+e0dyb3Vwc30tPkAqICkgewogICAgICAgICAgICBpZiAoICElR3JvdXBMb29rdXAgKSB7CiAgICAgICAgICAgICAgICAlR3JvdXBMb29rdXAgPSByZXZlcnNlICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiBub25lIHsgJEdyb3VwTG9va3VweyRffSB9ICRDb25kaXRpb25TZXQtPntHcm91cHN9LT5AKjsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0NsYXNzZXN9ICkgewogICAgICAgICAgICBteSBAQ2xhc3NlcyA9IHJlZiAkQ29uZGl0aW9uU2V0LT57Q2xhc3Nlc30gPyAkQ29uZGl0aW9uU2V0LT57Q2xhc3Nlc30tPkAqIDogKCAkQ29uZGl0aW9uU2V0LT57Q2xhc3Nlc30gKTsKCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmIEBDbGFzc2VzICYmIG5vbmUgeyAkXyBlcSAkQ29uZmlnSXRlbS0+e0NsYXNzfSB9IEBDbGFzc2VzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30gKSB7CiAgICAgICAgICAgIG15IEBEZXBsU3RhdGVzID0gcmVmICRDb25kaXRpb25TZXQtPntEZXBsb3ltZW50U3RhdGVzfSA/ICRDb25kaXRpb25TZXQtPntEZXBsb3ltZW50U3RhdGVzfS0+QCogOiAoICRDb25kaXRpb25TZXQtPntEZXBsb3ltZW50U3RhdGVzfSApOwoKICAgICAgICAgICAgbmV4dCBDT05ESVRJT04gaWYgQERlcGxTdGF0ZXMgJiYgbm9uZSB7ICRfIGVxICRDb25maWdJdGVtLT57RGVwbFN0YXRlfSB9IEBEZXBsU3RhdGVzOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkQ29uZGl0aW9uU2V0LT57RHluYW1pY0ZpZWxkVmFsdWVzfSApIHsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZE5hbWUgKCBrZXlzICRDb25kaXRpb25TZXQtPntEeW5hbWljRmllbGRWYWx1ZXN9LT4lKiApIHsKICAgICAgICAgICAgICAgIG15ICRDb25kaXRpb25WYWx1ZSA9ICRDb25kaXRpb25TZXQtPntEeW5hbWljRmllbGRWYWx1ZXN9eyRGaWVsZE5hbWV9IC8vICcnOwoKICAgICAgICAgICAgICAgIGlmICggIWRlZmluZWQgJENvbmZpZ0l0ZW0tPnsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiAkQ29uZGl0aW9uVmFsdWUgbmUgJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICFyZWYgJENvbmZpZ0l0ZW0tPnsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiAkQ29uZGl0aW9uVmFsdWUgbmUgJENvbmZpZ0l0ZW0tPnsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJENvbmRpdGlvblZhbHVlIGVxICcnICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmICRDb25maWdJdGVtLT57IkR5bmFtaWNGaWVsZF8kRmllbGROYW1lIn0tPkAqOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBDT05ESVRJT04gaWYgbm9uZSB7ICRfIGVxICRDb25kaXRpb25WYWx1ZSB9ICRDb25maWdJdGVtLT57IkR5bmFtaWNGaWVsZF8kRmllbGROYW1lIn0tPkAqOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRDb25kaXRpb25TZXQtPntDdXN0b21lclVzZXJEeW5hbWljRmllbGR9ICkgewogICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiAhJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJENvbmRpdGlvblNldC0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0gfTsKCiAgICAgICAgICAgIG15IEBDdXN0b21lclVzZXJzID0gcmVmICRDb25maWdJdGVtLT57ICdEeW5hbWljRmllbGRfJyAuICRDb25kaXRpb25TZXQtPntDdXN0b21lclVzZXJEeW5hbWljRmllbGR9IH0KICAgICAgICAgICAgICAgID8gJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJENvbmRpdGlvblNldC0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0gfS0+QCoKICAgICAgICAgICAgICAgIDogKCAkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkfSB9ICk7CgogICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiBub25lIHsgJF8gZXEgJFBhcmFte1VzZXJJRH0gfSBAQ3VzdG9tZXJVc2VyczsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0N1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZH0gKSB7CiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmICEkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkfSB9OwoKICAgICAgICAgICAgbXkgQEN1c3RvbWVyQ29tcGFuaWVzID0gcmVmICRDb25maWdJdGVtLT57ICdEeW5hbWljRmllbGRfJyAuICRDb25kaXRpb25TZXQtPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9IH0KICAgICAgICAgICAgICAgID8gJENvbmZpZ0l0ZW0tPnsgJ0R5bmFtaWNGaWVsZF8nIC4gJENvbmRpdGlvblNldC0+e0N1c3RvbWVyQ29tcGFueUR5bmFtaWNGaWVsZH0gfS0+QCoKICAgICAgICAgICAgICAgIDogKCAkQ29uZmlnSXRlbS0+eyAnRHluYW1pY0ZpZWxkXycgLiAkQ29uZGl0aW9uU2V0LT57Q3VzdG9tZXJDb21wYW55RHluYW1pY0ZpZWxkfSB9ICk7CgogICAgICAgICAgICBteSAlQWNjZXNzaWJsZUN1c3RvbWVycyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyktPkdyb3VwQ29udGV4dEN1c3RvbWVycygKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBDT05ESVRJT04gaWYgbm9uZSB7ICRBY2Nlc3NpYmxlQ3VzdG9tZXJzeyRffSB9IEBDdXN0b21lckNvbXBhbmllczsKICAgICAgICB9CgogICAgICAgICMgZ3JhbnQgYWNjZXNzCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKCAhJFBhcmFte0xvZ05vfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJQZXJtaXNzaW9uIGRlbmllZCAoQ3VzdG9tZXJVc2VySUQ6ICRQYXJhbXtVc2VySUR9ICIKICAgICAgICAgICAgICAgIC4gIm9uIENvbmZpZ0l0ZW06ICIgLiAkUGFyYW17Q29uZmlnSXRlbUlEfSAuICIpISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvbid0IGdyYW50IGFjY2VzcwogICAgcmV0dXJuOwp9Cgo9aGVhZDIgUHVibGljUGVybWlzc2lvbigpCgpyZXR1cm5zIHdoZXRoZXIgdGhlIHB1YmxpYyBub24tbG9nZ2VkIHVzZXIgaGFzIHBlcm1pc3Npb25zIG9yIG5vdAoKICAgIG15ICRBY2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+UHVibGljUGVybWlzc2lvbigKICAgICAgICBDb25maWdJdGVtSUQgPT4gMTIzLAogICAgICAgIExvZ05vICAgICAgICA9PiAxLCAgICAjIG9wdGlvbmFsLCBkbyBub3QgbG9nLCBkZWZhdWx0OiAwCiAgICApOwoKPWN1dAoKc3ViIFB1YmxpY1Blcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KENvbmZpZ0l0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlQ29uZGl0aW9ucyA9ICV7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnUHVibGljOjpDb25maWdJdGVtOjpQZXJtaXNzaW9uQ29uZGl0aW9ucycpIC8vIHt9IH07CiAgICBteSAkQ29uZmlnSXRlbSA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgIENvbmZpZ0l0ZW1JRCAgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiBhbnkgeyAkXy0+e0N1c3RvbWVyVXNlckR5bmFtaWNGaWVsZH0gfHwgJF8tPntDdXN0b21lckNvbXBhbnlEeW5hbWljRmllbGR9IH0gdmFsdWVzICVDb25kaXRpb25zLAogICAgKTsKCiAgICBDT05ESVRJT046CiAgICBmb3IgbXkgJENvbmRpdGlvblNldCAoIHZhbHVlcyAlQ29uZGl0aW9ucyApIHsKICAgICAgICBpZiAoICRDb25kaXRpb25TZXQtPntDbGFzc2VzfSApIHsKICAgICAgICAgICAgbXkgQENsYXNzZXMgPSByZWYgJENvbmRpdGlvblNldC0+e0NsYXNzZXN9ID8gJENvbmRpdGlvblNldC0+e0NsYXNzZXN9LT5AKiA6ICggJENvbmRpdGlvblNldC0+e0NsYXNzZXN9ICk7CgogICAgICAgICAgICBuZXh0IENPTkRJVElPTiBpZiBAQ2xhc3NlcyAmJiBub25lIHsgJF8gZXEgJENvbmZpZ0l0ZW0tPntDbGFzc30gfSBAQ2xhc3NlczsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0RlcGxveW1lbnRTdGF0ZXN9ICkgewogICAgICAgICAgICBteSBARGVwbFN0YXRlcyA9IHJlZiAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30gPyAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30tPkAqIDogKCAkQ29uZGl0aW9uU2V0LT57RGVwbG95bWVudFN0YXRlc30gKTsKCiAgICAgICAgICAgIG5leHQgQ09ORElUSU9OIGlmIEBEZXBsU3RhdGVzICYmIG5vbmUgeyAkXyBlcSAkQ29uZmlnSXRlbS0+e0RlcGxTdGF0ZX0gfSBARGVwbFN0YXRlczsKICAgICAgICB9CgogICAgICAgIGlmICggJENvbmRpdGlvblNldC0+e0R5bmFtaWNGaWVsZFZhbHVlc30gKSB7CiAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lICgga2V5cyAkQ29uZGl0aW9uU2V0LT57RHluYW1pY0ZpZWxkVmFsdWVzfS0+JSogKSB7CiAgICAgICAgICAgICAgICBteSAkRmllbGRWYWx1ZSA9ICRDb25kaXRpb25TZXQtPntEeW5hbWljRmllbGRWYWx1ZXN9eyRGaWVsZE5hbWV9OwogICAgICAgICAgICAgICAgbmV4dCBDT05ESVRJT04gaWYgJEZpZWxkVmFsdWUgJiYgJENvbmZpZ0l0ZW0tPnsiRHluYW1pY0ZpZWxkXyRGaWVsZE5hbWUifSBuZSAkRmllbGRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBncmFudCBhY2Nlc3MKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17TG9nTm99ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlBlcm1pc3Npb24gZGVuaWVkIChQdWJsaWMgYWNjZXNzICIKICAgICAgICAgICAgICAgIC4gIm9uIENvbmZpZ0l0ZW06ICIgLiAkUGFyYW17Q29uZmlnSXRlbUlEfSAuICIpISIsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvbid0IGdyYW50IGFjY2VzcwogICAgcmV0dXJuOwp9CgojIFJvdGhlciBPU1MgLyBJVFNNQ29uZmlnSXRlbU11bHRpdGVuYW5jeQpzdWIgX0l0ZW1Hcm91cENoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBnZXQgY29uZmlnIGl0ZW0gZGF0YQogICAgbXkgJENvbmZpZ0l0ZW0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0nKS0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0l0ZW1JRH0sCiAgICApOwoKICAgICMgdGhlIGl0ZW0gcGVybWlzc2lvbiBncm91cCBpcyBvcHRpb25hbCwgc28gZ3JhbnQgYWNjZXNzIGlmIGl0IGV4aXN0cyBidXQgaXMgbm90IHNldAogICAgbXkgJEl0ZW1QZXJtaXNzaW9uID0gJENvbmZpZ0l0ZW0tPntHcm91cElEfTsKICAgIHJldHVybiAxIHVubGVzcyAkSXRlbVBlcm1pc3Npb247CgogICAgIyBnZXQgdXNlciBncm91cHMKICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBUeXBlICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgQ2FjaGVkID0+IDEsCiAgICApOwoKICAgIG15ICRJdGVtTWFuYWdlbWVudEdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdJVFNNQ29uZmlnSXRlbU1hbmFnZW1lbnRHcm91cCcpOwoKICAgICMgbG9va2luZyBmb3IgZ3JvdXAgaWQsIGdyYW50IGFjY2VzcyBpZiB1c2VyIGlzIGluIGdyb3VwIG9yIGlzIGEgbWVtYmVyIG9mIHRoZSBjaSBtYW5hZ2VtZW50IGdyb3VwCiAgICBmb3IgbXkgJEdyb3VwSUQgKCBrZXlzICVHcm91cHMgKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJEdyb3Vwc3skR3JvdXBJRH0gZXEgJEl0ZW1NYW5hZ2VtZW50R3JvdXAgfHwgJEdyb3VwSUQgZXEgJEl0ZW1QZXJtaXNzaW9uOwogICAgfQoKICAgICMgcmVmdXNlIGFjY2VzcyBwZXIgZGVmYXVsdAogICAgcmV0dXJuOwp9CiMgRU8gSVRTTUNvbmZpZ0l0ZW1NdWx0aXRlbmFuY3kKCjE7Cg==</File>
        <File Location="Kernel/Config/Files/XML/ITSMConfigItemMultitenancy.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJDaGFuZ2VzIj4KCiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ29uZmlnSXRlbU1hbmFnZW1lbnRHcm91cCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5NYW5hZ2VtZW50IGdyb3VwIHRoYXQgZXhlbXB0cyBmcm9tIGFueSBjb25maWcgaXRlbSBsZXZlbCBncm91cCByZXN0cmljdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpHZW5lcmFsQ2F0YWxvZzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIj5hZG1pbjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcyMjI0NvbmZpZ2l0ZW1Hcm91cCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Nb2RlIGZvciBjb25maWcgaXRlbSBsZXZlbCBncm91cCByZXN0cmljdGlvbnMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpHZW5lcmFsQ2F0YWxvZzwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzOjpHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIiBUcmFuc2xhdGFibGU9IjEiPkNvbmZpZyBJdGVtIEdyb3VwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmlvcml0eSI+MjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiIFRyYW5zbGF0YWJsZT0iMSI+U2V0IG1vZGUgZm9yIGNvbmZpZyBpdGVtIGxldmVsIGdyb3VwIHJlc3RyaWN0aW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRhdGEiPgogICAgICAgICAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiIFRyYW5zbGF0YWJsZT0iMSI+RGlzYWJsZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSIgVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVkPC9JdGVtPgogICAgICAgICAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlZCBhbmQgcmVxdWlyZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgPC9IYXNoPgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db25maWdJdGVtR3JvdXA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5PcHRpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1hbmRhdG9yeSIgVmFsdWVUeXBlPSJDaGVja2JveCI+MTwvSXRlbT4gICAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPiAgICAKCiAgICA8IS0tIE92ZXJyaWRlIHRoZXNlIG9yaWdpbmFsIElUU01Db25maWdJdGVtIHNldHRpbmdzIHRvIGluc2VydCB0aGUgR3JvdXBVcGRhdGUgZXZlbnQgLS0+CiAgICA8U2V0dGluZyBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RXZlbnRNb2R1bGVQb3N0IyMjMTAwLUhpc3RvcnkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+Q29uZmlnIGl0ZW0gZXZlbnQgbW9kdWxlIHRoYXQgZW5hYmxlcyBsb2dnaW5nIHRvIGhpc3RvcnkgaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkV2ZW50OjpJVFNNQ29uZmlnSXRlbTwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkRvSGlzdG9yeTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihDb25maWdJdGVtQ3JlYXRlfFZlcnNpb25DcmVhdGV8RGVwbG95bWVudFN0YXRlVXBkYXRlfEluY2lkZW50U3RhdGVVcGRhdGV8Q29uZmlnSXRlbURlbGV0ZXxMaW5rQWRkfExpbmtEZWxldGV8RGVmaW5pdGlvblVwZGF0ZXxOYW1lVXBkYXRlfFZlcnNpb25EZWxldGV8QXR0YWNobWVudEFkZFBvc3R8QXR0YWNobWVudERlbGV0ZVBvc3R8Q29uZmlnSXRlbUR5bmFtaWNGaWVsZHxHcm91cFVwZGF0ZXxDb25maWdJdGVtVXBkYXRlfFZlcnNpb25VcGRhdGUpPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUcmFuc2FjdGlvbiI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJFdmVudHMjIyNJVFNNQ29uZmlnSXRlbSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5MaXN0IG9mIGFsbCBQYWNrYWdlIGV2ZW50cyB0byBiZSBkaXNwbGF5ZWQgaW4gdGhlIEdVSS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkZyb250ZW5kOjpBZG1pbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgIDxJdGVtPkNvbmZpZ0l0ZW1DcmVhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db25maWdJdGVtVXBkYXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VmVyc2lvbkNyZWF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkRlcGxveW1lbnRTdGF0ZVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkluY2lkZW50U3RhdGVVcGRhdGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db25maWdJdGVtRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+TmFtZVVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkF0dGFjaG1lbnRBZGRQb3N0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+QXR0YWNobWVudERlbGV0ZVBvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5WZXJzaW9uRGVsZXRlPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+VmVyc2lvblVwZGF0ZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPkdyb3VwVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0FycmF5PgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJFbGFzdGljc2VhcmNoOjpDb25maWdJdGVtU3RvcmVGaWVsZHMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCIgQ29uZmlnTGV2ZWw9IjEwMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RmllbGRzIHN0b3JlZCBpbiB0aGUgY29uZmlndXJhdGlvbiBpdGVtIGluZGV4IHdoaWNoIGFyZSB1c2VkIGZvciBvdGhlciB0aGluZ3MgYmVzaWRlcyBmdWxsdGV4dCBzZWFyY2hlcy4gRm9yIHRoZSBjb21wbGV0ZSBmdW5jdGlvbmFsaXR5IGFsbCBmaWVsZHMgYXJlIG1hbmRhdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OkVsYXN0aWNzZWFyY2g6OlNldHRpbmdzPC9OYXZpZ2F0aW9uPgogICAgICAgIDxWYWx1ZT4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJhc2ljIj4KICAgICAgICAgICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPkNvbmZpZ0l0ZW1JRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2xhc3NJRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxJdGVtPk51bWJlcjwvSXRlbT4KICAgICAgICAgICAgICAgICAgICAgICAgPEl0ZW0+R3JvdXBJRDwvSXRlbT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEeW5hbWljRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KCjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="scripts/test/ConfigItemMultiTenancy.t" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAxOS0yMDI1IFJvdGhlciBPU1MgR21iSCwgaHR0cHM6Ly9vdG9iby5pby8KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCnVzZSBUZXN0Mjo6VjA7CgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6UmVnaXN0ZXJPTTsgICAgIyBTZXQgdXAgJEtlcm5lbDo6T00KCnVzZSBEYXRhOjpEdW1wZXI7Cgp1c2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkRhc2hib2FyZDo6VGlja2V0UHJvZmlsZVNlYXJjaDsKCiMgZ2V0IGhlbHBlciBvYmplY3QKJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpVbml0VGVzdDo6SGVscGVyJyA9PiB7CiAgICAgICAgUmVzdG9yZURhdGFiYXNlID0+IDEsCiAgICB9LAopOwpteSAkSGVscGVyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVuaXRUZXN0OjpIZWxwZXInKTsKCm15ICRHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpOwoKbXkgKCAkVXNlckxvZ2luLCAkVXNlcklEICkgPSAkSGVscGVyLT5UZXN0VXNlckNyZWF0ZSgpOwpvaygKICAgICRVc2VySUQsCiAgICAiVGVzdCB1c2VyICRVc2VySUQgY3JlYXRlZCIsCik7CgojIGNyZWF0ZSByZXF1aXJlZCBvYmplY3RzCm15ICRHZW5lcmFsQ2F0YWxvZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZycpOwpteSAkQ29uZmlnSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbScpOwoKIyBmZXRjaCB0aGUgaWRzIG9mIHRoZSBpbnRlbmRlZCBjbGFzcywgZGVwbG95bWVudCBzdGF0ZSBhbmQgaW5jaWRlbnQgc3RhdGUKbXkgJENsYXNzTGlzdCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICBDbGFzcyA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3MnLAopOwpteSAlUmV2ZXJzZUNsYXNzTGlzdCA9IHJldmVyc2UgJXskQ2xhc3NMaXN0fTsKbXkgJENsYXNzSUQgPSAkUmV2ZXJzZUNsYXNzTGlzdHsnQ291bnRyeSd9OwoKbXkgJERlcGxTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkRlcGxveW1lbnRTdGF0ZScsCik7Cm15ICVSZXZlcnNlRGVwbFN0YXRlTGlzdCA9IHJldmVyc2UgJXskRGVwbFN0YXRlTGlzdH07Cm15ICREZXBsU3RhdGVJRCA9ICRSZXZlcnNlRGVwbFN0YXRlTGlzdHsnUHJvZHVjdGlvbid9OwoKbXkgJEluY2lTdGF0ZUxpc3QgPSAkR2VuZXJhbENhdGFsb2dPYmplY3QtPkl0ZW1MaXN0KAogICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkluY2lkZW50U3RhdGUnLAopOwpteSAlUmV2ZXJzZUluY2lTdGF0ZUxpc3QgPSByZXZlcnNlICV7JEluY2lTdGF0ZUxpc3R9OwpteSAkSW5jaVN0YXRlSUQgPSAkUmV2ZXJzZUluY2lTdGF0ZUxpc3R7J09wZXJhdGlvbmFsJ307CgpteSAlR3JvdXBMaXN0ID0gJEdyb3VwT2JqZWN0LT5Hcm91cExpc3QoKTsKbXkgJVJldmVyc2VHcm91cExpc3QgPSByZXZlcnNlICVHcm91cExpc3Q7CgpteSAkRmlyc3RHcm91cElEID0gJFJldmVyc2VHcm91cExpc3R7J2FkbWluJ307Cm15ICRTZWNvbmRHcm91cElEID0gJFJldmVyc2VHcm91cExpc3R7J3N0YXRzJ307CgojIGluc2VydCBmaXZlIENJcwojIHRoZSBmaXJzdCB0d28gQ0lzIGJlbG9uZyBhcmUgZnJvbSB0aGUgJ2FkbWluJyBncm91cAojIHRoZSBmb2xsb3dpbmcgdHdvIENJcyBiZWxvbmcgdG8gdGhlICdzdGF0cycgZ3JvdXAKIyB0aGUgbGFzdCBvbmUgaGFzIG5vIGdyb3VwIChncm91cF9pZCBpcyBudWxsKQpteSAkQ291bnQgPSAxOwpteSBAQ29uZmlnSXRlbUlETGlzdDsKZm9yIG15ICRPcmQgKHF3KGZpcnN0IHNlY29uZCB0aGlyZCBmb3VydGggZmlmdGgpKQp7CiAgICBteSAkR3JvdXBJRDsKICAgIGlmICgkQ291bnQgPCAzKSB7CiAgICAgICAgJEdyb3VwSUQgPSAkRmlyc3RHcm91cElEOwogICAgfQogICAgZWxzaWYgKCRDb3VudCA8IDUpIHsKICAgICAgICAkR3JvdXBJRCA9ICRTZWNvbmRHcm91cElEOwogICAgfQogICAgbXkgJENvbmZpZ0l0ZW1JRCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtQWRkKAogICAgICAgIENsYXNzSUQgICAgICAgID0+ICRDbGFzc0lELAogICAgICAgIE5hbWUgICAgICAgICAgID0+ICJDb25maWcgSXRlbSAjJENvdW50IiwKICAgICAgICBEZXBsU3RhdGVJRCAgICA9PiAkRGVwbFN0YXRlSUQsCiAgICAgICAgSW5jaVN0YXRlSUQgICAgPT4gJEluY2lTdGF0ZUlELAogICAgICAgIEdyb3VwSUQgICAgICAgID0+ICRHcm91cElELAogICAgICAgIERlc2NyaXB0aW9uICAgID0+ICRPcmQsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICk7CiAgICBwdXNoIEBDb25maWdJdGVtSURMaXN0LCAkQ29uZmlnSXRlbUlEOwogICAgJENvdW50Kys7CgogICAgb2soCiAgICAgICAgJENvbmZpZ0l0ZW1JRCwKICAgICAgICAiQWRkZWQgJE9yZCBjb25maWcgaXRlbSIsCiAgICApOwp9CgojIHNlYXJjaCBDSXMgdGhhdCBiZWxvbmcgdG8gdGhlICdhZG1pbicgZ3JvdXAgYW5kIGNoZWNrIHRoZSBxdWVyeSByZXN1bHQKbXkgQENvbmZpZ0l0ZW1SZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgT3JkZXJCeSAgICAgID0+ICdVcCcsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IFxAQ29uZmlnSXRlbUlETGlzdCwKICAgICAgICBHcm91cElEcyAgICAgPT4gWyRGaXJzdEdyb3VwSURdLAogICAgKTsKCm9rKAogICAgc2NhbGFyIEBDb25maWdJdGVtUmVzdWx0TGlzdCA9PSAzIAogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbMF0gPT0gJENvbmZpZ0l0ZW1JRExpc3RbMF0KICAgICAgICAgICAgJiYgJENvbmZpZ0l0ZW1SZXN1bHRMaXN0WzFdID09ICRDb25maWdJdGVtSURMaXN0WzFdCiAgICAgICAgICAgICYmICRDb25maWdJdGVtUmVzdWx0TGlzdFsyXSA9PSAkQ29uZmlnSXRlbUlETGlzdFs0XSwKICAgICJTZWFyY2ggZm9yIGNvbmZpZyBpdGVtcyBvZiBncm91cCAkRmlyc3RHcm91cElEIgopOwoKIyBtb3ZlIHRoZSB0aGlyZCBDSSBmcm9tIHRoZSAnc3RhdHMnIHRvIHRoZSAnYWRtaW4nIGdyb3VwCm15ICRTdWNjZXNzID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1VcGRhdGUoCiAgICBDb25maWdJdGVtSUQgICA9PiAkQ29uZmlnSXRlbUlETGlzdFsyXSwKICAgIEdyb3VwSUQgICAgICAgID0+ICRGaXJzdEdyb3VwSUQsCiAgICBVc2VySUQgICAgICAgICA9PiAxLAopOwoKb2soCiAgICAkU3VjY2VzcywKICAgICJDaGFuZ2VkIHRoaXJkIGNvbmZpZyBpdGVtIiwKKTsKCiMgcmVwZWF0IHRoZSBzZWFyY2ggYW5kIGNoZWNrIHRoZSB1cGRhdGVkIHJlc3VsdHMKQENvbmZpZ0l0ZW1SZXN1bHRMaXN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgUmVzdWx0ICAgICAgID0+ICdBUlJBWScsCiAgICAgICAgT3JkZXJCeSAgICAgID0+ICdVcCcsCiAgICAgICAgQ29uZmlnSXRlbUlEID0+IFxAQ29uZmlnSXRlbUlETGlzdCwKICAgICAgICBHcm91cElEcyAgICAgPT4gWyRGaXJzdEdyb3VwSURdLAogICAgKTsKCm9rKAogICAgc2NhbGFyIEBDb25maWdJdGVtUmVzdWx0TGlzdCA9PSA0IAogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbMF0gPT0gJENvbmZpZ0l0ZW1JRExpc3RbMF0KICAgICAgICAgICAgJiYgJENvbmZpZ0l0ZW1SZXN1bHRMaXN0WzFdID09ICRDb25maWdJdGVtSURMaXN0WzFdCiAgICAgICAgICAgICYmICRDb25maWdJdGVtUmVzdWx0TGlzdFsyXSA9PSAkQ29uZmlnSXRlbUlETGlzdFsyXQogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbM10gPT0gJENvbmZpZ0l0ZW1JRExpc3RbNF0sCiAgICAiU2VhcmNoIGZvciBjb25maWcgaXRlbXMgb2YgZ3JvdXAgJyRHcm91cExpc3R7JEZpcnN0R3JvdXBJRH0nIGFmdGVyIHVwZGF0ZSIKKTsKCiMgZGVsZXRlIHRoZSBmaXJzdCB0aHJlZSBDSVMgd2hpY2ggYmVsb25nIGFsbCB0byB0aGUgJ2FkbWluJyBncm91cApteSAkSW5kZXggPSAwOwpmb3IgbXkgJE9yZCAocXcoZmlyc3Qgc2Vjb25kIHRoaXJkKSkKewogICAgbXkgJFN1Y2Nlc3MgPSAkQ29uZmlnSXRlbU9iamVjdC0+Q29uZmlnSXRlbURlbGV0ZSgKICAgICAgICBDb25maWdJdGVtSUQgID0+ICRDb25maWdJdGVtSURMaXN0WyRJbmRleCsrXSwKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgKTsKCiAgICBvaygKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiRGVsZXRlZCAkT3JkIGNvbmZpZyBpdGVtIiwKICAgICk7Cn0KCiMgcmVwZWF0IHRoZSBzZWFyY2ggYW5kIGNoZWNrIHRoZSByZXN1bHRzIGFmdGVyIGRlbGV0aW9uCkBDb25maWdJdGVtUmVzdWx0TGlzdCA9ICRDb25maWdJdGVtT2JqZWN0LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIFJlc3VsdCAgICAgICA9PiAnQVJSQVknLAogICAgICAgIE9yZGVyQnkgICAgICA9PiAnVXAnLAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiBcQENvbmZpZ0l0ZW1JRExpc3QsCiAgICAgICAgR3JvdXBJRHMgICAgID0+IFskRmlyc3RHcm91cElEXSwKICAgICk7CgpvaygKICAgIHNjYWxhciBAQ29uZmlnSXRlbVJlc3VsdExpc3QgPT0gMQogICAgICAgICAgICAmJiAkQ29uZmlnSXRlbVJlc3VsdExpc3RbMF0gPT0gJENvbmZpZ0l0ZW1JRExpc3RbNF0sCiAgICAiU2VhcmNoIGZvciBjb25maWcgaXRlbXMgb2YgZ3JvdXAgJyRHcm91cExpc3R7JEZpcnN0R3JvdXBJRH0nIGFmdGVyIGRlbGV0ZSIKKTsKCmRvbmVfdGVzdGluZzsK</File>
        <File Location="doc/en/ITSMConfigItemMultitenancy.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="configitem">
            <ColumnAdd Name="group_id" Type="INTEGER"></ColumnAdd>
            <ForeignKeyCreate ForeignTable="groups_table">
                <Reference Foreign="id" Local="group_id">
                </Reference>
            </ForeignKeyCreate>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="configitem">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>