ITSMIncidentProblemManagement
2.1.92
OTRS AG
http://otrs.org/
GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007
Build for OTRS::ITSM 3.0.0 beta2.
Build for OTRS::ITSM 3.0.0 beta1.
The OTRS::ITSM Incident and Problem Management package.
Das OTRS::ITSM Incident und Problem Management Paket.
Paquete Incident and Problem Management de OTRS::ITSM.
3.0.x
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to install the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 2.1.92</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu installieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 2.1.92</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de instalar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 2.1.92</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
If you uninstall this package, the ticket types and states that were added during installation will be deactivated.
They can be activated again in the admin area.
<br/>
<br/>
The statistics that are associated with this package, will no longer be available if the package is uninstalled.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATENCION</strong>
<br/>
<br/>
Bei der Deinstallation werden die von diesem Paket angelegten Ticket-Typen und -Status deaktiviert.
Diese können jederzeit im Admin-Bereich wieder aktiviert werden.
<br/>
<br/>
Nach der Deinstallation sind die zu diesem Paket zugehörigen Statistiken nicht mehr verfügbar.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>ATTENTION</strong>
<br/>
<br/>
Si usted desinstala este paquete, los tipos de ticket y estados que fueron agregados durante la instalación serán desactivados.
Pueden ser activados de nuevo en el área de admin.
<br/>
<br/>
Las estadísticas asociadas a este paquete no estarán disponibles si desinstala el paquete.
<br/>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WELCOME</strong>
<br/>
<br/>
You are about to upgrade the OTRS package ITSMIncidentProblemManagement.<br/>
<br/>
<br/>
<strong>REQUIRED OTRS PACKAGES</strong>
<ul>
<li>ITSMCore 2.1.92</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>WILLKOMMEN</strong>
<br/>
<br/>
Sie sind im Begriff das OTRS-Paket ITSMIncidentProblemManagement zu aktualisieren.<br/>
<br/>
<br/>
<strong>BENÖTIGTE OTRS-PAKETE</strong>
<ul>
<li>ITSMCore 2.1.92</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
<br/>
<strong>BIENVENIDO</strong>
<br/>
<br/>
Usted esta apunto de actualizar el paquete ITSMIncidentProblemManagement de OTRS.<br/>
<br/>
<br/>
<strong>PAQUETES OTRS REQUERIDOS</strong>
<ul>
<li>ITSMCore 2.1.92</li>
</ul>
<br/>
((enjoy))<br/>
<br/>
ITSMCore
# define function name
my $FunctionName = 'CodeInstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# define function name
my $FunctionName = 'CodeUninstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
# cleanup stats list
{
# load required modules
$Self->{MainObject}->Require('Kernel::System::CSV');
$Self->{MainObject}->Require('Kernel::System::Group');
$Self->{MainObject}->Require('Kernel::System::User');
$Self->{MainObject}->Require('Kernel::System::Stats');
# create needed objects
$Self->{CSVObject} = Kernel::System::CSV->new( %{$Self} );
$Self->{GroupObject} = Kernel::System::Group->new( %{$Self} );
$Self->{UserObject} = Kernel::System::User->new( %{$Self} );
$Self->{StatsObject} = Kernel::System::Stats->new(
%{$Self},
UserID => 1,
);
# cleanup stats list
$Self->{StatsObject}->StatsCleanUp();
}
# define function name
my $FunctionName = 'CodeReinstall';
# create the package name
my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content};
# load the module
if ( $Self->{MainObject}->Require($CodeModule) ) {
# create new instance
my $CodeObject = $CodeModule->new( %{$Self} );
if ($CodeObject) {
# start methode
if ( !$CodeObject->$FunctionName(%{$Self}) ) {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method $FunctionName() on $CodeModule.pm."
);
}
}
# error handling
else {
$Self->{LogObject}->Log(
Priority => 'error',
Message => "Could not call method new() on $CodeModule.pm."
);
}
}
2011-01-13 14:44:44
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KICAgIDxDVlM+JElkOiBJVFNNVGlja2V0LnhtbCx2IDEuMTIgMjAxMS8wMS8wNSAxNDoyMToyOCB1YiBFeHAgJDwvQ1ZTPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZGRpdGlvbmFsIElUU00gVGlja2V0IEZpZWxkczwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+QWRkaXRpb25hbCBJVFNNIEZpZWxkczwvVGl0bGU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5UaWNrZXQ8L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TG9hZGVyPgogICAgICAgICAgICAgICAgICAgIDxKYXZhU2NyaXB0PkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uLmpzPC9KYXZhU2NyaXB0PgogICAgICAgICAgICAgICAgPC9Mb2FkZXI+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50VGlja2V0RGVjaXNpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5UaWNrZXQgRGVjaXNpb248L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkRlY2lzaW9uPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPlRpY2tldDwvTmF2QmFyTmFtZT4KICAgICAgICAgICAgICAgIDxMb2FkZXI+CiAgICAgICAgICAgICAgICAgICAgPEphdmFTY3JpcHQ+Q29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uanM8L0phdmFTY3JpcHQ+CiAgICAgICAgICAgICAgICA8L0xvYWRlcj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjMzE1LUFkZHRsSVRTTUZpZWxkIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpNZW51TW9kdWxlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE1lbnVHZW5lcmljPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5BZGRpdGlvbmFsIElUU00gRmllbGRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiI+Q2hhbmdlIHRoZSBJVFNNIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQ7VGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUG9wdXBUeXBlIj5UaWNrZXRBY3Rpb248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpNZW51TW9kdWxlIyMjNDIwLURlY2lzaW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6TWVudU1vZHVsZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpUaWNrZXRNZW51R2VuZXJpYzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTmFtZSI+RGVjaXNpb248L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkRlc2NyaXB0aW9uIj5BZGQgYSBkZWNpc2lvbiE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXREZWNpc2lvbjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RGVjaXNpb247VGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUG9wdXBUeXBlIj5UaWNrZXRBY3Rpb248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUGVybWlzc2lvbiIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5SZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ydzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNSZXF1aXJlZExvY2siIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjVGlja2V0VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI093bmVyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5JZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdGF0ZVR5cGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5vcGVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyByZW1pbmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXV0bzwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjU3RhdGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPm9wZW48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjTm90ZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNTdWJqZWN0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4kVGV4dHsiTm90ZSJ9PC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0JvZHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8VGV4dEFyZWE+PC9UZXh0QXJlYT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSW52b2x2ZWRBZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNJbmZvcm1BZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVUeXBlRGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj5ub3RlLWludGVybmFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVUeXBlcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWludGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLWV4dGVybmFsIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJub3RlLXJlcG9ydCI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQjIyNQcmlvcml0eSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1ByaW9yaXR5RGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPjMgbm9ybWFsPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpdGxlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0FkZHRsSVRTTUZpZWxkPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI1RpY2tldEZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjVGlja2V0RnJlZVRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0FydGljbGVGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZCMjI0hpc3RvcnlUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3QWRkdGxJVFNNRmllbGQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkFkZE5vdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkIyMjSGlzdG9yeUNvbW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdBZGR0bElUU01GaWVsZDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+JSVGcmVlVGV4dDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNQZXJtaXNzaW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlJlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+cnc8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVxdWlyZWRMb2NrIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjVGlja2V0VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU2VydmljZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNPd25lciIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUmVzcG9uc2libGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1N0YXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPklmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVUeXBlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5vcGVuPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Y2xvc2VkPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+cGVuZGluZyByZW1pbmRlcjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtPnBlbmRpbmcgYXV0bzwvSXRlbT4KICAgICAgICAgICAgPC9BcnJheT4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3RhdGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+b3BlbjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNOb3RlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjU3ViamVjdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4kVGV4dHsiRGVjaXNpb24ifTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNCb2R5IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8VGV4dEFyZWE+JFRleHR7IlJlYXNvbiJ9OjwvVGV4dEFyZWE+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI0ludm9sdmVkQWdlbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNJbmZvcm1BZ2VudCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjAiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQXJ0aWNsZVR5cGVEZWZhdWx0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+bm90ZS1pbnRlcm5hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNBcnRpY2xlVHlwZXMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1pbnRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1leHRlcm5hbCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0ibm90ZS1yZXBvcnQiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjUHJpb3JpdHkiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIwIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXREZWNpc2lvbiMjI1ByaW9yaXR5RGVmYXVsdCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+MyBub3JtYWw8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjVGl0bGUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdEZWNpc2lvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMCI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjVGlja2V0RnJlZVRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjQXJ0aWNsZUZyZWVUZXh0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0RGVjaXNpb24jIyNIaXN0b3J5VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3RGVjaXNpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkFkZE5vdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldERlY2lzaW9uIyMjSGlzdG9yeUNvbW1lbnQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0RlY2lzaW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4lJU5vdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJTdGF0czo6RHluYW1pY09iamVjdFJlZ2lzdHJhdGlvbiMjI0lUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+RnJhbWV3b3JrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6U3RhdHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iU3RhdHM6OkR5bmFtaWNPYmplY3RSZWdpc3RyYXRpb24jIyNJVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpTdGF0czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpTdGF0czo6RHluYW1pYzo6SVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2U8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFRpY2tldElUU01UaWNrZXQueG1sLHYgMS4xNyAyMDExLzAxLzEyIDE4OjAwOjA5IHViIEV4cCAkPC9DVlM+CiAgICA8Q1ZTPiRPbGRJZDogVGlja2V0LnhtbCx2IDEuNDE3IDIwMTAvMTIvMDggMTY6NDg6MDQgbXAgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6VHlwZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5BbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZUtleTEzIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ3JpdGljYWxpdHlJRCI+Q3JpdGljYWxpdHlJRDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTMiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMCI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPkRPIE5PVCBBQ1RJVkFURSBUaWNrZXRGcmVlVGV4dDEzLiBHRU5FUkFMIENBVEFMT0cgSVMgVVNFRC48L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlS2V5MTQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJJbXBhY3RJRCI+SW1wYWN0SUQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGV4dDE0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjAiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iIj5ETyBOT1QgQUNUSVZBVEUgVGlja2V0RnJlZVRleHQxNC4gR0VORVJBTCBDQVRBTE9HIElTIFVTRUQuPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNDo6RGVmYXVsdFNlbGVjdGlvbiIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iIj4zIG5vcm1hbDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVLZXkxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJldmlldyBSZXF1aXJlZCI+UmV2aWV3IFJlcXVpcmVkPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRleHQxNSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUZXh0PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGV4dDE1OjpEZWZhdWx0U2VsZWN0aW9uIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPk5vPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZUtleTE2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVjaXNpb24gUmVzdWx0Ij5EZWNpc2lvbiBSZXN1bHQ8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGV4dDE2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRleHQ8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUGVuZGluZyI+UGVuZGluZzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUHJlLWFwcHJvdmVkIj5QcmUtYXBwcm92ZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFwcHJvdmVkIj5BcHByb3ZlZDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUG9zdHBvbmVkIj5Qb3N0cG9uZWQ8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlJlamVjdGVkIj5SZWplY3RlZDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUZXh0MTY6OkRlZmF1bHRTZWxlY3Rpb24iIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGV4dDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+UGVuZGluZzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lS2V5MyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5SZXBhaXIgU3RhcnQgVGltZTwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lUGVyaW9kMyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kUGFzdCI+NTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZEZ1dHVyZSI+NTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldEZyZWVUaW1lS2V5NCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA0IGZvciB0aWNrZXRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz5SZWNvdmVyeSBTdGFydCBUaW1lPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVQZXJpb2Q0IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RQYXN0Ij41PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJZZWFyUGVyaW9kRnV0dXJlIj41PC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0RnJlZVRpbWVLZXk1IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nPkRlY2lzaW9uIERhdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZVBlcmlvZDUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZFBhc3QiPjU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RGdXR1cmUiPjU8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZUtleTYiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNiBmb3IgdGlja2V0cy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpUaWNrZXRGcmVlVGltZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+RHVlIGRhdGU8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZURpZmY2IiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkRlZmluZXMgdGhlIGRpZmZlcmVuY2UgZnJvbSBub3cgKGluIHNlY29uZHMpIG9mIHRoZSBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYncyBkZWZhdWx0IHZhbHVlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlRpY2tldEZyZWVUaW1lPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZz4yNTkyMDA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXRGcmVlVGltZVBlcmlvZDYiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6VGlja2V0RnJlZVRpbWU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iWWVhclBlcmlvZFBhc3QiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlllYXJQZXJpb2RGdXR1cmUiPjk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRpY2tldCBGcmVlVGV4dDwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+RnJlZSBGaWVsZHM8L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGlja2V0PC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPExvYWRlcj4KICAgICAgICAgICAgICAgICAgICA8SmF2YVNjcmlwdD5Db3JlLkFnZW50LlRpY2tldEFjdGlvbi5qczwvSmF2YVNjcmlwdD4KICAgICAgICAgICAgICAgIDwvTG9hZGVyPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q2xvc2UjIyNUaWNrZXRGcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5UaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0Nsb3NlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjQiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjUiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjYiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjciPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjgiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjkiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEwIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTIiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTUiPjE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE2Ij4wPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIyMjVGlja2V0RnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld0NvbXBvc2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjA8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEVtYWlsIyMjVGlja2V0RnJlZVRpbWUiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdFbWFpbE5ldzwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQaG9uZSMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlRpY2tldDwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6VGlja2V0OjpWaWV3UGhvbmVOZXc8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UHJpb3JpdHkjIyNUaWNrZXRUeXBlIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1ByaW9yaXR5PC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRQcmlvcml0eSMjI1NlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+U2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdQcmlvcml0eTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0U2VhcmNoIyMjVGlja2V0RnJlZVRleHQiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+VGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6OlZpZXdTZWFyY2g8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iNyI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOCI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iOSI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjExIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxMiI+MDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTMiPjA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjE0Ij4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxNSI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTYiPjE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFNlYXJjaCMjI1RpY2tldEZyZWVUaW1lIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5UaWNrZXQ8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OlRpY2tldDo6Vmlld1NlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyIj4wPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI1Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSI2Ij4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iVGlja2V0OjpGcm9udGVuZDo6TWVudU1vZHVsZSMjIzMxMC1GcmVlVGV4dCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgZnJlZSB0ZXh0IGZpZWxkIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+VGlja2V0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpUaWNrZXQ6Ok1lbnVNb2R1bGU8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6Ok91dHB1dDo6SFRNTDo6VGlja2V0TWVudUdlbmVyaWM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5hbWUiPkZyZWUgRmllbGRzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZXNjcmlwdGlvbiIgVHJhbnNsYXRhYmxlPSIxIj5DaGFuZ2UgdGhlIHRpY2tldCBmcmVlIGZpZWxkcyE8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFjdGlvbiI+QWdlbnRUaWNrZXRGcmVlVGV4dDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTGluayI+QWN0aW9uPUFnZW50VGlja2V0RnJlZVRleHQ7VGlja2V0SUQ9JFFEYXRheyJUaWNrZXRJRCJ9PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJUYXJnZXQiPjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iUG9wdXBUeXBlIj5UaWNrZXRBY3Rpb248L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9iZ19JVFNNVGlja2V0LnBtIC0gdGhlIGJ1bGdhcmlhbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IE1pbGVuIEtvdXRldgojIC0tCiMgJElkOiBiZ19JVFNNVGlja2V0LnBtLHYgMS4xMCAyMDEwLzA5LzA2IDIyOjU5OjAyIGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmJnX0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnyvDg6e3gIOTg8uAnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ9Dl+OXt6OUnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ87x7e7i4O3o5Sc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnxODy4CDn4CDw5fjg4uDt5Sc7CiAgICAkTGFuZy0+eydBZGQgZGVjaXNpb24gdG8gdGlja2V0J30gICAgICAgPSAnxO7h4OLoIPDl+OXt6OUg6vrsIOHo6+Xy4Cc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAn0OXn8+vy4PIg7vIg8OX45e3o5fLuJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICfI5+jx6uLgIO/w5ePr5ebk4O3lJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICfv8Ojq6/735e0g8SDu4fXu5O3uIPDl+OXt6OUnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ8Tu7/rr7ejy5evt6CBJVFNNIO/u6+Xy4Cc7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnz/Du7OXt6CBJVFNNIO/u6+Xy4PLgIO3gIOHo6+Xy4Cc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnwvDl7OUg7eAg8fLg8PLo8ODt5SDt4CDw5ezu7fLgJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICfC8OXs5SDt4CDx8uDw8ujw4O3lIO3gIOL65/Hy4O3u4v/i4O3l8u4nOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKSwgZS5nLiBpbmNpZGVudCwgcHJvYmxlbSwgY2hhbmdlLCAuLi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgMyBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDQgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA0Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA1IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNiBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRpZmZlcmVuY2UgZnJvbSBub3cgKGluIHNlY29uZHMpIG9mIHRoZSBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDZcJ3MgZGVmYXVsdCB2YWx1ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBjbG9zZSB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZW1haWwgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHBob25lIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgZnJlZSB0ZXh0IGZpZWxkIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPSAnJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jdF9JVFNNVGlja2V0LnBtIC0gdGhlIGNhdGFsYW4gdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggU2lzdGVtZXMgT1RJQyAoaWJzYWx1dCkgLSBBbnRvbmlvIExpbmRlCiMgLS0KIyAkSWQ6IGN0X0lUU01UaWNrZXQucG0sdiAxLjkgMjAxMC8wOS8wNiAyMjo1OTowMiBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjdF9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS45ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRGF0YSBkZSB2ZW5jaW1lbnQnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0RlY2lzafMnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1Jh8yc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnRGF0YSBkZSBkZWNpc2nzJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdBZmVnaXIgZGVjaXNp8yBhbCB0aXF1ZXQnOwogICAgJExhbmctPnsnRGVjaXNpb24gUmVzdWx0J30gICAgICAgICAgICAgID0gJ1Jlc3VsdGF0IGRlIGxhIGRlY2lzafMnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JldmlzafMgcmVxdWVyaWRhJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdUYW5jYXQgYW1iIHNvbHVjafMgdGVtcG9yYWwnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ0NhbXBzIElUU00gYWRkaWNpb25hbHMnOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ0NhdmlhciBDYW1wcyBJVFNNIGFkZGljaW9uYWxzIGRlbCB0aXF1ZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ1RlbXBzIGRcJ2luaWNpIGRlIGxhIHJlcGFyYWNp8yc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnVGVtcHMgZFwnaW5pY2kgZGUgbGEgcmVjdXBlcmFjafMnOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKSwgZS5nLiBpbmNpZGVudCwgcHJvYmxlbSwgY2hhbmdlLCAuLi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgMyBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDQgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA0Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA1IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNiBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRpZmZlcmVuY2UgZnJvbSBub3cgKGluIHNlY29uZHMpIG9mIHRoZSBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDZcJ3MgZGVmYXVsdCB2YWx1ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBjbG9zZSB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZW1haWwgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHBob25lIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgZnJlZSB0ZXh0IGZpZWxkIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPSAnJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9jel9JVFNNVGlja2V0LnBtIC0gdGhlIGN6ZWNoIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggTWlsZW4gS291dGV2CiMgQ29weXJpZ2h0IChDKSAyMDEwIE8yQlMuY29tLCBzIHIuby4gSmFrdWIgSGFudXMKIyAtLQojICRJZDogY3pfSVRTTVRpY2tldC5wbSx2IDEuMTIgMjAxMC8wOS8wNiAyMjo1OTowMiBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpjel9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIGRhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ05lanpherntIFRlcm3tbic7CiAgICAkTGFuZy0+eydEZWNpc2lvbid9ICAgICAgICAgICAgICAgICAgICAgPSAn2GW5ZW7tJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdQ+O3oaW5hJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdEYXR1bSDYZbllbu0nOwogICAgJExhbmctPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ICAgICAgID0gJ1D4aWRhdCD4Zbllbu0gayB0aWtldHUnOwogICAgJExhbmctPnsnRGVjaXNpb24gUmVzdWx0J30gICAgICAgICAgICAgID0gJ1b9c2xlZGVrINhluWVu7Sc7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnVnm+YWR1amUgUPhlaGxlZCc7CiAgICAkTGFuZy0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gICAgICAgPSAndXphdvhlbm8gZG/oYXNu/W0g+GW5ZW7tbSc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnRG9wbPJrb3bhIElUU00gcG9sZSc7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnWm3sbmEgSVRTTSBwb2ztIHYgdGlrZXR1JzsKICAgICRMYW5nLT57J1JlcGFpciBTdGFydCBUaW1lJ30gICAgICAgICAgICA9ICfIYXMgemFo4Wplbu0gb3ByYXZ5JzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICfIYXMgemFo4Wplbu0gb2Jub3Zlbu0nOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ1pt7PJ0ZSBJVE1TIHBvbGUhJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdEb3Bs8nRlIPhluWVu7SEnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kYV9JVFNNVGlja2V0LnBtIC0gcHJvdmlkZXMgZGEgKERhbmlzaCkgbGFuZ3VhZ2UgdHJhbnNsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IGRhX0lUU01UaWNrZXQucG0sdiAxLjYgMjAxMC8wOS8wNiAyMjo1OTowMiBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpkYV9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRm9yZmFsZHNkYXRvJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdCZXNsdXRuaW5nJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdCZWdydW5kZWxzZSc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnQmVzbHV0bmluZ3NkYXRvJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdUaWxm+GogYmVzbHV0bmluZyB0aWwgc2FnJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdCZXNsdXRuaW5nc3Jlc3VsdGF0JzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdBbm1lbGRlbHNlIGty5nZlcyc7CiAgICAkTGFuZy0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gICAgICAgPSAnTHVra2V0IG1lZCB3b3JrYXJvdW5kJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdZZGVybGlnZSBJVFNNIGZlbHRlcic7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnUmV0IHNhZ2VucyBJVFNNIGZlbHRlcic7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnU3RhcnR0aWQgZm9yIHJlcGVyYXRpb24nOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ1N0YXJ0dGlkIGZvciBnZW5ldGFibGVyaW5nJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdSZXQgSVRTTSBmZWx0ZXIhJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdUaWxm+GogZW4gYmVzbHV0bmluZyEnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNVGlja2V0LnBtIC0gdGhlIGdlcm1hbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBkZV9JVFNNVGlja2V0LnBtLHYgMS44IDIwMTAvMDkvMDYgMjI6NTk6MDIgZW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIGRhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0bkbGxpZ2tlaXRzZGF0dW0nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0VudHNjaGVpZHVuZyc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnQmVncvxuZHVuZyc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnRW50c2NoZWlkdW5nc2RhdHVtJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdFbnRzY2hlaWR1bmcgYW4gVGlja2V0IGjkbmdlbic7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnRW50c2NoZWlkdW5nJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdOYWNoYmVhcmJlaXR1bmcgZXJmb3JkZXJsaWNoJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdwcm92aXNvcmlzY2ggZ2VzY2hsb3NzZW4nOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ1p1c+R0emxpY2hlIElUU00gRmVsZGVyJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfEbmRlcm4gZGVyIElUU00gRmVsZGVyIGRlcyBUaWNrZXRzJzsKICAgICRMYW5nLT57J1JlcGFpciBTdGFydCBUaW1lJ30gICAgICAgICAgICA9ICdSZXBhcmF0dXIgU3RhcnR6ZWl0JzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICdXaWVkZXJoZXJzdGVsbHVuZyBTdGFydHplaXQnOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ8RuZGVybiBkZXIgSVRTTS1GZWxkZXIhJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdIaW56dWb8Z2VuIGVpbmVyIEVudHNjaGVpZHVuZyEnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9lc19JVFNNVGlja2V0LnBtIC0gdGhlIHNwYW5pc2ggdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggQXF1aWxlcyBDb2hlbgojIC0tCiMgJElkOiBlc19JVFNNVGlja2V0LnBtLHYgMS4xMSAyMDEwLzA5LzA2IDIyOjU5OjAyIGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmVzX0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjExICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnRmVjaGEgZGUgdmVuY2ltaWVudG8nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0RlY2lzafNuJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdNb3Rpdm8nOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ0ZlY2hhIGRlIERlY2lzafNuJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdB8WFkaXIgZGVjaXNp824gYWwgdGlja2V0JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdSZXN1bHRhZG8gZGUgRGVjaXNp824nOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JldmlzafNuIFJlcXVlcmlkYSc7CiAgICAkTGFuZy0+eydjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJ30gICAgICAgPSAnQ2VycmFkbyBjb24gc29sdWNp824gcHJvdmlzaW9uYWwnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ0NhbXBvcyBJVFNNIEFkaWNpb25hbGVzJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdNb2RpZmljYXIgY2FtcG9zIElUU00gZGVsIHRpY2tldCc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnRmVjaGEgSW5pY2lhbCBkZSBSZXBhcmFjafNuJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICdGZWNoYSBJbmljaWFsIGRlIFJlY3VwZXJhY2nzbic7CiAgICAkTGFuZy0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ICAgICAgPSAnTW9kaWZpY2FyIGxvcyBjYW1wb3MgSVRTTSc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAnoUFncmVndWUgdW5hIGRlY2lzafNuISc7CiAgICAkTGFuZy0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCksIGUuZy4gaW5jaWRlbnQsIHByb2JsZW0sIGNoYW5nZSwgLi4uJ30gPSAnUGVybWl0ZSBkZWZpbmlyIHRpcG9zIGRlIHRpY2tldCBudWV2b3MgKHNpIGxhIGZ1bmNpb25hbGlkYWQgdGlwbyBkZWwgdGlja2V0IGVzdOEgaGFiaWxpdGFkYSksIHBvciBlamVtcGxvOiBpbmNpZGVudGUsIHByb2JsZW1hLCBjYW1iaW8sIC4uLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJ0RlZmluZSBlbCBjYW1wbyBmcmVlIGtleSBu+m1lcm8gMTMgcGFyYSBhZ3JlZ2FyIHVuIGF0cmlidXRvIG51ZXZvIGEgbG9zIHRpY2tldHMuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnRGVmaW5lIGVsIGNhbXBvIGZyZWUgdGV4dCBu+m1lcm8gMTMgcGFyYSBhZ3JlZ2FyIHVuIGF0cmlidXRvIG51ZXZvIGEgbG9zIHRpY2tldHMuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnRGVmaW5lIGVsIGNhbXBvIGZyZWUga2V5IG76bWVybyAxNCBwYXJhIGFncmVnYXIgdW4gYXRyaWJ1dG8gbnVldm8gYSBsb3MgdGlja2V0cy4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICdEZWZpbmUgZWwgY2FtcG8gZnJlZSB0ZXh0IG76bWVybyAxNCBwYXJhIGFncmVnYXIgdW4gYXRyaWJ1dG8gbnVldm8gYSBsb3MgdGlja2V0cy4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICdEZWZpbmUgZWwgdmFsb3Igc2VsZWNjaW9uYWRvIHBvciBkZWZhdWx0IChzaSBleGlzdGUgbeFzIGRlIHVuYSBvcGNp824pIGRlbCBjYW1wbyBmcmVlIHRleHQgbvptZXJvIDE0IGRlIGxvcyB0aWNrZXRzLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJ0RlZmluZSBlbCBjYW1wbyBmcmVlIGtleSBu+m1lcm8gMTUgcGFyYSBhZ3JlZ2FyIHVuIGF0cmlidXRvIG51ZXZvIGEgbG9zIHRpY2tldHMuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnRGVmaW5lIGVsIGNhbXBvIGZyZWUgdGV4dCBu+m1lcm8gMTUgcGFyYSBhZ3JlZ2FyIHVuIGF0cmlidXRvIG51ZXZvIGEgbG9zIHRpY2tldHMuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnRGVmaW5lIGVsIHZhbG9yIHNlbGVjY2lvbmFkbyBwb3IgZGVmYXVsdCAoc2kgZXhpc3RlIG3hcyBkZSB1bmEgb3BjafNuKSBkZWwgY2FtcG8gZnJlZSB0ZXh0IG76bWVybyAxNSBkZSBsb3MgdGlja2V0cy4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICdEZWZpbmUgZWwgY2FtcG8gZnJlZSBrZXkgbvptZXJvIDE2IHBhcmEgYWdyZWdhciB1biBhdHJpYnV0byBudWV2byBhIGxvcyB0aWNrZXRzLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJ0RlZmluZSBlbCBjYW1wbyBmcmVlIHRleHQgbvptZXJvIDE2IHBhcmEgYWdyZWdhciB1biBhdHJpYnV0byBudWV2byBhIGxvcyB0aWNrZXRzLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJ0RlZmluZSBlbCB2YWxvciBzZWxlY2Npb25hZG8gcG9yIGRlZmF1bHQgKHNpIGV4aXN0ZSBt4XMgZGUgdW5hIG9wY2nzbikgZGVsIGNhbXBvIGZyZWUgdGV4dCBu+m1lcm8gMTYgZGUgbG9zIHRpY2tldHMuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDMgZm9yIHRpY2tldHMuJ30gPSAnRGVmaW5lIGVsIGNhbXBvIGZyZWUgdGltZSBrZXkgbvptZXJvIDMgcGFyYSBsb3MgdGlja2V0cy4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDMuJ30gPSAnRGVmaW5lIGxvcyBh8W9zIChlbiBmdXR1cm8geSBwYXNhZG8pIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZW4gZWwgY2FtcG8gZnJlZSB0aW1lIG76bWVybyAzLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA0IGZvciB0aWNrZXRzLid9ID0gJ0RlZmluZSBlbCBjYW1wbyBmcmVlIHRpbWUga2V5IG76bWVybyA0IHBhcmEgbG9zIHRpY2tldHMuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA0Lid9ID0gJ0RlZmluZSBsb3MgYfFvcyAoZW4gZnV0dXJvIHkgcGFzYWRvKSBxdWUgcHVlZGVuIHNlciBzZWxlY2Npb25hZG9zIGVuIGVsIGNhbXBvIGZyZWUgdGltZSBu+m1lcm8gNC4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNSBmb3IgdGlja2V0cy4nfSA9ICdEZWZpbmUgZWwgY2FtcG8gZnJlZSB0aW1lIGtleSBu+m1lcm8gNSBwYXJhIGxvcyB0aWNrZXRzLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNS4nfSA9ICdEZWZpbmUgbG9zIGHxb3MgKGVuIGZ1dHVybyB5IHBhc2FkbykgcXVlIHB1ZWRlbiBzZXIgc2VsZWNjaW9uYWRvcyBlbiBlbCBjYW1wbyBmcmVlIHRpbWUgbvptZXJvIDUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDYgZm9yIHRpY2tldHMuJ30gPSAnRGVmaW5lIGVsIGNhbXBvIGZyZWUgdGltZSBrZXkgbvptZXJvIDYgcGFyYSBsb3MgdGlja2V0cy4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYuJ30gPSAnRGVmaW5lIGxvcyBh8W9zIChlbiBmdXR1cm8geSBwYXNhZG8pIHF1ZSBwdWVkZW4gc2VyIHNlbGVjY2lvbmFkb3MgZW4gZWwgY2FtcG8gZnJlZSB0aW1lIG76bWVybyA2Lic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkaWZmZXJlbmNlIGZyb20gbm93IChpbiBzZWNvbmRzKSBvZiB0aGUgZnJlZSB0aW1lIGZpZWxkIG51bWJlciA2XCdzIGRlZmF1bHQgdmFsdWUuJ30gPSAnRGVmaW5lIGxhIGRpZmVyZW5jaWEgKGVuIHNlZ3VuZG9zKSBlbnRyZSBlbCB0aWVtcG8gYWN0dWFsIHkgZWwgdmFsb3IgZGVmaW5pZG8gY29tbyBkZWZhdWx0IHBhcmEgZWwgY2FtcG8gZnJlZSB0aW1lIG76bWVybyA2Lic7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1JlZ2lzdHJvIGRlIG3zZHVsbyBmcm9udGVuZCBwYXJhIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgY2xvc2UgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJ09wY2lvbmVzIGRlbCBhdHJpYnV0byBmcmVlIHRleHQgZGUgbG9zIHRpY2tldHMsIG1vc3RyYWRhcyBlbiBsYSB2ZW50YW5hIGRlIGNlcnJhciB0aWNrZXQgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4gTGFzIGNvbmZpZ3VyYWNpb25lcyBwb3NpYmxlcyBzb246IDAgPSBEZXNoYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8geSBvYmxpZ2F0b3Jpby4nOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICdPcGNpb25lcyBkZWwgYXRyaWJ1dG8gZnJlZSB0ZXh0IGRlIGxvcyB0aWNrZXRzLCBtb3N0cmFkYXMgZW4gbGEgdmVudGFuYSBkZSByZWRhY3RhciB0aWNrZXQgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4gTGFzIGNvbmZpZ3VyYWNpb25lcyBwb3NpYmxlcyBzb246IDAgPSBEZXNoYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8geSBvYmxpZ2F0b3Jpby4nOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnT3BjaW9uZXMgZGVsIGF0cmlidXRvIGZyZWUgdGltZSBkZSBsb3MgdGlja2V0cywgbW9zdHJhZGFzIGVuIGxhIHZlbnRhbmEgZGUgdGlja2V0IGRlIGUtbWFpbCBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLiBMYXMgY29uZmlndXJhY2lvbmVzIHBvc2libGVzIHNvbjogMCA9IERlc2hhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyB5IG9ibGlnYXRvcmlvLic7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHBob25lIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICdPcGNpb25lcyBkZWwgYXRyaWJ1dG8gZnJlZSB0aW1lIGRlIGxvcyB0aWNrZXRzLCBtb3N0cmFkYXMgZW4gbGEgdmVudGFuYSBkZSB0aWNrZXQgdGVsZWbzbmljbyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLiBMYXMgY29uZmlndXJhY2lvbmVzIHBvc2libGVzIHNvbjogMCA9IERlc2hhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyB5IG9ibGlnYXRvcmlvLic7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnTWVkaWFudGUgbGEgaW50ZXJmYXogZGUgYWdlbnRlLCBlc3RhYmxlY2UgdW4gdGlwbyBwYXJhIGVsIHRpY2tldCBhY3R1YWwgZW4gbGEgdmVudGFuYSBkZSBwcmlvcmlkYWQsIGFjY2VkaWRhIGEgdHJhdulzIGRlbCBkZXRhbGxlIGRlIGRpY2hvIHRpY2tldCAoVGlja2V0OjpUeXBlIHRpZW5lIHF1ZSBlc3RhciBoYWJpbGl0YWRvKS4nOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnTWVkaWFudGUgbGEgaW50ZXJmYXogZGUgYWdlbnRlLCBlc3RhYmxlY2UgdW4gc2VydmljaW8gcGFyYSBlbCB0aWNrZXQgYWN0dWFsIGVuIGxhIHZlbnRhbmEgZGUgcHJpb3JpZGFkLCBhY2NlZGlkYSBhIHRyYXbpcyBkZWwgZGV0YWxsZSBkZSBkaWNobyB0aWNrZXQgKFRpY2tldDo6VHlwZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJ09wY2lvbmVzIGRlbCBhdHJpYnV0byBmcmVlIHRleHQgZGUgbG9zIHRpY2tldHMsIG1vc3RyYWRhcyBlbiBsYSB2ZW50YW5hIGRlIGL6c3F1ZWRhIGRlIHRpY2tldHMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4gTGFzIGNvbmZpZ3VyYWNpb25lcyBwb3NpYmxlcyBzb246IDAgPSBEZXNoYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8geSBvYmxpZ2F0b3Jpby4nOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnT3BjaW9uZXMgZGVsIGF0cmlidXRvIGZyZWUgdGltZSBkZSBsb3MgdGlja2V0cywgbW9zdHJhZGFzIGVuIGxhIHZlbnRhbmEgZGUgYvpzcXVlZGEgZGUgdGlja2V0cyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLiBMYXMgY29uZmlndXJhY2lvbmVzIHBvc2libGVzIHNvbjogMCA9IERlc2hhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyB5IG9ibGlnYXRvcmlvLic7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgZnJlZSB0ZXh0IGZpZWxkIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnTXVlc3RhIHVuIHbtbmN1bG8gZW4gZWwgbWVu+iBwYXJhIGFncmVnYXIgYWwgdGlja2V0IHVuIGNhbXBvIGZyZWUgdGV4dCwgZW4gZWwgZGV0YWxsZSBkZSBkaWNobyB0aWNrZXQsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ011ZXN0YSB1biB27W5jdWxvIGVuIGVsIG1lbvogcGFyYSBtb2RpZmljYXIgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGVsIGRldGFsbGUgZGVsIHRpY2tldCBjb3JyZXNwb25kaWVudGUsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdNdWVzdGEgdW4gdu1uY3VsbyBlbiBlbCBtZW76IHBhcmEgbW9kaWZpY2FyIGxhIGRlY2lzafNuIGRlIHVuIHRpY2tldCwgZW4gZWwgZGV0YWxsZSBkZSBkaWNobyB0aWNrZXQsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnRGV0ZXJtaW5hIHNpIGVzIG5lY2VzYXJpbyBxdWUgZWwgdGlja2V0IGVzdOkgYmxvcXVlYWRvIHBhcmEgYWNjZWRlciBhIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoc2kgZWwgdGlja2V0IG5vIGVzdOEgYmxvcXVlYWRvIGH6biwgc2UgYmxvcXVlYSB5IGVsIGFnZW50ZSBhY3R1YWwgc2UgY29udmVydGly4SBhdXRvbeF0aWNhbWVudGUgZW4gc3UgcHJvcGlldGFyaW8pLic7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICdQZXJtaXRlIGRlZmluaXIgZWwgdGlwbyBkZSB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChUaWNrZXQ6OlR5cGUgdGllbmUgcXVlIGVzdGFyIGhhYmlsaXRhZG8pLic7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6U2VydmljZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1Blcm1pdGUgZGVmaW5pciBlbCBwcm9waWV0YXJpbyBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1Blcm1pdGUgZGVmaW5pciBlbCByZXNwb25zYWJsZSBkZWwgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMsIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdTaSB1bmEgbm90YSBlcyBhZ3JlZ2FkYSBwb3IgdW4gYWdlbnRlLCBkZWZpbmUgZWwgZXN0YWRvIGRlIHVuIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnRGVmaW5lIGVsIHNpZ3VpZW50ZSBlc3RhZG8gZGUgdW4gdGlja2V0IHBvciBkZWZhdWx0LCBsdWVnbyBkZSBhZ3JlZ2FyIHVuYSBub3RhIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1Blcm1pdGUgYWdyZWdhciBub3RhcyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdEZWZpbmUgZWwgYXN1bnRvIHBvciBkZWZhdWx0IGRlIHVuYSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdEZWZpbmUgZWwgdGV4dG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ011ZXN0YSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgaW52b2x1Y3JhZG9zIGVuIGVzdGUgdGlja2V0LCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ011ZXN0cmEgdW5hIGxpc3RhIGRlIHRvZG9zIGxvcyBhZ2VudGVzIHBvc2libGVzIChhcXVlbGxvcyBjb24gcGVybWlzb3MgcGFyYSBhZ3JlZ2FyIG5vdGFzIGVuIGxhIGZpbGEgbyB0aWNrZXQpLCBwYXJhIGRldGVybWluYXIgcXVp6W4vcXVp6W5lcyBkZWJlbiBzZXIgaW5mb3JtYWRvcyBhY2VyY2EgZGUg6XN0YSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ0RlZmluZSBlbCB0aXBvIGRlZmF1bHQgZGUgbGFzIG5vdGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnU3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLid9ID0gJ0VzcGVjaWZpY2EgbG9zIGRpZmVyZW50ZXMgdGlwb3MgZGUgbm90YXMgcXVlIHVzYXLhbiBlbiBlbCBzaXN0ZW1hLic7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdNdWVzdHJhIGxhcyBvcGNpb25lcyBkZSBwcmlvcmlkYWQgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnRGVmaW5lIGxhIHByaW9yaWRhZCBkZWZhdWx0IGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnTXVlc3RyYSBsb3MgY2FtcG9zIGRlbCB07XR1bG8gZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICdPcGNpb25lcyBmcmVlIHRleHQgZGVsIHRpY2tldCwgbW9zdHJhZGFzIGVuIGxhIHZlbnRhbmEgZGUgY2FtcG9zIElUU00gYWRpY2lvbmFsZXMgZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4gTGFzIGNvbmZpZ3VyYWNpb25lcyBwb3NpYmxlcyBzb246IDAgPSBEZXNoYWJpbGl0YWRvLCAxID0gSGFiaWxpdGFkbywgMiA9IEhhYmlsaXRhZG8geSBvYmxpZ2F0b3Jpby4nOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnT3BjaW9uZXMgZnJlZSB0aW1lIGRlbCB0aWNrZXQsIG1vc3RyYWRhcyBlbiBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuIExhcyBjb25maWd1cmFjaW9uZXMgcG9zaWJsZXMgc29uOiAwID0gRGVzaGFiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8sIDIgPSBIYWJpbGl0YWRvIHkgb2JsaWdhdG9yaW8uJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICdPcGNpb25lcyBmcmVlIHRleHQgZGVsIGFydO1jdWxvLCBtb3N0cmFkYXMgZW4gbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcyBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLiBMYXMgY29uZmlndXJhY2lvbmVzIHBvc2libGVzIHNvbjogMCA9IERlc2hhYmlsaXRhZG8sIDEgPSBIYWJpbGl0YWRvLCAyID0gSGFiaWxpdGFkbyB5IG9ibGlnYXRvcmlvLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICdEZWZpbmUgZWwgdGlwbyBkZSBoaXN0b3JpYWwgcGFyYSBsYSBhY2Np824gZGUgbGEgdmVudGFuYSBkZSBjYW1wb3MgSVRTTSBhZGljaW9uYWxlcywgbWlzbWEgcXVlIGVzIHVzYWRhIHBvciBlbCBoaXN0b3JpYWwgZGVsIHRpY2tldC4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnRGVmaW5lIGVsIGNvbWVudGFyaW8gZGVsIGhpc3RvcmlhbCBwYXJhIGxhIGFjY2nzbiBkZSBsYSB2ZW50YW5hIGRlIGNhbXBvcyBJVFNNIGFkaWNpb25hbGVzLCBtaXNtYSBxdWUgZXMgdXNhZGEgcG9yIGVsIGhpc3RvcmlhbCBkZWwgdGlja2V0Lic7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1Blcm1pc29zIG5lY2VzYXJpb3MgcGFyYSB1c2FyIGxhIHZlbnRhbmEgZGUgZGVjaXNp824sIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICdEZXRlcm1pbmEgc2kgZXMgbmVjZXNhcmlvIHF1ZSBlbCB0aWNrZXQgZXN06SBibG9xdWVhZG8gcGFyYSBhY2NlZGVyIGEgbGEgdmVudGFuYSBkZSBkZWNpc2nzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlIChzaSBlbCB0aWNrZXQgbm8gZXN04SBibG9xdWVhZG8gYfpuLCBzZSBibG9xdWVhIHkgZWwgYWdlbnRlIGFjdHVhbCBzZSBjb252ZXJ0aXLhIGF1dG9t4XRpY2FtZW50ZSBlbiBzdSBwcm9waWV0YXJpbykuJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnUGVybWl0ZSBkZWZpbmlyIGVsIHRpcG8gZGUgdGlja2V0IGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNp824gZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZSAoVGlja2V0OjpUeXBlIHRpZW5lIHF1ZSBlc3RhciBoYWJpbGl0YWRvKS4nOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJ1Blcm1pdGUgZGVmaW5pciBlbCBzZXJ2aWNpbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGVuIGxhIGludGVyZmF6IGRlbCBhZ2VudGUgKFRpY2tldDo6U2VydmljZSB0aWVuZSBxdWUgZXN0YXIgaGFiaWxpdGFkbykuJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnUGVybWl0ZSBkZWZpbmlyIGVsIHByb3BpZXRhcmlvIGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nzbiwgZW4gbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdQZXJtaXRlIGRlZmluaXIgZWwgcmVzcG9uc2FibGUgZGVsIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdTaSB1bmEgbm90YSBlcyBhZ3JlZ2FkYSBwb3IgdW4gYWdlbnRlLCBkZWZpbmUgZWwgZXN0YWRvIGRlIHVuIHRpY2tldCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuLCBlbiBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdEZWZpbmUgZWwgc2lndWllbnRlIGVzdGFkbyBkZSB1biB0aWNrZXQsIGx1ZWdvIGRlIGFncmVnYXIgdW5hIG5vdGEgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ0RlZmluZSBlbCBzaWd1aWVudGUgZXN0YWRvIGRlIHVuIHRpY2tldCBwb3IgZGVmYXVsdCwgbHVlZ28gZGUgYWdyZWdhciB1bmEgbm90YSBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ1Blcm1pdGUgYWdyZWdhciBub3RhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ0RlZmluZSBlbCBhc3VudG8gcG9yIGRlZmF1bHQgZGUgdW5hIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNp824gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnRGVmaW5lIGVsIHRleHRvIHBvciBkZWZhdWx0IGRlIHVuYSBub3RhLCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJ011ZXN0YSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgaW52b2x1Y3JhZG9zIGVuIGVzdGUgdGlja2V0LCBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnTXVlc3RyYSB1bmEgbGlzdGEgZGUgdG9kb3MgbG9zIGFnZW50ZXMgcG9zaWJsZXMgKGFxdWVsbG9zIGNvbiBwZXJtaXNvcyBwYXJhIGFncmVnYXIgbm90YXMgZW4gbGEgZmlsYSBvIHRpY2tldCksIHBhcmEgZGV0ZXJtaW5hciBxdWnpbi9xdWnpbmVzIGRlYmVuIHNlciBpbmZvcm1hZG9zIGFjZXJjYSBkZSDpc3RhIG5vdGEsIGVuIGxhIHZlbnRhbmEgZGUgZGVjaXNp824gZGUgbGEgaW50ZXJmYXogZGVsIGFnZW50ZS4nOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdEZWZpbmUgZWwgdGlwbyBkZWZhdWx0IGRlIGxhcyBub3RhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnTXVlc3RyYSBsYXMgb3BjaW9uZXMgZGUgcHJpb3JpZGFkIGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnRGVmaW5lIGxhIHByaW9yaWRhZCBkZWZhdWx0IGRlbCB0aWNrZXQgZW4gbGEgdmVudGFuYSBkZSBkZWNpc2nzbiBkZSBsYSBpbnRlcmZheiBkZWwgYWdlbnRlLic7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICdNdWVzdHJhIGxvcyBjYW1wb3MgZGVsIHTtdHVsbyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnT3BjaW9uZXMgZnJlZSB0ZXh0IGRlbCB0aWNrZXQsIG1vc3RyYWRhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuIExhcyBjb25maWd1cmFjaW9uZXMgcG9zaWJsZXMgc29uOiAwID0gRGVzaGFiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8sIDIgPSBIYWJpbGl0YWRvIHkgb2JsaWdhdG9yaW8uJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnT3BjaW9uZXMgZnJlZSB0aW1lIGRlbCB0aWNrZXQsIG1vc3RyYWRhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuIExhcyBjb25maWd1cmFjaW9uZXMgcG9zaWJsZXMgc29uOiAwID0gRGVzaGFiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8sIDIgPSBIYWJpbGl0YWRvIHkgb2JsaWdhdG9yaW8uJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJ09wY2lvbmVzIGZyZWUgdGV4dCBkZWwgYXJ07WN1bG8sIG1vc3RyYWRhcyBlbiBsYSB2ZW50YW5hIGRlIGRlY2lzafNuIGRlIGxhIGludGVyZmF6IGRlbCBhZ2VudGUuIExhcyBjb25maWd1cmFjaW9uZXMgcG9zaWJsZXMgc29uOiAwID0gRGVzaGFiaWxpdGFkbywgMSA9IEhhYmlsaXRhZG8sIDIgPSBIYWJpbGl0YWRvIHkgb2JsaWdhdG9yaW8uJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnRGVmaW5lIGVsIHRpcG8gZGUgaGlzdG9yaWFsLCBwYXJhIGxhIGFjY2nzbiBkZSBsYSB2ZW50YW5hIGRlIGRlY2lzafNuLCBtaXNtYSBxdWUgZXMgdXNhZGEgcG9yIGVsIGhpc3RvcmlhbCBkZWwgdGlja2V0Lic7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJ0RlZmluZSBlbCBjb21lbnRhcmlvIGRlbCBoaXN0b3JpYWwsIHBhcmEgbGEgYWNjafNuIGRlIGxhIHZlbnRhbmEgZGUgZGVjaXNp824sIG1pc21hIHF1ZSBlcyB1c2FkYSBwb3IgZWwgaGlzdG9yaWFsIGRlbCB0aWNrZXQuJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0gJ0hhYmlsaXRhLCBlbiBlbCBt82R1bG8gZGUgZXN0YWTtc3RpY2FzLCBsYSBnZW5lcmFjafNuIGRlIGVzdGFk7XN0aWNhcyBhY2VyY2EgZGVsIHByb21lZGlvIGRlIHNvbHVjafNuIGRlIHRpY2tldHMgSVRTTS4nOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICdIYWJpbGl0YSwgZW4gZWwgbfNkdWxvIGRlIGVzdGFk7XN0aWNhcywgbGEgZ2VuZXJhY2nzbiBkZSBlc3RhZO1zdGljYXMgYWNlcmNhIGRlbCB0YXNhIHByb21lZGlvIGRlIHNvbHVjafNuIGRlIHByaW1lciBuaXZlbCBkZSB0aWNrZXRzIElUU00uJzsKICAgICRMYW5nLT57J0xpbmsgdGlja2V0J30gPSAnVmluY3VsYXIgdGlja2V0JzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mYV9JVFNNVGlja2V0LnBtIC0gdGhlIHBlcnNpYW4gKGZhcnNpKSB0cmFuc2xhdGlvbiBvZiBmYV9JVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwMy0yMDA5IEFmc2hhciBNb2hlYmJpIDxhZnNoYXIubW9oZWJiaSBhdCBnbWFpbC5jb20+CiMgLS0KIyAkSWQ6IGZhX0lUU01UaWNrZXQucG0sdiAxLjYgMjAxMC8wOS8wNiAyMjo1OTowMiBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpmYV9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDYp9mG2KzYp9mFJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICfYqti12YXbjNmFJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICfYr9mE24zZhCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAn2KrYp9ix24zYriDYqti12YXbjNmFJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICfYp9mE2LXYp9mCINuM2qkg2KrYtdmF24zZhSDYqNmHINiv2LHYrtmI2KfYs9iqJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICfZhtiq24zYrNmHINiq2LXZhduM2YUnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ9mG24zYp9iyINio2Ycg2KjYp9iy2KjbjNmG24wg2K/Yp9ix2K8nOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ9mF2YjZgtiq2Kcg2KjYs9iq2Ycg2LTYryc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAn2YHbjNmE2K/Zh9in24wg2KfYttin2YHZhyBJVFNNJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICfYqti624zbjNixINmB24zZhNiv2YfYp9uMIElUU00g2K/Ysdiu2YjYp9iz2KonOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ9iy2YXYp9mGINi02LHZiNi5INiq2LnZhduM2LEnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ9iy2YXYp9mGINi02LHZiNi5INio2YfYqNmI2K8nOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ9mB24zZhNiv2YfYp9uMIElUU00g2LHYpyDYqti624zbjNixINiv2YfbjNivISc7CiAgICAkTGFuZy0+eydBZGQgYSBkZWNpc2lvbiEnfSAgICAgICAgICAgICAgPSAn24zaqSDYqti12YXbjNmFINin2LbYp9mB2Ycg2qnZhtuM2K8hJzsKICAgICRMYW5nLT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKSwgZS5nLiBpbmNpZGVudCwgcHJvYmxlbSwgY2hhbmdlLCAuLi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgMyBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDQgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA0Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA1IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNiBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRpZmZlcmVuY2UgZnJvbSBub3cgKGluIHNlY29uZHMpIG9mIHRoZSBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDZcJ3MgZGVmYXVsdCB2YWx1ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBjbG9zZSB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZW1haWwgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHBob25lIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgZnJlZSB0ZXh0IGZpZWxkIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPSAnJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9mcl9JVFNNVGlja2V0LnBtIC0gdGhlIGZyZW5jaCB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDkgT2xpdmllciBTYWxsb3UgPG9saXZpZXIuc2FsbG91IGF0IGlyaXNhLmZyPgojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogZnJfSVRTTVRpY2tldC5wbSx2IDEuNyAyMDEwLzA5LzA2IDIyOjU5OjAyIGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmZyX0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0R1ZSBkYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdFbmdhZ2VuZW50IGRlIGRhdGUnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0TpY2lzaW9uJzsKICAgICRMYW5nLT57J1JlYXNvbid9ICAgICAgICAgICAgICAgICAgICAgICA9ICdSYWlzb24nOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ0RhdGUgZGUgZOljaXNpb24nOwogICAgJExhbmctPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ICAgICAgID0gJ0Fqb3V0ZXIgdW5lIGTpY2lzaW9uIGF1IHRpY2tldCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnUulzdWx0YXQgZGUgbGEgROljaXNpb24nOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JldnVlIHJlcXVpc2UnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ0Zlcm3pIGF2ZWMgY29udG91cm5lbWVudCc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnQ2hhbXBzIElUU00gYWRkaXRpb25lbHMnOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWVyIGxlcyBjaGFtcHMgSVRTTSBkdSB0aWNrZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ0RhdGUgZGUgZOlidXQgZGUgculwYXJhdGlvbic7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnRGF0ZSBkZSBk6WJ1dCBkZSByZXRvdXIg4CBsYSBub3JtYWxlJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdNb2RpZmlleiBsZXMgY2hhbXBzIElUU00hJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICdBam91dGV6IHVuZSBk6WNpc2lvbiEnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9pdF9JVFNNVGlja2V0LnBtIC0gdGhlIGl0YWxpYW4gdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogaXRfSVRTTVRpY2tldC5wbSx2IDEuNiAyMDEwLzA5LzA2IDIyOjU5OjAyIGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6Oml0X0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICRMYW5nLT57J0R1ZSBkYXRlJ30gICAgICAgICAgICAgICAgICAgICA9ICdEYXRhIGRpIHNjYWRlbnphJzsKICAgICRMYW5nLT57J0RlY2lzaW9uJ30gICAgICAgICAgICAgICAgICAgICA9ICdSaXNvbHV6aW9uZSc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnTW90aXZvJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdEYXRhIGRpIFJpc29sdXppb25lJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdBZ2dpdW5naSB1bmEgUmlzb2x1emlvbmUgYWwgVGlja2V0JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdSaXN1bHRhdG8gZGVsbGEgUmlzb2x1emlvbmUnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ1JpY2hpZXN0YSBSZXZpc2lvbmUnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ2NoaXVzbyBjb24gc29sdXppb25lIHRhbXBvbmUgKHdvcmthcm91bmQpJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdDYW1waSBJVFNNIGFnZ2l1bnRpdmknOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ01vZGlmaWNhIGNhbXBpIElUU00gZGVsIHRpY2tldCc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnRGF0YSBpbml6aWFsZSBkaSByaXBhcmF6aW9uZSc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnRGF0YSBpbml6aWFsZSBkaSByZWN1cGVybyc7CiAgICAkTGFuZy0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ICAgICAgPSAnQ2FtYmlhIGkgY2FtcGkgSVRTTSEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ0FnZ2l1bmdpIHVuYSByaXNvbHV6aW9uZSEnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ubF9JVFNNVGlja2V0LnBtIC0gdGhlIER1dGNoIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDkgTWljaGllbCBCZWlqZW4gPG1pY2hpZWwgJ2F0JyBiZWVmcmVlaXQubmw+CiMgLS0KIyAkSWQ6IG5sX0lUU01UaWNrZXQucG0sdiAxLjYgMjAxMC8wOS8wNiAyMjo1OTowMiBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjpubF9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS42ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnVmVydmFsZGF0dW0nOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0Jlc2xpc3NpbmcnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1JlZGVuJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdCZXNsaXNzaW5nc2RhdHVtJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICdLb3BwZWwgYmVzbGlzc2luZyBhYW4gdGlja2V0JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdSZXN1bHRhYXQgYmVzbGlzc2luZyc7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnUmV2aWV3IGJlbm9kaWdkJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdnZXNsb3RlbiBtZXQgd29ya2Fyb3VuZCc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAnRXh0cmEgSVRTTSB2ZWxkZW4nOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ZlcmFuZGVyZW4gdmFuIElUU00gdmVsZGVuIHZhbiB0aWNrZXQnOwogICAgJExhbmctPnsnUmVwYWlyIFN0YXJ0IFRpbWUnfSAgICAgICAgICAgID0gJ0JlZ2ludGlqZCByZXBhcmF0aWUnOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ0JlZ2ludGlqZCBoZXJzdGVsJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdWZXJhbmRlcmVuIHZhbiBJVFNNIHZlbGRlbiEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ0Jlc2xpc3NpbmcgdG9ldm9lZ2VuISc7CiAgICAkTGFuZy0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCksIGUuZy4gaW5jaWRlbnQsIHByb2JsZW0sIGNoYW5nZSwgLi4uJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDMgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciAzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA0IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNSBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDYgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA2Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkaWZmZXJlbmNlIGZyb20gbm93IChpbiBzZWNvbmRzKSBvZiB0aGUgZnJlZSB0aW1lIGZpZWxkIG51bWJlciA2XCdzIGRlZmF1bHQgdmFsdWUuJ30gPSAnJzsKICAgICRMYW5nLT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgY2xvc2UgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBjb21wb3NlIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGVtYWlsIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBwaG9uZSB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFkZCBhIGZyZWUgdGV4dCBmaWVsZCBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wbF9JVFNNVGlja2V0LnBtIC0gdGhlIHBvbGlzaCB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAwOCBNYWNpZWogTG9zemFqYwojIC0tCiMgJElkOiBwbF9JVFNNVGlja2V0LnBtLHYgMS4xMCAyMDEwLzA5LzA2IDIyOjU5OjAyIGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OnBsX0lUU01UaWNrZXQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnQ3phcyBwcnp5YnljaWEnOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ0RlY3l6amEnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ1Bvd/NkJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIERhdGUnfSAgICAgICAgICAgICAgICA9ICdEYXRhIGRlY3l6amknOwogICAgJExhbmctPnsnQWRkIGRlY2lzaW9uIHRvIHRpY2tldCd9ICAgICAgID0gJ0RvZGFqIGRlY3l6amUgZG8gYmlsZXR1JzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICdSZXp1bHRhdCBkZWN5emppJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCd9ICAgICAgID0gJ1JvendpsXphbmUgeiBvYmVqtmNpZW0nOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ0RvZGF0a293ZSBwb2xhIElUU00nOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ1ptaWXxIHBvbGEgSVRTTSBkbGEgYmlsZXR1JzsKICAgICRMYW5nLT57J1JlcGFpciBTdGFydCBUaW1lJ30gICAgICAgICAgICA9ICdDemFzIHJvenBvY3rqY2lhIG5hcHJhd3knOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ0N6YXMgcm96cG9jeupjaWEgb2R6eXNraXdhbmlhJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICcnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eydBbGxvd3MgZGVmaW5pbmcgbmV3IHR5cGVzIGZvciB0aWNrZXQgKGlmIHRpY2tldCB0eXBlIGZlYXR1cmUgaXMgZW5hYmxlZCksIGUuZy4gaW5jaWRlbnQsIHByb2JsZW0sIGNoYW5nZSwgLi4uJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTMgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHRoZSBmcmVlIGtleSBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgdG8gYWRkIGEgbmV3IHRpY2tldCBhdHRyaWJ1dGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc2VsZWN0aW9uIG9mIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIChpZiBtb3JlIHRoYW4gb25lIG9wdGlvbiBpcyBwcm92aWRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDMgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciAzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA0IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNSBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDUuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDYgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA2Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkaWZmZXJlbmNlIGZyb20gbm93IChpbiBzZWNvbmRzKSBvZiB0aGUgZnJlZSB0aW1lIGZpZWxkIG51bWJlciA2XCdzIGRlZmF1bHQgdmFsdWUuJ30gPSAnJzsKICAgICRMYW5nLT57J0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgY2xvc2UgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBjb21wb3NlIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGVtYWlsIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBwaG9uZSB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGFkZCBhIGZyZWUgdGV4dCBmaWVsZCBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gbW9kaWZ5IGFkZGl0aW9uYWwgSVRTTSBmaWVsZHMgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIGNoYW5nZSB0aGUgZGVjaXNpb24gb2YgYSB0aWNrZXQgaW4gaXRzIHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU3BlY2lmaWVzIHRoZSBkaWZmZXJlbnQgbm90ZSB0eXBlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiB0aGUgc3lzdGVtLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydSZXF1aXJlZCBwZXJtaXNzaW9ucyB0byB1c2UgdGhlIGRlY2lzaW9uIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnSWYgYSBub3RlIGlzIGFkZGVkIGJ5IGFuIGFnZW50LCBzZXRzIHRoZSBzdGF0ZSBvZiBhIHRpY2tldCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydBbGxvd3MgYWRkaW5nIG5vdGVzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBpbnZvbHZlZCBhZ2VudHMgb24gdGhpcyB0aWNrZXQsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0aWNrZXQgcHJpb3JpdHkgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgY29tbWVudCBmb3IgdGhlIGRlY2lzaW9uIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IHNvbHV0aW9uLid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBmaXJzdCBsZXZlbCBzb2x1dGlvbiByYXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydMaW5rIHRpY2tldCd9ID0gJyc7CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9wdF9CUl9JVFNNVGlja2V0LnBtIC0gdGhlIEJyYXppbGlhbiB0cmFuc2xhdGlvbiBvZiBJVFNNVGlja2V0CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIENvcHlyaWdodCAoQykgMjAxMCBDcmlzdGlhbm8gS29ybmT2cmZlciwgaHR0cDovL3d3dy5kb3JmZXIuY29tLmJyLwojIC0tCiMgJElkOiBwdF9CUl9JVFNNVGlja2V0LnBtLHYgMS42IDIwMTAvMDkvMDYgMjI6NTk6MDIgZW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cHRfQlJfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIGRhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ0RhdGEgdmVuY2ltZW50byc7CiAgICAkTGFuZy0+eydEZWNpc2lvbid9ICAgICAgICAgICAgICAgICAgICAgPSAnRGVjaXPjbyc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnUmF6428nOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ0RhdGEgZGUgRGVjaXPjbyc7CiAgICAkTGFuZy0+eydBZGQgZGVjaXNpb24gdG8gdGlja2V0J30gICAgICAgPSAnQWRpY2lvbmFyIERlY2lz428g4CBTb2xpY2l0Yefjbyc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnRGVjaXPjbyBSZXN1bHRhbnRlJzsKICAgICRMYW5nLT57J1JldmlldyBSZXF1aXJlZCd9ICAgICAgICAgICAgICA9ICdSZXZpc+NvIFJlcXVpc2l0YWRhJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICdmZWNoYWRhIGNvbSBzb2x15+NvIGRlIGNvbnRvcm5vJzsKICAgICRMYW5nLT57J0FkZGl0aW9uYWwgSVRTTSBGaWVsZHMnfSAgICAgICA9ICdDYW1wb3MgYWRpY2lvbmFpcyBJVFNNJzsKICAgICRMYW5nLT57J0NoYW5nZSBJVFNNIGZpZWxkcyBvZiB0aWNrZXQnfSA9ICdNdWRhciBvcyBjYW1wb3MgSVRTTSBkYSBzb2xpY2l0Yefjbyc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnSG9yYSBJbmljaWFsIGRvIFJlcGFybyc7CiAgICAkTGFuZy0+eydSZWNvdmVyeSBTdGFydCBUaW1lJ30gICAgICAgICAgPSAnSG9yYSBJbmljaWFsIGRhIFJlY3VwZXJh5+NvJzsKICAgICRMYW5nLT57J0NoYW5nZSB0aGUgSVRTTSBmaWVsZHMhJ30gICAgICA9ICdNdWRhciBvcyBjYW1wb3MgSVRTTSEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ0FkaWNpb25hciB1bWEgZGVjaXPjbyEnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9ydV9JVFNNVGlja2V0LnBtIC0gdGhlIHJ1c3NpYW4gdHJhbnNsYXRpb24gb2YgSVRTTVRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBDb3B5cmlnaHQgKEMpIDIwMDggRWdvciBUc2lsZW5rbyA8Ymc4cyBhdCBzeW1saW5rLnJ1PgojIC0tCiMgJElkOiBydV9JVFNNVGlja2V0LnBtLHYgMS44IDIwMTAvMDkvMDYgMjI6NTk6MDIgZW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6cnVfSVRTTVRpY2tldDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOCAkKSBbMV07CgpzdWIgRGF0YSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIG15ICRMYW5nID0gJFNlbGYtPntUcmFuc2xhdGlvbn07CgogICAgcmV0dXJuIGlmIHJlZiAkTGFuZyBuZSAnSEFTSCc7CgogICAgJExhbmctPnsnRHVlIGRhdGUnfSAgICAgICAgICAgICAgICAgICAgID0gJ8Tg8uAg6PHv7uvt5e3o/yc7CiAgICAkTGFuZy0+eydEZWNpc2lvbid9ICAgICAgICAgICAgICAgICAgICAgPSAn0OX45e3o5Sc7CiAgICAkTGFuZy0+eydSZWFzb24nfSAgICAgICAgICAgICAgICAgICAgICAgPSAnz/Do9+jt4Cc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBEYXRlJ30gICAgICAgICAgICAgICAgPSAnxODy4CDw5fjl7ej/JzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICfC++3l8fLoIPDl+OXt6OUg7+4g5+D/4urlJzsKICAgICRMYW5nLT57J0RlY2lzaW9uIFJlc3VsdCd9ICAgICAgICAgICAgICA9ICfQ5efz6/zy4PIg8OX45e3o/yc7CiAgICAkTGFuZy0+eydSZXZpZXcgUmVxdWlyZWQnfSAgICAgICAgICAgICAgPSAnzeXu4fXu5OjsIO/w7vHs7vLwJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICfn4Orw+/LuIPEg7uH17uTt++wg8OX45e3o5ewnOwogICAgJExhbmctPnsnQWRkaXRpb25hbCBJVFNNIEZpZWxkcyd9ICAgICAgID0gJ8Tu7+7r7ejy5ev87fvlIElUU00g7+7r/yc7CiAgICAkTGFuZy0+eydDaGFuZ2UgSVRTTSBmaWVsZHMgb2YgdGlja2V0J30gPSAnyOfs5e3o8vwgSVRTTSDv7uv/IOfg/+Lq6Cc7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAnxODy4CDt4Pfg6+Ag8ODh7vInOwogICAgJExhbmctPnsnUmVjb3ZlcnkgU3RhcnQgVGltZSd9ICAgICAgICAgID0gJ8Tg8uAg4u7x8fLg7e7i6+Xt6P8g8eXw4ujx4Cc7CiAgICAkTGFuZy0+eydDaGFuZ2UgdGhlIElUU00gZmllbGRzISd9ICAgICAgPSAnJzsKICAgICRMYW5nLT57J0FkZCBhIGRlY2lzaW9uISd9ICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGRlZmluaW5nIG5ldyB0eXBlcyBmb3IgdGlja2V0IChpZiB0aWNrZXQgdHlwZSBmZWF0dXJlIGlzIGVuYWJsZWQpLCBlLmcuIGluY2lkZW50LCBwcm9ibGVtLCBjaGFuZ2UsIC4uLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDEzIGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE0IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE1IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB0aGUgZnJlZSBrZXkgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRleHQgZmllbGQgbnVtYmVyIDE2IGZvciB0aWNrZXRzIHRvIGFkZCBhIG5ldyB0aWNrZXQgYXR0cmlidXRlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbiBvZiB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyAoaWYgbW9yZSB0aGFuIG9uZSBvcHRpb24gaXMgcHJvdmlkZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciAzIGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgMy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNCBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDUgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA1Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA2IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGlmZmVyZW5jZSBmcm9tIG5vdyAoaW4gc2Vjb25kcykgb2YgdGhlIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNlwncyBkZWZhdWx0IHZhbHVlLid9ID0gJyc7CiAgICAkTGFuZy0+eydGcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGNsb3NlIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgY29tcG9zZSBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSBlbWFpbCB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgcGhvbmUgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgdGlja2V0IHByaW9yaXR5IHNjcmVlbiBvZiBhIHpvb21lZCB0aWNrZXQgaW4gdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpUeXBlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHNlcnZpY2UgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIHRpY2tldCBzZWFyY2ggb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGltZSBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBhZGQgYSBmcmVlIHRleHQgZmllbGQgaW4gdGhlIHRpY2tldCB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaW5rIGluIHRoZSBtZW51IHRvIG1vZGlmeSBhZGRpdGlvbmFsIElUU00gZmllbGRzIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBjaGFuZ2UgdGhlIGRlY2lzaW9uIG9mIGEgdGlja2V0IGluIGl0cyB6b29tIHZpZXcgb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChpZiB0aGUgdGlja2V0IGlzblwndCBsb2NrZWQgeWV0LCB0aGUgdGlja2V0IGdldHMgbG9ja2VkIGFuZCB0aGUgY3VycmVudCBhZ2VudCB3aWxsIGJlIHNldCBhdXRvbWF0aWNhbGx5IGFzIGl0cyBvd25lcikuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCB0eXBlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHJlc3BvbnNpYmxlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgYm9keSBvZiBhIG5vdGUgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCB0eXBlIG9mIHRoZSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NwZWNpZmllcyB0aGUgZGlmZmVyZW50IG5vdGUgdHlwZXMgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHN5c3RlbS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpY2tldCBwcmlvcml0eSBvcHRpb25zIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGhpc3RvcnkgdHlwZSBmb3IgdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnUmVxdWlyZWQgcGVybWlzc2lvbnMgdG8gdXNlIHRoZSBkZWNpc2lvbiBzY3JlZW4gaW4gdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyBpZiBhIHRpY2tldCBsb2NrIGlzIHJlcXVpcmVkIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoVGlja2V0OjpTZXJ2aWNlIG5lZWRzIHRvIGJlIGFjdGl2YXRlZCkuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCBvd25lciBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0lmIGEgbm90ZSBpcyBhZGRlZCBieSBhbiBhZ2VudCwgc2V0cyB0aGUgc3RhdGUgb2YgYSB0aWNrZXQgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnQWxsb3dzIGFkZGluZyBub3RlcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgc3ViamVjdCBvZiBhIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgaW52b2x2ZWQgYWdlbnRzIG9uIHRoaXMgdGlja2V0LCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIHBvc3NpYmxlIGFnZW50cyAoYWxsIGFnZW50cyB3aXRoIG5vdGUgcGVybWlzc2lvbnMgb24gdGhlIHF1ZXVlL3RpY2tldCkgdG8gZGV0ZXJtaW5lIHdobyBzaG91bGQgYmUgaW5mb3JtZWQgYWJvdXQgdGhpcyBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdGlja2V0IHByaW9yaXR5IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgdGhlIHRpdGxlIGZpZWxkcyBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J0FydGljbGUgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IGNvbW1lbnQgZm9yIHRoZSBkZWNpc2lvbiBzY3JlZW4gYWN0aW9uLCB3aGljaCBnZXRzIHVzZWQgZm9yIHRpY2tldCBoaXN0b3J5Lid9ID0gJyc7CiAgICAkTGFuZy0+eydFbmFibGVzIHRoZSBzdGF0cyBtb2R1bGUgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgYXZlcmFnZSBvZiBJVFNNIHRpY2tldCBzb2x1dGlvbi4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgZmlyc3QgbGV2ZWwgc29sdXRpb24gcmF0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnTGluayB0aWNrZXQnfSA9ICcnOwoKICAgIHJldHVybiAxOwp9CgoxOwo=
IyAtLQojIEtlcm5lbC9MYW5ndWFnZS96aF9DTl9JVFNNVGlja2V0LnBtIC0gdGhlIENoaW5lc2Ugc2ltcGxlIHRyYW5zbGF0aW9uIG9mIElUU01UaWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IHpoX0NOX0lUU01UaWNrZXQucG0sdiAxLjcgMjAxMC8wOS8wNiAyMjo1OTowMiBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Okxhbmd1YWdlOjp6aF9DTl9JVFNNVGlja2V0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS43ICQpIFsxXTsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgbXkgJExhbmcgPSAkU2VsZi0+e1RyYW5zbGF0aW9ufTsKCiAgICByZXR1cm4gaWYgcmVmICRMYW5nIG5lICdIQVNIJzsKCiAgICAkTGFuZy0+eydEdWUgZGF0ZSd9ICAgICAgICAgICAgICAgICAgICAgPSAnvdjWucjVxtonOwogICAgJExhbmctPnsnRGVjaXNpb24nfSAgICAgICAgICAgICAgICAgICAgID0gJ772tqgnOwogICAgJExhbmctPnsnUmVhc29uJ30gICAgICAgICAgICAgICAgICAgICAgID0gJ8Dt08knOwogICAgJExhbmctPnsnRGVjaXNpb24gRGF0ZSd9ICAgICAgICAgICAgICAgID0gJ772tqjI1cbaJzsKICAgICRMYW5nLT57J0FkZCBkZWNpc2lvbiB0byB0aWNrZXQnfSAgICAgICA9ICfU9rzTvva2qLW9IFRpY2tldCc7CiAgICAkTGFuZy0+eydEZWNpc2lvbiBSZXN1bHQnfSAgICAgICAgICAgICAgPSAnvva2qL3hufsnOwogICAgJExhbmctPnsnUmV2aWV3IFJlcXVpcmVkJ30gICAgICAgICAgICAgID0gJ8nzsunJ6sfrJzsKICAgICRMYW5nLT57J2Nsb3NlZCB3aXRoIHdvcmthcm91bmQnfSAgICAgICA9ICfM5rT6t723qLb4udix1Sc7CiAgICAkTGFuZy0+eydBZGRpdGlvbmFsIElUU00gRmllbGRzJ30gICAgICAgPSAntu7N4rXEIElUU00g0/InOwogICAgJExhbmctPnsnQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCd9ID0gJ86quMMgVGlja2V0ILj8uMQgSVRTTSDT8ic7CiAgICAkTGFuZy0+eydSZXBhaXIgU3RhcnQgVGltZSd9ICAgICAgICAgICAgPSAn0N64tL+qyrzKsbzkJzsKICAgICRMYW5nLT57J1JlY292ZXJ5IFN0YXJ0IFRpbWUnfSAgICAgICAgICA9ICe71ri01MvX98qxvOQnOwogICAgJExhbmctPnsnQ2hhbmdlIHRoZSBJVFNNIGZpZWxkcyEnfSAgICAgID0gJ7j8uMQgSVRTTSDT8iEnOwogICAgJExhbmctPnsnQWRkIGEgZGVjaXNpb24hJ30gICAgICAgICAgICAgID0gJ9T2vNPSu7j2vvbS6SEnOwojIEFkZCBieSBOZXZlcgogICAgJExhbmctPnsnQXBwcm92ZWQnfSAgICAgICAgICAgICAgICAgICAgID0gJ8X617wnOwogICAgJExhbmctPnsnUGVuZGluZyd9ICAgICAgICAgICAgICAgICAgICAgID0gJ7T9tqgnOwogICAgJExhbmctPnsnUG9zdHBvbmVkJ30gICAgICAgICAgICAgICAgICAgID0gJ83Gs9knOwogICAgJExhbmctPnsnUHJlLWFwcHJvdmVkJ30gICAgICAgICAgICAgICAgID0gJ9Skz8i6y9e8JzsKICAgICRMYW5nLT57J1JlamVjdGVkJ30gICAgICAgICAgICAgICAgICAgICA9ICe+3L74JzsKICAgICRMYW5nLT57J0FsbG93cyBkZWZpbmluZyBuZXcgdHlwZXMgZm9yIHRpY2tldCAoaWYgdGlja2V0IHR5cGUgZmVhdHVyZSBpcyBlbmFibGVkKSwgZS5nLiBpbmNpZGVudCwgcHJvYmxlbSwgY2hhbmdlLCAuLi4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxMyBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNCBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTQgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNSBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTUgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgdGhlIGZyZWUga2V5IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0ZXh0IGZpZWxkIG51bWJlciAxNiBmb3IgdGlja2V0cyB0byBhZGQgYSBuZXcgdGlja2V0IGF0dHJpYnV0ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzZWxlY3Rpb24gb2YgdGhlIGZyZWUgdGV4dCBmaWVsZCBudW1iZXIgMTYgZm9yIHRpY2tldHMgKGlmIG1vcmUgdGhhbiBvbmUgb3B0aW9uIGlzIHByb3ZpZGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgMyBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGZyZWUgdGltZSBrZXkgZmllbGQgbnVtYmVyIDQgZm9yIHRpY2tldHMuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIHllYXJzIChpbiBmdXR1cmUgYW5kIGluIHBhc3QpIHdoaWNoIGNhbiBnZXQgc2VsZWN0ZWQgaW4gZnJlZSB0aW1lIGZpZWxkIG51bWJlciA0Lid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBmcmVlIHRpbWUga2V5IGZpZWxkIG51bWJlciA1IGZvciB0aWNrZXRzLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSB5ZWFycyAoaW4gZnV0dXJlIGFuZCBpbiBwYXN0KSB3aGljaCBjYW4gZ2V0IHNlbGVjdGVkIGluIGZyZWUgdGltZSBmaWVsZCBudW1iZXIgNS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZnJlZSB0aW1lIGtleSBmaWVsZCBudW1iZXIgNiBmb3IgdGlja2V0cy4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgeWVhcnMgKGluIGZ1dHVyZSBhbmQgaW4gcGFzdCkgd2hpY2ggY2FuIGdldCBzZWxlY3RlZCBpbiBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDYuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRpZmZlcmVuY2UgZnJvbSBub3cgKGluIHNlY29uZHMpIG9mIHRoZSBmcmVlIHRpbWUgZmllbGQgbnVtYmVyIDZcJ3MgZGVmYXVsdCB2YWx1ZS4nfSA9ICcnOwogICAgJExhbmctPnsnRnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBjbG9zZSB0aWNrZXQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IGNvbXBvc2Ugc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgZW1haWwgdGlja2V0IHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIHBob25lIHRpY2tldCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIHRpY2tldCBwcmlvcml0eSBzY3JlZW4gb2YgYSB6b29tZWQgdGlja2V0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6VHlwZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSBzZXJ2aWNlIGluIHRoZSB0aWNrZXQgcHJpb3JpdHkgc2NyZWVuIG9mIGEgem9vbWVkIHRpY2tldCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnVGlja2V0IGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSB0aWNrZXQgc2VhcmNoIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuIFBvc3NpYmxlIHNldHRpbmdzOiAwID0gRGlzYWJsZWQsIDEgPSBFbmFibGVkLCAyID0gRW5hYmxlZCBhbmQgcmVxdWlyZWQuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRpbWUgb3B0aW9ucyBzaG93biBpbiB0aGUgdGlja2V0IHNlYXJjaCBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gYWRkIGEgZnJlZSB0ZXh0IGZpZWxkIGluIHRoZSB0aWNrZXQgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGluayBpbiB0aGUgbWVudSB0byBtb2RpZnkgYWRkaXRpb25hbCBJVFNNIGZpZWxkcyBpbiB0aGUgdGlja2V0IHpvb20gdmlldyBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpbmsgaW4gdGhlIG1lbnUgdG8gY2hhbmdlIHRoZSBkZWNpc2lvbiBvZiBhIHRpY2tldCBpbiBpdHMgem9vbSB2aWV3IG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIGlmIGEgdGlja2V0IGxvY2sgaXMgcmVxdWlyZWQgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZSAoaWYgdGhlIHRpY2tldCBpc25cJ3QgbG9ja2VkIHlldCwgdGhlIHRpY2tldCBnZXRzIGxvY2tlZCBhbmQgdGhlIGN1cnJlbnQgYWdlbnQgd2lsbCBiZSBzZXQgYXV0b21hdGljYWxseSBhcyBpdHMgb3duZXIpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgdHlwZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlNlcnZpY2UgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IG93bmVyIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1NldHMgdGhlIHRpY2tldCByZXNwb25zaWJsZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIG5leHQgc3RhdGUgb2YgYSB0aWNrZXQgYWZ0ZXIgYWRkaW5nIGEgbm90ZSwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBuZXh0IHN0YXRlIG9mIGEgdGlja2V0IGFmdGVyIGFkZGluZyBhIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBzdWJqZWN0IG9mIGEgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IGJvZHkgb2YgYSBub3RlIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnU2hvd3MgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgYWdlbnRzIChhbGwgYWdlbnRzIHdpdGggbm90ZSBwZXJtaXNzaW9ucyBvbiB0aGUgcXVldWUvdGlja2V0KSB0byBkZXRlcm1pbmUgd2hvIHNob3VsZCBiZSBpbmZvcm1lZCBhYm91dCB0aGlzIG5vdGUsIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgdHlwZSBvZiB0aGUgbm90ZSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTcGVjaWZpZXMgdGhlIGRpZmZlcmVudCBub3RlIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBzeXN0ZW0uJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aWNrZXQgcHJpb3JpdHkgb3B0aW9ucyBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGl0bGUgZmllbGRzIGluIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1RpY2tldCBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGFkZGl0aW9uYWwgSVRTTSBmaWVsZCBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnQXJ0aWNsZSBmcmVlIHRleHQgb3B0aW9ucyBzaG93biBpbiB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBoaXN0b3J5IHR5cGUgZm9yIHRoZSBhZGRpdGlvbmFsIElUU00gZmllbGQgc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgYWRkaXRpb25hbCBJVFNNIGZpZWxkIHNjcmVlbiBhY3Rpb24sIHdoaWNoIGdldHMgdXNlZCBmb3IgdGlja2V0IGhpc3RvcnkuJ30gPSAnJzsKICAgICRMYW5nLT57J1JlcXVpcmVkIHBlcm1pc3Npb25zIHRvIHVzZSB0aGUgZGVjaXNpb24gc2NyZWVuIGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgaWYgYSB0aWNrZXQgbG9jayBpcyByZXF1aXJlZCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKGlmIHRoZSB0aWNrZXQgaXNuXCd0IGxvY2tlZCB5ZXQsIHRoZSB0aWNrZXQgZ2V0cyBsb2NrZWQgYW5kIHRoZSBjdXJyZW50IGFnZW50IHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgYXMgaXRzIG93bmVyKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgdGlja2V0IHR5cGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlIChUaWNrZXQ6OlR5cGUgbmVlZHMgdG8gYmUgYWN0aXZhdGVkKS4nfSA9ICcnOwogICAgJExhbmctPnsnU2V0cyB0aGUgc2VydmljZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UgKFRpY2tldDo6U2VydmljZSBuZWVkcyB0byBiZSBhY3RpdmF0ZWQpLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgb3duZXIgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTZXRzIHRoZSB0aWNrZXQgcmVzcG9uc2libGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydJZiBhIG5vdGUgaXMgYWRkZWQgYnkgYW4gYWdlbnQsIHNldHMgdGhlIHN0YXRlIG9mIGEgdGlja2V0IGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0RlZmluZXMgdGhlIGRlZmF1bHQgbmV4dCBzdGF0ZSBvZiBhIHRpY2tldCBhZnRlciBhZGRpbmcgYSBub3RlLCBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J0FsbG93cyBhZGRpbmcgbm90ZXMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHN1YmplY3Qgb2YgYSBub3RlIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgZGVmYXVsdCBib2R5IG9mIGEgbm90ZSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIGEgbGlzdCBvZiBhbGwgdGhlIGludm9sdmVkIGFnZW50cyBvbiB0aGlzIHRpY2tldCwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyBhIGxpc3Qgb2YgYWxsIHRoZSBwb3NzaWJsZSBhZ2VudHMgKGFsbCBhZ2VudHMgd2l0aCBub3RlIHBlcm1pc3Npb25zIG9uIHRoZSBxdWV1ZS90aWNrZXQpIHRvIGRldGVybWluZSB3aG8gc2hvdWxkIGJlIGluZm9ybWVkIGFib3V0IHRoaXMgbm90ZSwgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHR5cGUgb2YgdGhlIG5vdGUgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydTaG93cyB0aGUgdGlja2V0IHByaW9yaXR5IG9wdGlvbnMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydEZWZpbmVzIHRoZSBkZWZhdWx0IHRpY2tldCBwcmlvcml0eSBpbiB0aGUgZGVjaXNpb24gc2NyZWVuIG9mIHRoZSBhZ2VudCBpbnRlcmZhY2UuJ30gPSAnJzsKICAgICRMYW5nLT57J1Nob3dzIHRoZSB0aXRsZSBmaWVsZHMgaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0ZXh0IG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydUaWNrZXQgZnJlZSB0aW1lIG9wdGlvbnMgc2hvd24gaW4gdGhlIGRlY2lzaW9uIHNjcmVlbiBvZiB0aGUgYWdlbnQgaW50ZXJmYWNlLiBQb3NzaWJsZSBzZXR0aW5nczogMCA9IERpc2FibGVkLCAxID0gRW5hYmxlZCwgMiA9IEVuYWJsZWQgYW5kIHJlcXVpcmVkLid9ID0gJyc7CiAgICAkTGFuZy0+eydBcnRpY2xlIGZyZWUgdGV4dCBvcHRpb25zIHNob3duIGluIHRoZSBkZWNpc2lvbiBzY3JlZW4gb2YgdGhlIGFnZW50IGludGVyZmFjZS4gUG9zc2libGUgc2V0dGluZ3M6IDAgPSBEaXNhYmxlZCwgMSA9IEVuYWJsZWQsIDIgPSBFbmFibGVkIGFuZCByZXF1aXJlZC4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSB0eXBlIGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRGVmaW5lcyB0aGUgaGlzdG9yeSBjb21tZW50IGZvciB0aGUgZGVjaXNpb24gc2NyZWVuIGFjdGlvbiwgd2hpY2ggZ2V0cyB1c2VkIGZvciB0aWNrZXQgaGlzdG9yeS4nfSA9ICcnOwogICAgJExhbmctPnsnRW5hYmxlcyB0aGUgc3RhdHMgbW9kdWxlIHRvIGdlbmVyYXRlIHN0YXRpc3RpY3MgYWJvdXQgdGhlIGF2ZXJhZ2Ugb2YgSVRTTSB0aWNrZXQgc29sdXRpb24uJ30gPSAnJzsKICAgICRMYW5nLT57J0VuYWJsZXMgdGhlIHN0YXRzIG1vZHVsZSB0byBnZW5lcmF0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBhdmVyYWdlIG9mIElUU00gdGlja2V0IGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUuJ30gPSAnJzsKICAgICRMYW5nLT57J0xpbmsgdGlja2V0J30gPSAnJzsKCiAgICByZXR1cm4gMTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0gLSBhZGRpdGlvbmFsIGl0c20gZmllbGRzIGZvciB0aWNrZXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQucG0sdiAxLjEwIDIwMTAvMDgvMzEgMjI6MDQ6MzkgbXAgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgLS0tCiMgSVRTTQojIC0tLQojcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0RnJlZVRleHQ7CnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFkZHRsSVRTTUZpZWxkOwoKIyAtLS0KCnVzZSBiYXNlIHF3KCBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0QWN0aW9uQ29tbW9uICk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCjE7Cg==
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RGVjaXNpb24ucG0gLSB0byBhZGQgbm90ZXMgKGRlY2lzaW9uKSB0byBhIHRpY2tldAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXREZWNpc2lvbi5wbSx2IDEuMTIgMjAxMC8wOS8wMiAyMjoxODo0MiBkeiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50VGlja2V0RGVjaXNpb247Cgp1c2UgYmFzZSBxdyggS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldEFjdGlvbkNvbW1vbiApOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMiAkKSBbMV07CgoxOwo=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0RW1haWwucG0gLSB0byBjb21wb3NlIGluaXRpYWwgZW1haWwgdG8gY3VzdG9tZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0RW1haWwucG0sdiAxLjI2IDIwMTEvMDEvMTIgMTY6Mzk6MjIgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0RW1haWwucG0sdiAxLjE2MSAyMDExLzAxLzA2IDEwOjQ1OjE5IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRFbWFpbDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgTWFpbDo6QWRkcmVzczsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJUEFsbG9jYXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAkU2VsZi0+e0RlYnVnfSA9ICRQYXJhbXtEZWJ1Z30gfHwgMDsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntTeXN0ZW1BZGRyZXNzfSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3MtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0hUTUxVdGlsc09iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6SFRNTFV0aWxzLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdC0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJE91dHB1dDsKCiAgICAjIHN0b3JlIGxhc3QgcXVldWUgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSAhfiAvQWN0aW9uPUFnZW50VGlja2V0RW1haWwvICkgewogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuT3ZlcnZpZXcnLAogICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlbGYtPntSZXF1ZXN0ZWRVUkx9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcGFyYW1zCiAgICBteSAlR2V0UGFyYW07CiAgICBmb3IgbXkgJEtleSAoCiAgICAgICAgcXcoWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUgVG8gQ2MgQmNjIFRpbWVVbml0cyBQcmlvcml0eUlEIFN1YmplY3QgQm9keQogICAgICAgIFR5cGVJRCBTZXJ2aWNlSUQgU0xBSUQgT3duZXJBbGwgUmVzcG9uc2libGVBbGwKICAgICAgICBOZXdSZXNwb25zaWJsZUlEIE5ld1VzZXJJRAogICAgICAgIE5leHRTdGF0ZUlECiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdUaWNrZXRGcmVlVGV4dDE0Jyk7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdQcmlvcml0eVJDJyk7CiAgICAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdFbGVtZW50Q2hhbmdlZCcpIHx8ICcnOwoKICAgICMgY2hlY2sgaWYgcHJpb3JpdHkgbmVlZHMgdG8gYmUgcmVjYWxjdWxhdGVkCiAgICBpZiAoICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJwogICAgICAgIHx8ICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnCiAgICApIHsKICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgfQoKICAgIG15ICVTZXJ2aWNlOwogICAgbXkgJEltcGFjdExpc3QgPSB7fTsKICAgICRJbXBhY3RMaXN0LT57Jyd9ID0gJy0nOwogICAgaWYgKCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGltcGFjdCBsaXN0CiAgICAgICAgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpJbXBhY3QnLAogICAgICAgICk7CgogICAgICAgICMgcmVjYWxjdWxhdGUgaW1wYWN0IGlmIGltcGFjdCBpcyBub3Qgc2V0IHVudGlsIG5vdwogICAgICAgIGlmICggISRHZXRQYXJhbXtJbXBhY3RJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkRGVmYXVsdFNlbGVjdGlvbiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXRGcmVlVGV4dDE0OjpEZWZhdWx0U2VsZWN0aW9uJyk7CgogICAgICAgICAgICAjIGdldCBkZWZhdWx0IGltcGFjdCBpZAogICAgICAgICAgICBteSAlSW1wYWN0TGlzdFJldmVyc2UgPSByZXZlcnNlICV7JEltcGFjdExpc3R9OwogICAgICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ICAgPSAkSW1wYWN0TGlzdFJldmVyc2V7JERlZmF1bHRTZWxlY3Rpb259OwogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICkgewoKICAgICAgICAgICAgIyBnZXQgcHJpb3JpdHkKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fSA9ICRTZWxmLT57Q0lQQWxsb2NhdGVPYmplY3R9LT5Qcmlvcml0eUFsbG9jYXRpb25HZXQoCiAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgICAgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlEfSA9ICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICAgICAgfQogICAgfQojIC0tLQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVGV4dCA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVGV4dH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRUZXh0ICk7CiAgICB9CgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGltZSBwYXJhbXMKICAgIGZvciBteSAkTnVtYmVyICggMSAuLiA2ICkgewogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJE51bWJlciAuICRUeXBlIH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oCiAgICAgICAgICAgICAgICBQYXJhbSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJE51bWJlciAuICRUeXBlLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkTnVtYmVyIC4gJ09wdGlvbmFsJyB9CiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICROdW1iZXIgKSB8fCAwOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVPcHRpb25hbCcgLiAkTnVtYmVyICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICROdW1iZXIgLiAnVXNlZCcgfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyROdW1iZXJ9ID09IDIgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICROdW1iZXIgLiAnUmVxdWlyZWQnIH0gPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhcnRpY2xlIGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgbXkgJEtleSAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRUZXh0ID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJEtleSApOwogICAgICAgICRHZXRQYXJhbXskVGV4dH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRUZXh0ICk7CiAgICB9CgogICAgIyB0cmFuc2Zvcm0gcGVuZGluZyB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBpZiAoCiAgICAgICAgZGVmaW5lZCAkR2V0UGFyYW17WWVhcn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNb250aH0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtEYXl9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17SG91cn0KICAgICAgICAmJiBkZWZpbmVkICRHZXRQYXJhbXtNaW51dGV9CiAgICAgICAgKQogICAgewogICAgICAgICVHZXRQYXJhbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0cmFuc2Zvcm0gZnJlZSB0aW1lLCB0aW1lIHN0YW1wIGJhc2VkIG9uIHVzZXIgdGltZSB6b25lCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIG15ICRQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50OwogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ1llYXInIH07CiAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH07CiAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnRGF5JyB9OwogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH07CiAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9OwogICAgICAgICVHZXRQYXJhbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJFByZWZpeAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICMgaWYgdGhlcmUgaXMgbm8gdGlja2V0IGlkIQogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9IHx8ICggJFNlbGYtPntUaWNrZXRJRH0gJiYgJFNlbGYtPntTdWJhY3Rpb259IGVxICdDcmVhdGVkJyApICkgewoKICAgICAgICAgICAgIyBub3RpZnkgaW5mbwogICAgICAgICAgICBpZiAoICRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgICAgICAgICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICdUaWNrZXQgIiVzIiBjcmVhdGVkISIsICInIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgICAgIExpbmsgPT4gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPScgLiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHNwbGl0IGFydGljbGUgaWYgZ2l2ZW4KICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb25zCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlRGVmYXVsdDsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlRGVmYXVsdHskS2V5fSA9ICRHZXRQYXJhbXskS2V5fQogICAgICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkS2V5IC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlRGVmYXVsdHskVGV4dH0gPSAkR2V0UGFyYW17JFRleHR9CiAgICAgICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUZXh0IC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dDsKICAgICAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHskVGV4dH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgS2V5IGhhcyB2YWx1ZSAyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGZyZWV0ZXh0ZmllbGQgaXMgcmVxdWlyZWQKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHtSZXF1aXJlZH0tPnskQ291bnR9ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gewogICAgICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlRGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZnJlZSB0aW1lCiAgICAgICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGRlZmF1bHQgc2VsZWN0aW9ucwogICAgICAgICAgICBteSAlQXJ0aWNsZUZyZWVEZWZhdWx0OwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICAgICAgbXkgJEtleSAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFRleHQgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZURlZmF1bHR7JEtleX0gPSAkR2V0UGFyYW17JEtleX0KICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJEtleSAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVEZWZhdWx0eyRUZXh0fSA9ICRHZXRQYXJhbXskVGV4dH0KICAgICAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJFRleHQgLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQ7CiAgICAgICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgICAgICBteSAkS2V5ICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskS2V5fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRUZXh0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgSWYgS2V5IGhhcyB2YWx1ZSAyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIEFydGljbGVGcmVlVGV4dCBpcyByZXF1aXJlZAogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSA9PSAyICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7UmVxdWlyZWR9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgICAgIENvbmZpZyA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgICAgIEFydGljbGUgPT4geyAlR2V0UGFyYW0sICVBcnRpY2xlRnJlZURlZmF1bHQsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxCiAgICAgICAgICAgICAgICAnSEFTSCcKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJUpvYnMKICAgICAgICAgICAgICAgICAgICA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIH07CiAgICAgICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwgKTsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW1ldGVyICk7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5SdW4oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgICAgIG15ICRTdWJqZWN0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdWJqZWN0fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntCb2R5fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgbWFrZSBzdXJlIGJvZHkgaXMgcmljaCB0ZXh0CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRCb2R5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJSaWNoVGV4dCgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEJvZHksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgICAgIFNlcnZpY2VzID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tFbWFpbE5ldygKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgPT4gJFNlbGYtPl9HZXROZXh0U3RhdGVzKCBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSApLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKCBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSApLAogICAgICAgICAgICAgICAgVHlwZXMgICAgICA9PiAkU2VsZi0+X0dldFR5cGVzKCBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSApLAogICAgICAgICAgICAgICAgU2VydmljZXMgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgVXNlcnMgICAgICAgICAgICA9PiAkU2VsZi0+X0dldFVzZXJzKCBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlcnMgPT4gJFNlbGYtPl9HZXRVc2VycyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9ICksCiAgICAgICAgICAgICAgICBGcm9tTGlzdCA9PiAkU2VsZi0+X0dldFRvcyggUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9ICksCiAgICAgICAgICAgICAgICBUbyAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIFN1YmplY3QgID0+ICRTdWJqZWN0LAogICAgICAgICAgICAgICAgQm9keSAgICAgPT4gJEJvZHksCiAgICAgICAgICAgICAgICBDdXN0b21lcklEICAgICAgICA9PiAnJywKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlciAgICAgID0+ICcnLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhICAgICAgPT4ge30sCiAgICAgICAgICAgICAgICBUaW1lVW5pdHNSZXF1aXJlZCA9PiAoCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykKICAgICAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgICAgICA6ICcnCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGltZUhUTUwsCiAgICAgICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIGRlbGl2ZXIgc2lnbmF0dXJlCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2lnbmF0dXJlJyApIHsKICAgICAgICBteSAkUXVldWVJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1F1ZXVlSUQnICk7CiAgICAgICAgaWYgKCAhJFF1ZXVlSUQgKSB7CiAgICAgICAgICAgIG15ICREZXN0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICAgICAgKCRRdWV1ZUlEKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgfQogICAgICAgIG15ICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkUXVldWVJRCB8fCAxICk7CiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlICA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICAkU2lnbmF0dXJlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJFNpZ25hdHVyZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICRNaW1lVHlwZSAuICc7IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgY3JlYXRlIG5ldyB0aWNrZXQgYW5kIGFydGljbGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTdG9yZU5ldycgKSB7CgogICAgICAgIG15ICVFcnJvcjsKICAgICAgICBteSAkTmV4dFN0YXRlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdOZXh0U3RhdGVJRCcgKSB8fCAnJzsKICAgICAgICBteSAlU3RhdGVEYXRhOwogICAgICAgIGlmICgkTmV4dFN0YXRlSUQpIHsKICAgICAgICAgICAgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICROZXh0U3RhdGVJRCwgKTsKICAgICAgICB9CiAgICAgICAgbXkgJE5leHRTdGF0ZSAgICAgICAgPSAkU3RhdGVEYXRhe05hbWV9OwogICAgICAgIG15ICROZXdSZXNwb25zaWJsZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTmV3UmVzcG9uc2libGVJRCcgKSB8fCAnJzsKICAgICAgICBteSAkTmV3VXNlcklEICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05ld1VzZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkRGVzdCAgICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0Rlc3QnICkgfHwgJyc7CiAgICAgICAgbXkgKCAkTmV3UXVldWVJRCwgJEZyb20gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtPd25lckFsbH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgc2VuZGVyIHF1ZXVlIGZyb20KICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCROZXdRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApOwogICAgICAgIH0KICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1ByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlbGVjdGVkQ3VzdG9tZXJVc2VyJyApCiAgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRXhwYW5kQ3VzdG9tZXJOYW1lJyApCiAgICAgICAgICAgIHx8IDA7CiAgICAgICAgJEdldFBhcmFte1F1ZXVlSUR9ICAgICAgICAgICAgPSAkTmV3UXVldWVJRDsKICAgICAgICAkR2V0UGFyYW17RXhwYW5kQ3VzdG9tZXJOYW1lfSA9ICRFeHBhbmRDdXN0b21lck5hbWU7CgogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnT3duZXJBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17T3duZXJBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnUmVzcG9uc2libGVBbGxSZWZyZXNoJyApICkgewogICAgICAgICAgICAkR2V0UGFyYW17UmVzcG9uc2libGVBbGx9ID0gMTsKICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDM7CiAgICAgICAgfQogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQ2xlYXJUbycgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1RvfSA9ICcnOwogICAgICAgICAgICAkRXhwYW5kQ3VzdG9tZXJOYW1lID0gMzsKICAgICAgICB9CiAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDIgKSB7CiAgICAgICAgICAgIG15ICRJdGVtID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiRXhwYW5kQ3VzdG9tZXJOYW1lJE51bWJlciIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICROdW1iZXIgPT0gMSAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE51bWJlciA9PSAyICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJElzVXBsb2FkID0gMDsKCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMyICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0OwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRUZXh0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSWYgS2V5IGhhcyB2YWx1ZSAyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGZyZWV0ZXh0ZmllbGQgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7UmVxdWlyZWR9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVxdWlyZWQgRnJlZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17JFRleHR9IGVxICcnCiAgICAgICAgICAgICAgICAmJiAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDAKICAgICAgICAgICAgICAgICYmICRJc1VwbG9hZCA9PSAwCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRUaWNrZXRGcmVlVGV4dHtFcnJvcn0tPnskQ291bnR9ID0gMTsKICAgICAgICAgICAgICAgICRFcnJvcnskVGV4dH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSwgKTsKCiAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQ7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JFRleHR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBJZiBLZXkgaGFzIHZhbHVlIDIsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZmllbGQgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSA9PSAyICkgewogICAgICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHtSZXF1aXJlZH0tPnskQ291bnR9ID0gMTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayByZXF1aXJlZCBBcnRpY2xlVGV4dEZpZWxkIChpZiBjb25maWd1cmVkKQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fSA9PSAyCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17JFRleHR9IGVxICcnCiAgICAgICAgICAgICAgICAmJiAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDAKICAgICAgICAgICAgICAgICYmICRJc1VwbG9hZCA9PSAwCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7RXJyb3J9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3J7JFRleHR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAlQXJ0aWNsZUZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VGlja2V0QXJ0aWNsZUZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBFeHBhbmQgQ3VzdG9tZXIgTmFtZQogICAgICAgIG15ICVDdXN0b21lclVzZXJEYXRhOwogICAgICAgIGlmICggJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAxICkgewoKICAgICAgICAgICAgIyBzZWFyY2ggY3VzdG9tZXIKICAgICAgICAgICAgbXkgJUN1c3RvbWVyVXNlckxpc3Q7CiAgICAgICAgICAgICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBqdXN0IG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cwogICAgICAgICAgICAjIGlmIGp1c3Qgb25lLCBmaWxsdXAgQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPSAwOwogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcktleSAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSsrOwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fSAgICAgPSAkQ3VzdG9tZXJVc2VyTGlzdHskQ3VzdG9tZXJVc2VyS2V5fTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJEN1c3RvbWVyVXNlcktleTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ICAgICAgICAgICAgICA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoIEtleSA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsIFZhbHVlID0+IDAgKTsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17VG9PcHRpb25zfSA9IFwlQ3VzdG9tZXJVc2VyTGlzdDsKCiAgICAgICAgICAgICAgICAjIGNsZWFyIHRvIGlmIHRoZXJlIGlzIG5vIGN1c3RvbWVyIGZvdW5kCiAgICAgICAgICAgICAgICBpZiAoICElQ3VzdG9tZXJVc2VyTGlzdCApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlcktleSAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17VG99ID0gJEN1c3RvbWVyVXNlckxpc3R7JEN1c3RvbWVyVXNlcktleX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJJRCA9ICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGEgbmV3IGRlc3RpbmF0aW9uIHF1ZXVlIGlzIHNlbGVjdGVkCiAgICAgICAgZWxzaWYgKCAkRXhwYW5kQ3VzdG9tZXJOYW1lID09IDMgKSB7CiAgICAgICAgICAgICRFcnJvcntOb1N1Ym1pdH0gPSAxOwogICAgICAgICAgICAkQ3VzdG9tZXJVc2VyID0gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb0NvbXBvc2UnKSApIHsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciApIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCRDdXN0b21lcklEKSB7CiAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAocXcoVG8gQ2MgQmNjKSkgewogICAgICAgICAgICBuZXh0IGlmICEkR2V0UGFyYW17JFBhcmFtZXRlcn07CiAgICAgICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFteyRQYXJhbWV0ZXJ9ICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NoZWNrSXRlbU9iamVjdH0tPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEVtYWlsLT5hZGRyZXNzKCkgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7ICRQYXJhbWV0ZXIgLiAnRXJyb3JUeXBlJyB9CiAgICAgICAgICAgICAgICAgICAgICAgID0gJFBhcmFtZXRlcgogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKQogICAgICAgICAgICAgICAgICAgICAgICAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeyAkUGFyYW1ldGVyIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIG5vdCBhIHN1YmFjdGlvbiBhYm91dCBhdHRhY2htZW50cywgY2hlY2sgZm9yIHNlcnZlciBlcnJvcnMKICAgICAgICBpZiAoICEkSXNVcGxvYWQgJiYgISRFeHBhbmRDdXN0b21lck5hbWUgKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtUb30gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RvSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1N1YmplY3RJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISROZXdRdWV1ZUlEICkgewogICAgICAgICAgICAgICAgJEVycm9yeydEZXN0aW5hdGlvbkludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0JvZHl9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBpZiBkYXRlIGlzIHZhbGlkCiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gJiYgJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICAgICAgPCAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSAmJiAhJEdldFBhcmFte1R5cGVJRH0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1R5cGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmVlZEFjY291bnRlZFRpbWUnKQogICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJEdldFBhcmFte1RpbWVVbml0c30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJ1biBjb21wb3NlIG1vZHVsZXMKICAgICAgICBteSAlQXJ0aWNsZVBhcmFtOwogICAgICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRKb2JzeyRKb2J9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgRGVidWcgPT4gJFNlbGYtPntEZWJ1Z30sICk7CgogICAgICAgICAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgICAgICAgICBmb3IgbXkgJFBhcmFtZXRlciAoICRPYmplY3QtPk9wdGlvbiggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFBhcmFtZXRlcn0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbWV0ZXIgKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgICRPYmplY3QtPlJ1biggJUdldFBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgICAgICAjIHRpY2tldCBwYXJhbXMKICAgICAgICAgICAgICAgICVBcnRpY2xlUGFyYW0gPSAoCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAkT2JqZWN0LT5BcnRpY2xlT3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBlcnJvcnMKICAgICAgICAgICAgICAgICVFcnJvciA9ICgKICAgICAgICAgICAgICAgICAgICAlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgJE9iamVjdC0+RXJyb3IoICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdldCBzZXJ2aWNlcwogICAgICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJlc2V0IHByZXZpb3VzIFNlcnZpY2VJRCB0byByZXNldCBTTEEtTGlzdCBpZiBubyBzZXJ2aWNlIGlzIHNlbGVjdGVkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtTZXJ2aWNlSUR9IHx8ICEkU2VydmljZXMtPnsgJEdldFBhcmFte1NlcnZpY2VJRH0gfSApIHsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXtTZXJ2aWNlSUR9ID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgaGVhZGVyCiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgICAgICMgaHRtbCBvdXRwdXQKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2tFbWFpbE5ldygKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJzICAgPT4gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9CiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgVXNlclNlbGVjdGVkICAgICA9PiAkTmV3VXNlcklELAogICAgICAgICAgICAgICAgUmVzcG9uc2libGVVc2VycyA9PiAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICROZXdRdWV1ZUlELAogICAgICAgICAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0KICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJTZWxlY3RlZCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCAgIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICA9PiAkTmV4dFN0YXRlLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUeXBlcyA9PiAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICROZXdRdWV1ZUlEICAgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgICAgICAgICBTTEFzICAgICAgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyICAgICAgPT4gJEN1c3RvbWVyVXNlciwKICAgICAgICAgICAgICAgIEN1c3RvbWVyRGF0YSAgICAgID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIEZyb21MaXN0ICAgICA9PiAkU2VsZi0+X0dldFRvcygpLAogICAgICAgICAgICAgICAgRnJvbVNlbGVjdGVkID0+ICREZXN0LAogICAgICAgICAgICAgICAgVG9PcHRpb25zICAgID0+ICRQYXJhbXtUb09wdGlvbnN9LAogICAgICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkR2V0UGFyYW17U3ViamVjdH0gKSwKICAgICAgICAgICAgICAgIEJvZHkgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJEdldFBhcmFte0JvZHl9ICksCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgICAgPT4gXCVFcnJvciwKICAgICAgICAgICAgICAgIEF0dGFjaG1lbnRzICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgU2lnbmF0dXJlICAgID0+ICRTaWduYXR1cmUsCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZvb3RlcigpOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgY3JlYXRlIG5ldyB0aWNrZXQsIGRvIGRiIGluc2VydAogICAgICAgIG15ICRUaWNrZXRJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0Q3JlYXRlKAogICAgICAgICAgICBUaXRsZSAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIExvY2sgICAgICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgVHlwZUlEICAgICAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBTZXJ2aWNlSUQgICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFNMQUlEICAgICAgICA9PiAkR2V0UGFyYW17U0xBSUR9LAogICAgICAgICAgICBTdGF0ZUlEICAgICAgPT4gJE5leHRTdGF0ZUlELAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17JFRleHR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAxNCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgICAgICBteSAkUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudDsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnWWVhcicgfTsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH07CiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ0RheScgfTsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnSG91cicgfTsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9OwoKICAgICAgICAgICAgIyBzZXQgdGltZSBzdGFtcCB0byBOVUxMIGlmIGZpZWxkIGlzIG5vdCB1c2VkL2NoZWNrZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkUHJlZml4IC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAgID0gMDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSAgPSAwOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQcmVmaXggLiAnSG91cicgfSAgID0gMDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUaW1lU2V0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgUHJlZml4ICAgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IHByZSBsb2FkZWQgYXR0YWNobWVudAogICAgICAgIEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ0ZpbGVVcGxvYWQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgKTsKICAgICAgICBpZiAoJVVwbG9hZFN0dWZmKSB7CiAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgIH0KCiAgICAgICAgIyBwcmVwYXJlIHN1YmplY3QKICAgICAgICBteSAkVG4gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE51bWJlckxvb2t1cCggVGlja2V0SUQgPT4gJFRpY2tldElEICk7CiAgICAgICAgJEdldFBhcmFte1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0QnVpbGQoCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkVG4sCiAgICAgICAgICAgIFN1YmplY3QgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnTmV3JywKICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIGlmIG5ldyBvd25lciBpcyBnaXZlbiAodGhlbiBzZW5kIG5vIGFnZW50IG5vdGlmeSkKICAgICAgICBteSAkTm9BZ2VudE5vdGlmeSA9IDA7CiAgICAgICAgaWYgKCROZXdVc2VySUQpIHsKICAgICAgICAgICAgJE5vQWdlbnROb3RpZnkgPSAxOwogICAgICAgIH0KCiAgICAgICAgbXkgJE1pbWVUeXBlID0gJ3RleHQvcGxhaW4nOwogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSAuPSAnPGJyLz48YnIvPicgLiAkU2lnbmF0dXJlOwoKICAgICAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgkQ29udGVudElEKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudHMgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSAuPSAiXG5cbiIgLiAkU2lnbmF0dXJlOwogICAgICAgIH0KCiAgICAgICAgIyBsb29rdXAgc2VuZGVyCiAgICAgICAgbXkgJFRlbXBsYXRlR2VuZXJhdG9yID0gS2VybmVsOjpTeXN0ZW06OlRlbXBsYXRlR2VuZXJhdG9yLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAgICAgbXkgJFNlbmRlciAgICAgICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TZW5kZXIoCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2VuZCBlbWFpbAogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVTZW5kKAogICAgICAgICAgICBOb0FnZW50Tm90aWZ5ICA9PiAkTm9BZ2VudE5vdGlmeSwKICAgICAgICAgICAgQXR0YWNobWVudCAgICAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlVHlwZX0sCiAgICAgICAgICAgIFNlbmRlclR5cGUgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NlbmRlclR5cGV9LAogICAgICAgICAgICBGcm9tICAgICAgICAgICA9PiAkU2VuZGVyLAogICAgICAgICAgICBUbyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17VG99LAogICAgICAgICAgICBDYyAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Q2N9LAogICAgICAgICAgICBCY2MgICAgICAgICAgICA9PiAkR2V0UGFyYW17QmNjfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgICAgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICBCb2R5ICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIENoYXJzZXQgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgTWltZVR5cGUgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeUNvbW1lbnR9CiAgICAgICAgICAgICAgICB8fCAiXCVcJSRHZXRQYXJhbXtUb30sICRHZXRQYXJhbXtDY30sICRHZXRQYXJhbXtCY2N9IiwKICAgICAgICAgICAgJUFydGljbGVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyRUZXh0fSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUtc3VibWl0dGVkIGF0dGFjaG1lbnRzCiAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZSggRm9ybUlEID0+ICRTZWxmLT57Rm9ybUlEfSApOwoKICAgICAgICAjIHNldCBvd25lciAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCROZXdVc2VySUQpIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJE5ld1VzZXJJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBsb2NrCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZWxzZSBzZXQgb3duZXIgdG8gY3VycmVudCBhZ2VudCBidXQgZG8gbm90IGxvY2sgaXQKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgU2VuZE5vTm90aWZpY2F0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcmVzcG9uc2libGUgKGlmIG5ldyB1c2VyIGlkIGlzIGdpdmVuKQogICAgICAgIGlmICgkTmV3UmVzcG9uc2libGVJRCkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkTmV3UmVzcG9uc2libGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHRpbWUgYWNjb3VudGluZwogICAgICAgIGlmICggJEdldFBhcmFte1RpbWVVbml0c30gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBUaW1lVW5pdCAgPT4gJEdldFBhcmFte1RpbWVVbml0c30sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG91bGQgaSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBvcmFyaWx5IGxpbmtzCiAgICAgICAgICAgIG15ICRUZW1wTGlua0xpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJ1RlbXBvcmFyeScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVGVtcExpbmtMaXN0ICYmIHJlZiAkVGVtcExpbmtMaXN0IGVxICdIQVNIJyAmJiAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0T3JnICgga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0S2V5T3JnICgga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBnZXQgcmVkaXJlY3Qgc2NyZWVuCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVOZXh0TWFza30gfHwgJ0FnZW50VGlja2V0RW1haWwnOwoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47U3ViYWN0aW9uPUNyZWF0ZWQ7VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICREZXN0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJVc2VyID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnU2VsZWN0ZWRDdXN0b21lclVzZXInICk7CgogICAgICAgICMgZ2V0IEZyb20gYmFzZWQgb24gc2VsZWN0ZWQgcXVldWUKICAgICAgICBteSAkUXVldWVJRCA9ICcnOwogICAgICAgIGlmICggJERlc3QgPX4gL14oXGR7MSwxMDB9KVx8XHwuKz8kLyApIHsKICAgICAgICAgICAgJFF1ZXVlSUQgPSAkMTsKICAgICAgICAgICAgbXkgJVF1ZXVlID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFN5c3RlbUFkZHJlc3MoIFF1ZXVlSUQgPT4gJFF1ZXVlSUQgKTsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJFF1ZXVle0VtYWlsfTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGxpc3QgdHlwZQogICAgICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgICAgICRUcmVlVmlldyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkU2lnbmF0dXJlID0gJyc7CiAgICAgICAgaWYgKCRRdWV1ZUlEKSB7CiAgICAgICAgICAgICRTaWduYXR1cmUgPSAkU2VsZi0+X0dldFNpZ25hdHVyZSggUXVldWVJRCA9PiAkUXVldWVJRCApOwogICAgICAgIH0KICAgICAgICBteSAkVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte093bmVyQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICRSZXNwb25zaWJsZVVzZXJzID0gJFNlbGYtPl9HZXRVc2VycygKICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtSZXNwb25zaWJsZUFsbH0sCiAgICAgICAgKTsKICAgICAgICBteSAkTmV4dFN0YXRlcyA9ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkUHJpb3JpdGllcyA9ICRTZWxmLT5fR2V0UHJpb3JpdGllcygKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCAgICAgIHx8IDEsCiAgICAgICAgKTsKICAgICAgICBteSAkU2VydmljZXMgPSAkU2VsZi0+X0dldFNlcnZpY2VzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTTEFzID0gJFNlbGYtPl9HZXRTTEFzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15IEBFeHRlbmRlZERhdGE7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgICAgIG15ICRLZXkgICAgICAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ICAgICAgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICBteSAkQ29uZmlnS2V5ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnS2V5KSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnS2V5LAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRDb25maWdWYWx1ZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJFF1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdWYWx1ZSkgewogICAgICAgICAgICAgICAgcHVzaCgKICAgICAgICAgICAgICAgICAgICBARXh0ZW5kZWREYXRhLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyRUZXh0fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgcnVuIGNvbXBvc2UgbW9kdWxlcwogICAgICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlQ29tcG9zZU1vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUNvbXBvc2VNb2R1bGUnKSB9OwogICAgICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgICAgICBuZXh0IGlmICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKTsKCiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoICV7JFNlbGZ9LCBEZWJ1ZyA9PiAkU2VsZi0+e0RlYnVnfSwgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBwYXJhbXMKICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJE9iamVjdC0+T3B0aW9uKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskUGFyYW1ldGVyfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFtZXRlciApOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICAgICAgbXkgJURhdGEgPSAkT2JqZWN0LT5EYXRhKCAlR2V0UGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgICAgIG15ICRLZXkgPSAkT2JqZWN0LT5PcHRpb24oICVHZXRQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgICAgICAgICBpZiAoJEtleSkgewogICAgICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17JEtleX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjb252ZXJ0IFNpZ25hdHVyZSB0byBBU0NJSSwgaWYgUmljaFRleHQgaXMgb24KICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CgogICAgICAgICAgICAjICAgICAgICAgICAgJFNpZ25hdHVyZSA9ICRTZWxmLT57SFRNTFV0aWxzT2JqZWN0fS0+VG9Bc2NpaSggU3RyaW5nID0+ICRTaWduYXR1cmUsICk7CiAgICAgICAgfQoKICAgICAgICBteSAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb25KU09OKAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTaWduYXR1cmUnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU2lnbmF0dXJlLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFVzZXJzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17TmV3VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUmVzcG9uc2libGVVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdOZXh0U3RhdGVJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJE5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte05leHRTdGF0ZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAwLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAojIC0tLQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmlvcml0eUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkUHJpb3JpdGllcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU2VydmljZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkU0xBcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIEBFeHRlbmRlZERhdGEsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFN1YmFjdGlvbiEhJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yJywKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRHcm91cE1lbWJlcktleSAoIGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkR3JvdXBNZW1iZXJLZXkgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skR3JvdXBNZW1iZXJLZXl9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgc2hvdyB1c2VycwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAlU2hvd25Vc2VycyA9ICVBbGxHcm91cHNNZW1iZXJzOwogICAgfQoKICAgICMgc2hvdyBhbGwgdXNlcnMgd2hvIGFyZSBydyBpbiB0aGUgcXVldWUgZ3JvdXAKICAgIGVsc2lmICggJFBhcmFte1F1ZXVlSUR9ICkgewogICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRQYXJhbXtRdWV1ZUlEfSApOwogICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICBUeXBlICAgID0+ICdydycsCiAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRNZW1iZXJLZXkgKCBrZXlzICVNZW1iZXJMaXN0ICkgewogICAgICAgICAgICBpZiAoICRBbGxHcm91cHNNZW1iZXJzeyRNZW1iZXJLZXl9ICkgewogICAgICAgICAgICAgICAgJFNob3duVXNlcnN7JE1lbWJlcktleX0gPSAkQWxsR3JvdXBzTWVtYmVyc3skTWVtYmVyS2V5fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcJVNob3duVXNlcnM7Cn0KCnN1YiBfR2V0UHJpb3JpdGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHByaW9yaXR5CiAgICBteSAlUHJpb3JpdGllczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVByaW9yaXRpZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFByaW9yaXR5TGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVQcmlvcml0aWVzOwp9CgpzdWIgX0dldFR5cGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdHlwZQogICAgbXkgJVR5cGU7CiAgICBpZiAoICRQYXJhbXtRdWV1ZUlEfSB8fCAkUGFyYW17VGlja2V0SUR9ICkgewogICAgICAgICVUeXBlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVUeXBlOwp9CgpzdWIgX0dldFNlcnZpY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgc2VydmljZQogICAgbXkgJVNlcnZpY2U7CiAgICBpZiAoICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSAmJiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVTZXJ2aWNlOwp9CgpzdWIgX0dldFNMQXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzbGEKICAgIG15ICVTTEE7CiAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICYmICRQYXJhbXtTZXJ2aWNlc30gJiYgJXsgJFBhcmFte1NlcnZpY2VzfSB9ICkgewogICAgICAgIGlmICggJFBhcmFte1NlcnZpY2VzfS0+eyAkUGFyYW17U2VydmljZUlEfSB9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU0xBOwp9CgpzdWIgX0dldFRvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgb3duIHNlbGVjdGlvbgogICAgbXkgJU5ld1RvczsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJU5ld1RvcyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZU93blNlbGVjdGlvbicpIH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBTZWxlY3Rpb25UeXBlIFF1ZXVlIG9yIFN5c3RlbUFkZHJlc3M/CiAgICAgICAgbXkgJVRvczsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Nb3ZlTGlzdCgKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJVRvcyA9ICRTZWxmLT57REJPYmplY3R9LT5HZXRUYWJsZURhdGEoCiAgICAgICAgICAgICAgICBUYWJsZSA9PiAnc3lzdGVtX2FkZHJlc3MnLAogICAgICAgICAgICAgICAgV2hhdCAgPT4gJ3F1ZXVlX2lkLCBpZCcsCiAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgQ2xhbXAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGNyZWF0ZSBwZXJtaXNzaW9uIHF1ZXVlcwogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgVHlwZSAgID0+ICdjcmVhdGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgc2VsZWN0aW9uIHN0cmluZwogICAgICAgIGZvciBteSAkUXVldWVJRCAoIGtleXMgJVRvcyApIHsKICAgICAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCggSUQgPT4gJFF1ZXVlSUQgKTsKCiAgICAgICAgICAgICMgcGVybWlzc2lvbiBjaGVjaywgY2FuIHdlIGNyZWF0ZSBuZXcgdGlja2V0cyBpbiBxdWV1ZQogICAgICAgICAgICBuZXh0IGlmICEkVXNlckdyb3Vwc3sgJFF1ZXVlRGF0YXtHcm91cElEfSB9OwoKICAgICAgICAgICAgbXkgJFN0cmluZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblN0cmluZycpCiAgICAgICAgICAgICAgICB8fCAnPFJlYWxuYW1lPiA8PEVtYWlsPj4gLSBRdWV1ZTogPFF1ZXVlPic7CiAgICAgICAgICAgICRTdHJpbmcgPX4gcy88UXVldWU+LyRRdWV1ZURhdGF7TmFtZX0vZzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZUNvbW1lbnQ+LyRRdWV1ZURhdGF7Q29tbWVudH0vZzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVTZWxlY3Rpb25UeXBlJykgbmUgJ1F1ZXVlJyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG15ICVTeXN0ZW1BZGRyZXNzRGF0YSA9ICRTZWxmLT57U3lzdGVtQWRkcmVzc30tPlN5c3RlbUFkZHJlc3NHZXQoCiAgICAgICAgICAgICAgICAgICAgSUQgPT4gJFRvc3skUXVldWVJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxSZWFsbmFtZT4vJFN5c3RlbUFkZHJlc3NEYXRhe1JlYWxuYW1lfS9nOwogICAgICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxFbWFpbD4vJFN5c3RlbUFkZHJlc3NEYXRhe05hbWV9L2c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJE5ld1Rvc3skUXVldWVJRH0gPSAkU3RyaW5nOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBlbXB0eSBzZWxlY3Rpb24KICAgICROZXdUb3N7Jyd9ID0gJy0nOwogICAgcmV0dXJuIFwlTmV3VG9zOwp9CgpzdWIgX0dldFNpZ25hdHVyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgcHJlcGFyZSBzaWduYXR1cmUKICAgIG15ICRUZW1wbGF0ZUdlbmVyYXRvciA9IEtlcm5lbDo6U3lzdGVtOjpUZW1wbGF0ZUdlbmVyYXRvci0+bmV3KCAleyRTZWxmfSApOwogICAgbXkgJFNpZ25hdHVyZSAgICAgICAgID0gJFRlbXBsYXRlR2VuZXJhdG9yLT5TaWduYXR1cmUoCiAgICAgICAgUXVldWVJRCA9PiAkUGFyYW17UXVldWVJRH0sCiAgICAgICAgRGF0YSAgICA9PiBcJVBhcmFtLAogICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFNpZ25hdHVyZTsKfQoKc3ViIF9NYXNrRW1haWxOZXcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkUGFyYW17Rm9ybUlEfSA9ICRTZWxmLT57Rm9ybUlEfTsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQoKICAgICMgYnVpbGQgY3VzdG9tZXIgc2VhcmNoIGF1dG9jb21wbGV0ZSBmaWVsZAogICAgbXkgJEF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJyk7CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyU2VhcmNoQXV0b0NvbXBsZXRlJywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfSwKICAgICAgICAgICAgbWluUXVlcnlMZW5ndGggICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9IHx8IDIsCiAgICAgICAgICAgIHF1ZXJ5RGVsYXkgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1F1ZXJ5RGVsYXl9IHx8IDAuMSwKICAgICAgICAgICAgdHlwZUFoZWFkICAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57VHlwZUFoZWFkfSB8fCAnZmFsc2UnLAogICAgICAgICAgICBtYXhSZXN1bHRzRGlzcGxheWVkID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNYXhSZXN1bHRzRGlzcGxheWVkfSB8fCAyMCwKICAgICAgICB9LAogICAgKTsKCiAgICAjIGJ1aWxkIHN0cmluZwogICAgJFBhcmFte1VzZXJzfS0+eycnfSA9ICctJzsKICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17VXNlcnN9LAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1VzZXJTZWxlY3RlZH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICk7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17TmV4dFN0YXRlfSB8fCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIGZyb20gc3RyaW5nCgogICAgaWYgKCAkUGFyYW17VG9PcHRpb25zfSAmJiAleyAkUGFyYW17VG9PcHRpb25zfSB9ICkgewogICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gJFBhcmFte1RvT3B0aW9uc30sCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIE1heCAgPT4gNzAsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VyU3RyZ30gbmUgIiIgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1Rha2VDdXN0b21lckJ1dHRvbicsICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdG8gc3RyaW5nCiAgICBteSAlTmV3VG87CiAgICBpZiAoICRQYXJhbXtGcm9tTGlzdH0gKSB7CiAgICAgICAgZm9yIG15ICRGcm9tS2V5ICgga2V5cyAleyAkUGFyYW17RnJvbUxpc3R9IH0gKSB7CiAgICAgICAgICAgICROZXdUb3siJEZyb21LZXl8fCRQYXJhbXtGcm9tTGlzdH0tPnskRnJvbUtleX0ifSA9ICRQYXJhbXtGcm9tTGlzdH0tPnskRnJvbUtleX07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICAgID0+IFwlTmV3VG8sCiAgICAgICAgICAgIE11bHRpcGxlICAgICAgID0+IDAsCiAgICAgICAgICAgIFNpemUgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57RGVzdGluYXRpb25JbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17RnJvbVNlbGVjdGVkfSwKICAgICAgICAgICAgT25DaGFuZ2VTdWJtaXQgPT4gMCwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte0Zyb21TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgQ2xhc3MgICAgICA9PiAnVmFsaWRhdGVfUmVxdWlyZWQnIC4gJFBhcmFte0Vycm9yc30tPntEZXN0aW5hdGlvbkludmFsaWR9IHx8ICcgJywKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnRGVzdCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0Zyb21TZWxlY3RlZH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtDdXN0b21lckRhdGF9LAogICAgICAgICAgICBNYXggID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkRXJyb3JLZXkgKCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskRXJyb3JLZXl9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkUGFyYW17RXJyb3JzfS0+eyRFcnJvcktleX0gKTsKICAgICAgICB9CgogICAgICAgICMgZGlzcGxheSBzZXJ2ZXIgZXJyb3IgbXNnIGFjY29yZGluZyB3aXRoIHRoZSBvY2N1cnJlZCBlbWFpbCAoY2Mgb3IgYmNjKSBlcnJvciB0eXBlCiAgICAgICAgZm9yIG15ICRQYXJhbWV0ZXIgKHF3KENjIEJjYykpIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17RXJyb3JzfS0+eyAkUGFyYW1ldGVyIC4gJ0Vycm9yVHlwZScgfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fQogICAgICAgICAgICAgICAgICAgIC0+QmxvY2soIE5hbWUgPT4gJFBhcmFte0Vycm9yc30tPnsgJFBhcmFtZXRlciAuICdFcnJvclR5cGUnIH0gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIGRpc3BsYXkgc2VydmVyIGVycm9yIG1zZyBhY2NvcmRpbmcgd2l0aCB0aGUgb2NjdXJyZWQgZW1haWwgKHRvKSBlcnJvciB0eXBlCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICYmICRQYXJhbXtFcnJvcnN9LT57VG9FcnJvclR5cGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJFBhcmFte0Vycm9yc30tPntUb0Vycm9yVHlwZX0gKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1RvR2VuZXJpY1NlcnZlckVycm9yTXNnJyApOwogICAgfQoKICAgICMgYnVpbGQgdHlwZSBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRQYXJhbXtUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1R5cGVzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJyAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17VHlwZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBzZXJ2aWNlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CiAgICAgICAgJFBhcmFte1NlcnZpY2VTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U2VydmljZXN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e1NlcnZpY2VJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1NMQVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtTTEFzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0U0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KCiAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAkUGFyYW17J0ltcGFjdFN0cmcnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiAkUGFyYW17SW1wYWN0c30sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVGlja2V0RnJlZVRleHQxNCcsCiAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17SW1wYWN0SUR9LAogICAgICAgIE9uQ2hhbmdlICAgPT4gImRvY3VtZW50LmNvbXBvc2UuRXhwYW5kQ3VzdG9tZXJOYW1lLnZhbHVlPSczJzsgIgogICAgICAgICAgICAuICJkb2N1bWVudC5jb21wb3NlLlByaW9yaXR5UkMudmFsdWU9JzEnOyBkb2N1bWVudC5jb21wb3NlLnN1Ym1pdCgpOyByZXR1cm4gZmFsc2U7IiwKICAgICAgICBBamF4ICAgICAgID0+IHsKICAgICAgICAgICAgVXBkYXRlID0+IFsKICAgICAgICAgICAgICAgICdQcmlvcml0eUlEJywKICAgICAgICAgICAgXSwKICAgICAgICAgICAgRGVwZW5kID0+IFsKICAgICAgICAgICAgICAgICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBdLAogICAgICAgICAgICBTdWJhY3Rpb24gPT4gJ0FKQVhVcGRhdGUnLAogICAgICAgIH0sCiAgICApOwogICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eUlEfSA9ICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH07CiAgICB9CiMgLS0tCgogICAgIyBidWlsZCBwcmlvcml0eSBzdHJpbmcKICAgIGlmICggISRQYXJhbXtQcmlvcml0eUlEfSApIHsKICAgICAgICAkUGFyYW17UHJpb3JpdHl9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9OwogICAgfQogICAgJFBhcmFte1ByaW9yaXR5U3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte1ByaW9yaXRpZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ1ByaW9yaXR5SUQnLAogICAgICAgIFNlbGVjdGVkSUQgICAgPT4gJFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgIFNlbGVjdGVkVmFsdWUgPT4gJFBhcmFte1ByaW9yaXR5fSwKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICApOwoKICAgICMgcGVuZGluZyBkYXRhIHN0cmluZwogICAgJFBhcmFte1BlbmRpbmdEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICVQYXJhbSwKICAgICAgICBGb3JtYXQgICAgICAgICAgID0+ICdEYXRlSW5wdXRGb3JtYXRMb25nJywKICAgICAgICBZZWFyUGVyaW9kUGFzdCAgID0+IDAsCiAgICAgICAgWWVhclBlcmlvZEZ1dHVyZSA9PiA1LAogICAgICAgIERpZmZUaW1lICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpIHx8IDAsCiAgICAgICAgQ2xhc3MgICAgICAgICAgICA9PiAkUGFyYW17RXJyb3JzfS0+e0RhdGVJbnZhbGlkfSB8fCAnICcsCiAgICAgICAgVmFsaWRhdGUgICAgICAgICA9PiAxLAogICAgICAgIFZhbGlkYXRlRGF0ZUluRnV0dXJlID0+IDEsCiAgICApOwoKICAgICMgc2hvdyBvd25lciBzZWxlY3Rpb24KICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld093bmVyU2VsZWN0aW9uJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3duZXJTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgcmVzcG9uc2libGUgc2VsZWN0aW9uCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKQogICAgICAgICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdSZXNwb25zaWJsZVNlbGVjdGlvbicpCiAgICAgICAgKQogICAgewogICAgICAgICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfS0+eycnfSA9ICctJzsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte1Jlc3BvbnNpYmxlVXNlcnN9LAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJTZWxlY3RlZH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ05ld1Jlc3BvbnNpYmxlSUQnLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGVTZWxlY3Rpb24nLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIG5leHQgaWYgISRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICApOwogICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBuZXh0IGlmICEkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGltZX0tPnskQ291bnR9OwojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGZpbmQgdGhlIGh0bWwgc3RyaW5nIGZvciB0aGUgZnJlZSB0aW1lIGZpZWxkIGxhYmVsCiAgICAgICAgaWYgKAogICAgICAgICAgICAkUGFyYW17ICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgfQogICAgICAgICAgICAmJiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgfSA9fiBtewogICAgICAgICAgICAoIDxsYWJlbCAgW148Pl0qID4gICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAoPzogPHNwYW4gW148Pl0qID5cKjwvc3Bhbj4gKT8gKSAgIFxzKgogICAgICAgICAgICAoIFtePD5dKiApICAgICAgICAgICAgICAgICAgICAgICAgIFxzKgogICAgICAgICAgICAoIDwvbGFiZWw+ICkKICAgICAgICB9eG1zICkgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGxhYmVsIGFuZCB0aGUgZW5jbG9zaW5nIGh0bWwgY29kZQogICAgICAgICAgICBteSAkVGFnU3RhcnQgID0gJDE7CiAgICAgICAgICAgIG15ICRMYWJlbFRleHQgPSAkMjsKICAgICAgICAgICAgbXkgJFRhZ0VuZCAgICA9ICQzOwoKICAgICAgICAgICAgIyB0cmFuc2xhdGUgdGhlIGxhYmVsCiAgICAgICAgICAgICRMYWJlbFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJExhYmVsVGV4dCApOwoKICAgICAgICAgICAgIyB3cml0ZSB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgYmFjawogICAgICAgICAgICAkUGFyYW17ICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgfSA9ICRUYWdTdGFydCAuICRMYWJlbFRleHQgLiAkVGFnRW5kOwogICAgICAgIH0KCiMgLS0tCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYXJ0aWNsZSBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZUtleUZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQsIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGltZSBhY2NvdW50aW5nIGJveAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWNjb3VudFRpbWUnKSApIHsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWxNYW5kYXRvcnknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgbXkgJFNob3duT3B0aW9uc0Jsb2NrOwoKICAgICMgc2hvdyBzcGVsbCBjaGVjawogICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyU3BlbGxDaGVja2VyfSApIHsKCiAgICAgICAgIyBjaGVjayBpZiBuZWVkIHRvIGNhbGwgT3B0aW9ucyBibG9jawogICAgICAgIGlmICggISRTaG93bk9wdGlvbnNCbG9jayApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldE9wdGlvbnMnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IGZsYWcgdG8gInRydWUiIGluIG9yZGVyIHRvIHByZXZlbnQgY2FsbGluZyB0aGUgT3B0aW9ucyBibG9jayBhZ2FpbgogICAgICAgICAgICAkU2hvd25PcHRpb25zQmxvY2sgPSAxOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYWRkcmVzcyBib29rIGlmIHRoZSBtb2R1bGUgaXMgcmVnaXN0ZXJlZCBhbmQgamF2YSBzY3JpcHQgc3VwcG9ydCBpcyBhdmFpbGFibGUKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRCb29rfQogICAgICAgICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJKYXZhU2NyaXB0U3VwcG9ydH0KICAgICAgICApCiAgICB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FkZHJlc3NCb29rJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CiAgICBpZiAoJE9wdGlvbkN1c3RvbWVyKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ09wdGlvbkN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIG5leHQgaWYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0RW1haWwnLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UGhvbmUucG0gLSB0byBoYW5kbGUgcGhvbmUgY2FsbHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0UGhvbmUucG0sdiAxLjI3IDIwMTEvMDEvMTIgMTY6Mzk6MjIgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UGhvbmUucG0sdiAxLjE3NiAyMDExLzAxLzA2IDEwOjQ1OjE5IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQaG9uZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzczsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TGlua09iamVjdDsKdXNlIE1haWw6OkFkZHJlc3M7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICROZWVkZWQhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9ICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U3lzdGVtQWRkcmVzcy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0tPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSAgICAgICAgPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgIyBnZXQgZm9ybSBpZAogICAgJFNlbGYtPntGb3JtSUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRm9ybUlEJyApOwoKICAgICMgY3JlYXRlIGZvcm0gaWQKICAgIGlmICggISRTZWxmLT57Rm9ybUlEfSApIHsKICAgICAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQ3JlYXRlKCk7CiAgICB9CgogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRLZXkgKAogICAgICAgIHF3KEFydGljbGVJRCBMaW5rVGlja2V0SUQgUHJpb3JpdHlJRCBOZXdVc2VySUQKICAgICAgICBGcm9tIFN1YmplY3QgQm9keSBOZXh0U3RhdGVJRCBUaW1lVW5pdHMKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZQogICAgICAgIE5ld1Jlc3BvbnNpYmxlSUQgUmVzcG9uc2libGVBbGwgT3duZXJBbGwgVHlwZUlEIFNlcnZpY2VJRCBTTEFJRAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICMgZ2V0IG5lZWRlZCBzdHVmZgogICAgJEdldFBhcmFte0ltcGFjdElEfSAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnVGlja2V0RnJlZVRleHQxNCcpOwogICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnUHJpb3JpdHlSQycpOwogICAgJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnRWxlbWVudENoYW5nZWQnKSB8fCAnJzsKCiAgICAjIGNoZWNrIGlmIHByaW9yaXR5IG5lZWRzIHRvIGJlIHJlY2FsY3VsYXRlZAogICAgaWYgKCAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1NlcnZpY2VJRCcKICAgICAgICB8fCAkR2V0UGFyYW17RWxlbWVudENoYW5nZWR9IGVxICdUaWNrZXRGcmVlVGV4dDE0JwogICAgKSB7CiAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgIH0KCiAgICBteSAlU2VydmljZTsKICAgIG15ICRJbXBhY3RMaXN0ID0ge307CiAgICAkSW1wYWN0TGlzdC0+eycnfSA9ICctJzsKICAgIGlmICggJEdldFBhcmFte1NlcnZpY2VJRH0gKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UKICAgICAgICAlU2VydmljZSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgICAgICRJbXBhY3RMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6SW1wYWN0JywKICAgICAgICApOwoKICAgICAgICAjIHJlY2FsY3VsYXRlIGltcGFjdCBpZiBpbXBhY3QgaXMgbm90IHNldCB1bnRpbCBub3cKICAgICAgICBpZiAoICEkR2V0UGFyYW17SW1wYWN0SUR9ICkgewoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBzZWxlY3Rpb24KICAgICAgICAgICAgbXkgJERlZmF1bHRTZWxlY3Rpb24gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0RnJlZVRleHQxNDo6RGVmYXVsdFNlbGVjdGlvbicpOwoKICAgICAgICAgICAgIyBnZXQgZGVmYXVsdCBpbXBhY3QgaWQKICAgICAgICAgICAgbXkgJUltcGFjdExpc3RSZXZlcnNlID0gcmV2ZXJzZSAleyRJbXBhY3RMaXN0fTsKICAgICAgICAgICAgJEdldFBhcmFte0ltcGFjdElEfSAgID0gJEltcGFjdExpc3RSZXZlcnNleyREZWZhdWx0U2VsZWN0aW9ufTsKICAgICAgICAgICAgJEdldFBhcmFte1ByaW9yaXR5UkN9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgcmVjYWxjdWxhdGUgcHJpb3JpdHkKICAgICAgICBpZiAoICRHZXRQYXJhbXtQcmlvcml0eVJDfSApIHsKCiAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gPSAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fS0+UHJpb3JpdHlBbGxvY2F0aW9uR2V0KAogICAgICAgICAgICAgICAgQ3JpdGljYWxpdHlJRCA9PiAkU2VydmljZXtDcml0aWNhbGl0eUlEfSwKICAgICAgICAgICAgICAgIEltcGFjdElEICAgICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgIH0KICAgIH0KIyAtLS0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0IHBhcmFtcwogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgbXkgJEtleSAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgbXkgJFRleHQgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFRleHR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVGV4dCApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBmcmVlIHRpbWUgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAiVGlja2V0RnJlZVRpbWUiIC4gJENvdW50IC4gJFR5cGUgfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSgKICAgICAgICAgICAgICAgIFBhcmFtID0+ICJUaWNrZXRGcmVlVGltZSIgLiAkQ291bnQgLiAkVHlwZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ09wdGlvbmFsJyB9CiAgICAgICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRDb3VudCApIHx8IDA7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZU9wdGlvbmFsJyAuICRDb3VudCApICkgewogICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnVXNlZCcgfSA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRDb3VudH0gPT0gMiApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ1JlcXVpcmVkJyB9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIG15ICRLZXkgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFRleHR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVGV4dCApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIGZyZWUgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBteSAkUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudDsKICAgICAgICBuZXh0IGlmICEkR2V0UGFyYW17ICRQcmVmaXggLiAnWWVhcicgfTsKICAgICAgICBuZXh0IGlmICEkR2V0UGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH07CiAgICAgICAgbmV4dCBpZiAhJEdldFBhcmFteyAkUHJlZml4IC4gJ0RheScgfTsKICAgICAgICBuZXh0IGlmICEkR2V0UGFyYW17ICRQcmVmaXggLiAnSG91cicgfTsKICAgICAgICBuZXh0IGlmICEkR2V0UGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9OwogICAgICAgICVHZXRQYXJhbSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+VHJhbnNmcm9tRGF0ZVNlbGVjdGlvbigKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICBQcmVmaXggPT4gJFByZWZpeAogICAgICAgICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntTdWJhY3Rpb259IHx8ICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ3JlYXRlZCcgKSB7CgogICAgICAgICMgaGVhZGVyCiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgIyBpZiB0aGVyZSBpcyBubyB0aWNrZXQgaWQhCiAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NyZWF0ZWQnICkgewoKICAgICAgICAgICAgIyBub3RpZnkgaW5mbwogICAgICAgICAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBJbmZvID0+ICdUaWNrZXQgIiVzIiBjcmVhdGVkISIsICInIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICAgICAgTGluayA9PiAnJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JyAuICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzdG9yZSBsYXN0IHF1ZXVlIHNjcmVlbgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntMYXN0U2NyZWVuT3ZlcnZpZXd9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRQaG9uZS8KICAgICAgICAgICAgJiYgJFNlbGYtPntSZXF1ZXN0ZWRVUkx9ICF+IC9BY3Rpb249QWdlbnRUaWNrZXRQaG9uZS4qTGlua1RpY2tldElEPS8KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAnTGFzdFNjcmVlbk92ZXJ2aWV3JywKICAgICAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBzcGxpdCBhcnRpY2xlIGlmIGdpdmVuCiAgICAgICAgIyBnZXQgQXJ0aWNsZUlECiAgICAgICAgbXkgJUFydGljbGU7CiAgICAgICAgbXkgJUN1c3RvbWVyRGF0YTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUdldCggQXJ0aWNsZUlEID0+ICRHZXRQYXJhbXtBcnRpY2xlSUR9ICk7CiAgICAgICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJEFydGljbGV7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGZpbGwgZnJlZSB0ZXh0IGZpZWxkcwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgICAgIG15ICRLZXkgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICAgICAgbXkgJFRleHQgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBcnRpY2xleyRLZXl9ICkgewogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXskS2V5fSA9ICRBcnRpY2xleyRLZXl9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBcnRpY2xleyRUZXh0fSApIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17JFRleHR9ID0gJEFydGljbGV7JFRleHR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpbGwgZnJlZSB0aW1lIGZpZWxkcwogICAgICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRBcnRpY2xleyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IC4gJ1VzZWQnIH0gPSAxOwogICAgICAgICAgICAgICAgICAgIG15ICRTeXN0ZW1UaW1lID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgKCAkU2VjLCAkTWluLCAkSG91ciwgJERheSwgJE1vbnRoLCAkWWVhciApCiAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTeXN0ZW1UaW1lLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCAuICdZZWFyJyB9ICAgPSAkWWVhcjsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnTW9udGgnIH0gID0gJE1vbnRoOwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCAuICdEYXknIH0gICAgPSAkRGF5OwogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCAuICdIb3VyJyB9ICAgPSAkSG91cjsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgLiAnTWludXRlJyB9ID0gJE1pbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBib2R5IHByZXBhcmF0aW9uIGZvciBwbGFpbiB0ZXh0IHByb2Nlc3NpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFydGljbGVRdW90ZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICAgICAgPT4gJEdldFBhcmFte0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgVXBsb2FkQ2FjaGVPYmplY3QgID0+ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LAogICAgICAgICAgICAgICAgQXR0YWNobWVudHNJbmNsdWRlID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xle0NvbnRlbnRUeXBlfSA9ICd0ZXh0L2h0bWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEFydGljbGV7Q29udGVudFR5cGV9ID0gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkQXJ0aWNsZXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRBcnRpY2xle0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEtleUN1c3RvbWVyVXNlckxpc3QgKCBzb3J0IGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFydGljbGV7RnJvbX0gPSAkQ3VzdG9tZXJVc2VyTGlzdHskS2V5Q3VzdG9tZXJVc2VyTGlzdH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlRGVmYXVsdDsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKCiAgICAgICAgICAgICRUaWNrZXRGcmVlRGVmYXVsdHskS2V5fSA9ICRHZXRQYXJhbXskS2V5fQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRLZXkgLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgICAgICAkVGlja2V0RnJlZURlZmF1bHR7JFRleHR9ID0gJEdldFBhcmFteyRUZXh0fQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUZXh0IC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dDsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7Q3VzdG9tZXJVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFRleHR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSWYgS2V5IGhhcyB2YWx1ZSAyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGZyZWV0ZXh0ZmllbGQgaXMgcmVxdWlyZWQKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7UmVxdWlyZWR9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0SFRNTCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnID0+IFwlVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgIFRpY2tldCA9PiB7CiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZURlZmF1bHQsCiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgZGVmYXVsdCBzZWxlY3Rpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlRGVmYXVsdDsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZURlZmF1bHR7JEtleX0gPSAkR2V0UGFyYW17JEtleX0KICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAkS2V5IC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlRGVmYXVsdHskVGV4dH0gPSAkR2V0UGFyYW17JFRleHR9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJFRleHQgLiAnOjpEZWZhdWx0U2VsZWN0aW9uJyApOwogICAgICAgIH0KCiAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQ7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVGV4dH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSWYgS2V5IGhhcyB2YWx1ZSAyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGZpZWxkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7UmVxdWlyZWR9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnID0+IFwlQXJ0aWNsZUZyZWVUZXh0LAogICAgICAgICAgICBBcnRpY2xlID0+IHsgJUdldFBhcmFtLCAlQXJ0aWNsZUZyZWVEZWZhdWx0LCB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFsbCBhdHRhY2htZW50cyBtZXRhIGRhdGEKICAgICAgICBteSBAQXR0YWNobWVudHMgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNNZXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGFuZCBmb3JtYXQgZGVmYXVsdCBzdWJqZWN0IGFuZCBib2R5CiAgICAgICAgbXkgJFN1YmplY3QgPSAkQXJ0aWNsZXtTdWJqZWN0fTsKICAgICAgICBpZiAoICEkU3ViamVjdCApIHsKICAgICAgICAgICAgJFN1YmplY3QgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkQm9keSA9ICRBcnRpY2xle0JvZHl9IHx8ICcnOwogICAgICAgIGlmICggISRCb2R5ICkgewogICAgICAgICAgICAkQm9keSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dCAoaWYgYm9keSBpcyBiYXNlZCBvbiBjb25maWcpCiAgICAgICAgaWYgKCAhJEdldFBhcmFte0FydGljbGVJRH0gJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEJvZHkgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRCb2R5LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBodG1sIG91dHB1dAogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRTZWxmLT57UXVldWVJRH0gICAgICAgICAgICAgICAgIHx8IDEsCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgIFF1ZXVlSUQgICAgPT4gJFNlbGYtPntRdWV1ZUlEfSwKICAgICAgICAgICAgTmV4dFN0YXRlcyA9PiAkU2VsZi0+X0dldE5leHRTdGF0ZXMoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJEYXRhe0N1c3RvbWVyVXNlckxvZ2lufSB8fCAnJywKICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSB8fCAxLAogICAgICAgICAgICApLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgSW1wYWN0cyAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiMgLS0tCiAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0gfHwgMSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgVHlwZXMgPT4gJFNlbGYtPl9HZXRUeXBlcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lckRhdGF7Q3VzdG9tZXJVc2VyTG9naW59IHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9IHx8IDEsCiAgICAgICAgICAgICksCiAgICAgICAgICAgIFNlcnZpY2VzICAgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICBTTEFzICAgICAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICBVc2VycyAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJFNlbGYtPntRdWV1ZUlEfSApLAogICAgICAgICAgICBUbyAgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0VG9zKAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyRGF0YXtDdXN0b21lclVzZXJMb2dpbn0gfHwgJycsCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICksCiAgICAgICAgICAgIEZyb20gICAgICAgICA9PiAkQXJ0aWNsZXtGcm9tfSwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRTdWJqZWN0LAogICAgICAgICAgICBCb2R5ICAgICAgICAgPT4gJEJvZHksCiAgICAgICAgICAgIEN1c3RvbWVySUQgICA9PiAkQXJ0aWNsZXtDdXN0b21lcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRBcnRpY2xle0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgTGlua1RpY2tldElEID0+ICRHZXRQYXJhbXtMaW5rVGlja2V0SUR9IHx8ICcnLAoKICAgICAgICAgICAgIyAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgJVRpY2tldEZyZWVUZXh0SFRNTCwKICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IHRpY2tldCBhbmQgYXJ0aWNsZQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlTmV3JyApIHsKCiAgICAgICAgbXkgJUVycm9yOwogICAgICAgIG15ICVTdGF0ZURhdGE7CiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV4dFN0YXRlSUR9ICkgewogICAgICAgICAgICAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIG15ICROZXh0U3RhdGUgPSAkU3RhdGVEYXRhe05hbWV9IHx8ICcnOwogICAgICAgIG15ICREZXN0ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnRGVzdCcgKSB8fCAnJzsKICAgICAgICBteSAoICROZXdRdWV1ZUlELCAkVG8gKSA9IHNwbGl0KCAvXHxcfC8sICREZXN0ICk7CiAgICAgICAgbXkgJEN1c3RvbWVyVXNlciA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdQcmVTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkU2VsZWN0ZWRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKQogICAgICAgICAgICB8fCAnJzsKICAgICAgICBteSAkQ3VzdG9tZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgbXkgJEV4cGFuZEN1c3RvbWVyTmFtZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0V4cGFuZEN1c3RvbWVyTmFtZScgKQogICAgICAgICAgICB8fCAwOwoKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ093bmVyQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte093bmVyQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Jlc3BvbnNpYmxlQWxsUmVmcmVzaCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSA9IDE7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsZWFyRnJvbScgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAzOwogICAgICAgIH0KICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAyICkgewogICAgICAgICAgICBteSAkSXRlbSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gIkV4cGFuZEN1c3RvbWVyTmFtZSRDb3VudCIgKSB8fCAwOwogICAgICAgICAgICBpZiAoICRDb3VudCA9PSAxICYmICRJdGVtICkgewogICAgICAgICAgICAgICAgJEV4cGFuZEN1c3RvbWVyTmFtZSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkQ291bnQgPT0gMiAmJiAkSXRlbSApIHsKICAgICAgICAgICAgICAgICRFeHBhbmRDdXN0b21lck5hbWUgPSAyOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIGV4aXN0cwogICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSAmJiAkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fQogICAgICAgICAgICAgICAgPX4gcy8oXj4uK3wuezQsJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpfSkoPzpcc3xceikvJDFcbi9nbTsKICAgICAgICB9CgogICAgICAgICMgSWYgaXMgYW4gYWN0aW9uIGFib3V0IGF0dGFjaG1lbnRzCiAgICAgICAgbXkgJElzVXBsb2FkID0gMDsKCiAgICAgICAgIyBhdHRhY2htZW50IGRlbGV0ZQogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkRGVsZXRlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAiQXR0YWNobWVudERlbGV0ZSRDb3VudCIgKTsKICAgICAgICAgICAgbmV4dCBpZiAhJERlbGV0ZTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIGRhdGUKICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ICYmICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewogICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgIGlmICggJElzVXBsb2FkID09IDAgKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9ye0RhdGVJbnZhbGlkfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57VGltZU9iamVjdH0tPkRhdGUyU3lzdGVtVGltZSggJUdldFBhcmFtLCBTZWNvbmQgPT4gMCApCiAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoICRJc1VwbG9hZCA9PSAwICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcntEYXRlSW52YWxpZH0gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0OwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFRleHR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkTmV3UXVldWVJRCB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAkU2VsZWN0ZWRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIEtleSBoYXMgdmFsdWUgMiwgdGhpcyBtZWFucyB0aGF0IHRoZSBmcmVldGV4dGZpZWxkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSA9PSAyICkgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0e1JlcXVpcmVkfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyRUZXh0fSBlcSAnJwogICAgICAgICAgICAgICAgJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAwCiAgICAgICAgICAgICAgICAmJiAkSXNVcGxvYWQgPT0gMAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7RXJyb3J9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3J7JFRleHR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBDb25maWcgPT4gXCVUaWNrZXRGcmVlVGV4dCwKICAgICAgICAgICAgVGlja2V0ID0+IFwlR2V0UGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSwgKTsKCiAgICAgICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHQ7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0eyRLZXl9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVGV4dH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgSWYgS2V5IGhhcyB2YWx1ZSAyLCB0aGlzIG1lYW5zIHRoYXQgdGhlIGZpZWxkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gPT0gMiApIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7UmVxdWlyZWR9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVxdWlyZWQgQXJ0aWNsZVRleHRGaWVsZCAoaWYgY29uZmlndXJlZCkKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZUZyZWVUZXh0fS0+eyRDb3VudH0gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyRUZXh0fSBlcSAnJwogICAgICAgICAgICAgICAgJiYgJEV4cGFuZEN1c3RvbWVyTmFtZSA9PSAwCiAgICAgICAgICAgICAgICAmJiAkSXNVcGxvYWQgPT0gMAogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0e0Vycm9yfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yeyRUZXh0fSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgZXhwYW5kIGN1c3RvbWVyIG5hbWUKICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YTsKICAgICAgICBpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMSApIHsKCiAgICAgICAgICAgICMgc2VhcmNoIGN1c3RvbWVyCiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0OwogICAgICAgICAgICAlQ3VzdG9tZXJVc2VyTGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJEdldFBhcmFte0Zyb219LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBjaGVjayBpZiBqdXN0IG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cwogICAgICAgICAgICAjIGlmIGp1c3Qgb25lLCBmaWxsdXAgQ3VzdG9tZXJVc2VySUQgYW5kIEN1c3RvbWVySUQKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RDb3VudH0gPSAwOwogICAgICAgICAgICBmb3IgbXkgJEtleUN1c3RvbWVyVXNlciAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17Q3VzdG9tZXJVc2VyTGlzdENvdW50fSsrOwogICAgICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVXNlckxpc3RMYXN0fSAgICAgPSAkQ3VzdG9tZXJVc2VyTGlzdHskS2V5Q3VzdG9tZXJVc2VyfTsKICAgICAgICAgICAgICAgICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9ID0gJEtleUN1c3RvbWVyVXNlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJMaXN0Q291bnR9ID09IDEgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gICAgICAgICAgICA9ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdH07CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRQYXJhbXtDdXN0b21lclVzZXJMaXN0TGFzdFVzZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGlmIG1vcmUgdGhlIG9uZSBjdXN0b21lciB1c2VyIGV4aXN0cywgc2hvdyBsaXN0CiAgICAgICAgICAgICMgYW5kIGNsZWFuIEN1c3RvbWVyVXNlcklEIGFuZCBDdXN0b21lcklECiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgZG9uJ3QgY2hlY2sgZW1haWwgc3ludGF4IG9uIG11bHRpIGN1c3RvbWVyIHNlbGVjdAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5TZXQoIEtleSA9PiAnQ2hlY2tFbWFpbEFkZHJlc3NlcycsIFZhbHVlID0+IDAgKTsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17RnJvbU9wdGlvbnN9ID0gXCVDdXN0b21lclVzZXJMaXN0OwoKICAgICAgICAgICAgICAgICMgY2xlYXIgZnJvbSBpZiB0aGVyZSBpcyBubyBjdXN0b21lciBmb3VuZAogICAgICAgICAgICAgICAgaWYgKCAhJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0Zyb219ID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRXJyb3J7RXhwYW5kQ3VzdG9tZXJOYW1lfSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyb20gYW5kIGN1c3RvbWVyIGlkIGlmIGN1c3RvbWVyIHVzZXIgaXMgZ2l2ZW4KICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMiApIHsKICAgICAgICAgICAgJUN1c3RvbWVyVXNlckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVDdXN0b21lclVzZXJMaXN0ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEtleUN1c3RvbWVyVXNlciAoIGtleXMgJUN1c3RvbWVyVXNlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17RnJvbX0gPSAkQ3VzdG9tZXJVc2VyTGlzdHskS2V5Q3VzdG9tZXJVc2VyfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXJEYXRhe1VzZXJDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEID0gJEN1c3RvbWVyVXNlckRhdGF7VXNlckN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkQ3VzdG9tZXJVc2VyRGF0YXtVc2VyTG9naW59OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRFcnJvcntFeHBhbmRDdXN0b21lck5hbWV9ID0gMTsKICAgICAgICB9CgogICAgICAgICMgaWYgYSBuZXcgZGVzdGluYXRpb24gcXVldWUgaXMgc2VsZWN0ZWQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gMyApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgICAgICRDdXN0b21lclVzZXIgPSAkU2VsZWN0ZWRDdXN0b21lclVzZXI7CiAgICAgICAgfQoKICAgICAgICAjICdqdXN0JyBubyBzdWJtaXQKICAgICAgICBlbHNpZiAoICRFeHBhbmRDdXN0b21lck5hbWUgPT0gNCApIHsKICAgICAgICAgICAgJEVycm9ye05vU3VibWl0fSA9IDE7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgY3VzdG9tZXIgaW5mbwogICAgICAgIG15ICVDdXN0b21lckRhdGE7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvQ29tcG9zZScpICkgewogICAgICAgICAgICBpZiAoICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyICkgewogICAgICAgICAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJEN1c3RvbWVySUQpIHsKICAgICAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGZvciBteSAkRW1haWwgKCBNYWlsOjpBZGRyZXNzLT5wYXJzZSggJEdldFBhcmFte0Zyb219ICkgKSB7CiAgICAgICAgICAgIGlmICggISRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFbWFpbCggQWRkcmVzcyA9PiAkRW1haWwtPmFkZHJlc3MoKSApICkgewogICAgICAgICAgICAgICAgJEVycm9ye0Vycm9yVHlwZX0gICA9ICRTZWxmLT57Q2hlY2tJdGVtT2JqZWN0fS0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgICAgICAgICAkRXJyb3J7RnJvbUludmFsaWR9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggISRJc1VwbG9hZCAmJiAhJEV4cGFuZEN1c3RvbWVyTmFtZSApIHsKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte0Zyb219ICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydGcm9tSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgJEVycm9yeydTdWJqZWN0SW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJE5ld1F1ZXVlSUQgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J0Rlc3RpbmF0aW9uSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpCiAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17U0xBSUR9CiAgICAgICAgICAgICAgICAmJiAhJEdldFBhcmFte1NlcnZpY2VJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydTZXJ2aWNlSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAoICEkR2V0UGFyYW17VHlwZUlEfSApICYmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1R5cGVJREludmFsaWQnfSA9ICcgU2VydmVyRXJyb3InOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSApIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnUmljaFRleHRJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkKICAgICAgICAgICAgICAgICYmICFkZWZpbmVkICRHZXRQYXJhbXtUaW1lVW5pdHN9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRFcnJvcnsnVGltZVVuaXRzSW52YWxpZCd9ID0gJyBTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICglRXJyb3IpIHsKCiAgICAgICAgICAgICMgZ2V0IHNlcnZpY2VzCiAgICAgICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyByZXNldCBwcmV2aW91cyBTZXJ2aWNlSUQgdG8gcmVzZXQgU0xBLUxpc3QgaWYgbm8gc2VydmljZSBpcyBzZWxlY3RlZAogICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17U2VydmljZUlEfSB8fCAhJFNlcnZpY2VzLT57ICRHZXRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkU0xBcyA9ICRTZWxmLT5fR2V0U0xBcygKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJE5ld1F1ZXVlSUQgICB8fCAxLAogICAgICAgICAgICAgICAgU2VydmljZXMgICAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBoZWFkZXIKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICAgICAjIGh0bWwgb3V0cHV0CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9NYXNrUGhvbmVOZXcoCiAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICRTZWxmLT57UXVldWVJRH0sCiAgICAgICAgICAgICAgICBVc2VycyA9PgogICAgICAgICAgICAgICAgICAgICRTZWxmLT5fR2V0VXNlcnMoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQsIEFsbFVzZXJzID0+ICRHZXRQYXJhbXtPd25lckFsbH0gKSwKICAgICAgICAgICAgICAgIFVzZXJTZWxlY3RlZCAgICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICBSZXNwb25zaWJsZVVzZXJzID0+ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gJE5ld1F1ZXVlSUQsCiAgICAgICAgICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfQogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgIFJlc3BvbnNpYmxlVXNlclNlbGVjdGVkID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgIE5leHRTdGF0ZXMgICAgICAgICAgICAgID0+ICRTZWxmLT5fR2V0TmV4dFN0YXRlcygKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICRTZWxlY3RlZEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEID0+ICROZXdRdWV1ZUlEIHx8IDEsCiAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgTmV4dFN0YXRlICA9PiAkTmV4dFN0YXRlLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgID0+ICRJbXBhY3RMaXN0LAogICAgICAgICAgICAgICAgSW1wYWN0SUQgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKIyAtLS0KICAgICAgICAgICAgICAgIFByaW9yaXRpZXMgPT4gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBUeXBlcyA9PiAkU2VsZi0+X0dldFR5cGVzKAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJFNlbGVjdGVkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgfHwgMSwKICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICBTZXJ2aWNlcyAgICAgPT4gJFNlcnZpY2VzLAogICAgICAgICAgICAgICAgU0xBcyAgICAgICAgID0+ICRTTEFzLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkQ3VzdG9tZXJJRCApLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VyID0+ICRDdXN0b21lclVzZXIsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICAgICBGcm9tT3B0aW9ucyAgPT4gJFBhcmFte0Zyb21PcHRpb25zfSwKICAgICAgICAgICAgICAgIFRvICAgICAgICAgICA9PiAkU2VsZi0+X0dldFRvcyggUXVldWVJRCA9PiAkTmV3UXVldWVJRCApLAogICAgICAgICAgICAgICAgVG9TZWxlY3RlZCAgID0+ICREZXN0LAogICAgICAgICAgICAgICAgRXJyb3JzICAgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgPT4gXEBBdHRhY2htZW50cywKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICVUaWNrZXRGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAgICAgJUFydGljbGVGcmVlVGV4dEhUTUwsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgIyBjcmVhdGUgbmV3IHRpY2tldCwgZG8gZGIgaW5zZXJ0CiAgICAgICAgbXkgJFRpY2tldElEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDcmVhdGUoCiAgICAgICAgICAgIFRpdGxlICAgICAgICA9PiAkR2V0UGFyYW17U3ViamVjdH0sCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICA9PiAkTmV3UXVldWVJRCwKICAgICAgICAgICAgU3ViamVjdCAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgTG9jayAgICAgICAgID0+ICd1bmxvY2snLAogICAgICAgICAgICBUeXBlSUQgICAgICAgPT4gJEdldFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFNlcnZpY2VJRCAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgU0xBSUQgICAgICAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgIFN0YXRlSUQgICAgICA9PiAkR2V0UGFyYW17TmV4dFN0YXRlSUR9LAogICAgICAgICAgICBQcmlvcml0eUlEICAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICBPd25lcklEICAgICAgPT4gMSwKICAgICAgICAgICAgQ3VzdG9tZXJObyAgID0+ICRDdXN0b21lcklELAogICAgICAgICAgICBDdXN0b21lclVzZXIgPT4gJFNlbGVjdGVkQ3VzdG9tZXJVc2VyLAogICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkR2V0UGFyYW17JFRleHR9LAogICAgICAgICAgICAgICAgICAgIENvdW50ZXIgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ0NyaXRpY2FsaXR5SUQnLAogICAgICAgICAgICAgICAgVmFsdWUgICAgPT4gJFNlcnZpY2V7Q3JpdGljYWxpdHlJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAxNCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgICAgICBteSAkUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudDsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnWWVhcicgfTsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH07CiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ0RheScgfTsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnSG91cicgfTsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9OwoKICAgICAgICAgICAgIyBzZXQgdGltZSBzdGFtcCB0byBOVUxMIGlmIGZpZWxkIGlzIG5vdCB1c2VkL2NoZWNrZWQKICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkUHJlZml4IC4gJ1VzZWQnIH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQcmVmaXggLiAnWWVhcicgfSAgID0gMDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFByZWZpeCAuICdNb250aCcgfSAgPSAwOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUHJlZml4IC4gJ0RheScgfSAgICA9IDA7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQcmVmaXggLiAnSG91cicgfSAgID0gMDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFByZWZpeCAuICdNaW51dGUnIH0gPSAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBmcmVlIHRpbWUKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGltZVNldCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFByZWZpeCAgID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHN1Ym1pdCBhdHRhY2htZW50CiAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgUGFyYW0gID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyByZW1vdmUgdW51c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgbXkgQE5ld0F0dGFjaG1lbnREYXRhOwogICAgICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewogICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJRCA9ICRBdHRhY2htZW50LT57Q29udGVudElEfTsKICAgICAgICAgICAgICAgIGlmICgkQ29udGVudElEKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJENvbnRlbnRJREhUTUxRdW90ZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dCA9PiAkQ29udGVudElELAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAkR2V0UGFyYW17Qm9keX0gIX4gLyhcUSRDb250ZW50SURIVE1MUXVvdGVcRXxcUSRDb250ZW50SURcRSkvaTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHJlbWVtYmVyIGlubGluZSBpbWFnZXMgYW5kIG5vcm1hbCBhdHRhY2htZW50cwogICAgICAgICAgICAgICAgcHVzaCBATmV3QXR0YWNobWVudERhdGEsIFwleyRBdHRhY2htZW50fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBAQXR0YWNobWVudERhdGEgPSBATmV3QXR0YWNobWVudERhdGE7CgogICAgICAgICAgICAjIHZlcmlmeSBodG1sIGRvY3VtZW50CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmljaFRleHREb2N1bWVudENvbXBsZXRlKAogICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgbmV3IG93bmVyIGlzIGdpdmVuICh0aGVuIHNlbmQgbm8gYWdlbnQgbm90aWZ5KQogICAgICAgIG15ICROb0FnZW50Tm90aWZ5ID0gMDsKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdVc2VySUR9ICkgewogICAgICAgICAgICAkTm9BZ2VudE5vdGlmeSA9IDE7CiAgICAgICAgfQogICAgICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgIE5vQWdlbnROb3RpZnkgICAgPT4gJE5vQWdlbnROb3RpZnksCiAgICAgICAgICAgIFRpY2tldElEICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICBBcnRpY2xlVHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlfSwKICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICA9PiAkR2V0UGFyYW17RnJvbX0sCiAgICAgICAgICAgIFRvICAgICAgICAgICAgICAgPT4gJFRvLAogICAgICAgICAgICBTdWJqZWN0ICAgICAgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgICAgICA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICBIaXN0b3J5Q29tbWVudCAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlDb21tZW50fSB8fCAnJSUnLAogICAgICAgICAgICBBdXRvUmVzcG9uc2VUeXBlID0+ICdhdXRvIHJlcGx5JywKICAgICAgICAgICAgT3JpZ0hlYWRlciAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBGcm9tICAgID0+ICRHZXRQYXJhbXtGcm9tfSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJEdldFBhcmFte1RvfSwKICAgICAgICAgICAgICAgIFN1YmplY3QgPT4gJEdldFBhcmFte1N1YmplY3R9LAogICAgICAgICAgICAgICAgQm9keSAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKCBTdHJpbmcgPT4gJEdldFBhcmFte0JvZHl9ICksCgogICAgICAgICAgICB9LAogICAgICAgICAgICBRdWV1ZSA9PiAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoIFF1ZXVlSUQgPT4gJE5ld1F1ZXVlSUQgKSwKICAgICAgICApOwogICAgICAgIGlmICggISRBcnRpY2xlSUQgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRHZXRQYXJhbXskS2V5fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJEdldFBhcmFteyRUZXh0fSwKICAgICAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBvd25lciAoaWYgbmV3IHVzZXIgaWQgaXMgZ2l2ZW4pCiAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3VXNlcklEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRPd25lclNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGVsc2Ugc2V0IG93bmVyIHRvIGN1cnJlbnQgYWdlbnQgYnV0IGRvIG5vdCBsb2NrIGl0CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0T3duZXJTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgPT4gJFRpY2tldElELAogICAgICAgICAgICAgICAgTmV3VXNlcklEICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFNlbmROb05vdGlmaWNhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHJlc3BvbnNpYmxlIChpZiBuZXcgdXNlciBpZCBpcyBnaXZlbikKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRSZXNwb25zaWJsZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBOZXdVc2VySUQgPT4gJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgdGltZSBhY2NvdW50aW5nCiAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50VGltZSgKICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50IChAQXR0YWNobWVudERhdGEpIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlV3JpdGVBdHRhY2htZW50KAogICAgICAgICAgICAgICAgJXskQXR0YWNobWVudH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHJlbW92ZSBwcmUgc3VibWl0ZWQgYXR0YWNobWVudHMKICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlKCBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9ICk7CgogICAgICAgICMgbGluayB0aWNrZXRzCiAgICAgICAgaWYgKAogICAgICAgICAgICAkR2V0UGFyYW17TGlua1RpY2tldElEfQogICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfQogICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0xpbmtUeXBlfQogICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntTcGxpdExpbmtUeXBlfS0+e0RpcmVjdGlvbn0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgbXkgJFRhcmdldEtleSA9ICRUaWNrZXRJRDsKCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3BsaXRMaW5rVHlwZX0tPntEaXJlY3Rpb259IGVxICdTb3VyY2UnICkgewogICAgICAgICAgICAgICAgJFNvdXJjZUtleSA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgPSAkR2V0UGFyYW17TGlua1RpY2tldElEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBsaW5rIHRoZSB0aWNrZXRzCiAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgVHlwZSAgICAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e1NwbGl0TGlua1R5cGV9LT57TGlua1R5cGV9IHx8ICdOb3JtYWwnLAogICAgICAgICAgICAgICAgU3RhdGUgICAgICAgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG91bGQgaSBzZXQgYW4gdW5sb2NrPwogICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkgewoKICAgICAgICAgICAgIyBzZXQgbG9jawogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHBlbmRpbmcgdGltZQogICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRQZW5kaW5nVGltZVNldCgKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQoKICAgICAgICAgICAgIyBnZXQgdGhlIHRlbXBvcmFyaWx5IGxpbmtzCiAgICAgICAgICAgIG15ICRUZW1wTGlua0xpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdCgKICAgICAgICAgICAgICAgIE9iamVjdCAgICA9PiAnVGlja2V0JywKICAgICAgICAgICAgICAgIEtleSAgICAgICA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJ1RlbXBvcmFyeScsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAkVGVtcExpbmtMaXN0ICYmIHJlZiAkVGVtcExpbmtMaXN0IGVxICdIQVNIJyAmJiAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0T2JqZWN0T3JnICgga2V5cyAleyRUZW1wTGlua0xpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAjIGV4dHJhY3QgdHlwZWxpc3QKICAgICAgICAgICAgICAgICAgICBteSAkVHlwZUxpc3QgPSAkVGVtcExpbmtMaXN0LT57JFRhcmdldE9iamVjdE9yZ307CgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkVHlwZSAoIGtleXMgJXskVHlwZUxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBleHRyYWN0IGRpcmVjdGlvbiBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREaXJlY3Rpb25MaXN0ID0gJFR5cGVMaXN0LT57JFR5cGV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREaXJlY3Rpb24gKCBrZXlzICV7JERpcmVjdGlvbkxpc3R9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkVGFyZ2V0S2V5T3JnICgga2V5cyAleyAkRGlyZWN0aW9uTGlzdC0+eyREaXJlY3Rpb259IH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZGVsZXRlIHRoZSB0ZW1wIGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QxID0+ICdUaWNrZXQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRTZWxmLT57Rm9ybUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAkVGFyZ2V0T2JqZWN0T3JnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRUYXJnZXRLZXlPcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VPYmplY3QgPSAkVGFyZ2V0T2JqZWN0T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRTb3VyY2VLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRUYXJnZXRPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkVGFyZ2V0S2V5ICAgID0gJFRpY2tldElEOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICREaXJlY3Rpb24gZXEgJ1RhcmdldCcgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRTb3VyY2VPYmplY3QgPSAnVGlja2V0JzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNvdXJjZUtleSAgICA9ICRUaWNrZXRJRDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRhcmdldE9iamVjdCA9ICRUYXJnZXRPYmplY3RPcmc7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUYXJnZXRLZXkgICAgPSAkVGFyZ2V0S2V5T3JnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhZGQgdGhlIHBlcm1hbmVudGx5IGxpbmsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAkU3VjY2VzcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtBZGQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZU9iamVjdCA9PiAkU291cmNlT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJFNvdXJjZUtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICRUYXJnZXRPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkVGFyZ2V0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICAgICAgICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyAtLS0KCiAgICAgICAgIyBnZXQgcmVkaXJlY3Qgc2NyZWVuCiAgICAgICAgbXkgJE5leHRTY3JlZW4gPSAkU2VsZi0+e1VzZXJDcmVhdGVOZXh0TWFza30gfHwgJ0FnZW50VGlja2V0UGhvbmUnOwoKICAgICAgICAjIHJlZGlyZWN0CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UmVkaXJlY3QoCiAgICAgICAgICAgIE9QID0+ICJBY3Rpb249JE5leHRTY3JlZW47U3ViYWN0aW9uPUNyZWF0ZWQ7VGlja2V0SUQ9JFRpY2tldElEIiwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewogICAgICAgIG15ICREZXN0ICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdEZXN0JyApIHx8ICcnOwogICAgICAgIG15ICRDdXN0b21lclVzZXIgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWxlY3RlZEN1c3RvbWVyVXNlcicgKTsKICAgICAgICBteSAkUXVldWVJRCAgICAgID0gJyc7CiAgICAgICAgaWYgKCAkRGVzdCA9fiAvXihcZHsxLDEwMH0pXHxcfC4rPyQvICkgewogICAgICAgICAgICAkUXVldWVJRCA9ICQxOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgbGlzdCB0eXBlCiAgICAgICAgbXkgJFRyZWVWaWV3ID0gMDsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgICAgICB9CgogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT5fR2V0VXNlcnMoCiAgICAgICAgICAgIFF1ZXVlSUQgID0+ICRRdWV1ZUlELAogICAgICAgICAgICBBbGxVc2VycyA9PiAkR2V0UGFyYW17T3duZXJBbGx9LAogICAgICAgICk7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlVXNlcnMgPSAkU2VsZi0+X0dldFVzZXJzKAogICAgICAgICAgICBRdWV1ZUlEICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQWxsVXNlcnMgPT4gJEdldFBhcmFte1Jlc3BvbnNpYmxlQWxsfSwKICAgICAgICApOwogICAgICAgIG15ICROZXh0U3RhdGVzID0gJFNlbGYtPl9HZXROZXh0U3RhdGVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRQcmlvcml0aWVzID0gJFNlbGYtPl9HZXRQcmlvcml0aWVzKAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRDdXN0b21lclVzZXIgfHwgJycsCiAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEICAgICAgfHwgMSwKICAgICAgICApOwogICAgICAgIG15ICRTZXJ2aWNlcyA9ICRTZWxmLT5fR2V0U2VydmljZXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNMQXMgPSAkU2VsZi0+X0dldFNMQXMoCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgUXVldWVJRCAgICAgICAgPT4gJFF1ZXVlSUQgICAgICB8fCAxLAogICAgICAgICAgICBTZXJ2aWNlcyAgICAgICA9PiAkU2VydmljZXMsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgQFRpY2tldEZyZWVUZXh0Q29uZmlnOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICAgICAgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVGV4dCAgICAgID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJENvbmZpZ0tleSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICAgICA9PiAkUXVldWVJRCB8fCAwLAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJEN1c3RvbWVyVXNlciB8fCAnJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkQ29uZmlnVmFsdWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgICAgID0+ICRRdWV1ZUlEIHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkQ3VzdG9tZXJVc2VyIHx8ICcnLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENvbmZpZ1ZhbHVlKSB7CiAgICAgICAgICAgICAgICBwdXNoKAogICAgICAgICAgICAgICAgICAgIEBUaWNrZXRGcmVlVGV4dENvbmZpZywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICA9PiAkQ29uZmlnVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXskVGV4dH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ05ld1VzZXJJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRVc2VycywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte05ld1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFJlc3BvbnNpYmxlVXNlcnMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtOZXdSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnTmV4dFN0YXRlSUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICROZXh0U3RhdGVzLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXh0U3RhdGVJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMSwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICB9LAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkSW1wYWN0TGlzdCwKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMSwKICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKIyAtLS0KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFByaW9yaXRpZXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFte1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NlcnZpY2VJRCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRTZXJ2aWNlcywKICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJEdldFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgVHJlZVZpZXcgICAgID0+ICRUcmVlVmlldywKICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNMQXMsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oCiAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ05vIFN1YmFjdGlvbiEhJywKICAgICAgICAgICAgQ29tbWVudCA9PiAnUGxlYXNlIGNvbnRhY3QgeW91ciBhZG1pbmlzdHJhdG9yJywKICAgICAgICApOwogICAgfQp9CgpzdWIgX0dldE5leHRTdGF0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlTmV4dFN0YXRlczsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJU5leHRTdGF0ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gXCVOZXh0U3RhdGVzOwp9CgpzdWIgX0dldFVzZXJzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlcnMKICAgIG15ICVTaG93blVzZXJzOwogICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMSwKICAgICk7CgogICAgIyBqdXN0IHNob3cgb25seSB1c2VycyB3aXRoIHNlbGVjdGVkIGN1c3RvbSBxdWV1ZQogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gJiYgISRQYXJhbXtBbGxVc2Vyc30gKSB7CiAgICAgICAgbXkgQFVzZXJJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkdldFN1YnNjcmliZWRVc2VySURzQnlRdWV1ZUlEKCVQYXJhbSk7CiAgICAgICAgZm9yIG15ICRLZXlHcm91cE1lbWJlciAoIGtleXMgJUFsbEdyb3Vwc01lbWJlcnMgKSB7CiAgICAgICAgICAgIG15ICRIaXQgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVJRCAoQFVzZXJJRHMpIHsKICAgICAgICAgICAgICAgIGlmICggJFVJRCBlcSAkS2V5R3JvdXBNZW1iZXIgKSB7CiAgICAgICAgICAgICAgICAgICAgJEhpdCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJEhpdCApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkQWxsR3JvdXBzTWVtYmVyc3skS2V5R3JvdXBNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBhbGwgc3lzdGVtIHVzZXJzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkNoYW5nZU93bmVyVG9FdmVyeW9uZScpICkgewogICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICB9CgogICAgIyBzaG93IGFsbCB1c2VycyB3aG8gYXJlIHJ3IGluIHRoZSBxdWV1ZSBncm91cAogICAgZWxzaWYgKCAkUGFyYW17UXVldWVJRH0gKSB7CiAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFBhcmFte1F1ZXVlSUR9ICk7CiAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgIFR5cGUgICAgPT4gJ3J3JywKICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEtleU1lbWJlciAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgIGlmICggJEFsbEdyb3Vwc01lbWJlcnN7JEtleU1lbWJlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skS2V5TWVtYmVyfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRLZXlNZW1iZXJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFwlU2hvd25Vc2VyczsKfQoKc3ViIF9HZXRQcmlvcml0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIG15ICVQcmlvcml0aWVzOwogICAgaWYgKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApIHsKICAgICAgICAlUHJpb3JpdGllcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVByaW9yaXRpZXM7Cn0KCnN1YiBfR2V0VHlwZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB0eXBlCiAgICBteSAlVHlwZTsKICAgIGlmICggJFBhcmFte1F1ZXVlSUR9IHx8ICRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVR5cGU7Cn0KCnN1YiBfR2V0U2VydmljZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBzZXJ2aWNlCiAgICBteSAlU2VydmljZTsKICAgIGlmICggKCAkUGFyYW17UXVldWVJRH0gfHwgJFBhcmFte1RpY2tldElEfSApICYmICRQYXJhbXtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgJVNlcnZpY2UgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlcnZpY2VMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiBcJVNlcnZpY2U7Cn0KCnN1YiBfR2V0U0xBcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IHNsYQogICAgbXkgJVNMQTsKICAgIGlmICggJFBhcmFte1NlcnZpY2VJRH0gJiYgJFBhcmFte1NlcnZpY2VzfSAmJiAleyAkUGFyYW17U2VydmljZXN9IH0gKSB7CiAgICAgICAgaWYgKCAkUGFyYW17U2VydmljZXN9LT57ICRQYXJhbXtTZXJ2aWNlSUR9IH0gKSB7CiAgICAgICAgICAgICVTTEEgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNMQUxpc3QoCiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBBY3Rpb24gPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gXCVTTEE7Cn0KCnN1YiBfR2V0VG9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBvd24gc2VsZWN0aW9uCiAgICBteSAlTmV3VG9zOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UXVldWVPd25TZWxlY3Rpb24nKSApIHsKICAgICAgICAlTmV3VG9zID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlT3duU2VsZWN0aW9uJykgfTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICAjIFNlbGVjdGlvblR5cGUgUXVldWUgb3IgU3lzdGVtQWRkcmVzcz8KICAgICAgICBteSAlVG9zOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uVHlwZScpIGVxICdRdWV1ZScgKSB7CiAgICAgICAgICAgICVUb3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk1vdmVMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAnY3JlYXRlJywKICAgICAgICAgICAgICAgIEFjdGlvbiAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkU2VsZi0+e1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAlVG9zID0gJFNlbGYtPntEQk9iamVjdH0tPkdldFRhYmxlRGF0YSgKICAgICAgICAgICAgICAgIFRhYmxlID0+ICdzeXN0ZW1fYWRkcmVzcycsCiAgICAgICAgICAgICAgICBXaGF0ICA9PiAncXVldWVfaWQsIGlkJywKICAgICAgICAgICAgICAgIFZhbGlkID0+IDEsCiAgICAgICAgICAgICAgICBDbGFtcCA9PiAxLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgY3JlYXRlIHBlcm1pc3Npb24gcXVldWVzCiAgICAgICAgbXkgJVVzZXJHcm91cHMgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ2NyZWF0ZScsCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBzZWxlY3Rpb24gc3RyaW5nCiAgICAgICAgZm9yIG15ICRRdWV1ZUlEICgga2V5cyAlVG9zICkgewogICAgICAgICAgICBteSAlUXVldWVEYXRhID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlR2V0KCBJRCA9PiAkUXVldWVJRCApOwoKICAgICAgICAgICAgIyBwZXJtaXNzaW9uIGNoZWNrLCBjYW4gd2UgY3JlYXRlIG5ldyB0aWNrZXRzIGluIHF1ZXVlCiAgICAgICAgICAgIG5leHQgaWYgISRVc2VyR3JvdXBzeyAkUXVldWVEYXRhe0dyb3VwSUR9IH07CgogICAgICAgICAgICBteSAkU3RyaW5nID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5ld1F1ZXVlU2VsZWN0aW9uU3RyaW5nJykKICAgICAgICAgICAgICAgIHx8ICc8UmVhbG5hbWU+IDw8RW1haWw+PiAtIFF1ZXVlOiA8UXVldWU+JzsKICAgICAgICAgICAgJFN0cmluZyA9fiBzLzxRdWV1ZT4vJFF1ZXVlRGF0YXtOYW1lfS9nOwogICAgICAgICAgICAkU3RyaW5nID1+IHMvPFF1ZXVlQ29tbWVudD4vJFF1ZXVlRGF0YXtDb21tZW50fS9nOwogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBuZSAnUXVldWUnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJVN5c3RlbUFkZHJlc3NEYXRhID0gJFNlbGYtPntTeXN0ZW1BZGRyZXNzfS0+U3lzdGVtQWRkcmVzc0dldCgKICAgICAgICAgICAgICAgICAgICBJRCA9PiAkVG9zeyRRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPFJlYWxuYW1lPi8kU3lzdGVtQWRkcmVzc0RhdGF7UmVhbG5hbWV9L2c7CiAgICAgICAgICAgICAgICAkU3RyaW5nID1+IHMvPEVtYWlsPi8kU3lzdGVtQWRkcmVzc0RhdGF7TmFtZX0vZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkTmV3VG9zeyRRdWV1ZUlEfSA9ICRTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGVtcHR5IHNlbGVjdGlvbgogICAgJE5ld1Rvc3snJ30gPSAnLSc7CiAgICByZXR1cm4gXCVOZXdUb3M7Cn0KCnN1YiBfTWFza1Bob25lTmV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CgogICAgIyBnZXQgbGlzdCB0eXBlCiAgICBteSAkVHJlZVZpZXcgPSAwOwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TGlzdFR5cGUnKSBlcSAndHJlZScgKSB7CiAgICAgICAgJFRyZWVWaWV3ID0gMTsKICAgIH0KCiAgICAjIGJ1aWxkIGN1c3RvbWVyIHNlYXJjaCBhdXRvY29tcGxldGUgZmllbGQKICAgIG15ICRBdXRvQ29tcGxldGVDb25maWcKICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScpOwogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdDdXN0b21lclNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0FjdGl2ZX0sCiAgICAgICAgICAgIG1pblF1ZXJ5TGVuZ3RoICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e01pblF1ZXJ5TGVuZ3RofSB8fCAyLAogICAgICAgICAgICBxdWVyeURlbGF5ICAgICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntRdWVyeURlbGF5fSB8fCAwLjEsCiAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1R5cGVBaGVhZH0gfHwgJ2ZhbHNlJywKICAgICAgICAgICAgbWF4UmVzdWx0c0Rpc3BsYXllZCA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWF4UmVzdWx0c0Rpc3BsYXllZH0gfHwgMjAsCiAgICAgICAgfSwKICAgICk7CgogICAgIyBidWlsZCBzdHJpbmcKICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgID0+ICRQYXJhbXtVc2Vyc30sCiAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtVc2VyU2VsZWN0ZWR9LAogICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgIE5hbWUgICAgICAgICA9PiAnTmV3VXNlcklEJywKICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICk7CgogICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJFBhcmFte05leHRTdGF0ZXN9LAogICAgICAgIE5hbWUgICAgICAgICAgPT4gJ05leHRTdGF0ZUlEJywKICAgICAgICBUcmFuc2xhdGlvbiAgID0+IDEsCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17TmV4dFN0YXRlfSB8fCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9LAogICAgKTsKCiAgICAjIGJ1aWxkIHRvIHN0cmluZwogICAgbXkgJU5ld1RvOwogICAgaWYgKCAkUGFyYW17VG99ICkgewogICAgICAgIGZvciBteSAkS2V5VG8gKCBrZXlzICV7ICRQYXJhbXtUb30gfSApIHsKICAgICAgICAgICAgJE5ld1RveyIkS2V5VG98fCRQYXJhbXtUb30tPnskS2V5VG99In0gPSAkUGFyYW17VG99LT57JEtleVRvfTsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdRdWV1ZVNlbGVjdGlvblR5cGUnKSBlcSAnUXVldWUnICkgewogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTXVsdGlwbGUgICAgICAgPT4gMCwKICAgICAgICAgICAgU2l6ZSAgICAgICAgICAgPT4gMCwKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgICA9PiAkUGFyYW17VG9TZWxlY3RlZH0sCiAgICAgICAgICAgIE9uQ2hhbmdlU3VibWl0ID0+IDAsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRQYXJhbXtUb1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJywKICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gXCVOZXdUbywKICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0Rlc3QnLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiAkUGFyYW17VG9TZWxlY3RlZH0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8gc3RyaW5nCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlJykgKSB7CiAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtDdXN0b21lckRhdGF9LAogICAgICAgICAgICBNYXggID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpDdXN0b21lckluZm9Db21wb3NlTWF4U2l6ZScpLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJUYWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgcHJlcGFyZSBlcnJvcnMhCiAgICBpZiAoICRQYXJhbXtFcnJvcnN9ICkgewogICAgICAgIGZvciBteSAkS2V5RXJyb3IgKCBrZXlzICV7ICRQYXJhbXtFcnJvcnN9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXskS2V5RXJyb3J9CiAgICAgICAgICAgICAgICA9ICcqICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZGlzcGxheSBzZXJ2ZXIgZXJyb3IgbXNnIGFjY29yZGluZyB3aXRoIHRoZSBvY2N1cnJlZCBlbWFpbCAoZnJvbSkgZXJyb3IgdHlwZQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSAmJiAkUGFyYW17RXJyb3JzfS0+e0Vycm9yVHlwZX0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnRW1haWwnIC4gJFBhcmFte0Vycm9yc30tPntFcnJvclR5cGV9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdHZW5lcmljU2VydmVyRXJyb3JNc2cnICk7CiAgICB9CgogICAgIyBidWlsZCB0eXBlIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFBhcmFte1R5cGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIENsYXNzID0+ICdWYWxpZGF0ZV9SZXF1aXJlZCcgLiAoICRQYXJhbXtFcnJvcnN9LT57VHlwZUlESW52YWxpZH0gfHwgJyAnICksCiAgICAgICAgICAgIERhdGEgID0+ICRQYXJhbXtUeXBlc30sCiAgICAgICAgICAgIE5hbWUgID0+ICdUeXBlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1R5cGVJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgYnVpbGQgc2VydmljZSBzdHJpbmcKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICRQYXJhbXtTZXJ2aWNlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte1NlcnZpY2VzfSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gJFBhcmFte0Vycm9yc30tPntTZXJ2aWNlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICBUcmVlVmlldyAgICAgPT4gJFRyZWVWaWV3LAogICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ1RyZWVWaWV3JywKICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDAsCiAgICAgICAgICAgIE1heCAgICAgICAgICA9PiAyMDAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkUGFyYW17U0xBc30sCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAnU0xBSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNMQScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCgogICAgIyBjcmVhdGUgaW1wYWN0IHN0cmluZwogICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgIERhdGEgICAgICAgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgIE5hbWUgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICk7CiAgICBpZiAoICRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0gKSB7CiAgICAgICAgJFBhcmFte1ByaW9yaXR5SUR9ID0gJFBhcmFte1ByaW9yaXR5SURGcm9tSW1wYWN0fTsKICAgIH0KIyAtLS0KCiAgICAjIGJ1aWxkIHByaW9yaXR5IHN0cmluZwogICAgaWYgKCAhJFBhcmFte1ByaW9yaXR5SUR9ICkgewogICAgICAgICRQYXJhbXtQcmlvcml0eX0gPSAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX07CiAgICB9CiAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAkUGFyYW17UHJpb3JpdGllc30sCiAgICAgICAgTmFtZSAgICAgICAgICA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgU2VsZWN0ZWRJRCAgICA9PiAkUGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgU2VsZWN0ZWRWYWx1ZSA9PiAkUGFyYW17UHJpb3JpdHl9LAogICAgICAgIFRyYW5zbGF0aW9uICAgPT4gMSwKICAgICk7CgogICAgIyBwZW5kaW5nIGRhdGEgc3RyaW5nCiAgICAkUGFyYW17UGVuZGluZ0RhdGVTdHJpbmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZERhdGVTZWxlY3Rpb24oCiAgICAgICAgJVBhcmFtLAogICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgRGlmZlRpbWUgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGVuZGluZ0RpZmZUaW1lJykgfHwgMCwKICAgICAgICBDbGFzcyAgICAgICAgICAgID0+ICRQYXJhbXtFcnJvcnN9LT57RGF0ZUludmFsaWR9LAogICAgICAgIFZhbGlkYXRlICAgICAgICAgPT4gMSwKICAgICAgICBWYWxpZGF0ZURhdGVJbkZ1dHVyZSA9PiAxLAogICAgKTsKCiAgICAjIHNob3cgb3duZXIgc2VsZWN0aW9uCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZXdPd25lclNlbGVjdGlvbicpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IHJlc3BvbnNpYmxlIHNlbGVjdGlvbgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TmV3UmVzcG9uc2libGVTZWxlY3Rpb24nKQogICAgICAgICkKICAgIHsKICAgICAgICAkUGFyYW17UmVzcG9uc2libGVVc2Vyc30tPnsnJ30gPSAnLSc7CiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlT3B0aW9uU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+ICRQYXJhbXtSZXNwb25zaWJsZVVzZXJzfSwKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17UmVzcG9uc2libGVVc2VyU2VsZWN0ZWR9LAogICAgICAgICAgICBOYW1lICAgICAgID0+ICdOZXdSZXNwb25zaWJsZUlEJywKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNpYmxlU2VsZWN0aW9uJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICBuZXh0IGlmICEkU2VsZi0+e0NvbmZpZ30tPntUaWNrZXRGcmVlVGV4dH0tPnskQ291bnR9OwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0RmllbGQgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCBDb3VudCA9PiAkQ291bnQsIH0sCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JENvdW50fTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50LCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhcnRpY2xlIGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBuZXh0IGlmICEkU2VsZi0+e0NvbmZpZ30tPntBcnRpY2xlRnJlZVRleHR9LT57JENvdW50fTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEFydGljbGVGcmVlS2V5RmllbGQgID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBBcnRpY2xlRnJlZVRleHRGaWVsZCA9PiAkUGFyYW17ICdBcnRpY2xlRnJlZVRleHRGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIENvdW50ID0+ICRDb3VudCwgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aW1lIGFjY291bnRpbmcgYm94CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok5lZWRBY2NvdW50ZWRUaW1lJykgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYXJhbXtUaW1lVW5pdHNSZXF1aXJlZH0gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0c0xhYmVsJywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFBhcmFte1RpbWVVbml0c1JlcXVpcmVkfSA9ICcnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHMnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkU2hvd25PcHRpb25zQmxvY2s7CgogICAgIyBzaG93IHNwZWxsIGNoZWNrCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIG5lZWQgdG8gY2FsbCBPcHRpb25zIGJsb2NrCiAgICAgICAgaWYgKCAhJFNob3duT3B0aW9uc0Jsb2NrICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzZXQgZmxhZyB0byAidHJ1ZSIgaW4gb3JkZXIgdG8gcHJldmVudCBjYWxsaW5nIHRoZSBPcHRpb25zIGJsb2NrIGFnYWluCiAgICAgICAgICAgICRTaG93bk9wdGlvbnNCbG9jayA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTcGVsbENoZWNrJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBjdXN0b21lciBlZGl0IGxpbmsKICAgIG15ICRPcHRpb25DdXN0b21lciA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UGVybWlzc2lvbigKICAgICAgICBBY3Rpb24gPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICk7CiAgICBpZiAoJE9wdGlvbkN1c3RvbWVyKSB7CgogICAgICAgICMgY2hlY2sgaWYgbmVlZCB0byBjYWxsIE9wdGlvbnMgYmxvY2sKICAgICAgICBpZiAoICEkU2hvd25PcHRpb25zQmxvY2sgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRPcHRpb25zJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNldCBmbGFnIHRvICJ0cnVlIiBpbiBvcmRlciB0byBwcmV2ZW50IGNhbGxpbmcgdGhlIE9wdGlvbnMgYmxvY2sgYWdhaW4KICAgICAgICAgICAgJFNob3duT3B0aW9uc0Jsb2NrID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ09wdGlvbkN1c3RvbWVyJywKICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhdHRhY2htZW50cwogICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgIG5leHQgaWYgJEF0dGFjaG1lbnQtPntDb250ZW50SUR9ICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UGhvbmUnLCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGFnZW50IGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQcmludC5wbSx2IDEuNyAyMDEwLzEyLzA2IDE5OjMzOjA5IGVuIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW50LnBtLHYgMS43NiAyMDEwLzExLzI5IDExOjM5OjA3IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRQcmludDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UERGOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBNYWluT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgY29uZmlnIHNldHRpbmdzCiAgICAkU2VsZi0+e1pvb21FeHBhbmRTb3J0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpab29tRXhwYW5kU29ydCcpOwoKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntMaW5rT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkUXVldWVJRCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UXVldWVJRCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgIG15ICRBcnRpY2xlSUQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdBcnRpY2xlSUQnICk7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9IHx8ICEkUXVldWVJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKSBpZiAhJEFjY2VzczsKCiAgICAjIGdldCBsaW5rZWQgb2JqZWN0cwogICAgbXkgJExpbmtMaXN0V2l0aERhdGEgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rTGlzdFdpdGhEYXRhKAogICAgICAgIE9iamVjdCA9PiAnVGlja2V0JywKICAgICAgICBLZXkgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBnZXQgbGluayB0eXBlIGxpc3QKICAgIG15ICVMaW5rVHlwZUxpc3QgPSAkU2VsZi0+e0xpbmtPYmplY3R9LT5UeXBlTGlzdCgKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCB0aGUgbGluayBkYXRhCiAgICBteSAlTGlua0RhdGE7CiAgICBpZiAoICRMaW5rTGlzdFdpdGhEYXRhICYmIHJlZiAkTGlua0xpc3RXaXRoRGF0YSBlcSAnSEFTSCcgJiYgJXskTGlua0xpc3RXaXRoRGF0YX0gKSB7CiAgICAgICAgJUxpbmtEYXRhID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5MaW5rT2JqZWN0VGFibGVDcmVhdGUoCiAgICAgICAgICAgIExpbmtMaXN0V2l0aERhdGEgPT4gJExpbmtMaXN0V2l0aERhdGEsCiAgICAgICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJ1NpbXBsZVJhdycsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBjb250ZW50CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAnLSc7CiAgICBpZiAoJFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfSkgewogICAgICAgICMgZ2V0IGNyaXRpY2FsaXR5IGxpc3QKICAgICAgICBteSAkQ3JpdGljYWxpdHlMaXN0ID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1MaXN0KAogICAgICAgICAgICBDbGFzcyA9PiAnSVRTTTo6Q29yZTo6Q3JpdGljYWxpdHknLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfX07CiAgICB9CiAgICAjIGxvb2t1cCBpbXBhY3QKICAgICRUaWNrZXR7SW1wYWN0fSA9ICctJzsKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0ltcGFjdH0gPSAkSW1wYWN0TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH19OwogICAgfQojIC0tLQogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgb25seSBvbmUgYXJ0aWNsZSBuZWVkIHByaW50ZWQKICAgIGlmICgkQXJ0aWNsZUlEKSB7CiAgICAgICAgbXkgQE5ld0FydGljbGVCb3g7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlLT57QXJ0aWNsZUlEfSA9PSAkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgQE5ld0FydGljbGVCb3ggPSAoJEFydGljbGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChATmV3QXJ0aWNsZUJveCkgewogICAgICAgICAgICBAQXJ0aWNsZUJveCA9IEBOZXdBcnRpY2xlQm94OwogICAgICAgIH0KICAgIH0KCiAgICAjIHJlc29ydCBhcnRpY2xlIG9yZGVyCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdyZXZlcnNlJyApIHsKICAgICAgICBAQXJ0aWNsZUJveCA9IHJldmVyc2UoQEFydGljbGVCb3gpOwogICAgfQoKICAgICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudGVkVGltZUdldCgKICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICk7CgogICAgIyB1c2VyIGluZm8KICAgIG15ICVVc2VySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXIgPT4gJFRpY2tldHtPd25lcn0sCiAgICApOwoKICAgICMgcmVzcG9uc2libGUgaW5mbwogICAgbXkgJVJlc3BvbnNpYmxlSW5mbzsKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6UmVzcG9uc2libGUnKSAmJiAkVGlja2V0e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAlUmVzcG9uc2libGVJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtSZXNwb25zaWJsZX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIG15ICVDdXN0b21lckRhdGE7CiAgICBpZiAoICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgIFVzZXIgPT4gJFRpY2tldHtDdXN0b21lclVzZXJJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2lmICggJFRpY2tldHtDdXN0b21lcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBDdXN0b21lcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAkVGlja2V0e0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgIEFnZSAgID0+ICRUaWNrZXR7QWdlfSwKICAgICAgICBTcGFjZSA9PiAnICcsCiAgICApOwoKICAgIGlmICggJFRpY2tldHtVbnRpbFRpbWV9ICkgewogICAgICAgICRUaWNrZXR7UGVuZGluZ1VudGlsfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VW50aWxUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAnLSc7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBwZGYgb3V0cHV0CiAgICBpZiAoICRTZWxmLT57UERGT2JqZWN0fSApIHsKICAgICAgICBteSAkUHJpbnRlZEJ5ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ3ByaW50ZWQgYnknKTsKICAgICAgICBteSAkVGltZSAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoIFRlbXBsYXRlID0+ICckRW52eyJUaW1lIn0nICk7CiAgICAgICAgbXkgJFVybCAgICAgICA9ICcgJzsKICAgICAgICBpZiAoICRFTlZ7UkVRVUVTVF9VUkl9ICkgewogICAgICAgICAgICAkVXJsID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0h0dHBUeXBlJykgLiAnOi8vJwogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRlFETicpCiAgICAgICAgICAgICAgICAuICRFTlZ7UkVRVUVTVF9VUkl9OwogICAgICAgIH0KICAgICAgICBteSAlUGFnZTsKCiAgICAgICAgIyBnZXQgbWF4aW11bSBudW1iZXIgb2YgcGFnZXMKICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUERGOjpNYXhQYWdlcycpOwogICAgICAgIGlmICggISRQYWdle01heFBhZ2VzfSB8fCAkUGFnZXtNYXhQYWdlc30gPCAxIHx8ICRQYWdle01heFBhZ2VzfSA+IDEwMDAgKSB7CiAgICAgICAgICAgICRQYWdle01heFBhZ2VzfSA9IDEwMDsKICAgICAgICB9CiAgICAgICAgbXkgJEhlYWRlclJpZ2h0ICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Okhvb2snKSAuICRUaWNrZXR7VGlja2V0TnVtYmVyfTsKICAgICAgICBteSAkSGVhZGxpbmVMZWZ0ID0gJEhlYWRlclJpZ2h0OwogICAgICAgIG15ICRUaXRsZSAgICAgICAgPSAkSGVhZGVyUmlnaHQ7CiAgICAgICAgaWYgKCAkVGlja2V0e1RpdGxlfSApIHsKICAgICAgICAgICAgJEhlYWRsaW5lTGVmdCA9ICRUaWNrZXR7VGl0bGV9OwogICAgICAgICAgICAkVGl0bGUgLj0gJyAvICcgLiAkVGlja2V0e1RpdGxlfTsKICAgICAgICB9CgogICAgICAgICRQYWdle01hcmdpblRvcH0gICAgPSAzMDsKICAgICAgICAkUGFnZXtNYXJnaW5SaWdodH0gID0gNDA7CiAgICAgICAgJFBhZ2V7TWFyZ2luQm90dG9tfSA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkxlZnR9ICAgPSA0MDsKICAgICAgICAkUGFnZXtIZWFkZXJSaWdodH0gID0gJEhlYWRlclJpZ2h0OwogICAgICAgICRQYWdle0hlYWRsaW5lTGVmdH0gPSAkSGVhZGxpbmVMZWZ0OwogICAgICAgICRQYWdle0hlYWRsaW5lUmlnaHR9CiAgICAgICAgICAgID0gJFByaW50ZWRCeSAuICcgJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJMYXN0bmFtZX0gLiAnICgnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyRW1haWx9IC4gJykgJwogICAgICAgICAgICAuICRUaW1lOwogICAgICAgICRQYWdle0Zvb3RlckxlZnR9ID0gJFVybDsKICAgICAgICAkUGFnZXtQYWdlVGV4dH0gICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQYWdlJyk7CiAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSAgPSAxOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgcGRmIGRvY3VtZW50CiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Eb2N1bWVudE5ldygKICAgICAgICAgICAgVGl0bGUgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQcm9kdWN0JykgLiAnOiAnIC4gJFRpdGxlLAogICAgICAgICAgICBFbmNvZGUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIGZpcnN0IHBkZiBwYWdlCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICApOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKCiAgICAgICAgIyB0eXBlIG9mIHByaW50IHRhZwogICAgICAgIG15ICRQcmludFRhZyA9ICcnOwoKICAgICAgICAkUHJpbnRUYWcgPSAoJEFydGljbGVJRCkgPyAnQXJ0aWNsZScgOiAnVGlja2V0JzsKICAgICAgICAkUHJpbnRUYWcgPSAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRQcmludFRhZykgKSAuICcgJyAuCiAgICAgICAgICAgICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW50JykgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRQcmludFRhZywKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gOSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkJywKICAgICAgICAgICAgQWxpZ24gICAgPT4gJ3JpZ2h0JywKICAgICAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0SW5mb3MoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlckRhdGEgICAgICAgID0+IFwlVXNlckluZm8sCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRGF0YSA9PiBcJVJlc3BvbnNpYmxlSW5mbywKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRleHQgZmllbGRzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRGcmVlVGV4dCgKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgdGlja2V0IGZyZWV0aW1lIGZpZWxkcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0RnJlZVRpbWUoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGxpbmtlZCBvYmplY3RzCiAgICAgICAgaWYgKCVMaW5rRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dExpbmtlZE9iamVjdHMoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgTGlua0RhdGEgICAgID0+IFwlTGlua0RhdGEsCiAgICAgICAgICAgICAgICBMaW5rVHlwZUxpc3QgPT4gXCVMaW5rVHlwZUxpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBjdXN0b21lciBpbmZvcwogICAgICAgIGlmICglQ3VzdG9tZXJEYXRhKSB7CiAgICAgICAgICAgICRTZWxmLT5fUERGT3V0cHV0Q3VzdG9tZXJJbmZvcygKICAgICAgICAgICAgICAgIFBhZ2VEYXRhICAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgICAgICBDdXN0b21lckRhdGEgPT4gXCVDdXN0b21lckRhdGEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIG91dHB1dCBhcnRpY2xlcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0QXJ0aWNsZXMoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgID0+IFwlUGFnZSwKICAgICAgICAgICAgQXJ0aWNsZURhdGEgPT4gXEBBcnRpY2xlQm94LAogICAgICAgICk7CgogICAgICAgICMgcmV0dXJuIHRoZSBwZGYgZG9jdW1lbnQKICAgICAgICBteSAkRmlsZW5hbWUgPSAndGlja2V0XycgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgbXkgKCAkcywgJG0sICRoLCAkRCwgJE0sICRZICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICk7CiAgICAgICAgJE0gPSBzcHJpbnRmKCAiJTAyZCIsICRNICk7CiAgICAgICAgJEQgPSBzcHJpbnRmKCAiJTAyZCIsICREICk7CiAgICAgICAgJGggPSBzcHJpbnRmKCAiJTAyZCIsICRoICk7CiAgICAgICAgJG0gPSBzcHJpbnRmKCAiJTAyZCIsICRtICk7CiAgICAgICAgbXkgJFBERlN0cmluZyA9ICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnRPdXRwdXQoKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSAgICA9PiAkRmlsZW5hbWUgLiAiXyIgLiAiJFktJE0tJEQiIC4gIl8iIC4gIiRoLSRtLnBkZiIsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICJhcHBsaWNhdGlvbi9wZGYiLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkUERGU3RyaW5nLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnYXR0YWNobWVudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdlbmVyYXRlIGh0bWwgb3V0cHV0CiAgICBlbHNlIHsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50SGVhZGVyKCBWYWx1ZSA9PiAkVGlja2V0e1RpY2tldE51bWJlcn0gKTsKCiAgICAgICAgaWYgKCVMaW5rRGF0YSkgewoKICAgICAgICAgICAgIyBvdXRwdXQgbGluayBkYXRhCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdMaW5rJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGZvciBteSAkTGlua1R5cGVMaW5rRGlyZWN0aW9uICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJUxpbmtEYXRhICkgewoKICAgICAgICAgICAgICAgICMgaW52ZXN0aWdhdGUgbGluayB0eXBlIG5hbWUKICAgICAgICAgICAgICAgIG15IEBMaW5rRGF0YSA9IHNwbGl0IHF7Ojp9LCAkTGlua1R5cGVMaW5rRGlyZWN0aW9uOwoKICAgICAgICAgICAgICAgICMgb3V0cHV0IGxpbmsgdHlwZSBkYXRhCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUeXBlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTGlua1R5cGVOYW1lID0+ICRMaW5rVHlwZUxpc3R7ICRMaW5rRGF0YVswXSB9LT57ICRMaW5rRGF0YVsxXSAuICdOYW1lJyB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgZXh0cmFjdCBvYmplY3QgbGlzdAogICAgICAgICAgICAgICAgbXkgJE9iamVjdExpc3QgPSAkTGlua0RhdGF7JExpbmtUeXBlTGlua0RpcmVjdGlvbn07CgogICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE9iamVjdExpc3QtPnskT2JqZWN0fSB9ICkgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBvdXRwdXQgbGluayB0eXBlIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUeXBlUm93JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtTdHJnID0+ICRJdGVtLT57VGl0bGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIE1heCAgPT4gMTAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpY2tldAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9IVE1MTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBRdWV1ZUlEICAgICAgICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgIEFydGljbGVCb3ggICAgICA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgIFJlc3BvbnNpYmxlRGF0YSA9PiBcJVJlc3BvbnNpYmxlSW5mbywKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlVXNlckluZm8sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBhZGQgZm9vdGVyCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50Rm9vdGVyKCk7CgogICAgICAgICMgcmV0dXJuIG91dHB1dAogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX1BERk91dHB1dFRpY2tldEluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBUaWNrZXREYXRhIFVzZXJEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVUaWNrZXQgICA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVVzZXJJbmZvID0gJXsgJFBhcmFte1VzZXJEYXRhfSB9OwogICAgbXkgJVBhZ2UgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgICMgY3JlYXRlIGxlZnQgdGFibGUKICAgIG15ICRUYWJsZUxlZnQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU3RhdGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7U3RhdGV9ICksCiAgICAgICAgfSwKIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgIHsKIyAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdQcmlvcml0eScpIC4gJzonLAojICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7UHJpb3JpdHl9ICksCiMgICAgICAgIH0sCiMgLS0tCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUXVldWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtRdWV1ZX0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdMb2NrJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e0xvY2t9ICksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXN0b21lcklEJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7Q3VzdG9tZXJJRH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdPd25lcicpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e093bmVyfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFVzZXJJbmZve1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgICAgICAuICRVc2VySW5mb3tVc2VyTGFzdG5hbWV9IC4gJyknLAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHJlc3BvbnNpYmxlIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlID0gJy0nOwogICAgICAgIGlmICggJFRpY2tldHtSZXNwb25zaWJsZX0gKSB7CiAgICAgICAgICAgICRSZXNwb25zaWJsZQogICAgICAgICAgICAgICAgPSAkVGlja2V0e1Jlc3BvbnNpYmxlfSAuICcgKCcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAgICAgLiAkUGFyYW17UmVzcG9uc2libGVEYXRhfS0+e1VzZXJMYXN0bmFtZX0gLiAnKSc7CiAgICAgICAgfQogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdSZXNwb25zaWJsZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkUmVzcG9uc2libGUsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdHlwZSByb3csIGlmIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1R5cGUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUeXBlfSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlTGVmdH0sICRSb3cgKTsKICAgIH0KCiAgICAjIGFkZCBzZXJ2aWNlIGFuZCBzbGEgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgIG15ICRSb3dTZXJ2aWNlID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NlcnZpY2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtTZXJ2aWNlfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U2VydmljZSApOwogICAgICAgIG15ICRSb3dTTEEgPSB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnU0xBJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U0xBfSB8fCAnLScsCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93U0xBICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgbXkgJFRhYmxlTGVmdEV4dGVuZGVkID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcml0aWNhbGl0eScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0e0NyaXRpY2FsaXR5fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnSW1wYWN0JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXR7SW1wYWN0fSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUHJpb3JpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFRpY2tldHtQcmlvcml0eX0pLAogICAgICAgIH0sCiAgICBdOwogICAgcHVzaChAeyRUYWJsZUxlZnR9LCBAeyRUYWJsZUxlZnRFeHRlbmRlZH0pOwojIC0tLQoKICAgICMgY3JlYXRlIHJpZ2h0IHRhYmxlCiAgICBteSAkVGFibGVSaWdodCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBZ2UnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRUaWNrZXR7QWdlfSApLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0FjY291bnRlZCB0aW1lJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0VGltZVVuaXRzfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1BlbmRpbmcgdGlsbCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1BlbmRpbmdVbnRpbH0sCiAgICAgICAgfSwKICAgIF07CgogICAgIyBhZGQgZmlyc3QgcmVzcG9uc2UgdGltZSByb3cKICAgIGlmICggZGVmaW5lZCggJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnRmlyc3QgUmVzcG9uc2UgVGltZScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZVNob3J0eyIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgKSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgdXBkYXRlIHRpbWUgcm93CiAgICBpZiAoIGRlZmluZWQoICRUaWNrZXR7VXBkYXRlVGltZX0gKSApIHsKICAgICAgICBteSAkUm93ID0gewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVXBkYXRlIFRpbWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifScsCiAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJVRpY2tldCwKICAgICAgICAgICAgKSwKICAgICAgICB9OwogICAgICAgIHB1c2goIEB7JFRhYmxlUmlnaHR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgc29sdXRpb24gdGltZSByb3cKICAgIGlmICggZGVmaW5lZCggJFRpY2tldHtTb2x1dGlvblRpbWV9ICkgKSB7CiAgICAgICAgbXkgJFJvdyA9IHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NvbHV0aW9uIFRpbWUnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVTaG9ydHsiJFFEYXRheyJTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgICAgID0+IFwlVGlja2V0LAogICAgICAgICAgICApLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVSaWdodH0sICRSb3cgKTsKICAgIH0KCiAgICBteSAkUm93cyA9IEB7JFRhYmxlTGVmdH07CiAgICBpZiAoIEB7JFRhYmxlUmlnaHR9ID4gJFJvd3MgKSB7CiAgICAgICAgJFJvd3MgPSBAeyRUYWJsZVJpZ2h0fTsKICAgIH0KCiAgICBteSAlVGFibGVQYXJhbTsKICAgIGZvciBteSAkUm93ICggMSAuLiAkUm93cyApIHsKICAgICAgICAkUm93LS07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVMZWZ0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57VmFsdWV9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtDb250ZW50fSAgICAgICAgID0gJyAnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsyXXtCYWNrZ3JvdW5kQ29sb3J9ID0gJyNGRkZGRkYnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e0tleX07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzNde0ZvbnR9ICAgICAgICAgICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzRde0NvbnRlbnR9ICAgICAgICAgPSAkVGFibGVSaWdodC0+WyRSb3ddLT57VmFsdWV9OwogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gMTcwLjU7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsyXXtXaWR0aH0gPSA0OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bM117V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVs0XXtXaWR0aH0gPSAxNzAuNTsKCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgICAgICA9ICdDdXQnOwogICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICAgICAgPSAwOwogICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yRXZlbn0gPSAnI0FBQUFBQSc7CiAgICAkVGFibGVQYXJhbXtCYWNrZ3JvdW5kQ29sb3JPZGR9ICA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgICAgID0gMTsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdUb3B9ICAgICAgICAgID0gMzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmdCb3R0b219ICAgICAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRMaW5rZWRPYmplY3RzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBMaW5rRGF0YSBMaW5rVHlwZUxpc3QpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVQYWdlICAgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKICAgIG15ICVUeXBlTGlzdCA9ICV7ICRQYXJhbXtMaW5rVHlwZUxpc3R9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwoKICAgIGZvciBteSAkTGlua1R5cGVMaW5rRGlyZWN0aW9uICggc29ydCB7IGxjICRhIGNtcCBsYyAkYiB9IGtleXMgJXsgJFBhcmFte0xpbmtEYXRhfSB9ICkgewoKICAgICAgICAjIGludmVzdGlnYXRlIGxpbmsgdHlwZSBuYW1lCiAgICAgICAgbXkgQExpbmtEYXRhID0gc3BsaXQgcXs6On0sICRMaW5rVHlwZUxpbmtEaXJlY3Rpb247CiAgICAgICAgbXkgJExpbmtUeXBlTmFtZSA9ICRUeXBlTGlzdHsgJExpbmtEYXRhWzBdIH0tPnsgJExpbmtEYXRhWzFdIC4gJ05hbWUnIH07CiAgICAgICAgJExpbmtUeXBlTmFtZSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRMaW5rVHlwZU5hbWUpOwoKICAgICAgICAjIGRlZmluZSBoZWFkbGluZQogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSA9ICRMaW5rVHlwZU5hbWUgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICcnOwoKICAgICAgICAjIGV4dHJhY3Qgb2JqZWN0IGxpc3QKICAgICAgICBteSAkT2JqZWN0TGlzdCA9ICRQYXJhbXtMaW5rRGF0YX0tPnskTGlua1R5cGVMaW5rRGlyZWN0aW9ufTsKCiAgICAgICAgZm9yIG15ICRPYmplY3QgKCBzb3J0IHsgbGMgJGEgY21wIGxjICRiIH0ga2V5cyAleyRPYmplY3RMaXN0fSApIHsKCiAgICAgICAgICAgIGZvciBteSAkSXRlbSAoIEB7ICRPYmplY3RMaXN0LT57JE9iamVjdH0gfSApIHsKCiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gfHw9ICcnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEl0ZW0tPntUaXRsZX0gfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGludWUgewogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICBZICAgID0+IC0xNSwKICAgICk7CgogICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTGlua2VkIE9iamVjdHMnKSwKICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICk7CgogICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgIFkgICAgPT4gLTQsCiAgICApOwoKICAgICMgdGFibGUgcGFyYW1zCiAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAkVGFibGVQYXJhbXtCb3JkZXJ9ICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICRUYWJsZVBhcmFte1BhZGRpbmd9ICAgICAgICAgPSAxOwogICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAjIG91dHB1dCB0YWJsZQogICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICVUYWJsZVBhcmFtID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0sICk7CgogICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICBsYXN0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5QYWdlTmV3KAogICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRQYWdle1BhZ2VDb3VudH0rKzsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RnJlZVRleHQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkQ291bnQgZXEgMTMgfHwgJENvdW50IGVxIDE0KSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIGlmICggJFRpY2tldHsiVGlja2V0RnJlZVRleHQkQ291bnQifSBuZSAiIiApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZUtleSRDb3VudCJ9IC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRUaWNrZXR7IlRpY2tldEZyZWVUZXh0JENvdW50In07CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGV4dAogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRleHQnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RnJlZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRUaWNrZXR7IlRpY2tldEZyZWVUaW1lJENvdW50In0gKSB7CiAgICAgICAgICAgIG15ICRUaWNrZXRGcmVlVGltZUtleSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICkKICAgICAgICAgICAgICAgIHx8ICcnOwogICAgICAgICAgICBteSAkVGlja2V0RnJlZVRpbWUgPSAkVGlja2V0eyJUaWNrZXRGcmVlVGltZSRDb3VudCJ9OwoKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXRGcmVlVGltZUtleSkgLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRGcmVlVGltZSA9PiAkVGlja2V0RnJlZVRpbWUsIH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgICRPdXRwdXQgPSAxOwogICAgICAgIH0KICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGltZQogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRpbWUnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0Q3VzdG9tZXJJbmZvcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgQ3VzdG9tZXJEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICRPdXRwdXQgICAgICAgPSAwOwogICAgbXkgJUN1c3RvbWVyRGF0YSA9ICV7ICRQYXJhbXtDdXN0b21lckRhdGF9IH07CiAgICBteSAlUGFnZSAgICAgICAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwogICAgbXkgJVRhYmxlUGFyYW07CiAgICBteSAkUm93ID0gMDsKICAgIG15ICRNYXAgPSAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntNYXB9OwoKICAgICMgY2hlY2sgaWYgY3VzdG9tZXIgY29tcGFueSBzdXBwb3J0IGlzIGVuYWJsZWQKICAgIGlmICggJEN1c3RvbWVyRGF0YXtDb25maWd9LT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0gKSB7CiAgICAgICAgbXkgJE1hcDIgPSAkQ3VzdG9tZXJEYXRhe0NvbXBhbnlDb25maWd9LT57TWFwfTsKICAgICAgICBpZiAoJE1hcDIpIHsKICAgICAgICAgICAgcHVzaCggQHskTWFwfSwgQHskTWFwMn0gKTsKICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJEZpZWxkICggQHskTWFwfSApIHsKICAgICAgICBpZiAoICR7JEZpZWxkfVszXSAmJiAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfSApIHsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkeyRGaWVsZH1bMV0gKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQ3VzdG9tZXJEYXRheyAkeyRGaWVsZH1bMF0gfTsKCiAgICAgICAgICAgICRSb3crKzsKICAgICAgICAgICAgJE91dHB1dCA9IDE7CiAgICAgICAgfQogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXIgSW5mb3JtYXRpb24nKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0QXJ0aWNsZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIEFydGljbGVEYXRhKSkgewogICAgICAgIGlmICggIWRlZmluZWQoICRQYXJhbXskTmVlZGVkfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkTmVlZGVkISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIG15ICVQYWdlID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICRBcnRpY2xlQ291bnRlciA9IDE7CiAgICBmb3IgbXkgJEFydGljbGVUbXAgKCBAeyAkUGFyYW17QXJ0aWNsZURhdGF9IH0gKSB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZUNvdW50ZXIgPT0gMSApIHsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG91dHB1dCBoZWFkbGluZQogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQXJ0aWNsZXMnKSwKICAgICAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgICAgIFkgICAgPT4gMiwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgbXkgJEF0dGFjaG1lbnRzOwogICAgICAgIGZvciBteSAkRmlsZUlEICgga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRBdHRhY2htZW50cyAuPSAkRmlsZXtGaWxlbmFtZX0gLiAnICgnIC4gJEZpbGV7RmlsZXNpemV9IC4gIilcbiI7CiAgICAgICAgfQoKICAgICAgICAkQXJ0aWNsZXsnQWNjb3VudGVkIHRpbWUnfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2VuZXJhdGUgYXJ0aWNsZSBpbmZvIHRhYmxlCiAgICAgICAgbXkgJVRhYmxlUGFyYW0xOwogICAgICAgIG15ICRSb3cgPSAwOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIGFydGljbGUgbnVtYmVyIHRhZwogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJyAgICAjICcgLiAkQXJ0aWNsZUNvdW50ZXIsCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAyLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyICggJ0Zyb20nLCAnVG8nLCAnQ2MnLCAnQWNjb3VudGVkIHRpbWUnLCAnU3ViamVjdCcsICkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xleyRQYXJhbWV0ZXJ9ICkgewogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFBhcmFtZXRlcikgLiAnOic7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBcnRpY2xleyRQYXJhbWV0ZXJ9OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JlYXRlZCcpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0nLAogICAgICAgICAgICBEYXRhICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgKTsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9CiAgICAgICAgICAgIC49ICcgJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdieScpOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRBcnRpY2xle1NlbmRlclR5cGV9ICk7CiAgICAgICAgJFJvdysrOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CgogICAgICAgICAgICBpZiAoICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkQ291bnQifSApIHsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkQ291bnQifSAuICc6JzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRDb3VudCJ9OwogICAgICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1R5cGUnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJEFydGljbGV7QXJ0aWNsZVR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICBpZiAoJEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnQnKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgY2hvbXAoJEF0dGFjaG1lbnRzKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBdHRhY2htZW50czsKICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zIChhcnRpY2xlIGluZm9zKQogICAgICAgICRUYWJsZVBhcmFtMXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbTF7QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKGFydGljbGUgaW5mb3MpCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0xID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0xLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0xe1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBib2R5KQogICAgICAgIG15ICVUYWJsZVBhcmFtMjsKICAgICAgICAkVGFibGVQYXJhbTJ7Q2VsbERhdGF9WzBdWzBde0NvbnRlbnR9ID0gJEFydGljbGV7Qm9keX0gfHwgJyAnOwogICAgICAgICRUYWJsZVBhcmFtMntUeXBlfSAgICAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTJ7Qm9yZGVyfSAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udH0gICAgICAgICAgICAgICAgICAgID0gJ01vbm9zcGFjZWQnOwogICAgICAgICRUYWJsZVBhcmFtMntGb250U2l6ZX0gICAgICAgICAgICAgICAgPSA3OwogICAgICAgICRUYWJsZVBhcmFtMntCYWNrZ3JvdW5kQ29sb3J9ICAgICAgICAgPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmd9ICAgICAgICAgICAgICAgICA9IDQ7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmdUb3B9ICAgICAgICAgICAgICA9IDg7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmdCb3R0b219ICAgICAgICAgICA9IDg7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGJvZHkpCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0yID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0yLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0ye1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRBcnRpY2xlQ291bnRlcisrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSFRNTE1hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG91dHB1dCByZXNwb25zaWJsZSwgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgbXkgJFJlc3BvbnNpYmxlID0gJy0nOwogICAgICAgIGlmICggJFBhcmFte1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgJFJlc3BvbnNpYmxlCiAgICAgICAgICAgICAgICA9ICRQYXJhbXtSZXNwb25zaWJsZX0gLiAnICgnCiAgICAgICAgICAgICAgICAuICRQYXJhbXtSZXNwb25zaWJsZURhdGF9LT57VXNlckZpcnN0bmFtZX0gLiAnICcKICAgICAgICAgICAgICAgIC4gJFBhcmFte1Jlc3BvbnNpYmxlRGF0YX0tPntVc2VyTGFzdG5hbWV9IC4gJyknOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4geyBSZXNwb25zaWJsZVN0cmluZyA9PiAkUmVzcG9uc2libGUsIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIG91dHB1dCB0eXBlLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmljZSBhbmQgc2xhLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFBhcmFte1NlcnZpY2V9IHx8ICctJywKICAgICAgICAgICAgICAgIFNMQSAgICAgPT4gJFBhcmFte1NMQX0gICAgIHx8ICctJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IGZpcnN0IHJlc3BvbnNlIHRpbWUKICAgIGlmICggZGVmaW5lZCggJFBhcmFte0ZpcnN0UmVzcG9uc2VUaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHVwZGF0ZSB0aW1lCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtVcGRhdGVUaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1VwZGF0ZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc29sdXRpb24gdGltZQogICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17U29sdXRpb25UaW1lfSApICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyBhbmQgMTQKICAgICAgICBpZiAoJENvdW50IGVxIDEzIHx8ICRDb3VudCBlcSAxNCkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBpZiAoICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFBhcmFte0FydGljbGVJRH0gfHwgJyc7CiAgICBteSBAQXJ0aWNsZUJveCA9IEB7ICRQYXJhbXtBcnRpY2xlQm94fSB9OwoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgZ2V0IGF0dGFjaG1lbnQgc3RyaW5nCiAgICAgICAgbXkgJUF0bUluZGV4ID0gKCk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSApIHsKICAgICAgICAgICAgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICB9CiAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfSA9ICcnOwogICAgICAgIGZvciBteSAkRmlsZUlEICgga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgIG15ICVGaWxlID0gJXsgJEF0bUluZGV4eyRGaWxlSUR9IH07CiAgICAgICAgICAgICRGaWxle0ZpbGVuYW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCggVGV4dCA9PiAkRmlsZXtGaWxlbmFtZX0gKTsKICAgICAgICAgICAgJFBhcmFteydBcnRpY2xlOjpBVE0nfQogICAgICAgICAgICAgICAgLj0gJzxhIGhyZWY9IiRFbnZ7IkNHSUhhbmRsZSJ9LyRRRGF0YXsiRmlsZW5hbWUifT9BY3Rpb249QWdlbnRUaWNrZXRBdHRhY2htZW50JicKICAgICAgICAgICAgICAgIC4gIkFydGljbGVJRD0kQXJ0aWNsZXtBcnRpY2xlSUR9O0ZpbGVJRD0kRmlsZUlEXCIgdGFyZ2V0PVwiYXR0YWNobWVudFwiICIKICAgICAgICAgICAgICAgIC4gIm9ubW91c2VvdmVyPVwid2luZG93LnN0YXR1cz0nXCRUZXh0e1wiRG93bmxvYWRcIn06ICRGaWxle0ZpbGVuYW1lfSc7IgogICAgICAgICAgICAgICAgLiAnIHJldHVybiB0cnVlOyIgb25tb3VzZW91dD0id2luZG93LnN0YXR1cz1cJ1wnOyI+JwogICAgICAgICAgICAgICAgLiAiJEZpbGV7RmlsZW5hbWV9PC9hPiAkRmlsZXtGaWxlc2l6ZX08YnIvPiI7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGp1c3QgYSBvbmx5IGh0bWwgZW1haWwKICAgICAgICBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgKTsKICAgICAgICBpZiAoJE1pbWVUeXBlVGV4dCkgewogICAgICAgICAgICAkUGFyYW17VGV4dE5vdGV9ID0gJE1pbWVUeXBlVGV4dDsKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gICA9ICcnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgICAgICRBcnRpY2xle0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgTmV3TGluZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdOZXdMaW5lJyksCiAgICAgICAgICAgICAgICBUZXh0ICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgVk1heCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRGVmYXVsdFZpZXdMaW5lcycpIHx8IDUwMDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIGNoYXJzZXQgY2hlY2sKICAgICAgICAgICAgbXkgJENoYXJzZXRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja0NoYXJzZXQoCiAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCBBY3Rpb24gPT4gJ0FnZW50VGlja2V0Wm9vbScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDaGFyc2V0VGV4dCkgewogICAgICAgICAgICAgICAgJFBhcmFteydBcnRpY2xlOjpUZXh0Tm90ZSd9ID0gJENoYXJzZXRUZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CgogICAgICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JFBhcmFtZXRlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRQYXJhbWV0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYWNjb3VudGVkIGFydGljbGUgdGltZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Wm9vbVRpbWVEaXNwbGF5JykgKSB7CiAgICAgICAgICAgIG15ICRBcnRpY2xlVGltZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUFjY291bnRlZFRpbWVHZXQoCiAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gIlJvdyIsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnVGltZScsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGVUaW1lLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRDb3VudCJ9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkQ291bnQifSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCRDb3VudCJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTEgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFpvb20ucG0sdiAxLjIxIDIwMTEvMDEvMTIgMTY6Mzk6MjIgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0Wm9vbS5wbSx2IDEuMTQ0IDIwMTEvMDEvMTEgMjM6MTE6NTEgbXAgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFRpY2tldFpvb207Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0Owp1c2UgS2VybmVsOjpTeXN0ZW06OkVtYWlsUGFyc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3M7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwojIC0tLQoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4yMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgVXNlck9iamVjdCBTZXNzaW9uT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzZXQgZGVidWcKICAgICRTZWxmLT57RGVidWd9ID0gMDsKCiAgICAjIGdldCBwYXJhbXMKICAgICRTZWxmLT57QXJ0aWNsZUlEfSAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwogICAgJFNlbGYtPntab29tRXhwYW5kfSAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tRXhwYW5kJyApOwogICAgJFNlbGYtPntab29tRXhwYW5kU29ydH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdab29tRXhwYW5kU29ydCcgKTsKICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kfSApIHsKICAgICAgICAkU2VsZi0+e1pvb21FeHBhbmR9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21FeHBhbmQnKTsKICAgIH0KICAgIGlmICggIWRlZmluZWQgJFNlbGYtPntab29tRXhwYW5kU29ydH0gKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kU29ydH0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Wm9vbUV4cGFuZFNvcnQnKTsKICAgIH0KICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0KICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpUaWNrZXRBcnRpY2xlRmlsdGVyJyk7CgogICAgIyBkZWZpbmUgaWYgcmljaCB0ZXh0IHNob3VsZCBiZSB1c2VkCiAgICAkU2VsZi0+e1JpY2hUZXh0fQogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Olpvb21SaWNoVGV4dEZvcmNlJykKICAgICAgICB8fCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9CiAgICAgICAgfHwgMDsKCiAgICAjIHN0cmlwIGh0bWwgYW5kIGFzY2lpIGF0dGFjaG1lbnRzIG9mIGNvbnRlbnQKICAgICRTZWxmLT57U3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnR9ID0gMTsKCiAgICAjIGNoZWNrIGlmIHJpY2ggdGV4dCBpcyBlbmFibGVkLCBpZiBub3Qgb25seSBzdGlwIGFzY2lpIGF0dGFjaG1lbnRzCiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSApIHsKICAgICAgICAkU2VsZi0+e1N0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50fSA9IDI7CiAgICB9CgogICAgIyB0aWNrZXQgaWQgbG9va3VwCiAgICBpZiAoICEkU2VsZi0+e1RpY2tldElEfSAmJiAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUaWNrZXROdW1iZXInICkgKSB7CiAgICAgICAgJFNlbGYtPntUaWNrZXRJRH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldElETG9va3VwKAogICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGlja2V0TnVtYmVyJyApLAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57TGlua09iamVjdH0gICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3lzdGVtQWRkcmVzc30gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICk7CgogICAgIyBlcnJvciBzY3JlZW4sIGRvbid0IHNob3cgdGlja2V0CiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vUGVybWlzc2lvbiggV2l0aEhlYWRlciA9PiAneWVzJyApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBhdHRyaWJ1dGVzCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgIyBnZXQgYWNrIGFjdGlvbnMKICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNsKAogICAgICAgIERhdGEgICAgICAgICAgPT4gJy0nLAogICAgICAgIEFjdGlvbiAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgIFRpY2tldElEICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBtYXJrIHNob3duIGFydGljbGUgYXMgc2VlbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ01hcmtBc1NlZW4nICkgewogICAgICAgIG15ICRTdWNjZXNzID0gJFNlbGYtPl9BcnRpY2xlSXRlbVNlZW4oIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0gKTsKCiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvaHRtbCcsCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRTdWNjZXNzLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICMgYXJ0aWNsZSB1cGRhdGUKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcnRpY2xlVXBkYXRlJyApIHsKICAgICAgICBteSAkQ291bnQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb3VudCcgKTsKICAgICAgICBteSAlQXJ0aWNsZSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUdldCggQXJ0aWNsZUlEID0+ICRTZWxmLT57QXJ0aWNsZUlEfSApOwogICAgICAgICRBcnRpY2xle0NvdW50fSA9ICRDb3VudDsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBpbmRleCAod2l0aG91dCBhdHRhY2htZW50cykKICAgICAgICBteSAlQXRtSW5kZXggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVBdHRhY2htZW50SW5kZXgoCiAgICAgICAgICAgIEFydGljbGVJRCAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gJFNlbGYtPntTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudH0sCiAgICAgICAgICAgIEFydGljbGUgICAgICAgICAgICAgICAgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7QXRtc30gPSBcJUF0bUluZGV4OwoKICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcwogICAgICAgIG15ICVTdGFuZGFyZFJlc3BvbnNlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRTdGFuZGFyZFJlc3BvbnNlcygKICAgICAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb250ZW50ID0gJFNlbGYtPl9BcnRpY2xlSXRlbSgKICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIEFydGljbGUgICAgICAgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzID0+IFwlU3RhbmRhcmRSZXNwb25zZXMsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdPbkxvYWQnLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJENvbnRlbnQgKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gIkNhbid0IGdldCBmb3IgQXJ0aWNsZUlEICRTZWxmLT57QXJ0aWNsZUlEfSEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAndGV4dC9odG1sJywKICAgICAgICAgICAgQ2hhcnNldCAgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQ29udGVudCwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHdyaXRlIGFydGljbGUgZmlsdGVyIHNldHRpbmdzIHRvIHNlc3Npb24KICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdBcnRpY2xlRmlsdGVyU2V0JyApIHsKCiAgICAgICAgIyBnZXQgcGFyYW1zCiAgICAgICAgbXkgJFRpY2tldElEICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1RpY2tldElEJyApOwogICAgICAgIG15ICRTYXZlRGVmYXVsdHMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdTYXZlRGVmYXVsdHMnICk7CiAgICAgICAgbXkgQEFydGljbGVUeXBlRmlsdGVySURzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnQXJ0aWNsZVR5cGVGaWx0ZXInICk7CiAgICAgICAgbXkgQEFydGljbGVTZW5kZXJUeXBlRmlsdGVySURzCiAgICAgICAgICAgID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInICk7CgogICAgICAgICMgYnVpbGQgc2Vzc2lvbiBzdHJpbmcKICAgICAgICBteSAkU2Vzc2lvblN0cmluZyA9ICcnOwogICAgICAgIGlmIChAQXJ0aWNsZVR5cGVGaWx0ZXJJRHMpIHsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJ0FydGljbGVUeXBlRmlsdGVyPCc7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49IGpvaW4gJywnLCBAQXJ0aWNsZVR5cGVGaWx0ZXJJRHM7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nIC49ICc+JzsKICAgICAgICB9CiAgICAgICAgaWYgKEBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcklEcykgewogICAgICAgICAgICAkU2Vzc2lvblN0cmluZyAuPSAnQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXI8JzsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gam9pbiAnLCcsIEBBcnRpY2xlU2VuZGVyVHlwZUZpbHRlcklEczsKICAgICAgICAgICAgJFNlc3Npb25TdHJpbmcgLj0gJz4nOwogICAgICAgIH0KCiAgICAgICAgIyB3cml0ZSB0aGUgc2Vzc2lvbgoKICAgICAgICAjIHNhdmUgZGVmYXVsdCBmaWx0ZXIgc2V0dGluZ3MgdG8gdXNlciBwcmVmZXJlbmNlcwogICAgICAgIGlmICgkU2F2ZURlZmF1bHRzKSB7CiAgICAgICAgICAgICRTZWxmLT57VXNlck9iamVjdH0tPlNldFByZWZlcmVuY2VzKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEtleSAgICA9PiAnQXJ0aWNsZUZpbHRlckRlZmF1bHQnLAogICAgICAgICAgICAgICAgVmFsdWUgID0+ICRTZXNzaW9uU3RyaW5nLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICAgICAgS2V5ICAgICAgID0+ICdBcnRpY2xlRmlsdGVyRGVmYXVsdCcsCiAgICAgICAgICAgICAgICBWYWx1ZSAgICAgPT4gJFNlc3Npb25TdHJpbmcsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHR1cm4gb2ZmIGZpbHRlciBleHBsaWNpdGx5IGZvciB0aGlzIHRpY2tldAogICAgICAgIGlmICggJFNlc3Npb25TdHJpbmcgZXEgJycgKSB7CiAgICAgICAgICAgICRTZXNzaW9uU3RyaW5nID0gJ29mZic7CiAgICAgICAgfQoKICAgICAgICAjIHVwZGF0ZSB0aGUgc2Vzc2lvbgogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1Nlc3Npb25PYmplY3R9LT5VcGRhdGVTZXNzaW9uSUQoCiAgICAgICAgICAgIFNlc3Npb25JRCA9PiAkU2VsZi0+e1Nlc3Npb25JRH0sCiAgICAgICAgICAgIEtleSAgICAgICA9PiAiQXJ0aWNsZUZpbHRlciRUaWNrZXRJRCIsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2Vzc2lvblN0cmluZywKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgbXkgJEpTT04gPSAnJzsKICAgICAgICBpZiAoJFVwZGF0ZSkgewogICAgICAgICAgICAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0FydGljbGUgZmlsdGVyIHNldHRpbmdzIHdlcmUgc2F2ZWQuJywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNlbmQgSlNPTiByZXNwb25zZQogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzdG9yZSBsYXN0IHNjcmVlbgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gbmUgJ1Nob3dIVE1MZU1haWwnICkgewogICAgICAgICRTZWxmLT57U2Vzc2lvbk9iamVjdH0tPlVwZGF0ZVNlc3Npb25JRCgKICAgICAgICAgICAgU2Vzc2lvbklEID0+ICRTZWxmLT57U2Vzc2lvbklEfSwKICAgICAgICAgICAgS2V5ICAgICAgID0+ICdMYXN0U2NyZWVuVmlldycsCiAgICAgICAgICAgIFZhbHVlICAgICA9PiAkU2VsZi0+e1JlcXVlc3RlZFVSTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcKICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBmaWx0ZXIgc2V0dGluZ3MgZnJvbSBzZXNzaW9uIHN0cmluZwogICAgICAgIG15ICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57ICdBcnRpY2xlRmlsdGVyJyAuICRTZWxmLT57VGlja2V0SUR9IH07CgogICAgICAgICMgc2V0IGFydGljbGUgZmlsdGVyIGZvciB0aGlzIHRpY2tldCBmcm9tIHVzZXIgcHJlZmVyZW5jZXMKICAgICAgICBpZiAoICEkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgKSB7CiAgICAgICAgICAgICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9ICRTZWxmLT57QXJ0aWNsZUZpbHRlckRlZmF1bHR9OwogICAgICAgIH0KCiAgICAgICAgIyBkbyBub3QgdXNlIGRlZmF1bHRzIGZvciB0aGlzIHRpY2tldCBpZiBmaWx0ZXIgd2FzIGV4cGxpY2l0bHkgdHVybmVkIG9mZgogICAgICAgIGVsc2lmICggJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nIGVxICdvZmYnICkgewogICAgICAgICAgICAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgPSAnJzsKICAgICAgICB9CgogICAgICAgICMgZXh0cmFjdCBBcnRpY2xlVHlwZUlEcwogICAgICAgIGlmICgKICAgICAgICAgICAgJEFydGljbGVGaWx0ZXJTZXNzaW9uU3RyaW5nCiAgICAgICAgICAgICYmICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZyA9fiBteyBBcnRpY2xlVHlwZUZpbHRlciA8ICggW148Pl0rICkgPiB9eG1zCiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIG15IEBJRHMgPSBzcGxpdCAvLC8sICQxOwogICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0gPSB7IG1hcCB7ICRfID0+IDEgfSBASURzIH07CiAgICAgICAgfQoKICAgICAgICAjIGV4dHJhY3QgQXJ0aWNsZVNlbmRlclR5cGVJRHMKICAgICAgICBpZiAoCiAgICAgICAgICAgICRBcnRpY2xlRmlsdGVyU2Vzc2lvblN0cmluZwogICAgICAgICAgICAmJiAkQXJ0aWNsZUZpbHRlclNlc3Npb25TdHJpbmcgPX4gbXsgQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXIgPCAoIFtePD5dKyApID4gfXhtcwogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSBASURzID0gc3BsaXQgLywvLCAkMTsKICAgICAgICAgICAgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1NlbmRlclR5cGVJRH0gPSB7IG1hcCB7ICRfID0+IDEgfSBASURzIH07CiAgICAgICAgfQogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICMgbG9va3VwIGNyaXRpY2FsaXR5CiAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICctJzsKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTN9KSB7CiAgICAgICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICRDcml0aWNhbGl0eUxpc3QtPnskVGlja2V0e1RpY2tldEZyZWVUZXh0MTN9fTsKICAgIH0KCiAgICAjIGxvb2t1cCBpbXBhY3QKICAgICRUaWNrZXR7SW1wYWN0fSA9ICctJzsKICAgIGlmICgkVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0ltcGFjdH0gPSAkSW1wYWN0TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH19OwogICAgfQojIC0tLQoKICAgICMgcmV0dXJuIGlmIEhUTUwgZW1haWwKICAgIGlmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdTaG93SFRNTGVNYWlsJyApIHsKCiAgICAgICAgIyBjaGVjayBuZWVkZWQgQXJ0aWNsZUlECiAgICAgICAgaWYgKCAhJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBBcnRpY2xlSUQhJyApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYXJ0aWNsZSBkYXRhCiAgICAgICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoIEFydGljbGVJRCA9PiAkU2VsZi0+e0FydGljbGVJRH0gKTsKCiAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIGRhdGEgZXhpc3RzCiAgICAgICAgaWYgKCAhJUFydGljbGUgKSB7CiAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCBNZXNzYWdlID0+ICdJbnZhbGlkIEFydGljbGVJRCEnICk7CiAgICAgICAgfQoKICAgICAgICAjIGlmIGl0IGlzIGEgaHRtbCBlbWFpbCwgcmV0dXJuIGhlcmUKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykKICAgICAgICAgICAgICAgIC4gIi0kQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LSRBcnRpY2xle1RpY2tldElEfS0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICIkQXJ0aWNsZXtNaW1lVHlwZX07IGNoYXJzZXQ9JEFydGljbGV7Q2hhcnNldH0iLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSApOwogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKICAgICRPdXRwdXQgLj0gJFNlbGYtPk1hc2tBZ2VudFpvb20oIFRpY2tldCA9PiBcJVRpY2tldCwgQWNsQWN0aW9uID0+IFwlQWNsQWN0aW9uICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIE1hc2tBZ2VudFpvb20gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGlja2V0ICAgID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVBY2xBY3Rpb24gPSAleyAkUGFyYW17QWNsQWN0aW9ufSB9OwoKICAgICMgZWxzZSBzaG93IG5vcm1hbCB0aWNrZXQgem9vbSB2aWV3CiAgICAjIGZldGNoIGFsbCBtb3ZlIHF1ZXVlcwogICAgbXkgJU1vdmVRdWV1ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk1vdmVMaXN0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gcmVzcG9uc2VzCiAgICBteSAlU3RhbmRhcmRSZXNwb25zZXMKICAgICAgICA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRTdGFuZGFyZFJlc3BvbnNlcyggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CgogICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KCVUaWNrZXQpOwoKICAgICMgb3duZXIgaW5mbwogICAgbXkgJU93bmVySW5mbyA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkVGlja2V0e093bmVySUR9LAogICAgKTsKCiAgICAjIHJlc3BvbnNpYmxlIGluZm8KICAgIG15ICVSZXNwb25zaWJsZUluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJFRpY2tldHtSZXNwb25zaWJsZUlEfSB8fCAxLAogICAgKTsKCiAgICAjIGdlbmVyYXRlIHNob3duIGFydGljbGVzCgogICAgIyBnZXQgY29udGVudAogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPT4gJFNlbGYtPntTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudH0sCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGFkZCBjb3VudGVyCiAgICBteSAkQ291bnQgPSAwOwogICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewogICAgICAgICRDb3VudCsrOwogICAgICAgICRBcnRpY2xlLT57Q291bnR9ID0gJENvdW50OwogICAgfQoKICAgICMgZ2V0IHNlbGVjdGVkIG9yIGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgbXkgJEFydGljbGVJRDsKICAgIGlmICggJFNlbGYtPntBcnRpY2xlSUR9ICkgewogICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e0FydGljbGVJRH07CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyBmaW5kIGxhdGVzdCBub3Qgc2VlbiBhcnRpY2xlCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUKICAgICAgICAgICAgbmV4dCBBUlRJQ0xFCiAgICAgICAgICAgICAgICBpZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJykKICAgICAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZS0+e1NlbmRlclR5cGV9IGVxICdzeXN0ZW0nOwoKICAgICAgICAgICAgIyBnZXQgYXJ0aWNsZSBmbGFncwogICAgICAgICAgICBteSAlQXJ0aWNsZUZsYWcgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgQVJUSUNMRSBpZiAkQXJ0aWNsZUZsYWd7U2Vlbn07CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZS0+e0FydGljbGVJRH07CiAgICAgICAgICAgIGxhc3QgQVJUSUNMRTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHNlbGVjdGVkIGFydGljbGUKICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICBpZiAoIEBBcnRpY2xlQm94ICYmICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdub3JtYWwnICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGZpcnN0IGFydGljbGUgYXMgZGVmYXVsdCBpZiBub3JtYWwgc29ydAogICAgICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xlQm94WzBdLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIEBBcnRpY2xlQm94ICYmICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdyZXZlcnNlJyApIHsKCiAgICAgICAgICAgICAgICAjIHNldCBsYXN0IGFydGljbGUgYXMgZGVmYXVsdCBpZiByZXZlcnNlIHNvcnQKICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZUJveFskI0FydGljbGVCb3hdLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlIGFzIHNlbGVjdGVkIGFydGljbGUgcmVwbGFjaW5nIGxhc3Qgc2V0CiAgICAgICAgICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICAgICAgICAgIGlmICggJEFydGljbGVUbXAtPntTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkQXJ0aWNsZVRtcC0+e0FydGljbGVJRH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyByZW1lbWJlciBzaG93biBhcnRpY2xlIGlkcyBpZiBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gJiYgJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApIHsKCiAgICAgICAgIyByZXNldCBzaG93biBhcnRpY2xlIGlkcwogICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9ID0gdW5kZWY7CgogICAgICAgIG15ICROZXdBcnRpY2xlSUQgPSAnJzsKICAgICAgICBteSAkQ291bnQgICAgICAgID0gMDsKCiAgICAgICAgQVJUSUNMRToKICAgICAgICBmb3IgbXkgJEFydGljbGUgKEBBcnRpY2xlQm94KSB7CgogICAgICAgICAgICAjIGFydGljbGUgdHlwZSBpZCBkb2VzIG5vdCBtYXRjaAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0KICAgICAgICAgICAgICAgICYmICEkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57QXJ0aWNsZVR5cGVJRH0tPnsgJEFydGljbGUtPntBcnRpY2xlVHlwZUlEfSB9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhcnRpY2xlIHNlbmRlciB0eXBlIGlkIGRvZXMgbm90IG1hdGNoCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTZW5kZXJUeXBlSUR9CiAgICAgICAgICAgICAgICAmJiAhJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1NlbmRlclR5cGVJRH0tPnsgJEFydGljbGUtPntTZW5kZXJUeXBlSUR9IH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmV4dCBBUlRJQ0xFOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNvdW50IHNob3duIGFydGljbGVzCiAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgIyByZW1lbWJlciBhcnRpY2xlIGlkCiAgICAgICAgICAgICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSB9ID0gMTsKCiAgICAgICAgICAgICMgc2V0IGFydGljbGUgaWQgdG8gZmlyc3Qgc2hvd24gYXJ0aWNsZQogICAgICAgICAgICBpZiAoICRDb3VudCA9PSAxICkgewogICAgICAgICAgICAgICAgJE5ld0FydGljbGVJRCA9ICRBcnRpY2xlLT57QXJ0aWNsZUlEfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgYXJ0aWNsZSBpZCB0byBsYXN0IHNob3duIGN1c3RvbWVyIGFydGljbGUKICAgICAgICAgICAgaWYgKCAkQXJ0aWNsZS0+e1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAkTmV3QXJ0aWNsZUlEID0gJEFydGljbGUtPntBcnRpY2xlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoYW5nZSBhcnRpY2xlIGlkIGlmIGl0IHdhcyBmaWx0ZXJlZCBvdXQKICAgICAgICBpZiAoICROZXdBcnRpY2xlSUQgJiYgISRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57JEFydGljbGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkTmV3QXJ0aWNsZUlEOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgY3VycmVudCBhcnRpY2xlIGlkCiAgICAgICAgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30tPnskQXJ0aWNsZUlEfSA9IDE7CiAgICB9CgogICAgIyBjaGVjayBpZiBleHBhbmQgdmlldyBpcyB1c2FibGUgKG9ubHkgZm9yIGxlc3MgdGhlbiA0MDAgYXJ0aWNsZSkKICAgICMgaWYgeW91IGhhdmUgbW9yZSBhcnRpY2xlcyBpcyBnb2luZyB0byBiZSBzbG93IGFuZCBub3QgdXNhYmxlCiAgICBteSAkQXJ0aWNsZU1heExpbWl0ID0gNDAwOwogICAgaWYgKCAkU2VsZi0+e1pvb21FeHBhbmR9ICYmICQjQXJ0aWNsZUJveCA+ICRBcnRpY2xlTWF4TGltaXQgKSB7CiAgICAgICAgJFNlbGYtPntab29tRXhwYW5kfSA9IDA7CiAgICB9CgogICAgIyBnZXQgc2hvd24gYXJ0aWNsZShzKQogICAgbXkgQEFydGljbGVCb3hTaG93bjsKICAgIGlmICggISRTZWxmLT57Wm9vbUV4cGFuZH0gKSB7CiAgICAgICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGVUbXAtPntBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgcHVzaCBAQXJ0aWNsZUJveFNob3duLCAkQXJ0aWNsZVRtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIEBBcnRpY2xlQm94U2hvd24gPSBAQXJ0aWNsZUJveDsKICAgIH0KCiAgICAjIHJlc29ydCBhcnRpY2xlIG9yZGVyCiAgICBpZiAoICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9IGVxICdyZXZlcnNlJyApIHsKICAgICAgICBAQXJ0aWNsZUJveCAgICAgID0gcmV2ZXJzZSBAQXJ0aWNsZUJveDsKICAgICAgICBAQXJ0aWNsZUJveFNob3duID0gcmV2ZXJzZSBAQXJ0aWNsZUJveFNob3duOwogICAgfQoKICAgICMgc2hvdyBhcnRpY2xlIHRyZWUKICAgICRQYXJhbXtBcnRpY2xlVHJlZX0gPSAkU2VsZi0+X0FydGljbGVUcmVlKAogICAgICAgIFRpY2tldCAgICAgICAgICA9PiBcJVRpY2tldCwKICAgICAgICBBcnRpY2xlSUQgICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICBBcnRpY2xlTWF4TGltaXQgPT4gJEFydGljbGVNYXhMaW1pdCwKICAgICAgICBBcnRpY2xlQm94ICAgICAgPT4gXEBBcnRpY2xlQm94LAogICAgKTsKCiAgICAjIHNob3cgYXJ0aWNsZXMgaXRlbXMKICAgICRQYXJhbXtBcnRpY2xlSXRlbXN9ID0gJyc7CiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveFNob3duKSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAlJEFydGljbGVUbXA7CgogICAgICAgICMgYXJ0aWNsZSBmaWx0ZXIgaXMgYWN0aXZhdGVkIGluIHN5c2NvbmZpZyBhbmQgdGhlcmUgYXJlIGFydGljbGVzIHRoYXQgcGFzc2VkIHRoZSBmaWx0ZXIKICAgICAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyfSAmJiAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9LT57U2hvd25BcnRpY2xlSURzfSApIHsKCiAgICAgICAgICAgICAgICAjIGRvIG5vdCBzaG93IGFydGljbGUgaWYgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1Nob3duQXJ0aWNsZUlEc30tPnsgJEFydGljbGV7QXJ0aWNsZUlEfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG5leHQgQVJUSUNMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJFBhcmFte0FydGljbGVJdGVtc30gLj0gJFNlbGYtPl9BcnRpY2xlSXRlbSgKICAgICAgICAgICAgVGlja2V0ICAgICAgICAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIEFydGljbGUgICAgICAgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgQWNsQWN0aW9uICAgICAgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzID0+IFwlU3RhbmRhcmRSZXNwb25zZXMsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgID0+ICdTdGF0aWMnLAogICAgICAgICk7CiAgICB9CgogICAgIyBhZ2UgZGVzaWduCiAgICAkVGlja2V0e0FnZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKCBBZ2UgPT4gJFRpY2tldHtBZ2V9LCBTcGFjZSA9PiAnICcgKTsKCiAgICAjIG51bWJlciBvZiBhcnRpY2xlcwogICAgJFBhcmFte0FydGljbGVDb3VudH0gPSBzY2FsYXIgQEFydGljbGVCb3g7CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdIZWFkZXInLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgIyBydW4gdGlja2V0IG1lbnUgbW9kdWxlcwogICAgaWYgKCByZWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJU1lbnVzID0gJXsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1lbnVNb2R1bGUnKSB9OwogICAgICAgIE1FTlU6CiAgICAgICAgZm9yIG15ICRNZW51ICggc29ydCBrZXlzICVNZW51cyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJE1lbnVzeyRNZW51fS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNZW51c3skTWVudX0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15ICRJdGVtID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICAgICAgQUNMICAgID0+IFwlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgQ29uZmlnID0+ICRNZW51c3skTWVudX0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgTUVOVSBpZiAhJEl0ZW07CiAgICAgICAgICAgIGlmICggJE1lbnVzeyRNZW51fS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0NsYXNzfSA9ICJBc1BvcHVwIFBvcHVwVHlwZV8kTWVudXN7JE1lbnV9LT57UG9wdXBUeXBlfSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRNZW51JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IE1vdmVRdWV1ZXNTdHJnCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpNb3ZlVHlwZScpID1+IC9eZm9ybSQvaSApIHsKICAgICAgICAkTW92ZVF1ZXVlc3swfQogICAgICAgICAgICA9ICctICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnTW92ZScpIC4gJyAtJzsKICAgICAgICAkUGFyYW17TW92ZVF1ZXVlc1N0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudFF1ZXVlTGlzdE9wdGlvbigKICAgICAgICAgICAgTmFtZSA9PiAnRGVzdFF1ZXVlSUQnLAogICAgICAgICAgICBEYXRhID0+IFwlTW92ZVF1ZXVlcywKICAgICAgICApOwogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldE1vdmV9CiAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0TW92ZX0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldE1vdmV9ICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ21vdmUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgJFBhcmFte1RpY2tldElEfSA9ICRUaWNrZXR7VGlja2V0SUR9OwogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6Ok1vdmVUeXBlJykgPX4gL15mb3JtJC9pICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdNb3ZlTGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTW92ZUZvcm0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkVGlja2V0e1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkVGlja2V0e1NMQX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTTEEnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGZpcnN0IHJlc3BvbnNlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFRpY2tldHtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRUaWNrZXR7Rmlyc3RSZXNwb25zZVRpbWVDbGFzc30gPSAnV2FybmluZyc7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkVGlja2V0e1VwZGF0ZVRpbWV9ICkgewogICAgICAgICRUaWNrZXR7VXBkYXRlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e1VwZGF0ZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJFRpY2tldHtVcGRhdGVUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFRpY2tldHtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJFRpY2tldHtVcGRhdGVUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRUaWNrZXR7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAkVGlja2V0e1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1NvbHV0aW9uVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJFRpY2tldHtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkVGlja2V0e1NvbHV0aW9uVGltZUNsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBwZW5kaW5nIHVudGlsLCBpZiBzZXQ6CiAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSApIHsKICAgICAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSA8IC0xICkgewogICAgICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbENsYXNzfSA9ICdXYXJuaW5nJzsKICAgICAgICB9CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICRUaWNrZXR7VW50aWxUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJzxici8+JwogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUGVuZGluZ1VudGlsJywKICAgICAgICAgICAgRGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBvd25lcgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPd25lcicsCiAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVPd25lckluZm8sICVBY2xBY3Rpb24gfSwKICAgICk7CgogICAgIyBzaG93IHJlc3BvbnNpYmxlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlJlc3BvbnNpYmxlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJVJlc3BvbnNpYmxlSW5mbywgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICBGUkVFVEVYVDoKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBuZXh0IEZSRUVURVhUIGlmICggKCRDb3VudCA+PSAxMykgJiYgKCRDb3VudCA8PSAxNikgKTsKIyAtLS0KICAgICAgICBuZXh0IEZSRUVURVhUIGlmICEkVGlja2V0eyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkVGlja2V0eyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRUaWNrZXR7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IC4gJzo6TGluaycgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkVGlja2V0eyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkVGlja2V0eyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dExpbmsnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlVGlja2V0LCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0TGluayA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgKICAgICAgICAgICAgICAgICAgICAgICAgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCAuICc6OkxpbmsnCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkVGlja2V0eyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkVGlja2V0eyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICBGUkVFVElNRToKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgIG5leHQgRlJFRVRJTUUgaWYgKCAoJENvdW50ID49IDMpICYmICgkQ291bnQgPD0gNikgKTsKIyAtLS0KICAgICAgICBuZXh0IEZSRUVUSU1FIGlmICEkVGlja2V0eyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFjbEFjdGlvbiB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVUaWNrZXQsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZUtleSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lS2V5JyAuICRDb3VudCApLAogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWUgICAgPT4gJFRpY2tldHsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjdXN0b21lciBpbmZvIHN0cmluZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6Q3VzdG9tZXJJbmZvWm9vbScpICkgewoKICAgICAgICAjIGN1c3RvbWVyIGluZm8KICAgICAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVDdXN0b21lckRhdGEgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50Q3VzdG9tZXJWaWV3VGFibGUoCiAgICAgICAgICAgIERhdGEgICA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBNYXggICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVySW5mb1pvb21NYXhTaXplJyksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclRhYmxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGlua2VkIG9iamVjdHMKICAgIG15ICRMaW5rTGlzdFdpdGhEYXRhID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgPT4gJ1RpY2tldCcsCiAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICMgZ2V0IGxpbmsgdGFibGUgdmlldyBtb2RlCiAgICBteSAkTGlua1RhYmxlVmlld01vZGUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTGlua09iamVjdDo6Vmlld01vZGUnKTsKCiAgICAjIGNyZWF0ZSB0aGUgbGluayB0YWJsZQogICAgbXkgJExpbmtUYWJsZVN0cmcgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkxpbmtPYmplY3RUYWJsZUNyZWF0ZSgKICAgICAgICBMaW5rTGlzdFdpdGhEYXRhID0+ICRMaW5rTGlzdFdpdGhEYXRhLAogICAgICAgIFZpZXdNb2RlICAgICAgICAgPT4gJExpbmtUYWJsZVZpZXdNb2RlLAogICAgKTsKCiAgICAjIG91dHB1dCB0aGUgc2ltcGxlIGxpbmsgdGFibGUKICAgIGlmICggJExpbmtUYWJsZVN0cmcgJiYgJExpbmtUYWJsZVZpZXdNb2RlIGVxICdTaW1wbGUnICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0xpbmtUYWJsZVNpbXBsZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgTGlua1RhYmxlU3RyZyA9PiAkTGlua1RhYmxlU3RyZywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgb3V0cHV0IHRoZSBjb21wbGV4IGxpbmsgdGFibGUKICAgIGlmICggJExpbmtUYWJsZVN0cmcgJiYgJExpbmtUYWJsZVZpZXdNb2RlIGVxICdDb21wbGV4JyApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdMaW5rVGFibGVDb21wbGV4JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBMaW5rVGFibGVTdHJnID0+ICRMaW5rVGFibGVTdHJnLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBhcnRpY2xlIGZpbHRlciBpcyBhY3RpdmF0ZWQgaW4gc3lzY29uZmlnCiAgICBpZiAoICRTZWxmLT57QXJ0aWNsZUZpbHRlckFjdGl2ZX0gKSB7CgogICAgICAgICMgZ2V0IGFydGljbGUgdHlwZXMKICAgICAgICBteSAlQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoCiAgICAgICAgICAgIFJlc3VsdCA9PiAnSEFTSCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBidWlsZCBhcnRpY2xlIHR5cGUgbGlzdCBmb3IgZmlsdGVyIGRpYWxvZwogICAgICAgICRQYXJhbXtBcnRpY2xlVHlwZUZpbHRlclN0cmluZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICA9PiBcJUFydGljbGVUeXBlcywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gWyBrZXlzICV7ICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntBcnRpY2xlVHlwZUlEfSB9IF0sCiAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgIE11bHRpcGxlICAgID0+IDEsCiAgICAgICAgICAgIFNvcnQgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdBcnRpY2xlVHlwZUZpbHRlcicsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2VuZGVyIHR5cGVzCiAgICAgICAgbXkgJUFydGljbGVTZW5kZXJUeXBlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVNlbmRlclR5cGVMaXN0KAogICAgICAgICAgICBSZXN1bHQgPT4gJ0hBU0gnLAogICAgICAgICk7CgogICAgICAgICMgYnVpbGQgYXJ0aWNsZSBzZW5kZXIgdHlwZSBsaXN0IGZvciBmaWx0ZXIgZGlhbG9nCiAgICAgICAgJFBhcmFte0FydGljbGVTZW5kZXJUeXBlRmlsdGVyU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlQXJ0aWNsZVNlbmRlclR5cGVzLAogICAgICAgICAgICBTZWxlY3RlZElEICA9PiBbIGtleXMgJXsgJFNlbGYtPntBcnRpY2xlRmlsdGVyfS0+e1NlbmRlclR5cGVJRH0gfSBdLAogICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICBNdWx0aXBsZSAgICA9PiAxLAogICAgICAgICAgICBTb3J0ICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXInLAogICAgICAgICk7CgogICAgICAgICMgVGlja2V0IElECiAgICAgICAgJFBhcmFte1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0SUR9OwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRmlsdGVyRGlhbG9nJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgaWYgdGlja2V0IG5lZWQgdG8gYmUgbWFya2VkIGFzIHNlZW4KICAgIG15ICRBcnRpY2xlQWxsU2VlbiA9IDE7CiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlIChAQXJ0aWNsZUJveCkgewoKICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGUKICAgICAgICBuZXh0IEFSVElDTEUKICAgICAgICAgICAgaWYgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6TmV3QXJ0aWNsZUlnbm9yZVN5c3RlbVNlbmRlcicpCiAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZS0+e1NlbmRlclR5cGV9IGVxICdzeXN0ZW0nOwoKICAgICAgICAjIGdldCBhcnRpY2xlIGZsYWdzCiAgICAgICAgbXkgJUFydGljbGVGbGFnID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlRmxhZ0dldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGxhc3QgaWYgYXJ0aWNsZSB3YXMgbm90IHNob3duCiAgICAgICAgaWYgKCAhJEFydGljbGVGbGFne1NlZW59ICkgewogICAgICAgICAgICAkQXJ0aWNsZUFsbFNlZW4gPSAwOwogICAgICAgICAgICBsYXN0IEFSVElDTEU7CiAgICAgICAgfQogICAgfQoKICAgICMgbWFyayB0aWNrZXQgYXMgc2VlbiBpZiBhbGwgYXJ0aWNsZSBhcmUgc2hvd24KICAgIGlmICgkQXJ0aWNsZUFsbFNlZW4pIHsKICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZsYWdTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgICAgICA9PiAnU2VlbicsCiAgICAgICAgICAgIFZhbHVlICAgID0+IDEsCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwogICAgfQoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0LCAlQWNsQWN0aW9uIH0sCiAgICApOwp9CgpzdWIgX0FydGljbGVUcmVlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVRpY2tldCAgICAgICAgICA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSBAQXJ0aWNsZUJveCAgICAgID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CiAgICBteSAkQXJ0aWNsZU1heExpbWl0ID0gJFBhcmFte0FydGljbGVNYXhMaW1pdH07CiAgICBteSAkQXJ0aWNsZUlEICAgICAgID0gJFBhcmFte0FydGljbGVJRH07CgogICAgIyBidWlsZCB0aHJlYWQgc3RyaW5nCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ1RyZWUnLAogICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICApOwoKICAgICMgY2hlY2sgaWYgZXhwYW5kL2NvbGxhcHNlIHZpZXcgaXMgdXNhYmxlIChvbmx5IGZvciBsZXNzIHRoZW4gMzAwIGFydGljbGVzKQogICAgaWYgKCAkI0FydGljbGVCb3ggPCAkQXJ0aWNsZU1heExpbWl0ICkgewogICAgICAgIGlmICggJFNlbGYtPntab29tRXhwYW5kfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbGxhcHNlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAgICAgQXJ0aWNsZUlEICAgICAgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBab29tRXhwYW5kICAgICA9PiAkU2VsZi0+e1pvb21FeHBhbmR9LAogICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdFeHBhbmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgICAgICA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFpvb21FeHBhbmQgICAgID0+ICRTZWxmLT57Wm9vbUV4cGFuZH0sCiAgICAgICAgICAgICAgICAgICAgWm9vbUV4cGFuZFNvcnQgPT4gJFNlbGYtPntab29tRXhwYW5kU29ydH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcKICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKCiAgICAgICAgIyBkZWZpbmUgaGlnaGxpZ2h0IHN0eWxlIGZvciBsaW5rcyBpZiBmaWx0ZXIgaXMgYWN0aXZlCiAgICAgICAgbXkgJEhpZ2hsaWdodFN0eWxlID0gJ21lbnUnOwogICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyfSApIHsKICAgICAgICAgICAgJEhpZ2hsaWdodFN0eWxlID0gJ1ByaW9yaXR5SUQtNSc7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIGFydGljbGUgZmlsdGVyIGxpbmtzCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZpbHRlckRpYWxvZ0xpbmsnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEhpZ2hsaWdodFN0eWxlID0+ICRIaWdobGlnaHRTdHlsZSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAjIGJ1aWxkIGFydGljbGUgZmlsdGVyIHJlc2V0IGxpbmsgb25seSBpZiBmaWx0ZXIgaXMgc2V0CiAgICAgICAgaWYgKCAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZpbHRlclJlc2V0TGluaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHNob3cgYXJ0aWNsZSB0cmVlCiAgICBBUlRJQ0xFOgogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJSRBcnRpY2xlVG1wOwoKICAgICAgICAjIGFydGljbGUgZmlsdGVyIGlzIGFjdGl2YXRlZCBpbiBzeXNjb25maWcgYW5kIHRoZXJlIGFyZSBhcnRpY2xlcwogICAgICAgICMgdGhhdCBwYXNzZWQgdGhlIGZpbHRlcgogICAgICAgIGlmICggJFNlbGYtPntBcnRpY2xlRmlsdGVyQWN0aXZlfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0FydGljbGVGaWx0ZXJ9ICYmICRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9ICkgewoKICAgICAgICAgICAgICAgICMgZG8gbm90IHNob3cgYXJ0aWNsZSBpbiB0cmVlIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57QXJ0aWNsZUZpbHRlcn0tPntTaG93bkFydGljbGVJRHN9LT57ICRBcnRpY2xle0FydGljbGVJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEFSVElDTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2hvdyBhcnRpY2xlIGZsYWdzCiAgICAgICAgbXkgJENsYXNzICAgICAgID0gJyc7CiAgICAgICAgbXkgJENsYXNzUm93ICAgID0gJyc7CiAgICAgICAgbXkgJE5ld0FydGljbGUgID0gMDsKICAgICAgICBteSAlQXJ0aWNsZUZsYWcgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGbGFnR2V0KAogICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwoKICAgICAgICAjIGlnbm9yZSBzeXN0ZW0gc2VuZGVyIHR5cGVzCiAgICAgICAgaWYgKAogICAgICAgICAgICAhJEFydGljbGVGbGFne1NlZW59CiAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpOZXdBcnRpY2xlSWdub3JlU3lzdGVtU2VuZGVyJykKICAgICAgICAgICAgICAgIHx8ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Ok5ld0FydGljbGVJZ25vcmVTeXN0ZW1TZW5kZXInKQogICAgICAgICAgICAgICAgJiYgJEFydGljbGV7U2VuZGVyVHlwZX0gbmUgJ3N5c3RlbScKICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkTmV3QXJ0aWNsZSA9IDE7CgogICAgICAgICAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICAgICAgICAgICRDbGFzcyAgICAuPSAnIFVucmVhZEFydGljbGVzJzsKICAgICAgICAgICAgJENsYXNzUm93IC49ICcgVW5yZWFkQXJ0aWNsZXMnOwoKICAgICAgICAgICAgIyBqdXN0IHNob3cgdGlja2V0IGZsYWdzIGlmIGFnZW50IGJlbG9uZ3MgdG8gdGhlIHRpY2tldAogICAgICAgICAgICBteSAkU2hvd01ldGE7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlcklEfSA9PSAkQXJ0aWNsZXtPd25lcklEfQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntVc2VySUR9ID09ICRBcnRpY2xle1Jlc3BvbnNpYmxlSUR9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRTaG93TWV0YSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCAhJFNob3dNZXRhICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OldhdGNoZXInKSApIHsKICAgICAgICAgICAgICAgIG15ICVXYXRjaCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0V2F0Y2hHZXQoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggJFdhdGNoeyAkU2VsZi0+e1VzZXJJRH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2hvd01ldGEgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICAgICAgICAgIGlmICgkU2hvd01ldGEpIHsKICAgICAgICAgICAgICAgICRDbGFzcyAuPSAnIEltcG9ydGFudCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgLj0gJyBVbmltcG9ydGFudCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgaWYgdGhpcyBpcyB0aGUgc2hvd24gYXJ0aWNsZSAtPT4gc2V0IGNsYXNzIHRvIGFjdGl2ZQogICAgICAgIGlmICggJEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9ICYmICEkU2VsZi0+e1pvb21FeHBhbmR9ICkgewogICAgICAgICAgICAkQ2xhc3NSb3cgLj0gJyBBY3RpdmUnOwogICAgICAgIH0KCiAgICAgICAgbXkgJFRtcFN1YmplY3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RDbGVhbigKICAgICAgICAgICAgVGlja2V0TnVtYmVyID0+ICRBcnRpY2xle1RpY2tldE51bWJlcn0sCiAgICAgICAgICAgIFN1YmplY3QgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBpZiB3ZSBuZWVkIHRvIHNob3cgYWxzbyBleHBhbmQvY29sbGFwc2UgaWNvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgIENsYXNzUm93ICAgICAgID0+ICRDbGFzc1JvdywKICAgICAgICAgICAgICAgIFN1YmplY3QgICAgICAgID0+ICRUbXBTdWJqZWN0LAogICAgICAgICAgICAgICAgWm9vbUV4cGFuZCAgICAgPT4gJFNlbGYtPntab29tRXhwYW5kfSwKICAgICAgICAgICAgICAgIFpvb21FeHBhbmRTb3J0ID0+ICRTZWxmLT57Wm9vbUV4cGFuZFNvcnR9LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIGlmICgkTmV3QXJ0aWNsZSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVHJlZUl0ZW1OZXdBcnRpY2xlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRDbGFzcywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIEJ1Z2ZpeCBmb3IgSUU3OiBhIHRhYmxlIGNlbGwgc2hvdWxkIG5vdCBiZSBlbXB0eQogICAgICAgICMgKGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjZWxsIGJvcmRlcnMgYXJlIG5vdCBzaG93bik6CiAgICAgICAgIyB3ZSBhZGQgYW4gZW1wdHkgZWxlbWVudCBoZXJlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbU5vTmV3QXJ0aWNsZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBEZXRlcm1pbmUgY29tbXVuaWNhdGlvbiBkaXJlY3Rpb24KICAgICAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvLWludGVybmFsJC9zbXggKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soIE5hbWUgPT4gJ1RyZWVJdGVtRGlyZWN0aW9uSW50ZXJuYWwnICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRBcnRpY2xle1NlbmRlclR5cGV9IGVxICdjdXN0b21lcicgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdUcmVlSXRlbURpcmVjdGlvbkluY29taW5nJyApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnVHJlZUl0ZW1EaXJlY3Rpb25PdXRnb2luZycgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnQgaW5mbwogICAgICAgICMgQnVnZml4IGZvciBJRTc6IGEgdGFibGUgY2VsbCBzaG91bGQgbm90IGJlIGVtcHR5CiAgICAgICAgIyAoYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNlbGwgYm9yZGVycyBhcmUgbm90IHNob3duKToKICAgICAgICAjIHdlIGFkZCBhbiBlbXB0eSBlbGVtZW50IGhlcmUKICAgICAgICBpZiAoICEkQXJ0aWNsZXtBdG1zfSB8fCAhJXsgJEFydGljbGV7QXRtc30gfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtTm9BdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBuZXh0IEFSVElDTEU7CiAgICAgICAgfQoKICAgICAgICAjIGRvd25sb2FkIHR5cGUKICAgICAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50RG93bmxvYWRUeXBlJykgfHwgJ2F0dGFjaG1lbnQnOwoKICAgICAgICAjIGlmIGF0dGFjaG1lbnQgd2lsbCBiZSBmb3JjZWQgdG8gZG93bmxvYWQsIGRvbid0IG9wZW4gYSBuZXcgZG93bmxvYWQgd2luZG93IQogICAgICAgIG15ICRUYXJnZXQgPSAnJzsKICAgICAgICBpZiAoICRUeXBlID1+IC9pbmxpbmUvaSApIHsKICAgICAgICAgICAgJFRhcmdldCA9ICd0YXJnZXQ9ImF0dGFjaG1lbnQiICc7CiAgICAgICAgfQogICAgICAgIG15ICRab29tQXR0YWNobWVudERpc3BsYXlDb3VudAogICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6Olpvb21BdHRhY2htZW50RGlzcGxheUNvdW50Jyk7CiAgICAgICAgbXkgJENvdW50U2hvd24gPSAwOwogICAgICAgIEFUVEFDSE1FTlQ6CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gKCAkWm9vbUF0dGFjaG1lbnREaXNwbGF5Q291bnQgKyAyICkgKSB7CiAgICAgICAgICAgIG5leHQgQVRUQUNITUVOVCBpZiAhJEFydGljbGV7QXRtc30tPnskQ291bnR9OwogICAgICAgICAgICBpZiAoICRDb3VudFNob3duID09IDAgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICgga2V5cyAleyAkQXJ0aWNsZXtBdG1zfSB9ID4gMSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUF0dGFjaG1lbnRJY29uTXVsdGlwbGUnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUcmVlSXRlbUF0dGFjaG1lbnRJY29uU2luZ2xlJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7ICRBcnRpY2xle0F0bXN9LT57JENvdW50fSB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgICAgICRDb3VudFNob3duKys7CgogICAgICAgICAgICAjIHNob3cgbW9yZSBpbmZvCiAgICAgICAgICAgIGxhc3QgQVRUQUNITUVOVCBpZiAkQ291bnRTaG93biA+ICRab29tQXR0YWNobWVudERpc3BsYXlDb3VudDsKCiAgICAgICAgICAgICMgc2hvdyBhdHRhY2htZW50IGluZm8KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RyZWVJdGVtQXR0YWNobWVudEl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICAgICAgJXsgJEFydGljbGV7QXRtc30tPnskQ291bnR9IH0sCiAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICBUYXJnZXQgPT4gJFRhcmdldCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgcmV0dXJuIG91dHB1dAogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlVGlja2V0IH0sCiAgICApOwp9CgpzdWIgX0FydGljbGVJdGVtU2VlbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgbWFyayBzaG93biBhcnRpY2xlIGFzIHNlZW4KICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZsYWdTZXQoCiAgICAgICAgQXJ0aWNsZUlEID0+ICRQYXJhbXtBcnRpY2xlSUR9LAogICAgICAgIEtleSAgICAgICA9PiAnU2VlbicsCiAgICAgICAgVmFsdWUgICAgID0+IDEsCiAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfQXJ0aWNsZUl0ZW0gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVGlja2V0ICAgID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVBcnRpY2xlICAgPSAleyAkUGFyYW17QXJ0aWNsZX0gfTsKICAgIG15ICVBY2xBY3Rpb24gPSAleyAkUGFyYW17QWNsQWN0aW9ufSB9OwoKICAgICMgY2xlYW51cCBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUl0ZW0nLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICApOwoKICAgICMgbWFyayBzaG93biBhcnRpY2xlIGFzIHNlZW4KICAgIGlmICggJFBhcmFte1R5cGV9IGVxICdPbkxvYWQnICkgewogICAgICAgICRTZWxmLT5fQXJ0aWNsZUl0ZW1TZWVuKCBBcnRpY2xlSUQgPT4gJEFydGljbGV7QXJ0aWNsZUlEfSApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUl0ZW1NYXJrQXNTZWVuJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBhcnRpY2xlIGFjdGlvbnMKCiAgICAjIHNlbGVjdCB0aGUgb3V0cHV0IHRlbXBsYXRlCiAgICBpZiAoICRBcnRpY2xle0FydGljbGVUeXBlfSAhfiAvXihub3RlfGVtYWlsLW5vdGkpL2kgKSB7CgogICAgICAgICMgY2hlY2sgaWYgY29tcG9zZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgJiYgKAogICAgICAgICAgICAgICAgIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9CiAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldENvbXBvc2UnKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRPayApIHsKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2tlZCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja0dldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICgkTG9ja2VkKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKCiAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICAgICAgICAgICAgICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30tPnswfQogICAgICAgICAgICAgICAgICAgID0gJy0gJyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdSZXBseScpIC4gJyAtJzsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIGh0bWwgc3RyaW5nCiAgICAgICAgICAgICAgICBteSAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICdSZXNwb25zZUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVJlcGx5QXNEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXQsICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPT4gJFN0YW5kYXJkUmVzcG9uc2VzU3RyZywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdSZXBseScsCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgICAgICAgICAgICAgICAgPT4gJ1JlcGx5JyAuICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRWxlbWVudElEICAgICA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVSZXBseUFzRHJvcGRvd25KUycgLiAkUGFyYW17VHlwZX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVUaWNrZXQsICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJ1JlcGx5JyAuICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBjaGVjayBpZiByZXBseSBhbGwgaXMgbmVlZGVkCiAgICAgICAgICAgICAgICBteSAkUmVjaXBpZW50cyA9ICcnOwogICAgICAgICAgICAgICAgS0VZOgogICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBLRVkgaWYgISRBcnRpY2xleyRLZXl9OwogICAgICAgICAgICAgICAgICAgIGlmICgkUmVjaXBpZW50cykgewogICAgICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAnLCAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAkUmVjaXBpZW50cyAuPSAkQXJ0aWNsZXskS2V5fTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgICAgICAgICBteSAkRW1haWxQYXJzZXIgPSBLZXJuZWw6OlN5c3RlbTo6RW1haWxQYXJzZXItPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIE1vZGUgPT4gJ1N0YW5kYWxvbmUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgQEFkZHJlc3NlcyA9ICRFbWFpbFBhcnNlci0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgICAgICAgICAgICAgIEFERFJFU1M6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRBZGRyZXNzIChAQWRkcmVzc2VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbFBhcnNlci0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkQWRkcmVzcyApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IGlmICEkRW1haWw7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRJc0xvY2FsID0gJFNlbGYtPntTeXN0ZW1BZGRyZXNzfS0+U3lzdGVtQWRkcmVzc0lzTG9jYWxBZGRyZXNzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkRW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgQUREUkVTUyBpZiAkSXNMb2NhbDsKICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCAkUmVjaXBpZW50Q291bnQgPiAxICkgewogICAgICAgICAgICAgICAgICAgICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30tPnswfQogICAgICAgICAgICAgICAgICAgICAgICA9ICctICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUmVwbHkgQWxsJykgLiAnIC0nOwoKICAgICAgICAgICAgICAgICAgICAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgICAgICAgICAgICAgICAgIElEICAgPT4gJ1Jlc3BvbnNlSURBbGwnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICRQYXJhbXtTdGFuZGFyZFJlc3BvbnNlc30sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVJlcGx5QXNEcm9wZG93bicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFJlc3BvbnNlc1N0cmcgPT4gJFN0YW5kYXJkUmVzcG9uc2VzU3RyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgICA9PiAnUmVwbHkgQWxsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgICAgICAgICA9PiAnQWdlbnRUaWNrZXRDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHlBbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbHlBbGwgICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZUVsZW1lbnRJRCAgICAgPT4gJ1Jlc3BvbnNlSURBbGwnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVJlcGx5QXNEcm9wZG93bkpTJyAuICRQYXJhbXtUeXBlfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlVGlja2V0LCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAnUmVwbHlBbGwnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgZm9yd2FyZCBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgICAgICMgKG9ubHkgc2hvdyBmb3J3YXJkIG9uIGVtYWlsLWV4dGVybmFsLCBlbWFpbC1pbnRlcm5hbCwgcGhvbmUsIHdlYnJlcXVlc3QgYW5kIGZheAogICAgICAgIGlmICgKICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Rm9yd2FyZH0KICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Rm9yd2FyZH0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldEZvcndhcmR9ICkKICAgICAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9eKGVtYWlsLWV4dGVybmFsfGVtYWlsLWludGVybmFsfHBob25lfHdlYnJlcXVlc3R8ZmF4KSQvaQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldEZvcndhcmQnKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9ICkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVNZW51JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdGb3J3YXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ0ZvcndhcmQnLAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAnQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0FjdGlvbj1BZ2VudFRpY2tldEZvcndhcmQ7VGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn07QXJ0aWNsZUlEPSREYXRheyJBcnRpY2xlSUQifScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBib3VuY2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAjIChvbmx5IHNob3cgZm9yd2FyZCBvbiBlbWFpbC1leHRlcm5hbCBhbmQgZW1haWwtaW50ZXJuYWwKICAgICAgICBpZiAoCiAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEJvdW5jZX0KICAgICAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Qm91bmNlfSApCiAgICAgICAgICAgICYmICRBcnRpY2xle0FydGljbGVUeXBlfSA9fiAvXihlbWFpbC1leHRlcm5hbHxlbWFpbC1pbnRlcm5hbCkkL2kKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRCb3VuY2UnKTsKICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tHZXQoIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9ICkgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRBY2Nlc3NPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+T3duZXJDaGVjaygKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICggISRBY2Nlc3NPayApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVNZW51JywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdCb3VuY2UnLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnQm91bmNlJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdBY3Rpb249QWdlbnRUaWNrZXRCb3VuY2U7VGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn07QXJ0aWNsZUlEPSREYXRheyJBcnRpY2xlSUQifScKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBcnRpY2xlQ29tQm91bmNlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVRpY2tldCwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBwaG9uZSBsaW5rIHNob3VsZCBiZSBzaG93bgogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCcpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggJENvbmZpZy0+e1JlcXVpcmVkTG9ja30gKSB7CiAgICAgICAgICAgIG15ICRMb2NrZWQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldExvY2tHZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0e1RpY2tldElEfQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJExvY2tlZCkgewogICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVNZW51JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVUaWNrZXQsICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQaG9uZSBDYWxsIE91dGJvdW5kJywKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICA9PiAnUGhvbmUgQ2FsbCBPdXRib3VuZCcsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJ0FjdGlvbj1BZ2VudFRpY2tldFBob25lT3V0Ym91bmQ7VGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0nCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIHNwbGl0IGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UGhvbmV9CiAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmV9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlTWVudScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVRpY2tldCwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnU3BsaXQnLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1NwbGl0JywKICAgICAgICAgICAgICAgIExpbmsgPT4KICAgICAgICAgICAgICAgICAgICAnQWN0aW9uPUFnZW50VGlja2V0UGhvbmU7VGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn07QXJ0aWNsZUlEPSREYXRheyJBcnRpY2xlSUQifTtMaW5rVGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn0nCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIHByaW50IGxpbmsgc2hvdWxkIGJlIHNob3duCiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0UHJpbnR9CiAgICAgICAgJiYgKCAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UHJpbnR9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQcmludH0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdybycsCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBpZiAoJE9LKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlTWVudScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlVGlja2V0LCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUHJpbnQnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICdQcmludCcsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgTGluayA9PgogICAgICAgICAgICAgICAgICAgICAgICAnQWN0aW9uPUFnZW50VGlja2V0UHJpbnQ7VGlja2V0SUQ9JERhdGF7IlRpY2tldElEIn07QXJ0aWNsZUlEPSREYXRheyJBcnRpY2xlSUQifScKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgcGxhaW4gbGluayBzaG91bGQgYmUgc2hvd24KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQbGFpbn0KICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6UGxhaW5WaWV3JykKICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQbGFpbn0gfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBsYWlufSApCiAgICAgICAgJiYgJEFydGljbGV7QXJ0aWNsZVR5cGV9ID1+IC9lbWFpbC9pCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRPSyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldHtUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICgkT0spIHsKICAgICAgICAgICAgbXkgJExpbmsKICAgICAgICAgICAgICAgID0gJ0FjdGlvbj1BZ2VudFRpY2tldFBsYWluO1RpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9O0FydGljbGVJRD0kRGF0YXsiQXJ0aWNsZUlEIn0nOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU1lbnUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVRpY2tldCwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsYWluIEZvcm1hdCcsCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ1BsYWluIEZvcm1hdCcsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gJ0FzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGRvIHNvbWUgc3RyaXBzICYmIHF1b3RpbmcKICAgIEtFWToKICAgIGZvciBteSAkS2V5IChxdyhGcm9tIFRvIENjKSkgewogICAgICAgIG5leHQgS0VZIGlmICEkQXJ0aWNsZXskS2V5fTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSb3dSZWNpcGllbnQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRLZXksCiAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkQXJ0aWNsZXskS2V5fSwKICAgICAgICAgICAgICAgIFJlYWxuYW1lID0+ICRBcnRpY2xleyAkS2V5IC4gJ1JlYWxuYW1lJyB9LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBzaG93IGFjY291bnRlZCBhcnRpY2xlIHRpbWUKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Wm9vbVRpbWVEaXNwbGF5JykgKSB7CiAgICAgICAgbXkgJEFydGljbGVUaW1lID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQWNjb3VudGVkVGltZUdldCgKICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0KICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBY2NvdW50ZWRUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAnVGltZScsCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZVRpbWUsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgIEZSRUVURVhUOgogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBuZXh0IEZSRUVURVhUIGlmICEkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JENvdW50In07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkQ291bnQifSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkQ291bnQifSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgYWRkIGJsb2NrIGZvciBhdHRhY2htZW50cwogICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSAmJiAleyAkQXJ0aWNsZXtBdG1zfSB9ICkgewogICAgICAgIG15ICVBdG1JbmRleCA9ICV7ICRBcnRpY2xle0F0bXN9IH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnQnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CgogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZUF0dGFjaG1lbnRNb2R1bGUnKTsKICAgICAgICBBVFRBQ0hNRU5UOgogICAgICAgIGZvciBteSAkRmlsZUlEICggc29ydCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBdHRhY2htZW50Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVGaWxlLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gYXJ0aWNsZSBhdHRhY2htZW50IG1vZHVsZXMKICAgICAgICAgICAgbmV4dCBBVFRBQ0hNRU5UIGlmIHJlZiAkQ29uZmlnIG5lICdIQVNIJzsKICAgICAgICAgICAgbXkgJUpvYnMgPSAleyRDb25maWd9OwogICAgICAgICAgICBKT0I6CiAgICAgICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJE9iamVjdC0+UnVuKAogICAgICAgICAgICAgICAgICAgIEZpbGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZUlEID0+ICRGaWxlSUQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBuZXh0IEpPQiBpZiAhJURhdGE7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJERhdGF7QmxvY2t9IHx8ICdBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyVEYXRhfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBydW4gYXJ0aWNsZSB2aWV3IG1vZHVsZXMKICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVZpZXdNb2R1bGUnKTsKICAgIGlmICggcmVmICRDb25maWcgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVKb2JzID0gJXskQ29uZmlnfTsKICAgICAgICBmb3IgbXkgJEpvYiAoIHNvcnQga2V5cyAlSm9icyApIHsKCiAgICAgICAgICAgICMgbG9hZCBtb2R1bGUKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSggJEpvYnN7JEpvYn0tPntNb2R1bGV9ICkgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHJ1biBtb2R1bGUKICAgICAgICAgICAgbXkgQERhdGEgPSAkT2JqZWN0LT5DaGVjayggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVUaWNrZXQsIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgICAgICBmb3IgbXkgJERhdGFSZWYgKEBEYXRhKSB7CiAgICAgICAgICAgICAgICBpZiAoICEkRGF0YVJlZi0+e1N1Y2Nlc3NmdWx9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnTm90aWNlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgZm9yIG15ICRXYXJuaW5nICggQHsgJERhdGFSZWYtPntXYXJuaW5nc30gfSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkV2FybmluZywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGZpbHRlciBvcHRpb24KICAgICAgICAgICAgJE9iamVjdC0+RmlsdGVyKCBBcnRpY2xlID0+IFwlQXJ0aWNsZSwgJVRpY2tldCwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBib2R5IGFzIGh0bWwgb3IgcGxhaW4gdGV4dAogICAgbXkgJFZpZXdNb2RlID0gJ0JvZHlIVE1MJzsKCiAgICAjIGluIGNhc2Ugc2hvdyBwbGFpbiBhcnRpY2xlIGJvZHkgKGlmIG5vIGh0bWwgYm9keSBhcyBhdHRhY2htZW50IGV4aXN0cyBvZiBpZiByaWNoCiAgICAjIHRleHQgaXMgbm90IGVuYWJsZWQpCiAgICBpZiAoICEkU2VsZi0+e1JpY2hUZXh0fSB8fCAhJEFydGljbGV7QXR0YWNobWVudElET2ZIVE1MQm9keX0gKSB7CiAgICAgICAgJFZpZXdNb2RlID0gJ0JvZHlQbGFpbic7CgogICAgICAgICMgcmVtZW1iZXIgcGxhaW4gYm9keSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIGJ5IEFydGljbGVWaWV3TW9kdWxlcwogICAgICAgICRBcnRpY2xle0JvZHlQbGFpbn0gPSAkQXJ0aWNsZXtCb2R5fTsKCiAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgTmV3TGluZSAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TmV3TGluZScpLAogICAgICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZG8gY2hhcnNldCBjaGVjawogICAgICAgIGlmICggbXkgJENoYXJzZXRUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja0NoYXJzZXQoICVUaWNrZXQsICVBcnRpY2xlICkgKSB7CiAgICAgICAgICAgICRBcnRpY2xle0JvZHlOb3RlfSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGJvZHkKICAgICMgQ3JlYXRlIGEgcmVmZXJlbmNlIHRvIGFuIGFub255bW91cyBjb3B5IG9mICVBcnRpY2xlIGFuZCBwYXNzIGl0IHRvCiAgICAjIHRoZSBMYXlvdXRPYmplY3QsIGJlY2F1c2UgJUFydGljbGUgbWF5IGJlIG1vZGlmaWVkIGFmdGVyd2FyZHMuCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJFZpZXdNb2RlLAogICAgICAgIERhdGEgPT4geyVBcnRpY2xlfSwKICAgICk7CgogICAgIyByZXN0b3JlIHBsYWluIGJvZHkgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBieSBBcnRpY2xlVmlld01vZHVsZXMKICAgIGlmICggISRTZWxmLT57UmljaFRleHR9IHx8ICEkQXJ0aWNsZXtBdHRhY2htZW50SURPZkhUTUxCb2R5fSApIHsKICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRBcnRpY2xle0JvZHlQbGFpbn07CiAgICB9CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQsICVBY2xBY3Rpb24gfSwKICAgICk7Cn0KMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0UHJpbnQucG0gLSBwcmludCBsYXlvdXQgZm9yIGN1c3RvbWVyIGludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3VzdG9tZXJUaWNrZXRQcmludC5wbSx2IDEuNiAyMDEwLzEyLzA2IDE5OjMzOjA5IGVuIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFByaW50LnBtLHYgMS40MCAyMDEwLzExLzI5IDExOjM5OjA3IG1iIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6Q3VzdG9tZXJUaWNrZXRQcmludDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6UERGOwojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkTmVlZGVkICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdCBDb25maWdPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskTmVlZGVkfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJE5lZWRlZCEiICk7CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntVc2VyT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlVzZXItPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntQREZPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlBERi0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgICMgZ2V0IHRoZSBjb25maWd1cmF0aW9uIHRvIGNoZWNrIGZvciBwcmludGFibGUgb2JqZWN0cwogICAgJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkN1c3RvbWVyVGlja2V0Wm9vbSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRPdXRwdXQ7CiAgICBteSAkUXVldWVJRDsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFNlbGYtPntUaWNrZXRJRH0gKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgfQogICAgJFF1ZXVlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFF1ZXVlSUQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICBpZiAoICEkUXVldWVJRCApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5FcnJvclNjcmVlbiggTWVzc2FnZSA9PiAnTmVlZCBUaWNrZXRJRCEnICk7CiAgICB9CgogICAgIyBjaGVjayBwZXJtaXNzaW9ucwogICAgaWYgKAogICAgICAgICEkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ3JvJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgICAgICkKICAgICAgICApCiAgICB7CgogICAgICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICd5ZXMnICk7CiAgICB9CgogICAgIyBnZXQgY29udGVudAogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwojIC0tLQojIElUU00KIyAtLS0KICAgICMgbG9va3VwIGNyaXRpY2FsaXR5CiAgICAkVGlja2V0e0NyaXRpY2FsaXR5fSA9ICctJzsKICAgIGlmICggJFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfSApIHsKICAgICAgICAjIGdldCBjcml0aWNhbGl0eSBsaXN0CiAgICAgICAgbXkgJENyaXRpY2FsaXR5TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkNyaXRpY2FsaXR5JywKICAgICAgICApOwogICAgICAgICRUaWNrZXR7Q3JpdGljYWxpdHl9ID0gJENyaXRpY2FsaXR5TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkVGlja2V0e0ltcGFjdH0gPSAnLSc7CiAgICBpZiAoICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0gKSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkVGlja2V0e0ltcGFjdH0gPSAkSW1wYWN0TGlzdC0+eyRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH19OwogICAgfQojIC0tLQogICAgbXkgQEN1c3RvbWVyQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgPT4gXEBDdXN0b21lckFydGljbGVUeXBlcywKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CgogICAgIyBjdXN0b21lciBpbmZvCiAgICBteSAlQ3VzdG9tZXJEYXRhOwogICAgaWYgKCAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSApIHsKICAgICAgICAlQ3VzdG9tZXJEYXRhID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICk7CiAgICB9CiAgICBlbHNpZiAoICRUaWNrZXR7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJUN1c3RvbWVyRGF0YSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkbyBzb21lIGh0bWwgcXVvdGluZwogICAgJFRpY2tldHtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRUaWNrZXR7QWdlfSwgU3BhY2UgPT4gJyAnICk7CiAgICBpZiAoICRUaWNrZXR7VW50aWxUaW1lfSApIHsKICAgICAgICAkVGlja2V0e1BlbmRpbmdVbnRpbH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlKAogICAgICAgICAgICBBZ2UgICA9PiAkVGlja2V0e1VudGlsVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFRpY2tldHtQZW5kaW5nVW50aWx9ID0gJy0nOwogICAgfQoKICAgICMgZ2VuZXJhdGUgcGRmIG91dHB1dAogICAgaWYgKCAkU2VsZi0+e1BERk9iamVjdH0gKSB7CiAgICAgICAgbXkgJFByaW50ZWRCeSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdwcmludGVkIGJ5Jyk7CiAgICAgICAgbXkgJFRpbWUgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZSA9PiAnJEVudnsiVGltZSJ9JyApOwogICAgICAgIG15ICRVcmwgICAgICAgPSAnICc7CiAgICAgICAgaWYgKCAkRU5We1JFUVVFU1RfVVJJfSApIHsKICAgICAgICAgICAgJFVybCA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIdHRwVHlwZScpIC4gJzovLycKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0ZRRE4nKQogICAgICAgICAgICAgICAgLiAkRU5We1JFUVVFU1RfVVJJfTsKICAgICAgICB9CiAgICAgICAgbXkgJVBhZ2U7CgogICAgICAgICMgZ2V0IG1heGltdW0gbnVtYmVyIG9mIHBhZ2VzCiAgICAgICAgJFBhZ2V7TWF4UGFnZXN9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1BERjo6TWF4UGFnZXMnKTsKICAgICAgICBpZiAoICEkUGFnZXtNYXhQYWdlc30gfHwgJFBhZ2V7TWF4UGFnZXN9IDwgMSB8fCAkUGFnZXtNYXhQYWdlc30gPiAxMDAwICkgewogICAgICAgICAgICAkUGFnZXtNYXhQYWdlc30gPSAxMDA7CiAgICAgICAgfQogICAgICAgIG15ICRIZWFkZXJSaWdodCAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykgLiAkVGlja2V0e1RpY2tldE51bWJlcn07CiAgICAgICAgbXkgJEhlYWRsaW5lTGVmdCA9ICRIZWFkZXJSaWdodDsKICAgICAgICBteSAkVGl0bGUgICAgICAgID0gJEhlYWRlclJpZ2h0OwogICAgICAgIGlmICggJFRpY2tldHtUaXRsZX0gKSB7CiAgICAgICAgICAgICRIZWFkbGluZUxlZnQgPSAkVGlja2V0e1RpdGxlfTsKICAgICAgICAgICAgJFRpdGxlIC49ICcgLyAnIC4gJFRpY2tldHtUaXRsZX07CiAgICAgICAgfQoKICAgICAgICAkUGFnZXtNYXJnaW5Ub3B9ICAgID0gMzA7CiAgICAgICAgJFBhZ2V7TWFyZ2luUmlnaHR9ICA9IDQwOwogICAgICAgICRQYWdle01hcmdpbkJvdHRvbX0gPSA0MDsKICAgICAgICAkUGFnZXtNYXJnaW5MZWZ0fSAgID0gNDA7CiAgICAgICAgJFBhZ2V7SGVhZGVyUmlnaHR9ICA9ICRIZWFkZXJSaWdodDsKICAgICAgICAkUGFnZXtIZWFkbGluZUxlZnR9ID0gJEhlYWRsaW5lTGVmdDsKICAgICAgICAkUGFnZXtIZWFkbGluZVJpZ2h0fQogICAgICAgICAgICA9ICRQcmludGVkQnkgLiAnICcKICAgICAgICAgICAgLiAkU2VsZi0+e1VzZXJGaXJzdG5hbWV9IC4gJyAnCiAgICAgICAgICAgIC4gJFNlbGYtPntVc2VyTGFzdG5hbWV9IC4gJyAoJwogICAgICAgICAgICAuICRTZWxmLT57VXNlckVtYWlsfSAuICcpICcKICAgICAgICAgICAgLiAkVGltZTsKICAgICAgICAkUGFnZXtGb290ZXJMZWZ0fSA9ICRVcmw7CiAgICAgICAgJFBhZ2V7UGFnZVRleHR9ICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUGFnZScpOwogICAgICAgICRQYWdle1BhZ2VDb3VudH0gID0gMTsKCiAgICAgICAgIyBjcmVhdGUgbmV3IHBkZiBkb2N1bWVudAogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+RG9jdW1lbnROZXcoCiAgICAgICAgICAgIFRpdGxlICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnUHJvZHVjdCcpIC4gJzogJyAuICRUaXRsZSwKICAgICAgICAgICAgRW5jb2RlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBmaXJzdCBwZGYgcGFnZQogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgKTsKICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CgogICAgICAgICMgdHlwZSBvZiBwcmludCB0YWcKICAgICAgICBteSAkUHJpbnRUYWcgPSAnJzsKCiAgICAgICAgJFByaW50VGFnID0gKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0JykgKSAuICcgJyAuCiAgICAgICAgICAgICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW50JykgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRQcmludFRhZywKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gOSwKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkJywKICAgICAgICAgICAgQWxpZ24gICAgPT4gJ3JpZ2h0JywKICAgICAgICAgICAgRm9udFNpemUgPT4gOSwKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBpbmZvcwogICAgICAgICRTZWxmLT5fUERGT3V0cHV0VGlja2V0SW5mb3MoCiAgICAgICAgICAgIFBhZ2VEYXRhICAgPT4gXCVQYWdlLAogICAgICAgICAgICBUaWNrZXREYXRhID0+IFwlVGlja2V0LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGV4dCBmaWVsZHMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dFRpY2tldEZyZWVUZXh0KAogICAgICAgICAgICBQYWdlRGF0YSAgID0+IFwlUGFnZSwKICAgICAgICAgICAgVGlja2V0RGF0YSA9PiBcJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIG91dHB1dCB0aWNrZXQgZnJlZXRpbWUgZmllbGRzCiAgICAgICAgJFNlbGYtPl9QREZPdXRwdXRUaWNrZXRGcmVlVGltZSgKICAgICAgICAgICAgUGFnZURhdGEgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gXCVUaWNrZXQsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgY3VzdG9tZXIgaW5mb3MKICAgICAgICBpZiAoJUN1c3RvbWVyRGF0YSkgewogICAgICAgICAgICAkU2VsZi0+X1BERk91dHB1dEN1c3RvbWVySW5mb3MoCiAgICAgICAgICAgICAgICBQYWdlRGF0YSAgICAgPT4gXCVQYWdlLAogICAgICAgICAgICAgICAgQ3VzdG9tZXJEYXRhID0+IFwlQ3VzdG9tZXJEYXRhLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBvdXRwdXQgYXJ0aWNsZXMKICAgICAgICAkU2VsZi0+X1BERk91dHB1dEFydGljbGVzKAogICAgICAgICAgICBQYWdlRGF0YSAgICA9PiBcJVBhZ2UsCiAgICAgICAgICAgIEFydGljbGVEYXRhID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICApOwoKICAgICAgICAjIHJldHVybiB0aGUgcGRmIGRvY3VtZW50CiAgICAgICAgbXkgJEZpbGVuYW1lID0gJ1RpY2tldF8nIC4gJFRpY2tldHtUaWNrZXROdW1iZXJ9OwogICAgICAgIG15ICggJHMsICRtLCAkaCwgJEQsICRNLCAkWSApID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJEYXRlKAogICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKSwKICAgICAgICApOwogICAgICAgICRNID0gc3ByaW50ZiggIiUwMmQiLCAkTSApOwogICAgICAgICREID0gc3ByaW50ZiggIiUwMmQiLCAkRCApOwogICAgICAgICRoID0gc3ByaW50ZiggIiUwMmQiLCAkaCApOwogICAgICAgICRtID0gc3ByaW50ZiggIiUwMmQiLCAkbSApOwogICAgICAgIG15ICRQREZTdHJpbmcgPSAkU2VsZi0+e1BERk9iamVjdH0tPkRvY3VtZW50T3V0cHV0KCk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgRmlsZW5hbWUgICAgPT4gJEZpbGVuYW1lIC4gIl8iIC4gIiRZLSRNLSREIiAuICJfIiAuICIkaC0kbS5wZGYiLAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAiYXBwbGljYXRpb24vcGRmIiwKICAgICAgICAgICAgQ29udGVudCAgICAgPT4gJFBERlN0cmluZywKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2F0dGFjaG1lbnQnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZW5lcmF0ZSBodG1sIG91dHB1dAogICAgZWxzZSB7CgogICAgICAgICMgb3V0cHV0IGhlYWRlcgogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludEhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CgogICAgICAgICMgb3V0cHV0IGN1c3RvbWVyIGluZm9zCiAgICAgICAgaWYgKCVDdXN0b21lckRhdGEpIHsKICAgICAgICAgICAgJFBhcmFte0N1c3RvbWVyVGFibGV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEN1c3RvbWVyVmlld1RhYmxlKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUN1c3RvbWVyRGF0YSwKICAgICAgICAgICAgICAgIE1heCAgPT4gMTAwLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IHRpY2tldAogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9IVE1MTWFzaygKICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgUXVldWVJRCAgICA9PiAkUXVldWVJRCwKICAgICAgICAgICAgQXJ0aWNsZUJveCA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgJVRpY2tldCwKICAgICAgICApOwoKICAgICAgICAjIGFkZCBmb290ZXIKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnRGb290ZXIoKTsKCiAgICAgICAgIyByZXR1cm4gb3V0cHV0CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0SW5mb3MgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXREYXRhfSB9OwogICAgbXkgJVBhZ2UgICA9ICV7ICRQYXJhbXtQYWdlRGF0YX0gfTsKCiAgICAjIGNyZWF0ZSBsZWZ0IHRhYmxlCiAgICBteSAkVGFibGVMZWZ0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1N0YXRlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e1N0YXRlfSApLAogICAgICAgIH0sCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICB7CiMgICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUHJpb3JpdHknKSAuICc6JywKIyAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e1ByaW9yaXR5fSApLAojICAgICAgICB9LAojIC0tLQogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1F1ZXVlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7UXVldWV9LAogICAgICAgIH0sCiAgICBdOwoKICAgICMgYWRkIHR5cGUgcm93LCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgIG15ICRSb3cgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUeXBlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VHlwZX0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRUYWJsZUxlZnR9LCAkUm93ICk7CiAgICB9CgogICAgIyBhZGQgc2VydmljZSBhbmQgc2xhIHJvdywgaWYgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKICAgICAgICBteSAkUm93U2VydmljZSA9IHsKICAgICAgICAgICAgS2V5ID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZXJ2aWNlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7U2VydmljZX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NlcnZpY2UgKTsKICAgICAgICBteSAkUm93U0xBID0gewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1NMQScpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e1NMQX0gfHwgJy0nLAogICAgICAgIH07CiAgICAgICAgcHVzaCggQHskVGFibGVMZWZ0fSwgJFJvd1NMQSApOwogICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgIG15ICRUYWJsZUxlZnRFeHRlbmRlZCA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3JpdGljYWxpdHknKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFRpY2tldHtDcml0aWNhbGl0eX0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0ltcGFjdCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0e0ltcGFjdH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1ByaW9yaXR5JykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCRUaWNrZXR7UHJpb3JpdHl9KSwKICAgICAgICB9LAogICAgXTsKICAgIHB1c2goQHskVGFibGVMZWZ0fSwgQHskVGFibGVMZWZ0RXh0ZW5kZWR9KTsKIyAtLS0KCiAgICAjIGNyZWF0ZSByaWdodCB0YWJsZQogICAgbXkgJFRhYmxlUmlnaHQgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQ3VzdG9tZXJJRCcpIC4gJzonLAogICAgICAgICAgICBWYWx1ZSA9PiAkVGlja2V0e0N1c3RvbWVySUR9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnQWdlJykgLiAnOicsCiAgICAgICAgICAgIFZhbHVlID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkVGlja2V0e0FnZX0gKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0NyZWF0ZWQnKSAuICc6JywKICAgICAgICAgICAgVmFsdWUgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAnJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgICksCiAgICAgICAgfSwKICAgIF07CgogICAgbXkgJFJvd3MgPSBAeyRUYWJsZUxlZnR9OwogICAgaWYgKCBAeyRUYWJsZVJpZ2h0fSA+ICRSb3dzICkgewogICAgICAgICRSb3dzID0gQHskVGFibGVSaWdodH07CiAgICB9CgogICAgbXkgJVRhYmxlUGFyYW07CiAgICBmb3IgbXkgJFJvdyAoIDEgLi4gJFJvd3MgKSB7CiAgICAgICAgJFJvdy0tOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlTGVmdC0+WyRSb3ddLT57S2V5fTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgICAgICAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gICAgICAgICA9ICRUYWJsZUxlZnQtPlskUm93XS0+e1ZhbHVlfTsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17Q29udGVudH0gICAgICAgICA9ICcgJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMl17QmFja2dyb3VuZENvbG9yfSA9ICcjRkZGRkZGJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bM117Q29udGVudH0gICAgICAgICA9ICRUYWJsZVJpZ2h0LT5bJFJvd10tPntLZXl9OwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVszXXtGb250fSAgICAgICAgICAgID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVs0XXtDb250ZW50fSAgICAgICAgID0gJFRhYmxlUmlnaHQtPlskUm93XS0+e1ZhbHVlfTsKICAgIH0KCiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDE3MC41OwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMl17V2lkdGh9ID0gNDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzNde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bNF17V2lkdGh9ID0gMTcwLjU7CgogICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgICAgID0gMDsKICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgICAgID0gNjsKICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvckV2ZW59ID0gJyNBQUFBQUEnOwogICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yT2RkfSAgPSAnI0RERERERCc7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgICAgICA9IDE7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgICAgICA9IDM7CiAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgICAgICA9IDM7CgogICAgIyBvdXRwdXQgdGFibGUKICAgIGZvciAoICRQYWdle1BhZ2VDb3VudH0gLi4gJFBhZ2V7TWF4UGFnZXN9ICkgewoKICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAjIHN0b3Agb3V0cHV0IG9yIG91dHB1dCBuZXh0IHBhZ2UKICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICVQYWdlLCBGb290ZXJSaWdodCA9PiAkUGFnZXtQYWdlVGV4dH0gLiAnICcgLiAkUGFnZXtQYWdlQ291bnR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RnJlZVRleHQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDE2ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGRpc2FibGUgdGlja2V0IGZyZWUgdGV4dCAxMyBhbmQgMTQKICAgICAgICBpZiAoICROdW1iZXIgZXEgMTMgfHwgJE51bWJlciBlcSAxNCApIHsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CiMgLS0tCiAgICAgICAgbmV4dCBpZiAhJFRpY2tldHsiVGlja2V0RnJlZVRleHQkTnVtYmVyIn07CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57ICdUaWNrZXRGcmVlVGV4dCcgLiAkTnVtYmVyIH07CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZUtleSROdW1iZXIifSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgJFRhYmxlUGFyYW17Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFRpY2tldHsiVGlja2V0RnJlZVRleHQkTnVtYmVyIn07CgogICAgICAgICRSb3crKzsKICAgICAgICAkT3V0cHV0ID0gMTsKICAgIH0KICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMV17V2lkdGh9ID0gNDMxOwoKICAgICMgb3V0cHV0IHRpY2tldCBmcmVldGV4dAogICAgaWYgKCRPdXRwdXQpIHsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTE1LAogICAgICAgICk7CgogICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5UZXh0KAogICAgICAgICAgICBUZXh0ICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnVGlja2V0RnJlZVRleHQnKSwKICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgVHlwZSAgICAgPT4gJ0N1dCcsCiAgICAgICAgICAgIEZvbnQgICAgID0+ICdQcm9wb3J0aW9uYWxCb2xkSXRhbGljJywKICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgQ29sb3IgICAgPT4gJyM2NjY2NjYnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IG5ldyBwb3NpdGlvbgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC00LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zCiAgICAgICAgJFRhYmxlUGFyYW17VHlwZX0gICAgICAgICAgICA9ICdDdXQnOwogICAgICAgICRUYWJsZVBhcmFte0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFte0ZvbnRTaXplfSAgICAgICAgPSA2OwogICAgICAgICRUYWJsZVBhcmFte0JhY2tncm91bmRDb2xvcn0gPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ1RvcH0gICAgICA9IDM7CiAgICAgICAgJFRhYmxlUGFyYW17UGFkZGluZ0JvdHRvbX0gICA9IDM7CgogICAgICAgICMgb3V0cHV0IHRhYmxlCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0gPSAkU2VsZi0+e1BERk9iamVjdH0tPlRhYmxlKCAlVGFibGVQYXJhbSwgKTsKCiAgICAgICAgICAgICMgc3RvcCBvdXRwdXQgb3Igb3V0cHV0IG5leHQgcGFnZQogICAgICAgICAgICBpZiAoICRUYWJsZVBhcmFte1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfUERGT3V0cHV0VGlja2V0RnJlZVRpbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICROZWVkZWQgKHF3KFBhZ2VEYXRhIFRpY2tldERhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCA9IDA7CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldERhdGF9IH07CiAgICBteSAlUGFnZSAgID0gJXsgJFBhcmFte1BhZ2VEYXRhfSB9OwoKICAgIG15ICVUYWJsZVBhcmFtOwogICAgbXkgJFJvdyA9IDA7CgogICAgIyBnZW5lcmF0ZSB0YWJsZQogICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDYgKSB7CiAgICAgICAgbmV4dCBpZiAhJFRpY2tldHsiVGlja2V0RnJlZVRpbWUkTnVtYmVyIn07CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57ICdUaWNrZXRGcmVlVGltZScgLiAkTnVtYmVyIH07CgogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZUtleSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJE51bWJlciApIHx8ICcnOwogICAgICAgIG15ICRUaWNrZXRGcmVlVGltZSA9ICRUaWNrZXR7IlRpY2tldEZyZWVUaW1lJE51bWJlciJ9OwoKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkVGlja2V0RnJlZVRpbWVLZXkpIC4gJzonOwogICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGUgPT4gJyRUaW1lTG9uZ3siJERhdGF7IlRpY2tldEZyZWVUaW1lIn0ifScsCiAgICAgICAgICAgIERhdGEgPT4geyBUaWNrZXRGcmVlVGltZSA9PiAkVGlja2V0RnJlZVRpbWUsIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFJvdysrOwogICAgICAgICRPdXRwdXQgPSAxOwogICAgfQogICAgJFRhYmxlUGFyYW17Q29sdW1uRGF0YX1bMF17V2lkdGh9ID0gODA7CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgIyBvdXRwdXQgdGlja2V0IGZyZWV0aW1lCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdUaWNrZXRGcmVlVGltZScpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRDdXN0b21lckluZm9zIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkTmVlZGVkIChxdyhQYWdlRGF0YSBDdXN0b21lckRhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJE91dHB1dCAgICAgICA9IDA7CiAgICBteSAlQ3VzdG9tZXJEYXRhID0gJXsgJFBhcmFte0N1c3RvbWVyRGF0YX0gfTsKICAgIG15ICVQYWdlICAgICAgICAgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CiAgICBteSAlVGFibGVQYXJhbTsKICAgIG15ICRSb3cgPSAwOwogICAgbXkgJE1hcCA9ICRDdXN0b21lckRhdGF7Q29uZmlnfS0+e01hcH07CgogICAgIyBjaGVjayBpZiBjdXN0b21lciBjb21wYW55IHN1cHBvcnQgaXMgZW5hYmxlZAogICAgaWYgKCAkQ3VzdG9tZXJEYXRhe0NvbmZpZ30tPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSApIHsKICAgICAgICBteSAkTWFwMiA9ICRDdXN0b21lckRhdGF7Q29tcGFueUNvbmZpZ30tPntNYXB9OwogICAgICAgIGlmICgkTWFwMikgewogICAgICAgICAgICBwdXNoKCBAeyRNYXB9LCBAeyRNYXAyfSApOwogICAgICAgIH0KICAgIH0KICAgIGZvciBteSAkRmllbGQgKCBAeyRNYXB9ICkgewogICAgICAgIGlmICggJHskRmllbGR9WzNdICYmICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9ICkgewogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICR7JEZpZWxkfVsxXSApIC4gJzonOwogICAgICAgICAgICAkVGFibGVQYXJhbXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFte0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRDdXN0b21lckRhdGF7ICR7JEZpZWxkfVswXSB9OwoKICAgICAgICAgICAgJFJvdysrOwogICAgICAgICAgICAkT3V0cHV0ID0gMTsKICAgICAgICB9CiAgICB9CiAgICAkVGFibGVQYXJhbXtDb2x1bW5EYXRhfVswXXtXaWR0aH0gPSA4MDsKICAgICRUYWJsZVBhcmFte0NvbHVtbkRhdGF9WzFde1dpZHRofSA9IDQzMTsKCiAgICBpZiAoJE91dHB1dCkgewoKICAgICAgICAjIHNldCBuZXcgcG9zaXRpb24KICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtMTUsCiAgICAgICAgKTsKCiAgICAgICAgIyBvdXRwdXQgaGVhZGxpbmUKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlRleHQoCiAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDdXN0b21lciBJbmZvcm1hdGlvbicpLAogICAgICAgICAgICBIZWlnaHQgICA9PiA3LAogICAgICAgICAgICBUeXBlICAgICA9PiAnQ3V0JywKICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICBGb250U2l6ZSA9PiA3LAogICAgICAgICAgICBDb2xvciAgICA9PiAnIzY2NjY2NicsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgbmV3IHBvc2l0aW9uCiAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgIFkgICAgPT4gLTQsCiAgICAgICAgKTsKCiAgICAgICAgIyB0YWJsZSBwYXJhbXMKICAgICAgICAkVGFibGVQYXJhbXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW17Qm9yZGVyfSAgICAgICAgICA9IDA7CiAgICAgICAgJFRhYmxlUGFyYW17Rm9udFNpemV9ICAgICAgICA9IDY7CiAgICAgICAgJFRhYmxlUGFyYW17QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nfSAgICAgICAgID0gMTsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nVG9wfSAgICAgID0gMzsKICAgICAgICAkVGFibGVQYXJhbXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUKICAgICAgICBmb3IgKCAkUGFnZXtQYWdlQ291bnR9IC4uICRQYWdle01heFBhZ2VzfSApIHsKCiAgICAgICAgICAgICMgb3V0cHV0IHRhYmxlIChvciBhIGZyYWdtZW50IG9mIGl0KQogICAgICAgICAgICAlVGFibGVQYXJhbSA9ICRTZWxmLT57UERGT2JqZWN0fS0+VGFibGUoICVUYWJsZVBhcmFtLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW17U3RhdGV9ICkgewogICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UGFnZU5ldygKICAgICAgICAgICAgICAgICAgICAlUGFnZSwgRm9vdGVyUmlnaHQgPT4gJFBhZ2V7UGFnZVRleHR9IC4gJyAnIC4gJFBhZ2V7UGFnZUNvdW50fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkUGFnZXtQYWdlQ291bnR9Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKc3ViIF9QREZPdXRwdXRBcnRpY2xlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJE5lZWRlZCAocXcoUGFnZURhdGEgQXJ0aWNsZURhdGEpKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCggJFBhcmFteyROZWVkZWR9ICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICROZWVkZWQhIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVBhZ2UgPSAleyAkUGFyYW17UGFnZURhdGF9IH07CgogICAgbXkgJEFydGljbGVDb3VudGVyID0gMTsKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoIEB7ICRQYXJhbXtBcnRpY2xlRGF0YX0gfSApIHsKICAgICAgICBpZiAoICRBcnRpY2xlQ291bnRlciA9PSAxICkgewogICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICAgICAgTW92ZSA9PiAncmVsYXRpdicsCiAgICAgICAgICAgICAgICBZICAgID0+IC0xNSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgb3V0cHV0IGhlYWRsaW5lCiAgICAgICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgICAgIFRleHQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdBcnRpY2xlcycpLAogICAgICAgICAgICAgICAgSGVpZ2h0ICAgPT4gNywKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICAgICAgRm9udCAgICAgPT4gJ1Byb3BvcnRpb25hbEJvbGRJdGFsaWMnLAogICAgICAgICAgICAgICAgRm9udFNpemUgPT4gNywKICAgICAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntQREZPYmplY3R9LT5Qb3NpdGlvblNldCgKICAgICAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICAgICAgWSAgICA9PiAyLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICBteSAkQXR0YWNobWVudHM7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEF0dGFjaG1lbnRzIC49ICRGaWxle0ZpbGVuYW1lfSAuICcgKCcgLiAkRmlsZXtGaWxlc2l6ZX0gLiAiKVxuIjsKICAgICAgICB9CgogICAgICAgICMgZ2VuZXJhdGUgYXJ0aWNsZSBpbmZvIHRhYmxlCiAgICAgICAgbXkgJVRhYmxlUGFyYW0xOwogICAgICAgIG15ICRSb3cgPSAwOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAtNiwKICAgICAgICApOwoKICAgICAgICAjIGFydGljbGUgbnVtYmVyIHRhZwogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+VGV4dCgKICAgICAgICAgICAgVGV4dCAgICAgPT4gJyAgICAjICcgLiAkQXJ0aWNsZUNvdW50ZXIsCiAgICAgICAgICAgIEhlaWdodCAgID0+IDcsCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdDdXQnLAogICAgICAgICAgICBGb250ICAgICA9PiAnUHJvcG9ydGlvbmFsQm9sZEl0YWxpYycsCiAgICAgICAgICAgIEZvbnRTaXplID0+IDcsCiAgICAgICAgICAgIENvbG9yICAgID0+ICcjNjY2NjY2JywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBvc2l0aW9uU2V0KAogICAgICAgICAgICBNb3ZlID0+ICdyZWxhdGl2JywKICAgICAgICAgICAgWSAgICA9PiAyLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JFBhcmFtZXRlcn0gKSB7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgkUGFyYW1ldGVyKSAuICc6JzsKICAgICAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJEFydGljbGV7JFBhcmFtZXRlcn07CiAgICAgICAgICAgICAgICAkUm93Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtDb250ZW50fQogICAgICAgICAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdDcmVhdGVkJykgLiAnOic7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSAgICA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzFde0NvbnRlbnR9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlID0+ICckVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifScsCiAgICAgICAgICAgIERhdGEgICAgID0+IFwlQXJ0aWNsZSwKICAgICAgICApOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgLj0gJyAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ2J5Jyk7CiAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fQogICAgICAgICAgICAuPSAnICcgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJEFydGljbGV7U2VuZGVyVHlwZX0gKTsKICAgICAgICAkUm93Kys7CiAgICAgICAgZm9yIG15ICROdW1iZXIgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG5leHQgaWYgISRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkTnVtYmVyIn07CiAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+eyAnQXJ0aWNsZUZyZWVUZXh0JyAuICROdW1iZXIgfTsKCiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkTnVtYmVyIn0gLiAnOic7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Rm9udH0gICAgPSAnUHJvcG9ydGlvbmFsQm9sZCc7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0gPSAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JE51bWJlciJ9OwogICAgICAgICAgICAkUm93Kys7CiAgICAgICAgfQoKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0NvbnRlbnR9CiAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1R5cGUnKSAuICc6JzsKICAgICAgICAkVGFibGVQYXJhbTF7Q2VsbERhdGF9WyRSb3ddWzBde0ZvbnR9ID0gJ1Byb3BvcnRpb25hbEJvbGQnOwogICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMV17Q29udGVudH0KICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJEFydGljbGV7QXJ0aWNsZVR5cGV9ICk7CiAgICAgICAgJFJvdysrOwoKICAgICAgICBpZiAoJEF0dGFjaG1lbnRzKSB7CiAgICAgICAgICAgICRUYWJsZVBhcmFtMXtDZWxsRGF0YX1bJFJvd11bMF17Q29udGVudH0KICAgICAgICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnQnKSAuICc6JzsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVswXXtGb250fSA9ICdQcm9wb3J0aW9uYWxCb2xkJzsKICAgICAgICAgICAgY2hvbXAoJEF0dGFjaG1lbnRzKTsKICAgICAgICAgICAgJFRhYmxlUGFyYW0xe0NlbGxEYXRhfVskUm93XVsxXXtDb250ZW50fSA9ICRBdHRhY2htZW50czsKICAgICAgICB9CiAgICAgICAgJFRhYmxlUGFyYW0xe0NvbHVtbkRhdGF9WzBde1dpZHRofSA9IDgwOwogICAgICAgICRUYWJsZVBhcmFtMXtDb2x1bW5EYXRhfVsxXXtXaWR0aH0gPSA0MzE7CgogICAgICAgICRTZWxmLT57UERGT2JqZWN0fS0+UG9zaXRpb25TZXQoCiAgICAgICAgICAgIE1vdmUgPT4gJ3JlbGF0aXYnLAogICAgICAgICAgICBZICAgID0+IC02LAogICAgICAgICk7CgogICAgICAgICMgdGFibGUgcGFyYW1zIChhcnRpY2xlIGluZm9zKQogICAgICAgICRUYWJsZVBhcmFtMXtUeXBlfSAgICAgICAgICAgID0gJ0N1dCc7CiAgICAgICAgJFRhYmxlUGFyYW0xe0JvcmRlcn0gICAgICAgICAgPSAwOwogICAgICAgICRUYWJsZVBhcmFtMXtGb250U2l6ZX0gICAgICAgID0gNjsKICAgICAgICAkVGFibGVQYXJhbTF7QmFja2dyb3VuZENvbG9yfSA9ICcjREREREREJzsKICAgICAgICAkVGFibGVQYXJhbTF7UGFkZGluZ30gICAgICAgICA9IDE7CiAgICAgICAgJFRhYmxlUGFyYW0xe1BhZGRpbmdUb3B9ICAgICAgPSAzOwogICAgICAgICRUYWJsZVBhcmFtMXtQYWRkaW5nQm90dG9tfSAgID0gMzsKCiAgICAgICAgIyBvdXRwdXQgdGFibGUgKGFydGljbGUgaW5mb3MpCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0xID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0xLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0xe1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHRhYmxlIHBhcmFtcyAoYXJ0aWNsZSBib2R5KQogICAgICAgIG15ICVUYWJsZVBhcmFtMjsKICAgICAgICAkVGFibGVQYXJhbTJ7Q2VsbERhdGF9WzBdWzBde0NvbnRlbnR9ID0gJEFydGljbGV7Qm9keX0gfHwgJyAnOwogICAgICAgICRUYWJsZVBhcmFtMntUeXBlfSAgICAgICAgICAgICAgICAgICAgPSAnQ3V0JzsKICAgICAgICAkVGFibGVQYXJhbTJ7Qm9yZGVyfSAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICAkVGFibGVQYXJhbTJ7Rm9udH0gICAgICAgICAgICAgICAgICAgID0gJ01vbm9zcGFjZWQnOwogICAgICAgICRUYWJsZVBhcmFtMntGb250U2l6ZX0gICAgICAgICAgICAgICAgPSA3OwogICAgICAgICRUYWJsZVBhcmFtMntCYWNrZ3JvdW5kQ29sb3J9ICAgICAgICAgPSAnI0RERERERCc7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmd9ICAgICAgICAgICAgICAgICA9IDQ7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmdUb3B9ICAgICAgICAgICAgICA9IDg7CiAgICAgICAgJFRhYmxlUGFyYW0ye1BhZGRpbmdCb3R0b219ICAgICAgICAgICA9IDg7CgogICAgICAgICMgb3V0cHV0IHRhYmxlIChhcnRpY2xlIGJvZHkpCiAgICAgICAgZm9yICggJFBhZ2V7UGFnZUNvdW50fSAuLiAkUGFnZXtNYXhQYWdlc30gKSB7CgogICAgICAgICAgICAjIG91dHB1dCB0YWJsZSAob3IgYSBmcmFnbWVudCBvZiBpdCkKICAgICAgICAgICAgJVRhYmxlUGFyYW0yID0gJFNlbGYtPntQREZPYmplY3R9LT5UYWJsZSggJVRhYmxlUGFyYW0yLCApOwoKICAgICAgICAgICAgIyBzdG9wIG91dHB1dCBvciBvdXRwdXQgbmV4dCBwYWdlCiAgICAgICAgICAgIGlmICggJFRhYmxlUGFyYW0ye1N0YXRlfSApIHsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e1BERk9iamVjdH0tPlBhZ2VOZXcoCiAgICAgICAgICAgICAgICAgICAgJVBhZ2UsIEZvb3RlclJpZ2h0ID0+ICRQYWdle1BhZ2VUZXh0fSAuICcgJyAuICRQYWdle1BhZ2VDb3VudH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFBhZ2V7UGFnZUNvdW50fSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRBcnRpY2xlQ291bnRlcisrOwogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfSFRNTE1hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG91dHB1dCB0eXBlLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFR5cGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBvdXRwdXQgc2VydmljZSBhbmQgc2xhLCBpZiBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldFNlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIFNlcnZpY2UgPT4gJFBhcmFte1NlcnZpY2V9IHx8ICctJywKICAgICAgICAgICAgICAgIFNMQSAgICAgPT4gJFBhcmFte1NMQX0gICAgIHx8ICctJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZmxhZyB0byBjb250cm9sIHRoZSBoZWFkZXIgcHJpbnQKICAgIG15ICRIZWFkZXJGbGFnID0gMDsKCiAgICAjIHRpY2tldCBmcmVlIHRleHQKICAgIGZvciBteSAkTnVtYmVyICggMSAuLiAxNiApIHsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgIyBkaXNhYmxlIHRpY2tldCBmcmVlIHRleHQgMTMgYW5kIDE0CiAgICAgICAgaWYgKCAkTnVtYmVyIGVxIDEzIHx8ICROdW1iZXIgZXEgMTQgKSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIG5leHQgaWYgISRQYXJhbXsiVGlja2V0RnJlZVRleHQkTnVtYmVyIn07CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57ICdUaWNrZXRGcmVlVGV4dCcgLiAkTnVtYmVyIH07CgogICAgICAgICMgZGlzcGxheSB0aGUgaGVhZGVyIG9ubHkgb25jZQogICAgICAgIGlmICggISRIZWFkZXJGbGFnICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKCBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dEhlYWRlcicgKTsKICAgICAgICAgICAgJEhlYWRlckZsYWcgPSAxOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJE51bWJlciwKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5JyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICROdW1iZXIgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICROdW1iZXIsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkSGVhZGVyRmxhZyA9IDA7CgogICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gNiApIHsKICAgICAgICBuZXh0IGlmICEkUGFyYW17IlRpY2tldEZyZWVUaW1lJE51bWJlciJ9OwogICAgICAgIG5leHQgaWYgISRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+eyAnVGlja2V0RnJlZVRpbWUnIC4gJE51bWJlciB9OwoKICAgICAgICAjIGRpc3BsYXkgdGhlIGhlYWRlciBvbmx5IG9uY2UKICAgICAgICBpZiAoICEkSGVhZGVyRmxhZyApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnVGlja2V0RnJlZVRpbWVIZWFkZXInICk7CiAgICAgICAgICAgICRIZWFkZXJGbGFnID0gMTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICROdW1iZXIsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkTnVtYmVyICksCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkTnVtYmVyIH0sCiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkTnVtYmVyLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBidWlsZCBhcnRpY2xlIHN0dWZmCiAgICBteSAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkUGFyYW17QXJ0aWNsZUlEfSB8fCAnJzsKICAgIG15IEBBcnRpY2xlQm94ID0gQHsgJFBhcmFte0FydGljbGVCb3h9IH07CgogICAgIyBnZXQgbGFzdCBjdXN0b21lciBhcnRpY2xlCiAgICBmb3IgbXkgJEFydGljbGVUbXAgKEBBcnRpY2xlQm94KSB7CiAgICAgICAgbXkgJUFydGljbGUgPSAleyRBcnRpY2xlVG1wfTsKCiAgICAgICAgIyBnZXQgYXR0YWNobWVudCBzdHJpbmcKICAgICAgICBteSAlQXRtSW5kZXggPSAoKTsKICAgICAgICBpZiAoICRBcnRpY2xle0F0bXN9ICkgewogICAgICAgICAgICAlQXRtSW5kZXggPSAleyAkQXJ0aWNsZXtBdG1zfSB9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17J0FydGljbGU6OkFUTSd9ID0gJyc7CiAgICAgICAgZm9yIG15ICRGaWxlSUQgKCBrZXlzICVBdG1JbmRleCApIHsKICAgICAgICAgICAgbXkgJUZpbGUgPSAleyAkQXRtSW5kZXh7JEZpbGVJRH0gfTsKICAgICAgICAgICAgJEZpbGV7RmlsZW5hbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKCBUZXh0ID0+ICRGaWxle0ZpbGVuYW1lfSApOwogICAgICAgICAgICAkUGFyYW17J0FydGljbGU6OkFUTSd9CiAgICAgICAgICAgICAgICAuPSAnPGEgaHJlZj0iJEVudnsiQ0dJSGFuZGxlIn0vJFFEYXRheyJGaWxlbmFtZSJ9P0FjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQmJwogICAgICAgICAgICAgICAgLiAiQXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH07RmlsZUlEPSRGaWxlSURcIiB0YXJnZXQ9XCJhdHRhY2htZW50XCIgIgogICAgICAgICAgICAgICAgLiAib25tb3VzZW92ZXI9XCJ3aW5kb3cuc3RhdHVzPSdcJFRleHR7XCJEb3dubG9hZFwifTogJEZpbGV7RmlsZW5hbWV9JzsiCiAgICAgICAgICAgICAgICAuICcgcmV0dXJuIHRydWU7IiBvbm1vdXNlb3V0PSJ3aW5kb3cuc3RhdHVzPVwnXCc7Ij4nCiAgICAgICAgICAgICAgICAuICIkRmlsZXtGaWxlbmFtZX08L2E+ICRGaWxle0ZpbGVzaXplfTxici8+IjsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYganVzdCBhIG9ubHkgaHRtbCBlbWFpbAogICAgICAgIG15ICRNaW1lVHlwZVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrTWltZVR5cGUoCiAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICApOwogICAgICAgIGlmICgkTWltZVR5cGVUZXh0KSB7CiAgICAgICAgICAgICRQYXJhbXtUZXh0Tm90ZX0gPSAkTWltZVR5cGVUZXh0OwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSAgID0gJyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgIyBodG1sIHF1b3RpbmcKICAgICAgICAgICAgJEFydGljbGV7Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBOZXdMaW5lID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGV7Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld0xpbmVzJykgfHwgNTAwMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgZG8gY2hhcnNldCBjaGVjawogICAgICAgICAgICBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCgKICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDaGFyc2V0VGV4dCkgewogICAgICAgICAgICAgICAgJFBhcmFteydBcnRpY2xlOjpUZXh0Tm90ZSd9ID0gJENoYXJzZXRUZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CgogICAgICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgICAgIGZvciBteSAkUGFyYW1ldGVyIChxdyhGcm9tIFRvIENjIFN1YmplY3QpKSB7CiAgICAgICAgICAgIGlmICggJEFydGljbGV7JFBhcmFtZXRlcn0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRQYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRQYXJhbWV0ZXJ9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJE51bWJlciAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbmV4dCBpZiAhJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCROdW1iZXIifTsKICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57ICdBcnRpY2xlRnJlZVRleHQnIC4gJE51bWJlciB9OwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkTnVtYmVyIn0sCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJEFydGljbGV7IkFydGljbGVGcmVlVGV4dCROdW1iZXIifSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0UHJpbnQnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0N1c3RvbWVyVGlja2V0Wm9vbS5wbSAtIHRvIGdldCBhIGNsb3NlciB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lclRpY2tldFpvb20ucG0sdiAxLjEzIDIwMTAvMTIvMDYgMTk6MzM6MDkgZW4gRXhwICQKIyAkT2xkSWQ6IEN1c3RvbWVyVGlja2V0Wm9vbS5wbSx2IDEuNzUgMjAxMC8xMS8yNiAyMToxNjo1MCBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkN1c3RvbWVyVGlja2V0Wm9vbTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6V2ViOjpVcGxvYWRDYWNoZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKIyAtLS0KIyBJVFNNCiMgLS0tCnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CiMgLS0tCgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEzICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IExvZ09iamVjdCBRdWV1ZU9iamVjdAogICAgICAgIENvbmZpZ09iamVjdCBVc2VyT2JqZWN0IFNlc3Npb25PYmplY3QKICAgICAgICApCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGUtPm5ldyglUGFyYW0pOwojIC0tLQojIElUU00KIyAtLS0KICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVySGVhZGVyKCBUaXRsZSA9PiAnRXJyb3InICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRXJyb3IoIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEN1c3RvbWVyUGVybWlzc2lvbigKICAgICAgICBUeXBlICAgICA9PiAncm8nLAogICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfQogICAgKTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggISRBY2Nlc3MgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOb1Blcm1pc3Npb24oIFdpdGhIZWFkZXIgPT4gJ3llcycgKTsKICAgIH0KCiAgICAjIHN0b3JlIGxhc3Qgc2NyZWVuCiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBuZSAnU2hvd0hUTUxlTWFpbCcgKSB7CiAgICAgICAgJFNlbGYtPntTZXNzaW9uT2JqZWN0fS0+VXBkYXRlU2Vzc2lvbklEKAogICAgICAgICAgICBTZXNzaW9uSUQgPT4gJFNlbGYtPntTZXNzaW9uSUR9LAogICAgICAgICAgICBLZXkgICAgICAgPT4gJ0xhc3RTY3JlZW5WaWV3JywKICAgICAgICAgICAgVmFsdWUgICAgID0+ICRTZWxmLT57UmVxdWVzdGVkVVJMfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CgogICAgIyBzdHJpcCBodG1sIGFuZCBhc2NpaSBhdHRhY2htZW50cyBvZiBjb250ZW50CiAgICBteSAkU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQgPSAxOwoKICAgICMgY2hlY2sgaWYgcmljaCB0ZXh0IGlzIGVuYWJsZWQsIGlmIG5vdCBvbmx5IHN0aXAgYXNjaWkgYXR0YWNobWVudHMKICAgIGlmICggISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgJFN0cmlwUGxhaW5Cb2R5QXNBdHRhY2htZW50ID0gMjsKICAgIH0KCiAgICAjIGdldCBhbGwgYXJ0aWNsZSBvZiB0aGlzIHRpY2tldAogICAgbXkgQEN1c3RvbWVyQXJ0aWNsZVR5cGVzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxpc3QoIFR5cGUgPT4gJ0N1c3RvbWVyJyApOwogICAgbXkgQEFydGljbGVCb3ggPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDb250ZW50SW5kZXgoCiAgICAgICAgVGlja2V0SUQgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgQXJ0aWNsZVR5cGUgICAgICAgICAgICAgICAgPT4gXEBDdXN0b21lckFydGljbGVUeXBlcywKICAgICAgICBTdHJpcFBsYWluQm9keUFzQXR0YWNobWVudCA9PiAkU3RyaXBQbGFpbkJvZHlBc0F0dGFjaG1lbnQsCiAgICAgICAgVXNlcklEICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAjIGdldCBwYXJhbXMKICAgIG15ICVHZXRQYXJhbTsKICAgIGZvciBteSAkS2V5IChxdyggU3ViamVjdCBCb2R5IFN0YXRlSUQgUHJpb3JpdHlJRCkpIHsKICAgICAgICAkR2V0UGFyYW17JEtleX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgIH0KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAnLSc7CgogICAgaWYgKCRUaWNrZXR7VGlja2V0RnJlZVRleHQxM30pIHsKCiAgICAgICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKCiAgICAgICAgJFRpY2tldHtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JFRpY2tldHtUaWNrZXRGcmVlVGV4dDEzfX07CiAgICB9CgogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkVGlja2V0e0ltcGFjdH0gPSAnLSc7CgogICAgaWYgKCRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0pIHsKCiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKCiAgICAgICAgJFRpY2tldHtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskVGlja2V0e1RpY2tldEZyZWVUZXh0MTR9fTsKICAgIH0KIyAtLS0KCiAgICAjIGNoZWNrIGZvbGxvdyB1cAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKICAgICAgICBteSAkTmV4dFNjcmVlbiA9ICRTZWxmLT57TmV4dFNjcmVlbn0gfHwgJFNlbGYtPntDb25maWd9LT57TmV4dFNjcmVlbkFmdGVyRm9sbG93VXB9OwogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyByZXdyYXAgYm9keSBpZiByaWNoIHRleHQgaXMgdXNlZAogICAgICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fQogICAgICAgICAgICAgICAgPX4gcy8oXj4uK3wuezQsJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpfSkoPzpcc3xceikvJDFcbi9nbTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZvbGxvdyB1cCBvcHRpb24gKHBvc3NpYmxlIG9yIG5vdCkKICAgICAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRGb2xsb3dVcE9wdGlvbigKICAgICAgICAgICAgUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGxvY2sgb3B0aW9uIChzaG91bGQgYmUgdGhlIHRpY2tldCBsb2NrZWQgLSBpZiBjbG9zZWQgLSBhZnRlciB0aGUgZm9sbG93IHVwKQogICAgICAgIG15ICRMb2NrID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldEZvbGxvd1VwTG9ja09wdGlvbiggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9LCApOwoKICAgICAgICAjIGdldCB0aWNrZXQgc3RhdGUgZGV0YWlscwogICAgICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFRpY2tldHtTdGF0ZUlEfSwKICAgICAgICApOwogICAgICAgIGlmICggJEZvbGxvd1VwUG9zc2libGUgPX4gLyhuZXcgdGlja2V0fHJlamVjdCkvaSAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyV2FybmluZygKICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ0NhblwndCByZW9wZW4gdGlja2V0LCBub3QgcG9zc2libGUgaW4gdGhpcyBxdWV1ZSEnLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnQ3JlYXRlIGEgbmV3IHRpY2tldCEnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHJld3JhcCBib2R5IGlmIHJpY2ggdGV4dCBpcyB1c2VkCiAgICAgICAgaWYgKCAkR2V0UGFyYW17Qm9keX0gJiYgJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QnJvd3NlclJpY2hUZXh0fSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9CiAgICAgICAgICAgICAgICA9fiBzLyhePi4rfC57NCwkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlJyl9KSg/OlxzfFx6KS8kMVxuL2dtOwogICAgICAgIH0KCiAgICAgICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgICAgICBteSAkSXNVcGxvYWQgPSAwOwoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMzIgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJENvdW50IiApOwogICAgICAgICAgICBuZXh0IGlmICEkRGVsZXRlOwogICAgICAgICAgICAkR2V0UGFyYW17Rm9sbG93VXBWaXNpYmxlfSA9ICdWaXNpYmxlJzsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ICAgPSAxOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEUmVtb3ZlRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICBGaWxlSUQgPT4gJENvdW50LAogICAgICAgICAgICApOwogICAgICAgICAgICAkSXNVcGxvYWQgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBhdHRhY2htZW50IHVwbG9hZAogICAgICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudFVwbG9hZCcgKSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0ZvbGxvd1VwVmlzaWJsZX0gPSAnVmlzaWJsZSc7CiAgICAgICAgICAgICRFcnJvcntBdHRhY2htZW50VXBsb2FkfSAgID0gMTsKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAiZmlsZV91cGxvYWQiLAogICAgICAgICAgICAgICAgU291cmNlID0+ICdzdHJpbmcnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlEQWRkRmlsZSgKICAgICAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICAgICAlVXBsb2FkU3R1ZmYsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRJc1VwbG9hZCA9IDE7CiAgICAgICAgfQoKICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXtCb2R5fSB8fCAkR2V0UGFyYW17Qm9keX0gZXEgJzxiciAvPicgKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7UmljaFRleHRJbnZhbGlkfSAgICA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Rm9sbG93VXBWaXNpYmxlfSA9ICdWaXNpYmxlJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGVkaXQgYWdhaW4KICAgICAgICBpZiAoJUVycm9yKSB7CgogICAgICAgICAgICAjIGdlbmVyYXRlIG91dHB1dAogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lck5hdmlnYXRpb25CYXIoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUJveCA9PiBcQEFydGljbGVCb3gsCiAgICAgICAgICAgICAgICBFcnJvcnMgICAgID0+IFwlRXJyb3IsCiAgICAgICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJGb290ZXIoKTsKICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBsb2NrIGlmIHRpY2tldCB3YXMgY2xvc2VkCiAgICAgICAgaWYgKCAkTG9jayAmJiAkU3RhdGV7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSAmJiAkVGlja2V0e093bmVySUR9IG5lICcxJyApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkRnJvbSA9ICIkU2VsZi0+e1VzZXJGaXJzdG5hbWV9ICRTZWxmLT57VXNlckxhc3RuYW1lfSA8JFNlbGYtPntVc2VyRW1haWx9PiI7CgogICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRNaW1lVHlwZSA9ICd0ZXh0L2h0bWwnOwoKICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0RG9jdW1lbnRDb21wbGV0ZSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBteSAkQXJ0aWNsZUlEID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlQ3JlYXRlKAogICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGV9LAogICAgICAgICAgICBTZW5kZXJUeXBlICA9PiAkU2VsZi0+e0NvbmZpZ30tPntTZW5kZXJUeXBlfSwKICAgICAgICAgICAgRnJvbSAgICAgICAgPT4gJEZyb20sCiAgICAgICAgICAgIFN1YmplY3QgICAgID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgQm9keSAgICAgICAgPT4gJEdldFBhcmFte0JvZHl9LAogICAgICAgICAgICBNaW1lVHlwZSAgICA9PiAkTWltZVR5cGUsCiAgICAgICAgICAgIENoYXJzZXQgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgT3JpZ0hlYWRlciAgPT4gewogICAgICAgICAgICAgICAgRnJvbSAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIFRvICAgICAgPT4gJ1N5c3RlbScsCiAgICAgICAgICAgICAgICBTdWJqZWN0ID0+ICRHZXRQYXJhbXtTdWJqZWN0fSwKICAgICAgICAgICAgICAgIEJvZHkgICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSggU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSApLAogICAgICAgICAgICB9LAogICAgICAgICAgICBIaXN0b3J5VHlwZSAgICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0hpc3RvcnlUeXBlfSwKICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0gfHwgJyUlJywKICAgICAgICAgICAgQXV0b1Jlc3BvbnNlVHlwZSA9PiAnYXV0byBmb2xsb3cgdXAnLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJEFydGljbGVJRCApIHsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJIZWFkZXIoIFRpdGxlID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRXJyb3IoKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CiAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgIH0KCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CgogICAgICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgICAgICBteSAlTmV4dFN0YXRlRGF0YSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCggSUQgPT4gJEdldFBhcmFte1N0YXRlSUR9ICk7CiAgICAgICAgICAgIG15ICROZXh0U3RhdGUgPSAkTmV4dFN0YXRlRGF0YXtOYW1lfQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fQogICAgICAgICAgICAgICAgfHwgJ29wZW4nOwogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlN0YXRlU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBTdGF0ZSAgICAgPT4gJE5leHRTdGF0ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnQ3VzdG9tZXJQYW5lbFVzZXJJRCcpLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgcHJpb3JpdHkKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSAmJiAkR2V0UGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgUHJpb3JpdHlJRCA9PiAkR2V0UGFyYW17UHJpb3JpdHlJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdDdXN0b21lclBhbmVsVXNlcklEJyksCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcmUgbG9hZGVkIGF0dGFjaG1lbnQKICAgICAgICBteSBAQXR0YWNobWVudERhdGEgPSAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fS0+Rm9ybUlER2V0QWxsRmlsZXNEYXRhKAogICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9CiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICBQYXJhbSAgPT4gJ2ZpbGVfdXBsb2FkJywKICAgICAgICAgICAgU291cmNlID0+ICdTdHJpbmcnLAogICAgICAgICk7CiAgICAgICAgaWYgKCVVcGxvYWRTdHVmZikgewogICAgICAgICAgICBwdXNoIEBBdHRhY2htZW50RGF0YSwgXCVVcGxvYWRTdHVmZjsKICAgICAgICB9CgogICAgICAgICMgd3JpdGUgYXR0YWNobWVudHMKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50RGF0YSkgewoKICAgICAgICAgICAgIyBza2lwIGRlbGV0ZWQgaW5saW5lIGltYWdlcwogICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfQogICAgICAgICAgICAgICAgICAgICYmICRBdHRhY2htZW50LT57Q29udGVudElEfSA9fiAvXmlubGluZS8KICAgICAgICAgICAgICAgICAgICAmJiAkR2V0UGFyYW17Qm9keX0gIX4gLyRBdHRhY2htZW50LT57Q29udGVudElEfS87CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICV7JEF0dGFjaG1lbnR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyUGFuZWxVc2VySUQnKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgcmVtb3ZlIHByZSBzdWJtaXRlZCBhdHRhY2htZW50cwogICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byB6b29tIHZpZXcKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SZWRpcmVjdCgKICAgICAgICAgICAgT1AgPT4gIkFjdGlvbj0kTmV4dFNjcmVlbjtUaWNrZXRJRD0kU2VsZi0+e1RpY2tldElEfSIsCiAgICAgICAgKTsKICAgIH0KCiAgICAkVGlja2V0e1RtcENvdW50ZXJ9ICAgICAgPSAwOwogICAgJFRpY2tldHtUaWNrZXRUaW1lVW5pdHN9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2NvdW50ZWRUaW1lR2V0KAogICAgICAgIFRpY2tldElEID0+ICRUaWNrZXR7VGlja2V0SUR9LAogICAgKTsKCiAgICAjIHNldCBwcmlvcml0eSBmcm9tIHRpY2tldCBhcyBmYWxsYmFjawogICAgJEdldFBhcmFte1ByaW9yaXR5SUR9IHx8PSAkVGlja2V0e1ByaW9yaXR5SUR9OwoKICAgICMgZ2VuZXJhdGUgb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckhlYWRlciggVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9ICk7CiAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJOYXZpZ2F0aW9uQmFyKCk7CgogICAgIyBzaG93IHRpY2tldAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Nob3dIVE1MZU1haWwnICkgewoKICAgICAgICAjIGlmIGl0IGlzIGEgaHRtbCBlbWFpbCwgZHJvcCBub3JtYWwgaGVhZGVyCiAgICAgICAgJFRpY2tldHtTaG93SFRNTGVNYWlsfSA9IDE7CiAgICAgICAgJE91dHB1dCA9ICcnOwogICAgfQogICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICBBcnRpY2xlQm94ID0+IFxAQXJ0aWNsZUJveCwKICAgICAgICAlVGlja2V0LAogICAgICAgICVHZXRQYXJhbSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgSFRNTCBlbWFpbAogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1Nob3dIVE1MZU1haWwnICkgewogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgYWRkIGZvb3RlcgogICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyRm9vdGVyKCk7CgogICAgIyByZXR1cm4gb3V0cHV0CiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIF9NYXNrIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgJFBhcmFte0Zvcm1JRH0gPSAkU2VsZi0+e0Zvcm1JRH07CgogICAgIyBzaG93IGJhY2sgbGluawogICAgaWYgKCAkU2VsZi0+e0xhc3RTY3JlZW5PdmVydmlld30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQmFjaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2V0IGdlbmVyaWMgc3RhdGUgdHlwZQogICAgaWYgKCAkUGFyYW17U3RhdGVUeXBlfSA9fiAvXmNsb3NlZC9pICkgewogICAgICAgICRQYXJhbXtTdGF0ZVR5cGVHZW5lcmljfSA9ICdDbG9zZWQnOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFBhcmFte1N0YXRlVHlwZUdlbmVyaWN9ID0gJ09wZW4nOwogICAgfQoKICAgICMgYnVpbGQgYXJ0aWNsZSBzdHVmZgogICAgbXkgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXJ0aWNsZUlEJyApOwogICAgbXkgJEJhc2VMaW5rICAgICAgICAgID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57QmFzZWxpbmt9IC4gIlRpY2tldElEPSRTZWxmLT57VGlja2V0SUR9JiI7CiAgICBteSBAQXJ0aWNsZUJveCAgICAgICAgPSBAeyAkUGFyYW17QXJ0aWNsZUJveH0gfTsKCiAgICAjIGVycm9yIHNjcmVlbiwgZG9uJ3Qgc2hvdyB0aWNrZXQKICAgIGlmICggIUBBcnRpY2xlQm94ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyTm9QZXJtaXNzaW9uKCBXaXRoSGVhZGVyID0+ICdubycgKTsKICAgIH0KCiAgICAjIHByZXBhcmUgZXJyb3JzIQogICAgaWYgKCAkUGFyYW17RXJyb3JzfSApIHsKICAgICAgICBmb3IgbXkgJEtleUVycm9yICgga2V5cyAleyAkUGFyYW17RXJyb3JzfSB9ICkgewogICAgICAgICAgICAkUGFyYW17JEtleUVycm9yfQogICAgICAgICAgICAgICAgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoIFRleHQgPT4gJFBhcmFte0Vycm9yc30tPnskS2V5RXJyb3J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGxhc3QgY3VzdG9tZXIgYXJ0aWNsZQogICAgbXkgJENvdW50ZXJBcnJheSA9IDA7CiAgICBteSAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEOwogICAgbXkgJExhc3RDdXN0b21lckFydGljbGUgPSAkI0FydGljbGVCb3g7CgogICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlID0gJXskQXJ0aWNsZVRtcH07CgogICAgICAgICMgaWYgaXQgaXMgYSBjdXN0b21lciBhcnRpY2xlCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTZW5kZXJUeXBlfSBlcSAnY3VzdG9tZXInICkgewogICAgICAgICAgICAkTGFzdEN1c3RvbWVyQXJ0aWNsZUlEID0gJEFydGljbGV7QXJ0aWNsZUlEfTsKICAgICAgICAgICAgJExhc3RDdXN0b21lckFydGljbGUgICA9ICRDb3VudGVyQXJyYXk7CiAgICAgICAgfQogICAgICAgICRDb3VudGVyQXJyYXkrKzsKICAgICAgICBpZiAoICgkU2VsZWN0ZWRBcnRpY2xlSUQpICYmICggJFNlbGVjdGVkQXJ0aWNsZUlEIGVxICRBcnRpY2xle0FydGljbGVJRH0gKSApIHsKICAgICAgICAgICAgJEFydGljbGVJRCA9ICRBcnRpY2xle0FydGljbGVJRH07CiAgICAgICAgfQogICAgfQoKICAgICMgdHJ5IHRvIHVzZSB0aGUgbGF0ZXN0IG5vbiBpbnRlcm5hbCBhZ2VudCBhcnRpY2xlCiAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICRBcnRpY2xlSUQgICAgICAgICA9ICRBcnRpY2xlQm94Wy0xXS0+e0FydGljbGVJRH07CiAgICAgICAgJFNlbGVjdGVkQXJ0aWNsZUlEID0gJEFydGljbGVJRDsKICAgIH0KCiAgICAjIHRyeSB0byB1c2UgdGhlIGxhdGVzdCBjdXN0b21lciBhcnRpY2xlCiAgICBpZiAoICEkQXJ0aWNsZUlEICYmICRMYXN0Q3VzdG9tZXJBcnRpY2xlSUQgKSB7CiAgICAgICAgJEFydGljbGVJRCAgICAgICAgID0gJExhc3RDdXN0b21lckFydGljbGVJRDsKICAgICAgICAkU2VsZWN0ZWRBcnRpY2xlSUQgPSAkQXJ0aWNsZUlEOwogICAgfQoKICAgICMgdGlja2V0IHR5cGUKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1R5cGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1R5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1NlcnZpY2V9CiAgICAgICAgJiYKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykKICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntBdHRyaWJ1dGVzVmlld30tPntTZXJ2aWNlfQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkUGFyYW17U0xBfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IHN0YXRlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1N0YXRlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHByaW9yaXR5CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHF1ZXVlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+e1F1ZXVlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIGFuZCAxNAogICAgICAgIGlmICgkQ291bnQgZXEgMTMgfHwgJENvdW50IGVxIDE0KSB7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQojIC0tLQogICAgICAgIG5leHQgaWYgISRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9OwogICAgICAgIG5leHQgaWYgISRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+eyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50LAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJFBhcmFteyAnVGlja2V0RnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyB0aWNrZXQgZnJlZSB0aW1lCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewogICAgICAgIG5leHQgaWYgISRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9OwogICAgICAgIG5leHQgaWYgISRTZWxmLT57Q29uZmlnfS0+e0F0dHJpYnV0ZXNWaWV3fS0+eyAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50IH07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lICAgID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBwcmludCBvcHRpb24KICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0N1c3RvbWVyRnJvbnRlbmQ6Ok1vZHVsZScpLT57Q3VzdG9tZXJUaWNrZXRQcmludH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUHJpbnQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkTGFzdFNlbmRlclR5cGUgPSAnJzsKICAgIGZvciBteSAkQXJ0aWNsZVRtcCAoQEFydGljbGVCb3gpIHsKICAgICAgICBteSAlQXJ0aWNsZSA9ICUkQXJ0aWNsZVRtcDsKCiAgICAgICAgIyBjaGVjayBpZiBhcnRpY2xlIHNob3VsZCBiZSBleHBhbmRlZCAodmlzaWJsZSkKICAgICAgICBpZiAoICRTZWxlY3RlZEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDbGFzc30gPSAnVmlzaWJsZSc7CiAgICAgICAgfQoKICAgICAgICAjIGRvIHNvbWUgaHRtbCBxdW90aW5nCiAgICAgICAgJEFydGljbGV7QWdlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2UoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0FnZVRpbWVVbml4fSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CgogICAgICAgICRBcnRpY2xle1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBTdWJqZWN0ICAgICAgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICAgICAgICAgIFNpemUgICAgICAgICA9PiAxNTAsCiAgICAgICAgKTsKCiAgICAgICAgJExhc3RTZW5kZXJUeXBlID0gJEFydGljbGV7U2VuZGVyVHlwZX07CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGUnLAogICAgICAgICAgICBEYXRhID0+IFwlQXJ0aWNsZSwKICAgICAgICApOwoKICAgICAgICAjIHNob3cgdGhlIGNvcnJlY3QgdGl0bGU6ICJleHBhbmQgYXJ0aWNsZS4uLiIgb3IgdGhlIGFydGljbGUncyBzdWJqZWN0CiAgICAgICAgaWYgKCAkU2VsZWN0ZWRBcnRpY2xlSUQgZXEgJEFydGljbGV7QXJ0aWNsZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVFeHBhbmRlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQ29udHJhY3RlZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlQXJ0aWNsZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZG8gc29tZSBzdHJpcHMgJiYgcXVvdGluZwogICAgICAgIGZvciBteSAkS2V5IChxdyhGcm9tIFRvIENjKSkgewogICAgICAgICAgICBuZXh0IGlmICEkQXJ0aWNsZXskS2V5fTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVSb3cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICA9PiAkQXJ0aWNsZXskS2V5fSwKICAgICAgICAgICAgICAgICAgICBSZWFsbmFtZSA9PiAkQXJ0aWNsZXsgJEtleSAuICdSZWFsbmFtZScgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgYXJ0aWNsZSBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBuZXh0IGlmICEkQXJ0aWNsZXsgJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQgfTsKICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57QXR0cmlidXRlc1ZpZXd9LT57ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50IH07CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlRnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJEFydGljbGV7ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkQXJ0aWNsZXsgJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGlmIGp1c3QgYSBvbmx5IGh0bWwgZW1haWwKICAgICAgICBpZiAoIG15ICRNaW1lVHlwZVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrTWltZVR5cGUoICVQYXJhbSwgJUFydGljbGUgKSApIHsKICAgICAgICAgICAgJFBhcmFte0JvZHlOb3RlfSA9ICRNaW1lVHlwZVRleHQ7CiAgICAgICAgICAgICRQYXJhbXtCb2R5fSAgICAgPSAnJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICAjIGh0bWwgcXVvdGluZwogICAgICAgICAgICAkQXJ0aWNsZXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgICAgIE5ld0xpbmUgICAgICAgID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdEZWZhdWx0Vmlld05ld0xpbmUnKSwKICAgICAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRBcnRpY2xle0JvZHl9LAogICAgICAgICAgICAgICAgVk1heCAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0RlZmF1bHRWaWV3TGluZXMnKSB8fCA1MDAwLAogICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgICAgIExpbmtGZWF0dXJlICAgID0+IDEsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIGRvIGNoYXJzZXQgY2hlY2sKICAgICAgICAgICAgaWYgKCBteSAkQ2hhcnNldFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkNoZWNrQ2hhcnNldCggJVBhcmFtLCAlQXJ0aWNsZSApICkgewogICAgICAgICAgICAgICAgJFBhcmFte0JvZHlOb3RlfSA9ICRDaGFyc2V0VGV4dDsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpbiBjYXNlIHNob3cgcGxhaW4gYXJ0aWNsZSBib2R5IChpZiBubyBodG1sIGJvZHkgYXMgYXR0YWNobWVudCBleGlzdHMgb2YgaWYgcmljaAogICAgICAgICMgdGV4dCBpcyBub3QgZW5hYmxlZCkKICAgICAgICBteSAkUmljaFRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9OwogICAgICAgIGlmICggJFJpY2hUZXh0ICYmICRBcnRpY2xle0F0dGFjaG1lbnRJRE9mSFRNTEJvZHl9ICkgewogICAgICAgICAgICBpZiAoICRTZWxlY3RlZEFydGljbGVJRCBlcSAkQXJ0aWNsZXtBcnRpY2xlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5SFRNTExvYWQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICVBcnRpY2xlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdCb2R5SFRNTFBsYWNlaG9sZGVyJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0JvZHlQbGFpbicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZGQgYXR0YWNobWVudCBpY29uCiAgICAgICAgaWYgKCAkQXJ0aWNsZXtBdG1zfSAmJiAleyAkQXJ0aWNsZXtBdG1zfSB9ICkgewoKICAgICAgICAgICAgIyBkb3dubG9hZCB0eXBlCiAgICAgICAgICAgIG15ICRUeXBlID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnREb3dubG9hZFR5cGUnKSB8fCAnYXR0YWNobWVudCc7CgogICAgICAgICAgICAjIGlmIGF0dGFjaG1lbnQgd2lsbCBiZSBmb3JjZWQgdG8gZG93bmxvYWQsIGRvbid0IG9wZW4gYSBuZXcgZG93bmxvYWQgd2luZG93IQogICAgICAgICAgICBteSAkVGFyZ2V0ID0gJyc7CiAgICAgICAgICAgIGlmICggJFR5cGUgPX4gL2lubGluZS9pICkgewogICAgICAgICAgICAgICAgJFRhcmdldCA9ICd0YXJnZXQ9ImF0dGFjaG1lbnQiICc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbXkgJUF0bUluZGV4ID0gJXsgJEFydGljbGV7QXRtc30gfTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4geyBLZXkgPT4gJ0F0dGFjaG1lbnQnLCB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJEZpbGVJRCAoIHNvcnQga2V5cyAlQXRtSW5kZXggKSB7CiAgICAgICAgICAgICAgICBteSAlRmlsZSA9ICV7ICRBdG1JbmRleHskRmlsZUlEfSB9OwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlQXR0YWNobWVudFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJUZpbGUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJUZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbiA9PiAnRG93bmxvYWQnLAogICAgICAgICAgICAgICAgICAgICAgICBMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCRFbnZ7XCJDR0lIYW5kbGVcIn0vXCRRRGF0YXtcIkZpbGVuYW1lXCJ9P0FjdGlvbj1DdXN0b21lclRpY2tldEF0dGFjaG1lbnQ7QXJ0aWNsZUlEPSRBcnRpY2xle0FydGljbGVJRH07RmlsZUlEPSRGaWxlSUQiLAogICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSAgPT4gJ2Rpc2stcy5wbmcnLAogICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQgPT4gJFRhcmdldCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkQXJ0aWNsZU9CID0gJEFydGljbGVCb3hbJExhc3RDdXN0b21lckFydGljbGVdOwogICAgbXkgJUFydGljbGUgICA9ICUkQXJ0aWNsZU9COwoKICAgIG15ICRBcnRpY2xlQXJyYXkgPSAwOwogICAgZm9yIG15ICRBcnRpY2xlVG1wIChAQXJ0aWNsZUJveCkgewogICAgICAgIG15ICVBcnRpY2xlVG1wMSA9ICUkQXJ0aWNsZVRtcDsKICAgICAgICBpZiAoICRBcnRpY2xlSUQgZXEgJEFydGljbGVUbXAxe0FydGljbGVJRH0gKSB7CiAgICAgICAgICAgICVBcnRpY2xlID0gJUFydGljbGVUbXAxOwogICAgICAgIH0KICAgIH0KCiAgICAjIGp1c3QgYm9keSBpZiBodG1sIGVtYWlsCiAgICBpZiAoICRQYXJhbXtTaG93SFRNTGVNYWlsfSApIHsKCiAgICAgICAgIyBnZW5lcmF0ZSBvdXRwdXQKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBGaWxlbmFtZSA9PiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpIb29rJykKICAgICAgICAgICAgICAgIC4gIi0kQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LSRBcnRpY2xle1RpY2tldElEfS0kQXJ0aWNsZXtBcnRpY2xlSUR9IiwKICAgICAgICAgICAgVHlwZSAgICAgICAgPT4gJ2lubGluZScsCiAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICIkQXJ0aWNsZXtNaW1lVHlwZX07IGNoYXJzZXQ9JEFydGljbGV7Q2hhcnNldH0iLAogICAgICAgICAgICBDb250ZW50ICAgICA9PiAkQXJ0aWNsZXtCb2R5fSwKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgZm9sbG93IHVwIHBlcm1pc3Npb25zCiAgICBteSAkRm9sbG93VXBQb3NzaWJsZSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRGb2xsb3dVcE9wdGlvbiggUXVldWVJRCA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwgKTsKICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICBJRCA9PiAkQXJ0aWNsZXtTdGF0ZUlEfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRDdXN0b21lclBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICd1cGRhdGUnLAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICAgICAgKQogICAgICAgICYmICgKICAgICAgICAgICAgKCAkRm9sbG93VXBQb3NzaWJsZSAhfiAvKG5ldyB0aWNrZXR8cmVqZWN0KS9pICYmICRTdGF0ZXtUeXBlTmFtZX0gPX4gL15jbG9zZS9pICkKICAgICAgICAgICAgfHwgJFN0YXRle1R5cGVOYW1lfSAhfiAvXmNsb3NlL2kKICAgICAgICApCiAgICAgICAgKQogICAgewoKICAgICAgICAjIGNoZWNrIHN1YmplY3QKICAgICAgICBpZiAoICEkUGFyYW17U3ViamVjdH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtTdWJqZWN0fSA9ICJSZTogJFBhcmFte1RpdGxlfSI7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgYWRkIHJpY2ggdGV4dCBlZGl0b3IKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdSaWNoVGV4dCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIG5leHQgc3RhdGVzIHN0cmluZwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICkgewogICAgICAgICAgICBteSAlTmV4dFN0YXRlcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3RhdGVMaXN0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICAgICAgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBBY3Rpb24gICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICVTdGF0ZVNlbGVjdGVkOwogICAgICAgICAgICBpZiAoICRQYXJhbXtTdGF0ZUlEfSApIHsKICAgICAgICAgICAgICAgICRTdGF0ZVNlbGVjdGVke1NlbGVjdGVkSUR9ID0gJFBhcmFte1N0YXRlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFN0YXRlU2VsZWN0ZWR7U2VsZWN0ZWRWYWx1ZX0gPSAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtOZXh0U3RhdGVzU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJU5leHRTdGF0ZXMsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdTdGF0ZUlEJywKICAgICAgICAgICAgICAgICVTdGF0ZVNlbGVjdGVkLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRm9sbG93VXBTdGF0ZScsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwcmlvcml0eQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewogICAgICAgICAgICBteSAlUHJpb3JpdGllcyA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAlUHJpb3JpdHlTZWxlY3RlZDsKICAgICAgICAgICAgaWYgKCAkUGFyYW17UHJpb3JpdHlJRH0gKSB7CiAgICAgICAgICAgICAgICAkUHJpb3JpdHlTZWxlY3RlZHtTZWxlY3RlZElEfSA9ICRQYXJhbXtQcmlvcml0eUlEfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQcmlvcml0eVNlbGVjdGVke1NlbGVjdGVkVmFsdWV9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSB8fCAnMyBub3JtYWwnOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtQcmlvcml0eVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0aWVzLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJpb3JpdHlJRCcsCiAgICAgICAgICAgICAgICAlUHJpb3JpdHlTZWxlY3RlZCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0ZvbGxvd1VwUHJpb3JpdHknLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJEF0dGFjaG1lbnQgKEBBdHRhY2htZW50cykgewogICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfSAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnRm9sbG93VXBBdHRhY2htZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gJEF0dGFjaG1lbnQsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2VsZWN0IHRoZSBvdXRwdXQgdGVtcGxhdGUKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0N1c3RvbWVyVGlja2V0Wm9vbScsCiAgICAgICAgRGF0YSAgICAgICAgID0+IHsKICAgICAgICAgICAgJUFydGljbGUsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtIC0gY29tbW9uIGZpbGUgZm9yIHNldmVyYWwgbW9kdWxlcwojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24ucG0sdiAxLjExIDIwMTAvMTIvMjEgMjE6NTE6MDcgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uLnBtLHYgMS4zMCAyMDEwLzEyLzE2IDE3OjA3OjM2IG1wIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRUaWNrZXRBY3Rpb25Db21tb247Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OldlYjo6VXBsb2FkQ2FjaGU7CiMgLS0tCiMgSVRTTQojIC0tLQp1c2UgS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OklUU01DSVBBbGxvY2F0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwojIC0tLQoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE5lZWRlZCAoCiAgICAgICAgcXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgUXVldWVPYmplY3QgQ29uZmlnT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyROZWVkZWR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkTmVlZGVkISIgKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0ZS0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e1VwbG9hZENhY2hlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpXZWI6OlVwbG9hZENhY2hlLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiAgICAkU2VsZi0+e0NJUEFsbG9jYXRlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lQQWxsb2NhdGUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoJVBhcmFtKTsKIyAtLS0KCiAgICAjIGdldCBmb3JtIGlkCiAgICAkU2VsZi0+e0Zvcm1JRH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdGb3JtSUQnICk7CgogICAgIyBnZXQgaW5mb3JtIHVzZXIgbGlzdAogICAgbXkgQEluZm9ybVVzZXJJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRBcnJheSggUGFyYW0gPT4gJ0luZm9ybVVzZXJJRCcgKTsKICAgICRTZWxmLT57SW5mb3JtVXNlcklEfSA9IFxASW5mb3JtVXNlcklEOwoKICAgICMgZ2V0IGludm9sdmVkIHVzZXIgbGlzdAogICAgbXkgQEludm9sdmVkVXNlcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAnSW52b2x2ZWRVc2VySUQnICk7CiAgICAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSA9IFxASW52b2x2ZWRVc2VySUQ7CgogICAgIyBjcmVhdGUgZm9ybSBpZAogICAgaWYgKCAhJFNlbGYtPntGb3JtSUR9ICkgewogICAgICAgICRTZWxmLT57Rm9ybUlEfSA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURDcmVhdGUoKTsKICAgIH0KCiAgICAjIGdldCBjb25maWcgb2YgZnJvbnRlbmQgbW9kdWxlCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6JFNlbGYtPntBY3Rpb259Iik7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRTZWxmLT57VGlja2V0SUR9ICkgewogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKAogICAgICAgICAgICBNZXNzYWdlID0+ICdObyBUaWNrZXRJRCBpcyBnaXZlbiEnLAogICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY29udGFjdCB0aGUgYWRtaW4uJywKICAgICAgICApOwogICAgfQoKICAgICMgY2hlY2sgcGVybWlzc2lvbnMKICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgVHlwZSAgICAgPT4gJFNlbGYtPntDb25maWd9LT57UGVybWlzc2lvbn0sCiAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9CiAgICApOwoKICAgICMgZXJyb3Igc2NyZWVuLCBkb24ndCBzaG93IHRpY2tldAogICAgaWYgKCAhJEFjY2VzcyApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Ob1Blcm1pc3Npb24oCiAgICAgICAgICAgIE1lc3NhZ2UgICAgPT4gIllvdSBuZWVkICRTZWxmLT57Q29uZmlnfS0+e1Blcm1pc3Npb259IHBlcm1pc3Npb25zISIsCiAgICAgICAgICAgIFdpdGhIZWFkZXIgPT4gJ3llcycsCiAgICAgICAgKTsKICAgIH0KICAgIG15ICVUaWNrZXQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEdldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllcycsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICVQYXJhbSwKICAgICAgICB9LAogICAgKTsKCiAgICAjIHNob3cgcmlnaHQgaGVhZGVyCiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0hlYWRlcicgLiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgRGF0YSA9PiB7fSwKICAgICk7CgogICAgIyBnZXQgbG9jayBzdGF0ZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgIGlmICggISRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja0dldCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAnbG9jaycsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNob3cgbG9jayBzdGF0ZQogICAgICAgICAgICBpZiAoJFN1Y2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUHJvcGVydGllc0xvY2snLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkQWNjZXNzT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk93bmVyQ2hlY2soCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIE93bmVySUQgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJEFjY2Vzc09rICkgewogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICAgICAgICAgIFR5cGUgID0+ICdTbWFsbCcsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtOdW1iZXJ9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5XYXJuaW5nKAogICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgPT4gJ1NvcnJ5LCB5b3UgbmVlZCB0byBiZSB0aGUgb3duZXIgdG8gZG8gdGhpcyBhY3Rpb24hJywKICAgICAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdQbGVhc2UgY2hhbmdlIHRoZSBvd25lciBmaXJzdC4nLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoCiAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNob3cgYmFjayBsaW5rCiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRCYWNrJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9IH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0QmFjaycsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVUaWNrZXQgfSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHBhcmFtcwogICAgbXkgJUdldFBhcmFtOwogICAgZm9yIG15ICRLZXkgKAogICAgICAgIHF3KAogICAgICAgIE5ld1N0YXRlSUQgTmV3UHJpb3JpdHlJRCBUaW1lVW5pdHMgQXJ0aWNsZVR5cGVJRCBUaXRsZSBCb2R5IFN1YmplY3QKICAgICAgICBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSBOZXdPd25lcklEIE5ld093bmVyVHlwZSBPbGRPd25lcklEIE5ld1Jlc3BvbnNpYmxlSUQKICAgICAgICBUeXBlSUQgU2VydmljZUlEIFNMQUlEIEV4cGFuZAogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgJEdldFBhcmFteyRLZXl9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgIyBnZXQgbmVlZGVkIHN0dWZmCiAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdUaWNrZXRGcmVlVGV4dDE0Jyk7CiAgICAkR2V0UGFyYW17UHJpb3JpdHlSQ30gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gIlByaW9yaXR5UkMiKTsKICAgICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0VsZW1lbnRDaGFuZ2VkJykgfHwgJyc7CgogICAgIyBzZXQgUHJpb3JpdHlSQyBmcm9tIGNoYW5nZWQgYWpheCBlbGVtZW50CiAgICBpZiAoICggJEdldFBhcmFte0VsZW1lbnRDaGFuZ2VkfSBlcSAnU2VydmljZUlEJyApCiAgICAgICAgfHwgKCAoICRHZXRQYXJhbXtFbGVtZW50Q2hhbmdlZH0gZXEgJ1RpY2tldEZyZWVUZXh0MTQnICkgJiYgKCAkR2V0UGFyYW17SW1wYWN0SUR9ICApICkKICAgICkgewogICAgICAgICRHZXRQYXJhbXtQcmlvcml0eVJDfSA9IDE7CiAgICB9CgogICAgIyBzZXQgc2VydmljZSBpZCBmcm9tIHRpY2tldAogICAgaWYgKCFkZWZpbmVkKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSAmJiAkVGlja2V0e1NlcnZpY2VJRH0pIHsKICAgICAgICAkR2V0UGFyYW17U2VydmljZUlEfSA9ICRUaWNrZXR7U2VydmljZUlEfTsKICAgIH0KCiAgICAjIHNldCBpbXBhY3QgZnJvbSB0aWNrZXQKICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte0ltcGFjdElEfSApIHsKICAgICAgICAkR2V0UGFyYW17SW1wYWN0SUR9ID0gJFRpY2tldHtUaWNrZXRGcmVlVGV4dDE0fTsKICAgIH0KCiAgICAjIGdldCBpbXBhY3QgbGlzdAogICAgbXkgJEltcGFjdExpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICApOwoKICAgIG15ICVTZXJ2aWNlOwogICAgaWYgKCRHZXRQYXJhbXtTZXJ2aWNlSUR9KSB7CiAgICAgICAgIyBnZXQgc2VydmljZQogICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICAgICAgU2VydmljZUlEID0+ICRHZXRQYXJhbXtTZXJ2aWNlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgIyByZWNhbGN1bGF0ZSBwcmlvcml0eQogICAgICAgIGlmICggJEdldFBhcmFte1ByaW9yaXR5UkN9ICYmICRTZWxmLT57Q29uZmlnfS0+e1ByaW9yaXR5fSApIHsKICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtJbXBhY3RJRH0pIHsKICAgICAgICAgICAgICAgICMgZ2V0IHByaW9yaXR5CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9ID0gJFNlbGYtPntDSVBBbGxvY2F0ZU9iamVjdH0tPlByaW9yaXR5QWxsb2NhdGlvbkdldCgKICAgICAgICAgICAgICAgICAgICBDcml0aWNhbGl0eUlEID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9LAogICAgICAgICAgICAgICAgICAgIEltcGFjdElEID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCRHZXRQYXJhbXtQcmlvcml0eUlERnJvbUltcGFjdH0pIHsKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17TmV3UHJpb3JpdHlJRH0gPSAkR2V0UGFyYW17UHJpb3JpdHlJREZyb21JbXBhY3R9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgLS0tCgogICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dCBwYXJhbXMKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgIG15ICRLZXkgID0gJ1RpY2tldEZyZWVLZXknIC4gJENvdW50OwogICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAkR2V0UGFyYW17JEtleX0gID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkS2V5ICk7CiAgICAgICAgJEdldFBhcmFteyRUZXh0fSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFRleHQgKTsKICAgIH0KCiAgICAjIGdldCB0aWNrZXQgZnJlZSB0aW1lIHBhcmFtcwogICAgRlJFRVRJTUVOVU1CRVI6CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiA2ICkgewoKICAgICAgICAjIGNyZWF0ZSBmcmVldGltZSBwcmVmaXgKICAgICAgICBteSAkRnJlZVRpbWVQcmVmaXggPSAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50OwoKICAgICAgICAjIGdldCBmb3JtIHBhcmFtcwogICAgICAgIGZvciBteSAkVHlwZSAocXcoVXNlZCBZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKAogICAgICAgICAgICAgICAgUGFyYW0gPT4gJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUaW1lfS0+eyRDb3VudH0gPT0gMiApIHsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnUmVxdWlyZWQnIH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgYWRkaXRpb25hbCBwYXJhbXMKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdPcHRpb25hbCcgfSA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSA9ICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWQnIH0gfHwgMDsKICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUaW1lT3B0aW9uYWwnIC4gJENvdW50ICkgKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ09wdGlvbmFsJyB9ID0gMDsKICAgICAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnVXNlZCcgfSAgICAgPSAxOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayB0aGUgdGltZWRhdGEKICAgICAgICBteSAkVGltZURhdGFDb21wbGV0ZSA9IDE7CiAgICAgICAgVFlQRToKICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgIG5leHQgVFlQRSBpZiBkZWZpbmVkICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJFR5cGUgfTsKCiAgICAgICAgICAgICRUaW1lRGF0YUNvbXBsZXRlID0gMDsKICAgICAgICAgICAgbGFzdCBUWVBFOwogICAgICAgIH0KCiAgICAgICAgbmV4dCBGUkVFVElNRU5VTUJFUiBpZiAkVGltZURhdGFDb21wbGV0ZTsKCiAgICAgICAgaWYgKCAhJFRpY2tldHskRnJlZVRpbWVQcmVmaXh9ICkgewogICAgICAgICAgICBmb3IgbXkgJFR5cGUgKHF3KFVzZWQgWWVhciBNb250aCBEYXkgSG91ciBNaW51dGUpKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAkVHlwZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHQgRlJFRVRJTUVOVU1CRVI7CiAgICAgICAgfQoKICAgICAgICAjIGdldCBmcmVldGltZSBkYXRhIGZyb20gdGlja2V0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUaW1lU3RyaW5nID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgIFN0cmluZyA9PiAkVGlja2V0eyRGcmVlVGltZVByZWZpeH0sCiAgICAgICAgKTsKICAgICAgICBteSAoICRTZWNvbmQsICRNaW51dGUsICRIb3VyLCAkRGF5LCAkTW9udGgsICRZZWFyICkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFRpY2tldEZyZWVUaW1lU3RyaW5nLAogICAgICAgICk7CgogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1VzZWRGcm9tVGlja2V0JyB9ID0gMTsKICAgICAgICAkR2V0UGFyYW17ICRGcmVlVGltZVByZWZpeCAuICdVc2VkJyB9ICAgICAgICAgICA9IDE7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnTWludXRlJyB9ICAgICAgICAgPSAkTWludXRlOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ0hvdXInIH0gICAgICAgICAgID0gJEhvdXI7CiAgICAgICAgJEdldFBhcmFteyAkRnJlZVRpbWVQcmVmaXggLiAnRGF5JyB9ICAgICAgICAgICAgPSAkRGF5OwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ01vbnRoJyB9ICAgICAgICAgID0gJE1vbnRoOwogICAgICAgICRHZXRQYXJhbXsgJEZyZWVUaW1lUHJlZml4IC4gJ1llYXInIH0gICAgICAgICAgID0gJFllYXI7CiAgICB9CgogICAgIyBnZXQgYXJ0aWNsZSBmcmVlIHRleHQgcGFyYW1zCiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIG15ICRLZXkgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICRHZXRQYXJhbXskS2V5fSAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRLZXkgKTsKICAgICAgICAkR2V0UGFyYW17JFRleHR9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkVGV4dCApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIHBlbmRpbmcgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgaWYgKAogICAgICAgIGRlZmluZWQgJEdldFBhcmFte1llYXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TW9udGh9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17RGF5fQogICAgICAgICYmIGRlZmluZWQgJEdldFBhcmFte0hvdXJ9CiAgICAgICAgJiYgZGVmaW5lZCAkR2V0UGFyYW17TWludXRlfQogICAgICAgICkKICAgIHsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgdHJhbnNmb3JtIGZyZWUgdGltZSwgdGltZSBzdGFtcCBiYXNlZCBvbiB1c2VyIHRpbWUgem9uZQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICBteSAkUHJlZml4ID0gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudDsKICAgICAgICBuZXh0IGlmICRHZXRQYXJhbXsgJFByZWZpeCAuICdVc2VkRnJvbVRpY2tldCcgfTsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRHZXRQYXJhbXsgJFByZWZpeCAuICdZZWFyJyB9OwogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9OwogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ0RheScgfTsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRHZXRQYXJhbXsgJFByZWZpeCAuICdIb3VyJyB9OwogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfTsKICAgICAgICAlR2V0UGFyYW0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRyYW5zZnJvbURhdGVTZWxlY3Rpb24oCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgUHJlZml4ID0+ICRQcmVmaXgKICAgICAgICApOwogICAgfQoKICAgICMgcmV3cmFwIGJvZHkgaWYgbm8gcmljaCB0ZXh0IGlzIHVzZWQKICAgIGlmICggJEdldFBhcmFte0JvZHl9ICYmICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgIG15ICRTaXplID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZScpIHx8IDcwOwogICAgICAgICRHZXRQYXJhbXtCb2R5fSA9fiBzLyhePi4rfC57NCwkU2l6ZX0pKD86XHN8XHopLyQxXG4vZ207CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N0b3JlJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIHN0b3JlIGFjdGlvbgogICAgICAgIG15ICVFcnJvcjsKCiAgICAgICAgIyBJZiBpcyBhbiBhY3Rpb24gYWJvdXQgYXR0YWNobWVudHMKICAgICAgICBteSAkSXNVcGxvYWQgPSAwOwoKICAgICAgICAjIGF0dGFjaG1lbnQgZGVsZXRlCiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMzIgKSB7CiAgICAgICAgICAgIG15ICREZWxldGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICJBdHRhY2htZW50RGVsZXRlJENvdW50IiApOwogICAgICAgICAgICBuZXh0IGlmICEkRGVsZXRlOwogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0F0dGFjaG1lbnREZWxldGV9ID0gMTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JRFJlbW92ZUZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgRmlsZUlEID0+ICRDb3VudCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJElzVXBsb2FkID0gMTsKICAgICAgICB9CgogICAgICAgICMgYXR0YWNobWVudCB1cGxvYWQKICAgICAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0F0dGFjaG1lbnRVcGxvYWQnICkgKSB7CiAgICAgICAgICAgICRJc1VwbG9hZCAgICAgICAgICAgICAgICA9IDE7CiAgICAgICAgICAgICVFcnJvciAgICAgICAgICAgICAgICAgICA9ICgpOwogICAgICAgICAgICAkRXJyb3J7QXR0YWNobWVudFVwbG9hZH0gPSAxOwogICAgICAgICAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgICAgICAgICAgUGFyYW0gID0+ICdGaWxlVXBsb2FkJywKICAgICAgICAgICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntVcGxvYWRDYWNoZU9iamVjdH0tPkZvcm1JREFkZEZpbGUoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICAgICAgJVVwbG9hZFN0dWZmLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgYWxsIGF0dGFjaG1lbnRzIG1ldGEgZGF0YQogICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc01ldGEoCiAgICAgICAgICAgIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBjaGVjayBwZW5kaW5nIHRpbWUKICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkR2V0UGFyYW17TmV3U3RhdGVJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICEkSXNVcGxvYWQgKSB7CgogICAgICAgICAgICAgICAgIyBjaGVjayBzdGF0ZSB0eXBlCiAgICAgICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9ecGVuZGluZy9pICkgewoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkTmVlZGVkIChxdyhZZWFyIE1vbnRoIERheSBIb3VyIE1pbnV0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17JE5lZWRlZH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGRhdGUKICAgICAgICAgICAgICAgICAgICBpZiAoICEkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJEVycm9yeydEYXRlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e1RpbWVPYmplY3R9LT5EYXRlMlN5c3RlbVRpbWUoICVHZXRQYXJhbSwgU2Vjb25kID0+IDAgKQogICAgICAgICAgICAgICAgICAgICAgICA8ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAkRXJyb3J7J0RhdGVJbnZhbGlkJ30gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAhJElzVXBsb2FkICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e05vdGV9ICkgewoKICAgICAgICAgICAgICAgICMgY2hlY2sgc3ViamVjdAogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFte1N1YmplY3R9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnsnU3ViamVjdEludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBjaGVjayBib2R5CiAgICAgICAgICAgICAgICBpZiAoICEkR2V0UGFyYW17Qm9keX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydCb2R5SW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBvd25lcgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSAmJiAkU2VsZi0+e0NvbmZpZ30tPntPd25lck1hbmRhdG9yeX0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdOZXcnICYmICEkR2V0UGFyYW17TmV3T3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydOZXdPd25lckludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRHZXRQYXJhbXtOZXdPd25lclR5cGV9IGVxICdPbGQnICYmICEkR2V0UGFyYW17T2xkT3duZXJJRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJEVycm9yeydPbGRPd25lckludmFsaWQnfSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgdGl0bGUKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntUaXRsZX0gJiYgISRHZXRQYXJhbXtUaXRsZX0gKSB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1RpdGxlSW52YWxpZCd9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0eXBlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICkKICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAoICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgJiYKICAgICAgICAgICAgICAgICggISRHZXRQYXJhbXtUeXBlSUR9ICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUeXBlSURJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayBzZXJ2aWNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKQogICAgICAgICAgICAgICAgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0KICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXtTTEFJRH0KICAgICAgICAgICAgICAgICYmICEkR2V0UGFyYW17U2VydmljZUlEfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkRXJyb3J7J1NlcnZpY2VJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBjaGVjayB0aW1lIHVuaXRzLCBidXQgb25seSBpZiB0aGUgY3VycmVudCBzY3JlZW4gaGFzIGEgbm90ZQogICAgICAgICAgICAjICAgKGFjY291bnRlZCB0aW1lIGNhbiBvbmx5IGJlIHN0b3JlZCBpZiBhbmQgYXJ0aWNsZSBpcyBnZW5lcmF0ZWQpCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAmJiAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfQogICAgICAgICAgICAgICAgJiYgIWRlZmluZWQgJEdldFBhcmFte1RpbWVVbml0c30KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEVycm9yeydUaW1lVW5pdHNJbnZhbGlkJ30gPSAnIFNlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBleHBhbmQKICAgICAgICBpZiAoICRHZXRQYXJhbXtFeHBhbmR9ICkgewogICAgICAgICAgICAlRXJyb3IgPSAoKTsKICAgICAgICAgICAgJEVycm9ye0V4cGFuZH0gPSAxOwogICAgICAgIH0KCiAgICAgICAgIyB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0OwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFRleHR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIEtleSBoYXMgdmFsdWUgMiwgdGhpcyBtZWFucyB0aGF0IHRoZSBmcmVldGV4dGZpZWxkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSA9PSAyICkgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0e1JlcXVpcmVkfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEZyZWVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldEZyZWVUZXh0fS0+eyRDb3VudH0gPT0gMgogICAgICAgICAgICAgICAgJiYgJEdldFBhcmFteyRUZXh0fSBlcSAnJwogICAgICAgICAgICAgICAgJiYgJElzVXBsb2FkID09IDAKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0e0Vycm9yfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICAgICAgJEVycm9yeyRUZXh0fSA9ICdTZXJ2ZXJFcnJvcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVUaWNrZXRGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICBUaWNrZXQgPT4gXCVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgICAgICBteSAlVGlja2V0RnJlZVRpbWVIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVEYXRlKCBUaWNrZXQgPT4gXCVHZXRQYXJhbSApOwoKICAgICAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dDsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVGV4dH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIEtleSBoYXMgdmFsdWUgMiwgdGhpcyBtZWFucyB0aGF0IHRoZSBmaWVsZCBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0e1JlcXVpcmVkfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHJlcXVpcmVkIEFydGljbGVUZXh0RmllbGQgKGlmIGNvbmZpZ3VyZWQpCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ID09IDIKICAgICAgICAgICAgICAgICYmICRHZXRQYXJhbXskVGV4dH0gZXEgJycKICAgICAgICAgICAgICAgICYmICRJc1VwbG9hZCA9PSAwCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7RXJyb3J9LT57JENvdW50fSA9IDE7CiAgICAgICAgICAgICAgICAkRXJyb3J7JFRleHR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dEhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldEFydGljbGVGcmVlVGV4dCgKICAgICAgICAgICAgQ29uZmlnICA9PiBcJUFydGljbGVGcmVlVGV4dCwKICAgICAgICAgICAgQXJ0aWNsZSA9PiBcJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZXJyb3JzCiAgICAgICAgaWYgKCVFcnJvcikgewoKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRUaWNrZXR7VGlja2V0TnVtYmVyfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgICAgICBBdHRhY2htZW50cyAgICAgICA9PiBcQEF0dGFjaG1lbnRzLAogICAgICAgICAgICAgICAgVGltZVVuaXRzUmVxdWlyZWQgPT4gKAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICAgICAgPyAnVmFsaWRhdGVfUmVxdWlyZWQnCiAgICAgICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICVUaWNrZXQsCiAgICAgICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJVRpY2tldEZyZWVUaW1lSFRNTCwKICAgICAgICAgICAgICAgICVBcnRpY2xlRnJlZVRleHRIVE1MLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgJUVycm9yLAojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICBJbXBhY3RJRCA9PiAkR2V0UGFyYW17SW1wYWN0SUR9LAojIC0tLQogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKAogICAgICAgICAgICAgICAgVHlwZSA9PiAnU21hbGwnLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyB0aXRsZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte1RpdGxlfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0VGl0bGVVcGRhdGUoCiAgICAgICAgICAgICAgICAgICAgVGl0bGUgICAgPT4gJEdldFBhcmFte1RpdGxlfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgdHlwZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6VHlwZScpICYmICRTZWxmLT57Q29uZmlnfS0+e1RpY2tldFR5cGV9ICkgewogICAgICAgICAgICBpZiAoICRHZXRQYXJhbXtUeXBlSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRUeXBlU2V0KAogICAgICAgICAgICAgICAgICAgIFR5cGVJRCAgID0+ICRHZXRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgc2V0IG5ldyBzZXJ2aWNlCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgJiYgJFNlbGYtPntDb25maWd9LT57U2VydmljZX0gKSB7CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U2VydmljZUlEfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U2VydmljZVNldCgKICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSUQgICAgICA9PiAkR2V0UGFyYW17U2VydmljZUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkVGlja2V0e0N1c3RvbWVyVXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkR2V0UGFyYW17U0xBSUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFTZXQoCiAgICAgICAgICAgICAgICAgICAgU0xBSUQgICAgPT4gJEdldFBhcmFte1NMQUlEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgb3duZXIKICAgICAgICBteSBATm90aWZ5RG9uZTsKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e093bmVyfSApIHsKICAgICAgICAgICAgbXkgJEJvZHlUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dDJBc2NpaSgKICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggJEdldFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgJiYgJEdldFBhcmFte09sZE93bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17T2xkT3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte09sZE93bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJEdldFBhcmFte05ld093bmVySUR9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRMb2NrU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIExvY2sgICAgID0+ICdsb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3T3duZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IG93bmVyIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld093bmVySUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNldCBuZXcgcmVzcG9uc2libGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0gKSB7CiAgICAgICAgICAgICAgICBteSAkQm9keVRleHQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlJpY2hUZXh0MkFzY2lpKAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0gfHwgJycsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgJFN1Y2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFJlc3BvbnNpYmxlU2V0KAogICAgICAgICAgICAgICAgICAgIFRpY2tldElEICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgIE5ld1VzZXJJRCA9PiAkR2V0UGFyYW17TmV3UmVzcG9uc2libGVJRH0sCiAgICAgICAgICAgICAgICAgICAgQ29tbWVudCAgID0+ICRCb2R5VGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyByZW1lbWJlciB0byBub3Qgbm90aWZ5IHJlc3BvbnNpYmxlIHR3aWNlCiAgICAgICAgICAgICAgICBpZiAoICRTdWNjZXNzICYmICRTdWNjZXNzIGVxIDEgKSB7CiAgICAgICAgICAgICAgICAgICAgcHVzaCBATm90aWZ5RG9uZSwgJEdldFBhcmFte05ld1Jlc3BvbnNpYmxlSUR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBub3RlCiAgICAgICAgbXkgJEFydGljbGVJRCA9ICcnOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57Tm90ZX0gKSB7CiAgICAgICAgICAgIG15ICRNaW1lVHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAgICAgJE1pbWVUeXBlID0gJ3RleHQvaHRtbCc7CgogICAgICAgICAgICAgICAgIyB2ZXJpZnkgaHRtbCBkb2N1bWVudAogICAgICAgICAgICAgICAgJEdldFBhcmFte0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5SaWNoVGV4dERvY3VtZW50Q29tcGxldGUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRHZXRQYXJhbXtCb2R5fSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRGcm9tID0gIiRTZWxmLT57VXNlckZpcnN0bmFtZX0gJFNlbGYtPntVc2VyTGFzdG5hbWV9IDwkU2VsZi0+e1VzZXJFbWFpbH0+IjsKICAgICAgICAgICAgbXkgQE5vdGlmeVVzZXJJRHMgPSAoIEB7ICRTZWxmLT57SW5mb3JtVXNlcklEfSB9LCBAeyAkU2VsZi0+e0ludm9sdmVkVXNlcklEfSB9ICk7CiAgICAgICAgICAgICRBcnRpY2xlSUQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVDcmVhdGUoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU2VuZGVyVHlwZSAgICAgICAgICAgICAgICAgICAgICA9PiAnYWdlbnQnLAogICAgICAgICAgICAgICAgRnJvbSAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkRnJvbSwKICAgICAgICAgICAgICAgIE1pbWVUeXBlICAgICAgICAgICAgICAgICAgICAgICAgPT4gJE1pbWVUeXBlLAogICAgICAgICAgICAgICAgQ2hhcnNldCAgICAgICAgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIEhpc3RvcnlUeXBlICAgICAgICAgICAgICAgICAgICAgPT4gJFNlbGYtPntDb25maWd9LT57SGlzdG9yeVR5cGV9LAogICAgICAgICAgICAgICAgSGlzdG9yeUNvbW1lbnQgICAgICAgICAgICAgICAgICA9PiAkU2VsZi0+e0NvbmZpZ30tPntIaXN0b3J5Q29tbWVudH0sCiAgICAgICAgICAgICAgICBGb3JjZU5vdGlmaWNhdGlvblRvVXNlcklEICAgICAgID0+IFxATm90aWZ5VXNlcklEcywKICAgICAgICAgICAgICAgIEV4Y2x1ZGVNdXRlTm90aWZpY2F0aW9uVG9Vc2VySUQgPT4gXEBOb3RpZnlEb25lLAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZUlEICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyB0aW1lIGFjY291bnRpbmcKICAgICAgICAgICAgaWYgKCAkR2V0UGFyYW17VGltZVVuaXRzfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0QWNjb3VudFRpbWUoCiAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZUlELAogICAgICAgICAgICAgICAgICAgIFRpbWVVbml0ICA9PiAkR2V0UGFyYW17VGltZVVuaXRzfSwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBnZXQgcHJlIGxvYWRlZCBhdHRhY2htZW50CiAgICAgICAgICAgIG15IEBBdHRhY2htZW50cyA9ICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURHZXRBbGxGaWxlc0RhdGEoCiAgICAgICAgICAgICAgICBGb3JtSUQgPT4gJFNlbGYtPntGb3JtSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBnZXQgc3VibWl0IGF0dGFjaG1lbnQKICAgICAgICAgICAgbXkgJVVwbG9hZFN0dWZmID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFVwbG9hZEFsbCgKICAgICAgICAgICAgICAgIFBhcmFtICA9PiAnRmlsZVVwbG9hZCcsCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJ1N0cmluZycsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICglVXBsb2FkU3R1ZmYpIHsKICAgICAgICAgICAgICAgIHB1c2ggQEF0dGFjaG1lbnRzLCBcJVVwbG9hZFN0dWZmOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHdyaXRlIGF0dGFjaG1lbnRzCiAgICAgICAgICAgIGZvciBteSAkQXR0YWNobWVudCAoQEF0dGFjaG1lbnRzKSB7CgogICAgICAgICAgICAgICAgIyBza2lwLCBkZWxldGVkIG5vdCB1c2VkIGlubGluZSBpbWFnZXMKICAgICAgICAgICAgICAgIG15ICRDb250ZW50SUQgPSAkQXR0YWNobWVudC0+e0NvbnRlbnRJRH07CiAgICAgICAgICAgICAgICBpZiAoJENvbnRlbnRJRCkgewogICAgICAgICAgICAgICAgICAgIG15ICRDb250ZW50SURIVE1MUXVvdGUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICAgICAgICAgIFRleHQgPT4gJENvbnRlbnRJRCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG5leHQgaWYgJEdldFBhcmFte0JvZHl9ICF+IC8oXFEkQ29udGVudElESFRNTFF1b3RlXEV8XFEkQ29udGVudElEXEUpL2k7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyB3cml0ZSBleGlzdGluZyBmaWxlIHRvIGJhY2tlbmQKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVdyaXRlQXR0YWNobWVudCgKICAgICAgICAgICAgICAgICAgICAleyRBdHRhY2htZW50fSwKICAgICAgICAgICAgICAgICAgICBBcnRpY2xlSUQgPT4gJEFydGljbGVJRCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyByZW1vdmUgcHJlIHN1Ym1pdGVkIGF0dGFjaG1lbnRzCiAgICAgICAgICAgICRTZWxmLT57VXBsb2FkQ2FjaGVPYmplY3R9LT5Gb3JtSURSZW1vdmUoIEZvcm1JRCA9PiAkU2VsZi0+e0Zvcm1JRH0gKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRpY2tldCBmcmVlIHRleHQKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAxNiApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnVGlja2V0RnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17JEtleX07CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRHZXRQYXJhbXskS2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlICAgID0+ICRHZXRQYXJhbXskVGV4dH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQojIC0tLQojIElUU00KIyAtLS0KICAgICAgICBpZiAoKCRHZXRQYXJhbXtTZXJ2aWNlSUR9ICYmICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9KSB8fCAhJEdldFBhcmFte1NlcnZpY2VJRH0pIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dFNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgS2V5ID0+ICdDcml0aWNhbGl0eUlEJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRTZXJ2aWNle0NyaXRpY2FsaXR5SUR9IHx8ICcnLAogICAgICAgICAgICAgICAgQ291bnRlciA9PiAxMywKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRTZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICBLZXkgPT4gJ0ltcGFjdElEJywKICAgICAgICAgICAgVmFsdWUgPT4gJEdldFBhcmFte0ltcGFjdElEfSB8fCAnJywKICAgICAgICAgICAgQ291bnRlciA9PiAxNCwKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICApOwojIC0tLQoKICAgICAgICAjIHNldCB0aWNrZXQgZnJlZSB0aW1lCiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gNiApIHsKICAgICAgICAgICAgbXkgJFByZWZpeCA9ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQ7CiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ1llYXInIH07CiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ01vbnRoJyB9OwogICAgICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRHZXRQYXJhbXsgJFByZWZpeCAuICdEYXknIH07CiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH07CiAgICAgICAgICAgIG5leHQgaWYgIWRlZmluZWQgJEdldFBhcmFteyAkUHJlZml4IC4gJ01pbnV0ZScgfTsKCiAgICAgICAgICAgICMgc2V0IHRpbWUgc3RhbXAgdG8gTlVMTCBpZiBmaWVsZCBpcyBub3QgdXNlZC9jaGVja2VkCiAgICAgICAgICAgIGlmICggISRHZXRQYXJhbXsgJFByZWZpeCAuICdVc2VkJyB9ICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUHJlZml4IC4gJ1llYXInIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQcmVmaXggLiAnTW9udGgnIH0gID0gMDsKICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFByZWZpeCAuICdEYXknIH0gICAgPSAwOwogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUHJlZml4IC4gJ0hvdXInIH0gICA9IDA7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRQcmVmaXggLiAnTWludXRlJyB9ID0gMDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBzZXQgZnJlZSB0aW1lCiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRpbWVTZXQoCiAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICBQcmVmaXggICA9PiAnVGlja2V0RnJlZVRpbWUnLAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBhcnRpY2xlIGZyZWUgdGV4dAogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDMgKSB7CiAgICAgICAgICAgIG15ICRLZXkgID0gJ0FydGljbGVGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudDsKICAgICAgICAgICAgbmV4dCBpZiAhZGVmaW5lZCAkR2V0UGFyYW17JEtleX07CiAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZUZyZWVUZXh0U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xlSUQsCiAgICAgICAgICAgICAgICBLZXkgICAgICAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgVmFsdWUgICAgID0+ICRHZXRQYXJhbXskVGV4dH0sCiAgICAgICAgICAgICAgICBDb3VudGVyICAgPT4gJENvdW50LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHByaW9yaXR5CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eX0gJiYgJEdldFBhcmFte05ld1ByaW9yaXR5SUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFByaW9yaXR5U2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgICA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFByaW9yaXR5SUQgPT4gJEdldFBhcmFte05ld1ByaW9yaXR5SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNldCBzdGF0ZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57U3RhdGV9ICYmICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdGF0ZVNldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgU3RhdGVJRCAgPT4gJEdldFBhcmFte05ld1N0YXRlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyB1bmxvY2sgdGhlIHRpY2tldCBhZnRlciBjbG9zZQogICAgICAgICAgICBteSAlU3RhdGVEYXRhID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgICAgIElEID0+ICRHZXRQYXJhbXtOZXdTdGF0ZUlEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgc2V0IHVubG9jayBvbiBjbG9zZSBzdGF0ZQogICAgICAgICAgICBpZiAoICRTdGF0ZURhdGF7VHlwZU5hbWV9ID1+IC9eY2xvc2UvaSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0TG9ja1NldCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICBMb2NrICAgICA9PiAndW5sb2NrJywKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNldCBwZW5kaW5nIHRpbWUgb24gcGVuZGlnIHN0YXRlCiAgICAgICAgICAgIGVsc2lmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL15wZW5kaW5nL2kgKSB7CgogICAgICAgICAgICAgICAgIyBzZXQgcGVuZGluZyB0aW1lCiAgICAgICAgICAgICAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlbmRpbmdUaW1lU2V0KAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHJlZGlyZWN0IHBhcmVudCB3aW5kb3cgdG8gbGFzdCBzY3JlZW4gb3ZlcnZpZXcgb24gY2xvc2VkIHRpY2tldHMKICAgICAgICAgICAgaWYgKCAkU3RhdGVEYXRhe1R5cGVOYW1lfSA9fiAvXmNsb3NlL2kgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Qb3B1cENsb3NlKAogICAgICAgICAgICAgICAgICAgIFVSTCA9PiAoICRTZWxmLT57TGFzdFNjcmVlbk92ZXJ2aWV3fSB8fCAnQWN0aW9uPUFnZW50RGFzaGJvYXJkJyApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBsb2FkIG5ldyBVUkwgaW4gcGFyZW50IHdpbmRvdyBhbmQgY2xvc2UgcG9wdXAKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Qb3B1cENsb3NlKAogICAgICAgICAgICBVUkwgPT4gIkFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JFNlbGYtPntUaWNrZXRJRH07QXJ0aWNsZUlEPSRBcnRpY2xlSUQiLAogICAgICAgICk7CiAgICB9CiMgLS0tCiMgSVRTTQojIC0tLQogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FKQVhVcGRhdGUnICkgewoKICAgICAgICAkSW1wYWN0TGlzdC0+eycnfSA9ICctJzsKCiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CgogICAgICAgIG15ICVTTEEgPSAoKTsKICAgICAgICBpZiAoICRHZXRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGZyZWUgdGV4dCBjb25maWcgb3B0aW9ucwogICAgICAgIG15IEBUaWNrZXRGcmVlVGV4dENvbmZpZyA9ICgpOwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ID0gIlRpY2tldEZyZWVLZXkiIC4gJENvdW50OwogICAgICAgICAgICBteSAkVGV4dCA9ICJUaWNrZXRGcmVlVGV4dCIgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRDb25maWdLZXkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgUXVldWVJRCAgPT4gICRUaWNrZXR7UXVldWVJRH0gfHwgMCwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCRDb25maWdLZXkpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJENvbmZpZ0tleSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyRLZXl9LAogICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgICAgICAgICBNYXggICAgICAgICA9PiAxMDAsCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkQ29uZmlnVmFsdWUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFF1ZXVlSUQgID0+ICAkVGlja2V0e1F1ZXVlSUR9IHx8IDAsCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICgkQ29uZmlnVmFsdWUpIHsKICAgICAgICAgICAgICAgIHB1c2goCiAgICAgICAgICAgICAgICAgICAgQFRpY2tldEZyZWVUZXh0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+ICRDb25maWdWYWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJEdldFBhcmFteyRUZXh0fSwKICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgPT4gMTAwLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbkpTT04oCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1NMQUlEJywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtTTEFJRH0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dDE0JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRHZXRQYXJhbXtJbXBhY3RJRH0sCiAgICAgICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgID0+ICRHZXRQYXJhbXtOZXdQcmlvcml0eUlEfSwKICAgICAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDEwMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBAVGlja2V0RnJlZVRleHRDb25maWcsCiAgICAgICAgICAgIF0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgICAgICBDb250ZW50VHlwZSA9PiAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD0nIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57Q2hhcnNldH0sCiAgICAgICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OLAogICAgICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICAgICAgTm9DYWNoZSAgICAgPT4gMSwKICAgICAgICApOwogICAgfQojIC0tLQogICAgZWxzZSB7CgogICAgICAgICMgZmlsbHVwIGNvbmZpZ3VyZWQgZGVmYXVsdCB2YXJzCiAgICAgICAgaWYgKCAhZGVmaW5lZCAkR2V0UGFyYW17Qm9keX0gJiYgJFNlbGYtPntDb25maWd9LT57Qm9keX0gKSB7CiAgICAgICAgICAgICRHZXRQYXJhbXtCb2R5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJFNlbGYtPntDb25maWd9LT57Qm9keX0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIG1ha2Ugc3VyZSBib2R5IGlzIHJpY2ggdGV4dAogICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJSaWNoVGV4dH0gKSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17Qm9keX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMlJpY2hUZXh0KAogICAgICAgICAgICAgICAgICAgIFN0cmluZyA9PiAkR2V0UGFyYW17Qm9keX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICggIWRlZmluZWQgJEdldFBhcmFte1N1YmplY3R9ICYmICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICAkR2V0UGFyYW17U3ViamVjdH0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRTZWxmLT57Q29uZmlnfS0+e1N1YmplY3R9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJVRpY2tldEZyZWVUZXh0OwogICAgICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDE2ICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudDsKICAgICAgICAgICAgbXkgJFRleHQgPSAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldEZyZWVUZXh0R2V0KAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkS2V5LAogICAgICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkVGlja2V0RnJlZVRleHR7JFRleHR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIEtleSBoYXMgdmFsdWUgMiwgdGhpcyBtZWFucyB0aGF0IHRoZSBmcmVldGV4dGZpZWxkIGlzIHJlcXVpcmVkCiAgICAgICAgICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fSA9PSAyICkgewogICAgICAgICAgICAgICAgJFRpY2tldEZyZWVUZXh0e1JlcXVpcmVkfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlVGlja2V0RnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BZ2VudEZyZWVUZXh0KAogICAgICAgICAgICBUaWNrZXQgPT4gXCVUaWNrZXQsCiAgICAgICAgICAgIENvbmZpZyA9PiBcJVRpY2tldEZyZWVUZXh0LAogICAgICAgICk7CgogICAgICAgICMgdGlja2V0IGZyZWUgdGltZQogICAgICAgIG15ICVUaWNrZXRGcmVlVGltZUhUTUwgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFnZW50RnJlZURhdGUoIFRpY2tldCA9PiBcJUdldFBhcmFtICk7CgogICAgICAgICMgZ2V0IGRlZmF1bHQgc2VsZWN0aW9ucwogICAgICAgIG15ICVBcnRpY2xlRnJlZURlZmF1bHQ7CiAgICAgICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICAgICAgbXkgJEtleSAgPSAnQXJ0aWNsZUZyZWVLZXknIC4gJENvdW50OwogICAgICAgICAgICBteSAkVGV4dCA9ICdBcnRpY2xlRnJlZVRleHQnIC4gJENvdW50OwogICAgICAgICAgICAkQXJ0aWNsZUZyZWVEZWZhdWx0eyRLZXl9ID0gJEdldFBhcmFteyRLZXl9CiAgICAgICAgICAgICAgICB8fCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJEtleSAuICc6OkRlZmF1bHRTZWxlY3Rpb24nICk7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZURlZmF1bHR7JFRleHR9ID0gJEdldFBhcmFteyRUZXh0fQogICAgICAgICAgICAgICAgfHwgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICRUZXh0IC4gJzo6RGVmYXVsdFNlbGVjdGlvbicgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGFydGljbGUgZnJlZSB0ZXh0IGNvbmZpZyBvcHRpb25zCiAgICAgICAgbXkgJUFydGljbGVGcmVlVGV4dDsKICAgICAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgICAgICBteSAkS2V5ICA9ICdBcnRpY2xlRnJlZUtleScgLiAkQ291bnQ7CiAgICAgICAgICAgIG15ICRUZXh0ID0gJ0FydGljbGVGcmVlVGV4dCcgLiAkQ291bnQ7CiAgICAgICAgICAgICRBcnRpY2xlRnJlZVRleHR7JEtleX0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJEtleSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJEFydGljbGVGcmVlVGV4dHskVGV4dH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVGcmVlVGV4dEdldCgKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICBBY3Rpb24gICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIElmIEtleSBoYXMgdmFsdWUgMiwgdGhpcyBtZWFucyB0aGF0IHRoZSBmaWVsZCBpcyByZXF1aXJlZAogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9ID09IDIgKSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUZyZWVUZXh0e1JlcXVpcmVkfS0+eyRDb3VudH0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG15ICVBcnRpY2xlRnJlZVRleHRIVE1MID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRBcnRpY2xlRnJlZVRleHQoCiAgICAgICAgICAgIENvbmZpZyAgPT4gXCVBcnRpY2xlRnJlZVRleHQsCiAgICAgICAgICAgIEFydGljbGUgPT4gXCVBcnRpY2xlRnJlZURlZmF1bHQsCiAgICAgICAgKTsKCiAgICAgICAgIyBwcmludCBmb3JtIC4uLgogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigKICAgICAgICAgICAgVHlwZSAgPT4gJ1NtYWxsJywKICAgICAgICAgICAgVmFsdWUgPT4gJFRpY2tldHtUaWNrZXROdW1iZXJ9LAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X01hc2soCiAgICAgICAgICAgIFRpbWVVbml0c1JlcXVpcmVkID0+ICgKICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpCiAgICAgICAgICAgICAgICA/ICdWYWxpZGF0ZV9SZXF1aXJlZCcKICAgICAgICAgICAgICAgIDogJycKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAlVGlja2V0LAogICAgICAgICAgICAlVGlja2V0RnJlZVRleHRIVE1MLAogICAgICAgICAgICAlVGlja2V0RnJlZVRpbWVIVE1MLAogICAgICAgICAgICAlQXJ0aWNsZUZyZWVUZXh0SFRNTCwKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgIEltcGFjdHMgPT4gJEltcGFjdExpc3QsCiAgICAgICAgICAgIEltcGFjdElEID0+ICRUaWNrZXR7VGlja2V0RnJlZVRleHQxNH0sCiAgICAgICAgICAgIE5ld1ByaW9yaXR5SUQgPT4gJFRpY2tldHtQcmlvcml0eUlEfSwKIyAtLS0KICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoCiAgICAgICAgICAgIFR5cGUgPT4gJ1NtYWxsJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQp9CgpzdWIgX01hc2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBsaXN0IHR5cGUKICAgIG15ICRUcmVlVmlldyA9IDA7CiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpMaXN0VHlwZScpIGVxICd0cmVlJyApIHsKICAgICAgICAkVHJlZVZpZXcgPSAxOwogICAgfQogICAgbXkgJVRpY2tldCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSApOwoKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57VGl0bGV9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpdGxlJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyB0eXBlcwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgJiYgJFNlbGYtPntDb25maWd9LT57VGlja2V0VHlwZX0gKSB7CiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFR5cGVMaXN0KAogICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17VHlwZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgQ2xhc3MgPT4gJ1ZhbGlkYXRlX1JlcXVpcmVkJyAuICggJFBhcmFte0Vycm9yc30tPntUeXBlSURJbnZhbGlkfSB8fCAnICcgKSwKICAgICAgICAgICAgRGF0YSAgPT4gXCVUeXBlLAogICAgICAgICAgICBOYW1lICA9PiAnVHlwZUlEJywKICAgICAgICAgICAgU2VsZWN0ZWRJRCAgID0+ICRQYXJhbXtUeXBlSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyVQYXJhbX0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNlcnZpY2VzCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkU2VsZi0+e0NvbmZpZ30tPntTZXJ2aWNlfSApIHsKICAgICAgICBteSAlU2VydmljZSA9ICggJycsICctJyApOwogICAgICAgIGlmICggJFRpY2tldHtDdXN0b21lclVzZXJJRH0gKSB7CiAgICAgICAgICAgICVTZXJ2aWNlID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZXJ2aWNlTGlzdCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIEFjdGlvbiAgICAgICAgID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIEN1c3RvbWVyVXNlcklEID0+ICRUaWNrZXR7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICAkUGFyYW17U2VydmljZVN0cmd9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTZXJ2aWNlSUQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte1NlcnZpY2VJRH0sCiAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAkUGFyYW17U2VydmljZUludmFsaWR9IHx8ICcgJywKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIFRyZWVWaWV3ICAgICA9PiAkVHJlZVZpZXcsCiAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnVHJlZVZpZXcnLAogICAgICAgICAgICBUcmFuc2xhdGlvbiAgPT4gMCwKICAgICAgICAgICAgTWF4ICAgICAgICAgID0+IDIwMCwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICk7CiAgICAgICAgbXkgJVNMQTsKICAgICAgICBpZiAoICRQYXJhbXtTZXJ2aWNlSUR9ICkgewogICAgICAgICAgICAlU0xBID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTTEFMaXN0KAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICRTZWxmLT57QWN0aW9ufSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICRQYXJhbXtTTEFTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVNMQSwKICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICdTTEFJRCcsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17U0xBSUR9LAogICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgU29ydCAgICAgICAgID0+ICdBbHBoYW51bWVyaWNWYWx1ZScsCiAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICBNYXggICAgICAgICAgPT4gMjAwLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntPd25lcn0gKSB7CgogICAgICAgICMgZ2V0IHVzZXIgb2Ygb3duIGdyb3VwcwogICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgIG15ICVBbGxHcm91cHNNZW1iZXJzID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+VXNlckxpc3QoCiAgICAgICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6Q2hhbmdlT3duZXJUb0V2ZXJ5b25lJykgKSB7CiAgICAgICAgICAgICVTaG93blVzZXJzID0gJUFsbEdyb3Vwc01lbWJlcnM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBteSAkR0lEID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldFF1ZXVlR3JvdXBJRCggUXVldWVJRCA9PiAkVGlja2V0e1F1ZXVlSUR9ICk7CiAgICAgICAgICAgIG15ICVNZW1iZXJMaXN0ID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdJRCwKICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ293bmVyJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBvbGQgb3duZXIKICAgICAgICBteSBAT2xkVXNlckluZm8gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldE93bmVyTGlzdCggVGlja2V0SUQgPT4gJFNlbGYtPntUaWNrZXRJRH0gKTsKICAgICAgICAkUGFyYW17T3duZXJTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVTaG93blVzZXJzLAogICAgICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtOZXdPd25lcklEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3T3duZXJJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJFBhcmFte05ld093bmVySW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICBTaXplICAgICAgID0+IDEwLAoKICAgICAgICApOwogICAgICAgIG15ICVVc2VySGFzaDsKICAgICAgICBpZiAoQE9sZFVzZXJJbmZvKSB7CiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMTsKICAgICAgICAgICAgZm9yIG15ICRVc2VyICggcmV2ZXJzZSBAT2xkVXNlckluZm8gKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH07CiAgICAgICAgICAgICAgICAkVXNlckhhc2h7ICRVc2VyLT57VXNlcklEfSB9ID0gIiRDb3VudGVyOiAkVXNlci0+e1VzZXJMYXN0bmFtZX0gIgogICAgICAgICAgICAgICAgICAgIC4gIiRVc2VyLT57VXNlckZpcnN0bmFtZX0gKCRVc2VyLT57VXNlckxvZ2lufSkiOwogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoICElVXNlckhhc2ggKSB7CiAgICAgICAgICAgICRVc2VySGFzaHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIG15ICRPbGRPd25lclNlbGVjdGVkSUQgPSAnJzsKICAgICAgICBpZiAoICRQYXJhbXtPbGRPd25lcklEfSApIHsKICAgICAgICAgICAgJE9sZE93bmVyU2VsZWN0ZWRJRCA9ICRQYXJhbXtPbGRPd25lcklEfTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkT2xkVXNlckluZm9bMF0tPntVc2VySUR9ICkgewogICAgICAgICAgICAkT2xkT3duZXJTZWxlY3RlZElEID0gJE9sZFVzZXJJbmZvWzBdLT57VXNlcklEfSAuICcxJzsKICAgICAgICB9CgogICAgICAgICMgYnVpbGQgc3RyaW5nCiAgICAgICAgJFBhcmFte09sZE93bmVyU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJE9sZE93bmVyU2VsZWN0ZWRJRCwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnT2xkT3duZXJJRCcsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJFBhcmFte09sZE93bmVySW52YWxpZH0gfHwgJyAnLAoKICAgICAgICApOwogICAgICAgIGlmICggJFBhcmFte05ld093bmVyVHlwZX0gJiYgJFBhcmFte05ld093bmVyVHlwZX0gZXEgJ09sZCcgKSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpPbGQnfSA9ICdjaGVja2VkID0gImNoZWNrZWQiJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXsnTmV3T3duZXJUeXBlOjpOZXcnfSA9ICdjaGVja2VkID0gImNoZWNrZWQiJzsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ093bmVyJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CiAgICBpZiAoICRTZWxmLT57Q29uZmlnfS0+e1Jlc3BvbnNpYmxlfSApIHsKCiAgICAgICAgIyBnZXQgdXNlciBvZiBvd24gZ3JvdXBzCiAgICAgICAgbXkgJVNob3duVXNlcnM7CiAgICAgICAgbXkgJUFsbEdyb3Vwc01lbWJlcnMgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpDaGFuZ2VPd25lclRvRXZlcnlvbmUnKSApIHsKICAgICAgICAgICAgJVNob3duVXNlcnMgPSAlQWxsR3JvdXBzTWVtYmVyczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG15ICRHSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0UXVldWVHcm91cElEKCBRdWV1ZUlEID0+ICRUaWNrZXR7UXVldWVJRH0gKTsKICAgICAgICAgICAgbXkgJU1lbWJlckxpc3QgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBNZW1iZXJMaXN0KAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkR0lELAogICAgICAgICAgICAgICAgVHlwZSAgICA9PiAncmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgUmVzdWx0ICA9PiAnSEFTSCcsCiAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciBteSAkVXNlcklEICgga2V5cyAlTWVtYmVyTGlzdCApIHsKICAgICAgICAgICAgICAgICRTaG93blVzZXJzeyRVc2VySUR9ID0gJEFsbEdyb3Vwc01lbWJlcnN7JFVzZXJJRH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IHJlc3BvbnNpYmxlCiAgICAgICAgJFBhcmFte1Jlc3BvbnNpYmxlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17TmV3UmVzcG9uc2libGVJRH0gfHwgJFRpY2tldHtSZXNwb25zaWJsZUlEfSwKICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnTmV3UmVzcG9uc2libGVJRCcsCiAgICAgICAgICAgIFNpemUgICAgICAgPT4gMTAsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXNwb25zaWJsZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZX0gKSB7CiAgICAgICAgbXkgJVN0YXRlOwogICAgICAgIG15ICVTdGF0ZUxpc3QgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN0YXRlTGlzdCgKICAgICAgICAgICAgQWN0aW9uICAgPT4gJFNlbGYtPntBY3Rpb259LAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkU2VsZi0+e1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFN0YXRlTGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdTdGF0ZUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntTdGF0ZURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkVmFsdWV9ID0gJFNlbGYtPntDb25maWd9LT57U3RhdGVEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFN0YXRle1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1N0YXRlSUR9OwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBuZXh0IHN0YXRlcyBzdHJpbmcKICAgICAgICAkUGFyYW17U3RhdGVTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1N0YXRlSUQnLAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTdGF0ZScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkU3RhdGVJRCAoIHNvcnQga2V5cyAlU3RhdGVMaXN0ICkgewogICAgICAgICAgICBuZXh0IGlmICEkU3RhdGVJRDsKICAgICAgICAgICAgbXkgJVN0YXRlRGF0YSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXQoIElEID0+ICRTdGF0ZUlEICk7CiAgICAgICAgICAgIGlmICggJFN0YXRlRGF0YXtUeXBlTmFtZX0gPX4gL3BlbmRpbmcvaSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtEYXRlU3RyaW5nfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGREYXRlU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIEZvcm1hdCAgICAgICAgICAgPT4gJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICAgICAgICAgIFllYXJQZXJpb2RQYXN0ICAgPT4gMCwKICAgICAgICAgICAgICAgICAgICBZZWFyUGVyaW9kRnV0dXJlID0+IDUsCiAgICAgICAgICAgICAgICAgICAgRGlmZlRpbWUgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OlBlbmRpbmdEaWZmVGltZScpCiAgICAgICAgICAgICAgICAgICAgICAgIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgICAgIENsYXNzID0+ICRQYXJhbXtEYXRlSW52YWxpZH0gfHwgJyAnLAogICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlICAgICAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVEYXRlSW5GdXR1cmUgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1N0YXRlUGVuZGluZycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgcHJpb3JpdHkKICAgIGlmICggJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHl9ICkgewojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAjIGNyZWF0ZSBpbXBhY3Qgc3RyaW5nCiAgICAgICAgJFBhcmFteydJbXBhY3RTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFBhcmFte0ltcGFjdHN9LAogICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0MTQnLAogICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFte0ltcGFjdElEfSwKICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbXBhY3QnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKIyAtLS0KICAgICAgICBteSAlUHJpb3JpdHk7CiAgICAgICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UHJpb3JpdHlMaXN0KAogICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fSApIHsKICAgICAgICAgICAgJFByaW9yaXR5TGlzdHsnJ30gPSAnLSc7CiAgICAgICAgfQogICAgICAgIGlmICggISRQYXJhbXtOZXdQcmlvcml0eUlEfSApIHsKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntQcmlvcml0eURlZmF1bHR9ICkgewogICAgICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkVmFsdWV9ID0gJFNlbGYtPntDb25maWd9LT57UHJpb3JpdHlEZWZhdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFByaW9yaXR5e1NlbGVjdGVkSUR9ID0gJFBhcmFte05ld1ByaW9yaXR5SUR9OwogICAgICAgIH0KICAgICAgICAkUGFyYW17UHJpb3JpdHlTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgPT4gXCVQcmlvcml0eUxpc3QsCiAgICAgICAgICAgIE5hbWUgPT4gJ05ld1ByaW9yaXR5SUQnLAogICAgICAgICAgICAlUHJpb3JpdHksCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdQcmlvcml0eScsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntOb3RlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdOb3RlJywKICAgICAgICAgICAgRGF0YSA9PiB7JVBhcmFtfSwKICAgICAgICApOwoKICAgICAgICAjIGFkZCByaWNoIHRleHQgZWRpdG9yCiAgICAgICAgaWYgKCAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmljaFRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBhZ2VudCBsaXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbmZvcm1BZ2VudH0gKSB7CiAgICAgICAgICAgIG15ICVTaG93blVzZXJzOwogICAgICAgICAgICBteSAlQWxsR3JvdXBzTWVtYmVycyA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJ0xvbmcnLAogICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJEdJRCA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRRdWV1ZUdyb3VwSUQoIFF1ZXVlSUQgPT4gJFRpY2tldHtRdWV1ZUlEfSApOwogICAgICAgICAgICBteSAlTWVtYmVyTGlzdCA9ICRTZWxmLT57R3JvdXBPYmplY3R9LT5Hcm91cE1lbWJlckxpc3QoCiAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdub3RlJywKICAgICAgICAgICAgICAgIFJlc3VsdCAgPT4gJ0hBU0gnLAogICAgICAgICAgICAgICAgQ2FjaGVkICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJJRCAoIGtleXMgJU1lbWJlckxpc3QgKSB7CiAgICAgICAgICAgICAgICAkU2hvd25Vc2Vyc3skVXNlcklEfSA9ICRBbGxHcm91cHNNZW1iZXJzeyRVc2VySUR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRQYXJhbXtPcHRpb25TdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlU2hvd25Vc2VycywKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFNlbGYtPntJbmZvcm1Vc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW5mb3JtVXNlcklEJywKICAgICAgICAgICAgICAgIE11bHRpcGxlICAgPT4gMSwKICAgICAgICAgICAgICAgIFNpemUgICAgICAgPT4gMywKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0luZm9ybUFnZW50JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgZ2V0IGludm9sdmVkCiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ30tPntJbnZvbHZlZEFnZW50fSApIHsKICAgICAgICAgICAgbXkgQFVzZXJJRHMKICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRJbnZvbHZlZEFnZW50c0xpc3QoIFRpY2tldElEID0+ICRTZWxmLT57VGlja2V0SUR9ICk7CiAgICAgICAgICAgIG15ICVVc2VySGFzaDsKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBmb3IgbXkgJFVzZXIgKCByZXZlcnNlIEBVc2VySURzICkgewogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgICAgIG5leHQgaWYgJFVzZXJIYXNoeyAkVXNlci0+e1VzZXJJRH0gfTsKICAgICAgICAgICAgICAgICRVc2VySGFzaHsgJFVzZXItPntVc2VySUR9IH0gPSAiJENvdW50ZXI6ICRVc2VyLT57VXNlckxhc3RuYW1lfSAiCiAgICAgICAgICAgICAgICAgICAgLiAiJFVzZXItPntVc2VyRmlyc3RuYW1lfSAoJFVzZXItPntVc2VyTG9naW59KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFBhcmFte0ludm9sdmVkQWdlbnRTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgID0+IFwlVXNlckhhc2gsCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+ICRTZWxmLT57SW52b2x2ZWRVc2VySUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICA9PiAnSW52b2x2ZWRVc2VySUQnLAogICAgICAgICAgICAgICAgTXVsdGlwbGUgICA9PiAxLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgICA9PiAzLAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnSW52b2x2ZWRBZ2VudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgc3BlbGwgY2hlY2sKICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jyb3dzZXJTcGVsbENoZWNrZXJ9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0T3B0aW9ucycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU3BlbGxDaGVjaycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBzaG93IGF0dGFjaG1lbnRzCiAgICAgICAgZm9yIG15ICRBdHRhY2htZW50ICggQHsgJFBhcmFte0F0dGFjaG1lbnRzfSB9ICkgewogICAgICAgICAgICBuZXh0IGlmICRBdHRhY2htZW50LT57Q29udGVudElEfSAmJiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCcm93c2VyUmljaFRleHR9OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRBdHRhY2htZW50LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBidWlsZCBBcnRpY2xlVHlwZUlEIHN0cmluZwogICAgICAgIG15ICVBcnRpY2xlVHlwZTsKICAgICAgICBpZiAoICEkUGFyYW17QXJ0aWNsZVR5cGVJRH0gKSB7CiAgICAgICAgICAgICRBcnRpY2xlVHlwZXtTZWxlY3RlZFZhbHVlfSA9ICRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVUeXBlRGVmYXVsdH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQXJ0aWNsZVR5cGV7U2VsZWN0ZWRJRH0gPSAkUGFyYW17QXJ0aWNsZVR5cGVJRH07CiAgICAgICAgfQoKICAgICAgICAjIGdldCBwb3NzaWJsZSBub3RlcwogICAgICAgIG15ICVEZWZhdWx0Tm90ZVR5cGVzID0gJXsgJFNlbGYtPntDb25maWd9LT57QXJ0aWNsZVR5cGVzfSB9OwogICAgICAgIG15ICVOb3RlVHlwZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVUeXBlTGlzdCggUmVzdWx0ID0+ICdIQVNIJyApOwogICAgICAgIGZvciBteSAkS2V5Tm90ZVR5cGUgKCBrZXlzICVOb3RlVHlwZXMgKSB7CiAgICAgICAgICAgIGlmICggISREZWZhdWx0Tm90ZVR5cGVzeyAkTm90ZVR5cGVzeyRLZXlOb3RlVHlwZX0gfSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkTm90ZVR5cGVzeyRLZXlOb3RlVHlwZX07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJFBhcmFte0FydGljbGVUeXBlU3RyZ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICBEYXRhID0+IFwlTm90ZVR5cGVzLAogICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlVHlwZUlEJywKICAgICAgICAgICAgJUFydGljbGVUeXBlLAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVR5cGUnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IHRpbWUgYWNjb3VudGluZyBib3gKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBY2NvdW50VGltZScpICkgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpOZWVkQWNjb3VudGVkVGltZScpICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnVGltZVVuaXRzTGFiZWwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpbWVVbml0cycsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRleHR9LT57JENvdW50fTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleUZpZWxkICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlS2V5RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ1RpY2tldEZyZWVUZXh0RmllbGQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgKTsKICAgIH0KICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntDb25maWd9LT57VGlja2V0RnJlZVRpbWV9LT57JENvdW50fTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFBhcmFteyAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkUGFyYW17ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCwKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGFydGljbGUgZnJlZSB0ZXh0CiAgICBmb3IgbXkgJENvdW50ICggMSAuLiAzICkgewogICAgICAgIG5leHQgaWYgISRTZWxmLT57Q29uZmlnfS0+e0FydGljbGVGcmVlVGV4dH0tPnskQ291bnR9OwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVGcmVlVGV4dCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgQXJ0aWNsZUZyZWVLZXlGaWVsZCAgPT4gJFBhcmFteyAnQXJ0aWNsZUZyZWVLZXlGaWVsZCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIEFydGljbGVGcmVlVGV4dEZpZWxkID0+ICRQYXJhbXsgJ0FydGljbGVGcmVlVGV4dEZpZWxkJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgQ291bnQgPT4gJENvdW50IH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBvdXRwdXQgYmFjawogICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KCBUZW1wbGF0ZUZpbGUgPT4gJFNlbGYtPntBY3Rpb259LCBEYXRhID0+IFwlUGFyYW0gKTsKfQoKMTsK
IyAtLQojIEFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBmcmVlIHRleHQgbWFzawojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRBZGR0bElUU01GaWVsZC5kdGwsdiAxLjYgMjAxMC8wOC8zMSAyMjowMzo1OSBtcCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFnZW50VGlja2V0QWN0aW9uQ29tbW9uIn0K
IyAtLQojIEFnZW50VGlja2V0RGVjaXNpb24uZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBkZWNpc2lvbiBtYXNrCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldERlY2lzaW9uLmR0bCx2IDEuNiAyMDEwLzA5LzAyIDE3OjI2OjM1IGVuIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE5vdGUuZHRsLHYgMS40OSAyMDEwLzA2LzE4IDE3OjQ2OjIwIG1wIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgokSW5jbHVkZXsiQWdlbnRUaWNrZXRBY3Rpb25Db21tb24ifQ==
IyAtLQojIEFnZW50VGlja2V0RW1haWwuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBhZ2VudCBlbWFpbAojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRFbWFpbC5kdGwsdiAxLjI2IDIwMTAvMTIvMjEgMjE6NTE6MjggdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0RW1haWwuZHRsLHYgMS4xNDIgMjAxMC8xMi8yMCAxNTozNTowNSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiRJbmNsdWRleyJBZ2VudEN1c3RvbWVyU2VhcmNoIn0KPGRpdiBjbGFzcz0iTWFpbkJveCBBUklBUm9sZU1haW4iPgoKICAgIDxoMT4kVGV4dHsiQ3JlYXRlIE5ldyBFbWFpbCBUaWNrZXQifTwvaDE+CgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KCiMgc2hvdyBjdXN0b21lciBpbmZvIHRhYmxlCjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJJbmZvIiBjbGFzcz0iU2lkZWJhckNvbHVtbiBXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJDdXN0b21lciBJbmZvcm1hdGlvbiJ9PC9oMj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgJERhdGF7IkN1c3RvbWVyVGFibGUifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KCiAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudENvbHVtbiI+CiAgICAgICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgaWQ9Ik5ld0VtYWlsVGlja2V0IiBjbGFzcz0iVmFsaWRhdGUgUHJldmVudE11bHRpcGxlU3VibWl0cyI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkV4cGFuZEN1c3RvbWVyTmFtZSIgaWQ9IkV4cGFuZEN1c3RvbWVyTmFtZSIgdmFsdWU9IjAiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Ik93bmVyQWxsIiBpZD0iT3duZXJBbGwiIHZhbHVlPSIkUURhdGF7Ik93bmVyQWxsIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlc3BvbnNpYmxlQWxsIiBpZD0iUmVzcG9uc2libGVBbGwiIHZhbHVlPSIkUURhdGF7IlJlc3BvbnNpYmxlQWxsIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlByZVNlbGVjdGVkQ3VzdG9tZXJVc2VyIiBpZD0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIHZhbHVlPSIiLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNlbGVjdGVkQ3VzdG9tZXJVc2VyIiBpZD0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIHZhbHVlPSIkUURhdGF7IkN1c3RvbWVyVXNlciJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkltcGFjdFJDIiB2YWx1ZT0iMCIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJpb3JpdHlSQyIgdmFsdWU9IjAiLz4KIyAtLS0KICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KCiMgZXhhbXBsZSB0ZW1wbGF0ZSBmb3IgY3VzdG9taXphdGlvbnMsIHNlZSBoaWRkZW4gZm9ybSBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlCiMgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiVGVtcGxhdGVzIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG9uY2xpY2s9IiQoJyNUZW1wbGF0ZTEnKS5zdWJtaXQoKSIgdmFsdWU9IiRUZXh0eyJFeGFtcGxlIFRlbXBsYXRlIn0iPiRUZXh0eyJFeGFtcGxlIFRlbXBsYXRlIn08L2J1dHRvbj4KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlRpY2tldFR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVHlwZUlEIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiVHlwZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVHlwZVN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjVHlwZUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnVHlwZUlEJywgWydOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUaWNrZXRGcmVlVGV4dDEnLCAnVGlja2V0RnJlZVRleHQyJywgJ1RpY2tldEZyZWVUZXh0MycsICdUaWNrZXRGcmVlVGV4dDQnLCAnVGlja2V0RnJlZVRleHQ1JywgJ1RpY2tldEZyZWVUZXh0NicsICdUaWNrZXRGcmVlVGV4dDcnLCAnVGlja2V0RnJlZVRleHQ4JywgJ1RpY2tldEZyZWVUZXh0OScsICdUaWNrZXRGcmVlVGV4dDEwJywgJ1RpY2tldEZyZWVUZXh0MTEnLCAnVGlja2V0RnJlZVRleHQxMicsICdUaWNrZXRGcmVlVGV4dDEzJywgJ1RpY2tldEZyZWVUZXh0MTQnLCAnVGlja2V0RnJlZVRleHQxNScsICdUaWNrZXRGcmVlVGV4dDE2JywgJ1RvJywgJ0NjJywgJ0JjYyddKTsKfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFR5cGUgLS0+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJGcm9tIHF1ZXVlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJGcm9tU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlc3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiID48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNEZXN0JykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICB2YXIgU2lnbmF0dXJlVVJMID0gJyRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07U3ViYWN0aW9uPVNpZ25hdHVyZTtEZXN0PScgKyAkKHRoaXMpLnZhbCgpOwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ0Rlc3QnLCBbJ1NpZ25hdHVyZScsICdOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUaWNrZXRGcmVlVGV4dDEnLCAnVGlja2V0RnJlZVRleHQyJywgJ1RpY2tldEZyZWVUZXh0MycsICdUaWNrZXRGcmVlVGV4dDQnLCAnVGlja2V0RnJlZVRleHQ1JywgJ1RpY2tldEZyZWVUZXh0NicsICdUaWNrZXRGcmVlVGV4dDcnLCAnVGlja2V0RnJlZVRleHQ4JywgJ1RpY2tldEZyZWVUZXh0OScsICdUaWNrZXRGcmVlVGV4dDEwJywgJ1RpY2tldEZyZWVUZXh0MTEnLCAnVGlja2V0RnJlZVRleHQxMicsICdUaWNrZXRGcmVlVGV4dDEzJywgJ1RpY2tldEZyZWVUZXh0MTQnLCAnVGlja2V0RnJlZVRleHQxNScsICdUaWNrZXRGcmVlVGV4dDE2JywgJ1RvJywgJ0NjJywgJ0JjYyddKTsKICAgIGlmICghQ29yZS5Db25maWcuR2V0KCdTZXNzaW9uSURDb29raWUnKSkgewogICAgICAgIFNpZ25hdHVyZVVSTCArPSAnOycgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25OYW1lJykgKyAnPScgKyBDb3JlLkNvbmZpZy5HZXQoJ1Nlc3Npb25JRCcpOwogICAgfQogICAgJCgnI1NpZ25hdHVyZScpLmF0dHIoJ3NyYycsIFNpZ25hdHVyZVVSTCk7Cn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDdXN0b21lckF1dG9Db21wbGV0ZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IlRvIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQ3VzdG9tZXJBdXRvQ29tcGxldGUiIHR5cGU9InRleHQiIG5hbWU9IlRvIiB2YWx1ZT0iJFFEYXRheyJUbyJ9IiBjbGFzcz0iVzc1cGMgQXV0b2NvbXBsZXRlT2ZmIFZhbGlkYXRlX1JlcXVpcmVkICRRRGF0YXsiVG9JbnZhbGlkIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVyQXV0b0NvbXBsZXRlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVyQXV0b0NvbXBsZXRlU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KPCEtLSBkdGw6YmxvY2s6VG9HZW5lcmljU2VydmVyRXJyb3JNc2cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD4KPCEtLSBkdGw6YmxvY2s6VG9HZW5lcmljU2VydmVyRXJyb3JNc2cgLS0+CjwhLS0gZHRsOmJsb2NrOlRvSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZW1haWwgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCBkdWUgdG8gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLiJ9PC9wPgo8IS0tIGR0bDpibG9jazpUb0ludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyAtLT4KPCEtLSBkdGw6YmxvY2s6VG9JbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGVtYWlsIGFkZHJlc3MgZmFpbGVkIE1YIGNoZWNrLiJ9PC9wPgo8IS0tIGR0bDpibG9jazpUb0ludmFsaWRNWFNlcnZlckVycm9yTXNnIC0tPgo8IS0tIGR0bDpibG9jazpUb0ludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIn08L3A+CjwhLS0gZHRsOmJsb2NrOlRvSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkNjIj4kVGV4dHsiQ2MifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkNjIiBpZD0iQ2MiIHZhbHVlPSIkUURhdGF7IkNjIn0iICBjbGFzcz0iVzc1cGMgJFFEYXRheyJDY0ludmFsaWQifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ2NTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgo8IS0tIGR0bDpibG9jazpDY0ludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGVtYWlsIGFkZHJlc3MgaXMgbm90IGFsbG93ZWQgZHVlIHRvIHRoZSBzeXN0ZW0gY29uZmlndXJhdGlvbi4ifTwvcD4KPCEtLSBkdGw6YmxvY2s6Q2NJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2cgLS0+CjwhLS0gZHRsOmJsb2NrOkNjSW52YWxpZE1YU2VydmVyRXJyb3JNc2cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiVGhpcyBlbWFpbCBhZGRyZXNzIGZhaWxlZCBNWCBjaGVjay4ifTwvcD4KPCEtLSBkdGw6YmxvY2s6Q2NJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyAtLT4KPCEtLSBkdGw6YmxvY2s6Q2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiJ9PC9wPgo8IS0tIGR0bDpibG9jazpDY0ludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJCY2MiPiRUZXh0eyJCY2MifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IkJjYyIgaWQ9IkJjYyIgdmFsdWU9IiRRRGF0YXsiQmNjIn0iIGNsYXNzPSJXNzVwYyAkUURhdGF7IkJjY0ludmFsaWQifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQmNjU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KPCEtLSBkdGw6YmxvY2s6QmNjSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZW1haWwgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCBkdWUgdG8gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLiJ9PC9wPgo8IS0tIGR0bDpibG9jazpCY2NJbnZhbGlkQ29uZmlnU2VydmVyRXJyb3JNc2cgLS0+CjwhLS0gZHRsOmJsb2NrOkJjY0ludmFsaWRNWFNlcnZlckVycm9yTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZW1haWwgYWRkcmVzcyBmYWlsZWQgTVggY2hlY2suIn08L3A+CjwhLS0gZHRsOmJsb2NrOkJjY0ludmFsaWRNWFNlcnZlckVycm9yTXNnIC0tPgo8IS0tIGR0bDpibG9jazpCY2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kVGV4dHsiVGhlIHN5bnRheCBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaXMgaW5jb3JyZWN0LiJ9PC9wPgo8IS0tIGR0bDpibG9jazpCY2NJbnZhbGlkU3ludGF4U2VydmVyRXJyb3JNc2cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlRpY2tldFNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU2VydmljZUlEIj4kVGV4dHsiU2VydmljZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiU2VydmljZVN0cmcifQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTZXJ2aWNlSURTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJTZXJ2aWNlIGludmFsaWQuIn08L3A+PC9kaXY+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVGlja2V0RnJlZVRleHQxJywgJ1RpY2tldEZyZWVUZXh0MicsICdUaWNrZXRGcmVlVGV4dDMnLCAnVGlja2V0RnJlZVRleHQ0JywgJ1RpY2tldEZyZWVUZXh0NScsICdUaWNrZXRGcmVlVGV4dDYnLCAnVGlja2V0RnJlZVRleHQ3JywgJ1RpY2tldEZyZWVUZXh0OCcsICdUaWNrZXRGcmVlVGV4dDknLCAnVGlja2V0RnJlZVRleHQxMCcsICdUaWNrZXRGcmVlVGV4dDExJywgJ1RpY2tldEZyZWVUZXh0MTInLCAnVGlja2V0RnJlZVRleHQxMycsICdUaWNrZXRGcmVlVGV4dDE0JywgJ1RpY2tldEZyZWVUZXh0MTUnLCAnVGlja2V0RnJlZVRleHQxNicsICdUbycsICdDYycsICdCY2MnXSk7Cn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgoKPCEtLSBkdGw6YmxvY2s6VGlja2V0U0xBIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNMQUlEIj4kVGV4dHsiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlNMQVN0cmcifQo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjU0xBSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdFbWFpbFRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUaWNrZXRGcmVlVGV4dDEnLCAnVGlja2V0RnJlZVRleHQyJywgJ1RpY2tldEZyZWVUZXh0MycsICdUaWNrZXRGcmVlVGV4dDQnLCAnVGlja2V0RnJlZVRleHQ1JywgJ1RpY2tldEZyZWVUZXh0NicsICdUaWNrZXRGcmVlVGV4dDcnLCAnVGlja2V0RnJlZVRleHQ4JywgJ1RpY2tldEZyZWVUZXh0OScsICdUaWNrZXRGcmVlVGV4dDEwJywgJ1RpY2tldEZyZWVUZXh0MTEnLCAnVGlja2V0RnJlZVRleHQxMicsICdUaWNrZXRGcmVlVGV4dDEzJywgJ1RpY2tldEZyZWVUZXh0MTQnLCAnVGlja2V0RnJlZVRleHQxNScsICdUaWNrZXRGcmVlVGV4dDE2JywgJ1RvJywgJ0NjJywgJ0JjYyddKTsKfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldFNMQSAtLT4KCjwhLS0gZHRsOmJsb2NrOk93bmVyU2VsZWN0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1VzZXJJRCI+JFRleHR7Ik93bmVyIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik93bmVyU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IiRUZXh0eyJHZXQgYWxsIn0iPiRUZXh0eyJHZXQgYWxsIn08L2E+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiQoJyNPd25lclNlbGVjdGlvbkdldEFsbCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAkKCcjT3duZXJBbGwnKS52YWwoJzEnKTsgLy8gTmVlZGVkPyBXaHk/CiAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3RW1haWxUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnT3duZXJBbGwnLCBbJ05ld1VzZXJJRCddLCBmdW5jdGlvbigpIHsKICAgICAgICAkKCcjTmV3VXNlcklEJykuZm9jdXMoKTsKICAgIH0pOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6T3duZXJTZWxlY3Rpb24gLS0+Cgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZVNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdSZXNwb25zaWJsZUlEIj4kVGV4dHsiUmVzcG9uc2libGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlJlc3BvbnNpYmxlT3B0aW9uU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJSZXNwb25zaWJsZVNlbGVjdGlvbkdldEFsbCIgY2xhc3M9IkdldEFsbEFKQVgiIHRpdGxlPSIkVGV4dHsiR2V0IGFsbCJ9Ij4kVGV4dHsiR2V0IGFsbCJ9PC9hPgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjUmVzcG9uc2libGVTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgJCgnI1Jlc3BvbnNpYmxlQWxsJykudmFsKCcxJyk7IC8vIE5lZWRlZD8gV2h5PwogICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld0VtYWlsVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ1Jlc3BvbnNpYmxlQWxsJywgWydOZXdSZXNwb25zaWJsZUlEJ10sIGZ1bmN0aW9uKCkgewogICAgICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuZm9jdXMoKTsKICAgIH0pOwogICAgcmV0dXJuIGZhbHNlOwp9KTsKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb24gLS0+Cgo8IS0tIGR0bDpibG9jazpPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlZhbHVlIn0KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IkVycm9yIj4kUURhdGF7IkludmFsaWQifTwvcD4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbiAtLT4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iU3ViamVjdCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IlN1YmplY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJWYWxpZGF0ZV9SZXF1aXJlZCAkUURhdGF7IlN1YmplY3RJbnZhbGlkIn0gVzc1cGMgIiBuYW1lPSJTdWJqZWN0IiBpZD0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUaWNrZXRPcHRpb25zIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiT3B0aW9ucyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNCZWdpbiAtLT4KCjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25TcGVsbENoZWNrIj5bICRUZXh0eyJTcGVsbCBjaGVjayJ9IF08L2E+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CjwhLS0gZHRsOmJsb2NrOkFkZHJlc3NCb29rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIjIiBpZD0iT3B0aW9uQWRkcmVzc0Jvb2siPlsgJFRleHR7IkFkZHJlc3MgYm9vayJ9IF08L2E+CjwhLS0gZHRsOmJsb2NrOkFkZHJlc3NCb29rIC0tPgo8IS0tIGR0bDpibG9jazpPcHRpb25DdXN0b21lciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvbkN1c3RvbWVyIj5bICRUZXh0eyJDdXN0b21lciJ9IF08L2E+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbkN1c3RvbWVyIC0tPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudExpbmtPYmplY3Q7TW9kZT1UZW1wb3Jhcnk7U291cmNlT2JqZWN0PVRpY2tldDtTb3VyY2VLZXk9JExRRGF0YXsiRm9ybUlEIn07VGFyZ2V0SWRlbnRpZmllcj1JVFNNQ29uZmlnSXRlbSIgaWQ9Ik9wdGlvbkxpbmtUaWNrZXQiIGNsYXNzPSJBc1BvcHVwIj5bICRUZXh0eyJMaW5rIHRpY2tldCJ9IF08L2E+CiMgLS0tCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0VuZCAtLT4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRPcHRpb25zIC0tPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX05vVGlja2V0T3B0aW9uc0ZhbGxiYWNrIC0tPgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IlRleHQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgoKPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgoKICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IFZhbGlkYXRlX1JlcXVpcmVkICRRRGF0YXsiQm9keUludmFsaWQifSIgbmFtZT0iQm9keSIgdGl0bGU9Ik1lc3NhZ2UgYm9keSIgcm93cz0iMTUiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhRW1haWwifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNpZ25hdHVyZSI+JFRleHR7IlNpZ25hdHVyZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmljaFRleHRGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlNpZ25hdHVyZSIgdmFsdWU9IiRRRGF0YXsiU2lnbmF0dXJlIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBoZWlnaHQ9IjE0MCIgd2lkdGg9IjYyMCIgZnJhbWVib3JkZXI9IjAiIGlkPSJTaWduYXR1cmUiIGNsYXNzPSJTaWduYXR1cmUiIHNyYz0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj0kRW52eyJBY3Rpb24ifTtTdWJhY3Rpb249U2lnbmF0dXJlO1F1ZXVlSUQ9JFFEYXRheyJRdWV1ZUlEIn0iPjwvaWZyYW1lPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJBdHRhY2htZW50In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KCjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGaWxlbmFtZSJ9ICgkUURhdGF7IkZpbGVzaXplIn0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiIGlkPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgbmFtZT0iQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0iIHZhbHVlPSIkVGV4dHsiRGVsZXRlIn0iPiRUZXh0eyJEZWxldGUifTwvYnV0dG9uPgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0F0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9JykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCQoJyNBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifScpLmNsb3Nlc3QoJ2Zvcm0nKSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGlkPSJGaWxlVXBsb2FkIiBuYW1lPSJGaWxlVXBsb2FkIiB0eXBlPSJmaWxlIiBzaXplPSI0MCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0iQXR0YWNobWVudFVwbG9hZCIgbmFtZT0iQXR0YWNobWVudFVwbG9hZCIgdmFsdWU9IjAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjRmlsZVVwbG9hZCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uICgpIHsKICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICRGb3JtLmZpbmQoJyNBdHRhY2htZW50VXBsb2FkJykudmFsKCcxJykuZW5kKCkuc3VibWl0KCk7Cn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21lcklEIj4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ3VzdG9tZXJJRCIgaWQ9IkN1c3RvbWVySUQiIHZhbHVlPSIkUURhdGF7IkN1c3RvbWVySUQifSIgY2xhc3M9Ilc1MHBjIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXh0U3RhdGVJRCI+JFRleHR7Ik5leHQgdGlja2V0IHN0YXRlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJOZXh0U3RhdGVzU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlBlbmRpbmcgRGF0ZSJ9ICgkVGV4dHsiZm9yIHBlbmRpbmcqIHN0YXRlcyJ9KTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlBlbmRpbmdEYXRlU3RyaW5nIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGF5U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiRGF0ZSBpbnZhbGlkISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiRGF0ZSBpbnZhbGlkISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUHJpb3JpdHlJRCI+JFRleHR7IlByaW9yaXR5In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJQcmlvcml0eVN0cmcifQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQifQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRpY2tldEZyZWVUZXh0RmllbGQifQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCB0aWNrZXQgZnJlZXRleHQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDIifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KCjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRpbWUifQogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaWNrZXRGcmVlVGltZSREYXRheyJDb3VudCJ9VXNlZEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KCiMgZXhhbXBsZSBvZiBob3cgdG8gdXNlIGZpeGVkIHRpY2tldCBmcmVldGltZSBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JERhdGF7IlRpY2tldEZyZWVUaW1lS2V5MSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRpY2tldEZyZWVUaW1lMSJ9CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkyIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgoKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkIn0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZCJ9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBhcnRpY2xlIGZyZWV0ZXh0IGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9CiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn0KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn0KIyAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+Cgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNMYWJlbCAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaW1lVW5pdHMiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L2xhYmVsPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNMYWJlbCAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzTGFiZWxNYW5kYXRvcnkgLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iVGltZVVuaXRzIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiAkVGV4dHsiVGltZSB1bml0cyJ9JFRleHR7IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRpbWVVbml0cyJ9In06PC9sYWJlbD4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzTGFiZWxNYW5kYXRvcnkgLS0+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0cyAtLT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBjbGFzcz0iVzI1cGMgVmFsaWRhdGVfVGltZVVuaXRzICRRRGF0YXsiVGltZVVuaXRzUmVxdWlyZWQifSAkUURhdGF7IlRpbWVVbml0c0ludmFsaWQifSIgbmFtZT0iVGltZVVuaXRzIiBpZD0iVGltZVVuaXRzIiB2YWx1ZT0iJFFEYXRheyJUaW1lVW5pdHMifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJJbnZhbGlkIHRpbWUhIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIFNwYWNpbmdUb3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IiRUZXh0eyJTZW5kIG1haWwhIn0gKGcpIiB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkVGV4dHsiU2VuZCBtYWlsISJ9IiA+JFRleHR7IlNlbmQgbWFpbCEifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJDdXN0b21lclRpY2tldHMiPjwvZGl2Pgo8L2Rpdj4KCjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCkNvcmUuQWdlbnQuVGlja2V0QWN0aW9uLkluaXQoKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7IENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCAkKHRoaXMpLmF0dHIoJ2hyZWYnKSwgJ0FjdGlvbicpOyByZXR1cm4gZmFsc2U7IH0gKTsKIyAtLS0KLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgoKIyBleGFtcGxlIHRlbXBsYXRlIGZvcm0gZm9yIGN1c3RvbWl6YXRpb25zCiM8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIGlkPSJUZW1wbGF0ZTEiPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRFbnZ7IkFjdGlvbiJ9Ii8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU3RvcmVOZXciLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kQ3VzdG9tZXJOYW1lIiB2YWx1ZT0iMiIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmplY3QiIHZhbHVlPSJFeGFtcGxlIFN1YmplY3QiLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJCb2R5IiB2YWx1ZT0iTmFtZToKI1Byb2R1Y3Q6CiNDb21tZW50OiIvPgojPC9mb3JtPgo=
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0uZHRsIC0gcHJvdmlkZXMgSFRNTCBUaWNrZXQgT3ZlcnZpZXcKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0uZHRsLHYgMS4xMiAyMDEwLzEyLzEwIDE2OjQyOjU3IGVuIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtLmR0bCx2IDEuNTggMjAxMC8xMi8wOSAxMzo1OTozMSBtbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpEb2N1bWVudEFjdGlvblJvdyAtLT4KPHVsIGNsYXNzPSJBY3Rpb25zIj4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRBY3Rpb25Sb3dCdWxrIC0tPgogICAgPGxpIGNsYXNzPSJCdWxrIj4KICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iQXV0b2NvbXBsZXRlT2ZmIiB0aXRsZT0iJFRleHR7IlNlbGVjdCBhbGwifSIgaWQ9IlNlbGVjdEFsbFRpY2tldHMiIC8+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iSW52aXNpYmxlVGV4dCIgZm9yPSJTZWxlY3RBbGxUaWNrZXRzIj4kVGV4dHsiU2VsZWN0IGFsbCJ9PC9sYWJlbD4KICAgICAgICA8L3NwYW4+CiAgICA8L2xpPgogICAgPGxpIGlkPSJCdWxrQWN0aW9uIiBjbGFzcz0iQnVsayBJbmFjdGl2ZSAkUURhdGF7IkNTUyJ9Ij4KICAgICAgICA8YSBocmVmPSIjIj4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgogICAgPC9saT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRBY3Rpb25Sb3dCdWxrIC0tPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEFjdGlvblJvd0l0ZW0gLS0+CiAgICA8bGkgY2xhc3M9IiRRRGF0YXsiQ1NTIn0iPjxhIGhyZWY9IiMiPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In08L2E+PC9saT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRBY3Rpb25Sb3dJdGVtIC0tPgo8L3VsPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEFjdGlvblJvdyAtLT4KCjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50SGVhZGVyIC0tPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkFjdGlvblJvdy5Jbml0KCk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8dWwgaWQ9IlRpY2tldE92ZXJ2aWV3TWVkaXVtIiBjbGFzcz0iT3ZlcnZpZXcgT3ZlcnZpZXdNZWRpdW0iPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEhlYWRlciAtLT4KCjwhLS0gZHRsOmJsb2NrOk5vVGlja2V0Rm91bmQgLS0+CiAgICA8bGkgaWQ9IkVtcHR5TWVzc2FnZU1lZGl1bSI+CiAgICAgICAgJFRleHR7Ik5vIHRpY2tldCBkYXRhIGZvdW5kLiJ9CiAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpOb1RpY2tldEZvdW5kIC0tPgoKPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRDb250ZW50IC0tPgogICAgPGxpIGlkPSJUaWNrZXRJRF8kUURhdGF7IlRpY2tldElEIn0iIGNsYXNzPSJNYXN0ZXJBY3Rpb24iPgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgo8IS0tIGR0bDpibG9jazpJbmxpbmVBY3Rpb25Sb3cgLS0+CiAgICAgICAgICAgIDx1bCBjbGFzcz0iQWN0aW9ucyBJbmxpbmVBY3Rpb25zIj4KPCEtLSBkdGw6YmxvY2s6SW5saW5lQWN0aW9uUm93SXRlbSAtLT4KICAgICAgICAgICAgICAgIDxsaT48YSBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9IiBocmVmPSIkUURhdGF7IkxpbmsifSIgdGl0bGU9IiRRRGF0YXsiRGVzY3JpcHRpb24ifSI+JFFEYXRheyJOYW1lIn08L2E+PC9saT4KPCEtLSBkdGw6YmxvY2s6SW5saW5lQWN0aW9uUm93SXRlbSAtLT4KPCEtLSBkdGw6YmxvY2s6SW5saW5lQWN0aW9uUm93SXRlbUhUTUwgLS0+CiAgICAgICAgICAgICAgICAkRGF0YXsiSFRNTCJ9CjwhLS0gZHRsOmJsb2NrOklubGluZUFjdGlvblJvd0l0ZW1IVE1MIC0tPgogICAgICAgICAgICA8L3VsPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAvLyBTaG93cyBJbmxpbmVBY3Rpb25Sb3cgb24gaG92ZXIKICAgICQoJy5PdmVydmlld01lZGl1bSA+IGxpJykuYmluZCgnbW91c2VlbnRlcicsIGZ1bmN0aW9uKCkgewogICAgICAgICQodGhpcykuZmluZCgndWwuSW5saW5lQWN0aW9ucycpLnNob3coKTsKICAgIH0pLmJpbmQoJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmZpbmQoJ3VsLklubGluZUFjdGlvbnMnKS5oaWRlKCk7CiAgICB9KTsKCiAgICAvLyBGaXggZm9yIElFOiBIb3ZlcmluZyB0aGUgb3B0aW9ucyBvZiB0aGUgc2VsZWN0IHRyaWdnZXJzIGEgbW91c2VsZWF2ZSBvZiB0aGUgbGksIHNvIHdlIGhhdmUgdG8gc3RvcCB0aGUgZXZlbnQgcHJvcGFnYXRpb24KICAgICQoJy5PdmVydmlld01lZGl1bSA+IGxpIHVsLklubGluZUFjdGlvbnMgbGkgZm9ybSBzZWxlY3QnKS5iaW5kKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9KTsKCiAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9uIGNsaWNrIG9uIGEgcGFydCBvZiB0aGUgSW5saWVuQWN0aW9uUm93IHdpdGhvdXQgYSBsaW5rCiAgICAvLyBPdGhlcndpc2UgdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZSBsaS13aWRlIGxpbmsgdG8gdGhlIHRpY2tldHpvb20KICAgICQoJ3VsLklubGluZUFjdGlvbnMnKS5jbGljayhmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgICAgIGlmIChFdmVudC5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpJbmxpbmVBY3Rpb25Sb3cgLS0+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3ggQXV0b2NvbXBsZXRlT2ZmIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iIC8+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CjwhLS0gZHRsOmJsb2NrOk1ldGEgLS0+CjwhLS0gZHRsOmJsb2NrOk1ldGFJY29uIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSIkUURhdGF7IkNsYXNzIn0iIHRpdGxlPSIkVGV4dHsiJERhdGF7IlRpdGxlIn0ifSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iJFFEYXRheyJDbGFzc1NwYW4ifSI+JFRleHR7IiREYXRheyJUaXRsZSJ9In08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpNZXRhSWNvbiAtLT4KPCEtLSBkdGw6YmxvY2s6TWV0YSAtLT4KICAgICAgICAgICAgPGgyPgogICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JExRRGF0YXsiVGlja2V0SUQifSIgY2xhc3M9Ik1hc3RlckFjdGlvbkxpbmsiPiRDb25maWd7IlRpY2tldDo6SG9vayJ9OiAkRGF0YXsiVGlja2V0TnVtYmVyIn0gJm5kYXNoOyAkUURhdGF7IlRpdGxlIiwiODAifTwvYT4KICAgICAgICAgICAgPC9oMj4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gdGl0bGU9IiRUZXh0eyIkRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgICAgICAgPHRhYmxlIGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZyb20ifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJGcm9tIn0iPiRRRGF0YXsiRnJvbVJlYWxuYW1lIiwiODAifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkFnZSJ9PC9sYWJlbD4kUURhdGF7IkFnZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiUXVldWUifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJRdWV1ZSJ9Ij4kUURhdGF7IlF1ZXVlIiwiMjYifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkN1c3RvbWVySUQifTwvbGFiZWw+PGEgaHJlZj0iJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmsifSIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmtUYXJnZXQifT4kUURhdGF7IkN1c3RvbWVySUQiLCAiMjYifTwvYT48YnIgLz48ZGl2IHRpdGxlPSIkUURhdGF7IkN1c3RvbWVyTmFtZSJ9Ij4kUURhdGF7IkN1c3RvbWVyTmFtZSIsIjE1In08L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRRRGF0YXsiVGlja2V0RnJlZUtleTEiLCIyNSJ9PC9sYWJlbD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4xIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIn0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjUifTwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsxIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIn0iPjxhIGhyZWY9IiRDb25maWd7IlRpY2tldEZyZWVUZXh0TGluazEifSIgdGFyZ2V0PSJfYmxhbmsiPiRRRGF0YXsiVGlja2V0RnJlZVRleHQxIiwiMjUifTwvYT48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiRmlyc3QgUmVzcG9uc2UgVGltZSJ9PC9sYWJlbD4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSJ9IiBjbGFzcz0iJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZUNsYXNzIn0iPiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlVwZGF0ZSBUaW1lIn08L2xhYmVsPgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9IiBjbGFzcz0iJFFEYXRheyJVcGRhdGVUaW1lQ2xhc3MifSI+JFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifSAvICRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJTb2x1dGlvbiBUaW1lIn08L2xhYmVsPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSIgY2xhc3M9IiRRRGF0YXsiU29sdXRpb25UaW1lQ2xhc3MifSI+JFFEYXRheyJTb2x1dGlvblRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJTb2x1dGlvblRpbWVEZXN0aW5hdGlvbkRhdGUifSJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJUbyJ9PC9sYWJlbD48ZGl2IHRpdGxlPSIkUURhdGF7IlRvIn0iPiRRRGF0YXsiVG9SZWFsbmFtZSIsIjgwIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJDcmVhdGVkIn08L2xhYmVsPiRUaW1lTG9uZ3siJERhdGF7IkNyZWF0ZWQifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiU3RhdGUifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9IiwiMjYifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlR5cGUifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJUeXBlIn0iPiRRRGF0YXsiVHlwZSIsIjI2In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiUHJpb3JpdHkifTo8L2xhYmVsPjxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSIsIjE0In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFFEYXRheyJUaWNrZXRGcmVlS2V5MiIsIjI1In08L2xhYmVsPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMiAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMiJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9hPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMiAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTIifSJ9PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJVcGRhdGUgVGltZSJ9PC9sYWJlbD4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9IiBjbGFzcz0iJFFEYXRheyJVcGRhdGVUaW1lQ2xhc3MifSI+JFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifSAvICRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQogICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlN1YmplY3QifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJTdWJqZWN0In0iPiRRRGF0YXsiU3ViamVjdCIsIjgwIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJPd25lciJ9PC9sYWJlbD48ZGl2IHRpdGxlPSIkUURhdGF7IlVzZXJGaXJzdG5hbWUifSAkUURhdGF7IlVzZXJMYXN0bmFtZSJ9ICgkUURhdGF7Ik93bmVyIn0pIj4kUURhdGF7IlVzZXJGaXJzdG5hbWUiLCIxNSJ9ICRRRGF0YXsiVXNlckxhc3RuYW1lIiwiMTUifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkxvY2sifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkxvY2sifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSIsIjI2In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJTZXJ2aWNlIn08L2xhYmVsPjxkaXYgdGl0bGU9IiRRRGF0YXsiU2VydmljZSJ9Ij4kUURhdGF7IlNlcnZpY2UiLCIyNiJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiU2VydmljZSBMZXZlbCBBZ3JlZW1lbnQifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJTTEEifSI+JFFEYXRheyJTTEEiLCIyNiJ9PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ3VzdG9tZXJJRCJ9PC9sYWJlbD48YSBocmVmPSIkQ29uZmlneyJDdXN0b21lckRCTGluayJ9IiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiAkQ29uZmlneyJDdXN0b21lckRCTGlua1RhcmdldCJ9PiRRRGF0YXsiQ3VzdG9tZXJJRCIsICIyNiJ9PC9hPjxiciAvPjxkaXYgdGl0bGU9IiRRRGF0YXsiQ3VzdG9tZXJOYW1lIn0iPiRRRGF0YXsiQ3VzdG9tZXJOYW1lIiwiMTUifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQzIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kUURhdGF7IlRpY2tldEZyZWVLZXkzIiwiMjUifTwvbGFiZWw+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMyAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MyJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MyIsIjI1In08L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4zIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMyAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MyJ9Ij48YSBocmVmPSIkQ29uZmlneyJUaWNrZXRGcmVlVGV4dExpbmszIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0MyIsIjI1In08L2E+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmszIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQzIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMyAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MyJ9In08L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUzIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTMifSJ9PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTMgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlNvbHV0aW9uIFRpbWUifTwvbGFiZWw+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIn0iIGNsYXNzPSIkUURhdGF7IlNvbHV0aW9uVGltZUNsYXNzIn0iPiRRRGF0YXsiU29sdXRpb25UaW1lSHVtYW4ifSAvICRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2PgojPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iU2hhZG93Ij48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgIDwvbGk+Cgo8IS0tIGR0bDpibG9jazpEb2N1bWVudENvbnRlbnQgLS0+Cgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEZvb3RlciAtLT4KPC91bD4KCjxmb3JtIG5hbWU9ImJ1bGsiIGFjdGlvbj0iIj4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwvZm9ybT4KCjxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0ibWF0cml4Ij4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0QnVsayIvPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEZvb3RlckJ1bGtJdGVtIC0tPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIiLz4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRGb290ZXJCdWxrSXRlbSAtLT4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRGb290ZXIgLS0+Cgo8IS0tIGR0bDpibG9jazpEb2N1bWVudE1lbnVJdGVtIC0tPgo8bGkgaWQ9IiRRRGF0YXsiSUQifSI+CiAgICA8YSBocmVmPSIjIiB0aXRsZT0iJFRleHR7IiREYXRheyJEZXNjcmlwdGlvbiJ9In0iPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In08L2E+CjwvbGk+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50TWVudUl0ZW0gLS0+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50TWVudUl0ZW1Nb3ZlRm9ybSAtLT4KPGxpIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0iPgogICAgPGZvcm0gdGl0bGU9IiRUZXh0eyJNb3ZlIHRpY2tldCB0byBhIGRpZmZlcmVudCBxdWV1ZSJ9IiBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0TW92ZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlF1ZXVlSUQiIHZhbHVlPSIkUURhdGF7IlF1ZXVlSUQifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij4kVGV4dHsiQ2hhbmdlIHF1ZXVlIn06PC9sYWJlbD4KICAgICAgICAkRGF0YXsiTW92ZVF1ZXVlc1N0cmcifQogICAgPC9mb3JtPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCdzZWxlY3RbbmFtZT1EZXN0UXVldWVJRF0nKS5saXZlKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPC9saT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIC0tPgoKPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuQWRkQWN0aW9ucygkKCcjVGlja2V0SURfJFFEYXRheyJUaWNrZXRJRCJ9JyksICREYXRheyJEYXRhIn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkIC0tPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudFJlYWR5U3RhcnQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5TdGF0aWNUYWJsZUNvbnRyb2woJCgnI092ZXJ2aWV3Q29udHJvbCcpKTsKICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKS5hdHRyKCdocmVmJyk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRSZWFkeVN0YXJ0IC0tPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KCjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyIE1hdGNoZXMsCiAgICAgICAgICAgIFBvcHVwVHlwZSA9ICdUaWNrZXRBY3Rpb24nOwoKICAgICAgICBNYXRjaGVzID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpLm1hdGNoKC9Qb3B1cFR5cGVfKFx3KykvKTsKICAgICAgICBpZiAoTWF0Y2hlcykgewogICAgICAgICAgICBQb3B1cFR5cGUgPSBNYXRjaGVzWzFdOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksIFBvcHVwVHlwZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3LmR0bCAtIHByb3ZpZGVzIEhUTUwgVGlja2V0IE92ZXJ2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldy5kdGwsdiAxLjEzIDIwMTAvMTIvMTAgMTY6NDI6NTcgZW4gRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3LmR0bCx2IDEuNjUgMjAxMC8xMi8wOSAxMzo1OTozMSBtbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8IS0tIGR0bDpibG9jazpEb2N1bWVudEFjdGlvblJvdyAtLT4KPHVsIGNsYXNzPSJBY3Rpb25zIj4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRBY3Rpb25Sb3dCdWxrIC0tPgogICAgPGxpIGNsYXNzPSJCdWxrIj4KICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImNoZWNrYm94IiBjbGFzcz0iQXV0b2NvbXBsZXRlT2ZmIiB0aXRsZT0iJFRleHR7IlNlbGVjdCBhbGwifSIgaWQ9IlNlbGVjdEFsbFRpY2tldHMiIC8+CiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iSW52aXNpYmxlVGV4dCIgZm9yPSJTZWxlY3RBbGxUaWNrZXRzIj4kVGV4dHsiU2VsZWN0IGFsbCJ9PC9sYWJlbD4KICAgICAgICA8L3NwYW4+CiAgICA8L2xpPgogICAgPGxpIGlkPSJCdWxrQWN0aW9uIiBjbGFzcz0iQnVsayBJbmFjdGl2ZSAkUURhdGF7IkNTUyJ9Ij4KICAgICAgICA8YSBocmVmPSIjIj4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgogICAgPC9saT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRBY3Rpb25Sb3dCdWxrIC0tPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEFjdGlvblJvd0l0ZW0gLS0+CiAgICA8bGkgY2xhc3M9IiRRRGF0YXsiQ1NTIn0iPjxhIGhyZWY9IiMiPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In08L2E+PC9saT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRBY3Rpb25Sb3dJdGVtIC0tPgo8L3VsPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEFjdGlvblJvdyAtLT4KCjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50SGVhZGVyIC0tPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLlVJLkFjdGlvblJvdy5Jbml0KCk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8dWwgaWQ9IlRpY2tldE92ZXJ2aWV3TGFyZ2UiIGNsYXNzPSJPdmVydmlldyBPdmVydmlld0xhcmdlICRRRGF0YXsiQ2xhc3MifSI+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50SGVhZGVyIC0tPgoKPCEtLSBkdGw6YmxvY2s6Tm9UaWNrZXRGb3VuZCAtLT4KICAgIDxsaSBpZD0iRW1wdHlNZXNzYWdlTGFyZ2UiPgogICAgICAgICRUZXh0eyJObyB0aWNrZXQgZGF0YSBmb3VuZC4ifQogICAgPC9saT4KPCEtLSBkdGw6YmxvY2s6Tm9UaWNrZXRGb3VuZCAtLT4KCjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50Q29udGVudCAtLT4KICAgIDxsaSBpZD0iVGlja2V0SURfJFFEYXRheyJUaWNrZXRJRCJ9IiBjbGFzcz0iTWFzdGVyQWN0aW9uIj4KICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50ICRRRGF0YXsiQWRkaXRpb25hbENsYXNzZXMifSI+CjwhLS0gZHRsOmJsb2NrOklubGluZUFjdGlvblJvdyAtLT4KICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIElubGluZUFjdGlvbnMiPgo8IS0tIGR0bDpibG9jazpJbmxpbmVBY3Rpb25Sb3dJdGVtIC0tPgogICAgICAgICAgICAgICAgPGxpPjxhIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0iIGhyZWY9IiRRRGF0YXsiTGluayJ9IiB0aXRsZT0iJFFEYXRheyJEZXNjcmlwdGlvbiJ9Ij4kUURhdGF7Ik5hbWUifTwvYT48L2xpPgo8IS0tIGR0bDpibG9jazpJbmxpbmVBY3Rpb25Sb3dJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCAtLT4KICAgICAgICAgICAgICAgICREYXRheyJIVE1MIn0KPCEtLSBkdGw6YmxvY2s6SW5saW5lQWN0aW9uUm93SXRlbUhUTUwgLS0+CiAgICAgICAgICAgIDwvdWw+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIC8vIFNob3dzIElubGluZUFjdGlvblJvdyBvbiBob3ZlcgogICAgJCgnLk92ZXJ2aWV3TGFyZ2UgPiBsaScpLmJpbmQoJ21vdXNlZW50ZXInLCBmdW5jdGlvbigpIHsKICAgICAgICAkKHRoaXMpLmZpbmQoJ3VsLklubGluZUFjdGlvbnMnKS5zaG93KCk7CiAgICB9KS5iaW5kKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgJCh0aGlzKS5maW5kKCd1bC5JbmxpbmVBY3Rpb25zJykuaGlkZSgpOwogICAgfSk7CgogICAgLy8gRml4IGZvciBJRTogSG92ZXJpbmcgdGhlIG9wdGlvbnMgb2YgdGhlIHNlbGVjdCB0cmlnZ2VycyBhIG1vdXNlbGVhdmUgb2YgdGhlIGxpLCBzbyB3ZSBoYXZlIHRvIHN0b3AgdGhlIGV2ZW50IHByb3BhZ2F0aW9uCiAgICAkKCcuT3ZlcnZpZXdMYXJnZSA+IGxpIHVsLklubGluZUFjdGlvbnMgbGkgZm9ybSBzZWxlY3QnKS5iaW5kKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICB9KTsKCiAgICAvLyBTdG9wIHByb3BhZ2F0aW9uIG9uIGNsaWNrIG9uIGEgcGFydCBvZiB0aGUgSW5saWVuQWN0aW9uUm93IHdpdGhvdXQgYSBsaW5rCiAgICAvLyBPdGhlcndpc2UgdGhhdCB3b3VsZCB0cmlnZ2VyIHRoZSBsaS13aWRlIGxpbmsgdG8gdGhlIHRpY2tldHpvb20KICAgICQoJ3VsLklubGluZUFjdGlvbnMnKS5jbGljayhmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOwogICAgICAgIGlmIChFdmVudC5zdG9wUHJvcGFnYXRpb24pIHsKICAgICAgICAgICAgRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpJbmxpbmVBY3Rpb25Sb3cgLS0+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CiAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iQ2hlY2tib3ggQXV0b2NvbXBsZXRlT2ZmIiB0eXBlPSJjaGVja2JveCIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iIC8+CjwhLS0gZHRsOmJsb2NrOkJ1bGsgLS0+CjwhLS0gZHRsOmJsb2NrOk1ldGEgLS0+CjwhLS0gZHRsOmJsb2NrOk1ldGFJY29uIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSIkUURhdGF7IkNsYXNzIn0iIHRpdGxlPSIkVGV4dHsiJERhdGF7IlRpdGxlIn0ifSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iJFFEYXRheyJDbGFzc1NwYW4ifSI+JFRleHR7IiREYXRheyJUaXRsZSJ9In08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpNZXRhSWNvbiAtLT4KPCEtLVtpZiBJRSA3XT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iUmVhbGx5U3R1cGlkSUU3SGFjayI+Jm5ic3A7PC9kaXY+CiAgICAgICAgICAgIDwhW2VuZGlmXS0tPgo8IS0tIGR0bDpibG9jazpNZXRhIC0tPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJJbmZvcyI+CiAgICAgICAgICAgICAgICA8aDI+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JExRRGF0YXsiVGlja2V0SUQifSIgdGl0bGU9IiRRRGF0YXsiVGl0bGUiLCI2MCJ9IiBjbGFzcz0iTWFzdGVyQWN0aW9uTGluayI+JENvbmZpZ3siVGlja2V0OjpIb29rIn06ICREYXRheyJUaWNrZXROdW1iZXIifSAmbmRhc2g7ICRRRGF0YXsiVGl0bGUiLCI2MCJ9PC9hPgogICAgICAgICAgICAgICAgPC9oMj4KPCEtLSBkdGw6YmxvY2s6TWVudUl0ZW0gLS0+CiAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9JERhdGF7IkxpbmsifSIgJERhdGF7IkxpbmtQYXJhbSJ9IGNsYXNzPSJtZW51aXRlbSIgdGl0bGU9IiRUZXh0eyIkRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgo8IS0tIGR0bDpibG9jazpNZW51SXRlbSAtLT4KICAgICAgICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkFnZSJ9PC9sYWJlbD4kUURhdGF7IkFnZSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiUXVldWUifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJRdWV1ZSJ9Ij4kUURhdGF7IlF1ZXVlIiwiMjYifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ3JlYXRlZCJ9PC9sYWJlbD4kVGltZUxvbmd7IiREYXRheyJDcmVhdGVkIn0ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlN0YXRlIn08L2xhYmVsPjxkaXYgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSIsIjI2In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlNlcnZpY2UifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJTZXJ2aWNlIn0iPiRRRGF0YXsiU2VydmljZSIsIjI2In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50In08L2xhYmVsPjxkaXYgdGl0bGU9IiRRRGF0YXsiU0xBIn0iPiRRRGF0YXsiU0xBIiwiMjYifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJPd25lciJ9PC9sYWJlbD48ZGl2IHRpdGxlPSIkUURhdGF7IlVzZXJGaXJzdG5hbWUifSAkUURhdGF7IlVzZXJMYXN0bmFtZSJ9ICgkUURhdGF7Ik93bmVyIn0pIj4kUURhdGF7IlVzZXJGaXJzdG5hbWUiLCIxNSJ9ICRRRGF0YXsiVXNlckxhc3RuYW1lIiwiMTUifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkxvY2sifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkxvY2sifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSIsIjI2In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz0iTWlkZGxlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJJRCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkN1c3RvbWVySUQifTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJDdXN0b21lcklEIn0iPjxhIGhyZWY9IiRDb25maWd7IkN1c3RvbWVyREJMaW5rIn0iIGNsYXNzPSJBc1BvcHVwIFBvcHVwVHlwZV9UaWNrZXRBY3Rpb24iICRDb25maWd7IkN1c3RvbWVyREJMaW5rVGFyZ2V0In0+JFFEYXRheyJDdXN0b21lcklEIiwgIjI2In08L2E+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyTmFtZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IkN1c3RvbWVyTmFtZSJ9Ij4kUURhdGF7IkN1c3RvbWVyTmFtZSIsIjE1In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJOYW1lIC0tPgo8IS0tIGR0bDpibG9jazpDdXN0b21lcklEIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJGaXJzdCBSZXNwb25zZSBUaW1lIn08L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZVdvcmtpbmdUaW1lIn0iIGNsYXNzPSIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lQ2xhc3MifSI+JFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZUh1bWFuIn0gLyAkVGltZVNob3J0eyIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlR5cGUifTwvbGFiZWw+PGRpdiB0aXRsZT0iJFFEYXRheyJUeXBlIn0iPiRRRGF0YXsiVHlwZSIsIjE4In08L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJVcGRhdGUgVGltZSJ9PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiVXBkYXRlVGltZVdvcmtpbmdUaW1lIn0iIGNsYXNzPSIkUURhdGF7IlVwZGF0ZVRpbWVDbGFzcyJ9Ij4kUURhdGF7IlVwZGF0ZVRpbWVIdW1hbiJ9IC8gJFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CjwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlNvbHV0aW9uIFRpbWUifTwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlNvbHV0aW9uVGltZVdvcmtpbmdUaW1lIn0iIGNsYXNzPSIkUURhdGF7IlNvbHV0aW9uVGltZUNsYXNzIn0iPiRRRGF0YXsiU29sdXRpb25UaW1lSHVtYW4ifSAvICRUaW1lU2hvcnR7IiRRRGF0YXsiU29sdXRpb25UaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvZGl2Pgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSJNaWRkbGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiQ3JpdGljYWxpdHkifSI+JFRleHR7IiREYXRheyJDcml0aWNhbGl0eSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJJbXBhY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiSW1wYWN0In0iPiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifTwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlByZXZpZXciPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSIkUURhdGF7IkNsYXNzIn0iPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlUHJldmlldyAtLT4KICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIHRpdGxlPSIkUURhdGF7IkZyb20ifSAmbmRhc2g7ICRRRGF0YXsiU3ViamVjdCJ9ICZuZGFzaDsgJFRpbWVTaG9ydHsiJFFEYXRheyJDcmVhdGVkIn0ifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkhlYWRsaW5lIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGcm9tUmVhbG5hbWUiLCI1MCJ9ICZuZGFzaDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlN1YmplY3QiPiRRRGF0YXsiU3ViamVjdCIsIjcwIn08L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEYXRlVGltZSI+JFRpbWVTaG9ydHsiJFFEYXRheyJDcmVhdGVkIn0ifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iQ2xlYXIiPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGlkZGVuQmxvY2siPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlUHJldmlld0FjdGlvblJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3dJdGVtIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybSB0aXRsZT0iJFRleHR7IiREYXRheyJOYW1lIn0ifSIgYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBpZD0iJFFEYXRheyJGb3JtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJFFEYXRheyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZUlEIiB2YWx1ZT0iJFFEYXRheyJBcnRpY2xlSUQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlJlcGx5QWxsIiB2YWx1ZT0iJFFEYXRheyJSZXBseUFsbCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iUmVzcG9uc2VJRCRRRGF0YXsiQXJ0aWNsZUlEIn0iIGNsYXNzPSJJbnZpc2libGVUZXh0Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlN0YW5kYXJkUmVzcG9uc2VzU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjJFFEYXRheyJGb3JtSUQifSBzZWxlY3RbbmFtZT1SZXNwb25zZUlEXScpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHZhciBVUkw7CgogICAgICAgIGlmICgkKHRoaXMpLnZhbCgpID4gMCkgewogICAgICAgICAgICB2YXIgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJCh0aGlzKS5wYXJlbnRzKCkuc2VyaWFsaXplKCk7CiAgICAgICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKFVSTCwgJ1RpY2tldEFjdGlvbicpOwogICAgICAgICAgICAvLyByZXNldCB0aGUgc2VsZWN0IGJveCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFnYWluIGZyb20gdGhlIHNhbWUgd2luZG93CiAgICAgICAgICAgICQodGhpcykudmFsKCcwJyk7CiAgICAgICAgfQogICAgfSk7CiAgICAvLyBtYWtlIHN1cmUgdGhpcyBjbGljayBldmVudCBkb2VzIG5vdCBidWJibGUgdXAgdG8gdGhlIHRhYmxlIHJvdyBhbmQgZXhlY3V0ZSBpdHMgY2xpY2sgaGFuZGxlcgogICAgJCgnIyRRRGF0YXsiRm9ybUlEIn0gc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIEV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyTGVmdCI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KJERhdGF7IkJvZHlOb3RlIn0KJERhdGF7IkJvZHkifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVQcmV2aWV3IC0tPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IlNoYWRvdyI+PC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudENvbnRlbnQgLS0+Cgo8IS0tIGR0bDpibG9jazpEb2N1bWVudEZvb3RlciAtLT4KPC91bD4KCgo8Zm9ybSBuYW1lPSJidWxrIiBhY3Rpb249IiI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+Cgo8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9Im1hdHJpeCI+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJBZ2VudFRpY2tldEJ1bGsiLz4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRGb290ZXJCdWxrSXRlbSAtLT4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iIi8+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50Rm9vdGVyQnVsa0l0ZW0gLS0+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiIvPgo8L2Zvcm0+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50Rm9vdGVyIC0tPgoKPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRNZW51SXRlbSAtLT4KPGxpIGlkPSIkUURhdGF7IklEIn0iPgogICAgPGEgaHJlZj0iIyIgdGl0bGU9IiRUZXh0eyIkRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgo8L2xpPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudE1lbnVJdGVtIC0tPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudE1lbnVJdGVtTW92ZUZvcm0gLS0+CjxsaSBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgIDxmb3JtIHRpdGxlPSIkVGV4dHsiTW92ZSB0aWNrZXQgdG8gYSBkaWZmZXJlbnQgcXVldWUifSIgYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJnZXQiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IkFnZW50VGlja2V0TW92ZSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlF1ZXVlSUQiIHZhbHVlPSIkUURhdGF7IlF1ZXVlSUQifSIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgPGxhYmVsIGZvcj0iRGVzdFF1ZXVlSUQiIGNsYXNzPSJJbnZpc2libGVUZXh0Ij4kVGV4dHsiQ2hhbmdlIHF1ZXVlIn06PC9sYWJlbD4KICAgICAgICAkRGF0YXsiTW92ZVF1ZXVlc1N0cmcifQogICAgPC9mb3JtPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCdzZWxlY3RbbmFtZT1EZXN0UXVldWVJRF0nKS5saXZlKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPC9saT4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRNZW51SXRlbU1vdmVGb3JtIC0tPgoKPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOkRvY3VtZW50UmVhZHlBY3Rpb25Sb3dBZGQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5BY3Rpb25Sb3cuQWRkQWN0aW9ucygkKCcjVGlja2V0SURfJFFEYXRheyJUaWNrZXRJRCJ9JyksICREYXRheyJEYXRhIn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkIC0tPgo8IS0tIGR0bDpibG9jazpEb2N1bWVudFJlYWR5U3RhcnQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5VSS5TdGF0aWNUYWJsZUNvbnRyb2woJCgnI092ZXJ2aWV3Q29udHJvbCcpKTsKICAgICQoJy5NYXN0ZXJBY3Rpb24nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuZmluZCgnLk1hc3RlckFjdGlvbkxpbmsnKS5hdHRyKCdocmVmJyk7CiAgICB9KTsKICAgIENvcmUuVUkuQWNjb3JkaW9uLkluaXQoJCgnLlByZXZpZXcgPiB1bCcpLCAnbGkgaDMgYScsICcuSGlkZGVuQmxvY2snKTsKLy9dXT48L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6RG9jdW1lbnRSZWFkeVN0YXJ0IC0tPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KCjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJ2EuQXNQb3B1cCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyIE1hdGNoZXMsCiAgICAgICAgICAgIFBvcHVwVHlwZSA9ICdUaWNrZXRBY3Rpb24nOwoKICAgICAgICBNYXRjaGVzID0gJCh0aGlzKS5hdHRyKCdjbGFzcycpLm1hdGNoKC9Qb3B1cFR5cGVfKFx3KykvKTsKICAgICAgICBpZiAoTWF0Y2hlcykgewogICAgICAgICAgICBQb3B1cFR5cGUgPSBNYXRjaGVzWzFdOwogICAgICAgIH0KCiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksIFBvcHVwVHlwZSk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0UGhvbmUuZHRsIC0gcHJvdmlkZXMgSFRNTCBmb3JtIGZvciBwaG9uZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRUaWNrZXRQaG9uZS5kdGwsdiAxLjIzIDIwMTAvMTIvMjEgMjE6NTE6MjggdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0UGhvbmUuZHRsLHYgMS4xMjcgMjAxMC8xMi8yMSAxODoyMDo1OSBjZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKJEluY2x1ZGV7IkFnZW50Q3VzdG9tZXJTZWFyY2gifQo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiI+CgogICAgPGgxPiRUZXh0eyJDcmVhdGUgTmV3IFBob25lIFRpY2tldCJ9PC9oMT4KCiAgICA8ZGl2IGNsYXNzPSJMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgo8IS0tIGR0bDpibG9jazpDdXN0b21lclRhYmxlIC0tPgogICAgICAgIDxkaXYgaWQ9IkN1c3RvbWVySW5mbyIgY2xhc3M9IlNpZGViYXJDb2x1bW4gV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiQ3VzdG9tZXIgSW5mb3JtYXRpb24ifTwvaDI+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICREYXRheyJDdXN0b21lclRhYmxlIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIG5hbWU9ImNvbXBvc2UiIGlkPSJOZXdQaG9uZVRpY2tldCIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlTmV3Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIGlkPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIwIi8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iSW1wYWN0UkMiIHZhbHVlPSIwIi8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iT3duZXJBbGwiIGlkPSJPd25lckFsbCIgdmFsdWU9IiRRRGF0YXsiT3duZXJBbGwifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUmVzcG9uc2libGVBbGwiIGlkPSJSZXNwb25zaWJsZUFsbCIgdmFsdWU9IiRRRGF0YXsiUmVzcG9uc2libGVBbGwifSIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iUHJlU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJQcmVTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiIvPgogICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU2VsZWN0ZWRDdXN0b21lclVzZXIiIGlkPSJTZWxlY3RlZEN1c3RvbWVyVXNlciIgdmFsdWU9IiRRRGF0YXsiQ3VzdG9tZXJVc2VyIn0iLz4KICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJMaW5rVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IkxpbmtUaWNrZXRJRCJ9Ii8+CgogICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgoKIyBleGFtcGxlIHRlbXBsYXRlIGZvciBjdXN0b21pemF0aW9ucywgc2VlIGhpZGRlbiBmb3JtIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKIyAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJUZW1wbGF0ZXMifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgb25jbGljaz0iJCgnI1RlbXBsYXRlMScpLnN1Ym1pdCgpIiB2YWx1ZT0iJFRleHR7IkV4YW1wbGUgVGVtcGxhdGUifSI+JFRleHR7IkV4YW1wbGUgVGVtcGxhdGUifTwvYnV0dG9uPgojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IlR5cGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlR5cGVTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVHlwZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNUeXBlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnVHlwZUlEJywgWydOZXdVc2VySUQnLCAnTmV3UmVzcG9uc2libGVJRCcsICdOZXh0U3RhdGVJRCcsICdQcmlvcml0eUlEJywgJ1NlcnZpY2VJRCcsICdTTEFJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUaWNrZXRGcmVlVGV4dDEnLCAnVGlja2V0RnJlZVRleHQyJywgJ1RpY2tldEZyZWVUZXh0MycsICdUaWNrZXRGcmVlVGV4dDQnLCAnVGlja2V0RnJlZVRleHQ1JywgJ1RpY2tldEZyZWVUZXh0NicsICdUaWNrZXRGcmVlVGV4dDcnLCAnVGlja2V0RnJlZVRleHQ4JywgJ1RpY2tldEZyZWVUZXh0OScsICdUaWNrZXRGcmVlVGV4dDEwJywgJ1RpY2tldEZyZWVUZXh0MTEnLCAnVGlja2V0RnJlZVRleHQxMicsICdUaWNrZXRGcmVlVGV4dDEzJywgJ1RpY2tldEZyZWVUZXh0MTQnLCAnVGlja2V0RnJlZVRleHQxNScsICdUaWNrZXRGcmVlVGV4dDE2JywgJ1RvJywgJ0NjJywgJ0JjYyddKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJDdXN0b21lckF1dG9Db21wbGV0ZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IkZyb20gY3VzdG9tZXIifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iQ3VzdG9tZXJBdXRvQ29tcGxldGUiIHR5cGU9InRleHQiIG5hbWU9IkZyb20iIHZhbHVlPSIkUURhdGF7IkZyb20ifSIgY2xhc3M9Ilc3NXBjIEF1dG9jb21wbGV0ZU9mZiBWYWxpZGF0ZV9SZXF1aXJlZCAkUURhdGF7IkZyb21JbnZhbGlkIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iQ3VzdG9tZXJBdXRvQ29tcGxldGVFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJDdXN0b21lckF1dG9Db21wbGV0ZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CjwhLS0gZHRsOmJsb2NrOkdlbmVyaWNTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPgo8IS0tIGR0bDpibG9jazpHZW5lcmljU2VydmVyRXJyb3JNc2cgLS0+CjwhLS0gZHRsOmJsb2NrOkVtYWlsSW52YWxpZENvbmZpZ1NlcnZlckVycm9yTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZW1haWwgYWRkcmVzcyBpcyBub3QgYWxsb3dlZCBkdWUgdG8gdGhlIHN5c3RlbSBjb25maWd1cmF0aW9uLiJ9PC9wPgo8IS0tIGR0bDpibG9jazpFbWFpbEludmFsaWRDb25maWdTZXJ2ZXJFcnJvck1zZyAtLT4KPCEtLSBkdGw6YmxvY2s6RW1haWxJbnZhbGlkTVhTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGVtYWlsIGFkZHJlc3MgZmFpbGVkIE1YIGNoZWNrLiJ9PC9wPgo8IS0tIGR0bDpibG9jazpFbWFpbEludmFsaWRNWFNlcnZlckVycm9yTXNnIC0tPgo8IS0tIGR0bDpibG9jazpFbWFpbEludmFsaWRTeW50YXhTZXJ2ZXJFcnJvck1zZyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGUgc3ludGF4IG9mIHRoaXMgZW1haWwgYWRkcmVzcyBpcyBpbmNvcnJlY3QuIn08L3A+CjwhLS0gZHRsOmJsb2NrOkVtYWlsSW52YWxpZFN5bnRheFNlcnZlckVycm9yTXNnIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IkRlc3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJUbyBxdWV1ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVG9TdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGVzdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNEZXN0JykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ0Rlc3QnLCBbJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU2VydmljZUlEJywgJ1NMQUlEJywgJ1NpZ25LZXlJRCcsICdDcnlwdEtleUlEJywgJ1RpY2tldEZyZWVUZXh0MScsICdUaWNrZXRGcmVlVGV4dDInLCAnVGlja2V0RnJlZVRleHQzJywgJ1RpY2tldEZyZWVUZXh0NCcsICdUaWNrZXRGcmVlVGV4dDUnLCAnVGlja2V0RnJlZVRleHQ2JywgJ1RpY2tldEZyZWVUZXh0NycsICdUaWNrZXRGcmVlVGV4dDgnLCAnVGlja2V0RnJlZVRleHQ5JywgJ1RpY2tldEZyZWVUZXh0MTAnLCAnVGlja2V0RnJlZVRleHQxMScsICdUaWNrZXRGcmVlVGV4dDEyJywgJ1RpY2tldEZyZWVUZXh0MTMnLCAnVGlja2V0RnJlZVRleHQxNCcsICdUaWNrZXRGcmVlVGV4dDE1JywgJ1RpY2tldEZyZWVUZXh0MTYnLCAnVG8nLCAnQ2MnLCAnQmNjJ10pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNlcnZpY2VJRCI+JFRleHR7IlNlcnZpY2UifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlNlcnZpY2VTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU2VydmljZUlEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiU2VydmljZSBpbnZhbGlkLiJ9PC9wPjwvZGl2Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NlcnZpY2VJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTZXJ2aWNlSUQnLCBbJ05ld1VzZXJJRCcsICdOZXdSZXNwb25zaWJsZUlEJywgJ05leHRTdGF0ZUlEJywgJ1ByaW9yaXR5SUQnLCAnU0xBSUQnLCAnU2lnbktleUlEJywgJ0NyeXB0S2V5SUQnLCAnVGlja2V0RnJlZVRleHQxJywgJ1RpY2tldEZyZWVUZXh0MicsICdUaWNrZXRGcmVlVGV4dDMnLCAnVGlja2V0RnJlZVRleHQ0JywgJ1RpY2tldEZyZWVUZXh0NScsICdUaWNrZXRGcmVlVGV4dDYnLCAnVGlja2V0RnJlZVRleHQ3JywgJ1RpY2tldEZyZWVUZXh0OCcsICdUaWNrZXRGcmVlVGV4dDknLCAnVGlja2V0RnJlZVRleHQxMCcsICdUaWNrZXRGcmVlVGV4dDExJywgJ1RpY2tldEZyZWVUZXh0MTInLCAnVGlja2V0RnJlZVRleHQxMycsICdUaWNrZXRGcmVlVGV4dDE0JywgJ1RpY2tldEZyZWVUZXh0MTUnLCAnVGlja2V0RnJlZVRleHQxNicsICdUbycsICdDYycsICdCY2MnXSk7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KCjwhLS0gZHRsOmJsb2NrOlRpY2tldFNMQSAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTTEFJRCI+JFRleHR7IlNlcnZpY2UgTGV2ZWwgQWdyZWVtZW50In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJTTEFTdHJnIn0KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTTEFJRCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdTTEFJRCcsIFsnTmV3VXNlcklEJywgJ05ld1Jlc3BvbnNpYmxlSUQnLCAnTmV4dFN0YXRlSUQnLCAnUHJpb3JpdHlJRCcsICdTaWduS2V5SUQnLCAnQ3J5cHRLZXlJRCcsICdUaWNrZXRGcmVlVGV4dDEnLCAnVGlja2V0RnJlZVRleHQyJywgJ1RpY2tldEZyZWVUZXh0MycsICdUaWNrZXRGcmVlVGV4dDQnLCAnVGlja2V0RnJlZVRleHQ1JywgJ1RpY2tldEZyZWVUZXh0NicsICdUaWNrZXRGcmVlVGV4dDcnLCAnVGlja2V0RnJlZVRleHQ4JywgJ1RpY2tldEZyZWVUZXh0OScsICdUaWNrZXRGcmVlVGV4dDEwJywgJ1RpY2tldEZyZWVUZXh0MTEnLCAnVGlja2V0RnJlZVRleHQxMicsICdUaWNrZXRGcmVlVGV4dDEzJywgJ1RpY2tldEZyZWVUZXh0MTQnLCAnVGlja2V0RnJlZVRleHQxNScsICdUaWNrZXRGcmVlVGV4dDE2JywgJ1RvJywgJ0NjJywgJ0JjYyddKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRTTEEgLS0+Cgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdVc2VySUQiPiRUZXh0eyJPd25lciJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiT3B0aW9uU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPd25lclNlbGVjdGlvbkdldEFsbCIgY2xhc3M9IkdldEFsbEFKQVgiIHRpdGxlPSIkVGV4dHsiR2V0IGFsbCJ9Ij4kVGV4dHsiR2V0IGFsbCJ9PC9hPgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI093bmVyU2VsZWN0aW9uR2V0QWxsJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKCcjT3duZXJBbGwnKS52YWwoJzEnKTsgLy8gTmVlZGVkPyBXaHk/CiAgICAgICAgQ29yZS5BSkFYLkZvcm1VcGRhdGUoJCgnI05ld1Bob25lVGlja2V0JyksICdBSkFYVXBkYXRlJywgJ093bmVyQWxsJywgWydOZXdVc2VySUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNOZXdVc2VySUQnKS5mb2N1cygpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpPd25lclNlbGVjdGlvbiAtLT4KCjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlU2VsZWN0aW9uIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9Ik5ld1Jlc3BvbnNpYmxlSUQiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUmVzcG9uc2libGVPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9IlJlc3BvbnNpYmxlU2VsZWN0aW9uR2V0QWxsIiBjbGFzcz0iR2V0QWxsQUpBWCIgdGl0bGU9IiRUZXh0eyJHZXQgYWxsIn0iPiRUZXh0eyJHZXQgYWxsIn08L2E+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjUmVzcG9uc2libGVTZWxlY3Rpb25HZXRBbGwnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoJyNSZXNwb25zaWJsZUFsbCcpLnZhbCgnMScpOyAvLyBOZWVkZWQ/IFdoeT8KICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjTmV3UGhvbmVUaWNrZXQnKSwgJ0FKQVhVcGRhdGUnLCAnUmVzcG9uc2libGVBbGwnLCBbJ05ld1Jlc3BvbnNpYmxlSUQnXSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICQoJyNOZXdSZXNwb25zaWJsZUlEJykuZm9jdXMoKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9KTsKLy9dXT48L3NjcmlwdD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGVTZWxlY3Rpb24gLS0+CgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlN1YmplY3QiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJTdWJqZWN0In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz0iVzc1cGMgVmFsaWRhdGVfUmVxdWlyZWQgJFFEYXRheyJTdWJqZWN0SW52YWxpZCJ9IiB0eXBlPSJ0ZXh0IiBuYW1lPSJTdWJqZWN0IiBpZD0iU3ViamVjdCIgdmFsdWU9IiRRRGF0YXsiU3ViamVjdCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlN1YmplY3RFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJTdWJqZWN0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUaWNrZXRPcHRpb25zIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiT3B0aW9ucyJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNCZWdpbiAtLT4KCjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJPcHRpb25TcGVsbENoZWNrIj5bICRUZXh0eyJTcGVsbCBjaGVjayJ9IF08L2E+CjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+Cgo8IS0tIGR0bDpibG9jazpPcHRpb25DdXN0b21lciAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvbkN1c3RvbWVyIj5bICRUZXh0eyJDdXN0b21lciJ9IF08L2E+CjwhLS0gZHRsOmJsb2NrOk9wdGlvbkN1c3RvbWVyIC0tPgojIC0tLQojIElUU00KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudExpbmtPYmplY3Q7TW9kZT1UZW1wb3Jhcnk7U291cmNlT2JqZWN0PVRpY2tldDtTb3VyY2VLZXk9JExRRGF0YXsiRm9ybUlEIn07VGFyZ2V0SWRlbnRpZmllcj1JVFNNQ29uZmlnSXRlbSIgaWQ9Ik9wdGlvbkxpbmtUaWNrZXQiIGNsYXNzPSJBc1BvcHVwIj5bICRUZXh0eyJMaW5rIHRpY2tldCJ9IF08L2E+CiMgLS0tCgo8IS0tIE91dHB1dEZpbHRlckhvb2tfVGlja2V0T3B0aW9uc0VuZCAtLT4KCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRPcHRpb25zIC0tPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX05vVGlja2V0T3B0aW9uc0ZhbGxiYWNrIC0tPgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJSaWNoVGV4dCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IlRleHQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgoKPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgJFFEYXRheyJSaWNoVGV4dEludmFsaWQifSIgbmFtZT0iQm9keSIgdGl0bGU9Ik1lc3NhZ2UgYm9keSIgcm93cz0iMTUiIGNvbHM9IiRDb25maWd7IlRpY2tldDo6RnJvbnRlbmQ6OlRleHRBcmVhTm90ZSJ9Ij4kUURhdGF7IkJvZHkifTwvdGV4dGFyZWE+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iUmljaFRleHRTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJBdHRhY2htZW50In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZpbGVuYW1lIn0gKCRRRGF0YXsiRmlsZXNpemUifSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgaWQ9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+JFRleHR7IkRlbGV0ZSJ9PC9idXR0b24+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJCgnI0F0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9JykuY2xvc2VzdCgnZm9ybScpKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBpZD0iRmlsZVVwbG9hZCIgbmFtZT0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiIC8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkF0dGFjaG1lbnRVcGxvYWQiIG5hbWU9IkF0dGFjaG1lbnRVcGxvYWQiIHZhbHVlPSIwIiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNGaWxlVXBsb2FkJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgIHZhciAkRm9ybSA9ICQoJyNGaWxlVXBsb2FkJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uZmluZCgnI0F0dGFjaG1lbnRVcGxvYWQnKS52YWwoJzEnKS5lbmQoKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJDdXN0b21lcklEIj4kVGV4dHsiQ3VzdG9tZXJJRCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iQ3VzdG9tZXJJRCIgaWQ9IkN1c3RvbWVySUQiIHZhbHVlPSIkUURhdGF7IkN1c3RvbWVySUQifSIgY2xhc3M9Ilc1MHBjIi8+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXh0U3RhdGVJRCI+JFRleHR7Ik5leHQgdGlja2V0IHN0YXRlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJOZXh0U3RhdGVzU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlBlbmRpbmcgRGF0ZSJ9ICgkVGV4dHsiZm9yIHBlbmRpbmcqIHN0YXRlcyJ9KTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlBlbmRpbmdEYXRlU3RyaW5nIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iRGF5RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiRGF0ZSBpbnZhbGlkISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiRGF0ZSBpbnZhbGlkISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iVGlja2V0RnJlZVRleHQxNCI+JFRleHR7IkltcGFjdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiSW1wYWN0U3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1RpY2tldEZyZWVUZXh0MTQnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoJyNFeHBhbmRDdXN0b21lck5hbWUnKS52YWwoJzMnKTsKICAgICAgICAkKCcjUHJpb3JpdHlSQycpLnZhbCgnMScpOwogICAgICAgIENvcmUuQUpBWC5Gb3JtVXBkYXRlKCQoJyNOZXdQaG9uZVRpY2tldCcpLCAnQUpBWFVwZGF0ZScsICdUaWNrZXRGcmVlVGV4dDE0JywgWydQcmlvcml0eUlEJ10pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiMgLS0tCgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlByaW9yaXR5SUQiPiRUZXh0eyJQcmlvcml0eSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUHJpb3JpdHlTdHJnIn0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkIn0KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgdGlja2V0IGZyZWV0ZXh0IGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIyAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRpY2tldEZyZWVLZXlGaWVsZDEifQojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZDEifQojICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkMiJ9CiMgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9CiMgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+Cgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRpY2tldEZyZWVUaW1lIn0KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGlja2V0RnJlZVRpbWUkRGF0YXsiQ291bnQifVVzZWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCB0aWNrZXQgZnJlZXRpbWUgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiREYXRheyJUaWNrZXRGcmVlVGltZUtleTEifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGltZTEifQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JERhdGF7IlRpY2tldEZyZWVUaW1lS2V5MiJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IlRpY2tldEZyZWVUaW1lMiJ9CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQifQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgYXJ0aWNsZSBmcmVldGV4dCBibG9ja3MgZm9yIGN1c3RvbWl6YXRpb25zCiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQyIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQyIn0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0MiAtLT4KCjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0xhYmVsIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlRpbWVVbml0cyI+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvbGFiZWw+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0xhYmVsIC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUaW1lVW5pdHMiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L2xhYmVsPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNMYWJlbE1hbmRhdG9yeSAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGNsYXNzPSJXMjVwYyBWYWxpZGF0ZV9UaW1lVW5pdHMgJFFEYXRheyJUaW1lVW5pdHNSZXF1aXJlZCJ9ICRRRGF0YXsiVGltZVVuaXRzSW52YWxpZCJ9IiBuYW1lPSJUaW1lVW5pdHMiIGlkPSJUaW1lVW5pdHMiIHZhbHVlPSIkUURhdGF7IlRpbWVVbml0cyJ9IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaW1lVW5pdHNFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJJbnZhbGlkIHRpbWUhIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQgU3BhY2luZ1RvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IlByaW1hcnkiIGlkPSJzdWJtaXRSaWNoVGV4dCIgYWNjZXNza2V5PSJnIiB0aXRsZT0iJFRleHR7IkNyZWF0ZSJ9IChnKSIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7IkNyZWF0ZSJ9Ij4kVGV4dHsiQ3JlYXRlIn08L2J1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iQ3VzdG9tZXJUaWNrZXRzIj48L2Rpdj4KPC9kaXY+Cgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uSW5pdCgpOwojIC0tLQojIElUU00KIyAtLS0KJCgnYS5Bc1BvcHVwJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoJCh0aGlzKS5hdHRyKCdocmVmJyksICdBY3Rpb24nKTsgcmV0dXJuIGZhbHNlO30pOwojIC0tLQovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CgojIGV4YW1wbGUgdGVtcGxhdGUgZm9ybSBmb3IgY3VzdG9taXphdGlvbnMKIzxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgaWQ9IlRlbXBsYXRlMSI+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTdWJhY3Rpb24iIHZhbHVlPSJTdG9yZU5ldyIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkZvcm1JRCIgdmFsdWU9IiRRRGF0YXsiRm9ybUlEIn0iLz4KIyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJFeHBhbmRDdXN0b21lck5hbWUiIHZhbHVlPSIyIi8+CiMgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViamVjdCIgdmFsdWU9IkV4YW1wbGUgU3ViamVjdCIvPgojICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkJvZHkiIHZhbHVlPSJOYW1lOgojUHJvZHVjdDoKI0NvbW1lbnQ6Ii8+CiM8L2Zvcm0+Cg==
IyAtLQojIEFnZW50VGlja2V0UHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudFRpY2tldFByaW50LmR0bCx2IDEuNSAyMDEwLzEyLzA2IDE5OjMzOjA5IGVuIEV4cCAkCiMgJE9sZElkOiBBZ2VudFRpY2tldFByaW50LmR0bCx2IDEuMjkgMjAxMC8xMS8yNiAxMzoyOToyNCBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JENvbmZpZ3siVGlja2V0OjpIb29rIn06ICRRRGF0YXsiVGlja2V0TnVtYmVyIn0gLyAkUURhdGF7IlRpdGxlIn08L3RkPgogICAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICRUZXh0eyJUaWNrZXQtSW5mbyJ9OgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICAgICAgICAgICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI0MCUiPiRUZXh0eyJTdGF0ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUHJpb3JpdHkifTo8L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiUXVldWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlF1ZXVlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJMb2NrIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJMb2NrIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkN1c3RvbWVySUQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkN1c3RvbWVySUQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik93bmVyIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJPd25lciJ9ICgkUURhdGF7IlVzZXJGaXJzdG5hbWUifSAkUURhdGF7IlVzZXJMYXN0bmFtZSJ9KTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUmVzcG9uc2libGVTdHJpbmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJUeXBlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJTZXJ2aWNlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJTZXJ2aWNlIExldmVsIEFncmVlbWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU0xBIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+JFRleHR7IkFnZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRRRGF0YXsiQWdlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJBY2NvdW50ZWQgdGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiVGlja2V0VGltZVVuaXRzIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQZW5kaW5nIHRpbGwifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlBlbmRpbmdVbnRpbCJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZVNob3J0eyIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpGaXJzdFJlc3BvbnNlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VXBkYXRlVGltZSAtLT4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjMwJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjMwJSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CgojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZUtleTEtMTYgYW5kIFRpY2tldEZyZWVUZXh0MS0xNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjIwIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dCIsIjIwIn08L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMgICAgICAgIDx0cj4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiVGlja2V0RnJlZUtleTEiLCIyMCJ9OjwvdGQ+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgojICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjIwIn08L2Rpdj4KIyAgICAgICAgICA8L3RkPgojICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICA8dHI+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjAifTo8L3RkPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyMCJ9PC9kaXY+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KCiMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlVGltZTEtNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifTwvZGl2PjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICA8dHI+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTEifSJ9OjwvdGQ+CiMgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In08L2Rpdj48L3RkPgojICAgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rIC0tPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgICRUZXh0eyJMaW5rZWQtT2JqZWN0In06CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5IiB3aWR0aD0iMjAlIj4kVGV4dHsiJERhdGF7IkxpbmtUeXBlTmFtZSJ9In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CjwhLS0gZHRsOmJsb2NrOkxpbmtUeXBlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1N0cmcifTxici8+CjwhLS0gZHRsOmJsb2NrOkxpbmtUeXBlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpMaW5rVHlwZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6TGluayAtLT4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiQ3VzdG9tZXIgSW5mbyJ9OgogICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gc3RhcnQgdGlja2V0ICREYXRheyJUaWNrZXROdW1iZXIifSAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjMDAwMDAwIiBjbGFzcz0iY29udGFpbmVyIj4KICAgIDx0cj4KICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEiIGJnY29sb3I9IiNmZmZmZmYiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTAwJSIgY2xhc3M9InNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMTYwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0gJFRleHR7ImJ5In0gJFRleHR7IiREYXRheyJTZW5kZXJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjE2MCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRUZXh0eyIkRGF0YXsiQXJ0aWNsZVR5cGUifSJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiQXJ0aWNsZTo6QVRNIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KJERhdGF7IlRleHROb3RlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZT4KJERhdGF7IkJvZHkifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8YnIvPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlIC0tPgo=
IyAtLQojIEFnZW50VGlja2V0Wm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIGZvciBBZ2VudFRpY2tldFpvb20ucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0Wm9vbS5kdGwsdiAxLjMyIDIwMTEvMDEvMTIgMTY6Mzk6MjIgdWIgRXhwICQKIyAkT2xkSWQ6IEFnZW50VGlja2V0Wm9vbS5kdGwsdiAxLjE3OSAyMDExLzAxLzEyIDEwOjI5OjE2IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZpbHRlckRpYWxvZyAtLT4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXRBcnRpY2xlRmlsdGVyJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICBDb3JlLlVJLkRpYWxvZy5TaG93Q29udGVudERpYWxvZygkKCcjQXJ0aWNsZUZpbHRlckRpYWxvZycpLCAnJEpTVGV4dHsiQXJ0aWNsZSBmaWx0ZXIifScsICcyMHB4JywgJ0NlbnRlcicsIHRydWUsIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTGFiZWw6ICIkSlNUZXh0eyJBcHBseSJ9IiwKICAgICAgICAgICAgICAgIEZ1bmN0aW9uOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIERhdGEgPSBDb3JlLkFKQVguU2VyaWFsaXplRm9ybSgkKCcjQXJ0aWNsZUZpbHRlckRpYWxvZ0Zvcm0nKSk7CiAgICAgICAgICAgICAgICAgICAgQ29yZS5BSkFYLkZ1bmN0aW9uQ2FsbChDb3JlLkNvbmZpZy5HZXQoJ0NHSUhhbmRsZScpLCBEYXRhLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpOwogICAgICAgICAgICAgICAgICAgIH0sICd0ZXh0Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIExhYmVsOiAiJEpTVGV4dHsiUmVzZXQifSIsCiAgICAgICAgICAgICAgICBGdW5jdGlvbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICQoJyNBcnRpY2xlVHlwZUZpbHRlcicpLnZhbCgnJyk7CiAgICAgICAgICAgICAgICAgICAgJCgnI0FydGljbGVTZW5kZXJUeXBlRmlsdGVyJykudmFsKCcnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIF0pOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwogICAgJCgnI1Jlc2V0QXJ0aWNsZUZpbHRlcicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyIERhdGEgPSB7CiAgICAgICAgICAgIEFjdGlvbjogICAgICAgJ0FnZW50VGlja2V0Wm9vbScsCiAgICAgICAgICAgIFN1YmFjdGlvbjogICAgJ0FydGljbGVGaWx0ZXJTZXQnLAogICAgICAgICAgICBUaWNrZXRJRDogICAgICckUURhdGF7IlRpY2tldElEIn0nLAogICAgICAgICAgICBTYXZlRGVmYXVsdHM6IDEKICAgICAgICB9OwogICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoQ29yZS5Db25maWcuR2V0KCdDR0lIYW5kbGUnKSwgRGF0YSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICBsb2NhdGlvbi5yZWxvYWQoKTsKICAgICAgICB9KTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxkaXYgaWQ9IkFydGljbGVGaWx0ZXJEaWFsb2ciIGNsYXNzPSJIaWRkZW4iPgogICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBpZD0iQXJ0aWNsZUZpbHRlckRpYWxvZ0Zvcm0iIG5hbWU9IkFydGljbGVGaWx0ZXJEaWFsb2dGb3JtIj4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iQWdlbnRUaWNrZXRab29tIiBuYW1lPSJBY3Rpb24iLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iQXJ0aWNsZUZpbHRlclNldCIgbmFtZT0iU3ViYWN0aW9uIi8+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIgbmFtZT0iVGlja2V0SUQiLz4KICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSI+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IkFydGljbGVUeXBlRmlsdGVyIj4kVGV4dHsiQXJ0aWNsZSBUeXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVUeXBlRmlsdGVyU3RyaW5nIn0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPGxhYmVsIGZvcj0iQXJ0aWNsZVNlbmRlclR5cGVGaWx0ZXIiPiRUZXh0eyJTZW5kZXIgVHlwZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlU2VuZGVyVHlwZUZpbHRlclN0cmluZyJ9CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgIDxsYWJlbCBmb3I9IlNhdmVEZWZhdWx0cyI+JFRleHR7IlNhdmUgZmlsdGVyIHNldHRpbmdzIGFzIGRlZmF1bHQifTo8L2xhYmVsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJTYXZlRGVmYXVsdHMiIG5hbWU9IlNhdmVEZWZhdWx0cyIgdmFsdWU9IjEiIC8+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZmllbGRzZXQ+CiAgICA8L2Zvcm0+CjwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRmlsdGVyRGlhbG9nIC0tPgoKPCEtLSBkdGw6YmxvY2s6SGVhZGVyIC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiI+CiAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgPGRpdiBjbGFzcz0iSGVhZGxpbmUiPgogICAgICAgIDxkaXYgY2xhc3M9IkZsYWciIHRpdGxlPSIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSI+PHNwYW4gY2xhc3M9IlByaW9yaXR5SUQtJFFEYXRheyJQcmlvcml0eUlEIn0iPiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9PC9zcGFuPjwvZGl2PgogICAgICAgIDxoMSB0aXRsZT0iJFRleHR7Ilpvb20ifSAkQ29uZmlneyJUaWNrZXQ6Okhvb2sifTogJERhdGF7IlRpY2tldE51bWJlciJ9ICZuZGFzaDsgJFFEYXRheyJUaXRsZSIsICI0MCJ9Ij4KICAgICAgICAgICAgIyREYXRheyJUaWNrZXROdW1iZXIifSA8c3Bhbj4mbWRhc2g7PC9zcGFuPiAkUURhdGF7IlRpdGxlIiwgIjYwIn0KICAgICAgICA8L2gxPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0iTGF5b3V0Rml4ZWRTaWRlYmFyIFNpZGViYXJMYXN0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJTaWRlYmFyQ29sdW1uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiAgICAgICAgICAgICAgICAgICAgPGgyPiRUZXh0eyJUaWNrZXQgSW5mb3JtYXRpb24ifTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgojIC0tLQojIElUU00KIyAtLS0KIyAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KIzwhLS0gZHRsOmJsb2NrOlR5cGUgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlR5cGUifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFFEYXRheyJUeXBlIn0iPiRRRGF0YXsiVHlwZSIsIjE4In08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUeXBlIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJTdGF0ZSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTdGF0ZSJ9In0iLCIxOCJ9PC9wPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkxvY2tlZCJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiTG9jayJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IkxvY2sifSJ9IiwiMTgifTwvcD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIwojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJQcmlvcml0eSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0iLCIxOCJ9PC9wPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlF1ZXVlIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRRGF0YXsiUXVldWUifSI+JFFEYXRheyJRdWV1ZSIsIjE4In08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMKIzwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlNlcnZpY2UifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFFEYXRheyJTZXJ2aWNlIn0iPiRRRGF0YXsiU2VydmljZSIsIjE4In08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgojPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJTZXJ2aWNlIExldmVsIEFncmVlbWVudCJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUURhdGF7IlNMQSJ9Ij4kUURhdGF7IlNMQSIsIjE4In08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpTTEEgLS0+CiMgICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiMKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlR5cGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUURhdGF7IlR5cGUifSI+JFFEYXRheyJUeXBlIiwiMTgifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlN0YXRlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiU3RhdGUifSJ9IiwiMTgifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJRdWV1ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRRGF0YXsiUXVldWUifSI+JFFEYXRheyJRdWV1ZSIsIjE4In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiTG9ja2VkIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFF1b3RleyIkVGV4dHsiJERhdGF7IkxvY2sifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJMb2NrIn0ifSIsIjE4In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOk93bmVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik93bmVyIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFFEYXRheyJVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJVc2VyTGFzdG5hbWUifSAoJFFEYXRheyJVc2VyTG9naW4ifSkiPiRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxOCJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KPCEtLSBkdGw6YmxvY2s6UmVzcG9uc2libGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiUmVzcG9uc2libGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUURhdGF7IlVzZXJGaXJzdG5hbWUifSAkUURhdGF7IlVzZXJMYXN0bmFtZSJ9ICgkUURhdGF7IlVzZXJMb2dpbiJ9KSI+JFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjE4In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgoKPCEtLSBkdGw6YmxvY2s6UGVuZGluZ1VudGlsIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlBlbmRpbmcgdGlsbCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSAkUURhdGF7IlBlbmRpbmdVbnRpbENsYXNzIn0iPiREYXRheyJQZW5kaW5nVW50aWwifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpQZW5kaW5nVW50aWwgLS0+CgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CiMgLS0tCiMgLS0tCiMgSVRTTQojIC0tLQojICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgojPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZSJ9IiBjbGFzcz0iJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZUNsYXNzIn0iPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4ifQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lRGVzdGluYXRpb25EYXRlIn0ifQojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJVcGRhdGUgVGltZSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgdGl0bGU9IiRUZXh0eyJTZXJ2aWNlIFRpbWUifTogJFFEYXRheyJVcGRhdGVUaW1lV29ya2luZ1RpbWUifSIgY2xhc3M9IiRRRGF0YXsiVXBkYXRlVGltZUNsYXNzIn0iPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IlVwZGF0ZVRpbWVIdW1hbiJ9CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRUaW1lU2hvcnR7IiRRRGF0YXsiVXBkYXRlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iVmFsdWUiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSIgY2xhc3M9IiRRRGF0YXsiU29sdXRpb25UaW1lQ2xhc3MifSI+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiU29sdXRpb25UaW1lSHVtYW4ifQojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnIvPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOlNvbHV0aW9uVGltZSAtLT4KIyAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KIwogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiU2VydmljZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRRGF0YXsiU2VydmljZSJ9Ij4kUURhdGF7IlNlcnZpY2UiLCIxOCJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CjwhLS0gZHRsOmJsb2NrOlNMQSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJTZXJ2aWNlIExldmVsIEFncmVlbWVudCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRRGF0YXsiU0xBIn0iPiRRRGF0YXsiU0xBIiwiMTgifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CjwhLS0gZHRsOmJsb2NrOkZpcnN0UmVzcG9uc2VUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkZpcnN0IFJlc3BvbnNlIFRpbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWUifSIgY2xhc3M9IiRRRGF0YXsiRmlyc3RSZXNwb25zZVRpbWVDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZpcnN0UmVzcG9uc2VUaW1lSHVtYW4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTaG9ydHsiJFFEYXRheyJGaXJzdFJlc3BvbnNlVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rmlyc3RSZXNwb25zZVRpbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlVwZGF0ZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiVXBkYXRlIFRpbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJWYWx1ZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCB0aXRsZT0iJFRleHR7IlNlcnZpY2UgVGltZSJ9OiAkUURhdGF7IlVwZGF0ZVRpbWVXb3JraW5nVGltZSJ9IiBjbGFzcz0iJFFEYXRheyJVcGRhdGVUaW1lQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJVcGRhdGVUaW1lSHVtYW4ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxici8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRpbWVTaG9ydHsiJFFEYXRheyJVcGRhdGVUaW1lRGVzdGluYXRpb25EYXRlIn0ifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpVcGRhdGVUaW1lIC0tPgo8IS0tIGR0bDpibG9jazpTb2x1dGlvblRpbWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiU29sdXRpb24gVGltZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlZhbHVlIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIHRpdGxlPSIkVGV4dHsiU2VydmljZSBUaW1lIn06ICRRRGF0YXsiU29sdXRpb25UaW1lV29ya2luZ1RpbWUifSIgY2xhc3M9IiRRRGF0YXsiU29sdXRpb25UaW1lQ2xhc3MifSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJTb2x1dGlvblRpbWVIdW1hbiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJyLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUXVvdGV7IiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJDcml0aWNhbGl0eSJ9In0iLCIxOCJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkltcGFjdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJJbXBhY3QifSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJJbXBhY3QifSJ9IiwiMTgifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJQcmlvcml0eSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRdW90ZXsiJFRleHR7IiREYXRheyJQcmlvcml0eSJ9In0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifSIsIjE4In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KIyAtLS0KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkN1c3RvbWVySUQifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkQ29uZmlneyJDdXN0b21lckRCTGluayJ9IiBjbGFzcz0iQXNQb3B1cCBQb3B1cFR5cGVfVGlja2V0QWN0aW9uIiAkQ29uZmlneyJDdXN0b21lckRCTGlua1RhcmdldCJ9PiRRRGF0YXsiQ3VzdG9tZXJJRCIsICIxOCJ9PC9hPgojICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojCiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkFjY291bnRlZCB0aW1lIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+JERhdGF7IlRpY2tldFRpbWVVbml0cyJ9PC9wPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojCiM8IS0tIGR0bDpibG9jazpQZW5kaW5nVW50aWwgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlBlbmRpbmcgdGlsbCJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUgJFFEYXRheyJQZW5kaW5nVW50aWxDbGFzcyJ9Ij4kRGF0YXsiUGVuZGluZ1VudGlsIn08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpQZW5kaW5nVW50aWwgLS0+CiM8IS0tIGR0bDpibG9jazpPd25lciAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiT3duZXIifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFFEYXRheyJVc2VyRmlyc3RuYW1lIn0gJFFEYXRheyJVc2VyTGFzdG5hbWUifSAoJFFEYXRheyJVc2VyTG9naW4ifSkiPiRRdW90ZXsiJERhdGF7IlVzZXJGaXJzdG5hbWUifSAkRGF0YXsiVXNlckxhc3RuYW1lIn0iLCIxOCJ9PC9wPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojCiM8IS0tIGR0bDpibG9jazpPd25lciAtLT4KIzwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJSZXNwb25zaWJsZSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUURhdGF7IlVzZXJGaXJzdG5hbWUifSAkUURhdGF7IlVzZXJMYXN0bmFtZSJ9ICgkUURhdGF7IlVzZXJMb2dpbiJ9KSI+JFF1b3RleyIkRGF0YXsiVXNlckZpcnN0bmFtZSJ9ICREYXRheyJVc2VyTGFzdG5hbWUifSIsIjE4In08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMKIzwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgojICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojIyBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKIyAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjI1In06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9zcGFuPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij48YSBocmVmPSIkRGF0YXsiVGlja2V0RnJlZVRleHRMaW5rIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvYT48L3NwYW4+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiMgICAgICAgICAgICAgICAgICAgICAgICA8L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMjICAgICAgICAgIDx0ciB2YWxpZ249InRvcCI+CiMjICAgICAgICAgICAgPHRkPjxiPiRRRGF0YXsiVGlja2V0RnJlZUtleTEiLCIyNSJ9OjwvYj48L3RkPgojIyAgICAgICAgICAgIDx0ZD4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluMSAtLT4KIyMgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MSJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjI1In08L3NwYW4+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjEgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRMaW5rMSAtLT4KIyMgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MSJ9Ij48YSBocmVmPSIkQ29uZmlneyJUaWNrZXRGcmVlVGV4dExpbmsxIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0MSIsIjI1In08L2E+PC9zcGFuPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazEgLS0+CiMjICAgICAgICAgICAgPC90ZD4KIyMgICAgICAgICAgPC90cj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojIyAgICAgICAgICAgIDx0ZD48Yj4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjUifTo8L2I+PC90ZD4KIyMgICAgICAgICAgICA8dGQ+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbjIgLS0+CiMjICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9zcGFuPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0UGxhaW4yIC0tPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluazIgLS0+CiMjICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDIifSI+PGEgaHJlZj0iJENvbmZpZ3siVGlja2V0RnJlZVRleHRMaW5rMiJ9IiB0YXJnZXQ9Il9ibGFuayI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDIiLCIyNSJ9PC9hPjwvc3Bhbj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsyIC0tPgojIyAgICAgICAgICAgIDwvdGQ+CiMjICAgICAgICAgIDwvdHI+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojCiMjIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZVRpbWUxLTYKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyIkRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9OjwvbGFiZWw+CiMgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In08L3A+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiMKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyMgICAgICAgICAgPHRyIHZhbGlnbj0idG9wIj4KIyMgICAgICAgICAgICA8dGQ+PGI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MSJ9In06PC9iPjwvdGQ+CiMjICAgICAgICAgICAgPHRkPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyMgICAgICAgICAgPC90cj4KIyM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMjPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojIyAgICAgICAgICA8dHIgdmFsaWduPSJ0b3AiPgojIyAgICAgICAgICAgIDx0ZD48Yj4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkyIn0ifTo8L2I+PC90ZD4KIyMgICAgICAgICAgICA8dGQ+PGRpdiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In08L2Rpdj48L3RkPgojIyAgICAgICAgICA8L3RyPgojIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KIyAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwgVGlnaHQiPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkRlY2lzaW9uIFJlc3VsdCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRUZXh0eyIkRGF0YXsiVGlja2V0RnJlZVRleHQxNiJ9In0iPiRUZXh0eyIkRGF0YXsiVGlja2V0RnJlZVRleHQxNiJ9In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXk1In0ifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWU1In0ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyIkQ29uZmlneyJUaWNrZXRGcmVlVGltZUtleTMifSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUzIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTMifSJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5NCJ9In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTQifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNCJ9In08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXk2In0ifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lNiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWU2In0ifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIEZpeGVkTGFiZWxTbWFsbCI+CgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkN1c3RvbWVySUQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPjxhIGhyZWY9IiRDb25maWd7IkN1c3RvbWVyREJMaW5rIn0iIGNsYXNzPSJPcGVuQXNQb3B1cCIgJENvbmZpZ3siQ3VzdG9tZXJEQkxpbmtUYXJnZXQifT4kUURhdGF7IkN1c3RvbWVySUQiLCAiMTgifTwvYT48L3A+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQWNjb3VudGVkIHRpbWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiREYXRheyJUaWNrZXRUaW1lVW5pdHMifTwvcD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKICAgICAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9IlRhYmxlTGlrZSBGaXhlZExhYmVsU21hbGwiPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRRRGF0YXsiVGlja2V0RnJlZUtleSIsIjI1In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHRQbGFpbiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyNSJ9PC9zcGFuPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dFBsYWluIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dExpbmsgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dCJ9Ij48YSBocmVmPSIkRGF0YXsiVGlja2V0RnJlZVRleHRMaW5rIn0iIHRhcmdldD0iX2JsYW5rIj4kUURhdGF7IlRpY2tldEZyZWVUZXh0IiwiMjUifTwvYT48L3NwYW4+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0TGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgoKIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IiREYXRheyJUaWNrZXRGcmVlVGltZUtleSJ9In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9PC9wPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgojIC0tLQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRTaW1wbGUiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgICAgICAgICA8aDI+JFRleHR7IkN1c3RvbWVyIEluZm9ybWF0aW9uIn08L2gyPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KIyBzaG93IGN1c3RvbWVyIGluZm8gdGFibGUKPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJUYWJsZSAtLT4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyVGFibGUgLS0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkxpbmtUYWJsZVNpbXBsZSAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iV2lkZ2V0U2ltcGxlIERvbnRQcmludCI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJIZWFkZXIiPgogICAgICAgICAgICAgICAgICAgIDxoMj4kVGV4dHsiTGlua2VkIE9iamVjdHMifTwvaDI+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJMaW5rVGFibGVTdHJnIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlU2ltcGxlIC0tPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnRDb2x1bW4iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij4KICAgICAgICAgICAgICAgIDxoMj4kUURhdGF7IkFydGljbGVDb3VudCJ9ICRUZXh0eyJBcnRpY2xlKHMpIn08L2gyPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQWRkaXRpb25hbEluZm9ybWF0aW9uIj4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiQWdlIn06ICREYXRheyJBZ2UifSAmbmRhc2g7ICRUZXh0eyJDcmVhdGVkIn06ICRUaW1lU2hvcnR7IiREYXRheyJDcmVhdGVkIn0ifQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgPHVsIGNsYXNzPSJBY3Rpb25zIj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0TWVudSAtLT4KICAgICAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gdGl0bGU9IiRUZXh0eyIkRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOlRpY2tldE1lbnUgLS0+CjwhLS0gZHRsOmJsb2NrOk1vdmVMaW5rIC0tPgogICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IiRUZXh0eyJNb3ZlIHRpY2tldCB0byBhIGRpZmZlcmVudCBxdWV1ZSJ9IiBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iQWdlbnRUaWNrZXRNb3ZlIi8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJRdWV1ZUlEIiB2YWx1ZT0iJFFEYXRheyJRdWV1ZUlEIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlRpY2tldElEIiB2YWx1ZT0iJFFEYXRheyJUaWNrZXRJRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJEZXN0UXVldWVJRCIgY2xhc3M9IkludmlzaWJsZVRleHQiPiRUZXh0eyJDaGFuZ2UgcXVldWUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik1vdmVRdWV1ZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9mb3JtPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjRGVzdFF1ZXVlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2Zvcm0nKS5zdWJtaXQoKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpNb3ZlTGluayAtLT4KPCEtLSBkdGw6YmxvY2s6TW92ZUZvcm0gLS0+CiAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TW92ZTtUaWNrZXRJRD0kTFFEYXRheyJUaWNrZXRJRCJ9OyIgY2xhc3M9IkFzUG9wdXAgUG9wdXBUeXBlX1RpY2tldEFjdGlvbiIgdGl0bGU9IiRUZXh0eyJDaGFuZ2UgUXVldWUifSI+JFRleHR7IkNoYW5nZSBRdWV1ZSJ9PC9hPgogICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOk1vdmVGb3JtIC0tPgogICAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CgogICAgICAgICAgICA8ZGl2IGlkPSJBcnRpY2xlVHJlZSI+CiREYXRheyJBcnRpY2xlVHJlZSJ9CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBpZD0iQXJ0aWNsZUl0ZW1zIj4KJERhdGF7IkFydGljbGVJdGVtcyJ9CiAgICAgICAgICAgIDwvZGl2PgoKPCEtLSBkdGw6YmxvY2s6TGlua1RhYmxlQ29tcGxleCAtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ29udGVudCI+CiAgICAgICAgICAgICAgICAkRGF0YXsiTGlua1RhYmxlU3RyZyJ9CiAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpMaW5rVGFibGVDb21wbGV4IC0tPgoKICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICA8L2Rpdj4KCjwvZGl2Pgo8IS0tIGR0bDpibG9jazpIZWFkZXIgLS0+CgoKCjwhLS0gZHRsOmJsb2NrOlRyZWUgLS0+CjxkaXYgaWQ9IkFydGljbGVUYWJsZSIgIGNsYXNzPSJGaXhlZEhlYWRlciI+CiAgICA8ZGl2IGNsYXNzPSJDb250cm9sUm93Ij4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZpbHRlckRpYWxvZ0xpbmsgLS0+CiAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZUZpbHRlciBJY29ucyI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJJbnZpc2libGVUZXh0Ij4kVGV4dHsiQXJ0aWNsZSBGaWx0ZXIifTo8L3NwYW4+CiMgT25seSBzaG93IG9uZTogU2V0IG9yIFJlc2V0LgojPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZpbHRlclNldExpbmsgLS0+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiIGlkPSJTZXRBcnRpY2xlRmlsdGVyIiB0aXRsZT0iJFRleHR7IkFkZCBGaWx0ZXIifSI+PHNwYW4+JFRleHR7IlNldCJ9PC9zcGFuPjwvYT4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGaWx0ZXJTZXRMaW5rIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRmlsdGVyUmVzZXRMaW5rIC0tPgogICAgICAgICAgICA8YSBjbGFzcz0iQWN0aXZlIiBocmVmPSIjIiBpZD0iUmVzZXRBcnRpY2xlRmlsdGVyIiB0aXRsZT0iJFRleHR7IlJlc2V0IEZpbHRlciJ9Ij48c3Bhbj4kVGV4dHsiUmVzZXQifTwvc3Bhbj48L2E+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGaWx0ZXJSZXNldExpbmsgLS0+CiAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGaWx0ZXJEaWFsb2dMaW5rIC0tPgogICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVWaWV3IEljb25zIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkludmlzaWJsZVRleHQiPiRUZXh0eyJBcnRpY2xlIn0gJFRleHR7IlZpZXcifTo8L3NwYW4+CjwhLS0gZHRsOmJsb2NrOkV4cGFuZCAtLT4KICAgICAgICAgICAgPGEgY2xhc3M9Ik9uZUFydGljbGUgQWN0aXZlIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kTFFEYXRheyJUaWNrZXRJRCJ9O0FydGljbGVJRD0kTFFEYXRheyJBcnRpY2xlSUQifTtab29tRXhwYW5kPTAiIHRpdGxlPSIkVGV4dHsiU2hvdyBvbmUgYXJ0aWNsZSJ9Ij48c3Bhbj4kVGV4dHsiU2hvdyBvbmUgYXJ0aWNsZSJ9PC9zcGFuPjwvYT4KICAgICAgICAgICAgPGEgY2xhc3M9IkFsbEFydGljbGVzIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtUaWNrZXRJRD0kTFFEYXRheyJUaWNrZXRJRCJ9O0FydGljbGVJRD0kTFFEYXRheyJBcnRpY2xlSUQifTtab29tRXhwYW5kPTEiIHRpdGxlPSIkVGV4dHsiU2hvdyBhbGwgYXJ0aWNsZXMifSI+PHNwYW4+JFRleHR7IlNob3cgYWxsIGFydGljbGVzIn08L3NwYW4+PC9hPgo8IS0tIGR0bDpibG9jazpFeHBhbmQgLS0+CjwhLS0gZHRsOmJsb2NrOkNvbGxhcHNlIC0tPgogICAgICAgICAgICA8YSBjbGFzcz0iT25lQXJ0aWNsZSIgaHJlZj0iJEVudnsiQmFzZWxpbmsifUFjdGlvbj1BZ2VudFRpY2tldFpvb207VGlja2V0SUQ9JExRRGF0YXsiVGlja2V0SUQifTtBcnRpY2xlSUQ9JExRRGF0YXsiQXJ0aWNsZUlEIn07Wm9vbUV4cGFuZD0wIiB0aXRsZT0iJFRleHR7IlNob3cgb25lIGFydGljbGUifSI+PHNwYW4+JFRleHR7IlNob3cgb25lIGFydGljbGUifTwvc3Bhbj48L2E+CiAgICAgICAgICAgIDxhIGNsYXNzPSJBbGxBcnRpY2xlcyBBY3RpdmUiIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249QWdlbnRUaWNrZXRab29tO1RpY2tldElEPSRMUURhdGF7IlRpY2tldElEIn07QXJ0aWNsZUlEPSRMUURhdGF7IkFydGljbGVJRCJ9O1pvb21FeHBhbmQ9MSIgdGl0bGU9IiRUZXh0eyJTaG93IGFsbCBhcnRpY2xlcyJ9Ij48c3Bhbj4kVGV4dHsiU2hvdyBhbGwgYXJ0aWNsZXMifTwvc3Bhbj48L2E+CjwhLS0gZHRsOmJsb2NrOkNvbGxhcHNlIC0tPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iQXJ0aWNsZVRhYmxlQm9keSIgY2xhc3M9IkFjdGlvblJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0iU2Nyb2xsZXIiPgogICAgICAgICAgICA8dGFibGUgaWQ9IkZpeGVkVGFibGUiIGNsYXNzPSJUYWJsZVNtYWxsIE5vQ2VsbHNwYWNpbmciPgogICAgICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJVbnJlYWRBcnRpY2xlcyI+PGEgY2xhc3M9IlVucmVhZEFydGljbGVzIiBocmVmPSIjIiB0aXRsZT0iJFRleHR7IlVucmVhZCBhcnRpY2xlcyJ9Ij48c3BhbiBjbGFzcz0iVW5yZWFkQXJ0aWNsZXMiPjwvc3Bhbj48L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJObyBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+JFRleHR7Ik5vLiJ9PC9hPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iVHlwZSBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+JFRleHR7IlR5cGUifTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkRpcmVjdGlvbiBTb3J0YWJsZSI+PGEgaHJlZj0iIyIgdGl0bGU9IiRUZXh0eyJEaXJlY3Rpb24ifSI+PHNwYW4gY2xhc3M9IkRpcmVjdGlvbiI+PCEtLURpcmVjdGlvbi0tPjwvc3Bhbj48L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJGcm9tIFNvcnRhYmxlIj48YSBocmVmPSIjIj4kVGV4dHsiRnJvbSJ9PC9hPjwvdGg+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz0iU3ViamVjdCBTb3J0YWJsZSI+PGEgaHJlZj0iIyI+JFRleHR7IlN1YmplY3QifTwvYT48L3RoPgogICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9IkNyZWF0ZWQgU29ydGFibGUiPjxhIGhyZWY9IiMiPiRUZXh0eyJDcmVhdGVkIn08L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJBdHRhY2htZW50cyBMYXN0Ij48YSBocmVmPSIjIiB0aXRsZT0iJFRleHR7IkF0dGFjaG1lbnRzIn0iPjxzcGFuPjwhLS1BdHRhY2htZW50cy0tPjwvc3Bhbj48L2E+PC90aD4KICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgICAgIDx0Ym9keT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW0gLS0+CiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPSIkUURhdGF7IlNlbmRlclR5cGUifS0kUURhdGF7IkFydGljbGVUeXBlIn0gJFFEYXRheyJDbGFzc1JvdyJ9IiBpZD0iUm93JExRRGF0YXsiQ291bnQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9IFVucmVhZEFydGljbGVzIEZpeGVkIE5vblRleHRDb250ZW50Ij4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1OZXdBcnRpY2xlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IiRRRGF0YXsiQ2xhc3MifSIgdGl0bGU9IiRUZXh0eyJVbnJlYWQgQXJ0aWNsZSEifSI+JFRleHR7IlVucmVhZCBBcnRpY2xlISJ9PC9zcGFuPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbU5ld0FydGljbGUgLS0+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtTm9OZXdBcnRpY2xlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Ik5vQ29udGVudCI+PC9zcGFuPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbU5vTmV3QXJ0aWNsZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJObyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkNvdW50In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJBcnRpY2xlSW5mbyIgbmFtZT0iTGluayRMUURhdGF7IkNvdW50In0iIHZhbHVlPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0Wm9vbTtTdWJhY3Rpb249QXJ0aWNsZVVwZGF0ZTtDb3VudD0kTFFEYXRheyJDb3VudCJ9O1RpY2tldElEPSRRRGF0YXsiVGlja2V0SUQifTtBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifTsiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJBcnRpY2xlSUQiIHZhbHVlPSIkUURhdGF7IkFydGljbGVJRCJ9IiAvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iJFFEYXRheyJDb3VudCJ9IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IlR5cGUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4kVGV4dHsiJERhdGF7IlNlbmRlclR5cGUifSJ9ICZuZGFzaDsgJFRleHR7IiREYXRheyJBcnRpY2xlVHlwZSJ9In08L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IiRUZXh0eyIkRGF0YXsiU2VuZGVyVHlwZSJ9In0gJm5kYXNoOyAkVGV4dHsiJERhdGF7IkFydGljbGVUeXBlIn0ifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJEaXJlY3Rpb24iPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbURpcmVjdGlvbkluY29taW5nIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRpcmVjdGlvbiBJbmNvbWluZyIgdGl0bGU9IiRUZXh0eyJJbmNvbWluZyBtZXNzYWdlIn0iPjwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IjAiIC8+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtRGlyZWN0aW9uSW5jb21pbmcgLS0+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtRGlyZWN0aW9uT3V0Z29pbmcgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iRGlyZWN0aW9uIE91dGdvaW5nIiB0aXRsZT0iJFRleHR7Ik91dGdvaW5nIG1lc3NhZ2UifSI+PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iMSIgLz4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1EaXJlY3Rpb25PdXRnb2luZyAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1EaXJlY3Rpb25JbnRlcm5hbCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJEaXJlY3Rpb24gSW50ZXJuYWwiIHRpdGxlPSIkVGV4dHsiSW50ZXJuYWwgbWVzc2FnZSJ9Ij48L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iU29ydERhdGEiIHZhbHVlPSIyIiAvPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbURpcmVjdGlvbkludGVybmFsIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IkZyb20iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJGcm9tIn0iPjxhIGhyZWY9IiMiPiRRRGF0YXsiRnJvbVJlYWxuYW1lIiwiMzQifTwvYT48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGNsYXNzPSJTb3J0RGF0YSIgdmFsdWU9IiRRRGF0YXsiRnJvbSJ9IiAvPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IlN1YmplY3QiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiB0aXRsZT0iJFFEYXRheyJTdWJqZWN0In0iPjxhIGhyZWY9IiMiPiRRRGF0YXsiU3ViamVjdCIsIjM2In08L2E+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBjbGFzcz0iU29ydERhdGEiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJDcmVhdGVkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiMiPiRUaW1lU2hvcnR7IiRRRGF0YXsiQ3JlYXRlZCJ9In08L2E+CiMgSW5jbHVkZSBjdXN0b20gc29ydGluZyBpbmZvcm1hdGlvbjogZGF0ZSBpbiBJU08gZm9ybWF0LgojIE90aGVyIGRhdGUgZm9ybWF0cyBjYW5ub3QgYmUgc29ydGVkIHJlbGlhYmx5LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgY2xhc3M9IlNvcnREYXRhIiB2YWx1ZT0iJFFEYXRheyJDcmVhdGVkIn0iIC8+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iQXR0YWNobWVudHMgQXR0YWNobWVudCBGaXhlZCBOb25UZXh0Q29udGVudCI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudCAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1BdHRhY2htZW50SWNvblNpbmdsZSAtLT4KIyBzaG93IGF0dGFjaG1lbnQgcHJldmlldyBkYXRhIGluIHRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBdHRhY2htZW50IiB0aXRsZT0iJFRleHR7IkF0dGFjaG1lbnQifSAkUURhdGF7IkZpbGVuYW1lIn0gKCRRRGF0YXsiRmlsZXNpemUifSkiIHJlbD0iVGlja2V0QXR0YWNobWVudCRRRGF0YXsiQ291bnQifSI+PC9hPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRJY29uU2luZ2xlIC0tPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRJY29uTXVsdGlwbGUgLS0+CiMgbm8gcHJldmlldyBkYXRhIGluIHRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJBdHRhY2htZW50IiB0aXRsZT0iJFRleHR7IkF0dGFjaG1lbnRzIn0iIHJlbD0iVGlja2V0QXR0YWNobWVudCRRRGF0YXsiQ291bnQifSI+PC9hPgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRJY29uTXVsdGlwbGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUaWNrZXRBdHRhY2htZW50JFFEYXRheyJDb3VudCJ9IiBjbGFzcz0iQXR0YWNobWVudERhdGEgSGlkZGVuIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBdHRhY2htZW50IElubmVyQ29udGVudCI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudEl0ZW0gLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnRFbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz4KIyBidWdmaXggZm9yIGJ1ZyM1NTc5IC0gU3BhY2VzIGluIGZpbGVuYW1lcyBhcmUgY29udmVydGVkIHRvICsgY2hhcmFjdGVycyB3aGVuIGRvd25sb2FkaW5nIGluIElFLgojICRRRGF0YXsiRmlsZW5hbWUifSBuZWVkIHRvIGJlIHRoZSBmaWxlbmFtZSwgdGFrZSBjYXJlIHRoYXQgaXQgaXMgbm90ICRMUURhdGF7IiJ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJEVudnsiQ0dJSGFuZGxlIn0vJFFEYXRheyJGaWxlbmFtZSJ9P0FjdGlvbj1BZ2VudFRpY2tldEF0dGFjaG1lbnQ7QXJ0aWNsZUlEPSRMUURhdGF7IkFydGljbGVJRCJ9O0ZpbGVJRD0kTFFEYXRheyJGaWxlSUQifSIgJERhdGF7IlRhcmdldCJ9PiRRRGF0YXsiRmlsZW5hbWUifTwvYT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4kUURhdGF7IkZpbGVzaXplIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpUcmVlSXRlbUF0dGFjaG1lbnRJdGVtIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtQXR0YWNobWVudCAtLT4KPCEtLSBkdGw6YmxvY2s6VHJlZUl0ZW1Ob0F0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iTm9Db250ZW50Ij48L3NwYW4+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtTm9BdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRyZWVJdGVtIC0tPgogICAgICAgICAgICAgICAgPC90Ym9keT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJIYW5kbGUgdWktcmVzaXphYmxlLWhhbmRsZSB1aS1yZXNpemFibGUtcyI+CiAgICAgICAgICAgIDxhIGhyZWY9IiMiPiRUZXh0eyJSZXNpemUifTwvYT4KICAgICAgICA8L2Rpdj4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VHJlZSAtLT4KCjwhLS0gZHRsOmJsb2NrOkFydGljbGVJdGVtIC0tPgo8ZGl2PgogICAgPGEgbmFtZT0iQXJ0aWNsZSRRRGF0YXsiQXJ0aWNsZUlEIn0iPjwvYT4KICAgIDxkaXYgY2xhc3M9IldpZGdldEJveCBTcGFjaW5nVG9wIEV4cGFuZGVkIj4KICAgICAgICA8ZGl2IGNsYXNzPSJMaWdodFJvdyBIZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJXaWRnZXRBY3Rpb24gVG9nZ2xlIj48YSBocmVmPSIjIiB0aXRsZT0iJFRleHR7IlNob3cgb3IgaGlkZSB0aGUgY29udGVudCJ9Ij48c3Bhbj48L3NwYW4+PC9hPjwvZGl2PgogICAgICAgICAgICA8aDI+IyRRRGF0YXsiQ291bnQifSAmbmRhc2g7ICRRRGF0YXsiU3ViamVjdCIsIjYwIn08L2gyPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJBZGRpdGlvbmFsSW5mb3JtYXRpb24gU3BhY2luZ1JpZ2h0Ij4KICAgICAgICAgICAgICAgICRUZXh0eyJDcmVhdGVkIn06ICRUaW1lU2hvcnR7IiREYXRheyJDcmVhdGVkIn0ifQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJMaWdodFJvdyBCb3R0b20iPgogICAgICAgICAgICA8dWwgY2xhc3M9IkFjdGlvbnMiPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlTWVudS0tPgogICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn0kRGF0YXsiTGluayJ9IiBjbGFzcz0iJFFEYXRheyJDbGFzcyJ9IiAkRGF0YXsiTGlua1BhcmFtIn0gdGl0bGU9IiRUZXh0eyIkRGF0YXsiRGVzY3JpcHRpb24ifSJ9Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9PC9hPgogICAgICAgICAgICAgICAgPC9saT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZU1lbnUtLT4KCjwhLS0gZHRsOmJsb2NrOkFydGljbGVSZXBseUFzRHJvcGRvd24gLS0+CiAgICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICAgICAgPGZvcm0gdGl0bGU9IiRUZXh0eyIkRGF0YXsiTmFtZSJ9In0iIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0iZ2V0IiBpZD0iJFFEYXRheyJGb3JtSUQifSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFjdGlvbiIgdmFsdWU9IiRRRGF0YXsiQWN0aW9uIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iVGlja2V0SUQiIHZhbHVlPSIkUURhdGF7IlRpY2tldElEIn0iLz4KICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZUlEIiB2YWx1ZT0iJFFEYXRheyJBcnRpY2xlSUQifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJSZXBseUFsbCIgdmFsdWU9IiRRRGF0YXsiUmVwbHlBbGwifSIvPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSIkUURhdGF7IlJlc3BvbnNlRWxlbWVudElEIn0iIGNsYXNzPSJJbnZpc2libGVUZXh0Ij4kVGV4dHsiJERhdGF7Ik5hbWUifSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJTdGFuZGFyZFJlc3BvbnNlc1N0cmcifQogICAgICAgICAgICAgICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVJlcGx5QXNEcm9wZG93bkpTT25Mb2FkIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKJCgnIyRRRGF0YXsiRm9ybUlEIn0gc2VsZWN0W25hbWU9UmVzcG9uc2VJRF0nKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgIHZhciBVUkw7CgogICAgaWYgKCQodGhpcykudmFsKCkgPiAwKSB7CiAgICAgICAgVVJMID0gQ29yZS5Db25maWcuR2V0KCdCYXNlbGluaycpICsgJCh0aGlzKS5wYXJlbnRzKCkuc2VyaWFsaXplKCk7CiAgICAgICAgQ29yZS5VSS5Qb3B1cC5PcGVuUG9wdXAoVVJMLCAnVGlja2V0QWN0aW9uJyk7CiAgICAgICAgLy8gcmVzZXQgdGhlIHNlbGVjdCBib3ggc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBhZ2FpbiBmcm9tIHRoZSBzYW1lIHdpbmRvdwogICAgICAgICQodGhpcykudmFsKCcwJyk7CiAgICB9Cn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlUmVwbHlBc0Ryb3Bkb3duSlNPbkxvYWQgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVSZXBseUFzRHJvcGRvd25KU1N0YXRpYyAtLT4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwokKCcjJFFEYXRheyJGb3JtSUQifSBzZWxlY3RbbmFtZT1SZXNwb25zZUlEXScpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgdmFyIFVSTDsKCiAgICBpZiAoJCh0aGlzKS52YWwoKSA+IDApIHsKICAgICAgICBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJykgKyAkKHRoaXMpLnBhcmVudHMoKS5zZXJpYWxpemUoKTsKICAgICAgICBDb3JlLlVJLlBvcHVwLk9wZW5Qb3B1cChVUkwsICdUaWNrZXRBY3Rpb24nKTsKICAgICAgICAvLyByZXNldCB0aGUgc2VsZWN0IGJveCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFnYWluIGZyb20gdGhlIHNhbWUgd2luZG93CiAgICAgICAgJCh0aGlzKS52YWwoJzAnKTsKICAgIH0KfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlUmVwbHlBc0Ryb3Bkb3duSlNTdGF0aWMgLS0+CiAgICAgICAgICAgICAgICA8L2xpPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlUmVwbHlBc0Ryb3Bkb3duIC0tPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhckxlZnQiPjwvZGl2PgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQXJ0aWNsZU1haWxIZWFkZXIiPgogICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbFNtYWxsIj4KPCEtLSBkdGw6YmxvY2s6Um93UmVjaXBpZW50IC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiJERhdGF7IktleSJ9In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiIHRpdGxlPSIkUURhdGF7IlZhbHVlIn0iPiRRRGF0YXsiUmVhbG5hbWUiLCIyMDAifTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlJvd1JlY2lwaWVudCAtLT4KPCEtLSBkdGw6YmxvY2s6Um93RGF0YSAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IiREYXRheyJLZXkifSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMjAwIn08L3A+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpSb3dEYXRhIC0tPgoKIyBzaG93IHRoZSBBcnRpY2xlRnJlZUtleTEtMyBhbmQgQXJ0aWNsZUZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICA8bGFiZWw+JFFEYXRheyJLZXkifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPSJWYWx1ZSIgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjE2MCJ9PC9wPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUZyZWVUZXh0IC0tPgoKIyBzaG93IGFydGljbGUgb3B0aW9ucyBsaWtlIHNpZ25lZCwgY3J5cHRlZCwgLi4uCjwhLS0gZHRsOmJsb2NrOkFydGljbGVPcHRpb24gLS0+CiAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSIgY2xhc3M9IiRRRGF0YXsiUmVzdWx0In0gVmFsdWUiPiRRRGF0YXsiVmFsdWUiLCIxNjAifTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZU9wdGlvbiAtLT4KCiMgc2hvdyBhcnRpY2xlIGFjY291bnRlZCB0aW1lCjwhLS0gZHRsOmJsb2NrOkFydGljbGVBY2NvdW50ZWRUaW1lIC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiJERhdGF7IktleSJ9In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz0iVmFsdWUiPiRRRGF0YXsiVmFsdWUifTwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBY2NvdW50ZWRUaW1lIC0tPgoKIyBzaG93IGF0dGFjaG1lbnRzCjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kVGV4dHsiQXR0YWNobWVudCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9IlZhbHVlIj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3cgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93TGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iJERhdGF7IkxpbmsifSIgJERhdGF7IlRhcmdldCJ9IHRpdGxlPSIkVGV4dHsiJERhdGF7IkFjdGlvbiJ9In0iPiRRRGF0YXsiRmlsZW5hbWUifTwvYT4sICRRRGF0YXsiRmlsZXNpemUifQo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd0xpbmsgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAkUURhdGF7IkZpbGVuYW1lIn0sICRRRGF0YXsiRmlsZXNpemUifQo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGJyIC8+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgIDwvcD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVNYWlsQ29udGVudCI+CjwhLS0gZHRsOmJsb2NrOkJvZHlQbGFpbiAtLT4KJERhdGF7IkJvZHlOb3RlIn0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkFydGljbGVCb2R5Ij4KJERhdGF7IkJvZHkifQogICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkJvZHlQbGFpbiAtLT4KPCEtLSBkdGw6YmxvY2s6Qm9keUhUTUwgLS0+CiAgICAgICAgICAgICAgICA8ZGl2PgojIGV4ZWN1dGUgSUZyYW1lIEpTIGFzeW5jaHJvbm91c2x5LiBPdGhlcndpc2UgaXQgY291bGQgaGFwcGVuIGJlZm9yZSBvdXIgQVBJIHdhcyBsb2FkZWQKICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHdpZHRoPSIxMDAlIiBmcmFtZWJvcmRlcj0iMCIgaWQ9IklmcmFtZSRRRGF0YXsiQXJ0aWNsZUlEIn0iIG9ubG9hZD0id2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uICgpeyBpZiAodHlwZW9mIENvcmUgPT09ICdvYmplY3QnICYmIHR5cGVvZiBDb3JlLkFnZW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgQ29yZS5BZ2VudC5UaWNrZXRab29tID09PSAnb2JqZWN0JykgeyBDb3JlLkFnZW50LlRpY2tldFpvb20uSWZyYW1lQXV0b0hlaWdodCgkKCcjSWZyYW1lJFFEYXRheyJBcnRpY2xlSUQifScpKTsgfSB9LCA1MDApOyIgc3JjPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn07RmlsZUlEPSRRRGF0YXsiQXR0YWNobWVudElET2ZIVE1MQm9keSJ9Ij48L2lmcmFtZT4KICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpCb2R5SFRNTCAtLT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVJdGVtTWFya0FzU2VlbiAtLT4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRab29tLk1hcmtBc1NlZW4oJFFEYXRheyJUaWNrZXRJRCJ9LCAkUURhdGF7IkFydGljbGVJRCJ9KTsKLy9dXT48L3NjcmlwdD4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVJdGVtTWFya0FzU2VlbiAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUl0ZW0gLS0+CgoKPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRab29tLkluaXQoeyBBcnRpY2xlVGFibGVIZWlnaHQ6IHBhcnNlSW50KCckRW52eyJVc2VyVGlja2V0Wm9vbUFydGljbGVUYWJsZUhlaWdodCJ9JywgMTApfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo=
IyAtLQojIEN1c3RvbWVyVGlja2V0UHJpbnQuZHRsIC0gcHJvdmlkZXMgSFRNTCBwcmludCB2aWV3CiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBDdXN0b21lclRpY2tldFByaW50LmR0bCx2IDEuNSAyMDEwLzEyLzA2IDE5OjMzOjA5IGVuIEV4cCAkCiMgJE9sZElkOiBDdXN0b21lclRpY2tldFByaW50LmR0bCx2IDEuMTYgMjAxMC8xMS8yNiAxMzoyOToyNCBtYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIwIiB3aWR0aD0iMTAwJSI+CiAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JENvbmZpZ3siVGlja2V0OjpIb29rIn06ICRRRGF0YXsiVGlja2V0TnVtYmVyIn0gLyAkUURhdGF7IlRpdGxlIn08L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgYWxpZ249InJpZ2h0Ij48c21hbGw+JFRleHR7IlRpY2tldCBQcmludCJ9PC9zbWFsbD48L3RkPgogICAgPC90cj4KPC90YWJsZT4KPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHNwYWNpbmc9IjEiIGNlbGxwYWRkaW5nPSIxMCIgd2lkdGg9IjEwMCUiPgogICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+JFRleHR7IlN0YXRlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjYwJSI+JFRleHR7IiREYXRheyJTdGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KIyBJVFNNCiMgLS0tCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJQcmlvcml0eSJ9OjwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IlByaW9yaXR5In0ifTwvdGQ+CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJRdWV1ZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiUXVldWUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlR5cGUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlR5cGUifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRUeXBlIC0tPgo8IS0tIGR0bDpibG9jazpUaWNrZXRTZXJ2aWNlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNlcnZpY2UifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IlNlcnZpY2UifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNMQSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRRRGF0YXsiU0xBIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0U2VydmljZSAtLT4KIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQ3JpdGljYWxpdHkifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGV4dHsiJERhdGF7IkNyaXRpY2FsaXR5In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkltcGFjdCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiRUZXh0eyIkRGF0YXsiSW1wYWN0In0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlByaW9yaXR5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRleHR7IiREYXRheyJQcmlvcml0eSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KIyAtLS0KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iNTAlIiB2YWxpZ249InRvcCI+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkN1c3RvbWVySUQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kUURhdGF7IkN1c3RvbWVySUQifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjQwJSI+JFRleHR7IkFnZSJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiIHdpZHRoPSI2MCUiPiRRRGF0YXsiQWdlIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJDcmVhdGVkIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlNvbHV0aW9uIFRpbWUifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4kVGltZVNob3J0eyIkUURhdGF7IlNvbHV0aW9uVGltZURlc3RpbmF0aW9uRGF0ZSJ9In08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6U29sdXRpb25UaW1lIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMyIgY2VsbHBhZGRpbmc9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjMwJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjIwJSI+PC90ZD4KICAgICAgICAgICAgICAgICAgICA8dGQgd2lkdGg9IjMwJSI+PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CgojIHVzZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNob3cgVGlja2V0RnJlZUtleTEtMTYgYW5kIFRpY2tldEZyZWVUZXh0MS0xNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dEhlYWRlciAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+PGI+PGk+VGlja2V0RnJlZVRleHQ8L2k+PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dEhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkiLCIyMCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyMCJ9PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICA8dHI+CiMgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkxIiwiMjAifTo8L3RkPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4KIyAgICAgICAgICAgIDxkaXYgdGl0bGU9IiRRRGF0YXsiVGlja2V0RnJlZVRleHQifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyMCJ9PC9kaXY+CiMgICAgICAgICAgPC90ZD4KIyAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyAgICAgICAgPHRyPgojICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MiIsIjIwIn06PC90ZD4KIyAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+CiMgICAgICAgICAgICA8ZGl2IHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQyIiwiMjAifTwvZGl2PgojICAgICAgICAgIDwvdGQ+CiMgICAgICAgIDwvdHI+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiAgICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIGNlbGxzcGFjaW5nPSIzIiBjZWxscGFkZGluZz0iMCIgd2lkdGg9IjEwMCUiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMjAlIj48L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCB3aWR0aD0iMzAlIj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KCiMgdXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gc2hvdyBUaWNrZXRGcmVlVGltZTEtNgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUhlYWRlciAtLT4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICA8dGQgY29sc3Bhbj0iNCI+PGI+PGk+VGlja2V0RnJlZVRpbWU8L2k+PC9iPjwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZUhlYWRlciAtLT4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJERhdGF7IlRpY2tldEZyZWVUaW1lS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZSJ9In08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTEgLS0+CiMgICAgICAgICAgPHRyPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiJENvbmZpZ3siVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3RkPgojICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxkaXYgdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTEifSJ9PC9kaXY+PC90ZD4KIyAgICAgICAgICA8L3RyPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgIDx0cj4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IiRDb25maWd7IlRpY2tldEZyZWVUaW1lS2V5MiJ9In06PC90ZD4KIyAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48ZGl2IHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMiJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifTwvZGl2PjwvdGQ+CiMgICAgICAgICAgPC90cj4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMiAtLT4KICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L3RkPgogICAgPC90cj4KICAgIDx0cj4KICAgICAgICA8dGQgY29sc3Bhbj0iNCIgY2xhc3M9ImNvbnRlbnRrZXkiPgogICAgICAgICAgICAkVGV4dHsiQ3VzdG9tZXIgSW5mbyJ9OgogICAgICAgICAgICAkRGF0YXsiQ3VzdG9tZXJUYWJsZSJ9CiAgICAgICAgPC90ZD4KICAgIDwvdHI+CjwvdGFibGU+CjwhLS0gc3RhcnQgdGlja2V0ICREYXRheyJUaWNrZXROdW1iZXIifSAtLT4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjY0MCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBiZ2NvbG9yPSIjMDAwMDAwIiBjbGFzcz0iY29udGFpbmVyIj4KICAgIDx0cj4KICAgICAgICA8dGQ+CiAgICAgICAgICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSI2NDAiIGNlbGxwYWRkaW5nPSIxMCIgY2VsbHNwYWNpbmc9IjEiIGJnY29sb3I9IiNmZmZmZmYiPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHIgYmdjb2xvcj0iI2ZmZmZmZiI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMTAwJSIgY2xhc3M9InNtYWxsIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMSI+CiMgRnJvbTosIFRvOiwgQ2M6CjwhLS0gZHRsOmJsb2NrOlJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iODUlIj4gPGRpdiB0aXRsZT0iJFFEYXRheyJWYWx1ZSJ9Ij4kUURhdGF7IlZhbHVlIiwiMTYwIn08L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNyZWF0ZWQifTo8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj4gJFRpbWVMb25neyIkRGF0YXsiQ3JlYXRlZCJ9In0gJFRleHR7ImJ5In0gJFRleHR7IiREYXRheyJTZW5kZXJUeXBlIn0ifTwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgojIHNob3cgdGhlIEFydGljbGU6OkZyZWVLZXkxLTMgYW5kIEFydGljbGU6OkZyZWVUZXh0MS0zCjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIxNSUiPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9Ijg1JSI+IDxkaXYgdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJWYWx1ZSIsIjE2MCJ9PC9kaXY+PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUeXBlIn06PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+ICRUZXh0eyIkRGF0YXsiQXJ0aWNsZVR5cGUifSJ9PC90ZD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij4kVGV4dHsiQXR0YWNobWVudCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPiAkRGF0YXsiQXJ0aWNsZTo6QVRNIn08L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KJERhdGF7IlRleHROb3RlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByZT4KJERhdGF7IkJvZHkifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3ByZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KPCEtLSBlbmQgdGlja2V0IC0tPgogICAgICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvdGQ+CiAgICA8L3RyPgo8L3RhYmxlPgo8YnIvPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlIC0tPgo=
IyAtLQojIEN1c3RvbWVyVGlja2V0Wm9vbS5kdGwgLSBwcm92aWRlcyBIVE1MIFRpY2tldFpvb20gZm9yIEN1c3RvbWVyVGlja2V0Wm9vbS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3VzdG9tZXJUaWNrZXRab29tLmR0bCx2IDEuMTkgMjAxMC8xMi8wNiAxOTozMzowOSBlbiBFeHAgJAojICRJZDogQ3VzdG9tZXJUaWNrZXRab29tLmR0bCx2IDEuMTkgMjAxMC8xMi8wNiAxOTozMzowOSBlbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQo8ZGl2IGlkPSJNYWluQm94IiBjbGFzcz0iVGlja2V0Wm9vbSBBUklBUm9sZU1haW4iPgo8IS0tIGR0bDpibG9jazpCYWNrIC0tPgogICAgPGRpdiBjbGFzcz0iQWN0aW9uUm93Ij4KICAgICAgICA8dWwgY2xhc3M9IlRhYnMiPgogICAgICAgICAgICA8bGk+PGEgaHJlZj0iJEVudnsiQmFzZWxpbmsifSRFbnZ7Ikxhc3RTY3JlZW5PdmVydmlldyJ9Ij4mbGFycjsgJFRleHR7IkJhY2sifTwvYT48L2xpPgogICAgICAgIDwvdWw+CiAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkJhY2sgLS0+CiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJUaWNrZXRIZWFkZXIiPgogICAgICAgICAgICA8aDIgdGl0bGU9IiRRRGF0YXsiVGl0bGUifSI+CiAgICAgICAgICAgICAgICA8c3BhbiB0aXRsZT0iJFRleHR7IiREYXRheyJTdGF0ZVR5cGVHZW5lcmljIn0ifSIgaWQ9IkZsYWciIGNsYXNzPSIkUURhdGF7IlN0YXRlVHlwZUdlbmVyaWMifSI+PHNwYW4+JFRleHR7IiREYXRheyJTdGF0ZVR5cGVHZW5lcmljIn0ifTwvc3Bhbj48L3NwYW4+CiAgICAgICAgICAgICAgICAkUURhdGF7IlRpdGxlIiwiNjUifQogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IlRpY2tldEhvb2siPiRRRGF0YXsiVGlja2V0TnVtYmVyIn08L3NwYW4+CiAgICAgICAgICAgIDwvaDI+CiAgICAgICAgICAgIDx1bCBpZD0iTWV0YWRhdGEiPgo8IS0tIGR0bDpibG9jazpUeXBlIC0tPgogICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyJUeXBlIn06PC9zcGFuPiA8c3BhbiB0aXRsZT0iJFFEYXRheyJUeXBlIn0iPiRRRGF0YXsiVHlwZSIsIjE4In08L3NwYW4+PC9saT4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij4kVGV4dHsiU2VydmljZSJ9Ojwvc3Bhbj4gPHNwYW4gdGl0bGU9IiRUZXh0eyIkRGF0YXsiU2VydmljZSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTZXJ2aWNlIn0ifSIsIjE4In08L3NwYW4+PC9saT4KPCEtLSBkdGw6YmxvY2s6U2VydmljZSAtLT4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyJTTEEifTo8L3NwYW4+IDxzcGFuIHRpdGxlPSIkVGV4dHsiJERhdGF7IlNMQSJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJTTEEifSJ9IiwiMTgifTwvc3Bhbj48L2xpPgo8IS0tIGR0bDpibG9jazpTTEEgLS0+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyJDcml0aWNhbGl0eSJ9Ojwvc3Bhbj4gPHNwYW4gdGl0bGU9IiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiQ3JpdGljYWxpdHkifSJ9IiwiMTgifTwvc3Bhbj48L2xpPgogICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyJJbXBhY3QifTo8L3NwYW4+IDxzcGFuIHRpdGxlPSIkVGV4dHsiJERhdGF7IkltcGFjdCJ9In0iPiRRdW90ZXsiJFRleHR7IiREYXRheyJJbXBhY3QifSJ9IiwiMTgifTwvc3Bhbj48L2xpPgojIC0tLQo8IS0tIGR0bDpibG9jazpTdGF0ZSAtLT4KICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij4kVGV4dHsiU3RhdGUifTo8L3NwYW4+IDxzcGFuIHRpdGxlPSIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSI+JFF1b3RleyIkVGV4dHsiJERhdGF7IlN0YXRlIn0ifSIsIjE4In08L3NwYW4+PC9saT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgogICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyJQcmlvcml0eSJ9Ojwvc3Bhbj4gPHNwYW4gdGl0bGU9IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9Ij4kUXVvdGV7IiRUZXh0eyIkRGF0YXsiUHJpb3JpdHkifSJ9IiwiMTgifTwvc3Bhbj48L2xpPgo8IS0tIGR0bDpibG9jazpQcmlvcml0eSAtLT4KPCEtLSBkdGw6YmxvY2s6UXVldWUgLS0+CiAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+JFRleHR7IlF1ZXVlIn06PC9zcGFuPiA8c3BhbiB0aXRsZT0iJFFEYXRheyJRdWV1ZSJ9Ij4kUURhdGF7IlF1ZXVlIiwiMTgifTwvc3Bhbj48L2xpPgo8IS0tIGR0bDpibG9jazpRdWV1ZSAtLT4KIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVLZXkxLTE2IGFuZCBUaWNrZXRGcmVlVGV4dDEtMTYKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5IiwiMjAifTo8L3NwYW4+IDxzcGFuIHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0In0iPiRRRGF0YXsiVGlja2V0RnJlZVRleHQiLCIyMCJ9PC9zcGFuPjwvbGk+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0IC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+JFFEYXRheyJUaWNrZXRGcmVlS2V5MSIsIjIwIn06PC9zcGFuPiA8c3BhbiB0aXRsZT0iJFFEYXRheyJUaWNrZXRGcmVlVGV4dDEifSI+JFFEYXRheyJUaWNrZXRGcmVlVGV4dDEiLCIyMCJ9PC9zcGFuPjwvbGk+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGV4dDIgLS0+CiMgICAgICAgICAgICAgICAgICAgIDxsaT48c3BhbiBjbGFzcz0iS2V5Ij4kUURhdGF7IlRpY2tldEZyZWVLZXkyIiwiMjAifTo8L3NwYW4+IDxzcGFuIHRpdGxlPSIkUURhdGF7IlRpY2tldEZyZWVUZXh0MiJ9Ij4kUURhdGF7IlRpY2tldEZyZWVUZXh0MiIsIjIwIn08L3NwYW4+PC9saT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUZXh0MiAtLT4KIyB1c2UgdGhpcyBpZiB5b3Ugd2FudCB0byBzaG93IFRpY2tldEZyZWVUaW1lMS02CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgogICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyIkRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifSJ9Ojwvc3Bhbj4gPHNwYW4gdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUifSJ9Ij4kVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lIn0ifTwvc3Bhbj48L2xpPgo8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZSAtLT4KIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICAgICAgPGxpPjxzcGFuIGNsYXNzPSJLZXkiPiRUZXh0eyIkRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkxIn0ifTo8L3NwYW4+IDxzcGFuIHRpdGxlPSIkVGltZVNob3J0eyIkUURhdGF7IlRpY2tldEZyZWVUaW1lMSJ9In0iPiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0ifTwvc3Bhbj48L2xpPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgICAgICA8bGk+PHNwYW4gY2xhc3M9IktleSI+JFRleHR7IiREYXRheyJUaWNrZXRGcmVlVGltZUtleTIifSJ9Ojwvc3Bhbj4gPHNwYW4gdGl0bGU9IiRUaW1lU2hvcnR7IiRRRGF0YXsiVGlja2V0RnJlZVRpbWUyIn0ifSI+JFRpbWVTaG9ydHsiJFFEYXRheyJUaWNrZXRGcmVlVGltZTIifSJ9PC9zcGFuPjwvbGk+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+CjwhLS0gZHRsOmJsb2NrOlByaW50IC0tPgogICAgICAgICAgICAgICAgPGxpPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249Q3VzdG9tZXJUaWNrZXRQcmludDtUaWNrZXRJRD0kTFFEYXRheyJUaWNrZXRJRCJ9IiBjbGFzcz0iUHJpbnQgQXNQb3B1cCIgdGl0bGU9IiRUZXh0eyJQcmludCJ9Ij4kVGV4dHsiUHJpbnQifTwvYT48L2xpPgo8IS0tIGR0bDpibG9jazpQcmludCAtLT4KICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0jRm9sbG93VXAiIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSJDdXN0b21lclRpY2tldFpvb20iIC8+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIiAvPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQXJ0aWNsZUlEIiB2YWx1ZT0iJFFEYXRheyJBcnRpY2xlSUQifSIgLz4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRm9ybUlEIiB2YWx1ZT0iJFFEYXRheyJGb3JtSUQifSIgLz4KICAgICAgICAgICAgPHVsIGlkPSJNZXNzYWdlcyI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGUgLS0+CiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9IiRRRGF0YXsiU2VuZGVyVHlwZSJ9ICRRRGF0YXsiQXJ0aWNsZVR5cGUifSAkUURhdGF7IkNsYXNzIn0iPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VIZWFkZXIiPgoKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUNvbnRyYWN0ZWQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxoMz48YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9O1RpY2tldElEPSRMUURhdGF7IlRpY2tldElEIn07QXJ0aWNsZUlEPSRMUURhdGF7IkFydGljbGVJRCJ9Ij4kUURhdGF7IkZyb21SZWFsbmFtZSIsIjYwIn0gJm5kYXNoOyA8c3BhbiB0aXRsZT0iJFRleHR7IkV4cGFuZCBhcnRpY2xlIn0uLi4iPiRRRGF0YXsiU3ViamVjdCIsIjEyMCJ9PC9zcGFuPjwvYT48L2gzPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQ29udHJhY3RlZCAtLT4KCjwhLS0gZHRsOmJsb2NrOkFydGljbGVFeHBhbmRlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGgzPjxhIGhyZWY9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249JEVudnsiQWN0aW9uIn07VGlja2V0SUQ9JExRRGF0YXsiVGlja2V0SUQifTtBcnRpY2xlSUQ9JExRRGF0YXsiQXJ0aWNsZUlEIn0iPiRRRGF0YXsiRnJvbVJlYWxuYW1lIiwiNjAifSAmbmRhc2g7IDxzcGFuIHRpdGxlPSIkUURhdGF7IlN1YmplY3QifSI+JFFEYXRheyJTdWJqZWN0IiwiMTIwIn08L3NwYW4+PC9hPjwvaDM+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVFeHBhbmRlZCAtLT4KCiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJBZ2UiIHRpdGxlPSIkVGltZUxvbmd7IiRRRGF0YXsiQ3JlYXRlZCJ9In0iPiREYXRheyJBZ2UifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IkFydGljbGVTdGF0ZSIgdmFsdWU9InVudG91Y2hlZCIgLz4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQm9keSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkRldGFpbHMgU2VwZXJhdG9yUm93Ij4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L2Rpdj4gPHNwYW4gdGl0bGU9IiRRRGF0YXsiVmFsdWUifSI+JFFEYXRheyJSZWFsbmFtZSIsIjEwMCJ9PC9zcGFuPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlUm93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJMYWJlbCI+JFRleHR7IlN1YmplY3QifTo8L2Rpdj4gPHNwYW4gdGl0bGU9IiRRRGF0YXsiU3ViamVjdCJ9Ij4kUURhdGF7IlN1YmplY3QiLCIxMDAifTwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBdHRhY2htZW50cyI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGFiZWwiPiRUZXh0eyIkRGF0YXsiS2V5In0ifTo8L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvdyAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9IkRvd25sb2FkQXR0YWNobWVudCIgdGl0bGU9IiRRRGF0YXsiRmlsZW5hbWUifSAtICRRRGF0YXsiRmlsZXNpemUifSI+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93TGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9IiREYXRheyJMaW5rIn0iICREYXRheyJUYXJnZXQifSB0aXRsZT0iJFRleHR7IiREYXRheyJBY3Rpb24ifSJ9Ij4kUURhdGF7IkZpbGVuYW1lIn08L2E+LCAkUURhdGF7IkZpbGVzaXplIn0KPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZUF0dGFjaG1lbnRSb3dMaW5rIC0tPgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudFJvd05vTGluayAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRmlsZW5hbWUifSwgJFFEYXRheyJGaWxlc2l6ZSJ9CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93Tm9MaW5rIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+CjwhLS0gZHRsOmJsb2NrOkFydGljbGVBdHRhY2htZW50Um93IC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlQXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Ik1lc3NhZ2VDb250ZW50Ij4KPCEtLSBkdGw6YmxvY2s6Qm9keVBsYWluIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IkJvZHlOb3RlIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1lc3NhZ2UiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJCb2R5In0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpCb2R5UGxhaW4gLS0+CjwhLS0gZHRsOmJsb2NrOkJvZHlIVE1MTG9hZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZnJhbWUgdGl0bGU9ImFib3V0OmJsYW5rIiBmcmFtZWJvcmRlcj0iMCIgaWQ9IlZpc2libGVGcmFtZSIgc3JjPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUN1c3RvbWVyVGlja2V0QXR0YWNobWVudDtTdWJhY3Rpb249SFRNTFZpZXc7QXJ0aWNsZUlEPSRRRGF0YXsiQXJ0aWNsZUlEIn07RmlsZUlEPSRRRGF0YXsiQXR0YWNobWVudElET2ZIVE1MQm9keSJ9Ij48L2lmcmFtZT4KPCEtLSBkdGw6YmxvY2s6Qm9keUhUTUxMb2FkIC0tPgo8IS0tIGR0bDpibG9jazpCb2R5SFRNTFBsYWNlaG9sZGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlmcmFtZSBzcmM9ImFib3V0OmJsYW5rIiBmcmFtZWJvcmRlcj0iMCIgdGl0bGU9IiRFbnZ7IkJhc2VsaW5rIn1BY3Rpb249Q3VzdG9tZXJUaWNrZXRBdHRhY2htZW50O1N1YmFjdGlvbj1IVE1MVmlldztBcnRpY2xlSUQ9JFFEYXRheyJBcnRpY2xlSUQifTtGaWxlSUQ9JFFEYXRheyJBdHRhY2htZW50SURPZkhUTUxCb2R5In0iPjwvaWZyYW1lPgo8IS0tIGR0bDpibG9jazpCb2R5SFRNTFBsYWNlaG9sZGVyIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkFydGljbGUgLS0+CiAgICAgICAgICAgIDwvdWw+IDwhLS0gL01lc3NhZ2VzIC0tPgo8IS0tIGR0bDpibG9jazpGb2xsb3dVcCAtLT4KICAgICAgICAgICAgPGRpdiBpZD0iRm9sbG93VXAiIGNsYXNzPSIkUURhdGF7IkZvbGxvd1VwVmlzaWJsZSJ9Ij4KICAgICAgICAgICAgICAgIDxkaXYgaWQ9Ik1lc3NlbmdlciI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPSJEb250UHJpbnQiIHR5cGU9InRleHQiIG5hbWU9IlN1YmplY3QiIGlkPSJTdWJqZWN0IiB2YWx1ZT0iJFFEYXRheyJTdWJqZWN0In0iIC8+CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0LS0+CiAgICAgICAgICAgICAgICAgICAgJEluY2x1ZGV7IkN1c3RvbWVyUmljaFRleHRFZGl0b3IifQo8IS0tIGR0bDpibG9jazpSaWNoVGV4dC0tPgogICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSB0aXRsZT0iJFRleHR7IlJlcGx5In0iIGlkPSJSaWNoVGV4dCIgY2xhc3M9IlJpY2hUZXh0IERvbnRQcmludCBWYWxpZGF0ZV9SZXF1aXJlZCAkUURhdGF7IlJpY2hUZXh0SW52YWxpZCJ9IiBuYW1lPSJCb2R5IiByb3dzPSIxNSIgY29scz0iJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGV4dEFyZWFOb3RlIn0iPiRRRGF0YXsiQm9keSJ9PC90ZXh0YXJlYT4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0U2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIE5vSmF2YVNjcmlwdE1lc3NhZ2UkUURhdGF7IlJpY2hUZXh0SW52YWxpZCJ9Ij4KICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJEb250UHJpbnQiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJBdHRhY2htZW50SG9sZGVyIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IkF0dGFjaG1lbnQiPiRUZXh0eyJBdHRhY2htZW50In06PC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJmaWxlX3VwbG9hZCIgdGl0bGU9IkF0dGFjaG1lbnQiIGlkPSJBdHRhY2htZW50IiB0eXBlPSJmaWxlIiBzaXplPSIzMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50VXBsb2FkIiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iMCIgLz4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNBdHRhY2htZW50JykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0F0dGFjaG1lbnQnKS5jbG9zZXN0KCdmb3JtJyk7CiAgICAgICAgQ29yZS5Gb3JtLlZhbGlkYXRlLkRpc2FibGVWYWxpZGF0aW9uKCRGb3JtKTsKICAgICAgICAkRm9ybS5maW5kKCcjQXR0YWNobWVudFVwbG9hZCcpLnZhbCgnMScpLmVuZCgpLnN1Ym1pdCgpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KCjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwQXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkF0dGFjaG1lbnQiIHRpdGxlPSIkUURhdGF7IkZpbGVuYW1lIn0gLSAkUURhdGF7IkZpbGVzaXplIn0iPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRRRGF0YXsiRmlsZW5hbWUifQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiB0aXRsZT0iJFRleHR7IkRlbGV0ZSJ9ICRRRGF0YXsiRmlsZW5hbWUifSIgaWQ9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+JFRleHR7IkRlbGV0ZSJ9PC9idXR0b24+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJCgnI0F0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9JykuY2xvc2VzdCgnZm9ybScpKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rm9sbG93VXBBdHRhY2htZW50IC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6Rm9sbG93VXBTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9IlN0YXRlSUQiPiRUZXh0eyJOZXh0IHN0YXRlIn06PC9sYWJlbD4gJERhdGF7Ik5leHRTdGF0ZXNTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwU3RhdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwUHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJQcmlvcml0eUlEIj4kVGV4dHsiUHJpb3JpdHkifTo8L2xhYmVsPiAkRGF0YXsiUHJpb3JpdHlTdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwUHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJBY3Rpb25Sb3ciPgogICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+JFRleHR7IlN1Ym1pdCJ9PC9idXR0b24+ICRUZXh0eyJvciJ9IDxhIGlkPSJDbG9zZUJ1dHRvbiIgaHJlZj0iIj4kVGV4dHsiQ2FuY2VsIn08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxhIGlkPSJSZXBseUJ1dHRvbiIgY2xhc3M9IkRvbnRQcmludCIgaHJlZj0iIj4kVGV4dHsiUmVwbHkifTwvYT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkZvbGxvd1VwIC0tPgogICAgICAgIDwvZm9ybT4KICAgIDwvZGl2Pgo8L2Rpdj4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgIENvcmUuQ3VzdG9tZXIuVGlja2V0Wm9vbS5Jbml0KCk7CiAgICAkKCdhLkFzUG9wdXAnKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgIENvcmUuVUkuUG9wdXAuT3BlblBvcHVwKCQodGhpcykuYXR0cignaHJlZicpLCAnVGlja2V0QWN0aW9uJyk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Cjwvc2NyaXB0Pgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4K
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld01lZGl1bS5wbQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogVGlja2V0T3ZlcnZpZXdNZWRpdW0ucG0sdiAxLjggMjAxMC8xMi8wNiAxOTozMzowOSBlbiBFeHAgJAojICRPbGRJZDogVGlja2V0T3ZlcnZpZXdNZWRpdW0ucG0sdiAxLjQwIDIwMTAvMTIvMDIgMTE6MzI6MzAgbW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE92ZXJ2aWV3TWVkaXVtOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CgojIC0tLQojIElUU00KIyAtLS0KdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKIyAtLS0KdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gXCVQYXJhbTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgZm9yICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBVc2VySUQgVXNlck9iamVjdCBHcm91cE9iamVjdCBUaWNrZXRPYmplY3QgTWFpbk9iamVjdCBRdWV1ZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCVQYXJhbSk7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyglUGFyYW0pOwojIC0tLQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEFjdGlvblJvdyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3cnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCRCdWxrRmVhdHVyZSkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50QWN0aW9uUm93QnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgZm9yIHRhYmxlIGNvbnRyb2wKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeVN0YXJ0JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFNvcnRPcmRlckJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJzsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KFRpY2tldElEcyBQYWdlU2hvd24gU3RhcnRIaXQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIG15ICRCdWxrRmVhdHVyZSA9IDA7CiAgICBpZiAoICRQYXJhbXtCdWxrfSAmJiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmUnKSApIHsKICAgICAgICBteSBAR3JvdXBzOwogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSApIHsKICAgICAgICAgICAgQEdyb3VwcyA9IEB7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZUdyb3VwJykgfTsKICAgICAgICB9CiAgICAgICAgaWYgKCAhQEdyb3VwcyApIHsKICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgISRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn07CiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gZXEgJ1llcycgKSB7CiAgICAgICAgICAgICAgICAgICAgJEJ1bGtGZWF0dXJlID0gMTsKICAgICAgICAgICAgICAgICAgICBsYXN0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRIZWFkZXInLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJE91dHB1dE1ldGEgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgICA9ICcnOwogICAgbXkgJENvdW50ZXIgICAgICAgPSAwOwogICAgbXkgJENvdW50ZXJPblNpdGUgPSAwOwogICAgbXkgQFRpY2tldElEc1Nob3duOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHRpY2tldHMgdG8gc2hvdwogICAgaWYgKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldElEc30gfSApIHsKCiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0KICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNTaG93biwgJFRpY2tldElEOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT5fU2hvdygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50ZXJPblNpdGUsCiAgICAgICAgICAgICAgICAgICAgQnVsayAgICAgPT4gJEJ1bGtGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRQYXJhbXtDb25maWd9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDb3VudGVyT25TaXRlKys7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gJE91dHB1dCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkeyRPdXRwdXR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTm9UaWNrZXRGb3VuZCcgKTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzU2hvd24pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyQnVsa0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0TWV0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gXCRPdXRwdXRNZXRhICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0UmF3IC49ICRPdXRwdXRNZXRhOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gcm93IGpzIGRhdGEKCiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKc3ViIF9TaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBtb3ZlIHF1ZXVlcwogICAgbXkgJU1vdmVRdWV1ZXMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPk1vdmVMaXN0KAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgIEFjdGlvbiAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0FjdGlvbn0sCiAgICAgICAgVHlwZSAgICAgPT4gJ21vdmVfaW50bycsCiAgICApOwoKICAgICMgZ2V0IGxhc3QgYXJ0aWNsZQogICAgbXkgJUFydGljbGUgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVMYXN0Q3VzdG9tZXJBcnRpY2xlKAogICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICApOwoKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJEFydGljbGV7Q3JpdGljYWxpdHl9ID0gJy0nOwogICAgaWYgKCRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTN9KSB7CiAgICAgICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JEFydGljbGV7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkQXJ0aWNsZXtJbXBhY3R9ID0gJy0nOwogICAgaWYgKCRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskQXJ0aWNsZXtUaWNrZXRGcmVlVGV4dDE0fX07CiAgICB9CiMgLS0tCiAgICAjIHVzZXIgaW5mbwogICAgbXkgJVVzZXJJbmZvID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRBcnRpY2xle093bmVySUR9LAogICAgKTsKICAgICVBcnRpY2xlID0gKCAlVXNlckluZm8sICVBcnRpY2xlICk7CgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRBcnRpY2xle0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gcmVzcG9uc2VzIC4uLgogICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VzCiAgICAgICAgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3RhbmRhcmRSZXNwb25zZXMoIFF1ZXVlSUQgPT4gJEFydGljbGV7UXVldWVJRH0gKTsKCiAgICAkUGFyYW17U3RhbmRhcmRSZXNwb25zZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgRGF0YSA9PiBcJVN0YW5kYXJkUmVzcG9uc2VzLAogICAgKTsKCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntDdXN0b21lckluZm99ICkgewogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDdXN0b21lck5hbWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhY2wgYWN0aW9ucwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAnLScsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBydW4gdGlja2V0IHByZSBtZW51IG1vZHVsZXMKICAgIG15IEBBY3Rpb25JdGVtczsKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgfTsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBBQ0wgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBpZiAhJEl0ZW07CiAgICAgICAgICAgIG5leHQgaWYgcmVmICRJdGVtIG5lICdIQVNIJzsKICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KE5hbWUgTGluayBEZXNjcmlwdGlvbikpIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgISRJdGVtLT57JEtleX07CiAgICAgICAgICAgICAgICAkSXRlbS0+eyRLZXl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGUgPT4gJEl0ZW0tPnskS2V5fSwKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBzZXNzaW9uIGlkIGlmIG5lZWRlZAogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSURDb29raWV9ICYmICRJdGVtLT57TGlua30gKSB7CiAgICAgICAgICAgICAgICAkSXRlbS0+e0xpbmt9CiAgICAgICAgICAgICAgICAgICAgLj0gJzsnCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0gLiAnPScKICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY3JlYXRlIGlkCiAgICAgICAgICAgICRJdGVtLT57SUR9ID0gJEl0ZW0tPntOYW1lfTsKICAgICAgICAgICAgJEl0ZW0tPntJRH0gPX4gcy8oXHN8Jnw7KS8vaWc7CgogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkSXRlbS0+e0Jsb2NrfSB8fCAnRG9jdW1lbnRNZW51SXRlbScsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdNZWRpdW0nLAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXG4rLy9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvXHMrLyAvZzsKICAgICAgICAgICAgJE91dHB1dCA9fiBzLzxcIS0tLis/LS0+Ly9nOwoKICAgICAgICAgICAgcHVzaCBAQWN0aW9uSXRlbXMsIHsKICAgICAgICAgICAgICAgIEhUTUwgICAgICAgID0+ICRPdXRwdXQsCiAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICBMaW5rICAgICAgICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30gLiAkSXRlbS0+e0xpbmt9LAogICAgICAgICAgICAgICAgVGFyZ2V0ICAgICAgPT4gJEl0ZW0tPntUYXJnZXR9LAogICAgICAgICAgICAgICAgUG9wdXBUeXBlICAgPT4gJEl0ZW0tPntQb3B1cFR5cGV9LAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICA9PiAkSXRlbS0+e0Jsb2NrfSB8fCAnRG9jdW1lbnRNZW51SXRlbScsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICMgcHJlcGFyZSBzdWJqZWN0CiAgICAkQXJ0aWNsZXtTdWJqZWN0fSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0U3ViamVjdENsZWFuKAogICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZXtUaWNrZXROdW1iZXJ9LAogICAgICAgIFN1YmplY3QgPT4gJEFydGljbGV7U3ViamVjdH0gfHwgJycsCiAgICApOwoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRDb250ZW50JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgKTsKCiAgICAjIGlmICJBY3Rpb25zIHBlciBUaWNrZXQiIChJbmxpbmUgQWN0aW9uIFJvdykgaXMgYWN0aXZlCiAgICBpZiAoICRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgICMgQWRkIGxpc3QgZW50cmllcyBmb3IgZXZlcnkgYWN0aW9uCiAgICAgICAgZm9yIG15ICRJdGVtIChAQWN0aW9uSXRlbXMpIHsKICAgICAgICAgICAgbXkgJExpbmsgPSAkSXRlbS0+e0xpbmt9OwogICAgICAgICAgICBpZiAoICRJdGVtLT57VGFyZ2V0fSApIHsKICAgICAgICAgICAgICAgICRMaW5rID0gJyMnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ2xhc3MgPSAnJzsKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e1BvcHVwVHlwZX0gKSB7CiAgICAgICAgICAgICAgICAkQ2xhc3MgPSAnQXNQb3B1cCBQb3B1cFR5cGVfJyAuICRJdGVtLT57UG9wdXBUeXBlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0Jsb2NrfSBlcSAnRG9jdW1lbnRNZW51SXRlbScgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0lubGluZUFjdGlvblJvd0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCAgICA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZUlEICAgICA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgPT4gJEl0ZW0tPntJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgID0+ICRJdGVtLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICRJdGVtLT57RGVzY3JpcHRpb259LAogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICA9PiAkQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRMaW5rLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbXkgJFRpY2tldElEICAgPSAkUGFyYW17VGlja2V0SUR9OwogICAgICAgICAgICAgICAgbXkgJFNlbGVjdEhUTUwgPSAkSXRlbS0+e0hUTUx9OwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9pZD0iRGVzdFF1ZXVlSUQiL2lkPSJEZXN0UXVldWVJRCRUaWNrZXRJRCIveG1pZzsKICAgICAgICAgICAgICAgICRTZWxlY3RIVE1MID1+IHMvZm9yPSJEZXN0UXVldWVJRCIvZm9yPSJEZXN0UXVldWVJRCRUaWNrZXRJRCIveG1pZzsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbUhUTUwnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIVE1MID0+ICRTZWxlY3RIVE1MLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYnVsayBmZWF0dXJlIGlzIGVuYWJsZWQKICAgIGlmICggJFBhcmFte0J1bGt9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0J1bGsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdGlja2V0IGZsYWdzCiAgICBteSBAVGlja2V0TWV0YUl0ZW1zID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5UaWNrZXRNZXRhSXRlbXMoCiAgICAgICAgVGlja2V0ID0+IFwlQXJ0aWNsZSwKICAgICk7CiAgICBmb3IgbXkgJEl0ZW0gKEBUaWNrZXRNZXRhSXRlbXMpIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdNZXRhJywKICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICApOwogICAgICAgIGlmICgkSXRlbSkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTWV0YUljb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBydW4gYXJ0aWNsZSBtb2R1bGVzCiAgICBpZiAoIHJlZiAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgbXkgJUpvYnMgPSAleyAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QXJ0aWNsZVByZVZpZXdNb2R1bGUnKSB9OwogICAgICAgIGZvciBteSAkSm9iICggc29ydCBrZXlzICVKb2JzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkSm9ic3skSm9ifS0+e01vZHVsZX0gKSApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBteSAkT2JqZWN0ID0gJEpvYnN7JEpvYn0tPntNb2R1bGV9LT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIEFydGljbGVJRCA9PiAkQXJ0aWNsZXtBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIERlYnVnICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSBARGF0YSA9ICRPYmplY3QtPkNoZWNrKCBBcnRpY2xlID0+IFwlQXJ0aWNsZSwgJVBhcmFtLCBDb25maWcgPT4gJEpvYnN7JEpvYn0gKTsKCiAgICAgICAgICAgIGZvciBteSAkRGF0YVJlZiAoQERhdGEpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZU9wdGlvbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkRGF0YVJlZiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmlsdGVyIG9wdGlvbgogICAgICAgICAgICAkT2JqZWN0LT5GaWx0ZXIoIEFydGljbGUgPT4gXCVBcnRpY2xlLCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIGhlYWRlciBsaW5lcwogICAgIyAgICBmb3IgKHF3KEZyb20gVG8gQ2MgU3ViamVjdCkpIHsKICAgICMgICAgICAgIG5leHQgaWYgISRBcnRpY2xleyRffTsKICAgICMgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAjICAgICAgICAgICAgTmFtZSA9PiAnUm93JywKICAgICMgICAgICAgICAgICBEYXRhID0+IHsKICAgICMgICAgICAgICAgICAgICAgS2V5ICAgPT4gJF8sCiAgICAjICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyRffSwKICAgICMgICAgICAgICAgICB9LAogICAgIyAgICAgICAgKTsKICAgICMgICAgfQogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMyApIHsKICAgICAgICBuZXh0IGlmICEkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVUZXh0JENvdW50In07CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZUZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBLZXkgICA9PiAkQXJ0aWNsZXsiQXJ0aWNsZUZyZWVLZXkkQ291bnQifSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRBcnRpY2xleyJBcnRpY2xlRnJlZVRleHQkQ291bnQifSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIHRvIDE2CiAgICAgICAgaWYgKCAkQ291bnQgPj0gMTMgJiYgJENvdW50IDw9IDE2ICkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBuZXh0IGlmICEkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9OwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCwKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uLAogICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICggISRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IC4gJzo6TGluaycgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHRMaW5rJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHRMaW5rID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IC4gJzo6TGluaycgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgbmV4dCBpZiAhJEFydGljbGV7ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQgfTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScgLiAkQ291bnQsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUaW1lS2V5ID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZVRpbWVLZXknIC4gJENvdW50ICksCiAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgPT4gJENvdW50LAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgb3V0cHV0CiAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRDb21wb3NlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldENvbXBvc2V9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAxOwogICAgICAgIG15ICRDb25maWcgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiVGlja2V0OjpGcm9udGVuZDo6QWdlbnRUaWNrZXRDb21wb3NlIik7CiAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgIG15ICRPayA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0UGVybWlzc2lvbigKICAgICAgICAgICAgICAgIFR5cGUgICAgID0+ICRDb25maWctPntQZXJtaXNzaW9ufSwKICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkT2sgKSB7CiAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoJEFjY2VzcykgewogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlckNvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKAogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgJiYgKAogICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0UGhvbmVPdXRib3VuZH0KICAgICAgICAgICAgfHwgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0UGhvbmVPdXRib3VuZCIpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT0sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9LICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FnZW50QW5zd2VyUGhvbmVPdXRib3VuZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCB0eXBlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdUeXBlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgdGlja2V0IHNlcnZpY2UKICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpICYmICRBcnRpY2xle1NlcnZpY2V9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXtTTEF9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnU0xBJywKICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2hvdyBmaXJzdCByZXNwb25zZSB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZUNsYXNzfSA9ICdXYXJuaW5nJwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdGaXJzdFJlc3BvbnNlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgdXBkYXRlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7VXBkYXRlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle1VwZGF0ZVRpbWVDbGFzc30gPSAnV2FybmluZycKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVXBkYXRlVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNob3cgc29sdXRpb24gdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZUh1bWFufSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7U29sdXRpb25UaW1lV29ya2luZ1RpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICBpZiAoIDYwICogNjAgKiAxID4gJEFydGljbGV7U29sdXRpb25UaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnCiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NvbHV0aW9uVGltZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBNb3ZlUXVldWVzU3RyZwogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6TW92ZVR5cGUnKSA9fiAvXmZvcm0kL2kgKSB7CiAgICAgICAgJFBhcmFte01vdmVRdWV1ZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QWdlbnRRdWV1ZUxpc3RPcHRpb24oCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ0Rlc3RRdWV1ZUlEJywKICAgICAgICAgICAgRGF0YSAgICAgICA9PiBcJU1vdmVRdWV1ZXMsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJEFydGljbGV7UXVldWVJRH0sCiAgICAgICAgKTsKICAgIH0KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRNb3ZlfQogICAgICAgICYmICggIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldE1vdmV9IHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRNb3ZlfSApCiAgICAgICAgKQogICAgewogICAgICAgIG15ICRBY2Nlc3MgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFBlcm1pc3Npb24oCiAgICAgICAgICAgIFR5cGUgICAgID0+ICdtb3ZlJywKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ01vdmUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFkZCBhY3Rpb24gaXRlbXMgYXMganMKICAgIGlmICggQEFjdGlvbkl0ZW1zICYmICEkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9ICkgewogICAgICAgIG15ICRKU09OID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5KU09ORW5jb2RlKAogICAgICAgICAgICBEYXRhID0+IFxAQWN0aW9uSXRlbXMsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRSZWFkeUFjdGlvblJvd0FkZCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIERhdGEgICAgID0+ICRKU09OLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3TWVkaXVtJywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKCiAgICByZXR1cm4gXCRPdXRwdXQ7Cn0KMTsK
IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9UaWNrZXRPdmVydmlld1ByZXZpZXcucG0KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFRpY2tldE92ZXJ2aWV3UHJldmlldy5wbSx2IDEuOSAyMDEwLzEyLzA2IDE5OjMzOjA5IGVuIEV4cCAkCiMgJE9sZElkOiBUaWNrZXRPdmVydmlld1ByZXZpZXcucG0sdiAxLjQ5IDIwMTAvMTIvMDIgMTE6MzI6MzAgbW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OlRpY2tldE92ZXJ2aWV3UHJldmlldzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN5c3RlbUFkZHJlc3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjkgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSBcJVBhcmFtOwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IFVzZXJJRCBVc2VyT2JqZWN0IEdyb3VwT2JqZWN0IFRpY2tldE9iamVjdCBNYWluT2JqZWN0IFF1ZXVlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoJVBhcmFtKTsKICAgICRTZWxmLT57U3lzdGVtQWRkcmVzc30gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTeXN0ZW1BZGRyZXNzLT5uZXcoJVBhcmFtKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCVQYXJhbSk7CiMgLS0tCgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgQWN0aW9uUm93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudEFjdGlvblJvdycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRBY3Rpb25Sb3dCdWxrJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBOYW1lID0+ICdCdWxrJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQoKICAgICMgaW5pdCBmb3IgdGFibGUgY29udHJvbAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5U3RhcnQnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKCiAgICByZXR1cm4gJE91dHB1dDsKfQoKc3ViIFNvcnRPcmRlckJhciB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgcmV0dXJuICcnOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0SURzIFBhZ2VTaG93biBTdGFydEhpdCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgbXkgJEJ1bGtGZWF0dXJlID0gMDsKICAgIGlmICggJFBhcmFte0J1bGt9ICYmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpCdWxrRmVhdHVyZScpICkgewogICAgICAgIG15IEBHcm91cHM7CiAgICAgICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpGcm9udGVuZDo6QnVsa0ZlYXR1cmVHcm91cCcpICkgewogICAgICAgICAgICBAR3JvdXBzID0gQHsgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkJ1bGtGZWF0dXJlR3JvdXAnKSB9OwogICAgICAgIH0KICAgICAgICBpZiAoICFAR3JvdXBzICkgewogICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoQEdyb3VwcykgewogICAgICAgICAgICAgICAgbmV4dCBpZiAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifTsKICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifSBlcSAnWWVzJyApIHsKICAgICAgICAgICAgICAgICAgICAkQnVsa0ZlYXR1cmUgPSAxOwogICAgICAgICAgICAgICAgICAgIGxhc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdEb2N1bWVudEhlYWRlcicsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkT3V0cHV0TWV0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWdlbnRUaWNrZXRPdmVydmlld1ByZXZpZXcnLAogICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgKTsKICAgIG15ICRPdXRwdXRSYXcgPSAnJzsKICAgIGlmICggISRQYXJhbXtPdXRwdXR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+UHJpbnQoIE91dHB1dCA9PiBcJE91dHB1dE1ldGEgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRPdXRwdXRSYXcgLj0gJE91dHB1dE1ldGE7CiAgICB9CiAgICBteSAkT3V0cHV0ICAgICAgICA9ICcnOwogICAgbXkgJENvdW50ZXIgICAgICAgPSAwOwogICAgbXkgJENvdW50ZXJPblNpdGUgPSAwOwogICAgbXkgQFRpY2tldElEc1Nob3duOwoKICAgICMgY2hlY2sgaWYgdGhlcmUgYXJlIHRpY2tldHMgdG8gc2hvdwogICAgaWYgKCBzY2FsYXIgQHsgJFBhcmFte1RpY2tldElEc30gfSApIHsKCiAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoIEB7ICRQYXJhbXtUaWNrZXRJRHN9IH0gKSB7CiAgICAgICAgICAgICRDb3VudGVyKys7CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRDb3VudGVyID49ICRQYXJhbXtTdGFydEhpdH0KICAgICAgICAgICAgICAgICYmICRDb3VudGVyIDwgKCAkUGFyYW17UGFnZVNob3dufSArICRQYXJhbXtTdGFydEhpdH0gKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwdXNoIEBUaWNrZXRJRHNTaG93biwgJFRpY2tldElEOwogICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT5fU2hvdygKICAgICAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgICAgICAgICAgICAgQ291bnRlciAgPT4gJENvdW50ZXJPblNpdGUsCiAgICAgICAgICAgICAgICAgICAgQnVsayAgICAgPT4gJEJ1bGtGZWF0dXJlLAogICAgICAgICAgICAgICAgICAgIENvbmZpZyAgID0+ICRQYXJhbXtDb25maWd9LAogICAgICAgICAgICAgICAgICAgIE91dHB1dCAgID0+ICRQYXJhbXtPdXRwdXR9IHx8ICcnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRDb3VudGVyT25TaXRlKys7CiAgICAgICAgICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPlByaW50KCBPdXRwdXQgPT4gJE91dHB1dCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkeyRPdXRwdXR9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jayggTmFtZSA9PiAnTm9UaWNrZXRGb3VuZCcgKTsKICAgIH0KCiAgICBpZiAoJEJ1bGtGZWF0dXJlKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRGb290ZXInLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzU2hvd24pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0RvY3VtZW50Rm9vdGVyQnVsa0l0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBteSAkT3V0cHV0TWV0YSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICBpZiAoICEkUGFyYW17T3V0cHV0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5QcmludCggT3V0cHV0ID0+IFwkT3V0cHV0TWV0YSApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dFJhdyAuPSAkT3V0cHV0TWV0YTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gJE91dHB1dFJhdzsKfQoKc3ViIF9TaG93IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtUaWNrZXRJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgVGlja2V0SUQhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGJ1bGsgZmVhdHVyZSBpcyBlbmFibGVkCiAgICBpZiAoICRQYXJhbXtCdWxrfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdCdWxrJywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgbGFzdCA1IGFydGljbGVzCiAgICBteSBAQXJ0aWNsZUJvZHkgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVHZXQoCiAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICBVc2VySUQgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgT3JkZXIgICAgPT4gJ0RFU0MnLAogICAgICAgIExpbWl0ICAgID0+IDUsCiAgICApOwogICAgbXkgJUFydGljbGUgPSAleyAkQXJ0aWNsZUJvZHlbMF0gfHwge30gfTsKICAgIG15ICRBcnRpY2xlQ291bnQgPSBzY2FsYXIgQEFydGljbGVCb2R5OwoKICAgICMgdXNlciBpbmZvCiAgICBteSAlVXNlckluZm8gPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VySUQgPT4gJEFydGljbGV7T3duZXJJRH0sCiAgICApOwogICAgJUFydGljbGUgPSAoICVVc2VySW5mbywgJUFydGljbGUgKTsKIyAtLS0KIyBJVFNNCiMgLS0tCiAgICAjIGxvb2t1cCBjcml0aWNhbGl0eQogICAgJEFydGljbGV7Q3JpdGljYWxpdHl9ID0gJy0nOwogICAgaWYgKCRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTN9KSB7CiAgICAgICAgIyBnZXQgY3JpdGljYWxpdHkgbGlzdAogICAgICAgIG15ICRDcml0aWNhbGl0eUxpc3QgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUxpc3QoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb3JlOjpDcml0aWNhbGl0eScsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtDcml0aWNhbGl0eX0gPSAkQ3JpdGljYWxpdHlMaXN0LT57JEFydGljbGV7VGlja2V0RnJlZVRleHQxM319OwogICAgfQogICAgIyBsb29rdXAgaW1wYWN0CiAgICAkQXJ0aWNsZXtJbXBhY3R9ID0gJy0nOwogICAgaWYgKCRBcnRpY2xle1RpY2tldEZyZWVUZXh0MTR9KSB7CiAgICAgICAgIyBnZXQgaW1wYWN0IGxpc3QKICAgICAgICBteSAkSW1wYWN0TGlzdCA9ICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9LT5JdGVtTGlzdCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvcmU6OkltcGFjdCcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtJbXBhY3R9ID0gJEltcGFjdExpc3QtPnskQXJ0aWNsZXtUaWNrZXRGcmVlVGV4dDE0fX07CiAgICB9CiMgLS0tCgogICAgIyBjcmVhdGUgaHVtYW4gYWdlCiAgICAkQXJ0aWNsZXtBZ2V9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZSggQWdlID0+ICRBcnRpY2xle0FnZX0sIFNwYWNlID0+ICcgJyApOwoKICAgICMgZmV0Y2ggYWxsIHN0ZC4gcmVzcG9uc2VzIC4uLgogICAgbXkgJVN0YW5kYXJkUmVzcG9uc2VzCiAgICAgICAgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0U3RhbmRhcmRSZXNwb25zZXMoIFF1ZXVlSUQgPT4gJEFydGljbGV7UXVldWVJRH0gKTsKCiAgICAkUGFyYW17U3RhbmRhcmRSZXNwb25zZXNTdHJnfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgTmFtZSA9PiAnUmVzcG9uc2VJRCcsCiAgICAgICAgRGF0YSA9PiBcJVN0YW5kYXJkUmVzcG9uc2VzLAogICAgKTsKCiAgICAjIGN1c3RvbWVyIGluZm8KICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntDdXN0b21lckluZm99ICkgewogICAgICAgIGlmICggJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtDdXN0b21lck5hbWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICBVc2VyTG9naW4gPT4gJEFydGljbGV7Q3VzdG9tZXJVc2VySUR9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBhY2wgYWN0aW9ucwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2woCiAgICAgICAgRGF0YSAgICAgICAgICA9PiAnLScsCiAgICAgICAgQWN0aW9uICAgICAgICA9PiAkU2VsZi0+e0FjdGlvbn0sCiAgICAgICAgVGlja2V0SUQgICAgICA9PiAkQXJ0aWNsZXtUaWNrZXRJRH0sCiAgICAgICAgUmV0dXJuVHlwZSAgICA9PiAnQWN0aW9uJywKICAgICAgICBSZXR1cm5TdWJUeXBlID0+ICctJywKICAgICAgICBVc2VySUQgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICk7CiAgICBteSAlQWNsQWN0aW9uID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRBY2xBY3Rpb25EYXRhKCk7CgogICAgIyBydW4gdGlja2V0IHByZSBtZW51IG1vZHVsZXMKICAgIG15IEBBY3Rpb25JdGVtczsKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgZXEgJ0hBU0gnICkgewogICAgICAgIG15ICVNZW51cyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpQcmVNZW51TW9kdWxlJykgfTsKICAgICAgICBmb3IgbXkgJE1lbnUgKCBzb3J0IGtleXMgJU1lbnVzICkgewoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICEkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCAkTWVudXN7JE1lbnV9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTWVudXN7JE1lbnV9LT57TW9kdWxlfS0+bmV3KCAleyRTZWxmfSwgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwgKTsKCiAgICAgICAgICAgICMgcnVuIG1vZHVsZQogICAgICAgICAgICBteSAkSXRlbSA9ICRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFRpY2tldCA9PiBcJUFydGljbGUsCiAgICAgICAgICAgICAgICBBQ0wgICAgPT4gXCVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICBDb25maWcgPT4gJE1lbnVzeyRNZW51fSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgaWYgISRJdGVtOwogICAgICAgICAgICBuZXh0IGlmIHJlZiAkSXRlbSBuZSAnSEFTSCc7CiAgICAgICAgICAgIGZvciBteSAkS2V5IChxdyhOYW1lIExpbmsgRGVzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICBuZXh0IGlmICEkSXRlbS0+eyRLZXl9OwogICAgICAgICAgICAgICAgJEl0ZW0tPnskS2V5fSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlID0+ICRJdGVtLT57JEtleX0sCiAgICAgICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gXCVBcnRpY2xlLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgc2Vzc2lvbiBpZCBpZiBuZWVkZWQKICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbklEQ29va2llfSAmJiAkSXRlbS0+e0xpbmt9ICkgewogICAgICAgICAgICAgICAgJEl0ZW0tPntMaW5rfQogICAgICAgICAgICAgICAgICAgIC49ICc7JwogICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbk5hbWV9IC4gJz0nCiAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uSUR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNyZWF0ZSBpZAogICAgICAgICAgICAkSXRlbS0+e0lEfSA9ICRJdGVtLT57TmFtZX07CiAgICAgICAgICAgICRJdGVtLT57SUR9ID1+IHMvKFxzfCZ8OykvL2lnOwoKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEl0ZW0tPntCbG9ja30gfHwgJ0RvY3VtZW50TWVudUl0ZW0nLAogICAgICAgICAgICAgICAgRGF0YSA9PiAkSXRlbSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+T3V0cHV0KAogICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZ2VudFRpY2tldE92ZXJ2aWV3UHJldmlldycsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJEl0ZW0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9cbisvL2c7CiAgICAgICAgICAgICRPdXRwdXQgPX4gcy9ccysvIC9nOwogICAgICAgICAgICAkT3V0cHV0ID1+IHMvPFwhLS0uKz8tLT4vL2c7CgogICAgICAgICAgICBwdXNoIEBBY3Rpb25JdGVtcywgewogICAgICAgICAgICAgICAgSFRNTCAgICAgICAgPT4gJE91dHB1dCwKICAgICAgICAgICAgICAgIElEICAgICAgICAgID0+ICRJdGVtLT57SUR9LAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgIExpbmsgICAgICAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0Jhc2VsaW5rfSAuICRJdGVtLT57TGlua30sCiAgICAgICAgICAgICAgICBUYXJnZXQgICAgICA9PiAkSXRlbS0+e1RhcmdldH0sCiAgICAgICAgICAgICAgICBQb3B1cFR5cGUgICA9PiAkSXRlbS0+e1BvcHVwVHlwZX0sCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkSXRlbS0+e0Rlc2NyaXB0aW9ufSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgID0+ICRJdGVtLT57QmxvY2t9IHx8ICdEb2N1bWVudE1lbnVJdGVtJywKCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQoKICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRG9jdW1lbnRDb250ZW50JywKICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAlQXJ0aWNsZSwKICAgICAgICAgICAgQ2xhc3MgICAgICAgICAgICAgPT4gJ0FydGljbGVDb3VudCcgLiAkQXJ0aWNsZUNvdW50LAogICAgICAgICAgICBBZGRpdGlvbmFsQ2xhc3NlcyA9PiAkUGFyYW17Q29uZmlnfS0+e1RpY2tldEFjdGlvbnNQZXJUaWNrZXR9CiAgICAgICAgICAgID8gJ1Nob3dJbmxpbmVBY3Rpb25zJwogICAgICAgICAgICA6ICcnLAogICAgICAgIH0sCiAgICApOwoKICAgICMgaWYgIkFjdGlvbnMgcGVyIFRpY2tldCIgKElubGluZSBBY3Rpb24gUm93KSBpcyBhY3RpdmUKICAgIGlmICggJFBhcmFte0NvbmZpZ30tPntUaWNrZXRBY3Rpb25zUGVyVGlja2V0fSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3cnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBBZGQgbGlzdCBlbnRyaWVzIGZvciBldmVyeSBhY3Rpb24KICAgICAgICBmb3IgbXkgJEl0ZW0gKEBBY3Rpb25JdGVtcykgewogICAgICAgICAgICBteSAkTGluayA9ICRJdGVtLT57TGlua307CiAgICAgICAgICAgIGlmICggJEl0ZW0tPntUYXJnZXR9ICkgewogICAgICAgICAgICAgICAgJExpbmsgPSAnIyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDbGFzcyA9ICcnOwogICAgICAgICAgICBpZiAoICRJdGVtLT57UG9wdXBUeXBlfSApIHsKICAgICAgICAgICAgICAgICRDbGFzcyA9ICdBc1BvcHVwIFBvcHVwVHlwZV8nIC4gJEl0ZW0tPntQb3B1cFR5cGV9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRJdGVtLT57QmxvY2t9IGVxICdEb2N1bWVudE1lbnVJdGVtJyApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSW5saW5lQWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlSUQgICAgID0+ICRBcnRpY2xle1F1ZXVlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgICAgICAgICA9PiAkSXRlbS0+e0lEfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEl0ZW0tPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJEl0ZW0tPntEZXNjcmlwdGlvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgID0+ICRDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgTGluayAgICAgICAgPT4gJExpbmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBteSAkVGlja2V0SUQgICA9ICRQYXJhbXtUaWNrZXRJRH07CiAgICAgICAgICAgICAgICBteSAkU2VsZWN0SFRNTCA9ICRJdGVtLT57SFRNTH07CiAgICAgICAgICAgICAgICAkU2VsZWN0SFRNTCA9fiBzL2lkPSJEZXN0UXVldWVJRCIvaWQ9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGVjdEhUTUwgPX4gcy9mb3I9IkRlc3RRdWV1ZUlEIi9mb3I9IkRlc3RRdWV1ZUlEJFRpY2tldElEIi94bWlnOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdJbmxpbmVBY3Rpb25Sb3dJdGVtSFRNTCcsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIEhUTUwgPT4gJFNlbGVjdEhUTUwsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBidWxrIGZlYXR1cmUgaXMgZW5hYmxlZAogICAgaWYgKCAkUGFyYW17QnVsa30gKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQnVsaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB0aWNrZXQgZmxhZ3MKICAgIG15IEBUaWNrZXRNZXRhSXRlbXMgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPlRpY2tldE1ldGFJdGVtcygKICAgICAgICBUaWNrZXQgPT4gXCVBcnRpY2xlLAogICAgKTsKICAgIGZvciBteSAkSXRlbSAoQFRpY2tldE1ldGFJdGVtcykgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ01ldGEnLAogICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICk7CiAgICAgICAgaWYgKCRJdGVtKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdNZXRhSWNvbicsCiAgICAgICAgICAgICAgICBEYXRhID0+ICRJdGVtLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIHJ1biBhcnRpY2xlIG1vZHVsZXMKICAgIGlmICggcmVmICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIGVxICdIQVNIJyApIHsKICAgICAgICBteSAlSm9icyA9ICV7ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBcnRpY2xlUHJlVmlld01vZHVsZScpIH07CiAgICAgICAgZm9yIG15ICRKb2IgKCBzb3J0IGtleXMgJUpvYnMgKSB7CgogICAgICAgICAgICAjIGxvYWQgbW9kdWxlCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoICRKb2JzeyRKb2J9LT57TW9kdWxlfSApICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG15ICRPYmplY3QgPSAkSm9ic3skSm9ifS0+e01vZHVsZX0tPm5ldygKICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgQXJ0aWNsZUlEID0+ICRBcnRpY2xle0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICBVc2VySUQgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgRGVidWcgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBydW4gbW9kdWxlCiAgICAgICAgICAgIG15IEBEYXRhID0gJE9iamVjdC0+Q2hlY2soIEFydGljbGUgPT4gXCVBcnRpY2xlLCAlUGFyYW0sIENvbmZpZyA9PiAkSm9ic3skSm9ifSApOwoKICAgICAgICAgICAgZm9yIG15ICREYXRhUmVmIChARGF0YSkgewogICAgICAgICAgICAgICAgaWYgKCAkRGF0YVJlZi0+e1N1Y2Nlc3NmdWx9ICkgewogICAgICAgICAgICAgICAgICAgICREYXRhUmVmLT57UmVzdWx0fSA9ICdFcnJvcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkRGF0YVJlZi0+e1Jlc3VsdH0gPSAnU3VjY2Vzcyc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlT3B0aW9uJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+ICREYXRhUmVmLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBmaWx0ZXIgb3B0aW9uCiAgICAgICAgICAgICRPYmplY3QtPkZpbHRlciggQXJ0aWNsZSA9PiBcJUFydGljbGUsICVQYXJhbSwgQ29uZmlnID0+ICRKb2JzeyRKb2J9ICk7CiAgICAgICAgfQogICAgfQoKICAgICMgdGlja2V0IGZyZWUgdGV4dAogICAgZm9yIG15ICRDb3VudCAoIDEgLi4gMTYgKSB7CiMgLS0tCiMgSVRTTQojIC0tLQogICAgICAgICMgZGlzYWJsZSB0aWNrZXQgZnJlZSB0ZXh0IDEzIHRvIDE2CiAgICAgICAgaWYgKCAkQ291bnQgPj0gMTMgJiYgJENvdW50IDw9IDE2ICkgewogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KIyAtLS0KICAgICAgICBpZiAoICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRleHQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRleHQgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgfSwKICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCAuICc6OkxpbmsnICkgKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0UGxhaW4nIC4gJENvdW50LAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlLCAlQWNsQWN0aW9uIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdUaWNrZXRGcmVlVGV4dFBsYWluJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZUtleSAgPT4gJEFydGljbGV7ICdUaWNrZXRGcmVlS2V5JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGV4dCA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUZXh0JyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgICAgICBDb3VudCAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycgLiAkQ291bnQsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUZXh0TGluaycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0TGluayA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGV4dCcgLiAkQ291bnQgLiAnOjpMaW5rJyApLAogICAgICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlS2V5ICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVLZXknIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldEZyZWVUZXh0ID0+ICRBcnRpY2xleyAnVGlja2V0RnJlZVRleHQnIC4gJENvdW50IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAjIHRpY2tldCBmcmVlIHRpbWUKICAgIGZvciBteSAkQ291bnQgKCAxIC4uIDYgKSB7CiAgICAgICAgaWYgKCAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVGlja2V0RnJlZVRpbWUnIC4gJENvdW50LAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1RpY2tldEZyZWVUaW1lJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgVGlja2V0RnJlZVRpbWVLZXkgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdUaWNrZXRGcmVlVGltZUtleScgLiAkQ291bnQgKSwKICAgICAgICAgICAgICAgICAgICBUaWNrZXRGcmVlVGltZSAgICA9PiAkQXJ0aWNsZXsgJ1RpY2tldEZyZWVUaW1lJyAuICRDb3VudCB9LAogICAgICAgICAgICAgICAgICAgIENvdW50ICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG91dHB1dAogICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlcicsCiAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICk7CiAgICBpZiAoCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAmJiAoICFkZWZpbmVkICRBY2xBY3Rpb257QWdlbnRUaWNrZXRDb21wb3NlfSB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0gKQogICAgICAgICkKICAgIHsKICAgICAgICBteSAkQWNjZXNzID0gMTsKICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgICAgIGlmICggJENvbmZpZy0+e1Blcm1pc3Npb259ICkgewogICAgICAgICAgICBteSAkT2sgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlBlcm1pc3Npb24oCiAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgTG9nTm8gICAgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgJEFjY2VzcyA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCRBY2Nlc3MpIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRBbnN3ZXJDb21wb3NlJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGlmICgKICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICYmICgKICAgICAgICAgICAgIWRlZmluZWQgJEFjbEFjdGlvbntBZ2VudFRpY2tldFBob25lT3V0Ym91bmR9CiAgICAgICAgICAgIHx8ICRBY2xBY3Rpb257QWdlbnRUaWNrZXRQaG9uZU91dGJvdW5kfQogICAgICAgICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgbXkgJENvbmZpZyA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OkZyb250ZW5kOjpBZ2VudFRpY2tldFBob25lT3V0Ym91bmQnKTsKICAgICAgICBpZiAoICRDb25maWctPntQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgbXkgJE9LID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgVHlwZSAgICAgPT4gJENvbmZpZy0+e1Blcm1pc3Npb259LAogICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJFBhcmFte1RpY2tldElEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIExvZ05vICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGlmICggISRPSyApIHsKICAgICAgICAgICAgICAgICRBY2Nlc3MgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgkQWNjZXNzKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdBZ2VudEFuc3dlclBob25lT3V0Ym91bmQnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUsICVBY2xBY3Rpb24gfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyB0aWNrZXQgdHlwZQogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnVHlwZScsCiAgICAgICAgICAgIERhdGEgPT4geyAlUGFyYW0sICVBcnRpY2xlIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHRpY2tldCBzZXJ2aWNlCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSAmJiAkQXJ0aWNsZXtTZXJ2aWNlfSApIHsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgICAgIGlmICggJEFydGljbGV7U0xBfSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIEN1c3RvbWVySUQgYW5kIEN1c3RvbWVyTmFtZQogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle0N1c3RvbWVySUR9ICkgewogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSB9LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtDdXRvbWVyTmFtZX0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lck5hbWUnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IGZpcnN0IHJlc3BvbnNlIHRpbWUgaWYgbmVlZGVkCiAgICBpZiAoIGRlZmluZWQgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWV9ICkgewogICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lfSwKICAgICAgICAgICAgU3BhY2UgPT4gJyAnLAogICAgICAgICk7CiAgICAgICAgJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkN1c3RvbWVyQWdlSW5Ib3VycygKICAgICAgICAgICAgQWdlICAgPT4gJEFydGljbGV7Rmlyc3RSZXNwb25zZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtGaXJzdFJlc3BvbnNlVGltZX0gKSB7CiAgICAgICAgICAgICRBcnRpY2xle0ZpcnN0UmVzcG9uc2VUaW1lQ2xhc3N9ID0gJ1dhcm5pbmcnCiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0ZpcnN0UmVzcG9uc2VUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyB1cGRhdGUgdGltZSBpZiBuZWVkZWQKICAgIGlmICggZGVmaW5lZCAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWV9LAogICAgICAgICAgICBTcGFjZSA9PiAnICcsCiAgICAgICAgKTsKICAgICAgICAkQXJ0aWNsZXtVcGRhdGVUaW1lV29ya2luZ1RpbWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1VwZGF0ZVRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtVcGRhdGVUaW1lfSApIHsKICAgICAgICAgICAgJEFydGljbGV7VXBkYXRlVGltZUNsYXNzfSA9ICdXYXJuaW5nJwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdVcGRhdGVUaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBzb2x1dGlvbiB0aW1lIGlmIG5lZWRlZAogICAgaWYgKCBkZWZpbmVkICRBcnRpY2xle1NvbHV0aW9uVGltZX0gKSB7CiAgICAgICAgJEFydGljbGV7U29sdXRpb25UaW1lSHVtYW59ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DdXN0b21lckFnZUluSG91cnMoCiAgICAgICAgICAgIEFnZSAgID0+ICRBcnRpY2xle1NvbHV0aW9uVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgICRBcnRpY2xle1NvbHV0aW9uVGltZVdvcmtpbmdUaW1lfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q3VzdG9tZXJBZ2VJbkhvdXJzKAogICAgICAgICAgICBBZ2UgICA9PiAkQXJ0aWNsZXtTb2x1dGlvblRpbWVXb3JraW5nVGltZX0sCiAgICAgICAgICAgIFNwYWNlID0+ICcgJywKICAgICAgICApOwogICAgICAgIGlmICggNjAgKiA2MCAqIDEgPiAkQXJ0aWNsZXtTb2x1dGlvblRpbWV9ICkgewogICAgICAgICAgICAkQXJ0aWNsZXtTb2x1dGlvblRpbWVDbGFzc30gPSAnV2FybmluZycKICAgICAgICB9CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnU29sdXRpb25UaW1lJywKICAgICAgICAgICAgRGF0YSA9PiB7ICVQYXJhbSwgJUFydGljbGUgfSwKICAgICAgICApOwogICAgfQoKICAgICMgc2hvdyBpbmxpbmUgYXJ0aWNsZQogICAgbXkgJENvdW50ID0gMDsKICAgIGZvciBteSAkQXJ0aWNsZUl0ZW0gKCByZXZlcnNlIEBBcnRpY2xlQm9keSApIHsKICAgICAgICBuZXh0IGlmICEkQXJ0aWNsZUl0ZW07CiAgICAgICAgaWYgKCAkQ291bnQgPT0gJCNBcnRpY2xlQm9keSApIHsKICAgICAgICAgICAgJEFydGljbGVJdGVtLT57Q2xhc3N9ID0gJ0FjdGl2ZSc7CiAgICAgICAgfQogICAgICAgICRDb3VudCsrOwoKICAgICAgICAjIGNoZWNrIGlmIGp1c3QgYSBvbmx5IGh0bWwgZW1haWwKICAgICAgICBteSAkTWltZVR5cGVUZXh0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5DaGVja01pbWVUeXBlKAogICAgICAgICAgICAleyRBcnRpY2xlSXRlbX0sCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWdlbnRUaWNrZXRab29tJywKICAgICAgICApOwogICAgICAgIGlmICgkTWltZVR5cGVUZXh0KSB7CiAgICAgICAgICAgICRBcnRpY2xlSXRlbS0+e0JvZHlOb3RlfSA9ICRNaW1lVHlwZVRleHQ7CiAgICAgICAgICAgICRBcnRpY2xlSXRlbS0+e0JvZHl9ICAgICA9ICcnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICMgaHRtbCBxdW90aW5nCiAgICAgICAgICAgICRBcnRpY2xlSXRlbS0+e0JvZHl9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgTmV3TGluZSA9PiAkU2VsZi0+e0NvbmZpZ30tPntEZWZhdWx0Vmlld05ld0xpbmV9ICB8fCA5MCwKICAgICAgICAgICAgICAgIFRleHQgICAgPT4gJEFydGljbGVJdGVtLT57Qm9keX0sCiAgICAgICAgICAgICAgICBWTWF4ICAgID0+ICRTZWxmLT57Q29uZmlnfS0+e0RlZmF1bHRQcmVWaWV3TGluZXN9IHx8IDI1LAogICAgICAgICAgICAgICAgTGlua0ZlYXR1cmUgICAgID0+IDEsCiAgICAgICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSAgPT4gMSwKICAgICAgICAgICAgICAgIFN0cmlwRW1wdHlMaW5lcyA9PiAkU2VsZi0+e0NvbmZpZ30tPntTdHJpcEVtcHR5TGluZXN9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBkbyBjaGFyc2V0IGNoZWNrCiAgICAgICAgICAgIG15ICRDaGFyc2V0VGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Q2hlY2tDaGFyc2V0KAogICAgICAgICAgICAgICAgJXskQXJ0aWNsZUl0ZW19LAogICAgICAgICAgICAgICAgQWN0aW9uID0+ICdBZ2VudFRpY2tldFpvb20nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJENoYXJzZXRUZXh0KSB7CiAgICAgICAgICAgICAgICAkQXJ0aWNsZUl0ZW0tPntCb2R5Tm90ZX0gPSAkQ2hhcnNldFRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRBcnRpY2xlSXRlbS0+e1N1YmplY3R9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTdWJqZWN0Q2xlYW4oCiAgICAgICAgICAgIFRpY2tldE51bWJlciA9PiAkQXJ0aWNsZUl0ZW0tPntUaWNrZXROdW1iZXJ9LAogICAgICAgICAgICBTdWJqZWN0ID0+ICRBcnRpY2xlSXRlbS0+e1N1YmplY3R9IHx8ICcnLAogICAgICAgICk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVQcmV2aWV3JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAleyRBcnRpY2xlSXRlbX0sCiAgICAgICAgICAgICAgICBDbGFzcyA9PiAkQXJ0aWNsZUl0ZW0tPntDbGFzc30sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBzaG93IGFjdGlvbnMKICAgICAgICBpZiAoICRBcnRpY2xlSXRlbS0+e0FydGljbGVUeXBlfSAhfiAvXihub3RlfGVtYWlsLW5vdGkpL2kgKSB7CgogICAgICAgICAgICAjIGNoZWNrIGlmIGNvbXBvc2UgbGluayBzaG91bGQgYmUgc2hvd24KICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+e0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICYmICgKICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICAgICB8fCAkQWNsQWN0aW9ue0FnZW50VGlja2V0Q29tcG9zZX0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbXkgJEFjY2VzcyA9IDE7CiAgICAgICAgICAgICAgICBteSAkQ29uZmlnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6RnJvbnRlbmQ6OkFnZW50VGlja2V0Q29tcG9zZScpOwogICAgICAgICAgICAgICAgaWYgKCAkQ29uZmlnLT57UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJE9rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5QZXJtaXNzaW9uKAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICA9PiAkQ29uZmlnLT57UGVybWlzc2lvbn0sCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRBcnRpY2xle1RpY2tldElEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICBMb2dObyAgICA9PiAxLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE9rICkgewogICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWctPntSZXF1aXJlZExvY2t9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NrZWQgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkxvY2tJc1RpY2tldExvY2tlZCgKICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRMb2NrZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJEFjY2Vzc09rID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5Pd25lckNoZWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGlja2V0SUQgPT4gJEFydGljbGV7VGlja2V0SUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZXJJRCAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoICEkQWNjZXNzT2sgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQWNjZXNzID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggJEFjY2VzcyAmJiAhJFBhcmFte091dHB1dH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnQXJ0aWNsZVByZXZpZXdBY3Rpb25Sb3cnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwgJUFjbEFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGZldGNoIGFsbCBzdGQuIHJlc3BvbnNlcwogICAgICAgICAgICAgICAgICAgIG15ICVTdGFuZGFyZFJlc3BvbnNlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5HZXRTdGFuZGFyZFJlc3BvbnNlcygKICAgICAgICAgICAgICAgICAgICAgICAgUXVldWVJRCA9PiAkQXJ0aWNsZXtRdWV1ZUlEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIGdldCBTdGFuZGFyZFJlc3BvbnNlc1N0cmcKICAgICAgICAgICAgICAgICAgICAkU3RhbmRhcmRSZXNwb25zZXN7MH0KICAgICAgICAgICAgICAgICAgICAgICAgPSAnLSAnIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJ1JlcGx5JykgLiAnIC0nOwoKICAgICAgICAgICAgICAgICAgICAjIGJ1aWxkIGh0bWwgc3RyaW5nCiAgICAgICAgICAgICAgICAgICAgbXkgJFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICdSZXNwb25zZUlEJyAuICRBcnRpY2xlSXRlbS0+e0FydGljbGVJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gXCVTdGFuZGFyZFJlc3BvbnNlcywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdBcnRpY2xlUHJldmlld0FjdGlvblJvd0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICV7JEFydGljbGVJdGVtfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YW5kYXJkUmVzcG9uc2VzU3RyZyA9PiAkU3RhbmRhcmRSZXNwb25zZXNTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdSZXBseScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgICAgICAgICAgPT4gJ0FzUG9wdXAnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUlEICAgICAgICAgICAgICAgID0+ICdSZXBseScgLiAkQXJ0aWNsZUl0ZW0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgcmVwbHkgYWxsIGlzIG5lZWRlZAogICAgICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRzID0gJyc7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRLZXkgKHF3KEZyb20gVG8gQ2MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgaWYgISRBcnRpY2xlSXRlbS0+eyRLZXl9OwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoJFJlY2lwaWVudHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRzIC49ICcsICc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJFJlY2lwaWVudHMgLj0gJEFydGljbGVJdGVtLT57JEtleX07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRSZWNpcGllbnRDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRSZWNpcGllbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbFBhcnNlciA9IEtlcm5lbDo6U3lzdGVtOjpFbWFpbFBhcnNlci0+bmV3KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb2RlID0+ICdTdGFuZGFsb25lJywKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgQEFkZHJlc3NlcyA9ICRFbWFpbFBhcnNlci0+U3BsaXRBZGRyZXNzTGluZSggTGluZSA9PiAkUmVjaXBpZW50cyApOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJEFkZHJlc3MgKEBBZGRyZXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRFbWFpbCA9ICRFbWFpbFBhcnNlci0+R2V0RW1haWxBZGRyZXNzKCBFbWFpbCA9PiAkQWRkcmVzcyApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAhJEVtYWlsOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElzTG9jYWwgPSAkU2VsZi0+e1N5c3RlbUFkZHJlc3N9LT5TeXN0ZW1BZGRyZXNzSXNMb2NhbEFkZHJlc3MoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyA9PiAkRW1haWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBpZiAkSXNMb2NhbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWNpcGllbnRDb3VudCsrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJFJlY2lwaWVudENvdW50ID4gMSApIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICMgZ2V0IFN0YW5kYXJkUmVzcG9uc2VzU3RyZwogICAgICAgICAgICAgICAgICAgICAgICAkU3RhbmRhcmRSZXNwb25zZXN7MH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJy0gJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCgnUmVwbHkgQWxsJykgLiAnIC0nOwogICAgICAgICAgICAgICAgICAgICAgICAkU3RhbmRhcmRSZXNwb25zZXNTdHJnID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3BvbnNlSUQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSUQgICA9PiAnUmVzcG9uc2VJREFsbCcgLiAkQXJ0aWNsZUl0ZW0tPntBcnRpY2xlSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiBcJVN0YW5kYXJkUmVzcG9uc2VzLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0FydGljbGVQcmV2aWV3QWN0aW9uUm93SXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRBcnRpY2xlSXRlbX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhbmRhcmRSZXNwb25zZXNTdHJnID0+ICRTdGFuZGFyZFJlc3BvbnNlc1N0cmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICAgID0+ICdSZXBseSBBbGwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgICAgICAgICAgICA9PiAnQXNQb3B1cCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uICAgICAgICAgICAgICAgID0+ICdBZ2VudFRpY2tldENvbXBvc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1JRCAgICAgICAgICAgICAgICA9PiAnUmVwbHlBbGwnIC4gJEFydGljbGVJdGVtLT57QXJ0aWNsZUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBseUFsbCAgICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIGFjdGlvbiBpdGVtcyBhcyBqcwogICAgaWYgKCBAQWN0aW9uSXRlbXMgJiYgISRQYXJhbXtDb25maWd9LT57VGlja2V0QWN0aW9uc1BlclRpY2tldH0gKSB7CiAgICAgICAgbXkgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXEBBY3Rpb25JdGVtcywKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdEb2N1bWVudFJlYWR5QWN0aW9uUm93QWRkJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUaWNrZXRJRCA9PiAkUGFyYW17VGlja2V0SUR9LAogICAgICAgICAgICAgICAgRGF0YSAgICAgPT4gJEpTT04sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FnZW50VGlja2V0T3ZlcnZpZXdQcmV2aWV3JywKICAgICAgICBEYXRhID0+IHsgJVBhcmFtLCAlQXJ0aWNsZSwgJUFjbEFjdGlvbiB9LAogICAgKTsKICAgIHJldHVybiBcJE91dHB1dDsKfQoxOwo=
IyAtLQojIEFnZW50VGlja2V0QWN0aW9uQ29tbW9uLmR0bCAtIHByb3ZpZGVzIGNvbW1vbiBIVE1MIGZvcm0gZm9yIHNldmVyYWwgbWFza3MKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VGlja2V0QWN0aW9uQ29tbW9uLmR0bCx2IDEuMzkgMjAxMC8wNi8xNyAxNzoyODoxNCBlbiBFeHAgJAojICRPbGRJZDogQWdlbnRUaWNrZXRBY3Rpb25Db21tb24uZHRsLHYgMS4zOSAyMDEwLzA2LzE3IDE3OjI4OjE0IGVuIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgoKPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIiBpZD0iQ29tcG9zZSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlN0b3JlIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJUaWNrZXRJRCIgdmFsdWU9IiRRRGF0YXsiVGlja2V0SUQifSIvPgogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iRXhwYW5kIiBpZD0iRXhwYW5kIiB2YWx1ZT0iIi8+CiAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJGb3JtSUQiIHZhbHVlPSIkUURhdGF7IkZvcm1JRCJ9Ii8+CiMgLS0tCiMgSVRTTQojIC0tLQogICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9IkltcGFjdFJDIiBuYW1lPSJJbXBhY3RSQyIgdmFsdWU9IjAiLz4KICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJQcmlvcml0eVJDIiBuYW1lPSJQcmlvcml0eVJDIiB2YWx1ZT0iMCIvPgojIC0tLQoKICAgIDxkaXYgY2xhc3M9IkxheW91dFBvcHVwIEFSSUFSb2xlTWFpbiI+CiAgICAgICAgPGRpdiBjbGFzcz0iSGVhZGVyIj4KICAgICAgICAgICAgPGgxPgoKPCEtLSBkdGw6YmxvY2s6SGVhZGVyQWdlbnRUaWNrZXRGcmVlVGV4dCAtLT4KICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2UgRnJlZSBUZXh0IG9mIFRpY2tldCJ9CjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0RnJlZVRleHQgLS0+Cgo8IS0tIGR0bDpibG9jazpIZWFkZXJBZ2VudFRpY2tldE93bmVyIC0tPgogICAgICAgICAgICAgICAgJFRleHR7IkNoYW5nZSBPd25lciBvZiBUaWNrZXQifQo8IS0tIGR0bDpibG9jazpIZWFkZXJBZ2VudFRpY2tldE93bmVyIC0tPgoKPCEtLSBkdGw6YmxvY2s6SGVhZGVyQWdlbnRUaWNrZXRDbG9zZSAtLT4KICAgICAgICAgICAgICAgICRUZXh0eyJDbG9zZSBUaWNrZXQifQo8IS0tIGR0bDpibG9jazpIZWFkZXJBZ2VudFRpY2tldENsb3NlIC0tPgoKPCEtLSBkdGw6YmxvY2s6SGVhZGVyQWdlbnRUaWNrZXROb3RlIC0tPgogICAgICAgICAgICAgICAgJFRleHR7IkFkZCBOb3RlIHRvIFRpY2tldCJ9CjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0Tm90ZSAtLT4KCjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0UGVuZGluZyAtLT4KICAgICAgICAgICAgICAgICRUZXh0eyJTZXQgUGVuZGluZyJ9CjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0UGVuZGluZyAtLT4KCjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICAkVGV4dHsiQ2hhbmdlIFByaW9yaXR5IG9mIFRpY2tldCJ9CjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0UHJpb3JpdHkgLS0+Cgo8IS0tIGR0bDpibG9jazpIZWFkZXJBZ2VudFRpY2tldFJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgJFRleHR7IkNoYW5nZSBSZXNwb25zaWJsZSBvZiBUaWNrZXQifQo8IS0tIGR0bDpibG9jazpIZWFkZXJBZ2VudFRpY2tldFJlc3BvbnNpYmxlIC0tPgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SGVhZGVyQWdlbnRUaWNrZXREZWNpc2lvbiAtLT4KICAgICAgICAgICAgICAgICRUZXh0eyJDaGFuZ2UgRGVjaXNpb24gb2YgVGlja2V0In0KPCEtLSBkdGw6YmxvY2s6SGVhZGVyQWdlbnRUaWNrZXREZWNpc2lvbiAtLT4KCjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQgLS0+CiAgICAgICAgICAgICAgICAkVGV4dHsiQ2hhbmdlIElUU00gZmllbGRzIG9mIHRpY2tldCJ9CjwhLS0gZHRsOmJsb2NrOkhlYWRlckFnZW50VGlja2V0QWRkdGxJVFNNRmllbGQgLS0+CiMgLS0tCgogICAgICAgICAgICAgICAgOiAkRGF0YXsiVGlja2V0TnVtYmVyIn0gLSAkUURhdGF7IlRpdGxlIiwiNjAifQogICAgICAgICAgICA8L2gxPgoKPCEtLSBkdGw6YmxvY2s6VGlja2V0QmFjayAtLT4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8YSBjbGFzcz0iQ2FuY2VsQ2xvc2VQb3B1cCIgaHJlZj0iIyI+JFRleHR7IkNhbmNlbCAmIGNsb3NlIHdpbmRvdyJ9PC9hPgogICAgICAgICAgICA8L3A+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEJhY2sgLS0+CjwhLS0gZHRsOmJsb2NrOlByb3BlcnRpZXNMb2NrIC0tPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgICRUZXh0eyJUaGUgdGlja2V0IGhhcyBiZWVuIGxvY2tlZCJ9LgogICAgICAgICAgICAgICAgPGEgY2xhc3M9IlVuZG9DbG9zZVBvcHVwIiBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPUFnZW50VGlja2V0TG9jaztTdWJhY3Rpb249VW5sb2NrO1RpY2tldElEPSREYXRheyJUaWNrZXRJRCJ9Ij4KICAgICAgICAgICAgICAgICAgICAkVGV4dHsiVW5kbyAmIGNsb3NlIHdpbmRvdyJ9CiAgICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcD4KPCEtLSBkdGw6YmxvY2s6UHJvcGVydGllc0xvY2sgLS0+CgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9IkNvbnRlbnQiPgoKICAgICAgICAgICAgPGgyPiRUZXh0eyJPcHRpb25zIn08L2gyPgoKICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UgRml4ZWRMYWJlbCI+Cgo8IS0tIGR0bDpibG9jazpUaXRsZSAtLT4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlRpdGxlIj48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJUaXRsZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIGlkPSJUaXRsZSIgbmFtZT0iVGl0bGUiIHZhbHVlPSIkUURhdGF7IlRpdGxlIn0iIGNsYXNzPSJXNzVwYyBWYWxpZGF0ZV9SZXF1aXJlZCAkUURhdGF7IlRpdGxlSW52YWxpZCJ9IiAvPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpdGxlRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGl0bGVTZXJ2ZXJFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpdGxlIC0tPgoKPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlR5cGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4kVGV4dHsiVHlwZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IlR5cGVTdHJnIn0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJUeXBlSURFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlR5cGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VHlwZSAtLT4KCjwhLS0gZHRsOmJsb2NrOlNlcnZpY2UgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJTZXJ2aWNlSUQiPiRUZXh0eyJTZXJ2aWNlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiU2VydmljZVN0cmcifQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlNlcnZpY2VJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlNlcnZpY2UgaW52YWxpZC4ifTwvcD48L2Rpdj4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNTZXJ2aWNlSUQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjRXhwYW5kJykudmFsKCczJykuY2xvc2VzdCgnZm9ybScpOwogICAgICAgIENvcmUuRm9ybS5WYWxpZGF0ZS5EaXNhYmxlVmFsaWRhdGlvbigkRm9ybSk7CiAgICAgICAgJEZvcm0uc3VibWl0KCk7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpTZXJ2aWNlIC0tPgoKPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iU0xBSUQiPiRUZXh0eyJTZXJ2aWNlIExldmVsIEFncmVlbWVudCJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IlNMQVN0cmcifQo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI1NMQUlEJykuYmluZCgnY2hhbmdlJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgdmFyICRGb3JtID0gJCgnI0V4cGFuZCcpLnZhbCgnMycpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLnN1Ym1pdCgpOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6U0xBIC0tPgoKPCEtLSBkdGw6YmxvY2s6T3duZXIgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdPd25lcklEIj4kVGV4dHsiTmV3IE93bmVyIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0icmFkaW8iIG5hbWU9Ik5ld093bmVyVHlwZSIgdmFsdWU9Ik5ldyIgdGl0bGU9IlNlbGVjdCBuZXcgb3duZXIiICREYXRheyJOZXdPd25lclR5cGU6Ok5ldyJ9IC8+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7Ik93bmVyU3RyZyJ9CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmV3T3duZXJJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlBsZWFzZSBzZXQgYSBuZXcgb3duZXIhIn08L3A+PC9kaXY+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjTmV3T3duZXJJRCcpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgIENvcmUuQWdlbnQuVGlja2V0QWN0aW9uLlNlbGVjdFJhZGlvQnV0dG9uKCdOZXcnLCdOZXdPd25lclR5cGUnKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJPbGRPd25lcklEIj4kVGV4dHsiUHJldmlvdXMgT3duZXIifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJyYWRpbyIgbmFtZT0iTmV3T3duZXJUeXBlIiB2YWx1ZT0iT2xkIiB0aXRsZT0iU2VsZWN0IG9sZCBvd25lciIgJERhdGF7Ik5ld093bmVyVHlwZTo6T2xkIn0gLz4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiT2xkT3duZXJTdHJnIn0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJPbGRPd25lcklEU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiUGxlYXNlIHNldCBhIG5ldyBvd25lciEifTwvcD48L2Rpdj4KPCEtLWR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZS0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgICQoJyNPbGRPd25lcklEJykuYmluZCgnY2xpY2snLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uU2VsZWN0UmFkaW9CdXR0b24oJ09sZCcsJ05ld093bmVyVHlwZScpOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpPd25lciAtLT4KCjwhLS0gZHRsOmJsb2NrOlJlc3BvbnNpYmxlIC0tPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3UmVzcG9uc2libGVJRCI+JFRleHR7IlJlc3BvbnNpYmxlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiUmVzcG9uc2libGVTdHJnIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpSZXNwb25zaWJsZSAtLT4KCjwhLS0gZHRsOmJsb2NrOk5vdGUgLS0+CjwhLS0gZHRsOmJsb2NrOkluZm9ybUFnZW50IC0tPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iSW5mb3JtVXNlcklEIj4kVGV4dHsiSW5mb3JtIEFnZW50In06ICgkVGV4dHsiT3B0aW9uYWwifSk8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJbmZvcm1BZ2VudCAtLT4KCjwhLS0gZHRsOmJsb2NrOkludm9sdmVkQWdlbnQgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJJbnZvbHZlZFVzZXJJRCI+JFRleHR7IkluZm9ybSBpbnZvbHZlZCBBZ2VudHMifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJJbnZvbHZlZEFnZW50U3RyZyJ9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6SW52b2x2ZWRBZ2VudCAtLT4KCiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJTdWJqZWN0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJTdWJqZWN0In06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9IlN1YmplY3QiIG5hbWU9IlN1YmplY3QiIHZhbHVlPSIkUURhdGF7IlN1YmplY3QifSIgY2xhc3M9Ilc3NXBjIFZhbGlkYXRlX1JlcXVpcmVkICREYXRheyJTdWJqZWN0SW52YWxpZCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdEVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iU3ViamVjdFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCjwhLS0gZHRsOmJsb2NrOlRpY2tldE9wdGlvbnMgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7Ik9wdGlvbnMifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX1RpY2tldE9wdGlvbnNCZWdpbiAtLT4KCjwhLS0gZHRsOmJsb2NrOlNwZWxsQ2hlY2sgLS0+CiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iIyIgaWQ9Ik9wdGlvblNwZWxsQ2hlY2siPlsgJFRleHR7IlNwZWxsIGNoZWNrIn0gXTwvYT4KPCEtLSBkdGw6YmxvY2s6U3BlbGxDaGVjayAtLT4KCjwhLS0gT3V0cHV0RmlsdGVySG9va19UaWNrZXRPcHRpb25zRW5kIC0tPgoKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpUaWNrZXRPcHRpb25zIC0tPgoKPCEtLSBPdXRwdXRGaWx0ZXJIb29rX05vVGlja2V0T3B0aW9uc0ZhbGxiYWNrIC0tPgoKICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz0iTWFuZGF0b3J5IiBmb3I9IlJpY2hUZXh0Ij48c3BhbiBjbGFzcz0iTWFya2VyIj4qPC9zcGFuPiRUZXh0eyJUZXh0In06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IlJpY2hUZXh0RmllbGQiPgoKPCEtLSBkdGw6YmxvY2s6UmljaFRleHQgLS0+CiRJbmNsdWRleyJSaWNoVGV4dEVkaXRvciJ9CjwhLS0gZHRsOmJsb2NrOlJpY2hUZXh0IC0tPgoKICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgaWQ9IlJpY2hUZXh0IiBjbGFzcz0iUmljaFRleHQgVmFsaWRhdGVfUmVxdWlyZWQgJERhdGF7IkJvZHlJbnZhbGlkIn0iIG5hbWU9IkJvZHkiIHJvd3M9IjE1IiBjb2xzPSIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUZXh0QXJlYU5vdGUifSI+JFFEYXRheyJCb2R5In08L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlJpY2hUZXh0RXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiVGhpcyBmaWVsZCBpcyByZXF1aXJlZC4ifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJSaWNoVGV4dFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KCiAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IkF0dGFjaG1lbnQifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgIDx1bD4KPCEtLSBkdGw6YmxvY2s6QXR0YWNobWVudCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFFEYXRheyJGaWxlbmFtZSJ9ICgkUURhdGF7IkZpbGVzaXplIn0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgaWQ9IkF0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9IiBuYW1lPSJBdHRhY2htZW50RGVsZXRlJFFEYXRheyJGaWxlSUQifSIgdmFsdWU9IiRUZXh0eyJEZWxldGUifSI+JFRleHR7IkRlbGV0ZSJ9PC9idXR0b24+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjQXR0YWNobWVudERlbGV0ZSRRRGF0YXsiRmlsZUlEIn0nKS5iaW5kKCdjbGljaycsIGZ1bmN0aW9uICgpIHsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJCgnI0F0dGFjaG1lbnREZWxldGUkUURhdGF7IkZpbGVJRCJ9JykuY2xvc2VzdCgnZm9ybScpKTsKICAgIH0pOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+CjwhLS0gZHRsOmJsb2NrOkF0dGFjaG1lbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBuYW1lPSJGaWxlVXBsb2FkIiBpZD0iRmlsZVVwbG9hZCIgdHlwZT0iZmlsZSIgc2l6ZT0iNDAiLz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJBdHRhY2htZW50VXBsb2FkIiBuYW1lPSJBdHRhY2htZW50VXBsb2FkIiB2YWx1ZT0iMCIgLz4KICAgICAgICAgICAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICAgICAgICA8L3VsPgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgJCgnI0ZpbGVVcGxvYWQnKS5iaW5kKCdjaGFuZ2UnLCBmdW5jdGlvbiAoRXZlbnQpIHsKICAgICAgICB2YXIgJEZvcm0gPSAkKCcjRmlsZVVwbG9hZCcpLmNsb3Nlc3QoJ2Zvcm0nKTsKICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJEZvcm0pOwogICAgICAgICRGb3JtLmZpbmQoJyNBdHRhY2htZW50VXBsb2FkJykudmFsKCcxJykuZW5kKCkuc3VibWl0KCk7CgogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgoKPCEtLSBkdGw6YmxvY2s6QXJ0aWNsZVR5cGUgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJBcnRpY2xlVHlwZUlEIj4kVGV4dHsiTm90ZSB0eXBlIn06PC9sYWJlbD4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZVR5cGVTdHJnIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlVHlwZSAtLT4KPCEtLSBkdGw6YmxvY2s6Tm90ZSAtLT4KCjwhLS0gZHRsOmJsb2NrOlN0YXRlIC0tPgogICAgICAgICAgICAgICAgPGxhYmVsIGZvcj0iTmV3U3RhdGVJRCI+JFRleHR7Ik5leHQgc3RhdGUifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJTdGF0ZVN0cmcifQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+Cgo8IS0tIGR0bDpibG9jazpTdGF0ZVBlbmRpbmcgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWw+JFRleHR7IlBlbmRpbmcgZGF0ZSJ9OjwvbGFiZWw+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkRhdGVTdHJpbmcifQogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRheVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IkRhdGUgaW52YWxpZCEifTwvcD48L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJIb3VyU2VydmVyRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiRGF0ZSBpbnZhbGlkISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlN0YXRlUGVuZGluZyAtLT4KPCEtLSBkdGw6YmxvY2s6U3RhdGUgLS0+CgojIC0tLQojIElUU00KIyAtLS0KPCEtLSBkdGw6YmxvY2s6SW1wYWN0IC0tPgogICAgICAgICAgICAgICAgPGxhYmVsPiRUZXh0eyJJbXBhY3QifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJJbXBhY3RTdHJnIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpJbXBhY3QgLS0+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAkKCcjVGlja2V0RnJlZVRleHQxNCcpLmJpbmQoJ2NoYW5nZScsIGZ1bmN0aW9uIChFdmVudCkgewogICAgICAgICQoJyNFeHBhbmQnKS52YWwoJzMnKTsKICAgICAgICBDb3JlLkFKQVguRm9ybVVwZGF0ZSgkKCcjQ29tcG9zZScpLCAnQUpBWFVwZGF0ZScsICdUaWNrZXRGcmVlVGV4dDE0JywgWydOZXdQcmlvcml0eUlEJ10pOwogICAgfSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS1kdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUtLT4KIyAtLS0KPCEtLSBkdGw6YmxvY2s6UHJpb3JpdHkgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJOZXdQcmlvcml0eUlEIj4kVGV4dHsiUHJpb3JpdHkifTo8L2xhYmVsPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJQcmlvcml0eVN0cmcifQogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlByaW9yaXR5IC0tPgoKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZUtleUZpZWxkIn0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRleHRGaWVsZCJ9CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQgLS0+CgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCB0aWNrZXQgZnJlZXRleHQgYmxvY2tzIGZvciBjdXN0b21pemF0aW9ucwojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQxIn0KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMSJ9CiMgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlS2V5RmllbGQyIn0KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGV4dEZpZWxkMiJ9CiMgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRleHQyIC0tPgoKPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUgLS0+CiAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkifQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGltZSJ9CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGlja2V0RnJlZVRpbWUkRGF0YXsiQ291bnQifVVzZWRFcnJvciIgY2xhc3M9IlRvb2x0aXBFcnJvck1lc3NhZ2UiPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lIC0tPgoKIyBleGFtcGxlIG9mIGhvdyB0byB1c2UgZml4ZWQgdGlja2V0IGZyZWV0aW1lIGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIzwhLS0gZHRsOmJsb2NrOlRpY2tldEZyZWVUaW1lMSAtLT4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD4kRGF0YXsiVGlja2V0RnJlZVRpbWVLZXkxIn06PC9sYWJlbD4KIyAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRGF0YXsiVGlja2V0RnJlZVRpbWUxIn0KIyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2PgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUxIC0tPgojPCEtLSBkdGw6YmxvY2s6VGlja2V0RnJlZVRpbWUyIC0tPgojICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPiREYXRheyJUaWNrZXRGcmVlVGltZUtleTIifTo8L2xhYmVsPgojICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJUaWNrZXRGcmVlVGltZTIifQojICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiMgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpUaWNrZXRGcmVlVGltZTIgLS0+Cgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CiAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVLZXlGaWVsZCJ9CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVGcmVlVGV4dEZpZWxkIn0KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iQ2xlYXIiPjwvZGl2Pgo8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQgLS0+CgojIGV4YW1wbGUgb2YgaG93IHRvIHVzZSBmaXhlZCBhcnRpY2xlIGZyZWV0ZXh0IGJsb2NrcyBmb3IgY3VzdG9taXphdGlvbnMKIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiMgICAgICAgICAgICAgICAgJERhdGF7IkFydGljbGVGcmVlS2V5RmllbGQxIn0KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiMgICAgICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZVRleHRGaWVsZDEifQojICAgICAgICAgICAgICAgIDwvZGl2PgojICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KIzwhLS0gZHRsOmJsb2NrOkFydGljbGVGcmVlVGV4dDEgLS0+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgojICAgICAgICAgICAgICAgICREYXRheyJBcnRpY2xlRnJlZUtleUZpZWxkMiJ9CiMgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgojICAgICAgICAgICAgICAgICAgICAkRGF0YXsiQXJ0aWNsZUZyZWVUZXh0RmllbGQyIn0KIyAgICAgICAgICAgICAgICA8L2Rpdj4KIyAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CiM8IS0tIGR0bDpibG9jazpBcnRpY2xlRnJlZVRleHQyIC0tPgoKPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzTGFiZWwgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPSJUaW1lVW5pdHMiPiRUZXh0eyJUaW1lIHVuaXRzIn0kVGV4dHsiJENvbmZpZ3siVGlja2V0OjpGcm9udGVuZDo6VGltZVVuaXRzIn0ifTo8L2xhYmVsPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHNMYWJlbCAtLT4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzTGFiZWxNYW5kYXRvcnkgLS0+CiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJUaW1lVW5pdHMiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+JFRleHR7IlRpbWUgdW5pdHMifSRUZXh0eyIkQ29uZmlneyJUaWNrZXQ6OkZyb250ZW5kOjpUaW1lVW5pdHMifSJ9OjwvbGFiZWw+CjwhLS0gZHRsOmJsb2NrOlRpbWVVbml0c0xhYmVsTWFuZGF0b3J5IC0tPgo8IS0tIGR0bDpibG9jazpUaW1lVW5pdHMgLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCI+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVVbml0cyIgaWQ9IlRpbWVVbml0cyIgdmFsdWU9IiRRRGF0YXsiVGltZVVuaXRzIn0iIGNsYXNzPSJWYWxpZGF0ZV9UaW1lVW5pdHMgJFFEYXRheyJUaW1lVW5pdHNSZXF1aXJlZCJ9ICRRRGF0YXsiVGltZVVuaXRzSW52YWxpZCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iVGltZVVuaXRzRXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIj48cD4kVGV4dHsiSW52YWxpZCB0aW1lISJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IlRpbWVVbml0c1NlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkNsZWFyIj48L2Rpdj4KPCEtLSBkdGw6YmxvY2s6VGltZVVuaXRzIC0tPgoKICAgICAgICAgICAgPC9maWVsZHNldD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJGb290ZXIiPgogICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJQcmltYXJ5IiBpZD0ic3VibWl0UmljaFRleHQiIGFjY2Vzc2tleT0iZyIgdGl0bGU9IiRUZXh0eyJTdWJtaXQifSAoZykiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTdWJtaXQifSI+JFRleHR7IlN1Ym1pdCJ9PC9idXR0b24+CiAgICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KPC9mb3JtPgo8IS0tIGR0bDpibG9jazpQcm9wZXJ0aWVzIC0tPgoKI0xheWVycwo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5BZ2VudC5UaWNrZXRBY3Rpb24uSW5pdCgpOwovL11dPjwvc2NyaXB0Pgo8IS0tZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlLS0+Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIGZpcnN0IGxldmVsIHNvbHV0aW9uIHJhdGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01UaWNrZXRGaXJzdExldmVsU29sdXRpb25SYXRlLnBtLHYgMS42IDIwMTAvMDkvMDYgMjA6NDY6NTIgZHogRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOjpEeW5hbWljOjpJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6UXVldWU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTTEE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6U3RhdGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0Owp1c2UgS2VybmVsOjpTeXN0ZW06OlR5cGU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoREJPYmplY3QgRW5jb2RlT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBUaW1lT2JqZWN0IE1haW5PYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57U3RhdGVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlN0YXRlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1F1ZXVlT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpRdWV1ZS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUaWNrZXRPYmplY3R9ICAgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ByaW9yaXR5T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpQcmlvcml0eS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lclVzZXJ9ICAgPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1NlcnZpY2VPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1NMQU9iamVjdH0gICAgICA9IEtlcm5lbDo6U3lzdGVtOjpTTEEtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VHlwZU9iamVjdH0gICAgID0gS2VybmVsOjpTeXN0ZW06OlR5cGUtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBHZXRPYmplY3ROYW1lIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgcmV0dXJuICdJVFNNVGlja2V0Rmlyc3RMZXZlbFNvbHV0aW9uUmF0ZSc7Cn0KCnN1YiBHZXRPYmplY3RBdHRyaWJ1dGVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZXQgdXNlciBsaXN0CiAgICBteSAlVXNlckxpc3QgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyTGlzdCgKICAgICAgICBUeXBlICA9PiAnTG9uZycsCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICk7CgogICAgIyBnZXQgc3RhdGUgbGlzdAogICAgbXkgJVN0YXRlTGlzdCA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldFN0YXRlc0J5VHlwZSgKICAgICAgICBTdGF0ZVR5cGUgPT4gWydjbG9zZWQnXSwKICAgICAgICBSZXN1bHQgICAgPT4gJ0hBU0gnLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICAjIGdldCBxdWV1ZSBsaXN0CiAgICBteSAlUXVldWVMaXN0ID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPkdldEFsbFF1ZXVlcygpOwoKICAgICMgZ2V0IHByaW9yaXR5IGxpc3QKICAgIG15ICVQcmlvcml0eUxpc3QgPSAkU2VsZi0+e1ByaW9yaXR5T2JqZWN0fS0+UHJpb3JpdHlMaXN0KAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGdldCBjdXJyZW50IHRpbWUgdG8gZml4IGJ1ZyMzODMwCiAgICBteSAkVGltZVN0YW1wID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+Q3VycmVudFRpbWVzdGFtcCgpOwogICAgbXkgKCREYXRlKSA9IHNwbGl0IC9ccysvLCAkVGltZVN0YW1wOwogICAgbXkgJFRvZGF5ID0gc3ByaW50ZiAiJXMgMjM6NTk6NTkiLCAkRGF0ZTsKCiAgICBteSBAT2JqZWN0QXR0cmlidXRlcyA9ICgKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1F1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnUXVldWVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlUXVldWVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1N0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1ByaW9yaXR5JywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBpbiBRdWV1ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ0NyZWF0ZWRRdWV1ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgUHJpb3JpdHknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVkUHJpb3JpdHlJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVByaW9yaXR5TGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBTdGF0ZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRTdGF0ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlU3RhdGVMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUaXRsZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVyVXNlckxvZ2luJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyTG9naW4nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0Zyb20nLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVG8nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUbycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDYycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NjJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdTdWJqZWN0JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdCb2R5JywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NyZWF0ZSBUaW1lJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlVGltZScsCiAgICAgICAgICAgIFRpbWVQZXJpb2RGb3JtYXQgPT4gJ0RhdGVJbnB1dEZvcm1hdCcsICAgICMgJ0RhdGVJbnB1dEZvcm1hdExvbmcnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdUaW1lJywKICAgICAgICAgICAgVGltZVN0b3AgICAgICAgICA9PiAkVG9kYXksCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gewogICAgICAgICAgICAgICAgVGltZVN0YXJ0ID0+ICdUaWNrZXRDcmVhdGVUaW1lTmV3ZXJEYXRlJywKICAgICAgICAgICAgICAgIFRpbWVTdG9wICA9PiAnVGlja2V0Q3JlYXRlVGltZU9sZGVyRGF0ZScsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICk7CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpTZXJ2aWNlJykgKSB7CgogICAgICAgICMgZ2V0IHNlcnZpY2UgbGlzdAogICAgICAgIG15ICVTZXJ2aWNlID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHNsYSBsaXN0CiAgICAgICAgbXkgJVNMQSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZUFkZCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdTZXJ2aWNlSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVNlcnZpY2UsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1NMQScsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdTTEFJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlU0xBLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHVuc2hpZnQgQE9iamVjdEF0dHJpYnV0ZXMsIEBPYmplY3RBdHRyaWJ1dGVBZGQ7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnVGlja2V0OjpUeXBlJykgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCB0eXBlIGxpc3QKICAgICAgICBteSAlVHlwZSA9ICRTZWxmLT57VHlwZU9iamVjdH0tPlR5cGVMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlMSA9ICgKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnVHlwZScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1R5cGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVHlwZSwKICAgICAgICApOwoKICAgICAgICB1bnNoaWZ0IEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTE7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OlVzZUFnZW50RWxlbWVudEluU3RhdHMnKSApIHsKCiAgICAgICAgbXkgQE9iamVjdEF0dHJpYnV0ZUFkZCA9ICgKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnT3duZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ0NyZWF0ZWQgYnkgQWdlbnQvT3duZXInLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnQ3JlYXRlZFVzZXJJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlSURzJywKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVVzZXJMaXN0LAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIEBPYmplY3RBdHRyaWJ1dGVBZGQ7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnU3RhdHM6OkN1c3RvbWVySURBc011bHRpU2VsZWN0JykgKSB7CgogICAgICAgICMgR2V0IEN1c3RvbWVySUQKICAgICAgICAjIChUaGlzIHdheSBhbHNvIGNhbiBiZSB0aGUgc29sdXRpb24gZm9yIHRoZSBDdXN0b21lclVzZXJJRCkKICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgRElTVElOQ1QgY3VzdG9tZXJfaWQgRlJPTSB0aWNrZXQnLAogICAgICAgICk7CgogICAgICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgICAgIG15ICVDdXN0b21lcklEOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIGlmICggJFJvd1swXSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcklEeyAkUm93WzBdIH0gPSAkUm93WzBdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlQ3VzdG9tZXJJRCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQoKICAgIEZSRUVLRVk6CiAgICBmb3IgbXkgJEZyZWVLZXkgKCAxIC4uIDE2ICkgewoKICAgICAgICAjIGdldCB0aWNrZXQgZnJlZSBrZXkgY29uZmlnCiAgICAgICAgbXkgJFRpY2tldEZyZWVLZXkgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ1RpY2tldEZyZWVLZXknIC4gJEZyZWVLZXkgKTsKCiAgICAgICAgbmV4dCBGUkVFS0VZIGlmIHJlZiAkVGlja2V0RnJlZUtleSBuZSAnSEFTSCc7CgogICAgICAgIG15IEBGcmVlS2V5ID0ga2V5cyAleyRUaWNrZXRGcmVlS2V5fTsKICAgICAgICBteSAkTmFtZSAgICA9ICcnOwoKICAgICAgICBpZiAoIHNjYWxhciBARnJlZUtleSA9PSAxICkgewogICAgICAgICAgICAkTmFtZSA9ICRUaWNrZXRGcmVlS2V5LT57ICRGcmVlS2V5WzBdIH07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTmFtZSA9ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleTsKCiAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdUaWNrZXRGcmVlS2V5JyAuICRGcmVlS2V5LAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnVGlja2V0RnJlZUtleScgLiAkRnJlZUtleSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiAkVGlja2V0RnJlZUtleSwKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgIH0KCiAgICAgICAgIyBnZXQgdGlja2V0IGZyZWUgdGV4dAogICAgICAgIG15ICRUaWNrZXRGcmVlVGV4dCA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+VGlja2V0RnJlZVRleHRHZXQoCiAgICAgICAgICAgIFR5cGUgICA9PiAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXksCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgkVGlja2V0RnJlZVRleHQpIHsKCiAgICAgICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICROYW1lLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnVGlja2V0RnJlZVRleHQnIC4gJEZyZWVLZXksCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gJFRpY2tldEZyZWVUZXh0LAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewoKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleSwsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gQE9iamVjdEF0dHJpYnV0ZXM7Cn0KCnN1YiBHZXRTdGF0RWxlbWVudCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdXNlIGFsbCBjbG9zZWQgc3RhdHMgaWYgbm8gc3RhdGVzIGFyZSBnaXZlbgogICAgaWYgKCAhJFBhcmFte1N0YXRlSURzfSApIHsKICAgICAgICAkUGFyYW17U3RhdGVUeXBlfSA9IFsnY2xvc2VkJ107CiAgICB9CgogICAgIyBzdGFydCB0aWNrZXQgc2VhcmNoCiAgICBteSBAVGlja2V0U2VhcmNoSURzID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goCiAgICAgICAgJVBhcmFtLAogICAgICAgIFJlc3VsdCAgICAgPT4gJ0FSUkFZJywKICAgICAgICBMaW1pdCAgICAgID0+IDEwMF8wMDBfMDAwLAogICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICBQZXJtaXNzaW9uID0+ICdybycsCiAgICApOwoKICAgIHJldHVybiAwIGlmICFAVGlja2V0U2VhcmNoSURzOwoKICAgIG15ICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzID0gMDsKICAgIFRJQ0tFVElEOgogICAgZm9yIG15ICRUaWNrZXRJRCAoQFRpY2tldFNlYXJjaElEcykgewoKICAgICAgICAjIGdldCBhcnRpY2xlIGRhdGEgbGlzdAogICAgICAgIG15ICRBcnRpY2xlRGF0YUxpc3QgPSAkU2VsZi0+X0FydGljbGVEYXRhR2V0KAogICAgICAgICAgICBUaWNrZXRJRCA9PiAkVGlja2V0SUQsCiAgICAgICAgKTsKCiAgICAgICAgcmV0dXJuICdFUlJPUicgaWYgISRBcnRpY2xlRGF0YUxpc3Q7CgogICAgICAgIG5leHQgVElDS0VUSUQgaWYgIUB7JEFydGljbGVEYXRhTGlzdH07CiAgICAgICAgbmV4dCBUSUNLRVRJRCBpZiBAeyRBcnRpY2xlRGF0YUxpc3R9ID4gMjsKCiAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGlzIGEgcGhvbmUgYXJ0aWNsZQogICAgICAgIGlmICggJEFydGljbGVEYXRhTGlzdC0+WzBdLT57QXJ0aWNsZVR5cGVJRH0gZXEgJFNlbGYtPntQaG9uZVR5cGVJRH0gKSB7CgogICAgICAgICAgICBpZiAoICEkQXJ0aWNsZURhdGFMaXN0LT5bMV0gKSB7CiAgICAgICAgICAgICAgICAkRmlyc3RMZXZlbFNvbHV0aW9uVGlja2V0cysrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IFRJQ0tFVElEOwogICAgICAgIH0KCiAgICAgICAgIyBmaXJzdCBhcnRpY2xlIGlzIGFuIGV4dGVybmFsIGVtYWlsIGFydGljbGUKICAgICAgICBpZiAoICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FydGljbGVUeXBlSUR9IGVxICRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0gKSB7CgogICAgICAgICAgICAjIGZpcnN0IGFydGlsY2UgY29tZXMgZnJvbSBhbiBhZ2VudCAoRW1haWwtVGlja2V0KQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBZ2VudFNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAkQXJ0aWNsZURhdGFMaXN0LT5bMF0tPntBZ2VudFNlbmRlclR5cGVJRH0gZXEgJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICYmICEkQXJ0aWNsZURhdGFMaXN0LT5bMV0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgICAgIG5leHQgVElDS0VUSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZmlyc3QgYXJ0aWNsZSBjb21lcyBmcm9tIGN1c3RvbWVyIGFuZCB0aGUgc2Vjb25kIG9uZSBmcm9tIGFuIGFnZW50CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FnZW50U2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICRBcnRpY2xlRGF0YUxpc3QtPlswXS0+e0FnZW50U2VuZGVyVHlwZUlEfSBlcSAkU2VsZi0+e0N1c3RvbWVyU2VuZGVyVHlwZUlEfQogICAgICAgICAgICAgICAgJiYgJEFydGljbGVEYXRhTGlzdC0+WzFdCiAgICAgICAgICAgICAgICAmJiAkQXJ0aWNsZURhdGFMaXN0LT5bMV0tPntBZ2VudFNlbmRlclR5cGVJRH0gZXEgJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0KICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgJEZpcnN0TGV2ZWxTb2x1dGlvblRpY2tldHMrKzsKICAgICAgICAgICAgICAgIG5leHQgVElDS0VUSUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRGaXJzdExldmVsU29sdXRpb25UaWNrZXRzOwp9CgpzdWIgX0FydGljbGVEYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkUGFyYW17VGlja2V0SUR9OwoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgdHlwZSAncGhvbmUnCiAgICBpZiAoICEkU2VsZi0+e1Bob25lVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e1Bob25lVHlwZUlEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+QXJ0aWNsZVR5cGVMb29rdXAoCiAgICAgICAgICAgIEFydGljbGVUeXBlID0+ICdwaG9uZScsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBhcnRpY2xlIHR5cGUgJ2VtYWlsLWV4dGVybmFsJwogICAgaWYgKCAhJFNlbGYtPntFbWFpbEV4dGVybmFsVHlwZUlEfSApIHsKICAgICAgICAkU2VsZi0+e0VtYWlsRXh0ZXJuYWxUeXBlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlVHlwZUxvb2t1cCgKICAgICAgICAgICAgQXJ0aWNsZVR5cGUgPT4gJ2VtYWlsLWV4dGVybmFsJywKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGlkIG9mIGFydGljbGUgc2VuZGVyIHR5cGUgJ2FnZW50JwogICAgaWYgKCAhJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0gKSB7CiAgICAgICAgJFNlbGYtPntBZ2VudFNlbmRlclR5cGVJRH0gPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPkFydGljbGVTZW5kZXJUeXBlTG9va3VwKAogICAgICAgICAgICBTZW5kZXJUeXBlID0+ICdhZ2VudCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBpZCBvZiBhcnRpY2xlIHNlbmRlciB0eXBlICdjdXN0b21lcicKICAgIGlmICggISRTZWxmLT57Q3VzdG9tZXJTZW5kZXJUeXBlSUR9ICkgewogICAgICAgICRTZWxmLT57Q3VzdG9tZXJTZW5kZXJUeXBlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5BcnRpY2xlU2VuZGVyVHlwZUxvb2t1cCgKICAgICAgICAgICAgU2VuZGVyVHlwZSA9PiAnY3VzdG9tZXInLAogICAgICAgICk7CiAgICB9CgogICAgIyBhc2sgZGF0YWJhc2UKICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCA9PiAnU0VMRUNUIGFydGljbGVfdHlwZV9pZCwgYXJ0aWNsZV9zZW5kZXJfdHlwZV9pZCBGUk9NIGFydGljbGUgJwogICAgICAgICAgICAuICdXSEVSRSB0aWNrZXRfaWQgPSA/IEFORCBhcnRpY2xlX3R5cGVfaWQgSU4gKCA/LCA/ICkgQU5EICcKICAgICAgICAgICAgLiAnYXJ0aWNsZV9zZW5kZXJfdHlwZV9pZCBJTiAoID8sID8gKSAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNyZWF0ZV90aW1lJywKICAgICAgICBCaW5kID0+IFsKICAgICAgICAgICAgXCRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e1Bob25lVHlwZUlEfSwKICAgICAgICAgICAgXCRTZWxmLT57RW1haWxFeHRlcm5hbFR5cGVJRH0sCiAgICAgICAgICAgIFwkU2VsZi0+e0FnZW50U2VuZGVyVHlwZUlEfSwKICAgICAgICAgICAgXCRTZWxmLT57Q3VzdG9tZXJTZW5kZXJUeXBlSUR9LAogICAgICAgIF0sCiAgICAgICAgTGltaXQgPT4gMywKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAQXJ0aWNsZURhdGFMaXN0OwogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKCiAgICAgICAgbXkgJUFydGljbGVEYXRhOwogICAgICAgICRBcnRpY2xlRGF0YXtBcnRpY2xlVHlwZUlEfSAgICAgICA9ICRSb3dbMF07CiAgICAgICAgJEFydGljbGVEYXRhe0FydGljbGVTZW5kZXJUeXBlSUR9ID0gJFJvd1sxXTsKCiAgICAgICAgcHVzaCBAQXJ0aWNsZURhdGFMaXN0LCBcJUFydGljbGVEYXRhOwogICAgfQoKICAgIHJldHVybiBcQEFydGljbGVEYXRhTGlzdDsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3RhdHMvRHluYW1pYy9JVFNNVGlja2V0U29sdXRpb25UaW1lQXZlcmFnZS5wbSAtIHN0YXRzIGZ1bmN0aW9ucyBmb3IgdGhlIHNvbHV0aW9uIHRpbWUgYXZlcmFnZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogSVRTTVRpY2tldFNvbHV0aW9uVGltZUF2ZXJhZ2UucG0sdiAxLjYgMjAxMC8wNy8xNSAwOTo0NToyMCB1YiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3RhdHM6OkR5bmFtaWM6OklUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpRdWV1ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlNMQTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdGF0ZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VHlwZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhEQk9iamVjdCBFbmNvZGVPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBVc2VyT2JqZWN0IFRpbWVPYmplY3QgTWFpbk9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntTdGF0ZU9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UXVldWVPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OlF1ZXVlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1RpY2tldE9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57UHJpb3JpdHlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlByaW9yaXR5LT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0N1c3RvbWVyVXNlcn0gICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gID0gS2VybmVsOjpTeXN0ZW06OlNlcnZpY2UtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U0xBT2JqZWN0fSAgICAgID0gS2VybmVsOjpTeXN0ZW06OlNMQS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntUeXBlT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6VHlwZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIEdldE9iamVjdE5hbWUgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJ0lUU01UaWNrZXRTb2x1dGlvblRpbWVBdmVyYWdlJzsKfQoKc3ViIEdldE9iamVjdEF0dHJpYnV0ZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCB1c2VyIGxpc3QKICAgIG15ICVVc2VyTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJMaXN0KAogICAgICAgIFR5cGUgID0+ICdMb25nJywKICAgICAgICBWYWxpZCA9PiAwLAogICAgKTsKCiAgICAjIGdldCBzdGF0ZSBsaXN0CiAgICBteSAlU3RhdGVMaXN0ID0gJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlR2V0U3RhdGVzQnlUeXBlKAogICAgICAgIFN0YXRlVHlwZSA9PiBbJ2Nsb3NlZCddLAogICAgICAgIFJlc3VsdCAgICA9PiAnSEFTSCcsCiAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICApOwoKICAgICMgZ2V0IHF1ZXVlIGxpc3QKICAgIG15ICVRdWV1ZUxpc3QgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+R2V0QWxsUXVldWVzKCk7CgogICAgIyBnZXQgcHJpb3JpdHkgbGlzdAogICAgbXkgJVByaW9yaXR5TGlzdCA9ICRTZWxmLT57UHJpb3JpdHlPYmplY3R9LT5Qcmlvcml0eUxpc3QoCiAgICAgICAgVXNlcklEID0+IDEsCiAgICApOwoKICAgICMgZ2V0IGN1cnJlbnQgdGltZSB0byBmaXggYnVnIzM4MzAKICAgIG15ICRUaW1lU3RhbXAgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5DdXJyZW50VGltZXN0YW1wKCk7CiAgICBteSAoJERhdGUpID0gc3BsaXQgL1xzKy8sICRUaW1lU3RhbXA7CiAgICBteSAkVG9kYXkgPSBzcHJpbnRmICIlcyAyMzo1OTo1OSIsICREYXRlOwoKICAgIG15IEBPYmplY3RBdHRyaWJ1dGVzID0gKAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnUXVldWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdRdWV1ZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVRdWV1ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1N0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnU3RhdGVJRHMnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiBcJVN0YXRlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnUHJpb3JpdHknLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdQcmlvcml0eUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdDcmVhdGVkIGluIFF1ZXVlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnQ3JlYXRlZFF1ZXVlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiBcJVF1ZXVlTGlzdCwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBQcmlvcml0eScsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMSwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAxLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0NyZWF0ZWRQcmlvcml0eUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgID0+IFwlUHJpb3JpdHlMaXN0LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdDcmVhdGVkIFN0YXRlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ3JlYXRlZFN0YXRlSURzJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVTdGF0ZUxpc3QsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnVGl0bGUnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyTG9naW4nLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lclVzZXJMb2dpbicsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdGcm9tJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnRnJvbScsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICdUbycsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RvJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0NjJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAnQ2MnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnU3ViamVjdCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1N1YmplY3QnLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnVGV4dCcsCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ0JvZHknLAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAnQ3JlYXRlIFRpbWUnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDcmVhdGVUaW1lJywKICAgICAgICAgICAgVGltZVBlcmlvZEZvcm1hdCA9PiAnRGF0ZUlucHV0Rm9ybWF0JywgICAgIyAnRGF0ZUlucHV0Rm9ybWF0TG9uZycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ1RpbWUnLAogICAgICAgICAgICBUaW1lU3RvcCAgICAgICAgID0+ICRUb2RheSwKICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICA9PiB7CiAgICAgICAgICAgICAgICBUaW1lU3RhcnQgPT4gJ1RpY2tldENyZWF0ZVRpbWVOZXdlckRhdGUnLAogICAgICAgICAgICAgICAgVGltZVN0b3AgID0+ICdUaWNrZXRDcmVhdGVUaW1lT2xkZXJEYXRlJywKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgKTsKCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlNlcnZpY2UnKSApIHsKCiAgICAgICAgIyBnZXQgc2VydmljZSBsaXN0CiAgICAgICAgbXkgJVNlcnZpY2UgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTGlzdCgKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgc2xhIGxpc3QKICAgICAgICBteSAlU0xBID0gJFNlbGYtPntTTEFPYmplY3R9LT5TTEFMaXN0KAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdTZXJ2aWNlJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1NlcnZpY2VJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlU2VydmljZSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnU0xBJywKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgICAgPT4gMSwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgICAgPT4gJ1NMQUlEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVTTEEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgdW5zaGlmdCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdUaWNrZXQ6OlR5cGUnKSApIHsKCiAgICAgICAgIyBnZXQgdGlja2V0IHR5cGUgbGlzdAogICAgICAgIG15ICVUeXBlID0gJFNlbGYtPntUeXBlT2JqZWN0fS0+VHlwZUxpc3QoCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUxID0gKAogICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdUeXBlJywKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gICAgPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnVHlwZUlEcycsCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVUeXBlLAogICAgICAgICk7CgogICAgICAgIHVuc2hpZnQgQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlMTsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6VXNlQWdlbnRFbGVtZW50SW5TdGF0cycpICkgewoKICAgICAgICBteSBAT2JqZWN0QXR0cmlidXRlQWRkID0gKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgICAgICAgID0+ICdBZ2VudC9Pd25lcicsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdPd25lcklEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnQ3JlYXRlZCBieSBBZ2VudC9Pd25lcicsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdDcmVhdGVkVXNlcklEcycsCiAgICAgICAgICAgICAgICBCbG9jayAgICAgICAgICAgICAgID0+ICdNdWx0aVNlbGVjdEZpZWxkJywKICAgICAgICAgICAgICAgIExhbmd1YWdlVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgICAgPT4gXCVVc2VyTGlzdCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICAgICA9PiAnUmVzcG9uc2libGUnLAogICAgICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiAgICA9PiAxLAogICAgICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICAgICA9PiAnUmVzcG9uc2libGVJRHMnLAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+IFwlVXNlckxpc3QsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgQE9iamVjdEF0dHJpYnV0ZUFkZDsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdTdGF0czo6Q3VzdG9tZXJJREFzTXVsdGlTZWxlY3QnKSApIHsKCiAgICAgICAgIyBHZXQgQ3VzdG9tZXJJRAogICAgICAgICMgKFRoaXMgd2F5IGFsc28gY2FuIGJlIHRoZSBzb2x1dGlvbiBmb3IgdGhlIEN1c3RvbWVyVXNlcklEKQogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJ1NFTEVDVCBESVNUSU5DVCBjdXN0b21lcl9pZCBGUk9NIHRpY2tldCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICAgICAgbXkgJUN1c3RvbWVySUQ7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgaWYgKCAkUm93WzBdICkgewogICAgICAgICAgICAgICAgJEN1c3RvbWVySUR7ICRSb3dbMF0gfSA9ICRSb3dbMF07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDEsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMSwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgIFZhbHVlcyAgICAgICAgICAgPT4gXCVDdXN0b21lcklELAogICAgICAgICk7CgogICAgICAgIHB1c2ggQE9iamVjdEF0dHJpYnV0ZXMsIFwlT2JqZWN0QXR0cmlidXRlOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIG15ICVPYmplY3RBdHRyaWJ1dGUgPSAoCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJ0N1c3RvbWVySUQnLAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICB9CgogICAgRlJFRUtFWToKICAgIGZvciBteSAkRnJlZUtleSAoIDEgLi4gMTYgKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBmcmVlIGtleSBjb25maWcKICAgICAgICBteSAkVGlja2V0RnJlZUtleSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnVGlja2V0RnJlZUtleScgLiAkRnJlZUtleSApOwoKICAgICAgICBuZXh0IEZSRUVLRVkgaWYgcmVmICRUaWNrZXRGcmVlS2V5IG5lICdIQVNIJzsKCiAgICAgICAgbXkgQEZyZWVLZXkgPSBrZXlzICV7JFRpY2tldEZyZWVLZXl9OwogICAgICAgIG15ICROYW1lICAgID0gJyc7CgogICAgICAgIGlmICggc2NhbGFyIEBGcmVlS2V5ID09IDEgKSB7CiAgICAgICAgICAgICROYW1lID0gJFRpY2tldEZyZWVLZXktPnsgJEZyZWVLZXlbMF0gfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICROYW1lID0gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5OwoKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJ1RpY2tldEZyZWVLZXknIC4gJEZyZWVLZXksCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdUaWNrZXRGcmVlS2V5JyAuICRGcmVlS2V5LAogICAgICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICAgICA9PiAnTXVsdGlTZWxlY3RGaWVsZCcsCiAgICAgICAgICAgICAgICBWYWx1ZXMgICAgICAgICAgICAgID0+ICRUaWNrZXRGcmVlS2V5LAogICAgICAgICAgICAgICAgTGFuZ3VhZ2VUcmFuc2xhdGlvbiA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB0aWNrZXQgZnJlZSB0ZXh0CiAgICAgICAgbXkgJFRpY2tldEZyZWVUZXh0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRGcmVlVGV4dEdldCgKICAgICAgICAgICAgVHlwZSAgID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCRUaWNrZXRGcmVlVGV4dCkgewoKICAgICAgICAgICAgbXkgJU9iamVjdEF0dHJpYnV0ZSA9ICgKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgICAgPT4gJE5hbWUsCiAgICAgICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzICAgID0+IDEsCiAgICAgICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uICAgID0+IDEsCiAgICAgICAgICAgICAgICBFbGVtZW50ICAgICAgICAgICAgID0+ICdUaWNrZXRGcmVlVGV4dCcgLiAkRnJlZUtleSwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgICAgPT4gJ011bHRpU2VsZWN0RmllbGQnLAogICAgICAgICAgICAgICAgVmFsdWVzICAgICAgICAgICAgICA9PiAkVGlja2V0RnJlZVRleHQsCiAgICAgICAgICAgICAgICBMYW5ndWFnZVRyYW5zbGF0aW9uID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBPYmplY3RBdHRyaWJ1dGVzLCBcJU9iamVjdEF0dHJpYnV0ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CgogICAgICAgICAgICBteSAlT2JqZWN0QXR0cmlidXRlID0gKAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkTmFtZSwKICAgICAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJ1RpY2tldEZyZWVUZXh0JyAuICRGcmVlS2V5LCwKICAgICAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAT2JqZWN0QXR0cmlidXRlcywgXCVPYmplY3RBdHRyaWJ1dGU7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAT2JqZWN0QXR0cmlidXRlczsKfQoKc3ViIEdldFN0YXRFbGVtZW50IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyB1c2UgYWxsIGNsb3NlZCBzdGF0cyBpZiBubyBzdGF0ZXMgYXJlIGdpdmVuCiAgICBpZiAoICEkUGFyYW17U3RhdGVJRHN9ICkgewogICAgICAgICRQYXJhbXtTdGF0ZVR5cGV9ID0gWydjbG9zZWQnXTsKICAgIH0KCiAgICAjIHN0YXJ0IHRpY2tldCBzZWFyY2gKICAgIG15IEBUaWNrZXRTZWFyY2hJRHMgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICAgICAlUGFyYW0sCiAgICAgICAgUmVzdWx0ICAgICA9PiAnQVJSQVknLAogICAgICAgIExpbWl0ICAgICAgPT4gMTAwXzAwMF8wMDAsCiAgICAgICAgVXNlcklEICAgICA9PiAxLAogICAgICAgIFBlcm1pc3Npb24gPT4gJ3JvJywKICAgICk7CgogICAgcmV0dXJuICctJyBpZiAhQFRpY2tldFNlYXJjaElEczsKCiAgICBteSAkVGltZSA9IDA7CgogICAgVElDS0VUSUQ6CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0U2VhcmNoSURzKSB7CgogICAgICAgICMgZ2V0IHRpY2tldCBkYXRhCiAgICAgICAgbXkgJFRpY2tldERhdGEgPSAkU2VsZi0+X1RpY2tldERhdGFHZXQoCiAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICApOwoKICAgICAgICByZXR1cm4gJ0VSUk9SJyBpZiAhJXskVGlja2V0RGF0YX07CgogICAgICAgICMgZ2V0IHJlbGV2YW50IHRpY2tldCBoaXN0b3J5CiAgICAgICAgbXkgJEhpc3RvcnlEYXRhID0gJFNlbGYtPl9UaWNrZXRIaXN0b3J5RGF0YUdldCgKICAgICAgICAgICAgVGlja2V0SUQgPT4gJFRpY2tldElELAogICAgICAgICk7CgogICAgICAgIHJldHVybiAnRVJST1InIGlmICEkSGlzdG9yeURhdGE7CgogICAgICAgICMgaWYgdGlja2V0IGlzIGNsb3NlZCBpbiB0aGUgdGlja2V0IGNyZWF0ZSBtYXNrCiAgICAgICAgaWYgKCBAeyRIaXN0b3J5RGF0YX0gPT0gMSApIHsKICAgICAgICAgICAgJFRpbWUgKz0gKCAzICogNjAgKTsKICAgICAgICAgICAgbmV4dCBUSUNLRVRJRDsKICAgICAgICB9CgogICAgICAgIG15ICVUaW1lc3BhbnM7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHskSGlzdG9yeURhdGF9ICkgewoKICAgICAgICAgICAgaWYgKCAkVGltZXNwYW5zeyRDb3VudGVyfSApIHsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdG9wIHRpbWUKICAgICAgICAgICAgICAgICRUaW1lc3BhbnN7JENvdW50ZXJ9LT57U3RvcFRpbWV9ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+VGltZVN0YW1wMlN5c3RlbVRpbWUoCiAgICAgICAgICAgICAgICAgICAgU3RyaW5nID0+ICRFbnRyeS0+e0NyZWF0ZVRpbWV9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISRFbnRyeS0+e1ZpZXdhYmxlfTsKCiAgICAgICAgICAgICAgICAjIHNldCBzdGFydCB0aW1lCiAgICAgICAgICAgICAgICAkVGltZXNwYW5zeyRDb3VudGVyfS0+e1N0YXJ0VGltZX0gPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5UaW1lU3RhbXAyU3lzdGVtVGltZSgKICAgICAgICAgICAgICAgICAgICBTdHJpbmcgPT4gJEVudHJ5LT57Q3JlYXRlVGltZX0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjYWxlbmRhcgogICAgICAgIG15ICRDYWxlbmRhciA9ICRTZWxmLT5fQ2FsZW5kYXJHZXQoCiAgICAgICAgICAgIFRpY2tldERhdGEgPT4gJFRpY2tldERhdGEsCiAgICAgICAgKTsKCiAgICAgICAgZm9yIG15ICRDb3VudCAoIHNvcnQga2V5cyAlVGltZXNwYW5zICkgewoKICAgICAgICAgICAgIyBleHRyYWN0IHRpbWVzdGFtcAogICAgICAgICAgICBteSAkVGltZXNwYW4gPSAkVGltZXNwYW5zeyRDb3VudH07CgogICAgICAgICAgICAkVGltZXNwYW4tPntTdG9wVGltZX0gfHw9ICRUaW1lc3Bhbi0+e1N0YXJ0VGltZX0gKyAoIDMgKiA2MCApOwoKICAgICAgICAgICAgIyBjYWxjdWxhdGUgd29ya2luZyB0aW1lCiAgICAgICAgICAgIG15ICRXb3JraW5nVGltZVBhcnQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5Xb3JraW5nVGltZSgKICAgICAgICAgICAgICAgICV7JFRpbWVzcGFufSwKICAgICAgICAgICAgICAgIENhbGVuZGFyID0+ICRDYWxlbmRhciwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRUaW1lICs9ICRXb3JraW5nVGltZVBhcnQ7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRUaWNrZXRDb3VudCA9IEBUaWNrZXRTZWFyY2hJRHM7CiAgICBteSAkQXZlcmFnZVRpbWUgPSAkVGltZSAvICRUaWNrZXRDb3VudDsKCiAgICAjIHRyYW5zbGF0ZSBzZWNvbmRzIGluIGEgcmVhZGFibGUgZm9ybWF0CiAgICBteSAkVmFsdWUgPSAkU2VsZi0+X1NlY29uZGVUb1N0cmluZygKICAgICAgICBTZWNvbmRzID0+IGludCAkQXZlcmFnZVRpbWUsCiAgICApOwoKICAgIHJldHVybiAkVmFsdWU7Cn0KCnN1YiBfVGlja2V0RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB7fSBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGFzayBkYXRhYmFzZQogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICdTRUxFQ1QgcXVldWVfaWQsIHNsYV9pZCwgY3JlYXRlX3RpbWVfdW5peCAnCiAgICAgICAgICAgIC4gJ0ZST00gdGlja2V0IFdIRVJFIGlkID0gPycsCiAgICAgICAgQmluZCAgPT4gWyBcJFBhcmFte1RpY2tldElEfSBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJVRpY2tldERhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRUaWNrZXREYXRhe1F1ZXVlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkVGlja2V0RGF0YXtTTEFJRH0gICAgICA9ICRSb3dbMV07CiAgICAgICAgJFRpY2tldERhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzJdOwogICAgfQoKICAgIHJldHVybiBcJVRpY2tldERhdGE7Cn0KCnN1YiBfQ2FsZW5kYXJHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb3B0aW9uCiAgICAkU2VsZi0+e1RpY2tldFNlcnZpY2VGZWF0dXJlfSB8fD0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1RpY2tldDo6U2VydmljZScpOwoKICAgIG15ICVFc2NhbGF0aW9uRGF0YTsKICAgIGlmICggJFNlbGYtPntUaWNrZXRTZXJ2aWNlRmVhdHVyZX0gJiYgJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9ICkgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRTZWxmLT57U0xBT2JqZWN0fS0+U0xBR2V0KAogICAgICAgICAgICBTTEFJRCAgPT4gJFBhcmFte1RpY2tldERhdGF9LT57U0xBSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICVFc2NhbGF0aW9uRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCgKICAgICAgICAgICAgSUQgICAgID0+ICRQYXJhbXtUaWNrZXREYXRhfS0+e1F1ZXVlSUR9LAogICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgQ2FjaGUgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJEVzY2FsYXRpb25EYXRhe0NhbGVuZGFyfSB8fCB1bmRlZjsKfQoKc3ViIF9UaWNrZXRIaXN0b3J5RGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhJFBhcmFte1RpY2tldElEfTsKCiAgICAjIGdldCBpZCBvZiBoaXN0b3kgdHlwZSBTdGF0ZVVwZGF0ZQogICAgaWYgKCAhJFNlbGYtPntTdGF0ZVVwZGF0ZUlEfSApIHsKICAgICAgICAkU2VsZi0+e1N0YXRlVXBkYXRlSUR9ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5IaXN0b3J5VHlwZUxvb2t1cCgKICAgICAgICAgICAgVHlwZSA9PiAnU3RhdGVVcGRhdGUnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgaWQgb2YgaGlzdG95IHR5cGUgTmV3VGlja2V0CiAgICBpZiAoICEkU2VsZi0+e05ld1RpY2tldElEfSApIHsKICAgICAgICAkU2VsZi0+e05ld1RpY2tldElEfSA9ICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeVR5cGVMb29rdXAoCiAgICAgICAgICAgIFR5cGUgPT4gJ05ld1RpY2tldCcsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCB2aWV3YWJsZSBzdGF0ZSBpZHMKICAgIGlmICggISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30gKSB7CiAgICAgICAgbXkgQFZpZXdhYmxlU3RhdGVJRHMgPSAkU2VsZi0+e1N0YXRlT2JqZWN0fS0+U3RhdGVHZXRTdGF0ZXNCeVR5cGUoCiAgICAgICAgICAgIFR5cGUgICA9PiAnVmlld2FibGUnLAogICAgICAgICAgICBSZXN1bHQgPT4gJ0lEJywKICAgICAgICApOwoKICAgICAgICBteSAlVmlld2FibGVTdGF0ZUlETGlzdDsKICAgICAgICBmb3IgbXkgJFN0YXRlSUQgKEBWaWV3YWJsZVN0YXRlSURzKSB7CiAgICAgICAgICAgICRWaWV3YWJsZVN0YXRlSURMaXN0eyRTdGF0ZUlEfSA9IDE7CiAgICAgICAgfQoKICAgICAgICAkU2VsZi0+e1ZpZXdhYmxlU3RhdGVJRHN9ID0gXCVWaWV3YWJsZVN0YXRlSURMaXN0OwogICAgfQoKICAgICMgYXNrIGRhdGFiYXNlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJ1NFTEVDVCBzdGF0ZV9pZCwgY3JlYXRlX3RpbWUgRlJPTSB0aWNrZXRfaGlzdG9yeSAnCiAgICAgICAgICAgIC4gJ1dIRVJFIHRpY2tldF9pZCA9ID8gQU5EIGhpc3RvcnlfdHlwZV9pZCBJTiAoID8sID8gKSAnCiAgICAgICAgICAgIC4gJ09SREVSIEJZIGNyZWF0ZV90aW1lJywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtUaWNrZXRJRH0sIFwkU2VsZi0+e1N0YXRlVXBkYXRlSUR9LCBcJFNlbGYtPntOZXdUaWNrZXRJRH0gXSwKICAgICk7CgogICAgIyBmZXRjaCB0aGUgcmVzdWx0CiAgICBteSBAVGlja2V0SGlzdG9yeUxpc3Q7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAlSGlzdG9yeURhdGE7CiAgICAgICAgJEhpc3RvcnlEYXRhe1N0YXRlSUR9ICAgID0gJFJvd1swXTsKICAgICAgICAkSGlzdG9yeURhdGF7Q3JlYXRlVGltZX0gPSAkUm93WzFdOwoKICAgICAgICBwdXNoIEBUaWNrZXRIaXN0b3J5TGlzdCwgXCVIaXN0b3J5RGF0YTsKICAgIH0KCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKEBUaWNrZXRIaXN0b3J5TGlzdCkgewoKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAwOwogICAgICAgIG5leHQgRU5UUlkgaWYgISRTZWxmLT57Vmlld2FibGVTdGF0ZUlEc30tPnsgJEVudHJ5LT57U3RhdGVJRH0gfTsKICAgICAgICAkRW50cnktPntWaWV3YWJsZX0gPSAxOwogICAgfQoKICAgIHJldHVybiBcQFRpY2tldEhpc3RvcnlMaXN0Owp9CgpzdWIgX1NlY29uZGVUb1N0cmluZyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhZGVmaW5lZCAkUGFyYW17U2Vjb25kc307CgogICAgIyBjYWxjdWxhdGUgdGhlIHNlY29uZHMKICAgIG15ICRTZWNvbmRzID0gJFBhcmFte1NlY29uZHN9ICUgNjA7CiAgICAkUGFyYW17U2Vjb25kc30gPSAoICRQYXJhbXtTZWNvbmRzfSAtICRTZWNvbmRzICkgLyA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgbWludXRlcwogICAgbXkgJE1pbnV0ZXMgPSAkUGFyYW17U2Vjb25kc30gJSA2MDsKCiAgICAjIGNhbGN1bGF0ZSB0aGUgaG91cnMKICAgIG15ICRIb3VycyA9ICggJFBhcmFte1NlY29uZHN9IC0gJE1pbnV0ZXMgKSAvIDYwOwoKICAgICMgc2V0IGRlZmF1bHQgdmFsdWUKICAgICRIb3VycyAgIHx8PSAwOwogICAgJE1pbnV0ZXMgfHw9IDA7CiAgICAkU2Vjb25kcyB8fD0gMDsKCiAgICBpZiAoICRTZWNvbmRzID49IDMwICkgewogICAgICAgICRNaW51dGVzKys7CiAgICB9CgogICAgJE1pbnV0ZXMgPSBzcHJpbnRmICIlMDJkIiwgJE1pbnV0ZXM7CgogICAgbXkgJEhvdXJzU3RyaW5nICAgPSAnSG91cnMnOwogICAgbXkgJE1pbnV0ZXNTdHJpbmcgPSAnTWludXRlcyc7CgogICAgcmV0dXJuICIkSG91cnMgJEhvdXJzU3RyaW5nICRNaW51dGVzICRNaW51dGVzU3RyaW5nIjsKfQoKc3ViIEV4cG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKc3ViIEltcG9ydFdyYXBwZXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gXCVQYXJhbTsKfQoKMTsK
IyAtLQojIElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtIC0gY29kZSB0byBleGNlY3V0ZSBkdXJpbmcgcGFja2FnZSBpbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IElUU01JbmNpZGVudFByb2JsZW1NYW5hZ2VtZW50LnBtLHYgMS4xMCAyMDEwLzA4LzA5IDA2OjUzOjA1IHViIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTeXNDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06Okdyb3VwOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRlOwp1c2UgS2VybmVsOjpTeXN0ZW06OlN0YXRzOwp1c2UgS2VybmVsOjpTeXN0ZW06OlR5cGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VXNlcjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYWxpZDsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xMCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKSVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkVuY29kZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwogICAgdXNlIHZhcjo6cGFja2FnZXNldHVwOjpJVFNNSW5jaWRlbnRQcm9ibGVtTWFuYWdlbWVudDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJEVuY29kZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6SVRTTUluY2lkZW50UHJvYmxlbU1hbmFnZW1lbnQtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBFbmNvZGVPYmplY3QgPT4gJEVuY29kZU9iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IFhNTE9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIHN5c2NvbmZpZyBvYmplY3QKICAgICRTZWxmLT57U3lzQ29uZmlnT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTeXNDb25maWctPm5ldyggJXskU2VsZn0gKTsKCiAgICAjIHJlYnVpbGQgWlpaKiBmaWxlcwogICAgJFNlbGYtPntTeXNDb25maWdPYmplY3R9LT5Xcml0ZURlZmF1bHQoKTsKCiAgICAjIGRlZmluZSB0aGUgWlpaIGZpbGVzCiAgICBteSBAWlpaRmlsZXMgPSAoCiAgICAgICAgJ1paWkFBdXRvLnBtJywKICAgICAgICAnWlpaQXV0by5wbScsCiAgICApOwoKICAgICMgcmVsb2FkIHRoZSBaWlogZmlsZXMgKG1vZF9wZXJsIHdvcmthcm91bmQpCiAgICBmb3IgbXkgJFpaWkZpbGUgKEBaWlpGaWxlcykgewoKICAgICAgICBQUkVGSVg6CiAgICAgICAgZm9yIG15ICRQcmVmaXggKEBJTkMpIHsKICAgICAgICAgICAgbXkgJEZpbGUgPSAkUHJlZml4IC4gJy9LZXJuZWwvQ29uZmlnL0ZpbGVzLycgLiAkWlpaRmlsZTsKICAgICAgICAgICAgbmV4dCBQUkVGSVggaWYgIS1mICRGaWxlOwogICAgICAgICAgICBkbyAkRmlsZTsKICAgICAgICAgICAgbGFzdCBQUkVGSVg7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0gPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICAkU2VsZi0+e0NTVk9iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6Q1NWLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e0dyb3VwT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6R3JvdXAtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VXNlck9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpVc2VyLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1N0YXRlT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6U3RhdGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57VHlwZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUeXBlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSAgPSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57U3RhdHNPYmplY3R9ICA9IEtlcm5lbDo6U3lzdGVtOjpTdGF0cy0+bmV3KAogICAgICAgICV7JFNlbGZ9LAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGRlZmluZSBmaWxlIHByZWZpeCBmb3Igc3RhdHMKICAgICRTZWxmLT57RmlsZVByZWZpeH0gPSAnSVRTTVN0YXRzJzsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBuZXcgdGlja2V0IHN0YXRlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgICAgICBTdGF0ZU5hbWVzID0+IFxAU3RhdGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZXQgbmV3IHRpY2tldCB0eXBlcyB0byB2YWxpZAogICAgewogICAgICAgIG15IEBUeXBlTmFtZXMgPSAoCiAgICAgICAgICAgICdJbmNpZGVudCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6U2VydmljZVJlcXVlc3QnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OkRpc2FzdGVyJywKICAgICAgICAgICAgJ1Byb2JsZW0nLAogICAgICAgICAgICAnUHJvYmxlbTo6S25vd25FcnJvcicsCiAgICAgICAgICAgICdQcm9ibGVtOjpQZW5kaW5nUmZDJywKICAgICAgICApOwoKICAgICAgICAjIHNldCB0eXBlcyB0byB2YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbnN0YWxsIHN0YXRzCiAgICAkU2VsZi0+e1N0YXRzT2JqZWN0fS0+U3RhdHNJbnN0YWxsKAogICAgICAgIEZpbGVQcmVmaXggPT4gJFNlbGYtPntGaWxlUHJlZml4fSwKICAgICk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgc2V0IG5ldyB0aWNrZXQgc3RhdGVzIHRvIHZhbGlkCiAgICB7CiAgICAgICAgbXkgQFN0YXRlTmFtZXMgPSAoCiAgICAgICAgICAgICdjbG9zZWQgd2l0aCB3b3JrYXJvdW5kJywKICAgICAgICApOwoKICAgICAgICAjIHNldCBzdGF0ZXMgdG8gdmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIHZhbGlkCiAgICB7CiAgICAgICAgbXkgQFR5cGVOYW1lcyA9ICgKICAgICAgICAgICAgJ0luY2lkZW50JywKICAgICAgICAgICAgJ0luY2lkZW50OjpTZXJ2aWNlUmVxdWVzdCcsCiAgICAgICAgICAgICdJbmNpZGVudDo6RGlzYXN0ZXInLAogICAgICAgICAgICAnUHJvYmxlbScsCiAgICAgICAgICAgICdQcm9ibGVtOjpLbm93bkVycm9yJywKICAgICAgICAgICAgJ1Byb2JsZW06OlBlbmRpbmdSZkMnLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGVzIHRvIHZhbGlkCiAgICAgICAgJFNlbGYtPl9TZXRUeXBlVmFsaWQoCiAgICAgICAgICAgIFR5cGVOYW1lcyA9PiBcQFR5cGVOYW1lcywKICAgICAgICAgICAgVmFsaWQgICAgID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluc3RhbGwgc3RhdHMKICAgICRTZWxmLT57U3RhdHNPYmplY3R9LT5TdGF0c0luc3RhbGwoCiAgICAgICAgRmlsZVByZWZpeCA9PiAkU2VsZi0+e0ZpbGVQcmVmaXh9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVuaW5zdGFsbCgpCgpydW4gdGhlIGNvZGUgdW5pbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVVbmluc3RhbGwoKTsKCj1jdXQKCnN1YiBDb2RlVW5pbnN0YWxsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBzZXQgbmV3IHRpY2tldCBzdGF0ZXMgdG8gaW52YWxpZAogICAgewogICAgICAgIG15IEBTdGF0ZU5hbWVzID0gKAogICAgICAgICAgICAnY2xvc2VkIHdpdGggd29ya2Fyb3VuZCcsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgc3RhdGVzIHRvIGludmFsaWQKICAgICAgICAkU2VsZi0+X1NldFN0YXRlVmFsaWQoCiAgICAgICAgICAgIFN0YXRlTmFtZXMgPT4gXEBTdGF0ZU5hbWVzLAogICAgICAgICAgICBWYWxpZCAgICAgID0+IDAsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHNldCBuZXcgdGlja2V0IHR5cGVzIHRvIGludmFsaWQKICAgIHsKICAgICAgICBteSBAVHlwZU5hbWVzID0gKAogICAgICAgICAgICAnSW5jaWRlbnQnLAogICAgICAgICAgICAnSW5jaWRlbnQ6OlNlcnZpY2VSZXF1ZXN0JywKICAgICAgICAgICAgJ0luY2lkZW50OjpEaXNhc3RlcicsCiAgICAgICAgICAgICdQcm9ibGVtJywKICAgICAgICAgICAgJ1Byb2JsZW06Oktub3duRXJyb3InLAogICAgICAgICAgICAnUHJvYmxlbTo6UGVuZGluZ1JmQycsCiAgICAgICAgKTsKCiAgICAgICAgIyBzZXQgdHlwZXMgdG8gaW52YWxpZAogICAgICAgICRTZWxmLT5fU2V0VHlwZVZhbGlkKAogICAgICAgICAgICBUeXBlTmFtZXMgPT4gXEBUeXBlTmFtZXMsCiAgICAgICAgICAgIFZhbGlkICAgICA9PiAwLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIF9TZXRTdGF0ZVZhbGlkKCkKCnNldHMgc3RhdGVzIHRvIHZhbGlkfGludmFsaWQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPl9TZXRTdGF0ZVZhbGlkKAogICAgICAgIFN0YXRlTmFtZXMgPT4gWyAnbmV3JywgJ29wZW4nIF0sCiAgICAgICAgVmFsaWQgICAgICA9PiAxLAogICAgKTsKCj1jdXQKCnN1YiBfU2V0U3RhdGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17U3RhdGVOYW1lc30gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gJ05lZWQgU3RhdGVOYW1lcyEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgbG9va3VwIHZhbGlkIGlkCiAgICBteSAlVmFsaWRMaXN0ID0gJFNlbGYtPntWYWxpZE9iamVjdH0tPlZhbGlkTGlzdCgpOwogICAgJVZhbGlkTGlzdCA9IHJldmVyc2UgJVZhbGlkTGlzdDsKICAgIG15ICRWYWxpZElEID0gJFBhcmFte1ZhbGlkfSA/ICRWYWxpZExpc3R7dmFsaWR9IDogJFZhbGlkTGlzdHtpbnZhbGlkfTsKCiAgICBTVEFURU5BTUU6CiAgICBmb3IgbXkgJFN0YXRlTmFtZSAoIEB7ICRQYXJhbXtTdGF0ZU5hbWVzfSB9ICkgewoKICAgICAgICAjIGdldCBzdGF0ZQogICAgICAgIG15ICVTdGF0ZSA9ICRTZWxmLT57U3RhdGVPYmplY3R9LT5TdGF0ZUdldCgKICAgICAgICAgICAgTmFtZSA9PiAkU3RhdGVOYW1lLAogICAgICAgICk7CgogICAgICAgIG5leHQgU1RBVEVOQU1FIGlmICElU3RhdGU7CgogICAgICAgICMgc2V0IHN0YXRlCiAgICAgICAgJFNlbGYtPntTdGF0ZU9iamVjdH0tPlN0YXRlVXBkYXRlKAogICAgICAgICAgICAlU3RhdGUsCiAgICAgICAgICAgIFZhbGlkSUQgPT4gJFZhbGlkSUQsCiAgICAgICAgICAgIFVzZXJJRCAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBfU2V0VHlwZVZhbGlkKCkKCnNldHMgdHlwZXMgdG8gdmFsaWR8aW52YWxpZAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+X1NldFR5cGVWYWxpZCgKICAgICAgICBUeXBlTmFtZXMgPT4gWyAnSW5jaWRlbnQnLCAnUHJvYmxlbScgXSwKICAgICAgICBWYWxpZCAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgX1NldFR5cGVWYWxpZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VHlwZU5hbWVzfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAnTmVlZCBUeXBlTmFtZXMhJyApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxvb2t1cCB2YWxpZCBpZAogICAgbXkgJVZhbGlkTGlzdCA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExpc3QoKTsKICAgICVWYWxpZExpc3QgPSByZXZlcnNlICVWYWxpZExpc3Q7CiAgICBteSAkVmFsaWRJRCA9ICRQYXJhbXtWYWxpZH0gPyAkVmFsaWRMaXN0e3ZhbGlkfSA6ICRWYWxpZExpc3R7aW52YWxpZH07CgogICAgVFlQRU5BTUU6CiAgICBmb3IgbXkgJFR5cGVOYW1lICggQHsgJFBhcmFte1R5cGVOYW1lc30gfSApIHsKCiAgICAgICAgIyBsb29rdXAgdHlwZSBpZAogICAgICAgIG15ICRUeXBlSUQgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlTG9va3VwKAogICAgICAgICAgICBUeXBlID0+ICRUeXBlTmFtZSwKICAgICAgICApOwoKICAgICAgICBuZXh0IFRZUEVOQU1FIGlmICEkVHlwZUlEOwoKICAgICAgICAjIGdldCB0eXBlCiAgICAgICAgbXkgJVR5cGUgPSAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlR2V0KAogICAgICAgICAgICBJRCA9PiAkVHlwZUlELAogICAgICAgICk7CgogICAgICAgICMgc2V0IHR5cGUKICAgICAgICAkU2VsZi0+e1R5cGVPYmplY3R9LT5UeXBlVXBkYXRlKAogICAgICAgICAgICAlVHlwZSwKICAgICAgICAgICAgVmFsaWRJRCA9PiAkVmFsaWRJRCwKICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoTDxodHRwOi8vb3Rycy5vcmcvPikuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTAgJCAkRGF0ZTogMjAxMC8wOC8wOSAwNjo1MzowNSAkCgo9Y3V0Cg==
closed with workaround
ticket is closed with workaround
3
1
current_timestamp
1
current_timestamp
1
Incident
1
current_timestamp
1
current_timestamp
1
Incident::ServiceRequest
1
current_timestamp
1
current_timestamp
1
Incident::Disaster
1
current_timestamp
1
current_timestamp
1
Problem
1
current_timestamp
1
current_timestamp
1
Problem::KnownError
1
current_timestamp
1
current_timestamp
1
Problem::PendingRfC
1
current_timestamp
1
current_timestamp
1