KIXCore
1.0.2
c.a.p.e. IT GmbH
http://www.cape-it.de/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Bugfix: T2011102799000314 (used wrong path), T2011102890000301 (order of Layout-Extensions).
CR: added changes from OTRS 3.0.11, Bugfix: SysConfig logging (prevent log entries), CR: KIXUtils.pm (removed not needed File::Basename).
CR: first productive release.
KIXCore - Core package for KIX tsunami framework.
KIXCore - Kernpaket fuer den KIX Tsunami-Ansatz.
3.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS module KIXCore. This package provides a more flexible and more general approach for extensions of extensions than the common Custom-folder of OTRS itself.<br/>
<br/>
<strong>Recommended perl modules:</strong>
<br/>
<ul>
<li>Data::Compare - required if you want to keep track of SysConfig changes, e.g. what was changed by which user. However, the other parts of this OTRS-extensions will work without it.</li>
</ul>
<br/>
<strong>Important Advice:</strong><br/>
<br/>
This package requires that the user which installs the packer (i.e. webserver user) has got write permissions on file Config.pm and apache2-perl-startup.pl. If this is not the case, the installation will fail.You should then try to run "bin/kix.ManageMultipleCustomPackages.pl -a Register -n KIXCore -p 000" in order to get this extension running.<br/>
<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>Important Advice:</strong>
<br/>
<br/>
If you are using OTRS with modperl, the webserver must be restarted now. Please do this before you continue the use of this OTRS installation.
<br/>
<br/>
<strong>Notice</strong>
<br/>
<br/>
If you want to have a explanation how this extension works, please have a look at the documentation provided in doc-directory.
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to UNINSTALL the KIXCore extensions package for OTRS.<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the KIXCore extensions package for OTRS.<br/>
<br/>
<br/>
c.a.p.e. IT ...easy.<br/>
<br/>
my $FunctionName = 'CodeInstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeUpgrade';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeUninstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
my $FunctionName = 'CodeReinstall';
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# The code module has just recently been copied to it's location in the file system.
# In a persistent Perl environment an old version of the module might still be loaded,
# as watchdogs like Apache2::Reload haven't had a chance to reload it.
# So we need to make sure that the new version is being loaded.
# Kernel::System::Main::Require() checks the relative file path, so we need to remove that from %INC.
# This is only needed in persistent Perl environment, but does no harm in a CGI environment.
my $CodeModulePath = $CodeModule;
$CodeModulePath =~ s/::/\//g;
$CodeModulePath .= '.pm';
delete $INC{$CodeModulePath};
if ( $Self->{MainObject}->Require($CodeModule) ) {
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2011-11-11 15:25:50
cvs.intra.cape-it.de
IyAtLQojIENIQU5HRVNfS0lYQ29yZSAtIGNoYW5nZSBsb2cgb2YgS0lYQ29yZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZS8KIyAtLQojICRJZDogQ0hBTkdFU19LSVhDb3JlLHYgMS41MS4yLjYgMjAxMS0xMS0xMSAxNDoyNTowNyBzbWVobGlnIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMC4yICgyMDExLzExLzExKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzExLzAyKSAtIEJ1Z2ZpeDogVDIwMTExMDI3OTkwMDAzMTQgKHVzZWQgd3JvbmcgcGF0aCkgKHNtZWhsaWcpCiMgKiAoMjAxMS8xMC8yOCkgLSBCdWdmaXg6IFQyMDExMTAyODkwMDAwMzAxIChvcmRlciBvZiBMYXlvdXQtRXh0ZW5zaW9ucykgKG1hYmEpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMC4xICgyMDExLzEwLzI1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzEwLzI1KSAtIENSOiAoYWRkZWQgY2hhbmdlcyBmcm9tIE9UUlMgMy4wLjExKSAoc21laGxpZykKIyAqICgyMDExLzEwLzA3KSAtIEJ1Z2ZpeDogU3lzQ29uZmlnIGxvZ2dpbmcgKHByZXZlbnQgbG9nIGVudHJpZXMpIChtYWJhKQojICogKDIwMTEvMDkvMTkpIC0gQ1I6IEtJWFV0aWxzLnBtIChyZW1vdmVkIG5vdCBuZWVkZWQgRmlsZTo6QmFzZW5hbWUpIChtYWJhKQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAxLjAuMCAoMjAxMS8wOS8xNSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wOS8xNSkgLSBDUjogZmlyc3QgcHJvZHVjdGl2ZSByZWxlYXNlLiAodHRvKQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjkuODEgKDIwMTEvMDkvMTIpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wOS8xMikgLSBDUjogc2Vjb25kIGJldGEtcmVsZWFzZSAocmJvKQojICogKDIwMTEvMDgvMzApIC0gQ1I6IG1vdmVkIGtpeC5DaGVja01vZHVsZXMucGwgdG8gS0lYNE9UUlMgKG1hYmEpCiMgKiAoMjAxMS8wOC8yNCkgLSBDUjogcmVtb3ZlZCBjYWNoaW5nIGZvciB0ZW1wbGF0ZSBmaWxlIHBhdGggKHR0bykKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMC45LjgwICgyMDExLzA4LzE5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMDgvMTkpIC0gQ1I6IGZpcnN0IGJldGEtcmVsZWFzZQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjUuMTIgKDIwMTEvMDgvMTYpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wOC8xMSkgLSBDUjogYWRkZWQgY2FjaGluZyBmb3IgdGVtcGxhdGUgZmlsZSBwYXRoICh0dG8pCiMgKiAoMjAxMS8wOC8wNSkgLSBCdWdmaXg6IGhhbmRsZSBmb3Igb3RycyBob21lLXBhdGggKHByZXZlbnQgZG91YmxlIC8pIChtYWJhKQojICogKDIwMTEvMDgvMDUpIC0gQ1I6IG1vZGlmaWVkL2FkZGVkIHBvc3QgaW5zdGFsbGF0aW9uIGFkdmljZSAodHRvKQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjUuMTEgKDIwMTEvMDgvMDQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wOC8wNCkgLSBCdWdmaXg6IGZhbGxiYWNrIHRvIFVzZXJJRCAxIGluIFN5c0NvbmZpZ0l0ZW1VcGRhdGUgZXZlbnQgaGFuZGxlciBjYWxsICh0dG8pCiMgKiAoMjAxMS8wOC8wNCkgLSBDUjogTGF5b3V0TG9hZGVyIHN1cHBvcnRzIHRzdW5hbWkgZnJhbWV3b3JrIG5vdywgc2tpbiBLSVg0T1RSUyBpc24ndCBuZWVkZWQgYW55IGxvbmdlciAocmJvKQojICogKDIwMTEvMDgvMDIpIC0gQnVnZml4OiBzdGF0cyBleHBvcnQgYW5kIGltcG9ydCBkb2VzIG5vdCBzdXBwb3J0IEtJWCB0c3VuYW1pIGZyYW1ld29yayAobWFiYSkKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMC41LjEwICgyMDExLzA4LzAxKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMDgvMDEpIC0gQ1I6IGV4dGVuZGVkIFN5c0NvbmZpZyBsZXZlbHMgKG1hYmEpCiMgKiAoMjAxMS8wOC8wMSkgLSBDUjogY2hhbmdlZCBjdXN0b20gbW9kdWxlcyBwYXRoIHRvIGFic29sdXRlIHBhdGggaW4gQ29uZmlnLnBtICh0dG8pCiMgKiAoMjAxMS8wOC8wMSkgLSBDUjogYWRkZWQgU09QTSBwcmUtaW5zdGFsbCBpbmZvcm1hdGlvbiAobWFiYSkKIyAqICgyMDExLzA3LzI5KSAtIENSOiByZW1vdmVkIERhdGE6OkNvbXBhcmUgZnJvbSByZXF1aXJlZCBwZXJsIG1vZHVsZXMgdGh1cyBtYWtpbmcgU3lzQ29uZmlnIGNoYW5nZSBoaXN0b3J5IG9wdGlvbmFsICh0dG8pCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuNS45ICgyMDExLzA3LzI4KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA3LzI3KSAtIENSOiBjaGFuZ2VkIHN1YiBuZXcgdG8gc2F2ZSBLSVhVdGlscyBmcm9tIG1pc3Npbmcgb2JqZWN0cyAobWFiYSkKIyAqICgyMDExLzA3LzI3KSAtIEJ1Z2ZpeDogbm8gcGFyYW1ldGVyIHJlcGxhY2luZyBpbiBlcnJvciBub3RpY2VzIChtYWJhKQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjUuOCAoMjAxMS8wNy8yMCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wNy8yNSkgLSBDUjogY2hhbmdlcyBmb3IgcGVybCBjcml0aWMgKHNtZWhsaWcpCiMgKiAoMjAxMS8wNy8yMCkgLSBCdWdmaXg6IHVzZSBsaWIgaW4gYXBhY2hlMi1wZXJsLXN0YXJ0dXAucGwgKHNtZWhsaWcpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuNS43ICgyMDExLzA3LzE4KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA3LzE1KSAtIENSOiBhZGRlZCBjaGFuZ2VzIGZyb20gT1RSUyAzLjAuOSAobWFiYSkKIyAqICgyMDExLzA2LzI3KSAtIENSOiBhZGRlZCBjaGVjayBmb3IgcmVxdWlyZWQgcGVybCBtb2R1bGVzIChtYWJhKQojICogKDIwMTEvMDYvMjIpIC0gQ1I6IGNoYW5nZWQgU3lzQ29uZmlnIGV2ZW50ICJDb25maWdJdGVtVXBkYXRlIiB0byAiU3lzQ29uZmlnSXRlbVVwZGF0ZSIgKHJibykKIyAqICgyMDExLzA2LzE1KSAtIENSOiBhZGRlZCBTeXNDb25maWcgZXZlbnRzIChhdCB0aGUgbW9tZW50IG9ubHkgIkNvbmZpZ0l0ZW1VcGRhdGUiKSAocmJvKQojICogKDIwMTEvMDYvMDcpIC0gQ1I6IGltcHJvdmVkIHRyYW5zbGF0aW9uIGhhbmRsaW5nIChwZXJmb3JtYW5jZTsgYWxsb3cgb3ZlcndyaXRpbmcpIChtYWJhKQojICogKDIwMTEvMDYvMDYpIC0gQ1I6IGltcHJvdmVkIGhhbmRsaW5nIGZvciBzdGF0aWMgc3RhdHMgKG1hYmEpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuNS42ICgyMDExLzA1LzEwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA1LzEwKSAtIENSOiBhZGRlZCBhY3Rpb24gIkxpc3QiIHRvIG90cnMuTWFuYWdlTXVsdGlwbGVDdXN0b21QYWNrYWdlcy5wbAojICogKDIwMTEvMDUvMTApIC0gQ1I6IGFkZGVkIG1vZGlmaWNhdGlvbnMgZm9yIE9UUlMgMy4wLjcKIyAqICgyMDExLzA1LzA1KSAtIEJ1Z2ZpeDogaW5jb21wbGV0ZSBIVE1MLXF1b3RlIGluIHNvcG0KIyAqICgyMDExLzA0LzIxKSAtIEJ1Z2ZpeDogdXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMC41LjUgKDIwMTEvMDQvMjEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMDQvMTgpIC0gQ1I6IGFkZGVkIHRzdW5hbWkgYXBwcm9hY2ggZm9yIHN0YXRpc3RpY3MKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMC41LjQgKDIwMTEvMDQvMTEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMDQvMTEpIC0gQnVnZml4OiBUMjAxMTA0MTE5MDAwMDE4NSAoQ29uZmlnLnBtIHJld3JpdGUgcmVnZXhwIGNvdWxkIGNhdXNlIHdyb25nIG1hdGNoKQojICogKDIwMTEvMDMvMjgpIC0gQnVnZml4OiB1c2Ugb2YgdW5pbml0aWFsaXplZCB2YXJpYWJsZQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjUuMyAoMjAxMS8wMy8yOCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wMy8yOCkgLSBCdWdmaXg6IHVzZSBvZiB1bmluaXRpYWxpemVkIHZhcmlhYmxlCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuNS4yICgyMDExLzAzLzI4KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzAzLzI4KSAtIENSOiBtb2RpZmljYXRpb24gb2YgQElOQyB1cG9uIHBhY2thZ2UgcmVnaXN0cmF0aW9uIHRvIGFsbG93IHVzYWdlIG9mIGN1c3RvbSBtb2R1bGVzIGluIENvZGVJbnN0YWxsLgojICogKDIwMTEvMDMvMjUpIC0gQnVnZml4OiBhZGRlZCBtb2RpZmljYXRpb24gb2YgYXBhY2hlMi1wZXJsLXN0YXJ0dXAucGwuCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDAuNS4xICgyMDExLzAzLzI1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzAzLzIzKSAtIEJ1Z2ZpeDogY2FsbCBvZiByZW5hbWVkIG1ldGhvZCBpbiBMaW5rT2JqZWN0LgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAwLjUuMCAoMjAxMS8wMy8yMikgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wMy8yMSkgLSBDUjogYWRkZWQgY29tbWFuZCBsaW5lIHRvb2wgdG8gbWFuYWdlIHJlZ2lzdGVyZWQgcGFja2FnZXMKIyAqICgyMDExLzAzLzIxKSAtIENSOiByZXdvcmtlZCBLSVhVdGlscwojICogKDIwMTEvMDMvMjEpIC0gQ1I6IGNoYW5nZWQgdHN1bmFtaSBhcHByb2FjaCB0byAidXNlIGxpYiIKIyAqICgyMDExLzAzLzE0KSAtIENSOiBjaGFuZ2VkIHBhY2thZ2Ugc2V0dXAgaW5pdGlhbGl6YXRpb24gaW4gU09QTQojICogKDIwMTEvMDMvMTEpIC0gQ1I6IGFkZGVkIGNyZWF0aW9uIGFuZCB1c2luZyBvZiBnbG9iYWwgcmVwb3NpdG9yeSBmaWxlICAKIyAqICgyMDExLzAzLzEwKSAtIGluaXRpYWwgY29tbWl0ICAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQo=
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBiaW4va2l4Lk1hbmFnZU11bHRpcGxlQ3VzdG9tUGFja2FnZXMucGwgLSBIYW5kbGluZyBwYWNrYWdlcyB1c2luZyBLSVhDb3JlIGZyYW1ld29yawojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IGtpeC5NYW5hZ2VNdWx0aXBsZUN1c3RvbVBhY2thZ2VzLnBsLHYgMS4zIDIwMTEtMDgtMjIgMDc6NTM6MzMgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEFGRkVSTyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCiMgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEFmZmVybyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMgb3Igc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEZpbGU6OkJhc2VuYW1lOwp1c2UgRmluZEJpbiBxdygkUmVhbEJpbik7Cgp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gIi9LZXJuZWwvY3Bhbi1saWIiOwoKdXNlIEdldG9wdDo6U3RkOwp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwp1c2UgS2VybmVsOjpTeXN0ZW06OktJWFV0aWxzOwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBnZXQgZmlsZSB2ZXJzaW9uCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07CgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojIGNvbW1vbiBvYmplY3RzCm15ICVDb21tb25PYmplY3QgPSAoKTsKJENvbW1vbk9iamVjdHtDb25maWdPYmplY3R9ID0gS2VybmVsOjpDb25maWctPm5ldygpOwokQ29tbW9uT2JqZWN0e0VuY29kZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TG9nT2JqZWN0fQogICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoICVDb21tb25PYmplY3QsCiAgICBMb2dQcmVmaXggPT4gJ290cnMuTWFuYWdlTXVsdGlwbGVDdXN0b21QYWNrYWdlcy5wbCcgKTsKJENvbW1vbk9iamVjdHtNYWluT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0RCT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e0tJWFV0aWxzT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpLSVhVdGlscy0+bmV3KCVDb21tb25PYmplY3QpOwoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBnZXQgb3B0aW9ucy4uLgpteSAlb3B0cyA9ICgpOwpnZXRvcHQoICdhbnAnLCBcJW9wdHMgKTsKCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiNjaGVjayByZXF1aXJlZCBvcHRpb25zLi4uLgppZiAoICEkb3B0c3thfSApIHsKICAgIHByaW50CiAgICAgICAgIm90cnMuTWFuYWdlTXVsdGlwbGVDdXN0b21QYWNrYWdlcy5wbCA8UmV2aXNpb24gJFZFUlNJT04+IC0gSGFuZGxlcyAiCiAgICAgICAgLiJtdWx0aXBsZSBjdXN0b20gZm9sZGVycyBieSB1c2luZyBLSVhDb3JlIGZyYW1ld29yayBieSBtb2RpZnlpbmcgIgogICAgICAgIC4iQ29uZmlnLnBtIGFuZCBhcGFjaGUyLXBlcmwtc3RhcnR1cC5wbFxuIjsKICAgIHByaW50ICJDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwLy93d3cuY2FwZS1pdC5kZS9cbiI7CiAgICBwcmludAogICAgICAgICJcblVTQUdFOiBvdHJzLk1hbmFnZU11bHRpcGxlQ3VzdG9tUGFja2FnZXMucGwgLWEgTGlzdHxSZWdpc3RlcnwiCiAgICAgICAgLiJVbnJlZ2lzdGVyfENsZWFuVXBDb25maWdQbSBbLW4gUGFja2FnZU5hbWVdIFstcCBQcmlvcml0eVN0cmluZ11cbiIKICAgICAgICAuIlx0ICogb3B0aW9uIC1wIDxQcmlvcml0eVN0cmluZz4gaXMgcmVxdWlyZWQgZm9yIFJlZ2lzdGVyLWFjdGlvblxuIgogICAgICAgIC4iXHQgKiByZXN0YXJ0IHlvdXIgd2Vic2VydmVyIGFmdGVyIGluc3RhbGxhdGlvbiBpZiB5b3UgYXJlIHVzaW5nIG1vZC1wZXJsIjsKICAgIHByaW50ICJcblxuIjsKICAgIGV4aXQgMTsKfQoKbXkgJVBhcmFtOwp1bmRlZiAlUGFyYW07CgojdXNlciBpZCBvZiB0aGUgcGVyc29uIGFkZGluZyB0aGUgcmVjb3JkCiRQYXJhbXtVc2VySUR9ID0gJzEnOwoKI1ZhbGlkcmVjb3JkCiRQYXJhbXtWYWxpZElEfSA9ICcxJzsKCiRQYXJhbXtQYWNrYWdlTmFtZX0gPSAkb3B0c3tufTsKJFBhcmFte1ByaW9yaXR5fSAgICA9ICRvcHRze3B9OwoKaWYgKCAkb3B0c3thfSBlcSAnUmVnaXN0ZXInICkgewogICAgaWYgKCAhJG9wdHN7bn0gfHwgISRvcHRze3B9ICkgewogICAgICAgIHByaW50ICJOT1RFOiBzZWxlY3RlZCBhY3Rpb24gcmVxdWlyZXMgb3B0aW9ucyAtbiBQYWNrYWdlTmFtZSAtcCBQcmlvcml0eVN0cmluZyBcblxuIjsKICAgICAgICBleGl0IDE7CiAgICB9CiAgICBwcmludCAiTk9URTogc3RhcnQgdG8gcmVnaXN0ZXIgcGFja2FnZSAnJFBhcmFte1BhY2thZ2VOYW1lfSciOwogICAgJENvbW1vbk9iamVjdHtLSVhVdGlsc09iamVjdH0tPlJlZ2lzdGVyQ3VzdG9tUGFja2FnZSglUGFyYW0pOwp9CmVsc2lmICggJG9wdHN7YX0gZXEgJ1VucmVnaXN0ZXInICkgewogICAgaWYgKCAhJG9wdHN7bn0gKSB7CiAgICAgICAgcHJpbnQgIk5PVEU6IHNlbGVjdGVkIGFjdGlvbiByZXF1aXJlcyBvcHRpb25zIC1uIFBhY2thZ2VOYW1lIFxuXG4iOwogICAgICAgIGV4aXQgMTsKICAgIH0KICAgIHByaW50ICJOT1RFOiBzdGFydCB0byB1bnJlZ2lzdGVyIHBhY2thZ2UgJyRQYXJhbXtQYWNrYWdlTmFtZX0nIjsKICAgICRDb21tb25PYmplY3R7S0lYVXRpbHNPYmplY3R9LT5VblJlZ2lzdGVyQ3VzdG9tUGFja2FnZSglUGFyYW0pOwp9CmVsc2lmICggJG9wdHN7YX0gZXEgJ0NsZWFuVXBDb25maWdQbScgKSB7CiAgICBwcmludCAiTk9URTogc3RhcnQgdG8gcmVzdG9yZSBvbGQgJ0NvbmZpZy5wbSciOwogICAgJENvbW1vbk9iamVjdHtLSVhVdGlsc09iamVjdH0tPkNsZWFuVXBDb25maWdQbSglUGFyYW0pOwp9CmVsc2lmICggJG9wdHN7YX0gZXEgJ0xpc3QnICkgewogICAgcHJpbnQgIk5PVEU6IFRoZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIGN1cnJlbnRseSByZWdpc3RlcmVkIGFuZCBzaG91bGQgIgogICAgICAgIC4gImFwcGVhciBpbiBDb25maWcucG0gYW5kIGFwYWNoZTItcGVybC1zdGFydHVwLnBsOiI7CiAgICBteSAkUmVnaXN0ZXJlZFBhY2thZ2VzID0gJENvbW1vbk9iamVjdHtLSVhVdGlsc09iamVjdH0tPkdldFJlZ2lzdGVyZWRDdXN0b21QYWNrYWdlcyglUGFyYW0pOwogICAgZm9yIG15ICRDdXJyUHJpb0tleSAoIHNvcnQoIGtleXMoJXskUmVnaXN0ZXJlZFBhY2thZ2VzfSkgKSApIHsKICAgICAgICBwcmludCAiXG5cdCAkQ3VyclByaW9LZXk6ICIuJFJlZ2lzdGVyZWRQYWNrYWdlcy0+eyRDdXJyUHJpb0tleX07CiAgICB9Cn0KZWxzZSB7CiAgICBwcmludCAiLi4ubm8gdmFsaWQgYWN0aW9uIChSZWdpc3RlcnxVbnJlZ2lzdGVyfENsZWFuVXBDb25maWdQbSkgZ2l2ZW4gLSBkaWRuJ3QgZG8gYW55dGhpbmcuIjsKICAgIGV4aXQgMTsKfQoKcHJpbnQgIlxuXG5ET05FIVxuXG4iOwoKZXhpdCgwKTsK
IyAkSWQ6IEtJWENvcmUucG9kLHYgMS41IDIwMTEtMDctMjkgMDk6NDI6MzAgbWFiYSBFeHAgJAoKPWhlYWQxIEdlbmVyYWwKClRoaXMgcGFja2FnZSBwcm92aWRlcyBhIG1vcmUgZmxleGlibGUgYW5kIG1vcmUgZ2VuZXJhbCBhcHByb2FjaCBmb3IgZXh0ZW5zaW9ucyBvZiBleHRlbnNpb25zIHRoYW4gdGhlIGNvbW1vbiAiQ3VzdG9tIi1mb2xkZXIgb2YgT1RSUyBpdHNlbGYuIEtJWENvcmUgKGFzIHRoZSBjdXN0b20gZm9sZGVyIGl0c2VsZikgaXMgdGhlIGNvbnRpbnVlZCBkZXZlbG9wbWVudCBvZiB0aGUgcHJldmlvdXMgdHN1bmFtaSBhcHByb2FjaCB0byBleHRlbmQgb3RoZXIgT1RSUy1leHRlbnNpb25zLiBCeSBlbXBsb3lpbmcgInVzZSBsaWIiIGluc3RlYWQgb2YgInVuc2hpZnQgQElOQyIsIGl0IHByb3ZpZGVzIG1vcmUgc3RhYmlsaXR5IGFuZCByZWR1Y2VkIGNvbXBsZXhpdHkuIFRoZXJlZm9yZSBlYWNoIGV4dGVuc2lvbiByZXF1aXJlcyBhIG1vZGlmaWNhdGlvbiBvZiBLZXJuZWwvQ29uZmlnLnBtIGFuZCBzY3JpcHRzL2FwYWNoZTItcGVybC1zdGFydHVwLnBsLiBUaGlzIGNhbiBiZSBkb25lIGF1dG9tYXRpY2FsbHkgYnkgS0lYVXRpbHM6OlJlZ2lzdGVyQ3VzdG9tUGFja2FnZS4gRWFjaCB0aW1lIHkgbmV3IGN1c3RvbSBmb2xkZXIgaXMgcmVnaXN0ZXJlZCBhIGJhY2t1cCBvZiB0aGUgbW9kaWZpZWQgZmlsZSBDb25maWcucG0gb3IgYXBhY2hlMi1wZXJsLXN0YXJ0dXAucGwgd2l0aCBhIHRpbWVzdGFtcCBzdWZmaXggaXMgd3JpdHRlbi4KCllvdSBjYW4gdXNlIGEgY29tbWFuZCBsaW5lIHRvb2wgKDxPVFJTX0hPTUU+L2Jpbi9vdHJzLk1hbmFnZU11bHRpcGxlQ3VzdG9tUGFja2FnZXMucGwpIHRvIGxpc3QgY3VzdG9tIGZvbGRlcnMsIHJlZ2lzdGVyIG9yIHVucmVnaXN0ZXIgYSBjdXN0b20gZm9sZGVyIGJ1dCBhY3R1YWxseSB0aGlzIHNob3VsZCBiZSBkb25lIGJ5IHRoZSBwYWNrYWdlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiAKCklNUE9SVEFOVDogaWYgeW91J3JlIHVzaW5nIG1vZC1wZXJsIGEgd2Vic2VydmVyIHJlc3RhcnQgaXMgcmVxdWlyZWQgYWZ0ZXIgdGhlIG1vZGlmaWNhdGlvbiBvZiBhcGFjaGUyLXBlcmwtc3RhcnR1cC4gT3RoZXJ3aXNlLCBubyBmdXJ0aGVyIGN1c3RvbSBwYWNrYWdlcyBpbiB5b3VyIGN1c3RvbSBtb2RpZmljYXRpb24gd2lsbCBiZSBmb3VuZC4gVXNpbmcgYSBmdW5jdGlvbiBvZiB5b3VyIGN1c3RvbSBleHRlbnNpb24gdXBvbiBpbnN0YWxsYXRpb24gKHR5cGUgInBvc3QiKSB3aWxsIE5PVCB3b3JrLCBzaW5jZSBASU5DIGRvZXMgbm90IGNvbnRhaW4geW91ciBjdXN0b20gZGlyZWN0b3J5IHlldC4gSW4gb3JkZXIgdG8gdXNlIGN1c3RvbSBmdW5jdGlvbnMgaW1tZWRpYXRlbHkgb24gaW5zdGFsYXRpb24geW91IG5lZWQgdG8gaW5zdGFsbCB0aGUgZXh0ZW5zaW9uIHZpYSBjb21tYW5kIGxpbmUuIAoKVGhlIGNvbW1vbiBmb2xkZXIgIkN1c3RvbSIgYWxsb3dzIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBmaWxlIG9mIGFuIGFscmVhZHkgaW5zdGFsbGVkIHBhY2thZ2Ugb25jZS4gSWYgeW91IGluc3RhbGxlZCBhbm90aGVyIGV4dGVuc2lvbiwgeW91IHdvdWxkIGVuY291bnRlciB0aGUgc2FtZSBwcm9ibGVtIGFzIGlmIHlvdSBoYWQgbm8gIkN1c3RvbSIgZm9sZGVyLiBUaGlzIGRyYXdiYWNrIGlzIHJlc29sdmVkIHdpdGggS0lYQ29yZS4gRnVydGhlcm1vcmUgdGhlIGNvbW1vbiBDdXN0b20tZm9sZGVyIG9mIE9UUlMgZG9lcyBub3QgYWZmZWN0IGZvbGxvd2luZyBmaWxlcy9pdGVtcyAoeWV0KS4gQnkgZXh0ZW5kaW5nIHRoZSBjdXN0b20tZm9sZGVyIGFwcHJvYWNoIGl0IGlzIHBvc3NpYmxlIHRvIGVhc2lseSBkaXMtIGFuZCBlbmFibGUgd2hvbGUgT1RSUy1leHRlbnNpb25zIGJ5IHVuLS9yZWdpc3RlcmluZyB0aGUgY29ycmVzcG9uZGluZyBjdXN0b20gZm9sZGVyLgoKPW92ZXIgNCAKCj1pdGVtICogZHRsLVRlbXBsYXRlcwoKPWl0ZW0gKiBLZXJuZWw6Okxhbmd1YWdlCgo9b3ZlciA4Cgpjb250YWlucyBtb2RpZmljYXRpb25zIHRvIChyZS0pcGxhY2UgdHJhbnNsYXRpb24gZmlsZXMgYnkgY3VzdG9tIHBhY2thZ2VzCgo9YmFjawoKPWl0ZW0gKiBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdAoKPW92ZXIgOAoKcmVxdWlyZWQgbW9kaWZpY2F0aW9uIHNpbmNlIG1vZHVsZSBzZWFyY2hlcyBMaW5rT2JqZWN0IGJhY2tlbmRzIG5vdCBiYXNlZCBvbiBASU5DIGJ1dCBvbiBoYXJkIGNvZGVkIGZpbGUgcGF0aHMgLSBzaG91bGQgYmUgZmV4ZWQgaW4gZnV0dXJlIE9UUlMgcmVsZWFzZXMKCj1iYWNrCgo9aXRlbSAqIEtlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcKCj1vdmVyIDgKCmNvbnRhaW5zIG1vZGlmaWNhdGlvbnMgdG8gcGxhY2UgeG1sLWNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gY3VzdG9tIGZvbGRlcnMKCj1iYWNrCgo9YmFjawoKPWl0ZW0gKiBLZXJuZWw6OlN5c3RlbTo6U3RhdHMKCj1vdmVyIDgKCmNvbnRhaW5zIG1vZGlmaWNhdGlvbnMgdG8gcGxhY2UgYW5kIGFjY2VzcyBzdGF0aWMgYW5kIGR5bmFtaWMgc3RhdHMgaW4gY3VzdG9tIGZvbGRlcnMKCj1iYWNrCgoKCj1iYWNrCgo9aGVhZDEgQ29weXJpZ2h0CgpLSVhDb3JlIHdyaXR0ZW4vZWRpdGVkIGJ5OgoKPW92ZXIgNCAKCj1pdGVtICogUmVuZShkb3QpQm9laG0oYXQpY2FwZShkYXNoKWl0KGRvdClkZQoKPWl0ZW0gKiBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKCj1pdGVtICogVG9yc3Rlbihkb3QpVGhhdShhdCljYXBlKGRhc2gpaXQoZG90KWRlCgo9YmFjawoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vS0lYVXRpbHMucG0gLSBLSVggdXRpbGl0eSBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIFByb3ZpZGVzIG1ldGhvZHMgcmVxdWlyZWQgZm9yIHJlZ2lzdHJhdGlvbiBvZiBLSVgtbW9kdWxlcyBhbmQgb3RoZXIgdXNlZnVsbAojIG1ldGhvZHMgd2hpY2ggYXJlIGhhcmQgdG8gYXNzaWduIHRvIHNvbWUgc3BlY2lmaWMgb2JqZWN0LgojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFJlbmUoZG90KUJvZWhtKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogRnJhbmsoZG90KU9iZXJlbmRlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogS0lYVXRpbHMucG0sdiAxLjE2IDIwMTEtMDktMTkgMDk6MTQ6NTggbWFiYSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6S0lYVXRpbHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE2ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIktJWFV0aWxzOiBHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntEQk9iamVjdH0gICA9ICRQYXJhbXtEQk9iamVjdH0gICB8fCBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VGltZU9iamVjdH0gPSAkUGFyYW17VGltZU9iamVjdH0gfHwgS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyggJXskU2VsZn0gKTsKCiAgICAkU2VsZi0+e0tJWEZSQU1FV09SS1NUUklOR19TVEFSVH0gPSAnIy0tLS0tLS0tLS0tIEtJWCB0c3VuYW1pIGZyYW1ld29yayAtLS0tLS0tLS0tLSc7CiAgICAkU2VsZi0+e0tJWEZSQU1FV09SS1NUUklOR19FTkR9ICAgPSAnIy0tLS0tLS0tLS0tIEVPIEtJWCB0c3VuYW1pIGZyYW1ld29yayAtLS0tLS0tLS0tLSc7CgogICAgJFNlbGYtPntLSVhGUkFNRVdPUktTVFJJTkd9ID0gIlxuIgogICAgICAgIC4gJFNlbGYtPntLSVhGUkFNRVdPUktTVFJJTkdfU1RBUlR9CiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAnIyBDdXN0b21QYWNrYWdlTGlicyB+IycKICAgICAgICAuICJcbiIKICAgICAgICAuICcjIEVPIEN1c3RvbVBhY2thZ2VMaWJzIH4jJwogICAgICAgIC4gIlxuIgogICAgICAgIC4gJFNlbGYtPntLSVhGUkFNRVdPUktTVFJJTkdfRU5EfQogICAgICAgIC4gIlxuIjsKCiAgICAkU2VsZi0+e0tJWEZSQU1FV09SS1NUUklOR19NT0RQRVJMfSA9ICJcbiIKICAgICAgICAuICRTZWxmLT57S0lYRlJBTUVXT1JLU1RSSU5HX1NUQVJUfQogICAgICAgIC4gIlxuIgogICAgICAgIC4gJyMgQ3VzdG9tUGFja2FnZUxpYnMgfiMnCiAgICAgICAgLiAiXG4iCiAgICAgICAgLiAnIyBFTyBDdXN0b21QYWNrYWdlTGlicyB+IycKICAgICAgICAuICJcbiIKICAgICAgICAuICRTZWxmLT57S0lYRlJBTUVXT1JLU1RSSU5HX0VORH0KICAgICAgICAuICJcbiI7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBSZWdpc3RlckN1c3RvbVBhY2FrZ2UoKQoKICAgIG15ICRWYXIgPSAkS0lYVXRpbHNPYmplY3QtPlJlZ2lzdGVyQ3VzdG9tUGFja2FnZSggCiAgICAgICAgUGFja2FnZU5hbWUgPT4gIktJWF9JVFNNIiwKICAgICAgICBQcmlvcml0eSAgICA9PiAiMTIzNCIsCiAgICApOwoKPWN1dAoKc3ViIFJlZ2lzdGVyQ3VzdG9tUGFja2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbWFuZGF0b3J5IHBhcmFtZXRlcnMKICAgIGZvciAocXcoUGFja2FnZU5hbWUgUHJpb3JpdHkpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21QYWNrYWdlcyA9ICRTZWxmLT5HZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoKTsKCiAgICAjZGVsZXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBwYWNrYWdlLi4uCiAgICBpZiAoICRDdXN0b21QYWNrYWdlcyAmJiByZWYoJEN1c3RvbVBhY2thZ2VzKSBuZSAnSEFTSCcgKSB7CiAgICAgICAgZm9yIG15ICRDdXJyUHJpbyAoIGtleXMoICV7JEN1c3RvbVBhY2thZ2VzfSApICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tUGFja2FnZXMtPnskQ3VyclByaW99CiAgICAgICAgICAgICAgICAmJiAoICRDdXN0b21QYWNrYWdlcy0+eyRDdXJyUHJpb30gZXEgJFBhcmFte1BhY2thZ2VOYW1lfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSggJEN1c3RvbVBhY2thZ2VzLT57JEN1cnJQcmlvfSApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IChuZXcpIHByaW9yaXR5IGZvciB0aGlzIHBhY2thZ2UuLi4KICAgICRDdXN0b21QYWNrYWdlcy0+eyAkUGFyYW17UHJpb3JpdHl9IH0gPSAkUGFyYW17UGFja2FnZU5hbWV9OwoKICAgICRTZWxmLT5TZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoIEN1c3RvbVBhY2thZ2VzID0+ICRDdXN0b21QYWNrYWdlcywgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gVW5SZWdpc3RlckN1c3RvbVBhY2thZ2UoKQoKICAgUmVtb3ZlcyBhIHRzdW5hbWktZXh0ZW5zaW9uIGZyb20gdGhlIEtJWF9QYWNrYWdlcyBmaWxlLgogICAKICAgbXkgJFZhciA9ICRLSVhVdGlsc09iamVjdC0+VW5SZWdpc3RlckN1c3RvbVBhY2thZ2UoICJLSVhfSVRTTSIgKTsKCj1jdXQKCnN1YiBVblJlZ2lzdGVyQ3VzdG9tUGFja2FnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbWFuZGF0b3J5IHBhcmFtZXRlcnMKICAgIGZvciAocXcoUGFja2FnZU5hbWUpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21QYWNrYWdlcyA9ICRTZWxmLT5HZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoKTsKCiAgICByZXR1cm4gaWYgKCAhJEN1c3RvbVBhY2thZ2VzIHx8IHJlZigkQ3VzdG9tUGFja2FnZXMpIG5lICdIQVNIJyApOwoKICAgIGZvciBteSAkQ3VyclByaW8gKCBrZXlzKCAleyRDdXN0b21QYWNrYWdlc30gKSApIHsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDdXN0b21QYWNrYWdlcy0+eyRDdXJyUHJpb30KICAgICAgICAgICAgJiYgKCAkQ3VzdG9tUGFja2FnZXMtPnskQ3VyclByaW99IGVxICRQYXJhbXtQYWNrYWdlTmFtZX0gKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBkZWxldGUoICRDdXN0b21QYWNrYWdlcy0+eyRDdXJyUHJpb30gKTsKICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPlNldFJlZ2lzdGVyZWRDdXN0b21QYWNrYWdlcyggQ3VzdG9tUGFja2FnZXMgPT4gJEN1c3RvbVBhY2thZ2VzLCApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBHZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoKQoKICAgUmV0dXJucyBhIGhhc2ggcmVmIGNvbnRhaW5pbmcgYWxsIHJlZ2lzdGVyZWQgY3VzdG9tIHBhY2thZ2VzLiBLZXkgZGVub3RlcyB0aGUgcHJpb3JpdHkgb2YgdGhlIHBhY2thZ2UgKHZhbHVlKSBvcmRlci4KICAgCiAgIG15ICVDdXN0b21QYWNrYWdlTGlzdCA9ICRLSVhVdGlsc09iamVjdC0+R2V0UmVnaXN0ZXJlZEN1c3RvbVBhY2thZ2VzKAogICAgICAgUmVzdWx0ID0+ICdBUlJBWScsICNvcHRpb25hbCAtIHJldHVybnMgc29ydGVkIGxpc3Qgb2YgY3VzdG9tIHBhY2thZ2VzIGluc3RlYWQgb2YgaGFzaCByZWYKICAgKTsKCj1jdXQKCnN1YiBHZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICVSZXRWYWwgPSAoKTsKCiAgICBteSAkSG9tZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBpZiAoICRIb21lICF+IG17Xi4qXC8kfXggKSB7CiAgICAgICAgJEhvbWUgLj0gJy8nOwogICAgfQogICAgbXkgJEtJWFBhY2thZ2VGaWxlID0gJEhvbWUgLiAnS0lYQ29yZS9DdXN0b21QYWNrYWdlcy5jZmcnOwoKICAgIGlmICggb3BlbiggbXkgJEZILCAnPCcsICRLSVhQYWNrYWdlRmlsZSApICkgewogICAgICAgIHdoaWxlICg8JEZIPikgewogICAgICAgICAgICBuZXh0IGlmICggJF8gIX4gLyguKyk6OiguKykvICk7CiAgICAgICAgICAgICRSZXRWYWx7JDF9ID0gJDI7CiAgICAgICAgfQogICAgICAgIGNsb3NlKCRGSCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJLSVgtSW5zdGFsbDogY291bGQgbm90IHJlYWQgPCRLSVhQYWNrYWdlRmlsZT4gLSB1c2luZyBlbXB0eSBoYXNoLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtSZXN1bHR9ICYmICRQYXJhbXtSZXN1bHR9IGVxICdBUlJBWScgKSB7CiAgICAgICAgbXkgQFJlc3VsdCA9IHF3e307CiAgICAgICAgZm9yIG15ICRDdXJyS2V5ICggc29ydCgga2V5cyglUmV0VmFsKSApICkgewogICAgICAgICAgICBwdXNoKCBAUmVzdWx0LCAkUmV0VmFseyRDdXJyS2V5fSApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gQFJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gXCVSZXRWYWw7Cn0KCj1pdGVtIFNldFJlZ2lzdGVyZWRDdXN0b21QYWNrYWdlcygpCgogICBXcml0ZXMgdGhlIEN1c3RvbVBhY2thZ2UgY29uZmlndXJhdGlvbiB0byBmaWxlIC0gYXV0b21hdGljYWxseSBhZGRzIGN1c3RvbSBwYWNrYWdlICJLSVhDb3JlIiBhdCBwcmlvcml0eSAiMDAwMCIuCiAgIAogICBteSAkUmVzdWx0ID0gJEtJWFV0aWxzT2JqZWN0LT5TZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoCiAgICAgICBDdXN0b21QYWNrYWdlcyA9PiAkSGFzaFJlZiwKICAgKTsKCj1jdXQKCnN1YiBTZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRSZXN1bHQgPSAwOwoKICAgICMgY2hlY2sgbWFuZGF0b3J5IHBhcmFtZXRlcnMKICAgIGZvciAocXcoQ3VzdG9tUGFja2FnZXMpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRIb21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIGlmICggJEhvbWUgIX4gbXteLipcLyR9eCApIHsKICAgICAgICAkSG9tZSAuPSAnLyc7CiAgICB9CiAgICBteSAkS0lYUGFja2FnZUZpbGUgPSAkSG9tZSAuICdLSVhDb3JlL0N1c3RvbVBhY2thZ2VzLmNmZyc7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyB1cGRhdGUgc3RvcmFnZSBmb3IgY3VzdG9tIHBhY2thZ2VzIGluIDxPVFJTX0hPTUU+L0tJWENvcmUvQ3VzdG9tUGFja2FnZXMuLi4KCiAgICAjIGVuZm9yY2UgIktJWENvcmUiIGN1c3RvbSBwYWNrYWdlLi4uCiAgICAkUGFyYW17Q3VzdG9tUGFja2FnZXN9LT57JzAwMDAnfSA9ICdLSVhDb3JlJzsKCiAgICBpZiAoIG9wZW4oIG15ICRGSCwgJz4nLCAkS0lYUGFja2FnZUZpbGUgKSApIHsKICAgICAgICBteSAkRmlsZUNvbnRlbnQgPSAnJzsKICAgICAgICBmb3IgbXkgJEN1cnJQcmlvS2V5ICggc29ydCBrZXlzICV7ICRQYXJhbXtDdXN0b21QYWNrYWdlc30gfSApIHsKICAgICAgICAgICAgJEZpbGVDb250ZW50IC49ICRDdXJyUHJpb0tleSAuICc6OicgLiAkUGFyYW17Q3VzdG9tUGFja2FnZXN9LT57JEN1cnJQcmlvS2V5fSAuICJcbiI7CiAgICAgICAgfQogICAgICAgIHByaW50ICRGSCAkRmlsZUNvbnRlbnQ7CiAgICAgICAgY2xvc2UoJEZIKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiS0lYLUluc3RhbGw6IGNvdWxkIG5vdCB3cml0ZSA8JEtJWFBhY2thZ2VGaWxlPiAhIiwKICAgICAgICApOwogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgdXBkYXRlIHVzZSBsaWIgY29uZmlndXJhdGlvbiBmb3IgY3VzdG9tIHBhY2thZ2VzIENvbmZpZy5wbS4uLgogICAgbXkgJENvbmZpZ0ZpbGUgPSAkSG9tZSAuICdLZXJuZWwvQ29uZmlnLnBtJzsKCiAgICAjIGdldCBjdXJyZW50IENvbmZpZy5wbSBjb250ZW50CiAgICBteSAkQ29uZmlnRmlsZUNvbnRlbnRPcmlnICAgPSAnJzsKICAgIG15ICRDb25maWdGaWxlQ29udGVudE5ldyAgICA9ICcnOwogICAgbXkgJFBhY2thZ2VDb25maWdMaW5lICAgICAgID0gMDsKICAgIG15ICRQYWNrYWdlQ29uZmlnTGluZXNGb3VuZCA9IDA7CgogICAgaWYgKCBvcGVuKCBteSAkSU4sICc8JywgJENvbmZpZ0ZpbGUgKSApIHsKICAgICAgICB3aGlsZSAoIG15ICRMaW5lID0gPCRJTj4gKSB7CiAgICAgICAgICAgIGlmICggJExpbmUgPX4gL1xzKiMgQ3VzdG9tUGFja2FnZUxpYnMgfiNccyQiOy8gKSB7CiAgICAgICAgICAgICAgICAkUGFja2FnZUNvbmZpZ0xpbmVzRm91bmQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRDb25maWdGaWxlQ29udGVudE9yaWcgLj0gJExpbmU7CgogICAgICAgIH0KICAgICAgICBjbG9zZSgkSU4pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiBmaWxlICRDb25maWdGaWxlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBubyBsaW5lcyBsaWtlICIjIEN1c3RvbVBhY2thZ2VMaWJzIH4jIiBmb3VuZCwgYWRkIGNvbXBsZXRlIEtJWEZSQU1FV09SS1NUUklORyBzdHJpbmcuLi4KICAgIGlmICggISRQYWNrYWdlQ29uZmlnTGluZXNGb3VuZCApIHsKICAgICAgICAkQ29uZmlnRmlsZUNvbnRlbnROZXcgPSAkQ29uZmlnRmlsZUNvbnRlbnRPcmlnIC4gJFNlbGYtPntLSVhGUkFNRVdPUktTVFJJTkd9IC4gIlxuMTsiOwogICAgICAgICRDb25maWdGaWxlQ29udGVudE5ldyA9fiBzL14xO1xzKiQvL2d4OwogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZ2V0IG5ldyBhZGRpdGlvbmFsIENvbmZpZy5wbSBjb250ZW50CiAgICBteSAkQ3VzdG9tUGFja2FnZUxpYlNhbXBsZSA9ICd1c2UgbGliICInIC4gJEhvbWUgLiAnPFBBQ0tBR0VOQU1FPiI7JyAuICJcbiI7CiAgICBteSAkQ29uZmlnRmlsZUNvbnRlbnRDdXN0b21QYWNrYWdlTGlicyA9ICcjIEN1c3RvbVBhY2thZ2VMaWJzIH4jJyAuICJcbiI7CgogICAgZm9yIG15ICRDdXJyUHJpb0tleSAoIHNvcnQga2V5cyAleyAkUGFyYW17Q3VzdG9tUGFja2FnZXN9IH0gKSB7CiAgICAgICAgJENvbmZpZ0ZpbGVDb250ZW50Q3VzdG9tUGFja2FnZUxpYnMgLj0gJEN1c3RvbVBhY2thZ2VMaWJTYW1wbGU7CiAgICAgICAgJENvbmZpZ0ZpbGVDb250ZW50Q3VzdG9tUGFja2FnZUxpYnMgPX4KICAgICAgICAgICAgcy88UEFDS0FHRU5BTUU+LyRQYXJhbXtDdXN0b21QYWNrYWdlc30tPnskQ3VyclByaW9LZXl9L2c7CiAgICB9CgogICAgJENvbmZpZ0ZpbGVDb250ZW50Q3VzdG9tUGFja2FnZUxpYnMgLj0gIlxuIyBFTyBDdXN0b21QYWNrYWdlTGlicyB+I1xuIjsKCiAgICAkQ29uZmlnRmlsZUNvbnRlbnROZXcgPX4KICAgICAgICBzeyMgQ3VzdG9tUGFja2FnZUxpYnMgfiMoLispIyBFTyBDdXN0b21QYWNrYWdlTGlicyB+I317JENvbmZpZ0ZpbGVDb250ZW50Q3VzdG9tUGFja2FnZUxpYnN9bXNnOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgYWRkIG5ldyBjb250ZW50IHRvIENvbmZpZy5wbQogICAgaWYgKCBsZW5ndGgoJENvbmZpZ0ZpbGVDb250ZW50TmV3KSApIHsKCiAgICAgICAgaWYgKCBvcGVuKCBteSAkT1VULCAnPicsICRDb25maWdGaWxlICkgKSB7CgogICAgICAgICAgICBiaW5tb2RlKCRPVVQpOwogICAgICAgICAgICBwcmludCAkT1VUICRDb25maWdGaWxlQ29udGVudE5ldzsKICAgICAgICAgICAgY2xvc2UoJE9VVCk7CgogICAgICAgICAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTSA9IHNwcmludGYgJyUwMmQnLCAkTTsKICAgICAgICAgICAgJEQgPSBzcHJpbnRmICclMDJkJywgJEQ7CiAgICAgICAgICAgICRoID0gc3ByaW50ZiAnJTAyZCcsICRoOwogICAgICAgICAgICAkbSA9IHNwcmludGYgJyUwMmQnLCAkbTsKICAgICAgICAgICAgbXkgJFRpbWVzdGFtcFN1ZmZpeCA9ICIkWS0kTS0kRCIgLiAiXyRoLSRtIjsKICAgICAgICAgICAgaWYgKCBvcGVuKCAkT1VULCAnPicsICIkQ29uZmlnRmlsZS5QcmVDdXN0b21QYWNrYWdlUmVnaXN0cmF0aW9uLiRUaW1lc3RhbXBTdWZmaXgiICkgKSB7CiAgICAgICAgICAgICAgICBiaW5tb2RlKCRPVVQpOwogICAgICAgICAgICAgICAgcHJpbnQgJE9VVCAkQ29uZmlnRmlsZUNvbnRlbnRPcmlnOwogICAgICAgICAgICAgICAgY2xvc2UoJE9VVCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVXBkYXRlZCAkQ29uZmlnRmlsZS4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFJlc3VsdCA9IDE7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBvcGVuIG9yIGVkaXQgZmlsZSAkQ29uZmlnRmlsZSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHVwZGF0ZSB1c2UgbGliIGNvbmZpZ3VyYXRpb24gZm9yIGN1c3RvbSBwYWNrYWdlcyBhcGFjaGUyLXBlcmwtc3RhcnR1cC5wbC4uLgogICAgbXkgJEFwYWNoZTJQZXJsU3RhcnRVcCA9ICRIb21lIC4gJ3NjcmlwdHMvYXBhY2hlMi1wZXJsLXN0YXJ0dXAucGwnOwoKICAgICMgZ2V0IGN1cnJlbnQgYXBhY2hlMi1wZXJsLXN0YXJ0dXAucGwgY29udGVudAogICAgbXkgJEFwYWNoZTJQZXJsU3RhcnRVcENvbnRlbnRPcmlnID0gJyc7CiAgICBteSAkQXBhY2hlMlBlcmxTdGFydFVwQ29udGVudE5ldyAgPSAnJzsKICAgIG15ICRQYXRoUHJlZml4ICAgICAgICAgICAgICAgICAgICA9ICRIb21lOwogICAgJFBhdGhQcmVmaXggPX4gcy9cLyQvLzsgIyBuZWVkZWQgZm9yIHJlZ2V4CiAgICAkUGFja2FnZUNvbmZpZ0xpbmUgICAgICAgPSAwOwogICAgJFBhY2thZ2VDb25maWdMaW5lc0ZvdW5kID0gMDsKCiAgICBpZiAoIG9wZW4oIG15ICRJTiwgJzwnLCAkQXBhY2hlMlBlcmxTdGFydFVwICkgKSB7CiAgICAgICAgd2hpbGUgKCBteSAkTGluZSA9IDwkSU4+ICkgewogICAgICAgICAgICBpZiAoICRMaW5lID1+IC9ccyojIEN1c3RvbVBhY2thZ2VMaWJzIH4jXHMkIjsvICkgewogICAgICAgICAgICAgICAgJFBhY2thZ2VDb25maWdMaW5lc0ZvdW5kID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQXBhY2hlMlBlcmxTdGFydFVwQ29udGVudE9yaWcgLj0gJExpbmU7CgogICAgICAgIH0KICAgICAgICBjbG9zZSgkSU4pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiBmaWxlICRBcGFjaGUyUGVybFN0YXJ0VXAhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGlmIG5vIGxpbmVzIGxpa2UgIiMgQ3VzdG9tUGFja2FnZUxpYnMgfiMiIGZvdW5kLCBhZGQgY29tcGxldGUgS0lYRlJBTUVXT1JLU1RSSU5HIHN0cmluZy4uLgogICAgaWYgKCAhJFBhY2thZ2VDb25maWdMaW5lc0ZvdW5kICkgewogICAgICAgICRBcGFjaGUyUGVybFN0YXJ0VXBDb250ZW50TmV3ID0gJEFwYWNoZTJQZXJsU3RhcnRVcENvbnRlbnRPcmlnOwogICAgICAgICRTZWxmLT57S0lYRlJBTUVXT1JLU1RSSU5HX01PRFBFUkx9CiAgICAgICAgICAgID0gJ3VzZSBsaWIgIicgLiAkUGF0aFByZWZpeCAuICcvQ3VzdG9tIjsnIC4gIlxuIiAuICRTZWxmLT57S0lYRlJBTUVXT1JLU1RSSU5HX01PRFBFUkx9OwogICAgICAgICRBcGFjaGUyUGVybFN0YXJ0VXBDb250ZW50TmV3CiAgICAgICAgICAgID1+IHN7dXNlIGxpYiAiJFBhdGhQcmVmaXgvQ3VzdG9tIjt9eyRTZWxmLT57S0lYRlJBTUVXT1JLU1RSSU5HX01PRFBFUkx9fW1zZzsKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGdldCBuZXcgYWRkaXRpb25hbCBhcGFjaGUyLXBlcmwtc3RhcnR1cC5wbCBjb250ZW50CiAgICAkQ3VzdG9tUGFja2FnZUxpYlNhbXBsZSA9ICJcbiIKICAgICAgICAuICd1c2UgbGliICInIC4gJFBhdGhQcmVmaXggLiAnLzxQQUNLQUdFTkFNRT4iOyc7CiAgICBteSAkQXBhY2hlMlBlcmxTdGFydFVwQ29udGVudEN1c3RvbVBhY2thZ2VMaWJzID0gIiMgQ3VzdG9tUGFja2FnZUxpYnMgfiMiOwoKICAgIGZvciBteSAkQ3VyclByaW9LZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0N1c3RvbVBhY2thZ2VzfSB9ICkgewogICAgICAgICRBcGFjaGUyUGVybFN0YXJ0VXBDb250ZW50Q3VzdG9tUGFja2FnZUxpYnMgLj0gJEN1c3RvbVBhY2thZ2VMaWJTYW1wbGU7CiAgICAgICAgJEFwYWNoZTJQZXJsU3RhcnRVcENvbnRlbnRDdXN0b21QYWNrYWdlTGlicyA9fgogICAgICAgICAgICBzLzxQQUNLQUdFTkFNRT4vJFBhcmFte0N1c3RvbVBhY2thZ2VzfS0+eyRDdXJyUHJpb0tleX0vZzsKICAgIH0KCiAgICAkQXBhY2hlMlBlcmxTdGFydFVwQ29udGVudEN1c3RvbVBhY2thZ2VMaWJzIC49ICJcbiMgRU8gQ3VzdG9tUGFja2FnZUxpYnMgfiNcbiI7CgogICAgJEFwYWNoZTJQZXJsU3RhcnRVcENvbnRlbnROZXcgPX4KICAgICAgICBzeyMgQ3VzdG9tUGFja2FnZUxpYnMgfiMoLispIyBFTyBDdXN0b21QYWNrYWdlTGlicyB+I317JEFwYWNoZTJQZXJsU3RhcnRVcENvbnRlbnRDdXN0b21QYWNrYWdlTGlic31tc2c7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBhZGQgbmV3IGNvbnRlbnQgdG8gYXBhY2hlMi1wZXJsLXN0YXJ0dXAucGwKICAgIGlmICggbGVuZ3RoKCRBcGFjaGUyUGVybFN0YXJ0VXBDb250ZW50TmV3KSApIHsKCiAgICAgICAgaWYgKCBvcGVuKCBteSAkT1VULCAnPicsICRBcGFjaGUyUGVybFN0YXJ0VXAgKSApIHsKCiAgICAgICAgICAgIGJpbm1vZGUoJE9VVCk7CiAgICAgICAgICAgIHByaW50ICRPVVQgJEFwYWNoZTJQZXJsU3RhcnRVcENvbnRlbnROZXc7CiAgICAgICAgICAgIGNsb3NlKCRPVVQpOwoKICAgICAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE0gPSBzcHJpbnRmICclMDJkJywgJE07CiAgICAgICAgICAgICREID0gc3ByaW50ZiAnJTAyZCcsICREOwogICAgICAgICAgICAkaCA9IHNwcmludGYgJyUwMmQnLCAkaDsKICAgICAgICAgICAgJG0gPSBzcHJpbnRmICclMDJkJywgJG07CiAgICAgICAgICAgIG15ICRUaW1lc3RhbXBTdWZmaXggPSAiJFktJE0tJEQiIC4gIl8kaC0kbSI7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIG9wZW4oCiAgICAgICAgICAgICAgICAgICAgJE9VVCwgJz4nLCAiJEFwYWNoZTJQZXJsU3RhcnRVcC5QcmVDdXN0b21QYWNrYWdlUmVnaXN0cmF0aW9uLiRUaW1lc3RhbXBTdWZmaXgiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJpbm1vZGUoJE9VVCk7CiAgICAgICAgICAgICAgICBwcmludCAkT1VUICRBcGFjaGUyUGVybFN0YXJ0VXBDb250ZW50T3JpZzsKICAgICAgICAgICAgICAgIGNsb3NlKCRPVVQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVwZGF0ZWQgJEFwYWNoZTJQZXJsU3RhcnRVcC4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFJlc3VsdCA9IDE7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBvcGVuIG9yIGVkaXQgZmlsZSAkQXBhY2hlMlBlcmxTdGFydFVwISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgY2hhbmdlIEBJTkMgdG8gYWxsb3cgdXNhZ2Ugb2YgY3VzdG9tIG1vZHVsZXMgaW4gQ29kZUluc3RhbGwuLi4KICAgICMgISEhIFRoaXMgZG9lcyBub3Qgd29yayB3aXRoIG1vZF9wZXJsKSAhISEKICAgIGZvciBteSAkQ3VyclByaW9LZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte0N1c3RvbVBhY2thZ2VzfSB9ICkgewogICAgICAgIHVuc2hpZnQoIEBJTkMsICRIb21lIC4gJFBhcmFte0N1c3RvbVBhY2thZ2VzfS0+eyRDdXJyUHJpb0tleX0gKTsKICAgIH0KCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWl0ZW0gQ2xlYW5VcENvbmZpZ1BtKCkKCiAgIFJlbW92ZXMgZmlsZSBjcmVhdGVkIGJ5IEtJWENvcmUgcmUtL2luc3RhbGxhdGlvbiBhbmQgYWxsIHJlbGF0ZWQgbGluZXMgZnJvbSBLZXJuZWwvQ29uZmlnLnBtIGFuZCBzY3JpcHRzL2FwYWNoZTItcGVybC1zdGFydHVwLnBsLgogICAKICAgbXkgJFJlc3VsdCA9ICRLSVhVdGlsc09iamVjdC0+Q2xlYW5VcENvbmZpZ1BtKCk7Cgo9Y3V0CgpzdWIgQ2xlYW5VcENvbmZpZ1BtIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkUmVzdWx0ID0gMDsKCiAgICBteSAkSG9tZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBpZiAoICRIb21lICF+IG17Xi4qXC8kfXggKSB7CiAgICAgICAgJEhvbWUgLj0gJy8nOwogICAgfQogICAgbXkgJEtJWFBhY2thZ2VGaWxlID0gJEhvbWUgLiAnS0lYQ29yZS9DdXN0b21QYWNrYWdlcy5jZmcnOwoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZGVsZXRlIHN0b3JhZ2UgZm9yIGN1c3RvbSBwYWNrYWdlcyBpbiA8T1RSU19IT01FPi9LSVhDb3JlL0N1c3RvbVBhY2thZ2VzLi4uCiAgICBpZiAoIHVubGluaygkS0lYUGFja2FnZUZpbGUpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIktJWC1JbnN0YWxsOiBkZWxldGVkIDwkS0lYUGFja2FnZUZpbGU+ICEiLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIktJWC1JbnN0YWxsOiBjb3VsZCBub3QgZGVsZXRlIDwkS0lYUGFja2FnZUZpbGU+ICEiLAogICAgICAgICk7CiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyB1cGRhdGUgdXNlIGxpYiBjb25maWd1cmF0aW9uIGZvciBjdXN0b20gcGFja2FnZXMgQ29uZmlnLnBtLi4uCiAgICBteSAkQ29uZmlnRmlsZSA9ICRIb21lIC4gJ0tlcm5lbC9Db25maWcucG0nOwoKICAgICMgZ2V0IGN1cnJlbnQgQ29uZmlnLnBtIGNvbnRlbnQKICAgIG15ICRDb25maWdGaWxlQ29udGVudE9yaWcgPSAnJzsKICAgIG15ICRDb25maWdGaWxlQ29udGVudE5ldyAgPSAnJzsKCiAgICBpZiAoIG9wZW4oIG15ICRJTiwgJzwnLCAkQ29uZmlnRmlsZSApICkgewogICAgICAgIHdoaWxlICggbXkgJExpbmUgPSA8JElOPiApIHsKICAgICAgICAgICAgJENvbmZpZ0ZpbGVDb250ZW50T3JpZyAuPSAkTGluZTsKICAgICAgICB9CiAgICAgICAgY2xvc2UoJElOKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IG9wZW4gZmlsZSAkQ29uZmlnRmlsZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRDb25maWdGaWxlQ29udGVudE5ldyA9fgogICAgICAgIHN7JFNlbGYtPntLSVhGUkFNRVdPUktTVFJJTkdfU1RBUlR9KC4rKSRTZWxmLT57S0lYRlJBTUVXT1JLU1RSSU5HX0VORH19e31tc2c7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBhZGQgbmV3IGNvbnRlbnQgdG8gQ29uZmlnLnBtCiAgICBpZiAoIGxlbmd0aCgkQ29uZmlnRmlsZUNvbnRlbnROZXcpICkgewoKICAgICAgICBpZiAoIG9wZW4oIG15ICRPVVQsICc+JywgJENvbmZpZ0ZpbGUgKSApIHsKCiAgICAgICAgICAgIGJpbm1vZGUoJE9VVCk7CiAgICAgICAgICAgIHByaW50ICRPVVQgJENvbmZpZ0ZpbGVDb250ZW50TmV3OwogICAgICAgICAgICBjbG9zZSgkT1VUKTsKCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ25vdGljZScsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVXBkYXRlZCAkQ29uZmlnRmlsZS4iLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFJlc3VsdCA9IDE7CgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBvcGVuIG9yIGVkaXQgZmlsZSAkQ29uZmlnRmlsZSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHVwZGF0ZSB1c2UgbGliIGNvbmZpZ3VyYXRpb24gZm9yIGN1c3RvbSBwYWNrYWdlcyBhcGFjaGUyLXBlcmwtc3RhcnR1cC5wbAogICAgbXkgJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGUgPSAkSG9tZSAuICdzY3JpcHRzL2FwYWNoZTItcGVybC1zdGFydHVwLnBsJzsKCiAgICAjIGdldCBjdXJyZW50IENvbmZpZy5wbSBjb250ZW50CiAgICBteSAkQXBhY2hlMlBlcmxTdGFydFVwRmlsZUNvbnRlbnRPcmlnID0gJyc7CiAgICBteSAkQXBhY2hlMlBlcmxTdGFydFVwRmlsZUNvbnRlbnROZXcgID0gJyc7CgogICAgaWYgKCBvcGVuKCBteSAkSU4sICc8JywgJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGUgKSApIHsKICAgICAgICB3aGlsZSAoIG15ICRMaW5lID0gPCRJTj4gKSB7CiAgICAgICAgICAgICRBcGFjaGUyUGVybFN0YXJ0VXBGaWxlQ29udGVudE9yaWcgLj0gJExpbmU7CiAgICAgICAgfQogICAgICAgIGNsb3NlKCRJTik7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBvcGVuIGZpbGUgJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGUhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkQXBhY2hlMlBlcmxTdGFydFVwRmlsZUNvbnRlbnROZXcgPSAkQXBhY2hlMlBlcmxTdGFydFVwRmlsZUNvbnRlbnRPcmlnOwogICAgJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGVDb250ZW50TmV3ID1+CiAgICAgICAgc3skU2VsZi0+e0tJWEZSQU1FV09SS1NUUklOR19TVEFSVH0oLispJFNlbGYtPntLSVhGUkFNRVdPUktTVFJJTkdfRU5EfX17fW1zZzsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGFkZCBuZXcgY29udGVudCB0byBhcGFjaGUyLXBlcmwtc3RhcnR1cC5wbAogICAgaWYgKCBsZW5ndGgoJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGVDb250ZW50TmV3KSApIHsKCiAgICAgICAgaWYgKCBvcGVuKCBteSAkT1VULCAnPicsICRBcGFjaGUyUGVybFN0YXJ0VXBGaWxlICkgKSB7CgogICAgICAgICAgICBiaW5tb2RlKCRPVVQpOwogICAgICAgICAgICBwcmludCAkT1VUICRBcGFjaGUyUGVybFN0YXJ0VXBGaWxlQ29udGVudE5ldzsKICAgICAgICAgICAgY2xvc2UoJE9VVCk7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVwZGF0ZWQgJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGUuIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZXN1bHQgPSAxOwoKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiBvciBlZGl0IGZpbGUgJEFwYWNoZTJQZXJsU3RhcnRVcEZpbGUhIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRSZXN1bHQ7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS5wbSAtIHByb3ZpZGVzIG11bHRpIGxhbmd1YWdlIHN1cHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgRXh0ZW5zaW9ucyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogVG9yc3Rlbihkb3QpVGhhdShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBMYW5ndWFnZS5wbSx2IDEuNSAyMDExLTA4LTIyIDA3OjUzOjMzIHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CgokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Okxhbmd1YWdlIC0gZ2xvYmFsIGxhbmd1YWdlIGludGVyZmFjZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGFuZ3VhZ2UgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYSBsYW5ndWFnZSBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6TGFuZ3VhZ2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBVc2VyTGFuZ3VhZ2UgPT4gJ2RlJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICBkaWUgIkdvdCBubyAkXyEiIGlmICggISRTZWxmLT57JF99ICk7CiAgICB9CgogICAgIyB0aW1lIG9iamVjdAogICAgJFNlbGYtPntUaW1lT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoJVBhcmFtKTsKCiAgICAjIDA9b2ZmOyAxPW9uOyAyPWdldCBhbGwgbm90IHRyYW5zbGF0ZWQgd29yZHM7IDM9Z2V0IGFsbCByZXF1ZXN0cwogICAgJFNlbGYtPntEZWJ1Z30gPSAwOwoKICAgICMgY2hlY2sgaWYgTGFuZ3VhZ2VEZWJ1ZyBpcyBjb25maWd1cmVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMYW5ndWFnZURlYnVnJykgKSB7CiAgICAgICAgJFNlbGYtPntMYW5ndWFnZURlYnVnfSA9IDE7CiAgICB9CgogICAgIyB1c2VyIGxhbmd1YWdlCiAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gPSAkUGFyYW17VXNlckxhbmd1YWdlfQogICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKQogICAgICAgIHx8ICdlbic7CgogICAgIyBjaGVjayBpZiBsYW5ndWFnZSBpcyBjb25maWd1cmVkCiAgICBteSAlTGFuZ3VhZ2VzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRVc2VkTGFuZ3VhZ2VzJykgfTsKICAgIGlmICggISRMYW5ndWFnZXN7ICRTZWxmLT57VXNlckxhbmd1YWdlfSB9ICkgewogICAgICAgICRTZWxmLT57VXNlckxhbmd1YWdlfSA9ICdlbic7CiAgICB9CgogICAgIyB0YWtlIHRpbWUgem9uZQogICAgJFNlbGYtPntUaW1lWm9uZX0gPSAkUGFyYW17VXNlclRpbWVab25lfSB8fCAkUGFyYW17VGltZVpvbmV9IHx8IDA7CgogICAgIyBEZWJ1ZwogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDAgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdEZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJVc2VyTGFuZ3VhZ2UgPSAkU2VsZi0+e1VzZXJMYW5ndWFnZX0iLAogICAgICAgICk7CiAgICB9CgogICAgIyBsb2FkIHRleHQgY2F0YWxvZyAuLi4KICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoIktlcm5lbDo6TGFuZ3VhZ2U6OiRTZWxmLT57VXNlckxhbmd1YWdlfSIpICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU29ycnksIGNhbid0IGxvY2F0ZSBvciBsb2FkIEtlcm5lbDo6TGFuZ3VhZ2U6OiRTZWxmLT57VXNlckxhbmd1YWdlfSAiCiAgICAgICAgICAgICAgICAuICJ0cmFuc2xhdGlvbiEgQ2hlY2sgdGhlIEtlcm5lbC9MYW5ndWFnZS8kU2VsZi0+e1VzZXJMYW5ndWFnZX0ucG0gKHBlcmwgLWN3KSEiLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgbW9kdWxlIHRvIElTQQogICAgQElTQSA9ICgiS2VybmVsOjpMYW5ndWFnZTo6JFNlbGYtPntVc2VyTGFuZ3VhZ2V9Iik7CgogICAgIyBleGVjdXRlIHRyYW5zbGF0aW9uIG1hcAogICAgaWYgKCBldmFsIHsgJFNlbGYtPkRhdGEoKSB9ICkgewoKICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ID4gMCApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIktlcm5lbDo6TGFuZ3VhZ2U6OiRTZWxmLT57VXNlckxhbmd1YWdlfSBsb2FkIC4uLiBkb25lLiIKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGFjdGlvbiB0ZXh0IGNhdGFsb2cgLi4uCiAgICBteSAkQ3VzdG9tVHJhbnNsYXRpb25Nb2R1bGUgPSAnJzsKCiAgICAjIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9uIHRyYW5zbGF0aW9uIGZpbGVzLCBhIG5ldyB0cmFuc2xhdGlvbiBmaWxlIGdldHMgY3JlYXRlZAogICAgaWYgKCAhJFBhcmFte1RyYW5zbGF0aW9uRmlsZX0gKSB7CgogICAgICAgICMgbG9va2luZyB0byBhZGRpdGlvbiB0cmFuc2xhdGlvbiBmaWxlcwogICAgICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICAgICAjbXkgJEhvbWUgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvJzsKICAgICAgICAjbXkgQEZpbGVzID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAjICAgIERpcmVjdG9yeSA9PiAkSG9tZSAuICJLZXJuZWwvTGFuZ3VhZ2UvIiwKICAgICAgICAjICAgIEZpbHRlciAgICA9PiAiJFNlbGYtPntVc2VyTGFuZ3VhZ2V9XyoucG0iLAogICAgICAgICMpOwogICAgICAgIG15IEBGaWxlczsKICAgICAgICBmb3IgbXkgJERpciAocmV2ZXJzZSBASU5DKSB7CiAgICAgICAgICAgIG15ICRMYW5nRGlyID0gIiREaXIvS2VybmVsL0xhbmd1YWdlLyI7CiAgICAgICAgICAgICRMYW5nRGlyID1+IHMnXHMnXFxzJ2c7CiAgICAgICAgICAgIGlmICggLWUgIiRMYW5nRGlyIiApIHsKICAgICAgICAgICAgICAgIG15IEBLSVhGaWxlcyA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkRpcmVjdG9yeVJlYWQoCiAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICRMYW5nRGlyLAogICAgICAgICAgICAgICAgICAgIEZpbHRlciAgICA9PiAiJFNlbGYtPntVc2VyTGFuZ3VhZ2V9XyoucG0iLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHB1c2ggQEZpbGVzLCBAS0lYRmlsZXM7CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEVPIEtJWENvcmUtY2FwZUlUCgogICAgICAgIGZvciBteSAkRmlsZSAoQEZpbGVzKSB7CgogICAgICAgICAgICAjIGdldCBtb2R1bGUgbmFtZSBiYXNlZCBvbiBmaWxlIG5hbWUKICAgICAgICAgICAgIyBLSVhDb3JlLWNhcGVJVAogICAgICAgICAgICAjJEZpbGUgPX4gcy9eJEhvbWUoLiopXC5wbSQvJDEvZzsKICAgICAgICAgICAgJEZpbGUgPX4gcy8uKihLZXJuZWxcL0xhbmd1YWdlXC8uKilcLnBtJC8kMS9nOwoKICAgICAgICAgICAgIyBFTyBLSVhDb3JlLWNhcGVJVAoKICAgICAgICAgICAgJEZpbGUgPX4gcy9cL1wvL1wvL2c7CiAgICAgICAgICAgICRGaWxlID1+IHMvXC8vOjovZzsKCiAgICAgICAgICAgICMgaWdub3JlIGxhbmd1YWdlIHRyYW5zbGF0aW9uIGZpbGVzIGxpa2UgKGVuX0dCLCBlbl9DQSwgLi4uKQogICAgICAgICAgICBuZXh0IGlmICRGaWxlID1+IC8uLl8uLiQvOwoKICAgICAgICAgICAgIyByZW1lbWJlciBjdXN0b20gZmlsZXMgdG8gbG9hZCBhdCBsZWFzdAogICAgICAgICAgICBpZiAoICRGaWxlID1+IC9fQ3VzdG9tJC8gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tVHJhbnNsYXRpb25Nb2R1bGUgPSAkRmlsZTsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgbG9hZCB0cmFuc2xhdGlvbiBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkRmlsZSkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTb3JyeSwgY2FuJ3QgbG9hZCAkRmlsZSEgIiAuICJDaGVjayB0aGUgJEZpbGUgKHBlcmwgLWN3KSEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYWRkIG1vZHVsZSB0byBJU0EKICAgICAgICAgICAgQElTQSA9ICgkRmlsZSk7CgogICAgICAgICAgICAjIGV4ZWN1dGUgdHJhbnNsYXRpb24gbWFwCiAgICAgICAgICAgIGlmICggZXZhbCB7ICRTZWxmLT5EYXRhKCkgfSApIHsKCiAgICAgICAgICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gPiAwICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiJEZpbGUgbG9hZCAuLi4gZG9uZS4iCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBsb2FkIGN1c3RvbSB0ZXh0IGNhdGFsb2cgLi4uCiAgICAgICAgaWYgKCAkQ3VzdG9tVHJhbnNsYXRpb25Nb2R1bGUgJiYgJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkQ3VzdG9tVHJhbnNsYXRpb25Nb2R1bGUpICkgewoKICAgICAgICAgICAgIyBhZGQgbW9kdWxlIHRvIElTQQogICAgICAgICAgICBASVNBID0gKCRDdXN0b21UcmFuc2xhdGlvbk1vZHVsZSk7CgogICAgICAgICAgICAjIGV4ZWN1dGUgdHJhbnNsYXRpb24gbWFwCiAgICAgICAgICAgIGlmICggZXZhbCB7ICRTZWxmLT5EYXRhKCkgfSApIHsKCiAgICAgICAgICAgICAgICAjIGRlYnVnIGluZm8KICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntEZWJ1Z30gPiAwICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRGVidWcnLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiS2VybmVsOjpMYW5ndWFnZTo6JFNlbGYtPntVc2VyTGFuZ3VhZ2V9X0N1c3RvbSBsb2FkIC4uLiBkb25lLiIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgbm8gcmV0dXJuIGNoYXJzZXQgaXMgZ2l2ZW4sIHVzZSByZWNvbW1lbmRlZCByZXR1cm4gY2hhcnNldAogICAgaWYgKCAhJFNlbGYtPntSZXR1cm5DaGFyc2V0fSApIHsKICAgICAgICAkU2VsZi0+e1JldHVybkNoYXJzZXR9ID0gJFNlbGYtPkdldFJlY29tbWVuZGVkQ2hhcnNldCgpOwogICAgfQoKICAgICMgZ2V0IHNvdXJjZSBmaWxlIGNoYXJzZXQKICAgICMgd2hhdCBjaGFyc2V0IHNob3VkIEkgdXNlICh0YWtlIGl0IGZyb20gdHJhbnNsYXRpb24gZmlsZSkhCiAgICBpZiAoICRTZWxmLT57Q2hhcnNldH0gJiYgcmVmICRTZWxmLT57Q2hhcnNldH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAkU2VsZi0+e1RyYW5zbGF0aW9uQ2hhcnNldH0gPSAkU2VsZi0+e0NoYXJzZXR9LT5bLTFdOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gR2V0KCkKClRyYW5zbGF0ZSBhIHN0cmluZy4KCiAgICBteSAkVGV4dCA9ICRMYW5ndWFnZU9iamVjdC0+R2V0KCdIZWxsbycpOwoKICAgIEV4YW1wbGU6ICh0aGUgcXVvdGluZyBsb29rcyBzdHJhbmdlLCBidXQgaXMgaW4gZmFjdCBjb3JyZWN0ISkKCiAgICBteSAkU3RyaW5nID0gJ0hpc3Rvcnk6Ok5ld1RpY2tldCIsICIyMDExMDMxMTEwMDAwMDIzIiwgIlBvc3RtYXN0ZXIiLCAiMyBub3JtYWwiLCAib3BlbiIsICI5JzsKCiAgICBteSAkVHJhbnNsYXRlZFN0cmluZyA9ICRMYW5ndWFnZU9iamVjdC0+R2V0KCAkU3RyaW5nICk7Cgo9Y3V0CgpzdWIgR2V0IHsKICAgIG15ICggJFNlbGYsICRXaGF0ICkgPSBAXzsKCiAgICAjIGNoZWNrCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFdoYXQ7CiAgICByZXR1cm4gJycgaWYgJFdoYXQgZXEgJyc7CgogICAgIyBjaGVjayBkeW4gc3BhY2VzCiAgICBteSBARHluOwogICAgaWYgKCAkV2hhdCAmJiAkV2hhdCA9fiAvXiguKz8pIixcc3swLDF9IiguKj8pJC8gKSB7CiAgICAgICAgJFdoYXQgPSAkMTsKICAgICAgICBARHluID0gc3BsaXQoIC8iLFxzezAsMX0iLywgJDIgKTsKICAgIH0KCiAgICAjIGNoZWNrIHdhbnRlZCBwYXJhbSBhbmQgcmV0dXJucyB0aGUKICAgICMgbG9va3VwIG9yIHRoZSBlbmdsaXNoIGRhdGEKICAgIGlmICggJFNlbGYtPntUcmFuc2xhdGlvbn0tPnskV2hhdH0gKSB7CgogICAgICAgICMgRGVidWcKICAgICAgICBpZiAoICRTZWxmLT57RGVidWd9ID4gMyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIi0+R2V0KCckV2hhdCcpID0gKCckU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyRXaGF0fScpLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoYXJzZXQgY29udmVydCBmcm9tIHNvdXJjZSB0cmFuc2xhdGlvbiBpbnRvIHNob3duIGNoYXJzZXQKICAgICAgICBpZiAoICEkU2VsZi0+e1RyYW5zbGF0aW9uQ29udmVydH0tPnskV2hhdH0gKSB7CgogICAgICAgICAgICAjIHJlbWVtYmVyIHRoYXQgY2hhcnNldCBjb252ZXJ0IGlzIGFscmVhZHkgZG9uZQogICAgICAgICAgICAkU2VsZi0+e1RyYW5zbGF0aW9uQ29udmVydH0tPnskV2hhdH0gPSAxOwoKICAgICAgICAgICAgIyBjb252ZXJ0CiAgICAgICAgICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57JFdoYXR9ID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5Db252ZXJ0KAogICAgICAgICAgICAgICAgVGV4dCA9PiAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eyRXaGF0fSwKICAgICAgICAgICAgICAgIEZyb20gPT4gJFNlbGYtPntUcmFuc2xhdGlvbkNoYXJzZXR9LAogICAgICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e1JldHVybkNoYXJzZXR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkVGV4dCA9ICRTZWxmLT57VHJhbnNsYXRpb259LT57JFdoYXR9OwogICAgICAgIGlmIChARHluKSB7CiAgICAgICAgICAgIGZvciAoIDAgLi4gJCNEeW4gKSB7CgogICAgICAgICAgICAgICAgIyBiZSBjYXJlZnVsICREeW5bJF9dIGNhbiBiZSAwISBidWcjMzgyNgogICAgICAgICAgICAgICAgbGFzdCBpZiAhZGVmaW5lZCAkRHluWyRfXTsKCiAgICAgICAgICAgICAgICBpZiAoICREeW5bJF9dID1+IC9UaW1lXCgoLiopXCkvICkgewogICAgICAgICAgICAgICAgICAgICREeW5bJF9dID0gJFNlbGYtPlRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnR0VUJywKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ID0+ICQxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cJShzfGQpLyREeW5bJF9dLzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUZXh0ID1+IHMvXCUoc3xkKS8kRHluWyRfXS87CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICRUZXh0OwogICAgfQoKICAgICMgd2FybiBpZiB0aGUgdmFsdWUgaXMgbm90IGRlZgogICAgaWYgKCAkU2VsZi0+e0RlYnVnfSA+IDEgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdkZWJ1ZycsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICItPkdldCgnJFdoYXQnKSBJcyBub3QgdHJhbnNsYXRlZCEhISIsCiAgICAgICAgKTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57TGFuZ3VhZ2VEZWJ1Z30gKSB7CiAgICAgICAgcHJpbnQgU1RERVJSICJObyB0cmFuc2xhdGlvbiBhdmFpbGFibGUgZm9yICckV2hhdCdcbiI7CiAgICB9CgogICAgaWYgKEBEeW4pIHsKICAgICAgICBmb3IgKCAwIC4uICQjRHluICkgewoKICAgICAgICAgICAgIyBiZSBjYXJlZnVsICREeW5bJF9dIGNhbiBiZSAwISBidWcjMzgyNgogICAgICAgICAgICBsYXN0IGlmICFkZWZpbmVkICREeW5bJF9dOwoKICAgICAgICAgICAgaWYgKCAkRHluWyRfXSA9fiAvVGltZVwoKC4qKVwpLyApIHsKICAgICAgICAgICAgICAgICREeW5bJF9dID0gJFNlbGYtPlRpbWUoCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICdHRVQnLAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCA9PiAkMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkV2hhdCA9fiBzL1wlKHN8ZCkvJER5blskX10vOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFdoYXQgPX4gcy9cJShzfGQpLyREeW5bJF9dLzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFdoYXQ7Cn0KCj1pdGVtIEZvcm1hdFRpbWVTdHJpbmcoKQoKR2V0IGRhdGUgZm9ybWF0IGluIHVzZWQgbGFuZ3VhZ2UgZm9ybWF0ZSAoYmFzZWQgb24gdHJhbnNsYXRpb24gZmlsZSkuCgogICAgbXkgJERhdGUgPSAkTGFuZ3VhZ2VPYmplY3QtPkZvcm1hdFRpbWVTdHJpbmcoJzIwMDktMTItMTIgMTI6MTI6MTInLCAnRGF0ZUZvcm1hdCcpOwoKPWN1dAoKc3ViIEZvcm1hdFRpbWVTdHJpbmcgewogICAgbXkgKCAkU2VsZiwgJFN0cmluZywgJENvbmZpZywgJFNob3J0ICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgISRTdHJpbmc7CgogICAgaWYgKCAhJENvbmZpZyApIHsKICAgICAgICAkQ29uZmlnID0gJ0RhdGVGb3JtYXQnOwogICAgfQogICAgaWYgKCAhJFNob3J0ICkgewogICAgICAgICRTaG9ydCA9IDA7CiAgICB9CgogICAgbXkgJFJldHVyblN0cmluZyA9ICRTZWxmLT57JENvbmZpZ30gfHwgIiRDb25maWcgbmVlZHMgdG8gYmUgdHJhbnNsYXRlZCEiOwogICAgaWYgKCAkU3RyaW5nID1+IC8oXGRcZFxkXGQpLShcZFxkKS0oXGRcZClccyhcZFxkOlxkXGQ6XGRcZCkvICkgewogICAgICAgIG15ICggJFksICRNLCAkRCwgJFQgKSA9ICggJDEsICQyLCAkMywgJDQgKTsKCiAgICAgICAgIyBhZGQgdXNlciB0aW1lIHpvbmUgZGlmZgogICAgICAgIGlmICggJFNlbGYtPntUaW1lWm9uZX0gKSB7CiAgICAgICAgICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICIkWS0kTS0kRCAkVCIsICk7CiAgICAgICAgICAgICRUaW1lU3RhbXAgPSAkVGltZVN0YW1wICsgKCAkU2VsZi0+e1RpbWVab25lfSAqIDYwICogNjAgKTsKICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkVGltZVN0YW1wLAogICAgICAgICAgICApOwogICAgICAgICAgICAoICRZLCAkTSwgJEQsICRUICkgPSAoICRZZWFyLCAkTW9udGgsICREYXksICIkSG91cjokTWluOiRTZWMiICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoJFNob3J0KSB7CiAgICAgICAgICAgICRUID1+IHMvKFxkXGQ6XGRcZCk6XGRcZC8kMS9nOwogICAgICAgIH0KICAgICAgICAkUmV0dXJuU3RyaW5nID1+IHMvXCVULyRUL2c7CiAgICAgICAgJFJldHVyblN0cmluZyA9fiBzL1wlRC8kRC9nOwogICAgICAgICRSZXR1cm5TdHJpbmcgPX4gcy9cJU0vJE0vZzsKICAgICAgICAkUmV0dXJuU3RyaW5nID1+IHMvXCVZLyRZL2c7CiAgICAgICAgaWYgKCAkU2VsZi0+e1RpbWVab25lfSApIHsKICAgICAgICAgICAgcmV0dXJuICRSZXR1cm5TdHJpbmcgLiAiICgkU2VsZi0+e1RpbWVab25lfSkiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFJldHVyblN0cmluZzsKICAgIH0KICAgIGVsc2lmICggJFN0cmluZyA9fiAvXihcZFxkOlxkXGQ6XGRcZCkkLyApIHsKICAgICAgICByZXR1cm4gJFN0cmluZzsKICAgIH0KCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICBNZXNzYWdlICA9PiAiTm8gRm9ybWF0VGltZVN0cmluZygpIHRyYW5zbGF0aW9uIGZvdW5kIGZvciAnJFN0cmluZycgc3RyaW5nISIsCiAgICApOwoKICAgIHJldHVybiAkU3RyaW5nOwoKfQoKPWl0ZW0gR2V0UmVjb21tZW5kZWRDaGFyc2V0KCkKClJldHVybnMgdGhlIHJlY29tbWVuZGVkIGNoYXJzZXQgZm9yIGZyb250ZW5kIChiYXNlZCBvbiB0cmFuc2xhdGlvbgpmaWxlIG9yIGZyb20gRGVmYXVsdENoYXJzZXQgKGZyb20gS2VybmVsL0NvbmZpZy5wbSkgaXMgdXRmLTgpLgoKICAgIG15ICRDaGFyc2V0ID0gJExhbmd1YWdlT2JqZWN0LT5HZXRSZWNvbW1lbmRlZENoYXJzZXQoKS4KCj1jdXQKCnN1YiBHZXRSZWNvbW1lbmRlZENoYXJzZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIHNob3VsZCBJIHVzZSBkZWZhdWx0IGZyb250ZW5kIGNoYXJzZXQgKGUuIGcuIHV0Zi04KT8KICAgIG15ICRDaGFyc2V0ID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVJbnRlcm5hbFVzZWQoKTsKICAgIHJldHVybiAkQ2hhcnNldCBpZiAkQ2hhcnNldDsKCiAgICAjIGlmIG5vdCwgd2hhdCBjaGFyc2V0IHNob3VkIEkgdXNlICh0YWtlIGl0IGZyb20gdHJhbnNsYXRpb24gZmlsZSk/CiAgICByZXR1cm4gJFNlbGYtPntDaGFyc2V0fS0+Wy0xXSBpZiAkU2VsZi0+e0NoYXJzZXR9OwoKICAgIHJldHVybiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdENoYXJzZXQnKSB8fCAnaXNvLTg4NTktMSc7Cn0KCj1pdGVtIEdldFBvc3NpYmxlQ2hhcnNldHMoKQoKUmV0dXJucyBhbiBhcnJheSBvZiBwb3NzaWJsZSBjaGFyc2V0cyAoYmFzZWQgb24gdHJhbnNsYXRpb24gZmlsZSkuCgogICAgbXkgQENoYXJzZXRzID0gJExhbmd1YWdlT2JqZWN0LT5HZXRQb3NzaWJsZUNoYXJzZXRzKCkuCgo9Y3V0CgpzdWIgR2V0UG9zc2libGVDaGFyc2V0cyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybiBAeyAkU2VsZi0+e0NoYXJzZXR9IH0gaWYgJFNlbGYtPntDaGFyc2V0fTsKICAgIHJldHVybjsKfQoKPWl0ZW0gVGltZSgpCgpSZXR1cm5zIGEgdGltZSBzdHJpbmcgaW4gbGFuZ3VhZ2UgZm9ybWF0IChiYXNlZCBvbiB0cmFuc2xhdGlvbiBmaWxlKS4KCiAgICAkVGltZSA9ICRMYW5ndWFnZU9iamVjdC0+VGltZSgKICAgICAgICBBY3Rpb24gPT4gJ0dFVCcsCiAgICAgICAgRm9ybWF0ID0+ICdEYXRlRm9ybWF0JywKICAgICk7CgogICAgJFRpbWVMb25nID0gJExhbmd1YWdlT2JqZWN0LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnR0VUJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVGb3JtYXRMb25nJywKICAgICk7CgogICAgJFRpbWVMb25nID0gJExhbmd1YWdlT2JqZWN0LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnUkVUVVJOJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVGb3JtYXRMb25nJywKICAgICAgICBZZWFyICAgPT4gMTk3NywKICAgICAgICBNb250aCAgPT4gMTAsCiAgICAgICAgRGF5ICAgID0+IDI3LAogICAgICAgIEhvdXIgICA9PiAyMCwKICAgICAgICBNaW51dGUgPT4gMTAsCiAgICAgICAgU2Vjb25kID0+IDA1LAogICAgKTsKCj1jdXQKCnN1YiBUaW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoQWN0aW9uIEZvcm1hdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkUmV0dXJuU3RyaW5nID0gJFNlbGYtPnsgJFBhcmFte0Zvcm1hdH0gfSB8fCAnTmVlZCB0byBiZSB0cmFuc2xhdGVkISc7CiAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFksICR3ZCwgJHlkLCAkZHN0ICk7CgogICAgIyBzZXQgb3IgZ2V0IHRpbWUKICAgIGlmICggbGMgJFBhcmFte0FjdGlvbn0gZXEgJ2dldCcgKSB7CiAgICAgICAgbXkgQERBWVMgPSBxdy9TdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXQvOwogICAgICAgIG15IEBNT05TID0gcXcvSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMvOwogICAgICAgICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSwgJHdkLCAkeWQsICRkc3QgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggbGMgJFBhcmFte0FjdGlvbn0gZXEgJ3JldHVybicgKSB7CiAgICAgICAgJHMgPSAkUGFyYW17U2Vjb25kfSB8fCAwOwogICAgICAgICRtID0gJFBhcmFte01pbnV0ZX0gfHwgMDsKICAgICAgICAkaCA9ICRQYXJhbXtIb3VyfSAgIHx8IDA7CiAgICAgICAgJEQgPSAkUGFyYW17RGF5fSAgICB8fCAwOwogICAgICAgICRNID0gJFBhcmFte01vbnRofSAgfHwgMDsKICAgICAgICAkWSA9ICRQYXJhbXtZZWFyfSAgIHx8IDA7CiAgICB9CgogICAgIyBkbyByZXBsYWNlCiAgICBpZiAoICggbGMgJFBhcmFte0FjdGlvbn0gZXEgJ2dldCcgKSB8fCAoIGxjICRQYXJhbXtBY3Rpb259IGVxICdyZXR1cm4nICkgKSB7CiAgICAgICAgbXkgQERBWVMgPSBxdy9TdW4gTW9uIFR1ZSBXZWQgVGh1IEZyaSBTYXQvOwogICAgICAgIG15IEBNT05TID0gcXcvSmFuIEZlYiBNYXIgQXByIE1heSBKdW4gSnVsIEF1ZyBTZXAgT2N0IE5vdiBEZWMvOwogICAgICAgIG15ICRUaW1lID0gJyc7CiAgICAgICAgaWYgKCAkUGFyYW17TW9kZX0gJiYgJFBhcmFte01vZGV9ID1+IC9eTm90TnVtZXJpYyQvaSApIHsKICAgICAgICAgICAgaWYgKCAhJHMgKSB7CiAgICAgICAgICAgICAgICAkVGltZSA9ICIkaDokbSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVGltZSA9ICIkaDokbTokcyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUaW1lID0gc3ByaW50ZiggIiUwMmQ6JTAyZDolMDJkIiwgJGgsICRtLCAkcyApOwogICAgICAgICAgICAkRCAgICA9IHNwcmludGYoICIlMDJkIiwgICAgICAgICAgICREICk7CiAgICAgICAgICAgICRNICAgID0gc3ByaW50ZiggIiUwMmQiLCAgICAgICAgICAgJE0gKTsKICAgICAgICB9CiAgICAgICAgJFJldHVyblN0cmluZyA9fiBzL1wlVC8kVGltZS9nOwogICAgICAgICRSZXR1cm5TdHJpbmcgPX4gcy9cJUQvJEQvZzsKICAgICAgICAkUmV0dXJuU3RyaW5nID1+IHMvXCVNLyRNL2c7CiAgICAgICAgJFJldHVyblN0cmluZyA9fiBzL1wlWS8kWS9nOwogICAgICAgICRSZXR1cm5TdHJpbmcgPX4gcy9cJVkvJFkvZzsKICAgICAgICAkUmV0dXJuU3RyaW5nID1+IHN7KFwlQSl9eyRTZWxmLT5HZXQoJERBWVNbJHdkXSk7fWVneDsKICAgICAgICAkUmV0dXJuU3RyaW5nID1+IHN7KFwlQil9eyRTZWxmLT5HZXQoJE1PTlNbJE0tMV0pO31lZ3g7CiAgICAgICAgcmV0dXJuICRSZXR1cm5TdHJpbmc7CiAgICB9CgogICAgcmV0dXJuICRSZXR1cm5TdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAxMS0wOC0yMiAwNzo1MzozMyAkCgo9Y3V0Cg==
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXQucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTEgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIEtJWENvcmUgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFJlbmUoZG90KUJvZWhtKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogTGF5b3V0LnBtLHYgMS44LjIuNSAyMDExLTExLTExIDE0OjI0OjE0IHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6Okxhbmd1YWdlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlsczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpKU09OOwojIEtJWENvcmUtY2FwZUlUCnVzZSBLZXJuZWw6OlN5c3RlbTo6S0lYVXRpbHM7CiMgRU8gS0lYQ29yZS1jYXBlSVQKdXNlIE1haWw6OkFkZHJlc3M7CnVzZSBVUkk6OkVzY2FwZSBxdygpOwp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOC4yLjUgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQgLSBhbGwgZ2VuZXJpYyBodG1sIGZ1bmN0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZ2VuZXJpYyBodG1sIGZ1bmN0aW9ucy4gRS4gZy4gdG8gZ2V0IG9wdGlvbnMgZmllbGRzLCB0ZW1wbGF0ZSBwcm9jZXNzaW5nLCAuLi4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgbmV3IG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlRpbWU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdDsKICAgIHVzZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0OwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkUmVxdWVzdE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJExheW91dE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBSZXF1ZXN0T2JqZWN0ID0+ICRSZXF1ZXN0T2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCAgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMYW5nICAgICAgICAgID0+ICdkZScsCiAgICApOwoKICAgIGluIGFkZGl0aW9uIGZvciBOYXZpZ2F0aW9uQmFyKCkgeW91IG5lZWQKICAgICAgICBEQk9iamVjdAogICAgICAgIFNlc3Npb25PYmplY3QKICAgICAgICBVc2VySUQKICAgICAgICBUaWNrZXRPYmplY3QKICAgICAgICBHcm91cE9iamVjdAoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIHNldCBkZWJ1ZwogICAgJFNlbGYtPntEZWJ1Z30gPSAwOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgICMgQXR0ZW50aW9uOiBOYXZpZ2F0aW9uQmFyKCkgbmVlZHMgYWxzbyBTZXNzaW9uT2JqZWN0IGFuZCBzb21lIG90aGVyIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IFRpbWVPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QgUGFyYW1PYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkdvdCBubyAkT2JqZWN0ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFkZGl0aW9uYWwgb2JqZWN0cwogICAgJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkhUTUxVdGlscy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntKU09OT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OkpTT04tPm5ldyggJXskU2VsZn0gKTsKCiMgS0lYQ29yZS1jYXBlSVQKICAgICRTZWxmLT57S0lYVXRpbHNPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpLSVhVdGlscy0+bmV3KCAleyRTZWxmfSApOwojIEVPIEtJWENvcmUtY2FwZUlUCgogICAgIyByZXNldCBibG9jayBkYXRhCiAgICBkZWxldGUgJFNlbGYtPntCbG9ja0RhdGF9OwoKICAgICMgZ2V0L3NldCBzb21lIGNvbW1vbiBwYXJhbXMKICAgIGlmICggISRTZWxmLT57VXNlclRoZW1lfSApIHsKICAgICAgICAkU2VsZi0+e1VzZXJUaGVtZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFRoZW1lJyk7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVpvbmVVc2VyJykgJiYgJFNlbGYtPntVc2VyVGltZVpvbmV9ICkgewogICAgICAgICRTZWxmLT57VXNlclRpbWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglUGFyYW0pOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntVc2VyVGltZU9iamVjdH0gPSAkU2VsZi0+e1RpbWVPYmplY3R9OwogICAgICAgICRTZWxmLT57VXNlclRpbWVab25lfSAgID0gJyc7CiAgICB9CgogICAgIyBnZXQgdXNlIGxhbmd1YWdlIChmcm9tIGJyb3dzZXIpIGlmIG5vIGxhbmd1YWdlIGlzIHRoZXJlIQogICAgaWYgKCAhJFNlbGYtPntVc2VyTGFuZ3VhZ2V9ICkgewogICAgICAgIG15ICRCcm93c2VyTGFuZyA9ICRTZWxmLT57TGFuZ30gfHwgJEVOVntIVFRQX0FDQ0VQVF9MQU5HVUFHRX0gfHwgJyc7CiAgICAgICAgbXkgJURhdGEgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFVzZWRMYW5ndWFnZXMnKSB9OwogICAgICAgIExBTkdVQUdFOgogICAgICAgIGZvciBteSAkTGFuZ3VhZ2UgKCByZXZlcnNlIHNvcnQga2V5cyAlRGF0YSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgeHhfWFggYW5kIHh4LVhYIHR5cGUKICAgICAgICAgICAgbXkgJExhbmd1YWdlT3RoZXJUeXBlID0gJExhbmd1YWdlOwogICAgICAgICAgICAkTGFuZ3VhZ2VPdGhlclR5cGUgPX4gcy9fLy0vOwogICAgICAgICAgICBpZiAoICRCcm93c2VyTGFuZyA9fiAvXigkTGFuZ3VhZ2V8JExhbmd1YWdlT3RoZXJUeXBlKS9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyTGFuZ3VhZ2V9ID0gJExhbmd1YWdlOwogICAgICAgICAgICAgICAgbGFzdCBMQU5HVUFHRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1VzZXJMYW5ndWFnZX0gfHw9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKSB8fCAnZW4nOwogICAgfQoKICAgICMgY3JlYXRlIGxhbmd1YWdlIG9iamVjdAogICAgaWYgKCAhJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0gPSBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoCiAgICAgICAgICAgIFVzZXJUaW1lWm9uZSA9PiAkU2VsZi0+e1VzZXJUaW1lWm9uZX0sCiAgICAgICAgICAgIFVzZXJMYW5ndWFnZSA9PiAkU2VsZi0+e1VzZXJMYW5ndWFnZX0sCiAgICAgICAgICAgIExvZ09iamVjdCAgICA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgIEVuY29kZU9iamVjdCA9PiAkU2VsZi0+e0VuY29kZU9iamVjdH0sCiAgICAgICAgICAgIE1haW5PYmplY3QgICA9PiAkU2VsZi0+e01haW5PYmplY3R9LAogICAgICAgICAgICBBY3Rpb24gICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgY2hhcnNldCBpZiB0aGVyZSBpcyBubyBjaGFyc2V0IGdpdmVuCiAgICAkU2VsZi0+e1VzZXJDaGFyc2V0fSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXRSZWNvbW1lbmRlZENoYXJzZXQoKTsKICAgICRTZWxmLT57Q2hhcnNldH0gICAgID0gJFNlbGYtPntVc2VyQ2hhcnNldH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMganVzdCBmb3IgY29tcGF0LgogICAgJFNlbGYtPntTZXNzaW9uSUR9ICAgPSAkUGFyYW17U2Vzc2lvbklEfSB8fCAnJzsKICAgICRTZWxmLT57U2Vzc2lvbk5hbWV9ID0gJFBhcmFte1Nlc3Npb25OYW1lfSB8fCAnU2Vzc2lvbklEJzsKICAgICRTZWxmLT57Q0dJSGFuZGxlfSAgID0gJEVOVntTQ1JJUFRfTkFNRX0gfHwgJ05vLSRFTlZ7IlNDUklQVF9OQU1FIn0nOwoKICAgICMgYmFzZWxpbmsKICAgICRTZWxmLT57QmFzZWxpbmt9ID0gJFNlbGYtPntDR0lIYW5kbGV9IC4gJz8nOwogICAgJFNlbGYtPntUaW1lfSAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+VGltZSgKICAgICAgICBBY3Rpb24gPT4gJ0dFVCcsCiAgICAgICAgRm9ybWF0ID0+ICdEYXRlRm9ybWF0JywKICAgICk7CiAgICAkU2VsZi0+e1RpbWVMb25nfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnR0VUJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVGb3JtYXRMb25nJywKICAgICk7CgogICAgIyBzZXQgdGV4dCBkaXJlY3Rpb24KICAgICRTZWxmLT57VGV4dERpcmVjdGlvbn0gPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+e1RleHREaXJlY3Rpb259OwoKICAgICMgY2hlY2sgRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyRWxlbWVudFByZQogICAgJFNlbGYtPntGaWx0ZXJFbGVtZW50UHJlfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UHJlJyk7CgogICAgIyBjaGVjayBGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJFbGVtZW50UG9zdAogICAgJFNlbGYtPntGaWx0ZXJFbGVtZW50UG9zdH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyRWxlbWVudFBvc3QnKTsKCiAgICAjIGNoZWNrIEZyb250ZW5kOjpPdXRwdXQ6OkZpbHRlckNvbnRlbnQKICAgICRTZWxmLT57RmlsdGVyQ29udGVudH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyQ29udGVudCcpOwoKICAgICMgY2hlY2sgRnJvbnRlbmQ6Ok91dHB1dDo6RmlsdGVyVGV4dAogICAgJFNlbGYtPntGaWx0ZXJUZXh0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6T3V0cHV0OjpGaWx0ZXJUZXh0Jyk7CgogICAgIyBjaGVjayBicm93c2VyIChkZWZhdXQgaXMgSUUgYmVjYXVzZSBJIGRvbid0IGhhdmUgSUUpCiAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ1Vua25vd24nOwoKICAgICRTZWxmLT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fSA9IDE7CiAgICAkU2VsZi0+e0Jyb3dzZXJSaWNoVGV4dH0gICAgICAgICAgPSAxOwoKICAgIG15ICRIdHRwVXNlckFnZW50ID0gbGMgJEVOVntIVFRQX1VTRVJfQUdFTlR9OwogICAgaWYgKCAhJEh0dHBVc2VyQWdlbnQgKSB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdVbmtub3duIC0gbm8gJEVOVnsiSFRUUF9VU0VSX0FHRU5UIn0nOwogICAgfQogICAgZWxzaWYgKCRIdHRwVXNlckFnZW50KSB7CgogICAgICAgICMgbXNpZQogICAgICAgIGlmICgKICAgICAgICAgICAgJEh0dHBVc2VyQWdlbnQgPX4gL21zaWVccyhbMC05Ll0rKS8KICAgICAgICAgICAgfHwgJEh0dHBVc2VyQWdlbnQgPX4gL2ludGVybmV0XHNleHBsb3JlclwvKFswLTkuXSspLwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ01TSUUnOwoKICAgICAgICAgICAgIyBGb3IgSUUgNS41IC0gOC4wLCB3ZSBicmVhayB0aGUgaGVhZGVyIGluIGEgc3BlY2lhbCB3YXkgdGhhdCBtYWtlcwogICAgICAgICAgICAjIHRoaW5ncyB3b3JrLiBJIGRvbid0IHJlYWxseSB3YW50IHRvIGtub3cuCiAgICAgICAgICAgIGlmICggJDEgPX4gLyhcZClcLihcZCkvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWFqb3JWZXJzaW9ufSA9ICQxOwogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyTWlub3JWZXJzaW9ufSA9ICQyOwogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICQxID09IDUKICAgICAgICAgICAgICAgICAgICAmJiAkMiA9PSA1CiAgICAgICAgICAgICAgICAgICAgfHwgJDEgPT0gNiAmJiAkMiA9PSAwCiAgICAgICAgICAgICAgICAgICAgfHwgJDEgPT0gNyAmJiAkMiA9PSAwCiAgICAgICAgICAgICAgICAgICAgfHwgJDEgPT0gOCAmJiAkMiA9PSAwCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3NlckJyZWFrRGlzcG9zaXRpb25IZWFkZXJ9ID0gMTsKICAgICAgICAgICAgICAgIH0KCiMKIyBJbiBJRSB1cCB0byB2ZXJzaW9uIDgsIHRoZXJlIGlzIGEgdGVjaG5pY2FsIGxpbWl0YXRpb24gZm9yIDwgMzIKIyAgIENTUyBmaWxlIGxpbmtzLiBTdWJzZXF1ZW50IGxpbmtzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlCiMgICB0aGUgbG9hZGVyIG11c3QgYmUgYWN0aXZhdGVkIGZvciBkZWxpdmVyaW5nIENTUyB0byB0aGlzIGJyb3dzZXIuCiMgICBUaGUgbG9hZGVyIHdpbGwgY29uY2F0ZW5hdGUgYW5kIG1pbmlmeSB0aGUgZmlsZXMsIHJlc3VsdGluZyBpbgojICAgdmVyeSBmZXcgQ1NTIGZpbGUgbGlua3MuCiMgICBTZWUgYWxzbyBodHRwOi8vc29jaWFsLm1zZG4ubWljcm9zb2Z0LmNvbS9Gb3J1bXMvZW4tVVMvaWV3ZWJkZXZlbG9wbWVudC90aHJlYWQvYWQxYjZlODgtYmJmYS00Y2M0LTllOTUtMzg4OWI4MmE3YzFkLgojCiAgICAgICAgICAgICAgICBpZiAoICQxIDw9IDggKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdMb2FkZXI6OkVuYWJsZWQ6OkNTUycsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzYWZhcmkKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9zYWZhcmkvICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ1NhZmFyaSc7CgogICAgICAgICAgICAjIG9uIGlwaG9uZSBkaXNhYmxlIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICAgICAgaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvaXBob25lXHNvcy8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJSaWNoVGV4dH0gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9uIGlwYWQgZGlzYWJsZSByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL2lwYWQ7XHMvICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBvbiBhbmRyb2lkIGRpc2FibGUgcmljaCB0ZXh0IGVkaXRvcgogICAgICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9hbmRyb2lkLyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hyb21lCiAgICAgICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL2Nocm9tZS8gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0Nocm9tZSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMga29ucXVlcm9yCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAva29ucXVlcm9yLyApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyfSA9ICdLb25xdWVyb3InOwoKICAgICAgICAgICAgIyBvbiBrb25xdWVyZXIgZGlzYWJsZSByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlclJpY2hUZXh0fSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIG1vemlsbGEKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9ebW96aWxsYS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTW96aWxsYSc7CiAgICAgICAgfQoKICAgICAgICAjIG9wZXJhCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXm9wZXJhLiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ09wZXJhJzsKICAgICAgICB9CgogICAgICAgICMgbmV0c2NhcGUKICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9uZXRzY2FwZS8gKSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnTmV0c2NhcGUnOwogICAgICAgIH0KCiAgICAgICAgIyB3M20KICAgICAgICBlbHNpZiAoICRIdHRwVXNlckFnZW50ID1+IC9edzNtLiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ICAgICAgICAgICAgICAgICAgPSAndzNtJzsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ID0gMDsKICAgICAgICB9CgogICAgICAgICMgbHlueAogICAgICAgIGVsc2lmICggJEh0dHBVc2VyQWdlbnQgPX4gL15seW54LiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ICAgICAgICAgICAgICAgICAgPSAnTHlueCc7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3NlckphdmFTY3JpcHRTdXBwb3J0fSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGxpbmtzCiAgICAgICAgZWxzaWYgKCAkSHR0cFVzZXJBZ2VudCA9fiAvXmxpbmtzLiovICkgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJ9ID0gJ0xpbmtzJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57QnJvd3Nlcn0gPSAnVW5rbm93biAtICcgLiAkSHR0cFVzZXJBZ2VudDsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgY2FuIGJlIGFjdGl2ZQogICAgaWYgKCAhJFNlbGYtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9IHx8ICEkU2VsZi0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIEtleSAgID0+ICdGcm9udGVuZDo6UmljaFRleHQnLAogICAgICAgICAgICBWYWx1ZSA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgIyBjaGVjayBpZiByaWNoIHRleHQgaXMgYWN0aXZlCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlJpY2hUZXh0JykgKSB7CiAgICAgICAgJFNlbGYtPntCcm93c2VyUmljaFRleHR9ID0gMDsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHNwZWxsIGNoZWNrIHNob3VsZCBiZSBhY3RpdmUKICAgIGlmICggJFNlbGYtPntCcm93c2VySmF2YVNjcmlwdFN1cHBvcnR9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTcGVsbENoZWNrZXInKSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6UmljaFRleHQnKSApIHsKICAgICAgICAgICAgJFNlbGYtPntCcm93c2VyU3BlbGxDaGVja2VySW5saW5lfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIHRoZW1lCiAgICBteSAkVGhlbWUgPSAkU2VsZi0+e1VzZXJUaGVtZX0gfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRUaGVtZScpIHx8ICdTdGFuZGFyZCc7CgogICAgIyBmb3JjZSBhIHRoZW1lIGJhc2VkIG9uIGhvc3QgbmFtZQogICAgbXkgJERlZmF1bHRUaGVtZUhvc3RCYXNlZCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0VGhlbWU6Okhvc3RCYXNlZCcpOwogICAgaWYgKCAkRGVmYXVsdFRoZW1lSG9zdEJhc2VkICYmICRFTlZ7SFRUUF9IT1NUfSApIHsKICAgICAgICBmb3IgbXkgJFJlZ0V4cCAoIHNvcnQga2V5cyAleyREZWZhdWx0VGhlbWVIb3N0QmFzZWR9ICkgewoKICAgICAgICAgICAgIyBkbyBub3QgdXNlIGVtcHR5IHJlZ2V4cCBvciB0aGVtZSBkaXJlY3RvcmllcwogICAgICAgICAgICBuZXh0IGlmICEkUmVnRXhwOwogICAgICAgICAgICBuZXh0IGlmICRSZWdFeHAgZXEgJyc7CiAgICAgICAgICAgIG5leHQgaWYgISREZWZhdWx0VGhlbWVIb3N0QmFzZWQtPnskUmVnRXhwfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgcmVnZXhwIGlzIG1hdGNoaW5nCiAgICAgICAgICAgIGlmICggJEVOVntIVFRQX0hPU1R9ID1+IC8kUmVnRXhwL2kgKSB7CiAgICAgICAgICAgICAgICAkVGhlbWUgPSAkRGVmYXVsdFRoZW1lSG9zdEJhc2VkLT57JFJlZ0V4cH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBsb2NhdGUgdGVtcGxhdGUgZmlsZXMKICAgICRTZWxmLT57VGVtcGxhdGVEaXJ9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBsYXRlRGlyJykgLiAnL0hUTUwvJyAuICRUaGVtZTsKCiAgICAjIEtJWENvcmUtY2FwZUlUCiAgICBteSAkVGhlbWVQYXRoICAgPSAkU2VsZi0+e1RlbXBsYXRlRGlyfTsKICAgIG15ICRIb21lRGlyICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkVGhlbWVLSVhEaXIgPSAnJzsKICAgICRUaGVtZVBhdGggPX4gcy8kSG9tZURpci8vZzsKCiAgICBmb3IgbXkgJFRoZW1lRGlyIChASU5DKSB7CiAgICAgICAgJFRoZW1lS0lYRGlyID0gJFRoZW1lRGlyIC4gJFRoZW1lUGF0aDsKICAgICAgICBsYXN0IGlmICggLWUgJFRoZW1lS0lYRGlyICkKICAgIH0KCiAgICAjaWYgKCAhLWUgJFNlbGYtPntUZW1wbGF0ZURpcn0gKSB7CiAgICBpZiAoICEtZSAoICRUaGVtZUtJWERpciB8fCAkU2VsZi0+e1RlbXBsYXRlRGlyfSApICkgewoKICAgICAgICAjIEVPIEtJWENvcmUtY2FwZUlUCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJObyBleGlzdGluZyB0ZW1wbGF0ZSBkaXJlY3RvcnkgZm91bmQgKCckU2VsZi0+e1RlbXBsYXRlRGlyfScpIS4KICAgICAgICAgICAgICAgIERlZmF1bHQgdGhlbWUgdXNlZCBpbnN0ZWFkLiAiLAogICAgICAgICk7CgogICAgICAgICMgU2V0IFRlbXBsYXRlRGlyIHRvICdTdGFuZGFyZCcgYXMgYSBmYWxsYmFjayBhbmQgY2hlY2sgaWYgaXQgZXhpc3RzLgogICAgICAgICRUaGVtZSA9ICdTdGFuZGFyZCc7CiAgICAgICAgJFNlbGYtPntUZW1wbGF0ZURpcn0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGVtcGxhdGVEaXInKSAuICcvSFRNTC8nIC4gJFRoZW1lOwogICAgICAgIGlmICggIS1lICRTZWxmLT57VGVtcGxhdGVEaXJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIk5vIGV4aXN0aW5nIHRlbXBsYXRlIGRpcmVjdG9yeSBmb3VuZCAoJyRTZWxmLT57VGVtcGxhdGVEaXJ9JykhIENoZWNrIHlvdXIgSG9tZSBpbiBLZXJuZWwvQ29uZmlnLnBtIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRGllKCk7CiAgICAgICAgfQoKICAgIH0KCiMgRlJBTUVXT1JLLTIuNTogZGVmaW5lICRFbnZ7IkltYWdlcyJ9IChvbmx5IGZvciBjb21wYXQgdGlsbCAyLjUsIHVzZSAkQ29uZmlneyJGcm9udGVuZDo6SW1hZ2VQYXRoIn0pCiAgICAkU2VsZi0+e0ltYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OkltYWdlUGF0aCcpOwoKICAgICMgbG9hZCBzdWIgbGF5b3V0IGZpbGVzCiAgICAjIEtJWENvcmUtY2FwZUlUCiAgICBteSAkTGF5b3V0UGF0aCAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUZW1wbGF0ZURpcicpIC4gJy9IVE1MLyc7CiAgICBteSAkSG9tZSAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJyk7CiAgICBteSAkTGF5b3V0UGF0aEtJWCA9ICRMYXlvdXRQYXRoOwogICAgJExheW91dFBhdGhLSVggPX4gcy8kSG9tZS8vZzsKICAgIG15ICVMYXlvdXRGaWxlcyA9ICgpOwoKICAgIGZvciBteSAkSU5DRGlyIChyZXZlcnNlIEBJTkMpIHsKICAgIAlteSAkTGF5b3V0RGlyID0gJElOQ0RpcjsgCiAgICAgICAgJExheW91dERpciA9fiBzJ1xzJ1xccydnOwogICAgICAgIG15ICREaXIgPSAiJExheW91dERpciRMYXlvdXRQYXRoS0lYIjsKICAgICAgICBpZiAoIC1lICIkRGlyIiApIHsKICAgICAgICAgICAgbXkgQEZpbGVzID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgICAgIERpcmVjdG9yeSA9PiAkRGlyLAogICAgICAgICAgICAgICAgRmlsdGVyICAgID0+ICdMYXlvdXQqLnBtJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRGaWxlIChARmlsZXMpIHsKICAgICAgICAgICAgICAgIGlmICggKCAkRmlsZSAhfiAvTGF5b3V0LnBtJC8gKSAmJiAhZXhpc3RzKCAkTGF5b3V0RmlsZXN7JEZpbGV9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpbGUgPX4gc3tcQS4qXC8oLis/KS5wbVx6fXskMX14bXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgiS2VybmVsOjpPdXRwdXQ6OkhUTUw6OiRGaWxlIikgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRMYXlvdXRGaWxlc3skRmlsZX0gPSAkRmlsZTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBJU0EsICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6JEZpbGUiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICBteSAkRGlyID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBsYXRlRGlyJykgLiAnL0hUTUwnOwogICAgaWYgKCAtZSAkRGlyICkgewogICAgICAgIG15IEBGaWxlcyA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkRpcmVjdG9yeVJlYWQoCiAgICAgICAgICAgIERpcmVjdG9yeSA9PiAkRGlyLAogICAgICAgICAgICBGaWx0ZXIgICAgPT4gJ0xheW91dCoucG0nLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRGaWxlIChARmlsZXMpIHsKCiAgICAgICAgICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICAgICAgICAgI2lmICggJEZpbGUgIX4gL0xheW91dC5wbSQvICkgewogICAgICAgICAgICBpZiAoICggJEZpbGUgIX4gL0xheW91dC5wbSQvICkgJiYgIWV4aXN0cyggJExheW91dEZpbGVzeyRGaWxlfSApICkgewoKICAgICAgICAgICAgICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICAgICAgICAgICAgICAkRmlsZSA9fiBze1xBLipcLyguKz8pLnBtXHp9eyQxfXhtczsKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoIktlcm5lbDo6T3V0cHV0OjpIVE1MOjokRmlsZSIpICkgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBLSVhDb3JlLWNhcGVJVAogICAgICAgICAgICAgICAgJExheW91dEZpbGVzeyRGaWxlfSA9ICRGaWxlOwoKICAgICAgICAgICAgICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICAgICAgICAgICAgICBwdXNoIEBJU0EsICJLZXJuZWw6Ok91dHB1dDo6SFRNTDo6JEZpbGUiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFNldEVudiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGZvciAocXcoS2V5IFZhbHVlKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgIH0KICAgICRTZWxmLT57RW52TmV3UmVmfS0+eyAkUGFyYW17S2V5fSB9ID0gJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBCbG9jaygpCgp1c2UgYSBkdGwgYmxvY2sKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdSb3cnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBUaW1lICAgICA9PiAkUm93WzBdLAogICAgICAgICAgICBQcmlvcml0eSA9PiAkUm93WzFdLAogICAgICAgICAgICBGYWNpbGl0eSA9PiAkUm93WzJdLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUm93WzNdLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEJsb2NrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIE5hbWUhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHB1c2ggQHsgJFNlbGYtPntCbG9ja0RhdGF9IH0sIHsgTmFtZSA9PiAkUGFyYW17TmFtZX0sIERhdGEgPT4gJFBhcmFte0RhdGF9IH07Cn0KCj1pdGVtIE91dHB1dCgpCgpnZW5lcmF0ZXMgSFRNTCBvdXRwdXQgYmFzZWQgb24gYSB0ZW1wbGF0ZSBmaWxlLgoKVXNpbmcgYSB0ZW1wbGF0ZSBmaWxlOgoKICAgIG15ICRIVE1MID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5Mb2cnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKClVzaW5nIGEgdGVtcGxhdGUgc3RyaW5nOgoKICAgIG15ICRIVE1MID0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlICAgICA9PiAnPGI+JFFEYXRheyJTb21lS2V5In08L2I+JywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7CgpBZGRpdGlvbmFsIHBhcmFtZXRlcnM6CgpLZWVwU2NyaXB0VGFncyAtIHRoaXMgY2F1c2VzIDwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPiBibG9ja3MgTk9UCnRvIGJlIHJlcGxhY2VkLiBUaGlzIGlzIGltcG9ydGFudCB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIHNuaXBwZXRzIHdoaWNoIGNhbiBiZSBjYWNoZWQuCgogICAgbXkgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlICAgPT4gJ0FkbWluTG9nJywKICAgICAgICBEYXRhICAgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgIEtlZXBTY3JpcHRUYWdzID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFuZCBjaGVjayBwYXJhbSBEYXRhCiAgICBpZiAoICRQYXJhbXtEYXRhfSApIHsKICAgICAgICBpZiAoIHJlZiAkUGFyYW17RGF0YX0gbmUgJ0hBU0gnICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBIYXNoUmVmIGluIFBhcmFtIERhdGEhIEdvdDogJyIgLiByZWYoICRQYXJhbXtEYXRhfSApIC4gIichIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17RGF0YX0gPSB7fTsKICAgIH0KCiAgICAjIGZpbGwgaW5pdCBFbnYKICAgIGlmICggISRTZWxmLT57RW52UmVmfSApIHsKICAgICAgICAleyAkU2VsZi0+e0VudlJlZn0gfSA9ICVFTlY7CgogICAgICAgICMgYWxsICRTZWxmLT57Kn0KICAgICAgICBmb3IgKCBrZXlzICV7JFNlbGZ9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFNlbGYtPnskX30gJiYgIXJlZiAkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57RW52UmVmfS0+eyRffSA9ICRTZWxmLT57JF99OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIG5ldyBlbnYKICAgIGlmICggJFNlbGYtPntFbnZOZXdSZWZ9ICkgewogICAgICAgIGZvciAoICV7ICRTZWxmLT57RW52TmV3UmVmfSB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0VudlJlZn0tPnskX30gPSAkU2VsZi0+e0Vudk5ld1JlZn0tPnskX307CiAgICAgICAgfQogICAgICAgIHVuZGVmICRTZWxmLT57RW52TmV3UmVmfTsKICAgIH0KCiAgICAjIHJlYWQgdGVtcGxhdGUgZnJvbSBmaWxlc3lzdGVtCiAgICBteSAkVGVtcGxhdGVTdHJpbmcgPSAnJzsKICAgIGlmICggJFBhcmFte1RlbXBsYXRlRmlsZX0gKSB7CiAgICAgICAgbXkgJEZpbGUgPSAnJzsKCiAgICAgICAgIyBLSVhDb3JlLWNhcGVJVAogICAgICAgICMgVE9ETyA6OiBJUyBUSElTIFJFQUxZIE5FRURFRCBBTllNT1JFPwogICAgICAgICNpZiAoIC1mICIkU2VsZi0+e1RlbXBsYXRlRGlyfS8kUGFyYW17VGVtcGxhdGVGaWxlfS5kdGwiICkgewogICAgICAgICMgICAgJEZpbGUgPSAiJFNlbGYtPntUZW1wbGF0ZURpcn0vJFBhcmFte1RlbXBsYXRlRmlsZX0uZHRsIjsKICAgICAgICAjfQogICAgICAgICNlbHNlIHsKICAgICAgICAjICAgICRGaWxlID0gIiRTZWxmLT57VGVtcGxhdGVEaXJ9Ly4uL1N0YW5kYXJkLyRQYXJhbXtUZW1wbGF0ZUZpbGV9LmR0bCI7CiAgICAgICAgI30KCiAgICAgICAgIyByZWFkIGRpciBhbmQgZmlsZSBmcm9tIGZpbGVzeXN0ZW0KICAgICAgICBteSBAVGhlbWVQYXRocyA9ICgKICAgICAgICAgICAgJFNlbGYtPntVc2VyVGhlbWV9LAogICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFRoZW1lJyksCiAgICAgICAgICAgICdTdGFuZGFyZCcKICAgICAgICApOwogICAgICAgIG15ICRIb21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgICAgICBteSAkVXNlclRoZW1lID0KICAgICAgICAgICAgJFNlbGYtPntVc2VyVGhlbWV9CiAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0VGhlbWUnKQogICAgICAgICAgICB8fCAnU3RhbmRhcmQnOwogICAgICAgIG15ICRUZW1wbGF0ZVBhdGggPSAkU2VsZi0+e1RlbXBsYXRlRGlyfTsKICAgICAgICAkVGVtcGxhdGVQYXRoID1+IHMvJEhvbWUvL2c7CiAgICAgICAgJFRlbXBsYXRlUGF0aCA9fiBzL1wvJFVzZXJUaGVtZS8vZzsKCiAgICAgICAgbXkgJEZvdW5kID0gMDsKICAgIAogICAgICAgICMgbG9vayBmb3IgZHRsIGluIGluY2x1ZGUgaGllcmFyY2h5CiAgICAgICAgZm9yIG15ICRUaGVtZSAoQFRoZW1lUGF0aHMpIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFRoZW1lOwogICAgICAgICAgICBmb3JlYWNoIG15ICRUbXBEaXIgKEBJTkMpIHsKCiAgICAgICAgICAgICAgICAjIFRPRE86IHN0cmluZyBjb21wYXJpc29uIG1pZ2h0IG5vdCB3b3JrIHdpdGggcGF0aHMgbGlrZSAiQzpcUFJPR1J+MVxPVFJTIgogICAgICAgICAgICAgICAgIyB1bmNvbW1lbnRlZCBkdWUgdG8gVCMyMDEwMDczMDkwMDAwMjE2CiAgICAgICAgICAgICAgICAjbmV4dCBpZiAoICRUbXBEaXIgIX4gLyRIb21lLyApOwogICAgICAgICAgICAgICAgaWYgKCAtZiAiJFRtcERpci8kVGVtcGxhdGVQYXRoLyRUaGVtZS8kUGFyYW17VGVtcGxhdGVGaWxlfS5kdGwiICkgewogICAgICAgICAgICAgICAgICAgICRGaWxlICA9ICIkVG1wRGlyLyRUZW1wbGF0ZVBhdGgvJFRoZW1lLyRQYXJhbXtUZW1wbGF0ZUZpbGV9LmR0bCI7CiAgICAgICAgICAgICAgICAgICAgJEZvdW5kID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3QgaWYgJEZvdW5kOwogICAgICAgIH0KICAgICAgICAjIEVPIEtJWENvcmUtQ2FwZUlUCgogICAgICAgIGlmICggb3BlbiBteSAkVEVNUExBVEVJTiwgJzwnLCAkRmlsZSApIHsKICAgICAgICAgICAgJFRlbXBsYXRlU3RyaW5nID0gZG8geyBsb2NhbCAkLzsgPCRURU1QTEFURUlOPiB9OwogICAgICAgICAgICBjbG9zZSAkVEVNUExBVEVJTjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZWFkICRGaWxlOiAkISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGFrZSB0ZW1wbGF0ZXMgZnJvbSBzdHJpbmcvYXJyYXkKICAgIGVsc2lmICggZGVmaW5lZCAkUGFyYW17VGVtcGxhdGV9ICYmIHJlZiAkUGFyYW17VGVtcGxhdGV9IGVxICdBUlJBWScgKSB7CiAgICAgICAgZm9yICggQHsgJFBhcmFte1RlbXBsYXRlfSB9ICkgewogICAgICAgICAgICAkVGVtcGxhdGVTdHJpbmcgLj0gJF87CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtUZW1wbGF0ZX0gKSB7CiAgICAgICAgJFRlbXBsYXRlU3RyaW5nID0gJFBhcmFte1RlbXBsYXRlfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUZW1wbGF0ZSBvciBUZW1wbGF0ZUZpbGUgUGFyYW0hJywKICAgICAgICApOwogICAgICAgICRTZWxmLT5GYXRhbEVycm9yKCk7CiAgICB9CgogICAgIyBjdXN0b20gcHJlIGZpbHRlcnMKICAgIGlmICggJFNlbGYtPntGaWx0ZXJFbGVtZW50UHJlfSApIHsKICAgICAgICBteSAlRmlsdGVycyA9ICV7ICRTZWxmLT57RmlsdGVyRWxlbWVudFByZX0gfTsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVycyApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEZpbHRlcnN7JEZpbHRlcn0tPntNb2R1bGV9ICk7CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkRmlsdGVyc3skRmlsdGVyfS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgTGF5b3V0T2JqZWN0ID0+ICRTZWxmLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICV7ICRGaWx0ZXJzeyRGaWx0ZXJ9IH0sCiAgICAgICAgICAgICAgICBEYXRhID0+IFwkVGVtcGxhdGVTdHJpbmcsCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJFBhcmFte1RlbXBsYXRlRmlsZX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZmlsdGVyaW5nIG9mIGNvbW1lbnQgbGluZXMKICAgICRUZW1wbGF0ZVN0cmluZyA9fiBzL14jLipcbi8vZ207CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT5fT3V0cHV0KAogICAgICAgIFRlbXBsYXRlICAgICA9PiAkVGVtcGxhdGVTdHJpbmcsCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtEYXRhfSwKICAgICAgICBCbG9ja1JlcGxhY2UgPT4gMSwKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJFBhcmFte1RlbXBsYXRlRmlsZX0gfHwgJycsCiAgICApOwoKICAgICMgZG8gdGltZSB0cmFuc2xhdGlvbiAod2l0aCBzZWNvbmRzKQogICAgJE91dHB1dCA9fiBzewogICAgICAgIFwkVGltZUxvbmd7IiguKj8pIn0KICAgIH0KICAgIHsKICAgICAgICAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+Rm9ybWF0VGltZVN0cmluZygkMSk7CiAgICB9ZWd4OwoKICAgICMgZG8gdGltZSB0cmFuc2xhdGlvbiAod2l0aG91dCBzZWNvbmRzKQogICAgJE91dHB1dCA9fiBzewogICAgICAgIFwkVGltZVNob3J0eyIoLio/KSJ9CiAgICB9CiAgICB7CiAgICAgICAgJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkZvcm1hdFRpbWVTdHJpbmcoJDEsIHVuZGVmLCAnTm9TZWNvbmRzJyk7CiAgICB9ZWd4OwoKICAgICMgZG8gZGF0ZSB0cmFuc2xhdGlvbgogICAgJE91dHB1dCA9fiBzewogICAgICAgIFwkRGF0ZXsiKC4qPykifQogICAgfQogICAgewogICAgICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5Gb3JtYXRUaW1lU3RyaW5nKCQxLCAnRGF0ZUZvcm1hdFNob3J0Jyk7CiAgICB9ZWd4OwoKICAgICMgZG8gdHJhbnNsYXRpb24KICAgICRPdXRwdXQgPX4gc3sKICAgICAgICBcJFRleHR7IiguKj8pIn0KICAgIH0KICAgIHsKICAgICAgICAkU2VsZi0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCQxKSwKICAgICAgICApOwogICAgfWVneDsKCiAgICAkT3V0cHV0ID1+IHN7CiAgICAgICAgXCRKU1RleHR7IiguKj8pIn0KICAgIH0KICAgIHsKICAgICAgICAkU2VsZi0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCQxKSwKICAgICAgICAgICAgVHlwZSA9PiAnSlNUZXh0JywKICAgICAgICApOwogICAgfWVneDsKCiAgICAjIGRvIGh0bWwgcXVvdGUKICAgICRPdXRwdXQgPX4gc3sKICAgICAgICBcJFF1b3RleyIoLio/KSJ9CiAgICB9CiAgICB7CiAgICAgICAgbXkgJFRleHQgPSAkMTsKICAgICAgICBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0ID1+IC9eIixccyoiKC4rKSQvICkgewogICAgICAgICAgICAnJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCRUZXh0ID1+IC9eKC4rPykiLFxzKiIoLispJC8pIHsKICAgICAgICAgICAgJFNlbGYtPkFzY2lpMkh0bWwoVGV4dCA9PiAkMSwgTWF4ID0+ICQyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5Bc2NpaTJIdG1sKFRleHQgPT4gJFRleHQpOwogICAgICAgIH0KICAgIH1lZ3g7CgogICAgIyByZXdyaXRlIGZvcm1zLCBhZGQgY2hhbGxlbmdlIHRva2VuIDogPGZvcm0gYWN0aW9uPSJpbmRleC5wbCIgbWV0aG9kPSJnZXQiPgogICAgaWYgKCAkU2VsZi0+e1Nlc3Npb25JRH0gJiYgJFNlbGYtPntVc2VyQ2hhbGxlbmdlVG9rZW59ICkgewogICAgICAgIG15ICRVc2VyQ2hhbGxlbmdlVG9rZW4gPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkU2VsZi0+e1VzZXJDaGFsbGVuZ2VUb2tlbn0gKTsKICAgICAgICAkT3V0cHV0ID1+IHN7CiAgICAgICAgICAgICg8Zm9ybS4rP2FjdGlvbj0iLis/Ii4rPz4pCiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEZvcm0gPSAkMTsKICAgICAgICAgICAgaWYgKCBsYyAkRm9ybSA9fiBte15odHRwIHM/IDp9c214ICkgewogICAgICAgICAgICAgICAgJEZvcm07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRm9ybSAuICI8aW5wdXQgdHlwZT1cImhpZGRlblwiIG5hbWU9XCJDaGFsbGVuZ2VUb2tlblwiIHZhbHVlPVwiJFVzZXJDaGFsbGVuZ2VUb2tlblwiLz4iOwogICAgICAgICAgICB9CiAgICAgICAgfWllZ3g7CiAgICB9CgogICAgIyBDaGVjayBpZiB0aGUgYnJvd3NlciBzZW5kcyB0aGUgc2Vzc2lvbiBpZCBjb29raWUhCiAgICAjIElmIG5vdCwgYWRkIHRoZSBzZXNzaW9uIGlkIHRvIHRoZSBsaW5rcyBhbmQgZm9ybXMhCiAgICBpZiAoICRTZWxmLT57U2Vzc2lvbklEfSAmJiAhJFNlbGYtPntTZXNzaW9uSURDb29raWV9ICkgewoKICAgICAgICAjIHJld3JpdGUgYSBocmVmcwogICAgICAgICRPdXRwdXQgPX4gc3sKICAgICAgICAgICAgKDxhLis/aHJlZj0iKSguKz8pKFwjLis/fCkoIi4rPz4pCiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFIcmVmICAgPSAkMTsKICAgICAgICAgICAgbXkgJFRhcmdldCAgPSAkMjsKICAgICAgICAgICAgbXkgJEVuZCAgICAgPSAkMzsKICAgICAgICAgICAgbXkgJFJlYWxFbmQgPSAkNDsKICAgICAgICAgICAgaWYgKCBsYyAkVGFyZ2V0ID1+IC9eKGh0dHA6fGh0dHBzOnwjfGZ0cDopLyB8fAogICAgICAgICAgICAgICAgJFRhcmdldCAhfiAvXC4ocGx8cGhwfGNnaXxmY2d8ZmNnaXxmcGwpKFw/fCQpLyB8fAogICAgICAgICAgICAgICAgJFRhcmdldCA9fiAvKFw/fCYpXFEkU2VsZi0+e1Nlc3Npb25OYW1lfVxFPS8pIHsKICAgICAgICAgICAgICAgICRBSHJlZi4kVGFyZ2V0LiRFbmQuJFJlYWxFbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQUhyZWYuJFRhcmdldC4nOycuJFNlbGYtPntTZXNzaW9uTmFtZX0uJz0nLiRTZWxmLT57U2Vzc2lvbklEfS4kRW5kLiRSZWFsRW5kOwogICAgICAgICAgICB9CiAgICAgICAgfWllZ3hzOwoKICAgICAgICAjIHJld3JpdGUgaW1nIGFuZCBpZnJhbWUgc3JjCiAgICAgICAgJE91dHB1dCA9fiBzewogICAgICAgICAgICAoPCg/OmltZ3xpZnJhbWUpLis/c3JjPSIpKC4rPykoIi4rPz4pCiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFIcmVmID0gJDE7CiAgICAgICAgICAgIG15ICRUYXJnZXQgPSAkMjsKICAgICAgICAgICAgbXkgJEVuZCA9ICQzOwogICAgICAgICAgICBpZiAobGMgJFRhcmdldCA9fiBte15odHRwIHM/IDp9c214IHx8ICEkU2VsZi0+e1Nlc3Npb25JRH0gfHwKICAgICAgICAgICAgICAgICRUYXJnZXQgIX4gL1wuKHBsfHBocHxjZ2l8ZmNnfGZjZ2l8ZnBsKShcP3wkKS8gfHwKICAgICAgICAgICAgICAgICRUYXJnZXQgPX4gL1xRJFNlbGYtPntTZXNzaW9uTmFtZX1cRS8pIHsKICAgICAgICAgICAgICAgICRBSHJlZi4kVGFyZ2V0LiRFbmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQUhyZWYuJFRhcmdldC4nJicuJFNlbGYtPntTZXNzaW9uTmFtZX0uJz0nLiRTZWxmLT57U2Vzc2lvbklEfS4kRW5kOwogICAgICAgICAgICB9CiAgICAgICAgfWllZ3hzOwoKICAgICAgICAjIHJld3JpdGUgZm9ybXM6IDxmb3JtIGFjdGlvbj0iaW5kZXgucGwiIG1ldGhvZD0iZ2V0Ij4KICAgICAgICBteSAkU2Vzc2lvbklEID0gJFNlbGYtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFNlbGYtPntTZXNzaW9uSUR9ICk7CiAgICAgICAgJE91dHB1dCA9fiBzewogICAgICAgICAgICAoPGZvcm0uKz9hY3Rpb249Ii4rPyIuKz8+KQogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgIG15ICRGb3JtID0gJDE7CiAgICAgICAgICAgIGlmICggbGMgJEZvcm0gPX4gbXteaHR0cCBzPyA6fXNteCApIHsKICAgICAgICAgICAgICAgICRGb3JtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEZvcm0gLiAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJFNlbGYtPntTZXNzaW9uTmFtZX1cIiB2YWx1ZT1cIiRTZXNzaW9uSURcIi8+IjsKICAgICAgICAgICAgfQogICAgICAgIH1pZWd4OwogICAgfQoKICAgICMgY3VzdG9tIHBvc3QgZmlsdGVycwogICAgaWYgKCAkU2VsZi0+e0ZpbHRlckVsZW1lbnRQb3N0fSApIHsKICAgICAgICBteSAlRmlsdGVycyA9ICV7ICRTZWxmLT57RmlsdGVyRWxlbWVudFBvc3R9IH07CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlcnMgKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRGaWx0ZXJzeyRGaWx0ZXJ9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEZpbHRlcnN7JEZpbHRlcn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAleyAkRmlsdGVyc3skRmlsdGVyfSB9LAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJE91dHB1dCwKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAkUGFyYW17VGVtcGxhdGVGaWxlfSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBDdXQgb3V0IGFsbCBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgdGFncy4gVGhlc2Ugd2lsbCBiZSBpbnNlcnRlZCB0byB0aGUKICAgICMgICBwbGFjZSB3aXRoIHRoZSBqc19vbl9kb2N1bWVudF9jb21wbGV0ZV9wbGFjZWhvbGRlciBpbiB0aGUgcGFnZSBmb290ZXIgaWYKICAgICMgICBpdCBpcyBwcmVzZW50LgogICAgIyBUaGlzIG11c3QgYmUgZG9uZSBhZnRlciB0aGUgcG9zdCBvdXRwdXQgZmlsdGVycywgc28gdGhhdCB0aGV5IGNhbiBhbHNvIGluamVjdAogICAgIyAgIGFuZCBtb2ZpeSBleGlzdGluZyBzY3JpcHQgdGFncy4KCiAgICBpZiAoICEkUGFyYW17S2VlcFNjcmlwdFRhZ3N9ICkgewoKICAgICAgICAjIGZpbmQgZG9jdW1lbnQgcmVhZHkKICAgICAgICAkT3V0cHV0ID1+IHN7CiAgICAgICAgICAgICAgICA8IS0tXHN7MCwxfWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZVxzezAsMX0tLT4oLis/KTwhLS1cc3swLDF9ZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlXHN7MCwxfS0tPgogICAgICAgIH0KICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoISRTZWxmLT57SlNPbkRvY3VtZW50Q29tcGxldGV9LT57JDF9KSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntKU09uRG9jdW1lbnRDb21wbGV0ZX0tPnskMX0gPSAxOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57RW52UmVmfS0+e0pTT25Eb2N1bWVudENvbXBsZXRlfSAuPSAkU2VsZi0+X1JlbW92ZVNjcmlwdFRhZ3MoQ29kZSA9PiAkMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAiIjsKICAgICAgICB9c2VneG07CgogICAgICAgICMgcmVwbGFjZSBkb2N1bWVudCByZWFkeSBwbGFjZWhvbGRlciAob25seSBpZiBpdCdzIG5vdCBpbmNsdWRlZCB2aWEgJEluY2x1ZGV7IiJ9KQogICAgICAgIGlmICggISRQYXJhbXtJbmNsdWRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCA9fiBzewogICAgICAgICAgICAgICAgPCEtLVxzezAsMX1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGVfcGxhY2Vob2xkZXJcc3swLDF9LS0+CiAgICAgICAgICAgIH0KICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0VudlJlZn0tPntKU09uRG9jdW1lbnRDb21wbGV0ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntFbnZSZWZ9LT57SlNPbkRvY3VtZW50Q29tcGxldGV9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIiI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH1zZWd4bTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCj1pdGVtIEpTT05FbmNvZGUoKQoKRW5jb2RlIHBlcmwgZGF0YSBzdHJ1Y3R1cmUgdG8gSlNPTiBzdHJpbmcKCiAgICBteSAkSlNPTiA9ICRMYXlvdXRPYmplY3QtPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSAgICAgICAgPT4gJERhdGEsCiAgICAgICAgTm9RdW90ZXMgICAgPT4gMHwxLCAjIG9wdGlvbmFsOiBubyBkb3VibGUgcXVvdGVzIGF0IHRoZSBzdGFydCBhbmQgdGhlIGVuZCBvZiBKU09OIHN0cmluZwogICAgKTsKCj1jdXQKCnN1YiBKU09ORW5jb2RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBmb3IgbmVlZGVkIGRhdGEKICAgIHJldHVybiBpZiAhJFBhcmFte0RhdGF9OwoKICAgICMgZ2V0IEpTT04gZW5jb2RlZCBkYXRhCiAgICBteSAkSlNPTiA9ICRTZWxmLT57SlNPTk9iamVjdH0tPkVuY29kZSgKICAgICAgICBEYXRhID0+ICRQYXJhbXtEYXRhfSwKICAgICkgfHwgJyIiJzsKCiAgICAjIHJlbW92ZSB0cmFpbGluZyBhbmQgdHJhaWxpbmcgZG91YmxlIHF1b3RlcyBpZiByZXF1ZXN0ZWQKICAgIGlmICggJFBhcmFte05vUXVvdGVzfSApIHsKICAgICAgICAkSlNPTiA9fiBzeyBcQSAiKC4qKSIgXHogfXskMX1zbXg7CiAgICB9CgogICAgcmV0dXJuICRKU09OOwp9Cgo9aXRlbSBSZWRpcmVjdCgpCgpyZXR1cm4gaHRtbCBmb3IgYnJvd3NlciB0byByZWRpcmVjdAoKICAgIG15ICRIVE1MID0gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgT1AgPT4gIkFjdGlvbj1BZG1pblVzZXJHcm91cDtTdWJhY3Rpb249VXNlcjtJRD0kVXNlcklEIiwKICAgICk7CgogICAgbXkgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCgKICAgICAgICBFeHRVUkwgPT4gImh0dHA6Ly9zb21lLmV4YW1wbGUuY29tLyIsCiAgICApOwoKPWN1dAoKc3ViIFJlZGlyZWN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBhZGQgY29va2llcyBpZiBleGlzdHMKICAgIG15ICRDb29raWVzID0gJyc7CiAgICBpZiAoICRTZWxmLT57U2V0Q29va2llc30gJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKICAgICAgICBmb3IgKCBrZXlzICV7ICRTZWxmLT57U2V0Q29va2llc30gfSApIHsKICAgICAgICAgICAgJENvb2tpZXMgLj0gIlNldC1Db29raWU6ICRTZWxmLT57U2V0Q29va2llc30tPnskX31cbiI7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgaWYgKCAkUGFyYW17RXh0VVJMfSApIHsKCiAgICAgICAgIyBleHRlcm5hbCByZWRpcmVjdAogICAgICAgICRQYXJhbXtSZWRpcmVjdH0gPSAkUGFyYW17RXh0VVJMfTsKICAgICAgICByZXR1cm4gJENvb2tpZXMgLiAkU2VsZi0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ1JlZGlyZWN0JywgRGF0YSA9PiBcJVBhcmFtICk7CiAgICB9CgogICAgIyBzZXQgYmFzZWxpbmsKICAgICRQYXJhbXtSZWRpcmVjdH0gPSAkU2VsZi0+e0Jhc2VsaW5rfTsKCiAgICBpZiAoICRQYXJhbXtPUH0gKSB7CgogICAgICAgICMgRmlsdGVyIG91dCBoYXphcmRvdXMgY2hhcmFjdGVycwogICAgICAgIGlmICggJFBhcmFte09QfSA9fiBze1x4MDB9e31zbXhnICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBudWxsIGJ5dGVzIChceDAwKSBjaGFyYWN0ZXIgaW4gcmVkaXJlY3QhJywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIGlmICggJFBhcmFte09QfSA9fiBze1xyfXt9c214ZyApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NvbWVvbmUgdHJpZXMgdG8gdXNlIGEgY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkUGFyYW17T1B9ID1+IHN7XG59e31zbXhnICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnU29tZW9uZSB0cmllcyB0byB1c2UgYSBuZXdsaW5lIGNoYXJhY3RlciBpbiByZWRpcmVjdCEnLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpbnRlcm5hbCByZWRpcmVjdAogICAgICAgICRQYXJhbXtPUH0gPX4gcy9eLipcPyguKz8pJC8kMS87CiAgICAgICAgJFBhcmFte1JlZGlyZWN0fSAuPSAkUGFyYW17T1B9OwogICAgfQoKICAgICMgY2hlY2sgaWYgSUlTIGlzIHVzZWQsIGFkZCBhYnNvbHV0ZSB1cmwgZm9yIElJUyB3b3JrYXJvdW5kCiAgICAjIHNlZSBhbHNvOgogICAgIyAgbyBodHRwOi8vYnVncy5vdHJzLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjIzMAogICAgIyAgbyBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2RlZmF1bHQuYXNweD9zY2lkPWtiO2VuLXVzOzIyMTE1NAogICAgaWYgKCAkRU5We1NFUlZFUl9TT0ZUV0FSRX0gPX4gL15taWNyb3NvZnRcLWlpcy9pICkgewogICAgICAgIG15ICRIb3N0ID0gJEVOVntIVFRQX0hPU1R9IHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGUUROJyk7CiAgICAgICAgbXkgJEh0dHBUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJyk7CiAgICAgICAgJFBhcmFte1JlZGlyZWN0fSA9ICRIdHRwVHlwZSAuICc6Ly8nIC4gJEhvc3QgLiAnLycgLiAkUGFyYW17UmVkaXJlY3R9OwogICAgfQogICAgbXkgJE91dHB1dCA9ICRDb29raWVzIC4gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdSZWRpcmVjdCcsIERhdGEgPT4gXCVQYXJhbSApOwoKICAgICMgYWRkIHNlc3Npb24gaWQgdG8gcmVkaXJlY3QgaWYgbm8gY29va2llIGlzIGVuYWJsZWQKICAgIGlmICggISRTZWxmLT57U2Vzc2lvbklEQ29va2llfSApIHsKCiAgICAgICAgIyByZXdyaXRlIGxvY2F0aW9uIGhlYWRlcgogICAgICAgICRPdXRwdXQgPX4gc3sKICAgICAgICAgICAgKGxvY2F0aW9uOlxzKSguKikKICAgICAgICB9CiAgICAgICAgewogICAgICAgICAgICBteSAkU3RhcnQgID0gJDE7CiAgICAgICAgICAgIG15ICRUYXJnZXQgPSAkMjsKICAgICAgICAgICAgbXkgJEVuZCA9ICcnOwogICAgICAgICAgICBpZiAoJFRhcmdldCA9fiAvXiguKz8pIyh8Lis/KSQvKSB7CiAgICAgICAgICAgICAgICAkVGFyZ2V0ID0gJDE7CiAgICAgICAgICAgICAgICAkRW5kID0gIiMkMiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRUYXJnZXQgPX4gL2h0dHAvaSB8fCAhJFNlbGYtPntTZXNzaW9uSUR9KSB7CiAgICAgICAgICAgICAgICAiJFN0YXJ0JFRhcmdldCRFbmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCRUYXJnZXQgPX4gLyhcP3wmKSQvKSB7CiAgICAgICAgICAgICAgICAgICAgIiRTdGFydCRUYXJnZXQkU2VsZi0+e1Nlc3Npb25OYW1lfT0kU2VsZi0+e1Nlc3Npb25JRH0kRW5kIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkVGFyZ2V0ICF+IC9cPy8pIHsKICAgICAgICAgICAgICAgICAgICAiJFN0YXJ0JFRhcmdldD8kU2VsZi0+e1Nlc3Npb25OYW1lfT0kU2VsZi0+e1Nlc3Npb25JRH0kRW5kIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkVGFyZ2V0ID1+IC9cPy8pIHsKICAgICAgICAgICAgICAgICAgICAiJFN0YXJ0JFRhcmdldCYkU2VsZi0+e1Nlc3Npb25OYW1lfT0kU2VsZi0+e1Nlc3Npb25JRH0kRW5kIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICIkU3RhcnQkVGFyZ2V0PyYkU2VsZi0+e1Nlc3Npb25OYW1lfT0kU2VsZi0+e1Nlc3Npb25JRH0kRW5kIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH1pZWd4OwogICAgfQogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBMb2dpbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IEFjdGlvbiBwYXJhbWV0ZXIgZm9yIHRoZSBsb2FkZXIKICAgICRTZWxmLT57QWN0aW9ufSA9ICdMb2dpbic7CgogICAgIyBhZGQgY29va2llcyBpZiBleGlzdHMKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgIGlmICggJFNlbGYtPntTZXRDb29raWVzfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewogICAgICAgIGZvciAoIGtleXMgJXsgJFNlbGYtPntTZXRDb29raWVzfSB9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICJTZXQtQ29va2llOiAkU2VsZi0+e1NldENvb2tpZXN9LT57JF99XG4iOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBtZXNzYWdlIG9mIHRoZSBkYXkKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Nob3dNb3RkJykgKSB7CiAgICAgICAgJFBhcmFte01vdGR9ID0gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdNb3RkJywgRGF0YSA9PiBcJVBhcmFtICk7CiAgICB9CgogICAgIyBnZXQgbG9zdCBwYXNzd29yZCB5CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xvc3RQYXNzd29yZCcpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0F1dGhNb2R1bGUnKSBlcSAnS2VybmVsOjpTeXN0ZW06OkF1dGg6OkRCJwogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xvc3RQYXNzd29yZExpbmsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICMgR2VuZXJhdGUgdGhlIG1pbmlmaWVkIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSAoc2VlIExheW91dExvYWRlcikKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVBZ2VudENTU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQWdlbnRKU0NhbGxzKCk7CgogICAgIyBBZGQgaGVhZGVyIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQWdlbnRMb2dvJykgKSB7CiAgICAgICAgbXkgJUFnZW50TG9nbyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZ2VudExvZ28nKSB9OwogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBmb3IgbXkgJENTU1N0YXRlbWVudCAoIGtleXMgJUFnZW50TG9nbyApIHsKICAgICAgICAgICAgaWYgKCAkQ1NTU3RhdGVtZW50IGVxICdVUkwnICkgewogICAgICAgICAgICAgICAgbXkgJFdlYlBhdGggPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgICAgICRXZWJQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRBZ2VudExvZ297JENTU1N0YXRlbWVudH0gLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskQ1NTU3RhdGVtZW50fSA9ICRBZ2VudExvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgbG9naW4gbG9nbywgaWYgY29uZmlndXJlZAogICAgaWYgKCBkZWZpbmVkICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZ2VudExvZ2luTG9nbycpICkgewogICAgICAgIG15ICVBZ2VudExvZ2luTG9nbyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZ2VudExvZ2luTG9nbycpIH07CiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICgga2V5cyAlQWdlbnRMb2dpbkxvZ28gKSB7CiAgICAgICAgICAgIGlmICggJENTU1N0YXRlbWVudCBlcSAnVVJMJyApIHsKICAgICAgICAgICAgICAgIG15ICRXZWJQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRBZ2VudExvZ2luTG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEFnZW50TG9naW5Mb2dveyRDU1NTdGF0ZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xvZ2luTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTG9naW5Mb2dvJwogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnTG9naW4nLCBEYXRhID0+IFwlUGFyYW0gKTsKCiAgICAjIHJlbW92ZSB0aGUgdmVyc2lvbiB0YWcgZnJvbSB0aGUgaGVhZGVyIGlmIGNvbmZpZ3VyZWQKICAgICRTZWxmLT5fRGlzYWJsZUJhbm5lckNoZWNrKCBPdXRwdXRSZWYgPT4gXCRPdXRwdXQgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIENoYWxsZW5nZVRva2VuQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHJldHVybiBpZiBmZWF0dXJlIGlzIGRpc2FibGVkCiAgICByZXR1cm4gMSBpZiAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Nlc3Npb25DU1JGUHJvdGVjdGlvbicpOwoKICAgICMgZ2V0IGNoYWxsZW5nZSB0b2tlbiBhbmQgY2hlY2sgaXQKICAgIG15ICRDaGFsbGVuZ2VUb2tlbiA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NoYWxsZW5nZVRva2VuJyApIHx8ICcnOwoKICAgICMgY2hlY2sgcmVndWxhciBDaGFsbGVuZ2VUb2tlbgogICAgcmV0dXJuIDEgaWYgJENoYWxsZW5nZVRva2VuIGVxICRTZWxmLT57VXNlckNoYWxsZW5nZVRva2VufTsKCiAgICAjIGNoZWNrIENoYWxsZW5nZVRva2VuIG9mIGFsbCBvd24gc2Vzc2lvbnMKICAgIG15IEBTZXNzaW9ucyA9ICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPkdldEFsbFNlc3Npb25JRHMoKTsKICAgIGZvciBteSAkU2Vzc2lvbklEIChAU2Vzc2lvbnMpIHsKICAgICAgICBteSAlRGF0YSA9ICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPkdldFNlc3Npb25JRERhdGEoIFNlc3Npb25JRCA9PiAkU2Vzc2lvbklEICk7CiAgICAgICAgbmV4dCBpZiAhJERhdGF7VXNlcklEfTsKICAgICAgICBuZXh0IGlmICREYXRhe1VzZXJJRH0gbmUgJFNlbGYtPntVc2VySUR9OwogICAgICAgIG5leHQgaWYgISREYXRhe1VzZXJDaGFsbGVuZ2VUb2tlbn07CgogICAgICAgICMgY2hlY2sgQ2hhbGxlbmdlVG9rZW4KICAgICAgICByZXR1cm4gMSBpZiAkQ2hhbGxlbmdlVG9rZW4gZXEgJERhdGF7VXNlckNoYWxsZW5nZVRva2VufTsKICAgIH0KCiAgICAjIG5vIHZhbGlkIHRva2VuIGZvdW5kCiAgICAkU2VsZi0+RmF0YWxFcnJvcigKICAgICAgICBNZXNzYWdlID0+ICdJbnZhbGlkIENoYWxsZW5nZSBUb2tlbiEnLAogICAgKTsKCiAgICAjIENoYWxsZW5nZVRva2VuIG9rCiAgICByZXR1cm47Cn0KCnN1YiBGYXRhbEVycm9yIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQogICAgbXkgJE91dHB1dCA9ICRTZWxmLT5IZWFkZXIoIEFyZWEgPT4gJ0Zyb250ZW5kJywgVGl0bGUgPT4gJ0ZhdGFsIEVycm9yJyApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+RXJyb3IoJVBhcmFtKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPkZvb3RlcigpOwogICAgJFNlbGYtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgIGV4aXQ7Cn0KCnN1YiBTZWN1cmVNb2RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT5IZWFkZXIoIEFyZWEgPT4gJ0Zyb250ZW5kJywgVGl0bGUgPT4gJ1NlY3VyZSBNb2RlJyApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluU2VjdXJlTW9kZScsIERhdGEgPT4gXCVQYXJhbSApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+Rm9vdGVyKCk7CiAgICAkU2VsZi0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dCApOwogICAgZXhpdDsKfQoKc3ViIEZhdGFsRGllIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIENhbGxlciAgID0+IDEsCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRQYXJhbXtNZXNzYWdlfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgIGZvciAocXcoTWVzc2FnZSBUcmFjZWJhY2spKSB7CiAgICAgICAgbXkgJEJhY2tlbmQgPSAnQmFja2VuZCcgLiAkXzsKICAgICAgICAkUGFyYW17JEJhY2tlbmR9ID0gJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICRfCiAgICAgICAgKSB8fCAnJzsKICAgICAgICAkUGFyYW17JEJhY2tlbmR9ID0gJFNlbGYtPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRQYXJhbXskQmFja2VuZH0sCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQogICAgZGllICRQYXJhbXtNZXNzYWdlfTsKfQoKc3ViIEVycm9yU2NyZWVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT5IZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPkVycm9yKCVQYXJhbSk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb290ZXIoKTsKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICBmb3IgKHF3KE1lc3NhZ2UgVHJhY2ViYWNrKSkgewogICAgICAgIG15ICRCYWNrZW5kID0gJ0JhY2tlbmQnIC4gJF87CiAgICAgICAgJFBhcmFteyRCYWNrZW5kfSA9ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICAgICAgV2hhdCA9PiAkXwogICAgICAgICkgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17QmFja2VuZE1lc3NhZ2V9ICYmICEkUGFyYW17QmFja2VuZFRyYWNlYmFja30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFBhcmFte01lc3NhZ2V9IHx8ICc/JywKICAgICAgICApOwogICAgICAgIGZvciAocXcoTWVzc2FnZSBUcmFjZWJhY2spKSB7CiAgICAgICAgICAgIG15ICRCYWNrZW5kID0gJ0JhY2tlbmQnIC4gJF87CiAgICAgICAgICAgICRQYXJhbXskQmFja2VuZH0gPSAkU2VsZi0+e0xvZ09iamVjdH0tPkdldExvZ0VudHJ5KAogICAgICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgV2hhdCA9PiAkXwogICAgICAgICAgICApIHx8ICcnOwogICAgICAgIH0KICAgIH0KICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQogICAgJFBhcmFte01lc3NhZ2V9ID1+IHMvXiguezgwfSkuKiQvJDFcW1wuXC5cXS9nczsKCiAgICBpZiAoICRQYXJhbXtCYWNrZW5kVHJhY2ViYWNrfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Nob3dCYWNrZW5kVHJhY2ViYWNrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdFcnJvcicsIERhdGEgPT4gXCVQYXJhbSApOwp9CgpzdWIgV2FybmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGJhY2tlbmQgZXJyb3IgbWVzc2FnZXMKICAgICRQYXJhbXtCYWNrZW5kTWVzc2FnZX0gPSAkU2VsZi0+e0xvZ09iamVjdH0tPkdldExvZ0VudHJ5KAogICAgICAgIFR5cGUgPT4gJ05vdGljZScsCiAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScsCiAgICAgICAgKQogICAgICAgIHx8ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nRW50cnkoCiAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgIFdoYXQgPT4gJ01lc3NhZ2UnLAogICAgICAgICkgfHwgJyc7CgogICAgaWYgKCAhJFBhcmFte01lc3NhZ2V9ICkgewogICAgICAgICRQYXJhbXtNZXNzYWdlfSA9ICRQYXJhbXtCYWNrZW5kTWVzc2FnZX07CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdXYXJuaW5nJywgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCj1pdGVtIE5vdGlmeSgpCgpjcmVhdGUgbm90aWZ5IGxpbmVzCgogICAgaW5mb3MsIHRoZSB0ZXh0IHdpbGwgYmUgdHJhbnNsYXRlZAoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgUHJpb3JpdHkgPT4gJ1dhcm5pbmcnLAogICAgICAgIEluZm8gPT4gJ1NvbWUgSW5mbyBNZXNzYWdlJywKICAgICk7CgogICAgZGF0YSB3aXRoIGxpbmssIHRoZSB0ZXh0IHdpbGwgYmUgdHJhbnNsYXRlZAoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgUHJpb3JpdHkgPT4gJ1dhcm5pbmcnLAogICAgICAgIERhdGEgPT4gJyRUZXh0eyJTb21lIERUTCBTdHVmZiJ9JywKICAgICAgICBMaW5rID0+ICdodHRwOi8vZXhhbXBsZS5jb20vJywKICAgICk7CgogICAgZXJyb3JzLCB0aGUgdGV4dCB3aWxsIGJlIHRyYW5zbGF0ZWQKCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicsCiAgICAgICAgSW5mbyA9PiAnU29tZSBFcnJvciBNZXNzYWdlJywKICAgICk7CgogICAgZXJyb3JzIGZyb20gbG9nIGJhY2tlbmQsIGlmIG5vIGVycm9yIGV4dGlzdHMsIGEgJycgd2lsbCBiZSByZXR1cm5lZAoKICAgIG15ICRPdXRwdXQgPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJywKICAgICk7Cgo9Y3V0CgpzdWIgTm90aWZ5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBpZiAoICEkUGFyYW17SW5mb30gJiYgISRQYXJhbXtEYXRhfSApIHsKICAgICAgICAkUGFyYW17QmFja2VuZE1lc3NhZ2V9ID0gJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnTm90aWNlJywKICAgICAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScsCiAgICAgICAgICAgICkKICAgICAgICAgICAgfHwgJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2dFbnRyeSgKICAgICAgICAgICAgVHlwZSA9PiAnRXJyb3InLAogICAgICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICAgICAgKSB8fCAnJzsKCiAgICAgICAgJFBhcmFte0luZm99ID0gJFBhcmFte0JhY2tlbmRNZXNzYWdlfTsKCiAgICAgICAgIyByZXR1cm4gaWYgd2UgaGF2ZSBub3RoaW5nIHRvIHNob3cKICAgICAgICByZXR1cm4gJycgaWYgISRQYXJhbXtJbmZvfTsKICAgIH0KCiAgICBteSAkQm94Q2xhc3MgPSAnTm90aWNlJzsKCiAgICBpZiAoICRQYXJhbXtJbmZvfSApIHsKICAgICAgICAkUGFyYW17SW5mb30gPX4gcy9cbi8vZzsKICAgIH0KICAgIGlmICggJFBhcmFte1ByaW9yaXR5fSAmJiAkUGFyYW17UHJpb3JpdHl9IGVxICdFcnJvcicgKSB7CiAgICAgICAgJEJveENsYXNzID0gJ0Vycm9yJzsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtMaW5rfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtTdGFydCcsCiAgICAgICAgICAgIERhdGEgPT4geyBMaW5rU3RhcnQgPT4gJFBhcmFte0xpbmt9LCB9LAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRQYXJhbXtEYXRhfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RhdGEnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkUGFyYW17TGlua30gKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rU3RvcCcsCiAgICAgICAgICAgIERhdGEgPT4geyBMaW5rU3RvcCA9PiAnPC9hPicsIH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnTm90aWZ5JywKICAgICAgICBEYXRhICAgICAgICAgPT4gewogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEJveENsYXNzID0+ICRCb3hDbGFzcywKICAgICAgICB9LAogICAgKTsKfQoKPWl0ZW0gSGVhZGVyKCkKCmdlbmVyYXRlcyB0aGUgSFRNTCBmb3IgdGhlIHBhZ2UgYmVnaW4gaW4gdGhlIEFnZW50IGludGVyZmFjZS4KCiAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKAogICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdTbWFsbCcsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSAnJyAoRGVmYXVsdCwgZnVsbCBoZWFkZXIpIG9yICdTbWFsbCcgKGJsYW5rIGhlYWRlcikKICAgICAgICBTaG93VG9vbGJhckl0ZW1zICA9PiAwLCAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICAgICAgU2hvd1ByZWZMaW5rICAgICAgPT4gMCwgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKQogICAgICAgIFNob3dMb2dvdXRCdXR0b24gID0+IDAsICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEgKDB8MSkKICAgICk7Cgo9Y3V0CgpzdWIgSGVhZGVyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFR5cGUgPSAkUGFyYW17VHlwZX0gfHwgJyc7CgogICAgIyBjaGVjayBwYXJhbXMKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1Nob3dUb29sYmFySXRlbXN9ICkgewogICAgICAgICRQYXJhbXtTaG93VG9vbGJhckl0ZW1zfSA9IDE7CiAgICB9CgogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17U2hvd1ByZWZMaW5rfSApIHsKICAgICAgICAkUGFyYW17U2hvd1ByZWZMaW5rfSA9IDE7CiAgICB9CgogICAgIyBkbyBub3Qgc2hvdyBwcmVmZXJlbmNlcyBsaW5rIGlmIHRoZSBwcmVmZXJlbmNlcyBtb2R1bGUgaXMgZGlzYWJsZWQKICAgIG15ICRNb2R1bGVzID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKTsKICAgIGlmICggISRNb2R1bGVzLT57QWdlbnRQcmVmZXJlbmNlc30gKSB7CiAgICAgICAgJFBhcmFte1Nob3dQcmVmTGlua30gPSAwOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1Nob3dMb2dvdXRCdXR0b259ICkgewogICAgICAgICRQYXJhbXtTaG93TG9nb3V0QnV0dG9ufSA9IDE7CiAgICB9CgogICAgIyBzZXQgcnRsIGlmIG5lZWRlZAogICAgaWYgKCAkU2VsZi0+e1RleHREaXJlY3Rpb259ICYmICRTZWxmLT57VGV4dERpcmVjdGlvbn0gZXEgJ3J0bCcgKSB7CiAgICAgICAgJFBhcmFte0JvZHlDbGFzc30gPSAnUlRMJzsKICAgIH0KICAgIGVsc2lmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpEZWJ1Z01vZGUnKSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RlYnVnUlRMQnV0dG9uJywKICAgICAgICApOwogICAgfQoKICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50Q1NTQ2FsbHMoKTsKCiAgICAjIEFkZCBoZWFkZXIgbG9nbywgaWYgY29uZmlndXJlZAogICAgaWYgKCBkZWZpbmVkICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZ2VudExvZ28nKSApIHsKICAgICAgICBteSAlQWdlbnRMb2dvID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0FnZW50TG9nbycpIH07CiAgICAgICAgbXkgJURhdGE7CgogICAgICAgIGZvciBteSAkQ1NTU3RhdGVtZW50ICgga2V5cyAlQWdlbnRMb2dvICkgewogICAgICAgICAgICBpZiAoICRDU1NTdGF0ZW1lbnQgZXEgJ1VSTCcgKSB7CiAgICAgICAgICAgICAgICBteSAkV2ViUGF0aCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKCAkQWdlbnRMb2dveyRDU1NTdGF0ZW1lbnR9ICF+IC8oaHR0cHxmdHB8aHR0cHMpOlwvL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFdlYlBhdGggPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OldlYlBhdGgnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICREYXRheydVUkwnfSA9ICd1cmwoJyAuICRXZWJQYXRoIC4gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fSAuICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICREYXRheyRDU1NTdGF0ZW1lbnR9ID0gJEFnZW50TG9nb3skQ1NTU3RhdGVtZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJMb2dvQ1NTJywKICAgICAgICAgICAgRGF0YSA9PiBcJURhdGEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCBjb29raWVzIGlmIGV4aXN0cwogICAgbXkgJE91dHB1dCA9ICcnOwogICAgaWYgKCAkU2VsZi0+e1NldENvb2tpZXN9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTZXNzaW9uVXNlQ29va2llJykgKSB7CiAgICAgICAgZm9yICgga2V5cyAleyAkU2VsZi0+e1NldENvb2tpZXN9IH0gKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gIlNldC1Db29raWU6ICRTZWxmLT57U2V0Q29va2llc30tPnskX31cbiI7CiAgICAgICAgfQogICAgfQoKICAgICMgZml4IElFIGJ1ZyBpZiBpbiBmaWxlbmFtZSBpcyB0aGUgd29yZCBhdHRhY2htZW50CiAgICBteSAkRmlsZSA9ICRQYXJhbXtGaWxlbmFtZX0gfHwgJFNlbGYtPntBY3Rpb259IHx8ICd1bmtub3duJzsKICAgIGlmICggJFNlbGYtPntCcm93c2VyQnJlYWtEaXNwb3NpdGlvbkhlYWRlcn0gKSB7CiAgICAgICAgJEZpbGUgPX4gcy9hdHRhY2htZW50L2J0dGFjaG1lbnQvZ2k7CiAgICB9CgogICAgIyBzZXQgZmlsZSBuYW1lIGZvciAic2F2ZSBwYWdlIGFzIgogICAgJFBhcmFte0NvbnRlbnREaXNwb3NpdGlvbn0gPSAiZmlsZW5hbWU9XCIkRmlsZS5odG1sXCIiOwoKICAgICMgYXJlYSBhbmQgdGl0bGUKICAgIGlmICggISRQYXJhbXtBcmVhfSApIHsKICAgICAgICAkUGFyYW17QXJlYX0KICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57TmF2QmFyTmFtZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17VGl0bGV9ICkgewogICAgICAgICRQYXJhbXtUaXRsZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57VGl0bGV9CiAgICAgICAgICAgIHx8ICcnOwogICAgfQogICAgZm9yIG15ICRXb3JkIChxdyhWYWx1ZSBUaXRsZSBBcmVhKSkgewogICAgICAgIGlmICggJFBhcmFteyRXb3JkfSApIHsKICAgICAgICAgICAgJFBhcmFte1RpdGxlQXJlYX0gLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFteyRXb3JkfSApIC4gJyAtICc7CiAgICAgICAgfQogICAgfQoKICAgICMgcnVuIGhlYWRlciBtZXRhIG1vZHVsZXMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpIZWFkZXJNZXRhTW9kdWxlJyk7CiAgICBpZiAoIHJlZiAkSGVhZGVyTWV0YU1vZHVsZSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyRIZWFkZXJNZXRhTW9kdWxlfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBhbmQgcnVuIG1vZHVsZQogICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgaWYgISRPYmplY3Q7CiAgICAgICAgICAgICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gdG9vbCBiYXIgaXRlbSBtb2R1bGVzCiAgICBpZiAoICRTZWxmLT57VXNlcklEfSAmJiAkU2VsZi0+e1VzZXJUeXBlfSBlcSAnVXNlcicgKSB7CiAgICAgICAgbXkgJFRvb2xCYXJNb2R1bGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlRvb2xCYXJNb2R1bGUnKTsKICAgICAgICBpZiAoICRQYXJhbXtTaG93VG9vbGJhckl0ZW1zfSAmJiByZWYgJFRvb2xCYXJNb2R1bGUgZXEgJ0hBU0gnICkgewogICAgICAgICAgICBteSAlTW9kdWxlczsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyRUb29sQmFyTW9kdWxlfTsKICAgICAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAgICAgIyBsb2FkIGFuZCBydW4gbW9kdWxlCiAgICAgICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbmV4dCBpZiAhJE9iamVjdDsKICAgICAgICAgICAgICAgICVNb2R1bGVzID0gKCAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksICVNb2R1bGVzICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyB0b29sIGJhciBpdGVtcwogICAgICAgICAgICBteSAkVG9vbEJhclNob3duID0gMDsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJU1vZHVsZXMgKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICEleyAkTW9kdWxlc3skS2V5fSB9OwoKICAgICAgICAgICAgICAgICMgc2hvdyB0b29sIGJhciB3cmFwcGVyCiAgICAgICAgICAgICAgICBpZiAoICEkVG9vbEJhclNob3duICkgewogICAgICAgICAgICAgICAgICAgICRUb29sQmFyU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVG9vbEJhcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJE1vZHVsZXN7JEtleX0tPntCbG9ja30sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRNb2R1bGVzeyRLZXl9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkTW9kdWxlc3skS2V5fS0+e0FjY2Vzc0tleX0KICAgICAgICAgICAgICAgICAgICAgICAgPyAiICgkTW9kdWxlc3skS2V5fS0+e0FjY2Vzc0tleX0pIgogICAgICAgICAgICAgICAgICAgICAgICA6ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgbG9nZ2VkIGluIG5vdGljZQogICAgICAgIGlmICggJFBhcmFte1Nob3dQcmVmTGlua30gKSB7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xvZ2luJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xvZ2luV2l0aG91dExpbmsnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGxvZ291dCBidXR0b24gKGlmIHJlZ2lzdGVyZWQpCiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17U2hvd0xvZ291dEJ1dHRvbn0KICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0xvZ291dH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9nb3V0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAkT3V0cHV0IC49ICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAiSGVhZGVyJFR5cGUiLCBEYXRhID0+IFwlUGFyYW0gKTsKCiAgICAjIHJlbW92ZSB0aGUgdmVyc2lvbiB0YWcgZnJvbSB0aGUgaGVhZGVyIGlmIGNvbmZpZ3VyZWQKICAgICRTZWxmLT5fRGlzYWJsZUJhbm5lckNoZWNrKCBPdXRwdXRSZWYgPT4gXCRPdXRwdXQgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIEZvb3RlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlICAgICAgICAgID0gJFBhcmFte1R5cGV9ICAgICAgICAgICB8fCAnJzsKICAgIG15ICRIYXNEYXRlcGlja2VyID0gJFNlbGYtPntIYXNEYXRlcGlja2VyfSB8fCAwOwoKICAgIyBHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGFuZCBKYXZhU2NyaXB0IGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtIChzZWUgTGF5b3V0TG9hZGVyKQogICAgJFNlbGYtPkxvYWRlckNyZWF0ZUFnZW50SlNDYWxscygpOwoKICAgICMgZ2V0IGRhdGVwaWNrZXIgZGF0YSwgaWYgbmVlZGVkIGluIG1vZHVsZQogICAgaWYgKCRIYXNEYXRlcGlja2VyKSB7CiAgICAgICAgbXkgJFZhY2F0aW9uRGF5cyAgICAgPSAkU2VsZi0+RGF0ZXBpY2tlckdldFZhY2F0aW9uRGF5cygpOwogICAgICAgIG15ICRWYWNhdGlvbkRheXNKU09OID0gJFNlbGYtPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gJFZhY2F0aW9uRGF5cwogICAgICAgICk7CgogICAgICAgIG15ICRUZXh0RGlyZWN0aW9uID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPntUZXh0RGlyZWN0aW9ufSB8fCAnJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRlcGlja2VyRGF0YScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXNKU09OLAogICAgICAgICAgICAgICAgSXNSVExMYW5ndWFnZSA9PiAoICRUZXh0RGlyZWN0aW9uIGVxICdydGwnICkgPyAxIDogMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgTmV3VGlja2V0SW5OZXdXaW5kb3cKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ05ld1RpY2tldEluTmV3V2luZG93OjpFbmFibGVkJykgKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOZXdUaWNrZXRJbk5ld1dpbmRvdycKICAgICAgICApOwogICAgfQoKICAgICMgQmFubmVyCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2VjdXJlOjpEaXNhYmxlQmFubmVyJykgKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCYW5uZXInCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gIkZvb3RlciRUeXBlIiwgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCnN1YiBQcmludCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY3VzdG9tIHBvc3QgZmlsdGVycwogICAgaWYgKCAkU2VsZi0+e0ZpbHRlckNvbnRlbnR9ICkgewogICAgICAgIG15ICVGaWx0ZXJzID0gJXsgJFNlbGYtPntGaWx0ZXJDb250ZW50fSB9OwogICAgICAgIGZvciBteSAkRmlsdGVyICggc29ydCBrZXlzICVGaWx0ZXJzICkgewogICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkRmlsdGVyc3skRmlsdGVyfS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRGaWx0ZXJzeyRGaWx0ZXJ9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJXsgJEZpbHRlcnN7JEZpbHRlcn0gfSwKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17T3V0cHV0fSwKICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAkUGFyYW17VGVtcGxhdGVGaWxlfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICBwcmludCAkeyAkUGFyYW17T3V0cHV0fSB9OwogICAgcmV0dXJuIDE7Cn0KCnN1YiBQcmludEhlYWRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdW5sZXNzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCB3ZSBzZXQgdGhlIGhlYWRlciB3aWR0aAogICAgJFBhcmFte1dpZHRofSB8fD0gNjQwOwoKICAgICMgZml4IElFIGJ1ZyBpZiBpbiBmaWxlbmFtZSBpcyB0aGUgd29yZCBhdHRhY2htZW50CiAgICBteSAkRmlsZSA9ICRQYXJhbXtGaWxlbmFtZX0gfHwgJFNlbGYtPntBY3Rpb259IHx8ICd1bmtub3duJzsKICAgIGlmICggJFNlbGYtPntCcm93c2VyQnJlYWtEaXNwb3NpdGlvbkhlYWRlcn0gKSB7CiAgICAgICAgJEZpbGUgPX4gcy9hdHRhY2htZW50L2J0dGFjaG1lbnQvZ2k7CiAgICB9CgogICAgIyBzZXQgZmlsZSBuYW1lIGZvciAic2F2ZSBwYWdlIGFzIgogICAgJFBhcmFte0NvbnRlbnREaXNwb3NpdGlvbn0gPSAiZmlsZW5hbWU9XCIkRmlsZS5odG1sXCIiOwoKICAgICMgYXJlYSBhbmQgdGl0bGUKICAgIGlmICggISRQYXJhbXtBcmVhfSApIHsKICAgICAgICAkUGFyYW17QXJlYX0KICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57TmF2QmFyTmFtZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17VGl0bGV9ICkgewogICAgICAgICRQYXJhbXtUaXRsZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9LT57VGl0bGV9CiAgICAgICAgICAgIHx8ICcnOwogICAgfQogICAgZm9yIG15ICRXb3JkIChxdyhBcmVhIFRpdGxlIFZhbHVlKSkgewogICAgICAgIGlmICggJFBhcmFteyRXb3JkfSApIHsKICAgICAgICAgICAgJFBhcmFte1RpdGxlQXJlYX0gLj0gJyAtICcgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17JFdvcmR9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IHJ0bCBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntUZXh0RGlyZWN0aW9ufSAmJiAkU2VsZi0+e1RleHREaXJlY3Rpb259IGVxICdydGwnICkgewogICAgICAgICRQYXJhbXtCb2R5Q2xhc3N9ID0gJ1JUTCc7CiAgICB9CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJpbnRIZWFkZXInLCBEYXRhID0+IFwlUGFyYW0gKTsKCiAgICAjIHJlbW92ZSB0aGUgdmVyc2lvbiB0YWcgZnJvbSB0aGUgaGVhZGVyIGlmIGNvbmZpZ3VyZWQKICAgICRTZWxmLT5fRGlzYWJsZUJhbm5lckNoZWNrKCBPdXRwdXRSZWYgPT4gXCRPdXRwdXQgKTsKCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgUHJpbnRGb290ZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17SG9zdH0gPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkRU5We1NFUlZFUl9OQU1FfSAuICRFTlZ7UkVRVUVTVF9VUkl9ICk7CiAgICAkUGFyYW17SG9zdH0gPX4gcy8mYW1wOy8mL2lnOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnUHJpbnRGb290ZXInLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKPWl0ZW0gQXNjaWkySHRtbCgpCgpjb252ZXJ0IGFzY2lpIHRvIGh0bWwgc3RyaW5nCgogICAgbXkgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgICA9PiAnU29tZSA8PiBUZXN0IDxmb250IGNvbG9yPSJyZWQiPlRlc3Q8L2ZvbnQ+JywKICAgICAgICBNYXggICAgICAgICAgICAgPT4gMjAsICAgICAgICMgbWF4IDIwIGNoYXJzIGZvbG93ZWQgYnkgWy4uXQogICAgICAgIFZNYXggICAgICAgICAgICA9PiAxNSwgICAgICAgIyBmaXJzdCAxNSBsaW5lcwogICAgICAgIE5ld0xpbmUgICAgICAgICA9PiAwLCAgICAgICAgIyBtb3ZlIFxyIHRvIFxuCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgID0+IDAsICAgICAgICAjIHJlcGxhY2UgIiAiIHdpdGggJm5ic3A7CiAgICAgICAgU3RyaXBFbXB0eUxpbmVzID0+IDAsCiAgICAgICAgVHlwZSAgICAgICAgICAgID0+ICdOb3JtYWwnLCAjIEpTVGV4dCBvciBOb3JtYWwgdGV4dAogICAgICAgIExpbmtGZWF0dXJlICAgICA9PiAwLCAgICAgICAgIyBkbyBzb21lIFVSTCBkZXRlY3Rpb25zCiAgICApOwoKYWxzbyBzdHJpbmcgcmVmIGlzIHBvc3NpYmxlCgogICAgbXkgJEhUTUxTdHJpbmdSZWYgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgPT4gXCRTdGluZywKICAgICk7Cgo9Y3V0CgpzdWIgQXNjaWkySHRtbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtCiAgICByZXR1cm4gJycgaWYgIWRlZmluZWQgJFBhcmFte1RleHR9OwoKICAgICMgY2hlY2sgdGV4dAogICAgbXkgJFRleHRTY2FsYXI7CiAgICBteSAkVGV4dDsKICAgIGlmICggIXJlZiAkUGFyYW17VGV4dH0gKSB7CiAgICAgICAgJFRleHRTY2FsYXIgPSAxOwogICAgICAgICRUZXh0ICAgICAgID0gXCRQYXJhbXtUZXh0fTsKICAgIH0KICAgIGVsc2lmICggcmVmICRQYXJhbXtUZXh0fSBlcSAnU0NBTEFSJyApIHsKICAgICAgICAkVGV4dCA9ICRQYXJhbXtUZXh0fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgIicgLiByZWYgJFBhcmFte1RleHR9IC4gJyIgb2YgVGV4dCBwYXJhbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQoKICAgIG15IEBGaWx0ZXJzOwogICAgaWYgKCAkUGFyYW17TGlua0ZlYXR1cmV9ICYmICRTZWxmLT57RmlsdGVyVGV4dH0gKSB7CgogICAgICAgIG15ICVGaWx0ZXJzID0gJXsgJFNlbGYtPntGaWx0ZXJUZXh0fSB9OwoKICAgICAgICBGSUxURVI6CiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKCBzb3J0IGtleXMgJUZpbHRlcnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkRmlsdGVyc3skRmlsdGVyfS0+e01vZHVsZX07CgogICAgICAgICAgICAkU2VsZi0+RmF0YWxEaWUoKSBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKTsKCiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEZJTFRFUiBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBARmlsdGVycywKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QgPT4gJE9iamVjdCwKICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgPT4gJEZpbHRlcnN7JEZpbHRlcn0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBwcmUgcnVuCiAgICAgICAgZm9yIG15ICRGaWx0ZXIgKEBGaWx0ZXJzKSB7CiAgICAgICAgICAgICRUZXh0ID0gJEZpbHRlci0+e09iamVjdH0tPlByZSgKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLT57RmlsdGVyfSwKICAgICAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBtYXggd2lkdGgKICAgIGlmICggJFBhcmFte01heH0gKSB7CiAgICAgICAgJHskVGV4dH0gPX4gcy9eKC57JFBhcmFte01heH19KS4rPyQvJDFcW1wuXC5cLlxdL2dzOwogICAgfQoKICAgICMgbmV3bGluZQogICAgaWYgKCAkUGFyYW17TmV3TGluZX0gJiYgbGVuZ3RoKCAkeyRUZXh0fSApIDwgMTQwXzAwMCApIHsKICAgICAgICAkeyRUZXh0fSA9fiBzLyhcblxyfFxyXHJcbnxcclxuKS9cbi9nOwogICAgICAgICR7JFRleHR9ID1+IHMvXHIvXG4vZzsKICAgICAgICAkeyRUZXh0fSA9fiBzLyguezQsJFBhcmFte05ld0xpbmV9fSkoPzpcc3xceikvJDFcbi9nbTsKICAgICAgICBteSAkRm9yY2VOZXdMaW5lID0gJFBhcmFte05ld0xpbmV9ICsgMTA7CiAgICAgICAgJHskVGV4dH0gPX4gcy8oLnskRm9yY2VOZXdMaW5lfSkoLis/KS8kMVxuJDIvZzsKICAgIH0KCiAgICAjIHJlbW92ZSB0YWJzCiAgICAkeyRUZXh0fSA9fiBzL1x0LyAvZzsKCiAgICAjIHN0cmlwIGVtcHR5IGxpbmVzCiAgICBpZiAoICRQYXJhbXtTdHJpcEVtcHR5TGluZXN9ICkgewogICAgICAgICR7JFRleHR9ID1+IHMvXlxzKlxuLy9tZzsKICAgIH0KCiAgICAjIG1heCBsaW5lcwogICAgaWYgKCAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgbXkgQFRleHRMaXN0ID0gc3BsaXQoICJcbiIsICR7JFRleHR9ICk7CiAgICAgICAgJHskVGV4dH0gPSAnJzsKICAgICAgICBteSAkQ291bnRlciA9IDE7CiAgICAgICAgZm9yIChAVGV4dExpc3QpIHsKICAgICAgICAgICAgaWYgKCAkQ291bnRlciA8PSAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgICAgICAgICAkeyRUZXh0fSAuPSAkXyAuICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkQ291bnRlciA+PSAkUGFyYW17Vk1heH0gKSB7CiAgICAgICAgICAgICR7JFRleHR9IC49ICJbLi4uXVxuIjsKICAgICAgICB9CiAgICB9CgogICAgIyBodG1sIHF1b3RpbmcKICAgICR7JFRleHR9ID1+IHMvJi8mYW1wOy9nOwogICAgJHskVGV4dH0gPX4gcy88LyZsdDsvZzsKICAgICR7JFRleHR9ID1+IHMvPi8mZ3Q7L2c7CiAgICAkeyRUZXh0fSA9fiBzLyIvJnF1b3Q7L2c7CgogICAgIyB0ZXh0IC0+IGh0bWwgZm9ybWF0IHF1b3RpbmcKICAgIGlmICggJFBhcmFte0xpbmtGZWF0dXJlfSApIHsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoQEZpbHRlcnMpIHsKICAgICAgICAgICAgJFRleHQgPSAkRmlsdGVyLT57T2JqZWN0fS0+UG9zdCgKICAgICAgICAgICAgICAgIEZpbHRlciA9PiAkRmlsdGVyLT57RmlsdGVyfSwKICAgICAgICAgICAgICAgIERhdGEgICA9PiAkVGV4dCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCAkUGFyYW17SFRNTFJlc3VsdE1vZGV9ICkgewogICAgICAgICR7JFRleHR9ID1+IHMvXG4vPGJyXC8+XG4vZzsKICAgICAgICAkeyRUZXh0fSA9fiBzLyAgLyZuYnNwOyZuYnNwOy9nOwogICAgfQoKICAgIGlmICggJFBhcmFte1R5cGV9ICYmICRQYXJhbXtUeXBlfSBlcSAnSlNUZXh0JyApIHsKICAgICAgICAkeyRUZXh0fSA9fiBzLycvXFwnL2c7CiAgICB9CgogICAgcmV0dXJuICRUZXh0IGlmIHJlZiAkUGFyYW17VGV4dH07CiAgICByZXR1cm4gJHskVGV4dH07Cn0KCj1pdGVtIExpbmtRdW90ZSgpCgpzbyBzb21lIFVSTCBsaW5rIGRldGVjdGlvbnMKCiAgICBteSAkSFRNTFdpdGhMaW5rcyA9ICRMYXlvdXRPYmplY3QtPkxpbmtRdW90ZSgKICAgICAgICBUZXh0ID0+ICRIVE1MV2l0aE91dExpbmtzLAogICAgKTsKCmFsc28gc3RyaW5nIHJlZiBpcyBwb3NzaWJsZQoKICAgIG15ICRIVE1MV2l0aExpbmtzUmVmID0gJExheW91dE9iamVjdC0+TGlua1F1b3RlKAogICAgICAgIFRleHQgPT4gXCRIVE1MV2l0aE91dExpbmtzUmVmLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rUXVvdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGV4dCAgID0gJFBhcmFte1RleHR9ICAgfHwgJyc7CiAgICBteSAkVGFyZ2V0ID0gJFBhcmFte1RhcmdldH0gfHwgJ05ld1BhZ2UnIC4gaW50KCByYW5kKDE5OSkgKTsKCiAgICAjIGNoZWNrIHJlZgogICAgbXkgJFRleHRTY2FsYXI7CiAgICBpZiAoICFyZWYgJFRleHQgKSB7CiAgICAgICAgJFRleHRTY2FsYXIgPSAkVGV4dDsKICAgICAgICAkVGV4dCAgICAgICA9IFwkVGV4dFNjYWxhcjsKICAgIH0KCiAgICBteSBARmlsdGVyczsKICAgIGlmICggJFNlbGYtPntGaWx0ZXJUZXh0fSApIHsKICAgICAgICBteSAlRmlsdGVycyA9ICV7ICRTZWxmLT57RmlsdGVyVGV4dH0gfTsKICAgICAgICBmb3IgbXkgJEZpbHRlciAoIHNvcnQga2V5cyAlRmlsdGVycyApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkRmlsdGVyc3skRmlsdGVyfS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkRmlsdGVyc3skRmlsdGVyfS0+e01vZHVsZX0tPm5ldyggJXskU2VsZn0gKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICgkT2JqZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBARmlsdGVycywgeyBPYmplY3QgPT4gJE9iamVjdCwgRmlsdGVyID0+ICRGaWx0ZXJzeyRGaWx0ZXJ9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+RmF0YWxEaWUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkRmlsdGVyIChARmlsdGVycykgewogICAgICAgICRUZXh0ID0gJEZpbHRlci0+e09iamVjdH0tPlByZSggRmlsdGVyID0+ICRGaWx0ZXItPntGaWx0ZXJ9LCBEYXRhID0+ICRUZXh0ICk7CiAgICB9CiAgICBmb3IgbXkgJEZpbHRlciAoQEZpbHRlcnMpIHsKICAgICAgICAkVGV4dCA9ICRGaWx0ZXItPntPYmplY3R9LT5Qb3N0KCBGaWx0ZXIgPT4gJEZpbHRlci0+e0ZpbHRlcn0sIERhdGEgPT4gJFRleHQgKTsKICAgIH0KCiAgICAjIGRvIG1haWwgdG8gcXVvdGUKICAgICR7JFRleHR9ID1+IHMvKG1haWx0bzouKz8pKFwuXHN8XHN8XCl8XCJ8XXwnKS88YSBocmVmPVwiJDFcIj4kMTxcL2E+JDIvZ2k7CgogICAgIyBjaGVjayByZWYgJiYgcmV0dXJuIHJlc3VsdCBsaWtlIGNhbGxlZAogICAgaWYgKCRUZXh0U2NhbGFyKSB7CiAgICAgICAgcmV0dXJuICR7JFRleHR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRUZXh0OwogICAgfQp9Cgo9aXRlbSBIVE1MTGlua1F1b3RlKCkKCnNvIHNvbWUgVVJMIGxpbmsgZGV0ZWN0aW9ucyBpbiBIVE1MIGNvZGUKCiAgICBteSAkSFRNTFdpdGhMaW5rcyA9ICRMYXlvdXRPYmplY3QtPkhUTUxMaW5rUXVvdGUoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MU3RyaW5nLAogICAgKTsKCmFsc28gc3RyaW5nIHJlZiBpcyBwb3NzaWJsZQoKICAgIG15ICRIVE1MV2l0aExpbmtzUmVmID0gJExheW91dE9iamVjdC0+SFRNTExpbmtRdW90ZSgKICAgICAgICBTdHJpbmcgPT4gXCRIVE1MU3RyaW5nLAogICAgKTsKCj1jdXQKCnN1YiBIVE1MTGlua1F1b3RlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+TGlua1F1b3RlKAogICAgICAgIFN0cmluZyAgICA9PiAkUGFyYW17U3RyaW5nfSwKICAgICAgICBUYXJnZXRBZGQgPT4gMSwKICAgICAgICBUYXJnZXQgICAgPT4gJ19ibGFuaycsCiAgICApOwp9Cgo9aXRlbSBMaW5rRW5jb2RlKCkKCmRvIHNvbWUgdXJsIGVuY29kaW5nIC0gZS4gZy4gcmVwbGFjZSArIHdpdGggJTJCIGluIGxpbmtzCgogICAgbXkgJFVSTEVuY29kZWQgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRVUkwpOwoKPWN1dAoKI1RPRE86IFVzZSBhbiBleHRlcm5hbCBwZXJsIG1vZHVsZSBmcm9tIENQQU4gZm9yIHRoaXMgZnVuY3Rpb24uCgpzdWIgTGlua0VuY29kZSB7CiAgICBteSAoICRTZWxmLCAkTGluayApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRMaW5rOwoKICAgICRMaW5rID1+IHMvJS8lMjUvZzsKICAgICRMaW5rID1+IHMvJi8lMjYvZzsKICAgICRMaW5rID1+IHMvPS8lM0QvZzsKICAgICRMaW5rID1+IHMvXCEvJTIxL2c7CiAgICAkTGluayA9fiBzLyIvJTIyL2c7CiAgICAkTGluayA9fiBzL1wjLyUyMy9nOwogICAgJExpbmsgPX4gcy9cJC8lMjQvZzsKICAgICRMaW5rID1+IHMvJy8lMjcvZzsKICAgICRMaW5rID1+IHMvLC8lMkMvZzsKICAgICRMaW5rID1+IHMvXCsvJTJCL2c7CiAgICAkTGluayA9fiBzL1w/LyUzRi9nOwogICAgJExpbmsgPX4gcy9cfC8lN0MvZzsKICAgICRMaW5rID1+IHMvXC8vXCUyRi9nOwogICAgJExpbmsgPX4gcy/vv70vXCVBNy9nOwoKICAgICMgQWNjb3JkaW5nIHRvIHRoZSBVUkwgZW5jb2RpbmcgUkZDLCB0aGUgcGF0aCBzZWdtZW50IG9mIGFuIFVSTCBtdXN0IHVzZSAlMjAgZm9yIHNwYWNlLAogICAgIyB3aGlsZSBpbiB0aGUgcXVlcnkgc3RyaW5nICsgaXMgdXNlZCBub3JtYWxseS4gSG93ZXZlciwgSUlTIGRvZXMgbm90IHVuZGVyc3RhbmQgKyBpbiB0aGUKICAgICMgcGF0aCBzZWdtZW50LCBidXQgdW5kZXJzdGFuZHMgJTIwIGluIHRoZSBxdWVyeSBzdHJpbmcsIGxpa2UgYWxsIG90aGVycyBkbyBhcyB3ZWxsLgogICAgIyBUaGVyZWZvcmUgd2UgdXNlICUyMC4KICAgICRMaW5rID1+IHMvIC8lMjAvZzsKICAgICRMaW5rID1+IHMvOi9cJTNBL2c7CiAgICAkTGluayA9fiBzLzsvXCUzQi9nOwogICAgJExpbmsgPX4gcy9AL1wlNDAvZzsKICAgIHJldHVybiAkTGluazsKfQoKc3ViIEN1c3RvbWVyQWdlSW5Ib3VycyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBZ2UgPSBkZWZpbmVkKCAkUGFyYW17QWdlfSApID8gJFBhcmFte0FnZX0gOiByZXR1cm47CiAgICBteSAkU3BhY2UgICAgID0gJFBhcmFte1NwYWNlfSB8fCAnPGJyLz4nOwogICAgbXkgJEFnZVN0cmcgICA9ICcnOwogICAgbXkgJEhvdXJEc2MgICA9ICdoJzsKICAgIG15ICRNaW51dGVEc2MgPSAnbSc7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lU2hvd0NvbXBsZXRlRGVzY3JpcHRpb24nKSApIHsKICAgICAgICAkSG91ckRzYyAgID0gJ2hvdXInOwogICAgICAgICRNaW51dGVEc2MgPSAnbWludXRlJzsKICAgIH0KICAgIGlmICggJEFnZSA9fiAvXi0oLiopLyApIHsKICAgICAgICAkQWdlICAgICA9ICQxOwogICAgICAgICRBZ2VTdHJnID0gJy0nOwogICAgfQoKICAgICMgZ2V0IGhvdXJzCiAgICBpZiAoICRBZ2UgPj0gMzYwMCApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDM2MDAgKSApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJEhvdXJEc2MpOwogICAgICAgICRBZ2VTdHJnIC49ICRTcGFjZTsKICAgIH0KCiAgICAjIGdldCBtaW51dGVzIChqdXN0IGlmIGFnZSA8IDEgZGF5KQogICAgaWYgKCAkQWdlIDw9IDM2MDAgfHwgaW50KCAoICRBZ2UgLyA2MCApICUgNjAgKSApIHsKICAgICAgICAkQWdlU3RyZyAuPSBpbnQoICggJEFnZSAvIDYwICkgJSA2MCApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJE1pbnV0ZURzYyk7CiAgICB9CiAgICByZXR1cm4gJEFnZVN0cmc7Cn0KCnN1YiBDdXN0b21lckFnZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBZ2UgPSBkZWZpbmVkKCAkUGFyYW17QWdlfSApID8gJFBhcmFte0FnZX0gOiByZXR1cm47CiAgICBteSAkU3BhY2UgICAgID0gJFBhcmFte1NwYWNlfSB8fCAnPGJyLz4nOwogICAgbXkgJEFnZVN0cmcgICA9ICcnOwogICAgbXkgJERheURzYyAgICA9ICdkJzsKICAgIG15ICRIb3VyRHNjICAgPSAnaCc7CiAgICBteSAkTWludXRlRHNjID0gJ20nOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVNob3dDb21wbGV0ZURlc2NyaXB0aW9uJykgKSB7CiAgICAgICAgJERheURzYyAgICA9ICdkYXknOwogICAgICAgICRIb3VyRHNjICAgPSAnaG91cic7CiAgICAgICAgJE1pbnV0ZURzYyA9ICdtaW51dGUnOwogICAgfQogICAgaWYgKCAkQWdlID1+IC9eLSguKikvICkgewogICAgICAgICRBZ2UgICAgID0gJDE7CiAgICAgICAgJEFnZVN0cmcgPSAnLSc7CiAgICB9CgogICAgIyBnZXQgZGF5cwogICAgaWYgKCAkQWdlID49IDg2NDAwICkgewogICAgICAgICRBZ2VTdHJnIC49IGludCggKCAkQWdlIC8gMzYwMCApIC8gMjQgKSAuICcgJzsKICAgICAgICAkQWdlU3RyZyAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCREYXlEc2MpOwogICAgICAgICRBZ2VTdHJnIC49ICRTcGFjZTsKICAgIH0KCiAgICAjIGdldCBob3VycwogICAgaWYgKCAkQWdlID49IDM2MDAgKSB7CiAgICAgICAgJEFnZVN0cmcgLj0gaW50KCAoICRBZ2UgLyAzNjAwICkgJSAyNCApIC4gJyAnOwogICAgICAgICRBZ2VTdHJnIC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJEhvdXJEc2MpOwogICAgICAgICRBZ2VTdHJnIC49ICRTcGFjZTsKICAgIH0KCiAgICAjIGdldCBtaW51dGVzIChqdXN0IGlmIGFnZSA8IDEgZGF5KQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZVNob3dBbHdheXNMb25nJykgfHwgJEFnZSA8IDg2NDAwICkgewogICAgICAgICRBZ2VTdHJnIC49IGludCggKCAkQWdlIC8gNjAgKSAlIDYwICkgLiAnICc7CiAgICAgICAgJEFnZVN0cmcgLj0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgkTWludXRlRHNjKTsKICAgIH0KICAgIHJldHVybiAkQWdlU3RyZzsKfQoKPWl0ZW0gQnVpbGRTZWxlY3Rpb24oKQoKYnVpbGQgYSBodG1sIG9wdGlvbiBlbGVtZW50IGJhc2VkIG9uIGdpdmVuIGRhdGEKCiAgICBteSAkSFRNTCA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJEFycmF5UmVmLCAgICAgICAgICAgICAjIHVzZSAkSGFzaFJlZiwgJEFycmF5UmVmIG9yICRBcnJheUhhc2hSZWYgKHNlZSBiZWxvdykKICAgICAgICBOYW1lICAgICAgID0+ICdUaGVOYW1lJywgICAgICAgICAgICAgIyBuYW1lIG9mIGVsZW1lbnQKICAgICAgICBJRCAgICAgICAgID0+ICdIVE1MSUQnLCAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIHRoZSBIVE1MIElEIGZvciB0aGlzIGVsZW1lbnQsIGlmIG5vdCBwcm92aWRlZCwgdGhlIG5hbWUgd2lsbCBiZSB1c2VkIGFzIElEIGFzIHdlbGwKICAgICAgICBNdWx0aXBsZSAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKQogICAgICAgIFNpemUgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxIGVsZW1lbnQgc2l6ZQogICAgICAgIENsYXNzICAgICAgPT4gJ2NsYXNzJywgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgYSBjc3MgY2xhc3MKICAgICAgICBEaXNhYmxlZCAgID0+IDAsICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBkaXNhYmxlIHRoZSBlbGVtZW50CiAgICAgICAgT25DaGFuZ2UgICA9PiAnamF2YXNjcmlwdCcsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIE9uQ2xpY2sgICAgPT4gJ2phdmFzY3JpcHQnLCAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgU2VsZWN0ZWRJRCAgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSB1c2UgaW50ZWdlciBvciBhcnJheXJlZiAodW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZikKICAgICAgICBTZWxlY3RlZElEICAgICA9PiBbMSwgNSwgM10sICAgICAgICAgIyAob3B0aW9uYWwpIHVzZSBpbnRlZ2VyIG9yIGFycmF5cmVmICh1bmFibGUgdG8gdXNlIHdpdGggQXJyYXlIYXNoUmVmKQogICAgICAgIFNlbGVjdGVkVmFsdWUgID0+ICd0ZXN0JywgICAgICAgICAgICAjIChvcHRpb25hbCkgdXNlIHN0cmluZyBvciBhcnJheXJlZiAodW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZikKICAgICAgICBTZWxlY3RlZFZhbHVlICA9PiBbJ3Rlc3QnLCAndGVzdDEnXSwgIyAob3B0aW9uYWwpIHVzZSBzdHJpbmcgb3IgYXJyYXlyZWYgKHVuYWJsZSB0byB1c2Ugd2l0aCBBcnJheUhhc2hSZWYpCgogICAgICAgIFNvcnQgICAgICAgICAgID0+ICdOdW1lcmljVmFsdWUnLCAgICAjIChvcHRpb25hbCkgKEFscGhhbnVtZXJpY1ZhbHVlfE51bWVyaWNWYWx1ZXxBbHBoYW51bWVyaWNLZXl8TnVtZXJpY0tleXxUcmVlVmlld3xJbmRpdmlkdWFsS2V5fEluZGl2aWR1YWxWYWx1ZSkgdW5hYmxlIHRvIHVzZSB3aXRoIEFycmF5SGFzaFJlZgogICAgICAgIFNvcnRJbmRpdmlkdWFsID0+IFsnc2VjJywgJ21pbiddICAgICAjIChvcHRpb25hbCkgb25seSBzb3J0IGlzIHNldCB0byBJbmRpdmlkdWFsS2V5IG9yIEluZGl2aWR1YWxWYWx1ZQogICAgICAgIFNvcnRSZXZlcnNlICAgID0+IDAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgcmV2ZXJzZSB0aGUgbGlzdAoKICAgICAgICBUcmFuc2xhdGlvbiAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMSAoMHwxKSB0cmFuc2xhdGUgdmFsdWUKICAgICAgICBQb3NzaWJsZU5vbmUgICA9PiAwLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBhZGQgYSBsZWFkaW5nIGVtcHR5IHNlbGVjdGlvbgogICAgICAgIFRyZWVWaWV3ICAgICAgID0+IDAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAwICgwfDEpCiAgICAgICAgRGlzYWJsZWRCcmFuY2ggPT4gJ0JyYW5jaCcsICAgICAgICAgICMgKG9wdGlvbmFsKSBkaXNhYmxlIGFsbCBlbGVtZW50cyBvZiB0aGlzIGJyYW5jaCAodXNlIHN0cmluZyBvciBhcnJheXJlZikKICAgICAgICBNYXggICAgICAgICAgICA9PiAxMDAsICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMTAwIG1heCBzaXplIG9mIHRoZSBzaG93biB2YWx1ZQogICAgICAgIEhUTUxRdW90ZSAgICAgID0+IDAsICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpIGRpc2FibGUgaHRtbCBxdW90ZQogICAgICAgIFRpdGxlICAgICAgICAgID0+ICdUb29sdGlwIFRleHQnLCAgICAjIChvcHRpb25hbCkgc3RyaW5nIHdpbGwgYmUgc2hvd24gYXMgVG9vbHRpcCBvbiBtb3VzZW92ZXIKICAgICAgICBPcHRpb25UaXRsZSAgICA9PiAxLCAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMCAoMHwxKSBzaG93IHRpdGxlIGF0dHJpYnV0ZSAodGhlIG9wdGlvbiB2YWx1ZSkgb24gZXZlcnkgb3B0aW9uIGVsZW1lbnQKICAgICk7CgogICAgbXkgJEhhc2hSZWYgPSB7CiAgICAgICAgJ0tleTEnID0+ICdWYWx1ZTEnLAogICAgICAgICdLZXkyJyA9PiAnVmFsdWUyJywKICAgICAgICAnS2V5MycgPT4gJ1ZhbHVlMycsCiAgICB9OwoKICAgIG15ICRBcnJheVJlZiA9IFsKICAgICAgICAnS2V5VmFsdWUxJywKICAgICAgICAnS2V5VmFsdWUyJywKICAgICAgICAnS2V5VmFsdWUzJywKICAgICAgICAnS2V5VmFsdWU0JywKICAgIF07CgogICAgbXkgJEFycmF5SGFzaFJlZiA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnMScsCiAgICAgICAgICAgIFZhbHVlID0+ICdWYWx1ZTEnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJzInLAogICAgICAgICAgICBWYWx1ZSA9PiAnVmFsdWUxOjpTdWJ2YWx1ZTEnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJzMnLAogICAgICAgICAgICBWYWx1ZSA9PiAnVmFsdWUxOjpTdWJ2YWx1ZTInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJzQnLAogICAgICAgICAgICBWYWx1ZSA9PiAnVmFsdWUyJywKICAgICAgICAgICAgRGlzYWJsZWQgPT4gMSwKICAgICAgICB9CiAgICBdOwoKPWN1dAoKc3ViIEJ1aWxkU2VsZWN0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoTmFtZSBEYXRhKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBPbkNoYW5nZSBpZiBBSkFYIGlzIHVzZWQKICAgIGlmICggJFBhcmFte0FqYXh9ICkgewogICAgICAgIGlmICggISRQYXJhbXtBamF4fS0+e0RlcGVuZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIERlcGVuZCBQYXJhbSBBamF4IG9wdGlvbiEnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgICAgICBpZiAoICEkUGFyYW17QWpheH0tPntVcGRhdGV9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVcGRhdGUgUGFyYW0gQWpheCBvcHRpb24oKSEnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgICAgICBteSAkU2VsZWN0b3IgPSAkUGFyYW17SUR9IHx8ICRQYXJhbXtOYW1lfTsKICAgICAgICAkUGFyYW17T25DaGFuZ2V9ID0gIkNvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyMiCiAgICAgICAgICAgIC4gJFNlbGVjdG9yIC4gIicpLCAnIiAuICRQYXJhbXtBamF4fS0+e1N1YmFjdGlvbn0gLiAiJywiCiAgICAgICAgICAgIC4gIiAnJFBhcmFte05hbWV9JywiCiAgICAgICAgICAgIC4gIiBbJyIKICAgICAgICAgICAgLiBqb2luKCAiJywgJyIsIEB7ICRQYXJhbXtBamF4fS0+e1VwZGF0ZX0gfSApIC4gIiddKTsiOwogICAgfQoKICAgICMgY3JlYXRlIE9wdGlvblJlZgogICAgbXkgJE9wdGlvblJlZiA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25PcHRpb25SZWZDcmVhdGUoJVBhcmFtKTsKCiAgICAjIGNyZWF0ZSBBdHRyaWJ1dGVSZWYKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uQXR0cmlidXRlUmVmQ3JlYXRlKCVQYXJhbSk7CgogICAgIyBjcmVhdGUgRGF0YVJlZgogICAgbXkgJERhdGFSZWYgPSAkU2VsZi0+X0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgKICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIEF0dHJpYnV0ZVJlZiA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgIE9wdGlvblJlZiAgICA9PiAkT3B0aW9uUmVmLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgbXkgJFN0cmluZyA9ICRTZWxmLT5fQnVpbGRTZWxlY3Rpb25PdXRwdXQoCiAgICAgICAgQXR0cmlidXRlUmVmID0+ICRBdHRyaWJ1dGVSZWYsCiAgICAgICAgRGF0YVJlZiAgICAgID0+ICREYXRhUmVmLAogICAgICAgIE9wdGlvblRpdGxlICA9PiAkUGFyYW17T3B0aW9uVGl0bGV9LAogICAgKTsKICAgIHJldHVybiAkU3RyaW5nOwp9CgpzdWIgTm9QZXJtaXNzaW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFdpdGhIZWFkZXIgPSAkUGFyYW17V2l0aEhlYWRlcn0gfHwgJ3llcyc7CiAgICAkUGFyYW17TWVzc2FnZX0gPSAnSW5zdWZmaWNpZW50IFJpZ2h0cy4nIGlmICggISRQYXJhbXtNZXNzYWdlfSApOwoKICAgICMgY3JlYXRlIG91dHB1dAogICAgbXkgJE91dHB1dDsKICAgICRPdXRwdXQgPSAkU2VsZi0+SGVhZGVyKCBUaXRsZSA9PiAnSW5zdWZmaWNpZW50IFJpZ2h0cycgKSBpZiAoICRXaXRoSGVhZGVyIGVxICd5ZXMnICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnTm9QZXJtaXNzaW9uJywgRGF0YSA9PiBcJVBhcmFtICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5Gb290ZXIoKSBpZiAoICRXaXRoSGVhZGVyIGVxICd5ZXMnICk7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJE91dHB1dDsKfQoKPWl0ZW0gUGVybWlzc2lvbigpCgpjaGVjayBpZiBhY2Nlc3MgdG8gYSBmcm9udGVuZCBtb2R1bGUgZXhpc3RzCgogICAgbXkgJEFjY2VzcyA9ICRMYXlvdXRPYmplY3QtPlBlcm1pc3Npb24oCiAgICAgICAgQWN0aW9uID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgVHlwZSAgID0+ICdydycsICMgcm98cncgcG9zc2libGUKICAgICk7Cgo9Y3V0CgpzdWIgUGVybWlzc2lvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIChxdyhBY3Rpb24gVHlwZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHb3Qgbm8gJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBpdCBpcyByb3xydwogICAgbXkgJU1hcCA9ICgKICAgICAgICBybyA9PiAnR3JvdXBSbycsCiAgICAgICAgcncgPT4gJ0dyb3VwJywKCiAgICApOwogICAgbXkgJFBlcm1pc3Npb24gPSAkTWFweyAkUGFyYW17VHlwZX0gfTsKICAgIHJldHVybiBpZiAhJFBlcm1pc3Npb247CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbiBmb3IgZnJvbnRlbmQgbW9kdWxlCiAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkUGFyYW17QWN0aW9ufSB9OwogICAgcmV0dXJuIGlmICEkQ29uZmlnOwoKICAgIG15ICRJdGVtID0gJENvbmZpZy0+eyRQZXJtaXNzaW9ufTsKCiAgICAjIGFycmF5IGFjY2VzcyByZXN0cmljdGlvbgogICAgbXkgJEFjY2VzcyA9IDA7CiAgICBpZiAoICRJdGVtICYmIHJlZiAkSXRlbSBlcSAnQVJSQVknICkgewogICAgICAgIGZvciAoIEB7JEl0ZW19ICkgewogICAgICAgICAgICBteSAkS2V5ID0gJ1VzZXJJcycgLiAkUGVybWlzc2lvbiAuICdbJyAuICRfIC4gJ10nOwogICAgICAgICAgICBpZiAoICRTZWxmLT57JEtleX0gJiYgJFNlbGYtPnskS2V5fSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2NhbGFyIGFjY2VzcyByZXN0cmljdGlvbgogICAgZWxzaWYgKCRJdGVtKSB7CiAgICAgICAgbXkgJEtleSA9ICdVc2VySXMnIC4gJFBlcm1pc3Npb24gLiAnWycgLiAkSXRlbSAuICddJzsKICAgICAgICBpZiAoICRTZWxmLT57JEtleX0gJiYgJFNlbGYtPnskS2V5fSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgbm8gYWNjZXNzIHJlc3RyaWN0aW9uCiAgICBlbHNpZiAoICEkQ29uZmlnLT57R3JvdXBSb30gJiYgISRDb25maWctPntHcm91cH0gKSB7CiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICB9CiAgICByZXR1cm4gJEFjY2VzczsKfQoKc3ViIENoZWNrQ2hhcnNldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQgPSAnJzsKICAgIGlmICggISRQYXJhbXtBY3Rpb259ICkgewogICAgICAgICRQYXJhbXtBY3Rpb259ID0gJyRFbnZ7IkFjdGlvbiJ9JzsKICAgIH0KCiAgICAjIHdpdGggdXRmLTggY2FuIGV2ZXJ5dGhpbmcgYmUgc2hvd24KICAgIGlmICggJFNlbGYtPntVc2VyQ2hhcnNldH0gIX4gL151dGYtOCQvaSApIHsKCiAgICAgICAgIyByZXBsYWNlICcgb3IgIgogICAgICAgICRQYXJhbXtDaGFyc2V0fSAmJiAkUGFyYW17Q2hhcnNldH0gPX4gcy8nfCIvL2dpOwoKICAgICAgICAjIGlmIHRoZSBjb250ZW50IGNoYXJzZXQgaXMgZGlmZmVyZW50IHRvIHRoZSB1c2VyIGNoYXJzZXQKICAgICAgICBpZiAoICRQYXJhbXtDaGFyc2V0fSAmJiAkU2VsZi0+e1VzZXJDaGFyc2V0fSAhfiAvXiRQYXJhbXtDaGFyc2V0fSQvaSApIHsKCiAgICAgICAgICAgICMgaWYgdGhlIGNvbnRlbnQgY2hhcnNldCBpcyB1cy1hc2NpaSBpdCBpcyBhbHdheXMgc2hvd24gY29ycmVjdGx5CiAgICAgICAgICAgIGlmICggJFBhcmFte0NoYXJzZXR9ICF+IC91cy1hc2NpaS9pICkgewogICAgICAgICAgICAgICAgJE91dHB1dCA9ICc8cD48aSBjbGFzcz0ic21hbGwiPicKICAgICAgICAgICAgICAgICAgICAuICckVGV4dHsiVGhpcyBtZXNzYWdlIHdhcyB3cml0dGVuIGluIGEgY2hhcmFjdGVyIHNldCBvdGhlciB0aGFuIHlvdXIgb3duLiJ9JwogICAgICAgICAgICAgICAgICAgIC4gJyRUZXh0eyJJZiBpdCBpcyBub3QgZGlzcGxheWVkIGNvcnJlY3RseSwifSAnCiAgICAgICAgICAgICAgICAgICAgLiAnPGEgaHJlZj0iJwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntCYXNlbGlua30KICAgICAgICAgICAgICAgICAgICAuICJBY3Rpb249JFBhcmFte0FjdGlvbn07VGlja2V0SUQ9JFBhcmFte1RpY2tldElEfSIKICAgICAgICAgICAgICAgICAgICAuICI7QXJ0aWNsZUlEPSRQYXJhbXtBcnRpY2xlSUR9O1N1YmFjdGlvbj1TaG93SFRNTGVNYWlsXCIgdGFyZ2V0PVwiSFRNTGVNYWlsXCIgIgogICAgICAgICAgICAgICAgICAgIC4gJ29ubW91c2VvdmVyPSJ3aW5kb3cuc3RhdHVzPVwnJFRleHR7Im9wZW4gaXQgaW4gYSBuZXcgd2luZG93In1cJzsgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPVwnXCc7Ij4nCiAgICAgICAgICAgICAgICAgICAgLiAnJFRleHR7ImNsaWNrIGhlcmUifTwvYT4gJFRleHR7InRvIG9wZW4gaXQgaW4gYSBuZXcgd2luZG93LiJ9PC9pPjwvcD4nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIG5vdGUgc3RyaW5nCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIENoZWNrTWltZVR5cGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBpZiAoICEkUGFyYW17QWN0aW9ufSApIHsKICAgICAgICAkUGFyYW17QWN0aW9ufSA9ICckRW52eyJBY3Rpb24ifSc7CiAgICB9CgogICAgIyBjaGVjayBpZiBpdCBpcyBhIHRleHQvcGxhaW4gZW1haWwKICAgIGlmICggJFBhcmFte01pbWVUeXBlfSAmJiAkUGFyYW17TWltZVR5cGV9ICF+IC90ZXh0XC9wbGFpbi9pICkgewogICAgICAgICRPdXRwdXQgPSAnPHA+PGkgY2xhc3M9InNtYWxsIj4kVGV4dHsiVGhpcyBpcyBhIn0gJwogICAgICAgICAgICAuICRQYXJhbXtNaW1lVHlwZX0KICAgICAgICAgICAgLiAnICRUZXh0eyJlbWFpbCJ9LCAnCiAgICAgICAgICAgIC4gJzxhIGhyZWY9IicKICAgICAgICAgICAgLiAkU2VsZi0+e0Jhc2VsaW5rfQogICAgICAgICAgICAuICJBY3Rpb249JFBhcmFte0FjdGlvbn07VGlja2V0SUQ9IgogICAgICAgICAgICAuICIkUGFyYW17VGlja2V0SUR9O0FydGljbGVJRD0kUGFyYW17QXJ0aWNsZUlEfTtTdWJhY3Rpb249U2hvd0hUTUxlTWFpbFwiICIKICAgICAgICAgICAgLiAndGFyZ2V0PSJIVE1MZU1haWwiICcKICAgICAgICAgICAgLiAnb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9XCckVGV4dHsib3BlbiBpdCBpbiBhIG5ldyB3aW5kb3cifVwnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9XCdcJzsiPicKICAgICAgICAgICAgLiAnJFRleHR7ImNsaWNrIGhlcmUifTwvYT4gJwogICAgICAgICAgICAuICckVGV4dHsidG8gb3BlbiBpdCBpbiBhIG5ldyB3aW5kb3cuIn08L2k+PC9wPic7CiAgICB9CgogICAgIyBqdXN0IHRvIGJlIGNvbXBhdAogICAgZWxzaWYgKCAkUGFyYW17Qm9keX0gPX4gL148LkRPQ1RZUEUgaHRtbCBQVUJMSUN8XjxIVE1MPi9pICkgewogICAgICAgICRPdXRwdXQgPSAnPHA+PGkgY2xhc3M9InNtYWxsIj4kVGV4dHsiVGhpcyBpcyBhIn0gJwogICAgICAgICAgICAuICRQYXJhbXtNaW1lVHlwZX0KICAgICAgICAgICAgLiAnICRUZXh0eyJlbWFpbCJ9LCAnCiAgICAgICAgICAgIC4gJzxhIGhyZWY9IicKICAgICAgICAgICAgLiAkU2VsZi0+e0Jhc2VsaW5rfQogICAgICAgICAgICAuICdBY3Rpb249JEVudnsiQWN0aW9uIn07VGlja2V0SUQ9JwogICAgICAgICAgICAuICIkUGFyYW17VGlja2V0SUR9O0FydGljbGVJRD0kUGFyYW17QXJ0aWNsZUlEfTtTdWJhY3Rpb249U2hvd0hUTUxlTWFpbFwiICIKICAgICAgICAgICAgLiAndGFyZ2V0PSJIVE1MZU1haWwiICcKICAgICAgICAgICAgLiAnb25tb3VzZW92ZXI9IndpbmRvdy5zdGF0dXM9XCckVGV4dHsib3BlbiBpdCBpbiBhIG5ldyB3aW5kb3cifVwnOyByZXR1cm4gdHJ1ZTsiIG9ubW91c2VvdXQ9IndpbmRvdy5zdGF0dXM9XCdcJzsiPicKICAgICAgICAgICAgLiAnJFRleHR7ImNsaWNrIGhlcmUifTwvYT4gJwogICAgICAgICAgICAuICckVGV4dHsidG8gb3BlbiBpdCBpbiBhIG5ldyB3aW5kb3cuIn08L2k+PC9wPic7CiAgICB9CgogICAgIyByZXR1cm4gbm90ZSBzdHJpbmcKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgUmV0dXJuVmFsdWUgewogICAgbXkgKCAkU2VsZiwgJFdoYXQgKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+eyRXaGF0fTsKfQoKPWl0ZW0gQXR0YWNobWVudCgpCgpyZXR1cm5zIGJyb3dzZXIgb3V0cHV0IHRvIGRpc3BsYXkvZG93bmxvYWQgYSBhdHRhY2htZW50CgogICAgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLCAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdDogYXR0YWNobWVudCwgcG9zc2libGU6IGlubGluZXxhdHRhY2htZW50CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0ZpbGVOYW1lLnBuZycsICAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2ltYWdlL3BuZycsCiAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICApOwoKICAgIG9yIGZvciBBSkFYIGh0bWwgc25pcHBzCgogICAgJEhUTUwgPSAkTGF5b3V0T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLCAgICAgICAgIyBvcHRpb25hbCwgZGVmYXVsdDogYXR0YWNobWVudCwgcG9zc2libGU6IGlubGluZXxhdHRhY2htZW50CiAgICAgICAgRmlsZW5hbWUgICAgPT4gJ0ZpbGVOYW1lLmh0bWwnLCAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgQ2hhcnNldCAgICAgPT4gJ3V0Zi04JywgICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgQ29udGVudCAgICAgPT4gJENvbnRlbnQsCiAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwgICAgICAgICAgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciAocXcoQ29udGVudCBDb250ZW50VHlwZSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJHb3Qgbm8gJF8hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPkZhdGFsRXJyb3IoKTsKICAgICAgICB9CiAgICB9CgogICAgIyByZXR1cm4gYXR0YWNobWVudAogICAgbXkgJE91dHB1dCA9ICdDb250ZW50LURpc3Bvc2l0aW9uOiAnOwogICAgaWYgKCAkUGFyYW17VHlwZX0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAkUGFyYW17VHlwZX07CiAgICAgICAgJE91dHB1dCAuPSAnOyAnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQXR0YWNobWVudERvd25sb2FkVHlwZScpIHx8ICdhdHRhY2htZW50JzsKICAgICAgICAkT3V0cHV0IC49ICc7ICc7CiAgICB9CgogICAgIyBjbGVhbiBmaWxlbmFtZSB0byBnZXQgbm8gcHJvYmxlbXMgd2l0aCBzb21lIGJyb3dzZXJzCiAgICBpZiAoICRQYXJhbXtGaWxlbmFtZX0gKSB7CgogICAgICAgICMgZGV0ZWN0IGlmIElFIHdvcmthcm91bmQgaXMgdXNlZCAoc29sdXRpb24gZm9yIElFIHByb2JsZW0gd2l0aCBtdWx0aSBieXRlIGZpbGVuYW1lKQogICAgICAgICMgdG8gc29sdmUgdGhpcyBraW5kIG9mIHByb2JsZW1zIHVzZSB0aGUgZm9sbG93aW5nIGluIGR0bCBmb3IgYXR0YWNobWVudCBkb3dubG9hZHM6CiAgICAgICAgIyA8YSBocmVmPSIkRW52eyJDR0lIYW5kbGUifS8kTFFEYXRheyJGaWxlbmFtZSJ9P0FjdGlvbj0uLi4iPnh4eDwvYT4KICAgICAgICBteSAkRmlsZW5hbWVJbkhlYWRlciA9IDE7CgogICAgICAgICMgY2hlY2sgaWYgYnJvd3NlciBpcyBicm9rZW4KICAgICAgICBpZiAoICRTZWxmLT57QnJvd3NlckJyZWFrRGlzcG9zaXRpb25IZWFkZXJ9ICYmICRFTlZ7UkVRVUVTVF9VUkl9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiBJRSB3b3JrYXJvdW5kIGlzIHVzZWQKICAgICAgICAgICAgaWYgKCAkRU5We1JFUVVFU1RfVVJJfSA9fiAvXFEkU2VsZi0+e0NHSUhhbmRsZX1cRVwvLis/XD9BY3Rpb249LyApIHsKICAgICAgICAgICAgICAgICRGaWxlbmFtZUluSGVhZGVyID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBvbmx5IGRlbGl2ZXIgZmlsZW5hbWUgaWYgbmVlZGVkCiAgICAgICAgaWYgKCRGaWxlbmFtZUluSGVhZGVyKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gIiBmaWxlbmFtZT1cIiRQYXJhbXtGaWxlbmFtZX1cIiI7CiAgICAgICAgfQogICAgfQogICAgJE91dHB1dCAuPSAiXG4iOwoKICAgICMgZ2V0IGF0dGFjaG1lbnQgc2l6ZQogICAgJFBhcmFte1NpemV9ID0gYnl0ZXM6Omxlbmd0aCggJFBhcmFte0NvbnRlbnR9ICk7CgogICAgIyBhZGQgbm8gY2FjaGUgaGVhZGVycwogICAgaWYgKCAkUGFyYW17Tm9DYWNoZX0gKSB7CiAgICAgICAgJE91dHB1dCAuPSAiRXhwaXJlczogVHVlLCAxIEphbiAxOTgwIDEyOjAwOjAwIEdNVFxuIjsKICAgICAgICAkT3V0cHV0IC49ICJDYWNoZS1Db250cm9sOiBuby1jYWNoZVxuIjsKICAgICAgICAkT3V0cHV0IC49ICJQcmFnbWE6IG5vLWNhY2hlXG4iOwogICAgfQogICAgJE91dHB1dCAuPSAiQ29udGVudC1MZW5ndGg6ICRQYXJhbXtTaXplfVxuIjsKCiAgICBpZiAoICRQYXJhbXtDaGFyc2V0fSApIHsKICAgICAgICAkT3V0cHV0IC49ICJDb250ZW50LVR5cGU6ICRQYXJhbXtDb250ZW50VHlwZX07IGNoYXJzZXQ9JFBhcmFte0NoYXJzZXR9O1xuXG4iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJE91dHB1dCAuPSAiQ29udGVudC1UeXBlOiAkUGFyYW17Q29udGVudFR5cGV9XG5cbiI7CiAgICB9CgogICAgIyBkaXNhYmxlIHV0ZjggZmxhZywgdG8gd3JpdGUgYmluYXJ5IHRvIG91dHB1dAogICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVPdXRwdXQoIFwkT3V0cHV0ICk7CiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dCggXCRQYXJhbXtDb250ZW50fSApOwoKICAgICMgZml4IGZvciBmaXJlZm94IEhFQUQgcHJvYmxlbQogICAgaWYgKCAhJEVOVntSRVFVRVNUX01FVEhPRH0gfHwgJEVOVntSRVFVRVNUX01FVEhPRH0gbmUgJ0hFQUQnICkgewogICAgICAgICRPdXRwdXQgLj0gJFBhcmFte0NvbnRlbnR9OwogICAgfQoKICAgICMgcmVzZXQgYmlubW9kZSwgZG9uJ3QgdXNlIHV0ZjgKICAgIGJpbm1vZGUgU1RET1VULCAnOmJ5dGVzJzsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKPWl0ZW0gUGFnZU5hdkJhcigpCgpnZW5lcmF0ZXMgYSBwYWdlIG5hdiBiYXIKCiAgICBteSAlUGFnZU5hdkJhciA9ICRMYXlvdXRPYmplY3QtPlBhZ2VOYXZCYXIoCiAgICAgICAgTGltaXQgICAgICAgPT4gMTAwLCAgICAgICAgICMgbWFya3MgcmVzdWx0IG9mIFRvdGFsSGl0cyByZWQgaWYgTGltaXQgaXMgZ2VyYXRlciB0aGVuIEFsbEhpdHMKICAgICAgICBXaW5kb3dTaXplICA9PiAxNSwgICAgICAgICAgIyBtYXggc2hvd24gcGFnZXMgdG8gY2xpY2sKICAgICAgICBTdGFydEhpdCAgICA9PiAxLCAgICAgICAgICAgIyBzdGFydCB0byBzaG93IGl0ZW1zCiAgICAgICAgUGFnZVNob3duICAgPT4gMTUsICAgICAgICAgICMgbnVtYmVyIG9mIHNob3duIGl0ZW1zIGEgcGFnZQogICAgICAgIEFsbEhpdHMgICAgID0+IDU2LCAgICAgICAgICAjIG51bWJlciBvZiB0b3RhbCBoaXRzCiAgICAgICAgQWN0aW9uICAgICAgPT4gJ0FnZW50WFhYJywgICMgZS4gZy4gJ0FjdGlvbj0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QWN0aW9ufQogICAgICAgIExpbmsgICAgICAgID0+ICRMaW5rLCAgICAgICAjIGUuIGcuICdTdWJhY3Rpb249VmlldzsnCiAgICAgICAgQUpBWFJlcGxhY2UgPT4gJ0lERWxlbWVudCcsICMgSURFbGVtZW50IHdoaWNoIHNob3VsZCBiZSByZXBsYWNlZAogICAgICAgIElEUHJlZml4ICAgID0+ICdUaWNrZXRzJywgICAjIFByZWZpeCBmb3IgdGhlIGlkIHBhcmFtZXRlcgogICAgKTsKCiAgICByZXR1cm4gdmFsdWVzIG9mIGhhc2gKCiAgICAgICAgVG90YWxIaXRzICAjIHRvdGFsIGhpdHMKICAgICAgICBSZXN1bHQgICAgICMgc2hvd24gaXRlbXMgZS4gZy4gIjEtNSIgb3IgIjE2LTMwIgogICAgICAgIFNpdGVOYXZCYXIgIyBodG1sIGZvciBwYWdlIG5hdiBiYXIgZS4gZy4gIjEgMiAzIDQiCgogICAgICAgIFJlc3VsdExvbmcgICAgICMgc2hvd24gaXRlbXMgZS4gZy4gIjEtNSBvZiAzMiIgb3IgIjE2LTMwIG9mIDY0IgogICAgICAgIFNpdGVOYXZCYXJMb25nICMgaHRtbCBmb3IgcGFnZSBuYXYgYmFyIGUuIGcuICJQYWdlOiAxIDIgMyA0IgoKPWN1dAoKc3ViIFBhZ2VOYXZCYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkTGltaXQgPSAkUGFyYW17TGltaXR9IHx8IDA7CiAgICAkUGFyYW17QWxsSGl0c30gID0gMCBpZiAoICEkUGFyYW17QWxsSGl0c30gKTsKICAgICRQYXJhbXtTdGFydEhpdH0gPSAwIGlmICggISRQYXJhbXtBbGxIaXRzfSApOwogICAgbXkgJFBhZ2VzID0gaW50KCAoICRQYXJhbXtBbGxIaXRzfSAvICRQYXJhbXtQYWdlU2hvd259ICkgKyAwLjk5OTk5ICk7CiAgICBteSAkUGFnZSAgPSBpbnQoICggJFBhcmFte1N0YXJ0SGl0fSAvICRQYXJhbXtQYWdlU2hvd259ICkgKyAwLjk5OTk5ICk7CiAgICBteSAkV2luZG93U2l6ZSA9ICRQYXJhbXtXaW5kb3dTaXplfSB8fCA1OwogICAgbXkgJElEUHJlZml4ICAgPSAkUGFyYW17SURQcmVmaXh9ICAgfHwgJ0dlbmVyaWMnOwoKICAgICMgYnVpbGQgUmVzdWx0cyAoMS01IG9yIDE2LTMwKQogICAgaWYgKCAkUGFyYW17QWxsSGl0c30gPj0gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gKSApIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAkUGFyYW17U3RhcnRIaXR9IC4gIi0iIC4gKCAkUGFyYW17U3RhcnRIaXR9ICsgJFBhcmFte1BhZ2VTaG93bn0gLSAxICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17UmVzdWx0c30gPSAiJFBhcmFte1N0YXJ0SGl0fS0kUGFyYW17QWxsSGl0c30iOwogICAgfQoKICAgICMgY2hlY2sgdG90YWwgaGl0cwogICAgaWYgKCAkTGltaXQgPT0gJFBhcmFte0FsbEhpdHN9ICkgewogICAgICAgICRQYXJhbXtUb3RhbEhpdHN9ID0gIjxzcGFuIGNsYXNzPVwiUGFnaW5hdGlvbkxpbWl0XCI+JFBhcmFte0FsbEhpdHN9PC9zcGFuPiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17VG90YWxIaXRzfSA9ICRQYXJhbXtBbGxIaXRzfTsKICAgIH0KCiAgICAjIGJ1aWxkIHBhZ2UgbmF2IGJhcgogICAgbXkgJFdpbmRvd1N0YXJ0ID0gc3ByaW50ZiggIiUuMGYiLCAoICRQYXJhbXtTdGFydEhpdH0gLyAkUGFyYW17UGFnZVNob3dufSApICk7CiAgICAkV2luZG93U3RhcnQgPSBpbnQoICggJFdpbmRvd1N0YXJ0IC8gJFdpbmRvd1NpemUgKSApICsgMTsKICAgICRXaW5kb3dTdGFydCA9ICggJFdpbmRvd1N0YXJ0ICogJFdpbmRvd1NpemUgKSAtICgkV2luZG93U2l6ZSk7CiAgICBteSAkQWN0aW9uID0gJFBhcmFte0FjdGlvbn0gfHwgJyc7CiAgICBteSAkTGluayAgID0gJFBhcmFte0xpbmt9ICAgfHwgJyc7CiAgICBteSAkQmFzZWxpbmsgPSAiJFNlbGYtPntCYXNlbGlua30kQWN0aW9uOyRMaW5rIjsKICAgIG15ICRpICAgICAgICA9IDA7CiAgICB3aGlsZSAoICRpIDw9ICggJFBhZ2VzIC0gMSApICkgewogICAgICAgICRpKys7CgogICAgICAgICMgc2hvdyBub3JtYWwgcGFnZSAxLDIsMywuLi4KICAgICAgICBpZiAoICRpIDw9ICggJFdpbmRvd1N0YXJ0ICsgJFdpbmRvd1NpemUgKSAmJiAkaSA+ICRXaW5kb3dTdGFydCApIHsKICAgICAgICAgICAgbXkgJEJhc2VsaW5rQWxsCiAgICAgICAgICAgICAgICA9ICRCYXNlbGluawogICAgICAgICAgICAgICAgLiAiU3RhcnRXaW5kb3c9JFdpbmRvd1N0YXJ0O1N0YXJ0SGl0PSIKICAgICAgICAgICAgICAgIC4gKCAoICggJGkgLSAxICkgKiAkUGFyYW17UGFnZVNob3dufSApICsgMSApOwogICAgICAgICAgICBteSAkU2VsZWN0ZWRQYWdlID0gIiI7CiAgICAgICAgICAgIG15ICRQYWdlTnVtYmVyICAgPSAkaTsKCiAgICAgICAgICAgIGlmICggJFBhZ2UgPT0gJGkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWRQYWdlID0gIiBjbGFzcz1cIlNlbGVjdGVkXCIiOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGFnZUFqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbCAgPT4gJEJhc2VsaW5rQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBBamF4UmVwbGFjZSAgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICAgICAgUGFnZU51bWJlciAgID0+ICRQYWdlTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZFBhZ2UgPT4gJFNlbGVjdGVkUGFnZQogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbCAgPT4gJEJhc2VsaW5rQWxsLAogICAgICAgICAgICAgICAgICAgICAgICBQYWdlTnVtYmVyICAgPT4gJFBhZ2VOdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIElEUHJlZml4ICAgICA9PiAkSURQcmVmaXgsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkUGFnZSA9PiAkU2VsZWN0ZWRQYWdlCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3ZlciB3aW5kb3cgIj4+IiBhbmQgIj58IgogICAgICAgIGVsc2lmICggJGkgPiAoICRXaW5kb3dTdGFydCArICRXaW5kb3dTaXplICkgKSB7CiAgICAgICAgICAgIG15ICRTdGFydFdpbmRvdyAgICAgPSAkV2luZG93U3RhcnQgKyAkV2luZG93U2l6ZSArIDE7CiAgICAgICAgICAgIG15ICRMYXN0U3RhcnRXaW5kb3cgPSBpbnQoICRQYWdlcyAvICRXaW5kb3dTaXplICk7CiAgICAgICAgICAgIG15ICRCYXNlbGlua0FsbEJhY2sgPSAkQmFzZWxpbmsgLiAiU3RhcnRIaXQ9IiAuICggJGkgLSAxICkgKiAkUGFyYW17UGFnZVNob3dufTsKICAgICAgICAgICAgbXkgJEJhc2VsaW5rQWxsTmV4dAogICAgICAgICAgICAgICAgPSAkQmFzZWxpbmsgLiAiU3RhcnRIaXQ9IiAuICggKCAkUGFyYW17UGFnZVNob3dufSAqICggJFBhZ2VzIC0gMSApICkgKyAxICk7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtBSkFYUmVwbGFjZX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUGFnZUZvcndhcmRBamF4JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxCYWNrID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsTmV4dCA9PiAkQmFzZWxpbmtBbGxOZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBBamF4UmVwbGFjZSAgICAgPT4gJFBhcmFte0FKQVhSZXBsYWNlfSwKICAgICAgICAgICAgICAgICAgICAgICAgSURQcmVmaXggICAgICAgID0+ICRJRFByZWZpeCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlRm9yd2FyZCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsQmFjayA9PiAkQmFzZWxpbmtBbGxCYWNrLAogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbE5leHQgPT4gJEJhc2VsaW5rQWxsTmV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgSURQcmVmaXggICAgICAgID0+ICRJRFByZWZpeCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJGkgPSA5OTk5OTk5OTsKICAgICAgICB9CgogICAgICAgICMgb3ZlciB3aW5kb3cgIjw8IiBhbmQgInw8IgogICAgICAgIGVsc2lmICggJGkgPCAkV2luZG93U3RhcnQgJiYgKCAkaSAtIDEgKSA8ICRQYWdlcyApIHsKICAgICAgICAgICAgbXkgJFN0YXJ0V2luZG93ICAgICA9ICRXaW5kb3dTdGFydCAtICRXaW5kb3dTaXplIC0gMTsKICAgICAgICAgICAgbXkgJEJhc2VsaW5rQWxsQmFjayA9ICRCYXNlbGluayAuICdTdGFydEhpdD0xO1N0YXJ0V2luZG93PTEnOwogICAgICAgICAgICBteSAkQmFzZWxpbmtBbGxOZXh0CiAgICAgICAgICAgICAgICA9ICRCYXNlbGluayAuICdTdGFydEhpdD0nIC4gKCAoICRXaW5kb3dTdGFydCAtIDEgKSAqICggJFBhcmFte1BhZ2VTaG93bn0gKSArIDEgKTsKCiAgICAgICAgICAgIGlmICggJFBhcmFte0FKQVhSZXBsYWNlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQYWdlQmFja0FqYXgnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBCYXNlbGlua0FsbEJhY2sgPT4gJEJhc2VsaW5rQWxsQmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxOZXh0ID0+ICRCYXNlbGlua0FsbE5leHQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFqYXhSZXBsYWNlICAgICA9PiAkUGFyYW17QUpBWFJlcGxhY2V9LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BhZ2VCYWNrJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgQmFzZWxpbmtBbGxCYWNrID0+ICRCYXNlbGlua0FsbEJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VsaW5rQWxsTmV4dCA9PiAkQmFzZWxpbmtBbGxOZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBJRFByZWZpeCAgICAgICAgPT4gJElEUHJlZml4LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSA9ICRXaW5kb3dTdGFydCAtIDE7CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtTZWFyY2hOYXZCYXJ9ID0gJFNlbGYtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgICA9PiAnUGFnaW5hdGlvbicsCiAgICAgICAgS2VlcFNjcmlwdFRhZ3MgPT4gJFBhcmFte0tlZXBTY3JpcHRUYWdzfSwKICAgICk7CgogICAgIyBvbmx5IHNob3cgdG90YWwgYW1vdW50IG9mIHBhZ2VzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUKICAgIGlmICggJFBhZ2VzID4gMSApIHsKICAgICAgICAkUGFyYW17TmF2QmFyTG9uZ30gPSAiLSBcJFRleHR7XCJQYWdlXCJ9OiAkUGFyYW17U2VhcmNoTmF2QmFyfSI7CiAgICB9CgogICAgIyByZXR1cm4gZGF0YQogICAgcmV0dXJuICgKICAgICAgICBUb3RhbEhpdHMgICAgICA9PiAkUGFyYW17VG90YWxIaXRzfSwKICAgICAgICBSZXN1bHQgICAgICAgICA9PiAkUGFyYW17UmVzdWx0c30sCiAgICAgICAgUmVzdWx0TG9uZyAgICAgPT4gIiRQYXJhbXtSZXN1bHRzfSBcJFRleHR7XCJvZlwifSAkUGFyYW17VG90YWxIaXRzfSIsCiAgICAgICAgU2l0ZU5hdkJhciAgICAgPT4gJFBhcmFte1NlYXJjaE5hdkJhcn0sCiAgICAgICAgU2l0ZU5hdkJhckxvbmcgPT4gJFBhcmFte05hdkJhckxvbmd9LAogICAgICAgIExpbmsgICAgICAgICAgID0+ICRQYXJhbXtMaW5rfSwKICAgICk7Cn0KCnN1YiBOYXZpZ2F0aW9uQmFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1R5cGV9ICkgewogICAgICAgICRQYXJhbXtUeXBlfSA9ICRTZWxmLT57TW9kdWxlUmVnfS0+e05hdkJhck5hbWV9IHx8ICdUaWNrZXQnOwogICAgfQoKICAgICMgY3JlYXRlIG1lbnUgaXRlbXMKICAgIG15ICVOYXZCYXI7CiAgICBteSAkRnJvbnRlbmRNb2R1bGVDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpOwoKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JEZyb250ZW5kTW9kdWxlQ29uZmlnfSApIHsKICAgICAgICBteSAlSGFzaCA9ICV7ICRGcm9udGVuZE1vZHVsZUNvbmZpZy0+eyRNb2R1bGV9IH07CiAgICAgICAgbmV4dCBpZiAhJEhhc2h7TmF2QmFyfTsKICAgICAgICBuZXh0IGlmIHJlZiAkSGFzaHtOYXZCYXJ9IG5lICdBUlJBWSc7CgogICAgICAgIG15IEBJdGVtcyA9IEB7ICRIYXNoe05hdkJhcn0gfTsKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICAgICBuZXh0IGlmICEkSXRlbS0+e05hdkJhcn07CiAgICAgICAgICAgICRJdGVtLT57Q1NTfSA9ICcnOwoKICAgICAgICAgICAgIyBoaWdobGlnaHQgYWN0aXZlIGFyZWEgbGluawogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoICRJdGVtLT57VHlwZX0gJiYgJEl0ZW0tPntUeXBlfSBlcSAnTWVudScgKQogICAgICAgICAgICAgICAgJiYgKCAkSXRlbS0+e05hdkJhcn0gJiYgJEl0ZW0tPntOYXZCYXJ9IGVxICRQYXJhbXtUeXBlfSApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRJdGVtLT57Q1NTfSAuPSAnIFNlbGVjdGVkJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcGVybWlzc2lvbnMgZnJvbSBtb2R1bGUgaWYgbm8gcGVybWlzc2lvbnMgYXJlIGRlZmluZWQgZm9yIHRoZSBpY29uCiAgICAgICAgICAgIGlmICggISRJdGVtLT57R3JvdXBSb30gJiYgISRJdGVtLT57R3JvdXB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkSGFzaHtHcm91cFJvfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0dyb3VwUm99ID0gJEhhc2h7R3JvdXBSb307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRIYXNoe0dyb3VwfSApIHsKICAgICAgICAgICAgICAgICAgICAkSXRlbS0+e0dyb3VwfSA9ICRIYXNoe0dyb3VwfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBzaG93biBwZXJtaXNzaW9uCiAgICAgICAgICAgIG15ICRTaG93biA9IDA7CiAgICAgICAgICAgIGZvciBteSAkUGVybWlzc2lvbiAocXcoR3JvdXBSbyBHcm91cCkpIHsKCiAgICAgICAgICAgICAgICAjIGFycmF5IGFjY2VzcyByZXN0cmljdGlvbgogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+eyRQZXJtaXNzaW9ufSAmJiByZWYgJEl0ZW0tPnskUGVybWlzc2lvbn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKCBAeyAkSXRlbS0+eyRQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkS2V5ID0gJ1VzZXJJcycgLiAkUGVybWlzc2lvbiAuICdbJyAuICRfIC4gJ10nOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57JEtleX0gJiYgJFNlbGYtPnskS2V5fSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTaG93biA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2NhbGFyIGFjY2VzcyByZXN0cmljdGlvbgogICAgICAgICAgICAgICAgZWxzaWYgKCAkSXRlbS0+eyRQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkS2V5ID0gJ1VzZXJJcycgLiAkUGVybWlzc2lvbiAuICdbJyAuICRJdGVtLT57JFBlcm1pc3Npb259IC4gJ10nOwogICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPnskS2V5fSAmJiAkU2VsZi0+eyRLZXl9IGVxICdZZXMnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIG5vIGFjY2VzcyByZXN0cmljdGlvbgogICAgICAgICAgICAgICAgZWxzaWYgKCAhJEl0ZW0tPntHcm91cFJvfSAmJiAhJEl0ZW0tPntHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgaWYgISRTaG93bjsKCiAgICAgICAgICAgICMgc2V0IHByaW8gb2YgaXRlbQogICAgICAgICAgICBteSAkS2V5ID0gKCAkSXRlbS0+e0Jsb2NrfSB8fCAnJyApIC4gc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICk7CiAgICAgICAgICAgIGZvciAoIDEgLi4gNTEgKSB7CiAgICAgICAgICAgICAgICBsYXN0IGlmICEkTmF2QmFyeyRLZXl9OwoKICAgICAgICAgICAgICAgICRJdGVtLT57UHJpb30rKzsKICAgICAgICAgICAgICAgICRLZXkgPSAoICRJdGVtLT57QmxvY2t9IHx8ICcnICkgLiBzcHJpbnRmKCAiJTA3ZCIsICRJdGVtLT57UHJpb30gKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzaG93IGFzIG1haW4gbWVudQogICAgICAgICAgICBpZiAoICRJdGVtLT57VHlwZX0gZXEgJ01lbnUnICkgewogICAgICAgICAgICAgICAgJE5hdkJhcnskS2V5fSA9ICRJdGVtOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYXMgc3ViIG9mIG1haW4gbWVudQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICROYXZCYXJ7U3VifS0+eyAkSXRlbS0+e05hdkJhcn0gfS0+eyRLZXl9ID0gJEl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBydW4gbWVudSBpdGVtIG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TmF2QmFyTW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpOYXZCYXJNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgPT4gJFNlbGYsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgaWYgISRPYmplY3Q7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhciA9ICggJU5hdkJhciwgJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBuYXYgYmFyCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlTmF2QmFyICkgewogICAgICAgIG5leHQgaWYgJEtleSBlcSAnU3ViJzsKICAgICAgICBuZXh0IGlmICEleyAkTmF2QmFyeyRLZXl9IH07CiAgICAgICAgbXkgJEl0ZW0gPSAkTmF2QmFyeyRLZXl9OwogICAgICAgICRJdGVtLT57TmFtZUZvcklEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgJEl0ZW0tPntOYW1lRm9ySUR9ID1+IHMvWyAmO10vL2lnOwogICAgICAgIG15ICRTdWIgPSAkTmF2QmFye1N1Yn0tPnsgJEl0ZW0tPntOYXZCYXJ9IH07CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSXRlbUFyZWEnLCAgICAjJE5hdkJhcnskX30tPntCbG9ja30gfHwgJ0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICUkSXRlbSwKICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkSXRlbS0+e0FjY2Vzc0tleX0gPyAiICgkSXRlbS0+e0FjY2Vzc0tleX0pIiA6ICcnLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgc2hvdyBzdWIgbWVudQogICAgICAgIG5leHQgaWYgISRTdWI7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJdGVtQXJlYVN1YicsCiAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRTdWJ9ICkgewogICAgICAgICAgICBteSAkSXRlbVN1YiA9ICRTdWItPnskS2V5fTsKICAgICAgICAgICAgJEl0ZW1TdWItPntOYW1lRm9ySUR9ID0gJEl0ZW1TdWItPntOYW1lfTsKICAgICAgICAgICAgJEl0ZW1TdWItPntOYW1lRm9ySUR9ID1+IHMvWyAmO10vL2lnOwogICAgICAgICAgICAkSXRlbVN1Yi0+e05hbWVUb3B9ID0gJEl0ZW0tPntOYW1lRm9ySUR9OwogICAgICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtQXJlYVN1Ykl0ZW0nLCAgICAjJEl0ZW0tPntCbG9ja30gfHwgJ0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJSRJdGVtU3ViLAogICAgICAgICAgICAgICAgICAgIEFjY2Vzc0tleVJlZmVyZW5jZSA9PiAkSXRlbVN1Yi0+e0FjY2Vzc0tleX0gPyAiICgkSXRlbVN1Yi0+e0FjY2Vzc0tleX0pIiA6ICcnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdBZ2VudE5hdmlnYXRpb25CYXInLCBEYXRhID0+IFwlUGFyYW0gKTsKCiAgICAjIHJ1biBub3RpZmljYXRpb24gbW9kdWxlcwogICAgbXkgJEZyb250ZW5kTm90aWZ5TW9kdWxlQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpOb3RpZnlNb2R1bGUnKTsKICAgIGlmICggcmVmICRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZyBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZ307CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkT3V0cHV0IC49ICRPYmplY3QtPlJ1biggJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gbmF2IGJhciBtb2R1bGVzCiAgICBpZiAoICRTZWxmLT57TW9kdWxlUmVnfS0+e05hdkJhck1vZHVsZX0gKSB7CgogICAgICAgICMgcnVuIG5hdmJhciBtb2R1bGVzCiAgICAgICAgbXkgJUpvYnMgPSAleyAkU2VsZi0+e01vZHVsZVJlZ30tPntOYXZCYXJNb2R1bGV9IH07CgogICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3tNb2R1bGV9ICk7CiAgICAgICAgbXkgJE9iamVjdCA9ICRKb2Jze01vZHVsZX0tPm5ldygKICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICApOwogICAgICAgIG5leHQgaWYgISRPYmplY3Q7CgogICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICRPdXRwdXQgLj0gJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiBcJUpvYnMgKTsKICAgIH0KICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgVHJhbnNmcm9tRGF0ZVNlbGVjdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGtleSBwcmVmaXgKICAgIG15ICRQcmVmaXggPSAkUGFyYW17UHJlZml4fSB8fCAnJzsKCiAgICAjIHRpbWUgem9uZSB0cmFuc2xhdGlvbiBpZiBuZWVkZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpbWVab25lVXNlcicpICYmICRTZWxmLT57VXNlclRpbWVab25lfSApIHsKICAgICAgICBteSAkVGltZVN0YW1wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAuICctJwogICAgICAgICAgICAgICAgLiAkUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0gLiAnLScKICAgICAgICAgICAgICAgIC4gJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSAuICcgJwogICAgICAgICAgICAgICAgLiAoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCApIC4gJzonCiAgICAgICAgICAgICAgICAuICggJFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfSB8fCAwICkKICAgICAgICAgICAgICAgIC4gJzowMCcsCiAgICAgICAgKTsKICAgICAgICAkVGltZVN0YW1wID0gJFRpbWVTdGFtcCAtICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICogMzYwMCApOwogICAgICAgICgKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ1NlY3VuZGUnIH0sCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0sCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9LAogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9LAogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0sCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9CiAgICAgICAgKSA9ICRTZWxmLT57VXNlclRpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFRpbWVTdGFtcCApOwogICAgfQoKICAgICMgcmVzZXQgcHJlZml4CiAgICAkUGFyYW17UHJlZml4fSA9ICcnOwoKICAgIHJldHVybiAlUGFyYW07Cn0KCnN1YiBCdWlsZERhdGVTZWxlY3Rpb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGF0ZUlucHV0U3R5bGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGltZUlucHV0Rm9ybWF0Jyk7CiAgICBteSAkUHJlZml4ICAgICAgICAgPSAkUGFyYW17UHJlZml4fSB8fCAnJzsKICAgIG15ICREaWZmVGltZSAgICAgICA9ICRQYXJhbXtEaWZmVGltZX0gfHwgMDsKICAgIG15ICRGb3JtYXQgICAgICAgICA9IGRlZmluZWQoICRQYXJhbXtGb3JtYXR9ICkgPyAkUGFyYW17Rm9ybWF0fSA6ICdEYXRlSW5wdXRGb3JtYXRMb25nJzsKICAgIG15ICRBcmVhICAgICAgICAgICA9ICRQYXJhbXtBcmVhfSB8fCAnQWdlbnQnOwogICAgbXkgJE9wdGlvbmFsICAgICAgID0gJFBhcmFteyAkUHJlZml4IC4gJ09wdGlvbmFsJyB9IHx8IDA7CiAgICBteSAkUmVxdWlyZWQgICAgICAgPSAkUGFyYW17ICRQcmVmaXggLiAnUmVxdWlyZWQnIH0gfHwgMDsKICAgIG15ICRVc2VkICAgICAgICAgICA9ICRQYXJhbXsgJFByZWZpeCAuICdVc2VkJyB9IHx8IDA7CiAgICBteSAkQ2xhc3MgICAgICAgICAgPSAkUGFyYW17ICRQcmVmaXggLiAnQ2xhc3MnIH0gfHwgJyc7CgogICAgIyBEZWZpbmVzLCBpZiB0aGUgZGF0ZSBzZWxlY3Rpb24gc2hvdWxkIGJlIHZhbGlkYXRlZCBvbiBjbGllbnQgc2lkZSB3aXRoIEpTCiAgICBteSAkVmFsaWRhdGUgPSAkUGFyYW17VmFsaWRhdGV9IHx8IDA7CgogICAgIyBWYWxpZGF0ZSB0aGF0IHRoZSBkYXRlIGlzIGluIHRoZSBmdXR1cmUgKGUuIGcuIHBlbmRpbmcgdGltZXMpCiAgICBteSAkVmFsaWRhdGVEYXRlSW5GdXR1cmUgPSAkUGFyYW17VmFsaWRhdGVEYXRlSW5GdXR1cmV9IHx8IDA7CgogICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1VzZXJUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntVc2VyVGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSArICREaWZmVGltZSwKICAgICk7CiAgICBteSAkRGF0ZXBpY2tlckhUTUwgPSAnJzsKCiAgICAjIHRpbWUgem9uZSB0cmFuc2xhdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaW1lWm9uZVVzZXInKQogICAgICAgICYmICRTZWxmLT57VXNlclRpbWVab25lfQogICAgICAgICYmICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9CiAgICAgICAgJiYgJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9CiAgICAgICAgJiYgJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkVGltZVN0YW1wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAuICctJwogICAgICAgICAgICAgICAgLiAkUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0gLiAnLScKICAgICAgICAgICAgICAgIC4gJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSAuICcgJwogICAgICAgICAgICAgICAgLiAoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICAgfHwgMCApIC4gJzonCiAgICAgICAgICAgICAgICAuICggJFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfSB8fCAwICkKICAgICAgICAgICAgICAgIC4gJzowMCcsCiAgICAgICAgKTsKICAgICAgICAkVGltZVN0YW1wID0gJFRpbWVTdGFtcCArICggJFNlbGYtPntVc2VyVGltZVpvbmV9ICogMzYwMCApOwogICAgICAgICgKICAgICAgICAgICAgJFBhcmFteyAkUHJlZml4IC4gJ1NlY3VuZGUnIH0sCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0sCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9LAogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9LAogICAgICAgICAgICAkUGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0sCiAgICAgICAgICAgICRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9CiAgICAgICAgKSA9ICRTZWxmLT57VXNlclRpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoIFN5c3RlbVRpbWUgPT4gJFRpbWVTdGFtcCApOwogICAgfQoKICAgICMgeWVhcgogICAgaWYgKCAkRGF0ZUlucHV0U3R5bGUgZXEgJ09wdGlvbicgKSB7CiAgICAgICAgbXkgJVllYXI7CiAgICAgICAgaWYgKCBkZWZpbmVkICRQYXJhbXtZZWFyUGVyaW9kUGFzdH0gJiYgZGVmaW5lZCAkUGFyYW17WWVhclBlcmlvZEZ1dHVyZX0gKSB7CiAgICAgICAgICAgIGZvciAoICRZIC0gJFBhcmFte1llYXJQZXJpb2RQYXN0fSAuLiAkWSArICRQYXJhbXtZZWFyUGVyaW9kRnV0dXJlfSApIHsKICAgICAgICAgICAgICAgICRZZWFyeyRffSA9ICRfOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBmb3IgKCAkWSAtIDEwIC4uICRZICsgMSArICggJFBhcmFte1llYXJEaWZmfSB8fCAwICkgKSB7CiAgICAgICAgICAgICAgICAkWWVhcnskX30gPSAkXzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkUGFyYW17WWVhcn0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRQcmVmaXggLiAnWWVhcicsCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlWWVhciwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSB8fCAkWSApLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkVmFsaWRhdGUgPyAnVmFsaWRhdGVfRGF0ZVllYXInIDogJycsCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1llYXInKSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1llYXJ9ID0gIjxpbnB1dCB0eXBlPVwidGV4dFwiICIKICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/ICJjbGFzcz1cIlZhbGlkYXRlX0RhdGVZZWFyICRDbGFzc1wiICIgOiAiY2xhc3M9XCIkQ2xhc3NcIiAiICkKICAgICAgICAgICAgLiAibmFtZT1cIiR7UHJlZml4fVllYXJcIiBpZD1cIiR7UHJlZml4fVllYXJcIiBzaXplPVwiNFwiIG1heGxlbmd0aD1cIjRcIiAiCiAgICAgICAgICAgIC4gInRpdGxlPVwiIgogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1llYXInKQogICAgICAgICAgICAuICJcIiB2YWx1ZT1cIiIKICAgICAgICAgICAgLiBzcHJpbnRmKCAiJTAyZCIsICggJFBhcmFteyAkUHJlZml4IC4gJ1llYXInIH0gfHwgJFkgKSApIC4gIlwiLz4iOwogICAgfQoKICAgICMgbW9udGgKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVNb250aDsKICAgICAgICBmb3IgKCAxIC4uIDEyICkgewogICAgICAgICAgICBteSAkVG1wID0gc3ByaW50ZiggIiUwMmQiLCAkXyApOwogICAgICAgICAgICAkTW9udGh7JF99ID0gJFRtcDsKICAgICAgICB9CiAgICAgICAgJFBhcmFte01vbnRofSA9ICRTZWxmLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFByZWZpeCAuICdNb250aCcsCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlTW9udGgsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+IGludCggJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9IHx8ICRNICksCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICdWYWxpZGF0ZV9EYXRlTW9udGgnIDogJycsCiAgICAgICAgICAgIFRpdGxlICAgICAgID0+ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ01vbnRoJyksCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtNb250aH0KICAgICAgICAgICAgPSAiPGlucHV0IHR5cGU9XCJ0ZXh0XCIgIgogICAgICAgICAgICAuICggJFZhbGlkYXRlID8gImNsYXNzPVwiVmFsaWRhdGVfRGF0ZU1vbnRoICRDbGFzc1wiICIgOiAiY2xhc3M9XCIkQ2xhc3NcIiAiICkKICAgICAgICAgICAgLiAibmFtZT1cIiR7UHJlZml4fU1vbnRoXCIgaWQ9XCIke1ByZWZpeH1Nb250aFwiIHNpemU9XCIyXCIgbWF4bGVuZ3RoPVwiMlwiICIKICAgICAgICAgICAgLiAidGl0bGU9XCIiCiAgICAgICAgICAgIC4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTW9udGgnKQogICAgICAgICAgICAuICJcIiB2YWx1ZT1cIiIKICAgICAgICAgICAgLiBzcHJpbnRmKCAiJTAyZCIsICggJFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9IHx8ICRNICkgKSAuICJcIi8+IjsKICAgIH0KCiAgICBteSAkRGF0ZVZhbGlkYXRlQ2xhc3NlcyA9ICcnOwogICAgaWYgKCRWYWxpZGF0ZSkgewogICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzCiAgICAgICAgICAgIC49ICJWYWxpZGF0ZV9EYXRlRGF5IFZhbGlkYXRlX0RhdGVZZWFyXyR7UHJlZml4fVllYXIgVmFsaWRhdGVfRGF0ZU1vbnRoXyR7UHJlZml4fU1vbnRoIjsKICAgICAgICBpZiAoJFZhbGlkYXRlRGF0ZUluRnV0dXJlKSB7CiAgICAgICAgICAgICREYXRlVmFsaWRhdGVDbGFzc2VzIC49ICIgVmFsaWRhdGVfRGF0ZUluRnV0dXJlIjsKICAgICAgICB9CiAgICB9CgogICAgIyBkYXkKICAgIGlmICggJERhdGVJbnB1dFN0eWxlIGVxICdPcHRpb24nICkgewogICAgICAgIG15ICVEYXk7CiAgICAgICAgZm9yICggMSAuLiAzMSApIHsKICAgICAgICAgICAgbXkgJFRtcCA9IHNwcmludGYoICIlMDJkIiwgJF8gKTsKICAgICAgICAgICAgJERheXskX30gPSAkVG1wOwogICAgICAgIH0KICAgICAgICAkUGFyYW17RGF5fSA9ICRTZWxmLT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFByZWZpeCAuICdEYXknLAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJURheSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gaW50KCAkUGFyYW17ICRQcmVmaXggLiAnRGF5JyB9IHx8ICREICksCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgID0+ICIkRGF0ZVZhbGlkYXRlQ2xhc3NlcyAkQ2xhc3MiLAogICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEYXknKSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0RheX0gPSAiPGlucHV0IHR5cGU9XCJ0ZXh0XCIgIgogICAgICAgICAgICAuICJjbGFzcz1cIiREYXRlVmFsaWRhdGVDbGFzc2VzICRDbGFzc1wiICIKICAgICAgICAgICAgLiAibmFtZT1cIiR7UHJlZml4fURheVwiIGlkPVwiJHtQcmVmaXh9RGF5XCIgc2l6ZT1cIjJcIiBtYXhsZW5ndGg9XCIyXCIgIgogICAgICAgICAgICAuICJ0aXRsZT1cIiIKICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdEYXknKQogICAgICAgICAgICAuICJcIiB2YWx1ZT1cIiIKICAgICAgICAgICAgLiBzcHJpbnRmKCAiJTAyZCIsICggJFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSB8fCAkRCApICkgLiAiXCIvPiI7CiAgICB9CiAgICBpZiAoICRGb3JtYXQgZXEgJ0RhdGVJbnB1dEZvcm1hdExvbmcnICkgewoKICAgICAgICAjIGhvdXIKICAgICAgICBpZiAoICREYXRlSW5wdXRTdHlsZSBlcSAnT3B0aW9uJyApIHsKICAgICAgICAgICAgbXkgJUhvdXI7CiAgICAgICAgICAgIGZvciAoIDAgLi4gMjMgKSB7CiAgICAgICAgICAgICAgICBteSAkVG1wID0gc3ByaW50ZiggIiUwMmQiLCAkXyApOwogICAgICAgICAgICAgICAgJEhvdXJ7JF99ID0gJFRtcDsKICAgICAgICAgICAgfQogICAgICAgICAgICAkUGFyYW17SG91cn0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnSG91cicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlSG91ciwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0gKQogICAgICAgICAgICAgICAgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9ICkKICAgICAgICAgICAgICAgIDogaW50KCRoKSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkVmFsaWRhdGUgPyAoICdWYWxpZGF0ZV9EYXRlSG91ciAnIC4gJENsYXNzICkgOiAkQ2xhc3MsCiAgICAgICAgICAgICAgICBUaXRsZSAgICAgICA9PiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdIb3VycycpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte0hvdXJ9ID0gIjxpbnB1dCB0eXBlPVwidGV4dFwiICIKICAgICAgICAgICAgICAgIC4gKCAkVmFsaWRhdGUgPyAiY2xhc3M9XCJWYWxpZGF0ZV9EYXRlSG91ciAkQ2xhc3NcIiAiIDogImNsYXNzPVwiJENsYXNzXCIgIiApCiAgICAgICAgICAgICAgICAuICJuYW1lPVwiJHtQcmVmaXh9SG91clwiIGlkPVwiJHtQcmVmaXh9SG91clwiIHNpemU9XCIyXCIgbWF4bGVuZ3RoPVwiMlwiICIKICAgICAgICAgICAgICAgIC4gInRpdGxlPVwiIgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdIb3VycycpCiAgICAgICAgICAgICAgICAuICJcIiB2YWx1ZT1cIiIKICAgICAgICAgICAgICAgIC4gc3ByaW50ZigKICAgICAgICAgICAgICAgICIlMDJkIiwKICAgICAgICAgICAgICAgICggZGVmaW5lZCggJFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0gKSA/IGludCggJFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0gKSA6ICRoICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIC4gIlwiLz4iOwogICAgICAgIH0KCiAgICAgICAgIyBtaW51dGUKICAgICAgICBpZiAoICREYXRlSW5wdXRTdHlsZSBlcSAnT3B0aW9uJyApIHsKICAgICAgICAgICAgbXkgJU1pbnV0ZTsKICAgICAgICAgICAgZm9yICggMCAuLiA1OSApIHsKICAgICAgICAgICAgICAgIG15ICRUbXAgPSBzcHJpbnRmKCAiJTAyZCIsICRfICk7CiAgICAgICAgICAgICAgICAkTWludXRleyRffSA9ICRUbXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte01pbnV0ZX0gPSAkU2VsZi0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRQcmVmaXggLiAnTWludXRlJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVNaW51dGUsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgOiBpbnQoJG0pLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRWYWxpZGF0ZSA/ICggJ1ZhbGlkYXRlX0RhdGVNaW51dGUgJyAuICRDbGFzcyApIDogJENsYXNzLAogICAgICAgICAgICAgICAgVGl0bGUgICAgICAgPT4gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTWludXRlcycpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte01pbnV0ZX0gPSAiPGlucHV0IHR5cGU9XCJ0ZXh0XCIgIgogICAgICAgICAgICAgICAgLiAoICRWYWxpZGF0ZSA/ICJjbGFzcz1cIlZhbGlkYXRlX0RhdGVNaW51dGUgJENsYXNzXCIgIiA6ICJjbGFzcz1cIiRDbGFzc1wiICIgKQogICAgICAgICAgICAgICAgLiAibmFtZT1cIiR7UHJlZml4fU1pbnV0ZVwiIGlkPVwiJHtQcmVmaXh9TWludXRlXCIgc2l6ZT1cIjJcIiBtYXhsZW5ndGg9XCIyXCIgIgogICAgICAgICAgICAgICAgLiAidGl0bGU9XCIiCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ01pbnV0ZXMnKQogICAgICAgICAgICAgICAgLiAiXCIgdmFsdWU9XCIiCiAgICAgICAgICAgICAgICAuIHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTAyZCIsCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCggJFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfSApCiAgICAgICAgICAgICAgICAgICAgPyBpbnQoICRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gKQogICAgICAgICAgICAgICAgICAgIDogJG0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApIC4gIlwiLz4iOwogICAgICAgIH0KICAgIH0KCiAgICAjIEdldCBmaXJzdCBkYXkgb2YgdGhlIHdlZWsKICAgIG15ICRXZWVrRGF5U3RhcnQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ2FsZW5kYXJXZWVrRGF5U3RhcnQnKSB8fCAxOwoKICAgICMgRGF0ZXBpY2tlcgogICAgJERhdGVwaWNrZXJIVE1MID0gJzwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICAgICBDb3JlLlVJLkRhdGVwaWNrZXIuSW5pdCh7CiAgICAgICAgICAgIERheTogJChcJyMnIC4gJFByZWZpeCAuICdEYXlcJyksCiAgICAgICAgICAgIE1vbnRoOiAkKFwnIycgLiAkUHJlZml4IC4gJ01vbnRoXCcpLAogICAgICAgICAgICBZZWFyOiAkKFwnIycgLiAkUHJlZml4IC4gJ1llYXJcJyksCiAgICAgICAgICAgIEhvdXI6ICQoXCcjJyAuICRQcmVmaXggLiAnSG91clwnKSwKICAgICAgICAgICAgTWludXRlOiAkKFwnIycgLiAkUHJlZml4IC4gJ01pbnV0ZVwnKSwKICAgICAgICAgICAgRGF0ZUluRnV0dXJlOiAnIC4gKCAkVmFsaWRhdGVEYXRlSW5GdXR1cmUgPyAndHJ1ZScgOiAnZmFsc2UnICkgLiAnLAogICAgICAgICAgICBXZWVrRGF5U3RhcnQ6ICcgLiAkV2Vla0RheVN0YXJ0IC4gJwogICAgICAgIH0pOwogICAgLy9dXT48L3NjcmlwdD4KICAgIDwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4nOwoKICAgIG15ICRPdXRwdXQ7CgogICAgIyBvcHRpb25hbCBjaGVja2JveAogICAgaWYgKCRPcHRpb25hbCkgewogICAgICAgIG15ICRDaGVja2VkICAgICAgID0gJyc7CiAgICAgICAgbXkgJFZhbGlkYXRlQ2xhc3MgPSAnJzsKICAgICAgICBpZiAoJFVzZWQpIHsKICAgICAgICAgICAgJENoZWNrZWQgPSAnIGNoZWNrZWQ9ImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkVmFsaWRhdGVDbGFzcyA9ICcgY2xhc3M9IlZhbGlkYXRlX1JlcXVpcmVkIic7CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gIjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuYW1lPVwiIgogICAgICAgICAgICAuICRQcmVmaXgKICAgICAgICAgICAgLiAiVXNlZFwiIGlkPVwiIiAuICRQcmVmaXggLiAiVXNlZFwiIHZhbHVlPVwiMVwiIgogICAgICAgICAgICAuICRDaGVja2VkCiAgICAgICAgICAgIC4gJFZhbGlkYXRlQ2xhc3MKICAgICAgICAgICAgLiAiIHRpdGxlPVwiIgogICAgICAgICAgICAuICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NoZWNrIHRvIGFjdGl2YXRlIHRoaXMgZGF0ZScpCiAgICAgICAgICAgIC4gIlwiIC8+Jm5ic3A7IjsKICAgIH0KCiAgICAjIGRhdGUgZm9ybWF0CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5UaW1lKAogICAgICAgIEFjdGlvbiA9PiAnUmV0dXJuJywKICAgICAgICBGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsCiAgICAgICAgTW9kZSAgID0+ICdOb3ROdW1lcmljJywKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgICMgYWRkIERhdGVwaWNrZXIgSFRNTCB0byBvdXRwdXQKICAgICRPdXRwdXQgLj0gJERhdGVwaWNrZXJIVE1MOwoKICAgICMgc2V0IGdsb2JhbCB2YXIgdG8gdHJ1ZSB0byBhZGQgYSBibG9jayB0byB0aGUgZm9vdGVyIGxhdGVyCiAgICAkU2VsZi0+e0hhc0RhdGVwaWNrZXJ9ID0gMTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIEN1c3RvbWVyTG9naW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICAkUGFyYW17VGl0bGVBcmVhfSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0xvZ2luJykgLiAnIC0gJzsKCiAgICAjIHNldCBBY3Rpb24gcGFyYW1ldGVyIGZvciB0aGUgbG9hZGVyCiAgICAkU2VsZi0+e0FjdGlvbn0gPSAnQ3VzdG9tZXJMb2dpbic7CgogICAgIyBhZGQgY29va2llcyBpZiBleGlzdHMKICAgIGlmICggJFNlbGYtPntTZXRDb29raWVzfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2Vzc2lvblVzZUNvb2tpZScpICkgewogICAgICAgIGZvciAoIGtleXMgJXsgJFNlbGYtPntTZXRDb29raWVzfSB9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICJTZXQtQ29va2llOiAkU2VsZi0+e1NldENvb2tpZXN9LT57JF99XG4iOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG1lc3NhZ2Ugc2hvdWxkIGJlIHNob3duCiAgICBpZiAoICRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01lc3NhZ2UnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsb3N0IHBhc3N3b3JkIG91dHB1dAogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lclBhbmVsTG9zdFBhc3N3b3JkJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXI6OkF1dGhNb2R1bGUnKSBlcQogICAgICAgICdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJBdXRoOjpEQicKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmRMaW5rJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMb3N0UGFzc3dvcmQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBsb3N0IHBhc3N3b3JkIG91dHB1dAogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lclBhbmVsQ3JlYXRlQWNjb3VudCcpCiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyOjpBdXRoTW9kdWxlJykgZXEKICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQXV0aDo6REInCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3JlYXRlQWNjb3VudExpbmsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NyZWF0ZUFjY291bnQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICMgR2VuZXJhdGUgdGhlIG1pbmlmaWVkIENTUyBhbmQgSmF2YVNjcmlwdCBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSAoc2VlIExheW91dExvYWRlcikKICAgICRTZWxmLT5Mb2FkZXJDcmVhdGVDdXN0b21lckNTU0NhbGxzKCk7CiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJKU0NhbGxzKCk7CgogICAgIyBBZGQgaGVhZGVyIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJMb2dvJykgKSB7CiAgICAgICAgbXkgJUN1c3RvbWVyTG9nbyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBmb3IgbXkgJENTU1N0YXRlbWVudCAoIGtleXMgJUN1c3RvbWVyTG9nbyApIHsKICAgICAgICAgICAgaWYgKCAkQ1NTU3RhdGVtZW50IGVxICdVUkwnICkgewogICAgICAgICAgICAgICAgbXkgJFdlYlBhdGggPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgICAgICRXZWJQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH0gLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskQ1NTU3RhdGVtZW50fSA9ICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nbycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICRPdXRwdXQgLj0gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lckxvZ2luJywgRGF0YSA9PiBcJVBhcmFtICk7CgogICAgIyByZW1vdmUgdGhlIHZlcnNpb24gdGFnIGZyb20gdGhlIGhlYWRlciBpZiBjb25maWd1cmVkCiAgICAkU2VsZi0+X0Rpc2FibGVCYW5uZXJDaGVjayggT3V0cHV0UmVmID0+IFwkT3V0cHV0ICk7CgogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCnN1YiBDdXN0b21lckhlYWRlciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRUeXBlID0gJFBhcmFte1R5cGV9IHx8ICcnOwoKICAgICMgYWRkIGNvb2tpZXMgaWYgZXhpc3RzCiAgICBteSAkT3V0cHV0ID0gJyc7CiAgICBpZiAoICRTZWxmLT57U2V0Q29va2llc30gJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1Nlc3Npb25Vc2VDb29raWUnKSApIHsKICAgICAgICBmb3IgKCBrZXlzICV7ICRTZWxmLT57U2V0Q29va2llc30gfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAiU2V0LUNvb2tpZTogJFNlbGYtPntTZXRDb29raWVzfS0+eyRffVxuIjsKICAgICAgICB9CiAgICB9CgogICAgIyBhcmVhIGFuZCB0aXRsZQogICAgaWYgKAogICAgICAgICEkUGFyYW17QXJlYX0KICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0FyZWF9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgICAgIC0+e05hdkJhck5hbWV9IHx8ICcnOwogICAgfQogICAgaWYgKAogICAgICAgICEkUGFyYW17VGl0bGV9CiAgICAgICAgJiYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57ICRTZWxmLT57QWN0aW9ufSB9CiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtUaXRsZX0KICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBpZiAoCiAgICAgICAgISRQYXJhbXtBcmVhfQogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte0FyZWF9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1B1YmxpY0Zyb250ZW5kOjpNb2R1bGUnKS0+eyAkU2VsZi0+e0FjdGlvbn0gfQogICAgICAgICAgICAtPntOYXZCYXJOYW1lfSB8fCAnJzsKICAgIH0KICAgIGlmICgKICAgICAgICAhJFBhcmFte1RpdGxlfQogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFBhcmFte1RpdGxlfQogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0tPntUaXRsZX0KICAgICAgICAgICAgfHwgJyc7CiAgICB9CiAgICBmb3IgbXkgJFdvcmQgKHF3KFZhbHVlIFRpdGxlIEFyZWEpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JFdvcmR9ICkgewogICAgICAgICAgICAkUGFyYW17VGl0bGVBcmVhfSAuPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17JFdvcmR9ICkgLiAnIC0gJzsKICAgICAgICB9CiAgICB9CgogICAgbXkgJEZyb250ZW5kOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJGcm9udGVuZDo6TW9kdWxlJyktPnsgJFNlbGYtPntBY3Rpb259IH0gKSB7CiAgICAgICAgJEZyb250ZW5kID0gJ0N1c3RvbWVyJzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRGcm9udGVuZCA9ICdQdWJsaWMnOwogICAgfQoKICAgICMgcnVuIGhlYWRlciBtZXRhIG1vZHVsZXMgb25seSBvbiBjdXN0b21lciBmcm9udGVuZHMKICAgIG15ICRIZWFkZXJNZXRhTW9kdWxlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRGcm9udGVuZCAuICdGcm9udGVuZDo6SGVhZGVyTWV0YU1vZHVsZScgKTsKICAgIGlmICggcmVmICRIZWFkZXJNZXRhTW9kdWxlIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7JEhlYWRlck1ldGFNb2R1bGV9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIGFuZCBydW4gbW9kdWxlCiAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBMYXlvdXRPYmplY3QgPT4gJFNlbGYgKTsKICAgICAgICAgICAgbmV4dCBpZiAhJE9iamVjdDsKICAgICAgICAgICAgJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNldCBydGwgaWYgbmVlZGVkCiAgICBpZiAoICRTZWxmLT57VGV4dERpcmVjdGlvbn0gJiYgJFNlbGYtPntUZXh0RGlyZWN0aW9ufSBlcSAncnRsJyApIHsKICAgICAgICAkUGFyYW17Qm9keUNsYXNzfSA9ICdSVEwnOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OkRlYnVnTW9kZScpICkgewogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRGVidWdSVExCdXR0b24nLAogICAgICAgICk7CiAgICB9CgogICAgIyBBZGQgaGVhZGVyIGxvZ28sIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggZGVmaW5lZCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJMb2dvJykgKSB7CiAgICAgICAgbXkgJUN1c3RvbWVyTG9nbyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckxvZ28nKSB9OwogICAgICAgIG15ICVEYXRhOwoKICAgICAgICBmb3IgbXkgJENTU1N0YXRlbWVudCAoIGtleXMgJUN1c3RvbWVyTG9nbyApIHsKICAgICAgICAgICAgaWYgKCAkQ1NTU3RhdGVtZW50IGVxICdVUkwnICkgewogICAgICAgICAgICAgICAgbXkgJFdlYlBhdGggPSAnJzsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyTG9nb3skQ1NTU3RhdGVtZW50fSAhfiAvKGh0dHB8ZnRwfGh0dHBzKTpcLy9pICkgewogICAgICAgICAgICAgICAgICAgICRXZWJQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpXZWJQYXRoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRGF0YXsnVVJMJ30gPSAndXJsKCcgLiAkV2ViUGF0aCAuICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH0gLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkRGF0YXskQ1NTU3RhdGVtZW50fSA9ICRDdXN0b21lckxvZ297JENTU1N0YXRlbWVudH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nb0NTUycsCiAgICAgICAgICAgIERhdGEgPT4gXCVEYXRhLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSGVhZGVyTG9nbycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEdlbmVyYXRlIHRoZSBtaW5pZmllZCBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKICAgICMgYW5kIHRoZSB0YWdzIHJlZmVyZW5jaW5nIHRoZW0gKHNlZSBMYXlvdXRMb2FkZXIpCiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJDU1NDYWxscygpOwoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgJE91dHB1dCAuPSAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAiQ3VzdG9tZXJIZWFkZXIkVHlwZSIsCiAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICApOwoKICAgICMgcmVtb3ZlIHRoZSB2ZXJzaW9uIHRhZyBmcm9tIHRoZSBoZWFkZXIgaWYgY29uZmlndXJlZAogICAgJFNlbGYtPl9EaXNhYmxlQmFubmVyQ2hlY2soIE91dHB1dFJlZiA9PiBcJE91dHB1dCApOwoKICAgIHJldHVybiAkT3V0cHV0Owp9CgpzdWIgQ3VzdG9tZXJGb290ZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVHlwZSAgICAgICAgICA9ICRQYXJhbXtUeXBlfSAgICAgICAgICAgfHwgJyc7CiAgICBteSAkSGFzRGF0ZXBpY2tlciA9ICRTZWxmLT57SGFzRGF0ZXBpY2tlcn0gfHwgMDsKCiAgICAjIEdlbmVyYXRlIHRoZSBtaW5pZmllZCBDU1MgYW5kIEphdmFTY3JpcHQgZmlsZXMKICAgICMgYW5kIHRoZSB0YWdzIHJlZmVyZW5jaW5nIHRoZW0gKHNlZSBMYXlvdXRMb2FkZXIpCiAgICAkU2VsZi0+TG9hZGVyQ3JlYXRlQ3VzdG9tZXJKU0NhbGxzKCk7CgogICAgIyBnZXQgZGF0ZXBpY2tlciBkYXRhLCBpZiBuZWVkZWQgaW4gbW9kdWxlCiAgICBpZiAoJEhhc0RhdGVwaWNrZXIpIHsKICAgICAgICBteSAkVmFjYXRpb25EYXlzICAgICA9ICRTZWxmLT5EYXRlcGlja2VyR2V0VmFjYXRpb25EYXlzKCk7CiAgICAgICAgbXkgJFZhY2F0aW9uRGF5c0pTT04gPSAkU2VsZi0+SlNPTkVuY29kZSgKICAgICAgICAgICAgRGF0YSA9PiAkVmFjYXRpb25EYXlzLAogICAgICAgICk7CgogICAgICAgIG15ICRUZXh0RGlyZWN0aW9uID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPntUZXh0RGlyZWN0aW9ufSB8fCAnJzsKCiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEYXRlcGlja2VyRGF0YScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVmFjYXRpb25EYXlzID0+ICRWYWNhdGlvbkRheXNKU09OLAogICAgICAgICAgICAgICAgSXNSVExMYW5ndWFnZSA9PiAoICRUZXh0RGlyZWN0aW9uIGVxICdydGwnICkgPyAxIDogMCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgQmFubmVyCiAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2VjdXJlOjpEaXNhYmxlQmFubmVyJykgKSB7CiAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCYW5uZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICJDdXN0b21lckZvb3RlciRUeXBlIiwgRGF0YSA9PiBcJVBhcmFtICk7Cn0KCnN1YiBDdXN0b21lckZhdGFsRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgQ2FsbGVyICAgPT4gMSwKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJFBhcmFte01lc3NhZ2V9LAogICAgICAgICk7CiAgICB9CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPkN1c3RvbWVySGVhZGVyKCBBcmVhID0+ICdGcm9udGVuZCcsIFRpdGxlID0+ICdGYXRhbCBFcnJvcicgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPkVycm9yKCVQYXJhbSk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT5DdXN0b21lckZvb3RlcigpOwogICAgJFNlbGYtPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXQgKTsKICAgIGV4aXQ7Cn0KCnN1YiBDdXN0b21lck5hdmlnYXRpb25CYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNyZWF0ZSBtZW51IGl0ZW1zCiAgICBteSAlTmF2QmFyTW9kdWxlOwogICAgbXkgJEZyb250ZW5kTW9kdWxlQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpOwoKICAgIGZvciBteSAkTW9kdWxlICggc29ydCBrZXlzICV7JEZyb250ZW5kTW9kdWxlQ29uZmlnfSApIHsKICAgICAgICBteSAlSGFzaCA9ICV7ICRGcm9udGVuZE1vZHVsZUNvbmZpZy0+eyRNb2R1bGV9IH07CiAgICAgICAgbmV4dCBpZiAhJEhhc2h7TmF2QmFyfTsKICAgICAgICBuZXh0IGlmIHJlZiAkSGFzaHtOYXZCYXJ9IG5lICdBUlJBWSc7CgogICAgICAgIG15IEBJdGVtcyA9IEB7ICRIYXNoe05hdkJhcn0gfTsKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewogICAgICAgICAgICBuZXh0IGlmICEkSXRlbTsKCiAgICAgICAgICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgICAgICAgICAgbXkgJFNob3duID0gMDsKCiAgICAgICAgICAgICMgZ2V0IHBlcm1pc3Npb25zIGZyb20gbW9kdWxlIGlmIG5vIHBlcm1pc3Npb25zIGFyZSBkZWZpbmVkIGZvciB0aGUgaWNvbgogICAgICAgICAgICBpZiAoICEkSXRlbS0+e0dyb3VwUm99ICYmICEkSXRlbS0+e0dyb3VwfSApIHsKICAgICAgICAgICAgICAgIGlmICggJEhhc2h7R3JvdXBSb30gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cFJvfSA9ICRIYXNoe0dyb3VwUm99OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkSGFzaHtHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEl0ZW0tPntHcm91cH0gPSAkSGFzaHtHcm91cH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgc2hvd24gcGVybWlzc2lvbgogICAgICAgICAgICBmb3IgbXkgJFBlcm1pc3Npb24gKHF3KEdyb3VwUm8gR3JvdXApKSB7CgogICAgICAgICAgICAgICAgIyBhcnJheSBhY2Nlc3MgcmVzdHJpY3Rpb24KICAgICAgICAgICAgICAgIGlmICggJEl0ZW0tPnskUGVybWlzc2lvbn0gJiYgcmVmICRJdGVtLT57JFBlcm1pc3Npb259IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRUeXBlICggQHsgJEl0ZW0tPnskUGVybWlzc2lvbn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEtleSA9ICdVc2VySXMnIC4gJFBlcm1pc3Npb24gLiAnWycgLiAkVHlwZSAuICddJzsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+eyRLZXl9ICYmICRTZWxmLT57JEtleX0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2hvd24gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHNjYWxhciBhY2Nlc3MgcmVzdHJpY3Rpb24KICAgICAgICAgICAgICAgIGVsc2lmICggJEl0ZW0tPnskUGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEtleSA9ICdVc2VySXMnIC4gJFBlcm1pc3Npb24gLiAnWycgLiAkSXRlbS0+eyRQZXJtaXNzaW9ufSAuICddJzsKICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57JEtleX0gJiYgJFNlbGYtPnskS2V5fSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNob3duID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBubyBhY2Nlc3MgcmVzdHJpY3Rpb24KICAgICAgICAgICAgICAgIGVsc2lmICggISRJdGVtLT57R3JvdXBSb30gJiYgISRJdGVtLT57R3JvdXB9ICkgewogICAgICAgICAgICAgICAgICAgICRTaG93biA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IGlmICEkU2hvd247CgogICAgICAgICAgICAjIHNldCBwcmlvIG9mIGl0ZW0KICAgICAgICAgICAgbXkgJEtleSA9IHNwcmludGYoICIlMDdkIiwgJEl0ZW0tPntQcmlvfSApOwogICAgICAgICAgICBmb3IgKCAxIC4uIDUxICkgewogICAgICAgICAgICAgICAgbGFzdCBpZiAhJE5hdkJhck1vZHVsZXskS2V5fTsKCiAgICAgICAgICAgICAgICAkSXRlbS0+e1ByaW99Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5hdkJhck1vZHVsZXsgc3ByaW50ZiggIiUwN2QiLCAkSXRlbS0+e1ByaW99ICkgfSA9ICRJdGVtOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBtZW51IGl0ZW0gbW9kdWxlcwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok5hdkJhck1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOYXZCYXJNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KAogICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgICAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRTZWxmLT57TG9nT2JqZWN0fSwKICAgICAgICAgICAgICAgIERCT2JqZWN0ICAgICA9PiAkU2VsZi0+e0RCT2JqZWN0fSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgJU5hdkJhck1vZHVsZSA9ICggJU5hdkJhck1vZHVsZSwgJE9iamVjdC0+UnVuKCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICk7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUb3RhbCAgID0ga2V5cyAlTmF2QmFyTW9kdWxlOwogICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICMgT25seSBoaWdobGlnaHQgdGhlIGZpcnN0IG1hdGNoZWQgbmF2aWdhdGlvbiBlbnRyeS4gSWYgdGhlcmUgYXJlIHNldmVyYWwgZW50cmllcwogICAgIyAgIHdpdGggdGhlIHNhbWUgQWN0aW9uIGFuZCBTdWJhY3Rpb24sIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIHdoaWNoIG9uZSB3YXMgdXNlZC4KICAgICMgICBUaGVyZWZvcmUgd2UganVzdCBoaWdobGlnaHQgdGhlIGZpcnN0IG9uZS4KICAgIG15ICRTZWxlY3RlZEZsYWc7CgogICAgZm9yIG15ICRJdGVtICggc29ydCBrZXlzICVOYXZCYXJNb2R1bGUgKSB7CiAgICAgICAgbmV4dCBpZiAhJXsgJE5hdkJhck1vZHVsZXskSXRlbX0gfTsKICAgICAgICAkQ291bnRlcisrOwoKICAgICAgICAjIGhpZ2hsaWdodCBhY3RpdmUgbGluawogICAgICAgICROYXZCYXJNb2R1bGV7JEl0ZW19LT57Q2xhc3N9ID0gJyc7CiAgICAgICAgaWYgKCAkTmF2QmFyTW9kdWxleyRJdGVtfS0+e0xpbmt9ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAhJFNlbGVjdGVkRmxhZwogICAgICAgICAgICAgICAgJiYgJE5hdkJhck1vZHVsZXskSXRlbX0tPntMaW5rfSA9fiAvQWN0aW9uPSRTZWxmLT57QWN0aW9ufS8KICAgICAgICAgICAgICAgICYmICROYXZCYXJNb2R1bGV7JEl0ZW19LT57TGlua30gPX4gLyRTZWxmLT57U3ViYWN0aW9ufS8gICAgICMgU3ViYWN0aW9uIGNhbiBiZSBlbXB0eQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkTmF2QmFyTW9kdWxleyRJdGVtfS0+e0NsYXNzfSAuPSAnIFNlbGVjdGVkJzsKICAgICAgICAgICAgICAgICRTZWxlY3RlZEZsYWcgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJENvdW50ZXIgPT0gJFRvdGFsICkgewogICAgICAgICAgICAkTmF2QmFyTW9kdWxleyRJdGVtfS0+e0NsYXNzfSAuPSAnIExhc3QnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJE5hdkJhck1vZHVsZXskSXRlbX0tPntCbG9ja30gfHwgJ0l0ZW0nLAogICAgICAgICAgICBEYXRhID0+ICROYXZCYXJNb2R1bGV7JEl0ZW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBydW4gbm90aWZpY2F0aW9uIG1vZHVsZXMKICAgIG15ICRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpOb3RpZnlNb2R1bGUnKTsKICAgIGlmICggcmVmICRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZyBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyRGcm9udGVuZE5vdGlmeU1vZHVsZUNvbmZpZ307CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApOwogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCA9PiAkU2VsZiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBpZiAhJE9iamVjdDsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAkUGFyYW17Tm90aWZpY2F0aW9ufSAuPSAkT2JqZWN0LT5SdW4oICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIHRoZSBjdXN0b21lciB1c2VyIGxvZ2luIGluZm8gKHVzdWFsbHkgYXQgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIG5hdmlnYXRpb24gYmFyKQogICAgaWYgKCAhJFNlbGYtPntVc2VyTG9naW5JZGVudGlmaWVyfSApIHsKICAgICAgICAkUGFyYW17VXNlckxvZ2luSWRlbnRpZmllcn0gPSAkU2VsZi0+e1VzZXJFbWFpbH0gbmUgJFNlbGYtPntVc2VyQ3VzdG9tZXJJRH0KICAgICAgICAgICAgPwogICAgICAgICAgICAiKCAkU2VsZi0+e1VzZXJFbWFpbH0gLyAkU2VsZi0+e1VzZXJDdXN0b21lcklEfSApIgogICAgICAgICAgICA6ICRTZWxmLT57VXNlckVtYWlsfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtVc2VyTG9naW5JZGVudGlmaWVyfSA9ICRTZWxmLT57VXNlckxvZ2luSWRlbnRpZmllcn07CiAgICB9CgogICAgIyBvbmx5IG9uIHZhbGlkIHNlc3Npb24KICAgIGlmICggJFNlbGYtPntVc2VySUR9ICkgewoKICAgICAgICAjIHNob3cgbG9nb3V0IGJ1dHRvbiAoaWYgcmVnaXN0ZXJlZCkKICAgICAgICBpZiAoICRGcm9udGVuZE1vZHVsZUNvbmZpZy0+e0xvZ291dH0gKSB7CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xvZ291dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcHJlZmVyZW5jZXMgYnV0dG9uIChpZiByZWdpc3RlcmVkKQogICAgICAgIGlmICggJEZyb250ZW5kTW9kdWxlQ29uZmlnLT57Q3VzdG9tZXJQcmVmZXJlbmNlc30gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntBY3Rpb259IGVxICdDdXN0b21lclByZWZlcmVuY2VzJyApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtDbGFzc30gPSAnU2VsZWN0ZWQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdDdXN0b21lck5hdmlnYXRpb25CYXInLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKc3ViIEN1c3RvbWVyRXJyb3IgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBiYWNrZW5kIGVycm9yIG1lc3NhZ2VzCiAgICBmb3IgKHF3KE1lc3NhZ2UgVHJhY2ViYWNrKSkgewogICAgICAgICRQYXJhbXsgJ0JhY2tlbmQnIC4gJF8gfSA9ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgIFR5cGUgPT4gJ0Vycm9yJywKICAgICAgICAgICAgV2hhdCA9PiAkXwogICAgICAgICkgfHwgJyc7CiAgICB9CiAgICBpZiAoICEkUGFyYW17QmFja2VuZE1lc3NhZ2V9ICYmICEkUGFyYW17QmFja2VuZFRyYWNlYmFja30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJFBhcmFte01lc3NhZ2V9IHx8ICc/JywKICAgICAgICApOwogICAgICAgIGZvciAocXcoTWVzc2FnZSBUcmFjZWJhY2spKSB7CiAgICAgICAgICAgICRQYXJhbXsgJ0JhY2tlbmQnIC4gJF8gfSA9ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nRW50cnkoCiAgICAgICAgICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgICAgICAgICBXaGF0ID0+ICRfCiAgICAgICAgICAgICkgfHwgJyc7CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRQYXJhbXtNZXNzYWdlfSApIHsKICAgICAgICAkUGFyYW17TWVzc2FnZX0gPSAkUGFyYW17QmFja2VuZE1lc3NhZ2V9OwogICAgfQoKICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT5PdXRwdXQoIFRlbXBsYXRlRmlsZSA9PiAnQ3VzdG9tZXJFcnJvcicsIERhdGEgPT4gXCVQYXJhbSApOwp9CgpzdWIgQ3VzdG9tZXJXYXJuaW5nIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYmFja2VuZCBlcnJvciBtZXNzYWdlcwogICAgJFBhcmFte0JhY2tlbmRNZXNzYWdlfSA9ICRTZWxmLT57TG9nT2JqZWN0fS0+R2V0TG9nRW50cnkoCiAgICAgICAgVHlwZSA9PiAnTm90aWNlJywKICAgICAgICBXaGF0ID0+ICdNZXNzYWdlJywKICAgICAgICApCiAgICAgICAgfHwgJFNlbGYtPntMb2dPYmplY3R9LT5HZXRMb2dFbnRyeSgKICAgICAgICBUeXBlID0+ICdFcnJvcicsCiAgICAgICAgV2hhdCA9PiAnTWVzc2FnZScsCiAgICAgICAgKSB8fCAnJzsKCiAgICBpZiAoICEkUGFyYW17TWVzc2FnZX0gKSB7CiAgICAgICAgJFBhcmFte01lc3NhZ2V9ID0gJFBhcmFte0JhY2tlbmRNZXNzYWdlfTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIHJldHVybiAkU2VsZi0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyV2FybmluZycsIERhdGEgPT4gXCVQYXJhbSApOwp9CgpzdWIgQ3VzdG9tZXJOb1Blcm1pc3Npb24gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkV2l0aEhlYWRlciA9ICRQYXJhbXtXaXRoSGVhZGVyfSB8fCAneWVzJzsKICAgICRQYXJhbXtNZXNzYWdlfSB8fD0gJ05vIFBlcm1pc3Npb24hJzsKCiAgICAjIGNyZWF0ZSBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdObyBQZXJtaXNzaW9uJyApIGlmICggJFdpdGhIZWFkZXIgZXEgJ3llcycgKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPk91dHB1dCggVGVtcGxhdGVGaWxlID0+ICdOb1Blcm1pc3Npb24nLCBEYXRhID0+IFwlUGFyYW0gKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPkN1c3RvbWVyRm9vdGVyKCkgaWYgKCAkV2l0aEhlYWRlciBlcSAneWVzJyApOwoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCj1pdGVtIEFzY2lpMlJpY2hUZXh0KCkKCmNvbnZlcnRzIHRleHQgdG8gcmljaCB0ZXh0CgogICAgbXkgJEhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICBTdHJpbmcgPT4gJFRleHRTdHJpbmcsCiAgICApOwoKPWN1dAoKc3ViIEFzY2lpMlJpY2hUZXh0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgYXNjaWkgMiBodG1sCiAgICAkUGFyYW17U3RyaW5nfSA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9IVE1MKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtTdHJpbmd9Owp9Cgo9aXRlbSBSaWNoVGV4dDJBc2NpaSgpCgpjb252ZXJ0cyB0ZXh0IHRvIHJpY2ggdGV4dAoKICAgIG15ICRUZXh0U3RyaW5nID0gJExheW91dE9iamVjdC0+UmljaFRleHQyQXNjaWkoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MU3RyaW5nLAogICAgKTsKCj1jdXQKCnN1YiBSaWNoVGV4dDJBc2NpaSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFN0cmluZykpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzY2lpIDIgaHRtbAogICAgJFBhcmFte1N0cmluZ30gPSAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0tPlRvQXNjaWkoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtTdHJpbmd9LAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1N0cmluZ307Cn0KCj1pdGVtIFJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgpCgoxKSBhZGQgaHRtbCwgYm9keSwgLi4uIHRhZ3MgdG8gYmUgYSB2YWxpZCBodG1sIGRvY3VtZW50CjIpIHJlcGxhY2UgbGlua3Mgb2YgaW5saW5lIGNvbnRlbnQgZS4gZy4gaW1hZ2VzIHRvIDxpbWcgc3JjPSJjaWQ6eHh4eCIgLz4KCiAgICAkSFRNTEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgU3RyaW5nID0+ICRIVE1MQm9keSwKICAgICk7Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudENvbXBsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVwbGFjZSBpbWFnZSBsaW5rIHdpdGggY29udGVudCBpZCBmb3IgdXBsb2FkZWQgaW1hZ2VzCiAgICBteSAkU3RyaW5nUmVmID0gJFNlbGYtPl9SaWNoVGV4dFJlcGxhY2VMaW5rT2ZJbmxpbmVDb250ZW50KAogICAgICAgIFN0cmluZyA9PiBcJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgICMgdmVyaWZ5IGh0bWwgZG9jdW1lbnQKICAgICRQYXJhbXtTdHJpbmd9ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Eb2N1bWVudENvbXBsZXRlKAogICAgICAgIFN0cmluZyAgPT4gJHskU3RyaW5nUmVmfSwKICAgICAgICBDaGFyc2V0ID0+ICRTZWxmLT57VXNlckNoYXJzZXR9LAogICAgKTsKCiAgICAjIGRvIGNvcnJlY3QgZGlyZWN0aW9uCiAgICBpZiAoICRTZWxmLT57VGV4dERpcmVjdGlvbn0gKSB7CiAgICAgICAgJFBhcmFte1N0cmluZ30gPX4gcy88Ym9keS88Ym9keSBkaXI9IiRTZWxmLT57VGV4dERpcmVjdGlvbn0iL2k7CiAgICB9CgogICAgIyBmaWx0ZXIgbGlua3MgaW4gcmVzcG9uc2UKICAgICRQYXJhbXtTdHJpbmd9ID0gJFNlbGYtPkhUTUxMaW5rUXVvdGUoIFN0cmluZyA9PiAkUGFyYW17U3RyaW5nfSApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWN1dAoKPWl0ZW0gX1JpY2hUZXh0UmVwbGFjZUxpbmtPZklubGluZUNvbnRlbnQoKQoKcmVwbGFjZSBsaW5rcyBvZiBpbmxpbmUgY29udGVudCBlLiBnLiBpbWFnZXMKCiAgICAkSFRNTEJvZHlTdHJpbmdSZWYgPSAkTGF5b3V0T2JqZWN0LT5fUmljaFRleHRSZXBsYWNlTGlua09mSW5saW5lQ29udGVudCgKICAgICAgICBTdHJpbmcgPT4gJEhUTUxCb2R5U3RyaW5nUmVmLAogICAgKTsKCj1jdXQKCnN1YiBfUmljaFRleHRSZXBsYWNlTGlua09mSW5saW5lQ29udGVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFN0cmluZykpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZXBsYWNlIGltYWdlIGxpbmsgd2l0aCBjb250ZW50IGlkIGZvciB1cGxvYWRlZCBpbWFnZXMKICAgICR7ICRQYXJhbXtTdHJpbmd9IH0gPX4gc3sKICAgICAgICAoPGltZy4rP3NyYz0oInwnKSlbXj5dK0NvbnRlbnRJRD0oLis/KSgifCcpKFtePl0rPikKICAgIH0KICAgIHsKICAgICAgICAkMSAuICdjaWQ6JyAuICQzIC4gJDQgLiAkNTsKICAgIH1lc2d4aTsKCiAgICByZXR1cm4gJFBhcmFte1N0cmluZ307Cn0KCj1lbmQgSW50ZXJuYWw6Cgo9aXRlbSBSaWNoVGV4dERvY3VtZW50U2FmZXR5Q2hlY2soKQoKY2hlY2sgaWYgY29udGVudCBpcyBzYWZldHkKCiAgICAkSFRNTEJvZHkgPSAkTGF5b3V0T2JqZWN0LT5SaWNoVGV4dERvY3VtZW50U2FmZXR5Q2hlY2soCiAgICAgICAgU3RyaW5nID0+ICRIVE1MQm9keSwKICAgICk7Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudFNhZmV0eUNoZWNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgc2FmZXR5IGNoZWNrCiAgICBteSAlU2FmZXR5ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5TYWZldHkoCiAgICAgICAgU3RyaW5nICAgICAgID0+IFwkUGFyYW17U3RyaW5nfSwKICAgICAgICBOb0FwcGxldCAgICAgPT4gMSwKICAgICAgICBOb09iamVjdCAgICAgPT4gMSwKICAgICAgICBOb0VtYmVkICAgICAgPT4gMSwKICAgICAgICBOb0ludFNyY0xvYWQgPT4gMCwKICAgICAgICBOb0V4dFNyY0xvYWQgPT4gMSwKICAgICAgICBOb0phdmFTY3JpcHQgPT4gMSwKICAgICAgICBEZWJ1ZyAgICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICApOwoKICAgICMgcmV0dXJuIGlmIG5vIHNhZmV0eSBjaGFuZ2UgaGFzIGJlZW4gZG9uZQogICAgcmV0dXJuICRQYXJhbXtTdHJpbmd9IGlmICEkU2FmZXR5e1JlcGxhY2VkfTsKCiAgICAjIGdlbmVyYXRlIGJsb2NrZXIgbWVzc2FnZQogICAgbXkgJE1lc3NhZ2UgPSAkU2VsZi0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQXR0YWNobWVudEJsb2NrZXInLAogICAgKTsKCiAgICAjIGFkZCBpdCBvbiB0b3Agb2YgcGFnZQogICAgaWYgKCAkeyAkU2FmZXR5e1N0cmluZ30gfSA9fiAvPGJvZHkuKj8vc2kgKSB7CiAgICAgICAgJHsgJFNhZmV0eXtTdHJpbmd9IH0gPX4gcy8oPGJvZHkuKj8+KS8kMVxuJE1lc3NhZ2Uvc2k7CiAgICB9CgogICAgIyBhZGQgaXQgdG8gZW5kIG9mIHBhZ2UKICAgIGVsc2UgewogICAgICAgICR7ICRTYWZldHl7U3RyaW5nfSB9ID0gJE1lc3NhZ2UgLiAkeyAkU2FmZXR5e1N0cmluZ30gfTsKICAgIH0KCiAgICByZXR1cm4gJHsgJFNhZmV0eXtTdHJpbmd9IH07Cn0KCj1pdGVtIFJpY2hUZXh0RG9jdW1lbnRTZXJ2ZSgpCgpzZXJ2ZSBhIHJpY2ggdGV4dCBkb2N1bWVudCBmb3IgbG9jYWwgdmlldyBpbiBjb3JyZWN0IGNoYXJzZXQgYW5kIHdpdGggY29ycmVjdApsaW5rcyBmb3IgaW5saW5lIGRvY3VtZW50CgogICAgbXkgJUhUTUxGaWxlID0gJExheW91dE9iamVjdC0+UmljaFRleHREb2N1bWVudFNlcnZlKAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkSFRNTEJvZHlSZWYsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICd0ZXh0L2h0bWw7IGNoYXJzZXQ9Imlzby04ODU5LTEiJywKICAgICAgICB9LAogICAgICAgIFVSTCAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldEF0dGFjaG1lbnQ7U3ViYWN0aW9uPUhUTUxWaWV3O0FydGljbGVJRD0xMjM7RmlsZUlEPScsCiAgICAgICAgQXR0YWNobWVudHMgICAgICAgPT4gXCVBdHRhY2htZW50TGlzdE9mSW5saW5lQXR0YWNobWVudHMsCiAgICAgICAgTG9hZElubGluZUNvbnRlbnQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUmljaFRleHREb2N1bWVudFNlcnZlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGF0YSBVUkwgQXR0YWNobWVudHMpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY2hhcnNldCBhbmQgY29udmVydCBjb250ZW50IHRvIGludGVybmFsIGNoYXJzZXQKICAgIGlmICggJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVJbnRlcm5hbFVzZWQoKSApIHsKICAgICAgICBteSAkQ2hhcnNldCA9ICRQYXJhbXtEYXRhfS0+e0NvbnRlbnRUeXBlfTsKICAgICAgICAkQ2hhcnNldCA9fiBzLy4rP2NoYXJzZXQ9KCJ8J3wpKFx3KykvJDIvZ2k7CiAgICAgICAgJENoYXJzZXQgPX4gcy8ifCcvL2c7CiAgICAgICAgJENoYXJzZXQgPX4gcy8oLis/KTsuKi8kMS9nOwoKICAgICAgICAjIGNvbnZlcnQgY2hhcnNldAogICAgICAgIGlmICgkQ2hhcnNldCkgewogICAgICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+Q29udmVydCgKICAgICAgICAgICAgICAgIFRleHQgPT4gJFBhcmFte0RhdGF9LT57Q29udGVudH0sCiAgICAgICAgICAgICAgICBGcm9tID0+ICRDaGFyc2V0LAogICAgICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVwbGFjZSBjaGFyc2V0IGluIGNvbnRlbnQKICAgICAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gICAgID1+IHMvJENoYXJzZXQvdXRmLTgvZ2k7CiAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+e0NvbnRlbnRUeXBlfSA9fiBzLyRDaGFyc2V0L3V0Zi04L2dpOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBodG1sIGxpbmtzCiAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRTZWxmLT5IVE1MTGlua1F1b3RlKAogICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICk7CgogICAgIyBjbGVhbnVwIHNvbWUgaHRtbCB0YWdzIHRvIGJlIGNyb3NzIGJyb3dzZXIgY29tcGF0LgogICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPSAkU2VsZi0+UmljaFRleHREb2N1bWVudENsZWFudXAoCiAgICAgICAgU3RyaW5nID0+ICRQYXJhbXtEYXRhfS0+e0NvbnRlbnR9LAogICAgKTsKCiAgICAjIHNhZmV0eSBjaGVjawogICAgaWYgKCAhJFBhcmFte0xvYWRJbmxpbmVDb250ZW50fSApIHsKICAgICAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9ICRTZWxmLT5SaWNoVGV4dERvY3VtZW50U2FmZXR5Q2hlY2soCiAgICAgICAgICAgIFN0cmluZyA9PiAkUGFyYW17RGF0YX0tPntDb250ZW50fSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgYmFzZSB1cmwgZm9yIGlubGluZSBpbWFnZXMKICAgIG15ICRTZXNzaW9uSUQgPSAnJzsKICAgIGlmICggJFNlbGYtPntTZXNzaW9uSUR9ICYmICEkU2VsZi0+e1Nlc3Npb25JRENvb2tpZX0gKSB7CiAgICAgICAgJFNlc3Npb25JRCA9ICc7JyAuICRTZWxmLT57U2Vzc2lvbk5hbWV9IC4gJz0nIC4gJFNlbGYtPntTZXNzaW9uSUR9OwogICAgfQoKICAgICMgcmVwbGFjZSBpbmxpbmUgaW1hZ2VzIGluIGNvbnRlbnQgd2l0aCBydW50aW1lIHVybCB0byBpbWFnZXMKICAgIG15ICRBdHRhY2htZW50TGluayA9ICRTZWxmLT57QmFzZWxpbmt9IC4gJFBhcmFte1VSTH07CiAgICAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiBzewogICAgICAgICg9fCJ8JyljaWQ6KC4qPykoInwnfD58XC8+fFxzKQogICAgfQogICAgewogICAgICAgIG15ICRTdGFydD0gJDE7CiAgICAgICAgbXkgJENvbnRlbnRJRCA9ICQyOwogICAgICAgIG15ICRFbmQgPSAkMzsKCiAgICAgICAgIyBpbXByb3ZlIGh0bWwgcXVhbGl0eQogICAgICAgIGlmICggJFN0YXJ0IG5lICciJyAmJiAkU3RhcnQgbmUgJ1wnJyApIHsKICAgICAgICAgICAgJFN0YXJ0IC49ICciJzsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRW5kIG5lICciJyAmJiAkRW5kIG5lICdcJycgKSB7CiAgICAgICAgICAgICRFbmQgPSAnIicgLiAkRW5kOwogICAgICAgIH0KCiAgICAgICAgIyBmaW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgYW5kIHJlcGxhY2UgaXQgd2l0aCBydW50bGltZSB1cmwgdG8gaW1hZ2UKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnRJRCAoIGtleXMgJXsgJFBhcmFte0F0dGFjaG1lbnRzfSB9KSB7CiAgICAgICAgICAgIG5leHQgaWYgbGMgJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfSBuZSBsYyAiPCRDb250ZW50SUQ+IjsKICAgICAgICAgICAgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50TGluayAuICRBdHRhY2htZW50SUQgLiAnOycgLiAkU2Vzc2lvbklEOwogICAgICAgICAgICBsYXN0OwogICAgICAgIH0KCiAgICAgICAgIyByZXR1cm4gbmV3IHJ1bnRpbWUgdXJsCiAgICAgICAgJFN0YXJ0IC4gJENvbnRlbnRJRCAuICRFbmQ7CiAgICB9ZWd4aTsKCiAgICAjIGJ1ZyAjNTA1MwogICAgIyBpbmxpbmUgaW1hZ2VzIHVzaW5nIENvbnRlbnQtTG9jYXRpb24gYXMgaWRlbnRpZmllciBpbnN0ZWFkIG9mIENvbnRlbnQtSUQgZXZlbiBSRkMyNTU3CiAgICAjIGh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI1NTcudHh0CgogICAgIyBmaW5kIG1hdGNoaW5nIGF0dGFjaG1lbnQgYW5kIHJlcGxhY2UgaXQgd2l0aCBydW50bGltZSB1cmwgdG8gaW1hZ2UKICAgIGZvciBteSAkQXR0YWNobWVudElEICgga2V5cyAleyAkUGFyYW17QXR0YWNobWVudHN9IH0gKSB7CiAgICAgICAgbmV4dCBpZiAhJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfTsKCiAgICAgICAgIyBjb250ZW50IGlkIGNsZWFudXAKICAgICAgICAkUGFyYW17QXR0YWNobWVudHN9LT57JEF0dGFjaG1lbnRJRH0tPntDb250ZW50SUR9ID1+IHMvXjwvLzsKICAgICAgICAkUGFyYW17QXR0YWNobWVudHN9LT57JEF0dGFjaG1lbnRJRH0tPntDb250ZW50SUR9ID1+IHMvPiQvLzsKCiAgICAgICAgJFBhcmFte0RhdGF9LT57Q29udGVudH0gPX4gc3sKICAgICAgICAoPXwifCcpKFxRJFBhcmFte0F0dGFjaG1lbnRzfS0+eyRBdHRhY2htZW50SUR9LT57Q29udGVudElEfVxFKSgifCd8PnxcLz58XHMpCiAgICB9CiAgICB7CiAgICAgICAgbXkgJFN0YXJ0PSAkMTsKICAgICAgICBteSAkQ29udGVudElEID0gJDI7CiAgICAgICAgbXkgJEVuZCA9ICQzOwoKICAgICAgICAjIGltcHJvdmUgaHRtbCBxdWFsaXR5CiAgICAgICAgaWYgKCAkU3RhcnQgbmUgJyInICYmICRTdGFydCBuZSAnXCcnICkgewogICAgICAgICAgICAkU3RhcnQgLj0gJyInOwogICAgICAgIH0KICAgICAgICBpZiAoICRFbmQgbmUgJyInICYmICRFbmQgbmUgJ1wnJyApIHsKICAgICAgICAgICAgJEVuZCA9ICciJyAuICRFbmQ7CiAgICAgICAgfQoKICAgICAgICAjIHJldHVybiBuZXcgcnVudGltZSB1cmwKICAgICAgICAkQ29udGVudElEID0gJEF0dGFjaG1lbnRMaW5rIC4gJEF0dGFjaG1lbnRJRCAuICc7JyAuICRTZXNzaW9uSUQ7CiAgICAgICAgJFN0YXJ0IC4gJENvbnRlbnRJRCAuICRFbmQ7CiAgICB9ZWd4aTsKICAgIH0KCiAgICByZXR1cm4gJXsgJFBhcmFte0RhdGF9IH07Cn0KCj1pdGVtIFJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKCkKCjEpICByZXBsYWNlIE1TIFdvcmQgMTIgPHB8ZGl2PiB3aXRoIGNsYXNzICJNc29Ob3JtYWwiIGJ5IHVzaW5nIDxici8+IGJlY2F1c2UKICAgIGl0J3Mgbm90IHVzZWQgYXMgPHA+PGRpdj4gKG1hcmdpbjowY207IG1hcmdpbi1ib3R0b206LjAwMDFwdDspCgoyKSAgcmVwbGFjZSA8YmxvY2txdW90ZT4gYnkgdXNpbmcKICAgICI8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItbGVmdDpzb2xpZCBibHVlIDEuNXB0O3BhZGRpbmc6MGNtIDBjbSAwY20gNC4wcHQiIHR5cGU9ImNpdGUiPiIKICAgIGJlY2F1c2Ugb2YgY3Jvc3MgbWFpbCBjbGllbnQgYW5kIGJyb3dzZXIgY29tcGF0YWJpbGl0eQoKICAgICRIVE1MQm9keSA9ICRMYXlvdXRPYmplY3QtPlJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwKAogICAgICAgIFN0cmluZyA9PiAkSFRNTEJvZHksCiAgICApOwoKPWN1dAoKc3ViIFJpY2hUZXh0RG9jdW1lbnRDbGVhbnVwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoU3RyaW5nKSkgewogICAgICAgIGlmICggIWRlZmluZWQgJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICRQYXJhbXtTdHJpbmd9ID0gJFNlbGYtPntIVE1MVXRpbHNPYmplY3R9LT5Eb2N1bWVudFN0eWxlQ2xlYW51cCgKICAgICAgICBTdHJpbmcgPT4gJFBhcmFte1N0cmluZ30sCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17U3RyaW5nfTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWN1dAoKc3ViIF9CbG9ja1RlbXBsYXRlUHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGFnc09wZW47CiAgICBteSBAUHJlZmVyZW5jZXM7CiAgICBteSAkTGFzdExheWVyQ291bnQgPSAwOwogICAgbXkgJExheWVyICAgICAgICAgID0gMDsKICAgIG15ICRMYXN0TGF5ZXIgICAgICA9ICcnOwogICAgbXkgJEN1cnJlbnRMYXllciAgID0gJyc7CiAgICBteSAlVXNlZE5hbWVzOwogICAgbXkgJFRlbXBsYXRlRmlsZSA9ICRQYXJhbXtUZW1wbGF0ZUZpbGV9IHx8ICcnOwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VGVtcGxhdGV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFRlbXBsYXRlIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1ByYXNlZEJsb2NrVGVtcGxhdGVQcmVmZXJlbmNlc30tPnskVGVtcGxhdGVGaWxlfSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntQcmFzZWRCbG9ja1RlbXBsYXRlUHJlZmVyZW5jZXN9LT57JFRlbXBsYXRlRmlsZX07CiAgICB9CgogICAgJFBhcmFte1RlbXBsYXRlfSA9fiBzewogICAgICAgIDwhLS1cc3swLDF9ZHRsOmJsb2NrOiguKz8pXHN7MCwxfS0tPgogICAgfQogICAgewogICAgICAgIG15ICRCbG9ja05hbWUgPSAkMTsKICAgICAgICBpZiAoISRUYWdzT3BlbnskQmxvY2tOYW1lfSkgewogICAgICAgICAgICAkTGF5ZXIrKzsKICAgICAgICAgICAgJFRhZ3NPcGVueyRCbG9ja05hbWV9ID0gMTsKICAgICAgICAgICAgbXkgJENMID0gJyc7CiAgICAgICAgICAgIGlmICgkTGF5ZXIgPT0gMSkgewogICAgICAgICAgICAgICAgJExhc3RMYXllciA9ICcnOwogICAgICAgICAgICAgICAgJEN1cnJlbnRMYXllciA9ICRCbG9ja05hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRMYXN0TGF5ZXJDb3VudCA9PSAkTGF5ZXIpIHsKICAgICAgICAgICAgICAgICRDdXJyZW50TGF5ZXIgPSAkTGFzdExheWVyLic6OicuJEJsb2NrTmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXN0TGF5ZXIgPSAkQ3VycmVudExheWVyOwogICAgICAgICAgICAgICAgJEN1cnJlbnRMYXllciA9ICRDdXJyZW50TGF5ZXIuJzo6Jy4kQmxvY2tOYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRMYXN0TGF5ZXJDb3VudCA9ICRMYXllcjsKICAgICAgICAgICAgaWYgKCEkVXNlZE5hbWVzeyRCbG9ja05hbWV9KSB7CiAgICAgICAgICAgICAgICBwdXNoIChAUHJlZmVyZW5jZXMsIHsKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRCbG9ja05hbWUsCiAgICAgICAgICAgICAgICAgICAgTGF5ZXIgPT4gJExheWVyLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFVzZWROYW1lc3skQmxvY2tOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRUYWdzT3BlbnskQmxvY2tOYW1lfSA9IDA7CiAgICAgICAgICAgICRMYXllci0tOwogICAgICAgIH0KICAgIH1zZWd4bTsKCiAgICAjIGNoZWNrIG9wZW4gKGludmFsaWQpIHRhZ3MKICAgIGZvciAoIGtleXMgJVRhZ3NPcGVuICkgewogICAgICAgIGlmICggJFRhZ3NPcGVueyRffSApIHsKICAgICAgICAgICAgbXkgJE1lc3NhZ2UgPSAiJ2R0bDpibG9jazokXycgaXNuJ3QgY2xvc2VkISI7CiAgICAgICAgICAgIGlmICgkVGVtcGxhdGVGaWxlKSB7CiAgICAgICAgICAgICAgICAkTWVzc2FnZSAuPSAiICgkVGVtcGxhdGVGaWxlLmR0bCkiOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICRNZXNzYWdlICk7CiAgICAgICAgICAgICRTZWxmLT5GYXRhbEVycm9yKCk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtZW1iZXIgYmxvY2sgZGF0YQogICAgaWYgKCRUZW1wbGF0ZUZpbGUpIHsKICAgICAgICAkU2VsZi0+e1ByYXNlZEJsb2NrVGVtcGxhdGVQcmVmZXJlbmNlc30tPnskVGVtcGxhdGVGaWxlfSA9IFxAUHJlZmVyZW5jZXM7CiAgICB9CgogICAgcmV0dXJuIFxAUHJlZmVyZW5jZXM7Cn0KCnN1YiBfQmxvY2tUZW1wbGF0ZXNSZXBsYWNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1RlbXBsYXRlfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBUZW1wbGF0ZSEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgJFRlbXBsYXRlU3RyaW5nID0gJFBhcmFte1RlbXBsYXRlfTsKCiAgICAjIGdldCBhdmFpbGFiZSB0ZW1wbGF0ZSBibG9jayBwcmVmZXJlbmNlcwogICAgbXkgJEJsb2Nrc1JlZiA9ICRTZWxmLT5fQmxvY2tUZW1wbGF0ZVByZWZlcmVuY2VzKAogICAgICAgIFRlbXBsYXRlID0+ICQkVGVtcGxhdGVTdHJpbmcsCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICRQYXJhbXtUZW1wbGF0ZUZpbGV9IHx8ICcnLAogICAgKTsKICAgIG15ICVCbG9ja0xheWVyOwogICAgbXkgJUJsb2NrVGVtcGxhdGVzOwogICAgZm9yIG15ICRCbG9jayAoIHJldmVyc2UgQHskQmxvY2tzUmVmfSApIHsKICAgICAgICAkJFRlbXBsYXRlU3RyaW5nID1+IHN7CiAgICAgICAgICAgIDwhLS1cc3swLDF9ZHRsOmJsb2NrOiRCbG9jay0+e05hbWV9XHN7MCwxfS0tPiguKz8pPCEtLVxzezAsMX1kdGw6YmxvY2s6JEJsb2NrLT57TmFtZX1cc3swLDF9LS0+CiAgICAgICAgfQogICAgICAgIHsKICAgICAgICAgICAgJEJsb2NrVGVtcGxhdGVzeyRCbG9jay0+e05hbWV9fSA9ICQxOwogICAgICAgICAgICAiPCEtLSBkdGw6cGxhY2VfYmxvY2s6JEJsb2NrLT57TmFtZX0gLS0+IjsKICAgICAgICB9c2VneG07CiAgICAgICAgJEJsb2NrTGF5ZXJ7ICRCbG9jay0+e05hbWV9IH0gPSAkQmxvY2stPntMYXllcn07CiAgICB9CgogICAgIyBjcmVhdGUgYmxvY2sgdGVtcGxhdGUgc3RyaW5nCiAgICBteSBAQlI7CiAgICBpZiAoICRTZWxmLT57QmxvY2tEYXRhfSAmJiAlQmxvY2tUZW1wbGF0ZXMgKSB7CiAgICAgICAgbXkgQE5vdFVzZWRCbG9ja0RhdGE7CiAgICAgICAgZm9yIG15ICRCbG9jayAoIEB7ICRTZWxmLT57QmxvY2tEYXRhfSB9ICkgewogICAgICAgICAgICBpZiAoICRCbG9ja1RlbXBsYXRlc3sgJEJsb2NrLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQEJSLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXIgPT4gJEJsb2NrTGF5ZXJ7ICRCbG9jay0+e05hbWV9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgID0+ICRCbG9jay0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICA9PiAkU2VsZi0+X091dHB1dCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRCbG9ja1RlbXBsYXRlc3sgJEJsb2NrLT57TmFtZX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRCbG9jay0+e0RhdGF9LAogICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoIEBOb3RVc2VkQmxvY2tEYXRhLCB7ICV7JEJsb2NrfSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbWVtYmVyIG5vdCB1c2UgYmxvY2sgZGF0YQogICAgICAgICRTZWxmLT57QmxvY2tEYXRhfSA9IFxATm90VXNlZEJsb2NrRGF0YTsKICAgIH0KICAgIHJldHVybiBAQlI7Cn0KCnN1YiBfT3V0cHV0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBkZWVwIHJlY3Vyc2lvbiBwcm90ZWN0aW9uCiAgICAkU2VsZi0+e091dHB1dENvdW50fSsrOwogICAgaWYgKCAkU2VsZi0+e091dHB1dENvdW50fSA+IDIwICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTG9vcCBkZXRlY3Rpb24hJywKICAgICAgICApOwogICAgICAgICRTZWxmLT5GYXRhbERpZSgpOwogICAgfQoKICAgICMgY3JlYXRlIHJlZnMKICAgIG15ICRHbG9iYWxSZWYgPSB7CiAgICAgICAgRW52ICAgID0+ICRTZWxmLT57RW52UmVmfSwKICAgICAgICBEYXRhICAgPT4gJFBhcmFte0RhdGF9LAogICAgICAgIENvbmZpZyA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICB9OwoKICAgIG15ICRUZW1wbGF0ZVN0cmluZyA9ICRQYXJhbXtUZW1wbGF0ZX07CgogICAgIyBwYXJzZS9nZXQgdGV4dCBibG9ja3MKICAgIG15IEBCUiA9ICRTZWxmLT5fQmxvY2tUZW1wbGF0ZXNSZXBsYWNlKAogICAgICAgIFRlbXBsYXRlID0+IFwkVGVtcGxhdGVTdHJpbmcsCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICRQYXJhbXtUZW1wbGF0ZUZpbGV9IHx8ICcnLAogICAgKTsKICAgIG15ICRJRCA9IDA7CiAgICBteSAlTGF5ZXJIYXNoOwogICAgbXkgJE9sZExheWVyID0gMTsKICAgIGZvciBteSAkQmxvY2sgKEBCUikgewoKICAgICAgICAjIHJlc2V0IGxheWVyIGNvdW50ZXIgaWYgd2Ugc3dpdGNoZWQgb24gbGF5ZXIgbG93ZXIKICAgICAgICBpZiAoICRCbG9jay0+e0xheWVyfSA+ICRPbGRMYXllciApIHsKICAgICAgICAgICAgJExheWVySGFzaHsgJEJsb2NrLT57TGF5ZXJ9IH0gPSAwOwogICAgICAgIH0KCiAgICAgICAgIyBjb3VudCBjdXJyZW50IGxheWVyCiAgICAgICAgJExheWVySGFzaHsgJEJsb2NrLT57TGF5ZXJ9IH0rKzsKCiAgICAgICAgIyBjcmVhdGUgY3VycmVudCBpZCAoMToyOjMpCiAgICAgICAgdW5kZWYgJElEOwogICAgICAgIGZvciAoIG15ICRpID0gMTsgJGkgPD0gJEJsb2NrLT57TGF5ZXJ9OyAkaSsrICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJElEICkgewogICAgICAgICAgICAgICAgJElEIC49ICc6JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIGRlZmluZWQgJExheWVySGFzaHskaX0gKSB7CiAgICAgICAgICAgICAgICAkSUQgLj0gJExheWVySGFzaHskaX07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYWRkIGJsb2NrIGNvdW50ZXIgdG8gdGVtcGxhdGUgYmxvY2tzCiAgICAgICAgaWYgKCAkQmxvY2stPntMYXllcn0gPT0gMSApIHsKICAgICAgICAgICAgJFRlbXBsYXRlU3RyaW5nID1+IHN7CiAgICAgICAgICAgICAgICA8IS0tIFsgXSBkdGw6cGxhY2VfYmxvY2s6KCRCbG9jay0+e05hbWV9KSBbIF0gLS0+CiAgICAgICAgICAgIH0KICAgICAgICAgICAgezwhLS0gZHRsOnBsYWNlX2Jsb2NrOiQxOiRMYXllckhhc2h7JEJsb2NrLT57TGF5ZXJ9fSAtLT59c2d4bTsKICAgICAgICB9CgogICAgICAgICMgYWRkIGJsb2NrIGNvdW50ZXIgdG8gaW4gYmxvY2sgYmxvY2tzCiAgICAgICAgJEJsb2NrLT57RGF0YX0gPX4gc3sKICAgICAgICAgICAgPCEtLSBbIF0gZHRsOnBsYWNlX2Jsb2NrOiguKz8pIFsgXSAtLT4KICAgICAgICB9CiAgICAgICAgezwhLS0gZHRsOnBsYWNlX2Jsb2NrOiQxOiRJRDotIC0tPn1zZ3htOwoKICAgICAgICAjIGNvdW50IHVwIHBsYWNlX2Jsb2NrIGNvdW50ZXIKICAgICAgICAkSUQgPX4gcy9eKC4qOikoXGQrKSQvJDEtLzsKCiAgICAgICAgbXkgJE5ld0lEID0gJyc7CiAgICAgICAgaWYgKCAkSUQgPX4gL14oLio6KShcZCspJC8gKSB7CiAgICAgICAgICAgICROZXdJRCA9ICQxIC4gKCAkMiArIDEgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkSUQgPX4gL14oXGQrKSQvICkgewogICAgICAgICAgICAkTmV3SUQgPSAoICQxICsgMSApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRJRCA9fiAvXiguKjopLSQvICkgewogICAgICAgICAgICAkTmV3SUQgPSAkSUQ7CiAgICAgICAgfQoKICAgICAgICAkVGVtcGxhdGVTdHJpbmcgPX4gc3sKICAgICAgICAgICAgPCEtLSBbIF0gZHRsOnBsYWNlX2Jsb2NrOiRCbG9jay0+e05hbWV9OiRJRCBbIF0gLS0+CiAgICAgICAgfQogICAgICAgIHskQmxvY2stPntEYXRhfTwhLS0gZHRsOnBsYWNlX2Jsb2NrOiRCbG9jay0+e05hbWV9OiROZXdJRCAtLT59c3htOwogICAgICAgICRPbGRMYXllciA9ICRCbG9jay0+e0xheWVyfTsKICAgIH0KCiAgICAjIHJlbW92ZSBlbXB0eSBibG9ja3MgYW5kIGJsb2NrIHByZWZlcmVuY2VzCiAgICBpZiAoICRQYXJhbXtCbG9ja1JlcGxhY2V9ICkgewogICAgICAgICRUZW1wbGF0ZVN0cmluZyA9fiBzezwhLS0gWyBdIGR0bDpwbGFjZV9ibG9jazouKz8gWyBdIC0tPiB9e31zZ3htOwogICAgfQoKICAgICMgcHJvY2VzcyB0ZW1wbGF0ZQogICAgbXkgJE91dHB1dCA9ICcnOwogICAgZm9yIG15ICRMaW5lICggc3BsaXQoIC9cbi8sICRUZW1wbGF0ZVN0cmluZyApICkgewoKICAgICAgICAjICAgICAgICAjIGFkZCBtaXNzaW5nIG5ldyBsaW5lIChzdHJpcGVkIGZyb20gc3BsaXQpCiAgICAgICAgIyAgICAgICAgJExpbmUgLj0gIlxuIjsKCiAgICAgICAgIyB2YXJpYWJsZSAmIGVudiAmIGNvbmZpZyByZXBsYWNlbWVudAogICAgICAgIG15ICRSZWdleHAgPSAxOwogICAgICAgIHdoaWxlICgkUmVnZXhwKSB7CiAgICAgICAgICAgICRSZWdleHAgPSAkTGluZSA9fiBzewogICAgICAgICAgICAgICAgXCQoKD86fFF8TFF8KURhdGF8KD86fFEpRW52fENvbmZpZ3xJbmNsdWRlKXsiKC4rPykifQogICAgICAgICAgICB9CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICgkMSBlcSAnRGF0YScgfHwgJDEgZXEgJ0VudicpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdsb2JhbFJlZi0+eyQxfS0+eyQyfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEdsb2JhbFJlZi0+eyQxfS0+eyQyfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IHJlcGxhY2Ugd2l0aCBub3RoaW5nIQogICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJDEgZXEgJ1FFbnYnKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRleHQgPSAkMjsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0ID1+IC9eIixccyoiKC4rKSQvICkgewogICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRUZXh0ID1+IC9eKC4rPykiLFxzKiIoLispJC8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHbG9iYWxSZWYtPntFbnZ9LT57JDF9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkFzY2lpMkh0bWwoVGV4dCA9PiAkR2xvYmFsUmVmLT57RW52fS0+eyQxfSwgTWF4ID0+ICQyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IHJlcGxhY2Ugd2l0aCBub3RoaW5nIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2xvYmFsUmVmLT57RW52fS0+eyRUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5Bc2NpaTJIdG1sKFRleHQgPT4gJEdsb2JhbFJlZi0+e0Vudn0tPnskVGV4dH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgcmVwbGFjZSB3aXRoIG5vdGhpbmchCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkMSBlcSAnUURhdGEnKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFRleHQgPSAkMjsKICAgICAgICAgICAgICAgICAgICBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0ID1+IC9eIixccyoiKC4rKSQvICkgewogICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCRUZXh0ID1+IC9eKC4rPykiLFxzKiIoLispJC8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHbG9iYWxSZWYtPntEYXRhfS0+eyQxfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5Bc2NpaTJIdG1sKFRleHQgPT4gJEdsb2JhbFJlZi0+e0RhdGF9LT57JDF9LCBNYXggPT4gJDIpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgcmVwbGFjZSB3aXRoIG5vdGhpbmchCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHbG9iYWxSZWYtPntEYXRhfS0+eyRUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT5Bc2NpaTJIdG1sKFRleHQgPT4gJEdsb2JhbFJlZi0+e0RhdGF9LT57JFRleHR9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3V0cHV0IHJlcGxhY2Ugd2l0aCBub3RoaW5nIQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAjIGxpbmsgZW5jb2RlCiAgICAgICAgICAgICAgICBlbHNpZiAoJDEgZXEgJ0xRRGF0YScpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdsb2JhbFJlZi0+e0RhdGF9LT57JDJ9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+TGlua0VuY29kZSgkR2xvYmFsUmVmLT57RGF0YX0tPnskMn0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgcmVwbGFjZSB3aXRoIG5vdGhpbmchCiAgICAgICAgICAgICAgICAgICAgICAgICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgcmVwbGFjZSB3aXRoCiAgICAgICAgICAgICAgICBlbHNpZiAoJDEgZXEgJ0NvbmZpZycpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDIpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkMik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAjIG91dHB1dCByZXBsYWNlIHdpdGggbm90aGluZyEKICAgICAgICAgICAgICAgICAgICAgICAgJyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBpbmNsdWRlIGR0bCBmaWxlcwogICAgICAgICAgICAgICAgZWxzaWYgKCQxIGVxICdJbmNsdWRlJykgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZSA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJDIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfWVneDsKICAgICAgICB9CgogICAgICAgICMgYWRkIHRoaXMgbGluZSB0byBvdXRwdXQKICAgICAgICAkT3V0cHV0IC49ICRMaW5lIC4gIlxuIjsKICAgIH0KICAgIGNob21wICRPdXRwdXQ7CgogICAgJFNlbGYtPntPdXRwdXRDb3VudH0gPSAwOwoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRPdXRwdXQ7Cn0KCj1pdGVtIF9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgpCgpjcmVhdGUgdGhlIG9wdGlvbiBoYXNoCgogICAgbXkgJE9wdGlvblJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbk9wdGlvblJlZkNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15ICRPcHRpb25SZWYgPSB7CiAgICAgICAgU29ydCA9PiAnbnVtZXJpYycsCiAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgTWF4ID0+IDEwMCwKICAgIH0KCj1jdXQKCnN1YiBfQnVpbGRTZWxlY3Rpb25PcHRpb25SZWZDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkT3B0aW9uUmVmID0ge307CgogICAgIyBzZXQgU2VsZWN0ZWRJRCBvcHRpb24KICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VsZWN0ZWRJRH0gKSB7CiAgICAgICAgaWYgKCByZWYgJFBhcmFte1NlbGVjdGVkSUR9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggQHsgJFBhcmFte1NlbGVjdGVkSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0tPnskS2V5fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTZWxlY3RlZElEfS0+eyAkUGFyYW17U2VsZWN0ZWRJRH0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IFNlbGVjdGVkVmFsdWUgb3B0aW9uCiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1NlbGVjdGVkVmFsdWV9ICkgewogICAgICAgIGlmICggcmVmICRQYXJhbXtTZWxlY3RlZFZhbHVlfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJFZhbHVlICggQHsgJFBhcmFte1NlbGVjdGVkVmFsdWV9IH0gKSB7CiAgICAgICAgICAgICAgICAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0tPnskVmFsdWV9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9LT57ICRQYXJhbXtTZWxlY3RlZFZhbHVlfSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgU29ydCBvcHRpb24KICAgICRPcHRpb25SZWYtPntTb3J0fSA9IDA7CiAgICBpZiAoICRQYXJhbXtTb3J0fSApIHsKICAgICAgICAkT3B0aW9uUmVmLT57U29ydH0gPSAkUGFyYW17U29ydH07CiAgICB9CgogICAgIyBsb29rIGlmIGEgaW5kaXZpZHVhbCBzb3J0IGlzIGF2YWlsYWJsZQogICAgaWYgKCAkUGFyYW17U29ydEluZGl2aWR1YWx9ICYmIHJlZiAkUGFyYW17U29ydEluZGl2aWR1YWx9IGVxICdBUlJBWScgKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSA9ICRQYXJhbXtTb3J0SW5kaXZpZHVhbH07CiAgICB9CgogICAgIyBzZXQgU29ydFJldmVyc2Ugb3B0aW9uCiAgICAkT3B0aW9uUmVmLT57U29ydFJldmVyc2V9ID0gMDsKICAgIGlmICggJFBhcmFte1NvcnRSZXZlcnNlfSApIHsKICAgICAgICAkT3B0aW9uUmVmLT57U29ydFJldmVyc2V9ID0gMTsKICAgIH0KCiAgICAjIHNldCBUcmFuc2xhdGlvbiBvcHRpb24KICAgICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gPSAxOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtUcmFuc2xhdGlvbn0gJiYgJFBhcmFte1RyYW5zbGF0aW9ufSBlcSAwICkgewogICAgICAgICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gPSAwOwogICAgfQoKICAgICMgY29ycmVjdGluZyBzZWxlY3RlZCB2YWx1ZSBoYXNoIGlmIHRyYW5zbGF0aW9uIGlzIG9uCiAgICBpZiAoCiAgICAgICAgJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufQogICAgICAgICYmICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfQogICAgICAgICYmIHJlZiAkT3B0aW9uUmVmLT57U2VsZWN0ZWRWYWx1ZX0gZXEgJ0hBU0gnCiAgICAgICAgKQogICAgewogICAgICAgIG15ICVTZWxlY3RlZFZhbHVlTmV3OwogICAgICAgIGZvciBteSAkT3JpZ2luYWxLZXkgKCBrZXlzICV7ICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfSB9ICkgewogICAgICAgICAgICBteSAkVHJhbnNsYXRlZEtleSA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJE9yaWdpbmFsS2V5KTsKICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWVOZXd7JFRyYW5zbGF0ZWRLZXl9ID0gMTsKICAgICAgICB9CiAgICAgICAgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9ID0gXCVTZWxlY3RlZFZhbHVlTmV3OwogICAgfQoKICAgICMgc2V0IFBvc3NpYmxlTm9uZSBvcHRpb24KICAgICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ID0gMDsKICAgIGlmICggJFBhcmFte1Bvc3NpYmxlTm9uZX0gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1Bvc3NpYmxlTm9uZX0gPSAxOwogICAgfQoKICAgICMgc2V0IFRyZWVWaWV3IG9wdGlvbgogICAgJE9wdGlvblJlZi0+e1RyZWVWaWV3fSA9IDA7CiAgICBpZiAoICRQYXJhbXtUcmVlVmlld30gKSB7CiAgICAgICAgJE9wdGlvblJlZi0+e1RyZWVWaWV3fSA9IDE7CiAgICAgICAgJE9wdGlvblJlZi0+e1NvcnR9ICAgICA9ICdUcmVlVmlldyc7CiAgICB9CgogICAgIyBzZXQgRGlzYWJsZWRCcmFuY2ggb3B0aW9uCiAgICBpZiAoICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gKSB7CiAgICAgICAgaWYgKCByZWYgJFBhcmFte0Rpc2FibGVkQnJhbmNofSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBmb3IgbXkgJEJyYW5jaCAoIEB7ICRQYXJhbXtEaXNhYmxlZEJyYW5jaH0gfSApIHsKICAgICAgICAgICAgICAgICRPcHRpb25SZWYtPntEaXNhYmxlZEJyYW5jaH0tPnskQnJhbmNofSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntEaXNhYmxlZEJyYW5jaH0tPnsgJFBhcmFte0Rpc2FibGVkQnJhbmNofSB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgTWF4IG9wdGlvbgogICAgJE9wdGlvblJlZi0+e01heH0gPSAkUGFyYW17TWF4fSB8fCAxMDA7CgogICAgIyBzZXQgSFRNTFF1b3RlIG9wdGlvbgogICAgJE9wdGlvblJlZi0+e0hUTUxRdW90ZX0gPSAxOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtIVE1MUXVvdGV9ICkgewogICAgICAgICRPcHRpb25SZWYtPntIVE1MUXVvdGV9ID0gJFBhcmFte0hUTUxRdW90ZX07CiAgICB9CgogICAgcmV0dXJuICRPcHRpb25SZWY7Cn0KCj1pdGVtIF9CdWlsZFNlbGVjdGlvbkF0dHJpYnV0ZVJlZkNyZWF0ZSgpCgpjcmVhdGUgdGhlIGF0dHJpYnV0ZSBoYXNoCgogICAgbXkgJEF0dHJpYnV0ZVJlZiA9ICRMYXlvdXRPYmplY3QtPl9CdWlsZFNlbGVjdGlvbkF0dHJpYnV0ZVJlZkNyZWF0ZSgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSB7CiAgICAgICAgbmFtZSA9PiAnVGhlTmFtZScsCiAgICAgICAgbXVsdGlwbGUgPT4gdW5kZWYsCiAgICAgICAgc2l6ZSA9PiA1LAogICAgfQoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbkF0dHJpYnV0ZVJlZkNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSB7fTsKCiAgICAjIGNoZWNrIHBhcmFtcyB3aXRoIGtleSBhbmQgdmFsdWUKICAgIGZvciAocXcoTmFtZSBJRCBTaXplIENsYXNzIE9uQ2hhbmdlIE9uQ2xpY2spKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkQXR0cmlidXRlUmVmLT57IGxjKCRfKSB9ID0gJFBhcmFteyRffTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgaWQgYXR0cml1YnV0CiAgICBpZiAoICEkQXR0cmlidXRlUmVmLT57aWR9ICkgewogICAgICAgICRBdHRyaWJ1dGVSZWYtPntpZH0gPSAkQXR0cmlidXRlUmVmLT57bmFtZX07CiAgICB9CgogICAgIyBjaGVjayBwYXJhbXMgd2l0aCBrZXkgYW5kIHZhbHVlIHRoYXQgbmVlZCB0byBiZSBIVE1MLVF1b3RlZAogICAgZm9yIChxdyhUaXRsZSkpIHsKICAgICAgICBpZiAoICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRBdHRyaWJ1dGVSZWYtPnsgbGMoJF8pIH0gPSAkU2VsZi0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17JF99ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgSFRNTCBwYXJhbXMKICAgIGZvciAocXcoTXVsdGlwbGUgRGlzYWJsZWQpKSB7CiAgICAgICAgaWYgKCAkUGFyYW17JF99ICkgewogICAgICAgICAgICAkQXR0cmlidXRlUmVmLT57IGxjKCRfKSB9ID0gbGMoJF8pOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJEF0dHJpYnV0ZVJlZjsKfQoKPWl0ZW0gX0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgpCgpjcmVhdGUgdGhlIGRhdGEgaGFzaAoKICAgIG15ICREYXRhUmVmID0gJExheW91dE9iamVjdC0+X0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSgKICAgICAgICBEYXRhID0+ICRBcnJheVJlZiwgICAgICAgICAgICAgICMgdXNlICRIYXNoUmVmLCAkQXJyYXlSZWYgb3IgJEFycmF5SGFzaFJlZgogICAgICAgIEF0dHJpYnV0ZVJlZiA9PiAkQXR0cmlidXRlUmVmLAogICAgICAgIE9wdGlvblJlZiA9PiAkT3B0aW9uUmVmLAogICAgKTsKCiAgICBteSAkRGF0YVJlZiAgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gMTEsCiAgICAgICAgICAgIFZhbHVlID0+ICdUZXh0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdhYmMnLAogICAgICAgICAgICBWYWx1ZSA9PiAnJm5ic3A7Jm5ic3A7VGV4dCcsCiAgICAgICAgICAgIFNlbGVjdGVkID0+IDEsCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgX0J1aWxkU2VsZWN0aW9uRGF0YVJlZkNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRBdHRyaWJ1dGVSZWYgPSAkUGFyYW17QXR0cmlidXRlUmVmfTsKICAgIG15ICRPcHRpb25SZWYgICAgPSAkUGFyYW17T3B0aW9uUmVmfTsKICAgIG15ICREYXRhUmVmICAgICAgPSBbXTsKCiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBpZiBIYXNoUmVmIHdhcyBnaXZlbgogICAgaWYgKCByZWYgJFBhcmFte0RhdGF9IGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBzb3J0IGhhc2ggKGJlZm9yZSB0aGUgdHJhbnNsYXRpb24pCiAgICAgICAgbXkgQFNvcnRLZXlzOwogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdJbmRpdmlkdWFsVmFsdWUnICYmICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gKSB7CiAgICAgICAgICAgIG15ICVMaXN0ID0gcmV2ZXJzZSAleyAkUGFyYW17RGF0YX0gfTsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBAeyAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMaXN0eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCAkTGlzdHskS2V5fTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJExpc3R7JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAU29ydEtleXMsIHNvcnQgeyAkYSBjbXAgJGIgfSAoIHZhbHVlcyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgIyB0cmFuc2xhdGUgdmFsdWUKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgIGZvciBteSAkUm93ICgga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhfS0+eyRSb3d9ID0gJFNlbGYtPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte0RhdGF9LT57JFJvd30gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzb3J0IGhhc2ggKGFmdGVyIHRoZSB0cmFuc2xhdGlvbikKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnTnVtZXJpY0tleScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyAkYSA8PT4gJGIgfSAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNWYWx1ZScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cwogICAgICAgICAgICAgICAgPSBzb3J0IHsgJFBhcmFte0RhdGF9LT57JGF9IDw9PiAkUGFyYW17RGF0YX0tPnskYn0gfSAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0FscGhhbnVtZXJpY0tleScgKSB7CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ1RyZWVWaWV3JyApIHsKCiAgICAgICAgICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICAgICAgICAgIG15ICVTb3J0SGFzaDsKICAgICAgICAgICAgZm9yICgga2V5cyAleyAkUGFyYW17RGF0YX0gfSApIHsKICAgICAgICAgICAgICAgICRTb3J0SGFzaHskX30gPSAkUGFyYW17RGF0YX0tPnskX30gLiAnOjonOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEBTb3J0S2V5cyA9IHNvcnQgeyAkU29ydEhhc2h7JGF9IGNtcCAkU29ydEhhc2h7JGJ9IH0gKCBrZXlzICVTb3J0SGFzaCApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbEtleScgJiYgJE9wdGlvblJlZi0+e1NvcnRJbmRpdmlkdWFsfSApIHsKICAgICAgICAgICAgbXkgJUxpc3QgPSAleyAkUGFyYW17RGF0YX0gfTsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBAeyAkT3B0aW9uUmVmLT57U29ydEluZGl2aWR1YWx9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRMaXN0eyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQFNvcnRLZXlzLCAkS2V5OwogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkTGlzdHskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBwdXNoIEBTb3J0S2V5cywgc29ydCB7ICRMaXN0eyRhfSBjbXAgJExpc3R7JGJ9IH0gKCBrZXlzICVMaXN0ICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdJbmRpdmlkdWFsVmFsdWUnICYmICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gKSB7CgogICAgICAgICAgICAjIGFscmVhZHkgZG9uZSBiZWZvcmUgdGhlIHRyYW5zbGF0aW9uCiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBAU29ydEtleXMKICAgICAgICAgICAgICAgID0gc29ydCB7ICRQYXJhbXtEYXRhfS0+eyRhfSBjbXAgJFBhcmFte0RhdGF9LT57JGJ9IH0gKCBrZXlzICV7ICRQYXJhbXtEYXRhfSB9ICk7CiAgICAgICAgICAgICRPcHRpb25SZWYtPntTb3J0fSA9ICdBbHBoYW51bWVyaWNWYWx1ZSc7CiAgICAgICAgfQoKICAgICAgICAjIGNyZWF0ZSBEYXRhUmVmCiAgICAgICAgZm9yIG15ICRSb3cgKEBTb3J0S2V5cykgewogICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e0tleX0gICA9ICRSb3c7CiAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57VmFsdWV9ID0gJFBhcmFte0RhdGF9LT57JFJvd307CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgQXJyYXlIYXNoUmVmIHdhcyBnaXZlbgogICAgZWxzaWYgKCByZWYgJFBhcmFte0RhdGF9IGVxICdBUlJBWScgJiYgcmVmICRQYXJhbXtEYXRhfS0+WzBdIGVxICdIQVNIJyApIHsKCiAgICAgICAgIyBjcmVhdGUgRGF0YVJlZgogICAgICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CiAgICAgICAgICAgIGlmICggcmVmICRSb3cgZXEgJ0hBU0gnICYmIGRlZmluZWQgJFJvdy0+e0tleX0gKSB7CiAgICAgICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e0tleX0gICA9ICRSb3ctPntLZXl9OwogICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0gPSAkUm93LT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICMgdHJhbnNsYXRlIHZhbHVlCiAgICAgICAgICAgICAgICBpZiAoICRPcHRpb25SZWYtPntUcmFuc2xhdGlvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntWYWx1ZX0KICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2V0IFNlbGVjdGVkIGFuZCBEaXNhYmxlZCBvcHRpb25zCiAgICAgICAgICAgICAgICBpZiAoICRSb3ctPntTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJERhdGFSZWYtPlskQ291bnRlcl0tPntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57RGlzYWJsZWR9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57RGlzYWJsZWR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBpZiBBcnJheVJlZiB3YXMgZ2l2ZW4KICAgIGVsc2lmICggcmVmICRQYXJhbXtEYXRhfSBlcSAnQVJSQVknICkgewoKICAgICAgICBpZiAoCiAgICAgICAgICAgICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdJbmRpdmlkdWFsVmFsdWUnIHx8ICRPcHRpb25SZWYtPntTb3J0fSBlcSAnSW5kaXZpZHVhbFZhbHVlJyApCiAgICAgICAgICAgICYmICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJUxpc3QgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJFBhcmFte0RhdGF9IH07CiAgICAgICAgICAgICRQYXJhbXtEYXRhfSA9IFtdOwogICAgICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRPcHRpb25SZWYtPntTb3J0SW5kaXZpZHVhbH0gfSApIHsKICAgICAgICAgICAgICAgIGlmICggJExpc3R7JEtleX0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17RGF0YX0gfSwgJEtleTsKICAgICAgICAgICAgICAgICAgICBkZWxldGUgJExpc3R7JEtleX07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAeyAkUGFyYW17RGF0YX0gfSwgc29ydCB7ICRhIGNtcCAkYiB9ICgga2V5cyAlTGlzdCApOwogICAgICAgIH0KCiAgICAgICAgbXkgJVJldmVyc2VIYXNoOwoKICAgICAgICAjIHRyYW5zbGF0ZSB2YWx1ZQogICAgICAgIGlmICggJE9wdGlvblJlZi0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgbXkgQFRyYW5zbGF0ZUFycmF5OwogICAgICAgICAgICBmb3IgbXkgJFJvdyAoIEB7ICRQYXJhbXtEYXRhfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZVN0cmluZyA9ICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFJvdyk7CiAgICAgICAgICAgICAgICBwdXNoIEBUcmFuc2xhdGVBcnJheSwgJFRyYW5zbGF0ZVN0cmluZzsKICAgICAgICAgICAgICAgICRSZXZlcnNlSGFzaHskVHJhbnNsYXRlU3RyaW5nfSA9ICRSb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0RhdGF9ID0gXEBUcmFuc2xhdGVBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CiAgICAgICAgICAgICAgICAkUmV2ZXJzZUhhc2h7JFJvd30gPSAkUm93OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvcnQgYXJyYXkKICAgICAgICBpZiAoICRPcHRpb25SZWYtPntTb3J0fSBlcSAnQWxwaGFudW1lcmljS2V5JyB8fCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ0FscGhhbnVtZXJpY1ZhbHVlJyApCiAgICAgICAgewogICAgICAgICAgICBteSBAU29ydEFycmF5ID0gc29ydCggQHsgJFBhcmFte0RhdGF9IH0gKTsKICAgICAgICAgICAgJFBhcmFte0RhdGF9ID0gXEBTb3J0QXJyYXk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJE9wdGlvblJlZi0+e1NvcnR9IGVxICdOdW1lcmljS2V5JyB8fCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ051bWVyaWNWYWx1ZScgKSB7CiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkgPSBzb3J0IHsgJGEgPD0+ICRiIH0gKCBAeyAkUGFyYW17RGF0YX0gfSApOwogICAgICAgICAgICAkUGFyYW17RGF0YX0gPSBcQFNvcnRBcnJheTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT3B0aW9uUmVmLT57U29ydH0gZXEgJ1RyZWVWaWV3JyApIHsKCiAgICAgICAgICAgICMgYWRkIHN1ZmZpeCBmb3IgY29ycmVjdCBzb3J0aW5nCiAgICAgICAgICAgIG15IEBTb3J0QXJyYXk7CiAgICAgICAgICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBTb3J0QXJyYXksICggJFJvdyAuICc6OicgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzb3J0IGFycmF5CiAgICAgICAgICAgIEBTb3J0QXJyYXkgPSBzb3J0KEBTb3J0QXJyYXkpOwoKICAgICAgICAgICAgIyByZW1vdmUgc3VmZml4CiAgICAgICAgICAgIG15IEBTb3J0QXJyYXkyOwogICAgICAgICAgICBmb3IgbXkgJFJvdyAoQFNvcnRBcnJheSkgewogICAgICAgICAgICAgICAgJC8gPSAnOjonOwogICAgICAgICAgICAgICAgY2hvbXAoJFJvdyk7CiAgICAgICAgICAgICAgICBwdXNoIEBTb3J0QXJyYXkyLCAkUm93OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtEYXRhfSA9IFxAU29ydEFycmF5OwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgRGF0YVJlZgogICAgICAgIGZvciBteSAkUm93ICggQHsgJFBhcmFte0RhdGF9IH0gKSB7CiAgICAgICAgICAgICREYXRhUmVmLT5bJENvdW50ZXJdLT57S2V5fSAgID0gJFJldmVyc2VIYXNoeyRSb3d9OwogICAgICAgICAgICAkRGF0YVJlZi0+WyRDb3VudGVyXS0+e1ZhbHVlfSA9ICRSb3c7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgU2VsZWN0ZWRJRCBhbmQgU2VsZWN0ZWRWYWx1ZSBvcHRpb24KICAgIGlmICggJE9wdGlvblJlZi0+e1NlbGVjdGVkSUR9IHx8ICRPcHRpb25SZWYtPntTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkT3B0aW9uUmVmLT57U2VsZWN0ZWRJRH0tPnsgJFJvdy0+e0tleX0gfQogICAgICAgICAgICAgICAgfHwgJE9wdGlvblJlZi0+e1NlbGVjdGVkVmFsdWV9LT57ICRSb3ctPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkUm93LT57U2VsZWN0ZWR9ID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIERpc2FibGVkQnJhbmNoIG9wdGlvbgogICAgaWYgKCAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9ICkgewogICAgICAgIGZvciBteSAkUm93ICggQHskRGF0YVJlZn0gKSB7CiAgICAgICAgICAgIGZvciBteSAkQnJhbmNoICgga2V5cyAleyAkT3B0aW9uUmVmLT57RGlzYWJsZWRCcmFuY2h9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRSb3ctPntWYWx1ZX0gPX4gL14oXFEkQnJhbmNoXEUpJC8gfHwgJFJvdy0+e1ZhbHVlfSA9fiAvXihcUSRCcmFuY2hcRSk6Oi8gKSB7CiAgICAgICAgICAgICAgICAgICAgJFJvdy0+e0Rpc2FibGVkfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBNYXggb3B0aW9uCiAgICAjIFJFTUFSSzogRG9uJ3QgbWVyZ2UgdGhlIE1heCBoYW5kbGluZyB3aXRoIEFzY2lpMkh0bWwgZnVuY3Rpb24gY2FsbCBvZgogICAgIyB0aGUgSFRNTFF1b3RlIGhhbmRsaW5nLiBJbiB0aGlzIGNhc2UgeW91IGxvc2UgdGhlIG1heCBoYW5kbGluZyBpZiB5b3UKICAgICMgZGVhY3RpdmF0ZSBIVE1MUXVvdGUKICAgIGlmICggJE9wdGlvblJlZi0+e01heH0gKSB7CiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyREYXRhUmVmfSApIHsKCiAgICAgICAgICAgICMgUkVNQVJLOiBUaGlzIGlzIHRoZSBzYW1lIHNvbHV0aW9uIGFzIGluIEFzY2lpMkh0bWwKICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9fiBzL14oLnskT3B0aW9uUmVmLT57TWF4fX0pLis/JC8kMVxbXC5cLlxdL2dzOwoKICAgICAgICAgICAgIyRSb3ctPntWYWx1ZX0gPSBzdWJzdHIoICRSb3ctPntWYWx1ZX0sIDAsICRPcHRpb25SZWYtPntNYXh9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgSFRNTFF1b3RlIG9wdGlvbgogICAgaWYgKCAkT3B0aW9uUmVmLT57SFRNTFF1b3RlfSApIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewogICAgICAgICAgICAkUm93LT57S2V5fSAgID0gJFNlbGYtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFJvdy0+e0tleX0gKTsKICAgICAgICAgICAgJFJvdy0+e1ZhbHVlfSA9ICRTZWxmLT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRSb3ctPntWYWx1ZX0gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBTb3J0UmV2ZXJzZSBvcHRpb24KICAgIGlmICggJE9wdGlvblJlZi0+e1NvcnRSZXZlcnNlfSApIHsKICAgICAgICBAeyREYXRhUmVmfSA9IHJldmVyc2UoIEB7JERhdGFSZWZ9ICk7CiAgICB9CgogICAgIyBQb3NzaWJsZU5vbmUgb3B0aW9uCiAgICBpZiAoICRPcHRpb25SZWYtPntQb3NzaWJsZU5vbmV9ICkgewogICAgICAgIG15ICVOb25lOwogICAgICAgICROb25le0tleX0gICA9ICcnOwogICAgICAgICROb25le1ZhbHVlfSA9ICctJzsKCiAgICAgICAgdW5zaGlmdCggQHskRGF0YVJlZn0sIFwlTm9uZSApOwogICAgfQoKICAgICMgVHJlZVZpZXcgb3B0aW9uCiAgICBpZiAoICRPcHRpb25SZWYtPntUcmVlVmlld30gKSB7CgogICAgICAgIFJPVzoKICAgICAgICBmb3IgbXkgJFJvdyAoIEB7JERhdGFSZWZ9ICkgewoKICAgICAgICAgICAgbmV4dCBST1cgaWYgISRSb3ctPntWYWx1ZX07CgogICAgICAgICAgICBteSBARnJhZ21lbnQgPSBzcGxpdCAnOjonLCAkUm93LT57VmFsdWV9OwogICAgICAgICAgICAkUm93LT57VmFsdWV9ID0gcG9wIEBGcmFnbWVudDsKCiAgICAgICAgICAgIG15ICRTcGFjZSA9ICcmbmJzcDsmbmJzcDsnIHggc2NhbGFyIEBGcmFnbWVudDsKICAgICAgICAgICAgJFNwYWNlIHx8PSAnJzsKCiAgICAgICAgICAgICRSb3ctPntWYWx1ZX0gPSAkU3BhY2UgLiAkUm93LT57VmFsdWV9OwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJERhdGFSZWY7Cn0KCj1pdGVtIF9CdWlsZFNlbGVjdGlvbk91dHB1dCgpCgpjcmVhdGUgdGhlIGh0bWwgc3RyaW5nCgogICAgbXkgJEhUTUxTdHJpbmcgPSAkTGF5b3V0T2JqZWN0LT5fQnVpbGRTZWxlY3Rpb25PdXRwdXQoCiAgICAgICAgQXR0cmlidXRlUmVmID0+ICRBdHRyaWJ1dGVSZWYsCiAgICAgICAgRGF0YVJlZiA9PiAkRGF0YVJlZiwKICAgICk7CgogICAgbXkgJEF0dHJpYnV0ZVJlZiA9IHsKICAgICAgICBuYW1lID0+ICdUaGVOYW1lJywKICAgICAgICBtdWx0aXBsZSA9PiB1bmRlZiwKICAgICAgICBzaXplID0+IDUsCiAgICB9CgogICAgbXkgJERhdGFSZWYgID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+IDExLAogICAgICAgICAgICBWYWx1ZSA9PiAnVGV4dCcsCiAgICAgICAgICAgIERpc2FibGVkID0+IDEsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnYWJjJywKICAgICAgICAgICAgVmFsdWUgPT4gJyZuYnNwOyZuYnNwO1RleHQnLAogICAgICAgICAgICBTZWxlY3RlZCA9PiAxLAogICAgICAgIH0sCiAgICBdOwoKPWN1dAoKc3ViIF9CdWlsZFNlbGVjdGlvbk91dHB1dCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTdHJpbmc7CgogICAgIyBzdGFydCBnZW5lcmF0aW9uLCBpZiBBdHRyaWJ1dGVSZWYgYW5kIERhdGFSZWYgd2FzIGZvdW5kCiAgICBpZiAoICRQYXJhbXtBdHRyaWJ1dGVSZWZ9ICYmICRQYXJhbXtEYXRhUmVmfSApIHsKCiAgICAgICAgIyBnZW5lcmF0ZSA8c2VsZWN0PiByb3cKICAgICAgICAkU3RyaW5nID0gJzxzZWxlY3QnOwogICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkUGFyYW17QXR0cmlidXRlUmVmfSB9ICkgewogICAgICAgICAgICBpZiAoICRLZXkgJiYgZGVmaW5lZCAkUGFyYW17QXR0cmlidXRlUmVmfS0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgJFN0cmluZyAuPSAiICRLZXk9XCIkUGFyYW17QXR0cmlidXRlUmVmfS0+eyRLZXl9XCIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICgkS2V5KSB7CiAgICAgICAgICAgICAgICAkU3RyaW5nIC49ICIgJEtleSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFN0cmluZyAuPSAiPlxuIjsKCiAgICAgICAgIyBnZW5lcmF0ZSA8b3B0aW9uPiByb3dzCiAgICAgICAgZm9yIG15ICRSb3cgKCBAeyAkUGFyYW17RGF0YVJlZn0gfSApIHsKICAgICAgICAgICAgbXkgJEtleSA9ICcnOwogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFJvdy0+e0tleX0gKSB7CiAgICAgICAgICAgICAgICAkS2V5ID0gJFJvdy0+e0tleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJFZhbHVlID0gJyc7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUm93LT57VmFsdWV9ICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gJFJvdy0+e1ZhbHVlfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkU2VsZWN0ZWREaXNhYmxlZCA9ICcnOwogICAgICAgICAgICBpZiAoICRSb3ctPntTZWxlY3RlZH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0ZWREaXNhYmxlZCA9ICcgc2VsZWN0ZWQ9InNlbGVjdGVkIic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkUm93LT57RGlzYWJsZWR9ICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkRGlzYWJsZWQgPSAnIGRpc2FibGVkPSJkaXNhYmxlZCInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPcHRpb25UaXRsZSA9ICcnOwogICAgICAgICAgICBpZiAoICRQYXJhbXtPcHRpb25UaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkT3B0aW9uVGl0bGUgPSAnIHRpdGxlPSInIC4gJFZhbHVlIC4gJyInOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTdHJpbmcgLj0gIiAgPG9wdGlvbiB2YWx1ZT1cIiRLZXlcIiRTZWxlY3RlZERpc2FibGVkJE9wdGlvblRpdGxlPiRWYWx1ZTwvb3B0aW9uPlxuIjsKICAgICAgICB9CiAgICAgICAgJFN0cmluZyAuPSAnPC9zZWxlY3Q+JzsKICAgIH0KICAgIHJldHVybiAkU3RyaW5nOwp9CgpzdWIgX0Rpc2FibGVCYW5uZXJDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxIGlmICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU2VjdXJlOjpEaXNhYmxlQmFubmVyJyk7CiAgICByZXR1cm4gICBpZiAhJFBhcmFte091dHB1dFJlZn07CgogICAgIyByZW1vdmUgdGhlIHZlcnNpb24gdGFnIGZyb20gdGhlIGhlYWRlcgogICAgJHsgJFBhcmFte091dHB1dFJlZn0gfSA9fiBzewogICAgICAgICAgICAgICAgXiBYLVBvd2VyZWQtQnk6IC4rPyBPcGVuIFxzIFRpY2tldCBccyBSZXF1ZXN0IFxzIFN5c3RlbSBccyBcKGh0dHAgLis/IFwpJCBcbgogICAgICAgICAgICB9e31zbXg7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9SZW1vdmVTY3JpcHRUYWdzKCkKClRoaXMgZnVuY3Rpb24gd2lsbCByZW1vdmUgdGhlIHN1cnJvdW5kaW5nIDxzY3JpcHQ+IHRhZ3Mgb2YgYQpwaWVjZSBvZiBKYXZhU2NyaXB0IGNvZGUsIGlmIHRoZXkgYXJlIHByZXNlbnQsIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KCiAgICBteSAkQ29kZUNvbnRlbnQgPSAkTGF5b3V0T2JqZWN0LT5fUmVtb3ZlU2NyaXB0VGFncyhDb2RlID0+ICRTb21lQ29kZSk7Cgo9Y3V0CgpzdWIgX1JlbW92ZVNjcmlwdFRhZ3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29kZSA9ICRQYXJhbXtDb2RlfSB8fCAnJzsKCiAgICBpZiAoICRDb2RlID1+IG0vPHNjcmlwdC8gKSB7CgogICAgICAgICMgY3V0IG91dCBkdGwgYmxvY2sgY29tbWVudHMgb2YgYWxyZWFkeSByZXBsYWNlZCBkdGwgYmxvY2tzCiAgICAgICAgJENvZGUgPX4gc3sKICAgICAgICAgICAgXgogICAgICAgICAgICA8IS0tCiAgICAgICAgICAgIFwvPwogICAgICAgICAgICBcdysKICAgICAgICAgICAgLS0+CiAgICAgICAgICAgIFxyP1xuCiAgICAgICAgfXt9c214ZzsKCiAgICAgICAgIyBjdXQgb3V0IG9wZW5pbmcgc2NyaXB0IHRhZ3MKICAgICAgICAkQ29kZSA9fiBzewogICAgICAgICAgICA8c2NyaXB0W14+XSs+CiAgICAgICAgICAgICg/OlxzKjwhLS0pPwogICAgICAgICAgICAoPzpccyovL1xzKjwhXFtDREFUQVxbKT8KICAgICAgICB9CiAgICAgICAge31zbXhnOwoKICAgICAgICAjIGN1dCBvdXQgY2xvc2luZyBzY3JpcHQgdGFncwogICAgICAgICRDb2RlID1+IHN7CiAgICAgICAgICAgICg/Oi0tPlxzKik/CiAgICAgICAgICAgICg/Oi8vXHMqXF1cXT5ccyopPwogICAgICAgICAgICA8L3NjcmlwdD4KICAgICAgICB9e31zbXhnOwoKICAgIH0KICAgIHJldHVybiAkQ29kZTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjguMi41ICQgJERhdGU6IDIwMTEtMTEtMTEgMTQ6MjQ6MTQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9MYXlvdXRMb2FkZXIucG0gLSBwcm92aWRlcyBnZW5lcmljIEhUTUwgb3V0cHV0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIEtJWENvcmUgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFJlbmUoZG90KUJvZWhtKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBMYXlvdXRMb2FkZXIucG0sdiAxLjEgMjAxMS0wOC0wNCAwNzo0MzozMyByYm8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dExvYWRlcjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9hZGVyOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXRMb2FkZXIgLSBDU1MvSmF2YVNjcmlwdAoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgdmFsaWQgZnVuY3Rpb25zLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIExvYWRlckNyZWF0ZUFnZW50Q1NTQ2FsbHMoKQoKR2VuZXJhdGUgdGhlIG1pbmlmaWVkIENTUyBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSwKdGFraW5nIGEgbGlzdCBmcm9tIHRoZSBMb2FkZXI6OkFnZW50OjpDb21tb25DU1MgY29uZmlnIGl0ZW0uCgogICAgJExheW91dE9iamVjdC0+TG9hZGVyQ3JlYXRlQWdlbnRDU1NDYWxscygKICAgICAgICBTa2luID0+ICdNeVNraW4nLCAjIG9wdGlvbmFsLCBpZiBub3QgcHJvdmlkZWQgc2tpbiBpcyB0aGUgY29uZmlndXJlZCBieSBkZWZhdWx0CiAgICApOwoKPWN1dAoKc3ViIExvYWRlckNyZWF0ZUFnZW50Q1NTQ2FsbHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0xvYWRlck9iamVjdH0gfHw9IEtlcm5lbDo6U3lzdGVtOjpMb2FkZXItPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIGdldCBob3N0IGJhc2VkIGRlZmF1bHQgc2tpbiBjb25maWd1cmF0aW9uCiAgICBteSAkU2tpblNlbGVjdGVkSG9zdEJhc2VkOwogICAgbXkgJERlZmF1bHRTa2luSG9zdEJhc2VkCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTG9hZGVyOjpBZ2VudDo6RGVmYXVsdFNlbGVjdGVkU2tpbjo6SG9zdEJhc2VkJyk7CiAgICBpZiAoICREZWZhdWx0U2tpbkhvc3RCYXNlZCAmJiAkRU5We0hUVFBfSE9TVH0gKSB7CiAgICAgICAgUkVHRVhQOgogICAgICAgIGZvciBteSAkUmVnRXhwICggc29ydCBrZXlzICV7JERlZmF1bHRTa2luSG9zdEJhc2VkfSApIHsKCiAgICAgICAgICAgICMgZG8gbm90IHVzZSBlbXB0eSByZWdleHAgb3Igc2tpbiBkaXJlY3RvcmllcwogICAgICAgICAgICBuZXh0IFJFR0VYUCBpZiAhJFJlZ0V4cDsKICAgICAgICAgICAgbmV4dCBSRUdFWFAgaWYgISREZWZhdWx0U2tpbkhvc3RCYXNlZC0+eyRSZWdFeHB9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiByZWdleHAgaXMgbWF0Y2hpbmcKICAgICAgICAgICAgaWYgKCAkRU5We0hUVFBfSE9TVH0gPX4gLyRSZWdFeHAvaSApIHsKICAgICAgICAgICAgICAgICRTa2luU2VsZWN0ZWRIb3N0QmFzZWQgPSAkRGVmYXVsdFNraW5Ib3N0QmFzZWQtPnskUmVnRXhwfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGRldGVybWluZSBza2luCiAgICAjIDEuIHVzZSBVc2VyU2tpbiBzZXR0aW5nIGZyb20gQWdlbnQgcHJlZmVyZW5jZXMsIGlmIGF2YWlsYWJsZQogICAgIyAyLiB1c2UgSG9zdEJhc2VkIHNraW4gc2V0dGluZywgaWYgYXZhaWxhYmxlCiAgICAjIDMuIHVzZSBkZWZhdWx0IHNraW4gZnJvbSBjb25maWd1cmF0aW9uCgogICAgbXkgJFNraW5TZWxlY3RlZCA9ICRTZWxmLT57J1VzZXJTa2luJ30KICAgICAgICB8fCAkU2tpblNlbGVjdGVkSG9zdEJhc2VkCiAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xvYWRlcjo6QWdlbnQ6OkRlZmF1bHRTZWxlY3RlZFNraW4nKQogICAgICAgIHx8ICdkZWZhdWx0JzsKCiAgICBteSAkU2tpbkhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvaHR0cGQvaHRkb2NzL3NraW5zJzsKICAgIG15ICREb01pbmlmeSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkVuYWJsZWQ6OkNTUycpOwoKICAgIG15ICRUb29sYmFyTW9kdWxlU2V0dGluZ3MgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OlRvb2xCYXJNb2R1bGUnKTsKICAgIG15ICRDdXN0b21lclVzZXJJdGVtU2V0dGluZ3MgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6OkN1c3RvbWVyVXNlcjo6SXRlbScpOwoKICAgIHsKICAgICAgICBteSBARmlsZUxpc3Q7CgogICAgICAgICMgZ2V0IGdsb2JhbCBjc3MKICAgICAgICBteSAkQ29tbW9uQ1NTTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkFnZW50OjpDb21tb25DU1MnKTsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDb21tb25DU1NMaXN0fSApIHsKICAgICAgICAgICAgcHVzaCBARmlsZUxpc3QsIEB7ICRDb21tb25DU1NMaXN0LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRvb2xiYXIgbW9kdWxlIGNzcwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFRvb2xiYXJNb2R1bGVTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIGlmICggJFRvb2xiYXJNb2R1bGVTZXR0aW5ncy0+eyRLZXl9LT57Q1NTfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCAkVG9vbGJhck1vZHVsZVNldHRpbmdzLT57JEtleX0tPntDU1N9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjdXN0b21lciB1c2VyIGl0ZW0gY3NzCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ3VzdG9tZXJVc2VySXRlbVNldHRpbmdzfSApIHsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VySXRlbVNldHRpbmdzLT57JEtleX0tPntDU1N9ICkgewogICAgICAgICAgICAgICAgcHVzaCBARmlsZUxpc3QsICRDdXN0b21lclVzZXJJdGVtU2V0dGluZ3MtPnskS2V5fS0+e0NTU307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5fSGFuZGxlQ1NTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnQ29tbW9uQ1NTJywKICAgICAgICAgICAgU2tpbkhvbWUgID0+ICRTa2luSG9tZSwKICAgICAgICAgICAgU2tpblR5cGUgID0+ICdBZ2VudCcsCiAgICAgICAgICAgIFNraW4gICAgICA9PiAkU2tpblNlbGVjdGVkLAogICAgICAgICk7CiAgICB9CgogICAgewogICAgICAgIG15IEBGaWxlTGlzdDsKCiAgICAgICAgIyBnZXQgZ2xvYmFsIGNzcyBmb3IgaWU3CiAgICAgICAgbXkgJENvbW1vbkNTU0lFN0xpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTG9hZGVyOjpBZ2VudDo6Q29tbW9uQ1NTOjpJRTcnKTsKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDb21tb25DU1NJRTdMaXN0fSApIHsKICAgICAgICAgICAgcHVzaCBARmlsZUxpc3QsIEB7ICRDb21tb25DU1NJRTdMaXN0LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRvb2xiYXIgbW9kdWxlIGNzcyBmb3IgaWU3CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskVG9vbGJhck1vZHVsZVNldHRpbmdzfSApIHsKICAgICAgICAgICAgaWYgKCAkVG9vbGJhck1vZHVsZVNldHRpbmdzLT57JEtleX0tPntDU1NfSUU3fSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCAkVG9vbGJhck1vZHVsZVNldHRpbmdzLT57JEtleX0tPntDU1NfSUU3fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgdXNlciBpdGVtIGNzcwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JEN1c3RvbWVyVXNlckl0ZW1TZXR0aW5nc30gKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckl0ZW1TZXR0aW5ncy0+eyRLZXl9LT57Q1NTX0lFN30gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBGaWxlTGlzdCwgJEN1c3RvbWVyVXNlckl0ZW1TZXR0aW5ncy0+eyRLZXl9LT57Q1NTX0lFN307CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5fSGFuZGxlQ1NTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnQ29tbW9uQ1NTX0lFNycsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQWdlbnQnLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgIHsKICAgICAgICBteSBARmlsZUxpc3Q7CgogICAgICAgICMgZ2V0IGdsb2JhbCBjc3MgZm9yIElFOAogICAgICAgIG15ICRDb21tb25DU1NJRThMaXN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xvYWRlcjo6QWdlbnQ6OkNvbW1vbkNTUzo6SUU4Jyk7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ29tbW9uQ1NTSUU4TGlzdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCBAeyAkQ29tbW9uQ1NTSUU4TGlzdC0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0b29sYmFyIG1vZHVsZSBjc3MgZm9yIGllOAogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFRvb2xiYXJNb2R1bGVTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIGlmICggJFRvb2xiYXJNb2R1bGVTZXR0aW5ncy0+eyRLZXl9LT57Q1NTX0lFOH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBGaWxlTGlzdCwgJFRvb2xiYXJNb2R1bGVTZXR0aW5ncy0+eyRLZXl9LT57Q1NTX0lFOH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgaXRlbSBjc3MKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDdXN0b21lclVzZXJJdGVtU2V0dGluZ3N9ICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJJdGVtU2V0dGluZ3MtPnskS2V5fS0+e0NTU19JRTh9ICkgewogICAgICAgICAgICAgICAgcHVzaCBARmlsZUxpc3QsICRDdXN0b21lclVzZXJJdGVtU2V0dGluZ3MtPnskS2V5fS0+e0NTU19JRTh9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+X0hhbmRsZUNTU0xpc3QoCiAgICAgICAgICAgIExpc3QgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBEb01pbmlmeSAgPT4gJERvTWluaWZ5LAogICAgICAgICAgICBCbG9ja05hbWUgPT4gJ0NvbW1vbkNTU19JRTgnLAogICAgICAgICAgICBTa2luSG9tZSAgPT4gJFNraW5Ib21lLAogICAgICAgICAgICBTa2luVHlwZSAgPT4gJ0FnZW50JywKICAgICAgICAgICAgU2tpbiAgICAgID0+ICRTa2luU2VsZWN0ZWQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG5vdyBoYW5kbGUgbW9kdWxlIHNwZWNpZmljIENTUwogICAgbXkgJExvYWRlckFjdGlvbiA9ICRTZWxmLT57QWN0aW9ufSB8fCAnTG9naW4nOwogICAgJExvYWRlckFjdGlvbiA9ICdMb2dpbicgaWYgKCAkTG9hZGVyQWN0aW9uIGVxICdMb2dvdXQnICk7CgogICAgbXkgJEZyb250ZW5kTW9kdWxlUmVnaXN0cmF0aW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRMb2FkZXJBY3Rpb259CiAgICAgICAgfHwge307CgogICAgewoKICAgICAgICBteSAkQXBwQ1NTTGlzdCA9ICRGcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbi0+e0xvYWRlcn0tPntDU1N9IHx8IFtdOwoKICAgICAgICBteSBARmlsZUxpc3QgPSBAeyRBcHBDU1NMaXN0fTsKCiAgICAgICAgJFNlbGYtPl9IYW5kbGVDU1NMaXN0KAogICAgICAgICAgICBMaXN0ICAgICAgPT4gXEBGaWxlTGlzdCwKICAgICAgICAgICAgRG9NaW5pZnkgID0+ICREb01pbmlmeSwKICAgICAgICAgICAgQmxvY2tOYW1lID0+ICdNb2R1bGVDU1MnLAogICAgICAgICAgICBTa2luSG9tZSAgPT4gJFNraW5Ib21lLAogICAgICAgICAgICBTa2luVHlwZSAgPT4gJ0FnZW50JywKICAgICAgICAgICAgU2tpbiAgICAgID0+ICRTa2luU2VsZWN0ZWQsCiAgICAgICAgKTsKICAgIH0KCiAgICB7CiAgICAgICAgbXkgJEFwcENTU0xpc3QgPSAkRnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24tPntMb2FkZXJ9LT57Q1NTX0lFN30gfHwgW107CgogICAgICAgIG15IEBGaWxlTGlzdCA9IEB7JEFwcENTU0xpc3R9OwoKICAgICAgICAkU2VsZi0+X0hhbmRsZUNTU0xpc3QoCiAgICAgICAgICAgIExpc3QgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBEb01pbmlmeSAgPT4gJERvTWluaWZ5LAogICAgICAgICAgICBCbG9ja05hbWUgPT4gJ01vZHVsZUNTU19JRTcnLAogICAgICAgICAgICBTa2luSG9tZSAgPT4gJFNraW5Ib21lLAogICAgICAgICAgICBTa2luVHlwZSAgPT4gJ0FnZW50JywKICAgICAgICAgICAgU2tpbiAgICAgID0+ICRTa2luU2VsZWN0ZWQsCiAgICAgICAgKTsKICAgIH0KCiAgICB7CiAgICAgICAgbXkgJEFwcENTU0xpc3QgPSAkRnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24tPntMb2FkZXJ9LT57Q1NTX0lFOH0gfHwgW107CgogICAgICAgIG15IEBGaWxlTGlzdCA9IEB7JEFwcENTU0xpc3R9OwoKICAgICAgICAkU2VsZi0+X0hhbmRsZUNTU0xpc3QoCiAgICAgICAgICAgIExpc3QgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBEb01pbmlmeSAgPT4gJERvTWluaWZ5LAogICAgICAgICAgICBCbG9ja05hbWUgPT4gJ01vZHVsZUNTU19JRTgnLAogICAgICAgICAgICBTa2luSG9tZSAgPT4gJFNraW5Ib21lLAogICAgICAgICAgICBTa2luVHlwZSAgPT4gJ0FnZW50JywKICAgICAgICAgICAgU2tpbiAgICAgID0+ICRTa2luU2VsZWN0ZWQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjcHJpbnQgU1RERVJSICJUaW1lOiAiIC4gVGltZTo6SGlSZXM6OnR2X2ludGVydmFsKFskdDBdKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTG9hZGVyQ3JlYXRlQWdlbnRKU0NhbGxzKCkKCkdlbmVyYXRlIHRoZSBtaW5pZmllZCBKUyBmaWxlcyBhbmQgdGhlIHRhZ3MgcmVmZXJlbmNpbmcgdGhlbSwKdGFraW5nIGEgbGlzdCBmcm9tIHRoZSBMb2FkZXI6OkFnZW50OjpDb21tb25KUyBjb25maWcgaXRlbS4KCiAgICAkTGF5b3V0T2JqZWN0LT5Mb2FkZXJDcmVhdGVBZ2VudEpTQ2FsbHMoKTsKCj1jdXQKCnN1YiBMb2FkZXJDcmVhdGVBZ2VudEpTQ2FsbHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+e0xvYWRlck9iamVjdH0gfHw9IEtlcm5lbDo6U3lzdGVtOjpMb2FkZXItPm5ldyggJXskU2VsZn0gKTsKCiAgICAjdXNlIFRpbWU6OkhpUmVzOwogICAgI215ICR0MCA9IFRpbWU6OkhpUmVzOjpnZXR0aW1lb2ZkYXkoKTsKCiAgICBteSAkSlNIb21lICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gJy92YXIvaHR0cGQvaHRkb2NzL2pzJzsKICAgIG15ICREb01pbmlmeSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkVuYWJsZWQ6OkpTJyk7CgogICAgewogICAgICAgIG15IEBGaWxlTGlzdDsKCiAgICAgICAgIyBnZXQgZ2xvYmFsIGpzCiAgICAgICAgbXkgJENvbW1vbkpTTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkFnZW50OjpDb21tb25KUycpOwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JENvbW1vbkpTTGlzdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCBAeyAkQ29tbW9uSlNMaXN0LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHRvb2xiYXIgbW9kdWxlIGpzCiAgICAgICAgbXkgJFRvb2xiYXJNb2R1bGVTZXR0aW5ncyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6VG9vbEJhck1vZHVsZScpOwogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JFRvb2xiYXJNb2R1bGVTZXR0aW5nc30gKSB7CiAgICAgICAgICAgIGlmICggJFRvb2xiYXJNb2R1bGVTZXR0aW5ncy0+eyRLZXl9LT57SmF2YVNjcmlwdH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBGaWxlTGlzdCwgJFRvb2xiYXJNb2R1bGVTZXR0aW5ncy0+eyRLZXl9LT57SmF2YVNjcmlwdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRTZWxmLT5fSGFuZGxlSlNMaXN0KAogICAgICAgICAgICBMaXN0ICAgICAgPT4gXEBGaWxlTGlzdCwKICAgICAgICAgICAgRG9NaW5pZnkgID0+ICREb01pbmlmeSwKICAgICAgICAgICAgQmxvY2tOYW1lID0+ICdDb21tb25KUycsCiAgICAgICAgICAgIEpTSG9tZSAgICA9PiAkSlNIb21lLAogICAgICAgICk7CgogICAgfQoKICAgICMgbm93IGhhbmRsZSBtb2R1bGUgc3BlY2lmaWMgSlMKICAgIHsKICAgICAgICBteSAkTG9hZGVyQWN0aW9uID0gJFNlbGYtPntBY3Rpb259IHx8ICdMb2dpbic7CiAgICAgICAgJExvYWRlckFjdGlvbiA9ICdMb2dpbicgaWYgKCAkTG9hZGVyQWN0aW9uIGVxICdMb2dvdXQnICk7CgogICAgICAgIG15ICRBcHBKU0xpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57JExvYWRlckFjdGlvbn0tPntMb2FkZXJ9CiAgICAgICAgICAgIC0+e0phdmFTY3JpcHR9IHx8IFtdOwoKICAgICAgICBteSBARmlsZUxpc3QgPSBAeyRBcHBKU0xpc3R9OwoKICAgICAgICAkU2VsZi0+X0hhbmRsZUpTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnTW9kdWxlSlMnLAogICAgICAgICAgICBKU0hvbWUgICAgPT4gJEpTSG9tZSwKICAgICAgICApOwoKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gTG9hZGVyQ3JlYXRlQ3VzdG9tZXJDU1NDYWxscygpCgpHZW5lcmF0ZSB0aGUgbWluaWZpZWQgQ1NTIGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtLAp0YWtpbmcgYSBsaXN0IGZyb20gdGhlIExvYWRlcjo6Q3VzdG9tZXI6OkNvbW1vbkNTUyBjb25maWcgaXRlbS4KCiAgICAkTGF5b3V0T2JqZWN0LT5Mb2FkZXJDcmVhdGVDdXN0b21lckNTU0NhbGxzKCk7Cgo9Y3V0CgpzdWIgTG9hZGVyQ3JlYXRlQ3VzdG9tZXJDU1NDYWxscyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57TG9hZGVyT2JqZWN0fSB8fD0gS2VybmVsOjpTeXN0ZW06OkxvYWRlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIG15ICRTa2luU2VsZWN0ZWQgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTG9hZGVyOjpDdXN0b21lcjo6U2VsZWN0ZWRTa2luJykKICAgICAgICB8fCAnZGVmYXVsdCc7CgogICAgIyBmb3JjZSBhIHNraW4gYmFzZWQgb24gaG9zdCBuYW1lCiAgICBteSAkRGVmYXVsdFNraW5Ib3N0QmFzZWQKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkN1c3RvbWVyOjpTZWxlY3RlZFNraW46Okhvc3RCYXNlZCcpOwogICAgaWYgKCAkRGVmYXVsdFNraW5Ib3N0QmFzZWQgJiYgJEVOVntIVFRQX0hPU1R9ICkgewogICAgICAgIFJFR0VYUDoKICAgICAgICBmb3IgbXkgJFJlZ0V4cCAoIHNvcnQga2V5cyAleyREZWZhdWx0U2tpbkhvc3RCYXNlZH0gKSB7CgogICAgICAgICAgICAjIGRvIG5vdCB1c2UgZW1wdHkgcmVnZXhwIG9yIHNraW4gZGlyZWN0b3JpZXMKICAgICAgICAgICAgbmV4dCBSRUdFWFAgaWYgISRSZWdFeHA7CiAgICAgICAgICAgIG5leHQgUkVHRVhQIGlmICEkRGVmYXVsdFNraW5Ib3N0QmFzZWQtPnskUmVnRXhwfTsKCiAgICAgICAgICAgICMgY2hlY2sgaWYgcmVnZXhwIGlzIG1hdGNoaW5nCiAgICAgICAgICAgIGlmICggJEVOVntIVFRQX0hPU1R9ID1+IC8kUmVnRXhwL2kgKSB7CiAgICAgICAgICAgICAgICAkU2tpblNlbGVjdGVkID0gJERlZmF1bHRTa2luSG9zdEJhc2VkLT57JFJlZ0V4cH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJFNraW5Ib21lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvdmFyL2h0dHBkL2h0ZG9jcy9za2lucyc7CiAgICBteSAkRG9NaW5pZnkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTG9hZGVyOjpFbmFibGVkOjpDU1MnKTsKCiAgICB7CiAgICAgICAgbXkgJENvbW1vbkNTU0xpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTG9hZGVyOjpDdXN0b21lcjo6Q29tbW9uQ1NTJyk7CgogICAgICAgIG15IEBGaWxlTGlzdDsKCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ29tbW9uQ1NTTGlzdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCBAeyAkQ29tbW9uQ1NTTGlzdC0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+X0hhbmRsZUNTU0xpc3QoCiAgICAgICAgICAgIExpc3QgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBEb01pbmlmeSAgPT4gJERvTWluaWZ5LAogICAgICAgICAgICBCbG9ja05hbWUgPT4gJ0NvbW1vbkNTUycsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgIHsKICAgICAgICBteSAkQ29tbW9uQ1NTSUU2TGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkN1c3RvbWVyOjpDb21tb25DU1M6OklFNicpOwoKICAgICAgICBteSBARmlsZUxpc3Q7CgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JENvbW1vbkNTU0lFNkxpc3R9ICkgewogICAgICAgICAgICBwdXNoIEBGaWxlTGlzdCwgQHsgJENvbW1vbkNTU0lFNkxpc3QtPnskS2V5fSB9OwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPl9IYW5kbGVDU1NMaXN0KAogICAgICAgICAgICBMaXN0ICAgICAgPT4gXEBGaWxlTGlzdCwKICAgICAgICAgICAgRG9NaW5pZnkgID0+ICREb01pbmlmeSwKICAgICAgICAgICAgQmxvY2tOYW1lID0+ICdDb21tb25DU1NfSUU2JywKICAgICAgICAgICAgU2tpbkhvbWUgID0+ICRTa2luSG9tZSwKICAgICAgICAgICAgU2tpblR5cGUgID0+ICdDdXN0b21lcicsCiAgICAgICAgICAgIFNraW4gICAgICA9PiAkU2tpblNlbGVjdGVkLAogICAgICAgICk7CiAgICB9CgogICAgewogICAgICAgIG15ICRDb21tb25DU1NJRTdMaXN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xvYWRlcjo6Q3VzdG9tZXI6OkNvbW1vbkNTUzo6SUU3Jyk7CgogICAgICAgIG15IEBGaWxlTGlzdDsKCiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ29tbW9uQ1NTSUU3TGlzdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCBAeyAkQ29tbW9uQ1NTSUU3TGlzdC0+eyRLZXl9IH07CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+X0hhbmRsZUNTU0xpc3QoCiAgICAgICAgICAgIExpc3QgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBEb01pbmlmeSAgPT4gJERvTWluaWZ5LAogICAgICAgICAgICBCbG9ja05hbWUgPT4gJ0NvbW1vbkNTU19JRTcnLAogICAgICAgICAgICBTa2luSG9tZSAgPT4gJFNraW5Ib21lLAogICAgICAgICAgICBTa2luVHlwZSAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgU2tpbiAgICAgID0+ICRTa2luU2VsZWN0ZWQsCiAgICAgICAgKTsKICAgIH0KCiAgICB7CiAgICAgICAgbXkgJENvbW1vbkNTU0lFN0xpc3QgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTG9hZGVyOjpDdXN0b21lcjo6Q29tbW9uQ1NTOjpJRTgnKTsKCiAgICAgICAgbXkgQEZpbGVMaXN0OwoKICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDb21tb25DU1NJRTdMaXN0fSApIHsKICAgICAgICAgICAgcHVzaCBARmlsZUxpc3QsIEB7ICRDb21tb25DU1NJRTdMaXN0LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fSGFuZGxlQ1NTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnQ29tbW9uQ1NTX0lFNycsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgICMgbm93IGhhbmRsZSBtb2R1bGUgc3BlY2lmaWMgQ1NTCiAgICBteSAkTG9hZGVyQWN0aW9uID0gJFNlbGYtPntBY3Rpb259IHx8ICdMb2dpbic7CiAgICAkTG9hZGVyQWN0aW9uID0gJ0xvZ2luJyBpZiAoICRMb2FkZXJBY3Rpb24gZXEgJ0xvZ291dCcgKTsKCiAgICBteSAkRnJvbnRlbmRNb2R1bGVSZWdpc3RyYXRpb24KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lckZyb250ZW5kOjpNb2R1bGUnKS0+eyRMb2FkZXJBY3Rpb259CiAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1B1YmxpY0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRMb2FkZXJBY3Rpb259CiAgICAgICAgfHwge307CgogICAgewogICAgICAgIG15ICRBcHBDU1NMaXN0ID0gJEZyb250ZW5kTW9kdWxlUmVnaXN0cmF0aW9uLT57TG9hZGVyfS0+e0NTU30gfHwgW107CgogICAgICAgIG15IEBGaWxlTGlzdCA9IEB7JEFwcENTU0xpc3R9OwoKICAgICAgICAkU2VsZi0+X0hhbmRsZUNTU0xpc3QoCiAgICAgICAgICAgIExpc3QgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBEb01pbmlmeSAgPT4gJERvTWluaWZ5LAogICAgICAgICAgICBCbG9ja05hbWUgPT4gJ01vZHVsZUNTUycsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgIHsKICAgICAgICBteSAkQXBwQ1NTTGlzdCA9ICRGcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbi0+e0xvYWRlcn0tPntDU1NfSUU2fSB8fCBbXTsKCiAgICAgICAgbXkgQEZpbGVMaXN0ID0gQHskQXBwQ1NTTGlzdH07CgogICAgICAgICRTZWxmLT5fSGFuZGxlQ1NTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnTW9kdWxlQ1NTX0lFNicsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgIHsKICAgICAgICBteSAkQXBwQ1NTTGlzdCA9ICRGcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbi0+e0xvYWRlcn0tPntDU1NfSUU3fSB8fCBbXTsKCiAgICAgICAgbXkgQEZpbGVMaXN0ID0gQHskQXBwQ1NTTGlzdH07CgogICAgICAgICRTZWxmLT5fSGFuZGxlQ1NTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnTW9kdWxlQ1NTX0lFNycsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgIHsKICAgICAgICBteSAkQXBwQ1NTTGlzdCA9ICRGcm9udGVuZE1vZHVsZVJlZ2lzdHJhdGlvbi0+e0xvYWRlcn0tPntDU1NfSUU4fSB8fCBbXTsKCiAgICAgICAgbXkgQEZpbGVMaXN0ID0gQHskQXBwQ1NTTGlzdH07CgogICAgICAgICRTZWxmLT5fSGFuZGxlQ1NTTGlzdCgKICAgICAgICAgICAgTGlzdCAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgIERvTWluaWZ5ICA9PiAkRG9NaW5pZnksCiAgICAgICAgICAgIEJsb2NrTmFtZSA9PiAnTW9kdWxlQ1NTX0lFOCcsCiAgICAgICAgICAgIFNraW5Ib21lICA9PiAkU2tpbkhvbWUsCiAgICAgICAgICAgIFNraW5UeXBlICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICBTa2luICAgICAgPT4gJFNraW5TZWxlY3RlZCwKICAgICAgICApOwogICAgfQoKICAgICNwcmludCBTVERFUlIgIlRpbWU6ICIgLiBUaW1lOjpIaVJlczo6dHZfaW50ZXJ2YWwoWyR0MF0pOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMb2FkZXJDcmVhdGVDdXN0b21lckpTQ2FsbHMoKQoKR2VuZXJhdGUgdGhlIG1pbmlmaWVkIEpTIGZpbGVzIGFuZCB0aGUgdGFncyByZWZlcmVuY2luZyB0aGVtLAp0YWtpbmcgYSBsaXN0IGZyb20gdGhlIExvYWRlcjo6Q3VzdG9tZXI6OkNvbW1vbkpTIGNvbmZpZyBpdGVtLgoKICAgICRMYXlvdXRPYmplY3QtPkxvYWRlckNyZWF0ZUN1c3RvbWVySlNDYWxscygpOwoKPWN1dAoKc3ViIExvYWRlckNyZWF0ZUN1c3RvbWVySlNDYWxscyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT57TG9hZGVyT2JqZWN0fSB8fD0gS2VybmVsOjpTeXN0ZW06OkxvYWRlci0+bmV3KCAleyRTZWxmfSApOwoKICAgICN1c2UgVGltZTo6SGlSZXM7CiAgICAjbXkgJHQwID0gVGltZTo6SGlSZXM6OmdldHRpbWVvZmRheSgpOwoKICAgIG15ICRKU0hvbWUgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9odHRwZC9odGRvY3MvanMnOwogICAgbXkgJERvTWluaWZ5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xvYWRlcjo6RW5hYmxlZDo6SlMnKTsKCiAgICB7CiAgICAgICAgbXkgJENvbW1vbkpTTGlzdCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMb2FkZXI6OkN1c3RvbWVyOjpDb21tb25KUycpOwoKICAgICAgICBteSBARmlsZUxpc3Q7CgogICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JENvbW1vbkpTTGlzdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEZpbGVMaXN0LCBAeyAkQ29tbW9uSlNMaXN0LT57JEtleX0gfTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fSGFuZGxlSlNMaXN0KAogICAgICAgICAgICBMaXN0ICAgICAgPT4gXEBGaWxlTGlzdCwKICAgICAgICAgICAgRG9NaW5pZnkgID0+ICREb01pbmlmeSwKICAgICAgICAgICAgQmxvY2tOYW1lID0+ICdDb21tb25KUycsCiAgICAgICAgICAgIEpTSG9tZSAgICA9PiAkSlNIb21lLAogICAgICAgICk7CgogICAgfQoKICAgICMgbm93IGhhbmRsZSBtb2R1bGUgc3BlY2lmaWMgSlMKICAgIHsKICAgICAgICBteSAkTG9hZGVyQWN0aW9uID0gJFNlbGYtPntBY3Rpb259IHx8ICdDdXN0b21lckxvZ2luJzsKICAgICAgICAkTG9hZGVyQWN0aW9uID0gJ0N1c3RvbWVyTG9naW4nIGlmICggJExvYWRlckFjdGlvbiBlcSAnTG9nb3V0JyApOwoKICAgICAgICBteSAkQXBwSlNMaXN0CiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57JExvYWRlckFjdGlvbn0tPntMb2FkZXJ9CiAgICAgICAgICAgIC0+e0phdmFTY3JpcHR9CiAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQdWJsaWNGcm9udGVuZDo6TW9kdWxlJyktPnskTG9hZGVyQWN0aW9ufS0+e0xvYWRlcn0KICAgICAgICAgICAgLT57SmF2YVNjcmlwdH0KICAgICAgICAgICAgfHwgW107CgogICAgICAgIG15IEBGaWxlTGlzdCA9IEB7JEFwcEpTTGlzdH07CgogICAgICAgICRTZWxmLT5fSGFuZGxlSlNMaXN0KAogICAgICAgICAgICBMaXN0ICAgICAgPT4gXEBGaWxlTGlzdCwKICAgICAgICAgICAgRG9NaW5pZnkgID0+ICREb01pbmlmeSwKICAgICAgICAgICAgQmxvY2tOYW1lID0+ICdNb2R1bGVKUycsCiAgICAgICAgICAgIEpTSG9tZSAgICA9PiAkSlNIb21lLAogICAgICAgICk7CgogICAgfQoKICAgICNwcmludCBTVERFUlIgIlRpbWU6ICIgLiBUaW1lOjpIaVJlczo6dHZfaW50ZXJ2YWwoWyR0MF0pOwp9CgpzdWIgX0hhbmRsZUNTU0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAU2tpbnMgPSAoJ2RlZmF1bHQnKTsKICAgIAojIEtJWENvcmUtY2FwZUlUCiAgICAjIGFsc28gdXNlIEtJWCBwYXRocyBhcyBkZWZhdWx0IHNraW5zCiAgICBwdXNoKEBTa2lucywgJFNlbGYtPntLSVhVdGlsc09iamVjdH0tPkdldFJlZ2lzdGVyZWRDdXN0b21QYWNrYWdlcyhSZXN1bHQgPT4gJ0FSUkFZJykpOwogICAgCiAgICBteSAlU2tpbnNNYXAgPSBtYXAgeyAkXyA9PiAxIH0gQFNraW5zOwoKICAgICMgdmFsaWRhdGluZyBzZWxlY3RlZCBjdXN0b20gc2tpbiwgaWYgYW55CiAgICBpZiAoICRQYXJhbXtTa2lufSAmJiAhJFNraW5zTWFweyRQYXJhbXtTa2lufX0gJiYgJFNlbGYtPlNraW5WYWxpZGF0ZSglUGFyYW0pICkgewogICAgICAgIHB1c2ggQFNraW5zLCAkUGFyYW17U2tpbn07CiAgICB9CgojIEVPIEtJWENvcmUtY2FwZUlUICAgIAoKICAgICNsb2FkIGRlZmF1bHQgY3NzIGZpbGVzCiAgICBmb3IgbXkgJFNraW4gKEBTa2lucykgewogICAgICAgIG15IEBGaWxlTGlzdDsKCiAgICAgICAgQ1NTRklMRToKICAgICAgICBmb3IgbXkgJENTU0ZpbGUgKCBAeyAkUGFyYW17TGlzdH0gfSApIHsKICAgICAgICAgICAgbXkgJFNraW5GaWxlID0gIiRQYXJhbXtTa2luSG9tZX0vJFBhcmFte1NraW5UeXBlfS8kU2tpbi9jc3MvJENTU0ZpbGUiOwoKICAgICAgICAgICAgbmV4dCBDU1NGSUxFIGlmICggIS1lICRTa2luRmlsZSApOwoKICAgICAgICAgICAgaWYgKCAkUGFyYW17RG9NaW5pZnl9ICkgewogICAgICAgICAgICAgICAgcHVzaCBARmlsZUxpc3QsICRTa2luRmlsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtCbG9ja05hbWV9LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBTa2luICAgICAgICAgPT4gJFNraW4sCiAgICAgICAgICAgICAgICAgICAgICAgIENTU0RpcmVjdG9yeSA9PiAnY3NzJywKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZW5hbWUgICAgID0+ICRDU1NGaWxlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICRQYXJhbXtEb01pbmlmeX0gJiYgQEZpbGVMaXN0ICkgewogICAgICAgICAgICBteSAkTWluaWZpZWRGaWxlID0gJFNlbGYtPntMb2FkZXJPYmplY3R9LT5NaW5pZnlGaWxlcygKICAgICAgICAgICAgICAgIExpc3QgICAgICAgICAgICAgICAgID0+IFxARmlsZUxpc3QsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICA9PiAnQ1NTJywKICAgICAgICAgICAgICAgIFRhcmdldERpcmVjdG9yeSAgICAgID0+ICIkUGFyYW17U2tpbkhvbWV9LyRQYXJhbXtTa2luVHlwZX0vJFNraW4vY3NzLWNhY2hlLyIsCiAgICAgICAgICAgICAgICBUYXJnZXRGaWxlbmFtZVByZWZpeCA9PiAkUGFyYW17QmxvY2tOYW1lfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRTZWxmLT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0Jsb2NrTmFtZX0sCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTa2luICAgICAgICAgPT4gJFNraW4sCiAgICAgICAgICAgICAgICAgICAgQ1NTRGlyZWN0b3J5ID0+ICdjc3MtY2FjaGUnLAogICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgICA9PiAkTWluaWZpZWRGaWxlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSGFuZGxlSlNMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQEZpbGVMaXN0OwoKICAgIGZvciBteSAkSlNGaWxlICggQHsgJFBhcmFte0xpc3R9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17RG9NaW5pZnl9ICkgewogICAgICAgICAgICBwdXNoIEBGaWxlTGlzdCwgIiRQYXJhbXtKU0hvbWV9LyRKU0ZpbGUiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17QmxvY2tOYW1lfSwKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEpTRGlyZWN0b3J5ID0+ICcnLAogICAgICAgICAgICAgICAgICAgIEZpbGVuYW1lICAgID0+ICRKU0ZpbGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtEb01pbmlmeX0gJiYgQEZpbGVMaXN0ICkgewogICAgICAgIG15ICRNaW5pZmllZEZpbGUgPSAkU2VsZi0+e0xvYWRlck9iamVjdH0tPk1pbmlmeUZpbGVzKAogICAgICAgICAgICBMaXN0ICAgICAgICAgICAgICAgICA9PiBcQEZpbGVMaXN0LAogICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICA9PiAnSmF2YVNjcmlwdCcsCiAgICAgICAgICAgIFRhcmdldERpcmVjdG9yeSAgICAgID0+ICIkUGFyYW17SlNIb21lfS9qcy1jYWNoZS8iLAogICAgICAgICAgICBUYXJnZXRGaWxlbmFtZVByZWZpeCA9PiAkUGFyYW17QmxvY2tOYW1lfSwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0Jsb2NrTmFtZX0sCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSlNEaXJlY3RvcnkgPT4gJ2pzLWNhY2hlLycsCiAgICAgICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkTWluaWZpZWRGaWxlLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU2tpblZhbGlkYXRlKCkKClJldHVybnMgMSBpZiBza2luIGlzIGF2YWlsYWJsZSBmb3IgQWdlbnQgb3IgQ3VzdG9tZXIgZnJvbnRlbmRzIGFuZCAwIGlmIG5vdC4KCiAgICBteSAkU2tpbklzVmFsaWQgPSAkTGF5b3V0T2JqZWN0LT5Ta2luVmFsaWRhdGUoCiAgICAgICAgVXNlclR5cGUgPT4gJ0FnZW50JyAgICAgIyAgQWdlbnQgb3IgQ3VzdG9tZXIsCiAgICAgICAgU2tpbiA9PiAnRXhhbXBsZVNraW4nLAogICAgKTsKCj1jdXQKCnN1YiBTa2luVmFsaWRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBmb3IgbXkgJE5lZWRlZCAoICdTa2luVHlwZScsICdTa2luJyApIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWRlZCBwYXJhbTogJE5lZWRlZCEiLAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIGV4aXN0cyAkU2VsZi0+e1NraW5WYWxpZGF0ZUNhY2hlfS0+eyAkUGFyYW17U2tpblR5cGV9IC4gJzo6JyAuICRQYXJhbXtTa2lufSB9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e1NraW5WYWxpZGF0ZUNhY2hlfS0+eyAkUGFyYW17U2tpblR5cGV9IC4gJzo6JyAuICRQYXJhbXtTa2lufSB9OwogICAgfQoKICAgIG15ICRTa2luVHlwZSAgICAgID0gJFBhcmFte1NraW5UeXBlfTsKICAgIG15ICRQb3NzaWJsZVNraW5zID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIkxvYWRlcjo6JHtTa2luVHlwZX06OlNraW4iKSB8fCB7fTsKICAgIG15ICRIb21lICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIG15ICVBY3RpdmVTa2luczsKCiAgICAjIHByZXBhcmUgdGhlIGxpc3Qgb2YgYWN0aXZlIHNraW5zCiAgICBmb3IgbXkgJFBvc3NpYmxlU2tpbiAoIHZhbHVlcyAleyRQb3NzaWJsZVNraW5zfSApIHsKICAgICAgICBpZiAoICRQb3NzaWJsZVNraW4tPntJbnRlcm5hbE5hbWV9IGVxICRQYXJhbXtTa2lufSApIHsKICAgICAgICAgICAgbXkgJFNraW5EaXIKICAgICAgICAgICAgICAgID0gJEhvbWUgLiAiL3Zhci9odHRwZC9odGRvY3Mvc2tpbnMvJFNraW5UeXBlLyIgLiAkUG9zc2libGVTa2luLT57SW50ZXJuYWxOYW1lfTsKICAgICAgICAgICAgaWYgKCAtZCAkU2tpbkRpciApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57U2tpblZhbGlkYXRlQ2FjaGV9LT57ICRQYXJhbXtTa2luVHlwZX0gLiAnOjonIC4gJFBhcmFte1NraW59IH0gPSAxOwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntTa2luVmFsaWRhdGVDYWNoZX0tPnsgJFBhcmFte1NraW5UeXBlfSAuICc6OicgLiAkUGFyYW17U2tpbn0gfSA9IHVuZGVmOwogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMTEtMDgtMDQgMDc6NDM6MzMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vTGlua09iamVjdC5wbSAtIHRvIGxpbmsgb2JqZWN0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBFeHRlbnNpb25zIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IExpbmtPYmplY3QucG0sdiAxLjQuMi4xIDIwMTEtMTEtMDQgMDY6MjM6MjQgbWFiYSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhbGlkOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWw7CgojIEtJWENvcmUtY2FwZUlUCnVzZSBLZXJuZWw6OlN5c3RlbTo6S0lYVXRpbHM7CgojIEVPIEtJWENvcmUtY2FwZUlUCgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNC4yLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0IC0gdG8gbGluayBvYmplY3RzIGxpa2UgdGlja2V0cywgZmFxcywgLi4uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMgdG8gbGluayBvYmplY3RzIGxpa2UgdGlja2V0cywgZmFxcywgLi4uCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRMaW5rT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QgVGltZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkNhY2hlSW50ZXJuYWwtPm5ldygKICAgICAgICAleyRTZWxmfSwKICAgICAgICBUeXBlID0+ICdMaW5rT2JqZWN0JywKICAgICAgICBUVEwgID0+IDYwICogNjAgKiAzLAogICAgKTsKCiAgICAjIEtJWENvcmUtY2FwZUlUCiAgICAkU2VsZi0+e0tJWFV0aWxzT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpLSVhVdGlscy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFBvc3NpYmxlVHlwZXNMaXN0KCkKCnJldHVybiBhIGhhc2ggb2YgYWxsIHBvc3NpYmxlIHR5cGVzCgpSZXR1cm4KICAgICVQb3NzaWJsZVR5cGVzTGlzdCA9ICgKICAgICAgICAnTm9ybWFsJyAgICAgID0+IDEsCiAgICAgICAgJ1BhcmVudENoaWxkJyA9PiAxLAogICAgKTsKCiAgICBteSAlUG9zc2libGVUeXBlc0xpc3QgPSAkTGlua09iamVjdC0+UG9zc2libGVUeXBlc0xpc3QoCiAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICBPYmplY3QyID0+ICdGQVEnLAogICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUG9zc2libGVUeXBlc0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0MSBPYmplY3QyIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcG9zc2libGUgbGluayBsaXN0CiAgICBteSAlUG9zc2libGVMaW5rTGlzdCA9ICRTZWxmLT5Qb3NzaWJsZUxpbmtMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyByZW1vdmUgbm90IG5lZWRlZCBlbnRyaWVzCiAgICBQT1NTSUJMRUxJTks6CiAgICBmb3IgbXkgJFBvc3NpYmxlTGluayAoIGtleXMgJVBvc3NpYmxlTGlua0xpc3QgKSB7CgogICAgICAgICMgZXh0cmFjdCBvYmplY3RzCiAgICAgICAgbXkgJE9iamVjdDEgPSAkUG9zc2libGVMaW5rTGlzdHskUG9zc2libGVMaW5rfS0+e09iamVjdDF9OwogICAgICAgIG15ICRPYmplY3QyID0gJFBvc3NpYmxlTGlua0xpc3R7JFBvc3NpYmxlTGlua30tPntPYmplY3QyfTsKCiAgICAgICAgbmV4dCBQT1NTSUJMRUxJTksKICAgICAgICAgICAgaWYgKCAkT2JqZWN0MSBlcSAkUGFyYW17T2JqZWN0MX0gJiYgJE9iamVjdDIgZXEgJFBhcmFte09iamVjdDJ9ICkKICAgICAgICAgICAgfHwgKCAkT2JqZWN0MiBlcSAkUGFyYW17T2JqZWN0MX0gJiYgJE9iamVjdDEgZXEgJFBhcmFte09iamVjdDJ9ICk7CgogICAgICAgICMgcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBpZiBvYmplY3RzIGRvbid0IG1hdGNoCiAgICAgICAgZGVsZXRlICRQb3NzaWJsZUxpbmtMaXN0eyRQb3NzaWJsZUxpbmt9OwogICAgfQoKICAgICMgZ2V0IHR5cGUgbGlzdAogICAgbXkgJVR5cGVMaXN0ID0gJFNlbGYtPlR5cGVMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0eXBlcwogICAgUE9TU0lCTEVMSU5LOgogICAgZm9yIG15ICRQb3NzaWJsZUxpbmsgKCBrZXlzICVQb3NzaWJsZUxpbmtMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3QgdHlwZQogICAgICAgIG15ICRUeXBlID0gJFBvc3NpYmxlTGlua0xpc3R7JFBvc3NpYmxlTGlua30tPntUeXBlfSB8fCAnJzsKCiAgICAgICAgbmV4dCBQT1NTSUJMRUxJTksgaWYgJFR5cGVMaXN0eyRUeXBlfTsKCiAgICAgICAgIyByZW1vdmUgZW50cnkgZnJvbSBsaXN0IGlmIHR5cGUgZG9lc24ndCBleGlzdAogICAgICAgIGRlbGV0ZSAkUG9zc2libGVMaW5rTGlzdHskUG9zc2libGVMaW5rfTsKICAgIH0KCiAgICAjIGV4dHJhY3QgdGhlIHR5cGUgbGlzdAogICAgbXkgJVBvc3NpYmxlVHlwZXNMaXN0OwogICAgZm9yIG15ICRQb3NzaWJsZUxpbmsgKCBrZXlzICVQb3NzaWJsZUxpbmtMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3QgdHlwZQogICAgICAgIG15ICRUeXBlID0gJFBvc3NpYmxlTGlua0xpc3R7JFBvc3NpYmxlTGlua30tPntUeXBlfTsKCiAgICAgICAgJFBvc3NpYmxlVHlwZXNMaXN0eyRUeXBlfSA9IDE7CiAgICB9CgogICAgcmV0dXJuICVQb3NzaWJsZVR5cGVzTGlzdDsKfQoKPWl0ZW0gUG9zc2libGVPYmplY3RzTGlzdCgpCgpyZXR1cm4gYSBoYXNoIG9mIGFsbCBwb3NzaWJsZSBvYmplY3RzCgpSZXR1cm4KICAgICVQb3NzaWJsZU9iamVjdHNMaXN0ID0gKAogICAgICAgICdUaWNrZXQnID0+IDEsCiAgICAgICAgJ0ZBUScgICAgPT4gMSwKICAgICk7CgogICAgbXkgJVBvc3NpYmxlT2JqZWN0c0xpc3QgPSAkTGlua09iamVjdC0+UG9zc2libGVPYmplY3RzTGlzdCgKICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFBvc3NpYmxlT2JqZWN0c0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcG9zc2libGUgbGluayBsaXN0CiAgICBteSAlUG9zc2libGVMaW5rTGlzdCA9ICRTZWxmLT5Qb3NzaWJsZUxpbmtMaXN0KAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBpbnZlc3RpZ2F0ZSB0aGUgcG9zc2libGUgb2JqZWN0IGxpc3QKICAgIG15ICVQb3NzaWJsZU9iamVjdHNMaXN0OwogICAgUE9TU0lCTEVMSU5LOgogICAgZm9yIG15ICRQb3NzaWJsZUxpbmsgKCBrZXlzICVQb3NzaWJsZUxpbmtMaXN0ICkgewoKICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0cwogICAgICAgIG15ICRPYmplY3QxID0gJFBvc3NpYmxlTGlua0xpc3R7JFBvc3NpYmxlTGlua30tPntPYmplY3QxfTsKICAgICAgICBteSAkT2JqZWN0MiA9ICRQb3NzaWJsZUxpbmtMaXN0eyRQb3NzaWJsZUxpbmt9LT57T2JqZWN0Mn07CgogICAgICAgIG5leHQgUE9TU0lCTEVMSU5LIGlmICRQYXJhbXtPYmplY3R9IG5lICRPYmplY3QxICYmICRQYXJhbXtPYmplY3R9IG5lICRPYmplY3QyOwoKICAgICAgICAjIGFkZCBvYmplY3QgdG8gbGlzdAogICAgICAgIGlmICggJFBhcmFte09iamVjdH0gZXEgJE9iamVjdDEgKSB7CiAgICAgICAgICAgICRQb3NzaWJsZU9iamVjdHNMaXN0eyRPYmplY3QyfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUG9zc2libGVPYmplY3RzTGlzdHskT2JqZWN0MX0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJVBvc3NpYmxlT2JqZWN0c0xpc3Q7Cn0KCj1pdGVtIFBvc3NpYmxlTGlua0xpc3QoKQoKcmV0dXJuIGEgMmQgaGFzaCBsaXN0IG9mIGFsbCBwb3NzaWJsZSBsaW5rcwoKUmV0dXJuCiAgICAlUG9zc2libGVMaW5rTGlzdCA9ICgKICAgICAgICAwMDEgPT4gewogICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICBPYmplY3QyID0+ICdUaWNrZXQnLAogICAgICAgICAgICBUeXBlICAgID0+ICdOb3JtYWwnLAogICAgICAgIH0sCiAgICAgICAgMDAyID0+IHsKICAgICAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICAgICAgT2JqZWN0MiA9PiAnVGlja2V0JywKICAgICAgICAgICAgVHlwZSAgICA9PiAnUGFyZW50Q2hpbGQnLAogICAgICAgIH0sCiAgICApOwoKICAgIG15ICVQb3NzaWJsZUxpbmtMaXN0ID0gJExpbmtPYmplY3QtPlBvc3NpYmxlTGlua0xpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFBvc3NpYmxlTGlua0xpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVXNlcklEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgcG9zc2libGUgbGluayBsaXN0CiAgICBteSAkUG9zc2libGVMaW5rTGlzdFJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmsnKSB8fCB7fTsKICAgIG15ICVQb3NzaWJsZUxpbmtMaXN0ID0gJXskUG9zc2libGVMaW5rTGlzdFJlZn07CgogICAgIyBwcmVwYXJlIHRoZSBwb3NzaWJsZSBsaW5rIGxpc3QKICAgIFBPU1NJQkxFTElOSzoKICAgIGZvciBteSAkUG9zc2libGVMaW5rICgga2V5cyAlUG9zc2libGVMaW5rTGlzdCApIHsKCiAgICAgICAgIyBjaGVjayB0aGUgb2JqZWN0MSwgb2JqZWN0MiBhbmQgdHlwZSBzdHJpbmcKICAgICAgICBBUkdVTUVOVDoKICAgICAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QxIE9iamVjdDIgVHlwZSkpIHsKCiAgICAgICAgICAgICMgc2V0IGVtcHR5IHN0cmluZyBhcyBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgICRQb3NzaWJsZUxpbmtMaXN0eyRQb3NzaWJsZUxpbmt9LT57JEFyZ3VtZW50fSB8fD0gJyc7CgogICAgICAgICAgICAjIHRyaW0gdGhlIGFyZ3VtZW50CiAgICAgICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgICAgICBTdHJpbmdSZWYgPT4gXCRQb3NzaWJsZUxpbmtMaXN0eyRQb3NzaWJsZUxpbmt9LT57JEFyZ3VtZW50fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZXh0cmFjdCB2YWx1ZQogICAgICAgICAgICBteSAkVmFsdWUgPSAkUG9zc2libGVMaW5rTGlzdHskUG9zc2libGVMaW5rfS0+eyRBcmd1bWVudH0gfHwgJyc7CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICRWYWx1ZSAmJiAkVmFsdWUgIX4gbXsgOjogfXhtcyAmJiAkVmFsdWUgIX4gbXsgXHMgfXhtczsKCiAgICAgICAgICAgICMgbG9nIHRoZSBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIlRoZSAkQXJndW1lbnQgJyRWYWx1ZScgaXMgaW52YWxpZCBpbiBTeXNDb25maWcgKExpbmtPYmplY3Q6OlBvc3NpYmxlTGluaykhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBpZiBpdCBpcyBpbnZhbGlkCiAgICAgICAgICAgIGRlbGV0ZSAkUG9zc2libGVMaW5rTGlzdHskUG9zc2libGVMaW5rfTsKCiAgICAgICAgICAgIG5leHQgUE9TU0lCTEVMSU5LOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBsb2NhdGlvbiBvZiB0aGUgYmFja2VuZCBtb2R1bGVzCiAgICBteSAkQmFja2VuZExvY2F0aW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvS2VybmVsL1N5c3RlbS9MaW5rT2JqZWN0Lyc7CgogICAgIyBLSVhDb3JlLWNhcGVJVAogICAgbXkgQEtJWFBhY2thZ2VzID0gJFNlbGYtPntLSVhVdGlsc09iamVjdH0tPkdldFJlZ2lzdGVyZWRDdXN0b21QYWNrYWdlcyggUmVzdWx0ID0+ICdBUlJBWScgKTsKICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICAjIGNoZWNrIHRoZSBleGlzdGluZyBvYmplY3RzCiAgICBQT1NTSUJMRUxJTks6CiAgICBmb3IgbXkgJFBvc3NpYmxlTGluayAoIGtleXMgJVBvc3NpYmxlTGlua0xpc3QgKSB7CgogICAgICAgICMgY2hlY2sgaWYgb2JqZWN0IGJhY2tlbmRzIGV4aXN0CiAgICAgICAgQVJHVU1FTlQ6CiAgICAgICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0MSBPYmplY3QyKSkgewoKICAgICAgICAgICAgIyBleHRyYWN0IG9iamVjdAogICAgICAgICAgICBteSAkT2JqZWN0ID0gJFBvc3NpYmxlTGlua0xpc3R7JFBvc3NpYmxlTGlua30tPnskQXJndW1lbnR9OwoKICAgICAgICAgICAgIyBLSVhDb3JlLWNhcGVJVAogICAgICAgICAgICAjbmV4dCBBUkdVTUVOVCBpZiAtZSAkQmFja2VuZExvY2F0aW9uIC4gJE9iamVjdCAuICcucG0nOwogICAgICAgICAgICBteSAkRm91bmQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJEN1cnJQcmVmaXggKEBLSVhQYWNrYWdlcykgewogICAgICAgICAgICAgICAgbXkgJENoZWNrQmFja2VuZExvY2F0aW9uID0KICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpIC4gIi8iCiAgICAgICAgICAgICAgICAgICAgLiAkQ3VyclByZWZpeAogICAgICAgICAgICAgICAgICAgIC4gJy9LZXJuZWwvU3lzdGVtL0xpbmtPYmplY3QvJzsKICAgICAgICAgICAgICAgIGlmICggLWUgJENoZWNrQmFja2VuZExvY2F0aW9uIC4gJE9iamVjdCAuICcucG0nICkgewogICAgICAgICAgICAgICAgICAgICRGb3VuZCA9IDE7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkRm91bmQgKSB7CiAgICAgICAgICAgICAgICBuZXh0IEFSR1VNRU5UIGlmIC1lICRCYWNrZW5kTG9jYXRpb24gLiAkT2JqZWN0IC4gJy5wbSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dCBBUkdVTUVOVCBpZiAkRm91bmQ7CgogICAgICAgICAgICAjIEVPIEtJWENvcmUtY2FwZUlUCgogICAgICAgICAgICAjIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3QgaWYgaXQgaXMgaW52YWxpZAogICAgICAgICAgICBkZWxldGUgJFBvc3NpYmxlTGlua0xpc3R7JFBvc3NpYmxlTGlua307CgogICAgICAgICAgICBuZXh0IFBPU1NJQkxFTElOSzsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdHlwZSBsaXN0CiAgICBteSAlVHlwZUxpc3QgPSAkU2VsZi0+VHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHR5cGVzCiAgICBQT1NTSUJMRUxJTks6CiAgICBmb3IgbXkgJFBvc3NpYmxlTGluayAoIGtleXMgJVBvc3NpYmxlTGlua0xpc3QgKSB7CgogICAgICAgICMgZXh0cmFjdCB0eXBlCiAgICAgICAgbXkgJFR5cGUgPSAkUG9zc2libGVMaW5rTGlzdHskUG9zc2libGVMaW5rfS0+e1R5cGV9OwoKICAgICAgICBuZXh0IFBPU1NJQkxFTElOSyBpZiAkVHlwZUxpc3R7JFR5cGV9OwoKICAgICAgICAjIGxvZyB0aGUgZXJyb3IKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBMaW5rVHlwZSAnJFR5cGUnIGlzIGludmFsaWQgaW4gU3lzQ29uZmlnIChMaW5rT2JqZWN0OjpQb3NzaWJsZUxpbmspISIsCiAgICAgICAgKTsKCiAgICAgICAgIyByZW1vdmUgZW50cnkgZnJvbSBsaXN0IGlmIHR5cGUgZG9lc24ndCBleGlzdAogICAgICAgIGRlbGV0ZSAkUG9zc2libGVMaW5rTGlzdHskUG9zc2libGVMaW5rfTsKICAgIH0KCiAgICByZXR1cm4gJVBvc3NpYmxlTGlua0xpc3Q7Cn0KCj1pdGVtIExpbmtBZGQoKQoKYWRkIGEgbmV3IGxpbmsgYmV0d2VlbiB0d28gZWxlbWVudHMKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rQWRkKAogICAgICAgIFNvdXJjZU9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICBTb3VyY2VLZXkgICAgPT4gJzMyMScsCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdGQVEnLAogICAgICAgIFRhcmdldEtleSAgICA9PiAnNScsCiAgICAgICAgVHlwZSAgICAgICAgID0+ICdQYXJlbnRDaGlsZCcsCiAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoU291cmNlT2JqZWN0IFNvdXJjZUtleSBUYXJnZXRPYmplY3QgVGFyZ2V0S2V5IFR5cGUgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHNvdXJjZSBhbmQgdGFyZ2V0IGFyZSB0aGUgc2FtZSBvYmplY3QKICAgIGlmICggJFBhcmFte1NvdXJjZU9iamVjdH0gZXEgJFBhcmFte1RhcmdldE9iamVjdH0gJiYgJFBhcmFte1NvdXJjZUtleX0gZXEgJFBhcmFte1RhcmdldEtleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbXBvc3NpYmxlIHRvIGxpbmsgb2JqZWN0IHdpdGggaXRzZWxmIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgdGhlIG9iamVjdCBpZHMKICAgIE9CSkVDVDoKICAgIGZvciBteSAkT2JqZWN0IChxdyhTb3VyY2VPYmplY3QgVGFyZ2V0T2JqZWN0KSkgewoKICAgICAgICAjIGxvb2t1cCB0aGUgb2JqZWN0IGlkCiAgICAgICAgJFBhcmFteyAkT2JqZWN0IC4gJ0lEJyB9ID0gJFNlbGYtPk9iamVjdExvb2t1cCgKICAgICAgICAgICAgTmFtZSAgID0+ICRQYXJhbXskT2JqZWN0fSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgT0JKRUNUIGlmICRQYXJhbXsgJE9iamVjdCAuICdJRCcgfTsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkICRPYmplY3QgaXMgZ2l2ZW4hIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgYSBsaXN0IG9mIHBvc3NpYmxlIGxpbmsgdHlwZXMgZm9yIHRoZSB0d28gb2JqZWN0cwogICAgbXkgJVBvc3NpYmxlVHlwZXNMaXN0ID0gJFNlbGYtPlBvc3NpYmxlVHlwZXNMaXN0KAogICAgICAgIE9iamVjdDEgPT4gJFBhcmFte1NvdXJjZU9iamVjdH0sCiAgICAgICAgT2JqZWN0MiA9PiAkUGFyYW17VGFyZ2V0T2JqZWN0fSwKICAgICAgICBVc2VySUQgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIHdhbnRlZCBsaW5rIHR5cGUgaXMgYWxsb3dlZAogICAgaWYgKCAhJFBvc3NpYmxlVHlwZXNMaXN0eyAkUGFyYW17VHlwZX0gfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5vdCBhbGxvd2VkIHRvIGxpbmsgJFBhcmFte1NvdXJjZU9iamVjdH0gd2l0aCAkUGFyYW17VGFyZ2V0T2JqZWN0fSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHN0YXRlIGlkCiAgICBteSAkU3RhdGVJRCA9ICRTZWxmLT5TdGF0ZUxvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJFBhcmFte1N0YXRlfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgbG9va3VwIHR5cGUgaWQKICAgIG15ICRUeXBlSUQgPSAkU2VsZi0+VHlwZUxvb2t1cCgKICAgICAgICBOYW1lICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayBpZiBsaW5rIGFscmVhZHkgZXhpc3RzIGluIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIHNvdXJjZV9vYmplY3RfaWQsIHNvdXJjZV9rZXksIHN0YXRlX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBsaW5rX3JlbGF0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgKCAoIHNvdXJjZV9vYmplY3RfaWQgPSA/IEFORCBzb3VyY2Vfa2V5ID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCB0YXJnZXRfb2JqZWN0X2lkID0gPyBBTkQgdGFyZ2V0X2tleSA9ID8gKSAnCiAgICAgICAgICAgIC4gJ09SICggc291cmNlX29iamVjdF9pZCA9ID8gQU5EIHNvdXJjZV9rZXkgPSA/ICcKICAgICAgICAgICAgLiAnQU5EIHRhcmdldF9vYmplY3RfaWQgPSA/IEFORCB0YXJnZXRfa2V5ID0gPyApICkgJwogICAgICAgICAgICAuICdBTkQgdHlwZV9pZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtTb3VyY2VPYmplY3RJRH0sIFwkUGFyYW17U291cmNlS2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtUYXJnZXRPYmplY3RJRH0sIFwkUGFyYW17VGFyZ2V0S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtUYXJnZXRPYmplY3RJRH0sIFwkUGFyYW17VGFyZ2V0S2V5fSwKICAgICAgICAgICAgXCRQYXJhbXtTb3VyY2VPYmplY3RJRH0sIFwkUGFyYW17U291cmNlS2V5fSwKICAgICAgICAgICAgXCRUeXBlSUQsCiAgICAgICAgXSwKICAgICAgICBMaW1pdCA9PiAxLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVFeGlzdGluZzsKICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgJEV4aXN0aW5ne1NvdXJjZU9iamVjdElEfSA9ICRSb3dbMF07CiAgICAgICAgJEV4aXN0aW5ne1NvdXJjZUtleX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJEV4aXN0aW5ne1N0YXRlSUR9ICAgICAgICA9ICRSb3dbMl07CiAgICB9CgogICAgIyBsaW5rIGV4aXN0cyBhbHJlYWR5CiAgICBpZiAoJUV4aXN0aW5nKSB7CgogICAgICAgICMgZXhpc3RpbmcgbGluayBoYXMgYSBkaWZmZXJlbnQgU3RhdGVJRCB0aGFuIHRoZSBuZXcgbGluawogICAgICAgIGlmICggJEV4aXN0aW5ne1N0YXRlSUR9IG5lICRTdGF0ZUlEICkgewoKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgYWxyZWFkeSBleGlzdHMgYmV0d2VlbiB0aGVzZSB0d28gb2JqZWN0cyAiCiAgICAgICAgICAgICAgICAgICAgLiAid2l0aCBhIGRpZmZlcmVudCBzdGF0ZSBpZCAnJEV4aXN0aW5ne1N0YXRlSUR9JyEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0eXBlIGRhdGEKICAgICAgICBteSAlVHlwZURhdGEgPSAkU2VsZi0+VHlwZUdldCgKICAgICAgICAgICAgVHlwZUlEID0+ICRUeXBlSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gMSBpZiAhJFR5cGVEYXRhe1BvaW50ZWR9OwogICAgICAgIHJldHVybiAxIGlmICRFeGlzdGluZ3tTb3VyY2VPYmplY3RJRH0gZXEgJFBhcmFte1NvdXJjZU9iamVjdElEfQogICAgICAgICAgICAgICAgJiYgJEV4aXN0aW5ne1NvdXJjZUtleX0gZXEgJFBhcmFte1NvdXJjZUtleX07CgogICAgICAgICMgbG9nIGVycm9yCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMaW5rIGFscmVhZHkgZXhpc3RzIGJldHdlZW4gdGhlc2UgdHdvIG9iamVjdHMgaW4gb3Bwb3NpdGUgZGlyZWN0aW9uIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgYWxsIGxpbmtzIHRoYXQgdGhlIHNvdXJjZSBvYmplY3QgYWxyZWFkeSBoYXMKICAgIG15ICRMaW5rcyA9ICRTZWxmLT5MaW5rTGlzdCgKICAgICAgICBPYmplY3QgPT4gJFBhcmFte1NvdXJjZU9iamVjdH0sCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtTb3VyY2VLZXl9LAogICAgICAgIFN0YXRlICA9PiAkUGFyYW17U3RhdGV9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0eXBlIGdyb3VwcwogICAgT0JKRUNUOgogICAgZm9yIG15ICRPYmplY3QgKCBrZXlzICV7JExpbmtzfSApIHsKCiAgICAgICAgbmV4dCBPQkpFQ1QgaWYgJE9iamVjdCBuZSAkUGFyYW17VGFyZ2V0T2JqZWN0fTsKCiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKCBrZXlzICV7ICRMaW5rcy0+eyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAjIGV4dHJhY3Qgc291cmNlIGFuZCB0YXJnZXQKICAgICAgICAgICAgbXkgJFNvdXJjZSA9ICRMaW5rcy0+eyRPYmplY3R9LT57JFR5cGV9LT57U291cmNlfSB8fD0ge307CiAgICAgICAgICAgIG15ICRUYXJnZXQgPSAkTGlua3MtPnskT2JqZWN0fS0+eyRUeXBlfS0+e1RhcmdldH0gfHw9IHt9OwoKICAgICAgICAgICAgIyBjaGVjayBpZiBzb3VyY2UgYW5kIHRhcmdldCBvYmplY3QgYXJlIGFscmVhZHkgbGlua2VkCiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAhJFNvdXJjZS0+eyAkUGFyYW17VGFyZ2V0S2V5fSB9ICYmICEkVGFyZ2V0LT57ICRQYXJhbXtUYXJnZXRLZXl9IH07CgogICAgICAgICAgICAjIGNoZWNrIHRoZSB0eXBlIGdyb3VwcwogICAgICAgICAgICBteSAkVHlwZUdyb3VwQ2hlY2sgPSAkU2VsZi0+UG9zc2libGVUeXBlKAogICAgICAgICAgICAgICAgVHlwZTEgID0+ICRUeXBlLAogICAgICAgICAgICAgICAgVHlwZTIgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgVFlQRSBpZiAkVHlwZUdyb3VwQ2hlY2s7CgogICAgICAgICAgICAjIGV4aXN0aW5nIGxpbmsgdHlwZSBpcyBpbiBhIHR5cGUgZ3JvdXAgd2l0aCB0aGUgbmV3IGxpbmsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0Fub3RoZXIgTGluayBhbHJlYWR5IGV4aXN0cyB3aXRoaW4gdGhlIHNhbWUgdHlwZSBncm91cCEnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgYmFja2VuZCBvZiBzb3VyY2Ugb2JqZWN0CiAgICBteSAkQmFja2VuZFNvdXJjZU9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgT2JqZWN0ID0+ICRQYXJhbXtTb3VyY2VPYmplY3R9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZFNvdXJjZU9iamVjdDsKCiAgICAjIGxvYWQgYmFja2VuZCBvZiB0YXJnZXQgb2JqZWN0CiAgICBteSAkQmFja2VuZFRhcmdldE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgT2JqZWN0ID0+ICRQYXJhbXtUYXJnZXRPYmplY3R9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkQmFja2VuZFRhcmdldE9iamVjdDsKCiAgICAjIHJ1biBwcmUgZXZlbnQgbW9kdWxlIG9mIHNvdXJjZSBvYmplY3QKICAgICRCYWNrZW5kU291cmNlT2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAkUGFyYW17U291cmNlS2V5fSwKICAgICAgICBUYXJnZXRPYmplY3QgPT4gJFBhcmFte1RhcmdldE9iamVjdH0sCiAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRQYXJhbXtUYXJnZXRLZXl9LAogICAgICAgIFR5cGUgICAgICAgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgU3RhdGUgICAgICAgID0+ICRQYXJhbXtTdGF0ZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIHJ1biBwcmUgZXZlbnQgbW9kdWxlIG9mIHRhcmdldCBvYmplY3QKICAgICRCYWNrZW5kVGFyZ2V0T2JqZWN0LT5MaW5rQWRkUHJlKAogICAgICAgIEtleSAgICAgICAgICA9PiAkUGFyYW17VGFyZ2V0S2V5fSwKICAgICAgICBTb3VyY2VPYmplY3QgPT4gJFBhcmFte1NvdXJjZU9iamVjdH0sCiAgICAgICAgU291cmNlS2V5ICAgID0+ICRQYXJhbXtTb3VyY2VLZXl9LAogICAgICAgIFR5cGUgICAgICAgICA9PiAkUGFyYW17VHlwZX0sCiAgICAgICAgU3RhdGUgICAgICAgID0+ICRQYXJhbXtTdGF0ZX0sCiAgICAgICAgVXNlcklEICAgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGxpbmtfcmVsYXRpb24gJwogICAgICAgICAgICAuICcoc291cmNlX29iamVjdF9pZCwgc291cmNlX2tleSwgdGFyZ2V0X29iamVjdF9pZCwgdGFyZ2V0X2tleSwgJwogICAgICAgICAgICAuICd0eXBlX2lkLCBzdGF0ZV9pZCwgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSkgJwogICAgICAgICAgICAuICdWQUxVRVMgKD8sID8sID8sID8sID8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/KScsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkUGFyYW17U291cmNlT2JqZWN0SUR9LCBcJFBhcmFte1NvdXJjZUtleX0sCiAgICAgICAgICAgIFwkUGFyYW17VGFyZ2V0T2JqZWN0SUR9LCBcJFBhcmFte1RhcmdldEtleX0sCiAgICAgICAgICAgIFwkVHlwZUlELCBcJFN0YXRlSUQsIFwkUGFyYW17VXNlcklEfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIHJ1biBwb3N0IGV2ZW50IG1vZHVsZSBvZiBzb3VyY2Ugb2JqZWN0CiAgICAkQmFja2VuZFNvdXJjZU9iamVjdC0+TGlua0FkZFBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+ICRQYXJhbXtTb3VyY2VLZXl9LAogICAgICAgIFRhcmdldE9iamVjdCA9PiAkUGFyYW17VGFyZ2V0T2JqZWN0fSwKICAgICAgICBUYXJnZXRLZXkgICAgPT4gJFBhcmFte1RhcmdldEtleX0sCiAgICAgICAgVHlwZSAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJFBhcmFte1N0YXRlfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgcnVuIHBvc3QgZXZlbnQgbW9kdWxlIG9mIHRhcmdldCBvYmplY3QKICAgICRCYWNrZW5kVGFyZ2V0T2JqZWN0LT5MaW5rQWRkUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gJFBhcmFte1RhcmdldEtleX0sCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICRQYXJhbXtTb3VyY2VPYmplY3R9LAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkUGFyYW17U291cmNlS2V5fSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFN0YXRlICAgICAgICA9PiAkUGFyYW17U3RhdGV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtDbGVhbnVwKCkKCmRlbGV0ZXMgb2xkIGxpbmtzIGZyb20gZGF0YWJhc2UKCnJldHVybiB0cnVlCgogICAgJFRydWUgPSAkTGlua09iamVjdC0+TGlua0NsZWFudXAoCiAgICAgICAgU3RhdGUgID0+ICdUZW1wb3JhcnknLAogICAgICAgIEFnZSAgICA9PiAoIDYwICogNjAgKiAyNCApLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBMaW5rQ2xlYW51cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhTdGF0ZSBBZ2UgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb2t1cCBzdGF0ZSBpZAogICAgbXkgJFN0YXRlSUQgPSAkU2VsZi0+U3RhdGVMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICRQYXJhbXtTdGF0ZX0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRTdGF0ZUlEOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZQogICAgbXkgJE5vdyA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKCiAgICAjIGNhbGN1bGF0ZSBkZWxldGUgdGltZQogICAgbXkgJERlbGV0ZVRpbWUgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICggJE5vdyAtICRQYXJhbXtBZ2V9ICksCiAgICApOwoKICAgICMgZGVsZXRlIHRoZSBsaW5rCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgPT4gJ0RFTEVURSBGUk9NIGxpbmtfcmVsYXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSBzdGF0ZV9pZCA9ID8gQU5EIGNyZWF0ZV90aW1lIDwgPycsCiAgICAgICAgQmluZCA9PiBbCiAgICAgICAgICAgIFwkU3RhdGVJRCwgXCREZWxldGVUaW1lLAogICAgICAgIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBMaW5rRGVsZXRlKCkKCmRlbGV0ZXMgYSBsaW5rCgpyZXR1cm4gdHJ1ZQoKICAgICRUcnVlID0gJExpbmtPYmplY3QtPkxpbmtEZWxldGUoCiAgICAgICAgT2JqZWN0MSA9PiAnVGlja2V0JywKICAgICAgICBLZXkxICAgID0+ICczMjEnLAogICAgICAgIE9iamVjdDIgPT4gJ0ZBUScsCiAgICAgICAgS2V5MiAgICA9PiAnNScsCiAgICAgICAgVHlwZSAgICA9PiAnTm9ybWFsJywKICAgICAgICBVc2VySUQgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0MSBLZXkxIE9iamVjdDIgS2V5MiBUeXBlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb29rdXAgdGhlIG9iamVjdCBpZHMKICAgIE9CSkVDVDoKICAgIGZvciBteSAkT2JqZWN0IChxdyhPYmplY3QxIE9iamVjdDIpKSB7CgogICAgICAgICMgbG9va3VwIHRoZSBvYmplY3QgaWQKICAgICAgICAkUGFyYW17ICRPYmplY3QgLiAnSUQnIH0gPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgICAgICBOYW1lICAgPT4gJFBhcmFteyRPYmplY3R9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBPQkpFQ1QgaWYgJFBhcmFteyAkT2JqZWN0IC4gJ0lEJyB9OwoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgJE9iamVjdCBpcyBnaXZlbiEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB0eXBlIGlkCiAgICBteSAkVHlwZUlEID0gJFNlbGYtPlR5cGVMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IHRoZSBleGlzdGluZyBsaW5rCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIHNvdXJjZV9vYmplY3RfaWQsIHNvdXJjZV9rZXksIHRhcmdldF9vYmplY3RfaWQsIHRhcmdldF9rZXksIHN0YXRlX2lkICcKICAgICAgICAgICAgLiAnRlJPTSBsaW5rX3JlbGF0aW9uICcKICAgICAgICAgICAgLiAnV0hFUkUgKCBzb3VyY2Vfb2JqZWN0X2lkID0gPyBBTkQgc291cmNlX2tleSA9ID8gJwogICAgICAgICAgICAuICdBTkQgdGFyZ2V0X29iamVjdF9pZCA9ID8gQU5EIHRhcmdldF9rZXkgPSA/ICkgJwogICAgICAgICAgICAuICdPUiAoIHNvdXJjZV9vYmplY3RfaWQgPSA/IEFORCBzb3VyY2Vfa2V5ID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCB0YXJnZXRfb2JqZWN0X2lkID0gPyBBTkQgdGFyZ2V0X2tleSA9ID8gKSAnCiAgICAgICAgICAgIC4gJ0FORCB0eXBlX2lkID0gPyAnLAogICAgICAgIEJpbmQgPT4gWwogICAgICAgICAgICBcJFBhcmFte09iamVjdDFJRH0sIFwkUGFyYW17S2V5MX0sCiAgICAgICAgICAgIFwkUGFyYW17T2JqZWN0MklEfSwgXCRQYXJhbXtLZXkyfSwKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3QySUR9LCBcJFBhcmFte0tleTJ9LAogICAgICAgICAgICBcJFBhcmFte09iamVjdDFJRH0sIFwkUGFyYW17S2V5MX0sCiAgICAgICAgICAgIFwkVHlwZUlELAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgIyBmZXRjaCByZXN1bHRzCiAgICBteSAlRXhpc3Rpbmc7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICAkRXhpc3Rpbmd7U291cmNlT2JqZWN0SUR9ID0gJFJvd1swXTsKICAgICAgICAkRXhpc3Rpbmd7U291cmNlS2V5fSAgICAgID0gJFJvd1sxXTsKICAgICAgICAkRXhpc3Rpbmd7VGFyZ2V0T2JqZWN0SUR9ID0gJFJvd1syXTsKICAgICAgICAkRXhpc3Rpbmd7VGFyZ2V0S2V5fSAgICAgID0gJFJvd1szXTsKICAgICAgICAkRXhpc3Rpbmd7U3RhdGVJRH0gICAgICAgID0gJFJvd1s0XTsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAhJUV4aXN0aW5nOwoKICAgICMgbG9va3VwIHRoZSBvYmplY3QgbmFtZXMKICAgIE9CSkVDVDoKICAgIGZvciBteSAkT2JqZWN0IChxdyhTb3VyY2VPYmplY3QgVGFyZ2V0T2JqZWN0KSkgewoKICAgICAgICAjIGxvb2t1cCB0aGUgb2JqZWN0IG5hbWUKICAgICAgICAkRXhpc3Rpbmd7JE9iamVjdH0gPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgICAgICBPYmplY3RJRCA9PiAkRXhpc3Rpbmd7ICRPYmplY3QgLiAnSUQnIH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgT0JKRUNUIGlmICRFeGlzdGluZ3skT2JqZWN0fTsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJJbnZhbGlkICRPYmplY3QgaXMgZ2l2ZW4hIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb29rdXAgc3RhdGUKICAgICRFeGlzdGluZ3tTdGF0ZX0gPSAkU2VsZi0+U3RhdGVMb29rdXAoCiAgICAgICAgU3RhdGVJRCA9PiAkRXhpc3Rpbmd7U3RhdGVJRH0sCiAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBsb2FkIGJhY2tlbmQgb2Ygc291cmNlIG9iamVjdAogICAgbXkgJEJhY2tlbmRTb3VyY2VPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE9iamVjdCA9PiAkRXhpc3Rpbmd7U291cmNlT2JqZWN0fSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRTb3VyY2VPYmplY3Q7CgogICAgIyBsb2FkIGJhY2tlbmQgb2YgdGFyZ2V0IG9iamVjdAogICAgbXkgJEJhY2tlbmRUYXJnZXRPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE9iamVjdCA9PiAkRXhpc3Rpbmd7VGFyZ2V0T2JqZWN0fSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiBpZiAhJEJhY2tlbmRUYXJnZXRPYmplY3Q7CgogICAgIyBydW4gcHJlIGV2ZW50IG1vZHVsZSBvZiBzb3VyY2Ugb2JqZWN0CiAgICAkQmFja2VuZFNvdXJjZU9iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gJEV4aXN0aW5ne1NvdXJjZUtleX0sCiAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRFeGlzdGluZ3tUYXJnZXRPYmplY3R9LAogICAgICAgIFRhcmdldEtleSAgICA9PiAkRXhpc3Rpbmd7VGFyZ2V0S2V5fSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFN0YXRlICAgICAgICA9PiAkRXhpc3Rpbmd7U3RhdGV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBydW4gcHJlIGV2ZW50IG1vZHVsZSBvZiB0YXJnZXQgb2JqZWN0CiAgICAkQmFja2VuZFRhcmdldE9iamVjdC0+TGlua0RlbGV0ZVByZSgKICAgICAgICBLZXkgICAgICAgICAgPT4gJEV4aXN0aW5ne1RhcmdldEtleX0sCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICRFeGlzdGluZ3tTb3VyY2VPYmplY3R9LAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkRXhpc3Rpbmd7U291cmNlS2V5fSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFN0YXRlICAgICAgICA9PiAkRXhpc3Rpbmd7U3RhdGV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgdGhlIGxpbmsKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gbGlua19yZWxhdGlvbiAnCiAgICAgICAgICAgIC4gJ1dIRVJFICggc291cmNlX29iamVjdF9pZCA9ID8gQU5EIHNvdXJjZV9rZXkgPSA/ICcKICAgICAgICAgICAgLiAnQU5EIHRhcmdldF9vYmplY3RfaWQgPSA/IEFORCB0YXJnZXRfa2V5ID0gPyApICcKICAgICAgICAgICAgLiAnT1IgKCBzb3VyY2Vfb2JqZWN0X2lkID0gPyBBTkQgc291cmNlX2tleSA9ID8gJwogICAgICAgICAgICAuICdBTkQgdGFyZ2V0X29iamVjdF9pZCA9ID8gQU5EIHRhcmdldF9rZXkgPSA/ICkgJwogICAgICAgICAgICAuICdBTkQgdHlwZV9pZCA9ID8gJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3QxSUR9LCBcJFBhcmFte0tleTF9LAogICAgICAgICAgICBcJFBhcmFte09iamVjdDJJRH0sIFwkUGFyYW17S2V5Mn0sCiAgICAgICAgICAgIFwkUGFyYW17T2JqZWN0MklEfSwgXCRQYXJhbXtLZXkyfSwKICAgICAgICAgICAgXCRQYXJhbXtPYmplY3QxSUR9LCBcJFBhcmFte0tleTF9LAogICAgICAgICAgICBcJFR5cGVJRCwKICAgICAgICBdLAogICAgKTsKCiAgICAjIHJ1biBwb3N0IGV2ZW50IG1vZHVsZSBvZiBzb3VyY2Ugb2JqZWN0CiAgICAkQmFja2VuZFNvdXJjZU9iamVjdC0+TGlua0RlbGV0ZVBvc3QoCiAgICAgICAgS2V5ICAgICAgICAgID0+ICRFeGlzdGluZ3tTb3VyY2VLZXl9LAogICAgICAgIFRhcmdldE9iamVjdCA9PiAkRXhpc3Rpbmd7VGFyZ2V0T2JqZWN0fSwKICAgICAgICBUYXJnZXRLZXkgICAgPT4gJEV4aXN0aW5ne1RhcmdldEtleX0sCiAgICAgICAgVHlwZSAgICAgICAgID0+ICRQYXJhbXtUeXBlfSwKICAgICAgICBTdGF0ZSAgICAgICAgPT4gJEV4aXN0aW5ne1N0YXRlfSwKICAgICAgICBVc2VySUQgICAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgcnVuIHBvc3QgZXZlbnQgbW9kdWxlIG9mIHRhcmdldCBvYmplY3QKICAgICRCYWNrZW5kVGFyZ2V0T2JqZWN0LT5MaW5rRGVsZXRlUG9zdCgKICAgICAgICBLZXkgICAgICAgICAgPT4gJEV4aXN0aW5ne1RhcmdldEtleX0sCiAgICAgICAgU291cmNlT2JqZWN0ID0+ICRFeGlzdGluZ3tTb3VyY2VPYmplY3R9LAogICAgICAgIFNvdXJjZUtleSAgICA9PiAkRXhpc3Rpbmd7U291cmNlS2V5fSwKICAgICAgICBUeXBlICAgICAgICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgIFN0YXRlICAgICAgICA9PiAkRXhpc3Rpbmd7U3RhdGV9LAogICAgICAgIFVzZXJJRCAgICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtEZWxldGVBbGwoKQoKZGVsZXRlIGFsbCBsaW5rcyBvZiBhbiBvYmplY3QKCiAgICAkVHJ1ZSA9ICRMaW5rT2JqZWN0LT5MaW5rRGVsZXRlQWxsKAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICBLZXkgICAgPT4gJzMyMScsCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtEZWxldGVBbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IEtleSBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHN0YXRlIGxpc3QKICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+U3RhdGVMaXN0KAogICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBkZWxldGUgYWxsIGxpbmtzCiAgICBTVEFURToKICAgIGZvciBteSAkU3RhdGUgKCB2YWx1ZXMgJVN0YXRlTGlzdCApIHsKCiAgICAgICAgIyBnZXQgbGluayBsaXN0CiAgICAgICAgbXkgJExpbmtMaXN0ID0gJFNlbGYtPkxpbmtMaXN0KAogICAgICAgICAgICBPYmplY3QgPT4gJFBhcmFte09iamVjdH0sCiAgICAgICAgICAgIEtleSAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgU3RhdGUgID0+ICRTdGF0ZSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgU1RBVEUgaWYgISRMaW5rTGlzdDsKICAgICAgICBuZXh0IFNUQVRFIGlmICEleyRMaW5rTGlzdH07CgogICAgICAgIGZvciBteSAkT2JqZWN0ICgga2V5cyAleyRMaW5rTGlzdH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJExpbmtUeXBlICgga2V5cyAleyAkTGlua0xpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBsaW5rIHR5cGUgTGlzdAogICAgICAgICAgICAgICAgbXkgJExpbmtUeXBlTGlzdCA9ICRMaW5rTGlzdC0+eyRPYmplY3R9LT57JExpbmtUeXBlfTsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXskTGlua1R5cGVMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkTGlua0xpc3QtPnskT2JqZWN0fS0+eyRMaW5rVHlwZX0tPnskRGlyZWN0aW9ufTsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3RLZXkgKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkZWxldGUgdGhlIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICRQYXJhbXtPYmplY3R9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJE9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleTIgICAgPT4gJE9iamVjdEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJExpbmtUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICA9PiAkUGFyYW17VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIExpbmtMaXN0KCkKCmdldCBhbGwgZXhpc3RpbmcgbGlua3MgZm9yIGEgZ2l2ZW4gb2JqZWN0CgpSZXR1cm4KICAgICRMaW5rTGlzdCA9IHsKICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICBOb3JtYWwgPT4gewogICAgICAgICAgICAgICAgU291cmNlID0+IHsKICAgICAgICAgICAgICAgICAgICAxMiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAyMTIgPT4gMSwKICAgICAgICAgICAgICAgICAgICAzMzIgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIFBhcmVudENoaWxkID0+IHsKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgNSA9PiAxLAogICAgICAgICAgICAgICAgICAgIDkgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYXJnZXQgPT4gewogICAgICAgICAgICAgICAgICAgIDQgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgOCAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAxNSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIEZBUSA9PiB7CiAgICAgICAgICAgIFBhcmVudENoaWxkID0+IHsKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgNSA9PiAxLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICBteSAkTGlua0xpc3QgPSAkTGlua09iamVjdC0+TGlua0xpc3QoCiAgICAgICAgT2JqZWN0ICAgID0+ICdUaWNrZXQnLAogICAgICAgIEtleSAgICAgICA9PiAnMzIxJywKICAgICAgICBPYmplY3QyICAgPT4gJ0ZBUScsICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICdQYXJlbnRDaGlsZCcsICMgKG9wdGlvbmFsKQogICAgICAgIERpcmVjdGlvbiA9PiAnVGFyZ2V0JywgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCBCb3RoIChTb3VyY2V8VGFyZ2V0fEJvdGgpCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBLZXkgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvb2t1cCBvYmplY3QgaWQKICAgIG15ICRPYmplY3RJRCA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgTmFtZSAgID0+ICRQYXJhbXtPYmplY3R9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIGlmICEkT2JqZWN0SUQ7CgogICAgIyBsb29rdXAgc3RhdGUgaWQKICAgIG15ICRTdGF0ZUlEID0gJFNlbGYtPlN0YXRlTG9va3VwKAogICAgICAgIE5hbWUgICA9PiAkUGFyYW17U3RhdGV9LAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBwcmVwYXJlIFNRTCBzdGF0ZW1lbnQKICAgIG15ICRUeXBlU1FMID0gJyc7CiAgICBteSBAQmluZCA9ICggXCRPYmplY3RJRCwgXCRQYXJhbXtLZXl9LCBcJFN0YXRlSUQgKTsKCiAgICAjIGFkZCB0eXBlIGlkIHRvIFNRTCBzdGF0ZW1lbnQKICAgIGlmICggJFBhcmFte1R5cGV9ICkgewoKICAgICAgICAjIGxvb2t1cCB0eXBlIGlkCiAgICAgICAgbXkgJFR5cGVJRCA9ICRTZWxmLT5UeXBlTG9va3VwKAogICAgICAgICAgICBOYW1lICAgPT4gJFBhcmFte1R5cGV9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFR5cGVTUUwgPSAnQU5EIHR5cGVfaWQgPSA/ICc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRUeXBlSUQ7CiAgICB9CgogICAgIyBnZXQgbGlua3Mgd2hlcmUgdGhlIGdpdmVuIG9iamVjdCBpcyB0aGUgc291cmNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIHRhcmdldF9vYmplY3RfaWQsIHRhcmdldF9rZXksIHR5cGVfaWQgJwogICAgICAgICAgICAuICdGUk9NIGxpbmtfcmVsYXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSBzb3VyY2Vfb2JqZWN0X2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBzb3VyY2Vfa2V5ID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCBzdGF0ZV9pZCA9ID8gJwogICAgICAgICAgICAuICRUeXBlU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kLAogICAgKTsKCiAgICAjIGZldGNoIHJlc3VsdHMKICAgIG15IEBEYXRhOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlTGlua0RhdGE7CiAgICAgICAgJExpbmtEYXRhe1RhcmdldE9iamVjdElEfSA9ICRSb3dbMF07CiAgICAgICAgJExpbmtEYXRhe1RhcmdldEtleX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJExpbmtEYXRhe1R5cGVJRH0gICAgICAgICA9ICRSb3dbMl07CiAgICAgICAgcHVzaCBARGF0YSwgXCVMaW5rRGF0YTsKICAgIH0KCiAgICAjIHN0b3JlIHJlc3VsdHMKICAgIG15ICVMaW5rczsKICAgIG15ICVUeXBlUG9pbnRlZExpc3Q7CiAgICBmb3IgbXkgJExpbmtEYXRhIChARGF0YSkgewoKICAgICAgICAjIGxvb2t1cCBvYmplY3QgbmFtZQogICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAkU2VsZi0+T2JqZWN0TG9va3VwKAogICAgICAgICAgICBPYmplY3RJRCA9PiAkTGlua0RhdGEtPntUYXJnZXRPYmplY3RJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHR5cGUgZGF0YQogICAgICAgIG15ICVUeXBlRGF0YSA9ICRTZWxmLT5UeXBlR2V0KAogICAgICAgICAgICBUeXBlSUQgPT4gJExpbmtEYXRhLT57VHlwZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICRUeXBlUG9pbnRlZExpc3R7ICRUeXBlRGF0YXtOYW1lfSB9ID0gJFR5cGVEYXRhe1BvaW50ZWR9OwoKICAgICAgICAjIHN0b3JlIHRoZSByZXN1bHQKICAgICAgICAkTGlua3N7JFRhcmdldE9iamVjdH0tPnsgJFR5cGVEYXRhe05hbWV9IH0tPntUYXJnZXR9LT57ICRMaW5rRGF0YS0+e1RhcmdldEtleX0gfSA9IDE7CiAgICB9CgogICAgIyBnZXQgbGlua3Mgd2hlcmUgdGhlIGdpdmVuIG9iamVjdCBpcyB0aGUgdGFyZ2V0CiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PgogICAgICAgICAgICAnU0VMRUNUIHNvdXJjZV9vYmplY3RfaWQsIHNvdXJjZV9rZXksIHR5cGVfaWQgJwogICAgICAgICAgICAuICdGUk9NIGxpbmtfcmVsYXRpb24gJwogICAgICAgICAgICAuICdXSEVSRSB0YXJnZXRfb2JqZWN0X2lkID0gPyAnCiAgICAgICAgICAgIC4gJ0FORCB0YXJnZXRfa2V5ID0gPyAgJwogICAgICAgICAgICAuICdBTkQgc3RhdGVfaWQgPSA/ICcKICAgICAgICAgICAgLiAkVHlwZVNRTCwKICAgICAgICBCaW5kID0+IFxAQmluZCwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBARGF0YSA9ICgpOwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBteSAlTGlua0RhdGE7CiAgICAgICAgJExpbmtEYXRhe1NvdXJjZU9iamVjdElEfSA9ICRSb3dbMF07CiAgICAgICAgJExpbmtEYXRhe1NvdXJjZUtleX0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJExpbmtEYXRhe1R5cGVJRH0gICAgICAgICA9ICRSb3dbMl07CiAgICAgICAgcHVzaCBARGF0YSwgXCVMaW5rRGF0YTsKICAgIH0KCiAgICAjIHN0b3JlIHJlc3VsdHMKICAgIGZvciBteSAkTGlua0RhdGEgKEBEYXRhKSB7CgogICAgICAgICMgbG9va3VwIG9iamVjdCBuYW1lCiAgICAgICAgbXkgJFNvdXJjZU9iamVjdCA9ICRTZWxmLT5PYmplY3RMb29rdXAoCiAgICAgICAgICAgIE9iamVjdElEID0+ICRMaW5rRGF0YS0+e1NvdXJjZU9iamVjdElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdHlwZSBkYXRhCiAgICAgICAgbXkgJVR5cGVEYXRhID0gJFNlbGYtPlR5cGVHZXQoCiAgICAgICAgICAgIFR5cGVJRCA9PiAkTGlua0RhdGEtPntUeXBlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgJFR5cGVQb2ludGVkTGlzdHsgJFR5cGVEYXRhe05hbWV9IH0gPSAkVHlwZURhdGF7UG9pbnRlZH07CgogICAgICAgICMgc3RvcmUgdGhlIHJlc3VsdAogICAgICAgICRMaW5rc3skU291cmNlT2JqZWN0fS0+eyAkVHlwZURhdGF7TmFtZX0gfS0+e1NvdXJjZX0tPnsgJExpbmtEYXRhLT57U291cmNlS2V5fSB9ID0gMTsKICAgIH0KCiAgICAjIG1lcmdlIHNvdXJjZSB0YXJnZXQgcGFpcnMgaW50byBzb3VyY2UgZm9yIHVucG9pbnRlZCBsaW5rIHR5cGVzCiAgICBmb3IgbXkgJE9iamVjdCAoIGtleXMgJUxpbmtzICkgewoKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAoIGtleXMgJXsgJExpbmtzeyRPYmplY3R9IH0gKSB7CgogICAgICAgICAgICAjIG5leHQgaWYgbGluayB0eXBlIGlzIHBvaW50ZWQKICAgICAgICAgICAgbmV4dCBUWVBFIGlmICRUeXBlUG9pbnRlZExpc3R7JFR5cGV9OwoKICAgICAgICAgICAgIyBleHRyYWN0IHNvdXJjZSB0YXJnZXQgcGFpcgogICAgICAgICAgICBteSAkU291cmNlVGFyZ2V0ID0gJExpbmtzeyRPYmplY3R9LT57JFR5cGV9OwoKICAgICAgICAgICAgIyBuZXh0IGlmIHRoZXJlIGFyZSBubyB0YXJnZXQgZW50cmllcwogICAgICAgICAgICBuZXh0IFRZUEUgaWYgISRTb3VyY2VUYXJnZXQtPntUYXJnZXR9OwoKICAgICAgICAgICAgIyBzZXQgZW1wdHkgaGFzaCByZWZlcmVuY2UgYXMgZGVmYXVsdAogICAgICAgICAgICAkU291cmNlVGFyZ2V0LT57U291cmNlfSB8fD0ge307CgogICAgICAgICAgICAjIG1lcmdlIHRoZSBkYXRhCiAgICAgICAgICAgIG15ICVNZXJnZWRJRHMgPSAoICV7ICRTb3VyY2VUYXJnZXQtPntTb3VyY2V9IH0sICV7ICRTb3VyY2VUYXJnZXQtPntUYXJnZXR9IH0gKTsKICAgICAgICAgICAgJFNvdXJjZVRhcmdldC0+e1NvdXJjZX0gPSBcJU1lcmdlZElEczsKCiAgICAgICAgICAgICMgZGVsZXRlIHRhcmdldCBoYXNoCiAgICAgICAgICAgIGRlbGV0ZSAkU291cmNlVGFyZ2V0LT57VGFyZ2V0fTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlTGlua3MgaWYgISRQYXJhbXtPYmplY3QyfSAmJiAhJFBhcmFte0RpcmVjdGlvbn07CgogICAgIyByZW1vdmVkIG5vdCBuZWVkZWQgZWxlbWVudHMKICAgIE9CSkVDVDoKICAgIGZvciBteSAkT2JqZWN0ICgga2V5cyAlTGlua3MgKSB7CgogICAgICAgICMgcmVtb3ZlZCBub3QgbmVlZGVkIG9iamVjdAogICAgICAgIGlmICggJFBhcmFte09iamVjdDJ9ICYmICRQYXJhbXtPYmplY3QyfSBuZSAkT2JqZWN0ICkgewogICAgICAgICAgICBkZWxldGUgJExpbmtzeyRPYmplY3R9OwogICAgICAgICAgICBuZXh0IE9CSkVDVDsKICAgICAgICB9CgogICAgICAgIG5leHQgT0JKRUNUIGlmICEkUGFyYW17RGlyZWN0aW9ufTsKCiAgICAgICAgIyByZW1vdmVkIG5vdCBuZWVkZWQgZGlyZWN0aW9uCiAgICAgICAgZm9yIG15ICRUeXBlICgga2V5cyAleyAkTGlua3N7JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgIERJUkVDVElPTjoKICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7ICRMaW5rc3skT2JqZWN0fS0+eyRUeXBlfSB9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgRElSRUNUSU9OIGlmICRQYXJhbXtEaXJlY3Rpb259IGVxICREaXJlY3Rpb247CiAgICAgICAgICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkUGFyYW17RGlyZWN0aW9ufSBuZSAnU291cmNlJyAmJiAkUGFyYW17RGlyZWN0aW9ufSBuZSAnVGFyZ2V0JzsKCiAgICAgICAgICAgICAgICBkZWxldGUgJExpbmtzeyRPYmplY3R9LT57JFR5cGV9LT57JERpcmVjdGlvbn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlTGlua3M7Cn0KCj1pdGVtIExpbmtMaXN0V2l0aERhdGEoKQoKZ2V0IGFsbCBleGlzdGluZyBsaW5rcyBmb3IgYSBnaXZlbiBvYmplY3Qgd2l0aCBkYXRhIG9mIHRoZSBvdGhlciBvYmplY3RzCgpSZXR1cm4KICAgICRMaW5rTGlzdCA9IHsKICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICBOb3JtYWwgPT4gewogICAgICAgICAgICAgICAgU291cmNlID0+IHsKICAgICAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAgICAgMzMyID0+ICREYXRhT2ZJdGVtMzMyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgUGFyZW50Q2hpbGQgPT4gewogICAgICAgICAgICAgICAgU291cmNlID0+IHsKICAgICAgICAgICAgICAgICAgICA1ID0+ICREYXRhT2ZJdGVtNSwKICAgICAgICAgICAgICAgICAgICA5ID0+ICREYXRhT2ZJdGVtOSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBUYXJnZXQgPT4gewogICAgICAgICAgICAgICAgICAgIDQgID0+ICREYXRhT2ZJdGVtNCwKICAgICAgICAgICAgICAgICAgICA4ICA9PiAkRGF0YU9mSXRlbTgsCiAgICAgICAgICAgICAgICAgICAgMTUgPT4gJERhdGFPZkl0ZW0xNSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBGQVEgPT4gewogICAgICAgICAgICBQYXJlbnRDaGlsZCA9PiB7CiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gewogICAgICAgICAgICAgICAgICAgIDUgPT4gJERhdGFPZkl0ZW01LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICBteSAkTGlua0xpc3QgPSAkTGlua09iamVjdC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgICAgID0+ICczMjEnLAogICAgICAgIE9iamVjdDIgICA9PiAnRkFRJywgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBTdGF0ZSAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBUeXBlICAgICAgPT4gJ1BhcmVudENoaWxkJywgIyAob3B0aW9uYWwpCiAgICAgICAgRGlyZWN0aW9uID0+ICdUYXJnZXQnLCAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IEJvdGggKFNvdXJjZXxUYXJnZXR8Qm90aCkKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0xpc3RXaXRoRGF0YSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFN0YXRlIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGhlIGxpbmsgbGlzdAogICAgbXkgJExpbmtMaXN0ID0gJFNlbGYtPkxpbmtMaXN0KCVQYXJhbSk7CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIHJldHVybiBpZiAhJExpbmtMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTGlua0xpc3QgbmUgJ0hBU0gnOwoKICAgICMgYWRkIGRhdGEgdG8gaGFzaAogICAgT0JKRUNUOgogICAgZm9yIG15ICRPYmplY3QgKCBrZXlzICV7JExpbmtMaXN0fSApIHsKCiAgICAgICAgIyBsb2FkIGJhY2tlbmQKICAgICAgICBteSAkQmFja2VuZE9iamVjdCA9ICRTZWxmLT5fTG9hZEJhY2tlbmQoCiAgICAgICAgICAgIE9iamVjdCA9PiAkT2JqZWN0LAogICAgICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBiYWNrZW5kIG9iamVjdAogICAgICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICAgICBkZWxldGUgJExpbmtMaXN0LT57JE9iamVjdH07CiAgICAgICAgICAgIG5leHQgT0JKRUNUOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYmFja2VuZCBkYXRhCiAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkQmFja2VuZE9iamVjdC0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAgICAgTGlua0xpc3QgPT4gJExpbmtMaXN0LT57JE9iamVjdH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CgogICAgICAgIG5leHQgT0JKRUNUIGlmICRTdWNjZXNzOwoKICAgICAgICBkZWxldGUgJExpbmtMaXN0LT57JE9iamVjdH07CiAgICB9CgogICAgIyBjbGVhbiB0aGUgaGFzaAogICAgT0JKRUNUOgogICAgZm9yIG15ICRPYmplY3QgKCBrZXlzICV7JExpbmtMaXN0fSApIHsKCiAgICAgICAgTElOS1RZUEU6CiAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fSB9ICkgewoKICAgICAgICAgICAgRElSRUNUSU9OOgogICAgICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0gfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAleyAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfS0+eyREaXJlY3Rpb259IH07CgogICAgICAgICAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH0tPnskTGlua1R5cGV9LT57JERpcmVjdGlvbn07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5leHQgTElOS1RZUEUgaWYgJXsgJFBhcmFte0xpbmtMaXN0fS0+eyRMaW5rVHlwZX0gfTsKCiAgICAgICAgICAgIGRlbGV0ZSAkUGFyYW17TGlua0xpc3R9LT57JExpbmtUeXBlfTsKICAgICAgICB9CgogICAgICAgIG5leHQgT0JKRUNUIGlmICV7ICRQYXJhbXtMaW5rTGlzdH0gfTsKCiAgICAgICAgZGVsZXRlICRQYXJhbXtMaW5rTGlzdH07CiAgICB9CgogICAgcmV0dXJuICRMaW5rTGlzdDsKfQoKPWl0ZW0gTGlua0tleUxpc3QoKQoKcmV0dXJuIGEgaGFzaCB3aXRoIGFsbCBleGlzdGluZyBsaW5rcyBvZiBhIGdpdmVuIG9iamVjdAoKUmV0dXJuCiAgICAlTGlua0tleUxpc3QgPSAoCiAgICAgICAgNSAgID0+IDEsCiAgICAgICAgOSAgID0+IDEsCiAgICAgICAgMTIgID0+IDEsCiAgICAgICAgMjEyID0+IDEsCiAgICAgICAgMzMyID0+IDEsCiAgICApOwoKICAgIG15ICVMaW5rS2V5TGlzdCA9ICRMaW5rT2JqZWN0LT5MaW5rS2V5TGlzdCgKICAgICAgICBPYmplY3QxICAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5MSAgICAgID0+ICczMjEnLAogICAgICAgIE9iamVjdDIgICA9PiAnRkFRJywKICAgICAgICBTdGF0ZSAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBUeXBlICAgICAgPT4gJ1BhcmVudENoaWxkJywgIyAob3B0aW9uYWwpCiAgICAgICAgRGlyZWN0aW9uID0+ICdUYXJnZXQnLCAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IEJvdGggKFNvdXJjZXxUYXJnZXR8Qm90aCkKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgTGlua0tleUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0MSBLZXkxIE9iamVjdDIgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgbGluayBsaXN0CiAgICBteSAkTGlua0xpc3QgPSAkU2VsZi0+TGlua0xpc3QoCiAgICAgICAgJVBhcmFtLAogICAgICAgIE9iamVjdCA9PiAkUGFyYW17T2JqZWN0MX0sCiAgICAgICAgS2V5ICAgID0+ICRQYXJhbXtLZXkxfSwKICAgICk7CgogICAgIyBjaGVjayBsaW5rIGxpc3QKICAgIHJldHVybiBpZiAhJExpbmtMaXN0OwogICAgcmV0dXJuIGlmIHJlZiAkTGlua0xpc3QgbmUgJ0hBU0gnOwoKICAgICMgZXh0cmFjdCB0eXBlbGlzdAogICAgbXkgJFR5cGVMaXN0ID0gJExpbmtMaXN0LT57ICRQYXJhbXtPYmplY3QyfSB9OwoKICAgICMgYWRkIGRhdGEgdG8gaGFzaAogICAgbXkgJUxpbmtLZXlMaXN0OwogICAgZm9yIG15ICRUeXBlICgga2V5cyAleyRUeXBlTGlzdH0gKSB7CgogICAgICAgICMgZXh0cmFjdCBkaXJlY3Rpb24gbGlzdAogICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICBmb3IgbXkgJERpcmVjdGlvbiAoIGtleXMgJXskRGlyZWN0aW9uTGlzdH0gKSB7CgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJERpcmVjdGlvbkxpc3QtPnskRGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAgICAgICAgICMgYWRkIGtleSB0byBsaXN0CiAgICAgICAgICAgICAgICAkTGlua0tleUxpc3R7JEtleX0gPSAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259LT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVMaW5rS2V5TGlzdDsKfQoKPWl0ZW0gTGlua0tleUxpc3RXaXRoRGF0YSgpCgpyZXR1cm4gYSBoYXNoIHdpdGggYWxsIGV4aXN0aW5nIGxpbmtzIG9mIGEgZ2l2ZW4gb2JqZWN0CgpSZXR1cm4KICAgICVMaW5rS2V5TGlzdCA9ICgKICAgICAgICA1ICAgPT4gJERhdGFPZkl0ZW01LAogICAgICAgIDkgICA9PiAkRGF0YU9mSXRlbTksCiAgICAgICAgMTIgID0+ICREYXRhT2ZJdGVtMTIsCiAgICAgICAgMjEyID0+ICREYXRhT2ZJdGVtMjEyLAogICAgICAgIDMzMiA9PiAkRGF0YU9mSXRlbTMzMiwKICAgICk7CgogICAgbXkgJUxpbmtLZXlMaXN0ID0gJExpbmtPYmplY3QtPkxpbmtLZXlMaXN0V2l0aERhdGEoCiAgICAgICAgT2JqZWN0MSAgID0+ICdUaWNrZXQnLAogICAgICAgIEtleTEgICAgICA9PiAnMzIxJywKICAgICAgICBPYmplY3QyICAgPT4gJ0ZBUScsCiAgICAgICAgU3RhdGUgICAgID0+ICdWYWxpZCcsCiAgICAgICAgVHlwZSAgICAgID0+ICdQYXJlbnRDaGlsZCcsICMgKG9wdGlvbmFsKQogICAgICAgIERpcmVjdGlvbiA9PiAnVGFyZ2V0JywgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCBCb3RoIChTb3VyY2V8VGFyZ2V0fEJvdGgpCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIExpbmtLZXlMaXN0V2l0aERhdGEgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0MSBLZXkxIE9iamVjdDIgU3RhdGUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0aGUgbGluayBsaXN0CiAgICBteSAkTGlua0xpc3QgPSAkU2VsZi0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICAlUGFyYW0sCiAgICAgICAgT2JqZWN0ID0+ICRQYXJhbXtPYmplY3QxfSwKICAgICAgICBLZXkgICAgPT4gJFBhcmFte0tleTF9LAogICAgKTsKCiAgICAjIGNoZWNrIGxpbmsgbGlzdAogICAgcmV0dXJuIGlmICEkTGlua0xpc3Q7CiAgICByZXR1cm4gaWYgcmVmICRMaW5rTGlzdCBuZSAnSEFTSCc7CgogICAgIyBleHRyYWN0IHR5cGVsaXN0CiAgICBteSAkVHlwZUxpc3QgPSAkTGlua0xpc3QtPnsgJFBhcmFte09iamVjdDJ9IH07CgogICAgIyBhZGQgZGF0YSB0byBoYXNoCiAgICBteSAlTGlua0tleUxpc3Q7CiAgICBmb3IgbXkgJFR5cGUgKCBrZXlzICV7JFR5cGVMaXN0fSApIHsKCiAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgbXkgJERpcmVjdGlvbkxpc3QgPSAkVHlwZUxpc3QtPnskVHlwZX07CgogICAgICAgIGZvciBteSAkRGlyZWN0aW9uICgga2V5cyAleyREaXJlY3Rpb25MaXN0fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkS2V5ICgga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgIyBhZGQga2V5IHRvIGxpc3QKICAgICAgICAgICAgICAgICRMaW5rS2V5TGlzdHskS2V5fSA9ICREaXJlY3Rpb25MaXN0LT57JERpcmVjdGlvbn0tPnskS2V5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJUxpbmtLZXlMaXN0Owp9Cgo9aXRlbSBPYmplY3RMb29rdXAoKQoKbG9va3VwIGEgbGluayBvYmplY3QKCiAgICAkT2JqZWN0SUQgPSAkTGlua09iamVjdC0+T2JqZWN0TG9va3VwKAogICAgICAgIE5hbWUgICA9PiAnVGlja2V0JywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkTmFtZSA9ICRMaW5rT2JqZWN0LT5PYmplY3RMb29rdXAoCiAgICAgICAgT2JqZWN0SUQgPT4gMTIsCiAgICAgICAgVXNlcklEICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgT2JqZWN0TG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtPYmplY3RJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgT2JqZWN0SUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtPYmplY3RJRH0gKSB7CgogICAgICAgICMgY2hlY2sgY2FjaGUKICAgICAgICBteSAkQ2FjaGVLZXkgPSAnT2JqZWN0TG9va3VwOjpPYmplY3RJRDo6JyAuICRQYXJhbXtPYmplY3RJRH07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgbmFtZSBGUk9NIGxpbmtfb2JqZWN0IFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtPYmplY3RJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkTmFtZTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBuYW1lCiAgICAgICAgaWYgKCAhJE5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMaW5rIG9iamVjdCBpZCAnJFBhcmFte09iamVjdElEfScgbm90IGZvdW5kIGluIHRoZSBkYXRhYmFzZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdPYmplY3RMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgaW52ZXN0aWdhdGUgdGhlIG9iamVjdCBpZAogICAgICAgIG15ICRPYmplY3RJRDsKICAgICAgICBUUlk6CiAgICAgICAgZm9yIG15ICRUcnkgKCAxIC4uIDMgKSB7CgogICAgICAgICAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCAgID0+ICdTRUxFQ1QgaWQgRlJPTSBsaW5rX29iamVjdCBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICRPYmplY3RJRCA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhc3QgVFJZIGlmICRPYmplY3RJRDsKCiAgICAgICAgICAgICMgY2xlYW51cCB0aGUgZ2l2ZW4gbmFtZQogICAgICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICAgICAgU3RyaW5nUmVmID0+IFwkUGFyYW17TmFtZX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGlmIG5hbWUgaXMgdmFsaWQKICAgICAgICAgICAgaWYgKCAhJFBhcmFte05hbWV9IHx8ICRQYXJhbXtOYW1lfSA9fiBteyA6OiB9eG1zIHx8ICRQYXJhbXtOYW1lfSA9fiBteyBccyB9eG1zICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSW52YWxpZCBvYmplY3QgbmFtZSAnJFBhcmFte05hbWV9JyBpcyBnaXZlbiEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBUUlkgaWYgJFRyeSA9PSAxOwoKICAgICAgICAgICAgIyBpbnNlcnQgdGhlIG5ldyBvYmplY3QKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgID0+ICdJTlNFUlQgSU5UTyBsaW5rX29iamVjdCAobmFtZSkgVkFMVUVTICg/KScsCiAgICAgICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtOYW1lfSBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gJE9iamVjdElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkT2JqZWN0SUQ7CiAgICB9Cn0KCj1pdGVtIFR5cGVMb29rdXAoKQoKbG9va3VwIGEgbGluayB0eXBlCgogICAgJFR5cGVJRCA9ICRMaW5rT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgIE5hbWUgICA9PiAnTm9ybWFsJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7CgogICAgb3IKCiAgICAkTmFtZSA9ICRMaW5rT2JqZWN0LT5UeXBlTG9va3VwKAogICAgICAgIFR5cGVJRCA9PiA1NiwKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgVHlwZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VHlwZUlEfSAmJiAhJFBhcmFte05hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBUeXBlSUQgb3IgTmFtZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICRQYXJhbXtUeXBlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ1R5cGVMb29rdXA6OlR5cGVJRDo6JyAuICRQYXJhbXtUeXBlSUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkdldCggS2V5ID0+ICRDYWNoZUtleSApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBsaW5rX3R5cGUgV0hFUkUgaWQgPSA/JywKICAgICAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1R5cGVJRH0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkTmFtZTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkTmFtZSA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBuYW1lCiAgICAgICAgaWYgKCAhJE5hbWUgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJMaW5rIHR5cGUgaWQgJyRQYXJhbXtUeXBlSUR9JyBub3QgZm91bmQgaW4gdGhlIGRhdGFiYXNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICROYW1lLAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkTmFtZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIGNsZWFudXAgdGhlIGdpdmVuIG5hbWUKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgPT4gXCRQYXJhbXtOYW1lfSwKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ1R5cGVMb29rdXA6Ok5hbWU6OicgLiAkUGFyYW17TmFtZX07CiAgICAgICAgbXkgJENhY2hlID0gJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+R2V0KCBLZXkgPT4gJENhY2hlS2V5ICk7CiAgICAgICAgcmV0dXJuICRDYWNoZSBpZiAkQ2FjaGU7CgogICAgICAgICMgaW52ZXN0aWdhdGUgdGhlIHR5cGUgaWQKICAgICAgICBteSAkVHlwZUlEOwogICAgICAgIFRSWToKICAgICAgICBmb3IgbXkgJFRyeSAoIDEgLi4gMiApIHsKCiAgICAgICAgICAgICMgYXNrIHRoZSBkYXRhYmFzZQogICAgICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGxpbmtfdHlwZSBXSEVSRSBuYW1lID0gPycsCiAgICAgICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgICAgICRUeXBlSUQgPSAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsYXN0IFRSWSBpZiAkVHlwZUlEOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBuYW1lIGlzIHZhbGlkCiAgICAgICAgICAgIGlmICggISRQYXJhbXtOYW1lfSB8fCAkUGFyYW17TmFtZX0gPX4gbXsgOjogfXhtcyB8fCAkUGFyYW17TmFtZX0gPX4gbXsgXHMgfXhtcyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkludmFsaWQgdHlwZSBuYW1lICckUGFyYW17TmFtZX0nIGlzIGdpdmVuISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGluc2VydCB0aGUgbmV3IHR5cGUKICAgICAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGxpbmtfdHlwZSAnCiAgICAgICAgICAgICAgICAgICAgLiAnKG5hbWUsIHZhbGlkX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KSAnCiAgICAgICAgICAgICAgICAgICAgLiAnVkFMVUVTICg/LCAxLCBjdXJyZW50X3RpbWVzdGFtcCwgPywgY3VycmVudF90aW1lc3RhbXAsID8pJywKICAgICAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte05hbWV9LCBcJFBhcmFte1VzZXJJRH0sIFwkUGFyYW17VXNlcklEfSBdLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgc3RhdGUgaWQKICAgICAgICBpZiAoICEkVHlwZUlEICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGluayB0eXBlICckUGFyYW17TmFtZX0nIG5vdCBmb3VuZCBpbiB0aGUgZGF0YWJhc2UhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgY2FjaGUKICAgICAgICAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gJFR5cGVJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJFR5cGVJRDsKICAgIH0KfQoKPWl0ZW0gVHlwZUdldCgpCgpnZXQgYSBsaW5rIHR5cGUKClJldHVybgogICAgJFR5cGVEYXRhe1R5cGVJRH0KICAgICRUeXBlRGF0YXtOYW1lfQogICAgJFR5cGVEYXRhe1NvdXJjZU5hbWV9CiAgICAkVHlwZURhdGF7VGFyZ2V0TmFtZX0KICAgICRUeXBlRGF0YXtQb2ludGVkfQogICAgJFR5cGVEYXRhe0NyZWF0ZVRpbWV9CiAgICAkVHlwZURhdGF7Q3JlYXRlQnl9CiAgICAkVHlwZURhdGF7Q2hhbmdlVGltZX0KICAgICRUeXBlRGF0YXtDaGFuZ2VCeX0KCiAgICAlVHlwZURhdGEgPSAkTGlua09iamVjdC0+VHlwZUdldCgKICAgICAgICBUeXBlSUQgPT4gNDQ0LAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFR5cGVHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVHlwZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgcmV0dXJuICV7ICRTZWxmLT57Q2FjaGV9LT57VHlwZUdldH0tPntUeXBlSUR9LT57ICRQYXJhbXtUeXBlSUR9IH0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57VHlwZUdldH0tPntUeXBlSUR9LT57ICRQYXJhbXtUeXBlSUR9IH07CgogICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGlkLCBuYW1lLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5ICcKICAgICAgICAgICAgLiAnRlJPTSBsaW5rX3R5cGUgV0hFUkUgaWQgPSA/JywKICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17VHlwZUlEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVR5cGU7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUeXBle1R5cGVJRH0gICAgID0gJFJvd1swXTsKICAgICAgICAkVHlwZXtOYW1lfSAgICAgICA9ICRSb3dbMV07CiAgICAgICAgJFR5cGV7Q3JlYXRlVGltZX0gPSAkUm93WzJdOwogICAgICAgICRUeXBle0NyZWF0ZUJ5fSAgID0gJFJvd1szXTsKICAgICAgICAkVHlwZXtDaGFuZ2VUaW1lfSA9ICRSb3dbNF07CiAgICAgICAgJFR5cGV7Q2hhbmdlQnl9ICAgPSAkUm93WzVdOwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyBvZiBhbGwgdHlwZXMKICAgIG15ICRDb25maWd1cmVkVHlwZXMgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6VHlwZScpOwoKICAgICMgY2hlY2sgdGhlIGNvbmZpZwogICAgaWYgKCAhJENvbmZpZ3VyZWRUeXBlcy0+eyAkVHlwZXtOYW1lfSB9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTGlua3R5cGUgJyRUeXBle05hbWV9JyBkb2VzIG5vdCBleGlzdCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgYWRkIHNvdXJjZSBhbmQgdGFyZ2V0IG5hbWUKICAgICRUeXBle1NvdXJjZU5hbWV9ID0gJENvbmZpZ3VyZWRUeXBlcy0+eyAkVHlwZXtOYW1lfSB9LT57U291cmNlTmFtZX0gfHwgJyc7CiAgICAkVHlwZXtUYXJnZXROYW1lfSA9ICRDb25maWd1cmVkVHlwZXMtPnsgJFR5cGV7TmFtZX0gfS0+e1RhcmdldE5hbWV9IHx8ICcnOwoKICAgICMgY2xlYW4gdGhlIG5hbWVzCiAgICBBUkdVTUVOVDoKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KFNvdXJjZU5hbWUgVGFyZ2V0TmFtZSkpIHsKICAgICAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPlN0cmluZ0NsZWFuKAogICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFR5cGV7JEFyZ3VtZW50fSwKICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgUmVtb3ZlQWxsVGFicyAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICRUeXBleyRBcmd1bWVudH07CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiVGhlICRBcmd1bWVudCAnJFR5cGV7JEFyZ3VtZW50fScgaXMgaW52YWxpZCBpbiBTeXNDb25maWcgKExpbmtPYmplY3Q6OlR5cGUpISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBhZGQgcG9pbnRlZCB2YWx1ZQogICAgJFR5cGV7UG9pbnRlZH0gPSAkVHlwZXtTb3VyY2VOYW1lfSBuZSAkVHlwZXtUYXJnZXROYW1lfSA/IDEgOiAwOwoKICAgICMgY2FjaGUgcmVzdWx0CiAgICAkU2VsZi0+e0NhY2hlfS0+e1R5cGVHZXR9LT57VHlwZUlEfS0+eyAkUGFyYW17VHlwZUlEfSB9ID0gXCVUeXBlOwoKICAgIHJldHVybiAlVHlwZTsKfQoKPWl0ZW0gVHlwZUxpc3QoKQoKcmV0dXJuIGEgMmQgaGFzaCBsaXN0IG9mIGFsbCB2YWxpZCBsaW5rIHR5cGVzCgpSZXR1cm4KICAgICRUeXBlTGlzdHsKICAgICAgICBOb3JtYWwgPT4gewogICAgICAgICAgICBTb3VyY2VOYW1lID0+ICdOb3JtYWwnLAogICAgICAgICAgICBUYXJnZXROYW1lID0+ICdOb3JtYWwnLAogICAgICAgIH0sCiAgICAgICAgUGFyZW50Q2hpbGQgPT4gewogICAgICAgICAgICBTb3VyY2VOYW1lID0+ICdQYXJlbnQnLAogICAgICAgICAgICBUYXJnZXROYW1lID0+ICdDaGlsZCcsCiAgICAgICAgfSwKICAgIH0KCiAgICBteSAlVHlwZUxpc3QgPSAkTGlua09iamVjdC0+VHlwZUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFR5cGVMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHR5cGUgbGlzdAogICAgbXkgJFR5cGVMaXN0UmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlR5cGUnKSB8fCB7fTsKICAgIG15ICVUeXBlTGlzdCA9ICV7JFR5cGVMaXN0UmVmfTsKCiAgICAjIHByZXBhcmUgdGhlIHR5cGUgbGlzdAogICAgVFlQRToKICAgIGZvciBteSAkVHlwZSAoIGtleXMgJVR5cGVMaXN0ICkgewoKICAgICAgICAjIGNoZWNrIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBuYW1lCiAgICAgICAgQVJHVU1FTlQ6CiAgICAgICAgZm9yIG15ICRBcmd1bWVudCAocXcoU291cmNlTmFtZSBUYXJnZXROYW1lKSkgewoKICAgICAgICAgICAgIyBzZXQgZW1wdHkgc3RyaW5nIGFzIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgJFR5cGVMaXN0eyRUeXBlfXskQXJndW1lbnR9IHx8PSAnJzsKCiAgICAgICAgICAgICMgY2xlYW4gdGhlIGFyZ3VtZW50CiAgICAgICAgICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+U3RyaW5nQ2xlYW4oCiAgICAgICAgICAgICAgICBTdHJpbmdSZWYgICAgICAgICA9PiBcJFR5cGVMaXN0eyRUeXBlfXskQXJndW1lbnR9LAogICAgICAgICAgICAgICAgUmVtb3ZlQWxsTmV3bGluZXMgPT4gMSwKICAgICAgICAgICAgICAgIFJlbW92ZUFsbFRhYnMgICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UIGlmICRUeXBlTGlzdHskVHlwZX17JEFyZ3VtZW50fTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGludmFsaWQgbGluayB0eXBlIGZyb20gbGlzdAogICAgICAgICAgICBkZWxldGUgJFR5cGVMaXN0eyRUeXBlfTsKCiAgICAgICAgICAgIG5leHQgVFlQRTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICVUeXBlTGlzdDsKfQoKPWl0ZW0gVHlwZUdyb3VwTGlzdCgpCgpyZXR1cm4gYSAyZCBoYXNoIGxpc3Qgb2YgYWxsIHR5cGUgZ3JvdXBzCgpSZXR1cm4KICAgICVUeXBlR3JvdXBMaXN0ID0gKAogICAgICAgIDAwMSA9PiBbCiAgICAgICAgICAgICdOb3JtYWwnLAogICAgICAgICAgICAnUGFyZW50Q2hpbGQnLAogICAgICAgIF0sCiAgICAgICAgMDAyID0+IFsKICAgICAgICAgICAgJ05vcm1hbCcsCiAgICAgICAgICAgICdEZXBlbmRzT24nLAogICAgICAgIF0sCiAgICAgICAgMDAzID0+IFsKICAgICAgICAgICAgJ1BhcmVudENoaWxkJywKICAgICAgICAgICAgJ1JlbGV2YW50VG8nLAogICAgICAgIF0sCiAgICApOwoKICAgIG15ICVUeXBlR3JvdXBMaXN0ID0gJExpbmtPYmplY3QtPlR5cGVHcm91cExpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFR5cGVHcm91cExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVXNlcklEIScgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgcG9zc2libGUgdHlwZSBncm91cHMKICAgIG15ICRUeXBlR3JvdXBMaXN0UmVmID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0xpbmtPYmplY3Q6OlR5cGVHcm91cCcpIHx8IHt9OwogICAgbXkgJVR5cGVHcm91cExpc3QgPSAleyRUeXBlR3JvdXBMaXN0UmVmfTsKCiAgICAjIHByZXBhcmUgdGhlIHBvc3NpYmxlIGxpbmsgbGlzdAogICAgVFlQRUdST1VQOgogICAgZm9yIG15ICRUeXBlR3JvdXAgKCBrZXlzICVUeXBlR3JvdXBMaXN0ICkgewoKICAgICAgICAjIGNoZWNrIHRoZSB0eXBlcwogICAgICAgIFRZUEU6CiAgICAgICAgZm9yIG15ICRUeXBlICggQHsgJFR5cGVHcm91cExpc3R7JFR5cGVHcm91cH0gfSApIHsKCiAgICAgICAgICAgICMgc2V0IGVtcHR5IHN0cmluZyBhcyBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgICRUeXBlIHx8PSAnJzsKCiAgICAgICAgICAgICMgdHJpbSB0aGUgYXJndW1lbnQKICAgICAgICAgICAgJFNlbGYtPntDaGVja0l0ZW1PYmplY3R9LT5TdHJpbmdDbGVhbigKICAgICAgICAgICAgICAgIFN0cmluZ1JlZiA9PiBcJFR5cGUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IFRZUEUgaWYgJFR5cGUgJiYgJFR5cGUgIX4gbXsgOjogfXhtcyAmJiAkVHlwZSAhfiBteyBccyB9eG1zOwoKICAgICAgICAgICAgIyBsb2cgdGhlIGVycm9yCiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICAgICAiVGhlIEFyZ3VtZW50ICckVHlwZScgaXMgaW52YWxpZCBpbiBTeXNDb25maWcgKExpbmtPYmplY3Q6OlR5cGVHcm91cCkhIiwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcmVtb3ZlIGVudHJ5IGZyb20gbGlzdCBpZiBpdCBpcyBpbnZhbGlkCiAgICAgICAgICAgIGRlbGV0ZSAkVHlwZUdyb3VwTGlzdHskVHlwZUdyb3VwfTsKCiAgICAgICAgICAgIG5leHQgVFlQRUdST1VQOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0eXBlIGxpc3QKICAgIG15ICVUeXBlTGlzdCA9ICRTZWxmLT5UeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgdHlwZXMKICAgIFRZUEVHUk9VUDoKICAgIGZvciBteSAkVHlwZUdyb3VwICgga2V5cyAlVHlwZUdyb3VwTGlzdCApIHsKCiAgICAgICAgIyBjaGVjayB0aGUgdHlwZXMKICAgICAgICBUWVBFOgogICAgICAgIGZvciBteSAkVHlwZSAoIEB7ICRUeXBlR3JvdXBMaXN0eyRUeXBlR3JvdXB9IH0gKSB7CgogICAgICAgICAgICAjIHNldCBlbXB0eSBzdHJpbmcgYXMgZGVmYXVsdCB2YWx1ZQogICAgICAgICAgICAkVHlwZSB8fD0gJyc7CgogICAgICAgICAgICBuZXh0IFRZUEUgaWYgJFR5cGVMaXN0eyRUeXBlfTsKCiAgICAgICAgICAgICMgbG9nIHRoZSBlcnJvcgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIlRoZSBMaW5rVHlwZSAnJFR5cGUnIGlzIGludmFsaWQgaW4gU3lzQ29uZmlnIChMaW5rT2JqZWN0OjpUeXBlR3JvdXApISIsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3QgaWYgdHlwZSBkb2Vzbid0IGV4aXN0CiAgICAgICAgICAgIGRlbGV0ZSAkVHlwZUdyb3VwTGlzdHskVHlwZUdyb3VwfTsKCiAgICAgICAgICAgIG5leHQgVFlQRUdST1VQOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJVR5cGVHcm91cExpc3Q7Cn0KCj1pdGVtIFBvc3NpYmxlVHlwZSgpCgpyZXR1cm4gdHJ1ZSBpZiBib3RoIHR5cGVzIGFyZSBOT1QgdG9nZXRoZXIgaW4gYSB0eXBlIGdyb3VwCgogICAgbXkgJFRydWUgPSAkTGlua09iamVjdC0+UG9zc2libGVUeXBlKAogICAgICAgIFR5cGUxICA9PiAnTm9ybWFsJywKICAgICAgICBUeXBlMiAgPT4gJ1BhcmVudENoaWxkJywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgUG9zc2libGVUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KCBUeXBlMSBUeXBlMiBVc2VySUQgKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCB0eXBlIGdyb3VwIGxpc3QKICAgIG15ICVUeXBlR3JvdXBMaXN0ID0gJFNlbGYtPlR5cGVHcm91cExpc3QoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIGFsbCB0eXBlIGdyb3VwcwogICAgVFlQRUdST1VQOgogICAgZm9yIG15ICRUeXBlR3JvdXAgKCBrZXlzICVUeXBlR3JvdXBMaXN0ICkgewoKICAgICAgICBteSAlVHlwZUxpc3QgPSBtYXAgeyAkXyA9PiAxIH0gQHsgJFR5cGVHcm91cExpc3R7JFR5cGVHcm91cH0gfTsKCiAgICAgICAgcmV0dXJuIGlmICRUeXBlTGlzdHsgJFBhcmFte1R5cGUxfSB9ICYmICRUeXBlTGlzdHsgJFBhcmFte1R5cGUyfSB9OwoKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU3RhdGVMb29rdXAoKQoKbG9va3VwIGEgbGluayBzdGF0ZQoKICAgICRTdGF0ZUlEID0gJExpbmtPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgIE5hbWUgICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICBvcgoKICAgICROYW1lID0gJExpbmtPYmplY3QtPlN0YXRlTG9va3VwKAogICAgICAgIFN0YXRlSUQgPT4gNTYsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRH0gJiYgISRQYXJhbXtOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgU3RhdGVJRCBvciBOYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggJFBhcmFte1N0YXRlSUR9ICkgewoKICAgICAgICAjIGNoZWNrIGNhY2hlCiAgICAgICAgbXkgJENhY2hlS2V5ID0gJ1N0YXRlTG9va3VwOjpTdGF0ZUlEOjonIC4gJFBhcmFte1N0YXRlSUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPkdldCggS2V5ID0+ICRDYWNoZUtleSApOwogICAgICAgIHJldHVybiAkQ2FjaGUgaWYgJENhY2hlOwoKICAgICAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgICA9PiAnU0VMRUNUIG5hbWUgRlJPTSBsaW5rX3N0YXRlIFdIRVJFIGlkID0gPycsCiAgICAgICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtTdGF0ZUlEfSBdLAogICAgICAgICAgICBMaW1pdCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICROYW1lOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICROYW1lID0gJFJvd1swXTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgdGhlIG5hbWUKICAgICAgICBpZiAoICEkTmFtZSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmsgc3RhdGUgaWQgJyRQYXJhbXtTdGF0ZUlEfScgbm90IGZvdW5kIGluIHRoZSBkYXRhYmFzZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIHNldCBjYWNoZQogICAgICAgICRTZWxmLT57Q2FjaGVJbnRlcm5hbE9iamVjdH0tPlNldCgKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJE5hbWU7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBjaGVjayBjYWNoZQogICAgICAgIG15ICRDYWNoZUtleSA9ICdTdGF0ZUxvb2t1cDo6TmFtZTo6JyAuICRQYXJhbXtOYW1lfTsKICAgICAgICBteSAkQ2FjaGUgPSAkU2VsZi0+e0NhY2hlSW50ZXJuYWxPYmplY3R9LT5HZXQoIEtleSA9PiAkQ2FjaGVLZXkgKTsKICAgICAgICByZXR1cm4gJENhY2hlIGlmICRDYWNoZTsKCiAgICAgICAgIyBhc2sgdGhlIGRhdGFiYXNlCiAgICAgICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMICAgPT4gJ1NFTEVDVCBpZCBGUk9NIGxpbmtfc3RhdGUgV0hFUkUgbmFtZSA9ID8nLAogICAgICAgICAgICBCaW5kICA9PiBbIFwkUGFyYW17TmFtZX0gXSwKICAgICAgICAgICAgTGltaXQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSAkU3RhdGVJRDsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICAkU3RhdGVJRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIHRoZSBzdGF0ZSBpZAogICAgICAgIGlmICggISRTdGF0ZUlEICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTGluayBzdGF0ZSAnJFBhcmFte05hbWV9JyBub3QgZm91bmQgaW4gdGhlIGRhdGFiYXNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgc2V0IGNhY2hlCiAgICAgICAgJFNlbGYtPntDYWNoZUludGVybmFsT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+ICRTdGF0ZUlELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAkU3RhdGVJRDsKICAgIH0KfQoKPWl0ZW0gU3RhdGVMaXN0KCkKCnJldHVybiBhIGhhc2ggbGlzdCBvZiBhbGwgdmFsaWQgbGluayBzdGF0ZXMKClJldHVybgogICAgJFN0YXRlTGlzdHsKICAgICAgICA0ID0+ICdWYWxpZCcsCiAgICAgICAgOCA9PiAnVGVtcG9yYXJ5JywKICAgIH0KCiAgICBteSAlU3RhdGVMaXN0ID0gJExpbmtPYmplY3QtPlN0YXRlTGlzdCgKICAgICAgICBWYWxpZCAgPT4gMCwgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxICgwfDEpCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBVc2VySUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNldCB2YWxpZCBwYXJhbQogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICRQYXJhbXtWYWxpZH0gPSAxOwogICAgfQoKICAgICMgYWRkIHZhbGlkIHBhcnQKICAgIG15ICRTUUxXaGVyZSA9ICcnOwogICAgaWYgKCAkUGFyYW17VmFsaWR9ICkgewoKICAgICAgICAjIGNyZWF0ZSB0aGUgdmFsaWQgaWQgc3RyaW5nCiAgICAgICAgbXkgJFZhbGlkSURzID0gam9pbiAnLCAnLCAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRJRHNHZXQoKTsKCiAgICAgICAgJFNRTFdoZXJlID0gIldIRVJFIHZhbGlkX2lkIElOICggJFZhbGlkSURzICkiOwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkLCBuYW1lIEZST00gbGlua19zdGF0ZSAkU1FMV2hlcmUiLAogICAgKTsKCiAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgIG15ICVTdGF0ZUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRTdGF0ZUxpc3R7ICRSb3dbMF0gfSA9ICRSb3dbMV07CiAgICB9CgogICAgcmV0dXJuICVTdGF0ZUxpc3Q7Cn0KCj1pdGVtIE9iamVjdERlc2NyaXB0aW9uR2V0KCkKCnJldHVybiBhIGhhc2ggb2Ygb2JqZWN0IGRlc2NyaXB0aW9ucwoKUmV0dXJuCiAgICAlRGVzY3JpcHRpb24gPSAoCiAgICAgICAgTm9ybWFsID0+ICcnLAogICAgICAgIExvbmcgICA9PiAnJywKICAgICk7CgogICAgJURlc2NyaXB0aW9uID0gJExpbmtPYmplY3QtPk9iamVjdERlc2NyaXB0aW9uR2V0KAogICAgICAgIE9iamVjdCAgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgICA9PiAxMjMsCiAgICAgICAgVXNlcklEICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3REZXNjcmlwdGlvbkdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhPYmplY3QgS2V5IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBPYmplY3QgPT4gJFBhcmFte09iamVjdH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgZ2V0IG9iamVjdCBkZXNjcmlwdGlvbgogICAgbXkgJURlc2NyaXB0aW9uID0gJEJhY2tlbmRPYmplY3QtPk9iamVjdERlc2NyaXB0aW9uR2V0KAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgcmV0dXJuICVEZXNjcmlwdGlvbjsKfQoKPWl0ZW0gT2JqZWN0U2VhcmNoKCkKCnJldHVybiBhIGhhc2ggcmVmZXJlbmNlIG9mIHRoZSBzZWFyY2ggcmVzdWx0cwoKUmV0dXJuCiAgICAkT2JqZWN0TGlzdCA9IHsKICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICBOT1RMSU5LRUQgPT4gewogICAgICAgICAgICAgICAgU291cmNlID0+IHsKICAgICAgICAgICAgICAgICAgICAxMiAgPT4gJERhdGFPZkl0ZW0xMiwKICAgICAgICAgICAgICAgICAgICAyMTIgPT4gJERhdGFPZkl0ZW0yMTIsCiAgICAgICAgICAgICAgICAgICAgMzMyID0+ICREYXRhT2ZJdGVtMzMyLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgfTsKCiAgICAkT2JqZWN0TGlzdCA9ICRMaW5rT2JqZWN0LT5PYmplY3RTZWFyY2goCiAgICAgICAgT2JqZWN0ICAgICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgU3ViT2JqZWN0ICAgID0+ICdDb21wdXRlcicgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBTZWFyY2hQYXJhbXMgPT4gJEhhc2hSZWYsICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIFVzZXJJRCAgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBPYmplY3RTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoT2JqZWN0IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIGJhY2tlbmQKICAgIG15ICRCYWNrZW5kT2JqZWN0ID0gJFNlbGYtPl9Mb2FkQmFja2VuZCgKICAgICAgICBPYmplY3QgPT4gJFBhcmFte09iamVjdH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gaWYgISRCYWNrZW5kT2JqZWN0OwoKICAgICMgc2VhcmNoIG9iamVjdHMKICAgIG15ICRTZWFyY2hMaXN0ID0gJEJhY2tlbmRPYmplY3QtPk9iamVjdFNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICApOwoKICAgIG15ICVPYmplY3RMaXN0OwogICAgJE9iamVjdExpc3R7ICRQYXJhbXtPYmplY3R9IH0gPSAkU2VhcmNoTGlzdDsKCiAgICByZXR1cm4gXCVPYmplY3RMaXN0Owp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9aXRlbSBfTG9hZEJhY2tlbmQoKQoKdG8gbG9hZCBhIGxpbmsgb2JqZWN0IGJhY2tlbmQgbW9kdWxlCgogICAgJEhhc2hSZWYgPSAkTGlua09iamVjdC0+X0xvYWRCYWNrZW5kKAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICBVc2VySUQgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX0xvYWRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KE9iamVjdCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgb2JqZWN0IGlzIGFscmVhZHkgY2FjaGVkCiAgICByZXR1cm4gJFNlbGYtPntDYWNoZX0tPntMb2FkQmFja2VuZH0tPnsgJFBhcmFte09iamVjdH0gfQogICAgICAgIGlmICRTZWxmLT57Q2FjaGV9LT57TG9hZEJhY2tlbmR9LT57ICRQYXJhbXtPYmplY3R9IH07CgogICAgbXkgJEJhY2tlbmRNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q6OiRQYXJhbXtPYmplY3R9IjsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRCYWNrZW5kTW9kdWxlKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJFBhcmFte09iamVjdH0hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkQmFja2VuZE1vZHVsZS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICk7CgogICAgaWYgKCAhJEJhY2tlbmRPYmplY3QgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBsb2FkIGxpbmsgYmFja2VuZCBtb2R1bGUgJyRQYXJhbXtPYmplY3R9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIG9iamVjdAogICAgJFNlbGYtPntDYWNoZX0tPntMb2FkQmFja2VuZH0tPnsgJFBhcmFte09iamVjdH0gfSA9ICRCYWNrZW5kT2JqZWN0OwoKICAgIHJldHVybiAkQmFja2VuZE9iamVjdDsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjQuMi4xICQgJERhdGU6IDIwMTEtMTEtMDQgMDY6MjM6MjQgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMucG0gLSBhbGwgc3RhdHMgY29yZSBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgRXh0ZW5zaW9ucyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogU3RhdHMucG0sdiAxLjcuMi4yIDIwMTEtMTAtMjUgMDg6MjU6MjMgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgRGF0ZTo6UGNhbGMgcXcoOmFsbCk7CnVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKIyBLSVhDb3JlLWNhcGVJVAp1c2UgS2VybmVsOjpTeXN0ZW06OktJWFV0aWxzOwoKIyBFTyBLSVhDb3JlLWNhcGVJVAoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcuMi4yICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6U3RhdHMgLSBzdGF0cyBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHN0YXRzIGZ1bmN0aW9ucy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0czsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJEdyb3VwT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRDU1ZPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q1NWLT5uZXcoCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFVzZXJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICk7CiAgICBteSAkU3RhdHNPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdHMtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICAgICBDU1ZPYmplY3QgICAgPT4gJENTVk9iamVjdCwKICAgICAgICBUaW1lT2JqZWN0ICAgPT4gJFRpbWVPYmplY3QsCiAgICAgICAgR3JvdXBPYmplY3QgID0+ICRHcm91cE9iamVjdCwKICAgICAgICBVc2VyT2JqZWN0ICAgPT4gJFVzZXJPYmplY3QsCiAgICAgICAgVXNlcklEICAgICAgID0+IDEyMywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCByZWYgdG8gb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgb2JqZWN0IGxpc3QgZm9yIGNvbXBsZXRlbmVzcwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KAogICAgICAgIENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlcklEIEdyb3VwT2JqZWN0IFVzZXJPYmplY3QgVGltZU9iamVjdCBNYWluT2JqZWN0IENTVk9iamVjdAogICAgICAgIERCT2JqZWN0IEVuY29kZU9iamVjdAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgc3VwcGxlbWVudGFyeSBvYmplY3RzCiAgICAkU2VsZi0+e1hNTE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoJVBhcmFtKTsKCiAgICAjIHRlbXBvcmFyeSBkaXJlY3RvcnkKICAgICRTZWxmLT57U3RhdHNUZW1wRGlyfSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3Zhci9zdGF0cy8nOwoKICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICRTZWxmLT57S0lYVXRpbHNPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OktJWFV0aWxzLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgIyBFTyBLSVhDb3JlLWNhcGVJVAoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gU3RhdHNBZGQoKQoKYWRkIG5ldyBlbXB0eSBzdGF0cwoKICAgIG15ICRTdGF0SUQgPSAkU3RhdHNPYmplY3QtPlN0YXRzQWRkKCk7Cgo9Y3V0CgpzdWIgU3RhdHNBZGQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGdldCBuZXcgU3RhdElECiAgICBteSAkU3RhdElEID0gMTsKICAgIG15IEBLZXlzID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoU2VhcmNoKCBUeXBlID0+ICdTdGF0cycsICk7CiAgICBpZiAoQEtleXMpIHsKICAgICAgICBteSBAU29ydEtleXMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gQEtleXM7CiAgICAgICAgJFN0YXRJRCA9ICRTb3J0S2V5c1stMV0gKyAxOwogICAgfQoKICAgICMgcmVxdWVzdGluZyBjdXJyZW50IHRpbWUgc3RhbXAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CgogICAgIyBtZXRhIHRhZ3MKICAgIG15ICRTdGF0TnVtYmVyID0gJFN0YXRJRCArICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6U3RhdHNTdGFydE51bWJlcicpOwogICAgbXkgJU1ldGFEYXRhICAgPSAoCiAgICAgICAgQ3JlYXRlZCA9PiBbCiAgICAgICAgICAgIHsgQ29udGVudCA9PiAkVGltZVN0YW1wIH0sCiAgICAgICAgXSwKICAgICAgICBDcmVhdGVkQnkgPT4gWwogICAgICAgICAgICB7IENvbnRlbnQgPT4gJFNlbGYtPntVc2VySUR9IH0sCiAgICAgICAgXSwKICAgICAgICBDaGFuZ2VkID0+IFsKICAgICAgICAgICAgeyBDb250ZW50ID0+ICRUaW1lU3RhbXAgfSwKICAgICAgICBdLAogICAgICAgIENoYW5nZWRCeSA9PiBbCiAgICAgICAgICAgIHsgQ29udGVudCA9PiAkU2VsZi0+e1VzZXJJRH0gfSwKICAgICAgICBdLAogICAgICAgIFZhbGlkID0+IFsKICAgICAgICAgICAgeyBDb250ZW50ID0+IDEgfSwKICAgICAgICBdLAogICAgICAgIFN0YXROdW1iZXIgPT4gWwogICAgICAgICAgICB7IENvbnRlbnQgPT4gJFN0YXROdW1iZXIgfSwKICAgICAgICBdLAogICAgKTsKCiAgICAjIHN0YXJ0IG5ldyBzdGF0cyByZWNvcmQKICAgIG15IEBYTUxIYXNoID0gKAogICAgICAgIHsgb3Ryc19zdGF0cyA9PiBbIFwlTWV0YURhdGEgXSB9LAogICAgKTsKICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoQWRkKAogICAgICAgIFR5cGUgICAgPT4gJ1N0YXRzJywKICAgICAgICBLZXkgICAgID0+ICRTdGF0SUQsCiAgICAgICAgWE1MSGFzaCA9PiBcQFhNTEhhc2gsCiAgICApOwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDYW4gbm90IGFkZCBhIG5ldyBTdGF0IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTdGF0SUQ7Cn0KCj1pdGVtIFN0YXRzR2V0KCkKCmdldCBhIGhhc2ggcmVmIG9mIHRoZSBzdGF0cyB5b3UgbmVlZAoKICAgIG15ICRIYXNoUmVmID0gJFN0YXRzT2JqZWN0LT5TdGF0c0dldCgKICAgICAgICBTdGF0SUQgICAgICAgICAgICAgPT4gJzEyMycsCiAgICAgICAgTm9PYmplY3RBdHRyaWJ1dGVzID0+IDEsICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lY2Vzc2FyeSBkYXRhCiAgICBpZiAoICEkUGFyYW17U3RhdElEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBTdGF0SUQhJyApOwogICAgfQoKICAgICMgZ2V0IGhhc2ggZnJvbSBzdG9yYWdlCiAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICAgICBUeXBlID0+ICdTdGF0cycsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17U3RhdElEfSwKICAgICk7CgogICAgaWYgKCAhJFhNTEhhc2hbMF0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBnZXQgU3RhdHNJRCAkUGFyYW17U3RhdElEfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVTdGF0OwogICAgbXkgJFN0YXRzWE1MID0gJFhNTEhhc2hbMF0tPntvdHJzX3N0YXRzfS0+WzFdOwoKICAgICMgcHJvY2VzcyBhbGwgc3RyaW5ncwogICAgJFN0YXR7U3RhdElEfSA9ICRQYXJhbXtTdGF0SUR9OwogICAgZm9yIG15ICRLZXkgKAogICAgICAgIHF3KFRpdGxlIE9iamVjdCBGaWxlIERlc2NyaXB0aW9uIFN1bVJvdyBTdW1Db2wgU3RhdE51bWJlcgogICAgICAgIENhY2hlIFN0YXRUeXBlIFZhbGlkIE9iamVjdE1vZHVsZSBDcmVhdGVkQnkgQ2hhbmdlZEJ5IENyZWF0ZWQgQ2hhbmdlZAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCBkZWZpbmVkICRTdGF0c1hNTC0+eyRLZXl9LT5bMV0tPntDb250ZW50fSApIHsKICAgICAgICAgICAgJFN0YXR7JEtleX0gPSAkU3RhdHNYTUwtPnskS2V5fS0+WzFdLT57Q29udGVudH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHJvY2VzcyBhbGwgYXJyYXlzCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoUGVybWlzc2lvbiBGb3JtYXQgR3JhcGhTaXplKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkU3RhdHNYTUwtPnskS2V5fS0+WzFdLT57Q29udGVudH07CgogICAgICAgICRTdGF0eyRLZXl9ID0gKCk7CiAgICAgICAgZm9yIG15ICRJbmRleCAoIDEgLi4gJCN7ICRTdGF0c1hNTC0+eyRLZXl9IH0gKSB7CiAgICAgICAgICAgIHB1c2ggQHsgJFN0YXR7JEtleX0gfSwgJFN0YXRzWE1MLT57JEtleX0tPlskSW5kZXhdLT57Q29udGVudH07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnRzIG9mIHRoZSBkeW5hbWljIHN0YXRzCiAgICAjICVBbGxvd2VkIGlzIHVzZWQgdG8gYXZvaWQgZG91YmxlIHNlbGVjdGlvbiBpbiBkaWZmZXJlbnQgZm9ybXMKICAgIG15ICVBbGxvd2VkOwogICAgbXkgJVRpbWVBbGxvd2VkOwogICAgbXkgJFRpbWVFbGVtZW50ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpUaW1lRWxlbWVudCcpIHx8ICdUaW1lJzsKICAgIHJldHVybiBcJVN0YXQgaWYgISRTdGF0e09iamVjdH07CgogICAgJFN0YXR7T2JqZWN0TmFtZX0gPSAkU2VsZi0+R2V0T2JqZWN0TmFtZSgKICAgICAgICBPYmplY3RNb2R1bGUgPT4gJFN0YXR7T2JqZWN0TW9kdWxlfSwKICAgICk7CgogICAgcmV0dXJuIFwlU3RhdCBpZiAkUGFyYW17Tm9PYmplY3RBdHRyaWJ1dGVzfTsKCiAgICBLRVk6CiAgICBmb3IgbXkgJEtleSAocXcoVXNlQXNYdmFsdWUgVXNlQXNWYWx1ZVNlcmllcyBVc2VBc1Jlc3RyaWN0aW9uKSkgewoKICAgICAgICAjIEBTdGF0QXR0cmlidXRlc1NpbXBsaWZpZWQgZ2l2ZSB5b3UgYXJyYXlzIHdpdGhvdXQgdW5kZWYgYXJyYXkgZWxlbWVudHMKICAgICAgICBteSBAU3RhdEF0dHJpYnV0ZXNTaW1wbGlmaWVkOwoKICAgICAgICAjIGdldCB0aGUgYXR0cmlidXRlcyBvZiB0aGUgb2JqZWN0CiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZXMgPSAkU2VsZi0+R2V0U3RhdHNPYmplY3RBdHRyaWJ1dGVzKAogICAgICAgICAgICBPYmplY3RNb2R1bGUgPT4gJFN0YXR7T2JqZWN0TW9kdWxlfSwKICAgICAgICAgICAgVXNlICAgICAgICAgID0+ICRLZXksCiAgICAgICAgKTsKCiAgICAgICAgbmV4dCBLRVkgaWYgIUBPYmplY3RBdHRyaWJ1dGVzOwoKICAgICAgICBBVFRSSUJVVEU6CiAgICAgICAgZm9yIG15ICRBdHRyaWJ1dGUgKEBPYmplY3RBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIG15ICRFbGVtZW50ID0gJEF0dHJpYnV0ZS0+e0VsZW1lbnR9OwogICAgICAgICAgICBpZiAoICRBdHRyaWJ1dGUtPntCbG9ja30gZXEgJ1RpbWUnICkgewogICAgICAgICAgICAgICAgaWYgKCAkS2V5IGVxICdVc2VBc1ZhbHVlU2VyaWVzJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRBbGxvd2VkeyRFbGVtZW50fSAmJiAkQWxsb3dlZHskRWxlbWVudH0gPT0gMSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFsbG93ZWR7JEVsZW1lbnR9ICAgICA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lQWxsb3dlZHskRWxlbWVudH0gPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFsbG93ZWR7JEVsZW1lbnR9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRLZXkgZXEgJ1VzZUFzUmVzdHJpY3Rpb24nICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFRpbWVBbGxvd2VkeyRFbGVtZW50fSAmJiAkVGltZUFsbG93ZWR7JEVsZW1lbnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRBbGxvd2VkeyRFbGVtZW50fSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkQWxsb3dlZHskRWxlbWVudH0gPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0IEFUVFJJQlVURSBpZiAkQWxsb3dlZHskRWxlbWVudH07CgogICAgICAgICAgICBpZiAoICRTdGF0c1hNTC0+eyRLZXl9ICkgewogICAgICAgICAgICAgICAgbXkgQFN0YXRBdHRyaWJ1dGVzID0gQHsgJFN0YXRzWE1MLT57JEtleX0gfTsKICAgICAgICAgICAgICAgIGlmICggISRTdGF0QXR0cmlidXRlc1swXSApIHsKICAgICAgICAgICAgICAgICAgICBzaGlmdCBAU3RhdEF0dHJpYnV0ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBSRUY6CiAgICAgICAgICAgICAgICBmb3IgbXkgJFJlZiAoQFN0YXRBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQXR0cmlidXRlLT57VHJhbnNsYXRpb259ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQXR0cmlidXRlLT57VHJhbnNsYXRpb259ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG5leHQgUkVGCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICEoCiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgICYmICRSZWYtPntFbGVtZW50fQogICAgICAgICAgICAgICAgICAgICAgICAmJiAkRWxlbWVudCBlcSAkUmVmLT57RWxlbWVudH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBpZiBzZWxlY3RlZCBlbGVtZW50cyBleGl0LCBhZGQgdGhlIGluZm9ybWF0aW9uIHRvIHRoZSBTdGF0QXR0cmlidXRlcwogICAgICAgICAgICAgICAgICAgICRBdHRyaWJ1dGUtPntTZWxlY3RlZH0gPSAxOwogICAgICAgICAgICAgICAgICAgIGlmICggJFJlZi0+e0ZpeGVkfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEF0dHJpYnV0ZS0+e0ZpeGVkfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEluZGV4ICggMSAuLiAkI3sgJFJlZi0+e1NlbGVjdGVkVmFsdWVzfSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEF0dHJpYnV0ZS0+e1NlbGVjdGVkVmFsdWVzfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFJlZi0+e1NlbGVjdGVkVmFsdWVzfS0+WyRJbmRleF0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgIyBzdGV0dGluZ3MgZm9yIHdvcmtpbmcgd2l0aCB0aW1lIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAgICAgZm9yICgKICAgICAgICAgICAgICAgICAgICAgICAgcXcoVGltZVN0b3AgVGltZVN0YXJ0IFRpbWVSZWxhdGl2ZVVuaXQKICAgICAgICAgICAgICAgICAgICAgICAgVGltZVJlbGF0aXZlQ291bnQgVGltZVNjYWxlQ291bnQKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRSZWYtPnskX30gJiYgKCAhJEF0dHJpYnV0ZS0+eyRffSB8fCAkUmVmLT57Rml4ZWR9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQXR0cmlidXRlLT57JF99ID0gJFJlZi0+eyRffTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkQWxsb3dlZHskRWxlbWVudH0gPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFN0YXRBdHRyaWJ1dGVzU2ltcGxpZmllZCwgJEF0dHJpYnV0ZTsKCiAgICAgICAgfQogICAgICAgICRTdGF0eyRLZXl9ID0gXEBTdGF0QXR0cmlidXRlc1NpbXBsaWZpZWQ7CiAgICB9CgogICAgcmV0dXJuIFwlU3RhdDsKfQoKPWl0ZW0gU3RhdHNVcGRhdGUoKQoKdXBkYXRlIGEgc3RhdAoKICAgICRTdGF0c09iamVjdC0+U3RhdHNVcGRhdGUoCiAgICAgICAgU3RhdElEID0+ICcxMjMnLAogICAgICAgIEhhc2ggICA9PiBcJUhhc2gKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGRlY2xhcmF0aW9uIG9mIHRoZSBoYXNoCiAgICBteSAlU3RhdFhNTDsKCiAgICAjIGNoZWNrIG5lY2Vzc2FyeSBkYXRhCiAgICBpZiAoICEkUGFyYW17U3RhdElEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBTdGF0SUQhJyApOwogICAgfQoKICAgICMgcmVxdWVzdGluZyBzdGF0cyByZWZlcmVuY2UKICAgIG15ICRTdGF0T2xkID0gJFNlbGYtPlN0YXRzR2V0KCBTdGF0SUQgPT4gJFBhcmFte1N0YXRJRH0gKTsKICAgIGlmICggISRTdGF0T2xkICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgZ2V0IHN0YXRzLCBwZXJoYXBzIHlvdSBoYXZlIGFuIGludmFsaWQgc3RhdHMgaWQhIChTdGF0c0lEID0+ICRQYXJhbXtTdGF0SUR9KSIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlY2xhcmUgdmFyaWFibGUKICAgIG15ICRTdGF0TmV3ID0gJFBhcmFte0hhc2h9OwoKICAgICMgYSBkZWxldGUgZnVuY3Rpb24gY2FuIGJlIHRoZSBiZXR0ZXIgc29sdXRpb24KICAgIGZvciBteSAkS2V5IChxdyhVc2VBc1h2YWx1ZSBVc2VBc1ZhbHVlU2VyaWVzIFVzZUFzUmVzdHJpY3Rpb24pKSB7CiAgICAgICAgZm9yICggQHsgJFN0YXRPbGQtPnskS2V5fSB9ICkgewogICAgICAgICAgICBpZiAoICEkXy0+e1NlbGVjdGVkfSApIHsKICAgICAgICAgICAgICAgICRfID0gdW5kZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBhZG9wdCBjaGFuZ2VzCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJXskU3RhdE5ld30gKSB7CiAgICAgICAgJFN0YXRPbGQtPnskS2V5fSA9ICRTdGF0TmV3LT57JEtleX07CiAgICB9CgogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JFN0YXRPbGR9ICkgewogICAgICAgIGlmICggJEtleSBlcSAnVXNlQXNYdmFsdWUnIHx8ICRLZXkgZXEgJ1VzZUFzVmFsdWVTZXJpZXMnIHx8ICRLZXkgZXEgJ1VzZUFzUmVzdHJpY3Rpb24nICkgewogICAgICAgICAgICBteSAkSW5kZXggPSAwOwogICAgICAgICAgICBSRUY6CiAgICAgICAgICAgIGZvciBteSAkUmVmICggQHsgJFN0YXRPbGQtPnskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBSRUYgaWYgISRSZWY7CgogICAgICAgICAgICAgICAgJEluZGV4Kys7CiAgICAgICAgICAgICAgICAkU3RhdFhNTHskS2V5fS0+WyRJbmRleF0tPntFbGVtZW50fSA9ICRSZWYtPntFbGVtZW50fTsKICAgICAgICAgICAgICAgICRTdGF0WE1MeyRLZXl9LT5bJEluZGV4XS0+e0ZpeGVkfSAgID0gJFJlZi0+e0ZpeGVkfTsKICAgICAgICAgICAgICAgIG15ICRTdWJJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFZhbHVlICggQHsgJFJlZi0+e1NlbGVjdGVkVmFsdWVzfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRTdWJJbmRleCsrOwogICAgICAgICAgICAgICAgICAgICRTdGF0WE1MeyRLZXl9LT5bJEluZGV4XS0+e1NlbGVjdGVkVmFsdWVzfS0+WyRTdWJJbmRleF0tPntDb250ZW50fSA9ICRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHN0ZXR0aW5ncyBmb3Igd29ya2luZyB3aXRoIHRpbWUgZWxlbWVudHMKICAgICAgICAgICAgICAgIGZvciAocXcoVGltZVN0b3AgVGltZVN0YXJ0IFRpbWVSZWxhdGl2ZVVuaXQgVGltZVJlbGF0aXZlQ291bnQgVGltZVNjYWxlQ291bnQpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUmVmLT57JF99ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU3RhdFhNTHskS2V5fS0+WyRJbmRleF0tPnskX30gPSAkUmVmLT57JF99OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNpZiAoIHJlZiAkU3RhdE9sZC0+eyRLZXl9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCAwIC4uICQjeyAkU3RhdE9sZC0+eyRLZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAkU3RhdFhNTHskS2V5fS0+WyRJbmRleF0tPntDb250ZW50fSA9ICRTdGF0T2xkLT57JEtleX0tPlskSW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJFN0YXRPbGQtPnskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTdGF0WE1MeyRLZXl9LT5bMV0tPntDb250ZW50fSA9ICRTdGF0T2xkLT57JEtleX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBtZXRhIHRhZ3MKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CiAgICAkU3RhdFhNTHtDaGFuZ2VkfS0+WzFdLT57Q29udGVudH0gICA9ICRUaW1lU3RhbXA7CiAgICAkU3RhdFhNTHtDaGFuZ2VkQnl9LT5bMV0tPntDb250ZW50fSA9ICRTZWxmLT57VXNlcklEfTsKCiAgICAjIHBsZWFzZSBkb24ndCBjaGFuZ2UgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgWE1MSGFzaERlbGV0ZSBhbmQgWE1MSGFzaEFkZAogICAgIyBpbnRvIHRoZSBuZXcgZnVuY3Rpb24gWE1MSGFzaFVwZGF0ZSwgdGhlcmUgaXMgYW4gaW5jb21wYXRpYmlsaXR5LgogICAgIyBQZXJoYXBzIHRoZXJlIGFyZSBpbnRyaWNhY2llcyBiZWNhdXNlIG9mIHRoZSAnQXJyYXlbMF0gPSB1bmRlZicgZGVmaW5pdGlvbgoKICAgICMgZGVsZXRlIHRoZSBvbGQgcmVjb3JkCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaERlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTdGF0cycsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17U3RhdElEfSwKICAgICk7CiAgICBpZiAoICEkU3VjY2VzcyApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGRlbGV0ZSBYTUxIYXNoISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGRlbGV0ZSBjYWNoZQogICAgJFNlbGYtPl9EZWxldGVDYWNoZSggU3RhdElEID0+ICRQYXJhbXtTdGF0SUR9ICk7CgogICAgbXkgQEFycmF5ID0gKAogICAgICAgIHsgb3Ryc19zdGF0cyA9PiBbIFwlU3RhdFhNTCBdLCB9LAogICAgKTsKCiAgICAjIGFkZCB0aGUgcmV2aXNlZCByZWNvcmQKICAgICRTdWNjZXNzID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoQWRkKAogICAgICAgIFR5cGUgICAgPT4gJ1N0YXRzJywKICAgICAgICBLZXkgICAgID0+ICRQYXJhbXtTdGF0SUR9LAogICAgICAgIFhNTEhhc2ggPT4gXEBBcnJheQogICAgKTsKICAgIGlmICggISRTdWNjZXNzICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJDYW4ndCBhZGQgWE1MSGFzaCEiICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTdGF0c0RlbGV0ZSgpCgpkZWxldGUgYSBzdGF0cwoKICAgICRTdGF0c09iamVjdC0+U3RhdHNEZWxldGUoIFN0YXRJRCA9PiAnMTIzJyApOwoKPWN1dAoKc3ViIFN0YXRzRGVsZXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWNlc3NhcnkgZGF0YQogICAgaWYgKCAhJFBhcmFte1N0YXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgU3RhdElEIScgKTsKICAgIH0KCiAgICAjIGRlbGV0ZSB0aGUgcmVjb3JkCiAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaERlbGV0ZSgKICAgICAgICBUeXBlID0+ICdTdGF0cycsCiAgICAgICAgS2V5ICA9PiAkUGFyYW17U3RhdElEfSwKICAgICk7CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhJFN1Y2Nlc3MgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBkZWxldGUgWE1MSGFzaCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZGVsZXRlIGNhY2hlCiAgICAkU2VsZi0+X0RlbGV0ZUNhY2hlKCBTdGF0SUQgPT4gJFBhcmFte1N0YXRJRH0gKTsKCiAgICAjIGdldCBsaXN0IG9mIGluc3RhbGxlZCBzdGF0cyBmaWxlcwogICAgbXkgQFN0YXRzRmlsZUxpc3QgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EaXJlY3RvcnlSZWFkKAogICAgICAgIERpcmVjdG9yeSA9PiAkU2VsZi0+e1N0YXRzVGVtcERpcn0sCiAgICAgICAgRmlsdGVyICAgID0+ICcqLnhtbC5pbnN0YWxsZWQnLAogICAgKTsKCiAgICAjIGRlbGV0ZSB0aGUgLmluc3RhbGxlZCBmaWxlIGluIHRlbXAgZGlyCiAgICBGSUxFOgogICAgZm9yIG15ICRGaWxlICggc29ydCBAU3RhdHNGaWxlTGlzdCApIHsKCiAgICAgICAgIyByZWFkIGZpbGUgY29udGVudAogICAgICAgIG15ICRTdGF0c0lEUmVmID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVJlYWQoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRGaWxlLAogICAgICAgICk7CgogICAgICAgIG5leHQgRklMRSBpZiAhJFN0YXRzSURSZWY7CiAgICAgICAgbmV4dCBGSUxFIGlmIHJlZiAkU3RhdHNJRFJlZiBuZSAnU0NBTEFSJzsKICAgICAgICBuZXh0IEZJTEUgaWYgISR7JFN0YXRzSURSZWZ9OwoKICAgICAgICBuZXh0IEZJTEUgaWYgJHskU3RhdHNJRFJlZn0gbmUgJFBhcmFte1N0YXRJRH07CgogICAgICAgICMgZGVsZXRlIC5pbnN0YWxsZWQgZmlsZQogICAgICAgICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVEZWxldGUoCiAgICAgICAgICAgIExvY2F0aW9uID0+ICRGaWxlLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZGQgbG9nIG1lc3NhZ2UKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgIE1lc3NhZ2UgID0+ICJEZWxldGUgc3RhdHMgKFN0YXRzSUQgPSAkUGFyYW17U3RhdElEfSkiLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gR2V0U3RhdHNMaXN0KCkKCmxpc3RzIGFsbCBzdGF0cyBpZCdzCgogICAgbXkgJEFycmF5UmVmID0gJFN0YXRzT2JqZWN0LT5HZXRTdGF0c0xpc3QoCiAgICAgICAgT3JkZXJCeSAgID0+ICdJRCcgfHwgJ1RpdGxlJyB8fCAnT2JqZWN0JywgIyBvcHRpb25hbAogICAgICAgIERpcmVjdGlvbiA9PiAnQVNDJyB8fCAnREVTQycsICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgR2V0U3RhdHNMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQFNlYXJjaFJlc3VsdDsKICAgIGlmICggISggQFNlYXJjaFJlc3VsdCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFNlYXJjaCggVHlwZSA9PiAnU3RhdHMnICkgKSApIHsKICAgICAgICAkU2VsZi0+X0F1dG9tYXRpY1NhbXBsZUltcG9ydCgpOwogICAgICAgIHJldHVybiBpZiAhKCBAU2VhcmNoUmVzdWx0ID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoU2VhcmNoKCBUeXBlID0+ICdTdGF0cycgKSApOwogICAgfQoKICAgICMgZ2V0IHVzZXIgZ3JvdXBzCiAgICBteSBAR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgIFJlc3VsdCA9PiAnSUQnLAogICAgKTsKCiAgICAkUGFyYW17T3JkZXJCeX0gfHw9ICdJRCc7CgogICAgIyBhIHNvbHV0aW9uIHdpdGggbW9yZSBwZXJmb3JtYW5jZSBpcyB1c2VmdWwKICAgIG15ICVSZXN1bHRIYXNoOwogICAgZm9yIG15ICRTdGF0SUQgKEBTZWFyY2hSZXN1bHQpIHsKICAgICAgICBteSAkU3RhdCA9ICRTZWxmLT5TdGF0c0dldCgKICAgICAgICAgICAgU3RhdElEICAgICAgICAgICAgID0+ICRTdGF0SUQsCiAgICAgICAgICAgIE5vT2JqZWN0QXR0cmlidXRlcyA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFVzZXJQZXJtaXNzaW9uID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57QWNjZXNzUnd9IHx8ICRTZWxmLT57VXNlcklEfSA9PSAxICkgewogICAgICAgICAgICAkVXNlclBlcm1pc3Npb24gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyB0aGVzZSBmdW5jdGlvbiBpcyBzaW1pbGFyIGxpa2Ugb3RoZXIgZnVuY3Rpb24gaW4gdGhlIGNvZGUgcGVyaGFwcyB3ZSBzaG91bGQKICAgICAgICAjIG1lcmdlIHRoZW0KICAgICAgICAjIHBlcm1pc3Npb24gY2hlY2sKICAgICAgICBlbHNpZiAoICRTdGF0LT57VmFsaWR9ICkgewogICAgICAgICAgICBNQVJLRToKICAgICAgICAgICAgZm9yIG15ICRHcm91cElEICggQHsgJFN0YXQtPntQZXJtaXNzaW9ufSB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRVc2VyR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRHcm91cElEID09ICRVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyUGVybWlzc2lvbiA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgTUFSS0U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFVzZXJQZXJtaXNzaW9uID09IDEgKSB7CgogICAgICAgICAgICAjIG9yZGVyIGJ5IHRpdGxlCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnl9IGVxICdUaXRsZScgKSB7CiAgICAgICAgICAgICAgICAkUmVzdWx0SGFzaHskU3RhdElEfSA9ICRTdGF0LT57VGl0bGV9IHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9yZGVyIGJ5IG9iamVjdAogICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtPcmRlckJ5fSBlcSAnT2JqZWN0JyApIHsKICAgICAgICAgICAgICAgICRSZXN1bHRIYXNoeyRTdGF0SUR9ID0gJFN0YXQtPntPYmplY3R9IHx8ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIG9yZGVyIGJ5IGlkCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFJlc3VsdEhhc2h7JFN0YXRJRH0gPSBpbnQgJFN0YXRJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIG15IEBTb3J0QXJyYXk7CiAgICBpZiAoICRQYXJhbXtPcmRlckJ5fSBlcSAnSUQnICkgewogICAgICAgIEBTb3J0QXJyYXkgPSBzb3J0IHsgJFJlc3VsdEhhc2h7JGF9IDw9PiAkUmVzdWx0SGFzaHskYn0gfSBrZXlzICVSZXN1bHRIYXNoOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgQFNvcnRBcnJheSA9IHNvcnQgeyAkUmVzdWx0SGFzaHskYX0gY21wICRSZXN1bHRIYXNoeyRifSB9IGtleXMgJVJlc3VsdEhhc2g7CiAgICB9CiAgICBpZiAoICRQYXJhbXtEaXJlY3Rpb259ICYmICRQYXJhbXtEaXJlY3Rpb259IGVxICdERVNDJyApIHsKICAgICAgICBAU29ydEFycmF5ID0gcmV2ZXJzZSBAU29ydEFycmF5OwogICAgfQoKICAgIHJldHVybiBcQFNvcnRBcnJheTsKfQoKPWl0ZW0gU3VtQnVpbGQoKQoKYnVpbGQgc3VtIGluIHggb3IvYW5kIHkgYXhpcwoKICAgICRTdGF0QXJyYXkgPSAkU3RhdHNPYmplY3QtPlN1bUJ1aWxkKAogICAgICAgIEFycmF5ICA9PiBcQFJlc3VsdCwKICAgICAgICBTdW1Sb3cgPT4gMSwKICAgICAgICBTdW1Db2wgPT4gMCwKICAgICk7Cgo9Y3V0CgpzdWIgU3VtQnVpbGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBARGF0YSA9IEB7ICRQYXJhbXtBcnJheX0gfTsKCiAgICAjIGFkZCBzdW0geQogICAgaWYgKCAkUGFyYW17U3VtUm93fSApIHsKCiAgICAgICAgcHVzaCBAeyAkRGF0YVsxXSB9LCAnU3VtJzsKCiAgICAgICAgZm9yIG15ICRJbmRleDEgKCAyIC4uICQjRGF0YSApIHsKCiAgICAgICAgICAgIG15ICRTdW0gPSAwOwogICAgICAgICAgICBJTkRFWDI6CiAgICAgICAgICAgIGZvciBteSAkSW5kZXgyICggMSAuLiAkI3sgJERhdGFbJEluZGV4MV0gfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IElOREVYMiBpZiAhJERhdGFbJEluZGV4MV1bJEluZGV4Ml07CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJERhdGFbJEluZGV4MV1bJEluZGV4Ml07CgogICAgICAgICAgICAgICAgIyBjbGVhbiB0aGUgc3RyaW5nCiAgICAgICAgICAgICAgICAkVmFsdWUgPX4gc3sgXEEgXHMrIH17fXhtczsKICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzeyBccysgXHogfXt9eG1zOwogICAgICAgICAgICAgICAgJFZhbHVlID1+IHN7ICwgfXsufXhtczsKCiAgICAgICAgICAgICAgICAjIGFkZCB2YWx1ZSB0byBzdW1tZXJ5CiAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZSA9fiBte14tP1xkKyhcLlxkKyk/JH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFN1bSArPSAkVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQHsgJERhdGFbJEluZGV4MV0gfSwgJFN1bTsKICAgICAgICB9CiAgICB9CgogICAgIyBhZGQgc3VtIHgKICAgIGlmICggJFBhcmFte1N1bUNvbH0gKSB7CgogICAgICAgIG15IEBTdW1Sb3cgPSAoKTsKICAgICAgICAkU3VtUm93WzBdID0gJ1N1bSc7CgogICAgICAgIGZvciBteSAkSW5kZXgxICggMiAuLiAkI0RhdGEgKSB7CgogICAgICAgICAgICBJTkRFWDI6CiAgICAgICAgICAgIGZvciBteSAkSW5kZXgyICggMSAuLiAkI3sgJERhdGFbJEluZGV4MV0gfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IElOREVYMiBpZiAhJERhdGFbJEluZGV4MV1bJEluZGV4Ml07CgogICAgICAgICAgICAgICAgIyBleHRyYWN0IHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJERhdGFbJEluZGV4MV1bJEluZGV4Ml07CgogICAgICAgICAgICAgICAgIyBjbGVhbiB0aGUgc3RyaW5nCiAgICAgICAgICAgICAgICAkVmFsdWUgPX4gc3sgXEEgXHMrIH17fXhtczsKICAgICAgICAgICAgICAgICRWYWx1ZSA9fiBzeyBccysgXHogfXt9eG1zOwogICAgICAgICAgICAgICAgJFZhbHVlID1+IHN7ICwgfXsufXhtczsKCiAgICAgICAgICAgICAgICAjIGFkZCB2YWx1ZSB0byBzdW1tZXJ5CiAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZSA9fiBte14tP1xkKyhcLlxkKyk/JH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFN1bVJvd1skSW5kZXgyXSArPSAkVmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHB1c2ggQERhdGEsIFxAU3VtUm93OwogICAgfQoKICAgIHJldHVybiBcQERhdGE7Cn0KCj1pdGVtIEdlbmVyYXRlR3JhcGgoKQoKbWFrZSBncmFwaCBmcm9tIHJlc3VsdCBhcnJheQoKICAgIG15ICRHcmFwaCA9ICRTdGF0c09iamVjdC0+R2VuZXJhdGVHcmFwaCgKICAgICAgICBBcnJheSAgICAgICAgPT4gXEBTdGF0QXJyYXksCiAgICAgICAgR3JhcGhTaXplICAgID0+ICc4MDB4NjAwJywKICAgICAgICBIZWFkQXJyYXlSZWYgPT4gJEhlYWRBcnJheVJlZiwKICAgICAgICBUaXRsZSAgICAgICAgPT4gJ0FsbCBUaWNrZXRzIG9mIHRoZSBtb250aCcsCiAgICAgICAgRm9ybWF0ICAgICAgID0+ICdHRDo6R3JhcGg6OmxpbmVzJywKICAgICk7Cgo9Y3V0CgpzdWIgR2VuZXJhdGVHcmFwaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgbmVlZCBwYXJhbXMgYXJlIGF2YWlsYWJsZQogICAgZm9yIChxdyhBcnJheSBHcmFwaFNpemUgSGVhZEFycmF5UmVmIFRpdGxlIEZvcm1hdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgQFN0YXRBcnJheSAgICA9IEB7ICRQYXJhbXtBcnJheX0gfTsKICAgIG15ICRIZWFkQXJyYXlSZWYgPSAkUGFyYW17SGVhZEFycmF5UmVmfTsKICAgIG15ICRHREJhY2tlbmQgICAgPSAkUGFyYW17Rm9ybWF0fTsKCiAgICAjIGRlbGV0ZSBTdW1Db2wgYW5kIFN1bVJvdyBpZiBwcmVzZW50CiAgICBpZiAoICRTdGF0QXJyYXlbLTFdWzBdIGVxICdTdW0nICkgewogICAgICAgIHBvcCBAU3RhdEFycmF5OwogICAgfQogICAgaWYgKCAkSGVhZEFycmF5UmVmLT5bLTFdIGVxICdTdW0nICkgewogICAgICAgIHBvcCBAeyRIZWFkQXJyYXlSZWZ9OwogICAgICAgIGZvciBteSAkUm93IChAU3RhdEFycmF5KSB7CiAgICAgICAgICAgIHBvcCBAeyRSb3d9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgZ2QgbW9kdWxlcwogICAgZm9yIG15ICRNb2R1bGUgKCAnR0QnLCAnR0Q6OkdyYXBoJywgJEdEQmFja2VuZCApIHsKICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTW9kdWxlISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlbW92ZSBmaXJzdCB5L3ggcG9zaXRpb24KICAgIG15ICRYTGFibGUgPSBzaGlmdCBAeyRIZWFkQXJyYXlSZWZ9OwoKICAgICMgZ2V0IGZpcnN0IGNvbCBmb3IgbGVnZW5kCiAgICBteSBAWUxpbmU7CiAgICBmb3IgbXkgJFRtcCAoQFN0YXRBcnJheSkgewogICAgICAgIHB1c2ggQFlMaW5lLCAkVG1wLT5bMF07CiAgICAgICAgc2hpZnQgQHskVG1wfTsKICAgIH0KCiAgICAjIGJ1aWxkIHBsb3QgZGF0YQogICAgbXkgQFBEYXRhID0gKCAkSGVhZEFycmF5UmVmLCBAU3RhdEFycmF5ICk7CiAgICBteSAoICRYU2l6ZSwgJFlTaXplICkgPSBzcGxpdCggbXt4fXgsICRQYXJhbXtHcmFwaFNpemV9ICk7CiAgICBteSAkZ3JhcGggPSAkR0RCYWNrZW5kLT5uZXcoICRYU2l6ZSB8fCA1NTAsICRZU2l6ZSB8fCAzNTAgKTsKICAgICRncmFwaC0+c2V0KAogICAgICAgIHhfbGFiZWwgPT4gJFhMYWJsZSwKCiAgICAgICAgIyAgICAgICAgeV9sYWJlbCA9PiAnWUxhYmxlJywKICAgICAgICB0aXRsZSA9PiAkUGFyYW17VGl0bGV9LAoKICAgICAgICAjICAgICAgICB5X21heF92YWx1ZSA9PiAyMCwKICAgICAgICAjICAgICAgICB5X3RpY2tfbnVtYmVyID0+IDE2LAogICAgICAgICMgICAgICAgIHlfbGFiZWxfc2tpcCA9PiA0LAogICAgICAgICMgICAgICAgIHhfdGlja19udW1iZXIgPT4gOCwKICAgICAgICB0X21hcmdpbiAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjp0X21hcmdpbicpICAgIHx8IDEwLAogICAgICAgIGJfbWFyZ2luICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6R3JhcGg6OmJfbWFyZ2luJykgICAgfHwgMTAsCiAgICAgICAgbF9tYXJnaW4gICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpHcmFwaDo6bF9tYXJnaW4nKSAgICB8fCAxMCwKICAgICAgICByX21hcmdpbiAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjpyX21hcmdpbicpICAgIHx8IDIwLAogICAgICAgIGJnY2xyICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6R3JhcGg6OmJnY2xyJykgICAgICAgfHwgJ3doaXRlJywKICAgICAgICB0cmFuc3BhcmVudCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjp0cmFuc3BhcmVudCcpIHx8IDAsCiAgICAgICAgaW50ZXJsYWNlZCAgPT4gMSwKICAgICAgICBmZ2NsciAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjpmZ2NscicpICAgICAgIHx8ICdibGFjaycsCiAgICAgICAgYm94Y2xyICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpHcmFwaDo6Ym94Y2xyJykgICAgICB8fCAnd2hpdGUnLAogICAgICAgIGFjY2VudGNsciAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6R3JhcGg6OmFjY2VudGNscicpICAgfHwgJ2JsYWNrJywKICAgICAgICBzaGFkb3djbHIgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjpzaGFkb3djbHInKSAgIHx8ICdibGFjaycsCiAgICAgICAgbGVnZW5kY2xyICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpHcmFwaDo6bGVnZW5kY2xyJykgICB8fCAnYmxhY2snLAogICAgICAgIHRleHRjbHIgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6R3JhcGg6OnRleHRjbHInKSAgICAgfHwgJ2JsYWNrJywKICAgICAgICBkY2xycyAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjpkY2xycycpCiAgICAgICAgICAgIHx8IFsKICAgICAgICAgICAgcXcocmVkIGdyZWVuIGJsdWUgeWVsbG93IGJsYWNrIHB1cnBsZSBvcmFuZ2UgcGluayBtYXJpbmUgY3lhbiBsZ3JheSBsYmx1ZSBseWVsbG93IGxncmVlbiBscmVkIGxwdXJwbGUgbG9yYW5nZSBsYnJvd24pCiAgICAgICAgICAgIF0sCiAgICAgICAgeF90aWNrX29mZnNldCAgICAgICA9PiAwLAogICAgICAgIHhfbGFiZWxfcG9zaXRpb24gICAgPT4gMSAvIDIsCiAgICAgICAgeV9sYWJlbF9wb3NpdGlvbiAgICA9PiAxIC8gMiwKICAgICAgICB4X2xhYmVsc192ZXJ0aWNhbCAgID0+IDMxLAogICAgICAgIGxpbmVfd2lkdGggICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N0YXRzOjpHcmFwaDo6bGluZV93aWR0aCcpIHx8IDEsCiAgICAgICAgbGVnZW5kX3BsYWNlbWVudCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjpsZWdlbmRfcGxhY2VtZW50JykgfHwgJ0JDJywKICAgICAgICBsZWdlbmRfc3BhY2luZyAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6R3JhcGg6OmxlZ2VuZF9zcGFjaW5nJykgfHwgNCwKICAgICAgICBsZWdlbmRfbWFya2VyX3dpZHRoID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6R3JhcGg6OmxlZ2VuZF9tYXJrZXJfd2lkdGgnKQogICAgICAgICAgICB8fCAxMiwKICAgICAgICBsZWdlbmRfbWFya2VyX2hlaWdodCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkdyYXBoOjpsZWdlbmRfbWFya2VyX2hlaWdodCcpCiAgICAgICAgICAgIHx8IDgsCiAgICApOwoKICAgICMgc2V0IGxlZ2VuZCAoeS1saW5lKQogICAgaWYgKCAkUGFyYW17Rm9ybWF0fSBuZSAnR0Q6OkdyYXBoOjpwaWUnICkgewogICAgICAgICRncmFwaC0+c2V0X2xlZ2VuZChAWUxpbmUpOwogICAgfQoKICAgICMgaW52ZXN0aWdhdGUgdGhlIHBvc3NpYmxlIG91dHB1dCB0eXBlcwogICAgbXkgQE91dHB1dFR5cGVMaXN0ID0gJGdyYXBoLT5leHBvcnRfZm9ybWF0KCk7CgogICAgIyB0cmFuc2ZlciBhcnJheSB0byBoYXNoCiAgICBteSAlT3V0cHV0VHlwZXM7CiAgICBmb3IgbXkgJE91dHB1dFR5cGUgKEBPdXRwdXRUeXBlTGlzdCkgewogICAgICAgICRPdXRwdXRUeXBlc3skT3V0cHV0VHlwZX0gPSAxOwogICAgfQoKICAgICMgc2VsZWN0IG91dHB1dCB0eXBlCiAgICBteSAkRXh0OwogICAgaWYgKCAkT3V0cHV0VHlwZXN7J3BuZyd9ICkgewogICAgICAgICRFeHQgPSAncG5nJzsKICAgIH0KICAgIGVsc2lmICggJE91dHB1dFR5cGVzeydnaWYnfSApIHsKICAgICAgICAkRXh0ID0gJ2dpZic7CiAgICB9CiAgICBlbHNpZiAoICRPdXRwdXRUeXBlc3snanBlZyd9ICkgewogICAgICAgICRFeHQgPSAnanBlZyc7CiAgICB9CgogICAgIyBlcnJvciBoYW5kbGluZwogICAgaWYgKCAhJEV4dCApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJUaGUgc3VwcG9ydCBvZiBwbmcsIGpwZWcgYW5kIGdpZiBvdXRwdXQgaXMgbm90IGFjdGl2YXRlZCBpbiB0aGUgR0QgQ1BBTiBtb2R1bGUhIiwKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjcmVhdGUgZ3JhcGgKICAgIG15ICRDb250ZW50ID0gZXZhbCB7ICRncmFwaC0+cGxvdCggXEBQRGF0YSApLT4kRXh0KCkgfTsKCiAgICByZXR1cm4gJENvbnRlbnQ7Cn0KCj1pdGVtIENvbXBsZXRlbmVzc0NoZWNrKCkKCiAgICBteSBATm90aWZ5ID0gJFN0YXRzT2JqZWN0LT5Db21wbGV0ZW5lc3NDaGVjaygKICAgICAgICBTdGF0RGF0YSA9PiBcJVN0YXREYXRhLAogICAgICAgIFNlY3Rpb24gPT4gJ0FsbCcgfHwgJ1NwZWNpZmljYXRpb24nIHx8ICdWYWx1ZVNlcmllcycgfHwgJ1Jlc3RyaWN0aW9ucyB8fCBYYXhpcycKICAgICk7Cgo9Y3V0CgpzdWIgQ29tcGxldGVuZXNzQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBATm90aWZ5OwogICAgbXkgQE5vdGlmeVNlbGVjdGVkOwogICAgbXkgQEluZGV4QXJyYXk7CgogICAgJE5vdGlmeVswXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIGZpbGwgb3V0IHRoZSByZXF1aXJlZCBmaWVsZHMhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsxXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBhIGZpbGUhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsyXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBhbiBvYmplY3QhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVszXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBhIGdyYXBoIHNpemUhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVs0XSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnUGxlYXNlIHNlbGVjdCBvbmUgZWxlbWVudCBmb3IgdGhlIFgtYXhpcyEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzZdID0gewogICAgICAgIEluZm8gPT4KICAgICAgICAgICAgJ1BsZWFzZSBzZWxlY3Qgb25seSBvbmUgZWxlbWVudCBvciB0dXJuIG9mIHRoZSBidXR0b24gXCdGaXhlZFwnIHdoZXJlIHRoZSBzZWxlY3QgZmllbGQgaXMgbWFya2VkIScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbN10gPSB7CiAgICAgICAgSW5mbyAgICAgPT4gJ0lmIHlvdSB1c2UgYSBjaGVja2JveCB5b3UgaGF2ZSB0byBzZWxlY3Qgc29tZSBhdHRyaWJ1dGVzIG9mIHRoZSBzZWxlY3QgZmllbGQhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVs4XSA9IHsKICAgICAgICBJbmZvID0+CiAgICAgICAgICAgICdQbGVhc2UgaW5zZXJ0IGEgdmFsdWUgaW4gdGhlIHNlbGVjdGVkIGlucHV0IGZpZWxkIG9yIHR1cm4gb2ZmIHRoZSBcJ0ZpeGVkXCcgY2hlY2tib3ghJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVs5XSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnVGhlIHNlbGVjdGVkIGVuZCB0aW1lIGlzIGJlZm9yZSB0aGUgc3RhcnQgdGltZSEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzEwXSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnWW91IGhhdmUgdG8gc2VsZWN0IG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgc2VsZWN0IGZpZWxkIScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbMTFdID0gewogICAgICAgIEluZm8gICAgID0+ICdUaGUgc2VsZWN0ZWQgRGF0ZSBpc25cJ3QgdmFsaWQhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsxMl0gPSB7CiAgICAgICAgSW5mbyAgICAgPT4gJ1BsZWFzZSBzZWxlY3Qgb25seSBvbmUgb3IgdHdvIGVsZW1lbnRzIHZpYSB0aGUgY2hlY2tib3ghJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsxM10gPSB7CiAgICAgICAgSW5mbyAgICAgPT4gJ0lmIHlvdSB1c2UgYSB0aW1lIHNjYWxlIGVsZW1lbnQgeW91IGNhbiBvbmx5IHNlbGVjdCBvbmUgZWxlbWVudCEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzE0XSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnWW91IGhhdmUgYW4gZXJyb3IgaW4geW91ciB0aW1lIHNlbGVjdGlvbiEnLAogICAgICAgIFByaW9yaXR5ID0+ICdFcnJvcicKICAgIH07CiAgICAkTm90aWZ5WzE1XSA9IHsKICAgICAgICBJbmZvICAgICA9PiAnWW91ciByZXBvcnRpbmcgdGltZSBpbnRlcnZhbCBpcyB0byBzbWFsbCwgcGxlYXNlIHVzZSBhIGxhcmdlciB0aW1lIHNjYWxlIScsCiAgICAgICAgUHJpb3JpdHkgPT4gJ0Vycm9yJwogICAgfTsKICAgICROb3RpZnlbMTZdID0gewogICAgICAgIEluZm8gICAgID0+ICdUaGVyZSBpcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB5b3VyIHRpbWUgc2NhbGUgc2VsZWN0aW9uLiBQbGVhc2UgY2hlY2sgaXQhJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwogICAgJE5vdGlmeVsxN10gPSB7CiAgICAgICAgSW5mbyAgICAgPT4gJ1lvdSBoYXZlIHRvIHNlbGVjdCBhIHRpbWUgc2NhbGUgbGlrZSBkYXkgb3IgbW9udGghJywKICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InCiAgICB9OwoKICAgICMgY2hlY2sgaWYgbmVlZCBwYXJhbXMgYXJlIGF2YWlsYWJsZQogICAgTkVFRDoKICAgIGZvciBteSAkTmVlZCAocXcoU3RhdERhdGEgU2VjdGlvbikpIHsKICAgICAgICBuZXh0IE5FRUQgaWYgJFBhcmFteyROZWVkfTsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWQiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJVN0YXREYXRhID0gJXsgJFBhcmFte1N0YXREYXRhfSB9OwogICAgaWYgKCAkUGFyYW17U2VjdGlvbn0gZXEgJ1NwZWNpZmljYXRpb24nIHx8ICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyApIHsKICAgICAgICBmb3IgKHF3KFRpdGxlIERlc2NyaXB0aW9uIFN0YXRUeXBlIFBlcm1pc3Npb24gRm9ybWF0IE9iamVjdE1vZHVsZSkpIHsKICAgICAgICAgICAgaWYgKCAhJFN0YXREYXRheyRffSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDA7CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJFN0YXREYXRhe1N0YXRUeXBlfSAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdzdGF0aWMnICYmICEkU3RhdERhdGF7RmlsZX0gKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDE7CiAgICAgICAgfQogICAgICAgIGlmICggJFN0YXREYXRhe1N0YXRUeXBlfSAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdkeW5hbWljJyAmJiAhJFN0YXREYXRhe09iamVjdH0gKSB7CiAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDI7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtTdGF0RGF0YX17R3JhcGhTaXplfSAmJiAkUGFyYW17U3RhdERhdGF9e0Zvcm1hdH0gKSB7CiAgICAgICAgICAgIGZvciAoIEB7ICRTdGF0RGF0YXtGb3JtYXR9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRfID1+IG17XkdEOjpHcmFwaFwuKn14ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDM7CiAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGZvciBmb3JtIGNhbGxzCiAgICBpZiAoICRTdGF0RGF0YXtTdGF0VHlwZX0gJiYgJFN0YXREYXRhe1N0YXRUeXBlfSBlcSAnZHluYW1pYycgKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAoICRQYXJhbXtTZWN0aW9ufSBlcSAnWGF4aXMnIHx8ICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyApCiAgICAgICAgICAgICYmICRTdGF0RGF0YXtTdGF0VHlwZX0gZXEgJ2R5bmFtaWMnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15ICRGbGFnID0gMDsKICAgICAgICAgICAgWFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJFh2YWx1ZSAoIEB7ICRTdGF0RGF0YXtVc2VBc1h2YWx1ZX0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgWFZBTFVFIGlmICEkWHZhbHVlLT57U2VsZWN0ZWR9OwoKICAgICAgICAgICAgICAgIGlmICggJFh2YWx1ZS0+e0Jsb2NrfSBlcSAnVGltZScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkWHZhbHVlLT57VGltZVN0YXJ0fSAmJiAkWHZhbHVlLT57VGltZVN0b3B9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFh2YWx1ZS0+e1RpbWVTdGFydH0KICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFRpbWVTdG9wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFh2YWx1ZS0+e1RpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGltZVN0YXJ0IHx8ICEkVGltZVN0b3AgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgWFZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFRpbWVTdGFydCA+ICRUaW1lU3RvcCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFhWQUxVRTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkWHZhbHVlLT57VGltZVJlbGF0aXZlVW5pdH0gfHwgISRYdmFsdWUtPntUaW1lUmVsYXRpdmVDb3VudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgWFZBTFVFOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFh2YWx1ZS0+e1NlbGVjdGVkVmFsdWVzfVswXSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJFh2YWx1ZS0+e0ZpeGVkfSAmJiAkI3sgJFh2YWx1ZS0+e1NlbGVjdGVkVmFsdWVzfSB9ID4gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEZsYWcgPSAxOwogICAgICAgICAgICAgICAgbGFzdCBYVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEZsYWcgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgKICAgICAgICAgICAgKCAkUGFyYW17U2VjdGlvbn0gZXEgJ1ZhbHVlU2VyaWVzJyB8fCAkUGFyYW17U2VjdGlvbn0gZXEgJ0FsbCcgKQogICAgICAgICAgICAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdkeW5hbWljJwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIG15ICRGbGFnICAgID0gMDsKICAgICAgICAgICAgVkFMVUVTRVJJRVM6CiAgICAgICAgICAgIGZvciBteSAkVmFsdWVTZXJpZXMgKCBAeyAkU3RhdERhdGF7VXNlQXNWYWx1ZVNlcmllc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUVTRVJJRVMgaWYgISRWYWx1ZVNlcmllcy0+e1NlbGVjdGVkfTsKCiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgJFZhbHVlU2VyaWVzLT57QmxvY2t9IGVxICdUaW1lJwogICAgICAgICAgICAgICAgICAgIHx8ICRWYWx1ZVNlcmllcy0+e0Jsb2NrfSBlcSAnVGltZUV4dGVuZGVkJwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZVNlcmllcy0+e0ZpeGVkfSAmJiAkI3sgJFZhbHVlU2VyaWVzLT57U2VsZWN0ZWRWYWx1ZXN9IH0gPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA2OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkVmFsdWVTZXJpZXMtPntTZWxlY3RlZFZhbHVlc31bMF0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRGbGFnID0gMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJENvdW50ZXIgPiAxICYmICRGbGFnICkgewogICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ291bnRlciA+IDIgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCAxMjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoCiAgICAgICAgICAgICggJFBhcmFte1NlY3Rpb259IGVxICdSZXN0cmljdGlvbnMnIHx8ICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyApCiAgICAgICAgICAgICYmICRTdGF0RGF0YXtTdGF0VHlwZX0gZXEgJ2R5bmFtaWMnCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIFJFU1RSSUNUSU9OOgogICAgICAgICAgICBmb3IgbXkgJFJlc3RyaWN0aW9uICggQHsgJFN0YXREYXRhe1VzZUFzUmVzdHJpY3Rpb259IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFJFU1RSSUNUSU9OIGlmICEkUmVzdHJpY3Rpb24tPntTZWxlY3RlZH07CgogICAgICAgICAgICAgICAgaWYgKCAkUmVzdHJpY3Rpb24tPntCbG9ja30gZXEgJ1NlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRSZXN0cmljdGlvbi0+e0ZpeGVkfSAmJiAkI3sgJFJlc3RyaWN0aW9uLT57U2VsZWN0ZWRWYWx1ZXN9IH0gPiAwICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA2OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFJFU1RSSUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkUmVzdHJpY3Rpb24tPntTZWxlY3RlZFZhbHVlc31bMF0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDc7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVTVFJJQ1RJT047CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICRSZXN0cmljdGlvbi0+e0Jsb2NrfSBlcSAnSW5wdXRGaWVsZCcKICAgICAgICAgICAgICAgICAgICAmJiAhJFJlc3RyaWN0aW9uLT57U2VsZWN0ZWRWYWx1ZXN9WzBdCiAgICAgICAgICAgICAgICAgICAgJiYgJFJlc3RyaWN0aW9uLT57Rml4ZWR9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQEluZGV4QXJyYXksIDg7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBSRVNUUklDVElPTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAkUmVzdHJpY3Rpb24tPntCbG9ja30gZXEgJ1RpbWUnCiAgICAgICAgICAgICAgICAgICAgfHwgJFJlc3RyaWN0aW9uLT57QmxvY2t9IGVxICdUaW1lRXh0ZW5kZWQnCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggJFJlc3RyaWN0aW9uLT57VGltZVN0YXJ0fSAmJiAkUmVzdHJpY3Rpb24tPntUaW1lU3RvcH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUaW1lU3RhcnQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkUmVzdHJpY3Rpb24tPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUaW1lU3RvcCA9ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRSZXN0cmljdGlvbi0+e1RpbWVTdG9wfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkVGltZVN0YXJ0IHx8ICEkVGltZVN0b3AgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCAxMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVTVFJJQ1RJT047CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkVGltZVN0YXJ0ID4gJFRpbWVTdG9wICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgOTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgUkVTVFJJQ1RJT047CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAhJFJlc3RyaWN0aW9uLT57VGltZVJlbGF0aXZlVW5pdH0KICAgICAgICAgICAgICAgICAgICAgICAgfHwgISRSZXN0cmljdGlvbi0+e1RpbWVSZWxhdGl2ZUNvdW50fQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBJbmRleEFycmF5LCA5OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0IFJFU1RSSUNUSU9OOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiB0aGUgdGltZXBlcmlvZCBpcyB0byBiaWcgb3IgdGhlIHRpbWUgc2NhbGUgdG8gc21hbGwKICAgICAgICAjIHVzZWQgb25seSBmb3IgZml4ZWQgdGltZSB2YWx1ZXMKICAgICAgICAjIHJlbWFyayB0aW1lIGZ1bmN0aW9ucyBzaG91bGQgYmUgZXhwb3J0ZXQgaW4gZXh0ZXJuYWwgZnVuY3Rpb25zICh0cikKICAgICAgICBpZiAoICRQYXJhbXtTZWN0aW9ufSBlcSAnQWxsJyAmJiAkU3RhdERhdGF7U3RhdFR5cGV9IGVxICdkeW5hbWljJyApIHsKICAgICAgICAgICAgbXkgJFN0YXQgPSAkU2VsZi0+U3RhdHNHZXQoIFN0YXRJRCA9PiAkU3RhdERhdGF7U3RhdElEfSApOwoKICAgICAgICAgICAgWFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJFh2YWx1ZSAoIEB7ICRTdGF0LT57VXNlQXNYdmFsdWV9IH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFhWQUxVRQogICAgICAgICAgICAgICAgICAgIGlmICEoICRYdmFsdWUtPntTZWxlY3RlZH0gJiYgJFh2YWx1ZS0+e0ZpeGVkfSAmJiAkWHZhbHVlLT57QmxvY2t9IGVxICdUaW1lJyApOwoKICAgICAgICAgICAgICAgIG15ICRGbGFnID0gMTsKICAgICAgICAgICAgICAgIFZBTFVFU0VSSUVTOgogICAgICAgICAgICAgICAgZm9yIG15ICRWYWx1ZVNlcmllcyAoIEB7ICRTdGF0LT57VXNlQXNWYWx1ZVNlcmllc30gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZVNlcmllcy0+e1NlbGVjdGVkfSAmJiAkVmFsdWVTZXJpZXMtPntCbG9ja30gZXEgJ1RpbWUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkRmxhZyA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgVkFMVUVTRVJJRVM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGxhc3QgWFZBTFVFIGlmICEkRmxhZzsKCiAgICAgICAgICAgICAgICBteSAkU2NhbGVQZXJpb2QgPSAwOwogICAgICAgICAgICAgICAgbXkgJFRpbWVQZXJpb2QgID0gMDsKCiAgICAgICAgICAgICAgICBteSAkQ291bnQgPSAkWHZhbHVlLT57VGltZVNjYWxlQ291bnR9ID8gJFh2YWx1ZS0+e1RpbWVTY2FsZUNvdW50fSA6IDE7CgogICAgICAgICAgICAgICAgbXkgJVRpbWVJblNlY29uZHMgPSAoCiAgICAgICAgICAgICAgICAgICAgWWVhciAgID0+IDMxNTM2MDAwLCAgICAjIDYwICogNjAgKiA2MCAqIDM2NQogICAgICAgICAgICAgICAgICAgIE1vbnRoICA9PiAyNTkyMDAwLCAgICAgIyA2MCAqIDYwICogMjQgKiAzMAogICAgICAgICAgICAgICAgICAgIERheSAgICA9PiA4NjQwMCwgICAgICAgIyA2MCAqIDYwICogMjQKICAgICAgICAgICAgICAgICAgICBIb3VyICAgPT4gMzYwMCwgICAgICAgICMgNjAgKiA2MAogICAgICAgICAgICAgICAgICAgIE1pbnV0ZSA9PiA2MCwKICAgICAgICAgICAgICAgICAgICBTZWNvbmQgPT4gMSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFNjYWxlUGVyaW9kID0gJFRpbWVJblNlY29uZHN7ICRYdmFsdWUtPntTZWxlY3RlZFZhbHVlc31bMF0gfTsKCiAgICAgICAgICAgICAgICBpZiAoICEkU2NhbGVQZXJpb2QgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTc7CiAgICAgICAgICAgICAgICAgICAgbGFzdCBYVkFMVUU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCAkWHZhbHVlLT57VGltZVN0b3B9ICYmICRYdmFsdWUtPntUaW1lU3RhcnR9ICkgewogICAgICAgICAgICAgICAgICAgICRUaW1lUGVyaW9kCiAgICAgICAgICAgICAgICAgICAgICAgID0gKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRYdmFsdWUtPntUaW1lU3RvcH0gKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIC0gKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRYdmFsdWUtPntUaW1lU3RhcnR9ICkKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRUaW1lUGVyaW9kID0gJFRpbWVJblNlY29uZHN7ICRYdmFsdWUtPntUaW1lUmVsYXRpdmVVbml0fSB9CiAgICAgICAgICAgICAgICAgICAgICAgICogJFh2YWx1ZS0+e1RpbWVSZWxhdGl2ZUNvdW50fTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkTWF4QXR0ciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6TWF4WGF4aXNBdHRyaWJ1dGVzJykgfHwgMTAwMDsKICAgICAgICAgICAgICAgIGlmICggJFRpbWVQZXJpb2QgLyAoICRTY2FsZVBlcmlvZCAqICRDb3VudCApID4gJE1heEF0dHIgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASW5kZXhBcnJheSwgMTU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGFzdCBYVkFMVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmb3IgKEBJbmRleEFycmF5KSB7CiAgICAgICAgcHVzaCBATm90aWZ5U2VsZWN0ZWQsICROb3RpZnlbJF9dOwogICAgfQoKICAgIHJldHVybiBATm90aWZ5U2VsZWN0ZWQ7Cgp9Cgo9aXRlbSBHZXRTdGF0c09iamVjdEF0dHJpYnV0ZXMoKQoKR2V0IGFsbCBhdHRyaWJ1dGVzIGZyb20gdGhlIG9iamVjdCBpbiBkZXBlbmRlbmNlIG9mIHRoZSB1c2UKCiAgICBteSAlT2JqZWN0QXR0cmlidXRlcyA9ICRTdGF0c09iamVjdC0+R2V0U3RhdHNPYmplY3RBdHRyaWJ1dGVzKAogICAgICAgIE9iamVjdE1vZHVsZSA9PiAnVGlja2V0JywKICAgICAgICBVc2UgICAgICAgICAgPT4gJ1VzZUFzWHZhbHVlJyB8fCAnVXNlQXNWYWx1ZVNlcmllcycgfHwgJ1VzZUFzUmVzdHJpY3Rpb24nLAogICAgKTsKCj1jdXQKCnN1YiBHZXRTdGF0c09iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciAocXcoT2JqZWN0TW9kdWxlIFVzZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkXyEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBsb2FkIG1vZHVsZQogICAgbXkgJE9iamVjdE1vZHVsZSA9ICRQYXJhbXtPYmplY3RNb2R1bGV9OwogICAgcmV0dXJuIGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRPYmplY3RNb2R1bGUpOwogICAgbXkgJFN0YXRPYmplY3QgPSAkT2JqZWN0TW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICByZXR1cm4gaWYgISRTdGF0T2JqZWN0OwoKICAgICMgbG9hZCBhdHRyaWJ1dGVzCiAgICBteSBAT2JqZWN0QXR0cmlidXRlc1JhdyA9ICRTdGF0T2JqZWN0LT5HZXRPYmplY3RBdHRyaWJ1dGVzKCk7CgogICAgIyBidWlsZCB0aGUgb2JqZWN0YXR0cmlidXRlIGFycmF5CiAgICBteSBAT2JqZWN0QXR0cmlidXRlczsKICAgIGZvciBteSAkSGFzaFJlZiAoQE9iamVjdEF0dHJpYnV0ZXNSYXcpIHsKICAgICAgICBpZiAoICRIYXNoUmVmLT57ICRQYXJhbXtVc2V9IH0gKSB7CiAgICAgICAgICAgIGRlbGV0ZSAkSGFzaFJlZi0+e1VzZUFzWHZhbHVlfTsKICAgICAgICAgICAgZGVsZXRlICRIYXNoUmVmLT57VXNlQXNWYWx1ZVNlcmllc307CiAgICAgICAgICAgIGRlbGV0ZSAkSGFzaFJlZi0+e1VzZUFzUmVzdHJpY3Rpb259OwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgJEhhc2hSZWY7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKPWl0ZW0gR2V0U3RhdGljRmlsZXMoKQoKR2V0IGFsbCBzdGF0aWMgZmlsZXMKCiAgICBteSAkRmlsZUhhc2ggPSAkU3RhdHNPYmplY3QtPkdldFN0YXRpY0ZpbGVzKAogICAgICAgIE9ubHlVbnVzZWRGaWxlcyA9PiAxIHwgMCwgIyBvcHRpb25hbCBkZWZhdWx0IDAKICAgICk7Cgo9Y3V0CgpzdWIgR2V0U3RhdGljRmlsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRGlyZWN0b3J5ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKICAgIGlmICggJERpcmVjdG9yeSAhfiBte14uKlwvJH14ICkgewogICAgICAgICREaXJlY3RvcnkgLj0gJy8nOwogICAgfQogICAgJERpcmVjdG9yeSAuPSAnS2VybmVsL1N5c3RlbS9TdGF0cy9TdGF0aWMvJzsKCiAgICBpZiAoICFvcGVuZGlyKCBESVIsICREaXJlY3RvcnkgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbiBub3Qgb3BlbiBEaXJlY3Rvcnk6ICREaXJlY3RvcnkiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICgpOwogICAgfQoKICAgIG15ICVTdGF0aWNGaWxlczsKICAgIGlmICggJFBhcmFte09ubHlVbnVzZWRGaWxlc30gKSB7CgogICAgICAgICMgZ2V0IGFsbCBTdGF0cyBmcm9tIHRoZSBkYgogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+R2V0U3RhdHNMaXN0KCk7CgogICAgICAgIGlmICggZGVmaW5lZCAkUmVzdWx0ICkgewogICAgICAgICAgICBmb3IgbXkgJFN0YXRJRCAoIEB7JFJlc3VsdH0gKSB7CiAgICAgICAgICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT5TdGF0c0dldCggU3RhdElEID0+ICRTdGF0SUQgKTsKCiAgICAgICAgICAgICAgICAjIGNoZWNrIHdpdGNoIG9uZSBhcmUgc3RhdGljIHN0YXRpc3RpY3MKICAgICAgICAgICAgICAgIGlmICggJERhdGEtPntGaWxlfSAmJiAkRGF0YS0+e1N0YXRUeXBlfSBlcSAnc3RhdGljJyApIHsKICAgICAgICAgICAgICAgICAgICAkU3RhdGljRmlsZXN7ICREYXRhLT57RmlsZX0gfSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZWFkIGZpbGVzCiAgICBteSAlRmlsZWxpc3Q7CiAgICB3aGlsZSAoIGRlZmluZWQoIG15ICRGaWxlbmFtZSA9IHJlYWRkaXIgRElSICkgKSB7CiAgICAgICAgbmV4dCBpZiAkRmlsZW5hbWUgZXEgJy4nOwogICAgICAgIG5leHQgaWYgJEZpbGVuYW1lIGVxICcuLic7CiAgICAgICAgaWYgKCAkRmlsZW5hbWUgPX4gbXteKC4qKVwucG0kfXggKSB7CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJFN0YXRpY0ZpbGVzeyQxfSApIHsKICAgICAgICAgICAgICAgICRGaWxlbGlzdHskMX0gPSAkMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNsb3NlZGlyKERJUik7CgogICAgIyBLSVhDb3JlLWNhcGVJVAogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgaWYgKCAkSG9tZSAhfiBte14uKlwvJH14ICkgewogICAgICAgICRIb21lIC49ICcvJzsKICAgIH0KICAgIG15IEBLSVhQYWNrYWdlcyA9ICRTZWxmLT57S0lYVXRpbHNPYmplY3R9LT5HZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoIFJlc3VsdCA9PiAnQVJSQVknICk7CiAgICBmb3IgbXkgJEN1cnJQcmVmaXggKEBLSVhQYWNrYWdlcykgewogICAgICAgICREaXJlY3RvcnkgPSAkSG9tZSAuICRDdXJyUHJlZml4IC4gJy9LZXJuZWwvU3lzdGVtL1N0YXRzL1N0YXRpYy8nOwogICAgICAgIG5leHQgaWYgIW9wZW5kaXIoIERJUiwgJERpcmVjdG9yeSApOwoKICAgICAgICAjIHJlYWQgZmlsZXMKICAgICAgICB3aGlsZSAoIGRlZmluZWQoIG15ICRGaWxlbmFtZSA9IHJlYWRkaXIgRElSICkgKSB7CiAgICAgICAgICAgIG5leHQgaWYgJEZpbGVuYW1lIGVxICcuJzsKICAgICAgICAgICAgbmV4dCBpZiAkRmlsZW5hbWUgZXEgJy4uJzsKICAgICAgICAgICAgbmV4dCBpZiAkRmlsZW5hbWUgIX4gbXteKC4qKVwucG0kfXg7CiAgICAgICAgICAgIG5leHQgaWYgZGVmaW5lZCAkU3RhdGljRmlsZXN7JDF9OwoKICAgICAgICAgICAgJEZpbGVsaXN0eyQxfSA9ICQxOwogICAgICAgIH0KICAgICAgICBjbG9zZWRpcihESVIpOwogICAgfQoKICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICByZXR1cm4gXCVGaWxlbGlzdDsKfQoKPWl0ZW0gR2V0RHluYW1pY0ZpbGVzKCkKCkdldCBhbGwgc3RhdGljIG9iamVjdHMKCiAgICBteSAkRmlsZUhhc2ggPSAkU3RhdHNPYmplY3QtPkdldER5bmFtaWNGaWxlcygpOwoKPWN1dAoKc3ViIEdldER5bmFtaWNGaWxlcyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICVGaWxlbGlzdCA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbicpIH07CiAgICBPQkpFQ1Q6CiAgICBmb3IgbXkgJE9iamVjdCAoIGtleXMgJUZpbGVsaXN0ICkgewogICAgICAgIGlmICggISRGaWxlbGlzdHskT2JqZWN0fSApIHsKICAgICAgICAgICAgZGVsZXRlICRGaWxlbGlzdHskT2JqZWN0fTsKICAgICAgICAgICAgbmV4dCBPQkpFQ1Q7CiAgICAgICAgfQogICAgICAgICRGaWxlbGlzdHskT2JqZWN0fSA9ICRTZWxmLT5HZXRPYmplY3ROYW1lKAogICAgICAgICAgICBPYmplY3RNb2R1bGUgPT4gJEZpbGVsaXN0eyRPYmplY3R9e01vZHVsZX0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBpZiAhJUZpbGVsaXN0OwoKICAgIHJldHVybiBcJUZpbGVsaXN0Owp9Cgo9aXRlbSBHZXRPYmplY3ROYW1lKCkKCkdldCB0aGUgbmFtZSBvZiBhIGR5bmFtaWMgb2JqZWN0CgogICAgbXkgJE9iamVjdE5hbWUgPSAkU3RhdHNPYmplY3QtPkdldE9iamVjdE5hbWUoCiAgICAgICAgT2JqZWN0TW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OlRpY2tldExpc3QnLAogICAgKTsKCj1jdXQKCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkTW9kdWxlID0gJFBhcmFte09iamVjdE1vZHVsZX07CgogICAgIyBjaGVjayBpZiBpdCBpcyBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+eydDYWNoZTo6T2JqZWN0TW9kdWxlJ30tPnskTW9kdWxlfSBpZiAkU2VsZi0+eydDYWNoZTo6T2JqZWN0TmFtZSd9LT57JE1vZHVsZX07CgogICAgIyBsb2FkIG1vZHVsZSwgcmV0dXJuIGlmIG1vZHVsZSBkb2VzIG5vdCBleGlzdAogICAgIyAodGhpcyBpcyBpbXBvcnRhbnQgd2hlbiBzdGF0cyBhcmUgdW5pbnN0YWxsZWQsIHNlZSBhbHNvIGJ1ZyMgNDI2OSkKICAgIHJldHVybiBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkTW9kdWxlKTsKCiAgICAjIGdldCBuYW1lCiAgICBteSAkU3RhdE9iamVjdCA9ICRNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgIHJldHVybiBpZiAhJFN0YXRPYmplY3Q7CiAgICBteSAkTmFtZSA9ICRTdGF0T2JqZWN0LT5HZXRPYmplY3ROYW1lKCk7CgogICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAkU2VsZi0+eydDYWNoZTo6T2JqZWN0TW9kdWxlJ30tPnskTW9kdWxlfSA9ICROYW1lOwoKICAgIHJldHVybiAkTmFtZTsKfQoKPWl0ZW0gT2JqZWN0RmlsZUNoZWNrKCkKCmNoZWNrIHJlYWRhYmxlIG9iamVjdCBmaWxlCgogICAgbXkgJE9iamVjdEZpbGVDaGVjayA9ICRTdGF0c09iamVjdC0+T2JqZWN0RmlsZUNoZWNrKAogICAgICAgIFR5cGUgPT4gJ3N0YXRpYycsCiAgICAgICAgTmFtZSA9PiAnTmV3VGlja2V0cycsCiAgICApOwoKPWN1dAoKc3ViIE9iamVjdEZpbGVDaGVjayB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICREaXJlY3RvcnkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgaWYgKCAkRGlyZWN0b3J5ICF+IG17Xi4qXC8kfXggKSB7CiAgICAgICAgJERpcmVjdG9yeSAuPSAnLyc7CiAgICB9CiAgICBpZiAoICRQYXJhbXtUeXBlfSBlcSAnc3RhdGljJyApIHsKICAgICAgICAkRGlyZWN0b3J5IC49ICdLZXJuZWwvU3lzdGVtL1N0YXRzL1N0YXRpYy8nIC4gJFBhcmFte05hbWV9IC4gJy5wbSc7CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtUeXBlfSBlcSAnZHluYW1pYycgKSB7CiAgICAgICAgJERpcmVjdG9yeSAuPSAnS2VybmVsL1N5c3RlbS9TdGF0cy9EeW5hbWljLycgLiAkUGFyYW17TmFtZX0gLiAnLnBtJzsKICAgIH0KCiAgICByZXR1cm4gMSBpZiAtciAkRGlyZWN0b3J5OwogICAgcmV0dXJuOwp9Cgo9aXRlbSBFeHBvcnQoKQoKZ2V0IGNvbnRlbnQgZnJvbSBzdGF0cyBmb3IgZXhwb3J0CgogICAgbXkgJEV4cG9ydEZpbGUgPSAkU3RhdHNPYmplY3QtPkV4cG9ydCgKICAgICAgICBTdGF0SUQgPT4gJzEyMycsCiAgICAgICAgRXhwb3J0U3RhdE51bWJlciA9PiAxIHx8IDAsICMgb3B0aW9uYWwsIG9ubHkgdXNlZnVsIG1vdmUgc3RhdGlzdGljcyBmcm9tIHRoZSB0ZXN0IHN5c3RlbSB0byB0aGUgcHJvZHVjdGl2ZSBzeXN0ZW0KICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1N0YXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdFeHBvcnQ6IE5lZWQgU3RhdElEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaEdldCgKICAgICAgICBUeXBlID0+ICdTdGF0cycsCgogICAgICAgICNDYWNoZSA9PiAwLAogICAgICAgIEtleSA9PiAkUGFyYW17U3RhdElEfQogICAgKTsKICAgIG15ICRTdGF0c1hNTCA9ICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c30tPlsxXTsKCiAgICBteSAlRmlsZTsKICAgICRGaWxle0ZpbGVuYW1lfSA9ICRTZWxmLT5TdHJpbmdBbmRUaW1lc3RhbXAyRmlsZW5hbWUoCiAgICAgICAgU3RyaW5nID0+ICRTdGF0c1hNTC0+e1RpdGxlfS0+WzFdLT57Q29udGVudH0sCiAgICApOwogICAgJEZpbGV7RmlsZW5hbWV9IC49ICcueG1sJzsKCiAgICAjIHNldHRpbmdzIGZvciBzdGF0aWMgZmlsZXMKICAgIGlmICgKICAgICAgICAkU3RhdHNYTUwtPntTdGF0VHlwZX0tPlsxXS0+e0NvbnRlbnR9CiAgICAgICAgJiYgJFN0YXRzWE1MLT57U3RhdFR5cGV9LT5bMV0tPntDb250ZW50fSBlcSAnc3RhdGljJwogICAgICAgICkKICAgIHsKICAgICAgICBteSAkRmlsZUxvY2F0aW9uID0gJFN0YXRzWE1MLT57T2JqZWN0TW9kdWxlfS0+WzFdLT57Q29udGVudH07CiAgICAgICAgJEZpbGVMb2NhdGlvbiA9fiBzezo6fXtcL314ZzsKICAgICAgICAkRmlsZUxvY2F0aW9uIC49ICcucG0nOwoKICAgICAgICAjIEtJWENvcmUtY2FwZUlUCiAgICAgICAgI215ICRGaWxlICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAiLyRGaWxlTG9jYXRpb24iOwogICAgICAgIG15ICRGaWxlID0gJyc7CiAgICAgICAgbXkgJEhvbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpOwogICAgICAgIGlmICggJEhvbWUgIX4gbXteLipcLyR9eCApIHsKICAgICAgICAgICAkSG9tZSAuPSAnLyc7CiAgICAgICAgfQogICAgICAgIG15IEBLSVhQYWNrYWdlcyA9ICRTZWxmLT57S0lYVXRpbHNPYmplY3R9LT5HZXRSZWdpc3RlcmVkQ3VzdG9tUGFja2FnZXMoIFJlc3VsdCA9PiAnQVJSQVknICk7CiAgICAgICAgZm9yIG15ICRDdXJyUHJlZml4IChAS0lYUGFja2FnZXMpIHsKICAgICAgICAgICAgJEZpbGUgPSAkSG9tZSAuICRDdXJyUHJlZml4IC4gJy8nIC4gJEZpbGVMb2NhdGlvbjsKICAgICAgICAgICAgaWYgKCAtZSAkRmlsZSApIHsKICAgICAgICAgICAgICAgICRGaWxlTG9jYXRpb24gPSAkQ3VyclByZWZpeCAuICcvJyAuICRGaWxlTG9jYXRpb247CiAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEVPIEtJWENvcmUtY2FwZUlUCgogICAgICAgIG15ICRGaWxlQ29udGVudCA9ICcnOwogICAgICAgIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgJEZpbGUgb3IgZGllICJDYW4ndCBvcGVuOiAkRmlsZTogJCEiOwoKICAgICAgICAjIHNldCBiaW4gbW9kZQogICAgICAgIGJpbm1vZGUgJEZpbGVoYW5kbGU7CiAgICAgICAgd2hpbGUgKDwkRmlsZWhhbmRsZT4pIHsKICAgICAgICAgICAgJEZpbGVDb250ZW50IC49ICRfOwogICAgICAgIH0KICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVJbnB1dCggXCRGaWxlQ29udGVudCApOwogICAgICAgICRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntGaWxlfSAgICAgICA9ICRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntDb250ZW50fTsKICAgICAgICAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57Q29udGVudH0gICAgPSBlbmNvZGVfYmFzZTY0KCAkRmlsZUNvbnRlbnQsICcnICk7CiAgICAgICAgJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0xvY2F0aW9ufSAgID0gJEZpbGVMb2NhdGlvbjsKICAgICAgICAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57UGVybWlzc2lvbn0gPSAnNjQ0JzsKICAgICAgICAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57RW5jb2RlfSAgICAgPSAnQmFzZTY0JzsKICAgIH0KCiAgICAjIGRlbGV0ZSBjcmVhdGUgYW5kIGNoYW5nZSBkYXRhCiAgICBmb3IgbXkgJEtleSAocXcoQ2hhbmdlZCBDaGFuZ2VkQnkgQ3JlYXRlZCBDcmVhdGVkQnkgU3RhdElEKSkgewogICAgICAgIGRlbGV0ZSAkU3RhdHNYTUwtPnskS2V5fTsKICAgIH0KICAgIGlmICggISRQYXJhbXtFeHBvcnRTdGF0TnVtYmVyfSApIHsKICAgICAgICBkZWxldGUgJFN0YXRzWE1MLT57U3RhdE51bWJlcn07CiAgICB9CgogICAgIyB3cmFwcGVyIHRvIGNoYW5nZSBpZHMgaW4gdXNlZCBzcGVsbGluZwogICAgIyB3cmFwIHBlcm1pc3Npb25zCiAgICBmb3IgbXkgJElEICggQHsgJFN0YXRzWE1MLT57UGVybWlzc2lvbn0gfSApIHsKICAgICAgICBuZXh0IGlmICEkSUQ7CiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoIEdyb3VwSUQgPT4gJElELT57Q29udGVudH0gKTsKICAgICAgICBuZXh0IGlmICEkTmFtZTsKICAgICAgICAkSUQtPntDb250ZW50fSA9ICROYW1lOwogICAgfQoKICAgICMgd3JhcCBvYmplY3QgZGVwZW5kZW5kIGlkcwogICAgaWYgKCAkU3RhdHNYTUwtPntPYmplY3R9LT5bMV0tPntDb250ZW50fSApIHsKCiAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgIG15ICRPYmplY3RNb2R1bGUgPSAkU3RhdHNYTUwtPntPYmplY3RNb2R1bGV9LT5bMV0tPntDb250ZW50fTsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJE9iamVjdE1vZHVsZSk7CiAgICAgICAgbXkgJFN0YXRPYmplY3QgPSAkT2JqZWN0TW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgcmV0dXJuIGlmICEkU3RhdE9iamVjdDsKCiAgICAgICAgIyBsb2FkIGF0dHJpYnV0ZXMKICAgICAgICAkU3RhdHNYTUwgPSAkU3RhdE9iamVjdC0+RXhwb3J0V3JhcHBlcigKICAgICAgICAgICAgJXskU3RhdHNYTUx9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjb252ZXJ0IGhhc2ggdG8gc3RyaW5nCiAgICAkRmlsZXtDb250ZW50fSA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaDJYTUwoCiAgICAgICAgewogICAgICAgICAgICBvdHJzX3N0YXRzID0+IFsKICAgICAgICAgICAgICAgIHVuZGVmLAogICAgICAgICAgICAgICAgJFN0YXRzWE1MLAogICAgICAgICAgICBdLAogICAgICAgIH0sCiAgICApOwoKICAgIHJldHVybiBcJUZpbGU7Cn0KCj1pdGVtIEltcG9ydCgpCgppbXBvcnQgYSBzdGF0cyBmcm9tIHhtbCBmaWxlCgogICAgbXkgJFN0YXRJRCA9ICRTdGF0c09iamVjdC0+SW1wb3J0KAogICAgICAgIENvbnRlbnQgPT4gJFVwbG9hZFN0dWZme0NvbnRlbnR9LAogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17Q29udGVudH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIENvbnRlbnQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgQFhNTEhhc2ggPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTFBhcnNlMlhNTEhhc2goIFN0cmluZyA9PiAkUGFyYW17Q29udGVudH0gKTsKCiAgICBpZiAoICEkWE1MSGFzaFswXSApIHsKICAgICAgICBzaGlmdCBAWE1MSGFzaDsKICAgIH0KICAgIG15ICRTdGF0c1hNTCA9ICRYTUxIYXNoWzBdLT57b3Ryc19zdGF0c30tPlsxXTsKCiAgICAjIEdldCBuZXcgU3RhdElECiAgICBteSBAS2V5cyA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MSGFzaFNlYXJjaCggVHlwZSA9PiAnU3RhdHMnLCApOwoKICAgICMgY2hlY2sgaWYgdGhlIHJlcXVpcmVkIGVsZW1lbnRzIGFyZSBhdmFpbGFibGUKICAgIGZvciBteSAkRWxlbWVudCAoCiAgICAgICAgcXcoIERlc2NyaXB0aW9uIEZvcm1hdCBPYmplY3QgT2JqZWN0TW9kdWxlIFBlcm1pc3Npb24gU3RhdFR5cGUgU3VtQ29sIFN1bVJvdyBUaXRsZSBWYWxpZCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkU3RhdHNYTUwtPnskRWxlbWVudH0tPlsxXS0+e0NvbnRlbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgIkNhbid0IGltcG9ydCBTdGF0LCBiZWNhdXNlIHRoZSByZXF1aXJlZCBlbGVtZW50ICRFbGVtZW50IGlzIG5vdCBhdmFpbGFibGUhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgaWYtY2xhdXNlIGlmIGEgc3RhdC14bWwgaW5jbHVkZXMgYSBTdGF0TnVtYmVyCiAgICBteSAkU3RhdElEID0gMTsKICAgIGlmICggJFN0YXRzWE1MLT57U3RhdE51bWJlcn0gKSB7CiAgICAgICAgbXkgJFhNTFN0YXRzSUQgPSAkU3RhdHNYTUwtPntTdGF0TnVtYmVyfS0+WzFdLT57Q29udGVudH0KICAgICAgICAgICAgLSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OlN0YXRzU3RhcnROdW1iZXInKTsKICAgICAgICBmb3IgbXkgJEtleSAoQEtleXMpIHsKICAgICAgICAgICAgaWYgKCAkS2V5IGVxICRYTUxTdGF0c0lEICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICJDYW4ndCBpbXBvcnQgU3RhdE51bWJlciAkS2V5LCBiZWNhdXNlIHRoaXMgU3RhdE51bWJlciBpcyBhbHJlYWR5IHVzZWQhIgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU3RhdElEID0gJFhNTFN0YXRzSUQ7CiAgICB9CgogICAgIyBpZiBubyBzdGF0cyBudW1iZXIgYXZhaWxhYmxlIHVzZSB0aGlzIGZ1bmN0aW9uCiAgICBlbHNlIHsKICAgICAgICBteSBAU29ydEtleXMgPSBzb3J0IHsgJGEgPD0+ICRiIH0gQEtleXM7CiAgICAgICAgaWYgKEBTb3J0S2V5cykgewogICAgICAgICAgICAkU3RhdElEID0gJFNvcnRLZXlzWy0xXSArIDE7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRpbWUKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMlRpbWVTdGFtcCgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CgogICAgIyBtZXRhIHRhZ3MKICAgICRTdGF0c1hNTC0+e0NyZWF0ZWR9LT5bMV0tPntDb250ZW50fSAgID0gJFRpbWVTdGFtcDsKICAgICRTdGF0c1hNTC0+e0NyZWF0ZWRCeX0tPlsxXS0+e0NvbnRlbnR9ID0gJFNlbGYtPntVc2VySUR9OwogICAgJFN0YXRzWE1MLT57Q2hhbmdlZH0tPlsxXS0+e0NvbnRlbnR9ICAgPSAkVGltZVN0YW1wOwogICAgJFN0YXRzWE1MLT57Q2hhbmdlZEJ5fS0+WzFdLT57Q29udGVudH0gPSAkU2VsZi0+e1VzZXJJRH07CiAgICAkU3RhdHNYTUwtPntTdGF0TnVtYmVyfS0+WzFdLT57Q29udGVudH0KICAgICAgICA9ICRTdGF0SUQgKyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OlN0YXRzU3RhcnROdW1iZXInKTsKCiAgICBteSAkRHluYW1pY0ZpbGVzID0gJFNlbGYtPkdldER5bmFtaWNGaWxlcygpOwoKICAgICMgQmVjYXVzZSBzb21lIHhtbC1wYXJzZXIgaW5zZXJ0IFxuIGluc3RlYWQgb2YgPGV4YW1wbGU+PGV4YW1wbGU+CiAgICBpZiAoICRTdGF0c1hNTC0+e09iamVjdH0tPlsxXS0+e0NvbnRlbnR9ICkgewogICAgICAgICRTdGF0c1hNTC0+e09iamVjdH0tPlsxXS0+e0NvbnRlbnR9ID1+IHN7XG59e314OwogICAgfQoKICAgIGlmICgKICAgICAgICAkU3RhdHNYTUwtPntPYmplY3R9LT5bMV0tPntDb250ZW50fQogICAgICAgICYmICEkRHluYW1pY0ZpbGVzLT57ICRTdGF0c1hNTC0+e09iamVjdH0tPlsxXS0+e0NvbnRlbnR9IH0KICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPYmplY3QgJFN0YXRzWE1MLT57T2JqZWN0fS0+WzFdLT57Q29udGVudH0gZG9lc24ndCBleGlzdCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzdGF0aWMgc3RhdGlzdGljCiAgICBpZiAoCiAgICAgICAgJFN0YXRzWE1MLT57U3RhdFR5cGV9LT5bMV0tPntDb250ZW50fQogICAgICAgICYmICRTdGF0c1hNTC0+e1N0YXRUeXBlfS0+WzFdLT57Q29udGVudH0gZXEgJ3N0YXRpYycKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEZpbGVMb2NhdGlvbiA9ICRTdGF0c1hNTC0+e09iamVjdE1vZHVsZX1bMV17Q29udGVudH07CiAgICAgICAgJEZpbGVMb2NhdGlvbiA9fiBzezo6fXtcL31neDsKICAgICAgICAkRmlsZUxvY2F0aW9uID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuICcvJyAuICRGaWxlTG9jYXRpb24gLiAnLnBtJzsKCiAgICAgICAgIyBpZiBubyBpbmxpbmUgZmlsZSBpcyBnaXZlbiBpbiB0aGUgc3RhdHMgZGVmaW5pdGlvbgogICAgICAgIGlmICggISRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntDb250ZW50fSApIHsKCiAgICAgICAgICAgICMgZ2V0IHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgJEZpbGVMb2NhdGlvbiA9fiBzeyBcQSAuKj8gKCBbXi9dKyApIFwuIHBtICBceiB9eyQxfXhtczsKCiAgICAgICAgICAgICMgc2V0IHRoZSBmaWxlIG5hbWUKICAgICAgICAgICAgJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0NvbnRlbnR9ID0gJEZpbGVMb2NhdGlvbjsKICAgICAgICB9CgogICAgICAgICMgd3JpdGUgZmlsZSBpZiBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3RhdHMgZGVmaW5pdGlvbgogICAgICAgIGVsc2lmICggb3BlbiBteSAkRmlsZWhhbmRsZSwgJz4nLCAkRmlsZUxvY2F0aW9uICkgewoKICAgICAgICAgICAgcHJpbnQgU1RERVJSICJOb3RpY2U6IEluc3RhbGwgJEZpbGVMb2NhdGlvbiAoJFN0YXRzWE1MLT57RmlsZX1bMV17UGVybWlzc2lvbn0pIVxuIjsKICAgICAgICAgICAgaWYgKCAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57RW5jb2RlfSAmJiAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57RW5jb2RlfSBlcSAnQmFzZTY0JyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gZGVjb2RlX2Jhc2U2NCggJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0NvbnRlbnR9ICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dCgKICAgICAgICAgICAgICAgICAgICBcJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0NvbnRlbnR9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCB1dGY4IG9yIGJpbiBtb2RlCiAgICAgICAgICAgIGlmICggJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0NvbnRlbnR9ID1+IC91c2Vcc3V0Zjg7LyApIHsKICAgICAgICAgICAgICAgIG9wZW4gJEZpbGVoYW5kbGUsICc+OnV0ZjgnLCAkRmlsZUxvY2F0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYmlubW9kZSAkRmlsZWhhbmRsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmludCAkRmlsZWhhbmRsZSAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57Q29udGVudH07CiAgICAgICAgICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgICAgICAgICAgIyBzZXQgcGVybWlzc2lvbgogICAgICAgICAgICBpZiAoIGxlbmd0aCggJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e1Blcm1pc3Npb259ICkgPT0gMyApIHsKICAgICAgICAgICAgICAgICRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntQZXJtaXNzaW9ufSA9ICIwJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e1Blcm1pc3Npb259IjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaG1vZCggb2N0KCAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57UGVybWlzc2lvbn0gKSwgJEZpbGVMb2NhdGlvbiApOwogICAgICAgICAgICAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57Q29udGVudH0gPSAkU3RhdHNYTUwtPntGaWxlfS0+WzFdLT57RmlsZX07CgogICAgICAgICAgICBkZWxldGUgJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0ZpbGV9OwogICAgICAgICAgICBkZWxldGUgJFN0YXRzWE1MLT57RmlsZX0tPlsxXS0+e0xvY2F0aW9ufTsKICAgICAgICAgICAgZGVsZXRlICRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntQZXJtaXNzaW9ufTsKICAgICAgICAgICAgZGVsZXRlICRTdGF0c1hNTC0+e0ZpbGV9LT5bMV0tPntFbmNvZGV9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHdyYXBwZXIgdG8gY2hhbmdlIHVzZWQgc3BlbGxpbmcgaW4gaWRzCiAgICAjIHdyYXAgcGVybWlzc2lvbnMKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMaXN0KCBWYWxpZCA9PiAxICk7CgogICAgTkFNRToKICAgIGZvciBteSAkTmFtZSAoIEB7ICRTdGF0c1hNTC0+e1Blcm1pc3Npb259IH0gKSB7CiAgICAgICAgbmV4dCBOQU1FIGlmICEkTmFtZTsKCiAgICAgICAgbXkgJEZsYWcgPSAxOwogICAgICAgIElEOgogICAgICAgIGZvciBteSAkSUQgKCBrZXlzICVHcm91cHMgKSB7CiAgICAgICAgICAgIGlmICggJEdyb3Vwc3skSUR9IGVxICROYW1lLT57Q29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAkTmFtZS0+e0NvbnRlbnR9ID0gJElEOwogICAgICAgICAgICAgICAgJEZsYWcgPSAwOwogICAgICAgICAgICAgICAgbGFzdCBJRDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoJEZsYWcpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGZpbmQgdGhlIHBlcm1pc3Npb24gKGdyb3VwKSAkTmFtZS0+e0NvbnRlbnR9ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE5hbWUgPSB1bmRlZjsKICAgICAgICB9CiAgICB9CgogICAgIyB3cmFwIG9iamVjdCBkZXBlbmRlbmQgaWRzCiAgICBpZiAoICRTdGF0c1hNTC0+e09iamVjdH0tPlsxXS0+e0NvbnRlbnR9ICkgewoKICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgbXkgJE9iamVjdE1vZHVsZSA9ICRTdGF0c1hNTC0+e09iamVjdE1vZHVsZX0tPlsxXS0+e0NvbnRlbnR9OwogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkT2JqZWN0TW9kdWxlKTsKICAgICAgICBteSAkU3RhdE9iamVjdCA9ICRPYmplY3RNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICByZXR1cm4gaWYgISRTdGF0T2JqZWN0OwoKICAgICAgICAjIGxvYWQgYXR0cmlidXRlcwogICAgICAgICRTdGF0c1hNTCA9ICRTdGF0T2JqZWN0LT5JbXBvcnRXcmFwcGVyKCAleyRTdGF0c1hNTH0gKTsKICAgIH0KCiAgICAjIG5ldwogICAgcmV0dXJuIGlmICEkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2hBZGQoCiAgICAgICAgVHlwZSAgICA9PiAnU3RhdHMnLAogICAgICAgIEtleSAgICAgPT4gJFN0YXRJRCwKICAgICAgICBYTUxIYXNoID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgb3Ryc19zdGF0cyA9PiBbCiAgICAgICAgICAgICAgICAgICAgdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgJFN0YXRzWE1MLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfSwKICAgICAgICBdLAogICAgKTsKCiAgICByZXR1cm4gJFN0YXRJRDsKfQoKPWl0ZW0gR2V0UGFyYW1zKCkKCiAgICBnZXQgYWxsIGVkaXQgcGFyYW1zIGZyb20gc3RhdHMgZm9yIHZpZXcKCiAgICBteSAkUGFyYW1zID0gJFN0YXRzT2JqZWN0LT5HZXRQYXJhbXMoIFN0YXRJRCA9PiAnMTIzJyApOwoKPWN1dAoKc3ViIEdldFBhcmFtcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggISRQYXJhbXtTdGF0SUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTdGF0SUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdGF0ID0gJFNlbGYtPlN0YXRzR2V0KCBTdGF0SUQgPT4gJFBhcmFte1N0YXRJRH0gKTsKCiAgICAjIHN0YXRpYwogICAgIyBkb24ndCByZW1vdmUgdGhpcyBpZiBjbGF1c2UsIGJlY2F1c2UgaXMgcmVxdWlyZWQgZm9yIG90cnMuR2VuZXJhdGVTdGF0cy5wbAogICAgbXkgQFBhcmFtczsKICAgIGlmICggJFN0YXQtPntTdGF0VHlwZX0gZXEgJ3N0YXRpYycgKSB7CgogICAgICAgICMgbG9hZCBzdGF0aWMgbW9kdWwKICAgICAgICBteSAkT2JqZWN0TW9kdWxlID0gJFN0YXQtPntPYmplY3RNb2R1bGV9OwogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkT2JqZWN0TW9kdWxlKTsKICAgICAgICBteSAkU3RhdE9iamVjdCA9ICRPYmplY3RNb2R1bGUtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICByZXR1cm4gaWYgISRTdGF0T2JqZWN0OwoKICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICBAUGFyYW1zID0gJFN0YXRPYmplY3QtPlBhcmFtKCk7CiAgICB9CiAgICByZXR1cm4gXEBQYXJhbXM7Cn0KCj1pdGVtIFN0YXRzUnVuKCkKCnJ1biBhIHN0YXRzCgogICAgbXkgJFN0YXRBcnJheSA9ICRTdGF0c09iamVjdC0+U3RhdHNSdW4oCiAgICAgICAgU3RhdElEICAgPT4gJzEyMycsCiAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIE5FRUQ6CiAgICBmb3IgbXkgJE5lZWQgKHF3KFN0YXRJRCBHZXRQYXJhbSkpIHsKICAgICAgICBuZXh0IE5FRUQgaWYgJFBhcmFteyROZWVkfTsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXNlIHRoZSBtaXJyb3IgZGIgaWYgY29uZmlndXJlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ29yZTo6TWlycm9yREI6OkRTTicpICkgewogICAgICAgIG15ICRFeHRyYURhdGFiYXNlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgICAgIExvZ09iamVjdCAgICA9PiAkU2VsZi0+e0xvZ09iamVjdH0sCiAgICAgICAgICAgIENvbmZpZ09iamVjdCA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0sCiAgICAgICAgICAgIE1haW5PYmplY3QgICA9PiAkU2VsZi0+e01haW5PYmplY3R9LAogICAgICAgICAgICBFbmNvZGVPYmplY3QgPT4gJFNlbGYtPntFbmNvZGVPYmplY3R9LAogICAgICAgICAgICBEYXRhYmFzZURTTiAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpEU04nKSwKICAgICAgICAgICAgRGF0YWJhc2VVc2VyID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDb3JlOjpNaXJyb3JEQjo6VXNlcicpLAogICAgICAgICAgICBEYXRhYmFzZVB3ICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0NvcmU6Ok1pcnJvckRCOjpQYXNzd29yZCcpLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJEV4dHJhRGF0YWJhc2VPYmplY3QgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdUaGVyZSBpcyBubyBNaXJyb0RCIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSAkRXh0cmFEYXRhYmFzZU9iamVjdDsKICAgIH0KCiAgICBteSAkU3RhdCA9ICRTZWxmLT5TdGF0c0dldCggU3RhdElEID0+ICRQYXJhbXtTdGF0SUR9ICk7CiAgICBteSAlR2V0UGFyYW0gPSAleyAkUGFyYW17R2V0UGFyYW19IH07CiAgICBteSBAUmVzdWx0OwoKICAgICMgZ2V0IGRhdGEgaWYgaXQgaXMgYSBzdGF0aWMgc3RhdHMKICAgIGlmICggJFN0YXQtPntTdGF0VHlwZX0gZXEgJ3N0YXRpYycgKSB7CiAgICAgICAgQFJlc3VsdCA9ICRTZWxmLT5fR2VuZXJhdGVTdGF0aWNTdGF0cygKICAgICAgICAgICAgT2JqZWN0TW9kdWxlID0+ICRTdGF0LT57T2JqZWN0TW9kdWxlfSwKICAgICAgICAgICAgR2V0UGFyYW0gICAgID0+ICRQYXJhbXtHZXRQYXJhbX0sCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkU3RhdC0+e1RpdGxlfSwKICAgICAgICAgICAgU3RhdElEICAgICAgID0+ICRTdGF0LT57U3RhdElEfSwKICAgICAgICAgICAgQ2FjaGUgICAgICAgID0+ICRTdGF0LT57Q2FjaGV9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgZGF0YSBpZiBpdCBpcyBhIGR5bmF5bWljIHN0YXRzCiAgICBlbHNpZiAoICRTdGF0LT57U3RhdFR5cGV9IGVxICdkeW5hbWljJyApIHsKICAgICAgICBAUmVzdWx0ID0gJFNlbGYtPl9HZW5lcmF0ZUR5bmFtaWNTdGF0cygKICAgICAgICAgICAgT2JqZWN0TW9kdWxlICAgICA9PiAkU3RhdC0+e09iamVjdE1vZHVsZX0sCiAgICAgICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJFN0YXQtPntPYmplY3R9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+ICRHZXRQYXJhbXtVc2VBc1h2YWx1ZX0sCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gJEdldFBhcmFte1VzZUFzVmFsdWVTZXJpZXN9LAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+ICRHZXRQYXJhbXtVc2VBc1Jlc3RyaWN0aW9ufSwKICAgICAgICAgICAgVGl0bGUgICAgICAgICAgICA9PiAkU3RhdC0+e1RpdGxlfSwKICAgICAgICAgICAgU3RhdElEICAgICAgICAgICA9PiAkU3RhdC0+e1N0YXRJRH0sCiAgICAgICAgICAgIENhY2hlICAgICAgICAgICAgPT4gJFN0YXQtPntDYWNoZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGJ1aWxkIHN1bSBpbiByb3cgb3IgY29sCiAgICBpZiAoICggJFN0YXQtPntTdW1Sb3d9IHx8ICRTdGF0LT57U3VtQ29sfSApICYmICRTdGF0LT57Rm9ybWF0fSAhfiBte15HRDo6R3JhcGhcLip9eCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPlN1bUJ1aWxkKAogICAgICAgICAgICBBcnJheSAgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFN1bVJvdyA9PiAkU3RhdC0+e1N1bVJvd30sCiAgICAgICAgICAgIFN1bUNvbCA9PiAkU3RhdC0+e1N1bUNvbH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcQFJlc3VsdDsKfQoKPWl0ZW0gU3RyaW5nQW5kVGltZXN0YW1wMkZpbGVuYW1lKCkKCmJ1aWxkcyBhIGZpbGVuYW1lIHdpdGggYSBzdHJpbmcgYW5kIGEgdGltZXN0YW1wLgooc3BhY2Ugd2lsbCBiZSByZXBsYWNlZCB3aXRoIF8gYW5kIC0gZS5nLiBUaXRsZS1vZi1GaWxlXzIwMDYtMTItMzFfMTEtNTkpCgogICAgbXkgJEZpbGVuYW1lID0gJFN0YXRzT2JqZWN0LT5TdHJpbmdBbmRUaW1lc3RhbXAyRmlsZW5hbWUoIFN0cmluZyA9PiAnVGl0bGUnICk7Cgo9Y3V0CgpzdWIgU3RyaW5nQW5kVGltZXN0YW1wMkZpbGVuYW1lIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte1N0cmluZ30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN0cmluZyEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgU3lzdGVtVGltZSA9PiAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCksCiAgICApOwogICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAkRCA9IHNwcmludGYoICIlMDJkIiwgJEQgKTsKICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CgogICAgJFBhcmFte1N0cmluZ30gPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgRmlsZW5hbWUgPT4gJFBhcmFte1N0cmluZ30sCiAgICAgICAgVHlwZSAgICAgPT4gJ0F0dGFjaG1lbnQnLAogICAgKTsKCiAgICBteSAkRmlsZW5hbWUgPSAkUGFyYW17U3RyaW5nfSAuICdfJyAuICIkWS0kTS0kRCIgLiAnXycgLiAiJGgtJG0iOwoKICAgIHJldHVybiAkRmlsZW5hbWU7Cn0KCj1pdGVtIFN0YXROdW1iZXIyU3RhdElEKCkKCmluc2VydCB0aGUgc3RhdCBudW1iZXIgZ2V0IHRoZSBzdGF0IGlkCgogICAgbXkgJFN0YXRJRCA9ICRTdGF0c09iamVjdC0+U3RhdE51bWJlcjJTdGF0SUQoCiAgICAgICAgU3RhdE51bWJlciA9PiAxMTIxMiwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdE51bWJlcjJTdGF0SUQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17U3RhdE51bWJlcn0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFN0YXROdW1iZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSBAS2V5ID0gJFNlbGYtPntYTUxPYmplY3R9LT5YTUxIYXNoU2VhcmNoKAogICAgICAgIFR5cGUgPT4gJ1N0YXRzJywKICAgICAgICBXaGF0ID0+IFsgeyAiWyVdeydvdHJzX3N0YXRzJ31bJV17J1N0YXROdW1iZXInfVslXXsnQ29udGVudCd9IiA9PiAkUGFyYW17U3RhdE51bWJlcn0gfSBdLAogICAgKTsKICAgIGlmICggQEtleSAmJiAkI0tleSA8IDEgKSB7CiAgICAgICAgcmV0dXJuICRLZXlbMF07CiAgICB9CgogICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnU3RhdE51bWJlciBpbnZhbGlkIScsCiAgICApOwogICAgcmV0dXJuOwp9Cgo9aXRlbSBTdGF0c0luc3RhbGwoKQoKaW5zdGFsbHMgc3RhdHMKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPlN0YXRzSW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICdGQVEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzSW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcHJlcGFyZSBwcmVmaXgKICAgICRQYXJhbXtGaWxlUHJlZml4fSA9ICRQYXJhbXtGaWxlUHJlZml4fSA/ICRQYXJhbXtGaWxlUHJlZml4fSAuICctJyA6ICcnOwoKICAgICMgc3RhcnQgQXV0b21hdGljU2FtcGxlSW1wb3J0IGlmIG5vIHN0YXRzIGFyZSBpbnN0YWxsZWQKICAgICRTZWxmLT5HZXRTdGF0c0xpc3QoKTsKCiAgICAjIGNsZWFudXAgc3RhdHMKICAgICRTZWxmLT5TdGF0c0NsZWFuVXAoKTsKCiAgICAjIGdldCBsaXN0IG9mIHN0YXRzIGZpbGVzCiAgICBteSBAU3RhdHNGaWxlTGlzdCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkRpcmVjdG9yeVJlYWQoCiAgICAgICAgRGlyZWN0b3J5ID0+ICRTZWxmLT57U3RhdHNUZW1wRGlyfSwKICAgICAgICBGaWx0ZXIgICAgPT4gJFBhcmFte0ZpbGVQcmVmaXh9IC4gJyoueG1sJywKICAgICk7CgogICAgIyBpbXBvcnQgdGhlIHN0YXRzCiAgICBteSAkSW5zdGFsbGVkUG9zdGZpeCA9ICcuaW5zdGFsbGVkJzsKICAgIEZJTEU6CiAgICBmb3IgbXkgJEZpbGUgKCBzb3J0IEBTdGF0c0ZpbGVMaXN0ICkgewoKICAgICAgICBuZXh0IEZJTEUgaWYgIS1mICRGaWxlOwogICAgICAgIG5leHQgRklMRSBpZiAtZSAkRmlsZSAuICRJbnN0YWxsZWRQb3N0Zml4OwoKICAgICAgICAjIHJlYWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJFhNTENvbnRlbnRSZWYgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEZpbGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBpbXBvcnQgc3RhdAogICAgICAgIG15ICRTdGF0SUQgPSAkU2VsZi0+SW1wb3J0KAogICAgICAgICAgICBDb250ZW50ID0+ICR7JFhNTENvbnRlbnRSZWZ9LAogICAgICAgICk7CgogICAgICAgIG5leHQgRklMRSBpZiAhJFN0YXRJRDsKCiAgICAgICAgIyB3cml0ZSBpbnN0YWxsZWQgZmlsZSB3aXRoIHN0YXQgaWQKICAgICAgICAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlV3JpdGUoCiAgICAgICAgICAgIENvbnRlbnQgID0+IFwkU3RhdElELAogICAgICAgICAgICBMb2NhdGlvbiA9PiAkRmlsZSAuICRJbnN0YWxsZWRQb3N0Zml4LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIFN0YXRzVW5pbnN0YWxsKCkKCnVuaW5zdGFsbHMgc3RhdHMKCiAgICBteSAkUmVzdWx0ID0gJFN0YXRzT2JqZWN0LT5TdGF0c1VuaW5zdGFsbCgKICAgICAgICBGaWxlUHJlZml4ID0+ICdGQVEnLCAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBwcmVwYXJlIHByZWZpeAogICAgJFBhcmFte0ZpbGVQcmVmaXh9ID0gJFBhcmFte0ZpbGVQcmVmaXh9ID8gJFBhcmFte0ZpbGVQcmVmaXh9IC4gJy0nIDogJyc7CgogICAgIyBnZXQgbGlzdCBvZiBpbnN0YWxsZWQgc3RhdHMgZmlsZXMKICAgIG15IEBTdGF0c0ZpbGVMaXN0ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICBEaXJlY3RvcnkgPT4gJFNlbGYtPntTdGF0c1RlbXBEaXJ9LAogICAgICAgIEZpbHRlciAgICA9PiAkUGFyYW17RmlsZVByZWZpeH0gLiAnKi54bWwuaW5zdGFsbGVkJywKICAgICk7CgogICAgIyBkZWxldGUgdGhlIHN0YXRzCiAgICBmb3IgbXkgJEZpbGUgKCBzb3J0IEBTdGF0c0ZpbGVMaXN0ICkgewoKICAgICAgICAjIHJlYWQgZmlsZSBjb250ZW50CiAgICAgICAgbXkgJFN0YXRzSURSZWYgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlUmVhZCgKICAgICAgICAgICAgTG9jYXRpb24gPT4gJEZpbGUsCiAgICAgICAgKTsKCiAgICAgICAgIyBkZWxldGUgc3RhdHMKICAgICAgICAkU2VsZi0+U3RhdHNEZWxldGUoCiAgICAgICAgICAgIFN0YXRJRCA9PiAkeyRTdGF0c0lEUmVmfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2xlYW51cCBzdGF0cwogICAgJFNlbGYtPlN0YXRzQ2xlYW5VcCgpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBTdGF0c0NsZWFuVXAoKQoKcmVtb3ZlZCBzdGF0cyB3aXRoIG5vdCBleGlzdGluZyBiYWNrZW5kIGZpbGUKCiAgICBteSAkUmVzdWx0ID0gJFN0YXRzT2JqZWN0LT5TdGF0c0NsZWFuVXAoKTsKCj1jdXQKCnN1YiBTdGF0c0NsZWFuVXAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICAjIGdldCBhIGxpc3Qgb2YgYWxsIHN0YXRzCiAgICBteSAkTGlzdFJlZiA9ICRTZWxmLT5HZXRTdGF0c0xpc3QoKTsKCiAgICByZXR1cm4gaWYgISRMaXN0UmVmOwogICAgcmV0dXJuIGlmIHJlZiAkTGlzdFJlZiBuZSAnQVJSQVknOwoKICAgIFNUQVRTSUQ6CiAgICBmb3IgbXkgJFN0YXRzSUQgKCBAeyRMaXN0UmVmfSApIHsKCiAgICAgICAgIyBnZXQgc3RhdHMKICAgICAgICBteSAkSGFzaFJlZiA9ICRTZWxmLT5TdGF0c0dldCgKICAgICAgICAgICAgU3RhdElEICAgICAgICAgICAgID0+ICRTdGF0c0lELAogICAgICAgICAgICBOb09iamVjdEF0dHJpYnV0ZXMgPT4gMSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFNUQVRTSUQgaWYgJEhhc2hSZWYKICAgICAgICAgICAgICAgICYmIHJlZiAkSGFzaFJlZiBlcSAnSEFTSCcKICAgICAgICAgICAgICAgICYmICRIYXNoUmVmLT57T2JqZWN0TW9kdWxlfQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEhhc2hSZWYtPntPYmplY3RNb2R1bGV9ICk7CgogICAgICAgICMgZGVsZXRlIHN0YXRzCiAgICAgICAgJFNlbGYtPlN0YXRzRGVsZXRlKCBTdGF0SUQgPT4gJFN0YXRzSUQgKTsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKPWJlZ2luIEludGVybmFsOgoKPWl0ZW0gX0dlbmVyYXRlU3RhdGljU3RhdHMoKQoKICAgIHRha2UgdGhlIHN0YXQgY29uZmlndXJhdGlvbiBhbmQgZ2V0IHRoZSBzdGF0IHRhYmxlCgogICAgbXkgQFN0YXRBcnJheSA9ICRTdGF0c09iamVjdC0+X0dlbmVyYXRlU3RhdGljU3RhdHMoCiAgICAgICAgT2JqZWN0TW9kdWxlID0+ICRTdGF0LT57T2JqZWN0TW9kdWxlfSwKICAgICAgICBHZXRQYXJhbSAgICAgPT4gJFBhcmFte0dldFBhcmFtfSwKICAgICAgICBUaXRsZSAgICAgICAgPT4gJFN0YXQtPntUaXRsZX0sCiAgICAgICAgU3RhdElEICAgICAgID0+ICRTdGF0LT57U3RhdElEfSwKICAgICAgICBDYWNoZSAgICAgICAgPT4gJFN0YXQtPntDYWNoZX0sCiAgICApOwoKPWN1dAoKc3ViIF9HZW5lcmF0ZVN0YXRpY1N0YXRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBORUVEOgogICAgZm9yIG15ICROZWVkIChxdyhPYmplY3RNb2R1bGUgR2V0UGFyYW0gVGl0bGUgU3RhdElEKSkgewogICAgICAgIG5leHQgTkVFRCBpZiAkUGFyYW17JE5lZWR9OwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBsb2FkIHN0YXRpYyBtb2R1bAogICAgbXkgJE9iamVjdE1vZHVsZSA9ICRQYXJhbXtPYmplY3RNb2R1bGV9OwogICAgcmV0dXJuIGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRPYmplY3RNb2R1bGUpOwogICAgbXkgJFN0YXRPYmplY3QgPSAkT2JqZWN0TW9kdWxlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICByZXR1cm4gaWYgISRTdGF0T2JqZWN0OwoKICAgIG15IEBSZXN1bHQ7CiAgICBteSAlR2V0UGFyYW0gPSAleyAkUGFyYW17R2V0UGFyYW19IH07CgogICAgIyB1c2UgcmVzdWx0IGNhY2hlIGlmIGNvbmZpZ3VyZWQKICAgIGlmICggJFBhcmFte0NhY2hlfSApIHsKICAgICAgICBteSAkRmlsZW5hbWUgPSAkU2VsZi0+X0NyZWF0ZVN0YXRpY1Jlc3VsdENhY2hlRmlsZW5hbWUoCiAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgIFN0YXRJRCAgID0+ICRQYXJhbXtTdGF0SUR9LAogICAgICAgICk7CgogICAgICAgIEBSZXN1bHQgPSAkU2VsZi0+X0dldFJlc3VsdENhY2hlKCBGaWxlbmFtZSA9PiAkRmlsZW5hbWUgKTsKICAgIH0KCiAgICAjIHRyeSB0byBnZXQgZGF0YSBpZiBub3RoaW5nIGlzIHRoZXJlCiAgICBpZiAoICFAUmVzdWx0ICkgewoKICAgICAgICAjIHJ1biBzdGF0cyBmdW5jdGlvbgogICAgICAgIEBSZXN1bHQgPSAkU3RhdE9iamVjdC0+UnVuKAogICAgICAgICAgICAlR2V0UGFyYW0sCgogICAgICAgICAgICAjIHRoZXNlIHR3byBsaW5lcyBhcmUgcmVxdWlyZW1lbnRzIG9mIG1lLCBwZXJoYXBzIHRoaXMKICAgICAgICAgICAgIyBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgZm9yIGZvcm1lciBzdGF0aWMgc3RhdHMKICAgICAgICAgICAgRm9ybWF0ID0+ICRQYXJhbXtGb3JtYXR9LT5bMF0sCiAgICAgICAgICAgIE1vZHVsZSA9PiAkUGFyYW17T2JqZWN0TW9kdWxlfSwKICAgICAgICApOwoKICAgICAgICAjIHdyaXRlIGNhY2hlIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoICRQYXJhbXtDYWNoZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT5fV3JpdGVSZXN1bHRDYWNoZSgKICAgICAgICAgICAgICAgIEdldFBhcmFtID0+IFwlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBTdGF0SUQgICA9PiAkUGFyYW17U3RhdElEfSwKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFxAUmVzdWx0LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgICRSZXN1bHRbMF0tPlswXSA9ICRQYXJhbXtUaXRsZX0gLiAnICcgLiAkUmVzdWx0WzBdLT5bMF07CgogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCj1pdGVtIF9HZW5lcmF0ZUR5bmFtaWNTdGF0cygpCgogICAgdGFrZSB0aGUgc3RhdCBjb25maWd1cmF0aW9uIGFuZCBnZXQgdGhlIHN0YXQgdGFibGUKCiAgICBteSBAU3RhdEFycmF5ID0gJFN0YXRzT2JqZWN0LT5fR2VuZXJhdGVEeW5hbWljU3RhdHMoCiAgICAgICAgT2JqZWN0TW9kdWxlICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpUaWNrZXQnLAogICAgICAgIE9iamVjdCAgICAgICAgICAgPT4gJ1RpY2tldCcsCiAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiBcVXNlQXNYdmFsdWVFbGVtZW50cywKICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IFxVc2VBc1ZhbHVlU2VyaWVzRWxlbWVudHMsCiAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiBcVXNlQXNSZXN0cmljdGlvbkVsZW1lbnRzLAogICAgICAgIFRpdGxlICAgICAgICAgICAgPT4gJ1RpY2tldFN0YXQnLAogICAgICAgIFN0YXRJRCAgICAgICAgICAgPT4gMTIzLAogICAgICAgIENhY2hlICAgICAgICAgICAgPT4gMSwgICAgICAjIG9wdGlvbmFsCiAgICApOwoKPWN1dAoKIyBzZWFyY2ggZm9yIGEgYmV0dGVyIHdheSB0byBjYWNoZSBzdGF0cyAoc2VlIGxpbmVzIGJlZm9yZSBTdGF0SUQgYW5kIENhY2hlKQoKc3ViIF9HZW5lcmF0ZUR5bmFtaWNTdGF0cyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15IEBIZWFkZXJMaW5lOwogICAgbXkgJFRpdGxlVGltZVN0YXJ0ID0gJyc7CiAgICBteSAkVGl0bGVUaW1lU3RvcCAgPSAnJzsKCiAgICBORUVEOgogICAgZm9yIG15ICROZWVkIChxdyhPYmplY3RNb2R1bGUgVXNlQXNYdmFsdWUgVXNlQXNWYWx1ZVNlcmllcyBUaXRsZSBPYmplY3QgU3RhdElEKSkgewogICAgICAgIG5leHQgTkVFRCBpZiAkUGFyYW17JE5lZWR9OwogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpbmNsdWRlIHRoZSBuZWVkZWQgZHluYW1pYyBvYmplY3QKICAgIG15ICRPYmplY3RNb2R1bGUgPSAkUGFyYW17T2JqZWN0TW9kdWxlfTsKICAgIHJldHVybiBpZiAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkT2JqZWN0TW9kdWxlKTsKICAgIG15ICRTdGF0T2JqZWN0ID0gJE9iamVjdE1vZHVsZS0+bmV3KCAleyRTZWxmfSApOwogICAgcmV0dXJuIGlmICEkU3RhdE9iamVjdDsKCiAgICAjIGdldCB0aGUgc2VsZWN0ZWQgdmFsdWVzCiAgICAjIHBlcmhhcHMgaSBjYW4gc3BsaXQgdGhlIFN0YXRHZXQgZnVuY3Rpb24gdG8gbWFrZSB0aGlzIG5lZWRsZXNzCiAgICAjIFByb2JsZW0sIGkgbmVlZCB0aGUgYmxvY2sgaW5mb3JtYXRpb24KICAgIG15ICVOZXdQYXJhbTsKCiAgICAkTmV3UGFyYW17VGl0bGV9ICAgICAgICA9ICRQYXJhbXtUaXRsZX07CiAgICAkTmV3UGFyYW17T2JqZWN0fSAgICAgICA9ICRQYXJhbXtPYmplY3R9OwogICAgJE5ld1BhcmFte09iamVjdE1vZHVsZX0gPSAkUGFyYW17T2JqZWN0TW9kdWxlfTsKCiAgICAjIHNlYXJjaCBmb3IgYSBiZXR0ZXIgd2F5IHRvIGNhY2hlIHN0YXRzIChTdGF0SUQgYW5kIENhY2hlKQogICAgJE5ld1BhcmFte1N0YXRJRH0gPSAkUGFyYW17U3RhdElEfTsKICAgICROZXdQYXJhbXtDYWNoZX0gID0gJFBhcmFte0NhY2hlfTsKICAgIGZvciBteSAkVXNlIChxdyhVc2VBc1Jlc3RyaWN0aW9uIFVzZUFzWHZhbHVlIFVzZUFzVmFsdWVTZXJpZXMpKSB7CiAgICAgICAgbXkgQEFycmF5ID0gQHsgJFBhcmFteyRVc2V9IH07CiAgICAgICAgRUxFTUVOVDoKICAgICAgICBmb3IgbXkgJEVsZW1lbnQgKEBBcnJheSkgewogICAgICAgICAgICBuZXh0IEVMRU1FTlQgaWYgISRFbGVtZW50LT57U2VsZWN0ZWR9OwoKICAgICAgICAgICAgZGVsZXRlICRFbGVtZW50LT57U2VsZWN0ZWR9OwogICAgICAgICAgICBkZWxldGUgJEVsZW1lbnQtPntGaXhlZH07CiAgICAgICAgICAgIGlmICggJEVsZW1lbnQtPntCbG9ja30gZXEgJ1RpbWUnICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRFbGVtZW50LT57VGltZVBlcmlvZEZvcm1hdH07CiAgICAgICAgICAgICAgICBpZiAoICRFbGVtZW50LT57VGltZVJlbGF0aXZlVW5pdH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICRDb3VudCA9ICRFbGVtZW50LT57VGltZVJlbGF0aXZlQ291bnR9ID8gJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVDb3VudH0gOiAxOwoKICAgICAgICAgICAgICAgICAgICAjIC0xIGJlY2F1c2UgdGhlIGN1cnJlbnQgdGltZSB3aWxsIGJlIG5vdCBjb3VudGVkCiAgICAgICAgICAgICAgICAgICAgJENvdW50IC09IDE7CgogICAgICAgICAgICAgICAgICAgIGlmICggJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVVbml0fSBlcSAnWWVhcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICggJFksICRNLCAkRCApID0gQWRkX0RlbHRhX1lNRCggJFksICRNLCAkRCwgLTEsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RvcH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksIDEyLCAzMSwgMjMsIDU5LCA1OSApOwogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQgKSA9IEFkZF9EZWx0YV9ZTUQoICRZLCAkTSwgJEQsIC0kQ291bnQsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAxLCAxLCAwLCAwLCAwICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVVbml0fSBlcSAnTW9udGgnICkgewogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQgKSA9IEFkZF9EZWx0YV9ZTUQoICRZLCAkTSwgJEQsIDAsIC0xLCAwICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50LT57VGltZVN0b3B9ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkWSwgJE0sIERheXNfaW5fTW9udGgoICRZLCAkTSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsIDU5LCA1OQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQgKSA9IEFkZF9EZWx0YV9ZTUQoICRZLCAkTSwgJEQsIDAsIC0kQ291bnQsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgMSwgMCwgMCwgMCApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50LT57VGltZVJlbGF0aXZlVW5pdH0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICggJFksICRNLCAkRCApID0gQWRkX0RlbHRhX1lNRCggJFksICRNLCAkRCwgMCwgMCwgLTEgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RvcH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwgJFksICRNLCAkRCwgMjMsIDU5LCA1OSApOwogICAgICAgICAgICAgICAgICAgICAgICAoICRZLCAkTSwgJEQgKSA9IEFkZF9EZWx0YV9ZTUQoICRZLCAkTSwgJEQsIDAsIDAsIC0kQ291bnQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJEQsIDAsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1RpbWVSZWxhdGl2ZVVuaXR9IGVxICdIb3VyJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICRELCAkaCwgJG0sICRzICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMsIDAsIC0xLCAwLCAwICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50LT57VGltZVN0b3B9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJEQsICRoLCA1OSwgNTkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICRELCAkaCwgJG0sICRzICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMsIDAsIC0kQ291bnQsIDAsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJEQsICRoLCAwLCAwICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVVbml0fSBlcSAnTWludXRlJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICRELCAkaCwgJG0sICRzICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMsIDAsIDAsIC0xLCAwICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50LT57VGltZVN0b3B9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJEQsICRoLCAkbSwgNTkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICRELCAkaCwgJG0sICRzICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMsIDAsIDAsIC0kQ291bnQsIDAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJGgsICRtLCAwLCAwICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntUaW1lUmVsYXRpdmVVbml0fSBlcSAnU2Vjb25kJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICRELCAkaCwgJG0sICRzICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMsIDAsIDAsIDAsIC0xICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRFbGVtZW50LT57VGltZVN0b3B9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKTsKICAgICAgICAgICAgICAgICAgICAgICAgKCAkWSwgJE0sICRELCAkaCwgJG0sICRzICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoICRZLCAkTSwgJEQsICRoLCAkbSwgJHMsIDAsIDAsIDAsIC0kQ291bnQgKTsKICAgICAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQtPntUaW1lU3RhcnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOiUwMmQ6JTAyZCIsICRZLCAkTSwgJEQsICRoLCAkbSwgJHMgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRFbGVtZW50LT57VGltZVJlbGF0aXZlVW5pdH07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRFbGVtZW50LT57VGltZVJlbGF0aXZlQ291bnR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFRpdGxlVGltZVN0YXJ0ID0gJEVsZW1lbnQtPntUaW1lU3RhcnR9OwogICAgICAgICAgICAgICAgJFRpdGxlVGltZVN0b3AgID0gJEVsZW1lbnQtPntUaW1lU3RvcH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgU2VsZWN0IEFsbCBmdW5jdGlvbiBuZWVkZWQgZnJvbSBvdHJzLkdlbmVyYXRlU3RhdHMucGwgYW5kIGZpeGVkIHZhbHVlcyBvZiB0aGUgZnJvbnRlbmQKICAgICAgICAgICAgZWxzaWYgKCAhJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gKSB7CiAgICAgICAgICAgICAgICBteSBAVmFsdWVzID0ga2V5cyggJXsgJEVsZW1lbnQtPntWYWx1ZXN9IH0gKTsKICAgICAgICAgICAgICAgICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9ID0gXEBWYWx1ZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBAeyAkTmV3UGFyYW17JFVzZX0gfSwgJEVsZW1lbnQ7CiAgICAgICAgfQogICAgfQoKICAgICVQYXJhbSA9ICVOZXdQYXJhbTsKCiAgICAjIGdldCBhbGwgcmVzdHJpY3Rpb25zIGZvciB0aGUgc2VhcmNoCiAgICBteSAlUmVzdHJpY3Rpb25BdHRyaWJ1dGU7CiAgICBmb3IgbXkgJFJlc3RyaWN0aW9uUGFydCAoIEB7ICRQYXJhbXtVc2VBc1Jlc3RyaWN0aW9ufSB9ICkgewogICAgICAgIG15ICRFbGVtZW50ID0gJFJlc3RyaWN0aW9uUGFydC0+e0VsZW1lbnR9OwogICAgICAgIGlmICggJFJlc3RyaWN0aW9uUGFydC0+e0Jsb2NrfSBlcSAnSW5wdXRGaWVsZCcgKSB7CiAgICAgICAgICAgICRSZXN0cmljdGlvbkF0dHJpYnV0ZXskRWxlbWVudH0gPSAkUmVzdHJpY3Rpb25QYXJ0LT57U2VsZWN0ZWRWYWx1ZXN9WzBdOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRSZXN0cmljdGlvblBhcnQtPntCbG9ja30gZXEgJ1NlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgJFJlc3RyaWN0aW9uQXR0cmlidXRleyRFbGVtZW50fSA9ICRSZXN0cmljdGlvblBhcnQtPntTZWxlY3RlZFZhbHVlc31bMF07CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlc3RyaWN0aW9uUGFydC0+e0Jsb2NrfSBlcSAnVGltZScgKSB7CiAgICAgICAgICAgICRSZXN0cmljdGlvbkF0dHJpYnV0ZXsgJFJlc3RyaWN0aW9uUGFydC0+e1ZhbHVlc317VGltZVN0b3B9IH0KICAgICAgICAgICAgICAgID0gJFJlc3RyaWN0aW9uUGFydC0+e1RpbWVTdG9wfTsKICAgICAgICAgICAgJFJlc3RyaWN0aW9uQXR0cmlidXRleyAkUmVzdHJpY3Rpb25QYXJ0LT57VmFsdWVzfXtUaW1lU3RhcnR9IH0KICAgICAgICAgICAgICAgID0gJFJlc3RyaWN0aW9uUGFydC0+e1RpbWVTdGFydH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUmVzdHJpY3Rpb25BdHRyaWJ1dGV7JEVsZW1lbnR9ID0gJFJlc3RyaWN0aW9uUGFydC0+e1NlbGVjdGVkVmFsdWVzfTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgdGhlIHNlbGVjdGVkIFh2YWx1ZQogICAgbXkgJFh2YWx1ZSA9IHt9OwogICAgbXkgKAogICAgICAgICRWU1llYXIsICAgICAkVlNNb250aCwgICAgICRWU0RheSwgICAgICRWU0hvdXIsICAgICAkVlNNaW51dGUsICAgICAkVlNTZWNvbmQsCiAgICAgICAgJFZTU3RvcFllYXIsICRWU1N0b3BNb250aCwgJFZTU3RvcERheSwgJFZTU3RvcEhvdXIsICRWU1N0b3BNaW51dGUsICRWU1N0b3BTZWNvbmQKICAgICk7CiAgICBteSAkVGltZUFic29sdXRTdG9wVW5peFRpbWUgPSAwOwogICAgbXkgJENvdW50ICAgICAgICAgICAgICAgICAgID0gMDsKICAgIG15ICRNb250aEFycmF5UmVmICAgICAgICAgICA9IF9Nb250aEFycmF5KCk7CgogICAgbXkgJEVsZW1lbnQgPSAkUGFyYW17VXNlQXNYdmFsdWV9WzBdOwogICAgaWYgKCAkRWxlbWVudC0+e0Jsb2NrfSBlcSAnVGltZScgKSB7CiAgICAgICAgbXkgKAogICAgICAgICAgICAkWWVhciwgICAkTW9udGgsICAgJERheSwgICAkSG91ciwgICAkTWludXRlLCAgICRTZWNvbmQsCiAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kCiAgICAgICAgKTsKICAgICAgICBpZiAoICRFbGVtZW50LT57VGltZVN0YXJ0fSA9fiBte14oXGRcZFxkXGQpLShcZFxkKS0oXGRcZClccyhcZFxkKTooXGRcZCk6KFxkXGQpJH1peCApIHsKICAgICAgICAgICAgJFllYXIgICA9ICRWU1llYXIgICA9ICQxOwogICAgICAgICAgICAkTW9udGggID0gJFZTTW9udGggID0gaW50ICQyOwogICAgICAgICAgICAkRGF5ICAgID0gJFZTRGF5ICAgID0gaW50ICQzOwogICAgICAgICAgICAkSG91ciAgID0gJFZTSG91ciAgID0gaW50ICQ0OwogICAgICAgICAgICAkTWludXRlID0gJFZTTWludXRlID0gaW50ICQ1OwogICAgICAgICAgICAkU2Vjb25kID0gJFZTU2Vjb25kID0gaW50ICQ2OwogICAgICAgIH0KCiAgICAgICAgJFRpbWVBYnNvbHV0U3RvcFVuaXhUaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkRWxlbWVudC0+e1RpbWVTdG9wfSwKICAgICAgICApOwogICAgICAgIG15ICRUaW1lU3RhcnQgPSAwOwogICAgICAgIG15ICRUaW1lU3RvcCAgPSAwOwoKICAgICAgICAkQ291bnQgPSAkRWxlbWVudC0+e1RpbWVTY2FsZUNvdW50fSA/ICRFbGVtZW50LT57VGltZVNjYWxlQ291bnR9IDogMTsKCiAgICAgICAgIyBpbiB0aGVzZSBjb25zdGVsbGF0aW9uICRDb3VudCA+IDEgaXMgbm90IHVzZWZ1bCEhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17VXNlQXNWYWx1ZVNlcmllc31bMF17QmxvY2t9CiAgICAgICAgICAgICYmICRQYXJhbXtVc2VBc1ZhbHVlU2VyaWVzfVswXXtCbG9ja30gZXEgJ1RpbWUnCiAgICAgICAgICAgICYmICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdEYXknCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRDb3VudCA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdNaW51dGUnICkgewogICAgICAgICAgICAkU2Vjb25kID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnSG91cicgKSB7CiAgICAgICAgICAgICRTZWNvbmQgPSAwOwogICAgICAgICAgICAkTWludXRlID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnRGF5JyApIHsKICAgICAgICAgICAgJFNlY29uZCA9IDA7CiAgICAgICAgICAgICRNaW51dGUgPSAwOwogICAgICAgICAgICAkSG91ciAgID0gMDsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnTW9udGgnICkgewogICAgICAgICAgICAkU2Vjb25kID0gMDsKICAgICAgICAgICAgJE1pbnV0ZSA9IDA7CiAgICAgICAgICAgICRIb3VyICAgPSAwOwogICAgICAgICAgICAkRGF5ICAgID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnWWVhcicgKSB7CiAgICAgICAgICAgICRTZWNvbmQgPSAwOwogICAgICAgICAgICAkTWludXRlID0gMDsKICAgICAgICAgICAgJEhvdXIgICA9IDA7CiAgICAgICAgICAgICREYXkgICAgPSAxOwogICAgICAgICAgICAkTW9udGggID0gMTsKICAgICAgICB9CgogICAgICAgICMgRklYTUUgVGltZWhlYWRlciB6dXNhbW1lbmJhdWVuCiAgICAgICAgd2hpbGUgKAogICAgICAgICAgICAhJFRpbWVTdG9wCiAgICAgICAgICAgIHx8ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJFRpbWVTdG9wICkKICAgICAgICAgICAgPCAkVGltZUFic29sdXRTdG9wVW5peFRpbWUKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFRpbWVTdGFydCA9IHNwcmludGYoCiAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQiLAogICAgICAgICAgICAgICAgJFllYXIsICRNb250aCwgJERheSwgJEhvdXIsICRNaW51dGUsICRTZWNvbmQKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnU2Vjb25kJyApIHsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoCiAgICAgICAgICAgICAgICAgICAgJFllYXIsICRNb250aCwgJERheSwgJEhvdXIsICRNaW51dGUsICRTZWNvbmQsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgJENvdW50IC0gMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICIlMDJkOiUwMmQ6JTAyZC0lMDJkOiUwMmQ6JTAyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01pbnV0ZScgKSB7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAwLCAwLCAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBASGVhZGVyTGluZSwKICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAiJTAyZDolMDJkOiUwMmQtJTAyZDolMDJkOiUwMmQiLAogICAgICAgICAgICAgICAgICAgICAgICAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdIb3VyJyApIHsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoCiAgICAgICAgICAgICAgICAgICAgJFllYXIsICRNb250aCwgJERheSwgJEhvdXIsICRNaW51dGUsICRTZWNvbmQsIDAsICRDb3VudCwgMCwKICAgICAgICAgICAgICAgICAgICAtMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgIHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICIlMDJkOiUwMmQ6JTAyZC0lMDJkOiUwMmQ6JTAyZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEVsZW1lbnQtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRZZWFyLCAkTW9udGgsICREYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAkQ291bnQsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJERvdyA9IERheV9vZl9XZWVrKCAkWWVhciwgJE1vbnRoLCAkRGF5ICk7CiAgICAgICAgICAgICAgICAkRG93ID0gRGF5X29mX1dlZWtfQWJicmV2aWF0aW9uKCREb3cpOwogICAgICAgICAgICAgICAgaWYgKCAkVG9EYXkgZXEgJERheSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCAiJERvdyAkRGF5IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMmQuJTAyZC4lMDRkIC0gJTAyZC4lMDJkLiUwNGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERheSwgJE1vbnRoLCAkWWVhciwgJFRvRGF5LCAkVG9Nb250aCwgJFRvWWVhcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRWxlbWVudC0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnTW9udGgnICkgewogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5ICkgPSBBZGRfRGVsdGFfWU1EKCAkWWVhciwgJE1vbnRoLCAkRGF5LCAwLCAkQ291bnQsIDAgKTsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoCiAgICAgICAgICAgICAgICAgICAgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJEhvdXIsICRNaW51dGUsICRTZWNvbmQsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgICAgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkVG9Nb250aCBlcSAkTW9udGggKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgIiRNb250aEFycmF5UmVmLT5bJE1vbnRoXSAkTW9udGgiOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlckxpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJTAyZC4lMDJkLiUwNGQgLSAlMDJkLiUwMmQuJTA0ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF5LCAkTW9udGgsICRZZWFyLCAkVG9EYXksICRUb01vbnRoLCAkVG9ZZWFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbGVtZW50LT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdZZWFyJyApIHsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSApID0gQWRkX0RlbHRhX1lNRCggJFllYXIsICRNb250aCwgJERheSwgJENvdW50LCAwLCAwICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRIb3VyLCAkTWludXRlLCAkU2Vjb25kLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAgIC0xCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFRvWWVhciBlcSAkWWVhciApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCAkWWVhcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwMmQuJTAyZC4lMDRkIC0gJTAyZC4lMDJkLiUwNGQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERheSwgJE1vbnRoLCAkWWVhciwgJFRvRGF5LCAkVG9Nb250aCwgJFRvWWVhcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKCAkWWVhciwgJE1vbnRoLCAkRGF5LCAkSG91ciwgJE1pbnV0ZSwgJFNlY29uZCApCiAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAkVGltZVN0b3AgPSBzcHJpbnRmKAogICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIiwKICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBAeyAkWHZhbHVlLT57U2VsZWN0ZWRWYWx1ZXN9IH0sCiAgICAgICAgICAgICAgICB7IFRpbWVTdGFydCA9PiAkVGltZVN0YXJ0LCBUaW1lU3RvcCA9PiAkVGltZVN0b3AgfQogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBGSVhNRSBFTkRFIFRpbWVIZWFkZXIgenVzYW1tZW5iYWVuCgogICAgICAgICRYdmFsdWUtPntCbG9ja30gID0gJ1RpbWUnOwogICAgICAgICRYdmFsdWUtPntWYWx1ZXN9ID0gJEVsZW1lbnQtPntWYWx1ZXN9OwogICAgfQoKICAgICMgaWYgQmxvY2sgZXF1YWwgTXVsdGlTZWxlY3RGaWVsZCwgU2VsZWN0ZmllbGQKICAgIGVsc2UgewogICAgICAgICRYdmFsdWUgPSAkRWxlbWVudDsKCiAgICAgICAgIyBidWlsZCB0aGUgaGVhZGVybGluZQoKICAgICAgICBmb3IgbXkgJFZhbHVlbmFtZSAoIEB7ICRYdmFsdWUtPntTZWxlY3RlZFZhbHVlc30gfSApIHsKICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgJFh2YWx1ZS0+e1ZhbHVlc317JFZhbHVlbmFtZX07CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IHRoZSB2YWx1ZSBzZXJpZXMKICAgIG15ICVWYWx1ZVNlcmllczsKICAgIG15IEBBcnJheVNlbGVjdGVkOwogICAgbXkgJENvbHVtbk5hbWUgPSAnJzsKCiAgICAjIGdpdmUgbWUgYWxsIHBvc3NpbGJlIGVsZW1lbnRzIGZvciBWYWx1ZSBTZXJpZXMKICAgIFJFRjE6CiAgICBmb3IgbXkgJFJlZjEgKCBAeyAkUGFyYW17VXNlQXNWYWx1ZVNlcmllc30gfSApIHsKCiAgICAgICAgIyBhbGwgZWxlbWVudHMgd2hpY2ggYXJlIHNob3duIHdpdGggbXVsdGlzZWxlY3RmaWVsZHMKICAgICAgICBpZiAoICRSZWYxLT57QmxvY2t9IG5lICdUaW1lJyApIHsKICAgICAgICAgICAgbXkgJVNlbGVjdGVkVmFsdWVzOwogICAgICAgICAgICBmb3IgbXkgJFJlZjIgKCBAeyAkUmVmMS0+e1NlbGVjdGVkVmFsdWVzfSB9ICkgewogICAgICAgICAgICAgICAgJFNlbGVjdGVkVmFsdWVzeyRSZWYyfSA9ICRSZWYxLT57VmFsdWVzfXskUmVmMn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEBBcnJheVNlbGVjdGVkLAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFZhbHVlcyAgPT4gXCVTZWxlY3RlZFZhbHVlcywKICAgICAgICAgICAgICAgICAgICBFbGVtZW50ID0+ICRSZWYxLT57RWxlbWVudH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICA9PiAkUmVmMS0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgIEJsb2NrICAgPT4gJFJlZjEtPntCbG9ja30sCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgUkVGMTsKICAgICAgICB9CgogICAgICAgICMgdGltZXNjYWxlIGVsZW1lbnRzIG5lZWQgYSBzcGVjaWFsIGhhbmRsaW5nCiAgICAgICAgQEhlYWRlckxpbmUgPSAoKTsKCiAgICAgICAgIyB0aGVzZSBhbGwgbWFrZXMgb25seSBzZW5zZSwgaWYgdGhlIGNvdW50IG9mIHhheGlzIGlzIDEKICAgICAgICBpZiAoICRSZWYxLT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdZZWFyJyApIHsKICAgICAgICAgICAgaWYgKCAkQ291bnQgPT0gMSApIHsKICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMTIgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgIiRNb250aEFycmF5UmVmLT5bJF9dICRfIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAoIG15ICRNb250aCA9IDE7ICRNb250aCA8IDEyOyAkTW9udGggKz0gJENvdW50ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJMaW5lLAogICAgICAgICAgICAgICAgICAgICAgICAiJE1vbnRoQXJyYXlSZWYtPlskTW9udGhdIC0gJE1vbnRoQXJyYXlSZWYtPlskTW9udGggKyAkQ291bnQgLSAxXSIKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICRWU1NlY29uZCAgID0gMDsKICAgICAgICAgICAgJFZTTWludXRlICAgPSAwOwogICAgICAgICAgICAkVlNIb3VyICAgICA9IDA7CiAgICAgICAgICAgICRWU0RheSAgICAgID0gMTsKICAgICAgICAgICAgJFZTTW9udGggICAgPSAxOwogICAgICAgICAgICAkQ29sdW1uTmFtZSA9ICdZZWFyJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVmMS0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnTW9udGgnICkgewoKICAgICAgICAgICAgJENvdW50ID0gMTsKICAgICAgICAgICAgZm9yICggMSAuLiAzMSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQEhlYWRlckxpbmUsICRfOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkVlNTZWNvbmQgICA9IDA7CiAgICAgICAgICAgICRWU01pbnV0ZSAgID0gMDsKICAgICAgICAgICAgJFZTSG91ciAgICAgPSAwOwogICAgICAgICAgICAkVlNEYXkgICAgICA9IDE7CiAgICAgICAgICAgICRDb2x1bW5OYW1lID0gJ01vbnRoJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVmMS0+e1NlbGVjdGVkVmFsdWVzfVswXSBlcSAnRGF5JyApIHsKICAgICAgICAgICAgZm9yICggbXkgJEhvdXIgPSAwOyAkSG91ciA8IDI0OyAkSG91ciArPSAkQ291bnQgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCBzcHJpbnRmKCAiJTAyZDowMDowMC0lMDJkOjU5OjU5IiwgJEhvdXIsICRIb3VyICsgJENvdW50IC0gMSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRWU1NlY29uZCAgID0gMDsKICAgICAgICAgICAgJFZTTWludXRlICAgPSAwOwogICAgICAgICAgICAkVlNIb3VyICAgICA9IDA7CiAgICAgICAgICAgICRDb2x1bW5OYW1lID0gJ0RheSc7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0hvdXInICkgewogICAgICAgICAgICBmb3IgKCBteSAkTWludXRlID0gMDsgJE1pbnV0ZSA8IDYwOyAkTWludXRlICs9ICRDb3VudCApIHsKICAgICAgICAgICAgICAgIG15ICRUaW1lID0gJ21pbiAnIC4gJE1pbnV0ZSAuICcgLSAnIC4gKCAkTWludXRlICsgJENvdW50ICk7CiAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCAkVGltZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkVlNTZWNvbmQgICA9IDA7CiAgICAgICAgICAgICRWU01pbnV0ZSAgID0gMDsKICAgICAgICAgICAgJENvbHVtbk5hbWUgPSAnSG91cic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01pbnV0ZScgKSB7CiAgICAgICAgICAgIGlmICggJENvdW50ID09IDEgKSB7CiAgICAgICAgICAgICAgICBmb3IgKCAwIC4uIDU5ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRUaW1lID0gJ3NlYyAnIC4gJF87CiAgICAgICAgICAgICAgICAgICAgcHVzaCBASGVhZGVyTGluZSwgJFRpbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKCBteSAkU2Vjb25kID0gMDsgJFNlY29uZCA8IDYwOyAkU2Vjb25kICs9ICRDb3VudCApIHsKICAgICAgICAgICAgICAgICAgICBteSAkVGltZSA9ICdzZWMgJyAuICRTZWNvbmQgLiAnLScgLiAoICRTZWNvbmQgKyAkQ291bnQgKTsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBIZWFkZXJMaW5lLCAkVGltZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkVlNTZWNvbmQgICA9IDA7CiAgICAgICAgICAgICRDb2x1bW5OYW1lID0gJ01pbnV0ZSc7CiAgICAgICAgfQoKICAgICAgICBteSAkVGltZVN0YXJ0ICAgICA9IDA7CiAgICAgICAgbXkgJFRpbWVTdG9wICAgICAgPSAwOwogICAgICAgIG15ICRNb250aEFycmF5UmVmID0gX01vbnRoQXJyYXkoKTsKCiAgICAgICAgJENvdW50ID0gMTsKCiAgICAgICAgIyBHZW5lcmF0ZSB0aGUgdGltZSB2YWx1ZSBzZXJpZXMKICAgICAgICBteSAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICk7CgogICAgICAgIGlmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ1llYXInICkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgICAgICA8ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGltZVN0YXJ0ID0gc3ByaW50ZiggIiUwNGQtMDEtMDEgMDA6MDA6MDAiLCAkVlNZZWFyICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXkgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX1lNRCggJFZTWWVhciwgJFZTTW9udGgsICRWU0RheSwgJENvdW50LCAwLCAwICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIC0xCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaW1lU3RvcCA9IHNwcmludGYoICIlMDRkLTEyLTMxIDIzOjU5OjU5IiwgJFRvWWVhciApOwoKICAgICAgICAgICAgICAgICRWYWx1ZVNlcmllc3skVlNZZWFyfSA9IHsKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0b3B9ICA9PiAkVGltZVN0b3AsCiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdGFydH0gPT4gJFRpbWVTdGFydAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ01vbnRoJyApIHsKICAgICAgICAgICAgd2hpbGUgKAogICAgICAgICAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkVGltZVN0b3AgKQogICAgICAgICAgICAgICAgPCAkVGltZUFic29sdXRTdG9wVW5peFRpbWUKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpbWVTdGFydCA9IHNwcmludGYoICIlMDRkLSUwMmQtMDEgMDA6MDA6MDAiLCAkVlNZZWFyLCAkVlNNb250aCApOwogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5ICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ZTUQoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksIDAsICRDb3VudCwgMCApOwogICAgICAgICAgICAgICAgKCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVlNIb3VyLCAkVlNNaW51dGUsICRWU1NlY29uZCwgMCwKICAgICAgICAgICAgICAgICAgICAwLCAwLCAtMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGltZVN0b3AgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgMjM6NTk6NTkiLCAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5ICk7CgogICAgICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgaWYgKCRDb3VudCA9PSAxKSB7CiAgICAgICAgICAgICAgICAkVmFsdWVTZXJpZXN7CiAgICAgICAgICAgICAgICAgICAgJFZTWWVhciAuICctJwogICAgICAgICAgICAgICAgICAgICAgICAuIHNwcmludGYoICIlMDJkIiwgJFZTTW9udGggKSAuICcgJwogICAgICAgICAgICAgICAgICAgICAgICAuICRNb250aEFycmF5UmVmLT5bJFZTTW9udGhdCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgID0gewogICAgICAgICAgICAgICAgICAgICRSZWYxLT57VmFsdWVzfXtUaW1lU3RvcH0gID0+ICRUaW1lU3RvcCwKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0YXJ0fSA9PiAkVGltZVN0YXJ0CiAgICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0RheScgKSB7CiAgICAgICAgICAgIHdoaWxlICgKICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJFRpbWVTdG9wICkKICAgICAgICAgICAgICAgIDwgJFRpbWVBYnNvbHV0U3RvcFVuaXhUaW1lCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaW1lU3RhcnQgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgMDA6MDA6MDAiLCAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5ICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kLAogICAgICAgICAgICAgICAgICAgICRDb3VudCwgMCwgMCwgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpbWVTdG9wID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkIDIzOjU5OjU5IiwgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSApOwoKICAgICAgICAgICAgICAgICMgICAgICAgICAgICAgICAgICAgIGlmICgkQ291bnQgPT0gMSkgewogICAgICAgICAgICAgICAgJFZhbHVlU2VyaWVzeyBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQiLCAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5ICkgfSA9IHsKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0b3B9ICA9PiAkVGltZVN0b3AsCiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdGFydH0gPT4gJFRpbWVTdGFydAogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFJlZjEtPntTZWxlY3RlZFZhbHVlc31bMF0gZXEgJ0hvdXInICkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgICAgICA8ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGltZVN0YXJ0CiAgICAgICAgICAgICAgICAgICAgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDowMDowMCIsICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIgKTsKICAgICAgICAgICAgICAgICggJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciwgJFRvTWludXRlLCAkVG9TZWNvbmQgKQogICAgICAgICAgICAgICAgICAgID0gQWRkX0RlbHRhX0RITVMoCiAgICAgICAgICAgICAgICAgICAgJFZTWWVhciwgJFZTTW9udGgsICRWU0RheSwgJFZTSG91ciwgJFZTTWludXRlLCAkVlNTZWNvbmQsIDAsCiAgICAgICAgICAgICAgICAgICAgJENvdW50LCAwLCAtMQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVGltZVN0b3AKICAgICAgICAgICAgICAgICAgICA9IHNwcmludGYoICIlMDRkLSUwMmQtJTAyZCAlMDJkOjU5OjU5IiwgJFRvWWVhciwgJFRvTW9udGgsICRUb0RheSwgJFRvSG91ciApOwogICAgICAgICAgICAgICAgJFZhbHVlU2VyaWVzewogICAgICAgICAgICAgICAgICAgIHNwcmludGYoCiAgICAgICAgICAgICAgICAgICAgICAgICIlMDRkLSUwMmQtJTAyZCAlMDJkOjAwOjAwIC0gJTAyZDo1OTo1OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRUb0hvdXIKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICA9IHsKICAgICAgICAgICAgICAgICAgICAkUmVmMS0+e1ZhbHVlc317VGltZVN0b3B9ICA9PiAkVGltZVN0b3AsCiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdGFydH0gPT4gJFRpbWVTdGFydAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAoICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsIDAsIDEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBlbHNpZiAoICRSZWYxLT57U2VsZWN0ZWRWYWx1ZXN9WzBdIGVxICdNaW51dGUnICkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaW1lU3RvcCApCiAgICAgICAgICAgICAgICA8ICRUaW1lQWJzb2x1dFN0b3BVbml4VGltZQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGltZVN0YXJ0ID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjAwIiwKICAgICAgICAgICAgICAgICAgICAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5LCAkVlNIb3VyLCAkVlNNaW51dGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAoICRUb1llYXIsICRUb01vbnRoLCAkVG9EYXksICRUb0hvdXIsICRUb01pbnV0ZSwgJFRvU2Vjb25kICkKICAgICAgICAgICAgICAgICAgICA9IEFkZF9EZWx0YV9ESE1TKAogICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFZTU2Vjb25kLCAwLAogICAgICAgICAgICAgICAgICAgIDAsICRDb3VudCwgLTEKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFRpbWVTdG9wID0gc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOjU5IiwKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkVmFsdWVTZXJpZXN7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigKICAgICAgICAgICAgICAgICAgICAgICAgIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDowMCAtICUwMmQ6JTAyZDo1OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICRWU1llYXIsICRWU01vbnRoLCAkVlNEYXksICRWU0hvdXIsICRWU01pbnV0ZSwgJFRvSG91ciwgJFRvTWludXRlCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgPSB7CiAgICAgICAgICAgICAgICAgICAgJFJlZjEtPntWYWx1ZXN9e1RpbWVTdG9wfSAgPT4gJFRpbWVTdG9wLAogICAgICAgICAgICAgICAgICAgICRSZWYxLT57VmFsdWVzfXtUaW1lU3RhcnR9ID0+ICRUaW1lU3RhcnQKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgKCAkVlNZZWFyLCAkVlNNb250aCwgJFZTRGF5LCAkVlNIb3VyLCAkVlNNaW51dGUsICRWU1NlY29uZCApCiAgICAgICAgICAgICAgICAgICAgPSBBZGRfRGVsdGFfREhNUygKICAgICAgICAgICAgICAgICAgICAkVG9ZZWFyLCAkVG9Nb250aCwgJFRvRGF5LCAkVG9Ib3VyLCAkVG9NaW51dGUsICRUb1NlY29uZCwgMCwKICAgICAgICAgICAgICAgICAgICAwLCAwLCAxCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICB9CiAgICB9CgogICAgIyBtZXJnZSB0aGUgYXJyYXkgaWYgdHdvIGVsZW1lbnRzIGZvciB0aGUgdmFsdWVzZXJpZXMgYXJlIGF2aWFsYWJsZQogICAgS0VZOgogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7ICRBcnJheVNlbGVjdGVkWzBde1ZhbHVlc30gfSApIHsKICAgICAgICBteSAkVmFsdWUwOwogICAgICAgIGlmICggJEFycmF5U2VsZWN0ZWRbMF17QmxvY2t9IGVxICdTZWxlY3RGaWVsZCcgKSB7CiAgICAgICAgICAgICRWYWx1ZTAgPSAkS2V5OwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRBcnJheVNlbGVjdGVkWzBde0Jsb2NrfSBlcSAnTXVsdGlTZWxlY3RGaWVsZCcgKSB7CiAgICAgICAgICAgICRWYWx1ZTAgPSBbJEtleV07CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkQXJyYXlTZWxlY3RlZFsxXSApIHsKICAgICAgICAgICAgJFZhbHVlU2VyaWVzeyAkQXJyYXlTZWxlY3RlZFswXXtWYWx1ZXN9eyRLZXl9IH0KICAgICAgICAgICAgICAgID0geyAkQXJyYXlTZWxlY3RlZFswXXtFbGVtZW50fSA9PiAkVmFsdWUwIH07CiAgICAgICAgICAgIG5leHQgS0VZOwogICAgICAgIH0KCiAgICAgICAgZm9yIG15ICRTdWJLZXkgKCBrZXlzICV7ICRBcnJheVNlbGVjdGVkWzFde1ZhbHVlc30gfSApIHsKICAgICAgICAgICAgbXkgJFZhbHVlMTsKICAgICAgICAgICAgaWYgKCAkQXJyYXlTZWxlY3RlZFsxXXtCbG9ja30gZXEgJ1NlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZTEgPSAkU3ViS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEFycmF5U2VsZWN0ZWRbMV17QmxvY2t9IGVxICdNdWx0aVNlbGVjdEZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRWYWx1ZTEgPSBbJFN1YktleV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFZhbHVlU2VyaWVzewogICAgICAgICAgICAgICAgJEFycmF5U2VsZWN0ZWRbMF17VmFsdWVzfXskS2V5fSAuICcgLSAnCiAgICAgICAgICAgICAgICAgICAgLiAkQXJyYXlTZWxlY3RlZFsxXXtWYWx1ZXN9eyRTdWJLZXl9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICA9IHsKICAgICAgICAgICAgICAgICRBcnJheVNlbGVjdGVkWzBde0VsZW1lbnR9ID0+ICRWYWx1ZTAsCiAgICAgICAgICAgICAgICAkQXJyYXlTZWxlY3RlZFsxXXtFbGVtZW50fSA9PiAkVmFsdWUxCiAgICAgICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIFVzZSB0aGlzIGlmIG5vIHZhbHVlc2VyaWVzIGF2YWlsYWJsZQogICAgaWYgKCAhJVZhbHVlU2VyaWVzICkgewogICAgICAgICRWYWx1ZVNlcmllc3sgJFBhcmFte09iamVjdH0gLiAncycgfSA9IHVuZGVmOwogICAgfQoKICAgICMgZ2V0IHRoZSBmaXJzdCBjb2x1bW4gbmFtZSBpbiB0aGUgaGVhZGVybGluZQogICAgaWYgKCRDb2x1bW5OYW1lKSB7CiAgICAgICAgdW5zaGlmdCBASGVhZGVyTGluZSwgJENvbHVtbk5hbWU7CiAgICB9CiAgICBlbHNpZiAoICRBcnJheVNlbGVjdGVkWzFdICkgewogICAgICAgIHVuc2hpZnQoIEBIZWFkZXJMaW5lLCAkQXJyYXlTZWxlY3RlZFswXXtOYW1lfSAuICcgLSAnIC4gJEFycmF5U2VsZWN0ZWRbMV17TmFtZX0gKTsKICAgIH0KICAgIGVsc2lmICggJEFycmF5U2VsZWN0ZWRbMF0gKSB7CiAgICAgICAgdW5zaGlmdCggQEhlYWRlckxpbmUsICRBcnJheVNlbGVjdGVkWzBde05hbWV9IHx8ICcnICk7CiAgICB9CgogICAgIyBwdXNoIHRoZSBmaXJzdCBhcnJheSBlbGVtZW50cyBpbiB0aGUgU3RhdHNBcnJheQogICAgbXkgJFRpdGxlID0gJFBhcmFte1RpdGxlfTsKICAgIGlmICggJFRpdGxlVGltZVN0YXJ0ICYmICRUaXRsZVRpbWVTdG9wICkgewogICAgICAgICRUaXRsZSAuPSAiICRUaXRsZVRpbWVTdGFydC0kVGl0bGVUaW1lU3RvcCI7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIGNhY2hlIHN0cmluZwogICAgbXkgJENhY2hlU3RyaW5nID0gJFNlbGYtPl9HZXRDYWNoZVN0cmluZyglUGFyYW0pOwoKICAgICMgdGFrZSB0aGUgY2FjaGUgdmFsdWUgaWYgY29uZmlndXJlZCBhbmQgYXZhaWxhYmxlCiAgICBpZiAoICRQYXJhbXtDYWNoZX0gKSB7CiAgICAgICAgbXkgQFN0YXRBcnJheSA9ICRTZWxmLT5fR2V0UmVzdWx0Q2FjaGUoCiAgICAgICAgICAgIEZpbGVuYW1lID0+ICdTdGF0cycgLiAkUGFyYW17U3RhdElEfSAuICctJyAuICRDYWNoZVN0cmluZyAuICcuY2FjaGUnLAogICAgICAgICk7CgogICAgICAgIHJldHVybiBAU3RhdEFycmF5IGlmIEBTdGF0QXJyYXk7CiAgICB9CgogICAgIyBjcmVhdGUgdGhlIHRhYmxlIHN0cnVjdHVyZQogICAgbXkgJVRhYmxlU3RydWN0dXJlOwogICAgZm9yIG15ICRSb3cgKCBzb3J0IGtleXMgJVZhbHVlU2VyaWVzICkgewogICAgICAgIG15IEBDZWxsczsKICAgICAgICBmb3IgbXkgJENlbGwgKCBAeyAkWHZhbHVlLT57U2VsZWN0ZWRWYWx1ZXN9IH0gKSB7ICAgICMgZ2V0IGVhY2ggY2VsbAogICAgICAgICAgICAkVmFsdWVTZXJpZXN7JFJvd30gfHw9IHt9OwogICAgICAgICAgICBteSAlQXR0cmlidXRlcyA9ICggJXsgJFZhbHVlU2VyaWVzeyRSb3d9IH0sICVSZXN0cmljdGlvbkF0dHJpYnV0ZSApOwoKICAgICAgICAgICAgIyB0aGUgZm9sbG93aW5nIGlzIG5lY2Vzc2FyeSBpZiBhcyB4LWF4aXMgYW5kIGFzIHZhbHVlLXNlcmllcyB0aW1lIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggJFh2YWx1ZS0+e0Jsb2NrfSBlcSAnVGltZScgKSB7CiAgICAgICAgICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFh2YWx1ZS0+e1ZhbHVlc317VGltZVN0YXJ0fTsKICAgICAgICAgICAgICAgIG15ICRUaW1lU3RvcCAgPSAkWHZhbHVlLT57VmFsdWVzfXtUaW1lU3RvcH07CiAgICAgICAgICAgICAgICBpZiAoICRWYWx1ZVNlcmllc3skUm93fXskVGltZVN0b3B9ICYmICRWYWx1ZVNlcmllc3skUm93fXskVGltZVN0YXJ0fSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKCBTdHJpbmcgPT4gJENlbGwtPntUaW1lU3RvcH0gKQogICAgICAgICAgICAgICAgICAgICAgICA+ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRWYWx1ZVNlcmllc3skUm93fXskVGltZVN0b3B9CiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoIFN0cmluZyA9PiAkQ2VsbC0+e1RpbWVTdGFydH0gKQogICAgICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlRpbWVTdGFtcDJTeXN0ZW1UaW1lKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRWYWx1ZVNlcmllc3skUm93fXskVGltZVN0YXJ0fQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJEF0dHJpYnV0ZXN7JFRpbWVTdG9wfSAgPSAkQ2VsbC0+e1RpbWVTdG9wfTsKICAgICAgICAgICAgICAgICRBdHRyaWJ1dGVzeyRUaW1lU3RhcnR9ID0gJENlbGwtPntUaW1lU3RhcnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFh2YWx1ZS0+e0Jsb2NrfSBlcSAnU2VsZWN0RmllbGQnICkgewogICAgICAgICAgICAgICAgJEF0dHJpYnV0ZXN7ICRYdmFsdWUtPntFbGVtZW50fSB9ID0gJENlbGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQXR0cmlidXRlc3sgJFh2YWx1ZS0+e0VsZW1lbnR9IH0gPSBbJENlbGxdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQENlbGxzLCBcJUF0dHJpYnV0ZXM7CiAgICAgICAgfQogICAgICAgICRUYWJsZVN0cnVjdHVyZXskUm93fSA9IFxAQ2VsbHM7CiAgICB9CgogICAgbXkgQERhdGFBcnJheTsKICAgIGlmICggJFN0YXRPYmplY3QtPmNhbignR2V0U3RhdFRhYmxlJykgKSB7CgogICAgICAgICMgZ2V0IHRoZSB3aG9sZSBzdGF0cyB0YWJsZQogICAgICAgIEBEYXRhQXJyYXkgPSAkU3RhdE9iamVjdC0+R2V0U3RhdFRhYmxlKAogICAgICAgICAgICBWYWx1ZVNlcmllcyAgICA9PiAkUGFyYW17VXNlQXNWYWx1ZVNlcmllc30sICAgICNcJVZhbHVlU2VyaWVzLAogICAgICAgICAgICBYVmFsdWUgICAgICAgICA9PiAkWHZhbHVlLAogICAgICAgICAgICBSZXN0cmljdGlvbnMgICA9PiBcJVJlc3RyaWN0aW9uQXR0cmlidXRlLAogICAgICAgICAgICBUYWJsZVN0cnVjdHVyZSA9PiBcJVRhYmxlU3RydWN0dXJlLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBmb3IgbXkgJFJvdyAoIHNvcnQga2V5cyAlVGFibGVTdHJ1Y3R1cmUgKSB7CiAgICAgICAgICAgIG15IEBSZXN1bHRSb3cgPSAoJFJvdyk7CiAgICAgICAgICAgIGZvciBteSAkQ2VsbCAoIEB7ICRUYWJsZVN0cnVjdHVyZXskUm93fSB9ICkgewogICAgICAgICAgICAgICAgbXkgJFF1YW50aXR5ID0gJFN0YXRPYmplY3QtPkdldFN0YXRFbGVtZW50KCAleyRDZWxsfSApOwogICAgICAgICAgICAgICAgcHVzaCBAUmVzdWx0Um93LCAkUXVhbnRpdHk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHVzaCBARGF0YUFycmF5LCBcQFJlc3VsdFJvdzsKICAgICAgICB9CiAgICB9CgogICAgIyBmaWxsIHVwIGVtcHR5IGFycmF5IGVsZW1lbnRzLCBlLmcgbW9udGggYXMgdmFsdWUgc2VyaWVzIChGZWJydWFyeSBoYXMgMjggZGF5IGFuZCBKYW51YXIgMzEpCiAgICBmb3IgbXkgJFJvdyAoQERhdGFBcnJheSkgewogICAgICAgIGZvciBteSAkSW5kZXggKCAxIC4uICQjSGVhZGVyTGluZSApIHsKICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkUm93LT5bJEluZGV4XSApIHsKICAgICAgICAgICAgICAgICRSb3ctPlskSW5kZXhdID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBSRU1BUks6IGl0IGNvdWxkIGJlIGFsc28gdXNlZnVsIHRvIHVzZSB0aGUgaW5kaXZpdWFsIHNvcnQgaWYgZGlmaW5lZAogICAgIyBzbyB5b3UgZG9uJ3QgbmVlZCB0aGlzIGZ1bmN0aW9uCiAgICBpZiAoICRTdGF0T2JqZWN0LT5jYW4oJ0dldEhlYWRlckxpbmUnKSApIHsKICAgICAgICBteSAkSGVhZGVyUmVmID0gJFN0YXRPYmplY3QtPkdldEhlYWRlckxpbmUoCiAgICAgICAgICAgIFhWYWx1ZSA9PiAkWHZhbHVlLAogICAgICAgICk7CgogICAgICAgIGlmICgkSGVhZGVyUmVmKSB7CiAgICAgICAgICAgIEBIZWFkZXJMaW5lID0gQHskSGVhZGVyUmVmfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgQFN0YXRBcnJheSA9ICggWyRUaXRsZV0sIFxASGVhZGVyTGluZSwgQERhdGFBcnJheSApOwoKICAgIHJldHVybiBAU3RhdEFycmF5IGlmICEkUGFyYW17Q2FjaGV9OwoKICAgICMgY2hlY2sgaWYgd2Ugc2hvdWxkIGNhY2hlIHRoaXMgcmVzdWx0CiAgICAjIGdldCB0aGUgY3VycmVudCB0aW1lCiAgICBpZiAoICEkVGl0bGVUaW1lU3RhcnQgfHwgISRUaXRsZVRpbWVTdG9wICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlID0+CiAgICAgICAgICAgICAgICAiQ2FuJ3QgY2FjaGU6IFN0YXRJRCAkUGFyYW17U3RhdElEfSBoYXZlIG5vIHRpbWUgcGVyaW9kLCBzbyB5b3UgY2FuJ3QgY2FjaGUgdGhlIHN0YXQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybiBAU3RhdEFycmF5OwogICAgfQoKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSggU3RyaW5nID0+ICRUaXRsZVRpbWVTdG9wICkKICAgICAgICA+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICkKICAgIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJDYW4ndCBjYWNoZSBTdGF0SUQgJFBhcmFte1N0YXRJRH06IFRoZSBzZWxlY3RlZCBlbmQgdGltZSBpcyBpbiB0aGUgZnV0dXJlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQFN0YXRBcnJheTsKICAgIH0KCiAgICAjIHdyaXRlIHRoZSBzdGF0cyBjYWNoZQogICAgJFNlbGYtPl9TZXRSZXN1bHRDYWNoZSgKICAgICAgICBGaWxlbmFtZSA9PiAnU3RhdHMnIC4gJFBhcmFte1N0YXRJRH0gLiAnLScgLiAkQ2FjaGVTdHJpbmcgLiAnLmNhY2hlJywKICAgICAgICBSZXN1bHQgICA9PiBcQFN0YXRBcnJheSwKICAgICk7CiAgICByZXR1cm4gQFN0YXRBcnJheTsKfQoKc3ViIF9Xcml0ZVJlc3VsdENhY2hlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUdldFBhcmFtID0gJXsgJFBhcmFte0dldFBhcmFtfSB9OwoKICAgICMgY2hlY2sgaWYgd2Ugc2hvdWxkIGNhY2hlIHRoaXMgcmVzdWx0CiAgICAjIGdldCB0aGUgY3VycmVudCB0aW1lCiAgICBteSAoICRzLCAkbSwgJGgsICRELCAkTSwgJFkgKSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUyRGF0ZSgKICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICk7CgogICAgIyBpZiBnZXQgcGFyYW1zIGluIGZ1dHVyZSBkbyBub3QgY2FjaGUKICAgIGlmICggJEdldFBhcmFte1llYXJ9ICYmICRHZXRQYXJhbXtNb250aH0gKSB7CiAgICAgICAgcmV0dXJuIGlmICRHZXRQYXJhbXtZZWFyfSA+ICRZOwogICAgICAgIHJldHVybiBpZiAkR2V0UGFyYW17WWVhcn0gPT0gJFkgJiYgJEdldFBhcmFte01vbnRofSA+ICRNOwogICAgICAgIHJldHVybgogICAgICAgICAgICBpZiAkR2V0UGFyYW17WWVhcn0gPT0gJFkKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtNb250aH0gPT0gJE0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtEYXl9CiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17RGF5fSA+PSAkRDsKICAgIH0KCiAgICAjIHdyaXRlIGNhY2hlIGZpbGUKICAgIG15ICRGaWxlbmFtZSA9ICRTZWxmLT5fQ3JlYXRlU3RhdGljUmVzdWx0Q2FjaGVGaWxlbmFtZSgKICAgICAgICBHZXRQYXJhbSA9PiAkUGFyYW17R2V0UGFyYW19LAogICAgICAgIFN0YXRJRCAgID0+ICRQYXJhbXtTdGF0SUR9LAogICAgKTsKCiAgICAkU2VsZi0+X1NldFJlc3VsdENhY2hlKAogICAgICAgIEZpbGVuYW1lID0+ICRGaWxlbmFtZSwKICAgICAgICBSZXN1bHQgICA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfQ3JlYXRlU3RhdGljUmVzdWx0Q2FjaGVGaWxlbmFtZSgpCgpjcmVhdGUgYSBmaWxlbmFtZSBvdXQgb2YgdGhlIEdldFBhcmFtIGluZm9ybWF0aW9uIGFuZCB0aGUgc3RhdCBpZAoKICAgIG15ICRGaWxlbmFtZSA9ICRTdGF0c09iamVjdC0+X0NyZWF0ZVN0YXRpY1Jlc3VsdENhY2hlRmlsZW5hbWUoCiAgICAgICAgR2V0UGFyYW0gPT4gewogICAgICAgICAgICBZZWFyICA9PiAyMDA4LAogICAgICAgICAgICBNb250aCA9PiAzLAogICAgICAgICAgICBEYXkgICA9PiA1CiAgICAgICAgfSwKICAgICAgICBTdGF0SUQgICA9PiAkUGFyYW17U3RhdElEfSwKICAgICk7Cgo9Y3V0CgpzdWIgX0NyZWF0ZVN0YXRpY1Jlc3VsdENhY2hlRmlsZW5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGZvciBteSAkTmVlZGVkUGFyYW0gKHF3KCBTdGF0SUQgR2V0UGFyYW0gKSkgewogICAgICAgIGlmICggISRQYXJhbXskTmVlZGVkUGFyYW19ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkTmVlZGVkUGFyYW0hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRHZXRQYXJhbVJlZiA9ICRQYXJhbXtHZXRQYXJhbX07CgogICAgIyBmb3JtYXQgbW9udGggYW5kIGRheSBwYXJhbXMKICAgIGZvciAocXcoTW9udGggRGF5KSkgewogICAgICAgIGlmICggJEdldFBhcmFtUmVmLT57JF99ICkgewogICAgICAgICAgICAkR2V0UGFyYW1SZWYtPnskX30gPSBzcHJpbnRmKCAiJTAyZCIsICRHZXRQYXJhbVJlZi0+eyRffSApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkS2V5ID0gJyc7CiAgICBpZiAoICRHZXRQYXJhbVJlZi0+e1llYXJ9ICkgewogICAgICAgICRLZXkgLj0gJEdldFBhcmFtUmVmLT57WWVhcn07CiAgICB9CiAgICBpZiAoICRHZXRQYXJhbVJlZi0+e01vbnRofSApIHsKICAgICAgICAkS2V5IC49ICItJEdldFBhcmFtUmVmLT57TW9udGh9IjsKICAgIH0KICAgIGlmICggJEdldFBhcmFtUmVmLT57RGF5fSApIHsKICAgICAgICAkS2V5IC49ICItJEdldFBhcmFtUmVmLT57RGF5fSI7CiAgICB9CgogICAgbXkgJE1ENUtleSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVuYW1lQ2xlYW5VcCgKICAgICAgICBGaWxlbmFtZSA9PiAkS2V5LAogICAgICAgIFR5cGUgICAgID0+ICdtZDUnLAogICAgKTsKCiAgICByZXR1cm4gJ1N0YXRzJyAuICRQYXJhbXtTdGF0SUR9IC4gJy0nIC4gJE1ENUtleSAuICcuY2FjaGUnOwp9Cgo9aXRlbSBfU2V0UmVzdWx0Q2FjaGUoKQoKd3JpdGUgdGhlIHJlc3VsdCBhcnJheSBhcyBjYWNoZSBpbiB0aGUgZmlsZXN5c3RlbQoKICAgICRTdGF0c09iamVjdC0+X1NldFJlc3VsdENhY2hlKAogICAgICAgIEZpbGVuYW1lID0+ICdTdGF0cycgLiAkUGFyYW17U3RhdElEfSAuICctJyAuICRNRDVLZXkgLiAnLmNhY2hlJywKICAgICAgICBSZXN1bHQgICA9PiAkUGFyYW17RGF0YX0sCiAgICApOwoKPWN1dAoKc3ViIF9TZXRSZXN1bHRDYWNoZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgZm9yIG15ICROZWVkZWRQYXJhbSAocXcoIEZpbGVuYW1lIFJlc3VsdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JE5lZWRlZFBhcmFtfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJE5lZWRlZFBhcmFtISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNvbnZlcnQgdGhlIHJlc3VsdCBhcnJheSBpbnRvIGEgY3N2IHN0cmluZwogICAgbXkgJENTVlN0cmluZyA9ICRTZWxmLT57Q1NWT2JqZWN0fS0+QXJyYXkyQ1NWKCBEYXRhID0+ICRQYXJhbXtSZXN1bHR9LCApOwogICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVPdXRwdXQoIFwkQ1NWU3RyaW5nICk7CgogICAgIyB3cml0ZSB0aGUgY3N2IHN0cmluZyBpbnRvIHRoZSBmaWxlc3lzdGVtCiAgICBteSAkRmlsZWhhbmRsZTsKICAgIG15ICRQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKTsKICAgIGlmICggIW9wZW4gJEZpbGVoYW5kbGUsICc+JywgIiRQYXRoLyRQYXJhbXtGaWxlbmFtZX0iICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3Qgd3JpdGU6ICRQYXRoLyRQYXJhbXtGaWxlbmFtZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBiaW5tb2RlICRGaWxlaGFuZGxlOwogICAgcHJpbnQgJEZpbGVoYW5kbGUgJENTVlN0cmluZzsKICAgIGNsb3NlICRGaWxlaGFuZGxlOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfR2V0UmVzdWx0Q2FjaGUoKQoKZ2V0IHRoZSByZXN1bHQgYXJyYXkgY2FjaGUgb3V0IG9mIHRoZSBmaWxlc3lzdGVtCgogICAgbXkgQFJlc3VsdCA9ICRTdGF0c09iamVjdC0+X0dldFJlc3VsdENhY2hlKAogICAgICAgIEZpbGVuYW1lID0+ICdTdGF0cycgLiAkUGFyYW17U3RhdElEfSAuICctJyAuICRNRDVLZXkgLiAnLmNhY2hlJywKICAgICk7Cgo9Y3V0CgpzdWIgX0dldFJlc3VsdENhY2hlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgcGFyYW1zCiAgICBpZiAoICEkUGFyYW17RmlsZW5hbWV9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnX0dldFJlc3VsdENhY2hlOiBOZWVkIEZpbGVuYW1lIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFBhdGggICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUZW1wRGlyJyk7CiAgICBteSAkQ1NWU3RyaW5nID0gJyc7CiAgICBpZiAoIG9wZW4gbXkgJEZpbGVoYW5kbGUsICc8JywgIiRQYXRoLyRQYXJhbXtGaWxlbmFtZX0iICkgewogICAgICAgIGJpbm1vZGUgJEZpbGVoYW5kbGU7CiAgICAgICAgd2hpbGUgKDwkRmlsZWhhbmRsZT4pIHsKICAgICAgICAgICAgJENTVlN0cmluZyAuPSAkXzsKICAgICAgICB9CiAgICAgICAgY2xvc2UgJEZpbGVoYW5kbGU7CiAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVJbnB1dCggXCRDU1ZTdHJpbmcgKTsKICAgIH0KCiAgICBteSAkUmVzdWx0UmVmID0gJFNlbGYtPntDU1ZPYmplY3R9LT5DU1YyQXJyYXkoCiAgICAgICAgU3RyaW5nICAgID0+ICRDU1ZTdHJpbmcsCiAgICAgICAgU2VwYXJhdG9yID0+ICc7JywKICAgICAgICBRdW90ZSAgICAgPT4gJyInLAogICAgKTsKCiAgICByZXR1cm4gQHskUmVzdWx0UmVmfTsKfQoKc3ViIF9EZWxldGVDYWNoZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXRoID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RlbXBEaXInKTsKCiAgICBpZiAoICRQYXRoICF+IG17Xi4qXC8kfXggKSB7CiAgICAgICAgJFBhdGggLj0gJy8nOwogICAgfQoKICAgIG15IEBGaWxlcyA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkRpcmVjdG9yeVJlYWQoCiAgICAgICAgRGlyZWN0b3J5ID0+ICRQYXRoLAogICAgICAgIEZpbHRlciAgICA9PiAnU3RhdHMnIC4gJFBhcmFte1N0YXRJRH0gLiAnLSouY2FjaGUnLAogICAgKTsKCiAgICBmb3IgbXkgJEZpbGUgKEBGaWxlcykgewogICAgICAgIHVubGluayAkRmlsZTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX01vbnRoQXJyYXkgewogICAgbXkgQE1vbnRoQXJyYXkgPSAoCiAgICAgICAgJycsICdKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYycsCiAgICApOwoKICAgIHJldHVybiBcQE1vbnRoQXJyYXk7Cn0KCnN1YiBfQXV0b21hdGljU2FtcGxlSW1wb3J0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExhbmd1YWdlICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0TGFuZ3VhZ2UnKTsKICAgIG15ICREaXJlY3RvcnkgPSAkU2VsZi0+e1N0YXRzVGVtcERpcn07CgogICAgaWYgKCAhb3BlbmRpciggRElSRSwgJERpcmVjdG9yeSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuIG5vdCBvcGVuIERpcmVjdG9yeTogJERpcmVjdG9yeSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBzdGF0cyBpbiB0aGUgZGVmYXVsdCBsYW5ndWFnZSBhdmFpbGFibGUsIGlmIG5vdCB1c2UgZW4KICAgIG15ICRGbGFnID0gMDsKICAgIHdoaWxlICggZGVmaW5lZCggbXkgJEZpbGVuYW1lID0gcmVhZGRpciBESVJFICkgKSB7CiAgICAgICAgaWYgKCAkRmlsZW5hbWUgPX4gbXteLipcLiRMYW5ndWFnZVwueG1sJH14ICkgewogICAgICAgICAgICAkRmxhZyA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJld2luZGRpcihESVJFKTsKICAgIGlmICggISRGbGFnICkgewogICAgICAgICRMYW5ndWFnZSA9ICdlbic7CiAgICB9CgogICAgd2hpbGUgKCBkZWZpbmVkKCBteSAkRmlsZW5hbWUgPSByZWFkZGlyIERJUkUgKSApIHsKICAgICAgICBpZiAoICRGaWxlbmFtZSA9fiBte14uKlwuJExhbmd1YWdlXC54bWwkfXggKSB7CgogICAgICAgICAgICAjIGNoZWNrIGZpbGVzaXplCiAgICAgICAgICAgICMgICAgICAgICAgICBteSAkRmlsZXNpemUgPSAtcyAkRGlyZWN0b3J5LiRGaWxlbmFtZTsKICAgICAgICAgICAgIyAgICAgICAgICAgIGlmICgkRmlsZXNpemUgPiAkTWF4RmlsZXNpemUpIHsKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICBwcmludCAiRmlsZTogJEZpbGVuYW1lIHRvIGJpZyEgbWF4LiAkTWF4RmlsZXNpemUgYnl0ZSBhbGxvd2VkLlxuIjsKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAkQ29tbW9uT2JqZWN0e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgIyAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSA9PiAiQ2FuJ3QgZmlsZSBpbXBvcnRlZDogJERpcmVjdG9yeS4kRmlsZW5hbWUiLAogICAgICAgICAgICAjICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICMgICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgIyAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmVhZCBmaWxlCiAgICAgICAgICAgIG15ICRGaWxlaGFuZGxlOwogICAgICAgICAgICBpZiAoICFvcGVuICRGaWxlaGFuZGxlLCAnPCcsICREaXJlY3RvcnkgLiAkRmlsZW5hbWUgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gbm90IG9wZW4gRmlsZTogIiAuICREaXJlY3RvcnkgLiAkRmlsZW5hbWUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgY2xvc2VkaXIoRElSRSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIHdoaWxlICg8JEZpbGVoYW5kbGU+KSB7CiAgICAgICAgICAgICAgICAkQ29udGVudCAuPSAkXzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbG9zZSAkRmlsZWhhbmRsZTsKCiAgICAgICAgICAgIG15ICRTdGF0SUQgPSAkU2VsZi0+SW1wb3J0KCBDb250ZW50ID0+ICRDb250ZW50LCApOwogICAgICAgIH0KICAgIH0KICAgIGNsb3NlZGlyKERJUkUpOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfR2V0Q2FjaGVTdHJpbmcoKQoKcmV0dXJuIHRoZSBjYWNoZSBzdHJpbmcKCiAgICBteSAkUmVzdWx0ID0gJFN0YXRzT2JqZWN0LT5fR2V0Q2FjaGVTdHJpbmcoCiAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAkVXNlQXNYdmFsdWVSZWYKICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+ICRVc2VBc1ZhbHVlU2VyaWVzUmVmLAogICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gJFVzZUFzUmVzdHJpY3Rpb25SZWYsCiAgICApOwoKPWN1dAoKc3ViIF9HZXRDYWNoZVN0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJENhY2hlU3RyaW5nID0gJyc7CgogICAgZm9yIG15ICRVc2UgKHF3KFVzZUFzWHZhbHVlIFVzZUFzVmFsdWVTZXJpZXMgVXNlQXNSZXN0cmljdGlvbikpIHsKICAgICAgICBVU0VSRUY6CiAgICAgICAgZm9yIG15ICRVc2VSZWYgKCBAeyAkUGFyYW17JFVzZX0gfSApIHsKICAgICAgICAgICAgJENhY2hlU3RyaW5nIC49ICdfXycgLiAkVXNlUmVmLT57TmFtZX0gLiAnXyc7CiAgICAgICAgICAgIGlmICggJFVzZVJlZi0+e1NlbGVjdGVkVmFsdWVzfSApIHsKICAgICAgICAgICAgICAgICRDYWNoZVN0cmluZyAuPSBqb2luKCAnXycsIHNvcnQgQHsgJFVzZVJlZi0+e1NlbGVjdGVkVmFsdWVzfSB9ICkKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRVc2VSZWYtPntUaW1lU3RhcnR9ICYmICRVc2VSZWYtPntUaW1lU3RvcH0gKSB7CiAgICAgICAgICAgICAgICAkQ2FjaGVTdHJpbmcgLj0gJFVzZVJlZi0+e1RpbWVTdGFydH0gLiAnLScgLiAkVXNlUmVmLT57VGltZVN0b3B9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRNRDVLZXkgPSAkU2VsZi0+e01haW5PYmplY3R9LT5GaWxlbmFtZUNsZWFuVXAoCiAgICAgICAgRmlsZW5hbWUgPT4gJENhY2hlU3RyaW5nLAogICAgICAgIFR5cGUgICAgID0+ICdtZDUnLAogICAgKTsKCiAgICByZXR1cm4gJE1ENUtleTsKfQoKMTsKCj1lbmQgSW50ZXJuYWw6Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBMPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dD4uCgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjcuMi4yICQgJERhdGU6IDIwMTEtMTAtMjUgMDg6MjU6MjMgJAoKPWN1dAo=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3lzQ29uZmlnLnBtIC0gYWxsIHN5c3RlbSBjb25maWcgdG9vbCBmdW5jdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgS0lYQ29yZSBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogUmVuZShkb3QpQm9laG0oYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogVG9yc3Rlbihkb3QpVGhhdShhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBTeXNDb25maWcucG0sdiAxLjEyLjIuMSAyMDExLTEwLTA3IDA3OjQ1OjUzIG1hYmEgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBTdG9yYWJsZSBxdygpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6TGFuZ3VhZ2U7CgojIEtJWENvcmUtY2FwZUlUCnVzZSBLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyOwoKIyBFTyBLSVhDb3JlLWNhcGVJVAoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEyLjIuMSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OlN5c0NvbmZpZyAtIHRvIG1hbmFnZSBzeXMgY29uZmlnIHNldHRpbmdzCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMgdG8gbWFuYWdlIHN5cyBjb25maWcgc2V0dGluZ3MuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnOwogICAgdXNlIEtlcm5lbDo6TGFuZ3VhZ2U7CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRFbmNvZGVPYmplY3QgID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgICAgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRUaW1lT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJExhbmd1YWdlT2JqZWN0ID0gS2VybmVsOjpMYW5ndWFnZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRTeXNDb25maWdPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ICAgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgICA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgICAgPT4gJERCT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIExhbmd1YWdlT2JqZWN0ID0+ICRMYW51Z2FnZU9iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgZ2V0IGhvbWUgZGlyZWN0b3J5CiAgICAkU2VsZi0+e0hvbWV9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKTsKCiAgICAjIHNldCB1dGY4IGlmIHVzZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRDaGFyc2V0JykgPX4gL151dGYoLTh8OCkkL2kgKSB7CiAgICAgICAgJFNlbGYtPnt1dGY4fSAgICAgPSAxOwogICAgICAgICRTZWxmLT57RmlsZU1vZGV9ID0gJzp1dGY4JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57RmlsZU1vZGV9ID0gJyc7CiAgICB9CgogICAgIyBjcmVhdGUgeG1sIG9iamVjdAogICAgJFNlbGYtPntYTUxPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlhNTC0+bmV3KCVQYXJhbSk7CgogICAgIyBjcmVhdGUgY29uZmlnIGRlZmF1bHQgb2JqZWN0CiAgICAkU2VsZi0+e0NvbmZpZ0RlZmF1bHRPYmplY3R9ID0gS2VybmVsOjpDb25maWctPm5ldyggJVBhcmFtLCBMZXZlbCA9PiAnRGVmYXVsdCcgKTsKCiAgICAjIGNyZWF0ZSBjb25maWcgb2JqZWN0CiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCAlUGFyYW0sIExldmVsID0+ICdGaXJzdCcgKTsKCiAgICAjIGNyZWF0ZSBjb25maWcgY2xlYXIgb2JqZWN0CiAgICAkU2VsZi0+e0NvbmZpZ0NsZWFyT2JqZWN0fSA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoICVQYXJhbSwgTGV2ZWwgPT4gJ0NsZWFyJyApOwoKICAgICMgcmVhZCBhbGwgY29uZmlnIGZpbGVzCiAgICAkU2VsZi0+e0NvbmZpZ0NvdW50ZXJ9ID0gJFNlbGYtPl9Jbml0KCk7CgogICAgIyBjcmVhdGUgbGFuZ3VhZ2Ugb2JqZWN0IGlmIGl0IHdhcyBub3QgcHJvdmlkZWQKICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9ID0gJFBhcmFte0xhbmd1YWdlT2JqZWN0fSB8fCBLZXJuZWw6Okxhbmd1YWdlLT5uZXcoJVBhcmFtKTsKCiAgICAjIEtJWENvcmUtY2FwZUlUCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgcHVzaCBASVNBLCAnS2VybmVsOjpTeXN0ZW06OkV2ZW50SGFuZGxlcic7CiAgICAkU2VsZi0+RXZlbnRIYW5kbGVySW5pdCgKICAgICAgICBDb25maWcgICAgID0+ICdTeXNDb25maWc6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICAgICAgQmFzZU9iamVjdCA9PiAnU3lzQ29uZmlnT2JqZWN0JywKICAgICAgICBPYmplY3RzICAgID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgIH0sCiAgICApOwoKICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFdyaXRlRGVmYXVsdCgpCgp3cml0ZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlIHBlcmwgY2FjaGUKKEtlcm5lbC9Db25maWcvRmlsZXMvWlpaQUF1dG8ucG0pLiBJdCBpcyB0aGUgUGVybCByZXByZXNlbnRhdGlvbgpvZiB0aGUgZGVmYXVsdCBYTUwgY29uZmlndXJhdGlvbiBkYXRhIChLZXJuZWwvQ29uZmlnL0ZpbGVzLyoueG1sKS4KCj1jdXQKCnN1YiBXcml0ZURlZmF1bHQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmlsZSA9ICcnOwogICAgbXkgJVVzZWRLZXlzOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZWFkIGFsbCBjb25maWcgZmlsZXMKICAgIGZvciBteSAkQ29uZmlnSXRlbSAoIEB7ICRTZWxmLT57WE1MQ29uZmlnfSB9ICkgewogICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntOYW1lfSAmJiAhJFVzZWRLZXlzeyAkQ29uZmlnSXRlbS0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRVc2VkS2V5c3sgJENvbmZpZ0l0ZW0tPntOYW1lfSB9ID0gMTsKICAgICAgICAgICAgbXkgJUNvbmZpZyA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICAgICAgTmFtZSAgICA9PiAkQ29uZmlnSXRlbS0+e05hbWV9LAogICAgICAgICAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbXkgJE5hbWUgPSAkQ29uZmlne05hbWV9OwogICAgICAgICAgICAkTmFtZSA9fiBzL1xcL1xcXFwvZzsKICAgICAgICAgICAgJE5hbWUgPX4gcy8nL1wnL2c7CiAgICAgICAgICAgICROYW1lID1+IHMvIyMjLyd9LT57Jy9nOwoKICAgICAgICAgICAgaWYgKCAkQ29uZmlne1ZhbGlkfSApIHsKICAgICAgICAgICAgICAgICRGaWxlIC49ICJcJFNlbGYtPnsnJE5hbWUnfSA9ICIgLiAkU2VsZi0+X1hNTDJQZXJsKCBEYXRhID0+IFwlQ29uZmlnICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAhJENvbmZpZ3tWYWxpZH0gJiYgZXZhbCggJyRTZWxmLT57Q29uZmlnRGVmYXVsdE9iamVjdH0tPntcJycgLiAkTmFtZSAuICdcJ30nICkgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRmlsZSAuPSAiZGVsZXRlIFwkU2VsZi0+eyckTmFtZSd9O1xuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHdyaXRlIGRlZmF1bHQgY29uZmlnIGZpbGUKICAgIG15ICRPdXQ7CiAgICBpZiAoICFvcGVuKCAkT3V0LCAiPiRTZWxmLT57RmlsZU1vZGV9IiwgIiRTZWxmLT57SG9tZX0vS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBQXV0by5wbSIgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHdyaXRlICRTZWxmLT57SG9tZX0vS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBQXV0by5wbTogJCEhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBwcmludCAkT3V0ICIjIE9UUlMgY29uZmlnIGZpbGUgKGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkKVxuIjsKICAgIHByaW50ICRPdXQgIiMgVkVSU0lPTjoxLjFcbiI7CiAgICBwcmludCAkT3V0ICJwYWNrYWdlIEtlcm5lbDo6Q29uZmlnOjpGaWxlczo6WlpaQUF1dG87XG4iOwogICAgaWYgKCAkU2VsZi0+e3V0Zjh9ICkgewogICAgICAgIHByaW50ICRPdXQgInVzZSB1dGY4O1xuIjsKICAgIH0KICAgIHByaW50ICRPdXQgInN1YiBMb2FkIHtcbiI7CiAgICBwcmludCAkT3V0ICIgICAgbXkgKFwkRmlsZSwgXCRTZWxmKSA9IFxAXztcbiI7CiAgICBwcmludCAkT3V0ICRGaWxlOwogICAgcHJpbnQgJE91dCAifVxuIjsKICAgIHByaW50ICRPdXQgIjE7XG4iOwogICAgY2xvc2UoJE91dCk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gRG93bmxvYWQoKQoKZG93bmxvYWQgY29uZmlnIGNoYW5nZXMuIFRoaXMgd2lsbCByZXR1cm4gdGhlIGNvbnRlbnQgb2YKS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBdXRvLnBtLCB0aGUgZmlsZSB3aGljaCBjb250YWlucyBhbGwKY29uZmlndXJhdGlvbiBjaGFuZ2VzIHRoYXQgdGhlIHVzZXJzIG1hZGUgdmlhIEFkbWluU3lzQ29uZmlnLgoKICAgIG15ICRDb25maWd1cmF0aW9uRGF0YSA9ICRTeXNDb25maWdPYmplY3QtPkRvd25sb2FkKCk7CgpJZiB5b3Ugd2FudCB0byBjaGVjayBpZiBpdCBleGlzdHMgKHJldHVybnMgdHJ1ZSBvciBmYWxzZSksCmNhbGwgaXQgbGlrZSB0aGlzOgoKICAgIG15ICRDb25maWd1cmF0aW9uRXhpc3RzID0gJFN5c0NvbmZpZ09iamVjdC0+RG93bmxvYWQoCiAgICAgICAgVHlwZSA9PiAnQ2hlY2snLAogICAgKTsKCj1jdXQKCnN1YiBEb3dubG9hZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIb21lID0gJFNlbGYtPntIb21lfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdygpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJEluOwogICAgaWYgKCAhLWUgIiRIb21lL0tlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbSIgKSB7CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgZWxzaWYgKCAhb3BlbiggJEluLCAiPCRTZWxmLT57RmlsZU1vZGV9IiwgIiRIb21lL0tlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbSIgKSApIHsKICAgICAgICByZXR1cm4gaWYgJFBhcmFte1R5cGV9OwoKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IG9wZW4gJEhvbWUvS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBdXRvLnBtOiAkISIKICAgICAgICApOwogICAgICAgIHJldHVybiAnJzsKICAgIH0KCiAgICAjIHJlYWQgZmlsZQogICAgbXkgJEZpbGUgPSAnJzsKICAgIHdoaWxlICg8JEluPikgewogICAgICAgICRGaWxlIC49ICRfOwogICAgfQogICAgY2xvc2UoJEluKTsKCiAgICAjIHJldHVybiB0cnVlL2ZhbHNlIG9uIGNoZWNrCiAgICBpZiAoICRQYXJhbXtUeXBlfSApIHsKICAgICAgICBteSAkTGVuZ3RoID0gbGVuZ3RoKCRGaWxlKTsKICAgICAgICBpZiAoICRMZW5ndGggPiAyNSApIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHJldHVybiBmaWxlCiAgICByZXR1cm4gJEZpbGU7Cn0KCj1pdGVtIFVwbG9hZCgpCgp1cGxvYWQgb2YgY29uZmlnIGNoYW5nZXMuIFBhc3MgdGhlIGNvbnRlbnRzIG9mCnRoZSBmaWxlIEtlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbSBoZXJlLCBhcwpyZWFkIGJ5IEw8RG93bmxvYWQoKT4uCgpXYXJuaW5nOiB0aGlzIHdpbGwgcmVwbGFjZSB0aGUgZXhpc3RpbmcgdXNlcgpjb25maWd1cmF0aW9uIGNoYW5nZXMuCgogICAgJFN5c0NvbmZpZ09iamVjdC0+VXBsb2FkKAogICAgICAgIENvbnRlbnQgPT4gJENvbnRlbnQsCiAgICApOwoKPWN1dAoKc3ViIFVwbG9hZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIb21lID0gJFNlbGYtPntIb21lfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhDb250ZW50KSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkRmlsZUxvY2F0aW9uID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RmlsZVdyaXRlKAogICAgICAgIExvY2F0aW9uID0+ICIkSG9tZS9LZXJuZWwvQ29uZmlnL0ZpbGVzL1paWkF1dG8ucG0iLAogICAgICAgIENvbnRlbnQgID0+IFwkUGFyYW17Q29udGVudH0sCiAgICAgICAgTW9kZSAgICAgPT4gJ2Jpbm1vZGUnLAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ3JlYXRlQ29uZmlnKCkKClN1Ym1pdCBjb25maWcgc2V0dGluZ3MgdG8gYXBwbGljYXRpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB3cml0ZQp0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGN1cnJlbnQgU3lzQ29uZmlnIG9iamVjdCB0byBkaXNrLCBzYXZpbmcKYWxsIGNoYW5nZXMgdGhhdCB3ZXJlIG1hZGUgYnkgdGhlIHVzZXJzIHRvIEtlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbS4KT25seSB2YWx1ZXMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBhcmUgc3RvcmVkIGluIHRoaXMgZmlsZS4KCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5DcmVhdGVDb25maWcoKTsKCmlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBlbXB0eSBmaWxlLCBmb3IgZXhhbXBsZSBvbiBpbml0aWFsIGNyZWF0aW9uLCB5b3UgY2FuCnVzZSB0aGUgRW1wdHlGaWxlIHBhcmFtLgoKICAgICRTeXNDb25maWdPYmplY3QtPkNyZWF0ZUNvbmZpZyggRW1wdHlGaWxlID0+IDEgKTsKCj1jdXQKCnN1YiBDcmVhdGVDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkRmlsZSA9ICcnOwogICAgbXkgJVVzZWRLZXlzOwogICAgbXkgJEhvbWUgPSAkU2VsZi0+e0hvbWV9OwoKICAgICMgcmVtZW1iZXIgdG8gdXBkYXRlIFpaWkFBdXRvLnBtIGFuZCBaWlpBdXRvLnBtCiAgICAkU2VsZi0+e1VwZGF0ZX0gPSAxOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyByZWFkIGFsbCBjb25maWcgZmlsZXMgYW5kIG9ubHkgc2F2ZSB0aGUgY2hhbmdlZCBjb25maWcgb3B0aW9ucwogICAgaWYgKCAhJFBhcmFte0VtcHR5RmlsZX0gKSB7CiAgICAgICAgZm9yIG15ICRDb25maWdJdGVtICggQHsgJFNlbGYtPntYTUxDb25maWd9IH0gKSB7CiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntOYW1lfSAmJiAhJFVzZWRLZXlzeyAkQ29uZmlnSXRlbS0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQ29uZmlnID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSXRlbS0+e05hbWV9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJUNvbmZpZ0RlZmF1bHQgPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgID0+ICRDb25maWdJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRVc2VkS2V5c3sgJENvbmZpZ0l0ZW0tPntOYW1lfSB9ID0gMTsKCiAgICAgICAgICAgICAgICBteSAkTmFtZSA9ICRDb25maWd7TmFtZX07CiAgICAgICAgICAgICAgICAkTmFtZSA9fiBzL1xcL1xcXFwvZzsKICAgICAgICAgICAgICAgICROYW1lID1+IHMvJy9cJy9nOwogICAgICAgICAgICAgICAgJE5hbWUgPX4gcy8jIyMvJ30tPnsnL2c7CgogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlne1ZhbGlkfSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQyA9ICRTZWxmLT5fWE1MMlBlcmwoIERhdGEgPT4gXCVDb25maWcgKTsKICAgICAgICAgICAgICAgICAgICBteSAkRCA9ICRTZWxmLT5fWE1MMlBlcmwoIERhdGEgPT4gXCVDb25maWdEZWZhdWx0ICk7CiAgICAgICAgICAgICAgICAgICAgbXkgKCAkQTEsICRBMiApOwogICAgICAgICAgICAgICAgICAgIGV2YWwgIlwkQTEgPSAkQyI7CiAgICAgICAgICAgICAgICAgICAgZXZhbCAiXCRBMiA9ICREIjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkQTEgJiYgIWRlZmluZWQgJEEyICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2lmICgKICAgICAgICAgICAgICAgICAgICAgICAgKCBkZWZpbmVkICRBMSAmJiAhZGVmaW5lZCAkQTIgKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAoICFkZWZpbmVkICRBMSAmJiBkZWZpbmVkICRBMiApCiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT5fRGF0YURpZmYoIERhdGExID0+IFwkQTEsIERhdGEyID0+IFwkQTIgKQogICAgICAgICAgICAgICAgICAgICAgICB8fCAoICRDb25maWd7VmFsaWR9ICYmICEkQ29uZmlnRGVmYXVsdHtWYWxpZH0gKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRmlsZSAuPSAiXCRTZWxmLT57JyROYW1lJ30gPSAkQyI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBkbyBub3RoaW5nCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAgICAgICAgICEkQ29uZmlne1ZhbGlkfQogICAgICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0RlZmF1bHR7VmFsaWR9CiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGV2YWwoICckU2VsZi0+e0NvbmZpZ0RlZmF1bHRPYmplY3R9LT57XCcnIC4gJE5hbWUgLiAnXCd9JyApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAkRmlsZSAuPSAiZGVsZXRlIFwkU2VsZi0+eyckTmFtZSd9O1xuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHdyaXRlIG5ldyBjb25maWcgZmlsZQogICAgbXkgJE91dDsKICAgIGlmICggIW9wZW4oICRPdXQsICI+JFNlbGYtPntGaWxlTW9kZX0iLCAiJEhvbWUvS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBdXRvLnBtIiApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3Qgd3JpdGUgJEhvbWUvS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBdXRvLnBtISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcHJpbnQgJE91dCAiIyBPVFJTIGNvbmZpZyBmaWxlIChhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZClcbiI7CiAgICBwcmludCAkT3V0ICIjIFZFUlNJT046MS4xXG4iOwogICAgcHJpbnQgJE91dCAicGFja2FnZSBLZXJuZWw6OkNvbmZpZzo6RmlsZXM6OlpaWkF1dG87XG4iOwogICAgaWYgKCAkU2VsZi0+e3V0Zjh9ICkgewogICAgICAgIHByaW50ICRPdXQgInVzZSB1dGY4O1xuIjsKICAgIH0KICAgIHByaW50ICRPdXQgInN1YiBMb2FkIHtcbiI7CiAgICBwcmludCAkT3V0ICIgICAgbXkgKFwkRmlsZSwgXCRTZWxmKSA9IFxAXztcbiI7CiAgICBwcmludCAkT3V0ICRGaWxlOwogICAgcHJpbnQgJE91dCAifVxuIjsKICAgIHByaW50ICRPdXQgIjE7XG4iOwogICAgY2xvc2UoJE91dCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1VcGRhdGUoKQoKc3VibWl0IGNvbmZpZyBzZXR0aW5ncyBhbmQgc2F2ZSBpdC4KCiAgICAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtVXBkYXRlKAogICAgICAgIFZhbGlkICAgICAgICA9PiAxLAogICAgICAgIEtleSAgICAgICAgICA9PiAnV2ViVXBsb2FkQ2FjaGVNb2R1bGUnLAogICAgICAgIFZhbHVlICAgICAgICA9PiAnS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU6OkRCJywKICAgICAgICBOb1ZhbGlkYXRpb24gPT4gMSwgICAgIyAob3B0aW9uYWwpIG5vIHZhbGlkYXRpb24gb3IgYXV0by1jb3JyZWN0aW9uIHdpbGwgYmUgZG9uZSwgdG8gcHJldmVudCBsb29wcy4KICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRIb21lID0gJFNlbGYtPntIb21lfTsKCiAgICAjIHJlbWVtYmVyIHRvIHVwZGF0ZSBaWlpBQXV0by5wbSBhbmQgWlpaQXV0by5wbQogICAgJFNlbGYtPntVcGRhdGV9ID0gMTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhWYWxpZCBLZXkgVmFsdWUpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyRffSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiB3ZSBuZWVkIHRvIGNyZWF0ZSBjb25maWcgZmlsZQogICAgaWYgKCAhLWUgIiRIb21lL0tlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbSIgJiYgISRTZWxmLT5DcmVhdGVDb25maWcoIEVtcHR5RmlsZSA9PiAxICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCBjcmVhdGUgZW1wdHkgJEhvbWUvS2VybmVsL0NvbmZpZy9GaWxlcy9aWlpBdXRvLnBtISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBjb25maWcgZmlsZSBpcyB3cml0YWJsZQogICAgbXkgJE91dDsKICAgIGlmICggIW9wZW4oICRPdXQsICI+PiRTZWxmLT57RmlsZU1vZGV9IiwgIiRIb21lL0tlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbSIgKSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHdyaXRlICRIb21lL0tlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbTogJCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgY2xvc2UoJE91dCk7CgogICAgIyBvbmx5IHZhbGlkYXRlIGFuZCBhdXRvIGNvcnJlY3QgaWYgcGFyYW0gTm9WYWxpZGF0aW9uIGlzIHVuZGVmaW5lZCBvciBmYWxzZQogICAgaWYgKCAhJFBhcmFte05vVmFsaWRhdGlvbn0gKSB7CgogICAgICAgICMgdmFsaWRhdGUgdGhlIHZhbHVlLCBhbmQgYXV0by1jb3JyZWN0IGl0IGlmIG5lY2Nlc3NhcnkKICAgICAgICBteSAkVmFsaWRhdGVPayA9ICRTZWxmLT5Db25maWdJdGVtVmFsaWRhdGUoCiAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICk7CgogICAgICAgICMgYXV0byBjb3JyZWN0IHRoZSB2YWx1ZSBpZiB0aGUgdmFsaWRhdGlvbiBmYWlsZWQKICAgICAgICBpZiAoICEkVmFsaWRhdGVPayApIHsKCiAgICAgICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+Q29uZmlnSXRlbVZhbGlkYXRlKAogICAgICAgICAgICAgICAgS2V5ICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICAgICAgICAgVmFsaWQgICAgICAgPT4gJFBhcmFte1ZhbGlkfSwKICAgICAgICAgICAgICAgIEF1dG9Db3JyZWN0ID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG5vIG5lZWQgdG8gZ28gZnVydGhlciBhcyB0aGUgdXBkYXRlIG9mIHRoZSBjb25maWcgaXRlbQogICAgICAgICAgICAjIGlzIGRvbmUgZnJvbSB3aXRoaW4gQ29uZmlnSXRlbVZhbGlkYXRlKCkgZHVyaW5nIGF1dG8tY29ycmVjdGlvbgogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBLSVhDb3JlLWNhcGVJVAogICAgIyB3ZSB3aWxsIG5lZWQgdGhlIG9yaWdpbmFsIGtleSBsYXRlcgogICAgJFBhcmFte09yZ0tleX0gPSAkUGFyYW17S2V5fTsKCiAgICAjIEVPIEtJWENvcmUtY2FwZUlUCgogICAgJFBhcmFte0tleX0gPX4gcy9cXC9cXFxcL2c7CiAgICAkUGFyYW17S2V5fSA9fiBzLycvXCcvZzsKICAgICRQYXJhbXtLZXl9ID1+IHMvIyMjLyd9LT57Jy9nOwoKICAgICMgZ2V0IG9wdGlvbiB0byBzdG9yZSBpdAogICAgbXkgJE9wdGlvbiA9ICcnOwogICAgaWYgKCAhJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAkT3B0aW9uID0gImRlbGV0ZSBcJFNlbGYtPnsnJFBhcmFte0tleX0nfTtcbiI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkT3B0aW9uID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RHVtcCggJFBhcmFte1ZhbHVlfSwgJ2FzY2lpJyApOwogICAgICAgICRPcHRpb24gPX4gcy9cJFZBUjEvXCRTZWxmLT57JyRQYXJhbXtLZXl9J30vOwogICAgfQoKICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICMgZ2V0IG9sZCB2YWx1ZQogICAgbXkgJE9sZFZhbHVlID0gZXZhbCgiXCRTZWxmLT57Q29uZmlnT2JqZWN0fS0+eyckUGFyYW17S2V5fSd9Iik7CgogICAgIyBnZXQgb2xkIGNvbmZpZyBpdGVtCiAgICBteSAlT2xkQ29uZmlnID0gJFNlbGYtPkNvbmZpZ0l0ZW1HZXQoIE5hbWUgPT4gJFBhcmFte09yZ0tleX0gKTsKCiAgICAjIEVPIEtJWENvcmUtY2FwZUlUCgogICAgIyBzZXQgb3B0aW9uIGluIHJ1bnRpbWUKICAgIG15ICRPcHRpb25SdW50aW1lID0gJE9wdGlvbjsKICAgICRPcHRpb25SdW50aW1lID1+IHMvU2VsZi0+L1NlbGYtPlx7Q29uZmlnT2JqZWN0XH0tPi87CiAgICBldmFsICRPcHRpb25SdW50aW1lOwoKICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICMgZ2V0IG5ldyB2YWx1ZQogICAgbXkgJE5ld1ZhbHVlID0gJFBhcmFte1ZhbHVlfTsKCiAgICBteSAkQ2hhbmdlVHlwZSA9IDA7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1N5c0NvbmZpZzo6RXZlbnRNb2R1bGVQb3N0JykgJiYKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3lzQ29uZmlnOjpFdmVudE1vZHVsZVBvc3QnKQogICAgICAgIC0+eycwMDAtTG9nU3lzQ29uZmlnQ2hhbmdlcyd9CiAgICAgICAgKQogICAgewogICAgICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnRGF0YTo6Q29tcGFyZScpICkgewogICAgICAgICAgICBteSAkQ29tcGFyYXRvciA9IERhdGE6OkNvbXBhcmUtPm5ldygpOwogICAgICAgICAgICBpZiAoICggKCAkT2xkQ29uZmlne1ZhbGlkfSB8fCAwICkgKyAoICRQYXJhbXtWYWxpZH0gfHwgMCApICkgPT0gMSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1ZhbGlkfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ2hhbmdlVHlwZSA9IDE7ICAgICAjIGVuYWJsZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDaGFuZ2VUeXBlID0gMjsgICAgICMgZGlzYWJsZWQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICEoICRDb21wYXJhdG9yLT5DbXAoICRPbGRWYWx1ZSwgJE5ld1ZhbHVlICkgKSAmJiAkUGFyYW17VmFsaWR9ICkgewogICAgICAgICAgICAgICAgJENoYW5nZVR5cGUgPSAzOyAgICAgICAgICMgY2hhbmdlZAogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIktlcm5lbDo6U3lzdGVtOjpTeXNDb25maWcgLSBEYXRhOjpDb21wYXJlIG5vdCBhdmFpbGFibGUiCiAgICAgICAgICAgICAgICAgICAgLiAiIHdpbGwgbm90IHRyYWNrIFN5c0NvbmZpZyBjaGFuZ2VzIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBFTyBLSVhDb3JlLWNhcGVJVAoKICAgICMgZ2V0IGNvbmZpZyBmaWxlIGFuZCBpbnNlcnQgaXQKICAgIG15ICRJbjsKICAgIGlmICggIW9wZW4oICRJbiwgIjwkU2VsZi0+e0ZpbGVNb2RlfSIsICIkSG9tZS9LZXJuZWwvQ29uZmlnL0ZpbGVzL1paWkF1dG8ucG0iICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZWFkICRIb21lL0tlcm5lbC9Db25maWcvRmlsZXMvWlpaQXV0by5wbTogJCEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgdXBkYXRlIGNvbnRlbnQKICAgIG15IEBGaWxlT2xkID0gPCRJbj47CiAgICBteSBARmlsZU5ldzsKICAgIG15ICRJbnNlcnQgPSAwOwogICAgZm9yIG15ICRMaW5lICggcmV2ZXJzZSBARmlsZU9sZCApIHsKICAgICAgICBwdXNoKCBARmlsZU5ldywgJExpbmUgKTsKICAgICAgICBpZiAoICEkSW5zZXJ0ICYmICggJExpbmUgPX4gL159LyB8fCAkTGluZSA9fiAvXlwkU2VsZi0+XHsnMSdcfSA9IDE7LyApICkgewogICAgICAgICAgICBwdXNoKCBARmlsZU5ldywgJE9wdGlvbiApOwogICAgICAgICAgICAkSW5zZXJ0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICBjbG9zZSgkSW4pOwoKICAgICMgd3JpdGUgaXQgdG8gZmlsZQogICAgaWYgKCAhb3BlbiggJE91dCwgIj4kU2VsZi0+e0ZpbGVNb2RlfSIsICIkSG9tZS9LZXJuZWwvQ29uZmlnL0ZpbGVzL1paWkF1dG8ucG0iICkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCB3cml0ZSAkSG9tZS9LZXJuZWwvQ29uZmlnL0ZpbGVzL1paWkF1dG8ucG06ICQhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBmb3IgbXkgJExpbmUgKCByZXZlcnNlIEBGaWxlTmV3ICkgewogICAgICAgIHByaW50ICRPdXQgJExpbmU7CiAgICB9CiAgICBjbG9zZSgkT3V0KTsKCiAgICAjIEtJWENvcmUtY2FwZUlUCiAgICAjIHRyaWdnZXIgZXZlbnQgaGFuZGxlciBvbmx5IGlmIHRoaXMga2V5IGhhcyBiZWVuIGNoYW5nZWQgaW4gc29tZSB3YXkKICAgIGlmICgkQ2hhbmdlVHlwZSkgewogICAgICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgICAgIEV2ZW50ID0+ICdTeXNDb25maWdJdGVtVXBkYXRlJywKICAgICAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICAgICAgS2V5ICAgICAgICA9PiAkUGFyYW17T3JnS2V5fSwKICAgICAgICAgICAgICAgIENoYW5nZVR5cGUgPT4gJENoYW5nZVR5cGUsCiAgICAgICAgICAgICAgICBPbGRWYWx1ZSAgID0+ICRPbGRWYWx1ZSwKICAgICAgICAgICAgICAgIE5ld1ZhbHVlICAgPT4gJE5ld1ZhbHVlLAogICAgICAgICAgICB9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntYTUxPYmplY3R9LT57VXNlcklEfSB8fCAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBFTyBLSVhDb3JlLWNhcGVJVAoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb25maWdJdGVtR2V0KCkKCmdldCBhIGN1cnJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5nLCBpbmNsdWRpbmcgY2hhbmdlcwp0aGF0IHRoZSB1c2VycyBtYWRlOgoKICAgIG15ICVDb25maWcgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtR2V0KAogICAgICAgIE5hbWUgPT4gJ1RpY2tldDo6TnVtYmVyR2VuZXJhdG9yJywKICAgICk7CgpUbyBnZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBjb25maWd1cmF0aW9uIHNldHRpbmcsIHBhc3MKdGhlIERlZmF1bHQgZmxhZzoKCiAgICBteSAlQ29uZmlnID0gJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlnSXRlbUdldCgKICAgICAgICBOYW1lICAgID0+ICdUaWNrZXQ6Ok51bWJlckdlbmVyYXRvcicsCiAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoTmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkTGV2ZWwgPSAnJzsKICAgIGlmICggJFBhcmFte0RlZmF1bHR9ICkgewogICAgICAgICRMZXZlbCA9ICdEZWZhdWx0JzsKICAgIH0KCiAgICAjIHJldHVybiBvbiBpbnZhbGlkIGNvbmZpZyBpdGVtCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q29uZmlnfS0+eyAkUGFyYW17TmFtZX0gfTsKCiAgICAjIGNvcHkgY29uZmlnIGFuZCBzdG9yZSBpdCBhcyBkZWZhdWx0CiAgICBteSAkRHVtcCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkR1bXAoICRTZWxmLT57Q29uZmlnfS0+eyAkUGFyYW17TmFtZX0gfSwgJ2FzY2lpJyApOwogICAgJER1bXAgPX4gcy9cJFZBUjEgPS9cJENvbmZpZ0l0ZW0gPS87CgogICAgIyByaCBhcyA4IGJ1ZyBmaXgKICAgICREdW1wID1+IHMvXCR7XFxcJFZBUjEtPnsnLis/J31cWzBcXX0vXHtcfS9nOwogICAgbXkgJENvbmZpZ0l0ZW07CiAgICBpZiAoICFldmFsICREdW1wICkgewogICAgICAgIGRpZSAiRVJST1I6ICQhOiAkQCBpbiAkRHVtcCI7CiAgICB9CgogICAgIyBhZGQgY3VycmVudCB2YWxpZCBzdGF0ZQogICAgaWYgKCAhJFBhcmFte0RlZmF1bHR9ICYmICFkZWZpbmVkICRTZWxmLT5fTW9kR2V0KCBDb25maWdOYW1lID0+ICRDb25maWdJdGVtLT57TmFtZX0gKSApIHsKICAgICAgICAkQ29uZmlnSXRlbS0+e1ZhbGlkfSA9IDA7CiAgICB9CiAgICBlbHNpZiAoICEkUGFyYW17RGVmYXVsdH0gKSB7CiAgICAgICAgJENvbmZpZ0l0ZW0tPntWYWxpZH0gPSAxOwogICAgfQoKICAgICMgdXBkYXRlIHhtbCB3aXRoIGN1cnJlbnQgY29uZmlnIHNldHRpbmcKICAgIGlmICggJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57U3RyaW5nfSApIHsKCiAgICAgICAgIyBmaWxsIGRlZmF1bHQKICAgICAgICAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntTdHJpbmd9LT5bMV0tPntEZWZhdWx0fQogICAgICAgICAgICA9ICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e1N0cmluZ30tPlsxXS0+e0NvbnRlbnR9OwogICAgICAgIG15ICRTdHJpbmcgPSAkU2VsZi0+X01vZEdldCggQ29uZmlnTmFtZSA9PiAkQ29uZmlnSXRlbS0+e05hbWV9LCBMZXZlbCA9PiAkTGV2ZWwgKTsKICAgICAgICBpZiAoICEkUGFyYW17RGVmYXVsdH0gJiYgZGVmaW5lZCgkU3RyaW5nKSApIHsKICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57U3RyaW5nfS0+WzFdLT57Q29udGVudH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KICAgIGlmICggJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57VGV4dEFyZWF9ICkgewoKICAgICAgICAjIGZpbGwgZGVmYXVsdAogICAgICAgICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e1RleHRBcmVhfS0+WzFdLT57RGVmYXVsdH0KICAgICAgICAgICAgPSAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntUZXh0QXJlYX0tPlsxXS0+e0NvbnRlbnR9OwogICAgICAgIG15ICRUZXh0QXJlYSA9ICRTZWxmLT5fTW9kR2V0KCBDb25maWdOYW1lID0+ICRDb25maWdJdGVtLT57TmFtZX0sIExldmVsID0+ICRMZXZlbCApOwogICAgICAgIGlmICggISRQYXJhbXtEZWZhdWx0fSAmJiBkZWZpbmVkKCRUZXh0QXJlYSkgKSB7CiAgICAgICAgICAgICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e1RleHRBcmVhfS0+WzFdLT57Q29udGVudH0gPSAkVGV4dEFyZWE7CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntPcHRpb259ICkgewoKICAgICAgICAjIGZpbGwgZGVmYXVsdAogICAgICAgICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e09wdGlvbn0tPlsxXS0+e0RlZmF1bHR9CiAgICAgICAgICAgID0gJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57T3B0aW9ufS0+WzFdLT57U2VsZWN0ZWRJRH07CiAgICAgICAgbXkgJE9wdGlvbiA9ICRTZWxmLT5fTW9kR2V0KCBDb25maWdOYW1lID0+ICRDb25maWdJdGVtLT57TmFtZX0sIExldmVsID0+ICRMZXZlbCApOwogICAgICAgIGlmICggISRQYXJhbXtEZWZhdWx0fSAmJiBkZWZpbmVkKCRPcHRpb24pICkgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntPcHRpb259LT5bMV0tPntTZWxlY3RlZElEfSA9ICRPcHRpb247CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntIYXNofSApIHsKICAgICAgICBteSAkSGFzaFJlZiA9ICRTZWxmLT5fTW9kR2V0KCBDb25maWdOYW1lID0+ICRDb25maWdJdGVtLT57TmFtZX0sIExldmVsID0+ICRMZXZlbCApOwogICAgICAgIGlmICggISRQYXJhbXtEZWZhdWx0fSAmJiBkZWZpbmVkKCRIYXNoUmVmKSApIHsKICAgICAgICAgICAgbXkgQEFycmF5OwogICAgICAgICAgICBpZiAoIHJlZiAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntIYXNofS0+WzFdLT57SXRlbX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIEBBcnJheSA9IEB7ICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e0hhc2h9LT5bMV0tPntJdGVtfSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIEB7ICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e0hhc2h9LT5bMV0tPntJdGVtfSB9ID0gKHVuZGVmKTsKICAgICAgICAgICAgbXkgJUhhc2g7CiAgICAgICAgICAgIGlmICggcmVmICRIYXNoUmVmIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICVIYXNoID0gJXskSGFzaFJlZn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJUhhc2ggKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkSGFzaHskS2V5fSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICggdW5kZWYsIHsgQ29udGVudCA9PiAnJywgfSApOwogICAgICAgICAgICAgICAgICAgIEB7ICRBcnJheVsxXXtJdGVtfSB9ID0gKHVuZGVmKTsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJENvbnRlbnQgKCBAeyAkSGFzaHskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyAkQXJyYXlbMV17SXRlbX0gfSwgeyBDb250ZW50ID0+ICRDb250ZW50IH0gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57SGFzaH0tPlsxXS0+e0l0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheSAgID0+IFxAQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggcmVmICRIYXNoeyRLZXl9IGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAoIHVuZGVmLCB7IENvbnRlbnQgPT4gJycsIH0gKTsKICAgICAgICAgICAgICAgICAgICBAeyAkQXJyYXlbMV17SXRlbX0gfSA9ICh1bmRlZik7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkyICgga2V5cyAleyAkSGFzaHskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsgJEFycmF5WzFde0l0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IENvbnRlbnQgPT4gJEhhc2h7JEtleX17JEtleTJ9LCBLZXkgPT4gJEtleTIgfQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntIYXNofS0+WzFdLT57SXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc2ggICAgPT4gXEBBcnJheSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE9wdGlvbiA9IDA7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDEgLi4gJCNBcnJheSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCggJEFycmF5WyRJbmRleF17S2V5fSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAkQXJyYXlbJEluZGV4XXtLZXl9IGVxICRLZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRlZmluZWQoICRBcnJheVskSW5kZXhde09wdGlvbn0gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT3B0aW9uID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRBcnJheVskSW5kZXhde09wdGlvbn1bMV17U2VsZWN0ZWRJRH0gPSAkSGFzaHskS2V5fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57SGFzaH0tPlsxXS0+e0l0ZW19IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbiAgPT4gJEFycmF5WyRJbmRleF17T3B0aW9ufSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoICRPcHRpb24gPT0gMCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e0hhc2h9LT5bMV0tPntJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRIYXNoeyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e0FycmF5fSApIHsKICAgICAgICBteSAkQXJyYXlSZWYgPSAkU2VsZi0+X01vZEdldCggQ29uZmlnTmFtZSA9PiAkQ29uZmlnSXRlbS0+e05hbWV9LCBMZXZlbCA9PiAkTGV2ZWwgKTsKICAgICAgICBpZiAoICEkUGFyYW17RGVmYXVsdH0gJiYgZGVmaW5lZCgkQXJyYXlSZWYpICkgewogICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntBcnJheX0tPlsxXS0+e0l0ZW19IH0gPSAodW5kZWYpOwogICAgICAgICAgICBteSBAQXJyYXk7CiAgICAgICAgICAgIGlmICggcmVmICRBcnJheVJlZiBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgQEFycmF5ID0gQHskQXJyYXlSZWZ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciBteSAkS2V5IChAQXJyYXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57QXJyYXl9LT5bMV0tPntJdGVtfSB9LAogICAgICAgICAgICAgICAgICAgIHsgQ29udGVudCA9PiAkS2V5LCB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICggJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57RnJvbnRlbmRNb2R1bGVSZWd9ICkgewogICAgICAgIG15ICRIYXNoUmVmID0gJFNlbGYtPl9Nb2RHZXQoIENvbmZpZ05hbWUgPT4gJENvbmZpZ0l0ZW0tPntOYW1lfSwgTGV2ZWwgPT4gJExldmVsICk7CiAgICAgICAgaWYgKCAhJFBhcmFte0RlZmF1bHR9ICYmIGRlZmluZWQoJEhhc2hSZWYpICkgewogICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntGcm9udGVuZE1vZHVsZVJlZ30gfSA9ICh1bmRlZik7CiAgICAgICAgICAgIG15ICVIYXNoOwogICAgICAgICAgICBpZiAoIHJlZiAkSGFzaFJlZiBlcSAnSEFTSCcgKSB7CiAgICAgICAgICAgICAgICAlSGFzaCA9ICV7JEhhc2hSZWZ9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVIYXNoICkgewogICAgICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57RnJvbnRlbmRNb2R1bGVSZWd9LT5bMV0tPnskS2V5fSB9ID0gKHVuZGVmKTsKICAgICAgICAgICAgICAgIGlmICggJEtleSBlcSAnR3JvdXAnIHx8ICRLZXkgZXEgJ0dyb3VwUm8nICkgewogICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICh1bmRlZik7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb250ZW50ICggQHsgJEhhc2h7JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e0Zyb250ZW5kTW9kdWxlUmVnfS0+WzFdLT57JEtleX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQ29udGVudCA9PiAkQ29udGVudCB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkS2V5IGVxICdMb2FkZXInICkgewogICAgICAgICAgICAgICAgICAgIG15ICVMb2FkZXJGaWxlczsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEtleTIgKCAleyAkSGFzaHskS2V5fSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkS2V5MiAgICBlcSAnQ1NTJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJEtleTIgZXEgJ0NTU19JRTYnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAkS2V5MiBlcSAnQ1NTX0lFNycKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICRLZXkyIGVxICdDU1NfSUU4JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgJEtleTIgZXEgJ0phdmFTY3JpcHQnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRLZXkyIG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEZpbGVzID0gKHVuZGVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEluZGV4ICggMCAuLiAkI3sgJEhhc2h7JEtleX0tPnskS2V5Mn0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJExvYWRlckZpbGUgPSAkSGFzaHskS2V5fS0+eyRLZXkyfVskSW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBDb250ZW50ID0+ICRMb2FkZXJGaWxlIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRMb2FkZXJGaWxlc3skS2V5Mn0gPSBcQEZpbGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEB7ICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e0Zyb250ZW5kTW9kdWxlUmVnfS0+WzFdLT57JEtleX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgXCVMb2FkZXJGaWxlcywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkS2V5IGVxICdOYXZCYXInIHx8ICRLZXkgZXEgJ05hdkJhck1vZHVsZScgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCByZWYgJEhhc2h7JEtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDb250ZW50ICggQHsgJEhhc2h7JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICVOYXZCYXI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJXskQ29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkXyBlcSAnR3JvdXAnIHx8ICRfIGVxICdHcm91cFJvJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsgJE5hdkJhcnskX30gfSA9ICh1bmRlZik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkQ29udGVudC0+eyRffSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQHsgJE5hdkJhcnskX30gfSwgeyBDb250ZW50ID0+ICRHcm91cCB9ICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAeyAkTmF2QmFyeyRffSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB1bmRlZiwgeyBDb250ZW50ID0+ICRDb250ZW50LT57JF99IH0gKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57RnJvbnRlbmRNb2R1bGVSZWd9LT5bMV0tPnskS2V5fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwlTmF2QmFyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlTmF2QmFyOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkQ29udGVudCA9ICRIYXNoeyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBzb3J0IGtleXMgJXskQ29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRfIGVxICdHcm91cCcgfHwgJF8gZXEgJ0dyb3VwUm8nICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEB7ICROYXZCYXJ7JF99IH0gPSAodW5kZWYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkQ29udGVudC0+eyRffSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBAeyAkTmF2QmFyeyRffSB9LCB7IENvbnRlbnQgPT4gJEdyb3VwIH0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAeyAkTmF2QmFyeyRffSB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIHVuZGVmLCB7IENvbnRlbnQgPT4gJENvbnRlbnQtPnskX30gfSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntGcm9udGVuZE1vZHVsZVJlZ30tPlsxXS0+eyRLZXl9ID0gXCVOYXZCYXI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57RnJvbnRlbmRNb2R1bGVSZWd9LT5bMV0tPnskS2V5fSB9LAogICAgICAgICAgICAgICAgICAgICAgICB7IENvbnRlbnQgPT4gJEhhc2h7JEtleX0gfQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBpZiAoICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e1RpbWVXb3JraW5nSG91cnN9ICkgewogICAgICAgIG15ICREYXlzUmVmID0gJFNlbGYtPl9Nb2RHZXQoIENvbmZpZ05hbWUgPT4gJENvbmZpZ0l0ZW0tPntOYW1lfSwgTGV2ZWwgPT4gJExldmVsICk7CiAgICAgICAgaWYgKCAhJFBhcmFte0RlZmF1bHR9ICYmIGRlZmluZWQoJERheXNSZWYpICkgewogICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntUaW1lV29ya2luZ0hvdXJzfS0+WzFdLT57RGF5fSB9ID0gKHVuZGVmKTsKICAgICAgICAgICAgbXkgJURheXM7CiAgICAgICAgICAgIGlmICggcmVmICREYXlzUmVmIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICVEYXlzID0gJXskRGF5c1JlZn07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIG15ICREYXkgKCBrZXlzICVEYXlzICkgewogICAgICAgICAgICAgICAgbXkgQEFycmF5ID0gKHVuZGVmKTsKICAgICAgICAgICAgICAgIGZvciBteSAkSG91ciAoIEB7ICREYXlzeyREYXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCggQEFycmF5LCB7IENvbnRlbnQgPT4gJEhvdXIsIH0gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57VGltZVdvcmtpbmdIb3Vyc30tPlsxXS0+e0RheX0gfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJERheSwKICAgICAgICAgICAgICAgICAgICAgICAgSG91ciA9PiBcQEFycmF5LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntUaW1lVmFjYXRpb25EYXlzfSApIHsKICAgICAgICBteSAkSGFzaFJlZiA9ICRTZWxmLT5fTW9kR2V0KCBDb25maWdOYW1lID0+ICRDb25maWdJdGVtLT57TmFtZX0sIExldmVsID0+ICRMZXZlbCApOwogICAgICAgIGlmICggISRQYXJhbXtEZWZhdWx0fSAmJiBkZWZpbmVkKCRIYXNoUmVmKSApIHsKICAgICAgICAgICAgQHsgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57VGltZVZhY2F0aW9uRGF5c30tPlsxXS0+e0l0ZW19IH0gPSAodW5kZWYpOwogICAgICAgICAgICBteSAlSGFzaDsKICAgICAgICAgICAgaWYgKCByZWYgJEhhc2hSZWYgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgJUhhc2ggPSAleyRIYXNoUmVmfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgbXkgJE1vbnRoICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJUhhc2ggKSB7CgogICAgICAgICAgICAgICAgaWYgKCAkSGFzaHskTW9udGh9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICVEYXlzID0gJXsgJEhhc2h7JE1vbnRofSB9OwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJURheXMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntUaW1lVmFjYXRpb25EYXlzfS0+WzFdLT57SXRlbX0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb250aCAgID0+ICRNb250aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAkSGFzaHskTW9udGh9LT57JERheX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICggJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57VGltZVZhY2F0aW9uRGF5c09uZVRpbWV9ICkgewogICAgICAgIG15ICRIYXNoUmVmID0gJFNlbGYtPl9Nb2RHZXQoIENvbmZpZ05hbWUgPT4gJENvbmZpZ0l0ZW0tPntOYW1lfSwgTGV2ZWwgPT4gJExldmVsICk7CiAgICAgICAgaWYgKCAhJFBhcmFte0RlZmF1bHR9ICYmIGRlZmluZWQoJEhhc2hSZWYpICkgewogICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntUaW1lVmFjYXRpb25EYXlzT25lVGltZX0tPlsxXS0+e0l0ZW19IH0gPSAodW5kZWYpOwogICAgICAgICAgICBteSAlSGFzaDsKICAgICAgICAgICAgaWYgKCByZWYgJEhhc2hSZWYgZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgJUhhc2ggPSAleyRIYXNoUmVmfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgbXkgJFllYXIgKCBzb3J0IHsgJGEgPD0+ICRiIH0ga2V5cyAlSGFzaCApIHsKICAgICAgICAgICAgICAgIG15ICVNb250aHMgPSAleyAkSGFzaHskWWVhcn0gfTsKICAgICAgICAgICAgICAgIGlmICglTW9udGhzKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRNb250aCAoIHNvcnQgeyAkYSA8PT4gJGIgfSBrZXlzICVNb250aHMgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkRGF5ICggc29ydCB7ICRhIDw9PiAkYiB9IGtleXMgJXsgJEhhc2h7JFllYXJ9LT57JE1vbnRofSB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntUaW1lVmFjYXRpb25EYXlzT25lVGltZX0tPlsxXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57SXRlbX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgICAgPT4gJFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbnRoICAgPT4gJE1vbnRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXkgICAgID0+ICREYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRlbnQgPT4gJEhhc2h7JFllYXJ9LT57JE1vbnRofS0+eyREYXl9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCAhJFBhcmFte0RlZmF1bHR9ICkgewogICAgICAgIG15ICVDb25maWdJdGVtRGVmYXVsdCA9ICRTZWxmLT5Db25maWdJdGVtR2V0KAogICAgICAgICAgICBOYW1lICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgRGVmYXVsdCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJEMgPSAkU2VsZi0+X1hNTDJQZXJsKCBEYXRhID0+ICRDb25maWdJdGVtICk7CiAgICAgICAgbXkgJEQgPSAkU2VsZi0+X1hNTDJQZXJsKCBEYXRhID0+IFwlQ29uZmlnSXRlbURlZmF1bHQgKTsKICAgICAgICBteSAoICRBMSwgJEEyICk7CiAgICAgICAgZXZhbCAiXCRBMSA9ICRDIjsKICAgICAgICBldmFsICJcJEEyID0gJEQiOwogICAgICAgIGlmICggJENvbmZpZ0l0ZW1EZWZhdWx0e1ZhbGlkfSBuZSAkQ29uZmlnSXRlbS0+e1ZhbGlkfSApIHsKICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntEaWZmfSA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggIWRlZmluZWQgJEExICYmICFkZWZpbmVkICRBMiApIHsKICAgICAgICAgICAgJENvbmZpZ0l0ZW0tPntEaWZmfSA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgKCBkZWZpbmVkICRBMSAmJiAhZGVmaW5lZCAkQTIgKQogICAgICAgICAgICB8fCAoICFkZWZpbmVkICRBMSAmJiBkZWZpbmVkICRBMiApCiAgICAgICAgICAgIHx8ICRTZWxmLT5fRGF0YURpZmYoIERhdGExID0+IFwkQTEsIERhdGEyID0+IFwkQTIgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0RpZmZ9ID0gMTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoCiAgICAgICAgJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57T3B0aW9ufQogICAgICAgICYmICRDb25maWdJdGVtLT57U2V0dGluZ30tPlsxXS0+e09wdGlvbn0tPlsxXS0+e0xvY2F0aW9ufQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkSG9tZSA9ICRTZWxmLT57SG9tZX07CiAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EaXJlY3RvcnlSZWFkKAogICAgICAgICAgICBEaXJlY3RvcnkgPT4gJEhvbWUsCiAgICAgICAgICAgIEZpbHRlciAgICA9PiAiJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57T3B0aW9ufS0+WzFdLT57TG9jYXRpb259IiwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJEl0ZW0gKEBMaXN0KSB7CiAgICAgICAgICAgICRJdGVtID1+IHMvXFEkSG9tZVxFLy9nOwogICAgICAgICAgICAkSXRlbSA9fiBzL15bQS16XTovL2c7CiAgICAgICAgICAgICRJdGVtID1+IHMvXFwvXC8vZzsKICAgICAgICAgICAgJEl0ZW0gPX4gcy9cL1wvL1wvL2c7CiAgICAgICAgICAgICRJdGVtID1+IHMvXlwvLy9nOwogICAgICAgICAgICAkSXRlbSA9fiBzL14oLiopXC5wbS8kMS9nOwogICAgICAgICAgICAkSXRlbSA9fiBzL1wvLzo6L2c7CiAgICAgICAgICAgICRJdGVtID1+IHMvXC8vOjovZzsKICAgICAgICAgICAgbXkgJFZhbHVlID0gJEl0ZW07CiAgICAgICAgICAgIG15ICRLZXkgICA9ICRJdGVtOwogICAgICAgICAgICAkVmFsdWUgPX4gcy9eLio6OiguKz8pJC8kMS9nOwoKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ0l0ZW0tPntTZXR0aW5nfS0+WzFdLT57T3B0aW9ufS0+WzFdLT57SXRlbX0gKSB7CiAgICAgICAgICAgICAgICBwdXNoKCBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntPcHRpb259LT5bMV0tPntJdGVtfSB9LCB1bmRlZiApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICBAeyAkQ29uZmlnSXRlbS0+e1NldHRpbmd9LT5bMV0tPntPcHRpb259LT5bMV0tPntJdGVtfSB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIEtleSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICV7JENvbmZpZ0l0ZW19Owp9Cgo9aXRlbSBDb25maWdJdGVtUmVzZXQoKQoKcmVzZXQgYSBjb25maWd1cmF0aW9uIHNldHRpbmcgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCgogICAgJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlnSXRlbVJlc2V0KAogICAgICAgIE5hbWUgPT4gJ1RpY2tldDo6TnVtYmVyR2VuZXJhdG9yJywKICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVJlc2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoTmFtZSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlQ29uZmlnSXRlbURlZmF1bHQgPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICBOYW1lICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICBEZWZhdWx0ID0+IDEsCiAgICApOwogICAgbXkgJEEgPSAkU2VsZi0+X1hNTDJQZXJsKCBEYXRhID0+IFwlQ29uZmlnSXRlbURlZmF1bHQgKTsKICAgIG15ICgkQik7CiAgICBldmFsICJcJEIgPSAkQSI7CgogICAgJFNlbGYtPkNvbmZpZ0l0ZW1VcGRhdGUoIEtleSA9PiAkUGFyYW17TmFtZX0sIFZhbHVlID0+ICRCLCBWYWxpZCA9PiAkQ29uZmlnSXRlbURlZmF1bHR7VmFsaWR9ICk7CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29uZmlnR3JvdXBMaXN0KCkKCmdldCB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIGNvbmZpZyBncm91cHMuCgogICAgbXkgJUNvbmZpZ0dyb3VwTGlzdCA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ0dyb3VwTGlzdCgpOwoKPWN1dAoKc3ViIENvbmZpZ0dyb3VwTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVMaXN0OwogICAgbXkgJUNvdW50OwogICAgZm9yIG15ICRDb25maWdJdGVtICggQHsgJFNlbGYtPntYTUxDb25maWd9IH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0dyb3VwfSAmJiByZWYgJENvbmZpZ0l0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIEB7ICRDb25maWdJdGVtLT57R3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHcm91cC0+e0NvbnRlbnR9ICkgewogICAgICAgICAgICAgICAgICAgICRDb3VudHsgJEdyb3VwLT57Q29udGVudH0gfSsrOwogICAgICAgICAgICAgICAgICAgICRMaXN0eyAkR3JvdXAtPntDb250ZW50fSB9ID0gIiRHcm91cC0+e0NvbnRlbnR9ICgkQ291bnR7JEdyb3VwLT57Q29udGVudH19KSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJUxpc3Q7Cn0KCj1pdGVtIENvbmZpZ1N1Ykdyb3VwTGlzdCgpCgpnZXQgdGhlIGxpc3Qgb2YgYWxsIGNvbmZpZyBzdWIgZ3JvdXBzIG9mIGEgZ2l2ZW4gZ3JvdXAuCgogICAgbXkgJUNvbmZpZ0dyb3VwTGlzdCA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ1N1Ykdyb3VwTGlzdCgKICAgICAgICBOYW1lID0+ICdGcmFtZXdvcmsnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdTdWJHcm91cExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhOYW1lKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVMaXN0OwogICAgZm9yIG15ICRDb25maWdJdGVtICggQHsgJFNlbGYtPntYTUxDb25maWd9IH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlnSXRlbS0+e0dyb3VwfSAmJiByZWYgJENvbmZpZ0l0ZW0tPntHcm91cH0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgbXkgJEhpdCA9IDA7CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKCBAeyAkQ29uZmlnSXRlbS0+e0dyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkR3JvdXAtPntDb250ZW50fSAmJiAkR3JvdXAtPntDb250ZW50fSBlcSAkUGFyYW17TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRIaXQpIHsKICAgICAgICAgICAgICAgIGZvciBteSAkU3ViR3JvdXAgKCBAeyAkQ29uZmlnSXRlbS0+e1N1Ykdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJFN1Ykdyb3VwLT57Q29udGVudH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAjIGdldCBzdWIgY291bnQKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQExpc3QgPSAkU2VsZi0+Q29uZmlnU3ViR3JvdXBDb25maWdJdGVtTGlzdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ykdyb3VwID0+ICRTdWJHcm91cC0+e0NvbnRlbnR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkTGlzdHsgJFN1Ykdyb3VwLT57Q29udGVudH0gfSA9ICggJCNMaXN0ICsgMSApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAlTGlzdDsKfQoKPWl0ZW0gQ29uZmlnU3ViR3JvdXBDb25maWdJdGVtTGlzdCgpCgpnZXQgdGhlIGxpc3Qgb2YgY29uZmlnIGl0ZW1zIG9mIGEgY29uZmlnIHN1YiBncm91cAoKICAgIG15IEBDb25maWdJdGVtTGlzdCA9ICRTeXNDb25maWdPYmplY3QtPkNvbmZpZ1N1Ykdyb3VwQ29uZmlnSXRlbUxpc3QoCiAgICAgICAgR3JvdXAgICAgPT4gJ0ZyYW1ld29yaycsCiAgICAgICAgU3ViR3JvdXAgPT4gJ1dlYicsCiAgICApOwoKPWN1dAoKc3ViIENvbmZpZ1N1Ykdyb3VwQ29uZmlnSXRlbUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhHcm91cCBTdWJHcm91cCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlRGF0YTsKICAgIGlmICggJFNlbGYtPnsnQ2FjaGU6OkNvbmZpZ1N1Ykdyb3VwQ29uZmlnSXRlbUxpc3QnfSApIHsKICAgICAgICAlRGF0YSA9ICV7ICRTZWxmLT57J0NhY2hlOjpDb25maWdTdWJHcm91cENvbmZpZ0l0ZW1MaXN0J30gfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICVVc2VkOwogICAgICAgIGZvciBteSAkQ29uZmlnSXRlbSAoIEB7ICRTZWxmLT57WE1MQ29uZmlnfSB9ICkgewogICAgICAgICAgICBteSAkTmFtZSA9ICRDb25maWdJdGVtLT57TmFtZX07CiAgICAgICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntHcm91cH0gJiYgcmVmICRDb25maWdJdGVtLT57R3JvdXB9IGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEdyb3VwICggQHsgJENvbmZpZ0l0ZW0tPntHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICRHcm91cAogICAgICAgICAgICAgICAgICAgICAgICAmJiAkQ29uZmlnSXRlbS0+e1N1Ykdyb3VwfQogICAgICAgICAgICAgICAgICAgICAgICAmJiByZWYgJENvbmZpZ0l0ZW0tPntTdWJHcm91cH0gZXEgJ0FSUkFZJwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFN1Ykdyb3VwICggQHsgJENvbmZpZ0l0ZW0tPntTdWJHcm91cH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhJFVzZWR7ICRDb25maWdJdGVtLT57TmFtZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRTdWJHcm91cC0+e0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgJEdyb3VwLT57Q29udGVudH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZWR7ICRDb25maWdJdGVtLT57TmFtZX0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyAkR3JvdXAtPntDb250ZW50fSAuICc6OicgLiAkU3ViR3JvdXAtPntDb250ZW50fSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e05hbWV9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+eydDYWNoZTo6Q29uZmlnU3ViR3JvdXBDb25maWdJdGVtTGlzdCd9ID0gXCVEYXRhOwogICAgfQogICAgaWYgKCAkRGF0YXsgJFBhcmFte0dyb3VwfSAuICc6OicgLiAkUGFyYW17U3ViR3JvdXB9IH0gKSB7CiAgICAgICAgcmV0dXJuIHJldmVyc2UgQHsgJERhdGF7ICRQYXJhbXtHcm91cH0gLiAnOjonIC4gJFBhcmFte1N1Ykdyb3VwfSB9IH07CiAgICB9CiAgICByZXR1cm4gKCk7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1TZWFyY2goKQoKc2VhcmNoIGZvciBzdWIgZ3JvdXBzIG9mIGNvbmZpZyBpdGVtcy4gSXQgd2lsbCByZXR1cm4gYWxsIHN1Ymdyb3Vwcwp3aXRoIHNldHRpbmdzIHdoaWNoIGNvbnRhaW4gdGhlIHNlYXJjaCB0ZXJtLgoKICAgIG15IEBMaXN0ID0gJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlnSXRlbVNlYXJjaCgKICAgICAgICBTZWFyY2ggPT4gJ3NvbWUgdG9waWMnLAogICAgKTsKCj1jdXQKCnN1YiBDb25maWdJdGVtU2VhcmNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQExpc3Q7CiAgICBteSAlVXNlZDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhTZWFyY2gpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgJFBhcmFte1NlYXJjaH0gPX4gcy9cKi8vOwogICAgbXkgJUdyb3VwcyA9ICRTZWxmLT5Db25maWdHcm91cExpc3QoKTsKICAgIGZvciBteSAkR3JvdXAgKCBzb3J0IGtleXMoJUdyb3VwcykgKSB7CiAgICAgICAgbXkgJVN1Ykdyb3VwcyA9ICRTZWxmLT5Db25maWdTdWJHcm91cExpc3QoIE5hbWUgPT4gJEdyb3VwICk7CiAgICAgICAgZm9yIG15ICRTdWJHcm91cCAoIHNvcnQga2V5cyAlU3ViR3JvdXBzICkgewogICAgICAgICAgICBteSBASXRlbXMgPSAkU2VsZi0+Q29uZmlnU3ViR3JvdXBDb25maWdJdGVtTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwICAgID0+ICRHcm91cCwKICAgICAgICAgICAgICAgIFN1Ykdyb3VwID0+ICRTdWJHcm91cCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRJdGVtIChASXRlbXMpIHsKICAgICAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+X01vZEdldCggQ29uZmlnTmFtZSA9PiAkSXRlbSApOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnICYmICEkVXNlZHsgJEdyb3VwIC4gJzo6JyAuICRTdWJHcm91cCB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggcmVmICRDb25maWcgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICggQHskQ29uZmlnfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRVc2VkeyAkR3JvdXAgLiAnOjonIC4gJFN1Ykdyb3VwIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkXyAmJiAkXyA9fiAvXFEkUGFyYW17U2VhcmNofVxFL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJHcm91cCAgICAgID0+ICRTdWJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJHcm91cENvdW50ID0+ICRTdWJHcm91cHN7JFN1Ykdyb3VwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCAgICAgICAgID0+ICRHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VkeyAkR3JvdXAgLiAnOjonIC4gJFN1Ykdyb3VwIH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoIHJlZiAkQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JENvbmZpZ30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlZHsgJEdyb3VwIC4gJzo6JyAuICRTdWJHcm91cCB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZy0+eyRLZXl9ICYmICRDb25maWctPnskS2V5fSA9fiAvXFEkUGFyYW17U2VhcmNofVxFL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJHcm91cCAgICAgID0+ICRTdWJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJHcm91cENvdW50ID0+ICRTdWJHcm91cHN7JFN1Ykdyb3VwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcm91cCAgICAgICAgID0+ICRHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VkeyAkR3JvdXAgLiAnOjonIC4gJFN1Ykdyb3VwIH0gPSAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnID1+IC9cUSRQYXJhbXtTZWFyY2h9XEUvaSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQExpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJHcm91cCAgICAgID0+ICRTdWJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViR3JvdXBDb3VudCA9PiAkU3ViR3JvdXBzeyRTdWJHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwICAgICAgICAgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZWR7ICRHcm91cCAuICc6OicgLiAkU3ViR3JvdXAgfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRJdGVtID1+IC9cUSRQYXJhbXtTZWFyY2h9XEUvaSApIHsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVXNlZHsgJEdyb3VwIC4gJzo6JyAuICRTdWJHcm91cCB9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQExpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViR3JvdXAgICAgICA9PiAkU3ViR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViR3JvdXBDb3VudCA9PiAkU3ViR3JvdXBzeyRTdWJHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgICAgICAgICA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAkVXNlZHsgJEdyb3VwIC4gJzo6JyAuICRTdWJHcm91cCB9ID0gMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBteSAlSXRlbUhhc2ggPSAkU2VsZi0+Q29uZmlnSXRlbUdldCggTmFtZSA9PiAkSXRlbSApOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCAxIC4uICQjeyAkSXRlbUhhc2h7RGVzY3JpcHRpb259IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISRVc2VkeyAkR3JvdXAgLiAnOjonIC4gJFN1Ykdyb3VwIH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkRGVzY3JpcHRpb24gPSAkSXRlbUhhc2h7RGVzY3JpcHRpb259WyRJbmRleF17Q29udGVudH07CgogICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXBhcmUgd2l0aCB0aGUgRW5nbGlzaCBkZXNjcmlwdGlvbiBhbmQgYWxzbyB3aXRoIHRoZSB0cmFuc2xhdGVkIHNlbnRlbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAkRGVzY3JpcHRpb24gPX4gL1xRJFBhcmFte1NlYXJjaH1cRS9pICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJERlc2NyaXB0aW9uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9fiAvXFEkUGFyYW17U2VhcmNofVxFL2kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBMaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJHcm91cCAgICAgID0+ICRTdWJHcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Ykdyb3VwQ291bnQgPT4gJFN1Ykdyb3Vwc3skU3ViR3JvdXB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgICAgICAgICA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlZHsgJEdyb3VwIC4gJzo6JyAuICRTdWJHcm91cCB9ID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBATGlzdDsKfQoKPWl0ZW0gQ29uZmlnSXRlbVRyYW5zbGF0YWJsZVN0cmluZ3MoKQoKcmV0dXJucyBhIHVuaXF1ZSBsaXN0IG9mIGFsbCB0cmFuc2xhdGFibGUgc3RyaW5ncyBpbiB0aGUKWE1MIGNvbmZpZ3VyYXRpb24uCgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVRyYW5zbGF0YWJsZVN0cmluZ3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGVtcHR5IHRyYW5zbGF0aW9uIGxpc3QKICAgICRTZWxmLT57Q29uZmlnSXRlbVRyYW5zbGF0YWJsZVN0cmluZ3N9ID0ge307CgogICAgIyBnZXQgYWxsIGdyb3VwcwogICAgbXkgJUNvbmZpZ0dyb3VwTGlzdCA9ICRTZWxmLT5Db25maWdHcm91cExpc3QoKTsKICAgIGZvciBteSAkR3JvdXAgKCBzb3J0IGtleXMgJUNvbmZpZ0dyb3VwTGlzdCApIHsKCiAgICAgICAgIyBnZXQgYWxsIHN1YiBncm91cHMKICAgICAgICBteSAlQ29uZmlnU3ViR3JvdXBMaXN0ID0gJFNlbGYtPkNvbmZpZ1N1Ykdyb3VwTGlzdCgKICAgICAgICAgICAgTmFtZSA9PiAkR3JvdXAsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFN1Ykdyb3VwICggc29ydCBrZXlzICVDb25maWdTdWJHcm91cExpc3QgKSB7CgogICAgICAgICAgICAjIGdldCBpdGVtcwogICAgICAgICAgICBteSBAQ29uZmlnSXRlbUxpc3QgPSAkU2VsZi0+Q29uZmlnU3ViR3JvdXBDb25maWdJdGVtTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwICAgID0+ICRHcm91cCwKICAgICAgICAgICAgICAgIFN1Ykdyb3VwID0+ICRTdWJHcm91cCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgZm9yIG15ICRDb25maWdJdGVtIChAQ29uZmlnSXRlbUxpc3QpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBhdHRyaWJ1dGVzIG9mIGVhY2ggY29uZmlnIGl0ZW0KICAgICAgICAgICAgICAgIG15ICVDb25maWcgPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICAgICAgICAgICAgICBOYW1lICAgID0+ICRDb25maWdJdGVtLAogICAgICAgICAgICAgICAgICAgIERlZmF1bHQgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IGlmICElQ29uZmlnOwoKICAgICAgICAgICAgICAgICMgZ2V0IHRyYW5zbGF0YWJsZSBzdHJpbmdzCiAgICAgICAgICAgICAgICAkU2VsZi0+X0NvbmZpZ0l0ZW1UcmFuc2xhdGFibGVTdHJpbmdzKCBEYXRhID0+IFwlQ29uZmlnICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgQFN0cmluZ3M7CiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyAkU2VsZi0+e0NvbmZpZ0l0ZW1UcmFuc2xhdGFibGVTdHJpbmdzfSB9ICkgewogICAgICAgIHB1c2ggQFN0cmluZ3MsICRLZXk7CiAgICB9CiAgICByZXR1cm4gQFN0cmluZ3M7Cn0KCj1pdGVtIENvbmZpZ0l0ZW1WYWxpZGF0ZSgpCgpWYWxpZGF0ZXMgaWYgdGhlIGdpdmVuIHZhbHVlIGZvciB0aGlzIGNvbmZpZyBpdGVtIGlzIGNvcnJlY3QuCklmIG5vIHZhbHVlIGlzIGdpdmVuLCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY29uZmlnIGl0ZW0gd2lsbCBiZSB2YWxpZGF0ZWQuClJldHVybnMgdHJ1ZSBpZiBpdCBpcyB2YWxpZCwgZmFsc2Ugb3RoZXJ3aXNlLgoKICAgIG15ICRSZXN1bHQgPSAkU3lzQ29uZmlnT2JqZWN0LT5Db25maWdJdGVtVmFsaWRhdGUoCiAgICAgICAgS2V5ICAgICAgICAgPT4gJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0T3duZXIjIyNQcmlvcml0eURlZmF1bHQnLAogICAgICAgIFZhbHVlICAgICAgID0+ICczIG5vcm1hbCcsICAjIChvcHRpb25hbCkKICAgICAgICBWYWxpZCAgICAgICA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpIG9ubHkgdXNlZCBpZiBBdXRvQ29ycmVjdCBpcyBzZXQKICAgICAgICBBdXRvQ29ycmVjdCA9PiAxLCAgICAgICAgICAgIyAob3B0aW9uYWwpIGF1dG8tY29ycmVjdCB0aGUgY29uZmlnIGl0ZW0KICAgICk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbVZhbGlkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBLZXkhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCB0aGUgY3VycmVudCBjb25maWcgaXRlbQogICAgbXkgJUNvbmZpZ0l0ZW0gPSAkU2VsZi0+Q29uZmlnSXRlbUdldCgKICAgICAgICBOYW1lID0+ICRQYXJhbXtLZXl9LAogICAgKTsKCiAgICAjIGNoZWNrIGlmIGEgdmFsaWRhdGUgbW9kdWxlIGlzIGRlZmluZWQgZm9yIHRoaXMgY29uZmlnIG9wdGlvbgogICAgcmV0dXJuIDEgaWYgISRDb25maWdJdGVte1ZhbGlkYXRlTW9kdWxlfTsKICAgIHJldHVybiAxIGlmIHJlZiAkQ29uZmlnSXRlbXtWYWxpZGF0ZU1vZHVsZX0gbmUgJ0FSUkFZJzsKICAgIHJldHVybiAxIGlmICEkQ29uZmlnSXRlbXtWYWxpZGF0ZU1vZHVsZX0tPlsxXS0+e0NvbnRlbnR9OwoKICAgICMgbG9hZCB0aGUgdmFsaWRhdGUgbW9kdWxlCiAgICBteSAkVmFsaWRhdGVPYmplY3QgPSAkU2VsZi0+X0xvYWRCYWNrZW5kKAogICAgICAgIE1vZHVsZSA9PiAkQ29uZmlnSXRlbXtWYWxpZGF0ZU1vZHVsZX0tPlsxXS0+e0NvbnRlbnR9LAogICAgKTsKCiAgICAjIG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkCiAgICByZXR1cm4gaWYgISRWYWxpZGF0ZU9iamVjdDsKCiAgICAjIHRha2UgdGhlIGdpdmVuIHZhbHVlCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwoKICAgICMgaWYgbm8gdmFsdWUgaXMgZ2l2ZW4sIHRha2UgdGhlIGFscmVhZHkgc3RvcmVkIHZhbHVlCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CgogICAgICAgICMgc3RyaW5nCiAgICAgICAgaWYgKCAkQ29uZmlnSXRlbXtTZXR0aW5nfS0+WzFdLT57U3RyaW5nfS0+WzFdLT57Q29udGVudH0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntTdHJpbmd9LT5bMV0tPntDb250ZW50fTsKICAgICAgICB9CgogICAgICAgICMgdGV4dGFyZWEKICAgICAgICBlbHNpZiAoICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntUZXh0QXJlYX0tPlsxXS0+e0NvbnRlbnR9ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkQ29uZmlnSXRlbXtTZXR0aW5nfS0+WzFdLT57VGV4dEFyZWF9LT5bMV0tPntDb250ZW50fTsKICAgICAgICB9CgogICAgICAgICMgb3B0aW9uCiAgICAgICAgIyAobW9yZSBjb21wbGV4LCBzbyBnaXZlIHRoZSBjb21wbGV0ZSBkYXRhIHN0cnVjdHVyZSkKICAgICAgICBlbHNpZiAoICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntPcHRpb259LT5bMV0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntPcHRpb259LT5bMV07CiAgICAgICAgfQoKICAgICAgICAjIGhhc2gKICAgICAgICBlbHNpZiAoICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntIYXNofS0+WzFdLT57SXRlbX0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntIYXNofS0+WzFdLT57SXRlbX07CiAgICAgICAgfQoKICAgICAgICAjIGFycmF5CiAgICAgICAgZWxzaWYgKCAkQ29uZmlnSXRlbXtTZXR0aW5nfS0+WzFdLT57QXJyYXl9LT5bMV0tPntJdGVtfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJENvbmZpZ0l0ZW17U2V0dGluZ30tPlsxXS0+e0FycmF5fS0+WzFdLT57SXRlbX07CiAgICAgICAgfQoKICAgICAgICAjIEZyb250ZW5kTW9kdWxlUmVnCiAgICAgICAgIyAobW9yZSBjb21wbGV4LCBzbyBnaXZlIHRoZSBjb21wbGV0ZSBkYXRhIHN0cnVjdHVyZSkKICAgICAgICBlbHNpZiAoICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntGcm9udGVuZE1vZHVsZVJlZ30tPlsxXSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJENvbmZpZ0l0ZW17U2V0dGluZ30tPlsxXS0+e0Zyb250ZW5kTW9kdWxlUmVnfS0+WzFdOwogICAgICAgIH0KCiAgICAgICAgIyBUaW1lV29ya2luZ0hvdXJzCiAgICAgICAgZWxzaWYgKCAkQ29uZmlnSXRlbXtTZXR0aW5nfS0+WzFdLT57VGltZVdvcmtpbmdIb3Vyc30tPlsxXS0+e0RheX0gKSB7CiAgICAgICAgICAgICRWYWx1ZSA9ICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntUaW1lV29ya2luZ0hvdXJzfS0+WzFdLT57RGF5fTsKICAgICAgICB9CgogICAgICAgICMgVGltZVZhY2F0aW9uRGF5cwogICAgICAgIGVsc2lmICggJENvbmZpZ0l0ZW17U2V0dGluZ30tPlsxXS0+e1RpbWVWYWNhdGlvbkRheXN9LT5bMV0tPntJdGVtfSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJENvbmZpZ0l0ZW17U2V0dGluZ30tPlsxXS0+e1RpbWVWYWNhdGlvbkRheXN9LT5bMV0tPntJdGVtfTsKICAgICAgICB9CgogICAgICAgICMgVGltZVZhY2F0aW9uRGF5c09uZVRpbWUKICAgICAgICBlbHNpZiAoICRDb25maWdJdGVte1NldHRpbmd9LT5bMV0tPntUaW1lVmFjYXRpb25EYXlzT25lVGltZX0tPlsxXS0+e0l0ZW19ICkgewogICAgICAgICAgICAkVmFsdWUgPSAkQ29uZmlnSXRlbXtTZXR0aW5nfS0+WzFdLT57VGltZVZhY2F0aW9uRGF5c09uZVRpbWV9LT5bMV0tPntJdGVtfTsKICAgICAgICB9CgogICAgICAgICMgdW5rbm93biBjb25maWcgaXRlbSBjYW4gbm90IGJlIHZhbGlkYXRlZCwgc28gcmV0dXJuIHRydWUKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgYXV0by1jb3JyZWN0aW9uIGlzIHJlcXVlc3RlZAogICAgaWYgKCAkUGFyYW17QXV0b0NvcnJlY3R9ICkgewoKICAgICAgICAjIGdldCB0aGUgYXV0by1jb3JyZWN0IHZhbHVlCiAgICAgICAgJFZhbHVlID0gJFZhbGlkYXRlT2JqZWN0LT5HZXRBdXRvQ29ycmVjdFZhbHVlKAogICAgICAgICAgICBEYXRhID0+ICRWYWx1ZSwKICAgICAgICApOwoKICAgICAgICAjIGlmIHRoZSB2YWxpZCBwYXJhbSBpcyBnaXZlbiwgdXNlIGl0LCBvdGhlcndpc2UgdGFrZSB2YWxpZCBzZXR0aW5nIGZyb20gY29uZmlnIGl0ZW0KICAgICAgICBteSAkVmFsaWQgPSBkZWZpbmVkICRQYXJhbXtWYWxpZH0gPyAkUGFyYW17VmFsaWR9IDogJENvbmZpZ0l0ZW17VmFsaWR9OwoKICAgICAgICAjIHVwZGF0ZSB0aGUgY29uZmlnIGl0ZW0gd2l0aCB0aGUgbmV3IHZhbHVlCiAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3MgPSAkU2VsZi0+Q29uZmlnSXRlbVVwZGF0ZSgKICAgICAgICAgICAgVmFsaWQgICAgICAgID0+ICRWYWxpZCwKICAgICAgICAgICAgS2V5ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgPT4gJFZhbHVlLAogICAgICAgICAgICBOb1ZhbGlkYXRpb24gPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiB0aGUgdXBkYXRlIHJlc3VsdAogICAgICAgIHJldHVybiAkVXBkYXRlU3VjY2VzczsKICAgIH0KCiAgICAjIG9ubHkgdmFsaWRhdGlvbiBpcyBuZWVkZWQKICAgIGVsc2UgewoKICAgICAgICAjIHZhbGlkYXRlIHRoZSB2YWx1ZQogICAgICAgIG15ICRWYWxpZGF0ZU9rID0gJFZhbGlkYXRlT2JqZWN0LT5WYWxpZGF0ZSgKICAgICAgICAgICAgRGF0YSA9PiAkVmFsdWUsCiAgICAgICAgKTsKCiAgICAgICAgIyByZXR1cm4gdGhlIHZhbGlkYXRpb24gcmVzdWx0CiAgICAgICAgcmV0dXJuICRWYWxpZGF0ZU9rOwogICAgfQp9Cgo9aXRlbSBDb25maWdJdGVtQ2hlY2tBbGwoKQoKVmFsaWRhdGVzIGFsbCBjb25maWcgaXRlbXMgd2hpY2ggaGF2ZSBhIHZhbGlkYXRpb24gbW9kdWxlLgpBdXRvbWF0aWNhbGx5IGNvcnJlY3RzIHdyb25nIHZhbHVlcy4KCiAgICBteSAkUmVzdWx0ID0gJFN5c0NvbmZpZ09iamVjdC0+Q29uZmlnSXRlbUNoZWNrQWxsKCk7Cgo9Y3V0CgpzdWIgQ29uZmlnSXRlbUNoZWNrQWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgYWxsIGNvbmZpZyBncm91cHMKICAgIG15ICVHcm91cHMgPSAkU2VsZi0+Q29uZmlnR3JvdXBMaXN0KCk7CgogICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyglR3JvdXBzKSApIHsKCiAgICAgICAgIyBnZXQgYWxsIHN1Ymdyb3VwcyBmb3IgdGhpcyBncm91cAogICAgICAgIG15ICVTdWJHcm91cHMgPSAkU2VsZi0+Q29uZmlnU3ViR3JvdXBMaXN0KCBOYW1lID0+ICRHcm91cCApOwoKICAgICAgICBmb3IgbXkgJFN1Ykdyb3VwICggc29ydCBrZXlzICVTdWJHcm91cHMgKSB7CgogICAgICAgICAgICAjIGdldCBhbGwgaXRlbXMgZm9yIHRoaXMgc3ViZ3JvdXAKICAgICAgICAgICAgbXkgQEl0ZW1zID0gJFNlbGYtPkNvbmZpZ1N1Ykdyb3VwQ29uZmlnSXRlbUxpc3QoCiAgICAgICAgICAgICAgICBHcm91cCAgICA9PiAkR3JvdXAsCiAgICAgICAgICAgICAgICBTdWJHcm91cCA9PiAkU3ViR3JvdXAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGNoZWNrIGVhY2ggaXRlbQogICAgICAgICAgICBJVEVNOgogICAgICAgICAgICBmb3IgbXkgJEl0ZW0gKEBJdGVtcykgewoKICAgICAgICAgICAgICAgICMgdmFsaWRhdGUgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbQogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlT2sgPSAkU2VsZi0+Q29uZmlnSXRlbVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIEtleSA9PiAkSXRlbSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyB2YWxpZGF0aW9uIGlzIG9rCiAgICAgICAgICAgICAgICBuZXh0IElURU0gaWYgJFZhbGlkYXRlT2s7CgogICAgICAgICAgICAgICAgIyB2YWxpZGF0aW9uIGlzIG5vdCBvaywgYXV0by1jb3JyZWN0IHRoZSB2YWx1ZQogICAgICAgICAgICAgICAgbXkgJEF1dG9Db3JyZWN0T2sgPSAkU2VsZi0+Q29uZmlnSXRlbVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICAgICAgICAgIEF1dG9Db3JyZWN0ID0+IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9YmVnaW4gSW50ZXJuYWw6Cgo9Y3V0CgpzdWIgX0luaXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ291bnRlciA9IDA7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGxvYWQgeG1sIGNvbmZpZyBmaWxlcwogICAgaWYgKCAtZSAiJFNlbGYtPntIb21lfS9LZXJuZWwvQ29uZmlnL0ZpbGVzLyIgKSB7CiAgICAgICAgbXkgJURhdGE7CiAgICAgICAgbXkgJERpcmVjdG9yeSA9ICIkU2VsZi0+e0hvbWV9L0tlcm5lbC9Db25maWcvRmlsZXMvIjsKICAgICAgICBteSBARmlsZXMgICAgID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICREaXJlY3RvcnksCiAgICAgICAgICAgIEZpbHRlciAgICA9PiAiKi54bWwiLAogICAgICAgICk7CgogICAgICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICAgICBmb3IgbXkgJERpciAoQElOQykgewogICAgICAgICAgICBteSAkQ29uZkRpciA9ICIkRGlyL0tlcm5lbC9Db25maWcvRmlsZXMvIjsKICAgICAgICAgICAgJENvbmZEaXIgPX4gcydccydcXHMnZzsKICAgICAgICAgICAgaWYgKCAtZSAiJENvbmZEaXIiICkgewogICAgICAgICAgICAgICAgbXkgQEtJWEZpbGVzID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgICAgICAgICBEaXJlY3RvcnkgPT4gJENvbmZEaXIsCiAgICAgICAgICAgICAgICAgICAgRmlsdGVyICAgID0+ICIqLnhtbCIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBARmlsZXMsIEBLSVhGaWxlczsKCiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKCiAgICAgICAgIyBnZXQgdGhlIG1kNSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBzdGF0ZQogICAgICAgIG15ICRDb25maWdDaGVja3N1bSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+Q29uZmlnQ2hlY2tzdW0oKTsKCiAgICAgICAgZm9yIG15ICRGaWxlIChARmlsZXMpIHsKICAgICAgICAgICAgbXkgJENvbmZpZ0ZpbGUgPSAnJzsKICAgICAgICAgICAgbXkgJEluOwogICAgICAgICAgICBpZiAoIG9wZW4oICRJbiwgJzwnLCAkRmlsZSApICkgewogICAgICAgICAgICAgICAgJENvbmZpZ0ZpbGUgPSBkbyB7IGxvY2FsICQvOyA8JEluPiB9OwogICAgICAgICAgICAgICAgY2xvc2UgJEluOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3Qgb3BlbiBmaWxlICRGaWxlOiAkISIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRGaWxlQ2FjaGVQYXJ0ID0gJEZpbGU7CiAgICAgICAgICAgICRGaWxlQ2FjaGVQYXJ0ID1+IHMvXFEkU2VsZi0+e0hvbWV9XEUvLzsKICAgICAgICAgICAgJEZpbGVDYWNoZVBhcnQgPX4gcy9cL1wvL1wvL2c7CiAgICAgICAgICAgICRGaWxlQ2FjaGVQYXJ0ID1+IHMvXC8vXy9nOwogICAgICAgICAgICBpZiAoJENvbmZpZ0ZpbGUpIHsKICAgICAgICAgICAgICAgIG15ICRDYWNoZUZpbGVVc2VkID0gMDsKICAgICAgICAgICAgICAgIG15ICREaWdlc3QgICAgICAgID0gJFNlbGYtPntNYWluT2JqZWN0fS0+TUQ1c3VtKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQ29uZmlnRmlsZSAuICRDb25maWdDaGVja3N1bSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkRmlsZUNhY2hlID0gIiRTZWxmLT57SG9tZX0vdmFyL3RtcC9TeXNDb25maWctQ2FjaGUkRmlsZUNhY2hlUGFydC0kRGlnZXN0LnBtIjsKICAgICAgICAgICAgICAgIGlmICggLWUgJEZpbGVDYWNoZSApIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ29uZmlnRmlsZUNhY2hlID0gJyc7CiAgICAgICAgICAgICAgICAgICAgbXkgJEluOwogICAgICAgICAgICAgICAgICAgIGlmICggb3BlbiggJEluLCAiPCRTZWxmLT57RmlsZU1vZGV9IiwgJEZpbGVDYWNoZSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnRmlsZUNhY2hlID0gZG8geyBsb2NhbCAkLzsgPCRJbj4gfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UgJEluOwogICAgICAgICAgICAgICAgICAgICAgICBteSAkWE1MSGFzaFJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBldmFsICRDb25maWdGaWxlQ2FjaGUgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXskRmlsZX0gPSAkWE1MSGFzaFJlZjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRDYWNoZUZpbGVVc2VkID0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IG9wZW4gY2FjaGUgZmlsZSAkRmlsZUNhY2hlOiAkISIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAgICAgICAgICMgcmVtb3ZlIGFsbCBjYWNoZSBmaWxlcwogICAgICAgICAgICAgICAgICAgIG15IEBMaXN0ID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RGlyZWN0b3J5UmVhZCgKICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0b3J5ID0+ICIkU2VsZi0+e0hvbWV9L3Zhci90bXAiLAogICAgICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgICAgPT4gIlN5c0NvbmZpZy1DYWNoZSRGaWxlQ2FjaGVQYXJ0LSoucG0iLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICB1bmxpbmsgJEZpbGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcGFyc2UgY29uZmlnIGZpbGVzCiAgICAgICAgICAgICAgICBpZiAoICEkQ2FjaGVGaWxlVXNlZCApIHsKICAgICAgICAgICAgICAgICAgICBteSBAWE1MSGFzaCA9ICRTZWxmLT57WE1MT2JqZWN0fS0+WE1MUGFyc2UyWE1MSGFzaCggU3RyaW5nID0+ICRDb25maWdGaWxlICk7CiAgICAgICAgICAgICAgICAgICAgJERhdGF7JEZpbGV9ID0gXEBYTUxIYXNoOwogICAgICAgICAgICAgICAgICAgIG15ICREdW1wID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RHVtcCggXEBYTUxIYXNoLCAnYXNjaWknICk7CiAgICAgICAgICAgICAgICAgICAgJER1bXAgPX4gcy9cJFZBUjEvXCRYTUxIYXNoUmVmLzsKICAgICAgICAgICAgICAgICAgICBteSAkT3V0OwogICAgICAgICAgICAgICAgICAgIGlmICggb3BlbiggJE91dCwgIj4kU2VsZi0+e0ZpbGVNb2RlfSIsICRGaWxlQ2FjaGUgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e3V0Zjh9ICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJE91dCAidXNlIHV0Zjg7XG4iOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICRPdXQgJER1bXAgLiAiXG4xOyI7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCRPdXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IHdyaXRlIGNhY2hlIGZpbGUgJEZpbGVDYWNoZTogJCEiLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAkU2VsZi0+e1hNTENvbmZpZ30gPSBbXTsKCiAgICAgICAgIyBsb2FkIGZyYW1ld29yaywgYXBwbGljYXRpb24sIGNvbmZpZywgY2hhbmdlcwogICAgICAgICMgS0lYQ29yZS1jYXBlSVQKICAgICAgICAjZm9yIG15ICRJbml0IChxdyhGcmFtZXdvcmsgQXBwbGljYXRpb24gQ29uZmlnIENoYW5nZXMpKSB7CiAgICAgICAgZm9yIG15ICRJbml0ICgKICAgICAgICAgICAgcXcoRnJhbWV3b3JrIEFwcGxpY2F0aW9uIENvbmZpZyBDaGFuZ2VzIEtJWEZyYW1ld29yayBLSVhBcHBsaWNhdGlvbiBLSVhDb25maWcgS0lYQ2hhbmdlcykKICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgRU8gS0lYQ29yZS1jYXBlSVQKICAgICAgICAgICAgZm9yIG15ICRTZXQgKCBzb3J0IGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkRGF0YXskU2V0fS0+WzFdLT57b3Ryc19jb25maWd9LT5bMV0tPntpbml0fQogICAgICAgICAgICAgICAgICAgICYmICREYXRheyRTZXR9LT5bMV0tPntvdHJzX2NvbmZpZ30tPlsxXS0+e2luaXR9IGVxICRJbml0CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIGp1c3QgdXNlIHZhbGlkIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICBpZiAoICREYXRheyRTZXR9LT5bMV0tPntvdHJzX2NvbmZpZ30tPlsxXS0+e0NvbmZpZ0l0ZW19ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQHsgJFNlbGYtPntYTUxDb25maWd9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAeyAkRGF0YXskU2V0fS0+WzFdLT57b3Ryc19jb25maWd9LT5bMV0tPntDb25maWdJdGVtfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskU2V0fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBsb2FkIG1pc2MKICAgICAgICBmb3IgbXkgJFNldCAoIHNvcnQga2V5cyAlRGF0YSApIHsKICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57WE1MQ29uZmlnfSB9LAogICAgICAgICAgICAgICAgQHsgJERhdGF7JFNldH0tPlsxXS0+e290cnNfY29uZmlnfS0+WzFdLT57Q29uZmlnSXRlbX0gfQogICAgICAgICAgICApOwogICAgICAgICAgICBkZWxldGUgJERhdGF7JFNldH07CiAgICAgICAgfQogICAgfQoKICAgICMgcmVtb3ZlIGR1cGxpY2F0ZSBlbnRyaWVzCiAgICBteSAlVXNlZDsKICAgIG15IEBYTUxDb25maWc7CiAgICBmb3IgbXkgJENvbmZpZ0l0ZW0gKCByZXZlcnNlIEB7ICRTZWxmLT57WE1MQ29uZmlnfSB9ICkgewogICAgICAgIG5leHQgaWYgISRDb25maWdJdGVtOwogICAgICAgIG5leHQgaWYgISRDb25maWdJdGVtLT57TmFtZX07CiAgICAgICAgbmV4dCBpZiAkVXNlZHsgJENvbmZpZ0l0ZW0tPntOYW1lfSB9OwogICAgICAgICRVc2VkeyAkQ29uZmlnSXRlbS0+e05hbWV9IH0gPSAxOwogICAgICAgIHB1c2ggQFhNTENvbmZpZywgJENvbmZpZ0l0ZW07CiAgICB9CiAgICAkU2VsZi0+e1hNTENvbmZpZ30gPSBcQFhNTENvbmZpZzsKCiAgICAjIHJlYWQgYWxsIGNvbmZpZyBmaWxlcwogICAgZm9yIG15ICRDb25maWdJdGVtICggcmV2ZXJzZSBAeyAkU2VsZi0+e1hNTENvbmZpZ30gfSApIHsKICAgICAgICAkQ291bnRlcisrOwogICAgICAgIGlmICggJENvbmZpZ0l0ZW0tPntOYW1lfSAmJiAhJFNlbGYtPntDb25maWd9LT57ICRDb25maWdJdGVtLT57TmFtZX0gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57ICRDb25maWdJdGVtLT57TmFtZX0gfSA9ICRDb25maWdJdGVtOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkQ291bnRlcjsKfQoKPWl0ZW0gX0RhdGFEaWZmKCkKCmNvbXBhcmVzIHR3byBkYXRhIHN0cnVjdHVyZXMgd2l0aCBlYWNoIG90aGVyLiBSZXR1cm5zIDEgaWYKdGhleSBhcmUgZGlmZmVyZW50LCB1bmRlZiBvdGhlcndpc2UuCgpEYXRhIHBhcmFtZXRlcnMgbmVlZCB0byBiZSBwYXNzZWQgYnkgcmVmZXJlbmNlIGFuZCBjYW4gYmUgU0NBTEFSLApBUlJBWSBvciBIQVNILgoKICAgIG15ICREYXRhSXNEaWZmZXJlbnQgPSAkU3lzQ29uZmlnT2JqZWN0LT5fRGF0YURpZmYoCiAgICAgICAgRGF0YTEgPT4gXCREYXRhMSwKICAgICAgICBEYXRhMiA9PiBcJERhdGEyLAogICAgKTsKCj1jdXQKCnN1YiBfRGF0YURpZmYgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhEYXRhMSBEYXRhMikpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjICcnCiAgICBpZiAoIHJlZiAkUGFyYW17RGF0YTF9IGVxICcnICYmIHJlZiAkUGFyYW17RGF0YTJ9IGVxICcnICkgewoKICAgICAgICAjIGRvIG5vdGhpbmcsIGl0J3Mgb2sKICAgICAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte0RhdGExfSAmJiAhZGVmaW5lZCAkUGFyYW17RGF0YTJ9OwoKICAgICAgICAjIHJldHVybiBkaWZmLCBiZWNhdXNlIGl0cyBkaWZmZXJlbnQKICAgICAgICByZXR1cm4gMSBpZiAhZGVmaW5lZCAkUGFyYW17RGF0YTF9IHx8ICFkZWZpbmVkICRQYXJhbXtEYXRhMn07CgogICAgICAgICMgcmV0dXJuIGRpZmYsIGJlY2F1c2UgaXRzIGRpZmZlcmVudAogICAgICAgIHJldHVybiAxIGlmICRQYXJhbXtEYXRhMX0gbmUgJFBhcmFte0RhdGEyfTsKCiAgICAgICAgIyByZXR1cm4sIGJlY2F1c2UgaXRzIG5vdCBkaWZmZXJlbnQKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBTQ0FMQVIKICAgIGlmICggcmVmICRQYXJhbXtEYXRhMX0gZXEgJ1NDQUxBUicgJiYgcmVmICRQYXJhbXtEYXRhMn0gZXEgJ1NDQUxBUicgKSB7CgogICAgICAgICMgZG8gbm90aGluZywgaXQncyBvawogICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkeyAkUGFyYW17RGF0YTF9IH0gJiYgIWRlZmluZWQgJHsgJFBhcmFte0RhdGEyfSB9OwoKICAgICAgICAjIHJldHVybiBkaWZmLCBiZWNhdXNlIGl0cyBkaWZmZXJlbnQKICAgICAgICByZXR1cm4gMSBpZiAhZGVmaW5lZCAkeyAkUGFyYW17RGF0YTF9IH0gfHwgIWRlZmluZWQgJHsgJFBhcmFte0RhdGEyfSB9OwoKICAgICAgICAjIHJldHVybiBkaWZmLCBiZWNhdXNlIGl0cyBkaWZmZXJlbnQKICAgICAgICByZXR1cm4gMSBpZiAkeyAkUGFyYW17RGF0YTF9IH0gbmUgJHsgJFBhcmFte0RhdGEyfSB9OwoKICAgICAgICAjIHJldHVybiwgYmVjYXVzZSBpdHMgbm90IGRpZmZlcmVudAogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEFSUkFZCiAgICBpZiAoIHJlZiAkUGFyYW17RGF0YTF9IGVxICdBUlJBWScgJiYgcmVmICRQYXJhbXtEYXRhMn0gZXEgJ0FSUkFZJyApIHsKICAgICAgICBteSBAQSA9IEB7ICRQYXJhbXtEYXRhMX0gfTsKICAgICAgICBteSBAQiA9IEB7ICRQYXJhbXtEYXRhMn0gfTsKCiAgICAgICAgIyBjaGVjayBpZiB0aGUgY291bnQgaXMgZGlmZmVyZW50CiAgICAgICAgcmV0dXJuIDEgaWYgJCNBIG5lICQjQjsKCiAgICAgICAgIyBjb21wYXJlIGFycmF5CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDAgLi4gJCNBICkgewoKICAgICAgICAgICAgIyBkbyBub3RoaW5nLCBpdCdzIG9rCiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEFbJENvdW50XSAmJiAhZGVmaW5lZCAkQlskQ291bnRdOwoKICAgICAgICAgICAgIyByZXR1cm4gZGlmZiwgYmVjYXVzZSBpdHMgZGlmZmVyZW50CiAgICAgICAgICAgIHJldHVybiAxIGlmICFkZWZpbmVkICRBWyRDb3VudF0gfHwgIWRlZmluZWQgJEJbJENvdW50XTsKCiAgICAgICAgICAgIGlmICggJEFbJENvdW50XSBuZSAkQlskQ291bnRdICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJEFbJENvdW50XSBlcSAnQVJSQVknIHx8IHJlZiAkQVskQ291bnRdIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSBpZiAkU2VsZi0+X0RhdGFEaWZmKCBEYXRhMSA9PiAkQVskQ291bnRdLCBEYXRhMiA9PiAkQlskQ291bnRdICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIEhBU0gKICAgIGlmICggcmVmICRQYXJhbXtEYXRhMX0gZXEgJ0hBU0gnICYmIHJlZiAkUGFyYW17RGF0YTJ9IGVxICdIQVNIJyApIHsKICAgICAgICBteSAlQSA9ICV7ICRQYXJhbXtEYXRhMX0gfTsKICAgICAgICBteSAlQiA9ICV7ICRQYXJhbXtEYXRhMn0gfTsKCiAgICAgICAgIyBjb21wYXJlICVBIHdpdGggJUIgYW5kIHJlbW92ZSBpdCBpZiBjaGVja2VkCiAgICAgICAgZm9yIG15ICRLZXkgKCBrZXlzICVBICkgewoKICAgICAgICAgICAgIyBkbyBub3RoaW5nLCBpdCdzIG9rCiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEF7JEtleX0gJiYgIWRlZmluZWQgJEJ7JEtleX07CgogICAgICAgICAgICAjIHJldHVybiBkaWZmLCBiZWNhdXNlIGl0cyBkaWZmZXJlbnQKICAgICAgICAgICAgcmV0dXJuIDEgaWYgIWRlZmluZWQgJEF7JEtleX0gfHwgIWRlZmluZWQgJEJ7JEtleX07CgogICAgICAgICAgICBpZiAoICRBeyRLZXl9IGVxICRCeyRLZXl9ICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRBeyRLZXl9OwogICAgICAgICAgICAgICAgZGVsZXRlICRCeyRLZXl9OwogICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZXR1cm4gaWYgdmFsdWVzIGFyZSBkaWZmZXJlbnQKICAgICAgICAgICAgaWYgKCByZWYgJEF7JEtleX0gZXEgJ0FSUkFZJyB8fCByZWYgJEF7JEtleX0gZXEgJ0hBU0gnICkgewogICAgICAgICAgICAgICAgcmV0dXJuIDEgaWYgJFNlbGYtPl9EYXRhRGlmZiggRGF0YTEgPT4gJEF7JEtleX0sIERhdGEyID0+ICRCeyRLZXl9ICk7CiAgICAgICAgICAgICAgICBkZWxldGUgJEF7JEtleX07CiAgICAgICAgICAgICAgICBkZWxldGUgJEJ7JEtleX07CiAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayByZXN0CiAgICAgICAgcmV0dXJuIDEgaWYgJUI7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggcmVmICRQYXJhbXtEYXRhMX0gZXEgJ1JFRicgJiYgcmVmICRQYXJhbXtEYXRhMn0gZXEgJ1JFRicgKSB7CiAgICAgICAgcmV0dXJuIDEgaWYgJFNlbGYtPl9EYXRhRGlmZiggRGF0YTEgPT4gJHsgJFBhcmFte0RhdGExfSB9LCBEYXRhMiA9PiAkeyAkUGFyYW17RGF0YTJ9IH0gKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIERFU1RST1koKQoKdGhpcyBkZXN0cnVjdG9yIHdpbGwgcmVjcmVhdGUgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBhZnRlcgpjaGFuZ2VzIHdlcmUgZGV0ZWN0ZWQgZHVyaW5nIG1vZHVsZSBleGVjdXRpb24uCgo9Y3V0CgpzdWIgREVTVFJPWSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFNlbGYtPntVcGRhdGV9ICkgewoKICAgICAgICAjIHdyaXRlIGRlZmF1bHQgZmlsZQogICAgICAgICRTZWxmLT5Xcml0ZURlZmF1bHQoKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX0NvbmZpZ0l0ZW1UcmFuc2xhdGFibGVTdHJpbmdzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGF0YSkpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIEFSUkFZCiAgICBpZiAoIHJlZiAkUGFyYW17RGF0YX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICBmb3IgbXkgJEtleSAoIEB7ICRQYXJhbXtEYXRhfSB9ICkgewogICAgICAgICAgICBuZXh0IGlmICEkS2V5OwogICAgICAgICAgICAkU2VsZi0+X0NvbmZpZ0l0ZW1UcmFuc2xhdGFibGVTdHJpbmdzKCBEYXRhID0+ICRLZXkgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgSEFTSAogICAgaWYgKCByZWYgJFBhcmFte0RhdGF9IGVxICdIQVNIJyApIHsKICAgICAgICBmb3IgbXkgJEtleSAoIGtleXMgJXsgJFBhcmFte0RhdGF9IH0gKSB7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgIHJlZiAkUGFyYW17RGF0YX0tPnskS2V5fSBlcSAnJwogICAgICAgICAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57VHJhbnNsYXRhYmxlfQogICAgICAgICAgICAgICAgJiYgJFBhcmFte0RhdGF9LT57Q29udGVudH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcmV0dXJuIGlmICEkUGFyYW17RGF0YX0tPntDb250ZW50fTsKICAgICAgICAgICAgICAgIHJldHVybiBpZiAkUGFyYW17RGF0YX0tPntDb250ZW50fSA9fiAvXlxkKyQvOwogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdJdGVtVHJhbnNsYXRhYmxlU3RyaW5nc30tPnsgJFBhcmFte0RhdGF9LT57Q29udGVudH0gfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPl9Db25maWdJdGVtVHJhbnNsYXRhYmxlU3RyaW5ncyggRGF0YSA9PiAkUGFyYW17RGF0YX0tPnskS2V5fSApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKc3ViIF9Nb2RHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkQ29udGVudDsKICAgIG15ICRDb25maWdPYmplY3Q7CgogICAgIyBkbyBub3QgdXNlIFpaWiBmaWxlcwogICAgaWYgKCAkUGFyYW17TGV2ZWx9ICYmICRQYXJhbXtMZXZlbH0gZXEgJ0RlZmF1bHQnICkgewogICAgICAgICRDb25maWdPYmplY3QgPSAkU2VsZi0+e0NvbmZpZ0RlZmF1bHRPYmplY3R9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17TGV2ZWx9ICYmICRQYXJhbXtMZXZlbH0gZXEgJ0NsZWFyJyApIHsKICAgICAgICAkQ29uZmlnT2JqZWN0ID0gJFNlbGYtPntDb25maWdDbGVhck9iamVjdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkQ29uZmlnT2JqZWN0ID0gJFNlbGYtPntDb25maWdPYmplY3R9OwogICAgfQoKICAgICMgZ2V0IGNvbmZpZyB2YWx1ZSBvZiBIQVNILT5IQVNILT5IQVNICiAgICBpZiAoICRQYXJhbXtDb25maWdOYW1lfSA9fiAvXiguKikjIyMoLiopIyMjKC4qKSQvICkgewogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJDEpOwogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnICYmIHJlZiAkQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJENvbmZpZ1N1YiA9ICRDb25maWctPnskMn07CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnU3ViICYmIHJlZiAkQ29uZmlnU3ViIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgICRDb250ZW50ID0gJENvbmZpZ1N1Yi0+eyQzfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgdmFsdWUgb2YgSEFTSC0+SEFTSAogICAgZWxzaWYgKCAkUGFyYW17Q29uZmlnTmFtZX0gPX4gL14oLiopIyMjKC4qKSQvICkgewogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJDEpOwogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnICYmIHJlZiAkQ29uZmlnIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgJENvbnRlbnQgPSAkQ29uZmlnLT57JDJ9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgdmFsdWUKICAgIGVsc2UgewogICAgICAgIG15ICRDb25maWcgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtDb25maWdOYW1lfSApOwogICAgICAgIGlmICggZGVmaW5lZCAkQ29uZmlnICkgewogICAgICAgICAgICAkQ29udGVudCA9ICRDb25maWc7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuICRDb250ZW50Owp9CgpzdWIgX1hNTDJQZXJsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoRGF0YSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAkQ29uZmlnSXRlbSA9ICRQYXJhbXtEYXRhfS0+e1NldHRpbmd9LT5bMV07CiAgICBteSAkRGF0YTsKICAgIGlmICggJENvbmZpZ0l0ZW0tPntTdHJpbmd9ICkgewogICAgICAgICREYXRhID0gJENvbmZpZ0l0ZW0tPntTdHJpbmd9LT5bMV0tPntDb250ZW50fTsKICAgICAgICBteSAkRCA9ICREYXRhOwogICAgICAgICREYXRhID0gJEQ7CgogICAgICAgICMgc3RvcmUgaW4gY29uZmlnCiAgICAgICAgbXkgJER1bXAgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EdW1wKCAkRGF0YSwgJ2FzY2lpJyApOwogICAgICAgICREdW1wID1+IHMvXCRWQVIxID0vLzsKICAgICAgICAkRGF0YSA9ICREdW1wOwogICAgfQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e09wdGlvbn0gKSB7CiAgICAgICAgJERhdGEgPSAkQ29uZmlnSXRlbS0+e09wdGlvbn0tPlsxXS0+e1NlbGVjdGVkSUR9OwogICAgICAgIG15ICREID0gJERhdGE7CiAgICAgICAgJERhdGEgPSAkRDsKCiAgICAgICAgIyBzdG9yZSBpbiBjb25maWcKICAgICAgICBteSAkRHVtcCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkR1bXAoICREYXRhLCAnYXNjaWknICk7CiAgICAgICAgJER1bXAgPX4gcy9cJFZBUjEgPS8vOwogICAgICAgICREYXRhID0gJER1bXA7CiAgICB9CiAgICBpZiAoICRDb25maWdJdGVtLT57VGV4dEFyZWF9ICkgewogICAgICAgICREYXRhID0gJENvbmZpZ0l0ZW0tPntUZXh0QXJlYX0tPlsxXS0+e0NvbnRlbnR9OwogICAgICAgICREYXRhID1+IHMvKFxuXHJ8XHJcclxufFxyXG4pL1xuL2c7CiAgICAgICAgbXkgJEQgPSAkRGF0YTsKICAgICAgICAkRGF0YSA9ICREOwoKICAgICAgICAjIHN0b3JlIGluIGNvbmZpZwogICAgICAgIG15ICREdW1wID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RHVtcCggJERhdGEsICdhc2NpaScgKTsKICAgICAgICAkRHVtcCA9fiBzL1wkVkFSMSA9Ly87CiAgICAgICAgJERhdGEgPSAkRHVtcDsKICAgIH0KICAgIGlmICggJENvbmZpZ0l0ZW0tPntIYXNofSApIHsKICAgICAgICBteSAlSGFzaDsKICAgICAgICBteSBAQXJyYXk7CiAgICAgICAgaWYgKCByZWYgJENvbmZpZ0l0ZW0tPntIYXNofS0+WzFdLT57SXRlbX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgQEFycmF5ID0gQHsgJENvbmZpZ0l0ZW0tPntIYXNofS0+WzFdLT57SXRlbX0gfTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRJdGVtICggMSAuLiAkI0FycmF5ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEFycmF5WyRJdGVtXS0+e0hhc2h9ICkgewogICAgICAgICAgICAgICAgbXkgJVN1Ykhhc2g7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEluZGV4ICgKICAgICAgICAgICAgICAgICAgICAxIC4uICQjeyAkQ29uZmlnSXRlbS0+e0hhc2h9LT5bMV0tPntJdGVtfS0+WyRJdGVtXS0+e0hhc2h9LT5bMV0tPntJdGVtfSB9CiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICRTdWJIYXNoewogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0hhc2h9LT5bMV0tPntJdGVtfS0+WyRJdGVtXS0+e0hhc2h9LT5bMV0tPntJdGVtfS0+WyRJbmRleF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e0tleX0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRDb25maWdJdGVtLT57SGFzaH0tPlsxXS0+e0l0ZW19LT5bJEl0ZW1dLT57SGFzaH0tPlsxXS0+e0l0ZW19LT5bJEluZGV4XQogICAgICAgICAgICAgICAgICAgICAgICAtPntDb250ZW50fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRIYXNoeyAkQXJyYXlbJEl0ZW1dLT57S2V5fSB9ID0gXCVTdWJIYXNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggZGVmaW5lZCAkQXJyYXlbJEl0ZW1dLT57QXJyYXl9ICkgewogICAgICAgICAgICAgICAgbXkgQFN1YkFycmF5OwogICAgICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoCiAgICAgICAgICAgICAgICAgICAgMSAuLiAkI3sgJENvbmZpZ0l0ZW0tPntIYXNofS0+WzFdLT57SXRlbX0tPlskSXRlbV0tPntBcnJheX0tPlsxXS0+e0l0ZW19IH0KICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgQFN1YkFycmF5LAogICAgICAgICAgICAgICAgICAgICAgICAkQ29uZmlnSXRlbS0+e0hhc2h9LT5bMV0tPntJdGVtfS0+WyRJdGVtXS0+e0FycmF5fS0+WzFdLT57SXRlbX0tPlskSW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSGFzaHsgJEFycmF5WyRJdGVtXS0+e0tleX0gfSA9IFxAU3ViQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkSGFzaHsgJEFycmF5WyRJdGVtXS0+e0tleX0gfSA9ICRBcnJheVskSXRlbV0tPntDb250ZW50fTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBpbiBjb25maWcKICAgICAgICBteSAkRHVtcCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkR1bXAoIFwlSGFzaCwgJ2FzY2lpJyApOwogICAgICAgICREdW1wID1+IHMvXCRWQVIxID0vLzsKICAgICAgICAkRGF0YSA9ICREdW1wOwogICAgfQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e0FycmF5fSApIHsKICAgICAgICBteSBAQXJyYXlOZXc7CiAgICAgICAgbXkgQEFycmF5OwogICAgICAgIGlmICggcmVmICRDb25maWdJdGVtLT57QXJyYXl9LT5bMV0tPntJdGVtfSBlcSAnQVJSQVknICkgewogICAgICAgICAgICBAQXJyYXkgPSBAeyAkQ29uZmlnSXRlbS0+e0FycmF5fS0+WzFdLT57SXRlbX0gfTsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICRJdGVtICggMSAuLiAkI0FycmF5ICkgewogICAgICAgICAgICBwdXNoIEBBcnJheU5ldywgJEFycmF5WyRJdGVtXS0+e0NvbnRlbnR9OwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBpbiBjb25maWcKICAgICAgICBteSAkRHVtcCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkR1bXAoIFxAQXJyYXlOZXcsICdhc2NpaScgKTsKICAgICAgICAkRHVtcCA9fiBzL1wkVkFSMSA9Ly87CiAgICAgICAgJERhdGEgPSAkRHVtcDsKICAgIH0KICAgIGlmICggJENvbmZpZ0l0ZW0tPntGcm9udGVuZE1vZHVsZVJlZ30gKSB7CiAgICAgICAgbXkgJUhhc2g7CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJENvbmZpZ0l0ZW0tPntGcm9udGVuZE1vZHVsZVJlZ30tPlsxXSB9ICkgewogICAgICAgICAgICBpZiAoICRLZXkgZXEgJ0dyb3VwJyB8fCAkS2V5IGVxICdHcm91cFJvJyApIHsKICAgICAgICAgICAgICAgIG15IEBBcnJheTsKICAgICAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCAxIC4uICQjeyAkQ29uZmlnSXRlbS0+e0Zyb250ZW5kTW9kdWxlUmVnfS0+WzFdLT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgICAgICBAQXJyYXksCiAgICAgICAgICAgICAgICAgICAgICAgICRDb25maWdJdGVtLT57RnJvbnRlbmRNb2R1bGVSZWd9LT5bMV0tPnskS2V5fS0+WyRJbmRleF0tPntDb250ZW50fQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSGFzaHskS2V5fSA9IFxAQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkS2V5IGVxICdOYXZCYXInIHx8ICRLZXkgZXEgJ05hdkJhck1vZHVsZScgKSB7CiAgICAgICAgICAgICAgICBpZiAoIHJlZiAkQ29uZmlnSXRlbS0+e0Zyb250ZW5kTW9kdWxlUmVnfS0+WzFdLT57JEtleX0gZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEluZGV4ICggMSAuLiAkI3sgJENvbmZpZ0l0ZW0tPntGcm9udGVuZE1vZHVsZVJlZ30tPlsxXS0+eyRLZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50ID0gJENvbmZpZ0l0ZW0tPntGcm9udGVuZE1vZHVsZVJlZ30tPlsxXS0+eyRLZXl9LT5bJEluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJU5hdkJhcjsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgZXEgJ0dyb3VwJyB8fCAkS2V5IGVxICdHcm91cFJvJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDEgLi4gJCN7ICRDb250ZW50LT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCBAQXJyYXksICRDb250ZW50LT57JEtleX0tPlskSW5kZXhdLT57Q29udGVudH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICROYXZCYXJ7JEtleX0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkS2V5IG5lICdDb250ZW50JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5hdkJhcnskS2V5fSA9ICRDb250ZW50LT57JEtleX0tPlsxXS0+e0NvbnRlbnR9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICRLZXkgZXEgJ05hdkJhcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEB7ICRIYXNoeyRLZXl9IH0sIFwlTmF2QmFyOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEhhc2h7JEtleX0gPSBcJU5hdkJhcjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50ID0gJENvbmZpZ0l0ZW0tPntGcm9udGVuZE1vZHVsZVJlZ30tPlsxXS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgIG15ICVOYXZCYXI7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXskQ29udGVudH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEtleSBlcSAnR3JvdXAnIHx8ICRLZXkgZXEgJ0dyb3VwUm8nICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJbmRleCAoIDEgLi4gJCN7ICRDb250ZW50LT57JEtleX0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBBcnJheSwgJENvbnRlbnQtPnskS2V5fS0+WyRJbmRleF0tPntDb250ZW50fTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICROYXZCYXJ7JEtleX0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkS2V5IG5lICdDb250ZW50JyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTmF2QmFyeyRLZXl9ID0gJENvbnRlbnQtPnskS2V5fS0+WzFdLT57Q29udGVudH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7JEtleX0gPSBcJU5hdkJhcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRLZXkgZXEgJ0xvYWRlcicgKSB7CiAgICAgICAgICAgICAgICBteSAkQ29udGVudCA9ICRDb25maWdJdGVtLT57RnJvbnRlbmRNb2R1bGVSZWd9LT5bMV0tPnskS2V5fS0+WzFdOwogICAgICAgICAgICAgICAgbXkgJUxvYWRlcjsKICAgICAgICAgICAgICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICV7JENvbnRlbnR9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgJEtleSAgICBlcSAnQ1NTJwogICAgICAgICAgICAgICAgICAgICAgICB8fCAkS2V5IGVxICdDU1NfSUU2JwogICAgICAgICAgICAgICAgICAgICAgICB8fCAkS2V5IGVxICdDU1NfSUU3JwogICAgICAgICAgICAgICAgICAgICAgICB8fCAkS2V5IGVxICdDU1NfSUU4JwogICAgICAgICAgICAgICAgICAgICAgICB8fCAkS2V5IGVxICdKYXZhU2NyaXB0JwogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkSW5kZXggKCAxIC4uICQjeyAkQ29udGVudC0+eyRLZXl9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoIEBBcnJheSwgJENvbnRlbnQtPnskS2V5fS0+WyRJbmRleF0tPntDb250ZW50fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAkTG9hZGVyeyRLZXl9ID0gXEBBcnJheTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJEtleSBuZSAnQ29udGVudCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkTG9hZGVyeyRLZXl9ID0gJENvbnRlbnQtPnskS2V5fS0+WzFdLT57Q29udGVudH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkSGFzaHskS2V5fSA9IFwlTG9hZGVyIGlmICglTG9hZGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICggJEtleSBuZSAnQ29udGVudCcgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhhc2h7JEtleX0gPSAkQ29uZmlnSXRlbS0+e0Zyb250ZW5kTW9kdWxlUmVnfS0+WzFdLT57JEtleX0tPlsxXS0+e0NvbnRlbnR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGluIGNvbmZpZwogICAgICAgIG15ICREdW1wID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RHVtcCggXCVIYXNoLCAnYXNjaWknICk7CiAgICAgICAgJER1bXAgPX4gcy9cJFZBUjEgPS8vOwogICAgICAgICREYXRhID0gJER1bXA7CiAgICB9CiAgICBpZiAoICRDb25maWdJdGVtLT57VGltZVdvcmtpbmdIb3Vyc30gKSB7CiAgICAgICAgbXkgJURheXM7CiAgICAgICAgbXkgQEFycmF5ID0gQHsgJENvbmZpZ0l0ZW0tPntUaW1lV29ya2luZ0hvdXJzfS0+WzFdLT57RGF5fSB9OwogICAgICAgIGZvciBteSAkRGF5ICggMSAuLiAkI0FycmF5ICkgewogICAgICAgICAgICBteSBAQXJyYXkyOwogICAgICAgICAgICBpZiAoICRBcnJheVskRGF5XS0+e0hvdXJ9ICkgewogICAgICAgICAgICAgICAgbXkgQEhvdXJzID0gQHsgJEFycmF5WyREYXldLT57SG91cn0gfTsKICAgICAgICAgICAgICAgIGZvciBteSAkSG91ciAoIDEgLi4gJCNIb3VycyApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoIEBBcnJheTIsICRIb3Vyc1skSG91cl0tPntDb250ZW50fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkRGF5c3sgJEFycmF5WyREYXldLT57TmFtZX0gfSA9IFxAQXJyYXkyOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBpbiBjb25maWcKICAgICAgICBteSAkRHVtcCA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkR1bXAoIFwlRGF5cywgJ2FzY2lpJyApOwogICAgICAgICREdW1wID1+IHMvXCRWQVIxID0vLzsKICAgICAgICAkRGF0YSA9ICREdW1wOwogICAgfQogICAgaWYgKCAkQ29uZmlnSXRlbS0+e1RpbWVWYWNhdGlvbkRheXN9ICkgewogICAgICAgIG15ICVIYXNoOwogICAgICAgIG15IEBBcnJheSA9IEB7ICRDb25maWdJdGVtLT57VGltZVZhY2F0aW9uRGF5c30tPlsxXS0+e0l0ZW19IH07CiAgICAgICAgZm9yIG15ICRJdGVtICggMSAuLiAkI0FycmF5ICkgewogICAgICAgICAgICAkSGFzaHsgJEFycmF5WyRJdGVtXS0+e01vbnRofSB9LT57ICRBcnJheVskSXRlbV0tPntEYXl9IH0gPSAkQXJyYXlbJEl0ZW1dLT57Q29udGVudH07CiAgICAgICAgfQoKICAgICAgICAjIHN0b3JlIGluIGNvbmZpZwogICAgICAgIG15ICREdW1wID0gJFNlbGYtPntNYWluT2JqZWN0fS0+RHVtcCggXCVIYXNoLCAnYXNjaWknICk7CiAgICAgICAgJER1bXAgPX4gcy9cJFZBUjEgPS8vOwogICAgICAgICREYXRhID0gJER1bXA7CiAgICB9CiAgICBpZiAoICRDb25maWdJdGVtLT57VGltZVZhY2F0aW9uRGF5c09uZVRpbWV9ICkgewogICAgICAgIG15ICVIYXNoOwogICAgICAgIG15IEBBcnJheSA9IEB7ICRDb25maWdJdGVtLT57VGltZVZhY2F0aW9uRGF5c09uZVRpbWV9LT5bMV0tPntJdGVtfSB9OwogICAgICAgIGZvciBteSAkSXRlbSAoIDEgLi4gJCNBcnJheSApIHsKICAgICAgICAgICAgJEhhc2h7ICRBcnJheVskSXRlbV0tPntZZWFyfSB9LT57ICRBcnJheVskSXRlbV0tPntNb250aH0gfS0+eyAkQXJyYXlbJEl0ZW1dLT57RGF5fSB9CiAgICAgICAgICAgICAgICA9ICRBcnJheVskSXRlbV0tPntDb250ZW50fTsKICAgICAgICB9CgogICAgICAgICMgc3RvcmUgaW4gY29uZmlnCiAgICAgICAgbXkgJER1bXAgPSAkU2VsZi0+e01haW5PYmplY3R9LT5EdW1wKCBcJUhhc2gsICdhc2NpaScgKTsKICAgICAgICAkRHVtcCA9fiBzL1wkVkFSMSA9Ly87CiAgICAgICAgJERhdGEgPSAkRHVtcDsKICAgIH0KCiAgICByZXR1cm4gJERhdGE7Cn0KCj1pdGVtIF9Mb2FkQmFja2VuZCgpCgpSZXR1cm5zIGEgbmV3bHkgbG9hZGVkIGJhY2tlbmQgb2JqZWN0CgogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkU3lzQ29uZmlnT2JqZWN0LT5fTG9hZEJhY2tlbmQoCiAgICAgICAgTW9kdWxlID0+ICdLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnOjpTdGF0ZVZhbGlkYXRlJywKICAgICk7Cgo9Y3V0CgpzdWIgX0xvYWRCYWNrZW5kIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte01vZHVsZX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIE1vZHVsZSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgYmFja2VuZCBvYmplY3QgaXMgYWxyZWFkeSBjYWNoZWQKICAgIHJldHVybiAkU2VsZi0+e0NhY2hlfS0+e0xvYWRTeXNDb25maWdCYWNrZW5kfS0+eyAkUGFyYW17TW9kdWxlfSB9CiAgICAgICAgaWYgJFNlbGYtPntDYWNoZX0tPntMb2FkU3lzQ29uZmlnQmFja2VuZH0tPnsgJFBhcmFte01vZHVsZX0gfTsKCiAgICAjIGxvYWQgdGhlIGJhY2tlbmQgbW9kdWxlCiAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkUGFyYW17TW9kdWxlfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgbG9hZCBzeXNjb25maWcgYmFja2VuZCBtb2R1bGUgJFBhcmFte01vZHVsZX0hIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIElNUE9SVEFOVAogICAgIyB3ZSBuZWVkIHRvIGNyZWF0ZSBvdXIgb3duIGNvbmZpZyBvYmplY3QgaGVyZSwKICAgICMgb3RoZXJ3aXNlIHRoZSA8T1RSU19DT05GSUdfPiB2YXJpYWJsZXMgd291bGQgbm90IGJlIHJlcGxhY2VkLAogICAgIyBlLmcuIGFzIGZvciA8T1RSU19DT05GSUdfVGVtcERpcj4KICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCAleyRTZWxmfSApOwoKICAgICMgY3JlYXRlIG5ldyBpbnN0YW5jZQogICAgbXkgJEJhY2tlbmRPYmplY3QgPSAkUGFyYW17TW9kdWxlfS0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgICVQYXJhbSwKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CgogICAgIyBjaGVjayBmb3IgYmFja2VuZCBvYmplY3QKICAgIGlmICggISRCYWNrZW5kT2JqZWN0ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ2FuJ3QgY3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHN5c2NvbmZpZyBiYWNrZW5kIG1vZHVsZSAkUGFyYW17TW9kdWxlfSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FjaGUgdGhlIGJhY2tlbmQgb2JqZWN0CiAgICAkU2VsZi0+e0NhY2hlfS0+e0xvYWRTeXNDb25maWdCYWNrZW5kfS0+eyAkUGFyYW17TW9kdWxlfSB9ID0gJEJhY2tlbmRPYmplY3Q7CgogICAgcmV0dXJuICRCYWNrZW5kT2JqZWN0Owp9CgoxOwoKPWVuZCBJbnRlcm5hbDoKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTIuMi4xICQgJERhdGU6IDIwMTEtMTAtMDcgMDc6NDU6NTMgJAoKPWN1dAo=
IyAtLQojIEtJWENvcmUucG0gLSBjb2RlIHJ1biBkdXJpbmcgcGFja2FnZSBkZS0vaW5zdGFsbGF0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogS0lYQ29yZS5wbSx2IDEuMyAyMDExLTA4LTIyIDA3OjUzOjMzIHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSB2YXI6OnBhY2thZ2VzZXR1cDo6S0lYQ29yZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXNDb25maWc7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS0lYQ29yZS5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6T1RSUy1DaUNTLUlUU00ucG0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBYTUxPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cy4uLgoKICAgICMgY3JlYXRlIG5lZWRlZCBzeXNjb25maWcgb2JqZWN0Li4uCiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U3lzQ29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0tPldyaXRlRGVmYXVsdCgpOwogICAgbXkgQFpaWkZpbGVzID0gKAogICAgICAgICdaWlpBQXV0by5wbScsCiAgICAgICAgJ1paWkF1dG8ucG0nLAogICAgKTsKCiAgICAjIHJlbG9hZCB0aGUgWlpaIGZpbGVzIChtb2RfcGVybCB3b3JrYXJvdW5kKQogICAgZm9yIG15ICRaWlpGaWxlIChAWlpaRmlsZXMpIHsKICAgICAgICBQUkVGSVg6CiAgICAgICAgZm9yIG15ICRQcmVmaXggKEBJTkMpIHsKICAgICAgICAgICAgbXkgJEZpbGUgPSAkUHJlZml4IC4gJy9LZXJuZWwvQ29uZmlnL0ZpbGVzLycgLiAkWlpaRmlsZTsKICAgICAgICAgICAgbmV4dCBQUkVGSVggaWYgKCAhLWYgJEZpbGUgKTsKICAgICAgICAgICAgZG8gJEZpbGU7CiAgICAgICAgICAgIGxhc3QgUFJFRklYOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X1ByZXBhcmVLSVhDb3JlKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fUHJlcGFyZUtJWENvcmUoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X1JlbW92ZUtJWENvcmUoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gX1ByZXBhcmVLSVhDb3JlKCkKCkF1dG9tYXRpY2FsbHkgb3BlbiBmaWxlcyB3aGljaCBuZWVkIHRvIGJlIGVkaXRlZCBmb3IgS0lYIHRzdW5hbWkgZnJhbWV3b3JrLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1ByZXBhcmVLSVhDb3JlKCk7Cgo9Y3V0CgpzdWIgX1ByZXBhcmVLSVhDb3JlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBpbml0aWFsaXplIEtJWENvcmU6OlBhY2thZ2VzIGFzIHJlcG9zaXRvcnkgZm9yIHJlZ2lzdGVyZWQgcGFja2FnZXMKCiAgICBpZiAoICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0tlcm5lbDo6U3lzdGVtOjpLSVhVdGlscycpICkgewogICAgICAgICRTZWxmLT57S0lYVXRpbHNPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OktJWFV0aWxzLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgJFNlbGYtPntLSVhVdGlsc09iamVjdH0tPlJlZ2lzdGVyQ3VzdG9tUGFja2FnZSgKICAgICAgICAgICAgUGFja2FnZU5hbWUgPT4gJ0tJWENvcmUnLAogICAgICAgICAgICBQcmlvcml0eSAgICA9PiAnMDAwMCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgcmVsb2FkIGNvbmZpZ3VyYXRpb24uLi4uCiAgICAkU2VsZi0+e1N5c0NvbmZpZ09iamVjdH0tPldyaXRlRGVmYXVsdCgpOwogICAgbXkgQFpaWkZpbGVzID0gKAogICAgICAgICdaWlpBQXV0by5wbScsCiAgICAgICAgJ1paWkF1dG8ucG0nLAogICAgKTsKCiAgICAjIHJlbG9hZCB0aGUgWlpaIGZpbGVzIChtb2RfcGVybCB3b3JrYXJvdW5kKQogICAgZm9yIG15ICRaWlpGaWxlIChAWlpaRmlsZXMpIHsKICAgICAgICBQUkVGSVg6CiAgICAgICAgZm9yIG15ICRQcmVmaXggKEBJTkMpIHsKICAgICAgICAgICAgbXkgJEZpbGUgPSAkUHJlZml4IC4gJy9LZXJuZWwvQ29uZmlnL0ZpbGVzLycgLiAkWlpaRmlsZTsKICAgICAgICAgICAgbmV4dCBQUkVGSVggaWYgKCAhLWYgJEZpbGUgKTsKICAgICAgICAgICAgZG8gJEZpbGU7CiAgICAgICAgICAgIGxhc3QgUFJFRklYOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIF9SZW1vdmVLSVhDb3JlKCkKClJlc3RvcmVzIGZpbGVzIHdoaWNoIHdlcmUgbW9kaWZpZWQgYnkgdGhlIGluc3RhbGxhdGlvbiBvZiBLSVhDb3JlLgoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1JlbW92ZUtJWENvcmUoKTsKCj1jdXQKCnN1YiBfUmVtb3ZlS0lYQ29yZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnS2VybmVsOjpTeXN0ZW06OktJWFV0aWxzJykgKSB7CiAgICAgICAgJFNlbGYtPntLSVhVdGlsc09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6S0lYVXRpbHMtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICAkU2VsZi0+e0tJWFV0aWxzT2JqZWN0fS0+Q2xlYW5VcENvbmZpZ1BtKCk7CiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHJlbG9hZCBjb25maWd1cmF0aW9uLi4uLgogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9LT5Xcml0ZURlZmF1bHQoKTsKICAgIG15IEBaWlpGaWxlcyA9ICgKICAgICAgICAnWlpaQUF1dG8ucG0nLAogICAgICAgICdaWlpBdXRvLnBtJywKICAgICk7CgogICAgIyByZWxvYWQgdGhlIFpaWiBmaWxlcyAobW9kX3Blcmwgd29ya2Fyb3VuZCkKICAgIGZvciBteSAkWlpaRmlsZSAoQFpaWkZpbGVzKSB7CiAgICAgICAgUFJFRklYOgogICAgICAgIGZvciBteSAkUHJlZml4IChASU5DKSB7CiAgICAgICAgICAgIG15ICRGaWxlID0gJFByZWZpeCAuICcvS2VybmVsL0NvbmZpZy9GaWxlcy8nIC4gJFpaWkZpbGU7CiAgICAgICAgICAgIG5leHQgUFJFRklYIGlmICggIS1mICRGaWxlICk7CiAgICAgICAgICAgIGRvICRGaWxlOwogICAgICAgICAgICBsYXN0IFBSRUZJWDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDExLTA4LTIyIDA3OjUzOjMzICQKPWN1dAo=