<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>OneTimeAuthentificationLink</Name>
    <Version>11.1.1</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.de/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-07-22 10:06:05" Version="11.1.1">Update to OTOBO 11.1.</ChangeLog>
    <Description Lang="en">Automatically creates customer users and gives them access via one time authentification tokens.</Description>
    <Framework>11.1.x</Framework>
    <BuildCommitID>b7033727550b4109c6e222715d0c82976ba9d8b8</BuildCommitID>
    <BuildDate>2026-07-22 10:06:09</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/System/CustomerAuth.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBmZjllMjk3YmFmMjg3ZTE2MDcxZDNhYzZhZDdmNmMxM2YxMWFjN2ZhIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckF1dGgucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgcXcoVHJhbnNsYXRhYmxlKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtTWFpbnRlbmFuY2UnLAopOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGggLSBjdXN0b21lciBhdXRoZW50aWNhdGlvbiBtb2R1bGUuCgo9aGVhZDEgREVTQ1JJUFRJT04KClRoZSBhdXRoZW50aWNhdGlvbiBtb2R1bGUgZm9yIHRoZSBjdXN0b21lciBpbnRlcmZhY2UuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPWhlYWQyIG5ldygpCgpEb24ndCB1c2UgdGhlIGNvbnN0cnVjdG9yIGRpcmVjdGx5LCB1c2UgdGhlIE9iamVjdE1hbmFnZXIgaW5zdGVhZDoKCiAgICBteSAkQ3VzdG9tZXJBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJE1haW5PYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGxvYWQgYXV0aCBtb2R1bGVzCiAgICBDT1VOVDoKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyOjpBdXRoTW9kdWxlJENvdW50Iik7CgogICAgICAgIG5leHQgQ09VTlQgaWYgISRHZW5lcmljTW9kdWxlOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldyggJXskU2VsZn0sIENvdW50ID0+ICRDb3VudCApOwogICAgfQoKICAgICMgbG9hZCAyZmFjdG9yIGF1dGggbW9kdWxlcwogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lcjo6QXV0aFR3b0ZhY3Rvck1vZHVsZSRDb3VudCIpOwoKICAgICAgICBuZXh0IENPVU5UIGlmICEkR2VuZXJpY01vZHVsZTsKCiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQXV0aFR3b0ZhY3RvckJhY2tlbmQkQ291bnQifSA9ICRHZW5lcmljTW9kdWxlLT5uZXcoICV7JFNlbGZ9LCBDb3VudCA9PiAkQ291bnQgKTsKICAgIH0KCiAgICAjIEluaXRpYWxpemUgbGFzdCBlcnJvciBtZXNzYWdlCiAgICAkU2VsZi0+e0xhc3RFcnJvck1lc3NhZ2V9ID0gJyc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aGVhZDIgR2V0T3B0aW9uKCkKCkdldCBtb2R1bGUgb3B0aW9ucy4gQ3VycmVudGx5IHRoZXJlIGlzIGp1c3Qgb25lIG9wdGlvbiwgIlByZUF1dGgiLgoKICAgIGlmICggJEF1dGhPYmplY3QtPkdldE9wdGlvbiggV2hhdCA9PiAnUHJlQXV0aCcgKSApIHsKICAgICAgICBwcmludCAiTm8gbG9naW4gc2NyZWVuIGlzIG5lZWRlZC4gQXV0aGVudGljYXRpb24gaXMgYmFzZWQgb24gc29tZSBvdGhlciBvcHRpb25zLiBFLiBnLiAkRU5We1JFTU9URV9VU0VSfVxuIjsKICAgIH0KCj1jdXQKCnN1YiBHZXRPcHRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntBdXRoQmFja2VuZH0tPkdldE9wdGlvbiglUGFyYW0pOwp9CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCgo9Zm9yIHN0b3B3b3JkcyBhdXRoZW50aWZpY2F0aW9uCgo9aGVhZDIgRXh0ZW5kZWRQYXJhbU5hbWVzKCkKCkdldCBuYW1lcyBvZiBleHRlbmRlZCBwYXJhbXMgd2hpY2ggcHJvdmlkZSBhdXRoZW50aWZpY2F0aW9uIGluZm9ybWF0aW9uCgogICAgbXkgQFBhcmFtTmFtZXMgPSAkQXV0aE9iamVjdC0+RXh0ZW5kZWRQYXJhbU5hbWVzKCk7Cgo9Y3V0CgpzdWIgRXh0ZW5kZWRQYXJhbU5hbWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJU5hbWVzOwogICAgQ09VTlQ6CiAgICBmb3IgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IENPVU5UIGlmICEkU2VsZi0+eyJBdXRoQmFja2VuZCRfIn07CiAgICAgICAgbmV4dCBDT1VOVCBpZiAhJFNlbGYtPnsiQXV0aEJhY2tlbmQkXyJ9LT5jYW4oJ0V4dGVuZGVkUGFyYW1OYW1lcycpOwoKICAgICAgICBmb3IgbXkgJEV4dE5hbWUgKCAkU2VsZi0+eyJBdXRoQmFja2VuZCRfIn0tPkV4dGVuZGVkUGFyYW1OYW1lcygpICkgewogICAgICAgICAgICAkTmFtZXN7JEV4dE5hbWV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICgga2V5cyAlTmFtZXMgKTsKfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCj1oZWFkMiBBdXRoKCkKClRoZSBhdXRoZW50aWNhdGlvbiBmdW5jdGlvbi4KCiAgICBpZiAoICRBdXRoT2JqZWN0LT5BdXRoKCBVc2VyID0+ICRVc2VyLCBQdyA9PiAkUHcgKSApIHsKICAgICAgICBwcmludCAiQXV0aCBvayFcbiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBwcmludCAiQXV0aCBpbnZhbGlkIVxuIjsKICAgIH0KCj1jdXQKCnN1YiBBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgY3VzdG9tZXIgdXNlciBvYmplY3QKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIHVzZSBhbGwgMTEgYXV0aCBiYWNrZW5kcyBhbmQgcmV0dXJuIG9uIGZpcnN0IHRydWUKICAgIG15ICRVc2VyOwogICAgQ09VTlQ6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgICMgbmV4dCBvbiBubyBjb25maWcgc2V0dGluZwogICAgICAgIG5leHQgQ09VTlQgaWYgISRTZWxmLT57IkF1dGhCYWNrZW5kJENvdW50In07CgogICAgICAgICMgY2hlY2sgYXV0aCBiYWNrZW5kCiAgICAgICAgJFVzZXIgPSAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT5BdXRoKCVQYXJhbSk7CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAgICAgaWYgKCByZWYgJFVzZXIgJiYgcmVmICRVc2VyIGVxICdIQVNIJyAmJiAkVXNlci0+e0Vycm9yfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSA9ICRVc2VyLT57RXJyb3J9OwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQojIEVPIE9uZVRpbWVBdXRoZW50aWNhdGlvbkxpbmsKCiAgICAgICAgIyBuZXh0IG9uIG5vIHN1Y2Nlc3MKICAgICAgICBpZiAoICEkVXNlciApIHsKCiAgICAgICAgICAgICMgZ2V0IGVycm9yIG1lc3NhZ2Ugb2YgYXV0aCBiYWNrZW5kIGlmIHByZXNlbnQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT57QXV0aEVycm9yfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGFzdEVycm9yTWVzc2FnZX0gPSAkU2VsZi0+eyJBdXRoQmFja2VuZCRDb3VudCJ9LT57QXV0aEVycm9yfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgMmZhY3RvciBhdXRoIGJhY2tlbmRzCiAgICAgICAgbXkgJFR3b0ZhY3RvckF1dGg7CiAgICAgICAgVFdPRkFDVE9SU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgICAgICMgcmV0dXJuIG9uIG5vIGNvbmZpZyBzZXR0aW5nCiAgICAgICAgICAgIG5leHQgVFdPRkFDVE9SU09VUkNFIGlmICEkU2VsZi0+eyJBdXRoVHdvRmFjdG9yQmFja2VuZCRDb3VudCJ9OwoKICAgICAgICAgICAgIyAyZmFjdG9yIGJhY2tlbmQKICAgICAgICAgICAgbXkgJEF1dGhPayA9ICRTZWxmLT57IkF1dGhUd29GYWN0b3JCYWNrZW5kJENvdW50In0tPkF1dGgoCiAgICAgICAgICAgICAgICBUd29GYWN0b3JUb2tlbiA9PiAkUGFyYW17VHdvRmFjdG9yVG9rZW59LAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRUd29GYWN0b3JBdXRoID0gJEF1dGhPayA/ICdwYXNzZWQnIDogJ2ZhaWxlZCc7CgogICAgICAgICAgICBsYXN0IFRXT0ZBQ1RPUlNPVVJDRSBpZiAkQXV0aE9rOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBhdCBsZWFzdCBvbmUgMmZhY3RvciBhdXRoIGJhY2tlbmQgd2FzIGNoZWNrZWQgYnV0IG5vbmUgd2FzIHN1Y2Nlc3NmdWwsCiAgICAgICAgIyBpdCBjb3VudHMgYXMgYSBmYWlsZWQgbG9naW4KICAgICAgICBpZiAoICRUd29GYWN0b3JBdXRoICYmICRUd29GYWN0b3JBdXRoIG5lICdwYXNzZWQnICkgewogICAgICAgICAgICAkVXNlciA9IHVuZGVmOwogICAgICAgICAgICBsYXN0IENPVU5UOwogICAgICAgIH0KCiAgICAgICAgIyByZW1lbWJlciBhdXRoIGJhY2tlbmQKICAgICAgICBpZiAoJFVzZXIpIHsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJBdXRoQmFja2VuZCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbGFzdCBDT1VOVDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByZWNvcmQgZXhpc3RzCiAgICBpZiAoICEkVXNlciApIHsKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcn0gKTsKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICBteSAkQ291bnQgPSAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbkZhaWxlZH0gfHwgMDsKICAgICAgICAgICAgJENvdW50Kys7CiAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTG9naW5GYWlsZWQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHVzZXIgaXMgdmFsaWQKICAgIG15ICVDdXN0b21lckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CiAgICBpZiAoIGRlZmluZWQgJEN1c3RvbWVyRGF0YXtWYWxpZElEfSAmJiAkQ3VzdG9tZXJEYXRhe1ZhbGlkSUR9IG5lIDEgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFVzZXInIGlzIHNldCB0byBpbnZhbGlkLCBjYW4ndCBsb2dpbiEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkVXNlciBpZiAhJUN1c3RvbWVyRGF0YTsKCiAgICAjIHJlc2V0IGZhaWxlZCBsb2dpbnMKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlckxvZ2luRmFpbGVkJywKICAgICAgICBWYWx1ZSAgPT4gMCwKICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgKTsKCiAgICAjIG9uIHN5c3RlbSBtYWludGVuYW5jZSBjdXN0b21lcnMKICAgICMgc2hvdWxkbid0IGJlIGFsbG93ZWQgZ2V0IGludG8gdGhlIHN5c3RlbQogICAgbXkgJEFjdGl2ZU1haW50ZW5hbmNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbU1haW50ZW5hbmNlJyktPlN5c3RlbU1haW50ZW5hbmNlSXNBY3RpdmUoKTsKCiAgICAjIGNoZWNrIGlmIHN5c3RlbSBtYWludGVuYW5jZSBpcyBhY3RpdmUKICAgIGlmICgkQWN0aXZlTWFpbnRlbmFuY2UpIHsKCiAgICAgICAgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSA9CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU3lzdGVtTWFpbnRlbmFuY2U6OklzQWN0aXZlRGVmYXVsdExvZ2luRXJyb3JNZXNzYWdlJykKICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKCJJdCBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIHRvIGxvZ2luIGR1ZSB0byBhIHNjaGVkdWxlZCBzeXN0ZW0gbWFpbnRlbmFuY2UuIik7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxhc3QgbG9naW4gcHJlZmVyZW5jZXMgdXBkYXRlCiAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICAgPT4gJ1VzZXJMYXN0TG9naW4nLAogICAgICAgIFZhbHVlICA9PiAkRGF0ZVRpbWVPYmplY3QtPlRvRXBvY2goKSwKICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgKTsKCiAgICByZXR1cm4gJFVzZXI7Cn0KCj1oZWFkMiBQcmVBdXRoKCkKCkNhbGwgdGhlIFByZUF1dGggbWV0aG9kIG9mIHRoZSBBdXRoQmFja2VuZAoKICAgIG15ICRQcmVBdXRoSW5mbyA9ICRBdXRoT2JqZWN0LT5QcmVBdXRoKAogICAgICAgIFJlcXVlc3RlZFVSTCA9PiAkUmVxdWVzdGVkVVJMLAogICAgKTsKCj1jdXQKCnN1YiBQcmVBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0F1dGhCYWNrZW5kfS0+Y2FuKCdQcmVBdXRoJyk7CgogICAgcmV0dXJuICRTZWxmLT57QXV0aEJhY2tlbmR9LT5QcmVBdXRoKCVQYXJhbSk7Cn0KCj1oZWFkMiBQb3N0QXV0aCgpCgpDYWxsIHRoZSBQb3N0QXV0aCBtZXRob2Qgb2YgdGhlIEF1dGhCYWNrZW5kCgogICAgbXkgJFBvc3RBdXRoSW5mbyA9ICRBdXRoT2JqZWN0LT5Qb3N0QXV0aCgpOwoKPWN1dAoKc3ViIFBvc3RBdXRoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0F1dGhCYWNrZW5kfS0+Y2FuKCdQb3N0QXV0aCcpOwoKICAgIHJldHVybiAkU2VsZi0+e0F1dGhCYWNrZW5kfS0+UG9zdEF1dGgoJVBhcmFtKTsKfQoKPWhlYWQyIExvZ291dCgpCgpDYWxsIHRoZSBMb2dvdXQgbWV0aG9kIG9mIHRoZSBBdXRoQmFja2VuZAoKICAgIG15ICRMb2dvdXRJbmZvID0gJEF1dGhPYmplY3QtPkxvZ291dCgpOwoKPWN1dAoKc3ViIExvZ291dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFNlbGYtPntBdXRoQmFja2VuZH0tPmNhbignTG9nb3V0Jyk7CgogICAgcmV0dXJuICRTZWxmLT57QXV0aEJhY2tlbmR9LT5Mb2dvdXQoJVBhcmFtKTsKfQoKPWhlYWQyIEdldExhc3RFcnJvck1lc3NhZ2UoKQoKUmV0cmlldmUgJFNlbGYtPntMYXN0RXJyb3JNZXNzYWdlfSBjb250ZW50LgoKICAgIG15ICRBdXRoRXJyb3JNZXNzYWdlID0gJEF1dGhPYmplY3QtPkdldExhc3RFcnJvck1lc3NhZ2UoKTsKCiAgICBSZXN1bHQ6CgogICAgICAgICRBdXRoRXJyb3JNZXNzYWdlID0gIkFuIGVycm9yIHN0cmluZyBtZXNzYWdlLiI7Cgo9Y3V0CgpzdWIgR2V0TGFzdEVycm9yTWVzc2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e0xhc3RFcnJvck1lc3NhZ2V9Owp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/TemplateGenerator.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA1ZDA3Y2M1MWRlOWIwNTBjMDM4MmRkNzcxOTBiZTM3MDU0YmZlZWVhIC0gS2VybmVsL1N5c3RlbS9UZW1wbGF0ZUdlbmVyYXRvci5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcjsKCiMjIG5vZmlsdGVyKFRpZHlBbGw6OlBsdWdpbjo6T1RPQk86OlBlcmw6OkxheW91dE9iamVjdCkKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwp1c2UgVVJJOjpFc2NhcGUgcXcodXJpX2VzY2FwZV91dGY4IHVyaV91bmVzY2FwZSk7ICAgICMjIG5vIHBlcmxpbXBvcnRzLCBtZXRob2RzIGFyZSB1c2VkIGluIGEgc3Vic3RpdHV0aW9uCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgICgpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkF1dG9SZXNwb25zZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkNvbW11bmljYXRpb25DaGFubmVsJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJywKIyBSb3RoZXIgT1NTIC8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluaycsCiMgRU8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbEFkZHJlc3MnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpRdWV1ZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNhbHV0YXRpb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTaWduYXR1cmUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpTdGFuZGFyZFRlbXBsYXRlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldDo6QXJ0aWNsZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlVzZXInLAogICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yIC0gdGVtcGxhdGUgZ2VuZXJhdG9yIGxpYgoKPWhlYWQxIERFU0NSSVBUSU9OCgpBbGwgdGVtcGxhdGUgZ2VuZXJhdG9yIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBibGVzcyB7fSwgJFR5cGU7CgogICAgJFNlbGYtPntSaWNoVGV4dH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIFNhbHV0YXRpb24oKQoKZ2VuZXJhdGUgc2FsdXRhdGlvbgoKICAgIG15ICRTYWx1dGF0aW9uID0gJFRlbXBsYXRlR2VuZXJhdG9yT2JqZWN0LT5TYWx1dGF0aW9uKAogICAgICAgIFRpY2tldElEID0+IDEyMywKICAgICAgICBVc2VySUQgICA9PiAxMjMsCiAgICAgICAgRGF0YSAgICAgPT4gJEFydGljbGVIYXNoUmVmLAogICAgKTsKCnJldHVybnMKICAgIFRleHQKICAgIENvbnRlbnRUeXBlCgo9Y3V0CgpzdWIgU2FsdXRhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCB0aWNrZXQuCiAgICBteSAlVGlja2V0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICk7CgogICAgIyBHZXQgcXVldWUuCiAgICBteSAlUXVldWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UXVldWUnKS0+UXVldWVHZXQoCiAgICAgICAgSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICk7CgogICAgIyBHZXQgc2FsdXRhdGlvbi4KICAgIG15ICVTYWx1dGF0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNhbHV0YXRpb24nKS0+U2FsdXRhdGlvbkdldCgKICAgICAgICBJRCA9PiAkUXVldWV7U2FsdXRhdGlvbklEfSwKICAgICk7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICRTYWx1dGF0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkU2FsdXRhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9odG1sJzsKICAgICAgICAkU2FsdXRhdGlvbntUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRTYWx1dGF0aW9ue1RleHR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSAmJiAkU2FsdXRhdGlvbntDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaSApIHsKICAgICAgICAkU2FsdXRhdGlvbntDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJFNhbHV0YXRpb257VGV4dH0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNhbHV0YXRpb257VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsaXN0IHVuc3VwcG9ydGVkIHRhZ3MgZm9yIHN0YW5kYXJkIHRlbXBsYXRlCiAgICBteSBATGlzdE9mVW5TdXBwb3J0ZWRUYWcgPSBxdyhPVE9CT19BR0VOVF9TVUJKRUNUIE9UT0JPX0FHRU5UX0JPRFkgT1RPQk9fQ1VTVE9NRVJfQk9EWSBPVE9CT19DVVNUT01FUl9TVUJKRUNUKTsKCiAgICBteSAkU2FsdXRhdGlvblRleHQgPSAkU2VsZi0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRTYWx1dGF0aW9ue1RleHR9IHx8ICcnLAogICAgICAgIExpc3RPZlVuU3VwcG9ydGVkVGFnID0+IFxATGlzdE9mVW5TdXBwb3J0ZWRUYWcsCiAgICApOwoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICRTYWx1dGF0aW9uVGV4dCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgPT4gJFNhbHV0YXRpb25UZXh0LAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgdXJscwogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkU2FsdXRhdGlvblRleHQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRTYWx1dGF0aW9uVGV4dCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAkU2FsdXRhdGlvblRleHQ7Cn0KCj1oZWFkMiBTaWduYXR1cmUoKQoKZ2VuZXJhdGUgc2FsdXRhdGlvbgoKICAgIG15ICRTaWduYXR1cmUgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPlNpZ25hdHVyZSgKICAgICAgICBUaWNrZXRJRCA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgPT4gMTIzLAogICAgICAgIERhdGEgICAgID0+ICRBcnRpY2xlSGFzaFJlZiwKICAgICk7CgpvcgoKICAgIG15ICRTaWduYXR1cmUgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPlNpZ25hdHVyZSgKICAgICAgICBRdWV1ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgID0+IDEyMywKICAgICAgICBEYXRhICAgID0+ICRBcnRpY2xlSGFzaFJlZiwKICAgICk7CgpyZXR1cm5zCiAgICBUZXh0CiAgICBDb250ZW50VHlwZQoKPWN1dAoKc3ViIFNpZ25hdHVyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoRGF0YSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkIHRpY2tldCBpZCBvciBxdWV1ZSBpZAogICAgaWYgKCAhJFBhcmFte1RpY2tldElEfSAmJiAhJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUaWNrZXRJRCBvciBRdWV1ZUlEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEdldCB0aWNrZXQgZGF0YS4KICAgIG15ICVUaWNrZXQ7CiAgICBpZiAoICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVRpY2tldCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKS0+VGlja2V0R2V0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHF1ZXVlLgogICAgbXkgJVF1ZXVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgIElEID0+ICRUaWNrZXR7UXVldWVJRH0gfHwgJFBhcmFte1F1ZXVlSUR9LAogICAgKTsKCiAgICAjIEdldCBzaWduYXR1cmUuCiAgICBteSAlU2lnbmF0dXJlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlNpZ25hdHVyZScpLT5TaWduYXR1cmVHZXQoCiAgICAgICAgSUQgPT4gJFF1ZXVle1NpZ25hdHVyZUlEfSwKICAgICk7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICYmICRTaWduYXR1cmV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9wbGFpbi9pICkgewogICAgICAgICRTaWduYXR1cmV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgJFNpZ25hdHVyZXtUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgU3RyaW5nID0+ICRTaWduYXR1cmV7VGV4dH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHRleHQvaHRtbCB0byB0ZXh0L3BsYWluIGNvbnZlcnQKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9ICYmICRTaWduYXR1cmV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9odG1sL2kgKSB7CiAgICAgICAgJFNpZ25hdHVyZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJFNpZ25hdHVyZXtUZXh0fSAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvQXNjaWkoCiAgICAgICAgICAgIFN0cmluZyA9PiAkU2lnbmF0dXJle1RleHR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlzdCB1bnN1cHBvcnRlZCB0YWdzIGZvciBzdGFuZGFyZCB0ZW1wbGF0ZQogICAgbXkgQExpc3RPZlVuU3VwcG9ydGVkVGFnID0gcXcoT1RPQk9fQUdFTlRfU1VCSkVDVCBPVE9CT19BR0VOVF9CT0RZIE9UT0JPX0NVU1RPTUVSX0JPRFkgT1RPQk9fQ1VTVE9NRVJfU1VCSkVDVCk7CgogICAgbXkgJFNpZ25hdHVyZVRleHQgPSAkU2VsZi0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRTaWduYXR1cmV7VGV4dH0gfHwgJycsCiAgICAgICAgTGlzdE9mVW5TdXBwb3J0ZWRUYWcgPT4gXEBMaXN0T2ZVblN1cHBvcnRlZFRhZywKICAgICk7CgogICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgJFNpZ25hdHVyZVRleHQgPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICA9PiAkU2VsZi0+e1JpY2hUZXh0fSwKICAgICAgICBUZXh0ICAgICAgID0+ICRTaWduYXR1cmVUZXh0LAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0sCiAgICAgICAgUXVldWVJRCAgICA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBhZGQgdXJscwogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkU2lnbmF0dXJlVGV4dCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJFNpZ25hdHVyZVRleHQsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJFNpZ25hdHVyZVRleHQ7Cn0KCj1oZWFkMiBTZW5kZXIoKQoKZ2VuZXJhdGUgc2VuZGVyIGFkZHJlc3MgKEZST00gc3RyaW5nKSBmb3IgZW1haWxzCgogICAgbXkgJFNlbmRlciA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+U2VuZGVyKAogICAgICAgIFF1ZXVlSUQgPT4gMTIzLAogICAgICAgIFVzZXJJRCAgPT4gMTIzLAogICAgKTsKCnJldHVybnM6CgogICAgSm9obiBEb2UgYXQgU3VwZXIgU3VwcG9ydCA8c2VydmljZUBleGFtcGxlLmNvbT4KCmFuZCBpdCByZXR1cm5zIHRoZSBxdW90ZWQgcmVhbCBuYW1lIGlmIG5lY2Vzc2FyeQoKICAgICJKb2huIERvZSwgU3VwcG9ydCIgPHNlcnZpY2VAZXhhbXBsZS50bGQ+Cgo9Y3V0CgpzdWIgU2VuZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyggVXNlcklEIFF1ZXVlSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgc2VuZGVyIGF0dHJpYnV0ZXMKICAgIG15ICVBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICApOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgVGhpcyBpcyB0aGUgbm90IHF1b3RlZCByZWFsIG5hbWUKICAgIG15ICRQaHJhc2UgPSAkQWRkcmVzc3tQaHJhc2V9OwoKICAgICMgY2hlY2sgY29uZmlnIGZvciBhZ2VudCByZWFsIG5hbWUKICAgIG15ICRVc2VBZ2VudFJlYWxOYW1lID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkRlZmluZUVtYWlsRnJvbScpOwogICAgaWYgKCAkVXNlQWdlbnRSZWFsTmFtZSAmJiAkVXNlQWdlbnRSZWFsTmFtZSA9fiAvXihBZ2VudE5hbWV8QWdlbnROYW1lU3lzdGVtQWRkcmVzc05hbWUpJC8gKSB7CgogICAgICAgICMgZ2V0IGRhdGEgZnJvbSBjdXJyZW50IGFnZW50CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgICAgIE5vT3V0T2ZPZmZpY2UgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHNldCByZWFsIG5hbWUgd2l0aCB1c2VyIG5hbWUKICAgICAgICBpZiAoICRVc2VBZ2VudFJlYWxOYW1lIGVxICdBZ2VudE5hbWUnICkgewoKICAgICAgICAgICAgIyBjaGVjayBmb3IgdXNlciBkYXRhCiAgICAgICAgICAgIGlmICggJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0gKSB7CgogICAgICAgICAgICAgICAgIyByZXdyaXRlIHRoZSBwaHJhc2UsIG5vIG5lZWQgdG8gY2FyZSBhYm91dCBxdW90aW5nCiAgICAgICAgICAgICAgICAkUGhyYXNlID0gJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IHJlYWwgbmFtZSB3aXRoIHVzZXIgbmFtZQogICAgICAgIGlmICggJFVzZUFnZW50UmVhbE5hbWUgZXEgJ0FnZW50TmFtZVN5c3RlbUFkZHJlc3NOYW1lJyApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZm9yIHVzZXIgZGF0YQogICAgICAgICAgICBpZiAoICRVc2VyRGF0YXtVc2VyRnVsbG5hbWV9ICkgewoKICAgICAgICAgICAgICAgICMgcHJlcGVuZCB0aGUgdXNlciBuYW1lIGFuZCB0aGUgc2VwYXJhdG9yLCBlLmcuICd2aWEnLCB0byB0aGUgcmVhbCBuYW1lCiAgICAgICAgICAgICAgICBteSAkU2VwYXJhdG9yID0gJENvbmZpZ09iamVjdC0+R2V0KCdUaWNrZXQ6OkRlZmluZUVtYWlsRnJvbVNlcGFyYXRvcicpOwogICAgICAgICAgICAgICAgJFBocmFzZSA9ICIkVXNlckRhdGF7VXNlckZ1bGxuYW1lfSAkU2VwYXJhdG9yICRQaHJhc2UiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRm9ybWF0IHNlbmRlciByZWFsIG5hbWUgYW5kIGFkZHJlc3MgY29tcGxpYW50IHRvIFJGQyA1MzIyLiBUaGlzIGlzIHJlbGV2YW50IHdoZW4gdGhlIHJlYWwgbmFtZSBjb250YWluIGNvbW1hcwogICAgIyBvciBvdGhlciBzcGVjaWFsIHN5bWJvbHMuCiAgICBteSAkRW1haWxBZGRyZXNzT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVtYWlsQWRkcmVzcycpOwoKICAgIHJldHVybiAkRW1haWxBZGRyZXNzT2JqZWN0LT5Gb3JtYXQoCiAgICAgICAgUmVhbE5hbWUgPT4gJFBocmFzZSwKICAgICAgICBBZGRyZXNzICA9PiAkQWRkcmVzc3tFbWFpbH0sCiAgICApOwp9Cgo9aGVhZDIgVGVtcGxhdGUoKQoKZ2VuZXJhdGUgdGVtcGxhdGUKCiAgICBteSAkVGVtcGxhdGUgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPlRlbXBsYXRlKAogICAgICAgIFRlbXBsYXRlSUQgPT4gMTIzLAogICAgICAgIFRpY2tldElEICAgPT4gMTIzLCAgICAgICAgICAgICAgICAgICMgT3B0aW9uYWwKICAgICAgICBEYXRhICAgICAgID0+ICRBcnRpY2xlSGFzaFJlZiwgICAgICAjIE9wdGlvbmFsCiAgICAgICAgVXNlcklEICAgICA9PiAxMjMsCiAgICApOwoKUmV0dXJuczoKCiAgICAkVGVtcGxhdGUgPSAnU29tZSB0ZXh0JzsKCj1jdXQKCnN1YiBUZW1wbGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0YW5kYXJkVGVtcGxhdGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U3RhbmRhcmRUZW1wbGF0ZScpOwoKICAgIG15ICVUZW1wbGF0ZSA9ICRTdGFuZGFyZFRlbXBsYXRlT2JqZWN0LT5TdGFuZGFyZFRlbXBsYXRlR2V0KAogICAgICAgIElEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICk7CgogICAgIyBkbyB0ZXh0L3BsYWluIHRvIHRleHQvaHRtbCBjb252ZXJ0CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntSaWNoVGV4dH0KICAgICAgICAmJiAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID1+IC90ZXh0XC9wbGFpbi9pCiAgICAgICAgJiYgJFRlbXBsYXRle1RlbXBsYXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgJFRlbXBsYXRle1RlbXBsYXRlfSAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRlbXBsYXRle1RlbXBsYXRlfSwKICAgICAgICApOwogICAgfQoKICAgICMgZG8gdGV4dC9odG1sIHRvIHRleHQvcGxhaW4gY29udmVydAogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgICYmICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPX4gL3RleHRcL2h0bWwvaQogICAgICAgICYmICRUZW1wbGF0ZXtUZW1wbGF0ZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAkVGVtcGxhdGV7VGVtcGxhdGV9ICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRlbXBsYXRle1RlbXBsYXRlfSwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IHVzZXIgbGFuZ3VhZ2UuCiAgICBteSAkTGFuZ3VhZ2U7CiAgICBteSAlVGlja2V0OwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUaWNrZXRJRH0gKSB7CgogICAgICAgICMgR2V0IHRpY2tldCBkYXRhLgogICAgICAgICVUaWNrZXQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBHZXQgcmVjaXBpZW50LgogICAgICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJExhbmd1YWdlID0gJFVzZXJ7VXNlckxhbmd1YWdlfTsKICAgIH0KCiAgICAjIElmIHRlbXBsYXRlIHR5cGUgaXMgJ0NyZWF0ZScgYW5kIHRoZXJlIGlzIGN1c3RvbWVyIHVzZXIgaW5mb3JtYXRpb24sIHRyZWF0IGl0IGFzIGEgdGlja2V0IHBhcmFtIGluIG9yZGVyIHRvCiAgICAjIGNvcnJlY3RseSByZXBsYWNlIGN1c3RvbWVyIHVzZXIgdGFncy4gU2VlIGJ1ZyMxNDQ1NS4KICAgIGlmICggJFRlbXBsYXRle1RlbXBsYXRlVHlwZX0gZXEgJ0NyZWF0ZScgJiYgJFBhcmFte0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSA9ICRQYXJhbXtDdXN0b21lclVzZXJJRH07CiAgICB9CgogICAgIyBpZiBjdXN0b21lciBsYW5ndWFnZSBpcyBub3QgZGVmaW5lZCwgc2V0IGRlZmF1bHQgbGFuZ3VhZ2UKICAgICRMYW5ndWFnZSAvLz0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwoKICAgICMgZ2V0IGxpc3QgdW5zdXBwb3J0ZWQgdGFncyBmb3Igc3RhbmRhcmQgdGVtcGxhdGUKICAgIG15IEBMaXN0T2ZVblN1cHBvcnRlZFRhZyA9IHF3KE9UT0JPX0FHRU5UX1NVQkpFQ1QgT1RPQk9fQUdFTlRfQk9EWSBPVE9CT19DVVNUT01FUl9CT0RZIE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1QpOwoKICAgIG15ICVTdXBwb3J0ZWRUeXBlcyA9ICgKICAgICAgICBBbnN3ZXIgID0+IDEsCiAgICAgICAgRm9yd2FyZCA9PiAxLAogICAgICAgIE5vdGUgICAgPT4gMSwKICAgICk7CgogICAgbXkgJFRlbXBsYXRlVGV4dCA9ICRUZW1wbGF0ZXtUZW1wbGF0ZX0gfHwgJyc7CiAgICBteSAkVGVtcGxhdGVUeXBlID0gJFRlbXBsYXRle1RlbXBsYXRlVHlwZX07CgogICAgIyBSZW1vdmUgdW5zdXBwb3J0ZWQgdGFncyBvbmx5IGZvciBzb21lIHRlbXBsYXRlIHR5cGVzLgogICAgaWYgKCAhJFN1cHBvcnRlZFR5cGVzeyAkVGVtcGxhdGV7VGVtcGxhdGVUeXBlfSB9ICkgewogICAgICAgICRUZW1wbGF0ZVRleHQgPSAkU2VsZi0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgICAgICBUZXh0ICAgICAgICAgICAgICAgICA9PiAkVGVtcGxhdGV7VGVtcGxhdGV9IHx8ICcnLAogICAgICAgICAgICBMaXN0T2ZVblN1cHBvcnRlZFRhZyA9PiBcQExpc3RPZlVuU3VwcG9ydGVkVGFnLAogICAgICAgICk7CgogICAgICAgICMgUmVzZXQgdGVtcGxhdGUgdHlwZSBmb3IgdW5zdXBwb3J0ZWQgdGFnLgogICAgICAgICRUZW1wbGF0ZVR5cGUgPSAnJzsKICAgIH0KCiAgICAjIHJlcGxhY2UgcGxhY2UgaG9sZGVyIHN0dWZmCiAgICAkVGVtcGxhdGVUZXh0ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgPT4gJFNlbGYtPntSaWNoVGV4dH0sCiAgICAgICAgVGV4dCAgICAgICA9PiAkVGVtcGxhdGVUZXh0IHx8ICcnLAogICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0gfHwge30sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBMYW5ndWFnZSAgID0+ICRMYW5ndWFnZSwKICAgICAgICBUZW1wbGF0ZSAgID0+ICRUZW1wbGF0ZVR5cGUsCiAgICApOwoKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CiAgICAgICAgJFRlbXBsYXRlVGV4dCA9fiBzLyZsdDsvPC9nOwogICAgICAgICRUZW1wbGF0ZVRleHQgPX4gcy8mZ3Q7Lz4vZzsKICAgICAgICAkVGVtcGxhdGVUZXh0ID1+IHMvJnF1b3Q7LyIvZzsKICAgICAgICAkVGVtcGxhdGVUZXh0ID1+IHMvJmFwb3M7LycvZzsKICAgICAgICAkVGVtcGxhdGVUZXh0ID1+IHMvJm5ic3A7LyAvZzsKICAgIH0KCiAgICByZXR1cm4gJFRlbXBsYXRlVGV4dDsKfQoKPWhlYWQyIEdlbmVyaWNBZ2VudEFydGljbGUoKQoKZ2VuZXJhdGUgaW50ZXJuYWwgb3IgZXh0ZXJuYWwgbm90ZXMKCiAgICBteSAkR2VuZXJpY0FnZW50QXJ0aWNsZSA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+R2VuZXJpY0FnZW50QXJ0aWNsZSgKICAgICAgICBOb3RpZmljYXRpb24gPT4gJE5vdGlmaWNhdGlvbkRhdGFIYXNoUmVmLAogICAgICAgIFRpY2tldElEICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEyMywKICAgICAgICBEYXRhICAgICAgICAgPT4gJEFydGljbGVIYXNoUmVmLCAgICAgICAgICAgICAjIE9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyaWNBZ2VudEFydGljbGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEIE5vdGlmaWNhdGlvbiBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVGVtcGxhdGUgPSAleyAkUGFyYW17Tm90aWZpY2F0aW9ufSB9OwoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBHZXQgdGlja2V0IGRhdGEuCiAgICBteSAlVGlja2V0ID0gJFRpY2tldE9iamVjdC0+VGlja2V0R2V0KAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBEeW5hbWljRmllbGRzID0+IDEsCiAgICApOwoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKAogICAgICAgICRTZWxmLT57UmljaFRleHR9CiAgICAgICAgJiYgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaQogICAgICAgICYmICRUZW1wbGF0ZXtCb2R5fQogICAgICAgICkKICAgIHsKICAgICAgICAkVGVtcGxhdGV7Q29udGVudFR5cGV9ID0gJ3RleHQvaHRtbCc7CiAgICAgICAgJFRlbXBsYXRle0JvZHl9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICBTdHJpbmcgPT4gJFRlbXBsYXRle0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoCiAgICAgICAgISRTZWxmLT57UmljaFRleHR9CiAgICAgICAgJiYgJFRlbXBsYXRle0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pCiAgICAgICAgJiYgJFRlbXBsYXRle0JvZHl9CiAgICAgICAgKQogICAgewogICAgICAgICRUZW1wbGF0ZXtDb250ZW50VHlwZX0gPSAndGV4dC9wbGFpbic7CiAgICAgICAgJFRlbXBsYXRle0JvZHl9ICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9Bc2NpaSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUZW1wbGF0ZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICRUZW1wbGF0ZXtCb2R5fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgPT4gJFRlbXBsYXRle0JvZHl9LAogICAgICAgIFJlY2lwaWVudCAgPT4gJFBhcmFte1JlY2lwaWVudH0sCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17RGF0YX0gfHwge30sCiAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKICAgICRUZW1wbGF0ZXtTdWJqZWN0fSA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICBSaWNoVGV4dCAgID0+IDAsCiAgICAgICAgVGV4dCAgICAgICA9PiAkVGVtcGxhdGV7U3ViamVjdH0sCiAgICAgICAgUmVjaXBpZW50ICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtEYXRhfSB8fCB7fSwKICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICRUZW1wbGF0ZXtTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgICAgICA9PiAkVGVtcGxhdGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdOZXcnLAogICAgKTsKCiAgICAjIGFkZCBVUkxzIGFuZCB2ZXJpZnkgdG8gYmUgZnVsbCBIVE1MIGRvY3VtZW50CiAgICBpZiAoICRTZWxmLT57UmljaFRleHR9ICkgewoKICAgICAgICAkVGVtcGxhdGV7Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICRUZW1wbGF0ZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVGVtcGxhdGU7Cn0KCj1oZWFkMiBBdHRyaWJ1dGVzKCkKCm1vZGlmaWVzIGlucGxhY2UgdGhlIHBhc3NlZCBpbiBDPERhdGE+IGhhc2ggcmVmZXJlbmNlIGFuZCByZXR1cm5zIHRoZSBlbnJpY2hlZCBkYXRhLgoKICAgIG15ICVEYXRhID0gKAogICAgICAgIFN1YmplY3QgPT4gJ1doYXQgZG8geW91IHdhbnQgdG8gdGFsayBhYm91dD8nCiAgICApOwoKICAgIG15ICVFbnJpY2hlZERhdGEgPSAkVGVtcGxhdGVHZW5lcmF0b09iamVjdC0+QXR0cmlidXRlcygKICAgICAgICBUaWNrZXRJRCAgID0+IDEyMywKICAgICAgICBEYXRhICAgICAgID0+IFwlRGF0YSwgICAgIyAkRGF0YXtTdWJqZWN0fSBpcyB1c2VkIGFzIGlucHV0IGZvciBmaW5kaW5nIHRoZSBuZXcgc3ViamVjdAogICAgICAgIFVzZXJJRCAgICAgPT4gMTIzLAogICAgICAgIEFjdGlvbiAgICAgPT4gJ0ZvcndhcmQnLCAjIFJlbGV2YW50IGZvciB0aGUgc3ViamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBQb3NzaWJsZSB2YWx1ZXMgYXJlICdSZXBseScgYW5kICdGb3J3YXJkJywgJ1JlcGx5JyBpcyBldmVudHVhbGx5IHRoZSBkZWZhdWx0LgogICAgKTsKClJldHVybnMgdGhlIG1vZGlmaWVkIGhhc2ggcmVmZXJlbmNlIGFzIGtleSB2YWx1ZSBwYWlycy4gVGhlIHBvdGVudGlhbGx5IGFkZGVkIG9yIGNoYW5nZWQgaXRlbSBhcmU6Cgo9b3ZlciA0Cgo9aXRlbSBTdWJqZWN0Cgo9aXRlbSBGcm9tCgo9YmFjawoKPWN1dAoKc3ViIEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFRpY2tldElEIERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpY2tldCBvYmplY3QKICAgIG15ICRUaWNrZXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0Jyk7CgogICAgIyBnZXQgdGlja2V0IGRhdGEsIGluY2x1ZGluZyB0aGUgcXVldWUgaWQKICAgIG15ICVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICk7CgogICAgIyBwcmVwYXJlIHN1YmplY3QgLi4uCiAgICAkUGFyYW17RGF0YX0tPntTdWJqZWN0fSA9ICRUaWNrZXRPYmplY3QtPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgICAgICA9PiAkUGFyYW17RGF0YX0tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICBBY3Rpb24gICAgICAgPT4gJFBhcmFte0FjdGlvbn0gICAgICAgICAgfHwgJycsICAgICMgVGlja2V0U3ViamVjdEJ1aWxkKCkgZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCAnUmVwbHknCiAgICApOwoKICAgICMgZ2V0IHNlbmRlciBhZGRyZXNzCiAgICAkUGFyYW17RGF0YX0tPntGcm9tfSA9ICRTZWxmLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17RGF0YX0tPiUqOwp9Cgo9aGVhZDIgQXV0b1Jlc3BvbnNlKCkKCmdlbmVyYXRlIHJlc3BvbnNlCgpBdXRvUmVzcG9uc2UKICAgIFRpY2tldElECiAgICAgICAgT3duZXIKICAgICAgICBSZXNwb25zaWJsZQogICAgICAgIENVU1RPTUVSX0RBVEEKICAgIEFydGljbGVJRAogICAgICAgIENVU1RPTUVSX1NVQkpFQ1QKICAgICAgICBDVVNUT01FUl9FTUFJTAogICAgVXNlcklECgogICAgVG8KICAgIENjCiAgICBCY2MKICAgIFN1YmplY3QKICAgIEJvZHkKICAgIENvbnRlbnRUeXBlCgogICAgbXkgJUF1dG9SZXNwb25zZSA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+QXV0b1Jlc3BvbnNlKAogICAgICAgIFRpY2tldElEICAgICAgICAgPT4gMTIzLAogICAgICAgIE9yaWdIZWFkZXIgICAgICAgPT4ge30sCiAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAnYXV0byByZXBseScsCiAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEF1dG9SZXNwb25zZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoVGlja2V0SUQgQXV0b1Jlc3BvbnNlVHlwZSBPcmlnSGVhZGVyIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aWNrZXQgb2JqZWN0CiAgICBteSAkVGlja2V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpOwoKICAgICMgR2V0IHRpY2tldCBkYXRhLgogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCAgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgRHluYW1pY0ZpZWxkcyA9PiAxLAogICAgKTsKCiAgICAjIGdldCBhdXRvIGRlZmF1bHQgcmVzcG9uc2VzCiAgICBteSAlQXV0b1Jlc3BvbnNlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkF1dG9SZXNwb25zZScpLT5BdXRvUmVzcG9uc2VHZXRCeVR5cGVRdWV1ZUlEKAogICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICBUeXBlICAgID0+ICRQYXJhbXtBdXRvUmVzcG9uc2VUeXBlfSwKICAgICk7CgogICAgcmV0dXJuIGlmICElQXV0b1Jlc3BvbnNlOwoKICAgICMgZ2V0IG9sZCBhcnRpY2xlIGZvciBxdW90aW5nCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKICAgIG15IEBBcnRpY2xlTGlzdCAgID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBTZW5kZXJUeXBlID0+ICdjdXN0b21lcicsCiAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgKTsKCiAgICBpZiAoICFAQXJ0aWNsZUxpc3QgKSB7CiAgICAgICAgQEFydGljbGVMaXN0ID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICBJc1Zpc2libGVGb3JDdXN0b21lciA9PiAxLAogICAgICAgICAgICBPbmx5TGFzdCAgICAgICAgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgaWYgKEBBcnRpY2xlTGlzdCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkQXJ0aWNsZUxpc3RbMF0gfSApLT5BcnRpY2xlR2V0KCAleyAkQXJ0aWNsZUxpc3RbMF0gfSApOwoKICAgICAgICBmb3IgbXkgJEtleSAocXcoRnJvbSBUbyBDYyBTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgICAgIGlmICggISRQYXJhbXtPcmlnSGVhZGVyfS0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte09yaWdIZWFkZXJ9LT57JEtleX0gPSAkQXJ0aWNsZXskS2V5fSB8fCAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaG9tcCAkUGFyYW17T3JpZ0hlYWRlcn0tPnskS2V5fTsKICAgICAgICB9CiAgICB9CgogICAgIyBmb3JtYXQgYm9keSAob25seSBpZiBsb25nZXIgdGhhbiA4NiBjaGFycykKICAgIGlmICggJFBhcmFte09yaWdIZWFkZXJ9LT57Qm9keX0gKSB7CiAgICAgICAgaWYgKCBsZW5ndGggJFBhcmFte09yaWdIZWFkZXJ9LT57Qm9keX0gPiA4NiApIHsKICAgICAgICAgICAgbXkgQExpbmVzID0gc3BsaXQgL1xuLywgJFBhcmFte09yaWdIZWFkZXJ9LT57Qm9keX07CiAgICAgICAgICAgIExJTkU6CiAgICAgICAgICAgIGZvciBteSAkTGluZSAoQExpbmVzKSB7CiAgICAgICAgICAgICAgICBteSAkTGluZVdyYXBwZWQgPSAkTGluZSA9fiBzLyhePi4rfC57NCw4Nn0pKD86XHN8XHopLyQxXG4vZ207CgogICAgICAgICAgICAgICAgbmV4dCBMSU5FIGlmICRMaW5lV3JhcHBlZDsKCiAgICAgICAgICAgICAgICAjIGlmIHRoZSByZWdleCBkb2VzIG5vdCBtYXRjaCB0aGVuIHdlIG5lZWQKICAgICAgICAgICAgICAgICMgdG8gYWRkIHRoZSBtaXNzaW5nIG5ldyBsaW5lIG9mIHRoZSBzcGxpdAogICAgICAgICAgICAgICAgIyBlbHNlIHdlIHdpbGwgbG9zZSBlLmcuIGVtcHR5IGxpbmVzIG9mIHRoZSBib2R5LgogICAgICAgICAgICAgICAgIyAoYnVnIzEwNjc5KQogICAgICAgICAgICAgICAgJExpbmUgLj0gIlxuIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17T3JpZ0hlYWRlcn0tPntCb2R5fSA9IGpvaW4gJycsIEBMaW5lczsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHVwIHJlcXVpcmVkIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkS2V5IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFte09yaWdIZWFkZXJ9LT57JEtleX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtPcmlnSGVhZGVyfS0+eyRLZXl9ID0gIk5vICRLZXkiOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCByZWNpcGllbnQKICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHVzZXIgbGFuZ3VhZ2UKICAgIG15ICRMYW5ndWFnZSA9ICRVc2Vye1VzZXJMYW5ndWFnZX0gfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSAmJiAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICRBdXRvUmVzcG9uc2V7VGV4dH0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgIFN0cmluZyA9PiAkQXV0b1Jlc3BvbnNle1RleHR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSAmJiAkQXV0b1Jlc3BvbnNle0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pICkgewogICAgICAgICRBdXRvUmVzcG9uc2V7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICRBdXRvUmVzcG9uc2V7VGV4dH0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICApOwogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICRBdXRvUmVzcG9uc2V7VGV4dH0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgPT4gJFNlbGYtPntSaWNoVGV4dH0sCiAgICAgICAgVGV4dCAgICAgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICBEYXRhICAgICA9PiB7CiAgICAgICAgICAgICV7ICRQYXJhbXtPcmlnSGVhZGVyfSB9LAogICAgICAgICAgICBGcm9tID0+ICRQYXJhbXtPcmlnSGVhZGVyfS0+e1RvfSwKICAgICAgICAgICAgVG8gICA9PiAkUGFyYW17T3JpZ0hlYWRlcn0tPntGcm9tfSwKICAgICAgICB9LAogICAgICAgIFRpY2tldERhdGEgICAgICA9PiBcJVRpY2tldCwKICAgICAgICBVc2VySUQgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTGFuZ3VhZ2UgICAgICAgID0+ICRMYW5ndWFnZSwKICAgICAgICBBZGRUaW1lem9uZUluZm8gPT4gewogICAgICAgICAgICBBdXRvUmVzcG9uc2UgPT4gMSwKICAgICAgICB9LAogICAgKTsKICAgICRBdXRvUmVzcG9uc2V7U3ViamVjdH0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgPT4gMCwKICAgICAgICBUZXh0ICAgICA9PiAkQXV0b1Jlc3BvbnNle1N1YmplY3R9LAogICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgJXsgJFBhcmFte09yaWdIZWFkZXJ9IH0sCiAgICAgICAgICAgIEZyb20gPT4gJFBhcmFte09yaWdIZWFkZXJ9LT57VG99LAogICAgICAgICAgICBUbyAgID0+ICRQYXJhbXtPcmlnSGVhZGVyfS0+e0Zyb219LAogICAgICAgIH0sCiAgICAgICAgVGlja2V0RGF0YSAgICAgID0+IFwlVGlja2V0LAogICAgICAgIFVzZXJJRCAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICBMYW5ndWFnZSAgICAgICAgPT4gJExhbmd1YWdlLAogICAgICAgIEFkZFRpbWV6b25lSW5mbyA9PiB7CiAgICAgICAgICAgIEF1dG9SZXNwb25zZSA9PiAxLAogICAgICAgIH0sCiAgICApOwoKICAgICRBdXRvUmVzcG9uc2V7U3ViamVjdH0gPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEF1dG9SZXNwb25zZXtTdWJqZWN0fSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICAgICAgTm9DbGVhbnVwICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHNlbmRlciBhdHRyaWJ1dGVzIGJhc2VkIG9uIGF1dG8gcmVzcG9uc2UgdHlwZQogICAgaWYgKCAkQXV0b1Jlc3BvbnNle1N5c3RlbUFkZHJlc3NJRH0gKSB7CgogICAgICAgIG15ICVBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MnKS0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgSUQgPT4gJEF1dG9SZXNwb25zZXtTeXN0ZW1BZGRyZXNzSUR9LAogICAgICAgICk7CgogICAgICAgICRBdXRvUmVzcG9uc2V7U2VuZGVyQWRkcmVzc30gID0gJEFkZHJlc3N7TmFtZX07CiAgICAgICAgJEF1dG9SZXNwb25zZXtTZW5kZXJSZWFsbmFtZX0gPSAkQWRkcmVzc3tSZWFsbmFtZX07ICAgICMgbm90ZSB0aGF0IFN5c3RlbUFkZHJlc3MoKSBkb2VzIG5vdCBjYXBpdGFsaXplIHRoZSAnbicKICAgIH0KCiAgICAjIGdldCBzZW5kZXIgYXR0cmlidXRlcyBiYXNlZCBvbiBxdWV1ZQogICAgZWxzZSB7CgogICAgICAgIG15ICVBZGRyZXNzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPkdldFN5c3RlbUFkZHJlc3MoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSwKICAgICAgICApOwoKICAgICAgICAkQXV0b1Jlc3BvbnNle1NlbmRlckFkZHJlc3N9ICA9ICRBZGRyZXNze0VtYWlsfTsKICAgICAgICAkQXV0b1Jlc3BvbnNle1NlbmRlclJlYWxuYW1lfSA9ICRBZGRyZXNze1BocmFzZX07CiAgICB9CgogICAgIyBhZGQgdXJscyBhbmQgdmVyaWZ5IHRvIGJlIGZ1bGwgaHRtbCBkb2N1bWVudAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSApIHsKCiAgICAgICAgJEF1dG9SZXNwb25zZXtUZXh0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+TGlua1F1b3RlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICApOwoKICAgICAgICAkQXV0b1Jlc3BvbnNle1RleHR9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICBTdHJpbmcgPT4gJEF1dG9SZXNwb25zZXtUZXh0fSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlQXV0b1Jlc3BvbnNlOwp9Cgo9aGVhZDIgTm90aWZpY2F0aW9uRXZlbnQoKQoKcmVwbGFjZSBhbGwgT1RPQk8gc21hcnQgdGFncyBpbiB0aGUgbm90aWZpY2F0aW9uIGJvZHkgYW5kIHN1YmplY3QKCiAgICBteSAlTm90aWZpY2F0aW9uRXZlbnQgPSAkVGVtcGxhdGVHZW5lcmF0b3JPYmplY3QtPk5vdGlmaWNhdGlvbkV2ZW50KAogICAgICAgIFRpY2tldERhdGEgICAgICAgICAgICA9PiAkVGlja2V0RGF0YUhhc2hSZWYsCiAgICAgICAgUmVjaXBpZW50ICAgICAgICAgICAgID0+ICRVc2VyRGF0YUhhc2hSZWYsICAgICAgICAgICMgQWdlbnQgb3IgQ3VzdG9tZXIgZGF0YSBnZXQgcmVzdWx0CiAgICAgICAgTm90aWZpY2F0aW9uICAgICAgICAgID0+ICROb3RpZmljYXRpb25EYXRhSGFzaFJlZiwKICAgICAgICBDdXN0b21lck1lc3NhZ2VQYXJhbXMgPT4gJEFydGljbGVIYXNoUmVmLCAgICAgICAgICAgIyBvcHRpb25hbAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIE5vdGlmaWNhdGlvbkV2ZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhUaWNrZXREYXRhIE5vdGlmaWNhdGlvbiBSZWNpcGllbnQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCAkUGFyYW17Tm90aWZpY2F0aW9ufSApICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm90aWZpY2F0aW9uIGlzIGludmFsaWQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlTm90aWZpY2F0aW9uID0gJXsgJFBhcmFte05vdGlmaWNhdGlvbn0gfTsKCiAgICAjIGV4Y2hhbmdpbmcgb3JpZ2luYWwgcmVmZXJlbmNlIHByZXZlbnQgaXQgdG8gZ3JvdyB1cAogICAgaWYgKCByZWYgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gJiYgcmVmICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9IGVxICdIQVNIJyApIHsKICAgICAgICBteSAlTG9jYWxDdXN0b21lck1lc3NhZ2VQYXJhbXMgPSAleyAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfSB9OwogICAgICAgICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9ID0gXCVMb2NhbEN1c3RvbWVyTWVzc2FnZVBhcmFtczsKICAgIH0KCiAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAjIEdldCBsYXN0IGFydGljbGUgZnJvbSBjdXN0b21lci4KICAgIG15IEBDdXN0b21lckFydGljbGVzID0gJEFydGljbGVPYmplY3QtPkFydGljbGVMaXN0KAogICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgIFNlbmRlclR5cGUgPT4gJ2N1c3RvbWVyJywKICAgICAgICBPbmx5TGFzdCAgID0+IDEsCiAgICApOwoKICAgIG15ICVDdXN0b21lckFydGljbGU7CgogICAgQVJUSUNMRToKICAgIGZvciBteSAkQXJ0aWNsZSAoQEN1c3RvbWVyQXJ0aWNsZXMpIHsKICAgICAgICBuZXh0IEFSVElDTEUgaWYgISRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgJUN1c3RvbWVyQXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZX0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGxhc3QgYXJ0aWNsZSBmcm9tIGFnZW50LgogICAgbXkgQEFnZW50QXJ0aWNsZXMgPSAkQXJ0aWNsZU9iamVjdC0+QXJ0aWNsZUxpc3QoCiAgICAgICAgVGlja2V0SUQgICA9PiAkUGFyYW17VGlja2V0RGF0YX0tPntUaWNrZXRJRH0sCiAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgIE9ubHlMYXN0ICAgPT4gMSwKICAgICk7CgogICAgbXkgJUFnZW50QXJ0aWNsZTsKCiAgICBBR0VOVEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGUgKEBBZ2VudEFydGljbGVzKSB7CiAgICAgICAgbmV4dCBBR0VOVEFSVElDTEUgaWYgISRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgJUFnZW50QXJ0aWNsZSA9ICRBcnRpY2xlT2JqZWN0LT5CYWNrZW5kRm9yQXJ0aWNsZSggJXskQXJ0aWNsZX0gKS0+QXJ0aWNsZUdldCgKICAgICAgICAgICAgJXskQXJ0aWNsZX0sCiAgICAgICAgICAgIER5bmFtaWNGaWVsZHMgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIEluY2x1ZGUgdGhlIHRyYW5zbWlzc2lvbiBzdGF0dXMsIGlmIGFydGljbGUgaXMgYW4gZW1haWwuCiAgICAgICAgbXkgJUNvbW11bmljYXRpb25DaGFubmVsID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNvbW11bmljYXRpb25DaGFubmVsJyktPkNoYW5uZWxHZXQoCiAgICAgICAgICAgIENoYW5uZWxJRCA9PiAkQXJ0aWNsZS0+e0NvbW11bmljYXRpb25DaGFubmVsSUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQ29tbXVuaWNhdGlvbkNoYW5uZWx7Q2hhbm5lbE5hbWV9IGVxICdFbWFpbCcgKSB7CiAgICAgICAgICAgIG15ICRUcmFuc21pc3Npb25TdGF0dXMgPSAkQXJ0aWNsZU9iamVjdC0+QmFja2VuZEZvckFydGljbGUoICV7JEFydGljbGV9ICktPkFydGljbGVUcmFuc21pc3Npb25TdGF0dXMoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGUtPntBcnRpY2xlSUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRUcmFuc21pc3Npb25TdGF0dXMgJiYgJFRyYW5zbWlzc2lvblN0YXR1cy0+e01lc3NhZ2V9ICkgewogICAgICAgICAgICAgICAgJEFnZW50QXJ0aWNsZXtUcmFuc21pc3Npb25TdGF0dXNNZXNzYWdlfSA9ICRUcmFuc21pc3Npb25TdGF0dXMtPntNZXNzYWdlfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgIEFSVElDTEU6CiAgICBmb3IgbXkgJEFydGljbGVEYXRhICggXCVDdXN0b21lckFydGljbGUsIFwlQWdlbnRBcnRpY2xlICkgewogICAgICAgIG5leHQgQVJUSUNMRSBpZiAhJEFydGljbGVEYXRhLT57VGlja2V0SUR9OwogICAgICAgIG5leHQgQVJUSUNMRSBpZiAhJEFydGljbGVEYXRhLT57QXJ0aWNsZUlEfTsKCiAgICAgICAgIyBHZXQgYXJ0aWNsZSBwcmV2aWV3IGluIHBsYWluIHRleHQgYW5kIHN0b3JlIGl0IGFzIEJvZHkga2V5LgogICAgICAgICRBcnRpY2xlRGF0YS0+e0JvZHl9ID0gJExheW91dE9iamVjdC0+QXJ0aWNsZVByZXZpZXcoCiAgICAgICAgICAgIFRpY2tldElEICAgPT4gJEFydGljbGVEYXRhLT57VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgID0+ICRBcnRpY2xlRGF0YS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgIFJlc3VsdFR5cGUgPT4gJ3BsYWluJywKICAgICAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBhY2NvdW50ZWQgdGltZQogICAgICAgIG15ICRBY2NvdW50ZWRUaW1lID0gJEFydGljbGVPYmplY3QtPkFydGljbGVBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVEYXRhLT57QXJ0aWNsZUlEfSwKICAgICAgICApOwoKICAgICAgICAjIHNldCB0aGUgYWNjb3VudGVkIHRpbWUgYXMgcGFydCBvZiB0aGUgYXJ0aWNsZXMgaW5mb3JtYXRpb24KICAgICAgICAkQXJ0aWNsZURhdGEtPntUaW1lVW5pdH0gPSAkQWNjb3VudGVkVGltZTsKICAgIH0KCiAgICAjIFBvcHVsYXRlIHRoZSBoYXNoICdDdXN0b21lck1lc3NhZ2VQYXJhbXMnIHdpdGggYWxsIHRoZSBjdXN0b21lci1hcnRpY2xlIGRhdGEKICAgICMgYW5kIG92ZXJ3cml0ZSBpdCB3aXRoICdDdXN0b21lck1lc3NhZ2VQYXJhbXMnIHBhc3NlZCBpbiB0aGUgUGFyYW1zIChidWcgIzEzMzI1KS4KICAgICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9ID0gewogICAgICAgICVDdXN0b21lckFydGljbGUsCiAgICAgICAgJXsgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30gfSwKICAgIH07CgogICAgIyBnZXQgc3lzdGVtIGRlZmF1bHQgbGFuZ3VhZ2UKICAgIG15ICREZWZhdWx0TGFuZ3VhZ2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0RlZmF1bHRMYW5ndWFnZScpIHx8ICdlbic7CgogICAgbXkgJExhbmd1YWdlcyA9IFsgJFBhcmFte1JlY2lwaWVudH0tPntVc2VyTGFuZ3VhZ2V9LCAkRGVmYXVsdExhbmd1YWdlLCAnZW4nIF07CgogICAgbXkgJExhbmd1YWdlOwogICAgTEFOR1VBR0U6CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyRMYW5ndWFnZXN9ICkgewogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISRJdGVtOwogICAgICAgIG5leHQgTEFOR1VBR0UgaWYgISROb3RpZmljYXRpb257TWVzc2FnZX0tPnskSXRlbX07CgogICAgICAgICMgc2V0IGxhbmd1YWdlCiAgICAgICAgJExhbmd1YWdlID0gJEl0ZW07CiAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgIH0KCiAgICAjIGlmIG5vIGxhbmd1YWdlLCB0aGVuIHRha2UgdGhlIGZpcnN0IG9uZSBhdmFpbGFibGUKICAgIGlmICggISRMYW5ndWFnZSApIHsKICAgICAgICBteSBATm90aWZpY2F0aW9uTGFuZ3VhZ2VzID0gc29ydCBrZXlzICV7ICROb3RpZmljYXRpb257TWVzc2FnZX0gfTsKICAgICAgICAkTGFuZ3VhZ2UgPSAkTm90aWZpY2F0aW9uTGFuZ3VhZ2VzWzBdOwogICAgfQoKICAgICMgY29weSB0aGUgY29ycmVjdCBsYW5ndWFnZSBtZXNzYWdlIGF0dHJpYnV0ZXMgdG8gYSBmbGF0IHN0cnVjdHVyZQogICAgZm9yIG15ICRBdHRyaWJ1dGUgKHF3KFN1YmplY3QgQm9keSBDb250ZW50VHlwZSkpIHsKICAgICAgICAkTm90aWZpY2F0aW9ueyRBdHRyaWJ1dGV9ID0gJE5vdGlmaWNhdGlvbntNZXNzYWdlfS0+eyRMYW5ndWFnZX0tPnskQXR0cmlidXRlfTsKICAgIH0KCiAgICAjIEdldCBjdXN0b21lciBhcnRpY2xlIGZpZWxkcy4KICAgIG15ICVDdXN0b21lckFydGljbGVGaWVsZHM7CgogICAgaWYgKCVDdXN0b21lckFydGljbGUpIHsKICAgICAgICAlQ3VzdG9tZXJBcnRpY2xlRmllbGRzID0gJExheW91dE9iamVjdC0+QXJ0aWNsZUZpZWxkcygKICAgICAgICAgICAgVGlja2V0SUQgID0+ICRDdXN0b21lckFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEN1c3RvbWVyQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBBUlRJQ0xFX0ZJRUxEOgogICAgZm9yIG15ICRBcnRpY2xlRmllbGQgKCBzb3J0IGtleXMgJUN1c3RvbWVyQXJ0aWNsZUZpZWxkcyApIHsKICAgICAgICBuZXh0IEFSVElDTEVfRklFTEQgaWYgIWRlZmluZWQgJEN1c3RvbWVyQXJ0aWNsZUZpZWxkc3skQXJ0aWNsZUZpZWxkfS0+e1ZhbHVlfTsKCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRBcnRpY2xlRmllbGR9ICkgewogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRBcnRpY2xlRmllbGR9ID0gJEN1c3RvbWVyQXJ0aWNsZUZpZWxkc3skQXJ0aWNsZUZpZWxkfS0+e1ZhbHVlfTsKICAgICAgICB9CiAgICAgICAgY2hvbXAgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPnskQXJ0aWNsZUZpZWxkfTsKICAgIH0KCiAgICAjIGZvcm1hdCBib2R5IChvbmx5IGlmIGxvbmdlciB0aGUgODYgY2hhcnMpCiAgICBpZiAoICRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57Qm9keX0gKSB7CiAgICAgICAgaWYgKCBsZW5ndGggJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPntCb2R5fSA+IDg2ICkgewogICAgICAgICAgICBteSBATGluZXMgPSBzcGxpdCAvXG4vLCAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+e0JvZHl9OwogICAgICAgICAgICBMSU5FOgogICAgICAgICAgICBmb3IgbXkgJExpbmUgKEBMaW5lcykgewogICAgICAgICAgICAgICAgbXkgJExpbmVXcmFwcGVkID0gJExpbmUgPX4gcy8oXj4uK3wuezQsODZ9KSg/OlxzfFx6KS8kMVxuL2dtOwoKICAgICAgICAgICAgICAgIG5leHQgTElORSBpZiAkTGluZVdyYXBwZWQ7CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgcmVnZXggZG9lcyBub3QgbWF0Y2ggdGhlbiB3ZSBuZWVkCiAgICAgICAgICAgICAgICAjIHRvIGFkZCB0aGUgbWlzc2luZyBuZXcgbGluZSBvZiB0aGUgc3BsaXQKICAgICAgICAgICAgICAgICMgZWxzZSB3ZSB3aWxsIGxvc2UgZS5nLiBlbXB0eSBsaW5lcyBvZiB0aGUgYm9keS4KICAgICAgICAgICAgICAgICMgKGJ1ZyMxMDY3OSkKICAgICAgICAgICAgICAgICRMaW5lIC49ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30tPntCb2R5fSA9IGpvaW4gJycsIEBMaW5lczsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHVwIHJlcXVpcmVkIGF0dHJpYnV0ZXMKICAgIGZvciBteSAkVGV4dCAocXcoU3ViamVjdCBCb2R5KSkgewogICAgICAgIGlmICggISRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57JFRleHR9ICkgewoKICAgICAgICAgICAgIyBTZXQgdG8gbGFzdCBjdXN0b21lciBhcnRpY2xlIGF0dHJpYnV0ZSBpZiBpdCBpcyBlbXB0eSBzdHJpbmcuCiAgICAgICAgICAgICMgRm9yIGV4YW1wbGUsIGlmIEJvZHkgaXMgZW1wdHkgc3RyaW5nIChub3QgdW5kZWYhKSwgaXQgaXMgbWF5YmUgc2VudCBmcm9tIE5vdGlmaWNhdGlvbk93bmVyVXBkYXRlIGV2ZW50CiAgICAgICAgICAgICMgYW5kIG92ZXJyaWRlcyBsYXN0IGN1c3RvbWVyIGFydGljbGUgYm9keSAoaW4gJUN1c3RvbWVyQXJ0aWNsZSkgYWJvdmUgLSBzZWUgYnVnIzE0Njc4LgogICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRUZXh0fSA9ICRDdXN0b21lckFydGljbGV7JFRleHR9IHx8ICJObyAkVGV4dCI7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdGFydCA9ICc8JzsKICAgIG15ICRFbmQgICA9ICc+JzsKICAgIGlmICggJE5vdGlmaWNhdGlvbntDb250ZW50VHlwZX0gPX4gbXt0ZXh0XC9odG1sfSApIHsKICAgICAgICAkU3RhcnQgPSAnJmx0Oyc7CiAgICAgICAgJEVuZCAgID0gJyZndDsnOwogICAgfQoKICAgICMgcmVwbGFjZSA8T1RPQk9fQ1VTVE9NRVJfREFUQV8qPiB0YWdzIGVhcmx5IGZyb20gQ3VzdG9tZXJNZXNzYWdlUGFyYW1zLCB0aGUgcmVzdHMgd2lsbCBiZSByZXBsYWNlZAogICAgIyBieSB0aWNrZXQgY3VzdG9tZXIgdXNlcgogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30gfHwge30gfSApIHsKCiAgICAgICAgbmV4dCBLRVkgaWYgISRQYXJhbXtDdXN0b21lck1lc3NhZ2VQYXJhbXN9LT57JEtleX07CgogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgPX4gcy8ke1N0YXJ0fU9UT0JPX0NVU1RPTUVSX0RBVEFfJEtleSR7RW5kfS8kUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRLZXl9L2dpOwogICAgICAgICROb3RpZmljYXRpb257U3ViamVjdH0gPX4gcy88T1RPQk9fQ1VTVE9NRVJfREFUQV8kS2V5Pi8kUGFyYW17Q3VzdG9tZXJNZXNzYWdlUGFyYW1zfS0+eyRLZXl9eyRLZXl9L2dpOwogICAgfQoKICAgICMgZG8gdGV4dC9wbGFpbiB0byB0ZXh0L2h0bWwgY29udmVydAogICAgaWYgKCAkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvcGxhaW4vaSApIHsKICAgICAgICAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgIFN0cmluZyA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyB0ZXh0L2h0bWwgdG8gdGV4dC9wbGFpbiBjb252ZXJ0CiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSAmJiAkTm90aWZpY2F0aW9ue0NvbnRlbnRUeXBlfSA9fiAvdGV4dFwvaHRtbC9pICkgewogICAgICAgICROb3RpZmljYXRpb257Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0FzY2lpKAogICAgICAgICAgICBTdHJpbmcgPT4gJE5vdGlmaWNhdGlvbntCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IG5vdGlmeSB0ZXh0cwogICAgZm9yIG15ICRUZXh0IChxdyhTdWJqZWN0IEJvZHkpKSB7CiAgICAgICAgaWYgKCAhJE5vdGlmaWNhdGlvbnskVGV4dH0gKSB7CiAgICAgICAgICAgICROb3RpZmljYXRpb257JFRleHR9ID0gIk5vIE5vdGlmaWNhdGlvbiAkVGV4dCBmb3IgJFBhcmFte1R5cGV9IGZvdW5kISI7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBwbGFjZSBob2xkZXIgc3R1ZmYKICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkU2VsZi0+X1JlcGxhY2UoCiAgICAgICAgUmljaFRleHQgICAgICAgID0+ICRTZWxmLT57UmljaFRleHR9LAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAkTm90aWZpY2F0aW9ue0JvZHl9LAogICAgICAgIFJlY2lwaWVudCAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBEYXRhICAgICAgICAgICAgPT4gJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30sCiAgICAgICAgRGF0YUFnZW50ICAgICAgID0+IFwlQWdlbnRBcnRpY2xlLAogICAgICAgIFRpY2tldERhdGEgICAgICA9PiAkUGFyYW17VGlja2V0RGF0YX0sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgQWRkVGltZXpvbmVJbmZvID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRXZlbnQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAkTm90aWZpY2F0aW9ue1N1YmplY3R9ID0gJFNlbGYtPl9SZXBsYWNlKAogICAgICAgIFJpY2hUZXh0ICAgICAgICA9PiAwLAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAkTm90aWZpY2F0aW9ue1N1YmplY3R9LAogICAgICAgIFJlY2lwaWVudCAgICAgICA9PiAkUGFyYW17UmVjaXBpZW50fSwKICAgICAgICBEYXRhICAgICAgICAgICAgPT4gJFBhcmFte0N1c3RvbWVyTWVzc2FnZVBhcmFtc30sCiAgICAgICAgRGF0YUFnZW50ICAgICAgID0+IFwlQWdlbnRBcnRpY2xlLAogICAgICAgIFRpY2tldERhdGEgICAgICA9PiAkUGFyYW17VGlja2V0RGF0YX0sCiAgICAgICAgVXNlcklEICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIExhbmd1YWdlICAgICAgICA9PiAkTGFuZ3VhZ2UsCiAgICAgICAgQWRkVGltZXpvbmVJbmZvID0+IHsKICAgICAgICAgICAgTm90aWZpY2F0aW9uRXZlbnQgPT4gMSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIEtlZXAgdGhlICJvcmlnaW5hbCIgKHVubW9kaWZpZWQpIHN1YmplY3QgYW5kIGJvZHkgZm9yIGxhdGVyIHVzZS4KICAgICROb3RpZmljYXRpb257T3JpZ2luYWxTdWJqZWN0fSA9ICROb3RpZmljYXRpb257U3ViamVjdH07CiAgICAkTm90aWZpY2F0aW9ue09yaWdpbmFsQm9keX0gICAgPSAkTm90aWZpY2F0aW9ue0JvZHl9OwoKICAgICROb3RpZmljYXRpb257U3ViamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VGlja2V0JyktPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0TnVtYmVyfSwKICAgICAgICBTdWJqZWN0ICAgICAgPT4gJE5vdGlmaWNhdGlvbntTdWJqZWN0fSB8fCAnJywKICAgICAgICBUeXBlICAgICAgICAgPT4gJ05ldycsCiAgICApOwoKICAgICMgYWRkIFVSTHMgYW5kIHZlcmlmeSB0byBiZSBmdWxsIEhUTUwgZG9jdW1lbnQKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CgogICAgICAgICROb3RpZmljYXRpb257Qm9keX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkxpbmtRdW90ZSgKICAgICAgICAgICAgU3RyaW5nID0+ICROb3RpZmljYXRpb257Qm9keX0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJU5vdGlmaWNhdGlvbjsKfQoKPWJlZ2luIEludGVybmFsOgoKUHJpdmF0ZSBmdW5jdGlvbnMgdXNlZCBieSB0aGlzIHBhY2thZ2UgKG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudGVkIHB1YmxpYyBBUEkpLgoKPWhlYWQyIF9GaXhNYWlsdG8oKQoKQSBoZWxwZXIgbWV0aG9kIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGludGVybmFsIG1ldGhvZCBDPF9SZXBsYWNlKCk+LgpUaGUgY29tcGxldGUgc2V0IG9mIHBhcmFtZXRlcnMgb2YgQzxfUmVwbGFjZSgpPiBpcyBuZWVkZWQgaGVyZSBhcyBDPF9SZXBsYWNlKCk+CmlzIGNhbGxlZCByZWN1cnNpdmVseS4KClRoZSBnb2FsIGlzIHRvIHN1cHBvcnQgcGFyYW1ldGVyIGV4cGFuc2lvbiBpbiBtYWlsdG8gbGlua3MuIFNvCgogIDxhIGhyZWY9Im1haWx0bzp1c2VyQHRpbWV6b25laW5mby5vcmc/c3ViamVjdD1PVE9CTyUyMFVzZXJEZWZhdWx0VGltZVpvbmUmYW1wO2JvZHk9JTNDT1RPQk9fQ09ORklHX1VzZXJEZWZhdWx0VGltZVpvbmUlM0UiPm1haWwgdG8gdGltZXpvbmVpbmZvPC9hPi4KCndvdWxkIGJlIGV4cGFuZGVkIHRvOgoKICA8YSBocmVmPSJtYWlsdG86dXNlckB0aW1lem9uZWluZm8ub3JnP3N1YmplY3Q9T1RPQk8lMjBVc2VyRGVmYXVsdFRpbWVab25lJmFtcDtib2R5PVVUQyI+bWFpbCB0byB0aW1lem9uZWluZm88L2E+LgoKPWN1dAoKc3ViIF9GaXhNYWlsdG8gewogICAgbXkgKCAkU2VsZiwgJFBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIGZvciBtYWlsdG8gbGlua3MKICAgICMgc2luY2UgdGhlIHN1YmplY3QgYW5kIGJvZHkgb2YgdGhvc2UgbWFpbHRvIGxpbmtzIGFyZQogICAgIyB1cmkgZXNjYXBlZCB3ZSBoYXZlIHRvIHVyaSB1bmVzY2FwZSB0aGVtLCByZXBsYWNlCiAgICAjIHBvc3NpYmxlIHBsYWNlaG9sZGVycyBhbmQgdGhlbiByZS11cmkgZXNjYXBlIHRoZW0KICAgICRQYXJhbS0+e1RleHR9ID1+IHN7CiAgICAgICAgKGhyZWY9Im1haWx0bzpbXlw/XStcPykoW14iXSsiKQogICAgfQogICAgewogICAgICAgIG15ICRNYWlsVG9IcmVmICAgICAgICA9ICQxOwogICAgICAgIG15ICRNYWlsVG9IcmVmQ29udGVudCA9ICQyOwoKICAgICAgICAjIE5lc3RlZCBzLy8vZWd4IQogICAgICAgICRNYWlsVG9IcmVmQ29udGVudCA9fiBzewogICAgICAgICAgICAoKD86c3ViamVjdHxib2R5KT0pKC4rPykoInwmKQogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgIG15ICRTdWJqZWN0T3JCb2R5UHJlZml4ICA9ICQxOwogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnQgPSAkMjsKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlTdWZmaXggID0gJDM7CgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRVbmVzY2FwZWQgPSB1cmlfdW5lc2NhcGUoJFN1YmplY3RPckJvZHlDb250ZW50KTsKCiAgICAgICAgICAgICMgVE9ETzogYmV3YXJlIG9mIHJlY3Vyc2lvbgogICAgICAgICAgICBteSAkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZCA9ICRTZWxmLT5fUmVwbGFjZSgKICAgICAgICAgICAgICAgICRQYXJhbS0+JSosCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU3ViamVjdE9yQm9keUNvbnRlbnRVbmVzY2FwZWQsCiAgICAgICAgICAgICAgICBSaWNoVGV4dCA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJFN1YmplY3RPckJvZHlDb250ZW50RXNjYXBlZCA9IHVyaV9lc2NhcGVfdXRmOCgkU3ViamVjdE9yQm9keUNvbnRlbnRSZXBsYWNlZCk7CgogICAgICAgICAgICAkU3ViamVjdE9yQm9keVByZWZpeCAuICRTdWJqZWN0T3JCb2R5Q29udGVudEVzY2FwZWQgLiAkU3ViamVjdE9yQm9keVN1ZmZpeDsKICAgICAgICB9ZWd4OwoKICAgICAgICAkTWFpbFRvSHJlZiAuICRNYWlsVG9IcmVmQ29udGVudDsKICAgIH1lZ3g7CgogICAgIyBubyByZXR1cm4gdmFsdWUgbmVlZGVkIGFzICRSZWZUb1RleHQgaXMgbW9kaWZpZWQKICAgIHJldHVybjsKfQoKPWhlYWQyIF9GaW5kUmVjaXBpZW50VGltZVpvbmUoKQoKQSBoZWxwZXIgbWV0aG9kIHdoaWNoIGlzIHVzZWQgYnkgdGhlIGludGVybmFsIG1ldGhvZCBDPF9SZXBsYWNlKCk+LgoKPWN1dAoKc3ViIF9GaW5kUmVjaXBpZW50VGltZVpvbmUgewogICAgbXkgKCAkU2VsZiwgJEFkZFRpbWV6b25lSW5mbywgJFRpY2tldCwgJFJlY2lwaWVudCApID0gQF87CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICBteSAlQ3VzdG9tZXJVc2VyOwogICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkVGlja2V0KSAmJiAkVGlja2V0LT57Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRUaWNrZXQtPntDdXN0b21lclVzZXJJRH0gKTsKICAgIH0KCiAgICBteSAlVXNlclByZWZlcmVuY2VzOwoKICAgIGlmICggJEFkZFRpbWV6b25lSW5mby0+e05vdGlmaWNhdGlvbkV2ZW50fSApIHsKICAgICAgICBpZiAoICRSZWNpcGllbnQtPntUeXBlfSBlcSAnQWdlbnQnICkgewogICAgICAgICAgICAlVXNlclByZWZlcmVuY2VzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKS0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFJlY2lwaWVudC0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlY2lwaWVudC0+e1R5cGV9IGVxICdDdXN0b21lcicgJiYgJFJlY2lwaWVudC0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICVVc2VyUHJlZmVyZW5jZXMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUmVjaXBpZW50LT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoCiAgICAgICAgJEFkZFRpbWV6b25lSW5mby0+e0F1dG9SZXNwb25zZX0KICAgICAgICAmJiAkVGlja2V0LT57Q3VzdG9tZXJVc2VySUR9CiAgICAgICAgJiYgSXNIYXNoUmVmV2l0aERhdGEoIFwlQ3VzdG9tZXJVc2VyICkKICAgICAgICApCiAgICB7CiAgICAgICAgJVVzZXJQcmVmZXJlbmNlcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgICAgICBVc2VySUQgPT4gJFRpY2tldC0+e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgZmFsbCBiYWNrIHRvIHRoZSBPVE9CTyB0aW1lIHpvbmUKICAgIHJldHVybiAkVXNlclByZWZlcmVuY2Vze1VzZXJUaW1lWm9uZX0gaWYgJFVzZXJQcmVmZXJlbmNlc3tVc2VyVGltZVpvbmV9OwogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5PVE9CT1RpbWVab25lR2V0KCk7Cn0KCj1oZWFkMiBfUmVwbGFjZSgpCgpyZXBsYWNlIHRoZSBwbGFjZWhvbGRlcnMgaW4gdGhlIHRleHQKCj1jdXQKCnN1YiBfUmVwbGFjZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciBteSAkTmVlZGVkIChxdyhUZXh0IFJpY2hUZXh0IERhdGEgVXNlcklEKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGhhbmRsZSBtYWlsdG8sICRQYXJhbXtUZXh0fSB3aWxsIGJlIG1vZGlmaWVkCiAgICAkU2VsZi0+X0ZpeE1haWx0byggXCVQYXJhbSApOwoKICAgICMgVGFncyBsb29rIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gd2hhdCBraW5kIG9mIHRleHQgd2UncmUgd29ya2luZyB3aXRoCiAgICBteSAoICRTdGFydCwgJEVuZCApID0gKCAnPCcsICc+JyApOwogICAgaWYgKCAkUGFyYW17UmljaFRleHR9ICkgewogICAgICAgICggJFN0YXJ0LCAkRW5kICkgPSAoICcmbHQ7JywgJyZndDsnICk7CiAgICAgICAgJFBhcmFte1RleHR9ID1+IHMvW1xuXHJdLy9nOwogICAgfQoKICAgIG15ICVUaWNrZXQ7CiAgICBpZiAoICRQYXJhbXtUaWNrZXREYXRhfSApIHsKICAgICAgICAlVGlja2V0ID0gJFBhcmFte1RpY2tldERhdGF9LT4lKjsKICAgIH0KCiAgICAjIERldGVybWluZSByZWNpcGllbnQncyB0aW1lem9uZSBpZiBuZWVkZWQuCiAgICBteSAkUmVjaXBpZW50VGltZVpvbmU7CiAgICBpZiAoICRQYXJhbXtBZGRUaW1lem9uZUluZm99ICkgewogICAgICAgICRSZWNpcGllbnRUaW1lWm9uZSA9ICRTZWxmLT5fRmluZFJlY2lwaWVudFRpbWVab25lKCAkUGFyYW17QWRkVGltZXpvbmVJbmZvfSwgXCVUaWNrZXQsICRQYXJhbXtSZWNpcGllbnR9ICk7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIFJlcGxhY2UgVW5peCB0aW1lIGZvcm1hdCB0YWdzLgogICAgIyBJZiBsYW5ndWFnZSBpcyBkZWZpbmVkLCB0aGV5IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBjb3JyZWN0IGZvcm1hdCBpbiBiZWxvdyBJRiBzdGF0ZW1lbnQuCiAgICBmb3IgbXkgJFVuaXhGb3JtYXRUaW1lICgKICAgICAgICBxdyhSZWFsVGlsbFRpbWVOb3RVc2VkIEVzY2FsYXRpb25SZXNwb25zZVRpbWUgRXNjYWxhdGlvblVwZGF0ZVRpbWUgRXNjYWxhdGlvblNvbHV0aW9uVGltZSkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAkVGlja2V0eyRVbml4Rm9ybWF0VGltZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7JFVuaXhGb3JtYXRUaW1lfSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICAgICAgRXBvY2ggPT4gJFRpY2tldHskVW5peEZvcm1hdFRpbWV9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKS0+VG9TdHJpbmcoKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmFuc2xhdGUgdGlja2V0IHZhbHVlcyBpZiBuZWVkZWQKICAgIGlmICggJFBhcmFte0xhbmd1YWdlfSApIHsKCiAgICAgICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJFBhcmFte0xhbmd1YWdlfSwKICAgICAgICApOwoKICAgICAgICAjIFRyYW5zbGF0ZSB0aGUgZGlmZmVyZW50IHZhbHVlcy4KICAgICAgICBmb3IgbXkgJEZpZWxkIChxdyhUeXBlIFN0YXRlIFN0YXRlVHlwZSBMb2NrIFByaW9yaXR5KSkgewogICAgICAgICAgICAkVGlja2V0eyRGaWVsZH0gPSAkTGFuZ3VhZ2VPYmplY3QtPlRyYW5zbGF0ZSggJFRpY2tldHskRmllbGR9ICk7CiAgICAgICAgfQoKICAgICAgICAjIFRyYW5zZm9ybSB0aGUgZGF0ZSB2YWx1ZXMgZnJvbSB0aGUgdGlja2V0IGRhdGEgKGJ1dCBub3QgdGhlIGR5bmFtaWMgZmllbGQgdmFsdWVzKS4KICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJVRpY2tldCApIHsKICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgaWYgJEF0dHJpYnV0ZSA9fiBteyBcQSBEeW5hbWljRmllbGRfIH14bXM7CiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkVGlja2V0eyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgaWYgKCAkVGlja2V0eyRBdHRyaWJ1dGV9ID1+IG17XEEoXGRcZFxkXGQpLShcZFxkKS0oXGRcZClccyhcZFxkKTooXGRcZCk6KFxkXGQpXHp9eGkgKSB7CgogICAgICAgICAgICAgICAgIyBDaGFuZ2UgdGltZSB0byByZWNpcGllbnQncyB0aW1lem9uZSBpZiBuZWVkZWQKICAgICAgICAgICAgICAgICMgYW5kIGxhdGVyIGFwcGVuZCB0aW1lem9uZSBpbmZvcm1hdGlvbi4KICAgICAgICAgICAgICAgICMgRm9yIG1vcmUgaW5mb3JtYXRpb24sCiAgICAgICAgICAgICAgICAjIHNlZSBidWcjMTM4NjUgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM4NjUpCiAgICAgICAgICAgICAgICAjIGFuZCBidWcjMTQyNzAgKGh0dHBzOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQyNzApLgogICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRUaW1lWm9uZSkgewogICAgICAgICAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QtPlRvVGltZVpvbmUoIFRpbWVab25lID0+ICRSZWNpcGllbnRUaW1lWm9uZSApOwogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEF0dHJpYnV0ZX0gPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSA9ICRMYW5ndWFnZU9iamVjdC0+Rm9ybWF0VGltZVN0cmluZygKICAgICAgICAgICAgICAgICAgICAkVGlja2V0eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgICAgICdEYXRlRm9ybWF0JywKICAgICAgICAgICAgICAgICAgICAnTm9TZWNvbmRzJywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBBcHBlbmQgdGltZXpvbmUgaW5mb3JtYXRpb24gaWYgbmVlZGVkLgogICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRUaW1lWm9uZSkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXR7JEF0dHJpYnV0ZX0gLj0gIiAoJFJlY2lwaWVudFRpbWVab25lKSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRMb2NhbExheW91dE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPm5ldygKICAgICAgICAgICAgTGFuZyA9PiAkUGFyYW17TGFuZ3VhZ2V9LAogICAgICAgICk7CgogICAgICAgICMgQ29udmVydCB0YWdzIGluIHNlY29uZHMgdG8gbW9yZSByZWFkYWJsZSBhcHByb3ByaWF0ZSBmb3JtYXQgaWYgbGFuZ3VhZ2UgaXMgZGVmaW5lZC4KICAgICAgICBmb3IgbXkgJFRpbWVJblNlY29uZHMgKAogICAgICAgICAgICBxdyhVbnRpbFRpbWUgRXNjYWxhdGlvblRpbWVXb3JraW5nVGltZSBFc2NhbGF0aW9uVGltZSBGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIEZpcnN0UmVzcG9uc2VUaW1lIFVwZGF0ZVRpbWVXb3JraW5nVGltZQogICAgICAgICAgICBVcGRhdGVUaW1lIFNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIFNvbHV0aW9uVGltZSkKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKCAkVGlja2V0eyRUaW1lSW5TZWNvbmRzfSApIHsKICAgICAgICAgICAgICAgICRUaWNrZXR7JFRpbWVJblNlY29uZHN9ID0gJExvY2FsTGF5b3V0T2JqZWN0LT5DdXN0b21lckFnZSgKICAgICAgICAgICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0eyRUaW1lSW5TZWNvbmRzfSwKICAgICAgICAgICAgICAgICAgICBTcGFjZSA9PiAnICcKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJVF1ZXVlOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgJVF1ZXVlID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlF1ZXVlJyktPlF1ZXVlR2V0KAogICAgICAgICAgICBJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIFJlcGxhY2UgY29uZmlnIG9wdGlvbnMuCiAgICBteSAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0NPTkZJR18nOwogICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgJFRhZwogICAgICAgICAgICAjIHRoZSBrZXkgZm9yIHRoZSBjb25maWcKICAgICAgICAgICAgKD88a2V5Pi4rPykKICAgICAgICAkRW5kCiAgICB9CiAgICB7CiAgICAgICAgbXkgJEtleSAgID0gJCt7a2V5fTsKICAgICAgICBteSAkVmFsdWUgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJEtleSkgLy8gJyc7CgogICAgICAgICMgTWFzayBzZW5zaXRpdmUgY29uZmlnIG9wdGlvbnMuCiAgICAgICAgbXkgJFJlcGxhY2UgPSAkU2VsZi0+X01hc2tTZW5zaXRpdmVWYWx1ZSgKICAgICAgICAgICAgS2V5ICAgICAgPT4gJEtleSwKICAgICAgICAgICAgVmFsdWUgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBJc0NvbmZpZyA9PiAxLAogICAgICAgICk7CgogICAgICAgICRSZXBsYWNlOwogICAgfWVneDsKCiAgICAjIGNsZWFudXAKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWcuKz8kRW5kLy0vZ2k7CgogICAgbXkgJVJlY2lwaWVudCA9ICV7ICRQYXJhbXtSZWNpcGllbnR9IHx8IHt9IH07CgogICAgIyBnZXQgdXNlciBvYmplY3QKICAgIG15ICRVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlVzZXInKTsKCiAgICBpZiAoICElUmVjaXBpZW50ICYmICRQYXJhbXtSZWNpcGllbnRJRH0gKSB7CgogICAgICAgICVSZWNpcGllbnQgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1JlY2lwaWVudElEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBtb2RpZnkgJFBhcmFte1RleHR9CiAgICBteSAkSGFzaEdsb2JhbFJlcGxhY2UgPSBzdWIgewogICAgICAgIG15ICggJFRhZywgJUggKSA9IEBfOwoKICAgICAgICAjIEdlbmVyYXRlIG9uZSBzaW5nbGUgbWF0Y2hpbmcgc3RyaW5nIGZvciBhbGwga2V5cyB0byBzYXZlIHBlcmZvcm1hbmNlLgogICAgICAgIG15ICRLZXlzID0gam9pbiAnfCcsIG1hcCB7cXVvdGVtZXRhfSBncmVwIHsgZGVmaW5lZCAkSHskX30gfSBrZXlzICVIOwoKICAgICAgICAjIFNldCBhbGwga2V5cyBhcyBsb3dlcmNhc2UgdG8gYmUgYWJsZSB0byBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlLAogICAgICAgICMgICBlLiBnLiA8T1RPQk9fQ1VTVE9NRVJfRnJvbT4gYW5kIDxPVE9CT19DVVNUT01FUl9GUk9NPi4KICAgICAgICAjICAgQWxzbyBtYXNrIGFueSB2YWx1ZXMgY29udGFpbmluZyBzZW5zaXRpdmUgZGF0YS4KICAgICAgICAlSCA9IG1hcCB7CiAgICAgICAgICAgIGxjICRfID0+ICRTZWxmLT5fTWFza1NlbnNpdGl2ZVZhbHVlKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJF8sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkSHskX30sCiAgICAgICAgICAgICkKICAgICAgICB9IHNvcnQga2V5cyAlSDsKCiAgICAgICAgIyBJZiB0YWcgaXMgJ09UT0JPX0NVU1RPTUVSXycgYWRkIHRoZSBib2R5IGFsaWFzICdlbWFpbC9ub3RlJyB0byBiZSByZXBsYWNlZC4KICAgICAgICBpZiAoICRUYWcgPX4gbS9PVE9CT18oQ1VTVE9NRVJ8QUdFTlQpXy8gKSB7CiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KCBlbWFpbCBub3RlICkpIHsKICAgICAgICAgICAgICAgIG15ICRWYWx1ZSA9ICRIeyRLZXl9OwoKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmIGRlZmluZWQoJFZhbHVlKTsKCiAgICAgICAgICAgICAgICAkSHskS2V5fSA9ICRIeydib2R5J307CiAgICAgICAgICAgICAgICAkS2V5cyAuPSAnfCcgLiB1Y2ZpcnN0ICRLZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzewogICAgICAgICAgICAjIGdyb3VwaW5nIHJlcXVpcmVkIGhlcmUsIGFzIHdlIG1pZ2h0IGhhdmUgYWx0ZXJuYXRpb25zCiAgICAgICAgICAgICg/OiRUYWcpCiAgICAgICAgICAgICAgICAjIGNhc2UgaW5zZW5zaXRpdiBrZXlzCiAgICAgICAgICAgICAgICAoPzxrZXk+JEtleXMpCiAgICAgICAgICAgICRFbmQKICAgICAgICB9CiAgICAgICAgewogICAgICAgICAgICBteSAkS2V5ID0gJCt7a2V5fTsKICAgICAgICAgICAgJEh7IGxjICRLZXkgfQogICAgICAgIH14aWVnOwogICAgfTsKCiAgICAjIGdldCByZWNpcGllbnQgZGF0YSBhbmQgcmVwbGFjZSBpdCB3aXRoIDxPVE9CT18uLi4KICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fJzsKCiAgICAjIGluY2x1ZGUgbW9yZSByZWFkYWJsZSB0YWcgPE9UT0JPX05PVElGSUNBVElPTl9SRUNJUElFTlQKICAgIG15ICRSZWNpcGllbnRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fTk9USUZJQ0FUSU9OX1JFQ0lQSUVOVF8nOwoKICAgIGlmICglUmVjaXBpZW50KSB7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgIEFUVFJJQlVURToKICAgICAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKCBzb3J0IGtleXMgJVJlY2lwaWVudCApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkUmVjaXBpZW50eyRBdHRyaWJ1dGV9OwogICAgICAgICAgICAgICAgJFJlY2lwaWVudHskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVjaXBpZW50eyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRSZWNpcGllbnRUYWciLCAlUmVjaXBpZW50ICk7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kUmVjaXBpZW50VGFnLis/JEVuZC8tL2dpOwoKICAgICMgZ2V0IG93bmVyIGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fT1dORVJfLi4uCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX09XTkVSXyc7CgogICAgIyBpbmNsdWRlIG1vcmUgcmVhZGFibGUgdmVyc2lvbiA8T1RPQk9fVElDS0VUX09XTkVSCiAgICBteSAkT3duZXJUYWcgPSAkU3RhcnQgLiAnT1RPQk9fVElDS0VUX09XTkVSXyc7CgogICAgaWYgKCAkVGlja2V0e093bmVySUR9ICkgewoKICAgICAgICBteSAlT3duZXIgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFRpY2tldHtPd25lcklEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgaHRtbCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVPd25lciApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkT3duZXJ7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkT3duZXJ7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJE93bmVyeyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRPd25lclRhZyIsICVPd25lciApOwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRPd25lclRhZy4rPyRFbmQvLS9naTsKCiAgICAjIGdldCBvd25lciBkYXRhIGFuZCByZXBsYWNlIGl0IHdpdGggPE9UT0JPX1JFU1BPTlNJQkxFXy4uLgogICAgJFRhZyA9ICRTdGFydCAuICdPVE9CT19SRVNQT05TSUJMRV8nOwoKICAgICMgaW5jbHVkZSBtb3JlIHJlYWRhYmxlIHZlcnNpb24gPE9UT0JPX1RJQ0tFVF9SRVNQT05TSUJMRQogICAgbXkgJFJlc3BvbnNpYmxlVGFnID0gJFN0YXJ0IC4gJ09UT0JPX1RJQ0tFVF9SRVNQT05TSUJMRV8nOwoKICAgIGlmICggJFRpY2tldHtSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICBteSAlUmVzcG9uc2libGUgPSAkVXNlck9iamVjdC0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVSZXNwb25zaWJsZSApIHsKICAgICAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkUmVzcG9uc2libGV7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICAgICAkUmVzcG9uc2libGV7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFJlc3BvbnNpYmxleyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRSZXNwb25zaWJsZVRhZyIsICVSZXNwb25zaWJsZSApOwogICAgfQoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZy4rPyRFbmQvLS9naTsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRSZXNwb25zaWJsZVRhZy4rPyRFbmQvLS9naTsKCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0FnZW50Xyc7CiAgICBteSAkVGFnMiAgICAgICAgPSAkU3RhcnQgLiAnT1RPQk9fQ1VSUkVOVF8nOwogICAgbXkgJUN1cnJlbnRVc2VyID0gJFVzZXJPYmplY3QtPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgTm9PdXRPZk9mZmljZSA9PiAxLAogICAgKTsKCiAgICAjIEhUTUwgcXVvdGluZyBvZiBjb250ZW50CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlQ3VycmVudFVzZXIgKSB7CiAgICAgICAgICAgIG5leHQgQVRUUklCVVRFIGlmICEkQ3VycmVudFVzZXJ7JEF0dHJpYnV0ZX07CiAgICAgICAgICAgICRDdXJyZW50VXNlcnskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRDdXJyZW50VXNlcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICIkVGFnfCRUYWcyIiwgJUN1cnJlbnRVc2VyICk7CgogICAgIyByZXBsYWNlIG90aGVyIG5lZWRlZCBzdHVmZgogICAgJFBhcmFte1RleHR9ID1+IHMvJFN0YXJ0IE9UT0JPX0ZJUlNUX05BTUUgJEVuZC8kQ3VycmVudFVzZXJ7VXNlckZpcnN0bmFtZX0vZ3htczsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19MQVNUX05BTUUgJEVuZC8kQ3VycmVudFVzZXJ7VXNlckxhc3RuYW1lfS9neG1zOwoKICAgICMgY2xlYW51cAogICAgJFBhcmFte1RleHR9ID1+IHMvJFRhZzIuKz8kRW5kLy0vZ2k7CgojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAjIFJlcGxhY2UgY29uZmlnIG9wdGlvbnMuCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX09UQUN1c3RvbWVyVGlja2V0TGluayc7CiAgICAkUGFyYW17VGV4dH0gPX4gc3skVGFnJEVuZH17CiAgICAgICAgbXkgJFJlcGxhY2UgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpPbmVUaW1lQXV0aExpbmsnKS0+VGlja2V0TGluaygKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgVXNlciAgICAgICAgID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRSZXBsYWNlOwogICAgfWVneDsKIyBFTyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCgogICAgIyB0aWNrZXQgZGF0YQogICAgJFRhZyA9ICRTdGFydCAuICdPVE9CT19USUNLRVRfJzsKCiAgICAjIGh0bWwgcXVvdGluZyBvZiBjb250ZW50CiAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgIEFUVFJJQlVURToKICAgICAgICBmb3IgbXkgJEF0dHJpYnV0ZSAoIHNvcnQga2V5cyAlVGlja2V0ICkgewogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJFRpY2tldHskQXR0cmlidXRlfTsKICAgICAgICAgICAgJFRpY2tldHskQXR0cmlidXRlfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpIVE1MVXRpbHMnKS0+VG9IVE1MKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7JEF0dHJpYnV0ZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgRHJvcGRvd24sIENoZWNrYm94IGFuZCBNdWx0aVNlbGVjdCBEeW5hbWljRmllbGRzLCBjYW4gc3RvcmUgdmFsdWVzIChrZXlzKSB0aGF0IGFyZQogICAgIyBkaWZmZXJlbnQgZnJvbSB0aGUgdmFsdWVzIHRvIGRpc3BsYXkKICAgICMgPE9UT0JPX1RJQ0tFVF9EeW5hbWljRmllbGRfTmFtZVg+IHJldHVybnMgdGhlIHN0b3JlZCBrZXkKICAgICMgPE9UT0JPX1RJQ0tFVF9EeW5hbWljRmllbGRfTmFtZVhfVmFsdWU+IHJldHVybnMgdGhlIGRpc3BsYXkgdmFsdWUKCiAgICBteSAlRHluYW1pY0ZpZWxkczsKCiAgICAjIEZvciBzeXN0ZW1zIHdpdGggbWFueSBEeW5hbWljIGZpZWxkcyB3ZSBkbyBub3Qgd2FudCB0byBsb2FkIHRoZW0gYWxsIHVubGVzcyBuZWVkZWQKICAgICMgRmluZCB3aGF0IER5bmFtaWMgRmllbGQgVmFsdWVzIGFyZSByZXF1ZXN0ZWQKICAgIHdoaWxlICggJFBhcmFte1RleHR9ID1+IG0vJFRhZyBEeW5hbWljRmllbGRfKFxTKz8pKF9WYWx1ZSk/ICRFbmQvZ2l4bXMgKSB7CiAgICAgICAgJER5bmFtaWNGaWVsZHN7JDF9ID0gMTsKICAgIH0KCiAgICAjIHRvIHN0b3JlIGFsbCB0aGUgcmVxdWlyZWQgRHluYW1pY0ZpZWxkIGRpc3BsYXkgdmFsdWVzCiAgICBteSAlRHluYW1pY0ZpZWxkRGlzcGxheVZhbHVlczsKCiAgICAjIGdldCBkeW5hbWljIGZpZWxkIG9iamVjdHMKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBnZXQgdGhlIGR5bmFtaWMgZmllbGRzIGZvciB0aWNrZXQgb2JqZWN0CiAgICBteSAkRHluYW1pY0ZpZWxkTGlzdCA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgIE9iamVjdFR5cGUgPT4gWydUaWNrZXQnXSwKICAgICkgfHwgW107CgogICAgIyBjeWNsZSB0aHJvdWdoIHRoZSBhY3RpdmF0ZWQgRHluYW1pYyBGaWVsZHMgZm9yIHRoaXMgc2NyZWVuCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZENvbmZpZyAoIEB7JER5bmFtaWNGaWVsZExpc3R9ICkgewoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZyk7CgogICAgICAgICMgd2Ugb25seSBsb2FkIHRoZSBvbmVzIHJlcXVlc3RlZAogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICEkRHluYW1pY0ZpZWxkc3sgJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH07CgogICAgICAgIG15ICRMYW5ndWFnZU9iamVjdDsKCiAgICAgICAgIyB0cmFuc2xhdGUgdmFsdWVzIGlmIG5lZWRlZAogICAgICAgIGlmICggJFBhcmFte0xhbmd1YWdlfSApIHsKICAgICAgICAgICAgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgICAgICAgICAgVXNlckxhbmd1YWdlID0+ICRQYXJhbXtMYW5ndWFnZX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3Q7CgogICAgICAgICMgQ2hhbmdlIERhdGVUaW1lIERGIHZhbHVlIGZvciB0aWNrZXQgaWYgbmVlZGVkLgogICAgICAgIGlmICgKICAgICAgICAgICAgZGVmaW5lZCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAmJiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57RmllbGRUeXBlfSBlcSAnRGF0ZVRpbWUnCiAgICAgICAgICAgICYmICRSZWNpcGllbnRUaW1lWm9uZQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICBPYmplY3RQYXJhbXMgPT4gewogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICREYXRlVGltZU9iamVjdC0+VG9UaW1lWm9uZSggVGltZVpvbmUgPT4gJFJlY2lwaWVudFRpbWVab25lICk7CiAgICAgICAgICAgICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGhlIGRpc3BsYXkgdmFsdWUgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgIG15ICREaXNwbGF5VmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBLZXkgICAgICAgICAgICAgICAgPT4gJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0sCiAgICAgICAgICAgIExhbmd1YWdlT2JqZWN0ICAgICA9PiAkTGFuZ3VhZ2VPYmplY3QsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdGhlIHJlYWRhYmxlIHZhbHVlICh2YWx1ZSkgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgIG15ICREaXNwbGF5VmFsdWVTdHJnID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlJlYWRhYmxlVmFsdWVSZW5kZXIoCiAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJERpc3BsYXlWYWx1ZSwKICAgICAgICApOwoKICAgICAgICAjIGZpbGwgdGhlIER5bmFtaWNGaWVsZERpc3BsYXlWYWx1ZXMKICAgICAgICBpZiAoJERpc3BsYXlWYWx1ZVN0cmcpIHsKICAgICAgICAgICAgJER5bmFtaWNGaWVsZERpc3BsYXlWYWx1ZXN7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSAuICdfVmFsdWUnIH0gPSAkRGlzcGxheVZhbHVlU3RyZy0+e1ZhbHVlfTsKCiAgICAgICAgICAgICMgQWRkIHRpbWV6b25lIGluZm8gaWYgbmVlZGVkLgogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICBkZWZpbmVkICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9CiAgICAgICAgICAgICAgICAmJiBsZW5ndGggJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICYmICREeW5hbWljRmllbGRDb25maWctPntGaWVsZFR5cGV9IGVxICdEYXRlVGltZScKICAgICAgICAgICAgICAgICYmICRSZWNpcGllbnRUaW1lWm9uZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRHluYW1pY0ZpZWxkRGlzcGxheVZhbHVlc3sgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IC4gJ19WYWx1ZScgfQogICAgICAgICAgICAgICAgICAgIC49ICIgKCRSZWNpcGllbnRUaW1lWm9uZSkiOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aGUgcmVhZGFibGUgdmFsdWUgKGtleSkgZm9yIGVhY2ggZHluYW1pYyBmaWVsZAogICAgICAgIG15ICRWYWx1ZVN0cmcgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfSwKICAgICAgICApOwoKICAgICAgICAjIHJlcGxhY2UgdGlja2V0IGNvbnRlbnQgd2l0aCB0aGUgdmFsdWUgZnJvbSBSZWFkYWJsZVZhbHVlUmVuZGVyIChpZiBhbnkpCiAgICAgICAgaWYgKCBJc0hhc2hSZWZXaXRoRGF0YSgkVmFsdWVTdHJnKSApIHsKICAgICAgICAgICAgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0gPSAkVmFsdWVTdHJnLT57VmFsdWV9OwoKICAgICAgICAgICAgIyBBZGQgdGltZXpvbmUgaW5mbyBpZiBuZWVkZWQuCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIGRlZmluZWQgJFRpY2tldHsgJ0R5bmFtaWNGaWVsZF8nIC4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9IH0KICAgICAgICAgICAgICAgICYmIGxlbmd0aCAkVGlja2V0eyAnRHluYW1pY0ZpZWxkXycgLiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0gfQogICAgICAgICAgICAgICAgJiYgJER5bmFtaWNGaWVsZENvbmZpZy0+e0ZpZWxkVHlwZX0gZXEgJ0RhdGVUaW1lJwogICAgICAgICAgICAgICAgJiYgJFJlY2lwaWVudFRpbWVab25lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXR7ICdEeW5hbWljRmllbGRfJyAuICREeW5hbWljRmllbGRDb25maWctPntOYW1lfSB9IC49ICIgKCRSZWNpcGllbnRUaW1lWm9uZSkiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpdAogICAgJEhhc2hHbG9iYWxSZXBsYWNlLT4oICRUYWcsICVUaWNrZXQsICVEeW5hbWljRmllbGREaXNwbGF5VmFsdWVzICk7CgogICAgIyBDT01QQVQKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19USUNLRVRfSUQgJEVuZC8kVGlja2V0e1RpY2tldElEfS9naXhtczsKICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19USUNLRVRfTlVNQkVSICRFbmQvJFRpY2tldHtUaWNrZXROdW1iZXJ9L2dpeG1zOwogICAgaWYgKCAkVGlja2V0e1RpY2tldElEfSApIHsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8kU3RhcnQgT1RPQk9fUVVFVUUgJEVuZC8kVGlja2V0e1F1ZXVlfS9naXhtczsKICAgIH0KICAgIGlmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyRTdGFydCBPVE9CT19USUNLRVRfUVVFVUUgJEVuZC8kUXVldWV7TmFtZX0vZ2l4bXM7CiAgICB9CgogICAgIyBjbGVhbnVwCiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgICMgRm9sbG93LXVwIGZvciBidWcjMTA4MjUuCiAgICAjIFNldCBkYXRhIGZvciByZXBsYWNpbmcgb2Ygc3BlY2lmaWMgdGFncyBpbiBUZW1wbGF0ZXM6CiAgICAjIC0gT1RPQk9fQUdFTlRfU1VCSkVDVCwgT1RPQk9fQUdFTlRfQk9EWSAtIHN1YmplY3QvYm9keSBvZiB0aGUgQ1VSUkVOVC9MQVRFU1QgYWdlbnQgYXJ0aWNsZQogICAgIyAtIE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1QsIE9UT0JPX0NVU1RPTUVSX0JPRFkgLSBzdWJqZWN0L2JvZHkgb2YgdGhlIENVUlJFTlQvTEFURVNUIGN1c3RvbWVyIGFydGljbGUKICAgICMgLSBPVE9CT19BR0VOVF9TVUJKRUNUW25dICAgIC0gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBzdWJqZWN0IG9mIHRoZSBDVVJSRU5UL0xBVEVTVCBhZ2VudCBhcnRpY2xlCiAgICAjIC0gT1RPQk9fQUdFTlRfQk9EWVtuXSAgICAgICAtIGZpcnN0IG4gbGluZXMgb2YgdGhlIGJvZHkgb2YgdGhlIENVUlJFTlQvTEFURVNUIGFnZW50IGFydGljbGUKICAgICMgLSBPVE9CT19DVVNUT01FUl9TVUJKRUNUW25dIC0gZmlyc3QgbiBjaGFyYWN0ZXJzIG9mIHRoZSBzdWJqZWN0IG9mIHRoZSBDVVJSRU5UL0xBVEVTVCBjdXN0b21lciBhcnRpY2xlCiAgICAjIC0gT1RPQk9fQ1VTVE9NRVJfQk9EWVtuXSAgICAtIGZpcnN0IG4gbGluZXMgb2YgdGhlIGJvZHkgb2YgdGhlIENVUlJFTlQvTEFURVNUIGN1c3RvbWVyIGFydGljbGUKICAgICMKICAgICMgRm9yIE5vdGUgdGVtcGxhdGUgd2UgbmVlZCB0aGUgbGFzdCBhcnRpY2xlLgogICAgIyBGb3IgQW5zd2VyLCAkUGFyYW17RGF0YX0gaGFzIHNlbGVjdGVkIG9yIGxhc3QgYXJ0aWNsZSBkYXRhLCBkZXBlbmRzIHdoZXRoZXIgQXJ0aWNsZUlEIGlzIHNlbnQgb3Igbm90LgogICAgIyBGb3IgRm9yd2FyZCwgJFBhcmFte0RhdGF9IGhhcyB0aGUgZm9sbG93aW5nIGFydGljbGUgZGF0YToKICAgICMgLSBpZiBBcnRpY2xlSUQgaXMgc2VudCwgZGF0YSBpcyBmcm9tIHNlbGVjdGVkIGFydGljbGUuCiAgICAjIC0gaWYgQXJ0aWNsZUlEIGlzIG5vdCBzZW50LCBkYXRhIGlzIGZyb20gbGFzdCBjdXN0b21lci9hZ2VudC9hbnkgYXJ0aWNsZS4KICAgIGlmICggJFBhcmFte1RlbXBsYXRlfSAmJiAkVGlja2V0e1RpY2tldElEfSApIHsKICAgICAgICBteSAkQXJ0aWNsZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkFydGljbGUnKTsKCiAgICAgICAgaWYgKCAkUGFyYW17VGVtcGxhdGV9IGVxICdOb3RlJyApIHsKCiAgICAgICAgICAgICMgR2V0IGxhc3QgYXJ0aWNsZSBmcm9tIGFnZW50LgogICAgICAgICAgICBteSBAQWdlbnRBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKEBBZ2VudEFydGljbGVzKSB7CiAgICAgICAgICAgICAgICBteSAlQWdlbnRBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkQWdlbnRBcnRpY2xlc1swXSB9ICktPkFydGljbGVHZXQoCiAgICAgICAgICAgICAgICAgICAgJXsgJEFnZW50QXJ0aWNsZXNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhQWdlbnR9LT57U3ViamVjdH0gPSAkQWdlbnRBcnRpY2xle1N1YmplY3R9OwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGFBZ2VudH0tPntCb2R5fSAgICA9ICRBZ2VudEFydGljbGV7Qm9keX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IGxhc3QgYXJ0aWNsZSBmcm9tIGN1c3RvbWVyLgogICAgICAgICAgICBteSBAQ3VzdG9tZXJBcnRpY2xlcyA9ICRBcnRpY2xlT2JqZWN0LT5BcnRpY2xlTGlzdCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgICAgICAgICAgT25seUxhc3QgICA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKEBDdXN0b21lckFydGljbGVzKSB7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJBcnRpY2xlID0gJEFydGljbGVPYmplY3QtPkJhY2tlbmRGb3JBcnRpY2xlKCAleyAkQ3VzdG9tZXJBcnRpY2xlc1swXSB9ICktPkFydGljbGVHZXQoCiAgICAgICAgICAgICAgICAgICAgJXsgJEN1c3RvbWVyQXJ0aWNsZXNbMF0gfSwKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRzID0+IDAsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e1N1YmplY3R9ID0gJEN1c3RvbWVyQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0JvZHl9ICAgID0gJEN1c3RvbWVyQXJ0aWNsZXtCb2R5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRQYXJhbXtUZW1wbGF0ZX0gZXEgJ0Fuc3dlcicgfHwgJFBhcmFte1RlbXBsYXRlfSBlcSAnRm9yd2FyZCcgKSB7CgogICAgICAgICAgICAjIElmICRQYXJhbXtEYXRhfSBoYXMgYWdlbnQgYXJ0aWNsZSBkYXRhLCB3ZSB3aWxsIHNldCBzdWJqZWN0IGFuZCBib2R5IGluICRQYXJhbXtEYXRhQWdlbnR9CiAgICAgICAgICAgICMgdG8gdmFsdWVzIGZyb20gJFBhcmFte0RhdGF9IGluIG9yZGVyIHRvIHJpZ2h0IHJlcGxhY2luZyBvZiBPVE9CT19BR0VOVF9TVUJKRUNUL0JPRFkgdGFncy4KICAgICAgICAgICAgaWYgKCAkUGFyYW17RGF0YX0tPntTZW5kZXJUeXBlfSAmJiAkUGFyYW17RGF0YX0tPntTZW5kZXJUeXBlfSBlcSAnYWdlbnQnICkgewogICAgICAgICAgICAgICAgJFBhcmFte0RhdGFBZ2VudH0tPntTdWJqZWN0fSA9ICRQYXJhbXtEYXRhfS0+e1N1YmplY3R9OwogICAgICAgICAgICAgICAgJFBhcmFte0RhdGFBZ2VudH0tPntCb2R5fSAgICA9ICRQYXJhbXtEYXRhfS0+e0JvZHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGFuZCBhZ2VudCBwYXJhbXMgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fQ1VTVE9NRVJfLi4uIG9yIDxPVE9CT19BR0VOVF8uLi4KICAgIG15ICVBcnRpY2xlRGF0YSA9ICgKICAgICAgICAnT1RPQk9fQ1VTVE9NRVJfJyA9PiAkUGFyYW17RGF0YX0gICAgICB8fCB7fSwKICAgICAgICAnT1RPQk9fQUdFTlRfJyAgICA9PiAkUGFyYW17RGF0YUFnZW50fSB8fCB7fSwKICAgICk7CgogICAgIyB1c2UgYSBsaXN0IHRvIGdldCBjdXN0b21lciBmaXJzdAogICAgZm9yIG15ICREYXRhVHlwZSAocXcoT1RPQk9fQ1VTVE9NRVJfIE9UT0JPX0FHRU5UXykpIHsKICAgICAgICBteSAlRGF0YSA9ICV7ICRBcnRpY2xlRGF0YXskRGF0YVR5cGV9IH07CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVEYXRhICkgewogICAgICAgICAgICAgICAgbmV4dCBBVFRSSUJVVEUgdW5sZXNzICREYXRheyRBdHRyaWJ1dGV9OwoKICAgICAgICAgICAgICAgICREYXRheyRBdHRyaWJ1dGV9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscycpLT5Ub0hUTUwoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICREYXRheyRBdHRyaWJ1dGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCVEYXRhKSB7CgogICAgICAgICAgICAjIHJlcGxhY2UgPE9UT0JPX0NVU1RPTUVSXyo+IGFuZCA8T1RPQk9fQUdFTlRfKj4gdGFncwogICAgICAgICAgICAkVGFnID0gJFN0YXJ0IC4gJERhdGFUeXBlOwogICAgICAgICAgICAkSGFzaEdsb2JhbFJlcGxhY2UtPiggJFRhZywgJURhdGEgKTsKCiAgICAgICAgICAgICMgcHJlcGFyZSBib2R5IChpbnNlcnQgb2xkIGVtYWlsKSA8T1RPQk9fQ1VTVE9NRVJfRU1BSUxbbl0+LCA8T1RPQk9fQ1VTVE9NRVJfTk9URVtuXT4KICAgICAgICAgICAgIyAgIDxPVE9CT19DVVNUT01FUl9CT0RZW25dPiwgPE9UT0JPX0FHRU5UX0VNQUlMW25dPi4uLiwgPE9UT0JPX0NPTU1FTlQ+CgogICAgICAgICAgICAjIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgbnVtYmVyIG9mIGluY2x1ZGVkIGxpbmVzIGNhbiBiZSBzcGVjaWZpZWQuCiAgICAgICAgICAgICMgVGhlIHNhbWUga2V5IGNhbiBvY2N1ciBtdWx0aXBsZSB0aW1lcywgcG9zc2libHkgd2l0aCBhIGRpZmZlcmVudCBudW1iZXIgb2YgbGluZXMuCiAgICAgICAgICAgICMgVGhlIGxhc3QgY3VzdG9tZXIgbWFpbCBpcyB1c2VkIGZvciA8T1RPQk9fQ09NTUVOVD4gb3IgPE9UT0JPX0NPTU1FTlRbMTIzXT4KICAgICAgICAgICAgIyBhcyB0aGUgbG9vcCByZXBsYWNlcyB0aGUgY3VzdG9tZXIgbWFpbCBmaXJzdC4KICAgICAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgICAgICAgICAkU3RhcnQKICAgICAgICAgICAgICAgICAgICAoPzoKICAgICAgICAgICAgICAgICAgICAgICAgIyBlLmcuIE9UT0JPX0NPTU1FTlRbMTNdLCBPVE9CT19BR0VOVF9CT0RZWzNdLCBPVE9CT19DVVNUT01FUl9CT0RZWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKD86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1RPQk9fQ09NTUVOVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0RhdGFUeXBlfSg/OkVNQUlMfE5PVEV8Qk9EWSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxbKD88Y250Pi4rPylcXQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgIyBhIHNwZWNpYWwgY2FzZSBhcyBPVE9CT19DT01NRU5UIHdpdGhvdXQgcXVhbnRpZmllciBpcyBoYW5kbGVkIG5vd2hlcmUgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBPVE9CT19DT01NRU5UCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgJEVuZAogICAgICAgICAgICB9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICMgZm9yIDxPVE9CT19DT01NRU5UPiB0cnVuY2F0ZSBwZXIgZGVmYXVsdCBhIGxvbmcgbWFpbCBhdCAyNTAwCiAgICAgICAgICAgICAgICAjIDxPVE9CT19DVVNUT01FUl9CT0RZWzBdIHdvdWxkIGFsc28geWllbGQgMjUwMCBsaW5lcwogICAgICAgICAgICAgICAgbXkgJE51bUhlYWRMaW5lcyA9ICQre2NudH0gfHwgMjUwMDsKCiAgICAgICAgICAgICAgICBteSAkTmV3T2xkQm9keSAgID0gJyc7CiAgICAgICAgICAgICAgICBteSBAQm9keSAgICAgICAgID0gc3BsaXQgL1xuLywgJERhdGF7Qm9keX07CiAgICAgICAgICAgICAgICBteSAkTnVtQm9keUxpbmVzID0gc2NhbGFyIEBCb2R5OwoKICAgICAgICAgICAgICAgIENPVU5URVI6CiAgICAgICAgICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAwIC4uICROdW1IZWFkTGluZXMgLSAxICkgewoKICAgICAgICAgICAgICAgICAgICAjIGRvIG5vdCBnbyBiZXlvbmQgdGhlIGNvbXBsZXRlIGJvZHkKICAgICAgICAgICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgJENvdW50ZXIgPj0gJE51bUJvZHlMaW5lczsKCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgbm8gcXVvdGUgY2hhciwgZG8gaXQgbGF0ZXIgYnkgdXNpbmcgRG9jdW1lbnRDbGVhbnVwKCkKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5IC49ICRCb2R5WyRDb3VudGVyXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgYWRkICI+ICIgYXMgcXVvdGUgY2hhcgogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSAuPSAiPiAkQm9keVskQ291bnRlcl0iOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgbmV3IGxpbmUsIHVubGVzcyB3ZSBhcmUgYXQgdGhlIGxhc3QgaW5jbHVkZWQgbGluZQogICAgICAgICAgICAgICAgICAgICMgbm90IHN1cmUgd2h5IHRoZSBsYXN0IGxpbmUgaGFzIGEgbmV3bGluZSB3aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICMgdGhlIGJvZHkgaGFzIGxlc3MgbGluZXMgdGhhbiB0aGUgc3BlY2lmaWVkIGxpbmUgY291bnQKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb3VudGVyIDwgKCAkTnVtSGVhZExpbmVzIC0gMSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSAuPSAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaG9tcCAkTmV3T2xkQm9keTsKCiAgICAgICAgICAgICAgICAjIEhUTUwgcXVvdGluZyBvZiBjb250ZW50CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gJiYgJE5ld09sZEJvZHkgKSB7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIG5ldyBsaW5lcwogICAgICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMTAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROZXdPbGRCb2R5ID1+IHMvKDxiclwvPilcc3swLDIwfSQvL2dzOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBhZGQgcXVvdGUKICAgICAgICAgICAgICAgICAgICAkTmV3T2xkQm9keSA9ICI8YmxvY2txdW90ZSB0eXBlPVwiY2l0ZVwiPiROZXdPbGRCb2R5PC9ibG9ja3F1b3RlPiI7CiAgICAgICAgICAgICAgICAgICAgJE5ld09sZEJvZHkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPkRvY3VtZW50Q2xlYW51cCgKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICROZXdPbGRCb2R5LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB0aGUgcmVwbGFjZW1lbnQKICAgICAgICAgICAgICAgICROZXdPbGRCb2R5CiAgICAgICAgICAgIH14ZWc7ICAgICMgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBtYWNyb3MgaW4gJFBhcmFte1RleHR9CgogICAgICAgICAgICAjIHJlcGxhY2UgPE9UT0JPX0NVU1RPTUVSX1NVQkpFQ1RbXT4gIGFuZCAgPE9UT0JPX0FHRU5UX1NVQkpFQ1RbXT4gdGFncwogICAgICAgICAgICAkVGFnID0gIiRTdGFydCREYXRhVHlwZSIgLiAnU1VCSkVDVCc7CiAgICAgICAgICAgIGlmICggJFBhcmFte1RleHR9ID1+IC8kVGFnXFsoLis/KVxdJEVuZC9nICkgewoKICAgICAgICAgICAgICAgIG15ICRTdWJqZWN0Q2hhciA9ICQxOwogICAgICAgICAgICAgICAgbXkgJFN1YmplY3QgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcpLT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJERhdGF7U3ViamVjdH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTdWJqZWN0ID1+IHMvXigueyRTdWJqZWN0Q2hhcn0pLiokLyQxIFsuLi5dLzsKICAgICAgICAgICAgICAgICRQYXJhbXtUZXh0fSA9fiBzLyRUYWdcWy4rP1xdJEVuZC8kU3ViamVjdC9nOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICREYXRhVHlwZSBlcSAnT1RPQk9fQ1VTVE9NRVJfJyApIHsKCiAgICAgICAgICAgICAgICAjIEdldCA8T1RPQk9fRU1BSUxfREFURVtdPiBmcm9tIGJvZHkgYW5kIHJlcGxhY2Ugd2l0aCByZWNlaXZlZCBkYXRlLgogICAgICAgICAgICAgICAgIyBUT0RPOiBDbGFyaWZ5LCBhcyBpdCByYXRoZXIgbG9va3MgbGlrZSB0aGUgY3VycmVudCBkYXRlIGlzIHVzZWQuCiAgICAgICAgICAgICAgICAjIFRoaXMgdGFnIHdpbGwgYmUgYWJsZSB0byB1c2Ugd2l0aCBzdXBwb3J0ZWQgT1RPQk8gdGltZSB6b25lcwogICAgICAgICAgICAgICAgIyAgICggZS5nLiA8T1RPQk9fRU1BSUxfREFURVtFdXJvcGUvQmVybGluXT4sIDxPVE9CT19FTUFJTF9EQVRFW0FzaWEvVG9reW9dPiwKICAgICAgICAgICAgICAgICMgICA8T1RPQk9fRU1BSUxfREFURVtBbWVyaWNhL0RlbnZlcl0+ICwgLi4uKS4KICAgICAgICAgICAgICAgICMgSWYgeW91IHVzZSB0YWcgd2l0aG91dCB0aW1lIGluIHNpbXBsZSBmb3JtYXQgYXMgPE9UT0JPX0VNQUlMX0RBVEU+LAogICAgICAgICAgICAgICAgIyAgdGltZSB3aWxsIGJlIHRyYW5zZm9ybWVkIGludG8gT1RPQk8gU3lzdGVtVGltZVpvbmUuCiAgICAgICAgICAgICAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0VNQUlMX0RBVEUnOwoKICAgICAgICAgICAgICAgIG15ICREYXRlVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgICAgICAgICAgICAgbXkgJFN5c3RlbVRpbWVab25lID0gJERhdGVUaW1lT2JqZWN0LT5PVE9CT1RpbWVab25lR2V0KCk7CgogICAgICAgICAgICAgICAgJFBhcmFte1RleHR9ID1+IHN7CiAgICAgICAgICAgICAgICAgICAgJFN0YXJ0CiAgICAgICAgICAgICAgICAgICAgICAgIE9UT0JPX0VNQUlMX0RBVEUKICAgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgdGltZSB6b25lIGlzIG9wdGlvbmFsCiAgICAgICAgICAgICAgICAgICAgICAgICg/OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgXFsoPzx0ej4uKz8pXF0KICAgICAgICAgICAgICAgICAgICAgICAgKT8KICAgICAgICAgICAgICAgICAgICAkRW5kCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVab25lID0gJCt7dHp9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRUaW1lWm9uZSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVab25lVmFsaWQgPSAkRGF0ZVRpbWVPYmplY3QtPklzVGltZVpvbmVWYWxpZCggVGltZVpvbmUgPT4gJFRpbWVab25lICk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkVGltZVpvbmVWYWxpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkVGltZVpvbmUgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHN0YXkgYXQgdGhlIHN5c3RlbSB0aW1lIHpvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lWm9uZSA9ICRTeXN0ZW1UaW1lWm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lWm9uZSA9ICRTeXN0ZW1UaW1lWm9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgJERhdGVUaW1lT2JqZWN0LT5Ub1RpbWVab25lKCBUaW1lWm9uZSA9PiAkVGltZVpvbmUgKTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICMgY29uc3RydWN0IHRoZSByZXBsYWNlbWVudAogICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbERhdGUgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICclQSwgJUIgJWUsICVZIGF0ICVUICcgKTsKICAgICAgICAgICAgICAgICAgICAkRW1haWxEYXRlIC49ICIoJFRpbWVab25lKSI7CgogICAgICAgICAgICAgICAgICAgICMgdGhlIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgICAgJEVtYWlsRGF0ZTsKICAgICAgICAgICAgICAgIH14ZWc7ICAgICMgYSBzaW5nbGUgcGFzcyBvdmVyIHRoZSBtYWNyb3MgaW4gJFBhcmFte1RleHR9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJERhdGFUeXBlIGVxICdPVE9CT19DVVNUT01FUl8nICkgewoKICAgICAgICAgICAgIyBnZXQgYW5kIHByZXBhcmUgcmVhbCBuYW1lCiAgICAgICAgICAgICRUYWcgPSAkU3RhcnQgLiAnT1RPQk9fQ1VTVE9NRVJfUkVBTE5BTUUnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtUZXh0fSA9fiAvJFRhZyRFbmQvaSApIHsKCiAgICAgICAgICAgICAgICBteSAkRnJvbTsKCiAgICAgICAgICAgICAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewoKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHRyeSB0byBnZXQgdGhlIHJlYWwgbmFtZSBkaXJlY3RseSBmcm9tIHRoZSBkYXRhCiAgICAgICAgICAgICAgICAkRnJvbSAvLz0gJFJlY2lwaWVudHtSZWFsbmFtZX07CgogICAgICAgICAgICAgICAgIyBnZXQgcmVhbCBuYW1lIGJhc2VkIG9uIHJlcGx5LXRvCiAgICAgICAgICAgICAgICBpZiAoICEkRnJvbSAmJiAkRGF0YXtSZXBseVRvfSApIHsKCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPSAkRGF0YXtSZXBseVRvfTsKCiAgICAgICAgICAgICAgICAgICAgIyByZW1vdmUgZW1haWwgYWRkcmVzc2VzCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy8mbHQ7LiomZ3Q7fDwuKj58XCguKlwpfFwifCZxdW90O3w7fCwvL2c7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGxlYWRpbmcvdHJhaWxpbmcgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgJEZyb20gPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHJlYWwgbmFtZSBiYXNlZCBvbiBzZW5kZXIgbGluZQogICAgICAgICAgICAgICAgaWYgKCAhJEZyb20gKSB7CiAgICAgICAgICAgICAgICAgICAgJEZyb20gPSAkRGF0YXtUb30gfHwgJyc7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGVtYWlsIGFkZHJlc3NlcwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvJmx0Oy4qJmd0O3w8Lio+fFwoLipcKXxcInwmcXVvdDt8O3wsLy9nOwoKICAgICAgICAgICAgICAgICAgICAjIHJlbW92ZSBsZWFkaW5nL3RyYWlsaW5nIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICRGcm9tID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgICAgICAgICAkRnJvbSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyByZXBsYWNlIDxPVE9CT19DVVNUT01FUl9SRUFMTkFNRT4gd2l0aCBmcm9tCiAgICAgICAgICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnJEVuZC8kRnJvbS9nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIGRhdGEgYW5kIHJlcGxhY2UgaXQgd2l0aCA8T1RPQk9fQ1VTVE9NRVJfREFUQV8uLi4KICAgICRUYWcgID0gJFN0YXJ0IC4gJ09UT0JPX0NVU1RPTUVSXyc7CiAgICAkVGFnMiA9ICRTdGFydCAuICdPVE9CT19DVVNUT01FUl9EQVRBXyc7CgogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSB8fCAkUGFyYW17RGF0YX0tPntDdXN0b21lclVzZXJJRH0gKSB7CgogICAgICAgIG15ICRDdXN0b21lclVzZXJJRCA9ICRQYXJhbXtEYXRhfS0+e0N1c3RvbWVyVXNlcklEfSB8fCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfTsKCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJEN1c3RvbWVyVXNlcklELAogICAgICAgICk7CgogICAgICAgICMgSFRNTCBxdW90aW5nIG9mIGNvbnRlbnQKICAgICAgICBpZiAoICRQYXJhbXtSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgICAgIGZvciBteSAkQXR0cmlidXRlICggc29ydCBrZXlzICVDdXN0b21lclVzZXIgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAhJEN1c3RvbWVyVXNlcnskQXR0cmlidXRlfTsKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJ7JEF0dHJpYnV0ZX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzJyktPlRvSFRNTCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEN1c3RvbWVyVXNlcnskQXR0cmlidXRlfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcmVwbGFjZSBpdAogICAgICAgICRIYXNoR2xvYmFsUmVwbGFjZS0+KCAiJFRhZ3wkVGFnMiIsICVDdXN0b21lclVzZXIgKTsKICAgIH0KCiAgICAjIENsZWFuIHVwIGFsbCBub3QgbmVlZGVkICc8T1RPQk9fQ1VTVE9NRVJfJyBhbmQgJzxPVE9CT19DVVNUT01FUl9EQVRBXycgdGFncy4KICAgICMgTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgdGhlIHRhZ3Mgd2hpY2ggYmVjYW1lIHBhcnQgb2YgdGhlIHJlcGxhY2UgdGV4dAogICAgIyBiZWNhdXNlIHRoZXkgd2VyZSBwcmVzZW50IGluIHRoZSBtYWNybyB2YWx1ZXMuCiAgICAkUGFyYW17VGV4dH0gPX4gcy8oPzokVGFnfCRUYWcyKS4rPyRFbmQvLS9naTsKCiAgICAjIGNsZWFudXAgYWxsIG5vdCBuZWVkZWQgPE9UT0JPX0FHRU5UXyB0YWdzCiAgICAkVGFnID0gJFN0YXJ0IC4gJ09UT0JPX0FHRU5UXyc7CiAgICAkUGFyYW17VGV4dH0gPX4gcy8kVGFnLis/JEVuZC8tL2dpOwoKICAgIHJldHVybiAkUGFyYW17VGV4dH07Cn0KCj1oZWFkMiBfUmVtb3ZlVW5TdXBwb3J0ZWRUYWcoKQoKY2xlYW4gdXAgYWxsIG5vdCBzdXBwb3J0ZWQgdGFncy4gVGhlIG5vdCBzdXBwb3J0ZWQgdGFncyBhcmUgcmVwbGFjZWQKd2l0aCB0aGUgbWludXMgY2hhcmFjdGVyICctJy4KCiAgICBteSAkVGV4dCA9ICRUZW1wbGF0ZUdlbmVyYXRvck9iamVjdC0+X1JlbW92ZVVuU3VwcG9ydGVkVGFnKAogICAgICAgIFRleHQgICAgICAgICAgICAgICAgID0+ICRTb21lVGV4dFdpdGhUYWdzLAogICAgICAgIExpc3RPZlVuU3VwcG9ydGVkVGFnID0+IFxATGlzdE9mVW5TdXBwb3J0ZWRUYWcsCiAgICApOwoKPWN1dAoKc3ViIF9SZW1vdmVVblN1cHBvcnRlZFRhZyB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRJdGVtIChxdyhUZXh0IExpc3RPZlVuU3VwcG9ydGVkVGFnKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRJdGVtfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEl0ZW0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRTdGFydCA9ICc8JzsKICAgIG15ICRFbmQgICA9ICc+JzsKICAgIGlmICggJFNlbGYtPntSaWNoVGV4dH0gKSB7CiAgICAgICAgJFN0YXJ0ID0gJyZsdDsnOwogICAgICAgICRFbmQgICA9ICcmZ3Q7JzsKICAgICAgICAkUGFyYW17VGV4dH0gPX4gcy8oXG58XHIpLy9nOwogICAgfQoKICAgICMgQ2xlYW51cCBhbGwgbm90IHN1cHBvcnRlZCB0YWdzIHdpdGggYW5kIHdpdGhvdXQgbnVtYmVyLCBlLmcuIE9UT0JPX0NVU1RPTUVSX0JPRFkgYW5kIE9UT0JPX0NVU1RPTUVSX0JPRFlbbl0uCiAgICAjIFNlZSBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzY5IGFuZCBodHRwczovL2J1Z3Mub3Rycy5vcmcvc2hvd19idWcuY2dpP2lkPTEwODI1LgogICAgbXkgJE5vdFN1cHBvcnRlZFRhZyA9ICRTdGFydCAuICIoPzoiIC4gam9pbiggInwiLCBAeyAkUGFyYW17TGlzdE9mVW5TdXBwb3J0ZWRUYWd9IH0gKSAuICIpKFxcWy4qP1xcXSk/IiAuICRFbmQ7CiAgICAkUGFyYW17VGV4dH0gPX4gcy8kTm90U3VwcG9ydGVkVGFnLy0vZ2k7CgogICAgcmV0dXJuICRQYXJhbXtUZXh0fTsKfQoKPWhlYWQyIF9NYXNrU2Vuc2l0aXZlVmFsdWUoKQoKTWFzayBzZW5zaXRpdmUgdmFsdWUsIGkuZS4gYSBwYXNzd29yZCwgYSBzZWN1cml0eSB0b2tlbiwgZXRjLgoKICAgIG15ICRNYXNrZWRWYWx1ZSA9ICRTZWxmLT5fTWFza1NlbnNpdGl2ZVZhbHVlKAogICAgICAgIEtleSAgICAgID0+ICdEYXRhYmFzZVBhc3N3b3JkJywgIyAocmVxdWlyZWQpIE5hbWUgb2YgdGhlIGZpZWxkL2tleS4KICAgICAgICBWYWx1ZSAgICA9PiAnc2VjcmV0dmFsdWUnLCAgICAgICMgKG9wdGlvbmFsKSBWYWx1ZSB0byBwb3RlbnRpYWxseSBtYXNrLgogICAgICAgIElzQ29uZmlnID0+IDEsICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgY29uZmlnIG9wdGlvbiwgZGVmYXVsdDogMC4KICAgICk7CgpSZXR1cm5zIG1hc2tlZCB2YWx1ZSBpbiBjYXNlIHRoZSBrZXkgaXMgbWF0Y2hlZDoKCiAgICRNYXNrZWRWYWx1ZSA9ICd4eHgnOwoKPWN1dAoKc3ViIF9NYXNrU2Vuc2l0aXZlVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgISRQYXJhbXtLZXl9IHx8ICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBTa2lwIG1hc2tpbmcgc2Vuc2l0aXZlIHZhbHVlcyBmb3IgRHluYW1pYyBGaWVsZHMuCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSBpZiAkUGFyYW17S2V5fSA9fiBxcnsgZHluYW1pY2ZpZWxkIH14aTsKCiAgICAjIE1hdGNoIGdlbmVyYWwga2V5IG5hbWVzLCBpLmUuIGZyb20gdGhlIHVzZXIgcHJlZmVyZW5jZXMuCiAgICBteSAkTWF0Y2ggPSBxcnsgY29uZmlnfHNlY3JldHxwYXNzd3x1c2VycHd8YXV0aHx0b2tlbiB9eGk7CgogICAgIyBNYXRjaCBmb3JiaWRkZW4gY29uZmlnIGtleXMuCiAgICBpZiAoICRQYXJhbXtJc0NvbmZpZ30gKSB7CiAgICAgICAgJE1hdGNoID0gcXJ7ICg/OnBhc3N3b3JkfHB3KSBcZCogJCB9c214aTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSBpZiAkUGFyYW17S2V5fSAhfiAkTWF0Y2g7CgogICAgcmV0dXJuICd4eHgnOwp9Cgo9ZW5kIEludGVybmFsOgoKPWN1dAoKMTsK</File>
        <File Location="Custom/Kernel/System/Web/InterfaceCustomer.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkZWI5OWQ2MGRhZjIxMmFlNzNlYzdmZWI3ODA3NGYzZjdhZTU2M2Y4IC0gS2VybmVsL1N5c3RlbS9XZWIvSW50ZXJmYWNlQ3VzdG9tZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lcjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgbmFtZXNwYWNlOjphdXRvY2xlYW47CnVzZSB1dGY4OwoKdXNlIHBhcmVudCBxdyhQbGFjazo6Q29tcG9uZW50KTsKCiMgY29yZSBtb2R1bGVzCnVzZSBUaW1lOjpIaVJlcyAoKTsKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6TGFuZ3VhZ2UgICAgICAgICAgICAgIHF3KFRyYW5zbGF0YWJsZSk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUgICAgICAoKTsKdXNlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQgICgpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoSXNBcnJheVJlZldpdGhEYXRhIElzSGFzaFJlZldpdGhEYXRhKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVtYWlsJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlNjaGVkdWxlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0JywKICAgICdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXNwb25zZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6V2ViOjpJbnRlcmZhY2VDdXN0b21lciAtIHRoZSBjdXN0b21lciB3ZWIgaW50ZXJmYWNlCgo9aGVhZDEgU1lOT1BTSVMKCiAgICAjIFRoaXMgbW9kdWxlIGNvbnN0aXR1dGVzIGEgUGxhY2sgY29tcG9uZW50IHRoYXQgaXMgbWVhbnQgdG8gaW1wbGVtZW50IGEgUGxhY2sgYXBwLgogICAgIyBTZWUgYmluL3BzZ2ktYmluL290b2JvLnBzZ2kgb24gaG93IHRvIHVzZSBpdC4KCj1oZWFkMSBERVNDUklQVElPTgoKVGhpcyBtb2R1bGUgZ2VuZXJhdGVzIGEgUFNHSSByZXNwb25zZS4KSXQgaXMgbWVhbnQgdG8gYmUgdXNlZCB3aXRoaW4gYSBQbGFjayByZXF1ZXN0IGhhbmRsZXIuClNlZSBGPGJpbi9wc2dpLWJpbi9vdG9iby5wc2dpPiBmb3IgdGhlIHJlYWwgbGl2ZSB1c2FnZS4KCj1oZWFkMSBQUklWQVRFIEZVTkNUSU9OUwoKPWhlYWQyIF9Db250ZW50KCkKCkdlbmVyYXRlIGNvbnRlbnQuClNldCBoZWFkZXJzIGluIEtlcm5lbHM6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0IHNpbmdsZXRvbiBhcyBzaWRlIGVmZmVjdC4KQ2FuIGRpZSBhbmQgdGhyb3cgYSBDPEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbj4gZXhjZXB0aW9uLiBUaGF0IGV4Y2VwdGlvbgppcyBleHBlY3RlZCB0byBiZSBjYXVnaHQgYnkgdGhlIG1pZGRsZXdhcmUgQzxQbGFjazo6TWlkZGxld2FyZTo6SFRUUEV4Y2VwdGlvbnM+LgoKICAgIG15ICRDb250ZW50ID0gX0NvbnRlbnQoKTsKCm9yIHdpdGggZGVidWdnaW5nOgoKICAgIG15ICRDb250ZW50ID0gX0NvbnRlbnQoIERlYnVnID0+IDEgKTsKCj1jdXQKCnN1YiBfQ29udGVudCB7CiAgICBteSAoJUluY29taW5nUGFyYW0pID0gQF87CgogICAgbXkgJERlYnVnID0gJEluY29taW5nUGFyYW17RGVidWd9IHx8IDA7CgogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgICMgQ29sbGVjdCBvYmplY3QgcGFyYW1ldGVycyBmb3IgdGhlIExheW91dCBvYmplY3QKICAgIG15ICVQYXJhbTsKCiAgICAjIEdldCB0aGUgU2Vzc2lvbiBJRCBpbiBjYXNlIGl0IHdhcyBwYXNzZWQgYXMgYSBQT1NUIG9yIEdFVCBwYXJhbWV0ZXIuCiAgICAkUGFyYW17U2Vzc2lvbk5hbWV9ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsU2Vzc2lvbk5hbWUnKSAgICAgICAgIHx8ICdDU0lEJzsKICAgICRQYXJhbXtTZXNzaW9uSUR9ICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9ICkgfHwgJyc7CgogICAgIyBkcm9wIG9sZCBzZXNzaW9uIGlkIChpZiBleGlzdHMpCiAgICBteSAkUXVlcnlTdHJpbmcgPSAkUGFyYW1PYmplY3QtPlF1ZXJ5U3RyaW5nKCkgfHwgJyc7CgogICAgIyBUT0RPOiB3aHkgaXMgdGhlIHBhdHRlcm4gPS4rPzsgbm90IGluY2x1ZGVkID8KICAgICRRdWVyeVN0cmluZyA9fiBzLyhcP3wmfDt8KSRQYXJhbXtTZXNzaW9uTmFtZX0oPSZ8PTt8PS4rPyZ8PS4rPyQpLzsvZzsKCiAgICAjIGRlZmluZSBmcmFtZXdvcmsgcGFyYW1zCiAgICB7CiAgICAgICAgbXkgJUZyYW1ld29ya1BhcmFtcyA9ICgKICAgICAgICAgICAgTGFuZyAgICAgICAgID0+ICcnLAogICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJycsCiAgICAgICAgICAgIFN1YmFjdGlvbiAgICA9PiAnJywKICAgICAgICAgICAgUmVxdWVzdGVkVVJMID0+ICRRdWVyeVN0cmluZywKICAgICAgICApOwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVGcmFtZXdvcmtQYXJhbXMgKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5fSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKSB8fCAkRnJhbWV3b3JrUGFyYW1zeyRLZXl9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHZhbGlkYXRlIGxhbmd1YWdlCiAgICBpZiAoICRQYXJhbXtMYW5nfSAmJiAkUGFyYW17TGFuZ30gIX4gbXtcQVthLXpdezJ9KD86X1tBLVpdezJ9KT9cen14bXMgKSB7CiAgICAgICAgZGVsZXRlICRQYXJhbXtMYW5nfTsKICAgIH0KCiAgICAjIENoZWNrIGlmIHRoZSBicm93c2VyIHNlbmRzIHRoZSBTZXNzaW9uSUQgY29va2llIGFuZCBzZXQgdGhlIFNlc3Npb25JRC1jb29raWUKICAgICMgYXMgU2Vzc2lvbklEISBHRVQgb3IgUE9TVCBTZXNzaW9uSUQgaGF2ZSB0aGUgbG93ZXN0IHByaW9yaXR5LgogICAgewogICAgICAgIG15ICRTZXNzaW9uSURGcm9tQ29va2llID0gJFBhcmFtT2JqZWN0LT5HZXRDb29raWUoIEtleSA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9ICk7CiAgICAgICAgaWYgKCRTZXNzaW9uSURGcm9tQ29va2llKSB7CiAgICAgICAgICAgICRQYXJhbXtTZXNzaW9uSUR9ID0gJFNlc3Npb25JREZyb21Db29raWU7CiAgICAgICAgfQogICAgfQoKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICBMYW5nID0+ICRQYXJhbXtMYW5nfSwKICAgICAgICB9LAogICAgICAgICdLZXJuZWw6Okxhbmd1YWdlJyA9PiB7CiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkUGFyYW17TGFuZ30KICAgICAgICB9LAogICAgKTsKCiAgICAjIFNhbml0eSBjaGVjayB3aGV0aGVyIHRoZSBkYXRhYmFzZSBpcyBhdmFpbGFibGUKICAgIG15ICREQkNhbkNvbm5lY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKS0+Q29ubmVjdCgpOwogICAgaWYgKCAhJERCQ2FuQ29ubmVjdCB8fCAkUGFyYW1PYmplY3QtPkVycm9yKCkgKSB7CiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICAgICBpZiAoICEkREJDYW5Db25uZWN0ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQogICAgICAgIGlmICggJFBhcmFtT2JqZWN0LT5FcnJvcigpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRQYXJhbU9iamVjdC0+RXJyb3IoKSwKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29tbW9uIGFwcGxpY2F0aW9uIGFuZCBhZGQtb24gYXBwbGljYXRpb24gcGFyYW1zCiAgICBteSAlQ29tbW9uT2JqZWN0UGFyYW0gPSAleyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6OkNvbW1vblBhcmFtJykgfTsKICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVDb21tb25PYmplY3RQYXJhbSApIHsKICAgICAgICAkUGFyYW17JEtleX0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICkgfHwgJENvbW1vbk9iamVjdFBhcmFteyRLZXl9OwogICAgfQoKICAgICMgc2VjdXJpdHkgY2hlY2sgQWN0aW9uIFBhcmFtIChyZXBsYWNlIG5vbi13b3JkIGNoYXJzKQogICAgJFBhcmFte0FjdGlvbn0gPX4gcy9cVy8vZzsKCiAgICBteSAkU2Vzc2lvbk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpBdXRoU2Vzc2lvbicpOwogICAgbXkgJFVzZXJPYmplY3QgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CgogICAgIyBjaGVjayByZXF1ZXN0IHR5cGUKICAgIGlmICggJFBhcmFte0FjdGlvbn0gZXEgJ1ByZUxvZ2luJyApIHsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9IHx8PSAnQWN0aW9uPUN1c3RvbWVyRGFzaGJvYXJkJzsKCiAgICAgICAgIyBsb2dpbiBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgPT4gJ0xvZ2luJywKICAgICAgICAgICAgTW9kZSAgPT4gJ1ByZUxvZ2luJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdMb2dpbicgKSB7CgogICAgICAgICMgZ2V0IHBhcmFtcwogICAgICAgIG15ICRQb3N0VXNlciA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyJyApIHx8ICcnOwoKICAgICAgICBteSAkUHJldmVudEJydXRlRm9yY2VDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1NpbXBsZUJydXRlRm9yY2VQcm90ZWN0aW9uOjpHZW5lcmFsU2V0dGluZ3MnKTsKCiAgICAgICAgIyBpZiBzaW1wbGVicnV0ZWZvcmNlY29uZmlnIGlzIHZhbGlkCiAgICAgICAgaWYgKCAkUHJldmVudEJydXRlRm9yY2VDb25maWcgJiYgJFBvc3RVc2VyICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB0aGUgbG9naW4gaXMgYmFubmVkCiAgICAgICAgICAgIG15ICRDYWNoZU9iamVjdCAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgICAgIG15ICRDaGVja0hhc2hVc2VyID0gJENhY2hlT2JqZWN0LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdCYW5uZWRMb2dpbnNDdXN0b21lcicsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgQ2FjaGUgQ2hlY2tIYXNoVXNlciBleGlzdHMKICAgICAgICAgICAgaWYgKCRDaGVja0hhc2hVc2VyKSB7CiAgICAgICAgICAgICAgICBteSAlQmFuU3RhdHVzID0gX0NoZWNrQW5kUmVtb3ZlRnJvbUJhbm5lZExpc3QoCiAgICAgICAgICAgICAgICAgICAgUG9zdFVzZXIgICAgICAgICAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICAgICAgICAgIFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnID0+ICRQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZywKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkQmFuU3RhdHVze0Jhbm5lZH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RvbyBtYW55IGZhaWxlZCBsb2dpbiBhdHRlbXB0cywgcGxlYXNlIHJldHJ5IGluICVzIHMuJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRCYW5TdGF0dXN7UmVzaWR1YWxUaW1lfQogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICBMb2dpbkZhaWxlZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyICAgICAgICA9PiAkUG9zdFVzZXIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJFBvc3RQdyA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgIFBhcmFtID0+ICdQYXNzd29yZCcsCiAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICApIHx8ICcnOwogICAgICAgIG15ICRQb3N0VHdvRmFjdG9yVG9rZW4gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICBQYXJhbSA9PiAnVHdvRmFjdG9yVG9rZW4nLAogICAgICAgICAgICBSYXcgICA9PiAxCiAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgIyBjcmVhdGUgQXV0aE9iamVjdAogICAgICAgIG15ICRBdXRoT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpOwoKIyBSb3RoZXIgT1NTIC8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgICAgIG15ICVFeHRlbmRlZEF1dGhQYXJhbXM7CiAgICAgICAgZm9yIG15ICROYW1lICggJEF1dGhPYmplY3QtPkV4dGVuZGVkUGFyYW1OYW1lcygpICkgewogICAgICAgICAgICAkRXh0ZW5kZWRBdXRoUGFyYW1zeyROYW1lfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFJhdyAgID0+IDEKICAgICAgICAgICAgKSB8fCAnJzsKICAgICAgICB9CiMgRU8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawoKICAgICAgICAjIGNoZWNrIHN1Ym1pdHRlZCBkYXRhCiAgICAgICAgbXkgJFVzZXIgPSAkQXV0aE9iamVjdC0+QXV0aCgKICAgICAgICAgICAgVXNlciAgICAgICAgICAgPT4gJFBvc3RVc2VyLAogICAgICAgICAgICBQdyAgICAgICAgICAgICA9PiAkUG9zdFB3LAogICAgICAgICAgICBUd29GYWN0b3JUb2tlbiA9PiAkUG9zdFR3b0ZhY3RvclRva2VuLAojIFJvdGhlciBPU1MgLyBPbmVUaW1lQXV0aGVudGljYXRpb25MaW5rCiAgICAgICAgICAgICVFeHRlbmRlZEF1dGhQYXJhbXMsCiMgRU8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgICAgICk7CgogICAgICAgICMgYWRkaXRpb25hbCB0YXNrcyAvIGluZm8KICAgICAgICBteSAkUG9zdEF1dGggPSAkQXV0aE9iamVjdC0+UG9zdEF1dGgoKTsKCiAgICAgICAgaWYgKCRQb3N0QXV0aCkgewogICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRQb3N0QXV0aC0+e1JlcXVlc3RlZFVSTH0gLy8gJFBhcmFte1JlcXVlc3RlZFVSTH07CiAgICAgICAgfQoKICAgICAgICAjIGxvZ2luIGlzIGludmFsaWQKICAgICAgICBpZiAoICEkVXNlciApIHsKCiAgICAgICAgICAgICMgdGVudGF0aXZlbHkgc2V0IGFuIHVzZWxlc3MgY29va2llLCBmb3IgY2hlY2tpbmcgY29va2llIHN1cHBvcnQKICAgICAgICAgICAgbXkgJEV4cGlyZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpCiAgICAgICAgICAgICAgICA/CiAgICAgICAgICAgICAgICAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncycKICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICcnOwogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gMSwKICAgICAgICAgICAgICAgIEV4cGlyZXMgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAgICAgIyB0aHJvdyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbiB0aGF0IHJlZGlyZWN0cwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgLiAiP1JlYXNvbj1Mb2dpbkZhaWxlZCZSZXF1ZXN0ZWRVUkw9JFBhcmFte1JlcXVlc3RlZFVSTH0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUHJldmVudEJydXRlRm9yY2VDb25maWcgJiYgJFBvc3RVc2VyICkgewoKICAgICAgICAgICAgICAgICMgcHJldmVudCBicnV0ZSBmb3JjZQogICAgICAgICAgICAgICAgbXkgJEJhbm5lZCA9IF9TdG9yZUZhaWxlZExvZ2lucygKICAgICAgICAgICAgICAgICAgICBQb3N0VXNlciAgICAgICAgICAgICAgICA9PiAkUG9zdFVzZXIsCiAgICAgICAgICAgICAgICAgICAgUHJldmVudEJydXRlRm9yY2VDb25maWcgPT4gJFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoJEJhbm5lZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVG9vIG1hbnkgZmFpbGVkIGxvZ2luIGF0dGVtcHRzLCBwbGVhc2UgcmV0cnkgaW4gJXMgcy4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnLT57QmFuRHVyYXRpb259CiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luRmFpbGVkID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXIgICAgICAgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgbm9ybWFsIGxvZ2luCiAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICAgICAgVGl0bGUgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAkQXV0aE9iamVjdC0+R2V0TGFzdEVycm9yTWVzc2FnZSgpCiAgICAgICAgICAgICAgICAgICAgfHwgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnSW5mbycsCiAgICAgICAgICAgICAgICAgICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB8fCAkQXV0aE9iamVjdC0+R2V0TGFzdEVycm9yTWVzc2FnZSgpCiAgICAgICAgICAgICAgICAgICAgfHwgVHJhbnNsYXRhYmxlKCdMb2dpbiBmYWlsZWQhIFlvdXIgdXNlciBuYW1lIG9yIHBhc3N3b3JkIHdhcyBlbnRlcmVkIGluY29ycmVjdGx5LicpLAogICAgICAgICAgICAgICAgTG9naW5GYWlsZWQgPT4gMSwKICAgICAgICAgICAgICAgIFVzZXIgICAgICAgID0+ICRQb3N0VXNlciwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgbG9naW4gaXMgc3VjY2Vzc2Z1bAogICAgICAgIG15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyICA9PiAkVXNlciwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGNvb2tpZXMKICAgICAgICBpZiAoICRQYXJhbU9iamVjdC0+R2V0Q29va2llKCBLZXkgPT4gJ09UT0JPQnJvd3Nlckhhc0Nvb2tpZScgKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgICAgICBCcm93c2VySGFzQ29va2llID0+IDEsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgICAgIGlmICggISRVc2VyRGF0YXtVc2VySUR9IHx8ICEkVXNlckRhdGF7VXNlckxvZ2lufSApIHsKCiAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAgICAgIyB0aHJvdyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbiB0aGF0IHJlZGlyZWN0cwogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgLiAnP1JlYXNvbj1TeXN0ZW1FcnJvcicsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgbmVlZCB1c2VyIGRhdGEgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGFibGUoCiAgICAgICAgICAgICAgICAgICAgICAgICdBdXRoZW50aWNhdGlvbiBzdWNjZWVkZWQsIGJ1dCBubyBjdXN0b21lciByZWNvcmQgaXMgZm91bmQgaW4gdGhlIGN1c3RvbWVyIGJhY2tlbmQuIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgZGF0ZXRpbWUgb2JqZWN0CiAgICAgICAgbXkgJFNlc3Npb25EVE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwoKICAgICAgICAjIFJlbW92ZSBjZXJ0YWluIHVzZXIgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgbmVlZGVkIHRvIGJlIHN0b3JlZCBpbiB0aGUgc2Vzc2lvbi4KICAgICAgICAjICAgLSBTTUlNRSBDZXJ0aWZpY2F0ZSBjb3VsZCBiZSBpbiBiaW5hcnkgZm9ybWF0LCBpZiBzZXNzaW9uIGJhY2tlbmQgaW4gREIgKGRlZmF1bHQpCiAgICAgICAgIyAgIGl0IHdvbnQgYmUgcG9zc2libGUgdG8gYmUgc2F2ZWQgaW4gY2VydGFpbiBkYXRhYmFzZXMgKHNlZSBidWcjMTQ0MDUpLgogICAgICAgIG15ICVVc2VyU2Vzc2lvbkRhdGEgPSAlVXNlckRhdGE7CiAgICAgICAgZGVsZXRlICRVc2VyU2Vzc2lvbkRhdGF7VXNlclNNSU1FQ2VydGlmaWNhdGV9OwoKICAgICAgICAjIGNyZWF0ZSBuZXcgc2Vzc2lvbiBpZAogICAgICAgIG15ICROZXdTZXNzaW9uSUQgPSAkU2Vzc2lvbk9iamVjdC0+Q3JlYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAlVXNlclNlc3Npb25EYXRhLAogICAgICAgICAgICBVc2VyTGFzdFJlcXVlc3QgPT4gJFNlc3Npb25EVE9iamVjdC0+VG9FcG9jaCgpLAogICAgICAgICAgICBVc2VyVHlwZSAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgU2Vzc2lvblNvdXJjZSAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVycm9yIG1lc3NhZ2UgaWYgbm8gc2Vzc2lvbiBpZCBoYXMgYmVlbiBjcmVhdGVkCiAgICAgICAgaWYgKCAhJE5ld1Nlc3Npb25JRCApIHsKCiAgICAgICAgICAgICMgZ2V0IGVycm9yIG1lc3NhZ2UKICAgICAgICAgICAgbXkgJEVycm9yID0gJFNlc3Npb25PYmplY3QtPlNlc3Npb25JREVycm9yTWVzc2FnZSgpIHx8ICcnOwoKICAgICAgICAgICAgIyBvdXRwdXQgZXJyb3IgbWVzc2FnZQogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+ICRFcnJvciwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZXhlY3V0aW9uIGluIDIwIHNlY29uZHMKICAgICAgICBteSAkRXhlY3V0aW9uVGltZU9iaiA9ICRTZXNzaW9uRFRPYmplY3QtPkNsb25lKCk7CiAgICAgICAgJEV4ZWN1dGlvblRpbWVPYmotPkFkZCggU2Vjb25kcyA9PiAyMCApOwogICAgICAgIG15ICRFeGVjdXRpb25UaW1lID0gJEV4ZWN1dGlvblRpbWVPYmotPlRvU3RyaW5nKCk7CgogICAgICAgICMgYWRkIGEgYXN5bmNocm9ub3VzIGV4ZWN1dG9yIHNjaGVkdWxlciB0YXNrIHRvIGNvdW50IHRoZSBjb25jdXJyZW50IHVzZXIKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6U2NoZWR1bGVyJyktPlRhc2tBZGQoCiAgICAgICAgICAgIEV4ZWN1dGlvblRpbWUgICAgICAgICAgICA9PiAkRXhlY3V0aW9uVGltZSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgID0+ICdBc3luY2hyb25vdXNFeGVjdXRvcicsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICAgICA9PiAnUGx1Z2luQXN5bmNocm9ub3VzOjpDb25jdXJyZW50VXNlcicsCiAgICAgICAgICAgIE1heGltdW1QYXJhbGxlbEluc3RhbmNlcyA9PiAxLAogICAgICAgICAgICBEYXRhICAgICAgICAgICAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0ICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpTdXBwb3J0RGF0YUNvbGxlY3Rvcjo6UGx1Z2luQXN5bmNocm9ub3VzOjpPVE9CTzo6Q29uY3VycmVudFVzZXJzJywKICAgICAgICAgICAgICAgIEZ1bmN0aW9uID0+ICdSdW5Bc3luY2hyb25vdXMnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIG15ICRVc2VyVGltZVpvbmUgPSBfVXNlclRpbWVab25lR2V0KCVVc2VyRGF0YSk7CgogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJUaW1lWm9uZScsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkVXNlclRpbWVab25lLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgdGhlIHRpbWUgem9uZSBvZmZzZXQgcmVwb3J0ZWQgYnkgdGhlIHVzZXIncyBicm93c2VyIGRpZmZlcnMgZnJvbSB0aGF0CiAgICAgICAgIyBvZiB0aGUgT1RPQk8gdXNlcidzIHRpbWUgem9uZSBvZmZzZXQKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIFRpbWVab25lID0+ICRVc2VyVGltZVpvbmUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkT1RPQk9Vc2VyVGltZVpvbmVPZmZzZXQgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICcle29mZnNldH0nICkgLyA2MDsKICAgICAgICBteSAkQnJvd3NlclRpbWVab25lT2Zmc2V0ICAgPSAoICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaW1lWm9uZU9mZnNldCcgKSB8fCAwICkgKiAtMTsKCiAgICAgICAgIyBUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UgY29udGFpbnMgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHRpbWUgem9uZSBvZmZzZXQgYmV0d2VlbgogICAgICAgICMgdGhlIHVzZXIncyBPVE9CTyB0aW1lIHpvbmUgc2V0dGluZyBhbmQgdGhlIG9uZSByZXBvcnRlZCBieSB0aGUgdXNlcidzIGJyb3dzZXIuCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgaXQgY2FuIGJlIGV2YWx1YXRlZCBsYXRlciB0byBlLiBnLiBzaG93IGEgbWVzc2FnZQogICAgICAgICMgZm9yIHRoZSB1c2VyIHRvIGNoZWNrIGhpcyBPVE9CTyB0aW1lIHpvbmUgc2V0dGluZy4KICAgICAgICBteSAkVXNlclRpbWVab25lT2Zmc2V0RGlmZmVyZW5jZSA9IGFicyggJE9UT0JPVXNlclRpbWVab25lT2Zmc2V0IC0gJEJyb3dzZXJUaW1lWm9uZU9mZnNldCApOwogICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkTmV3U2Vzc2lvbklELAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFVzZXJUaW1lWm9uZU9mZnNldERpZmZlcmVuY2UsCiAgICAgICAgKTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgTGF5b3V0T2JqZWN0IHdpdGggdGhlIHNlc3Npb24gY29va2llCiAgICAgICAgbXkgJEV4cGlyZXMgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWVBZnRlckJyb3dzZXJDbG9zZScpCiAgICAgICAgICAgID8KICAgICAgICAgICAgJysnIC4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTWF4VGltZScpIC4gJ3MnCiAgICAgICAgICAgIDoKICAgICAgICAgICAgJyc7CgogICAgICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAgICAgJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnID0+IHsKICAgICAgICAgICAgICAgIFNldENvb2tpZXMgID0+IHt9LAogICAgICAgICAgICAgICAgU2Vzc2lvbklEICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgICAgIFNlc3Npb25OYW1lID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+U2V0Q29va2llKAogICAgICAgICAgICBSZWdpc3RlckluT00gPT4gMSwKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+ICdTZXNzaW9uSURDb29raWUnLAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJFBhcmFte1Nlc3Npb25OYW1lfSwKICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICROZXdTZXNzaW9uSUQsCiAgICAgICAgICAgIEV4cGlyZXMgICAgICA9PiAkRXhwaXJlcywKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgT1RPQk9Ccm93c2VySGFzQ29va2llIGNvb2tpZQogICAgICAgIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPlNldENvb2tpZSgKICAgICAgICAgICAgUmVnaXN0ZXJJbk9NID0+IDEsCiAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEV4cGlyZXMgICAgICA9PiAnLTF5JywKICAgICAgICApOwoKICAgICAgICAjIHJlZGlyZWN0IHdpdGggbmV3IHNlc3Npb24gaWQgYW5kIG9sZCBwYXJhbXMKICAgICAgICAjIHByZXBhcmUgb2xkIHJlZGlyZWN0IFVSTCAtLSBkbyBub3QgcmVkaXJlY3QgdG8gTG9naW4gb3IgTG9nb3V0IChsb29wKSEKICAgICAgICBpZiAoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID1+IC9BY3Rpb249KExvZ291dHxMb2dpbnxMb3N0UGFzc3dvcmR8UHJlTG9naW4pLyApIHsKICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgcmVkaXJlY3Qgd2l0aCBuZXcgc2Vzc2lvbiBpZAogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICBPUCAgICA9PiAkUGFyYW17UmVxdWVzdGVkVVJMfSwKICAgICAgICAgICAgTG9naW4gPT4gMSwKICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgfQoKICAgICMgbG9nb3V0CiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdMb2dvdXQnICkgewoKICAgICAgICAjIGNoZWNrIHNlc3Npb24gaWQKICAgICAgICBpZiAoICEkU2Vzc2lvbk9iamVjdC0+Q2hlY2tTZXNzaW9uSUQoIFNlc3Npb25JRCA9PiAkUGFyYW17U2Vzc2lvbklEfSApICkgewoKICAgICAgICAgICAgIyBuZXcgbGF5b3V0IG9iamVjdAogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgIyByZWRpcmVjdCB0byBhbHRlcm5hdGUgbG9naW4KICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpICkgewogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkUGFyYW17UmVxdWVzdGVkVVJMfSApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC4gIj9SZWFzb249SW52YWxpZFNlc3Npb25JRDtSZXF1ZXN0ZWRVUkw9JFBhcmFte1JlcXVlc3RlZFVSTH0iLAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGxvZ2luIHNjcmVlbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ291dCcsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnU2Vzc2lvbiBpbnZhbGlkLiBQbGVhc2UgbG9nIGluIGFnYWluLicpLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2Vzc2lvbiBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlc3Npb25PYmplY3QtPkdldFNlc3Npb25JRERhdGEoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkUGFyYW17U2Vzc2lvbklEfSwKICAgICAgICApOwoKICAgICAgICAkVXNlckRhdGF7VXNlclRpbWVab25lfSA9IF9Vc2VyVGltZVpvbmVHZXQoJVVzZXJEYXRhKTsKCiAgICAgICAgIyBjcmVhdGUgYSBuZXcgTGF5b3V0T2JqZWN0IHdpdGggJyVQYXJhbScgYW5kICclVXNlckRhdGEnCiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICAgICAgU2V0Q29va2llcyA9PiB7fSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGRlbGV0ZSB0aGUgT1RPQk8gc2Vzc2lvbiBjb29raWUKICAgICAgICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5TZXRDb29raWUoCiAgICAgICAgICAgIFJlZ2lzdGVySW5PTSA9PiAxLAogICAgICAgICAgICBLZXkgICAgICAgICAgPT4gJ1Nlc3Npb25JRENvb2tpZScsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJycsCiAgICAgICAgICAgIEV4cGlyZXMgICAgICA9PiAnLTF5JywKICAgICAgICApOwoKICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J10gKTsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAjIHJlbW92ZSBzZXNzaW9uIGlkCiAgICAgICAgaWYgKCAhJFNlc3Npb25PYmplY3QtPlJlbW92ZVNlc3Npb25JRCggU2Vzc2lvbklEID0+ICRQYXJhbXtTZXNzaW9uSUR9ICkgKSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKQogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCB0byBhbHRlcm5hdGUgbG9naW4KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ291dFVSTCcpICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dvdXRVUkwnKSwKICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICB9CgogICAgICAgICMgdHJ5IGF1dGggbW9kdWxlIHNwZWNpZmljIGxvZ291dAogICAgICAgIG15ICRMb2dvdXRJbmZvID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aCcpLT5Mb2dvdXQoKTsKICAgICAgICBpZiAoICRMb2dvdXRJbmZvICYmICRMb2dvdXRJbmZvLT57TG9nb3V0VVJMfSApIHsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJExvZ291dEluZm8tPntMb2dvdXRVUkx9LAogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGxvZ291dCBzY3JlZW4KICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJ0xvZ291dCcsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTG9nb3V0IHN1Y2Nlc3NmdWwuJyksCiAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb3N0IHBhc3N3b3JkCiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdDdXN0b21lckxvc3RQYXNzd29yZCcgKSB7CgogICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICMgY2hlY2sgZmVhdHVyZQogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvc3RQYXNzd29yZCcpICkgewoKICAgICAgICAgICAgIyBzaG93IG5vcm1hbCBsb2dpbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGZWF0dXJlIG5vdCBhY3RpdmUhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAkVXNlciAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnVXNlcicgKSAgfHwgJyc7CiAgICAgICAgbXkgJFRva2VuID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rva2VuJyApIHx8ICcnOwoKICAgICAgICAjIGdldCB1c2VyIGxvZ2luIGJ5IHRva2VuCiAgICAgICAgaWYgKCAhJFVzZXIgJiYgJFRva2VuICkgewoKICAgICAgICAgICAgIyBQcmV2ZW50IGV4dHJhY3RpbmcgcGFzc3dvcmQgcmVzZXQgdG9rZW4gY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciB2aWEgd2lsZGNhcmQgaW5qZWN0aW9uCiAgICAgICAgICAgICMgVGhlIHdpbGQgY2FyZCBjaGFyYWN0ZXJzICIlIiBhbmQgIl8iIGNvdWxkIGJlIHVzZWQgdG8gbWF0Y2ggYXJiaXRyYXJ5IGNoYXJhY3Rlci4KICAgICAgICAgICAgaWYgKCAkVG9rZW4gIX4gbXtcQSAoPzogW2EtekEtWl0gfCBcZCApKyBcen14bXMgKSB7CgogICAgICAgICAgICAgICAgIyBTZWN1cml0eTogcHJldGVuZCB0aGF0IHBhc3N3b3JkIHJlc2V0IGluc3RydWN0aW9ucyB3ZXJlIGFjdHVhbGx5IHNlbnQgdG8KICAgICAgICAgICAgICAgICMgICBtYWtlIHN1cmUgdGhhdCB1c2VycyBjYW5ub3QgZmluZCBvdXQgdmFsaWQgdXNlcm5hbWVzIGJ5CiAgICAgICAgICAgICAgICAjICAganVzdCB0cnlpbmcgYW5kIGNoZWNraW5nIHRoZSByZXN1bHQgbWVzc2FnZS4KICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5Mb2dpbigKICAgICAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+IFRyYW5zbGF0YWJsZSgnU2VudCBwYXNzd29yZCByZXNldCBpbnN0cnVjdGlvbnMuIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsLicpLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAlVXNlckxpc3QgPSAkVXNlck9iamVjdC0+U2VhcmNoUHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBLZXkgICA9PiAnVXNlclRva2VuJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRUb2tlbiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgVVNFUl9JRDoKICAgICAgICAgICAgZm9yIG15ICRVc2VySUQgKCBzb3J0IGtleXMgJVVzZXJMaXN0ICkgewogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICglVXNlckRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAkVXNlciA9ICRVc2VyRGF0YXtVc2VyTG9naW59OwoKICAgICAgICAgICAgICAgICAgICBsYXN0IFVTRVJfSUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHVzZXIgZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRVc2VyLAogICAgICAgICk7CgogICAgICAgICMgdmVyaWZ5IGN1c3RvbWVyIHVzZXIgaXMgdmFsaWQgd2hlbiByZXF1ZXN0aW5nIHBhc3N3b3JkIHJlc2V0CiAgICAgICAgbXkgQFZhbGlkSURzICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CiAgICAgICAgbXkgJFVzZXJJc1ZhbGlkID0gZ3JlcCB7ICRVc2VyRGF0YXtWYWxpZElEfSAmJiAkVXNlckRhdGF7VmFsaWRJRH0gPT0gJF8gfSBAVmFsaWRJRHM7CiAgICAgICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gfHwgISRVc2VySXNWYWxpZCApIHsKCiAgICAgICAgICAgICMgU2VjdXJpdHk6IHByZXRlbmQgdGhhdCBwYXNzd29yZCByZXNldCBpbnN0cnVjdGlvbnMgd2VyZSBhY3R1YWxseSBzZW50IHRvCiAgICAgICAgICAgICMgICBtYWtlIHN1cmUgdGhhdCB1c2VycyBjYW5ub3QgZmluZCBvdXQgdmFsaWQgdXNlcm5hbWVzIGJ5CiAgICAgICAgICAgICMgICBqdXN0IHRyeWluZyBhbmQgY2hlY2tpbmcgdGhlIHJlc3VsdCBtZXNzYWdlLgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICAgICA9PiBUcmFuc2xhdGFibGUoJ1NlbnQgcGFzc3dvcmQgcmVzZXQgaW5zdHJ1Y3Rpb25zLiBQbGVhc2UgY2hlY2sgeW91ciBlbWFpbC4nKSwKICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIGVtYWlsIG9iamVjdAogICAgICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwoKICAgICAgICAjIHNlbmQgcGFzc3dvcmQgcmVzZXQgdG9rZW4KICAgICAgICBpZiAoICEkVG9rZW4gKSB7CgogICAgICAgICAgICAjIGdlbmVyYXRlIHRva2VuCiAgICAgICAgICAgICRVc2VyRGF0YXtUb2tlbn0gPSAkVXNlck9iamVjdC0+VG9rZW5HZW5lcmF0ZSgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlckRhdGF7VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2VuZCB0b2tlbiBub3RpZnkgZW1haWwgd2l0aCBsaW5rCiAgICAgICAgICAgIG15ICRCb2R5ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQm9keUxvc3RQYXNzd29yZFRva2VuJykKICAgICAgICAgICAgICAgIHx8ICdFUlJPUjogQ3VzdG9tZXJQYW5lbEJvZHlMb3N0UGFzc3dvcmRUb2tlbiBpcyBtaXNzaW5nISc7CiAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsU3ViamVjdExvc3RQYXNzd29yZFRva2VuJykKICAgICAgICAgICAgICAgIHx8ICdFUlJPUjogQ3VzdG9tZXJQYW5lbFN1YmplY3RMb3N0UGFzc3dvcmRUb2tlbiBpcyBtaXNzaW5nISc7CiAgICAgICAgICAgIGZvciAoIHNvcnQga2V5cyAlVXNlckRhdGEgKSB7CiAgICAgICAgICAgICAgICAkQm9keSA9fiBzLzxPVE9CT18kXz4vJFVzZXJEYXRheyRffS9naTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkU2VudCA9ICRFbWFpbE9iamVjdC0+U2VuZCgKICAgICAgICAgICAgICAgIFRvICAgICAgID0+ICRVc2VyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICAgICAgICAgU3ViamVjdCAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgICAgICBDaGFyc2V0ICA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICAgICAgTWltZVR5cGUgPT4gJ3RleHQvcGxhaW4nLAogICAgICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHkKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJFNlbnQtPntTdWNjZXNzfSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgICAgPT4gVHJhbnNsYXRhYmxlKCdTZW50IHBhc3N3b3JkIHJlc2V0IGluc3RydWN0aW9ucy4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJyksCiAgICAgICAgICAgICAgICBNZXNzYWdlVHlwZSA9PiAnU3VjY2VzcycsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlc2V0IHBhc3N3b3JkCiAgICAgICAgIyBjaGVjayBpZiB0b2tlbiBpcyB2YWxpZAogICAgICAgIG15ICRUb2tlblZhbGlkID0gJFVzZXJPYmplY3QtPlRva2VuQ2hlY2soCiAgICAgICAgICAgIFRva2VuICA9PiAkVG9rZW4sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkVXNlckRhdGF7VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVG9rZW5WYWxpZCApIHsKICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+IFRyYW5zbGF0YWJsZSgnSW52YWxpZCBUb2tlbiEnKSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IG5ldyBwYXNzd29yZAogICAgICAgICRVc2VyRGF0YXtOZXdQV30gPSAkVXNlck9iamVjdC0+R2VuZXJhdGVSYW5kb21QYXNzd29yZCgpOwoKICAgICAgICAjIHVwZGF0ZSBuZXcgcGFzc3dvcmQKICAgICAgICBteSAkU3VjY2VzcyA9ICRVc2VyT2JqZWN0LT5TZXRQYXNzd29yZCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyLAogICAgICAgICAgICBQVyAgICAgICAgPT4gJFVzZXJEYXRhe05ld1BXfQogICAgICAgICk7CgogICAgICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdSZXNldCBwYXNzd29yZCB1bnN1Y2Nlc3NmdWwuIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICAgICAgVXNlciAgICA9PiAkVXNlciwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBub3RpZnkgZW1haWwKICAgICAgICBteSAkQm9keSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbEJvZHlMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICB8fCAnTmV3IFBhc3N3b3JkIGlzOiA8T1RPQk9fTkVXUFc+JzsKICAgICAgICBteSAkU3ViamVjdCA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFN1YmplY3RMb3N0UGFzc3dvcmQnKQogICAgICAgICAgICB8fCAnTmV3IFBhc3N3b3JkISc7CiAgICAgICAgZm9yICggc29ydCBrZXlzICVVc2VyRGF0YSApIHsKICAgICAgICAgICAgJEJvZHkgPX4gcy88T1RPQk9fJF8+LyRVc2VyRGF0YXskX30vZ2k7CiAgICAgICAgfQogICAgICAgIG15ICRTZW50ID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgICAgICBUbyAgICAgICA9PiAkVXNlckRhdGF7VXNlckVtYWlsfSwKICAgICAgICAgICAgU3ViamVjdCAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIENoYXJzZXQgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHkKICAgICAgICApOwoKICAgICAgICBpZiAoICEkU2VudC0+e1N1Y2Nlc3N9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckZhdGFsRXJyb3IoCiAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQogICAgICAgIG15ICRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnU2VudCBuZXcgcGFzc3dvcmQgdG8gJXMuIFBsZWFzZSBjaGVjayB5b3VyIGVtYWlsLicsCiAgICAgICAgICAgICRVc2VyRGF0YXtVc2VyRW1haWx9LAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAnTG9naW4nLAogICAgICAgICAgICBNZXNzYWdlICAgICA9PiAkTWVzc2FnZSwKICAgICAgICAgICAgVXNlciAgICAgICAgPT4gJFVzZXIsCiAgICAgICAgICAgIE1lc3NhZ2VUeXBlID0+ICdTdWNjZXNzJywKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBjdXN0b21lciBhY2NvdW50CiAgICBlbHNpZiAoICRQYXJhbXtBY3Rpb259IGVxICdDdXN0b21lckNyZWF0ZUFjY291bnQnICkgewoKICAgICAgICAjIG5ldyBsYXlvdXQgb2JqZWN0CiAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgIyBjaGVjayBmZWF0dXJlCiAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudCcpICkgewoKICAgICAgICAgICAgIyBzaG93IG5vcm1hbCBsb2dpbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdGZWF0dXJlIG5vdCBhY3RpdmUhJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBteSAlR2V0UGFyYW1zOwogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyVXNlcicpLT57TWFwfSB9ICkgewogICAgICAgICAgICAkR2V0UGFyYW1zeyAkRW50cnktPlswXSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEVudHJ5LT5bMV0gKQogICAgICAgICAgICAgICAgfHwgJyc7CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXN7VmFsaWRJRH0gPSAxOwoKICAgICAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgICAgICBpZiAoICEkR2V0UGFyYW1ze1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFtc3tVc2VyQ3VzdG9tZXJJRH0gPSAkR2V0UGFyYW1ze1VzZXJFbWFpbH07CiAgICAgICAgfQogICAgICAgIGlmICggISRHZXRQYXJhbXN7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgJEdldFBhcmFtc3tVc2VyTG9naW59ID0gJEdldFBhcmFtc3tVc2VyRW1haWx9OwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbmV3IHBhc3N3b3JkCiAgICAgICAgJEdldFBhcmFtc3tVc2VyUGFzc3dvcmR9ID0gJFVzZXJPYmplY3QtPkdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoKTsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhID0gJFVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJEdldFBhcmFtc3tVc2VyTG9naW59ICk7CiAgICAgICAgaWYgKCAkVXNlckRhdGF7VXNlcklEfSB8fCAhJEdldFBhcmFtc3tVc2VyTG9naW59ICkgewoKICAgICAgICAgICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NpZ251cEVycm9yJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdUaGlzIGUtbWFpbCBhZGRyZXNzIGFscmVhZHkgZXhpc3RzLiBQbGVhc2UgbG9nIGluIG9yIHJlc2V0IHlvdXIgcGFzc3dvcmQuJyksCiAgICAgICAgICAgICAgICBVc2VyVGl0bGUgICAgID0+ICRHZXRQYXJhbXN7VXNlclRpdGxlfSwKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJEdldFBhcmFtc3tVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJEdldFBhcmFtc3tVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAkR2V0UGFyYW1ze1VzZXJFbWFpbH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBtYWlsIGFkZHJlc3MgcmVzdHJpY3Rpb25zCiAgICAgICAgbXkgQFdoaXRlbGlzdCA9IEB7CiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbENyZWF0ZUFjY291bnQ6Ok1haWxSZXN0cmljdGlvbnM6OldoaXRlbGlzdCcpIC8vIFtdCiAgICAgICAgfTsKICAgICAgICBteSBAQmxhY2tsaXN0ID0gQHsKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudDo6TWFpbFJlc3RyaWN0aW9uczo6QmxhY2tsaXN0JykgLy8gW10KICAgICAgICB9OwoKICAgICAgICBteSAkV2hpdGVsaXN0TWF0Y2hlZDsKICAgICAgICBmb3IgbXkgJFdoaXRlbGlzdEVudHJ5IChAV2hpdGVsaXN0KSB7CiAgICAgICAgICAgIG15ICRSZWdleCA9IGV2YWwge3FyLyRXaGl0ZWxpc3RFbnRyeS9pfTsKICAgICAgICAgICAgaWYgKCRAKSB7CiAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgY3VzdG9tZXIgcGFuZWwgbWFpbCBhZGRyZXNzIHdoaXRlbGlzdCBjb250YWlucyB0aGUgaW52YWxpZCByZWd1bGFyIGV4cHJlc3Npb24gJFdoaXRlbGlzdEVudHJ5LCBwbGVhc2UgY2hlY2sgYW5kIGNvcnJlY3QgaXQuJwogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXN7VXNlckVtYWlsfSA9fiAkUmVnZXggKSB7CiAgICAgICAgICAgICAgICAkV2hpdGVsaXN0TWF0Y2hlZCsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRCbGFja2xpc3RNYXRjaGVkOwogICAgICAgIGZvciBteSAkQmxhY2tsaXN0RW50cnkgKEBCbGFja2xpc3QpIHsKICAgICAgICAgICAgbXkgJFJlZ2V4ID0gZXZhbCB7cXIvJEJsYWNrbGlzdEVudHJ5L2l9OwogICAgICAgICAgICBpZiAoJEApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoZSBjdXN0b21lciBwYW5lbCBtYWlsIGFkZHJlc3MgYmxhY2tsaXN0IGNvbnRhaW5zIHRoZSBpbnZhbGlkIHJlZ3VsYXIgZXhwcmVzc2lvbiAkQmxhY2tsaXN0RW50cnksIHBsZWFzZSBjaGVjayBhbmQgY29ycmVjdCBpdC4nCiAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFtc3tVc2VyRW1haWx9ID1+ICRSZWdleCApIHsKICAgICAgICAgICAgICAgICRCbGFja2xpc3RNYXRjaGVkKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggKCBAV2hpdGVsaXN0ICYmICEkV2hpdGVsaXN0TWF0Y2hlZCApIHx8ICggQEJsYWNrbGlzdCAmJiAkQmxhY2tsaXN0TWF0Y2hlZCApICkgewoKICAgICAgICAgICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NpZ251cEVycm9yJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgdG8gcmVnaXN0ZXIuIFBsZWFzZSBjb250YWN0IHN1cHBvcnQgc3RhZmYuJyksCiAgICAgICAgICAgICAgICBVc2VyVGl0bGUgICAgID0+ICRHZXRQYXJhbXN7VXNlclRpdGxlfSwKICAgICAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJEdldFBhcmFtc3tVc2VyRmlyc3RuYW1lfSwKICAgICAgICAgICAgICAgIFVzZXJMYXN0bmFtZSAgPT4gJEdldFBhcmFtc3tVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAkR2V0UGFyYW1ze1VzZXJFbWFpbH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBhY2NvdW50CiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJyk7CgogICAgICAgIG15ICROb3cgPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgICAgIG15ICRBZGQgPSAkVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQWRkKAogICAgICAgICAgICAlR2V0UGFyYW1zLAogICAgICAgICAgICBDb21tZW50ID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSggJ0FkZGVkIHZpYSBDdXN0b21lciBQYW5lbCAoJXMpJywgJE5vdyApLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkQWRkICkgewoKICAgICAgICAgICAgIyBzZW5kIGRhdGEgdG8gSlMKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJ1NpZ251cEVycm9yJywKICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgICAgICAgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgICAgICAgPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciB1c2VyIGNhblwndCBiZSBhZGRlZCEnKSwKICAgICAgICAgICAgICAgIFVzZXJUaXRsZSAgICAgPT4gJEdldFBhcmFtc3tVc2VyVGl0bGV9LAogICAgICAgICAgICAgICAgVXNlckZpcnN0bmFtZSA9PiAkR2V0UGFyYW1ze1VzZXJGaXJzdG5hbWV9LAogICAgICAgICAgICAgICAgVXNlckxhc3RuYW1lICA9PiAkR2V0UGFyYW1ze1VzZXJMYXN0bmFtZX0sCiAgICAgICAgICAgICAgICBVc2VyRW1haWwgICAgID0+ICRHZXRQYXJhbXN7VXNlckVtYWlsfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2VuZCBub3RpZnkgZW1haWwKICAgICAgICBteSAkRW1haWxPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW1haWwnKTsKICAgICAgICBteSAkQm9keSAgICAgICAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxCb2R5TmV3QWNjb3VudCcpCiAgICAgICAgICAgIHx8ICdObyBDb25maWcgT3B0aW9uIGZvdW5kISc7CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxTdWJqZWN0TmV3QWNjb3VudCcpCiAgICAgICAgICAgIHx8ICdOZXcgT1RPQk8gQWNjb3VudCEnOwogICAgICAgIGZvciAoIHNvcnQga2V5cyAlR2V0UGFyYW1zICkgewogICAgICAgICAgICAkQm9keSA9fiBzLzxPVE9CT18kXz4vJEdldFBhcmFtc3skX30vZ2k7CiAgICAgICAgfQoKICAgICAgICAjIHNlbmQgYWNjb3VudCBpbmZvCiAgICAgICAgbXkgJFNlbnQgPSAkRW1haWxPYmplY3QtPlNlbmQoCiAgICAgICAgICAgIFRvICAgICAgID0+ICRHZXRQYXJhbXN7VXNlckVtYWlsfSwKICAgICAgICAgICAgU3ViamVjdCAgPT4gJFN1YmplY3QsCiAgICAgICAgICAgIENoYXJzZXQgID0+ICRMYXlvdXRPYmplY3QtPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgIE1pbWVUeXBlID0+ICd0ZXh0L3BsYWluJywKICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHkKICAgICAgICApOwogICAgICAgIGlmICggISRTZW50LT57U3VjY2Vzc30gKSB7CiAgICAgICAgICAgIHJldHVybiBqb2luICcnLAogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJIZWFkZXIoCiAgICAgICAgICAgICAgICAgICAgQXJlYSAgPT4gJ0NvcmUnLAogICAgICAgICAgICAgICAgICAgIFRpdGxlID0+ICdFcnJvcicKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5DdXN0b21lcldhcm5pbmcoCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ0NhblwndCBzZW5kIGFjY291bnQgaW5mbyEnKQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc2VudCBhY2NvdW50IGluZm8KICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAjIHJlZGlyZWN0IHRvIGFsdGVybmF0ZSBsb2dpbgogICAgICAgICAgICAkUGFyYW17UmVxdWVzdGVkVVJMfSA9ICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpCiAgICAgICAgICAgICAgICAgICAgLiAiP1JlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfTtVc2VyPSRHZXRQYXJhbXN7VXNlckxvZ2lufTsiCiAgICAgICAgICAgICAgICAgICAgLiAiRW1haWw9JEdldFBhcmFtc3tVc2VyRW1haWx9O1JlYXNvbj1OZXdBY2NvdW50Q3JlYXRlZCIsCiAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQoKICAgICAgICBteSAkQWNjb3VudENyZWF0ZWRNZXNzYWdlID0gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAnTmV3IGFjY291bnQgY3JlYXRlZC4gU2VudCBsb2dpbiBpbmZvcm1hdGlvbiB0byAlcy4gUGxlYXNlIGNoZWNrIHlvdXIgZW1haWwuJywKICAgICAgICAgICAgJEdldFBhcmFtc3tVc2VyRW1haWx9LAogICAgICAgICk7CgogICAgICAgICMgbG9naW4gc2NyZWVuCiAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICdMb2dpbicsCiAgICAgICAgICAgIE1lc3NhZ2UgICAgID0+ICRBY2NvdW50Q3JlYXRlZE1lc3NhZ2UsCiAgICAgICAgICAgIFVzZXIgICAgICAgID0+ICRHZXRQYXJhbXN7VXNlckxvZ2lufSwKICAgICAgICAgICAgTWVzc2FnZVR5cGUgPT4gJ1N1Y2Nlc3MnLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGxvZ2luIHNpdGUKICAgIGVsc2lmICggISRQYXJhbXtTZXNzaW9uSUR9ICkgewoKICAgICAgICAjIGNyZWF0ZSBBdXRoT2JqZWN0CiAgICAgICAgbXkgJEF1dGhPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGgnKTsKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwogICAgICAgIGlmICggJEF1dGhPYmplY3QtPkdldE9wdGlvbiggV2hhdCA9PiAnUHJlQXV0aCcgKSApIHsKCiAgICAgICAgICAgICMgYXV0b21hdGljIGxvZ2luCiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgIG15ICRQcmVBdXRoID0gJEF1dGhPYmplY3QtPlByZUF1dGgoCiAgICAgICAgICAgICAgICBSZXF1ZXN0ZWRVUkwgPT4gJFBhcmFte1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRQcmVBdXRoICYmICRQcmVBdXRoLT57UmVkaXJlY3RVUkx9ICkgewoKICAgICAgICAgICAgICAgICMgYWx3YXlzIHNldCBhIGNvb2tpZSwgc28gdGhhdAogICAgICAgICAgICAgICAgIyB3ZSBrbm93IGFscmVhZHkgaWYgdGhlIGJyb3dzZXIgc3VwcG9ydHMgY29va2llcy4KICAgICAgICAgICAgICAgICMgKCB0aGUgc2Vzc2lvbiBjb29raWUgaXNuJ3QgYXZhaWxhYmxlIGF0IHRoYXQgdGltZSApLgoKICAgICAgICAgICAgICAgIG15ICRFeHBpcmVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKQogICAgICAgICAgICAgICAgICAgID8KICAgICAgICAgICAgICAgICAgICAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncycKICAgICAgICAgICAgICAgICAgICA6CiAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICAgICAgIyBzZXQgYSBjb29raWUgdGVudGF0aXZlbHkgZm9yIGNoZWNraW5nIGNvb2tpZSBzdXBwb3J0CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5TZXRDb29raWUoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICA9PiAnT1RPQk9Ccm93c2VySGFzQ29va2llJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBFeHBpcmVzID0+ICRFeHBpcmVzLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJFByZUF1dGgtPntSZWRpcmVjdFVSTH0sCiAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICJBY3Rpb249UHJlTG9naW4mUmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgKTsgICAgICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQogICAgICAgIGVsc2lmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgRXh0VVJMID0+ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykKICAgICAgICAgICAgICAgICAgICAuICI/UmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgKTsgICAgICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawogICAgICAgIG15ICVFeHRlbmRlZEF1dGhQYXJhbXM7CiAgICAgICAgZm9yIG15ICROYW1lICggJEF1dGhPYmplY3QtPkV4dGVuZGVkUGFyYW1OYW1lcygpICkgewogICAgICAgICAgICBteSAkRXh0UGFyYW0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBSYXcgICA9PiAxCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRXh0UGFyYW0gKSB7CiAgICAgICAgICAgICAgICAkRXh0ZW5kZWRBdXRoUGFyYW1zeyROYW1lfSA9ICRFeHRQYXJhbTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyByZWRpcmVjdCBkaXJlY3RseSB0byBMb2dpbiBpZiBuZWNlc3NhcnkgcGFyYW1ldGVycyBhcmUgcHJlc2VudAogICAgICAgIGlmICggJUV4dGVuZGVkQXV0aFBhcmFtcyApIHsKICAgICAgICAgICAgbXkgJExvZ2luU3RyaW5nID0gJ0FjdGlvbj1Mb2dpbic7CiAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAlRXh0ZW5kZWRBdXRoUGFyYW1zICkgewogICAgICAgICAgICAgICAgJExvZ2luU3RyaW5nIC49ICI7JEtleT0kRXh0ZW5kZWRBdXRoUGFyYW1zeyRLZXl9IjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkUGFyYW17UmVxdWVzdGVkVVJMfSApOwogICAgICAgICAgICBwcmludCAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgIE9QID0+ICIkTG9naW5TdHJpbmc7UmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgRU8gT25lVGltZUF1dGhlbnRpY2F0aW9uTGluawoKICAgICAgICAjIGxvZ2luIHNjcmVlbgogICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5DdXN0b21lckxvZ2luKAogICAgICAgICAgICBUaXRsZSA9PiAnTG9naW4nLAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJ1biBtb2R1bGVzIGlmIGEgdmVyc2lvbiB2YWx1ZSBleGlzdHMKICAgIGVsc2lmICggJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+UmVxdWlyZSgiS2VybmVsOjpNb2R1bGVzOjokUGFyYW17QWN0aW9ufSIpICkgewoKICAgICAgICAjIGNoZWNrIHNlc3Npb24gaWQKICAgICAgICBpZiAoICEkU2Vzc2lvbk9iamVjdC0+Q2hlY2tTZXNzaW9uSUQoIFNlc3Npb25JRCA9PiAkUGFyYW17U2Vzc2lvbklEfSApICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IExheW91dE9iamVjdCB3aXRoIG5ldyAnJVBhcmFtJwogICAgICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICAgICAgICAgIFNldENvb2tpZXMgPT4ge30sCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZGVsZXRlIHRoZSBPVE9CTyBzZXNzaW9uIGNvb2tpZQogICAgICAgICAgICBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0LT5TZXRDb29raWUoCiAgICAgICAgICAgICAgICBSZWdpc3RlckluT00gPT4gMSwKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnU2Vzc2lvbklEQ29va2llJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgRXhwaXJlcyAgICAgID0+ICctMXknLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBpZiB0aGUgd3Jvbmcgc2NoZW1lIGlzIHVzZWQsIGRlbGV0ZSBhbHNvIHRoZSAib3RoZXIiIGNvb2tpZSAtIGlzc3VlICMyNTEKICAgICAgICAgICAgbXkgKCRSZXF1ZXN0U2NoZW1lKSA9IHNwbGl0IC9cLy8sICRQYXJhbU9iamVjdC0+U2VydmVyUHJvdG9jb2wsIDI7CiAgICAgICAgICAgIGlmICggJFJlcXVlc3RTY2hlbWUgbmUgJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAgICAgICAgICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0JyA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFNldENvb2tpZXMgPT4ge30sCiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGRlbGV0ZSB0aGUgT1RPQk8gc2Vzc2lvbiBjb29raWUKICAgICAgICAgICAgICAgICMgVE9ETzogdGhlIE5hbWUgaXMgdXNlZCB0d2ljZQogICAgICAgICAgICAgICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVySW5PTSA9PiAxLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnU2Vzc2lvbklEQ29va2llaHR0cCcsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRQYXJhbXtTZXNzaW9uTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgICAgIEV4cGlyZXMgICAgICA9PiAnLTF5JywKICAgICAgICAgICAgICAgICAgICBTZWN1cmUgICAgICAgPT4gJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVySW5PTSA9PiAxLAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgICA9PiAnU2Vzc2lvbklEQ29va2llaHR0cHMnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkUGFyYW17U2Vzc2lvbk5hbWV9LAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBFeHBpcmVzICAgICAgPT4gJy0xeScsCiAgICAgICAgICAgICAgICAgICAgU2VjdXJlICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+T2JqZWN0c0Rpc2NhcmQoIE9iamVjdHMgPT4gWydLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0J10gKTsKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgY3JlYXRlIEF1dGhPYmplY3QKICAgICAgICAgICAgbXkgJEF1dGhPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoJyk7CiAgICAgICAgICAgIGlmICggJEF1dGhPYmplY3QtPkdldE9wdGlvbiggV2hhdCA9PiAnUHJlQXV0aCcgKSApIHsKCiAgICAgICAgICAgICAgICAjIGF1dG9tYXRpYyByZS1sb2dpbgogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVlc3RlZFVSTH0gPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCAkUGFyYW17UmVxdWVzdGVkVVJMfSApOwoKICAgICAgICAgICAgICAgIG15ICRQcmVBdXRoID0gJEF1dGhPYmplY3QtPlByZUF1dGgoCiAgICAgICAgICAgICAgICAgICAgUmVxdWVzdGVkVVJMID0+ICRQYXJhbXtSZXF1ZXN0ZWRVUkx9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRQcmVBdXRoICYmICRQcmVBdXRoLT57UmVkaXJlY3RVUkx9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGFsd2F5cyBzZXQgYSBjb29raWUsIHNvIHRoYXQKICAgICAgICAgICAgICAgICAgICAjIHdlIGtub3cgYWxyZWFkeSBpZiB0aGUgYnJvd3NlciBzdXBwb3J0cyBjb29raWVzLgogICAgICAgICAgICAgICAgICAgICMgKCB0aGUgc2Vzc2lvbiBjb29raWUgaXNuJ3QgYXZhaWxhYmxlIGF0IHRoYXQgdGltZSApLgoKICAgICAgICAgICAgICAgICAgICBteSAkRXhwaXJlcyA9ICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvblVzZUNvb2tpZUFmdGVyQnJvd3NlckNsb3NlJykKICAgICAgICAgICAgICAgICAgICAgICAgPwogICAgICAgICAgICAgICAgICAgICAgICAnKycgLiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1Nlc3Npb25NYXhUaW1lJykgLiAncycKICAgICAgICAgICAgICAgICAgICAgICAgOgogICAgICAgICAgICAgICAgICAgICAgICAnJzsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgYSBjb29raWUgdGVudGF0aXZlbHkgZm9yIGNoZWNraW5nIGNvb2tpZSBzdXBwb3J0CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+U2V0Q29va2llKAogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgID0+ICdPVE9CT0Jyb3dzZXJIYXNDb29raWUnLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgIEV4cGlyZXMgPT4gJEV4cGlyZXMsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkUHJlQXV0aC0+e1JlZGlyZWN0VVJMfSwKICAgICAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIE9QID0+ICI/QWN0aW9uPVByZUxvZ2luJlJlcXVlc3RlZFVSTD0kUGFyYW17UmVxdWVzdGVkVVJMfSIsCiAgICAgICAgICAgICAgICApOyAgICAgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbExvZ2luVVJMJykgKSB7CgogICAgICAgICAgICAgICAgIyByZWRpcmVjdCB0byBhbHRlcm5hdGUgbG9naW4KICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ID0gJExheW91dE9iamVjdC0+TGlua0VuY29kZSggJFBhcmFte1JlcXVlc3RlZFVSTH0gKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICAgICAgICAgICAgICBFeHRVUkwgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKQogICAgICAgICAgICAgICAgICAgICAgICAuICI/UmVhc29uPUludmFsaWRTZXNzaW9uSUQmUmVxdWVzdGVkVVJMPSRQYXJhbXtSZXF1ZXN0ZWRVUkx9IiwKICAgICAgICAgICAgICAgICk7ICAgICAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgbG9naW4KICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyTG9naW4oCiAgICAgICAgICAgICAgICBUaXRsZSAgID0+ICdMb2dpbicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKCAkU2Vzc2lvbk9iamVjdC0+U2Vzc2lvbklERXJyb3JNZXNzYWdlKCkgKSwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHNlc3Npb24gZGF0YQogICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZXNzaW9uT2JqZWN0LT5HZXRTZXNzaW9uSUREYXRhKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFVzZXJEYXRhe1VzZXJUaW1lWm9uZX0gPSBfVXNlclRpbWVab25lR2V0KCVVc2VyRGF0YSk7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgICAgICBpZiAoICEkVXNlckRhdGF7VXNlcklEfSB8fCAhJFVzZXJEYXRhe1VzZXJMb2dpbn0gfHwgJFVzZXJEYXRhe1VzZXJUeXBlfSBuZSAnQ3VzdG9tZXInICkgewoKICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gYWx0ZXJuYXRlIGxvZ2luCiAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsTG9naW5VUkwnKSApIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KAogICAgICAgICAgICAgICAgICAgIEV4dFVSTCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyUGFuZWxMb2dpblVSTCcpIC4gJz9SZWFzb249U3lzdGVtRXJyb3InLAogICAgICAgICAgICAgICAgKTsgICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGxvZ2luIHNjcmVlbgogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+Q3VzdG9tZXJMb2dpbigKICAgICAgICAgICAgICAgIFRpdGxlICAgPT4gJ0Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gVHJhbnNsYXRhYmxlKCdFcnJvcjogaW52YWxpZCBzZXNzaW9uLicpLAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBtb2R1bGUgcmVnaXN0cnkKICAgICAgICBteSAkTW9kdWxlUmVnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17QWN0aW9ufSB9OwogICAgICAgIGlmICggISRNb2R1bGVSZWcgKSB7CgogICAgICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICAgICAiTW9kdWxlIEtlcm5lbDo6TW9kdWxlczo6JFBhcmFte0FjdGlvbn0gbm90IHJlZ2lzdGVyZWQgaW4gS2VybmVsL0NvbmZpZy5wbSEiLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiBUcmFuc2xhdGFibGUoJ1BsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicpLAogICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgIH0KCiAgICAgICAgIyBtb2R1bGUgcGVybWlzc2lvbiBjaGVjayBmb3IgYWN0aW9uCiAgICAgICAgaWYgKAogICAgICAgICAgICByZWYgJE1vZHVsZVJlZy0+e0dyb3VwUm99IGVxICdBUlJBWScKICAgICAgICAgICAgJiYgIXNjYWxhciBAeyAkTW9kdWxlUmVnLT57R3JvdXBSb30gfQogICAgICAgICAgICAmJiByZWYgJE1vZHVsZVJlZy0+e0dyb3VwfSBlcSAnQVJSQVknCiAgICAgICAgICAgICYmICFzY2FsYXIgQHsgJE1vZHVsZVJlZy0+e0dyb3VwfSB9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSb30gPSAxOwogICAgICAgICAgICAkUGFyYW17QWNjZXNzUnd9ID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAoICRQYXJhbXtBY2Nlc3NSb30sICRQYXJhbXtBY2Nlc3NSd30gKSA9IF9DaGVja01vZHVsZVBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBNb2R1bGVSZWcgPT4gJE1vZHVsZVJlZywKICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRQYXJhbXtBY2Nlc3NSb30gKSB7CgogICAgICAgICAgICAgICAgIyBuZXcgbGF5b3V0IG9iamVjdAogICAgICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIFBlcm1pc3Npb24gdG8gdXNlIHRoaXMgZnJvbnRlbmQgYWN0aW9uIG1vZHVsZSEnCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJyksCiAgICAgICAgICAgICAgICApOyAgICAjIHRocm93cyBhIEtlcm5lbDo6U3lzdGVtOjpXZWI6OkV4Y2VwdGlvbgogICAgICAgICAgICB9CgogICAgICAgIH0KCiAgICAgICAgbXkgJE5hdmlnYXRpb25Db25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5hdmlnYXRpb24nKS0+eyAkUGFyYW17QWN0aW9ufSB9OwoKICAgICAgICAjIG1vZHVsZSBwZXJtaXNzaW9uIGNoZWNrIGZvciBzdWJtZW51IGl0ZW0KICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCROYXZpZ2F0aW9uQ29uZmlnKSApIHsKCiAgICAgICAgICAgIEtFWToKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskTmF2aWdhdGlvbkNvbmZpZ30gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiAkS2V5ICAgICAgICAgICAgICAgICAhfiBtL15cZCsvaTsKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICRQYXJhbXtSZXF1ZXN0ZWRVUkx9ICF+IG0vU3ViYWN0aW9uL2k7CgogICAgICAgICAgICAgICAgbXkgQE1vZHVsZU5hdmlnYXRpb25Db25maWdzOwoKICAgICAgICAgICAgICAgICMgRklYTUU6IFN1cHBvcnQgYm90aCBvbGQgKEhBU0gpIGFuZCBuZXcgKEFSUkFZIG9mIEhBU0gpIG5hdmlnYXRpb24gY29uZmlndXJhdGlvbnMsIGZvciByZWFzb25zIG9mCiAgICAgICAgICAgICAgICAjICAgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIE9uY2Ugd2UgYXJlIHN1cmUgZXZlcnl0aGluZyBoYXMgYmVlbiBtaWdyYXRlZCBjb3JyZWN0bHksIHN1cHBvcnQgZm9yCiAgICAgICAgICAgICAgICAjICAgSEFTSC1vbmx5IGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRyb3BwZWQgaW4gZnV0dXJlIG1ham9yIHJlbGVhc2UuCiAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCAkTmF2aWdhdGlvbkNvbmZpZy0+eyRLZXl9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATW9kdWxlTmF2aWdhdGlvbkNvbmZpZ3MsICROYXZpZ2F0aW9uQ29uZmlnLT57JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJE5hdmlnYXRpb25Db25maWctPnskS2V5fSApICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQE1vZHVsZU5hdmlnYXRpb25Db25maWdzLCBAeyAkTmF2aWdhdGlvbkNvbmZpZy0+eyRLZXl9IH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBTa2lwIGluY29tcGF0aWJsZSBjb25maWd1cmF0aW9uLgogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgSVRFTToKICAgICAgICAgICAgICAgIGZvciBteSAkSXRlbSAoQE1vZHVsZU5hdmlnYXRpb25Db25maWdzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9ICF+IG0vU3ViYWN0aW9uPS9pCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRJdGVtLT57TGlua30gIX4gbS8kUGFyYW17U3ViYWN0aW9ufS9pCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgSVRFTTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1JvfSA9IDA7CiAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1J3fSA9IDA7CgogICAgICAgICAgICAgICAgICAgICMgbW9kdWxlIHBlcm1pc3Npb24gY2hlY2sgZm9yIHN1Ym1lbnUgaXRlbQogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgcmVmICRJdGVtLT57R3JvdXBSb30gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXBSb30gfQogICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJEl0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICAmJiAhc2NhbGFyIEB7ICRJdGVtLT57R3JvdXB9IH0KICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0FjY2Vzc1JvfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtBY2Nlc3NSd30gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0FjY2Vzc1JvfSwgJFBhcmFte0FjY2Vzc1J3fSApID0gX0NoZWNrTW9kdWxlUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRQYXJhbXtBY2Nlc3NSb30gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBuZXcgbGF5b3V0IG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05vIFBlcm1pc3Npb24gdG8gdXNlIHRoaXMgZnJvbnRlbmQgc3ViYWN0aW9uIG1vZHVsZSEnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkN1c3RvbWVyRmF0YWxFcnJvcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+IFRyYW5zbGF0YWJsZSgnUGxlYXNlIGNvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3IuJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7ICAgICMgdGhyb3dzIGEgS2VybmVsOjpTeXN0ZW06OldlYjo6RXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyBMYXlvdXRPYmplY3Qgd2l0aCBuZXcgJyVQYXJhbScgYW5kICclVXNlckRhdGEnCiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdFBhcmFtQWRkKAogICAgICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgTW9kdWxlUmVnID0+ICRNb2R1bGVSZWcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJEtlcm5lbDo6T00tPk9iamVjdHNEaXNjYXJkKCBPYmplY3RzID0+IFsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCddICk7CgogICAgICAgICMgdXBkYXRlIGxhc3QgcmVxdWVzdCB0aW1lCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFtT2JqZWN0LT5Jc0FKQVhSZXF1ZXN0KCkKICAgICAgICAgICAgfHwgJFBhcmFte0FjdGlvbn0gZXEgJ0N1c3RvbWVyVmlkZW9DaGF0JwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKCiAgICAgICAgICAgICRTZXNzaW9uT2JqZWN0LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFBhcmFte1Nlc3Npb25JRH0sCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJ1VzZXJMYXN0UmVxdWVzdCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJERhdGVUaW1lT2JqZWN0LT5Ub0Vwb2NoKCksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHByZSBhcHBsaWNhdGlvbiBtb2R1bGUKICAgICAgICBteSAkUHJlTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclBhbmVsUHJlQXBwbGljYXRpb25Nb2R1bGUnKTsKICAgICAgICBpZiAoICRQYXJhbXtBY3Rpb259IG5lICdDdXN0b21lckdlbmVyaWNDb250ZW50JyAmJiAkUHJlTW9kdWxlICkgewogICAgICAgICAgICBteSAlUHJlTW9kdWxlTGlzdDsKICAgICAgICAgICAgaWYgKCByZWYgJFByZU1vZHVsZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICAlUHJlTW9kdWxlTGlzdCA9ICV7JFByZU1vZHVsZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUHJlTW9kdWxlTGlzdHtJbml0fSA9ICRQcmVNb2R1bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE1PRFVMRToKICAgICAgICAgICAgZm9yIG15ICRQcmVNb2R1bGVLZXkgKCBzb3J0IGtleXMgJVByZU1vZHVsZUxpc3QgKSB7CiAgICAgICAgICAgICAgICBteSAkUHJlTW9kdWxlID0gJFByZU1vZHVsZUxpc3R7JFByZU1vZHVsZUtleX07CiAgICAgICAgICAgICAgICBuZXh0IE1PRFVMRSBpZiAhJFByZU1vZHVsZTsKICAgICAgICAgICAgICAgIG5leHQgTU9EVUxFIGlmICEkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5SZXF1aXJlKCRQcmVNb2R1bGUpOwoKICAgICAgICAgICAgICAgICMgZGVidWcgaW5mbwogICAgICAgICAgICAgICAgaWYgKCREZWJ1ZykgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJQYW5lbFByZUFwcGxpY2F0aW9uIG1vZHVsZSAkUHJlTW9kdWxlIGlzIHVzZWQuIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgICAgICAgICAgICAgIyB1c2UgbW9kdWxlCiAgICAgICAgICAgICAgICBteSAkUHJlTW9kdWxlT2JqZWN0ID0gJFByZU1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgPSAkUHJlTW9kdWxlT2JqZWN0LT5QcmVSdW4oKTsKCiAgICAgICAgICAgICAgICByZXR1cm4gJE91dHB1dCBpZiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICBpZiAoJERlYnVnKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdLZXJuZWw6Ok1vZHVsZXM6OicgLiAkUGFyYW17QWN0aW9ufSAuICctPm5ldycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkRnJvbnRlbmRPYmplY3QgPSAoICdLZXJuZWw6Ok1vZHVsZXM6OicgLiAkUGFyYW17QWN0aW9ufSApLT5uZXcoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICBNb2R1bGVSZWcgPT4gJE1vZHVsZVJlZywKICAgICAgICAgICAgRGVidWcgICAgID0+ICREZWJ1ZywKICAgICAgICApOwoKICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICBpZiAoJERlYnVnKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdLZXJuZWw6Ok1vZHVsZXM6OicgLiAkUGFyYW17QWN0aW9ufSAuICctPnJ1bicsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEdlbmVyYXRlIG91dHB1dCB1c2luZyB0aGUgZnJvbnRlbmQsIHRoYXQgaXMgS2VybmVsOjpNb2R1bGVzOjoqLCBvYmplY3QuCiAgICAgICAgIyBUaGUgb3V0cHV0IGlzIGVpdGhlciBhIHN0cmluZyBvciBhIElPOjpIYW5kbGUgbGlrZSBvYmplY3QuCiAgICAgICAgcmV0dXJuICRGcm9udGVuZE9iamVjdC0+UnVuKCk7CiAgICB9CgogICAgIyB0aHJvd3MgYSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpFeGNlcHRpb24KICAgIG15ICVEYXRhID0gJFNlc3Npb25PYmplY3QtPkdldFNlc3Npb25JRERhdGEoCiAgICAgICAgU2Vzc2lvbklEID0+ICRQYXJhbXtTZXNzaW9uSUR9LAogICAgKTsKICAgICREYXRhe1VzZXJUaW1lWm9uZX0gPSBfVXNlclRpbWVab25lR2V0KCVEYXRhKTsKICAgICRLZXJuZWw6Ok9NLT5PYmplY3RQYXJhbUFkZCgKICAgICAgICAnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVEYXRhLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+Q3VzdG9tZXJGYXRhbEVycm9yKAogICAgICAgIENvbW1lbnQgPT4gVHJhbnNsYXRhYmxlKCdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4nKSwKICAgICk7Cn0KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgcHJlcGFyZV9hcHAoKQoKVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IEM8dG9fYXBwKCk+LiBJdCBjYW4gYmUgdXNlZAp0byBzZXQgdXAgdGhpbmdzIHdoaWxlIHRoZSBQbGFjayBhcHBsaWNhdGlvbiBpcyBidWlsdC4KCj1jdXQKCnN1YiBwcmVwYXJlX2FwcCB7CiAgICBteSAoJFNlbGYpID0gQF87CgogICAgJFNlbGYtPntEZWJ1Z30gfHw9IDA7CiAgICAkU2VsZi0+e0ludGVyZmFjZX0gPSBfX1BBQ0tBR0VfXyA9fiBzLy4qOjooXHcrKSQvJDEvcjsKCiAgICByZXR1cm47Cn0KCj1oZWFkMiBjYWxsKCkKCkNyZWF0ZSBhIFBTR0kgUmVzcG9uc2UgZnJvbSB0aGUgY29udGVudCBnZW5lcmF0ZWQgYnkgQzxfQ29udGVudCgpPi4KVGhpcyBpcyB0aGUgc3Vicm91dGluZSB0aGF0IGlzIGNhbGxlZCBpbiBGPG90b2JvLnBzZ2k+LgoKVGhpcyBtZXRob2QgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIHRoYXQgbXVzdCBiZSBoYW5kbGVkCmluIGFuIG91dGVyIG1pZGRsZXdhcmUuCgo9Y3V0CgpzdWIgY2FsbCB7CiAgICBteSAoICRTZWxmLCAkRW52ICkgPSBAXzsKCiAgICBteSAkRGVidWcgPSAkU2VsZi0+e0RlYnVnfTsKCiAgICAjIFRoZSBPVE9CTyBtb2R1bGVzIHdoaWNoIGdlbmVyYXRlIHRoZSBjb250ZW50IGdldCB0aGVpciBpbnB1dAogICAgIyBmcm9tIHRoZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0IHNpbmdsZXRvbiwgdGhhdCBpcyB0aGUgUGFyYW1PYmplY3QuCiAgICAjIE1ha2UgdGhlIFBTR0kgZW52aXJvbm1lbnQgYXZhaWxhYmxlIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgUGFyYW1PYmplY3QuCiAgICAkS2VybmVsOjpPTS0+T2JqZWN0UGFyYW1BZGQoCiAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnID0+IHsKICAgICAgICAgICAgUFNHSUVudiA9PiAkRW52LAogICAgICAgIH0sCiAgICApOwoKICAgICMgZGVidWcgaW5mbwogICAgaWYgKCREZWJ1ZykgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiUGxhY2sgYXBwICRTZWxmLT57SW50ZXJmYWNlfSBzdGFydGVkIiwKICAgICAgICApOwogICAgfQoKICAgICMgTm90ZSB0aGF0IHRoZSBsYXlvdXQgb2JqZWN0IG11c3RuJ3QgYmUgY3JlYXRlZCBiZWZvcmUgY2FsbGluZyBfQ29udGVudCgpLgogICAgIyBUaGlzIGlzIGJlY2F1c2UgX0NvbnRlbnQoKSBtaWdodCB3YW50IHRvIHNldCBvYmplY3QgcGFyYW1zIGJlZm9yZSB0aGUgaW5pdGlhbCBjcmVhdGlvbnMuCiAgICAjIEEgbm90YWJsZSBleGFtcGxlIGlzIHRoZSBTZXRDb29raWVzIHBhcmFtZXRlci4KICAgIG15ICRDb250ZW50ID0gX0NvbnRlbnQoIERlYnVnID0+ICREZWJ1ZyApOwoKICAgICMgVGhlIGZpbHRlcmVkIGNvbnRlbnQgaXMgYSBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgb3JpZ2luYWwgY29udGVudCBpcwogICAgIyBhIHN0cmluZywgYW4gYXJyYXkgcmVmZXJlbmNlLCBvciBhIGZpbGUgaGFuZGxlLgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgICRDb250ZW50ID0gJExheW91dE9iamVjdC0+QXBwbHlPdXRwdXRGaWx0ZXJzKCBPdXRwdXQgPT4gJENvbnRlbnQgKTsKCiAgICAjIFRoZSBIVFRQIGhlYWRlcnMgb2YgdGhlIE9UT0JPIHdlYiByZXNwb25zZSBvYmplY3QgYWxyZWFkeSBoYXZlIGJlZW4gc2V0IHVwLgogICAgIyBFbmhhbmNlIGl0IHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgYW5kIHRoZSBjb250ZW50LgogICAgcmV0dXJuICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlc3BvbnNlJyktPkZpbmFsaXplKAogICAgICAgIENvbnRlbnQgPT4gJENvbnRlbnQsCiAgICApOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aGVhZDIgX1N0b3JlRmFpbGVkTG9naW5zKCkKCj1jdXQKCnN1YiBfU3RvcmVGYWlsZWRMb2dpbnMgewogICAgbXkgKCVQYXJhbSkgPSBAXzsKCiAgICBteSAkQ3VycmVudFRpbWVPYmplY3QgICA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgbXkgJEN1cnJlbnROZXdUaW1lU3RhbXAgPSAkQ3VycmVudFRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CiAgICBteSAkQ2FjaGVPYmplY3QgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgbXkgJENoZWNrSGFzaCAgICAgICAgICAgPSAkQ2FjaGVPYmplY3QtPkdldCgKICAgICAgICBUeXBlID0+ICdGYWlsZWRMb2dpbnNDdXN0b21lcicsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgKTsKCiAgICBpZiAoICEkQ2hlY2tIYXNoICkgewogICAgICAgICRDYWNoZU9iamVjdC0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAnRmFpbGVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgICAgICBLZXkgICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiBbJEN1cnJlbnROZXdUaW1lU3RhbXBdLAogICAgICAgICAgICBUVEwgICA9PiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e0tlZXBDYWNoZUR1cmF0aW9ufSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBteSBATG9naW5UcnlBcnJheSA9IEB7JENoZWNrSGFzaH07CgogICAgIyBkZWxldGUgZXhwaXJlZCBjYWNoZSBlbnRyaWVzCiAgICBMT0dJTjoKICAgIGZvciBteSAkTG9naW5UaW1lICggQHskQ2hlY2tIYXNofSApIHsKICAgICAgICBteSAkTG9naW5UaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJExvZ2luVGltZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRPZmZzZXQgPSAkQ3VycmVudFRpbWVPYmplY3QtPkRlbHRhKAogICAgICAgICAgICBEYXRlVGltZU9iamVjdCA9PiAkTG9naW5UaW1lT2JqZWN0LAogICAgICAgICk7CgogICAgICAgIGlmICggJE9mZnNldC0+e0Fic29sdXRlU2Vjb25kc30gPiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9LT57S2VlcENhY2hlRHVyYXRpb259ICkgewogICAgICAgICAgICBzaGlmdCBATG9naW5UcnlBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxhc3QgTE9HSU47CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIG5ldyBmYWlsZWQgbG9naW4gdG8gY2FjaGUKICAgIHB1c2ggQExvZ2luVHJ5QXJyYXksICRDdXJyZW50TmV3VGltZVN0YW1wOwogICAgJENhY2hlT2JqZWN0LT5TZXQoCiAgICAgICAgVHlwZSAgPT4gJ0ZhaWxlZExvZ2luc0N1c3RvbWVyJywKICAgICAgICBLZXkgICA9PiAkUGFyYW17UG9zdFVzZXJ9LAogICAgICAgIFZhbHVlID0+IFxATG9naW5UcnlBcnJheSwKICAgICAgICBUVEwgICA9PiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e0tlZXBDYWNoZUR1cmF0aW9ufSwKICAgICk7CgogICAgaWYgKCBzY2FsYXIgQExvZ2luVHJ5QXJyYXkgPj0gJFBhcmFte1ByZXZlbnRCcnV0ZUZvcmNlQ29uZmlnfXtNYXhBdHRlbXB0fSApIHsKICAgICAgICAkQ2FjaGVPYmplY3QtPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0Jhbm5lZExvZ2luc0N1c3RvbWVyJywKICAgICAgICAgICAgS2V5ICAgPT4gJFBhcmFte1Bvc3RVc2VyfSwKICAgICAgICAgICAgVmFsdWUgPT4gJEN1cnJlbnROZXdUaW1lU3RhbXAsCiAgICAgICAgICAgIFRUTCAgID0+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317QmFuRHVyYXRpb259LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCnN1YiBfQ2hlY2tBbmRSZW1vdmVGcm9tQmFubmVkTGlzdCB7CiAgICBteSAoJVBhcmFtKSA9IEBfOwoKICAgICMgZ2V0IGNhY2hlCiAgICBteSAkQ2FjaGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKTsKCiAgICBteSAkQmFuVGltZSA9ICRDYWNoZU9iamVjdC0+R2V0KAogICAgICAgIFR5cGUgPT4gJ0Jhbm5lZExvZ2luc0N1c3RvbWVyJywKICAgICAgICBLZXkgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICApOwoKICAgIGlmICggISRCYW5UaW1lICkgewogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIEJhbm5lZCA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjYWxjdWxhdGUgZWxhcHNlZCB0aW1lCiAgICBteSAkQ3VyVGltZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpOwogICAgbXkgJEJhblRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnLAogICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgIFN0cmluZyA9PiAkQmFuVGltZSwKICAgICAgICB9LAogICAgKTsKICAgIG15ICRPZmZzZXQgPSAkQ3VyVGltZU9iamVjdC0+RGVsdGEoCiAgICAgICAgRGF0ZVRpbWVPYmplY3QgPT4gJEJhblRpbWVPYmplY3QsCiAgICApOwoKICAgICMgaWYgdGhlIGJhbiBkdXJhdGlvbiBoYXMgYmVlbiBzdXJwYXNzZWQsIGRlbGV0ZSB0aGUgY2FjaGUgZW50cnkKICAgIGlmICggJE9mZnNldC0+e0Fic29sdXRlU2Vjb25kc30gPiAkUGFyYW17UHJldmVudEJydXRlRm9yY2VDb25maWd9e0JhbkR1cmF0aW9ufSApIHsKICAgICAgICAkQ2FjaGVPYmplY3QtPkRlbGV0ZSgKICAgICAgICAgICAgVHlwZSA9PiAnQmFubmVkTG9naW5zQ3VzdG9tZXInLAogICAgICAgICAgICBLZXkgID0+ICRQYXJhbXtQb3N0VXNlcn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBCYW5uZWQgPT4gMCwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoCiAgICAgICAgQmFubmVkICAgICAgID0+IDEsCiAgICAgICAgUmVzaWR1YWxUaW1lID0+ICRQYXJhbXtQcmV2ZW50QnJ1dGVGb3JjZUNvbmZpZ317QmFuRHVyYXRpb259IC0gJE9mZnNldC0+e0Fic29sdXRlU2Vjb25kc30sCiAgICApOwp9Cgo9aGVhZDIgX0NoZWNrTW9kdWxlUGVybWlzc2lvbigpCgptb2R1bGUgcGVybWlzc2lvbiBjaGVjawoKICAgICgkQWNjZXNzUm8sICRBY2Nlc3NSdyA9ICRBdXRvUmVzcG9uc2VPYmplY3QtPl9DaGVja01vZHVsZVBlcm1pc3Npb24oCiAgICAgICAgTW9kdWxlUmVnID0+ICRNb2R1bGVSZWcsCiAgICAgICAgJVVzZXJEYXRhLAogICAgKTsKCj1jdXQKCnN1YiBfQ2hlY2tNb2R1bGVQZXJtaXNzaW9uIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgbXkgJEFjY2Vzc1JvID0gMDsKICAgIG15ICRBY2Nlc3NSdyA9IDA7CgogICAgUEVSTUlTU0lPTjoKICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKICAgICAgICBteSAkQWNjZXNzT2sgPSAwOwogICAgICAgIG15ICRHcm91cCAgICA9ICRQYXJhbXtNb2R1bGVSZWd9LT57JFBlcm1pc3Npb259OwoKICAgICAgICBuZXh0IFBFUk1JU1NJT04gaWYgISRHcm91cDsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyR3JvdXAnKTsKCiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJEdyb3VwKSApIHsKICAgICAgICAgICAgR1JPVVA6CiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7JEdyb3VwfSApIHsKICAgICAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgISRJdGVtOwogICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJEdyb3VwT2JqZWN0LT5QZXJtaXNzaW9uQ2hlY2soCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIEdyb3VwTmFtZSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nID8gJ3JvJyA6ICdydycsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRBY2Nlc3NPayA9IDE7CiAgICAgICAgICAgICAgICBsYXN0IEdST1VQOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkSGFzUGVybWlzc2lvbiA9ICRHcm91cE9iamVjdC0+UGVybWlzc2lvbkNoZWNrKAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICAgICAgR3JvdXBOYW1lID0+ICRHcm91cCwKICAgICAgICAgICAgICAgIFR5cGUgICAgICA9PiAkUGVybWlzc2lvbiBlcSAnR3JvdXBSbycgPyAncm8nIDogJ3J3JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRIYXNQZXJtaXNzaW9uKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzT2sgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFBlcm1pc3Npb24gZXEgJ0dyb3VwJyAmJiAkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICRBY2Nlc3NSbyA9IDE7CiAgICAgICAgICAgICRBY2Nlc3NSdyA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBlcm1pc3Npb24gZXEgJ0dyb3VwUm8nICYmICRBY2Nlc3NPayApIHsKICAgICAgICAgICAgJEFjY2Vzc1JvID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICggJEFjY2Vzc1JvLCAkQWNjZXNzUncgKTsKfQoKPWhlYWQyIF9Vc2VyVGltZVpvbmVHZXQoKQoKR2V0IHRpbWUgem9uZSBmb3IgdGhlIGN1cnJlbnQgdXNlci4gVGhpcyBmdW5jdGlvbiB3aWxsIHZhbGlkYXRlIHBhc3NlZCB0aW1lIHpvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gZGVmYXVsdCB1c2VyIHRpbWUKem9uZSBpZiBpdCdzIG5vdCB2YWxpZC4KCiAgICBteSAkVXNlclRpbWVab25lID0gX1VzZXJUaW1lWm9uZUdldCgKICAgICAgICBVc2VyVGltZVpvbmUgPT4gJ0V1cm9wZS9CZXJsaW4nLAogICAgKTsKCj1jdXQKCnN1YiBfVXNlclRpbWVab25lR2V0IHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgbXkgJFVzZXJUaW1lWm9uZTsKCiAgICAjIFJldHVybiBwYXNzZWQgdGltZSB6b25lIG9ubHkgaWYgaXQncyB2YWxpZC4gSXQgY2FuIGhhcHBlbiB0aGF0IHVzZXIgcHJlZmVyZW5jZXMgb3Igc2Vzc2lvbiBzdG9yZSBhbiBvbGQtc3R5bGUKICAgICMgICBvZmZzZXQgd2hpY2ggaXMgbm90IHZhbGlkIGFueW1vcmUuIEluIHRoaXMgY2FzZSwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgogICAgIyAgIFBsZWFzZSBzZWUgYnVnIzEzMzc0IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyVGltZVpvbmV9CiAgICAgICAgJiYgS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lLT5Jc1RpbWVab25lVmFsaWQoIFRpbWVab25lID0+ICRQYXJhbXtVc2VyVGltZVpvbmV9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFVzZXJUaW1lWm9uZSA9ICRQYXJhbXtVc2VyVGltZVpvbmV9OwogICAgfQoKICAgICRVc2VyVGltZVpvbmUgfHw9IEtlcm5lbDo6U3lzdGVtOjpEYXRlVGltZS0+VXNlckRlZmF1bHRUaW1lWm9uZUdldCgpOwoKICAgIHJldHVybiAkVXNlclRpbWVab25lOwp9Cgo9ZW5kIEludGVybmFsOgoKPWN1dAoKMTsK</File>
        <File Location="Kernel/Config/Files/XML/OneTimeAuthentificationLink.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VSZWZyZXNoRmFpbGVkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBtZXNzYWdlIHdoaWNoIHdpbGwgYmUgc2VudCB0byB0aGUgY3VzdG9tZXIgaWYgYSBsaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPkxpbmsga29ubnRlIG5pY2h0IGVyemV1Z3Qgd2VyZGVuLCBiaXR0ZSBzZW5kZW4gU2llIGVpbmUgZW1haWwgYW4gc3VwcG9ydEB3ZS5jb20uPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VMaW5rRXhwaXJlZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgbWVzc2FnZSB3aGljaCB0aGUgY3VzdG9tZXIgdXNlciB3aWxsIHNlZSBpZiBoZSB1c2VzIGFuIGludmFsaWQgdG9rZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPklociBMaW5rIHZlcndlaXN0IGF1ZiBrZWluIG5vY2ggZ8O8bHRpZ2VzIFRpY2tldC48L0l0ZW0+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9Ik9uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZVdyb25nTGluayIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaGUgbWVzc2FnZSB3aGljaCB0aGUgY3VzdG9tZXIgdXNlciB3aWxsIHNlZSBpZiBoZSB1c2VzIGFuIG9sZCB0b2tlbiB3aXRoIGFuIGFjdGl2ZSBvbmUgYWxyZWFkeSBiZWluZyBwcmVzZW50LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5BdXMgU2ljaGVyaGVpdHNncsO8bmRlbiBtw7xzc2VuIFNpZSBkZW4gbmV1ZXN0ZW4gSWhuZW4genVnZXNhbmR0ZW4gTGluayBudXR6ZW4gdW0gYXVmIGRpZXNlcyBUaWNrZXQgenV6dWdyZWlmZW4uPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VOZXdMaW5rIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBtZXNzYWdlIHdoaWNoIHRoZSBjdXN0b21lciB1c2VyIHdpbGwgc2VlIGlmIGEgbmV3IG9uZSBpcyBzZW50IHRvIGhpcyBlbWFpbCBhZGRyZXNzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iIj5JaHJlIFNlc3Npb24gaXN0IGxlaWRlciBhYmdlbGF1ZmVuIC0gZWluIG5ldWVyIExpbmsgd3VyZGUgYW4gSWhyZSBFbWFpbC1BZHJlc3NlIGdlc2VuZGV0LjwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iT25lVGltZUF1dGg6OkFjY2Vzc0RheXNBZnRlckNsb3NlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBudW1iZXIgb2YgZGF5cyBjdXN0b21lciB1c2VycyBjYW4gdXNlIGRpcmVjdCBsaW5rcyB0byBvcGVuIHRpY2tldHMgYWZ0ZXIgdGhleSBhcmUgY2xvc2VkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6QXV0aDo6Q3VzdG9tZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IlN0cmluZyIgVmFsdWVSZWdleD0iXlxkKiQiPjE0PC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJPbmVUaW1lQXV0aDo6VG9rZW5SZWZyZXNoTm90aWZpY2F0aW9uSUQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2VuZCB0aGUgdGV4dCBvZiBhIG5vdGlmaWNhdGlvbiB0byB0aGUgY3VzdG9tZXIgdXNlciBpZiBoZSByZWZyZXNocyBoaXMgdG9rZW4uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5Db3JlOjpBdXRoOjpDdXN0b21lcjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSJeXGQqJCI+MDwvSXRlbT4KICAgICAgICA8L1ZhbHVlPgogICAgPC9TZXR0aW5nPgogICAgPFNldHRpbmcgTmFtZT0iUG9zdE1hc3Rlcjo6UHJlRmlsdGVyTW9kdWxlIyMjMDAwLUNyZWF0ZUN1c3RvbWVyVXNlciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5DcmVhdGUgYSBDdXN0b21lclVzZXIgaW4gYSBzcGVjaWZpYyBiYWNrZW5kIGlmIG5vbmUgZXhpc3RzIGZvciB0aGUgc2VuZGVyIGVtYWlsLiBDdXN0b21lckhlYWRlclNwb29mUHJvdGVjdGlvbiBzZXRzIChhbmQgcG9zc2libHkgb3ZlcndyaXRlcykgdGhlIFgtT1RPQk8tQ3VzdG9tZXIgaGVhZGVyIGlmIGEgY3VzdG9tZXIgdXNlciBleGlzdHMgZm9yIGFuIGVtYWlsIGFkZHJlc3MgdG8gcHJldmVudCBzcG9vZmluZy4gQ3VzdG9tZXJVc2VyQmFja2VuZCBkZWZpbmVzIHRoZSBiYWNrZW5kIGluIHdoaWNoIHRoZSBDdXN0b21lclVzZXIgd2lsbCBiZSBjcmVhdGVkLCBpZiBTZXRDaGVja0JveE5hbWUgaXMgc2V0IHRvIHRoZSBuYW1lIG9mIGEgZHluYW1pYyBmaWVsZCBvZiB0aGUgdHlwZSBjaGVja2JveCwgaXQgd2lsbCBiZSBzZXQgdG8gY2hlY2tlZCBmb3IgdGlja2V0cyBjcmVhdGVkIGJ5IGN1c3RvbWVyIHVzZXJzIGZyb20gdGhpcyBiYWNrZW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6RW1haWw6OlBvc3RNYXN0ZXI8L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkN1c3RvbWVySGVhZGVyU3Bvb2ZQcm90ZWN0aW9uIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDdXN0b21lclVzZXJCYWNrZW5kIj48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNldENoZWNrQm94TmFtZSI+PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KICAgIDxTZXR0aW5nIE5hbWU9IkRhZW1vbjo6U2NoZWR1bGVyQ3JvblRhc2tNYW5hZ2VyOjpUYXNrIyMjRGVsZXRlRXhwaXJlZE9UQVRva2VucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIiBDb25maWdMZXZlbD0iMTAwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWxldGVzIE9UQSBUb2tlbnMgb2YgY2xvc2VkIHRpY2tldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8TmF2aWdhdGlvbj5EYWVtb246OlNjaGVkdWxlckNyb25UYXNrTWFuYWdlcjo6VGFzazwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXNrTmFtZSI+RGVsZXRlRXhwaXJlZE9UQVRva2VuczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2NoZWR1bGUiPjAgNCAqICogKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpPbmVUaW1lQXV0aExpbms8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZ1bmN0aW9uIj5EZWFjdGl2YXRlQ2xvc2VkVGlja2V0czwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTWF4aW11bVBhcmFsbGVsSW5zdGFuY2VzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQYXJhbXMiPgogICAgICAgICAgICAgICAgICAgIDxBcnJheT4KICAgICAgICAgICAgICAgICAgICA8L0FycmF5PgogICAgICAgICAgICAgICAgPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9WYWx1ZT4KICAgIDwvU2V0dGluZz4KPC9vdG9ib19jb25maWc+Cg==</File>
        <File Location="Kernel/System/Console/Command/Maint/CustomerAuth/DeleteExpiredOTATokens.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDb25zb2xlOjpDb21tYW5kOjpNYWludDo6Q3VzdG9tZXJBdXRoOjpEZWxldGVFeHBpcmVkT1RBVG9rZW5zOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6Q29uc29sZTo6QmFzZUNvbW1hbmQpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6T25lVGltZUF1dGhMaW5rJywKKTsKCnN1YiBDb25maWd1cmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+RGVzY3JpcHRpb24oJ0RlbGV0ZXMgZXhwaXJlZCBPbmVUaW1lQXV0aGVudGlmaWNhdGlvblRva2Vucy4nKTsKCiAgICByZXR1cm47Cn0KCnN1YiBQcmVSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm47Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU3VjY2VzcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluaycpLT5EZWFjdGl2YXRlQ2xvc2VkVGlja2V0cygpOwoKICAgIGlmICgkU3VjY2VzcykgewogICAgICAgICRTZWxmLT5QcmludCgiPGdyZWVuPkRvbmUuPC9ncmVlbj5cblxuIik7CiAgICAgICAgcmV0dXJuICRTZWxmLT5FeGl0Q29kZU9rKCk7CiAgICB9CgogICAgJFNlbGYtPlByaW50RXJyb3IoIkZhaWxlZC5cblxuIik7CiAgICByZXR1cm4gJFNlbGYtPkV4aXRDb2RlRXJyb3IoKTsKfQoKMTsK</File>
        <File Location="Kernel/System/CustomerAuth/OneTimeAuthLink.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckF1dGg6Ok9uZVRpbWVBdXRoTGluazsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIHV0Zjg7CgpvdXIgQE9iamVjdERlcGVuZGVuY2llcyA9ICgKICAgICdLZXJuZWw6OkNvbmZpZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW1haWwnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Tm90aWZpY2F0aW9uRXZlbnQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlRpY2tldCcsCik7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IGRhdGFiYXNlIG9iamVjdAogICAgJFNlbGYtPntEQk9iamVjdH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAkU2VsZi0+e1RhYmxlfSA9ICdvdGFfdG9rZW5zJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPcHRpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1doYXR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBXaGF0ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIG1vZHVsZSBvcHRpb25zCiAgICBteSAlT3B0aW9uID0gKAogICAgICAgIFByZUF1dGggPT4gMCwKICAgICk7CgogICAgIyByZXR1cm4gb3B0aW9uCiAgICByZXR1cm4gJE9wdGlvbnsgJFBhcmFte1doYXR9IH07Cn0KCnN1YiBFeHRlbmRlZFBhcmFtTmFtZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gcXcvT1RBVG9rZW4vOwp9CgpzdWIgQXV0aCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17T1RBVG9rZW59ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gVG9rZW4gcHJvdmlkZWQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgPT4gIlNFTEVDVCB1c2VkLHVzZXIsdGlja2V0X251bWJlciBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRva2VuID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17T1RBVG9rZW59IF0sCiAgICApOwoKICAgIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpOwogICAgbXkgKCAkVXNlZCwgJFVzZXIsICRUaWNrZXROdW1iZXIgKSA9ICgwKTsKCiAgICBpZiAoQFJvdykgewogICAgICAgICggJFVzZWQsICRVc2VyLCAkVGlja2V0TnVtYmVyICkgPSBAUm93OwogICAgfQoKICAgIGlmICggISRVc2VkIHx8ICEkVXNlciApIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBFcnJvciA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZUxpbmtFeHBpcmVkJykgfHwgJ0lociBMaW5rIHZlcndlaXN0IGF1ZiBrZWluIG5vY2ggZ8O8bHRpZ2VzIFRpY2tldC4nLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIHNlbmQgb3V0IG5ldyBlbWFpbCBpZiB0aGUgdGlja2V0IGlzIHN0aWxsIGNvbnNpZGVyZWQgYWN0aXZlIGJ1dCBubyBjdXJyZW50IGxpbmsgZXhpc3RzCiAgICBpZiAoICRVc2VkID09IDEgKSB7CgogICAgICAgICMgc3RvcmUgZmFpbGVkIGxvZ2luIGNvdW50CiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJ9ICk7CiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgbXkgJENvdW50ID0gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW5GYWlsZWR9IHx8IDA7CiAgICAgICAgICAgICRDb3VudCsrOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlckxvZ2luRmFpbGVkJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIGFjdGl2ZSBsb2dpbiBsaW5rIHN0aWxsIGV4aXN0cwogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgID0+ICJTRUxFQ1QgdXNlciBGUk9NICRTZWxmLT57VGFibGV9IFdIRVJFIHRpY2tldF9udW1iZXIgPSA/IEFORCB1c2VkID0gPyIsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFRpY2tldE51bWJlciwgXDIgXSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDdXN0b21lclVzZXIgJyRVc2VyJyB0cmllZCB0byBsb2cgaW4gd2l0aCBhbiBvbGQgdG9rZW4uIE5ldyB0b2tlbiBleGlzdHMgLSBub3RoaW5nIHRvIGRvLiIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBFcnJvciA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZVdyb25nTGluaycpCiAgICAgICAgICAgICAgICAgICAgfHwgJ0F1cyBTaWNoZXJoZWl0c2dyw7xuZGVuIG3DvHNzZW4gU2llIGRlbiBuZXVlc3RlbiBJaG5lbiB6dWdlc2FuZHRlbiBMaW5rIG51dHplbiB1bSBhdWYgZGllc2VzIFRpY2tldCB6dXp1Z3JlaWZlbi4nLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlciAnJFVzZXInIHRyaWVkIHRvIGxvZyBpbiB3aXRoIGFuIG9sZCB0b2tlbi4gTm8gYWN0aXZlIHRva2VuIGxlZnQgLSBzZW5kaW5nIGEgbmV3IG9uZSB2aWEgbWFpbC4iCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkU2VsZi0+U2VuZE5ld1Rva2VuKAogICAgICAgICAgICAgICAgVXNlciAgICAgICAgID0+ICRVc2VyLAogICAgICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRUaWNrZXROdW1iZXIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgRXJyb3IgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKS0+R2V0KCdPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VOZXdMaW5rJykKICAgICAgICAgICAgICAgICAgICB8fCAnSWhyZSBTZXNzaW9uIGlzdCBsZWlkZXIgYWJnZWxhdWZlbiAtIGVpbiBuZXVlciBMaW5rIHd1cmRlIGFuIElocmUgRW1haWwtQWRyZXNzZSBnZXNlbmRldC4nLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFVzZWQgPT0gMiApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlciAnJFVzZXInIGxvZ2dlZCBpbiB2aWEgdG9rZW4uIgogICAgICAgICk7CgogICAgICAgICRTZWxmLT5EZWFjdGl2YXRlVGlja2V0VG9rZW5zKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFRpY2tldE51bWJlciwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFVzZXI7CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgR2VuZXJhdGVUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvVXNlciBUaWNrZXROdW1iZXIvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRlYWN0aXZhdGUgYWxsIG90aGVyIHRva2VucyBmb3IgdGhpcyB0aWNrZXQKICAgICRTZWxmLT5EZWFjdGl2YXRlVGlja2V0VG9rZW5zKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkUGFyYW17VGlja2V0TnVtYmVyfSwKICAgICk7CgogICAgbXkgJE9UQVRva2VuTGVuZ3RoID0gMjQ7CiAgICBteSAkUmFuZG9tU3RyaW5nOwoKICAgIG15ICRUcnkgPSAxOwogICAgd2hpbGUgKCRUcnkpIHsKICAgICAgICAkUmFuZG9tU3RyaW5nID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgICAgIExlbmd0aCA9PiAkT1RBVG9rZW5MZW5ndGgsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayB3aGV0aGVyIHRoZSBzdHJpbmcgYWxyZWFkeSBleGlzdHMKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICA9PiAiU0VMRUNUIHVzZXIgRlJPTSAkU2VsZi0+e1RhYmxlfSBXSEVSRSB0b2tlbiA9ID8iLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtPVEFUb2tlbn0gXSwKICAgICAgICApOwoKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRUcnkrKzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUcnkgPSAwOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkVHJ5ID4gNSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBnZW5lcmF0ZSBhIHVuaXF1ZSByYW5kb20gc3RyaW5nIGFmdGVyIGZpdmUgcmV0cmllcyAtIHNvbWV0aGluZyBpcyBub3QgcmlnaHQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiSU5TRVJUIElOVE8gJFNlbGYtPntUYWJsZX0gKCB0b2tlbiwgdGlja2V0X251bWJlciwgdXNlZCwgdXNlciwgY3JlYXRlX3RpbWUsIGNoYW5nZV90aW1lICkKICAgICAgICAgICAgVkFMVUVTICggPywgPywgPywgPywgY3VycmVudF90aW1lc3RhbXAsIGN1cnJlbnRfdGltZXN0YW1wICkiLAogICAgICAgIEJpbmQgPT4gWyBcJFJhbmRvbVN0cmluZywgXCRQYXJhbXtUaWNrZXROdW1iZXJ9LCBcMiwgXCRQYXJhbXtVc2VyfSBdLAogICAgKTsKCiAgICByZXR1cm4gJFJhbmRvbVN0cmluZzsKfQoKc3ViIERlYWN0aXZhdGVUaWNrZXRUb2tlbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3L1RpY2tldE51bWJlci8pIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICROZWVkZWQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCAgPT4gIlVQREFURSAkU2VsZi0+e1RhYmxlfSBTRVQgdXNlZCA9IDEsIGNoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAgV0hFUkUgdGlja2V0X251bWJlciA9ID8gQU5EIHVzZWQgPSAyIiwKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXROdW1iZXJ9IF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgRGVsZXRlVGlja2V0VG9rZW5zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdy9UaWNrZXROdW1iZXIvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICJERUxFVEUgRlJPTSAkU2VsZi0+e1RhYmxlfSBXSEVSRSB0aWNrZXRfbnVtYmVyID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17VGlja2V0TnVtYmVyfSBdLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIFRpY2tldExpbmsgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3L1RpY2tldE51bWJlciBVc2VyLykgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkfSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZCEiCiAgICAgICAgICAgICk7CgogICAgICAgICAgICByZXR1cm4gJENvbmZpZ09iamVjdC0+R2V0KCdPbmVUaW1lQXV0aDo6Q3VzdG9tZXJFcnJvck1lc3NhZ2VSZWZyZXNoRmFpbGVkJykgLy8gJ0xpbmsgY291bGQgbm90IGJlIGdlbmVyYXRlZCwgcGxlYXNlIGNvbnRhY3QgdXMgZGlyZWN0bHkhJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFRpY2tldExpbmsgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJyAuICRDb25maWdPYmplY3QtPkdldCgnRlFETicpIC4gJy9vdG9iby9jdXN0b21lci5wbCc7CiAgICAkVGlja2V0TGluayAuPSAiP0FjdGlvbj1DdXN0b21lclRpY2tldFpvb207VGlja2V0TnVtYmVyPSRQYXJhbXtUaWNrZXROdW1iZXJ9IjsKCiAgICAjIGNoZWNrIGlmIHRoZSB1c2VyIGFscmVhZHkgaGFzIGEgcGFzc3N3b3JkIC0gdGhlbiBubyBkaXJlY3QgbGluayBpcyBuZWVkZWQKICAgIG15ICVVc2VyID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgIFVzZXIgPT4gJFBhcmFte1VzZXJ9LAogICAgKTsKCiAgICBpZiAoICEkVXNlcntVc2VyUGFzc3dvcmR9ICkgewoKICAgICAgICAjIGdlbmVyYXRlIHRva2VuCiAgICAgICAgbXkgJFRva2VuID0gJFNlbGYtPkdlbmVyYXRlVG9rZW4oCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkVG9rZW4gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFcnJvciBpbiB0b2tlbiBnZW5lcmF0aW9uISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAkQ29uZmlnT2JqZWN0LT5HZXQoJ09uZVRpbWVBdXRoOjpDdXN0b21lckVycm9yTWVzc2FnZScpIC8vICdMaW5rIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQsIHBsZWFzZSBjb250YWN0IHVzIGRpcmVjdGx5ISc7CiAgICAgICAgfQoKICAgICAgICAkVGlja2V0TGluayAuPSAiO09UQVRva2VuPSRUb2tlbiI7CiAgICB9CgogICAgcmV0dXJuICI8YSBocmVmPSckVGlja2V0TGluaycgdGFyZ2V0PSdfYmxhbmsnPiRUaWNrZXRMaW5rPC9hPiI7Cn0KCnN1YiBEZWFjdGl2YXRlQ2xvc2VkVGlja2V0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJFRpY2tldE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICAjIGdldCB0aGUgY29tcGFyZSB0aW1lIGlmIGEgZGVsYXkgaXMgZ2l2ZW4KICAgIG15ICREZWxheSAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnT25lVGltZUF1dGg6OkFjY2Vzc0RheXNBZnRlckNsb3NlJykgfHwgMDsKICAgIG15ICRTdGlsbE9LVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScpLT5Ub0Vwb2NoKCkgLSAyNCAqIDYwICogNjAgKiAkRGVsYXk7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICJTRUxFQ1QgRElTVElOQ1QodGlja2V0X251bWJlcikgRlJPTSAkU2VsZi0+e1RhYmxlfSIsCiAgICApOwoKICAgIG15IEBUaWNrZXROdW1iZXJzOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBUaWNrZXROdW1iZXJzLCAkUm93WzBdOwogICAgfQoKICAgIFRJQ0tFVDoKICAgIGZvciBteSAkVE4gKEBUaWNrZXROdW1iZXJzKSB7CiAgICAgICAgbXkgJFRpY2tldElEID0gJFRpY2tldE9iamVjdC0+VGlja2V0SURMb29rdXAoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVE4sCiAgICAgICAgKTsKCiAgICAgICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgICMgcmVtb3ZlIG9sZCB0b2tlbnMKICAgICAgICBpZiAoICRUaWNrZXR7U3RhdGVUeXBlfSBlcSAnY2xvc2VkJyB8fCAkVGlja2V0e1N0YXRlVHlwZX0gZXEgJ3JlbW92ZWQnIHx8ICRUaWNrZXR7U3RhdGVUeXBlfSBlcSAnbWVyZ2VkJyApIHsKICAgICAgICAgICAgaWYgKCREZWxheSkgewogICAgICAgICAgICAgICAgbXkgJExhc3RDaGFuZ2VkVGltZSA9ICRLZXJuZWw6Ok9NLT5DcmVhdGUoCiAgICAgICAgICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRUaWNrZXR7Q2hhbmdlZH0sCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKS0+VG9FcG9jaCgpOwoKICAgICAgICAgICAgICAgIG5leHQgVElDS0VUIGlmICRMYXN0Q2hhbmdlZFRpbWUgPiAkU3RpbGxPS1RpbWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT5EZWxldGVUaWNrZXRUb2tlbnMoCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFROLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIFNlbmROZXdUb2tlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcvVGlja2V0TnVtYmVyIFVzZXIvKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwogICAgbXkgJFRpY2tldE9iamVjdCAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUaWNrZXQnKTsKCiAgICBteSAkVGlja2V0SUQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRJRExvb2t1cCgKICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFBhcmFte1RpY2tldE51bWJlcn0sCiAgICApOwogICAgbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICApOwogICAgbXkgJVVzZXIgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyktPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAkUGFyYW17VXNlcn0sCiAgICApOwoKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvcicpOwogICAgbXkgJFNlbmRlciAgICAgICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TZW5kZXIoCiAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7CgogICAgbXkgJE5vdGlmaWNhdGlvbklEID0gJENvbmZpZ09iamVjdC0+R2V0KCdPbmVUaW1lQXV0aDo6VG9rZW5SZWZyZXNoTm90aWZpY2F0aW9uSUQnKTsKCiAgICBteSAoICRCb2R5LCAkU3ViamVjdCApOwoKICAgIGlmICgkTm90aWZpY2F0aW9uSUQpIHsKICAgICAgICBteSAlTm90aWZpY2F0aW9uID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok5vdGlmaWNhdGlvbkV2ZW50JyktPk5vdGlmaWNhdGlvbkdldCgKICAgICAgICAgICAgSUQgPT4gJE5vdGlmaWNhdGlvbklELAogICAgICAgICk7CgogICAgICAgIG15ICVMYW5ndWFnZXMgPSBtYXAgeyAkXyA9PiAkXyB9IEB7ICROb3RpZmljYXRpb257RGF0YX17TGFuZ3VhZ2VJRH0gfTsKICAgICAgICBteSAkTGFuZ3VhZ2UgID0gJExhbmd1YWdlc3tkZX0gfHwgJExhbmd1YWdlc3tlbn0gfHwgJE5vdGlmaWNhdGlvbntEYXRhfXtMYW5ndWFnZUlEfVswXTsKCiAgICAgICAgIyByZXBsYWNlIHBsYWNlIGhvbGRlciBzdHVmZgogICAgICAgICRCb2R5ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5fUmVwbGFjZSgKICAgICAgICAgICAgUmljaFRleHQgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ0Zyb250ZW5kOjpSaWNoVGV4dCcpLAogICAgICAgICAgICBUZXh0ICAgICAgID0+ICROb3RpZmljYXRpb257TWVzc2FnZX17JExhbmd1YWdlfXtCb2R5fSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7fSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICRTdWJqZWN0ID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5fUmVwbGFjZSgKICAgICAgICAgICAgUmljaFRleHQgICA9PiAwLAogICAgICAgICAgICBUZXh0ICAgICAgID0+ICROb3RpZmljYXRpb257TWVzc2FnZX17JExhbmd1YWdlfXtTdWJqZWN0fSwKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7fSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgZWxzZSB7CiAgICAgICAgbXkgJFRpY2tldExpbmsgPSAkU2VsZi0+VGlja2V0TGluayglUGFyYW0pOwoKICAgICAgICAkU3ViamVjdCA9ICJOZXVlciBBdXRoZW50aWZpemllcnVuZ3NsaW5rIGbDvHIgVGlja2V0IyRUaWNrZXR7VGlja2V0TnVtYmVyfSI7CiAgICAgICAgJEJvZHkgICAgPSAiR3V0ZW4gVGFnPGJyLz5JaHIgYWt0dWVsbGVyIExpbmsgdW0gYXVmIFRpY2tldCMkVGlja2V0e1RpY2tldE51bWJlcn0genVncmVpZmVuIHp1IGvDtm5uZW4gbGF1dGV0Ojxici8+JFRpY2tldExpbmsiOwogICAgfQoKICAgIG15ICRFbWFpbE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbWFpbCcpOwogICAgbXkgJFNlbnQgICAgICAgID0gJEVtYWlsT2JqZWN0LT5TZW5kKAogICAgICAgIEZyb20gICAgID0+ICRTZW5kZXIsCiAgICAgICAgVG8gICAgICAgPT4gJFVzZXJ7VXNlckVtYWlsfSwKICAgICAgICBTdWJqZWN0ICA9PiAkU3ViamVjdCwKICAgICAgICBDaGFyc2V0ICA9PiAndXRmLTgnLAogICAgICAgIE1pbWVUeXBlID0+ICd0ZXh0L2h0bWwnLAogICAgICAgIEJvZHkgICAgID0+ICRCb2R5LAogICAgKTsKCiAgICBpZiAoICEkU2VudCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBzZW5kIG5ldyB0b2tlbiB0byAkUGFyYW17VXNlcn0gZm9yIFRpY2tldCMkUGFyYW17VGlja2V0TnVtYmVyfSEiCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Kernel/System/PostMaster/Filter/CreateNewCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjUgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OkNyZWF0ZU5ld0N1c3RvbWVyVXNlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAopOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBwYXJzZXIgb2JqZWN0CiAgICAkU2VsZi0+e1BhcnNlck9iamVjdH0gPSAkUGFyYW17UGFyc2VyT2JqZWN0fSB8fCBkaWUgIkdvdCBubyBQYXJzZXJPYmplY3QhIjsKCiAgICAjIEdldCBjb21tdW5pY2F0aW9uIGxvZyBvYmplY3QuCiAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9ID0gJFBhcmFte0NvbW11bmljYXRpb25Mb2dPYmplY3R9IHx8IGRpZSAiR290IG5vIENvbW11bmljYXRpb25Mb2dPYmplY3QhIjsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG9ubHkgbmVlZGVkIGZvciBuZXcgdGlja2V0cwogICAgcmV0dXJuIDEgaWYgJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhHZXRQYXJhbSBKb2JDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiTmVlZCAkXyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15IEBFbWFpbEFkZHJlc3NPbkZpZWxkID0gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5TcGxpdEFkZHJlc3NMaW5lKAogICAgICAgIExpbmUgPT4gJFNlbGYtPntQYXJzZXJPYmplY3R9LT5HZXRQYXJhbSggV0hBVCA9PiAnRnJvbScgKSwKICAgICk7CgogICAgbXkgJEluY29taW5nTWFpbEFkZHJlc3M7CgogICAgZm9yIG15ICRFbWFpbEFkZHJlc3MgKEBFbWFpbEFkZHJlc3NPbkZpZWxkKSB7CiAgICAgICAgJEluY29taW5nTWFpbEFkZHJlc3MgPSAkU2VsZi0+e1BhcnNlck9iamVjdH0tPkdldEVtYWlsQWRkcmVzcygKICAgICAgICAgICAgRW1haWwgPT4gJEVtYWlsQWRkcmVzcywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxIGlmICEkSW5jb21pbmdNYWlsQWRkcmVzczsKCiAgICBteSAkQ3VzdG9tZXJVc2VyT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpOwoKICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgUG9zdE1hc3RlclNlYXJjaCA9PiBsYygkSW5jb21pbmdNYWlsQWRkcmVzcyksCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAwLAogICAgKTsKCiAgICAjIHVzZXIgYWxyZWFkeSBleGlzdHMKICAgIGlmICglTGlzdCkgewoKICAgICAgICAjIHJldHVybiBpZiBubyBYLU9UT0JPLUN1c3RvbWVyVXNlciBzcG9vZmluZyBpcyBwb3NzaWJsZS9kYW5nZXJvdXMKICAgICAgICByZXR1cm4gMSBpZiAhJFBhcmFte0pvYkNvbmZpZ317Q3VzdG9tZXJIZWFkZXJTcG9vZlByb3RlY3Rpb259ICYmICEkUGFyYW17Sm9iQ29uZmlnfXtTZXRDaGVja0JveE5hbWV9OwoKICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIExPR0lOOgogICAgICAgIGZvciBteSAkVXNlckxvZ2luICggc29ydCBrZXlzICVMaXN0ICkgewogICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgIFVzZXIgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlcntWYWxpZElEfSA9PSAxICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICVDdXN0b21lclVzZXI7CiAgICAgICAgICAgICAgICBsYXN0IExPR0lOOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIHVzZXIgZXhpc3RzIGJ1dCBpcyBub3QgdmFsaWQsIGRvIG5vdGhpbmcKICAgICAgICByZXR1cm4gMSBpZiAhJUN1c3RvbWVyRGF0YTsKCiAgICAgICAgaWYgKCAkUGFyYW17Sm9iQ29uZmlnfXtTZXRDaGVja0JveE5hbWV9ICYmICRDdXN0b21lckRhdGF7U291cmNlfSBlcSAoICRQYXJhbXtKb2JDb25maWd9e0N1c3RvbWVyVXNlckJhY2tlbmR9IHx8ICdDdXN0b21lclVzZXInICkgKSB7CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17ICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSB9ID0gMTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAxIGlmICEkUGFyYW17Sm9iQ29uZmlnfXtDdXN0b21lckhlYWRlclNwb29mUHJvdGVjdGlvbn07CgogICAgICAgICMgdGFrZSBDdXN0b21lcklEIGZyb20gY3VzdG9tZXIgYmFja2VuZCBsb29rdXAgb3IgZnJvbSBmcm9tIGZpZWxkCiAgICAgICAgaWYgKCAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJVc2VyJ30gPSAkQ3VzdG9tZXJEYXRhe1VzZXJMb2dpbn07CgogICAgICAgICAgICAjIG5vdGljZSB0aGF0IFVzZXJMb2dpbiBpcyBmcm9tIGN1c3RvbWVyIHNvdXJjZSBiYWNrZW5kCiAgICAgICAgICAgICRTZWxmLT57Q29tbXVuaWNhdGlvbkxvZ09iamVjdH0tPk9iamVjdExvZygKICAgICAgICAgICAgICAgIE9iamVjdExvZ1R5cGUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgICAgICA9PiAnTm90aWNlJywKICAgICAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gJ0tlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OkNyZWF0ZU5ld0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICJUYWtlIFVzZXJMb2dpbiAoJEN1c3RvbWVyRGF0YXtVc2VyTG9naW59KSBmcm9tICIKICAgICAgICAgICAgICAgICAgICAuICJjdXN0b21lciBzb3VyY2UgYmFja2VuZCBiYXNlZCBvbiAoJEluY29taW5nTWFpbEFkZHJlc3MpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGlmICggJEN1c3RvbWVyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJObyd9ID0gJEN1c3RvbWVyRGF0YXtVc2VyQ3VzdG9tZXJJRH07CgogICAgICAgICAgICAjIG5vdGljZSB0aGF0IFVzZXJDdXN0b21lcklEIGlzIGZyb20gY3VzdG9tZXIgc291cmNlIGJhY2tlbmQKICAgICAgICAgICAgJFNlbGYtPntDb21tdW5pY2F0aW9uTG9nT2JqZWN0fS0+T2JqZWN0TG9nKAogICAgICAgICAgICAgICAgT2JqZWN0TG9nVHlwZSA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICAgICBQcmlvcml0eSAgICAgID0+ICdOb3RpY2UnLAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6Q3JlYXRlTmV3Q3VzdG9tZXJVc2VyJywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gIlRha2UgVXNlckN1c3RvbWVySUQgKCRDdXN0b21lckRhdGF7VXNlckN1c3RvbWVySUR9KSIKICAgICAgICAgICAgICAgICAgICAuICIgZnJvbSBjdXN0b21lciBzb3VyY2UgYmFja2VuZCBiYXNlZCBvbiAoJEluY29taW5nTWFpbEFkZHJlc3MpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdXNlciBkb2VzIG5vdCB5ZXQgZXhpc3QgLSBjcmVhdGUgaXQhCiAgICBlbHNlIHsKICAgICAgICBteSAkVXNlckxvZ2luID0gbGMoJEluY29taW5nTWFpbEFkZHJlc3MpOwoKICAgICAgICBteSAkU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgU291cmNlICAgICAgICAgPT4gJFBhcmFte0pvYkNvbmZpZ317Q3VzdG9tZXJVc2VyQmFja2VuZH0gfHwgJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgID0+ICcgJywKICAgICAgICAgICAgVXNlckxhc3RuYW1lICAgPT4gJyAnLAogICAgICAgICAgICBVc2VyQ3VzdG9tZXJJRCA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBVc2VyTG9naW4gICAgICA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBVc2VyRW1haWwgICAgICA9PiAkVXNlckxvZ2luLAogICAgICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkU3VjY2VzcykgewoKICAgICAgICAgICAgIyBub3RpY2UgdGhhdCBVc2VyTG9naW4gaXMgZnJvbSBjdXN0b21lciBzb3VyY2UgYmFja2VuZAogICAgICAgICAgICAkU2VsZi0+e0NvbW11bmljYXRpb25Mb2dPYmplY3R9LT5PYmplY3RMb2coCiAgICAgICAgICAgICAgICBPYmplY3RMb2dUeXBlID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgICAgIFByaW9yaXR5ICAgICAgPT4gJ05vdGljZScsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgICAgID0+ICdLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpDcmVhdGVOZXdDdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICA9PiAiQ3JlYXRlIGFuZCBzZXQgbmV3IFVzZXJMb2dpbiAoJFVzZXJMb2dpbikuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17J1gtT1RPQk8tQ3VzdG9tZXJVc2VyJ30gPSAkVXNlckxvZ2luOwogICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19eydYLU9UT0JPLUN1c3RvbWVyTm8nfSAgID0gJFVzZXJMb2dpbjsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX17ICdYLU9UT0JPLUR5bmFtaWNGaWVsZC0nIC4gJFBhcmFte0pvYkNvbmZpZ317U2V0Q2hlY2tCb3hOYW1lfSB9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlclRpbWVab25lJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnRXVyb3BlL0JlcmxpbicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VyTG9naW4sCiAgICAgICAgICAgICAgICBLZXkgICAgPT4gJ1VzZXJTaG93VGlja2V0cycsCiAgICAgICAgICAgICAgICBWYWx1ZSAgPT4gJzI1JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEN1c3RvbWVyVXNlck9iamVjdC0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFVzZXJMb2dpbiwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnVXNlclJlZnJlc2hUaW1lJywKICAgICAgICAgICAgICAgIFZhbHVlICA9PiAnMCcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="doc/en/OneTimeAuthentificationLink.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="pre">
        <TableCreate Type="pre" Name="ota_tokens">
            <Column Name="token" Required="true" Size="64" Type="VARCHAR"></Column>
            <Column Name="ticket_number" Required="true" Size="64" Type="VARCHAR"></Column>
            <Column Name="user" Required="true" Size="191" Type="VARCHAR"></Column>
            <Column Name="used" Required="true" Type="INTEGER"></Column>
            <Column Name="change_time" Required="true" Type="DATE"></Column>
            <Column Name="create_time" Required="true" Type="DATE"></Column>
        </TableCreate>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableDrop Type="pre" Name="ota_tokens">
        </TableDrop>
    </DatabaseUninstall>
</otrs_package>