GeneralCatalog
1.3.72
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 2.0.0 alpha2.
Build for OTRS::ITSM 2.0.0 alpha1.
The general catalog package.
Das General Catalog Paket.
2.4.x
<br>
<b>ATTENTION</b>
<br>
<br>
If you uninstall this package, all database tables that were created during installation will be deleted.
All data from this table will be irrevocably lost.
<br>
<br>
((enjoy))<br>
<br>
<br>
<b>ACHTUNG</b>
<br>
<br>
Bei der Deinstallation werden die von diesem Paket angelegten Datenbank-Tabellen gelöscht.
Alle darin enthaltenen Daten gehen unwiderruflich verloren!
<br>
<br>
((enjoy))<br>
<br>
# define function name
my $FunctionName = 'CodeUpgrade';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2009-10-09 19:54:46
opms.otrs.com
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xuPxZDJ5OFv01DRWHMelUqn4h2zHonw+/86BAQAAAN7fVvdHt7e3g8HgqxsLhULxG6oiAAAAYGttbH80n8/Pz88Xi8Vf//rXp66pVCpRFH1VFS3ZFRsAAABgC61ff5QkSbYn0Xw+L5VK1Wr10ctyudx4PM6uz+Vyj16zv7//hkEBAAAANsKK9kdpms7/kLVF951RkiT3l+3u7i7pjz58+FAqlZ4qjwAAAAB4jsD9UZqm0+n0YT10/8GS78rn89kuReVyecllzWbztfMCAAAAbJ3A/dFoNPr8+fOjX4rjuFAoZD3R/Z8ZI0UAAADA67rfEDk7nP3hp0u+9Pw7Wf6Iy68M7m37o8vLy7u7u5OTk52dnccfvlC4HyZ6WBI58gwAAAB4T181PtE3tc5TX/r2fp5qkZY84vIrg3tuf5QkyXw+XywW99sSZR+nafqXv/zlqe/KnvxisXjqglKp9D//8z8/GhoAAAAgoIdFz/NHh1Z8yGiJ//RHSZJ8Ww/df/xw1+rn29/f39/fLxRWdJduAAAAgMzDOaDlnrM27eHd3l/w1ZVfPeLDK1dNIYqiT58+TSaT7zZE9xsS3S86yyz5lmKx+JphAQAAAN7SwxLn0SGj6HurzH50Ddoq10b3ClEU3Y8X5XK5+2LoYUOUfWzXagAAAGBTfVXiPPx0yZeW38kPXbzKLVKcpul4PM7lchoiAAAAAL61BiNSAAAAAARk4AgAAACAZfRHAAAAACyjPwIAAABgGf0RAAAAAMvojwAAAABY5v8D3nWRn2MVBTEAAAAASUVORK5CYII=
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iRnJhbWV3b3JrIj4KICAgIDxDVlM+JElkOiBHZW5lcmFsQ2F0YWxvZy54bWwsdiAxLjQgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pbkdlbmVyYWxDYXRhbG9nIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIEFkbWluR2VuZXJhbENhdGFsb2cgY29uZmlndXJhdGlvbiBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVyIEFkbWluR2VuZXJhbENhdGFsb2cgS29uZmlndXJhdGlvbiBpbSBBZG1pbi1CZXJlaWNoLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkZyYW1ld29yazwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZG1pbjo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+R2VuZXJhbCBDYXRhbG9nPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPkdlbmVyYWwgQ2F0YWxvZzwvTmFtZT4KICAgICAgICAgICAgICAgICAgICA8QmxvY2s+QmxvY2szPC9CbG9jaz4KICAgICAgICAgICAgICAgICAgICA8UHJpbz40MTA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzIyMjQ29tbWVudDIiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5QYXJhbWV0ZXJzIGZvciB0aGUgZXhhbXBsZSBjb21tZW50IDIgb2YgZ2VuZXJhbCBjYXRhbG9nIGF0dHJpYnV0ZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlBhcmFtZXRlciBm/HIgZGVuIEJlaXNwaWVsLUtvbW1lbnRhciAyIGRlciBHZW5lcmFsQ2F0YWxvZy1BdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+R2VuZXJhbENhdGFsb2c8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5HZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkxhYmVsIj5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVzYyI+RGVmaW5lIHRoZSBxdWV1ZSBjb21tZW50IDIuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJCbG9jayI+VGV4dEFyZWE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNvbHMiPjUwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJSb3dzIj41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJQcmVmS2V5Ij5Db21tZW50MjwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMjIyNQZXJtaXNzaW9ucyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlBhcmFtZXRlcnMgZm9yIHRoZSBleGFtcGxlIHBlcm1pc3Npb24gZ3JvdXBzIG9mIGdlbmVyYWwgY2F0YWxvZyBhdHRyaWJ1dGVzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5QYXJhbWV0ZXIgZvxyIGRpZSB6dWdyaWZmc2JlcmVjaHRpZ3RlIEdydXBwZSBkZXIgR2VuZXJhbENhdGFsb2ctQXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPkdlbmVyYWxDYXRhbG9nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJMYWJlbCI+UGVybWlzc2lvbnM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2MiPkRlZmluZSB0aGUgZ3JvdXAgd2l0aCBwZXJtaXNzaW9ucy48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkJsb2NrIj5QZXJtaXNzaW9uPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbGFzcyI+SVRTTTo6Q29uZmlnSXRlbTo6Q2xhc3M8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlByZWZLZXkiPlBlcm1pc3Npb25zPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBidWxnYXJpYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgLS0KIyAkSWQ6IGJnX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xMSAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfO8e3u4uXtIOrg8uDr7uMnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfT7/Dg4uvl7ejlIO3gIO7x7e7i7ej/IOrg8uDr7uMnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICfK6+Dx7uLlIOIg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ugg7e7iIOrr4PEg4iDq4PLg6+7j4C4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICfE7uHg4ugg5evl7OXt8iDq+uwg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4ugg6uvg8SDiIOrg8uDr7uPgJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAn1PPt6vbo7u3g6+3u8fInOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjYXRhbGFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBTaXN0ZW1lcyBPVElDIChpYnNhbHV0KSAtIEFudG9uaW8gTGluZGUKIyAtLQojICRJZDogY3RfR2VuZXJhbENhdGFsb2cucG0sdiAxLjMgMjAwOS8wNS8xOCAwOTo0MDo0NiBtaCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdDYXTgbGVnIGdlbmVyYWwnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZXN0afMgZGVsIGNhdOBsZWcgZ2VuZXJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBjYXThbGVnJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWZlZ2lyIHVuYSBub3ZhIGNsYXNzZSBkZSBjYXTgbGVnJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnQWZlZ2lyIGFydGljbGUgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgID0gJ0FmZWdpciBjbGFzc2UgZGUgY2F04GxlZyc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0Z1bmNpb25hbGl0YXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBjemVjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBNaWxlbiBLb3V0ZXYKIyAtLQojICRJZDogY3pfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEwIDIwMDkvMDcvMjAgMTI6MTk6MDcgdWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6Y3pfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ1a5ZW9iZWNu/SBrYXRhbG9nJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAn2O16ZW7tIHa5ZW9iZWNu6WhvIGthdGFsb2d1JzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnVPjtZHkgdiBrYXRhbG9ndSc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ1D4aWRhdCBub3ZvdSB0+O1kdSBkbyBrYXRhbG9ndS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdQ+GlkYXQgcHJ2ZWsgZG8ga2F0YWxvZ3UnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdQ+GlkYXQgdPjtZHUgZG8ga2F0YWxvZ3UnOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5rY2lvbmFsaXRhJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRlX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4xNCAyMDA5LzA1LzE4IDA5OjQwOjQ2IG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xNCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgVmVyd2FsdHVuZyc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0thdGFsb2cgS2xhc3NlJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnRWluZSBuZXVlIEthdGFsb2cgS2xhc3NlIGhpbnp1ZvxnZW4uJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAnS2F0YWxvZyBFaW50cmFnIGhpbnp1ZvxnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdLYXRhbG9nIEtsYXNzZSBoaW56dWb8Z2VuJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua3Rpb25hbGl05HQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwZXJzaWFuIChmYXJzaSkgdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDAzLTIwMDkgQWZzaGFyIE1vaGViYmkgPGFmc2hhci5tb2hlYmJpIGF0IGdtYWlsLmNvbT4KIyAtLQojICRJZDogZmFfR2VuZXJhbENhdGFsb2cucG0sdiAxLjEgMjAwOS8wNy8yMCAwOTo1OTozNyB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICfZgdmH2LHYs9iqINi52YXZiNmF24wnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICfZhdiv24zYsduM2Kog2YHZh9ix2LPYqiDYudmF2YjZhduMJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAn2YHZh9ix2LPYqiDaqdmE2KfYs9uMJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDZgdmH2LHYs9iqINqp2YTYp9iz24wuJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIEl0ZW0nfSAgICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDbjNqpINmC2YTZhSDZgdmH2LHYs9iqJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAn2KfYttin2YHZhyDaqdix2K/ZhiDaqdmE2KfYsyDZgdmH2LHYs9iq24wnOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICfaqdin2LHaqdix2K/bjCc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBmcmVuY2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPbGl2aWVyIFNhbGxvdSA8b2xpdmllci5zYWxsb3UgYXQgaXJpc2EuZnI+CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBmcl9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMiAyMDA5LzA4LzA0IDEyOjI5OjAxIHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2d1ZSBH6W7pcmFsJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbiBkdSBDYXRhbG9ndWUgR+lu6XJhbCc7CiAgICAkTGFuZy0+eydDYXRhbG9nIENsYXNzJ30gICAgICAgICAgICAgID0gJ0NsYXNzZSBkZSBDYXRhbG9ndWUnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdBam91dGVyIHVuZSBub3V2ZWxsZSBjbGFzc2VzIGRlIENhdGFsb2d1ZS4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdBam91dGVyIHVuIEVsZW1lbnQgYXUgQ2F0YWxvZ3VlJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWpvdXRlciB1bmUgQ2xhc3NlIGRlIENhdGFsb2d1ZSc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ0ZvbmN0aW9ubmFsaXTpJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBzcGFuaXNoIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBBcXVpbGVzIENvaGVuCiMgLS0KIyAkSWQ6IGVzX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS41IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZXNfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnQ2F0YWxvZ28gR2VuZXJhbCc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ0dlc3Rp824gZGVsIENhdGFsb2dvIEdlbmVyYWwnOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICdDbGFzZSBkZSBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4nfSAgID0gJ0HxYWRpciB1bmEgbnVldmEgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdB8WFkaXIgRWxlbWVudG8gYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdB8WFkaXIgQ2xhc2UgYWwgQ2F0YWxvZ28nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jaW9uYWxpZGFkJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBpdGFsaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBpdF9HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMSAyMDA5LzA1LzE4IDA5OjM3OjAwIG1oIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0dlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cnfSAgICAgICAgICAgID0gJ0NhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyBNYW5hZ2VtZW50J30gPSAnR2VzdGlvbmUgZGVsIENhdGFsb2dvIEdlbmVyYWxlJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2xhc3NlIGRpIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBhIG5ldyBDYXRhbG9nIENsYXNzLid9ICAgPSAnQWdnaXVuZ2kgdW5hIG51b3ZhIENsYXNzZSBhbCBDYXRhbG9nbyc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0FnZ2l1bmdpIEVsZW1lbnRvIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnQWdnaXVuZ2kgQ2xhc3NlIGFsIENhdGFsb2dvJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVuemlvbmFsaXTgJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBEdXRjaCB0cmFuc2xhdGlvbiBvZiBHZW5lcmFsQ2F0YWxvZwojIENvcHlyaWdodCAoQykgMjAwOSBNaWNoaWVsIEJlaWplbiA8bWljaGllbCAnYXQnIGJlZWZyZWVpdC5ubD4KIyAtLQojICRJZDogbmxfR2VuZXJhbENhdGFsb2cucG0sdiAxLjIgMjAwOS8wNy8yMCAxMzo0ODozMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9HZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nJ30gICAgICAgICAgICA9ICdHZW5lcmFsIENhdGFsb2cnOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdHZW5lcmFsIENhdGFsb2cgQmVoZWVyJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnQ2F0YWxvZyBLbGFzc2UnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICdFZW4gbmlldXdlIENhdGFsb2cgS2xhc3NlIHRvZXZvZWdlbic7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ0NhdGFsb2cgSXRlbSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICdDYXRhbG9nIEtsYXNzZSB0b2V2b2VnZW4nOwogICAgJExhbmctPnsnRnVuY3Rpb25hbGl0eSd9ICAgICAgICAgICAgICA9ICdGdW5jdGlvbmFsaXRlaXQnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBwb2xpc2ggdHJhbnNsYXRpb24gb2YgR2VuZXJhbENhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA4IE1hY2llaiBMb3N6YWpjCiMgLS0KIyAkSWQ6IHBsX0dlbmVyYWxDYXRhbG9nLnBtLHYgMS40IDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cGxfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjQgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnS2F0YWxvZyBns/N3bnknOwogICAgJExhbmctPnsnR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQnfSA9ICdaYXJ6sWR6YW5pZSBrYXRhbG9naWVtIGez83dueW0nOwogICAgJExhbmctPnsnQ2F0YWxvZyBDbGFzcyd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICcnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgSXRlbSd9ICAgICAgICAgICA9ICdEb2RhaiBlbGVtZW50IGthdGFsb2d1JzsKICAgICRMYW5nLT57J0FkZCBDYXRhbG9nIENsYXNzJ30gICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0Z1bmN0aW9uYWxpdHknfSAgICAgICAgICAgICAgPSAnRnVua2Nqb25hbG5vtuYnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9HZW5lcmFsQ2F0YWxvZy5wbSAtIHRoZSBydXNzaWFuIHRyYW5zbGF0aW9uIG9mIEdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBFZ29yIFRzaWxlbmtvIDxiZzhzIGF0IHN5bWxpbmsucnU+CiMgLS0KIyAkSWQ6IHJ1X0dlbmVyYWxDYXRhbG9nLnBtLHYgMS4yIDIwMDkvMDUvMTggMDk6NDA6NDYgbWggRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfR2VuZXJhbENhdGFsb2c7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0dlbmVyYWwgQ2F0YWxvZyd9ICAgICAgICAgICAgPSAnzuH56Okg6uDy4Ovu4yc7CiAgICAkTGFuZy0+eydHZW5lcmFsIENhdGFsb2cgTWFuYWdlbWVudCd9ID0gJ9Pv8ODi6+Xt6OUg7uH56Owg6uDy4Ovu4+7sJzsKICAgICRMYW5nLT57J0NhdGFsb2cgQ2xhc3MnfSAgICAgICAgICAgICAgPSAnyuvg8fEg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIGEgbmV3IENhdGFsb2cgQ2xhc3MuJ30gICA9ICfE7uHg4ujy/CDt7uL76SDq6+Dx8SDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydBZGQgQ2F0YWxvZyBJdGVtJ30gICAgICAgICAgID0gJ8Tu4eDi6+Xt6OUg/evl7OXt8uAg6uDy4Ovu4+AnOwogICAgJExhbmctPnsnQWRkIENhdGFsb2cgQ2xhc3MnfSAgICAgICAgICA9ICfE7uHg4uvl7ejlIOrr4PHx4CDq4PLg6+7j4Cc7CiAgICAkTGFuZy0+eydGdW5jdGlvbmFsaXR5J30gICAgICAgICAgICAgID0gJ9Tz7er26O7t4Ov87e7x8vwnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluR2VuZXJhbENhdGFsb2cucG0gLSBhZG1pbiBmcm9udGVuZCBvZiBnZW5lcmFsIGNhdGFsb2cgbWFuYWdlbWVudAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWRtaW5HZW5lcmFsQ2F0YWxvZy5wbSx2IDEuMjMgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkdlbmVyYWxDYXRhbG9nOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjMgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IFBhcmFtT2JqZWN0IExvZ09iamVjdCBMYXlvdXRPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE9iamVjdCEiICk7CiAgICAgICAgfQogICAgfQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2F0YWxvZyBpdGVtIGxpc3QKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdJdGVtTGlzdCcgKSB7CiAgICAgICAgbXkgJENsYXNzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQ2xhc3MiICkgfHwgJyc7CgogICAgICAgICMgY2hlY2sgbmVlZGVkIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApIGlmICEkQ2xhc3M7CgogICAgICAgICMgZ2V0IGNhdGFsb2cgY2xhc3MgbGlzdAogICAgICAgIG15ICRDbGFzc0xpc3QgICAgICAgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7CiAgICAgICAgbXkgJENsYXNzT3B0aW9uU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnQ2xhc3MnLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENsYXNzTGlzdCwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRDbGFzcywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIENsYXNzT3B0aW9uU3RyZyA9PiAkQ2xhc3NPcHRpb25TdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXZhaWxhYmlsaXR5IGxpc3QKICAgICAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwoKICAgICAgICAjIGdldCBjYXRhbG9nIGl0ZW0gbGlzdAogICAgICAgIG15ICRJdGVtSURMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgICAgIFZhbGlkID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpdGVtIGxpc3QKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgIGlmICEkSXRlbUlETGlzdCB8fCAhJXskSXRlbUlETGlzdH07CgogICAgICAgIG15ICRDc3NDbGFzcyA9ICcnOwogICAgICAgIGZvciBteSAkSXRlbUlEICggc29ydCB7ICRJdGVtSURMaXN0LT57JGF9IGNtcCAkSXRlbUlETGlzdC0+eyRifSB9IGtleXMgJXskSXRlbUlETGlzdH0gKSB7CgogICAgICAgICAgICAjIHNldCBvdXRwdXQgY2xhc3MKICAgICAgICAgICAgJENzc0NsYXNzID0gJENzc0NsYXNzIGVxICdzZWFyY2hhY3RpdmUnID8gJ3NlYXJjaHBhc3NpdmUnIDogJ3NlYXJjaGFjdGl2ZSc7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGl0ZW0gbGlzdAogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdJdGVtTGlzdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAleyRJdGVtRGF0YX0sCiAgICAgICAgICAgICAgICAgICAgQ3NzQ2xhc3MgPT4gJENzc0NsYXNzLAogICAgICAgICAgICAgICAgICAgIFZhbGlkICAgID0+ICRWYWxpZExpc3R7ICRJdGVtRGF0YS0+e1ZhbGlkSUR9IH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBlZGl0CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbUVkaXQnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJJdGVtSUQiICk7CiAgICAgICAgaWYgKCAkSXRlbURhdGF7SXRlbUlEfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgZ2V0IGNsYXNzCiAgICAgICAgICAgICRJdGVtRGF0YXtDbGFzc30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJDbGFzcyIgKTsKCiAgICAgICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhe0NsYXNzfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGdldCBpdGVtIGRhdGEKICAgICAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJEl0ZW1EYXRhe0l0ZW1JRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YQogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpCiAgICAgICAgICAgICAgICBpZiAhJEl0ZW1EYXRhUmVmOwoKICAgICAgICAgICAgJUl0ZW1EYXRhID0gJXskSXRlbURhdGFSZWZ9OwogICAgICAgIH0KCiAgICAgICAgIyBnZW5lcmF0ZSBDbGFzc09wdGlvblN0cmcKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkSXRlbURhdGF7Q2xhc3N9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgb3ZlcnZpZXcKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQ2xhc3NPcHRpb25TdHJnID0+ICRDbGFzc09wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZW5lcmF0ZSBWYWxpZE9wdGlvblN0cmcKICAgICAgICBteSAlVmFsaWRMaXN0ICAgICAgICA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICAgICBteSAlVmFsaWRMaXN0UmV2ZXJzZSA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgICAgICBteSAkVmFsaWRPcHRpb25TdHJnICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1ZhbGlkSUQnLAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVmFsaWRMaXN0LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRJdGVtRGF0YXtWYWxpZElEfSB8fCAkVmFsaWRMaXN0UmV2ZXJzZXt2YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXQKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVmFsaWRPcHRpb25TdHJnID0+ICRWYWxpZE9wdGlvblN0cmcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGVhY2ggcHJlZmVyZW5jZXMgc2V0dGluZwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVByZWZlcmVuY2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXMnKSB9OwogICAgICAgIH0KCiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBzb3J0IGtleXMgJVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgIyBza2lwIGl0ZW1zIHRoYXQgZG9uJ3QgYmVsb25nIHRvIHRoZSBjbGFzcwogICAgICAgICAgICBuZXh0IGlmICRQcmVmZXJlbmNlc3skSXRlbX0tPntDbGFzc30KICAgICAgICAgICAgICAgICAgICAmJiAkUHJlZmVyZW5jZXN7JEl0ZW19LT57Q2xhc3N9IG5lICRJdGVtRGF0YXtDbGFzc307CgogICAgICAgICAgICAjIGZpbmQgb3V0cHV0IG1vZHVsZQogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBvYmplY3QgZm9yIHRoaXMgcHJlZmVyZW5jZXMgaXRlbQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IGFsbCBwYXJhbWV0ZXJzCiAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSggR2VuZXJhbENhdGFsb2dEYXRhID0+IHsgJUl0ZW1EYXRhLCAlUGFyYW0gfSApOwogICAgICAgICAgICBmb3IgbXkgJFBhcmFtSXRlbSAoQFBhcmFtcykgewoKICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICByZWYoICRQYXJhbUl0ZW0tPntEYXRhfSApIGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgIHx8IHJlZiggJFByZWZlcmVuY2VzeyRJdGVtfS0+e0RhdGF9ICkgZXEgJ0hBU0gnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRQYXJhbUl0ZW0tPnsnT3B0aW9uJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFtSXRlbS0+e0Jsb2NrfSB8fCAkUHJlZmVyZW5jZXN7JEl0ZW19LT57QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAleyAkUHJlZmVyZW5jZXN7JEl0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFBhcmFtSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJEl0ZW1EYXRhe0NsYXNzfSBlcSAnTkVXJyApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IEl0ZW1FZGl0Q2xhc3NBZGQKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0l0ZW1FZGl0Q2xhc3NBZGQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBvdXRwdXQgSXRlbUVkaXRDbGFzc0V4aXN0CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtRWRpdENsYXNzRXhpc3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gJEl0ZW1EYXRhe0NsYXNzfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBoZWFkZXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNhdGFsb2cgaXRlbSBzYXZlCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnSXRlbVNhdmUnICkgewogICAgICAgIG15ICVJdGVtRGF0YTsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgZm9yIG15ICRQYXJhbSAocXcoQ2xhc3MgSXRlbUlEIE5hbWUgVmFsaWRJRCBDb21tZW50KSkgewogICAgICAgICAgICAkSXRlbURhdGF7JFBhcmFtfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNsYXNzCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoIE9QID0+ICJBY3Rpb249JFNlbGYtPntBY3Rpb259IiApCiAgICAgICAgICAgIGlmICEkSXRlbURhdGF7Q2xhc3N9IHx8ICRJdGVtRGF0YXtDbGFzc30gZXEgJ05FVyc7CgogICAgICAgICMgc2F2ZSB0byBkYXRhYmFzZQogICAgICAgIG15ICRTdWNjZXNzOwogICAgICAgIG15ICRJdGVtSUQgPSAkSXRlbURhdGF7SXRlbUlEfTsKICAgICAgICBpZiAoICRJdGVtRGF0YXtJdGVtSUR9IGVxICdORVcnICkgewogICAgICAgICAgICAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtQWRkKAogICAgICAgICAgICAgICAgJUl0ZW1EYXRhLAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEl0ZW1JRCA9ICRTdWNjZXNzOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgICAgICVJdGVtRGF0YSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgIG15ICRHQ0RhdGEgICAgICA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtR2V0KCBJdGVtSUQgPT4gJEl0ZW1JRCApOwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICgpOwogICAgICAgIG15ICROb3RlICAgICAgICA9ICcnOwoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgICAgICVQcmVmZXJlbmNlcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzJykgfTsKICAgICAgICB9CgogICAgICAgIGZvciBteSAkSXRlbSAoIGtleXMgJVByZWZlcmVuY2VzICkgewogICAgICAgICAgICBteSAkTW9kdWxlID0gJFByZWZlcmVuY2VzeyRJdGVtfS0+e01vZHVsZX0KICAgICAgICAgICAgICAgIHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skSXRlbX0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oIEdlbmVyYWxDYXRhbG9nRGF0YSA9PiAkR0NEYXRhICk7CiAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW0gPSAoKTsKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQYXJhbUl0ZW0tPntOYW1lfSB9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAhJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICBJdGVtSUQgICA9PiAkR0NEYXRhLT57SXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKSBpZiAhJFN1Y2Nlc3M7CgogICAgICAgICMgcmVkaXJlY3QgdG8gb3ZlcnZpZXcgY2xhc3MgbGlzdAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJlZGlyZWN0KAogICAgICAgICAgICBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufSZTdWJhY3Rpb249SXRlbUxpc3QmQ2xhc3M9JEl0ZW1EYXRhe0NsYXNzfSIKICAgICAgICApOwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgb3ZlcnZpZXcKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2UgewoKICAgICAgICAjIGdldCBjYXRhbG9nIGNsYXNzIGxpc3QKICAgICAgICBteSAkQ2xhc3NMaXN0ICAgICAgID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzTGlzdCgpOwogICAgICAgIG15ICRDbGFzc09wdGlvblN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ0NsYXNzJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRDbGFzc0xpc3QsCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCBvdmVydmlldwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBDbGFzc09wdGlvblN0cmcgPT4gJENsYXNzT3B0aW9uU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3MnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkQ3NzQ2xhc3MgPSAnJzsKICAgICAgICBmb3IgbXkgJENsYXNzICggQHskQ2xhc3NMaXN0fSApIHsKCiAgICAgICAgICAgICMgc2V0IG91dHB1dCBjbGFzcwogICAgICAgICAgICAkQ3NzQ2xhc3MgPSAkQ3NzQ2xhc3MgZXEgJ3NlYXJjaGFjdGl2ZScgPyAnc2VhcmNocGFzc2l2ZScgOiAnc2VhcmNoYWN0aXZlJzsKCiAgICAgICAgICAgICMgb3V0cHV0IG92ZXJ2aWV3IGNsYXNzIGxpc3QKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3Q2xhc3NMaXN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENsYXNzICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyIGFuZCBuYXZiYXIKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAjIGNyZWF0ZSBvdXRwdXQgc3RyaW5nCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkdlbmVyYWxDYXRhbG9nJywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2VuZXJpYy5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dlbmVyaWMucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODoxOCByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZW5lcmljOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgVXNlcklECiAgICAgICAgUGFyYW1PYmplY3QgQ29uZmlnSXRlbSBHZW5lcmFsQ2F0YWxvZ09iamVjdCBFbmNvZGVPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgZGllICJHb3Qgbm8gJE9iamVjdCEiIGlmICggISRTZWxmLT57JE9iamVjdH0gKTsKICAgIH0KCiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHcm91cC0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFBhcmFtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFBhcmFtcyA9ICgpOwogICAgbXkgJEdldFBhcmFtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57UHJlZktleX0gKTsKCiAgICBpZiAoICFkZWZpbmVkKCRHZXRQYXJhbSkgKSB7CiAgICAgICAgJEdldFBhcmFtCiAgICAgICAgICAgID0gZGVmaW5lZCggJFBhcmFte0dlbmVyYWxDYXRhbG9nRGF0YX0tPnsgJFNlbGYtPntDb25maWdJdGVtfS0+e1ByZWZLZXl9IH0gKQogICAgICAgICAgICA/ICRQYXJhbXtHZW5lcmFsQ2F0YWxvZ0RhdGF9LT57ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSB9CiAgICAgICAgICAgIDogJFNlbGYtPntDb25maWdJdGVtfS0+e0RhdGFTZWxlY3RlZH07CiAgICB9CgogICAgaWYgKCAhKCBkZWZpbmVkICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gJiYgJFNlbGYtPntDb25maWdJdGVtfS0+e0Jsb2NrfSApICkgewogICAgICAgICRTZWxmLT57Q29uZmlnSXRlbX0tPntCbG9ja30gPSAnVGV4dCc7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ0l0ZW19LT57QmxvY2t9IGVxICdQZXJtaXNzaW9uJyApIHsKICAgICAgICAkUGFyYW17RGF0YX0gICAgICAgICA9IHsgJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTGlzdCggVmFsaWQgPT4gMSApIH07CiAgICAgICAgJFBhcmFte1Bvc3NpYmxlTm9uZX0gPSAxOwogICAgICAgICRQYXJhbXtCbG9ja30gICAgICAgID0gJ09wdGlvbic7CiAgICB9CgogICAgcHVzaCgKICAgICAgICBAUGFyYW1zLAogICAgICAgIHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBOYW1lICAgICAgID0+ICRTZWxmLT57Q29uZmlnSXRlbX0tPntQcmVmS2V5fSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkR2V0UGFyYW0sCiAgICAgICAgfSwKICAgICk7CgogICAgcmV0dXJuIEBQYXJhbXM7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte0dldFBhcmFtfSB9ICkgewogICAgICAgIG15IEBBcnJheSA9IEB7ICRQYXJhbXtHZXRQYXJhbX0tPnskS2V5fSB9OwogICAgICAgIGZvciBteSAkVmFsdWUgKEBBcnJheSkgewoKICAgICAgICAgICAgIyBwcmVmIHVwZGF0ZSBkYgogICAgICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEl0ZW1JRCA9PiAkUGFyYW17SXRlbUlEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntNZXNzYWdlfSA9ICdQcmVmZXJlbmNlcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseSEnOwogICAgcmV0dXJuIDE7Cn0KCnN1YiBFcnJvciB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e0Vycm9yfSB8fCAnJzsKfQoKc3ViIE1lc3NhZ2UgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJFNlbGYtPntNZXNzYWdlfSB8fCAnJzsKfQoKMTsK
IyAtLQojIEFkbWluR2VuZXJhbENhdGFsb2cuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBBZG1pbkdlbmVyYWxDYXRhbG9nCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkdlbmVyYWxDYXRhbG9nLmR0bCx2IDEuOCAyMDA5LzEwLzA3IDEzOjE4OjE4IHJlYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgPHRyPgogICAgICAgIDx0ZCBjb2xzcGFuPSIyIiBjbGFzcz0ibWFpbmhlYWQiPgogICAgICAgICAgICAkRW52eyJCb3gwIn0kVGV4dHsiR2VuZXJhbCBDYXRhbG9nIE1hbmFnZW1lbnQifSRFbnZ7IkJveDEifQogICAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iMzAlIiBjbGFzcz0ibWFpbmJvZHkiPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9ImdldCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJJdGVtRWRpdCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJJdGVtSUQiIHZhbHVlPSJORVciPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkFkZCBDYXRhbG9nIEl0ZW0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IkNsYXNzT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iYnV0dG9uIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxicj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iSXRlbUVkaXQiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSXRlbUlEIiB2YWx1ZT0iTkVXIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iTkVXIj4KICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJBZGQgQ2F0YWxvZyBDbGFzcyJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPiRUZXh0eyJBZGQgYSBuZXcgQ2F0YWxvZyBDbGFzcy4ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkFkZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI3MCUiIGNsYXNzPSJtYWluYm9keSI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiTGlzdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI2MCUiPiRUZXh0eyJDYXRhbG9nIENsYXNzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtTGlzdCZDbGFzcz0kTFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJDbGFzcyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdDbGFzc0xpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3Q2xhc3MgLS0+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJMaXN0In06PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjYwJSI+JFFEYXRheyJDbGFzcyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIGFsaWduPSJjZW50ZXIiPiRUZXh0eyJWYWxpZCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSIkUURhdGF7IkNzc0NsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1JdGVtRWRpdCZJdGVtSUQ9JFFEYXRheyJJdGVtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiTmFtZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9IiBhbGlnbj0iY2VudGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiRRRGF0YXsiVmFsaWQifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbUxpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ij4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9Ikl0ZW1TYXZlIj4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ikl0ZW1JRCIgdmFsdWU9IiRRRGF0YXsiSXRlbUlEIn0iPgogICAgICAgICAgICAgICAgPHRhYmxlIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7Ikl0ZW0ifSAkVGV4dHsiRWRpdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSIzIj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNhdGFsb2cgQ2xhc3MifTogPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0FkZCAtLT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXRDbGFzc0V4aXN0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ2F0YWxvZyBDbGFzcyJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNsYXNzIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkNsYXNzIiB2YWx1ZT0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpJdGVtRWRpdENsYXNzRXhpc3QgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJOYW1lIn06IDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJOYW1lIiB2YWx1ZT0iJFFEYXRheyJOYW1lIn0iIHNpemU9IjQ1IiBtYXhsZW5ndGg9IjEwMCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBzaXplPSIzMCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6SW5wdXRLZXkgLS0+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifTo8YnIvPjxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdmFsdWU9IiRRRGF0YXsiU2VsZWN0ZWRJRCJ9IiBzaXplPSIzMCIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOklucHV0IC0tPgo8IS0tIGR0bDpibG9jazpUZXh0QXJlYSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In06PGJyLz48aSBjbGFzcz0ic21hbGwiPigkVGV4dHsiJERhdGF7IkRlc2MifSJ9KTwvaT48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHJvd3M9IiRRRGF0YXsiUm93cyJ9IiBjb2xzPSIkUURhdGF7IkNvbHMifSI+JFFEYXRheyJTZWxlY3RlZElEIn08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRleHRBcmVhIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiTGFiZWwifSJ9ICRUZXh0eyIkUURhdGF7IktleSJ9In06PGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSJzbWFsbCI+KCRUZXh0eyIkRGF0YXsiRGVzYyJ9In0pPC9pPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik9wdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CjwhLS0gZHRsOmJsb2NrOlVwbG9hZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiREYXRheyJMYWJlbCJ9In0gJFRleHR7IiRRRGF0YXsiS2V5In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSIkUURhdGF7Ik5hbWUifSIgdHlwZT0iZmlsZSIgc2l6ZT0iMzAiIGNsYXNzPSJmaXhlZCIvPjxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIiPiRRRGF0YXsiRmlsZW5hbWUifTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpVcGxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOlBhc3N3b3JkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IkxhYmVsIn0ifSAkVGV4dHsiJFFEYXRheyJLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0icGFzc3dvcmQiIG5hbWU9IiRRRGF0YXsiTmFtZSJ9IiB2YWx1ZT0iIiBzaXplPSIzMCIvPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UGFzc3dvcmQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWxpZCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7IlZhbGlkT3B0aW9uU3RyZyJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ29tbWVudCJ9OiA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ29tbWVudCIgdmFsdWU9IiRRRGF0YXsiQ29tbWVudCJ9IiBzaXplPSI1MCIgbWF4bGVuZ3RoPSIyMDAiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRmb290ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6SXRlbUVkaXQgLS0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cucG0gLSBhbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA5IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogR2VuZXJhbENhdGFsb2cucG0sdiAxLjQ3IDIwMDkvMTAvMDcgMTM6MTg6MDQgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40NyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nIC0gZ2VuZXJhbCBjYXRhbG9nIGxpYgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZ2VuZXJhbCBjYXRhbG9nIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdlbmVyYWxDYXRhbG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57VmFsaWRPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbS0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0dlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc01vZHVsZScpCiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQic7CiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyYXRvck1vZHVsZSkgKSB7CiAgICAgICAgJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0gPSAkR2VuZXJhdG9yTW9kdWxlLT5uZXcoJVBhcmFtKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENsYXNzTGlzdCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIG9mIGFsbCBnZW5lcmFsIGNhdGFsb2cgY2xhc3NlcwoKICAgIG15ICRBcnJheVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+Q2xhc3NMaXN0KCk7Cgo9Y3V0CgpzdWIgQ2xhc3NMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIERJU1RJTkNUKGdlbmVyYWxfY2F0YWxvZ19jbGFzcykgJwogICAgICAgICAgICAuICdGUk9NIGdlbmVyYWxfY2F0YWxvZyBPUkRFUiBCWSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MnLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15IEBDbGFzc0xpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQENsYXNzTGlzdCwgJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gXEBDbGFzc0xpc3Q7Cn0KCj1pdGVtIENsYXNzUmVuYW1lKCkKCnJlbmFtZSBhIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAnSVRTTTo6Q29uZmlnSXRlbTo6U3RhdGUnLAogICAgICAgIENsYXNzTmV3ID0+ICdJVFNNOjpDb25maWdJdGVtOjpEZXBsb3ltZW50U3RhdGUnLAogICAgKTsKCj1jdXQKCnN1YiBDbGFzc1JlbmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzc09sZCBDbGFzc05ldykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3NPbGQgQ2xhc3NOZXcpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDEgaWYgJFBhcmFte0NsYXNzTmV3fSBlcSAkUGFyYW17Q2xhc3NPbGR9OwoKICAgICMgY2hlY2sgaWYgbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte0NsYXNzTmV3fSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJEFscmVhZHlFeGlzdHMgPSAwOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkQWxyZWFkeUV4aXN0cyA9IDE7CiAgICB9CgogICAgaWYgKCRBbHJlYWR5RXhpc3RzKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZW5hbWUgY2xhc3MgJFBhcmFte0NsYXNzT2xkfSEgTmV3IGNsYXNzbmFtZSBhbHJlYWR5IGV4aXN0cy4iCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnsgJFBhcmFte0NsYXNzT2xkfSB9OwogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnsgJFBhcmFte0NsYXNzTmV3fSB9OwogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntJdGVtSUR9OwogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUxpc3R9OwoKICAgICMgcmVuYW1lIGdlbmVyYWwgY2F0YWxvZyBjbGFzcwogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDbGFzc05ld30sIFwkUGFyYW17Q2xhc3NPbGR9IF0sCiAgICApOwp9Cgo9aXRlbSBJdGVtTGlzdCgpCgpyZXR1cm4gYSBsaXN0IGFzIGhhc2ggcmVmZXJlbmNlIG9mIG9uZSBnZW5lcmFsIGNhdGFsb2cgY2xhc3MKCiAgICBteSAkSGFzaFJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgICAgICAgICA9PiAnSVRTTTo6U2VydmljZTo6VHlwZScsCiAgICAgICAgVmFsaWQgICAgICAgICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICAgICAgUHJlZmVyZW5jZXMgICA9PiB7ICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCB7fQogICAgICAgICAgICBQZXJtaXNzaW9uID0+IDIsICAgICAgICAgICAgICAgICAgICAgIyBvciB3aGF0ZXZlciBwcmVmZXJlbmNlcyBjYW4gYmUgdXNlZAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1MaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDbGFzc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENsYXNzIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWxpZH0gKSB7CiAgICAgICAgJFBhcmFte1ZhbGlkfSA9IDE7CiAgICB9CgogICAgbXkgJFByZWZlcmVuY2VzQ2FjaGVLZXkgPSAnJzsKICAgIG15ICRQcmVmZXJlbmNlc1RhYmxlICAgID0gJyc7CiAgICBteSAkUHJlZmVyZW5jZXNXaGVyZSAgICA9ICcnOwogICAgbXkgQFByZWZlcmVuY2VzQmluZDsKCiAgICAjIGhhbmRsZSBnaXZlbiBwcmVmZXJlbmNlcwogICAgaWYgKCBleGlzdHMgJFBhcmFte1ByZWZlcmVuY2VzfSAmJiByZWYgJFBhcmFte1ByZWZlcmVuY2VzfSBlcSAnSEFTSCcgKSB7CgogICAgICAgICRQcmVmZXJlbmNlc1RhYmxlID0gJywgZ2VuZXJhbF9jYXRhbG9nX3ByZWZlcmVuY2VzJzsKICAgICAgICBteSBAV2hlcmVzOwoKICAgICAgICAjIGFkZCBhbGwgcHJlZmVyZW5jZXMgZ2l2ZW4gdG8gd2hlcmUtY2xhdXNlCiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRQYXJhbXtQcmVmZXJlbmNlc30gfSApIHsKCiAgICAgICAgICAgIGlmICggcmVmKCAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gKSBuZSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9ID0gWyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHVzaCBAV2hlcmVzLCAnKHByZWZfa2V5ID0gPyBBTkQgcHJlZl92YWx1ZSBJTiAoJwogICAgICAgICAgICAgICAgLiBqb2luKCAnLCAnLCBtYXAgeyc/J30gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH0gKQogICAgICAgICAgICAgICAgLiAnKSknOwoKICAgICAgICAgICAgcHVzaCBAUHJlZmVyZW5jZXNCaW5kLCBcJEtleSwgbWFwIHsgXCRfIH0gQHsgJFBhcmFte1ByZWZlcmVuY2VzfS0+eyRLZXl9IH07CgogICAgICAgICAgICAjIGFkZCBmdW5jdGlvbmFsaXR5IGxpc3QgdG8gY2FjaGUga2V5CiAgICAgICAgICAgICRQcmVmZXJlbmNlc0NhY2hlS2V5IC49ICcjIyMjJyBpZiAkUHJlZmVyZW5jZXNDYWNoZUtleTsKICAgICAgICAgICAgJFByZWZlcmVuY2VzQ2FjaGVLZXkgLj0gam9pbiBxeyMjIyN9LCAkS2V5LCBtYXAgeyRffSBAeyAkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICRQcmVmZXJlbmNlc1doZXJlID0gJyBBTkQgJyAuIGpvaW4gJyBBTkQgJywgQFdoZXJlczsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gIlNFTEVDVCBpZCwgbmFtZSBGUk9NIGdlbmVyYWxfY2F0YWxvZyAkUHJlZmVyZW5jZXNUYWJsZSAiCiAgICAgICAgLiAiV0hFUkUgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyAkUHJlZmVyZW5jZXNXaGVyZSAiOwogICAgbXkgQEJJTkQgPSAoIFwkUGFyYW17Q2xhc3N9LCBAUHJlZmVyZW5jZXNCaW5kICk7CgogICAgIyBhZGQgdmFsaWQgc3RyaW5nIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkU1FMIC49ICdBTkQgdmFsaWRfaWQgPSAxICc7CiAgICB9CgogICAgIyBjcmVhdGUgY2FjaGUga2V5CiAgICBteSAkQ2FjaGVLZXkgPSAkUGFyYW17Q2xhc3N9IC4gJyMjIyMnIC4gJFBhcmFte1ZhbGlkfSAuICcjIyMjJyAuICRQcmVmZXJlbmNlc0NhY2hlS2V5OwoKICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH0tPnskQ2FjaGVLZXl9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH0tPnskQ2FjaGVLZXl9OwoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJJTkQsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICREYXRheyAkUm93WzBdIH0gPSAkUm93WzFdOwogICAgfQoKICAgICMgY2hlY2sgaXRlbQogICAgaWYgKCAhJURhdGEgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDbGFzcyBub3QgZm91bmQgaW4gZGF0YWJhc2UhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICRTZWxmLT57Q2FjaGV9LT57SXRlbUxpc3R9LT57JENhY2hlS2V5fSA9IFwlRGF0YTsKCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBJdGVtR2V0KCkKCmdldCBhIGdlbmVyYWwgY2F0YWxvZyBpdGVtCgpSZXR1cm4KICAgICRJdGVtRGF0YXtJdGVtSUR9CiAgICAkSXRlbURhdGF7Q2xhc3N9CiAgICAkSXRlbURhdGF7TmFtZX0KICAgICRJdGVtRGF0YXtWYWxpZElEfQogICAgJEl0ZW1EYXRhe0NvbW1lbnR9CiAgICAkSXRlbURhdGF7Q3JlYXRlVGltZX0KICAgICRJdGVtRGF0YXtDcmVhdGVCeX0KICAgICRJdGVtRGF0YXtDaGFuZ2VUaW1lfQogICAgJEl0ZW1EYXRhe0NoYW5nZUJ5fQoKICAgIG15ICRJdGVtRGF0YVJlZiA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUdldCgKICAgICAgICBJdGVtSUQgID0+IDMsCiAgICApOwoKICAgIG9yCgogICAgbXkgJEl0ZW1EYXRhUmVmID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtR2V0KAogICAgICAgIENsYXNzID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICA9PiAnSXRlbSBOYW1lJywKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbUlEfSAmJiAoICEkUGFyYW17Q2xhc3N9IHx8ICEkUGFyYW17TmFtZX0gKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbUlEIE9SIENsYXNzIGFuZCBOYW1lIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSBzcWwgc3RyaW5nCiAgICBteSAkU1FMID0gJ1NFTEVDVCBpZCwgZ2VuZXJhbF9jYXRhbG9nX2NsYXNzLCBuYW1lLCB2YWxpZF9pZCwgY29tbWVudHMsICcKICAgICAgICAuICdjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IEZST00gZ2VuZXJhbF9jYXRhbG9nIFdIRVJFICc7CiAgICBteSBAQklORDsKCiAgICAjIGFkZCBvcHRpb25zIHRvIHNxbCBzdHJpbmcKICAgIGlmICggJFBhcmFte0NsYXNzfSAmJiAkUGFyYW17TmFtZX0gKSB7CgogICAgICAgICMgY2hlY2sgaWYgcmVzdWx0IGlzIGFscmVhZHkgY2FjaGVkCiAgICAgICAgcmV0dXJuICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnsgJFBhcmFte0NsYXNzfSB9LT57ICRQYXJhbXtOYW1lfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnsgJFBhcmFte0NsYXNzfSB9LT57ICRQYXJhbXtOYW1lfSB9OwoKICAgICAgICAjIGFkZCBjbGFzcyBhbmQgbmFtZSB0byBzcWwgc3RyaW5nCiAgICAgICAgJFNRTCAuPSAnZ2VuZXJhbF9jYXRhbG9nX2NsYXNzID0gPyBBTkQgbmFtZSA9ID8nOwogICAgICAgIHB1c2ggQEJJTkQsICggXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0gKTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNoZWNrIGlmIHJlc3VsdCBpcyBhbHJlYWR5IGNhY2hlZAogICAgICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0l0ZW1HZXR9LT57SXRlbUlEfS0+eyAkUGFyYW17SXRlbUlEfSB9CiAgICAgICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntJdGVtSUR9LT57ICRQYXJhbXtJdGVtSUR9IH07CgogICAgICAgICMgYWRkIGl0ZW0gaWQgdG8gc3FsIHN0cmluZwogICAgICAgICRTUUwgLj0gJ2lkID0gPyc7CiAgICAgICAgcHVzaCBAQklORCwgXCRQYXJhbXtJdGVtSUR9OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFxAQklORCwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVJdGVtRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEl0ZW1EYXRhe0l0ZW1JRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkSXRlbURhdGF7Q2xhc3N9ICAgICAgPSAkUm93WzFdOwogICAgICAgICRJdGVtRGF0YXtOYW1lfSAgICAgICA9ICRSb3dbMl07CiAgICAgICAgJEl0ZW1EYXRhe1ZhbGlkSUR9ICAgID0gJFJvd1szXTsKICAgICAgICAkSXRlbURhdGF7Q29tbWVudH0gICAgPSAkUm93WzRdIHx8ICcnOwogICAgICAgICRJdGVtRGF0YXtDcmVhdGVUaW1lfSA9ICRSb3dbNV07CiAgICAgICAgJEl0ZW1EYXRhe0NyZWF0ZUJ5fSAgID0gJFJvd1s2XTsKICAgICAgICAkSXRlbURhdGF7Q2hhbmdlVGltZX0gPSAkUm93WzddOwogICAgICAgICRJdGVtRGF0YXtDaGFuZ2VCeX0gICA9ICRSb3dbOF07CiAgICB9CgogICAgIyBjaGVjayBpdGVtCiAgICBpZiAoICEkSXRlbURhdGF7SXRlbUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0l0ZW0gbm90IGZvdW5kIGluIGRhdGFiYXNlIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZ2VuZXJhbCBjYXRhbG9nIHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCggSXRlbUlEID0+ICRJdGVtRGF0YXtJdGVtSUR9ICk7CgogICAgIyBtZXJnZSBoYXNoCiAgICBpZiAoJVByZWZlcmVuY2VzKSB7CiAgICAgICAgJUl0ZW1EYXRhID0gKCAlSXRlbURhdGEsICVQcmVmZXJlbmNlcyApOwogICAgfQoKICAgICMgY2FjaGUgdGhlIHJlc3VsdAogICAgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0NsYXNzfS0+eyAkSXRlbURhdGF7Q2xhc3N9IH0tPnsgJEl0ZW1EYXRhe05hbWV9IH0gPSBcJUl0ZW1EYXRhOwogICAgJFNlbGYtPntDYWNoZX0tPntJdGVtR2V0fS0+e0l0ZW1JRH0tPnsgJEl0ZW1EYXRhe0l0ZW1JRH0gfSA9IFwlSXRlbURhdGE7CgogICAgcmV0dXJuIFwlSXRlbURhdGE7Cn0KCj1pdGVtIEl0ZW1BZGQoKQoKYWRkIGEgbmV3IGdlbmVyYWwgY2F0YWxvZyBpdGVtCgogICAgbXkgJEl0ZW1JRCA9ICRHZW5lcmFsQ2F0YWxvZ09iamVjdC0+SXRlbUFkZCgKICAgICAgICBDbGFzcyAgICAgICAgID0+ICdJVFNNOjpTZXJ2aWNlOjpUeXBlJywKICAgICAgICBOYW1lICAgICAgICAgID0+ICdJdGVtIE5hbWUnLAogICAgICAgIFZhbGlkSUQgICAgICAgPT4gMSwKICAgICAgICBDb21tZW50ICAgICAgID0+ICdDb21tZW50JywgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSXRlbUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcyBOYW1lIFZhbGlkSUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBkZWZhdWx0IHZhbHVlcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ29tbWVudCkpIHsKICAgICAgICAkUGFyYW17JEFyZ3VtZW50fSB8fD0gJyc7CiAgICB9CgogICAgIyBjbGVhbnVwIGdpdmVuIHBhcmFtcwogICAgZm9yIG15ICRBcmd1bWVudCAocXcoQ2xhc3MpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxTcGFjZXMgICA9PiAxLAogICAgICAgICk7CiAgICB9CiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhOYW1lIENvbW1lbnQpKSB7CiAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgU3RyaW5nUmVmICAgICAgICAgPT4gXCRQYXJhbXskQXJndW1lbnR9LAogICAgICAgICAgICBSZW1vdmVBbGxOZXdsaW5lcyA9PiAxLAogICAgICAgICAgICBSZW1vdmVBbGxUYWJzICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkTm9BZGQ7CiAgICB3aGlsZSAoICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJE5vQWRkID0gMTsKICAgIH0KCiAgICAjIGFib3J0IGluc2VydCBvZiBuZXcgaXRlbSwgaWYgaXRlbSBuYW1lIGFscmVhZHkgZXhpc3RzCiAgICBpZiAoJE5vQWRkKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBhZGQgbmV3IGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIHdpdGggc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgY2xhc3MuIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJlc2V0IGNhY2hlCiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH07CgogICAgIyBpbnNlcnQgbmV3IGl0ZW0KICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnSU5TRVJUIElOVE8gZ2VuZXJhbF9jYXRhbG9nICcKICAgICAgICAgICAgLiAnKGdlbmVyYWxfY2F0YWxvZ19jbGFzcywgbmFtZSwgdmFsaWRfaWQsIGNvbW1lbnRzLCAnCiAgICAgICAgICAgIC4gJ2NyZWF0ZV90aW1lLCBjcmVhdGVfYnksIGNoYW5nZV90aW1lLCBjaGFuZ2VfYnkpIFZBTFVFUyAnCiAgICAgICAgICAgIC4gJyg/LCA/LCA/LCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtDbGFzc30sIFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFwkUGFyYW17VmFsaWRJRH0sCiAgICAgICAgICAgIFwkUGFyYW17Q29tbWVudH0sIFwkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgXCRQYXJhbXtVc2VySUR9LAogICAgICAgIF0sCiAgICApOwoKICAgICMgZmluZCBpZCBvZiBuZXcgaXRlbQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBnZW5lcmFsX2NhdGFsb2cgJwogICAgICAgICAgICAuICdXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17Q2xhc3N9LCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkSXRlbUlEOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAkSXRlbUlEID0gJFJvd1swXTsKICAgIH0KCiAgICByZXR1cm4gJEl0ZW1JRDsKfQoKPWl0ZW0gSXRlbVVwZGF0ZSgpCgp1cGRhdGUgYSBleGlzdGluZyBnZW5lcmFsIGNhdGFsb2cgaXRlbQoKICAgIG15ICRUcnVlID0gJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5JdGVtVXBkYXRlKAogICAgICAgIEl0ZW1JRCAgICAgICAgPT4gMTIzLAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0l0ZW0gTmFtZScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIENvbW1lbnQgICAgICAgPT4gJ0NvbW1lbnQnLCAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VySUQgICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEl0ZW1VcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoSXRlbUlEIE5hbWUgVmFsaWRJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWVzCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDb21tZW50KSkgewogICAgICAgICRQYXJhbXskQXJndW1lbnR9IHx8PSAnJzsKICAgIH0KCiAgICAjIGNsZWFudXAgZ2l2ZW4gcGFyYW1zCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDbGFzcykpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFNwYWNlcyAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE5hbWUgQ29tbWVudCkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFBhcmFteyRBcmd1bWVudH0sCiAgICAgICAgICAgIFJlbW92ZUFsbE5ld2xpbmVzID0+IDEsCiAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjbGFzcyBvZiBpdGVtCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAnU0VMRUNUIGdlbmVyYWxfY2F0YWxvZ19jbGFzcyBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtJdGVtSUR9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkQ2xhc3M7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRDbGFzcyA9ICRSb3dbMF07CiAgICB9CgogICAgaWYgKCAhJENsYXNzICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgdXBkYXRlIGl0ZW0hIEdlbmVyYWwgY2F0YWxvZyBpdGVtIG5vdCBmb3VuZCBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBmaW5kIGV4aXRpbmcgaXRlbSB3aXRoIHNhbWUgbmFtZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGdlbmVyYWxfY2F0YWxvZyBXSEVSRSBnZW5lcmFsX2NhdGFsb2dfY2xhc3MgPSA/IEFORCBuYW1lID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJENsYXNzLCBcJFBhcmFte05hbWV9IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSAkVXBkYXRlID0gMTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgaWYgKCAkUGFyYW17SXRlbUlEfSBuZSAkUm93WzBdICkgewogICAgICAgICAgICAkVXBkYXRlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAhJFVwZGF0ZSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNhbid0IHVwZGF0ZSBpdGVtISBHZW5lcmFsIGNhdGFsb2cgaXRlbSB3aXRoIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGlzIGNsYXNzLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyByZXNldCBjYWNoZQogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntDbGFzc30tPnskQ2xhc3N9LT57ICRQYXJhbXtOYW1lfSB9OwogICAgZGVsZXRlICRTZWxmLT57Q2FjaGV9LT57SXRlbUdldH0tPntJdGVtSUR9LT57ICRQYXJhbXtJdGVtSUR9IH07CiAgICBkZWxldGUgJFNlbGYtPntDYWNoZX0tPntJdGVtTGlzdH07CgogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ1VQREFURSBnZW5lcmFsX2NhdGFsb2cgU0VUICcKICAgICAgICAgICAgLiAnbmFtZSA9ID8sIHZhbGlkX2lkID0gPywgY29tbWVudHMgPSA/LCAnCiAgICAgICAgICAgIC4gJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAsIGNoYW5nZV9ieSA9ID8gJwogICAgICAgICAgICAuICdXSEVSRSBpZCA9ID8nLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte05hbWV9LAogICAgICAgICAgICBcJFBhcmFte1ZhbGlkSUR9LCBcJFBhcmFte0NvbW1lbnR9LAogICAgICAgICAgICBcJFBhcmFte1VzZXJJRH0sICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNTZXQoKQoKc2V0IEdlbmVyYWxDYXRhbG9nIHByZWZlcmVuY2VzCgogICAgJEdlbmVyYWxDYXRhbG9nT2JqZWN0LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KAogICAgICAgIEl0ZW1JRCA9PiAxMjMsCiAgICAgICAgS2V5ICAgID0+ICdVc2VyQ29tbWVudCcsCiAgICAgICAgVmFsdWUgID0+ICdzb21lIGNvbW1lbnQnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KEBfKTsKfQoKPWl0ZW0gR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgpCgpnZXQgR2VuZXJhbENhdGFsb2cgcHJlZmVyZW5jZXMKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkUXVldWVPYmplY3QtPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgSXRlbUlEID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldChAXyk7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNDcgJCAkRGF0ZTogMjAwOS8xMC8wNyAxMzoxODowNCAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vR2VuZXJhbENhdGFsb2cvUHJlZmVyZW5jZXNEQi5wbSAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFByZWZlcmVuY2VzREIucG0sdiAxLjEgMjAwOS8xMC8wNyAxMzoxODowNSByZWIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzo6UHJlZmVyZW5jZXNEQiAtIHNvbWUgcHJlZmVyZW5jZXMgZnVuY3Rpb25zIGZvciBnZW5lcmFsIGNhdGFsb2cKCj1oZWFkMSBTWU5PUFNJUwoKc29tZSBwcmVmZXJlbmNlcyBmdW5jdGlvbnMgZm9yIGdlbmVyYWwgY2F0YWxvZwoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOjpQcmVmZXJlbmNlc0RCOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkR3JvdXBPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c6OlByZWZlcmVuY2VzREItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgcHJlZmVyZW5jZXMgdGFibGUgZGF0YQogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSAgICAgID0gJ2dlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyc7CiAgICAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9ICAgPSAncHJlZl9rZXknOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlVmFsdWV9ID0gJ3ByZWZfdmFsdWUnOwogICAgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlR2NJRH0gID0gJ2dlbmVyYWxfY2F0YWxvZ19pZCc7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0KCkKClNldCBwcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICBJdGVtSUQgPT4gMTIzNCwKICAgICAgICBLZXkgICAgPT4gJ0Z1bmN0aW9uYWxpdHknLAogICAgICAgIFZhbHVlICA9PiAnb3BlcmF0aW9uYWwnLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzU2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQgS2V5IFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgb2xkIGRhdGEKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlfSBXSEVSRSAiCiAgICAgICAgICAgIC4gIiRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyBBTkQgJFNlbGYtPntQcmVmZXJlbmNlc1RhYmxlS2V5fSA9ID8iLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIGluc2VydCBuZXcgZGF0YQogICAgcmV0dXJuICRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZX0gKCRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9LCAiCiAgICAgICAgICAgIC4gIiAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0pICIKICAgICAgICAgICAgLiAiIFZBTFVFUyAoPywgPywgPykiLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte0l0ZW1JRH0sCiAgICAgICAgICAgIFwkUGFyYW17S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtWYWx1ZX0sCiAgICAgICAgXSwKICAgICk7Cn0KCj1pdGVtIEdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoKQoKR2V0IGFsbCBQcmVmZXJlbmNlcyBmb3IgYW4gaXRlbQoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRQcmVmZXJlbmNlc09iamVjdC0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc0dldCgKICAgICAgICBJdGVtSUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBHZW5lcmFsQ2F0YWxvZ1ByZWZlcmVuY2VzR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhJdGVtSUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBxdWV1ZSBwcmVmZXJlbmNlcyBhcmUgYXZhaWxhYmxlCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnR2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlcycpICkgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gIlNFTEVDVCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVLZXl9LCAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGVWYWx1ZX0gIgogICAgICAgICAgICAuICIgRlJPTSAkU2VsZi0+e1ByZWZlcmVuY2VzVGFibGV9IFdIRVJFICRTZWxmLT57UHJlZmVyZW5jZXNUYWJsZUdjSUR9ID0gPyIsCiAgICAgICAgQmluZCA9PiBbIFwkUGFyYW17SXRlbUlEfSBdLAogICAgKTsKCiAgICBteSAlRGF0YTsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJERhdGF7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICVEYXRhOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTg6MDUgJAoKPWN1dAo=
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnQgLSBnZW5lcmFsIGNhdGFsb2cgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnQsdiAxLjE5IDIwMDkvMTAvMDcgMTM6MTY6MjMgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB1dGY4OwoKdXNlIHZhcnMgcXcoJFNlbGYpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCiMgY3JlYXRlIG5lZWRlZCB1c2VycwpteSBAVXNlcklEczsKewoKICAgICMgZGlzYWJsZSBlbWFpbCBjaGVja3MgdG8gY3JlYXRlIG5ldyB1c2VyCiAgICBteSAkQ2hlY2tFbWFpbEFkZHJlc3Nlc09yZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDaGVja0VtYWlsQWRkcmVzc2VzJykgfHwgMTsKICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+U2V0KAogICAgICAgIEtleSAgID0+ICdDaGVja0VtYWlsQWRkcmVzc2VzJywKICAgICAgICBWYWx1ZSA9PiAwLAogICAgKTsKCiAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDIgKSB7CgogICAgICAgICMgY3JlYXRlIG5ldyB1c2VycyBmb3IgdGhlIHRlc3RzCiAgICAgICAgbXkgJFVzZXJJRCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJBZGQoCiAgICAgICAgICAgIFVzZXJGaXJzdG5hbWUgPT4gJ0dlbmVyYWxDYXRhbG9nJyAuICRDb3VudGVyLAogICAgICAgICAgICBVc2VyTGFzdG5hbWUgID0+ICdVbml0VGVzdCcsCiAgICAgICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ1VuaXRUZXN0LUdlbmVyYWxDYXRhbG9nLScgLiAkQ291bnRlciAuIGludCByYW5kIDFfMDAwXzAwMCwKICAgICAgICAgICAgVXNlckVtYWlsICAgICA9PiAnVW5pdFRlc3QtR2VuZXJhbENhdGFsb2ctJyAuICRDb3VudGVyIC4gJ0Bsb2NhbGhvc3QnLAogICAgICAgICAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICAgICAgICAgIENoYW5nZVVzZXJJRCAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBVc2VySURzLCAkVXNlcklEOwogICAgfQoKICAgICMgcmVzdG9yZSBvcmlnaW5hbCBlbWFpbCBjaGVjayBwYXJhbQogICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgS2V5ICAgPT4gJ0NoZWNrRW1haWxBZGRyZXNzZXMnLAogICAgICAgIFZhbHVlID0+ICRDaGVja0VtYWlsQWRkcmVzc2VzT3JnLAogICAgKTsKfQoKIyBjcmVhdGUgbmVlZGVkIHJhbmRvbSBjbGFzc2VzCm15IEBDbGFzc1JhbmQ7Cgpmb3IgbXkgJENvdW50ZXIgKCAxIC4uIDMgKSB7CgogICAgcHVzaCBAQ2xhc3NSYW5kLCBpbnQgcmFuZCAxXzAwMF8wMDA7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBkZWZpbmUgZ2VuZXJhbCB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpteSAkSXRlbURhdGEgPSBbCgogICAgIyB0aGlzIGl0ZW0gaXMgTk9UIGNvbXBsZXRlIGFuZCBtdXN0IG5vdCBiZSBhZGRlZAogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIGlzIE5PVCBjb21wbGV0ZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTInLAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBpcyBOT1QgY29tcGxldGUgYW5kIG11c3Qgbm90IGJlIGFkZGVkCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW00JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW00JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIG9uZSB0ZXN0IGJlZm9yZSBhbmQgbXVzdCBub3QgYmUgYWRkZWQKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNCcsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhpcyBpdGVtIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMF0sCiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgTk9UIHVwZGF0ZWQgKGl0ZW0gdXBkYXRlIGFyZ3VtZW50cyBOT1QgY29tcGxldGUpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgID0+ICdUZXN0SXRlbTVVUERBVEUxJywKICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySURzWzBdLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIE5PVCB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgTk9UIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoaXRlbSB1cGRhdGUgYXJndW1lbnRzIGFyZSBjb21wbGV0ZSkKICAgIHsKICAgICAgICBVcGRhdGUgPT4gewogICAgICAgICAgICBOYW1lICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1swXSwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUyJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gJFVzZXJJRHNbMF0sCiAgICAgICAgICAgIENvbW1lbnQgID0+ICcnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBpdGVtIG9uZSBhZGQtdGVzdCBiZWZvcmUgbXVzdCBiZSB1cGRhdGVkIChpdGVtIHVwZGF0ZSBhcmd1bWVudHMgYXJlIGNvbXBsZXRlKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJ1Rlc3RJdGVtNVVQREFURTMnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0SXRlbTVVUERBVEUzJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIHRlbXBsYXRlIG11c3QgYmUgaW5zZXJ0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gIiBcdCBcbiBcciBVbml0IFRlc3QgOjogVGVzdCBDbGFzcyBcdCBcbiBcciAiIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAiIFx0IFxuIFxyIFRlc3QgSXRlbSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiBcdCBcbiBcciBUZXN0IENvbW1lbnQgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3QgSXRlbScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgID0+ICdUZXN0IENvbW1lbnQnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAxLAogICAgICAgIH0sCiAgICB9LAoKICAgICMgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHVwZGF0ZWQgc3VjZXNzZnVsbHkgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gIiBcdCBcbiBcciBUZXN0IEl0ZW0gVVBEQVRFMSBcdCBcbiBcciAiLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ID0+ICIgXHQgXG4gXHIgVGVzdCBDb21tZW50IFVQREFURTEgXHQgXG4gXHIgIiwKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzBdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50IFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1swXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5ICh1bmljb2RlIGNoZWNrcykKICAgIHsKICAgICAgICBBZGQgPT4gewogICAgICAgICAgICBDbGFzcyAgID0+ICdVbml0VGVzdDo6VGVzdENsYXNzwqknIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIM+SIM+hIFRlc3QgSXRlbSDGqSDPniAnLAogICAgICAgICAgICBWYWxpZElEID0+IDEsCiAgICAgICAgICAgIENvbW1lbnQgPT4gJyDPoCDQryBUZXN0IENvbW1lbnQg0awg0aAgJywKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3PCqScgLiAkQ2xhc3NSYW5kWzFdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnz5Igz6EgVGVzdCBJdGVtIMapIM+eJywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJ8+gINCvIFRlc3QgQ29tbWVudCDRrCDRoCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAodW5pY29kZSBjaGVja3MpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdCBJdGVtIMapIMmkIFVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ID0+ICcgVGVzdCBDb21tZW50INGZINGSIFVQREFURTEgJywKICAgICAgICAgICAgVXNlcklEICA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgICAgIFVwZGF0ZUdldCA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgID0+ICdUZXN0IEl0ZW0gxqkgyaQgVVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnVGVzdCBDb21tZW50INGZINGSIFVQREFURTEnLAogICAgICAgICAgICBDcmVhdGVCeSA9PiAxLAogICAgICAgICAgICBDaGFuZ2VCeSA9PiAkVXNlcklEc1sxXSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChhIHNlY29uZCBpdGVtIHdpdGggRnVuY3Rpb25hbGl0eSAndGVzdDEnKQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzcycgLiAkQ2xhc3NSYW5kWzBdLAogICAgICAgICAgICBOYW1lICAgICA9PiAnVGVzdEl0ZW02JywKICAgICAgICAgICAgVmFsaWRJRCAgPT4gMSwKICAgICAgICAgICAgQ29tbWVudCAgPT4gJycsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCAoc2V0IGZ1bmN0aW9uYWxpdHkgdG8gJycpCiAgICB7CiAgICAgICAgVXBkYXRlID0+IHsKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW02VVBEQVRFMScsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtNlVQREFURTEnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoaXMgaXRlbSBtdXN0IGJlIGluc2VydGVkIHN1Y2Vzc2Z1bGx5IChzcGVjaWFsIGNoYXJhY3RlciBjaGVja3MpCiAgICB7CiAgICAgICAgQWRkID0+IHsKICAgICAgICAgICAgQ2xhc3MgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBDb21tZW50ID0+ICcgW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgfSwKICAgICAgICBBZGRHZXQgPT4gewogICAgICAgICAgICBDbGFzcyAgICA9PiAnVW5pdFRlc3Q6OlRlc3RDbGFzc1t0ZXN0XSUqXFwnIC4gJENsYXNzUmFuZFsxXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFt0ZXN0XSUqXFwnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIENyZWF0ZUJ5ID0+IDEsCiAgICAgICAgICAgIENoYW5nZUJ5ID0+IDEsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgdXBkYXRlZCBzdWNlc3NmdWxseSAoc3BlY2lhbCBjaGFyYWN0ZXIgY2hlY2tzKQogICAgewogICAgICAgIFVwZGF0ZSA9PiB7CiAgICAgICAgICAgIE5hbWUgICAgPT4gJyBbdGVzdF0lKlxcIFRlc3QgSXRlbSBVUERBVEUxIFt0ZXN0XSUqXFwgJywKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVXNlcklEc1sxXSwKICAgICAgICAgICAgQ29tbWVudCA9PiAnIFt0ZXN0XSUqXFwgVGVzdCBDb21tZW50IFVQREFURTEgW3Rlc3RdJSpcXCAnLAogICAgICAgICAgICBVc2VySUQgID0+ICRVc2VySURzWzFdLAogICAgICAgIH0sCiAgICAgICAgVXBkYXRlR2V0ID0+IHsKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1t0ZXN0XSUqXFwgVGVzdCBJdGVtIFVQREFURTEgW3Rlc3RdJSpcXCcsCiAgICAgICAgICAgIFZhbGlkSUQgID0+ICRVc2VySURzWzFdLAogICAgICAgICAgICBDb21tZW50ICA9PiAnW3Rlc3RdJSpcXCBUZXN0IENvbW1lbnQgVVBEQVRFMSBbdGVzdF0lKlxcJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gJFVzZXJJRHNbMV0sCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGlzIGl0ZW0gbXVzdCBiZSBpbnNlcnRlZCBzdWNlc3NmdWxseQogICAgewogICAgICAgIEFkZCA9PiB7CiAgICAgICAgICAgIENsYXNzICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICA9PiAnVGVzdEl0ZW1QcmVmZXJlbmNlcycsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gMSwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgIH0sCiAgICAgICAgQWRkR2V0ID0+IHsKICAgICAgICAgICAgQ2xhc3MgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFswXSwKICAgICAgICAgICAgTmFtZSAgICAgPT4gJ1Rlc3RJdGVtUHJlZmVyZW5jZXMnLAogICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICBDb21tZW50ICA9PiAnJywKICAgICAgICAgICAgQ3JlYXRlQnkgPT4gMSwKICAgICAgICAgICAgQ2hhbmdlQnkgPT4gMSwKICAgICAgICB9LAogICAgfSwKCiAgICAjIHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUgaXRlbSBvbmUgYWRkLXRlc3QgYmVmb3JlIG11c3QgYmUgc2V0CiAgICB7CiAgICAgICAgUHJlZmVyZW5jZXNTZXQgPT4gewogICAgICAgICAgICBUZXN0ICA9PiAnaGVsbG8gd29ybGQnLAogICAgICAgICAgICBHcm91cCA9PiAzMywKICAgICAgICB9LAogICAgICAgIFByZWZlcmVuY2VzR2V0ID0+IHsKICAgICAgICAgICAgVGVzdCAgPT4gJ2hlbGxvIHdvcmxkJywKICAgICAgICAgICAgR3JvdXAgPT4gMzMsCiAgICAgICAgfSwKICAgIH0sCgogICAgIyB0aGUgcHJlZmVyZW5jZXMgb2YgdGhlIGl0ZW0gb25lIGFkZC10ZXN0IGJlZm9yZSBtdXN0IGJlIHNldAogICAgewogICAgICAgIFByZWZlcmVuY2VzU2V0ID0+IHsKICAgICAgICAgICAgVGVzdCA9PiAnaGVsbG8nLAogICAgICAgICAgICBTaXplID0+IDM4LAogICAgICAgIH0sCiAgICAgICAgUHJlZmVyZW5jZXNHZXQgPT4gewogICAgICAgICAgICBUZXN0ID0+ICdoZWxsbycsCiAgICAgICAgICAgIFNpemUgPT4gMzgsCiAgICAgICAgfSwKICAgIH0sCl07CgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiMgcnVuIGdlbmVyYWwgdGVzdHMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJFRlc3RDb3VudCA9IDE7Cm15ICRMYXN0QWRkZWRJdGVtSUQ7Cm15ICVBZGRlZEl0ZW1Db3VudGVyOwoKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewoKICAgIGlmICggJEl0ZW0tPntBZGR9ICkgewoKICAgICAgICAjIGFkZCBuZXcgaXRlbQogICAgICAgIG15ICRJdGVtSUQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgICAgICAgICAgJXsgJEl0ZW0tPntBZGR9IH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiBpdGVtIHdhcyBhZGRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e0FkZEdldH0gKSB7CgogICAgICAgICAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAgICAgICAgICRJdGVtSUQsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtQWRkKCkgLSBJdGVtS2V5OiAkSXRlbUlEIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICgkSXRlbUlEKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgbGFzdCBpdGVtIGlkIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAkTGFzdEFkZGVkSXRlbUlEID0gJEl0ZW1JRDsKCiAgICAgICAgICAgICAgICAjIGluY3JlbWVudCB0aGUgYWRkZWQgaXRlbSBjb3VudGVyCiAgICAgICAgICAgICAgICAkQWRkZWRJdGVtQ291bnRlcnsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0rKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJEl0ZW1JRCwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1BZGQoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciBjcmVhdGlvbiBvZiBpdGVtCiAgICAgICAgbXkgJEl0ZW1HZXQgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgSXRlbUlEID0+ICRJdGVtSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkSXRlbS0+e0FkZH0tPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaXRlbSBkYXRhIGFmdGVyIGNyZWF0aW9uIG9mIGl0ZW0KICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57QWRkR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldC0+eyRJdGVtQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICRJdGVtLT57QWRkR2V0fS0+eyRJdGVtQXR0cmlidXRlfSB8fCAnJywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1HZXQoKSAtICRJdGVtQXR0cmlidXRlIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkSXRlbS0+e1VwZGF0ZX0gKSB7CgogICAgICAgICMgY2hlY2sgbGFzdCBpdGVtIGlkIHZhcmFpYmxlCiAgICAgICAgaWYgKCAhJExhc3RBZGRlZEl0ZW1JRCApIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IE5PIExBU1QgSVRFTSBJRCBHSVZFTiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgaXRlbQogICAgICAgIG15ICRVcGRhdGVTdWNlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbVVwZGF0ZSgKICAgICAgICAgICAgJXsgJEl0ZW0tPntVcGRhdGV9IH0sCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgaWYgaXRlbSB3YXMgdXBkYXRlZCBzdWNjZXNzZnVsbHkgb3Igbm90CiAgICAgICAgaWYgKCAkSXRlbS0+e1VwZGF0ZUdldH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSAtIEl0ZW1LZXk6ICRMYXN0QWRkZWRJdGVtSUQiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAgICAgJFVwZGF0ZVN1Y2VzcywKICAgICAgICAgICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IEl0ZW1VcGRhdGUoKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBpdGVtIGRhdGEgdG8gY2hlY2sgdGhlIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlCiAgICAgICAgbXkgJEl0ZW1HZXQyID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICAgICBVc2VySUQgPT4gJEl0ZW0tPntVcGRhdGV9LT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGl0ZW0gZGF0YSBhZnRlciB1cGRhdGUKICAgICAgICBmb3IgbXkgJEl0ZW1BdHRyaWJ1dGUgKCBrZXlzICV7ICRJdGVtLT57VXBkYXRlR2V0fSB9ICkgewogICAgICAgICAgICAkU2VsZi0+SXMoCiAgICAgICAgICAgICAgICAkSXRlbUdldDItPnskSXRlbUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAkSXRlbS0+e1VwZGF0ZUdldH0tPnskSXRlbUF0dHJpYnV0ZX0gfHwgJycsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtR2V0KCkgLSAkSXRlbUF0dHJpYnV0ZSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc1NldH0gKSB7CgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzU2V0fSB9ICkgewoKICAgICAgICAgICAgIyBzZXQgcHJlZmVyZW5jZXMKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+R2VuZXJhbENhdGFsb2dQcmVmZXJlbmNlc1NldCgKICAgICAgICAgICAgICAgIEtleSAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRJdGVtLT57UHJlZmVyZW5jZXNTZXR9LT57JEtleX0sCiAgICAgICAgICAgICAgICBJdGVtSUQgPT4gJExhc3RBZGRlZEl0ZW1JRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5UcnVlKAogICAgICAgICAgICAgICAgJFN1Y2Nlc3MsCiAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc1NldCgpIC0gJEtleSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgcHJlZmVyZW5jZXMKICAgIGlmICggJEl0ZW0tPntQcmVmZXJlbmNlc0dldH0gKSB7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkdlbmVyYWxDYXRhbG9nUHJlZmVyZW5jZXNHZXQoCiAgICAgICAgICAgIEl0ZW1JRCA9PiAkTGFzdEFkZGVkSXRlbUlELAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkSXRlbS0+e1ByZWZlcmVuY2VzR2V0fSB9ICkgewogICAgICAgICAgICBpZiAoICRJdGVtLT57UHJlZmVyZW5jZXNHZXR9LT57JEtleX0gZXEgJFByZWZlcmVuY2VzeyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgMSwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc0dldCgpIC0gJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPlRydWUoCiAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBQcmVmZXJlbmNlc0dldCgpIC0gJEtleSIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIG1ha2UgcHJlcGFyYXRpb25zIGZvciBsYXRlciB0ZXN0cwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgojIGNyZWF0ZSBuZWVkZWQgYXJyYXlzCm15ICVFeGlzdGluZ0NsYXNzZXNUbXA7CklURU06CmZvciBteSAkSXRlbSAoIEB7JEl0ZW1EYXRhfSApIHsKICAgIG5leHQgSVRFTSBpZiAhJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9OwogICAgJEV4aXN0aW5nQ2xhc3Nlc1RtcHsgJEl0ZW0tPntBZGRHZXR9LT57Q2xhc3N9IH0gPSAxOwp9Cm15IEBFeGlzdGluZ0NsYXNzZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nQ2xhc3Nlc1RtcDsKCm15ICVFeGlzdGluZ0Z1bmN0aW9uYWxpdGllc1RtcDsKSVRFTToKZm9yIG15ICRJdGVtICggQHskSXRlbURhdGF9ICkgewogICAgJEl0ZW0tPntVcGRhdGVHZXR9LT57RnVuY3Rpb25hbGl0eX0gfHw9ICcnOwogICAgJEV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1weyAkSXRlbS0+e1VwZGF0ZUdldH0tPntGdW5jdGlvbmFsaXR5fSB9ID0gMTsKfQpteSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXMgPSBzb3J0IGtleXMgJUV4aXN0aW5nRnVuY3Rpb25hbGl0aWVzVG1wOwoKbXkgQE5vbkV4aXN0aW5nQ2xhc3NlcyA9ICggJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MxJywgJ1VuaXRUZXN0OjpOb0V4aXN0aW5nQ2xhc3MyJyApOwoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKbXkgJENsYXNzTGlzdDEgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NMaXN0KCk7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJENsYXNzQ291bnQgPSAwOwogICAgaWYgKCAkQ2xhc3NMaXN0MSAmJiByZWYgJENsYXNzTGlzdDEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAkQ2xhc3NDb3VudCA9IGdyZXAgeyAkXyBlcSAkQ2xhc3MgfSBAeyRDbGFzc0xpc3QxfTsKICAgIH0KCiAgICAkU2VsZi0+SXMoCiAgICAgICAgJENsYXNzQ291bnQsCiAgICAgICAgMSwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc0xpc3QoKSAtICRDbGFzcyBsaXN0ZWQiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDEKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQE5vbkV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgJFNlbGYtPkZhbHNlKAogICAgICAgICRJdGVtTGlzdCwKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBJdGVtTGlzdCgpIC0gJENsYXNzIG5vdCBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBJdGVtTGlzdCB0ZXN0IDIKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJExpc3RDb3VudCA9ICdOVUxMJzsKICAgIGlmICggZGVmaW5lZCAkSXRlbUxpc3QgJiYgcmVmICRJdGVtTGlzdCBlcSAnSEFTSCcgKSB7CiAgICAgICAgJExpc3RDb3VudCA9IGtleXMgJXskSXRlbUxpc3R9OwogICAgfQoKICAgICRTZWxmLT5JcygKICAgICAgICAkTGlzdENvdW50LAogICAgICAgICRBZGRlZEl0ZW1Db3VudGVyeyRDbGFzc30sCiAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogSXRlbUxpc3QoKSAtICRDbGFzcyBjb3JyZWN0IG51bWJlciBvZiBpdGVtcyIsCiAgICApOwoKICAgICRUZXN0Q291bnQrKzsKfQoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIFByZWZlcmVuY2VzIHRlc3QgMQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgo9cG9kCgpteSAlRnVuY3Rpb25hbGl0eUxpc3QxOwptYXAgeyAkRnVuY3Rpb25hbGl0eUxpc3QxeyRffSA9IDEgfSBARXhpc3RpbmdGdW5jdGlvbmFsaXRpZXM7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJEZ1bmN0aW9uYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkZ1bmN0aW9uYWxpdHlMaXN0KAogICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICk7CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgJEZ1bmN0aW9uYWxpdHlMaXN0ICYmIHJlZiAkRnVuY3Rpb25hbGl0eUxpc3QgZXEgJ0FSUkFZJywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBGdW5jdGlvbmFsaXR5TGlzdCgpIC0gcmV0dXJuIGEgYXJyYXkgcmVmZXJlbmNlIiwKICAgICk7CgogICAgZm9yIG15ICRGdW5jdGlvbmFsaXR5ICggQHskRnVuY3Rpb25hbGl0eUxpc3R9ICkgewogICAgICAgIGRlbGV0ZSAkRnVuY3Rpb25hbGl0eUxpc3QxeyRGdW5jdGlvbmFsaXR5fTsKICAgIH0KCiAgICAkVGVzdENvdW50Kys7Cn0KCiRTZWxmLT5UcnVlKAogICAgIWtleXMgJUZ1bmN0aW9uYWxpdHlMaXN0MSwKICAgICJUZXN0ICRUZXN0Q291bnQ6IEZ1bmN0aW9uYWxpdHlMaXN0KCkiLAopOwoKJFRlc3RDb3VudCsrOwoKPWN1dAoKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwojIENsYXNzUmVuYW1lIHRlc3QgMSAoY2hlY2sgbm9ybWFsIHJlbmFtZSkKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKQ0xBU1M6CmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkT2xkSXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkNsYXNzUmVuYW1lKAogICAgICAgIENsYXNzT2xkID0+ICRDbGFzcywKICAgICAgICBDbGFzc05ldyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGNoZWNrIHN0cmluZyBjbGVhbmVyIGZ1bmN0aW9uKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgpDTEFTUzoKZm9yIG15ICRDbGFzcyAoQEV4aXN0aW5nQ2xhc3NlcykgewoKICAgIG15ICRPbGRJdGVtTGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICBDbGFzcyA9PiAkQ2xhc3MgLiAnUkVOQU1FMScsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTEnLAogICAgICAgIENsYXNzTmV3ID0+ICcgJyAuICRDbGFzcyAuICJSRSBOQSBNRSAyIFxuIFxyIFx0ICIsCiAgICApOwoKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAgICAgMSwKICAgICAgICAgICAgIlRlc3QgJFRlc3RDb3VudDogQ2xhc3NSZW5hbWUoKSAtIFJlbmFtZSBmYWlsZWQiLAogICAgICAgICk7CiAgICAgICAgbmV4dCBDTEFTUzsKICAgIH0KCiAgICBteSAkTmV3SXRlbUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIFZhbGlkID0+IDAsCiAgICApOwoKICAgIGlmICgKICAgICAgICAhJE9sZEl0ZW1MaXN0CiAgICAgICAgfHwgISROZXdJdGVtTGlzdAogICAgICAgIHx8IHJlZiAkT2xkSXRlbUxpc3QgbmUgJ0hBU0gnCiAgICAgICAgfHwgcmVmICROZXdJdGVtTGlzdCBuZSAnSEFTSCcKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkZhbHNlKAogICAgICAgICAgICAxLAogICAgICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gSXRlbUxpc3QgZmFpbGVkIiwKICAgICAgICApOwogICAgICAgIG5leHQgQ0xBU1M7CiAgICB9CgogICAgT0xES0VZOgogICAgZm9yIG15ICRPbGRLZXkgKCBrZXlzICV7JE9sZEl0ZW1MaXN0fSApIHsKCiAgICAgICAgaWYgKCAhZXhpc3RzICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9ICkgewogICAgICAgICAgICAkTmV3SXRlbUxpc3QtPntGYWlsZWREdW1teX0gPSAxOwogICAgICAgICAgICBuZXh0IE9MREtFWTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0xES0VZIGlmICRPbGRJdGVtTGlzdC0+eyRPbGRLZXl9IG5lICROZXdJdGVtTGlzdC0+eyRPbGRLZXl9OwoKICAgICAgICBkZWxldGUgJE5ld0l0ZW1MaXN0LT57JE9sZEtleX07CiAgICB9CgogICAgJFNlbGYtPlRydWUoCiAgICAgICAgIWtleXMgJXskTmV3SXRlbUxpc3R9LAogICAgICAgICJUZXN0ICRUZXN0Q291bnQ6IENsYXNzUmVuYW1lKCkiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDIgKGlkZW50aWNhbCBuYW1lIHRlc3QpCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKCmZvciBteSAkQ2xhc3MgKEBFeGlzdGluZ0NsYXNzZXMpIHsKCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5DbGFzc1JlbmFtZSgKICAgICAgICBDbGFzc09sZCA9PiAkQ2xhc3MgLiAnUkVOQU1FMicsCiAgICAgICAgQ2xhc3NOZXcgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgKTsKCiAgICAkU2VsZi0+VHJ1ZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gb2xkbmFtZSBhbmQgbmV3bmFtZSBpZGVudGljYWwiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKIyBDbGFzc1JlbmFtZSB0ZXN0IDMgKG5ldyBjbGFzcyBuYW1lIGFscmVhZHkgZXhpc3RzKQojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCgokU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUFkZCgKICAgIENsYXNzICAgICAgICAgPT4gJ1VuaXRUZXN0OjpUZXN0Q2xhc3MnIC4gJENsYXNzUmFuZFsyXSwKICAgIE5hbWUgICAgICAgICAgPT4gJ0R1bW15JywKICAgIEZ1bmN0aW9uYWxpdHkgPT4gJycsCiAgICBWYWxpZElEICAgICAgID0+IDEsCiAgICBVc2VySUQgICAgICAgID0+IDEsCik7Cgpmb3IgbXkgJENsYXNzIChARXhpc3RpbmdDbGFzc2VzKSB7CgogICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+Q2xhc3NSZW5hbWUoCiAgICAgICAgQ2xhc3NPbGQgPT4gJENsYXNzIC4gJ1JFTkFNRTInLAogICAgICAgIENsYXNzTmV3ID0+ICdVbml0VGVzdDo6VGVzdENsYXNzJyAuICRDbGFzc1JhbmRbMl0sCiAgICApOwoKICAgICRTZWxmLT5GYWxzZSgKICAgICAgICAkU3VjY2VzcywKICAgICAgICAiVGVzdCAkVGVzdENvdW50OiBDbGFzc1JlbmFtZSgpIC0gbmV3IGNsYXNzIG5hbWUgYWxyZWFkeSBleGlzdHMiLAogICAgKTsKCiAgICAkVGVzdENvdW50Kys7Cn0KCjE7Cg==
IyAtLQojIEdlbmVyYWxDYXRhbG9nLnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEdlbmVyYWxDYXRhbG9nLnBtLHYgMS4xIDIwMDkvMTAvMDcgMTM6MTY6MjMgcmViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpHZW5lcmFsQ2F0YWxvZy5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CiAgICB1c2UgdmFyOjpwYWNrYWdlc2V0dXA6OkdlbmVyYWxDYXRhbG9nOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJFhNTE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29kZU9iamVjdCA9IHZhcjo6cGFja2FnZXNldHVwOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBYTUxPYmplY3QgICAgPT4gJFhNTE9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IEVuY29kZU9iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgWE1MT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVJlaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgcmVpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVSZWluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlUmVpbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVcGdyYWRlKCkKCnJ1biB0aGUgY29kZSB1cGdyYWRlIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVcGdyYWRlKCk7Cgo9Y3V0CgpzdWIgQ29kZVVwZ3JhZGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG1pZ3JhdGUgJ2Z1bmN0aW9uYWxpdHknIHRvIGV4dGVybmFsIHRhYmxlCiAgICAkU2VsZi0+X01pZ3JhdGVGdW5jdGlvbmFsaXR5KCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVVbmluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHVuaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVW5pbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVVuaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfTWlncmF0ZUZ1bmN0aW9uYWxpdHkoKQoKPWN1dAoKc3ViIF9NaWdyYXRlRnVuY3Rpb25hbGl0eSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgU0VMRUNUIGFsbCBmdW5jdGlvbmFsaXR5IHZhbHVlcwogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQsIGZ1bmN0aW9uYWxpdHkgRlJPTSBnZW5lcmFsX2NhdGFsb2cnLAogICAgKTsKCiAgICBteSBATGlzdDsKICAgIFJPVzoKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgbmV4dCBST1cgaWYgISRSb3dbMV07CgogICAgICAgIHB1c2ggQExpc3QsIFxAUm93OwogICAgfQoKICAgICMgc2F2ZSBlbnRyaWVzIGluIG5ldyB0YWJsZQogICAgZm9yIG15ICRFbnRyeSAoQExpc3QpIHsKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgIFNRTCA9PgogICAgICAgICAgICAgICAgJ0lOU0VSVCBJTlRPIGdlbmVyYWxfY2F0YWxvZ19wcmVmZXJlbmNlcyggZ2VuZXJhbF9jYXRhbG9nX2lkLCBwcmVmX2tleSwgcHJlZl92YWx1ZSApJwogICAgICAgICAgICAgICAgLiAnIFZBTFVFUyggPywgXCdGdW5jdGlvbmFsaXR5XCcsID8gKScsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJEVudHJ5LT5bMF0sIFwkRW50cnktPlsxXSBdLAogICAgICAgICk7CiAgICB9CgogICAgIyBkcm9wIGNvbHVtbiBpbgogICAgbXkgKCREcm9wKSA9ICRTZWxmLT57REJPYmplY3R9LT5TUUxQcm9jZXNzb3IoCiAgICAgICAgRGF0YWJhc2UgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUYWcgICAgID0+ICdUYWJsZUFsdGVyJywKICAgICAgICAgICAgICAgIE5hbWUgICAgPT4gJ2dlbmVyYWxfY2F0YWxvZycsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ0NvbHVtbkRyb3AnLAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAnZnVuY3Rpb25hbGl0eScsCiAgICAgICAgICAgICAgICBUYWdUeXBlID0+ICdTdGFydCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFRhZyAgICAgPT4gJ1RhYmxlQWx0ZXInLAogICAgICAgICAgICAgICAgVGFnVHlwZSA9PiAnRW5kJywKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMID0+ICREcm9wLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMDkvMTAvMDcgMTM6MTY6MjMgJAoKPWN1dAo=